Original source code used .A86 but I named them .ASM for GitHub to provide syntax highlighting. Now I've decided that it's better to keep the names original.
260 lines
3.8 KiB
Plaintext
260 lines
3.8 KiB
Plaintext
FCB EQU 5CH
|
|
FCB2 EQU 6CH
|
|
OPEN EQU 15
|
|
CLOSE EQU 16
|
|
MAKE EQU 22
|
|
DELETE EQU 19
|
|
SEQWRT EQU 21
|
|
SETDMA EQU 26
|
|
GETDRV EQU 25
|
|
PRINTBUF EQU 9
|
|
SYSTEM EQU 5
|
|
|
|
ORG 100H
|
|
PUT 100H
|
|
|
|
JMP RDCPM
|
|
|
|
CPMTAB:
|
|
DW IBM,IBM,IBM,IBM
|
|
DW 0,0,0,0
|
|
DW 0,0,0,0
|
|
DW 0,0,0,0
|
|
|
|
INVSRC:
|
|
MOV DX,BADSRC
|
|
JMP EXIT
|
|
|
|
NONAME:
|
|
MOV DX,BADFN
|
|
JMP EXIT
|
|
|
|
RDCPM:
|
|
MOV SP,100H
|
|
CMP B,[FCB+1]," "
|
|
JZ NONAME
|
|
XOR AL,AL
|
|
XCHG AL,[FCB]
|
|
OR AL,AL
|
|
JNZ HASDRV
|
|
MOV CL,GETDRV
|
|
CALL SYSTEM
|
|
INC AX
|
|
|
|
HASDRV:
|
|
DEC AX
|
|
MOV [DRIVE],AL
|
|
CMP AL,15
|
|
JA INVSRC ;Invalid drive number
|
|
CBW
|
|
MOV BX,AX
|
|
SHL BX
|
|
MOV BP,[BX+CPMTAB]
|
|
OR BP,BP
|
|
JZ INVSRC
|
|
MOV SI,FCB2
|
|
MOV DI,DSTFCB
|
|
MOVB
|
|
CMP B,[FCB2+1]," "
|
|
JNZ HASDST
|
|
MOV SI,FCB+1
|
|
|
|
HASDST:
|
|
MOV CX,11
|
|
REP
|
|
MOVB ;Copy file name
|
|
MOV AL,[DSTFCB]
|
|
OR AL,AL
|
|
JNZ DSTDRV
|
|
MOV CL,GETDRV
|
|
CALL SYSTEM ;Use default drive
|
|
INC AX
|
|
|
|
DSTDRV:
|
|
DEC AX
|
|
CMP AL,[DRIVE]
|
|
JZ BADPARM
|
|
MOV CL,DELETE
|
|
MOV DX,DSTFCB
|
|
CALL SYSTEM
|
|
MOV CL,MAKE
|
|
MOV DX,DSTFCB
|
|
CALL SYSTEM
|
|
MOV CL,SETDMA
|
|
MOV DX,SECBUF
|
|
CALL SYSTEM
|
|
|
|
BEGDIR:
|
|
XOR AX,AX
|
|
MOV BX,[BP+NUMENT]
|
|
|
|
READDIR:
|
|
MOV DI,DIRBUF
|
|
PUSH AX
|
|
PUSH BX
|
|
CALL READSEC
|
|
POP BX
|
|
POP AX
|
|
MOV SI,DIRBUF
|
|
|
|
ENUMDIR:
|
|
MOV DI,FCB
|
|
MOV CX,13
|
|
REPE
|
|
CMPB
|
|
JZ RDENTRY
|
|
ADD SI,CX
|
|
ADD SI,19 ;Point to next entry
|
|
DEC BX
|
|
JS DONE
|
|
CMP SI,DIRBUF+128
|
|
JB ENUMDIR
|
|
INC AX
|
|
JP READDIR
|
|
|
|
BADPARM:
|
|
MOV DX,SAMDSK
|
|
JMP EXIT
|
|
|
|
RDENTRY:
|
|
ADD SI,3 ;Point to AL array
|
|
MOV CX,16 ;16 AL bytes per entry
|
|
|
|
RDNXTAL:
|
|
LODB
|
|
MOV AH,0
|
|
TEST B,[BP+DSISIZ+1],0FFH
|
|
JZ SMALDSK
|
|
MOV AH,[SI] ;Big disk, use words instead
|
|
INC SI
|
|
DEC CX
|
|
|
|
SMALDSK:
|
|
OR AX,AX
|
|
JZ DONE
|
|
PUSH CX
|
|
MOV CH,0
|
|
PUSH SI
|
|
MOV CL,[BP+BLKSFT]
|
|
SHL AX,CL
|
|
|
|
RDALOC:
|
|
PUSH AX
|
|
OR AL,CH
|
|
PUSH CX
|
|
MOV DI,SECBUF
|
|
CALL READSEC
|
|
MOV CL,SEQWRT
|
|
MOV DX,DSTFCB
|
|
CALL SYSTEM
|
|
POP CX
|
|
POP AX
|
|
INC CH
|
|
CMP CH,[BP+BLKMSK]
|
|
JBE RDALOC
|
|
POP SI
|
|
POP CX
|
|
LOOP RDNXTAL
|
|
INC B,[FCB+12] ;Increment extent counter
|
|
JMP BEGDIR ;Scan from beginning of directory
|
|
|
|
DONE:
|
|
MOV CL,CLOSE
|
|
MOV DX,DSTFCB
|
|
CALL SYSTEM
|
|
JMP 0
|
|
|
|
;Read allocation block
|
|
READSEC:
|
|
XOR DX,DX
|
|
MOV BX,[BP+SPT]
|
|
DIV AX,BX
|
|
ADD AX,[BP+RESTRK]
|
|
MOV CX,DX
|
|
MUL AX,BX ;Tracks in sectors
|
|
MOV DX,AX
|
|
OR BH,BH ;Check for >255 sectors per track
|
|
JNZ BIGTRK ;Use words instead of bytes for xlat table
|
|
MOV AX,CX
|
|
MOV BX,[BP+XLTTBL]
|
|
XLAT
|
|
ADD DX,AX ;Logical sector number
|
|
|
|
READABS:
|
|
MOV CX,1
|
|
MOV BX,DI
|
|
MOV AL,[DRIVE]
|
|
PUSH BP
|
|
INT 37
|
|
POP AX
|
|
POP BP
|
|
JNC RDDONE
|
|
MOV DX,DSKERR
|
|
|
|
EXIT:
|
|
MOV CL,PRINTBUF
|
|
CALL SYSTEM
|
|
JMP 0
|
|
|
|
;Translation table made up of WORDs
|
|
BIGTRK:
|
|
MOV BX,CX
|
|
SHL BX
|
|
ADD BX,[BP+XLTTBL]
|
|
ADD DX,[BX]
|
|
JP READABS
|
|
|
|
RDDONE:
|
|
RET
|
|
|
|
DSKERR: DB 13,10,"HARD DISK ERROR",13,10,"$"
|
|
SAMDSK: DB 13,10,"Source and destination drives must not be the same",13,10,"$"
|
|
BADSRC: DB 13,10,"Bad source drive",13,10,"$"
|
|
BADFN: DB 13,10,"Bad file name",13,10,"$"
|
|
DRIVE: DS 1
|
|
DSTFCB: DS 32
|
|
DB 0
|
|
DIRBUF: DS 128
|
|
SECBUF: DS 128
|
|
|
|
SPT EQU 0
|
|
BLKSFT EQU 2
|
|
BLKMSK EQU 3
|
|
EXTMSK EQU 4
|
|
DSISIZ EQU 5
|
|
NUMENT EQU 7
|
|
ALBMP0 EQU 9
|
|
ALBMP1 EQU 10
|
|
DIRCKS EQU 11
|
|
RESTRK EQU 13
|
|
XLTTBL EQU 15
|
|
|
|
;Below is the definition for standard single-density 8" drives
|
|
|
|
IBM:
|
|
DW 26 ;Sectors per track
|
|
DB 3 ;Block shift
|
|
DB 7 ;Block mask
|
|
DB 0 ;Extent mask
|
|
DW 242 ;Disk size - 1
|
|
DW 63 ;Directory entries - 1
|
|
DB 0C0H ;Directory allocation bitmap 0
|
|
DB 0 ;Directory allocation bitmap 1
|
|
DW 16 ;Directory check vector size
|
|
DW 2 ;Tracks to skip
|
|
DW MOD6 ;Modulo-6 sector translate table
|
|
|
|
MOD6:
|
|
DB 0,6,12,18,24
|
|
DB 4,10,16,22
|
|
DB 2,8,14,20
|
|
DB 1,7,13,19,25
|
|
DB 5,11,17,23
|
|
DB 3,9,15,21
|
|
|
|
CPMTAB2:
|
|
DW 0,0,0,0
|
|
DW 0,0,0,0
|
|
DW 0,0,0,0
|
|
DW 0,0,0,0
|
|
|