CALL ADOUT CALL BLK1 POP H INX H RET FLSTO LHLD FREAD XCHG DIRECT POINTER IN D,E LXI H,FBUF FILE NAME POINTER IN H,L PUSH D MVI C,NMLEN NAME LENGTH COUNT MOV23 MOV A,M STAX D INX D DCR C TEST COUNT INX H JNZ MOV23 POP D RESTORE ENTRY PTR, MAKE CURRENT RET * SEARCH THE FILE DIRECTORY FOR THE FILE * WHOSE NAME IS IN FBUF. * RETURN IF FOUND, ZERO IS OFF, H,L POINT TO * ENTRY WHILE SEARCHING. ON ENTRY FOUND WITH ADDR * ZERO, SET FEF TO # 0 AND FREAD TO THE ADDR OF ENTRY. * FSEA LXI D,FILE0 TABLE ADDRESS XRA A STA FEF CLAIM NO FREE ENTRIES MVI B,MAXFIL COUNT OF ENTRIES FSE10 LXI H,FBUF MVI C,NMLEN CALL SEAR TEST STRINGS PUSH PSW SAVE FLAG PUSH D LDAX D GET BOFP ORA A EMPTY ENTRY? JNZ FSE20 INX D TEST OTHER WORD LDAX D ORA A JNZ FSE20 NOPE-GO TEST FOR MATCH XCHG H,L GET MIDDLE OF FREE ENTRY LXI D,-NMLEN-1 DAD D MOVE TO BEGINNING SHLD FREAD SAVE ADDR MOV A,D STA FEF SET FREE ENTRY FOUND POP H RESTORE INTERIM PTR POP PSW UNJUNK STACK * MOVE TO NEXT ENTRY FSE15 LXI D,FELEN-NMLEN DAD D XCHG NEXT ENTRY ADDR IN DE DCR B TEST COUNT RZ DONE---NOPE JMP FSE10 TRY NEXT * ENTRY WASN'T FREE, TEST FOR MATCH FSE20 POP H POP PSW JNZ FSE15 IF ZERO CLEAR, NO MATCH * ENTRY FOUND LXI D,-NMLEN BACKUP DAD D H,L POINTS TO ENTRY MOV A,D ORA A CLEAR ZERO RET THATS ALL * * THIS ROUTINE SETS THE FORMAT CONTROL ON FORM CMA NON ZERO FOR ACC NFORM STA LFMT SET THE FORMAT SWITCH JMP EORMS * * THIS ROUT INE CHECKS THE CURRENT FILE FOR PROPER * FORMAT. THAT IS THE END OF EACH LINE HAS A CR AND THE LINE * COUNT IS WITHIN RANGE * FCHK LHLD BOFP MOV A,H CHECK FOR CURRENT FILE ORA L JZ TESTM * GET COUNT FOR FIRST LINE, LOOK FOR CR LXI B,4 DAD B INR C FCHK1 INX H INR C CALL TERCK CMP C JC FLERR MOV A,M CPI ASCR JNZ FCHK1 LHLD BOFP MOV M,C * SCAN TO CHECK EACH LINE IS IN CORRECT FORMAT FCHK2 MOV A,M GET NEXT CHARACTER CPI 1 EOF JZ FCHK3 CPI 6 MINIMUM LINE COUNT JC FLERR CALL TERCK CMP M MOV C,M DCR C CHRCK DCR C CHECK CHARACTERS IN FILES INX H MOV A,M JZ EOLCK THIS LINE IS FINISHED CPI 20H NO CONTRL CHRS JC FLERR JMP CHRCK EOLCK CPI ASCR INX H JZ FCHK2 * FOUND ERROR, OUTPUT MESSAGE FLERR XCHG ADDRESS TO D,E CALL BLK1 CALL ADOUT LXI H,EMES3 JMP MESS * FOUND END OF FILE, GET MAXIMUM LINE NUMBER FCHK3 CALL DELF JMP FOUT TERCK LDA TERMW ADI 80-IBUF81+IBUFP RET * * * MOVE FILE COMMAND * FMOV CALL VCHK CHECK FOR PARAMETERS LHLD BOFP GET OLD START OF FILE XCHG TO D AND E LHLD BBUF NEW BOFP TO H AND L SHLD BOFP NEW DIRECTORY ENTRY MOV A,L SUB E MOV A,H SBB D JC FLMOV IF OLD IS GREATER THAN NEW * * MOVE FILE TO RIGHT FROM END TO START * FRMOV LHLD EOFP GET OLD END OF FILE MOV A,L SUB E MOV C,A MOV A,H SBB D MOV B,A LHLD BOFP GET NEW START OF FILE DAD B POINT TO END XCHG GET OLD START IN H,L MVI M,2 PUT IN TERMINATOR MOV C,M C NEEDS TI TOO LHLD EOFP NOW WE HAVE WHERE TO GET IT FROMJ XCHG CALL RMOV JMP FDONE * * MOVE FILE FROM START TO END DOWN IN MEMORY * FLMOV MVI C,1 TERMINATIOR CALL LMOV MOVE IT FDONE MOV M,C JMP FCHK GO CHECK RESULTS AND UPDATE EOFP * * RENUMBER FILES * RNUM CALL VCHK LDA ABUF+7 MVI B,5 ORA A JZ RNEW+1 LXI B,ABUF+7 CALL ADEC JC WHAT MOV A,L CPI 26 NO MORE THAN 25 ALLOWED JNC WHAT DON'T LIKE BIG NUMBERS RNEW MOV B,A LHLD BOFP GET WHERE TO START SHLD APNT RNSTO MOV A,M GET RECORD LENGTH CPI 1 JZ FCHK GOCHECK FILE INX H POINT TO LINE NUMBER LXI D,ABUF MVI C,4 RSTI LDAX D MOV M,A PUT IT IN THE FILE INX H INX D DCR C MORE TO COME JNZ RSTI * * LHLD APNT RESET POINTER MOV A,M CALL ADR SHLD APNT DCX H MOV A,M CPI 0DH JNZ FLERR * * LXI H,ABUF+3 RDIG MOV A,M ADD B NEW LINE NUMBER RCPR CPI 3AH A CARRY JNC RUNDO MOV M,A OK--STORE IT * * TEST TO 9900 * LDA ABUF GET TOP COUNT CPI 39H 9000 CNC TEST2 RSTZ LHLD APNT OVER AGAIN JMP RNSTO TEST2 MVI B,1 RET * RUNDO MVI C,0 RDWN INR C SUI 10 CPI '9'+1 JNC RDWN MOV M,A DCX H MOV A,M ADD C JMP RCPR * * * * * OUTPUT ERROR MESSAGE FOR ILLEGAL COMMAND * WHAT LXI H,EMES MESSAGE ADDRESS MESS CALL CRLF * SWITCH BACK TO STANDARD SYSTEM DRIVERS WHA1 PUSH H LXI H,SYSIN CALL IODR+3 POP H CALL SCRN JMP EORST * EMES DB 'W','H','A','T',63 DB 13 CARRIAGE RETURN EMES1 DB 'F','U','L','L',13 EMES2 DB 'F','C','O','N',13 EMES3 DB ' ','F','I','L','E',' ','E','R','R',13 * * ENTS CALL CRLF CALL READ READ NEXT LINE LXI H,IBUF SET BUFFER ADDRESS SHLD PNTR SET LINE POINTER ENT1 CALL ZBUF CLEAR WORKING BUFFER CALL SBLK SCAN TO NEXT ENTRY JC ENTS FOUND CR? CPI '/' TERMINATOR? RZ CALL ALPS PLACE IN BUFFER XCHG LXI B,ABUF LDA SMODE GET INPUT MODE ORA A JNZ ENT2 CALL AHEX JMP ENT3 ENT2 CALL AOCT ENT3 RC RETURN IF ERROR LDAX D GETCH NEXT CHARACTER CPI ':' ADDRESS? JZ ENT4 MOV A,L LHLD BBUF GET MEMORY ADDRESS MOV M,A STORE VALUE CALL ACH1 INCREMENT ADDRESS JMP ENT1 * PROCESS INPUT ADDRESS ENT4 SHLD BBUF STORE NEW ADDRESS XCHG INX H SHLD PNTR JMP ENT1 * * * * THIS ROUTINE IS USED TO ENTER LINES INTO THE FILE * AREA. THE LINE NUMBER IS FIRST CHECKED TO SEE IF IT IS * A VALID NUMBER (0000-9999). NEXT IT IS CHECKED TO SEE IF IT IS * GREATER THAN THE MAXIMUM CURRENT LINE NUMBER. IF IT IS THE NEW * LINE IS INSERTED AT THE END OF THE CURRENT FILE AND THE MAXIMUM * LINE NUMBER IS UPDATED AS WELL AS THE END OF FILE POSITION * LINE NUMBERS THAT ALREADY EXIST ARE INSERTED INTO THE FILE AREA * AT THE APPROPRIATE PLACE AND ANY EXTRA CHARACTERS IN THE OLD * LINE ARE DELETED * LINE CPI '0' JC WHAT LXI H,3030H GET ASCII 00 SHLD IBUF-4 SET LEADING ZEROS SHLD IBUF-2 LXI H,IBUF-1 STARTING ADDRESS MVI C,4 LINE NUMBER COUNT LICK INX H MOV A,M NEXT LINE NUMBER CHARACTER CPI '0' JC LINE1 CPI '9'+1 JNC LINE1 DCR C JNZ LICK INX H MOV A,M LINE1 CPI ' ' BLANK AFTER LINE NUMBER MOV B,C DCX H JZ LINE3 * PLACE BLANK AFTER LINE NUMBER INR C MOV B,C MVI C,4 MVI A,' ' LINE2 MOV D,M MOV M,A MOVE LINE NUMBER DOWN MOV A,D DCX H DCR C JNZ LINE2 MOV M,A MOV C,B LINE3 LXI H,IBUF LINE4 DCX H SET STARTING ADDRESS DCR C JP LINE4 SHLD SAVL SAVE STARTING ADDRESS LDA CCNT GET LINE COUNT ADD B MODIFY STA CCNT CPI 7 JZ LINE5 MOV M,A STORE AT START OF LINE LXI D,4 DAD D SHLD ADDS LXI D,MAXL+3 SET ADDRESS CALL COM0 JNC INSR * GET HERE IF NEW LINE IS GREATER THAN MAXIMUM LN