Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1416 lines
23 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; CONSOLE COMMAND PROCESSOR
;
; FOR CP/M 86
;
; 1983.8.8.
;
; EQUATIONS OF BDOS FUNCTION
;
CRSTSY EQU 0 ;RESET SYSTEM
CCONIN EQU 1 ;CONSOLE INPUT
CCONOT EQU 2 ;CONSOLE OUTPUT
CRDCBF EQU 10 ;READ CONSOLE BUFFER
CCONST EQU 11 ;CONSOLE STATUS
CINBDS EQU 13 ;INITIALIZE BDOS
CSELDR EQU 14 ;SELECT DRIVE
COPEN EQU 15 ;OPEN FILE
CCLOSE EQU 16 ;CLOSE FILE
CSERCH EQU 17 ;SEARCH DIRECTORY FIRST
CSERCN EQU 18 ;SEARCH NEXT
CDELET EQU 19 ;DELETE FILE
CREADN EQU 20 ;READ SEQUENTIAL
CRENAM EQU 23 ;RENAME
CGTDRV EQU 25 ;INTERROGATE DRIVE
CSTDMA EQU 26 ;SET DMA OFFSET
CGTUSR EQU 32 ;GET/SET USER CODE
CDBIOS EQU 50 ;DIRECT BIOS CALL
CSTDMS EQU 51 ;SET DMA SEGMENT
CMFREE EQU 58 ;FREE ALL MEMORY
CLOADP EQU 59 ;LOAD PROGRAM
;
; EQUATIONS OF DATA
;
BDOSI EQU 0E0H ;BDOS INTERRUPT
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGTE RETURN
EOF EQU 1AH ;END OF FILE
SCTLNG EQU 128 ;ONE SECTOR DATA LENGTH
;
BDOS EQU .0B00H ;BODS ENTRY
;
; EQUATIONS OF BASE PAGE OFFSET
;
DFPAGE EQU 0 ;BASE PAGE TOP
DFESSG EQU 0FH ;EXTRA SEGMENT
DFCB EQU 5CH ;DEFAULT FCB
DFCMBF EQU 80H ;DEFAULT COMMAND BUFFER
SYSDMA EQU 80H ;SYSTEM DMA ADDRESS
;
;
CSEG
ORG 0
;
TOP: ;TAG FOR BIASED ADDRESS
;
; CCP ENTRY JUMP TABLE
;
JMP CCPCLD ;COLD START
JMP CCPABE
JMP CCPHOT ;HOT START
;
; COMMAND READ BUFFER
;
CMBUFF DB 127 ;BUFFER LENGTH
DB 0 ;LENGTH OF CODE
DB ' '
DB 'COPYRIGHT (C) 1980, '
DB 'DIGITAL RESEARCH '
RS 74
;
; TO BDOS
;
ENBDOS:
INT BDOSI ;TO BDOS
MOV BP,CS
MOV ES,BP
RET
;
; SYSTEM RESET
;
SYSRST:
MOV CL,CRSTSY
XOR DX,DX
JMPS ENBDOS
;
; CONSOLE OUT
; INPUT
; AL:CODE
;
CONOUT:
MOV DL,AL
MOV CL,CCONOT
JMPS ENBDOS
;
; SPACE
;
SPACE:
MOV AL,' '
CONOTB:
PUSH CX
CALL CONOUT
POP CX
RET
;
; CARRIAGE RETURN & LINE FEED
;
CRLF:
MOV AL,CR
CALL CONOTB
MOV AL,LF
JMPS CONOTB
;
; PRINT BUFFERED STRING
; INPUT
; CX:STRING POINTER
;
BUFPRN:
PUSH CX
CALL CRLF
POP BX
BUFPRL:
MOV AL,[BX] ;GET CODE
OR AL,AL
JNZ BUFPRS ;GET ACTIVE CODE
RET ;END BY 0
;
BUFPRS:
INC BX
PUSH BX
CALL CONOUT
POP BX
JMPS BUFPRL ;TO NEXT
;
; LOAD PROGRAM
;
LOADPR:
MOV DX,OFFSET WKFCB
MOV CL,CLOADP
JMPS ENBDOS
;
; DIRECT BIOS SELECT DISK
;
SELDSK:
MOV CX,CDBIOS
MOV DX,OFFSET WKBIOS
JMPS ENBDOS
;
; FREE ALL MEMORY
;
MEMFRE:
MOV CL,CMFREE
JMPS ENBDOS
;
; INITIALIZE BDOS
;
INBDOS:
MOV CL,CINBDS
JMPS ENBDOS
;
; SELECT DRIVE
; INPUT
; AL:DRIVE NUMBER
;
SELDRV:
MOV DL,AL
MOV CL,CSELDR
JMPS ENBDOS
;
; DIRECTORY PROCESS COMMON
; OUTPUT
; ZF:ON ERROR
;
DIRCOM:
CALL ENBDOS
MOV BSDIRC,AL ;SAVE BIAS OF DIRECTORY
INC AL
RET
;
; OPEN FILE
;
OPEN:
MOV CL,COPEN
JMPS DIRCOM
;
; OPEN BY WORK FCB
;
OPENW:
MOV WKFCB+32,0 ;CLEAR CURRENT RECORD
MOV DX,OFFSET WKFCB
JMPS OPEN
;
; CLOSE FILE
;
CLOSE:
MOV CL,CCLOSE
CALL DIRCOM
JZ CLOSER
RET
;
CLOSER: ;CLOSE ERROR
MOV CX,OFFSET CCLSER
JMPS WHYPR
;
; SEARCH FIRST
;
SEARCH:
MOV CL,CSERCH
JMPS DIRCOM
;
; SEARCH NEXT
;
SEARCN:
MOV CL,CSERCN
JMPS DIRCOM
;
; SEARCH BY WORK FCB
;
SEARCW:
MOV DX,OFFSET WKFCB
JMPS SEARCH
;
; DELETE FILE
;
DELETF:
MOV CL,CDELET
JMPS TENBDS
;
; READ WRITE COMMON
; OUTPUT
; ZF:ON OK
;
FRWCOM:
CALL ENBDOS
OR AL,AL
RET
;
; READ SEQUENTIAL
;
READNX:
MOV CL,CREADN
JMPS FRWCOM
;
; READ WORK FCB FILE
;
READNW:
MOV DX,OFFSET WKFCB
JMPS READNX
;
; ERROR COMMENT OUT & END
;
WHYPR:
CALL BUFPRN
JMP ENCPRC
;
; RENAME
;
RENAME:
MOV CL,CRENAM
JMPS TENBDS
;
; GET/SET USER CODE
;
GETUSR:
MOV DL,0FFH
GETUSS:
MOV CL,CGTUSR
TENBDS:
JMP ENBDOS
;
; MODIFY LOWER CASE TO UPER CASE ALPHABET
; INPUT/OUTPUT
; AL:CODE
;
MODIFY:
CMP AL,'A'+20H
JC MODIFE ;TOO SMALL
CMP AL,'Z'+21H
JNC MODIFE ;TOO LARGE
AND AL,05FH ;TO LOWER CASE
MODIFE:
RET
;
; READ COMMAND LINE
;
RDCOMN:
TEST MDSUBE,0FFH
JZ RDCOMK ;NO SUBMIT FILE TO KEY INPUT
TEST CURDRV,0FFH
JZ RDCOMS ;CURRENT DRIVE IS HOME
XOR AX,AX
CALL SELDRV ;TO HOME DRIVE
RDCOMS:
MOV DX,OFFSET SUBFCB
CALL OPEN ;OPEN SUBMIT FILE
JZ RDCOMK ;NOT FOUND SO TO KEY INPUT
MOV AL,SUBFCB+15
DEC AL
MOV SUBFCB+32,AL ;SET BOTTOM RECORD OF FILE
MOV DX,OFFSET SUBFCB
CALL READNX ;GET LAST LINE
JNZ RDCOMK ;READ ERROR SO TO KEY INPUT
MOV DI,OFFSET CMBUFF+1
MOV SI,OFFSET RWBUFF
MOV CX,SCTLNG
CALL COPY ;MOVE TO COMMAND BUFFER
MOV SUBFCB+14,0 ;CLEAR EXTENT
DEC SUBFCB+15 ;DOWN LENGTH
MOV DX,OFFSET SUBFCB
CALL CLOSE ;SET RECORD COUNT
JZ RDCOMK ;CLOSE ERROR SO TO KEY INPUT
MOV AL,CURDRV
CALL SELDRV ;TO CURRENT DRIVE
MOV BX,OFFSET CMBUFF+2
CALL BUFPRL ;OUT CURRENT COMMAND LINE
CALL CHKCIT ;CHECK KEY INTERRUPT
JZ RDCOMD ;OK TO INTERPRET COMMAND LINE
CALL DELSUB ;CANCEL SUBMIT MODE
JMP CCPLOP
;
RDCOMK: ;KEY INPUT MODE
CALL DELSUB ;DELETE SUBMIT FILE
MOV CL,CRDCBF
MOV DX,OFFSET CMBUFF
CALL ENBDOS ;GET COMMAND FROM KEY
RDCOMD:
MOV BX,OFFSET CMBUFF+2
XOR CX,CX
MOV CL,CMBUFF+1 ;GET COUNT
JCXZ RDCOME ;NO LENGTH
RDCOML: ;COMMAND LINE MODIFY LOOP
MOV AL,[BX]
CALL MODIFY ;LOWER CASE TO UPER CASE
MOV [BX],AL
INC BX
LOOP RDCOML
RDCOME:
MOV [BX],CH ;SET END MARK
MOV PNTCMD,OFFSET CMBUFF+2 ;SET COMMAND POINTER TO TOP
RET
;
; CHECK KEY INTERRUPT
; OUTPUT
; ZF:OFF INTERRUPTED
;
CHKCIT:
MOV CL,CCONST
CALL ENBDOS
OR AL,AL
JNZ CHKCIG ;GET SOME DATA
RET ;NOT INTERRUPTED
;
CHKCIG:
MOV CL,CCONIN
CALL ENBDOS ;GET DATA
OR AL,AL ;SET FLAG
RET
;
; INTERROGATE DRIVE NUMBER
;
GTDRVN:
MOV CL,CGTDRV
JMPS STDMAC
;
; SET DMA SEGMENT
;
STDMAS:
MOV CL,CSTDMS
JMPS STDMAC
;
; SET DEFAULT DMA ADDRESS
;
STDMAA:
MOV DX,DDMASG
CALL STDMAS
MOV DX,SYSDMA ;SYSTEM DMA ADDRESS OFFSET
;
; SET DMA OFFSET
;
STDMAO:
MOV CL,CSTDMA
STDMAC:
JMP ENBDOS
;
; DELETE SUBMIT FILE
;
DELSUB:
TEST MDSUBE,0FFH
JNZ DELSUS ;EXIST SUBMIT FILE
RET ;NO SUBMIT FILE
;
DELSUS:
MOV AL,0
MOV MDSUBE,AL ;CLEAR SUBMIT FILE EXIST MODE
CALL SELDRV ;TO HOME DRIVE
MOV DX,OFFSET SUBFCB
CALL DELETF ;DELETE SUBMIT FILE
MOV AL,CURDRV
JMP SELDRV ;TO CURRENT DRIVE
;
; CHECK USER ID CODE
;
CHKUID:
MOV DI,OFFSET IDCODE
MOV SI,OFFSET BDOS ;ID CODE IN BDOS
MOV CX,6 ;ID CODE LENGTH
REPZ CMPSB
JCXZ CHKUIP ;OK END
JMPS CHKUIM ;MISS MATCH
;
CHKUIP:
RET
;
CHKUIM: ;MISS MATCH STOP
HLT
;
; CHECK TERMINATOR
; INPUT
; SI:DATA POINTER
; OUTPUT
; ZF:ON TERMINATOR
;
CHKTRM:
MOV AL,[SI] ;GET CODE
OR AL,AL
JNZ CHKTRN
RET ;ZERO IS END CODE
;
CHKTRN:
CMP AL,' '
JNC CHKTRT
JMP COMERR ;CONTROL CODE SO ERROR
;
CHKTRT:
PUSH DI
MOV DI,OFFSET IXTERM
MOV CX,9
CLD
REPNZ SCASB ;CHECK
POP DI
RET
;
; SEARCH TOP
; OUTPUT
; ZF:ON NO DATA
;
SRCHTP:
MOV AL,[SI]
CMP AL,0
JNZ SRCHTT
RET ;END OF DATA
;
SRCHTT:
CMP AL,' '
JZ SRCHTN ;TO NEXT
RET ;GET SOME CODE
;
SRCHTN: ;TO NEXT
INC SI
JMPS SRCHTP
;
; FILL BY SPACE FOR FILE NAME
;
FILLSP:
INC BX
MOV BYTE PTR [BX],' '
LOOP FILLSP
RET
;
; GET ONE COMMAND BLOCK
; INPUT
; CX:BLOCK LENGTH
; BX:DESTINATION POINTER
; SI:SOURCE POINTER
;
GTONBK:
PUSH CX
CALL CHKTRM ;CHECK TERMINATOR
POP CX
JZ FILLSP ;GET TERMINATOR SO END
INC BX
CMP AL,'*'
JNZ GTONBN ;NORMAL CODE
MOV AL,'?' ;WILD CARD
JMPS GTONBG
;
GTONBN: ;NORMAL CODE
INC SI
GTONBG:
MOV [BX],AL ;SET CODE
LOOP GTONBK
GTONBF: ;OVER COUNT CODE PASS READ
CALL CHKTRM
JZ GTONBE ;GET TERMINATOR
INC SI
JMPS GTONBF ;TO NEXT
;
GTONBE:
RET
;
; GET FILE NAME
; OUTPUT
; AH:WILD CARD COUNT -1 ERROR
; ZF:ON NO WILD CARD
;
GTFNAM: ;READ NORMAL
MOV AX,0
GTFNAS:
MOV BX,OFFSET WKFCB
ADD BX,AX ;GET FCB TOP
PUSH BX
MOV TDRVNU,0 ;CLEAR TEMPORARY DRIVE
MOV SI,PNTCMD ;GET COMMAND POINTER
CALL SRCHTP ;GET TOP
MOV TPNCMD,SI ;SAVE TEMPORARY TOP FOR RECOVER
JZ GTFNAC ;END OF DATA
SBB AL,'A'-1
CMP BYTE PTR 1[SI],':'
JZ GTFNAT ;WITH DRIVE CODE
GTFNAC: ;NO DRIVE SPECIFICATION
MOV AL,CURDRV
JMPS GTFNAN
;
GTFNAT: ;WITH DRIVE CODE
CMP AL,16
JA GTFNAR ;OVER
CMP AL,0
JA GTFNAD ;OK IN RANGE
GTFNAR: ;DRIVE NUMBER MISS
MOV AH,0FFH
POP BX
JMPS GTFNAE
;
GTFNAD: ;WITH DRIVE CODE
MOV TDRVNU,AL ;SET DRIVE
INC SI
INC SI
GTFNAN:
MOV [BX],AL ;SET DRIVE CODE
MOV CX,8
CALL GTONBK ;GET FILE NAME
MOV CX,3
CMP AL,'.'
JNZ $+3 ;NOT AVAILABLE TERMINATOR
INC SI
CALL GTONBK ;GET FILE TYPE
INC BX
MOV DI,BX
MOV AX,CX
MOV CX,3
CLD
XOR AX,AX
REP STOSB ;CLEAR EXTENT & RECORD COUNT
MOV PNTCMD,SI ;SET NEXT POINT TO COMMAND POINTER
POP BX
MOV CX,11 ;FILE NAME LENGTH
GTFNAW: ;CHECK WILD CARD
INC BX
CMP BYTE PTR [BX],'?'
JNZ $+4
INC AH ;WILD CARD
LOOP GTFNAW
MOV AL,[SI] ;GET NEXT CODE
GTFNAE:
OR AH,AH ;SET FLAG BY WILD CARD COUNT
RET
;
; CHECK RESIDENT COMMAND
; OUTPUT
; AX:CODE 1-6 RESIDENT COMMAND 7 NOT FOUND
;
CKRSCM:
MOV DI,OFFSET IXRSCM
MOV BX,6 ;COUNT OF COMMAND
CKRSCL:
MOV SI,OFFSET WKFCB+1
MOV CX,4 ;COMPARE LENGTH
REPZ CMPSB
JZ CKRSCG ;OK GET
ADD DI,CX ;FAIL TO NEXT
DEC BX
JNZ CKRSCL
CKRSCE: ;NOT FOUND END
MOV AL,7 ;NOT FOUND CODE AX IS BETTER
RET
;
CKRSCG: ;MATCH FIRST 4 BYTES
MOV AL,[SI]
CMP AL,' '
JNZ CKRSCE ;ERROR NET CODE MUST BE SPACE
MOV AX,BX ;OK SET NUMBER
RET
;
; SET DMA ADDRESS TO R/W WORK
;
STWKDM:
MOV DX,CS
CALL STDMAS ;SET DMA SEGMENT
MOV DX,OFFSET RWBUFF
CALL STDMAO ;SET OFFSET
RET
;
; CCP MAIN
;
; HOT START
;
CCPHOT:
MOV PNTCMD,OFFSET CMBUFF+2 ;SET COMMAND POINTER
CMP CMBUFF+2,3 ;CTRL-C
JNZ CCPHOC ;COMMAND BUFFER IS ACTIVE
MOV CMBUFF+1,0 ;COMMAND BUFFER CANCELED
CCPHOC:
MOV SP,OFFSET STACK
CALL STDRUC ;SET USER CODE & DRIVE
JMPS CCPLOE
;
;
CCPABE: ;ABORT ENTRY
MOV CMBUFF+1,0
;
; COLD START
; INPUT
; CL:USER CODE & DRIVE
;
CCPCLD:
MOV SP,OFFSET STACK
PUSH CX
MOV AL,CL
MOV CL,4
RCR AL,CL
AND AL,00FH ;GET USER CODE
MOV DL,AL
MOV USRCOD,AL
CALL GETUSS ;SET USER CODE
CALL INBDOS
MOV MDSUBE,AL ;SAVE SUBMIT MODE
CALL MEMFRE ;FREE ALL MEMORY
POP AX
AND AL,0FH
MOV CURDRV,AL ;DRIVE
CALL SELDRV ;SET DRIVE
CCPLOE:
CALL STWKDM ;SET DMA ADDRESS TO WORK
CMP CMBUFF+1,0
JNZ CCPLOS ;SOME DATA
;
; LOOP OF CCP
;
CCPLOP:
CLD
MOV SP,OFFSET STACK
CALL CRLF
CALL GTDRVN ;GET CURRENT DRIVE
ADD AL,'A'
CALL CONOUT
MOV AL,'>'
CALL CONOUT ;X> OUT PROMPT
CALL STWKDM ;SET DMA ADDRESS
CALL RDCOMN ;READ COMMAND
CCPLOS:
CLD
CALL GTDRVN ;GET DRIVE
MOV CURDRV,AL ;SAVE CURRENT DRIVE
CMP CMBUFF+2,';'
JZ CCPLOP ;COMMENT LINE TO NEXT
MOV SI,PNTCMD ;GET COMMAND POINT
CALL SRCHTP ;TO TOP OF CODE
JZ CCPLOP ;NO CODE
CALL GTFNAM ;GET COMMAND
JNZ COMERR ;WILD CARD IS ERROR
TEST TDRVNU,0FFH
JZ $+5 ;CHECK RESIDENT COMMAND
JMP TRCDSL ;NOT RESIDENT COMMAND AS SOME DRIVE SPECIFIED
;
CMP WKFCB+1,' '
JZ COMERR ;NO CODE SO ERROR
CALL CKRSCM ;CHECK RESIDENT COMMAND
DEC AX
MOV BX,OFFSET IXRSRT
ADD BX,AX
ADD BX,AX
MOV DX,[BX] ;GET ROUTINE
JMP DX ;TO EACH ROUTINE
;
; READ ERROR
;
REDERR:
MOV CX,OFFSET CRDERR
JMPS FNFERS
;
; FILE NOT FOUND
;
FNFERR:
MOV CX,OFFSET CNOFIL
FNFERS:
JMP BUFPRN
;
; COMMAND ERROR
;
COMERR:
CALL CRLF
MOV BX,TPNCMD ;CURRENT PROCESSED COMMAND TOP
COMERL:
MOV AL,[BX]
CMP AL,' '
JZ COMERE ;END OF BLOCK
OR AL,AL
JZ COMERE
PUSH BX
CALL CONOUT ;OUT COMMAND LINE
POP BX
INC BX
JMPS COMERL
;
COMERE:
MOV AL,'?'
CALL CONOUT
CALL CRLF
MOV CMBUFF+1,0 ;CANCEL CURRENT COMMAND LINE
JMP CCPLOP
;
; GET DECIMAL NUMBER
; OUTPUT
; AL:NUMBER BY BINARY NO DATA 21H
;
GTDNUM:
CALL GTFNAM ;GET BLOCK
TEST TDRVNU,0FFH
JNZ COMERR ;CANNOT HAVE DRIVE NAME
MOV BX,OFFSET WKFCB+1
MOV CX,11 ;CODE MAX LENGTH & DATA 0
CMP BYTE PTR [BX],' '
JNZ GTDNUL ;SOME CODE
MOV AL,021H ;NO CODE
RET
;
GTDNUL:
MOV AL,[BX]
CMP AL,' '
JZ GTDNUE ;END OF CODE
INC BX
SUB AL,'0'
CMP AL,10
JNC COMERR ;ILLEGAL CHARACTER
MOV DH,AL
TEST CH,0E0H
JNZ COMERR ;OVERFLOW
MOV AL,CH
MOV CL,3
ROL AL,CL ;*8
ADD AL,CH ;*9
JC COMERR ;OVER
ADD AL,CH ;*10
JC COMERR ;OVER
ADD AL,DH
JC COMERR ;OVER
MOV CH,AL ;TO NEXT
DEC CL
JNZ GTDNUL
RET ;LENGTH FULL
;
GTDNUE:
CMP BYTE PTR [BX],' '
JNZ COMERR ;END FORM ERROR
INC BX
DEC CL
JNZ GTDNUE
MOV AL,CH
RET
;
; COPY DATA
; INPUT
; DI:DESTINATION POINTER
; SI:SOURCE POINTER
; CX:LENGTH COUNT
;
COPY:
CLD
REP MOVSB
RET
;
; GET DIRECTORY TOP
; INPUT
; AL:BIAS 1
; CL:BIAS 2
;
GTDRTP:
MOV BX,OFFSET RWBUFF
MOV AH,0
ADD AL,CL
ADD BX,AX
MOV AL,[BX] ;GET CODE
RET
;
; SELECT TARGET DRIVE
;
SLTGDR:
MOV WKFCB,0
MOV AL,TDRVNU
OR AL,AL
JZ SLCRDE ;DEFAULT
DEC AL
MOV BX,OFFSET CURDRV
CMP AL,[BX] ;CHECK WITH CURRENT
JZ SLCRDE ;SAME
JMPS SLCRDD ;SELECT DRIVE
;
; SET USER CODE & DRIVE
;
STDRUC:
MOV DL,USRCOD
CALL GETUSS ;SET USER CODE
JMPS SLCRDS ;SELECT DRIVE
;
; SELECT TO CURRENT DRIVE
;
SLCRDR:
MOV AL,TDRVNU
OR AL,AL
JZ SLCRDE ;CURRENT DRIVE
DEC AL
MOV BX,OFFSET CURDRV
CMP AL,[BX]
JNZ SLCRDS ;NOT SAME DRIVE
SLCRDE:
RET
;
SLCRDS: ;SELECT TO CURRENT DRIVE
MOV AL,CURDRV
SLCRDD:
JMP SELDRV
;
; DIRS:DIRECTORY OUT OF SYSTEM FILE
;
DIRSYS:
MOV MODDIR,1 ;TO SYSTEM FILE MODE
CALL DIROUT ;DIRECTORY OUT BODDY
CMP MODIRE,0
JZ DIRSYE ;NO NON-SYSTEM FILE
MOV CX,OFFSET CNSYSF
CALL BUFPRN ;WITH NON-SYSTEM FILE
DIRSYE:
JMPS DIRNOE
;
; DIR:DIRECTORY OUT OF NON-SYSTEM FILE
;
DIRNON:
MOV MODDIR,0 ;TO NON-SYSTEM FILE MODE
CALL DIROUT
CMP MODIRE,0
JZ DIRNOE ;NO SYSTEM FILE
MOV CX,OFFSET CSYSFL
CALL BUFPRN ;WITH SYSTEM FILE
DIRNOE:
JMP ENCPRC
;
; DIRECTORY OUT BODDY
;
DIROUT:
MOV CMBUFF+1,0 ;CLEAR COMMAND COUNT
MOV MODIRE,0 ;CLEAR UNVISIBLE DIRECTORY EXIST MODE
CALL GTFNAM ;GET FILE NAME
CMP AH,0FFH
JNZ DIROUG ;OK GET SOME NAME
JMP COMERR ;FILE NAME ERROR
;
DIROUG:
CALL SLTGDR ;TO TARGET DRIVE
MOV BX,OFFSET WKFCB+1
CMP BYTE PTR [BX],' '
JNZ DIROUS ;EXIST SOME FILE NAME
MOV CH,11
DIROUW: ;FILL WILD CARD
MOV BYTE PTR [BX],'?'
INC BX
DEC CH
JNZ DIROUW
DIROUS:
MOV DL,0 ;CLEAR POSITION COUNT
PUSH DX
CALL SEARCW ;SEARCH FIRST
JNZ DIROUL ;GET FIRST
CALL FNFERR ;NOT FOUND END
DIROUL: ;ONE DIRECTORY OUT LOOP
JNZ DIROUO ;GET FILE
JMP DIROUE ;END OF DIRECTORY
;
DIROUO: ;GET FILE
MOV AL,BSDIRC
MOV CL,3
ROR AL,CL ;GET BIAS TO DIRECTORY DATA
MOV CL,AL
MOV AL,10
CALL GTDRTP ;GET SYSTEM FILE MODE BYTE
RCL AL,1
JNC DIRONS ;NON-SYSTEM FILE
TEST MODDIR,0FFH ;SYSTEM FILE
JNZ DIROUD ;SYSTEM FILE OUT MODE
MOV MODIRE,1 ;NOT OUT MODE SO SET FLAG
JMPS DIRONO
;
DIRONS: ;NON-SYSTEM FILE
TEST MODDIR,0FFH
JZ DIROUD ;NON-SYSTEM FILE OUT MODE
MOV MODIRE,1 ;NOT OUT MODE SET FLAG
JMPS DIRONO
;
DIROUD: ;OUT FILE NAME
POP DX
MOV AL,DL
INC DL ;UP DISPLAY POSITION COUNT
PUSH DX
JMP DIRPAT ;GET DISPLAY WIDTH MODE
;
DIROUP:
AND AL,3 ;GET POSITION
PUSH AX
JNZ DIRONP ;NOT LINE TOP
CALL CRLF ;LINE TOP
PUSH CX
CALL GTDRVN
POP CX
ADD AL,'A'
CALL CONOTB ;OUT DRIVE NAME
MOV AL,':'
CALL CONOTB
JMPS DIRONN
;
DIRONP: ;NOT LINE TOP
CALL SPACE
MOV AL,':'
CALL CONOTB
DIRONN:
CALL SPACE
MOV CH,1 ;CHARACTER COUNT
DIRONL:
MOV AL,CH
CALL GTDRTP ;GET DATA
AND AL,07FH
CMP AL,' '
JNZ DIROON ;EXIST CODE
POP AX
PUSH AX
CMP AL,3
JNZ DIROSP ;NOT END POSITION
MOV AL,9
CALL GTDRTP ;GET TYPE
AND AL,07FH
CMP AL,' '
JZ DIRONX ;TO LINE END
DIROSP: ;OUT SPACE
MOV AL,' '
DIROON:
CALL CONOTB ;OUT CODE
INC CH
CMP CH,12
JNC DIRONX ;ALL CODE END
CMP CH,9
JNZ DIRONL
CALL SPACE ;NAME TO TYPE
JMPS DIRONL
;
DIRONX: ;END OF ONE FILE NAME OUT
POP AX
DIRONO:
CALL CHKCIT ;CHECK CONSOLE INTERRUPT
JNZ DIROUE ;INTERRUPTED
CALL SEARCN ;TO NEXT
JMP DIROUL
;
DIROUE: ;DIRECTORY OUT END
POP DX
RET
;
; ERA:ERASE FILE
;
ERASE:
MOV CMBUFF+1,0 ;CLEAR COMMAND COUNTER
CALL GTFNAM ;GET FILE NAME
CMP AH,11
JNZ ERASES ;NOT ALL ERASE
MOV CX,OFFSET CALLOK
CALL BUFPRN ;ALL ERASE
CALL RDCOMN ;CHECK ERASE OK
MOV BX,OFFSET CMBUFF+1
DEC BYTE PTR [BX]
JZ ERASEA ;RESPONSE LENGTH OK
JMP CCPLOP ;RESPONSE IS NOT SUITABLE
;
ERASEA:
INC BX
CMP BYTE PTR [BX],'Y'
JZ ERASEO ;OK ERASE
JMP CCPLOP ;CANCEL
;
ERASEO: ;ERASE
INC BX
MOV PNTCMD,BX ;SET COMMAND POINTER
ERASES:
CMP WKFCB+1,' '
JZ TYPERR ;NO FILE SPECIFICATION
CALL SLTGDR ;TO TARGET DRIVE
MOV DX,OFFSET WKFCB
CALL DELETF ;DELETE
INC AL
JNZ ERASEN ;OK ERASED
ERASNF: ;NOT FOUND
CALL FNFERR
ERASEN:
JMPS TYPEOF
;
; TYPE:TYPE OUT FILE
;
TYPEOT:
MOV CMBUFF+1,0 ;CLEAR COMMAND LENGTH
CALL GTFNAM ;GET FILE NAME
JNZ TYPERR ;CANNOT HAVE WILD CARD
CMP WKFCB+1,' '
JZ TYPERR ;NO FILE NAME
CALL SLTGDR ;TO TARGET DRIVE
CALL OPENW ;OPEN
JZ ERASNF ;NOT FOUND
CALL CRLF
MOV BX,255 ;DUMMY FOR READ FIRST SECTOR
TYPEOL: ;ONE BYTE OUT LOOP
CMP BX,SCTLNG
JC TYPEOS ;NOT SECTOR BOUNDARY
PUSH BX ;TO NEXT SECTOR
CALL READNW ;GET ONE SECTOR
POP BX
JNZ TYPEOE ;END OR ERROR
MOV BX,0
TYPEOS:
INC BX
MOV SI,OFFSET RWBUFF-1
ADD SI,BX ;GET DATA POINT
MOV AL,[SI]
CMP AL,EOF
JZ TYPEOF ;END OF FILE
PUSH BX
CALL CONOUT ;OUT CODE
CALL CHKCIT ;CHECK CONSOLE INTERRUPT
POP BX
JNZ TYPEOF ;INTERRUPTED END
JMPS TYPEOL ;TO NEXT CHARATCTER
;
TYPEOE: ;END OR ERROR
DEC AL
JNZ TYPEOR ;READ ERROR
TYPEOF: ;END OF COMMAND
JMP ENCPRC
;
TYPEOR: ;READ ERROR
CALL REDERR
CALL SLCRDR ;TO CURRENT DRIVE
TYPERR: ;ERROR
JMP COMERR
;
; REN:RENAME FILE
;
RENAMP:
MOV CMBUFF+1,0 ;CLEAR COMMAND COUNT
CALL GTFNAM ;GET NEW FILE NAME
JNZ TYPERR ;CANNOT HAVE WILD CARD
MOV AL,TDRVNU
PUSH AX ;SAVE DRIVE
CALL SLTGDR ;TO TARGET DRIVE
CALL SEARCW ;SEARCH
JZ RENAMS ;NOT FOUND OK
JMPS RENADP ;DUPLICATE FILE ERROR
;
RENAMS:
MOV SI,OFFSET WKFCB
MOV DI,OFFSET WKFCB+16
MOV CX,16
CALL COPY ;SET TO NEW NAME POSITION
MOV SI,PNTCMD
CALL SRCHTP ;GET NEXT TOP
CMP AL,'='
JZ RENAMF ;TERMINATOR OK
CMP AL,'_'
JNZ RENAER ;TERMINATOR ERROR
RENAMF:
INC SI
MOV PNTCMD,SI
CALL GTFNAM ;GET OLD FILE NAME
JNZ RENAER ;CANNOT HAVE WILD CARD
POP AX
MOV CH,AL
MOV BX,OFFSET TDRVNU
MOV AL,[BX]
OR AL,AL
JZ RENAMK ;NO DRIVE SPECIFICATION
CMP AL,CH
MOV [BX],CH
JNZ RENAER ;DIFFERENT DRIVE IS ERROR
RENAMK:
MOV [BX],CH
MOV WKFCB,0 ;CLEAR DRIVE CODE
CALL SEARCW
JZ RENANF ;OLD FILE NOT FOUND
MOV DX,OFFSET WKFCB
CALL RENAME ;RENAME
RENAMN:
JMPS TYPEOF
;
RENANF: ;NOT FOUND ERROR
CALL FNFERR
JMPS RENAMN
;
RENAER: ;ERROR
CALL SLCRDR
JMPS USERER
;
RENADP: ;DUPLICATE FILE ERROR
MOV CX,OFFSET CFLEXT
CALL BUFPRN
JMPS RENAMN
;
; USER:SET USER NUMBER
;
USER:
CALL GTDNUM ;GET NUMBER
CMP AL,021H
JNZ USERST ;SET MODE
CALL CRLF ;INTERROGATE MODE
CALL GETUSR ;GET USER CODE
OR AL,'0'
CMP AL,'9'
JBE USEROT ;0 TO 9
PUSH AX ;10 TO 15
MOV AL,'1'
CALL CONOUT
POP AX
SUB AL,10
USEROT:
CALL CONOUT
JMPS TRCDSE
;
USERST: ;SET MODE
CMP AL,16
JC USERSS ;OK IN RANGE
JMPS USERER ;OVER
;
USERSS:
MOV DL,AL
CMP WKFCB+1,' '
JNZ USERSE ;HAVE SOME NUMBER
USERER: ;ERROR
JMP COMERR
;
USERSE:
MOV USRCOD,AL ;SET USER CODE
CALL GETUSS
JMP ENDPRT
;
; MEMORY NOT AVAILABLE IN PROGRAM LOADING
;
MEMNAV:
MOV CX,OFFSET CMNAVL
CALL BUFPRN
JMPS RENAMN
;
; TRANSIENT COMMAND OR CHANGE DRIVE
;
TRCDSL:
CALL CHKUID ;CHECK USER ID
CMP WKFCB+1,' '
JNZ TRNCMD ;SOME COMMAND
MOV AL,TDRVNU ;CHANGE DRIVE
OR AL,AL
JZ TRCDSE ;NO DRIVE SPECIFICATION
DEC AL
MOV CURDRV,AL ;SET AS CURRENT DRIVE
MOV WORD PTR WKBIOS+1,AX
CALL SELDSK ;SELECT BY DIRECT BIOS CALL
OR BX,BX
JZ USERER ;SELECT ERROR
MOV AL,CURDRV ;OK SELECT
CALL SELDRV
TRCDSE:
JMP ENDPRT
;
; TRANSIENT COMMAND
;
TRNCMD:
CMP WKFCB+9,' '
JZ TRNCMK ;OK
JMPS USERER ;NON RESIDENT COMMAND NAME CANNOT HAVE TYPE
;
TRNCMK:
CALL SLTGDR ;TO TARGET DRIVE
MOV DI,OFFSET WKFCB+9
MOV SI,OFFSET CODCMD
MOV CX,3
REP MOVSB ;SET 'CMD' TYPE
MOV DX,OFFSET WKFCB
CALL OPENW ;OPEN COMMAND FILE
JNZ TRNCMO ;OK
CALL SLCRDR ;NOT FOUND SO COMMAND ERROR
JMP COMERR
;
TRNCMO:
CALL LOADPR ;LOAD PROGRAM
INC AX
JZ MEMNAV ;TOO LARGE CANNOT LOAD IN MEMORY
MOV DDMASG,BX ;SAVE BASE PAGE SEGMENT DS
MOV ES,BX
CALL SLCRDR ;TO CURRENT DRIVE
MOV AX,DS
MOV ES,AX
CALL GTFNAM ;GET LEFT COMMAND FIRST FILE NAME
MOV BX,OFFSET TDRVNU
PUSH BX
MOV AL,[BX]
MOV WKFCB,AL
MOV AX,16
CALL GTFNAS ;GET SECOND FILE NAME
POP BX
MOV AL,[BX]
MOV WKFCB+16,AL
MOV WKFCB+32,0 ;CLEAR CURRENT RECORD COUNT
MOV DI,DFCB ;DEFAULT FCB IN BASE PAGE
MOV ES,DDMASG ;BASE PAGE SEGMENT
MOV SI,OFFSET WKFCB
MOV CX,33 ;FCB LENGTH
CALL COPY ;SET TO DEFAULT FCB
MOV SI,OFFSET CMBUFF+2
CALL SRCHTP ;GET TOP
OR AL,AL
JZ TRNCMS ;NO CODE
TRNCMT:
LODSB
OR AL,AL
JZ TRNCMS ;NO LEFT CODE
CMP AL,' '
JZ TRNCMN ;GET LEFT CODE TOP
JMPS TRNCMT ;PASS TRANSIENT COMMAND NAME
;
TRNCMN: ;GET LEFT CODE POINT
CALL SRCHTP
TRNCMS:
MOV CH,0 ;LEFT CODE LENGTH COUNT
MOV DI,DFCMBF+1
DEC SI
TRNCMM:
LODSB
STOSB ;SET LEFT COMMAND CODE
OR AL,AL
JZ TRNCMG ;END OF CODE
INC CH
JMPS TRNCMM ;TO NEXT
;
TRNCMG:
MOV AL,CH
MOV DI,DFCMBF
STOSB ;SET LENGTH COUNT
MOV DI,DFPAGE ;BASE PAGE TOP
MOV AX,ES:3[DI] ;GET CODE SEGMENT
MOV CMDPTR+2,AX
MOV AL,ES:5[DI] ;GET ENTRY OFFSET XX00H
MOV BYTE PTR CMDPTR+1,AL
CALL CRLF
CALL STDMAA ;SET DEFAULT DMA ADDRESS
MOV TRCMOD,0 ; NOT USED ????
MOV CMBUFF+1,0 ;CLEAR COMMAND COUNT
MOV ES,DDMASG
MOV DS,DDMASG
MOV BX,DFESSG
CMP WORD PTR [BX],0
JZ $+4 ;8080 MODEL OR SMALL MODEL
MOV ES,[BX] ;COMPACT MODEL
CALLF DWORD PTR CMDPTR ;TO COMMAND ROUTINE
MOV SP,OFFSET STACK
JMP SYSRST ;END OF COMMAND
;
; CCP COMMAND END PROCESS
;
ENCPRC:
CALL SLCRDR ;TO CURRENT DRIVE
ENDPRT:
CALL GTFNAM ;CHECK LEFT CODE
MOV AL,WKFCB+1
SUB AL,' '
MOV BX,OFFSET TDRVNU
OR AL,[BX]
JNZ ENDPRE ;SOME CODE LEFT SO ERROR
JMP CCPLOP ;OK END
;
ENDPRE:
JMP COMERR
;
; WORK FOR CALL TO COMMAND FILE
;
CMDPTR DW 0,0
;
; DATA AREA
;
DSEG
ORG 800H
;
CODCMD: ;TRANSIENT COMMAND TYPE
DB 'CMD'
;
DDMASG DW 0 ;BASE PAGE SEGMENT
MDSUBE DB 0 ;SUBMIT MODE
SUBFCB DB 0 ;FCB FOR SUBMIT FILE
DB '$$$ SUB',0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;
WKFCB DB 0 ;FCB FOR WORK
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0
;
RWBUFF: ;ONE SECTOR READ WORK
RS 128
DB 0,0 ;NOT USED ???
BSDIRC DB 0 ;BIAS OF DIRECTORY
USRCOD DB 0 ;USER CODE
TRCMOD DB 0 ;TRANSIENT COMMAND MODE NOT USED ???
;
;
RS 96
STACK: ;CCP STACK
;
WKBIOS DB 9 ;BIOS DIRECT CALL WORK 9 IS SELECT DISK
DW 0 ;CX
DW 1 ;DX
;
PNTCMD DW CMBUFF+2 ;COMMAND BUFFER POINTER
TPNCMD DW 0 ;COMMAND BUFFER TEMPORARY POINTER FOR ERROR
CURDRV DB 0 ;CURRENT DRIVE
TDRVNU DB 0 ;TEMPORARY DRIVE MODE
;
; INDEXED DATA
;
IXTERM: ;TERMINATOR
DB ' =_.:;<>,'
IXRSCM: ;RESIDENT COMMAND
DB 'DIRS'
DB 'USER'
DB 'REN '
DB 'TYPE'
DB 'ERA '
DB 'DIR '
;
; COMMENTS
;
CNOFIL DB 'NO FILE',0
CALLOK DB 'ALL (Y/N)?',0
CFLEXT DB 'FILE EXISTS',0
CMNAVL DB 'MEMORY NOT AVAILABLE',0
CRDERR DB 'READ ERROR',0
CCLSER DB CR,LF,'CANNOT CLOSE',0
CNSYSF DB CR,LF,'NON-SYSTEM FILE(S) EXIST',0
CSYSFL DB CR,LF,'SYSTEM FILE(S) EXIST',0
;
; USER ID CODE
;
IDCODE:
DB 1 ;OEM CODE
DB 10 ;VERSION NUMBER
DB 0 ;PRODUCT NUMBER
DB 0,0,0 ;USER ID NUMBER
;
; RESIDENT COMMAND ROUTINE INDEX
;
IXRSRT:
DW DIRNON ;DIR
DW ERASE ;ERA
DW TYPEOT ;TYPE
DW RENAMP ;REN
DW USER ;USER
DW DIRSYS ;DIRS
DW TRCDSL ;NOT RESIDENT
;
;
;
MODIRE DB 0 ;OTHER SIDE FILE EXIST MODE 0 NOT EXIST
MODDIR DB 0 ;DIRECTORY MODE 0 NON-SYSTEM 1 SYSTEM FILE
;
; PATCH AREA
;
; EQATIONS OF EXTERNAL LABELS
;
;24D8H IS SYSTEM PAGE ???
Y24E0 EQU 024E0H ;MAX COLUMN
;
;
CSEG
ORG 0A00H
;
DB '12 January 1982'
;
ORG 0A15H
DB 12H,01H,82H
;
ORG 0A40H
;
; DIRECTORY OUT PATCH FOR SHORT LINE DISPLAY
;
DIRPAT:
CMP BYTE PTR .Y24E0,60
JC DIRPAS ;SHORT LINE
JMP DIROUP
;
DIRPAS: ;SHORT LINE
AND AL,01H
JMP DIROUP
;
ORG 0A50H
;
DB 'December 28 81'
;
;
END