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 200TubeData=&FEE5 210MaxSize=&9E 220shit = &D9E :REM Last free byte in NMI area 230AdjustPointers=TRUE:CountDown=TRUE:ThrowAway=TRUE 240DIM Code &1000 250T0=7:T1=8 260DIM Start(9) 270DIM NextByte(9) 280DIM EndSector(9) 290DIM NoByteYet(9) 300DIM CommandComplete(9) 310DIM Poke(9) 320DIM JunkRest(9) 330DIM Exit(9) 340DIM End(9) 350FOR n=0 TO 8 360 NextByte(n)=&D00 370 EndSector(n)=&D00 380 NoByteYet(n)=&D00 390 CommandComplete(n)=&D00 400 JunkRest(n)=&D00 410 Exit(n)=&D00 420 Poke(n)=0 430NEXT 440 450FOR Pass=4 TO 6 STEP 2 460O%=Code:P%=&8800 470[OPT Pass 480.OurInsert 490 \ Assume Code in A 500 Pha 510 Asl A:Sta shit 520 Lda TubeFla 530 Beq NoFix 540 Lda #1 \ normalise Tube Flag 550.NoFix 560 Ora shit 570 AslA:AslA \ Four byte tables 580 Tax 590 Lda Table,X \ Offset of last byte 600 Tay 610 Inx: Lda Table,X:Sta shit \ Poke-offset 620 Inx: Lda Table,X:Sta &B8 630 Inx: Lda Table,X:Sta &B9 640 Lda #Rti:Sta &D00 650.CopyLp 660 Lda (&B8),Y 670 Cpy shit:Bne notPoked 680 Lda &F4 690.notPoked 700 Sta &D00,Y 710 Dey \ Table length = End-Start-1 720 Cpy #&FF:Bne CopyLp 730 Pla:Tax 740 Rts 750 760.Table 770 OPT FNTable(0) 780 OPT FNTable(T0) 790 OPT FNTable(1) 800 OPT FNTable(T1) 810 OPT FNTable(2) 820 OPT FNTable(2) 830 OPT FNTable(3) 840 OPT FNTable(3) 850 OPT FNTable(4) 860 OPT FNTable(4) 870 OPT FNTable(5) 880 OPT FNTable(5) 890 OPT FNTable(6) 900 OPT FNTable(6) 910 920 930 940\__________________________ TUBE to DISK _____________________________ 950OPT FNEntry(T0) 960OPT FNFromTube 970OPT FNNextTube(CountDown, NOT ThrowAway, T0) 980OPT FNNoByteYet(T0) 990OPT FNCommandComplete(NOT AdjustPointers, T0) 1000OPT FNExit(T0) 1010\__________________________ DISK to TUBE _____________________________ 1020OPT FNEntry(T1) 1030OPT FNToTube 1040OPT FNNextTube(CountDown, ThrowAway, T1) 1050OPT FNNoByteYet(T1) 1060OPT FNCommandComplete(NOT AdjustPointers, T1) 1070OPT FNJunkRest(T1) 1080OPT FNExit(T1) 1090\__________________________ MEMORY to DISK _____________________________ 1100OPT FNEntry(0) 1110OPT FNFromMemory 1120OPT FNNextMemory(CountDown, NOT ThrowAway, 0) 1130OPT FNNoByteYet(0) 1140OPT FNCommandComplete(AdjustPointers, 0) 1150OPT FNExit(0) 1160\___________________________DISK to MEMORY _____________________________ 1170OPT FNEntry(1) 1180OPT FNToMemory 1190OPT FNNextMemory(CountDown, ThrowAway, 1) 1200OPT FNNoByteYet(1) 1210OPT FNCommandComplete(AdjustPointers, 1) 1220OPT FNJunkRest(1) 1230OPT FNExit(1) 1240\__________________________ DISK to MEMORY _____________________________ 1250OPT FNEntry(6) 1260OPT FNToMemory 1270OPT FNNextMemory(NOT CountDown, NOT ThrowAway, 6) 1280OPT FNNoByteYet(6) 1290OPT FNAdjustPointers 1300OPT FNExit(6) 1310\__________________________ MEMORY to DISK _____________________________ 1320OPT FNEntry(4) 1330OPT FNFromMemory 1340OPT FNNextMemory(NOT CountDown, NOT ThrowAway, 4) 1350OPT FNNoByteYet(4) 1360OPT FNAdjustPointers 1370OPT FNExit(4) 1380\__________________________ DISK to TUBE _____________________________ 1390OPT FNEntry(5) 1400OPT FNToTube 1410OPT FNNextTube(NOT CountDown, NOT ThrowAway, 5) 1420OPT FNNoByteYet(5) 1430OPT FNExit(5) 1440\__________________________ TUBE to DISK _____________________________ 1450OPT FNEntry(3) 1460OPT FNFromTube 1470OPT FNNextTube(NOT CountDown, NOT ThrowAway, 3) 1480OPT FNNoByteYet(3) 1490OPT FNExit(3) 1500\__________________________ NO-OP _____________________________ 1510.Start(2) 1520OPT FNsetP 1530 Rti 1540OPT FNunsetP 1550.End(2) 1560\_______________________________________________________________________ 1570] 1580NEXT Pass 1590OSCLI("SAVE NMIPTC2 "+STR$~(Code)+" "+STR$~(O%)) 1600END 1610. 1620DEF FNEntry(n) 1630[OPT Pass 1640.Start(n) 1650OPT FNsetP 1660 Pha:Lda #Rti:Sta &D00:Tya:Pha 1670 Ldy #0 1680.NextByte(n) 1690 Lda #4 1700 Bit FdStatus 1710 Beq NoByteYet(n) 1720] 1730=Pass 1740. 1750DEF FNNextMemory(OptionCountDown, OptionThrowAway, n) 1760LOCAL Back 1770IF OptionCountDown=NOT CountDown THEN EndSector(n)=NextByte(n) 1780[OPT Pass 1790 Iny:Beq EndSector(n):.Back 1800] 1810IF OptionCountDown=NOT CountDown THEN 1850 1820[OPT Pass 1830OPT FNCountDown(AdjustPointers, OptionThrowAway, n) 1840] 1850=Pass 1860. 1870DEF FNCountDown(OptionAdjustPointers, OptionThrowAway, n) 1880LOCAL Next 1890IF OptionThrowAway=ThrowAway THEN Next=JunkRest(n) ELSE Next=NextByte(n) 1900[OPT Pass 1910 Cpy &A3:Bne NextByte(n) 1920\ Y=0 => Sector complete, or Y>0 => maybe partial sector only wanted 1930 Dec &A4 1940 Bne NextByte(n) 1950 Dec &A5 \ Clear 'Transfer complete' flag 1960 Jmp Next 1970.EndSector(n) 1980] 1990IF OptionAdjustPointers=NOT AdjustPointers THEN 2040 2000[OPT Pass 2010 Inc &A7:Jmp Back 2020] 2030GOTO 2070 2040[OPT Pass 2050 Jmp NextByte(n) 2060] 2070=Pass 2080. 2090DEF FNNextTube(OptionCountDown, OptionThrowAway, n) 2100IF OptionCountDown=NOT CountDown THEN 2160 2110[OPT Pass 2120 Iny:Beq EndSector(n) 2130OPT FNCountDown(NOT AdjustPointers, OptionThrowAway, n) 2140] 2150GOTO 2190 2160[OPT Pass 2170 Jmp NextByte(n) 2180] 2190=Pass 2200. 2210DEF FNNoByteYet(n) 2220[OPT Pass 2230.NoByteYet(n) 2240 Bmi NextByte(n) 2250] 2260=Pass 2270. 2280DEF FNAdjustPointers 2290[OPT Pass 2300\ Any partial sector count in Y must be added to the double word 2310\ memory pointer &A6,&A7 2320 Tya:Clc:Adc &A6:Sta &A6 2330 Lda #0:Adc &A7:Sta &A7 2340] 2350=Pass 2360. 2370DEF FNCommandComplete(AdjustPointers, n) 2380LOCAL Loop 2390[OPT Pass 2400.CommandComplete(n) 2410] 2420IF NOT AdjustPointers THEN 2460 2430[OPT Pass 2440OPT FNAdjustPointers 2450] 2460[OPT Pass 2470.Loop Dec &A3:Dey:Bne Loop 2480 Lda &F4:Pha 2490 Txa:Pha 2500.Poke(n) 2510 Lda #0 2520 Sta &F4:Sta &FE30 2530 Jsr &AC0E 2540 Pla:Tax 2550 Pla:Sta &F4:Sta &FE30 2560 Jmp Exit(n) 2570] 2580=Pass 2590. 2600DEF FNJunkRest(n) 2610LOCAL JunkByte 2620[OPT Pass 2630.JunkByte 2640 Lda FdData 2650.JunkRest(n) 2660 Lda #4 2670 Bit FdStatus:Bne JunkByte 2680 Bpl CommandComplete(n) 2690 Jmp JunkRest(n) 2700] 2710=Pass 2720. 2730DEF FNExit(n) 2740[OPT Pass 2750.Exit(n) 2760 Pla:Tay:Lda #Pha:Sta &D00:Pla 2770 Rti 2780OPT FNunsetP 2790.End(n) 2800] 2810=Pass 2820. 2830DEF FNToMemory 2840[OPT Pass 2850 Lda FdData 2860 Sta (&A6),Y 2870] 2880=Pass 2890. 2900DEF FNFromMemory 2910[OPT Pass 2920 Lda (&A6),Y 2930 Sta FdData 2940] 2950=Pass 2960. 2970DEF FNToTube 2980[OPT Pass 2990 Lda FdData 3000 Sta TubeData 3010] 3020=Pass 3030. 3040DEF FNFromTube 3050[OPT Pass 3060 Lda TubeData 3070 Sta FdData 3080] 3090=Pass 3100. 3110DEFFNsetP 3120 OLDP%=P%:P%=&D00 3130=Pass 3140. 3150. 3160DEFFNunsetP 3170 P%=OLDP%+(P%-&D00) 3180=Pass 3190. 3200DEF FNTable(n) 3210 LOCAL PokeOffset,CodeSize 3220 IF Poke(n)=0 THEN PokeOffset=&FF: ELSE PokeOffset=(Poke(n)+1)-&D00 3230 CodeSize=End(n)-Start(n) 3240[OPT Pass 3250 EQUB CodeSize-1 3260 EQUB PokeOffset 3270 EQUW Start(n) 3280] 3290 IF Pass=6 THEN PRINT "Codesize(";n;") = &";~CodeSize;", free space =&";~MaxSize-CodeSize 3300=Pass 3310.