P8000/firmware/MON16/p.init.s

1532 lines
44 KiB
ArmAsm

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