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 '