; ###################################################################################################
; DAI-DOS 1541  -  complete annotated disassembly of the X-bus EPROM card "NR 1.85" (2764, 8 KB)
; ###################################################################################################
; Product   DAI-DOS 1541, operating system for VC1541 disk drive, Memocom digital recorder (MDCR/DCR),
;           parallel printer and High Speed Data Loader. Software Jan Boerrigter and Hein Kop, hardware
;           Henk Rison and Peter Wiegers; manual Rev. 1.0, (C) January 1985, update sheet 08.07.1985.
;           No version or copyright string is present in the EPROM itself.
; Source    8192 bytes read from the card on Christophe's DAI (2026-10-13) through BASIC PEEK, every byte
;           read at least twice with identical results. The full image is at the end of this file.
; Method    Code-following disassembly from every documented entry point, jump table, command table and
;           vector table; all bytes not reached as code are shown as data. Coverage: every byte is either
;           code, a table/text/vector image, or 00/FF fill.
;
; NAMES     Each label carries its source:
;             [M] DAI-DOS 1541 user's manual (entry points chapter 9, DOS RAM map)
;             [D] Memocom DTOS/MTOS V1.2 commented listing (DTOS.txt); bank 2 and parts of bank 0 are MTOS code
;             [F] DAI firmware V1.1 listing (ROM labels, routine titles, RST function codes, RAM vectors)
;             [C] name given in this listing where no source names the routine
;           Calls into the DAI ROM are commented with the firmware label and routine title, e.g.
;           "EXIT (...)" for C14D or "PMSGR (PRINT MESSAGE POINTED TO BY NEXT 2 BYTES)" for DAFF.
;           Addresses E000-EFFF are banked in the DAI ROM; the firmware bank used is given (e.g. ROM bank 3).
;
; CARD      X-bus card, 5 TTL chips (74LS20, 74LS00, 74LS138, 74LS173), 2764 EPROM, 6116 RAM.
;             F000-F7FF  2 KB window into the EPROM, bank 0-3 selected by U5 (74LS173)
;             F900-F9FF  EPROM 1900-19FF, always visible (bank lines pulled high when U5 outputs are off)
;             FA00-FAFF  6116 RAM (256 bytes used): DOS variables, see manual RAM map
;             FFxx write (A0=0, A1=A3=A4=1, e.g. FFFE) = BNKSL: D1-D0 select the F-bank; reset selects bank 0
;           The DCE-bus 8255 on the mainboard (FE00 PA, FE01 PB, FE02 PC, FE03 control) drives all devices;
;           PB carries the device address: 20h IEC interface (VC1541), 40h printer, 1xh HSL, x3h DCR x.
;
; BANK CALL A routine in bank 0 calls bank n with  CALL CALLBn ; DB slot.  The slot is the offset in the
;           jump table at F000 of bank n. The thunk (bank 0 F7B7-F7FF) switches the bank; the bytes at
;           F7F8-F7FF are identical in banks 0, 1 and 2 so execution continues across the switch. Return
;           goes through F7E7 of the called bank, which selects bank 0 again. See the header at CALLB1.
;
; INLINE    Several calls are followed by parameter bytes, shown as DB/DW after the call:
;             RST 1 / RST 4 / RST 5 + 1 byte    DAI firmware function code (utility / maths / screen)
;             CALL DAFF (PMSGR) + 2 bytes        pointer to a message
;             CALL CALLB1..CALLB4 + 1 byte       slot number in the target bank (bank 0 only)
;           Message bytes >= 80h are references to sub-messages (ROM PMSG): C0-FF xx -> string at C0xx-FFxx,
;           80-BF xx -> length-prefixed string at (byte+40h)xx. The decoded text is shown in the comment.
;
; ERRORS    DOS error codes (A at DOSERR F938, message table ERRTAB):
;             0 END OF TAPE            4 FDD NOT AVAILABLE
;             1 DCR DOOR OPEN          5 OUT OF TIME ERROR
;             2 EPROM OR HSL NOT AVAILABLE   6 (drive error, message already shown from channel 15)
;             3 FILE TYPE MISMATCH     7 DEVICE MISMATCH
;           Error 17h at F910 is the ROM's SYNTAX ERROR.
;
; LAYOUT    1. F900 page   2. bank 0   3. bank 1   4. bank 2   5. bank 3   6. label index
;           7. DAI firmware routines called   8. EPROM image (Intel HEX) for programming
;
; Column layout: address, bytes, instruction, comment. Labels on their own line with [source] and
; description; "<-" lines list the addresses that jump or call there (n:xxxx = address in bank n,
; TABCMD = command table, "vector 02xx" = RAM vector image).
;
; EPROM image SHA-256 7941cfbaa1c95613e55398838c6117a9603916c692811a2955636f45d530ab15

;===================================================================================================
; F900 PAGE  (EPROM 1900-19FF, read at F900-F9FF whatever bank is selected)
; Code that must survive a bank switch: return to bank 0, keyboard interrupt hook, error exits,
; program loaders and helpers shared by all banks. Calls into F000-F7FF from here run in the bank
; that is selected at that moment.
;===================================================================================================

ABORT:                               ; [C] select bank 0; restore SP from RSP and return with CY (error 2); RSP=0 -> BASIC restart C80C
                                      ; <- F96B 2:F3CF
F900  CD 1A F9  CALL 0F91AH         ; DEFBNK
F903  2A 99 02  LHLD 0299H          ; RSP: rescued stack pointer [M][D]
F906  7C        MOV A,H
F907  B7        ORA A
F908  CA 0C C8  JZ 0C80CH           ; RSTART (START FROM SCRATCH)
F90B  F9        SPHL
F90C  3E 02     MVI A,02H
F90E  37        STC
F90F  C9        RET

ESYNTX:                              ; [C] select bank 0, SYNTAX ERROR (ROM error 17h)
                                      ; <- 1:F34A 1:F36D 2:F046 2:F5AE 2:F6EA 2:F765
F910  3E 17     MVI A,17H
F912  F5        PUSH PSW
F913  CD 1A F9  CALL 0F91AH         ; DEFBNK
F916  F1        POP PSW
F917  C3 F5 D9  JMP 0D9F5H          ; ERROR: report error A

DEFBNK:                              ; [M] force bank switch back to default (bank 0), re-enable DOS input hook [manual: CALLM #F91A]
                                      ; <- F900 F913 F938 F947 F9A1 F9BF
F91A  F5        PUSH PSW
F91B  E5        PUSH H
F91C  21 54 F0  LXI H,0F054H        ; DINC -> DINKBD (F054)
F91F  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F922  21 96 02  LXI H,0296H         ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F925  3E 02     MVI A,02H           ; INSW bit 1: DOS commands on
F927  B6        ORA M
F928  77        MOV M,A
F929  E1        POP H
F92A  AF        XRA A
F92B  32 35 01  STA 0135H           ; EFSW: 1 = input from string/edit buffer [F][D]
F92E  32 02 FA  STA 0FA02H          ; MEMBNK = 0  [MEMBNK: selected F-bank [M]]
F931  32 FE FF  STA 0FFFEH          ; BNKSL = 0: bank 0  [BNKSL: F-bank select 0-3 (card latch U5) [M]]
F934  F1        POP PSW
F935  C9        RET

EDEVMM:                              ; [C] error 7 DEVICE MISMATCH
                                      ; <- 1:F0BF 2:F34E
F936  3E 07     MVI A,07H

DOSERR:                              ; [C] select bank 0 and report DOS error A (F740)
                                      ; <- 1:F26C 1:F278 1:F27C 1:F46A 1:F477 2:F0AC 2:F336
F938  CD 1A F9  CALL 0F91AH         ; DEFBNK
F93B  C3 40 F7  JMP 0F740H          ; (bank-dependent: B0 DOSERM)

KBINT:                               ; [C] keyboard interrupt (RST 6 vector 006E): key 1Fh -> back to bank 0, then ROM handler D579
F93E  F5        PUSH PSW
F93F  3A C4 02  LDA 02C4H           ; key code in BREAK pointer  [BREAK pointer [F]]
F942  FE 1F     CPI 1FH             ; 1Fh?
F944  C2 79 D5  JNZ 0D579H          ; KBINT+1: keyboard interrupt service (RST 6) after its PUSH PSW
F947  CD 1A F9  CALL 0F91AH         ; yes: back to bank 0 first  [DEFBNK]
F94A  C3 79 D5  JMP 0D579H          ; KBINT+1: keyboard interrupt service (RST 6) after its PUSH PSW

ERRCOD:                              ; [C] store error code A+1 into (ERRCO) = MTOS F27F
                                      ; <- 2:F274 2:F2E8
F94D  3C        INR A

ERRCOD0:                             ; [C] store error code A into (ERRCO)
                                      ; <- 1:F689 2:F25F 2:F6D2
F94E  E5        PUSH H
F94F  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F952  77        MOV M,A
F953  E1        POP H
F954  C9        RET

ERRDEST:                             ; [D] test whether errors are to be reported (Z = report) = MTOS F30F
                                      ; <- 2:F26D 2:F2DD 2:F331
F955  E5        PUSH H
F956  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F959  7C        MOV A,H
F95A  B5        ORA L
F95B  CA 63 F9  JZ 0F963H
F95E  2A 00 01  LHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F961  7C        MOV A,H
F962  B5        ORA L
LF963:
                                      ; <- F95B
F963  E1        POP H
F964  C9        RET

WAITK:                               ; [C] wait for key (ROM D6DA); BREAK -> ABORT
                                      ; <- 2:F10B
F965  CD DA D6  CALL 0D6DAH         ; WSPACE (WAIT FOR SPACEBAR)
F968  D2 5E DD  JNC 0DD5EH          ; CRLF: print CR
F96B  C3 00 F9  JMP 0F900H          ; ABORT

SIGNON:                              ; [C] sign-on: copy of DAI RESET C73C-C76C with title print replaced by CALL F7E1 (bank banner)
                                      ; <- 1:F7DD 2:F7DD
F96E  D5        PUSH D
F96F  CD FB C7  CALL 0C7FBH         ; check RAM (ROM C7FB)  [MEMCHK: check available RAM (RESET)]
F972  2B        DCX H
F973  11 E0 C7  LXI D,0C7E0H        ; SIPAR
F976  EF        RST 5               ; RST 5 (screen) fn 00h: Init. screen RAM
F977  00        DB 00H              ; inline function code
F978  CD E1 F7  CALL 0F7E1H         ; print banner of the bank that called (F7E1 in bank 1 or 2)  [(bank-dependent: B1 PRBAN1, B2 PRBAN2)]
F97B  2A A5 02  LHLD 02A5H          ; bottom of screen RAM [F]
F97E  11 7B 09  LXI D,097BH
F981  19        DAD D
F982  36 5F     MVI M,5FH
F984  11 D0 FF  LXI D,0FFD0H
F987  19        DAD D
F988  CD F9 CE  CALL 0CEF9H         ; MPT03 (PRINT 'COMPUTER' UNDER 'DAI PERSONAL')
F98B  16 0F     MVI D,0FH
LF98D:
                                      ; <- F991
F98D  CD CF CE  CALL 0CECFH         ; MPT04 (RE-ORGANISE SCREEN AFTER 'DAI-PC')
F990  15        DCR D
F991  C2 8D F9  JNZ 0F98DH
F994  D1        POP D
F995  C9        RET

GETKEY:                              ; [C] wait until a key is pressed (ROM D6BB)
                                      ; <- F999 F99C 1:F6D5
F996  CD BB D6  CALL 0D6BBH         ; FGETC (INPUT SCANNING)
F999  DA 96 F9  JC 0F996H           ; GETKEY
F99C  CA 96 F9  JZ 0F996H           ; GETKEY
F99F  B7        ORA A
F9A0  C9        RET

LOADB:                               ; [C] RNEW, then LOAD the BASIC program named in FILBUF, run it
                                      ; <- 1:F773
F9A1  CD 1A F9  CALL 0F91AH         ; DEFBNK
F9A4  CD E4 CE  CALL 0CEE4H         ; SELB0 (SELECT ROM BANK 0; PRINT MESSAGE)
F9A7  00        NOP
F9A8  00        NOP
F9A9  CD B8 DE  CALL 0DEB8H         ; RNEW: clear program (NEW)
F9AC  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]

LOADBN:                              ; [C] LOADB with name pointer in HL
                                      ; <- 0:F4B0
F9AF  01 00 30  LXI B,3000H
F9B2  CD BB F9  CALL 0F9BBH
F9B5  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F9B8  C3 10 C9  JMP 0C910H          ; RSTART part: reset SP to F900, run BASIC
LF9BB:
                                      ; <- F9B2
F9BB  C5        PUSH B
F9BC  C3 8A D2  JMP 0D28AH          ; RUN LOAD: open via ROPEN (02CE) and load program

LOADU:                               ; [C] load UTILITY (type 31h) file named in FILBUF through ROPEN/RBLK/RCLOSE, limit F900
                                      ; <- 1:F77B
F9BF  CD 1A F9  CALL 0F91AH         ; DEFBNK
F9C2  3E FF     MVI A,0FFH
F9C4  32 18 01  STA 0118H           ; RUNF: flag running program [F][D]
F9C7  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F9CA  CD D3 F9  CALL 0F9D3H         ; LOADO
F9CD  AF        XRA A
F9CE  32 B9 02  STA 02B9H           ; KNSCAN / BREAK scan pointer [F]
F9D1  CF        RST 1               ; RST 1 (bank 3 utility) fn 09h: Go to utility
F9D2  09        DB 09H              ; inline function code

LOADO:                               ; [C] load object file (name at HL) via UTILITY R command
                                      ; <- F9CA 0:F49F
F9D3  01 00 31  LXI B,3100H
F9D6  CD CE 02  CALL 02CEH          ; vector ROPEN [F]
F9D9  21 0B FA  LXI H,0FA0BH        ; UTST: start of UTILITY program from directory [M]
F9DC  11 0D FA  LXI D,0FA0DH        ; MEMCUR: saved cursor [M]
F9DF  CD D1 02  CALL 02D1H          ; vector RBLK [F]
F9E2  21 00 F9  LXI H,0F900H        ; ABORT
F9E5  EB        XCHG
F9E6  2A 0B FA  LHLD 0FA0BH         ; UTST: start of UTILITY program from directory [M]
F9E9  DC D1 02  CC 02D1H            ; vector RBLK [F]
F9EC  CD D4 02  CALL 02D4H          ; vector RCLOSE [F]
F9EF  D2 A8 D2  JNC 0D2A8H          ; RLERR (RUN LOADING ERROR)
F9F2  C9        RET

MODE98:                              ; [C] 8255 mode 98h (PA in, PB out, PC low out, PC high in)
                                      ; <- 0:F536 1:F0C2 2:F051
F9F3  3E 98     MVI A,98H
F9F5  32 03 FE  STA 0FE03H          ; 8255 control = 98h  [8255 control (mode / bit set-reset) [F]]
F9F8  32 61 00  STA 0061H           ; and its RAM copy  [copy of the 8255 (GIC) control word [F]]
F9FB  C9        RET
F9FC  FF x4     DS 4                ; unused (FF)

;===================================================================================================
; BANK 0  (EPROM 0000-07FF, CPU F000-F7FF)  -  DOS core
; Command interpreter and command table, keyboard hook, parallel printer driver, CAS commands,
; /x short commands, BOOT/UBL, error reporting, and the slot stubs + THUNK that reach banks 1 and 2.
; Derived from Memocom DTOS: REMS, DINKBD, RCMD, ONERR, NONERR come from MTOS [D].
;===================================================================================================

JTAB0:                               ; [M] UTILITY entry points (manual chapter 9); same layout as MTOS/DTOS [D]
F000  C3 21 F0  JMP 0F021H          ; REMS
F003  C3 7E F3  JMP 0F37EH          ; ONERR
F006  C3 87 F3  JMP 0F387H          ; NONERR
F009  C3 6D F2  JMP 0F26DH          ; X2OPEN
F00C  C3 72 F2  JMP 0F272H          ; X2DCR0
F00F  C3 90 F3  JMP 0F390H          ; CAS1
F012  C3 7C F2  JMP 0F27CH          ; X2REW
F015  C3 81 F2  JMP 0F281H          ; X2SKIP
F018  C3 86 F2  JMP 0F286H          ; X2VER
F01B  C3 8B F2  JMP 0F28BH          ; X2LAST
F01E  C3 90 F2  JMP 0F290H          ; X2LOOK

REMS:                                ; [D] CALLM #F000: REM <command> - run DOS commands from a BASIC REM statement
                                      ; <- F000
F021  F5        PUSH PSW
F022  C5        PUSH B
F023  D5        PUSH D
F024  E5        PUSH H
F025  21 0A 00  LXI H,000AH
F028  39        DAD SP
F029  22 99 02  SHLD 0299H          ; RSP: rescued stack pointer [M][D]
F02C  0A        LDAX B
F02D  FE A9     CPI 0A9H            ; REM token (A9h)?
F02F  C2 4D C1  JNZ 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET
F032  03        INX B
F033  0A        LDAX B
F034  3C        INR A
F035  32 34 01  STA 0134H           ; EFECT: character count [F][D]
F038  60        MOV H,B
F039  69        MOV L,C
F03A  22 32 01  SHLD 0132H          ; EFEPT: pointer to encoded line [F][D]
F03D  3E 01     MVI A,01H
F03F  32 35 01  STA 0135H           ; EFSW: 1 = input from string/edit buffer [F][D]
F042  4F        MOV C,A
F043  CD D7 F0  CALL 0F0D7H         ; RCMD
F046  AF        XRA A
F047  32 35 01  STA 0135H           ; EFSW: 1 = input from string/edit buffer [F][D]
F04A  32 9A 02  STA 029AH           ; RSP+1
F04D  0D        DCR C
F04E  CA 0B DA  JZ 0DA0BH           ; C = 0: SYNTAX ERROR  [ERRSN: SYNTAX ERROR]
F051  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET

DINKBD:                              ; [D] keyboard input hook (DINC vector 02E0): auto line number, TAB = clear screen, CR = run line as DOS command
                                      ; <- vector 02E0 (bank 1) vector 02E0 (bank 2)
F054  E5        PUSH H
F055  21 17 01  LXI H,0117H         ; RDIPF: flag running input [F][D]
F058  7E        MOV A,M
F059  23        INX H
F05A  B6        ORA M
F05B  6F        MOV L,A
F05C  3A 31 01  LDA 0131H           ; only in direct mode without running input/program  [OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]]
F05F  E6 7E     ANI 7EH
F061  B5        ORA L
F062  E1        POP H
F063  C2 B0 F0  JNZ 0F0B0H          ; GETIN
F066  3A 90 FA  LDA 0FA90H          ; LNAUTO: auto line number on/off [M]
F069  B7        ORA A
F06A  CA 96 F0  JZ 0F096H           ; DINK20
F06D  E5        PUSH H
F06E  EF        RST 5               ; cursor position (RST 5 fn 0Ch)  [RST 5 (screen) fn 0Ch: Ask cursor position and size character screen]
F06F  0C        DB 0CH              ; inline function code
F070  2D        DCR L
F071  E1        POP H
F072  C2 96 F0  JNZ 0F096H          ; DINK20
F075  CD B0 F0  CALL 0F0B0H         ; GETIN
F078  F5        PUSH PSW
F079  FE 20     CPI 20H
F07B  C2 9A F0  JNZ 0F09AH
F07E  D5        PUSH D
F07F  E5        PUSH H
F080  2A 91 FA  LHLD 0FA91H         ; LNNUM: current line number [M]
F083  CD B4 EF  CALL 0EFB4H         ; print line number (ROM bank 0 SLN10)  [ROM bank 0 SLN10 (in: LIST A LINENUMBER)]
F086  2A 93 FA  LHLD 0FA93H         ; LNSTEP: line-number step [M]
F089  EB        XCHG
F08A  2A 91 FA  LHLD 0FA91H         ; LNNUM: current line number [M]
F08D  19        DAD D
F08E  22 91 FA  SHLD 0FA91H         ; LNNUM: current line number [M]
F091  E1        POP H
F092  D1        POP D
F093  C3 AE F0  JMP 0F0AEH

DINK20:                              ; [C]
                                      ; <- F06A F072
F096  CD B0 F0  CALL 0F0B0H         ; GETIN
F099  F5        PUSH PSW
LF09A:
                                      ; <- F07B
F09A  FE 0D     CPI 0DH
F09C  CA BB F0  JZ 0F0BBH           ; DOSLIN
F09F  FE 09     CPI 09H             ; TAB?
F0A1  C2 AE F0  JNZ 0F0AEH
F0A4  3E 0C     MVI A,0CH
F0A6  CD 95 D6  CALL 0D695H         ; TAB: clear screen  [MPT31 (OUTPUT ONE CHARACTER)]
F0A9  3E 2A     MVI A,2AH
F0AB  CD 95 D6  CALL 0D695H         ; MPT31 (OUTPUT ONE CHARACTER)
LF0AE:
                                      ; <- F093 F0A1
F0AE  F1        POP PSW
F0AF  C9        RET

GETIN:                               ; [C] fetch a character from keyboard (IN0) or user DINC per INSW bit 0
                                      ; <- F063 F075 F096
F0B0  3A 96 02  LDA 0296H           ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F0B3  E6 01     ANI 01H
F0B5  CA E2 D1  JZ 0D1E2H           ; INSW bit 0 = 0: keyboard  [IN0: check keyboard for new input]
F0B8  C3 E3 02  JMP 02E3H           ; saved original DINC (JMP) [D]

DOSLIN:                              ; [C] CR typed: run the typed line through RCMD, then back to the BASIC editor
                                      ; <- F09C
F0BB  35        DCR M
F0BC  F1        POP PSW
F0BD  21 8F C8  LXI H,0C88FH        ; ENDCOM
F0C0  E3        XTHL
F0C1  21 00 00  LXI H,0000H
F0C4  39        DAD SP
F0C5  22 99 02  SHLD 0299H          ; RSP: rescued stack pointer [M][D]
F0C8  0E 01     MVI C,01H
F0CA  D5        PUSH D
F0CB  CD D7 F0  CALL 0F0D7H         ; RCMD
F0CE  D1        POP D
F0CF  E1        POP H
F0D0  AF        XRA A
F0D1  32 9A 02  STA 029AH           ; RSP+1
F0D4  C3 45 DD  JMP 0DD45H          ; EXIT1: POP H, POP PSW, CMC, RET

RCMD:                                ; [D] command interpreter: look up the word in TABPTR table (ROM LOOKC), follow table links, call handler
                                      ; <- F043 F0CB
F0D7  2A 97 02  LHLD 0297H          ; TABPTR: pointer to command table [M][D]
LF0DA:
                                      ; <- F0EB
F0DA  1E 01     MVI E,01H
F0DC  7C        MOV A,H
F0DD  B5        ORA L
F0DE  C8        RZ
F0DF  C5        PUSH B
F0E0  CD 34 CA  CALL 0CA34H         ; search word in table (ROM LOOKC)  [LOOKC (FIND STRING BASIC INSTRUCTION IN TABLE)]
F0E3  DA EE F0  JC 0F0EEH
F0E6  C1        POP B
F0E7  7E        MOV A,M             ; not found: follow link word to next table
F0E8  23        INX H
F0E9  66        MOV H,M
F0EA  6F        MOV L,A
F0EB  C3 DA F0  JMP 0F0DAH
LF0EE:
                                      ; <- F0E3
F0EE  5E        MOV E,M
F0EF  23        INX H
F0F0  56        MOV D,M
F0F1  CD FD F0  CALL 0F0FDH         ; GETARG
F0F4  79        MOV A,C
F0F5  C1        POP B
F0F6  4F        MOV C,A
F0F7  21 D7 F0  LXI H,0F0D7H        ; handler returns to RCMD for the next command on the line
F0FA  E5        PUSH H
F0FB  EB        XCHG
F0FC  E9        PCHL

GETARG:                              ; [C] parse command operand: digit -> FILES, "text" or string variable -> FILBUF
                                      ; <- F0F1
F0FD  21 21 FA  LXI H,0FA21H        ; FILBUF+3: parsed string operand
F100  36 00     MVI M,00H
F102  CD D2 DD  CALL 0DDD2H         ; IGNB: get next non-blank character from line
F105  CD 0D DE  CALL 0DE0DH         ; NUMER: check for digit
F108  DA 0E F1  JC 0F10EH
F10B  3E 2F     MVI A,2FH
F10D  0D        DCR C
LF10E:
                                      ; <- F108
F10E  0C        INR C
F10F  D6 30     SUI 30H
F111  32 B0 01  STA 01B0H           ; number -> FILES  [FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]]
F114  CD D2 DD  CALL 0DDD2H         ; IGNB: get next non-blank character from line
F117  FE 22     CPI 22H             ; quoted string?
F119  C2 30 F1  JNZ 0F130H
F11C  0C        INR C
LF11D:
                                      ; <- F12D
F11D  CD E0 DD  CALL 0DDE0H         ; EFETCH (GET CHARACTER TO ENCODE)
F120  0C        INR C
F121  FE 0D     CPI 0DH
F123  CA 0B DA  JZ 0DA0BH           ; ERRSN: SYNTAX ERROR
F126  FE 22     CPI 22H
F128  CA 75 F1  JZ 0F175H
F12B  77        MOV M,A
F12C  23        INX H
F12D  C3 1D F1  JMP 0F11DH
LF130:
                                      ; <- F119
F130  CD D2 DD  CALL 0DDD2H         ; IGNB: get next non-blank character from line
F133  FE 0D     CPI 0DH
F135  CA 77 F1  JZ 0F177H
F138  FE 3A     CPI 3AH
F13A  CA 77 F1  JZ 0F177H
F13D  D5        PUSH D
F13E  41        MOV B,C
F13F  0D        DCR C
F140  16 00     MVI D,00H
LF142:
                                      ; <- F151
F142  14        INR D
F143  0C        INR C
F144  7A        MOV A,D
F145  FE 0F     CPI 0FH
F147  DA 4B F1  JC 0F14BH
F14A  15        DCR D
LF14B:
                                      ; <- F147
F14B  CD E0 DD  CALL 0DDE0H         ; EFETCH (GET CHARACTER TO ENCODE)
F14E  CD 02 DE  CALL 0DE02H         ; ALPHA (CHECK IF UPPER CASE CHARACTER)
F151  DA 42 F1  JC 0F142H
F154  CD E0 DD  CALL 0DDE0H         ; EFETCH (GET CHARACTER TO ENCODE)
F157  FE 24     CPI 24H             ; string variable (name$)?
F159  C2 0B DA  JNZ 0DA0BH          ; ERRSN: SYNTAX ERROR
F15C  79        MOV A,C
F15D  0C        INR C
F15E  90        SUB B
F15F  E6 0F     ANI 0FH
F161  F6 20     ORI 20H
F163  57        MOV D,A
F164  CD 57 CA  CALL 0CA57H         ; LOOK (TABLE LOOK UP)
F167  D2 0B DA  JNC 0DA0BH          ; ERRSN: SYNTAX ERROR
F16A  23        INX H
F16B  5E        MOV E,M
F16C  23        INX H
F16D  56        MOV D,M
F16E  21 21 FA  LXI H,0FA21H        ; FILBUF+3: parsed string operand
F171  CD 6D D1  CALL 0D16DH         ; SCOPF (TRANSFER OF STRING DATA)
F174  D1        POP D
LF175:
                                      ; <- F128
F175  36 0D     MVI M,0DH
LF177:
                                      ; <- F135 F13A F185
F177  CD D2 DD  CALL 0DDD2H         ; IGNB: get next non-blank character from line
F17A  0C        INR C
F17B  FE 3A     CPI 3AH
F17D  C8        RZ
F17E  FE 0D     CPI 0DH
F180  C8        RZ
F181  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F184  B7        ORA A
F185  F2 77 F1  JP 0F177H
F188  0E 01     MVI C,01H
F18A  11 AE F0  LXI D,0F0AEH
F18D  C9        RET

TABCMD:                              ; [D] command table: length, name, handler address
F18E            DB 3,'REW'
F192            DW 0F27CH           ; REW -> X2REW
F194            DB 4,'SKIP'
F199            DW 0F281H           ; SKIP -> X2SKIP
F19B            DB 3,'CAS'
F19F            DW 0F396H           ; CAS -> CAS
F1A1            DB 3,'DCR'
F1A5            DW 0F277H           ; DCR -> X2DCRN
F1A7            DB 3,'DEL'
F1AB            DW 0F295H           ; DEL -> X2DEL
F1AD            DB 4,'LAST'
F1B2            DW 0F28BH           ; LAST -> X2LAST
F1B4            DB 3,'VER'
F1B8            DW 0F286H           ; VER -> X2VER
F1BA            DB 4,'LOOK'
F1BF            DW 0F290H           ; LOOK -> X2LOOK
F1C1            DB 3,'HSL'
F1C5            DW 0F29FH           ; HSL -> X2HSL
F1C7            DB 3,'FDD'
F1CB            DW 0F2AEH           ; FDD -> X1FDDN
F1CD            DB 6,'FORMAT'
F1D4            DW 0F2B3H           ; FORMAT -> X1FORM
F1D6            DB 7,'SCRATCH'
F1DE            DW 0F2B8H           ; SCRATCH -> X1SCR
F1E0            DB 6,'RENAME'
F1E7            DW 0F2C0H           ; RENAME -> X1REN
F1E9            DB 4,'COPY'
F1EE            DW 0F2C5H           ; COPY -> X1COPY
F1F0            DB 4,'INIT'
F1F5            DW 0F2CAH           ; INIT -> X1INIT
F1F7            DB 5,'VALID'
F1FD            DW 0F2CFH           ; VALID -> X1VAL
F1FF            DB 3,'DIR'
F203            DW 0F2D4H           ; DIR -> X1DIR
F205            DB 4,'FVER'
F20A            DW 0F2DEH           ; FVER -> FVER
F20C            DB 4,'BOOT'
F211            DW 0F45EH           ; BOOT -> BOOT
F213            DB 3,'UBL'
F217            DW 0F4B3H           ; UBL -> UBL
F219            DB 3,'USR'
F21D            DW 02DAH            ; USR -> vector RESET / USR [F][M]
F21F            DB 4,'LNON'
F224            DW 0F3E4H           ; LNON -> LNON
F226            DB 5,'LNOFF'
F22C            DW 0F3ECH           ; LNOFF -> LNOFF
F22E            DB 2,'/D'
F231            DW 0F3D6H           ; /D -> SLASHD
F233            DB 2,'/P'
F236            DW 0F36AH           ; /P -> SLASHP
F238            DB 2,'/S'
F23B            DW 0F451H           ; /S -> SLASHS
F23D            DB 2,'/M'
F240            DW 0F401H           ; /M -> SLASHM
F242            DB 2,'/0'
F245            DW 0F408H           ; /0 -> SLASH0
F247            DB 2,'/E'
F24A            DW 0F41BH           ; /E -> SLASHE
F24C            DB 2,'/C'
F24F            DW 0F423H           ; /C -> SLASHC
F251            DB 2,'/T'
F254            DW 0F430H           ; /T -> SLASHT
F256            DB 2,'/I'
F259            DW 0F43FH           ; /I -> SLASHI
F25B            DB 2,'/F'
F25E            DW 0F438H           ; /F -> SLASHF
F260            DB 2,'/H'
F263            DW 0F57FH           ; /H -> SLASHH

