title Superscript Assembler Quelle fuer TURBO PASCAL name ('VIERGEW') ; Diese Routine ist leicht modifiziert fuer das Spiel ; 'Vier gewinnt', welches auf einer BASIC-Quelle basiert. ; Sie unterstuetzt weder "Grosschrift 8x8" noch "inverse Darstellung" script equ 0ca00h ; Routine started hier MATXLEN equ 8 ; Laenge der Matrix fuer ein Zeichen ROLLER equ 0b600h CHRMTX equ 0b800h XBIOS equ 0fc5ah SCR_RUN equ 000e9h .phase script ; Uebernahme der Werte von TURBO PASCAL ; procedure script(m,x,y:byte;var text:string); pop iy pop de ; Zeiger auf String pop bc ; y-Position pop hl ; x-Position ld h,c pop bc ; Schriftstil laden push iy ld a,c ld (style),a ; Schriftstil speichern 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 SCR_RUN ; Screen-Environment einschalten ret ; zurueck zu TURBO PASCAL ; ; Ausfuehren der folgenden Routine in der Screen-Environment Bank ; ; Die Routine ist leicht modifiziert. In der Anwendung findet sich ; kein ESC-Zeichen sondern ein Extrabyte fuer den Schriftstil ; ; Diese Routine erlaubt auch NICHT, dass beim Stilbyte alle ; Bist gestzt sind (-1, Grosschrift 8x8) ; rout: ld a,(strlen) ; Stringlaenge ld b,a ld hl,string ; Stringadresse mloop: ld a,(hl) ; Zeichen laden push bc push hl ld l,a ; Zeichen umsetzen 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,MATXLEN ldir ; Matrix holen ld hl,1*256+1 ; Normale Breite/Hoehe ld (width),hl ; als Vorgabe ld a,(style) ; Schrifttyp holen rra call c,light rra call c,bold rra call c,underline rra ; Keine inverse Darstellung rra call c,wide rra call c,high rra call c,expo rra call c,index call chrout ; Manipuliertes Zeichen ausgeben nchar: pop hl pop bc inc hl ; Zeiger auf naechstes Zeichen djnz mloop ret ; ; Zeichen unterstreichen ; underline: ld hl,matrix+7 ; In der 8. Pixelreihe ld (hl),11111111b ; unterstreichen ret ; ; Duennschrift ; 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 ; ; Fettschrift ; bold: push af ld hl,matrix ; Matrix manipulieren ld b,8 ; 8 Pixelreihen bloop: ld a,(hl) srl a or (hl) ld (hl),a inc hl djnz bloop pop af ret ; ; Breitschrift ; wide: 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 ; ; Hochschrift ; high: ld a,2 ld (height),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,MATXLEN add hl,de ld b,MATXLEN ; 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 ; ; Indizierte Schrift ; index: xor a ; Hoehe 0 fuer Index jr indexp ; ; Exponierte Schrift ; expo: ld a,2 ; Hoehe 2 fuer Exponent indexp: ld (height),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,MATXLEN 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 ; ; Manipulierte Matritzen ausgeben ; chrout: ld hl,matrix ; Zeiger auf manipulierte Matrix 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,2*MATXLEN ; 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 ; ; Matrix auf dem Schirm ausgeben ; chout: ld a,e ; Spalte cp 89+1 ; Groesser 89? ret nc ; -> Ja ld a,d ; Reihe cp 31+1 ; 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,ROLLER / 256 ld h,a ; hl = b600+Reihe*16 ld a,(hl) ; Adresse 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 ; + Adresse aus ROLLER-RAM add hl,hl ; * 2 = Bildschirmadresse ex de,hl ; Nach de pop hl ; Matrixadresse ld bc,MATXLEN ; 8 Pixelreihen ldir ; ins Video-RAM pop de pop bc ret ; style: db 0 strlen: db 0 xypos: dw 0 width: db 0 height: db 0 space: ds MATXLEN matrix: ds 7 ;;matrix+7 ds 8 ; Ende der 1. Matrix ;;matrix+15 ds 8 ; Ende der 2. Matrix ;;matrix+23 ds 8 ; Ende der 3. Matrix ;;matrix+31 ds 1 ; Ende der 4. Matrix string: ds 256 ; Start Commonbereich fuer String top:: .dephase end