home *** CD-ROM | disk | FTP | other *** search
- %
-
- ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
- FOR THE LAST CLUSTER OF THE FILE.
-
- % ;**GET NEXT CLUSTER
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR GET╞AT┼NTRY
- % STA CLUSTER
- % STY CLUSTER+1
- % CPY #$05
- % BCC COPY╞ILE├LUSTER─ATA
- % LDA LEN═╠
- % STA CBM─ATA╠EN
- % LDA #$01
- % LDX CLUSTER┬LOCK├OUNT
- % CPX #1
- % BEQ +
- % LDA #$03
- % + 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.
-
- % BNE +
- % LDX LEN═╠
- % BEQ COPY╞ILE├LUSTER─ATA
- % + STA CBM─ATA╠EN+1
- %
- % COPY╞ILE├LUSTER─ATA = *
- % JSR COMMIE╧UT
- % RTS
- %
-
- ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
-
- % CBM─ATA╠IMIT = $66
- %
- % 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.
-
- % LDX LFN
- % BNE +
- % CLC
- % RTS
-
- ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
-
- % + JSR KERNEL├HKOUT
- % BCC COMMIE╧UT═ORE
- % STA ERRNO
- % RTS
- %
-
- ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
- BYTES REMAINING IN THE CLUSTER.
-
- % COMMIE╧UT═ORE = *
- % LDA #255
- % LDX CBM─ATA╠EN+1
- % BNE +
- % LDA CBM─ATA╠EN
- % + STA CBM─ATA╠IMIT
- % LDY #0
- % - LDA (CBM─ATA╨TR),Y
- % BIT TRANS═ODE
- % 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).
-
- % TAX
- % LDA TRANS┬UF,X
- % BEQ COMMIE╬EXT
- % + JSR KERNEL├HROUT
- % COMMIE╬EXT = *
- % INY
- % CPY CBM─ATA╠IMIT
- % BNE -
- %
-
- ╔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.
-
- % CLC
- % LDA CBM─ATA╨TR
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╨TR
- % BCC +
- % INC CBM─ATA╨TR+1
- % + SEC
- % LDA CBM─ATA╠EN
- % SBC CBM─ATA╠IMIT
- % STA CBM─ATA╠EN
- % BCS +
- % DEC CBM─ATA╠EN+1
- % + LDA CBM─ATA╠EN
- % ORA CBM─ATA╠EN+1
- % BNE COMMIE╧UT═ORE
-
- ╔F WE ARE FINISHED WITH THE CLUSTER, THEN CLEAR THE ├┬═ ╦ERNAL OUTPUT CHANNEL.
-
- % JSR KERNEL├LRCHN
- % CLC
- % RTS
- %
-
- ╘HE FILE COPYING MAIN ROUTINE. ╙ET UP FOR THE STARTING CLUSTER, AND CALL
- THE CLUSTER COPYING ROUTINE UNTIL END-OF-FILE IS REACHED. ├HECKS FOR A
- ╬╒╠╠ CLUSTER POINTER IN THE DIRECTORY ENTRY TO HANDLE ZERO-LENGTH FILES.
-
- % MS╥EAD = * ;( CLUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
- % LDY #$0E
- % STY $FF00
- % STA TRANS═ODE
- % STX LFN
- % LDA START├LUSTER
- % LDY START├LUSTER+1
- % STA CLUSTER
- % STY CLUSTER+1
- % JMP +
- % - JSR COPY╞ILE├LUSTER
- % BCC +
- % RTS
- % + LDA CLUSTER+1
- % CMP #$05
- % BCC -
- % CLC
- % RTS
- %
- % IN╠FN = $50
- % GENERATE╠F = $51
- % CBM─ATA═AX = $52
- % REACHED┼OF = $54
- % PREV╙T = $55
- %
-
- ╙ET THE TRANSLATION AND INPUT LOGICAL FILE NUMBER AND SET UP FOR READING
- FROM A ├┬═-╦ERNAL INPUT FILE.
-
- % COMMIE╔N╔NIT = * ;( .┴=TRANS═ODE, .╪=IN╠FN )
- % STA TRANS═ODE
- % STX IN╠FN
- % LDA #0
- % STA GENERATE╠F
- % STA REACHED┼OF
- % STA PREV╙T
- % RTS
- %
-
- ╥EAD UP TO "CBM─ATA═AX" BYTES INTO THE SPECIFIED BUFFER FROM THE ESTABLISHED
- ├┬═ LOGICAL FILE NUMBER. ╘HE NUMBER OF BYTES READ IS RETURNED IN
- "CBM─ATA╠EN". ╔F END OF FILE OCCURS, "CBM─ATA╠EN" WILL BE ZERO AND THE .┌
- FLAG WILL BE SET. ╥EGULAR ERROR RETURN.
-
- % COMMIE╔N = * ;( CBM─ATA╨TR++, CBM─ATA═AX ) : CBM─ATA╠EN, .├╙=ERR, .┌=EOF
-
- ┼STABLISH INPUT FILE, OR RETURN IMMEDIATELY IF ALREADY PAST EOF.
-
- % LDA #0
- % STA CBM─ATA╠EN
- % STA CBM─ATA╠EN+1
- % LDX REACHED┼OF
- % BEQ +
- % LDA #0
- % CLC
- % RTS
- % + LDX IN╠FN
- % JSR KERNEL├HKIN
- % BCC COMMIE╔N═ORE
- % STA ERRNO
- % RTS
- %
-
- ╥EAD NEXT CHUNK OF UP TO 255 BYTES INTO INPUT BUFFER.
-
- % COMMIE╔N═ORE = *
- % LDA #255
- % LDX CBM─ATA═AX+1
- % BNE +
- % LDA CBM─ATA═AX
- % + STA CBM─ATA╠IMIT
- % LDY #0
- % - JSR COMMIE╔N┬YTE
- % BCC +
- % RTS
- % + BEQ +
- % STA (CBM─ATA╨TR),Y
- % INY
- % CPY CBM─ATA╠IMIT
- % BNE -
- %
-
- ╨REPARE TO READ ANOTHER CHUNK, OR EXIT.
-
- % + STY CBM─ATA╠IMIT
- % CLC
- % LDA CBM─ATA╨TR
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╨TR
- % BCC +
- % INC CBM─ATA╨TR+1
- % + CLC
- % LDA CBM─ATA╠EN
- % ADC CBM─ATA╠IMIT
- % STA CBM─ATA╠EN
- % BCC +
- % INC CBM─ATA╠EN+1
- % + SEC
- % LDA CBM─ATA═AX
- % SBC CBM─ATA╠IMIT
- % STA CBM─ATA═AX
- % BCS +
- % DEC CBM─ATA═AX+1
- % + LDA REACHED┼OF
- % BNE +
- % LDA CBM─ATA═AX
- % ORA CBM─ATA═AX+1
- % BNE COMMIE╔N═ORE
-
- ╙HUT DOWN READING AND EXIT.
-
- % + JSR KERNEL├LRCHN
- % LDA CBM─ATA╠EN
- % ORA CBM─ATA╠EN+1
- % CLC
- % RTS
- %
-
- ╥EAD A SINGLE BYTE FROM THE ├┬═-╦ERNAL INPUT LOGICAL FILE NUMBER. ╘RANSLATE
- CHARACTER INTO ┴╙├╔╔ AND EXPAND ├╥ INTO ├╥+╠╞ IF NECESSARY. ╥ETURN ┼╧╞ IF
- PREVIOUS CHARACTER RETURNED WAS LAST FROM DISK INPUT CHANNEL.
-
- % COMMIE╔N┬YTE = * ;( ) : .┴=CHAR, .├╙=ERR, .┌=EOF, REACHED┼OF
- % ;** CHECK FOR ALREADY PAST EOF
- % LDA REACHED┼OF
- % BEQ +
- % BRK
- % ;** CHECK FOR GENERATED LINEFEED
- % + LDA GENERATE╠F
- % BEQ +
- % LDA #0
- % STA GENERATE╠F
- % LDA #$0A
- % CLC
- % RTS
- % ;** CHECK FOR EOF
- % + LDA PREV╙T
- % AND #$40
- % BEQ +
- % LDA #$FF
- % STA REACHED┼OF
- % LDA #0
- % CLC
- % RTS
- % ;** READ ACTUAL CHARACTER
- % + JSR KERNEL├HRIN
- % LDX ST
- % STX PREV╙T
- % BCC +
- % STA ERRNO
- % JSR KERNEL├LRCHN
- % RTS
- % ;** TRANSLATE IF NECESSARY
- % + BIT TRANS═ODE
- % BPL +
- % TAX
- % LDA TRANS┬UF╘O┴SCII,X
- % BEQ COMMIE╔N┬YTE
-
- ╬OTE HERE THAT THE TRANSLATED CHARACTER IS CHECKED TO SEE IF IT IS A CARRIAGE
- RETURN, RATHER THAN CHECKING THE NON-TRANSLATED CHARACTER, TO SEE IF A
- LINEFEED MUST BE GENERATED NEXT. ╘HUS, YOU COULD DEFINE THAT A ├OMMODORE
- CARRIAGE RETURN BE TRANSLATED INTO A LINEFEED (FOR ╒NIX) AND NO ADDITIONAL
- UNWANTED LINEFEED WOULD BE GENERATED.
-
- % CMP #$0D
- % BNE +
- % STA GENERATE╠F
- % ;** EXIT
- % + LDX #$FF
- % CLC
- % RTS
- %
- % FIRST╞REE╞AT┼NTRY = $5A
- %
-
- ╙EARCH ╞┴╘ FOR A FREE CLUSTER, AND RETURN THE CLUSTER (╞┴╘ ENTRY) NUMBER. ┴
- GLOBAL VARIABLE "FIRST╞REE╞AR┼NTRY" IS MAINTAINED WHICH POINTS TO THE FIRST
- ╞┴╘ ENTRY THAT COULD POSSIBLY BE FREE, TO AVOID WASTING TIME SEARCHING FROM
- THE VERY BEGINNING OF THE ╞┴╘ EVERY TIME. ├LUSTERS ARE ALLOCATED IN
- FIRST-FREE ORDER.
-
- % ALLOCATE╞AT┼NTRY = * ;( ) : .┴┘=FAT┼NTRY, .├╙=ERR
- % - LDA FIRST╞REE╞AT┼NTRY
- % CMP LAST╞AT┼NTRY
- % LDA FIRST╞REE╞AT┼NTRY+1
- % SBC LAST╞AT┼NTRY+1
- % BCC +
- % RTS
- % + LDA FIRST╞REE╞AT┼NTRY
- % LDY FIRST╞REE╞AT┼NTRY+1
- % JSR GET╞AT┼NTRY
- % STY 2
- % ORA 2
- % BNE +
- % LDA FIRST╞REE╞AT┼NTRY
- % LDY FIRST╞REE╞AT┼NTRY+1
- % CLC
- % RTS
- % + INC FIRST╞REE╞AT┼NTRY
- % BNE -
- % INC FIRST╞REE╞AT┼NTRY+1
- % JMP -
- %
- % MS╞ILE╠ENGTH = $5C ;(3 BYTES)
- %
-
- ┴LLOCATE A NEW CLUSTER TO A FILE, LINK IT INTO THE FILE CLUSTER CHAIN, AND
- WRITE THE CLUSTER BUFFER TO DISK IN THAT CLUSTER, ADDING "CBM─ATA╠EN" BYTES
- TO THE FILE.
-
- % MS╫RITE├LUSTER = * ; (*) : .├╙=ERR
- % ;** GET A NEW CLUSTER
- % JSR ALLOCATE╞AT┼NTRY
- % BCC +
- % RTS
- % ;** MAKE PREVIOUS FAT ENTRY POINT TO NEW CLUSTER
- % + STA FAT╓ALUE
- % STY FAT╓ALUE+1
- % LDA CLUSTER
- % ORA CLUSTER+1
- % BEQ +
- % LDA CLUSTER
- % LDY CLUSTER+1
- % LDX FAT╓ALUE
- % STX CLUSTER
- % LDX FAT╓ALUE+1
- % STX CLUSTER+1
- % JSR SET╞AT┼NTRY
- % JMP MS├LUSTER╬EW
-
- ╚ANDLE CASE OF NO PREVIOUS CLUSTER - MAKE DIRECTORY ENTRY POINT TO NEW
- CLUSTER.
-
- % + LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDY #26
- % LDA FAT╓ALUE
- % STA (2),Y
- % STA CLUSTER
- % INY
- % LDA FAT╓ALUE+1
- % STA (2),Y
- % STA CLUSTER+1
- %
- % ;** MAKE NEW FAT ENTRY POINT TO NULL
- % MS├LUSTER╬EW = *
- % LDA #$FF
- % LDY #$0F
- % STA FAT╓ALUE
- % STY FAT╓ALUE+1
- % LDA CLUSTER
- % LDY CLUSTER+1
- % JSR SET╞AT┼NTRY
- % ;** WRITE NEW CLUSTER DATA
- % + LDA CLUSTER
- % LDY CLUSTER+1
- % JSR WRITE├LUSTER
- % BCC +
- % RTS
- % ;** ADD CLUSTER LENGTH TO FILE LENGTH
- % + CLC
- % LDA MS╞ILE╠ENGTH
- % ADC CBM─ATA╠EN
- % STA MS╞ILE╠ENGTH
- % LDA MS╞ILE╠ENGTH+1
- % ADC CBM─ATA╠EN+1
- % STA MS╞ILE╠ENGTH+1
- % BCC +
- % INC MS╞ILE╠ENGTH+2
- % + CLC
- % RTS
- %
-
- ├OPY A ├┬═-╦ERNAL FILE TO AN ═╙-─╧╙ FILE, POSSIBLY WITH TRANSLATION.
-
- % MS╫RITE = * ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN ) :.├╙=ERR
- % LDY #$0E
- % STY $FF00
- % ;** INITIALIZE
-
- ╙ET INPUT FILE TRANSLATION AND LOGICAL FILE NUMBER, INIT CLUSTER, FILE LENGTH,
- ╞┴╘ ALLOCATION FIRST FREE POINTER (TO CLUSTER #2, THE FIRST DATA CLUSTER).
-
- % JSR COMMIE╔N╔NIT
- % LDA #0
- % STA CLUSTER
- % STA CLUSTER+1
- % STA FIRST╞REE╞AT┼NTRY+1
- % STA MS╞ILE╠ENGTH
- % STA MS╞ILE╠ENGTH+1
- % STA MS╞ILE╠ENGTH+2
- % LDA #2
- % STA FIRST╞REE╞AT┼NTRY
- %
- % ;** COPY CLUSTER FROM CBM FILE
- % - LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA CLUSTER┬LOCK├OUNT
- % ASL
- % TAY
- % LDA #0
- % STA CBM─ATA═AX
- % STY CBM─ATA═AX+1
- % JSR COMMIE╔N
- % BCC +
- % RTS
- % + BEQ +
- % JSR MS╫RITE├LUSTER
- % BCC -
- % RTS
- %
- % ;** WRAP UP AFTER WRITING - SET FILE LENGTH, DIRTY FLAG, EXIT.
- % + LDA WRITE─IRENT
- % LDY WRITE─IRENT+1
- % STA 2
- % STY 3
- % LDX #0
- % LDY #28
- % - LDA MS╞ILE╠ENGTH,X
- % STA (2),Y
- % INY
- % INX
- % CPX #3
- % BCC -
- % JSR DIRTY─IRENT
- % CLC
- % RTS
- %
-
- ╘HIS LEVEL DEALS EXCLUSIVELY WITH ├OMMODORE FILES.
-
- % ;===== COMMODORE FILE LEVEL =====
- %
-
- ├OPY FROM AN INPUT DISK LOGICAL FILE NUMBER TO AN OUTPUT LFN, IN UP TO 1024
- BYTE CHUNKS. ╘HIS ROUTINE MAKES USE OF THE EXISTING "COMMIE╔N" AND
- "COMMIE╧UT" ROUTINES. ╬O FILE TRANSLATION IS AVAILABLE; BINARY TRANSLATION IS
- USED FOR BOTH COMMIE╔N AND COMMIE╧UT.
-
- % CBM├OPY = * ;( .┴=IN╠FN, .╪=OUT╠FN )
- % LDY #$0E
- % STY $FF00
- % STX LFN
- % TAX
- % LDA #0
- % JSR COMMIE╔N╔NIT
- % - LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % LDA #<1024
- % LDY #>1024
- % STA CBM─ATA═AX
- % STY CBM─ATA═AX+1
- % JSR COMMIE╔N
- % BCS +
- % BEQ +
- % LDA #<CLUSTER┬UF
- % LDY #>CLUSTER┬UF
- % STA CBM─ATA╨TR
- % STY CBM─ATA╨TR+1
- % JSR COMMIE╧UT
- % BCS +
- % JMP -
- % + RTS
- %
-
- ╥EAD A SINGLE DIRECTORY ENTRY FROM THE GIVEN LOGICAL FILE NUMBER, WHICH IS
- ASSUMED TO BE OPEN FOR READING A DIRECTORY ("$"). ╘HE DATA OF THE DIRECTORY
- ENTRY ARE RETURNED IN THE INTERFACE VARIABLES.
-
- % CBM─IRENT = * ;( .┴=LFN )
-
- ╔NITIALIZE.
-
- % LDY #$0E
- % STY $FF00
- % TAX
- % JSR KERNEL├HKIN
- % BCC +
- % CDIR┼RR = *
- % LDA #0
- % STA CDIR╞LEN
- % STA CDIR┬LOCKS
- % STA CDIR┬LOCKS+1
- % RTS
- % ;** GET BLOCK COUNT
- % + JSR CDIR╟ETCH
- % JSR CDIR╟ETCH
- % JSR CDIR╟ETCH
- % STA CDIR┬LOCKS
- % JSR CDIR╟ETCH
- % STA CDIR┬LOCKS+1
- % ;** LOOK FOR FILENAME
- % LDA #0
- % STA CDIR╞LEN
- % - JSR CDIR╟ETCH
- % CMP #34
- % BEQ +
- % CMP #"B"
- % BNE -
- % JSR KERNEL├LRCHN
- % RTS
- % ;** GET FILENAME
- % + LDY #0
- % - JSR CDIR╟ETCH
- % CMP #34
- % BEQ +
- % STA CDIR╬AME,Y
- % INY
- % BNE -
- % + STY CDIR╞LEN
-
- ╠OOK FOR AND GET FILE TYPE.
-
- % - JSR CDIR╟ETCH
- % CMP #" "
- % BEQ -
- % STA CDIR╘YPE
-
- ╙CAN FOR END OF DIRECTORY ENTRY, RETURN.
-
- % - JSR CDIR╟ETCH
- % CMP #0
- % BNE -
- % JSR KERNEL├LRCHN
- % RTS
- %
-
- ╟ET A SINGLE CHARACTER OF THE DIRECTORY ENTRY, WATCHING FOR END OF FILE (WHICH
- WOULD INDICATE ERROR HERE).
-
- % CDIR╟ETCH = *
- % JSR KERNEL├HRIN
- % BCS +
- % BIT ST
- % BVS +
- % RTS
- % + PLA
- % PLA
- % JSR KERNEL├LRCHN
- % JMP CDIR┼RR
- %
- % ;===== DATA =====
- %
-
- ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ┴╙├╔╔ TO ╨┼╘╙├╔╔. ┘OU CAN
- MODIFY IT TO SUIT YOUR NEEDS IF YOU WISH. ╔F YOU CANNOT REASSEMBLE THIS FILE,
- THEN YOU CAN SIFT THROUGH THE BINARY FILE AND LOCATE THE TABLE AND CHANGE IT
- THERE. ┴N ENTRY OF $00 MEANS THE CORRESPONDING ┴╙├╔╔ CHARACTER WILL NOT BE
- TRANSLATED. ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING
- ┴╙├╔╔ CONTROL CHARACTERS INTO ╨┼╘╙├╔╔: ┬ACKSPACE, ╘AB, ╠INEFEED (├╥), AND
- ╞ORMFEED. ╔ ALSO TRANSLATE THE NON-╨┼╘╙├╔╔ CHARACTERS SUCH AS {, |, ~, AND _
- ACCORDING TO WHAT THEY PROBABLY WOULD HAVE BEEN IF ├OMMODORE WASN'T SO
- CONCERNED WITH THE GRAPHICS CHARACTERS.
-
- % TRANS┬UF = *
- % ;0 1 2 3 4 5 6 7 8 9 A B C D E F
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
- % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
- % .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
- % .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
- % .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
- % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
- %
-
- ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ╨┼╘╙├╔╔ TO ┴╙├╔╔. ┘OU CAN
- MODIFY IT TO SUIT YOUR NEEDS, SIMILAR TO THE ┴╙├╔╔ TO ╨┼╘╙├╔╔ TABLE. ┴N ENTRY
- OF $00 MEANS THE CORRESPONDING ╨┼╘╙├╔╔ CHARACTER WILL NOT BE TRANSLATED.
- ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING ╨┼╘╙├╔╔
- CONTROL CHARACTERS INTO ┴╙├╔╔: ─ELETE (INTO ┬ACKSPACE), ╘AB, ├ARRIAGE ╥ETURN
- (INTO ├╥+╠╞), AND ├LEAR╙CREEN (INTO ╞ORDFEED). ┴PPROPRIATE TRANSLATIONS INTO
- THE ┴╙├╔╔ CHARACTERS {, }, ^, _, ~, \, AND | ARE ALSO SET UP.
-
- % TRANS┬UF╘O┴SCII = *
- % ;0 1 2 3 4 5 6 7 8 9 A B C D E F
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$00,$00,$00,$0D,$00,$00 ;0
- % .BYTE $00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
- % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
- % .BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
- % .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;6
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;7
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
- % .BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
- % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
- % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7E ;F
- %
- % ;====BSS STORAGE (SIZE=11,264 BYTES)====
- %
-
- ╘HIS IS WHERE THE TRACK CACHE, ETC. ARE STORED. ╘HIS SECTION REQUIRES 11╦ OF
- STORAGE SPACE BUT DOES NOT INCREASE THE LENGTH OF THE BINARY PROGRAM FILE
- SINCE THESE STORAGE AREAS ARE ─┼╞╔╬┼─ RATHER THAN ALLOCATED WITH ".BUF"
- DIRECTIVES. ╘HE ╒NIX TERMINOLOGY FOR THIS TYPE OF UNINITIALIZED DATA IS
- "BSS".
-
- % BSS = *
- % TRACKBUF = BSS
- % CLUSTER┬UF = TRACKBUF+4608
- % FATBUF = CLUSTER┬UF+1024
- % DIRBUF = FATBUF+1536
- % END = DIRBUF+4096
-
- 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
-
- ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM. ┘OU
- SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
- PREFERENCES IF YOU WISH. ╔N PARTICULAR, YOU MAY WISH TO CHANGE THE "DV" AND
- "DT" VARIABLES IN LINES 25 AND 26. ╘HIS PROGRAM IS NOT LISTED IN THE "%"
- FORMAT THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM
- THE UUENCODED BINARY PROGRAM FILE. ╘HE LISTING IS HERE IN ITS ENTIRETY.
-
- 10 PRINT CHR$(147);"LITTLE RED READER 128 VERSION 1.00"
- 11 PRINT : PRINT"BY CRAIG BRUCE 09-FEB-93 FOR C=HACKING" : PRINT
- 12 :
- 20 CD=PEEK(186):IF CD<8 THEN CD=8 : REM ** DEFAULT CBM-DOS DRIVE **
- 25 DV=9:DT=0 : REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
- 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
- 27 :
- 30 PRINT "INITIALIZING..." : PRINT
- 40 BANK0 : PK=DEC("8000") : PV=PK+30
- 50 IF PEEK(PV+0)=DEC("CB") AND PEEK(PV+1)=132 THEN 60
- 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
- 60 POKE PV+3,DV : POKE PV+4,DT : SYS PK
- 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
- 71 CM$="DMFTC+-Q "+CHR$(13)+CHR$(145)+CHR$(17)+CHR$(157)+CHR$(29)+CHR$(19)
- 72 CM$=CM$+CHR$(147)+"/RNX"+CHR$(92)
- 75 DL=-1 : CF=-1 : ME=0 : CA=0 : MA=0
- 80 DIM DI$(1,300),CL(128),SZ(128),DP(128),CN$(300)
- 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
- 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
- 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
- 120 GOTO 500
- 130 :
- 131 REM ** LOAD MS-DOS DIRECTORY **
- 140 PRINT"LOADING MS-DOS DIRECTORY..." : PRINT
- 150 SYS PK : SYS PK+3
- 160 DL=0
- 170 RREG BL,DC,BH,S : E=PEEK(PV+2)
- 180 IF (S AND 1) THEN GOSUB 380 : DL=-1 : RETURN
- 190 PRINT"SCANNING MS-DOS DIRECTORY..." : PRINT
- 200 DB=BL+256*BH
- 205 SYS PK+21 : RREG BL,X,BH : MA=BL+BH*256+X*65536
- 210 IF DC=0 THEN 360
- 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
- 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
- 240 IF PEEK(DP+11) AND 24 THEN 350
- 250 DL=DL+1
-
- ╠INE 260 SETS THE DEFAULT SELECTION, TRANSLATION, AND FILETYPES FOR ═╙-─╧╙
- FILES. ├HANGE TO YOUR LIKING.
-
- 260 D$=RIGHT$(" "+STR$(DL),3)+" ASC SEQ " : REM ** DEFAULT SEL/TR/FT **
- 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
- 280 A$=LEFT$(A$,8)+" "+RIGHT$(A$,3)
- 290 PRINT DL; A$
- 300 D$=D$+A$+" "
- 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
- 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
- 330 DI$(0,DL)=D$+RIGHT$(" "+STR$(SZ),6)
- 335 DP(DL)=DP
- 340 SZ(DL)=SZ
- 350 NEXT DP
- 360 RETURN
- 370 :
- 371 REM ** REPORT MS-DOS DISK ERROR **
- 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
- 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
- 400 GETKEY A$ : RETURN
- 410 :
- 411 REM ** SCREEN HEADING **
- 420 PRINT CHR$(147);CHR$(18);
- 421 IF ME=0 THEN PRINT"MS-DOS";:X=MA:ELSE PRINT"CBMDOS";:X=CA
- 422 PRINT CHR$(146);" MS=";MID$(STR$(DV),2);":";DT$;
- 430 PRINT" CBM=";MID$(STR$(CD),2);" FREE=";MID$(STR$(X),2)
- 440 PRINT : RETURN
- 450 :
- 451 REM ** SCREEN FOOTING **
- 460 PRINT IL$;"D=DIR M=MSDEV F=CBMDEV C=COPY Q=QUIT "
- 470 PRINT "T=TOGGLE R=REMOVE X=CBMCPY /=MENU +-=PG";
- 480 RETURN
- 490 :
- 491 REM ** MAIN ROUTINE **
- 500 T=1 : C=0
- 501 R=0
- 510 IF ME=0 THEN MF=DL:MC=2 : ELSE MF=CF:MC=1
- 520 GOSUB 420
- 521 IF ME<>0 THEN 542
- 530 PRINT "NUM S TRN TYP FILENAME EXT LENGTH"
- 540 PRINT "--- - --- --- -------- --- ------"
- 541 GOTO 550
- 542 PRINT "NUM S TRN FILENAME T LENGTH"
- 543 PRINT "--- - --- ---------------- - ------"
- 550 GOSUB 460
- 560 B=T+17 : IF B>MF THEN B=MF
- 570 PRINT FL$;: IF T>MF THEN 590
- 580 FOR I=T TO B : PRINT DI$(ME,I) : NEXT
- 590 IF MF<0 THEN PRINT CHR$(18);"<DIRECTORY NOT LOADED>";CHR$(146)
- 591 IF MF=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
- 600 IF MF<=0 THEN 660
- 610 PRINT LEFT$(IL$,R+5);CHR$(18);
- 620 ON C+1 GOTO 630,640,650
- 630 PRINT SPC(4);MID$(DI$(ME,T+R),5,3) : GOTO 660
- 640 PRINT SPC(7);MID$(DI$(ME,T+R),8,5) : GOTO 660
- 650 PRINT SPC(12);MID$(DI$(ME,T+R),13,5) : GOTO 660
- 660 GETKEY A$
- 670 I=INSTR(CM$,A$)
- 680 IF MF>0 THEN PRINT LEFT$(IL$,R+5);DI$(ME,T+R)
- 690 IF I=0 THEN 600
- 700 ON I GOTO 760,1050,1110,950,1150,1000,1020,730,860,860,770,790,810,830,850
- 705 ON I-15 GOTO 500,713,1400,713,1500,713
- 710 STOP
- 711 :
- 712 REM ** VARIOUS MENU OPTIONS **
- 713 ME=-(ME=0)
- 714 GOTO500
- 730 PRINT CHR$(147);"HAVE AN AWESOME DAY." : BANK15
- 740 END
- 760 IF ME=1 THEN GOSUB 420 : GOSUB 2500 : GOTO 500
- 765 GOSUB 420 : GOSUB 140 : GOTO 500
- 770 R=R-1 : IF R<0 THEN R=B-T
- 780 GOTO 600
- 790 R=R+1 : IF T+R>B THEN R=0
- 800 GOTO 600
- 810 C=C-1 : IF C<0 THEN C=MC
- 820 GOTO 600
- 830 C=C+1 : IF C>MC THEN C=0
- 840 GOTO 600
- 850 R=0 : C=0 : GOTO 600
- 860 IF MF<=0 THEN 600
- 870 X=T+R : ON C+1 GOSUB 890,910,930
- 880 PRINT LEFT$(IL$,R+5);DI$(ME,X) : GOTO 600
- 890 IF MID$(DI$(ME,X),6,1)=" " THEN X$="*" :ELSE X$=" "
- 900 MID$(DI$(ME,X),6,1)=X$ : RETURN
- 910 IF MID$(DI$(ME,X),9,1)="A" THEN X$="BIN" :ELSE X$="ASC"
- 920 MID$(DI$(ME,X),9,3)=X$ : RETURN
- 930 IF MID$(DI$(ME,X),14,1)="S" THEN X$="PRG" :ELSE X$="SEQ"
- 940 MID$(DI$(ME,X),14,3)=X$ : RETURN
- 950 IF MF<=0 THEN 600
- 960 FOR X=1 TO MF
- 970 ON C+1 GOSUB 890,910,930
- 980 NEXT X
- 990 GOTO 520
- 1000 R=0:IF B=MF THEN T=1 : GOTO 510
- 1010 T=T+18 : GOTO 510
- 1020 IF MF<=0 THEN 660
- 1025 R=0:IF T=1 THEN T=MF-(MF-INT(MF/18)*18)+1 : IF T<=MF THEN 510
- 1030 T=T-18 : IF T<1 THEN T=1
- 1040 GOTO 510
- 1050 PRINT IL$;CHR$(27);"@";
- 1060 INPUT"MS-DOS DEVICE NUMBER (8-30)";DV
- 1061 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1060
- 1070 X=71 : INPUT"MS-DOS DEVICE TYPE (71/81)";X
- 1080 IF X=8 OR X=81 OR X=1581 THEN DT=255:DT$="1581" :ELSE DT=0:DT$="1571"
- 1090 POKE PV+3,DV : POKE PV+4,DT : SYS PK : DL=-1 : MA=0
- 1100 GOTO 500
- 1110 PRINT IL$;CHR$(27);"@";
- 1120 INPUT "CBM-DOS DEVICE NUMBER (0-30)";CD
- 1130 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1120
- 1140 CF=-1 : CA=0 : GOTO 500
- 1141 :
-