home *** CD-ROM | disk | FTP | other *** search
- % JSR TOGGLE├LOCK
- % JSR SERIAL╫AIT
- % LDX CIA─ATA
- % JSR TOGGLE├LOCK
- % TXA
- % STA ERRNO
- % AND #$0F
- % CMP #2
- % CLI
- % RTS
- %
-
- ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
- RATHER THAN WITH HARDWARE.
-
- % ;====LOGICAL SECTOR LEVEL====
- %
-
- ╔NVALIDATE THE TRACK CACHE IF THE ═╙-─╧╙ DRIVE NUMBER IS CHANGED OR IF A NEW
- DISK IS INSERTED. ╘HIS ROUTINE HAS TO ESTABLISH A ╥┴═ CONFIGURATION OF $0┼
- SINCE IT WILL BE CALLED FROM ╥┴═0. ├ONFIGURATION $0┼ GIVES ╥┴═0 FROM $0000 TO
- $┬╞╞╞, ╦ERNAL ╥╧═ FROM $├000 TO $╞╞╞╞, AND THE ╔/╧ SPACE OVER THE ╦ERNAL FROM
- $─000 TO $─╞╞╞. ╘HIS CONFIGURATION IS SET BY ALL APPLICATION INTERFACE
- SUBROUTINES.
-
- % INIT╨ACKAGE = *
- % LDA #$0E
- % STA $FF00
- % LDA #$FF
- % STA BUF├YLINDER
- % STA BUF╙IDE
- % LDX #7
- % - STA DIR─IRTY,X
- % DEX
- % BPL -
- % STA FAT─IRTY
- % CLC
- % RTS
- %
-
- ╠OCATE A SECTOR (BLOCK) IN THE TRACK CACHE, OR READ THE CORRESPONDING PHYSICAL
- TRACK INTO THE TRACK CACHE IF NECESSARY. ╘HIS ROUTINE ACCEPTS THE CYLINDER,
- SIDE, AND SECTOR NUMBERS OF THE BLOCK.
-
- % SECTOR╙AVE = 5
- %
- % READ┬LOCK = * ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
-
- ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
-
- % CMP BUF├YLINDER
- % BNE READ┬LOCK╨HYSICAL
- % CPX BUF╙IDE
- % BNE READ┬LOCK╨HYSICAL
-
- ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
-
- % DEY
- % TYA
- % ASL
- % CLC
- % ADC #>TRACKBUF
- % TAY
- % LDA #<TRACKBUF
- % CLC
- % RTS
- %
-
- ╚ERE, WE HAVE TO READ THE PHYSICAL TRACK INTO THE TRACK CACHE. ╫E SAVE THE
- INPUT PARAMETERS AND CALL THE HARDWARE-LEVEL TRACK-READING ROUTINE.
-
- % READ┬LOCK╨HYSICAL = *
- % STA BUF├YLINDER
- % STX BUF╙IDE
- % STY SECTOR╙AVE
- % JSR READ╘RACK
-
- ├HECK FOR ERRORS.
-
- % BCC READ┬LOCK╨HYSICAL╧K
- % LDA ERRNO
- % AND #$0F
- % CMP #11 ;DISK CHANGE
- % BEQ +
- % SEC
- % RTS
-
- ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
- TRY TO READ THE PHYSICAL TRACK AGAIN.
-
- % + JSR MOUNT─ISK
- % LDA BUF├YLINDER
- % LDX BUF╙IDE
- % LDY SECTOR╙AVE
- % BCC READ┬LOCK╨HYSICAL
- % RTS
- %
-
- ╚ERE, THE PHYSICAL TRACK HAS BEEN READ INTO THE TRACK CACHE OK, SO WE RECOVER
- THE ORIGINAL INPUT PARAMETERS AND TRY THE TOP OF THE ROUTINE AGAIN.
-
- % READ┬LOCK╨HYSICAL╧K = *
- % LDA BUF├YLINDER
- % LDX BUF╙IDE
- % LDY SECTOR╙AVE
- % JMP READ┬LOCK
- %
-
- ─IVIDE THE GIVEN NUMBER BY 18. ╘HIS IS NEEDED FOR THE CALCULATIONS TO CONVERT
- A LOGICAL SECTOR NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER, SIDE, AND
- SECTOR NUMBERS THAT THE LOWER-LEVEL ROUTINES REQUIRE. ╘HE METHOD OF REPEATED
- SUBTRACTION IS USED. ╘HIS ROUTINE WOULD PROBABLY WORK FASTER IF WE TRIED TO
- REPEATEDLY SUBTRACT 360 (18*20) AT THE TOP, BUT ╔ DIDN'T BOTHER.
-
- % DIVIDE┬Y18 = * ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
- % ;** COULD REPEATEDLY SUBTRACT 360 HERE
- % LDX #$FF
- % - INX
- % SEC
- % SBC #18
- % BCS -
- % DEY
- % BPL -
- % CLC
- % ADC #18
- % INY
- % TAY
- % TXA
- % RTS
- %
-
- ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
- SIDE, AND SECTOR NUMBERS. ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN IN THE
- PREVIOUS ARTICLE WITH A FEW SIMPLIFYING TRICKS.
-
- % CONVERT╠OGICAL┬LOCK╬UM = * ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE,.┘=SEC
- % JSR DIVIDE┬Y18
- % LDX #0
- % CPY #9
- % BCC +
- % PHA
- % TYA
- % SBC #9
- % TAY
- % PLA
- % LDX #1
- % + INY
- % RTS
- %
-
- ├OPY A SEQUENTIAL GROUP OF LOGICAL SECTORS INTO MEMORY. ╘HIS ROUTINE IS USED
- BY THE DIRECTORY LOADING ROUTINE TO LOAD THE ╞┴╘ AND ╥OOT ─IRECTORY, AND IS
- USED BY THE CLUSTER READING ROUTINE TO RETRIEVE ALL OF THE BLOCKS OF A
- CLUSTER. ┴FTER THE GIVEN STARTING LOGICAL SECTOR NUMBER IS CONVERTED INTO ITS
- PHYSICAL CYLINDER, SIDE, AND SECTOR EQUIVALENT, THE PHYSICAL VALUES ARE
- INCREMENTED TO GET THE ADDRESS OF SUCCESSIVE SECTORS OF THE GROUP. ╘HIS
- AVOIDS THE OVERHEAD OF THE LOGICAL TO PHYSICAL CONVERSION. ╤UITE A NUMBER OF
- TEMPORARIES ARE NEEDED.
-
- % DEST╨TR = 6
- % CUR├YLINDER = 8
- % CUR╙IDE = 9
- % CUR╙ECTOR = 10
- % BLOCK├OUNTDOWN = 11
- % SOURCE╨TR = 12
- %
- % COPY┬LOCKS = * ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
- % STX BLOCK├OUNTDOWN
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % STA CUR├YLINDER
- % STX CUR╙IDE
- % STY CUR╙ECTOR
- %
- % COPY┬LOCK╠OOP = *
- % LDA CUR├YLINDER
- % LDX CUR╙IDE
- % LDY CUR╙ECTOR
- % JSR READ┬LOCK
- % BCC +
- % RTS
- % + STA SOURCE╨TR
- % STY SOURCE╨TR+1
- % LDX #2
- % LDY #0
-
- ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
- INSTRUCTION IN HALF. (┴ CYCLE SAVED... YOU KNOW).
-
- % - LDA (SOURCE╨TR),Y
- % STA (DEST╨TR),Y
- % INY
- % LDA (SOURCE╨TR),Y
- % STA (DEST╨TR),Y
- % INY
- % BNE -
- % INC SOURCE╨TR+1
- % INC DEST╨TR+1
- % DEX
- % BNE -
-
- ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
-
- % INC CUR╙ECTOR
- % LDA CUR╙ECTOR
- % CMP #10
- % BCC +
- % LDA #1
- % STA CUR╙ECTOR
- % INC CUR╙IDE
- % LDA CUR╙IDE
- % CMP #2
- % BCC +
- % LDA #0
- % STA CUR╙IDE
- % INC CUR├YLINDER
- % + DEC BLOCK├OUNTDOWN
- % BNE COPY┬LOCK╠OOP
- % CLC
- % RTS
- %
-
- ├ONVERT A GIVEN CLUSTER NUMBER INTO THE FIRST CORRESPONDING LOGICAL BLOCK
- NUMBER.
-
- % CONVERT├LUSTER╬UM = * ;( .┴┘=CLUSTER╬UM ) : .┴┘=LOGICAL┬LOCK╬UM
- % SEC
- % SBC #2
- % BCS +
- % DEY
- % + LDX CLUSTER┬LOCK├OUNT
- % CPX #1
- % BEQ +
- % ASL
- % STY 7
- % ROL 7
- % LDY 7
- % + CLC
- % ADC FIRST╞ILE┬LOCK
- % BCC +
- % INY
- % + RTS
- %
-
- ╥EAD A CLUSTER INTO THE ├LUSTER ┬UFFER, GIVEN THE CLUSTER NUMBER. ╘HE CLUSTER
- NUMBER IS CONVERTED TO A LOGICAL SECTOR NUMBER AND THEN THE SECTOR COPYING
- ROUTINE IS CALLED. ╘HE FORMULA GIVEN IN THE PREVIOUS ARTICLE IS USED.
-
- % READ├LUSTER = * ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
- % JSR CONVERT├LUSTER╬UM
- %
- % ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
- % LDX #<CLUSTER┬UF
- % STX 6
- % LDX #>CLUSTER┬UF
- % STX 7
- % LDX CLUSTER┬LOCK├OUNT
- % JMP COPY┬LOCKS
- %
-
- ╫RITE A LOGICAL BLOCK OUT TO DISK. ╘HE REAL PURPOSE OF THIS ROUTINE IS TO
- INVALIDATE THE READ-TRACK CACHE IF THE BLOCK TO BE WRITTEN IS CONTAINED IN
- THE CACHE.
-
- % WRITE╠OGICAL┬LOCK = * ;( .┴┘=LOGICAL┬LOCK╬UMBER, BUFPTR ) : .├╙=ERR
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % CMP BUF├YLINDER
- % BNE +
- % CPX BUF╙IDE
- % BNE +
- % PHA
- % LDA #$FF
- % STA BUF├YLINDER
- % STA BUF╙IDE
- % PLA
- % + JSR WRITE╙ECTOR
- % RTS
- %
- % WRITE├LUSTER╙AVE .BUF 2
- %
-
- ╫RITE A CLUSTER-FUL OF DATA OUT TO DISK FROM THE CLUSTER BUFFER. ╘HIS ROUTINE
- SIMPLY CALLS THE WRITE LOGICAL BLOCK ROUTINE ONCE OR TWICE, DEPENDING ON THE
- CLUSTER SIZE OF THE DISK INVOLVED.
-
- % WRITE├LUSTER = * ;( .┴┘=CLUSTER╬UMBER, CLUSTER┬UF ) : .├╙=ERR
- % JSR CONVERT├LUSTER╬UM
- % LDX #<CLUSTER┬UF
- % STX BUFPTR
- % LDX #>CLUSTER┬UF
- % STX BUFPTR+1
- % STA WRITE├LUSTER╙AVE
- % STY WRITE├LUSTER╙AVE+1
- % JSR WRITE╠OGICAL┬LOCK
- % BCC +
- % RTS
- % + LDA CLUSTER┬LOCK├OUNT
- % CMP #2
- % BCS +
- % RTS
- % + LDA WRITE├LUSTER╙AVE
- % LDY WRITE├LUSTER╙AVE+1
- % CLC
- % ADC #1
- % BCC +
- % INY
- % + JSR WRITE╠OGICAL┬LOCK
- % RTS
- %
-
- ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
- FORMAT.
-
- % ;====═╙-─╧╙ FORMAT LEVEL====
- %
- % BOOT┬LOCK = 2
- %
-
- ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
-
- % MS─IR = * ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
- % LDA #$0E
- % STA $FF00
- %
-
- ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
-
- % ;** GET PARAMETERS FROM BOOT SECTOR
- % LDA #0
- % LDY #0
- % JSR CONVERT╠OGICAL┬LOCK╬UM
- % JSR READ┬LOCK
- % BCC +
- % RTS
- % + STA BOOT┬LOCK
- % STY BOOT┬LOCK+1
- % LDY #13 ;GET CLUSTER SIZE
- % LDA (BOOT┬LOCK),Y
- % STA CLUSTER┬LOCK├OUNT
- % CMP #3
- % BCC +
- %
-
- ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
- RETURNED.
-
- % INVALID╨ARMS = *
- % LDA #60
- % STA ERRNO
- % SEC
- % RTS
- %
- % + LDY #16 ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
- % LDA (BOOT┬LOCK),Y
- % CMP #2
- % BNE INVALID╨ARMS
- % LDY #22 ;GET ╞┴╘ SIZE IN SECTORS
- % LDA (BOOT┬LOCK),Y
- % STA FAT┬LOCKS
- % CMP #4
- % BCS INVALID╨ARMS
- % LDY #17 ;GET DIRECTORY SIZE
- % LDA (BOOT┬LOCK),Y
- % STA ROOT─IR┼NTRIES
- % CMP #129
- % BCS INVALID╨ARMS
- % LSR
- % LSR
- % LSR
- % LSR
- % STA ROOT─IR┬LOCKS
- % LDY #19 ;GET TOTAL SECTOR COUNT
- % LDA (BOOT┬LOCK),Y
- % STA TOTAL╙ECTORS
- % INY
- % LDA (BOOT┬LOCK),Y
- % STA TOTAL╙ECTORS+1
- % LDY #24 ;CHECK SECTORS PER TRACK, MUST BE 9
- % LDA (BOOT┬LOCK),Y
- % CMP #9
- % BNE INVALID╨ARMS
- % LDY #26
- % LDA (BOOT┬LOCK),Y
- % CMP #2 ;CHECK NUMBER OF SIDES, MUST BE 2
- % BNE INVALID╨ARMS
- % LDY #14 ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
- % LDA (BOOT┬LOCK),Y
- % CMP #1
- % BNE INVALID╨ARMS
- %
-
- ├ALCULATE THE DERIVED PARAMETERS.
-
- % ;** GET DERIVED PARAMETERS
- % LDA FAT┬LOCKS ;FIRST ROOT DIRECTORY SECTOR
- % ASL
- % CLC
- % ADC #1
- % STA FIRST╥OOT─IR┬LOCK
- % CLC ;FIRST FILE SECTOR
- % ADC ROOT─IR┬LOCKS
- % STA FIRST╞ILE┬LOCK
- % LDA TOTAL╙ECTORS ;NUMBER OF FILE CLUSTERS
- % LDY TOTAL╙ECTORS+1
- % SEC
- % SBC FIRST╞ILE┬LOCK
- % BCS +
- % DEY
- % + STA FILE├LUSTER├OUNT
- % STY FILE├LUSTER├OUNT+1
- % LDA CLUSTER┬LOCK├OUNT
- % CMP #2
- % BNE +
- % LSR FILE├LUSTER├OUNT+1
- % ROR FILE├LUSTER├OUNT
- % + CLC
- % LDA FILE├LUSTER├OUNT
- % ADC #2
- % STA LAST╞AT┼NTRY
- % LDA FILE├LUSTER├OUNT+1
- % ADC #0
- % STA LAST╞AT┼NTRY+1
- %
- % ;** LOAD ╞┴╘
- % LDA #<FATBUF
- % LDY #>FATBUF
- % STA 6
- % STY 7
- % LDA #1
- % LDY #0
- % LDX FAT┬LOCKS
- % JSR COPY┬LOCKS
- % BCC +
- % RTS
- %
- % ;** LOAD ACTUAL DIRECTORY
- % + LDA #<DIRBUF
- % LDY #>DIRBUF
- % STA 6
- % STY 7
- % LDA FIRST╥OOT─IR┬LOCK
- % LDY #0
- % LDX ROOT─IR┬LOCKS
- % JSR COPY┬LOCKS
- % BCC +
- % RTS
- % + LDA #<DIRBUF
- % LDY #>DIRBUF
- % LDX ROOT─IR┼NTRIES
- % CLC
- % RTS
- %
-
- ╘HIS ROUTINE LOCATES THE GIVEN ╞┴╘ TABLE ENTRY NUMBER AND RETURNS THE VALUE
- STORED IN IT. ╙OME WORK IS NEEDED TO DEAL WITH THE 12-BIT COMPRESSED DATA
- STRUCTURE.
-
- % ENTRY┴DDR = 2
- % ENTRY╫ORK = 4
- % ENTRY┬ITS = 5
- % ENTRY─ATA0 = 6
- % ENTRY─ATA1 = 7
- % ENTRY─ATA2 = 8
- %
- % LOCATE╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : ENTRY┴DDR, ENTRY┬ITS%1
-
- ─IVIDE THE ╞┴╘ ENTRY NUMBER BY TWO AND MULTIPLY BY THREE BECAUSE TWO ╞┴╘
- ENTRIES ARE STORED IN THREE BYTES. ╘HEN ADD THE ╞┴╘ BASE ADDRESS AND WE HAVE
- THE ADDRESS OF THE THREE BYTES THAT CONTAIN THE ╞┴╘ ENTRY WE ARE INTERESTED
- IN. ╔ RETRIEVE THE THREE BYTES INTO ZERO-PAGE MEMORY FOR EASY MANIPULATION.
-
- % STA ENTRY┬ITS
- % ;** DIVIDE BY TWO
- % STY ENTRY┴DDR+1
- % LSR ENTRY┴DDR+1
- % ROR
- %
- % ;** TIMES THREE
- % STA ENTRY╫ORK
- % LDX ENTRY┴DDR+1
- % ASL
- % ROL ENTRY┴DDR+1
- % CLC
- % ADC ENTRY╫ORK
- % STA ENTRY┴DDR
- % TXA
- % ADC ENTRY┴DDR+1
- % STA ENTRY┴DDR+1
- %
- % ;** ADD BASE, GET DATA
- % CLC
- % LDA ENTRY┴DDR
- % ADC #<FATBUF
- % STA ENTRY┴DDR
- % LDA ENTRY┴DDR+1
- % ADC #>FATBUF
- % STA ENTRY┴DDR+1
- % LDY #2
- % - LDA (ENTRY┴DDR),Y
- % STA ENTRY─ATA0,Y
- % DEY
- % BPL -
- % RTS
- %
- % GET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
- % JSR LOCATE╞AT┼NTRY
- % LDA ENTRY┬ITS
- % AND #1
- % BNE +
- %
-
- ╔F THE ORIGINAL GIVEN ╞┴╘ ENTRY NUMBER IS EVEN, THEN WE WANT THE FIRST 12-BIT
- COMPRESSED FIELD. ╘HE NYBBLES ARE EXTRACTED ACCORDING TO THE DIAGRAM SHOWN
- EARLIER.
-
- % ;** CASE 1: FIRST 12-BIT CLUSTER
- % LDA ENTRY─ATA1
- % AND #$0F
- % TAY
- % LDA ENTRY─ATA0
- % RTS
- %
-
- ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
-
- % ;** CASE 2: SECOND 12-BIT CLUSTER
- % + LDA ENTRY─ATA1
- % LDX #4
- % - LSR ENTRY─ATA2
- % ROR
- % DEX
- % BNE -
- % LDY ENTRY─ATA2
- % RTS
- %
- % FAT╓ALUE = 9
- %
-
- ├HANGE THE VALUE IN A ╞┴╘ ENTRY. ╘HIS ROUTINE IS QUITE SIMILAR TO THE GET
- ROUTINE.
-
- % SET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER, (FAT╓ALUE) )
- % JSR LOCATE╞AT┼NTRY
- % LDA FAT╓ALUE+1
- % AND #$0F
- % STA FAT╓ALUE+1
- % LDA ENTRY┬ITS
- % AND #1
- % BNE +
- %
- % ;** CASE 1: FIRST 12-BIT CLUSTER
- % LDA FAT╓ALUE
- % STA ENTRY─ATA0
- % LDA ENTRY─ATA1
- % AND #$F0
- % ORA FAT╓ALUE+1
- % STA ENTRY─ATA1
- % JMP SET╞AT┼XIT
- %
- % ;** CASE 2: SECOND 12-BIT CLUSTER
- % + LDX #4
- % - ASL FAT╓ALUE
- % ROL FAT╓ALUE+1
- % DEX
- % BNE -
- % LDA FAT╓ALUE+1
- % STA ENTRY─ATA2
- % LDA ENTRY─ATA1
- % AND #$0F
- % ORA FAT╓ALUE
- % STA ENTRY─ATA1
- %
- % SET╞AT┼XIT = *
- % LDY #2
- % - LDA ENTRY─ATA0,Y
- % STA (ENTRY┴DDR),Y
- % DEY
- % BPL -
- % STY FAT─IRTY
- % RTS
- %
-
- ═ARK THE DIRECTORY SECTOR CORRESPONDING TO THE GIVEN DIRECTORY ENTRY AS BEING
- DIRTY SO IT WILL BE WRITTEN OUT TO DISK THE NEXT TIME THE MS╞LUSH ROUTINE IS
- CALLED.
-
- % DIRTY─IRENT = * ;( WRITE─IRENT )
- % SEC
- % LDA WRITE─IRENT
- % SBC #<DIRBUF
- % LDA WRITE─IRENT+1
- % SBC #>DIRBUF
- % LSR
- % AND #$07
- % TAX
- % LDA #$FF
- % STA DIR─IRTY,X
- % RTS
- %
- % DEL├LUSTER = 14
- %
-
- ─ELETE THE ═╙-─╧╙ FILE WHOSE DIRECTORY ENTRY IS GIVEN. ╨UT THE $┼5 INTO
- ITS FILENAME, GET ITS STARTING CLUSTER AND FOLLOW THE CHAIN OF CLUSTERS
- ALLOCATED TO THE FILE IN THE ╞┴╘, MARKING THEM AS UNALLOCATED (VALUE $000)
- AS WE GO. ┼XIT BY MARKING THE DIRECTORY ENTRY AS "DIRTY".
-
- % MS─ELETE = * ;( WRITE─IRENT )
- % LDY #$0E
- % STY $FF00
- % LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDA #$E5
- % LDY #0
- % STA (2),Y
- % LDY #26
- % LDA (2),Y
- % STA DEL├LUSTER
- % INY
- % LDA (2),Y
- % STA DEL├LUSTER+1
- % - LDA DEL├LUSTER+1
- % CMP #5
- % BCC +
- % JMP DIRTY─IRENT
- % + TAY
- % LDA DEL├LUSTER
- % JSR GET╞AT┼NTRY
- % PHA
- % TYA
- % PHA
- % LDA #0
- % STA FAT╓ALUE
- % STA FAT╓ALUE+1
- % LDA DEL├LUSTER
- % LDY DEL├LUSTER+1
- % JSR SET╞AT┼NTRY
- % PLA
- % STA DEL├LUSTER+1
- % PLA
- % STA DEL├LUSTER
- % JMP -
- %
- % FLUSH┬LOCK = 14
- % FLUSH├OUNTDOWN = $60
- % FLUSH╥EPEATS = $61
- % FLUSH─IR╔NDEX = $61
- %
-
- ╫RITE THE ╞┴╘ AND DIRECTORY SECTORS FROM MEMORY TO DISK, IF THEY ARE DIRTY.
-
- % MS╞LUSH = * ;( MS─EVICE, MS╘YPE ) : .├╙=ERROR
- % LDA #$0E
- % STA $FF00
- % LDA FAT─IRTY
- % BEQ FLUSH─IRECTORY
- % LDA #0
- % STA FAT─IRTY
- %
- % ;** FLUSH FAT
-
- ╞LUSH BOTH COPIES OF THE ╞┴╘, IF THERE ARE TWO; OTHERWISE, ONLY FLUSH THE ONE.
-
- % LDA #2
- % STA FLUSH╥EPEATS
- % LDA #1
- % STA FLUSH┬LOCK
- %
- % MASTER╞LUSH = *
- % LDA FAT┬LOCKS
- % STA FLUSH├OUNTDOWN
- % LDA #<FATBUF
- % LDY #>FATBUF
- % STA BUFPTR
- % STY BUFPTR+1
- % - LDA FLUSH┬LOCK
- % LDY #0
- % JSR WRITE╠OGICAL┬LOCK
- % BCC +
- % RTS
- % + INC FLUSH┬LOCK
- % DEC FLUSH├OUNTDOWN
- % BNE -
- % DEC FLUSH╥EPEATS
- % BNE MASTER╞LUSH
- %
- % ;** FLUSH DIRECTORY
- % FLUSH─IRECTORY = *
- % LDA FIRST╥OOT─IR┬LOCK
- % STA FLUSH┬LOCK
- % LDA ROOT─IR┬LOCKS
- % STA FLUSH├OUNTDOWN
- % LDA #0
- % STA FLUSH─IR╔NDEX
- % LDA #<DIRBUF
- % LDY #>DIRBUF
- % STA BUFPTR
- % STY BUFPTR+1
- % - LDX FLUSH─IR╔NDEX
- % LDA DIR─IRTY,X
- % BEQ +
- % LDA #0
- % STA DIR─IRTY,X
- % LDA FLUSH┬LOCK
- % LDY #0
- % JSR WRITE╠OGICAL┬LOCK
- % DEC BUFPTR+1
- % DEC BUFPTR+1
- % + INC FLUSH┬LOCK
- % INC FLUSH─IR╔NDEX
- % INC BUFPTR+1
- % INC BUFPTR+1
- % DEC FLUSH├OUNTDOWN
- % BNE -
- % CLC
- % RTS
- %
- % BF╞AT┼NTRY = 14
- % BF┬LOCKS = $60
- %
-
- ├OUNT THE NUMBER OF FREE ╞┴╘ ENTRIES (VALUE $000) FROM ENTRY 2 UP TO THE
- HIGHEST ╞┴╘ ENTRY AVAILABLE FOR CLUSTER ALLOCATION. ╘HEN MULTIPLY THIS
- BY THE NUMBER OF BYTES PER CLUSTER (EITHER 512 OR 1024).
-
- % MS┬YTES╞REE = * ;( ) : .┴┘╪=FILE┬YTES╞REE
- % LDY #$0E
- % STY $FF00
- % LDA #2
- % LDY #0
- % STA BF╞AT┼NTRY
- % STY BF╞AT┼NTRY+1
- % STY BF┬LOCKS
- % STY BF┬LOCKS+1
- % - LDA BF╞AT┼NTRY
- % LDY BF╞AT┼NTRY+1
- % JSR GET╞AT┼NTRY
- % STY 2
- % ORA 2
- % BNE +
- % INC BF┬LOCKS
- % BNE +
- % INC BF┬LOCKS+1
- % + INC BF╞AT┼NTRY
- % BNE +
- % INC BF╞AT┼NTRY+1
- % + LDA BF╞AT┼NTRY
- % CMP LAST╞AT┼NTRY
- % LDA BF╞AT┼NTRY+1
- % SBC LAST╞AT┼NTRY+1
- % BCC -
- % LDX CLUSTER┬LOCK├OUNT
- % - ASL BF┬LOCKS
- % ROL BF┬LOCKS+1
- % DEX
- % BNE -
- % LDA #0
- % LDY BF┬LOCKS
- % LDX BF┬LOCKS+1
- % RTS
- %
-
- ╘HIS IS THE FILE COPYING LEVEL. ╔T DEALS WITH READING/WRITING THE CLUSTERS OF
- ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO/FROM THE ALREADY-OPEN ├┬═
- ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔/╨┼╘╙├╔╔ TRANSLATION.
-
- % ;====FILE COPY LEVEL====
- %
- % TRANS═ODE = 14
- % LFN = 15
- % CBM─ATA╨TR = $60
- % CBM─ATA╠EN = $62
- % CLUSTER = $64
- %
-
- ├OPY THE GIVEN CLUSTER TO THE ├┬═ OUTPUT FILE. ╘HIS ROUTINE FETCHES THE NEXT
- CLUSTER OF THE FILE FOR THE NEXT TIME THIS ROUTINE IS CALLED, AND IF IT HITS
- THE ╬╒╠╠ POINTER OF THE LAST CLUSTER OF A FILE, IT ADJUSTS THE NUMBER OF VALID
- FILE DATA BYTES THE CURRENT CLUSTER CONTAINS TO ╞ILE╠ENGTH % ├LUSTER╠ENGTH
- (SEE NOTE BELOW).
-
- % COPY╞ILE├LUSTER = * ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
-
- ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
-
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR READ├LUSTER
- % BCC +
- % RTS
- % + LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA #0
- % STA CBM─ATA╠EN
- % LDA CLUSTER┬LOCK├OUNT
- % ASL
- % STA CBM─ATA╠EN+1
-