PAGE * * ****************************************************** * * * ORG MARES SYSTEM RESIDENT AP1 EQU MARES STARTS HERE. * * * * * * * **** PTDOS SYSTEM ENTRY POINT **** * * * * SAVE REGISTERS AND DISPATCH TO OPERATION * * SYS DI . DISABLE INTERRUPTS FOR AWHILE SHLD UHL SAVE HL LXI H,0 SHLD WBUFSZ CLEAR LOCAL BUFFER FLAG DAD SP HL=SP LXI SP,UHL SET SYSTEM STACK POINTER PUSH D SAVE D,E PUSH B SAVE B,C PUSH PSW SAVE A,FLAGS PUSH H SAVE SP SPHL . RESTORE USER SP POP H GET RETURN ADDRESS MOV A,M INX H MOVE PAST IT PUSH H SAVE RETURN ADDR AGAIN STA OPER SAVE OPERATION LXI SP,UTOS RESTORE SP CALL TSTEI PUT THE INTERRUPTS BACK ON IF DESIRED * * VALIDATE OPERATION * LDA OPER GET OPERATION CPI MAXOP+1 JC SDISPT IF OK GO TO OPERATION * * ILLEGAL OPERATION * ERR0 CALL ERRL1 ILLEGAL OPERATION DB ILOER * * * DISPATCH TO OPERATION * * LOOK UP IN TABLE * SDISPT LXI H,DISPA DISPATCH ADDRESS MOV E,A MVI D,0 HL <--DISPA+(2*A) DAD D DAD D MOV A,M INX H MOV H,M MOV L,A * * HL NOW CONTAINS THE DISPATCH ADDRESS * PCHL . GO TO OPERATION * * * * SYSTEM DISPATCH TABLE * * DISPA DW CREATE 0 DW OPEN 1 DW KILL 2 DW READ 3 DW WRITE 4 DW SPACE 5 DW EOF 6 DW CLOSE 7 DW CHTYP 8 DW CHATR 9 DW CHNAM 10 DW FINFO 11 DW SUNH 12 DW RETURN 13 DW USRES 14 DW ABURP 15 DW SEEK 16 DW RNDOM 17 DW CA 18 CLOSE ALL FILES OPERATION DW FCTRL 19 DRIVER CONTROL/STATUS DW USRES 20 DW DREAD 21 DW DWRITE 22 DW DSPACE 23 DW RETRAP 24 * PAGE * * ***************************************** * * * * NORMAL RETURN * * RESTORE USER REGISTERS AND STACK * NRET CALL RFCB DI . NO INTERRUPTS THROUGH HERE LHLD UTOS SPHL POP H GET USER RETURN ADDRESS INX H INX H INX H PUSH H MAKE IT NORMAL RETURN * NRE10 DI . NO INTERRUPTS LHLD UHL PUSH H PUT USER HL ON USER STACK LXI SP,UPSW POP PSW RESTORE A,FLAGS POP B RESTORE BC POP D RESTORE DE * * FINAL RESTORATION * LHLD UTOS SPHL . RESET USER STACK POINTER DCX SP DCX SP MOVE BACK TO HL POP H RESTORE HL PUSH PSW CALL TSTEI RESTORE INTERRUPTS IF NEEDED POP PSW RET . GO BACK TO CALL * PAGE * * ***************************************** * * * ERROR RETURN * * LEVELS ARE: * * 0 VERY SERIOUS - BAD FILES, DISK PROBLEMS * 1 SERIOUS - USER PROBLEM * 2 EOF/BOF - ALWAYS HAPPEN * ERRL0 LHLD FERR GET PROCESSOR ADDRESS JMP ERRLP * * ERRL1 LHLD AERR GET LEVEL 1 PROCESSER JMP ERRLP * * ERRL2 LHLD EERR GET LEVEL 2 ERROR PROCESSER * * ERRLP - RESTORE FCB, RELEASE BUFFER, AND RECORD ERROR # * ERRLP DI . NO INTERRUPTS FOR A BIT PUSH H SAVE TYPE OF HANDLING CALL RFCB RESTORE FCB, IF ANY CALL RIDBF CLEAN UP BUFFER POP H ERROR HANDLING TYPE POP D POINTER TO ERROR NUMBER FROM CALL LDAX D = ERROR # STA UA RETURN IT TO THE HANDLER OR USER * * IF HL IS ZERO, SYSTEM PROCESSES ERROR * IF HL IS -1, USER ERROR RETURN, ELSE JUMP THERE * ERRP XCHG . TYPE LHLD UTOS RESTORE USERS STACK SPHL INX D MOV A,E ORA D JZ NRE10 USER ERROR RETURN DCX D MOV A,E ORA D JZ ERRP7 SYSTEM HANDLES IT * * CHANGE RETURN ADDRESS TO HL FOR ERROR TRAP * POP H GET RID OF OLD RETURN PUSH D PUT IN TRAP ADDRESS JMP NRE10 GO LOOK NORMAL * * * SYSTEM ERROR HANDLER, FORGET ABOUT USER PROGRAM * ERRP7 POP H GET RETURN ADDRESS IN HL LDA UTIL SEE IF A UTILITY FILE IS GOING INR A (-1 IF NOT) JNZ ERRP8 OK, USE IT LDA OPER MOV B,A GET OPERATION IN B LDA UA GET ERROR NUMBER IN A CALL SYS GO AWAY AND DON'T COME BACK DB ABTOP ABORT * * * * EXPLAIN THE ERROR USING UTILITY * ERRP8 LDA UA STA ERCD SET ERROR CODE (OPER ALREADY SET) LDA OPER STA EOPR SET OPERATION CODE * ERRPX PUSH H LXI H,XTRP TRAP ANY SERIOUS ERRORS SHLD AERR SHLD FERR POP H MVI A,3 (=> NUMBER AND "CALLER FROM" MSG.) JMP ERRP9 * PAGE * * ***************************************** * * * * * CREATE FILE OPERATION * * * USER DE POINTS TO A BLOCK WITH THE FOLLOWING FORM.... * * BYTE CONTENTS * 0 FILE TYPE * 1-2 FILE BLOCK SIZE * 3 FILE PROTECTION WORD * 4 ..... FILE NAME <0> OR NAME/UNIT # * * * ERRORS: * FILE ALREADY EXISTS * DIRECTORY FULL * MEMORY OVERFLOW * DISK FULL * ILLEGAL NAME * * FIRST, SEARCH DIRECTORY FOR FILE * CREATE LHLD UDE GET NAME POINTER LXI D,DEPRO-DETYP+1 DAD D CALL SDIR SEARCH JMP CRE10 NOT FOUND, OK CALL ERRL1 ERROR DB CER0 * * CHECK FOR FULL DIRECTORY * CRE10 LHLD DFC MOV A,L ORA H JZ CERR1 FREE PTR IS ZERO - ERROR * * CREATE A DIRECTORY ENTRY IN DEBUF * COPY CONSTANT PARAMETERS * LHLD UDE XCHG . PARAMETER PTR IN DE LXI H,DETYP BUFFER PTR IN HL CALL MOVEF MOVE USER PARAMETERS DB DEPRO-DETYP+1 * * ALLOCATE BUFFER FOR INITIAL BLOCK ALLOCATION * LHLD DEBBS SHLD FBLKS PUT BLOCK SIZE INTO FCB * * PICK SOMEWHERE FOR A BUFFER JUST USE ANYWHERE * LHLD LOWAD SHLD TBUFA SAVE ADDRESS * * ALLOCATE FILE ID * CALL GFID XCHG SHLD DEFID SAVE ID IN DIREC. ENTRY * * SETUP PSEUDO FCB FOR CALL TO AFBLK * SHLD FHID SAVE ID LXI H,EOFCD SET EOF SHLD FFORE LXI H,BOFCD AND BOF SHLD FBACK XRA A =0 STA FPRST SET NOT DIRTY * * ALLOCATE BLOCK * CALL AFBLK SHLD DEFBA SAVE FIRST BLOCK ADDR IN DIREC. LXI H,1 SHLD DENBL SET NUMBER OF BLOCKS TO 1 DCX H MAKE HL=0 SHLD DEINX SET NO INDEX * MAKE DIRECTORY ENTRY CALL EDIR JMP NRET RETURN TO USER * * CERR1 CALL ERRL1 DIRECTORY FULL DB CER1 * PAGE * * ***************************************** * * * * DELETE (KILL) FILE OPERATION * * * USER DE POINTS TO NAME * * ERRORS: * FILE DOES NOT EXIST * FILE IS DELETE-PROTECTED OR OPEN * MEMORY OVERFLOW * * KILL LHLD UDE CALL SDIR SEARCH DIRECTORY JMP KIL90 ERROR - NONEXISTENT * * CHECK FOR DELETE PROTECTION * LDA DEPRO ANI PDEL DEL. PROT. BIT JNZ EOFE0 ERROR - PROTECTED * * CHECK IF FILE IS OPEN * LHLD DEFID FILE ID SHLD FID SET SO RBLK WILL WORK CALL SFCBS JMP KIL91 FOUND, OPEN ERROR JMP KIL91 FOUND * LHLD DEBBS SHLD FBLKS SETUP BLOCK SIZE FOR DEALLOCATION XCHG CALL ALBUF GET A BUFFER SHLD TBUFA * CALL RDIR REMOVE DIREC ENTRY * * RELEASE DISK SPACE * LHLD DEFBA SHLD FCURSC NOW, DISK ADDR, ID, AND BLK SZ SET LXI H,DDRIV SET DRIVER SHLD FDRIV ADDRESS IN FCB XRA A =0 STA FFLAG SET NOT DIRTY CALL RBLK READ FIRST BLOCK * * RELEASE EACH BLOCK * KIL20 CALL RFBLK RELEASE CALL DDRNB READ NEXT BLOCK JMP KIL50 EOF, DONE JMP KIL20 * * RELEASE BUFFER * KIL50 LHLD FBLKS XCHG LHLD TBUFA CALL DLBUF RELEASE IT * * RELEASE FILE INDEX * LHLD DEINX GET INDEX POINTER MOV A,H ORA L JZ NRET NONE SHLD FCURSC SET ESECT TO RET MVI A,1 STA FPRST SECTOR COUNT IS 1 CALL RFBLK RELEASE BLOCK JMP NRET DONE * * KIL90 CALL ERRL1 NONEXISTENT DB DER0 KIL91 CALL ERRL1 FILE OPEN DB DER1 *