mysport .equ 8Ch ; Použití této I/O adresy ; zabrání kolizi s adresací ; interních periferií PMD-85. ; ************************* ; ovladač Myš602 pro PMD-85 ; release date: 30. 6. 2018 ; vstupní port: 8Ch ; formát bitů: PL--XXYY ; ************************* ; ************************************************** ; 29. 6. 2018 - vypuštění oficiální verze ; 30. 6. 2018 - 5% zrychlení L+P pohyb (nyní bez SP) ; ************************************************** ; ********************************************* ; Rutina pro rozpoznání pohybu myši typu 602. ; Na základě starého a nového stavu clonek volá ; obslužnou rutinu směru pohybu myši. ; Možno volat CALL 0038h nebo RST 7 (rychlejší) ; ********************************************* .org 38h ; RST 7 mysrun: in mysport ; načíst signály myši ani 0fh ; ponechat jen clonky oldmys: adi 0 ; plus starý stav clonek mov l,a ; index v tabulce přechodů add a ; starý stav se vysune z ACC add a ; a nový stav clonek se add a ; uloží do vyšší poloviny bajtu add a ; a následně do paměti jako sta oldmys+1 ; starý stav clonek mvi h,tabmys/256 ; začátek tabulky přechodů mov l,m ; načíst LO-adr ovladače směru dcr h ; k němu HI-adr ovladače směru ; ve stránce 00xxh pchl ; a skok na tento ovladač ; ************************************************ ; obslužné vektory pro směry pohybu myši ; musí ležet ve 256 bajtové stránce před ; tabulkou přechodových stavů clonek myši "tabmys" ; tabulka "tabmys" obsahuje jen LO-adr vektorů!!! ; po návratu z RST7 obsahují příznaky CY a S stavy ; tlačítek myši: ; S = 1 při stisku levého tlačítka ; CY = 1 při stisku pravého tlačítka ; ************************************************ m60200: in mysport ; test tlačítek myši add a ; (bez pohybu myši) ret m602sv: call mysym ; Y-- m602_v: call mysxp ; X++ jmp shwmys ; případný posun m602jz: call mysyp ; Y++ m602_z: call mysxm ; X-- jmp shwmys ; případný posun m602sz: call mysxm ; X-- m602_s: call mysym ; Y-- jmp shwmys ; případný posun m602jv: call mysxp ; X++ m602_j: call mysyp ; Y++ jmp shwmys ; případný posun ; ********************************************** ; tabulka nižších bajtů adres obslužných vektorů ; (vyšší bajt adresy obslužného vektoru je vždy! ; o jedničku menší než vyšší bajt bázové adresy ; tabulky "tabmys"). ; Tyto equations nepřesouvat před rutiny!!! ; ********************************************** m60 .equ m60200%256 ; nulová funkce m61 .equ m602_s%256 ; sever m62 .equ m602sv%256 ; severovýchod m63 .equ m602_v%256 ; východ m64 .equ m602jv%256 ; jihovýchod m65 .equ m602_j%256 ; jih m66 .equ m602jz%256 ; jihozápad m67 .equ m602_z%256 ; západ m68 .equ m602sz%256 ; severozápad ; ******************************************* ; Deaktivace myši ; Obnoví pozadí pod kurzorem myši z buferu. ; Bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* mysdea: lxi b,-(7*64)-1 ; BC = řádkovač lxi d,mysbuf ; DE = bufer pozadí lhld mysadr ; HL = adresa kurzoru myši refmyl: ldax d ; 0 mov m,a inr l inr e ldax d mov m,a inr h inr e ldax d ; 4R mov m,a dcr l inr e ldax d mov m,a stax d inr h inr e ldax d ; 8 mov m,a inr l inr e ldax d mov m,a dad b inr e jnz refmyl ; konec buferu? ret ; ********************************* ; v ACC vrátí souřadnici Y (0..255) ; v HL vrátí souřadnici X (0..287) ; ********************************* myscor: lhld mysadr ; C = souřadnice Y dad h dad h mov c,h lda mysadr ; HL = souřadnice X ani 3fh mov b,a add a add b mov l,a mvi h,0 mov d,h dad h ; HL = 6x horizontal adr lda mysbit mov e,a dad d ; HL = 6x adr + pixel (0..5) inx h ; korekce záměrného bodu crsr+1 mov a,c ; ACC = souřadnice Y inr a ; korekce záměrného bodu crsr+1 ret ; ******** ; proměnné ; ******** mysadr: .dw 0 ; adresa vram kurzoru myši mysbit: .dw 0200h ; bitový ofset kurzoru myši ; obsahuje i HI adr tabulky ; s animačními fázemi kurzoru .org 100h-24 ; konec buferu generuje E=0 mysbuf: .fill 24,0 ; bufer pozadí kurzoru myši .org 100h ; tabulka pro detekci pohybu myši ; *********************************************** ; Tabulka přechodových stavů clonek myši 602. ; Obsahuje LO-adr obslužných vektorů detekovaných ; směrů. Tabulka musí začínat na adrese xx00h! ; *********************************************** ; vyšší nibble adresy je nový stav clonek ; nižší nibble adresy je starý stav clonek ; 01/02 v rámci nibble je svislý směr ; 04/08 v rámci nibble je vodorovný směr tabmys: .db m60,m65,m61,m60,m63,m64,m62,m63,m67,m66,m68,m67,m60,m65,m61,m60 ; 00 .db m61,m60,m60,m65,m62,m63,m63,m64,m68,m67,m67,m66,m61,m60,m60,m65 ; 10 .db m65,m60,m60,m61,m64,m63,m63,m62,m66,m67,m67,m68,m65,m60,m60,m61 ; 20 .db m60,m61,m65,m60,m63,m62,m64,m63,m67,m68,m66,m67,m60,m61,m65,m60 ; 30 .db m67,m66,m68,m67,m60,m65,m61,m60,m60,m65,m61,m60,m63,m64,m62,m63 ; 40 .db m68,m67,m67,m66,m61,m60,m60,m65,m61,m60,m60,m65,m62,m63,m63,m64 ; 50 .db m66,m67,m67,m68,m65,m60,m60,m61,m65,m60,m60,m61,m64,m63,m63,m62 ; 60 .db m67,m68,m66,m67,m60,m61,m65,m60,m60,m61,m65,m60,m63,m62,m64,m63 ; 70 .db m63,m64,m62,m63,m60,m65,m61,m60,m60,m65,m61,m60,m67,m66,m68,m67 ; 80 .db m62,m63,m63,m64,m61,m60,m60,m65,m61,m60,m60,m65,m68,m67,m67,m66 ; 90 .db m64,m63,m63,m62,m65,m60,m60,m61,m65,m60,m60,m61,m66,m67,m67,m68 ; A0 .db m63,m62,m64,m63,m60,m61,m65,m60,m60,m61,m65,m60,m67,m68,m66,m67 ; B0 .db m60,m65,m61,m60,m67,m66,m68,m67,m63,m64,m62,m63,m60,m65,m61,m60 ; C0 .db m61,m60,m60,m65,m68,m67,m67,m66,m62,m63,m63,m64,m61,m60,m60,m65 ; D0 .db m65,m60,m60,m61,m66,m67,m67,m68,m64,m63,m63,m62,m65,m60,m60,m61 ; E0 .db m60,m61,m65,m60,m67,m68,m66,m67,m63,m62,m64,m63,m60,m61,m65,m60 ; F0 ; *************************************** ; 6 animačních fází myšího kurzoru ; Tabulka ofsetů až po návěští myscr5 ; musí ležet v jedné 256-bajtové stránce! ; Nyní je to 200h. ; *************************************** myscrv: .db myscr0%256 ; ofset fáze 0 .db myscr1%256 ; ofset fáze 1 .db myscr2%256 ; ofset fáze 2 .db myscr3%256 ; ofset fáze 3 .db myscr4%256 ; ofset fáze 4 .db myscr5%256 ; ofset fáze 5 myscr0: .dw 0f800h,0ff00h ; 0 - fáze 0 .dw 0fe00h,0c01eh ; 4R .dw 0c010h,0fe00h ; 8 .dw 0f002h,0ff00h ; 1 .dw 0fe00h,0c03eh ; 5R .dw 0c720h,0fe00h ; 9 .dw 0e006h,0ff00h ; 2 .dw 0fe00h,0c00eh ; 6R .dw 0cf20h,0fe00h ; 10 .dw 0c00eh,0ff00h ; 3 .dw 0ff00h,0c012h ; 7R .dw 0cf00h,0fe00h ; 11 myscr1: .dw 0f100h,0ff00h ; 0 - fáze 1 .dw 0fc00h,0c13ch ; 4R .dw 0c120h,0fc00h ; 8 .dw 0e104h,0ff00h ; 1 .dw 0fc01h,0c13ch ; 5R .dw 0cf00h,0fc01h ; 9 .dw 0c10ch,0ff00h ; 2 .dw 0fc00h,0c11ch ; 6R .dw 0df00h,0fc01h ; 10 .dw 0c11ch,0fe00h ; 3 .dw 0fe00h,0c124h ; 7R .dw 0df00h,0fc00h ; 11 myscr2: .dw 0e300h,0ff00h ; 0 - fáze 2 .dw 0f801h,0c338h ; 4R .dw 0c300h,0f801h ; 8 .dw 0c308h,0ff00h ; 1 .dw 0f803h,0c338h ; 5R .dw 0df00h,0f802h ; 9 .dw 0c318h,0fe00h ; 2 .dw 0f800h,0c338h ; 6R .dw 0ff00h,0f802h ; 10 .dw 0c338h,0fc00h ; 3 .dw 0fc01h,0c308h ; 7R .dw 0ff00h,0f800h ; 11 myscr3: .dw 0c700h,0ff00h ; 0 - fáze 3 .dw 0f003h,0c730h ; 4R .dw 0c700h,0f002h ; 8 .dw 0c710h,0fe00h ; 1 .dw 0f007h,0c730h ; 5R .dw 0ff00h,0f004h ; 9 .dw 0c730h,0fc00h ; 2 .dw 0f001h,0c730h ; 6R .dw 0ff00h,0f104h ; 10 .dw 0c730h,0f801h ; 3 .dw 0f802h,0c710h ; 7R .dw 0ff00h,0f100h ; 11 myscr4: .dw 0cf00h,0fe00h ; 0 - fáze 4 .dw 0e007h,0cf20h ; 4R .dw 0cf00h,0e004h ; 8 .dw 0cf20h,0fc00h ; 1 .dw 0e00fh,0cf20h ; 5R .dw 0ff00h,0e108h ; 9 .dw 0cf20h,0f801h ; 2 .dw 0e003h,0cf20h ; 6R .dw 0ff00h,0e308h ; 10 .dw 0cf20h,0f003h ; 3 .dw 0f004h,0cf20h ; 7R .dw 0ff00h,0e300h ; 11 myscr5: .dw 0df00h,0fc00h ; 0 - fáze 5 .dw 0c00fh,0df00h ; 4R .dw 0df00h,0c008h ; 8 .dw 0df00h,0f801h ; 1 .dw 0c01fh,0df00h ; 5R .dw 0ff00h,0c310h ; 9 .dw 0df00h,0f003h ; 2 .dw 0c007h,0df00h ; 6R .dw 0ff00h,0c710h ; 10 .dw 0df00h,0e007h ; 3 .dw 0e009h,0df00h ; 7R .dw 0ff00h,0c700h ; 11 ; ********************************************** ; test souřadnice X a posun myšího kurzoru vlevo ; ********************************************** mysxm: lda mysbit ; bitová pozice dcr a ; o 1 pixel doleva jp mysxme ; zůstávám v aktuálním bajtu? lhld mysadr ; NE => test na horizontální mov a,l ; adresový bajt kurzoru ani 3fh rz ; levý doraz obrazovky dcx h ; provést přesun doleva shld mysadr ; uložit adresu kurzoru myši ; ******************************************* ; posun buferu vpravo a doplnění zleva z vram ; bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* mysbur: lxi b,-(7*64)-1 ; BC = řádkovač lxi d,mysbuf ; DE = bufer pozadí ; HL = adresa kurzoru myši mysbrl: ; mikrořádek 0 ldax d ; levý bufer mov b,a ; do reg. B mov a,m ; pozadí nalevo od kurzoru stax d ; do levého buferu inr e ldax d ; pravý bufer inr l inr l mov m,a ; uložit do pozadí mov a,b ; levý bufer stax d ; do pravého buferu inr h inr e ; mikrořádek 4R ldax d ; pravý bufer mov m,a ; obnovím pozadí inr e ldax d ; posunu bufer vlevo dcr e stax d inr e ; z vram uložím pozadí dcr l dcr l mov a,m stax d inr h inr e ; mikrořádek 8 ldax d ; levý bufer mov b,a ; do reg. B mov a,m ; pozadí nalevo od kurzoru stax d ; do levého buferu inr e ldax d ; pravý bufer inr l inr l mov m,a ; uložit do pozadí mov a,b ; levý bufer stax d ; do pravého buferu mvi b,0FEh ; HI(-(7*64)-1) dad b ; řádkovač dcr l inr e jnz mysbrl ; poslední bajt v buferu? mvi a,5 ; nová bitová pozice mysxme: sta mysbit ; kurzoru myši ret ; *********************************************** ; test souřadnice X a posun myšího kurzoru vpravo ; *********************************************** mysxp: lda mysbit ; bitová pozice inr a ; o 1 pixel doprava cpi 6 ; zůstávám v aktuálním bajtu? jc mysxpe ; ANO => jen deklarace posunu lhld mysadr ; NE => test na horizontální mov a,l ; adresový bajt kurzoru ani 3fh cpi 2eh rnc ; pravý doraz obrazovky inx h ; provést přesun doprava shld mysadr ; uložit adresu kurzoru myši ; ******************************************* ; posun buferu vlevo a doplnění zprava z vram ; bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* mysbul: lxi b,-(7*64)-1 ; BC = řádkovač lxi d,mysbuf ; DE = bufer pozadí ; HL = adresa kurzoru myši mysbll: ; mikrořádek 0 dcr l ; nalevo od kurzoru ldax d mov m,a ; obnovím pozadí inr e ldax d ; posunu bufer vlevo dcr e stax d inr e ; z vram uložím pozadí inr l inr l mov a,m stax d inr h inr e ; mikrořádek 4R ldax d ; pravý bajt buferu mov b,a ; do reg. B mov a,m ; a nové pozadí stax d ; do pravého bajtu buferu inr e ldax d ; levý bajt buferu dcr l dcr l mov m,a ; do vram obnovím pozadí mov a,b ; pravý bajt buferu stax d ; do levého bajtu buferu inr h inr e ; mikrořádek 8 ldax d mov m,a ; obnovím pozadí inr e ldax d ; posunu bufer vlevo dcr e stax d inr e ; z vram uložím pozadí inr l inr l mov a,m stax d mvi b,0FEh ; HI(-(7*64)-1) dad b ; řádkovač inr e jnz mysbll ; konec buferu pozadí? xra a ; nová bitová pozice mysxpe: sta mysbit ; kurzoru myši ret ; *********************************************** ; test souřadnice Y a posun myšího kurzoru nahoru ; pozor! zajíždí 64 bajtů adresně "pod" videoram! ; *********************************************** mysym: lhld mysadr ; adresu kurzoru myši mvi a,0BFh ; otestovat na opuštění vram cmp h rnc ; horní doraz obrazovky lxi d,-64 ; posun adresy kurzoru dad d ; myši nahoru shld mysadr ; adresu uložit mov e,m ; DE = nové pozadí pro bufer inr l mov d,m ; ******************************************* ; posun buferu dolů a doplnění shora z vram ; bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* mysbud: lxi h,0 ; uschovat hodnotu SP dad sp shld mysbdq+1 xchg ; HL = nové pozadí lxi sp,mysbuf+0 ; 00-01 xthl lxi sp,mysbuf+6 ; 02-03 xthl lxi sp,mysbuf+12 ; 04-05 xthl lxi sp,mysbuf+18 ; 06-07 xthl mov a,h ; přechod z "normálního" mov h,l ; řádku 3 na reverzní 4 mov l,a lxi sp,mysbuf+2 ; 08-09 xthl lxi sp,mysbuf+8 ; 10-11 xthl lxi sp,mysbuf+14 ; 12-13 xthl lxi sp,mysbuf+20 ; 14-15 xthl mov a,h ; přechod z reverzního mov h,l ; řádku 7 na "normální" 8 mov l,a lxi sp,mysbuf+4 ; 16-17 xthl lxi sp,mysbuf+10 ; 18-19 xthl lxi sp,mysbuf+16 ; 20-21 xthl lxi sp,mysbuf+22 ; 22-23 xthl xchg ; poslední řádek buferu do DE lhld mysadr ; a na spodní straně myšího kurzoru lxi sp,12*64+2 dad sp sphl push d ; obnovit pozadí mysbdq: lxi sp,0 ; obnova hodnoty reg. SP ret ; ********************************************* ; test souřadnice Y a posun myšího kurzoru dolů ; ********************************************* mysyp: lhld mysadr ; adresu kurzoru myši mvi a,0FCh cmp h ; otestovat na spodní rc ; doraz obrazovky inr h ; posun dolů pod kurzor inr h inr h mov e,m ; DE = nové pozadí inr l mov d,m ; ******************************************* ; posun buferu nahoru a doplnění zdola z vram ; bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* mysbuu: lxi h,0 ; uschovat hodnotu SP dad sp shld mysbuq+1 xchg ; HL = nové pozadí pro bufer lxi sp,mysbuf+22 ; 22-23 xthl lxi sp,mysbuf+16 ; 20-21 xthl lxi sp,mysbuf+10 ; 18-19 xthl lxi sp,mysbuf+4 ; 16-17 xthl mov a,h ; přechod z "normálního" mov h,l ; řádku 8 na reverzní 7 mov l,a lxi sp,mysbuf+20 ; 14-15 xthl lxi sp,mysbuf+14 ; 12-13 xthl lxi sp,mysbuf+8 ; 10-11 xthl lxi sp,mysbuf+2 ; 08-09 xthl mov a,h ; přechod z reverzního mov h,l ; řádku 4 na "normální" 3 mov l,a lxi sp,mysbuf+18 ; 06-07 xthl lxi sp,mysbuf+12 ; 04-05 xthl lxi sp,mysbuf+6 ; 02-03 xthl lxi sp,mysbuf+0 ; 00-01 xthl xchg ; poslední řádek buferu do DE lhld mysadr ; a na spodní straně myšího kurzoru sphl inx sp inx sp push d ; obnovit pozadí lxi d,64 ; faktický posun kurzoru dad d shld mysadr mysbuq: lxi sp,0 ; obnova hodnoty reg. SP ret ; ********************* ; aktivace myši ; - test validní adresy ; - uschování pozadí ; - vykreslení kurzoru ; ********************* mysact: lda mysbit ; test validní pozice cpi 6 jnc mysini lhld mysadr ; test validní adresy mov a,l ani 3fh cpi 2fh jnc mysini ; sloupec > 46 mvi a,0bfh ; test >= C000h cmp h jc savmys ; adr je ve videoram mysini: lxi h,0E017h ; inicializace pozice shld mysadr ; kurzoru myši xra a sta mysbit ; ******************************************* ; uschová pozadí pod kurzorem myši do buferu ; bufer sám je adresován lineárně, ovšem ; obsah je zpřeházen pro adresaci vram 0-4R-8 ; ******************************************* savmys: lxi b,-(7*64)-1 ; BC = řádkovač lxi d,mysbuf ; DE = bufer pozadí lhld mysadr ; HL = adresa kurzoru myši savmyl: mov a,m ; 0 stax d inr l inr e mov a,m stax d inr h inr e mov a,m ; 4R stax d dcr l inr e mov a,m stax d inr h inr e mov a,m ; 8 stax d inr l inr e mov a,m stax d dad b inr e jnz savmyl ; konec buferu? ; ****************************** ; nakreslí kurzor myši na pozadí ; ****************************** shwmys: lxi h,0 ; uschovat hodnotu SP dad sp shld shwmyq+1 lhld mysbit ; H:L = 02:uu, kde uu je bitová ; pozice kurzoru myši 0..5 mov l,m ; H:L = 02:vv, což je úplná adresa ; s animační fází kurzoru myši sphl ; SP = předloha kurzoru myši podle ; horizontální pozice v bajtu lhld mysadr ; HL = adresa kurzoru lxi d,mysbuf ; DE = bufer pozadí kurzoru pop b ; 0 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 4R ldax d inx d ana b ora c mov m,a dcr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 8 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a lxi b,-(7*64)-1 ; řádkovač dad b pop b ; 1 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 5R ldax d inx d ana b ora c mov m,a dcr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 9 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a lxi b,-(7*64)-1 ; řádkovač dad b pop b ; 2 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 6R ldax d inx d ana b ora c mov m,a dcr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 10 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a lxi b,-(7*64)-1 ; řádkovač dad b pop b ; 3 ldax d inx d ana b ora c mov m,a inr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 7R ldax d inx d ana b ora c mov m,a dcr l pop b ldax d inx d ana b ora c mov m,a inr h pop b ; 11 ldax d inx d ana b ora c mov m,a inr l pop b ldax d ana b ora c mov m,a shwmyq: lxi sp,0 ; obnova hodnoty reg. SP in mysport ; test tlačítek myši add a ; společný pro pohyby ret