288 lines
10 KiB
ArmAsm
288 lines
10 KiB
ArmAsm
!******************************************************************************
|
|
*******************************************************************************
|
|
|
|
P8000-Firmware (C) ZFT/KEAW Abt. Basissoftware - 1989
|
|
U8000-Softwaremonitor (MON16) Modul: p_ram
|
|
|
|
Bearbeiter: J. Zabel
|
|
Datum: 14.04.1989
|
|
Version: 3.1
|
|
|
|
*******************************************************************************
|
|
******************************************************************************!
|
|
|
|
|
|
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!
|
|
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 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!
|
|
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!
|
|
|
|
ARRAY [%34 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
|