From b2075be9e7c18433d842a6250a983211a23338f9 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Thu, 21 Dec 1989 08:07:03 +0000 Subject: [PATCH] standalone import --- WEGA/src/cmd/standalone/sa.diags/boot.s | 887 +++++ WEGA/src/cmd/standalone/sa.diags/brk.s | 1139 ++++++ WEGA/src/cmd/standalone/sa.diags/comm.s | 1280 +++++++ WEGA/src/cmd/standalone/sa.diags/disk.s | 184 + WEGA/src/cmd/standalone/sa.diags/init.s | 1496 ++++++++ WEGA/src/cmd/standalone/sa.diags/menu.c | 372 ++ WEGA/src/cmd/standalone/sa.diags/misc.c | 270 ++ WEGA/src/cmd/standalone/sa.diags/ram.s | 301 ++ WEGA/src/cmd/standalone/sa.diags/sa.test.s | 3929 ++++++++++++++++++++ WEGA/src/cmd/standalone/sa.diags/twem.s | 1008 +++++ WEGA/src/cmd/standalone/sa.diags/wdc.s | 281 ++ 11 files changed, 11147 insertions(+) create mode 100644 WEGA/src/cmd/standalone/sa.diags/boot.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/brk.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/comm.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/disk.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/init.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/menu.c create mode 100644 WEGA/src/cmd/standalone/sa.diags/misc.c create mode 100644 WEGA/src/cmd/standalone/sa.diags/ram.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/sa.test.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/twem.s create mode 100644 WEGA/src/cmd/standalone/sa.diags/wdc.s diff --git a/WEGA/src/cmd/standalone/sa.diags/boot.s b/WEGA/src/cmd/standalone/sa.diags/boot.s new file mode 100644 index 0000000..c038a41 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/boot.s @@ -0,0 +1,887 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986 + P8000-PROM (MONITOR) Modul: p_boot + + Bearbeiter: J. Zabel + Datum: 15.04.1987 + Version: 2.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 prom.include! +!****************************************************************************** +allgemeine Vereinbarungen (Stand: 12.12.1986) +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 ZLOAD/ZSEND! +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! + 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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%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)! + ARRAY [%36 WORD] !unbenutzt! +!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): 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 - Clear Parity + 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 U800-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 prom.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 nz, ERROR + + jp BOOT0_START !"boot0" starten! + end DSK_BOOT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 nz, ERROR + + jp BOOT0_START !"boot0" starten! + end FLP_BOOT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 diff --git a/WEGA/src/cmd/standalone/sa.diags/brk.s b/WEGA/src/cmd/standalone/sa.diags/brk.s new file mode 100644 index 0000000..83456ee --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/brk.s @@ -0,0 +1,1139 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986 + P8000-PROM (MONITOR) Modul: p_brk + + Bearbeiter: J. Zabel + Datum: 12.12.1986 + Version: 1.0 + +******************************************************************************* +******************************************************************************! + +!============================================================================== +Inhaltsuebersicht Modul p_brk +----------------------------- +Dieser Modul umfasst Monitorroutinen zur Programmtestung (R, B, G, N,) + +Prozeduren +---------- +REGISTER +WR_REGBEZ1 +WR_REGBEZ2 +WR_WERTE1 +WR_WERTE2 + +SAVREG +GETREG + +BREAK + +GO +GO_NXT +GO_INT + +NEXT +NXT_INT + +RETI_CTC0_3 +==============================================================================! + + +p_brk module + +$SECTION PROM + +!anfang prom.include! +!****************************************************************************** +allgemeine Vereinbarungen (Stand: 12.12.1986) +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 ZLOAD/ZSEND! +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! + 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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%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)! + ARRAY [%36 WORD] !unbenutzt! +!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): 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 - Clear Parity + 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 U800-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 prom.include! + + +!****************************************************************************** +Prozeduren +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE REGISTER +REGISTER-Routine (Monitorkommando) +Registerinhalte anzeigen und veraendern + +Kommandoeingabe: R [ [R]0,...,[R]15; [R]L0,...,[R]L7; [R]H0,...,[R]H7; + RR0, RR2, RR4, RR6, RR8, RR10, RR12, RR14; + [R]PC, FC, [R]RF, [R]N4, [R]N5, [R]PS, [R]PO ] +(wenn keine Parameter angegeben, dann Anzeige aller Register) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + REGISTER procedure + entry + call GET_SIGN !rl0:=1.Zeichen ungleich Space aus INBFF! + jp z, ALL_RG !keine Parameter angegeben --> + alle Registerinhalte ausgeben! + cpb rl0, #'R' + jr nz, RG1 !1. Zeichen beginnt nicht mit 'R'! + + call GET_CHR !rl0 := 2. Zeichen! + jr z, R_ERROR !kein weiteres Zeichen angegeben! + + cpb rl0, #'F' + jr nz, RG1 !2. Zeichen ungleich 'F'! + + ldb rh1,#'R' !1. Zeichen bei 'RF'! + jr RG6 + +RG1: + clr r6 !r6=0 bei 'RL'-Register! + cpb rl0, #'L' + jr z, R_L + inc r6, #%02 !r6=2 bei 'RH'-Register! + cpb rl0, #'H' + jr z, R_L + inc r6, #%04 !r6=6 wenn nicht 'RL', 'RH' oder 'RR'-Reg.! + cpb rl0, #'R' + jr nz, RG5 !kein 'RL', 'RH', 'RR'-Register! + dec r6, #%02 !r6=4 bei 'RR'-Register! +R_L: + call GET_CHR !rl0:=naechstes Zeichen + (=Registernummer 0-15, 1.Zeichen)! + jr z, R_ERROR !keine Registernummer angegeben! + +RG5: + ldb rh1, rl0 !rh1:=Registerbez. (siehe R_BEZ) 1. Zeichen! + call GET_CHR !rl0 := 2. Zeichen der Registerbez.! + jr nz, RG6 !2. Zeichen des Registerbezeichnung vorh.! + + ldb rl0, #' ' !nur einzeichige Registerbezeichnung! +RG6: + ldb rl1, rl0 !rl1:=Registerbez. (siehe R_BEZ) 2. Zeichen! + ld r7, #%0018 + ld r8, #R_BEZ + 46 + cpdr r1, @r8, r7, z !Registerbez. (in r1) in Tabelle R_BEZ suchen! + jr nz, R_ERROR !Falsche Registerbezeichnung! + + inc r8, #%02 !r8 zeigt auf Reg.-bez.! + add r7, r7 !r7:= rel. Adr. bzgl. R_BEZ! + cpb rl6, #%04 + jr c, RG17 !'RL' bzw. 'RH'-Reg.! + jr z, RG13 !'RR'-Reg.! + +!Schleife fuer {kein RL*, RH*, RR* - Register}! + +!ab aktuellen Register werden die Register entsprechend der Tabelle R_BEZ + abgearbeitet (Anzeige Inhalt + Dateneingabe)! + +RG8: + ld r1, #'R ' + call PUT_2CHR + dec OUTPTR, #1 + ld r1, @r8 + call PUT_2CHR + inc OUTPTR, #1 + ld r5, SV_R(r7) + call WR_R5_RDDATA + ret c !'Q' eingegeben! + jr z, RG12 + ld r2, @r8 + cp r2, #'PC' + jr nz, RG9 + res r3, #%0 + jr RG11 + +RG9: + cp r2, # 'RF' + jr nz, RG10 + ldctl REFRESH, r3 +RG10: + cp r2, #'SG' + jr nz, RG11 + cpb rh3, #%0 + jr nz, RG11 + ldb rh3, rl3 + clrb rl3 +RG11: + ld SV_R(r7), r3 +RG12: + inc r7, #%02 + inc r8, #%02 + cp r8, #R_BEZ + 47 + jr c, RG8 + ret !alle Register abgearbeitet! + +R_ERROR: + jp ERROR + +!Schleife fuer RR* - Register! + +!ab aktuellen Register werden alle Register in der Reihenfolge + RR0 ... RR14 abgearbeitet! + +RG13: + cp r8, #R_BEZ + 30 + jr nc, R_ERROR + + cpb rl1, #' ' + jr z, RG14 !einzeichige Registerbezeichnung! + bit r1, #%0 + jr RG_ERR +RG14: + bit r1, #%08 +RG_ERR: + jr nz, R_ERROR !Registerbezeichnung nicht gerade (0-14)! +RG15: + ld r1, #'RR' + call PUT_2CHR + ld r1, @r8 + call PUT_2CHR + inc OUTPTR, #1 + ld r5, SV_R(r7) + call BTOH16 + ld r5, SV_R + 2(r7) + call WR_R5_RDDATA + ret c !'Q' eingegeben! + jr z, RG16 + ld SV_R(r7), r2 + ld SV_R + 2(r7), r3 +RG16: + inc r7, #%04 + inc r8, #%04 + cp r8, #R_BEZ + 31 + jr c, RG15 + ret !alle Register abgearbeitet! + +!Schleife fuer RL* bzw. RH* - Register! + +!ab aktuellen Register werden alle Register in der Reihenfolge + RH0, RL0,...,RH7, RL7 abgearbeitet! + +RG17: + cp r8, #R_BEZ + 16 + jr nc, R_ERROR + + test r6 + jr nz, RG18 + inc r7, #1 +RG18: + ld r1, R_LH(r6) !r1:=Registerbezeichnung (RH bzw. RL)! + call PUT_2CHR + ld r1, @r8 + call PUT_2CHR + ldb rl5, SV_R(r7) + call BTOH8 + inc OUTPTR, #1 + call WR_OBF_RDDATA + ret c + jr z, RG19 + ldb SV_R(r7), rl3 +RG19: + inc r7, #1 + dec r6, #%02 + jr z, RG18 + inc r6, #%04 + inc r8, #%02 + cp r8, #R_BEZ + 16 + jr c, RG18 + ret !alle Register angegeben! + +!Alle Registerinhalte anzeigen! + +ALL_RG: + calr WR_REGBEZ1 + CALR WR_WERTE1 + CALR WR_REGBEZ2 + jr WR_WERTE2 + end REGISTER + +!Registerbezeichnungen! + + INTERNAL +R_BEZ ARRAY [* BYTE] := '0 1 2 3 4 5 6 7 8 9 101112131415SGPCFCRFN4N5PSPO' +R_LH ARRAY [* BYTE] := 'RLRH' + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_REGBEZ1 +Ausgabe der Registerbezeichnungen 1. Zeile +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + WR_REGBEZ1 procedure + entry + ldk r0, #%0C + ld r4, #R_BEZ + ldk r6, #%08 + ld r8, #R_BEZ + 30 +L_B1: + ld r3, OUTPTR + ldb OUTBFF(r3), #'R' +L_B2: + inc OUTPTR, #1 + ld r1, @r4 + call PUT_2CHR + dec r0, #1 + jp z, WR_OUTBFF_CR + dec r6, #1 + jr nz, L_B3 + ld r4, r8 +L_B3: + inc r4, #%02 + cp r6, #0 + jr gt, L_B4 + inc OUTPTR, #%04 + jr L_B2 +L_B4: + inc OUTPTR, #%02 + jr L_B1 + end WR_REGBEZ1 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_REGBEZ2 +Ausgabe der Registerbezeichnungen 2. Zeile +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + WR_REGBEZ2 procedure + entry + ldk r0, #%0C + ld r4, #R_BEZ + 16 + ld r8, #R_BEZ + 38 + ldk r6, #%08 + jr L_B1 + end WR_REGBEZ2 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_WERTE1 +Ausgabe der Registerwerte 1. Zeile +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + WR_WERTE1 procedure + entry + ldk r2, #%0C + ld r6, #SV_R + ldk r8, #%08 + ld r10, #SVSTK + 2 +L_W1: + ld r5, @r6 + call BTOH16 + dec r2, #1 + jp z, WR_OUTBFF_CR + dec r8, #1 + jr nz, L_W2 + ld r6, r10 +L_W2: + inc r6, #%02 + cp r8, #0 + jr gt, L_W3 + inc OUTPTR, #%03 + jr L_W1 +L_W3: + inc OUTPTR, #1 + jr L_W1 + end WR_WERTE1 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_WERTE2 +Ausgabe der Registerwerte 2. Zeile +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + WR_WERTE2 procedure + entry + ldk r2, #%0C + ld r6, #SV_R + %10 + ldk r8, #%08 + ld r10, #RF_CTR + jr L_W1 + end WR_WERTE2 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SAVREG +Registerrettung +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + SAVREG procedure + entry + ldl RR14_V, rr14 !ORIGINAL STACKWERTE IN SAV BEREICH UMLADEN! + ldl rr14, SVSTK + ld r0, r15(#0) !IDENTIFIER LADEN! + ld RR14_V + 4, r0 + ld r0, r15(#%2) !FCW LADEN! + ld FCW_, r0 + ld r0, r15(#%4) !SEGMENTADRESSE LADEN! + ld PC_SEG, r0 + ld r0, r15(#%6) !OFFSET LADEN! + ld PC_OFF, r0 + sc #SC_SEGV + ldctl r0, NSPSEG + + sc #SC_NSEGV + ld RF_CTR + 2, r0 + ldctl r0, NSPOFF + + ld RF_CTR + 4, r0 + sc #SC_SEGV + ldctl r0, PSAPSEG + + sc #SC_NSEGV + ld PS_, r0 + ldctl r15, PSAP + + ld PO_, r15 + ldctl r15, REFRESH + + ld RF_CTR, r15 + ld r15, #SV_R + 2 + ldm @r15, r1, #%0D !REGISTERWERTE RETTEN! + ldl rr14, RR14_V + ret + end SAVREG + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE GETREG +Register-Lade-Routine +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + GETREG procedure + entry + ldl RR14_V, rr14 + ldl rr14, SVSTK + dec r15, #%08 + ld r1, W23B4 + ld r15(#%0000), r1 + ld r1, FCW_ + ld r15(#%0002), r1 + ld r1, PC_SEG + ld r15(#%0004), r1 + ld r1, PC_OFF + ld r15(#%0006), r1 + ld r1, N4_ + sc #SC_SEGV + ldctl NSPSEG, r1 + sc #SC_NSEGV + ld r1, N5_ + ldctl NSP, r1 + ld r1, PS_ + sc #SC_SEGV + ldctl PSAPSEG, r1 + sc #SC_NSEGV + ld r1, PO_ + ldctl PSAPOFF, r1 + ld r15, #SV_R + ldm r0, @r15, #%0E + ldl rr14, RR14_V + ret + end GETREG + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE BREAK +BREAKPOINT-Routine (Monitorkommando) +Setzen bzw. Loeschen eines Unterbrechungspunktes + +Kommandoeingabe: B [offset [count]] + (BREAK-Adresse Schleifenanzahl) +(wird kein Parameter angegeben, wird Unterbrechungspunkt geloescht) +Fehler, wenn Unterbrechungspunkt nicht im RAM liegt +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + BREAK procedure + entry + ldl rr2, B_ADR_S !rr2:=BREAK-Adresse! + ld r1, B_WORD !r1:=urspruenglicher Inhalt auf BREAK-Adresse! + sc #SC_SEGV + ld @r2, r1 !BREAK_WORD ZURUECKLADEN! + sc #SC_NSEGV + + clr B_ADR_S !BREAK-Adresse loeschen! + clr B_ADR_O + clr B_WORD + + ld NXTCTR, #1 !IMPLIZIT 1 ALS Schleifenzaehler FESTLEGEN! + call GET_SIGN !rl0:=1. Zeichen ungleich Space nach + naechstem Space im Eingabepuffer INBFF! + RET Z !RUECKSPRUNG WENN kein Parameter angegeben! + + call GET_ADR !rr2 := BREAK_ADRESSE ! + ldl rr4, rr2 + jr z, BR1 !Schleifenzaehler NICHT ANGEGEBEN! + + call GET_HEXZ !r3:=Schleifenanzahl! + test r3 + jr z, BR1 !angegebene Schleifenanzahl=0! + + ld NXTCTR, r3 !eingegebene Schleifenanzahl in Schleifen- + zaehler NXTCTR laden! + +BR1: + ldl rr2, rr4 + res r3, #%00 !rr2:=gerade BREAK-Adresse! + ldl B_ADR_S, rr2 !BREAK_ADRESSE RETTEN! + ld r1, B_CODE !Unterbrechungscode! + sc #SC_SEGV + ex r1, @r2 !r1:=Inhalt auf der BREAK-Adresse; + BREAK-Adresse mit Unterbrechungscode laden! + ld r4, r1 + ld r1, @r2 + sc #SC_NSEGV + ld B_WORD, r4 !urspruenglichen Inhalt auf BREAK-Adr. retten! + cp r1, B_CODE !wurde Unterbrechungscode auf BREAK-Adresse + eingetragen, d.h. liegt BREAK-Adr. im RAM?! + ret z !ja! + + ld NXTCTR, #1 + clr B_ADR_S !BREAK-Adresse loeschen! + clr B_ADR_O + clr B_WORD + jp ERROR !BREAK-Adresse liegt nicht im RAM! + end BREAK + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE GO +GO-Routine (Monitorkommando) +Programmabarbeitung bei eingegebener Ansprungadresse bzw. beim +aktuellen PC-Stand starten + +Kommandoeingabe: GO [offset] + (Ansprungadresse) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + GO procedure + entry + call GET_SIGN !rl0:=1.Zeichen ungleich Space nach naechstem + Space im Eingabepuffer INBFF! + jr z, GO_PC !keine Ansprungadresse vorhanden! + + call GET_ADR !rr2:=Ansprungadresse! + res r3, #%00 !Adresse muss gerade sein! + ldl PC_SEG, rr2 !PC_SEG/PC_OFF := Ansprungadresse! + +GO_PC: + ldl rr2, PC_SEG !rr2:=Startadresse! + cpl rr2, B_ADR_S !=BREAK-Adresse?! + jr z, GO_NXT !ja! + + calr GETREG !Register laden! + ldl rr14, SVSTK + dec r15, #8 + sc #SC_SEGV + iret !Programm starten! + end GO + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE GO_NXT +Abarbeitung des naechsten Befehls, wenn auf diesem Befehl Unterbrechungspunkt +steht +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + GO_NXT procedure + entry + ldl rr2, B_ADR_S !rr2:=BREAK-Adresse! + ld r1, B_WORD !r1:=urspruenglicher Inhalt der BREAK-Adresse! + sc #SC_SEGV + ld @r2, r1 !BREAK-Inhalt wird zurueckgeladen, um den + Befehl abarbeiten zu koennen! + sc #SC_NSEGV + ld r2, #GO_INT !Adresse der VI-Routine: + Interrup erfolgt nach Abarbeitung des Befehls; + in der GO_INT - Routine wird dann der Unter- + brechungspunkt wieder gesetzt! + +G2: + di vi + + ld VI_CTC0_3+2, r2 !Adresse der VI-Routine eintragen! + calr GETREG !REGISTER ZURUECKLADEN! + ldl rr14, SVSTK + dec r15, #8 + sc #SC_SEGV + push @r14, r1 + ld r1, r14(#%0004) !FCW_V AUS DEM STACK LADEN! + sc #SC_NSEGV + ld FCW_V, r1 + or r1, #%1000 !VIE BIT IM FCW SETZEN! + sc #SC_SEGV + ld r14(#%0004), r1 + sc #SC_NSEGV + +!CTC als Zaehler programmieren - Interrupt nach Abarbeitung des kommenden +Befehls im zu testenden Programm! + CLRB RL1 + OUTB CTC0_0, RL1 !Interruptvektor in den CTC laden! + LDB RL1, #%C7 !Zaehlermode! + OUTB CTC0_3, RL1 + LD R1, STKCTR !4 Stackoperationen! + OUTB CTC0_3,RL1 !Zeitkonstante! + + ldctl r1, FCW + set r1, #%0F !SEG BIT IM FCW SETZEN! + ldctl FCW, r1 + + pop r1, @r14 + iret !Programmstart! + end GO_NXT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE GO_INT +VI-Routine fuer GO +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + GO_INT procedure + entry + push @r15, r2 + push @r15, r1 + calr RETI_CTC0_3 !Interruptquelle ausschalten! + ldl rr2, B_ADR_S + ld r1, B_CODE + sc #SC_SEGV + ld @r2, r1 !Unterbrechungspunkt wieder setzen! + sc #SC_NSEGV + bit FCW_V, #%0C + jr nz, G_VIE !VIE BIT GESETZT ? ! + ld r2, r15(#%6) + res r2, #%0C + ld r15(#%0006), r2 +G_VIE: + pop r1, @r15 + pop r2, @r15 + sc #SC_SEGV + iret + + end GO_INT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE NEXT +NEXT-Routine (Monitorkommando) +Abarbeitung einer bestimmten Anzahl von Befehlen + +Kommandoeingabe: N [count] + (Anzahl der Befehle (implizit %1)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + NEXT procedure + entry + setb FLAG1, #%02 !Next-Betrieb! + !dient in Kommandoeingabeschleife zur Kenn- + zeichnung, ob letztes Kommando NEXT-Kommando + war; wenn ja, kann Next-Kommando durch + Eingabe von nur CR wiederholt werden! + + call GET_SIGN !rl0:=1. Zeichen ungleich Space nach dem + naechsten Space im Eingabepuffer INBFF! + jr z, N1 !keine Anzahl eingegeben! + + call GET_HEXZ !r3:=Anzahl der Befehle! + test r3 + jr nz, N2 !ungleich 0! + +N1: + LDK R3, #1 !implizit Einzelschrittbetrieb, wenn keine + Anzahl bzw. Anzahl=0 eingegeben wurde! +N2: + ld NXTCTR, r3 !Befehlszaehler! +N3: + ld r2, #NXT_INT !Adresse der VI-Routine! + !Interrupt erfolgt nach Abarbeitung des + naechsten Befehls des zu testenden Programms! + ldl rr4, B_ADR_S !rr4:=BREAK-Adresse! + cpl rr4, PC_SEG !=Adresse des naechsten Befehls?! + jr nz, G2 !nein! + + ld r1, B_WORD + sc #SC_SEGV + ld @r4, r1 !ehemaligen Inhalt der BREAK-Adresse zurueck- + laden, um Befehl abarbeiten zu koennen + (Unterbrechungspunkt wird nach Abarbeitung des + Befehls in VI-Routine NXT_INT wieder gesetzt)! + sc #SC_NSEGV + jr G2 + end NEXT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE NXT_INT +VI-Routine fuer NEXT +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + NXT_INT procedure + entry + ldl SVSTK, rr14 + ld r15, #STACK + ld SV_R, r0 + calr SAVREG !Register retten! + inc SVSTK + 2, #8 + calr RETI_CTC0_3 !Interrupt-Quelle loeschen! + ldl rr2, B_ADR_S + ld r1, B_CODE + sc #SC_SEGV + ld @r2, r1 !Unterbrechungspunkt wieder setzen! + sc #SC_NSEGV + bit FCW_V, #%0C + jr nz, N_I + res FCW_, #%0C +N_I: !AUSGABE DER REGISTERBEZEICHNUNGEN UND WERTE! + calr WR_REGBEZ1 + calr WR_WERTE1 + calr WR_REGBEZ2 + calr WR_WERTE2 + dec NXTCTR, #1 !DURCHLAUFZAEHLER DEKREMENTIEREN! + jr nz, N3 !NAECHSTEN BEFEHL ABARBEITEN! + + ld NXTCTR, #1 !Einzelschrittbetrieb bei Eingabe von nur CR + in Kommandoeingabeschleife! + ei vi + jp CMDLOP + end NXT_INT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE RETI_CTC0_3 +Interruptquelle (CTC0_3) loeschen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + RETI_CTC0_3 procedure + entry + LDB RL1, #%ED !U880-RETI (ED4D) ausgeben! + OUTB RETI_P, RL1 + LDB RL1, #%4D + OUTB RETI_P, RL1 + LDB RL1, #%03 + OUTB CTC0_3, RL1 !CTC-Kanal ruecksetzen! + ret + end RETI_CTC0_3 + +END p_brk diff --git a/WEGA/src/cmd/standalone/sa.diags/comm.s b/WEGA/src/cmd/standalone/sa.diags/comm.s new file mode 100644 index 0000000..7b95610 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/comm.s @@ -0,0 +1,1280 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986 + P8000-PROM (MONITOR) Modul: p_comm + + Bearbeiter: J. Zabel + Datum: 15.04.1987 + Version: 2.0 + +******************************************************************************* +******************************************************************************! + +!============================================================================== +Inhaltsuebersicht Modul p_comm +------------------------------ +Dieser Modul umfasst verschiedene Monitorkommandos +(D, C, F, M, PR, PW, PRS, PWS, HR, HW, FF, FR, FW). + +Prozeduren +---------- +DISPLAY +TST_WBL + +COMPARE +PUT_ADR_INHALT + +FILL + +MOVE + +PORT_READ +PORT_WRITE +PORT_READ_SPECIAL +PORT_WRITE_SPECIAL +PORT_RD +PORT_WR +P_IN +PS_IN +P_OUT +PS_OUT + +HARD_DISK_READ +HARD_DISK_WRITE +HARD_DISK +FLOPPY_FORMAT +FLOPPY_READ +FLOPPY_WRITE +FLOPPY_BLOCK +==============================================================================! + + +p_comm module + +$SECTION PROM + +!anfang prom.include! +!****************************************************************************** +allgemeine Vereinbarungen (Stand: 12.12.1986) +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 ZLOAD/ZSEND! +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! + 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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%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)! + ARRAY [%36 WORD] !unbenutzt! +!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): 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 - Clear Parity + 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 U800-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 prom.include! + + +!****************************************************************************** +Prozeduren +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE DISPLAY +DISPLAY-Routine (Monitorkommando) +Anzeigen eines Speicherbereiches bzw. Aenderung von Speicherzellen + +Kommandoeingabe: D [[]offset [count] [W,B,L]] + (Anfangsadresse, Datenanzahl, Datentyp) +Fehler, wenn anstelle 'W,B,L' ein anderes Zeichen eingegeben wurde bzw. wenn +Datenanzahl = 0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + DISPLAY procedure + entry + +!*** Parameterauswertung ***! + + resb FLAG1, #1 !Flag: noch Parameter einlesen! + call GET_SIGN !rl0:=1. Zeichen nach Space in INBFF! + ld r7, #%0202 !IMPLIZIT WORD AUSGEBEN! + ld r10, PC_SEG !implizite Segmentnummer! + jr nz, D_PARA !Parameter wurden angegeben! + + ld r1, r3 !IMPLIZITER OFFSET! + jr D_WRITE !keine Parameter angegeben! + +D_PARA: + call GET_ADR !rr2:=eingegebene Anfangsadresse / + rl0:=naechstes Zeichen in INBFF! + JR NZ, D2 !weitere Parameter vorhanden! + + setb FLAG1, #1 !MERKER: ALLE PARAMETER EINGELESEN! +D2: + ldl rr10, rr2 !rr10:=Anfangsadresse (r10-segnr/r11-offset)! + bitb FLAG1, #1 + jr nz, D_WRITE0 !Sprung zu "Speicher schreiben" (keine + Datenanzahl und kein Datentyp angegeben! + calr TST_WBL !Test: Datentyp (W,B,L) + r7 := %0202 bzw. %0101 bzw. %0404! + jr z, D_WRITE0 !Sprung zu "Speicher schreiben" (keine + Datenanzahl, aber Datentyp (W,B,L) angegeben)! + call GET_HEXZ !Datenanzahl angegeben! + ld r13, r3 !r13 := Datenanzahl! + jr z, D_LEN0 !CR gelesen (kein Datentyp angegeben)! + + calr TST_WBL !Test: Datentyp (W,B,L) + r7 := %0202 bzw. %0101 bzw. %0404! + jr nz, D_ERROR !falscher Datentyp angegeben (nicht W,B,L)! + +D_LEN0: + test r13 + jr z, D_ERROR !Datenanzahl = 0! + +!*** DISPLAY READ ***! +! Aufbau der Ausgabezeile ! + +D_READ: + ld r6, #%0010 !%10 Bytes je Ausgabezeile anzeigen! + call PUT_3C !Zeichen '<' in OUTBFF eintragen! + ld r5, r10 + ldb rl5, rh5 + call PUT_SGNR !'segnr>' in OUTBFF eintragen! + ld r5, r11 + call BTOH16 !'offset' in OUTBFF eintragen! + inc OUTPTR, #1 !1 Leerzeichen in OUTBFF! + ld r8, #%003A + ldb OUTBFF(r8), #'*' !'*' auf Pos. %3A in OUTBFF eintragen! + inc r8, #1 +D5: + sc #SC_SEGV + ldb rl5, @r10 !BYTE VOM SPEICHER LESEN! + sc #SC_NSEGV + ldb OUTBFF(r8), rl5 + cpb rl5, #' ' !TEST UNTERE GRENZE ASCII-CODE! + jr c, D6 + cpb rl5, #%7F !TEST OBERE GRENZE ASCII-CODE! + jr c, D7 +D6: + ldb OUTBFF(r8), #'.' !kein ASCII-Code --> Punkt in OUTBFF eintr.! +D7: + inc r8, #1 + ldb OUTBFF(r8), #'*' !'*' am Ende der ASCII-Zeichen in OUTBFF! + call BTOH8 !Datenbyte (im ASCII-Code) in OUTBFF eintragen! + inc r11, #1 + dec r6, #1 + jr nz, D8 !Zeile noch nicht vollst. aufgebaut (%10 Byte)! + +! Ausgabe der vollstaendigen Zeile ! + + inc r8, #1 + ld OUTPTR, r8 !Laenge der Ausgabezeile! + call WR_OUTBFF_CR !Ausgabe OUTBFF auf Terminal (mit CR)! + ldb rl7, rh7 !WORD-BYTE-LONG MERKER NEULADEN! + dec r13, #1 !dec Datenanzahl! + jr nz, D_READ !noch nicht alle Daten angezeigt! + ret !fertig! + +! Steuerung der Leerzeichen zwischen den Dateneinheiten (W,B,L) ! + +D8: + dbjnz rl7, D5 !naechstes Byte, wenn Dateneinheit (W,L) + noch nicht vollstaendig! + inc OUTPTR, #1 !1 Leerzeichen zwischen 2 Dateneinheiten! + ldb rl7, rh7 !Anz. der Bytes je Dateneinheit wieder setzen! + dec r13, #1 !dec Anzahl der Dateneinheiten! + jr nz, D5 !naechste Dateneinheit! + + inc r8, #1 !Datenanzahl abgearbeitet! + ld OUTPTR, r8 + jp WR_OUTBFF_CR !Ausgabe der letzten Zeile auf Terminal! + +!*** DISPLAY WRITE ***! +! Aufbau und Ausgabe der Ausgabezeile ! + +D_WRITE0: + cpb rl7, #1 !BYTE AUSGABE ? ! + jr z, D_WRITE + res r11, #%0 !gerade Offsetadresse bei 'W' und 'L'! +D_WRITE: + ldl rr8, rr10 !rr8 := Zeilenadresse! + call PUT_3C !Zeichen '<' in OUTBFF eintragen! + ld r5, r10 + ldb rl5, rh5 + call PUT_SGNR !'segnr>' in OUTBFF eintragen! + ld r5, r11 + call BTOH16 !'offset' in OUTBFF eintragen! + inc OUTPTR, #1 !1 Leerzeichen nach Zeilenadresse in OUTBFF! +D11: + sc #SC_SEGV + ldb rl5, @r10 !BYTE VOM SPEICHER LESEN! + sc #SC_NSEGV + call BTOH8 !Datenbyte in OUTBFF eintragen (ASCII)! + inc r11, #1 !OFFSET INKREMENTIEREN! + dbjnz rl7, D11 !alle Bytes der Dateneinheit in OUTBFF eintr.; + r11:= Offsetadr. des folg. Datenwertes! + inc OUTPTR, #1 !1 Leerzeichen nach Dateneinheit! + ldb rl7, rh7 !Bytezaehler je Dateneinheit neu setzen! + call WR_OBF_RDDATA !Ausgabe OUTBFF auf Terminal; Ausgabe '?'; + einlesen des zu schreibenden Datenwertes! + jr nc, D12 !kein 'Q' oder '-' eingegeben! + + cpb rl0, #'Q' + ret z !'Q' eingegeben --> Abbruch! + + push @r15, r7 !'-' eingegeben! + clrb rh7 + sub r11, r7 + sub r11, r7 !Offsetadresse um 2 Dateneinheiten dec! + pop r7, @r15 + jr D_WRITE !vorherige Dateneinheit betrachten! + +D12: + jr z, D_WRITE !kein Datenwert wurde engegeben! + + decb rl7, #1 + sc #SC_SEGV !Datenwert in Speicher schreiben! + jr nz, D13 + ldb @r8, rl3 ! Byte ! + jr D15 +D13: + decb rl7, #1 + jr nz, D14 + ld @r8, r3 ! Word ! + jr D15 +D14: + ldl @r8, rr2 ! Long ! +D15: + sc #SC_NSEGV + ldb rl7, rh7 + jr D_WRITE + +D_ERROR: + jp ERROR + end DISPLAY + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE TST_WBL +Test WORD-BYTE-LONG +Input: rl0 - Datentyp ('W','B','L') +Output: rh7/rl7 - Anzahl der Byte des Datentyps + + } %0101 wenn rl0='B' +r7 = } %0404 wenn rl0='L' + } %0202, Z=1 wenn rl0=CR oder rl0='W' + } %0202, Z=0 ansonsten (Fehler) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + TST_WBL procedure + entry + ld r7, #%0202 + cpb rl0, #CR + ret z + cpb rl0, #'W' + ret z + ld r7, #%0101 + cpb rl0, #'B' + ret z + ld r7, #%0404 + cpb rl0, #'L' + ret z + ld r7, #%0202 + ret + end TST_WBL + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE COMPARE +COMPARE-Routine (Monitorkommando) +Vergleich zweier Speicherbereiche + +Kommandoeingabe: C []offset1 []offset2 count + (1. Anfangsadresse, 2. Anfangsadresse, Bytezahl) +unterschiedliche Bytes werden ausgegeben: + offset2= inhalt offset1= inhalt +Fehler, wenn Bytezahl = 0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + COMPARE procedure + entry + call GET_PAR !Einlesen und Konvertierung der Eingabezeile! + !rr6:=1. Adr./rr4:=2. Adr./r3:=Bytezahl! + jr c, C_ERROR !falsche Parameterfolge! + + ldl rr8, rr4 !rr8 := 2. Adresse! + ld r10, r3 !r10 := Bytezahl! + test r3 + jr z, C_ERROR !Bytezahl = 0! +C1: + sc #SC_SEGV + ldb rl1, @r6 + cpib rl1, @r8, r10, z !inc offset2, dec r10! + sc #SC_NSEGV + jr z, C2 !Vergleich: identisch! + + ldl rr4, rr8 !rr4 := 2. Adresse! + dec r5, #1 + calr PUT_ADR_INHALT !Eintragung 2. Adr. und Inhalt in OUTBFF! + ldl rr4, rr6 !rr4 := 1. Adresse! + calr PUT_ADR_INHALT !Eintragung 1. Adr. und Inhalt in OUTBFF! + call WR_OUTBFF_CR !Ausgabe des Inhaltes von OUTBFF auf Terminal! +C2: + test r10 + ret z !alle Bytes verglichen! + + inc r7, #1 !inc offset1! + jr C1 + +C_ERROR: + jp ERROR +end COMPARE + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PUT_ADR_INHALT +Eintragung von 'offset= inhalt' in Ausgabepuffer (OUTBFF) +Input: rr4 - Adresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PUT_ADR_INHALT procedure + entry + call PUT_3C !Zeichen '<' in OUTBFF eintragen! + ld r2, r5 + ldb rl5, rh4 + call PUT_SGNR !'segnr>' in OUTBFF eintragen! + ld r5, r2 + call BTOH16 !'offset' in OUTBFF eintragen! + ld r1, #'= ' + call PUT_2CHR !'= ' in OUTBFF eintragen! + sc #SC_SEGV + ldb rl5, @r4 + sc #SC_NSEGV + call BTOH8 !Adresseninhalt in OUTBFF eintragen! + inc OUTPTR, #%02 !2 Leerzeichen in OUTBFF! + ret + end PUT_ADR_INHALT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FILL +FILL-Routine (Monitorkommando) +Fuellen eines Speicherbereiches + +Kommandoeingabe: F []offset1 offset2 word + (Anfangsadresse, Endadresse, Datenwort) +Fehler, wenn offset1 ungerade oder (offset2 < offset1) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + FILL procedure + entry + call GET_PAR !Einlesen und Konvertierung der Eingabezeile! + !rr6:=1. Adr./rr4:=2. Adr./r3:=Datenwort! + jr c, F_ERROR !falsche Parameterfolge! + + bit r7, #%0 + jr nz, F_ERROR + + sub r5, r7 !r5 := Adressendifferenz! + jr c, F_ERROR !2.Adr. < 1.Adr.! + + srl r5, #1 + inc r5, #1 !r5 := Wortanzahl! + sc #SC_SEGV +F2: + ld @r6, r3 !Speicherbereich fuellen! + inc r7, #%02 + djnz r5, F2 + sc #SC_NSEGV + ret + +F_ERROR: + jp ERROR + end FILL + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE MOVE +MOVE-Routine (Monitorkommando) +Verschieben eines Speicherbereiches + +Kommandoeingabe: M []offset1 []offset2 count + (Adresse Quelle, Adresse Ziel, Bytezahl) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + MOVE procedure + entry + call GET_PAR !Einlesen und Konvertierung der Eingabezeile! + !rr6:=1. Adr./rr4:=2. Adr./r3:=Bytezahl! + jp c, ERROR !falsche Parameterfolge! + + cp r4, r6 !Vergleich der Segmentnummern! + jr nz, M1 !ungleich! + + cp r7, r5 !Vergleich der Offsetadressen, wenn Segment- + nummern gleich sind! + jr c, M2 !1.Adr. < 2. Adr.! +M1: + sc #SC_SEGV + ldirb @r4, @r6, r3 !Speicherbereich verschieben (bei ungleichen + Segmentnummern bzw. bei gleichen Segment- + nummern und 1.Adr.>=2.Adr.)! + sc #SC_NSEGV + ret +M2: + add r7, r3 + dec r7, #1 + add r5, r3 + dec r5, #1 + sc #SC_SEGV + lddrb @r4, @r6, r3 !Speicherbereich verschieben (bei gleichen + Segmentnummern und 1.Adr.<2.Adr.)! + sc #SC_NSEGV + ret + end MOVE + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_READ +PORT Lese-Routine (Monitorkommando PR) + +Kommandoeingabe: PR portadr [W] + (Portadresse, Datentyp) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + PORT_READ procedure + entry + ld r5, #P_IN !r5:=Adresse der PORT-I/O-Routine! + jr PORT_RD + end PORT_READ + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_WRITE +PORT Schreib-Routine (Monitorkommando PW) + +Kommandoeingabe: PW portadr [W] X1 [X2...Xn] + (Portadresse, Datentyp, Datenwerte) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + PORT_WRITE procedure + entry + ld r5, #P_OUT !r5:=Adresse der PORT-I/O-Routine! + jr PORT_WR + end PORT_WRITE + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_READ_SPECIAL +SPECIAL-PORT Lese-Routine (Monitorkommando PRS) + +Kommandoeingabe: PRS portadr [W] + (Portadresse, Datentyp) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + PORT_READ_SPECIAL procedure + entry + ld r5, #PS_IN !r5:=Adresse der PORT-I/O-Routine! + jr PORT_RD + end PORT_READ_SPECIAL + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_WRITE_SPECIAL +SPECIAL-PORT Schreib-Routine (Monitorkommando PWS) + +Kommandoeingabe: PWS portadr [W] X1 [X2...Xn] + (Portadresse, Datentyp, Datenwerte) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + PORT_WRITE_SPECIAL procedure + entry + ld r5, #PS_OUT !r5:=Adresse der PORT-I/O-Routine! + jr PORT_WR + end PORT_WRITE_SPECIAL + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_RD +PORT/SPECIAL-PORT Lese-Routine +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PORT_RD procedure + entry + ld PORT_IO, r5 !Adresse der PORT-I/O-Routine retten! + + call GET_SIGN !rl0:=1.Zeichen nach naechstem Space in INBFF + (= 1. Zeichen der Portadresse)! + jp z, ERROR !Zeichen=CR, d.h. keine Portadr. angegeben! + + call GET_HEXZ !r3:=Hexazahl (binaer) aus INBFF (Portadr.); + rl0:=1.Zeichen nach Portadr. ungleich Space + (Datentyp)! + ld r6, r3 !r6:=Portadresse! + ldk r7, #1 !r7=Datentyp:=1 (implizit Datentyp 'BYTE')! + jr z, PORE1 !kein Datentyp angegeben-->Datentyp 'BYTE'! + + cpb rl0, #'W' + jp nz, ERROR !falscher Parameter (Datentyp)! + clr r7 !r7=Datentyp:=0 (Datentyp 'WORD')! + +PORE1: + ld r5, #PORT_BF + add r5, r7 !r5:=Adresse, wo gelesener Portinhalt abge- + speichert werden soll (=#PORT_BF bei 'WORD'- + bzw. =#PORT_BF+1 bei 'BYTE'-Lesen)! + ld r3, PORT_IO !r3:=Adresse der PORT-I/O-Routine! + call @r3 !PORT LESEN! + + ld r5, r6 !r5:=Portadresse! + call BTOH16 !Portadresse IN OUTBFF EINTRAGEN! + inc OUTPTR, #1 !1 Leerzeichen in OUTBFF eintragen! + ld r5, PORT_BF !r5:=gelesener Portinhalt! + bit r7, #%0 + jr nz, PORE2 !Datentyp 'BYTE'! + call BTOH16 !gelesenes Datenwort in OUTBFF eintragen! + jr PORE3 +PORE2: + call BTOH8 !gelesenes Datenbyte in OUTBFF eintragen! +PORE3: + jp WR_OUTBFF_CR !Inhalt OUTBFF auf Terminal ausgeben! + end PORT_RD + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PORT_WR +PORT/SPECIAL-PORT Schreib-Routine +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PORT_WR procedure + entry + ld PORT_IO, r5 !Adresse der PORT-I/O-Routine retten! + + call GET_SIGN !rl0:=1.Zeichen nach naechstem Space in INBFF + (=1. Zeichen der Portadresse)! + jp z, ERROR !CR gelesen, d.h. keine Parameter angegeben! + + call GET_HEXZ !r3:=Hexazahl (binaer) aus INBFF (Portadr.); + rl0:=1.Zeichen nach Portadr. ungleich Space + (Datentyp bzw. 1. Datenwert)! + jp z, ERROR !CR gelesen, d.h. keine weiteren Parameter! + + ld r6, r3 !r6:=Portadresse! + ldk r7, #1 !r7=Datentyp:=1 (implizit Datentyp 'BYTE')! + cpb rl0, #'W' + jr nz, POWR_LOOP !kein Datentyp angegeben-->Datentyp 'BYTE'! + clr r7 !r7=Datentyp:=0 (Datentyp 'WORD')! + call GET_SIGN !rl0:=1.Zeichen nach naechstem Space in INBFF + (=1. Zeichen des 1. Datenwertes)! + jp z, ERROR !CR gelesen, d.h. keine weiteren Parameter + (Datenwerte) angegeben! + +POWR_LOOP: + call GET_HEXZ !r3:=Hexazahl (binaer) aus INBFF (Datenwert); + rl0:=1.Zeichen nach Datenwert ungleich Space + (naechster Datenwert)! + ldctlb rh0, FLAGS !Stand Z-Flag retten! + + ld r5, #PORT_BF + ld @r5, r3 !an Port auszugebenden Datenwert in #PORT_BF + abspeichern! + add r5, r7 !r5:=Adresse, wo auszugebender Datenwert steht + (=#PORT_BF bei 'WORD'/=#PORT_BF+1 bei 'BYTE')! + ld r3, PORT_IO !r3:=Adresse der PORT-I/O-Routine! + call @r3 !PORT SCHREIBEN! + + bitb rh0, #%06 !Z-Flag testen! + ret nz !Z-Flag war nach GET_HEXZ gesetzt, d.h. CR + wurde gelesen, d.h. keine weiteren Daten- + werte vorhanden! + jr POWR_LOOP !naechsten Datenwert an Port ausgeben! + end PORT_WR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE P_IN +Normal-Port-Input +Input: r7 - einzulesender Datentyp (0-'WORD' / 1-'BYTE') + r5 - Adresse, wo gelesener Portinhalt abgespeichert werden soll + r6 - Portadresse +Output: auf urspruenglicher Adresse r5 - gelesener Portinhalt +zerstoerte Register: r3, r5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + P_IN procedure + entry + bit r7, #%0 + jr nz, P_INB + ini @r5, @r6, r3 !Normal Input ('WORD')! + ret +P_INB: + inib @r5, @r6, r3 !Normal Input ('BYTE')! + ret + end P_IN + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PS_IN +Special-Port-Input +Input: r7 - einzulesender Datentyp (0-'WORD' / 1-'BYTE') + r5 - Adresse, wo gelesener Portinhalt abgespeichert werden soll + r6 - Portadresse +Output: auf urspruenglicher Adresse r5 - gelesener Portinhalt +zerstoerte Register: r3, r5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PS_IN procedure + entry + bit r7, #%0 + jr nz, PS_INB + sini @r5, @r6, r3 !Special Input ('WORD')! + ret +PS_INB: + sinib @r5, @r6, r3 !Special Input ('BYTE')! + ret + end PS_IN + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE P_OUT +Normal-Port-Input +Input: r7 - auszugebender Datentyp (0-'WORD' / 1-'BYTE') + r5 - Adresse, auf der der auszugebende Datenwert abgespeichert ist + r6 - Portadresse +zerstoerte Register: r3, r5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + P_OUT procedure + entry + bit r7, #%0 + jr nz, P_OUTB + outi @r6, @r5, r3 !Normal Output ('WORD')! + ret +P_OUTB: + outib @r6, @r5, r3 !Normal Output ('BYTE')! + ret + end P_OUT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PS_OUT +Special-Port-Output +Input: r7 - auszugebender Datentyp (0-'WORD' / 1-'BYTE') + r5 - Adresse, auf der der auszugebende Datenwert abgespeichert ist + r6 - Portadresse +zerstoerte Register: r3, r5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PS_OUT procedure + entry + bit r7, #%0 + jr nz, PS_OUTB + souti @r6, @r5, r3 !Special Output ('WORD')! + ret +PS_OUTB: + soutib @r6, @r5, r3 !Special Output ('BYTE')! + ret + end PS_OUT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE HARD_DISK_READ +Lesen eines Blockes von Hard-Disk (Monitorkommando) + +Kommandoeingabe: HR block []offset [dev] + (Blocknummer(32 Bit), Pufferadresse, + Devicenummer (0-3, implizit 0)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + HARD_DISK_READ PROCEDURE + entry + ld r7, #1 + jr HARD_DISK + end HARD_DISK_READ + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE HARD_DISK_WRITE +Schreiben eines Blockes auf Hard-Disk (Monitorkommando) + +Kommandoeingabe: HW block offset [dev] + (Blocknummer(32 Bit), Pufferadresse, + Devicenummer (0-3, implizit 0)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + HARD_DISK_WRITE PROCEDURE + entry + ld r7, #2 + jr HARD_DISK + end HARD_DISK_WRITE + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE HARD_DISK +Lesen bzw. Schreiben eines Blockes auf Hard-Disk +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + HARD_DISK PROCEDURE + entry + CALL GET_DATA !rr2:=eingeg. Blocknummer; + INPTR zeigt auf 2 Zeichen nach Blocknr.! + ldl rr4, rr2 !rr4:=Blocknummer! + jp z, ERROR !keine Blocknummer angeg. (CR gelesen)! + + call GET_SIGNW !rl0:=naechstes Zeichen ungl. Space aus INBFF + (=1.Zeichen der eingeg. Pufferadresse)! + call GET_ADR !rr2:=eingeg. Pufferadresse; + rl0:=Zeichen ungl. Space nach Pufferadresse; + INPTR zeigt auf darauffolgendes Zeichen! + jp c, ERROR !keine Pufferadresse angegeben! + ldl rr8, rr2 !rr8:=Pufferadresse! + + ld r6, #0 !implizit DRIVE 0! + jr z, HD_E !keine Devicenr. angeg.! + + subb rl0, #%30 !DRIVE ADRESSE BILDEN! + cpb rl0, #4 !MAX. 4 DRIVES! + jp nc, ERROR !Drivenr. >= 4! + + ldb rl6, rl0 !r6:=Drivenr.! +HD_E: + ld r10, #%200 !r10:=Blocklaenge! + sc #SC_DISK !Aufruf DISK! + test r2 !Test Returncode! + ret z !kein Fehler aufgetreten! + + 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 Returncode! + ret + end HARD_DISK + + INTERNAL +T_HD_ERR: + WORD := %0010 + ARRAY [* BYTE] := 'HARD DISK ERROR ' + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FLOPPY_FORMAT +Formatieren einer blockorientierten Floppy-Disk (Monitorkommando) + +Kommandoeingabe: FF typ/dev + (Floppytyp (0-F)/Devicenummer (0-3)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + FLOPPY_FORMAT PROCEDURE + entry + ld r7, #3 + call GET_SIGN !rl0:=1. Zeichen nach naechsten Space in INBFF + (= Zeichen der Devicenummer)! + jp z, ERROR !keine Devicenummer angegeben! + jr FLOPPY_BLOCK1 + end FLOPPY_FORMAT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FLOPPY_READ +Lesen eines Blockes von blockorientierter Floppy-Disk (Monitorkommando) + +Kommandoeingabe: FR block []offset [typ/dev] + (Blocknummer(16 Bit), Pufferadresse, + Floppytyp (0-F)/Devicenummer (0-3) + (implizit 60)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + FLOPPY_READ PROCEDURE + entry + ld r7, #1 + jr FLOPPY_BLOCK + end FLOPPY_READ + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FLOPPY_WRITE +Schreiben eines Blockes auf blockorientierte Floppy-Disk (Monitorkommando) + +Kommandoeingabe: FW block []offset [typ/dev] + (Blocknummer(16 Bit), Pufferadresse, + Floppytyp (0-F)/Devicenummer (0-3) + (implizit 60)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + FLOPPY_WRITE PROCEDURE + entry + ld r7, #2 + jr FLOPPY_BLOCK + end FLOPPY_WRITE + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FLOPPY_BLOCK +Lesen bzw. Schreiben eines Blockes auf blockorientierte Floppy-Disk +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + FLOPPY_BLOCK PROCEDURE + entry + CALL GET_DATA !rr2:=eingeg. Blocknummer; + INPTR zeigt auf 2 Zeichen nach Blocknr.! + ldl rr4, rr2 !rr4:=Blocknummer! + jp z, ERROR !keine Blocknummer angeg. (CR gelesen)! + + call GET_SIGNW !rl0:=naechstes Zeichen ungl. Space aus INBFF + (=1.Zeichen der eingeg. Pufferadresse)! + call GET_ADR !rr2:=eingeg. Pufferadresse; + rl0:=Zeichen ungl. Space nach Pufferadresse; + INPTR zeigt auf darauffolgendes Zeichen! + jp c, ERROR !keine Pufferadresse angegeben! + ldl rr8, rr2 !rr8:=Pufferadresse! + + ld r6, #%60 !implizit Floppytyp 6/Devicenummer 0! + jr z, FD_E !keine Devicenr. angeg.! + +FLOPPY_BLOCK1: + call GET_HEXZ !r3:=eingeg. typ/dev! + ld r6, r3 + ldb rh6, #0 + ldb rl0, rl6 + andb rl0, #%0F + cpb rl0, #4 !MAX. 4 DRIVES! + jp nc, ERROR !Drivenr. >= 4! + +FD_E: + ld r10, #%200 !r10:=Blocklaenge! + sc #SC_FLOPPY !Aufruf Floppytreiber! + test r2 !Test Returncode! + ret z !kein Fehler aufgetreten! + + 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 Returncode! + ret + end FLOPPY_BLOCK + + INTERNAL +T_FLP_ERR: + WORD := 13 + ARRAY [* BYTE] := 'FLOPPY ERROR ' + +end p_comm diff --git a/WEGA/src/cmd/standalone/sa.diags/disk.s b/WEGA/src/cmd/standalone/sa.diags/disk.s new file mode 100644 index 0000000..85e8d3c --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/disk.s @@ -0,0 +1,184 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986 + + PROM Modul: DISK.S fuer P8000-WDC + + Bearbeiter: P. Hoge + Datum: $D$ + Version: $R$ + +******************************************************************************* +******************************************************************************! + +disk module + + +$SECTION PROM +$nonsegmented + + constant + +!Port Adressen! + + PIOAD := %FFA1 !Daten lesen / schreiben! + PIOBD := %FFA3 !Steuerport ! + PIOAC := %FFA5 + PIOBC := %FFA7 + +!PIO Programmierung! + + OUTPUT := %0F + INPUT := %4F + BITMODE := %CF + INTVEC := %18 + +!Anschlussbelegung des Controlers am U880 PIO + + PORT A: 8 bit bidirektionale Daten (D0 bis D7) + PORT B: + bit 0: /ST0 (Interrupt Request), Eingang + bit 1: /ST1 (Anforderung der Daten), Eingang + bit 2: /ST2 (Error), Eingang + bit 3: frei, Ausgang + bit 4: frei, Ausgang + bit 5: RESET (WDC-Reset), Ausgang + bit 6: TE und Richtung Datentreiber 0=write 1=read Ausgang + bit 7: TR (Transfer Request), Eingang +! +!WDC Steuerport! + + RDATA := %4000 !Daten lesen! + WDATA := %00 !Daten schreiben! + RESET := %80 !Reset an Controler ausgeben! + +!WDC-Kommandos! + + COMMAND := %20 !Read/Write ab Blocknummer! + READ := %21 !Read ab Blocknummer! + WRITE := %22 !Write ab Blocknummer! + + + global + +!------------------------------------------------------------------! +! Eingabeparameter: r7 .... Request-Code (1=Read, 2=Write) ! +! r6 .... Drive-Nr. ! +! rr4 .... Blocknummer ! +! rr8 .... Pufferadresse ! +! r10 .... Laenge (<=%200) ! +! Der Return-Code wird in r2 zurueckgegeben ! +!------------------------------------------------------------------! + + DISK procedure + entry + callr _disk_in !Hardware init! + + ldl rr2, rr4 + ld r4, #PIOAD + ld r5, #PIOBD + ld r0, #WDATA+OUTPUT + outb @r5, rh0 !Datentreiber auf Ausgabe! + outb PIOAC, rl0 !Daten-PIO auf Ausgabe! + +wready: inb rl0, @r5 + bitb rl0, #0 + jr nz, wready !Warten bis WDC bereit! + +!WDC-Kommando ausgeben! + + orb rl7, #COMMAND + outb @r4, rl7 !Kommando ausgeben! + outb @r4, rl6 !Laufwerknummer! + outb @r4, rl3 !Blocknummer low! + outb @r4, rh3 + outb @r4, rl2 + outb @r4, rh2 !Blocknummer high! + ld r3, r10 !Laenge! + outb @r4, rl3 + outb @r4, rh3 + outb @r4, rh6 !Pruefsumme, nicht benutzt! + +wwait0: inb rl0, @r5 !Warten bis WDC Status 0! + bitb rl0, #0 + jr z,wwait0 + + ld r6, #%C000 !FCW! + cpb rl7, #WRITE + jr nz, rwwait + +wwait1: inb rl0, @r5 !Write! + bitb rl0, #1 !Warten, bis WDC bereit fuer Daten! + jr nz, wwait1 + ldctl r1, FCW + ldctl FCW, r6 +!$segmented! + otirb @r4, @r8, r3 !otirb @r4, @rr8, r3! + ldctl FCW, r1 +!nonsegmented! + +wwait2: inb rl0, @r5 !Warten bis WDC Status 0! + bitb rl0, #1 + jr z,wwait2 + +rwwait: inb rl1, @r5 !Status einlesen! + bitb rl1, #0 + jr nz, rwwait !auf Beendigung des Kommandos warten! + inb rl1, @r5 + andb rl1, #%07 !Maske! + ldk r2, #0 !Returncode kein Fehler! + cpb rl1, #%06 !Status 1 = fertig, kein Fehler! + ret z + + ld r0, #RDATA+INPUT + outb PIOAC, rl0 !Daten-PIO auf Eingabe! + outb @r5, rh0 !Treiber auf Eingabe! + inb rl0, @r4 !Scheineingabe! + cpb rl1, #%04 !Status 3 Daten einlesen ?! + jr nz, error !nein, Fehler! + + ldctl r1, FCW + ldctl FCW, r6 +!$segmented! + inirb @r8, @r4, r3 !inirb rr8, @r4, r3! + ldctl FCW, r1 +!$nonsegmented! + ret + +error: inb rl2, @r4 !Fehlercode einlesen! + ret + end DISK + + +!Initialisierung der Ports und des Controlers! + + internal + + init array [* byte] := [ + PIOBC, INTVEC !Int Vektor holt PIO Port aus Reset! + PIOBD, WDATA !Reset wegnehmen, Richtung auf Write! + PIOBC, BITMODE !Port B auf Bitmode programmieren! + PIOBC, %87 !bit 7,2,1,0 auf Eingabe! + ] + + _disk_in procedure + entry + ld r2, #PIOBD + inb rl1, @r2 !PIOBD schon initialisiert ?! + bitb rl1, #5 + ret z !ja! + + lda r1, init + ldk r0, #(sizeof init)/2 !Anzahl der Ausgaben! +iloop: ldb rl2, @r1 !low Portadresse! + inc r1, #1 + outib @r2, @r1, r0 + jr nov, iloop + ret + end _disk_in + + internal + array [%13c byte] !auffuellung auf %1f0 byte! + +end disk diff --git a/WEGA/src/cmd/standalone/sa.diags/init.s b/WEGA/src/cmd/standalone/sa.diags/init.s new file mode 100644 index 0000000..c1fbbca --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/init.s @@ -0,0 +1,1496 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1987 + P8000-PROM (MONITOR) Modul: p_init + + Bearbeiter: J. Zabel + Datum: 15.04.1987 + Version: 2.0 + +******************************************************************************* +******************************************************************************! + +!============================================================================== +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 prom.include! +!****************************************************************************** +allgemeine Vereinbarungen (Stand: 12.12.1986) +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 ZLOAD/ZSEND! +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! + 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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%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)! + ARRAY [%36 WORD] !unbenutzt! +!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): 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 - Clear Parity + 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 U800-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 prom.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 15.04.1987' + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Systemmeldung +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL +SYSMSG WORD := 46 + ARRAY [* BYTE] := 'U8000-Softwaremonitor Version 2.0 - ' + 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 !original S2+C64+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 !original S2+C64+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 +!-----------------------------------------------------------------------------! + +!SIO0_A initialisieren (fuer LOAD/SEND/QUIT)! +E0: + 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 + 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 + 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 diff --git a/WEGA/src/cmd/standalone/sa.diags/menu.c b/WEGA/src/cmd/standalone/sa.diags/menu.c new file mode 100644 index 0000000..3306c9d --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/menu.c @@ -0,0 +1,372 @@ +/************************************************************************ +* * +* Stand alone Hardware-Eigentest * +* * +* Programm: sa.diags * +* C-Modul: menu.c * +* Bearbeiter: J.Kubisch, M.Klatte * +* Version: 3.1 * +* Datum: 19.07.1989 * +* (c) ZFT-KEAW 1989 * +************************************************************************/ + + + +#define TESTANZ 9 /* Anzahl der Testkommandos */ + +char eink[5]; /* Kommandoeingabe*/ +char eint[2]; /* Testeingabe*/ +char komm; /* Letztes Kommando der Kommando-Ebene*/ +int einzelt; /* aktueller Einzeltest*/ +int rep; /* Wiederholungszaehler fuer akt. Test*/ +int noend; /* Merker fuer Endlostest*/ +int testl; /* Ungleich Null, wenn Liste abgearbeitet wird.*/ +int aktze; /* aktuelle Zeile fuer vollstaendige Listenabarbeitung*/ +int i,j; + +struct testz +{ char name [11]; + int wdhlg; +} tz[TESTANZ] = {{"EPROM ",1}, + {"STAT. RAM ",1}, + {"PIO ",1}, + {"CTC ",1}, + {"SIO ",1}, + {"DYN. RAM ",1}, + {"MMU ",1}, + {"WDC ",1}, + {"WDOS-MODUL",1}}; + +struct testz *pt; /*Strukturpointer*/ + + +main() +{ + einzelt = 0; /*1.Test (EPROM) voreingestellt*/ + aktze = 0; /*1 = aktuelle Zeile,voreingestellt*/ + rep = 1; + noend = 0; + testl = 0; + komm = ' '; /*Kommandotaste*/ + + /* Schirm loeschen */ + + for (i=0;i<26;i++) printf(" \n"); + + printf("* * * * * * * * * * * * * * * * * * * * * * * * * *\n"); + printf("* *\n"); + printf("* P 8 0 0 0 - compact *\n"); + printf("* *\n"); + printf("* Hardware-Eigentest V. 3.1 *\n"); + printf("* *\n"); + printf("* (c)1989 keaw/zft/basissoftware *\n"); + printf("* * * * * * * * * * * * * * * * * * * * * * * * * *\n"); + + INI_ERR_LST (); /*UP zur Initialisierung der Fehlerliste*/ + + do ; while (tke()); + printf("\nEnde Eigentest - Resettaste betaetigen!\n"); + do ; while (1); +} +tke() /*Testkommando-Eingabe*/ +{ + printf("\n\n\n\t*** TESTKOMMANDO-EBENE ***"); + printf("\n\nt Auswaehlen und Abarbeiten von Einzeltests"); + printf("\nr Wiederholen des aktuellen Einzeltests"); + printf("\nl Abarbeiten der vollstaendigen Testliste"); + printf("\nd Anzeige der Fehlerliste"); + printf("\nq Quitt"); + printf("\n\n\tGeben Sie Ihre Auswahl ein ]=> "); + + gets(eink,sizeof eink); /*Kommando-Eingabe)*/ + komm = eink[0]; + switch(eink[0]) { + case 't': + do ; while (aae()); /*Auswaehlen und /Abarbeiten von + Einzeltests*/ + return(1); + case 'r': + do ; while (vtz()); /*Veraendere Testzeile*/ + return(1); + case 'l': + testl=1; + do ; while (avt()); /*Abarbeiten der vollst. Testliste*/ + return(1); + case 'd': + printf("\n\n\t*** Ausgabe der Fehlerliste ***\n\n"); + MEM_MSG_OUT (); /*UP zur Fehlerlistenausgabe*/ + return(1); + case 'q': + return(0); /* Ende des Tests*/ + default: + return(1); + } +} + +aae() /*Auswaehlen und Abarbeiten von Einzeltests*/ +{ + printf("\n\n *** WAEHLE TESTZEILE ***"); + printf("\n\n1 Test EPROM"); + printf("\n2 Test STATISCHER RAM"); + printf("\n3 Test PIO"); + printf("\n4 Test CTC"); + printf("\n5 Test SIO"); + printf("\n6 Test DYNAMISCHER RAM"); + printf("\n7 Test MMU"); + printf("\n8 Test WDC"); + printf("\n9 Test WDOS-ERWEITERUNGS-MODUL (WDOS-DRAM, U80601, U80610)"); + printf("\n\n# Auswahl des Tests mit der Nr. #"); + printf("\n^ Rueckkehr zur \"Testkommando-Ebene\""); + printf("\n\n Geben Sie Ihre Auswahl ein ]=> "); + + gets(eint,sizeof eint); + + switch (eint[0]){ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + einzelt=eint[0]-0x31; /*Testzeilennr.-1,Ascii zu int konv.*/ + aktze = einzelt; /*Aktuelle Zeile*/ + + do ; while (vtz()); /*Veraendere Testzeile*/ + return(1); /*aae bleibt, bis ^ gegeben wird*/ + case '^': + return(0); /*Ende aae*/ + default: + return(1); /*aae soll wiederholt werden*/ + } +} +vtz() /*Veraendere Testzeile*/ +{ + printf("\n\n *** Veraendere Testzeile (optional) ***"); + printf("\n\nDie Testzeile hat folgenden aktuellen Stand:"); + printf("\n\nName Anzahl der Wiederholungen"); + + pt = tz + aktze; /*Strukturzeiger setzen*/ + + printf("\n%s %d",pt->name,pt->wdhlg); + printf("\n\n w Wiederholungszaehler veraendern"); + printf ("\n p Testparameter veraendern"); + printf("\n Testzeile ist korrekt, Test abarbeiten!"); + if (komm == 'r') /*Wdhlg. des aktuellen Einzeltests*/ + printf("\n ^ Rueckkehr zur \"Testkommando-Ebene\""); + else + printf("\n ^ Rueckkehr zu \"Waehle Testzeile\""); + printf("\n\n Geben Sie Ihre Auswahl ein ]=>"); + gets (eink,sizeof eink); /*Eingabe fuer "veraendere Testzeile"*/ + + switch (eink[0]){ + + case 'w': + vw(); /*Progr. \"Wiederholungszaehler setzen\""*/ + return (1); + + case 'p': + vp(); /*Progr. \"Testparameter veraendern\""*/ + return(1); + + case '^': + return(0); /*Rueckkehr zu "Waehle Testzeile"*/ + + case '\0': /*CR, Testzeile o.k., Test abarbeiten*/ + + tl(); /*Testabarbeitung*/ + + return(1); + default: + return(1); + } +} +vw() /*Setze Wiederholungszaehler*/ +{ + printf("\n\n *** Veraendere Wiederholungszaehler ***"); + printf("\nAktueller Wiederholungszaehler = %d",pt->wdhlg); + printf("\n\n 0 Test laeuft, bis Reset-Taste betaetigt wird"); + printf("\n # Test laeuft # mal (# positiv <= 9999)"); + printf("\n ^ Rueckkehr zu \"Veraendere Testzeile\""); + printf("\n Wiederholungszaehler bleibt unveraendert"); + printf("\n\n Geben Sie Ihre Auswahl ein ]=>"); + + gets(eink,sizeof eink); + switch (eink[0]){ + case '\0': /*CR:Wiederholungszaehler bleibt unveraendert*/ + case '^': + return(0); /*Rueckkehr zu "Veraendere Testzeile"*/ + } + + rep=katoi(eink); /*Konvertierung Wiederholungszaehler*/ + if (rep>=0 && rep<=9999) + pt->wdhlg=rep; + return(0); +} + +katoi(s) /*Zeichenkette s in int umwandeln*/ + char s[]; +{ + int i,n; + for (i=0;s[i]==' '||s[i]=='\n'||s[i]=='\t'||s[i]=='+'||s[i]=='-';i++) + ; /*Zwischenraeume ueberlesen*/ + + for(n=0;s[i]>='0'&&s[i]<='9';i++) + n=10*n+s[i]-'0'; + return(n); +} + +vp() /*Veraendere Testparameter*/ +{ + printf("\n\n *** Veraendere Testparameter ***"); + printf("\nFuer diesen Test gibt es keine Parameter "); + printf("\n ^ Rueckkehr zu \"Veraendere Testzeile\""); + printf("\n\n Geben Sie Ihre Auswahl ein ]=>"); + do + gets(eink,sizeof eink); + while (eink[0]!='\0' && eink[0]!='^'); + return(0); +} + +tl() /*Testlistenabarbeitung*/ +{ + printf("\n\nDer folgende Test wird jetzt abgearbeitet:"); + printf("\n\nName Anzahl der Wiederholungen"); + + if (komm == 'l') /*vollstaendige Liste abarbeiten*/ + j=TESTANZ-1; + else + j=aktze; + + for (i = aktze; i <= j; i++) + { pt = tz+i; + printf("\n\n%s - T E S T %d\n",pt->name,pt->wdhlg); + printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + rep = pt->wdhlg; /*Wiederholungszaehler fuer aktuellen Test*/ + + if (rep == 0) + noend = 1; + else + noend = 0; + +/* Aufruf der Assembler-UPs fuer die entspr. Tests */ +/* Geben Fehlermeldungen aus, die im Abarbeitungstempo weiterrollen */ + + while (rep > 0 || noend == 1) + { switch (i) + { case 0: + printf("EPROM_ \n"); /*Aufruf des Assembl.-UPs*/ + EPROM_ (); + break; + + case 1: + printf ("STAT_RAM_ \n"); + STAT_RAM_ (); + break; + + case 2: + printf ("PIO_ \n"); + PIO_ (); + break; + + case 3: + printf ("CTC_ \n"); + CTC_ (); + break; + + case 4: + printf ("SIO_ \n"); + SIO_ (); + break; + + case 5: + printf ("DYN_RAM_ \n"); + DYN_RAM_ (); /*Assemblerprogr.*/ + if (rep == 1) + {printf ("\n\0"); + MSG_MAXSEG (); + } + break; + + case 6: + printf ("MMU_ \n"); + MMU_ (); + break; + + case 7: + printf ("WDC_ \n"); + WDC_ (); + break; + + case 8: + printf ("WDOS_EXT_MODUL_ \n"); + WEM_ (); + break; + + default: + printf ("\nFehlerhafter Wiederholungszaehler"); + } + rep --; + } + } + if (komm == '1') /* Testlistenabarbeitung */ + printf ("\n\nRueckkehr zur \"Testkommando-Ebene\" durch CR-Eingabe :"); + else + printf ("\n\nRueckkehr zu \"Veraendere Testzeile\" durch CR-Eingabe :"); + + do + gets (eink,sizeof eink); + while (eink[0] != '\0' && eink[0] !='^'); + return (0); +} + + +avt() /*Abarbeiten der volsstaendigen Testliste*/ +{ + printf("\n\n *** Testliste abarbeiten ***\n\n"); + for (i=0; i<=TESTANZ-1; i++) + {if (i == aktze) + printf("*"); + else printf(" "); + pt = tz+i; + j = i+1; + printf(" %d %s\n",j,pt->name); + } + printf("\n Testlistenabarbeitung beginnt bei aktueller Zeile (*)"); + printf("\n s Testlistenabarbeitung beginnt bei Zeile 1"); + printf("\n # # wird zur aktuellen Zeile"); + printf("\n ^ Rueckkehr zur \"Testkommando-Ebene\""); + + printf("\n\n Geben Sie Ihre Auswahl ein ]=> "); + + gets(eink, sizeof eink); + + switch (eink[0]){ + + case'\0': /*CR-Testabarbeitung beginnt bei akt. Zeile*/ + tl(); + return(0); + case's': + aktze=0; + tl(); + return(0); + case'1': + case'2': + case'3': + case'4': + case'5': + case'6': + case'7': + case'8': + case'9': + aktze = katoi(eink) - 1; + return(1); + case'^': + return(0); + default: + return(1); /*Wiederholung avt*/ + } +} /*Ende avt*/ + diff --git a/WEGA/src/cmd/standalone/sa.diags/misc.c b/WEGA/src/cmd/standalone/sa.diags/misc.c new file mode 100644 index 0000000..e14120a --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/misc.c @@ -0,0 +1,270 @@ +/****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1985 + + Standalone Modul misc.c + + Bearbeiter: P. Hoge + Datum: 04/01/87 11:15:15 + Version: 1.1 + +******************************************************************************* + +Dieses Programm kann fuer alle Standalone Programme benutzt werden, +die unter dem Wega boot laufen. +Funktionen: + atol ASCII zu long integer + atoi ASCII zu integer + printfv + gets +******************************************************************************* +******************************************************************************/ + + + +/*------------------------------------------ Funktionen ---------------------*/ + + +/*---------------------------------------------------------------------------*/ +/* + *atol + * Konvertierung ASCII in long integer + * + * es werden Tabs und Space, falls vor Dezimalzahl vorhanden, uebergangen + * es wird auf ein optionales Vorzeichen getestet + * die Dezimalziffern werden so lange konvertiert bis ein + * Zeichen ungleich einer Dezimalzahl gefunden wird + */ +/*---------------------------------------------------------------------------*/ +long atol(s) +register char *s; +{ + register sign; + register long n; + + for(sign=0;; s++) { + switch(*s) { + case '\t': + case ' ': + continue; + + case '-': + sign++; + case '+': + s++; + } + break; + } + + for (n = 0; *s >= '0' && *s <= '9'; s++) + n = 10 * n + *s - '0'; + if (sign) + return(0-n); + return(n); +} + +/*---------------------------------------------------------------------------*/ +/* + *atoi + * Konvertierung ASCII string in integer + + * es wird atol aufgerufen und long in int konvertiert + */ +/*---------------------------------------------------------------------------*/ +atoi(s) +char *s; +{ + return(atol(s)); +} + +/*---------------------------------------------------------------------------*/ +/* + *ltol3 + * Konvertierung long integer in 3 byte integer + * + * Konvertiert eine Liste von long integer (lp zeigt darauf) + * in eine Liste von 3 byte integer (cp zeigt darauf) + * n = Anzahl der Zahlen + */ +/*---------------------------------------------------------------------------*/ +ltol3(cp, lp, n) +register unsigned char *cp; +register unsigned char *lp; +register n; +{ + for(; n != 0; n--) { + lp++; + *(cp++) = *(lp++); + *(cp++) = *(lp++); + *(cp++) = *(lp++); + } +} + +/*---------------------------------------------------------------------------*/ +/* + *l3tol + * Konvertierung 3 byte integer in long integer + * + * Konvertiert eine Liste von 3 byte integer (cp zeigt darauf) + * in eine Liste von long integer (lp zeigt darauf) + * n = Anzahl der Zahlen + */ +/*---------------------------------------------------------------------------*/ +l3tol(lp, cp, n) +register unsigned char *lp; +register unsigned char *cp; +register n; +{ + for(; n != 0; n--) { + *(lp++) = 0; + *(lp++) = *(cp++); + *(lp++) = *(cp++); + *(lp++) = *(cp++); + } +} + +/*---------------------------------------------------------------------------*/ +/* + *lswap + * Vertauschen low und high von long integer + */ +/*---------------------------------------------------------------------------*/ +long lswap(l) +long l; +{ + return(l<<16 | l>>16); +} + +/*---------------------------------------------------------------------------*/ +/* + *printf + * Abgeruestete Version des C Library printf. + * Nur %s %u %d (==%u) %o %x %D %X sind realisiert. + * Ausgabe erfolgt auf Console. + * Sollte nicht fuer "chit-chat" benutzt werden. + * + * Der eigentliche Entry Point muss in Assembler + * geschrieben werden. Das Programm muss wie folgt + * aussehen: + * _printf procedure +* entry + * ex r2, @r15 + * push @r15, r3 + * push @r15, r4 + * push @r15, r5 + * push @r15, r6 + * ld r6, r15 + * push @r15, r2 + * call _printfv + * ld r2, @r15 + * inc r15, #12 + * jp @r2 + * end _printf + */ +/*---------------------------------------------------------------------------*/ +printfv(fmt, x1) +register char *fmt; +register unsigned *x1; +{ + register c; + register unsigned int *adx; + register char *s; + + adx = x1; +loop: + while((c = *fmt++) != '%') { + if(c == '\0') + return; + putchar(c); + } + c = *fmt++; + if(c == 'd' || c == 'u' || c == 'o' || c == 'x') + printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); + else if(c == 's') { + s = (char *)*adx; + while(c = *s++) + putchar(c); + } else if (c == 'D' || c == 'X' ) { + for(; adx-x1 < 5; adx++) { + if ((adx-x1)%2 == 0) + continue; + printn(lswap(*(long *)adx), c=='D' ? 10 : 16); + goto end; + } + printn(*(long *)adx, c=='D' ? 10 : 16 ); +end: + adx += (sizeof(long) / sizeof(int)) - 1; + } + adx++; + goto loop; +} + +/*---------------------------------------------------------------------------*/ +/* + *printn + * Print ein unsigned integer zur Basis b + */ +/*---------------------------------------------------------------------------*/ +printn(n, b) +register long n; +register b; +{ + register long a; + + if (n<0) { /* shouldn't happen */ + putchar('-'); + n = -n; + } + if(a = n/b) + printn(a, b); + putchar("0123456789ABCDEF"[(int)(n%b)]); +} + +/*---------------------------------------------------------------------------*/ +/* + *gets + * Eingabe einer Zeichenkette von der Console + * + * in einen vorgegebenen Puffer bis CR oder LF + * oder bis der Eingabepuffer gefuellt ist + * Das letzte Zeichen im Puffer ist 0x00. CR und LF werden + * nicht in den Puffer geschrieben + */ +/*---------------------------------------------------------------------------*/ +char *gets(buf, buflen) +register char *buf; +register unsigned buflen; +{ + register char *lp; + register c; + + lp = buf; + for (;;) { + c = getchar() & 0177; + switch(c) { + case '\n': + case '\r': + *lp = '\0'; + return(buf); + case '\b': + putchar(' '); + putchar('\b'); + lp--; + if (lp < buf) + lp = buf; + continue; + case 0x18: + case 0x7f: + lp = buf; + putchar('\n'); + continue; + default: + if (lp>=buf+buflen-1) { + *lp = '\0'; + return(buf); + } + *lp++ = c; + } + } +} diff --git a/WEGA/src/cmd/standalone/sa.diags/ram.s b/WEGA/src/cmd/standalone/sa.diags/ram.s new file mode 100644 index 0000000..e328776 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/ram.s @@ -0,0 +1,301 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986 + P8000-PROM (MONITOR) Modul: p_ram + + Bearbeiter: J. Zabel + Datum: 15.04.1987 + Version: 2.0 + +******************************************************************************* +******************************************************************************! + + +p_ram module + +$SECTION RAM + +!****************************************************************************** +Arbeitsspeicher +******************************************************************************! + +GLOBAL + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +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 (UDOS + auf 8-Bit-Teil nicht verfuegbar) + 02 - SIO0_B (8-Bit-Teil) ueber + Koppelschnittstelle (UDOS + auf 8-Bit-Teil verfuegbar)! +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 + +! +7 6 5 4 3 2 1 0 + 0-> 0: empf. Zeichen vom Terminalkanal ist ASCII-Zeichen + (Reset Bit 7 des Zeichens, Test auf ^S, ^Q, ESC) + 1: empf. Zeichen vom Terminalkanal ist beliebiges Datenbyte + (keine Sonderbehandlung) + P: ENTRY(0), PTY_INT(T), KOPPEL_INT(T), QUIT(1), + NMI_INT(T/0), MCZ_INT(T), RM_BOOT(0) + 1---> 0: + 1: + P: ENTRY(1) + 2-----> 0: Ausgabe an Terminal nicht gesperrt (^Q) + 1: Ausgabe an Terminal gesperrt (^S) + P: ENTRY(1), TYWR(T), PTY_INT(0,1), KOPPEL_INT(0,1) + 3-------> 0: und gleichzeitig Bit4/FLAG0=0: ESC wirkt nicht als + Abbruchtaste, sondern ist normales ASCII-Zeichen + 1: ESC wirkt als Abbruchtaste + (Bit5/FLAG0 wird bei Eingabe von ESC gesetzt) + P: ENTRY(0), PTY_INT(T) + 4---------> 0: und gleichzeitig Bit3/FLAG0=0: ESC wirkt nicht als + Abbruchtaste, sondern ist normales ASCII-Zeichen + 1: ESC wirkt als Abbruchtaste + (Bit5/FLAG0 wird bei Eingabe von ESC gesetzt) + P: ENTRY(0), PTY_INT(T), KOPPEL_INT(T), LOAD(1) + 5-----------> 0: Abbruchtaste nicht gedrueckt + 1: Abbruchtaste gedrueckt (ESC) + P: ENTRY(0), PTY_INT(1), KOPPEL_INT(1), LOAD(T), SAW_MCZ(T) + 6-------------> 0: + 1: + P: ENTRY(0) +7---------------> 0: + 1: + P: ENTRY(0) +! + + +FLAG1 BYTE + +! +7 6 5 4 3 2 1 0 + 0-> 0: keine Segmentnummer angegeben (???) + 1: Segmentnummer angegeben (???) + P: ENTRY(0), GET_SGNR(0,1) + 1---> 0: noch Parameter einlesen + 1: alle Parameter eingelesen + P: ENTRY(0), DISPLAY (0,1,T) + 2-----> 0: kein NEXT-Betrieb + 1: NEXT-Betrieb + P: ENTRY(0,T/0), NEXT(1) + 3-------> 0: nur Grossbuchstaben erlaubt + (Kleinbuchstaben werden in Grossbuchstaben umgewandelt) + 1: Klein- und Grossbuchstaben erlaubt + P: ENTRY(1), RD_LINE_BFF(T) + 4---------> 0: Ausgabe bei CR abbrechen + 1: Ausgabe nicht bei CR abbrechen + P: ENTRY(0), WR_OUTBFF(T) + 5-----------> 0: + 1: + P: ENTRY(0) + 6-------------> 0: + 1: + P: ENTRY(0) +7---------------> 0: + 1: + P: ENTRY(0) +! + + + + + + + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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 UINSTR_ERR] + UNIMLEMENTED INSTRUCTIONS! + ARRAY [4 WORD] !:= [%0000 %4000 %8000 PINSTR_ERR] + PRIVILEGED INSTRUCTIONS! + 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 NVI_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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%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)! + + ARRAY [%36 WORD] !unbenutzt! + + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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! +end p_ram diff --git a/WEGA/src/cmd/standalone/sa.diags/sa.test.s b/WEGA/src/cmd/standalone/sa.diags/sa.test.s new file mode 100644 index 0000000..b4b9eda --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/sa.test.s @@ -0,0 +1,3929 @@ +!****************************************************************************** +******************************************************************************* + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1987/88 + P8000 Modul: sa.test (p_test) + + Bearbeiter: J. Zabel, J.Kubisch, M.Klatte + Datum: 1/87 12/87 11/88 7/89 + Version: 1.2 + +******************************************************************************* +******************************************************************************! + +!============================================================================== +Inhaltsuebersicht Modul sa.test +------------------------------ +Dieser Modul umfasst die U8000-Hardwareeigentestprogramme. + +Prozeduren +---------- +_TEST_ +RAM_TEST_SEG0 +MMU_TEST +RAM_TEST_SEG +PRIVINSTR_TRAP +SEGMENT_TRAP +CODE_TRAP +CLR_CTL_REG +LD_SDR +RD_SDR +LD_3SDR +SEGMENT_TRAP_TEST +BY_WO_CMP +FAT_ERR +WR_TESTNR +WR_2SP +WR_2BS +MSG_ERROR +_MSG_MAXSEG +CRC_TEST +PIO_TEST1 +PIO_ISR +CTC_TEST1 +CTC_TEST2 +CTC_TEST3 +CTC_INIT +CTC_ISR +SIO_TEST1 +SIO0_A_TEST2 +SIO0_B_TEST2 +SIO1_A_TEST2 +SIO1_B_TEST2 +SIO_INIT +SIO_ISR +==============================================================================! + + +satest module + + +!anfang prom.include! +!****************************************************************************** +allgemeine Vereinbarungen (Stand: 12.12.1986) +******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +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! + + +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! +wdc procedure !Modul wdc ! + +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! + + +! 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! +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 ZLOAD/ZSEND! +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)! +!---------------------------------------------------! +!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! +MAX_SEGNR WORD !Merker: hoechste vorhandene Segmentnummer! +PUDC_PTR WORD !Absoluter Zeiger fuer Zeichenkette T_PUDC! +REM_PUDC WORD !Merker: Text T_PUDC vollstaendig ausgegeben + (%0000-->nein / %FFFF-->ja)! +ERRPAR_ID WORD !Spezifizierung der 4 Parameter der auszugebenden + Fehlerzeile (Prozedur MSG_ERROR)! +REM_WDC2 WORD !Speicherplatz fuer rueckgelesenen Datenwert! +REM_WDC1 WORD !Speicherplatz fuer Testdatenwert! +REM_MMU1 WORD +REM_MMU2 WORD +REM_INT WORD !Merker: Interrupt aufgetreten (0-->nein)! + ARRAY [%36 WORD] !unbenutzt! +!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! + +! Program Status Area (initialisiert bei Systemstart) ! + + CONSTANT +PTYPORT := %40AC + +PSAREA := %4400 +! 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! + !ARRAY [4 WORD] := [%0000 %C000 %8000 SC_ENTRY] + SYSTEM_CALL INSTRUCTIONS! + !ARRAY [4 WORD] := [%0000 %4000 %8000 MMU_ERR] + SEGMENT TRAP! +PSA_NMI := %4428 + !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 := %443C + !ARRAY [2 WORD] := [%8000 VI_ERR] ! +VI_CTC0_1 := %4440 + !ARRAY [2 WORD] := [%8000 VI_ERR] ! +VI_CTC0_2 := %4444 + !ARRAY [2 WORD] := [%8000 VI_ERR] ! +VI_CTC0_3 := %4448 + !ARRAY [2 WORD] := [%8000 VI_ERR bzw. GO_INT bzw. NXT_INT] + fuer GO bzw. NEXT! + +!PIO1! +VI_PIO1_B := %444C + !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 := %445C + !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 := %446C + !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 := %447C + !ARRAY [224 WORD] := [%8000 VI_ERR] ! + +! Adressvereinbarungen fuer EPROM-Test ! + CONSTANT +MON16_1H := %3FF0 +N_MON16_1H := %3FF2 +MON16_1L := %3FF4 +N_MON16_1L := %3FF6 +MON16_2H := %3FF8 +N_MON16_2H := %3FFA +MON16_2L := %3FFC +N_MON16_2L := %3FFE + +! 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): 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 - Clear Parity + 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 U800-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 prom.include! + +! modulspezifische Vereinbarungen ! + +!++++++++++++ +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! + +!+++++++ +Texte ++++++++! + + INTERNAL + +T_ERR WORD := %000A + ARRAY [* BYTE] :='*** ERROR ' +T_FERR WORD := %0010 + BYTE := BEL + ARRAY [* BYTE] := '*** FATAL ERROR' +T_SEG WORD := %0009 + ARRAY [* BYTE] := 'SEGMENTED' +T_NSEG WORD := %000D + ARRAY [* BYTE] := 'NON-SEGMENTED' +T_JUM WORD := %0008 + ARRAY [* BYTE] := ' JUMPERS' +T_MAXS WORD := %0007 + ARRAY [* BYTE] := 'MAXSEG=' + +T_CUM_ERR1: + WORD := %001F + ARRAY [* BYTE] := 'Seit Start von sa.diags traten ' +T_CUM_ERR2: + WORD := %0006 + ARRAY [* BYTE] := 'keine ' +T_CUM_ERR3: + + WORD := %000B + ARRAY [* BYTE] := 'Fehler auf.' + +!+++++++++ +MMU-Listen ++++++++++! + + INTERNAL +MMU_LISTE1: !MMU-Adressen! + WORD := CODE_MMU + WORD := DATA_MMU + WORD := STACK_MMU + WORD := CODE_MMU + WORD := DATA_MMU +MMU_LISTE2: !Adressen der SDR-Tabellen! + WORD := SDRT0 + WORD := SDRT1 + WORD := SDRT1 + +MMU_LISTE3: !1. Byte: Ausgabewert fuer SAR; + 2. Byte: Ausgabewert fuer DSCR; + 3. Byte: Datenwert, der rueckgelesen werden + muesste ! + ARRAY [3 BYTE] := [%00 %00 %00] + ARRAY [3 BYTE] := [%00 %01 %01] + ARRAY [3 BYTE] := [%00 %02 %02] + ARRAY [3 BYTE] := [%00 %03 %03] + ARRAY [3 BYTE] := [%01 %00 %04] + ARRAY [3 BYTE] := [%02 %00 %08] + ARRAY [3 BYTE] := [%04 %00 %10] + ARRAY [3 BYTE] := [%08 %00 %20] + ARRAY [3 BYTE] := [%10 %00 %40] + ARRAY [3 BYTE] := [%20 %00 %80] + +! Segmentdeskriptoren + ___________Segmentbasisadresse + | ______Limitfeld + | | ____Attributfeld + | | | ! +MMU_LISTE4: array [2 word] := [%0000 %FF00] ! 256 Bloecke ! +MMU_LISTE5: array [2 word] := [%0000 %0000] ! 1 Block ! +MMU_LISTE6: array [2 word] := [%0000 %FF20] ! 1 Block /down write! +MMU_LISTE7: array [2 word] := [%0000 %FF01] ! 256 Bloecke/ read only! +MMU_LISTE8: array [2 word] := [%0100 %0000] ! 1 Block ! +MMU_LISTE9: array [2 word] := [%0101 %0000] ! 1 Block ! +MMU_LISTE10: array [2 word] := [%0000 %0020] ! 256 Bloecke/down write! + +! SDR - Tabellen ! + +SDRT0: array [64 long] +SDRT1: array [64 long] +SDRT2: array [64 long] +SDRT3: array [64 long] +SDRT4: array [64 long] + +!******************************* +Speicherbereich fuer Fehlerliste +*******************************! + + INTERNAL +PAR_CNT_ERR: + ARRAY [4 BYTE] := [%25 %64 %20 %0] !Parameter fuer _printf! +CNT_ERR_LST: + WORD !Zaehler fuer eingetragene Fehler (max. 20)! +CUM_CNT_ERR: + WORD !Kumulativer Zaehler! +PTR_ERR_LST: + WORD !Zeiger auf Fehlerliste! +ERR_LST: + ARRAY [120 WORD] !Speicherbereich fuer 20 Fehlermeldungen! + + +!***************************************************** +Speicherreservierungen fuer WDC-Test (Procedure: _WDC_) +******************************************************! + +TYPE +BUFFER ARRAY [%200 BYTE] ! Sektorpuffer ! + +INTERNAL +TDAT BUFFER ! Testdatenfeld ! +WDC_BUFF BUFFER ! Sektorpuffer ! + +!********* +Prozeduren +*********! + +!------------------------------------------------------------------------------ +In diesem Modul wird das Register rh1 als Flagbyte verwendet. Die einzelnen +Bits haben dabei folgende Bedeutung: +Bit 0 = 0 RAM-Test nicht in Segment 0 + = 1 RAM-Test in Segment 0 + (gesetzt in RAM_TEST_SEG0; + getestet in BY_WO_CMP, WR_TESTNR) +Bit 1 = 0 Byte-Vergleich + = 1 Word-Vergleich + (gesetzt in RAM_TEST_SEG, MMU_TEST; + getestet in BY_WO_CMP) +Bit 2 = 0 ERR_CNT wird in MSG_ERROR inkrementiert + = 1 ERR_CNT wird in MSG_ERROR nicht inkrementiert + (getestet und rueckgesetzt in MSG_ERROR) +Bit 6 = 0 MSG_ERROR wurde seit dem letzten Loeschen des Bits nicht + schon einmal durchlaufen + = 1 MSG_ERROR wurde bereits vorher einmal durchlaufen + (gesetzt und getestet in MSG_ERROR) +Bit 7 = 0 MSG_ERROR wurde seit dem letzten Loeschen des Bits nicht + zweimal durchlaufen + = 1 MSG_ERROR wurde zweimal durchlaufen + (gesetzt in MSG_ERR; + getestet in RAM_TEST_SEG, MMU_TEST, SEGMENT_TRAP_TEST) +------------------------------------------------------------------------------! + +!+++++++++++++++++++++++++++ +PROCEDURE PLACE_ +platzreservierung fuer %8000 ++++++++++++++++++++++++++++! + + INTERNAL + PLACE_ procedure + entry + wval %0000 + end PLACE_ + +!++++++++++++++++++++++++++++ +PROCEDURE TEST_ +TEST-Routine (Monitorkommando) +++++++++++++++++++++++++++++! + + GLOBAL + _EPROM_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + +!------------------------- +Testschritt 40 (EPROM) +Test der EPROM-Pruefsummen +-------------------------! + +!Fuer jeden EPROM wird zuerst getestet, ob die im Modul p_crc abgelegte +Pruefsumme fehlerfrei ist (durch Vergleich mit ihrem ebenfalls in p_crc +abgelegten negierten Wert) - danach wird die Pruefsumme des EPROM's berechnet +und mit dem in p_crc abgelegten Wert verglichen +--- Fehler 40 bei fehlerhafter Pruefsumme ---! + + ld r8, #%40 !Fehler 40: falsche EPROM-Pruefsumme! + ld ERRPAR_ID, #%0000 !Fehlerparameter fuer Fehler 40: + keine Parameter! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r2, #%0000 !Anfangsadresse fuer Pruefsummenbildung! + ld r3, #%1000 !Bytezahl! + ld r4, MON16_1H !erwartete Pruefsumme (aus Modul p_crc)! + ld r5, N_MON16_1H !erwartete negierte Pruefsumme (aus p_crc)! + calr CRC_TEST !Pruefsummentest fuer EPROM MON16_1H; + bei Fehler Abbruch des Testes (FATAL ERROR)! + + ld r2, #%0001 !Anfangsadresse fuer Pruefsummenbildung! + ld r3, #%1000 !Bytezahl! + ld r4, MON16_1L !erwartete Pruefsumme (aus Modul p_crc)! + ld r5, N_MON16_1L !erwartete negierte Pruefsumme (aus p_crc)! + calr CRC_TEST !Pruefsummentest fuer EPROM MON16_1L; + bei Fehler Abbruch des Testes (FATAL ERROR)! + + ld r2, #%2000 !Anfangsadresse fuer Pruefsummenbildung! + ld r3, #%1000-8 !Bytezahl (letzten 8 Byte nicht in CRC-Bildung + einbeziehen, da dort die geraden Werte der + EPROM-Pruefsummen abgespeichert sind)! + ld r4, MON16_2H !erwartete Pruefsumme (aus Modul p_crc)! + ld r5, N_MON16_2H !erwartete negierte Pruefsumme (aus p_crc)! + calr CRC_TEST !Pruefsummentest fuer EPROM MON16_2H; + bei Fehler Abbruch des Testes (FATAL ERROR)! + + ld r2, #%2001 !Anfangsadresse fuer Pruefsummenbildung! + ld r3, #%1000-8 !Bytezahl (letzten 8 Byte nicht in CRC-Bildung + einbeziehen, da dort die ungeraden Werte der + EPROM-Pruefsummen abgespeichert sind)! + ld r4, MON16_2L !erwartete Pruefsumme (aus Modul p_crc)! + ld r5, N_MON16_2L !erwartete negierte Pruefsumme (aus p_crc)! + calr CRC_TEST !Pruefsummentest fuer EPROM MON16_2L; + bei Fehler Abbruch des Testes (FATAL ERROR)! + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _EPROM_ +!--------------------------------------------------- +Testschritt 46 (SRAM) +Test des statischen RAM auf fehlerhafte Datenleitung +---------------------------------------------------! + +!Die Adresse %4000 (1. Adr. des statischen RAM) wird nacheinander mit den Werten +0001,0002,0004,0008,0010,0020,0040,0080,0100,0200,0400,0800,1000,2000,4000, +8000,0001 (jeweils ein Bit gesetzt) beschrieben und wieder rueckgelesen. +--- Fehler 46, wenn ein Wert fehlerhaft rueckgelesen wurde ---! + + GLOBAL + _STAT_RAM_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r8, #%46 !Fehler 46: fehlerhafte Datenleitung! + ld ERRPAR_ID, #%0029 !Fehlerparameter fuer Fehler 46,47,48: + r7, r5, r4! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #%01 !Word-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r7, #%4000 !r7=Fehlerpar. (Testadresse)! + ld r5, #%0001 !r5=Fehlerpar. (Testdatenwert)! + ldb rl0, #%11 !rl0:=Anzahl der Testdatenwerte! +TSRAM1: ld r6, @r7 !urspruengl. Wert auf Testadresse retten! + ld @r7, r5 !Testdatenwert auf Testadr. eintragen! + ld r4, @r7 !r4=Fehlerpar. (rueckgel. Datenwert)! + ld @r7, r6 !urspruengl. Wert wieder eintragen! + calr BY_WO_CMP !Vergleich r4/r5; ggf. Fehler 46! + bitb rh1, #7 !Fehler aufgetreten?! + jr nz, TSRAM2 !ja --> naechster Testschritt! + rl r5, #1 !nein --> neuer Testdatenwert! + dbjnz rl0, TSRAM1 + +!----------------------------------------------- +Testschritt 47/48 (SRAM) +Test auf fehlerhafte '%AAAA'- bzw. '%5555'-Daten +-----------------------------------------------! + +!Der statische RAM wird mit dem Datenwert %AAAA bzw. %5555 +beschrieben und wieder rueckgelesen. +--- Fehler 47, wenn ein %AAAA-Wert fehlerhaft rueckgelesen wurde --- +--- Fehler 48, wenn ein %5555-Wert fehlerhaft rueckgelesen wurde ---! + +TSRAM2: + ld r8, #%47 !Fehler 47: fehlerhafte '%AAAA'-Daten! + ld r5, #%AAAA !r5=Fehlerpar. (Testdatenwert)! +TSRAM3: + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #%01 !Word-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + ld r7, #%4000 !r7=Fehlerpar. (Testadresse)! + ld r0, #%400 !r0:=Word-Anzahl statischer RAM! +TSRAM4: ld r6, @r7 !urspruengl. Wert auf Testadresse retten! + ld @r7, r5 !Testdatenwert auf Testadr. eintragen! + ld r4, @r7 !r4=Fehlerpar. (rueckgel. Datenwert)! + ld @r7, r6 !urspruengl. Wert wieder eintragen! + calr BY_WO_CMP !Vergleich r4/r5; ggf. Fehler 47 bzw. 48! + bitb rh1, #7 !Fehler aufgetreten?! + jr nz, TSRAM5 !ja --> naechster Testschritt! + inc r7, #2 !nein --> naechste Testadresse! + djnz r0, TSRAM4 +TSRAM5: + cp r5, #%5555 !Testschritt 48 abgearbeitet?! + jr z,TSRAM6 !ja, Test beenden! + + + ld r8, #%48 !Fehler 48: fehlerhafte '%5555'-Daten! + ld r5, #%5555 !r5=Fehlerpar. (Testdatenwert)! + jr TSRAM3 + +TSRAM6: + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _STAT_RAM_ +!---------------------------------------- +Testschritt 50 (PIO2) +Test auf fehlerhafte Daten 'AA' oder '55' +----------------------------------------! + +!An die Datenkanaele A und B des PIO2 werden die Daten 'AA' bzw. '55' +ausgegeben und rueckgelesen +--- Fehler 50, wenn ein Wert fehlerhaft rueckgelesen wurde ---! + +!An diesem PIO ist der Winchestercontroller angeschlossen. Deshalb sind +beim PIO-Test bestimmete Restriktionen einzuhalten, die sonst nicht +noetig waeren! + +GLOBAL + _PIO_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r8, #%50 !Fehler 50: fehlerhafte '%AA' bzw. '%55'-Daten! + ld ERRPAR_ID, #%0085 !Fehlerparameter fuer Fehler 50: + r6, rl5, rl4! + xorb rh1, rh1 !Flagbyte rh1 loeschen, + Byte-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + !Restriktion! + ldb rl0, #%20 !Bit5=1; BIT6=0! + outb PIO2D_B, rl0 + ldb rl0, #%0F !Ausgabemode fuer Kanal B! + outb PIO2C_B, rl0 + + ld r6, #PIO2D_A !r6=Fehlerpar. (PIO-Adresse)! + ld r7, #PIO2C_A + calr PIO_TEST1 + ld r6, #PIO2D_B !r6=Fehlerpar. (PIO-Adresse)! + ld r7, #PIO2C_B + calr PIO_TEST1 + + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _PIO_ + + +!--------------------------------------------------------- +Testschritt 52/53 (WDC) +Test auf fehlerhafte Daten 'AAAA' oder '5555' fuer WDC-RAM +---------------------------------------------------------! + +!Der WDC-RAM wird auf der Adresse %2E00 mit den Datenwerten %AAAA bzw. +%5555 beschrieben und wieder rueckgelesen +--- Fehler 52, wenn beim Schreiben ein Fehler vom WDC gemeldet wurde --- +--- Fehler 53, wenn beim Ruecklesen ein Fehler vom WDC gemeldet wurde bzw. + wenn der rueckgesene Wert nicht mit dem geschriebenen Wert + uebereinstimmt ---! + +GLOBAL + _WDC_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + ld r5, #%AAAA !r5=Fehlerpar. (Testdatenwert)! +TWDC1: + ld r8, #%52 !Fehler 52: Schreiben in WDC-RAM fehlerhaft! + ld ERRPAR_ID, #%48 !Fehlerpar. fuer Fehler 52: rl6, r5! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + push @r15, r5 + push @r15, r8 + push @r15, r1 + ld REM_WDC1, r5 !Testdatenwert abspeichern! + ld r7, #4 !Requestcode fuer WDC: Write WDC-RAM! + ldb rl6, #%00 !Low-Teil WDC-RAM-Adresse (%2E00)! + ldb rl5, #%2E !High-Teil WDC-RAM-Adresse (%2E00)! + ld r8, #%00 !Pufferadresse (Segment)! + ld r9, #REM_WDC1 !Pufferadresse (Offset)! + ld r10, #2 !Laenge (2 Byte)! + sc #SC_DISK + pop r1, @r15 + pop r8, @r15 + pop r5, @r15 + test r2 !Returncode! + jr z, TWDC2 !kein Fehler aufgetreten! + + ldb rl6, rl2 !rl6=Fehlerpar. := Returncode! + push @r15, r5 + calr MSG_ERROR !Fehler 52! + pop r5, @r15 + +TWDC2: + ld r8, #%53 !Fehler 53: Lesen aus WDC-RAM fehlerhaft! + ld ERRPAR_ID, #%4A !Fehlerpar. fuer Fehler 53: rl6, r5, r4! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #01 !Word-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + push @r15, r5 + push @r15, r8 + push @r15, r1 + ld REM_WDC2, #0 !Platz fuer rueckgelesenen Datenwert loeschen! + ld r7, #3 !Requestcode fuer WDC: Read WDC-RAM! + ldb rl6, #%00 !Low-Teil WDC-RAM-Adresse (%2E00)! + ldb rl5, #%2E !High-Teil WDC-RAM-Adresse (%2E00)! + ld r8, #%00 !Pufferadresse (Segment)! + ld r9, #REM_WDC2 !Pufferadresse (Offset)! + ld r10, #2 !Laenge (2 Byte)! + sc #SC_DISK + pop r1, @r15 + pop r8, @r15 + pop r5, @r15 + ldb rl6, rl2 !rl6=Fehlerpar. := Returncode! + ld r4, REM_WDC2 !r4=Fehlerpar. := rueckgelesener Datenwert! + test r2 !Returncode! + jr z, TWDC3 !kein Fehler aufgetreten! + + push @r15, r5 + calr MSG_ERROR !Fehler 53! + pop r5, @r15 + jr TWDC_END +TWDC3: + push @r15, r5 + calr BY_WO_CMP !Vergleich r4/r5, ggf. Fehler 53! + pop r5, @r15 +TWDC4: + cp r5, #%5555 + jr z, TWDC5 !naechster Testschritt! + ld r5, #%5555 !Test mit Datenwert %5555! + jr TWDC1 + +!------------------------------------------- +Testschritt 54 (WDC) +Test auf richtige Kommandoauswertung des WDC +-------------------------------------------! + +!An den WDC wird ein ungueltiger Kommandokode ausgegeben; als Returnkode +muesste daruafhin %01 zurueckgegeben werden +--- Fehler 54, wenn der Returncode ungleich %01 ist ---! + +TWDC5: + ld r8, #%54 !Fehler 54: falsche Kommandoauswertung des WDC! + ld ERRPAR_ID, #%40 !Fehlerpar. fuer Fehler 54: rl6! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + push @r15, r8 + push @r15, r1 + ld r7, #5 !Requestcode fuer WDC: ungueltiger Code! + sc #SC_DISK + pop r1, @r15 + pop r8, @r15 + cp r2, #%01 !Returncode = %01?! + jr z, TWDC6 !ja, d.h. kein Fehler! + + ldb rl6, #%C1 !WDC-Fehlerkode %C1 ausgeben! + calr MSG_ERROR !Fehler 54! + jr TWDC_END + +TWDC6: + +! Testdaten auf Zylinder 0, Kopf 1, Sektor 1 schreiben. + Meldet der WDC kein Status 0 (r2>0), dann wird der + Fehlercode %58 mit Statusbyte rl2 ausgegeben ! + +! Testdatenbereich TDAT initialisieren ! + ld r7,#TDAT + ld r6,r7 + inc r6,#1 + ld r5, #sizeof BUFFER + ldb @r7,#%55 ! Erstes Byte laden ! + ldirb @r6,@r7,r5 ! Bereich fuellen ! + + ld ERRPAR_ID,#%40 ! Fehlerparameter (rl6) ! + + ldb rh7,#2 ! WDC-Kommandocode ! + ld r3,#TDAT ! Programmbereich der auf HD geschrieben wird! + calr DO_WDC + + test r2 ! Returncode = 0 ? ! + jr z,TWDC10 + + ld r8,#%58 ! Fehlercode ! + ldb rl6,rl2 ! rl6=Fehlerpar. := Returncode ! + calr MSG_ERROR ! Fehlerausgabe ! + jr TWDC_END + +TWDC10: +! Zylinder 0, Kopf 1, Sektor 1 in Datenpuffer lesen. + Meldet der WDC kein Status 0 (r2>0), dann wird der + Fehlercode %59 mit Statusbyte rl2 ausgegeben ! + + ldb rh7,#1 ! WDC-Kommandocode ! + ld r3,#WDC_BUFF ! Zieladresse ! + calr DO_WDC ! WDC action ! + + test r2 + jr z,TWDC20 + + ld r8,#%59 ! Code fuer Schreibfehler HD ! + ldb rl6,rl2 ! Parameter = Statusbyte ! + calr MSG_ERROR + jr TWDC_END + +TWDC20: +! Datenpuffer mit Solldaten vergleichen. Sind die Daten des + gelesenen Sektors nicht mit den Daten beim Schreiben ueberein, + wird der Fehlercode %51 gemeldet. + Parameter sind: Sollbyte Istbyte Lfd.-Nr. ! + + ld ERRPAR_ID,#%58 ! Ausgabe rl6,rl7,r5 ! + + ld r9,#WDC_BUFF ! Istdatenbereich ! + ld r10,#TDAT ! Solldatenbereich ! + ld r4,#sizeof BUFFER ! Datenlaenge ! + ld r5,r4 + cpsirb @r9,@r10,r4,NE ! Vergleich bis ungleichheit ! + jr nz,TWDC30 ! JP wenn keine Fehler ! + + ld r8,#%51 ! Fehler beim schreiben/lesen eines Sektors ! + dec r9,#1 ! Adresse zurueckstellen ! + ldb rl7,@r9 ! Ist-Byte laden ! + dec r10,#1 ! Adsresse zurueckstellen ! + ldb rl6,@r10 ! Soll-Byte laden ! + sub r5,r4 ! Lfd.-Nr. := %200 - counter r4 ! + calr MSG_ERROR + jr TWDC_END + +TWDC30: +! Zylinder 0, Kopf 1, Sektor 1 loeschen. ! + + ld r7,#WDC_BUFF + ld r6,r7 + inc r6,#1 + ld r5, #sizeof BUFFER + ldb @r7,#0 ! Erstes Byte laden ! + ldirb @r6,@r7,r5 ! Sektorpuffer loeschen ! + + ldb rh7,#2 ! WDC-Kommandocode (write) ! + ld r3,#WDC_BUFF + calr DO_WDC ! Sektor loeschen ! + + +TWDC_END: + ldb rl0, #%20 !Bit5=1; BIT6=0! + outb PIO2D_B, rl0 ! RESET an WDC ! + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _WDC_ + + +!-------------------------------------------------------------------- +Testschritt 55 (CTC0/CTC1) +Test auf fehlerhafte Daten 'AA' oder '55' fuer Zeitkonstantenregister +--------------------------------------------------------------------! + +!An die Zeitkonstantenregister der einzelnen CTC-Kanaele die Daten +'AA' bzw. '55' ausgegeben und rueckgelesen +--- Fehler 55, wenn ein Wert fehlerhaft rueckgelesen wurde ---! + +GLOBAL + _CTC_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r8, #%55 !Fehler 55: fehlerhafte '%AA' bzw. '%55'-Daten! + ld ERRPAR_ID, #%0085 !Fehlerparameter fuer Fehler 55: + r6, rl5, rl4! + xorb rh1, rh1 !Flagbyte rh1 loeschen, + Byte-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%FFFF !Wartezeit, um Ausgabe der Testschritt- + nummer zu garantieren im Falle, dass die + Ausgabe ueber Terminalkanal SIO0_B / CTC0_1 + erfolgt und nicht ueber Koppelschnittstelle! +WARTE1: djnz r0, WARTE1 + + ld r6, #CTC0_0 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC0_1 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC0_2 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC0_3 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC1_0 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC1_1 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC1_2 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + ld r6, #CTC1_3 !r6=Fehlerpar. (CTC-Kanal-Adresse)! + calr CTC_TEST1 + +!-------------------------- +Testschritt 56 (CTC0/CTC1) +Test, ob CTC-Kanaele zaehlen +---------------------------! + +!Die CTC-Kanaele werden im Zeitgebermode programmiert, es wird eine +Zeitkonstante ausgegeben und diese nach einer bestimmten Wartezeit rueckgelesen +--- Fehler 56, wenn sich die Zeitkonstante nicht gaendert hat, d.h. wenn + der Kanal nicht zaehlt ---! + + ld r8, #%56 !Fehler 56: CTC-Kanal zaehlt nicht! + ld ERRPAR_ID, #%0080 !Fehlerparameter fuer Fehler 56: r6! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%FFFF !Wartezeit, um Ausgabe der Testschritt- + nummer zu garantieren im Falle, dass die + Ausgabe ueber Terminalkanal SIO0_B / CTC0_1 + erfolgt und nicht ueber Koppelschnittstelle! +WARTE2: djnz r0, WARTE2 + + ld r6, #CTC0_0 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC0_1 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC0_2 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC0_3 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC1_0 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC1_1 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC1_2 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + ld r6, #CTC1_3 !r6=Fehlerpar. (CTC-Kanaladresse)! + calr CTC_TEST2 + +!-------------------------- +Testschritt 57 (CTC0/CTC1) +Test des Interruptsystems +--------------------------! + +!Die CTC-Kanaele werden auf ihre Interruptfaehigkeit getestet, indem sie +als Zeitgeber programmiert werden (mit Interrupt) und eine Zeitkonstante +ausgegeben wird +--- Fehler 57, wenn kein Interrupt erfolgt ---! + + ld r8, #%57 !Fehler 57: CTC-Kanal interruptet nicht! + ld ERRPAR_ID, #%0080 !Fehlerparameter fuer Fehler 57: r6! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%FFFF !Wartezeit, um Ausgabe der Testschritt- + nummer zu garantieren im Falle, dass die + Ausgabe ueber Terminalkanal SIO0_B / CTC0_1 + erfolgt und nicht ueber Koppelschnittstelle! +WARTE3: djnz r0, WARTE3 + + push @r15, VI_TAB_REST+2 !urspruengl. Wert retten! + push @r15, VI_TAB_REST+6 !urspruengl. Wert retten! + push @r15, VI_TAB_REST+10 !urspruengl. Wert retten! + push @r15, VI_TAB_REST+14 !urspruengl. Wert retten! + + ld VI_TAB_REST+2, #CTC_ISR !Adresse ISR in PSAREA eintr.! + ld VI_TAB_REST+6, #CTC_ISR !Adresse ISR in PSAREA eintr.! + ld VI_TAB_REST+10, #CTC_ISR !Adresse ISR in PSAREA eintr.! + ld VI_TAB_REST+14, #CTC_ISR !Adresse ISR in PSAREA eintr.! + + ldb rl0, #%20 !Interruptvektor (VI_TAB_REST)! + outb CTC0_0, rl0 + outb CTC1_0, rl0 + + ld r6, #CTC0_0 + calr CTC_TEST3 + ld r6, #CTC0_1 + calr CTC_TEST3 + ld r6, #CTC0_2 + calr CTC_TEST3 + ld r6, #CTC0_3 + calr CTC_TEST3 + ld r6, #CTC1_0 + calr CTC_TEST3 + ld r6, #CTC1_1 + calr CTC_TEST3 + ld r6, #CTC1_2 + calr CTC_TEST3 + ld r6, #CTC1_3 + calr CTC_TEST3 + + pop VI_TAB_REST+14, @r15 !urspruengl. Wert zurueckspeichern! + pop VI_TAB_REST+10, @r15 !urspruengl. Wert zurueckspeichern! + pop VI_TAB_REST+6, @r15 !urspruengl. Wert zurueckspeichern! + pop VI_TAB_REST+2, @r15 !urspruengl. Wert zurueckspeichern! + + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _CTC_ + +!--------------------------------------------------------------- +Testschritt 60 (SIO0/SIO1) +Test auf fehlerhafte Daten 'AA' oder '55' fuer Interruptregister +---------------------------------------------------------------! + +!An die Interruptregister der SIO's werden die Daten 'AA' bzw. '55' +ausgegeben und rueckgelesen +--- Fehler 60, wenn ein Wert fehlerhaft rueckgelesen wurde ---! + +GLOBAL + _SIO_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r8, #%60 !Fehler 60: fehlerhafte '%AA' bzw. '%55'-Daten! + ld ERRPAR_ID, #%0085 !Fehlerparameter fuer Fehler 60: + r6, rl5, rl4! + xorb rh1, rh1 !Flagbyte rh1 loeschen, + Byte-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%FFFF !Wartezeit, um Ausgabe der Testschritt- + nummer zu garantieren im Falle, dass die + Ausgabe ueber Terminalkanal SIO0_B / CTC0_1 + erfolgt und nicht ueber Koppelschnittstelle! +WARTE4: djnz r0, WARTE4 + + ld r6, #SIO0D_B !r6=Fehlerpar. (SIO-Adresse)! + ld r7, #SIO0C_B + calr SIO_TEST1 + ld r6, #SIO1D_B !r6=Fehlerpar. (SIO-Adresse)! + ld r7, #SIO1C_B + calr SIO_TEST1 + +!-------------------------- +Testschritt 61 (SIO0/SIO1) +Test des Interruptsystems +--------------------------! + +!Die SIO-Ports werden auf ihre Interruptfaehigkeit getestet, indem sie +auf Senderinterrupt programmiert werden und ein Byte ausgegeben wird +--- Fehler 61, wenn kein Interrupt erfolgt ---! + + ld r8, #%61 !Fehler 61: SIO-Port interruptet nicht! + ld ERRPAR_ID, #%0080 !Fehlerparameter fuer Fehler 61: r6! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%FFFF !Wartezeit, um Ausgabe der Testschritt- + nummer zu garantieren im Falle, dass die + Ausgabe ueber Terminalkanal SIO0_B / CTC0_1 + erfolgt und nicht ueber Koppelschnittstelle! +WARTE5: djnz r0, WARTE5 + + push @r15, VI_TAB_REST+2 !urspruengl. Wert retten! + push @r15, VI_TAB_REST+18 !urspruengl. Wert retten! + + ld VI_TAB_REST+2, #SIO_ISR !Adresse ISR in PSAREA eintr.! + ld VI_TAB_REST+18, #SIO_ISR !Adresse ISR in PSAREA eintr.! + + calr SIO0_A_TEST2 + calr SIO0_B_TEST2 + calr SIO1_A_TEST2 + calr SIO1_B_TEST2 + + pop VI_TAB_REST+18 @r15 !urspruengl. Wert zurueckspeichern! + pop VI_TAB_REST+2, @r15 !urspruengl. Wert zurueckspeichern! + + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + + ret + end _SIO_ +!--------------------------------------------- +Testschritt 70 (0000 'P') +Test auf externen Speicher (hoechstes Segment) +---------------------------------------------! + +!Beginnend bei Segment 0 wird jeweils bei den Offsetadressen %8000 und %FFFE +getestet, ob RAM vorhanden ist (auf der Adresse wird die Segmentnummer des +betrachteten Segments eingetragen und rueckgelesen). Wenn auf beiden Adressen +kein RAM vorhanden ist, ist die vorherige Segmentadresse die hoechste. +--- Fehler 70, wenn kein Segment vorhanden ist ---! + +GLOBAL + _DYN_RAM_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r8, #%70 !Fehler 70: NO EXTERNAL MEMORY! + ld ERRPAR_ID, #%0000 !Fehlerparameter fuer Fehler 70: + keine Parameter! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + xor r6, r6 !r6 (rh6) := Segmentnummer (=0)! + ld MAX_SEGNR, r6 !hoechste Segmentnummer initialisieren (:=0)! + + ldb rl5, #%A5 +C_SEG: + ldb rl0, #%02 !Schleifenzaehler (2 Adressen testen)! + ldb rh5, rh6 !rh5:=Segmentnummer des zu testenden Segments! + ld r7, #%8000 !1. betrachtete Offsetadresse des Segments! +C_SEGL: + sc #SC_SEGV + ld @r6, r5 !r5 (rh5=akt.Segnr./rl5=%A5) in RAM eintragen! + ld r4, @r6 !ruecklesen! + sc #SC_NSEGV + cp r5, r4 !ruecklesbar! + jr z, INC_SEG !Sprung wenn Segment vorhanden! + ld r7, #%FFFE !2. betrachtete Offsetadresse des Segments! + dbjnz rl0, C_SEGL + + decb rh6, #%01 !betrachtetes Segment nicht vorhanden; + rh6:=hoechstes vorhandenes Segment! + cpb rh6, #0 + jr ge, _SEG_IO !mindestens Segment 0 vorhanden! + jp FAT_ERR !Fehler: kein Segment vorhanden! + +INC_SEG: + ld MAX_SEGNR, r6 !hoechste Segmentnummer retten! + incb rh6, #1 !Segmentadresse erhoehen! + jr C_SEG !naechstes Segment testen! + +!------------------------ +Testschritt 71 (0001 'O') +Test Segmentadressen +------------------------! + +!Beginnend beim hoechsten Segment wird bis zum Segment 0 auf den Offset- +adressen %8000 und %FFFE die im vorherigen Testschritt auf diesen Adressen +eingetragenen Segmentnummern rueckgelesen und mit der Segmentnummer des +betrachteten Segments verglichen. +--- Fehler 71, wenn der Vergleich auf beiden Adressen eines Segments + negativ ausfaellt ---! + +_SEG_IO: + ld r8, #%71 !Fehler 71: SEG. ADDR. FAULT! + ld ERRPAR_ID, #%00E1 !Fehlerparameter fuer Fehler 71: + , r7, rl4 ! + calr WR_TESTNR !Ausgabe der Testschrittnummer! +T_SEGR: + ldb rl0, #%02 !Schleifenzaehler (2 Adressen testen)! + ld r7, #%8000 !1. betrachtete Offsetadresse des Segments! +SEGR_LOOP: + sc #SC_SEGV + ldb rl4, @r6 !ruecklesen der im vorherigen Testschritt in + RAM eingetragene Segmentnummer! + sc #SC_NSEGV + cpb rh6, rl4 !ruecklesbar ? ! + jr z, DEC_SEG !Segment i.O.! + ld r7, #%FFFE !2. betrachtete Offsetadresse des Segments! + dbjnz rl0, SEGR_LOOP + jp FAT_ERR !Fehler: falsche Segmentadresse! + +DEC_SEG: + decb rh6, #%01 !Segmentnummer decrementieren! + cpb rh6, #%00 + jr ge, T_SEGR !naechstes Segment testen! + +!------------------------------------------------------------------ +Testschritte 72, 73, 74, 75, 76 (0100, 0101, 0102, 0103, 0104 'W') +RAM-Test (ausser Segment 0) +------------------------------------------------------------------! + +! +--- Fehler 72, 73, 74, 75 - siehe RAM_TEST_SEG --- +--- Fehler 76 wenn kein fehlerfreies Segment groesser 0 vorhanden ist --- +! + + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + ld REM_ERR_CNT, #0 !Merker: Stand Fehlerzaehler loeschen! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + ld r6, MAX_SEGNR !r6:=hoechste Segmentnummer! + ldctl r9, FCW !r9:=Stand FCW! + +RAM_CHK: + calr RAM_TEST_SEG !RAM-Test im Segment r6! + + ld r2, ERR_CNT !r2:=Stand Fehlerzaehler nach Aufruf von + RAM_TEST_SEG! + cp r2, REM_ERR_CNT !Vergleich mit Stand Fehlerzaehler vor + Aufruf von RAM_TEST_SEG! + jr z, T_LOOP !kein Fehler aufgetreten --> Segment r6 i.O.! + + !Segment r6 nicht i.O.! + ld REM_ERR_CNT, r2 !neuen Stand Fehlerzaehler merken! + cp r6, MAX_SEGNR !war fehlerhaftes Segment das hoechste?! + jr nz, T_LOOP !nein --> naechstes Segment testen! + + !ja! + ld r8, #%76 !Fehler 76: No Good Segments Above Zero! + ld ERRPAR_ID, #%0000 !Fehlerparameter fuer Fehler 76: + keine Parameter! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + decb rh6, #%01 !hoechste SEGMENTNR. DEKREMENTIEREN! + testb rh6 + jp z, FAT_ERR !hoechste Segmentnummer war 1 und Segment 1 ist + fehlerhaft --> Fehler 76! + ld MAX_SEGNR, r6 !hoechste Segmentnummer neu laden, da + bisheriges hoechstes Segment fehlerhaft ist! + incb rh6, #%01 + +T_LOOP: !naechtes Segment testen! + decb rh6, #%01 !SEGMENTNR. DEKREMENTIEREN! + cpb rh6, #%00 + jr gt, RAM_CHK !alle Segmente > 0 testen! + +!------------------------------------------------------ +Testschritt 72, 73, 74, 75 (0100, 0101, 0102, 0103 'E') +RAM-Test Segment 0 +------------------------------------------------------! + +! +--- Fehler 72,73,74,75 - siehe RAM_TEST_SEG --- +! + xor r6, r6 !Segmentnummer 0! + ld r3, #S_BNK !Adresse S_BNK fuer Monitor PROM+RAM + ein- und ausschalten! + + ld r10, r6 !Quell-Segment=0! + ld r12, MAX_SEGNR !Ziel-Segment=hoechstes Segment! + ld r11, r6 !Quell-Offset=0! + ld r13, r6 !Ziel-Offset=0! + ld r9, #%8000 !Transferlaenge=ganzes Segment! + sc #SC_SEGV + ldir @r12, @r10, r9 !Transfer des Monitors in hoechstes Segment! + + ld r13, #RAM_TEST_SEG0 !Adresse fuer Programmfortsetzung laden + (RAM_TEST_SEG0 im hoechsten Segment)! + ld r11, #CONTINUE !Folgeadresse nach RAM_TEST_SEG0 laden! + + jp @r12 !Sprung in hoechstes Segment zu RAM_TEST_SEG0! + +CONTINUE: + ldctl r9,FCW + res r9,#%0F + ldctl FCW,r9 !Nichtsegmentierten Mode einstellen! + + add r3,ERR_CNT !Fehler aus RAM_TEST_SEG0 addieren! + ld ERR_CNT,r3 + + + calr WR_2BS !2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _DYN_RAM_ + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE RAM_TEST_SEG0 +RAM-Test im Segment 0 ausfuehren +Input: r6 - Segmentnummer des zu testenden Segments (= %0000) +Output: r3 - Stand Fehlerzaehler (ERR_CNT) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + RAM_TEST_SEG0 procedure + entry + ldctl r9, FCW !r9:=Stand FCW! + res r9, #%0F + ldctl FCW, r9 !nichtsegmentierten Mode einstellen! + + push @r15,r12 !r12 retten! + +!Terminalinterrupts sperren! + testb PTYPORT !8-Bit-Teil aktiv?! + jr z, RATE01 !nein! + + !Terminal 8-Bit-Teil: + Empfaenger- und Senderinterrupts sperren! + ldb rl0, #SIO0C_B_8 !Adresse SIO0C_B auf 8-Bit-Teil! + ldb rh0, #SIO_R1 + call KP_OUTB !Datenbyte rh0 an SIO-Adr. rl0 ausgeben! + ldb rh0, #DRCVRI !Empfaengerinterrupt aus! + call KP_OUTB !Datenbyte rh0 an SIO-Adr. rl0 ausgeben! + jr RATE02 +RATE01: !Terminal 16-Bit-Teil: + Empfaengerinterrupts sperren! + ld r2, #SIO0C_B + ldb rh4, #SIO_R1 + outb @r2, rh4 + ldb rl4, #DRCVRI !Empfaengerinterrupt aus! + outb @r2, rl4 + +RATE02: + inb rh2, S_BNK + setb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM ausschalten! + + setb rh1, #%00 !Test in Segment 0! + calr RAM_TEST_SEG !Ramtest des Segment 0! + + inb rh2, S_BNK + resb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM einschalten! + +!Terminalinterrupts wieder zulassen! + testb PTYPORT !8-Bit-Teil aktiv?! + jr z, RATE03 !nein! + + !Terminal 8-Bit-Teil: + Empfaenger- und Senderinterrupts zulassen! + ldb rl0, #SIO0C_B_8 !Adresse SIO0C_B auf 8-Bit-Teil! + ldb rh0, #SIO_R1 + call KP_OUTB !Datenbyte rh0 an SIO-Adr. rl0 ausgeben! + ldb rh0, #PDAVCT+SAVECT+XMTRIE + call KP_OUTB !Datenbyte rh0 an SIO-Adr. rl0 ausgeben! + jr RATE04 +RATE03: !Terminal 16-Bit-Teil: + Empfaengerinterrupts zulassen! + ld r2, #SIO0C_B + ldb rh4, #SIO_R1 + outb @r2, rh4 + ldb rl4, #PDAVCT+SAVECT + outb @r2, rl4 + +RATE04: + ld r3, ERR_CNT !r3:=Anzahl der Fehler bei RAM_TEST_SEG0 + (RAM-Zelle ERR_CNT liegt hier im hoechsten + Segment)! + pop r12,@r15 !r12 wiederherstellen! + + set r9, #%0F + ldctl FCW, r9 !segmentierten Mode einstellen! + + ld r2,r11 !Folgeadresse nach RAM_TEST_SEG0! + xor r6,r6 + ld r11,r6 !Zieloffset! + ld r13,r6 !Quelloffset! + ld r9,#%8000 !Anzahl! + ldir @r10,@r12,r9 !Rueckspeichern Segment 0! + ld r11,r2 + + jp @r10 !Ruecksprung ins Segment 0 zu CONTINUE! + end RAM_TEST_SEG0 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE MMU_TEST +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + _MMU_ procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT,#%0000 !Fehlerzaehler loeschen! + + xorb rh1, rh1 !Flagbyte rh1 loeschen! + +!MMU-ID in Mode-Register eintragen! + ldb rl2,#%02 + soutb ALL_MMU, rl2 !Fuer alle 3 MMU: ID=02! + SOUTB ALL_MMU + %1100, RL2 !Reset Violation-Type-Register! + +!Adresse fuer Segment-Trap und Priv.-Instr.-Trap aus PSAREA retten! + ldctl r9, PSAP !=PSAPOFF! + ld r4, %26(r9) !Offsetadresse fuer Segment-Trap! + ld REM_SEGMENT_TRAP, r4 + ld r4, %16(r9) !Offsetadresse fuer Priv.-Instr.-Trap! + ld REM_PRIVINSTR_TRAP, r4 +!Adresse fuer Segment-Trap und Priv. Instr. Trap in PSAREA neu setzen! + ld %22(r9), #%4000 !FCW=nonsegmented! + ld %24(r9), #%0000 !Segmentadresse=0! + ld %26(r9), #SEGMENT_TRAP !Offsetadresse! + ld %12(r9), #%4000 !FCW=nonsegmented! + ld %14(r9), #%0000 !Segmentadresse=0! + ld %16(r9), #PRIVINSTR_TRAP !Offsetadresse! + +!SDR-Tabellen fuer Test laden! + ld r10, #SDRT1 !SDRT1 ... SDRT1+%FF mit %00 laden! + ld r11, #SDRT1 + 1 + xor r5, r5 + ld r0, #255 + ldb @r10, rl5 + ldirb @r11, @r10, r0 + + ld r10, #SDRT0 !SDRT0 ... SDRT0+%FF mit %00 BIS %FF laden! +LD_INC: + ldb @r10, rl5 + inc r10, #1 + inc r5, #1 + bitb rh5, #0 + jr z, LD_INC + + ld r10, #SDRT2 !SDRT2 ... SDRT2+%FF mit %AA laden! + ld r11, #SDRT2 + 1 + ld r5, #%AAAA + ld r0, #255 + ldb @r10, rl5 + ldirb @r11, @r10, r0 + + ld r10, #SDRT3 !SDRT3 ... SDRT3+%FF mit %55 laden! + ld r11, #SDRT3 + 1 + ld r5, #%5555 + ld r0, #%00FF + ldb @r10, rl5 + ldirb @r11, @r10, r0 + +!Schleife L14E2 (Testschritt 80, 81, 82, 83) wird 3x durchlaufen mit +r2=0,2,4 (r2-Zeiger auf 1. MMU-Adresse in MMU_LISTE1 fuer den entsprechenden +Durchlauf! + xor r2, r2 !r2=0 (1. Schleifendurchlauf) + Reihenfolge der MMU's: + 1. CODE-, 2. DATA-, 3. STACK-MMU! + !r2=2 (2. Schleifendurchlauf) + Reihenfolge der MMU's: + 1. DATA-, 2. STACK-, 3. CODE-MMU! + !r2=4 (3. Schleifendurchlauf) + Reihenfolge der MMU's: + 1. STACK-, 2. CODE-, 3. DATA-MMU! +L14E2: + +!--------------------------------------------------------- +Testschritt 80 (0300) +Test auf individuelle Adressierbarkeit der einzelnen MMU's +---------------------------------------------------------! +! +--- Fehler 80, wenn MMU's nicht einzeln addressierbar --- +! + + ld r8, #%80 !Fehler 80: MMU's Not Individually Adressable! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + xor r3, r3 + +!64 SDR der 3 MMU's fuellen! + ld r6, MMU_LISTE1(r2) !Adresse der 1. MMU des entsprechenden + Durchlaufes: CODE-MMU (1. Durchlauf) + bzw. DATA-MMU (2. Durchlauf) + bzw. STACK-MMU (3. Durchlauf) ! + ld r11, #SDRT0 !Anfangsadresse der SDR-Tabelle im Speicher! + calr LD_SDR !64 SDR der 1. MMU des Durchlaufes fuellen mit + Inhalt des Speicherbereiches SDRT0 ... SDRT0+%FF! + + incb rl2, #%02 + ld r6, MMU_LISTE1(r2) !Adresse der 2. MMU des entsprechenden + Durchlaufes: DATA-MMU (1. Durchlauf) + bzw. STACK-MMU (2. Durchlauf) + bzw. CODE-MMU (3. Durchlauf) ! + ld r11, #SDRT1 !Anfangsadresse der SDR-Tabelle im Speicher! + calr LD_SDR !64 SDR der 2. MMU des Durchlaufes fuellen mit + Inhalt des Speicherbereiches SDRT1 ... SDRT1+%FF! + + incb rl2, #%02 + ld r6, MMU_LISTE1(r2) !Adresse der 3. MMU des entsprechenden + Durchlaufes: STACK-MMU (1.Durchlauf) + bzw. CODE-MMU (2. Durchlauf) + bzw. DATA-MMU (3. Durchlauf)! + calr LD_SDR !64 SDR der 3. MMU des Durchlaufes fuellen mit + Inhalt des Speicherbereiches SDRT1 ... SDRT1+%FF! + + decb rl2, #%04 !Zeiger in MMU_LISTE1 wieder auf 1. MMU des + entsprechenden Durchlaufes stellen! + +!Vergleich: geschriebener mit rueckgelesener SDR-Tabelle fuer die +3 MMU's des entsprechenden Durchlaufes +(r3=0: 1. MMU / r3=2: 2. MMU / r3=4: 3. MMU des Durchlaufes)! +L150E: + ld r9, r3 + add r9, r2 + ld r6, MMU_LISTE1(r9) !Adresse der 1. bzw. 2. bzw. 3. MMU + entsprechend r3! + ld r11, MMU_LISTE2(r3) !Anfangsadresse der zugehoerigen SDR- + Tabelle im Speicher! + calr RD_SDR !Vergleich: geschriebene und rueckgelesene + SDR-Tabelle; ggf. Fehler 80! + incb rl3, #2 ! Pointer auf naechste Adresse stellen ! + cpb rl3, #6 + jr nz, L150E !naechste MMU! + +!---------------------------------- +Testschritt 81 (0301) +Test der SAR- bzw. DSCR-Indizierung +----------------------------------! +! +--- Fehler 81, wenn die SAR- oder DSCR-Indizierung fehlerhaft ist --- +! + + ld r8, #%81 !Fehler 81: SAR Or DSCR Indexing Fault! + andb rh1, #%01 !Flagbyte Bit 1-7 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%001E !Anzahl der Bytes der MMU_LISTE3! + !(10 x 3 Bytes)! + ld r6, MMU_LISTE1(R2) !Adresse der 1. MMU des entsprechenden + Durchlaufes: CODE-MMU (1. Durchlauf) + bzw. DATA-MMU (2. Durchlauf) + bzw. STACK-MMU (3. Durchlauf) ! + ld r3, #MMU_LISTE3 +!Schleife L1538 wird 10 mal durchlaufen, wobei bei jedem Durchlauf 3 Bytes + der MMU_LISTE3 benutzt werden (1.Byte: write SAR; 2.Byte: write DSCR; + 3.Byte: Datenwert, der rueckgelesen werden muesste)! +L1538: + ld r10, r6 !Adresse der 1. MMU des Durchlaufes! + add r10, #%0100 !Write Segment-Adress-Register (SAR)! + ldb rl7, @r3 + sllb rl7, #%02 !Shift 2 nach links! + soutib @r10, @r3, r0 !Beschreiben SAR mit akt. Byte der MMU_LISTE3! + !incr r3 / decr r0! + + ld r10, r6 !Adresse der 1. MMU des Durchlaufes! + add r10, #%2000 !Write Descriptor-Selector-Counter-Reg. (DSCR)! + addb rl7, @r3 !rl7=Fehlerpar. (SDR FELD#)! + soutib @r10, @r3, r0 !Beschreiben DSCR mit akt. Byte der MMU_LISTE3! + !incr r3 / decr r0! + + ld r10, r6 !Adresse der 1. MMU des Durchlaufes! + add r10, #%0F00 !Read Descriptor and increment SAR! + ldb rl5, @r3 !rl5=Fehlerpar. (Testdatenwert (Datenwert, der + rueckgelesen werden muesste))! + ld r9, #REM_MMU_SINOUT !Speicherplatz fuer rueckgelesenen Wert! + sinib @r9, @r10, r0 !Ruecklesen! + !incr r9 / decr r0! + dec r9, #%01 + ldb rl4, @r9 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + calr BY_WO_CMP !Vergleich rl4/rl5; ggf. Fehler 81! + bitb rh1, #%07 + jr nz, L1578 !Fehler aufgetreten, naechster Testschritt! + inc r3, #%01 !r3 auf naechstes Byte in MMU_LISTE3 stellen! + testb rl0 !MMU_LISTE3 abgearbeitet?! + jr nz, L1538 !nein! + +!-------------------- +Testschritt 82 (0302) +Test der SDR-Daten +--------------------! +! +--- Fehler 82, wenn SDR-Daten 'AA' oder '55' fehlerhaft sind --- +! + + ld r8, #%82 !Fehler 82: SDR 'As' Or '5s' Data Fault! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + +L1578: + ld r11, #SDRT2 !Anfangsadresse der SDR-Tabelle im Speicher! + calr LD_SDR !64 SDR der 1. MMU des Durchlaufes fuellen + mit 'AA' (Inhalt Speicherbereich SDRT2 ... SDRT2+%FF)! + calr RD_SDR !Vergleich geschriebene mit rueckgelesene + SDR-Tabelle; ggf. Fehler 82! + ld r11, #SDRT3 !Anfangsadresse der SDR-Tabelle im Speicher! + calr LD_SDR !64 SDR der 1. MMU des Durchlaufes fuellen + mit '55' (Inhalt Speicherbereich SDRT3 ... SDRT3+%FF)! + calr RD_SDR !Vergleich geschriebene mit rueckgelesene + SDR-Tabelle; ggf. Fehler 82! + +!---------------------------------- +Testschritt 83 (0303) +Test der MMU-Control-Register-Daten +----------------------------------! +! +--- Fehler 83, wenn MMU-Control-Register-Daten 'AA' oder '55' + fehlerhaft sind --- +! + + ld r8, #%83 !Fehler 83: MMU Control Register 'As' Or '5s' + Fault! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + ld ERRPAR_ID, #%0025 !Fehlerparameter fuer Fehler 83: + r7, rl5, rl4! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r9, #REM_MMU_SINOUT !Speicherplatz fuer Testdaten! + ld @r9, #%AAAA !Test mit Daten 'AA'! + ldb rl0, #%02 !2 Durchlaeufe fuer Schleife L15A4 + (fuer Daten 'AA' bzw. '55')! +L15A4: +!Beschreiben der Control-Register aller MMU's! + ldb rl5, @r9 !rl5=Fehlerpar. (Testdatenwert)! + soutb ALL_MMU + %0000, rl5 !Write Mode-Register! + soutb ALL_MMU + %0100, rl5 !Write Segment-Adress-Register (SAR)! + soutb ALL_MMU + %2000, rl5 !Write Descriptor-Selector-Counter- + Register (DSCR)! +!Ruecklesen der Control-Register der 1. MMU des Durchlaufes und Vergleich! + ld r10, r6 !Adresse der 1. MMU des Durchlaufes! + add r10, #%0000 !Read Mode-Register! + sinib @r9, @r10, r11 !Ruecklesen Mode-Register! + dec r9, #%01 + ldb rl4, @r9 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + ld r7, r6 !r7=Fehlerpar. (MMU CMD#) + rl7 - MMU-Adresse + rh7 - Kommando %00: R/W Mode-Register! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 83! + + ld r10, r6 + add r10, #%0100 !Read Segment-Adress-Register (SAR)! + sinib @r9, @r10, r11 !Ruecklesen SAR! + dec r9, #%01 + ldb rl4, @r9 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + andb rl5, #%3F !rl5=Fehlerpar. (Testdatenwert (Datenwert, der + rueckgelesen werden muesste))! + incb rh7, #%01 !r7=Fehlerpar. (MMU CMD#) + rl7 - MMU-Adresse + rh7 - Kommando %01: R/W SAR! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 83! + + ld r10, r6 + add r10, #%2000 !Read Descriptor-Selector-Counter-Register! + sinib @r9, @r10, r11 !Ruecklesen DSCR! + dec r9, #%01 + ldb rl4, @r9 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + andb rl5, #%03 !rl5=Fehlerpar. (Testdatenwert (Datenwert, der + rueckgelesen werden muesste))! + ldb rh7, #%20 !r7=Fehlerpar. (MMU CMD#) + rl7 - MMU-Adresse + rh7 - Kommando %20: R/W DSCR! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 83! + + ld @r9, #%5555 !Test mit Daten '55'! + dbjnz rl0, L15A4 + + incb rl2, #%02 + cpb rl2, #%06 + jp nz, L14E2 !r2=2 (2. Schleifendurchlauf)! + !bzw.! + !r2=4 (3. Schleifendurchlauf)! + + +!------------------------------------------- +Testschritt 84 (0304) +Test der Normal-Break-Register-Daten +-------------------------------------------! +! +--- Fehler 84, wenn Normal-Break-Register-Daten 'AA' oder '55' + fehlerhaft sind --- +! + + ld r8, #%84 !Fehler 84: System/Normal Break Register + 'As' Or '5s' Fault! + ld ERRPAR_ID, #%0085 !korrigiert (original %0094)! + !Fehlerparameter fuer Fehler 84: + r6, rl5, rl4 ! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0,#%0001 + ld REM_MMU1, r0 !Segmented Jumpers! + ld REM_MMU2, r0 !Systemmode (?)! + + ld r6, #NBREAK !Test Normal-Break-Register! +L1616: + ld r5, #%AAAA !rl5=Fehlerpar. (Testdatenwert)! + outb @r6, rl5 !Break-Reg. beschreiben! + inb rl4, @r6 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 84! + + ld r5, #%5555 !rl5=Fehlerpar. (Testdatenwert)! + outb @r6, rl5 !Break-Reg. beschreiben! + inb rl4, @r6 !rl4=Fehlerpar. (rueckgelesener Datenwert)! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 84! + + +!---------------------------------------------- +Testschritt 85 (0305 'I') +Test, ob STACK-MMU beim Limit-Test Trap erzeugt +----------------------------------------------! +! +--- Fehler 85, wenn STACK-MMU beim Limit-Test keinen Trap erzeugt --- +! + +LB_18A8: + ld r8, #%85 !Fehler 85: Stack MMU Did Not Trap On + Limit Test! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r2, #%9000 + outb NBREAK, rh2 !Normal-Break-Register mit %90 laden! + + ld r3, #MMU_LISTE4 !r3 - Zeiger auf SDR-Feld fuer CODE-MMU! + ld r4, r3 !r4 - Zeiger auf SDR-Feld fuer DATA-MMU! + ld r5, #MMU_LISTE5 !r5 - Zeiger auf SDR-Feld fuer STACK-MMU! +LB_18CE: + calr LD_3SDR !Alle 64 SDR der 3 MMU's programmieren! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + ldb rh0, #%04 !MMU_ID: Stack-MMU muss Trap ausloesen! + ldb rl4, #%D2 !Fuer Mode-Reg.: STACK-MMU! + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 0305! + +!------------------------- +Testschritt 86 (0305 'A') +Test auf unerwarteten Trap +-------------------------! +! +--- Fehler 86, wenn ein Trap ausgeloest wird --- +! + + ld r8, #%86 !Fehler 86: Unexpected Trap! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + xorb rh0, rh0 !kein Trap darf ausgeloest werden! + ldb rl4, #%D1 !Fuer Mode-Reg.: DATA-MMU! + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 86! + +!------------------------- +Testschritt 87 (0305 'G') +Test auf unerwarteten Trap +-------------------------! +! +--- Fehler 87, wenn ein Trap ausgeloest wird --- +! + + ld r3, #MMU_LISTE4 !r3 - Zeiger auf SDR-Feld fuer CODE-MMU! + ld r4, #MMU_LISTE6 !r4 - Zeiger auf SDR-Feld fuer DATA-MMU! + ld r5, r3 !r5 - Zeiger auf SDR-Feld fuer STACK-MMU! +LB_18FE: + calr LD_3SDR !SDR der 3 MMU's programmieren! + + xor r7, r7 + calr CLR_CTL_REG !SAR:=0, DSCR:=0! + ld r7, #DATA_MMU+%0B00 !Write SDR0 ! + ld r4, #MMU_LISTE4 + ld r2, #%0004 + sotirb @r7, @r4, r2 + +!Damit SDR 0 von DATA_MMU ohne Limitbegrenzung , sonst wird bei Testschritt 88 + schon durch Befehlslesen ueber SDR0 der DATA_MMU Trap ausgeloest. Test be- + ginnt erst bei SDR 2! + ld r8, #%87 !Fehler 87: Unexpected Trap! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + xorb rh0, rh0 !kein Trap darf ausgeloest werden! + ldb rl4, #%D2 !Fuer Mode-Reg.: STACK-MMU! + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 0305! + +!---------------------------------------------- +Testschritt 88 (0305 'N') +Test, ob DATA-MMU beim Limit-Test Trap erzeugt +----------------------------------------------! +! +--- Fehler 88, wenn DATA-MMU beim Limit-Test keinen Trap erzeugt --- +! + + ld r8, #%88 !Fehler 88: Data MMU Did Not Trap On + Limit Test! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + ldb rh0, #%02 !MMU_ID: DATA-MMU muss Trap ausloesen! + ldb rl4, #%D1 + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 88! + +!-------------------------------------------------- +Testschritt 89 (0305 'O') +Test, ob STACK-MMU beim Read-Only-Test Trap erzeugt +--------------------------------------------------! +! +--- Fehler 89, wenn STACK-MMU beim Read-Only-Test keinen Trap erzeugt --- +! + + ld r3, #MMU_LISTE4 !r3 - Zeiger auf SDR-Feld fuer CODE-MMU! + ld r4, #MMU_LISTE7 !r4 - Zeiger auf SDR-Feld fuer DATA-MMU! + ld r5, r4 !r5 - Zeiger auf SDR-Feld fuer STACK-MMU! + calr LD_3SDR !SDR der 3 MMU's programmieren! + + ld r8, #%89 !Fehler 89: Stack MMU Did Not Trap On + Read-Only Test! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + ldb rh0, #%04 !MMU_ID: STACK-MMU muss Trap ausloesen! + ldb rl4, #%D2 !Mode-Reg.: STACK-MMU! + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 89! + +!-------------------------------------------------- +Testschritt 90 (0305 'S') +Test, ob DATA-MMU beim Read-Only-Test Trap erzeugt +--------------------------------------------------! +! +--- Fehler 90, wenn DATA-MMU beim Read-Only-Test keinen Trap erzeugt --- +! + + ld r8, #%90 !Fehler 90: Data MMU Did Not Trap On + Read-Only Test! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r3, #SDRT0 !Offsetadresse fuer Trap-Test! + ldb rh0, #%02 !MMU_ID: DATA-MMU muss Trap ausloesen! + ldb rl4, #%D1 + calr SEGMENT_TRAP_TEST !Trap-Test; ggf. Fehler 90! + +!------------------------------------------------ +Testschritt 91/92 (0306/0307 'T') +Test, ob Uebersetzung der DATA-MMU fehlerfrei ist +------------------------------------------------! +! +--- Fehler 91, wenn Uebersetzung der DATA-MMU fehlerhaft ist --- +--- Fehler 92, wenn ein Trap ausgeloest wurde --- +! + + ld r8, #%91 !Fehler 91: Translation Fault On Data MMU! + + ld ERRPAR_ID, #%009A !Fehlerparameter fuer Fehler 91: + r6, rl7, r5, r4 ! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #%01 !WORD-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r2, #%FFFF + outb NBREAK, rl2 !Normal-Break-Register mit %FF laden! + + ld r3, #MMU_LISTE4 !r3 - Zeiger auf SDR-Feld fuer CODE-MMU! + ld r4, r3 !r4 - Zeiger auf SDR-Feld fuer DATA-MMU! + ld r5, r3 !r5 - Zeiger auf SDR-Feld fuer STACK-MMU! + calr LD_3SDR !SDR der 3 MMU's programmieren! + + xor r2, r2 !rh2=logische Segmentnummer (0-63)! + ld r3, #SDRT0 !Offsetadresse fuer Test! + ld r5, #%AAAA !r5=Fehlerpar. (Testdatenwert (auf Offset- + adresse r3 zu schreiben))! + ld r6, #DATA_MMU !r6=Fehlerpar. (MMU PORT#)! + +!Schleife fuer die Segmente 0-63 (r2)! +TST_DATA_MMU: + ld @r3, #%0000 !Speicheradresse SDRT0 loeschen! + ld REM_MMU_ID, #%0000 !Merker: MMU-ID loeschen - + wird bei Segment-Trap gesetzt! +LB_199E: + ld r0, #%00D1 + soutb DATA_MMU,rl0 !Mode-Register mit %D1 laden (ID=1), d.h. + DATA-MMU aktivieren! + ldb rl0, #%D0 + soutb CODE_MMU, rl0 !Mode-Reg.: MSEN,TRNS,MST,ID! + + ldb rl4, #%06 + outb S_BNK, rl4 !MMU-Treiber ein! + + ldctl r9, FCW + set r9, #%0F !Segmented Mode ein! + test REM_MMU2 !Normal-Mode eingestellt?! + jr z, LB_19B2 !ja! + res r9, #%0E !Normal-Mode einstellen! +LB_19B2: + ldctl FCW, r9 + ld @r2, r5 !Speicheradresse rr2 (Segment rh2/Offset SDRT0) + mit Datenwert %AAAA beschreiben! + + mbit +!Privilegierter Befehl im Normal-Mode, fuehrt zu Priv. Instr. Trap. + In der Service-Routine wird in System-Mode umgeschaltet.! + + outb S_BNK, rh0 !MMU-Treiber aus! + soutb ALL_MMU, rh0 !MMUs ausschalten! + + sc #SC_NSEGV + + ldb rl7, rh2 !rl7=Fehlerpar. (SDR#) =log. Segmentnummer! + test REM_MMU_ID !Segment-Trap (Routine SEGMENT_TRAP) + aufgetreten?! + jr nz, L1738 !ja, d.h. Fehler 92! + + ld r4, @r3 !r4=Fehlerpar. (rueckgelesener Datenwert! + calr BY_WO_CMP !Vergleich r5/r4; ggf. Fehler 91! + + bitb rh1, #%07 !Fehler aufgetreten?! + jr nz, L1748 !ja, d.h. naechster Testschritt! + + incb rh2, #%01 + cpb rh2, #%40 + jr nz, TST_DATA_MMU !naechste logische Segmentnummer! + jr L1748 !alle Segmentnummern abgearbeitet, d.h. + naechster Testschritt! + +!Fehler 92! +L1738: + ld r8, #%92 !Fehler 92: Unexpected Trap! + ld ERRPAR_ID, #%0098 !Fehlerparameter fuer Fehler 92: + r6, rl7, r5 ! + + ld r5, REM_MMU_BCSR !r5=Fehlerpar. (VDAT) - Werte der Status- + Register BCSR und VTR nach Segment-Trap: + rh5= Bus Cycle Status Register (BCSR) / + rl5= Violation Type Register (VTR) ! + calr MSG_ERROR !Fehlerausgabe! + +!------------------------------------------------- +Testschritt 93/94 (0308/0309 'I') +Test, ob Uebersetzung der STACK-MMU fehlerfrei ist +-------------------------------------------------! +! +--- Fehler 93, wenn Uebersetzung der STACK-MMU fehlerhaft ist --- +--- Fehler 94, wenn ein Trap ausgeloest wurde --- +! + +L1748: + ld r8, #%93 !Fehler 93: Translation Fault On Stack MMU! + ld ERRPAR_ID, #%009A !Fehlerparameter fuer Fehler 93: + r6, rl7, r5, r4! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #%01 !WORD-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r0, #%00D2 + outb NBREAK, rh0 !Normal-Break-Register mit %00 laden! + + ld r2, #%4000 !Zugriff auf STACK_MMU im seg. Normalmode! +LB_1A16: + ld r6, #STACK_MMU !r6=Fehlerpar. (MMU PORT#)! + +!Schleife fuer die Segmente 64-127 (r2)! +TST_STACK_MMU: + ld @r3, #%0000 !Speicheradresse SDRT0 loeschen! + ld REM_MMU_ID, #%0000 !Merker: MMU-ID loeschen - + wird bei Segment-Trap gesetzt! + + ldb rl0, #%D2 + soutb STACK_MMU, rl0 !Mode-Reg.:MSEN,TRNS,MST,ID! + ldb rl0, #%D0 + soutb CODE_MMU, rl0 !Mode-Reg.:MSEN,TRNS,MST,ID! + ldb rl0, #%D1 + soutb DATA_MMU, rl0 !Mode-Reg.:MMSEN,TRNS,MST,ID! + + ldb rl4, #%06 + outb S_BNK, rl4 !MMU-Treiber ein! + + ldctl r9, FCW + set r9, #%0F !Segmented Mode ein! + test REM_MMU2 !Normalmode eingestellt?! + jr z, LB_1A42 !Ja! + res r9, #%0E !Normalmode einstellen! +LB_1A42: + ldctl FCW, r9 + ld @r2, r5 !Speicheradresse rr2 (Segment rh2/Offset SDRT0) + mit Datenwert %AAAA beschreiben! + mbit +!Privilegierter Befehl im Normal-Mode, fuehrt zu Priv. Instr.Trap. +In der Service-Routine wird in System-Mode umgeschaltet.! + + outb S_BNK, rh0 !MMU-Treiber aus! + soutb ALL_MMU, rh0 !MMUs ausschalten! + sc #SC_NSEGV + + ldb rl7, rh2 !rl7=Fehlerpar. (SDR#) =log. Segmentnummer! + test REM_MMU_ID !Segment-Trap (Routine SEGMENT_TRAP) + aufgetreten?! + jr nz, L17AA !ja, d.h. Fehler 94! + + ld r4, @r3 !r4=Fehlerpar. (rueckgelesener Datenwert! + calr BY_WO_CMP !Vergleich r5/r4; ggf. Fehler 93! + + bitb rh1, #%07 !Fehler aufgetreten?! + jr nz, L17BA !ja, d.h. naechster Testschritt! + + incb rh2, #%01 + test REM_MMU1 + jr z, LB_1A72 + cpb rh2, #%80 + jr nz, TST_STACK_MMU + jr L17BA +LB_1A72: + cpb rh2, #%40 + jr nz, TST_STACK_MMU !naechste logische Segmentnummer! + jr L17BA !alle Segmentnummern abgearbeitet, d.h. + naechster Testschritt! + +!Fehler 94! +L17AA: + ld r8, #%94 !Fehler 0309: Unexpected Trap! + ld ERRPAR_ID, #%0098 !Fehlerparameter fuer Fehler 94: + r6, rl7, r5 ! + + ld r5, REM_MMU_BCSR !r5=Fehlerpar. (VDAT) - Werte der Status- + Register BCSR und VTR nach Segment-Trap: + rh5= Bus Cycle Status Register (BCSR) / + rl5= Violation Type Register (VTR) ! + calr MSG_ERROR !Fehlerausgabe! + +!------------------------------------------------ +Testschritt 95/96 (0310/0311 'C') +Test, ob Uebersetzung der CODE-MMU fehlerfrei ist +------------------------------------------------! +! +--- Fehler 95, wenn Uebersetzung der CODE-MMU fehlerhaft ist --- +--- Fehler 96, wenn ein Trap ausgeloest wurde --- +! + +L17BA: + + ld r8, #%95 !Fehler 95: Translation Fault On Code MMU! + ld ERRPAR_ID, #%009A !Fehlerparameter fuer Fehler 95: + r6, rl7, r5, r4 ! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + setb rh1, #%01 !WORD-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + clr REM_MMU2 + + ldctl r9, PSAP + ld %26(r9), #CODE_TRAP !neue Trap-Routine fuer Segment-Trap + in PSAREA eintragen! + ld r4, #CODE_FELD + ld r5, #SDRT0 + ld r3, #%0004 + ldirb @r5, @r4, r3 !CODE_FELD NACH SDRT0 MOVEN! + + ld r0, #%00D0 + ld r6, #CODE_MMU !r6=Fehlerpar. (MMU PORT#)! + + ldb rl3, #%02 !Kennzeichnung Testschritt 95 (rl3=2)! + ldb rh3, #%06 !Fuer S_BNK! +LB_1ACC: + xor r2, r2 !rh2=logische Segmentnummer (0-63)! + ld r5, r2 !r5=Fehlerpar. (Testdatenwert) = %0000 + (r4 soll durch Abarbeitung von CODE_FELD + auf diesen Wert gesetzt werden)! + + ld r10, r2 !r10/r11 - Ansprungadresse Marke FKT_TST! + ld r11, #FKT_TST !(Segment 0, Offset #FKT_TST)! + + ld r13, #SDRT0 !Ansprungadresse (Offset) fuer CODE_FELD! + +!fuer Testschritt 95 und 97! +!Schleife fuer die Segmente 0(1)-63 (r2)! +TST_CODE_MMU: + ld r12, r2 !Ansprungadresse (Segment) fuer CODE_FELD + (Segment 0(1)-63)! + ld REM_MMU_ID, #%0000 !Merker: MMU-ID loeschen - + wird bei Segment-Trap gesetzt! + ld r4, #%AAAA !r4=Fehlerpar. (zurueckgegebener Datenwert) + setzen (wird bei Abarbeitung von + CODE_FELD auf %0000 gesetzt)! + + ldb rl0, #%92 + soutb STACK_MMU, rl0 !Mode-Reg.:MSEN,ID! + ldb rl0, #%91 + soutb DATA_MMU, rl0 !Mode-Reg.:MSEN,ID! + ldb rl0, #%D0 + soutb CODE_MMU, rl0 !Mode-Reg.:MSEN,TRNS,ID! + + outb S_BNK, rh3 !MMU-Treiber ein! + + sc #SC_SEGV + jp @r12 !Sprung zu CODE_FELD auf Offsetadresse SDRT0 + im aktuellen Segment (r2) - r4 wird in + CODE_FELD auf den Wert %0000 gesetzt; + dann Fortsetzung bei FKT_TST! + !oder! + !Segment-Trap (Routine CODE_TRAP) - + r4 wird nicht veraendert; + dann Fortsetzung bei FKT_TST! +FKT_TST: + sc #SC_NSEGV + outb S_BNK, rh0 !MMU-Treiber aus! + ldb rh0, #%80 + soutb CODE_MMU, rh0 !Mode-Register mit %00 laden, d.h. + CODE-MMU deaktivieren! + xorb rh0, rh0 + + ldb rl7, rh2 !rl7=Fehlerpar. (SDR#) =log. Segmentnummer! + + bitb rl3, #%00 !rl3=2 bei Testschritt 95; + rl3=1 bei Testschritt 97! + jr nz, L1866 !Programmfortsetzung fuer Testschritt 97! + +!fuer Testschritt 95! + test REM_MMU_ID !Segment-Trap (Routine CODE_TRAP) aufgetreten?! + jr nz, L1874 !ja, d.h. Fehler 96! + + calr BY_WO_CMP !Vergleich r5/r4, d.h. ob CODE_FELD abge- + arbeitet wurde und dabei r4 auf 0 gesetzt + wurde; ggf. Fehler 95! + + bitb rh1, #%07 !Fehler aufgetreten?! + jr nz, L183C !ja, d.h. naechster Testschritt! + !(korrigiert: im Original L1842)! + +!fuer Testschritt 95 und 97! +L1834: + incb rh2, #%01 + cpb rh2, #%40 + jr nz, TST_CODE_MMU !naechste logische Segmentnummer! + + !alle Segmentnummern abgearbeitet, d.h. + naechster Testschritt! + +!--------------------------------------------- +Testschritt 97 (0312 'S') +Test, ob CODE-MMU beim Limit-Test Trap erzeugt +---------------------------------------------! +! +--- Fehler 97, wenn CODE-MMU beim Limit-Test keinen Trap erzeugt --- +! + +L183C: + decb rl3, #%01 !rl3=1, d.h. Kennzeichnung Testschritt 97; + rl3=0, d.h. Testschritt 97 beendet! + testb rl3 + jr z, MMU_TEST_END !Ende des Testes! + +L1842: + ld r8, #%97 !Fehler 97: No Trap On Code MMU Limit Test! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + push @r15, r3 !r3 retten! + ld r3, #MMU_LISTE5 !r3 - Zeiger auf SDR-Feld fuer CODE-MMU! + ld r4, #MMU_LISTE4 !r4 - Zeiger auf SDR-Feld fuer DATA-MMU! + ld r5, r4 !r5 - Zeiger auf SDR-Feld fuer STACK-MMU! + calr LD_3SDR !SDR der 3 MMU's programmieren! + + xor r7, r7 + calr CLR_CTL_REG !SAR:=0, DSCR:=0! + ld r5, #CODE_MMU+%0B00 !Write SDR0! + ld r4, #MMU_LISTE4 + ld r2, #%0004 + sotirb @r5, @r4, r2 + +!Da auch die Programmabarbeitung ueber die CODE_MMU (SDR 0) erfolgt, + darf dort keine Limitbegrenzung vorliegen. Test beginnt bei SDR 1! + + pop r3, @r15 !r3 rueckretten! + + ld r2, #%0100 !rh2=logische Segmentnummer (1-63)! + ld r5, #%AAAA !ueberfluessig ???! + jr TST_CODE_MMU + +L1866: + test REM_MMU_ID !Segment-Trap (Routine CODE_TRAP) aufgetreten?! + jr nz, L1834 !ja, d.h. kein Fehler; + naechste Segmentnummer! + + ld ERRPAR_ID, #%0090 !Fehlerparameter fuer Fehler 97: r6, rl7 ! + + jr L1880 !Fehlerausgabe! + +!Fehler 96! +L1874: + ld r8, #%96 !Fehler 96: Unexpected Trap! + ld ERRPAR_ID, #%0098 !Fehlerparameter fuer Fehler 96: + r6, rl7, r5 ! + ld r5, REM_MMU_BCSR !r5=Fehlerpar. (VDAT) - Werte der Status- + Register BCSR und VTR nach Segment-Trap: + rh5= Bus Cycle Status Register (BCSR) / + rl5= Violation Type Register (VTR) ! + +L1880: + calr MSG_ERROR !Fehlerausgabe! + +MMU_TEST_END: + ldctl r9, PSAP + ld r4, REM_SEGMENT_TRAP + ld %26(r9), r4 !Adresse der urspruenglichen Segment-Trap- + Routine wieder in PSAREA abspeichern! + ld r4, REM_PRIVINSTR_TRAP + ld %16(r9), r4 !Adresse der urspruenglichen Priv.-Instr.-Trap- + Routine wieder in PSAREA abspeichern! + xorb rl0, rl0 + outb S_BNK, rl0 !MMU-Treiber aus! + soutb ALL_MMU, rl0 !Alle MMUs aus! + + calr WR_2BS ! 2x Backspace, um letzte Testschritt- + nummer zu ueberschreiben! + calr WR_2SP !2x Space ausgeben! + calr WR_2BS !Zurueck zum Zeilenanfang! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + +CODE_FELD: + xor r4,r4 !r4=Fehlerpar. (zurueckgegebener Datenwert)= + %0000 (Kennzeichnung, dass CODE_FELD + abgearbeitet wurde)! + jp @r10 !Segment. Sprung zu FKT_TST! + + end _MMU_ + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE RAM_TEST_SEG +RAM-Test eines Segmentes +Input: r6 - Segmentnummer des zu testenden Segments + rh1 Bit0=0 - Test nicht in Segment 0 + =1 - Test in Segment 0 + r9 - Stand FCW +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + RAM_TEST_SEG procedure + entry + +!----------------------------------- +Testschritt 72 (0100) +Test auf fehlerhafte Speicheradresse +-----------------------------------! + +!Die 15 Adressen (0003,0006,000C,0018,0030,0060,00C0,0180,0300,0600,0C00,1800, +3000,6000,C000) des betrachteten Segments werden beschrieben und wieder +rueckgelesen. +--- Fehler 72, wenn eine Speicherzelle fehlerhaft rueckgelesen wurde ---! + + ld r8, #%72 !Fehler 72: MEM. ADDR. FAULT! + + ld ERRPAR_ID, #%00E5 !Fehlerparameter fuer Fehler 72: + , r7, rl5, rl4 ! + andb rh1, #%01 !Loeschen Bit1-7(rh1); + Bit1(rh1):=0, d.h. Bytevergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + +!15 Adresse des Segments beschreiben! + + ld r7, #%0003 !Anfangs-Offset-Adresse! + ldb rl5, #%0F !Adressenzaehler: 15 Adresse testen! +RATE1: + set r9, #%0F + ldctl FCW, r9 !segmentierten Mode einstellen! + ldb @r6, rl5 !Speicherzelle beschreiben + (mit akt. Stand des Adressenzaehlers rl5)! + res r9, #%0F + ldctl FCW, r9 !nichtsegmentierten Mode einstellen! + rl r7, #%01 !Offsetadresse um 1 Bit nach links verschieben! + dbjnz rl5, RATE1 !naechste Adresse! + +!Ruecklesen der beschriebenen Adressen! + + rl r7, #%01 !Anfangs-Offset-Adressse := %0003! + ldb rl5, #%0F !Adressenzaehler! +RATE2: + set r9, #%0F + ldctl FCW, r9 !segmentierten Mode einstellen! + ldb rl4, @r6 !Speicherzelle ruecklesen! + res r9, #%0F + ldctl FCW, r9 !nichtsegmentierten Mode einstellen! + calr BY_WO_CMP !Vergleich eingetragener Wert (rl5) mit + rueckgelesenen Wert (rl4); + ggf. Fehler 72: Mem Addr Fault! + bitb rh1, #%07 !Fehler aufgetreten?! + jr nz, RATE3 !ja --> naechster Testschritt! + + rl r7, #%01 !Offsetadresse um 1 Bit nach links verschieben! + dbjnz rl5, RATE2 !naechste Adresse testen! + +!-------------------------------- +Testschritt 73 (0101) +Test auf fehlerhafte Datenleitung +--------------------------------! + +!Die Adresse %8000 des betrachteten Segments wird nacheinander mit den Werten +0001,0002,0004,0008,0010,0020,0040,0080,0100,0200,0400,0800,1000,2000,4000, +8000,0001 (jeweils ein Bit gesetzt) beschrieben und wieder rueckgelesen. +--- Fehler 73, wenn ein Wert fehlerhaft rueckgelesen wurde ---! + +RATE3: + ld r8, #%73 !Fehler 73: Data Line Fault! + ld ERRPAR_ID, #%00EA !Fehlerparameter fuer Fehler 73, 74, 75: + , r7, r5, r4 ! + andb rh1, #%01 !Loeschen Bit1-7(rh1)! + setb rh1, #%01 !Bit1(rh1):=1,d.h. WORD-Vergleich in BY_WO_CMP! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r7, #%8000 !r7:=Offsetadresse! + ld r5, #1 !r5:=in RAM einzutragender Datenwert + (Anfangswert - Bit0 gesetzt)! + ldb rl0, #%11 !rl0:=Anzahl der Schritte! +RATE4: + set r9, #%0F + ldctl FCW, r9 !segmentierten Mode einstellen! + ld @r6, r5 !r5 in RAM eintragen! + ld r4, @r6 !r4:=rueckgelesenen Wert! + res r9, #%0F + ldctl FCW, r9 !nichtsegmentierten Mode einstellen! + + calr BY_WO_CMP !Vergleich r4/r5; ggf. Fehler 73! + bitb rh1, #%07 !Fehler aufgetreten?! + jr nz, RATE5 !ja! + + rl r5, #%01 !nein --> naechstes Bit testen! + dbjnz rl0, RATE4 + +!----------------------------------------------- +Testschritt 74, 75 (0102, 0103) +Test auf fehlerhafte '%AAAA'- bzw. '%5555'-Daten +-----------------------------------------------! + +!Das ganze betrachtete Segment wird mit dem Datenwert %AAAA bzw. %5555 +beschrieben und wieder rueckgelesen. +--- Fehler 74, wenn ein %AAAA-Wert fehlerhaft rueckgelesen wurde --- +--- Fehler 75, wenn ein %5555-Wert fehlerhaft rueckgelesen wurde ---! + +RATE5: + ld r8, #%74 !Fehler 74: 'A' Data Fault! + ld r5, #%AAAA !zuerst %AAAA in RAM eintragen! +RATE6: + andb rh1, #%03 !Loeschen Bit2-7(rh1)! + calr WR_TESTNR !Ausgabe der Testschrittnummer! + + ld r12, r6 !r12=Segnr. Zieladresse:=Segnr. Quelladresse! + ld r13, #%0002 !r13=Offset Zieladresse:= %0002! + xor r7, r7 !r7=Offset Quelladresse:= %0000! + ld r0, #%7FFF !r0=WORD-Anzahl fuer ldir! + set r9, #%0F + ldctl FCW, r9 !segmentierten Mode einstellen! + ld @r6, r5 + ldir @r12, @r6, r0 !ganzes Segment mit r5 beschreiben! + + xor r7, r7 !r7=Anfangs-Offset-Adresse fuer Vergleich:=%0! + ld r0, #%8000 !r0=Anzahl der Worte fuer Vergleich! + cpir r5, @r6, r0, nz !Test ab Adr. 0 (max. bis Segmentende), bis + zu einer Stelle, wo r5 nicht im RAM steht! + dec r7, #%02 !r7 zeigt auf fehlerhafte RAM-Adresse! + ld r4, @r6 !fehlerhafte Adresse nochmal lesen! + res r9, #%0F + ldctl FCW, r9 !nichtsegmentierten Mode einstellen! + calr BY_WO_CMP !Vergleich r4/r5; ggf. Fehler 74 bzw. 75! + cpb rl5, #%55 + ret z + ld r8, #%75 !Fehler 75: '5' Data Fault! + ld r5, #%5555 !Test mit Datenwort %5555! + jr RATE6 + end RAM_TEST_SEG + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PRIVINSTR_TRAP +Trap-Routine bei Priv.-Instr.-Trap +Umschaltung auf Systemmode +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PRIVINSTR_TRAP procedure + entry + set %02(r15), #%0E + sc #SC_SEGV + iret + end PRIVINSTR_TRAP + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SEGMENT_TRAP +Trap-Routine bei Segment-Trap +Output: REM_MMU_BCSR - Inhalt Bus-Cycle-Status-Register (BCSR) der MMU bzw. + 0 bei Fehler + REM_MMU_VTR - Inhalt Violation-Type-Register (VTR) der MMU bzw. + 0 bei Fehler + REM_MMU_ID - MMU_ID (1:CODE-MMU; 2:DATA-MMU; 3:STACK-MMU) bzw. + High-Teil=%FF bei Fehler +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SEGMENT_TRAP procedure + entry + pushl @r15, rr2 + ld r2, 4(r15) + exb rl2, rh2 + and r2, #%0007 !rl2=MMU_ID! + + cpb rl2, #%01 + jr z, TRAP_CODE !Trap durch CODE-MMU ausgeloest! + cpb rl2, #%02 + jr z, TRAP_DATA !Trap durch DATA-MMU ausgeloest! + cpb rl2, #%04 + jr z, TRAP_STACK !Trap durch STACK-MMU ausgeloest! +!Fehler: falscher MMU_ID! + ldb rh2, #%FF !High-Teil von REM_MMU_ID auf %FF setzen! + xor r3, r3 !REM_MMU_BCSR/REM_MMU_VTR auf %00 setzen! + jr TRAP_OUT + +TRAP_CODE: + sinb rl3, CODE_MMU + %0200 !Read VTR! + sinb rh3, CODE_MMU + %0500 !Read BCSR! + jr TRAP_OUT + +TRAP_DATA: + sinb rl3, DATA_MMU + %0200 !Read VTR! + sinb rh3, DATA_MMU + %0500 !Read BCSR! + jr TRAP_OUT + +TRAP_STACK: + sinb rl3, STACK_MMU + %0200 !Read VTR! + sinb rh3, STACK_MMU + %0500 !Read BCSR! + +TRAP_OUT: + ld REM_MMU_ID, r2 !Trap-Werte abspeichern! + ld REM_MMU_BCSR, r3 + + soutb ALL_MMU + %1100, rl2 !Reset VTR! + + popl rr2, @r15 + ldctl r9, FCW + set r9, #%0F !Segment-Bit im FCW setzen! + ldctl FCW, r9 + iret + end SEGMENT_TRAP + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CODE_TRAP +Trap-Routine fuer Segment-Trap fuer Test der CODE-MMU +Input: rh0 - %00 + r11 - Ruecksprungadresse (FKT_TST) +Output: REM_MMU_BCSR - Inhalt Bus-Cycle-Status-Register (BCSR) der CODE-MMU + REM_MMU_VTR - Inhalt Violation-Type-Register (VTR) der CODE-MMU + REM_MMU_ID - %FFFF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CODE_TRAP procedure + entry + outb S_BNK, rh0 !MMU's ausschalten! + soutb CODE_MMU, rh0 !Mode-Register der CODE-MMU mit %00 laden + (CODE-MMU deaktivieren)! + add r15, #%0008 !(im Original %0009)! + push @r15, r2 + + sinb rl2, CODE_MMU + %0200 !Read VTR! + sinb rh2, CODE_MMU + %0500 !Read BSCR! + ld REM_MMU_BCSR, r2 + ld REM_MMU_ID, #%FFFF + soutb CODE_MMU + %1100, rl2 !Reset VTR! + + ld r2, #%5000 + ldctl FCW, r2 !FCW setzen (nonseg./Systemmode/VI=EI/NVI=DI)! + pop r2, @r15 + jp @r11 !Sprung zu FKT_TST! + end CODE_TRAP + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CLR_CTL_REG +Beschreiben der 2 Control-Register SAR (Segment-Adress-Register) und +DSCR (Descriptor-Selector-Counter-Register) +Input: rl7 - Wert fuer SAR + rh7 - Wert fuer DSCR +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CLR_CTL_REG procedure + entry + soutb ALL_MMU + %0100, rl7 !Write SAR! + soutb ALL_MMU + %2000, rh7 !Write DSCR! + ret + end CLR_CTL_REG + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE LD_SDR +Fuellen der 64 SDR einer MMU +Input: r6 - MMU-Adresse + r11 - Zeiger auf Anfang des Speicherbereiches (%100 Byte lang) mit + dessen Inhalt die 64 SDR gefuellt werden sollen + (64 SDR * 4 Byte je SDR = %100 Byte) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + LD_SDR procedure + entry + ldm RG_FELD, r0, #%0F + xor r7, r7 + calr CLR_CTL_REG !Loeschen der Control-Register SAR und DSCR! + + add r6, #%0F00 !Write Descriptor and increment SAR! + ld r0, #%0100 + sotirb @r6, @r11, r0 !alle 64 SDR (zu je 4 Byte) laden! + + xor r7, r7 + calr CLR_CTL_REG !Loeschen der Control-Register SAR und DSCR! + ldm r0, RG_FELD, #%0F + ret + end LD_SDR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE RD_SDR +Ruecklesen der 64 SDR einer MMU und Vergleich mit urspruenglich geladener SDR +ggf. Fehler 80 bzw. 82 +Input: r6 - MMU-Adresse + r11 - Zeiger auf Anfang des Speicherbereiches, mit dessen Inhalt die + 64 SDR gefuellt wurden +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + RD_SDR procedure + entry + pushl @r15, rr2 + push @r15, r11 + ld ERRPAR_ID, #%0095 !Fehlerparameter fuer Fehler 80,81,82: + r6, rl7, rl5, rl4! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + + add r6, #%0F00 !Read Descriptor and increment SAR! + ld r10, #SDRT4 !Anfangsadresse Puffer fuer rueckgelesene SDR! + ld r0, #%0100 + sinirb @r10, @r6, r0 !64 SDR der MMU zuruecklesen! + + ld r10, #SDRT4 + ld r0, #%0100 + cpsirb @r11, @r10, r0, nz !Vergleich! + !Befehl cpsirb wird beendet, bei Ungleich- + heit von @r11/@10 bzw. wenn Bytezahl r0 + abgearbeitet ist! + dec r10, #%01 + dec r11, #%01 + ldb rl4, @r10 !rl4=Fehlerpar. (zurueckgelesener Datenwert)! + ldb rl5, @r11 !rl5=Fehlerpar. (Testdatenwert)! + sub r10, #SDRT4 + ld r7, r10 !rl7=Fehlerpar. (SDR FELD#)! + sub r6, #%0F00 !r6=Fehlerpar. (MMU PORT#)! + calr BY_WO_CMP !Vergleich rl5/rl4; ggf. Fehler 80 bzw. 82! + pop r11, @r15 + popl rr2, @r15 + ret + end RD_SDR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE LD_3SDR +Fuellen der 64 SDR (zu je 4 Byte) der CODE-, DATA- und STACK-MMU +Input: r3 - Zeiger auf Anfangsadresse des Speicherbereiches (4 Byte), mit + dessen Inhalt die 64 SDR der CODE-MMU gefuellt werden sollen + r4 - Zeiger auf Anfangsadresse des Speicherbereiches (4 Byte), mit + dessen Inhalt die 64 SDR der DATA-MMU gefuellt werden sollen + r5 - Zeiger auf Anfangsadresse des Speicherbereiches (4 Byte), mit + dessen Inhalt die 64 SDR der STACK-MMU gefuellt werden sollen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + LD_3SDR procedure + entry + ldm RG_FELD, r0, #%0F + xor r7, r7 + calr CLR_CTL_REG !Loeschen der Control-Register SAR und DSCR! + + ldb rl0, #%40 !Anzahl der SDR (64)! + ld r9, #CODE_MMU + %0F00 !Write Descriptor and increment SAR! + ld r10, #DATA_MMU + %0F00 !Write Descriptor and increment SAR! + ld r11, #STACK_MMU + %0F00 !Write Descriptor and increment SAR! +LD_3LOOP: + ld r2, #4 !Descriptorlaenge (4 Byte je SDR)! + sotirb @r9, @r3, r2 !SDR CODE_MMU programmieren! + dec r3, #%04 !Zeiger auf Anfangsadr. zurueckstellen! + + ld r2, #4 !Descriptorlaenge (4 Byte je SDR)! + sotirb @r10, @r4, r2 !SDR DATA_MMU programmieren! + dec r4, #%04 !Zeiger auf Anfangsadr. zurueckstellen! + + ld r2, #4 !Descriptorlaenge (4 Byte je SDR)! + sotirb @r11, @r5, r2 !SDR STACK_MMU programmieren! + dec r5, #%04 !Zeiger auf Anfangsadr. zurueckstellen! + dbjnz rl0, LD_3LOOP !naechstes SDR! + + calr CLR_CTL_REG !Loeschen der Control-Register SAR und DSCR! + ldm r0, RG_FELD, #%0F + ret + end LD_3SDR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SEGMENT_TRAP_TEST +Test, ob beim Beschreiben der Offsetadresse (r3) in jedem Segment ein Trap +ausgeloest wird +Input: r3 - Offsetadresse fuer Trap-Test (Adresse, die in jedem Segment + beschrieben werden soll) + rh0 - MMU_ID fuer MMU, die Trap ausloesen muss (2:DATA-MMU;4:STACK-MMU) + bzw. rh0=0, wenn kein Segment-Trap erwartet wird + rl4 - ??? +Fehler 85, wenn +- Segment-Trap nicht von der erwarteten MMU ausgeloest wurde (bei rh0=2,4) +- Segment-Trap ausgeloest wurde, obwohl nicht erwartet (bei rh0=0) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SEGMENT_TRAP_TEST procedure + entry + pushl @r15, rr2 !r2, r3 retten! + push @r15, r9 !r9 retten! + xorb rh1, rh1 !Flagbyte rh1 loeschen! + xor r2, r2 !rh2=logische Segmentnummer (0-63)! + ldb rh2, #%02 + bitb rl4, #%01 !ID=2? (STACK-MMU)! + jr z, L1ABE !nein! + ldb rh2, #%42 +L1ABE: + ld ERRPAR_ID, #%0050 !Fehlerparameter fuer Fehler 85: rl6, rl7! + ld REM_MMU_ID, #%0000 !Merker: MMU-ID loeschen - + wird bei Segment-Trap gesetzt! + xorb rh4, rh4 + bitb rl4, #%01 !ID=2? (STACK-MMU)! + jr z, LB_24D0 !nein! + soutb STACK_MMU, rl4 !Mode-Reg.: MSEN,TRNS,MST,ID! + ldb rh4, #%80 + soutb CODE_MMU, rh4 !Mode-Reg.: MSEN,ID! + ldb rh4, #%81 + soutb DATA_MMU, rh4 !Mode-Reg.: MSEN,ID! + jr LB_250E +LB_24D0: + bitb rl4, #%00 !ID=1 ? (DATA-MMU)! + jr z, LB_24E6 !nein! + soutb DATA_MMU, rl4 !Mode-Reg.: MSEN,TRNS,MST,ID! + ldb rh4, #%80 + soutb CODE_MMU, rh4 !Mode-Reg.: MSEN,ID! + ldb rh4, #%82 + soutb STACK_MMU, rh4 !Mode-Reg.: MSEN, ID! + jr LB_250E +LB_24E6: !CODE-MMU! + soutb CODE_MMU, rl4 !Mode-Reg.: MSEN,TRNS,MST,ID! + ldb rh4, #%81 + soutb DATA_MMU, rh4 !Mode-Reg.: MSEN,ID! + ldb rh4, #%82 + soutb STACK_MMU, rh4 !Mode-Reg.: MSEN,ID! + +LB_250E: + ldb rl0, #%06 + outb S_BNK, rl0 !MMU-Treiber ein; Segmentierter User! + + ldctl r9, FCW + set r9, #%0F !Segmented Mode ein! + test REM_MMU2 !Normal-Mode eingstellt?! + jr z, LB_251A !ja! + res r9, #%0E !Normal-Mode ein, um Zugriff auf STACK-MMU zu + ermoeglichen! +LB_251A: + ldctl FCW, r9 + + ld @r2, r5 !Speicherzelle (Segment r2 / Offset r3) + beschreiben! + +!Segmentverletzung soll erfolgen und zu Segment-Trap fuehren ! + + mbit + +!Priviligierter Befehl im Normal-Mode, fuehrt zu Priv. Instr. Trap. In der +Service-Routine wird in System-Mode umgeschaltet.! + + xorb rl0, rl0 + outb S_BNK, rl0 !MMU-Treiber aus! + soutb ALL_MMU, rl0 !MMUs ausschalten! + + sc #SC_NSEGV !Nonsegment. Mode ein! + + ld r6, REM_MMU_ID !rl6=Fehlerpar. (MMU ID#)! + testb rh6 + jr nz, L1B12 !Fehler 85 mit Fehlerpar. rl6, rl7: + Segment-Trap mit falschem MMU_ID aufgetreten + (nicht 1,2,4 - siehe SEGMENT_TRAP)! + cpb rh0, rl6 !Vergleich MMU_ID des Segment-Traps mit dem + erwarteten MMU_ID! + jr nz, L1B08 !Fehler 85 mit Fehlerpar. rl6, rl7, r5: + Segment-Trap erfolgte nicht mit erwarteten + MMU_ID (bei rh0=2,4) + bzw. + Segment-Trap aufgetreten, obwohl keiner + auftreten durfte (bei rh0=0)! +L1AFE: + incb rh2, #%01 !Naechstes SDR! + bitb rl4, #%01 !STACK-MMU ?! + jr z, LB_254C !nein! + cpb rh2, #%80 !Alle SDR (66-128) behandelt ?! + jr nz, L1ABE !nein! + jr L1B1C !ja! +LB_254C: + cpb rh2, #%40 !Alle SDR (2-63) behandelt ?! + jr nz, L1ABE !naechste logische Segmentnummer! + jr L1B1C !alle Segmentnummern abgearbeitet,d.h. Ende! + +!Fehlereinsprung! +L1B08: + ld ERRPAR_ID, #%0058 !Fehlerparameter fuer Fehler 85: + rl6, rl7, r5 ! + ld r5, REM_MMU_BCSR !r5=Fehlerpar. (VDAT) - Werte der Status- + Register BCSR und VTR nach Segment-Trap: + rh5= Bus Cycle Status Register (BCSR) / + rl5= Violation Type Register (VTR) ! +!Fehlereinsprung! +L1B12: + ldb rl7, rh2 !rl7=Fehlerpar. (SDR#)! + calr MSG_ERROR !Fehlerausgabe! + bitb rh1, #%07 !MSG_ERROR seit dem letzen Loeschen von rh1 + (am Anfang dieser Prozedur) bereits zweimal + durchlaufen? ! + jr z, L1AFE !nein, d.h. naechste logische Segmentnummer! + +L1B1C: + pop r9, @r15 + popl rr2, @r15 + ret + end SEGMENT_TRAP_TEST + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE BY_WO_CMP +Vergleich zweier Byte-Register (rl4, rl5) bzw. zweier Word-Register (r4, r5); +bei Ungleichheit Fehlermeldung (MSG_ERROR) +Input: rl4/rl5 bzw. r4/r5 - zu vergleichende Register + rh1 Bit0=0 - Test nicht in Segment 0 + =1 - Test in Segment 0 + Bit1=0 - Byte-Vergleich (rl4,rl5) + =1 - Word-Vergleich (r4,r5) + r8,r7,r6,ERRPAR_ID - siehe Prozedur MSG_ERROR +OUTPUT: siehe Prozedur MSG_ERROR (nur bei Abarbeitung von MSG_ERROR) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + BY_WO_CMP procedure + entry + bitb rh1, #%01 + jr z, BYWO_BY !Byte-Vergleich! + cp r5, r4 !Word-Vergleich! + ret z !kein Fehler! + jr BYWO_ERR !Fehler! +BYWO_BY: + cpb rl5, rl4 !Byte-Vergleich! + ret z !kein Fehler! + +BYWO_ERR: + bitb rh1, #%00 !Test in Segment 0?! + jr z, MSG_ERROR !nein! + + inb rh2, S_BNK !ja! + resb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM einschalten! + calr MSG_ERROR !Fehlerausgabe! + inb rh2, S_BNK + setb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM ausschalten! + ret + end BY_WO_CMP + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE FAT_ERR +Ausgabe von T_ERR, Fehlerzeile und T_FERR auf Terminal +Input: siehe Prozedur MSG_ERROR +Output: r2 - Stand Fehlerzaehler (ERR_CNT) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + FAT_ERR procedure + entry + calr MSG_ERROR !Ausgabe T_ERR und Fehlerzeile auf Terminal! + +FAT_ERR1: + calr WR_2BS !2x Backspace ausgeben, um letzte Testschritt- + nummer zu ueberschreiben! + ld r2, #T_FERR + sc #SC_WR_MSG !Ausgabe T_FERR auf Terminal! + sc #SC_WR_OUTBFF_CR !Ausgabe CR auf Terminal! + ld r2, ERR_CNT + ret + end FAT_ERR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_TESTNR +Ausgabe der Testschrittnummer auf Terminal +Input: r8 - Testschrittnummer + rh1 Bit0=0 - Test nicht in Segment 0 + =1 - Test in Segment 0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + WR_TESTNR procedure + entry + ldm RG_FELD, r0, #%0F + bitb rh1, #%00 !Test in Segment 0?! + jr z, WRTST1 !nein! + + inb rh2, S_BNK !ja! + resb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM einschalten! + +WRTST1: + calr WR_2BS !2x Backspace ausgeben, um letzte Testschritt- + nummer zu ueberschreiben! + ld r5, r8 + sc #SC_BTOH8 !Testschrittnummer (aus rl5) in Ausgabepuffer + OUTBFF eintragen! + sc #SC_WR_OUTBFF !Inhalt von OUTBFF auf Terminal ausgeben! + + bitb rh1, #%00 !Test in Segment 0?! + jr z, WRTST2 !nein! + + inb rh2, S_BNK + setb rh2, #%00 + outb S_BNK, rh2 !Monitor PROM+RAM ausschalten! + +WRTST2: + ldm r0, RG_FELD, #%0F + ret + end WR_TESTNR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_2SP +Ausgabe von 2 Space auf Terminal +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + WR_2SP procedure + entry + pushl @r15, rr0 + pushl @r15, rr2 + + ldb rl0, #' ' + sc #SC_TYWR + ldb rl0, #' ' + sc #SC_TYWR + + popl rr2, @r15 + popl rr0, @r15 + ret + end WR_2SP + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE WR_2BS +Ausgabe von 2 Backspace auf Terminal +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + WR_2BS procedure + entry + pushl @r15, rr0 + pushl @r15, rr2 + + ldb rl0, #BS + sc #SC_TYWR + ldb rl0, #BS + sc #SC_TYWR + + popl rr2, @r15 + popl rr0, @r15 + ret + end WR_2BS + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE MSG_ERROR +Ausgabe T_ERR und Fehlerzeile (Fehlernummer und max. 4 Parameter) auf Terminal +Input: r8 - Fehlernummer + r6 - 1. Parameter der Fehlerzeile + r7 - 2. Parameter der Fehlerzeile + r5 - 3. Parameter der Fehlerzeile + r4 - 4. Parameter der Fehlerzeile + ERRPAR_ID - Spezifizierung, als was die 4 Fehlerparameter auszugeben + sind: + Bit 7,6 (ERRPAR_ID) fuer Parameter 1 (r6) + Bit 5,4 (ERRPAR_ID) fuer Parameter 2 (r7) + Bit 3,2 (ERRPAR_ID) fuer Parameter 3 (r5) + Bit 1,0 (ERRPAR_ID) fuer Parameter 4 (r4) + mit + Bit x,x = 00 --> Parameter ist nicht auszugeben + Bit x,x = 01 --> Ausgabe des rl-Reg. des Parameters + Bit x,x = 10 --> Ausgabe des r-Reg. des Parameters + Bit x,x = 11 --> Ausgabe des rh-Reg. des Parameters als + Segmentnummer ('') +Output: ERR_CNT - Fehlerzaehler wurde incr., wenn Bit2(rh1)=0 war + Bit2(rh1) := 0 + Bit6(rh1) := 1 + Bit7(rh1) := 1 , wenn Bit6(rh1) vorher =1 war +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + MSG_ERROR procedure + entry + ldm RG_FELD, r0, #%0F !Registerinhalte r0-r14 retten! + calr MEM_MSG_ERR !Fehlermeldung in ERR_LST eintragen! + ldm r0, RG_FELD, #%0F + +MSG_ERR1: + ldm RG_FELD, r0, #%0F + + push @r15, r4 !4. Parameter! + push @r15, r5 !3. Parameter! + push @r15, r7 !2. Parameter! + push @r15, r6 !1. Parameter! + push @r15, r8 !Fehlernummer! + + calr WR_2BS !2x Backspace ausgeben, um letzte Testschritt- + nummer zu ueberschreiben! + + ld r2, #T_ERR + call WR_MSG !Ausgabe Text T_ERR auf Terminal! +!Aufbau der Fehlerzeile im Ausgabepuffer OUTBFF und Ausgabe auf Terminal! + pop r5, @r15 + sc #SC_BTOH8 !Fehlernummer in Ausgabepuffer OUTBFF eintr.! + ldb rl1, #' ' + sc #SC_PUT_CHR !Space in OUTBFF eintragen! + ldb rl1, #' ' + sc #SC_PUT_CHR !Space in OUTBFF eintragen! + ldb rl1, #' ' + sc #SC_PUT_CHR !Space in OUTBFF eintragen! + + ld r7, ERRPAR_ID !rl7 := Parameter-Identifier fuer Fehlerzeile! + ld r6, #%0004 !r6 := Anzahl der Parameter (=4)! +MSER2: + xorb rh7, rh7 !rh7 loeschen! + rl r7, #%02 !Parameter-Identifier fuer betrachteten + Parameter in rh7 schieben (Bit 0,1)! + pop r5, @r15 !r5 := betrachteter Parameter! + cpb rh7, #%01 !Parameter-Identifier = 1 ?! + jr nz, MSER3 !nein! + + sc #SC_BTOH8 !ja --> rl-Reg. des Par. in OUTBFF eintr.! + jr MSER5 !naechster Parameter! + +MSER3: + cpb rh7, #%02 !Parameter-Identifier = 2 ?! + jr nz, MSER4 !nein! + + sc #SC_BTOH16 !ja --> r-Reg. des Par. in OUTBFF eintr.! + jr MSER5 !naechster Parameter! + +MSER4: + cpb rh7, #%03 !Parameter-Identifier = 3 ?! + jr nz, MSER5 !nein --> Parameter nicht ausgeben! + + ldb rl5, rh5 !ja --> rh-Reg. des Parameters als! + sc #SC_PUT_SEGNR !Segmentnummer in OUTBFF eintragen! + +MSER5: + ldb rl1, #' ' + sc #SC_PUT_CHR !Space in OUTBFF eintragen! + djnz r6, MSER2 !naechster Parameter! + + sc #SC_WR_OUTBFF_CR !Ausgabe Inhalt OUTBFF mit CR auf Terminal! + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + + ldm r0, RG_FELD, #%0F !gerettete Registerinhalte r0-r14 + zurueckspeichern! + + bitb rh1, #%02 + jr nz, LB_2286 + inc ERR_CNT, #%01 !Fehlerzaehler incr! +LB_2286: + resb rh1, #%02 + + bitb rh1, #%06 + jr z, MSER6 + setb rh1, #%07 !SET Bit7(rh1), wenn Bit6(rh1)=1! +MSER6: + setb rh1, #%06 !SET Bit6(rh1), wenn Bit6(rh1)=0! + ret + end MSG_ERROR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE _MSG_MAXSEG +Ausgabe T_SEG/NSEG, TJUM, T_MAXS und hoechste Segmentnummer auf Terminal +Output: r2 - Stand Fehlerzaehler (ERR_CNT) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + _MSG_MAXSEG procedure + entry + dec r15,#14 !Retten der Saferegister r8-r14! + ldm @r15,r8,#7 + + xorb rl0, rl0 + outb S_BNK, rl0 !MONITOR PROM & RAM EINSCHALTEN! + + + calr WR_2SP !2 Space ausgeben, da Testschrittausgabe + mit 2x Backspace beginnt! + ld ERR_CNT, #%0000 !Fehlerzaehler loeschen! + + ld r2, #T_MAXS + sc #SC_WR_MSG !Ausgabe Text T_MAXS auf Terminal! + ldb rl5, MAX_SEGNR + sc #SC_PUT_SEGNR !hoechste Segmentnr. in OUTBFF eintragen! + sc #SC_WR_OUTBFF_CR !Ausgabe der hoechsten Segmentnummer auf + Terminal (mit CR)! + + ldm r8,@r15,#7 !Rueckretten der Safe-Register r8-r14! + inc r15,#14 + ret + end _MSG_MAXSEG + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CRC_TEST +CRC-Berechnung und Vergleich mit vorgegebenen Sollwert +--- bei Fehler Sprung zu FAT_ERR und Ruecksprung zu Monitor --- + +(bei der CRC-Berechnung wird beginnend bei der angeg. Anfangsadresse nur +jedes zweite Byte in die CRC-Berechnung einbezogen, da der Maschinenkode +auf den EPROM's separiert ist (even/odd)) + +Input: r2 - Speicheranfangsadresse + r3 - Anzahl der in die CRC-Bildung einzubeziehenden Bytes + r4 - erwartete Pruefsumme + r5 - negierte erwartete Pruefsumme +Output: r6 - Pruefsumme +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CRC_TEST procedure + entry +!Vergleich erwartete Pruefsumme mit negierter erwarteter Pruefsumme! + xor r5, r4 + cp r5, #%FFFF + jr nz, CRCERR !Fehler! + +!Berechnung der Pruefsumme! + ld r6, #-1 +CRC: ldb rl0, @r2 + xorb rl0, rh6 + ldb rh6, rl0 + rrb rl0 + rrb rl0 + rrb rl0 + rrb rl0 + andb rl0, #%0F + xorb rl0, rh6 + ldb rh6, rl0 + rrb rl0 + rrb rl0 + rrb rl0 + ldb rh0, rl0 + andb rl0, #%1F + xorb rl0, rl6 + ldb rl6, rl0 + ldb rl0, rh0 + rrb rl0 + andb rl0, #%F0 + xorb rl0, rl6 + ldb rl6, rl0 + ldb rl0, rh0 + andb rl0, #%E0 + xorb rl0, rh6 + ldb rh6, rl6 + ldb rl6, rl0 + + inc r2, #2 !naechstes Byte! + djnz r3, CRC + +!Vergleich der berechneten mit der erwarteten Pruefsumme! + cp r6, r4 + ret z !kein Fehler! +CRCERR: + pop r5, @r15 !UP-RET aufheben! + jp FAT_ERR !Fehlerabsprung! + end CRC_TEST + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE PIO_TEST1 + +Input: r6 - PIO-Datenadresse + r7 - PIO-Controladresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + PIO_TEST1 procedure + entry + ldb rl5, #%55 !rl5=Fehlerpar. (Testdatenwert)! + !Restriktion! + cp r6, #PIO2D_B + jr nz, PIOTST11 + ldb rl5, #%75 !BIT5=1! + +PIOTST11: !Restriktion: fuer Kanal kein Ausgabemode! + ldb rl0, #%CF !PIO-Bitmode! + outb @r7, rl0 + ldb rl0, #%00 !alle Bits auf Ausgabe! + outb @r7, rl0 + ldb rl0, #%07 !kein Interrupt! + outb @r7, rl0 + + outb @r6, rl5 !Ausgabe des Testdatenwertes! + inb rl4, @r6 !rl4=Fehlerpar. (rueckgel. Datenwert)! + calr BY_WO_CMP !Vergleich rl4/rl5; ggf. Fehler 50! + + !Restriktion! + ldb rl0, #%4F !PIO-Eingabemode! + outb @r7, rl0 + + cpb rl5, #%AA + ret z + ldb rl5, #%AA !rl5=Fehlerpar. (naechster Testdatenwert)! + jr PIOTST11 + end PIO_TEST1 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CTC_TEST1 + +Input: r6 - CTC-Kanaladresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CTC_TEST1 procedure + entry + ldb rl5, #%AA !rl5=Fehlerpar. (Testdatenwert)! +CTCTST11: + di vi + ldb rl0, #%27 !Zeitgeber, Vorteiler 256! + outb @r6, rl0 + outb @r6, rl5 !Ausgabe des Testdatenwertes (Zeitkonstante)! + inb rl4, @r6 !rl4=Fehlerpar. (rueckgel. Datenwert)! + ei vi + calr CTC_INIT !CTC-Kanal ruecksetzen,ggf. neu initialisieren! + calr BY_WO_CMP !Vergleich rl4/rl5; ggf. Fehler 55! + cpb rl5, #%55 + ret z + ldb rl5, #%55 !rl5=Fehlerpar. (naechster Testdatenwert)! + jr CTCTST11 + end CTC_TEST1 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CTC_TEST2 + +Input: r6 - CTC-Kanaladresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CTC_TEST2 procedure + entry + ldb rl0, #%07 !Zeitgeber, Vorteiler 16! + outb @r6, rl0 + ldb rl5, #%FF !Zeitkonstante! + outb @r6, rl5 + + ldb rl0, #2 !bestimmte Zeit warten! +CTCTST21: + dbjnz rl0, CTCTST21 + + inb rl4, @r6 !Zeitkonstante ruecklesen! + calr CTC_INIT !CTC-Kanal ruecksetzen,ggf. neu initialisieren! + + cpb rl4, rl5 + jp z, MSG_ERROR !Fehler 56: Kanal zaehlt nicht! + ret + end CTC_TEST2 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CTC_TEST3 + +Input: r6 - CTC-Kanaladresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CTC_TEST3 procedure + entry + ldb rl0, #%87 !Zeitgeber, Vorteiler 16, Int! + outb @r6, rl0 + + ld REM_INT, #0 !Interruptmerkerzelle loeschen! + + ldb rl0, #%20 !Zeitkonstante! + outb @r6, rl0 + + ldb rl0, #%FF !bestimmte Zeit auf Interrupt warten! +CTCTST31: + test REM_INT !Interrupt aufgetreten?! + jr nz, CTC_INIT !ja --> CTC-Kanal rueckssetzen, + ggf. neu initialisieren! + dbjnz rl0, CTCTST31 + + calr CTC_INIT !CTC-Kanal ruecksetzen,ggf. neu initialisieren! + jp MSG_ERROR !Fehler 57! + end CTC_TEST3 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE CTC_INIT +CTC-Kanal ruecksetzen; +ggf. Neuprogrammierung von bereits programmierten Kanaelen (CTC0_0/CTC0_1) + +Input: r6 - CTC-Kanaladresse +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CTC_INIT procedure + entry + ldb rl0, #%03 !CTC-Reset! + outb @r6, rl0 + + cp r6, #CTC0_0 + jp z, INIT_CTC0_0 !CTC0_0 fuer LOAD/SEND wieder initialisieren! + + cp r6, #CTC0_1 + ret nz + testb PTYPORT !8-Bit-Teil aktiv?! + ret nz !ja! + jp INIT_CTC0_1 !CTC0_1 fuer Terminalkanal SIO0_B wieder init.! + end CTC_INIT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ISR CTC_ISR + +Input: r6 - CTC-Kanaladresse +Output: REM_INT := %FFFF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + CTC_ISR procedure + entry + di vi + push @r15, r0 + ld REM_INT, #%FFFF + ldb rl0, #%03 !CTC-Reset! + outb @r6, rl0 + ld r0, #%ED4D !U880-RETI ausgeben! + outb RETI_P, rh0 + outb RETI_P, rl0 + pop r0, @r15 + ei vi + sc #SC_SEGV + nop + iret + end CTC_ISR + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SIO_TEST1 + +Input: r6 - SIO-Datenadresse (nur Kanal B des entsprechenden SIO's) + r7 - SIO-Controladresse (nur Kanal B des entsprechenden SIO's) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SIO_TEST1 procedure + entry + ldb rl5, #%AA !rl5=Fehlerpar. (Testdatenwert)! +SIOTST11: + ldb rl0, #SIO_R0+COMM3 !SIO-Kanal ruecksetzen! + outb @r7, rl0 + + ldb rl0, #SIO_R1+COMM2 + ldb rh0, #%00 !Status veraendert Vektor nicht! + outb @r7, rl0 + outb @r7, rh0 + + ldb rl0, #SIO_R2+COMM2 + outb @r7, rl0 !Schreibregister 2 adressieren! + outb @r7, rl5 !Ausgabe des Testdatenwertes an Int.-Reg.! + + outb @r7, rl0 !Leseregister 2 adressieren! + inb rl4, @r7 !rl4=Fehlerpar. (rueckgel. Datenwert)! + + calr SIO_INIT !SIO-Port ggf. neu initialisieren! + calr BY_WO_CMP !Vergleich rl4/rl5; ggf. Fehler 55! + cpb rl5, #%55 + ret z + ldb rl5, #%55 !rl5=Fehlerpar. (naechster Testdatenwert)! + jr SIOTST11 + end SIO_TEST1 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SIO0_A_TEST2 + SIO0_B_TEST2 + SIO1_A_TEST2 + SIO1_B_TEST2 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SIO0_A_TEST2 procedure + entry + ld r6, #SIO0D_A !SIO-Datenadresse! + ld r7, #SIO0C_A !SIO-Controladresse! + ld r5, #CTC0_0 !zugehoeriger CTC-Kanal fuer Baudrate! + ld r4, #SIO0C_B !SIO-Controladresse f. Ausgabe des INT-Vektors + (Ausgabe nur an Kanal B des SIO's)! + ld r3, #SIO0C_A !SIO-Controladresse fuer RETI-Ausgabe + (Ausgabe nur an Kanal A des SIO's)! + jr SIO_TEST2 + +SIO0_B_TEST2: + ld r6, #SIO0D_B !SIO-Datenadresse! + ld r7, #SIO0C_B !SIO-Controladresse! + ld r5, #CTC0_1 !zugehoeriger CTC-Kanal fuer Baudrate! + ld r4, #SIO0C_B !SIO-Controladresse f. Ausgabe des INT-Vektors + (Ausgabe nur an Kanal B des SIO's)! + ld r3, #SIO0C_A !SIO-Controladresse fuer RETI-Ausgabe + (Ausgabe nur an Kanal A des SIO's)! + jr SIO_TEST2 + +SIO1_A_TEST2: + ld r6, #SIO1D_A !SIO-Datenadresse! + ld r7, #SIO1C_A !SIO-Controladresse! + ld r5, #CTC0_2 !zugehoeriger CTC-Kanal fuer Baudrate! + ld r4, #SIO1C_B !SIO-Controladresse f. Ausgabe des INT-Vektors + (Ausgabe nur an Kanal B des SIO's)! + ld r3, #SIO1C_A !SIO-Controladresse fuer RETI-Ausgabe + (Ausgabe nur an Kanal A des SIO's)! + jr SIO_TEST2 + +SIO1_B_TEST2: + ld r6, #SIO1D_B !SIO-Datenadresse! + ld r7, #SIO1C_B !SIO-Controladresse! + ld r5, #CTC1_0 !zugehoeriger CTC-Kanal fuer Baudrate! + ld r4, #SIO1C_B !SIO-Controladresse f. Ausgabe des INT-Vektors + (Ausgabe nur an Kanal B des SIO's)! + ld r3, #SIO1C_A !SIO-Controladresse fuer RETI-Ausgabe + (Ausgabe nur an Kanal A des SIO's)! + jr SIO_TEST2 + +SIO_TEST2: + ldb rh0, #%57 !zugehoerigen CTC-Kanal fuer Baudrate progr.! + ldb rl0, #%02 !9600 Baud! + outb @r5, rh0 + outb @r5, rl0 + + ld r2, #ITAB_SIO !SIO-Kanal programmieren! + ld r0, #9 + otirb @r7, @r2, r0 + ld r2, #ITAB_SIO_INTVEK + ld r0, #2 + otirb @r4, @r2, r0 + + ld REM_INT, #0 !Interruptmerkerzelle loeschen! + + ldb rl0, #%00 + outb @r6, rl0 !Datenausgabe! + + ld r0, #%1000 !bestimmte Zeit auf Interrupt warten! +SIOTST21: + test REM_INT !Interrupt aufgetreten?! + jr nz, SIO_INIT !ja! + djnz r0, SIOTST21 + + calr SIO_INIT !ggf. SIO-Port neu initialisieren! + jp MSG_ERROR !Fehler 61! + end SIO0_A_TEST2 + + INTERNAL +ITAB_SIO ARRAY [* BYTE] := [SIO_R0+COMM3 + SIO_R4 + COMM2 + S2 + C32 + NOPRTY + SIO_R3 + 0 !Empfaenger aus! + SIO_R5 + XENABLE + T8 !Sender ein! + SIO_R1 + COMM2 + XMTRIE] !Senderinterrupt ein! + +ITAB_SIO_INTVEK ARRAY [* BYTE] := [SIO_R2 + %20] !VI_TAB_REST in PSAREA! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE SIO_INIT +Ruecksetzen des SIO- und CTC-Kanals; +ggf. Neuprogrammierung von bereits programmierten Kanaelen +(SIO0_A/SIO0_B und CTC0_0/CTC0_1) + +Input: r7 - SIO-Controladresse + r5 - zugeh. CTC-Kanaladresse fuer Baudrate +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SIO_INIT procedure + entry + ldb rl0, #SIO_R0+COMM3 !SIO-Kanal ruecksetzen! + outb @r7, rl0 + ldb rl0, #%03 !CTC-Kanal ruecksetzen! + outb @r5, rl0 + + cp r7, #SIO0C_A !SIO0_A?! + jr nz, SIOINIT1 !nein! + + call INIT_CTC0_0 !CTC0_0 fuer SIO0_A initialisieren! + jp INIT_SIO0_A !SIO0_A fuer LOAD/SEND wieder initialisieren! + +SIOINIT1: + cp r7, #SIO0C_B !SIO0_B! + ret nz !nein! + + testb PTYPORT !8-Bit-Teil aktiv?! + jp nz, INIT_SIO0_A !ja --> SIO0_B nicht initialisieren, aber + Interruptvektor fuer SIO0_A wieder init., da + er bei Test von SIO0_B zerstoert wurde! + + call INIT_CTC0_1 !nein --> Terminalkanal SIO0_B wieder init.! + jp INIT_SIO0_B + end SIO_INIT + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ISR SIO_ISR + +Input: r7 - SIO-Controladresse + r3 - zugeh. SIO-Controladresse fuer RETI-Ausgabe (Kanal A des SIO's) +Output: REM_INT := %FFFF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + SIO_ISR procedure + entry + push @r15, r0 + ld REM_INT, #%FFFF + + ldb rl0, #SIO_R0+COMM3 + outb @r7, rl0 !SIO-Kanal zuruecksetzen! + + ldb rl0, #SIO_R0+RFI + outb @r3, rl0 !RETI an SIO ausgeben! + + pop r0, @r15 + sc #SC_SEGV + nop + iret + end SIO_ISR + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DO_WDC +Fuer WDC-Test lese/schreibzugriff auf Sec.1, Kopf1, Zyl.0, Drive0 +Inputs: rh7= Kommandocode + r3= Pufferadresse ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +INTERNAL + DO_WDC procedure + entry + + ldb rl7,#0 ! Laufwerks-Nr. ! + ld r6,#0 ! Zylinder-Nr. ! + ldb rh5,#1 ! Kopf-Nr. ! + ldb rl5,#1 ! Sektor-Nr. ! + ld r4,#sizeof BUFFER ! Sektorlaenge ! + call wdc ! WDC-Treiber ! + ret + +end DO_WDC + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +_INI_ERR_LST +Initialisierung fuer Fehlerlistenausgabe + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +GLOBAL + _INI_ERR_LST procedure + entry + dec r15, #14 !Retten der Safereg. r8-r14! + ldm @r15,r8,#7 + + xor r0, r0 !Loeschen r0! + outb S_BNK, rl0 !Monitor PROM & RAM einschalten! + + ld CNT_ERR_LST, #0 !Loeschen Zaehler fuer Eintrag. in ERR_LST! + ld CUM_CNT_ERR, r0 !Loeschen des kumulat. Zaehlers! + + ld r1, #ERR_LST + ld r2, #ERR_LST+2 + ld r3, #119 + ld @r1, r0 !Erstes WORD loeschen! + ldir @r2, @r1, r3 !Ganzen Bereich ERR_LST LOESCHEN! + + ld PTR_ERR_LST, #ERR_LST-2 !Pointer fuer Ausgabe von ERR_LST! + + ldm r8, @r15, #7 !Rueckretten der Saferegister! + inc r15, #14 + ret + end _INI_ERR_LST + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +MEM_MSG_ERR +Speichern der Fehlermeldung in ERR_LST. +Aufruf aus MSG_ERROR (Eingabeparameter siehe dort). ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + INTERNAL + MEM_MSG_ERR procedure + entry + ld r10, #ERR_LST+238 !Letzte Eintragung in ERR_LST! + ld r11, #ERR_LST+226 !Vorletzte Eintragung in ERR_LST! + ld r12, #114 !Zaehler:=114, d.h. 19 Eintragungen! + lddr @r10, @r11, r12 !Ganze Tabelle um eine Eintragung nach + unten schieben! + ld r10, #ERR_LST+13 !Fuer oberste Eintragung in Liste! + push @r10, r4 !4. Parameter! + push @r10, r5 !3. Parameter! + push @r10, r7 !2. Parameter! + push @r10, r6 !1. Parameter! + push @r10, r8 !Fehler-Nummer! + push @r10, ERRPAR_ID !Spezifikation fuer Parameter! + + inc CUM_CNT_ERR, #01 !Kumulativer Fehlerzaehler! + cp CNT_ERR_LST, #20 !Schon 20 Fehler eingetragen?! + ret z !Ja! + + inc CNT_ERR_LST, #01 !Fehlerzaehler erhoehen! + inc PTR_ERR_LST, #12 !Pointer weist auf letzten Parameter der + ersten Eintragung in ERR_LST! + ret + end MEM_MSG_ERR + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +_MEM_MSG_OUT +Ausgabe der gesamten Fehlerliste. Aufruf aus sa.diags nach Kommando "d". ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + _MEM_MSG_OUT procedure + entry + dec r15, #14 !Retten der Saferegister r8-r14! + ldm @r15, r8, #7 + + xorb rh1,rh1 !Flagbyte loeschen! + outb S_BNK, rh1 !MONITOR PROM & RAM EINSCHALTEN! + ld r2, #T_CUM_ERR1 + call WR_MSG !Text 1 ausgeben! + + cp CNT_ERR_LST, #0 !Schon Fehler aufgetreten?! + jr z, OUT1 + + ld r7, #PAR_CNT_ERR !Adresse fuer Druckparameter! + ld r6, CUM_CNT_ERR !ZAehler! + call _printf !Ausgabe der Gesamtfehleranzahl! + + ld r2, #T_CUM_ERR3 + call WR_MSG + call WR_CRLF + call WR_2SP + + ld r2, PTR_ERR_LST + ld r3, CNT_ERR_LST + +OUT3: !Alle Parameter bereitstellen! + ld r4, @r2 !4. Parameter! + dec r2, #02 + ld r5, @r2 !3. Parameter! + dec r2, #02 + ld r7, @r2 !2. Parameter! + dec r2, #02 + ld r6, @r2 !1. Parameter! + dec r2, #02 + ld r8, @r2 !Fehler-Nummer! + dec r2, #02 + ld r9, @r2 !Spezifikatin fuer Parameter! + dec r2, #02 + ld ERRPAR_ID, r9 + + push @r15, r2 !r2 ablegen! + push @r15, r3 !r3 ablegen! + + calr MSG_ERR1 !Ausgabe einer Fehlermitteilung! + pop r3, @r15 + pop r2, @r15 + dec r3, #01 !CNT_ERR_LST! + jr z, OUT2 !Alle Fehler ausgegeben! + + jr OUT3 + +OUT1: ld r2, #T_CUM_ERR2 + call WR_MSG + ld r2, #T_CUM_ERR3 + call WR_MSG + +OUT2: ldm r8, @r15, #7 + inc r15, #14 + ret + + end _MEM_MSG_OUT + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE TEST_ +DUMMY-Routine fuer Monitorkommando ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + TEST_ procedure + entry + + nop + ret + end TEST_ + +end satest + diff --git a/WEGA/src/cmd/standalone/sa.diags/twem.s b/WEGA/src/cmd/standalone/sa.diags/twem.s new file mode 100644 index 0000000..9ce5803 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/twem.s @@ -0,0 +1,1008 @@ + +!****************************************************************************** +******************************************************************************* + + P8000/compact-Firmware (C) ZFT/KEAW Abt. Basissoftware - 1989 + Hardware-Test fuer + WDOS-Erweiterungs-Modul + + Modul: twem + Bearbeiter: M. Klatte, V. Gustavs + Datum: 1/89, 5/89, 6/89 + Version: 1.1 + +******************************************************************************* +******************************************************************************! + + +twem module + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Externe Prozeduren und Datenfelder ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + EXTERNAL +WR_2BS procedure +WR_2SP procedure +WR_TESTNR procedure +MSG_ERROR procedure + + + EXTERNAL +ERRPAR_ID word +ERR_CNT word + + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Konstantendeklaration ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +! System Calls ! + + CONSTANT +SC_SEGV := 1 +SC_NSEGV := 2 + +S_BNK := %FFC1 ! Speicherbankumschaltung ! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Startadressen fuer U80601-Code im Erweiterungs-RAM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +RAMZIEL3 := %FF00FFF0 ! Startadresse fuer U80601-Code Test3 ! +RAMZIEL4 := %FF00FFD0 ! Startadresse fuer U80601-Code Test4 ! +RAMZIEL5 := %FF00FFAC ! Startadresse fuer U80601-Code Test5 ! +RAMZIEL6 := %FF00FFA8 ! Startadresse fuer U80601-Code Test6 ! +RETCODE := %FF00FFFC ! U80601 returncode-Bereich ! +INTTAB := %F0000000 ! U80601-INT-Tabelle im U8000-SEG-Nr.70 ! +INT1 := %FF01 ! INT-Vektor 1 ! + +! U80601-Port Definitionen ! + +CPU2PORT := %FF1F ! U80601 Portadresse ! +RESET := %FEFF ! U80601 RESET ! +RUN := %FFFF ! U80601 Starten ! + +! Konstanten fuer Testmuster ! + +MUSTERLEN := 17 +MUPROSEG := %FFFF / MUSTERLEN + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Teststatuscodes und Fehlercodes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +TESTNR1 := %A0 ! EXRAM-Test durch U8000 ! +TESTNR2 := %B0 ! Paritaetstest durch U8000 ! +TESTNR3 := %C0 ! U80601 Anlauftest ! +TESTNR4 := %D0 ! INT-Test U80601 <-> U8000 ! +TESTNR5 := %E0 ! EXRAM-Test vom U80601 ! +TESTNR6 := %F0 ! Test des DPRC 8207 ! + +errx1 := 1 ! Datenuebertragungsfehler beim U80601-Programm! +errx2 := 2 ! U80601 laeuft nicht an ! +errx3 := 3 ! Falsche SEG-Nr. beim Speichertest ! +errx4 := 4 ! Falsches Datenbyte beim Speichertest ! + +err11 := TESTNR1+errx1 ! nicht benutzt ! +err12 := TESTNR1+errx2 ! nicht benutzt ! +err13 := TESTNR1+errx3 ! Falsche SEG-Nr. beim Speichertest ! +err14 := TESTNR1+errx4 ! Falsches Datenbyte beim Speichertest ! + +err21 := TESTNR2+errx1 ! Uebertragungsfehler in DRAM ! +err22 := TESTNR2+errx2 ! nicht benutzt ! +err23 := TESTNR2+errx3 ! nicht benutzt ! +err24 := TESTNR2+errx4 ! Falsches Datenbyte beim Speichertest ! + +err31 := TESTNR3+errx1 ! moveerror im Test 3 ! +err32 := TESTNR3+errx2 ! U80601 laeuft nicht an ! + +err41 := TESTNR4+errx1 ! moveerror im Test 4 ! +err42 := TESTNR4+errx2 ! U80601 laeuft nicht an ! +err43 := TESTNR4+errx3 ! nicht benutzt ! +err44 := TESTNR4+errx4 ! nicht benutzt ! +err45 := TESTNR4 + 5 ! U80601 springt falsche ISR an ! +err46 := TESTNR4 + 6 ! U80601 springt ISR nicht an ! +err47 := TESTNR4 + 7 ! U8000 hat keinen NVI empfangen ! + +err51 := TESTNR5+errx1 ! moveerror im Test 5 ! +err52 := TESTNR5+errx2 ! U80601 laeuft nicht an ! +err53 := TESTNR5+errx3 ! Falsche SEG-Nr. beim Speichertest ! +err54 := TESTNR5+errx4 ! Falsches Datenbyte beim Speichertest ! + +err61 := TESTNR6+errx1 ! moveerror im Test 6 ! +err62 := TESTNR6+errx2 ! U80601 laeuft nicht an ! +err63 := TESTNR6+errx3 ! Falsche SEG-Nr. beim Speichertest ! +err64 := TESTNR6+errx4 ! Falsches Datenbyte beim Speichertest ! + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Pointer fuer U80601-ISR-Tabelle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +INTERNAL + +ISRP6 byte := %E4 ! Startadresse ISR PC-Lowteil ! + byte := %FF ! " " PC-Highteil! + byte := %00 ! Code-Segment Lowteil ! + byte := %F0 ! " " Highteil ! + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Pointer fuer U80601-INT-SERVICE-ERROR-ROUTINE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +ISRERRP byte := %F2 ! Startadresse ISRERR PC-Lowteil ! + byte := %FF ! " " PC-Highteil! + byte := %00 ! Code-Segment Lowteil ! + byte := %F0 ! " " Highteil ! + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Testmuster zum Testen des RAM-Bereiches ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! +INTERNAL + +MUSTER ARRAY [MUSTERLEN BYTE] := [%1 %2 %3 %4 %5 %6 %7 %8 %9 + %10 %11 %12 %13 %14 %15 %16 %17] + + +REM_PARNMI word ! Merker: Paritaets-NMI ! +REM_NVI word ! Merker: NVI vom U80601 ! + + + + +!******************************************************************************* +Prozeduren +*******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test600 +Diese Prozedur fuehrt fuenf Tests durch: +1. RAM-Test vom U8000 aus +2. Paritaetstest +3. Anlauftest des U80601 +4. Test der Interrupts zwischen U8000 und U80601 +5. RAM-Test vom U80601 aus +6. Test des Dualport-RAM-controllers +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +_WEM_ PROCEDURE + entry + + sc #SC_NSEGV ! Nichtsegmentierte Vers. einstellen ! + + dec r15,#14 ! Retten der Saferegister r8-r14 ! + ldm @r15,r8,#7 + xorb rl0, rl0 + outb S_BNK, rl0 ! MONITOR PROM & RAM einschalten ! + call WR_2SP + ld ERR_CNT, #0 + + call test1 ! U80601-RAM-Test vom U8000 ! + jr nz, error ! wenn Fehler, jp ! + + call test2 ! Paritaetstest ! + jr nz, error ! wenn Fehler, jp ! + + call test3 ! U80601 Anlauf-Test ! + jr nz, error ! wenn Fehler, jp ! + + call test4 ! INT-TEST U8000 <-> U80601 ! + jr nz, error ! wenn Fehler, jp ! + + call test5 ! RAM-Zugriff vom U80601 ! + jr nz, error ! wenn Fehler, jp ! + + call test6 ! Test des DPRC 8207 ! + jr nz, error ! wenn Fehler, jp ! + + jr teste + +error: call MSG_ERROR ! Felerausgabe ! + +teste: + call WR_2BS + call WR_2SP + call WR_2BS + + ldm r8,@r15,#7 ! Saveregister r8-r14 regenerieren ! + inc r15,#14 + ret + +end _WEM_ + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test1 +Schreiben und Lesen des U80601-RAM-Bereiches, Vergleich mit vorgegebenem +Datenmuster in Feld MUSTER; +Ausgabe der Adresse sowie Soll- und Istdaten des fehlerhaften RAM-bytes + +Benutzte Register: r4 ... r13 +r4 Fehler-Istwert +r5 Sollwert bei Fehler +rr6 Zieladresse +r8 Testnummer +r9 Anzahl der Segmente +rr10 Quelladresse +r12 Blocklaenge +r13 Anzahl der Bloecke pro Segment ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test1 procedure + entry + + call reset80601 ! RESET an U80601 ! + ld r8, #TESTNR1 ! Test-Nr. laden ! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + +!Paritaetskontrolle ausschalten! + + inb rl5, S_BNK + resb rl5, #3 + outb S_BNK, rl5 + +!U80601-RAM mit Muster fuellen! + + ld r10, #%8000 !Quellsegment des Datenmusters! + ld r6, #%F000 !Zielsegment= %70! + ld r9, #16 !16 Segmente a 64K = 1MByte ! + +test11: ld r13, #MUPROSEG !Anzahl der zu schreibenden Bloecke! + ld r7, #0 ! Zieloffset ! + sc #SC_SEGV + +test12: ld r11, #MUSTER !Offset Quelle! + ld r12, #MUSTERLEN !Blocklaenge! + ldirb @r6, @r10, r12 !Speicher schreiben! + djnz r13, test12 !Wiederholung! + + ldb @r6, rh6 !Segmentnummer eintragen! + sc #SC_NSEGV + incb rh6 !naechstes Segment! + djnz r9, test11 + +!Speicher testen! + + ld r10,#%8000 !SEG des Soll-Musters! + ld r6, #%F000 !Segment 70 testen! + ld r9, #16 !16 Segmente testen! + calr sp_test !Daten im U80601-RAM mit Sollwert vergl.! + + ! Setzen des Z-Flag in Abhaenigkeit des Testergebnisses ! + + ld r3, r8 + and r3, #%F !wenn Fehler, dann ZF=0! + ret + +end test1 + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test2 +Test 2 : Paritaetstest +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test2 PROCEDURE + entry + + call reset80601 ! RESET an U80601 ! + ld r8, #TESTNR2 !Testnr. laden! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + + +!Speicher mit Testdatenmuster fuellen! + + ld r2, #16 !Anzahl der Segmente! + ldl rr10, #%F0000000 !Zieladresse Segment %70! +test21: ld r3, #8 ! 8 * %2000 = 64k = 1 SEG! +test22: ld r4, #%2000 !Datenlaenge! + ldl rr6, #%80000000 !Quelladresse (Monitorprogramm)! + calr MOVE6 + bit r8,#0 ! move error ? ! + jr nz,test2end ! wenn Fehler, JP ! + djnz r3, test22 + + add r10, #%100 !naechstes Segment! + djnz r2, test21 + + inb rl5, S_BNK + setb rl5, #3 !Paritaetskontrolle einschalten! + outb S_BNK, rl5 + + ldl rr10, #%F0000000 !erste zu testende RAM-Adresse Seg 70! + +test24: ld REM_PARNMI, #0 !Merkzelle Paritaets-NMI loeschen! + sc #SC_SEGV + ld r4, @r10 !Wort ruecklesen! + sc #SC_NSEGV + test REM_PARNMI !Paritaetsfehler?! + jr z, test25 !nein! + ld ERRPAR_ID, #%EA ! r6=SEG, r7=off, r5=Soll, r4=Ist ! + add r8, #errx4 ! Fehlercode fuer falsche Daten ! + ldl rr6,rr10 ! Fehler-Adresse umladen ! + and r11, #%1FFF ! Sollwert-Adresse bilden ! + ld r5, @r11 ! Sollwert aus SEG 0 laden ! + jr test2end + +test25: inc r11, #2 !naechstes Wort! + test r11 !ganzes Segment geprueft?! + jr nz, test24 !nein! + + add r10, #%100 !naechstes Segment! + jr nz, test24 + + inb rl5, S_BNK + resb rl5, #3 !Paritaetskontrolle ausschalten! + outb S_BNK, rl5 + + !Setzen des Z-Flags in Abhaengigkeit des Testergebnisses! + +test2end: + ld r3, r8 + and r3, #%F !wenn Fehler, dann ZF=0! + ret + +end test2 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test3 +Test 3 : Anlauf U80601 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test3 PROCEDURE + entry + + call reset80601 ! RESET an U80601 ! + ld r8, #TESTNR3 ! Testnr. laden ! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + + + ld r6, #%8000 ! SEG-Nr. Quelle ! + ld r7, #t3c86 ! OFFSET Quelle laden ! + ld r4, lt3c86 ! Laenge in Byte ! + ldl rr10, #RAMZIEL3 + calr MOVE6 ! Testprogramm f. U80601 in letztes SEG laden ! + bit r8,#0 ! move error ? ! + jr nz,test3end ! wenn Fehler, JP ! + + call run80601 ! Start des Testprogramms ! + + call time ! 1ms warten ! + + call getrc ! r6 := U80601 returncode ! + cp r6, r8 !Codewort testen (returncode=Test-Nr.?)! + jr z,test3end ! wenn ja, Codewort o.k., JP ! + + ld r7, r6 ! Istwert holen ! + ld r6, r8 ! Sollwert laden ! + ld r8, #err32 ! Fehlercode laden ! + ld ERRPAR_ID, #%A0 ! Fehlerparameter: r6=Soll, r7=Ist ! + +test3end: + call reset80601 + + ! Setzen des Z-Flag in Abhaenigkeit des Testergebnisses ! + + ld r3, r8 + and r3, #%F ! wenn Fehler, dann ZF=0 ! + ret + +end test3 + + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test4 +Test 4 : INT-Verkehr U8000 <-> U80601 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test4 PROCEDURE + entry + + push @r15, r0 + push @r15, r1 + + call reset80601 ! RESET an U80601 ! + ld r8, #TESTNR4 ! Testnr. laden ! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + + +! Systeme fuer INT-Pruefung U80601 initialisieren ! + + ! INT-Vector-Tabelle fuer U80601 erzeugen ! + + ld r6, #%8000 ! SEG-NR. des Quellbereichs ! + ld r7, #ISRERRP ! OFFSET ISRERR-Pointer ! + ld r4, #4 ! Laenge in Byte ! + ldl rr10, #INTTAB ! Zieladr. der INT-Tabelle ! + calr MOVE6 ! move des ersten INT-Pointers ! + bit r8, #0 ! Fehler beim copieren ? ! + jr nz, test4end ! Wenn ja, JP ! + + ! Vervielfachung dieses Pointers auf alle 256 INT-Adressen ! + + ld r9, #4 ! Startwert fuer Byte-Zaehler ! + ld r2, #8 ! Startwert Wiederholungszaehler ! + +test41: ldl rr6, #INTTAB ! Quelladresse laden ! + ! Zieladr. steht noch in rr10 ! + ld r4,r9 ! Aktuelle Byteanzahl laden ! + calr MOVE6 ! Copieren der ersten Pointer ! + bit r8, #0 ! Fehler beim copieren ? ! + jr nz, test4end ! Wenn ja, JP ! + + sll r9, #1 ! Neuer Startwert = 2 * Alt ! + djnz r2, test41 ! Wiederholen bis alle Pointer geladen ! + + ! Code fuer U80601 laden ! + + ld r6, #%8000 ! SEG-Nr. Quelle ! + ld r7, #t4c86 ! OFFSET Quelle ! + ld r4, lt4c86 ! Laenge in Byte ! + ldl rr10, #RAMZIEL4 ! Zieladresse laden ! + calr MOVE6 ! U80601-Code in Zielbereich bringen ! + bit r8, #0 + jr nz,test4end ! wenn Fehler, JP ! + + ! U8000 fuer NVI Vorbereiten (Programm-Status fuer NVI laden) ! + + ldctl r9, PSAPOFF ! PSAP-OFFSET holen ! + ld %32(r9), #%4000 ! FCW laden ! + ld %34(r9), #%8000 ! PC-SEG laden ! + ld %36(r9), #NVISR6 ! PC-OFFSET laden ! + + ! U80601 fuer INT initialisieren und ueberpruefen ! + + calr run80601 ! U80601 fuer INT initialisieren ! + calr time + calr getrc ! r6 := U80601 returncode ! + cp r6,r8 + jr z,test42 ! wenn o.k., JP ! + + ld r8, #err42 ! U80601 laeuft nicht an ! + ld ERRPAR_ID, #%80 ! als Fehlerparameter nur r6 ! + jr test4end + +! 256 INT-Vektoren an den U80601 geben und die Ausfuehrung kontr. ! + +test42: ld ERRPAR_ID, #%A0 ! Parameter : r6 r7 ! + ld r0, r8 ! r0 := Test-Nr. ! + ld r1, #INT1 ! erster INT-Vektor ! + ld r2, #256 ! INT-Zaehler laden ! + ldl rr12, #INTTAB+4 ! Zeiger auf INT-Pointer 1 ! + +test43: + ! ISR-Pointer an aktuelle Position in die INT-Tabelle eintragen ! + + ld r6, #%8000 ! SEG-NR. des Quellbereichs ! + ld r7, #ISRP6 ! OFFSET ISR-Pointer ! + ld r4, #4 ! Laenge in Byte ! + ldl rr10, rr12 ! Zieladr. in der INT-Tabelle ! + calr MOVE6 + bit r8, #0 ! Fehler beim copieren ? ! + jr nz, test4end ! Wenn ja, JP ! + + clr REM_NVI ! Merker fuer NVI loeschen ! + ei nvi ! NVI erlauben ! + out CPU2PORT, r1 ! VINT an U80601 ! + calr time ! auf NVI vom U80601 warten ! + + ! Ueberpruefung ob U80601 seine ISR angesprungen hat ! + + calr getrc ! r6 := Returncode (rh6=INTV / rl6=Test-Nr.) ! + ldb rh0, rl1 ! rh0 := Soll-INT-Vektor ! + ld ERRPAR_ID, #0 ! keine Parameterausgabe ! + cpb rl6, #err43 !falsche ISR angesprungen?! + jr eq, test4end !ja! + cp r6, r0 ! Istwert = Sollwert ? ! + jr eq, test44 ! wenn o.k., jp ! + ld ERRPAR_ID, #%A0 ! r6=Soll, r7=Ist ! + ld r8, #err44 ! Fehlercode laden ! + ld r7,r6 ! Istwert laden ! + ld r6,r0 ! Sollwert laden ! + jr test4end + + ! Test ob U8000 NVI registriert hat ! + +test44: test REM_NVI ! NVI gespeichert ? ! + jr nz, test45 ! wenn ja, jp ! + ld r8, #err45 ! Fehlercode laden ! + jr test4end + +test45: + ! INT-Pointer in INT-Tabelle auf ISRERR zurueckstellen ! + + ld r6, #%8000 ! SEG-NR. des Quellbereichs ! + ld r7, #ISRERRP ! OFFSET ISRERR-Pointer ! + ld r4, #4 ! Laenge in Byte ! + ldl rr10, rr12 ! aktuelle Zieladr. in der INT-Tabelle ! + calr MOVE6 + bit r8, #0 ! Fehler beim copieren ? ! + jr nz, test4end ! Wenn ja, JP ! + + inc r13, #4 ! OFFSET des aktuellen ISR-Pointers erhoehen ! + and r13, #%3FF ! auf MODULO %400 bringen ! + incb rl1 ! naechster INT-Vektor ! + + djnz r2, test43 + +test4end: + di nvi ! U8000 NVI sperren ! + calr reset80601 + + ! Setzen des Z-Flag in Abhaenigkeit des Testergebnisses ! + + ld r3, r8 + and r3, #%F ! wenn Fehler, dann ZF=0 ! + + pop r1, @r15 + pop r0, @r15 + ret + +end test4 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test5 +Test 5 : U80601 traegt Muster in RAM, U8000 testet +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test5 PROCEDURE + entry + + call reset80601 ! RESET an U80601 ! + ld r8, #TESTNR5 ! Testnr. laden ! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + + + !Speicherbereich fuer U80601 loeschen! + + calr clrmem + + ! Code fuer U80601 laden ! + + ld r6, #%8000 ! SEG-Nr. Quelle ! + ld r7, #t5c86 ! OFFSET Quelle ! + ld r4, lt5c86 ! Laenge in Byte ! + ldl rr10, #RAMZIEL5 ! Zieladresse laden ! + calr MOVE6 ! U80601-Code in Zielbereich bringen ! + bit r8, #0 + jr nz, test5end ! wenn Fehler, JP ! + + !Datenfeld fuer U80601 laden! + + ld r6, #%8000 !Seg-Nr. Quelle! + ld r7, #MUSTER !Offset Quelle! + ld r4, #MUSTERLEN !Blocklaenge! + ldl rr10, #%FF000000 !Zieladresse Seg. 7F! + calr MOVE6 !Datenfeld in Zielbereich bringen! + bit r8, #0 !MOVE6-ERROR ?! + jr nz, test5end !ja! + + calr run80601 !U80601 starten! + + ld r12, #%B00 +test51: call time !1s warten! + djnz r12, test51 + + calr getrc ! r6 := U80601 returncode ! + cp r8,r6 ! Soll=Ist ? ! + jr eq,test52 ! wenn o.k., JP ! + + ld r8, #err52 ! U80601 laeuft nicht an ! + ld ERRPAR_ID, #%80 ! als Fehlerparameter nur r6 ! + jr test5end + +test52: calr reset80601 + +!Speicher testen! + + ld r10,#%8000 !Segmentnummer Quelle (Sollwerte)! + ld r6, #%F000 !Segmentnummer Ziel (Istwerte)! + ld r9, #15 !Anzahl der zu testenden Segmente! + !Segment 7F wird nicht getestet! + calr sp_test + +test5end: + + ! Setzen des Z-Flag in Abhaenigkeit des Testergebnisses ! + + ld r3, r8 + and r3, #%F ! wenn Fehler, dann ZF=0 ! + ret + +end test5 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE test6 +Test 6 : Test DPRC 8207 (gemeinsamer Speicherzugriff) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +test6 PROCEDURE + entry + + calr reset80601 ! RESET an U80601 ! + ld r8, #TESTNR6 ! Testnr. laden ! + xorb rh1, rh1 ! Flagbyte rh1 loeschen ! + call WR_TESTNR ! Ausgabe der Testschrittnummer ! + + calr clrmem !Speicherbereich fuer U80601 loeschen! + + ! Code fuer U80601 laden ! + + ld r6, #%8000 ! SEG-Nr. Quelle ! + ld r7, #t6c86 ! OFFSET Quelle ! + ld r4, lt6c86 ! Laenge in Byte ! + ldl rr10, #RAMZIEL6 ! Zieladresse laden ! + calr MOVE6 ! U80601-Code in Zielbereich bringen ! + bit r8, #0 + jr nz, test6end ! wenn Fehler, JP ! + + !Daten fuer U80601 laden! + + ld r6, #%8000 !Seg-Nr. Quelle! + ld r7, #MUSTER !Offset Quelle! + ld r4, #MUSTERLEN !Blocklaenge! + ldl rr10, #%FF000000 !Zieladresse Seg. 7F! + calr MOVE6 !Datenfeld in Zielbereich bringen! + bit r8, #0 + jr nz, test6end + + calr run80601 !U80601 starten! + + ! Speicher schreiben +beginnend mit SEG %70 OFFSET 0000 und endend mit SEG %7E werden 17 Bytes mit +Muster gefuellt und die naechsten 17 Bytes werden frei gelassen (werden vom +U80601 gefuellt) ! + + ld r6, #%8000 !Segmentnummer Quelle! + ld r10, #%F000 !Segmentnummer Ziel! + ld r9, #15 !Anzahl der zu testenden Segmente! + sc #SC_SEGV + +test61: ld r13, #MUPROSEG / 2 !Anzahl der zu schreibenden Bloecke pro + halb-SEG ! + ld r11, #%0000 !Offset Ziel! + +test62: ld r7, #MUSTER !Offset Quelle! + ld r12, #MUSTERLEN !Blocklaenge! + ldirb @r10, @r6, r12 !Speicher schreiben! + add r11, #MUSTERLEN !17 Byte freilassen fuer U80601! + djnz r13, test62 !Wiederholung! + + add r10, #%100 !naechstes Segment! + djnz r9, test61 + + sc #SC_NSEGV + calr reset80601 + +!Speicher testen! + + ld r10,#%8000 !Segmentnummer Quelle! + ld r6, #%F000 !Ziel-SEG = %70! + ld r9, #15 !Anzahl der zu testenden Segmente! + !Segment %7F wird nicht getestet! + calr sp_test + +test6end: + + ! Setzen des Z-Flag in Abhaenigkeit des Testergebnisses ! + + ld r3, r8 + and r3, #%F ! wenn Fehler, dann ZF=0 ! + ret + +end test6 + +!******************************************************************************* + + H i l f s p r o g r a m m e + +*******************************************************************************! + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE MOVE6 +transportiert Daten von Quelladresse zur Zieladresse +inputs: rr6 = Quelladresse + rr10 = Zieladresse + r4 = Datenlaenge in Bytes + +outputs: r4 = Datenwort EXRAM (Istwert) + r5 = Datenwort SEG 0 (Sollwert) + rr6 = Adresse Istwert + r8 = Testnummer / Fehlernummer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +MOVE6 PROCEDURE + + entry + + sc #SC_SEGV ! segmentierte Version ! + and r8, #%FFF0 !Fehlerbit ruecksetzten! + + dec r15, #16 + ldm @r14, r4, #8 ! Parameter retten ! + + ldirb @r10, @r6, r4 ! copy ! + + ldm r4, @r14, #8 + inc r15, #16 !Parameter rueckladen! + + cpsirb @r10, @r6, r4, ne ! Vergleich bis Ungleichheit ! + jr nz, MOVE6_END ! JP wenn kein Fehler ! + + dec r11 ! Adressen zurueckstellen ! + dec r7 + ldb rl5, @r6 ! Sollwert laden ! + ldb rl4, @r10 ! Fehlerbyte laden ! + sc #SC_NSEGV + add r8, #errx1 ! Transferfehler setzen ! + ld ERRPAR_ID, #%E5 ! r6=SEG, r7=off, r5=Soll, r4=Ist ! + ldl rr6, rr10 ! Fehleradresse umladen ! + +MOVE6_END: + sc #SC_NSEGV + ret + +end MOVE6 + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE clrmem + U80601-RAM loeschen ( 16 Segmente) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +GLOBAL +clrmem PROCEDURE + entry + + ldl rr10, #%F0000002 ! 1. Zieladresse ! + ld r5, #16 ! Anzahl der SEGMENTE ! + sc #SC_SEGV +clrmem1: + ldl rr6, #%F0000000 !Startadresse Segment 70! + ld r11, #0 + ld @r6, #0 ! erstes Wort loeschen ! + ld r2, #%8000 ! Zaehler fuer Worte pro SEG ! + ldir @r10,@r6,r2 !Speicher-SEG fuellen! + add r10, #%0100 !naechstes Segment! + djnz r5, clrmem1 + + sc #SC_NSEGV + ret + +end clrmem + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE sp_test +WDOS-Erweiterungs-DRAM testen +inputs: r10 = SEG-Nr. Sollwerte + r6 = SEG-Nr. Istwerte + r9 = Anzahl der zu testenden Segmente + rl8 = Testnummer + +output: rll8 = Fehlerstatus (0: kein Fehler) + rr10 = Adr. Sollbyte + rr6 = Adr. Fehlerhaftes Byte + rl5 = Sollwert + rl4 = Istwert + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +sp_test PROCEDURE + entry + + sc #SC_SEGV +sp_t0: ld r13,#MUPROSEG !Anzahl der zu testenden Bloecke! + ld r7, #0000 !Offset Ziel! + +sp_t1: ld r11, #MUSTER !Offset Quelle! + ld r12, #MUSTERLEN !Muster-Blocklaenge! + cpsirb @r6, @r10, r12, ne !ein Muster-Block testen! + jr z, sp_tf1 !Fehler im Block! + djnz r13, sp_t1 !naechster Block! + + cpb rh6, @r6 ! Segmentnummer testen! + jr eq, sp_t5 !Test beendet, kein Fehler! + ldb rl4, @r6 ! fehlerhafte SEG-Nr. laden ! + ldb rl5, rh6 ! Soll-SEG-Nr. laden ! + sc #SC_NSEGV + ld ERRPAR_ID, #%E5 !r6=SEG-Nr., r7=off, rl5=Soll, rl4=Ist! + or r8, #errx3 !Fehlercode fuer falsche SEG-Nr. setzen! + jr sp_tend + +sp_tf1: dec r11 ! offset adr. Sollbyte ! + dec r7 ! offset Fehleradr. ! + ldb rl5, @r10 ! Sollwert holen ! + ldb rl4, @r6 ! Istwert holen ! + sc #SC_NSEGV ! Fehlerbehandlung bei Musterfehler ! + ld ERRPAR_ID, #%E5 !r6=SEG-Nr., r7=off, rl5=Soll, rl4=Ist ! + or r8, #errx4 !Fehlercode fuer Fehler im Daten-Muster! + jr sp_tend + +sp_t5: incb rh6 !naechstes Segment! + djnz r9, sp_t0 + sc #SC_NSEGV +sp_tend: + ret + +end sp_test + + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE reset80601 +U80601 RESET ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +reset80601 PROCEDURE + entry + + push @r15,r3 + ld r3, #RESET + out CPU2PORT,r3 + pop r3,@r15 + ret + +end reset80601 + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE run80601 +Start U80601 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +run80601 PROCEDURE + entry + + push @r15,r3 + ld r3, #RUN + out CPU2PORT,r3 + pop r3,@r15 + ret + +end run80601 + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE time +Zeitschleife fuer U8000 (1 ms) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +time procedure + entry + + push @r15,r3 + ld r3, #364 ! Zeitkonstante fuer 1ms ! +time1l: djnz r3,time1l + pop r3,@r15 + ret + +end time + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PROCEDURE getrc +U80601-returncode abholen und in r6 uebergeben ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +getrc procedure + entry + + push @r15,r10 + push @r15,r11 + + sc #SC_SEGV + ldl rr10, #RETCODE ! Returncode-Adresse laden ! + ld r6,@r10 ! Returncode holen ! + sc #SC_NSEGV + + pop r11,@r15 + pop r10,@r15 + ret + +end getrc + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +NVI-Service-Routiene ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL +NVISR6 procedure + entry + + ld REM_NVI, #%FF ! NVI-Merker setzen ! + sc #SC_SEGV ! SEG-Version fuer iret ! + iret + +end NVISR6 + + +!******************************************************************************* +U80601-PROZEDUREN +*******************************************************************************! + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +U80601-Code fuer Test 3 (Anlauftest) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + GLOBAL + +t3c86 array [2 word] := [%8CC8 %8ED8] + array [4 byte] := [%B8 %00 TESTNR3 %A3] + array [4 word] := [%FCFF %F400 %0000 %0000] +lt3c86 word := $-t3c86 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +U80601-Code fuer Test 4 (INT-Test) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +t4c86 array [* word] := [%8CC8 %8ED8 %8ED0 %BCD0 %FFFB %B800] + array [* byte] := [TESTNR4 %A3 %FC %FF] + array [* word] := [%F4E9 %FCFF %BCD0 %FFFE %06FC %FF33 %D2EF %FBF4] + array [* word] := [%EBDE] + array [* byte] := [%B0 err43] + array [* word] := [%A2FD %FFEB %EB00 %0000 %0000 %0000] +lt4c86 word := $-t4c86 + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +U80601-Code fuer Test 5 (SpeicherTESTNR) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +t5c86 array [*byte] := [%8C %C8 %8E %D0 %8E %D8] + array [*byte] := [%BC %00 %FF %B8 %00 %00] + + array [*byte] := [%8E %C0 %B8 %0F %0F %FC %BF %00 %00] + array [*byte] := [%BE %00 %00 %B9 %11 %00 %F3 %A4] + + array [*byte] := [%48 %3D %00 %00 %75 %F2 %8C %C0] + array [*byte] := [%B1 %04 %D3 %E8 %05 %00 %F0] + + array [*byte] := [%26 %88 %25 %8C %C0 %05 %00 %10 %8E %C0 %3D] + + array [*byte] := [%00 %F0 %75 %D3 %B8 %00 TESTNR5 %A3] + array [*byte] := [%FC %FF %F4 %EB %FD %EB %BA %00] + + array [*byte] := [%00 %00 %00 %00 %00 %00 %00 %00] + array [*byte] := [%00 %00 %00 %00 %00] +lt5c86 word := $-t5c86 + +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +U80601-Code fuer Test 6 (gemeinsamer Speicherzugriff) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + +t6c86 array [*byte] := [%8C %C8 %8E %D0 %8E] + array [*byte] := [%D8 %BC %00 %FF %B8 %00 %00 %8E] + + array [*byte] := [%C0 %B8 %87 %07 %FC %BF %11 %00] + array [*byte] := [%BE %00 %00 %B9 %11 %00 %F3 %A4] + + array [*byte] := [%81 %C7 %11 %00 %48 %3D %00 %00] + array [*byte] := [%75 %EE %8C %C0 %B1 %04 %D3 %C8] + array [*byte] := [%05 %00 %F0 %26 %88 %25 %8C %C0 %05 %00] + + array [*byte] := [%10 %8E %C0 %3D %00 %F0 %75 %CF] + array [*byte] := [%B8 %00 TESTNR6 %A3 %FC %FF %F4 %EB] + + array [*byte] := [%FD %EB %B6 %00 %00 %00 %00 %00] + array [*byte] := [%00 %00 %00 %00 %00 %00 %00 %00] + + array [*byte] := [%00] +lt6c86 word := $-t6c86 + +end twem + diff --git a/WEGA/src/cmd/standalone/sa.diags/wdc.s b/WEGA/src/cmd/standalone/sa.diags/wdc.s new file mode 100644 index 0000000..f2ff1e7 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.diags/wdc.s @@ -0,0 +1,281 @@ +!******************************************************************* +******************************************************************** + +P8000-Firmware (c) ZFT/KEAW Abt. Basissoftware - 1988 +U8000-Stand alone software Modul: hd + +Bearbeiter: F.Spielmann +Datum: 1988 +Version: 3.0 + +******************************************************************** +*******************************************************************! + +hd module + +$nonsegmented + +constant + +!Port-Adressen! + PIOAD := %FFA1 + PIOBD := %FFA3 + PIOAC := %FFA5 + PIOBC := %FFA7 + +!PIO-Programmierung! + OUTPUT := %0F + INPUT := %4F + BITMODE := %CF + INTVEC := %18 + +! Anschlussbelegung des Controlers am PIO des 16-Bit-Teils + Port A : 8 Bit bidirektionale Daten (D0 bis D7) + Port B : Steuerport + Bit0 : /ST0 (Statusbit 0) + Bit1 : /ST1 (Statusbit 1) + Bit2 : /ST2 (Statusbit 2) + Bit3 : frei Ausgang + Bit4 : frei Ausgang + Bit5 : RESET (WDC-Reset) Ausgang + Bit6 : TE (Richtung) Ausgang + Bit7 : TR (Anforderung) Eingang +! +! Steuerport WDC ! + RDATA := %4000 + WDATA := %00 + +! Uebergabe der Parameter an den Host-Treiber + rh7 : Kommandocode + rl7 : Laufwerksnummer + r6 : Zylindernummer + rh5 : Kopfnummer + rl5 : Sektornummer + r4 : Datenlaenge + r3 : Host-Datenadresse + Uebergabe der Parameter byteweise (9 Byte) an den WDC-Controler: + -- Kommandocode + -- Laufwerksnummer + -- Zyl (low/rl6) + -- Zyl (high/rh6) + -- Kopf + -- Sektor + -- Datenlaenge (rl4) + -- Datenlaenge (rh4) + -- Pruefsumme (wird nicht ausgewertet) +! + + global +wdc procedure + entry + +! Initialisierung des PIO ! +! und RESET an den WDC ! + calr disk_in + +! PIO-Programmierung Host-->WDC ! + ld r0,#WDATA+OUTPUT + outb PIOBD,rh0 + outb PIOAC,rl0 + +! Loeschen Fehlerregister ! + ldk r2,#0 +! Warten auf WDC-Bereitschaft ! +w_st1: + inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#0 + jp z,stat7 + cpb rl0,#%1 !Status 6: PROM-Fehler! + jp z,err_20 + cpb rl0,#6 + jr nz,w_st1 +! Ausgabe der neun Kommandobytes an den WDC ! + outb PIOAD,rh7 !Kommandocode! + outb PIOAD,rl7 !Laufwerk! + outb PIOAD,rl6 !Zylinder low! + outb PIOAD,rh6 !Zylinder high! + outb PIOAD,rh5 !Head! + outb PIOAD,rl5 !Sektor-Nr. ! + outb PIOAD,rl4 !Sektorlaenge low ! + outb PIOAD,rh4 !Sektorlaenge high ! + outb PIOAD,rh3 +! Warten auf Status=0 ! +w_st2: inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#%7 + jr nz,w_st2 +! Warten auf Ergebnis-Status ! +w_st3: inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#%7 + jr z,w_st3 + inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#0 + jp z,stat7 + cpb rl0,#6 + jp z,stat1 + cpb rl0,#5 + jp z,stat2 + cpb rl0,#4 + jp z,stat3 + jp err_0 +!*******************************************! +! Auswertung Status=1 ! +!*******************************************! +stat1: + cpb rh7,#%41 + jp z,h_ret + cpb rh7,#%c2 + jp z,h_ret + cpb rh7,#%48 + jp z,h_ret + bitb rh7,#2 + jp z,err_1 + jp h_ret + +!*******************************************! +! Auswertung Status=2 ! +!*******************************************! +stat2: + cpb rh7,#%18 + jp z,wdc_wt + cpb rh7,#%68 !Schreiben BTT aus Host! + jp z,wdc_wt + bitb rh7,#1 !Schreibkommandos! + jp z,err_2 +wdc_wt: + ld r1,#PIOAD + otirb @r1,@r3,r4 +! Warten auf Status=0 ! +w_st4: + inb rl0,PIOBD + andb rl0,#7 + cpb rl0,#7 + jr nz,w_st4 +! Warten auf Ergebnis-Status ! +w_st5: + inb rl0,PIOBD + andb rl0,#7 + cpb rl0,#7 + jr z,w_st5 + inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#0 + jp z,stat7 + cpb rl0,#6 + jp z,h_ret + jp err_5 + +!*******************************************! +! Auswertung Status=3 ! +!*******************************************! +stat3: + cpb rh7,#%0 !Ready-Test! + jp z,wdc_rd + cpb rh7,#%08 !Lesen WDC-RAM! + jp z,wdc_rd + cpb rh7,#%28 !Lesen WDC-Parameterblock! + jp z,wdc_rd + cpb rh7,#%38 !Lesen WDC-Fehlerstatistik! + jp z,wdc_rd + cpb rh7,#%58 + jp z,wdc_rd + cpb rh7,#%24 !Formatieren mit Defektspurtabelle! + jp z,wdc_rd + bitb rh7,#0 !HD-Lesekommandos! + jp z,err_3 +! PIO-Umprogrammierung ! +wdc_rd: + ld r0,#RDATA+INPUT + outb PIOAC,rl0 + outb PIOBD,rh0 + inb rl0,PIOAD !Scheineingabe! +! Uebernahme der Bytes ! + ld r1,#PIOAD + inirb @r3,@r1,r4 + cpb rh7,#%24 !Formatieren mit Defektspur?! + jp nz,w_stat + ld r2,#%21 + jp w_stat + +!*******************************************! +! Auswertung Status=7 ! +!*******************************************! +stat7: +! PIO-Umprogrammierung ! + ld r0,#RDATA+INPUT + outb PIOAC,rl0 + outb PIOBD,rh0 + inb rl0,PIOAD !Scheineingabe! +! Uebernahme des Fehlerbytes! + inb rl2,PIOAD + +w_stat: +! Warten auf Ergebnis-Status ! + inb rl0,PIOBD + andb rl0,#7 + cpb rl0,#7 + jr nz,w_stat +w_stat1: + inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#%7 + jr z,w_stat1 + inb rl0,PIOBD + andb rl0,#%7 + cpb rl0,#6 + jp nz,err_4 +h_ret: + ret + +! Fehlerbehandlung ! +err_0: + ldb rl2,#%c0 + jr err_rt +err_1: + ldb rl2,#%c1 + jr err_rt +err_2: + ldb rl2,#%c2 + jr err_rt +err_3: + ldb rl2,#%c3 + jr err_rt +err_4: + ldb rl2,#%c4 + jr err_rt +err_5: + ldb rl2,#%c5 + jr err_rt +err_20: ldb rl2,#%20 +err_rt: + jp h_ret +end wdc + + internal +! Initialisierung des PIO und des WDC ! + init array [* byte] := [ + PIOBC, INTVEC, + PIOBD, WDATA, + PIOBC, BITMODE, + PIOBC, %87, + ] + +disk_in procedure + entry + ld r2,#PIOBD + inb rl1,@r2 + bitb rl1,#5 !Reset weggenommen ?! + ret z + lda r1,init + ldk r0,#4 !Anzahl der Ausgaben! +iloop: ldb rl2,@r1 !Portadresse! + inc r1,#1 + outib @r2,@r1,r0 + jr nov,iloop + ret +end disk_in +end hd +