;********** Superscript Assembler Quellcode fuer TURBO PASCAL xbios equ 0fc5ah ROLLER equ 0b600h CHRMTX equ 0b800h .phase 0f000h ; Uebernahme der Werte von TURBO PASCAL ; procedure script(x,y:byte;var text:string); aufruf: pop iy pop de ; Zeiger auf String pop bc ; y-Position pop hl ; x-Position ld h,c push iy dec l dec h ld (xypos),hl ex de,hl ; Zeiger auf String ld a,(hl) ; Stringlaenge or a ret z ; -> zurueck, falls Stringlaenge 0 ld c,a ld b,0 ld (strlen),a ; Stringlaenge speichern inc hl ; hl = Stringadresse ld de,string ldir ; String in Common-Bereich uebertragen ld bc,rout ; Adresse der aufzurufenden Routine call xbios dw 00e9h ; Screen-Environment einschalten ret ; zurueck zu TURBO PASCAL rout: ld a,(strlen) ; Stringlaenge ld b,a ld hl,string ; Stringadresse mloop: ld a,(hl) ; Zeichen aus String cp 27 ; ESC-Code? jr nz,getmat ; -> nein inc hl dec b ret z ; -> kein weiterer Code folgt ld a,(hl) ; Schriftstil holen ld (style),a ; und merken inc hl dec b ret z ; -> kein weiterer Code folgt ld a,(hl) ; naechstes Zeichen getmat: push bc push hl ld l,a ; Zeichen ld h,0 add hl,hl ; mal 8 add hl,hl add hl,hl ld de,CHRMTX ; plus Startadresse Zeichen-RAM add hl,de ; ergibt Matrixadresse ld de,matrix ld bc,8 ldir ; Matrix holen ld hl,1*256+1 ; normale Breite/Hoehe ld (width),hl ; als Vorgabe ld a,(style) ; Schrifttyp holen cp 0ffh jr z,acht ; -> Grosschrift 8x8 rra call c,light rra call c,fett rra call c,untstr rra call c,invers rra call c,breit rra call c,hoch rra call c,expo rra call c,index call ausg ; manipuliertes Zeichen ausgeben nchar: pop hl pop bc inc hl ; Zeiger auf naechstes Zeichen djnz mloop ret acht: ld hl,matrix ld b,8 ld de,(xypos) ld a,d sub b ld d,a ; Textpos 8 Zeilen nach oben nreih8: inc d ; naechste Reihe push bc push de push hl ld b,8 ld c,(hl) ; Pixelreihe aus Matrix nspal8: rlc c ; naechstes Pixel ld hl,matrix jr c,setch ld hl,space setch: call chout ; Zeichen ausgeben inc e ; naechste Spalte ld a,e djnz nspal8 pop hl pop de pop bc inc hl ; naechste Pixelreihe djnz nreih8 ld (xypos),a jr nchar ; -> naechster Buchstabe untstr: ld hl,matrix+7 ; in der 8. Pixelreihe ld (hl),0ffh ; unterstreichen ret light: push af ; Duennschrift ld hl,matrix ; Matrix manipulieren ld b,8 lloop: ld a,(hl) srl a and (hl) ld (hl),a inc hl djnz lloop pop af res 0,a ; Fett sperren ret fett: push af ld hl,matrix ; Matrix manipulieren ld b,8 ; 8 Pixelreihen floop: ld a,(hl) srl a or (hl) ld (hl),a inc hl djnz floop pop af ret invers: push af ld hl,matrix ld b,8 iloop: ld a,(hl) cpl ; Pixelreihe invertieren ld (hl),a inc hl djnz iloop pop af ret breit: push af ld a,2 ld (width),a ld ix,matrix ld c,8 ; 8 Pixelreihen nrow: ld b,8 ; 8 Pixel verdoppeln ld a,(ix) ; Pixelreihe npix: rra ; Pixel ins Carry rr (ix) rr (ix+16) sra (ix) ; Pixel verdoppeln rr (ix+16) djnz npix inc ix ; Zeiger auf naechste Pixelreihe dec c jr nz,nrow pop af ret hoch: ld a,2 ld (hight),a ld de,matrix+7 call expand ; Pixelreihen verdoppeln ld a,(width) dec a ; doppelte Breite? ret z ; -> nein ld de,matrix+23 ; Adresse der zweiten Haelfte expand: ld hl,8 add hl,de ld b,8 ; 8 Pixelreihen nhi: ld a,(de) ; Pixelreihe dec de ld (hl),a ; verdoppeln dec hl ld (hl),a dec hl djnz nhi xor a ; Exponent/Index sperren ret index: xor a ; Hoehe 0 fuer Index jr indexp expo: ld a,2 ; Hoehe 2 fuer Exponent indexp: ld (hight),a ; merken ld de,matrix+15 call trans ; Matrix verschieben ld a,(width) dec a ; doppelte Breite? ret z ; -> nein ld de,matrix+31 ; Adresse der rechten Haelfte trans: call clear ; 4 Pixelreihen loeschen ld hl,-4 add hl,de ld bc,8 lddr ; Matrix um 4 Pixelreihen verschieben clear: xor a ld (de),a dec de ld (de),a dec de ld (de),a dec de ld (de),a dec de ret ausg: ld hl,matrix ; manipulierte Matritzen ausgeben ld bc,(width) ; b=Hoehe, c=Breite ld de,(xypos) ; Textkoordinaten nspalt: push de push hl dec d dec b dec b call z,chout ; oben f. Exp./doppelte Hoehe inc d call chout ; Mitte inc d inc b inc b call z,chout ; unten fuer Index pop hl ld de,16 ; Adresse der rechten Haelfte add hl,de ; berechnen pop de inc e ; naechste Textspalte dec c jr nz,nspalt ; -> falls doppelte Breite ld (xypos),de ; neue Textkoordinaten merken ret chout: ld a,e ; Spalte cp 90 ; groesser 89? ret nc ; -> ja ld a,d ; Reihe cp 32 ; groesser 31? ret nc ; -> ja push bc push de push hl ld d,0 rlca ; reihe * 16 rla rla rla ld l,a ld a,d adc a,HIGH ROLLER ld h,a ; hl = b600+Reihe*16 ld a,(hl) ; Wert aus Roller-RAM inc hl ld h,(hl) ld l,a ex de,hl ; nach de add hl,hl ; Spalte * 4 add hl,hl add hl,de ; + Wert aus Roller-RAM add hl,hl ; * 2 = Screenadresse ex de,hl ; nach de pop hl ; Matrixadresse ld bc,8 ; 8 Pixelreihen ldir ; ins Video-RAM pop de pop bc ret style: db 0 strlen: db 0 xypos: dw 0 width: db 0 hight: db 0 space: db 0,0,0,0,0,0,0,0 matrix: ds 7 ;;mat+7 ds 8 ; Ende 1. Matrix ;;mat+15 ds 8 ; Ende 2. Matrix ;;mat+23 ds 8 ; Ende 3. Matrix ;;mat+31 ds 1 ; Ende 4. Matrix string: ds 1 ; Start Commonbereich f. String .dephase end