!****************************************************************************** ******************************************************************************* P8000-Firmware (C) ZFT/KEAW Abt. Basissoftware - 1989 U8000-Softwaremonitor (MON16) Modul: p_init Bearbeiter: J. Zabel Datum: 14.04.1989 Version: 3.1 ******************************************************************************* ******************************************************************************! !============================================================================== Inhaltsuebersicht Modul p_init ------------------------------ Dieser Modul umfasst: - die U8000-Initialisierung, - den Test und die Initialisierung der Koppelschnittstelle (fuer Terminalbetrieb ueber SIO0_B des 8-Bit-Teils und Dateitransfer von/zu UDOS und Blocktransfer zur Floppy), - falls die Koppelschnittstelle inaktiv ist, die Initialisierung des seriellen Kanals fuer das Terminal (SIO0_B), - die Initialisierung des seriellen Kanals fuer das LOAD/SEND-System (SIO0_A), - die Initialisierung des Arbeitsspeichers, - die Ausgabe der Systemmeldung und - die Kommandoeingabeschleife. Prozeduren ---------- ENTRY_ CMDLOP INIT_CTC0_0 INIT_CTC0_1 INIT_SIO0_A INIT_SIO0_B ERROR UINSTR_ERR PINSTR_ERR SC_ENTRY MMU_ERR NMI_INT NVI_INT VI_ERR ==============================================================================! p_init module $SECTION PROM !anfang mon16.include! !****************************************************************************** allgemeine Vereinbarungen (Stand: 13.04.1989) ******************************************************************************! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ externe Prozeduren und Marken ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! EXTERNAL INIT_CTC0_0 procedure !Modul p_init! INIT_CTC0_1 procedure !Modul p_init! INIT_SIO0_A procedure !Modul p_init! INIT_SIO0_B procedure !Modul p_init! CMDLOP procedure !Modul p_init! ERROR procedure !Modul p_init! NMI_INT procedure !Modul p_init! PTY_INT procedure !Modul p_term! PTY_ERR procedure !Modul p_term! KOPPEL_INT procedure !Modul p_term! INCPTR procedure !Modul p_term! TYRD procedure !Modul p_term! TYWR procedure !Modul p_term! TYRD_UDOS_INT procedure !Modul p_term! TYRD_UDOS_POL procedure !Modul p_term! TYWR_UDOS_INT procedure !Modul p_term! TYWR_UDOS_POL procedure !Modul p_term! TYWR_KOPPEL_INT procedure !Modul p_term! TYWR_KOPPEL_POL procedure !Modul p_term! KP_OUTB procedure !Modul p_term! KP_INB procedure !Modul p_term! RD_LINE_BFF procedure !Modul p_term! RD_LINE_INBFF procedure !Modul p_term! WR_CRLF procedure !Modul p_term! WR_MSG procedure !Modul p_term! WR_OUTBFF_CR procedure !Modul p_term! WR_OUTBFF procedure !Modul p_term! HTOB procedure !Modul p_term! BTOH16 procedure !Modul p_term! BTOH8 procedure !Modul p_term! GET_CHR procedure !Modul p_term! GET_SIGN procedure !Modul p_term! GET_SIGNW procedure !Modul p_term! GET_SGNR procedure !Modul p_term! GET_HEXZ procedure !Modul p_term! GET_ADR procedure !Modul p_term! GET_PAR procedure !Modul p_term! RD_DATA procedure !Modul p_term! GET_DATA procedure !Modul p_term! WR_R5_RDDATA procedure !Modul p_term! WR_OBF_RDDATA procedure !Modul p_term! PUT_CHR procedure !Modul p_term! PUT_3C procedure !Modul p_term! PUT_2CHR procedure !Modul p_term! PUT_SEGNR procedure !Modul p_term! PUT_SGNR procedure !Modul p_term! DISPLAY procedure !Modul p_comm! COMPARE procedure !Modul p_comm! FILL procedure !Modul p_comm! MOVE procedure !Modul p_comm! PORT_READ procedure !Modul p_comm! PORT_WRITE procedure !Modul p_comm! PORT_READ_SPECIAL procedure !Modul p_comm! PORT_WRITE_SPECIAL procedure !Modul p_comm! HARD_DISK_READ procedure !Modul p_comm! HARD_DISK_WRITE procedure !Modul p_comm! FLOPPY_FORMAT procedure !Modul p_comm! FLOPPY_READ procedure !Modul p_comm! FLOPPY_WRITE procedure !Modul p_comm! REGISTER procedure !Modul p_brk! SAVREG procedure !Modul p_brk! BREAK procedure !Modul p_brk! GO procedure !Modul p_brk! GO_NXT procedure !Modul p_brk! NEXT procedure !Modul p_brk! RETI_CTC0_3 procedure !Modul p_brk! TEST_ procedure !Modul p_test! GET procedure !Modul p_gesa! SAVE procedure !Modul p_gesa! QUIT8 procedure !Modul p_gesa! QUIT8_RESET procedure !Modul p_gesa! FLOPPY procedure !Modul p.gesa! RM_GET procedure !Modul p_gesa! RM_SAVE procedure !Modul p_gesa! RM_QUIT procedure !Modul p_gesa! QUIT procedure !Modul p_ldsd! LOAD procedure !Modul p_ldsd! MCZ_INT procedure !Modul p_ldsd! MCZ_ERR procedure !Modul p_ldsd! TYWR_MCZ procedure !Modul p_ldsd! WOCF_MCZ procedure !Modul p_ldsd! SEND procedure !Modul p_ldsd! OS_BOOT procedure !Modul p_boot! AUTOBOOT procedure !Modul p_boot! DISK procedure !Modul p_disk! MON16_1H word !Modul p.crc! N_MON16_1H word !Modul p.crc! MON16_1L word !Modul p.crc! N_MON16_1L word !Modul p.crc! MON16_2H word !Modul p.crc! N_MON16_2H word !Modul p.crc! MON16_2L word !Modul p.crc! N_MON16_2L word !Modul p.crc! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Werte aus dem Arbeitsspeicher (Modul p_ram) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! EXTERNAL RAM_ANF ARRAY [%10 WORD] NSP_OFF WORD ARRAY [%3F WORD] !Stackbereich! STACK WORD ARRAY [4 WORD] _numterm WORD !Anzahl der Terminals! PTYPORT BYTE !Terminalkanal: 00 - SIO0_B (16-Bit-Teil) 01 - SIO0_B (8-Bit-Teil) ueber Koppelschnittstelle! XEMPTY BYTE !fuer interruptgesteuerten Terminal- betrieb ueber Koppelschnittstelle: 00 - Sendepuffer SIO0_B (8-Bit-Teil) leer FF - Sendepuffer SIO0_B (8-Bit-Teil) nicht leer! BYTE KONV BYTE !Hilfsbyte zur Konvertierung! INBFF ARRAY [%80 BYTE] !Eingabepuffer! OUTBFF ARRAY [%80 BYTE] !Ausgabepuffer! PTYBFF ARRAY [%100 BYTE] !Eingabepuffer fuer interrupt- gesteuerte Eingabe vom Terminal- kanal! MCZBFF ARRAY [%0EA BYTE] !Ein-/Ausgabepuffer fuer LOAD/SEND! MAXLEN WORD !maximale Zeilenlaenge! INPTR WORD !Zeiger fuer Eingabepuffer INBFF! OUTPTR WORD !Zeiger fuer Ausgabepuffer OUTBFF (Pufferlaenge)! COUNT_PTY WORD !aktuelle Anzahl der Zeichen in PTYBFF! INPTR_PTY WORD !Eingabezeiger fuer PTYBFF (naechster freier Platz)! OUTPTR_PTY WORD !Ausgabezeiger fuer PTYBFF (naechstes auszulesende Zeichen)! INPTR_MCZ WORD !Eingabezeiger fuer MCZBFF! OUTPTR_MCZ WORD !Ausgabezeiger fuer MCZBFF! B_WORD WORD !Speicherinhalt auf der BREAK-Adresse! B_ADR_S WORD !Segmentnummer der BREAK-Adresse! B_ADR_O WORD !Offset der BREAK-Adresse! RR14_V LONG !VARIABLER STACK, FUER NEXT UND BREAK! W23B4 WORD FCW_V WORD !VARIABLES FCW FUER NEXT UND BREAK! PORT_BF WORD !Puffer fuer gelesenen bzw. zu schreibenden PORT-Datenwert! PORT_IO WORD !Adresse des PORT-I/O-Programms! WORD !unbenutzt! SV_R ARRAY [14 WORD] !Registerrettungsbereich! SVSTK LONG PC_SEG WORD !Programmcounter (Segmentnummer)! PC_OFF WORD !Programmcounter (Offsetadresse)! FCW_ WORD !FCW im Registerrettungsbereich! RF_CTR WORD !Merker: Refresh Control Register! N4_ WORD !Normalstack R14! N5_ WORD !Normalstack R15! PS_ WORD !Program-Status-Area Segment! PO_ WORD !Program-Status-Area Offset! WORD !unbenutzt! !Flags! FLAG0 BYTE FLAG1 BYTE !Variablen (initialisiert bei Systemstart)! CHRDEL BYTE !Zeichen loeschen (Backspace %08)! LINDEL BYTE !Zeile loeschen (Line delete %7F)! XONCHR BYTE !Terminalausgabe fortsetzen (^Q %11)! XOFCHR BYTE !Terminalausgabe anhalten (^S %13)! NULLCT WORD !Anzahl der Nullen nach CR bei Terminalausgabe (%0000)! B_CODE WORD !Unterbrechungscode Z8000 (7F00)! STKCTR WORD !Zaehler der Stackoperationen fuer NEXT (%0004)! NXTCTR WORD !SCHRITTZAEHLER FUER NEXT (%0001)! PROMT WORD !Promt-Zeichen (%2000)! !---------------------------------------------------! !Program Status Area (initialisiert bei Systemstart)! PSAREA ! ID FCW PCSEG PCOFF! ARRAY [4 WORD] !:= [%0000 %0000 %0000 %0000] RESERVED! ARRAY [4 WORD] !:= [%0000 %4000 %8000 VI_ERR] UNIMLEMENTED INSTRUCTIONS! ARRAY [4 WORD] !:= [%0000 %4000 %8000 VI_ERR] PRIVILEGED INSTRUCTIONS! PSA_SC ARRAY [4 WORD] !:= [%0000 %C000 %8000 SC_ENTRY] SYSTEM_CALL INSTRUCTIONS! ARRAY [4 WORD] !:= [%0000 %4000 %8000 MMU_ERR] SEGMENT TRAP! PSA_NMI ARRAY [4 WORD] !:= [%0000 %4000 %8000 AUTOBOOT bzw. NMI_INT] NONMASKABLE INTERRUPT (AUTOBOOT vor erster Terminaleingabe; NMI_INT nach erster Terminaleingabe)! ARRAY [4 WORD] !:= [%0000 %4000 %8000 VI_ERR] NONVECTORED INTERRUPT! ! VECTORED INTERRUPT! ARRAY [2 WORD] !:= [%0000 %4000] VECTORED INTERRUPT (ID, FCW)! ! VI - Sprung-Tabelle (128 Eintraege) ! ! SEG OFFSET! !CTC0! VI_CTC0_0 ARRAY [2 WORD] !:= [%8000 VI_ERR] ! VI_CTC0_1 ARRAY [2 WORD] !:= [%8000 VI_ERR] ! VI_CTC0_2 ARRAY [2 WORD] !:= [%8000 VI_ERR] ! VI_CTC0_3 ARRAY [2 WORD] !:= [%8000 VI_ERR bzw. GO_INT bzw. NXT_INT] fuer GO bzw. NEXT! !PIO1! VI_PIO1_B ARRAY [2 WORD] !:= [%8000 KOPPEL_INT] VI Zeichen empfangen (von Koppelschnittstelle)! ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 VI_ERR] ! !SIO0! VI_SIO0_B ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 PTY_INT] VI Zeichen empfangen (fuer Terminaleingabe)! ARRAY [2 WORD] !:= [%8000 PTY_ERR] VI Empfangssonderfall (fuer Empfangsfehler)! VI_SIO0_A ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 VI_ERR] ! ARRAY [2 WORD] !:= [%8000 MCZ_INT] VI Zeichen empfangen (fuer MCZ-Eingabe)! ARRAY [2 WORD] !:= [%8000 MCZ_ERR] VI Empfangssonderfall (fuer Empfangsfehler)! ! Rest der 128 Eintraege der VI-Sprung-Tabelle! VI_TAB_REST ARRAY [224 WORD] !:= [%8000 VI_ERR] ! !---------------------------------------------------! !Arbeitsspeicher fuer Kommando "T" (Hardwareeigentest)! RG_FELD ARRAY [%1A WORD] !Feld zur Registerrettung! REM_MMU_BCSR BYTE !Merker: Inhalt BUS CYCLE STATUS REGISTER! REM_MMU_VTR BYTE !Merker: Inhalt VIOLATION TYPE REGISTER! REM_MMU_ID WORD !Merker: MMU-Identifikation! REM_ERR_CNT WORD !Merker: Stand Fehlerzaehler! REM_SEGMENT_TRAP WORD !Merker: urspruengliche Offsetadresse fuer Segmenttrap! REM_PRIVINSTR_TRAP WORD !Merker: urspruengl. Offsetadr. fuer Priv.-Instr.-Trap! REM_MMU_SINOUT WORD !Merker: MMU-Ein-/Ausgabewerte! ERR_CNT WORD !Fehlerzaehler! ERR_WDC WORD !Fehlerzaehler fuer WDC-Test! MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! REM_PARNMI WORD !Merker: Paritaets-NMI aufgetreten (%0000-->nein / %FFFF-->ja)! ERRPAR_ID WORD !Spezifizierung der 4 Parameter der auszugebenden Fehlerzeile (Prozedur MSG_ERROR)! REM_MMU1 WORD REM_MMU2 WORD REM_INT WORD !Merker: Interrupt aufgetreten (0-->nein)! REM_WDC1 WORD !Speicherplatz fuer Testdatenwert! REM_WDC2 WORD !Speicherplatz fuer rueckgelesenen datenwert! !Arbeitsspeicher fuer Kommandos "GE"/"S"/"O U" und Floppytreiber! FILENAME_PTR WORD !Anfangsadresse Dateiname! COUNT_UDOS WORD !akt. Anzahl der Zeichen in UDOSBFF! INPTR_UDOS WORD !Eingabezeiger fuer UDOSBFF (naechster freier Platz)! OUTPTR_UDOS WORD !Ausgabezeiger fuer UDOSBFF naechstes auszulesende Zeichen)! UDOSBFF ARRAY [%100 BYTE] !Eingabepuffer fuer interrupt- gesteuerte Eingabe bei Dateitransfer von/zu UDOS bzw. Blocktransfer! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ System Calls ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! CONSTANT SC_SEGV := %01 !Modul p.term! SC_NSEGV := %02 !Modul p.term! SC_TYRD := %04 !Modul p.term! SC_TYWR := %06 !Modul p.term! SC_RD_LINE_BFF := %08 !Modul p.term! SC_WR_CRLF := %0A !Modul p.term! SC_WR_MSG := %0C !Modul p.term! SC_BTOH16 := %0E !Modul p.term! SC_WR_OUTBFF_CR := %10 !Modul p.term! SC_BTOH8 := %12 !Modul p.term! SC_PUT_SEGNR := %14 !Modul p.term! SC_PUT_CHR := %16 !Modul p.term! SC_WOCF_MCZ := %18 !Modul p.ldsd! SC_TYWR_MCZ := %1A !Modul p.ldsd! SC_CMDLOP := %1C !Modul p.init! SC_DISK := %1E !Modul p.disk! SC_TYRD_UDOS_INT := %20 !Modul p.term! SC_TYWR_UDOS_INT := %22 !Modul p.term! SC_FLOPPY := %24 !Modul p.gesa! SC_WR_OUTBFF := %26 !Modul p.term! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ spezielle ASCII-Zeichen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! CONSTANT SOH := %01 STX := %02 ETX := %03 EOT := %04 ACK := %06 BEL := %07 BS := %08 LF := %0A CR := %0D NAK := %15 CAN := %18 ESC := %1B !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Hardwareadressen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! CONSTANT !8-Bit-Teil! SIO0D_B_8 := %26 !SIO fuer Terminal! SIO0C_B_8 := %27 !16-Bit-Teil! SIO0 := %FF81 !Kanal A (XB1/TTY4): unbenutzt (vorher LOAD/SEND/QUIT); Kanal B (XB2/TTY5): Terminal, wenn 8-Bit-Teil inaktiv! SIO0D_A := SIO0 + 0 SIO0D_B := SIO0 + 2 SIO0C_A := SIO0 + 4 SIO0C_B := SIO0 + 6 SIO1 := %FF89 !Kanal A (XB3/TTY6): unbenutzt Kanal B (XB4/TTY7): unbenutzt! SIO1D_A := SIO1 + 0 SIO1D_B := SIO1 + 2 SIO1C_A := SIO1 + 4 SIO1C_B := SIO1 + 6 PIO0 := %FF91 !Koppel-PIO zum 8-Bit-Teil fuer Terminal und Kommandos "GE", "S", "Q", "QRES", "O U" und Floppytreiber Kanal A: Datenausgabe Kanal B: Statusausgabe/Steuerport! PIO0D_A := PIO0 + 0 PIO0D_B := PIO0 + 2 PIO0C_A := PIO0 + 4 PIO0C_B := PIO0 + 6 PIO1 := %FF99 !Koppel-PIO zum 8-Bit-Teil fuer Terminal und Kommandos "GE", "S", "Q", "QRES", "O U" und Floppytreiber Kanal A: Dateneingabe Kanal B: Statuseingabe/Steuerport! PIO1D_A := PIO1 + 0 PIO1D_B := PIO1 + 2 PIO1C_A := PIO1 + 4 PIO1C_B := PIO1 + 6 PIO2 := %FFA1 !(XB5): Winchester Kanal A: Datenein-/-ausgabe; Kanal B: Steuerport! PIO2D_A := PIO2 + 0 PIO2D_B := PIO2 + 2 PIO2C_A := PIO2 + 4 PIO2C_B := PIO2 + 6 CTC0 := %FFA9 CTC0_0 := CTC0 + 0 ! Baud 0 - SIO0, Kanal A! CTC0_1 := CTC0 + 2 ! Baud 1 - SIO0, Kanal B! CTC0_2 := CTC0 + 4 ! Baud 2 - SIO1, Kanal A! CTC0_3 := CTC0 + 6 ! Next ! CTC1 := %FFB1 CTC1_0 := CTC1 + 0 ! Baud 3 - SIO1, Kanal B! CTC1_1 := CTC1 + 2 CTC1_2 := CTC1 + 4 CTC1_3 := CTC1 + 6 LON := %FFD9 !RUN16-Lampe ein! LOFF := %FFB9 !RUN16-Lampe aus! S_BNK := %FFC1 !SWITCH-BANK: Bit0-3 Ausgabebits; Bit4-7 Eingabebits (DIL-Schalter): Bit 0: =0 - Monitor PROM+RAM einschalten =1 - Monitor PROM+RAM ausschalten Bit 1: =0 - MMU's ausschalten; =1 - MMU's einschalten Bit 2: Seg. Usr. Bit 3: =0 - Paritaetspruefung ausgeschaltet bzw. Paritaetsfehler loeschen =1 - Paritaetspruefung eingeschaltet Bit 5,4: Baudrate Terminal (unbenutzt) Bit 7,6: Autoboot Device (unbenutzt)! SBREAK := %FFC9 !System Break Register! NBREAK := %FFD1 !Normal Break Register! RETI_P := %FFE1 !RETI-Port fuer Schaltkreise des U880-Systems! ALL_MMU := %F0 STACK_MMU := %F6 DATA_MMU := %FA CODE_MMU := %FC !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Moegliche Statusausgaben an 8-Bit-Teil von 16-Bit-Teil fuer 8-Bit-/16-Bit-Koppelschnittstelle (PIO0_B) (INT8-Bit jeweils = 0) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! CONSTANT STAT8_ENDE := %00 !Ende eines Write-Requests! STAT8_READ := %02 !Read-Request an einen Peripheriebaustein 8-Bit-Teil! STAT8_WRITE := %04 !Write-Request an einen Peripheriebaustein 8-Bit-Teil! STAT8_UDOS := %10 !Datenbyte ist Bestandteil eines Dateitransfers bzw. eines Blocktransfers von/zu UDOS! STAT8_QUIT := %1E !Rueckkehr zum 8-Bit-Teil (Datenbyte "Q" oder "R")! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Moegliche Statuseingaben von 8-Bit-Teil an 16-Bit-Teil fuer 8-Bit-/16-Bit-Koppelschnittstelle (PIO1_B) (INT16-Bit jeweils = 0) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! CONSTANT STAT16_ENDE := %00 !Beantwortung eines Read-Requests! STAT16_SIO0_B_R := %04 !REC INT (SIO0_B-Empfaengerinterrupt)! STAT16_SIO0_B_X := %24 !TRANS INT (SIO0_B-Interrupt Sendepuffer leer)! STAT16_SIO0_B_E := %44 !EXT STAT INT (SIO0_B-Externer-Statusinterrupt)! STAT16_SIO0_B_S := %64 !SPEC REC INT (SIO0_B-Interrupt Empfangssonderfall)! STAT16_UDOS := %10 !Datenbyte ist Bestandteil eines Dateitransfers bzw. eines Blocktransfers von/zu UDOS! !ende mon16.include! !****************************************************************************** modulspezifische Vereinbarungen ******************************************************************************! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL WORD := 0000 WORD := %C000 ! FCW ! WORD := %8000 ! PC Segment-Nr. ! WORD := ENTRY_ ! PC Offset ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Copyright ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL COPYRIGHT ARRAY [* BYTE] := '(C) ZFT/KEAW Berlin, DATE 14.04.1989' !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Systemmeldung ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL SYSMSG WORD := 46 ARRAY [* BYTE] := 'U8000-Softwaremonitor Version 3.1 - ' ARRAY [* BYTE] := 'Press NMI%0D' !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Monitorkommandoliste ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL CMD_LISTE: WORD := 1 ARRAY [* BYTE] := 'D' WORD := DISPLAY WORD := 1 ARRAY [* BYTE] := 'C' WORD := COMPARE WORD := 1 ARRAY [* BYTE] := 'F' WORD := FILL WORD := 1 ARRAY [* BYTE] := 'M' WORD := MOVE WORD := 2 ARRAY [* BYTE] := 'PR' WORD := PORT_READ WORD := 3 ARRAY [* BYTE] := 'PRS' WORD := PORT_READ_SPECIAL WORD := 3 ARRAY [* BYTE] := 'PSR' WORD := PORT_READ_SPECIAL WORD := 2 ARRAY [* BYTE] := 'PW' WORD := PORT_WRITE WORD := 3 ARRAY [* BYTE] := 'PWS' WORD := PORT_WRITE_SPECIAL WORD := 3 ARRAY [* BYTE] := 'PSW' WORD := PORT_WRITE_SPECIAL WORD := 2 ARRAY [* BYTE] := 'HR' WORD := HARD_DISK_READ WORD := 2 ARRAY [* BYTE] := 'HW' WORD := HARD_DISK_WRITE WORD := 2 ARRAY [* BYTE] := 'FF' WORD := FLOPPY_FORMAT WORD := 2 ARRAY [* BYTE] := 'FR' WORD := FLOPPY_READ WORD := 2 ARRAY [* BYTE] := 'FW' WORD := FLOPPY_WRITE WORD := 1 ARRAY [* BYTE] := 'R' WORD := REGISTER WORD := 1 ARRAY [* BYTE] := 'B' WORD := BREAK WORD := 1 ARRAY [* BYTE] := 'G' WORD := GO WORD := 1 ARRAY [* BYTE] := 'N' WORD := NEXT WORD := 1 ARRAY [* BYTE] := 'T' WORD := TEST_ WORD := 2 ARRAY [* BYTE] := 'GE' WORD := GET WORD := 1 ARRAY [* BYTE] := 'S' WORD := SAVE WORD := 1 ARRAY [* BYTE] := 'Q' WORD := QUIT8 WORD := 4 ARRAY [* BYTE] := 'QRES' WORD := QUIT8_RESET WORD := 3 ARRAY [* BYTE] := 'RGE' WORD := RM_GET WORD := 2 ARRAY [* BYTE] := 'RS' WORD := RM_SAVE WORD := 2 ARRAY [* BYTE] := 'RQ' WORD := RM_QUIT WORD := 4 ARRAY [* BYTE] := 'LOAD' WORD := LOAD WORD := 4 ARRAY [* BYTE] := 'SEND' WORD := SEND WORD := 4 ARRAY [* BYTE] := 'QUIT' WORD := QUIT WORD := 1 ARRAY [* BYTE] := 'O' WORD := OS_BOOT WORD := %FFFF !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PIO/SIO/CTC-Initialisierungstabellen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL ITAB_PIO0_B ARRAY [* BYTE] := [%CF !Bit-Ein-Ausgabemode! %60] !Bit 0-4: Ausgabe; Bit 5,6: Eingabe! ITAB_PIO1_B ARRAY [* BYTE] := [%08 !VI_PIO1_B in PSAREA! %CF !Bit-Ein-Ausgabemode! %FF !Bit 0-6: Eingabe! %B7 !Interruptsteuerwort: EI/OR/HIGH/MASK folgt! %FE] !Bit 0 loest Interrupt aus! ITAB_SIO0_A ARRAY [* BYTE] := [COMM3 SIO_R4 + COMM2 S2 + C32 + NOPRTY SIO_R3 RENABLE + B8 SIO_R5 XENABLE + T8 + DTR + RTS SIO_R1 + COMM2 PDAVCT] ITAB_SIO0_B ARRAY [* BYTE] := [COMM3 SIO_R4 + COMM2 S2 + C32 + NOPRTY SIO_R3 RENABLE + B8 SIO_R5 XENABLE + T8 + DTR + RTS SIO_R1 + COMM2 PDAVCT + SAVECT] ITAB_SIO0_INTVEK ARRAY [* BYTE] := [SIO_R2 %10] !VI_SIO0_B in PSAREA! CONSTANT BAUD9600 := %02 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SIO-Kommandos ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! !Command Identifiers and Values Includes all control bytes for asynchronous and synchronous I/O ! CONSTANT !WR0 Commands! !SIO_R0 := %00! !SIO register pointers! SIO_R1 := %01 SIO_R2 := %02 SIO_R3 := %03 SIO_R4 := %04 SIO_R5 := %05 !SIO_R6 := %06! !SIO_R7 := %07! !COMM0 := %00! !Null Code! !COMM1 := %08! !Send Abort (SDLC)! COMM2 := %10 !Reset Ext/Stat Int! COMM3 := %18 !Channel Reset! !COMM4 := %20! !Enable Int On Next Rx Char! !COMM5 := %28! !Reset Tx Int Pending! !COMM6 := %30! !Error Reset! !RFI := %38! !Return from Int! !RRCC := %40! !Reset Rx CRC Checker! !RTCG := %80! !Reset Tx CRC Generator! !RTUEL := %C0! !Reset Tx Under/EOM Latch! !WR1 Commands! !WAIT := %00! !Wait function! !DRCVRI := %00! !Disable Receive Interrupts! !EXTIE := %01! !External interrupt enable! !XMTRIE := %02! !Transmit Int Enable! SAVECT := %04 !Status affects vector! !FIRSTC := %08! !Rx interrupt on first character! !PAVECT := %10! !Rx interrupt on all characters! !(parity affects vector)! PDAVCT := %18 !Rx interrupt on all characters! !(parity doesn't affect vector)! !WRONRT := %20! !Wait/ready on receive! !RDY := %40! !Ready function! !WRDYEN := %80! !Wait/Ready enable! !WR2 Commands! IV := %00 !WR3 Commands! !B5 := %00! !Receive 5 bits/character! RENABLE := %01 !Receiver enable! !SCLINH := %02! !Sync character load inhibit! !ADSRCH := %04! !Address search mode! !RCRCEN := %08! !Receive CRC enable! !HUNT := %10! !Enter hunt mode! !AUTOEN := %20! !Auto enable! !B7 := %40! !Receive 7 bits/character! !B6 := %80! !Receive 6 bits/character! B8 := %C0 !Receive 8 bits/character! !WR4 Commands! !SYNC := %00! !Sync modes enable! NOPRTY := %00 !Disable partity! !ODD := %00! !Odd parity! !MONO := %00! !8 bit sync character! !C1 := %00! !x1 clock mode! !PARITY := %01! !Enable Parity! !EVEN := %02! !Even parity! !S1 := %04! !1 stop bit/character! !S1HALF := %08! !1+1/2 stop bit/character! S2 := %0C !2 stop bits/character! !BISYNC := %10! !16 bit sync character! !SDLC := %20! !SDLC mode! !ESYNC := %30! !External sync mode! !C16 := %40! !x16 clock mode! C32 := %80 !x32 clock mode! !C64 := %C0! !x64 clock mode! !WR5 Commands! !T5 := %00! !Transmit 5 bits/character! !XCRCEN := %01! !Transmit CRC enable! RTS := %02 !Request to send! !SELCRC := %04! !Select CRC-16 polynomial! XENABLE := %08 !Transmitter enable! !XBREAK := %10! !Send break! !T7 := %20! !Transmit 7 bits/character! !T6 := %40! !Transmit 6 bits/character! T8 := %60 !Transmit 8 bits/character! DTR := %80 !Data terminal ready! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Variablenliste zur RAM-Initialisierung fuer CHRDEL-PROMT (siehe Modul p_ram) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL !VARIABLENLISTE: CHRDEL,LINDEL/^Q,^S/N_CNT/B_CODE/STACK_CT/N_/PROMT! VAR_LISTE_PROM ARRAY [7 WORD] := [%087f %1113 %0000 %7f00 %0004 %0001 %2000] !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Initialisierungsfeld zur RAM-Initialisierung fuer Program Status Area (siehe Modul p_ram) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL PSAREA_PROM: ! ID FCW PCSEG PCOFF! ARRAY [4 WORD] := [%0000 %0000 %0000 %0000] !RESERVED! ARRAY [4 WORD] := [%0000 %4000 %8000 UINSTR_ERR] !UNIMLEMENTED INSTRUCTIONS! ARRAY [4 WORD] := [%0000 %4000 %8000 PINSTR_ERR] !PRIVILEGED INSTRUCTIONS! ARRAY [4 WORD] := [%0000 %C000 %8000 SC_ENTRY] !SYSTEM CALL INSTRUCT.! ARRAY [4 WORD] := [%0000 %4000 %8000 MMU_ERR] !SEGMENT TRAP! ARRAY [4 WORD] := [%0000 %4000 %8000 AUTOBOOT] !NONMASKABLE INTERRUPT! ARRAY [4 WORD] := [%0000 %4000 %8000 NVI_ERR] !NONVECTORED INTERRUPT! ARRAY [2 WORD] := [%0000 %4000] !VECTORED INTERRUPT! !VECTORED INTERRUPT JUMP TABLE! ! SEG OFFSET! ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 KOPPEL_INT] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 PTY_INT] ARRAY [2 WORD] := [%8000 PTY_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 VI_ERR] ARRAY [2 WORD] := [%8000 MCZ_INT] ARRAY [2 WORD] := [%8000 MCZ_ERR] !****************************************************************************** Prozeduren ******************************************************************************! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE ENTRY_ Startprozedur ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL ENTRY_ procedure entry !PSAPSEG laden (Segment 00)! clr r14 ldctl PSAPSEG, r14 !Program Status Area Pointer Segment Register! !Umschaltung auf nichtsegmentierten Mode! ld r1, #%4000 ldctl FCW, r1 !Flag and Control Word Register! !MMU's ausschalten! clr R3 sout ALL_MMU, r3 !MMU in Tristate bringen! !RAM loeschen! ld r4, #RAM_ANF ld r2, #RAM_ANF+2 ld @r4, #0 ld r1, #%0400 ldir @r2, @r4, r1 !Refresh-Register laden! ld r1, #%9E00 !REFRESH-Anpassung! ldctl REFRESH, r1 !Refresh Control Register! ld RF_CTR, r1 !Eingabepuffer (INBFF) und Ausgabepuffer (OUTBFF) mit Space initialisieren! ld INBFF, #%2020 ld r4, #INBFF ld r2, #INBFF+2 ld r1, #%80 ldir @r2, @r4, r1 !Variablen-Transfer in den RAM! ld r4, #VAR_LISTE_PROM ld r2, #CHRDEL ldk r1, #%07 ldir @r2, @r4, r1 !Program Status Area im RAM initialisieren! ld r4, #PSAREA_PROM ld r2, #PSAREA ld r1, #%3E ldir @r2, @r4, r1 !Rest der VI-Sprungtabelle in PSAREA fuellen! ld r6, #%8000 !Segmentadresse! ld r7, #VI_ERR ld r3, #128-16 !Zaehler! ld r2, #VI_TAB_REST E1: ldl @r2, rr6 inc r2, #%0004 djnz r3, E1 !Stack-Bereich initialisieren! ld r14, #%8000 !Normal-Stackpointer (Segment)! ld r15, #NSP_OFF !Normal-Stackpointer (Offset)! ldl SVSTK, rr14 ld r15, #STACK !PSAPOFF laden! ld r1, #PSAREA ldctl PSAP, r1 !Program Status Area Pointer Offset Register! !Registerbereich laden! ld PS_, r14 ld PC_SEG, r14 ld PO_, r1 ld PC_OFF, #%8000 !PC im Registerbereich initialisieren (in Vs.1.7: %5000)! ld FCW_, #%C000 !FCW im Registerbereich initialisieren! !Flags setzen! setb FLAG1, #3 !Flag=1 --> Klein-/Grossbuchstaben erlaubt! resb FLAG1, #4 !Flag=0 --> Ausgabe bei CR abbrechen! !------------------------------------------------------------------------------ Test, ob Koppelschnittstelle aktiv ist und fehlerfrei arbeitet ja --> PTYPORT:=1 Terminalbetrieb ueber Koppelschnittstelle; UDOS auf 8-Bit-Teil nicht verfuegbar; Kommandos "Q", "QRES" ausfuehrbar; Kommandos "GE", "S", "O U" und Floppytreiber ("O F", "FF", "FR", "FW") nicht ausfuehrbar; bzw. PTYPORT:=2 Terminalbetrieb ueber Koppelschnittstelle; UDOS auf 8-Bit-Teil verfuegbar; Kommandos "GE", "S", "Q", "QRES", "O U" und Floppytreiber ("O F", "FF", "FR", "FW") ausfuehrbar; nein --> PTYPORT:=0 Terminalbetrieb ueber SIO0_B des 16-Bit-Teils; Kommandos "GE", "S", "Q", "QRES", "O U" und Floppytreiber ("O F", "FF", "FR", "FW") nicht ausfuehrbar ------------------------------------------------------------------------------! di vi !PIO0/PIO1 initialisieren (fuer Koppelschnittstelle)! !PIO0_A: Byteausgabe! ldb rl0, #%0F !Byteausgabe! outb PIO0C_A, rl0 !PIO0_B: Bit-Ein-Ausgabe (Bit 0-4: Ausgabe, Bit 5,6: Eingabe)! ld r2, #ITAB_PIO0_B ld r0, #2 ld r1, #PIO0C_B otirb @r1, @r2, r0 !PIO1_A: Byteeingabe! ldb rl0, #%4F !Byteeingabe! outb PIO1C_A, rl0 inb rl0, PIO1D_A !Scheineingabe! !PIO1_B: Bit-Eingabe (Bit 0-6: Eingabe, Bit 0 loest Interrupt aus)! !Programmierung erst nach Test der Koppelschnittstelle (s. KP_AKTIV:)! !Test Datentransfer ueber Koppelschnittstelle: 1. Empfangen Status-INT16 0101010/Datenbyte %AA von 8-Bit-Teil Zuruecksenden empfangenen Status-INT8/Datenbyte 2. Empfangen Status-INT16 1010101/Datenbyte %55 von 8-Bit-Teil Zuruecksenden empfangenen Status-INT8/Datenbyte 3. Empfangen von 8-Bit-Teil: Status-INT16 0000000/ Datenbyte %01, wenn Start des U8000-Softwaremonitors von U880-Softwaremonitor aus erfolgte (d.h. UDOS ist nicht verfuegbar) bzw. Datenbyte %02, wenn Start des U8000-Softwaremonitors von UDOS aus erfolgte (d.h. UDOS ist verfuegbar)! !Initialisierung PIO1_B (nur fuer Test der Koppelschnittstelle): Bit-Eingabe (Bit 0-6: Eingabe, Bit 0 loest keinen Interrupt aus)! ld r2, #ITAB_PIO1_B+1 ld r0, #2 ld r1, #PIO1C_B otirb @r1, @r2, r0 ! 1. ! ld r2, #%FFFF !bestimmte Zeit auf Datenbyte von 8-Bit-Teil warten! KP1: inb rl1, PIO0D_B bitb rl1, #5 !DATEN DA?! jr z, KP2 !ja! djnz r2, KP1 jr KP_INAKTIV !Wartezeit abgelaufen! KP2: inb rl0, PIO1D_B !Statuseingabe! andb rl0, #%7F !Bit 7 unbenutzt! inb rh0, PIO1D_A !Datenbyte einlesen! ld r2,#%FFFF !bestimmte Zeit auf ENABLE OUTPUT warten! KP3: inb rl1, PIO0D_B bitb rl1, #6 !ENABLE OUTPUT?! jr z, KP4 !ja! djnz r2, KP3 jr KP_INAKTIV !Wartezeit abgelaufen! KP4: outb PIO0D_B, rl0 !empf. Status-INT8 zuruecksenden (nur Bit 0-4)! outb PIO0D_A, rh0 !empf. Datenbyte zuruecksenden! cpb rl0, #%2A !Status-INT16 0101010! jr nz, KP_INAKTIV !Statusuebertragung fehlerhaft! cpb rh0, #%AA jr nz, KP_INAKTIV !Datenbyteuebertragung fehlerhaft! ! 2. ! ld r2, #%FFFF !bestimmte Zeit auf Datenbyte von 8-Bit-Teil warten! KP5: inb rl1, PIO0D_B bitb rl1, #5 !DATEN DA?! jr z, KP6 !ja! djnz r2, KP5 jr KP_INAKTIV !Wartezeit abgelaufen! KP6: inb rl0, PIO1D_B !Statuseingabe! andb rl0, #%7F !Bit 7 unbenutzt! inb rh0, PIO1D_A !Datenbyte einlesen! ld r2,#%FFFF !bestimmte Zeit auf ENABLE OUTPUT warten! KP7: inb rl1, PIO0D_B bitb rl1, #6 !ENABLE OUTPUT?! jr z, KP8 !ja! djnz r2, KP7 jr KP_INAKTIV !Wartezeit abgelaufen! KP8: outb PIO0D_B, rl0 !empf. Status-INT8 zuruecksenden (nur Bit 0-4)! outb PIO0D_A, rh0 !empf. Datenbyte zuruecksenden! cpb rl0, #%55 !Status-INT16 1010101! jr nz, KP_INAKTIV !Statusuebertragung fehlerhaft! cpb rh0, #%55 jr nz, KP_INAKTIV !Datenbyteuebertragung fehlerhaft! ! 3. ! ld r2, #%FFFF !bestimmte Zeit auf Datenbyte von 8-Bit-Teil warten! KP9: inb rl1, PIO0D_B bitb rl1, #5 !DATEN DA?! jr z, KP10 !ja! djnz r2, KP9 jr KP_INAKTIV !Wartezeit abgelaufen! KP10: inb rl0, PIO1D_B !Statuseingabe! andb rl0, #%7F !Bit 7 unbenutzt! inb rh0, PIO1D_A !Datenbyte einlesen! cpb rl0, #%00 !Status-INT16 0000000! jr nz, KP_INAKTIV !Statusuebertragung fehlerhaft! cpb rh0, #%01 !Kennzeichen: Koppelschnittstelle aktiv; UDOS nicht verfuegbar! jr z, KP_AKTIV cpb rh0, #%02 !Kennzeichen: Koppelschnittstelle aktiv; UDOS verfuegbar! jr nz, KP_INAKTIV !Datenbyteuebertragung fehlerhaft! !Koppelschnittstelle aktiv: - SIO0_B deaktivieren - PIO1_B (Koppelschnittstelle) fuer Interruptbetrieb aktivieren! KP_AKTIV: ldb PTYPORT, rh0 !Kennzeichnung: Koppelschnittstelle aktiv 01 - UDOS nicht verfuegbar 02 - UDOS verfuegbar! ldb rl0, #%08 !Anzahl der Terminals! ld _numterm, r0 ldb rl0, #COMM3 outb SIO0C_B, rl0 !SIO0_B Reset! !PIO1_B: Bit-Eingabe (Bit 0-6: Eingabe, Bit 0 loest Interrupt aus)! ld r2, #ITAB_PIO1_B ld r0, #5 ld r1, #PIO1C_B otirb @r1, @r2, r0 !RETI-Port initialisieren (fuer Koppelschnittstelle)! ldb rl0, #0 outb RETI_P, rl0 jr E0 !Koppelschnittstelle inaktiv: - PIO1_B (Koppelschnittstelle) deaktivieren - SIO0_B fuer Terminalbetrieb aktivieren! KP_INAKTIV: ldb rh0, #%00 ldb PTYPORT, rh0 !Kennzeichnung: Koppelschnittstelle inaktiv! ldb rl0, #%04 !Anzahl der Terminals! ld _numterm, r0 ldb rl0, #%07 outb PIO1C_B, rl0 !Interrupt Koppelschnittstelle aus! calr INIT_CTC0_1 calr INIT_SIO0_B !-----------------------------------------------------------------------------! E0: !SIO0_A initialisieren (fuer LOAD/SEND/QUIT)! calr INIT_CTC0_0 calr INIT_SIO0_A !Ausgabe der Systemmeldung! ei vi call WR_CRLF !Ausgabe CRLF! ld r2, #SYSMSG call WR_MSG !Ausgabe der Systemmeldung! end ENTRY_ !Weiterlauf bei CMDLOP! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE CMDLOP Kommandoeingabeschleife ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL CMDLOP procedure entry ei vi !zusaetzlich! ld r15, #STACK push @r15, #CMDLOP !Rueckkehradresse fuer die Monitorroutinen! ldb rl1, FLAG0 and r1, #%0006 ldb FLAG0, rl1 !set Bit1,2! ldb rl0, PROMT call TYWR !PROMT ausgeben! call RD_LINE_INBFF !Einlesen der eingegebenen Zeile in INBFF; rl0:=1. Zeichen der Eingabezeile ungl. Space; INPTR zeigt auf dieses Zeichen! jr nz, CMDL1 !rl0 ungleich CR! bitb FLAG1, #%02 !Bit 2 = NEXT-Flag! jr z, CMDL1 !kein NEXT-Betrieb! !NEXT-Flag gesetzt und nur CR als Kommando eingegeben! ldb rl0, #'N' !nach Abarbeitung des NEXT-Kommandos kann durch Eingabe von CR in der Kommandoeingabe- schleife das NEXT-Kommando wiederholt werden! ld r1, INPTR ldb INBFF(r1), rl0 !Next-Kommando in Eingabepuffer eintragen! !Berechnen der Zeichenzahl des eingeg. Kommandonamens! CMDL1: resb FLAG1, #%02 !Flag: NEXT-Betrieb ruecksetzen! ld r11, INPTR !Stand INPTR retten (zeigt auf 1. Zeichen)! ld r8, #0 !r8 - Zeichenzaehler des eingeg. Kommandos! CMDL2: call GET_CHR !rl0 := Zeichen, auf das INPTR zeigt, INPTR := INPTR + 1! jr z, CMDL3 !Zeichen = CR! cpb rl0, #' ' jr z, CMDL3 !Zeichen = SPACE! inc r8, #1 !Zeichenzaehler erhoehen! jr CMDL2 !naechstes Zeichen! !Kommando in Kommandoliste suchen! CMDL3: ld r10, #CMD_LISTE !r10 - Zeiger auf akt. Pos. in CMD_LISTE! CMDL4: ld INPTR, r11 !INPTR zeigt auf 1. Zeichen des eingegebenen Kommandos, r8 = Laenge des eingegebenen Kommandos! ld r9, @r10 !r9:=Laenge des akt. Kommandos in CMD_LISTE! cp r9, #%FFFF jr z, ERROR !Ende Kommandoliste, Kommando nicht gefunden! inc r10, #2 !r10 zeigt auf 1. Zeichen des akt. Kommandos in CMD_LISTE! cp r9, r8 jr z, CMDL6 !Kommandolaengen sind gleich! CMDL5: add r10, r9 !Kommandonamen ueberspringen! inc r10, #3 and r10, #%FFFE !Kommandoadresse ueberspringen, r10 zeigt auf naechstes Kommando in CMD_LISTE! jr CMDL4 !naechstes Kommando vergleichen! CMDL6: call GET_CHR !rl0 := Zeichen, auf das INPTR zeigt, INPTR := INPTR + 1! cpb rl0, @r10 !Vergleich der Kommandozeichen! jr nz, CMDL5 !Kommandonamen nicht identisch! inc r10, #1 djnz r9, CMDL6 !naechstes Zeichen! inc r10, #1 and r10, #%FFFE !r10 zeigt auf Adresse der Monitorroutine! ld r2, @r10 jp @r2 !Absprung in die Monitorroutine! end CMDLOP !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE INIT_CTC0_0 Initialisierung CTC0_0 fuer Baudrate SIO0_A ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL INIT_CTC0_0 procedure entry push @r15, r0 ldb rh0, #%57 !kein Int., Zaehler, Vorteiler 16, Zeitkonst.! ldb rl0, #BAUD9600 !Baudrate SIO0 Kanal A! outb CTC0_0, rh0 outb CTC0_0, rl0 pop r0, @r15 ret end INIT_CTC0_0 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE INIT_CTC0_1 Initialisierung CTC0_1 fuer Baudrate SIO0_B ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL INIT_CTC0_1 procedure entry push @r15, r0 ldb rh0, #%57 !kein Int., Zaehler, Vorteiler 16, Zeitkonst.! ldb rl0, #BAUD9600 !Baudrate SIO0 Kanal B! outb CTC0_1, rh0 outb CTC0_1, rl0 pop r0, @r15 ret end INIT_CTC0_1 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE INIT_SIO0_A Initialisierung SIO0_A fuer LOAD/SEND/QUIT ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL INIT_SIO0_A procedure entry push @r15, r0 push @r15, r1 push @r15, r2 ld r2, #ITAB_SIO0_A ld r0, #9 ld r1, #SIO0C_A otirb @r1, @r2, r0 ld r2, #ITAB_SIO0_INTVEK ld r0, #2 ld r1, #SIO0C_B otirb @r1, @r2, r0 pop r2, @r15 pop r1, @r15 pop r0, @r15 ret end INIT_SIO0_A !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE INIT_SIO0_B Initialisierung SIO0_B fuer Terminalbetrieb ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL INIT_SIO0_B procedure entry push @r15, r0 push @r15, r1 push @r15, r2 ld r2, #ITAB_SIO0_B ld r0, #9 ld r1, #SIO0C_B otirb @r1, @r2, r0 ld r2, #ITAB_SIO0_INTVEK ld r0, #2 ld r1, #SIO0C_B otirb @r1, @r2, r0 pop r2, @r15 pop r1, @r15 pop r0, @r15 ret end INIT_SIO0_B !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE ERROR allgemeine Fehlerprozedur Ausgabe von '?' und Sprung in Kommandoeingabeschleife ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL ERROR procedure entry ldb rl0, #'?' call TYWR ld OUTPTR, #0 ld r15, #STACK jp CMDLOP end ERROR !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE UINSTR_ERR Trap-Routine fuer nichtimplementierte Befehle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL UINSTR_ERR procedure entry ld r2, #UINSTR_TXT jp _ERR end UINSTR_ERR UINSTR_TXT: WORD := UINSTR_END - UINSTR_TXT - 2 ARRAY [* BYTE] := 'UNIMPLEMENTED INSTRUCTION TRAP ID= ' UINSTR_END: !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE PINSTR_ERR Trap-Routine fuer priviligierte Befehle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL PINSTR_ERR procedure entry ld r2, #PINSTR_TXT jr _ERR end PINSTR_ERR PINSTR_TXT: WORD := PINSTR_END - PINSTR_TXT - 2 ARRAY [* BYTE] := 'PRIVILEGED INSTRUCTION TRAP ID= ' PINSTR_END: !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE SC_ENTRY SYSTEM-CALL-ENTRY Bei Aufruf eines Unterprogramms ueber System Call: Input: r3 darf keine Eingabewerte fuer das Unterprogramm enthalten Output: r3 enthaelt Wert von r0 nach Ausfuehrung des Unterprogramms (d.h. evtl. in r0 vom Unterprogramm zurueckgegebene Werte werden bei Aufruf ueber System Call in r3 zurueckgegeben) zerstoerte Register : r3 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL SC_ENTRY procedure entry push @r14, r0 ldctl r0, FCW res r0, #%0F ldctl FCW, r0 cpb 3(r15), #1 !SC_01 = segmentierte Arbeitsweise! jr nz, SC_02 set 4(r15), #15 !Segment-Bit im FCW setzen! jr SC_END SC_02: cpb 3(r15), #2 !SC_02 = nichtsegmentierte Arbeitsweise! jr nz, SC_X3 res %04(r15), #15 !Segment-Bit im FCW ruecksetzen! jr SC_END SC_X3: pop r0, @r15 testb 1(r15) !SC_00 = BREAK ?! jr nz, NO_BRK ld SV_R, r0 ldl SVSTK, rr14 ld r15, #STACK call SAVREG inc SVSTK + 2, #8 dec PC_OFF, #%02 dec NXTCTR, #%01 jp nz, GO_NXT ld NXTCTR, #1 call RETI_CTC0_3 ei vi ld r2, #T_BRK !Text: BREAK AT ....! call WR_MSG ld r5, PC_OFF call BTOH16 call WR_OUTBFF_CR jp CMDLOP NO_BRK: push @r15, r0 ldb rh0, 3(r15) !Nummer des SC laden! ldb rl3, rh0 clrb rh3 sub r3, #4 !SC_04 = 1. Adresse in SC_ADR-Liste! ld r3, SC_ADR(r3) !Adresse des UP zur Ausfuehrung des SC laden! ei vi call @r3 !Aufruf des UP! ld r3, r0 SC_END: ldctl r0, FCW set r0, #%0F !segmentierter Mode einstellen! ldctl FCW, r0 pop r0, @r14 iret end SC_ENTRY INTERNAL T_BRK: WORD := %0009 ARRAY [* BYTE] := 'BREAK AT ' !------------------------------------------------------------------------------ Tabelle der Monitorroutinen, die ueber System Calls aufrufbar sind ------------------------------------------------------------------------------! INTERNAL SC_ADR ARRAY [* WORD] := [TYRD TYWR RD_LINE_BFF WR_CRLF WR_MSG BTOH16 WR_OUTBFF_CR BTOH8 PUT_SEGNR PUT_CHR WOCF_MCZ TYWR_MCZ CMDLOP DISK TYRD_UDOS_INT TYWR_UDOS_INT FLOPPY WR_OUTBFF] !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE MMU_ERR Segment-Trap-Routine fuer MMU-Fehler ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL MMU_ERR procedure entry ld r2, #MMU_TXT _ERR: ld r5, @r15 call WR_MSG call BTOH16 call WR_OUTBFF_CR jp CMDLOP end MMU_ERR MMU_TXT: WORD := MMU_END - MMU_TXT - 2 ARRAY [* BYTE] := 'MMU TRAP ID= ' MMU_END: !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE NMI_INT NMI-Routine ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL NMI_INT procedure !Routine wird nach dem ersten Tastendruck in PSAREA aktiviert! entry push @r15, r0 inc r15, #2 !Stackpointer wie vor dem push stellen! ld r0, @r15 !NMI-Identifier lesen! dec r15, #2 bitb rl0, #0 !manuelles NMI? ! jr nz, NMIman !ja! bitb rl0, #2 !Paritaets-NMI? ! jr nz, NMIpar !ja! !------! NMIman: pop r0, @r15 bitb FLAG0, #%00 jr nz, NMI1 !Bit0/Flag0 gesetzt:--> ruecksetzen (empf. Zeichen ist ASCII-Zeichen)! ldl SVSTK, rr14 ld r15, #STACK ld SV_R, r0 call SAVREG !Register im Rettungsbereich eintragen! inc SVSTK + 2, #8 jr NMI2 NMI1: resb FLAG0, #%00 !ruecksetzen! ld r15, #STACK NMI2: ei vi call WR_CRLF !Ausgabe CR LF an Terminal! ld r2, #T_NMI !Ausgabe: 'NMI'! call WR_MSG jp CMDLOP !------! NMIpar: inb rl0, S_BNK ldb rh0, rl0 resb rl0, #3 outb S_BNK, rl0 !Paritaetsfehler ruecksetzen! outb S_BNK, rh0 !Paritaetskontrolle wieder einschalten! ld REM_PARNMI, #%FFFF !Merkerzelle 'Paritaets-NMI aufgetreten' setzen! pop r0, @r15 sc #SC_SEGV iret end NMI_INT INTERNAL T_NMI: WORD := %0005 ARRAY [* BYTE] := 'NMI %0D' !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE NVI_ERR Interrupt-Routine fuer uninitialisierten nichtvektorisierten Interrupt (NVI) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL NVI_ERR procedure entry ld r2, #NVI_TXT jr _ERR end NVI_ERR NVI_TXT: WORD := NVI_END - NVI_TXT - 2 ARRAY [* BYTE] := 'UNINITIALIZED NONVECTORED INTERRUPT ENTRY ID= ' NVI_END: !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE VI_ERR Interrupt-Routine fuer uninitialisierten vektorisierten Interrupt (VI) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL VI_ERR procedure entry ld r2, #VI_TXT jr _ERR end VI_ERR VI_TXT: WORD := VI_END - VI_TXT - 2 ARRAY [* BYTE] := 'UNINITIALIZED VECTORED INTERRUPT ENTRY ID= ' VI_END: END p_init