P8000/firmware/MON8/U880SM.S

1638 lines
29 KiB
ArmAsm

*H P8000 U880-FIRMWARE 3.0
*P 84
;******************************************************************************
;* *
;* *
;* P8000 - SOFTWARE *
;* *
;* Entwicklerdokumentation *
;* *
;* Betriebssystem UDOS *
;* *
;* Programm: U880SM *
;* *
;* Version: 3.1 *
;* *
;* Bearbeiter: M. Weber *
;* *
;* Datum: 05.07.1989 *
;* *
;* *
;******************************************************************************
;
;
;********************************************************
;* *
;* P8000 U880-SOFTWAREMONITOR *
;* *
;********************************************************
;
;
;
ENTRY
;
JR INIGO0
DEFM '(C)EAW'
;
RST1 DEFS 3
;
DEFM '8801 '
;
RST2 DEFS 3
INIGO0
LD A,NRET
JR GO01
DEFS 1
;
;
RST3 DEFS 3
GO01
LD (DSEL),A
JR GO02
;
;
RST4 DEFS 3
GO02
LD HL,DPAVEC
JR GO03
;
;
RST5 DEFS 3
GO03
LD B,FDCONF-DPAVEC
JP GO04
;
;
RST6 DEFS 8
;
;
;EINTRITTSPUNKT FUER TESTROUTINEN
BRKENTRY:
;
LD (HL_),HL
EX (SP),HL ;HL:=PC+1
DEC HL ;HL:=PC
INC SP ;RST AUSGLEICHEN
INC SP
NMIBRK
LD (SP_),SP
LD SP,SP_
PUSH HL
PUSH IY
PUSH IX
EXX
EX AF,AF'
PUSH HL
PUSH DE
PUSH BC
PUSH AF
EXX
EX AF,AF'
PUSH DE
PUSH BC
PUSH AF
;
LD A,I
PUSH AF ;INT.-VEKTOR + INT.ENABLE FLIP-FLOP
;
XOR A ;ZERO --> 1
LD SP,STACK
CALL BREAK ;BREAKPOINT LOESCHEN
LD HL,BRKLOP
PUSH HL
RETI
;
;EINTRITTSPUNKT FUER NMI
NMIENTRY
LD (HL_),HL
LD HL,NMIBRK
EX (SP),HL
RETN
;
GO04
;
LOP01: LD (HL),0 ;RAM LOESCHEN DPAVEK - INVEK
INC HL
DJNZ LOP01
;
;
;
; Initialisierung von Zellen fuer die Terminalarbeit
;
LD A,10H
LD (MCSQ),A
LD A,0E0H
LD (APEIN),A
LD (APAUS),A
;
; INITIALISIERUNG DER ISR-TABELLE FUER DEN SIO
;
LD HL,SIOTAB
LD DE,ITABS0+2
LD BC,6
LDIR
;INITIALISIERUNG DER KOPPELSCHNITTSTELLE
LD HL,KBC0 ;PORT B: BIT-MODE
LD C,P0BC
LD B,3
OTIR
LD A,80H
OUT (P0BD),A ;RESET U8000 HIGH
;VARIABLEN BLOCKTRANSFER
LD HL,BASVAR
LD DE,NULLCT
LD BC,CURT0-NULLCT
LDIR
BRKLOP:
LD SP,STACK
LD A,ITABC0.SHR.8 ;A:= HIGH ADRESSE DES INT. VEKTORS
;
ENTRY1
LD I,A
IM 2
EI
;
JP PE,SYSST
;
;RESTLICHES VARIABLENFELD INITIALISIEREN
;HL ZEIGT BEI NEUSTART AUF CURT0
EX DE,HL
LD B,10 ;FLOPPY-LISTE UND MZNEXT
ILOOP1 LD (HL),-1
INC HL
DJNZ ILOOP1
;
LD B,4 ;ADRFLG UND TASTATURMERKZELLEN
ILOOP2 LD (HL),0
INC HL
DJNZ ILOOP2
LD (HL),0FBH ;ENABLE INT
INC HL
LD (HL),0C3H ;JUMP EINTRAGEN
;STACKPOINTER FUER DEBUG INITIALISIEREN
LD HL,STACK
LD (SP_),HL
;
*I FDINIT.S
;
RASC LD HL,CONOBF ;OUTPTR INITIALISIEREN
LD (OUTPTR),HL
CALL INASC
CP CR
JP NZ,BDEC0
;
LD A,(FDCONF)
LD (MFDC),A
;BOOT EINLESEN
BOOT: LD IY,DPAVEC ;STANDARD PARAMETERVEKTOR AUFBAUEN
LD HL,KOMINT ;DATA TRANSFER ADRESS
LD (DPAVEC+2),HL
LD HL,138 ;DATA LENGTH LADEN
LD (DPAVEC+4),HL
;
LD A,80H
LD (DSEL),A
LD HL,0000
LD (CRCERR),HL
LD (TRKERR),HL
LD (SECERR),HL
LD (DPAVEC+11),HL
LD (IY+1),RDBIN ;REQUEST CODE LADEN
CALL DISK ;DISKETTENZUGRIFF
LD A,(IY+10)
CP NRET ;NORMAL RETURN ?
JP Z,TESTSD ;TESTEN SYSTEMDISKETTE
;
CP 0C2H
JR Z,BOOTER ;DRIVE NOT READY
;
LD HL,FDCONF
INC (HL)
LD A,(HL)
CP 8
JR C,BOOT
;
;
BOOTER
LD A,(MFDC)
LD (FDCONF),A ;ALTEN WERT ZURUECKHOLEN
LD SP,STACK
LD A,'>'
LD (PROMPT),A
LD HL,TDERR ;TEXT "DISK ERROR"
CALL OUTAS ;AUSGABE ASC-ZEICHEN UEBER PCON
JP RASC
;
; Test, ob wirklich eine Systemdiskette im Laufwerk 0 ist
; Pruefen der Kennzeichnung 'P8000SYS'
;
TESTSD
LD HL,KENNSD
LD DE,0C80H
LD BC,8
NWSYS LD A,(DE)
CPI
JR NZ,AUSISD
INC DE
JP PE,NWSYS
LD HL,(0C7EH) ;FDCONF von Diskette holen
LD (FDCONF),HL
JP KOMINT
AUSISD LD SP,STACK
LD HL,SDERR
CALL OUTAS
JP RASC
;
;
SYSST
LD A,0FBH ;EI ZURUECKSSCHREIBEN
LD (GOJMP),A
LD A,(INT) ;INT.ENABLE FLIP-FLOP RETTEN
AND 4
CALL INSTA2
LD A,(BRKFLG)
BIT 7,A
JR Z,SYSST1
LD HL,(BRKRET)
JP (HL)
;
SYSST1:
LD A,(MZNEXT)
AND A
JR NZ,TBAUS
CALL OUTRW
LD A,(EIINS)
LD HL,(EIADR)
LD (HL),A
NEXTE: LD HL,N_
DEC (HL)
JP NZ,NEXLOP
JP DEBUG
TBAUS:
LD HL,TBREA
CALL OUTAS
LD HL,(PC_)
CALL BTOHA
CALL OUTZL ;AUSG: 'BREAK XXXX'
;
;BEFEHLSDECODIERUNG EINGABEKOMMANDOS
BDEC: CALL INASC ;EINGABE ASC- ZEICHEN UEBER PCON
BDEC0: LD HL,DEBUG
PUSH HL
CP CR ;CARRIAGE RETURN
LD HL,MZNEXT
JR NZ,BDEC1
AND (HL)
JR NZ,ERROR
JP NEXNL
;
BDEC1
LD (HL),-1 ;RESET MZNEXT
LD HL,(INPTR)
RES 5,A
CP 'F' ;FILL ?
JP Z,FILL
CP 'G' ;GO ODER GET ?
JP Z,GOGET
CP 'M' ;MOVE ?
JP Z,MOVE
;CP 'I'
;JP Z,INSTAT ;INT-STATUS
CP 'D' ;DISPLAY ?
JP Z,DISPL
CP 'P' ;I/O-PORT
JP Z,IOPORT
CP 'O' ;OPERATING SYSTEM ?
JR NZ,BDEC2
POP HL ;SP ZURUECKSTELLEN
JP BOOT
BDEC2: CP 'R' ;REGISTER ?
JP Z,REGIST
CP 'Q' ;QUIT ?
JR NZ,BDEC3
CALL NSIGN
LD HL,BRKFLG
BIT 5,(HL)
JR Z,ERROR
LD HL,(EXTRET)
JP (HL)
;
BDEC3: CP 'S' ;SAVE ?
JP Z,BOOT
CP 'B' ;BREAK ?
JP Z,BREAK
CP 'N' ;NEXT
JR Z,NEXT
CP 'X'
JR Z,U8000SM
CP 'T'
JR Z,EIGT
ERROR: LD SP,STACK
LD HL,FRAGZ ;FRAGEZEICHEN AUSGEBEN
CALL OUTAS ;AUSGABE ASC-ZEICHEN UEBER PCON
;********************************************************
;* *
;* DEBUG-EINTRITTSPUNKT *
;* *
;********************************************************
DEBUG: LD A,'>' ;PROMPT MIT '>' LADEN
LD (PROMPT),A
LD HL,BRKFLG
BIT 6,(HL)
RES 6,(HL)
JP Z,BDEC
LD HL,(EXTRET)
JP (HL)
;
;
U8000SM
CALL NSIGN
RES 5,A
CP 'R'
PUSH AF
LD A,1
LD C,0
LD B,0D0H
OUT (C),A
JP 0DB00H
EIGT
LD A,20H
CALL PUTA
CALL PUTA
EIGT1 IN A,(S0BC)
BIT 2,A
JR Z,EIGT1
LD A,1
LD C,0
LD B,0C0H
OUT (C),A
JP 0CEF0H
;********************************************************
;* *
;* NEXT *
;* *
;********************************************************
;
NEXT:
CALL OUTRB
CALL INHZ
JR NZ,NEXT1
NEXNL: LD A,1 ;KEINE ZAEHLEREINGABE
NEXT1:
LD (N_),A ;DURCHLAUFZAEHLER
NEXLOP
DI
SUB A
LD (MZNEXT),A
LD (GOJMP),A ;EI VOR "GO" ABSPRUNG LOESCHEN
LD DE,(PC_)
DEC DE ;PC:=N-1 WEGEN EI EINTRAG
LD HL,TRCINT
LD (ITABC0+4),HL ;STARTADRESSE IN DIE ISR TABELLE LADEN
LD A,ITABC0.SHR.8 ;A:= HIGH ADRESSE DES INT. VEKTORS
LD (I_),A
LD A,87H ;CTC ALS TIMER PROGRAMMIEREN
OUT (CTC0+2),A
LD A,1 ;ZEITKONSTANTE
OUT (CTC0+2),A
EX DE,HL
LD (EIADR),HL
LD A,(HL)
LD (EIINS),A
LD (HL),0FBH ;EI LADEN
LD (PC_),HL
JP REALT
;
;
;NEXT INTERRUPT SERVICE ROUTINE LADEN
TRCINT:
LD (HL_),HL
PUSH AF
LD A,3
OUT (CTC0+2),A ;CTC STOPPEN
POP AF
LD HL,NMIBRK
EX (SP),HL
RETI
;********************************************************
;* *
;* BREAK *
;* *
;********************************************************
BREAK:
AND A
PUSH AF
LD HL,(BRKADR) ;BREAKPOINT N-1 LOESCHEN
XOR A
CP L
JR NZ,BREAK2
CP H
JR Z,BREAK1
BREAK2 LD A,(INS)
LD (HL),A
BREAK1 POP AF
LD A,(INS)
LD HL,0
LD (BRKADR),HL
RET Z ;RUECKSPRUNG WENN AUFRUF AUS
;DER REGISTERRETTUNGSROUTINE
CALL INHZAD ;NEUE BREAKPOINTADRESSE LESEN
RET Z ;KEINE ADRESSE--> NUR LOESCHEN
LD A,(HL)
LD (INS),A ;BYTE RETTEN
LD (HL),-1 ;NEUEN BREAKPOINT SETZEN
LD (BRKADR),HL
RET
;
;********************************************************
;* *
;* INT-STATUS *
;* *
;********************************************************
;INSTAT
;LD HL,GOJMP
;SUB A
;BIT 3,(HL)
;JR Z,INSTA1
;INC A
;INSTA1
;CALL BTOHD
;CALL OUTBYT
;CALL INBYT
;RET Z
INSTA2:
LD HL,GOJMP
RES 3,(HL) ;F3H-->DISABLE INT.
AND A
RET Z
SET 3,(HL) ;FBH-->ENABLE INT.
RET
;********************************************************
;* *
;* I/O-PORT *
;* *
;********************************************************
IOPORT
CALL NSIGN
CP 'R'
JR Z,IOREAD
CP 'W'
JP NZ,ERROR
;
IOWRITE
CALL INHZ ;ADRESSE
IOERR JP Z,ERROR
PUSH HL
CALL INHZ ;DATENBYTE
POP BC
JR Z,IOERR
OUT (C),A
RET
;
IOREAD
CALL INHZ ;ADRESSE
PUSH HL
POP BC
IN A,(C)
CALL BTOHD
CALL OUTZL
RET
;********************************************************
;* *
;* DISPLAY *
;* *
;********************************************************
DISPL: CALL INHZAD
PUSH HL
CALL INHZ
JR Z,DISP6
LD B,H
LD C,L
POP HL
EXX
;
;CONOBF LOESCHEN
DISP0: LD HL,CONOBF ;BLOCKTRANSFER
LD DE,CONOBF+1
LD BC,49H
LD (HL),' '
LDIR
;
LD B,10H
LD HL,CONOBF+53
LD (HL),'*'
INC HL
EXX
CALL INHZS ;ADRESSE-XXXXH UEBER OUTPTR EINTRAGEN
DISP1: LD A,(HL)
EXX
LD (HL),A
CP ' ' ;SPACE
JR C,DISP2
CP 127 ;128 ZEICHEN AUSGEGEBEN ?
JR C,DISP3
DISP2: LD (HL),'.' ;PUNKT EINTRAGEN
DISP3: INC HL
LD (HL),'*'
EXX
CALL BTOHD ;DATEN EINTAGEN
CPI
JP PE,DISP4 ;SPRUNG WENN KEINE ANZAHL EINGEGEBEN
EXX
INC HL
LD (OUTPTR),HL
JP OUTZL ;AUSGABE DER ZEILE
;
;
DISP4: EXX
DJNZ DISP5
INC HL
LD (OUTPTR),HL
CALL OUTZL
JR DISP0 ;NAECHSTE ZEILE AUSGEBEN
DISP5: EXX
JR DISP1
DISP6: POP HL
DISP7: PUSH HL
CALL INHZS
LD A,(HL)
CALL BTOHD
CALL OUTBYT
LD A,':'
CALL PUTA
CALL INBYT
JR Z,DISP8
POP HL
LD (HL),A
PUSH HL
CALL SSIGK
DISP8: POP HL
CP 'Q' ;QUIT
RET Z
;RUECKWAERTS EINTRAGEN ?
CP '^'
JR NZ,DISP9
DEC HL
JR DISP7
;
DISP9
INC HL
JR DISP7
;********************************************************
;* *
;* FILL *
;* *
;********************************************************
FILL: CALL INHZAD ;ANFANGS-ADRESSE EINLESEN
JR Z,FILERR
PUSH HL
CALL INHZAD ;END-ADRESSE EINLESEN
FILERR: JP Z,ERROR
PUSH HL
CALL INHZ ;KONSTANTE EINLESEN
LD A,L
AND A
POP HL
POP DE
LD (DE),A
SBC HL,DE
RET Z
;
LD B,H ;BLOCKTRANSFER
LD C,L
LD H,D
LD L,E
INC DE
LDIR
RET
;
GOGET: CALL NSIGN ;NAECHSTES ZEICHEN EINLESEN
CP 'E'
JP Z,BOOT ;JP WENN GET
CALL INHZ
JR Z,GO
LD (PC_),HL
;
;********************************************************
;* *
;* GO *
;* *
;********************************************************
GO
REALT
LD SP,AF_
POP AF ;REGISTER RUECKSPEICHERN
POP BC
POP DE
EX AF,AF'
EXX
POP AF
POP BC
POP DE
POP HL
POP IX
POP IY
EXX
EX AF,AF'
POP HL ;PC RUECKSPEICHERN
LD (GOJMP+2),HL
LD HL,(HL_) ;HL RUECKSPEICHERN
LD SP,(SP_) ;SP RUECKSPEICHERN
JP GOJMP ;SPRUNG IN DEN RAM
;
;DANN FOLGT UEBER DIE BEFEHLE: EI ODER DI;A;JP (PC_)
;DER BEGINN DER ABARBEITUNG DES USER PROGRAMMS
;
;
;********************************************************
;* *
;* MOVE *
;* *
;********************************************************
;
MOVE: CALL INHZAD ;ZIELADRESSE EINLESEN
PUSH HL
CALL INHZAD ;QUELLADRESSE EINLESEN
PUSH HL
CALL INHZ ;BYTEZAHL EINLESEN
JP Z,ERROR ;ERROR ANSPRUNG
LD B,H
LD C,L
POP DE
POP HL
PUSH HL
AND A
SBC HL,DE
POP HL
JR C,MOVE1
LDIR
RET
;
;
MOVE1: ADD HL,BC
DEC HL
EX DE,HL
ADD HL,BC
DEC HL
EX DE,HL
LDDR
RET
;********************************************************
;* *
;* REGISTER *
;* *
;********************************************************
;
REGIST CALL SSIGN
LD A,CR
LD D,(HL) ;REGISTERBEZEICHNUNG LADEN
CP D
JR Z,ALLREG
INC HL
LD E,(HL)
CP E
JR NZ,REG16 ;16 BIT REGISTER AUSGEBEN
LD E,' '
REG16 CALL REGADR
DEC HL
DEC HL
JP NZ,ERROR
REGLOP LD DE,CONOBF
LDI
LDI
PUSH HL
EX DE,HL
LD (HL),' '
INC HL
LD (OUTPTR),HL
LD E,(IX+0)
LD D,HL_.SHR.8
LD A,HLS_+1.AND.0FFH
SUB E
JR C,REGOUT
;
LD A,(DE)
CALL BTOHD
CALL OUTBYT
LD A,':'
CALL PUTA
CALL INBYT
JR Z,REGEND
LD (DE),A
CALL SSIGK
REGEND: CP 'Q' ;QUIT ?
POP HL
RET Z
;
INC IX
LD A,LADRRB-1.AND.0FFH
SUB L
JR NC,REGLOP
RET
;
;
REGOUT: LD A,(DE)
LD L,A
INC DE
LD A,(DE)
LD H,A
PUSH DE
CALL BTOHA
CALL OUTBYT
LD A,':'
CALL PUTA
CALL INBYT
POP DE
JR Z,REGEND
EX DE,HL
LD (HL),D
DEC HL
LD (HL),E
CALL SSIGK
JR REGEND
;
;ALLE REGISTER AUSGEBEN
ALLREG: CALL OUTRB ;AUSGABE REGISTERBEZEICHNUNGEN
CALL OUTRW ;AUSGABE REGISTERWERTE
RET
;
;
;
;********************************************************
;* *
;* UNTERPROGRAMME *
;* *
;********************************************************
INHZS: PUSH HL ;ADRESSENUMSCHALTUNG MONITOR-->USER
LD DE,0
AND A ;CARRY=0
SBC HL,DE ;1000H ODER 0 SUBTRAHIEREN
CALL BTOHA ;KONVERTIERT EINE ADRESSE IN DAS
POP HL ;HEXA-SYSTEM
RET
;
;
;AUSGABE DER REGISTERBEZEICHNUNGEN AUF RAM-BEREICH
OUTRB: LD DE,CONOBF ;AUSGABE:A,B,C,D,E,F,H,L,I UND STRICHREG.
LD HL,REGBEZ
LD B,11H
LD A,' '
OUTB1: LD C,0FFH
LDI ;REGISTERBEZ.-->(DE)
LDI ;SPACE-->(DE)
LD (DE),A ;SPACE--> (DE)
INC DE
DJNZ OUTB1
;
LD B,4 ;AUSGABE:IX,IY,PC UND SP
OUTB2: LD C,0FFH
LD (DE),A
INC DE
LDI
LDI
LD (DE),A
INC DE
LD (DE),A
INC DE
DJNZ OUTB2
;
LD (OUTPTR),DE ;LETZTE ADR DER ZEICHENKETTE RETTEN
JR OUTW3
;
;*********************************************************************
;AUSGABE DER REGISTERWERTE AUF RAM-BEREICH
OUTRW: LD B,17 ;ZAEHLER HL_,I_,AF_,BC_ ...
LD IX,LADRRB
LD D,HL_.SHR.8
OUTW1: LD E,(IX+0) ;DE ZEIGT AUF REGISTERRETTUNGSBEREICH
LD A,(DE)
CALL BTOHD
INC IX
DJNZ OUTW1
LD B,4 ;ZAEHLER IX_,IY_,PC_,SP_
OUTW2: LD E,(IX+0)
EX DE,HL
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
CALL BTOHA
INC IX
DJNZ OUTW2
;
OUTW3: JP OUTZL ;AUSGABE EINER ZEILE
;
;*********************************************************************
;STANDARD PARAMETERVEKTOR FUER PCON INITIALISIEREN
;ASC-ZEICHEN EINLESEN
INASC: LD IY,CONIV ;CONIVC-->CONSOLE INPUT VECTOR
LD HL,CONIBF ;DATA TRANSFERADRESS LADEN
LD (CONIV+2),HL
LD (INPTR),HL
LD HL,0FFH ;DATA LENGTH LADEN
LD (CONIV+4),HL
LD (IY+1),RDASC ;REQUEST CODE LADEN
CALL PCON ;AUGABE AUF TERMINAL
LD A,(CONIBF) ;A:=ASC-ZEICHEN
RET
;*********************************************************************
;
;SUCHT NAECHSTES ZEICHEN=/SPACE & KLEINBUCHSTABEN RUECKSETZEN
;
SSIGK: CALL SSIGN
RES 5,A
RET
;
;
;*********************************************************************
;NAECHSTES ZEICHEN EINLESEN
NSIGN: INC HL
LD A,(HL)
RES 5,A ;KLEINBUCHSTABEN RUECKSETZEN
RET
;
;SUCHT NAECHSTES ZEICHEN=/SPACE
;
SSIGN: LD HL,(INPTR) ;ADR.DER PARAMETERLISTE
SSIG1: LD A,(HL) ;ASCII-ZEICHEN EINLESEN
CP ' '
JR NZ,SSIG4
;
SSIG2: INC HL
LD A,(HL)
CP ' '
JR Z,SSIG2 ;SPACE UEBERGEHEN
;
SSIG3: LD (INPTR),HL ;INPTR ZEIGT AUF 1.ZEICHEN=/SPACE
RET
;
SSIG4: CP CR ;CARRIAGE RETURN
JR Z,SSIG3
INC HL
JR SSIG1
;
;************************************************************************
;EINLESEN VON HEXA-DEZIMALZAHLEN
;OUTPUT:BIN-ZAHL IN HL
;
INHZ: LD HL,0
PUSH HL
ADD HL,SP ;HL:=SP
EX DE,HL ;DE:=SP
CALL SSIGN
CP CR ;CARRIAGE RETURN
EX DE,HL
JR NZ,INHZ1
;
POP HL
LD A,L
RET
;
INHZ1: CP 30H ;0
KERRO: JP C,ERROR ;SPRUNG WENN SONDERZEICHEN
INHZ3: CP 40H ;ZAHLEN ODER BUCHSTABEN
JR C,INHZ4 ;SPRUNG WENN ZAHLEN 0....9
RES 5,A
INHZ4: CALL HTOB ;BIN-ZAHL IN L-TETRADE VON A
RLD
INC HL
JPGET1: RLD ;EINSPRUNG AUS GET AUF 2.BYTE
DEC HL
INC DE ;INPTR:=INPTR+1
LD A,(DE) ;NAECHSTES ASCII-ZEICHEN EINLESEN
CP 30H ;SPRUNG WENN HEXA-ZEICHEN
JR NC,INHZ3
;
;
POP HL ;SPACE GELESEN !
LD A,L
RET
;
;************************************************************************
;KONVERTIERT EINE HEXA-ZAHL INEINE 4 BIT-ZAHL
;
HTOB: CP 3AH ;TEST: ZAHLEN VON 0....9
JR C,HTOB1
CP 'A' ;TEST: BUCHSTABEN VON A....F
JR C,KERRO ;SPRUNG WENN FEHLER-->KEIN HEXA-ZEICHEN
CP 'G' ;TEST: ASCII-ZEICHEN > 'G' -->KEINE
JP NC,ERROR ;HEXA-ZEICHEN
SUB 7
HTOB1: AND 0FH
RET
;
;*********************************************************************
;BTOHA:KONVERTIERT 2 DURCH(OUTPTR) ADRESSIERTE RAM-PLAETZE (ADRESSEN)
;IN DAS HEXADEZIMALSYSTEM
;INPUT:BIN-ZAHL IN HL
BTOHA: PUSH DE
LD A,H
CALL BTOHD
LD DE,(OUTPTR) ;OUTPTR LADEN
DEC DE ;SPACE EINTRAGUNG IN BTOHD RUECKSETZEN
LD (OUTPTR),DE
POP DE
LD A,L
;
BTOHD: PUSH HL
LD HL,(OUTPTR)
CALL BTOHE
INC HL
LD (HL),' '
INC HL
LD (OUTPTR),HL
POP HL
RET
;
;*********************************************************************
;BTOHEX: KONVERTIERT EINE 8-BIT BIN-ZAHL IN EINE HEXA-ZAHL
BTOHE: PUSH AF
RRA
RRA
RRA
RRA
CALL HBTHE ;KONVERTIERT DIE 4 HOEHERWERTIGEN BITS
INC HL
POP AF
CALL HBTHE ;KONVERTIERT DIE 4 NIEDERWERTIGEN BITS
RET
;
;********************************************************************
;HBTHEX: KONVERTIERT EINE 4-BIT BIN-ZAHL IN EIN HEXA-ASCII-ZEICHEN
HBTHE: AND 0FH
CP 10 ;DEZIMALZEICHEN ?
JR C,HB10
ADD A,7
HB10: ADD A,30H
LD (HL),A ;ZEICHEN IN RAM-BEREICH LADEN
RET
;
;*********************************************************************
REGADR: LD IX,LADRRB
LD A,D
LD BC,2AH
LD HL,REGBEZ ;REGISTERBEZEICHNUNGEN
REGAD0: CPI
JR Z,REGAD2
CPI
;EINSPRUNG AUS GET AUF REGAD1
JPGET2
REGAD1: RET PO
INC IX
JR REGAD0
;
REGAD2: LD A,E
CP 2FH
JR C,REGAD3
RES 5,A
REGAD3: CPI
RET Z
LD A,D
JR REGAD1
;
INBYT: LD A,' '
LD (PROMPT),A
CALL INASC ;EINGABE ASC-ZEICHEN UEBER PCON
RES 5,A
CP 'Q' ;QUIT ?
RET Z
CP '^'
RET Z ;ADRESSE BEI DISP ZURUECKSTELLEN
LD HL,CONIBF-1
LD (HL),' '
LD (INPTR),HL
PUSH DE
CALL INHZ
POP DE
RET
;
;
;AUSGABE EINER ZEILE
OUTZL: LD A,85H ;ZEILENLAENGE LADEN
OUTZV: PUSH HL ;EINSPRUNG FUER AUSGABE MIT
;VARIABLER ZEILENLAENGE
LD HL,(OUTPTR)
LD (HL),CR ;CARRIAGE RETURN AN ZEICHENKETTE ANFUEGEN
LD HL,CONOBF ;BEGINN DER ZEICHENKETTE IM RAM (CONOBV)
LD (OUTPTR),HL ;OUTPTR INITIALISIEREN
DEC HL
OUTZ: LD (HL),A
CALL OUTAS ;AUSGABE ASC-ZEICHEN UEBER PCON
POP HL
RET
;
;*********************************************************************
;
OUTBYT: PUSH HL
PUSH DE
LD HL,(OUTPTR)
LD DE,CONOBF ;BEGINN DER ZEICHENKETTE IM RAM
LD (OUTPTR),DE
AND A
SBC HL,DE ;ANZAHL DER AUSZUGEBENDEN ZEICHEN
EX DE,HL
DEC HL
LD (HL),E
CALL OUTAS
POP DE
POP HL
RET
;
;********************************************************************
;MOEGLICHKEIT ZUR ADRESSVERSCHIEBUNG
;ADRESSE:=ADRESSE+(ADRFLG)
;
INHZAD: CALL INHZ
LD DE,0
ADD HL,DE
RET
;
;*********************************************************************
;STANDARD PARAMETERVEKTOR FUER PCON INITIALISIEREN
;ASC-ZEICHEN AUSGEBEN
OUTAS: LD IY,CONOV ;IY:=CONOVC
LD A,(HL) ;A:=DATA LENGTH
INC HL
LD (CONOV+2),HL
LD (IY+4),A ;DATA LENGTH LADEN
LD (IY+5),0
LD (IY+1),WRASC
;********************************************************
;* *
;* PROM CONSOLTREIBER *
;* *
;********************************************************
PCON: PUSH DE
PUSH BC
LD A,(IY+1) ;REQUEST CODE LADEN
RES 0,A
CP RDBIN
JR NC,PCO2 ;TEST UNTERE GRENZE REQUEST CODE
PCO0: LD (IY+10),NRET ;COMPLETION CODE LADEN
PCO4: POP BC
POP DE
BIT 6,(IY+10)
JR Z,PCO1 ;JMPIF VALID OPERATION REQUEST CODE
PCONOUT
LD H,(IY+9) ;ERROR RETURN ADRESS LADEN
LD L,(IY+8)
LD A,H
OR L
JR Z,PCO1 ;JMP IF ERROR RETURN ADRESS =0
JP (HL) ;JMP TO ERROR DOKUMENTATION
;
PCONEND
PCO1
BIT 0,(IY+1) ;REQUEST CODE INCREASED ?
RET Z ;RUECKSPRUNG
LD H,(IY+7) ;HL:= COMPLETION RETURN ADRESS
LD L,(IY+6)
JP (HL)
;
;
PCO2: CP 11H ;TEST OBERE GRENZE REQUEST CODE
JR C,PCO3
LD (IY+10),0C1H ;INVALID OPERATION REQUEST
JR PCO4
;
PCO3: LD H,A ;H:=REQUEST CODE
LD A,(IY+4)
OR (IY+5) ;DATA LENGTH=0 ?
JR Z,PCO0
LD A,H ;A:=REQUEST CODE
LD H,(IY+3) ;HL:=DATA TRANSFER ADRESS
LD L,(IY+2)
LD B,(IY+5) ;BC:=DATA LENGTH
LD C,(IY+4)
CP WRBIN
JR C,PCO5 ;JMP IF RDASC OR RDBIN
JR Z,PCWBIN ;JMP IF WRBIN
;************************************************
;* *
;* WRITE-ASCII *
;* *
;************************************************
;
PCWASC: LD A,(HL)
CALL PUTA ;AUSGABE EINES ZEICHENS
INC HL
DEC BC ;DATA LENGTH -1
CP CR
JR Z,PCNL ;NL AUSGEBEN
;
LD A,C
OR B
JR NZ,PCWASC
PCO10: LD H,(IY+5) ;HL:=DATA LENGTH
LD L,(IY+4)
SBC HL,BC
LD (IY+5),H
LD (IY+4),L
JR PCO0
;
;CARRIAGE RETURN UND (NULLCT) X LINEFEED AUSGEBEN
PCNL: PUSH BC
LD A,LF
CALL PUTA ;LINEFEED AUSGEBEN
LD A,(NULLCT)
AND A
JR Z,PCO8
LD B,A
SUB A
PCLF: CALL PUTA ;LINEFEED'S :=(NULLCT) AUSGEBEN
DJNZ PCLF
;
;
PCO8: POP BC
JR PCO10
;************************************************
;* *
;* WRITE-BINARY *
;* *
;************************************************
PCWBIN: LD A,(HL)
CALL PUTA
CPI
JP PE,PCWBIN
JR PCO10
PCO5: CP RDBIN
JR NZ,PCRASC
;************************************************
;* *
;* READ-BINARY *
;* *
;************************************************
PCRBIN: CALL GETA
JR Z,PCRBIN
LD (HL),A
CPI
JP PE,PCRBIN ;SPRUNG WENN BC =/= 0
JR PCO10
;************************************************
;* *
;* READ-ASCII *
;* *
;************************************************
PCRASC: LD A,(PROMPT)
CALL PUTA ;AUSGABE (PROMPT)
PUSH HL ;DATA TRANSFER ADRESS
PCRA1: CALL RPAR ;ZEICHEN EINLESEN&PARITAETSBIT RUECKSETZEN
LD (HL),A
PUSH HL
LD H,A
LD A,(CARDEL) ;CARDEL
CP H
JR NZ,PCRA2
;
;
;
;CHARDEL ERKANNT !
;****************
POP HL
DEC HL ;DATA TRANSFER ADRESS -1
INC BC ;DATA LENGTH +1
POP DE
PUSH HL
SBC HL,DE
POP HL
PUSH DE
JR NC,PCRA1
JR PCLD1
;
PCRA2: LD A,(LINDEL) ;LINDEL
CP H
JR NZ,PCO16
;
;LINDEL ERKANNT !
;****************
PCLDEL: POP HL
PCLD1: POP HL
PUSH HL
LD B,(IY+5) DATA LENGTH NEULADEN
LD C,(IY+4)
JR PCRA1 ;NEUE ZEILE EINGEBEN
;
PCO16: LD A,H
POP HL
INC HL ;DATA TRANSFER ADRESS
DEC BC ;DATA LENGTH
POP DE
CP CR ;ENDE DER ZEILE ?
JR Z,PCNL
LD A,C
OR B
JR Z,PCO10
PUSH DE
JR PCRA1
;
RPAR: CALL GETA
JR Z,RPAR
RES 7,A
CALL PUTA
RET
*E
;*******************************************************
;*
;* ZUSAETZLICHE VEREINBARUNGEN *
;*
;*******************************************************
SIOTAB
DEFW ISRSET
DEFW ISRZET
DEFW ISRSET
;
SDERR DEFB 18
DEFM 'INSERT SYSTEMDISK'
DEFB 0DH
KBC0 DEFB 12H
DEFB 0CFH ;BIT CONTROL
DEFB 7FH ;NUR BIT 7 AUSGABE
DEFB 037H ;EI/HIGH-AKTIV/MASK FOLGT
DEFB 0FEH ;NUR BIT 0 AKT. INTERRUPT
*E
;********************************************************
;* *
;* TREIBERPROGRAMME ZUR HARDWAREANPASSUNG *
;* *
;********************************************************
;
; !!! D I S P L A Y !!!
*INCLUDE OUTA.S
; !!! T A S T A T U R !!!
*INCLUDE INA.S
;
; !!! F L O P P Y - T R E I B E R !!!
*INCLUDE FLOPPY.S
;
;
;
;********************************************************
ORG 0B71H
;* *
;* PROM-VEREINBARUNGEN *
;* *
;********************************************************
TBREA: DEFT 'BREAK '
;
TDERR: DEFB 11
DEFM 'DISK ERROR'
DEFB CR ;CARRIAGE RETURN
;
FRAGZ: DEFT '?'
REGBEZ: DEFM 'A B C D E F H L I '
DEFM 'A''B''C''D''E''F''H''L'''
DEFM 'IXIYPCSP'
;LOW-ADRESSEN DES REGISTERRETTUNGSBEREICHES
LADRRB: DEFB AF_+1.AND.0FFH
DEFB BC_+1.AND.0FFH
DEFB BC_.AND.0FFH
DEFB DE_+1.AND.0FFH
DEFB DE_.AND.0FFH
DEFB AF_.AND.0FFH
DEFB HL_+1.AND.0FFH
DEFB HL_.AND.0FFH
DEFB I_.AND.0FFH
DEFB AFS_+1.AND.0FFH
DEFB BCS_+1.AND.0FFH
DEFB BCS_.AND.0FFH
DEFB DES_+1.AND.0FFH
DEFB DES_.AND.0FFH
DEFB AFS_.AND.0FFH
DEFB HLS_+1.AND.0FFH
DEFB HLS_.AND.0FFH
DEFB IX_.AND.0FFH
DEFB IY_.AND.0FFH
DEFB PC_.AND.0FFH
DEFB SP_.AND.0FFH
;*********************************************************************
;BASISVARIABLE: IM RAM AB NULLCT ABGESPEICHERT
BASVAR: DEFB 00H ;NULLCT
DEFB 01H ;LFCNT
DEFB 3EH ;PROMPT (>)
DEFB 7FH ;LINDEL (RUBOUT)
DEFB 08H ;CARDEL (BACKSPACE)
DEFB 00H ;BRKFLG
DEFW 00H ;BRKRETN
DEFW 00H ;DSKVSL
WRNGINIT:
DEFB 10 ;CRC RETRY
DEFB 3 ;WRONG SECTOR RETRY
DEFB 3 ;WRONG TRACK RETRY
;ENDE DES BLOCKES DER BASISVARIABLEN
;***********************************
;
KENNSD DEFM 'P8000SYS'
ORG 0BDFH
; BFOS SPRUNGVERTEILER
;
;
JP BTOHE
JP READY ;LW-READY TEST
JP PRESS ;CONSOL-STATUS TEST
JP GETA ;SPRUNG ZU GETA
JP PUTA
JP PCON
JP OUTAS ;AUSGABE ASC-ZEICHEN UEBER PCON
JP SSIGN
JP BDEC
JP DEBUG
JP DISK
*E
;*********************************************************************
;* *
;* RAM-BEREICH *
;* *
;*********************************************************************
ORG 0C00H
KOMINT: DEFS 100H ;ANFANG SYSTEMSTACK
STACK: DEFS 1 ;ENDE SYSTEMSTACK
;
XINT: DEFS 2
CONOBC: DEFS 1
CONOBF: DEFS 133
;
DEFS 1
CONIBF: DEFS 255-37
;KOMMANDOTABELLE FUER DEN FDC, MINI- UND STANDARDLAUFWERKE
FDCTAB DEFS 9
PR1 DEFS 1
PR2 DEFS 1
GPL2 DEFS 1
TRK DEFS 1
CMD DEFS 1
;KOMMANDOTABELLE FUER DEN DMA
DMALSW DEFS 10
;RESULTATSTABELLE DER FDC-KOMMANDOS
RESUL DEFS 7
;TABELLE DER MOTORLAUFZEITEN
TTAB DEFS 4
;
;Merkzelle fuer Laufwerkmaske
DMASK DEFS 1
FDTYP DEFS 1
;
;DISK PARAMETER VEKTOR1-->IM DEBUGER GELADEN
DPAVEC: DEFS 1 ;IGNORED
DEFS 1 ;IY+1 -->REQUEST-CODE
DEFS 2 ;IY+2,3 -->DATA TRANSFERADRESS
DEFS 2 ;IY+4,5 -->DATA LENGTH
DEFS 2 ;IY+6,7 -->COMPLETION RETURN ADRESS
DEFS 2 ;IY+8,9 -->ERROR RETURN ADRESS
DEFS 1 ;IY+10 -->COMPLETION CODE
DEFS 2 ;IY+11,12 -->DISK ADRESS
;
;DISK PARAMETER VEKTOR2-->WIRD IN DISK GELADEN
BFFADD: DEFS 2 ;IY+2,3 -->DATA TRANSFER ADRESS
BFFLEN: DEFS 2 ;IY+4,5 -->DATA LENGTH
INTPNT: DEFS 2
RQTRK: DEFS 1 ;REQUEST-TRACK & H-TEIL DISK ADRESSE
RQSECT: DEFS 1 ;IY+11 -->SECTOR ADRESS
V2TADR: DEFS 1 ;IY+12 -->TRACK ADRESS
;
BCKPTR: DEFS 2 ;ZEIGER ZUM VORHERGEHENDEN SECTOR
FORPTR: DEFS 2 ;ZEIGER ZUM NAECHSTEN SECTOR
CRC: DEFS 4
;
HL_: DEFS 2
INT: DEFS 1 ;INT.-ENABLE FLIP-FLOP
I_: DEFS 1
AF_: DEFS 2
BC_: DEFS 2
DE_: DEFS 2
AFS_: DEFS 2
BCS_: DEFS 2
DES_: DEFS 2
HLS_: DEFS 2
IX_: DEFS 2
IY_: DEFS 2
PC_: DEFS 2
SP_: DEFS 2
;
DEFS 2 ;FREI
;
CONOV: DEFS 11 ;CONSOLE OUTPUT-VECTOR
CONIV: DEFS 11 ;CONSOLE INPUT-VECTOR
DEFS 2 ;SEKTORLAENGE
PCONF: DEFS 1 ;FREI
N_ DEFS 1 ;NEXT MERKER
;
DSEL: DEFS 2
INS: DEFS 1
BRKADR: DEFS 2
EIADR DEFS 2
EIINS DEFS 1
;
CRCERR DEFS 2
SECERR DEFS 2
TRKERR DEFS 2
;
FDCONF DEFS 2 ; MERKZELLE FUER DISK-KONFIGURATION
SPURNR DEFS 1 ; MERKZELLE FUER DIE SPURNUMMER
;
APEIN DEFS 1 ; ADRESSE FUER AKTUELLEN STAND IM RINGPUFFER
APAUS DEFS 1
MCSQ DEFS 1
MFDC DEFS 1
DEFS 14 ; FREI
;
; TABELLEN DER INTERRUPTSERVICEROUTINEN VON ALLEN AUF DEM 8-BIT-TEIL
; BEFINDLICHEN PERIPHERIESCHALTKREISEN:
; CTC0, CTC1, SIO1, SIO2, PIO1, PIO2, PIO3, FDC, DMA
;
; CTC0:
ITABC0
DEFS 2 ; KANAL 0, NICHT BELEGT
DEFS 2 ; KANAL 1, NICHT BELEGT
ISNEXT DEFS 2 ; KANAL 2, BELEGT DURCH NEXT-INTERRUPT IN NEXT
RDYMIN DEFS 2 ; KANAL 3, BELEGT DURCH ZEIT-INTERRUPT FUER MINI-LAUFWERKE
;
; CTC1:
ITABC1
DEFS 2 ;
DEFS 2 ;
DEFS 2 ;
DEFS 2 ;
;
; PIO0:
ITABP0
IP0KA DEFS 2 ;
IP0KB DEFS 2
;
; PIO1:
ITABP1
IP1KA DEFS 2
IP1KB DEFS 2 ;
;
; PIO2:
ITABP2
IP2KA DEFS 2 ; INTERRUPTSERVICEROUTINE FUER INTERRUPT VOM FDC
IP2KB DEFS 2 ; HIER WIRD OHNE INTERRUPT GEARBEITET
;
; DMA:
ITABD
DEFS 2 ; INTERRUPTADRESSE FUER DMA, GENUTZT FUER FLOPPY-ARBEIT
;
DEFS 2 ; FREI
;
; SIO0:
ITABS0
IS0B1 DEFS 2 ;
IS0B2 DEFS 2 ; ISRSET
IS0B3 DEFS 2 ; ISRZET
IS0B4 DEFS 2 ; ISRSET
IS0A1 DEFS 2
IS0A2 DEFS 2
IS0A3 DEFS 2
IS0A4 DEFS 2
;
; SIO1:
ITABS1
IS1B1 DEFS 2
IS1B2 DEFS 2
IS1B3 DEFS 2
IS1B4 DEFS 2
IS1A1 DEFS 2
IS1A2 DEFS 2
IS1A3 DEFS 2
IS1A4 DEFS 2
;
INVEK: DEFS 96
;
USRSTK: DEFS 2 ;USER-STACK
DATE:
DEFS 6
TIMEZG: DEFS 12
ERRCOD: DEFS 1
EXTRET: DEFS 2
MEMTOP: DEFS 2
MEMBOT: DEFS 2
INPTR: DEFS 2 ;ZEIGT AUF DIE AKTUELLE ADRESSE IN CONIBF
OUTPTR: DEFS 2 ;ZEIGT AUF DIE AKTUELLE ADRESSE IN CONOB
;
;BASIS-VARIABLENFELD ANFANG
NULLCT: DEFS 1 ;NULLCT
LFCNT: DEFS 1 ;LINE FEED COUNTER
PROMPT: DEFS 1 ;PROMPT >
LINDEL: DEFS 1 ;LINDEL !
CARDEL: DEFS 1 ;CARDEL @
BRKFLG: DEFS 1 ;BRKFLG
BRKRET: DEFS 2 ;BRKRET
;
DSKVSL: DEFS 2 ;DISK-SCHLUESSELZELLE
DEFS 2 ;FREI
CRCCTR: DEFS 1
WSCTR: DEFS 1
WTCTR: DEFS 1
CURT0: DEFS 8
CURTRK: DEFS 1
MZNEXT DEFS 1 ;MERKZELLE NEXTROUTINE
DEFS 4 ;FREI
GOJMP: DEFS 1 ;INTERRUPT MODE FUER REALTIME START
DEFS 3 ;JP (SAVPC) -->IN GO GELADEN
;
RINGP DEFS 20H ;Ringpuffer fuer die Eingabe von der Tastatur
;
;
;*********************************************************************
;* *
;*VEREINBARUNGSTEIL *
;* *
;*********************************************************************
;DATEN
NRET: EQU 80H ;NORMAL RETURN
;STEUERWORTE
RDBIN: EQU 0AH ;REQUEST CODES
WRBIN: EQU 0EH
RDASC: EQU 0CH
WRASC: EQU 10H
;I/O-ADRESSEN
; VEREINBARUNGEN
CTC0: EQU 008H ;
CTC1 EQU 02CH
;
SIO0 EQU 024H
S0AD EQU SIO0
S0AC EQU SIO0+1
S0BD EQU SIO0+2
S0BC EQU SIO0+3
;
SIO1 EQU 028H
S1AD EQU SIO1
S1AC EQU SIO1+1
S1BD EQU SIO1+2
S1BC EQU SIO1+3
;
PIO0 EQU 0CH
P0AD EQU PIO0
P0AC EQU PIO0+1
P0BD EQU PIO0+2
P0BC EQU PIO0+3
;
PIO1 EQU 018H
P1AD EQU PIO1
P1AC EQU PIO1+1
P1BD EQU PIO1+2
P1BC EQU PIO1+3
;
PIO2 EQU 1CH
P2AD EQU PIO2
P2AC EQU PIO2+1
P2BD EQU PIO2+2
P2BC EQU PIO2+3
;
DMAADR EQU 3CH
;
;
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
;
COMM6 EQU 30H ; FEHLER RUECKSETZEN
COMM3 EQU 18H ; KANAL RUECKSETZEN
COMM2 EQU 10H ; RUECKSETZEN EXT./STAT. INTERRUPT
NOPRTY EQU 0 ; PARITAETSPRUEFUNG AUSSCHALTEN
S2 EQU 0CH ; 2 STOP/BITS JE ZEICHEN
C16 EQU 40H ; *16
RENABLE EQU 1
B8 EQU 0C0H
XENABLE EQU 8
T8 EQU 60H
PDAVCT EQU 18H
SAVECT EQU 04H
XMTRIE EQU 02H
;
CR EQU 0DH
LF EQU 0AH
C32 EQU 80H