P8000/UDOS/WEGA/K.NEU.S

833 lines
12 KiB
ArmAsm

;**************************************************************
;
; P8000 KOPPELSOFTWARE
; GRUNDMODUL
; VERSION: 3.1
;
;**************************************************************
GLOBAL SAVE S0BT
GLOBAL ERROR UEB16
GLOBAL LODNET SNDNET WAIT STATUS WAITACK
GLOBAL LODDAT SNDDAT SNDACK
EXTERNAL LOAD SEND PROM
EXTERNAL ACTFLG
EXTERNAL BLKINIT
EXTERNAL BLKRD BLKWT BLKFO
EXTERNAL RBLOCK WBLOCK
LD B,5
ESTART:
LD HL,0FFFFH ;ZEITSCHLEIFE FUER FLOPPY
ENTRY:
DEC HL
LD A,H
OR L
JR NZ,ENTRY
DJNZ ESTART
DI
LD HL,ISRPIO
LD (IP0KB),HL ;ISR-ADR IN TABELLE FUER PIO
LD HL,ITABS0 ;RETTEN SIO 0 KANAL B ISR-ADR.
LD DE,SAVE
LD BC,32
LDIR
LD HL,IP1KA ;RETTEN PIO1 ISR-ADR
LD DE,SAVEPIO
LD BC,4
LDIR
IN A,(P0BD) ;STAND U8000-BIT RETTEN
PUSH AF
LD HL,BUFFER ;INITIALISIEREN RINGPUFFER
LD (HL),0
LD DE,BUFFER+1
LD BC,BUFEND-BUFFER-1
LDIR
IN A,(P0AD) ;SCHEINEINGABE DAMIT PORT FREI !
XOR A
LD (ACTFLG),A
POP AF
BIT 7,A
JR Z,MMT ;U8000 BEREITS AKTIV
XOR A ;RESET-U8000 AUF LOW
OUT (P0BD),A ;D.H. 16 BIT-TEIL START
LD B,80H
DJNZ $
LD A,80H ;DOPPELRESET FUER
OUT (P0BD),A ;MP600-ERWEITERUNGSKARTEN
LD B,80H
DJNZ $
XOR A ;NOTWENDIG
OUT (P0BD),A
IN A,(P0BD)
BIT 6,A
JR Z,HWTEST ;PORT NICHT FREI (ALLES I.O.)
;WENN PORT FREI ,WAS AN DIESER STELLE
;NICHT SEIN DARF, DANN GEWISSE ZEIT WARTEN
LD HL,8000H
ZEIT: DEC HL
LD A,H
OR L
JR NZ,ZEIT
;HARDWARETEST-KOPPELSCHNITTSTELLE
HWTEST:
LD HL,0FFFFH ;MAX. ZEIT
W8000 IN A,(P0BD)
BIT 6,A
JR NZ,TEST
DEC HL
LD A,H
OR L
JR NZ,W8000
LD HL,MERR ;U8000 ARBEITET NICHT
JR TERR1
TEST: LD C,2AH ;STATUS FUER
LD A,0AAH
CALL OUTP16 ;1.DATENMUSTER
JR Z,TERR
LD C,0AH
CALL WAITACK
JR NZ,TERR
IN A,(P0AD)
CP 0AAH
JR NZ,TERR
LD A,55H
LD C,A ;STATUS FUER
CALL OUTP16 ;2.DATENMUSTER
JR Z,TERR
LD C,15H
CALL WAITACK
JR NZ,TERR
IN A,(P0AD)
CP 55H
JR NZ,TERR
LD HL,KBC0R ;ENDGUELTIGE PROGRAMMIERUNG KOPPELPIO
LD C,P0BC ;MIT INTERRUPT
LD B,4
OTIR
LD A,2 ;KENNZEICHEN DAS VON UDOS-PROGRAMM
;WEGA GESTARTET WURDE !!!
LD C,0 ;STATUS
CALL OUTP16 ;DATENMUSTER
JR NZ,WREQ ;OK
TERR: LD HL,MTERR ;FEHLER BEI HARDWARETEST
TERR1: EI
CALL OUTAS
JR QUITRST
MMT:
LD A,83H
OUT (P0BC),A ;PIO-INTERRUPT ERLAUBEN
EI
LD HL,MMLDG
CALL OUTAS
DI
WREQ: LD HL,SNEUTAB ;SIO ISR-ADR. NEU INITIALISIEREN
LD DE,ITABS0
LD BC,32
LDIR
LD HL,ISP1KA
LD (IP1KA),HL
LD HL,ISP1KB ;PIO1-ISR-ADR NEU SETZEN
LD (IP1KB),HL
call BLKINIT ;Block-Floppy Init
EI
WAIT: XOR A
LD (RSTART),A
LD A,8FH ;FD-LAUFWERKE READY SETZEN
LD (DSEL),A
LOOP: CALL UEB16 ;TEST OB INT-WERTE VON SIO'S ANLIEGEN
LD HL,STATUS
LD A,(HL)
OR A
JR Z,NEXT
BIT 0,A
JR NZ,QUIT
BIT 7,A
JR NZ,QUITRST
BIT 1,A
JP NZ,SEND
BIT 2,A
JP NZ,LOAD
BIT 3,A
JP NZ,PROM
NEXT: inc hl
ld a,(hl)
or a
jr z,LOOP
BIT 0,A
JP NZ,BLKRD
BIT 1,A
JP NZ,BLKWT
BIT 2,A
JP NZ,BLKFO
BIT 3,A
JP NZ,BLKFO
BIT 4,A
JP NZ,BLKFO
JR LOOP
QUITRST:
LD A,80H ;U8000-RESET
OUT (P0BD),A
JR REEX
QUIT:
CALL SNDACK
LD B,80H ;WARTEZEIT FUER U8000 KINB !!!
DJNZ $
LD HL,BASP
CALL OUTAS
LD B,10
DJNZ $
REEX:
DI
LD A,11H ;SIO0 KANAL B AUF
OUT (S0BC),A ;STANDARDINITIALISIERUNG
LD A,1CH ;DES 8-BIT-PROM
OUT (S0BC),A
LD HL,SAVE ;ALTE ISR-WERTE SIO 0 KANAL B
LD DE,ITABS0 ;ZURUECKSPEICHERN
LD BC,32
LDIR
LD HL,SAVEPIO
LD DE,IP1KA ;ALTE WERTE PIO1 ISR-ADR SETZEN
LD BC,4
LDIR
LD A,3
OUT (P0BC),A ;PIO-INT AUS
EI
RET ;EXIT ZU UDOS
;;;;;;;;;;;;;;;;;;;;;;;;;;
UEB16:
LD IX,RB_S0A
LD C,83H ;STATUS + STB + INT8000
CALL UEBSIO
LD IX,RB_S0B
LD C,85H
CALL UEBSIO
LD IX,RB_S1A
LD C,87H
CALL UEBSIO
LD IX,RB_S1B
LD C,89H
UEBSIO: DI
BIT 1,(IX+73H) ;WAR E_INT
RES 1,(IX+73H)
JR Z,OUTBUF ;NEIN
SET 6,C ;E_INT SETZEN
JR INT1
OUTBUF LD A,(IX+71H)
CP (IX+72H) ;POINTER GLEICH
JR Z,S_INT
CALL INCPOI ;NEIN
LD (IX+71H),A ;LESEPOINTER+1 UND SPEICHERN
LD A,(HL) ;ZEICHEN HOLEN
JR INT2
S_INT:
BIT 2,(IX+73H) ;WAR S_INT
RES 2,(IX+73H)
JR Z,T_INT
LD A,C
OR 60H ;S_INT SETZEN
LD C,A
LD A,(IX+75H) ;RR1 UEBERGEBEN
JR INT2
T_INT:
BIT 0,(IX+73H) ;WAR T_INT
RES 0,(IX+73H)
JR Z,P1KA ;NEIN
SET 5,C ;T_INT SETZEN
INT1: LD A,(IX+74H) ;RR0 UEBERGEBEN
INT2: DI
LD B,A ;DATEN RETTEN
OUT (P16A),A ;DATENBYTE
XOR A
OUT (P16B),A
LD A,C
INT3: OUT (P16B),A
WAT16: EI
NOP
DI
IN A,(P0BD)
BIT 6,A ;WARTEN BIS DATEN PER INT8000
JR Z,WAT16 ;ABGEHOLT WURDEN
LD A,(FLAG) ;WURDEN AUSGABEDATEN DURCH
OR A ;KINB UEBERSCHRIEBEN ?
JR NZ,NEUAUS ;JA: DATEN NEU ANLEGEN OHNE INT8000
EXIT: EI
RET
P1KA: LD HL,STAT2 ;WAR PIO1 KANAL A INTERRUPT ?
BIT 0,(HL)
JR Z,P1KB ;NEIN
RES 0,(HL) ;JA
LD A,0
LD C,8BH ;STATUS 0AH or 81H
JR INT2
P1KB: BIT 1,(HL) ;KANAL B INTERRUPT ?
JR Z,EXIT ;NEIN
RES 1,(HL)
LD A,0
LD C,0ABH ;STATUS 2AH or 81H
JR INT2
NEUAUS: XOR A
LD (FLAG),A ;FLAG RUECKSETZEN
RES 0,C ;INT8000 AUSSCHALTEN
LD A,B
JR INT2 ;DATEN UND STATUS NEU ANLEGEN
;;;;;;;;;;;;;;;;;;;;;;;;;
LODNET:
CALL UEB16
DI
LD IX,RECBUF
LD A,(IX+71H)
CP (IX+72H) ;POINTER GLEICH --> KEIN ZEICHEN
JR Z,ZERE ;ZERO-RETURN
CALL INCPOI ;LESEPOINTER + 1
LD (IX+71H),A ;UND SPEICHERN
INC A ;NZ SETZEN
LD A,(HL) ;ZEICHEN HOLEN
ZERE EI
RET
;;;;;;;;;;;;;;;;;;;;;;;;;
SNDNET: PUSH AF
CALL UEB16
POP AF
LD C,91H ;STATUS + STB + INT8000
JR INT2
;;;;;;;;;;;;;;;;;;;;;;;;;
SNDACK: LD A,ACK
LD C,91H
JR INT2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SNDDAT: LD C,90H ;STATUS OHNE INT.
JR INT2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LODDAT:
IN A,(P0BD)
BIT 5,A ;DATEN DA?
RET Z ;NEIN ZERO RETURN
IN A,(P0AD) ;JA --> NZ-RETURN
RET ;IN REG. A DATENBYTE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTP16: ;AUSGABE AN 16-BIT PORT
;ZEICHEN IN A
;STATUS IN REG. C
;OHNE INTERRUPT
LD HL,0FFFFH ;MAX. ZEIT
LD B,A
WTKP IN A,(P0BD) ;PORT FREI?
BIT 6,A
JR Z,DETI ;NEIN
LD A,B ;JA
OUT (P16A),A ;DATENBYTE-AUSGABE
XOR A
OUT (P16B),A
LD A,C ;STATUS UND
OR 80H ;STB-FLANKE OHNE INTERRUPT
OUT (P16B),A ;BEACHTE IM DI
RET ;OKAY --> NZ-RETURN
DETI DEC HL
LD A,H
OR L
JR NZ,WTKP
RET ;FEHLER --> Z-RETURN
;;;;;;;
WAITACK: ;WARTEN AUF ACK (FUER TEST - HARDWARE)
;ACK-CODE IN REG. C
LD HL,0FFFFH ;MAX. WARTEZEIT
WTL IN A,(P0BD)
BIT 5,A
JR Z,NXTIT ;KEIN ZEICHEN
AND 1FH ;STATUS FILTERN
CP C ;ACK VOM U8000
RET Z ;OKAY --> ZERO-RET
NZRET OR 0FFH
RET ;SONST --> NZ-RET
NXTIT DEC HL
LD A,H
OR L
JR NZ,WTL
JR NZRET
;;;;;;;;;;;;;;;;;;;;;;;;;
ISRPIO: PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
IN A,(P0BD) ;STATUS
BIT 5,A ;DATEN DA
JR Z,ISREND ;NEIN --> FEHLER
AND 16H ;STATUS HERAUSFILTERN
BIT 4,A
JR NZ,REQUEST ;REQUESTANFORDERUNG
RWQ LD B,A
IN A,(P0AD) ;PERIPHERIE-ADRESSE IN
LD C,A ;REG. C LADEN
LD A,B
CP 02H ;READ-STATUS ?
JR Z,READ ;JA
CP 04H ;WRITE-STATUS ?
JR NZ,ISREND ;NEIN --> INVALID STATUS
WRITE: IN A,(P0BD)
BIT 5,A ;DATEN DA ?
JR Z,WRITE ;NEIN --> WARTEN
LD B,A
IN A,(P0AD) ;DATENBYTE
OUT (C),A ;AUSGABE AN PERIPHERIE-ADR.
LD A,B
AND 16H
JR Z,ISREND ;ENDESTATUS
CP 04H ;WRITE-STATUS
JR Z,WRITE ;NAECHSTE DATENBYTE IST WIEDER FUER WRITE
;BEI JEDEM ANDEREN STATUS WIRD
WADA: IN A,(P0BD) ;AUF DATEN GEWARTET
BIT 5,A
JR Z,WADA
AND 16H ;STATUS FILTERN
JR RWQ ;READ ODER WRITE-REQUEST
READ: IN A,(C) ;EINGABE VON PERIPHERIE-ADR.
LD B,A
IN A,(P0BD) ;PORT-AUSGABE FREI ?
BIT 6,A
JR NZ,RQEND ;JA KEIN FLAG SETZEN
LD A,0FFH
LD (FLAG),A ;FLAG SETZEN, D.H. WERT WURDE UEBERSCHRIEBEN
RQEND: LD A,B
OUT (P16A),A ;DATENUEBERGABE
XOR A
OUT (P16B),A ;MIT STATUS 0
OR 80H
OUT (P16B),A ;STB-FLANKE OHNE INTERRUPT
WABH IN A,(P0BD)
BIT 6,A ;WARTEN BIS WERT ABGEHOLT WURDE
JR Z,WABH
ISREND: POP IX
POP HL
POP DE
POP BC
POP AF
EI
RETI
;-------
REQUEST:
LD HL,STATUS
CP 16H ;QUIT-STATUS
JR Z,RQT
CP 10H ;REMOTE-STATUS
JR Z,RRT
IN A,(P0AD)
JR ISREND
;QUIT-REQUEST
RQT: IN A,(P0AD)
CP 'R'
JR NZ,RQT1
SET 7,(HL)
RQT1: CP 'Q'
JR NZ,ISREND
SET 0,(HL)
JR ISREND
;REMOTE-STATUS
RRT: LD A,(RSTART)
OR A
JR NZ,RRTD
LD A,0FFH
LD (RSTART),A
IN A,(P0AD)
CP 'S'
JR NZ,LST
SET 1,(HL) ;SEND
JR REMST
LST CP 'L'
JR NZ,PST
SET 2,(HL) ;LOAD
JR REMST
PST CP 'P'
JR NZ,BRD
SET 3,(HL) ;PROM-PROGRAMMER
JR REMST
BRD INC HL ;BLOCK-REQUEST
CP 'R'
JR NZ,BWT
SET 0,(HL) ;READ
CALL RBLOCK
JR REMST
BWT CP 'W'
JR NZ,BFO
SET 1,(HL) ;WRITE
CALL WBLOCK
JR REMST
BFO: CP 'F'
JR NZ,BVY
SET 2,(HL) ;FORMAT
JR REMST
BVY: CP 'V'
JR NZ,BCP
SET 3,(HL) ;VERIFY
JR REMST
BCP: CP 'C'
JR NZ,NOREMST
SET 4,(HL) ;COPY DISK
JR REMST
NOREMST:
XOR A
LD (RSTART),A
REMST: JP ISREND
;REMOTE-DATEN
RRTD: LD IX,RECBUF
LD A,(IX+72H)
CALL INCPOI ;NEUEN POINTERWERT BERECHNEN
LD (IX+72H),A ;UND SPEICHERN
IN A,(P0AD)
LD (HL),A ;HL ZEIGT AUF PLATZ ZUM EINSCHREIBEN
JP ISREND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIO1 INTERRUPTS (EPROM-PROGR.)
;
ISP1KA:
PUSH HL ;KANAL A INT
LD HL,STAT2
SET 0,(HL)
POP HL
EI
RETI
ISP1KB:
PUSH HL ;KANAL B INT
LD HL,STAT2
SET 1,(HL)
POP HL
EI
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;
; SIO RECEIVE - INTERRUPTS
; ABLEGEN DER WERTE IN ENTSPR. RINGPUFFER
S0AR: PUSH BC ;SIO 0 KANAL A RECEIVE-INT.
PUSH IX
LD C,S0AC ;DATEN-ADR
LD IX,RB_S0A ;RINGPUFFER
JR RINT
S0BR: PUSH BC ;SIO 0 KANAL B RECEIVE-INT.
PUSH IX
LD C,S0BC ;DATEN-ADR.
LD IX,RB_S0B ;RINGPUFFER
JR RINT
S1AR: PUSH BC ;SIO 1 KANAL A RECEIVE-INT.
PUSH IX
LD C,S1AC ;DATEN-ADR.
LD IX,RB_S1A ;RINGPUFFER
JR RINT
S1BR: PUSH BC ;SIO 1 KANAL B RECEIVE-INT.
PUSH IX
LD C,S1BC ;DATEN-ADR.
LD IX,RB_S1B ;RINGPUFFER
RINT: PUSH AF ;GEMEINSAMER TEIL FUER ALLE
PUSH HL ;RECEIVE-INTERRUPTS
PUSH DE
RINT1: DEC C
IN B,(C) ;WERT EINLESEN
LD A,(IX+72H) ;SCHREIBPOINTER
CALL INCPOI ;NEUEN WERT BERECHNEN
LD (IX+72H),A ;UND SPEICHERN
LD (HL),B ;DATENBYTE IN RINGPUFFER
INC C ;SIO CONTROL-ADR.
IN A,(C) ;EINGABE RR0
BIT 0,A ;NOCH ZEICHEN DA
JR NZ,RINT1 ;JA
POP DE
POP HL
POP AF
POP IX
POP BC
EI
RETI
INCPOI:
LD D,0
LD E,A
PUSH IX
POP HL ;HL AUF WERT VON IX
INC A
CP 70H
JR NZ,INCP
XOR A
INCP ADD HL,DE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RESTLICHE SIO-INTERRUPTS: T_INT, E_INT, S_INT FUER ALLE KANAELE:
;
S0BT: PUSH BC
PUSH IX
LD C,S0BC ;SIO CONTROL-ADR.
LD IX,RB_S0B
JR TINT
S0AT: PUSH BC
PUSH IX
LD C,S0AC
LD IX,RB_S0A
JR TINT
S1BT: PUSH BC
PUSH IX
LD C,S1BC
LD IX,RB_S1B
JR TINT
S1AT: PUSH BC
PUSH IX
LD C,S1AC
LD IX,RB_S1A
TINT: PUSH AF
LD A,28H ;RESET T_INT
OUT (C),A
IN A,(C) ;EINGABE RR0
LD (IX+74H),A ;SPEICHERN
SET 0,(IX+73H) ;SET T_INT BIT
JR SIOINT
S0BE: PUSH BC
PUSH IX
LD C,S0BC
LD IX,RB_S0B
JR EINT
S0AE: PUSH BC
PUSH IX
LD C,S0AC
LD IX,RB_S0A
JR EINT
S1BE: PUSH BC
PUSH IX
LD C,S1BC
LD IX,RB_S1B
JR EINT
S1AE: PUSH BC
PUSH IX
LD C,S1AC
LD IX,RB_S1A
EINT: PUSH AF
IN A,(C) ;EINGABE RR0
LD (IX+74H),A ;SPEICHERN
LD A,10H
OUT (C),A ;RESET E_INT
SET 1,(IX+73H) ;SET E_INT BIT
JR SIOINT
S0BS: PUSH BC
PUSH IX
LD C,S0BC
LD IX,RB_S0B
JR SINT
S0AS: PUSH BC
PUSH IX
LD C,S0AC
LD IX,RB_S0A
JR SINT
S1BS: PUSH BC
PUSH IX
LD C,S1BC
LD IX,RB_S1B
JR SINT
S1AS: PUSH BC
PUSH IX
LD C,S1AC
LD IX,RB_S1A
SINT: PUSH AF
LD A,1
OUT (C),A
IN A,(C) ;EINGABE RR1
LD (IX+75H),A ;SPEICHERN
LD A,30H
OUT (C),A ;RESET S_INT
SET 2,(IX+73H) ;SET S_INT BIT
SIOINT: POP AF
POP IX
POP BC
EI
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;TEXTE:
MERR DEFB 23
DEFM 'U8000-Unit does not work'
DEFB 0DH
MTERR DEFB 29 ;LAENGE
DEFM 'Hardware Error in Connection'
DEFB 0DH
BASP DEFB 1
DEFB 08H
MMLDG DEFB 22
DEFM 'U8000-Softwaremonitor'
DEFB 0DH
KBC0R DEFB 0CFH
DEFB 7FH
DEFB 0B7H
DEFB 0FEH
;INT-TABELLEN-EINTRAEGE
SNEUTAB DEFW S0BT
DEFW S0BE
DEFW S0BR
DEFW S0BS
DEFW S0AT
DEFW S0AE
DEFW S0AR
DEFW S0AS
DEFW S1BT
DEFW S1BE
DEFW S1BR
DEFW S1BS
DEFW S1AT
DEFW S1AE
DEFW S1AR
DEFW S1AS
;BUFFER UND VARIABLEN
SAVE DEFS 32
SAVEPIO DEFS 4
;RINGPUFFER FUER ALLE SIO-INTERRUPTS
BUFFER:
RB_S0A DEFS 70H
DEFS 3 ;BUFLEN / BUFPOI / RECPOI
DEFS 1 ;FLAG FUER TES_INT'S
DEFS 2 ;RR0 / RR1 SPEICHER
RB_S0B DEFS 76H
RB_S1A DEFS 76H
RB_S1B DEFS 76H
FLAG DEFS 1 ;FUER KINB BEIM UEBERSCHREIBEN
;RINGPUFFER FUER UD
RECBUF DEFS 073H
STATUS DEFS 2
STAT2 DEFS 1
ERROR DEFS 1
RSTART DEFS 1
BUFEND: DEFS 0
;;;;;;;;;;;;;;;;;;;;
;KONSTANTEN:
ACK: EQU 06H
P16A EQU 10H ;AUSGABEPORT 1 (DATEN) AN U8000
P16B EQU 14H ;AUSGABEPORT 2 (RDY/STATUS/INT8000)
PIO0 EQU 0CH
P0AD EQU PIO0
P0AC EQU PIO0+1
P0BD EQU PIO0+2
P0BC EQU PIO0+3
S0AD EQU 24H
S0AC EQU S0AD+1
S0BD EQU S0AD+2
S0BC EQU S0AD+3
S1AD EQU 28H
S1AC EQU S1AD+1
S1BD EQU S1AD+2
S1BC EQU S1AD+3
;AUS PROM SATZ:
DSEL EQU 0EDDH
OUTAS EQU 0BF1H ;AUSGABE ZEICHENKETTE
IP0KB: EQU 0F12H
IP1KA: EQU 0F14H
IP1KB: EQU 0F16H
ITABS0 EQU 0F20H
IS1B1 EQU 0F20H