10MODE7 20osfind = &FFCE 30osgbpb = &FFD1 40osbput = &FFD4 50osbget = &FFD7 60osargs = &FFDA 70osfile = &FFDD 80osrdch = &FFE0 90osasci = &FFE3 100osnewl = &FFE7 110oswrch = &FFEE 120osword = &FFF1 130osbyte = &FFF4 140oscli = &FFF7 150TubeFla = &10D5 160Rti=&40 170Pha=&48 180FdStatus=&FE80 190FdData=FdStatus+4 200shit = &D9E :REM Last free byte in NMI area 210DIM Code &1000 220FOR Pass=4 TO 6 STEP 2 230O%=Code:P%=&8800 240[OPT Pass 250.OurInsert 260 \ Assume Code in A 270 Pha 280 Asl A:Sta shit 290 Lda TubeFla 300 Beq NoFix 310 Lda #1 \ normalise Tube Flag 320.NoFix 330 Ora shit 340 AslA:AslA \ Four byte tables 350 Tax 360 Lda Table,X \ Offset of last byte 370 Tay 380 Inx: Lda Table,X:Sta shit \ Poke-offset 390 Inx: Lda Table,X:Sta &B8 400 Inx: Lda Table,X:Sta &B9 410 Lda #Rti:Sta &D00 420.CopyLp 430 Lda (&B8),Y 440 Cpy shit:Bne notPoked 450 Lda &F4 460.notPoked 470 Sta &D00,Y 480 Dey \ Table length = End-Start-1 490 Cpy #&FF:Bne CopyLp 500 Pla:Tax 510 Rts 520 530 EQUB EndFaster-Faster-1:EQUB(pokeF+1)-&D00:EQUW Faster 540 EQUB End1-Start1-1:EQUB(poke1+1)-&D00:EQUW Start1 550.Table 560 EQUB End0-Start0-1:EQUB(poke0+1)-&D00:EQUW Start0 570 EQUB End0T-Start0T-1:EQUB(poke0T+1)-&D00:EQUW Start0T 580 EQUB EndFaster-Faster-1:EQUB(pokeF+1)-&D00:EQUW Faster 590 EQUB End1T-Start1T-1:EQUB(poke1T+1)-&D00:EQUW Start1T 600 EQUB End2-Start2-1:EQUB &FF:EQUW Start2 610 EQUB End2-Start2-1:EQUB &FF:EQUW Start2 620 EQUB End3-Start3-1:EQUB &FF:EQUW Start3 630 EQUB End3-Start3-1:EQUB &FF:EQUW Start3 640 EQUB End4-Start4-1:EQUB &FF:EQUW Start4 650 EQUB End4-Start4-1:EQUB &FF:EQUW Start4 660 EQUB End5-Start5-1:EQUB &FF:EQUW Start5 670 EQUB End5-Start5-1:EQUB &FF:EQUW Start5 680 EQUB End6-Start6-1:EQUB &FF:EQUW Start6 690 EQUB End6-Start6-1:EQUB &FF:EQUW Start6 700 710 720 730 740\________________________ TUBE to DISK ____________________________ 750.Start0T 760OPT FNsetP 770 Pha 780 Tya 790 Pha 800 Lda &FE80 810 And #4 820 Beq TstStat0T 830 Lda &FEE5 840 Sta &FE84 850 Dec &A3 860 Bne Exit0T 870 Dec &A4 880 Bne Exit0T 890 Dec &A5 900.Exit0T 910 Pla 920 Tay 930 Pla 940 Rti 950.TstStat0T 960 Lda &FE80 970 And #8 980.rti RTI 990 Beq Exit0T 1000 Lda &F4 1010 Pha 1020.poke0T 1030 Lda #0 1040 Sta &F4 1050 Sta &FE30 1060 Jsr &AC0E 1070 Pla 1080 Sta &F4 1090 Sta &FE30 1100 Sec 1110 Bcs Exit0T 1120OPT FNunsetP 1130.End0T 1140\____________________________ DISK to TUBE _____________________________ 1150.Start1T 1160OPT FNsetP 1170 Pha 1180 Tya 1190 Pha 1200 Lda &FE80 1210 And #4 1220 Beq TstStat1T 1230 Lda &FE84 1240 Ldy &A5 1250 Beq Exit1T 1260 Sta &FEE5 1270 Dec &A3 1280 Bne Exit1T 1290 Dec &A4 1300 Bne Exit1T 1310 Dec &A5 1320.Exit1T 1330 Pla 1340 Tay 1350 Pla 1360 Rti 1370.TstStat1T 1380 Lda &FE80 1390 And #8 1400 Beq Exit1T 1410 Lda &F4 1420 Pha 1430.poke1T 1440 Lda #0 1450 Sta &F4 1460 Sta &FE30 1470 Jsr &AC0E 1480 Pla 1490 Sta &F4 1500 Sta &FE30 1510 Sec 1520 Bcs Exit1T 1530OPT FNunsetP 1540.End1T 1550\____________________________ MEMORY to DISK ________________________________ 1560.Start0 1570OPT FNsetP 1580 Pha 1590 Tya 1600 Pha 1610 Lda &FE80 1620 And #4 1630 Beq TstStat0 1640 Ldy #0 1650 Lda (&A6),Y 1660 Sta &FE84 1670 Inc &A6 1680 Bne ninc0 1690 Inc &A7 1700.ninc0 1710 Dec &A3 1720 Bne Exit0 1730 Dec &A4 1740 Bne Exit0 1750 Dec &A5 1760.Exit0 1770 Pla 1780 Tay 1790 Pla 1800 Rti 1810.TstStat0 1820 Lda &FE80 1830 And #8 1840 Beq Exit0 1850 Lda &F4 1860 Pha 1870.poke0 1880 Lda #0 1890 Sta &F4 1900 Sta &FE30 1910 Jsr &AC0E 1920 Pla 1930 Sta &F4 1940 Sta &FE30 1950 Sec 1960 Bcs Exit0 1970OPT FNunsetP 1980.End0 1990\___________________________DISK to MEMORY _______________________________ 2000.Start1 2010OPT FNsetP 2020 Pha 2030 Lda #Rti:Sta &D00 2040 Inc &72:Bne ninc72:Inc &73:.ninc72 2050 Tya 2060 Pha 2070.Again 2080 Lda #4 2090 Bit &FE80 2100 Beq TstStat1 2110 Lda &FE84 2120 Ldy &A5 2130 Beq Exit1 2140 Ldy #0 2150 Sta (&A6),Y 2160 Inc &70:Bne ninc70:Inc &71:.ninc70 2170 Inc &A6 2180 Bne ninc1 2190 Inc &A7 2200.ninc1 2210 Dec &A3 2220 Bne Exit1 2230 Dec &A4 2240 Bne Exit1 2250 Dec &A5 2260.Exit1 2270 Jmp Again 2280 Pla 2290 Tay 2300 Lda #Pha:Sta &D00 2310 Pla 2320 Rti 2330.TstStat1 2340 Bmi Again 2350 Lda &F4 2360 Pha 2370.poke1 2380 Lda #0 2390 Sta &F4 2400 Sta &FE30 2410 Jsr &AC0E 2420 Pla 2430 Sta &F4 2440 Sta &FE30 2450 Pla:Tay 2460 Lda #Pha:Sta &D00 2470 Pla:Rti 2480 2490.const04 EQUB 4 2500.const08 EQUB 8 2510OPT FNunsetP 2520.End1 2530\___________________________ DISK to MEMORY_________________________________ 2540.Start6 2550OPT FNsetP 2560 Pha 2570 Tya 2580 Pha 2590 Lda &FE80 2600 And #4 2610 Beq Exit6 2620 Lda &FE84 2630 Ldy #0 2640 Sta (&A6),Y 2650 Inc &A6 2660 Bne Exit6 2670 Inc &A7 2680.Exit6 2690 Pla 2700 Tay 2710 Pla 2720 Rti 2730OPT FNunsetP 2740.End6 2750\__________________________ MEMORY to DISK ___________________________ 2760.Start4 2770OPT FNsetP 2780 Pha 2790 Tya 2800 Pha 2810 Lda &FE80 2820 And #4 2830 Beq Exit4 2840 Ldy #0 2850 Lda (&A6),Y 2860 Sta &FE84 2870 Inc &A6 2880 Bne Exit4 2890 Inc &A7 2900.Exit4 2910 Pla 2920 Tay 2930 Pla 2940 Rti 2950OPT FNunsetP 2960.End4 2970\______________________________ DISK to TUBE ______________________________ 2980.Start5 2990OPT FNsetP 3000 Pha 3010 Lda &FE80 3020 And #4 3030 Beq Exit5 3040 Lda &FE84 3050 Sta &FEE5 3060.Exit5 3070 Pla 3080 Rti 3090OPT FNunsetP 3100.End5 3110\____________________________ TUBE to DISK _______________________________ 3120.Start3 3130OPT FNsetP 3140 Pha 3150 Lda &FE80 3160 And #4 3170 Beq Exit3 3180 Lda &FEE5 3190 Sta &FE84 3200.Exit3 3210 Pla 3220 Rti 3230OPT FNunsetP 3240.End3 3250\________________________________ NO-OP _________________________________ 3260.Start2 3270OPT FNsetP 3280 Rti 3290OPT FNunsetP 3300.End2 3310\____________________ Faster DISK to Memory ______________________________ 3320.Faster 3330OPT FNsetP 3340 Pha:Lda #Rti:Sta &D00:Tya:Pha 3350 Ldy #0 3360.NextByte 3370 Lda #4 3380 Bit FdStatus 3390 Beq NoByteYet 3400 Lda FdData 3410 Sta (&A6),Y 3420 Iny:Beq EndSector:.ReturnFromEndSector 3430 Cpy &A3:Bne NextByte 3440\ Y=0 => Sector complete, or Y>0 => maybe partial sector only wanted 3450 Dec &A4 3460 Bne NextByte 3470 Dec &A5 \ Clear 'Transfer complete' flag 3480 Jmp JunkRest 3490 3500.EndSector 3510 Inc &A7:Jmp ReturnFromEndSector 3520 3530.NoByteYet 3540 Bmi NextByte \ FDC Command not yet completed, wait for next byte 3550.CommandComplete 3560\ Any partial sector count in Y must be added to the double word 3570\ memory pointer &A6,&A7 3580 Tya:Clc:Adc &A6:Sta &A6 3590 Lda #0:Adc &A7:Sta &A7 3600.DecA3Loop Dec &A3:Dey:Bne DecA3Loop 3610 Lda &F4:Pha 3620 Txa:Pha 3630.pokeF 3640 Lda #0 3650 Sta &F4:Sta &FE30 3660 Jsr &AC0E 3670 Pla:Tax 3680 Pla:Sta &F4:Sta &FE30 3690.ExitF 3700 3710 Pla:Tay:Lda #Pha:Sta &D00:Pla 3720 Rti 3730 3740.JunkByte 3750 Lda FdData 3760.JunkRest 3770 Lda #4 3780 Bit FdStatus:Bne JunkByte 3790 Bpl CommandComplete 3800 Jmp JunkRest 3810OPT FNunsetP 3820.EndFaster 3830] 3840NEXT Pass 3850PRINT "New code size = &";~EndFaster-Faster;", = &";~shit-&D00-(EndFaster-Faster);" bytes free" 3860OSCLI("SAVE NMIPTCH "+STR$~(Code)+" "+STR$~(O%)) 3870END 3880. 3890DEFFNsetP 3900 OLDP%=P%:P%=&D00 3910=Pass 3920. 3930. 3940DEFFNunsetP 3950 P%=OLDP%+(P%-&D00) 3960=Pass 3970. 3980DEF FNIncW(Loc) 3990LOCAL Size:IF Loc>254 THEN Size=2 ELSE Size=1 4000[OPT Pass 4010 Inc Loc:Bne P%+2+1+Size:Inc Loc+1 4020] 4030=Pass 4040.