home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
norge.freeshell.org (192.94.73.8)
/
192.94.73.8.tar
/
192.94.73.8
/
pub
/
computers
/
cpm
/
alphatronic
/
PASCALZ4.ZIP
/
D3
/
BYTIN.SRC
< prev
next >
Wrap
Text File
|
1999-04-05
|
3KB
|
163 lines
;RETURNS BYTE FROM FILE ONE BYTE AT A TIME
;
NAME BYTIN
ENTRY .BYTIN
EXT .SELDSK,.POPHDB,.PUSHBD
INCLUDE DEFLT.SRC
;
;
.BYTIN CALL .PUSHBD ;SAVE ALL REGISTERS EXCEPT A
LXI D,BYTPT
DAD D
MOV A,M
INX H
CMP M
CMC ; MAKE CARRY 0 UNLESS END OF BLOCK.
JNZ NTEMPT ; BRANCH AROUND BLOCK READ IF NOT EMPTY.
;THIS READS A 256 BYTE BLOCK INTO THE DATA AREA OF THE FILE DESCRIPTOR
;POINTED TO HL - LSBYT. IT MODIFIES BYTPT, LSBYT, ALL REGISTERS EXCEPT HL AND A.
PUSH PSW
PUSH H
LXI D,-LSBYT-3
DAD D ;FLAGS BYTE
BIT 4,M ;'RANDOMLY ACCESSED' BIT
JZ BYTIN1 ;NOT RANDOMLY ACCESSED
IF NOT COMPILER ;COMPILER DOESN'T USE DIRECT ACCESS
;RANDOMLY ACCESSED. FILL BUFFER USING RANDOM READ FUNCTION
INX H
INX H
INX H ;FCB
CALL .SELDSK ;SELECT PROPER DRIVE
POP D
PUSH D
INX D ;START OF DATA BUFFER
MVI C,26 ;CP/M CODE FOR SETTING DMA ADDRESS
CPM
POP H
PUSH H
LXI D,-LSBYT+RANREC ;LOW BYTE OF RANDOM RECORD NUMBER
DAD D
INR M ;INCREMENT COUNT
MOV A,M
CPI 1
JRNC RRDSET
INX H ;CARRY TO HIGH BYTE
INR M
JRNZ RRDSET
INX H ;CARRY TO OVERFLOW BYTE
INR M
RRDSET POP H
PUSH H
LXI D,-LSBYT ;FBA
DAD D
XCHG
MVI C,33 ;RANDOM READ
CPM
;READ SECOND SECTOR
POP H
PUSH H
LXI D,128+DATAB-LSBYT
DAD D ;SECOND HALF OF DATA BUFFER
XCHG
MVI C,26 ; SET DMA ADDRESS
CPM
POP H
PUSH H
LXI D,-LSBYT+RANREC
DAD D
INR M ;INCREMENT RANDOM RECORD COUNT
MOV A,M
CPI 1
JRNC RRESET
INX H ;CARRY TO HIGH BYTE OF RECORD COUNT
INR M
JRNZ RRESET
INX H ;CARRY TO OVERFLOW BYTE OF RECORD COUNT
INR M
RRESET: POP H
PUSH H
LXI D,-LSBYT
DAD D ;FCB
XCHG
MVI C,33 ;RANDOM READ
CPM
POP H
POP PSW
ORA A ;CLEAR CARRY FOR NOT EOF
JMP NTEMPT
ENDIF
;DOING SEQUENTIAL READS
BYTIN1: POP H
PUSH H
MOV A,M
ADI 1 ; TEST LSBYT FOR FFH
JNC BEOF ; END OF FILE HAS BEEN REACHED.
LXI D,FCB-LSBYT
DAD D ; HL NOW POINTS TO FCB.
CALL .SELDSK ; SELECT PROPER DRIVE.
POP D
PUSH D
INX D ; DE NOW POINTS TO START OF DATA BUFFER.
MVI C,26 ; CP/M CODE FOR SETTING DMA ADDRESS.
CPM
POP H
PUSH H
LXI D,FCB-LSBYT
DAD D
XCHG
MVI C,20 ; CP/M CODE FOR READ SECTOR.
CPM
ORA A
JRNZ EOF99
;READ SECOND SECTOR TO FILL 256 BYTE BLOCK.
POP H
PUSH H
LXI D,128+DATAB-LSBYT
DAD D ; HL NOW POINTS TO SECOND HALF OF DATA BUFFER.
XCHG
MVI C,26 ; CP/M CODE FOR SETTING S_DMA ADDRESS.
CPM
POP H
PUSH H
LXI D,FCB-LSBYT
DAD D ; HL NOW POINTS TO FCB.
XCHG
MVI C,20 ; CP/M CODE FOR READ SECTOR.
CPM
ORA A
JRNZ EOF360
POP H
POP PSW
ORA A ; CLEAR CARRY FOR NOT EOF INDICATION.
JMPR NTEMPT
EOF99
BEOF POP H
POP PSW
STC ; SET CARRY FOR EOF INDICATION.
JMPR NTEMPT
EOF360 POP H
MVI M,7FH ; CODE FOR HALF FULL BUFFER.
POP PSW
ORA A ; NOT EOF QUITE YET.
NTEMPT PUSH PSW ; SAVE CARRY (CARRY = 1 ===> EOF).
INR A ; INCREMENT BYTE POINTER/COUNTER.
DCX H
MOV M,A ; STORE UPDATED BYTE POINTER.COUNTER.
MOV E,A
MVI D,0 ; MAKE HIGH BYTE OF OFFSET INTO DATA BLOCK ZERO.
INX H
INX H
DAD D ; HL NOW POINTS TO DATA BYTE.
POP PSW ; RESTORE CARRY.
MOV A,M
JMP .POPHDB
;