home *** CD-ROM | disk | FTP | other *** search
- ;
- ; DISK UTILITY - DU.ASM
- ; (revised 10/26/80)
- ;
- ;DU.ASM 8/6/78 BY WARD CHRISTENSEN
- ;
- ;10/26/80 ADD CRT BACKSPACE AND CTL-X (DELETE LINE). (BRR)
- ;
- ;10/25/80 ADD CHANGES FOR INDUSTRIAL MICRO SYSTEMS DBL AND QUAD
- ; (DBL DENS, DBL SIDED) FORMATS. PUT REVISION LIST
- ; IN REVERSE ORDER FOR READER CONVENIENCE. CHANGED ASCII
- ; DUMP ROUTINE TO IGNORE BIT 7 AND NOT PRINT ASCII 7EH,
- ; WHICH IS LEAD-IN CODE ON SOME CRT'S. (BRR)
- ;
- ;08/12/80 ADD CHANGES FOR MICROMATION SINGLE-SIDED DBL DENSITY
- ; FORMAT - NOTE - FOR TRACKS 2-76 ONLY (TRACKS 0 & 1
- ; ARE SINGLE DENSITY) (CHARLES STROM)
- ;
- ;07/01/80 ADD CHANGES FOR THINKER TOYS DJ2D CONTROLLER AND
- ; 1024 BYTE DOUBLE DENSITY SECTORS
- ; (Jeff Hammersley)
- ;
- ;02/16/80 CORRECT VERSION 2.0 INCOMPATIBILITY IN 'F' COMMAND
- ; CHANGE DISPLAY TO SHOW BOTH RELATIVE AND PHYSICAL SECTOR
- ; (BRUCE RATOFF, ACGNJ)
- ;
- ;12/04/79 CORRECT ERROR IN GROUP NUMBER DISPLAY FOR
- ; NORTHSTAR DOUBLE DENSITY. (KBP)
- ;
- ;11/27/79 ADD CHANGES FOR DIGITAL MICROSYSTEMS
- ; DOUBLE DENSITY USING THE FDC3 CONTROLLER
- ; BOARD, AND NORTHSTAR DOUBLE DENSITY (KBP)
- ;
- ;09/04/79 ADD REGISTER SAVES TO DIRECT VECTOR
- ; CALLS. REMOVE UNUSED MACRO. DELETED
- ; SEVERAL UNUSED ROUTINES. (KBP)
- ;
- ;03/18/79 ADD CHANGES TO CALCGRP ROUTINE TO ALLOW
- ; FOR CONDITIONAL ASSEMBLY FOR CP/M ON
- ; MICROPOLIS. (KBP)
- ;
- ;03/15/79 ADD CHANGES FOR CP/M ON MICROPOLIS
- ; FIX WRAP-AROUND FROM TRACK 0 TO TRACK 76
- ; ON MINUS COMMAND.
- ; (BY KEITH PETERSEN, W8SDZ)
- ;
- ;02/25/79 PUT SECTOR READ INTO "S" COMMAND
- ;
- ;11/26/78 ADD DISK # TO LOGIN COMMAND
- ;
- ;11/12/78 ADD LOGIN COMMAND
- ;
- ;
- ;
- STDCPM EQU 0 ;TRUE IF STANDARD CP/M
- MICROP EQU 0 ;TRUE IF MICROPOLIS CP/M
- DIGDBL EQU 0 ;TRUE IF DIGITAL MICROSYSTEMS DBL DENS
- NSDBL EQU 0 ;TRUE IF NORTHSTAR DBL DENSITY CP/M
- TTDBL1 EQU 0 ;TRUE IF THINKER TOYS DBL DENSITY
- ; 1024 byte sectors
- MMDBL EQU 0 ;TRUE IF MICROMATION DBL DENSITY
- IMSDBL EQU 0 ;TRUE IF INDUSTRIAL MICRO SYSTEMS DBL DENSITY
- IMSD2D EQU 1 ;TRUE IF INDUSTRIAL MICRO SYSTEMS QUAD DENSITY
- ;
- CR EQU 0DH
- LF EQU 0AH
- ;
- ;Functions supported:
- ;
- ; Tnn Seek to track nn (no read)
- ; Snn Position to sector nn, and read
- ; Gnn Position to group nn and read.
- ; Fname print directory for file "name"
- ; N-O-T-E this is not a direct disk
- ; read, so the W command MAY NOT be
- ; executed after 'F'. (must do G, +
- ; or - command first)
- ;
- ; L Logs in the disk (used if a disk other
- ; than the one DU resides on, is placed
- ; in the system)
- ;
- ; Ln Logs in disk 'n', such as: LA
- ;
- ; D Dump sector, hex + ASCII
- ; A Dump sector, ASCII only
- ; H Dump sector, hex only
- ;
- ;note all dump commands (D, A, H) may be optionally
- ; followed by a starting and ending address:
- ; D0,7F is the same as just D
- ; D3,5
- ; A20,3F
- ;
- ; CHaddr,val,val,val... change hex in sector
- ; CAaddr,char string... change ASCII in sector
- ; (must W to have changes written to disk)
- ;Note that the C command echoes the overlaid data for
- ; verification
- ;
- ; + advance 1 sector (if below track 2,
- ; this advances to next numerical, if
- ; 2 or >, advances based on CP/M's normal
- ; sector scrambling algorithm, i.e. so +
- ; will get the next logical sector of the file
- ; - backs up 1 logical sector
- ;
- ; note + and - may take an amount:
- ; for example, +F steps in 15 sectors
- ;
- ; ? Says what sector, track, and group
- ; are current
- ; R Reads the sector currently positioned to
- ; into memory. Note R (Read) is implicit in
- ; the G, +, and - commands, but N-O-T in the
- ; S and T commands (I did it because I was
- ; tired of disk reading after T command before
- ; I had a chance to issue the S command)
- ; W Write back the current sector (N-O-T-E may
- ; not be used after an F command, as CP/M was
- ; used to find the file in the directory
- ; X Exit back to CP/M (Must press return). Ctl-c
- ; was too easy to hit over modem lines, so I
- ; decided on 2-byte (X, CR) to exit.
- ;
- ;
- ORG 100H
- ;
- LXI SP,STACK
- ;SET UP LOCAL JMPS TO BIOS
- LHLD 1
- LXI D,3
- DAD D
- SHLD VCONST+1
- DAD D
- SHLD VCONIN+1
- DAD D
- SHLD VCONOUT+1
- DAD D ;LIST
- DAD D ;PUNCH
- DAD D ;RDR
- DAD D ;HOME
- DAD D ;SEL DISK
- DAD D
- SHLD VSETTRK+1
- DAD D
- SHLD VSETSEC+1
- DAD D ;SETDMA
- DAD D
- SHLD VREAD+1
- DAD D
- SHLD VWRITE+1
- CALL ILPRT
- DB 'DISK UTIL 10/26/80',CR,LF
- IF STDCPM
- DB 'Standard CP/M Version'
- ENDIF
- IF MICROP
- DB 'Micropolis Version'
- ENDIF
- IF DIGDBL
- DB 'DD Digital Microsystems Version'
- ENDIF
- IF NSDBL
- DB 'DD Northstar Version'
- ENDIF
- IF TTDBL1
- DB 'Thinker Toys DBL Density (1024 byte sectors)'
- ENDIF
- IF MMDBL
- DB 'Micromation DBL Density (Tracks 2-76 ONLY!)'
- ENDIF
- IF IMSDBL OR IMSD2D
- DB 'Industrial Micro Systems '
- ENDIF
- IF IMSDBL
- DB 'DBL Density'
- ENDIF
- IF IMSD2D
- DB 'QUAD Density'
- ENDIF
- DB CR,LF,0
- PROMPT LXI SP,STACK
- CALL RDBUF
- LXI H,INBUF
- MOV A,M
- INX H
- CPI 'T'
- JZ POS
- CPI 'S'
- JZ POS
- CPI 'G'
- JZ POS
- CPI 'F'
- JZ POSFIL
- CPI 'L'
- JZ LOGIN
- CPI 'D'
- JZ DUMP
- CPI 'A'
- JZ DUMP
- CPI 'H'
- JZ DUMP
- CPI 'C'
- JZ CHG
- CPI '+'
- JZ PLUS
- CPI '-'
- JZ MINUS
- CPI '?'
- JZ INQ
- CPI 'R'
- JZ DOREAD
- CPI 'W'
- JZ DOWRITE
- CPI 'X'
- JZ 0
- WHAT CALL ILPRT
- DB '?',0
- JMP PROMPT
- ;
- LOGIN MVI C,RESETDK
- CALL BDOS
- LDA INBUF+1 ;DISK REQ?
- LXI D,0
- CPI CR
- JZ LGNODK
- SUI 'A'
- MOV E,A
- LGNODK MVI C,SELDK
- CALL BDOS
- CALL NOWRITE
- JMP PROMPT
- ;
- NOWRITE XRA A ;GET 0
- STA WRFLG ;CAN'T WRITE NOW
- RET
- ;
- DUMP LDA WRFLG
- ORA A
- JNZ DUMPOK
- CALL ILPRT
- DB '++CAN''T DUMP, NO SECTOR READ.',CR,LF,0
- EXPL CALL ILPRT
- DB 'USE G COMMAND FOLLOWING F,',CR,LF
- DB 'OR R FOLLOWING S OR T',CR,LF,0
- JMP PROMPT
- ;
- DUMPOK MOV A,M
- CPI CR
- JNZ DUMPNDF
- ;USE DEFAULT
- LXI B,0
- LXI D,7FH
- JMP DUMP1
- ;
- DUMPNDF CALL HEXIN
- MOV B,D
- MOV C,E
- CPI CR
- JZ DUMP1
- INX H ;SKIP ','
- CALL HEXIN
- ;
- ;BC = START, DE = END
- ;
- DUMP1 MOV A,B
- ORA D
- JNZ WHAT
- MOV A,C
- ORA E
- JM WHAT ;>7FH
- MOV H,B
- MOV A,C
- ORI 80H
- MOV L,A
- MOV A,E
- ORI 80H
- MOV E,A
- DUMPLP MOV A,L
- ANI 7FH
- CALL HEX
- CALL SPACE
- CALL SPACE
- LDA INBUF
- CPI 'A'
- JZ DUMPAS
- PUSH H ;SAVE START
- DHEX MOV A,M
- CALL HEX
- MOV A,L
- ANI 3
- CPI 3
- CZ SPACE
- MOV A,L
- ANI 7
- CPI 7
- CZ SPACE
- MOV A,E
- CMP L
- JZ DPOP
- INX H
- MOV A,L
- ANI 0FH
- JNZ DHEX
- DPOP LDA INBUF
- CPI 'H'
- JZ DNOAS ;HEX ONLY
- POP H ;GET START ADDR
- DUMPAS CALL ASTER
- DCHR MOV A,M
- ANI 7FH ;STRIP BIT 7 (COULD BE TAGGED ASCII)
- CPI ' '
- JC DPER
- CPI 7EH ;ASCII 7E MESSES UP HAZELTINE CRT'S
- JC DOK
- DPER MVI A,'.'
- DOK CALL TYPE
- MOV A,E
- CMP L
- JZ DEND
- INX H
- MOV A,L
- ANI 0FH
- JNZ DCHR
- DEND CALL ASTER
- CALL CRLF
- CALL CONST
- ORA A
- JNZ PROMPT
- MOV A,E
- CMP L
- JZ PROMPT
- JMP DUMPLP
- ;
- DNOAS POP B
- CALL CRLF
- MOV A,E
- CMP L
- JZ PROMPT
- JMP DUMPLP
- ;
- ;POSITION
- ;
- POS PUSH PSW
- CALL NOWRITE
- MOV A,M
- CPI CR
- JZ WHAT
- CALL HEXIN
- POP PSW
- CPI 'T'
- JZ POSTRK
- CPI 'S'
- JZ POSSEC
- CPI 'G'
- JZ POSGRP
- JMP WHAT
- ;
- POSTRK MOV A,E
- CALL SETTRK
- JMP CALCGRP
- ;
- POSSEC MOV A,E
- IF STDCPM OR MICROP OR DIGDBL OR NSDBL OR TTDBL1 OR MMDBL
- ORA A
- JZ WHAT
- ENDIF
- ;
- IF STDCPM
- CPI 27
- ENDIF
- ;
- IF MICROP
- CPI 33
- ENDIF
- ;
- IF DIGDBL
- CPI 59
- ENDIF
- ;
- IF NSDBL
- CPI 41
- ENDIF
- ;
- IF TTDBL1
- CPI 65
- ENDIF
- ;
- IF MMDBL
- CPI 53
- ENDIF
- ;
- IF IMSDBL
- CPI 52 ; 0-51 VALID
- ENDIF
- ;
- IF IMSD2D
- CPI 104 ; 0-103 VALID
- ENDIF
- ;
- JNC WHAT
- CALL SETSEC
- CALL READ
- ;
- CALCGRP LDA CURTRK
- SUI 2 ;GRP 0 IS TRK 2
- MOV L,A
- MVI H,0
- MOV D,H
- MOV E,L
- DAD H ;X2
- ;
- IF STDCPM
- DAD D ;X3
- DAD H ;X6
- DAD H ;X12
- DAD D ;X13
- DAD H ;X26
- ENDIF
- ;
- IF MICROP
- DAD H ;X4
- DAD H ;X8
- DAD H ;X16
- DAD H ;X32
- ENDIF
- ;
- IF DIGDBL
- DAD D ;X3
- DAD H ;X6
- DAD D ;X7
- DAD H ;X14
- DAD H ;X28
- DAD D ;X29
- DAD H ;X58
- ENDIF
- ;
- IF NSDBL
- DAD H ;X4
- DAD H ;X8
- DAD D ;X9
- DAD D ;X10
- DAD H ;X20
- DAD H ;X40
- ENDIF
- ;
- IF TTDBL1
- DAD H ;X4
- DAD H ;X8
- DAD H ;X16
- DAD H ;X32
- DAD H ;X64
- ENDIF
- ;
- IF MMDBL OR IMSDBL OR IMSD2D
- DAD D ;X3
- DAD H ;X6
- DAD H ;X12
- DAD D ;X13
- DAD H ;X26
- DAD H ;X52
- ENDIF
- ;
- IF IMSD2D
- DAD H ;X104
- ENDIF
- ;
- LDA CURSEC
- IF IMSDBL OR IMSD2D
- INR A
- ENDIF
- DCR A
- ADD L
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A
- MOV A,L
- ;
- IF STDCPM OR NSDBL
- ANI 07H
- ENDIF
- ;
- IF MICROP OR DIGDBL OR TTDBL1 OR MMDBL OR IMSDBL
- ANI 0FH
- ENDIF
- ;
- IF IMSD2D
- ANI 1FH
- ENDIF
- ;
- STA DISP
- DAD H
- DAD H
- DAD H
- ;
- IF STDCPM OR MICROP OR DIGDBL OR NSDBL OR TTDBL1 OR MMDBL OR IMSDBL
- DAD H
- ENDIF
- ;
- IF STDCPM OR NSDBL
- DAD H
- ENDIF
- ;
- MOV A,H
- STA GROUP
- JMP INQ
- ;
- POSGRP MOV A,E
- STA GROUP
- XRA A
- STA DISP
- MOV L,E ;MULTIPLY
- MVI H,0 ;BY 8
- DAD H
- DAD H
- DAD H
- ;
- IF MICROP OR DIGDBL OR TTDBL1 OR MMDBL OR IMSDBL OR IMSD2D
- DAD H ;MULTIPLY BY 16 INSTEAD OF 8
- ENDIF
- ;
- IF IMSD2D
- DAD H ;MULTIPLY BY 32 INSTEAD OF 16
- ENDIF
- ;
- IF STDCPM
- ;DIVIDE BY 26, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-26
- ENDIF
- ;
- IF MICROP
- ;DIVIDE BY 32, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-32
- ENDIF
- ;
- IF DIGDBL
- ;DIVIDE BY 58, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-58
- ENDIF
- ;
- IF NSDBL
- ;DIVIDE BY 40, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-40
- ENDIF
- ;
- IF TTDBL1
- ;DIVIDE BY 64, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-64
- ENDIF
- ;
- IF MMDBL OR IMSDBL
- ;DIVIDE BY 52, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-52
- ENDIF
- ;
- IF IMSD2D
- ;DIVIDE BY 104, QUOTIENT = TRK, REMAINDER = SECTOR
- LXI D,-104
- ENDIF
- ;
- MVI B,0 ;TRK
- DIVLP INR B
- DAD D
- JC DIVLP
- DCR B
- ;
- IF STDCPM
- LXI D,26
- ENDIF
- ;
- IF MICROP
- LXI D,32
- ENDIF
- ;
- IF DIGDBL
- LXI D,58
- ENDIF
- ;
- IF NSDBL
- LXI D,40
- ENDIF
- ;
- IF TTDBL1
- LXI D,64
- ENDIF
- ;
- IF MMDBL OR IMSDBL
- LXI D,52
- ENDIF
- ;
- IF IMSD2D
- LXI D,104
- ENDIF
- ;
- DAD D
- MOV A,B
- ADI 2 ;GROUP 0 IS TRK 2
- CALL SETTRK
- MOV A,L
- ;
- IF IMSDBL OR IMSD2D
- DCR A
- ENDIF
- ;
- INR A
- CALL SETSEC
- CALL READ
- JMP INQ
- ;
- POSFIL CALL NOWRITE
- LXI D,FCB
- XRA A
- STAX D
- INX D
- MVI B,8
- CALL MVNAME
- MVI B,3
- CALL MVNAME
- LXI D,FCB
- MVI C,SEARCHF ;USED TO BE OPEN - DIDN'T WORK IN 2.0
- CALL BDOS
- INR A
- JNZ FLOK
- CALL ILPRT
- DB '++FILE NOT FOUND',0
- JMP PROMPT
- ;
- FLOK DCR A
- ANI 3
- MOV L,A
- MVI H,0
- DAD H
- DAD H
- DAD H
- DAD H
- DAD H
- LXI D,80H
- DAD D
- LXI D,32
- XCHG
- DAD D
- XCHG
- MVI A,'I'
- STA INBUF+1
- JMP DUMPLP
- ;
- MVNAME MOV A,M
- CPI '.'
- JZ MVIPAD
- CPI CR
- JZ PAD
- STAX D
- INX H
- INX D
- DCR B
- JNZ MVNAME
- MOV A,M
- CPI CR
- RZ
- INX H
- CPI '.'
- RZ
- JMP WHAT
- ;
- MVIPAD INX H
- PAD MVI A,' '
- STAX D
- INX D
- DCR B
- JNZ PAD
- RET
- ;
- PLUS LXI D,1
- MOV A,M
- CPI CR
- JZ PLUSGO
- CALL HEXIN
- PLUSGO LDA CURSEC
- INR A
- ;
- IF STDCPM
- CPI 27
- ENDIF
- ;
- IF MICROP
- CPI 33
- ENDIF
- ;
- IF DIGDBL
- CPI 59
- ENDIF
- ;
- IF NSDBL
- CPI 41
- ENDIF
- ;
- IF TTDBL1
- CPI 65
- ENDIF
- ;
- IF MMDBL
- CPI 53
- ENDIF
- ;
- IF IMSDBL
- CPI 52
- ENDIF
- ;
- IF IMSD2D
- CPI 104
- ENDIF
- ;
- JNZ PLUSOK
- LDA CURTRK
- INR A
- STA CURTRK
- MVI A,1
- ;
- IF IMSDBL OR IMSD2D
- DCR A
- ENDIF
- ;
- PLUSOK STA CURSEC
- DCR E
- JNZ PLUSGO
- PLUSMI LDA CURSEC
- CALL SETSEC
- LDA CURTRK
- CALL SETTRK
- CALL READ
- JMP CALCGRP
- ;
- MINUS LXI D,1
- MOV A,M
- CPI CR
- JZ MINGO
- CALL HEXIN
- MINGO LDA CURSEC
- DCR A
- ;
- IF STDCPM OR MICROP OR DIGDBL OR NSDBL OR TTDBL1 OR MMDBL
- JNZ MINOK
- ENDIF
- ;
- IF IMSDBL OR IMSD2D
- JP MINOK
- ENDIF
- ;
- LDA CURTRK
- DCR A
- STA CURTRK
- ;
- IF STDCPM
- MVI A,26
- ENDIF
- ;
- IF MICROP
- MVI A,32
- ENDIF
- ;
- IF DIGDBL
- MVI A,58
- ENDIF
- ;
- IF NSDBL
- MVI A,40
- ENDIF
- ;
- IF TTDBL1
- MVI A,64
- ENDIF
- ;
- IF MMDBL
- MVI A,52
- ENDIF
- ;
- IF IMSDBL
- MVI A,51
- ENDIF
- ;
- IF IMSD2D
- MVI A,103
- ENDIF
- ;
- MINOK STA CURSEC
- DCR E
- JNZ MINGO
- JMP PLUSMI
- ;
- INQ LDA CURTRK
- CPI 2
- JC NOGRP
- CALL ILPRT
- DB 'G=',0
- LDA GROUP
- CALL HEX
- MVI A,':'
- CALL TYPE
- LDA DISP
- ;
- IF STDCPM OR NSDBL
- ORI '0'
- CALL TYPE
- ENDIF
- ;
- IF MICROP OR DIGDBL OR TTDBL1 OR MMDBL OR IMSDBL OR IMSD2D
- CALL HEX
- ENDIF
- ;
- MVI A,','
- CALL TYPE
- NOGRP CALL ILPRT
- DB ' T=',0
- LDA CURTRK
- CALL HEX
- CALL ILPRT
- DB ', RS=',0 ;DISPLAY RELATIVE SECTOR #
- LDA CURSEC
- CALL HEX
- CALL ILPRT ;DISPLAY PHYSICAL (MAPPED) SECTOR #
- DB ', PS=',0
- LDA MAPSEC
- CALL HEX
- JMP PROMPT
- ;
- CHG MOV A,M ;GET TYPE (HEX, ASCII)
- PUSH PSW
- INX H
- CALL HEXIN
- INX H
- CPI ','
- JNZ WHAT
- MOV A,D
- ORA A
- JNZ WHAT
- MOV A,E
- ORA A
- JM WHAT
- ORI 80H
- MOV E,A ;POINT TO BUFFER
- POP PSW
- CPI 'H'
- JZ CHGHEX
- CPI 'A'
- JNZ WHAT
- ;CHANGE ASCII
- CHGALP MOV A,M
- CPI CR
- JZ PROMPT
- LDAX D
- CPI ' '
- JC CHGAHX
- CPI 7FH
- JNC CHGAHX
- JMP CHGA2
- CHGAHX MVI A,'('
- CALL TYPE
- LDAX D
- CALL HEX
- MVI A,')'
- CHGA2 CALL TYPE
- MOV A,M
- STAX D
- INX H
- INR E
- JNZ CHGALP
- MOV A,M
- CPI CR
- JZ PROMPT
- JMP WHAT
- ;
- ;CHANGE HEX
- CHGHEX MOV A,M
- CPI CR
- JZ PROMPT
- PUSH D
- CALL HEXIN
- MOV A,E
- POP D
- PUSH PSW
- LDAX D
- CALL HEX
- POP PSW
- STAX D
- MOV A,M
- CPI CR
- JZ PROMPT
- CPI ','
- INX H
- INR E
- JNZ CHGHEX
- MOV A,M
- CPI CR
- JZ PROMPT
- JMP WHAT
- ;
- DOREAD CALL READ
- JMP PROMPT
- ;
- DOWRITE CALL WRITE
- JMP PROMPT
- ;
- HEX PUSH PSW
- RAR
- RAR
- RAR
- RAR
- CALL NIBBL
- POP PSW
- NIBBL ANI 0FH
- CPI 10
- JC HEXNU
- ADI 7
- HEXNU ADI '0'
- JMP TYPE
- ;
- SPACE MVI A,' '
- JMP TYPE
- ;
- ASTER MVI A,'*'
- JMP TYPE
- ;
- ILPRT XTHL
- ILPLP MOV A,M
- CALL TYPE
- INX H
- MOV A,M
- ORA A
- JNZ ILPLP
- INX H
- XTHL
- RET
- ;
- HEXIN LXI D,0
- HINLP MOV A,M
- CPI CR
- RZ
- CPI ','
- RZ
- CPI '0'
- JC WHAT
- CPI '9'+1
- JC HINNUM
- CPI 'A'
- JC WHAT
- CPI 'F'+1
- JNC WHAT
- SUI 7
- HINNUM SUI '0'
- XCHG
- DAD H
- DAD H
- DAD H
- DAD H
- ADD L
- MOV L,A
- XCHG
- INX H
- JMP HINLP
- ;
- RDBUF CALL ILPRT
- DB CR,LF,':',0
- RDBUF1 LXI H,INBUF
- MVI B,0
- RDBLP CALL CONIN
- CPI 'U'-40H
- JZ RDCTLU
- CPI CR
- JZ RDCR
- CPI 8
- JZ RDBS
- CPI 7FH
- JZ RDBS
- CPI 'R'-40H
- JZ RDCTLR
- CPI 'X'-40H
- JZ RDCTLX
- MOV M,A
- INX H
- INR B
- CALL TYPE
- JMP RDBLP
- ;
- RDCR MOV M,A
- CALL TYPE
- MVI A,LF
- CALL TYPE
- RET
- ;
- RDBS INR B
- DCR B
- JZ RDCTLU
- DCX H
- DCR B
- CPI 8
- JNZ RDDEL
- CALL WIPE
- JMP RDBLP
- ;
- RDCTLX INR B
- RDCX1 DCR B
- JZ RDBUF1
- PUSH B
- CALL WIPE
- POP B
- JMP RDCX1
- ;
- WIPE MVI A,8
- CALL TYPE
- MVI A,' '
- CALL TYPE
- MVI A,8
- CALL TYPE
- RET
- ;
- RDDEL MOV A,M
- CALL TYPE
- JMP RDBLP
- ;
- RDCTLR MVI M,CR
- CALL CRLF
- LXI H,INBUF
- MVI B,0
- RDCRL MOV A,M
- CPI CR
- JZ RDBLP
- CALL TYPE
- INR B
- INX H
- JMP RDCRL
- ;
- RDCTLU MVI A,'^'
- CALL TYPE
- MVI A,'U'
- CALL TYPE
- JMP RDBUF
- ;
- CRLF MVI A,CR
- CALL TYPE
- MVI A,LF
- JMP TYPE
- ;
- CONST: PUSH B
- PUSH D
- PUSH H
- VCONST CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- CONIN: PUSH B
- PUSH D
- PUSH H
- VCONIN CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- TYPE: PUSH B
- PUSH D
- PUSH H
- MOV C,A ;FOR CONOUT
- VCONOUT CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- SETTRK EQU $
- IF STDCPM OR MICROP OR DIGDBL OR TTDBL1 OR MMDBL OR IMSDBL OR IMSD2D
- CPI 77 ;TRAP OUT MORE THAN 77
- ENDIF
- ;
- IF NSDBL
- CPI 35 ;TRAP OUT MORE THAN 34
- ENDIF
- ;
- JC SETTRK2
- ;
- IF STDCPM OR MICROP OR DIGDBL OR TTDBL1 OR MMDBL OR IMSDBL OR IMSD2D
- MVI A,76 ;77TH TRACK IS 76
- ENDIF
- ;
- IF NSDBL
- MVI A,34 ;35TH TRACK IS 34
- ENDIF
- ;
- SETTRK2 STA CURTRK
- PUSH B
- PUSH D
- PUSH H
- MOV C,A
- VSETTRK CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- SETSEC PUSH B
- PUSH D
- PUSH H
- STA CURSEC
- MOV C,A
- LDA CURTRK
- CPI 2
- JC XSETSEC ;DON'T SCRAMBLE TRK'S 0-1
- LXI H,SECTBL-1
- ;
- IF IMSDBL OR IMSD2D
- INX H
- ENDIF
- ;
- MOV A,C
- ADD L
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A
- MOV C,M
- XSETSEC MOV A,C ;REMEMBER MAPPED SECTOR # FOR INQ
- STA MAPSEC
- VSETSEC CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- READ: PUSH B
- PUSH D
- PUSH H
- MVI A,1
- STA WRFLG
- VREAD CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- WRITE: LDA WRFLG
- ORA A
- JNZ WRITE2
- CALL ILPRT
- DB '++CANNOT WRITE UNLESS READ ISSUED'
- DB CR,LF,0
- JMP EXPL
- ;
- WRITE2 PUSH B
- PUSH D
- PUSH H
- VWRITE CALL $-$ ;MODIFIED BY INIT
- POP H
- POP D
- POP B
- RET
- ;
- IF STDCPM
- SECTBL DB 1,7,13,19,25,5,11,17,23,3,09,15,21
- DB 2,8,14,20,26,6,12,18,24,4,10,16,22
- ENDIF
- ;
- IF MICROP
- SECTBL DB 1,2,11,12,21,22,31,32,9,10,19,20,29,30,7,8
- DB 17,18,27,28,5,6,15,16,25,26,3,4,13,14,23,24
- ENDIF
- ;
- IF DIGDBL
- SECTBL DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
- DB 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33
- DB 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
- DB 49,50,51,52,53,54,55,56,57,58
- ENDIF
- ;
- IF NSDBL
- SECTBL DB 1,2,3,4,21,22,23,24,5,6,7,8,25,26,27,28
- DB 9,10,11,12,29,30,31,32,13,14,15,16
- DB 33,34,35,36,17,18,19,20,37,38,39,40
- ENDIF
- ;
- IF TTDBL1
- SECTBL DB 1,2,3,4,5,6,7,8
- DB 25,26,27,28,29,30,31,32
- DB 49,50,51,52,53,54,55,56
- DB 9,10,11,12,13,14,15,16
- DB 33,34,35,36,37,38,39,40
- DB 57,58,59,60,61,62,63,64
- DB 17,18,19,20,21,22,23,24
- DB 41,42,43,44,45,46,47,48
- ENDIF
- ;
- IF MMDBL
- SECTBL DB 1,14,27,40,10,23,36,49,6,19,32,45,2,15,28,41
- DB 11,24,37,50,7,20,33,46,3,16,29,42,12,25,38,51
- DB 8,21,34,47,4,17,30,43,13,26,39,52,9,22,35,48
- DB 5,18,31,44
- ENDIF
- ;
- IF IMSDBL
- SECTBL DB 0,1,18,19,36,37,2,3,20,21,38,39,4,5,22,23,40,41
- DB 6,7,24,25,42,43,8,9,26,27,44,45,10,11,28,29,46,47
- DB 12,13,30,31,48,49,14,15,32,33,50,51,16,17,34,35
- ENDIF
- ;
- IF IMSD2D
- SECTBL DB 0,1,18,19,36,37,54,55,72,73,90,91
- DB 4,5,22,23,40,41,58,59,76,77,94,95
- DB 8,9,26,27,44,45,62,63,80,81,98,99
- DB 12,13,30,31,48,49,66,67,84,85,102,103
- DB 16,17,34,35,52,53,70,71,88,89
- DB 2,3,20,21,38,39,56,57,74,75,92,93
- DB 6,7,24,25,42,43,60,61,78,79,96,97
- DB 10,11,28,29,46,47,64,65,82,83,100,101
- DB 14,15,32,33,50,51,68,69,86,87
- ENDIF
- ;
- GROUP DB 0
- DISP DB 0
- CURTRK DB 0
- CURSEC DB 1
- MAPSEC DB 1
- WRFLG DB 0 ;MAY NOT WRITE UNTIL '+', '-',
- ; OR 'G' COMMAND
- DS 60 ;ROOM FOR STACK
- STACK: EQU $
- INBUF DS 128
- ;
- FCB EQU 5CH
- BDOS EQU 5
- RESETDK EQU 13
- SELDK EQU 14
- SEARCHF EQU 17
- ;
- END 100H
-
-