Added RDCPM and EDLIN, style fixes
Added the reconstructed source code of RDCPM.COM and EDLIN.COM, and changed the style of the other source files to match Tim Paterson's coding style.
This commit is contained in:
@@ -214,12 +214,12 @@ SMFAT:
|
||||
STOW ;Set abort address--displacement
|
||||
MOV AX,CS
|
||||
MOV B,[ENTRYPOINT],LONGJUMP
|
||||
MOV W,[ENTRYPOINT+1],ENTRY
|
||||
MOV W,[ENTRYPOINT+3],CS
|
||||
MOV [ENTRYPOINT+1],ENTRY
|
||||
MOV [ENTRYPOINT+3],CS
|
||||
STOW
|
||||
STOW
|
||||
STOW
|
||||
MOV W,[INTBASE+4],COMMAND
|
||||
MOV [INTBASE+4],COMMAND
|
||||
MOV DI,INTBASE+14H
|
||||
MOV AX,BIOSREAD
|
||||
STOW
|
||||
@@ -227,12 +227,12 @@ SMFAT:
|
||||
STOW
|
||||
STOW ;Add 2 to DI
|
||||
STOW
|
||||
MOV W,[INTBASE+18H],BIOSWRITE
|
||||
MOV [INTBASE+18H],BIOSWRITE
|
||||
MOV DX,CS
|
||||
MOV DS,DX
|
||||
ADD DX,BP ;Next free segment
|
||||
MOV W,[DMAADD],128
|
||||
MOV W,[DMAADD+2],DX
|
||||
MOV [DMAADD],128
|
||||
MOV [DMAADD+2],DX
|
||||
MOV AX,[DRVTAB]
|
||||
MOV [CURDRV],AX
|
||||
MOV CX,DX ;Start scanning just after DOS
|
||||
@@ -254,10 +254,10 @@ SETEND:
|
||||
MOV [ENDMEM],CX
|
||||
XOR CX,CX
|
||||
MOV DS,CX
|
||||
MOV W,[EXIT],100H
|
||||
MOV W,[EXIT+2],DX
|
||||
MOV W,[INTBASE+0CH],100H
|
||||
MOV W,[INTBASE+0EH],DX
|
||||
MOV [EXIT],100H
|
||||
MOV [EXIT+2],DX
|
||||
MOV [INTBASE+0CH],100H
|
||||
MOV [INTBASE+0EH],DX
|
||||
CALL SETMEM
|
||||
MOV SI,HEADER
|
||||
CALL OUTMES
|
||||
@@ -1097,23 +1097,23 @@ SETUP:
|
||||
ADD BX,7FH ;See if there is any space left
|
||||
JC SEGEND
|
||||
AND BL,80H
|
||||
NEG BX ;Amount of room left in segment
|
||||
NEG BX ;These instructions divide by 128
|
||||
ROL BX
|
||||
XCHG BL,BH
|
||||
JNZ CHKFIT
|
||||
MOV BH,2
|
||||
CHKFIT:
|
||||
CMP CX,BX ;See if it will fit in one segment
|
||||
JBE OK
|
||||
JNZ CHKMAX
|
||||
MOV BH,2 ;All 512 records OK
|
||||
CHKMAX:
|
||||
CMP CX,BX
|
||||
JBE SAVCNT
|
||||
MOV CX,BX
|
||||
MOV B,[DSKERR],2 ;Flag that trimming took place
|
||||
OK:
|
||||
MOV [RECCNT],CX ;Record count
|
||||
SAVCNT:
|
||||
MOV [RECCNT],CX
|
||||
RET
|
||||
SEGEND:
|
||||
MOV B,[DSKERR],2
|
||||
MOV CX,0
|
||||
POP BX ;Kill return address
|
||||
POP BX
|
||||
RET
|
||||
|
||||
|
||||
@@ -1121,7 +1121,7 @@ FNDCLUS:
|
||||
|
||||
; Inputs:
|
||||
; DS = CS
|
||||
; CX = No. of clusters to skip
|
||||
; CX = No. of clusters
|
||||
; BP = Base of drive parameters
|
||||
; SI = FAT pointer
|
||||
; ES:DI point to FCB
|
||||
@@ -2240,4 +2240,4 @@ SSSAVE DS 2
|
||||
SPSAVE DS 2
|
||||
CURDRV DS 2
|
||||
DRVTAB: ;Address of start of DPBs
|
||||
|
||||
|
||||
+46
-60
@@ -19,6 +19,7 @@ PRINTBUF EQU 9
|
||||
OUTCH EQU 2
|
||||
INBUF EQU 10
|
||||
RR EQU 33
|
||||
SYSTEM EQU 5
|
||||
|
||||
ORG 100H
|
||||
|
||||
@@ -27,7 +28,7 @@ RR EQU 33
|
||||
MOV DL,0 ;Start with A:
|
||||
SETDRV:
|
||||
MOV CL,SELDRV
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
COMMAND:
|
||||
MOV SP,STACK
|
||||
CLD
|
||||
@@ -43,7 +44,7 @@ COMMAND:
|
||||
MOV [NUMREC],CX ;Number of records each time
|
||||
MOV DX,CRLF
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV DX,COMMAND
|
||||
MOV AX,2522H ;Set vector 34 (terminate)
|
||||
INT 33
|
||||
@@ -51,27 +52,27 @@ COMMAND:
|
||||
INT 33
|
||||
GETCOM:
|
||||
MOV CL,GETDRV
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
ADD AL,"A"
|
||||
MOV CL,OUTCH
|
||||
MOV DL,AL
|
||||
CALL 5 ;Print drive letter
|
||||
CALL SYSTEM ;Print drive letter
|
||||
MOV DL,":"
|
||||
MOV CL,OUTCH
|
||||
CALL 5 ;Print :
|
||||
MOV DX,LINEBUF
|
||||
CALL SYSTEM ;Print :
|
||||
MOV DX,LINBUF
|
||||
MOV CL,INBUF
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV DL,10
|
||||
MOV CL,OUTCH
|
||||
CALL 5 ;New line
|
||||
CALL SYSTEM ;New line
|
||||
MOV CH,0
|
||||
MOV SI,FILLINFO ;8 spaces
|
||||
MOV SI,FILIFO ;8 spaces
|
||||
MOV DI,ID
|
||||
CALL FILLBUF
|
||||
MOV DI,FCB
|
||||
CALL FILLBUF
|
||||
MOV SI,LINEBUF+2
|
||||
MOV SI,LINBUF+2
|
||||
MOV DI,ID
|
||||
CALL FILEDRV ;Get COM drive
|
||||
MOV [SPECDRV],AL
|
||||
@@ -138,7 +139,7 @@ EXTERNAL:
|
||||
INT 33
|
||||
MOV DX,100H
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV BX,DS ;New segment into BX
|
||||
POP DS
|
||||
MOV DX,IDLEN
|
||||
@@ -161,12 +162,12 @@ EXTERNAL:
|
||||
PUSH AX
|
||||
MOV CL,SETDMA
|
||||
MOV DX,80H
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
RET L
|
||||
BADCOM:
|
||||
MOV DX,BADNAM
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
JMP COMMAND
|
||||
|
||||
NEXTCHR:
|
||||
@@ -248,27 +249,27 @@ DIR:
|
||||
MOV DI,FCB+1
|
||||
CALL FILLBUF ;Fill 11 bytes with "?"
|
||||
HASNAME:
|
||||
MOV DX,LINEBUF+2+1
|
||||
MOV DX,LINBUF+2+1
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV CL,SRCHFRST
|
||||
MOV DX,FCB
|
||||
EACHFILE:
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
INC AL ;FF = file not found
|
||||
JZ RET
|
||||
MOV SI,LINEBUF+2+1
|
||||
MOV SI,LINBUF+2+1
|
||||
MOV CX,8
|
||||
CALL OUTCNT ;Print 8 chars (name)
|
||||
MOV CL,OUTCH
|
||||
MOV DL," "
|
||||
CALL 5 ;Print space
|
||||
MOV SI,LINEBUF+2+9
|
||||
CALL SYSTEM ;Print space
|
||||
MOV SI,LINBUF+2+9
|
||||
MOV CX,3
|
||||
CALL OUTCNT ;Print 3 chars (ext)
|
||||
MOV DX,CRLF
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5 ;Print new line
|
||||
CALL SYSTEM ;Print new line
|
||||
MOV CL,SRCHNXT
|
||||
JP EACHFILE
|
||||
OUTCNT:
|
||||
@@ -277,7 +278,7 @@ OUTCNT:
|
||||
PUSH SI
|
||||
MOV DL,AL
|
||||
MOV CL,OUTCH
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
POP SI
|
||||
POP CX
|
||||
LOOP OUTCNT
|
||||
@@ -301,7 +302,7 @@ CREATE:
|
||||
TYPE:
|
||||
MOV DX,TPA
|
||||
MOV CL,SETDMA
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV DX,FCB
|
||||
MOV AH,OPEN
|
||||
INT 33
|
||||
@@ -318,16 +319,16 @@ OUTLP:
|
||||
JZ RET
|
||||
MOV CL,OUTCH
|
||||
MOV DL,AL
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
JP OUTLP
|
||||
RET
|
||||
|
||||
CLEAR:
|
||||
MOV DX,ERAMES
|
||||
MOV CL,PRINTBUF
|
||||
CALL 5 ;Confirm erase
|
||||
CALL SYSTEM ;Confirm erase
|
||||
MOV CL,INCHAR
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
CMP AL,"Y"
|
||||
JZ DOCLEAR
|
||||
CMP AL,"y"
|
||||
@@ -339,10 +340,10 @@ DOCLEAR:
|
||||
JZ CLRDSK
|
||||
DEC DL
|
||||
MOV CL,SELDRV
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
CLRDSK:
|
||||
MOV CL,GETFAT
|
||||
CALL 5
|
||||
CALL SYSTEM
|
||||
MOV CX,DX
|
||||
INC DX
|
||||
SHR DX
|
||||
@@ -368,7 +369,7 @@ DOFILL:
|
||||
CALL FILLBUF
|
||||
MOV DX,FCB
|
||||
MOV CL,DELETE
|
||||
CALL 5 ;Delete all files
|
||||
CALL SYSTEM ;Delete all files
|
||||
MOV CL,DSKRESET
|
||||
JMP 5
|
||||
|
||||
@@ -410,7 +411,7 @@ CPYBLK:
|
||||
INT 33
|
||||
OR AL,AL
|
||||
JZ CPYBLK
|
||||
MOV DX,NOSPACE
|
||||
MOV DX,NOSPCE
|
||||
MOV AH,PRINTBUF
|
||||
INT 33
|
||||
CPYDONE:
|
||||
@@ -427,48 +428,33 @@ NOSRC:
|
||||
DS 40
|
||||
STACK:
|
||||
|
||||
BADNAM:
|
||||
DB "Bad command or file name"
|
||||
CRLF:
|
||||
DB 13,10,"$"
|
||||
ERAMES:
|
||||
DB "Erase all files (Y/N)? $"
|
||||
NOTFND:
|
||||
DB "Source file not found$"
|
||||
NOSPACE:
|
||||
DB "Insufficient disk space$"
|
||||
BADNAM: DB "Bad command or file name"
|
||||
CRLF: DB 13,10,"$"
|
||||
ERAMES: DB "Erase all files (Y/N)? $"
|
||||
NOTFND: DB "Source file not found$"
|
||||
NOSPCE: DB "Insufficient disk space$"
|
||||
|
||||
FCBFIL:
|
||||
DB 11,"?"
|
||||
FCBFIL: DB 11,"?"
|
||||
DB 0
|
||||
|
||||
SPECDRV:
|
||||
DS 1
|
||||
NUMREC:
|
||||
DS 2
|
||||
SPECDRV: DS 1
|
||||
NUMREC: DS 2
|
||||
|
||||
IDLEN:
|
||||
DS 1
|
||||
ID:
|
||||
DS 8
|
||||
COM:
|
||||
DB "COM"
|
||||
DSTFCB:
|
||||
DS 36
|
||||
IDLEN: DS 1
|
||||
ID: DS 8
|
||||
COM: DB "COM"
|
||||
DSTFCB: DS 36
|
||||
|
||||
LINEBUF:
|
||||
DB 80H,1,13
|
||||
LINBUF: DB 80H,1,13
|
||||
DS 80H
|
||||
|
||||
FILLINFO:
|
||||
DB 8," "
|
||||
FILIFO: DB 8," "
|
||||
DB 0
|
||||
DB 12," ",4,0
|
||||
DB 12," ",8,0
|
||||
DB 0
|
||||
|
||||
COMTAB:
|
||||
DB 4,"DIR"
|
||||
COMTAB: DB 4,"DIR"
|
||||
DW DIR
|
||||
DB 7,"RENAME"
|
||||
DW RENAME
|
||||
@@ -485,4 +471,4 @@ COMTAB:
|
||||
DB 0
|
||||
|
||||
TPA:
|
||||
|
||||
|
||||
@@ -0,0 +1,680 @@
|
||||
FCB EQU 5CH
|
||||
RENAM EQU 23
|
||||
OPEN EQU 15
|
||||
CLOSE EQU 16
|
||||
MAKE EQU 22
|
||||
DELFIL EQU 19
|
||||
RDBLK EQU 39
|
||||
WRBLK EQU 40
|
||||
SETDMA EQU 26
|
||||
PRINTBUF EQU 9
|
||||
OUTCH EQU 2
|
||||
INBUF EQU 10
|
||||
RR EQU 33
|
||||
|
||||
PROMPT EQU "*"
|
||||
|
||||
ORG 100H
|
||||
|
||||
MOV SP,STACK
|
||||
MOV DX,BREAK
|
||||
MOV AX,2523H
|
||||
INT 21H
|
||||
MOV SI,BAK
|
||||
MOV DI,FCB+9
|
||||
MOV CX,3
|
||||
;File must not have .BAK extension
|
||||
REPE
|
||||
CMPB
|
||||
JZ NOTBAK
|
||||
;Open input file
|
||||
MOV AH,OPEN
|
||||
MOV DX,FCB
|
||||
INT 21H
|
||||
MOV [HAVEOF],AL
|
||||
OR AL,AL
|
||||
JZ HAVFIL
|
||||
MOV DX,NEWFIL
|
||||
MOV AH,PRINTBUF
|
||||
INT 21H
|
||||
HAVFIL:
|
||||
MOV SI,FCB
|
||||
MOV DI,FCB2
|
||||
MOV CX,9
|
||||
REP
|
||||
MOVB
|
||||
MOV SI,BAK
|
||||
MOVW
|
||||
MOVB
|
||||
MOV AH,DELFIL
|
||||
MOV DX,FCB2
|
||||
INT 21H
|
||||
MOV AL,"$"
|
||||
MOV DI,FCB2+9
|
||||
STOB
|
||||
STOB
|
||||
STOB
|
||||
MOV AH,DELFIL
|
||||
INT 21H
|
||||
;Create .$$$ file to make sure directory has room
|
||||
MOV AH,MAKE
|
||||
INT 21H
|
||||
OR AL,AL
|
||||
JZ SETUP
|
||||
MOV DX,NODIR
|
||||
JMP ERROR
|
||||
NOTBAK:
|
||||
MOV DX,NOBAK
|
||||
JMP ERROR
|
||||
TOOBIG:
|
||||
MOV DX,TOBIG
|
||||
JMP ERROR
|
||||
NOTEOF:
|
||||
MOV DX,NOEOF
|
||||
JMP ERROR
|
||||
SETUP:
|
||||
MOV DX,START
|
||||
MOV AH,SETDMA
|
||||
INT 21H
|
||||
MOV CX,[6]
|
||||
SUB CX,80H
|
||||
MOV [LAST],CX
|
||||
MOV DI,START-1
|
||||
TEST B,[HAVEOF],-1
|
||||
JNZ SAVEND
|
||||
CALL NUMRECS
|
||||
MOV [FCB+RR],0
|
||||
MOV DX,FCB
|
||||
MOV AH,RDBLK
|
||||
INT 21H
|
||||
CMP AL,2
|
||||
JZ TOOBIG
|
||||
JCXZ SAVEND
|
||||
ROR CX
|
||||
XCHG CL,CH
|
||||
ADD DI,CX ;Point to last byte
|
||||
DOWN
|
||||
MOV AL,1AH
|
||||
REPNE
|
||||
SCAB
|
||||
JNZ NOTEOF
|
||||
REPE
|
||||
SCAB
|
||||
INC DI
|
||||
SAVEND:
|
||||
CLD
|
||||
INC DI
|
||||
MOV B,[DI],1AH
|
||||
MOV [ENDTXT],DI
|
||||
MOV B,[COMBUF],128
|
||||
MOV B,[EDITBUF],255
|
||||
MOV [POINTER],START
|
||||
MOV [CURRENT],1
|
||||
|
||||
COMMAND:
|
||||
MOV SP,STACK
|
||||
MOV AL,PROMPT
|
||||
CALL OUT
|
||||
MOV DX,COMBUF
|
||||
MOV AH,INBUF
|
||||
INT 21H
|
||||
MOV AL,10
|
||||
CALL OUT
|
||||
MOV [PARAM2],0
|
||||
MOV B,[QFLG],0
|
||||
MOV SI,2+COMBUF
|
||||
CALL GETNUM
|
||||
MOV [PARAM1],DX
|
||||
CALL SKIP1
|
||||
CMP AL,","
|
||||
JNZ CHKNXT
|
||||
INC SI
|
||||
CHKNXT:
|
||||
DEC SI
|
||||
CALL GETNUM
|
||||
MOV [PARAM2],DX
|
||||
CALL SKIP1
|
||||
CMP AL,"?"
|
||||
JNZ DISPATCH
|
||||
MOV [QFLG],AL
|
||||
CALL SKIP
|
||||
DISPATCH:
|
||||
AND AL,5FH
|
||||
MOV DI,COMTAB
|
||||
MOV CX,NUMCOM
|
||||
REPNE
|
||||
SCAB
|
||||
JNZ COMERR
|
||||
MOV BX,CX
|
||||
SHL BX
|
||||
CALL [BX+TABLE]
|
||||
JMP COMMAND
|
||||
|
||||
SKIP:
|
||||
LODB
|
||||
SKIP1:
|
||||
CMP AL," "
|
||||
JZ SKIP
|
||||
RET
|
||||
|
||||
COMERR:
|
||||
MOV DX,BADCOM
|
||||
MOV AH,PRINTBUF
|
||||
INT 21H
|
||||
JP COMMAND
|
||||
|
||||
|
||||
GETNUM:
|
||||
CALL SKIP
|
||||
CMP AL,"."
|
||||
JZ CURLIN
|
||||
CMP AL,"#"
|
||||
JZ MAXLIN
|
||||
MOV DX,0
|
||||
NUMLP:
|
||||
CMP AL,"0"
|
||||
JB RET
|
||||
CMP AL,"9"
|
||||
JA RET
|
||||
SUB AL,"0"
|
||||
MOV BX,DX
|
||||
SHL DX
|
||||
SHL DX
|
||||
ADD DX,BX
|
||||
SHL DX
|
||||
CBW
|
||||
ADD DX,AX
|
||||
LODB
|
||||
JP NUMLP
|
||||
|
||||
CURLIN:
|
||||
MOV DX,[CURRENT]
|
||||
LODB
|
||||
RET
|
||||
MAXLIN:
|
||||
MOV DX,-1
|
||||
LODB
|
||||
RET
|
||||
|
||||
|
||||
COMTAB DB "SFDLIE",13
|
||||
|
||||
NUMCOM EQU $-COMTAB
|
||||
|
||||
;-----------------------------------------------------------------------;
|
||||
; Carefull changing the order of the next two tables. They are
|
||||
; linked and chnges should be be to both.
|
||||
|
||||
TABLE DW NOCOM ;No command--edit line
|
||||
DW ENDED
|
||||
DW INSERT
|
||||
DW LIST
|
||||
DW DELETE
|
||||
DW COMERR
|
||||
DW COMERR
|
||||
|
||||
FINDLIN:
|
||||
|
||||
; Inputs
|
||||
; BX = Line number to be located in buffer (0 means last line)
|
||||
; Outputs:
|
||||
; DX = Actual line found
|
||||
; DI = Pointer to start of line DX
|
||||
; Zero set if BX = DX
|
||||
; AL,CX destroyed. No other registers affected.
|
||||
|
||||
MOV DX,[CURRENT]
|
||||
MOV DI,[POINTER]
|
||||
CMP BX,DX
|
||||
JZ RET
|
||||
JA FINDIT
|
||||
MOV DX,1
|
||||
MOV DI,START
|
||||
CMP BX,DX
|
||||
JZ RET
|
||||
FINDIT:
|
||||
MOV CX,[ENDTXT]
|
||||
SUB CX,DI
|
||||
MOV AL,10
|
||||
OR AL,AL ;Clear zero flag
|
||||
FINLIN:
|
||||
JCXZ RET
|
||||
REPNE
|
||||
SCAB
|
||||
INC DX
|
||||
CMP BX,DX
|
||||
JNZ FINLIN
|
||||
RET
|
||||
|
||||
|
||||
SHOWNUM:
|
||||
|
||||
; Inputs:
|
||||
; BX = Line number to be displayed
|
||||
; Function:
|
||||
; Displays line number on terminal in 8-character
|
||||
; format, suppressing leading zeros.
|
||||
; AX, CX, DX destroyed. No other registers affected.
|
||||
|
||||
PUSH BX
|
||||
MOV AL," "
|
||||
CALL OUT
|
||||
CALL CONV10
|
||||
MOV AL,":"
|
||||
CALL OUT
|
||||
MOV AL," "
|
||||
CALL OUT
|
||||
POP BX
|
||||
RET
|
||||
|
||||
|
||||
CONV10:
|
||||
|
||||
;Inputs:
|
||||
; BX = Binary number to be displayed
|
||||
; Function:
|
||||
; Ouputs binary number. Five digits with leading
|
||||
; zero suppression. Zero prints 5 blanks.
|
||||
|
||||
XOR AX,AX
|
||||
MOV DL,AL
|
||||
MOV CX,16
|
||||
CONV:
|
||||
SHL BX
|
||||
ADC AL,AL
|
||||
DAA
|
||||
XCHG AL,AH
|
||||
ADC AL,AL
|
||||
DAA
|
||||
XCHG AL,AH
|
||||
ADC DL,DL
|
||||
LOOP CONV
|
||||
MOV BL,"0"-" "
|
||||
XCHG AX,DX
|
||||
CALL LDIG
|
||||
MOV AL,DH
|
||||
CALL DIGITS
|
||||
MOV AL,DL
|
||||
DIGITS:
|
||||
MOV DH,AL
|
||||
SHR AL
|
||||
SHR AL
|
||||
SHR AL
|
||||
SHR AL
|
||||
CALL LDIG
|
||||
MOV AL,DH
|
||||
LDIG:
|
||||
AND AL,0FH
|
||||
JZ ZERDIG
|
||||
MOV BL,0
|
||||
ZERDIG:
|
||||
ADD AL,"0"
|
||||
SUB AL,BL
|
||||
JMP OUT
|
||||
|
||||
|
||||
LIST:
|
||||
MOV BX,[PARAM1]
|
||||
OR BX,BX
|
||||
JNZ CHKP2
|
||||
MOV BX,[CURRENT]
|
||||
SUB BX,10
|
||||
JA CHKP2
|
||||
MOV BX,1
|
||||
CHKP2:
|
||||
CALL FINDLIN
|
||||
JNZ RET
|
||||
MOV SI,DI
|
||||
MOV DI,[PARAM2]
|
||||
INC DI
|
||||
SUB DI,BX
|
||||
JA DISPLAY
|
||||
MOV DI,21
|
||||
JP DISPLAY
|
||||
|
||||
|
||||
DISPONE:
|
||||
MOV DI,1
|
||||
|
||||
DISPLAY:
|
||||
|
||||
; Inputs:
|
||||
; BX = Line number
|
||||
; SI = Pointer to text buffer
|
||||
; DI = No. of lines
|
||||
; Function:
|
||||
; Ouputs specified no. of line to terminal, each
|
||||
; with leading line number.
|
||||
; Outputs:
|
||||
; BX = Last line output.
|
||||
; All registers destroyed.
|
||||
|
||||
MOV CX,[ENDTXT]
|
||||
SUB CX,SI
|
||||
JZ RET
|
||||
MOV BP,[CURRENT]
|
||||
DISPLN:
|
||||
PUSH CX
|
||||
CALL SHOWNUM
|
||||
POP CX
|
||||
OUTLN:
|
||||
LODB
|
||||
CALL OUT
|
||||
CMP AL,10
|
||||
LOOPNZ OUTLN
|
||||
JCXZ RET
|
||||
DEC DI
|
||||
JZ RET
|
||||
CMP BX,BP
|
||||
LAHF
|
||||
INC BX
|
||||
SAHF
|
||||
JZ OUTLF
|
||||
CMP BX,BP
|
||||
JNZ DISPLN
|
||||
OUTLF:
|
||||
MOV AL,10
|
||||
CALL OUT
|
||||
JP DISPLN
|
||||
RET: RET
|
||||
|
||||
|
||||
NOCOM:
|
||||
MOV BX,[PARAM1]
|
||||
OR BX,BX
|
||||
JNZ HAVLIN
|
||||
MOV BX,[CURRENT]
|
||||
INC BX ;Default is current line plus one
|
||||
HAVLIN:
|
||||
CALL FINDLIN
|
||||
MOV SI,DI
|
||||
MOV [CURRENT],DX
|
||||
MOV [POINTER],SI
|
||||
JNZ RET
|
||||
CMP SI,[ENDTXT]
|
||||
JZ RET
|
||||
MOV DI,2+EDITBUF
|
||||
MOV CX,254
|
||||
MOV DL,-1
|
||||
LOADLP:
|
||||
LODB
|
||||
STOB
|
||||
INC DL
|
||||
CMP AL,13
|
||||
LOOPNZ LOADLP
|
||||
MOV [EDITBUF+1],DL
|
||||
MOV [OLDLEN],DL
|
||||
MOV SI,[POINTER]
|
||||
CALL DISPONE
|
||||
CALL SHOWNUM
|
||||
MOV AH,INBUF ;Get input buffer
|
||||
MOV DX,EDITBUF
|
||||
INT 21H
|
||||
MOV AL,10
|
||||
CALL OUT
|
||||
MOV CL,[EDITBUF+1]
|
||||
MOV CH,0
|
||||
JCXZ RET
|
||||
MOV DL,[OLDLEN]
|
||||
MOV DH,0
|
||||
MOV SI,2+EDITBUF
|
||||
MOV DI,[POINTER]
|
||||
|
||||
REPLACE:
|
||||
|
||||
; Inputs:
|
||||
; CX = Length of new text
|
||||
; DX = Length of original text
|
||||
; SI = Pointer to new text
|
||||
; DI = Pointer to old text in buffer
|
||||
; Function:
|
||||
; New text replaces old text in buffer and buffer
|
||||
; size is adjusted. CX or DX may be zero.
|
||||
; CX, SI, DI all destroyed. No other registers affected.
|
||||
|
||||
CMP CX,DX
|
||||
JZ COPYIN
|
||||
PUSH SI
|
||||
PUSH DI
|
||||
PUSH CX
|
||||
MOV SI,DI
|
||||
ADD SI,DX
|
||||
ADD DI,CX
|
||||
MOV AX,[ENDTXT]
|
||||
SUB AX,DX
|
||||
ADD AX,CX
|
||||
CMP AX,[LAST]
|
||||
JAE MEMERR
|
||||
XCHG AX,[ENDTXT]
|
||||
MOV CX,AX
|
||||
SUB CX,SI
|
||||
CMP SI,DI
|
||||
JA DOMOV
|
||||
ADD SI,CX
|
||||
ADD DI,CX
|
||||
STD
|
||||
DOMOV:
|
||||
INC CX
|
||||
|
||||
REP
|
||||
MOVB
|
||||
CLD
|
||||
POP CX
|
||||
POP DI
|
||||
POP SI
|
||||
COPYIN:
|
||||
REP
|
||||
MOVB
|
||||
RET
|
||||
|
||||
DELETE:
|
||||
MOV BX,[PARAM1]
|
||||
OR BX,BX
|
||||
JNZ DELFIN1
|
||||
MOV BX,[CURRENT]
|
||||
DELFIN1:
|
||||
CALL FINDLIN
|
||||
JNZ RET
|
||||
MOV [CURRENT],BX
|
||||
MOV [POINTER],DI
|
||||
PUSH DI
|
||||
MOV BX,[PARAM2]
|
||||
OR BX,BX
|
||||
JNZ DELFIN2
|
||||
MOV BX,DX
|
||||
DELFIN2:
|
||||
INC BX
|
||||
CALL FINDLIN
|
||||
MOV DX,DI
|
||||
POP DI
|
||||
SUB DX,DI
|
||||
XOR CX,CX
|
||||
JP REPLACE
|
||||
|
||||
|
||||
GETTEXT:
|
||||
|
||||
; Inputs:
|
||||
; SI points into command line buffer
|
||||
; DI points to result buffer
|
||||
; Function:
|
||||
; Moves [SI] to [DI] until ctrl-Z (1AH) or
|
||||
; RETURN (0DH) is found. Termination char not moved.
|
||||
; Outputs:
|
||||
; AL = Termination character
|
||||
; CX = No of characters moved.
|
||||
; SI points one past termination character
|
||||
; DI points to next free location
|
||||
|
||||
XOR CX,CX
|
||||
|
||||
GETIT:
|
||||
LODB
|
||||
CMP AL,1AH
|
||||
JZ RET
|
||||
CMP AL,0DH
|
||||
JZ RET
|
||||
STOB
|
||||
INC CX
|
||||
JP GETIT
|
||||
|
||||
MEMERR:
|
||||
MOV DX,MEMFUL
|
||||
MOV AH,PRINTBUF
|
||||
INT 21H
|
||||
JMP COMMAND
|
||||
|
||||
|
||||
INSERT:
|
||||
MOV BX,[PARAM1]
|
||||
OR BX,BX
|
||||
JNZ INS
|
||||
MOV BX,[CURRENT]
|
||||
INC BX
|
||||
INS:
|
||||
CALL FINDLIN
|
||||
MOV CX,[ENDTXT] ;Get End-of-text marker
|
||||
MOV SI,CX
|
||||
SUB CX,DI ;Calculate number of bytes to copy
|
||||
INC CX
|
||||
MOV DI,[LAST]
|
||||
DOWN
|
||||
REP
|
||||
MOVB
|
||||
XCHG SI,DI
|
||||
UP
|
||||
INC DI
|
||||
MOV BP,SI
|
||||
MOV BX,DX
|
||||
INLP:
|
||||
CALL SHOWNUM
|
||||
MOV DX,EDITBUF
|
||||
MOV AH,INBUF
|
||||
INT 21H
|
||||
MOV AL,10
|
||||
CALL OUT
|
||||
MOV SI,EDITBUF+2
|
||||
CMP B,[SI],1AH
|
||||
JZ ENDINS
|
||||
MOV CL,[SI-1]
|
||||
MOV CH,0
|
||||
MOV DX,SI
|
||||
ADD DX,CX
|
||||
INC DX
|
||||
CMP DX,BP ;Will it fit?
|
||||
JNC MEMERR
|
||||
REP
|
||||
MOVB
|
||||
MOVB
|
||||
MOV AL,10
|
||||
STOB
|
||||
INC BX
|
||||
JP INLP
|
||||
ENDINS:
|
||||
MOV [POINTER],DI
|
||||
MOV [CURRENT],BX
|
||||
MOV SI,BP
|
||||
INC SI
|
||||
MOV CX,[LAST]
|
||||
SUB CX,BP
|
||||
REP
|
||||
MOVB
|
||||
DEC DI
|
||||
MOV [ENDTXT],DI
|
||||
RET
|
||||
|
||||
ENDED:
|
||||
;Write text out to .$$$ file
|
||||
MOV DI,[ENDTXT]
|
||||
MOV CX,128
|
||||
MOV AL,1AH
|
||||
REP
|
||||
STOB
|
||||
MOV CX,[ENDTXT]
|
||||
CALL NUMRECS
|
||||
INC CX
|
||||
MOV [FCB2+RR],0
|
||||
MOV DX,FCB2
|
||||
MOV AH,WRBLK
|
||||
INT 21H
|
||||
OR AL,AL
|
||||
JNZ WRTERR
|
||||
;Close .$$$ file
|
||||
MOV AH,CLOSE
|
||||
INT 21H
|
||||
MOV SI,FCB
|
||||
LEA DI,[SI+16]
|
||||
MOV DX,SI
|
||||
MOV CX,9
|
||||
REP
|
||||
MOVB
|
||||
MOV SI,BAK
|
||||
MOVW
|
||||
MOVB
|
||||
;Rename original file .BAK
|
||||
MOV AH,RENAM
|
||||
INT 21H
|
||||
MOV SI,FCB
|
||||
MOV DI,FCB2+16
|
||||
MOV CX,6
|
||||
REP
|
||||
MOVW
|
||||
;Rename .$$$ file to original name
|
||||
MOV DX,FCB2
|
||||
INT 21H
|
||||
JMP 0
|
||||
|
||||
|
||||
WRTERR:
|
||||
MOV DX,DSKFUL
|
||||
ERROR:
|
||||
MOV AH,PRINTBUF
|
||||
INT 21H
|
||||
JMP 0
|
||||
|
||||
NUMRECS:
|
||||
SUB CX,START
|
||||
AND CL,80H
|
||||
ROL CX
|
||||
XCHG CL,CH
|
||||
RET
|
||||
|
||||
OUT:
|
||||
PUSH DX
|
||||
XCHG AX,DX
|
||||
MOV AH,OUTCH
|
||||
INT 21H
|
||||
XCHG AX,DX
|
||||
POP DX
|
||||
RET
|
||||
|
||||
BREAK:
|
||||
IRET
|
||||
|
||||
|
||||
BAK: DB "BAK"
|
||||
NOBAK: DB "Cannot edit .BAK file--rename file$"
|
||||
NODIR: DB "No room in directory for file$"
|
||||
TOBIG: DB "File too big to fit into memory$"
|
||||
NOEOF: DB "No end-of-file mark found in file$"
|
||||
DSKFUL: DB "Disk full--file write not completed$"
|
||||
MEMFUL: DB 13,10,"Memory full",13,10,"$"
|
||||
BADCOM: DB "Entry error",13,10,"$"
|
||||
NEWFIL: DB "New file",13,10,"$"
|
||||
FCB2: DS 36
|
||||
PARAM1: DS 2
|
||||
PARAM2: DS 2
|
||||
QFLG: DS 1
|
||||
HAVEOF: DS 1
|
||||
OLDLEN: DS 1
|
||||
CURRENT: DS 2
|
||||
POINTER: DS 2
|
||||
LAST: DS 2
|
||||
ENDTXT: DS 2
|
||||
COMBUF: DS 2+128
|
||||
EDITBUF: DS 2+255
|
||||
DS 40
|
||||
ALIGN
|
||||
STACK:
|
||||
START:
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
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
|
||||
|
||||
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,SECBUF
|
||||
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
|
||||
|
||||
@@ -26,11 +26,11 @@ START:
|
||||
MOV AH,1
|
||||
INT 38
|
||||
JC WRERR
|
||||
MOV DX,TRANSOK
|
||||
MOV DX,SYSOK
|
||||
JP QUIT
|
||||
|
||||
RDERR:
|
||||
MOV DX,RDERMSG
|
||||
MOV DX,ERREAD
|
||||
|
||||
QUIT:
|
||||
MOV AH,9
|
||||
@@ -38,21 +38,17 @@ QUIT:
|
||||
INT 32
|
||||
|
||||
WRERR:
|
||||
MOV DX,WRERMSG
|
||||
MOV DX,ERWRIT
|
||||
JP QUIT
|
||||
|
||||
BADDRV:
|
||||
MOV DX,BADDRVMSG
|
||||
MOV DX,DRVBAD
|
||||
JP QUIT
|
||||
|
||||
TRANSOK:
|
||||
DB "System transfered$"
|
||||
RDERMSG:
|
||||
DB "Disk read error$"
|
||||
WRERMSG:
|
||||
DB "Disk write error$"
|
||||
BADDRVMSG:
|
||||
DB "Bad drive specification"
|
||||
SYSOK: DB "System transfered$"
|
||||
ERREAD: DB "Disk read error$"
|
||||
ERWRIT: DB "Disk write error$"
|
||||
DRVBAD: DB "Bad drive specification"
|
||||
|
||||
END:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user