PDISK * /--- FILE TYPE = E * /--- BLOCK DISK 00 000 81/04/22 15.45 IDENT DISK TITLE DISK FLOPPY DISK ROUTINES TITLE COMMENTS * * **************************************************** * * * * ASSUMED CONSTANTS - 16 SECTORS/SPACE * - 128 BYTES/PHYSICAL SECTOR * * * DEFINITION SECTOR (ABSOLUTE SECTOR 0) * BYTES 00-09 DF.LABL *DEFINITION* * 10 DF.TYPE DISKETTE TYPE * 11-12 DF.DSP DIRECTORY SPACE NUMBER * 13 DF.DNSP NUMBER DIRECTORY SPACES * 14 DF.DTRK DIRECTORY 1ST TRACK NUMBER * 15 DF.DSEC DIRECTORY 1ST SECTOR NUMBER * 16 DF.ST SECTORS / TRACK * 17 DF.TD TRACKS / DISKETTE * 18-19 DF.SPD SPACES / DISKETTE * 20-21 DF.SSP SYSTEM FILE SPACE NUMBER * 22 DF.SNSP NUMBER SYSTEM FILE SPACES * 23 DF.STRK SYS FILE 1ST TRACK NUMBER * 24 DF.SSEC SYS FILE 1ST SECTOR NUMBER * 25-34 DF.BLSN BOOTSTRAP LESSON NAME * 35 DF.INSP NUMBER INTERP FILE SPACES * 36 DF.REL DISKETTE RELEASE LEVEL * 37 DF.YEAR DISKETTE START YEAR * 38 DF.MON DISKETTE START MONTH * 39 DF.DAY DISKETTE START DAY * 40 DF.PUB PUBLISHED DISKETTE FLAG(S) * 41 DF.SS SECTORS PER SPACE * 42-51 DF.PART PART NUMBER * 52-61 DF.SNUM SERIAL NUMBER * 62-63 DF.RPAS READ PASSWORD * 64-65 DF.WPAS WRITE PASSWORD * 66 DF.CSUM INTERPRETER CHECKSUM * 67-125 (UNUSED) * 126-127 DF.DCHK CHECK CHANGED DISK * * * DISKETTE DIRECTORY * BYTES 00-09 DD.LABL *DIRECTORY* * 10-19 DD.NAM DISKETTE NAME * 20-31 UNUSED * 32 DD.NFNS NUM FILE NAME TABLE SECTORS * 33 DD.HFNS HIGHEST FILE NAME SECT USED * 34-47 UNUSED * 48-127 DD.SRT SPACE RESERVATION TABLE * * * FILE NAME TABLE ENTRY * BYTES 00-19 FN.NAM FILE NAME * 20 FN.TYPE FILE TYPE * 21-22 FN.SPAC STARTING SPACE NUMBER * 23 FN.NSPC NUMBER SPACES * 24-31 FN.INF UNIQUE BY FILE TYPE * (32) FN.LTH LENGTH OF NAME TABLE ENTRY * * /--- BLOCK DISK 00 000 81/04/22 15.52 * * SYSTEM FILE (SYSTEMB) * SECTOR 00 SF.SCOS SCORE/COMPLETION INFO SECTOR * BYTES 00-01 SF.SCOR CURRENT SCORE * 02-03 SF.LDON LESSON COMPLETION INFO * 04-127 UNUSED * * SECTOR 01 SF.ERPS ERROR LOG POINTER SECTOR * BYTES 00 SF.ERRP CURRENT ERROR LOG POINTER * * SECTOR 02-09 SF.ERRS EXECUTION ERROR LOG * * * FILE INFORMATION PACKAGE * BYTES 00-01 FI.SECT LOGICAL SECTOR * 02 FI.NSEC NUMBER SECTORS * 03-04 FI.ADDR BUFFER ADDRESS * 05 FI.UNIT UNIT NUMBER * 06-25 FI.NAM FILE NAME * 26 FI.TYPE FILE TYPE * 27-28 FI.SPAC STARTING SPACE NUMBER * 29 FI.NSPC NUMBER SPACES * 30-36 FI.INF UNIQUE BY FILE TYPE * 37 FI.PUB PUBLISHED FILE FLAG(S) * (38) FI.LTH LENGTH OF FILE INFO PACKAGE * * *FI.INF* FOR LESSON BINARY * BYTES 00 LI.DSEC NUMBER DIRECTORY SECTORS * 01 LI.CSEC MAXIMUM CHARSET SECTORS * 02-03 LI.VARS NUMBER USER VARIABLE BYTES * * * LESSON BINARY DIRECTORY * BYTES 00 LD.NUN NUMBER UNITS * 01 LD.ISTU NUMBER OF UNIT TO JUMPOUT TO * 02 LD.NNAS NUM UNIT NAME TABLE SECTORS * 03 LD.YEAR LESSON LAST-COPY YEAR * 04 LD.MON LESSON LAST-COPY MONTH * 05 LD.DAY LESSON LAST-COPY DAY * 06-07 LD.OBTS OBTAIN TABLE FIRST SECTOR * 08 LD.OBTL OBTAIN TABLE SECTOR COUNT * 09-10 LD.OFRS OFFER TABLE FIRST SECTOR * 11 LD.OFRL OFFER TABLE SECTOR COUNT * 12 LD.INTU FIRST NON-OBTAINED UNIT * 13-15 UNUSED * 16-XX LD.UTAB UNIT LOCATION/LENGTH TABLE * * * /--- BLOCK DISK 00 000 80/09/14 19.47 * * * F.OPEN H,L = ADDRESS OF FIP * F.CLOSE H,L = ADDRESS OF FIP * F.READ H,L = ADDRESS OF FIP * F.WRITE H,L = ADDRESS OF FIP * * ERROR RETURN CODES * * DP.ERR = 1 = READ ERROR * 2 = WRITE ERROR * 3 = MASTER-CLEAR ERROR * 4 = TIME-OUT * 5 = FILE NOT FOUND * 6 = DUPLICATE FILE NAME * 7 = ILLEGAL PARAMETER * 8 = INSUFFICIENT DISK SPACE * 9 = DISKETTE FORMAT BAD * 10 = DATA SUM-CHECK ERROR * 11 = SEEK ERROR * * * **************************************************** * /--- BLOCK DEFINITION 00 000 81/09/02 09.07 TITLE DEFINITIONS * CODE D SET ASSEMBLER TO DISPLAY CODE * EXT COMPHL,MOVEB,ZEROB,DIVBCDE,MULDEHL EXT PPTTUT,PURGALL,LESERR,DSKERR,TVARS,UBUFFA EXT ISTRAM,LIBLOAD,V EXT ZEROB,ALLOC * ENTRY IINTERP,D.VDEF,D.RDEF,D.CLEAR,D.READ ENTRY D.WRITE,F.JUMPO,D.RCID,D.CLOCK ENTRY F.LESSN,F.OPEN,F.READ,F.WRITE ENTRY F.FNTS,Y.INIX1,F.FILEL,SETRAM * * CST * *CALL DXTEXT * * * /--- BLOCK D.ENTRIES 00 000 81/07/06 19.52 TITLE DEFINE DISK ROUTINES LIST G * * * * * * D.CLEAR MASTER-CLEAR DISK * ON ENTRY - DP.UNIT = DISK UNIT NUMBER * D.CLEAR D.CLEAR DEFINE D.CLEAR ROUTINE * * * * * * D.RCID READ CONTROLLER ID * ON EXIT - A = DP.CID = CONTROLLER ID BYTE * = 0 = NO RESPONSE FROM CONTROLLER * D.RCID D.RCID DEFINE D.RCID ROUTINE * D.CLOCK READ THE CLOCK VALUE * EXIT HL = CURRENT CLOCK VALUE. * = 0 IF AN ERROR OCCURRED. D.CLOCK D.CLOCK * * * * * * D.READ READ DISK * ON ENTRY - DP.UNIT = DISK UNIT NUMBER * DP.TRAK = TRACK * DP.SECT = LOGICAL SECTOR * DP.NUM = NUMBER SECTORS TO READ * DP.ADDR = BUFFER ADDRESS * D.READ D.READ DEFINE D.READ ROUTINE * * * * * * D.WRITE WRITE DISK * ON ENTRY - DP.UNIT = DISK UNIT NUMBER * DP.TRAK = TRACK * DP.SECT = LOGICAL SECTOR * DP.NUM = NUMBER SECTORS TO WRITE * DP.ADDR = BUFFER ADDRESS * D.WRITE D.WRITE DEFINE D.WRITE ROUTINE * * /--- BLOCK DS.SUBR 00 000 81/01/22 18.47 TITLE DEFINE SUBROUTINES FOR DISK ROUTINES * * * * + + SINC INCREMENT TRACK+SECTOR ADDRESS * ON ENTRY - DP.TRAK = TRACK * DP.SECT = SECTOR * * + + RLIGHT BLINK RED ERROR INDICATOR * DS.SUBR DEFINE DISK SUBROUTINES * * * * + + SETTS SET TRACK/SECTOR * ON ENTRY - D.TRACK = TRACK * D.SECT = SECTOR * DS.SUBS DEFINE DISK SUBROUTINES * * * * + + WAITI WAIT OPERATION INITIATED * * + + WAITC WAIT OPERATION COMPLETE * DS.WAIT DEFINE WAIT SUBROUTINES * LIST * * * /--- BLOCK D.RDEF 00 000 81/07/06 19.51 TITLE D.RDEF READ DISKETTE DEFINITION SECTOR * * * * D.RDEF READ DISKETTE DEFINITION SECTOR * ON EXIT - A = NON-ZERO IF ERROR OCCURRED * DF.BUFF = DEFINITION PARAMETERS * F.BUFF = DEFINITION SECTOR * D.RDEF XOR A A = 0 LD (DF.BUFF+DF.LABL),A PRE-CLEAR LABEL LD (DP.UNIT),A SET UNIT NUMBER LD (DP.TRAK),A SET TRACK NUMBER LD A,1 LD (DP.SECT),A SET SECTOR NUMBER LD (DP.NUM),A SET NUMBER SECTORS * * INITIALIZE DISK CONTROLLER * CALL D.RCID READ CONTROLLER ID JR Z,XRD190 JUMP IF NO CONTROLLER REPLY * * /--- BLOCK D.RDEF 00 000 81/07/06 20.18 * * READ AND VERIFY DEFINITION SECTOR * LD HL,F.BUFF LD (DP.ADDR),HL SET BUFFER ADDRESS LD A,26 PRE-SET SECTORS/TRACK = 26 LD (DF.BUFF+DF.ST),A CALL D.READ READ DEFINITION SECTOR JR NZ,XRD190 LD DE,F.BUFF D,E = *FROM* ADDRESS FOR MOVE LD HL,DF.BUFF H,L = *TO* ADDRESS FOR MOVE LD BC,DF.LTH B,C = LENGTH CALL MOVEB MOVE DISKETTE DEFINITION CALL D.VDEF VERIFY DEFINITION RET Z * XRD190 LD A,26 RE-SET SECTORS/TRACK = 26 LD (DF.BUFF+DF.ST),A JR ERR9 * * * * D.VDEF VERIFY DEFINITION SECTOR * CHECKS DEFINITION SECTOR LABEL CORRECT * ON EXIT - A = NON-ZERO IF ERROR OCCURRED * D.VDEF LD HL,DF.BUFF+DF.LABL H,L = ADDR OF LABEL LD BC,XVLABL D,E = ADDR OF CORRECT LABEL * XVD120 LD A,(BC) LOAD NEXT BYTE OF LABEL AND A RET Z EXIT IF END OF LABEL (A=0) LD D,(HL) LOAD NEXT BYTE OF LABEL SUB D JR NZ,ERR9 JUMP IF DID NOT VERIFY INC HL INC BC ADVANCE INDEXES JR XVD120 * * XVLABL DEFB '7D'7,'7E'7,'7F'7 VFD 8/0 * * * /--- BLOCK EXITS 00 000 80/03/24 17.56 TITLE EXIT ROUTINES * * * ERR1 LD A,1 1 = READ ERROR JR ERRSET * ERR2 LD A,2 2 = WRITE ERROR JR ERRSET * ERR3 LD A,3 3 = MASTER-CLEAR ERROR JR ERRSET * ERR4 LD A,4 4 = TIME-OUT JR ERRSET * ERR5 LD A,5 5 = FILE NOT FOUND JR ERRSET * * 6 = DUPLICATE FILE NAME * ERR7 LD A,7 7 = ILLEGAL PARAMETER JR ERRSET * * 8 = INSUFFICIENT DISK SPACE * ERR9 LD A,9 9 = DISKETTE FORMAT BAD JR ERRSET * ERR10 LD A,10 10 = DATA SUM-CHECK ERROR JR ERRSET * * 11 = SEEK ERROR * * ERRSET LD (DP.ERR),A SET ERROR CODE * DISKRET LD A,(DP.ERR) GET DISK ERROR FLAG AND A RET EXIT * * * /--- BLOCK F.INIX 00 000 81/07/07 17.37 TITLE F.INIX BEGIN EXECUTION * * * * F.INIX * INITIALIZES INTERPRETER AND INITIATES EXECUTION OF * BOOTSTRAP (ROUTER) LESSON IN OFF-LINE MODE * IINTERP DEFS 0 * * PRE-ZERO /PPTCOM/ * LD HL,PPTCOM H,L = ADDRESS OF /PPTCOM/ LD DE,PPTCOML D,E = LENGTH OF /PPTCOM/ LD B,0 B = 0 * IX220 LD (HL),B ZERO NEXT BYTE OF COMMON INC HL ADVANCE MEMORY ADDRESS DEC DE DECREMENT BYTE COUNT LD A,D OR E END TEST JR NZ,IX220 * * INITIALIZE INTERPRETER VARIABLES * LD A,77O LD (UNCCHR),A PLANT UNCOVER CODES FOR FORMAT LD (LSTCHAR+1),A LD HL,-1 LD (ZSCORE),HL INITIALIZE *ZSCORE* = -1 LD HL,0 LD (TVARS),HL FLAG VARIABLE ADDR NOT SET LD (M.HALT),HL CLEAR HALT REQUEST FLAG ADD HL,SP SAVE ENTRY VALUE OF STACK PTR LD (XSP),HL * * READ DISKETTE DEFINITION SECTOR * CALL D.RDEF INITIALIZE DEFINITION SECTOR JP NZ,LESERR CHECK IF ERROR OCCURRED * CHECK MICRO-PLATO RELEASE LEVEL CORRECT * LD A,(V+2) LOAD INTERPRETER RELEASE LEVEL LD B,A LD A,(F.BUFF+DF.REL) DISKETTE RELEASE LEVEL SUB B JP NZ,DSKERR CHECK IF INCORRECT LEVEL * Y.INIX1 LD A,1 MARK IN OFF-LINE STATE LD (RMODE),A LD HL,DF.BUFF+DF.BLSN H,L = ADDR LESSON NAME * * * /--- BLOCK F.JUMPO 00 000 81/07/06 19.52 TITLE F.JUMPO JUMP-OUT TO SPECIFIED LESSON * * * * F.JUMPO JUMP-OUT TO SPECIFIED LESSON * ON ENTRY - H,L = ADDRESS OF LESSON NAME * F.JUMPO PUSH HL PUSH ADDRESS OF LESSON NAME CALL PURGALL DELETE ALL UNITS * SET *TVARS* TO 0 SO *LIBLOAD* WILL DO INITIALIZATIONS. LD HL,0 LD (TVARS),HL * * INITIALIZE CHARSET POINTERS * LD HL,M2ADD SET ADDRESS OF M2 CHARACTERS LD (TMCHR2),HL LD HL,M3ADD SET ADDRESS OF M3 CHARACTERS LD (TMCHR3),HL * INITIALIZE THE STACK AND UNIT BUFFER POINTERS SO * SPACE CAN BE ALLOCATED FOR LIBRARY BUFFERS. LD HL,M2ADD LD (TOS),HL CALL SETRAM RETURN WITH HL = 5300 LD (BUFBEG),HL * ALLOCATE SPACE FOR LIBRARY RESOLUTION BUFFERS. * THIS IS DONE SO THE *XLESS* OVERLAY IS LOADED * LOWER IN MEMORY THAN THE BUFFERS AND DOESNT HAVE * TO MOVE WHEN IT ALLOCATES THE BUFFERS. * THE NUMBER OF SECTORS *B.SECTS* COMES FROM THE * EQUATE OF THE SAME NAME IN THE *XLESSN* OVERLAY. B.SECTS EQU 64 LD A,B.SECTS NUM. SECTORS USED BY XLESSN CALL ALLOC LD (BUFBEG),HL * * WE ZERO THE MEMORY LOCATION POINTED TO BY *BUFBEG* * SO THAT WHEN *LIBLOAD* CALLS *FINDU*, IT WILL NOT * FIND ANY UNITS IN MEMORY. XOR A LD (HL),A LD A,SYSLN SYSTEM LESSON NUMBER LD (L.NUM),A LD A,ZXLESSN OVERLAY NUMBER LD (UNUM),A LD (OVRLAYU),A LD HL,0 CALL LIBLOAD LOAD LIBRARY OVERLAY JP NZ,DSKERR JP (HL) EXECUTE LIBRARY OVERLAY * * * /--- BLOCK F.OPEN 00 000 81/07/06 19.52 TITLE F.OPEN OPEN DISK FILE * * * * F.OPEN OPEN SPECIFIED FILE * ON ENTRY - H,L = ADDR OF FIP * ON EXIT - FIP = FILE INFORMATION * F.OPEN LD DE,FI.NAM GET BIAS TO FILE NAME ADD HL,DE ADD TO FIP ADDRESS LD (FIPADR),HL CALL IDEF INSURE DEFINITION SECTOR VALID RET NZ * * DETERMINE DISK UNIT NUMBER * LD HL,(FIPADR) LOAD ADDRESS OF FILE NAME DEC HL BACK UP TO DISK UNIT NUMBER LD A,(HL) AND A JP M,FOP110 IF NEGATIVE DISK UNIT NUMBER LD (DP.UNIT),A SET DISK UNIT NUMBER AND 376O JP NZ,ERR7 CHECK IF LEGAL DISK UNIT NUMBER JR FOP200 * FOP110 CP -2 JR NZ,FOP120 IF DISK UNIT .NE. -2 * * SEARCH DEFAULT DRIVE (NUMBER 0) ONLY. * XOR A LD (DP.UNIT),A CALL FOP200 RET NZ EXIT IF ERROR OCCURRED JR FOP130 * * SEARCH FOR FILE ON BOTH DISK UNITS (UNIT 0 FIRST) * FOP120 XOR A SEARCH DISK UNIT 0 LD (DP.UNIT),A CALL FOP200 ATTEMPT TO OPEN FILE ON UNIT 0 JR Z,FOP130 LD A,1 SEARCH DISK UNIT 1 LD (DP.UNIT),A CALL FOP200 ATTEMPT TO OPEN FILE ON UNIT 1 RET NZ EXIT IF ERROR OCCURRED * FOP130 LD HL,(FIPADR) GET ADDRESS OF FILE NAME IN FIP DEC HL BACK-UP TO DISK UNIT NUMBER LD A,(DP.UNIT) LD (HL),A SET DISK UNIT NUMBER IN FIP XOR A A = 0 RET * * /--- BLOCK F.OPEN 00 000 81/07/06 19.52 * * READ 1ST SECTOR OF DISKETTE DIRECTORY * FOP200 CALL READDIR READ 1ST SECTOR OF DIRECTORY RET NZ * * * * F.FNTS SEARCH FILE NAME TABLE * ON ENTRY - F.BUFF = 1ST SECTOR OF DIRECTORY * DP.UNIT = UNIT NUMBER * DP.TRAK = DIRECTORY TRACK NUMBER * FIPADR = ADDRESS OF FIP * ON EXIT - FIP = FILE INFORMATION * FADDR = ADDR OF FILE NAME TABLE ENTRY * FSECT = NAME TABLE SECTOR NUMBER * F.FNTS DEFS 0 * * SEARCH FILE NAME SECTORS FOR SPECIFIED FILE * LD A,(F.BUFF+DD.HFNS) LD (FNSECT),A SET NUM FILE NAME SECTORS+1 LD A,(F.BUFF+DD.NFNS) LD (FMSECT),A SET MAXIMUM SECTOR NUMBER LD A,(DF.BUFF+DF.DSEC) INC A SET STARTING SECTOR NUMBER LD (FSECT),A * * READ NEXT SECTOR * FOP220 LD A,(FSECT) SET SECTOR NUMBER LD (DP.SECT),A LD A,1 SET NUMBER SECTORS TO READ LD (DP.NUM),A LD HL,F.BUFF SET BUFFER ADDRESS LD (DP.ADDR),HL CALL D.READ READ NEXT SECTOR RET NZ EXIT IF ERROR OCCURRED * * /--- BLOCK F.OPEN 00 000 78/07/09 16.35 * * SEARCH CURRENT SECTOR * LD HL,F.BUFF INITIALIZE ADDRESS LD (FADDR),HL EX DE,HL D,E = ADDRESS IN SECTOR BUFFER LD B,FN.FNS B = NUMBER NAMES/SECTOR * FOP240 LD HL,(FIPADR) GET ADDRESS OF FILE INFO LD C,21 C = NUM CHARS TO COMPARE * FOP242 LD A,(DE) COMPARE NEXT CHARACTER SUB (HL) JR NZ,FOP244 INC HL ADVANCE CHARACTER POINTERS INC DE DEC C NAME END TEST JR NZ,FOP242 LD HL,(FADDR) GET ADDRESS OF FILE NAME/INFO EX DE,HL D,E = *FROM* ADDRESS FOR MOVE LD HL,(FIPADR) H,L = *TO* ADDRESS FOR MOVE LD BC,FN.LTH B,C = LENGTH TO MOVE CALL MOVEB EXTRACT FILE INFORMATION JP DISKRET * FOP244 LD HL,(FADDR) INCREMENT ADDRESS LD DE,FN.LTH ADD HL,DE ADVANCE TO NEXT FILE NAME LD (FADDR),HL EX DE,HL D,E = ADDRESS IN SECTOR BUFFER DEC B SECTOR END TEST JR NZ,FOP240 LD A,(FNSECT) DEC A CHECK IF LAST SECTOR JP Z,ERR5 EXIT IF FILE NOT FOUND JP M,ERR5 LD (FNSECT),A DECREMENT SECTOR COUNT LD A,(FSECT) LOAD CURRENT SECTOR ADDRESS INC A ADVANCE SECTOR ADDRESS LD (FSECT),A LD B,A LD A,(FMSECT) LOAD MAXIMUM SECTOR NUMBER CP B JP M,ERR5 EXIT IF FILE NOT FOUND JP FOP220 READ NEXT SECTOR * * /--- BLOCK F.READ 00 000 81/07/06 19.53 TITLE F.READ / F.WRITE * * * * F.READ READ SPECIFIED FILE * F.WRITE WRITE SPECIFIED FILE * ON ENTRY - H,L = ADDRESS OF FIP * ON EXIT - A = NON-ZERO IF ERROR OCCURRED * F.READ CALL RWSET INITIALIZE FOR READ RET NZ CALL D.READ READ DISK RET * F.WRITE CALL RWSET INITIALIZE FOR WRITE RET NZ CALL D.WRITE WRITE DISK RET * * * * RWSET INITIALIZE FOR FILE READ/WRITE * ON ENTRY - H,L = ADDRESS OF FIP * ON EXIT - A = NON-ZERO IF BOUNDS ERROR * DP.UNIT = DISK UNIT NUMBER * DP.TRAK = ABSOLUTE TRACK NUMBER * DP.SECT = ABSOLUTE SECTOR NUMBER * DP.NUM = NUMBER SECTORS TO READ/WRITE * DP.ADDR = BUFFER ADDRESS * RWSET LD (FIPADR),HL SET ADDRESS OF FIP XOR A A = 0 LD (DP.ERR),A CLEAR DISK ERROR CODE LD DE,FI.ADDR ADD HL,DE H,L = ADDRESS OF BUFFER ADDRESS LD E,(HL) INC HL LD D,(HL) D,E = BUFFER ADDRESS EX DE,HL LD (DP.ADDR),HL SET BUFFER ADDRESS LD HL,(FIPADR) H,L = ADDRESS OF FIP CALL F.FILEL COMPUTE FILE LENGTH IN SECTORS CALL COMPHL H,L = -FILE LENGTH LD (FNSECT),HL SAVE COMP OF LENGTH * * /--- BLOCK F.READ 00 000 80/03/15 19.33 * LD HL,(FIPADR) LD D,H D,E = ADDRESS OF FIP LD E,L LD BC,FI.UNIT BIAS TO DISK UNIT NUMBER ADD HL,BC H,L = ADDRESS OF DISK UNIT NUM LD A,(HL) LD (DP.UNIT),A SET DISK UNIT NUMBER LD HL,FI.SECT BIAS TO LOGICAL SECTOR ADD HL,DE H,L = ADDR OF LOGICAL SECTOR LD C,(HL) INC HL LD B,(HL) B,C = LOGICAL SECTOR LD A,370O AND B CHECK SECTOR NUMBER REASONABLE JP NZ,ERR7 LD HL,FI.NSEC BIAS TO NUMBER SECTORS ADD HL,DE LD D,0 LD E,(HL) D,E = NUMBER SECTORS LD A,E AND A CHECK SECTOR COUNT PRESENT JP Z,ERR7 LD (DP.NUM),A SET NUMBER SECTORS EX DE,HL ADD HL,BC COMPUTE ENDING SECTOR NUMBER DEC HL EX DE,HL LD HL,(FNSECT) RETRIEVE COMPLEMENT OF LENGTH ADD HL,DE LD A,H CHECK TRANSFER LEGAL AND A JP P,ERR7 ERROR EXIT IF ILLEGAL TRANSFER CALL Y.DSKAD COMPUTE DISK ADDRESS XOR A A = 0 RET * * * /--- BLOCK Y.DSKAD 00 000 81/07/06 20.20 TITLE Y.DSKAD COMPUTE ABSOLUTE DISK ADDRESS * * * * Y.DSKAD * COMPUTE ABSOLUTE TRACK+SECTOR FROM SPACE NUMBER * AND LOGICAL SECTOR * * PERFORMS THE FOLLOWING CALCULATION - * TEMP=SPACE*(SECTORS/SPACE) * TEMP=TEMP+LOGICAL SECTOR * DP.TRAK=INT(TEMP/(SECTORS/TRACK)) * DP.SECT=TEMP-TEMP*(SECTORS/TRACK) * * ON ENTRY - FIPADR = ADDRESS OF FIP * ON EXIT - DP.TRAK = ABSOLUTE TRACK NUMBER * DP.SECT = ABSOLUTE SECTOR NUMBER * Y.DSKAD LD HL,(FIPADR) GET ADDRESS OF FIP LD DE,FI.SPAC ADD HL,DE H,L = ADDRESS OF SPACE NUMBER LD D,(HL) INC HL LD E,(HL) D,E = SPACE NUMBER CALL MSPSSP COMPUTE SECTORS*SECTORS/SPACE EX DE,HL D,E = SECTOR NUMBER LD HL,(FIPADR) LOAD ADDRESS OF FIP LD BC,FI.SECT ADD HL,BC H,L = ADDRESS OF SECTOR NUMBER LD C,(HL) INC HL LD B,(HL) B,C = LOGICAL SECTOR EX DE,HL ADD HL,BC H,L = SECTOR REL TO DISKETTE PUSH HL SAVE RELATIVE SECTOR IN STACK LD B,H LD C,L B,C = RELATIVE SECTOR LD A,(DF.BUFF+DF.ST) LD D,0 LD E,A D,E = PHYSICAL SECTORS/TRACK CALL DIVBCDE COMPUTE TRACK NUMBER LD A,C LD (DP.TRAK),A SET TRACK NUMBER LD D,B LD E,C D,E = TRACK NUMBER * * /--- BLOCK Y.DSKAD 00 000 80/10/01 18.27 * LD HL,(DF.BUFF+DF.ST) LD H,0 H,L = SECTORS/TRACK CALL MULDEHL COMPUTE TRACK*SECTORS/TRACK EX DE,HL CALL COMPHL COMPLEMENT BASE SECTOR NUMBER EX DE,HL D,E = -BASE SECTOR POP HL RETRIEVE REL SECTOR FROM STACK ADD HL,DE COMPUTE SECTOR WITHIN TRACK LD A,L INC A ADJUST TO START AT SECTOR 1 LD (DP.SECT),A SET SECTOR NUMBER RET * * * * F.FILEL RETURN FILE LENGTH IN SECTORS * ON ENTRY - H,L = ADDRESS OF FIP * ON EXIT - H,L = FILE LENGTH IN SECTORS * F.FILEL LD DE,FI.NSPC BIAS TO NUMBER FILE SPACES ADD HL,DE H,L = ADDRESS OF NUMBER SPACES LD D,0 LD E,(HL) D,E = NUMBER OF SPACES * MSPIF IFEQ DC.SS,13 MSPSSP LD H,D COPY SPACE NUMBER TO H,L LD L,E ADD HL,DE H,L = 2*SPACE ADD HL,HL H,L = 4*SPACE LD B,H LD C,L B,C = 4*SPACE ADD HL,HL H,L = 8*SPACE ADD HL,BC H,L = 12*SPACE ADD HL,DE H,L = 13*SPACE = SECTOR RET MSPIF ENDIF * MSPIF IFEQ DC.SS,16 MSPSSP LD H,D COPY SPACE NUMBER TO H,L LD L,E ADD HL,DE H,L = 2*SPACE ADD HL,HL H,L = 4*SPACE ADD HL,HL H,L = 8*SPACE ADD HL,HL H,L = 16*SPACE = SECTOR RET MSPIF ENDIF * * * /--- BLOCK ROUTINES 00 000 80/08/24 15.41 TITLE ROUTINES * * * * READDIR READ 1ST SECTOR OF DIRECTORY * ON ENTRY - DP.UNIT = UNIT NUMBER * ON EXIT - A = NON-ZERO IF ERROR OCCURRED * F.BUFF = 1ST SECTOR * READDIR CALL SETDIR SET TO READ DIRECTORY CALL D.READ READ 1ST SECTOR RET * * * * SETDIR SET TO READ/WRITE DIRECTORY * ON EXIT - DP.TRAK = DIRECTORY 1ST TRACK NUMBER * DP.SECT = DIRECTORY 1ST SECTOR NUMBER * DP.ADDR = ADDRESS OF F.BUFF * DP.NUM = 1 * SETDIR LD A,(DF.BUFF+DF.DTRK) LD (DP.TRAK),A SET DIRECTORY TRACK LD A,(DF.BUFF+DF.DSEC) LD (DP.SECT),A SET DIRECTORY SECTOR LD A,1 LD (DP.NUM),A SET NUMBER SECTORS TO READ LD HL,F.BUFF LD (DP.ADDR),HL SET BUFFER ADDRESS RET * * * * IDEF INITIALIZE DEFINITION SECTOR * ON EXIT - A = NON-ZERO IF ERROR OCCURRED * IDEF CALL D.VDEF VERIFY DEFINITION SECTOR RET Z EXIT IF INTACT CALL D.RDEF READ DEFINITION SECTOR RET * * /--- BLOCK ROUTINES 00 000 80/09/23 17.55 * * * * SETRAM SET LWA OF USEABLE RAM * ON EXIT - H,L = LWA OF USEABLE RAM * USES - A,H,L * SETRAM LD HL,ISTRAM GET FWA OF INTERPRETER RAM RET * * /--- BLOCK END 00 000 81/07/06 19.54 * * F.LESSN JP LESERR * * END