*NAME RomCombiner =&B500  bank% 16383 ( fname 255 2 inbuffer 255 <maxcards=16:maxapps=64 ,P CardName$(maxcards),CardSize(maxcards) )Z CardBase(maxcards),CardID(maxcards) :d AppCard(maxapps),AppBank(maxapps),AppOffset(maxapps) :n AppKey$(maxapps),AppName$(maxapps),AppOrder(maxapps) +x OrderOrder(maxapps),OrderApp(maxapps)  AppPatch$(maxapps) WaitLS%=:ShowApps%= bufchange%=:$inbuffer="" !r1$=(1)+"2+R":r0$=(1)+"2-R" !b1$=(1)+"2+B":b0$=(1)+"2-B"  DispTitle / b1$;"R";b0$;"ead ROM card to image files" / b1$;"C";b0$;"ombine image files of cards" 5 b1$;"V";b0$;"erify EPROM banks properly erased" 2 b1$;"B";b0$;"low image files to blank EPROM" * b1$;"F";b0$;"lash EPROM block erase" + b1$;"E";b0$;"mulator file conversion" 4 b1$;"W";b0$;"ait mode";47);b1$;"Q";b0$;"uit"; K$= " K$="R" K$="r" ReadROM !, K$="C" K$="c" Combiner 6 K$="V" K$="v" Verify @ K$="B" K$="b" BlowROM #J K$="F" K$="f" FlashErase #T K$="E" K$="e" EprConvert )^ K$="W" K$="w" WaitLS%= WaitLS% h K$="Q" K$="q" r |  Combiner numcards=0:numapps=0 LLastAdd%=0:LastBank%=0:NewCardID%=0:ForcedSize%=-1:TopBank%=63:EPFS$="N"  DispInfo  ShowApps% DispApps > b1$;"A";b0$;"dd,";b1$;"K";b0$;"ey,";b1$;"O";b0$;"rder,"; B b1$;"R";b0$;"ename,";b1$;"P";b0$;"atch,";b1$;"I";b0$;"nfo,"; @ b1$;"D";b0$;"isp,";b1$;"W";b0$;"ait,";b1$;"T";b0$;"echy,"; A b1$;"C";b0$;"reate,";b1$;"L";b0$;"oad,";b1$;"S";b0$;"ave,";  b1$;"Q";b0$;"uit"; K$= :  K$="A" K$="a" AddCard " K$="K" K$="k" ChangeKey $ K$="O" K$="o" ChangeOrder & K$="R" K$="r" Rename 0 K$="P" K$="p" Patch : K$="I" K$="i" AppInfo "D K$="T" K$="t" TechyOpts )N K$="W" K$="w" WaitLS%= WaitLS% -X K$="D" K$="d" ShowApps%= ShowApps% b K$="L" K$="l" LoadCfg l K$="S" K$="s" SaveCfg 'v K$="C" K$="c" K$="Q" K$="q"  K$="C" K$="c" tJB * "Really quit now without combining?" K$=  K$="Y" K$="y"  tdA 4 numcards=0 ErrMsg("No cards to combine!"): 4 NextApp(1)=-1 ErrMsg("No applications!"): LB%=TopBank%+1  I%=0 numcards-1 LB%=LB%-CardSize(I%) CardBase(I%)=LB%  I% 1 LB%<0 ErrMsg("Combined card too big!"):  "Destination card name";C$ % "Delete source images (Y/N)";Q$  " "Creating initial images..."  I%=0 numcards-1   J%=0 CardSize(I%)-1 3S$=bankfile$(CardName$(I%),64-CardSize(I%)+J%)  load(S$,bank%) 3* (Q$)=("Y") (Q$)=("y") ("*ERASE "+S$) %4S$=bankfile$(C$,CardBase(I%)+J%) > S$ Hbufchange%= Rsave(S$) \ J% f I% p: "Modifying images..." zO%=1 I%=NextApp(O%) (load(bankfile$(C$,TopBank%),bank%) , Getb(&3FFB)=&81 OZROM%=1 OZROM%=0 S OZROM%=1 "Techy options (if previously selected) are ignored for OZ ROM..." ( OZROM%=0 Setw(&3FF8,NewCardID%) - ForcedSize%=-1 Setb(&3FFC,totsize) ; OZROM%=0 ForcedSize%<>-1 Setb(&3FFC,ForcedSize%) Setw(&3FC6,AppOffset(I%)) 2Setb(&3FC8,newbank(AppCard(I%),AppBank(I%))) 2 OZROM%=0 Setb(&3FF6,&FF):Setb(&3FF7,&FF) R OZROM%=0 (EPFS$="Y" EPFS$="y") Setb(&3FF6,("o")):Setb(&3FF7,("z"))  O%=O%+1 J%=NextApp(O%) b J%=-1 LA%=LastAdd%:LB%=LastBank% LA%=AppOffset(J%):LB%=newbank(AppCard(J%),AppBank(J%)) " "Application: ";AppName$(I%) ModifyApp(I%,LA%,LB%) I%=J%  I%=-1 $save($inbuffer) %) OZROM%=1 $=C$: RomUpdateCfg ,. "Finished! - any key to continue"+(7) 8K= B L DispTitle V E` r1$;" RomCombiner v2.10 (c) Garry Lancaster, 2000-2012 ";r0$; j " Pause mode "; #t WaitLS% "ON "; "OFF"; ~ " Display mode "; " ShowApps% "ON" "OFF"   DispInfo DispTitle Q "Cards=";numcards;20);"Applications=";numapps;40);"Size=";totsize*16;"K"   totsize  I%,SZ%  numcards=0 =0 SZ%=0  I%=0 numcards-1 SZ%=SZ%+CardSize(I%)  I%  =SZ%  DispApps  I%,K%,L%,C$ ( numapps=0 2L%=1 < I%=0 numapps-1 FT%=(I% 4)*23 P T%=0 I%>0 :L%=L%+1 'ZC$=")": AppPatch$(I%)<>"" C$="*" Md T%);I%+1;C$;4+T%);AppKey$(I%);"=";AppName$(I%);" (";AppOrder(I%);")"; n L%=8 L%=0:K%= x I%    AppInfo  A%,K,X$  "Application number";A% A%=A%-1 < A%<0 A%>=numapps ErrMsg("Invalid application!"):   "Name:";16);AppName$(A%)  "Key:";16);AppKey$(A%)  "Order:";16);AppOrder(A%) " "DOR Bank:";16);AppBank(A%) ' "DOR Address:";16);AppOffset(A%) 6 "Card size:";16);CardSize(AppCard(A%));" banks" ) "Card ID:";16);CardID(AppCard(A%)) " "Press any key to continue"; "K= , 6 AddCard "@ I%,X%,AAdd,ABank,byte,N$,OZ$ 6J numcards=maxcards ErrMsg("Too many cards!"): T "Card name to add";N$ ^CardName$(numcards)=N$ Gh missing(bankfile$(N$,63)) ErrMsg("Card images not found!"): "rload(bankfile$(N$,63),bank%) #|CardSize(numcards)=Getb(&3FFC) !CardID(numcards)=Getw(&3FF8) #OZ$=Getc$(&3FFE)+Getc$(&3FFF) 7 OZ$<>"OZ" ErrMsg("Not an application card!"):  I%=&3FC0 &3FC5 7 Getb(I%) ErrMsg("Invalid Front DOR"):I%=&4000  I%  I%>=&4000  djF  I%=&3FC9 &3FD1 D byte: Getb(I%)<>byte ErrMsg("Invalid Front DOR"):I%=&4000  I%  I%>=&4000  19,8,78,5,65,80,80,76,0 (AAdd=Getw(&3FC6):ABank=Getb(&3FC8) > AAdd=0 ABank=0 ErrMsg("No applications on card!"): numcards=numcards+1 ' numcards=1 NewCardID%=CardID(0) ? numcards=1 Getc$(&3FF6)+Getc$(&3FF7)="oz" EPFS$="Y" & ;0 numapps=maxapps ErrMsg("Too many applications!"): D: ABank=(ABank MOD CardSize(numcards-1))+64-CardSize(numcards-1) %Dload(bankfile$(N$,ABank),bank%) @N Getb(AAdd+9)<>&83 ErrMsg("Invalid Application DOR!"): XAppCard(numapps)=numcards-1 bAppBank(numapps)=ABank lAppOffset(numapps)=AAdd vAppOrder(numapps)=numapps+1 $AppKey$(numapps)=Getc$(AAdd+15) E Getc$(AAdd+45)<>"N" ErrMsg("Application name not found!"): AppName$(numapps)="" + I%=AAdd+47 AAdd+46+Getb(AAdd+46)-1 2AppName$(numapps)=AppName$(numapps)+Getc$(I%)  I% numapps=numapps+1 *ABank=Getb(AAdd+5):AAdd=Getw(AAdd+3)  ABank=0 AAdd=0   ModifyApp(A%,LA%,LB%) 0 CD%,I%,B%,PF%,PN$,NP%,PBK%,POFF%,PORG,PNEW CD%=AppCard(A%) 9load(bankfile$(C$,newbank(CD%,AppBank(A%))),bank%) 9 Setw(AppOffset(A%)+3,LA%):Setb(AppOffset(A%)+5,LB%) *Setb(AppOffset(A%)+15,(AppKey$(A%))) ,  I%=AppOffset(A%)+25 AppOffset(A%)+28 *B%=Getb(I%) %4 B% Setb(I%,newbank(CD%,B%)) > I% 0H I%=AppOffset(A%)+35 AppOffset(A%)+44 3 RB%=Getb(I%) %\ B% Setb(I%,newbank(CD%,B%)) f I% &p I%=1 Getb(AppOffset(A%)+46)-1 5zSetb(AppOffset(A%)+46+I%,(AppName$(A%),I%,1)))  I%  AppPatch$(A%)="" PF%=(AppPatch$(A%)) 0 PF%=0 ErrMsg("Patch file not found!"): #PF%,PN$ #PF%,NP%  "Applying patch: ";PN$  I%=1 NP% #PF%,PBK%,POFF%,PORG,PNEW >load(bankfile$(C$,newbank(CD%,AppBank(A%)+PBK%)),bank%) $PORG=PatchVal(PORG,AppBank(A%)) 2PNEW=PatchVal(PNEW,newbank(CD%,AppBank(A%))) P Getb(POFF%)<>PORG ErrMsg("Warning: unexpected value on patch #"+(I%))  Setb(POFF%,PNEW)  I%  #PF% $ . NextApp(O%) 8 I%,NA% B NA%=-1 L I%=0 numapps-1 V AppOrder(I%)=O% NA%=I% ` I% j =NA% t ChangeKey ~ A%,X$  "Application number";A% A%=A%-1 < A%<0 A%>=numapps ErrMsg("Invalid application!"):  "New key (A-Y or 0)";X$ ( X$>="a" X$<="z" X$=((X$)-32) = (X$<"A" X$>"Y") X$<>"0" ErrMsg("Invalid key!"):  AppKey$(A%)=X$   ChangeOrder  A%,I%,J%,P,S%,X 4 "Application number (0=specify full order)";A% A%=A%-1  A%<0 TDK 5 A%>=numapps ErrMsg("Invalid application!"): $ "New position (0=leave out)";P * P<0 ErrMsg("Invalid position!"): ( P>AppOrder(A%) P=P+0.2 2 P<>0 P=P-0.1 < AppOrder(A%)=P F I%=0 numapps-1 /P OrderOrder(I%)=AppOrder(I%):OrderApp(I%)=I% Z I% d n S%=0 x numapps<2 dRJ  I%=0 numapps-2  J%=I%+1 numapps-1 + OrderOrder(J%)>=OrderOrder(I%) t~J C X=OrderOrder(I%):OrderOrder(I%)=OrderOrder(J%):OrderOrder(J%)=X ; X=OrderApp(I%):OrderApp(I%)=OrderApp(J%):OrderApp(J%)=X  S%=1  J%  I% S%=0  I%=0 numapps-1 OrderOrder(I%)>0 S%=S%+1  AppOrder(OrderApp(I%))=S% I%: * I%=0 numapps-1:AppOrder(I%)=0: I%  S%=1  1" "Next application number (ENTER to end)";I% , I%=I%-1 6 I%<0 D^K ;@ I%>numapps-1 ErrMsg("Invalid application!"): D^K GJ AppOrder(I%)<>0 ErrMsg("Application already selected!"): D^K T AppOrder(I%)=S%:S%=S%+1 ^ I%<0 h r TechyOpts | X%,E$ < "Card ID=";NewCardID%;" Change to (ENTER=no change)";  X%: X% NewCardID%=X% 8 "Final link is to ";LastAdd%;" in bank ";LastBank% # "New bank (ENTER=no change)"; 5 X%: X% LastBank%=X%: "DOR address";LastAdd% 6 "Force size to ";ForcedSize%;" (-1=don't force)" , "New size to force (ENTER=no change)"; 3 X%: (X%>0 X%<257) X%=-1 ForcedSize%=X% ; "Top bank=";TopBank%;" Change to (ENTER=no change)"; % X%: X%>0 X%<64 TopBank%=X% C "EPROM filing system=";EPFS$;" Change to (ENTER=no change)"; 7 E$: E$="Y" E$="y" E$="N" E$="n" EPFS$=E$   Rename  A%,N$  "Application number";A% & A%=A%-1 <0 A%<0 A%>=numapps ErrMsg("Invalid application!"): : "New name";N$ .D (N$)<(AppName$(A%)) N$=N$+" ": DDL 5N (N$)>(AppName$(A%)) N$=N$,(AppName$(A%))) X AppName$(A%)=N$ b l Patch v A%  "Application number";A% A%=A%-1 < A%<0 A%>=numapps ErrMsg("Invalid application!"): "Patch file";AppPatch$(A%)   ErrMsg(err$)  I% err$  7 I%=(300)   save($fname)  H%,L%,D%,E%,B%,C%,K  bufchange% L%=fname  E%=bank%:C%=16384 ' H%=L% 256:D%=E% 256:B%=C% 256 * (&FEA6) @4 WaitLS% " Image ";$fname;" saved - press any key":K= !> $inbuffer=$fname:bufchange%= H R load($fname,E%) \ H%,L%,D%,B%,C%,K f $inbuffer=$fname #p bufchange% save($inbuffer) =z WaitLS% " Press any key to load image ";$fname:K= L%=fname ) H%=L% 256:D%=E% 256:B%=255:C%=255 (&FEA3) ! $inbuffer=$fname:bufchange%=   Setb(add%,b%)  bufchange%=  bank%?(add% &3FFF)=b%   Setw(add%,w%)  bufchange%=  add%=add% &3FFF  bank%?add%=w% 256 bank%?(add%+1)=w% 256   Getb(add%) $=bank%?(add% &3FFF) . Getc$(add%) 8=(bank%?(add% &3FFF)) B Getw(add%) Ladd%=add% &3FFF $V=bank%?add%+256*(bank%?(add%+1)) ` bankfile$(N$,B%) j=N$+"."+(B%) t newbank(C%,B%) ~ E% E%=B% 63 4 E%<64-CardSize(C%) E%=E%+CardSize(C%): tRN &=E%-(64-CardSize(C%))+CardBase(C%)  ReadROM # bufchange% save($inbuffer)  F%=4  ":*//romutil.bas"  h BlowROM #r bufchange% save($inbuffer) |W%=WaitLS%:S%=ShowApps% F%=1  ":*//romutil.bas"   missing(N$)  X% X%=(N$)  X% #X%:X%= X%= =X%  FlashErase  F%=2  ":*//romutil.bas"   p Verify zF%=5  ":*//romutil.bas"   EprConvert F%=3  ":*//romutil.bas"  $ RomUpdateCfg .F%=6 8 ":*//romutil.bas" B 2 SaveCfg < I%,X%,N$ FDispTitle P ,Z "Filename to save configuration in";N$ dX%=(N$) .n X%=0 ErrMsg("Error creating file!"): x#X%,EPFS$ ^#X%,numcards,numapps,LastAdd%,LastBank%,NewCardID%,ForcedSize%,TopBank%,WaitLS%,ShowApps%  I%=0 numcards-1 #X%,CardName$(I%) #X%,CardSize(I%),CardID(I%)  I%  I%=0 numapps-1 #X%,AppName$(I%) ;#X%,AppCard(I%),AppBank(I%),AppOffset(I%),AppOrder(I%) #X%,AppKey$(I%) #X%,AppPatch$(I%)  I% #X% #ErrMsg("Configuration saved!")   LoadCfg  I%,X%,N$ "DispTitle , .6 "Filename to load configuration from";N$ @X%=(N$) )J X%=0 ErrMsg("File not found!"): T#X%,EPFS$ ^^#X%,numcards,numapps,LastAdd%,LastBank%,NewCardID%,ForcedSize%,TopBank%,WaitLS%,ShowApps% h I%=0 numcards-1 r#X%,CardName$(I%) |#X%,CardSize(I%),CardID(I%)  I%  I%=0 numapps-1 #X%,AppName$(I%) ;#X%,AppCard(I%),AppBank(I%),AppOffset(I%),AppOrder(I%) #X%,AppKey$(I%) #X%,AppPatch$(I%)  I% #X% $ErrMsg("Configuration loaded!")   PatchVal(V,BK%)  V1,V2 V1=V:V2=0 - V1<-1000 V2=(V1 1000):V1=V1 1000  V1<0 V1=BK%+V1+64 =((V1+V2) 256)