home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug001.ark
/
IDIR.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
5KB
|
298 lines
;****************************************
;
; ISIS II TO CPM
; DIRECTORY UTILITY
;
; VERSION 1.0
;
;****************************************
ORG 100H
ICOPY: LXI SP,STACK ;SET STACK
MVI C,1 ;SELECT DISK 1
CALL SDSK
CALL HOME ;HOME DISK 1
LXI D,DIRLNK ;POINT TO DIR LINK BLOCK LINK
LXI H,DBCA ;DIR BCA
CALL GLB ;GET LINK BLOCK
ICL0: LXI H,DBCA ;DIR BCA
CALL GDB ;GET DIR BLOCK
JC DONE ;NO MORE DIR BLOCKS, FINISHED
LXI H,DBUF ;DIR BUFFER
SHLD DENT ;SAVE IN POINTER
MVI A,8 ;NUMBER OF ENTRIES/BLOCK
STA DCNT ;SAVE
ICL1: LHLD DENT ;GET DIR ENTRY PTR
MOV A,M ;GET STATUS BYTE
CPI 00 ;ACTIVE?
JNZ ILN1 ;NO, GET NEXT ENTRY
INX H ;POINT TO FN
PUSH H ;SAVE HL
LXI D,BMSG
MVI C,09
CALL CPM ;PRINT 'B: ' MESSAGE
POP H
CALL FPRT ;PRINT FILE ID
ILN1: LHLD DENT ;POINTER TO ENTRY
LXI D,16 ;SIZE OF ENTRY
DAD D ;POINT TO NEXT ENTRY
SHLD DENT
LDA DCNT ;ENTRY COUNTER
DCR A ;DECREMENT
STA DCNT
JNZ ICL1 ;LOOP
JMP ICL0
DONE: MVI C,0
CALL SDSK
JMP BOOT
IOERR: LXI D,MSG2
MVI C,09
CALL CPM
JMP BOOT
;***************************************;
;
; GLB - GET LINK BLOCK
;
; DE= A(LINK TO LINK BLOCK)
; HL= A(BLOCK CONTROL AREA)
;
;***************************************;
GLB: SHLD BCAP ;SAVE BCA ADDR
CALL SEEKR ;READ LINK BLOCK
LHLD BCAP ;GET BCA ADDR
LXI D,BCBL ;OFFSET TO LINK BUFFER
DAD D
LXI D,TBUF
MVI B,128
CALL MOVE ;COPY TO LINK BUFFER
LHLD BCAP ;GET BCA ADDR
LXI D,BCBL+4 ;OFFSET TO FIRST DATA LINK
XCHG
DAD D ;DE=A(FIRST DATA LINK)
XCHG
LXI B,BCAL ;OFFSET TO LINK PTR
DAD B
MOV M,E
INX H
MOV M,D ;SET LINK PTR
LHLD BCAP ;BCA ADDR
LXI D,BCALC ;LINK COUNT
DAD D
MVI M,62 ;NO OF LINKS
RET
;****************************************:
;
; GDB: GET DATA BLOCK
;
; HL= A(BLOCK CONTROL AREA)
;
;****************************************;
GDB: SHLD BCAP ;SAVE BCA ADDR
LXI D,BCAL ;OFFSET TO LINK BUF
DAD D
MOV E,M
INX H
MOV D,M ;GET LINK ADDR
PUSH D ;SAVE LINK ADDR
LDAX D ;GET LINK BYTE
MOV C,A
INX D
LDAX D ;GET LINK BYTE
ORA C ;TEST FOR ZERO LINK
POP D
JZ GDBE ;ZERO LINK, EOF
PUSH D
PUSH H
CALL SEEKR ;GET DATA BLOCK
POP H
POP D
INX D
INX D
MOV M,D
DCX H
MOV M,E ;UPDATE LINK PRT
LHLD BCAP ;GET BCA ADDR
LXI D,BCBD ;OFFSET TO DATA BUF
DAD D
LXI D,TBUF
MVI B,128
CALL MOVE ;COPY DATA TO BUF
LHLD BCAP ;GET BCA ADDR
LXI D,BCALC ;LINK COUNT
DAD D
DCR M ;DECREMENT
RNZ ;OK, CONTINUE
LHLD BCAP ;GET BCA ADDR
LXI D,BCBL+2 ;POINT TO LINK BUF
DAD D
MOV E,M ;GET LINK
INX H
MOV D,M
DCX H
MOV E,A
ORA D ;TEST FOR LINK
JZ GDBE ;END, ERROR
XCHG ;DE = A(NEXT LINK)
LHLD BCAP ;BCA ADDR
CALL GLB ;GET LINK BLOCK
RET
GDBE: STC ;INDICATE EOF
RET
;***************************************;
;
; SEEKR: SEEK DISK BLOCK
;
; DE = A(LINK)
;
;***************************************;
SEEKR: PUSH D ;SAVE DE
MVI C,1 ;SET DISK B
CALL SDSK
POP D
PUSH D
LDAX D ;GET SECTOR
MOV C,A
CALL SSEC ;SET SECTOR
POP D
PUSH D
INX D
LDAX D ;GET TRACK
MOV C,A
CALL STRK
CALL READ ;READ BLOCK
POP D
RET
;*****************************************;
;
; FPRT: PRINT FILE ID
;
; HL = A(FILE ID)
;
;*****************************************;
FPRT: MVI B,9 ;ID SIZE
FPRT2: MOV A,M ;GET BYTE
CPI 00 ;IF ZERO,SKIP
JNZ FPRT3
MVI A,' '
FPRT3: MOV E,A ;PUT IN E
PUSH H ;SAVE HL
PUSH B ;SAVE BC
MVI C,02 ;WRITE CONSOLE
CALL CPM ;PRINT CHAR
POP B ;RESTORE BC
POP H ;RESTORE HL
INX H ;BUMP POINTER
MOV A,B
CPI 04 ;FILE TYPE?
JNZ FPRT4
MVI E,' '
MVI C,02
PUSH H
PUSH B
CALL CPM
POP B
POP H
FPRT4: DCR B
JNZ FPRT2
MVI C,02
MVI E,0DH
CALL CPM
MVI C,02
MVI E,0AH
CALL CPM
RET
;*****************************************;
;
; MOVE: MOVE DATA
;
; DE = A (SOURCE)
; HL = A(DEST)
; B = COUNT
;
;******************************************;
MOVE: LDAX D ;GET BYTE
MOV M,A ;STORE BYTE
INX H
INX D ;BUMP PTRS
DCR B ;DECREMENT COUNT
JNZ MOVE
RET
;*******************************************;
;
; CPM INTERFACE ROUTINES
;
;*******************************************;
SDSK: LHLD 0001H ;GET BIOS ADDR
MVI L,1BH
PCHL
SSEC: LHLD 0001H
MVI L,21H
PCHL
STRK: LHLD 0001H
MVI L,1EH
PCHL
READ: LHLD 0001H
MVI L,27H
PCHL
HOME: LHLD 0001H
MVI L,18H
PCHL
;******************************************;
;
; BLOCK CONTROL AREA DEFINITIONS
;
;******************************************;
BCA EQU 0
BCAL EQU 0
BCALC EQU BCAL+2
BCBL EQU BCALC+1
BCBD EQU BCBL+128
;******************************************;
;
; DATA
;
;******************************************;
BMSG: DB 'B: $'
MSG2: DB 'I/O ERROR',0DH,0AH,'$'
DIRLNK: DB 01,01
DENT: DS 2
DCNT: DS 1
BCNT: DS 2
BCAP: DS 2
DS 64
STACK EQU $
DBCA: DS 2
DS 1
DS 128
DBUF: DS 128
FBCA: DS 2
DS 1
DS 128
FBUF: DS 128
TBUF EQU 0080H
TFCB EQU 005CH
CPM EQU 0005H
BOOT EQU 0000H
CREATE EQU 22
WRITE EQU 21
CLOSE EQU 16
END