summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC
diff options
context:
space:
mode:
Diffstat (limited to 'system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC')
-rw-r--r--system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC203
1 files changed, 203 insertions, 0 deletions
diff --git a/system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC b/system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC
new file mode 100644
index 0000000..9850479
--- /dev/null
+++ b/system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC
@@ -0,0 +1,203 @@
+ TITLE EUMEL-SHard Graphikroutinen, 64180-Teil
+
+; RUC64180 auf Basis108
+; 19.05.86, Michael Staubermann
+; Ueberarbeitet: 11.01.87
+
+ GLOBAL GMOVE, GDRAW, GTEST, GCTRL
+ GLOBAL GTRANS, GCLR, GFILL, GRAFIO
+;
+ EXTERNAL WTEND, MEMDMA, HGOP
+
+ INCLUDE HD64180.LIB
+ .LIST
+ CSEG
+
+CTRLMOVE EQU 0
+CTRLDRAW EQU 1
+CTRLTEST EQU 2
+CTRLCTRL EQU 3
+CTRLCLR EQU 4
+CTRLFILL EQU 5
+CTRLTRANS EQU 6
+
+
+TASK EQU 0F080H ; Task fuer 6502
+RESULT EQU 0F081H ; Subtask und Ergebnis
+PARAM1 EQU 0F082H ; xpos oder Parameter
+PARAM2 EQU 0F084H ; ypos oder Linepattern
+
+;...........................................................................
+;
+; M O V E
+;
+; Startposition fuer DRAW setzen
+; Es findet keine Bereichspruefung statt
+;
+; Eingang: A = Terminalnummer (Kanal 1)
+; DE = xpos (0..279)
+; HL = ypos (0..191)
+;
+GMOVE:
+ LD B,CTRLMOVE
+ JR GRAPHIK
+
+;............................................................................
+;
+; D R A W
+;
+; Linie von Startposition bis zur uebergebenen Position zeichnen
+; Ausserhalb des Bildschirms wird nicht gezeichnet
+;
+; Eingang: A = Terminalnummer (Kanal 1)
+; DE = xpos (0..279)
+; HL = ypos (0..191)
+;
+GDRAW:
+ LD B,CTRLDRAW
+ JR GRAPHIK
+
+;............................................................................
+;
+; T E S T B I T
+;
+; Pruefen, ob Punkt gesetzt
+;
+; Eingang: A = Terminalnummer (Kanal 1)
+; DE = xpos (0..279)
+; HL = ypos (0..191)
+;
+; Ausgang: BC = 255 : Position ausserhalb des gueltigen Bereichs
+; sonst: Bit 0 = Zustand (0 = geloescht, 1 = gesetzt)
+; Bit 7 = Farbe (1 = Gelb, 0 = Violett)
+;
+GTEST:
+ LD B,CTRLTEST
+ JR GRAPHIK
+
+;...........................................................................
+;
+; C T R L
+;
+; Graphikparameter setzen
+;
+; Eingang: DE = Steuerbits:
+; Bit 0: 0 = Textmode, 1 = Graphikmode
+; Bit 1: 0 = Sichtbare Seite 0, 1 = Sichtbare Seite 1
+; Bit 2: 0 = Bearbeitete Seite 0, 1 = Bearbeitete Seite 1
+; Bit 3,4: 0 = OR, 1 = NAND, 2 = XOR Zeichnen
+; Bit 5: 0 = Full Graphics, 1 = Mixed Graphics
+; Bit 6: 0 = Pattern in HL, 1 = Letztes DRAW Pattern
+; fuer Linetype benutzen
+; Bit 7: 1 = Gelb, 0 = Violett
+; HL = Linetype Pattern, wenn Bit 6 = 0
+;
+GCTRL:
+ LD B,CTRLCTRL
+ JR GRAPHIK
+
+;............................................................................
+;
+; C L E A R
+;
+; Graphikseite mit einem Fuellzeichen loeschen
+;
+; Eingang: DE = Page (0..3)
+; HL = Fuellzeichen (Byte in L)
+;
+GCLR:
+ LD B,CTRLCLR
+ JR GRAPHIK
+
+;............................................................................
+;
+; F I L L
+;
+; Umrandete Flaeche fuellen
+;
+; Eingang: DE = xpos
+; HL = ypos
+GFILL:
+ LD B,CTRLFILL
+ JR GRAPHIK
+
+;............................................................................
+;
+; T R A N S
+;
+; Transportiert (kopiert) eine Graphikseite in eine andere
+;
+; Eingang: DE = 'from'-Page (0..3)
+; HL = 'to'-Page (0..3)
+GTRANS:
+ LD B,CTRLTRANS
+
+GRAPHIK:
+ LD A,B ; Subtasknummer
+ CALL WTEND ; Busy warten, da in IOCONTROL
+ POP HL
+ PUSH HL ; Zweiter Parameter
+
+ DI
+ IN0 B,(CBR) ; Alte MMU-Einstellung merken
+ LD C,51H ; Basisspeicher Page 0
+ OUT0 (CBR),C
+
+ LD (PARAM1),DE ; 1. Parameter
+ LD (PARAM2),HL ; 2. Parameter
+
+ LD L,7 ; 6502-Task: Graphik
+ LD H,A ; Subtask
+ LD (TASK),HL
+ LD C,0 ; Als 'ok' vorbesetzen
+ CP CTRLTEST ; Muss auf Resultat gewartet werden ?
+ JR NZ,TASKEND
+
+WAITTEND: LD A,(TASK) ; Darf intensiv auf Taskende warten
+ AND A
+ JR NZ,WAITTEND
+ LD A,(RESULT)
+ LD C,A
+
+TASKEND: OUT0 (CBR),B ; Alte MMU-Einstellung wiederherstellen
+ EI
+ POP HL
+ LD B,0
+ RET
+
+;..............................................................................
+;
+; G R A F I O
+; Blockin/Blockout fuer Graphikpage
+;
+; Eingang: DE = Blocknummer : 0..15= Page 0 (ggf. sichtbar)
+; 16..31= Page 1 (ggf. sichtbar)
+; 32..47= Page 2 (nur durch Transfer)
+; 48..63= Page 3 (nur durch Transfer)
+;
+; HL = Hauptspeicheraddresse
+; (HGOP) = 1 : Graphikseite --> Hauptspeicher
+; (HGOP) = 0 : Hauptspeicher --> Graphikseite
+;
+GRAFIO:
+ PUSH AF
+ PUSH DE
+
+ EX DE,HL ; DE = log. Hauptspeicheradresse
+ LD A,L
+ ADD A ; HL * 512 + 2000H
+ ADD A,20H
+ LD H,A
+ LD L,0
+ LD BC,512 ; Blockgroesse
+ LD A,(HGOP) ; Transferrichtung
+
+ CALL MEMDMA ; Block tranportieren
+
+ POP DE
+ POP AF
+ LD BC,0 ; Transfer fehlerfrei
+ RET
+
+ END
+ \ No newline at end of file