*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