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 ›