TABEND:                              ; [C] table end: 00, then DW FA19 = link to (FA19)=0 and EXTTAB at FA1A/1B
F265            DB 00H,19H,0FAH,00H,00H,00H,00H,00H; ........

X2OPEN:                              ; [C] bank 2 slot 00 OPEN DCR
                                      ; <- F009
F26D  CD BD F7  CALL 0F7BDH         ; bank 2 slot 00h -> F348 OPEN
F270  00        DB 00H              ; inline slot
F271  C9        RET

X2DCR0:                              ; [C] bank 2 slot 03 select DCR 0
                                      ; <- F00C
F272  CD BD F7  CALL 0F7BDH         ; bank 2 slot 03h -> F566 DCR
F275  03        DB 03H              ; inline slot
F276  C9        RET

X2DCRN:                              ; [C] bank 2 slot 06 DCR x
                                      ; <- TABCMD
F277  CD BD F7  CALL 0F7BDH         ; bank 2 slot 06h -> F693 DCRN
F27A  06        DB 06H              ; inline slot
F27B  C9        RET

X2REW:                               ; [C] bank 2 slot 09 REWIND
                                      ; <- F012 TABCMD
F27C  CD BD F7  CALL 0F7BDH         ; bank 2 slot 09h -> F5DA REWIND
F27F  09        DB 09H              ; inline slot
F280  C9        RET

X2SKIP:                              ; [C] bank 2 slot 0C SKIP
                                      ; <- F015 TABCMD
F281  CD BD F7  CALL 0F7BDH         ; bank 2 slot 0Ch -> F641 SKIP
F284  0C        DB 0CH              ; inline slot
F285  C9        RET

X2VER:                               ; [C] bank 2 slot 0F VERIFY
                                      ; <- F018 TABCMD
F286  CD BD F7  CALL 0F7BDH         ; bank 2 slot 0Fh -> F6E2 VERIFY
F289  0F        DB 0FH              ; inline slot
F28A  C9        RET

X2LAST:                              ; [C] bank 2 slot 12 LAST
                                      ; <- F01B TABCMD
F28B  CD BD F7  CALL 0F7BDH         ; bank 2 slot 12h -> F5BC LAST
F28E  12        DB 12H              ; inline slot
F28F  C9        RET

X2LOOK:                              ; [C] bank 2 slot 15 LOOK
                                      ; <- F01E TABCMD
F290  CD BD F7  CALL 0F7BDH         ; bank 2 slot 15h -> F75D LOOK
F293  15        DB 15H              ; inline slot
F294  C9        RET

X2DEL:                               ; [C] bank 2 slot 18 DEL
                                      ; <- TABCMD
F295  CD BD F7  CALL 0F7BDH         ; bank 2 slot 18h -> F59B DEL
F298  18        DB 18H              ; inline slot
F299  C9        RET

X2INIT:                              ; [C] bank 2 slot 30 INIT (DCR / DCR USER boot)
F29A  CD BD F7  CALL 0F7BDH         ; bank 2 slot 30h -> F4D4 INIT
F29D  30        DB 30H              ; inline slot
F29E  C9        RET

X2HSL:                               ; [M] bank 2 slot 33 HSL: select data loader [manual F29F]
                                      ; <- TABCMD
F29F  CD BD F7  CALL 0F7BDH         ; bank 2 slot 33h -> F036 HSL
F2A2  33        DB 33H              ; inline slot
F2A3  C9        RET

X1BOOT:                              ; [C] bank 1 slot 00 FDD boot check
F2A4  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 00h -> F042 FDBOOT
F2A7  00        DB 00H              ; inline slot
F2A8  C9        RET

X1FDD0:                              ; [M] bank 1 slot 03 select FDD0 [manual F2A9]
F2A9  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 03h -> F066 FDD0
F2AC  03        DB 03H              ; inline slot
F2AD  C9        RET

X1FDDN:                              ; [C] bank 1 slot 06 FDD x
                                      ; <- TABCMD
F2AE  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 06h -> F08D FDDN
F2B1  06        DB 06H              ; inline slot
F2B2  C9        RET

X1FORM:                              ; [M] bank 1 slot 1B FORMAT
                                      ; <- TABCMD
F2B3  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 1Bh -> F4F1 CMDN
F2B6  1B        DB 1BH              ; inline slot
F2B7  C9        RET

X1SCR:                               ; [M] bank 1 slot 1E SCRATCH
                                      ; <- TABCMD
F2B8  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 1Eh -> F4F6 CMDS
F2BB  1E        DB 1EH              ; inline slot
F2BC  CD 55 DD  CALL 0DD55H         ; COL0 (CURSOR TO COLUMN 0)
F2BF  C9        RET

X1REN:                               ; [M] bank 1 slot 21 RENAME
                                      ; <- TABCMD
F2C0  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 21h -> F4FB CMDR
F2C3  21        DB 21H              ; inline slot
F2C4  C9        RET

X1COPY:                              ; [M] bank 1 slot 24 COPY
                                      ; <- TABCMD
F2C5  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 24h -> F500 CMDC
F2C8  24        DB 24H              ; inline slot
F2C9  C9        RET

X1INIT:                              ; [M] bank 1 slot 27 INIT (initialise drive)
                                      ; <- TABCMD
F2CA  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 27h -> F4E3 CMDI
F2CD  27        DB 27H              ; inline slot
F2CE  C9        RET

X1VAL:                               ; [M] bank 1 slot 2A VALID
                                      ; <- TABCMD
F2CF  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 2Ah -> F4E8 CMDV
F2D2  2A        DB 2AH              ; inline slot
F2D3  C9        RET

X1DIR:                               ; [M] bank 1 slot 2D DIR
                                      ; <- TABCMD
F2D4  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 2Dh -> F55A DIR
F2D7  2D        DB 2DH              ; inline slot
F2D8  C9        RET
F2D9  00 x5     DS 5                ; unused (00)

FVER:                                ; [M] FVER "name": needs a name, then bank 1 slot 30
                                      ; <- TABCMD
F2DE  F5        PUSH PSW
F2DF  CD 1D F7  CALL 0F71DH         ; NEEDFN
F2E2  F1        POP PSW
F2E3  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 30h -> F633 FVER1
F2E6  30        DB 30H              ; inline slot
F2E7  C9        RET

X1ERRC:                              ; [M] bank 1 slot 33 read error channel [manual F2E8]
F2E8  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 33h -> F0E4 RDERR
F2EB  33        DB 33H              ; inline slot
F2EC  C9        RET

X1CLOS:                              ; [M] bank 1 slot 36 close file [manual F2ED]
F2ED  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 36h -> F77E CLOSE
F2F0  36        DB 36H              ; inline slot
F2F1  C9        RET

DOSBOOT:                             ; [C] reset boot entry: the DAI DCE bootstrap jumps to F2F2 (JP F2F2 built from Memocom ID bytes F2h)
F2F2  F5        PUSH PSW
F2F3  C5        PUSH B
F2F4  D5        PUSH D
F2F5  E5        PUSH H
F2F6  CD 19 F6  CALL 0F619H         ; DOSRST
F2F9  CD BD F7  CALL 0F7BDH         ; bank 2 slot 30h -> F4D4 INIT
F2FC  30        DB 30H              ; inline slot
F2FD  3A 00 FA  LDA 0FA00H          ; DCR USER program loaded?  [USRFLG: DCR USER boot flag [M]]
F300  B7        ORA A
F301  CA 10 F3  JZ 0F310H           ; BOOT20
F304  2A 07 FA  LHLD 0FA07H         ; USERST: DCR USER start address [M]
F307  E5        PUSH H
F308  CD 30 F3  CALL 0F330H         ; SETRST
F30B  21 4D C1  LXI H,0C14DH        ; EXIT: POP H, POP D, POP B, POP PSW, RET
F30E  E3        XTHL
F30F  E9        PCHL                ; run it, return to EXIT

BOOT20:                              ; [C] no DCR USER program: try FDD, then DCR 0, else CAS 1
                                      ; <- F301
F310  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 00h -> F042 FDBOOT
F313  00        DB 00H              ; inline slot
F314  3A 15 FA  LDA 0FA15H          ; FDD present?  [STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]]
F317  E6 BF     ANI 0BFH
F319  CA 2A F3  JZ 0F32AH
F31C  CD BD F7  CALL 0F7BDH         ; bank 2 slot 03h -> F566 DCR
F31F  03        DB 03H              ; inline slot
F320  CD BD F7  CALL 0F7BDH         ; bank 2 slot 00h -> F348 OPEN
F323  00        DB 00H              ; inline slot
F324  CA 2A F3  JZ 0F32AH           ; DCR 0 with cassette?
F327  CD 90 F3  CALL 0F390H         ; CAS1
LF32A:
                                      ; <- F319 F324
F32A  CD 30 F3  CALL 0F330H         ; SETRST
F32D  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET

SETRST:                              ; [C] set RSTFLG, clear RSP high byte
                                      ; <- F308 F32A
F330  3E FF     MVI A,0FFH
F332  32 0F FA  STA 0FA0FH          ; RSTFLG: reset-routine flag [M]
F335  3C        INR A
F336  32 9A 02  STA 029AH           ; RSP+1
F339  C9        RET

RDLINE:                              ; [M] CALLM #F33A,A%: set READ/DATA pointer to line A%
F33A  F5        PUSH PSW
F33B  D5        PUSH D
F33C  E5        PUSH H
F33D  23        INX H
F33E  23        INX H
F33F  56        MOV D,M
F340  23        INX H
F341  5E        MOV E,M
F342  EB        XCHG
F343  CD F6 CA  CALL 0CAF6H         ; FINDL (FIND LINENUMBER IN TEXTBUFFER)
F346  D2 60 F3  JNC 0F360H
F349  E5        PUSH H
F34A  23        INX H
F34B  23        INX H
F34C  23        INX H
F34D  7E        MOV A,M
F34E  E1        POP H
F34F  FE A2     CPI 0A2H
F351  C2 60 F3  JNZ 0F360H
F354  22 24 01  SHLD 0124H          ; DATAP: current DATA line [F]
F357  3E FF     MVI A,0FFH
F359  32 23 01  STA 0123H           ; offset next DATA character [F]
F35C  E1        POP H
F35D  D1        POP D
F35E  F1        POP PSW
F35F  C9        RET
LF360:
                                      ; <- F346 F351
F360  3E 04     MVI A,04H
F362  C3 F5 D9  JMP 0D9F5H          ; ERROR: report error A
F365  00 x5     DS 5                ; unused (00)

SLASHP:                              ; [M] /P output to parallel printer
                                      ; <- TABCMD
F36A  E5        PUSH H
F36B  21 EF F4  LXI H,0F4EFH        ; PRNOUT
F36E  22 DE 02  SHLD 02DEH          ; DOUTC address
F371  3E 80     MVI A,80H
F373  32 31 01  STA 0131H           ; OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]
F376  3A 1C FA  LDA 0FA1CH          ; SCRNBD: screen baud rate [M]
F379  32 F5 FF  STA 0FFF5H          ; TMS5501 baud-rate register [F]
F37C  E1        POP H
F37D  C9        RET

ONERR:                               ; [D] CALLM #F003,E%: errors go to variable E%
                                      ; <- F003
F37E  E5        PUSH H
F37F  23        INX H
F380  23        INX H
F381  23        INX H
F382  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F385  E1        POP H
F386  C9        RET

NONERR:                              ; [D] CALLM #F006: errors reported again
                                      ; <- F006 F672
F387  E5        PUSH H
F388  21 00 00  LXI H,0000H
F38B  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F38E  E1        POP H
F38F  C9        RET

CAS1:                                ; [C] select audio cassette 1 [manual F00F]
                                      ; <- F00F F327 F3F7
F390  F5        PUSH PSW
F391  3E FF     MVI A,0FFH
F393  C3 9A F3  JMP 0F39AH

CAS:                                 ; [D] CAS x: select audio cassette x
                                      ; <- TABCMD
F396  F5        PUSH PSW
F397  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
LF39A:
                                      ; <- F393
F39A  B7        ORA A
F39B  F2 A0 F3  JP 0F3A0H
F39E  3E 01     MVI A,01H
LF3A0:
                                      ; <- F39B
F3A0  E6 03     ANI 03H
F3A2  32 09 FA  STA 0FA09H          ; EXTNR: unit number of external memory [M]
F3A5  07        RLC
F3A6  07        RLC
F3A7  07        RLC
F3A8  07        RLC
F3A9  32 3D 01  STA 013DH           ; CASSL: cassette select 10h/20h [F][D]
F3AC  3E 01     MVI A,01H
F3AE  32 0A FA  STA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F3B1  D5        PUSH D
F3B2  E5        PUSH H
F3B3  2A E4 02  LHLD 02E4H          ; saved DINC address [D]
F3B6  E5        PUSH H
F3B7  CD 95 D7  CALL 0D795H         ; CASIN (TRANSFER DATA/CASSETTE VECTORS)
F3BA  E1        POP H
F3BB  22 E4 02  SHLD 02E4H          ; saved DINC address [D]
F3BE  3E C3     MVI A,0C3H
F3C0  32 DD 02  STA 02DDH           ; vector DOUTC (JMP) [F]
F3C3  32 E3 02  STA 02E3H           ; saved original DINC (JMP) [D]
F3C6  21 EF F4  LXI H,0F4EFH        ; PRNOUT
F3C9  22 DE 02  SHLD 02DEH          ; DOUTC address
F3CC  21 54 F0  LXI H,0F054H        ; DINKBD
F3CF  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F3D2  E1        POP H
F3D3  D1        POP D
F3D4  F1        POP PSW
F3D5  C9        RET

SLASHD:                              ; [M] /D output to screen only
                                      ; <- F741 TABCMD
F3D6  F5        PUSH PSW
F3D7  3A 1C FA  LDA 0FA1CH          ; SCRNBD: screen baud rate [M]
F3DA  32 F5 FF  STA 0FFF5H          ; TMS5501 baud-rate register [F]
F3DD  3E 01     MVI A,01H
F3DF  32 31 01  STA 0131H           ; OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]
F3E2  F1        POP PSW
F3E3  C9        RET

LNON:                                ; [M] auto line numbers on
                                      ; <- TABCMD
F3E4  F5        PUSH PSW
F3E5  3E FF     MVI A,0FFH
F3E7  32 90 FA  STA 0FA90H          ; LNAUTO: auto line number on/off [M]
F3EA  F1        POP PSW
F3EB  C9        RET

LNOFF:                               ; [M] auto line numbers off
                                      ; <- TABCMD
F3EC  F5        PUSH PSW
F3ED  AF        XRA A
F3EE  32 90 FA  STA 0FA90H          ; LNAUTO: auto line number on/off [M]
F3F1  F1        POP PSW
F3F2  C9        RET

DOSINI:                              ; [M] CALLM #F3F3: initialise the DOS, select CAS 1
F3F3  F3        DI
F3F4  CD 19 F6  CALL 0F619H         ; DOSRST
F3F7  CD 90 F3  CALL 0F390H         ; CAS1
F3FA  3E FF     MVI A,0FFH
F3FC  32 0F FA  STA 0FA0FH          ; RSTFLG: reset-routine flag [M]
F3FF  FB        EI
F400  C9        RET

SLASHM:                              ; [M] /M MODE 0
                                      ; <- F409 TABCMD
F401  F5        PUSH PSW
F402  3E FF     MVI A,0FFH
F404  EF        RST 5               ; RST 5 (screen) fn 18h: Change to mode 0
F405  18        DB 18H              ; inline function code
F406  F1        POP PSW
F407  C9        RET

SLASH0:                              ; [M] /0 defaults: MODE 0, CLS, cursor, colours, IMP INT
                                      ; <- TABCMD
F408  F5        PUSH PSW
F409  CD 01 F4  CALL 0F401H         ; SLASHM
F40C  3E 0C     MVI A,0CH
F40E  EF        RST 5               ; RST 5 (screen) fn 03h: Character to screen
F40F  03        DB 03H              ; inline function code
F410  CD 23 F4  CALL 0F423H         ; SLASHC
F413  CD 30 F4  CALL 0F430H         ; SLASHT
F416  CD 3F F4  CALL 0F43FH         ; SLASHI
F419  F1        POP PSW
F41A  C9        RET

SLASHE:                              ; [M] /E input from edit buffer
                                      ; <- TABCMD
F41B  3E 02     MVI A,02H
F41D  32 35 01  STA 0135H           ; EFSW: 1 = input from string/edit buffer [F][D]
F420  C3 23 C8  JMP 0C823H          ; ST20: re-enter BASIC after direct command / BREAK

SLASHC:                              ; [M] /C default cursor
                                      ; <- F410 TABCMD
F423  F5        PUSH PSW
F424  3E 01     MVI A,01H
F426  32 74 00  STA 0074H           ; cursor type [F]
F429  3E 5F     MVI A,5FH
F42B  32 75 00  STA 0075H           ; cursor info [F]
F42E  F1        POP PSW
F42F  C9        RET

SLASHT:                              ; [M] /T default text colours
                                      ; <- F413 TABCMD
F430  E5        PUSH H
F431  21 EE C7  LXI H,0C7EEH        ; STCOL
F434  EF        RST 5               ; RST 5 (screen) fn 06h: Set text colours
F435  06        DB 06H              ; inline function code
F436  E1        POP H
F437  C9        RET

SLASHF:                              ; [M] /F IMP FPT
                                      ; <- TABCMD
F438  F5        PUSH PSW
F439  D5        PUSH D
F43A  E5        PUSH H
F43B  AF        XRA A
F43C  C3 44 F4  JMP 0F444H

SLASHI:                              ; [M] /I IMP INT
                                      ; <- F416 TABCMD
F43F  F5        PUSH PSW
F440  D5        PUSH D
F441  E5        PUSH H
F442  3E 10     MVI A,10H
LF444:
                                      ; <- F43C
F444  11 75 02  LXI D,0275H         ; start of IMP type table [F]
F447  21 90 02  LXI H,0290H         ; end of IMP type table [F]
F44A  CD 7C DE  CALL 0DE7CH         ; FILL (FILL BANK WITH IDENTICAL DATA)
F44D  E1        POP H
F44E  D1        POP D
F44F  F1        POP PSW
F450  C9        RET

SLASHS:                              ; [M] /S output to screen + RS232
                                      ; <- TABCMD
F451  F5        PUSH PSW
F452  3A 1D FA  LDA 0FA1DH          ; SERBD: printer baud rate [M]
F455  32 F5 FF  STA 0FFF5H          ; TMS5501 baud-rate register [F]
F458  AF        XRA A
F459  32 31 01  STA 0131H           ; OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]
F45C  F1        POP PSW
F45D  C9        RET

BOOT:                                ; [M] BOOT "object,basic"
                                      ; <- TABCMD
F45E  CD 1D F7  CALL 0F71DH         ; NEEDFN
F461  06 00     MVI B,00H
F463  11 20 FA  LXI D,0FA20H        ; FILBUF+2
F466  21 51 FA  LXI H,0FA51H        ; UTNAM+1
LF469:
                                      ; <- F473
F469  13        INX D
F46A  1A        LDAX D
F46B  FE 2C     CPI 2CH
F46D  CA 76 F4  JZ 0F476H
F470  77        MOV M,A
F471  04        INR B
F472  23        INX H
F473  C3 69 F4  JMP 0F469H
LF476:
                                      ; <- F46D
F476  21 50 FA  LXI H,0FA50H        ; UTNAM: UTILITY name for BOOT [M]
F479  70        MOV M,B
F47A  06 00     MVI B,00H
F47C  21 71 FA  LXI H,0FA71H        ; BASNAM+1
LF47F:
                                      ; <- F489
F47F  13        INX D
F480  1A        LDAX D
F481  FE 0D     CPI 0DH
F483  CA 8C F4  JZ 0F48CH
F486  77        MOV M,A
F487  04        INR B
F488  23        INX H
F489  C3 7F F4  JMP 0F47FH
LF48C:
                                      ; <- F483
F48C  21 70 FA  LXI H,0FA70H        ; BASNAM: BASIC name for BOOT [M]
F48F  70        MOV M,B

BOOTGO:                              ; [C] common BOOT/UBL tail: reset stack, load object then BASIC
                                      ; <- F4E9
F490  31 00 F9  LXI SP,0F900H
F493  21 00 00  LXI H,0000H
F496  22 00 01  SHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F499  22 99 02  SHLD 0299H          ; RSP: rescued stack pointer [M][D]
F49C  21 50 FA  LXI H,0FA50H        ; UTNAM: UTILITY name for BOOT [M]
F49F  CD D3 F9  CALL 0F9D3H         ; LOADO
F4A2  22 9B 02  SHLD 029BH          ; HEAP start [F]
F4A5  CD B8 DE  CALL 0DEB8H         ; RNEW: clear program (NEW)
F4A8  CD E4 CE  CALL 0CEE4H         ; SELB0 (SELECT ROM BANK 0; PRINT MESSAGE)
F4AB  00        NOP
F4AC  00        NOP
F4AD  21 70 FA  LXI H,0FA70H        ; BASNAM: BASIC name for BOOT [M]
F4B0  C3 AF F9  JMP 0F9AFH          ; LOADBN

UBL:                                 ; [M] UBL "name": BOOT name/O then name/B
                                      ; <- TABCMD
F4B3  CD 1D F7  CALL 0F71DH         ; NEEDFN
F4B6  06 00     MVI B,00H
F4B8  11 20 FA  LXI D,0FA20H        ; FILBUF+2
F4BB  21 71 FA  LXI H,0FA71H        ; BASNAM+1
F4BE  E5        PUSH H
F4BF  21 51 FA  LXI H,0FA51H        ; UTNAM+1
LF4C2:
                                      ; <- F4D0
F4C2  13        INX D
F4C3  1A        LDAX D
F4C4  FE 0D     CPI 0DH
F4C6  CA D3 F4  JZ 0F4D3H
F4C9  77        MOV M,A
F4CA  23        INX H
F4CB  E3        XTHL
F4CC  77        MOV M,A
F4CD  23        INX H
F4CE  E3        XTHL
F4CF  04        INR B
F4D0  C3 C2 F4  JMP 0F4C2H
LF4D3:
                                      ; <- F4C6
F4D3  36 2F     MVI M,2FH
F4D5  23        INX H
F4D6  36 4F     MVI M,4FH
F4D8  E3        XTHL
F4D9  36 2F     MVI M,2FH
F4DB  23        INX H
F4DC  36 42     MVI M,42H
F4DE  E1        POP H
F4DF  04        INR B
F4E0  04        INR B
F4E1  21 50 FA  LXI H,0FA50H        ; UTNAM: UTILITY name for BOOT [M]
F4E4  70        MOV M,B
F4E5  21 70 FA  LXI H,0FA70H        ; BASNAM: BASIC name for BOOT [M]
F4E8  70        MOV M,B
F4E9  C3 90 F4  JMP 0F490H          ; BOOTGO
F4EC            DB 00H,00H,00H      ; ...

PRNOUT:                              ; [C] DOUTC for the parallel printer (DCE address 40h, 8255 mode 88h)
                                      ; <- vector 02DD (bank 1) vector 02DD (bank 2)
F4EF  F5        PUSH PSW
F4F0  C5        PUSH B
F4F1  E5        PUSH H
F4F2  47        MOV B,A
F4F3  EF        RST 5               ; RST 5 (screen) fn 03h: Character to screen
F4F4  03        DB 03H              ; inline function code
F4F5  21 02 FE  LXI H,0FE02H        ; 8255 PC (DCE bus) [F]
F4F8  3A 61 00  LDA 0061H           ; 8255 already in mode 88h?  [copy of the 8255 (GIC) control word [F]]
F4FB  FE 88     CPI 88H
F4FD  C4 23 F5  CNZ 0F523H          ; no: set printer mode  [PRNSET]
F500  7E        MOV A,M
F501  E6 20     ANI 20H             ; PC5 = 0 (/ERROR or no printer): give up
F503  CA 1C F5  JZ 0F51CH
LF506:
                                      ; <- F509
F506  7E        MOV A,M
F507  E6 10     ANI 10H             ; wait while PC4 BUSY
F509  C2 06 F5  JNZ 0F506H
F50C  78        MOV A,B
F50D  32 00 FE  STA 0FE00H          ; PA = character  [8255 PA (DCE bus) [F]]
F510  FE 0D     CPI 0DH
F512  3E 02     MVI A,02H
F514  32 03 FE  STA 0FE03H          ; PC1 = 0: /STROBE low  [8255 control (mode / bit set-reset) [F]]
F517  3E 03     MVI A,03H
F519  32 03 FE  STA 0FE03H          ; PC1 = 1: /STROBE high  [8255 control (mode / bit set-reset) [F]]
LF51C:
                                      ; <- F503
F51C  CC 36 F5  CZ 0F536H           ; DCEDEF
F51F  E1        POP H
F520  C1        POP B
F521  F1        POP PSW
F522  C9        RET

PRNSET:                              ; [C] 8255 mode 88h, select printer (PB=40h), strobe high
                                      ; <- F4FD
F523  3E 88     MVI A,88H           ; mode 88h: PA out, PB out, PC low out, PC high in
F525  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F528  32 61 00  STA 0061H           ; copy of the 8255 (GIC) control word [F]
F52B  3E 40     MVI A,40H
F52D  32 01 FE  STA 0FE01H          ; PB = 40h: printer DCE address  [8255 PB (DCE bus: device address) [F]]
F530  3E 03     MVI A,03H
F532  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F535  C9        RET

DCEDEF:                              ; [C] back to mode 98h; with FDD selected put PB=20h again
                                      ; <- F51C
F536  CD F3 F9  CALL 0F9F3H         ; MODE98
F539  3A 0A FA  LDA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F53C  FE 03     CPI 03H
F53E  C0        RNZ
F53F  3E 20     MVI A,20H
F541  32 01 FE  STA 0FE01H          ; PB = 20h: keep IEC interface selected  [8255 PB (DCE bus: device address) [F]]
F544  C9        RET

IOREST:                              ; [C] called on every bank call: ROM DINC back, DOS commands off, printer output -> screen
                                      ; <- F7DA
F545  21 B4 DD  LXI H,0DDB4H        ; INSER (INPUT FROM RS232)
F548  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F54B  21 96 02  LXI H,0296H         ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F54E  3E FD     MVI A,0FDH          ; clear INSW bit 1: DOS commands off
F550  A6        ANA M
F551  77        MOV M,A
F552  3A 31 01  LDA 0131H           ; OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]
F555  D6 80     SUI 80H             ; printer selected (OTSW=80h)?
F557  C0        RNZ
F558  3C        INR A
F559  32 31 01  STA 0131H           ; -> screen only  [OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]]
F55C  C9        RET
F55D            DB 00H,00H          ; ..

SETLNR:                              ; [M] CALLM #F55F,A%: auto line number start
F55F  F5        PUSH PSW
F560  E5        PUSH H
F561  23        INX H
F562  23        INX H
F563  7E        MOV A,M
F564  32 92 FA  STA 0FA92H          ; LNNUM: current line number [M] +1
F567  23        INX H
F568  7E        MOV A,M
F569  32 91 FA  STA 0FA91H          ; LNNUM: current line number [M]
F56C  E1        POP H
F56D  F1        POP PSW
F56E  C9        RET

SETSTP:                              ; [M] CALLM #F56F,A%: auto line number step
F56F  F5        PUSH PSW
F570  E5        PUSH H
F571  23        INX H
F572  23        INX H
F573  7E        MOV A,M
F574  32 94 FA  STA 0FA94H          ; LNSTEP: line-number step [M] +1
F577  23        INX H
F578  7E        MOV A,M
F579  32 93 FA  STA 0FA93H          ; LNSTEP: line-number step [M]
F57C  E1        POP H
F57D  F1        POP PSW
F57E  C9        RET

SLASHH:                              ; [M] /H help: show EXT, IN, OUT, IMP settings
                                      ; <- TABCMD
F57F  F5        PUSH PSW
F580  D5        PUSH D
F581  E5        PUSH H
F582  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F585  21 78 F6  LXI H,0F678H        ; HLPTXT
F588  11 04 00  LXI D,0004H
F58B  3E 04     MVI A,04H
F58D  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F590  3A 0A FA  LDA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F593  FE 02     CPI 02H
F595  DA A3 F5  JC 0F5A3H
F598  CA A2 F5  JZ 0F5A2H
F59B  FE 03     CPI 03H
F59D  CA A1 F5  JZ 0F5A1H
F5A0  19        DAD D
LF5A1:
                                      ; <- F59D
F5A1  19        DAD D
LF5A2:
                                      ; <- F598
F5A2  19        DAD D
LF5A3:
                                      ; <- F595
