*H P8000 U880-FIRMWARE 3.0 ;****************************************************************************** ;* * ;* * ;* P8000 - SOFTWARE * ;* * ;* Entwicklerdokumentation * ;* * ;* Betriebssystem UDOS * ;* * ;* Programm: K.MON8 * ;* * ;* Version: 3.1 * ;* * ;* Bearbeiter: U. Oefler, M. Weber * ;* * ;* Datum: 05.07.1989 * ;* * ;* * ;****************************************************************************** ; ;************************************************************** ; ; P8000 KOPPELSOFTWARE ; GRUNDMODUL ; VERSION: 3.0 ; ;************************************************************** ;GLOBAL SAVE S0BT ;GLOBAL ERROR UEB16 ;GLOBAL LODNET SNDNET WAIT STATUS WAITACK ;GLOBAL LODDAT SNDDAT SNDACK ;EXTERNAL LOAD SEND ;EXTERNAL ACTFLG ;EXTERNAL BLKRD BLKWT BLKFO ;EXTERNAL RBLOCK WBLOCK ORG 0F000H ; KOPSO LD BC,LETZT-KOPSO LD DE,0F000H LD HL,0DB00H LDIR JP ENTRY ENTRY: ; Ausschalten von EPROM und Einschalten von RAM LD BC,0D000H LD A,4 OUT (C),A POP AF ; ZERO-Flag zurueck von der Abfrage JR NZ,NURX XOR A OUT (P0BD),A ;START U8000 LD B,80H DJNZ $ LD A,80H OUT (P0BD),A ;RESET-U8000 HIGH (FUER ZUSATZ) LD B,80H DJNZ $ XOR A OUT (P0BD),A ;START U8000 (ENDGUELTIG) JP DEBUG NURX DI ANF1 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 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 ! 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 OUT (P0BD),A;RESET U8000 (FUER ZUSATZ) LD B,80H DJNZ $ XOR A OUT (P0BD),A;START U8000 (ENDGUELTIG) ; Die folgenden acht Programmzeilen sind am 13.12.1988 ; zusaetzlich aufgenommen worden, damit keine Fehler ; im Eigentest entstehen. IN A,(P0BD) BIT 6,A JR Z,HWTEST 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 ; engueltige Programmierung des Koppel-PIO's mit Interrupt LD HL,KBC0R LD C,P0BC LD B,4 OTIR LD A,1 ;KENNZEICHEN DAS VON PROM 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 LD (IP1KB),HL EI LOOP: CALL UEB16 ;TEST OB INT-WERTE VON SIO'S ANLIEGEN LD HL,STATUS LD A,(HL) OR A JR Z,LOOP BIT 0,A JR NZ,QUIT BIT 7,A JR Z,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 OUT (S0BC),A LD A,1CH OUT (S0BC),A LD HL,SAVE ;ALTE ISR-WERTE SIO 0 KANAL B LD DE,ITABS0 ;ZURUECKSPEICHERN LD BC,32 LDIR LD A,3 OUT (P0BC),A ;PIO-INT AUS EI JP DEBUG ;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 BIT 0,(HL) JR Z,P1KB RES 0,(HL) LD A,0 LD C,8BH JR INT2 P1KB BIT 1,(HL) JR Z,EXIT RES 1,(HL) LD A,0 LD C,0ABH 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 ;;;;;;;;;;;;;;;;;;;;;;;;; SNDACK: LD A,ACK LD C,91H JR INT2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 IN A,(P0AD) JR ISREND ;QUIT-REQUEST RQT: IN A,(P0AD) CP 'R' JR NZ,RQT1 SET 7,(HL) JR ISREND RQT1: CP 'Q' JR NZ,ISREND SET 0,(HL) JR ISREND ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PIO1 INTERRUPTS (EPROM-PROGRAMMER) ; ISP1KA PUSH HL LD HL,STAT2 SET 0,(HL) POP HL EI RETI ISP1KB PUSH HL 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 25 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 LETZT ;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 STATUS DEFS 2 STAT2 DEFS 1 ERROR 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 DEBUG EQU 0BFAH IP0KB: EQU 0F12H IP1KA EQU 0F14H IP1KB EQU 0F16H ITABS0 EQU 0F20H IS1B1 EQU 0F20H