;******************************************************************** ;* PIXEL.MAC: externe Grafikerweiterung * ;* fuer Schneider JOYCE unter TURBO-Pascal v. August 1987 * ;******************************************************************** ; .Z80 CSEG ; puffer equ 0C000h ;Adresse fuer Puffer xbios equ 0FC5Ah ;Einsprungadresse fuer XBIOS screen equ 00E9h ;Nummer der XBIOS-Funktion ;SCR_RUN_ROUTINE roller equ 0B600h ;Anfangsadresse des Roller-RAM ; ;******************************************************************** ;* UP Punkt setzen, testen, ruecksetzen * ;* was gemacht werden soll, wird ueber MODUS bekannt gegeben: * ;* 0 = ruecksetzen, 1 = setzen, sonst. = testen * ;* * ;* Parameter fuer Unterprogramme werden in * ;* Turbo ueber den Stack uebergeben * ;******************************************************************** ; pop de ;RET-Adresse holen pop iy ;Adresse von MODUS pop bc ;y-Koordinate pop hl ;x-Koordinate push de ;RET-Adresse zurueck push hl ;x wird erst spaeter gebraucht call div ;tzeile = y DIV 8 add hl,hl add hl,hl add hl,hl add hl,hl ;tzeile = tzeile * 16 ex de,hl ld ix,roller add ix,de ;rolleradr. = $B600 + tzeile in IX pop bc ;jetzt wird x benoetigt push hl ;y mod 8 aufheben call div ;tspalte = x DIV 8 ld a,e ;bit = x MOD 8 add hl,hl add hl,hl add hl,hl ;tspalte = tspalte * 8 pop de ;y mod 8 holen add hl,de ;... + y MOD 8 ex de,hl ;tspalte in DE ld b,a ;bit in B or a ;bit = 0? ld a,128 jr z,weiter rot: srl a ;wenn Bit <> 0, Maske berechnen djnz rot weiter: ld bc,routine ;Adresse des Unterprogramms call xbios ;Aufruf des XBIOS dw screen ;XBIOS-Funktion ret ; routine:ld l,(ix+0) ;A = Maske, IX = Rolleradresse inc ix ld h,(ix+0) ;Inhalt der Rolleradr. in HL add hl,hl ;... * 2 add hl,de ;... + tspalte ld e,a ;maske retten ld a,(iy+0) ;modus in A cp 1 ;Bit setzen ? jr z,setzen ;ja, also Bit setzen jr nc,testen ;Inhalt von A ist groesser 1, ;also Bit testen ;Inhalt von A ist kleiner 1, ;also Bit loeschen ; ;******************************************************************** ;* BIT loeschen * ;******************************************************************** ; loeschen:ld a,e ;maske zurueck in Akku and (hl) xor (hl) ld (hl),a jr ende ; ;******************************************************************** ;* BIT setzen * ;******************************************************************** ; setzen: ld a,e or (hl) ld (hl),a jr ende ; ;******************************************************************** ;* BIT testen * ;* Ergebnis wird im L-Register * ;* zurueckgegeben, H muss 0 sein * ;******************************************************************** ; testen: ld a,e and (hl) ld hl,0 ;FALSE = 0 ret z ;Bit war nicht gesetzt dec l ;TRUE = -1 ende: ret ; ;******************************************************************** ;* Divisionsroutine * ;* * ;* HL=BC DIV DE * ;* DE=BC MOD DE * ;******************************************************************** ; div: ld de,8 ld hl,0 ld a,b ld b,16 d1: rl c rla add hl,hl sbc hl,de jr nc,d2 add hl,de d2: ccf djnz d1 rl c ex de,hl ld h,a ld l,c ret ; ;******************************************************************** ;* UP Bild speichern * ;* * ;* erwartet als Parameter aktuelle * ;* Textzeile * ;******************************************************************** ; save: pop bc ;RET-Adresse holen pop hl ;HL = Zeile push bc ;RET-Adresse zurueck auf Stack ld de,roller add hl,hl add hl,hl add hl,hl add hl,hl ;Zeile * 16 add hl,de ;Zeile + rolleradr ld bc,srout call xbios dw screen ret ; srout: ld a,(hl) ;HL = Rolleradresse der Zeile inc hl ld h,(hl) ld l,a ;Inhalt vom RollerRam in HL add hl,hl ;...* 2 ld bc,720 ;Anzahl Bytes fuer 1 Textzeile ;(90 Zeichen * 8 Bytes) ld de,puffer ;Puffer ldir ret ; ;******************************************************************** ;* UP Bild laden * ;* * ;* erwartet als Parameter Textzeile * ;******************************************************************** ; load: pop bc pop hl push bc ld de,roller add hl,hl add hl,hl add hl,hl add hl,hl ;Zeile * 16 add hl,de ;Zeile + rolleradr ld bc,lrout call xbios dw screen ret ; lrout: ld a,(hl) inc hl ld h,(hl) ld l,a ;Inhalt von RollerRam in HL add hl,hl ;...* 2 ld bc,720 ;Anzahl Bytes fuer 1 Textzeile ld de,puffer ex de,hl ;HL = Quelle, DE = Ziel im ldir ; Bildschinnspeicher ret ; end