From 4bdf7a2bd967b89eda31db68d7f7e292c9af5d51 Mon Sep 17 00:00:00 2001 From: Broken Pipe <85091235+TheBrokenPipe@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:42:47 +0000 Subject: [PATCH] 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. --- 86DOS.ASM | 42 ++-- COMMAND.ASM | 106 ++++---- EDLIN.ASM | 680 ++++++++++++++++++++++++++++++++++++++++++++++++++++ RDCPM.ASM | 259 ++++++++++++++++++++ SYS.ASM | 22 +- 5 files changed, 1015 insertions(+), 94 deletions(-) create mode 100644 EDLIN.ASM create mode 100644 RDCPM.ASM diff --git a/86DOS.ASM b/86DOS.ASM index e4a0d5d..9c2e6e6 100644 --- a/86DOS.ASM +++ b/86DOS.ASM @@ -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 - \ No newline at end of file + \ No newline at end of file diff --git a/COMMAND.ASM b/COMMAND.ASM index 98d690d..ea78166 100644 --- a/COMMAND.ASM +++ b/COMMAND.ASM @@ -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: - \ No newline at end of file + \ No newline at end of file diff --git a/EDLIN.ASM b/EDLIN.ASM new file mode 100644 index 0000000..a61d3b0 --- /dev/null +++ b/EDLIN.ASM @@ -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: + \ No newline at end of file diff --git a/RDCPM.ASM b/RDCPM.ASM new file mode 100644 index 0000000..72f7275 --- /dev/null +++ b/RDCPM.ASM @@ -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 + \ No newline at end of file diff --git a/SYS.ASM b/SYS.ASM index 65e9483..9dfe10f 100644 --- a/SYS.ASM +++ b/SYS.ASM @@ -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: - \ No newline at end of file + \ No newline at end of file