|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 3328 (0xd00) Types: TextFile Names: »BYTIN.SRC«
└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80) └─ ⟦this⟧ »BYTIN.SRC«
;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 CALL 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 CALL 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 CALL 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 CALL 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. CALL CPM POP H PUSH H LXI D,FCB-LSBYT DAD D XCHG MVI C,20 ; CP/M CODE FOR READ SECTOR. CALL 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. CALL 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. CALL 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 ; «eof»