summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/INT65.MAC
diff options
context:
space:
mode:
Diffstat (limited to 'system/shard-z80-ruc-64180/1.5/src/INT65.MAC')
-rw-r--r--system/shard-z80-ruc-64180/1.5/src/INT65.MAC412
1 files changed, 412 insertions, 0 deletions
diff --git a/system/shard-z80-ruc-64180/1.5/src/INT65.MAC b/system/shard-z80-ruc-64180/1.5/src/INT65.MAC
new file mode 100644
index 0000000..f47d45c
--- /dev/null
+++ b/system/shard-z80-ruc-64180/1.5/src/INT65.MAC
@@ -0,0 +1,412 @@
+ TITLE INT65 - Interface 6502 <-> 64180
+;
+ INCLUDE HD64180.LIB
+;
+ .LIST
+ CSEG
+;
+;****************************************************************
+;
+; INT65: Interface BASIS 6502 <-> 64180, Einstellungen fuer
+; serielle Schnittstelle im BASIS 108
+;
+; Version 0.4 - 25.11.85 / 11:00
+; Version 0.5 - 23.12.86, M.Staubermann
+; Version 0.6 - 14.01.86, Kanal 5 Flusskontrolle durch 6502
+;
+; Copyright (C) 1985 by Rainer Ellerbrake
+; Eggeberger Str. 12
+; 4802 Halle (Westf.)
+;
+;****************************************************************
+;
+; Globale Variable
+;
+ GLOBAL ZGERL, TO6502, TO65WA, WTEND, RD6502
+ GLOBAL BAUBAS, BITBAS, AFLOW5, EFLOW5, FRE65
+;
+;................................................................
+;
+; Externe Variable
+;
+ EXTERNAL WARTE
+;
+;................................................................
+;
+; Konstanten
+;
+P065 EQU 51H ;Page 0 des 6502 einblenden
+PC65 EQU 5DH ;I/O-Bereich des 6502
+;
+TASK EQU 0F080H
+PARAM EQU TASK+1
+;
+AFLG EQU 0F09AH ; XON/XOFF - Ausgabeseitig: Bit 7 = 1
+EFLG EQU 0F09BH ; Ausgabeseitiger Stopzustand: Bit 7 = 1
+;SFLG EQU 0F09CH ; Stopzustand des Transmitters
+WAITFLG EQU 0F09DH ; 6502 - Update-Synchro
+;
+PFREE EQU 0F0E0H ; Word: Anzahl freie Bytes im Druckerspooler
+TFREE EQU 0F0F0H ; Word: Anzahl freie Bytes im Transmitbuffer
+;
+SER_CMD EQU 0F09AH ; Command Register 6551 BASIS
+SER_CTR EQU 0F09BH ; Control Register 6551 BASIS
+;
+;
+ INCLUDE PORTS.MAC
+;
+;****************************************************************
+;
+; T O 6 5 0 2
+;
+; 6502 Task Aufruf
+;
+; Eingang: L - Task-Nummer
+; H - Parameter
+;
+TO6502:
+ PUSH AF
+ LD A,I
+ PUSH AF
+ DI
+ IN0 A,(CBR)
+ PUSH AF
+;
+ LD A,P065
+ OUT0 (CBR),A
+;
+; Warten bis vorherige Task beendet ist
+;
+WRTTAS:
+ CALL ZGERL
+ LD A,(TASK) ;Task = 0: beendet
+ AND A
+ JR NZ,WRTTAS
+;
+ LD A,H
+ LD (PARAM),A
+;
+ LD A,L
+ LD (TASK),A ;Task aufrufen
+;
+; auf Ende wird erst beim naechsten Aufruf gewartet
+;
+ POP AF
+ OUT0 (CBR),A ;zurueckschalten
+ POP AF
+ JP PO,NOEI
+;
+ EI
+NOEI:
+ POP AF
+ RET
+;
+;----------------------------------------------------------------
+;
+; T O 6 5 W A
+;
+; Warten auf Beendigung des Task Aufrufs
+; (EUMEL WARTE wird aufgerufen!!)
+;
+TO65WA:
+ PUSH AF
+;
+; Warten bis Task beendet ist
+;
+
+WTTAS:
+ IN0 A,(CIOAD)
+ BIT 0,A
+ JR Z,WTTA1 ;Zugriff nicht erlaubt -> warten
+;
+ PUSH HL
+ LD HL,LOW TASK
+ CALL RD6502 ; Task-Byte in A
+ POP HL
+
+ AND A
+ JR NZ,WTTA1
+ POP AF
+ RET
+
+WTTA1:
+ CALL WARTE
+;
+ JR WTTAS
+;
+;----------------------------------------------------------------
+;
+; W T E N D
+;
+; Warten auf Beendigung des Task Aufrufs
+;
+WTEND:
+ PUSH AF
+;
+; Warten bis Task beendet ist
+;
+WTTAS1:
+ CALL ZGERL
+;
+ PUSH HL
+ LD HL,LOW TASK
+ CALL RD6502
+ POP HL
+
+ AND A
+ JR NZ,WTTAS1
+;
+ POP AF
+ RET
+
+;
+;----------------------------------------------------------------
+;
+; Z G E R L
+;
+; Auf Zugriffserlaubnis warten
+;
+; keine Register veraendert
+;
+;
+; Zugriff auf 6502-Speicher zulaessig ?
+;
+ZGERL:
+ PUSH AF
+WAI65:
+ IN0 A,(CIOAD)
+ BIT 0,A
+ JR Z,WAI65 ;nicht erlaubt -> warten
+;
+ POP AF
+ RET
+;
+;---------------------------------------------------------------
+;
+; R D 6 5 0 2
+; Byte aus 6520-Memory Adresse HL nach A lesen
+;
+; Eingang: HL = Zeropage- oder I/O-Page-Adresse im 6502-Memory
+; Ausgang: In A steht der Inhalt der Adresse
+;
+RD6502:
+ PUSH BC
+ LD B,A
+ LD A,I
+ DI
+ PUSH AF
+
+ IN0 A,(CBR)
+ LD C,P065 ; Bit 7 nicht gesetzt: Zeropage
+ BIT 7,H
+ JR Z,RD6502B
+ LD C,PC65 ; Bit 7 gesetzt: I/O-Adresse
+RD6502B: ; Achtung: Nicht eindeutig!
+ OUT0 (CBR),C
+
+ LD C,H
+ LD H,0F0H
+ LD B,(HL)
+ LD H,C
+
+ OUT0 (CBR),A
+
+ POP AF
+ JP PO,RD6502A
+ EI
+RD6502A:
+ LD A,B
+ POP BC
+ RET
+
+;----------------------------------------------------------------
+;
+; Baudrateneinstellung fuer BASIS serielle Schnittstelle
+;
+; Eingang: A - Kanalnummer (immer 5)
+; HL - Schluessel (s. Tabelle) (1..15)
+; Es werden korrekte Parameter vorausgesetzt
+;
+; Ausgang: Register duerfen nicht veraendert werden
+;
+BAUBAS:
+ PUSH AF
+ DI
+ ; Da nur I/O Zugriffe gemacht werden, braucht
+ ; nicht auf Zugriffserlaubnis gewartet werden
+ IN0 A,(CBR)
+ PUSH AF ;alte Einstellung retten
+ LD A,PC65 ;I/O-Bereich einblenden
+ OUT0 (CBR),A
+ LD A,(SER_CTR) ;Control Register lesen
+ AND 0F0H ;Baudratenbits ausblenden
+ OR L ;und neue Einstellung einfuegen
+ LD (SER_CTR),A
+
+ POP AF
+ OUT0 (CBR),A ;alten Bereich wieder einblenden
+EIRET:
+ EI
+ POP AF
+ RET
+;
+;
+;------------------------------------------------------------------
+;
+; F R E 6 5
+; Freiplatz eines 6502-Ausgabepuffers erfragen
+;
+; Eingang: A = Kanal (5, 6)
+; Ausgang: HL veraendert, A veraendert
+; BC = Free Bytes
+; Carry set, Puffer leer
+;
+FRE65:
+ CP 5 ; BASIS serielle Schnittstelle
+ LD HL,TFREE ; Transmitbuffer
+ JR Z,BASER
+ LD HL,PFREE ; Druckerpuffer
+
+BASER:
+ DI
+ IN0 A,(CBR)
+ PUSH AF
+ LD A,51H
+ OUT0 (CBR),A ; Zeropage
+
+WAIUPD:
+ LD A,(WAITFLG)
+ AND A
+ JR NZ,WAIUPD ; Warten, bis Update zuende
+
+ LD C,(HL) ; Lowbyte Free
+ INC HL
+ LD B,(HL) ; Highbyte Free
+ INC HL
+ LD A,(HL) ; Lowbyte Size
+ INC HL
+ OR (HL)
+ LD L,A
+
+ POP AF
+ OUT0 (CBR),A
+ EI
+ LD A,L
+ AND A
+ RET NZ ; Carry cleared, Puffer nicht leer
+ SCF ; Carry set, Puffer leer
+ RET
+
+;----------------------------------------------------------------
+;
+; Stopbits, Datenbits, Parity fuer BASIS serielle Schnittstelle
+;
+; Eingang: A - Kanalnummer (immer 5)
+; L - Schluessel
+; Es werden korrekte Parameter vorrausgesetzt
+;
+; Ausgang: Register duerfen nicht veraendert werden
+;
+BITBAS:
+ PUSH AF
+ DI
+ ; Da nur I/O Zugriffe gemacht werden, braucht
+ ; nicht auf Zugriffserlaubnis gewartet werden
+ PUSH HL
+ IN0 H,(CBR)
+ LD A,PC65 ; I/O-Bereich einblenden
+ OUT0 (CBR),A
+ ; Stopbits und Datenbits setzen
+ LD A,(SER_CTR) ; Control Register lesen
+ AND 1FH ; Datenbits Stopbits ausblenden
+ BIT 6,L ; 2 Stopbits ?
+ JR Z,BITBAS1
+ SET 7,A
+BITBAS1:
+ BIT 0,L ; Bit 0 = 0, wenn 7 Datenbits (7-1 = 6)
+ JR NZ,BITBAS2
+ SET 5,A ; 01 = 7 Datenbits, 00 = 8 Datenbits
+BITBAS2:
+ LD (SER_CTR),A
+ ; Parity setzen
+ LD A,L
+ RLCA
+ RLCA
+ AND 01100000B
+ BIT 6,A
+ JR Z,BITBAS3 ; 00 = No, 01 = Odd, 10 = Even
+ SET 5,A
+BITBAS3: ; 00 = No, 01 = Odd, 11 = Even
+ LD L,A
+ LD A,(SER_CMD)
+ AND 0FH
+ OR L ; Neue Parity Bits
+ LD (SER_CMD),A
+
+ OUT0 (CBR),H ;alten Bereich wieder einblenden
+ POP HL
+ JR EIRET
+;
+;-----------------------------------------------------------------
+;
+; A F L O W 5
+; Ausgabeflusskontrolle einstellen
+;
+; Eingang: (HL) : Bit 0 = XON/XOFF, Bit 1 = DSR/DTR
+;
+AFLOW5:
+ PUSH AF
+ PUSH HL
+ XOR A
+ BIT 2,(HL) ; Ausgabeflusskontrolle ?
+ JR Z,AFLOW5A
+ CALL CALCF
+AFLOW5A:
+ LD HL,AFLG
+EAFLOW:
+ PUSH BC
+ DI
+ IN0 B,(CBR)
+ LD C,51H
+ OUT0 (CBR),C
+ LD (HL),A
+ OUT0 (CBR),B
+ EI
+ POP BC
+ POP HL
+ POP AF
+ RET
+
+CALCF:
+ BIT 0,(HL)
+ JR Z,CALCF1
+ SET 7,A ; XON/XOFF
+CALCF1:
+ BIT 1,(HL)
+ JR Z,CALCF2
+ SET 6,A ; DSR/DTR
+CALCF2:
+ RET
+
+;-----------------------------------------------------------------
+;
+; E F L O W 5
+; Eingabeflusskontrolle einstellen
+;
+; Eingang: (HL) : Bit 0 = XON/XOFF, Bit 1 = DSR/DTR
+;
+EFLOW5:
+ PUSH AF
+ PUSH HL
+ XOR A
+ BIT 3,(HL) ; EIngabeflusskontrolle ?
+ JR Z,EFLOW5A
+ CALL CALCF ; EUMEL --> 6502 Format
+EFLOW5A:
+ LD HL,EFLG
+ JR EAFLOW
+
+;-------------------------------------------------------------------
+
+ END
+ \ No newline at end of file