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