TITLE 'SECTOR DISK MAINTENANCE PROGRAM'
; DERIVED 8/77 W. EARNEST
; MODIFIED 9/77 FOR EFFICIENCY+LOGIC
; MODIFIED 4/07/78 FOR MORE FEATURES
; MODIFIED 1/15/79 FOR CP/M USAGE
; MODIFIED 7/14/80 FOR CP/M REV 2.X
;
BDOS EQU 5
BOOT EQU 0 ;BDOS FUNCT CODES
CONIN EQU 1
CONOU EQU 2
LIST EQU 5
PMSG EQU 9
REVNR EQU 12
GETDPB EQU 31
; BIOS OFFSETS
SDRV EQU 27
STRK EQU 30
SSEC EQU 33
SDMA EQU 36
READ EQU 39
WRITE EQU 42
SECTRN EQU 48
;
ORG 100H
BEGIN: LXI SP,STACK
MVI C,REVNR
CALL BDOS ;CHECK SYSTEM REVISION
MOV A,L
ORA A
JNZ CPMOK ;CURRENT SYSTEM
LXI D,REVMSG
CALL MSGO
JMP EXIT ;GIVE UP NOW
;
CPMOK: LDA 2 ;BIOS PAGE BYTE
STA SEDMA+2
STA FILBF+2
STA WRTBF+2
STA SESCT+2
STA SETRK+2
STA SEDRV+2
STA SCTRN+2
LXI B,BUFFR
SEDMA: CALL SDMA
JMP START
;
EXIT: CALL CRLF
JMP BOOT
;
CO: PUSH PSW
PUSH H
PUSH D
PUSH B
MVI C,CONOU
MOV E,A
CALL BDOS
POP B
POP D
POP H
POP PSW
RET
;
CI: MVI C,CONIN
PUSH H
PUSH D
CALL BDOS
POP D
POP H
ANI 7FH
CPI 1BH ;ESC CODE
JZ ESCCH ;ABORT THIS COMMAND
CPI 61H ;LOWER CASE A
RC
ANI 5FH ;CONVT TO UPPER
RET
;
SO: JMP CO ;VARIABLE JUMP FOR PRINT
;
LO: PUSH PSW
PUSH H
PUSH D
PUSH B
MVI C,LIST
MOV E,A
CALL BDOS
POP B
POP D
POP H
POP PSW
RET
;
DEFUN: LXI D,PRMUN
CALL MSGO
UNAGN: CALL IN2NR
MOV A,L
KPUNT: STA NUNIT
DEFTK: LXI D,PRMTK
CALL MSGO
TKAGN: CALL IN2NR
MOV A,L
CPI 77
JC KPTRK
CALL INERR
JMP TKAGN
;
KPTRK: STA NTRAK
DEFSC: LXI D,PRMSC
CALL MSGO
SCAGN: CALL IN2NR
DCR L ;START W/SCTR 1
MOV A,L
KPSCT: STA NSCTR
MODBR: JMP LDBUF ;CHGS FOR BLOCK MOVE
;
LDBUF: LDA BUFLG
ORA A
JNZ WTBUF
CALL SUPRD
CALL FILBF
PRINT: CALL PRBUF
;
START: LXI SP,STACK
CALL PRMPT
CALL CI
SUI 'A' ;TABLE START VALUE
JC INVLID ;BELOW LEGAL RANGE
CPI 'Z'-'A'+1 ;END OF TABLE
JNC INVLID ;ABOVE LEGAL RANGE
ADD A ;DOUBLE
MOV E,A
MVI D,0
LXI H,DOTBL
DAD D ;CALCULATE VECTOR
MOV A,M
INX H
MOV H,M
MOV L,A
CALL CRLF
PCHL ;GO TO ROUTINE
;
ESCCH: POP H
LXI D,CANMSG
JMP EMSG
;
INVLID: CALL CRLF
LXI D,INVAL
EMSG: CALL MSGO
JMP START
;
DOTBL: DW TOMEM ;A DISK TO MEMORY
DW BLKMV ;B BLOCK MOVE
DW CHGBF ;C CHANGE CONTENTS
DW DMODE ;D DECIMAL MODE
DW EXTTBL ;E EXTRNAL XLATE
DW PHSTBL ;F PHYSICAL SECTORS
DW GENTBL ;G LOGICAL SECTORS
DW HMODE ;H HEXADECIMAL MODE
DW START ;I
DW START ;J
DW EXIT ;K EXIT TO CP/M
DW LSET ;L LINE PRINTER OUT
DW MOVE ;M MOVE SECTOR
DW START ;N
DW START ;O
DW PRINT ;P PRINT BUFFER
DW START ;Q
DW START ;R
DW DEFSC ;S SET SECTOR
DW DEFTK ;T SET TRACK
DW DEFUN ;U SET UNIT
DW VSET ;V VIDEO OUTPUT
DW WTBUF ;W WRITE BUFF TO DISK
DW XLATE ;X XLATE BLOCK (INTERLACE)
DW START ;Y
DW FRMEM ;Z MEMORY TO DISK
;
PHSTBL: LXI H,PHMAP
MVI A,'F'
JMP TBLST
;
GENTBL: LXI H,GENMAP
MVI A,'G'
;
TBLST: SHLD HLDIT
SHLD HLDOT
STA PRMST
JMP START
;
XLATE: CALL CI
LXI H,PHMAP
CPI 'F'
JZ XLSET
LXI H,GENMAP
CPI 'G'
JZ XLSET
LXI H,EXMAP
CPI 'E'
JZ XLSET
JMP INVLID
;
EXTTBL: LXI H,EXTBL ;TABLE FOR EXTRN SKEW
SHLD CHGBAS
LXI H,EXMAP
SHLD HLDIT
SHLD HLDOT
MVI A,'E'
STA PRMST
MVI B,0
PUSH B
JMP CHGLP
;
CHGBF: LXI H,BUFFR-1
SHLD CHGBAS
CALL IN2NR
MOV B,L
PUSH B
CHGLP: CALL IN2NR
POP B
LDA LSTCH
CPI 0DH ;CR?
JZ CHEND ;YES
MOV C,L
MOV A,B
CPI 129
JNC RGERR
LHLD CHGBAS
ADD L
MOV L,A
JNC NCARY
INR H
NCARY: MOV M,C
INR B
PUSH B
LDA LSTCH
CPI '.'
JNZ CHGLP
POP B
CHEND: CALL CRLF
JMP START
;
RGERR: LXI D,RNMSG
JMP EMSG
;
WTBUF: CALL SUPWT
CALL WRTBF
XRA A
STA BUFLG
JMP START
;
MOVE: CALL CRLF
LXI D,ADMSG
CALL MSGO
MVI A,1
STA BUFLG ;MARK TO BE WRITTEN
CALL CRLF
JMP DEFUN
;
XLSET: SHLD HLDOT
BLKMV: LXI D,FRMMG
LXI H,RDSTU
STUCOM: SHLD MODBR+1
CALL MSGO
CALL CRLF
JMP DEFUN
;
RDSTU: LHLD NSCTR
SHLD RSCTR
LHLD NTRAK
SHLD RTRAK
LXI D,TOMSG
LXI H,WTSTU
JMP STUCOM
;
WTSTU: LXI D,SIZMG
CALL MSGO
CALL INNRS
SHLD SCTCT
LXI H,LDBUF
SHLD MODBR+1
MORBL: CALL SUPBK
CALL FILBF
CALL SUPWT
CALL WRTBF
LXI H,NSCTR
CALL INCAD
LXI H,RSCTR
CALL INCAD
LHLD SCTCT
DCX H
SHLD SCTCT
MOV A,L
ORA H
JNZ MORBL
JMP START
;
INCAD: INR M
LDA SPERT
CMP M
JZ TKEND
RNC
TKEND: MVI M,0
INX H
INX H
INR M
RET
;
PRMPT LXI D,PRMST ;PROMPT STRING
JMP MSGO
;
INERR: LXI D,ERRMG
MSGO: MVI C,PMSG
JMP BDOS
;
LMSG: CALL PCRLF
LMSGL: LDAX D
CPI '$'
RZ
CALL SO
INX D
JMP LMSGL
;
IN2NR: CALL INNRS
MOV A,H
ORA A
RZ
LXI D,LMSG1
CALL MSGO
JMP IN2NR
;
INNRS: LXI H,0
NRSLP: PUSH H
CALL CI
STA LSTCH
CPI 0DH
POP H
JZ LINFD
CPI ','
RZ
CPI '.'
RZ
CALL HEXBI
JNC NRSLP
LXI D,LMSG2
CALL MSGO
JMP INNRS
;
LINFD: MVI A,0AH
JMP CO
;
HEXBI: CPI '0'
RC
CPI '9'+1
JC CVNUM
CPI 'A'
RC
CPI 'G'
ALJMP: JC CVALP
NRBAD: STC
RET
;
CVALP: ADI 9
CVNUM: ANI 0FH
PUSH H
POP D
DAD H
RC
DAD H
RC
HDCHG: DAD H
RC
DAD H
RC
ADD L
MOV L,A
RET
;
DMODE: MVI A,'D'
STA PRMST+1
MVI A,19H ;DAD D
LXI H,NRBAD
MDCOM: STA HDCHG
SHLD ALJMP+1
JMP START
;
HMODE: MVI A,'H'
STA PRMST+1
MVI A,29H ;DAD H
LXI H,CVALP
JMP MDCOM
;
CRLF: MVI A,0DH
CALL CO
MVI A,0AH
JMP CO
;
FILBF: JMP READ
;
WRTBF: JMP WRITE
;
SUPBK: LDA RUNIT
MOV C,A
CALL SEDRV
LDA RTRAK
ANI 7FH
MOV C,A
CALL SETRK
LHLD RSCTR
XCHG
LXI H,HLDIT
JMP GTSEC
;
SUPRD: LXI H,HLDIT
SUUTK: PUSH H
LDA NUNIT
MOV C,A
CALL SEDRV
LDA NTRAK
ANI 7FH
MOV C,A
CALL SETRK
LHLD NSCTR
XCHG
POP H
JMP GTSEC
;
SUPWT: LXI H,HLDOT
JMP SUUTK
;
SEDRV: CALL SDRV
MOV A,H
ORA L
JZ UNIERR
MOV E,M
INX H
MOV D,M
XCHG
SHLD XLTADR
LXI H,9
DAD D
MOV E,M
INX H
MOV D,M
XCHG
MOV A,M
STA SPERT
RET
;
SETRK: JMP STRK
UNIERR: LXI D,UNERMG
JMP EMSG
;
TOMEM: LXI D,MVMSG
CALL MSGO
CALL INNRS
LXI D,BUFFR
MVCOM: MVI B,128
MMVLP: LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ MMVLP
JMP START
;
FRMEM: LXI D,MVMSG
CALL MSGO
CALL INNRS
LXI D,BUFFR
XCHG
JMP MVCOM
;
PRBUF: LDA NUNIT
ORI '0'
STA IDMSG+5
LDA NTRAK
LXI H,IDMSG+13
CALL PBYT
LDA NSCTR
INR A
LXI H,IDMSG+23
CALL PBYT
LXI D,IDMSG
CALL LMSG
LXI D,BUFFR
PUSH D
CALL PCRLF
MVI A,1
PRBGN: STA PRPTR
POP D
PRILP: PUSH D
LDA PRPTR
CALL PRADR
POP D
PUSH D
CALL PRSPC
CALL PR4BT
CALL PRSPC
CALL PR4BT
CALL PRSPC
CALL PR4BT
CALL PRSPC
CALL PR4BT
CALL PRSPC
POP D
CALL PRLIT
PUSH D
CALL PCRLF
POP D
LDA PRPTR
ADI 10H
STA PRPTR
CPI 81H
JNZ PRILP
RET
;
PR4BT: CALL PRHWD
CALL PRHWD
RET
;
PRHWD: LDAX D
INX D
MOV H,A
LDAX D
INX D
MOV L,A
PUSH D
CALL HEXCH
POP D
RET
;
PBYT: PUSH PSW
RAR
RAR
RAR
RAR
CALL CNIB
POP PSW
CNIB: ANI 0FH
CPI 10
JC NNIB
ADI 7
NNIB: ADI '0'
MOV M,A
INX H
RET
;
PRSPC: MVI A,' '
JMP SO
;
PRLIT: MVI A,'*'
CALL SO
MVI B,10H
LITLP: LDAX D
INX D
CPI ' '
JC INVIS
CPI 80H
JNC INVIS
LITBR: CALL SO
DCR B
JNZ LITLP
MVI A,'*'
JMP SO
;
INVIS: MVI A,'.'
JMP LITBR
;
PRADR: MOV L,A
MVI H,0
HEXCH: MVI D,4
HEXLP: XRA A
DAD H
RAL
DAD H
RAL
DAD H
RAL
DAD H
RAL
CPI 10
JC NTALP
ADI 7
NTALP: ADI '0'
CALL SO
DCR D
JNZ HEXLP
RET
;
PCRLF: MVI A,0AH
CALL SO
MVI A,0DH
JMP SO
;
LSET: LXI H,LO
MVI A,'L'
PSET: SHLD SO+1
STA PRMST+2
JMP START
;
VSET: LXI H,CO
MVI A,'V'
JMP PSET
;
GTSEC: LDA SPERT
CMP E ;NR WANTED
JZ SECERR
JC SECERR
MOV A,M
INX H
MOV H,M
MOV L,A
PCHL
;
SECERR: LXI D,SECERM
JMP EMSG
;
PHMAP: MOV C,E
INR C
SESCT: JMP SSEC
;
EXMAP: LXI H,EXTBL
SHLD XLTADR
;
GENMAP: MOV C,E
MOV B,D
LHLD XLTADR
XCHG
SCTRN: CALL SECTRN
MOV C,L
JMP SESCT
;
EXTBL: DB 1,2,3,4,5
DB 6,7,8,9,10
DB 11,12,13,14,15
DB 16,17,18,19,20
DB 21,22,23,24,25
DB 26,27,28,29,30
DB 31,32,33,34,35
DB 36,37,38,39,40
DB 41,42,43,44,45
DB 46,47,48,49,50
DB 51,52,53,54,55
DB 56,57,58,59,60
DB 61,62,63,64
;
REVMSG: DB 'Not valid CP/M revision!!$'
INVAL: DB 'Invalid Command:$'
RNMSG: DB 'Range exceeded:$'
PRMTK: DB 'Enter Track:$'
PRMSC: DB 'Enter Sector:$'
PRMUN: DB 'Enter Unit:$'
FRMMG: DB 'Enter Sending address:$'
TOMSG: DB 'Enter Receiving address:$'
SIZMG: DB 'Enter Number of Sectors to move:$'
ADMSG: DB 'Enter new address:$'
MVMSG: DB 'Enter Memory address:$'
IDMSG: DB 'Unit X,Track XX,Sector XX$'
ERRMG: DB 'RETYPE:$'
LMSG1: DB '2 Hex Digit limit. Retype:$'
LMSG2: DB '4 Hex Digit limit. Retype:$'
UNERMG: DB 'Invalid Unit number',0DH,0AH,'$'
SECERM: DB 'Invalid Sector number',0DH,0AH,'$'
CANMSG: DB 'Cancelled',0dh,0ah,'$'
PRMST: DB 'GHV==>$'
;
; DONT MOVE THE NEXT 6 ITEMS
NSCTR: DW 0 ;XTRA BYTE FOR TBL CALC PAD
NTRAK: DB 0
NUNIT: DB 0
RSCTR: DW 0
RTRAK: DB 0
RUNIT: DB 0
SCTCT: DW 0
BUFLG: DB 0
HLDIT: DW GENMAP ;CP/M IS DEFAULT
HLDOT: DW GENMAP ;CP/M FOR OUT ALSO
CHGBAS: DW 0 ;BASE ADDR FOR BYTE CHANGES
XLTADR: DW EXTBL ;POINT AT SOMETHING
SPERT: DB 26 ;SECTORS PER TRACK
LSTCH: DS 1
PRPTR: DS 1
DS 24
STACK: DS 2
BUFFR: DS 128
;
END