100 ';***  ScreenScroll
110 ';***  CPC 464(plus)/664/6128(plus)
120 ';***  (c) 1992 Juergen Weiss
130 ';***         & CPC International
140 ';***  HSCROLL,Links,Rechts,Oben,Unten,Richtung,Anzahl
150 ';***  VSCROLL,Links,Rechts,Oben,Unten,Richtung,Anzahl
160 ';***  WRAPON
170 ';***  WRAPOFF
180 'org &a200           ;Start=&a200
190 'tiefe equ &a5ff     ;Speicher 'Tiefe'
200 'puffer equ &a360    ;Puffer 1
210 'logext equ &bcd1    ;Puffer 2 ist immer leer
220 'start ld bc,rsx     ;Zeiger auf Tabelle
230 'ld hl,kernel        ;Zeiger auf Leerbytes
240 'call logext         ;RSX eintragen
250 'ld a,&c9            ;gegen nochmaligen
260 'ld (start),a        ;Aufruf sichern
270 'ret                 ;und zur]ck
280 'rsx dw table        ;Sprungtabelle
290 'jp leri             ;HSCROLL
300 'jp vscrol           ;VSCROLL
310 'jp wron             ;WRAPON
320 'jp wroff            ;WRAPOFF
330 'table dmx "HSCROLL" ;Befehlstabelle
340 'dmx "VSCROLL"
350 'dmx "WRAPON"
360 'dmx "WRAPOFF"
370 'db 0               ;Tabelle ende
380 'kernel db 0,0,0,0  ;Frei f]r Kernel
390 'leri cp 6         ;6 Parameter ?
400 'ret nz            ;nein, also zur]ck
410 'ld b,(ix+0)       ;Anzahl der Durchg[nge
420 'ld a,(ix+8)       ;Rechte Begrenzung
430 'ld c,(ix+10)      ;Linke Begrenzung
440 'sub c             ;Rechts-Links
450 'ld (breite),a     ;=Breite
460 'ld a,(ix+6)       ;Obere Begrenzung
470 'ld c,(ix+4)       ;Untere Begrenzung
480 'sub c             ;Oben-Unten
490 'inc a             ;+1
500 'ld (tiefe),a      ;=Anzahl der Zeilen
510 'ld a,(ix+2)       ;Richtung
520 'or a              ;=0 ?
530 'jr nz,rechts      ;nein, also Rechts scrollen
540 'ld a,(ix+10)      ;linke Begrenzung
550 'ld (plus),a       ;in GETADR eintragen
560 'ld a,&23          ;&23 = INC HL
570 'ld (lire?),a      ;eintragen
580 'ld a,&b0          ;EDB0 = LDIR
590 'ld (lire1?),a     ;eintragen (ED schon vorhanden)
600 'jr hscrol         ;und SCROLLEN
610 'rechts            ;Werte f]r rechts
620 'ld a,&2b          ;&2b = DEC HL
630 'ld (lire?),a      ;eintragen
640 'ld a,&b8          ;EDB8 = LDDR
650 'ld (lire1?),a     ;eintragen (ED schon vorhanden)
660 'ld a,(ix+8)       ;Rechte Begrenzung
670 'ld (plus),a       ;in GETADR eintragen
680 'hscrol call &bd19 ;FRAME
690 'di                ;Interrupt sperren
700 'loop push bc      ;Durchg[nge sichern
710 'ld a,(tiefe)      ;Anzahl der Zeilen holen
720 'ld b,a            ;und nach B
730 'ld a,(ix+6)       ;Obere Begrenzung
740 'loop1 push bc     ;Zeilenanzahl sichern
750 'push af           ;Aktuelle Zeile sichern
760 'call getadr       ;deren Adresse holen
770 'push hl           ;und nach
780 'pop de            ;de bringen
790 'lire? db 00       ;links o. Rechts ?
800 'ld a,(de)         ;Bildschirmbyte retten
810 'db 01             ;Frei fuer
820 'breite db 00      ;eintrag der
830 'db 00             ;Breite
840 'db &ed            ;LDIR
850 'lire1? db &00     ;oder LDDR
860 'wr db 0           ;NOP o. XOR A (f]r WRAP)
870 'ld (de),a         ;Byte zur]ckschreiben
880 'pop af            ;aktuelle Zeile holen
890 'pop bc            ;Zeilenzahl holen
900 'dec a             ;Akt. Zeile=Zeile-1
910 'djnz loop1        ;1 Durchgang beendet ?
920 'pop bc            ;ja, Durchg[ngen
930 'djnz loop         ;decrementieren
940 'ei                ;fertig, Interrupt erlauben
950 'ret               ;und zurueck zu BASIC
960 'vscrol cp 6       ;6 Parameter ?
970 'ret nz            ;nein, also zur]ck
980 'ld b,(ix+0)       ;Anzahl der Durchg[nge
990 'ld a,(ix+10)      ;Linke Begrenzung
1000 'ld (plus),a       ;in GETADR eintragen
1010 'ld a,(ix+8)       ;Rechte Begrenzung
1020 'ld c,(ix+10)      ;Linke Begrenzung
1030 'sub c             ;Rechts-Links
1040 'inc a             ;=breite
1050 'ld (breit2),a     ;eintragen
1060 'ld (breit3),a     ;
1070 'ld (breit4),a     ;
1080 'ld a,(ix+6)       ;Oben
1090 'ld c,(ix+4)       ;Unten
1100 'sub c             ;OBEN-UNTEN
1110 'ld (tiefe),a      ;=Zeilenanzahl
1120 'ld a,(ix+2)       ;Flag
1130 'or a              ;=0 ?
1140 'jr nz,unten       ;nein,also nach unten
1150 'ld a,6            ;Obere Begrenzung in Vscroll
1160 'ld (ri),a         ;eintragen
1170 'ld (ri1),a        ;nochmal
1180 'ld a,&3d          ;&3D = DEC A
1190 'ld (ri2),a        ;eintragen
1200 'jr vert           ;und scrollen
1210 'unten ld a,4      ;unten eintragen
1220 'ld (ri),a         ;untere Begrenzung in
1230 'ld (ri1),a        ;Vscroll eintragen
1240 'ld a,&3c          ;&3C = INC A
1250 'ld (ri2),a        ;eintragen
1260 'vert call &bd19   ;FRAME
1270 'di                ;Interrupt sperren
1280 'loop4 push bc     ;anzahl der Durchg[nge sichern
1290 'db &dd,&7e        ;ld a,(ix+X) (4,6)
1300 'ri db 00          ;4=unten, 6=oben = Akt. Zeile
1310 'call getadr       ;deren Adresse holen
1320 'ld de,puffer      ;de=puffer
1330 'db 01             ;Platz fuer
1340 'breit2 db 00      ;den Breiten
1350 'db 00             ;eintrag (ld bc,00xx)
1360 'ldir              ;zeile in den Puffer kopieren
1370 'ld a,(tiefe)      ;anzahl der Zeilen
1380 'ld b,a            ;nach b
1390 'db &dd,&7e        ;ld a,(ix+x), (x=4;6)
1400 'ri1 db 00         ;
1410 'loop5 push bc     ;anzahl sichern
1420 'push af           ;akt. zeile sichern
1430 'call getadr       ;deren adresse holen
1440 'pop af            ;akt. zeile holen
1450 'push hl           ;akt. adresse sichern
1460 'ri2 db 00         ;zeile [ndern (+1;-1)
1470 'push af           ;und sichern
1480 'call getadr       ;deren adresse holen
1490 'pop af            ;zeile holen
1500 'pop de            ;alte adresse in de
1510 'db &01            ;Platzhalter
1520 'breit3 db 00      ;f]r
1530 'db 00             ;ld BC,00xx
1540 'ldir              ;akt. zeile nach alte zeile
1550 'pop bc            ;zeilenanzahl holen
1560 'djnz loop5        ;weiter wenn nicht 0
1570 'call getadr       ;letzte Zeile
1580 'ex de,hl          ;aktualisieren
1590 'ld hl,puffer      ;hl=puffer de=zeile
1600 'db &2e            ;h=&a3, l=&60 oder &b0
1610 'wr1 db &60        ;f]r WRAP      
1620 'db &01            ;Platzhalter
1630 'breit4 db 00      ;f]r
1640 'db 00             ;breite
1650 'ldir              ;und kopieren
1660 'pop bc            ;durchg[nge holen
1670 'djnz loop4        ;weiter wenn nicht 0
1680 'ei                ;Interrupt zulassen
1690 'ret               ;zurueck zu BASIC
1700 'wron xor a        ;WRAPON a=0
1710 'ld (wr),a         ;nop eintragen
1720 'ld a,&60          ;Puffer = &a660
1730 'ld (wr1),a        ;eintragen
1740 'ret               ;fertig
1750 'wroff ld a,&af    ;WRAPOFF &AF= XOR A
1760 'ld (wr),a         ;Loescht gespeichertes BYTE
1770 'ld a,&b0          ;Puffer =&a3b0
1780 'ld (wr1),a        ;eintragen
1790 'ret               ;fertig
1800 'getadr ld (off1),a ;Adressen abh[ngig
1810 'ld (off2),a       ;von a (=zeile) aus
1820 'db &2a            ;der Y-Tabelle aus-
1830 'off1 db 00        ;lesen
1840 'db &a5            ;
1850 'db &3a            ;ROUTINE s. DATA BECKER
1860 'off2 db 00        ;'Das gro~e Grafikbuch   
1870 'db &a4            ; zum CPC'
1880 'ld h,a            ;
1890 'db &1e            ;Platzhalter fuer
1900 'plus db 00        ;LD E,xx
1910 'ld d,0            ;Noetig f]r
1920 'add hl,de         ;Addieren der Begrenzungen
1930 'ret               ;