F5A3  3E 04     MVI A,04H
F5A5  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F5A8  3A 09 FA  LDA 0FA09H          ; EXTNR: unit number of external memory [M]
F5AB  C6 30     ADI 30H
F5AD  CD 60 DD  CALL 0DD60H         ; OUTC: output character A
F5B0  CD 0D DB  CALL 0DB0DH         ; PSKP (CURSOR TO NEXT FIELD)
F5B3  21 8C F6  LXI H,0F68CH
F5B6  11 04 00  LXI D,0004H
F5B9  3E 04     MVI A,04H
F5BB  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F5BE  3A 96 02  LDA 0296H           ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F5C1  E6 01     ANI 01H
F5C3  CA C7 F5  JZ 0F5C7H
F5C6  19        DAD D
LF5C7:
                                      ; <- F5C3
F5C7  3E 04     MVI A,04H
F5C9  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F5CC  CD 0D DB  CALL 0DB0DH         ; PSKP (CURSOR TO NEXT FIELD)
F5CF  21 98 F6  LXI H,0F698H
F5D2  11 05 00  LXI D,0005H
F5D5  3E 05     MVI A,05H
F5D7  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F5DA  3A 31 01  LDA 0131H           ; OTSW: output switch (0 scrn+RS232, 1 scrn, 2 edit, 80h printer) [F][M]
F5DD  FE 01     CPI 01H
F5DF  DA ED F5  JC 0F5EDH
F5E2  CA EC F5  JZ 0F5ECH
F5E5  FE 02     CPI 02H
F5E7  CA EB F5  JZ 0F5EBH
F5EA  19        DAD D
LF5EB:
                                      ; <- F5E7
F5EB  19        DAD D
LF5EC:
                                      ; <- F5E2
F5EC  19        DAD D
LF5ED:
                                      ; <- F5DF
F5ED  3E 05     MVI A,05H
F5EF  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F5F2  CD 0D DB  CALL 0DB0DH         ; PSKP (CURSOR TO NEXT FIELD)
F5F5  21 B1 F6  LXI H,0F6B1H
F5F8  11 04 00  LXI D,0004H
F5FB  3E 04     MVI A,04H
F5FD  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F600  3A 8F 02  LDA 028FH           ; default number type (IMP) [F]
F603  FE 10     CPI 10H
F605  DA 0D F6  JC 0F60DH
F608  CA 0C F6  JZ 0F60CH
F60B  19        DAD D
LF60C:
                                      ; <- F608
F60C  19        DAD D
LF60D:
                                      ; <- F605
F60D  3E 04     MVI A,04H
F60F  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F612  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F615  E1        POP H
F616  D1        POP D
F617  F1        POP PSW
F618  C9        RET

DOSRST:                              ; [C] initialise all DOS variables and RAM vectors
                                      ; <- F2F6 F3F4
F619  F5        PUSH PSW
F61A  E5        PUSH H
F61B  3E C0     MVI A,0C0H
F61D  32 F5 FF  STA 0FFF5H          ; TMS5501 rate = C0h (9600 baud)  [TMS5501 baud-rate register [F]]
F620  32 1D FA  STA 0FA1DH          ; SERBD: printer baud rate [M]
F623  32 1C FA  STA 0FA1CH          ; SCRNBD: screen baud rate [M]
F626  21 8E F1  LXI H,0F18EH        ; TABCMD
F629  22 97 02  SHLD 0297H          ; TABPTR = TABCMD  [TABPTR: pointer to command table [M][D]]
F62C  AF        XRA A
F62D  32 02 FA  STA 0FA02H          ; MEMBNK: selected F-bank [M]
F630  32 C4 02  STA 02C4H           ; BREAK pointer [F]
F633  32 0F FA  STA 0FA0FH          ; RSTFLG: reset-routine flag [M]
F636  32 90 FA  STA 0FA90H          ; LNAUTO: auto line number on/off [M]
F639  32 19 FA  STA 0FA19H          ; must be 0 (end-of-table link) [M]
F63C  21 00 00  LXI H,0000H
F63F  22 1A FA  SHLD 0FA1AH         ; EXTTAB: user command table [M]
F642  21 0A 00  LXI H,000AH
F645  22 91 FA  SHLD 0FA91H         ; LNNUM: current line number [M]
F648  22 93 FA  SHLD 0FA93H         ; LNSTEP: line-number step [M]
F64B  21 3E F9  LXI H,0F93EH        ; RST 6 vector -> KBINT (F93E)
F64E  22 6E 00  SHLD 006EH          ; keyboard interrupt vector (RST 6) [F]
F651  21 54 F0  LXI H,0F054H        ; DINC -> DINKBD
F654  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F657  21 B4 DD  LXI H,0DDB4H        ; saved DINC -> ROM INSER  [INSER (INPUT FROM RS232)]
F65A  22 E4 02  SHLD 02E4H          ; saved DINC address [D]
F65D  3E C3     MVI A,0C3H
F65F  32 E3 02  STA 02E3H           ; saved original DINC (JMP) [D]
F662  32 DD 02  STA 02DDH           ; vector DOUTC (JMP) [F]
F665  21 EF F4  LXI H,0F4EFH        ; DOUTC -> PRNOUT (inactive until OTSW = 80h)
F668  22 DE 02  SHLD 02DEH          ; DOUTC address
F66B  21 96 02  LXI H,0296H         ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F66E  3E 02     MVI A,02H
F670  B6        ORA M               ; INSW bit 1: DOS commands on
F671  77        MOV M,A
F672  CD 87 F3  CALL 0F387H         ; NONERR
F675  E1        POP H
F676  F1        POP PSW
F677  C9        RET

HLPTXT:                              ; [C] text for /H (fixed-width fields)
F678            DB 'EXT: CAS DCR FDD HSLIN: KEYBDINC'
F698            DB 'OUT: RS232SCRN EDIT DOUTCIMP FPT'
F6B8            DB ' INT STR '

ERRTAB:                              ; [C] DOS error message pointers, code 0-7
F6C1            DW 0F6D1H           ; error 0: "END OF TAPE"
F6C3            DW 0F6DDH           ; error 1: "DCR DOOR OPEN"
F6C5            DW 0F6EBH           ; error 2: "EPROM OR HSL NOT AVAILABLE"
F6C7            DW 0F6FAH           ; error 3: "FILE TYPE MISMATCH"
F6C9            DW 0F704H           ; error 4: "FDD NOT AVAILABLE"
F6CB            DW 0F70AH           ; error 5: "OUT OF TIME ERROR"
F6CD            DW 0000H            ; error 6: (none: the drive message was already shown)
F6CF            DW 0F713H           ; error 7: "DEVICE MISMATCH"
F6D1            DB 'END OF TAPE',0  ; "END OF TAPE"
F6DD            DB 'DCR DOOR OPEN',0; "DCR DOOR OPEN"
F6EB            DB 'EPROM OR HSL',0DCH,0C7H,0; "EPROM OR HSL NOT AVAILABLE"
F6FA            DB 'FILE ',0DBH,0F7H,0DCH,8CH,0; "FILE TYPE MISMATCH"
F704            DB 'FDD',0DCH,0C7H,0; "FDD NOT AVAILABLE"
F70A            DB 0DCH,0DH,'TIME',0DCH,15H,0; "OUT OF TIME ERROR"
F713            DB 'DEVICE ',0DCH,8CH,0; "DEVICE MISMATCH"

NEEDFN:                              ; [C] SYNTAX ERROR unless a file name was given
                                      ; <- F2DF F45E F4B3
F71D  3A 21 FA  LDA 0FA21H          ; FILBUF+3: parsed string operand
F720  B7        ORA A
F721  CA 0B DA  JZ 0DA0BH           ; ERRSN: SYNTAX ERROR
F724  C9        RET

FREE0:                               ; [M] free (manual note: F725-F73F free)
F725  00 x27    DS 27               ; unused (00)

DOSERM:                              ; [C] report DOS error B: ON ERROR variable or message
F740  47        MOV B,A
F741  CD D6 F3  CALL 0F3D6H         ; SLASHD
F744  CD E4 CE  CALL 0CEE4H         ; SELB0 (SELECT ROM BANK 0; PRINT MESSAGE)
F747  00        NOP
F748  00        NOP
F749  3A 18 01  LDA 0118H           ; RUNF: flag running program [F][D]
F74C  B7        ORA A
F74D  CA 59 F7  JZ 0F759H
F750  CD 62 F7  CALL 0F762H         ; PRTERR
F753  CD 75 DA  CALL 0DA75H         ; MSGIL (PRINT LINE NUMBER IN WHICH ERROR OCCURED)
F756  C3 14 C8  JMP 0C814H          ; START: re-enter BASIC after run-time error
LF759:
                                      ; <- F74D
F759  CD 62 F7  CALL 0F762H         ; PRTERR
F75C  CD 55 DD  CALL 0DD55H         ; COL0 (CURSOR TO COLUMN 0)
F75F  C3 23 C8  JMP 0C823H          ; ST20: re-enter BASIC after direct command / BREAK

PRTERR:                              ; [C] print DOS error message number B
                                      ; <- F750 F759
F762  CD 55 DD  CALL 0DD55H         ; COL0 (CURSOR TO COLUMN 0)
F765  78        MOV A,B
F766  21 C1 F6  LXI H,0F6C1H        ; ERRTAB
F769  87        ADD A
F76A  5F        MOV E,A
F76B  16 00     MVI D,00H
F76D  19        DAD D
F76E  5E        MOV E,M
F76F  23        INX H
F770  56        MOV D,M
F771  EB        XCHG
F772  CD D4 DA  CALL 0DAD4H         ; PMSG: print message at HL
F775  C9        RET

X2WOPN:                              ; [C] bank 2 slot 1B WOPEN
                                      ; <- vector 02C5 (bank 2)
F776  CD BD F7  CALL 0F7BDH         ; bank 2 slot 1Bh -> F0F6 WOPEN
F779  1B        DB 1BH              ; inline slot
F77A  C9        RET

X2WBLK:                              ; [C] bank 2 slot 1E WBLK
                                      ; <- vector 02C8 (bank 2)
F77B  CD BD F7  CALL 0F7BDH         ; bank 2 slot 1Eh -> F12E BLOCK
F77E  1E        DB 1EH              ; inline slot
F77F  C9        RET

X2WCLS:                              ; [C] bank 2 slot 21 WCLOSE
                                      ; <- vector 02CB (bank 2)
F780  CD BD F7  CALL 0F7BDH         ; bank 2 slot 21h -> F162 WCLOSE
F783  21        DB 21H              ; inline slot
F784  C9        RET

X2ROPN:                              ; [C] bank 2 slot 24 ROPEN
                                      ; <- vector 02CE (bank 2)
F785  CD BD F7  CALL 0F7BDH         ; bank 2 slot 24h -> F1E9 ROPEN
F788  24        DB 24H              ; inline slot
F789  C9        RET

X2RBLK:                              ; [C] bank 2 slot 27 RBLK
                                      ; <- vector 02D1 (bank 2)
F78A  CD BD F7  CALL 0F7BDH         ; bank 2 slot 27h -> F213 RBLOCK
F78D  27        DB 27H              ; inline slot
F78E  C9        RET

X2RCLS:                              ; [C] bank 2 slot 2A RCLOSE
                                      ; <- vector 02D4 (bank 2)
F78F  CD BD F7  CALL 0F7BDH         ; bank 2 slot 2Ah -> F31F RCLOSE
F792  2A        DB 2AH              ; inline slot
F793  C9        RET

X2MBLK:                              ; [C] bank 2 slot 2D MBLK (CHECK)
                                      ; <- vector 02D7 (bank 2)
F794  CD BD F7  CALL 0F7BDH         ; bank 2 slot 2Dh -> F287 MBLOCK
F797  2D        DB 2DH              ; inline slot
F798  C9        RET

X1WOPN:                              ; [C] bank 1 slot 09 WOPEN
                                      ; <- vector 02C5 (bank 1)
F799  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 09h -> F3A4 FWOPEN
F79C  09        DB 09H              ; inline slot
F79D  C9        RET

X1WBLK:                              ; [C] bank 1 slot 0C WBLK
                                      ; <- vector 02C8 (bank 1)
F79E  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 0Ch -> F3D7 FWBLK
F7A1  0C        DB 0CH              ; inline slot
F7A2  C9        RET

X1WCLS:                              ; [C] bank 1 slot 0F WCLOSE
                                      ; <- vector 02CB (bank 1)
F7A3  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 0Fh -> F405 FWCLOS
F7A6  0F        DB 0FH              ; inline slot
F7A7  C9        RET

X1ROPN:                              ; [C] bank 1 slot 12 ROPEN
                                      ; <- vector 02CE (bank 1)
F7A8  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 12h -> F42F FROPEN
F7AB  12        DB 12H              ; inline slot
F7AC  C9        RET

X1RBLK:                              ; [C] bank 1 slot 15 RBLK
                                      ; <- vector 02D1 (bank 1)
F7AD  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 15h -> F47A FRBLK
F7B0  15        DB 15H              ; inline slot
F7B1  C9        RET

X1RCLS:                              ; [C] bank 1 slot 18 RCLOSE
                                      ; <- vector 02D4 (bank 1)
F7B2  CD B7 F7  CALL 0F7B7H         ; bank 1 slot 18h -> F4CA FRCLOS
F7B5  18        DB 18H              ; inline slot
F7B6  C9        RET

;---------------------------------------------------------------------------------------------------
; BANK-CALL MECHANISM (THUNK)
; A caller in bank 0 does  CALL CALLBn / DB slot.  CALLBn loads A = n and jumps to THUNK, which
; saves HL (MEMHL) and PSW (MEMPSW), restores ROM I/O (IOREST), takes the inline slot byte and
; builds HL = F000+slot, the entry in the target bank jump table. CALL F7E7 then pushes F7E7 as
; return address, pushes the target and the saved PSW, writes the bank number to MEMBNK and to
; FFFE (BNKSL). From F7FE on the CPU fetches from the new bank; F7F8-F7FF hold the same bytes
; in banks 0, 1 and 2, so POP PSW / RET continue there and "return" into the target routine.
; When the routine returns, it lands on F7E7 of its own bank (BACK1/BACK2), which re-enables the
; DOS input hook and writes 0 to FFFE; the shared F7FE/F7FF then return to the original caller.
;---------------------------------------------------------------------------------------------------
CALLB1:                              ; [C] call bank 1 slot (inline byte)
F7B7  F5        PUSH PSW
F7B8  3E 01     MVI A,01H
F7BA  C3 D0 F7  JMP 0F7D0H          ; THUNK

CALLB2:                              ; [C] call bank 2 slot (inline byte)
F7BD  F5        PUSH PSW
F7BE  3E 02     MVI A,02H
F7C0  C3 D0 F7  JMP 0F7D0H          ; THUNK

CALLB3:                              ; [C] call bank 3 slot (unused)
F7C3  F5        PUSH PSW
F7C4  3E 03     MVI A,03H
F7C6  C3 D0 F7  JMP 0F7D0H          ; THUNK

CALLB4:                              ; [C] call "bank 4" = bank 0 (unused)
F7C9  F5        PUSH PSW
F7CA  3E 04     MVI A,04H
F7CC  00        NOP
F7CD  00        NOP
F7CE  00        NOP
F7CF  00        NOP

THUNK:                               ; [C] bank-call mechanism, see header
                                      ; <- F7BA F7C0 F7C6
F7D0  32 01 FA  STA 0FA01H          ; NEWBNK = target bank  [NEWBNK: F-bank to select [M]]
F7D3  22 03 FA  SHLD 0FA03H         ; MEMHL = caller HL  [MEMHL: saved HL [M]]
F7D6  E1        POP H               ; pop caller PSW
F7D7  22 05 FA  SHLD 0FA05H         ; MEMPSW  [MEMPSW: saved PSW [M]]
F7DA  CD 45 F5  CALL 0F545H         ; IOREST: printer/DINC back to defaults
F7DD  E3        XTHL                ; fetch inline slot byte, step return address past it
F7DE  7E        MOV A,M
F7DF  23        INX H
F7E0  E3        XTHL
F7E1  6F        MOV L,A
F7E2  26 F0     MVI H,0F0H          ; HL = F000 + slot = entry in the target bank jump table
F7E4  CD E7 F7  CALL 0F7E7H         ; push F7E7 as return address: the target bank RET lands in its BACKn code  [BANKGO]

BANKGO:                              ; [C] switch bank and jump; F7F8-F7FF identical in banks 0-2
                                      ; <- F7E4
F7E7  E5        PUSH H              ; push target address
F7E8  2A 05 FA  LHLD 0FA05H         ; MEMPSW: saved PSW [M]
F7EB  E5        PUSH H              ; push saved PSW
F7EC  00        NOP
F7ED  00        NOP
F7EE  00        NOP
F7EF  00        NOP
F7F0  00        NOP
F7F1  00        NOP
F7F2  2A 03 FA  LHLD 0FA03H         ; MEMHL: saved HL [M]
F7F5  3A 01 FA  LDA 0FA01H          ; NEWBNK: F-bank to select [M]
F7F8  32 02 FA  STA 0FA02H          ; MEMBNK = bank  [MEMBNK: selected F-bank [M]]
F7FB  32 FE FF  STA 0FFFEH          ; BANK SWITCH: next fetch comes from the new bank (same bytes there)  [BNKSL: F-bank select 0-3 (card latch U5) [M]]
F7FE  F1        POP PSW             ; restore PSW
F7FF  C9        RET                 ; "return" into the target routine

;===================================================================================================
; BANK 1  (EPROM 0800-0FFF, CPU F000-F7FF)  -  floppy DOS for the Commodore VC1541
; IEC serial bus driven by software through the DCE-bus 8255 (mode 98h, PB = 20h):
;   PC0 out = DATA, PC1 out = CLK, PC3 out = ATN (1 = pull the line low, open-collector inverters),
;   PA7 in = DATA, PA6 in = CLK (1 = line high). Files: channel 2, commands/errors: channel 15.
; Each block on disk: 2-byte length, data, checksum (seed 56h), same format as the DAI tape blocks.
;===================================================================================================

JTAB1:                               ; [C] bank 1 slot table, 19 entries
F000  C3 42 F0  JMP 0F042H          ; FDBOOT
F003  C3 66 F0  JMP 0F066H          ; FDD0
F006  C3 8D F0  JMP 0F08DH          ; FDDN
F009  C3 A4 F3  JMP 0F3A4H          ; FWOPEN
F00C  C3 D7 F3  JMP 0F3D7H          ; FWBLK
F00F  C3 05 F4  JMP 0F405H          ; FWCLOS
F012  C3 2F F4  JMP 0F42FH          ; FROPEN
F015  C3 7A F4  JMP 0F47AH          ; FRBLK
F018  C3 CA F4  JMP 0F4CAH          ; FRCLOS
F01B  C3 F1 F4  JMP 0F4F1H          ; CMDN
F01E  C3 F6 F4  JMP 0F4F6H          ; CMDS
F021  C3 FB F4  JMP 0F4FBH          ; CMDR
F024  C3 00 F5  JMP 0F500H          ; CMDC
F027  C3 E3 F4  JMP 0F4E3H          ; CMDI
F02A  C3 E8 F4  JMP 0F4E8H          ; CMDV
F02D  C3 5A F5  JMP 0F55AH          ; DIR
F030  C3 33 F6  JMP 0F633H          ; FVER1
F033  C3 E4 F0  JMP 0F0E4H          ; RDERR
F036  C3 7E F7  JMP 0F77EH          ; CLOSE
F039  00 x9     DS 9                ; unused (00)

FDBOOT:                              ; [C] slot 00: at reset, select FDD 0; if present show "DOS 1541" sign-on
                                      ; <- F000
F042  CD 41 DE  CALL 0DE41H         ; DELAY: delay routine
F045  CD 41 DE  CALL 0DE41H         ; DELAY: delay routine
F048  CD 41 DE  CALL 0DE41H         ; DELAY: delay routine
F04B  21 00 00  LXI H,0000H
F04E  39        DAD SP
F04F  22 99 02  SHLD 0299H          ; RSP: rescued stack pointer [M][D]
F052  CD 66 F0  CALL 0F066H         ; FDD0
LF055:
                                      ; <- F252
F055  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F058  E6 BF     ANI 0BFH
F05A  C2 61 F0  JNZ 0F061H
F05D  CD DD F7  CALL 0F7DDH         ; RSTMS1
F060  C9        RET
LF061:
                                      ; <- F05A
F061  2A 99 02  LHLD 0299H          ; RSP: rescued stack pointer [M][D]
F064  F9        SPHL
F065  C9        RET

FDD0:                                ; [C] slot 03: select FDD 0 (primary address 8)
                                      ; <- F003 F052
F066  F5        PUSH PSW
F067  AF        XRA A

FDDX:                                ; [C] select FDD A (0-3), install vectors, send "UI-"
                                      ; <- F098
F068  32 09 FA  STA 0FA09H          ; EXTNR: unit number of external memory [M]
F06B  C6 08     ADI 08H
F06D  32 10 FA  STA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F070  3E 03     MVI A,03H
F072  32 0A FA  STA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F075  C5        PUSH B
F076  D5        PUSH D
F077  E5        PUSH H
F078  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F07B  11 9B F0  LXI D,0F09BH        ; VEC1
F07E  21 B9 F0  LXI H,0F0B9H        ; FDDSEL
F081  01 C5 02  LXI B,02C5H         ; vector WOPEN [F]
F084  CD 4F DE  CALL 0DE4FH         ; MOVE: block transfer DE..HL -> BC
F087  CD D1 F4  CALL 0F4D1H         ; UICMD
F08A  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET

FDDN:                                ; [C] slot 06: FDD x (number from FILES)
                                      ; <- F006
F08D  F5        PUSH PSW
F08E  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F091  B7        ORA A
F092  F2 96 F0  JP 0F096H
F095  3C        INR A
LF096:
                                      ; <- F092
F096  E6 03     ANI 03H
F098  C3 68 F0  JMP 0F068H          ; FDDX

VEC1:                                ; [C] image of RAM vectors 02C5-02E2 for FDD (copied by FDDX)
F09B            DB 0C3H / DW 0F799H ; 02C5 WOPEN: JMP F799 X1WOPN
F09E            DB 0C3H / DW 0F79EH ; 02C8 WBLK: JMP F79E X1WBLK
F0A1            DB 0C3H / DW 0F7A3H ; 02CB WCLOSE: JMP F7A3 X1WCLS
F0A4            DB 0C3H / DW 0F7A8H ; 02CE ROPEN: JMP F7A8 X1ROPN
F0A7            DB 0C3H / DW 0F7ADH ; 02D1 RBLK: JMP F7AD X1RBLK
F0AA            DB 0C3H / DW 0F7B2H ; 02D4 RCLOSE: JMP F7B2 X1RCLS
F0AD            DB 0C3H / DW 0F910H ; 02D7 MBLK: JMP F910 ESYNTX
F0B0            DB 0C9H,00H,00H     ; 02DA RESET/USR: RET
F0B3            DB 0C3H / DW 0F4EFH ; 02DD DOUTC: JMP F4EF PRNOUT
F0B6            DB 0C3H / DW 0F054H ; 02E0 DINC: JMP F054 DINKBD

FDDSEL:                              ; [C] select the IEC interface: EXTMEM must be 3, mode 98h, PB=20h, release lines
                                      ; <- F078 F0E6 F3BA F447 F510 F55E
F0B9  F5        PUSH PSW
F0BA  3A 0A FA  LDA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F0BD  FE 03     CPI 03H
F0BF  C2 36 F9  JNZ 0F936H          ; EDEVMM
F0C2  CD F3 F9  CALL 0F9F3H         ; 8255 mode 98h: PA in, PB out, PC0-3 out, PC4-7 in  [MODE98]
F0C5  3E 20     MVI A,20H           ; PB = 20h: DCE address of the IEC interface
F0C7  32 01 FE  STA 0FE01H          ; 8255 PB (DCE bus: device address) [F]
F0CA  3E 10     MVI A,10H           ; PC = 10h: PC0 DATA, PC1 CLK, PC3 ATN released
F0CC  32 02 FE  STA 0FE02H          ; 8255 PC (DCE bus) [F]
F0CF  E5        PUSH H
F0D0  21 00 00  LXI H,0000H         ; clear STAFLG/BUSFLG/ERRFLG/EOIFLG
F0D3  22 15 FA  SHLD 0FA15H         ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F0D6  22 17 FA  SHLD 0FA17H         ; ERRFLG [M]
F0D9  E1        POP H
F0DA  F1        POP PSW
F0DB  C9        RET

SETST:                               ; [C] STAFLG |= A
                                      ; <- F245 F2FB
F0DC  E5        PUSH H
F0DD  21 15 FA  LXI H,0FA15H        ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F0E0  B6        ORA M
F0E1  77        MOV M,A
F0E2  E1        POP H
F0E3  C9        RET

RDERR:                               ; [C] slot 33: read drive error channel 15 into ERRFLG, print it if not "00"
                                      ; <- F033 F26F F3C0 F423 F465 F537
F0E4  F5        PUSH PSW
F0E5  C5        PUSH B
F0E6  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F0E9  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F0EC  CD 87 F1  CALL 0F187H         ; TALK
F0EF  3E 6F     MVI A,6FH
F0F1  CD 44 F1  CALL 0F144H         ; TKSA
F0F4  CD 97 F2  CALL 0F297H         ; ACPTR
F0F7  47        MOV B,A
F0F8  CD 97 F2  CALL 0F297H         ; ACPTR
F0FB  4F        MOV C,A
F0FC  B0        ORA B
F0FD  D6 30     SUI 30H
F0FF  F5        PUSH PSW
F100  CA 13 F1  JZ 0F113H
F103  CD 55 DD  CALL 0DD55H         ; COL0 (CURSOR TO COLUMN 0)
F106  78        MOV A,B
F107  32 17 FA  STA 0FA17H          ; ERRFLG [M]
F10A  CD 60 DD  CALL 0DD60H         ; OUTC: output character A
LF10D:
                                      ; <- F119
F10D  F1        POP PSW
F10E  F5        PUSH PSW
F10F  79        MOV A,C
F110  C4 60 DD  CNZ 0DD60H          ; OUTC: output character A
LF113:
                                      ; <- F100
F113  CD 97 F2  CALL 0F297H         ; ACPTR
F116  4F        MOV C,A
F117  FE 0D     CPI 0DH
F119  C2 0D F1  JNZ 0F10DH
F11C  F1        POP PSW
F11D  CD 60 F1  CALL 0F160H         ; UNTALK
F120  C1        POP B
F121  F1        POP PSW
F122  C9        RET

RDBUS:                               ; [C] read PA until stable; CY = DATA in (PA7), S = CLK in (PA6)
                                      ; <- F159 F1D3 F1E5 F1EB F1F1 F201 F235
F123  E5        PUSH H
F124  21 00 FE  LXI H,0FE00H        ; 8255 PA (DCE bus) [F]
LF127:
                                      ; <- F129
F127  7E        MOV A,M             ; read PA twice until equal (debounce)
F128  BE        CMP M
F129  C2 27 F1  JNZ 0F127H
F12C  87        ADD A               ; CY = PA7 DATA in, S = PA6 CLK in
F12D  E1        POP H
F12E  C9        RET

DLY:                                 ; [C] short delay
                                      ; <- F179 F21C F2DA
F12F  F5        PUSH PSW
F130  3E 02     MVI A,02H
LF132:
                                      ; <- F133
F132  3D        DCR A
F133  C2 32 F1  JNZ 0F132H
F136  F1        POP PSW
F137  C9        RET

SECOND:                              ; [C] send secondary address after LISTEN, release ATN
                                      ; <- F310 F3D3 F41D F522
F138  32 11 FA  STA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F13B  CD C8 F1  CALL 0F1C8H         ; IECOUT
F13E  3E 06     MVI A,06H           ; PC3 = 0: release ATN
F140  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F143  C9        RET

TKSA:                                ; [C] send secondary address after TALK, turn bus around
                                      ; <- F0F1 F456 F578
F144  32 11 FA  STA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F147  CD C8 F1  CALL 0F1C8H         ; IECOUT
F14A  3E 01     MVI A,01H           ; PC0 = 1: pull DATA low
F14C  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F14F  3E 06     MVI A,06H           ; PC3 = 0: release ATN
F151  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F154  3E 02     MVI A,02H           ; PC1 = 0: release CLK
F156  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
LF159:
                                      ; <- F15C
F159  CD 23 F1  CALL 0F123H         ; wait until talker pulls CLK low  [RDBUS]
F15C  FA 59 F1  JM 0F159H
F15F  C9        RET

UNTALK:                              ; [C] send UNTALK (5Fh)
                                      ; <- F11D F2EC F462 F472 F4CB
F160  3E 03     MVI A,03H
F162  32 03 FE  STA 0FE03H          ; PC1 = 1: pull CLK low  [8255 control (mode / bit set-reset) [F]]
F165  3E 07     MVI A,07H
F167  32 03 FE  STA 0FE03H          ; PC3 = 1: assert ATN  [8255 control (mode / bit set-reset) [F]]
F16A  3E 5F     MVI A,5FH
F16C  C3 71 F1  JMP 0F171H

UNLSN:                               ; [C] send UNLISTEN (3Fh)
                                      ; <- F320 F406 F420 F534
F16F  3E 3F     MVI A,3FH
LF171:
                                      ; <- F16C
F171  CD 8E F1  CALL 0F18EH         ; ATNOUT

BUSREL:                              ; [C] release ATN, CLK and DATA; EI
                                      ; <- F24B
F174  3E 06     MVI A,06H
F176  32 03 FE  STA 0FE03H          ; PC3 = 0: release ATN  [8255 control (mode / bit set-reset) [F]]
LF179:
                                      ; <- F2DD
F179  CD 2F F1  CALL 0F12FH         ; DLY
F17C  3E 02     MVI A,02H
F17E  32 03 FE  STA 0FE03H          ; PC1 = 0: release CLK  [8255 control (mode / bit set-reset) [F]]
F181  AF        XRA A
F182  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA  [8255 control (mode / bit set-reset) [F]]
F185  FB        EI
F186  C9        RET

