1000 *= $0600 ; Origin›1010 ;›1020 ; SYMBOL EQUATES›1030 ;›1040 EOL = $9B ; end-of-line›1050 ; ›1060 ; ADDRESS EQUATES ›1070 ; ›1080 WARMST = $08 ; warm start›1090 BOOTQ = $09 ; boot flag›1100 ICAX1Z = $2A ; direction byte ›1110 ICAX6Z = $2F ; put byte›1120 BPTR = $3D ; buffer pter›1130 FTYPE = $3E ; I/O Flag›1140 DCB = $0300 ; data control block›1150 DCOMND = $0302 ; command byte›1160 DAUX1 = $030A ; sector LSB›1170 DAUX2 = $030B ; sector MSB›1180 HATABS = $031A ; handler table›1190 CASBUF = $0400 ; cassette buffer ›1200 DSKINV = $E453 ; disk interface routine›1210 ; ›1220 ; HEADER BYTES ›1230 ; ›1240 PST›1241 .BYTE 0 ; boot header›1250 .BYTE 2 ; sector count ›1260 .WORD PST ; program start ›1270 .WORD PINIT ; program init ›1280 CLC ; good boot ›1290 RTS ; return ›1300 ; ›1310 ; BASIC ENTRY ›1320 ; ›1330 PLA ; pull arg cnt›1340 ; ›1350 ; CASSETTE HANDLER SWAP ›1360 ; ›1370 PINIT›1371 LDA #$43 ; look for "C:›1380 LDX #0 ; first handler ›1390 STX CHKSTA+1 ; clear I/O state ›1400 FINHND›1401 CMP HATABS,X ; check handler›1410 BEQ FNDHND ; if found ›1420 ; ›1430 INX ; otherwise, next handler›1440 INX ›1450 INX ›1460 BNE FINHND›1470 ; ›1480 FNDHND›1481 LDA #NEWTAB&$FF ; set new table›1490 STA HATABS+1,X›1500 LDA #NEWTAB/256 ; also set MSB›1510 STA HATABS+2,X›1520 RTS ; return ›1530 ; ›1540 ; OPEN FILE HANDLER ›1550 ; ›1560 OPNFIL›1561 LDA ICAX1Z ; check direction›1570 LDX #$03 ; if new direction,›1580 LDY #0 ; start at sector #3›1590 CHKSTA›1591 CMP #0 ; check against old›1600 BNE RESET ; direction›1610 ;›1620 SAUX1›1621 LDX #0 ; old sector #›1630 SAUX2›1631 LDY #0›1640 INX ; increment sector›1650 BNE RESET›1660 ;›1670 INY ›1680 ; ›1690 RESET›1691 STX CASBUF+$7E ; store sector number›1700 STY CASBUF+$7D›1710 STA CHKSTA+1 ; save direction state›1720 ORA #$F7 ;=$FF for write›1730 STA BPTR ; save for new pointer›1740 LDA #$7D ; starting length›1750 STA BYTCNT+1 ; save length ›1760 LDY #1 ; good status ›1770 RTS ; return ›1780 ; ›1790 ; CLOSE FILE HANDLER ›1800 ; ›1810 CLSFIL›1811 BIT FTYPE ; check I/O type›1820 BPL DUMMY ; do nothing if read›1830 ;›1840 LDA BPTR ; prepare for final›1850 ORA #$80 ; sector output›1860 TAX ›1870 BNE INCBYT ; output last sector›1880 ; ›1890 ; GET/PUT BYTE HANDLER ›1900 ; ›1910 GETBYT›1911 LDY #$40 ; input direction›1920 BNE SAVDIR›1930 ; ›1940 PUTBYT›1941 LDY #$80 ; output direction›1950 STA ICAX6Z ; save output byte›1960 SAVDIR›1961 STY FTYPE ; save direction›1970 LDX BPTR ; get pointer ›1980 INCBYT›1981 INX ; increment›1990 STX BPTR ; save pointer ›2000 BYTCNT›2001 CPX #$7D ; check for sector end›2010 BCS ENDSEC ; perform I/O ›2020 ; ›2030 LDA ICAX6Z ; get output byte›2040 BIT FTYPE ; if output, store›2050 BMI STORE›2060 ; ›2070 LDA CASBUF,X ; otherwise, read›2080 STORE›2081 STA CASBUF,X ; and store›2090 DUMMY›2091 LDY #1 ; good status›2100 RTS ; return ›2110 ; ›2120 ; FORMAT DCB ›2130 ; ›2140 FMTBLK›2141 .BYTE $31,$01 ; format block for init›2150 .BYTE $21,$00›2160 .WORD CASBUF›2170 ; ›2180 *= $0680 ; allow for flag bytes from›2190 ; init routine›2200 ENDSEC›2201 LDA CASBUF+$7D ; get sector›2210 AND #$03›2220 STA DAUX2 ; save to DCB sector›2230 TAY ;save for later›2240 LDA CASBUF+$7E ; also MSB›2250 STA DAUX1›2260 TAX ;save for later›2270 ORA DAUX2 ;check for last›2280 BEQ ERROR ; if so, end-of-file›2290 ; ›2300 STX SAUX1+1 ; save sector for open›2310 STY SAUX2+1›2320 LDX #$05 ; set up DCB›2330 SETDCB›2331 LDA RDSEC,X›2340 STA DCB,X›2350 DEX ›2360 BPL SETDCB›2370 ; ›2380 BIT FTYPE ;check for write›2390 BPL GODISK ; if not, go ahead›2400 ; ›2410 LDA #$57 ; change command to write›2420 STA DCOMND›2430 LDA BPTR ; check for last sector›2440 BPL STBPTR›2450 ;›2460 LDX #$FF ; clear sector ›2470 STX CASBUF+$7D›2480 STX CASBUF+$7E›2490 STBPTR›2491 STA CASBUF+$7F ; save byte count›2500 INC CASBUF+$7E ; increment sector link›2510 BNE GODISK›2520 ; ›2530 INC CASBUF+$7D›2540 GODISK›2541 JSR DSKINV ; perform I/O›2550 BPL SETSEC›2560 ; ›2570 ERROR›2571 LDY #$88 ; error or end-of-file›2580 RTS ›2590 ; ›2600 SETSEC›2601 LDA CASBUF+$7F ; get byte count›2610 AND #$7F›2620 STA BYTCNT+1 ; save ›2630 LDX #$FF ; set for first byte›2640 BNE INCBYT ; return ›2650 ; ›2660 ; READ SECTOR DCB ›2670 ; ›2680 RDSEC›2681 .BYTE $31,$01 ; DCB for read sector›2690 .BYTE $52,$00›2700 .WORD CASBUF›2710 ; ›2720 ; HANDLER TABLE ›2730 ; ›2740 NEWTAB›2741 .WORD OPNFIL-1 ;open handler›2750 .WORD CLSFIL-1 ; close handler›2760 .WORD GETBYT-1 ; get byte handler›2770 .WORD PUTBYT-1 ; put byte handler›2780 .WORD DUMMY-1 ; rest dummy ›2790 .WORD DUMMY-1›2800 JMP DUMMY›2810 ; ›2820 ; FORMAT DISK ›2830 ; ›2840 PLA ;for BASIC call›2850 LDX #$05 ; move format block›2860 MVFMT›2861 LDA FMTBLK,X ; to DCB›2870 STA DCB,X›2880 DEX ›2890 BPL MVFMT›2900 ; ›2910 JMP DSKINV ; format and return›2920 ; ›2930 .END ›