|
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: 5120 (0x1400) Types: TextFile Names: »BYTOT.SRC«
└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80) └─ ⟦this⟧ »BYTOT.SRC«
;PUTS BYTE IN FILE DESCRIPTOR ; NAME BYTOT ENTRY BYTOT,BLKOT,NAMERR,DERR EXT SELDSK,POPHDB,PERROR,PUSHBD INCLUDE DEFLT.SRC ; ; ;BYTE OUT PUTS THE BYTE PASSED IN A IN THE FILE DESCRIPTOR ;POINTED TO BY HL. REGISTER F IS DESTOYED. BYTOT CALL PUSHBD ;SAVE ALL REGISTERS EXCEPT A MOV A,C ; BYTE TO WRITE ===> A LXI D,BYTPT DAD D ;BYTE COUNTER INR M JNZ NTFULL ; FALL THROUGH IF BUFFER IS FULL. ;BLKOT WRITES A 256 BYTE BLOCK WHOSE FILE DESCRIPTOR IS POINTED ;TO BY HL - BYTPT. IT DESTROYS DE, BC, F. ;IF LSBYT IS FF THE BLOCK IS NOT WRITTEN. IN ANY EVENT, LSBYT IS SET TO ;ZERO. LSBYT SERVES AS A FLAG FOR THE VERY FIRST BYTOT DONE TO A FILE. BLKOT: PUSH PSW PUSH H ;BYTE COUNTER LXI D,-BYTPT-3 DAD D ;'FLAGS' BYTE BIT 4,M ;'RANDOMLY ACCESSED' BIT JZ BLKOT1 ;FILE NOT RANDOMLY ACCESSED IF NOT COMPILER ;COMPILER DOESN'T USE DIRECT ACCESS ;FILE HAS BEEN RANDOMLY ACCESSED. BUFFER IS REFILLED WHEN FULL BY ;RANDOMLY WRITING THE TWO 128 BYTE BLOCKS TO THE FILE AND RANDOMLY ;READING THE NEXT TWO BLOCKS INTO THE BUFFER. ; WRITE SECOND BUFFER FIRST INX H INX H INX H PUSH H ;FCB CALL SELDSK LXI D,DATAB+128 DAD D ;FIRST BYTE FOR OUTPUT XCHG MVI C,26 ;CODE TO SET DMA CALL CPM POP D PUSH D ;SAVE FCB ADDRESS MVI C,SETRAN-2 ;WRITE RANDOM,128 BYTES FROM BUFFER CALL CPM POP H ;FILE CONTROL BLOCK PUSH H ;WRITE FIRST 128-BYTE BLOCK FROM BUFFER LXI D,RANREC DAD D ;LOW BYTE OF BLOCK NUMBER DCR M ;SUBTRACT ONE FOR PREVIOUS BLOCK MOV A,M INR A ;CHECK FOR A BORROW JRNZ W2SETB ;NO BORROW INX H ;HIGH BYTE DCR M MOV A,M INR A ;CHECK FOR A BORROW JRNZ W2SETB ;NO BORROW INX H ;OVERFLOW BYTE DCR M W2SETB: POP H PUSH H ;SAVE FCB LXI D,DATAB ;FIRST FREE BYTE DAD D XCHG MVI C,26 ;SET DMA FOR FIRST BLOCK CALL CPM POP D ;FCB PUSH D MVI C,SETRAN-2 ;RANDOM WRITE CALL CPM ;READ FIRST BLOCK FROM FILE INTO BUFFER POP D PUSH D ;FCB LXI H,RANREC-1 DAD D ;SET CURRENT RECORD TO ZERO MVI M,0 LXI H,DATAB DAD D ;FIRST BYTE FOR INPUT XCHG MVI C,26 ;CODE TO SET DMA CALL CPM POP H ;FCB PUSH H DCX H ;SECOND 'FLAGS' BYTE BIT 0,M ;WRITING FIRST RECORD? RES 0,M ;RESET FLAG LXI D,RANREC+1 DAD D ;LOW BYTE OF BLOCK NUMBER JRZ W2SETC ;NOT WRITING FIRST RECORD MOV M,A ;READ BLOCKS ZERO AND ONE INX H XRA A MOV M,A INX H MOV M,A JR R2SETA W2SETC: INR M ;ADD TWO FOR NEXT BLOCK TO READ INR M MOV A,M CPI 2 JRNC R2SETA ;NO CARRY INX H ;HIGH BYTE INR M JRNZ R2SETA ;NO CARRY INX H ;OVERFLOW BYTE INR M R2SETA: POP D ;FILE CONTROL BLOCK PUSH D MVI C,SETRAN-3 ;READ RANDOM,128 BYTES INTO BUFFER CALL CPM POP H ;FILE CONTROL BLOCK PUSH H ;READ SECOND 128-BYTE BLOCK INTO BUFFER LXI D,RANREC DAD D ;LOW BYTE OF BLOCK NUMBER INR M ;ADD TWO FOR NEXT BLOCK TO READ JRNZ R2SETB ;NO CARRY INX H ;HIGH BYTE INR M JRNZ R2SETB ;NO CARRY INX H ;OVERFLOW BYTE INR M R2SETB: POP D ;FILE CONTROL BLOCK PUSH D LXI H,RANREC-1 DAD D MVI M,0 ;SET CURRENT RECORD TO ZERO POP D PUSH D LXI H,DATAB+128 ;FIRST FREE BYTE DAD D XCHG MVI C,26 ;SET DMA FOR SECOND BLOCK CALL CPM POP D ;FCB PUSH D MVI C,SETRAN-3 ;RANDOM READ CALL CPM ;SET BYTE POINTER POP H ;FCB LXI D,BYTPT ;BUFFER BYTE POINTER/COUNTER DAD D MVI M,0 ;SET BYTE COUNT TO ZERO LXI D,-BYTPT+RANREC-1 DAD D ;CURRENT RECORD BYTE MVI M,0 ;SET CURRENT RECORD TO ZERO POP H POP PSW JMP NTFULL ENDIF ; ;WRITE BLOCK FOR NON-RANDOMLY ACCESSED FILES BLKOT1: LXI D,LSBYT+3 DAD D ; LSBYT BYTE MOV A,M MVI M,0 ; SET LSBYT TO ZERO. INR A ; TEST LSBYT FOR FF JRZ FIRSTC ; BRANCH IF THIS IS FROM THE FIRST CALL OF BYTOT. LXI D,FCB-LSBYT DAD D ; HL NOW POINTS TO FCB. CALL SELDSK ; SELECT PROPER DRIVE. PUSH H LXI D,DATAB DAD D ; HL NOW POINTS TO START OF DATA BUFFER. XCHG MVI C,26 ; CP/M CODE TO SET DMA ADDRESS. CALL CPM POP H PUSH H XCHG MVI C,21 ; CP/M CODE TO WRITE A SECTOR. CALL CPM ORA A ; TEST FOR ERROR CODE. JRNZ DERR POP H PUSH H LXI D,128+DATAB DAD D ; HL NOW POINTS TO SECOND HALF OF DATA BUFFER. XCHG MVI C,26 ; CP/M CODE TO SET DMA ADDRESS. CALL CPM POP H XCHG MVI C,21 ; CP/M CODE TO WRITE A SECTOR. CALL CPM ORA A JRNZ DERR FIRSTC POP H POP PSW NTFULL MOV E,M MVI D,0 DAD D INX H INX H ; HL NOW POINTS TO LOCATION FOR NEW BYTE. MOV M,A ; STORE BYTE IN FILE DESCRIPTOR. JMP POPHDB ;THIS DIAGONOSES THE TYPE OF DISK WRITE ERROR. DERR LXI H,UNKERR ;DEFAULT ERROR MESSAGE. CPI 1 ;TEST FOR ERROR IN EXTENDING FILE. JRNZ NTEXTR LXI H,EXTERR NTEXTR CPI 2 ; TEST FOR DISK FULL JRNZ NTDFUL LXI H,FULERR NTDFUL CPI 255 ; TEST FOR DIRECTORY FULL JRNZ NTDIRF LXI H,DIRERR NTDIRF JMP PERROR UNKERR DB 'Disk erro','r'+80H ; FOR UNDEFINED ERROR CODES. EXTERR DB 'Error in extending fil','e'+80H FULERR DB 'Disk ful','l'+80H DIRERR DB 'Directory ful','l'+80H NAMERR IF NOT COMPILER ;compiler doesn't need this DB 'Bad filename',CR,LF+80H ENDIF ; «eof»