00010 ;System equates used
00020 DOSVEC = $0A
00030 DOSINI = $0C
00040 POKMSK = $10
00050 RTCLOK = $12
00060 ROWCRS = $54
00070 COLCRS = $55
00080 SAVMSC = $58
00090 CDTMA1 = $0226
00100 DVSTAT = $02EA
00110 CRSINH = $02F0
00120 CH     = $02FC
00130 DDEVIC = $0300
00140 DUNIT  = $0301
00150 DCOMND = $0302
00160 DSTATS = $0303
00170 DBUFLO = $0304
00180 DBUFHI = $0305
00190 DTIMLO = $0306
00200 DBYTLO = $0308
00210 DBYTHI = $0309
00220 DAUX1  = $030A
00230 DAUX2  = $030B
00240 TSTAT  = $0319
00250 ICCOM  = $0342
00260 ICBAL  = $0344
00270 ICBAH  = $0345
00280 ICBLL  = $0348
00290 ICBLH  = $0349
00300 ICAX1  = $034A
00310 IC1HID  = $0350
00320 IC1COM  = $0352
00330 IC1BAL  = $0354
00340 IC1BAH  = $0355
00350 IC1BLL  = $0358
00360 IC1BLH  = $0359
00370 IC1AX1  = $035A
00380 IC1AX2  = $035B
00390 IC2COM  = $0362
00400 IC2BAL  = $0364
00410 IC2BAH  = $0365
00420 IC2BLL  = $0368
00430 IC2BLH  = $0369
00440 IC2AX1  = $036A
00450 CONSOL  = $D01F
00460 SERIN  = $D20D
00470 IRQST  = $D20E
00480 SKSTAT = $D20F
00490 AUDF1  = $D200
00500 AUDC1  = $D201
00510 AUDF3  = $D204
00520 AUDF4  = $D206
00530 AUDC4  = $D207
00540 AUDCTL = $D208
00550 SKRES  = $D20A
00560 SEROUT = $D20D
00570 IRQEN  = $D20E
00580 SKCTL  = $D20F
00590 PORTB  = $D301
00600 PBCTL  = $D303
00610 WSYNC  = $D40A
00620 AFP    = $D800 ; Convert ASCII to FP
00630 FPI    = $D9D2 ; Convert FP to integer
00640 EDITRV = $E400
00650 KEYBDV = $E420
00660 CIOV   = $E456
00670 SIOV   = $E459
00680 SETVBV = $E45C
00690 XITVBV = $E462
00700 COLDSV = $E477
00710 ;End of system equates
00720 ;Zero-page equates
00730 BNKMEM  = $80
00740 Z0245  = $82
00750 Z0246  = $84
00760 CNT256  = $85 ; two byte count of 256 byte blocks
00770 BANKCD  = $87 ; Ram bank selection
00780 BNKFLG  = $88 ; 0 = Regular memory 1 = Bank memory active
00790 BANKID  = $89 ; Ram bank selection
00800 SECOND  = $8A ; 0 = First buffer load, >1 Second buffer load or more
00810 SECLO  = $8B ; two byte sector number
00820 ERRORS  = $8D ; two byte error count
00830 DRIVE    = $8F
00840 DENSITY  = $90 ; 1=Single 2=Double 3=Enhanced
00850 SECIDX  = $91 ; Index for sector table
00860 SRCEOF  = $91 ; End of file flag for copy
00870 COMMAND = $92
00880 SECBEG  = $93 ; two byte sector number begin of block?
00890 SECSIZ  = $95 ; two byte sector size
00900 SECTOR  = $97 ; two byte sector number
00910 LARGE   = $99 ; 0 small files / 1 large file
00920 PASS    = $9A ; Number of passes
00930 FSLEN  = $9B
00940 WORK9B = $9B
00950 WORK9C = $9C
00960 WORK9D = $9D
00970 BYTTOT  = $9E
00980 STATUS = $A0 ; Status value; storage shared with variables below
00990 DOSVER = $A0 ; DOS version 0=DOS 2.0 / 1=DOS 2.5
01000 WORKA0 = $A0
01010 BANKSW  = $A1 ; Bankswitch for sector data
01020 WORKA1 = $A1
01030 WRTIDX  = $A1 ; Sector table index for writing
01040 MAXLEN  = $A2 ; Maximum position for increment filespec
01050 INCSPC  = $A3 ; Offset into filespec for increment filespec
01060 RENFLG  = $A4 ; Rename command flag
01070 Z0042  = $A5
01080 Z0043  = $A6
01090 Z0072  = $A7
01100 Z0052  = $A8
01110 SECBUF = $A9 ; Two byte buffer pointer for sector buffer
01120 WRKBUF = $AB ; Two byte buffer pointer
01130 BUFOUT = $AD ; two byte output buffer pointer
01140 Z0265  = $AF
01150 Z0267  = $B0
01160 Z0255  = $B1 ; save portb bits
01170 Z0315  = $B3
01180 SEQFLG  = $B4 ; #$00 is skip to sector, #$80 is sequential write
01190 BYTCNT  = $B5
01200 DENSRQ  = $B7 ; Density required
01210 ; Work fields, occupy same space as drive config record
01220 WORKLO     = $B8
01230 WORKHI     = $B9
01240 WORKBA     = $BA
01250 WORKBB     = $BB
01260 WORKBC     = $BC
01270 ; 12 byte buffer for drive config
01280 Z0037      = $B8 ; tracks 40
01290 Z0038      = $B9 ; steprate 1
01300 CFGSECHI   = $BA ; sectors hi 0
01310 CFGSEC     = $BB ; sectors lo 18/26
01320 CFGHDS     = $BC
01330 CFGMODE    = $BD ; Recording 0=FM/4=MFM
01340 CFGSIZEHI  = $BE ; Bytes/sector hi 1=256/0=128
01350 CFGSIZE    = $BF ; Bytes/sector lo 0=256/128=128
01360 ERRNUM  = $C4
01370 Z0317  = $C8 ; #$05 do not use extra ram
01380 FR0  = $D4
01390 Z0599  = $E0
01400 ERRFLG  = $F0
01410 CHKSUM  = $F1
01420 SERBUF  = $F2
01430 SERLEN  = $F4
01440 Z0630  = $F5
01450 Z0598  = $F6
01460 Z0624  = $F7
01470 Z0662  = $F8
01480 Z0665  = $F9
01490 Z0663  = $FA
01500 Z0664  = $FB
01510 Z0623  = $FC
01520 SPEED  = $FE
01530 NOISE  = $FF
01540 ;External reference equates
01550 L2400  = $2400 ; Buffer for sector I/O
01560 L2E00  = $2E00 ; Buffer for previous sector contents
01570 L2E78  = $2E78
01580 L2F00  = $2F00
01590 L2F01  = $2F01
01600 L104B  = $104B
01610 L10B2  = $10B2
01620        .ORG $9000
01630 MAXSEC .WORD 720
01640 ENDSEC .WORD 720
01650 SRCDRV .BYTE $01 ; source drive
01660 SRCDEN .BYTE $01
01670 DSTDRV .BYTE $01 ; destination drive
01680 DSTDEN .BYTE $01
01690 WRTCMD .BYTE $50 ; write verify/noverify
01700 FISPCD .BYTE $00,$00,$00
01710        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01720        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01730        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01740        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01750 FISPEC .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01760        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01770        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01780        .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01790 TABCNT .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
01800        .BYTE $00,$00,$00,$00,$00,$00,$00,$00
01810 L906E  .BYTE $00,$00
01820 USEBNK .BYTE $01 ; Default is 1, use banks, set to 0 if not available
01830 TABBNK .BYTE $E0,$E4,$E8,$EC
01840        .BYTE $00,$00,$00,$00,$00
01850        .BYTE $00,$00,$00,$00,$00,$00,$00
01860 L9081  .BYTE $01
01870 ;
01880 ; Display list
01890 ;
01900 L9082  .BYTE $70,$70,$40,$42
01910 L9086  .BYTE #L90D6
01920 L9087  .BYTE /L90D6
01930        .BYTE $20,$42
01940        .WORD L90AE
01950        .BYTE $10,$42
01960        .WORD L9126
01970        .BYTE $00,$02,$00,$02,$00,$42
01980 L9096  .BYTE $00,$00 ; Start address of screen ram stored here
01990        .BYTE $02,$02,$02,$02,$02,$02,$02,$02,$02,$02
02000        .BYTE $02,$02,$02,$02,$42
02010 DATAWIN .WORD $2400
02020        .BYTE $02,$02,$41
02030        .WORD L9082
02040 L90AE  .SBYTE +$80 "  Status: "
02050 L90B8  .SBYTE +$80 "        "
02060 L90C0  .SBYTE +$80 "         "
02070 L90C9  .SBYTE +$80 "      "
02080        .SBYTE +$80 "       "
02090 L90D6  .SBYTE +$80 "  Disk Communicator "
02100        .SBYTE +$80 "3!  By Robert Puff  "
02110 L90FE  .SBYTE +$80 "   Version 3.2  12/8"
02120        .SBYTE +$80 "7  Public Domain   "
02130 L9126  .SBYTE +$80 "  Current Sector:"
02140        .SBYTE +$80 "0000"
02150        .SBYTE +$80 "     Errors:"
02160        .SBYTE +$80 "0000"
02170        .SBYTE +$80 "     Source DRV:"
02180 L915B  .SBYTE +$80 "1"
02190        .SBYTE +$80 " "
02200 L915D  .SBYTE +$80 "   "
02210        .SBYTE +$80 "    Dest. DRV:"
02220 L916E  .SBYTE +$80 "1"
02230        .SBYTE +$80 " "
02240 L9170  .SBYTE +$80 "   "
02250        .SBYTE +$80 "   "
02260        .SBYTE +$80 "  Max Sector:"
02270        .SBYTE +$80 "0000"
02280        .SBYTE +$80 "  Pass:"
02290 L918E  .SBYTE +$80 "1"
02300        .SBYTE +$80 "Verify:"
02310 L9198  .SBYTE +$80 "OFF   "
02320 RDSTAT STX DUNIT ;$0301
02330 L91A1  LDA #$53 ; Status request
02340        STA DCOMND ;$0302
02350        LDA #$40 ; read data
02360        STA DSTATS ;$0303
02370        STA DTIMLO ;$0306
02380        LDA #DVSTAT
02390        STA DBUFLO ;$0304
02400        LDA /DVSTAT
02410        STA DBUFHI ;$0305
02420        LDA #$00
02430        STA DBYTHI ;$0309
02440        LDA #$04
02450        STA DBYTLO ;$0308
02460        JSR SIOCMD ;$B831
02470        BPL L91D1 ;$91D1
02480        CPY #139 ; Device NAK
02490        BEQ L91A1 ;$91A1 retry
02500        LDA #$01 ; single density
02510        LDX DUNIT ;$0301
02520        RTS
02530 L91D1  LDA DVSTAT ;$02EA
02540        AND #$20 ; mask with double density
02550        BNE L91E2 ;$91E2
02560        LDA DVSTAT ;$02EA
02570        AND #$80 ; mask with enhanced density
02580        BNE L91E5 ;$91E5
02590        LDA #$01 ; single density
02600        .BYTE #$2C ; Fake BIT instruction
02610 L91E2  LDA #$02 ; Double density
02620        .BYTE #$2C ; Fake BIT instruction
02630 L91E5  LDA #$03 ; Enhanced density
02640        LDX DUNIT ;$0301
02650        JMP RDCFG ;$91ED
02660 RDCFG  STX DUNIT ;$0301
02670        STA DENSRQ ;$00B7
02680        LDA #$4E ; Read disk config
02690        STA DCOMND ;$0302
02700        LDA #$40 ; read data
02710        STA DSTATS ;$0303
02720        LDA #$0C ; Config table is 12 bytes
02730        STA DBYTLO ;$0308
02740        LDA #$B8
02750        STA DBUFLO ;$0304
02760        LDA #$00
02770        STA DBUFHI ;$0305
02780        LDA #$00
02790        STA DBYTHI ;$0309
02800        JSR SIOCMD ;$B831
02810        BMI L927B ;$927B
02820        LDA CFGSEC ;$00BB
02830        CMP #18 ; 18 sectors?
02840        BEQ L9222 ;$9222
02850        CMP #26 ; 26 sectors?
02860        BEQ L9222 ;$9222
02870        LDY #$01 ; Non-standard sectors per track
02880        .BYTE #$2C ; Fake BIT instruction
02890 L9222  LDY #$00 ; 18 or 26 sectors per track
02900        LDA DENSRQ ;$00B7
02910        CMP #$01 ; Single?
02920        BNE L923F ;$923F
02930        LDA #$00 ; FM recording
02940        STA CFGMODE ;$00BD
02950        STA CFGSIZEHI ;$00BE
02960        CPY #$01 ; Non-standard sectors per track?
02970        BEQ L9238 ;$9238
02980        LDA #18 ; 18 sectors
02990        STA CFGSEC ;$00BB
03000 L9238  LDA #128 ; 128 bytes per sector
03010        STA CFGSIZE ;$00BF
03020        JMP WRCFG ;$9266
03030 L923F  LDX #$04 ; MFM recording
03040        STX CFGMODE ;$00BD
03050        CMP #$02 ; Double density
03060        BNE L9256 ;$9256
03070        LDA #18 ; 18 sectors
03080        STA CFGSEC ;$00BB
03090        LDA #$01 ; 256 bytes per sector
03100        STA CFGSIZEHI ;$00BE
03110        LDA #$00
03120        STA CFGSIZE ;$00BF
03130        JMP WRCFG ;$9266
03140 L9256  CPY #$01 ; Non-standard sectors per track?
03150        BEQ L925E ;$925E
03160        LDA #26 ; 26 sectors per track
03170        STA CFGSEC ;$00BB
03180 L925E  LDA #128 ; 128 bytes per sector
03190        STA CFGSIZE ;$00BF
03200        LDA #$00
03210        STA CFGSIZEHI ;$00BE
03220 WRCFG  LDA #$4F ; Write drive config
03230        STA DCOMND ;$0302
03240        LDA #$80 ; write data
03250        STA DSTATS ;$0303
03260        LDA #$00
03270        STA DAUX1 ;$030A
03280        STA DAUX2 ;$030B
03290        JSR SIOCMD ;$B831
03300 L927B  LDA DENSRQ ;$00B7
03310        LDX DUNIT ;$0301
03320        RTS
03330 ;
03340 ; Entry point
03350 ;
03360 L9281  LDX #$01
03370        JSR RDSTAT ;$919E
03380        JSR SHWSDN ;$928F
03390        JSR SHWDDN ;$92BD
03400        JMP GOMENU ;$97B3
03410 SHWSDN STA DENSRQ ;$00B7
03420        TXA
03430        PHA
03440        ORA #$90 ; Drive number inverse video
03450        STA L915B ;$915B Source drive
03460        LDY DENSRQ ;$00B7
03470        DEY ; Four characters per density description
03480        TYA
03490        ASL
03500        ASL
03510        TAY
03520        LDX #$00
03530 L92A1  LDA L92B2,Y ;$92B2 SNG DBL ENH
03540        STA L915D,X ;$915D Source disk density
03550        INY
03560        INX
03570        CPX #$03
03580        BCC L92A1 ;$92A1
03590        PLA
03600        TAX
03610        LDA DENSRQ ;$00B7
03620        RTS
03630 L92B2  .BYTE +$80 "SNG DBL ENH"
03640 SHWDDN STA DENSRQ ;$00B7
03650        TXA
03660        PHA
03670        ORA #$90 ; Drive number inverse video
03680        STA L916E ;$916E Destination drive
03690        LDY DENSRQ ;$00B7
03700        DEY ; Four characters per density description
03710        TYA
03720        ASL
03730        ASL
03740        TAY
03750        LDX #$00
03760 L92CF  LDA L92B2,Y ;$92B2 SNG DBL ENH
03770        STA L9170,X ;$9170 Destination disk density
03780        INY
03790        INX
03800        CPX #$03
03810        BCC L92CF ;$92CF
03820        PLA
03830        TAX
03840        LDA DENSRQ ;$00B7
03850        RTS
03860 SHWPASS LDA PASS ;$009A
03870        AND #$1F
03880        CLC
03890        ADC #$90 ; Make it inverse video
03900        STA L918E ;$918E Pass count
03910        RTS
03920 ;
03930 ; Format output disk
03940 ;
03950 L92EB  CMP #$01 ; Single density?
03960        BEQ L9305 ;$9305
03970        CMP #$02 ; Double density?
03980        BEQ L92FC ;$92FC
03990        LDA #$22 ; Format enhanced density
04000        LDX #$80
04010        LDY #$00
04020        JMP L930B ;$930B
04030 L92FC  LDA #$21 ; Format
04040        LDX #$00
04050        LDY #$01 ; Select double density
04060        JMP L930B ;$930B
04070 L9305  LDA #$21 ; Format single/enhanced density
04080        LDX #$80 ; Force single density
04090        LDY #$00
04100 L930B  STA DCOMND ;$0302
04110        STX DBYTLO ;$0308
04120        STY DBYTHI ;$0309
04130        LDX #$90
04140        STX DTIMLO ;$0306
04150        LDX #$40 ; read data
04160        STX DSTATS ;$0303
04170        LDA #$00
04180        STA DBUFLO ;$0304
04190        LDA #$2E
04200        STA DBUFHI ;$0305
04210        JMP SIOCMD ;$B831
04220 ;
04230 ; Show number in A low byte X high byte at offset Y.
04240 ;
04250 SHWNUM STA WORKLO ;$00B8
04260        STX WORKHI ;$00B9
04270        INY
04280        STY WORKBA ;$00BA
04290        DEY
04300        LDA #$90 ; '0' inverse video
04310        LDX #$00
04320 L9337  STA L9126,Y ;$9126
04330        INY
04340        INX
04350        CPX #$04
04360        BCC L9337 ;$9337
04370        LDX WORKBA ;$00BA
04380        DEX
04390        LDA #$26
04400        CLC
04410        ADC WORKBA ;$00BA
04420        STA Z0042 ;$00A5
04430        LDA #$91
04440        ADC #$00
04450        STA Z0043 ;$00A6
04460 L9350  LDA WORKLO ;$00B8
04470        SEC
04480        SBC #1000 ; #$E8
04490        STA WORKBB ;$00BB
04500        LDA WORKHI ;$00B9
04510        SBC /1000 ; #$03
04520        ORA WORKBB ;$00BB
04530        BEQ L9361 ;$9361
04540        BCC L9374 ;$9374
04550 L9361  LDA WORKLO ;$00B8
04560        SEC
04570        SBC #1000 ; #$E8
04580        STA WORKLO ;$00B8
04590        LDA WORKHI ;$00B9
04600        SBC /1000 ; #$03
04610        STA WORKHI ;$00B9
04620        INC L9126,X ;$9126
04630        JMP L9350 ;$9350
04640 L9374  LDX WORKHI ;$00B9
04650        LDA WORKLO ;$00B8
04660        LDY #$00
04670 L937A  CMP L939C,Y ;$939C
04680        BCC L938E ;$938E
04690 L937F  SBC L939C,Y ;$939C
04700        PHA
04710        LDA (Z0042),Y ;$00A5
04720        CLC
04730        ADC #$01
04740        STA (Z0042),Y ;$00A5
04750        PLA
04760        CLC
04770        BCC L937A ;$937A
04780 L938E  CPX #$FF
04790        BEQ L9396 ;$9396
04800        SEC
04810        DEX
04820        BPL L937F ;$937F
04830 L9396  INY
04840        CPY #$03
04850        BNE L937A ;$937A
04860        RTS
04870 L939C  .BYTE #100,#10,#1
04880 ;
04890 ; Print a character to the screen
04900 ;
04910 PRTCHR TAY
04920        LDA EDITRV+7 ;$E407
04930        PHA
04940        LDA EDITRV+6 ;$E406
04950        PHA
04960        TYA
04970        RTS
04980 GETCHR JSR KBSTAT ;$93B2
04990        CPY #$80
05000        BCS GETCHR ;$93AA
05010        RTS
05020 KBSTAT LDA KEYBDV+5 ;$E425
05030        PHA
05040        LDA KEYBDV+4 ;$E424
05050        PHA
05060 L93BA  RTS
05070 ;
05080 ; Print a string to the screen
05090 ;
05100 PRTSTR STX Z0042 ;$00A5
05110        STY Z0043 ;$00A6
05120 L93BF  LDY #$00
05130        LDA (Z0042),Y ;$00A5
05140        BEQ L93BA ;$93BA
05150 L93C5  JSR PRTCHR ;$939F
05160        CPY #$80
05170        BEQ L93C5 ;$93C5
05180        INC Z0042 ;$00A5
05190        BNE L93BF ;$93BF
05200        INC Z0043 ;$00A6
05210        BNE L93BF ;$93BF
05220 L93D4  .BYTE $7D,$9B,$20,$11
05230        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05240        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05250        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05260        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05270        .BYTE $05,$9B
05280        .BYTE $20,$7C
05290        .BYTE "     - "
05300        .BYTE "Disk Comm Main Menu"
05310        .BYTE " -    "
05320        .BYTE $7C,$9B
05330        .BYTE $20,$01
05340        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05350        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05360        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05370        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05380        .BYTE $04,$9B
05390        .BYTE $20,$7C,$20,$99
05400        .BYTE +$80 "[A]"
05410        .BYTE $19,$20
05420        .BYTE "Turn Disk into "
05430        .BYTE "file(s)   "
05440        .BYTE $7C,$9B
05450        .BYTE $20,$7C,$20,$99
05460        .BYTE +$80 "[B]"
05470        .BYTE $19,$20
05480        .BYTE "Turn File(s) "
05490        .BYTE "into disk   "
05500        .BYTE $7C,$9B
05510        .BYTE $20,$7C,$20,$99
05520        .BYTE +$80 "[C]"
05530        .BYTE $19,$20
05540        .BYTE "Change Source "
05550        .BYTE "drive      "
05560        .BYTE $7C,$9B
05570        .BYTE $20,$7C,$20,$99
05580        .BYTE +$80 "[D]"
05590        .BYTE $19,$20
05600        .BYTE "Change Dest. "
05610        .BYTE "drive       "
05620        .BYTE $7C,$9B
05630        .BYTE $20,$7C,$20,$99
05640        .BYTE +$80 "[E]"
05650        .BYTE $19,$20
05660        .BYTE "Change Verify "
05670        .BYTE "option     "
05680        .BYTE $7C,$9B
05690        .BYTE $20,$7C,$20,$99
05700        .BYTE +$80 "[F]"
05710        .BYTE $19,$20
05720        .BYTE "DOS Functions "
05730        .BYTE "           "
05740        .BYTE $7C,$9B
05750        .BYTE $20,$7C,$20,$99
05760        .BYTE +$80 "[G]"
05770        .BYTE $19,$20
05780        .BYTE "Cause Coldstart "
05790        .BYTE "(Reboot) "
05800        .BYTE $7C,$9B
05810        .BYTE $20,$7C,$20,$99
05820        .BYTE +$80 "[H]"
05830        .BYTE $19,$20
05840        .BYTE "Change maximum "
05850        .BYTE "sector    "
05860        .BYTE $7C,$9B
05870        .BYTE $20,$7C,$20,$99
05880        .BYTE +$80 "[1-9]"
05890        .BYTE $19,$20
05900        .BYTE "Disk Directories "
05910        .BYTE "      "
05920        .BYTE $7C,$9B
05930        .BYTE $20,$1A
05940        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05950        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05960        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05970        .BYTE $12,$12,$12,$12,$12,$12,$12,$12
05980        .BYTE $03,$9B
05990        .BYTE $00
06000 BELL   LDA #$00
06010        STA AUDCTL ;$D208
06020        LDA #$25
06030        STA AUDF1 ;$D200
06040        LDY #$B0
06050 L95B7  LDX #$FF
06060 L95B9  STX WSYNC ;$D40A
06070        DEX
06080        BNE L95B9 ;$95B9
06090        DEY
06100        STY AUDC1 ;$D201
06110        CPY #$A0
06120        BNE L95B7 ;$95B7
06130        RTS
06140 ;
06150 ; Convert byte to uppercase
06160 ;
06170 TOUPPR AND #$7F
06180        CMP #$60
06190        BCC L95D0 ;$95D0
06200        SBC #$20
06210 L95D0  RTS
06220 ;
06230 ; Main menu routine
06240 ;
06250 DOMENU LDA #$01
06260        STA CRSINH ;$02F0
06270        LDX #L93D4
06280        LDY /L93D4
06290        JSR PRTSTR ; Main menu
06300        LDA #$00
06310        STA CRSINH ;$02F0
06320 L95E2  JSR GETCHR ;$93AA
06330        JSR TOUPPR ;$95C8
06340        LDX #25
06350 L95EA  CMP TABOPT,X ;$9609 Test option valid
06360        BEQ L95F5 ;$95F5
06370        DEX
06380        BPL L95EA ;$95EA
06390        JMP L95E2 ; Invalid option key
06400 L95F5  TAY
06410        CPX #8 ; A through H?
06420        BCC L95FC ;$95FC
06430        LDX #8
06440 L95FC  TXA
06450        ASL
06460        TAX
06470        LDA TABRTN+1,X ;$9624
06480        PHA
06490        LDA TABRTN,X ;$9623
06500        PHA
06510        TYA
06520        RTS
06530 TABOPT .BYTE "ABCDEFGH12345678"
06540        .BYTE $21,$22,$23,$24,$25,$26,$27
06550        .BYTE $40,$39,$28
06560 TABRTN .WORD L97E7-1 ; Turn disk into files
06570        .WORD LB14C-1 ; Turn files into disk
06580        .WORD L9635-1 ; Change source drive
06590        .WORD L9651-1 ; Change destination drive
06600        .WORD L9674-1 ; Change verify option
06610        .WORD L96A8-1 ; DOS functions
06620        .WORD L96AE-1 ; Cause coldstart
06630        .WORD LA85D-1 ; Change maximum sector
06640        .WORD L96A2-1 ; Disk directories
06650 ;
06660 ; Change Source drive
06670 ;
06680 L9635  INC SRCDRV ;$9004
06690        LDA SRCDRV ;$9004
06700        CMP #10
06710        BCC L9644 ;$9644
06720        LDA #1
06730        STA SRCDRV ;$9004
06740 L9644  TAX
06750        LDA SRCDEN ;$9005
06760        JSR SHWSDN ;$928F
06770        JSR BELL ;$95AB
06780        JMP L95E2 ;$95E2
06790 ;
06800 ; Change Dest. drive
06810 ;
06820 L9651  INC DSTDRV ;$9006
06830        LDA DSTDRV ;$9006
06840        CMP #10
06850        BCC L9660 ;$9660
06860        LDA #1
06870        STA DSTDRV ;$9006
06880 L9660  TAX
06890        LDA DSTDEN ;$9007
06900        BNE L966B ;$966B
06910        LDA #$01
06920        STA DSTDEN ;$9007
06930 L966B  JSR SHWDDN ;$92BD
06940        JSR BELL ;$95AB
06950        JMP L95E2 ;$95E2
06960 ;
06970 ; Verify option
06980 ;
06990 L9674  LDA WRTCMD ;$9008
07000        EOR #$07 ; Toggle verify bit
07010        STA WRTCMD ;$9008
07020 L967C  STA L967C ;$967C Patched at startup
07030        AND #$07 ; Is verify set?
07040        BEQ L9686 ;$9686
07050        LDX #$00
07060        .BYTE #$2C ; Fake BIT instruction
07070 L9686  LDX #$03
07080        LDY #$00
07090 L968A  LDA L969C,X ;$969C
07100        STA L9198,Y ;$9198
07110        INX
07120        INY
07130        CPY #$03
07140        BCC L968A ;$968A
07150        JSR BELL ;$95AB
07160        JMP L95E2 ;$95E2
07170 L969C  .BYTE AFAE81AF
07180 ;
07190 ; Other commands from main menu
07200 ;
07210 L96A2  JSR DOCMND ;$A6CD
07220        JMP GOMENU ;$97B3
07230 ;
07240 ; DOS functions
07250 ;
07260 L96A8  JSR DOSFNS ;$AAD4
07270        JMP GOMENU ;$97B3
07280 ;
07290 ; Cause Coldstart (Reboot)
07300 ;
07310 L96AE  JMP COLDSV ;$E477
07320 ;
07330 ; VB interrupt routine
07340 ;
07350 L96B1  LDA RTCLOK+1 ;$0013
07360        AND #$01
07370        BNE L96BD ;$96BD
07380        LDX #L90D6 ;Disk communicator
07390        LDY /L90D6
07400        BNE L96C1 ;$96C1
07410 L96BD  LDX #L90FE ;Version 3.2
07420        LDY /L90FE
07430 L96C1  STX L9086 ;$9086 update display list
07440        STY L9087 ;$9087
07450        JMP XITVBV ;$E462
07460 L96CA  LDA #$07
07470        LDX /L96B1
07480        LDY #L96B1
07490        JSR SETVBV ;$E45C
07500        RTS
07510 ;
07520 ; Read sector 1 and determine density
07530 ;
07540 L96D4  LDA SECLO+1 ;$008C
07550        PHA
07560        LDA SECLO ;$008B
07570        PHA
07580        LDY #$01
07590        STY SECLO ;$008B
07600        DEY
07610        STY SECLO+1 ;$008C
07620        JSR INIT24 ;$9726 Initialize sector buffer
07630        JSR INIT2E ;$9740 Initialize previous sector buffer
07640        LDA #$80
07650        STA DATAWIN ;$90A7
07660        LDA #$52 ; Read
07670        STA COMMAND ;$0092
07680        JSR SECIO ;$9907
07690        STY STATUS ;$00A0
07700        LDX DUNIT ;$0301
07710        LDA TABSPD-1,X ;$B826
07720        CMP #$0F ; Special speed?
07730        BNE L970C ;$970C
07740        LDA #$04
07750        STA DAUX1 ;$030A
07760        LDA #$00 ; no data
07770        STA DSTATS ;$0303
07780        JSR SIOCMD ;$B831
07790 L970C  PLA
07800        STA SECLO ;$008B
07810        PLA
07820        STA SECLO+1 ;$008C
07830        LDY STATUS ;$00A0
07840        CPY #$01
07850        BEQ L971C ;$971C
07860        CPY #$90 ; 144
07870        BNE L9721 ;$9721
07880 L971C  LDX DRIVE ;$008F
07890        JMP RDSTAT ;$919E
07900 L9721  LDX DRIVE ;$008F
07910        LDA #$01
07920        RTS
07930 INIT24 LDA #L2400
07940        STA DBUFLO ;$0304
07950        STA DATAWIN ;$90A7
07960        LDA /L2400
07970        STA DBUFHI ;$0305
07980        STA DATAWIN+1 ;$90A8
07990 ;
08000 ; Make area from $2400 to $24FF zeroes
08010 ;
08020        LDA #$00
08030        TAY
08040 L9739  STA L2400,Y ;$2400
08050        INY
08060        BNE L9739 ;$9739
08070        RTS
08080 ;
08090 ; MAke area from $2E00 to $2EFF zeroes
08100 ;
08110 INIT2E LDY #$00
08120        TYA
08130 L9743  STA L2E00,Y ;$2E00
08140        DEY
08150        BNE L9743 ;$9743
08160        RTS
08170 L974A  LDA SAVMSC ;$0058
08180        CLC
08190        ADC #600 ; add 15 lines
08200        STA DATAWIN ;$90A7
08210        LDA SAVMSC+1 ;$0059
08220        ADC /600
08230        STA DATAWIN+1 ;$90A8
08240        RTS
08250 L975A  .BYTE $7B,$9B
08260        .BYTE "Insert "
08270        .BYTE +$80 "SOURCE"
08280        .BYTE " disk, press "
08290        .BYTE +$80 "RETURN"
08300        .BYTE $00
08310 L977D  .BYTE $9B
08320        .BYTE "Insert "
08330        .BYTE +$80 "DESTINATION"
08340        .BYTE " disk, press "
08350        .BYTE +$80 "RETURN"
08360        .BYTE $00
08370 GETRET JSR GETCHR ;$93AA
08380        CMP #$1B
08390        BEQ GOMENU ;$97B3
08400        CMP #$9B
08410        BNE GETRET ;$97A4
08420        JSR PRTCHR ;$939F
08430        RTS
08440 GOMENU LDX #$FF
08450        TXS
08460        STX IC1HID ;$0350
08470        JSR INIT24 ;$9726 Initialize sector buffer
08480        JSR INIT2E ;$9740 Initialize previous sector buffer
08490        LDA #$00
08500        STA RENFLG ;$00A4
08510        STA IC1AX1 ;$035A
08520        JMP DOMENU ;$95D1
08530 L97C9  .SBYTE -" Reading Source "
08540        .SBYTE -"Disk          "
08550 ;
08560 ; Turn Disk into file(s)
08570 ;
08580 L97E7  LDX #L975A
08590        LDY /L975A
08600        JSR PRTSTR ;Insert source disk
08610        JSR GETRET ;$97A4
08620        LDY #$01 ; First pass
08630        STY PASS ;$009A
08640        STY LARGE ;$0099
08650        STY SECLO ;$008B
08660        DEY
08670        STY ERRORS ;$008D
08680        STY ERRORS+1 ;$008E
08690        STY DSTDEN ;$9007
08700        STY SECLO+1 ;$008C
08710        STY BNKFLG ;$0088 Start in regular memory
08720        STY SECOND ;$008A Not yet doing second buffer load
08730        TYA ; A = $00 low byte
08740        TAX ; X = $00 high byte
08750        LDY #$21 ; Offset for error count
08760        JSR SHWNUM ;$932B
08770        JSR SHWPASS ;$92E0
08780        LDA SRCDRV ;$9004
08790        STA DRIVE ;$008F
08800        LDA MAXSEC ;$9000
08810        STA ENDSEC ;$9002
08820        LDA MAXSEC+1 ;$9001
08830        STA ENDSEC+1 ;$9003
08840        JSR L9D69 ;$9D69 Initialize bank stuff
08850 ;
08860 ; Make area from $2400 to $26FF zeroes
08870 ;
08880        LDY #$00
08890        TYA
08900 L9828  STA L2400,Y ;$2400
08910        STA L2400+256,Y ;$2500
08920        STA L2400+512,Y ;$2600
08930        INY
08940        BNE L9828 ;$9828
08950        JSR L96D4 ;$96D4 Read sector 1
08960        STA SRCDEN ;$9005
08970        STA DENSITY ;$0090
08980        JSR SHWSDN ;$928F
08990        CMP #$03
09000        BCC L984D ;$984D
09010        LDA #1040 ; Enhanced density has 1040 sectors
09020        STA ENDSEC ;$9002
09030        LDA /1040
09040        STA ENDSEC+1 ;$9003
09050 L984D  LDA #$02 ; Start buffer beyond the two header bytes
09060        STA BUFOUT ;$00AD
09070        LDA #$2F
09080        STA BUFOUT+1 ;$00AE
09090        LDA #$00
09100        STA BYTTOT ;$009E
09110        STA BYTTOT+1 ;$009F
09120        STA SECSIZ+1 ;$0096
09130        LDA #$80
09140        STA SECSIZ ;$0095
09150        LDX DENSITY ;$0090
09160        CPX #$02
09170        BNE L986E ;$986E
09180        LDY #$00
09190        STY SECSIZ ;$0095
09200        INY
09210        STY SECSIZ+1 ;$0096
09220 L986E  LDY #$1B
09230 L9870  LDA L97C9,Y ;$97C9 Reading source disk
09240        STA L90B8,Y ;$90B8
09250        DEY
09260        BPL L9870 ;$9870
09270        JSR SHWPASS ;$92E0
09280 L987C  JSR INIT24 ;$9726 Initialize sector buffer
09290        LDA SRCDRV ;$9004
09300        STA DRIVE ;$008F
09310        LDA SRCDEN ;$9005
09320        STA DENSITY ;$0090
09330        LDA #$00
09340        STA SECIDX ;$0091
09350        LDA SECLO ;$008B
09360        STA SECBEG ;$0093
09370        LDA SECLO+1 ;$008C
09380        STA SECBEG+1 ;$0094
09390 L9895  LDA #$52 ; Read
09400        STA COMMAND ;$0092
09410        LDA SECLO ;$008B
09420        LDX SECLO+1 ;$008C
09430        LDY #$11 ; Offset for sector number
09440        JSR SHWNUM ;$932B
09450        JSR SECIO ;$9907
09460        LDA DBUFLO ;$0304
09470        STA DATAWIN ;$90A7
09480        LDA DBUFHI ;$0305
09490        STA DATAWIN+1 ;$90A8
09500        CPY #$01 ; No errors?
09510        BEQ L98CE ;$98CE
09520        CPY #$90
09530        BEQ L98BF ;$98BF
09540        JSR SHWERR ;$99BB
09550        JMP GOMENU ;$97B3
09560 L98BF  INC ERRORS ;$008D
09570        BNE L98C5 ;$98C5
09580        INC ERRORS+1 ;$008E
09590 L98C5  LDA ERRORS ;$008D Error count low
09600        LDX ERRORS+1 ;$008E Error count high
09610        LDY #$21 ; Offset for error count
09620        JSR SHWNUM ;$932B
09630 L98CE  CLC
09640        LDA DBUFLO ;$0304 Add sector size to pointer
09650        ADC SECSIZ ;$0095
09660        STA DBUFLO ;$0304
09670        LDA DBUFHI ;$0305
09680        ADC SECSIZ+1 ;$0096
09690        STA DBUFHI ;$0305
09700        LDA ENDSEC ;$9002
09710        CMP SECLO ;$008B
09720        BNE L98ED ;$98ED
09730        LDA ENDSEC+1 ;$9003
09740        CMP SECLO+1 ;$008C
09750        BEQ L9904 ;$9904 At the end sector
09760 L98ED  INC SECLO ;$008B Increment sector number
09770        BNE L98F3 ;$98F3
09780        INC SECLO+1 ;$008C
09790 L98F3  INC SECIDX ;$0091 Double density takes up two slots
09800        LDA SECSIZ+1 ;$0096
09810        BEQ L98FB ;$98FB
09820        INC SECIDX ;$0091
09830 L98FB  LDA SECIDX ;$0091
09840        CMP #18 ; Sector table full?
09850        BCS L9904 ;$9904
09860        JMP L9895 ;$9895
09870 L9904  JMP L9A04 ;$9A04
09880 SECIO  LDA SECLO+1 ;$008C
09890        STA DAUX2 ;$030B
09900        BNE L9923 ;$9923
09910        LDA SECLO ;$008B
09920        STA DAUX1 ;$030A
09930        CMP #$04
09940        BCS L9923 ;$9923
09950        LDA #$80
09960        STA DBYTLO ;$0308
09970        LDA #$00
09980        STA DBYTHI ;$0309
09990        BEQ L9943 ;$9943
10000 L9923  LDA SECLO ;$008B
10010        STA DAUX1 ;$030A
10020        LDA DENSITY ;$0090
10030        CMP #$02
10040        BEQ L993A ;$993A
10050        LDA #$80
10060        STA DBYTLO ;$0308
10070        LDA #$00
10080        STA DBYTHI ;$0309
10090        BEQ L9943 ;$9943
10100 L993A  LDY #$00
10110        STY DBYTLO ;$0308
10120        INY
10130        STY DBYTHI ;$0309
10140 L9943  LDA #$31
10150        STA DDEVIC ;$0300
10160        LDA DRIVE ;$008F
10170        STA DUNIT ;$0301
10180        LDA COMMAND ;$0092
10190        STA DCOMND ;$0302
10200        CMP #$52 ; Read
10210        BEQ L9959 ;$9959
10220        LDA #$80
10230        .BYTE #$2C ; Fake BIT instruction
10240 L9959  LDA #$40 ; read data
10250        STA DSTATS ;$0303
10260        LDA #$0A
10270        STA DTIMLO ;$0306
10280        JSR SIOCMD ;$B831
10290        RTS
10300 L9967  .SBYTE -"Disk Read Error "
10310        .SBYTE -"#000        "
10320 L9983  .SBYTE -"Disk Write Error "
10330        .SBYTE -"#000       "
10340 L999F  .SBYTE -"Error: Break "
10350        .SBYTE -"Abort           "
10360 SHWERR STY ERRNUM ;$00C4
10370        CPY #128 ; Break abort
10380        BEQ L99F6 ;$99F6
10390        LDY #$1B
10400 L99C3  LDA L9967,Y ;$9967 Disk read error #000
10410        STA L90B8,Y ;$90B8
10420        DEY
10430        BPL L99C3 ;$99C3
10440        LDA #L90C9
10450 L99CE  STA Z0042 ;$00A5
10460        LDA /L90C9
10470        STA Z0043 ;$00A6
10480        LDY #$00
10490        LDX #$00
10500        LDA ERRNUM ;$00C4
10510        JSR L937A ;$937A
10520        JMP BELL ;$95AB
10530 WRTERR STY ERRNUM ;$00C4
10540        CPY #$80
10550        BEQ L99F6 ;$99F6
10560        LDY #$1B
10570 L99E8  LDA L9983,Y ;$9983 Disk write error #000
10580        STA L90B8,Y ;$90B8
10590        DEY
10600        BPL L99E8 ;$99E8
10610        LDA #$CA
10620        JMP L99CE ;$99CE
10630 L99F6  LDY #$1B
10640 L99F8  LDA L999F,Y ;$999F Error: break abort
10650        STA L90B8,Y ;$90B8
10660        DEY
10670        BPL L99F8 ;$99F8
10680        JMP BELL ;$95AB
10690 ;
10700 ; Sector table full
10710 ;
10720 L9A04  LDA SECBEG ;$0093
10730        STA SECTOR ;$0097
10740        LDA SECBEG+1 ;$0094
10750        STA SECTOR+1 ;$0098
10760        JSR LB7A9 ;$B7A9 Process content table
10770        LDA #L2400 ; Load address of sector buffer
10780        STA SECBUF ;$00A9
10790        LDA /L2400
10800        STA SECBUF+1 ;$00AA
10810        LDA #$00
10820        STA SECIDX ;$0091
10830 L9A1B  LDX SECIDX ;$0091
10840        LDA TABCNT,X ;$905C
10850        BEQ L9A27 ;$9A27 Sector with zeroes, simply skip it
10860        JSR L9BB7 ;$9BB7 Go process non-zero sector
10870        BCS L9A2A ;$9A2A Buffer full?
10880 L9A27  JMP L9AC5 ;$9AC5 Go prepare for next sector
10890 ;
10900 ; Buffer is full.  Flush the buffer and initialize stuff again.
10910 ;
10920 L9A2A  JSR INIT24 ;$9726 Initialize sector buffer
10930        LDA SECTOR ;$0097 Save next sector as starting sector
10940        CLC
10950        ADC #$01 ; Compute next sector
10960        STA SECLO ;$008B
10970        LDA SECTOR+1 ;$0098
10980        ADC #$00
10990        STA SECLO+1 ;$008C
11000 L9A3A  INC PASS ;$009A Next pass
11010        LDY #$00
11020        LDX SECIDX ;$0091
11030        LDA TABCNT,X ;$905C Get content type
11040        AND #$80 ; Next sector non-zero?
11050        BNE L9A51 ;$9A51 Next sector non-zero
11060 ;
11070 ; We will have indicated that a sector number now follows.
11080 ; Since this will be the end of the file, the sector number will
11090 ; be stored in the next file.  Add fake bytes for this file.
11100 ; Maybe the double #$45 is for compatibility with older versions.
11110 ;
11120        LDA #$45 ; Flush the buffer / fake sector number
11130        STA (BUFOUT),Y ;$00AD
11140        INY
11150        LDA #$00 ; Byte for fake sector number
11160        STA (BUFOUT),Y ;$00AD
11170        INY
11180 L9A51  LDA #$45 ; Flush the buffer
11190        STA (BUFOUT),Y ;$00AD
11200        CLC
11210        TYA
11220        ADC #$03
11230        ADC BYTTOT ;$009E
11240        STA BYTTOT ;$009E
11250        LDA BYTTOT+1 ;$009F
11260        ADC #$00
11270        STA BYTTOT+1 ;$009F
11280        LDA PASS ;$009A
11290        AND #$20
11300        BCS L9A73 ;$9A73
11310        LDA PASS ;$009A
11320        SEC
11330        SBC #$01
11340 L9A6E  AND #$9F
11350        JMP L9A78 ;$9A78
11360 L9A73  LDA PASS ;$009A
11370        JMP L9A6E ;$9A6E
11380 ;
11390 ; Prepare for next file, set last pass flag, density and pass count
11400 ;
11410 L9A78  STA WORKA0 ;$00A0
11420        LDA SRCDEN ;$9005
11430        SEC
11440        SBC #$01
11450        ASL
11460        ASL
11470        ASL
11480        ASL
11490        ASL
11500        ORA WORKA0 ;$00A0
11510        STA L2F01 ;$2F01
11520 ;
11530 ; Set single file/multiple file flag.
11540 ;
11550        LDA PASS ;$009A
11560        CMP #$82 ; Last pass, only one pass needed.
11570        BEQ L9AC2 ;$9AC2
11580        CMP #$02 ; Second pass, ask for small files or large file
11590        BNE L9ABF ;$9ABF Beyond start of second pass already
11600        LDA #$01
11610        STA CRSINH ;$02F0
11620        LDX #L9B06
11630        LDY /L9B06
11640        JSR PRTSTR ;Small files/one large file
11650        LDA #$00
11660        STA CRSINH ;$02F0
11670 L9AA5  JSR GETCHR ;$93AA
11680        CMP #$1B ; Escape
11690        BEQ L9AB9 ;$9AB9 Return to menu
11700        JSR TOUPPR ;$95C8
11710        CMP #$41 ; 'A'
11720        BEQ L9ABC ;$9ABC Character accepted
11730        CMP #$42 ; 'B'
11740        BEQ L9ABC ;$9ABC Character accepted
11750        BNE L9AA5 ;$9AA5 Character rejected
11760 L9AB9  JMP GOMENU ;$97B3
11770 L9ABC  JMP LA3CB ;$A3CB
11780 L9ABF  JMP L9F6B ;$9F6B
11790 L9AC2  JMP LA3D0 ;$A3D0
11800 ;
11810 ; Prepare for next sector
11820 ;
11830 L9AC5  LDA SECTOR ;$0097 Did we reach the end sector yet?
11840        CMP ENDSEC ;$9002
11850        BNE L9ADF ;$9ADF No, continue
11860        LDA SECTOR+1 ;$0098
11870        CMP ENDSEC+1 ;$9003
11880        BNE L9ADF ;$9ADF No, continue
11890        LDA PASS ;$009A We did, so we are done
11900        ORA #$80 ; Mark this as the last pass
11910        STA PASS ;$009A
11920        JSR INIT24 ;$9726 Initialize sector buffer
11930        JMP L9A3A ;$9A3A Go write the flush buffer compression type
11940 L9ADF  INC SECTOR ;$0097
11950        BNE L9AE5 ;$9AE5
11960        INC SECTOR+1 ;$0098
11970 L9AE5  CLC
11980        LDA SECBUF ;$00A9
11990        ADC SECSIZ ;$0095
12000        STA SECBUF ;$00A9
12010        LDA SECBUF+1 ;$00AA
12020        ADC SECSIZ+1 ;$0096
12030        STA SECBUF+1 ;$00AA
12040        INC SECIDX ;$0091
12050        LDA SECSIZ+1 ;$0096 Double density?
12060        BEQ L9AFA ;$9AFA
12070        INC SECIDX ;$0091
12080 L9AFA  LDA SECIDX ;$0091
12090        CMP #18 ; End of table?
12100        BCS L9B03 ;$9B03 End of table
12110        JMP L9A1B ;$9A1B Go process next sector in table
12120 L9B03  JMP L987C ;$987C Go fill table again
12130 L9B06  .BYTE $7D,$9B,$9B
12140        .BYTE $20,$20,$11,$12,$12,$12,$12
12150        .BYTE $12,$12,$12,$12,$12
12160        .BYTE $12,$12,$12,$12,$12
12170        .BYTE $12,$12,$12,$12,$12
12180        .BYTE $12,$12,$12,$12,$12
12190        .BYTE $12,$12,$12,$12,$05
12200        .BYTE $9B
12210        .BYTE $20,$20,$7C
12220        .BYTE "     Do you wish "
12230        .BYTE "to use     "
12240        .BYTE $7C,$9B
12250        .BYTE $20,$20,$7C,$20,$99
12260        .BYTE +$80 "[A]"
12270        .BYTE $19
12280        .BYTE " Separate small "
12290        .BYTE "files "
12300        .BYTE $7C,$9B
12310        .BYTE $20,$20,$7C,$20,$99
12320        .BYTE +$80 "[B]"
12330        .BYTE $19
12340        .BYTE " One large file!"
12350        .BYTE "      "
12360        .BYTE $7C,$9B
12370        .BYTE $20,$20,$1A,$12,$12,$12
12380        .BYTE $12,$12,$12,$12,$12
12390        .BYTE $12,$12,$12,$12,$12
12400        .BYTE $12,$12,$12,$12,$12
12410        .BYTE $12,$12,$12,$12,$12
12420        .BYTE $12,$12,$12,$12,$12
12430        .BYTE $03,$9B
12440        .BYTE $00
12450 L9BAF  LDX #L977D
12460        LDY /L977D
12470        JSR PRTSTR ;Insert destination disk
12480        RTS
12490 ;
12500 ; Process non-zero sector
12510 ;
12520 L9BB7  LDX SECIDX ;$0091 Get content type
12530        LDA TABCNT,X ;$905C
12540        AND #$01 ; Previous sector non-zero?
12550        BEQ L9BD0 ;$9BD0 Branch if previous sector zeroes
12560        LDA BUFOUT ;$00AD Add 1 to buffer pointer
12570        CLC
12580        ADC #$01 ; Skip byte for compression type
12590        STA WRKBUF ;$00AB
12600        LDA BUFOUT+1 ;$00AE
12610        ADC #$00
12620        STA WRKBUF+1 ;$00AC
12630        JMP L9BDD ;$9BDD
12640 L9BD0  LDA BUFOUT ;$00AD Previous sector zeroes
12650        CLC
12660        ADC #$03 ; Skip 3 bytes for sector number and compression type
12670        STA WRKBUF ;$00AB
12680        LDA BUFOUT+1 ;$00AE
12690        ADC #$00
12700        STA WRKBUF+1 ;$00AC
12710 ;
12720 ; Try to compress the sector
12730 ; First figure out which type of compression is best.  Try to do
12740 ; standard compression.  If the first pass tells us there is a smart
12750 ; compression possible, apply it.  Otherwise, continue doing a
12760 ; standard compession.
12770 ;
12780 L9BDD  LDA #$00
12790        STA WORK9C ;$009C Initialize index
12800        STA WORK9B ;$009B Initialize uncompressed index
12810 L9BE3  JSR L9D3A ;$9D3A Try compressing the sector
12820        LDA WORK9C ;$009C First compression pass?
12830        BNE L9BFD ;$9BFD No, continue doing compression type #$43
12840        LDA WORKA1 ;$00A1 Fill character
12850        ORA WORK9B ;$009B Uncompressed end index
12860        CMP #$00 ; Only compressed zeroes to start with?
12870        BNE L9BFA ;$9BFA Nope
12880        LDA WORK9D ;$009D End index compressed string
12890        CMP SECSIZ ;$0095 Entire sector of zeroes?
12900        BNE L9BFA ;$9BFA Go compare sector to previous sector
12910        CLC ; Sector of all zeroes, impossible?
12920        RTS
12930 ;
12940 ; Go compare sector to previous sector.
12950 ;
12960 L9BFA  JMP L9CD3 ;$9CD3
12970 ;
12980 ; Other compression types could not be applied
12990 ;
13000 L9BFD  LDA WORK9B ;$009B Uncompressed end index
13010        CMP #$FF ; Nothing left to compress?
13020        BNE L9C1B ;$9C1B
13030        LDA WORK9C ;$009C Start index uncompressed/compressed pair
13040        BNE L9C31 ;$9C31 From start of sector?
13050        LDY #$00
13060 L9C09  LDA (SECBUF),Y ;$00A9
13070        STA (WRKBUF),Y ;$00AB
13080        INY
13090        CPY SECSIZ ;$0095
13100        BNE L9C09 ;$9C09
13110        LDX #$47 ; Uncompressed string
13120 L9C14  LDA SECSIZ ;$0095
13130        STA WORK9D ;$009D
13140        JMP L9C5F ;$9C5F
13150 L9C1B  LDY #$00
13160        LDA WORK9B ;$009B Uncompressed end index
13170        STA (WRKBUF),Y ;$00AB Store it
13180        LDX WORK9C ;$009C Load start index of substring
13190 L9C23  INY
13200        CPX WORK9B ;$009B Uncompressed end index
13210        BEQ L9C53 ;$9C53 Done copying uncompressed string
13220        JSR L9C4A ;$9C4A Get byte indexed by X
13230        STA (WRKBUF),Y ;$00AB Store it
13240        INX
13250        JMP L9C23 ;$9C23
13260 L9C31  LDY #$00
13270        LDA SECSIZ ;$0095
13280        STA (WRKBUF),Y ;$00AB
13290        LDX WORK9C ;$009C Load start index of substring
13300 L9C39  INY
13310        JSR L9C4A ;$9C4A Get byte indexed by X
13320        STA (WRKBUF),Y ;$00AB
13330        INX
13340        CPX SECSIZ ;$0095
13350        BNE L9C39 ;$9C39
13360        LDX #$43 ; Compressed string
13370        INY
13380        JMP L9C14 ;$9C14
13390 ;
13400 ; Get byte from sector buffer, use X as index
13410 ;
13420 L9C4A  STY WORKA0 ;$00A0 Save Y register
13430        TXA ; Copy X to Y
13440        TAY
13450        LDA (SECBUF),Y ;$00A9 Get byte indexed by X
13460        LDY WORKA0 ;$00A0 Restore Y register
13470        RTS
13480 ;
13490 ; Done copying uncompressed string
13500 ;
13510 L9C53  LDA WORK9D ;$009D Compressed end index
13520        STA (WRKBUF),Y ;$00AB Store it
13530        LDX #$43 ; Compressed string
13540        INY
13550        LDA WORKA1 ;$00A1 Fill character
13560        STA (WRKBUF),Y ;$00AB Store fill character
13570        INY
13580 ;
13590 ; X = compression type, Y = length of data after compression
13600 ;
13610 L9C5F  CLC
13620        TYA
13630        BEQ L9C78 ;$9C78 Add 256?
13640        ADC WRKBUF ;$00AB
13650        STA WRKBUF ;$00AB
13660        LDA WRKBUF+1 ;$00AC
13670        ADC #$00
13680        STA WRKBUF+1 ;$00AC
13690 L9C6D  LDA WORK9D ;$009D Sector size or compressed end index
13700        STA WORK9C ;$009C
13710        CMP SECSIZ ;$0095 End of sector?
13720        BEQ L9C7D ;$9C7D We are done
13730        JMP L9BE3 ;$9BE3 Go do next uncompressed/compressed pair
13740 L9C78  INC WRKBUF+1 ;$00AC
13750        JMP L9C6D ;$9C6D
13760 ;
13770 ; Sector compressed, store compression type
13780 ;
13790 L9C7D  LDA WRKBUF ;$00AB
13800        SEC
13810        SBC BUFOUT ;$00AD
13820        STA WORKLO ;$00B8
13830        LDA WRKBUF+1 ;$00AC
13840        SBC BUFOUT+1 ;$00AE
13850        STA WORKHI ;$00B9
13860        STX WORK9D ;$009D Store compression type
13870        LDX SECIDX ;$0091
13880        LDY #$02 ; Offset in case we have to store the sector number
13890        LDA TABCNT,X ;$905C Get content type
13900        PHA
13910        AND #$01
13920        BEQ L9C9A ;$9C9A Previous sector zeroes?
13930        LDY #$00 ; Non-zero, no extra offset caused by sector number
13940 L9C9A  PLA
13950        AND #$80 ; Set flag for next sector zeroes or not
13960        ORA WORK9D ;$009D Insert the compression type byte
13970        STA (BUFOUT),Y ;$00AD Store it in the proper place
13980        DEY ; Was Y zero?
13990        BMI L9CAD ;$9CAD No, sequential sector
14000        LDA SECTOR+1 ;$0098 Store the sector number
14010        STA (BUFOUT),Y ;$00AD
14020        DEY
14030        LDA SECTOR ;$0097
14040        STA (BUFOUT),Y ;$00AD
14050 L9CAD  LDA WRKBUF ;$00AB
14060        STA BUFOUT ;$00AD
14070        LDA WRKBUF+1 ;$00AC
14080        STA BUFOUT+1 ;$00AE
14090        LDA BYTTOT ;$009E
14100        CLC
14110        ADC WORKLO ;$00B8
14120        STA BYTTOT ;$009E
14130        LDA BYTTOT+1 ;$009F
14140        ADC WORKHI ;$00B9
14150        STA BYTTOT+1 ;$009F
14160 ;
14170 ; Copy the sector to the previous sector buffer for comparison.
14180 ;
14190        LDY #$00
14200 L9CC4  LDA (SECBUF),Y ;$00A9
14210        STA L2E00,Y ;$2E00
14220        INY
14230        CPY SECSIZ ;$0095
14240        BNE L9CC4 ;$9CC4
14250        LDA BYTTOT+1 ;$009F
14260        CMP #$5F ; More than $6000 bytes in output buffer?
14270        RTS
14280 ;
14290 ; Compare sector contents to previous sector in the buffer
14300 ;
14310 L9CD3  LDY #$00
14320 L9CD5  LDA (SECBUF),Y ;$00A9
14330        CMP L2E00,Y ;$2E00
14340        BNE L9CEE ;$9CEE Contents differ
14350        INY
14360        CPY SECSIZ ;$0095 End of sector?
14370        BNE L9CD5 ;$9CD5
14380        LDX #$46 ; Sector contents same as previous buffer
14390        DEC WRKBUF+1 ;$00AC
14400        LDY #$00
14410 ;
14420 ; Sector compression complete
14430 ;
14440 L9CE7  LDA SECSIZ ;$0095
14450        STA WORK9D ;$009D
14460        JMP L9C5F ;$9C5F
14470 ;
14480 ; Sector not same as previous buffer
14490 ; Store the portion starting where the difference occurs
14500 ;
14510 L9CEE  TYA
14520        SEC
14530        SBC SECSIZ ;$0095
14540        CMP #$E0 ; Remaining portion larger than 224?
14550        BCC L9D0D ;$9D0D Go compare the end of the sectors
14560        TYA
14570        LDY #$00
14580        STA (WRKBUF),Y ;$00AB Store end index
14590        TAX
14600 L9CFC  INY
14610        JSR L9C4A ;$9C4A Get byte indexed by X
14620        STA (WRKBUF),Y ;$00AB Copy starting at X into begin of string
14630        INX
14640        CPX SECSIZ ;$0095
14650        BNE L9CFC ;$9CFC
14660        INY
14670        LDX #$44 ; Start at index, data up to end of sector
14680        JMP L9CE7 ;$9CE7 Compression complete
14690 ;
14700 ; Compare ending portion of sectors to see if they are similar.
14710 ;
14720 L9D0D  LDY SECSIZ ;$0095 Start at end of the sector
14730        DEY ; Convert length to offset first
14740 L9D10  LDA (SECBUF),Y ;$00A9
14750        CMP L2E00,Y ;$2E00 Bytes the same?
14760        BNE L9D1C ;$9D1C Difference found
14770        DEY
14780        CPY #$FF ; Back at beginning of sector?
14790        BNE L9D10 ;$9D10 Not yet
14800 L9D1C  CPY #$10 ; Start position where similarity starts less than 16?
14810        BCS L9D37 ;$9D37
14820        TYA
14830        LDY #$00
14840        STA (WRKBUF),Y ;$00AB
14850        TAX
14860 L9D26  INY
14870        JSR L9C4A ;$9C4A Get byte indexed by X
14880        STA (WRKBUF),Y ;$00AB
14890        DEX
14900        CPX #$FF
14910        BNE L9D26 ;$9D26
14920        INY
14930        LDX #$41 ; Start at index, back up to beginning
14940        JMP L9CE7 ;$9CE7 Compression complete
14950 ;
14960 ; Sector is not similar to previous buffer, use standard compression
14970 ;
14980 L9D37  JMP L9BFD ;$9BFD Could not use these compression types
14990 ;
15000 ; Compress data in the sector.
15010 ; Try to find repeating data in the sector.
15020 ;
15030 L9D3A  LDY WORK9C ;$009C
15040 L9D3C  LDA (SECBUF),Y ;$00A9
15050        INY
15060        CPY SECSIZ ;$0095
15070        BEQ L9D5F ;$9D5F End of sector
15080        CMP (SECBUF),Y ;$00A9 Compare to next byte
15090        BNE L9D3C ;$9D3C Non-identical bytes
15100 ;
15110 ; Bytes are the same, see if we can save space by compressing.
15120 ; Try to find three or more identical consecutive bytes.
15130 ;
15140        DEY ; Bytes are the same
15150        STY WORK9B ;$009B End index of uncompressed string
15160        INY
15170        LDX #$FF ; Initialize compression repeat count
15180 L9D4D  INX ; Increment repeat count
15190        INY
15200        CPY SECSIZ ;$0095
15210        BEQ L9D57 ;$9D57
15220        CMP (SECBUF),Y ;$00A9 Still the same byte value?
15230        BEQ L9D4D ;$9D4D
15240 L9D57  CPX #$02 ; Compressed more than 2 characters?
15250        BCS L9D64 ;$9D64 Yes, uncompressed/compressed pair done
15260        CPY SECSIZ ;$0095 Compression failed, end of sector reached?
15270        BNE L9D3C ;$9D3C Continue uncompressed
15280 L9D5F  LDA #$FF ; Uncompressed string up to end of sector
15290        STA WORK9B ;$009B
15300        RTS
15310 L9D64  STA WORKA1 ;$00A1 Store fill character for repeat
15320        STY WORK9D ;$009D End index of uncompressed string
15330        RTS
15340 ;
15350 ; Initialize bank stuff
15360 ;
15370 L9D69  LDA #$00
15380        STA BNKMEM ;$0080
15390        STA Z0245 ;$0082
15400        STA Z0246 ;$0084
15410        STA CNT256 ;$0085
15420        LDA #$01
15430        STA BANKID ;$0089
15440        STA BANKCD ;$0087
15450        LDA #$40
15460        STA BNKMEM+1 ;$0081
15470        STA Z0245+1 ;$0083
15480        LDA L9081 ;$9081
15490        STA CNT256+1 ;$0086
15500        RTS
15510 SETBNK LDA PORTB ;$D301
15520        STA Z0255 ;$00B1
15530        AND #$03 ; mask off everything except basic and the OS
15540        LDY BANKID ;$0089
15550        ORA TABBNK-1,Y ;$9070 Set mask for selected bank
15560        STA PORTB ;$D301
15570        RTS
15580 ;
15590 ; Write data from a bank
15600 ;
15610 L9D95  LDA #$01
15620        STA BANKID ;$0089
15630        LDA PORTB ;$D301
15640        STA BANKSW ;$00A1
15650 L9D9E  JSR SETBNK ;$9D85
15660        LDX #$10
15670        LDA #$0B ; Put record
15680        STA ICCOM,X ;$0342
15690        LDA #$00
15700        STA ICBAL,X ;$0344
15710        STA ICBLL,X ;$0348
15720        LDA #$40
15730        STA ICBAH,X ;$0345
15740        STA ICBLH,X ;$0349
15750        LDA BANKID ;$0089
15760        CMP BANKCD ;$0087
15770        BNE L9DCB ;$9DCB
15780        LDA Z0245 ;$0082
15790        SEC
15800        STA ICBLL,X ;$0348
15810        LDA Z0245+1 ;$0083
15820        SBC #$40
15830        STA ICBLH,X ;$0349
15840 L9DCB  JSR CIOV ;$E456
15850        BMI L9DDA ;$9DDA
15860        LDA BANKID ;$0089
15870        CMP BANKCD ;$0087
15880        BEQ L9DDA ;$9DDA
15890        INC BANKID ;$0089
15900        BNE L9D9E ;$9D9E
15910 L9DDA  LDA BANKSW ;$00A1
15920        STA PORTB ;$D301
15930        TYA
15940        RTS
15950 ;
15960 ;
15970 ;
15980 L9DE1  JMP L9F31 ;$9F31 Go copy from bank(s) to regular memory
15990 L9DE4  LDA Z0246 ;$0084
16000        ORA CNT256 ;$0085
16010        ORA CNT256+1 ;$0086
16020        BNE L9DEE ;$9DEE
16030        SEC
16040        RTS
16050 L9DEE  LDA CNT256+1 ;$0086
16060        BNE L9DE1 ;$9DE1 Go copy from bank(s) to regular memory
16070        SEC
16080        LDA #$00 ; $6000 bytes
16090        SBC BYTCNT ;$00B5
16100        STA Z0265 ;$00AF
16110        LDA #$60
16120        SBC BYTCNT+1 ;$00B6
16130        STA Z0267 ;$00B0
16140        SEC
16150        LDA Z0246 ;$0084
16160        SBC Z0265 ;$00AF
16170        LDA CNT256 ;$0085
16180        SBC Z0267 ;$00B0
16190        BCS L9DE1 ;$9DE1 Go copy from bank(s) to regular memory
16200        LDA BYTCNT ;$00B5
16210        CLC
16220        ADC #L2F00
16230        STA WRKBUF ;$00AB
16240        LDA BYTCNT+1 ;$00B6
16250        ADC /L2F00
16260        STA WRKBUF+1 ;$00AC
16270        CLC
16280        LDA BYTCNT ;$00B5
16290        ADC Z0246 ;$0084
16300        STA BYTCNT ;$00B5
16310        LDA BYTCNT+1 ;$00B6
16320        ADC CNT256 ;$0085
16330        STA BYTCNT+1 ;$00B6
16340        LDA #$00 ; Set regular memory
16350        STA BNKFLG ;$0088
16360        LDA PORTB ;$D301
16370        STA Z0255 ;$00B1
16380 L9E2D  LDA CNT256 ;$0085
16390        BEQ L9E3D ;$9E3D
16400        LDA #$00 ; Copy 256 bytes
16410        STA WORK9D ;$009D
16420        JSR L9E48 ;$9E48 Copy data from bank(s) to regular memory
16430        DEC CNT256 ;$0085
16440        JMP L9E2D ;$9E2D
16450 L9E3D  LDA Z0246 ;$0084
16460        BEQ L9E46 ;$9E46
16470        STA WORK9D ;$009D
16480        JSR L9E48 ;$9E48 Copy data from bank(s) to regular memory
16490 L9E46  SEC
16500        RTS
16510 ;
16520 ; Copy number of bytes specified from bank(s) to regular memory
16530 ;
16540 L9E48  LDA PORTB ;$D301
16550        STA Z0255 ;$00B1
16560        LDY BANKID ;$0089
16570        LDA PORTB ;$D301
16580        AND #$03 ; mask off everything except basic and the OS
16590        ORA TABBNK-1,Y ;$9070 set bank stuff
16600        STA BANKSW ;$00A1
16610        LDY #$00
16620 L9E5B  LDX BANKSW ;$00A1
16630        STX PORTB ;$D301
16640        LDA (BNKMEM),Y ;$0080
16650        LDX Z0255 ;$00B1
16660        STX PORTB ;$D301
16670        STA (WRKBUF),Y ;$00AB
16680        LDA BNKMEM+1 ;$0081
16690        CMP #$7F End of memory bank reached?
16700        BCS L9E77 ;$9E77
16710 L9E6F  INY
16720        CPY WORK9D ;$009D
16730        BNE L9E5B ;$9E5B
16740        JMP L9E96 ;$9E96
16750 L9E77  TYA
16760        CLC
16770        ADC BNKMEM ;$0080
16780        CMP #$FF
16790        BNE L9E6F ;$9E6F
16800        LDA #$3F
16810        STA BNKMEM+1 ;$0081
16820        INC BANKID ;$0089 Next bank
16830        LDX BANKID ;$0089
16840        LDA PORTB ;$D301
16850        AND #$03 ; mask off everything except basic and the OS
16860        ORA TABBNK-1,X ;$9070 set bank stuff
16870        STA BANKSW ;$00A1
16880        INY
16890        CPY WORK9D ;$009D
16900        BNE L9E5B ;$9E5B
16910 ;
16920 ; Add the number of bytes copied.  0 means 256.
16930 ;
16940 L9E96  LDA WORK9D ;$009D
16950        BNE L9E9F ;$9E9F
16960        INC BNKMEM+1 ;$0081
16970        INC WRKBUF+1 ;$00AC
16980        RTS
16990 L9E9F  LDA BNKMEM ;$0080
17000        CLC
17010        ADC WORK9D ;$009D
17020        STA BNKMEM ;$0080
17030        LDA BNKMEM+1 ;$0081
17040        ADC #$00
17050        STA BNKMEM+1 ;$0081
17060        CLC
17070        LDA WRKBUF ;$00AB
17080        ADC WORK9D ;$009D
17090        STA WRKBUF ;$00AB
17100        LDA WRKBUF+1 ;$00AC
17110        ADC #$00
17120        STA WRKBUF+1 ;$00AC
17130        RTS
17140 ;
17150 ; Copy data from regular memory to bank(s)
17160 ;
17170 L9EBA  LDA PORTB ;$D301
17180        STA Z0255 ;$00B1
17190        LDY BANKCD ;$0087
17200        LDA PORTB ;$D301
17210        AND #$03 ; mask off everything except basic and the OS
17220        ORA TABBNK-1,Y ;$9070 set bank stuff
17230        STA BANKSW ;$00A1
17240        LDY #$00
17250 L9ECD  LDX Z0255 ;$00B1
17260        STX PORTB ;$D301
17270        LDA (BUFOUT),Y ;$00AD
17280        LDX BANKSW ;$00A1
17290        STX PORTB ;$D301
17300        STA (Z0245),Y ;$0082
17310        LDA Z0245+1 ;$0083
17320        CMP #$7F
17330        BCS L9EE9 ;$9EE9
17340 L9EE1  INY
17350        CPY WORK9D ;$009D
17360        BNE L9ECD ;$9ECD
17370        JMP L9F08 ;$9F08
17380 L9EE9  TYA
17390        CLC
17400        ADC Z0245 ;$0082
17410        CMP #$FF
17420        BNE L9EE1 ;$9EE1
17430        LDA #$3F
17440        STA Z0245+1 ;$0083
17450        INC BANKCD ;$0087
17460        LDX BANKCD ;$0087
17470        LDA PORTB ;$D301
17480        AND #$03 ; mask off everything except basic and the OS
17490        ORA TABBNK-1,X ;$9070 set bank stuff
17500        STA BANKSW ;$00A1
17510        INY
17520        CPY WORK9D ;$009D
17530        BNE L9ECD ;$9ECD
17540 L9F08  LDA Z0255 ;$00B1
17550        STA PORTB ;$D301
17560 ;
17570 ; Add the number of bytes copied.  0 means 256.
17580 ;
17590        LDA WORK9D ;$009D
17600        BNE L9F16 ;$9F16
17610        INC Z0245+1 ;$0083
17620        INC BUFOUT+1 ;$00AE
17630        RTS
17640 L9F16  LDA Z0245 ;$0082
17650        CLC
17660        ADC WORK9D ;$009D
17670        STA Z0245 ;$0082
17680        LDA Z0245+1 ;$0083
17690        ADC #$00
17700        STA Z0245+1 ;$0083
17710        CLC
17720        LDA BUFOUT ;$00AD
17730        ADC WORK9D ;$009D
17740        STA BUFOUT ;$00AD
17750        LDA BUFOUT+1 ;$00AE
17760        ADC #$00
17770        STA BUFOUT+1 ;$00AE
17780        RTS
17790 ;
17800 ;
17810 ;
17820 L9F31  SEC
17830        LDA Z0246 ;$0084
17840        SEC
17850        SBC Z0265 ;$00AF
17860        STA Z0246 ;$0084
17870        LDA CNT256 ;$0085
17880        SBC Z0267 ;$00B0
17890        STA CNT256 ;$0085
17900        LDA CNT256+1 ;$0086
17910        SBC #$00
17920        STA CNT256+1 ;$0086
17930        LDA BYTCNT ;$00B5
17940        CLC
17950        ADC #L2F00 ; Add start address of buffer
17960        STA WRKBUF ;$00AB
17970        LDA BYTCNT+1 ;$00B6
17980        ADC /L2F00
17990        STA WRKBUF+1 ;$00AC
18000 L9F52  LDA Z0267 ;$00B0
18010        BEQ L9F62 ;$9F62
18020        LDA #$00 ; Copy 256 bytes
18030        STA WORK9D ;$009D
18040        JSR L9E48 ;$9E48 Copy data from bank(s) to regular memory
18050        DEC Z0267 ;$00B0
18060        JMP L9F52 ;$9F52
18070 L9F62  LDA Z0265 ;$00AF
18080        STA WORK9D ;$009D
18090        JSR L9E48 ;$9E48 Copy data from bank(s) to regular memory
18100        CLC
18110        RTS
18120 ;
18130 ; Can we use the banks?
18140 ;
18150 L9F6B  LDA USEBNK ;$9070 Bank memory available?
18160        BEQ L9F74 ;$9F74 No banks available
18170        LDA LARGE ;$0099
18180        BNE L9FE3 ;$9FE3 Do not use banks for small files
18190 L9F74  LDA SECOND ;$008A Are we at or beyond the second buffer load?
18200        BEQ L9F88 ;$9F88 No, first buffer load, go ask for filespec
18210        LDA LARGE ;$0099
18220        BEQ L9F88 ;$9F88
18230        JSR L9FA5 ;$9FA5 Prepare for writing
18240        JSR LA524 ;$A524 Write the buffer in regular memory
18250        JSR LA542 ;$A542 Check for errors
18260        JMP LA5D4 ;$A5D4 Continue reading from source disk
18270 L9F88  LDA SECOND ;$008A Are we at or beyond the second buffer load?
18280        BNE L9F8F ;$9F8F Yes
18290        JSR LA3DB ;$A3DB Get destination filespec
18300 L9F8F  JSR L9FA5 ;$9FA5 Prepare for writing
18310        JSR LA4F7 ;$A4F7 Open the diskcomm file for writing
18320        JSR LA542 ;$A542 Check for errors
18330        BCS L9F8F ;$9F8F
18340        JSR LA524 ;$A524 Write the buffer in regular memory
18350        JSR LA542 ;$A542 Check for errors
18360        BCS L9F8F ;$9F8F
18370        JMP LA5D4 ;$A5D4 Continue reading from source disk
18380 L9FA5  LDX DSTDRV ;$9006
18390        LDA SECOND ;$008A Are we at or beyond second buffer load?
18400        BEQ L9FB8 ;$9FB8 No
18410        LDA LARGE ;$0099
18420        BEQ L9FB8 ;$9FB8
18430        LDA DSTDEN ;$9007
18440        BEQ L9FB8 ;$9FB8
18450        JSR RDCFG ;$91ED
18460 L9FB8  CPX SRCDRV ;$9004
18470        BNE L9FC3 ;$9FC3
18480        JSR L9BAF ;$9BAF Insert destination disk
18490        JSR GETRET ;$97A4
18500 L9FC3  LDY #$1C
18510 L9FC5  LDA LA4C4,Y ;$A4C4 Writing
18520        STA L90B8,Y ;$90B8
18530        DEY
18540        BPL L9FC5 ;$9FC5
18550        LDY #$00
18560 L9FD0  LDA FISPEC,Y ;$9034 Destination filespec
18570        CMP #$9B
18580        BEQ L9FE2 ;$9FE2
18590        CLC
18600        ADC #$60
18610        STA L90C0,Y ;$90C0
18620        INY
18630        CPY #$14
18640        BCC L9FD0 ;$9FD0
18650 L9FE2  RTS
18660 ;
18670 ; We are using banks
18680 ;
18690 L9FE3  LDA PASS ;$009A First pass in regular memory
18700        BPL LA01D ;$A01D Others in banked memory
18710        LDA BNKFLG ;$0088 Are we doing regular memory?
18720        BEQ L9F74 ;$9F74
18730 L9FEB  LDA SECOND ;$008A Are we at or beyond second buffer load?
18740        BNE LA000 ;$A000 Yes
18750        JSR LA3DB ;$A3DB Get destination filespec
18760 L9FF2  JSR L9FA5 ;$9FA5 Prepare for writing
18770        JSR LA4F7 ;$A4F7 Open the diskcomm file for writing
18780        JSR LA542 ;$A542 Check for errors
18790        BCS L9FF2 ;$9FF2
18800        JMP LA003 ;$A003
18810 LA000  JSR L9FA5 ;$9FA5 Prepare for writing
18820 LA003  JSR L9D95 ;$9D95 Write data from a bank
18830        JSR LA542 ;$A542 Check for errors
18840        BCS L9FF2 ;$9FF2
18850        JSR LA524 ;$A524 Write the buffer in regular memory
18860        JSR LA542 ;$A542 Check for errors
18870        BCS L9FF2 ;$9FF2
18880        LDA #$00 ; Set regular memory
18890        STA BNKFLG ;$0088
18900        JSR L9D69 ;$9D69 Initialize bank stuff
18910        JMP LA5D4 ;$A5D4 Continue reading from source disk
18920 LA01D  LDA #$01 ; Set banked memory
18930        STA BNKFLG ;$0088
18940        LDA CNT256+1 ;$0086
18950        BNE LA030 ;$A030
18960        SEC
18970        LDA Z0246 ;$0084 Compute carry
18980        SBC BYTTOT ;$009E
18990        LDA CNT256 ;$0085
19000        SBC BYTTOT+1 ;$009F
19010        BCC L9FEB ;$9FEB
19020 LA030  LDA Z0246 ;$0084
19030        SBC BYTTOT ;$009E
19040        STA Z0246 ;$0084
19050        LDA CNT256 ;$0085
19060        SBC BYTTOT+1 ;$009F
19070        STA CNT256 ;$0085
19080        LDA CNT256+1 ;$0086
19090        SBC #$00
19100        STA CNT256+1 ;$0086
19110        LDA #L2F00 ; Start address of buffer
19120        STA BUFOUT ;$00AD
19130        LDA /L2F00
19140        STA BUFOUT+1 ;$00AE
19150 LA04A  LDA BYTTOT+1 ;$009F
19160        BEQ LA05A ;$A05A
19170        LDA #$00
19180        STA WORK9D ;$009D
19190        JSR L9EBA ;$9EBA
19200        DEC BYTTOT+1 ;$009F
19210        JMP LA04A ;$A04A
19220 LA05A  LDA BYTTOT ;$009E
19230        BEQ LA063 ;$A063
19240        STA WORK9D ;$009D
19250        JSR L9EBA ;$9EBA
19260 LA063  LDA #$00
19270        STA BYTTOT ;$009E
19280        STA BYTTOT+1 ;$009F
19290        LDA #$02 ; Start address of buffer after header bytes
19300        STA BUFOUT ;$00AD
19310        LDA #$2F
19320        STA BUFOUT+1 ;$00AE
19330        JSR PRTCLS ;$BC08
19340        JMP L986E ;$986E
19350 ;
19360 ; Read 16K of data from the file into banked memory
19370 ;
19380 LA077  LDA #$01
19390        STA BANKID ;$0089
19400        LDA PORTB ;$D301 Save current bank stuff
19410        STA BANKSW ;$00A1
19420        LDA #$00
19430        STA Z0246 ;$0084
19440        STA CNT256 ;$0085
19450        STA CNT256+1 ;$0086
19460        STA Z0315 ;$00B3
19470 LA08A  JSR SETBNK ;$9D85
19480        LDX #$10 ; IOCB 1
19490        LDA #$07 ; Get record
19500        STA ICCOM,X ;$0342
19510        LDA #$00 ; Read 16K into bank at $4000
19520        STA ICBAL,X ;$0344
19530        STA ICBLL,X ;$0348
19540        LDA #$40
19550        STA ICBAH,X ;$0345
19560        STA ICBLH,X ;$0349
19570        JSR CIOV ;$E456
19580        BMI LA0CF ;$A0CF Go handle the error
19590        CLC
19600        LDA CNT256 ;$0085
19610        ADC #$40 ; add 16K
19620        STA CNT256 ;$0085
19630        LDA CNT256+1 ;$0086
19640        ADC #$00
19650        STA CNT256+1 ;$0086
19660        INC BANKID ;$0089
19670        LDA BANKID ;$0089
19680        CMP Z0317 ;$00C8 Use extra ram?
19690        BCC LA08A ;$A08A
19700        DEC BANKID ;$0089 All buffers full
19710        LDA BANKID ;$0089
19720        STA BANKCD ;$0087
19730        LDA #$7F
19740        STA Z0245+1 ;$0083
19750        LDA #$FF
19760        STA Z0245 ;$0082
19770        JMP LA0FE ;$A0FE Reset bank stuff and exit
19780 LA0CF  LDA BANKID ;$0089 Handle the error
19790        STA BANKCD ;$0087
19800        INC Z0315 ;$00B3
19810        LDA IC1BLL ;$0358
19820        STA Z0245 ;$0082
19830        LDA IC1BLH ;$0359
19840        CLC
19850        ADC #$40
19860        STA Z0245+1 ;$0083
19870        CLC
19880        LDA Z0246 ;$0084
19890        ADC IC1BLL ;$0358
19900        STA Z0246 ;$0084
19910        LDA CNT256 ;$0085
19920        ADC IC1BLH ;$0359
19930        STA CNT256 ;$0085
19940        LDA CNT256+1 ;$0086
19950        ADC #$00
19960        STA CNT256+1 ;$0086
19970        CPY #$88 ; 136 End of file
19980        BNE LA0FE ;$A0FE
19990        JSR CLOSE1 ;$A63A
20000 LA0FE  LDA BANKSW ;$00A1 Restore bank stuff
20010        STA PORTB ;$D301
20020        RTS
20030 ;
20040 ; Test for valid path character
20050 ;
20060 LA104  LDY #42
20070 LA106  CMP TABPTH,Y ;$A11A
20080        BEQ LA118 ;$A118
20090        DEY
20100        BPL LA106 ;$A106
20110        LDY RENFLG ;$00A4 Rename command?
20120        BEQ LA116 ;$A116
20130        CMP #$2C ; ',' valid for rename
20140        BEQ LA118 ;$A118
20150 LA116  SEC ; Character rejected
20160        RTS
20170 LA118  CLC ; Character accepted
20180        RTS
20190 TABPTH .BYTE "ABCDEFGHIJKLM"
20200        .BYTE "NOPQRSTUVWXYZ"
20210        .BYTE "0123456789_:.*=?>"
20220 LA145  .BYTE +$80 "Filename >>>D"
20230 LA152  .BYTE $31
20240        .BYTE ":"
20250        .BYTE $00
20260 GETFIL LDA #3
20270        STA FSLEN ;$009B
20280        LDA DRIVE ;$008F
20290        CLC
20300        ADC #$30 ; '0'
20310        STA LA152
20320        STA FISPCD+1 ;$900A
20330        LDA #$44 ; 'D'
20340        STA FISPCD ;$9009
20350        LDA #$3A ; ':'
20360        STA FISPCD+2 ;$900B
20370        LDX #LA145
20380        LDY /LA145
20390        JSR PRTSTR ;Filename >>>
20400 LA175  JSR GETCHR ;$93AA
20410        CMP #$9B
20420        BNE LA19D ;$A19D
20430        LDY FSLEN ;$009B
20440        CPY #4 ; Single character filename?
20450        BEQ LA187 ;$A187
20460        BCS LA194 ;$A194
20470 LA184  JMP GOMENU ;$97B3
20480 LA187  LDX FISPCD+3 ;$900C Directory drive
20490        CPX #$3A ; 1 - 9 selected?
20500        BCS LA194 ;$A194
20510        TXA
20520        JSR DOCMND ;$A6CD Show directory
20530        SEC
20540        RTS
20550 LA194  STA FISPCD,Y ;$9009 Store in filespec
20560        JSR PRTCHR ;$939F
20570        JMP LA1D0 ;$A1D0
20580 LA19D  CMP #$7E ; Delete
20590        BEQ LA1C0 ;$A1C0
20600        JSR TOUPPR ;$95C8
20610        CMP #$1B ; Escape
20620        BEQ LA184 ;$A184
20630        LDY FSLEN ;$009B
20640        CPY #38 ; End of buffer
20650        BCS LA175 ;$A175
20660        JSR LA104 ;$A104 Valid path character?
20670        BCS LA175 ;$A175 Bad character
20680        LDY FSLEN ;$009B
20690        STA FISPCD,Y ;$9009 Store in filespec
20700        JSR PRTCHR ;$939F
20710        INC FSLEN ;$009B
20720        JMP LA175 ;$A175
20730 LA1C0  LDY FSLEN ;$009B
20740        CPY #$01
20750        BEQ LA175 ;$A175
20760        BCC LA175 ;$A175
20770        JSR PRTCHR ;$939F
20780        DEC FSLEN ;$009B
20790        JMP LA175 ;$A175
20800 LA1D0  CLC
20810        RTS
20820 LA1D2  .BYTE $7B,$9B,$9B
20830        .BYTE "[Type drv # and "
20840        .BYTE +$80 "RETURN"
20850        .BYTE " for directory]"
20860        .BYTE $9B,$9B
20870        .BYTE "Please enter "
20880        .BYTE +$80 "Destination"
20890        .BYTE " Filename:"
20900        .BYTE $9B,$9B
20910        .BYTE $00
20920 LA221  .BYTE "Remember to type a "
20930        .BYTE +$80 "[1]"
20940        .BYTE " or "
20950        .BYTE +$80 "[A]"
20960        .BYTE "!"
20970        .BYTE $9B,$9B
20980        .BYTE $00
20990 LA242  .BYTE $7D,$9B,$9B,$9B
21000        .BYTE "Filename: "
21010        .BYTE $00
21020 LA251  .BYTE $9B
21030        .BYTE "Position cursor on "
21040        .BYTE "character to be"
21050        .BYTE $9B
21060        .BYTE "incremented for "
21070        .BYTE "each file, hit "
21080        .BYTE +$80 "RETURN"
21090        .BYTE $00
21100 LA29B  .BYTE 1E1F00 ; left arrow/right arrow
21110 LA29E  .BYTE "  Your destination "
21120        .BYTE "disk is full!!!"
21130        .BYTE $9B
21140        .BYTE $00
21150 LA2CE  .BYTE $20,$20,$20,$11,$12
21160        .BYTE $12,$12,$12,$12,$12
21170        .BYTE $12,$12,$12,$12,$12
21180        .BYTE $12,$12,$12,$12,$12
21190        .BYTE $12,$12,$12,$12,$12
21200        .BYTE $12,$12,$12,$12,$12
21210        .BYTE $12,$05
21220        .BYTE $9B
21230        .BYTE $20,$20,$7C
21240        .BYTE "       Disk Error "
21250        .BYTE "Menu     "
21260        .BYTE $7C,$9B
21270        .BYTE $20,$20,$20,$01
21280        .BYTE $12,$12,$12,$12,$12
21290        .BYTE $12,$12,$12,$12,$12
21300        .BYTE $12,$12,$12,$12,$12
21310        .BYTE $12,$12,$12,$12,$12
21320        .BYTE $12,$12,$12,$12,$12
21330        .BYTE $12,$12,$04
21340        .BYTE $9B
21350        .BYTE $20,$20,$20,$7C
21360        .BYTE $20,$99
21370        .BYTE +$80 "[RETURN]"
21380        .BYTE $19
21390        .BYTE " Retry Save     "
21400        .BYTE $7C,$9B
21410        .BYTE $20,$20,$20,$7C
21420        .BYTE $20,$99
21430        .BYTE +$80 "[F]"
21440        .BYTE $19
21450        .BYTE " DOS functions"
21460        .BYTE $20,$20,$20,$20,$20,$20,$20,$7C,$9B
21470        .BYTE $20,$20,$20,$7C
21480        .BYTE $20,$99
21490        .BYTE +$80 "[1-9]"
21500        .BYTE $19
21510        .BYTE " Disk directories  "
21520        .BYTE $7C,$9B
21530        .BYTE $20,$20,$20,$7C
21540        .BYTE $20,$99
21550        .BYTE +$80 "[ESC]"
21560        .BYTE $19
21570        .BYTE " Exit              "
21580        .BYTE $7C,$9B
21590        .BYTE $20,$20,$20,$1A
21600        .BYTE $12,$12,$12,$12,$12
21610        .BYTE $12,$12,$12,$12,$12
21620        .BYTE $12,$12,$12,$12,$12
21630        .BYTE $12,$12,$12,$12,$12
21640        .BYTE $12,$12,$12,$12,$12
21650        .BYTE $12,$12,$03,$9B
21660        .BYTE $00
21670 LA3CB  SEC
21680        SBC #$41 ; 'A' small files / 'B' Large file
21690        STA LARGE ;$0099
21700 LA3D0  LDA LARGE ;$0099
21710        CLC
21720        ADC #$F9
21730        STA L2F00 ;$2F00 Store single file/multiple file flag in buffer
21740        JMP L9F6B ;$9F6B
21750 ;
21760 ; Get destination filespec
21770 ;
21780 LA3DB  LDA DSTDRV ;$9006
21790        STA DRIVE ;$008F
21800        LDX #LA1D2
21810        LDY /LA1D2
21820        JSR PRTSTR ;Type drive # for directory
21830        JSR FISPEC2FISPCD ;$A66A
21840        LDA LARGE ;$0099
21850        BNE LA3F5 ;$A3F5
21860        LDX #LA221
21870        LDY /LA221
21880        JSR PRTSTR ;Remember to type a 1 or A
21890 LA3F5  JSR GETFIL ;$A155
21900        BCC LA3FD ;$A3FD
21910        JMP LA3D0 ;$A3D0
21920 LA3FD  JSR FISPCD2FISPEC ;$A65E
21930        LDA FISPEC+1 ;$9035
21940        CMP #$3A
21950        BNE LA409 ;$A409
21960        LDA #$31
21970 LA409  SEC
21980        SBC #$30
21990        STA DSTDRV ;$9006
22000        LDA LARGE ;$0099
22010        BEQ GETINC ;$A414 Get character to be incremented
22020        RTS
22030 ;
22040 ; Let the user select the character to be incremented
22050 ;
22060 GETINC LDX #LA242
22070        LDY /LA242
22080        JSR PRTSTR ;Filename:
22090        LDY FSLEN ;$009B
22100        STY MAXLEN ;$00A2
22110        INY
22120        LDA #$00
22130        STA FISPEC,Y ;$9034
22140        LDX #FISPEC
22150        LDY /FISPEC
22160        JSR PRTSTR ;Print filespec
22170        LDX #LA251
22180        LDY /LA251
22190        JSR PRTSTR ;Position cursor on char to be incremented
22200        LDY FSLEN ;$009B
22210 LA435  LDA FISPEC,Y ;$9034
22220        CMP #$41 ; 'A'
22230        BEQ LA448 ;$A448
22240        CMP #$31 ; '1'
22250        BEQ LA448 ;$A448
22260        DEY
22270        CPY #2
22280        BCS LA435 ;$A435
22290        LDY FSLEN ;$009B
22300        DEY
22310 LA448  STY FSLEN ;$009B 'A' or '1' found
22320        TYA
22330        CLC
22340        ADC #12
22350        CMP #40
22360        BCC LA455 ;$A455
22370        SBC #40
22380        SEC
22390 LA455  STA COLCRS ;$0055
22400        LDA #$03
22410        ADC #$00
22420        STA ROWCRS ;$0054
22430        LDX #LA29B
22440        LDY /LA29B
22450        JSR PRTSTR ; left arrow/right arrow
22460        JSR BELL ;$95AB
22470 LA467  JSR GETCHR ;$93AA
22480        CMP #$1B
22490        BNE LA471 ;$A471
22500        JMP GOMENU ;$97B3
22510 LA471  CMP #$3C ; '<' treat as left arrow
22520        BEQ LA4A9 ;$A4A9
22530        CMP #$2B ; '+' treat as left arrow
22540        BEQ LA4A9 ;$A4A9
22550        CMP #$1E ; left arrow
22560        BEQ LA4A9 ;$A4A9
22570        CMP #$3E ; '>' treat as right arrow
22580        BEQ LA48F ;$A48F
22590        CMP #$2A ; '*' treat as right arrow
22600        BEQ LA48F ;$A48F
22610        CMP #$1F ; right arrow
22620        BEQ LA48F ;$A48F
22630        CMP #$9B ; Return
22640        BEQ LA4E1 ;$A4E1
22650        BNE LA467 ;$A467 Invalid keystroke
22660 LA48F  LDY FSLEN ;$009B Process right arrow
22670        INY
22680        CPY MAXLEN ;$00A2
22690        BEQ LA467 ;$A467 Invalid keystroke
22700        STY FSLEN ;$009B
22710        CPY #28 ; End of line?
22720        BNE LA4A1 ;$A4A1
22730        LDA #$1D ; Down arrow Continue on next line
22740        JSR PRTCHR ;$939F
22750 LA4A1  LDA #$1F ; Right arrow
22760        JSR PRTCHR ;$939F
22770        JMP LA467 ;$A467
22780 LA4A9  LDY FSLEN ;$009B Process left arrow
22790        CPY #2
22800        BEQ LA467 ;$A467 Invalid keystroke
22810        DEC FSLEN ;$009B
22820        LDA FSLEN ;$009B
22830        CMP #27 ; Start of line?
22840        BNE LA4BC ;$A4BC
22850        LDA #$1C ; Up arrow Back up to previous line
22860        JSR PRTCHR ;$939F
22870 LA4BC  LDA #$1E ; left arrow
22880        JSR PRTCHR ;$939F
22890        JMP LA467 ;$A467
22900 LA4C4  .BYTE +$80 "Writing   "
22910        .BYTE +$80 "                   "
22920 ;
22930 ; Enter, accept character to be incremented
22940 ;
22950 LA4E1  LDA FSLEN ;$009B
22960        STA INCSPC ;$00A3
22970        LDA #$9B
22980        JSR PRTCHR ;$939F
22990        JSR PRTCHR ;$939F
23000        JSR PRTCHR ;$939F
23010        JSR PRTCHR ;$939F
23020        JSR PRTCHR ;$939F
23030        RTS
23040 ;
23050 ; Open the diskcomm file for writing
23060 ;
23070 LA4F7  LDA DSTDRV ;$9006
23080        STA DRIVE ;$008F
23090        JSR L96D4 ;$96D4 Read sector 1
23100        STA DSTDEN ;$9007
23110        JSR SHWDDN ;$92BD
23120        JSR CLOSE1 ;$A63A
23130        LDA #$03
23140        LDX #$10
23150        STA ICCOM,X ;$0342
23160        LDA #$08 ; Open for write
23170        STA ICAX1,X ;$034A
23180        STA ICBLH,X ;$0349
23190        LDA #FISPEC
23200        STA ICBAL,X ;$0344
23210        LDA /FISPEC
23220        STA ICBAH,X ;$0345
23230        JMP CIOV ;$E456
23240 ;
23250 ; Write the buffer in regular memory
23260 ;
23270 LA524  LDX #$10
23280        LDA #$0B ; Put record
23290        STA ICCOM,X ;$0342
23300        LDA #L2F00 ; Address of buffer
23310        STA ICBAL,X ;$0344
23320        LDA /L2F00
23330        STA ICBAH,X ;$0345
23340        LDA BYTTOT ;$009E
23350        STA ICBLL,X ;$0348
23360        LDA BYTTOT+1 ;$009F
23370        STA ICBLH,X ;$0349
23380        JMP CIOV ;$E456
23390 ;
23400 ; Check for errors
23410 ;
23420 LA542  STY STATUS ;$00A0
23430        CPY #$80
23440        BCS LA549 ;$A549
23450        RTS
23460 LA549  JSR CLOSE1 ;$A63A
23470        LDY STATUS ;$00A0
23480        JSR WRTERR ;$99E0
23490        LDA STATUS ;$00A0
23500        CMP #128 ; Break abort
23510        BEQ LA571 ;$A571
23520        CMP #160 ; Drive number error
23530        BEQ LA571 ;$A571
23540        CMP #165 ; File name error
23550        BEQ LA571 ;$A571
23560        LDX SECOND ;$008A Are we at or beyond second buffer load?
23570        BEQ LA574 ;$A574 No
23580        CMP #162 ; Disk full error
23590        BNE LA571 ;$A571
23600        LDX #LA29E
23610        LDY /LA29E
23620        JSR PRTSTR ;Your destination disk is full
23630        JSR LA644 ;$A644 Close file and delete it
23640 LA571  JMP GOMENU ;$97B3
23650 LA574  JSR PRTCLS ;$BC08
23660        LDA #$9B
23670        JSR PRTCHR ;$939F
23680        JSR PRTCHR ;$939F
23690        LDA STATUS ;$00A0
23700        CMP #162 ; Disk full error
23710        BNE LA58F ;$A58F
23720        LDX #LA29E
23730        LDY /LA29E
23740        JSR PRTSTR ;Your destination disk is full
23750        JSR LA644 ;$A644 Close file and delete it
23760 LA58F  LDA #$01
23770        STA CRSINH ;$02F0
23780        LDX #LA2C2
23790        LDY /LA2C2
23800        JSR PRTSTR ;Error menu
23810        LDA #$00
23820        STA CRSINH ;$02F0
23830 LA5A0  JSR GETCHR ;$93AA
23840        CMP #$1B
23850        BEQ LA571 ;$A571
23860        CMP #$9B
23870        BNE LA5AC ;$A5AC
23880        RTS
23890 LA5AC  JSR TOUPPR ;$95C8
23900        CMP #$46
23910        BNE LA5C6 ;$A5C6
23920        JSR DOSFNS ;$AAD4
23930 LA5B6  LDA #$7D
23940        JSR PRTCHR ;$939F
23950        LDA #$9B
23960        JSR PRTCHR ;$939F
23970        JSR PRTCHR ;$939F
23980        JMP LA58F ;$A58F
23990 LA5C6  CMP #$41
24000        BCS LA5A0 ;$A5A0
24010        CMP #$20
24020        BCC LA5A0 ;$A5A0
24030        JSR DOCMND ;$A6CD
24040        JMP LA5B6 ;$A5B6
24050 ;
24060 ; Done writing buffers, continue reading from source disk.
24070 ;
24080 LA5D4  LDA #$00
24090        STA BYTTOT+1 ;$009F
24100        STA BYTTOT ;$009E
24110        LDA #$02 ; Start address of buffer after header bytes
24120        STA BUFOUT ;$00AD
24130        LDA #$2F
24140        STA BUFOUT+1 ;$00AE
24150        INC SECOND ;$008A At or beyond second buffer load
24160        JSR PRTCLS ;$BC08
24170        LDA LARGE ;$0099
24180        BNE LA5FC ;$A5FC
24190        LDX INCSPC ;$00A3
24200        INC FISPEC,X ;$9034
24210        JSR LA62E ;$A62E Close the diskcomm file
24220        JMP LA5FC ;$A5FC
24230 LA5F6  JSR SWPSRC ;$B680 Possibly swap disks
24240        JMP L986E ;$986E
24250 LA5FC  LDA PASS ;$009A
24260        BPL LA5F6 ;$A5F6
24270        JSR LA62E ;$A62E Close the diskcomm file
24280        LDY #$1B
24290 LA605  LDA LA611,Y ;$A611 Disk turned into file(s)
24300        STA L90B8,Y ;$90B8
24310        DEY
24320        BPL LA605 ;$A605
24330        JMP GOMENU ;$97B3
24340 LA611  .BYTE +$80 "Disk turned into "
24350        .BYTE +$80 "file(s)!!! "
24360 LA62E  JSR CLOSE1 ;$A63A
24370        BPL LA639 ;$A639
24380        JSR WRTERR ;$99E0
24390        JMP GOMENU ;$97B3
24400 LA639  RTS
24410 CLOSE1 LDX #$10
24420        LDA #$0C ; Close
24430        STA ICCOM,X ;$0342
24440        JMP CIOV ;$E456
24450 ;
24460 ; Disk full, close file and delete it
24470 ;
24480 LA644  JSR CLOSE1 ;$A63A
24490        LDX #$10
24500        LDA #$21 ;Delete
24510        STA ICCOM,X ;$0342
24520        LDA #FISPEC
24530        STA ICBAL,X ;$0344
24540        LDA /FISPEC
24550        STA ICBAH,X ;$0345
24560        JSR CIOV ;$E456
24570        JMP CLOSE1 ;$A63A
24580 FISPCD2FISPEC  LDY #$27
24590 LA660  LDA FISPCD,Y ;$9009
24600        STA FISPEC,Y ;$9034
24610        DEY
24620        BPL LA660 ;$A660
24630        RTS
24640 FISPEC2FISPCD  LDY #$27
24650 LA66C  LDA FISPEC,Y ;$9034
24660        STA FISPCD,Y ;$9009
24670        DEY
24680        BPL LA66C ;$A66C
24690        RTS
24700 LA676  .BYTE $7D
24710        .BYTE "Directory of "
24720        .BYTE $00
24730 LA685  .BYTE $9B
24740        .BYTE "Drive #, or "
24750        .BYTE +$80 "RETURN"
24760        .BYTE " to continue..."
24770        .BYTE $00
24780        .BYTE "Hit "
24790        .BYTE +$80 "RETURN"
24800        .BYTE " for more entries..."
24810        .BYTE $00
24820 LA6C7  .BYTE ":*.*"
24830        .BYTE $9B
24840        .BYTE $00
24850 ;
24860 ; A6CD other commands
24870 ;
24880 DOCMND CMP #$21
24890        BCC LA6E9 ;$A6E9
24900        CMP #$28
24910        BEQ LA6EA ;$A6EA
24920        CMP #$29
24930        BCC LA6EC ;$A6EC
24940        CMP #$31
24950        BCC LA6E9 ;$A6E9
24960        CMP #$3A
24970        BCC LA6EC ;$A6EC
24980        CMP #$40
24990        BNE LA6E9 ;$A6E9
25000        LDA #$28
25010        BNE LA6EC ;$A6EC
25020 LA6E9  RTS
25030 LA6EA  LDA #$29
25040 LA6EC  LDX #$80
25050        CMP #$30
25060        BCS LA6F6 ;$A6F6
25070        LDX #$00
25080        ADC #$10
25090 LA6F6  STX IC1AX2 ;$035B
25100        STA FISPCD+1 ;$900A
25110        LDA #$44
25120        STA FISPCD ;$9009
25130        LDX #$05
25140 LA703  LDA LA6C7,X ;$A6C7
25150        STA FISPCD+2,X ;$900B
25160        DEX
25170        BPL LA703 ;$A703
25180        LDX #LA676
25190        LDY /LA676
25200        JSR PRTSTR ;Directory of
25210        LDX #FISPCD
25220        LDY /FISPCD
25230        JSR PRTSTR ;Print filespec
25240 LA71A  LDA #$06
25250        STA IC1AX1 ;$035A
25260        JSR CLOSE1 ;$A63A
25270        LDA DRIVE ;$008F
25280        PHA
25290        LDA FISPCD+1 ;$900A
25300        AND #$0F
25310        STA DRIVE ;$008F
25320        JSR L96D4 ;$96D4 Read sector 1
25330        JSR L974A ;$974A
25340        PLA
25350        STA DRIVE ;$008F
25360        LDA #$03 ; Open
25370        STA IC1COM ;$0352
25380        LDX #$10
25390        LDA #FISPCD
25400        STA IC1BAL ;$0354
25410        LDA /FISPCD
25420        STA IC1BAH ;$0355
25430        JSR CIOV ;$E456
25440        BPL LA795 ;$A795
25450        STY STATUS ;$00A0
25460        JSR CLOSE1 ;$A63A
25470        LDY STATUS ;$00A0
25480        JSR SHWERR ;$99BB
25490        JSR LA75B ;$A75B
25500        JMP DOCMND ;$A6CD
25510 LA75B  LDX #LA685
25520        LDY /LA685
25530 LA75F  JSR PRTSTR ;Drive # or
25540 LA762  JSR GETCHR ;$93AA
25550        CMP #$9B
25560        BEQ LA787 ;$A787
25570        AND #$7F
25580        CMP #$20
25590        BEQ LA787 ;$A787
25600        CMP #$1B
25610        BEQ LA787 ;$A787
25620        CMP #$21
25630        BCC LA762 ;$A762
25640        CMP #$29
25650        BCC LA787 ;$A787
25660        CMP #$31
25670        BCC LA762 ;$A762
25680        CMP #$3A
25690        BCC LA787 ;$A787
25700        CMP #$40
25710        BNE LA762 ;$A762
25720 LA787  RTS
25730 LA788  LDX #$A8
25740        LDY #$A6
25750        JSR LA75F ;$A75F
25760        PHA
25770        JSR PRTCLS ;$BC08
25780        PLA
25790        RTS
25800 LA795  LDA #$00
25810 LA797  STA SECIDX ;$0091
25820 LA799  LDX #$10
25830        LDA #$05
25840        STA ICCOM,X ;$0342
25850        LDA #$90
25860        STA ICBAH,X ;$0345
25870        LDA #$28
25880        STA ICBLL,X ;$0348
25890        LDA #$00
25900        STA ICBLH,X ;$0349
25910        JSR CIOV ;$E456
25920        BPL LA7BD ;$A7BD
25930        JSR CLOSE1 ;$A63A
25940        JSR LA75B ;$A75B
25950        JMP DOCMND ;$A6CD
25960 LA7BD  LDA #$00
25970        STA FSLEN ;$009B
25980 LA7C1  LDY FSLEN ;$009B
25990        LDA FISPCD,Y ;$9009
26000        JSR PRTCHR ;$939F
26010        INC FSLEN ;$009B
26020        CMP #$9B
26030        BNE LA7C1 ;$A7C1
26040        INC SECIDX ;$0091
26050        LDA SECIDX ;$0091
26060        CMP #$10
26070        BCC LA799 ;$A799
26080        JSR LA788 ;$A788
26090        CMP #$1B
26100        BEQ LA7E3 ;$A7E3
26110        LDA #$FF
26120        JMP LA797 ;$A797
26130 LA7E3  JSR CLOSE1 ;$A63A
26140        RTS
26150 LA7E7  .BYTE 7B9B9B
26160        .BYTE "    ["
26170        .BYTE +$80 "RETURN"
26180        .BYTE " to exit to "
26190        .BYTE "Main menu]"
26200        .BYTE $9B,$9B
26210        .BYTE "Enter the highest "
26220        .BYTE "sector # your drive"
26230        .BYTE $9B
26240        .BYTE "is capable of "
26250        .BYTE "reading in decimal"
26260        .BYTE $9B
26270        .BYTE "format: "
26280        .BYTE $00
26290 ;
26300 ; Change maximum sector
26310 ;
26320 LA85D  LDX #LA7E7
26330        LDY /LA7E7
26340        JSR PRTSTR ;Enter sector number
26350        LDX #$00
26360        LDA #$05 ; Get text record
26370        STA ICCOM ;$0342
26380        STA ICBLL ;$0348
26390        STX ICBLH ;$0349
26400        STX SERBUF ;$00F2
26410        LDA #FISPCD
26420        STA ICBAL,X ;$0344
26430        STA SERBUF+1 ;$00F3
26440        LDA /FISPCD
26450        STA SERLEN ;$00F4
26460        STA ICBAH,X ;$0345
26470        JSR CIOV ;$E456
26480        BPL LA889 ;$A889
26490 LA886  JMP GOMENU ;$97B3
26500 LA889  JSR AFP ;$D800 AFP ASCII to FP
26510        BCS LA886 ;$A886
26520        JSR FPI ;$D9D2 FPI FP to integer
26530        BCS LA886 ;$A886
26540        LDA FR0 ;$00D4 FR0 lo
26550        STA MAXSEC ;$9000
26560        LDX FR0+1 ;$00D5 FR0 hi
26570        STX MAXSEC+1 ;$9001
26580        LDY #$5D ; Offset for max sector number
26590        JSR SHWNUM ;$932B
26600        JMP GOMENU ;$97B3
26610 LA8A5  .BYTE $7D,$9B,$20,$20,$20
26620        .BYTE $20,$11,$12,$12,$12
26630        .BYTE $12,$12,$12,$12,$12
26640        .BYTE $12,$12,$12,$12,$12
26650        .BYTE $12,$12,$12,$12,$12
26660        .BYTE $12,$12,$12,$12,$12
26670        .BYTE $12,$12,$05,$9B
26680        .BYTE $20,$20,$20,$20,$7C
26690        .BYTE "    DOS Functions "
26700        .BYTE "menu   "
26710        .BYTE $7C,$9B
26720        .BYTE $20,$20,$20,$20
26730        .BYTE $01,$12,$12,$12,$12
26740        .BYTE $12,$12,$12,$12,$12
26750        .BYTE $12,$12,$12,$12,$12
26760        .BYTE $12,$12,$12,$12,$12
26770        .BYTE $12,$12,$12,$12,$12
26780        .BYTE $12,$04,$9B
26790        .BYTE $20,$20,$20,$20,$7C
26800        .BYTE $20,$99
26810        .BYTE +$80 "[A]"
26820        .BYTE $19
26830        .BYTE " Subdirectory Dir  "
26840        .BYTE $7C,$9B
26850        .BYTE $20,$20,$20,$20,$7C
26860        .BYTE $20,$99
26870        .BYTE +$80 "[B]"
26880        .BYTE $19
26890        .BYTE " Format disk       "
26900        .BYTE $7C,$9B
26910        .BYTE $20,$20,$20,$20,$7C
26920        .BYTE $20,$99
26930        .BYTE +$80 "[C]"
26940        .BYTE $19
26950        .BYTE " Copy file (single)"
26960        .BYTE $7C,$9B
26970        .BYTE $20,$20,$20,$20,$7C
26980        .BYTE $20,$99
26990        .BYTE +$80 "[D]"
27000        .BYTE $19
27010        .BYTE " Delete file       "
27020        .BYTE $7C,$9B
27030        .BYTE $20,$20,$20,$20,$7C
27040        .BYTE $20,$99
27050        .BYTE +$80 "[E]"
27060        .BYTE $19
27070        .BYTE " Rename file       "
27080        .BYTE $7C,$9B
27090        .BYTE $20,$20,$20,$20,$7C
27100        .BYTE $20,$99
27110        .BYTE +$80 "[F]"
27120        .BYTE $19
27130        .BYTE " Lock file         "
27140        .BYTE $7C,$9B
27150        .BYTE $20,$20,$20,$20,$7C
27160        .BYTE $20,$99
27170        .BYTE +$80 "[G]"
27180        .BYTE $19
27190        .BYTE " Unlock file       "
27200        .BYTE $7C,$9B
27210        .BYTE $20,$20,$20,$20,$7C
27220        .BYTE $20,$99
27230        .BYTE +$80 "[1-9]"
27240        .BYTE $19
27250        .BYTE " Diskdirectories"
27260        .BYTE $7C,$9B
27270        .BYTE $20,$20,$20,$20,$7C
27280        .BYTE $20,$99
27290        .BYTE +$80 "[ESC]"
27300        .BYTE $19
27310        .BYTE " to exit           "
27320        .BYTE $7C,$9B
27330        .BYTE "    "
27340        .BYTE $1A,$12,$12,$12,$12
27350        .BYTE $12,$12,$12,$12,$12
27360        .BYTE $12,$12,$12,$12,$12
27370        .BYTE $12,$12,$12,$12,$12
27380        .BYTE $12,$12,$12,$12,$12
27390        .BYTE $12,$03,$9B
27400        .BYTE $00
27410 LAA48  .BYTE $7D,$9B,$9B,$9B
27420        .BYTE "Enter full "
27430        .BYTE "subdirectory name:"
27440        .BYTE $9B,$9B
27450        .BYTE $00
27460 LAA6C  .BYTE $9B,$9B
27470        .BYTE "Enter [old name],"
27480        .BYTE "[new name]:"
27490        .BYTE $9B,$9B
27500        .BYTE $00
27510 LAA9B  .BYTE $9B,$9B,$9B
27520        .BYTE "Enter filename "
27530        .BYTE "to be "
27540        .BYTE $00
27550 LAAB4  .BYTE "Deleted"
27560        .BYTE $1B
27570        .BYTE "UnlockedLocked"
27580        .BYTE $1F,$1E ; right arrow/left arrow
27590        .BYTE "Unlocked"
27600 ;
27610 ; DOS functions menu
27620 ;
27630 DOSFNS  LDA #$01
27640        STA CRSINH ;$02F0
27650        LDX #LA8A5
27660        LDY /LA8A5
27670        JSR PRTSTR ;DOS menu
27680        LDY #$01
27690        STY DRIVE ;$008F
27700        DEY
27710        STY CRSINH ;$02F0
27720 LAAE8  JSR GETCHR ;$93AA
27730        AND #$7F
27740        CMP #$1B
27750        BNE LAAF2 ;$AAF2
27760        RTS
27770 LAAF2  JSR TOUPPR ;$95C8
27780        CMP #$20 ; space
27790        BCC LAAE8 ;$AAE8
27800        CMP #$41 ; 'A'
27810        BCS LAB03 ;$AB03
27820        JSR DOCMND ;$A6CD
27830        JMP DOSFNS ;$AAD4
27840 LAB03  CMP #$41 ; 'A'
27850        BNE LAB35 ;$AB35
27860 LAB07  LDX #LAA48
27870        LDY /LAA48
27880        JSR PRTSTR ;Enter subdirectory
27890        JSR GETFIL ;$A155
27900        BCS LAB07 ;$AB07
27910        LDY FSLEN ;$009B
27920        LDA #$2A
27930        STA FISPCD,Y ;$9009
27940        STA FISPCD+2,Y ;$900B
27950        LDA #$2E
27960        STA FISPCD+1,Y ;$900A
27970        LDA #$9B
27980        STA FISPCD+3,Y ;$900C
27990        LDA #$80
28000        STA IC1AX2 ;$035B
28010        JSR PRTCLS ;$BC08
28020        JSR LA71A ;$A71A
28030        JMP DOSFNS ;$AAD4
28040 LAB35  CMP #$44 ; 'D'
28050        BEQ LAB51 ;$AB51
28060        CMP #$45 ; 'E'
28070        BEQ LAB4E ;$AB4E
28080        CMP #$46 ; 'F'
28090        BEQ LAB4B ;$AB4B
28100        CMP #$47 ; 'G'
28110        BEQ LAB48 ;$AB48
28120        JMP LAC65 ;$AC65
28130 LAB48  LDA #$24
28140        .BYTE #$2C ; Fake BIT instruction
28150 LAB4B  LDA #$23
28160        .BYTE #$2C ; Fake BIT instruction
28170 LAB4E  LDA #$20
28180        .BYTE #$2C ; Fake BIT instruction
28190 LAB51  LDA #$21
28200        PHA
28210        JSR CLOSE1 ;$A63A
28220        JSR PRTCLS ;$BC08
28230        PLA
28240        STA IC1COM ;$0352
28250        STA WORKLO ;$00B8
28260 LAB60  CMP #$20
28270        BNE LAB72 ;$AB72
28280        LDX #LAA6C
28290        LDY /LAA6C
28300        JSR PRTSTR ;Enter old name / new name
28310        LDA #$01
28320        STA RENFLG ;$00A4
28330        JMP LABA4 ;$ABA4
28340 LAB72  LDX #LAA9B
28350        LDY /LAA9B
28360        JSR PRTSTR ;Enter file to
28370        LDA IC1COM ;$0352
28380        SEC
28390        SBC #$21
28400        CLC
28410        ASL
28420        ASL
28430        ASL
28440        STA FSLEN ;$009B
28450        LDY #$07
28460        STY STATUS ;$00A0
28470 LAB89  LDX FSLEN ;$009B
28480        LDA LAAB4,X ;$AAB4
28490        JSR PRTCHR ;$939F
28500        INC FSLEN ;$009B
28510        DEC STATUS ;$00A0
28520        BPL LAB89 ;$AB89
28530        LDA #$3A
28540        JSR PRTCHR ;$939F
28550        LDA #$9B
28560        JSR PRTCHR ;$939F
28570        JSR PRTCHR ;$939F
28580 LABA4  JSR GETFIL ;$A155
28590        BCC LABB5 ;$ABB5
28600        LDA #$00
28610        STA RENFLG ;$00A4
28620        LDA WORKLO ;$00B8
28630        STA IC1COM ;$0352
28640        JMP LAB60 ;$AB60
28650 LABB5  LDX #$10
28660        LDA #$00
28670        STA RENFLG ;$00A4
28680        LDA #FISPCD
28690        STA ICBAL,X ;$0344
28700        LDA /FISPCD
28710        STA ICBAH,X ;$0345
28720        JSR CIOV ;$E456
28730        BPL COMPLT ;$ABD3
28740        JSR SHWERR ;$99BB
28750        JSR CLOSE1 ;$A63A
28760        JMP DOSFNS ;$AAD4
28770 COMPLT LDY #$1C
28780 LABD5  LDA LABE6,Y ;$ABE6 Operation completed...
28790        STA L90B8,Y ;$90B8
28800        DEY
28810        BPL LABD5 ;$ABD5
28820        LDA #$FF
28830        STA CH ;$02FC
28840        JMP DOSFNS ;$AAD4
28850 LABE6  .SBYTE -" Operation "
28860        .SBYTE -"Completed...      "
28870 LAC03  .BYTE $7D,$9B,$9B
28880        .BYTE "Copy File:"
28890        .BYTE $9B,$9B
28900        .BYTE "Enter Source "
28910        .BYTE "filename:"
28920        .BYTE $9B,$9B
28930        .BYTE $00
28940 LACB2  .BYTE $7D,$9B,$9B
28950        .BYTE "Copy file:"
28960        .BYTE $9B,$9B
28970        .BYTE "Enter Destination "
28980        .BYTE "filename:"
28990        .BYTE $9B,$9B
29000        .BYTE $00
29010 LAC58  .BYTE $9B,$9B
29020        .BYTE "Copying..."
29030        .BYTE $00
29040 LAC65  CMP #$43 ; 'C'
29050        BEQ LAC6C ;$AC6C
29060        JMP LAE11 ;$AE11
29070 LAC6C  LDX #LAC03
29080        LDY /LAC03
29090        JSR PRTSTR ;Copy file source
29100        JSR L974A ;$974A
29110        JSR GETFIL ;$A155
29120        BCS LAC6C ;$AC6C
29130        LDY #$27
29140 LAC7D  LDA FISPCD,Y ;$9009
29150        STA L2400,Y ;$2400
29160        DEY
29170        BPL LAC7D ;$AC7D
29180 LAC86  LDX #LAC2B
29190        LDY /LAC2B
29200        JSR PRTSTR ;Copy file destination
29210        JSR GETFIL ;$A155
29220        BCS LAC86 ;$AC86
29230        JSR CLOSE1 ;$A63A
29240        JSR CLOSE2 ;$AD54
29250        LDX #LAC58
29260        LDY /LAC58
29270        JSR PRTSTR ;Copying
29280        LDA #$03 ; Open
29290        STA IC1COM ;$0352
29300        STA IC2COM ;$0362
29310        LDA #L2400 ; Source filespec
29320        STA IC1BAL ;$0354
29330        LDA /L2400
29340        STA IC1BAH ;$0355
29350        LDA #FISPCD ; Destination filespec
29360        STA IC2BAL ;$0364
29370        LDA /FISPCD
29380        STA IC2BAH ;$0365
29390        LDA #$04 ; Open for read
29400        STA IC1AX1 ;$035A
29410        LDA #$08 ; Open for write
29420        STA IC2AX1 ;$036A
29430        LDX #$10 ; IOCB 1
29440        JSR CIOV ;$E456
29450        BMI LAD34 ;$AD34 Error on source file?
29460        LDX #$20 ; IOCB 2
29470        JSR CIOV ;$E456
29480        BMI LAD44 ;$AD44 Error on destination file?
29490        LDA #$00
29500        STA SRCEOF ;$0091
29510 LACD7  LDA #$07 ; Get binary record
29520        STA IC1COM ;$0352
29530        LDA #$0B ; Put binary record
29540        STA IC2COM ;$0362
29550        LDA #L2400
29560        STA IC1BAL ;$0354
29570        STA IC2BAL ;$0364
29580        LDA /L2400
29590        STA IC1BAH ;$0355
29600        STA IC2BAH ;$0365
29610        LDA #$00
29620        STA IC1BLL ;$0358
29630        LDA #$09
29640        STA IC1BLH ;$0359
29650        LDX #$10 ; IOCB 1
29660        JSR CIOV ;$E456
29670        CPY #$7F ; Error on input?
29680        BCC LAD12 ;$AD12
29690        CPY #136 ; End of file
29700        BNE LAD34 ;$AD34
29710        LDA IC1BLL ;$0358
29720        ORA IC1BLH ;$0359
29730        BEQ LAD29 ;$AD29 Any bytes in the buffer?
29740        INC SRCEOF ;$0091
29750 LAD12  LDA IC1BLL ;$0358
29760        STA IC2BLL ;$0368
29770        LDA IC1BLH ;$0359
29780        STA IC2BLH ;$0369
29790        LDX #$20 ; IOCB 2
29800        JSR CIOV ;$E456
29810        BMI LAD44 ;$AD44 Error on output file?
29820        LDA SRCEOF ;$0091 End of file reached?
29830        BEQ LACD7 ;$ACD7
29840 LAD29  JSR CLOSE1 ;$A63A
29850        JSR CLOSE2 ;$AD54
29860        BMI LAD44 ;$AD44
29870        JMP COMPLT ;$ABD3
29880 LAD34  STY STATUS ;$00A0
29890        JSR CLOSE1 ;$A63A
29900        JSR CLOSE2 ;$AD54
29910        LDY STATUS ;$00A0
29920        JSR SHWERR ;$99BB
29930        JMP DOSFNS ;$AAD4
29940 LAD44  STY STATUS ;$00A0
29950        JSR CLOSE1 ;$A63A
29960        JSR CLOSE2 ;$AD54
29970        LDY STATUS ;$00A0
29980        JSR WRTERR ;$99E0
29990        JMP DOSFNS ;$AAD4
30000 CLOSE2 LDX #$20 ; IOCB 2
30010        LDA #$0C ; Close
30020        STA ICCOM,X ;$0342
30030        JMP CIOV ;$E456
30040 LAD5E  .BYTE $7D,$9B,$9B
30050        .BYTE "Which drive to "
30060        .BYTE "format?"
30070        .BYTE $00
30080 LAD78  .BYTE $9B,$9B
30090        .BYTE "     "
30100        .BYTE +$80 "[1]"
30110        .BYTE " Single    "
30120        .BYTE +$80 "[2]"
30130        .BYTE " Double"
30140        .BYTE $9B
30150        .BYTE $00
30160 LAD99  .BYTE $9B,$9B
30170        .BYTE "     "
30180        .BYTE +$80 "[1]"
30190        .BYTE " Single    "
30200        .BYTE +$80 "[3]"
30210        .BYTE "Enhanced"
30220        .BYTE $9B
30230        .BYTE $00
30240 LADBC  .BYTE $9B
30250        .BYTE "Format in which "
30260        .BYTE "density?"
30270        .BYTE $00
30280 LADD6  .BYTE $9B,$9B
30290        .BYTE Format drive "
30300 LADE6  .BYTE $00
30310        .BYTE " in "
30320        .BYTE $00
30330 LADEC  .BYTE "Single"
30340        .BYTE $1F,$1E ; right arrow/left arrow
30350        .BYTE "Double"
30360        .BYTE $1F,$1E ; right arrow/left arrow
30370        .BYTE "Enhanced"
30380 LAE04  .BYTE " density?"
30390        .BYTE $00
30400 LAE0E  JMP (DOSINI)
30410 LAE11  CMP #$42
30420        BEQ LAE18 ;$AE18
30430 LAE15  JMP DOSFNS ;$AAD4
30440 LAE18  LDX #LAD5E
30450        LDY /LAD5E
30460        JSR PRTSTR ;Which drive to format
30470 LAE1F  JSR GETCHR ;$93AA
30480        JSR TOUPPR ;$95C8
30490        CMP #$1B
30500        BEQ LAE15 ;$AE15
30510        CMP #$31
30520        BCC LAE1F ;$AE1F
30530        CMP #$3A
30540        BCS LAE1F ;$AE1F
30550        STA FISPCD+1 ;$900A
30560        JSR PRTCHR ;$939F
30570        AND #$0F
30580        STA DRIVE ;$008F
30590        LDA #$44
30600        STA FISPCD ;$9009
30610        LDA #$3A
30620        STA FISPCD+2 ;$900B
30630        LDA #$9B
30640        STA FISPCD+3 ;$900C
30650        LDA L104B ;$104B
30660        CMP #$69 ; Check DOS 2.5
30670        BNE LAE5B ;$AE5B
30680        LDA L10B2 ;$10B2
30690        CMP #$01 ; Check DOS 2.5
30700        BNE LAE5B ;$AE5B
30710        LDA #$01 ; DOS 2.5
30720        .BYTE #$2C ; Fake BIT instruction
30730 LAE5B  LDA #$00 ; DOS 2.0 or other DOS
30740        STA DOSVER ;$00A0
30750        CMP #$00 ; Enhanced density support?
30760        BNE LAE6D ;$AE6D
30770        LDX #LAD78
30780        LDY /LAD78
30790        JSR PRTSTR ;Single density / Double density
30800        JMP LAE74 ;$AE74
30810 LAE6D  LDX #LAD99
30820        LDY /LAD99
30830        JSR PRTSTR ;Single / Enhanced
30840 LAE74  LDX #LADBC
30850        LDY /LADBC
30860        JSR PRTSTR ;Which density
30870 LAE7B  JSR GETCHR ;$93AA
30880        JSR TOUPPR ;$95C8
30890        CMP #$1B ; Escape
30900        BEQ LAE15 ;$AE15
30910        CMP #$30 ; Only keys 1 - 3
30920        BCC LAE7B ;$AE7B Rejected
30930        CMP #$34
30940        BCS LAE7B ;$AE7B Rejected
30950        LDY DOSVER ;$00A0
30960        BEQ LAE97 ;$AE97 Non DOS 2.5
30970        CMP #$32 ; Option 2 invalid for DOS 2.5
30980        BEQ LAE7B ;$AE7B Rejected
30990        BNE LAE9B ;$AE9B
31000 LAE97  CMP #$33 ; Option 3 invalid for DOS 2.0
31010        BEQ LAE7B ;$AE7B Rejected
31020 LAE9B  JSR PRTCHR ;$939F
31030        PHA
31040        LDA #$9B
31050        JSR PRTCHR ;$939F
31060        PLA
31070        AND #$0F ; Convert to number 1 - 3
31080        STA DENSITY ;$0090
31090        LDX DRIVE ;$008F
31100        JSR RDCFG ;$91ED
31110        JSR LAE0E ;$AE0E
31120        LDX DRIVE ;$008F
31130        JSR RDSTAT ;$919E
31140        STA WORKBC ;$00BC Save current density
31150        LDX #LADD6
31160        LDY /LADD6
31170        LDA DRIVE ;$008F
31180        ORA #$30
31190        STA LADE6 ;$ADE6 Fill in drive number
31200        JSR PRTSTR ;Format drive # in
31210        LDA DENSITY ;$0090
31220        CMP #$03 ; Enhanced?
31230        BEQ LAECE ;$AECE
31240        LDA WORKBC ;$00BC
31250 LAECE  SEC
31260        STA WORKBA ;$00BA Save density
31270        SBC #$01
31280        CLC
31290        ASL
31300        ASL
31310        ASL
31320        STA WORKHI ;$00B9
31330        LDA #$07
31340        STA WORKLO ;$00B8
31350 LAEDD  LDY WORKHI ;$00B9
31360        LDA LADEC,Y ;$ADEC ; single / double / enhanced
31370        JSR PRTCHR ;$939F
31380        INC WORKHI ;$00B9
31390        DEC WORKLO ;$00B8
31400        BPL LAEDD ;$AEDD
31410        LDX #LAE04
31420        LDY /LAE04
31430        JSR PRTSTR ;Density
31440        LDA #$FF
31450        STA CH ;$02FC
31460        JSR BELL ;$95AB
31470        JSR GETCHR ;$93AA
31480        JSR TOUPPR ;$95C8
31490        CMP #$59
31500        BEQ LAF07 ;$AF07
31510        JMP DOSFNS ;$AAD4
31520 LAF07  JSR PRTCHR ;$939F
31530        LDA #$9B
31540        JSR PRTCHR ;$939F
31550        LDA #$00
31560        STA IC1AX1 ;$035A
31570        STA IC1AX2 ;$035B
31580        LDA #FISPCD
31590        STA IC1BAL ;$0354
31600        LDA /FISPCD
31610        STA IC1BAH ;$0355
31620        LDA #$FE ; Format
31630        STA IC1COM ;$0352
31640        LDA STATUS ;$00A0
31650        BEQ LAF35 ;$AF35
31660        LDA WORKBA ;$00BA Get density
31670        CMP #$01
31680        BNE LAF35 ;$AF35
31690        LDA #$FD ; Format single
31700        STA IC1COM ;$0352
31710 LAF35  LDX #$10
31720        JSR CIOV ;$E456
31730        BMI LAF3F ;$AF3F
31740        JMP COMPLT ;$ABD3
31750 LAF3F  JMP LAD44 ;$AD44
31760 ;
31770 ; Sector number table 18 pairs
31780 ;
31790 TABSEC .WORD 0,0,0,0,0
31800        .WORD 0,0,0,0,0
31810        .WORD 0,0,0,0,0
31820        .WORD 0,0,0
31830 LAF66  .BYTE $7D,$9B,$9B
31840        .BYTE "[Type drv # and "
31850        .BYTE +$80 "RETURN"
31860        .BYTE " for directory]"
31870        .BYTE $00
31880 LAF8F  .BYTE $9B,$9B,$9C,$9C,$9C,$9C,$9C
31890        .BYTE "Please enter "
31900        .BYTE +$80 "Source"
31910        .BYTE " Filename:"
31920        .BYTE $9B,$9B
31930        .BYTE $00
31940 LAFB6  .BYTE $7D,$9B,$9B
31950        .BYTE "["
31960        .BYTE +$80 "ESC"
31970        .BYTE " to exit, ["
31980        .BYTE +$80 "1-9"
31990        .BYTE "] for directories"
32000        .BYTE $9B,$9B
32010        .BYTE "Please insert disk "
32020        .BYTE "containing the"
32030        .BYTE $9B
32040        .BYTE "    below file, "
32050        .BYTE "and hit "
32060        .BYTE +$80 "RETURN"
32070        .BYTE "."
32080        .BYTE $9B,$9B
32090        .BYTE "File: "
32100        .BYTE $00
32110 LB02A  .BYTE $9B
32120        .BYTE "This is the "
32130        .BYTE "LAST pass!"
32140        .BYTE $9B
32150        .BYTE $00
32160 LB043  .BYTE $9B
32170        .BYTE +$80 "Format"
32180        .BYTE " Destination disk?"
32190        .BYTE $00
32200 LB05D  .BYTE $9B
32210        .BYTE "Use UltraSpeed "
32220        .BYTE "sector skew?"
32230        .BYTE $00
32240 LB07A  .BYTE $7D,$9B,$9B
32250        .BYTE "Error: Disk will "
32260        .BYTE "not format!!!"
32270        .BYTE $9B
32280        .BYTE $00
32290 LB09D  .BYTE $7D,$9B,$9B
32300        .BYTE "There are "
32310        .BYTE +$80 "Bad Bytes"
32320        .BYTE " in this file!!!"
32330        .BYTE $9B,$9B
32340        .BYTE "Please download "
32350        .BYTE "file again or"
32360        .BYTE $9B
32370        .BYTE "try FILEFIX2 on it! "
32380        .BYTE " Press"
32390        .BYTE +$80 "RETURN"
32400        .BYTE $00
32410 LB10A  .BYTE $7D,$9B,$9B
32420        .BYTE "Error while writing "
32430        .BYTE "to Disk!"
32440        .BYTE $9B
32450        .BYTE $00
32460 LB12B  .BYTE $9B
32470        .BYTE "Correct problem, "
32480        .BYTE "and hit"
32490        .BYTE +$80 "RETURN"
32500        .BYTE $00
32510 ;
32520 ; Turn File(s) into disk
32530 ;
32540 LB14C  JSR BELL ;$95AB
32550        LDX #LAF66
32560        LDY /LAF66
32570        JSR PRTSTR ;Type drive # and return for directory
32580 LB156  LDX #LAF8F
32590        LDY /LAF8F
32600        JSR PRTSTR ;Enter source file name
32610        LDA #$01 ; Assume large file
32620        STA LARGE ;$0099
32630        LDA #$00
32640        STA BYTCNT ;$00B5
32650        STA BYTCNT+1 ;$00B6
32660        STA BNKFLG ;$0088 Set regular memory
32670        STA SEQFLG ;$00B4 First sector is always jump type
32680        STA PASS ;$009A No passes yet
32690        STA Z0315 ;$00B3
32700        JSR L9D69 ;$9D69 Initialize bank stuff
32710        LDA SRCDRV ;$9004
32720        STA DRIVE ;$008F
32730        JSR GETFIL ;$A155
32740        BCC LB187 ;$B187 Was a directory list requested?
32750        LDA #2
32760        STA COLCRS ;$0055
32770        LDA #11
32780        STA ROWCRS ;$0054
32790        JMP LB156 ;$B156
32800 LB187  JSR FISPCD2FISPEC ;$A65E Copy from $9009 to $9034
32810        JMP LB195 ;$B195
32820 LB18D  LDX SRCDRV ;$9004
32830        CPX DSTDRV ;$9006
32840        BNE LB19F ;$B19F
32850 LB195  LDX #L975A
32860        LDY /L975A
32870        JSR PRTSTR ;Insert source disk
32880        JSR GETRET ;$97A4
32890 LB19F  JSR CLOSE1 ;$A63A
32900        LDA FISPEC+1 ;$9035 Drive ID
32910        CMP #$3A ; ':'
32920        BNE LB1AB ;$B1AB
32930        LDA #$31 ; '1'
32940 LB1AB  SEC
32950        SBC #$30
32960        STA SRCDRV ;$9004
32970        STA DRIVE ;$008F
32980        TAX
32990        JSR L96D4 ;$96D4 Read sector 1
33000        STA SRCDEN ;$9005
33010        JSR SHWSDN ;$928F
33020        LDA DSTDRV ;$9006
33030        STA DRIVE ;$008F
33040        LDY #$03 ; Open
33050        STY IC1COM ;$0352
33060        LDA #FISPEC
33070        STA IC1BAL ;$0354
33080        LDA /FISPEC
33090        STA IC1BAH ;$0355
33100        STA IC1BLH ;$0359
33110        INY ; $04
33120        STY IC1AX1 ;$035A Open for read
33130        LDX #$10 ; IOCB 1
33140        JSR CIOV ;$E456
33150        BPL LB22D ;$B22D
33160 LB1DF  STY STATUS ;$00A0 Error occurred
33170        JSR CLOSE1 ;$A63A
33180        LDY STATUS ;$00A0
33190        JSR SHWERR ;$99BB
33200        LDA STATUS ;$00A0
33210        CMP #$AA
33220        BNE LB1F3 ;$B1F3
33230        LDA LARGE ;$0099
33240        BEQ LB1F6 ;$B1F6
33250 LB1F3  JMP GOMENU ;$97B3
33260 LB1F6  LDX #LAFB6
33270        LDY /LAFB6
33280        JSR PRTSTR ;Esc to exit
33290        LDA #$00
33300        STA WORKA0 ;$00A0
33310 LB201  LDY WORKA0 ;$00A0
33320        LDA FISPEC,Y ;$9034
33330        JSR PRTCHR ;$939F
33340        CMP #$9B
33350        BEQ LB211 ;$B211
33360        INC WORKA0 ;$00A0
33370        BNE LB201 ;$B201
33380 LB211  JSR GETCHR ;$93AA
33390        CMP #$1B ; Escape
33400        BEQ LB1F3 ;$B1F3
33410        CMP #$9B ; Return
33420        BEQ LB19F ;$B19F
33430        JSR TOUPPR ;$95C8
33440        CMP #$41 ; 'A'
33450        BCS LB211 ;$B211
33460        CMP #$20
33470        BCC LB211 ;$B211
33480        JSR DOCMND ;$A6CD
33490        JMP LB1F6 ;$B1F6
33500 LB22D  JSR GETBYT ;$B267 Get first byte of the file
33510        CMP #$F9 ; Diskcomm small files
33520        BEQ LB25F ;$B25F
33530        CMP #$FA ; Diskcomm large file
33540        BEQ LB25F ;$B25F
33550        CMP #$FF ; Binary load file or shrink file
33560        BEQ LB243 ;$B243
33570        CMP #$00 ; Basic file or skrunch file
33580        BEQ LB246 ;$B246
33590        LDY #$00
33600        .BYTE #$2C ; Fake BIT instruction
33610 LB243  LDY #$1D
33620        .BYTE #$2C ; Fake BIT instruction
33630 LB246  LDY #$39
33640        LDX #$00
33650 LB24A  LDA LB2F0,Y ; Not a diskcomm file
33660        STA L90B8,X ;$90B8
33670        INY
33680        INX
33690        CPX #$1D
33700        BCC LB24A ;$B24A
33710        JSR CLOSE1 ;$A63A
33720        JSR BELL ;$95AB
33730        JMP GOMENU ;$97B3
33740 ;
33750 ; Looks like a diskcomm file so far.
33760 ;
33770 LB25F  SEC
33780        SBC #$F9
33790        STA LARGE ;$0099 single/multiple flag
33800        JMP LB347 ;$B347
33810 ;
33820 ; Get one byte into the accumulator
33830 ;
33840 GETBYT LDX #$10 ; IOCB 1
33850        LDA #$07 ; Get binary record, well, one byte anyway
33860        STA ICCOM,X ;$0342
33870        LDA #$00 ; Set buffer length to zero
33880        STA ICBLL,X ;$0348
33890        STA ICBLH,X ;$0349
33900        JMP CIOV ;$E456
33910 LB279  LDY #$1C
33920 LB27B  LDA LB299,Y ;$B299 Reading
33930        STA L90B8,Y ;$90B8
33940        DEY
33950        BPL LB27B ;$B27B
33960        LDY #$00
33970 LB286  LDA FISPEC,Y ;$9034
33980        CMP #$9B
33990        BEQ LB298 ;$B298
34000        CLC
34010        ADC #$60
34020        STA L90C0,Y ;$90C0
34030        INY
34040        CPY #$14
34050        BCC LB286 ;$B286
34060 LB298  RTS
34070 LB299  .SBYTE -"Reading        "
34080        .SBYTE -"              "
34090 LB2B6  .SBYTE -"Writing to "
34100        .SBYTE -"Destination Disk "
34110 LB2D3  .SBYTE -"Bad Bytes in "
34120        .SBYTE -"the File!!!      "
34130 LB2F0  .SBYTE -" Not a DISKCOMM "
34140        .SBYTE -"File!!!      "
34150        .SBYTE -"Binary or Shrink "
34160        .SBYTE -"file!!!     "
34170        .SBYTE -"BASIC or Scrunch "
34180        .SBYTE -"file!!!     "
34190 ;
34200 ; Continue to turn file(s) into disk.
34210 ;
34220 LB347  LDA LARGE ;$0099
34230        BNE LB352 ;$B352
34240        LDA PASS ;$009A
34250        BNE LB352 ;$B352
34260        JSR GETINC ;$A414 Get character to be incremented
34270 LB352  JSR LB279 ;$B279 Reading
34280        LDA #$80 ; Assume sector size 128 bytes
34290        STA SECSIZ ;$0095
34300        LDA #$00
34310        STA SECSIZ+1 ;$0096
34320        JSR GETBYT ;$B267
34330        STA PASS ;$009A
34340 LB362  AND #$60 ; Mask for density bits
34350        LSR
34360        LSR
34370        LSR
34380        LSR
34390        LSR
34400        CLC
34410        ADC #$01
34420        STA DENSITY ;$0090
34430        STA DSTDEN ;$9007
34440        CMP #$02 ; Double density?
34450        BNE LB37C ;$B37C
34460        LDY #$00 ; sector size 256 bytes
34470        STY SECSIZ ;$0095
34480        INY
34490        STY SECSIZ+1 ;$0096
34500 LB37C  LDX DSTDRV ;$9006
34510        LDA DSTDEN ;$9007
34520        JSR SHWDDN ;$92BD
34530        JSR SHWPASS ;$92E0
34540        STA L918E ;$918E Store pass count, again?
34550 ;
34560 ; Read $6000 bytes into regular memory from $2F00 - $8F00
34570 ;
34580        LDA #$07 ; Get binary record
34590        STA IC1COM ;$0352
34600        LDA #L2F00
34610        CLC
34620        ADC BYTCNT ;$00B5
34630        STA IC1BAL ;$0354
34640        LDA /L2F00
34650        ADC BYTCNT+1 ;$00B6
34660        STA IC1BAH ;$0355
34670        LDA #$00
34680        SEC
34690        SBC BYTCNT ;$00B5
34700        STA IC1BLL ;$0358
34710        LDA #$60
34720        SBC BYTCNT+1 ;$00B6
34730        STA IC1BLH ;$0359
34740        LDX #$10 ; IOCB 1
34750        JSR CIOV ;$E456
34760        CLC
34770        LDA BYTCNT ;$00B5
34780        ADC IC1BLL ;$0358
34790        STA BYTTOT ;$009E
34800        LDA BYTCNT+1 ;$00B6
34810        ADC IC1BLH ;$0359
34820        STA BYTTOT+1 ;$009F
34830        CPY #$7F ; Check for errors
34840        BCC LB3CD ;$B3CD
34850        CPY #136 ; End of file
34860        BEQ LB3ED ;$B3ED
34870 LB3CA  JMP LB1DF ;$B1DF Go deal with error
34880 ;
34890 ; Buffer full, switch bank and continue to read
34900 ;
34910 LB3CD  LDA #$01
34920        STA LARGE ;$0099
34930        LDA USEBNK ;$9070 Bank memory available?
34940        BEQ LB3ED ;$B3ED No banks available
34950        JSR LB279 ;$B279 Reading
34960        JSR LA077 ;$A077 Fill the banks with data
34970        CPY #$80
34980        BCS LB3CA ;$B3CA Go deal with error
34990        LDY #$01 ; Set banked memory
35000        STY BNKFLG ;$0088
35010        STY BANKID ;$0089
35020        DEY
35030        STY BNKMEM ;$0080
35040        LDA #$40
35050        STA BNKMEM+1 ;$0081
35060 ;
35070 ; Memory is full, or end of file reached.
35080 ; Time to dump the stuff onto the target disk.
35090 ;
35100 LB3ED  LDA PASS ;$009A
35110        BPL LB3FB ;$B3FB
35120        LDX #LB02A
35130        LDY /LB02A
35140        JSR PRTSTR ;This is the last pass
35150        JSR BELL ;$95AB
35160 LB3FB  LDX DSTDRV ;$9006
35170        LDA DSTDEN ;$9007
35180        JSR RDCFG ;$91ED
35190        CPX SRCDRV ;$9004
35200        BNE LB40F ;$B40F
35210        JSR L9BAF ;$9BAF Insert destination disk
35220        JSR GETRET ;$97A4
35230 LB40F  LDA PASS ;$009A
35240        AND #$1F ; mask off density bits and last pass bit
35250        CMP #$01 ; At first pass, ask for formatting
35260        BNE LB47E ;$B47E
35270        LDX #LB043
35280        LDY /LB043
35290        JSR PRTSTR ;Format destination disk
35300        LDA #$FF
35310        STA CH ;$02FC
35320        JSR BELL ;$95AB
35330 LB426  JSR GETCHR ;$93AA
35340        CMP #$1B ; Escape
35350        BEQ LB44F ;$B44F
35360        JSR TOUPPR ;$95C8
35370        CMP #$59 ; 'Y'
35380        BEQ LB43E ;$B43E
35390        CMP #$4E ; 'N'
35400        BEQ LB43E ;$B43E
35410        CMP #$1B ; Escape
35420        BNE LB426 ;$B426
35430        LDA #$4E ; Assume 'N'
35440 LB43E  PHA
35450        JSR PRTCHR ;$939F
35460        LDA #$9B
35470        JSR PRTCHR ;$939F
35480        PLA
35490        CMP #$59 ; 'Y'
35500        BEQ LB46D ;$B46D Yes, format the disk
35510        JMP LB47E ;$B47E Do not format disk
35520 LB44F  JMP GOMENU ;$97B3
35530 LB452  STY STATUS ;$00A0
35540        LDX #LB07A
35550        LDY /LB07A
35560        JSR PRTSTR ;Disk will not format
35570        LDY STATUS ;$00A0
35580        JSR WRTERR ;$99E0
35590 LB460  LDX #LB12B
35600        LDY /LB12B
35610        JSR PRTSTR ;Correct problem
35620        JSR GETRET ;$97A4
35630        JSR LB3FB ;$B3FB
35640 LB46D  LDA DENSITY ;$0090 Yes, format disk
35650        JSR L92EB ;$92EB Format disk
35660        CPY #$80
35670        BCS LB452 ;$B452 Disk will not format
35680        LDA RTCLOK+2 ;$0014
35690        ADC #$46
35700 LB47A  CMP RTCLOK+2 ;$0014
35710        BNE LB47A ;$B47A
35720 ;
35730 ; No formatting needed, or done formatting.
35740 ; Write buffer to disk
35750 ;
35760 LB47E  LDA #L2F00 ; Start with regular memory at $2F00
35770        STA WRKBUF ;$00AB
35780        LDA /L2F00
35790        STA WRKBUF+1 ;$00AC
35800 ;
35810 ; Decode 9 double density or 18 single density sectors
35820 ; Initialize the sector buffer before we begin.
35830 ;
35840 LB486  LDA #L2400 ; Use sector buffer at $2400
35850        STA SECBUF ;$00A9
35860        LDA /L2400
35870        STA SECBUF+1 ;$00AA
35880        LDA #$00
35890        STA SECIDX ;$0091
35900        JSR LB79D ;$B79D Writing to destination disk
35910        JSR INIT24 ;$9726 Initialize sector buffer
35920 ;
35930 ; Rebuild a sector from the data, based on the compression type
35940 ;
35950 LB498  JSR DECODE ;$B699 Rebuild a sector
35960        CPY #$01 ; Flush buffer?
35970        BNE LB4A2 ;$B4A2
35980        JMP LB4F9 ;$B4F9
35990 LB4A2  CPY #$80 ; Bad bytes?
36000        BNE LBC41 ;$B4C1
36010        LDX #LB09D
36020        LDY /LB09D
36030        JSR PRTSTR ;Bad bytes in the file
36040        LDY #$1C
36050 LB4AF  LDA LB2D3,Y ;$B2D3 Bad bytes in the file
36060        STA L90B8,Y ;$90B8
36070        DEY
36080        BPL LB4AF ;$B4AF
36090        JSR BELL ;$95AB
36100        JSR GETRET ;$97A4
36110        JMP GOMENU ;$97B3
36120 ;
36130 ; Get sector index, multiply by 2 and store sector number in table
36140 ;
36150 LBC41  LDA SECIDX ;$0091
36160        ASL
36170        TAX
36180        LDA SECTOR ;$0097
36190        STA TABSEC,X ;$AF42
36200        LDA SECTOR+1 ;$0098
36210        STA TABSEC+1,X ;$AF43
36220 ;
36230 ; Copy the sector just built to the buffer
36240 ;
36250        LDY #$00
36260 LB4D1  LDA L2E00,Y ;$2E00
36270        STA (SECBUF),Y ;$00A9
36280        INY
36290        CPY SECSIZ ;$0095
36300        BNE LB4D1 ;$B4D1
36310 ;
36320 ; Add sector size to buffer pointer
36330 ;
36340        CLC
36350        LDA SECBUF ;$00A9
36360        ADC SECSIZ ;$0095
36370        STA SECBUF ;$00A9
36380        LDA SECBUF+1 ;$00AA
36390        ADC SECSIZ+1 ;$0096
36400        STA SECBUF+1 ;$00AA
36410        INC SECIDX ;$0091 Increment index for sector number table
36420        LDA SECSIZ+1 ;$0096
36430        BEQ LB4F0 ;$B4F0
36440        INC SECIDX ;$0091
36450 LB4F0  LDA SECIDX ;$0091
36460        CMP #18 ; End of table?
36470        BCS LB4F9 ;$B4F9
36480        JMP LB498 ;$B498 Go rebuild another sector
36490 ;
36500 ; Sector table full, or flush buffer indicated by #$01 in Y.
36510 ;
36520 LB4F9  LDA SECIDX ;$0091 Any sectors at all in table?
36530        BNE LB500 ;$B500
36540        JMP LB57D ;$B57D Go do next batch of sectors
36550 LB500  LDA #$00
36560        STA WRTIDX ;$00A1
36570        LDA #L2400 ; Load address of sector buffer
36580        STA DBUFLO ;$0304
36590        LDA /L2400
36600        STA DBUFHI ;$0305
36610        LDA WRTCMD ;$9008
36620        STA COMMAND ;$0092
36630 ;
36640 ; Get index, multiply by 2 and load sector number from table
36650 ;
36660 LB513  LDA WRTIDX ;$00A1
36670        ASL
36680        TAX
36690        LDA TABSEC,X ;$AF42
36700        STA SECLO ;$008B
36710        LDA TABSEC+1,X ;$AF43
36720        STA SECLO+1 ;$008C
36730        TAX ; High byte
36740        LDA SECLO ;$008B Low byte
36750        LDY #$11 ; Offset for sector number
36760        JSR SHWNUM ;$932B Show current sector on screen
36770        LDA DBUFLO ;$0304 Sector buffer pointer
36780        STA DATAWIN ;$90A7 Show sector contents in the data window
36790        LDA DBUFHI ;$0305
36800        STA DATAWIN+1 ;$90A8
36810        JSR SECIO ;$9907 Go write the sector
36820        CPY #$01 ; Success?
36830        BEQ LB554 ;$B554
36840        STY STATUS ;$00A0
36850        JSR WRTERR ;$99E0 Show write error
36860        LDA STATUS ;$00A0
36870        CMP #$90
36880        BNE LB551 ;$B551
36890        LDX #LB10A
36900        LDY /LB10A
36910        JSR PRTSTR ;Error writing to disk
36920        JMP LB460 ;$B460 Go ask to correct problem
36930 LB551  JMP GOMENU ;$97B3
36940 ;
36950 ; Add sector size to buffer pointer
36960 ;
36970 LB554  CLC
36980        LDA DBUFLO ;$0304
36990        ADC SECSIZ ;$0095
37000        STA DBUFLO ;$0304
37010        LDA DBUFHI ;$0305
37020        ADC SECSIZ+1 ;$0096
37030        STA DBUFHI ;$0305
37040        INC WRTIDX ;$00A1
37050        LDA SECSIZ+1 ;$0096 Double density?
37060        BEQ LB56D ;$B56D
37070        INC WRTIDX ;$00A1
37080 LB56D  LDA WRTIDX ;$00A1 All sectors in table processed?
37090        CMP SECIDX ;$0091
37100        BCS LB576 ;$B576
37110        JMP LB513 ;$B513
37120 LB576  CMP #18 ; End of table?
37130        BNE LB57D ;$B57D
37140        JMP LB486 ;$B486 Go fill sector table from start again
37150 LB57D  LDA PASS ;$009A
37160        BPL LB5AC ;$B5AC More passes?
37170 LB581  LDY #$1C
37180 LB583  LDA LB58F,Y ;$B58F File(s) turned into disk
37190        STA L90B8,Y ;$90B8
37200        DEY
37210        BPL LB583 ;$B583
37220        JMP GOMENU ;$97B3
37230 LB58F  .SBYTE -"File(s) turned "
37240        .SBYTE -"into Disk!!!  "
37250 ;
37260 ; Process next file
37270 ;
37280 LB5AC  JSR PRTCLS ;$BC08
37290        SEC
37300        LDA WRKBUF ;$00AB
37310        SBC #$FE
37320        STA Z0265 ;$00AF
37330        LDA WRKBUF+1 ;$00AC
37340        SBC #$2E
37350        STA Z0267 ;$00B0
37360        SEC
37370        LDA BYTTOT ;$009E
37380        SBC Z0265 ;$00AF
37390        STA WORKA0 ;$00A0
37400        LDA BYTTOT+1 ;$009F
37410        SBC Z0267 ;$00B0
37420        ORA WORKA0 ;$00A0
37430        BEQ LB5CD ;$B5CD
37440        BCS LB5DC ;$B5DC
37450 LB5CD  LDA LARGE ;$0099
37460        BNE LB581 ;$B581 Single file?
37470        LDX INCSPC ;$00A3
37480        INC FISPEC,X ;$9034 Increment character in filespec
37490        JSR INIT24 ;$9726 Initialize sector buffer
37500        JMP LB18D ;$B18D
37510 LB5DC  LDA BYTTOT ;$009E
37520        SBC Z0265 ;$00AF
37530        STA BYTCNT ;$00B5
37540        STA WORK9B ;$009B
37550        LDA BYTTOT+1 ;$009F
37560        SBC Z0267 ;$00B0
37570        STA BYTCNT+1 ;$00B6
37580        STA WORK9C ;$009C
37590        LDA #L2F00
37600        STA SECBUF ;$00A9
37610        LDA /L2F00
37620        STA SECBUF+1 ;$00AA
37630        LDY #$01
37640        LDA (WRKBUF),Y ;$00AB
37650        CMP #$45 ; End of file?
37660        BNE LB618 ;$B618
37670        DEY
37680        CMP (WRKBUF),Y ;$00AB
37690        BNE LB618 ;$B618
37700        INC WRKBUF ;$00AB
37710        BNE LB607 ;$B607
37720        INC WRKBUF+1 ;$00AC
37730 LB607  LDY #$01
37740        SEC
37750        LDA BYTCNT ;$00B5
37760        SBC #$01
37770        STA BYTCNT ;$00B5
37780        LDA BYTCNT+1 ;$00B6
37790        SBC #$00
37800        STA BYTCNT+1 ;$00B6
37810        LDA (WRKBUF),Y ;$00AB
37820 LB618  STA PASS ;$009A
37830        CLC
37840        LDA WRKBUF ;$00AB
37850        ADC #$02
37860        STA WRKBUF ;$00AB
37870        LDA WRKBUF+1 ;$00AC
37880        ADC #$00
37890        LDY #$00
37900        STA WRKBUF+1 ;$00AC
37910 LB629  LDA (WRKBUF),Y ;$00AB
37920        STA (SECBUF),Y ;$00A9
37930        INC WRKBUF ;$00AB
37940        BNE LB633 ;$B633
37950        INC WRKBUF+1 ;$00AC
37960 LB633  INC SECBUF ;$00A9
37970        BNE LB639 ;$B639
37980        INC SECBUF+1 ;$00AA
37990 LB639  SEC
38000        LDA WORK9B ;$009B
38010        SBC #$01
38020        STA WORK9B ;$009B
38030        LDA WORK9C ;$009C
38040        SBC #$00
38050        STA WORK9C ;$009C
38060        ORA WORK9B ;$009B
38070        BNE LB629 ;$B629
38080        JSR INIT24 ;$9726 Initialize sector buffer
38090        LDA BNKFLG ;$0088 Are we doing regular memory?
38100        BNE LB660 ;$B660 We are doing banked memory
38110        LDA Z0315 ;$00B3
38120        BNE LB66C ;$B66C
38130        JSR LB279 ;$B279 Reading
38140 LB658  JSR SWPSRC ;$B680 Possibly swap disks
38150        LDA PASS ;$009A
38160        JMP LB362 ;$B362 Continue to read data from current input file
38170 ;
38180 ; Banked memory
38190 ;
38200 LB660  JSR L9DE4 ;$9DE4
38210        BCC LB66C ;$B66C Buffers not empty
38220        LDA Z0315 ;$00B3
38230        BNE LB66C ;$B66C
38240        JMP LB658 ;$B658
38250 LB66C  JSR SHWPASS ;$92E0
38260        LDA PASS ;$009A
38270        BPL LB67D ;$B67D Last file has bit 7 set
38280        LDX #LB02A
38290        LDY /LB02A
38300        JSR PRTSTR ;This is the last pass
38310        JSR BELL ;$95AB
38320 LB67D  JMP LB47E ;$B47E
38330 SWPSRC LDX SRCDRV ;$9004
38340        LDA SRCDEN ;$9005
38350        JSR RDCFG ;$91ED
38360        CPX DSTDRV ;$9006
38370        BNE LB698 ;$B698
38380        LDX #L975A
38390        LDY /L975A
38400        JSR PRTSTR ;Insert source disk
38410        JSR GETRET ;$97A4
38420 LB698  RTS
38430 ;
38440 ; Decode data.  Return status in Y.
38450 ;
38460 DECODE LDY #$00
38470        LDA SEQFLG ;$00B4 Next sequential sector?
38480        BPL LB6A8 ;$B6A8
38490        INC SECTOR ;$0097 Increment
38500        BNE LB6A5 ;$B6A5
38510        INC SECTOR+1 ;$0098
38520 LB6A5  JMP LB6B2 ;$B6B2
38530 LB6A8  LDA (WRKBUF),Y ;$00AB Get sector number from data
38540        STA SECTOR ;$0097
38550        INY
38560        LDA (WRKBUF),Y ;$00AB
38570        STA SECTOR+1 ;$0098
38580        INY
38590 LB6B2  LDA (WRKBUF),Y ;$00AB Get compression type
38600        PHA
38610        AND #$80
38620        STA SEQFLG ;$00B4 Set sequential/jump sector number flag
38630        PLA
38640        AND #$7F ; Mask off sequential/jump flag
38650        LDX #$00
38660        INY
38670 ;
38680 ; Based on the compression type, branch to the routine that
38690 ; processes the data for this type of compression.
38700 ; Y contains either 1 or 3.
38710 ;
38720        CMP #$45
38730        BNE LB6CA ;$B6CA
38740 ;
38750 ; Compression type $45
38760 ; Flush the sector buffer to disk
38770 ; Return $01 in Y
38780 ;
38790        TYA
38800        JSR WRKUPD ;$B758
38810        LDY #$01
38820        RTS
38830 LB6CA  CMP #$47
38840        BNE LB6EF ;$B6EF
38850 ;
38860 ; Compression type $47
38870 ; Uncompressed sector.
38880 ; Create a sector at $2E00, either 128 or 256 bytes.
38890 ; Return $00 in Y
38900 ;
38910        TYA
38920        JSR WRKUPD ;$B758
38930        LDY #$00
38940 LB6D4  LDA (WRKBUF),Y ;$00AB
38950        STA L2E00,Y ;$2E00
38960        INY
38970        CPY SECSIZ ;$0095
38980        BNE LB6D4 ;$B6D4
38990        LDA #$80
39000        JSR WRKUPD ;$B758
39010        LDA SECSIZ+1 ;$0096 Double density?
39020        BEQ LB6EC ;$B6EC
39030        LDA #$80 ; Make it 256 bytes total
39040 SKPBYT JSR WRKUPD ;$B758
39050 LB6EC  LDY #$00
39060        RTS
39070 LB6EF  CMP #$42
39080        BNE LB70D ;$B70D
39090 ;
39100 ; Compression type $42
39110 ; 128 byte DOS sector, data portion filled with identical bytes.
39120 ; Set 5 bytes at end of sector.
39130 ; Fill first 123 bytes with the value of the first of those 5.
39140 ; Or set 7 bytes at end of sector if Y = 1, but this is improbable.
39150 ;
39160 LB6F3  LDA (WRKBUF),Y ;$00AB
39170        STA L2E78,Y ;$2E78 DOS portion, last bytes of sector
39180        INY
39190        CPY #$08
39200        BCC LB6F3 ;$B6F3
39210        LDY #123
39220        LDA L2E00,Y ;$2E00 Load 123rd byte of sector and
39230 LB702  STA L2E00,Y ;$2E00 Fill beginning of sector with it
39240        DEY
39250        BPL LB702 ;$B702
39260        LDA #$08
39270        JMP SKPBYT ;$B6E9 Go skip these bytes
39280 LB70D  CMP #$43
39290        BNE LB764 ;$B764
39300 ;
39310 ; Compression type $43
39320 ; Alternating uncompressed and compressed strings of data
39330 ; Each string is preceded by an index byte. Zero is a valid length.
39340 ; X is used as a sector byte index.
39350 ;
39360 LB711  LDA (WRKBUF),Y ;$00AB Load end index of uncompressed string
39370        STA WORK9B ;$009B Store end position index
39380        INY
39390        TYA
39400        JSR WRKUPD ;$B758
39410        LDY #$00 ; Reset length counter/index
39420 LB71C  CPX WORK9B ;$009B End position of string reached?
39430        BEQ LB73D ;$B73D Go do compressed string
39440        LDA (WRKBUF),Y ;$00AB Get byte from string
39450        STA L2E00,X ;$2E00 store it in the sector
39460        INY
39470        INX
39480        CPX SECSIZ ;$0095 End of sector reached?
39490        BNE LB71C ;$B71C
39500 LB72B  TYA
39510        CMP #$00 ; Worst case problem, 256 bytes data?
39520        BEQ LB733 ;$B733
39530        JMP SKPBYT ;$B6E9 Go skip these bytes
39540 LB733  LDA #$80 ; Skip 256 bytes, need two steps
39550        JSR WRKUPD ;$B758
39560        LDA #$80
39570        JMP SKPBYT ;$B6E9 Go skip these bytes
39580 LB73D  LDA (WRKBUF),Y ;$00AB Load end of compressed string
39590        STA WORK9D ;$009D Store end position index
39600        INY
39610        LDA (WRKBUF),Y ;$00AB Get character to repeat
39620 LB744  STA L2E00,X ;$2E00
39630        INX
39640        CPX SECSIZ ;$0095 End of sector reached?
39650        BEQ LB754 ;$B754
39660        CPX WORK9D ;$009D End index reached?
39670        BNE LB744 ;$B744
39680        INY
39690        JMP LB711 ;$B711 Go do uncompressed string again
39700 LB754  INY
39710        JMP LB72B ;$B72B Go do end of sector stuff
39720 ;
39730 ; Increment the buffer pointer by the number of bytes processed,
39740 ; as indicated by A.
39750 ;
39760 WRKUPD CLC
39770        ADC WRKBUF ;$00AB
39780        STA WRKBUF ;$00AB
39790        LDA WRKBUF+1 ;$00AC
39800        ADC #$00
39810        STA WRKBUF+1 ;$00AC
39820        RTS
39830 LB764  CMP #$46
39840        BNE LB76C ;$B76C
39850 ;
39860 ; Conmpression type $46
39870 ; No data.  Sector is the same as previous sector.
39880 ;
39890        TYA
39900        JMP SKPBYT ;$B6E9 Go skip these bytes
39910 LB76C  CMP #$41
39920        BNE LB783 ;$B783
39930 ;
39940 ; Conmpression type $41
39950 ; Copy sector data beginning at a specified position to the beginning.
39960 ; Processing puts bytes from end to beginning, so the bytes are in
39970 ; reversed order.  The end portion of the sector remains unchanged.
39980 ;
39990        LDA (WRKBUF),Y ;$00AB
40000        TAX
40010 LB773  INY
40020        LDA (WRKBUF),Y ;$00AB
40030        STA L2E00,X ;$2E00
40040        DEX
40050        CPX #$FF
40060        BNE LB773 ;$B773
40070        INY
40080        TYA
40090        JMP SKPBYT ;$B6E9 Go skip these bytes
40100 LB783  CMP #$44
40110        BNE LB79A ;$B79A
40120 ;
40130 ; Compression type $44
40140 ; Copy sector data beginning at a specified position to the end.
40150 ; The beginning portion of the sector remains unchanged.
40160 ;
40170        LDA (WRKBUF),Y ;$00AB
40180        TAX
40190 LB78A  INY
40200        LDA (WRKBUF),Y ;$00AB
40210        STA L2E00,X ;$2E00
40220        INX
40230        CPX SECSIZ ;$0095
40240        BNE LB78A ;$B78A
40250        INY
40260        TYA
40270        JMP SKPBYT ;$B6E9 Go skip these bytes
40280 ;
40290 ; Bad compression type
40300 ; Return #$80 in Y, bad bytes in the file.
40310 ;
40320 LB79A  LDY #$80
40330        RTS
40340 ;
40350 ; Show that we are going to write to the disk
40360 ;
40370 LB79D  LDY #$1C
40380 LB79F  LDA LB2B6,Y ;$B2B6 Writing to destination disk
40390        STA L90B8,Y ;$90B8
40400        DEY
40410        BPL LB79F ;$B79F
40420        RTS
40430 ;
40440 ; Process table of sectors
40450 ;
40460 LB7A9  LDA #$00
40470        STA SECIDX ;$0091
40480        LDA #L2400 ; Load address of sector buffer
40490        STA SECBUF ;$00A9
40500        LDA /L2400
40510        STA SECBUF+1 ;$00AA
40520        LDA SECSIZ+1 ;$0096
40530        CLC
40540        ADC #$01
40550        STA WORKA0 ;$00A0 Sector table index increment
40560        LDA #$00
40570        STA WORK9B ;$009B Initialize last content type to zero
40580        STA L906E ;$906E Next sector table entry of last table entry
40590 ;
40600 ; Test for sector all zeroes
40610 ;
40620 LB7C3  LDY #$00
40630 LB7C5  LDA (SECBUF),Y ;$00A9
40640        BNE LB7D3 ;$B7D3
40650        INY
40660        CPY SECSIZ ;$0095
40670        BNE LB7C5 ;$B7C5
40680        LDA #$00 ; Sector is all zeroes
40690        JMP LB7DC ;$B7DC
40700 ;
40710 ; Test contents of previous sector
40720 ;
40730 LB7D3  LDA WORK9B ;$009B Last content type
40740        BEQ LB7DA ;$B7DA Last contents zeroes?
40750        LDA #$81 ; Next sequential sector
40760        .BYTE #$2C ; Fake BIT instruction
40770 LB7DA  LDA #$80 ; Sector after zeroes
40780 ;
40790 ; Store content type, also based on contents of previous sector.
40800 ; A = #$00 all zeroes #$80 Sector after zeroes #$81 normal sector
40810 ;
40820 LB7DC  LDX SECIDX ;$0091
40830        STA TABCNT,X ;$905C Store content indicator in table
40840        STA WORK9B ;$009B Last content type
40850        CLC
40860        LDA SECBUF ;$00A9 Add sector size to buffer pointer
40870        ADC SECSIZ ;$0095
40880        STA SECBUF ;$00A9
40890        LDA SECBUF+1 ;$00AA
40900        ADC SECSIZ+1 ;$0096
40910        STA SECBUF+1 ;$00AA
40920        LDA SECIDX ;$0091
40930        CLC
40940        ADC WORKA0 ;$00A0 Add increment
40950        STA SECIDX ;$0091
40960        CMP #18 ; End of table?
40970        BCC LB7C3 ;$B7C3 not yet
40980 ;
40990 ; Update table.
41000 ; #$00 sector zeroes
41010 ; #$80 sector non-zero, next sector non-zero, previous sector zeroes
41020 ; #$81 sector non-zero, next sector non-zero, previous sector non-zero
41030 ; #$01 sector non-zero, next sector zeroes, previous sector non-zero
41040 ; #$02 sector non-zero, next sector zeroes, previous sector zeroes
41050 ;
41060        LDY #$00 ; Y = Current sector index
41070        LDX WORKA0 ;$00A0 Index increment, 1 or 2, X = next sector index
41080 LB7FF  LDA TABCNT,Y ;$905C
41090        BEQ LB818 ;$B818 Sector of zeroes?  No processing needed
41100        AND #$01 ; Type #$80 or #$81 convert to
41110        STA WORK9B ;$009B Content type #$00 or #$01
41120        LDA TABCNT,X ;$905C Get type of next sector
41130        BPL LB810 ;$B810 Next sector contains zeroes
41140        JMP LB818 ;$B818 Next sector also contains non-zero data
41150 LB810  LDA #$02 ; Next sector contains zeroes, set sector skip flag
41160        SEC
41170        SBC WORK9B ;$009B Subtract 0 or 1
41180        STA TABCNT,Y ;$905C Update table with 2 or 1
41190 LB818  TXA
41200        CLC
41210        ADC WORKA0 ;$00A0 Adjust next sector index, add increment
41220        TAX
41230        TYA
41240        CLC
41250        ADC WORKA0 ;$00A0 Increment current sector index
41260        TAY
41270        CPY #18 ; End of table?
41280        BCC LB7FF ;$B7FF
41290        RTS
41300 TABSPD .BYTE $00,$00,$00,$00,$00
41310        .BYTE $00,$00,$00,$00
41320 LB830  .BYTE $00
41330 ;
41340 ; Do SIO command
41350 ;
41360 SIOCMD LDA #$08
41370        STA CONSOL ;$D01F Clear register
41380        LDA CONSOL ;$D01F
41390        AND #$06 ; mask for option and select
41400        BEQ LB85F ;$B85F Option and select keys pressed?
41410        LDY DUNIT ;$0301
41420        LDA TABSPD-1,Y ;$B826
41430        BEQ LB86A ;$B86A
41440        CMP #$28 ; Normal speed?
41450        BEQ LB84C ;$B84C
41460        JMP HISIO ;$B8FB
41470 LB84C  JSR SIOV ;$E459
41480        CPY #138 ; Device timeout
41490        BNE LB85B ;$B85B
41500        LDX DUNIT ;$0301
41510        LDA #$00
41520        STA TABSPD-1,X ;$B826
41530 LB85B  TYA
41540        RTS
41550        STA Z0598 ;$00F6
41560 LB85F  LDX DUNIT ;$0301
41570        LDA #$28 ; Normal speed
41580        STA TABSPD-1,X ;$B826
41590        JMP SIOV ;$E459
41600 LB86A  LDY #$09
41610 LB86C  LDA DCOMND,Y ;$0302
41620        STA Z0599,Y ;$00E0
41630        DEY
41640        BPL LB86C ;$B86C
41650        LDA #$3F ; Get drive speed
41660        STA DCOMND ;$0302
41670        LDA #$40 ; read data
41680        STA DSTATS ;$0303
41690        LDA #$00
41700        STA DBUFLO ;$0304
41710        STA DBUFHI ;$0305
41720        STA DBYTHI ;$0309
41730        STA DAUX2 ;$030B
41740        LDA #$01
41750        STA DBYTLO ;$0308
41760        STA DTIMLO ;$0306
41770        LDA #$20
41780        STA DAUX1 ;$030A
41790        LDY #$28 ; Normal speed
41800        LDX #$06
41810        LDA #$A0 ; Silent I/O
41820        JSR SETSPD ;$B9C3
41830        BPL LB8DF ;$B8DF No drive
41840        LDA #$48 ; ???
41850        STA DCOMND ;$0302
41860        LDA #$00 ; no data
41870        STA DSTATS ;$0303
41880        LDY #$28 ; Normal speed
41890        LDX #$04
41900        LDA #$A0 ; Silent I/O
41910        JSR SETSPD ;$B9C3
41920        BPL LB8E2 ;$B8E2 Warp speed
41930        LDA #$D3 ; ???
41940        STA DCOMND ;$0302
41950        LDA #$40 ; read data
41960        STA DSTATS ;$0303
41970        LDX #$04
41980        STX DBYTLO ;$0308
41990        LDA #$EA
42000        STA DBUFLO ;$0304
42010        LDA #$02
42020        STA DBUFHI ;$0305
42030        LDA #$A0 ; Silent I/O
42040        LDY #$0F ; Special speed?
42050        JSR SETSPD ;$B9C3
42060        BPL LB8E5 ;$B8E5 Ultra speed
42070        LDA #$28 ; Normal speed
42080        .BYTE #$2C ; Fake BIT instruction
42090 LB8DF  LDA #$00 ; No drive
42100        .BYTE #$2C ; Fake BIT instruction
42110 LB8E2  LDA #$10 ; Warp speed
42120        .BYTE #$2C ; Fake BIT instruction
42130 LB8E5  LDA #$0F ; Ultra speed
42140        LDY DUNIT ;$0301
42150        STA TABSPD-1,Y ;$B826
42160        LDY #$09
42170 LB8EF  LDA Z0599,Y ;$00E0
42180        STA DCOMND,Y ;$0302
42190        DEY
42200        BPL LB8EF ;$B8EF
42210        JMP SIOCMD ;$B831
42220 ;
42230 ; Hi speed SIO
42240 ;
42250 HISIO  TAY
42260        CMP #$10
42270        BEQ LB91C ;$B91C
42280        LDA DCOMND ;$0302
42290        CMP #$21 ; Format
42300        BEQ FORMAT ;$B952
42310        CMP #$22 ; Format medium
42320        BEQ FORMAT ;$B952
42330        LDY DUNIT ;$0301
42340        LDA TABSPD-1,Y ;$B826
42350        CMP #$0F
42360        BEQ LB938 ;$B938
42370 LB915  LDY DUNIT ;$0301
42380        LDA TABSPD-1,Y ;$B826
42390        TAY
42400 LB91C  LDX #$21
42410        LDA DSTATS ;$0303
42420        STA LB830 ;$B830
42430        LDA #$A8 ; Noisy I/O
42440        JSR SETSPD ;$B9C3
42450        CPY #138 ; Device timeout
42460        BNE LB936 ;$B936
42470        LDA LB830 ;$B830
42480        STA DSTATS ;$0303
42490        JMP LB85F ;$B85F
42500 LB936  TYA
42510        RTS
42520 LB938  LDA DCOMND ;$0302
42530        CMP #$23 ; Format single???
42540        BCC LB94F ;$B94F
42550        ORA #$80
42560        STA DCOMND ;$0302
42570        JMP LB915 ;$B915
42580 LB947  LDA DCOMND ;$0302 Use UltraSpeed sector skew
42590        ORA #$80
42600        STA DCOMND ;$0302
42610 LB94F  JMP SIOV ;$E459
42620 ;
42630 ; Format command
42640 ;
42650 FORMAT CPY #$00 ; Single?
42660        BEQ LB94F ;$B94F
42670        LDX #LB05D
42680        LDY /LB05D
42690        JSR PRTSTR ;Use UltraSpeed sector skew?
42700        JSR GETCHR ;$93AA
42710        JSR TOUPPR ;$95C8
42720        CMP #$59 ; 'Y'
42730        BEQ LB969 ;$B969
42740        LDA #$4E ; 'N'
42750 LB969  PHA
42760        JSR PRTCHR ;$939F
42770        LDA #$9B
42780        JSR PRTCHR ;$939F
42790        PLA
42800        CMP #$59 ; 'Y'
42810        BEQ LB980 ;$B980
42820        LDX #$0D
42830        LDY #$28 ; Normal speed
42840        LDA #$A8 ; Noisy I/O
42850        JMP SETSPD ;$B9C3
42860 ;
42870 ; Use UltraSpeed sector skew
42880 ;
42890 LB980  LDY DUNIT ;$0301
42900        LDA TABSPD-1,Y ;$B826
42910        CMP #$0F ; Special speed?
42920        BEQ LB947 ;$B947
42930        LDA DCOMND ;$0302
42940        CMP #$21 ; Format
42950        BEQ LB998 ;$B998
42960        LDX #LBBE2 ; Format enhanced density
42970        LDY /LBBE2
42980        JMP LB9A8 ;$B9A8
42990 LB998  LDA DBYTHI ;$0309 Format double density?
43000        BEQ LB9A4 ;$B9A4 No
43010        LDX #LBBC4 ; Format double density
43020        LDY /LBBC4
43030        JMP LB9A8 ;$B9A8
43040 LB9A4  LDX #LBBA6 ; Format single density
43050        LDY /LBBA6
43060 LB9A8  STX DBUFLO ;$0304
43070        STY DBUFHI ;$0305
43080        LDA #$66 ; ???
43090        STA DCOMND ;$0302
43100        LDA #$80 ; write data
43110        STA DSTATS ;$0303
43120        STA DBYTLO ;$0308
43130        LDA #$00
43140        STA DBYTHI ;$0309
43150        JMP LB915 ;$B915
43160 SETSPD STX TSTAT ;$0319
43170        STA NOISE ;$00FF
43180        STY SPEED ;$00FE
43190        TSX
43200        STX Z0623 ;$00FC
43210        SEI
43220        LDA #$02
43230        STA Z0624 ;$00F7
43240 LB9D2  LDA TSTAT ;$0319
43250        STA Z0598 ;$00F6
43260 LB9D7  JSR LBB3E ;$BB3E
43270        LDA #$34
43280        STA PBCTL ;$D303
43290        JSR LBA39 ;$BA39
43300        JSR LBB91 ;$BB91
43310        BIT DSTATS ;$0303
43320        BPL LB9ED ;$B9ED
43330        JSR LBA39 ;$BA39
43340 LB9ED  DEC Z0630 ;$00F5
43350        JSR LBA89 ;$BA89
43360        BIT DSTATS ;$0303
43370        BVC LBA1A ;$BA1A
43380        LDA #$00
43390        STA CHKSUM ;$00F1
43400        LDY #$18
43410        JSR LBABD ;$BABD
43420        LDY #$00
43430 LBA02  JSR RDSER ;$BACE
43440        STA (SERBUF),Y ;$00F2
43450        CLC
43460        ADC CHKSUM ;$00F1
43470        ADC #$00
43480        STA CHKSUM ;$00F1
43490        INY
43500        CPY SERLEN ;$00F4
43510        BNE LBA02 ;$BA02
43520        JSR RDSER ;$BACE
43530        CMP CHKSUM ;$00F1
43540        BNE LBA77 ;$BA77
43550 LBA1A  LDA #$A0
43560        STA AUDC4 ;$D207
43570        LDA POKMSK ;$0010
43580        STA IRQEN ;$D20E
43590        JSR LBABB ;$BABB
43600        LDY ERRFLG ;$00F0
43610        BEQ LBA32 ;$BA32
43620        DEC Z0624 ;$00F7
43630        BEQ LBA33 ;$BA33
43640        JMP LB9D2 ;$B9D2
43650 LBA32  INY
43660 LBA33  CLI
43670        STY DSTATS ;$0303
43680        TYA
43690        RTS
43700 LBA39  LDX #$FF
43710 LBA3B  DEX
43720        BNE LBA3B ;$BA3B
43730        JSR LBB23 ;$BB23
43740        LDY #$00
43750        LDA (SERBUF),Y ;$00F2
43760        STA CHKSUM ;$00F1
43770        STA SEROUT ;$D20D
43780 LBA4A  INY
43790        CPY SERLEN ;$00F4
43800        BEQ LBA5E ;$BA5E
43810        LDA (SERBUF),Y ;$00F2
43820        JSR WRSER ;$BB0C
43830        CLC
43840        ADC CHKSUM ;$00F1
43850        ADC #$00
43860        STA CHKSUM ;$00F1
43870        JMP LBA4A ;$BA4A
43880 LBA5E  LDA CHKSUM ;$00F1
43890        JSR WRSER ;$BB0C
43900 LBA63  LDA IRQST ;$D20E
43910        AND #$08
43920        BNE LBA63 ;$BA63
43930        LDY #$02
43940        JSR LBABD ;$BABD
43950        LDA #$C0
43960        STA IRQEN ;$D20E
43970        JMP LBA9A ;$BA9A
43980 LBA77  LDA #$8A ; 138 break abort
43990 LBA79  STA ERRFLG ;$00F0
44000        LDX Z0623 ;$00FC
44010        TXS
44020        BIT Z0630 ;$00F5
44030        BMI LBA1A ;$BA1A
44040        DEC Z0598 ;$00F6
44050        BEQ LBA1A ;$BA1A
44060        JMP LB9D7 ;$B9D7
44070 LBA89  LDA DTIMLO ;$0306
44080        ROR
44090        ROR
44100        TAY
44110        AND #$3F
44120        TAX
44130        TYA
44140        ROR
44150        AND #$C0
44160        TAY
44170        JSR LBABF ;$BABF
44180 LBA9A  JSR RDCLCK ;$BB26
44190        LDA #$3C
44200        STA PBCTL ;$D303
44210        JSR RDSER ;$BACE
44220        CMP #$41 ; ACK
44230        BEQ LBABB ;$BABB
44240        CMP #$43 ; COMPLT
44250        BEQ LBABB ;$BABB
44260        CMP #$45 ; ERROR
44270        BEQ LBAB6 ;$BAB6
44280        LDA #$8B ; 139 Device NAK
44290        JMP LBA79 ;$BA79
44300 LBAB6  LDA #$90 ; error
44310        STA ERRFLG ;$00F0
44320        RTS
44330 LBABB  LDY #$00 ; I/O okay
44340 LBABD  LDX #$00
44350 LBABF  LDA #$77
44360        STA CDTMA1 ;$0226
44370        LDA #$BA
44380        STA CDTMA1+1 ;$0227
44390        LDA #$01
44400        JMP SETVBV ;$E45C
44410 RDSER  LDA #$20 ; serial input data ready mask
44420        BIT IRQST ;$D20E
44430        BPL LBAF1 ;$BAF1 Break pressed?
44440        BNE RDSER ;$BACE No data yet
44450        LDA #$DF ; Turn off serial input data ready
44460        STA IRQEN ;$D20E
44470        LDA #$F8 ; Turn off timer 1 2 and 4 interrupts
44480        STA IRQEN ;$D20E
44490        LDA SKSTAT ;$D20F
44500        STA SKRES ;$D20A reset serial port status register
44510        BPL LBB07 ;$BB07
44520        AND #$20 ; Keyboard over-run
44530        BEQ LBB04 ;$BB04
44540        LDA SERIN ;$D20D
44550        RTS
44560 LBAF1  LDA #$5F
44570        STA IRQEN ;$D20E
44580        LDA #$F8
44590        STA IRQEN ;$D20E
44600        LDA #$01
44610        STA Z0624 ;$00F7
44620        DEC Z0630 ;$00F5
44630        LDA #$80 ; 128 Break abort
44640        .BYTE #$2C ; Fake BIT instruction
44650 LBB04  LDA #$8E ; 142 Serial bus overrun
44660        .BYTE #$2C ; Fake BIT instruction
44670 LBB07  LDA #$8C ; 140 Serial frame error
44680        JMP LBA79 ;$BA79
44690 WRSER  PHA
44700 LBB0D  LDA IRQST ;$D20E
44710        AND #$10 ; Serial output data needed
44720        BNE LBB0D ;$BB0D
44730        LDA #$EF ; Break
44740        STA IRQEN ;$D20E
44750        LDA #$F8 ; Timer 1 2 and 4
44760        STA IRQEN ;$D20E
44770        PLA
44780        STA SEROUT ;$D20D
44790        RTS
44800 WRCLCK LDA #$23 ; Set provide clock mode
44810        .BYTE #$2C ; Fake BIT instruction
44820 RDCLCK LDA #$13 ; Set receive clock mode
44830        STA SKCTL ;$D20F
44840        STA SKRES ;$D20A
44850        LDA #$28
44860        STA AUDCTL ;$D208
44870        LDA NOISE ;$00FF
44880        STA AUDC4 ;$D207
44890        LDA #$F8
44900        STA IRQEN ;$D20E
44910        RTS
44920 LBB3E  LDA DUNIT ;$0301
44930        ORA #$30
44940        STA Z0662 ;$00F8
44950        LDA DAUX1 ;$030A
44960        STA Z0663 ;$00FA
44970        LDA DAUX2 ;$030B
44980        STA Z0664 ;$00FB
44990        LDA DCOMND ;$0302
45000        STA Z0665 ;$00F9
45010        BPL LBB59 ;$BB59
45020        JMP LBB78 ;$BB78
45030 LBB59  LDA SPEED ;$00FE
45040        CMP #$10 ; Warp speed
45050        BNE LBB7A ;$BB7A
45060        LDA DCOMND ;$0302
45070        CMP #$52 ; Read
45080        BEQ LBB74 ;$BB74
45090        CMP #$50 ; Write
45100        BEQ LBB74 ;$BB74
45110        CMP #$57 ; Write verify
45120        BEQ LBB74 ;$BB74
45130        PLA
45140        PLA
45150        CLI
45160        JMP SIOV ;$E459
45170 LBB74  ORA #$20
45180        STA Z0665 ;$00F9
45190 LBB78  LDA #$28
45200 LBB7A  STA AUDF3 ;$D204
45210        LDA #$00
45220        STA AUDF4 ;$D206
45230        STA ERRFLG ;$00F0
45240        STA SERBUF+1 ;$00F3
45250        STA Z0630 ;$00F5
45260        LDA #$F8
45270        STA SERBUF ;$00F2
45280        LDA #$04
45290        STA SERLEN ;$00F4
45300        RTS
45310 LBB91  LDA DBUFLO ;$0304
45320        STA SERBUF ;$00F2
45330        LDA DBUFHI ;$0305
45340        STA SERBUF+1 ;$00F3
45350        LDA DBYTLO ;$0308
45360        STA SERLEN ;$00F4
45370        LDA SPEED ;$00FE
45380        STA AUDF3 ;$D204
45390        RTS
45400 ;
45410 ; 12 byte drive config table
45420 ; 18/26 byte sector skew table
45430 ;
45440 ; off  description       value
45450 ; ------------------------------
45460 ;  0   tracks            40
45470 ;  1   steprate          1
45480 ;  2   sectors hi        0
45490 ;  3   sectors lo        18/26
45500 ;  4   number of heads   0=1 head
45510 ;  5   recording mode    0=FM/4=MFM
45520 ;  6   bytes/sector hi   1=256/0=128
45530 ;  7   bytes/sector lo   0=256/128=128
45540 ;
45550 ; Single density
45560 ;
45570 LBBA6  .BYTE #40,#1,#0,#18,#0,#0,#0,#128
45580        .BYTE #255,#0,#0,#0
45590        .BYTE #4,#8,#12,#16,#1,#5,#9,#13
45600        .BYTE #17,#2,#6,#10,#14,#18,#3,#7,#11,#15
45610 ;
45620 ; Double density
45630 ;
45640 LBBC4  .BYTE #40,#1,#0,#18,#0,#4,#1,#0
45650        .BYTE #255,#0,#0,#0
45660        .BYTE #1,#10,#8,#17,#6,#15,#4,#13
45670        .BYTE #2,#11,#9,#18,#7,#16,#5,#14,#3,#12
45680 ;
45690 ; Enhanced density
45700 ;
45710 LBBE2  .BYTE #40,#1,#0,#26,#0,#4,#0,#128
45720        .BYTE #255,#0,#0,#0
45730        .BYTE #4,#8,#12,#16,#20,#24,#1,#5
45740        .BYTE #9,#13,#17,#21,#25,#2,#6,#10,#14,#18
45750        .BYTE #22,#26,#3,#7,#11,#15,#19,#23
45760 ;
45770 ; Erase the screen
45780 ;
45790 PRTCLS LDA #$01
45800        STA CRSINH ;$02F0
45810        LDA #$9B
45820        JSR PRTCHR ;$939F
45830        LDA #$7D ; Clear
45840        JSR PRTCHR ;$939F
45850        LDA #$00
45860        STA CRSINH ;$02F0
45870        RTS
45880        BRK
45890        .END
