home *** CD-ROM | disk | FTP | other *** search
- .%083!
-
- ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
- FAST SERIAL BUS.
-
- .%084! SERIAL╫AIT = *
- .%085! LDA #$08
- .%086! - BIT CIA╞LAGS
- .%087! BEQ -
- .%088! RTS
- .%089!
-
- ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
- ┴CCEPTED" SIGNAL.
-
- .%090! GET┬URST┬YTE = *
- .%091! JSR SERIAL╫AIT
- .%092! LDX CIA─ATA
- .%093! JSR TOGGLE├LOCK
- .%094! TXA
- .%095! RTS
- .%096!
-
- ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
- INTERLEAVE FACTOR.
-
- .%097! MOUNT─ISK = * ;() : .├╙=ERR
- .%098! LDA #%00011010
- .%099! JSR SEND╒0
- .%100! BCC +
- .%101! RTS
- .%102! + JSR KERNEL╒NLSN
- .%103! BIT ST
- .%104! BMI SEND╒0┼RROR
- .%105! CLC
- .%106! JSR KERNEL╙PINP
- .%107! BIT CIA╞LAGS
- .%108! JSR TOGGLE├LOCK
- .%109! JSR GET┬URST┬YTE
- .%110! STA ERRNO
- .%111! AND #$0F
- .%112! CMP #2
- .%113! BCS MOUNT┼XIT
-
- ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
-
- .%114! LDY #0
- .%115! - JSR GET┬URST┬YTE
- .%116! STA FORMAT╨ARMS,Y
- .%117! INY
- .%118! CPY #6
- .%119! BCC -
- .%120! CLC
-
- ╙ET THE SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
-
- .%121! ;** SET INTERLEAVE
- .%122! LDA #%00001000
- .%123! JSR SEND╒0
- .%124! BCC +
- .%125! RTS
- .%126! + LDA #1 ;INTERLEAVE OF 1 FOR 1581
- .%127! BIT SOURCE╘YPE
- .%128! BMI +
- .%129! LDA #4 ;INTERLEAVE OF 4 FOR 1571
- .%130! + JSR KERNEL├IOUT
- .%131! JSR KERNEL╒NLSN
- .%132! MOUNT┼XIT = *
- .%133! RTS
- .%134!
-
- ╥EAD ALL OF THE SECTORS OF A GIVEN TRACK INTO THE TRACK CACHE.
-
- .%135! BUFPTR = 2
- .%136! SECNUM = 4
- .%137!
- .%138! READ╘RACK = * ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
- .%139! PHA
- .%140! TXA
-
- ╟ET THE SIDE AND PUT IT INTO THE COMMAND BYTE. ╥EMEMBER THAT WE HAVE TO FLIP
- THE SIDE BIT FOR A 1581.
-
- .%141! AND #$01
- .%142! ASL
- .%143! ASL
- .%144! ASL
- .%145! ASL
- .%146! BIT SOURCE╘YPE
- .%147! BPL +
- .%148! EOR #$10
- .%149! + JSR SEND╒0
- .%150! BCC +
- .%151! RTS
- .%152! + PLA ;CYLINDER NUMBER
- .%153! JSR KERNEL├IOUT
- .%154! LDA #1 ;START SECTOR NUMBER
- .%155! JSR KERNEL├IOUT
- .%156! LDA #9 ;SECTOR COUNT
- .%157! JSR KERNEL├IOUT
- .%158! JSR KERNEL╒NLSN
-
- ╨REPARE TO RECEIVE THE TRACK DATA.
-
- .%159! SEI
- .%160! CLC
- .%161! JSR KERNEL╙PINP
- .%162! BIT CIA╞LAGS
- .%163! JSR TOGGLE├LOCK
- .%164! LDA #<TRACKBUF
- .%165! LDY #>TRACKBUF
- .%166! STA BUFPTR
- .%167! STY BUFPTR+1
-
- ╟ET THE SECTOR DATA FOR EACH OF THE 9 SECTORS OF THE TRACK.
-
- .%168! LDA #0
- .%169! STA SECNUM
- .%170! - BIT SOURCE╘YPE
- .%171! BMI +
-
- ╔F WE ARE DEALING WITH A 1571, WE HAVE TO SET THE BUFFER POINTER FOR THE NEXT
- SECTOR, TAKING INTO ACCOUNT THE SOFT INTERLEAVE OF 4.
-
- .%172! JSR GET1571┬UF╨TR
- .%173! + JSR READ╙ECTOR
- .%174! BCS TRACK┼XIT
- .%175! INC SECNUM
- .%176! LDA SECNUM
- .%177! CMP #9
- .%178! BCC -
- .%179! CLC
- .%180! TRACK┼XIT = *
- .%181! CLI
- .%182! RTS
- .%183!
-
- ╟ET THE BUFFER POINTER FOR THE NEXT 1571 SECTOR.
-
- .%184! GET1571┬UF╨TR = *
- .%185! LDA #<TRACKBUF
- .%186! STA BUFPTR
- .%187! LDX SECNUM
- .%188! CLC
- .%189! LDA #>TRACKBUF
- .%190! ADC BUFPTR1571,X
- .%191! STA BUFPTR+1
- .%192! RTS
- .%193!
- .%194! BUFPTR1571 = *
- .%195! .BYTE 0,8,16,6,14,4,12,2,10
- .%196!
-
- ╥EAD AN INDIVIDUAL SECTOR INTO MEMORY AT THE SPECIFIED ADDRESS.
-
- .%197! READ╙ECTOR = * ;( BUFPTR ) : .├╙=ERR
-
- ╟ET AND CHECK THE BURST STATUS BYTE FOR ERRORS.
-
- .%198! JSR GET┬URST┬YTE
- .%199! STA ERRNO
- .%200! AND #$0F
- .%201! CMP #2
- .%202! BCC +
- .%203! RTS
- .%204! + LDX #2
- .%205! LDY #0
- .%206!
-
- ╥ECEIVE THE 512 SECTOR DATA BYTES INTO MEMORY.
-
- .%207! READ┬YTE = *
- .%208! LDA #$08
- .%209! - BIT CIA╞LAGS
- .%210! BEQ -
- .%211! LDA CIA├LOCK
- .%212! EOR #$10
- .%213! STA CIA├LOCK
- .%214! LDA CIA─ATA
- .%215! STA (BUFPTR),Y
- .%216! INY
- .%217! BNE READ┬YTE
- .%218! INC BUFPTR+1
- .%219! DEX
- .%220! BNE READ┬YTE
- .%221! RTS
- .%222!
-
- ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
- RATHER THAN WITH HARDWARE.
-
- .%223! ;====LOGICAL SECTOR LEVEL====
- .%224!
-
- ╔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.
-
- .%225! INIT╨ACKAGE = *
- .%226! LDA #$0E
- .%227! STA $FF00
- .%228! LDA #$FF
- .%229! STA BUF├YLINDER
- .%230! STA BUF╙IDE
- .%231! CLC
- .%232! RTS
- .%233!
-
- ╠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.
-
- .%234! SECTOR╙AVE = 5
- .%235!
- .%236! READ┬LOCK = * ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
-
- ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
-
- .%237! CMP BUF├YLINDER
- .%238! BNE READ┬LOCK╨HYSICAL
- .%239! CPX BUF╙IDE
- .%240! BNE READ┬LOCK╨HYSICAL
-
- ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
-
- .%241! DEY
- .%242! TYA
- .%243! ASL
- .%244! CLC
- .%245! ADC #>TRACKBUF
- .%246! TAY
- .%247! LDA #<TRACKBUF
- .%248! CLC
- .%249! RTS
- .%250!
-
- ╚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.
-
- .%251! READ┬LOCK╨HYSICAL = *
- .%252! STA BUF├YLINDER
- .%253! STX BUF╙IDE
- .%254! STY SECTOR╙AVE
- .%255! JSR READ╘RACK
-
- ├HECK FOR ERRORS.
-
- .%256! BCC READ┬LOCK╨HYSICAL╧K
- .%257! LDA ERRNO
- .%258! AND #$0F
- .%259! CMP #11 ;DISK CHANGE
- .%260! BEQ +
- .%261! SEC
- .%262! RTS
-
- ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
- TRY TO READ THE PHYSICAL TRACK AGAIN.
-
- .%263! + JSR MOUNT─ISK
- .%264! LDA BUF├YLINDER
- .%265! LDX BUF╙IDE
- .%266! LDY SECTOR╙AVE
- .%267! BCC READ┬LOCK╨HYSICAL
- .%268! RTS
- .%269!
-
- ╚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.
-
- .%270! READ┬LOCK╨HYSICAL╧K = *
- .%271! LDA BUF├YLINDER
- .%272! LDX BUF╙IDE
- .%273! LDY SECTOR╙AVE
- .%274! JMP READ┬LOCK
- .%275!
-
- ─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.
-
- .%276! DIVIDE┬Y18 = * ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
- .%277! ;** COULD REPEATEDLY SUBTRACT 360 HERE
- .%278! LDX #$FF
- .%279! - INX
- .%280! SEC
- .%281! SBC #18
- .%282! BCS -
- .%283! DEY
- .%284! BPL -
- .%285! CLC
- .%286! ADC #18
- .%287! INY
- .%288! TAY
- .%289! TXA
- .%290! RTS
- .%291!
-
- ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
- SIDE, AND SECTOR NUMBERS. ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN EARLIER
- WITH A FEW SIMPLIFYING TRICKS.
-
- .%292! CONVERT╠OGICAL┬LOCK╬UM = * ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE, .┘=SEC
- .%293! JSR DIVIDE┬Y18
- .%294! LDX #0
- .%295! CPY #9
- .%296! BCC +
- .%297! PHA
- .%298! TYA
- .%299! SBC #9
- .%300! TAY
- .%301! PLA
- .%302! LDX #1
- .%303! + INY
- .%304! RTS
- .%305!
-
- ├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.
-
- .%306! DEST╨TR = 6
- .%307! CUR├YLINDER = 8
- .%308! CUR╙IDE = 9
- .%309! CUR╙ECTOR = 10
- .%310! BLOCK├OUNTDOWN = 11
- .%311! SOURCE╨TR = 12
- .%312!
- .%313! COPY┬LOCKS = * ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
- .%314! STX BLOCK├OUNTDOWN
- .%315! JSR CONVERT╠OGICAL┬LOCK╬UM
- .%316! STA CUR├YLINDER
- .%317! STX CUR╙IDE
- .%318! STY CUR╙ECTOR
- .%319!
- .%320! COPY┬LOCK╠OOP = *
- .%321! LDA CUR├YLINDER
- .%322! LDX CUR╙IDE
- .%323! LDY CUR╙ECTOR
- .%324! JSR READ┬LOCK
- .%325! BCC +
- .%326! RTS
- .%327! + STA SOURCE╨TR
- .%328! STY SOURCE╨TR+1
- .%329! LDX #2
- .%330! LDY #0
-
- ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
- INSTRUCTION IN HALF. (┴ CYCLE SAVED... YOU KNOW).
-
- .%331! - LDA (SOURCE╨TR),Y
- .%332! STA (DEST╨TR),Y
- .%333! INY
- .%334! LDA (SOURCE╨TR),Y
- .%335! STA (DEST╨TR),Y
- .%336! INY
- .%337! BNE -
- .%338! INC SOURCE╨TR+1
- .%339! INC DEST╨TR+1
- .%340! DEX
- .%341! BNE -
-
- ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
-
- .%342! INC CUR╙ECTOR
- .%343! LDA CUR╙ECTOR
- .%344! CMP #10
- .%345! BCC +
- .%346! LDA #1
- .%347! STA CUR╙ECTOR
- .%348! INC CUR╙IDE
- .%349! LDA CUR╙IDE
- .%350! CMP #2
- .%351! BCC +
- .%352! LDA #0
- .%353! STA CUR╙IDE
- .%354! INC CUR├YLINDER
- .%355! + DEC BLOCK├OUNTDOWN
- .%356! BNE COPY┬LOCK╠OOP
- .%357! CLC
- .%358! RTS
- .%359!
-
- ╥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 EARLIER IS USED FOR THE CONVERSION.
-
- .%360! READ├LUSTER = * ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
- .%361! ;** CONVERT CLUSTER NUMBER TO LOGICAL BLOCK NUMBER
- .%362! SEC
- .%363! SBC #2
- .%364! BCS +
- .%365! DEY
- .%366! + LDX CLUSTER┬LOCK├OUNT
- .%367! CPX #1
- .%368! BEQ +
- .%369! ASL
- .%370! STY 7
- .%371! ROL 7
- .%372! LDY 7
- .%373! + CLC
- .%374! ADC FIRST╞ILE┬LOCK
- .%375! BCC +
- .%376! INY
- .%377!
- .%378! ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
- .%379! + LDX #<CLUSTER┬UF
- .%380! STX 6
- .%381! LDX #>CLUSTER┬UF
- .%382! STX 7
- .%383! LDX CLUSTER┬LOCK├OUNT
- .%384! JMP COPY┬LOCKS
- .%385!
-
- ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
- FORMAT.
-
- .%386! ;====═╙-─╧╙ FORMAT LEVEL====
- .%387!
- .%388! BOOT┬LOCK = 2
- .%389!
-
- ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
-
- .%390! LOAD─IRECTORY = * ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
- .%391! LDA #$0E
- .%392! STA $FF00
- .%393!
-
- ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
-
- .%394! ;** GET PARAMETERS FROM BOOT SECTOR
- .%395! LDA #0
- .%396! LDY #0
- .%397! JSR CONVERT╠OGICAL┬LOCK╬UM
- .%398! JSR READ┬LOCK
- .%399! BCC +
- .%400! RTS
- .%401! + STA BOOT┬LOCK
- .%402! STY BOOT┬LOCK+1
- .%403! LDY #13 ;GET CLUSTER SIZE
- .%404! LDA (BOOT┬LOCK),Y
- .%405! STA CLUSTER┬LOCK├OUNT
- .%406! CMP #3
- .%407! BCC +
- .%408!
-
- ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
- RETURNED.
-
- .%409! INVALID╨ARMS = *
- .%410! LDA #60
- .%411! STA ERRNO
- .%412! SEC
- .%413! RTS
- .%414!
- .%415! + LDY #16 ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
- .%416! LDA (BOOT┬LOCK),Y
- .%417! CMP #2
- .%418! BNE INVALID╨ARMS
- .%419! LDY #22 ;GET ╞┴╘ SIZE IN SECTORS
- .%420! LDA (BOOT┬LOCK),Y
- .%421! STA FAT┬LOCKS
- .%422! CMP #4
- .%423! BCS INVALID╨ARMS
- .%424! LDY #17 ;GET DIRECTORY SIZE
- .%425! LDA (BOOT┬LOCK),Y
- .%426! STA ROOT─IR┼NTRIES
- .%427! CMP #129
- .%428! BCS INVALID╨ARMS
- .%429! LSR
- .%430! LSR
- .%431! LSR
- .%432! LSR
- .%433! STA ROOT─IR┬LOCKS
- .%434! LDY #19 ;GET TOTAL SECTOR COUNT
- .%435! LDA (BOOT┬LOCK),Y
- .%436! STA TOTAL╙ECTORS
- .%437! INY
- .%438! LDA (BOOT┬LOCK),Y
- .%439! STA TOTAL╙ECTORS+1
- .%440! LDY #24 ;CHECK SECTORS PER TRACK, MUST BE 9
- .%441! LDA (BOOT┬LOCK),Y
- .%442! CMP #9
- .%443! BNE INVALID╨ARMS
- .%444! LDY #26
- .%445! LDA (BOOT┬LOCK),Y
- .%446! CMP #2 ;CHECK NUMBER OF SIDES, MUST BE 2
- .%447! BNE INVALID╨ARMS
- .%448! LDY #14 ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
- .%449! LDA (BOOT┬LOCK),Y
- .%450! CMP #1
- .%451! BNE INVALID╨ARMS
- .%452!
-
- ├ALCULATE THE DERIVED PARAMETERS.
-
- .%453! ;** GET DERIVED PARAMETERS
- .%454! LDA FAT┬LOCKS ;FIRST ROOT DIRECTORY SECTOR
- .%455! ASL
- .%456! CLC
- .%457! ADC #1
- .%458! STA FIRST╥OOT─IR┬LOCK
- .%459! CLC ;FIRST FILE SECTOR
- .%460! ADC ROOT─IR┬LOCKS
- .%461! STA FIRST╞ILE┬LOCK
- .%462! LDA TOTAL╙ECTORS ;NUMBER OF FILE CLUSTERS
- .%463! LDY TOTAL╙ECTORS+1
- .%464! SEC
- .%465! SBC FIRST╞ILE┬LOCK
- .%466! BCS +
- .%467! DEY
- .%468! + STA FILE├LUSTER├OUNT
- .%469! STY FILE├LUSTER├OUNT+1
- .%470! LDA CLUSTER┬LOCK├OUNT
- .%471! CMP #2
- .%472! BNE +
- .%473! LSR FILE├LUSTER├OUNT+1
- .%474! ROR FILE├LUSTER├OUNT
- .%475!
-
- ╟EE, ╔ HAVE MORE COMMENTS EMBEDDED IN THE CODE THAN ╔ DID LAST ISSUE.
-
- .%476! ;** LOAD ╞┴╘
- .%477! + LDA #<FATBUF
- .%478! LDY #>FATBUF
- .%479! STA 6
- .%480! STY 7
- .%481! LDA #1
- .%482! LDY #0
- .%483! LDX FAT┬LOCKS
- .%484! JSR COPY┬LOCKS
- .%485! BCC +
- .%486! RTS
- .%487!
- .%488! ;** LOAD ACTUAL DIRECTORY
- .%489! + LDA #<DIRBUF
- .%490! LDY #>DIRBUF
- .%491! STA 6
- .%492! STY 7
- .%493! LDA FIRST╥OOT─IR┬LOCK
- .%494! LDY #0
- .%495! LDX ROOT─IR┬LOCKS
- .%496! JSR COPY┬LOCKS
- .%497! BCC +
- .%498! RTS
- .%499! + LDA #<DIRBUF
- .%500! LDY #>DIRBUF
- .%501! LDX ROOT─IR┼NTRIES
- .%502! CLC
- .%503! RTS
- .%504!
-
- ╘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.
-
- .%505! ENTRY┴DDR = 2
- .%506! ENTRY╫ORK = 4
- .%507! ENTRY┬ITS = 5
- .%508! ENTRY─ATA0 = 6
- .%509! ENTRY─ATA1 = 7
- .%510! ENTRY─ATA2 = 8
- .%511!
- .%512! GET╞AT┼NTRY = * ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
- .%513! STA ENTRY┬ITS
-
- ─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.
-
- .%514! ;** DIVIDE BY TWO
- .%515! STY ENTRY┴DDR+1
- .%516! LSR ENTRY┴DDR+1
- .%517! ROR
- .%518!
- .%519! ;** TIMES THREE
- .%520! STA ENTRY╫ORK
- .%521! LDX ENTRY┴DDR+1
- .%522! ASL
- .%523! ROL ENTRY┴DDR+1
- .%524! CLC
- .%525! ADC ENTRY╫ORK
- .%526! STA ENTRY┴DDR
- .%527! TXA
- .%528! ADC ENTRY┴DDR+1
- .%529! STA ENTRY┴DDR+1
- .%530!
- .%531! ;** ADD BASE, GET DATA
- .%532! CLC
- .%533! LDA ENTRY┴DDR
- .%534! ADC #<FATBUF
- .%535! STA ENTRY┴DDR
- .%536! LDA ENTRY┴DDR+1
- .%537! ADC #>FATBUF
- .%538! STA ENTRY┴DDR+1
- .%539! LDY #2
- .%540! - LDA (ENTRY┴DDR),Y
- .%541! STA ENTRY─ATA0,Y
- .%542! DEY
- .%543! BPL -
- .%544! LDA ENTRY┬ITS
- .%545! AND #1
- .%546! BNE +
- .%547!
-
- ╔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.
-
- .%548! ;** CASE 1: FIRST 12-BIT CLUSTER
- .%549! LDA ENTRY─ATA1
- .%550! AND #$0F
- .%551! TAY
- .%552! LDA ENTRY─ATA0
- .%553! RTS
- .%554!
-
- ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
-
- .%555! ;** CASE 2: SECOND 12-BIT CLUSTER
- .%556! + LDA ENTRY─ATA1
- .%557! LDX #4
- .%558! - LSR ENTRY─ATA2
- .%559! ROR
- .%560! DEX
- .%561! BNE -
- .%562! LDY ENTRY─ATA2
- .%563! RTS
- .%564!
-
- ╞INALLY, THIS IS THE FILE COPYING LEVEL. ╔T DEALS WITH READING THE CLUSTERS
- OF ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO THE ALREADY-OPEN ├┬═
- ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔-TO-╨┼╘╙├╔╔ TRANSLATION.
-
- .%565! ;====FILE COPY LEVEL====
- .%566!
- .%567! TRANS═ODE = 14
- .%568! LFN = 15
- .%569! CBM─ATA╨TR = $60
- .%570! CBM─ATA╠EN = $62
- .%571! CLUSTER = $64
- .%572!
-
- ├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).
-
- .%573! COPY╞ILE├LUSTER = * ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
-
- ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
-
- .%574! LDA CLUSTER
- .%575! LDY CLUSTER+1
- .%576! JSR READ├LUSTER
- .%577! BCC +
- .%578! RTS
- .%579! + LDA #<CLUSTER┬UF
- .%580! LDY #>CLUSTER┬UF
- .%581! STA CBM─ATA╨TR
- .%582! STY CBM─ATA╨TR+1
- .%583! LDA #0
- .%584! STA CBM─ATA╠EN
- .%585! LDA CLUSTER┬LOCK├OUNT
- .%586! ASL
- .%587! STA CBM─ATA╠EN+1
- .%588!
-
- ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
- FOR THE LAST CLUSTER OF THE FILE.
-
- .%589! ;**GET NEXT CLUSTER
- .%590! LDA CLUSTER
- .%591! LDY CLUSTER+1
- .%592! JSR GET╞AT┼NTRY
- .%593! STA CLUSTER
- .%594! STY CLUSTER+1
- .%595! CMP #$FF
- .%596! BNE COPY╞ILE├LUSTER─ATA
- .%597! CPY #$0F
- .%598! BNE COPY╞ILE├LUSTER─ATA
- .%599! LDA LEN═╠
- .%600! STA CBM─ATA╠EN
- .%601! LDA #$01
- .%602! LDX CLUSTER┬LOCK├OUNT
- .%603! CPX #1
- .%604! BEQ +
- .%605! LDA #$03
- .%606! + AND LEN═╠+1
-
- ╘HE FOLLOWING THREE LINES WERE ADDED IN A LAST MINUTE PANIC AFTER REALIZING
- THAT IF ╞ILE╠ENGTH % ├LUSTER╙IZE == 0, THEN THE LAST CLUSTER OF THE FILE
- CONTAINS ├LUSTER╙IZE BYTES, NOT ZERO BYTES.
-
- .%000! BNE +
- .%000! LDX LEN═╠
- .%000! BEQ COPY╞ILE├LUSTER─ATA
- .%607! + STA CBM─ATA╠EN+1
- .%608!
- .%609! COPY╞ILE├LUSTER─ATA = *
- .%610! JSR COMMIE╧UT
- .%611! RTS
- .%612!
-
- ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
-
- .%613! CBM─ATA╠IMIT = $66
- .%614!
- .%615! COMMIE╧UT = * ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
-
- ╔F THE THE LOGICAL FILE NUMBER TO COPY TO IS 0 ("NULL DEVICE"), THEN DON'T
- BOTHER COPYING ANYTHING.
-
- .%616! LDX LFN
- .%617! BNE +
- .%618! CLC
- .%619! RTS
-
- ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
-
- .%620! + JSR KERNEL├HKOUT
- .%621! BCC COMMIE╧UT═ORE
- .%622! STA ERRNO
- .%623! RTS
- .%624!
- .%625! COMMIE╧UT═ORE = *
-
- ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
- BYTES REMAINING IN THE CLUSTER.
-
- .%626! LDA #255
- .%627! LDX CBM─ATA╠EN+1
- .%628! BNE +
- .%629! LDA CBM─ATA╠EN
- .%630! + STA CBM─ATA╠IMIT
- .%631! LDY #0
- .%632! - LDA (CBM─ATA╨TR),Y
- .%633! BIT TRANS═ODE
- .%634! BPL +
-
- ╔F WE HAVE TO TRANSLATE THE CURRENT ┴╙├╔╔ CHARACTER, LOOK UP THE ╨┼╘╙├╔╔ VALUE
- IN THE TRANSLATION TABLE AND OUTPUT THAT VALUE. ╔F THE TRANSLATION TABLE
- ENTRY VALUE IS $00, THEN DON'T OUTPUT A CHARACTER (FILTER OUT INVALID
- CHARACTER CODES).
-
- .%635! TAX
- .%636! LDA TRANS┬UF,X
- .%637! BEQ COMMIE╬EXT
- .%638! + JSR KERNEL├HROUT
- .%639! COMMIE╬EXT = *
- .%640! INY
- .%641! CPY CBM─ATA╠IMIT
- .%642! BNE -
- .%643!
-
- ╔NCREMENT THE CLUSTER BUFFER POINTER AND DECREMENT THE CLUSTER BUFFER CHARACTER
- COUNT ACCORDING TO THE NUMBER OF BYTES JUST PROCESSED, AND REPEAT THE ABOVE IF
- MORE FILE DATA REMAINS IN THE CURRENT CLUSTER.
-
- .%644! CLC
- .%645! LDA CBM─ATA╨TR
- .%646! ADC CBM─ATA╠IMIT
- .%647! STA CBM─ATA╨TR
- .%648! BCC +
- .%649! INC CBM─ATA╨TR+1
- .%650! + SEC
- .%651! LDA CBM─ATA╠EN
- .%652! SBC CBM─ATA╠IMIT
-