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 ; |