!****************************************************************************** ******************************************************************************* P8000-Firmware (C) ZFT/KEAW Abt. Basissoftware - 1987 U8000-Softwaremonitor (MON16) Modul: p_boot Bearbeiter: J. Zabel Datum: 16.11.1987 Version: 3.0 ******************************************************************************* ******************************************************************************! !============================================================================== Inhaltsuebersicht Modul p_boot ------------------------------ Dieser Modul umfasst die Monitorroutine zum manuellen Start des WEGA-Systems (O) sowie die NMI-Routine zum automatischen Start des WEGA-Systems. Prozeduren ---------- AUTOBOOT OS_BOOT DSK_BOOT FLP_BOOT UDOS_BOOT RM_BOOT ==============================================================================! p_boot module $SECTION PROM !anfang mon16.include! !****************************************************************************** allgemeine Vereinbarungen (Stand: 16.11.1987) ******************************************************************************! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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! OS_BOOT procedure !Modul p_boot! AUTOBOOT procedure !Modul p_boot! DISK procedure !Modul p_disk! ! 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 ! 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 interruptgesyeuerten 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 VI_ERR] (vorher MCZ_INT) VI Zeichen empfangen (fuer MCZ-Eingabe)! ARRAY [2 WORD] !:= [%8000 VI_ERR] (vorher 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 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 _serial LONG := %00000000 INTERNAL T_DSK_BOOT WORD := %0017 ARRAY [* BYTE] := 'BOOTING FROM HARD DISK%0D' T_FLP_BOOT WORD := %0014 ARRAY [* BYTE] := 'BOOTING FROM FLOPPY%0D' T_UDOS_BOOT WORD := %0019 ARRAY [* BYTE] := 'BOOTING FROM UDOS FLOPPY%0D' T_RM_BOOT WORD := %000F ARRAY [* BYTE] := 'BOOTING REMOTE%0D' CONSTANT BOOT0_START := %8000 !Lade- und Startadresse fuer "boot0"! BOOT0_FILETYP := %01 !binary file/keine Uebertragung des Datei- descriptors! INTERNAL BOOT0_UDOS_FILENAME ARRAY [* BYTE] := 'boot0.ud%00' BOOT0_RM_FILENAME ARRAY [* BYTE] := 'boot0.rm%00' TXT_ABO WORD := 6 ARRAY [* BYTE] := 'ABORT%0D' !****************************************************************************** Prozeduren ******************************************************************************! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE AUTOBOOT automatisches Laden und Starten "boot0" von DISK (Block 0) NMI-Routine (vor erster Terminaleingabe) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL AUTOBOOT procedure entry call TEST_ !Hardwareeigentest! ld r4, r2 !R4=0 =AUTOMATIC BOOT / R4=1 MANUAL BOOT! test r2 jr z, DSK_BOOT !r4=0! !Hardwareeigentest war fehlerhaft --> kein WEGA-Start: NMI-Entry in PSAREA aendern, PROMT setzen und Rueckkehr in Kommandoeingabeschleife! ld PSA_NMI+6, #NMI_INT !NMI_ENTRY in PSAREA: - nach RESET steht dort #AUTOBOOT, d.h. bei NMI erfolgt Abarbeitung von #AUTOBOOT - nach Eingabe des ersten Zeichens vom Terminal (Abarbeitung von PTY_INT oder KOPPEL_INT) bzw. nach Abarbeitung von #AUTOBOOT wird #AUTOBOOT durch #NMI_INT ersetzt, d.h. bei NMI erfolgt jetzt Abarbeitung von #NMI_INT ! ld PROMT, #'* ' ei vi jp CMDLOP end AUTOBOOT !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE OS_BOOT OS_BOOT-Routine (Monitorkommando) manuelles BOOT von HARD DISK, FLOPPY, UDOS FLOPPY bzw. REMOTE Kommandoeingabe: O D/F/U/R ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! GLOBAL OS_BOOT procedure entry call GET_SIGN !rl0:=naechstes Zeichen ungleich Space nach einem Space im Eingabepuffer INBFF! jp z, ERROR !CR eingegeben! cpb rl0, #'D' !FROM HARD DISK ? ! jr z, OS_BOOT_DSK cpb rl0, #'F' !FROM FLOPPY ? ! jr z, OS_BOOT_FLP cpb rl0, #'U' !FROM UDOS FLOPPY ? ! jr z, OS_BOOT_UDOS cpb rl0, #'R' !FROM REMOTE ? ! jr z, OS_BOOT_REM jp ERROR !nicht 'D','F','U','R' als Parameter angegeben! OS_BOOT_DSK: ld r2, #T_DSK_BOOT call WR_MSG ld r4, #1 !MANUEL BOOT FROM DISK! jr DSK_BOOT OS_BOOT_FLP: ld r2, #T_FLP_BOOT call WR_MSG ld r4, #1 !MANUEL BOOT FROM FLOPPY! jp FLP_BOOT OS_BOOT_UDOS: ld r2, #T_UDOS_BOOT call WR_MSG ldl rr6, _serial ld r5, _numterm !Anzahl der Terminals! ld r4, #1 !MANUEL BOOT FROM UDOS FLOPPY! jr UDOS_BOOT OS_BOOT_REM: ld r2, #T_RM_BOOT call WR_MSG ldl rr6, _serial ld r5, _numterm !Anzahl der Terminals! ld r4, #1 !MANUEL BOOT FROM REMOTE! jp RM_BOOT end OS_BOOT !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE DSK_BOOT Laden und Starten "boot0" von DISK (Block 0) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL DSK_BOOT procedure entry ld r0, #%4000 ldctl FCW, r0 PUSH @R15, R4 !MANUELL OR AUTO BOOT MERKEN! LD R7, #1 !READ_REQUEST! LD R6, #0 !DRIVE NR.! ld r8, #%8000 !Pufferadresse - Segment 0! ld r9, #BOOT0_START!Pufferadresse - Offset! LDL RR4, #0 !BLOCKNR.! LD R10, #%200 !BLOCKLAENGE! SC #SC_DISK !r2 - Rueckgabeparameter! LDL RR6, _serial LD R5, _numterm !ANZAHL DER TERMINALS! POP R4, @R15 TEST r2 !r2=0 --> fehlerfrei! jp z, BOOT0_START !"boot0" starten! push @r15, r2 ld r2, #T_HD_ERR sc #SC_WR_MSG !Textausgabe! pop r5, @r15 !rl5:=Returncode! call BTOH8 !rl5 (ASCII) in OUTBFF eintragen! sc #SC_WR_OUTBFF_CR !Ausgabe des Returncodes! jp CMDLOP end DSK_BOOT T_HD_ERR: WORD := %10 ARRAY [* BYTE] := 'HARD DISK ERROR ' !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE FLP_BOOT Laden und Starten "boot0" von Floppy (blockorientierte Diskette, Block 0, Drive 0, Floppytyp 6) (ueber 8-Bit-/16-Bit-Koppelschnittstelle) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! INTERNAL FLP_BOOT procedure entry cpb PTYPORT, #%02 !8-Bit-Teil aktiv und UDOS verfuegbar?! jp nz, ERROR !nein --> Kommando nicht ausfuehrbar! ld r0, #%4000 ldctl FCW, r0 PUSH @R15, R4 !MANUELL BOOT MERKEN! LD R7, #1 !READ_REQUEST! ld r6, #%60 !Floppytyp 6/Drive 0! ld r8, #%8000 !Pufferadresse - Segment 0! ld r9, #BOOT0_START!Pufferadresse - Offset! LDL RR4, #0 !BLOCKNR.! LD R10, #%200 !BLOCKLAENGE! SC #SC_FLOPPY !r2 - Rueckgabeparameter! LDL RR6, _serial LD R5, _numterm !ANZAHL DER TERMINALS! POP R4, @R15 TEST r2 !r2=0 --> fehlerfrei! jp z, BOOT0_START !"boot0" starten! push @r15, r2 ld r2, #T_FLP_ERR sc #SC_WR_MSG !Textausgabe! pop r5, @r15 !rl5:=Returncode! call BTOH8 !rl5 (ASCII) in OUTBFF eintragen! sc #SC_WR_OUTBFF_CR !Ausgabe des Returncodes! jp CMDLOP end FLP_BOOT T_FLP_ERR: WORD := 13 ARRAY [* BYTE] := 'FLOPPY ERROR ' !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE UDOS_BOOT Laden und Starten "boot0.ud" von UDOS-Floppy (ueber 8-Bit-/16-Bit-Koppelschnittstelle) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! !rr4 und rr6 enthalten Parameter nicht benutzen! INTERNAL UDOS_BOOT procedure entry cpb PTYPORT, #%02 !8-Bit-Teil aktiv und UDOS verfuegbar?! jp nz, ERROR !nein --> Kommando nicht ausfuehrbar! clr COUNT_UDOS clr INPTR_UDOS clr OUTPTR_UDOS !Startmeldung an 8-Bit-Teil senden (Datenbyte: "S")! ldb rl0, #'S' !Datenbyte: 8-Bit-Teil soll Datei senden! sc #SC_TYWR_UDOS_INT sc #SC_TYRD_UDOS_INT !acknowledge! !Ausgabe Filetyp an 8-Bit-Teil! ldb rl0, #BOOT0_FILETYP sc #SC_TYWR_UDOS_INT sc #SC_TYRD_UDOS_INT !acknowledge! !Ausgabe Dateinamen an 8-Bit-Teil! ldb rh1, #10 !retries! flpo0: ldb rl1, #0 !Checksumme init! ld r8, #BOOT0_UDOS_FILENAME ldb rl0, #STX !Start of Text! sc #SC_TYWR_UDOS_INT flpo1: ldb rl0 ,@r8 !Zeichen von filename! inc r8, #1 cpb rl0, #0 !ende filename ?! jr z, flpo2 !ja! xorb rl1, rl0 !Checksumme berechnen! sc #SC_TYWR_UDOS_INT jr flpo1 flpo2: ldb rl0, #ETX !end of text! sc #SC_TYWR_UDOS_INT exb rl0, rl1 sc #SC_TYWR_UDOS_INT !Checksumme ausgeben! sc #SC_TYRD_UDOS_INT !Warten auf Quittung! resb rl3, #7 cpb rl3, #ACK jr z, flpread !filename richtig uebertragen file vorhanden! cpb rl3, #CAN !Abbrechen ?! jr z, flperror dbjnz rh1, flpo0 !naechster Versuch! !Uebertragungsfehler! flperror: ld r2, #TXT_ABO sc #SC_WR_MSG !Textausgabe! ldb rl0, #CAN !Abbruch senden! sc #SC_TYWR_UDOS_INT sc #SC_TYRD_UDOS_INT ret !Einlesen aller Bloecke mit den Daten der Datei! flpread: ld r9, #BOOT0_START !Speicheranfangsadresse fuer "boot0"! flpread1: !Schleife: Lesen eines Blockes! ldb rh1, #10 !retries! flpr0: !Schleife: Wdhl. des Lesens eines Blockes! ldb rl1, #0 !Checksumme init! ld r8, r9 !Buffer Pointer retten! sc #SC_TYRD_UDOS_INT resb rl3, #7 cpb rl3, #EOT !Ende der Uebertragung?! jr nz, flpr01 !nein! sc #SC_TYRD_UDOS_INT !noch 1 Zeichen im Puffer! jp BOOT0_START !file geladen Sprung zum boot0! flpr01: cpb rl3, #CAN jr z, flperror !Abbruch von 8-Bit-Teil! cpb rl3, #STX !Start of text muss 1.Zeichen sein! jr nz, flpr2 !warten auf ETX und Uebertragung wiederholen! sc #SC_TYRD_UDOS_INT ldb rh2, rl3 sc #SC_TYRD_UDOS_INT ldb rl2, rl3 !r2 := Laenge des Blockes! flpr1: !Scheife: Eingabe aller Daten eines Blockes! sc #SC_TYRD_UDOS_INT !Daten lesen! ldb @r9, rl3 !in Buffer! inc r9, #1 xorb rl1, rl3 !Checksumme berechnen! djnz r2, flpr1 flpr2: !Schleife: Warten auf ETX! sc #SC_TYRD_UDOS_INT resb rl3, #7 cpb rl3, #ETX jr nz, flpr2 sc #SC_TYRD_UDOS_INT !Checksumme! cpb rl3, rl1 !uebertragene = berechnete ?! jr nz, flpr3 !Fehler! ldb rl0, #ACK !richtig uebertragen Qittung ok geben! sc #SC_TYWR_UDOS_INT jr flpread1 !und naechsten Block einlesen! flpr3: decb rh1, #1 jr z, flperror !Abbruch! ld r9, r8 !Buffer Pointer auf Anfang zurueck! ldb rl0, #NAK !n mal wiederholen! sc #SC_TYWR_UDOS_INT jr flpr0 !Wiederholung der Blockuebertragung! end UDOS_BOOT !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCEDURE RM_BOOT Laden und Starten "boot0.rm" ueber "remote" des lokalen Systems ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! !rr4 und rr6 enthalten Parameter nicht benutzen! INTERNAL RM_BOOT procedure entry setb FLAG0, #0 !Abschalten xon xoff! !Startmeldung (SOH, ESC, 'S') an local senden! ldk r0, #SOH !Kommando Send file an local! sc #SC_TYWR ldb rl0, #ESC sc #SC_TYWR ldb rl0, #'S' sc #SC_TYWR sc #SC_TYRD !acknowledge von local! !Ausgabe Filetyp an local! ldb rl0, #BOOT0_FILETYP sc #SC_TYWR sc #SC_TYRD !acknowledge von local! !Ausgabe Dateinamen an local! ldb rh1, #10 !retries! rmo0: ldb rl1, #0 !Checksumme init! ld r8, #BOOT0_RM_FILENAME ldb rl0, #STX !Start of Text! sc #SC_TYWR rmo1: ldb rl0, @r8 !Zeichen von filename! inc r8, #1 cpb rl0, #0 !ende filename ?! jr z, rmo2 !ja! xorb rl1, rl0 !Checksumme berechnen! sc #SC_TYWR jr rmo1 rmo2: ldb rl0, #ETX !end of text! sc #SC_TYWR exb rl0, rl1 sc #SC_TYWR !Checksumme ausgeben! sc #SC_TYRD !Warten auf Quittung! resb rl3, #7 cpb rl3, #ACK jr z, rmread !filename richtig uebertragen file vorhanden! cpb rl3, #CAN !Abbrechen ?! jr z, rmerror dbjnz rh1, rmo0 !naechster Versuch! !Uebertragungsfehler! rmerror: ld r2, #TXT_ABO sc #SC_WR_MSG !Textausgabe! ldb rl0, #CAN !Abbruch senden! sc #SC_TYWR sc #SC_TYRD resb FLAG0, #0 ret !Einlesen aller Bloecke mit den Daten der Datei! rmread: ld r9, #BOOT0_START !Speicheranfangsadresse fuer "boot0"! rmread1: !Schleife: Lesen eines Blockes! ldb rh1, #10 !retries! rmr0: !Schleife: Wdhl. des Lesens eines Blockes! ldb rl1, #0 !Checksumme init! ld r8, r9 !Buffer Pointer retten! sc #SC_TYRD resb rl3, #7 cpb rl3, #EOT !Ende der Uebertragung?! jr nz, rmr01 !nein! sc #SC_TYRD !noch 1 Zeichen im Puffer! resb FLAG0, #0 jp BOOT0_START !file geladen Sprung zum boot0! rmr01: cpb rl3, #CAN jr z,rmerror !local gibt Abbruch! cpb rl3, #STX !Start of text muss 1.Zeichen sein! jr nz, rmr2 !warten auf ETX und Uebertragung wiederholen! sc #SC_TYRD ldb rh2, rl3 sc #SC_TYRD ldb rl2, rl3 !r2 := Laenge des Blockes! rmr1: !Schleife: Eingabe aller Daten eines Blockes! sc #SC_TYRD !Daten lesen! ldb @r9, rl3 !in Buffer! inc r9, #1 xorb rl1, rl3 !Checksumme berechnen! djnz r2, rmr1 rmr2: sc #SC_TYRD !warten auf ETX! resb rl3, #7 cpb rl3, #ETX jr nz, rmr2 sc #SC_TYRD !Checksumme! cpb rl3, rl1 !uebertragene = berechnete ?! jr nz, rmr3 !Fehler! ldb rl0, #ACK !richtig uebertragen Qittung ok geben! sc #SC_TYWR jr rmread1 !und naechsten Block einlesen! rmr3: decb rh1, #1 jr z, rmerror !Abbruch! ld r9, r8 !Buffer Pointer auf Anfang zurueck! ldb rl0, #NAK !n mal wiederholen! sc #SC_TYWR jr rmr0 end RM_BOOT end p_boot