home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
ZCPR2
/
UNERA.AQM
/
UNERA.ASM
Wrap
Assembly Source File
|
2000-06-30
|
17KB
|
874 lines
; PROGRAM: UNERA for ZCPR2
; AUTHOR: RICHARD CONN
; VERSION: 2.2
; DATE: 25 July 83
; PREVIOUS VERSIONS: 2.1 (24 JULY 83), 2.0 (23 JULY 83)
; DERIVATION: UNERA BY GENE COTTON
VERS EQU 22 ;version number
;
; PROGRAM TO RECOVER ERASED FILES, BY GENE COTTON
;
; From Interface Age December 1981 pg 146
;
; v2.0 - 07/23/83 Modified to be consistent in the ZCPR2 tool set.
; - Rick Conn
;
; Contributors:
; v1.6 - Dave Rand
; v1.5 - Irv Hoff
; v1.4 - Paul Traina
; v1.3 - Irv Hoff
; v1.2 - Charlie Strom
; v1.1 - Bruce Blakeslee
; v1.0 - Retyped from Interface Age (Dec 81). - Henry Rothberg
;
;
; System equates:
;
BOOT EQU 0000H ;CP/M WARM BOOT JUMP VECTOR
BDOS EQU BOOT+05H ;CP/M BDOS CALL JUMP VECTOR
TBUFF EQU BOOT+80H ;DISK I/O BUFFER
FCB EQU BOOT+5CH ;DEFAULT FILE CONTROL BLOCK
FCB2 EQU BOOT+6CH ;SECONDARY FILE CONTROL AREA
CR EQU 'M'-'@' ;CTL-M FOR CARRIAGE RETURN
LF EQU 'J'-'@' ;CTL-J FOR LINE FEED
CTRLC EQU 'C'-'@' ;ABORT
;
; ZCPR2 and its utilities, including this one, are released
; to the public domain. Anyone who wishes to USE them may do so with
; no strings attached. The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;
; Branch to Start of Program
;
ORG BOOT+100H
JMP START
;
;******************************************************************
;
; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
; This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;
;
; EXTERNAL PATH DATA
;
EPAVAIL:
DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
;
; INTERNAL PATH DATA
;
INTPATH:
DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT
; DISK = 1 FOR A, '$' FOR CURRENT
; USER = NUMBER, '$' FOR CURRENT
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT
DB 0 ; END OF PATH
;
; MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
;
; DISK/USER LIMITS
;
MDISK:
DB 4 ; MAXIMUM NUMBER OF DISKS
MUSER:
DB 31 ; MAXIMUM USER NUMBER
;
; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
;
; PRIVILEGED USER DATA
;
PUSER:
DB 10 ; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS
DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
;
; CURRENT USER/DISK INDICATOR
;
CINDIC:
DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS)
;
; DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
DW 80H ; TBUFF AREA
;
; NAMED DIRECTORY INFORMATION
;
NDRADR:
DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
DB 64 ; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
DB 'NAMES ' ; NAME OF DISK NAME FILE
DB 'DIR' ; TYPE OF DISK NAME FILE
;
; REQUIREMENTS FLAGS
;
EPREQD:
DB 000H ; EXTERNAL PATH?
MCREQD:
DB 000H ; MULTIPLE COMMAND LINE?
MXREQD:
DB 000H ; MAX USER/DISK?
UDREQD:
DB 000H ; ALLOW USER/DISK CHANGE?
PUREQD:
DB 000H ; PRIVILEGED USER?
CDREQD:
DB 000H ; CURRENT INDIC AND DMA?
NDREQD:
DB 000H ; NAMED DIRECTORIES?
Z2CLASS:
DB 0 ; CLASS 0
DB 'ZCPR2'
DS 10 ; RESERVED
;
; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;
;
; Start of Program
;
START:
;
LXI H,0 ;SAVE STACK PTR
DAD SP
SHLD STACK
LXI SP,STACK ;SET STACK POINTER
CALL HELLO ;SIGN ON MESSAGE
CALL HELPCHK ;CHECK FOR AND PRINT HELP MESSAGE
CALL PCHECK ;CHECK PARAMETERS
LDA FNCOUNT ;NUMBER OF FILES SPECIFIED
ORA A ;0=NONE
CNZ TRYFIX ;DO THE RECOVERY
CALL BYE ;SIGN OFF MESSAGE
JMP BOOT ;RETURN TO CP/M
;
; ** Main Routines **
;
;
; SAY WHO WE ARE
;
HELLO:
CALL PRINT
DB 'UNERA, Version '
DB (VERS/10)+'0','.',(VERS MOD 10)+'0',0
RET
;
; CHECK FOR VALID PARAMETERS AND SAY WHICH CP?M VERSION
;
PCHECK:
CALL OPTCHK ;CHECK FOR OPTIONS AND SET FLAGS
CALL FCBCHK ;MAKE SURE FILE SPECIFIED
CALL CPMCHK ;ESTABLISH CP/M PARAMETERS
CALL PUSCHK ;CHECK IF USER WANTS TO CHANGE DISK
RET
;
; LOOK THROUGH DIRECTORY
;
TRYFIX:
CALL NXTSEC ;GET A DIRECTORY SECTOR
RZ ;RETURNS ZERO FLAG IF NO MORE
CALL CHKENT ;CHECK IT OUT AND MAYBE FIX
JMP TRYFIX ;KEEP IT UP TILL DONE
;
; SIGN OFF AND RESET SYSTEM
;
BYE:
MVI C,13 ;SYSTEM RESET
CALL BDOS
LDA LISTFL ;LIST ONLY?
ORA A ;0=NO
JNZ PRNF
LDA FIXCNT ;CHECK FOR ACTIVITY
ORA A
JZ PRNF ;SAY NONE FOUND
CALL PRINT
DB CR,LF,'File(s) Recovered - DOUBLE CHECK Before Using',0
RET
PRNF:
CALL PRINT
DB CR,LF,'NO Files Recovered',0
RET
;
; CHECKS FOR P AND 0 OPTIONS IN COMMAND LINE
;
OPTCHK:
XRA A ;TURN OFF FLAGS
STA CURUSR
STA PAUSE
STA FIXCNT
STA LISTFL
STA FNCOUNT ;NO FILE NAMES
LXI H,1 ;SET SECTOR 1
SHLD SECTOR
LXI H,TBUFF ;SCAN THRU TBUFF, BUILDING A FILE NAME TABLE
MOV A,M ;GET CHAR COUNT
INX H ;PT TO FIRST CHAR
PUSH H ;SAVE PTR
ADD L ;PT TO AFTER LAST CHAR
MOV L,A
MVI M,0 ;STORE ENDING ZERO
POP H ;GET PTR TO FIRST CHAR
CALL SBLANK ;SKIP BLANKS
LXI D,FNTAB ;PT TO TABLE
FNLOOP:
PUSH D ;SAVE TABLE PTR
CALL GETFN ;EXTRACT FILE NAME
POP D
PUSH H
LXI H,11 ;PT TO NEXT TABLE ENTRY
DAD D
XCHG
POP H
LDA FNCOUNT ;INCREMENT COUNT
INR A
STA FNCOUNT
MOV A,M ;GET TERMINATING CHAR
INX H ;PT TO NEXT
CPI ',' ;ANOTHER FOLLOWS?
JZ FNLOOP
DCX H ;POINT BACK TO DELIM
CALL SBLANK ;SKIP TO NON-BLANK
OPTCK1:
MOV A,M ;GET OPTION
CALL DELCHK ;DONE IF DELIM
RZ
CPI 'L' ;LIST ONLY?
JZ OPTCKL
CPI 'P' ;PAUSE?
JZ OPTCKP
CPI 'Z' ;USER 0?
JZ OPTCKZ
CALL PRINT
DB CR,LF,'Invalid Option -- ',0
MOV A,M
CALL TYPE
JMP HCK1
OPTCKL:
MVI A,0FFH ;SET FLAG
STA LISTFL
INX H ;PT TO NEXT
JMP OPTCK1
OPTCKP:
MVI A,0FFH ;SET FLAG
STA PAUSE
INX H ;PT TO NEXT
JMP OPTCK1
OPTCKZ:
MVI A,0FFH ;SET FLAG
STA CURUSR
INX H
JMP OPTCK1
GETFN:
PUSH D ;FILL TARGET FCB
MVI B,11 ;11 BYTES
MVI A,' ' ;SPACE FILL
GETFN0:
STAX D ;PUT SPACE
INX D
DCR B
JNZ GETFN0
POP D ;PT TO ENTRY AGAIN
CALL SCANCOL ;SCAN FOR COLON
MVI B,8 ;8 CHARS MAX
CALL GETFN1 ;GET AND FILL ENTRY
MOV A,M ;GET CHAR
CPI '.' ;DELIM?
RNZ ;DONE
INX H ;PT TO AFTER PERIOD
MVI B,3 ;3 CHARS MAX AND DO IT AGAIN
GETFN1:
MOV A,M ;GET CHAR
CPI '.' ;END OF FIELD?
JZ GETFN3
CALL DELCHK ;CHECK DELIMITER
RZ
CPI '*' ;WILD?
JZ GETFNQ
STAX D ;STORE CHAR
INX H ;PT TO NEXT
INX D
DCR B ;COUNT DOWN
JNZ GETFN1
GETFN2:
MOV A,M ;FLUSH CHARS TO DELIM
CALL DELCHK ;CHECK FOR DELIMITER
RZ
INX H ;PT TO NEXT
JMP GETFN2
GETFN3:
INX D ;PT TO AFTER FIELD
DCR B ;COUNT DOWN
JNZ GETFN3
RET
GETFNQ:
MVI A,'?' ;FILL WITH QUESTION MARKS
STAX D
INX D
DCR B
JNZ GETFNQ
JMP GETFN2 ;SKIP TO DELIM
DELCHK:
ORA A ;END OF LINE?
RZ
CPI '.' ;END OF FIELD?
RZ
CPI ',' ;END OF ENTRY?
RZ
CPI ' '
RET
SBLANK:
MOV A,M ;SKIP TO NON-BLANK
CPI ' '
RNZ
INX H
JMP SBLANK
SCANCOL:
PUSH D ;SAVE TABLE PTR
PUSH H ;SAVE PTR
SCOL1:
MOV A,M ;GET CHAR
INX H ;PT TO NEXT
CPI ':' ;COLON?
JZ SCOLX
CALL DELCHK ;CHECK FOR DELIMITER
JNZ SCOL1
SCOL2:
POP H ;RESTORE
POP D
RET
SCOLX:
XCHG ;DE PTS TO AFTER COLON
POP H ;GET OLD PTR
XCHG ;REPLACE IT
POP D ;GET TABLE PTR
RET
;
; CHECKS THE CURRENT 4 DIRECTORY ENTRIES AGAINST ARGUMENT
; IF MATCH, REWRITES SECTOR WITH REACTIVATED 1ST BYTES
;
CHKENT:
XRA A ;ASSUME NO REWRITE
STA REWRT
MVI B,4 ;NUMBER OF ENTRIES PER SECTOR
LXI H,TBUFF ;BEGINNING OF BUFFER
CKLUP:
PUSH B
MOV A,M
CPI 0E5H ;CHECK FOR UNUSED
JNZ CKINC
LXI D,FNTAB ;PT TO POTENTIAL FILES
LDA FNCOUNT ;NUMBER OF ENTRIES TO COUNT
MOV B,A ;... IN B
CKLUP0:
PUSH H ;SAVE BEGINNING ADDRESS
PUSH D ;SAVE PTR
PUSH B ;SET NAME COUNT
CALL COMPAR ;COMPARE WITH ARGUMENT
POP B ;GET NAME COUNT
POP D ;GET PTR
POP H
JZ CKLUP1 ;MATCH!
PUSH H ;SAVE PTR
LXI H,11 ;PT TO NEXT ENTRY
DAD D
XCHG
POP H
DCR B ;COUNT DOWN
JNZ CKLUP0
JMP CKINC
CKLUP1:
LDA LISTFL ;LIST ONLY?
ORA A ;0=NO
JNZ CKINC
MVI M,0 ;SET USER 0
LDA CURUSR ;CHECK FOR CURRENT USER
CPI 0FFH
JZ CKLUP2
PUSH H ;SAVE HL
MVI E,0FFH ;GET USER VALUE
MVI C,32 ;GET USER AREA FUNCTION
CALL BDOS ;BDOS RETURNS CURRENT AREA IN 'A' REG.
POP H ;RESTORE HL
MOV M,A ;POKE IN CURRENT USER AREA
CKLUP2:
MVI A,0FH ;SAY NEED REWRITE
STA REWRT
MVI A,0FFH ;SET COUNT FLAG
STA FIXCNT
CKINC:
POP B
LXI D,32 ;LENGTH OF ENTRY
DAD D
DCR B
JNZ CKLUP
LDA REWRT ;SEE IF NEED REWRITE
ORA A
JZ CKDONE ;NO - DONE
;
; WRITE THE DIRECTORY SECTOR BACK TO THE DISK
;
LHLD TRACK ;SET TRACK
MOV C,L
MOV B,H
CALL SETTRK
LHLD SECTOR ;SET SECTOR
MOV B,H
MOV C,L
CALL TRNSLT
CALL SETSEC
CALL WRITE ;WRITE THE SECTOR BACK
ORA A
JNZ ERRWRT ;ABORT IF ERROR
CKDONE:
LHLD DIRMAX
DCX H ;REDUCE SECTORS LEFT
SHLD DIRMAX
LHLD SECTOR ;POINT TO NEXT SECTOR
INX H
SHLD SECTOR
XCHG
LHLD MAXSEC ;REACHED LIMIT?
INX H ;ONE MORE
MOV A,H ;CHECK HIGH
CMP D
RNZ
MOV A,L ;CHECK LOW
CMP E
RNZ
LHLD TRACK ;NEXT TRACK
INX H
SHLD TRACK
LXI H,1 ;FIRST SECTOR OF NEXT TRACK
SHLD SECTOR
RET
;
; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT
;
COMPAR:
SHLD TEMP ;Hold pointer in case of match
INX H
XCHG
MVI C,11
CMPR1:
LDAX D ;GET DIRECTORY ENTRY CHARACTER
ANI 7FH ;STRIP ANY FLAGS
CMP M
JNZ CMPCKAM
CMPR2:
INX D
INX H ;BUMP TO NEXT CHARACTER
DCR C
JNZ CMPR1 ;LOOP FOR 11 CHARACTERS
LDA FIXCNT ;CHECK FLAG
ORA A ;0=FIRST TIME
CZ PRFIX
LHLD TEMP
CALL PRINTFCB
XRA A
RET ;RETURNS 'ZERO' FLAG SET FOR MATCH
PRFIX:
LDA LISTFL ;LIST ONLY?
ORA A ;0=NO
JNZ PRFIX1
CALL PRINT
DB CR,LF,'File(s) Recovered --',0
RET
PRFIX1:
MVI A,0FFH ;DON'T PRINT THIS AGAIN
STA FIXCNT
CALL PRINT
DB CR,LF,'Erased File(s) --',0
RET
CMPCKAM:
LDAX D
CPI 0E5H ;NON-ALLOCATED ENTRY?
JZ SKIP
MOV A,M
CPI '?'
RNZ
JMP CMPR2
SKIP:
ORA A
RET ;SET NZ FLAG
;
; CHECK FOR CP/M VERSION AND SET THINGS
;
CPMCHK:
LXI D,80H ;SET DMA TO TBUFF
MVI C,26
CALL BDOS
MVI C,12 ;VERSION NUMBER REQUEST
CALL BDOS
CPI 20H ;EARLIER THAN 2.2?
JC VERERR
CALL CPM22 ;IF 2.2 GO SET THINGS
CALL GTBIOS ;ESTABLISH BIOS JUMP VECTOR
;
; SELECT DISK AND SETUP DISK PARAMETER HEADER
;
LDA FCB ;GET THE DISK
MOV E,A
MVI C,14
CALL BDOS
LDA FCB
MOV C,A
MVI B,0
CALL SELDSK ;MAKE SURE DRIVE IS
MOV A,H ; SELECTED
ORA L
JZ ILDISK
MOV E,M ;GET THE ADDRESS
INX H ; OF THE XLTO
MOV D,M
XCHG
SHLD DPH ;SAVE THE ADDRESS
RET
VERERR:
CALL PRINT
DB CR,LF,'ABORT - Prior to CP/M 2.x',0
JMP BOOT
;
; IF CP/M 2.2 DETERMINE NUMBER OF DIRECTORY ENTRIES ALSO
;
CPM22:
MVI C,31 ;GET DISK PARAMETERS ADDRESS
CALL BDOS ;DPB ADDRESS IN 'HL' ON RETURN
MOV E,M ;NUMBER OF SECTORS/TRACK
INX H ;AS 2-BYTE QUANTITY IN DE
MOV D,M
INX H
XCHG
SHLD MAXSEC ;SET MAX SECTORS/TRACK
XCHG
INX H
INX H
MOV A,M ;GET EXM
STA EXTENT
INX H ;PT TO DRM
INX H
INX H
MOV E,M ;GET NUMBER OF
INX H ; DIRECTORY ENTRIES
MOV D,M
XCHG
INX H ;ACCOUNT FOR - 1
CALL SHFHL2 ;SHIFT 'HL' RIGHT 2
SHLD DIRMAX ;SAVE NUMBER DIRECTORY SECTORS
LXI H,5 ;NOW POINT TO SYSTEM
DAD D ; TRACK OFFSET
MOV A,M ;PICK UP NUMBER OF
INX H
MOV H,M
MOV L,A
SHLD TRACK
RET
;
; ERROR OCCURED DURING DISK WRITE - ABORT
;
ERRWRT:
CALL PRINT
DB CR,LF,'ABORT - Error During Disk Write',0
JMP BOOT ;ABORT
;
; MAKE SURE A LEGAL DISK IS SPECIFIED AND CHECK FOR HELP
;
FCBCHK:
LDA FCB ;GET DRIVE SPECIFICATION
ORA A ;SEE IF DEFAULT
JNZ FCBCK1 ;NO, GO CHECK FILENAME
MVI C,25 ;ASK FOR CURRENT DRIVE
CALL BDOS
INR A ;OFFSET FOR NEXT INSTRUCTION
FCBCK1:
DCR A ;CURRENT DRIVE NUMBER
STA FCB ;SAVE IT
RET
;
; CHECK FOR HELP REQUEST
;
HELPCHK:
LDA FCB+1 ;GET 1ST BYTE OF FILENAME
CPI '/' ;HELP?
JZ HCK1
CPI ' ' ;MAKE SURE IT IS NON-BLANK
RNZ ;OK - KEEP GOING
;
; IF NO FILE NAME IS SPECIFIED, ABORT WITH NOTICE
;
HCK1:
CALL PRINT
DB CR,LF
DB CR,LF,' UNERA is used to Unerase Files. It must be used'
DB CR,LF,'IMMEDIATELY after the file is erased (before any'
DB CR,LF,'new files are created). It is invoked by a command'
DB CR,LF,'of the form:'
DB CR,LF,' UNERA afn,afn,afn,... o'
DB CR,LF,'where "afn" is an ambigous file name which'
DB CR,LF,'specifies the files to be unerased and "o" is'
DB CR,LF,'none or more of the following options:'
DB CR,LF,' L - List Erased Files Only'
DB CR,LF,' P - Pause for disk change'
DB CR,LF,' Z - Place file in User 0 '
DB '(default is current)'
DB CR,LF,' The forms:'
DB CR,LF,' UNERA or UNERA //'
DB CR,LF,'present this Help message.'
DB CR,LF,' Drive prefixes (DU:) are ignored.'
DB CR,LF,0
CLEANRET:
LHLD STACK ;QUIET RETURN
SPHL
RET
;
; GET BIOS JUMPS VECTORS FOR EASY REFERENCE
;
GTBIOS:
LHLD BOOT+1 ;POINTS TO BIOS JUMP TABLE+3
LXI D,WBOOT ;WHERE WE WILL KEEP A COPY
MVI B,16*3 ;MOVE 48 BYTES AND FALL THRU TO MOVE
;
; GENERAL PURPOSE MOVE ROUTINE
; FROM 'HL' TO 'DE' FOR COUNT OF 8
;
MOVE:
MOV A,M ;GET A BYTE
STAX D ;PUT A BYTE
INX D ;INCREMENT TO NEXT
INX H
DCR B ;COUNT DOWN
JNZ MOVE
RET
;
;SPECIFIED AN ILLEGAL DISK DRIVE - ABORT
;
ILDISK:
CALL PRINT
DB CR,LF,'ABORT - Illegal Disk Requested',0
JMP BOOT ;ABORT
;
; READS NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES)
; RETURNS WITH ZERO FLAG SET IF NO MORE
;
NXTSEC:
LHLD DIRMAX ;SEE IF MORE SECTORS
MOV A,H
ORA L
RZ ;RETURNS ZERO FLAG IF NO MORE
LHLD TRACK ;SET TRACK
MOV C,L
MOV B,H
CALL SETTRK
LHLD SECTOR ;SET SECTOR
MOV B,H
MOV C,L
CALL TRNSLT
CALL SETSEC
CALL READ ;READ A SECTOR
ANI 1 ;REVERSE SENSE OF ERROR FLAG
XRI 1 ;RETURNS WITH ZERO FLAG SET
RET ;IF BAD READ
;
; PRINT STRING PTED TO BY RET ADR
;
PRINT:
XTHL
PRINTL:
MOV A,M ;GET CHAR
INX H ;PT TO NEXT
ANI 7FH ;MASK
JZ PRINTD
CALL TYPE ;PRINT
JMP PRINTL
PRINTD:
XTHL
RET
;
; FCB PRINTING ROUTINE
;
PRINTFCB:
PUSH H
LXI D,1+8+3
DAD D
LDA EXTENT ;GET EXTENT MASK
CMP M ;COMPARE TO TARGET
POP H
RC ;PRINT ONLY FIRST EXTENT
CALL CRLF ;NEW LINE
MVI A,' ' ;SPACE IN
CALL TYPE
CALL TYPE
INX H
MVI B,8
CALL PR1
MVI A,'.'
CALL TYPE
MVI B,3
PR1:
MOV A,M
ANI 7FH
CPI ' ' ;Check for blanks
CNZ TYPE
INX H
DCR B
JNZ PR1
RET
;
; PRINT CHAR IN A ON TERMINAL; AFFECT NO REGS
;
TYPE:
PUSH H ;SAVE REGS
PUSH D
PUSH B
PUSH PSW
MOV E,A ;CHAR IN E
MVI C,2 ;BDOS ROUTINE
CALL BDOS
POP PSW ;RESTORE REGS
POP B
POP D
POP H
RET
;
; DOES USER WANT TO PAUSE TO CHANGE DISKS OR SELECT USER 0?
;
PUSCHK:
LDA PAUSE ;GET OPTION
ORA A
RZ ;NOPE, SO RETURN
CALL PRINT ;PRINT PAUSE MESSAGE
DB CR,LF,'Change Disk - Hit ^C to Abort, Anything Else to Cont - '
DB 0
MVI C,01
CALL BDOS ;INPUT A CHAR
CPI CTRLC ;ABORT?
JZ CLEANRET
CALL CRLF
MVI C,0DH
JMP BDOS ;RESET THE DISK
;
; NEW LINE
;
CRLF:
MVI A,0DH ;NEW LINE
CALL TYPE
MVI A,0AH
JMP TYPE
;
; SHIFT REGS 'HL' RIGHT 2 BITS LOGICAL
;
SHFHL2:
CALL SHFHL ;ROTATE RIGHT 1 BIT AND FALL THRU
SHFHL:
XRA A ;CLEAR CARRY
MOV A,H
RAR ;SHIFTED BIT IN CARRY
MOV H,A
MOV A,L
RAR
MOV L,A
RET
;
; TRANSLATE REG 'BC' FROM LOGICAL TO PHYSICAL SECTOR NUMBER
;
TRNSLT:
LHLD DPH ;GET ADDRESS OF XLTO
XCHG
CALL SECTRAN ;USE BIOS ROUTINE
MOV C,L ;RETURN VALUE IN BC
MOV B,H
RET
;
; THIS IS THE WORKING COPY OF THE BIOS JUMP TABLE
;
WBOOT: DS 3
CONST: DS 3
CONIN: DS 3
CONOUT: DS 3
LIST: DS 3
PUNCH: DS 3
READER: DS 3
HOME: DS 3
SELDSK: DS 3
SETTRK: DS 3
SETSEC: DS 3
SETDMA: DS 3
READ: DS 3
WRITE: DS 3
LISTST: DS 3
SECTRAN: DS 3
;
DS 100 ;STACK DEPTH
STACK:
DS 2 ;LOCATION OF STACK
;
; DATA AREAS
;
FNCOUNT:
DS 1 ;NUMBER OF FILE NAMES IN COMMAND LINE
CURUSR: DS 1 ;0 IF NOT IN CURRENT USER
PAUSE: DS 1 ;0 IF NO PAUSE FOR DISK CHANGE
LISTFL: DS 1 ;0 IF NOT LIST ONLY
DIRMAX: DS 2 ;NUMBER OF SECTORS IN DIRECTORY =
; ; MAXIMUM NUMBER OF DIRECTORY ENTRIES
; ; DIVIDED BY 4 (ENTRIES PER SECTOR)
TEMP: DS 2 ;TEMP STORAGE FOR FCB PRINT
EXTENT: DS 1 ;EXTENT MASK
MAXSEC: DS 2 ;MAXIMUM NUMBER OF SECTORS/TRACK
FIXCNT: DS 1 ;CHANGE FLAG
REWRT: DS 1 ;REWRITE FLAG 0=NO, F=YES
SECTOR: DS 2 ;CURRENT SECTOR NUMBER
TRACK: DS 2 ;TRACK NUMBER OF DIRECTORY
;
; ADDRESS OF THE TRANSLATE TABLE
;
DPH: DS 16
FNTAB: DS 11*40 ;FILE NAME BUFFER
END