TALK:                                ; [C] send TALK (40h + device)
                                      ; <- F0EC F450 F572
F187  F6 40     ORI 40H
F189  C3 8E F1  JMP 0F18EH          ; ATNOUT

LISTEN:                              ; [C] send LISTEN (20h + device)
                                      ; <- F308 F3CD F413 F516
F18C  F6 20     ORI 20H

ATNOUT:                              ; [C] send command byte under ATN
                                      ; <- F171 F189
F18E  F5        PUSH PSW
F18F  3A 16 FA  LDA 0FA16H          ; BUSFLG [M]
F192  B7        ORA A
F193  F2 A5 F1  JP 0F1A5H
F196  F6 80     ORI 80H
F198  32 18 FA  STA 0FA18H          ; EOIFLG [M]
F19B  CD C8 F1  CALL 0F1C8H         ; IECOUT
F19E  AF        XRA A
F19F  32 16 FA  STA 0FA16H          ; BUSFLG [M]
F1A2  32 18 FA  STA 0FA18H          ; EOIFLG [M]
LF1A5:
                                      ; <- F193
F1A5  F1        POP PSW
F1A6  32 11 FA  STA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F1A9  F3        DI
F1AA  AF        XRA A
F1AB  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA  [8255 control (mode / bit set-reset) [F]]
F1AE  3E 02     MVI A,02H
F1B0  32 03 FE  STA 0FE03H          ; PC1 = 0: release CLK  [8255 control (mode / bit set-reset) [F]]
F1B3  3E 07     MVI A,07H
F1B5  32 03 FE  STA 0FE03H          ; PC3 = 1: assert ATN  [8255 control (mode / bit set-reset) [F]]
F1B8  F3        DI
F1B9  3E 03     MVI A,03H
F1BB  32 03 FE  STA 0FE03H          ; PC1 = 1: pull CLK low  [8255 control (mode / bit set-reset) [F]]
F1BE  AF        XRA A
F1BF  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA  [8255 control (mode / bit set-reset) [F]]
F1C2  3E 81     MVI A,81H           ; about 1 ms
LF1C4:
                                      ; <- F1C5
F1C4  3D        DCR A
F1C5  C2 C4 F1  JNZ 0F1C4H

IECOUT:                              ; [C] send byte BUSBUF to the bus (EOI if EOIFLG b7)
                                      ; <- F13B F147 F19B F28F
F1C8  C5        PUSH B
F1C9  D5        PUSH D
F1CA  E5        PUSH H
F1CB  3A 11 FA  LDA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F1CE  4F        MOV C,A
F1CF  AF        XRA A
F1D0  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA  [8255 control (mode / bit set-reset) [F]]
F1D3  CD 23 F1  CALL 0F123H         ; RDBUS
F1D6  DA 3E F2  JC 0F23EH           ; DATA still high: no device -> 80h  [ENODEV]
F1D9  3E 02     MVI A,02H
F1DB  32 03 FE  STA 0FE03H          ; PC1 = 0: release CLK (ready to send)  [8255 control (mode / bit set-reset) [F]]
F1DE  3A 18 FA  LDA 0FA18H          ; EOI requested?  [EOIFLG [M]]
F1E1  B7        ORA A
F1E2  F2 F1 F1  JP 0F1F1H
LF1E5:
                                      ; <- F1E8
F1E5  CD 23 F1  CALL 0F123H         ; EOI: wait DATA high, then low again  [RDBUS]
F1E8  D2 E5 F1  JNC 0F1E5H
LF1EB:
                                      ; <- F1EE
F1EB  CD 23 F1  CALL 0F123H         ; RDBUS
F1EE  DA EB F1  JC 0F1EBH
LF1F1:
                                      ; <- F1E2 F1F4
F1F1  CD 23 F1  CALL 0F123H         ; wait until listener releases DATA  [RDBUS]
F1F4  D2 F1 F1  JNC 0F1F1H
F1F7  3E 03     MVI A,03H
F1F9  32 03 FE  STA 0FE03H          ; PC1 = 1: pull CLK low  [8255 control (mode / bit set-reset) [F]]
F1FC  06 08     MVI B,08H           ; 8 bits, LSB first
F1FE  21 00 FE  LXI H,0FE00H        ; 8255 PA (DCE bus) [F]
F201  CD 23 F1  CALL 0F123H         ; RDBUS
F204  D2 43 F2  JNC 0F243H          ; DATA pulled early: timeout 01h  [ETIMW]
LF207:
                                      ; <- F229
F207  79        MOV A,C
F208  1F        RAR
F209  4F        MOV C,A
F20A  DA 12 F2  JC 0F212H
F20D  3E 01     MVI A,01H           ; bit 0: PC0 = 1 (DATA low)
F20F  C3 13 F2  JMP 0F213H
LF212:
                                      ; <- F20A
F212  AF        XRA A               ; bit 1: PC0 = 0 (DATA released)
LF213:
                                      ; <- F20F
F213  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F216  3E 02     MVI A,02H
F218  00        NOP
F219  32 03 FE  STA 0FE03H          ; PC1 = 0: release CLK = bit valid  [8255 control (mode / bit set-reset) [F]]
F21C  CD 2F F1  CALL 0F12FH         ; DLY
F21F  3E 03     MVI A,03H
F221  32 03 FE  STA 0FE03H          ; PC1 = 1: pull CLK low  [8255 control (mode / bit set-reset) [F]]
F224  AF        XRA A
F225  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA  [8255 control (mode / bit set-reset) [F]]
F228  05        DCR B
F229  C2 07 F2  JNZ 0F207H
F22C  11 A0 00  LXI D,00A0H         ; wait for listener to pull DATA low (byte acknowledged)
LF22F:
                                      ; <- F238
F22F  1B        DCX D
F230  7A        MOV A,D
F231  B3        ORA E
F232  CA 43 F2  JZ 0F243H           ; ETIMW
F235  CD 23 F1  CALL 0F123H         ; RDBUS
F238  DA 2F F2  JC 0F22FH
F23B  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers

ENODEV:                              ; [C] status 80h: device not present
                                      ; <- F1D6
F23E  3E 80     MVI A,80H
F240  C3 45 F2  JMP 0F245H          ; IECEND

ETIMW:                               ; [C] status 01h: write timeout
                                      ; <- F204 F232
F243  3E 01     MVI A,01H

IECEND:                              ; [C] set status, release bus, handle errors
                                      ; <- F240 F2F1
F245  CD DC F0  CALL 0F0DCH         ; SETST
F248  E1        POP H
F249  D1        POP D
F24A  C1        POP B
F24B  CD 74 F1  CALL 0F174H         ; BUSREL
F24E  3A 0F FA  LDA 0FA0FH          ; RSTFLG: reset-routine flag [M]
F251  B7        ORA A
F252  CA 55 F0  JZ 0F055H
F255  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F258  E6 03     ANI 03H
F25A  C2 6F F2  JNZ 0F26FH          ; EDRIVE
F25D  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F260  B7        ORA A
F261  FA 6A F2  JM 0F26AH           ; EFDDNA
F264  E6 40     ANI 40H
F266  C2 62 F4  JNZ 0F462H          ; ENOTF
F269  C9        RET

EFDDNA:                              ; [C] error 4 FDD NOT AVAILABLE
                                      ; <- F261 F51D
F26A  3E 04     MVI A,04H
F26C  C3 38 F9  JMP 0F938H          ; DOSERR

EDRIVE:                              ; [C] read error channel; error 5 OUT OF TIME or 6 (drive message)
                                      ; <- F25A
F26F  CD E4 F0  CALL 0F0E4H         ; RDERR
F272  3A 17 FA  LDA 0FA17H          ; ERRFLG [M]
F275  B7        ORA A
F276  3E 05     MVI A,05H
F278  CA 38 F9  JZ 0F938H           ; DOSERR
F27B  3C        INR A
F27C  C3 38 F9  JMP 0F938H          ; DOSERR

CIOUT:                               ; [C] buffered byte output (one byte delay, so the last byte can go with EOI)
                                      ; <- F319 F3B6 F3E4 F3F8 F3FE F52C
F27F  F5        PUSH PSW
F280  3A 16 FA  LDA 0FA16H          ; BUSFLG [M]
F283  B7        ORA A
F284  FA 8F F2  JM 0F28FH
F287  F6 80     ORI 80H
F289  32 16 FA  STA 0FA16H          ; BUSFLG [M]
F28C  C3 92 F2  JMP 0F292H
LF28F:
                                      ; <- F284
F28F  CD C8 F1  CALL 0F1C8H         ; IECOUT
LF292:
                                      ; <- F28C
F292  F1        POP PSW
F293  32 11 FA  STA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F296  C9        RET

ACPTR:                               ; [C] receive one byte from the talker; EOI sets STAFLG b6
                                      ; <- F0F4 F0F8 F113 F43D F4A3 F4BB F4C1 F58E F693 F6B8
F297  C5        PUSH B
F298  D5        PUSH D
F299  E5        PUSH H
F29A  06 00     MVI B,00H
F29C  21 00 FE  LXI H,0FE00H        ; 8255 PA (DCE bus) [F]
F29F  F3        DI                  ; wait until CLK released (talker ready)
LF2A0:
                                      ; <- F2A2
F2A0  7E        MOV A,M
F2A1  87        ADD A
F2A2  F2 A0 F2  JP 0F2A0H
LF2A5:
                                      ; <- F2FF
F2A5  0E FF     MVI C,0FFH
F2A7  AF        XRA A
F2A8  32 03 FE  STA 0FE03H          ; PC0 = 0: release DATA = ready for data  [8255 control (mode / bit set-reset) [F]]
LF2AB:
                                      ; <- F2B1
F2AB  0D        DCR C               ; timeout waiting for CLK low = EOI
F2AC  CA E7 F2  JZ 0F2E7H
F2AF  7E        MOV A,M
F2B0  87        ADD A
F2B1  FA AB F2  JM 0F2ABH
F2B4  06 08     MVI B,08H
LF2B6:
                                      ; <- F2B8 F2C4
F2B6  7E        MOV A,M             ; wait CLK high; CY = DATA = bit
F2B7  87        ADD A
F2B8  F2 B6 F2  JP 0F2B6H
F2BB  79        MOV A,C             ; shift bit into C, LSB first
F2BC  1F        RAR
F2BD  4F        MOV C,A
LF2BE:
                                      ; <- F2C0
F2BE  7E        MOV A,M             ; wait CLK low
F2BF  87        ADD A
F2C0  FA BE F2  JM 0F2BEH
F2C3  05        DCR B
F2C4  C2 B6 F2  JNZ 0F2B6H
F2C7  FB        EI
LF2C8:
                                      ; <- F2CA
F2C8  7E        MOV A,M
F2C9  87        ADD A
F2CA  FA C8 F2  JM 0F2C8H
F2CD  3E 01     MVI A,01H
F2CF  32 03 FE  STA 0FE03H          ; PC0 = 1: pull DATA low = byte acknowledged  [8255 control (mode / bit set-reset) [F]]
F2D2  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F2D5  E6 40     ANI 40H
F2D7  CA E0 F2  JZ 0F2E0H
F2DA  CD 2F F1  CALL 0F12FH         ; DLY
F2DD  CD 79 F1  CALL 0F179H
LF2E0:
                                      ; <- F2D7
F2E0  79        MOV A,C
F2E1  32 11 FA  STA 0FA11H          ; BUSBUF: IEC byte buffer [M]
F2E4  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers
LF2E7:
                                      ; <- F2AC
F2E7  78        MOV A,B             ; second timeout: read timeout 02h
F2E8  B7        ORA A
F2E9  CA F4 F2  JZ 0F2F4H
F2EC  CD 60 F1  CALL 0F160H         ; UNTALK
F2EF  3E 02     MVI A,02H
F2F1  C3 45 F2  JMP 0F245H          ; IECEND
LF2F4:
                                      ; <- F2E9
F2F4  3E 01     MVI A,01H
F2F6  32 03 FE  STA 0FE03H          ; PC0 = 1: EOI acknowledge  [8255 control (mode / bit set-reset) [F]]
F2F9  3E 40     MVI A,40H
F2FB  CD DC F0  CALL 0F0DCH         ; set EOF (40h) in STAFLG  [SETST]
F2FE  04        INR B
F2FF  C3 A5 F2  JMP 0F2A5H

SNDNAM:                              ; [C] LISTEN, OPEN secondary (SEKAD|F0h), send FILBUF, UNLISTEN
                                      ; <- F3BD F44A F56C
F302  F5        PUSH PSW
F303  D5        PUSH D
F304  E5        PUSH H
F305  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F308  CD 8C F1  CALL 0F18CH         ; LISTEN
F30B  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F30E  F6 F0     ORI 0F0H            ; secondary | F0h = OPEN
F310  CD 38 F1  CALL 0F138H         ; SECOND
F313  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F316  5E        MOV E,M
LF317:
                                      ; <- F31D
F317  23        INX H
F318  7E        MOV A,M
F319  CD 7F F2  CALL 0F27FH         ; CIOUT
F31C  1D        DCR E
F31D  C2 17 F3  JNZ 0F317H
F320  CD 6F F1  CALL 0F16FH         ; UNLSN
F323  C3 1D D1  JMP 0D11DH          ; in APPEND TWO STRINGS

NAMEW:                               ; [C] build "name,<type>,W" in FILBUF
                                      ; <- F3A5
F326  F5        PUSH PSW
F327  CD 90 F3  CALL 0F390H         ; FTYPE
F32A  3E 57     MVI A,57H
F32C  C3 36 F3  JMP 0F336H

NAMER:                               ; [C] build "name,<type>,R" in FILBUF
                                      ; <- F42F
F32F  F5        PUSH PSW
F330  78        MOV A,B
F331  CD 90 F3  CALL 0F390H         ; FTYPE
F334  3E 52     MVI A,52H
LF336:
                                      ; <- F32C
F336  32 14 FA  STA 0FA14H          ; RWFLG: R/W [M]
F339  C5        PUSH B
F33A  D5        PUSH D
F33B  E5        PUSH H
F33C  06 10     MVI B,10H
F33E  23        INX H
F33F  7E        MOV A,M
F340  FE 25     CPI 25H
F342  C2 47 F3  JNZ 0F347H
F345  04        INR B
F346  04        INR B
LF347:
                                      ; <- F342
F347  2B        DCX H
F348  7E        MOV A,M
F349  B7        ORA A
F34A  CA 10 F9  JZ 0F910H           ; ESYNTX
F34D  B8        CMP B
F34E  DA 52 F3  JC 0F352H
F351  78        MOV A,B
LF352:
                                      ; <- F34E
F352  F5        PUSH PSW
F353  54        MOV D,H
F354  5D        MOV E,L
F355  01 1E FA  LXI B,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F358  3C        INR A
F359  6F        MOV L,A
F35A  26 00     MVI H,00H
F35C  19        DAD D
F35D  CD 4F DE  CALL 0DE4FH         ; MOVE: block transfer DE..HL -> BC
F360  21 1F FA  LXI H,0FA1FH        ; FILBUF+1
F363  7E        MOV A,M
F364  FE 25     CPI 25H
F366  C2 73 F3  JNZ 0F373H
F369  23        INX H
F36A  7E        MOV A,M
F36B  FE 3A     CPI 3AH
F36D  C2 10 F9  JNZ 0F910H          ; ESYNTX
F370  2B        DCX H
F371  36 40     MVI M,40H
LF373:
                                      ; <- F366
F373  2B        DCX H
F374  F1        POP PSW
F375  C6 04     ADI 04H
F377  77        MOV M,A
F378  DE 03     SBI 03H
F37A  5F        MOV E,A
F37B  16 00     MVI D,00H
F37D  19        DAD D
F37E  36 2C     MVI M,2CH
F380  23        INX H
F381  3A 13 FA  LDA 0FA13H          ; FILTYP: P/S/U [M]
F384  77        MOV M,A
F385  23        INX H
F386  36 2C     MVI M,2CH
F388  23        INX H
F389  3A 14 FA  LDA 0FA14H          ; RWFLG: R/W [M]
F38C  77        MOV M,A
F38D  C3 4D C1  JMP 0C14DH          ; back to BASIC (EXIT)  [EXIT: POP H, POP D, POP B, POP PSW, RET]

FTYPE:                               ; [C] DAI file type -> P (0), U (1) or S (other)
                                      ; <- F327 F331
F390  FE 30     CPI 30H
F392  CA 9E F3  JZ 0F39EH
F395  FE 31     CPI 31H
F397  CA 9C F3  JZ 0F39CH
F39A  3E 2F     MVI A,2FH
LF39C:
                                      ; <- F397
F39C  C6 04     ADI 04H
LF39E:
                                      ; <- F392
F39E  C6 20     ADI 20H
F3A0  32 13 FA  STA 0FA13H          ; FILTYP: P/S/U [M]
F3A3  C9        RET

FWOPEN:                              ; [C] slot 09: WOPEN on disk
                                      ; <- F009
F3A4  F5        PUSH PSW
F3A5  CD 26 F3  CALL 0F326H         ; NAMEW
F3A8  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F3AB  36 00     MVI M,00H
F3AD  3E 62     MVI A,62H
F3AF  32 12 FA  STA 0FA12H          ; SEKAD: IEC secondary address [M]
F3B2  CD BA F3  CALL 0F3BAH         ; FOPENW
F3B5  F1        POP PSW
F3B6  CD 7F F2  CALL 0F27FH         ; CIOUT
F3B9  C9        RET

FOPENW:                              ; [C] open file on channel 2 for writing
                                      ; <- F3B2
F3BA  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F3BD  CD 02 F3  CALL 0F302H         ; SNDNAM
F3C0  CD E4 F0  CALL 0F0E4H         ; RDERR
F3C3  3A 17 FA  LDA 0FA17H          ; ERRFLG [M]
F3C6  B7        ORA A
F3C7  C2 68 F4  JNZ 0F468H
F3CA  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F3CD  CD 8C F1  CALL 0F18CH         ; LISTEN
F3D0  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F3D3  CD 38 F1  CALL 0F138H         ; SECOND
F3D6  C9        RET

FWBLK:                               ; [C] slot 0C: WBLK: write length, data, checksum (seed 56h)
                                      ; <- F00C
F3D7  C5        PUSH B
F3D8  D5        PUSH D
F3D9  06 56     MVI B,56H
F3DB  7A        MOV A,D
F3DC  CD FE F3  CALL 0F3FEH         ; WRCK
F3DF  7B        MOV A,E
F3E0  CD FE F3  CALL 0F3FEH         ; WRCK
F3E3  78        MOV A,B
F3E4  CD 7F F2  CALL 0F27FH         ; CIOUT
F3E7  06 56     MVI B,56H
LF3E9:
                                      ; <- F3F4
F3E9  7A        MOV A,D
F3EA  B3        ORA E
F3EB  CA F7 F3  JZ 0F3F7H
F3EE  1B        DCX D
F3EF  7E        MOV A,M
F3F0  23        INX H
F3F1  CD FE F3  CALL 0F3FEH         ; WRCK
F3F4  C3 E9 F3  JMP 0F3E9H
LF3F7:
                                      ; <- F3EB
F3F7  78        MOV A,B
F3F8  CD 7F F2  CALL 0F27FH         ; CIOUT
F3FB  D1        POP D
F3FC  C1        POP B
F3FD  C9        RET

WRCK:                                ; [C] write byte, update checksum B
                                      ; <- F3DC F3E0 F3F1
F3FE  CD 7F F2  CALL 0F27FH         ; CIOUT
F401  A8        XRA B
F402  07        RLC
F403  47        MOV B,A
F404  C9        RET

FWCLOS:                              ; [C] slot 0F: WCLOSE / close channel
                                      ; <- F00F
F405  F5        PUSH PSW
F406  CD 6F F1  CALL 0F16FH         ; UNLSN
LF409:
                                      ; <- F4CE F77F
F409  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F40C  B7        ORA A
F40D  FA 23 F4  JM 0F423H
F410  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F413  CD 8C F1  CALL 0F18CH         ; LISTEN
F416  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F419  E6 EF     ANI 0EFH
F41B  F6 E0     ORI 0E0H
F41D  CD 38 F1  CALL 0F138H         ; SECOND
F420  CD 6F F1  CALL 0F16FH         ; UNLSN
LF423:
                                      ; <- F40D
F423  CD E4 F0  CALL 0F0E4H         ; RDERR
F426  3A 17 FA  LDA 0FA17H          ; ERRFLG [M]
F429  B7        ORA A
F42A  C2 68 F4  JNZ 0F468H
F42D  F1        POP PSW
F42E  C9        RET

FROPEN:                              ; [C] slot 12: ROPEN on disk
                                      ; <- F012
F42F  CD 2F F3  CALL 0F32FH         ; NAMER
F432  3E 62     MVI A,62H
F434  32 12 FA  STA 0FA12H          ; SEKAD: IEC secondary address [M]
F437  CD 8F D9  CALL 0D98FH         ; SNDDI (DISABLE SOUND INTERRUPTS)
F43A  CD 47 F4  CALL 0F447H         ; FOPENR
F43D  CD 97 F2  CALL 0F297H         ; ACPTR
F440  F5        PUSH PSW
F441  90        SUB B
F442  C2 6D F4  JNZ 0F46DH          ; ETYPE
LF445:
                                      ; <- F46F
F445  F1        POP PSW
F446  C9        RET

FOPENR:                              ; [C] open file for reading (TALK, TKSA)
                                      ; <- F43A F690
F447  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F44A  CD 02 F3  CALL 0F302H         ; SNDNAM
F44D  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F450  CD 87 F1  CALL 0F187H         ; TALK
F453  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F456  CD 44 F1  CALL 0F144H         ; TKSA
F459  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F45C  E6 40     ANI 40H
F45E  C2 62 F4  JNZ 0F462H          ; ENOTF
F461  C9        RET

ENOTF:                               ; [C] error 6 (drive message)
                                      ; <- F266 F45E
F462  CD 60 F1  CALL 0F160H         ; UNTALK
F465  CD E4 F0  CALL 0F0E4H         ; RDERR
LF468:
                                      ; <- F3C7 F42A F53F
F468  3E 06     MVI A,06H
F46A  C3 38 F9  JMP 0F938H          ; DOSERR

ETYPE:                               ; [C] error 3 FILE TYPE MISMATCH
                                      ; <- F442
F46D  05        DCR B
F46E  04        INR B
F46F  CA 45 F4  JZ 0F445H
F472  CD 60 F1  CALL 0F160H         ; UNTALK
LF475:
                                      ; <- F767
F475  3E 03     MVI A,03H
F477  C3 38 F9  JMP 0F938H          ; DOSERR

FRBLK:                               ; [C] slot 15: RBLK: read length, data, checksum
                                      ; <- F015
F47A  C5        PUSH B
F47B  D5        PUSH D
F47C  E5        PUSH H
F47D  CD 90 D7  CALL 0D790H         ; MPT25: calculate free space
F480  EB        XCHG
F481  CD B0 F4  CALL 0F4B0H         ; RDHDR
F484  B7        ORA A
F485  3E 00     MVI A,00H
F487  C2 AC F4  JNZ 0F4ACH
F48A  E5        PUSH H
F48B  19        DAD D
F48C  D1        POP D
F48D  3C        INR A
F48E  E1        POP H
F48F  E5        PUSH H
F490  DA AC F4  JC 0F4ACH
F493  06 56     MVI B,56H
LF495:
                                      ; <- F4A0
F495  7A        MOV A,D
F496  B3        ORA E
F497  CA A3 F4  JZ 0F4A3H
F49A  1B        DCX D
F49B  CD C1 F4  CALL 0F4C1H         ; RDCK
F49E  77        MOV M,A
F49F  23        INX H
F4A0  C3 95 F4  JMP 0F495H
LF4A3:
                                      ; <- F497
F4A3  CD 97 F2  CALL 0F297H         ; ACPTR
F4A6  B8        CMP B
F4A7  3E 02     MVI A,02H
F4A9  CA B4 C6  JZ 0C6B4H           ; MPT26: READ BLOCK exit, CY=1 = no error
LF4AC:
                                      ; <- F487 F490
F4AC  B7        ORA A
F4AD  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers

RDHDR:                               ; [C] read 2-byte length with checksum
                                      ; <- F481 F6A4
F4B0  C5        PUSH B
F4B1  06 56     MVI B,56H
F4B3  CD C1 F4  CALL 0F4C1H         ; RDCK
F4B6  67        MOV H,A
F4B7  CD C1 F4  CALL 0F4C1H         ; RDCK
F4BA  6F        MOV L,A
F4BB  CD 97 F2  CALL 0F297H         ; ACPTR
F4BE  90        SUB B
F4BF  C1        POP B
F4C0  C9        RET

RDCK:                                ; [C] read byte, update checksum B
                                      ; <- F49B F4B3 F4B7 F6AF
F4C1  CD 97 F2  CALL 0F297H         ; ACPTR
F4C4  F5        PUSH PSW
F4C5  A8        XRA B
F4C6  07        RLC
F4C7  47        MOV B,A
F4C8  F1        POP PSW
F4C9  C9        RET

FRCLOS:                              ; [C] slot 18: RCLOSE
                                      ; <- F018 F5F6 F69D F71F
F4CA  F5        PUSH PSW
F4CB  CD 60 F1  CALL 0F160H         ; UNTALK
F4CE  C3 09 F4  JMP 0F409H

UICMD:                               ; [C] send "UI-" (VIC-20 bus speed) to the drive
                                      ; <- F087
F4D1  E5        PUSH H
F4D2  21 1F FA  LXI H,0FA1FH        ; FILBUF+1
F4D5  36 55     MVI M,55H           ; "UI-" + CR
F4D7  23        INX H
F4D8  36 49     MVI M,49H
F4DA  23        INX H
F4DB  36 2D     MVI M,2DH
F4DD  23        INX H
F4DE  3E 0D     MVI A,0DH
F4E0  C3 0C F5  JMP 0F50CH

CMDI:                                ; [C] slot 27: INIT -> "I"
                                      ; <- F027
F4E3  3E 49     MVI A,49H
F4E5  C3 EA F4  JMP 0F4EAH

CMDV:                                ; [C] slot 2A: VALID -> "V"
                                      ; <- F02A
F4E8  3E 56     MVI A,56H
LF4EA:
                                      ; <- F4E5
F4EA  E5        PUSH H
F4EB  F5        PUSH PSW
F4EC  3E 0D     MVI A,0DH
F4EE  C3 06 F5  JMP 0F506H

CMDN:                                ; [C] slot 1B: FORMAT -> "N:name,id"
                                      ; <- F01B
F4F1  3E 4E     MVI A,4EH
F4F3  C3 02 F5  JMP 0F502H          ; DOSCMD

CMDS:                                ; [C] slot 1E: SCRATCH -> "S:"
                                      ; <- F01E
F4F6  3E 53     MVI A,53H
F4F8  C3 02 F5  JMP 0F502H          ; DOSCMD

CMDR:                                ; [C] slot 21: RENAME -> "R:"
                                      ; <- F021
F4FB  3E 52     MVI A,52H
F4FD  C3 02 F5  JMP 0F502H          ; DOSCMD

CMDC:                                ; [C] slot 24: COPY -> "C:"
                                      ; <- F024
F500  3E 43     MVI A,43H

DOSCMD:                              ; [C] send "<c>:" + FILBUF on command channel 15
                                      ; <- F4F3 F4F8 F4FD
F502  E5        PUSH H
F503  F5        PUSH PSW
F504  3E 3A     MVI A,3AH
LF506:
                                      ; <- F4EE
F506  21 20 FA  LXI H,0FA20H        ; FILBUF+2
F509  77        MOV M,A
F50A  F1        POP PSW
F50B  2B        DCX H
LF50C:
                                      ; <- F4E0
F50C  77        MOV M,A
F50D  CD 44 F5  CALL 0F544H         ; SETLEN
F510  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F513  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F516  CD 8C F1  CALL 0F18CH         ; LISTEN
F519  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F51C  B7        ORA A
F51D  FA 6A F2  JM 0F26AH           ; EFDDNA
F520  3E FF     MVI A,0FFH
F522  CD 38 F1  CALL 0F138H         ; SECOND
F525  D5        PUSH D
F526  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F529  5E        MOV E,M
LF52A:
                                      ; <- F530
F52A  23        INX H
F52B  7E        MOV A,M
F52C  CD 7F F2  CALL 0F27FH         ; CIOUT
F52F  1D        DCR E
F530  C2 2A F5  JNZ 0F52AH
F533  D1        POP D
F534  CD 6F F1  CALL 0F16FH         ; UNLSN
F537  CD E4 F0  CALL 0F0E4H         ; RDERR
F53A  3A 17 FA  LDA 0FA17H          ; ERRFLG [M]
F53D  FE 31     CPI 31H
F53F  D2 68 F4  JNC 0F468H
F542  E1        POP H
F543  C9        RET

SETLEN:                              ; [C] store length of the CR-terminated string in FILBUF
                                      ; <- F50D F751
F544  E5        PUSH H
F545  C5        PUSH B
F546  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F549  06 FF     MVI B,0FFH
LF54B:
                                      ; <- F550
F54B  04        INR B
F54C  23        INX H
F54D  7E        MOV A,M
F54E  FE 0D     CPI 0DH
F550  C2 4B F5  JNZ 0F54BH
F553  78        MOV A,B
F554  32 1E FA  STA 0FA1EH          ; FILBUF: I/O buffer (length byte) [M]
F557  C1        POP B
F558  E1        POP H
F559  C9        RET

DIR:                                 ; [C] slot 2D: DIR: read "$" and list it on screen, cursor keys select a file
                                      ; <- F02D
