;************************ ; PLOT - MCode ; Basiert auf ; Turbo Pascal Version ; 1987 by M.A. & E. W. ; Vers. 10/8/87 ; (excl. DotColor) ; (excl. Scr_Access) ;************************ ; .z80 cseg entry plot ; proc equ 0c000h ; Start der Plotroutine XBIOS equ 0fc5ah ; Einsprungadresse fuer XBIOS SCREEN equ 000e9h ; Nummer der XBIOS-Funktion ; SCR_RUN_ROUTINE ROLLER equ 0b600h ; Anfangsadresse des Roller-RAM ; ;#################################################################### ;# x-Koordinate in HL, y-Koordinate in (D)E und MODUS im Akku # ;# Vorspann testet, ob Routine schon im Common Speicher liegt. # ;# Falls nicht, dann Routine verschieben # ;#################################################################### ; plot: ex de,hl ; x in DE; y in L ld h,a ; MODUS retten ld a,(plotflg) ; Plot-Flag laden or a ; Test, ob Routine schon im Speicher call z,moveplot ; Nein, Routine verschieben ld bc,routine ; Adresse des Unterprogramms call XBIOS ; Aufruf des XBIOS dw SCREEN ; XBIOS-Funktion ret ; ;#################################################################### ;# Video-Routine verschieben # ;#################################################################### ; moveplot: push bc push de push hl ld hl,hiplot ; Quelle laden ld de,proc ; Ziel laden ld bc,prcln ldir ; Routine in den Speichre verschieben ld a,-1 ld (plotflg),a ; Anzeigen, dass Routine im Speicher liegt pop hl pop de pop bc ret ; plotflg: db 0 hiplot: .phase proc ;#################################################################### ;# Unterprogramm Punkt setzen, ruecksetzen, umschalten, testen. # ;# Was gemacht werden soll, wird ueber MODUS bekannt gegeben: # ;# 0 =setzen, 1 =ruecksetzen # ;# 2 =umschalten, 3 =testen # ;# Im Fall 3 ist der Akku 0FFh und die Carry Flag gesetzt, falls # ;# auch das zu testende Bit gesetzt ist. # ;# # ;# Parameter fuer Unterprogramme wurden in # ;# Turbo ueber den Stack uebergeben # ;# # ;# Im Assembler-Module wird das ueber Register abgewickelt: # ;# x-Koordinate in DE, y-Koordinate in L und MODUS in H # ;#################################################################### ; routine: push hl ; MODUS sichern ld h,0 ; y auf 16 Bit add hl,hl ; y*2 ld bc,ROLLER add hl,bc ; In ROLLER RAM positionieren ld c,(hl) ; Adresse aus ROLLER RAM laden inc hl ld b,(hl) ld a,c and 11111000b ld l,a ld h,b add hl,hl ; Adresse korrigieren ld a,00000011b and d ; x begrenzen 0..3FF ld d,a add hl,de ; Adresse der Spalte ld a,l and 11111000b ld l,a ; Adresse korrigieren ld a,c and 00000111b or l ld l,a ld a,e ; x laden and 00000111b ; Spalte isolieren inc a ; Bitposition 0..7 -> 1..8 ld b,a xor a ; Maske einstellen scf ; Mit gesetztem Bit beginnen loop: rra ; Bit in Maske positionieren djnz loop pop bc ; MODUS laden inc b dec b ; Test 0 = setzen jr nz,clear or (hl) ; Bit setzen ld (hl),a ret clear: dec b ; Test 1 = ruecksetzen jr nz,reverse cpl ; Maske invertieren and (hl) ; Bit 0 setzen ld (hl),a ret reverse: dec b ; Test 2 = umschalten jr nz,status xor (hl) ; Bit umschalten ld (hl),a ret status: dec b ; Test 3 = testen ret nz and (hl) ; Bit maskieren ld a,-1 ; Ergebnis setzen scf ret nz ; Akku = 0FFh, C - Bit gesetzt xor a ; Akku = 00h, NC - Bit nicht gesetzt ret ; prcln equ $-proc .dephase end