********************* * * * MOVE DATA * * COME HERE WITH LOCAL COUNT IN DE, GLOBAL IN HL * MBLK CALL COMP JNC RWP52 DE => HL, USE GLOBAL COUNT XCHG . USE LOCAL COUNT * RWP52 CALL CKDEL CHECK FOR DELIMITER MOV B,H MOV C,L COUNT IN BC * LHLD UDE UPDATE NUMBERS DAD B SHLD UDE SOU/DEST ADDRESS LHLD UBC CALL RWPS SHLD UBC USER COUNT LHLD LCNT CALL RWPS SHLD LCNT LOCAL COUNT LHLD FNBD DAD B SHLD FNBD NBD * LHLD SOU XCHG . DE HAS SOURCE LHLD DEST HL HAS DESTINATION JMP MOVEV BC HAS COUNT, MOVE AND RETURN * ********************* * * * CHECK FOR DELIMITER * * SET FLAG IF FOUND * HL = COUNT * RETURN, HL = POSSIBLY REDUCED COUNT, DELFG SET * CKDEL LDA DELFG ORA A SEE IF CHECKING FOR DELIMITERS AT ALL RZ . NO PUSH H XCHG LHLD SOU HL -> DATA, DE = MAX COUNT * * LOOP FOR END OF COUNT OR DELIMITER * CKD20 MOV A,D TEST IF OUT OF COUNT ORA E JZ CKD30 * DCX D ACCOUNT FOR THIS ONE LDA UL = DELIMITER CMP M JZ CKD50 FOUND! INX H JMP CKD20 LOOP * * END OF COUNT... NOT FOUND * CKD30 POP H RESTORE COUNT RET * * * FOUND, COMPUTE UPDATED COUNT * CKD50 POP H MOV B,D MOV C,E DECREMENTED COUNT IN BC CALL RWPS HL=HL-BC MVI A,1 STA DELFG SET FLAG RET . ALL SET * PAGE * * ******************************************* * * * * * READ SINGLE BYTE OPERATION * * "A" HAS THE FILE NUMBER * * THIS OPERATION USES THE USER STACK. THE * STANDARD ENTRY AND EXIT ROUTINES ARE NOT USED. * * ERRORS: * ILLEGAL FILE NUMBER * PROTECTED FILE * EOF * RB CALL RWPREP SAVE A BUNCH OF JUNK AND PREPARE CALL PROTST CHECK IF PROTECTED DB PREA * JMP RER0 ERROR - PROTECTED CALL PBUF PREPARE BUFFER * * CHECK IF BUFFER EMPTY * LHLD FNBD XCHG LHLD FBDL BBD BDL CALL COMP COMPARE DE HL JC RB50 NBD LT BDL, OK * * FILL BUFFER * LHLD FBLKS CALL RDNB JMP RBEOF * * LOAD BYTE AND UPDATE NBD * RB50 CALL UPNBD GET THE BUFFER ADDRESS AND COUNT UP MOV A,M STA UA SAVE BYTE CALL RBUF RELEASE BUFFER CALL RFCB RESTORE FCB LDA UA RETURN WITH BYTE IN A * * * EVERYONE COMES HERE FOR CALL+2 * RETURN THROUGH HL * RP2 POP H RP3 INX H INX H INX H PCHL . NORMAL RETURN * * * PROTECTED * RER0 CALL ERRL1 DB PER0 * ********************* * * * PREPARE FOR READS AND WRITES * RWPREP STA UA SAVE FILE NUMBER IN USER A MOV A,B STA UB WRITE USES THIS LXI H,0 SHLD WBUFSZ CLEAR DANGLING BUFFER FLAG DAD SP INX H INX H SHLD UTOS SET UTOS FOR ERRORS JMP PFCB PREPARE FCB AND RETURN * * * UDATE NEXT BYTE DISPLACEMENT AND RETURN BUFFER ADDRESS * UPNBD LHLD FNBD GET NEXT BYTE DISPLACEMENT INX H BUMP IT FOR THIS BYTE SHLD FNBD DCX H ADJUST COUNT TO POINT TO CURRENT POSITION XCHG LHLD TBUFA DAD D HL = NBD + BUFF ADDRESS RET * PAGE * * ******************************************* * * * * * WRITE SINGLE BYTE OPERATION * * A HAS THE FILE NUMBER * B HAS THE BYTE * * * ON RETURN, * A,B ARE UNCHANGED * * THIS OPERATION USES THE USER STACK. STANDARD ENTRY, * EXIT, AND ERROR ROUTINES ARE NOT USED * * ERRORS: * ILLEGAL FILE NUMBER * PROTECTED FILE * DISK FULL * * * WB CALL RWPREP PREPARE EVERYTHING CALL PROTST CHECK PROTECTION DB PWRI JMP RER0 ERROR - PROTECTED CALL PBUF PREPARE BUFFER * * CHECK FOR FULL BLOCK * LHLD FNBD XCHG LHLD FBLKS NBD BLOCK SIZE CALL COMP COMPARE DE HL JC WB50 NBD LT BLOCKSIZE CALL WDBR BUFFER IS FULL...WRITE IT * * STORE BYTE, UPDATE NBD * WB50 CALL UPNBD LDA UB MOV M,A STORE BYTE MVI A,1 STA FFLAG SET DIRTY * * UPDATE BDL IF NECESSARY * INX D LHLD FBDL DE HAS NBD CALL COMP JC WB60 NBD LT BDL, LEAVE BDL ALONE XCHG SHLD FBDL UPDATE BOL * * FINISH UP * WB60 CALL FDB FLUSH BUFFER IF DEVICE FILE CALL RBUF RESTORE BUFFER CALL RFCB RESTORE FCB LDA UB MOV B,A SET B LDA UA RESTORE A JMP RP2 * PAGE * * ******************************************* * * * * * MOVE FILE POINTER OPERATION (SPACE) * * UA HAS FILE NUMBER * UBC HAS DELTA VALUE * UD= 0 FOR REWIND * -1 FOR SPACE-TO-END * 1 FOR SPACE FOREWARD * 200(8) FOR SPACE BACKWARDS * UL DELIMITER IF DSPACE * * * ERRORS: * ILLEGAL FILE NUMBER * EOF/BOF * * * DELIMITER SPACE ENTRY * DSPACE MVI A,-1 JMP SPA01 * * * STANDARD SPACE ENTRY * SPACE XRA A SPA01 STA DELFG SETUP DELIMITER SCAN FLAG CALL PFCB PREPARE FCB CALL PBUF PREPARE BUFFER CALL WDBUF FLUSH OUT ANYTHING LDA UD ORA A LOOK AT OPTIONS JNZ SPA20 NOT REWIND * * D=0...REWIND FILE * LHLD FBLKS GET BLOCK SIZE XCHG LHLD TBUFA DE=COUNT, HL->BUFFER CALL DVBR DO THE REWIND DB DTREW * SHLD FBDL GOOD, SET BDL FROM HEADER COUNT LXI H,0 SHLD FNBD JMP SPA80 * ********************* * * * (PART OF DISK INTERFACE) COME HERE TO REWIND DISK FILE * DDREW LHLD FCURSC CURRENT SECTOR AND TRACK XCHG LHLD FFBA FIRST SECTOR AND TRACK CALL COMP CHECK IF CORRECT BLOCK IS IN JZ REW10 YES SHLD FCURSC SET AS CURRENT SECTOR CALL RBLK PRIME WITH FIRST BLOCK RET . HL HAS COUNT IN SECTOR * * * CURRENT BLOCK IS IN * REW10 LHLD FBDL RETURN SIZE RET * * * SPACE FORWARD OR BACKWARD * SPA20 JP SPAF (S)HE WANTS FOREWARD INR A JNZ SPAB (S)HE WANTS BACKWARDS * * MOVE TO EOF * SPA22 LHLD FBLKS CALL RDNB READ NEXT BLOCK JMP SPA25 EOF JMP SPA22 TRY AGAIN * * SPA25 LHLD FBDL SHLD FNBD SET NBD=BDL JMP SPA80 GO QUIT * * * SPACE FOREWARD * SPAF LHLD FNBD XCHG . DE HAS NBD LHLD FBDL HL HAS BDL CALL ARITH HL=HL-DE XCHG . DE HAS BDL-NBD CALL UPCNT GET MAXIMUM COUNT TO HL PUSH H LHLD TBUFA COMPUTE -> DATA XCHG LHLD FNBD DAD D -> DATA SHLD SOU SET DATA SOURCE POINTER POP H GET BACK COUNT * * IF DELIMITED, DO PRESCAN FOR DELIMITER * CALL CKDEL FIND NEW COUNT IF DELIMITED XCHG . DE HAS MIN OF USER, LOCAL CNT. LHLD FNBD DAD D SHLD FNBD UPDATE NBD LHLD UBC CALL ARITH HL=HL-DE= NEW USER COUNT SHLD UBC UPDATE USER COUNT * * TEST FOR ZERO COUNT OR DELIMITER * ORA L "A" HAS "H" FROM ARITH JZ SPA80 YES, GO QUIT * LDA DELFG CHECK IF DELIMITER SEEN DCR A JZ SPA80 YES, GO QUIT * * NO, MOVE TO NEXT BLOCK * CALL RDNB MOVE TO NEXT JMP SEOF EOF JMP SPAF * ********************* * * * FIND MIN OF UBC, AND DE INTO HL * UPCNT LHLD UBC CALL COMP RNC . HL GE DE XCHG . DE LT HL RET * ********************* * * SPACE REVERSE * SPAB LHLD FNBD SPABX XCHG . DE HAS NBD LHLD UBC CALL UPCNT HL GETS MIN OF DE,HL * * HL = MAX COUNT, THIS BUFFER * SCAN BACKWARD FOR DEL * LDA DELFG ORA A JZ SPA69 NO DELIMITER TO LOOK FOR, SKIP THIS JUNK * * CHECK FOR DELIMITER BACKWARDS * PUSH H MOV B,H MOV C,L BC = MAX COUNT LHLD TBUFA XCHG LHLD FNBD DAD D HL -> BUFFER END (NEXT CHAR) * SPA60 MOV A,B ORA C CHECK FOR ZERO COUNT JZ SPA63 YES, END OF BUFFER, NOT FOUND DCX H LDA UL = DELIMITER CMP M DCX B JNZ SPA60 TRY AGAIN INX B RESTORE THE COUNT * * FOUND THE DELIMITER...TIME TO QUIT * SPA65 POP H CALL RWPS HL = HL - BC MVI A,1 STA DELFG SET DELIM FOUND FLAG * * UPDATE NBD * SPA69 XCHG . BUFFER ADDRESS TO DE LHLD FNBD OLD BUFFER DISPLACEMENT CALL ARITH HL=HL-DE SHLD FNBD * * UPDATE USER COUNT (UBC) * LHLD UBC CALL ARITH HL=HL-DE SHLD UBC ORA L IS COUNT ZERO? A HAS H FROM ARITH JZ SPA80 YES, GO QUIT * LDA DELFG DCR A JNZ SPA81 DELIMITER NOT FOUND * * DONE, END OF COUNT OR DELIMITER FOUND * SPA80 CALL RBUF RELEASE BUFFER JMP NRET * * * READ LAST SECTOR * SPA81 LHLD FBLKS XCHG LHLD TBUFA CALL DVBR READ LAST BLOCK DB DTRLB * JMP SEOF EOF SHLD FBDL SET SIZE SHLD FNBD AND PTR TO END JMP SPABX CONTINUE * * * NOT FOUND IN THIS BUFFER * SPA63 POP H JMP SPA69 MAKE LIKE NOTHING HAPPENED * * * EOF * SEOF CALL RBUF CALL ERRL2 ERROR DB EER0 * EOFER EQU SEOF RBEOF EQU SEOF * PAGE * * ******************************************* * * * * * CLOSE FILE OPERATION * * UA HAS FILE NUMBER * THE FCB IS RELEASED * * ERRORS: * ILLEGAL FILE NUMBER * * * CLOSE LDA UA GET FILE NUMBER LXI H,SYSFIL CMP M JC NRET OK, IT'S DONE BUT NOT SO!!! CALL PFCB CALL CLOSIT CLOSE THE FILE JMP NRET DONE * ********************* * * * CLOSE FILE SUBROUTINE * * COME HERE WITH CURRENT FCB SET * CLOSIT CALL CLBUF CLOSE BUFFER LHLD FDLTA MOV A,H ORA L NO CHANGE... NOT NEEDED JZ CLO30 LHLD FID CALL SDIRX SEARCH DIRECTORY BY ID * * UPDATE FILE SIZE * LHLD DBUF LXI D,DENBL-DEBUF DISPLACEMENT TO SIZE DAD D XCHG LHLD FDLTA GET NUMBER BLOCKS ALLOCATED LDAX D ADD L UPDATE STAX D FILE INX D SIZE LDAX D IN ADC H BLOCKS STAX D CALL WDSK REWRITE DIRECTORY * CLO30 LXI H,0 SHLD FID RELEASE THE FILE CONTROL BLOCK RET * ********************* * * * WRITE DIRTY BLOCK AND DEALLOCATE BUFFER * CLBUF LHLD FBUFA INX H MOV A,H ORA L RZ . UNBUFFERED, NOTHING TO DO DCX H SHLD TBUFA SET TBUFA FOR UTILITIES CALL WDBUF FLUSH BUFFER CALL DVBR TAKE CLOSE DRIVER DB DTCLO ENTRY * * COME HERE TO JUST RELEASE BUFFER * CLBUX LHLD FBUFA INX H MOV A,H ORA L RZ . UNBUFFERED, QUIT DCX H XCHG . DE HAS BUFFER ADDRESS LHLD MINAD HL HAS BOTTOM OF SYS GLOBAL CALL COMP RC . DE LT HL, USER BUFFER LXI H,SYSTOP NOW TOP OF SYSTEM CALL COMP RNC . DE GT HL USER BUFFER * * RELEASE BUFFER * LHLD FBLKS XCHG . DE HAS SIZE, HL HAS ADDRESS CALL DLBUF DEALLOCATE BUFFER RET * PAGE * * ******************************************* * * * * CLOSE MULTIPLE FILES * * UA = UNIT #<0-254> CLOSE ALL ON UNIT SPECIFIED * = 255 CLOSE ALL OPEN FILES * * ERRORS: NONE OTHER THAN DISK * * CA MVI A,0 STA CLCNT COUNT UP FROM ZERO THROUGH FCB'S LHLD FCBASE START AT FIRST FCB * * LOOP HERE WITH NEXT FCB (PNTR ON TOS) * CA20 PUSH H SAVE FCB POINTER * * SEE IF FILE # < SYSFIL * LXI H,SYSFIL LDA CLCNT CMP M IS FILE# < SYSFIL? JC CA50 YES, SKIP POP H PUSH H RESTORE HL * * CHECK FILE ID FOR A OPEN FILE FCB (REAL? OOOBOY) * LXI D,FID-FCBORG DAD D MOVE TO FID BYTES MOV A,M INX H ORA M CHECK IF ID=0 JZ CA50 YES, SKIP IT * * CHECK IF DESIRED UNIT * LXI D,FUNIT-FID-1 DAD D MOVE TO UNIT NUMBER LDA UA CPI 255 CLOSE ALL JZ CA30 YES CMP M CHECK IF THIS UNIT JNZ CA50 NOT THE ONE, LEAVE OPEN * * CLOSE CURRENT FILE * CA30 POP H GET POINTER TO FCB PUSH H CALL PFC6 SETUP FCB CALL CLOSIT CLOSE THE FILE CALL RFCB RESTORE FCB * * MOVE TO NEXT FILE * CA50 LXI H,CLCNT --> COUNTER INR M COUNT UP LDA NFCB = # OF FCB'S CMP M HAVE WE DONE EM ALL? JZ NRET YES, DONE * * STILL MORE * POP H LXI D,LNFCB DAD D MOVE TO NEXT FILE JMP CA20 AND LOOP * PAGE * * ******************************************* * * * * ENDFILE OPERATION * * UA HAS FILE NUMBER * * ERRORS: * ILLEGAL FILE NUMBER * PROTECTED FILE * * EOF CALL PFCB PREPARE FCB CALL PROTST DB PWRI JMP RER0 ERROR - PROTECTED FILE CALL PBUF PREPARE BUFFER LHLD FNBD SHLD FBDL SET BDL TO CURRENT POINTER XCHG LHLD TBUFA DE=CT, HL=BUF CALL DVBR CALL DRIVER DB DTEOF * EOF1A CALL WDB50 CLEAR THE DIRTY FLAG CALL RBUF RELEASE BUFFER JMP NRET RETURN * ********************* * * * DISK FILE CLOSE (PART OF DISK INTERFACE) * DDEOF LHLD FID CALL SFCBS JMP RER0 OPEN MORE THAN ONCE, ERROR JMP EOF10 OPEN ONCE, OK * EOF10 LHLD FFORE SHLD ETMP SAVE FORE PTR LHLD FNBD SHLD FBDL SET BDL,ALSO MOV A,H ORI 128 SET HIGH BIT MOV H,A SHLD FFORE SET EOF AND BYTE COUNT LHLD FCURSC SHLD ECRS SAVE CURRENT SECTOR CALL WBLK WRITE BLOCK * * RELEASE ALL BLOCKS PAST THIS ONE * LHLD ETMP SHLD FFORE RESTORE FORE PTR * EOF20 CALL DDRNB MOVE TO NEXT BLOCK JMP EOF50 EOF, DONE CALL RFBLK RELEASE BLOCK JMP EOF20 MOVE TO NEXT * * EOF50 LHLD FINDX GET INDEX FILE MOV A,H IS THERE AN INDEX ORA L JZ EOF60 NO, DONE CALL RBUF RELEASE BUFFER CALL RFCB YES,RESTRE FCB, THEN JMP RNDOM UPDATE INDEX * * EOF60 LHLD FCURSC TEST IF AT CORRECT BLOCK XCHG LHLD ECRS CALL COMP JZ EOF70 DON'T READ SHLD FCURSC CALL RBLK RESTORE CURRENT BLOCK SHLD FBDL SET BDL * EOF70 LHLD FBDL SHLD FNBD SET NBD JMP EOF1A * * EOFE0 EQU RER0 PROTECTED FILE * *