F55A  F5        PUSH PSW
F55B  C5        PUSH B
F55C  D5        PUSH D
F55D  E5        PUSH H
F55E  CD B9 F0  CALL 0F0B9H         ; FDDSEL
F561  3E 60     MVI A,60H
F563  32 12 FA  STA 0FA12H          ; SEKAD: IEC secondary address [M]
F566  21 01 24  LXI H,2401H         ; "$" + CR: directory
F569  22 1E FA  SHLD 0FA1EH         ; FILBUF: I/O buffer (length byte) [M]
F56C  CD 02 F3  CALL 0F302H         ; SNDNAM
F56F  3A 10 FA  LDA 0FA10H          ; FDDSL: FDD primary address 08-0B [M]
F572  CD 87 F1  CALL 0F187H         ; TALK
F575  3A 12 FA  LDA 0FA12H          ; SEKAD: IEC secondary address [M]
F578  CD 44 F1  CALL 0F144H         ; TKSA
F57B  3E FF     MVI A,0FFH
F57D  EF        RST 5               ; RST 5 (screen) fn 18h: Change to mode 0
F57E  18        DB 18H              ; inline function code
F57F  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F582  3E 0C     MVI A,0CH
F584  EF        RST 5               ; RST 5 (screen) fn 03h: Character to screen
F585  03        DB 03H              ; inline function code
F586  06 15     MVI B,15H
LF588:
                                      ; <- F5CB F5DC F5F0
F588  0E 20     MVI C,20H
F58A  21 1D FA  LXI H,0FA1DH        ; SERBD: printer baud rate [M]
LF58D:
                                      ; <- F593
F58D  23        INX H
F58E  CD 97 F2  CALL 0F297H         ; ACPTR
F591  77        MOV M,A
F592  0D        DCR C
F593  C2 8D F5  JNZ 0F58DH
F596  36 0D     MVI M,0DH
F598  23        INX H
F599  36 00     MVI M,00H
F59B  3A 22 FA  LDA 0FA22H          ; FILBUF+4
F59E  B7        ORA A
F59F  CA BC F5  JZ 0F5BCH
F5A2  FE 20     CPI 20H
F5A4  CA CE F5  JZ 0F5CEH
F5A7  3A 15 FA  LDA 0FA15H          ; STAFLG: FDD status (b7 not present, b6 EOF, b1 rd timeout, b0 wr timeout) [M]
F5AA  E6 BF     ANI 0BFH
F5AC  C2 F3 F5  JNZ 0F5F3H
F5AF  CD FC F5  CALL 0F5FCH         ; DIRENT
F5B2  23        INX H
F5B3  CD D4 DA  CALL 0DAD4H         ; PMSG: print message at HL
F5B6  CD BF F6  CALL 0F6BFH         ; DIRKEY
F5B9  C3 F3 F5  JMP 0F5F3H
LF5BC:
                                      ; <- F59F
F5BC  0E 05     MVI C,05H
LF5BE:
                                      ; <- F5C2
F5BE  CD 6B CE  CALL 0CE6BH         ; SCHSP: print a space
F5C1  0D        DCR C
F5C2  C2 BE F5  JNZ 0F5BEH
F5C5  21 25 FA  LXI H,0FA25H        ; FILBUF+7
F5C8  CD D4 DA  CALL 0DAD4H         ; PMSG: print message at HL
F5CB  C3 88 F5  JMP 0F588H
LF5CE:
                                      ; <- F5A4
F5CE  CD FC F5  CALL 0F5FCH         ; DIRENT
LF5D1:
                                      ; <- F5D5
F5D1  23        INX H
F5D2  7E        MOV A,M
F5D3  FE 22     CPI 22H
F5D5  C2 D1 F5  JNZ 0F5D1H
F5D8  CD D4 DA  CALL 0DAD4H         ; PMSG: print message at HL
F5DB  05        DCR B
F5DC  C2 88 F5  JNZ 0F588H
F5DF  CD BF F6  CALL 0F6BFH         ; DIRKEY
F5E2  FE 12     CPI 12H
F5E4  CA F3 F5  JZ 0F5F3H
F5E7  3E 0C     MVI A,0CH
F5E9  EF        RST 5               ; RST 5 (screen) fn 03h: Character to screen
F5EA  03        DB 03H              ; inline function code
F5EB  3C        INR A
F5EC  EF        RST 5               ; RST 5 (screen) fn 03h: Character to screen
F5ED  03        DB 03H              ; inline function code
F5EE  06 15     MVI B,15H
F5F0  C3 88 F5  JMP 0F588H
LF5F3:
                                      ; <- F5AC F5B9 F5E4
F5F3  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F5F6  CD CA F4  CALL 0F4CAH         ; FRCLOS
F5F9  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET

DIRENT:                              ; [C] print one directory entry (blocks, name, type)
                                      ; <- F5AF F5CE
F5FC  C5        PUSH B
F5FD  2A 20 FA  LHLD 0FA20H         ; FILBUF+2
F600  AF        XRA A
F601  C5        PUSH B
F602  D5        PUSH D
F603  4C        MOV C,H
F604  55        MOV D,L
F605  47        MOV B,A
F606  E7        RST 4               ; RST 4 (maths) fn 12h: Copy mantissa to MACC
F607  12        DB 12H              ; inline function code
F608  D1        POP D
F609  C1        POP B
F60A  CD 5F DB  CALL 0DB5FH         ; IBCP (CONVERT MACC FOR FIXED POINT OUTPUT)
F60D  2A 33 C0  LHLD 0C033H
F610  D5        PUSH D
F611  56        MOV D,M
F612  23        INX H
F613  7E        MOV A,M
F614  FE 20     CPI 20H
F616  C2 1B F6  JNZ 0F61BH
F619  23        INX H
F61A  15        DCR D
LF61B:
                                      ; <- F616
F61B  7A        MOV A,D
F61C  D1        POP D
F61D  CD 44 DB  CALL 0DB44H         ; PSTRM (PRINT STRING MESSAGE)
F620  21 E3 00  LXI H,00E3H
F623  3E 06     MVI A,06H
F625  96        SUB M
F626  47        MOV B,A
LF627:
                                      ; <- F62B
F627  CD 6B CE  CALL 0CE6BH         ; SCHSP: print a space
F62A  05        DCR B
F62B  C2 27 F6  JNZ 0F627H
F62E  C1        POP B
F62F  21 21 FA  LXI H,0FA21H        ; FILBUF+3: parsed string operand
F632  C9        RET

FVER1:                               ; [C] slot 30: FVER: verify file checksums
                                      ; <- F030
F633  F5        PUSH PSW
F634  C5        PUSH B
F635  D5        PUSH D
F636  E5        PUSH H
F637  3E 62     MVI A,62H
F639  32 12 FA  STA 0FA12H          ; SEKAD: IEC secondary address [M]
F63C  11 20 FA  LXI D,0FA20H        ; FILBUF+2
F63F  21 1E FA  LXI H,0FA1EH        ; FILBUF: I/O buffer (length byte) [M]
F642  E5        PUSH H
F643  06 FF     MVI B,0FFH
LF645:
                                      ; <- F64C
F645  13        INX D
F646  23        INX H
F647  04        INR B
F648  1A        LDAX D
F649  77        MOV M,A
F64A  FE 0D     CPI 0DH
F64C  C2 45 F6  JNZ 0F645H
F64F  E1        POP H
F650  70        MOV M,B
F651  2A 00 01  LHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F654  7C        MOV A,H
F655  B5        ORA L
F656  F3        DI
F657  C2 73 F6  JNZ 0F673H
F65A  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F65D  CD 90 F6  CALL 0F690H         ; VERFIL
F660  C2 6B F6  JNZ 0F66BH
F663  CD FF DA  CALL 0DAFFH         ; PMSGR: print " OK\r"
F666  C0 DB     DW 0DBC0H           ; inline message pointer
F668  C3 8C F6  JMP 0F68CH
LF66B:
                                      ; <- F660
F66B  CD FF DA  CALL 0DAFFH         ; PMSGR: print " BAD"
F66E  DB DB     DW 0DBDBH           ; inline message pointer
F670  C3 8C F6  JMP 0F68CH
LF673:
                                      ; <- F657
F673  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F676  E5        PUSH H
F677  21 00 00  LXI H,0000H
F67A  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F67D  CD 90 F6  CALL 0F690H         ; VERFIL
F680  CA 85 F6  JZ 0F685H
F683  3E 01     MVI A,01H
LF685:
                                      ; <- F680
F685  E1        POP H
F686  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F689  CD 4E F9  CALL 0F94EH         ; ERRCOD0
LF68C:
                                      ; <- F668 F670
F68C  FB        EI
F68D  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET

VERFIL:                              ; [C] open and verify all blocks of the file
                                      ; <- F65D F67D
F690  CD 47 F4  CALL 0F447H         ; FOPENR
F693  CD 97 F2  CALL 0F297H         ; ACPTR
F696  AF        XRA A
F697  CD A1 F6  CALL 0F6A1H         ; VERBLK
F69A  CC A1 F6  CZ 0F6A1H           ; VERBLK
F69D  CD CA F4  CALL 0F4CAH         ; FRCLOS
F6A0  C9        RET

VERBLK:                              ; [C] verify one block
                                      ; <- F697 F69A
F6A1  C5        PUSH B
F6A2  D5        PUSH D
F6A3  E5        PUSH H
F6A4  CD B0 F4  CALL 0F4B0H         ; RDHDR
F6A7  B7        ORA A
F6A8  C2 BC F6  JNZ 0F6BCH
F6AB  E5        PUSH H
F6AC  D1        POP D
F6AD  06 56     MVI B,56H
LF6AF:
                                      ; <- F6B5
F6AF  CD C1 F4  CALL 0F4C1H         ; RDCK
F6B2  1B        DCX D
F6B3  7A        MOV A,D
F6B4  B3        ORA E
F6B5  C2 AF F6  JNZ 0F6AFH
F6B8  CD 97 F2  CALL 0F297H         ; ACPTR
F6BB  B8        CMP B
LF6BC:
                                      ; <- F6A8
F6BC  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers

DIRKEY:                              ; [C] directory cursor: up/down select, shift+right load, left exit, space next page
                                      ; <- F5B6 F5DF
F6BF  C5        PUSH B
F6C0  D5        PUSH D
F6C1  E5        PUSH H
F6C2  2A 74 00  LHLD 0074H          ; cursor type [F]
F6C5  22 0D FA  SHLD 0FA0DH         ; MEMCUR: saved cursor [M]
F6C8  21 74 00  LXI H,0074H
F6CB  36 01     MVI M,01H
F6CD  23        INX H
F6CE  36 3C     MVI M,3CH
F6D0  21 1E 16  LXI H,161EH
LF6D3:
                                      ; <- F6F8 F70E F712 F718 F71C
F6D3  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F6D4  09        DB 09H              ; inline function code
LF6D5:
                                      ; <- F6DA F6DF
F6D5  CD 96 F9  CALL 0F996H         ; GETKEY
F6D8  FE 10     CPI 10H
F6DA  DA D5 F6  JC 0F6D5H
F6DD  FE 21     CPI 21H
F6DF  D2 D5 F6  JNC 0F6D5H
F6E2  FE 10     CPI 10H
F6E4  CA 0B F7  JZ 0F70BH
F6E7  FE 11     CPI 11H
F6E9  CA 15 F7  JZ 0F715H
F6EC  FE 12     CPI 12H
F6EE  CA FB F6  JZ 0F6FBH
F6F1  FE 17     CPI 17H
F6F3  CA 1F F7  JZ 0F71FH
F6F6  FE 20     CPI 20H
F6F8  C2 D3 F6  JNZ 0F6D3H
LF6FB:
                                      ; <- F6EE
F6FB  F5        PUSH PSW
F6FC  2A 0D FA  LHLD 0FA0DH         ; MEMCUR: saved cursor [M]
F6FF  22 74 00  SHLD 0074H          ; cursor type [F]
F702  21 00 01  LXI H,0100H
F705  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F706  09        DB 09H              ; inline function code
F707  F1        POP PSW
F708  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers
LF70B:
                                      ; <- F6E4
F70B  7C        MOV A,H
F70C  FE 17     CPI 17H
F70E  CA D3 F6  JZ 0F6D3H
F711  24        INR H
F712  C3 D3 F6  JMP 0F6D3H
LF715:
                                      ; <- F6E9
F715  7C        MOV A,H
F716  FE 02     CPI 02H
F718  CA D3 F6  JZ 0F6D3H
F71B  25        DCR H
F71C  C3 D3 F6  JMP 0F6D3H
LF71F:
                                      ; <- F6F3
F71F  CD CA F4  CALL 0F4CAH         ; FRCLOS
F722  E5        PUSH H
F723  2A 0D FA  LHLD 0FA0DH         ; MEMCUR: saved cursor [M]
F726  22 74 00  SHLD 0074H          ; cursor type [F]
F729  E1        POP H
F72A  2E 05     MVI L,05H
F72C  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F72D  09        DB 09H              ; inline function code
F72E  2A 72 00  LHLD 0072H          ; cursor address [F]

DIRLD:                               ; [C] load the selected directory entry (P = BASIC, U = UTILITY)
F731  06 15     MVI B,15H
F733  11 1F FA  LXI D,0FA1FH        ; FILBUF+1
LF736:
                                      ; <- F73C
F736  2B        DCX H
F737  2B        DCX H
F738  7E        MOV A,M
F739  12        STAX D
F73A  13        INX D
F73B  05        DCR B
F73C  C2 36 F7  JNZ 0F736H
F73F  21 31 FA  LXI H,0FA31H        ; FILBUF+19
F742  06 13     MVI B,13H
LF744:
                                      ; <- F74C
F744  05        DCR B
F745  CA 62 F7  JZ 0F762H
F748  2B        DCX H
F749  7E        MOV A,M
F74A  FE 22     CPI 22H
F74C  C2 44 F7  JNZ 0F744H
F74F  36 0D     MVI M,0DH
F751  CD 44 F5  CALL 0F544H         ; SETLEN
F754  21 31 FA  LXI H,0FA31H        ; FILBUF+19
F757  7E        MOV A,M
F758  FE 50     CPI 50H
F75A  CA 6A F7  JZ 0F76AH
F75D  FE 55     CPI 55H
F75F  CA 76 F7  JZ 0F776H
LF762:
                                      ; <- F745
F762  21 00 01  LXI H,0100H
F765  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F766  09        DB 09H              ; inline function code
F767  C3 75 F4  JMP 0F475H
LF76A:
                                      ; <- F75A
F76A  21 00 00  LXI H,0000H
F76D  22 00 01  SHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F770  24        INR H
F771  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F772  09        DB 09H              ; inline function code
F773  C3 A1 F9  JMP 0F9A1H          ; LOADB
LF776:
                                      ; <- F75F
F776  21 00 01  LXI H,0100H
F779  EF        RST 5               ; RST 5 (screen) fn 09h: Set cursor position
F77A  09        DB 09H              ; inline function code
F77B  C3 BF F9  JMP 0F9BFH          ; LOADU

