100 ';********************************
110 ';Sprungtabelle fuer die 120 ';Window-Routinen 130 ' 140 'ORG &A000 150 ' 160 'JP INVERS 170 ' 180 ' 1000 ';******************************** 1010 ';Bildschirmausschnitt invertieren 1020 ';Aufruf: 1030 ';CALL adr,links,rechts,oben,unten 1040 ' 1050 'INVERS CALL WINPAR ;Basic-Params 1060 'CALL WINADR ;-> Screenadr. 1070 'ILOOP1 PUSH BC ;Breite/Hoehe 1080 'PUSH HL ;Screenadresse 1090 ' 1100 'ILOOP2 LD A,(HL) ;Screenbyte 1110 'CPL ;invertieren 1120 'LD (HL),A ;und zurueck 1130 'INC HL ;naechste Adr. 1140 'DJNZ ILOOP2 1150 ' 1160 'POP HL ;Screenadresse 1170 'CALL LDOWN ;naechste Zeile 1180 'POP BC ;Breite/Hoehe 1190 'DEC C ;Hoehe-1 1200 'JR NZ,ILOOP1 ;-> noch nicht 0 1210 'RET ;-> Basic 1220 ' 1230 ' 5000 ';******************************** 5010 ';SUB Window-Grenzen von Basic 5020 ';uebernehmen 5030 ';OUT: H=Textspalte links 5040 '; L=Textzeile oben 5050 '; D=Textspalte rechts 5060 '; E=Textzeile unten 5070 ' 5080 'WINPAR LD E,(IX+0) 5090 'LD L,(IX+2) 5100 'LD D,(IX+4) 5110 'LD H,(IX+6) 5120 'RET 5130 ' 5140 ';******************************** 5150 ';SUB Window-Adresse berechnen 5160 ';IN: H=Textspalte links 5170 '; L=Textzeile oben 5180 '; D=Textspalte rechts 5190 '; E=Textzeile unten 5200 ';OUT: B=Breite in Bytes 5210 '; C=Hoehe in Rasterzeilen 5220 '; HL=Screenadresse oben links 5230 ' 5240 'GETMOD EQU &BC11 ;SCR GET MODE 5250 ' 5260 'WINADR DEC H ;links-1 5270 'DEC L ;oben-1 5280 'LD A,D 5290 'SUB H ;rechts-(links-1) 5300 'LD B,A ;=Breite in Textsp. 5310 'LD A,E 5320 'SUB L ;unten-(oben-1) 5330 'LD C,A ;=Hoehe in Textz. 5340 ' 5350 'CALL GETMOD ;akt. MODE testen 5360 'JR C,MODE0 5370 'JR Z,MODE1 5380 'JR MODE2 5390 ' 5400 'MODE0 SLA H ;fuer MODE 0: 5410 'SLA B ;horiz. Werte * 4 5420 'MODE1 SLA H ;fuer MODE 1: 5430 'SLA B ;horiz. Werte * 2 5440 'MODE2 SLA C ;fuer alle MODEs: 5450 'SLA C ;Rasterzeilen = 5460 'SLA C ;Textzeilen * 8 5470 ' 5480 'LD A,H ;A = (links-1)*mf 5490 'LD H,0 ;H=0, L=oben-1 5500 'LD D,H ;nach DE kopieren 5510 'LD E,L 5520 'ADD HL,HL ;* 2 5530 'ADD HL,HL ;* 4 5540 'ADD HL,DE ;* 5 5550 'ADD HL,HL ;* 10 5560 'ADD HL,HL ;* 20 5570 'ADD HL,HL ;* 40 5580 'ADD HL,HL ;* 80 5590 'LD E,A 5600 'ADD HL,DE ;+ (links-1)*mf 5610 'LD DE,&C000 5620 'ADD HL,DE ;+Screenstart 5630 'RET 5640 ' 5650 ';******************************** 5660 ';SUB Bildschirmadr. eine Raster- 5670 ';zeile nach unten weiterrechnen 5680 ';IN: HL = alte Adresse 5690 ';OUT: HL = neue Adresse 5700 ' 5710 'LDOWN LD A,H ;HL=HL+&800, d.h. 5720 'ADD A,8 ;8 zum HiByte dazu- 5730 'LD H,A ;addieren 5740 'RET NC ;-> kein Overflow 5750 'SUB &40 ;sonst HL=HL-&4000 5760 'LD H,A ;(8*&800=&4000) 5770 'LD A,L 5780 'ADD A,&50 ;und HL=HL+&50 5790 'LD L,A 5800 'RET NC ;-> kein Uebertrag 5810 'INC H ;sonst HiByte+1 5820 'RET 5830 ' |