mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 16:04:18 +00:00
1416 lines
23 KiB
Plaintext
1416 lines
23 KiB
Plaintext
; 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
|
||
|