REM >HADFS9 v5.27 REM v5.26 New install routine REM v5.27 Fixed install data flag, DiskID : PRINT "Assembling S.HADFS9" REM P%=hadfs9 O%=P%-Block%+mcode% [OPT0 : .CheckEnable BIT ENABLE:BVC NotEnabled:RTS .NotEnabled TYA:PHA:TXA:PHA JSR PrText:EQUS "Go? (Y/N) ":BRK LDA #21:LDX #0:JSR OSBYTE PLA:TAX:PLA:TAY JSR OSRDCH:BCS NotEnab2 AND #&DF:CMP #ASC"Y":BNE NotEnab2 JSR OSWRCH:JMP OSNEWL .NotEnab2 JSR errors:EQUB 189:EQUS "Not Enabled":BRK :]:IF _NoFormat% AND _NoInstal%:z%=P%-CheckEnable:P%=P%-z%:O%=O%-z% : \ ---------------- \ *Install routine \ ---------------- .InstHelp LDX #CommInstall-CommTable :\ Point to "INSTALL" text LDY #HelpInstall-HelpText :\ Point to *Install help text JSR HelpLp2 :\ Print a single *Help entry JSR PrText EQUS " can be:":EQUB 13 EQUS "D... : data disk":EQUB 13 EQUS " : tracks":EQUB 13 EQUS "K : bytes":EQUB 13 EQUS "& : sectors":EQUB 13 \EQUS " ...*2 :\ split disk":\EQUB 13 BRK :]:IF _NoInsHlp% OR _NoInstal%:z%=P%-InstHelp:P%=P%-z%:O%=O%-z% RTS : \ ---------------- \ *Install command \ ---------------- .Install LDA CSD+d:STA drive :\ Assume using current drive JSR GetChar:BEQ InstNull :\ No parameters, do default action CMP #ASC"?":BNE P%+5:JMP InstHelp :\ Print out *Install help text INY:LDA (&F2),Y:DEY :\ Get char after current char CMP #ASC"!":BCS InstDrive :\ If not separator, use current drv JSR GetDrive .InstDrive :\ DRIVE now holds drive to use .InstNull JSR ReadFSM :\ EQ=HADFS disk, NE=blank CLC:PHP :\ CC=new install JSR SkipSpc :\ Look for next parameter INY:CMP #ASC"$":BEQ InstRoot :\ '$' -> create new disk DEY:PLP:BEQ P%+5:JMP NotHADFSDisk :\ Update must be of HADFS disk SEC:PHP :\ CS=update existing disk .InstRoot : \ On entry here- \ NE=not HADFS disk (ie blank) EQ=HADFS disk \ CC=do new install ($) CS=update disk : JSR SkipSpc:BEQ InstNoTitle :\ No new disk title LDX #0 .InstTitle STA FSM,X:INY:LDA (&F2),Y :\ Copy new disk title in CMP #ASC"!":BCC InstPad :\ End at space or INX:CPX #16:BNE InstTitle :\ Loop for 16 characters JMP BadFilename .InstPad LDA #ASC" " .InstSpc INX:STA FSM,X :\ Pad title with spaces CPX #16:BNE InstSpc :\ Title length is 16 chars .InstJGH LDA JGHName-16,X:STA FSM,X:INX :\ Put validity string in CPX #24:BNE InstJGH : .InstNoTitle LDA #0 :\ Prepare cleared flags PLP:PHP:BCC P%+5:JMP InstUpdate :\ Jump ahead to update existing disk :\ Carry is now Data/System flag PLP:PHP:BNE InstFlag :\ Blank disk, ignore existing flags LDA FSM+31:ROL A:BPL InstNotLocked :\ Locked disk? PLP:LDA #0:PHP:JMP InstUpdate :\ Don't overwrite locked disk .InstNotLocked LDA FSM+31:AND #&C0 :\ Keep BigFSM+KeepDFS flag .InstFlag STA FSM+31:LDA #0:STA FSM+30 :\ Set initial flags JSR SkipSpc:AND #&DF :\ Get next character INY:CMP #ASC"D":BEQ InstNotSyst :\ 'D'ata disk? DEY:CMP #ASC"S":BNE InstNotSyst :\ Not 'S'ystem disk PLP:SEC:PHP:INY :\ CS=data disk, step past 'S' .InstNotSyst LDA FSM+31:BMI InstNewDisk :\ NewDisk doesn't have a data flag LDA #1:STA FSM+30 :\ Always install as data disks .InstNewDisk : \ From here on- \ NE=not HADFS disk (eg, blank) EQ=HADFS disk \ CC=install as system disk CS=install as data disk : JSR SkipSpc:BNE InstSize :\ Disk size given, parse it :]:IF _NoInstal%:[OPT 7:.InstEnable :\ Prevent OutOfRange error PLP:PHP:BEQ InstEnable :\ Use existing disk size : :\ If no size given, allow GetNumber : :\ to generate error later on .InstSize INY:CMP #ASC"&":BEQ InstNum :\ §ors DEY:CLC :\ CC=decimal, CS=hex .InstNum PHP:JSR GetNumber :\ Read size parameter PLP:BCS InstSectors :\ &xxxx is actual sector size AND #&DF:CMP #ASC"K":BNE InstTrk :\ xxxx is number of tracks JSR TimesTwo:JSR TimesTwo :\ Convert xxxxK to sectors BCC InstSectors :\ TimesTwo always returns CC .InstTrk JSR TimesTen : .InstSectors \ Should check for *2 parameter CLC :\ Flag ENABLE not yet checked :]:IF _NoInstal%:z%=P%-Install:P%=P%-z%:O%=O%-z% .InstFormat \ When *FORM enters here, ENABLE already checked \-------------------------------------------------- \ On entry here- \ TITLE, JGHNAME, FLAGS set, numstore holds SIZE \ pushed P=EQ/NE HADFS disk CC/CS=syst/data \ P=CC Check ENABLE CS Don't check ENABLE \-------------------------------------------------- : LDA numstore+0:STA FSM+&1C :\ Put sector count into SIZE LDA numstore+1:STA FSM+&1D LDA numstore+2:BEQ InstOldDisk :\ SmallDisk will fit on OldDisk STA FSM+&1E :\ Store sector count high byte LDA #&80:STA FSM+31 :\ Force to NewDisk .InstOldDisk :\ Should give an error, as 24bit : :\ FSM not yet supported BCS InstEnabled :\ ENABLE already checked elsewhere .InstEnable JSR CheckEnable :\ Is command enabled? .InstEnabled : LDA #6:STA fptr+0 LDA #FSM DIV 256:STA fptr+1 :\ Point to disk creation date LDA #0:STA FSM+&1A:\STA FSM+&1B :\ Clear existing date SEC:JSR SetCrDateFSM :\ Set disk creation date \ROR FSM+&1A:\ASL FSM+&0F :\ Get year b7 \ROL FSM+&1A:\LSR FSM+&0F :\ Put year b7 LDA &296:LDX #30 :\ Seed disk ID with part of TIME .MakeID PHA:TYA:EOR FSM+0,X :\ Hash the disk info into an ID TAY:PLA:ADC FSM+1,X DEX:DEX:BPL MakeID:STA FSM+&18 :\ Set DiskID EOR &295:STA FSM+&19 :\ Merge in another part of TIME : LDX #32:LDA #0 .InstEmptyFSM :\ Create an empty FSM STA FSM,X:INX:BNE InstEmptyFSM :\ Blank all entries LDA #2:STA FSM+32:LDA #68:STA FSM+34:\ First entry &0002+&0044 LDA #74:STA FSM+36 :\ Second entry &004A+xxxx LDA FSM+&1C:SEC:SBC #74:STA FSM+38 LDA FSM+&1D:SBC #0:STA FSM+39 :\ Length is to end of disk PLP:LDA #4:BCS InstNew :\ Data disk, jump to install STA FSM+34 :\ Reduce length to fit ROM in .InstNew PHP :\ NE, CC=syst, CS=data : .InstUpdate :\ Enter here to update a disk \-------------------------------------------------- \ On entry here- \ TITLE, JGHNAME, DATE, DSKID, SIZE, FLAGS set \ pushed P=NE -> create, CC/CS=syst/data \ EQ -> update, look at FSM for syst/data \-------------------------------------------------- : LDA #0:STA VFLG:JSR SaveFSM :\ Clear names, save the new FSM : \ We always update so old versions can understand \ Update OldData -> dual boot, OldData FSM, update any $.HADFSRom file \ Update OldSyst -> protect DFS, OldSyst FSM, update ROM \ Update NewDisk -> dual boot, NewDisk FSM, update any $.HADFSRom file \ When 24-bit FSM has been invented, this won't damage them : \ We always create as OldData disk with dual boot \ Create Data -> dual boot, OldData FSM \ Create System -> dual boot, OldData FSM, save $.HADFSRom file \ If 16384K or larger, needs 24bit FSM, so should disallow earlier : BIT FSM+31:BPL InstChkDFS :\ Is DFS catalogue protected? BVS InstNoDFS:BVC InstDFS :\ Check new DFSProtect flag .InstChkDFS LDA FSM+30:AND #9 :\ If old DFSProtect set, or is CMP #1:BNE InstNoDFS :\ an OldSyst, protect DFS catalogue .InstDFS JSR ClearDIR:TAX :\ We're going to use DIR store .InstDFSLp LDA BootCode,X :STA DIR,X :\ Copy boot code to DIR store LDA BootCode+256,X:STA DIR+256,X INX:BNE InstDFSLp TXA:JSR InstTwoSectorsA :\ Save from DIR to disk : .InstNoDFS \ pushed P=NE -> create, CC/CS=syst/data \ EQ -> update, look at FSM for syst/data \ Decide whether to write ROM to disk \ Updating (pushed P=EQ) \ OldSyst -> yes \ OldData -> look for $.HADFSRom -> if so, yes \ NewDisk -> look for $.HADFSRom -> if so, yes \ Creating (pushed P=NE) \ OldData -> pushed P=CC -> yes \ NewDisk -> pushed P=CC -> yes : LDX #6:LDY #0 :\ Pre-assume HADFSRom is at &0006 PLP:PHP:BEQ InstRomUpd :\ Updating, look for HADFSRom BCC InstRom:BCS InstNoRom :\ Create Syst/Data -> Rom/NoRom : .InstRomUpd BIT FSM+31:BMI InstFindRom :\ NewDisk -> Look for HADFSRom LDA FSM+30:LSR A:BCS InstRom :\ OldSyst -> HADFSRom is at &0006 :\ OldData -> Look for HADFSRom .InstFindRom :\ Look for $.HADFSRom LDA #RomName AND 255:STA &F2 LDA #RomName DIV 256:STA &F3 LDY #0:JSR LookFromRoot2 :\ Look for $.HADFSRom on DRIVE CMP #1:BNE InstNoRom :\ $.HADFSRom doesn't exist as a file LDY #20:LDA (fptr),Y:AND #7:BNE InstNoRom :\ File too big DEY:LDA (fptr),Y:CMP #&40:BNE InstNoRom :\ File length not &40xx DEY:LDA (fptr),Y:BNE InstNoRom :\ File length not &4000 LDY #22:LDA (fptr),Y:TAX INY:LDA (fptr),Y:TAY :\ &YX=sector : .InstRom STX sect+0:STY sect+1 :\ Set start sector JSR ClearDIR:TAY:STA ws:STA sect+2 :\ Claim DIR store LDA #&80:STA ws+1 :\ (ws)=&8000, ROM start .InstRomLp :\ Copy two pages of ROM to DIR store LDA (ws),Y:STA DIR,Y :INC ws+1 LDA (ws),Y:STA DIR+256,Y:DEC ws+1 INY:BNE InstRomLp LDA ws+1:PHA JSR InstTwoSectors :\ Save from DIR to SECT, update SECT PLA:CLC:ADC #2:STA ws+1:STY ws CMP #&C0:BCC InstRomLp : .InstNoRom :\ Put any blank root directory PLP:BEQ InstDone:PHP :\ Updating, so no new root needed .MakeRoot JSR ClearDIR:TAX:STA sect+1 :\ SECT=&00xx .MkRoot1 CPX #9:BNE P%+4:LDA #32 :\ First 10 bytes are spaces STA DIR,X:DEX:BNE MkRoot1 :\ Blank out directory LDA #ASC"$":STA DIR :\ Set directory name LDA #71:STA DIR+10:STA sect+0 :\ Set parent dir, SECT=&0047 LDA FSM+24:STA DIR+16 LDA FSM+25:STA DIR+17 :\ Set DiskID PLP:BCS MkRootSave :\ Data disk, no $.HADFSRom LDX #9 .MkRoot2 LDA RomName,X:STA DIR+24,X:DEX:BPL MkRoot2 :\ Put "HADFSRom" into dir LDA #&40:STA DIR+24+19 :\ Length=&004000 LDA #&06:STA DIR+24+22 :\ Sector=&0006 INC DIR+12 :\ Entries=1 .MkRootSave JMP PutDir :\ Save the root directory : .InstTwoSectorsA :\ Save from DIR to sector &0000aa STA sect+0:LDA #0:STA sect+1:STA sect+2 :\ Set SECT to &0000aa .InstTwoSectors :\ Save from DIR to SECT LDA #2:STA num:LDA #&FF:STA action :\ Two sectors, Write JSR DiskAccDIR :\ Write from DIR, SECT updated \LDA sect+0:\CLC:\ADC #2:\STA sect+0 \LDA sect+1:\ADC #0:\STA sect+1 .InstDone RTS :\ All finished : \----------------------------------------------- \ Boot sector code - 512 bytes of code to create \ DFS catalogue and !Boot boot code \----------------------------------------------- : :]:BootOsw7F=&08C0:BootAddr=BootOsw7F+1 :]:BootZP=&A8:BootRom=&AA:BootNum=&AC : .BootCode:]:BootOff=BootCode-&900 EQUS "HADFS"+CHR$0+" D" .BootCmd EQUS "!Boot "+CHR$164 EQUB 13 : EQUS STRING$(15,CHR$0) :\ Disk Parameter Table \ Should also have space for partition table : :]:IF _NoFormat% AND _NoInstal%:[OPT 7:.BootLdRom :\ Prevent OutOfRange .BootGo% LDY #0:JSR Osbyte90_6-BootOff TXA:BPL BootUp AND #&40:BNE BootLdRom LDA #143:LDX #1:LDY #&E:JSR OSBYTE :\ Should use generic fx143 routine LDX #2:JSR OSBYTE:STY &244:\ w/s .BootUp LDY #2:\ Ignore SHIFT : :]:IF _NoFormat% AND _NoInstal%:z%=P%-InstFormat:P%=P%-z%:O%=O%-z% : .Osbyte90_6 :\ Generic Osbyte 90,6,y routine LDX #6 .Osbyte90 :\ Generic Osbyte 90,x,y routine LDA #90:JMP OSBYTE : .BootLdRom LDX #15 .BootLp STX &F4:STX &FE30:STA &FF30,X LDA &8008:INC &8008:CMP &8008 STX &900:BNE BootRamFound DEX:BPL BootLp DEY:BNE BootRamFound JMP BootNoRam-BootOff : .BootEndOfDir JMP BootWantSystem-BootOff : .BootRamFound JSR BootRdRt-BootOff \ Returns BootZP=&3000 \ A=&01, X=&30, Y=&00 .BootNxtName LDA BootZP:CLC:ADC #24:STA BootZP LDA BootZP+1:ADC #0:STA BootZP+1 LDY #0:CMP #&33:BEQ BootEndOfDir .BootChkChr LDA (BootZP),Y:AND #&5F:CMP RomName-BootOff,Y BNE BootNxtName INY:CPY #8:BNE BootChkChr \ Found 'HADFSRom' in root directory LDY #23:LDA (BootZP),Y:TAX DEY:LDA (BootZP),Y LDY #&40:JSR BootRd-BootOff \ Returns BootZP=&3000 \ A=&01, X=&30, Y=&00 : .BootRomCopy STY BootRom:LDA #&80:STA BootRom+1 LDX &900:\ Rom number STX &F4:STX &FE30:STA &FF30,X LDX #&40 .BootCopyLp LDA (BootZP),Y:STA (BootRom),Y INY:BNE BootCopyLp INC BootZP+1:INC BootRom+1 \LDA &AB:\CMP #&C0:\BNE BootCopyLp DEX:BNE BootCopyLp : .BootRomReset LDA #3:STA &190+200:\ *FX200,3 TXA:INX:JSR OSBYTE:\ *FX0,1 CPX #5:BCS BootReset LDA &EED5:CMP #ASC"M":BNE BootPower LDA &EEDB:CMP #ASC"5":BEQ BootReset .BootPower LDA #151:LDX #78:LDY #127 JSR OSBYTE .BootReset BIT &27A:BMI BootNoReset JMP (-4) : .BootNoRam LDX #BootRamTxt-BootText:BNE BootStall .BootNoReset LDX #0 .BootStall JSR BootPrText-BootOff .BootStop BEQ P% .BootPrText LDA BootText-BootOff,X:BEQ BootPrEnd JSR OSASCI:INX:BNE BootPrText .BootPrEnd RTS : EQUS STRING$(&A00-(P%-BootOff),CHR$0) EQUS "ISK "+CHR$0+CHR$8+CHR$&20+CHR$&02 EQUW &900:EQUW BootGo%-BootOff:EQUW &0200:EQUB &CC:EQUB 0 : .BootRdRt LDX #0:LDA #&47 LDY #3 .BootRd STA BootZP :\ SectorLo STX BootZP+1 :\ SectorHi STY BootNum :\ Number LDA #0:STA BootAddr LDA #&30:STA BootAddr+1 : LDA #0:STA BootOsw7F+0 :\ Drive=0 LDA #&53:STA BootOsw7F+6 :\ READ LDA #&03:STA BootOsw7F+5 :\ Params=3 LDX #&FF:STX BootOsw7F+4:STX BootOsw7F+3 :\ Addr high word .BootDiv10 INX LDA BootZP:SEC:SBC #10:STA BootZP LDA BootZP+1:SBC #0:STA BootZP+1 BCS BootDiv10:LDA BootZP:ADC #10 :\ X=Trk, A=Sec : STX BootOsw7F+7 :\ Trk STA BootOsw7F+8 :\ Sec .BootRdNxt LDA BootNum:TAY CLC:ADC BootOsw7F+8:CMP #11 :\ Spans past end of track? BCC BootNoSpan LDA #10:SEC:SBC BootOsw7F+8:TAY :\ Number to end of track .BootNoSpan TYA:ORA #&20:STA BootOsw7F+9 :\ Num : .BootRetry LDX #9:.BootSvLp LDA BootOsw7F,X:PHA:DEX:BPL BootSvLp LDX #BootOsw7F AND 255:LDY #BootOsw7F DIV 256 LDA #&7F:JSR OSWORD LDX #0:.BootRestLp PLA:STA BootOsw7F,X:INX:CPX #10:BNE BootRestLp AND #&1F:TAX:STA BootOsw7F+9 :\ Num LDA BootOsw7F+10:BNE BootRetry : STA BootOsw7F+8:INC BootOsw7F+7 :\ Sec=0, Trk=Trk+1 TXA:CLC:ADC BootAddr+1:STA BootAddr+1 :\ Update address LDA BootNum:SEC:SBC BootOsw7F+9 :\ Update length STA BootNum:BNE BootRdNxt :\ Read from next track : TAY:STY BootZP:LDX #&30:STX BootZP+1 :\ BootZP=&3000, Y=0 RTS : \ .0 = DRIVE \ .1/2/3/4 = ADDR \ .5 = &03 \ .6 = &53 \ .7 = TRACK \ .8 = SECTOR \ .9 = NUM OR &20 \ .10 = RESULT : .BootWantSystem LDX #BootSystem-BootText:JSR BootPrText-BootOff CLI:JSR &FFE0:JSR &FFE7:\STA BootCmd+5 LDX #(BootCmd-BootOff) AND 255:LDY #(BootCmd-BootOff) DIV 256:JMP &FFF7 : .RomName EQUS "HADFSROM " : .BootText EQUB 22:EQUB 7:EQUB 13:EQUS "Press BREAK":BRK :\ to reset .BootRamTxt EQUS "No SRAM":EQUB 13:BRK :\ No sideways Ram .BootSystem EQUS "Not a system disk":BRK : .BootRWrite \EQUS "RWRITE E.":\EQUB 13 \EQUS "V"+ver$ :]:IF _NoFormat% AND _NoInstal%:z%=P%-BootLdRom:P%=P%-z%:O%=O%-z% : : \ --------------- \ *Format routine \ --------------- .Form JSR GetDecNum:LDA numstore CMP #10:BCS P%+5:JMP BadNumber PHA:JSR SkipSpc BNE FormDsk3 .FormD_BadDrv JMP Bad_Drive .FormDsk3 CMP #ASC"0":BCC FormD_BadDrv CMP #ASC"4":BCS FormD_BadDrv AND #3:CMP #2:BCC FormDsk4 LDX &DBC:CPX &F4:BEQ FormD_BadDrv .FormDsk4 JSR GrabAbs:STA &F90:\ Drv JSR Clear26:LDA #0:STA &F94 STA &F92:PLA:STA &F91:\ Trks STA &F95:CMP #101:BCC FormDsk5 AND #&FE:STA &F95 DEC &F92:.FormDsk5 LDA &F90:\PHA:CMP #2:BCC FormDsk6:\ That PHA not needed LDA #0:STA &F92:.FormDsk6 JSR PrText:EQUS "Format drive ":BRK LDA &F90:JSR PrNyb:JSR OSNEWL LDA &DBC:\ XFILEV+2 CMP &F4:BNE FormDsk1 JSR NotEnabled:JMP FormDsk2 .FormDsk1 JSR CheckEnable:.FormDsk2 BIT &F92:BPL FormDskSkew :\ Single-sided LDA &F95:LSR A:STA &F95 :\ Divide number of tracks by two .FormDskSkew LDA #7:STA &F93 :\ Set initial skew .FormDskLoop LDA &F90:JSR FormTrack :\ Format a single track BIT &FF:BPL P%+5:JMP FormEsc :\ Quit if Escape pressed INC &F94:LDA &F94:CMP &F95 :\ Increment current track BNE FormDskLoop :\ Loop back until all done BIT &F92:BPL FormDsk7a :\ Single-sided -> create blank disk LDA &F90:CMP #2:BCS FormDsk7a :\ Drive 2/3 -> create blank disk ORA #2:STA &F90 :\ Set to drive 2/3 for side 1 LDA #0:STA &F94:BEQ FormDskLoop :\ Reset to track zero, do second side : .FormDsk7a JSR OSNEWL:JSR TimesTen :\ numstore=tracks*10 LDA &F91:AND #1:STA drive:LDA #0:TAX .FormZero STA FSM,X:INX:BNE FormZero :\ Fill sector with zeros LDA &DBC:CMP &F4:BNE FormDFS :\ HADFS not selected, install DFS LDX #23 .FormJGH :\ Put blank HADFS data in LDA JGHName-16,X:STA FSM,X:DEX:BPL FormJGH LDA #1:STA FSM+30 :\ Flag as OldData disk SEC:PHP :\ Pushed NE/SC=New/Data disk JMP InstFormat :\ Create disk, CS=don't check ENABLE : .FormDFS LDA &F91:STA drive :\ Save to drive 0/1/2/3 LDA #0:STA sect+0:STA sect+1:JSR SavePageF:\ Save empty sector &0000 LDA numstore+0:STA FSM+7 LDA numstore+1:STA FSM+6 :\ Set disk size LDA #1:STA sect+0:LDA #0:STA sect+1 JMP SavePageF :\ Save sector &0001 : .FormEsc RTS:\ Escape : .FormTrack \ A=dfs drive number STA &F80:PHA:LDA #13:JSR OSWRCH JSR PrText:EQUS "Formatting ":BRK PLA:JSR PrNyb LDA #ASC":":JSR OSWRCH LDA &F94:JSR PrHex .FormTrkLp LDX #10:BIT &FF:BMI FormEsc .FormSectLp1 LDA FormTable,X:STA &F81,X DEX:BPL FormSectLp1 LDA &F94:STA &F87:\ track \ Set up sector table LDX #0:.FormSectLp2 LDA &F94:STA &F00,X LDA #0:STA &F01,X LDA &F93:STA &F02,X:INC &F93 CMP #9:BCC FormSect2 LDA #0:STA &F93 .FormSect2 LDA #1:STA &F03,X INX:INX:INX:INX:CPX #40 BNE FormSectLp2 LDA &F93:SBC #3:BPL FormSect3 ADC #10:.FormSect3:STA &F93 LDX #&80:LDY #&F:LDA #&7F JSR OSWORD :]:IF _NoFormat%:[OPT 7:.FormGoEnd :\ Prevent OutOfRange error LDA &F8C:BEQ FormGoEnd CMP #&12:BCC FormTrkLp BNE P%+5:LDA #&12:JMP DiskErrors :\ Read only CMP #&14:BEQ FormTrkLp LDA #ASC"?":JSR OSWRCH:JMP OSNEWL .FormTable EQUD &FFFF0F00:\ =sectab EQUB &5:EQUB &63:\ =format EQUB 0:\ track EQUB &10:\ gap3 EQUB &2A:\ sector num + size EQUB &00:\ gap5 EQUB &10:\ gap1 :]:IF _NoFormat%:z%=P%-Form:P%=P%-z%:O%=O%-z% : : \ Overlap dummy module headers with code: EQUW NullKbd_Lnk :\ x-2 .DummyHeader : .PutInInfo :\ Five bytes overlapped here STA &F00,Y:INY .FormGoEnd RTS : .DummyFinal EQUW &0000 :\ x+5 \\two spare bytes EQUB DummyCopy-DummyHeader :\ x+7 BRK :\ x+8 EQUS "NullKeyboard":BRK:EQUS "0.12 (01 Aug 1998)" BRK : .NullKbd_Lnk EQUW DummyFinal :\ x-2 .NullKbd_0 .GetChn LDY #0:LDA (blk),Y RTS:BRK:BRK \.DummyCopy \BRK:\EQUS "(C)JGH" :\ x+0, \\DummyCopy-NullKbd_0 = 0 \.DummyFinal EQUB DummyCopy-NullKbd_0:BRK:\ x+7, x+8 EQUS "SoftRTC":BRK:EQUS "0.10 (23 Nov 1992)" BRK : .Trk_70 EQUS "(Untitled_Disk) " .DummyCopy .JGHName:BRK:EQUS "(C)JGH":BRK : :]:IF P%<&C000:PRINT"EQUS STRING$(";&C000-P%;",CHR$&FF":FOR z%=0TO&C000-P%:O%?z%=&FF:NEXT : ] PRINT CHR$11;STRING$(20,CHR$9);(O%-mcode%)DIV1024":";(O%-mcode%)MOD1024" Kbytes" PRINT"PAGE=&";~PAGE;" TOP=&";~TOP;" LOMEM=&";~LOMEM PRINT"VARTOP=&";~!2 AND&FFFF;" STKEND=&";~!4 AND&FFFF;" HIMEM=&";~HIMEM PRINT"Variable length: ";(!2-LOMEM)AND&FFFF;" bytes" PRINT"Free memory: ";(!4-!2)AND&FFFF;" bytes" OSCLI"SAVE ROMc "+STR$~(mcode%)+" "+STR$~(O%)+" 3000 "+STR$~(Block%-&5000) VDU7:A%=TIME-T% PRINT"Assembly done in ";(A%DIV6000);"m";RIGHT$("0"+STR$((A%DIV100)MOD60),2)"s" PRINT"Do: CLEAR"'"*LOAD ROMa"'"*LOAD ROMb"'"*LOAD ROMc"'"*SAVE ROM 3000+";~P%-&8000;" FFFF0000 FFFBBC00"