Action unknown: copypageplugin__copy
plato:source:plaopl:pdisk
Table of Contents
PDISK
Table Of Contents
- [00005] DISK FLOPPY DISK ROUTINES
- [00006] COMMENTS
- [00139] DEFINITIONS
- [00162] DEFINE DISK ROUTINES
- [00210] DEFINE SUBROUTINES FOR DISK ROUTINES
- [00241] D.RDEF READ DISKETTE DEFINITION SECTOR
- [00309] EXIT ROUTINES
- [00352] F.INIX BEGIN EXECUTION
- [00406] F.JUMPO JUMP-OUT TO SPECIFIED LESSON
- [00468] F.OPEN OPEN DISK FILE
- [00612] F.READ / F.WRITE
- [00697] Y.DSKAD COMPUTE ABSOLUTE DISK ADDRESS
- [00794] ROUTINES
Source Code
- PDISK.txt
- 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
plato/source/plaopl/pdisk.txt ยท Last modified: 2023/08/05 18:54 by Site Administrator