CLOSE:                               ; [C] slot 36: close file (manual CALLM #F2ED)
                                      ; <- F036
F77E  F5        PUSH PSW
F77F  C3 09 F4  JMP 0F409H

FREE1:                               ; [C] unused (00)
F782  00 x48    DS 48               ; unused (00)

BANN1:                               ; [C] sign-on text "DAI COMPUTER  DOS 1541"
F7B2            DB 0DH,0DH,0DH,0DH,0DH,0DH
                DB ' DAI COMPUTER              DOS 1541',0DH,0; "\r\r\r\r\r\r DAI COMPUTER              DOS 1541\r"

RSTMS1:                              ; [C] show sign-on (F900 SIGNON)
                                      ; <- F05D
F7DD  CD 6E F9  CALL 0F96EH         ; SIGNON
F7E0  C9        RET

PRBAN1:                              ; [C] print BANN1
F7E1  CD FF DA  CALL 0DAFFH         ; PMSGR: print "\r\r\r\r\r\r DAI COMPUTER              DOS 1541\r"
F7E4  B2 F7     DW 0F7B2H           ; inline message pointer
F7E6  C9        RET

BACK1:                               ; [C] return path: restore DOS input hook, select bank 0 (exit at F7F8 shared with bank 0)
F7E7  F5        PUSH PSW
F7E8  E5        PUSH H
F7E9  21 54 F0  LXI H,0F054H
F7EC  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F7EF  21 96 02  LXI H,0296H         ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F7F2  3E 02     MVI A,02H
F7F4  B6        ORA M
F7F5  77        MOV M,A
F7F6  E1        POP H
F7F7  AF        XRA A
F7F8  32 02 FA  STA 0FA02H          ; MEMBNK: selected F-bank [M]
F7FB  32 FE FF  STA 0FFFEH          ; BNKSL: F-bank select 0-3 (card latch U5) [M]
F7FE  F1        POP PSW
F7FF  C9        RET

;===================================================================================================
; BANK 2  (EPROM 1000-17FF, CPU F000-F7FF)  -  Memocom MDCR (digital cassette) + High Speed Data Loader
; Largely Memocom MTOS V1.2 at its original addresses; names from the DTOS listing [D].
; MDCR via the DCE-bus 8255, mode 98h [D]:
;   PB = DCRSL*4 + 3 (control address #03/#07/#0B/#0F)
;   PA in : PA7 RDC read clock, PA6 /WEN write enable (0 = plug in), PA5 /CIP cassette in place,
;           PA1 /BET begin/end of tape, PA0 /RDA read data
;   PC out: PC3 WCD write command, PC2 WDA write data, PC1 FWD forward, PC0 REV reverse
;           (signal names from the DTOS listing; the DOS writes PC = 02h to run forward, 01h reverse)
; High Speed Data Loader: PB = n*4 + 10h (EPROM 0-3), PC0 pulse = start, PC1 = byte strobe, data on PA.
;===================================================================================================

JTAB2:                               ; [C] bank 2 slot table, 18 entries
F000  C3 48 F3  JMP 0F348H          ; OPEN
F003  C3 66 F5  JMP 0F566H          ; DCR
F006  C3 93 F6  JMP 0F693H          ; DCRN
F009  C3 DA F5  JMP 0F5DAH          ; REWIND
F00C  C3 41 F6  JMP 0F641H          ; SKIP
F00F  C3 E2 F6  JMP 0F6E2H          ; VERIFY
F012  C3 BC F5  JMP 0F5BCH          ; LAST
F015  C3 5D F7  JMP 0F75DH          ; LOOK
F018  C3 9B F5  JMP 0F59BH          ; DEL
F01B  C3 F6 F0  JMP 0F0F6H          ; WOPEN
F01E  C3 2E F1  JMP 0F12EH          ; BLOCK
F021  C3 62 F1  JMP 0F162H          ; WCLOSE
F024  C3 E9 F1  JMP 0F1E9H          ; ROPEN
F027  C3 13 F2  JMP 0F213H          ; RBLOCK
F02A  C3 1F F3  JMP 0F31FH          ; RCLOSE
F02D  C3 87 F2  JMP 0F287H          ; MBLOCK
F030  C3 D4 F4  JMP 0F4D4H          ; INIT
F033  C3 36 F0  JMP 0F036H          ; HSL

HSL:                                 ; [C] slot 33: read EPROM n (FILES) of the High Speed Data Loader into RAM
                                      ; <- F033
F036  F5        PUSH PSW
F037  D5        PUSH D
F038  E5        PUSH H
F039  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F03C  B7        ORA A
F03D  F2 44 F0  JP 0F044H
F040  3C        INR A
F041  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
LF044:
                                      ; <- F03D
F044  FE 04     CPI 04H
F046  F2 10 F9  JP 0F910H           ; ESYNTX
F049  32 09 FA  STA 0FA09H          ; EXTNR: unit number of external memory [M]
F04C  3E 04     MVI A,04H
F04E  32 0A FA  STA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F051  CD F3 F9  CALL 0F9F3H         ; MODE98
F054  3A B0 01  LDA 01B0H           ; PB = n*4 + 10h: loader EPROM 0-3 (DCE #10/#14/#18/#1C)  [FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]]
F057  07        RLC
F058  07        RLC
F059  C6 10     ADI 10H
F05B  32 01 FE  STA 0FE01H          ; 8255 PB (DCE bus: device address) [F]
F05E  3E 01     MVI A,01H
F060  32 03 FE  STA 0FE03H          ; PC0 pulse: start loader  [8255 control (mode / bit set-reset) [F]]
F063  3D        DCR A
F064  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F067  CD 94 F0  CALL 0F094H         ; HSLBYT
F06A  FE FD     CPI 0FDH            ; first byte must be FDh
F06C  C2 A4 F0  JNZ 0F0A4H          ; EHSL
F06F  CD 94 F0  CALL 0F094H         ; load address L,H  [HSLBYT]
F072  6F        MOV L,A
F073  CD 94 F0  CALL 0F094H         ; HSLBYT
F076  67        MOV H,A
F077  CD 94 F0  CALL 0F094H         ; length D,E  [HSLBYT]
F07A  57        MOV D,A
F07B  CD 94 F0  CALL 0F094H         ; HSLBYT
F07E  5F        MOV E,A
LF07F:
                                      ; <- F087
F07F  CD 94 F0  CALL 0F094H         ; HSLBYT
F082  77        MOV M,A
F083  23        INX H
F084  1B        DCX D
F085  7A        MOV A,D
F086  B3        ORA E
F087  C2 7F F0  JNZ 0F07FH
F08A  21 00 00  LXI H,0000H
F08D  22 01 FE  SHLD 0FE01H         ; deselect (PB = PC = 0)  [8255 PB (DCE bus: device address) [F]]
F090  E1        POP H
F091  D1        POP D
F092  F1        POP PSW
F093  C9        RET

HSLBYT:                              ; [C] handshake one byte from the loader: PC1 strobe, read PA
                                      ; <- F067 F06F F073 F077 F07B F07F
F094  3E 03     MVI A,03H
F096  32 03 FE  STA 0FE03H          ; PC1 = 1: request byte  [8255 control (mode / bit set-reset) [F]]
F099  3A 00 FE  LDA 0FE00H          ; read data from PA  [8255 PA (DCE bus) [F]]
F09C  F5        PUSH PSW
F09D  3E 02     MVI A,02H
F09F  32 03 FE  STA 0FE03H          ; PC1 = 0  [8255 control (mode / bit set-reset) [F]]
F0A2  F1        POP PSW
F0A3  C9        RET

EHSL:                                ; [C] error 2 HSL OR EPROM NOT AVAILABLE
                                      ; <- F06C
F0A4  21 00 00  LXI H,0000H
F0A7  22 01 FE  SHLD 0FE01H         ; 8255 PB (DCE bus: device address) [F]
F0AA  3E 02     MVI A,02H
F0AC  C3 38 F9  JMP 0F938H          ; DOSERR

BANN2:                               ; [C] sign-on text "DAI COMPUTER  DCR USER"
F0AF            DB 0DH,0DH,0DH,0DH,0DH,0DH
                DB ' DAI COMPUTER              DCR USER',0DH,0; "\r\r\r\r\r\r DAI COMPUTER              DCR USER\r"

NAMCAS:                              ; [C] "CASSETTE" (length 8), inserted into MSGWEN by token B0 DA
F0DA            DB 8,'CASSETTE'     ; length-prefixed string
F0E3  00 x19    DS 19               ; unused (00)

WOPEN:                               ; [D] slot 1B: WOPEN on DCR (wait for write-enabled cassette)
                                      ; <- F01B
F0F6  C5        PUSH B
F0F7  F5        PUSH PSW
F0F8  E5        PUSH H
F0F9  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F0FC  36 00     MVI M,00H
LF0FE:
                                      ; <- F112
F0FE  2A 00 01  LHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F101  7C        MOV A,H
F102  B5        ORA L
F103  C2 0E F1  JNZ 0F10EH
F106  CD FF DA  CALL 0DAFFH         ; pointer to MSGWEN  [PMSGR: print "\rINSERT WRITE-ENABLED CASSETTE,PRESS SPACE"]
F109  C2 F1     DW 0F1C2H           ; inline message pointer
F10B  CD 65 F9  CALL 0F965H         ; WAITK
LF10E:
                                      ; <- F103
F10E  37        STC
F10F  CD 48 F3  CALL 0F348H         ; OPEN
F112  C2 FE F0  JNZ 0F0FEH
F115  E1        POP H
F116  CD F5 F2  CALL 0F2F5H         ; DLYL
F119  CD 41 DE  CALL 0DE41H         ; DELAY: delay routine
F11C  3E AA     MVI A,0AAH          ; sync byte AAh
F11E  CD 84 F1  CALL 0F184H         ; WBYTE
F121  5E        MOV E,M
F122  AF        XRA A
F123  57        MOV D,A
F124  23        INX H
F125  00        NOP
F126  F1        POP PSW
F127  D5        PUSH D
F128  CD 84 F1  CALL 0F184H         ; WBYTE
F12B  C3 3A F1  JMP 0F13AH

BLOCK:                               ; [D] slot 1E: WBLK: write one block
                                      ; <- F01E
F12E  C5        PUSH B
F12F  D5        PUSH D
F130  CD F5 F2  CALL 0F2F5H         ; DLYL
F133  3E AA     MVI A,0AAH
F135  CD 84 F1  CALL 0F184H         ; WBYTE
F138  7F        MOV A,A
F139  7F        MOV A,A
LF13A:
                                      ; <- F12B
F13A  3E 00     MVI A,00H
F13C  CD 6F F1  CALL 0F16FH         ; WLEN
F13F  01 00 56  LXI B,5600H
LF142:
                                      ; <- F14D
F142  7A        MOV A,D
F143  B3        ORA E
F144  CA 50 F1  JZ 0F150H
F147  1B        DCX D
F148  7E        MOV A,M
F149  23        INX H
F14A  CD 84 F1  CALL 0F184H         ; WBYTE
F14D  C3 42 F1  JMP 0F142H
LF150:
                                      ; <- F144
F150  00        NOP
F151  00        NOP
F152  00        NOP
F153  78        MOV A,B
F154  CD 84 F1  CALL 0F184H         ; WBYTE
F157  D1        POP D
F158  C1        POP B
F159  CD AC F1  CALL 0F1ACH         ; LECETAT
LF15C:
                                      ; <- F2F6
F15C  3E 0A     MVI A,0AH
F15E  32 02 FE  STA 0FE02H          ; PC = 0Ah: WCD + FWD  [8255 PC (DCE bus) [F]]
F161  C9        RET

WCLOSE:                              ; [D] slot 21: WCLOSE
                                      ; <- F021
F162  F5        PUSH PSW
F163  3E 08     MVI A,08H
F165  32 02 FE  STA 0FE02H          ; PC = 08h: WCD only  [8255 PC (DCE bus) [F]]
F168  CD 01 F3  CALL 0F301H         ; DELAY
F16B  FB        EI
F16C  C3 20 F3  JMP 0F320H

WLEN:                                ; [C] write length and its checksum
                                      ; <- F13C
F16F  06 56     MVI B,56H
F171  7A        MOV A,D
F172  CD 84 F1  CALL 0F184H         ; WBYTE
F175  E3        XTHL
F176  E3        XTHL
F177  7B        MOV A,E
F178  7B        MOV A,E
F179  CD 84 F1  CALL 0F184H         ; WBYTE
F17C  E3        XTHL
F17D  E3        XTHL
F17E  78        MOV A,B
F17F  78        MOV A,B
F180  00        NOP
F181  00        NOP
F182  00        NOP
F183  78        MOV A,B

WBYTE:                               ; [D] write one byte (8 x WBIT), update checksum B
                                      ; <- F11E F128 F135 F14A F154 F172 F179
F184  D5        PUSH D
F185  16 08     MVI D,08H
F187  00        NOP

WBIT:                                ; [D] write one bit on WDA (PC2), phase-encoded
                                      ; <- F1A9
F188  07        RLC
F189  5F        MOV E,A
F18A  3E 02     MVI A,02H           ; A = 04h/05h = PC2 (WDA) reset/set: data bit
F18C  17        RAL
F18D  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F190  1F        RAR
F191  3F        CMC
F192  17        RAL
F193  15        DCR D
F194  CD AC F1  CALL 0F1ACH         ; LECETAT
F197  32 03 FE  STA 0FE03H          ; complement: second half of bit cell  [8255 control (mode / bit set-reset) [F]]
F19A  7B        MOV A,E
F19B  C2 A3 F1  JNZ 0F1A3H
F19E  D1        POP D
F19F  A8        XRA B
F1A0  07        RLC
F1A1  47        MOV B,A
F1A2  C9        RET
LF1A3:
                                      ; <- F19B
F1A3  E3        XTHL
F1A4  E3        XTHL
F1A5  E3        XTHL
F1A6  E3        XTHL
F1A7  E3        XTHL
F1A8  E3        XTHL
F1A9  C3 88 F1  JMP 0F188H          ; WBIT

LECETAT:                             ; [D] read DCR status during writing: BET -> END OF TAPE, WEN/CIP -> DCR DOOR OPEN
                                      ; <- F159 F194
F1AC  E5        PUSH H
F1AD  F5        PUSH PSW
F1AE  21 00 FE  LXI H,0FE00H        ; 8255 PA (DCE bus) [F]
F1B1  7E        MOV A,M
F1B2  E6 02     ANI 02H             ; PA1 = 0 (BET): end of tape
F1B4  CA 2B F3  JZ 0F32BH           ; ERR2B
F1B7  7E        MOV A,M
F1B8  E6 60     ANI 60H             ; PA5 (CIP) or PA6 (WEN) set: door open / write protected
F1BA  C2 29 F3  JNZ 0F329H          ; ERR34
F1BD  7F        MOV A,A
F1BE  BF        CMP A
F1BF  F1        POP PSW
F1C0  E1        POP H
F1C1  C9        RET

MSGWEN:                              ; [D] message "INSERT WRITE-ENABLED CASSETTE,PRESS SPACE"
F1C2            DB 0DH,'INSERT WRITE-ENABLED ',0B0H,0DAH,',PRESS ',8EH,56H,0; "\rINSERT WRITE-ENABLED CASSETTE,PRESS SPACE"
F1E4  00 x5     DS 5                ; unused (00)

ROPEN:                               ; [D] slot 24: ROPEN: search the named file
                                      ; <- F024 F4FB F528 F706 F73D F771
F1E9  F5        PUSH PSW
F1EA  5E        MOV E,M
F1EB  23        INX H
LF1EC:
                                      ; <- F1F1 F210
F1EC  AF        XRA A
F1ED  57        MOV D,A
F1EE  CD 48 F3  CALL 0F348H         ; OPEN
F1F1  C2 EC F1  JNZ 0F1ECH
F1F4  F1        POP PSW
F1F5  CD 58 F4  CALL 0F458H         ; FHEAD
F1F8  F5        PUSH PSW
F1F9  CD C9 F2  CALL 0F2C9H         ; PFTYPE
F1FC  90        SUB B
F1FD  CD 94 F2  CALL 0F294H
F200  F5        PUSH PSW
F201  F1        POP PSW
F202  B7        ORA A
F203  CA 88 F5  JZ 0F588H
F206  05        DCR B
F207  04        INR B
F208  CA 88 F5  JZ 0F588H
F20B  0D        DCR C
F20C  0C        INR C
F20D  C4 5E DD  CNZ 0DD5EH          ; CRLF: print CR
F210  C3 EC F1  JMP 0F1ECH

RBLOCK:                              ; [D] slot 27: RBLK: read one block
                                      ; <- F027
F213  C5        PUSH B
F214  D5        PUSH D
F215  E5        PUSH H
F216  CD 90 D7  CALL 0D790H         ; MPT25: calculate free space
F219  EB        XCHG
F21A  CD 3D F4  CALL 0F43DH         ; SYNC
F21D  D2 66 F2  JNC 0F266H          ; RBERR
F220  CD A3 F4  CALL 0F4A3H         ; FCLK
F223  CD 1D F4  CALL 0F41DH         ; RLEN
F226  DA 66 F2  JC 0F266H           ; RBERR
F229  B7        ORA A
F22A  3E 00     MVI A,00H
F22C  C2 68 F2  JNZ 0F268H
F22F  E5        PUSH H
F230  19        DAD D
F231  D1        POP D
F232  3C        INR A
F233  E1        POP H
F234  E5        PUSH H
F235  DA 68 F2  JC 0F268H
F238  06 56     MVI B,56H
LF23A:
                                      ; <- F24B
F23A  7A        MOV A,D
F23B  B3        ORA E
F23C  CA 4E F2  JZ 0F24EH
F23F  1B        DCX D
F240  CD 37 F4  CALL 0F437H
F243  DA 66 F2  JC 0F266H           ; RBERR
F246  77        MOV M,A
F247  23        INX H
F248  E3        XTHL
F249  E3        XTHL
F24A  00        NOP
F24B  C3 3A F2  JMP 0F23AH
LF24E:
                                      ; <- F23C
F24E  CD E0 F3  CALL 0F3E0H         ; RBYTE
F251  CD 1F F3  CALL 0F31FH         ; RCLOSE
F254  DA 66 F2  JC 0F266H           ; RBERR
F257  B8        CMP B
F258  3E 02     MVI A,02H
F25A  C2 68 F2  JNZ 0F268H
F25D  F5        PUSH PSW
F25E  AF        XRA A
F25F  CD 4E F9  CALL 0F94EH         ; ERRCOD0
F262  F1        POP PSW
F263  C3 B4 C6  JMP 0C6B4H          ; MPT26: READ BLOCK exit, CY=1 = no error

RBERR:                               ; [C] read error 3 / checksum error
                                      ; <- F21D F226 F243 F254
F266  3E 03     MVI A,03H
LF268:
                                      ; <- F22C F235 F25A
F268  B7        ORA A
F269  CD 1F F3  CALL 0F31FH         ; RCLOSE
F26C  F5        PUSH PSW
F26D  CD 55 F9  CALL 0F955H         ; ERRDEST
F270  CA 7B F2  JZ 0F27BH
F273  F1        POP PSW
F274  CD 4D F9  CALL 0F94DH         ; ERRCOD
F277  AF        XRA A
F278  C3 B5 C6  JMP 0C6B5H          ; MPT26+1: READ BLOCK exit (STC)
LF27B:
                                      ; <- F270
F27B  F1        POP PSW
F27C  C3 B6 C6  JMP 0C6B6H          ; LBK30: READ BLOCK exit, restore registers
F27F  00 x8     DS 8                ; unused (00)

MBLOCK:                              ; [D] slot 2D: MBLK (CHECK): read block without storing
                                      ; <- F02D F711 F714 F747 F74A
F287  C5        PUSH B
F288  F5        PUSH PSW
F289  CD 3D F4  CALL 0F43DH         ; SYNC
F28C  F1        POP PSW
F28D  C1        POP B
F28E  CD D3 F2  CALL 0F2D3H         ; DL36
F291  00        NOP
F292  00        NOP
F293  00        NOP
LF294:
                                      ; <- F1FD
F294  C5        PUSH B
F295  E5        PUSH H
F296  47        MOV B,A
F297  D5        PUSH D
F298  E5        PUSH H
F299  CD 1D F4  CALL 0F41DH         ; RLEN
F29C  DA D8 F2  JC 0F2D8H           ; ERRTYP
F29F  B7        ORA A
F2A0  C2 D8 F2  JNZ 0F2D8H          ; ERRTYP
F2A3  E5        PUSH H
F2A4  CD 1A DE  CALL 0DE1AH         ; SUBDE (CALCULATE LENGTH OF BLOCK)
F2A7  7C        MOV A,H
F2A8  B5        ORA L
F2A9  67        MOV H,A
F2AA  68        MOV L,B
F2AB  D1        POP D
F2AC  06 56     MVI B,56H
LF2AE:
                                      ; <- F2C6
F2AE  E3        XTHL
F2AF  7A        MOV A,D
F2B0  B3        ORA E
F2B1  CA 11 F4  JZ 0F411H
F2B4  1B        DCX D
F2B5  CD D5 F3  CALL 0F3D5H         ; FENTRY
F2B8  CD 87 D3  CALL 0D387H         ; RBUEX: READ BYTE exit, update checksum
F2BB  DA D8 F2  JC 0F2D8H           ; ERRTYP
F2BE  CD C9 F2  CALL 0F2C9H         ; PFTYPE
F2C1  AE        XRA M
F2C2  23        INX H
F2C3  E3        XTHL
F2C4  B4        ORA H
F2C5  67        MOV H,A
F2C6  C3 AE F2  JMP 0F2AEH

PFTYPE:                              ; [C] print file type (via ROM D7ED)
                                      ; <- F1F9 F2BE
F2C9  0D        DCR C
F2CA  0C        INR C
F2CB  E5        PUSH H
F2CC  C2 ED D7  JNZ 0D7EDH          ; in: FAST PRINTING
F2CF  E1        POP H
F2D0  C9        RET
F2D1            DB 00H,00H          ; ..

DL36:                                ; [D] delay 36 us
                                      ; <- F28E F42E F5D1
F2D3  E3        XTHL
F2D4  E3        XTHL

DL18:                                ; [D] delay 18 us
                                      ; <- F427
F2D5  E3        XTHL
F2D6  E3        XTHL
F2D7  C9        RET

ERRTYP:                              ; [D] set error code in ERRCO or report
                                      ; <- F29C F2A0 F2BB F417
F2D8  E1        POP H
F2D9  D1        POP D
F2DA  CD 1F F3  CALL 0F31FH         ; RCLOSE
F2DD  CD 55 F9  CALL 0F955H         ; ERRDEST
F2E0  3E 01     MVI A,01H
F2E2  CA ED F2  JZ 0F2EDH
F2E5  B5        ORA L
F2E6  E6 03     ANI 03H
F2E8  CD 4D F9  CALL 0F94DH         ; ERRCOD
F2EB  AF        XRA A
F2EC  6F        MOV L,A
LF2ED:
                                      ; <- F2E2
F2ED  B5        ORA L
F2EE  E1        POP H
F2EF  C1        POP B
F2F0  C9        RET
F2F1  00 x4     DS 4                ; unused (00)

DLYL:                                ; [C] long delay
                                      ; <- F116 F130
F2F5  F3        DI
F2F6  CD 5C F1  CALL 0F15CH
LF2F9:
                                      ; <- F622
F2F9  E5        PUSH H
F2FA  D5        PUSH D
F2FB  21 E7 FF  LXI H,0FFE7H
F2FE  C3 06 F3  JMP 0F306H

DELAY:                               ; [D] delay
                                      ; <- F168 F39D F3A8 F3B8 F4E8 F4EB F5E2 F649
F301  E5        PUSH H
F302  D5        PUSH D
F303  21 FB FF  LXI H,0FFFBH
LF306:
                                      ; <- F2FE
F306  54        MOV D,H
F307  5D        MOV E,L
LF308:
                                      ; <- F309
F308  19        DAD D
F309  DA 08 F3  JC 0F308H
F30C  D1        POP D
F30D  E1        POP H
F30E  C9        RET
F30F  00 x16    DS 16               ; unused (00)

RCLOSE:                              ; [D] slot 2A: RCLOSE: deselect DCR (PC=0, PB=0)
                                      ; <- F02A F251 F269 F2DA F380 F3CC F40B F414 F50B F63A F717 F74D ...
F31F  F5        PUSH PSW
LF320:
                                      ; <- F16C
F320  AF        XRA A
F321  32 02 FE  STA 0FE02H          ; 8255 PC (DCE bus) [F]
F324  32 01 FE  STA 0FE01H          ; 8255 PB (DCE bus: device address) [F]
F327  F1        POP PSW
F328  C9        RET

ERR34:                               ; [D] plug absent or cassette not in place -> error 1 DCR DOOR OPEN
                                      ; <- F1BA
F329  3E 01     MVI A,01H

ERR2B:                               ; [D] BET detected -> error 0 END OF TAPE
                                      ; <- F1B4
F32B  F5        PUSH PSW
F32C  F5        PUSH PSW
F32D  23        INX H
F32E  23        INX H
F32F  36 00     MVI M,00H
F331  CD 55 F9  CALL 0F955H         ; ERRDEST
F334  E1        POP H
F335  7C        MOV A,H
F336  CA 38 F9  JZ 0F938H           ; DOSERR
F339  F1        POP PSW
F33A  C6 01     ADI 01H
F33C  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F33F  77        MOV M,A
F340  F1        POP PSW
F341  E1        POP H
F342  C9        RET
F343  00 x5     DS 5                ; unused (00)

OPEN:                                ; [D] slot 00: OPEN: EXTMEM must be 2, mode 98h, PB = DCRSL*4+3, check status
                                      ; <- F000 F10F F1EE F3BB F43E F4DB F5B2 F5DC F643
F348  F5        PUSH PSW
F349  3A 0A FA  LDA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F34C  FE 02     CPI 02H
F34E  C2 36 F9  JNZ 0F936H          ; EDEVMM
F351  E5        PUSH H
F352  21 EC FF  LXI H,0FFECH
F355  39        DAD SP
F356  7E        MOV A,M
F357  77        MOV M,A
F358  E1        POP H
F359  3E 98     MVI A,98H           ; 8255 mode 98h
F35B  32 03 FE  STA 0FE03H          ; 8255 control (mode / bit set-reset) [F]
F35E  32 61 00  STA 0061H           ; copy of the 8255 (GIC) control word [F]
F361  3A 1F 01  LDA 011FH           ; DCRSL: selected DCR 0-3 [M][D]
F364  07        RLC
F365  07        RLC
F366  C6 03     ADI 03H             ; PB = DCRSL*4 + 3: DCR control address (#03/#07/#0B/#0F)
F368  32 01 FE  STA 0FE01H          ; 8255 PB (DCE bus: device address) [F]
F36B  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F36E  F1        POP PSW

TSTST:                               ; [C] check RDC/WEN/CIP/BET status bits
                                      ; <- F3C9 F4E2 F634
F36F  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
F372  D2 7C F3  JNC 0F37CH
F375  E6 62     ANI 62H             ; with CY: test PA1 BET, PA5 CIP, PA6 WEN
F377  EE 02     XRI 02H
F379  C3 80 F3  JMP 0F380H
LF37C:
                                      ; <- F372
F37C  E6 22     ANI 22H             ; without CY: PA1 BET, PA5 CIP
F37E  EE 02     XRI 02H
LF380:
                                      ; <- F379
F380  C4 1F F3  CNZ 0F31FH          ; RCLOSE
F383  C9        RET

MFWD:                                ; [C] motor forward (FWD)
                                      ; <- F3A0 F442 F47B F667
F384  AF        XRA A
F385  32 02 FE  STA 0FE02H          ; PC = 0: motor off  [8255 PC (DCE bus) [F]]
F388  3E 02     MVI A,02H
F38A  32 02 FE  STA 0FE02H          ; PC = 02h: FWD  [8255 PC (DCE bus) [F]]
F38D  C9        RET

MREV:                                ; [C] motor reverse (REV)
                                      ; <- F3AB F604
F38E  AF        XRA A
F38F  32 02 FE  STA 0FE02H          ; PC = 0  [8255 PC (DCE bus) [F]]
LF392:
                                      ; <- F5E9
F392  3E 01     MVI A,01H
F394  32 02 FE  STA 0FE02H          ; PC = 01h: REV  [8255 PC (DCE bus) [F]]
F397  C9        RET

MFWDW:                               ; [C] forward + delay
                                      ; <- F3C1 F629
F398  3E 02     MVI A,02H
LF39A:
                                      ; <- F626
F39A  32 02 FE  STA 0FE02H          ; 8255 PC (DCE bus) [F]
F39D  CD 01 F3  CALL 0F301H         ; DELAY
F3A0  C3 84 F3  JMP 0F384H          ; MFWD

MREVW:                               ; [C] reverse + delay
                                      ; <- F5F4 F680
F3A3  3E 01     MVI A,01H
F3A5  32 02 FE  STA 0FE02H          ; 8255 PC (DCE bus) [F]
F3A8  CD 01 F3  CALL 0F301H         ; DELAY
F3AB  C3 8E F3  JMP 0F38EH          ; MREV

NOTAPE:                              ; [C] end of tape while searching
                                      ; <- F48E
F3AE  F5        PUSH PSW
F3AF  3E FF     MVI A,0FFH
F3B1  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F3B4  FB        EI
F3B5  CD DA F5  CALL 0F5DAH         ; REWIND
F3B8  CD 01 F3  CALL 0F301H         ; DELAY
F3BB  CD 48 F3  CALL 0F348H         ; OPEN
F3BE  F1        POP PSW

FWDDI:                               ; [C] DI + forward
                                      ; <- F470 F657
F3BF  F3        DI
F3C0  F5        PUSH PSW
F3C1  CD 98 F3  CALL 0F398H         ; MFWDW
F3C4  F1        POP PSW
F3C5  C9        RET

BRKCHK:                              ; [C] BREAK pressed? -> RCLOSE and ABORT
                                      ; <- F36B F474 F5A2 F5C8 F5FD F660
F3C6  CD A5 D6  CALL 0D6A5H         ; BREAK (KEYBOARD SCANNING: CHECK IF NEW INPUTS)
F3C9  D2 6F F3  JNC 0F36FH          ; TSTST
F3CC  CD 1F F3  CALL 0F31FH         ; RCLOSE
F3CF  C3 00 F9  JMP 0F900H          ; ABORT
F3D2            DB 00H,00H,00H      ; ...

FENTRY:                              ; [D] fast entry of RBYTE
                                      ; <- F2B5 F411 F41D F453 F45F
F3D5  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
F3D8  C5        PUSH B
F3D9  0E 01     MVI C,01H
F3DB  06 09     MVI B,09H
F3DD  C3 EC F3  JMP 0F3ECH

RBYTE:                               ; [D] read one byte, update checksum
                                      ; <- F24E F431 F437 F468
F3E0  C5        PUSH B
F3E1  0E 01     MVI C,01H
LF3E3:
                                      ; <- F408
F3E3  06 09     MVI B,09H
LF3E5:
                                      ; <- F3ED
F3E5  05        DCR B
F3E6  CA 0B F4  JZ 0F40BH
F3E9  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
LF3EC:
                                      ; <- F3DD
F3EC  B7        ORA A
F3ED  F2 E5 F3  JP 0F3E5H
F3F0  1F        RAR
F3F1  79        MOV A,C
F3F2  17        RAL
F3F3  DA 0E F4  JC 0F40EH
F3F6  4F        MOV C,A
F3F7  06 0F     MVI B,0FH
LF3F9:
                                      ; <- F401
F3F9  05        DCR B
F3FA  CA 0B F4  JZ 0F40BH
F3FD  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
F400  B7        ORA A
F401  FA F9 F3  JM 0F3F9H
F404  E6 22     ANI 22H
F406  EE 02     XRI 02H
F408  CA E3 F3  JZ 0F3E3H
LF40B:
                                      ; <- F3E6 F3FA
F40B  CD 1F F3  CALL 0F31FH         ; RCLOSE
LF40E:
                                      ; <- F3F3
F40E  3F        CMC
F40F  C1        POP B
F410  C9        RET
LF411:
                                      ; <- F2B1
F411  CD D5 F3  CALL 0F3D5H         ; FENTRY
F414  CD 1F F3  CALL 0F31FH         ; RCLOSE
F417  DA D8 F2  JC 0F2D8H           ; ERRTYP
F41A  C3 DE D3  JMP 0D3DEH          ; MBEX: check block checksum

RLEN:                                ; [D] read length
                                      ; <- F223 F299
F41D  CD D5 F3  CALL 0F3D5H         ; FENTRY
F420  C5        PUSH B
F421  06 56     MVI B,56H
F423  CD 87 D3  CALL 0D387H         ; RBUEX: READ BYTE exit, update checksum
F426  67        MOV H,A
F427  D4 D5 F2  CNC 0F2D5H          ; DL18
F42A  D4 37 F4  CNC 0F437H
F42D  6F        MOV L,A
F42E  D4 D3 F2  CNC 0F2D3H          ; DL36
F431  D4 E0 F3  CNC 0F3E0H          ; RBYTE
F434  C3 9B D3  JMP 0D39BH          ; RHLEX: read length exit, checksum
LF437:
                                      ; <- F240 F42A
F437  CD E0 F3  CALL 0F3E0H         ; RBYTE
F43A  C3 87 D3  JMP 0D387H          ; RBUEX: READ BYTE exit, update checksum

SYNC:                                ; [C] find block start
                                      ; <- F21A F289 F44B
F43D  AF        XRA A
F43E  CD 48 F3  CALL 0F348H         ; OPEN
F441  C0        RNZ
F442  CD 84 F3  CALL 0F384H         ; MFWD
F445  01 B4 00  LXI B,00B4H
F448  CD 94 F4  CALL 0F494H         ; FLOW
F44B  C2 3D F4  JNZ 0F43DH          ; SYNC
F44E  06 0F     MVI B,0FH
F450  CD 94 F4  CALL 0F494H         ; FLOW
F453  CD D5 F3  CALL 0F3D5H         ; FENTRY
F456  3F        CMC
F457  C9        RET

FHEAD:                               ; [D] search header
                                      ; <- F1F5
F458  C5        PUSH B
F459  CD 8F D9  CALL 0D98FH         ; SNDDI (DISABLE SOUND INTERRUPTS)
LF45C:
                                      ; <- F462 F46B
F45C  CD 70 F4  CALL 0F470H
F45F  CD D5 F3  CALL 0F3D5H         ; FENTRY
F462  DA 5C F4  JC 0F45CH
F465  CD A3 F4  CALL 0F4A3H         ; FCLK
F468  CD E0 F3  CALL 0F3E0H         ; RBYTE
F46B  DA 5C F4  JC 0F45CH
F46E  C1        POP B
F46F  C9        RET
LF470:
                                      ; <- F45C
F470  CD BF F3  CALL 0F3BFH         ; FWDDI
LF473:
                                      ; <- F483 F491
F473  FB        EI
F474  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F477  F3        DI
F478  C2 8E F4  JNZ 0F48EH
F47B  CD 84 F3  CALL 0F384H         ; MFWD
F47E  06 0F     MVI B,0FH
F480  CD 94 F4  CALL 0F494H         ; FLOW
F483  C2 73 F4  JNZ 0F473H
F486  06 96     MVI B,96H
F488  CD 94 F4  CALL 0F494H         ; FLOW
F48B  E6 80     ANI 80H
F48D  C0        RNZ
LF48E:
                                      ; <- F478
F48E  CD AE F3  CALL 0F3AEH         ; NOTAPE
F491  C3 73 F4  JMP 0F473H

FLOW:                                ; [D] wait for status change / timeout (B,C)
                                      ; <- F448 F450 F480 F488 F49F F5F9 F609 F611 F62E F65C F66C F67A
F494  0B        DCX B
F495  78        MOV A,B
F496  B1        ORA C
F497  C8        RZ
F498  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
F49B  E6 A2     ANI 0A2H
F49D  EE 02     XRI 02H
F49F  CA 94 F4  JZ 0F494H           ; FLOW
F4A2  C9        RET

FCLK:                                ; [D] wait for read clock
                                      ; <- F220 F465
F4A3  C5        PUSH B
F4A4  F5        PUSH PSW
F4A5  06 0F     MVI B,0FH
LF4A7:
                                      ; <- F4B0
F4A7  05        DCR B
F4A8  CA B3 F4  JZ 0F4B3H
F4AB  3A 00 FE  LDA 0FE00H          ; 8255 PA (DCE bus) [F]
F4AE  E6 80     ANI 80H
F4B0  C2 A7 F4  JNZ 0F4A7H
LF4B3:
                                      ; <- F4A8
F4B3  F1        POP PSW
F4B4  C1        POP B
F4B5  C9        RET

VEC2A:                               ; [C] image of RAM vectors 02C5-02E2 for DCR (through bank-0 slot stubs)
F4B6            DB 0C3H / DW 0F776H ; 02C5 WOPEN: JMP F776 X2WOPN
F4B9            DB 0C3H / DW 0F77BH ; 02C8 WBLK: JMP F77B X2WBLK
F4BC            DB 0C3H / DW 0F780H ; 02CB WCLOSE: JMP F780 X2WCLS
F4BF            DB 0C3H / DW 0F785H ; 02CE ROPEN: JMP F785 X2ROPN
F4C2            DB 0C3H / DW 0F78AH ; 02D1 RBLK: JMP F78A X2RBLK
F4C5            DB 0C3H / DW 0F78FH ; 02D4 RCLOSE: JMP F78F X2RCLS
F4C8            DB 0C3H / DW 0F794H ; 02D7 MBLK: JMP F794 X2MBLK
F4CB            DB 0C9H,00H,00H     ; 02DA RESET/USR: RET
F4CE            DB 0C3H / DW 0F4EFH ; 02DD DOUTC: JMP F4EF PRNOUT
F4D1            DB 0C3H / DW 0F054H ; 02E0 DINC: JMP F054 DINKBD

INIT:                                ; [D] slot 30: DCR initialisation at boot; DCR USER autostart if WEN plug removed
                                      ; <- F030
F4D4  AF        XRA A
F4D5  32 1F 01  STA 011FH           ; DCRSL: selected DCR 0-3 [M][D]
F4D8  CD 8A F5  CALL 0F58AH         ; SETVEB
F4DB  CD 48 F3  CALL 0F348H         ; OPEN
F4DE  C2 0B F5  JNZ 0F50BH
F4E1  37        STC                 ; CY: include WEN in the test
F4E2  CD 6F F3  CALL 0F36FH         ; TSTST
F4E5  CA 0B F5  JZ 0F50BH           ; cassette writable -> no autostart
F4E8  CD 01 F3  CALL 0F301H         ; DELAY
F4EB  CD 01 F3  CALL 0F301H         ; DELAY
F4EE  AF        XRA A
F4EF  4F        MOV C,A
F4F0  47        MOV B,A
F4F1  3D        DCR A
F4F2  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F4F5  CD DA F5  CALL 0F5DAH         ; REWIND
F4F8  21 C8 F6  LXI H,0F6C8H        ; name "USER"  [NAMUSR]
F4FB  CD E9 F1  CALL 0F1E9H         ; ROPEN
F4FE  21 FB FF  LXI H,0FFFBH
F501  39        DAD SP
F502  7E        MOV A,M
F503  FE 31     CPI 31H
F505  CA 16 F5  JZ 0F516H           ; USRBT
LF508:
                                      ; <- F51E
F508  CD DA F5  CALL 0F5DAH         ; REWIND
LF50B:
                                      ; <- F4DE F4E5
F50B  CD 1F F3  CALL 0F31FH         ; RCLOSE
F50E  CD 66 F5  CALL 0F566H         ; DCR
F511  AF        XRA A
F512  32 00 FA  STA 0FA00H          ; USRFLG: DCR USER boot flag [M]
F515  C9        RET

USRBT:                               ; [C] DCR USER: show sign-on, load file "USER" (4 tries), start it
                                      ; <- F505
F516  CD DD F7  CALL 0F7DDH         ; RSTMS2
F519  16 04     MVI D,04H
F51B  D5        PUSH D
LF51C:
                                      ; <- F52E F53B
F51C  D1        POP D
F51D  15        DCR D
F51E  CA 08 F5  JZ 0F508H
F521  D5        PUSH D
F522  CD DA F5  CALL 0F5DAH         ; REWIND
F525  21 C8 F6  LXI H,0F6C8H        ; NAMUSR
F528  CD E9 F1  CALL 0F1E9H         ; ROPEN
F52B  CD 74 EF  CALL 0EF74H         ; ROM bank 3 L3E350 (READ STARTADDRESS FROM TAPE)
F52E  D2 1C F5  JNC 0F51CH
F531  E5        PUSH H
F532  D5        PUSH D
F533  11 00 F9  LXI D,0F900H        ; load limit F900  [ABORT]
F536  CD 8A EF  CALL 0EF8AH         ; ROM bank 3 L3E352 (READ DATA FROM TAPE)
F539  D1        POP D
F53A  E1        POP H
F53B  D2 1C F5  JNC 0F51CH
F53E  D1        POP D
F53F  22 07 FA  SHLD 0FA07H         ; USERST = start address  [USERST: DCR USER start address [M]]
F542  CD 66 F5  CALL 0F566H         ; DCR
F545  3E 01     MVI A,01H
F547  32 00 FA  STA 0FA00H          ; USRFLG: DCR USER boot flag [M]
F54A  C9        RET
F54B  00 x27    DS 27               ; unused (00)

DCR:                                 ; [D] slot 03: select DCR 0
                                      ; <- F003 F50E F542
F566  F5        PUSH PSW
F567  AF        XRA A
F568  C3 9C F6  JMP 0F69CH          ; DCRSET

SETVEC:                              ; [C] copy VEC2A to 02C5, EXTMEM = 2
                                      ; <- F6A8
F56B  D5        PUSH D
F56C  E5        PUSH H
F56D  C5        PUSH B
F56E  11 B6 F4  LXI D,0F4B6H        ; VEC2A
F571  21 D4 F4  LXI H,0F4D4H        ; INIT
LF574:
                                      ; <- F594
F574  01 C5 02  LXI B,02C5H         ; vector WOPEN [F]
F577  CD 4F DE  CALL 0DE4FH         ; MOVE: block transfer DE..HL -> BC
F57A  3A 1F 01  LDA 011FH           ; DCRSL: selected DCR 0-3 [M][D]
F57D  32 09 FA  STA 0FA09H          ; EXTNR: unit number of external memory [M]
F580  3E 02     MVI A,02H
F582  32 0A FA  STA 0FA0AH          ; EXTMEM: 1 CAS, 2 DCR, 3 FDD, 4 HSL [M]
F585  C1        POP B
F586  E1        POP H
F587  D1        POP D
LF588:
                                      ; <- F203 F208
F588  F1        POP PSW
F589  C9        RET

SETVEB:                              ; [C] copy VEC2B to 02C5 (direct bank-2 vectors, used during boot)
                                      ; <- F4D8
F58A  F5        PUSH PSW
F58B  D5        PUSH D
F58C  E5        PUSH H
F58D  C5        PUSH B
F58E  11 A5 F7  LXI D,0F7A5H        ; VEC2B
F591  21 C3 F7  LXI H,0F7C3H
F594  C3 74 F5  JMP 0F574H
F597  00 x4     DS 4                ; unused (00)

DEL:                                 ; [D] slot 18: DEL: erase to end of tape
                                      ; <- F018
F59B  F5        PUSH PSW
F59C  CD AA F5  CALL 0F5AAH         ; DCRCHK
F59F  C2 A8 F5  JNZ 0F5A8H
LF5A2:
                                      ; <- F5A5 F5EC
F5A2  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F5A5  CA A2 F5  JZ 0F5A2H
LF5A8:
                                      ; <- F59F
F5A8  F1        POP PSW
F5A9  C9        RET

DCRCHK:                              ; [C]
                                      ; <- F59C F5C4
F5AA  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F5AD  B7        ORA A
F5AE  F2 10 F9  JP 0F910H           ; ESYNTX
F5B1  37        STC
F5B2  CD 48 F3  CALL 0F348H         ; OPEN
F5B5  C0        RNZ
F5B6  3E 0A     MVI A,0AH
F5B8  32 02 FE  STA 0FE02H          ; PC = 0Ah: WCD + FWD (erase/write forward)  [8255 PC (DCE bus) [F]]
F5BB  C9        RET

LAST:                                ; [D] slot 12: LAST
                                      ; <- F012
F5BC  F5        PUSH PSW
F5BD  CD C4 F5  CALL 0F5C4H
F5C0  C5        PUSH B
F5C1  C3 80 F6  JMP 0F680H
LF5C4:
                                      ; <- F5BD
F5C4  CD AA F5  CALL 0F5AAH         ; DCRCHK
F5C7  C0        RNZ
LF5C8:
                                      ; <- F5D7
F5C8  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F5CB  C0        RNZ
F5CC  CD 8B F6  CALL 0F68BH         ; DECFIL
F5CF  C8        RZ
LF5D0:
                                      ; <- F5D4
F5D0  3D        DCR A
F5D1  CD D3 F2  CALL 0F2D3H         ; DL36
F5D4  C2 D0 F5  JNZ 0F5D0H
F5D7  C3 C8 F5  JMP 0F5C8H

REWIND:                              ; [D] slot 09: REWIND x files
                                      ; <- F009 F3B5 F4F5 F508 F522 F6F2 F77F
F5DA  F5        PUSH PSW
F5DB  AF        XRA A
LF5DC:
                                      ; <- F5DF
F5DC  CD 48 F3  CALL 0F348H         ; OPEN
F5DF  C2 DC F5  JNZ 0F5DCH
F5E2  CD 01 F3  CALL 0F301H         ; DELAY
F5E5  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F5E8  B7        ORA A
F5E9  CD 92 F3  CALL 0F392H
F5EC  FA A2 F5  JM 0F5A2H
F5EF  C5        PUSH B
F5F0  CA 3A F6  JZ 0F63AH
F5F3  F3        DI
F5F4  CD A3 F3  CALL 0F3A3H         ; MREVW
F5F7  06 01     MVI B,01H
F5F9  CD 94 F4  CALL 0F494H         ; FLOW
LF5FC:
                                      ; <- F60C F61F F688
F5FC  FB        EI
F5FD  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F600  F3        DI
F601  C2 3A F6  JNZ 0F63AH
F604  CD 8E F3  CALL 0F38EH         ; MREV
F607  06 1E     MVI B,1EH
F609  CD 94 F4  CALL 0F494H         ; FLOW
F60C  C2 FC F5  JNZ 0F5FCH
LF60F:
                                      ; <- F614
F60F  06 FF     MVI B,0FFH
F611  CD 94 F4  CALL 0F494H         ; FLOW
F614  CA 0F F6  JZ 0F60FH
F617  E6 80     ANI 80H
F619  CA 3A F6  JZ 0F63AH
F61C  CD 8B F6  CALL 0F68BH         ; DECFIL
F61F  C2 FC F5  JNZ 0F5FCH
F622  CD F9 F2  CALL 0F2F9H
F625  AF        XRA A
F626  CD 9A F3  CALL 0F39AH
F629  CD 98 F3  CALL 0F398H         ; MFWDW
LF62C:
                                      ; <- F637
F62C  06 08     MVI B,08H
F62E  CD 94 F4  CALL 0F494H         ; FLOW
F631  CA 3A F6  JZ 0F63AH
F634  CD 6F F3  CALL 0F36FH         ; TSTST
F637  CA 2C F6  JZ 0F62CH
LF63A:
                                      ; <- F5F0 F601 F619 F631 F651 F664 F675
F63A  CD 1F F3  CALL 0F31FH         ; RCLOSE
F63D  C1        POP B
F63E  F1        POP PSW
F63F  FB        EI
F640  C9        RET

SKIP:                                ; [D] slot 0C: SKIP x files
                                      ; <- F00C
F641  F5        PUSH PSW
F642  AF        XRA A
LF643:
                                      ; <- F646
F643  CD 48 F3  CALL 0F348H         ; OPEN
F646  C2 43 F6  JNZ 0F643H
F649  CD 01 F3  CALL 0F301H         ; DELAY
F64C  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F64F  B7        ORA A
F650  C5        PUSH B
F651  CA 3A F6  JZ 0F63AH
F654  CD 8F D9  CALL 0D98FH         ; SNDDI (DISABLE SOUND INTERRUPTS)
F657  CD BF F3  CALL 0F3BFH         ; FWDDI
F65A  06 96     MVI B,96H
F65C  CD 94 F4  CALL 0F494H         ; FLOW
LF65F:
                                      ; <- F66F F67D
F65F  FB        EI
F660  CD C6 F3  CALL 0F3C6H         ; BRKCHK
F663  F3        DI
F664  C2 3A F6  JNZ 0F63AH
F667  CD 84 F3  CALL 0F384H         ; MFWD
F66A  06 0A     MVI B,0AH
F66C  CD 94 F4  CALL 0F494H         ; FLOW
F66F  C2 5F F6  JNZ 0F65FH
F672  CD 8B F6  CALL 0F68BH         ; DECFIL
F675  CA 3A F6  JZ 0F63AH
F678  06 96     MVI B,96H
F67A  CD 94 F4  CALL 0F494H         ; FLOW
F67D  C2 5F F6  JNZ 0F65FH
LF680:
                                      ; <- F5C1
F680  CD A3 F3  CALL 0F3A3H         ; MREVW
F683  3E 01     MVI A,01H
F685  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F688  C3 FC F5  JMP 0F5FCH

DECFIL:                              ; [C] FILES = FILES - 1
                                      ; <- F5CC F61C F672
F68B  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F68E  3D        DCR A
F68F  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F692  C9        RET

DCRN:                                ; [D] slot 06: DCR x
                                      ; <- F006
F693  F5        PUSH PSW
F694  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F697  B7        ORA A
F698  F2 9C F6  JP 0F69CH           ; DCRSET
F69B  3C        INR A

DCRSET:                              ; [C] set DCRSL = A, PB = A*4+3, install vectors
                                      ; <- F568 F698
F69C  E6 03     ANI 03H
F69E  32 1F 01  STA 011FH           ; DCRSL: selected DCR 0-3 [M][D]
F6A1  07        RLC
F6A2  07        RLC
F6A3  C6 03     ADI 03H             ; PB = n*4 + 3
F6A5  32 01 FE  STA 0FE01H          ; 8255 PB (DCE bus: device address) [F]
F6A8  C3 6B F5  JMP 0F56BH          ; SETVEC
F6AB  00 x29    DS 29               ; unused (00)

NAMUSR:                              ; [D] file name "USER" (length 4)
F6C8            DB 4,'USER'         ; length-prefixed string
F6CD            DB 00H              ; .

VERX:                                ; [C]
                                      ; <- F750 F755
F6CE  E1        POP H
F6CF  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F6D2  CD 4E F9  CALL 0F94EH         ; ERRCOD0
LF6D5:
                                      ; <- F722 F72D
F6D5  FB        EI
F6D6  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET
F6D9  00 x9     DS 9                ; unused (00)

VERIFY:                              ; [D] slot 0F: VERIFY
                                      ; <- F00F
F6E2  F5        PUSH PSW
F6E3  C5        PUSH B
F6E4  D5        PUSH D
F6E5  E5        PUSH H
F6E6  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F6E9  B7        ORA A
F6EA  F2 10 F9  JP 0F910H           ; ESYNTX
F6ED  3E 01     MVI A,01H
F6EF  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F6F2  CD DA F5  CALL 0F5DAH         ; REWIND
F6F5  2A 00 01  LHLD 0100H          ; start of current BASIC line (0 = direct mode) [F]
F6F8  7C        MOV A,H
F6F9  B5        ORA L
F6FA  21 00 00  LXI H,0000H
F6FD  C2 30 F7  JNZ 0F730H
F700  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F703  01 FF 00  LXI B,00FFH
F706  CD E9 F1  CALL 0F1E9H         ; ROPEN
F709  FE 33     CPI 33H
F70B  D2 2A F7  JNC 0F72AH
F70E  0C        INR C
F70F  3E 00     MVI A,00H
F711  CD 87 F2  CALL 0F287H         ; MBLOCK
F714  CC 87 F2  CZ 0F287H           ; MBLOCK
F717  CD 1F F3  CALL 0F31FH         ; RCLOSE
F71A  C2 25 F7  JNZ 0F725H
F71D  CD FF DA  CALL 0DAFFH         ; PMSGR: print " OK\r"
F720  C0 DB     DW 0DBC0H           ; inline message pointer
F722  C3 D5 F6  JMP 0F6D5H
LF725:
                                      ; <- F71A
F725  CD FF DA  CALL 0DAFFH         ; PMSGR: print " BAD"
F728  DB DB     DW 0DBDBH           ; inline message pointer
LF72A:
                                      ; <- F70B
F72A  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F72D  C3 D5 F6  JMP 0F6D5H
LF730:
                                      ; <- F6FD
F730  01 00 00  LXI B,0000H
F733  2A 20 01  LHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F736  E5        PUSH H
F737  21 00 00  LXI H,0000H
F73A  22 20 01  SHLD 0120H          ; ERRCO: pointer to error-code variable (0 = report errors) [M][D]
F73D  CD E9 F1  CALL 0F1E9H         ; ROPEN
F740  FE 33     CPI 33H
F742  D2 53 F7  JNC 0F753H
F745  3E 00     MVI A,00H
F747  CD 87 F2  CALL 0F287H         ; MBLOCK
F74A  CC 87 F2  CZ 0F287H           ; MBLOCK
F74D  CD 1F F3  CALL 0F31FH         ; RCLOSE
F750  CA CE F6  JZ 0F6CEH           ; VERX
LF753:
                                      ; <- F742
F753  3E 01     MVI A,01H
F755  C3 CE F6  JMP 0F6CEH          ; VERX
F758  00 x5     DS 5                ; unused (00)

LOOK:                                ; [D] slot 15: LOOK: show next file name
                                      ; <- F015
F75D  F5        PUSH PSW
F75E  C5        PUSH B
F75F  D5        PUSH D
F760  E5        PUSH H
F761  3A B0 01  LDA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F764  B7        ORA A
F765  F2 10 F9  JP 0F910H           ; ESYNTX
F768  21 00 00  LXI H,0000H
F76B  01 FF 00  LXI B,00FFH
F76E  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F771  CD E9 F1  CALL 0F1E9H         ; ROPEN
F774  CD 1F F3  CALL 0F31FH         ; RCLOSE
F777  CD 5E DD  CALL 0DD5EH         ; CRLF: print CR
F77A  3E 01     MVI A,01H
F77C  32 B0 01  STA 01B0H           ; FILES: number after a DCR/FDD/HSL/CAS command (FFh = none) [M][D]
F77F  CD DA F5  CALL 0F5DAH         ; REWIND
F782  FB        EI
F783  C3 4D C1  JMP 0C14DH          ; EXIT: POP H, POP D, POP B, POP PSW, RET
F786  00 x31    DS 31               ; unused (00)

VEC2B:                               ; [C] image of RAM vectors 02C5-02E2 pointing straight into bank 2
F7A5            DB 0C3H / DW 0F0F6H ; 02C5 WOPEN: JMP F0F6 WOPEN
F7A8            DB 0C3H / DW 0F12EH ; 02C8 WBLK: JMP F12E BLOCK
F7AB            DB 0C3H / DW 0F162H ; 02CB WCLOSE: JMP F162 WCLOSE
F7AE            DB 0C3H / DW 0F1E9H ; 02CE ROPEN: JMP F1E9 ROPEN
F7B1            DB 0C3H / DW 0F213H ; 02D1 RBLK: JMP F213 RBLOCK
F7B4            DB 0C3H / DW 0F31FH ; 02D4 RCLOSE: JMP F31F RCLOSE
F7B7            DB 0C3H / DW 0F287H ; 02D7 MBLK: JMP F287 MBLOCK
F7BA            DB 0C9H,00H,00H     ; 02DA RESET/USR: RET
F7BD            DB 0C9H,00H,00H     ; 02DD DOUTC: RET
F7C0            DB 0C3H / DW 0D1E2H ; 02E0 DINC: JMP D1E2 IN0: check keyboard for new input
F7C3  00 x26    DS 26               ; unused (00)

RSTMS2:                              ; [C] show sign-on (F900 SIGNON)
                                      ; <- F516
F7DD  CD 6E F9  CALL 0F96EH         ; SIGNON
F7E0  C9        RET

PRBAN2:                              ; [C] print BANN2
F7E1  CD FF DA  CALL 0DAFFH         ; PMSGR: print "\r\r\r\r\r\r DAI COMPUTER              DCR USER\r"
F7E4  AF F0     DW 0F0AFH           ; inline message pointer
F7E6  C9        RET

BACK2:                               ; [C] return path to bank 0 (same as BACK1)
F7E7  F5        PUSH PSW
F7E8  E5        PUSH H
F7E9  21 54 F0  LXI H,0F054H
F7EC  22 E1 02  SHLD 02E1H          ; DINC address (DOS: DINKBD)
F7EF  21 96 02  LXI H,0296H         ; INSW: input switch; bit 0 = DINC input, bit 1 = DOS commands enabled [F][D]
F7F2  3E 02     MVI A,02H
F7F4  B6        ORA M
F7F5  77        MOV M,A
F7F6  E1        POP H
F7F7  AF        XRA A
F7F8  32 02 FA  STA 0FA02H          ; MEMBNK: selected F-bank [M]
F7FB  32 FE FF  STA 0FFFEH          ; BNKSL: F-bank select 0-3 (card latch U5) [M]
F7FE  F1        POP PSW
F7FF  C9        RET

;===================================================================================================
; BANK 3  (EPROM 1800-1FFF)
; 1800-18FF  00 (unused)
; 1900-19FF  the F900 page listed above (CPU sees it at F900-F9FF; selecting bank 3 shows it at F100)
; 1A00-1FFF  FF (blank)  -  manual: bank 3 free for own use except F100-F1FF
; Bank 3 is never selected by the DOS (no CALLB3 call, no exit code at F7F8-F7FF).
;===================================================================================================

;===================================================================================================
; LABEL INDEX
; name  address  space  [source]
;===================================================================================================
ABORT      F900  F900 page [C]
ACPTR      F297  bank 1    [C]
ATNOUT     F18E  bank 1    [C]
BACK1      F7E7  bank 1    [C]
BACK2      F7E7  bank 2    [C]
BANKGO     F7E7  bank 0    [C]
BANN1      F7B2  bank 1    [C]
BANN2      F0AF  bank 2    [C]
BLOCK      F12E  bank 2    [D]
BOOT       F45E  bank 0    [M]
BOOT20     F310  bank 0    [C]
BOOTGO     F490  bank 0    [C]
BRKCHK     F3C6  bank 2    [C]
BUSREL     F174  bank 1    [C]
CALLB1     F7B7  bank 0    [C]
CALLB2     F7BD  bank 0    [C]
CALLB3     F7C3  bank 0    [C]
CALLB4     F7C9  bank 0    [C]
CAS        F396  bank 0    [D]
CAS1       F390  bank 0    [C]
CIOUT      F27F  bank 1    [C]
CLOSE      F77E  bank 1    [C]
CMDC       F500  bank 1    [C]
CMDI       F4E3  bank 1    [C]
CMDN       F4F1  bank 1    [C]
CMDR       F4FB  bank 1    [C]
CMDS       F4F6  bank 1    [C]
CMDV       F4E8  bank 1    [C]
DCEDEF     F536  bank 0    [C]
DCR        F566  bank 2    [D]
DCRCHK     F5AA  bank 2    [C]
DCRN       F693  bank 2    [D]
DCRSET     F69C  bank 2    [C]
DECFIL     F68B  bank 2    [C]
DEFBNK     F91A  F900 page [M]
DEL        F59B  bank 2    [D]
DELAY      F301  bank 2    [D]
DINK20     F096  bank 0    [C]
DINKBD     F054  bank 0    [D]
DIR        F55A  bank 1    [C]
DIRENT     F5FC  bank 1    [C]
DIRKEY     F6BF  bank 1    [C]
DIRLD      F731  bank 1    [C]
DL18       F2D5  bank 2    [D]
DL36       F2D3  bank 2    [D]
DLY        F12F  bank 1    [C]
DLYL       F2F5  bank 2    [C]
DOSBOOT    F2F2  bank 0    [C]
DOSCMD     F502  bank 1    [C]
DOSERM     F740  bank 0    [C]
DOSERR     F938  F900 page [C]
DOSINI     F3F3  bank 0    [M]
DOSLIN     F0BB  bank 0    [C]
DOSRST     F619  bank 0    [C]
EDEVMM     F936  F900 page [C]
EDRIVE     F26F  bank 1    [C]
EFDDNA     F26A  bank 1    [C]
EHSL       F0A4  bank 2    [C]
ENODEV     F23E  bank 1    [C]
ENOTF      F462  bank 1    [C]
ERR2B      F32B  bank 2    [D]
ERR34      F329  bank 2    [D]
ERRCOD     F94D  F900 page [C]
ERRCOD0    F94E  F900 page [C]
ERRDEST    F955  F900 page [D]
ERRTAB     F6C1  bank 0    [C]
ERRTYP     F2D8  bank 2    [D]
ESYNTX     F910  F900 page [C]
ETIMW      F243  bank 1    [C]
ETYPE      F46D  bank 1    [C]
FCLK       F4A3  bank 2    [D]
FDBOOT     F042  bank 1    [C]
FDD0       F066  bank 1    [C]
FDDN       F08D  bank 1    [C]
FDDSEL     F0B9  bank 1    [C]
FDDX       F068  bank 1    [C]
FENTRY     F3D5  bank 2    [D]
FHEAD      F458  bank 2    [D]
FLOW       F494  bank 2    [D]
FOPENR     F447  bank 1    [C]
FOPENW     F3BA  bank 1    [C]
FRBLK      F47A  bank 1    [C]
FRCLOS     F4CA  bank 1    [C]
FREE0      F725  bank 0    [M]
FREE1      F782  bank 1    [C]
FROPEN     F42F  bank 1    [C]
FTYPE      F390  bank 1    [C]
FVER       F2DE  bank 0    [M]
FVER1      F633  bank 1    [C]
FWBLK      F3D7  bank 1    [C]
FWCLOS     F405  bank 1    [C]
FWDDI      F3BF  bank 2    [C]
FWOPEN     F3A4  bank 1    [C]
GETARG     F0FD  bank 0    [C]
GETIN      F0B0  bank 0    [C]
GETKEY     F996  F900 page [C]
HLPTXT     F678  bank 0    [C]
HSL        F036  bank 2    [C]
HSLBYT     F094  bank 2    [C]
IECEND     F245  bank 1    [C]
IECOUT     F1C8  bank 1    [C]
INIT       F4D4  bank 2    [D]
IOREST     F545  bank 0    [C]
JTAB0      F000  bank 0    [M]
JTAB1      F000  bank 1    [C]
JTAB2      F000  bank 2    [C]
KBINT      F93E  F900 page [C]
LAST       F5BC  bank 2    [D]
LECETAT    F1AC  bank 2    [D]
LISTEN     F18C  bank 1    [C]
LNOFF      F3EC  bank 0    [M]
LNON       F3E4  bank 0    [M]
LOADB      F9A1  F900 page [C]
LOADBN     F9AF  F900 page [C]
LOADO      F9D3  F900 page [C]
LOADU      F9BF  F900 page [C]
LOOK       F75D  bank 2    [D]
MBLOCK     F287  bank 2    [D]
MFWD       F384  bank 2    [C]
MFWDW      F398  bank 2    [C]
MODE98     F9F3  F900 page [C]
MREV       F38E  bank 2    [C]
MREVW      F3A3  bank 2    [C]
MSGWEN     F1C2  bank 2    [D]
NAMCAS     F0DA  bank 2    [C]
NAMER      F32F  bank 1    [C]
NAMEW      F326  bank 1    [C]
NAMUSR     F6C8  bank 2    [D]
NEEDFN     F71D  bank 0    [C]
NONERR     F387  bank 0    [D]
NOTAPE     F3AE  bank 2    [C]
ONERR      F37E  bank 0    [D]
OPEN       F348  bank 2    [D]
PFTYPE     F2C9  bank 2    [C]
PRBAN1     F7E1  bank 1    [C]
PRBAN2     F7E1  bank 2    [C]
PRNOUT     F4EF  bank 0    [C]
PRNSET     F523  bank 0    [C]
PRTERR     F762  bank 0    [C]
RBERR      F266  bank 2    [C]
RBLOCK     F213  bank 2    [D]
RBYTE      F3E0  bank 2    [D]
RCLOSE     F31F  bank 2    [D]
RCMD       F0D7  bank 0    [D]
RDBUS      F123  bank 1    [C]
RDCK       F4C1  bank 1    [C]
RDERR      F0E4  bank 1    [C]
RDHDR      F4B0  bank 1    [C]
RDLINE     F33A  bank 0    [M]
REMS       F021  bank 0    [D]
REWIND     F5DA  bank 2    [D]
RLEN       F41D  bank 2    [D]
ROPEN      F1E9  bank 2    [D]
RSTMS1     F7DD  bank 1    [C]
RSTMS2     F7DD  bank 2    [C]
SECOND     F138  bank 1    [C]
SETLEN     F544  bank 1    [C]
SETLNR     F55F  bank 0    [M]
SETRST     F330  bank 0    [C]
SETST      F0DC  bank 1    [C]
SETSTP     F56F  bank 0    [M]
SETVEB     F58A  bank 2    [C]
SETVEC     F56B  bank 2    [C]
SIGNON     F96E  F900 page [C]
SKIP       F641  bank 2    [D]
SLASH0     F408  bank 0    [M]
SLASHC     F423  bank 0    [M]
SLASHD     F3D6  bank 0    [M]
SLASHE     F41B  bank 0    [M]
SLASHF     F438  bank 0    [M]
SLASHH     F57F  bank 0    [M]
SLASHI     F43F  bank 0    [M]
SLASHM     F401  bank 0    [M]
SLASHP     F36A  bank 0    [M]
SLASHS     F451  bank 0    [M]
SLASHT     F430  bank 0    [M]
SNDNAM     F302  bank 1    [C]
SYNC       F43D  bank 2    [C]
TABCMD     F18E  bank 0    [D]
TABEND     F265  bank 0    [C]
TALK       F187  bank 1    [C]
THUNK      F7D0  bank 0    [C]
TKSA       F144  bank 1    [C]
TSTST      F36F  bank 2    [C]
UBL        F4B3  bank 0    [M]
UICMD      F4D1  bank 1    [C]
UNLSN      F16F  bank 1    [C]
UNTALK     F160  bank 1    [C]
USRBT      F516  bank 2    [C]
VEC1       F09B  bank 1    [C]
VEC2A      F4B6  bank 2    [C]
VEC2B      F7A5  bank 2    [C]
VERBLK     F6A1  bank 1    [C]
VERFIL     F690  bank 1    [C]
VERIFY     F6E2  bank 2    [D]
VERX       F6CE  bank 2    [C]
WAITK      F965  F900 page [C]
WBIT       F188  bank 2    [D]
WBYTE      F184  bank 2    [D]
WCLOSE     F162  bank 2    [D]
WLEN       F16F  bank 2    [C]
WOPEN      F0F6  bank 2    [D]
WRCK       F3FE  bank 1    [C]
X1BOOT     F2A4  bank 0    [C]
X1CLOS     F2ED  bank 0    [M]
X1COPY     F2C5  bank 0    [M]
X1DIR      F2D4  bank 0    [M]
X1ERRC     F2E8  bank 0    [M]
X1FDD0     F2A9  bank 0    [M]
X1FDDN     F2AE  bank 0    [C]
X1FORM     F2B3  bank 0    [M]
X1INIT     F2CA  bank 0    [M]
X1RBLK     F7AD  bank 0    [C]
X1RCLS     F7B2  bank 0    [C]
X1REN      F2C0  bank 0    [M]
X1ROPN     F7A8  bank 0    [C]
X1SCR      F2B8  bank 0    [M]
X1VAL      F2CF  bank 0    [M]
X1WBLK     F79E  bank 0    [C]
X1WCLS     F7A3  bank 0    [C]
X1WOPN     F799  bank 0    [C]
X2DCR0     F272  bank 0    [C]
X2DCRN     F277  bank 0    [C]
X2DEL      F295  bank 0    [C]
X2HSL      F29F  bank 0    [M]
X2INIT     F29A  bank 0    [C]
X2LAST     F28B  bank 0    [C]
X2LOOK     F290  bank 0    [C]
X2MBLK     F794  bank 0    [C]
X2OPEN     F26D  bank 0    [C]
X2RBLK     F78A  bank 0    [C]
X2RCLS     F78F  bank 0    [C]
X2REW      F27C  bank 0    [C]
X2ROPN     F785  bank 0    [C]
X2SKIP     F281  bank 0    [C]
X2VER      F286  bank 0    [C]
X2WBLK     F77B  bank 0    [C]
X2WCLS     F780  bank 0    [C]
X2WOPN     F776  bank 0    [C]

;===================================================================================================
; DAI FIRMWARE ROUTINES CALLED  (names and titles from the DAI firmware V1.1 listing)
;===================================================================================================
C14D  EXIT: POP H, POP D, POP B, POP PSW, RET                      bank 0, bank 1, bank 2
C6B4  MPT26: READ BLOCK exit, CY=1 = no error                      bank 1, bank 2
C6B5  MPT26+1: READ BLOCK exit (STC)                               bank 2
C6B6  LBK30: READ BLOCK exit, restore registers                    bank 1, bank 2
C7FB  MEMCHK: check available RAM (RESET)                          F900 page
C80C  RSTART (START FROM SCRATCH)                                  F900 page
C814  START: re-enter BASIC after run-time error                   bank 0
C823  ST20: re-enter BASIC after direct command / BREAK            bank 0
C910  RSTART part: reset SP to F900, run BASIC                     F900 page
CA34  LOOKC (FIND STRING BASIC INSTRUCTION IN TABLE)               bank 0
CA57  LOOK (TABLE LOOK UP)                                         bank 0
CAF6  FINDL (FIND LINENUMBER IN TEXTBUFFER)                        bank 0
CE6B  SCHSP: print a space                                         bank 1
CECF  MPT04 (RE-ORGANISE SCREEN AFTER 'DAI-PC')                    F900 page
CEE4  SELB0 (SELECT ROM BANK 0; PRINT MESSAGE)                     F900 page, bank 0
CEF9  MPT03 (PRINT 'COMPUTER' UNDER 'DAI PERSONAL')                F900 page
D11D  in APPEND TWO STRINGS                                        bank 1
D16D  SCOPF (TRANSFER OF STRING DATA)                              bank 0
D1E2  IN0: check keyboard for new input                            bank 0
D28A  RUN LOAD: open via ROPEN (02CE) and load program             F900 page
D2A8  RLERR (RUN LOADING ERROR)                                    F900 page
D387  RBUEX: READ BYTE exit, update checksum                       bank 2
D39B  RHLEX: read length exit, checksum                            bank 2
D3DE  MBEX: check block checksum                                   bank 2
D579  KBINT+1: keyboard interrupt service (RST 6) after its PUSH PSW F900 page
D695  MPT31 (OUTPUT ONE CHARACTER)                                 bank 0
D6A5  BREAK (KEYBOARD SCANNING: CHECK IF NEW INPUTS)               bank 2
D6BB  FGETC (INPUT SCANNING)                                       F900 page
D6DA  WSPACE (WAIT FOR SPACEBAR)                                   F900 page
D790  MPT25: calculate free space                                  bank 1, bank 2
D795  CASIN (TRANSFER DATA/CASSETTE VECTORS)                       bank 0
D7ED  in: FAST PRINTING                                            bank 2
D98F  SNDDI (DISABLE SOUND INTERRUPTS)                             bank 1, bank 2
D9F5  ERROR: report error A                                        F900 page, bank 0
DA0B  ERRSN: SYNTAX ERROR                                          bank 0
DA75  MSGIL (PRINT LINE NUMBER IN WHICH ERROR OCCURED)             bank 0
DAD4  PMSG: print message at HL                                    bank 0, bank 1
DAFF  PMSGR (PRINT MESSAGE POINTED TO BY NEXT 2 BYTES)             bank 1, bank 2
DB0D  PSKP (CURSOR TO NEXT FIELD)                                  bank 0
DB44  PSTRM (PRINT STRING MESSAGE)                                 bank 0, bank 1
DB5F  IBCP (CONVERT MACC FOR FIXED POINT OUTPUT)                   bank 1
DD45  EXIT1: POP H, POP PSW, CMC, RET                              bank 0
DD55  COL0 (CURSOR TO COLUMN 0)                                    bank 0, bank 1
DD5E  CRLF: print CR                                               F900 page, bank 0, bank 1, bank 2
DD60  OUTC: output character A                                     bank 0, bank 1
DDD2  IGNB: get next non-blank character from line                 bank 0
DDE0  EFETCH (GET CHARACTER TO ENCODE)                             bank 0
DE02  ALPHA (CHECK IF UPPER CASE CHARACTER)                        bank 0
DE0D  NUMER: check for digit                                       bank 0
DE1A  SUBDE (CALCULATE LENGTH OF BLOCK)                            bank 2
DE41  DELAY: delay routine                                         bank 1, bank 2
DE4F  MOVE: block transfer DE..HL -> BC                            bank 1, bank 2
DE7C  FILL (FILL BANK WITH IDENTICAL DATA)                         bank 0
DEB8  RNEW: clear program (NEW)                                    F900 page, bank 0
EF74  ROM bank 3 L3E350 (READ STARTADDRESS FROM TAPE)              bank 2
EF8A  ROM bank 3 L3E352 (READ DATA FROM TAPE)                      bank 2
EFB4  ROM bank 0 SLN10 (in: LIST A LINENUMBER)                     bank 0

;===================================================================================================
; EPROM IMAGE  -  2764 (8K x 8), Intel HEX, EPROM offsets 0000-1FFF
; Program into a 2764 or 27C64. Bank 0 = 0000-07FF, bank 1 = 0800-0FFF, bank 2 = 1000-17FF, bank 3 = 1800-1FFF.
; SHA-256 of the 8192-byte binary: 7941cfbaa1c95613e55398838c6117a9603916c692811a2955636f45d530ab15
; Byte sum (16 bit) of the image: 227E   (bank 0 EEED, bank 1 6140, bank 2 4DBD, bank 3 8494)
; Read from the card on 2026-10-13 through BASIC PEEK; every byte read at least twice with identical results.
;===================================================================================================
:10000000C321F0C37EF3C387F3C36DF2C372F2C39F
:1000100090F3C37CF2C381F2C386F2C38BF2C39028
:10002000F2F5C5D5E5210A00392299020AFEA9C2D6
:100030004DC1030A3C32340160692232013E013273
:1000400035014FCDD7F0AF323501329A020DCA0BD0
:10005000DAC34DC1E52117017E23B66F3A3101E6BF
:100060007EB5E1C2B0F03A90FAB7CA96F0E5EF0C6F
:100070002DE1C296F0CDB0F0F5FE20C29AF0D5E5A4
:100080002A91FACDB4EF2A93FAEB2A91FA19229128
:10009000FAE1D1C3AEF0CDB0F0F5FE0DCABBF0FE73
:1000A00009C2AEF03E0CCD95D63E2ACD95D6F1C90B
:1000B0003A9602E601CAE2D1C3E30235F1218FC8C4
:1000C000E3210000392299020E01D5CDD7F0D1E10C
:1000D000AF329A02C345DD2A97021E017CB5C8C51E
:1000E000CD34CADAEEF0C17E23666FC3DAF05E2348
:1000F00056CDFDF079C14F21D7F0E5EBE92121FA8A
:100100003600CDD2DDCD0DDEDA0EF13E2F0D0CD650
:100110003032B001CDD2DDFE22C230F10CCDE0DDB7
:100120000CFE0DCA0BDAFE22CA75F17723C31DF14E
:10013000CDD2DDFE0DCA77F1FE3ACA77F1D5410D79
:100140001600140C7AFE0FDA4BF115CDE0DDCD026E
:10015000DEDA42F1CDE0DDFE24C20BDA790C90E666
:100160000FF62057CD57CAD20BDA235E2356212132
:10017000FACD6DD1D1360DCDD2DD0CFE3AC8FE0DD3
:10018000C83AB001B7F277F10E0111AEF0C90352CF
:1001900045577CF204534B495081F2034341539637
:1001A000F30344435277F20344454C95F2044C4127
:1001B00053548BF20356455286F2044C4F4F4B90EA
:1001C000F20348534C9FF203464444AEF206464FB6
:1001D000524D4154B3F20753435241544348B8F28D
:1001E0000652454E414D45C0F204434F5059C5F2A9
:1001F00004494E4954CAF20556414C4944CFF203D2
:10020000444952D4F20446564552DEF204424F4F5E
:10021000545EF40355424CB3F403555352DA0204CE
:100220004C4E4F4EE4F3054C4E4F4646ECF3022F36
:1002300044D6F3022F506AF3022F5351F4022F4D8C
:1002400001F4022F3008F4022F451BF4022F432340
:10025000F4022F5430F4022F493FF4022F4638F4B1
:10026000022F487FF50019FA0000000000CDBDF70D
:1002700000C9CDBDF703C9CDBDF706C9CDBDF7098E
:10028000C9CDBDF70CC9CDBDF70FC9CDBDF712C99A
:10029000CDBDF715C9CDBDF718C9CDBDF730C9CD56
:1002A000BDF733C9CDB7F700C9CDB7F703C9CDB78F
:1002B000F706C9CDB7F71BC9CDB7F71ECD55DDC9B8
:1002C000CDB7F721C9CDB7F724C9CDB7F727C9CD29
:1002D000B7F72AC9CDB7F72DC90000000000F5CD4A
:1002E0001DF7F1CDB7F730C9CDB7F733C9CDB7F7A3
:1002F00036C9F5C5D5E5CD19F6CDBDF7303A00FACA
:10030000B7CA10F32A07FAE5CD30F3214DC1E3E96E
:10031000CDB7F7003A15FAE6BFCA2AF3CDBDF70309
:10032000CDBDF700CA2AF3CD90F3CD30F3C34DC154
:100330003EFF320FFA3C329A02C9F5D5E523235627
:10034000235EEBCDF6CAD260F3E52323237EE1FEE4
:10035000A2C260F32224013EFF322301E1D1F1C9A0
:100360003E04C3F5D90000000000E521EFF422DED1
:10037000023E803231013A1CFA32F5FFE1C9E52331
:100380002323222001E1C9E5210000222001E1C947
:10039000F53EFFC39AF3F53AB001B7F2A0F33E0180
:1003A000E6033209FA07070707323D013E01320A28
:1003B000FAD5E52AE402E5CD95D7E122E4023EC371
:1003C00032DD0232E30221EFF422DE022154F02278
:1003D000E102E1D1F1C9F53A1CFA32F5FF3E0132F2
:1003E0003101F1C9F53EFF3290FAF1C9F5AF329013
:1003F000FAF1C9F3CD19F6CD90F33EFF320FFAFBB7
:10040000C9F53EFFEF18F1C9F5CD01F43E0CEF033D
:10041000CD23F4CD30F4CD3FF4F1C93E02323501A5
:10042000C323C8F53E013274003E5F327500F1C946
:10043000E521EEC7EF06E1C9F5D5E5AFC344F4F514
:10044000D5E53E10117502219002CD7CDEE1D1F19F
:10045000C9F53A1DFA32F5FFAF323101F1C9CD1DB0
:10046000F706001120FA2151FA131AFE2CCA76F46D
:10047000770423C369F42150FA7006002171FA133E
:100480001AFE0DCA8CF4770423C37FF42170FA702E
:100490003100F92100002200012299022150FACDF9
:1004A000D3F9229B02CDB8DECDE4CE00002170FA54
:1004B000C3AFF9CD1DF706001120FA2171FAE5212D
:1004C00051FA131AFE0DCAD3F47723E37723E3041A
:1004D000C3C2F4362F23364FE3362F233642E104CE
:1004E000042150FA702170FA70C390F4000000F5F6
:1004F000C5E547EF032102FE3A6100FE88C423F5FB
:100500007EE620CA1CF57EE610C206F5783200FEB3
:10051000FE0D3E023203FE3E033203FECC36F5E111
:10052000C1F1C93E883203FE3261003E403201FE15
:100530003E033203FEC9CDF3F93A0AFAFE03C03E88
:10054000203201FEC921B4DD22E1022196023EFDE6
:10055000A6773A3101D680C03C323101C90000F59E
:10056000E523237E3292FA237E3291FAE1F1C9F536
:10057000E523237E3294FA237E3293FAE1F1C9F522
:10058000D5E5CD5EDD2178F61104003E04CD44DBD7
:100590003A0AFAFE02DAA3F5CAA2F5FE03CAA1F5E9
:1005A0001919193E04CD44DB3A09FAC630CD60DD95
:1005B000CD0DDB218CF61104003E04CD44DB3A96D0
:1005C00002E601CAC7F5193E04CD44DBCD0DDB219F
:1005D00098F61105003E05CD44DB3A3101FE01DA03
:1005E000EDF5CAECF5FE02CAEBF51919193E05CD79
:1005F00044DBCD0DDB21B1F61104003E04CD44DB1C
:100600003A8F02FE10DA0DF6CA0CF619193E04CD27
:1006100044DBCD5EDDE1D1F1C9F5E53EC032F5FF49
:10062000321DFA321CFA218EF1229702AF3202FA01
:1006300032C402320FFA3290FA3219FA2100002243
:100640001AFA210A002291FA2293FA213EF9226E27
:10065000002154F022E10221B4DD22E4023EC33243
:10066000E30232DD0221EFF422DE022196023E0295
:10067000B677CD87F3E1F1C94558543A2043415349
:1006800020444352204644442048534C494E3A208B
:100690004B45594244494E434F55543A20525332E8
:1006A00033325343524E204544495420444F55540D
:1006B00043494D502046505420494E5420535452E3
:1006C00020D1F6DDF6EBF6FAF604F70AF700001390
:1006D000F7454E44204F4620544150450044435274
:1006E00020444F4F52204F50454E004550524F4DE1
:1006F000204F522048534CDCC70046494C4520DB74
:10070000F7DC8C00464444DCC700DC0D54494D4501
:10071000DC150044455649434520DC8C003A21FA5B
:10072000B7CA0BDAC900000000000000000000009A
:1007300000000000000000000000000000000000B9
:1007400047CDD6F3CDE4CE00003A1801B7CA59F729
:10075000CD62F7CD75DAC314C8CD62F7CD55DDC3D0
:1007600023C8CD55DD7821C1F6875F1600195E23B9
:1007700056EBCDD4DAC9CDBDF71BC9CDBDF71EC927
:10078000CDBDF721C9CDBDF724C9CDBDF727C9CD52
:10079000BDF72AC9CDBDF72DC9CDB7F709C9CDB76A
:1007A000F70CC9CDB7F70FC9CDB7F712C9CDB7F759
:1007B00015C9CDB7F718C9F53E01C3D0F7F53E020C
:1007C000C3D0F7F53E03C3D0F7F53E0400000000A8
:1007D0003201FA2203FAE12205FACD45F5E37E2340
:1007E000E36F26F0CDE7F7E52A05FAE50000000003
:1007F00000002A03FA3A01FA3202FA32FEFFF1C986
:10080000C342F0C366F0C38DF0C3A4F3C3D7F3C3F0
:1008100005F4C32FF4C37AF4C3CAF4C3F1F4C3F6E6
:10082000F4C3FBF4C300F5C3E3F4C3E8F4C35AF51F
:10083000C333F6C3E4F0C37EF700000000000000FD
:100840000000CD41DECD41DECD41DE210000392268
:100850009902CD66F03A15FAE6BFC261F0CDDDF738
:10086000C92A9902F9C9F5AF3209FAC6083210FA55
:100870003E03320AFAC5D5E5CDB9F0119BF021B996
:10088000F001C502CD4FDECDD1F4C34DC1F53AB074
:1008900001B7F296F03CE603C368F0C399F7C39E34
:1008A000F7C3A3F7C3A8F7C3ADF7C3B2F7C310F9F3
:1008B000C90000C3EFF4C354F0F53A0AFAFE03C2CC
:1008C00036F9CDF3F93E203201FE3E103202FEE54C
:1008D0002100002215FA2217FAE1F1C9E52115FAE3
:1008E000B677E1C9F5C5CDB9F03A10FACD87F13E3A
:1008F0006FCD44F1CD97F247CD97F24FB0D630F59A
:10090000CA13F1CD55DD783217FACD60DDF1F579F6
:10091000C460DDCD97F24FFE0DC20DF1F1CD60F157
:10092000C1F1C9E52100FE7EBEC227F187E1C9F50C
:100930003E023DC232F1F1C93211FACDC8F13E0694
:100940003203FEC93211FACDC8F13E013203FE3E38
:10095000063203FE3E023203FECD23F1FA59F1C9FD
:100960003E033203FE3E073203FE3E5FC371F13E9B
:100970003FCD8EF13E063203FECD2FF13E02320313
:10098000FEAF3203FEFBC9F640C38EF1F620F53A06
:1009900016FAB7F2A5F1F6803218FACDC8F1AF32E7
:1009A00016FA3218FAF13211FAF3AF3203FE3E02B0
:1009B0003203FE3E073203FEF33E033203FEAF3244
:1009C00003FE3E813DC2C4F1C5D5E53A11FA4FAFF1
:1009D0003203FECD23F1DA3EF23E023203FE3A1834
:1009E000FAB7F2F1F1CD23F1D2E5F1CD23F1DAEB53
:1009F000F1CD23F1D2F1F13E033203FE06082100CE
:100A0000FECD23F1D243F2791F4FDA12F23E01C339
:100A100013F2AF3203FE3E02003203FECD2FF13E51
:100A2000033203FEAF3203FE05C207F211A0001B22
:100A30007AB3CA43F2CD23F1DA2FF2C3B6C63E80B1
:100A4000C345F23E01CDDCF0E1D1C1CD74F13A0FE6
:100A5000FAB7CA55F03A15FAE603C26FF23A15FA38
:100A6000B7FA6AF2E640C262F4C93E04C338F9CD6F
:100A7000E4F03A17FAB73E05CA38F93CC338F9F53D
:100A80003A16FAB7FA8FF2F6803216FAC392F2CD1E
:100A9000C8F1F13211FAC9C5D5E506002100FEF30F
:100AA0007E87F2A0F20EFFAF3203FE0DCAE7F27EA0
:100AB00087FAABF206087E87F2B6F2791F4F7E877F
:100AC000FABEF205C2B6F2FB7E87FAC8F23E0132E8
:100AD00003FE3A15FAE640CAE0F2CD2FF1CD79F1E6
:100AE000793211FAC3B6C678B7CAF4F2CD60F13ED6
:100AF00002C345F23E013203FE3E40CDDCF004C3AA
:100B0000A5F2F5D5E53A10FACD8CF13A12FAF6F0E5
:100B1000CD38F1211EFA5E237ECD7FF21DC217F380
:100B2000CD6FF1C31DD1F5CD90F33E57C336F3F52C
:100B300078CD90F33E523214FAC5D5E50610237EE7
:100B4000FE25C247F304042B7EB7CA10F9B8DA5267
:100B5000F378F5545D011EFA3C6F260019CD4FDE87
:100B6000211FFA7EFE25C273F3237EFE3AC210F9DE
:100B70002B36402BF1C60477DE035F160019362CA6
:100B8000233A13FA7723362C233A14FA77C34DC14C
:100B9000FE30CA9EF3FE31CA9CF33E2FC604C62027
:100BA0003213FAC9F5CD26F32A200136003E62320F
:100BB00012FACDBAF3F1CD7FF2C9CDB9F0CD02F37F
:100BC000CDE4F03A17FAB7C268F43A10FACD8CF1D6
:100BD0003A12FACD38F1C9C5D506567ACDFEF37B67
:100BE000CDFEF378CD7FF206567AB3CAF7F31B7EBB
:100BF00023CDFEF3C3E9F378CD7FF2D1C1C9CD7F18
:100C0000F2A80747C9F5CD6FF13A12FAB7FA23F403
:100C10003A10FACD8CF13A12FAE6EFF6E0CD38F15F
:100C2000CD6FF1CDE4F03A17FAB7C268F4F1C9CD4F
:100C30002FF33E623212FACD8FD9CD47F4CD97F221
:100C4000F590C26DF4F1C9CDB9F0CD02F33A10FAC6
:100C5000CD87F13A12FACD44F13A15FAE640C26274
:100C6000F4C9CD60F1CDE4F03E06C338F90504CAFD
:100C700045F4CD60F13E03C338F9C5D5E5CD90D735
:100C8000EBCDB0F4B73E00C2ACF4E519D13CE1E5E0
:100C9000DAACF406567AB3CAA3F41BCDC1F47723B9
:100CA000C395F4CD97F2B83E02CAB4C6B7C3B6C670
:100CB000C50656CDC1F467CDC1F46FCD97F290C192
:100CC000C9CD97F2F5A80747F1C9F5CD60F1C30981
:100CD000F4E5211FFA365523364923362D233E0DE0
:100CE000C30CF53E49C3EAF43E56E5F53E0DC30696
:100CF000F53E4EC302F53E53C302F53E52C302F524
:100D00003E43E5F53E3A2120FA77F12B77CD44F5C5
:100D1000CDB9F03A10FACD8CF13A15FAB7FA6AF279
:100D20003EFFCD38F1D5211EFA5E237ECD7FF21D28
:100D3000C22AF5D1CD6FF1CDE4F03A17FAFE31D2E7
:100D400068F4E1C9E5C5211EFA06FF04237EFE0D05
:100D5000C24BF578321EFAC1E1C9F5C5D5E5CDB96A
:100D6000F03E603212FA210124221EFACD02F33A3B
:100D700010FACD87F13A12FACD44F13EFFEF18CDCB
:100D80005EDD3E0CEF0306150E20211DFA23CD97E4
:100D9000F2770DC28DF5360D2336003A22FAB7CA26
:100DA000BCF5FE20CACEF53A15FAE6BFC2F3F5CD82
:100DB000FCF523CDD4DACDBFF6C3F3F50E05CD6B2C
:100DC000CE0DC2BEF52125FACDD4DAC388F5CDFC0F
:100DD000F5237EFE22C2D1F5CDD4DA05C288F5CD49
:100DE000BFF6FE12CAF3F53E0CEF033CEF03061507
:100DF000C388F5CD5EDDCDCAF4C34DC1C52A20FA46
:100E0000AFC5D54C5547E712D1C1CD5FDB2A33C002
:100E1000D556237EFE20C21BF623157AD1CD44DBA6
:100E200021E3003E069647CD6BCE05C227F6C121D1
:100E300021FAC9F5C5D5E53E623212FA1120FA2130
:100E40001EFAE506FF1323041A77FE0DC245F6E1EC
:100E5000702A00017CB5F3C273F6CD5EDDCD90F64D
:100E6000C26BF6CDFFDAC0DBC38CF6CDFFDADBDB7D
:100E7000C38CF62A2001E5210000222001CD90F646
:100E8000CA85F63E01E1222001CD4EF9FBC34DC1DA
:100E9000CD47F4CD97F2AFCDA1F6CCA1F6CDCAF4F3
:100EA000C9C5D5E5CDB0F4B7C2BCF6E5D10656CD7F
:100EB000C1F41B7AB3C2AFF6CD97F2B8C3B6C6C5BC
:100EC000D5E52A7400220DFA217400360123363C40
:100ED000211E16EF09CD96F9FE10DAD5F6FE21D2C5
:100EE000D5F6FE10CA0BF7FE11CA15F7FE12CAFBA3
:100EF000F6FE17CA1FF7FE20C2D3F6F52A0DFA2216
:100F00007400210001EF09F1C3B6C67CFE17CAD3F5
:100F1000F624C3D3F67CFE02CAD3F625C3D3F6CD9E
:100F2000CAF4E52A0DFA227400E12E05EF092A72AF
:100F3000000615111FFA2B2B7E121305C236F7215E
:100F400031FA061305CA62F72B7EFE22C244F73639
:100F50000DCD44F52131FA7EFE50CA6AF7FE55CA1E
:100F600076F7210001EF09C375F42100002200018A
:100F700024EF09C3A1F9210001EF09C3BFF9F5C3AB
:100F800009F4000000000000000000000000000064
:100F90000000000000000000000000000000000051
:100FA0000000000000000000000000000000000041
:100FB00000000D0D0D0D0D0D2044414920434F4DF6
:100FC0005055544552202020202020202020202031
:100FD000202020444F5320313534310D00CD6EF99F
:100FE000C9CDFFDAB2F7C9F5E52154F022E10221BB
:100FF00096023E02B677E1AF3202FA32FEFFF1C945
:10100000C348F3C366F5C393F6C3DAF5C341F6C329
:10101000E2F6C3BCF5C35DF7C39BF5C3F6F0C32E80
:10102000F1C362F1C3E9F1C313F2C31FF3C387F243
:10103000C3D4F4C336F0F5D5E53AB001B7F244F0C5
:101040003C32B001FE04F210F93209FA3E04320AD1
:10105000FACDF3F93AB0010707C6103201FE3E019E
:101060003203FE3D3203FECD94F0FEFDC2A4F0CD6E
:1010700094F06FCD94F067CD94F057CD94F05FCDA0
:1010800094F077231B7AB3C27FF02100002201FE87
:10109000E1D1F1C93E033203FE3A00FEF53E0232D1
:1010A00003FEF1C92100002201FE3E02C338F90D02
:1010B0000D0D0D0D0D2044414920434F4D50555409
:1010C00045522020202020202020202020202020C9
:1010D00044435220555345520D0008434153534554
:1010E0005454450000000000000000000000000013
:1010F000000000000000C5F5E52A200136002A00A6
:10110000017CB5C20EF1CDFFDAC2F1CD65F937CD64
:1011100048F3C2FEF0E1CDF5F2CD41DE3EAACD842A
:10112000F15EAF572300F1D5CD84F1C33AF1C5D5B7
:10113000CDF5F23EAACD84F17F7F3E00CD6FF10167
:1011400000567AB3CA50F11B7E23CD84F1C342F11D
:1011500000000078CD84F1D1C1CDACF13E0A32025D
:10116000FEC9F53E083202FECD01F3FBC320F306B3
:10117000567ACD84F1E3E37B7BCD84F1E3E37878A9
:1011800000000078D5160800075F3E02173203FE04
:101190001F3F1715CDACF13203FE7BC2A3F1D1A8DE
:1011A0000747C9E3E3E3E3E3E3C388F1E5F521009F
:1011B000FE7EE602CA2BF37EE660C229F37FBFF112
:1011C000E1C90D494E534552542057524954452DBB
:1011D000454E41424C454420B0DA2C5052455353C1
:1011E000208E56000000000000F55E23AF57CD486A
:1011F000F3C2ECF1F1CD58F4F5CDC9F290CD94F2F3
:10120000F5F1B7CA88F50504CA88F50D0CC45EDD92
:10121000C3ECF1C5D5E5CD90D7EBCD3DF4D266F268
:10122000CDA3F4CD1DF4DA66F2B73E00C268F2E554
:1012300019D13CE1E5DA68F206567AB3CA4EF21BE0
:10124000CD37F4DA66F27723E3E300C33AF2CDE078
:10125000F3CD1FF3DA66F2B83E02C268F2F5AFCD05
:101260004EF9F1C3B4C63E03B7CD1FF3F5CD55F922
:10127000CA7BF2F1CD4DF9AFC3B5C6F1C3B6C60016
:1012800000000000000000C5F5CD3DF4F1C1CDD354
:10129000F2000000C5E547D5E5CD1DF4DAD8F2B778
:1012A000C2D8F2E5CD1ADE7CB56768D10656E37A7E
:1012B000B3CA11F41BCDD5F3CD87D3DAD8F2CDC99B
:1012C000F2AE23E3B467C3AEF20D0CE5C2EDD7E195
:1012D000C90000E3E3E3E3C9E1D1CD1FF3CD55F944
:1012E0003E01CAEDF2B5E603CD4DF9AF6FB5E1C1F0
:1012F000C900000000F3CD5CF1E5D521E7FFC3068E
:10130000F3E5D521FBFF545D19DA08F3D1E1C900FB
:10131000000000000000000000000000000000F5D8
:10132000AF3202FE3201FEF1C93E01F5F52323364C
:1013300000CD55F9E17CCA38F9F1C6012A200177C0
:10134000F1E1C90000000000F53A0AFAFE02C236D7
:10135000F9E521ECFF397E77E13E983203FE3261F8
:10136000003A1F010707C6033201FECDC6F3F13A6A
:1013700000FED27CF3E662EE02C380F3E622EE02C8
:10138000C41FF3C9AF3202FE3E023202FEC9AF32C1
:1013900002FE3E013202FEC93E023202FECD01F3E0
:1013A000C384F33E013202FECD01F3C38EF3F53E5A
:1013B000FF32B001FBCDDAF5CD01F3CD48F3F1F307
:1013C000F5CD98F3F1C9CDA5D6D26FF3CD1FF3C3F8
:1013D00000F90000003A00FEC50E010609C3ECF357
:1013E000C50E01060905CA0BF43A00FEB7F2E5F393
:1013F0001F7917DA0EF44F060F05CA0BF43A00FEF8
:10140000B7FAF9F3E622EE02CAE3F3CD1FF33FC1C8
:10141000C9CDD5F3CD1FF3DAD8F2C3DED3CDD5F3E2
:10142000C50656CD87D367D4D5F2D437F46FD4D35D
:10143000F2D4E0F3C39BD3CDE0F3C387D3AFCD4861
:10144000F3C0CD84F301B400CD94F4C23DF4060F93
:10145000CD94F4CDD5F33FC9C5CD8FD9CD70F4CDA2
:10146000D5F3DA5CF4CDA3F4CDE0F3DA5CF4C1C9D2
:10147000CDBFF3FBCDC6F3F3C28EF4CD84F3060FDC
:10148000CD94F4C273F40696CD94F4E680C0CDAE4C
:10149000F3C373F40B78B1C83A00FEE6A2EE02CAB9
:1014A00094F4C9C5F5060F05CAB3F43A00FEE68008
:1014B000C2A7F4F1C1C9C376F7C37BF7C380F7C3F2
:1014C00085F7C38AF7C38FF7C394F7C90000C3EF4A
:1014D000F4C354F0AF321F01CD8AF5CD48F3C20BEF
:1014E000F537CD6FF3CA0BF5CD01F3CD01F3AF4F57
:1014F000473D32B001CDDAF521C8F6CDE9F121FB47
:10150000FF397EFE31CA16F5CDDAF5CD1FF3CD6673
:10151000F5AF3200FAC9CDDDF71604D5D115CA08EA
:10152000F5D5CDDAF521C8F6CDE9F1CD74EFD21CB1
:10153000F5E5D51100F9CD8AEFD1E1D21CF5D12224
:1015400007FACD66F53E013200FAC900000000003E
:10155000000000000000000000000000000000008B
:10156000000000000000F5AFC39CF6D5E5C511B63C
:10157000F421D4F401C502CD4FDE3A1F013209FA3D
:101580003E02320AFAC1E1D1F1C9F5D5E5C511A58E
:10159000F721C3F7C374F500000000F5CDAAF5C22A
:1015A000A8F5CDC6F3CAA2F5F1C93AB001B7F21059
:1015B000F937CD48F3C03E0A3202FEC9F5CDC4F575
:1015C000C5C380F6CDAAF5C0CDC6F3C0CD8BF6C895
:1015D0003DCDD3F2C2D0F5C3C8F5F5AFCD48F3C2C7
:1015E000DCF5CD01F33AB001B7CD92F3FAA2F5C51F
:1015F000CA3AF6F3CDA3F30601CD94F4FBCDC6F3BE
:10160000F3C23AF6CD8EF3061ECD94F4C2FCF50675
:10161000FFCD94F4CA0FF6E680CA3AF6CD8BF6C237
:10162000FCF5CDF9F2AFCD9AF3CD98F30608CD9441
:10163000F4CA3AF6CD6FF3CA2CF6CD1FF3C1F1FB15
:10164000C9F5AFCD48F3C243F6CD01F33AB001B7C7
:10165000C5CA3AF6CD8FD9CDBFF30696CD94F4FB2B
:10166000CDC6F3F3C23AF6CD84F3060ACD94F4C2A4
:101670005FF6CD8BF6CA3AF60696CD94F4C25FF6C5
:10168000CDA3F33E0132B001C3FCF53AB0013D32C7
:10169000B001C9F53AB001B7F29CF63CE603321F3F
:1016A000010707C6033201FEC36BF500000000000E
:1016B000000000000000000000000000000000002A
:1016C0000000000000000000045553455200E122D4
:1016D0002001CD4EF9FBC34DC10000000000000009
:1016E0000000F5C5D5E53AB001B7F210F93E013278
:1016F000B001CDDAF52A00017CB5210000C230F737
:10170000CD5EDD01FF00CDE9F1FE33D22AF70C3EBC
:1017100000CD87F2CC87F2CD1FF3C225F7CDFFDADB
:10172000C0DBC3D5F6CDFFDADBDBCD5EDDC3D5F69E
:101730000100002A2001E5210000222001CDE9F16D
:10174000FE33D253F73E00CD87F2CC87F2CD1FF3A4
:10175000CACEF63E01C3CEF60000000000F5C5D5A6
:10176000E53AB001B7F210F921000001FF00CD5EAB
:10177000DDCDE9F1CD1FF3CD5EDD3E0132B001CD0F
:10178000DAF5FBC34DC100000000000000000000BE
:101790000000000000000000000000000000000049
:1017A0000000000000C3F6F0C32EF1C362F1C3E9EC
:1017B000F1C313F2C31FF3C387F2C90000C90000CD
:1017C000C3E2D100000000000000000000000000A3
:1017D00000000000000000000000000000CD6EF9D5
:1017E000C9CDFFDAAFF0C9F5E52154F022E10221BD
:1017F00096023E02B677E1AF3202FA32FEFFF1C93D
:1018000000000000000000000000000000000000D8
:1018100000000000000000000000000000000000C8
:1018200000000000000000000000000000000000B8
:1018300000000000000000000000000000000000A8
:101840000000000000000000000000000000000098
:101850000000000000000000000000000000000088
:101860000000000000000000000000000000000078
:101870000000000000000000000000000000000068
:101880000000000000000000000000000000000058
:101890000000000000000000000000000000000048
:1018A0000000000000000000000000000000000038
:1018B0000000000000000000000000000000000028
:1018C0000000000000000000000000000000000018
:1018D0000000000000000000000000000000000008
:1018E00000000000000000000000000000000000F8
:1018F00000000000000000000000000000000000E8
:10190000CD1AF92A99027CB7CA0CC8F93E0237C928
:101910003E17F5CD1AF9F1C3F5D9F5E52154F022BA
:10192000E1022196023E02B677E1AF323501320282
:10193000FA32FEFFF1C93E07CD1AF9C340F7F53A76
:10194000C402FE1FC279D5CD1AF9C379D53CE52A68
:10195000200177E1C9E52A20017CB5CA63F92A0094
:10196000017CB5E1C9CDDAD6D25EDDC300F9D5CDB3
:10197000FBC72B11E0C7EF00CDE1F72AA502117BD1
:101980000919365F11D0FF19CDF9CE160FCDCFCE84
:1019900015C28DF9D1C9CDBBD6DA96F9CA96F9B779
:1019A000C9CD1AF9CDE4CE0000CDB8DE211EFA0172
:1019B0000030CDBBF9CD5EDDC310C9C5C38AD2CD21
:1019C0001AF93EFF321801211EFACDD3F9AF32B910
:1019D00002CF09010031CDCE02210BFA110DFACD53
:1019E000D1022100F9EB2A0BFADCD102CDD402D2CC
:1019F000A8D2C93E983203FE326100C9FFFFFFFF43
:101A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:101A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
:101A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:101A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
:101A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
:101A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96
:101A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86
:101A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76
:101A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66
:101A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
:101AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46
:101AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36
:101AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26
:101AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16
:101AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
:101AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
:101B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5
:101B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5
:101B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5
:101B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5
:101B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5
:101B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95
:101B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85
:101B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75
:101B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65
:101B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55
:101BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
:101BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35
:101BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25
:101BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15
:101BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05
:101BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5
:101C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4
:101C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4
:101C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4
:101C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4
:101C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4
:101C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94
:101C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84
:101C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74
:101C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64
:101C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54
:101CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
:101CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34
:101CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24
:101CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14
:101CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04
:101CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4
:101D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3
:101D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3
:101D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3
:101D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3
:101D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3
:101D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93
:101D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83
:101D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
:101D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63
:101D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53
:101DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43
:101DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
:101DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23
:101DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13
:101DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03
:101DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3
:101E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2
:101E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
:101E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2
:101E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
:101E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2
:101E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
:101E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82
:101E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
:101E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
:101E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
:101EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42
:101EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
:101EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
:101ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
:101EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02
:101EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
:101F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
:101F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
:101F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
:101F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
:101F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1
:101F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
:101F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81
:101F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
:101F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
:101F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
:101FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41
:101FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
:101FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21
:101FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11
:101FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01
:101FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
:00000001FF
