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