standalone import
This commit is contained in:
parent
476ca4c2d4
commit
b2075be9e7
|
|
@ -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
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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<CR> 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<CR> 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<CR> 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*/
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||||
|
|
||||||
Loading…
Reference in New Issue