10 ';********** Superscript Assembler Quellcode 20 ' 30 'xbios equ #fc5a 40 ' 50 '; Uebernahme der Werte von Basic 60 'aufruf ld l,(hl); x-Position 70 'ld a,(de) 80 'ld h,a; y-Position 90 'dec l 100 'dec h 110 'ld (xypos),hl 120 'ld l,c 130 'ld h,b; Zeiger auf Stringdeskriptor 140 'ld a,(hl); Stringlaenge 150 'or a 160 'ret z; -> zurueck, falls Stringlaenge 0 170 'ld c,a 180 'ld b,0 190 'ld (strlen),a; Stringlaenge speichern 200 'inc hl 210 'ld a,(hl) 220 'inc hl 230 'ld h,(hl) 240 'ld l,a; hl = Stringadresse 250 'ld de,string 260 'ldir; String in Common-Bereich uebertragen 270 'ld bc,rout; Adresse der aufzurufenden Routine 280 'call xbios 290 'dw #00e9; Screen-Environment einschalten 300 'ret; zurueck zu Basic 310 ' 320 'rout ld a,(strlen); Stringlaenge 330 'ld b,a 340 'ld hl,string; Stringadresse 350 'mloop ld a,(hl); Zeichen aus String 360 'cp 27; ESC-Code? 370 'jr nz,getmat; -> nein 380 'inc hl 390 'dec b 400 'ret z; -> kein weiterer Code folgt 410 'ld a,(hl); Schriftstil holen 420 'ld (style),a; und merken 430 'inc hl 440 'dec b 450 'ret z; -> kein weiterer Code folgt 460 'ld a,(hl); naechstes Zeichen 470 'getmat push bc 480 'push hl 490 'ld l,a; Zeichen 500 'ld h,0 510 'add hl,hl; mal 8 520 'add hl,hl 530 'add hl,hl 540 'ld de,#b800; plus Startadresse Zeichen-RAM 550 'add hl,de; ergibt Matrixadresse 560 'ld de,matrix 570 'ld bc,8 580 'ldir; Matrix holen 590 'ld hl,#101; normale Breite/Hoehe 600 'ld (width),hl; als Vorgabe 610 'ld a,(style); Schrifttyp holen 620 'cp #FF 630 'jr z,acht; -> Grosschrift 8x8 640 'rra 650 'call c,light 660 'rra 670 'call c,fett 680 'rra 690 'call c,untstr 700 'rra 710 'call c,invers 720 'rra 730 'call c,breit 740 'rra 750 'call c,hoch 760 'rra 770 'call c,expo 780 'rra 790 'call c,index 800 'call ausg; manipuliertes Zeichen ausgeben 810 'nchar pop hl 820 'pop bc 830 'inc hl; Zeiger auf naechstes Zeichen 840 'djnz mloop 850 'ret 860 ' 870 'acht ld hl,matrix 880 'ld b,8 890 'ld de,(xypos) 900 'ld a,d 910 'sub b 920 'ld d,a; Textpos 8 Zeilen nach oben 930 'nreih8 inc d; naechste Reihe 940 'push bc 950 'push de 960 'push hl 970 'ld b,8 980 'ld c,(hl); Pixelreihe aus Matrix 990 'nspal8 rlc c; naechstes Pixel 1000 'ld hl,matrix 1010 'jr c,setch 1020 'ld hl,space 1030 'setch call chout; Zeichen ausgeben 1040 'inc e; naechste Spalte 1050 'ld a,e 1060 'djnz nspal8 1070 'pop hl 1080 'pop de 1090 'pop bc 1100 'inc hl; naechste Pixelreihe 1110 'djnz nreih8 1120 'ld (xypos),a 1130 'jr nchar; -> naechster Buchstabe 1140 ' 1150 'untstr ld hl,mat+7; in der 8. Pixelreihe 1160 'ld (hl),#ff; unterstreichen 1170 'ret 1180 ' 1190 'light push af; Duennschrift 1200 'ld hl,matrix; Matrix manipulieren 1210 'ld b,8 1220 'lloop ld a,(hl) 1230 'srl a 1240 'and (hl) 1250 'ld (hl),a 1260 'inc hl 1270 'djnz lloop 1280 'pop af 1290 'res 0,a; Fett sperren 1300 'ret 1310 ' 1320 'fett push af 1330 'ld hl,matrix; Matrix manipulieren 1340 'ld b,8; 8 Pixelreihen 1350 'floop ld a,(hl) 1360 'srl a 1370 'or (hl) 1380 'ld (hl),a 1390 'inc hl 1400 'djnz floop 1410 'pop af 1420 'ret 1430 ' 1440 'invers push af 1450 'ld hl,matrix 1460 'ld b,8 1470 'iloop ld a,(hl) 1480 'cpl; Pixelreihe invertieren 1490 'ld (hl),a 1500 'inc hl 1510 'djnz iloop 1520 'pop af 1530 'ret 1540 ' 1550 'breit push af 1560 'ld a,2 1570 'ld (width),a 1580 'ld ix,matrix 1590 'ld c,8; 8 Pixelreihen 1600 'nrow ld b,8; 8 Pixel verdoppeln 1610 'ld a,(ix); Pixelreihe 1620 'npix rra; Pixel ins Carry 1630 'rr (ix) 1640 'rr (ix+16) 1650 'sra (ix); Pixel verdoppeln 1660 'rr (ix+16) 1670 'djnz npix 1680 'inc ix; Zeiger auf naechste Pixelreihe 1690 'dec c 1700 'jr nz,nrow 1710 'pop af 1720 'ret 1730 ' 1740 'hoch ld a,2 1750 'ld (hight),a 1760 'ld de,mat+7 1770 'call expand; Pixelreihen verdoppeln 1780 'ld a,(width) 1790 'dec a; doppelte Breite? 1800 'ret z; -> nein 1810 'ld de,mat+23; Adresse der zweiten Haelfte 1820 'expand ld hl,8 1830 'add hl,de 1840 'ld b,8; 8 Pixelreihen 1850 'nhi ld a,(de); Pixelreihe 1860 'dec de 1870 'ld (hl),a; verdoppeln 1880 'dec hl 1890 'ld (hl),a 1900 'dec hl 1910 'djnz nhi 1920 'xor a; Exponent/Index sperren 1930 'ret 1940 ' 1950 'index xor a; Hoehe 0 fuer Index 1960 'jr indexp 1970 ' 1980 'expo ld a,2; Hoehe 2 fuer Exponent 1990 'indexp ld (hight),a; merken 2000 'ld de,mat+15 2010 'call trans; Matrix verschieben 2020 'ld a,(width) 2030 'dec a; doppelte Breite? 2040 'ret z; -> nein 2050 'ld de,mat+31; Adresse der rechten Haelfte 2060 'trans call clear; 4 Pixelreihen loeschen 2070 'ld hl,-4 2080 'add hl,de 2090 'ld bc,8 2100 'lddr; Matrix um 4 Pixelreihen verschieben 2110 'clear xor a 2120 'ld (de),a 2130 'dec de 2140 'ld (de),a 2150 'dec de 2160 'ld (de),a 2170 'dec de 2180 'ld (de),a 2190 'dec de 2200 'ret 2210 ' 2220 'ausg ld hl,matrix; manipulierte Matritzen ausgeben 2230 'ld bc,(width); b=Hoehe, c=Breite 2240 'ld de,(xypos); Textkoordinaten 2250 'nspalt push de 2260 'push hl 2270 'dec d 2280 'dec b 2290 'dec b 2300 'call z,chout; oben f. Exp./doppelte Hoehe 2310 'inc d 2320 'call chout; Mitte 2330 'inc d 2340 'inc b 2350 'inc b 2360 'call z,chout; unten fuer Index 2370 'pop hl 2380 'ld de,16; Adresse der rechten Haelfte 2390 'add hl,de; berechnen 2400 'pop de 2410 'inc e; naechste Textspalte 2420 'dec c 2430 'jr nz,nspalt; -> falls doppelte Breite 2440 'ld (xypos),de; neue Textkoordinaten merken 2450 'ret 2460 ' 2470 'chout ld a,e; Spalte 2480 'cp 90; groesser 89? 2490 'ret nc; -> ja 2500 'ld a,d; Reihe 2510 'cp 32; groesser 31? 2520 'ret nc; -> ja 2530 'push bc 2540 'push de 2550 'push hl 2560 'ld d,0 2570 'rlca; reihe * 16 2580 'rla 2590 'rla 2600 'rla 2610 'ld l,a 2620 'ld a,d 2630 'adc a,#b6 2640 'ld h,a; hl = b600+Reihe*16 2650 'ld a,(hl); Wert aus Roller-RAM 2660 'inc hl 2670 'ld h,(hl) 2680 'ld l,a 2690 'ex de,hl; nach de 2700 'add hl,hl; Spalte * 4 2710 'add hl,hl 2720 'add hl,de; + Wert aus Roller-RAM 2730 'add hl,hl; * 2 = Screenadresse 2740 'ex de,hl; nach de 2750 'pop hl; Matrixadresse 2760 'ld bc,8; 8 Pixelreihen 2770 'ldir; ins Video-RAM 2780 'pop de 2790 'pop bc 2800 'ret 2810 ' 2820 'style db 0 2830 'strlen db 0 2840 'xypos dw 0 2850 'width db 0 2860 'hight db 0 2870 'space db 0,0,0,0,0,0,0,0 2880 'matrix ds 7 2890 'mat+7 ds 8; Ende 1. Matrix 2900 'mat+15 ds 8; Ende 2. Matrix 2910 'mat+23 ds 8; Ende 3. Matrix 2920 'mat+31 ds 1; Ende 4. Matrix 2930 'string ds 1; Start Commonbereich f. String e der Werte von Basic 60 'aufruf ld l,(hl); x-Posi