Home » Archimedes archive » Zipped Apps » 6502em » !6502Em/src/!RunImage
!6502Em/src/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Zipped Apps » 6502em |
Filename: | !6502Em/src/!RunImage |
Read OK: | ✔ |
File size: | FA0A bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM > !RunImage 20REM 6502Em (desktop frontend for binaries) 30REM (c) Michael and Anne Borcherds, 1995 40REM LOCK ROMRAM,memory,roms,osword7F_drive%,osword72_drive%,paging% 50version$="2.10 (24th November 1996)" 60 70ON ERROR SYS "XWimp_CloseDown":SYS "XWimp_ReportError"," Fatal internal error "+STR$ ERL+": "+REPORT$,1,"6502Em":QUIT 80 90osword7F_drive%=1 : REM drive accessed for protected DFS discs 100osword72_drive%=0 : REM drive accessed for protected ADFS discs 110paging%=TRUE 120top%=HIMEM 130 140HIMEM=HIMEM-96*1024 150!HIMEM=0:SYS "OS_ReadVarVal","6502Em$SaveScreen",HIMEM,255 TO ,S$ 160IF LEFT$(S$,3)="Yes" THEN 170sprite=HIMEM 180save_sprite=FALSE 190ELSE 200HIMEM=HIMEM+96*1024 210sprite=0 220save_sprite=FALSE 230ENDIF 240 250HIMEM=HIMEM-(64+64)*1024 : REM 64k BBC memory map + 32k Master extra memory + 256 bytes variables + spare 260memory=HIMEM+64*1024 270 280IF memory<>&A0000 THEN ERROR 0,"6502Em initialisation: Fatal memory error" 290 300sheila=memory-&200 : REMFORI%=&100 TO &1FF STEP 4:sheila!I%=0:NEXT 310 320HIMEM=HIMEM-17*16*1024:roms=HIMEM 330HIMEM=HIMEM-160*1024:code=HIMEM 340romsize%=&4000 350 360filetype%=&BBC 370 380REM volume between 0 and 127 390LIBRARY "<6502Em$Res>.Sound7a" 400 410PROCtemplates 420PROCinitBBC 430PROCsound_init 440PROCnewmachine 450PROCinit 460PROCpoll 470 480END 490 500 510DEFPROCinstall(sprite$) 520LOCAL sx%,sy%,sm%,px%,py% 530DIM text_buff &100, sprite_buff &100 540SYS "Wimp_SpriteOp",40,,sprite$ TO ,,,sx%,sy%,,sm% 550SYS "OS_ReadModeVariable",sm%,4 TO ,,px% : sx%=sx%<<px% 560SYS "OS_ReadModeVariable",sm%,5 TO ,,py% : sy%=sy%<<py% 570!q%=-1 580q%!4=0:q%!8=-16:q%!12=q%!4+sx%:q%!16=20+sy% 590REMq%!20=&1700312B (filled icon) 600q%!20=&1700310B 610 620!(q%+24)=text_buff 630!(q%+28)=sprite_buff 640$text_buff=sprite$ 650$sprite_buff="S"+sprite$ 660!(q%+32)=&100 670SYS "Wimp_CreateIcon",,q% TO !q% 680bar_hand=!q% 690ENDPROC 700 710DEFPROCreinstall(sprite$) 720$sprite_buff="S"+sprite$ 730$text_buff=sprite$ 740buffer!0=-2 750buffer!4=bar_hand 760REMbuffer!8=0 770REMbuffer!12=0 780buffer!8=&00800080 790buffer!12=&00800080 800SYS"Wimp_SetIconState",,buffer 810REMSYS"Wimp_ForceRedraw",-2,0,0,&FFFF,&FFFF 820buffer!8=0 830buffer!12=&00800080 840SYS"Wimp_SetIconState",,buffer 850ENDPROC 860 870DEFPROCtemplates 880DIM t 4:$t="TASK" 890SYS "Wimp_Initialise",200,!t,"6502Em" TO RO%,hand% 900DIM q% 256, q2% 256, iconmenu% 300, miscmenu% 200,rommenu% 800, machine_menu% 200, oscli_menu 20 910DIM pokemenu% 50, pokevalid% 12, poketext% 12, drag 40 920DIM temp_regs 12*4, buffer &100 930PROCclearmem(HIMEM,top%) 940PROCinstall("OS�1.2") 950 960PROCreadpatches 970PROCreadspeeds 980 990IF RO%>299 THEN 1000SYS "OS_Byte",161,140 TO ,,t% : THREED%=-(t% AND 1) 1010IF THREED%=TRUE THEN SYS "Wimp_OpenTemplate",,"<6502Em$Res>.Template3D" ELSE SYS "Wimp_OpenTemplate",,"<6502Em$Res>.Templates" 1020SYS "Wimp_LoadTemplate",,-1,,,-1,"info" TO ,A%,B% 1030SYS "Wimp_LoadTemplate",,-1,,,-1,"xfer_send" TO ,C%,D% 1040SYS "Wimp_LoadTemplate",,-1,,,-1,"xfer_send2" TO ,E%,F% 1050SYS "Wimp_LoadTemplate",,-1,,,-1,"config" TO ,G%,H% 1060ELSE 1070SYS "Wimp_OpenTemplate",,"<6502Em$Res>.Templates" 1080A%=700 : B%=300 : C%=400 : D%=350 : E%=C% : F%=D% 1090G%=2000:H%=2000 1100ENDIF 1110DIM buffer2 A%, icon3 B%, xfer1 C%+4, xfer2 D%, xfer3 E%+4, xfer4 F% 1120DIM config G%, config2 H%+4 1130SYS "Wimp_LoadTemplate",,buffer2,icon3,icon3+B%,-1,"info" 1140SYS "Wimp_LoadTemplate",,xfer1,xfer2,xfer2+D%,-1,"xfer_send" 1150SYS "Wimp_LoadTemplate",,xfer3,xfer4,xfer4+F%,-1,"xfer_send2" 1160SYS "Wimp_LoadTemplate",,config,config2,config2+H%,-1,"config" 1170SYS "Wimp_CloseTemplate" 1180SYS "Wimp_CreateWindow",,xfer1 TO A%:xfer%=A% 1190SYS "Wimp_CreateWindow",,xfer3 TO A%:xfer2%=A% 1200SYS "Wimp_CreateWindow",,config TO A%:config%=A% : config_open%=FALSE 1210SYS "Wimp_CreateWindow",,buffer2 TO A%:info%=A% 1220 1230!buffer=info% 1240buffer!4=9 1250SYS "Wimp_GetIconState",,buffer 1260$(buffer!28)=version$+CHR$0 1270 1280!buffer=info% 1290buffer!4=11 1300SYS "Wimp_GetIconState",,buffer 1310OSCLI"Load <6502Em$Res>.SerialNo "+STR$~(buffer!28) 1320ENDPROC 1330 1340DEFPROCinit 1350SYS "OS_GetEnv" TO A$ 1360IF RIGHT$(A$,1)=" " THEN 1370I%=0 1380REPEATI%+=1:UNTILMID$(A$,LENA$-I%,1)<>" " 1390A$=LEFT$(A$,LENA$-I%) 1400ENDIF 1410IF RIGHT$(A$,1)=CHR$34 THEN A$=LEFT$(A$,LENA$-1) 1420IF LEFT$(A$,1)=CHR$34 THEN A$=RIGHT$(A$,LENA$-1) 1430I%=0 1440REPEATI%+=1:UNTILMID$(A$,LENA$-I%,1)=" " OR I%=LENA$ 1450A$=RIGHT$(A$,I%) 1460IF FNupper(MID$(A$,LENA$-9,10))<>".!RUNIMAGE" THEN PROCsnap_load(A$):PROCBBC 1470 1480ENDPROC 1490 1500DEFPROCpoll 1510ON ERROR IF FNreport(REPORT$,ERR<>1)=2 THEN PROCquit 1520 1530REPEAT 1540mask%=%1100000110011 1550SYS "Wimp_Poll",mask%,q% TO action% 1560 1570CASE action% OF 1580WHEN 2 : SYS "Wimp_OpenWindow",,q%:IF !q%=config% THEN config_open%=TRUE 1590WHEN 3 : SYS "Wimp_CloseWindow",,q%:IF !q%=config% THEN config_open%=FALSE 1600WHEN 6 : PROCclick 1610WHEN 7 : PROCsave 1620WHEN 8 : PROCkey 1630WHEN 9 : PROCdecodemenu 1640WHEN 17,18 : PROCmessage 1650ENDCASE 1660 1670UNTILFALSE 1680ENDPROC 1690 1700DEFPROCmessage 1710CASE q%!16 OF 1720WHEN 0 : PROCquit 1730WHEN 2 : 1740IF q%!12=myref% THEN 1750SYS "OS_WriteN",q%+44 TO A$ 1760IF A$="<Wimp$Scrap>" THEN 1770SYS "XOS_ReadVarVal","Wimp$Scrap",,-1 TO ,,A% 1780IF A%=0 THEN SYS "Wimp_ReportError"," Scrap file not set",1,"6502Em":ENDPROC 1790ENDIF 1800IF save_sprite% THEN 1810PROCsprite_save(A$) 1820!buffer=xfer2% 1830ELSE 1840PROCsnap_save(A$) 1850!buffer=xfer% 1860ENDIF 1870 1880IF LEFT$(A$,6)<>"<Wimp$" THEN 1890buffer!4=1 1900SYS "Wimp_GetIconState",,buffer 1910$(buffer!28)=A$ 1920ENDIF 1930 1940q%!16=3 : q%!12=q%!8 : SYS "Wimp_SendMessage",17,q%,q%!4 1950ENDIF 1960WHEN 3 1970SYS "OS_WriteN",q%+44 TO A$ 1980CASE q%!40 OF 1990WHEN &B22 : PROCdfsimage(A$) 2000WHEN filetype% : PROCsnap_load(A$) 2010WHEN &FFB,&FFE : PROCfile_load(A$):PROCBBC 2020ENDCASE 2030WHEN 5 : 2040CASE q%!40 OF 2050 2060WHEN filetype% : REM Snapshot 2070q%!16=4:q%!12=q%!8:SYS "Wimp_SendMessage",17,q%,q%!20 2080SYS "OS_WriteN",q%+44 TO A$ 2090PROCsnap_load(A$) : PROCBBC 2100 2110OTHERWISE 2120IF NOTINKEY-1 THEN 2130SYS "OS_WriteN",q%+44 TO A$ 2140F$=A$ 2150SYS "OS_File",5,F$ TO type%,,load%,exec%,length% 2160IF type%=2 AND LEFT$(RIGHT$(F$,LENF$-LENFNleaf(F$)-1),1)<>"!" THEN ENDPROC 2170IF type%=2 THEN F$=A$+".!Run":SYS "OS_File",5,F$ TO type%,,load%,exec%,length%:IF (load% AND &FFF00)=&BBC00 THEN q%!16=4:q%!12=q%!8:SYS "Wimp_SendMessage",17,q%,q%!20:PROCsnap_load(F$) : PROCBBC : ENDPROC 2180IF type%=0 THEN F$=A$+"."+RIGHT$(A$,LENA$-LENFNleaf(A$)-2):SYS "OS_File",5,F$ TO type%,,load%,exec%,length% 2190 2200 2210 IF ((load%>>>16)=0 OR (load%>>>16)=&FFFF OR (load%>>>16)=&00FF) AND (load% AND &FFFF)<&8000 AND type%=1 THEN 2220 q%!16=4:q%!12=q%!8:SYS "Wimp_SendMessage",17,q%,q%!20 2230 PROCfile_load(F$) 2240 PROCBBC 2250 ENDIF 2260ENDIF 2270ENDCASE 2280WHEN &400C1 : REMPROCmode 2290ENDCASE 2300ENDPROC 2310 2320DEFPROCkey 2330CASE !q% OF 2340WHEN config% 2350 2360IF q%!24=13 AND q%!4=16 THEN 2370SYS "Wimp_GetIconState",,q% 2380PROCnewspeed(VAL$(q%!28)) 2390ELSE 2400SYS "Wimp_ProcessKey",q%!24 2410ENDIF 2420 2430WHEN xfer%,xfer2% 2440 2450IF q%!4=1 AND q%!24=13 THEN 2460!buffer=!q% 2470buffer!4=1 2480SYS "Wimp_GetIconState",,buffer 2490IF !q%=xfer% THEN PROCsnap_save($(buffer!28)) ELSE PROCsprite_save($(buffer!28)) 2500SYS "Wimp_CreateMenu",-1 2510ELSE 2520SYS "Wimp_ProcessKey",q%!24 2530ENDIF 2540 2550ENDCASE 2560ENDPROC 2570 2580DEFPROCclick 2590mx%=q%!0 2600my%=q%!4 2610mb%=q%!8 2620h%=q%!12 2630i%=q%!16 2640IF h%=config% THEN PROCconfig:ENDPROC 2650IF h%=-2 THEN 2660IF mb%=2 THEN PROCopenmenu(iconmenu%,mx%-64,96+7*44) 2670IF mb%=1 THEN 2680REMPROCreadCSD 2690REMPROCBBC 2700PROCopenconfig 2710ENDIF 2720IF mb%=4 THEN 2730IF INKEY-1 OR INKEY-2 THEN PROCreadCSD 2740PROCBBC 2750ENDIF 2760ENDIF 2770IF i%=3 AND (h%=xfer% OR h%=xfer2%) THEN SYS "Wimp_CreateMenu",-1 2780 2790IF (h%=xfer% OR h%=xfer2%) AND i%=2 AND (mb%=1 OR mb%=4) THEN 2800!buffer=h% 2810buffer!4=1 2820SYS "Wimp_GetIconState",,buffer 2830IF h%=xfer% THEN PROCsnap_save($(buffer!28)) ELSE PROCsprite_save($(buffer!28)) 2840IF mb%<>1 THEN SYS "Wimp_CreateMenu",-1 2850ENDIF 2860 2870IF h%=xfer% AND i%=0 THEN 2880save_sprite%=FALSE 2890!xfer1=xfer% : SYS "Wimp_GetWindowInfo",,xfer1 2900!buffer=xfer% : buffer!4=0 : SYS "Wimp_GetIconState",,buffer 2910drag!0=0 2920drag!8=xfer1!4+buffer!8 2930drag!12=xfer1!16+buffer!12 2940drag!16=xfer1!4+buffer!16 2950drag!20=xfer1!16+buffer!20 2960SYS "OS_Byte",161,&1C TO ,,byte% 2970IF RO%>299 AND (byte% AND 2)=2 THEN 2980drag!4=7 2990solid%=TRUE 3000ELSE 3010drag!4=5 3020solid%=FALSE 3030ENDIF 3040drag!24=-100 3050drag!28=-100 3060drag!32=30000 3070drag!36=30000 3080IF solid% THEN SYS "DragASprite_Start",%11000101,1,"file_BBC",drag+8 ELSE SYS "Wimp_DragBox",,drag 3090ENDIF 3100IF h%=xfer2% AND i%=0 THEN 3110save_sprite%=TRUE 3120!xfer3=xfer2% : SYS "Wimp_GetWindowInfo",,xfer3 3130!buffer=xfer2% : buffer!4=0 : SYS "Wimp_GetIconState",,buffer 3140drag!0=0 3150drag!8=xfer3!4+buffer!8 3160drag!12=xfer3!16+buffer!12 3170drag!16=xfer3!4+buffer!16 3180drag!20=xfer3!16+buffer!20 3190SYS "OS_Byte",161,&1C TO ,,byte% 3200IF RO%>299 AND (byte% AND 2)=2 THEN 3210drag!4=7 3220solid%=TRUE 3230ELSE 3240drag!4=5 3250solid%=FALSE 3260ENDIF 3270drag!24=-100 3280drag!28=-100 3290drag!32=30000 3300drag!36=30000 3310IF solid% THEN SYS "DragASprite_Start",%11000101,1,"file_FF9",drag+8 ELSE SYS "Wimp_DragBox",,drag 3320ENDIF 3330ENDPROC 3340 3350 3360DEFPROCmenus 3370LOCALP% 3380PROCmenuheader(iconmenu%,"6502Em",LEN"Single Task "*16+12) 3390PROCmenuitem(0,info%,&07000001,"Info") 3400PROCmenuitem(0,rommenu%,&07000001,"ROMs") 3410PROCmenuitem(0,miscmenu%,&07000001,"Misc") 3420REMPROCmenuitem(0,-1,&07000001,"Read CSD") 3430REMPROCmenuitem(0,-1,&07000001,"Reset") 3440PROCmenuitem(0,xfer%,&07000001,"Save") 3450IF sprite=0 THEN 3460PROCmenuitem(0,xfer2%,&07000001 OR (2^22),"Sprite") 3470ELSE 3480PROCmenuitem(0,xfer2%,&07000001 OR -(2^22)*(sprite!4=0),"Sprite") 3490ENDIF 3500PROCmenuitem(0,-1,&07000001,"Config...") 3510PROCmenuitem(&80,-1,&07000001,"Quit") 3520 3530buffer!0=0:buffer!4=0:buffer!8=0 3540SYS "OS_ReadVarVal","6502Em$Keymap",buffer,255 TO ,S$ 3550keymap%=FNkeymap(S$) 3560 3570IF keymaps%<>0 THEN 3580PROCmenuheader(keysmenu%,"Keymap",12*16+12) 3590FORI%=1 TO keymaps% 3600PROCmenuitem(-&80*(I%=keymaps%)-(keymap%=I%),-1,&07000001,keymap$(I%)) 3610NEXT 3620ENDIF 3630 3640IF patches%<>0 THEN 3650PROCmenuheader(patchmenu%,"Patches",12*16+12) 3660FORI%=1 TO patches% 3670PROCmenuitem(-2*(I%=patches%),-1,&07000001,patch$(I%)) 3680NEXT 3690PROCmenuitem(&80,-1,&07000001,"(none)") 3700ENDIF 3710 3720PROCmenuheader(speedmenu%,"Speed",6*16+12) 3730FORI%=0 TO speeds% 3740PROCmenuitem(-&80*(I%=speeds%),-1,&07000001,speed$(I%)) 3750NEXT 3760 3770PROCmenuheader(rommenu%,"Protected?",12*16+12) 3780FORI%=15 TO 0 STEP -1 3790PROCmenuitem(-(?(ROMRAM+I%)<>0)-&80*(I%=0),-1,&07000001,FNROMname(I%)) 3800NEXT 3810 3820PROCmenuheader(miscmenu%,"Misc",LEN"Disable Tape "*16+12) 3830PROCmenuitem(0,-1,&07000001,"Read CSD") 3840PROCmenuitem(0,-1,&07000001,"Reset") 3850IF machine%=0 OR machine%=4 THEN 3860PROCmenuitem(0,-1,&07000001,"Disable Tape") 3870ELSE 3880PROCmenuitem(0,-1,&07000001 OR 2^22,"Disable Tape") 3890ENDIF 3900PROCmenuitem(&80,-1,&07000001,"No Joystick") 3910 3920PROCmenuheader(machine_menu%,"Machine",LEN"Master 128 "*16+12) 3930PROCmenuitem(0,-1,&07000001 OR -(2^22)*(Machine%(0)=0),Machine$(0)) 3940PROCmenuitem(0,-1,&07000001 OR -(2^22)*(Machine%(1)=0),Machine$(1)) 3950PROCmenuitem(0,-1,&07000001 OR -(2^22)*(Machine%(2)=0),Machine$(2)) 3960PROCmenuitem(0,-1,&07000001 OR -(2^22)*(Machine%(3)=0),Machine$(3)) 3970PROCmenuitem(&80,-1,&07000001 OR -(2^22)*(Machine%(4)=0),Machine$(4)) 3980 3990ENDPROC 4000 4010DEFPROCmenuheader(A%,B$,G%) 4020P%=A% 4030$P%=B$+CHR$13 4040P%?12=7 : P%?13=2 : P%?14=7 : P%?15=0 4050P%!16=G% : P%!20=44 : P%!24=0 4060P%+=28 4070ENDPROC 4080 4090DEFPROCmenuitem(A%,B%,C%,D$) 4100P%!0=A% 4110P%!4=B% 4120P%!8=C% 4130$(P%+12)=D$+CHR$13 4140P%+=24 4150ENDPROC 4160 4170DEFPROCindirecteditem(A%,B%,C%,D$,E%) 4180P%!0=A% 4190P%!4=B% 4200P%!8=C%+&07000000 4210P%!12=E% 4220P%!16=0 4230P%!20=LEND$+1 4240$E%=D$+CHR$13 4250P%+=24 4260ENDPROC 4270 4280DEFPROCdecodemenu 4290CASE current_menu% OF 4300WHEN iconmenu% : PROCiconmenu 4310WHEN machine_menu% : IF !q%<>-1 AND !q%<>machine% THEN machine%=!q%:PROCnewmachine 4320WHEN keysmenu% : IF !q%<>-1 THEN PROCsetkeymap(keymap$(!q%+1)) 4330 4340WHEN patchmenu% : IF !q%>=patches% THEN 4350 patch%=0:PROCpokeicontext(14,"(none)") 4360 ELSE 4370 IF patch%<>!q%+1 THEN patch%=!q%+1:PROCloadpatch 4380 ENDIF 4390WHEN speedmenu% : PROCnewspeed(VAL(LEFT$(speed$(!q%),LENspeed$(!q%)-1))) 4400ENDCASE 4410SYS "Wimp_GetPointerInfo",,q% 4420IF (q%!8 AND %1)>0 THEN PROCopenmenu(current_menu%,0,0) 4430ENDPROC 4440 4450DEFPROCiconmenu 4460CASE !q% OF 4470 WHEN 0 : REM Info 4480 WHEN 5 : REM Configure 4490 PROCopenconfig 4500 WHEN 1 : REM ROMs 4510 IF q%!4 > -1 THEN 4520 S%=15-(q%!4 AND 15) 4530 IF FNvalidROM(S%) OR ?(ROMRAM+S%)=2 THEN 4540 IF ?(ROMRAM+S%)=2 THEN ?(ROMRAM+S%)=0 ELSE ?(ROMRAM+S%)=1-?(ROMRAM+S%) 4550 ELSE 4560 ?(ROMRAM+S%)=2 4570 ENDIF 4580 ENDIF 4590 WHEN 2 : REM Misc 4600 IF q%!4 > -1 THEN 4610 CASE q%!4 OF 4620 WHEN 0 : PROCreadCSD 4630 WHEN 1 : PROCreset(2) 4640 WHEN 2 : PROCdisableCFS 4650 WHEN 3 : joystick%=FALSE 4660 ENDCASE 4670 ENDIF 4680 WHEN 3 : REM Save 4690 WHEN 4 : REM Sprite 4700 OTHERWISE : PROCquit 4710ENDCASE 4720ENDPROC 4730 4740DEFPROCmenuitem2(A%,B%,C%,D%,E%,F%) 4750P%!0=A% 4760P%!4=B% 4770P%!8=C% 4780P%!12=D% 4790P%!16=E% 4800P%!20=F% 4810P%+=24 4820ENDPROC 4830 4840DEFFNcount(A$,B$) 4850LOCALI%,C% 4860FORI%=1 TO LENA$ 4870IF MID$(A$,I%,1)=B$ THEN C%+=1 4880NEXT 4890=C% 4900 4910DEFFNletter(A$) 4920LOCAL I%,J% 4930FORI%=1 TO LENA$ 4940IF INSTR("ABCDEFabcdef",MID$(A$,I%,1)) THEN J%=TRUE:I%=LENA$ 4950NEXT 4960=J% 4970 4980 4990DEFPROCsave 5000IF solid% THEN SYS "DragASprite_Stop" 5010K$="" 5020IF save_sprite% THEN !drag=xfer2% ELSE !drag=xfer% 5030drag!4=1 5040SYS "Wimp_GetIconState",,drag 5050P%=drag!28-1 5060REPEAT P%+=1 5070IF ?P%<>13 THEN K$=K$+CHR$?P% 5080IF ?P%=ASC"." OR ?P%=ASC":" THEN K$="" 5090UNTIL?P%=13 5100SYS "Wimp_GetPointerInfo",,q% 5110IF q%!12<>xfer% AND q%!12<>xfer2% THEN SYS "Wimp_CreateMenu",-1 5120q%!20=q%!12 5130q%!24=q%!16 5140q%!28=q%!0 5150q%!32=q%!4 5160 5170IF save_sprite%=FALSE THEN 5180q%!36=65667 5190q%!40=filetype% 5200ELSE 5210q%!36=80*1024 5220q%!40=&FF9 5230ENDIF 5240 5250q%!12=0 5260q%!16=1 5270$(q%+44)=K$+CHR$0 5280q%!0=(48+LENK$) AND %111111100 5290 5300SYS "XWimp_SendMessage",17,q%,q%!20,q%!24 5310myref%=q%!8 5320ENDPROC 5330 5340DEFFNleaf(A$) 5350LOCAL I% 5360I%=LENA$+1 5370REPEATI%-=1:UNTIL MID$(A$,I%,1)="." 5380=LEFT$(A$,I%-1) 5390 5400DEFPROCerr 5410ONERROR OFF 5420IF FNreport(REPORT$,TRUE) THEN PROCquit ELSE PROCpoll 5430ENDPROC 5440 5450DEFPROCerr2(M%) 5460LOCAL ERROR 5470ONERROR LOCAL PROCerr 5480IF hand%<>0 THEN SYS "XOS_Find",0,hand% : REM CLOSE#hand% 5490SYS "XWimp_SetMode",M% : SYS "X6502_RemoveExitHandler" 5500IF sound%=TRUE THEN PROCsound_restore 5510IF FNreport(REPORT$,TRUE) THEN PROCquit ELSE PROCpoll 5520ENDPROC 5530 5540DEF FNreport(a$,E%) 5550LOCAL A% 5560IF E% THEN 5570 SYS "XWimp_ReportError"," Internal error "+STR$ ERL+": "+a$,3,"6502Em" TO ,A% 5580ELSE SYS "XWimp_ReportError"," "+a$,1,"6502Em" TO ,A% 5590ENDIF 5600=A% 5610 5620DEFFNcsd 5630SYS "OS_GBPB",6,,buffer 5640buffer?(buffer?1+2)=13 5650=$(buffer+2) 5660 5670DEFPROCreadCSD 5680 5690LOCAL ERROR 5700 5710ON ERROR LOCAL : RESTORE ERROR : fs$="ADFS:":disc$="":path$="$":subpath$="":SYS "XWimp_ReportError"," Error in reading current directory: "+REPORT$,1,"6502Em":ENDPROC 5720 5730 5740FOR I%=0 TO 1 5750SYS "OS_Args" TO FS% 5760SYS "OS_FSControl",33,FS%,STRING$(20," "),20 TO ,,fs$ 5770IF fs$<>"" THEN fs$=fs$+":":I%=1 ELSE OSCLI"DIR <6502Em$Dir>.^" 5780NEXT 5790 5800SYS "OS_GBPB",5,,buffer 5810buffer?(?buffer+1)=13 5820disc$=$(buffer+1) 5830IF disc$=CHR$34+"Unset"+CHR$34 THEN disc$="" ELSE disc$=":"+disc$+"." 5840 5850path$=FNcsd 5860IF path$<>"$" THEN 5870REMSYS "OS_FSControl",11,"@" 5880REPEAT 5890SYS "OS_FSControl",0,"^" 5900CSD$=FNcsd 5910path$=CSD$+"."+path$ 5920UNTIL CSD$="$" 5930IF RIGHT$(path$,7)=CHR$34+"Unset"+CHR$34 THEN path$="$" 5940SYS "OS_FSControl",0,path$ 5950ENDIF 5960 5970subpath$="" 5980ENDPROC 5990 6000DEFPROCinitBBC 6010 6020!&97000=&A0A0A0A0 6030!&97004=&A0A0A0A0 6040!&97008=&A0A0A0A0 6050!&9700C=&A0A0A0A0 6060 6070joystick%=TRUE 6080 6090DIM R%(7) 6100 6110DIM BBC$(&7C),ARC$(&78),Elec$(3,13) 6120RESTORE 6130FORI%=0 TO 3 6140FORJ%=13 TO 0 STEP -1 6150READ Elec$(I%,J%) 6160NEXT 6170NEXT 6180FORI%=0 TO 7 6190FORJ%=0 TO 12 6200READ BBC$(I%*16+J%) 6210NEXT 6220NEXT 6230FORI%=0 TO &78 6240READ ARC$(I%) 6250NEXT 6260 6270PROCreadkeymaps 6280REMPROCsetkeymap("Default") 6290PROCelkkeys("<6502Em$Res>.ElkKeys") 6300SYS "6502_Register" 6310 6320DIM Machine$(4),Machine%(4),MachineSprite$(4) 6330 6340imagefile%=FALSE 6350disable_reset=FALSE 6360default_machine%=0 6370 6380Machine$(0)="BBC B" : MachineSprite$(0)="OS�1.2" 6390Machine$(1)="Master 128" : MachineSprite$(1)="OS�3.2" 6400Machine$(2)=" MOS 3.5" : MachineSprite$(2)="OS�3.5" 6410Machine$(3)="Compact" : MachineSprite$(3)="OS�5.1" 6420Machine$(4)="Electron" : MachineSprite$(4)="OS�1.0" 6430 6440Q=OPENIN"<6502Em$RomPath>Electron" 6450IF Q<>0 THEN CLOSE#Q:Machine%(4)=TRUE ELSE Machine%(4)=FALSE 6460 6470Q=OPENIN"<6502Em$RomPath>OS1,2" 6480IF Q<>0 THEN CLOSE#Q:Machine%(0)=TRUE ELSE Machine%(0)=FALSE 6490IF Machine%(0)=FALSE THEN default_machine%=1 6500 6510Q=OPENIN"<6502Em$RomPath>M128.OS3,2" 6520IF Q<>0 THEN CLOSE#Q : Machine%(1)=TRUE ELSE Machine%(1)=FALSE 6530IF Machine%(0)=FALSE AND Machine%(1)=FALSE THEN default_machine%=2 6540 6550Q=OPENIN"<6502Em$RomPath>M128.OS3,5" 6560IF Q<>0 THEN CLOSE#Q : Machine%(2)=TRUE ELSE Machine%(2)=FALSE 6570IF Machine%(0)=FALSE AND Machine%(1)=FALSE AND Machine%(2)=FALSE THEN default_machine%=3 6580 6590Q=OPENIN"<6502Em$RomPath>Compact.OS5,1" 6600IF Q<>0 THEN CLOSE#Q : Machine%(3)=TRUE ELSE Machine%(3)=FALSE 6610IF Machine%(0)=FALSE AND Machine%(1)=FALSE AND Machine%(2)=FALSE AND Machine%(3)=FALSE THEN ERROR 0,"No ROMs found - please run !Rip65Host" 6620 6630REMQ=OPENIN"<6502Em$Dir>.Code" 6640REML%=EXT#Q 6650REMCLOSE#Q 6660REMDIM code L%+3000 6670REMDIM roms 17*16*1024 6680 6690DIM cmos%(63) : PROCloadCMOS 6700DIM eeprom%(255) : PROCloadEEPROM 6710REMWHILE (code AND 15)<>0 : code+=1 : ENDWHILE 6720 6730indexfile$="":index%=0:newindex%=-1 6740 6750REM!buffer=0 6760REMSYS "OS_ReadVarVal","6502Em$SaveScreen",buffer,255 TO ,S$ 6770REMIF LEFT$(S$,3)="Yes" THEN 6780REMDIM sprite 80*1024+300 6790REMsprite!0=80*1024+256 6800REMsprite!8=16 6810REMSYS "OS_SpriteOp",256+9,sprite 6820REMsave_sprite=FALSE 6830REMELSE 6840REMsprite=0 6850REMsave_sprite=FALSE 6860REMENDIF 6870 6880PROCreadCSD 6890FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ 6900 6910PROCassemble 6920PROCload_options 6930REMOSCLI"LOAD <6502Em$Dir>.Code "+STR$~code 6940REMCALL code+!init_addr 6950REMPROCnewmachine 6960 6970 6980IF file_xxx THEN OSCLI"IconSprites <6502Em$Res>.file_xxx" 6990 7000 7010 7020REMmemory?&F1B1=3 : REM OSFSC 7030REMmemory?&FFCE=3 : REM OSFIND 7040REMmemory?&FFD1=3 : REM OSGBPB 7050REMmemory?&FFD4=3 : REM OSBPUT 7060REMmemory?&FFD7=3 : REM OSBGET 7070REMmemory?&FFDA=3 : REM OSARGS 7080REMmemory?&FFDD=3 : REM OSFILE 7090 7100REMmemory?&FFF1=3 : REM OSWORD 7110REMmemory?&FFE0=&23 : REM OSRDCH 7120 7130*FX229,1 7140 7150 7160patch%=0:REMPROCreset(1) 7170 7180REMmemory?&FFF7=3 : REM OSCLI 7190REMmemory?&DF89=3 : REM OSCLI 7200REMmemory?&EF02=3 :REM KEYV 7210REMmemory?&FFF4=&13 : REM OSBYTE 7220REMmemory?&FFE0=&23 : REM OSRDCH 7230REMmemory?&FFCB=&23 7240ENDPROC 7250 7260DEFPROCSRRAM 7270?(ROMRAM+socket%)=0 7280socket%=(socket%-1) AND 15 7290ENDPROC 7300 7310DEFPROCkillROM(S%) 7320LOCALI% 7330?(ROMRAM+S%)=2 : REM empty 7340FOR I%=0 TO 255 STEP 16 7350I%!(roms+romsize%*S%)=0 7360NEXT 7370ENDPROC 7380 7390DEFPROCloadROM(R$,R%) 7400LOCALQ% 7410IF machine%=4 AND (socket%=9 OR socket%=8) THEN socket%=7 7420S%=socket% 7430socket%=(socket%-1) AND 15 7440SYS "OS_Find",&4E,R$,"6502Em$ROMPath" TO Q% 7450SYS "OS_GBPB",3,Q%,roms+romsize%*S%,&4000 7460CLOSE#Q% 7470?(ROMRAM+S%)=R% 7480ENDPROC 7490 7500DEFPROCinitROMs 7510LOCAL S% 7520FOR S%=0 TO 15 7530?(ROMRAM+S%)=2 : REM 0=RAM 7540 REM 1=ROM 7550 REM 2=empty 7560NEXT 7570ENDPROC 7580 7590DEFFNROMname(S%) 7600IF ?(ROMRAM+S%)=2 THEN ="Empty" 7610LOCALN$,I% 7620I%=roms?(romsize%*S%+7) 7630IF FNvalidROM(S%) THEN 7640FORI%=0 TO 11 7650N$=N$+CHR$roms?(romsize%*S%+&9+I%) 7660IF roms?(romsize%*S%+&B)=0 THEN I%=11 7670NEXT 7680ELSE 7690N$="RAM "+STR$~S% 7700ENDIF 7710=N$ 7720 7730DEFFNvalidROM(S%) 7740LOCALI% 7750I%=roms?(romsize%*S%+7) 7760IF roms?(romsize%*S%+I%+1)=&28 AND roms?(romsize%*S%+I%+2)=&43 AND roms?(romsize%*S%+I%+3)=&29 THEN =TRUE ELSE =FALSE 7770=0 7780DEFPROCreset(A%) 7790IF disable_reset THEN ENDPROC 7800 7810IF A%>=2 THEN PROCclearmem(memory,memory+&8000) 7820 7830IF A%>=1 THEN 7840?ier=&80 : REM ier 7850?ier2=&80 : REM ier2 7860?Eifr=%10 7870?Eier=%0 7880?Elatch=0 7890!T1R=&F0<<24 7900!T2R=&F0<<24 7910!T3R=&F0<<24 7920!T4R=&F0<<24 7930OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 7940ENDIF 7950?fe10=&22 : REM motor off etc 7960sheila!&C0=&7070B7AB 7970 7980PROCsetmemmap 7990?ACCCON=0 8000PROCsetmemmap2 8010 8020REMIF patch%=0 THEN Palette%=TRUE 8030 8040?f=%100 8050 8060REMmemory?&FE40=0 8070REMmemory?&FE60=0 8080 8090sheila?&20=2 : REM teletext 8100 8110REMmemory?&E0A4=3 : REM where OSWRCH goes to 8120REMmemory?&E7EB=3 : REM where OSWORD goes to 8130 8140REMmemory?&E98F=10 : REM default repeat delay (OS1.2) 8150 8160REMmemory?&FE4E=&0 : REM force power on reset 8170REMmemory?&FE6E=&0 8180 8190REMmemory?ier=0 : REM force power on reset 8200REMmemory?ier2=0 8210 8220REMmemory?&28E=&80 : REM 32K 8230REMmemory?&DA2F=&EA 8240REMmemory?&DA30=&EA 8250REMmemory?&355=7 8260 8270REM!pc_store=&8000 << 16 : !a=1 << 24 8280REM!pc_store=&D9CD << 16 8290REM!pc_store=&47B1 << 16 8300!pc_store=(memory?&FFFC + (memory?&FFFD << 8)) << 16 8310REM!pc_store=(FNpeek(&FFFC) + (FNpeek(&FFFD) << 8)) << 16 8320ENDPROC 8330 8340DEFPROCBBC 8350LOCAL ERROR 8360 8370SYS "XOS_SWINumberFromString",,"ImageDFS_Version" TO ; F 8380IF (F AND 1)=0 THEN dfssupport=TRUE ELSE dfssupport=FALSE 8390 8400IF dfssupport SYS "ImageDFS_EnteringEmulator" 8410 8420 8430*FX9 8440wimp_mode=MODE 8450REMSYS "6502_ReInit" 8460?lastmode=255 8470SYS "Hourglass_Smash" 8480REM Assign sound channels & start note 8490PROCsound_setup 8500SYS "6502_InstallExitHandler",wimp_mode 8510 8520ONERROR LOCAL PROCerr2(wimp_mode) 8530 8540!patch_on=((machine%<>4) AND (patch%>0) AND %1) + (joystick% AND %10) + (Cursor% AND %100) + (scroll_hack% AND %1000) + (NOTsound_on% AND %10000) 8550 8560!speed_loc=speed*2000000/5000 8570 8580VDU23,16,1,254| : REM NOSCROLL 8590SYS "OS_Byte",202,0,255 TO ,FX202 8600SYS "OS_Byte",247,0,255 TO ,FX247 8610SYS "OS_Byte",247,255,0 8620 8630SYS "OS_Byte",106,&81 : REM unlink pointer, shape 1 8640MOUSE COLOUR 3,255,255,255 8650 8660SYS "OS_Byte",202,memory?&25A AND %10000,%11101111 8670SYS "OS_Byte",118 8680 8690hand%=OPENINtapefile$ 8700?tape_handle=hand% 8710 8720REPEAT 8730 8740IF newindex%>=0 index%=newindex% 8750IF OSRDCH% THEN PROCpoke(&FFE0,OSRDCH_loc) ELSE PROCpoke(&FFE0,&23) 8760?ROMSEL=1+ROMSEL% 8770?Palette=1+Palette% 8780REM?cursor_on=1+Cursor% 8790PROCsetmemmap 8800A%=roms 8810D%=memory : REM R3 8820SYS &600FA,0 : REM Wimp_SetWatchdogState Off 8830b%=USR(code+!start_offset) 8840SYS &600FA,1 : REM Wimp_SetWatchdogState On 8850PROCsetmemmap2 8860*FX15 8870REMPRINTb%:VDU7:Q=GET 8880CASE b% OF 8890WHEN 11 8900IF INKEY-2 THEN 8910IF hand%<>0 THEN PTR#hand%=FNmax(0,PTR#hand%-350) 8920ELSE 8930IF INKEY-1 THEN volume%+=5 ELSE volume%-=5 8940IF volume%>127 THEN volume%=127 8950IF volume%<0 THEN volume%=0 8960PROCsound_restore:PROCsound_setup 8970ENDIF 8980 8990WHEN 10 : CLS:?lastmode=255:REMSYS "6502_ReInit":REMmemory?&EC=&E2 9000WHEN 66 : PRINT~!pc_store:Q=GET 9010WHEN 15 9020IF INKEY-3 THEN PROCreset(2) ELSE PROCreset(0) 9030 9040WHEN 3 9050REMPRINT "*****";~!pc_store >>> 16 : PRINT'a?3,y?3 : REPEATQ=GET:UNTILQ=48 9060REMOSCLI"SAVE RAM:$.Memory "+STR$~memory+" +10000 0 0" 9070IF FNpeek(!pc_store >>> 16)=3 AND (!pc_store >>> 16)<&C000 THEN 9080REMIF memory?((!pc_store >>> 16)+1)<&80 THEN PRINT"LL"memory?((!pc_store >>> 16)+1) : Q=GET 9090REMPRINT TAB(0,0);~FNpeek((!pc_store >>> 16)+1);" ";:REMQ=GET 9100CASE FNpeek((!pc_store >>> 16)+1) OF 9110WHEN 0 : PROCosfsc 9120WHEN 1 : PROCosfind 9130WHEN 2 : PROCosgbpb 9140WHEN 3 : PROCosbput 9150WHEN 4 : PROCosbget 9160WHEN 5 : PROCosargs 9170WHEN 6 : PROCosfile 9180WHEN &40 : PROCosword2 9190WHEN &41 : PROCosbyte2 9200WHEN &80 : PROCreadCMOS 9210WHEN &81 : PROCwriteCMOS 9220WHEN &82 : PROCreadEEPROM 9230WHEN &83 : PROCwriteEEPROM 9240WHEN &D0 : PROCsrload 9250WHEN &D1 : PROCsrwrite 9260WHEN &D2 : PROCdrive 9270WHEN &D3 : PROCboot 9280WHEN &D5 : PROCback : a?3=0 : PROCrts 9290WHEN &D6 : PROCmount 9300WHEN &FF : b%=12 : PROCrts : REM *Quit 9310ENDCASE 9320ELSE 9330CASE (!pc_store >>> 16) OF 9340WHEN &FFF1,&E7EB : PROCosword2 9350WHEN &FFE0 : PROCosrdch 9360WHEN &FFD7 : PROCosbget 9370WHEN &FFD4 : PROCosbput 9380WHEN &FFDD : PROCosfile 9390WHEN &FFDA : PROCosargs 9400WHEN &FFD1 : PROCosgbpb 9410WHEN &FFCE : PROCosfind :REM Open or close a file for byte access 9420WHEN &F1B1,&F0E8 : PROCosfsc 9430ENDCASE 9440 9450ENDIF 9460 9470WHEN 7 9480cb=(y?3)<<8 9490cb+=x?3 9500cb+=memory 9510FOR I%=0 TO 7 9520R%(I%)=cb!(9+I%*4) 9530IF (cb?4 AND (1<<I%)) <> 0 THEN R%(I%)=FNaddr(R%(I%)) 9540NEXT 9550swi%=cb?0 9560swi%+=(cb?1)<<8 9570swi%+=(cb?2)<<16 9580 9590REMIF swi%=&61140 THEN 9600REMbase=cb!9 9610REMPRINT"GGG";~memory?(base+6);"GGG":Q=GET 9620REMENDIF 9630 9640REMSYS "OS_SWINumberToString",swi%,buffer,255 TO ,swi$ 9650REMPRINT"Opcode 7 ";~swi%:Q=GET 9660IF dfssupport THEN 9670 9680CASE swi% OF 9690 9700WHEN &61140 : REM"XPRESDFS_FDCOperation" 9710base=cb!9 9720 CASE memory?base OF 9730 WHEN 0,1,2,3 9740 WHEN &21 : memory?base=0 9750 WHEN &4B : memory?base=1 9760 WHEN &E0 : memory?base=2 9770 WHEN &EA : memory?base=3 9780 OTHERWISE 9790 PRINT"Drive ";memory?base;" " 9800 ENDCASE 9810IF memory?(base+6)=&80 THEN memory?(base+6)=&53 9820IF memory?(base+6)=&A0 THEN memory?(base+6)=&4B 9830REMPRINT"FDCOp ";memory?(base+6);" " 9840IF memory?(base+11)<>0 THEN memory?(base+9)=memory?(base+9)+1 9850memory?(base+9)=(memory?(base+9) AND %11111) OR 32 9860IF memory?(base+6)<>&81 THEN SYS "XImageDFS_OSWORD7F",,base MOD 256,base DIV 256,memory TO R%(0) ; F 9870 9880WHEN &61141 : REM "XPRESDFS_ReadFDCStatus" 9890 9900WHEN &61142 : REM "XPRESDFS_SetDFSdrives" 9910REMPRINT~R%(0),~R%(1) 9920REMSYS "DFS_RISCOSToBBCDrive",R%(0),R%(1) 9930 9940WHEN &61143 : REM "XPRESDFS_SetDFSStep" 9950REM R%(0)=40 or 80 for *STEP40, *STEP80 9960 9970OTHERWISE 9980SYS (swi% OR 2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) TO R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) ; F 9990 10000ENDCASE 10010 10020ELSE 10030SYS (swi% OR 2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) TO R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) ; F 10040ENDIF 10050 10060IF cb?3<>0 THEN 10070FOR I%=0 TO cb?3-1 10080IF (cb?5 AND (1<<I%)) <> 0 THEN R%(I%)=R%(I%)-memory 10090cb!(9+I%*4)=R%(I%) 10100NEXT 10110ENDIF 10120 10130 10140 10150IF (F AND 1)<>0 AND (swi% AND 2^17)=0 THEN 10160A%=R%(0) 10170PROCswi_error 10180ELSE 10190 10200IF (F AND 1)<>0 AND cb?8<>0 THEN 10210err=cb?6 10220err+=(cb?7)<<8 10230err+=memory 10240J%=FALSE 10250err?0=0 10260FOR I%=0 TO cb?8-2 10270err?(I%+1)=R%(0)?I% 10280IF err?I%=0 THEN J%=TRUE 10290NEXT 10300IF J%=FALSE THEN err?(cb?8-1)=0 10310ENDIF 10320 10330!pc_store=!pc_store+(1 << 16) 10340?f=?f AND %1100011 10350IF (F AND 1)<>0 THEN ?f=?f OR %01000000 10360IF (F AND 2)<>0 THEN ?f=?f OR %00000001 10370IF (F AND 4)<>0 THEN ?f=?f OR %00000010 10380IF (F AND 8)<>0 THEN ?f=?f OR %10000000 10390 10400ENDIF 10410 10420WHEN 12: 10430 10440 10450OTHERWISE 10460REMPRINT"b% = ";b% : Q=GET 10470 10480ENDCASE 10490 10500UNTILb%=12 10510 10520IF hand%<>0 THEN SYS "XOS_Find",0,hand% : REM CLOSE#hand% 10530 10540SYS "OS_Byte",202,FX202 10550SYS "OS_Byte",247,FX247 10560 10570SYS "OS_Byte",106,1 : REM relink pointer, shape 1 10580 10590*Set Key$11 "<6502Em$Key11>" 10600*Set Key$12 "<6502Em$Key12>" 10610 10620SYS "6502_RemoveExitHandler" 10630 10640REM Restore sound channels 10650PROCsound_restore 10660 10670IF sprite<>0 THEN 10680sprite!0=80*1024+256 10690sprite!8=16 10700SYS "XOS_SpriteOp",256+9,sprite 10710SYS "XOS_SpriteOp",256+16,sprite,"BBCScreen",1,0,0,1279,1023 10720ENDIF 10730 10740SYS "Wimp_SetMode",wimp_mode 10750 10760*FX15,0 10770 10780IF dfssupport SYS "ImageDFS_LeavingEmulator" 10790 10800ENDPROC 10810 10820DEFFNmax(A%,B%) 10830IF A%>B% THEN =A% ELSE =B% 10840=0 10850DEFPROCpullpc 10860sp?3=sp?3+1 10870pc_store?2=?(memory+&100+sp?3) 10880sp?3=sp?3+1 10890pc_store?3=?(memory+&100+sp?3) 10900ENDPROC 10910 10920DEFPROCassemble 10930a=memory-&100+0 10940a=memory-&100+0 10950x=memory-&100+4 10960y=memory-&100+8 10970f=memory-&100+12 10980sp=memory-&100+16 10990pc_store=memory-&100+20 11000T1R=memory-&100+32 11010T2R=memory-&100+40 11020T3R=memory-&100+48 11030T4R=memory-&100+56 11040screenR=memory-&100+64 11050ifr=memory-&100+76 11060ier=memory-&100+77 11070ifr2=memory-&100+78 11080ier2=memory-&100+79 11090rom=memory-&100+96 11100 11110ROMSEL=memory-&100+92 11120romsel=memory-&100+96 11130Palette=memory-&100+164 11140ROMRAM=memory-&100+100 11150patch_on=memory-&100+176:!patch_on=0 11160lastmode=memory-&100+178 11170fe10=memory-&100+179 11180tape_handle=memory-&100+117 11190tape_count=memory-&100+180 11200ACCCON=memory-&100+172 11210Elatch=memory-&100+188 11220Eifr=memory-&100+189 11230Eier=memory-&100+190 11240ROMint=memory-&100+191 11250speed_loc=memory-&100+196 11260 11270P%=code 11280[OPT2 11290.Oa 11300EQUD 0 11310.Ox 11320EQUD 0 11330.Oy 11340EQUD 0 11350.Of 11360EQUD 0 11370.Osp 11380EQUD 0 11390.Opc_store 11400EQUD 0 11410.start_offset 11420EQUD 0 11430.trace 11440EQUD 0 11450.trace2 11460EQUD 0 11470.init_addr 11480EQUD 0 11490.crt_addr 11500EQUD 0 11510.T1_addr 11520EQUD 0 11530.ifr_addr 11540EQUD 0 11550.column_counter_addr 11560EQUD 0 11570.ROMSEL_addr 11580EQUD 0 11590.Palette_addr 11600EQUD 0 11610.speed_addr 11620EQUD 0 11630.elite_addr 11640EQUD 0 11650.opco_addr EQUD 0 11660.bcd_addr EQUD 0 11670.sheila_writetab_addr EQUD 0 11680.sheila_readtab_addr EQUD 0 11690.sound_vectors_addr EQUD 0 11700.patch_addr EQUD 0 11710] 11720ENDPROC 11730 11740DEFPROCrts 11750sp?3=sp?3+1 11760pc_store?2=memory?(&100+sp?3) 11770sp?3=sp?3+1 11780pc_store?3=memory?(&100+sp?3) 11790!pc_store=!pc_store+(1 << 16) 11800REMPRINT~!pc_store:Q=GET 11810ENDPROC 11820!pc_store=&8004 << 16 : REM RTS 11830 11840REMpc_store?2=?(sp?3+&101+memory) 11850REMpc_store?3=?(sp?3+&102+memory) 11860REMsp?3=sp?3 + 2 11870ENDPROC 11880 11890DEFPROCosfile 11900REMPRINT"OSFILE "a?3:Q=GET 11910addr=memory+x?3+(y?3)*256 11920CASE a?3 OF 11930WHEN 0 11940a%=a?3 11950b$=FNaddpath($(FNaddr(addr!0 AND &FFFF))) 11960c%=addr!2 11970d%=addr!6 11980e%=FNaddr((addr!10 AND &FFFF)) 11990f%=FNaddr((addr!14 AND &FFFF)) 12000REMPRINT~a%,b$,~c%,~d%,e%,~f% 12010SYS "XOS_File",a%,b$,c%,d%,e%,f% TO A% ; F 12020IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 12030WHEN 5 12040b$=$(FNaddr(addr!0 AND &FFFF)) 12050SYS "XOS_File",13,FNadd_(b$),,,FN_path(b$) TO A%,,c%,d%,e%,f% ; F 12060IF (F AND 1)=1 THEN 12070PROCswi_error 12080ELSE 12090a?3=A% 12100addr!2=c% 12110addr!6=d% 12120addr!10=e% 12130addr!14=f% 12140PROCrts 12150ENDIF 12160WHEN 6 12170b$=$(FNaddr(addr!0 AND &FFFF)) 12180SYS "XOS_File",6,FNaddpath(b$) TO A%,,c%,d%,e%,f% ; F 12190IF (F AND 1)=1 THEN 12200PROCswi_error 12210ELSE 12220a?3=A% 12230addr!2=c% 12240addr!6=d% 12250addr!10=e% 12260addr!14=f% 12270PROCrts 12280ENDIF 12290 12300WHEN 255 12310a%=a?3 12320b$=$(FNaddr(addr!0 AND &FFFF)) 12330REMB%=(addr!0 AND &FFFF)+memory 12340c%=FNaddr(addr!2 AND &FFFF) 12350IF (addr!2 AND &FFFF0000)=&FFFE0000 THEN c%-=&13000 12360d%=addr?6 12370IF d%<>0 THEN SYS "XOS_File",13,FNadd_(b$),,,FN_path(b$) TO ,,c%: d%=0 : c%=FNaddr(c% AND &FFFF) 12380SYS "XOS_File",13,FNadd_(b$),,,FN_path(b$) TO ,,,,length% 12390IF c%+length%>memory+&8000 AND c%<memory+&8000 THEN 12400length%=memory+&7FFF-c% 12410SYS "XOS_Find",&4D,FNadd_(b$),FN_path(b$) TO A% ; F 12420IF (F AND 1)=0 THEN SYS "XOS_GBPB",4,A%,c%,length%:SYS "XOS_Find",0,A%:PROCrts ELSE PROCswi_error 12430ELSE 12440SYS "XOS_File",12,FNadd_(b$),c%,0,FN_path(b$) TO A%,,c%,d%,e%,f% ; F 12450a?3=A% 12460addr!2=c% 12470addr!6=d% 12480addr!10=e% 12490addr!14=f% 12500IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 12510ENDIF 12520REMPRINT~a%,b$,~c%,~d%,~memory : Q=GET 12530REMSYS "XOS_File",12,FNadd_(b$),c%,0,FN_path(b$) TO A%,,c%,d%,e%,f% ; F 12540a?3=1 12550REMa?3=A% 12560REMaddr!2=c% 12570REMaddr!6=d% 12580REMaddr!10=e% 12590REMaddr!14=f% 12600REMIF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 12610REMPRINT~!pc_store : Q=GET 12620OTHERWISE 12630PRINT"OSFILE ";a?3 : Q=GET 12640ENDCASE 12650ENDPROC 12660 12670DEFPROCswi_error 12680LOCALA$ 12690A$="" 12700FOR I%=0 TO 253 12710REMIF A%?I%=0 THEN I%=260 ELSE A$=A$+CHR$(A%?I%):PRINTA$ 12720memory?(&102+I%)=A%?(I%+4) 12730IF A%?(I%+4)=0 THEN I%=253 12740NEXT 12750REMA$=A$+CHR$13 12760memory?&100=0 12770memory?&101=?A% 12780REM$(memory+&102)=A$ 12790!pc_store=&100 << 16 12800ENDPROC 12810 12820DEFPROCbrk(A%,A$) 12830A$=A$+CHR$0 12840FOR I%=0 TO LENA$-1 12850memory?(&102+I%)=ASCMID$(A$,I%+1,1) 12860NEXT 12870memory?&100=0 12880memory?&101=A% 12890!pc_store=&100 << 16 12900ENDPROC 12910 12920DEFFNmin(A%,B%) IF A%<B% THEN =A% ELSE =B% 12930=0 12940 12950DEFPROCosgbpb 12960REMPRINT"OSGBPB";a?3 : Q=GET 12970addr%=memory+x?3+(y?3 << 8) 12980b%=?addr% 12990c%=addr%!1 13000d%=addr%!5 13010e%=addr%!9 13020 13030 13040IF a?3=9 THEN 13050 13060 SYS "XOS_GBPB",a?3,fs$+disc$+path$+subpath$,FNaddr(c% AND &FFFF),b%,e%,d%,0 TO A%,,,d%,e% ; F 13070 IF (F AND 1)=0 THEN 13080 ?addr%=d% 13090 addr%!9=e% 13100 IF (F AND %10)=0 THEN ?f=(?f AND %11111110) ELSE ?f=?f OR 1 13110 PROCrts 13120 ELSE 13130 PROCswi_error 13140 ENDIF 13150 13160ELSE 13170 13180 SYS "OS_FSControl",11,fs$ : REM set temporary filing system 13190 SYS "OS_FSControl",0,disc$+path$+subpath$ : REM change dir 13200 13210 IF (a?3=3 OR a?3=4) AND c%<&8000 AND c%+e%>&8000 THEN e%=&8000-c% : REM stop overflow at &8000 13220 13230 SYS "XOS_GBPB",a?3,b%,FNaddr(c% AND &FFFF),d%,e% TO A%,,c%,d%,e% ; F 13240 13250 SYS "OS_FSControl",19 13260 13270 IF (F AND 1)=0 THEN 13280 addr%!1=c%-memory 13290 addr%!5=d% 13300 addr%!9=e% 13310 IF (F AND %10)=0 THEN ?f=(?f AND %11111110) ELSE ?f=?f OR 1 13320 PROCrts 13330 ELSE 13340 PROCswi_error 13350 ENDIF 13360 13370ENDIF 13380ENDPROC 13390 13400DEFPROCosargs 13410CASE a?3 OF 13420WHEN 0 : 13430IF y?3<>0 THEN 13440SYS "XOS_Args",a?3,y?3 TO A%,,L% ; F 13450IF (F AND 1)=0 THEN memory!(x?3)=L%:PROCrts ELSE PROCswi_error 13460ELSE 13470a?3=4 : PROCrts 13480ENDIF 13490WHEN 1 : 13500SYS "XOS_Args",a?3,y?3,memory!(x?3) TO A% ; F 13510IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 13520WHEN 2 : 13530SYS "XOS_Args",a?3,y?3 TO A%,,L% ; F 13540IF (F AND 1)=0 THEN memory!(x?3)=L%:PROCrts ELSE PROCswi_error 13550WHEN 255 : 13560SYS "XOS_Args",a?3,y?3 TO A% ; F 13570IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 13580OTHERWISE : PROCrts 13590ENDCASE 13600ENDPROC 13610 13620DEFFNupper(A$) 13630LOCALI%,B$ 13640FORI%=1 TO LENA$ 13650IF MID$(A$,I%,1)>="a" AND MID$(A$,I%,1)<="z" THEN B$=B$+CHR$(ASCMID$(A$,I%,1)-32) ELSE B$=B$+MID$(A$,I%,1) 13660NEXT 13670=B$ 13680 13690DEFPROCquit 13700ONERROR OFF 13710SYS "X6502_DeRegister" TO A% 13720IF A%=0 THEN SYS "XOS_Module",4,"6502Support" 13730SYS "Wimp_CloseDown" 13740END 13750ENDPROC 13760 13770DEFPROCsnap_save(F$) 13780IF INSTR(F$,".")=0 AND INSTR(F$,":")=0 AND LEFT$(F$,6)<>"<Wimp$" THEN SYS "Wimp_ReportError"," To save, drag the file icon to a directory viewer":ENDPROC 13790LOCALQ,I% 13800 13810length%=&10200-&8000 13820!buffer=xfer%:buffer!4=4 13830SYS "Wimp_GetIconState",,buffer 13840IF (buffer!24 AND 2^21)<>0 THEN length%=&10200-&4000 13850!buffer=xfer%:buffer!4=5 13860SYS "Wimp_GetIconState",,buffer 13870IF (buffer!24 AND 2^21)<>0 THEN length%=&10200 13880 13890Q=OPENOUTF$ 13900BPUT#Q,"BBC Snapshot101" 13910SYS "OS_GBPB",2,Q,memory-&200,length% 13920CLOSE#Q 13930OSCLI"SetType "+F$+" "+STR$~filetype% 13940ENDPROC 13950 13960DEFPROCsnap_load(file$) 13970LOCAL file%,I%,ok%,machine$,M%,patch$ 13980file%=OPENIN(file$) 13990type$=GET$#file% 14000IF EXT#file%=0 THEN type$="BBC Script" 14010IF LEFT$(type$,64)=STRING$(48,CHR$0)+"!BBC tape file!"+CHR$0 THEN type$="BBC Tapefile" 14020 14030CASE type$ OF 14040 14050WHEN "BBC Tapefile" 14060 14070CLOSE#file% 14080tapefile$=file$ 14090 14100WHEN "BBC Script" 14110 14120LOCAL ERROR 14130 14140ON ERROR LOCAL : RESTORE ERROR : SYS "XWimp_ReportError"," Error in script: "+REPORT$,3,"6502Em" TO ,A%:IF A%=2 THEN PROCquit ELSE PROCpoll 14150 14160scroll_hack%=FALSE 14170 14180 14190 IF EOF#file% THEN 14200 A$="" 14210 ELSE 14220 A$=FNupper(GET$#file%) 14230 ENDIF 14240 REPEAT 14250 B$=LEFT$(A$,INSTR(A$," ")-1) 14260 ok%=TRUE 14270 CASE B$ OF 14280 WHEN "PALETTE" 14290 IF INSTR(A$,"ON") THEN Palette%=TRUE ELSE Palette%=FALSE 14300 WHEN "CURSOR" 14310 IF INSTR(A$,"ON") THEN Cursor%=TRUE ELSE Cursor%=FALSE 14320 WHEN "EXACTSPEED" 14330 IF INSTR(A$,"ON") THEN PROCnewspeed(100) ELSE PROCnewspeed(10000) 14340 WHEN "SOUND" 14350 IF INSTR(A$,"ON") THEN sound_on%=TRUE ELSE sound_on%=FALSE 14360 WHEN "DISABLETAPE" 14370 PROCdisableCFS 14380 WHEN "SCROLLHACK" 14390 scroll_hack%=TRUE 14400 WHEN "KEYMAP" 14410 K$=RIGHT$(A$,LENA$-INSTR(A$," ")) 14420 PROCsetkeymap(K$) 14430 WHEN "PATCH" 14440 IF patches%<>0 THEN 14450 patch%=0 14460 FORI%=1 TO patches% 14470 patch$=RIGHT$(A$,LENpatch$(I%)) 14480 PROCstrip(patch$) 14490 IF FNupper(patch$(I%))=patch$ THEN 14500 patch%=I% 14510 PROCloadpatch 14520 ENDIF 14530 NEXT 14540 ENDIF 14550 WHEN "SPEED" 14560 PROCnewspeed(VALRIGHT$(A$,LENA$-6)) 14570 WHEN "INDEXFILE" 14580 T$=RIGHT$(A$,LENA$-10) 14590 T%=OPENIN(FNleaf(file$)+"."+T$) 14600 IF T%<>0 THEN CLOSE#T%:indexfile$=FNleaf(file$)+"."+T$:index%=0 ELSE ERROR 1,"Index File "+T$+" not found" 14610 WHEN "TAPEFILE" 14620 T$=RIGHT$(A$,LENA$-9) 14630 T%=OPENIN(FNleaf(file$)+"."+T$) 14640 IF T%<>0 THEN CLOSE#T%:tapefile$=FNleaf(file$)+"."+T$ ELSE ERROR 1,"Tape File "+T$+" not found" 14650 WHEN "LOADROM" 14660 L$=RIGHT$(A$,LENA$-8) 14670 IF INSTR(L$,":")=0 THEN 14680 PROCloadROM(FNleaf(file$)+"."+L$,1) 14690 ELSE 14700 PROCloadROM(L$,1) 14710 ENDIF 14720 WHEN "LOADRAM" 14730 L$=RIGHT$(A$,LENA$-8) 14740 IF INSTR(L$,":")=0 THEN 14750 PROCloadROM(FNleaf(file$)+"."+L$,0) 14760 ELSE 14770 PROCloadROM(L$,1) 14780 ENDIF 14790 WHEN "KILLROM" 14800 L$=RIGHT$(A$,LENA$-8) 14810 FOR I%=0 TO 15 14820 IF LEFT$(FNupper(FNROMname(I%)),LENL$)=L$ THEN PROCkillROM(I%) 14830 NEXT 14840 WHEN "MACHINE" 14850 machine$=RIGHT$(A$,LENA$-8) 14860 PROCstrip(machine$) 14870 CASE machine$ OF 14880 WHEN "BBC","BBCB","BBC B" 14890 M%=0 14900 WHEN "MASTER","MASTER128","MASTER 128" 14910 M%=1 14920 WHEN "OS3.5","OS 3.5","OS3,5","OS 3.5" 14930 M%=2 14940 WHEN "COMPACT","MASTER COMPACT" 14950 M%=3 14960 WHEN "ELECTRON","ELK" 14970 M%=4 14980 OTHERWISE 14990 CLOSE#file%:ERROR 1,"Unknown machine '"+machine$+"'" 15000 ENDCASE 15010 IF M%<>machine% THEN machine%=M%:PROCnewmachine 15020 OTHERWISE 15030 ok%=FALSE 15040 ENDCASE 15050 IF ok% THEN 15060 IF EOF#file% THEN 15070 A$="" 15080 ELSE 15090 A$=FNupper(GET$#file%) 15100 ENDIF 15110 ENDIF 15120 UNTIL FNi("PATCH") AND FNi("PALETTE") AND FNi("MACHINE") AND FNi("INDEXFILE") AND FNi("TAPEFILE") AND FNi("KEYMAP") AND FNi("CURSOR") AND FNi("EXACTSPEED") AND FNi("DISABLETAPE") AND FNi("LOADROM") AND FNi("LOADRAM") AND FNi("KILLROM") AND FNi("SOUND") AND FNi("SCROLLHACK") AND FNi("SPEED") 15130 15140 CLOSE#file% 15150 IF A$="" THEN 15160 A$=FNleaf(file$) 15170 PROCfile_load(A$+"."+RIGHT$(A$,LENA$-LENFNleaf(A$)-2)) 15180 ELSE 15190 IF LEFT$(A$,5)="CHAIN" OR LEFT$(A$,1)="*" OR INSTR(A$," ")>0 THEN 15200 osrdch$=A$+CHR$13 15210 PROCreset(2) 15220 osrdch_count%=0 15230 OSRDCH_loc_tmp=OSRDCH_loc 15240 OSRDCH_loc=3 15250 PROCnewpath(FNleaf(file$)+".JUNK") 15260 ELSE 15270 PROCfile_load(FNleaf(file$)+"."+A$) 15280 ENDIF 15290 ENDIF 15300WHEN "BBC Snapshot " : 15310 IF EXT#file%=&10110 THEN 15320 SYS "OS_GBPB",4,file%,memory-&100,&10100 15330 PTR#file%=&10110-&200 15340 SYS "OS_GBPB",4,file%,sheila,&100 15350 ELSE 15360 SYS "OS_GBPB",4,file%,memory-&100,EXT#file%-&110 15370 SYS "OS_GBPB",4,file%,sheila,&100 15380 ENDIF 15390 CLOSE#file% 15400WHEN "BBC Snapshot101" : 15410 SYS "OS_GBPB",4,file%,memory-&200,EXT#file%-&10 15420 CLOSE#file% 15430OTHERWISE : REM BBC ROM 15440 CLOSE#file% 15450 PROCloadROM(A$,1) 15460ENDCASE 15470ENDPROC 15480 15490DEFFNi(B$) 15500IF INSTR(A$,B$)=0 THEN =TRUE ELSE =FALSE 15510=0 15520DEFPROCfile_load(F$) 15530imagefile%=FALSE 15540PROCnewpath(F$) 15550REMOSCLI"DIR "+FNleaf(F$) 15560FORI%=1 TO LENF$ 15570IF MID$(F$,LENF$-I%,1)="." OR MID$(F$,LENF$-I%,1)=":" THEN L%=I%:I%=LENF$ 15580NEXT 15590A$=RIGHT$(F$,L%) 15600SYS "OS_File",5,F$ TO object%,,load2%,exec2%,length% 15610load%=load2% AND &FFFF 15620exec%=exec2% AND &FFFF 15630IF object%=0 THEN exec%=&FFFF : REM DFSImage but no !Boot 15640osrdch$="*/"+A$+CHR$13 : REM default 15650IF exec%=&801F OR exec%=&8023 OR exec%=&802B OR exec%=&80E7 THEN osrdch$="PAGE=&"+STR$~load%+CHR$13+"CHAIN"+CHR$34+A$+CHR$34+CHR$13 15660IF (load2% AND &FFF00)=&FFB00 THEN osrdch$="CHAIN"+CHR$34+A$+CHR$34+CHR$13 15670IF exec%=&FFFF OR (load2% AND &FFF00)=&FFE00 OR (load2%=0 AND exec2%=0) THEN osrdch$="*EXEC "+A$+CHR$13:IF machine%=0 THEN osrdch$="PAGE=&1900"+CHR$13+"NEW"+CHR$13+osrdch$ 15680PROCreset(2) 15690osrdch_count%=0 15700OSRDCH_loc_tmp=OSRDCH_loc 15710OSRDCH_loc=3 15720ENDPROC 15730 15740DEFPROCosrdch 15750osrdch_count%+=1 15760a?3=ASCMID$(osrdch$,osrdch_count%,1) 15770PROCrts 15780IF osrdch_count%=LENosrdch$ THEN OSRDCH_loc=OSRDCH_loc_tmp : PROCpoke(&FFE0,OSRDCH_loc) 15790ENDPROC 15800 15810DEFFNbinary(B%) 15820LOCALA$,I% 15830FORI%=0 TO 7 15840IF (B% AND 2^I%)=0 THEN A$="0"+A$ ELSE A$="1"+A$ 15850NEXT 15860=A$ 15870 15880DEFPROCnewpath(F$) 15890SYS "OS_GSTrans",F$,buffer,255 TO ,F$ 15900fs$=LEFT$(F$,INSTR(F$,":")) 15910F$=RIGHT$(F$,LENF$-LENfs$) 15920 15930IF LEFT$(F$,1)=":" THEN 15940disc$=LEFT$(F$,INSTR(F$,".")) 15950F$=RIGHT$(F$,LENF$-LENdisc$) 15960ELSE 15970disc$="" 15980ENDIF 15990 16000path$=FNleaf(F$) 16010subpath$="" 16020IF MID$(path$,LENpath$-1,1)="." THEN subpath$=RIGHT$(path$,2):path$=LEFT$(path$,LENpath$-2) 16030ENDPROC 16040 16050DEFFNnumeric(A$) 16060IF A$>="0" AND A$<="9" THEN =TRUE ELSE =FALSE 16070=0 16080DEFFNadd_(F$) 16090IF LEFT$(F$,1)=":" AND FNnumeric(MID$(F$,2,1)) AND MID$(F$,3,1)="." THEN F$=RIGHT$(F$,LENF$-3) 16100IF INSTR(F$,":") THEN =F$ 16110IF LEFT$(F$,1)=CHR$34 AND RIGHT$(F$,1)=CHR$34 THEN F$=MID$(F$,2,LENF$-2) : REM Remove quotes 16120 16130IF (F$="" OR INSTR(F$,"|")) AND indexfile$<>"" THEN 16140Q=OPENINindexfile$ 16150PTR#Q=index% 16160F$=GET$#Q 16170newindex%=PTR#Q 16180IF newindex%=EXT#Q THEN newindex%=0 16190CLOSE#Q 16200ENDIF 16210 16220IF MID$(F$,2,1)="." THEN 16230IF LEFT$(F$,1)="$" THEN =RIGHT$(F$,LENF$-2) 16240=F$ 16250ELSE 16260=F$ 16270ENDIF 16280="" 16290 16300DEFFN_path(F$) 16310IF LEFT$(F$,1)=":" AND FNnumeric(MID$(F$,2,1)) AND MID$(F$,3,1)="." THEN F$=RIGHT$(F$,LENF$-3) 16320IF INSTR(F$,":") THEN ="" 16330IF MID$(F$,2,1)="." THEN 16340=fs$+disc$+path$+"." 16350ELSE 16360=fs$+disc$+path$+subpath$+"." 16370ENDIF 16380="" 16390 16400DEFFNaddpath(F$) 16410IF LEFT$(F$,1)=":" AND FNnumeric(MID$(F$,2,1)) AND MID$(F$,3,1)="." THEN F$=RIGHT$(F$,LENF$-3) 16420IF INSTR(F$,":") THEN =F$ 16430IF LEFT$(F$,1)=CHR$34 AND RIGHT$(F$,1)=CHR$34 THEN F$=MID$(F$,2,LENF$-2) : REM Remove quotes 16440IF MID$(F$,2,1)="." THEN 16450IF LEFT$(F$,1)="$" THEN =path$+"."+RIGHT$(F$,LENF$-2) 16460=fs$+disc$+path$+"."+F$ 16470ELSE 16480=fs$+disc$+path$+subpath$+"."+F$ 16490ENDIF 16500="" 16510 16520DEFFNstrip(F$) 16530LOCALI% 16540REPEATI%+=1:UNTILMID$(F$,I%,1)<>"*" AND MID$(F$,I%,1)<>" " 16550=RIGHT$(F$,LENF$-I%+1) 16560 16570DEFPROCstrip(RETURN s$) 16580WHILE LEFT$(s$,1)=" " 16590 s$=MID$(s$,2) 16600ENDWHILE 16610WHILE RIGHT$(s$,1)=" " 16620 s$=LEFT$(s$,LEN s$-1) 16630ENDWHILE 16640ENDPROC 16650 16660DEFPROCstrip2(RETURN s$) 16670WHILE LEFT$(s$,1)=" " OR LEFT$(s$,1)="*" 16680 s$=MID$(s$,2) 16690ENDWHILE 16700WHILE RIGHT$(s$,1)=" " OR RIGHT$(s$,1)="*" 16710 s$=LEFT$(s$,LEN s$-1) 16720ENDWHILE 16730ENDPROC 16740 16750DEFPROCdir(D$) 16760FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ 16770REMPRINTD$:Q=GET 16780LOCALI% 16790REPEATI%+=1:UNTILMID$(D$,I%,1)<>" " 16800D$=RIGHT$(D$,LEND$-I%+1) 16810IF INSTR(D$," ") THEN 16820D$=LEFT$(D$,INSTR(D$," ")-1) 16830ELSE 16840IF LEND$=4 AND LEFT$(FNupper(D$),3)="DIR" THEN D$=RIGHT$(D$,1) 16850ENDIF 16860 16870IF D$="^" THEN 16880IF subpath$<>"" THEN subpath$="":PROCrts:ENDPROC 16890IF INSTR(path$,".")=0 THEN path$="$":PROCrts:ENDPROC 16900I%=LENpath$ 16910REPEATI%-=1:UNTILMID$(path$,I%,1)="." 16920path$=LEFT$(path$,I%-1) 16930PROCrts:ENDPROC 16940ENDIF 16950 16960IF D$="$" OR LEND$=0 THEN subpath$="":PROCrts:ENDPROC 16970IF LEND$=1 THEN 16980SYS "XOS_File",13,D$,,,fs$+disc$+path$+"." TO A% ; F 16990IF (F AND 1)<>0 THEN PROCswi_error:ENDPROC 17000IF (A% AND 2)=0 AND LEND$=1 THEN subpath$="":PROCrts:ENDPROC : REM no error returned if you try to change to a non-existing single letter directory 17010IF (A% AND 2)=0 THEN PROCbrk(214,"Directory '"+D$+"' not found") ELSE subpath$="."+D$:PROCrts 17020ENDPROC 17030ENDIF 17040 17050IF INSTR(D$,":")>1 THEN 17060IF RIGHT$(D$,1)<>":" THEN SYS "XOS_File",17,D$ TO A% ; F:IF (F AND 1)<>0 THEN PROCswi_error:ENDPROC 17070SYS "OS_FSControl",11,D$ TO ,E$,E% 17080IF E%<>-1 THEN SYS "OS_FSControl",19:fs$=LEFT$(D$,LEND$-LENE$):D$=E$ ELSE PROCbrk(248,"No such filing system"):ENDPROC 17090path$="" 17100subpath$="" 17110disc$="" 17120IF LEFT$(D$,1)<>":" THEN path$="$" 17130ENDIF 17140 17150IF LEFT$(D$,1)=":" THEN 17160I%=0:disc$="" 17170REPEAT I%+=1 17180disc$=disc$+MID$(D$,I%,1) 17190UNTIL MID$(D$,I%+1,1)="." OR I%=LEND$ 17200IF I%=LEND$ THEN D$="" ELSE D$=RIGHT$(D$,LEND$-LENdisc$-1) 17210path$="":subpath$="" 17220ENDIF 17230 17240IF LEFT$(D$,1)="$" AND LEND$>2 THEN path$="$":subpath$="":D$=RIGHT$(D$,LEND$-2) 17250 17260IF disc$<>"" AND RIGHT$(disc$,1)<>"." AND path$<>"" THEN disc$=disc$+"." 17270SYS "XOS_File",13,D$,,,fs$+disc$+path$+subpath$+"." TO A% ; F 17280IF disc$<>"" AND RIGHT$(disc$,1)<>"." THEN disc$=disc$+"." 17290IF (F AND 1)<>0 THEN PROCrestoreCSD:PROCswi_error:ENDPROC 17300IF (A% AND 2)=0 THEN 17310PROCrestoreCSD 17320PROCbrk(214,"Directory '"+D$+"' not found") 17330ELSE 17340IF D$<>"" THEN 17350IF path$<>"" THEN path$=path$+subpath$+"."+D$:subpath$="" ELSE path$=D$ 17360ENDIF 17370PROCrts 17380ENDIF 17390IF path$="" THEN path$="$" 17400ENDPROC 17410 17420DEFPROCback 17430SWAP fs$,FS$ 17440SWAP disc$,DISC$ 17450SWAP path$,PATH$ 17460SWAP subpath$,SUBPATH$ 17470ENDPROC 17480 17490DEFPROCrestoreCSD 17500fs$=FS$:disc$=DISC$:path$=PATH$:subpath$=SUBPATH$ 17510ENDPROC 17520 17530DEFPROCosfsc 17540REMPRINT"OSFSC ";a?3:Q=GET 17550CASE a?3 OF 17560 WHEN 1 : REMx?3=(EOF#x?3) AND &FF 17570 SYS "XOS_Args",5,x?3 TO A%,,x?3 ; F 17580 IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 17590 IF x?3<>0 THEN x?3=&FF 17600 WHEN 3 : addr=FNaddr(x?3+((y?3) << 8)) 17610 b$=FNstrip($addr) 17620 SYS "XOS_Find",&4D,FNadd_(b$),FN_path(b$) TO Q ; F 17630 A%=Q 17640 17650 IF Q=0 OR (F AND 1)<>0 THEN 17660 IF LEFT$(FNupper(b$),4)="DIR " OR (LEFT$(FNupper(b$),3)="DIR" AND LENb$=4) THEN 17670 PROCdir(RIGHT$(b$,LENb$-4)) 17680 ELSE 17690 IF Oscli% THEN 17700 SYS "XOS_CLI",b$ TO A% ; F 17710 IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 17720 ELSE 17730 PROCbrk(254,"Bad Command") 17740 ENDIF 17750 ENDIF 17760 ELSE 17770 CLOSE#Q 17780 b$=FNaddpath(b$) 17790 SYS "OS_File",5,b$ TO ,,c%,d% : c%=FNaddr(c% AND &FFFF) 17800 SYS "OS_File",255,b$,c%,0 17810 !pc_store=d% << 16 17820 ENDIF 17830 WHEN 2,4 : addr=FNaddr(x?3+((y?3) << 8)) 17840 b$=$addr 17850 REMb$=FNaddpath(b$) 17860 SYS "XOS_File",13,FNadd_(b$),,,FN_path(b$) TO A%,,c%,d%,length% ; f% : c%=FNaddr(c% AND &FFFF) 17870 IF c%+length%>memory+&8000 AND c%<memory+&8000 THEN length%=memory+&8000-c% 17880 SYS "XOS_Find",&4D,FNadd_(b$),FN_path(b$) TO A% ; f% 17890 IF (f% AND 1)=0 THEN SYS "XOS_GBPB",4,A%,c%,length%:SYS "XOS_Find",0,A% 17900 REMIF (f% AND 1)=0 THEN SYS "XOS_File",12,FNadd_(b$),c%,0,FN_path(b$) TO A% ; f% 17910 IF (f% AND 1)=0 THEN !pc_store=d% << 16 ELSE PROCswi_error 17920 WHEN 5 : PROCrts:REMOSCLI"CAT":Q=GET:PROCrts 17930 WHEN 0,6,8 : PROCrts 17940 WHEN 9,10,11 : PROCrts : REM *EX, *INFO, *RUN (LibFS) 17950 OTHERWISE PRINT"OSFSC ";a?3 : Q=GET 17960ENDCASE 17970ENDPROC 17980 17990DEFPROCosfind 18000addr=FNaddr(x?3+(y?3)*256) 18010IF a?3=0 THEN 18020SYS "XOS_Find",0,y?3 TO A% ; F 18030A%=0:F=0 : REM fix for Master 128 !?!? 18040ELSE 18050SYS "XOS_Find",(a?3) OR 1,FNadd_($addr),FN_path($addr) TO A% ; F 18060ENDIF 18070IF (F AND 1)=0 THEN a?3=A% : PROCrts ELSE PROCswi_error 18080ENDPROC 18090 18100DEFPROCosbget 18110 SYS "XOS_BGet",a?3,y?3 TO A% ; F% 18120 IF (F AND 1)=0 THEN 18130 a?3=A% 18140 ?f=?f AND %11111110 18150 IF (F% AND 2)<>0 THEN ?f+=1 18160 PROCrts 18170 ELSE 18180 PROCswi_error 18190 ENDIF 18200ENDPROC 18210 18220DEFPROCosbput 18230 SYS "XOS_BPut",a?3,y?3 TO A% ; F 18240 IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 18250ENDPROC 18260 18270DEFPROCsprite_save(F$) 18280IF INSTR(F$,".")=0 AND INSTR(F$,":")=0 AND LEFT$(F$,6)<>"<Wimp$" THEN SYS "Wimp_ReportError"," To save, drag the file icon to a directory viewer":ENDPROC 18290SYS "OS_SpriteOp",256+12,sprite,F$ 18300ENDPROC 18310 18320DEFFNkeymap(A$) 18330LOCALI% 18340FORI%=1 TO keymaps% 18350IF FNupper(keymap$(I%))=FNupper(A$) THEN =I% 18360NEXT 18370=0 18380 18390DEFPROCsetkeymap(A$) 18400LOCALI% 18410KeyMap$="Default" 18420IF FNupper(A$)="RISCPC" OR FNupper(A$)="ARCHIMEDES" THEN 18430A$="Default" 18440ENDIF 18450OSCLI "Set 6502Em$Keymap "+A$ 18460PROCpokeicontext(12,A$) 18470FORI%=1 TO keymaps% 18480IF FNupper(keymap$(I%))=FNupper(A$) THEN KeyMap$=A$:keymap%=I%:I%=1000 18490NEXT 18491PROCreadkeys("<6502Em$Dir>.Keymaps."+KeyMap$) 18500ENDPROC 18510 18520DEFPROCreadkeymaps 18530LOCAL offset%,N% 18540keymap%=0 18550keymaps%=0 18560REPEAT 18570SYS "OS_GBPB",9,"<6502Em$Dir>.Keymaps",q%,100,offset%,&100,0 TO ,,,N%,offset% 18580keymaps%+=N% 18590UNTIL offset%=-1 18600IF keymaps%=0 THEN keysmenu%=-1:ENDPROC 18610DIM keymap$(keymaps%), keysmenu% 32+24*keymaps% 18620offset%=0 18630FOR N%=1 TO keymaps% 18640SYS "OS_GBPB",9,"<6502Em$Dir>.Keymaps",q%,1,offset%,&100,0 TO ,,,,offset% 18650keymap$(N%)=FNstring(q%) 18660NEXT 18670ENDPROC 18680 18690DEFPROCreadspeeds 18700LOCALI% 18710Q=OPENIN"<6502Em$Res>.SpeedMenu" 18720speeds%=-1 18730REPEATspeeds%+=1 18740A$=GET$#Q 18750UNTILEOF#Q OR A$="" 18760IF A$="" THEN speeds%-=1 18770PTR#Q=0 18780DIM speed$(speeds%), speedmenu% 32+24*(speeds%+3) 18790FORI%=0 TO speeds% 18800speed$(I%)=GET$#Q 18810NEXT 18820CLOSE#Q 18830ENDPROC 18840 18850 18860DEFPROCreadpatches 18870LOCAL offset%,N% 18880patch%=0 18890patches%=0 18900REPEAT 18910SYS "OS_GBPB",9,"<6502Em$Dir>.Patches",q%,100,offset%,&100,0 TO ,,,N%,offset% 18920patches%+=N% 18930UNTIL offset%=-1 18940IF patches%=0 THEN patchmenu%=-1:ENDPROC 18950DIM patch$(patches%), patchmenu% 32+24*(patches%+2) 18960offset%=0 18970FOR N%=1 TO patches% 18980SYS "OS_GBPB",9,"<6502Em$Dir>.Patches",q%,1,offset%,&100,0 TO ,,,,offset% 18990patch$(N%)=FNstring(q%) 19000NEXT 19010ENDPROC 19020 19030DEFFNstring(A%) 19040LOCALA$,I% 19050REPEAT 19060A$=A$+CHR$(A%?I%) 19070I%+=1 19080UNTILA%?I%=0 19090=A$ 19100 19110DEFPROCloadpatch 19120OSCLI "Load <6502Em$Dir>.Patches."+patch$(patch%)+" "+STR$~(code+!patch_addr) 19130?patch_on=?patch_on OR 1 19140PROCpokeicontext(14,patch$(patch%)) 19150ENDPROC 19160 19170DEFFNosword14_1(A%) 19180?buffer=1 19190SYS "OS_Word",14,buffer 19200=buffer?A% 19210 19220DEFPROCreadCMOS 19230CASE x?3 AND 63 OF 19240WHEN 0 : y?3=FNosword14_1(6) 19250WHEN 1 : y?3=1 19260WHEN 2 : y?3=FNosword14_1(5) 19270WHEN 3 : y?3=1 19280WHEN 4 : y?3=FNosword14_1(4) 19290WHEN 5 : y?3=1 19300WHEN 6 : y?3=FNosword14_1(3) 19310WHEN 7 : y?3=FNosword14_1(2) 19320WHEN 8 : y?3=FNosword14_1(1) 19330WHEN 9 : y?3=FNosword14_1(0) 19340WHEN 10 : y?3=%00100000 19350WHEN 11 : y?3=%00000010 19360WHEN 12 : y?3=0 19370WHEN 13 : y?3=0 19380OTHERWISE : y?3=cmos%(x?3 AND 63) 19390 19400ENDCASE 19410 19420a?3=y?3 19430 19440REMPRINTTAB(0,0);x?3 AND 63;" ";y?3;" ":Q=GET 19450PROCrts 19460ENDPROC 19470 19480DEFPROCreadEEPROM 19490y?3=eeprom%(x?3) 19500a?3=y?3 19510PROCrts 19520ENDPROC 19530 19540DEFPROCwriteCMOS 19550cmos%(x?3 AND 63)=y?3 19560PROCrts 19570IF (x?3 AND 63)>13 THEN 19580Q=OPENUP "<6502Em$Res>.CMOS" 19590PTR#Q=x?3 AND 63 19600BPUT#Q,y?3 19610CLOSE#Q 19620ENDIF 19630ENDPROC 19640 19650DEFPROCwriteEEPROM 19660eeprom%(x?3)=y?3 19670PROCrts 19680Q=OPENUP "<6502Em$Res>.EEPROM" 19690PTR#Q=x?3 19700BPUT#Q,y?3 19710CLOSE#Q 19720ENDPROC 19730 19740DEFPROCloadCMOS 19750LOCAL Q,I% 19760Q=OPENIN "<6502Em$Res>.CMOS" 19770FOR I%=0 TO 63 19780cmos%(I%)=BGET#Q 19790NEXT 19800CLOSE#Q 19810ENDPROC 19820 19830DEFPROCloadEEPROM 19840LOCAL Q,I% 19850Q=OPENIN "<6502Em$Res>.EEPROM" 19860FOR I%=0 TO 255 19870eeprom%(I%)=BGET#Q 19880NEXT 19890CLOSE#Q 19900ENDPROC 19910 19920DEFPROCloadcode(C$) 19930OSCLI"LOAD <6502Em$Dir>."+C$+" "+STR$~code 19940CALL code+!init_addr 19950PROCsound_reinit 19960IF patch%<>0 THEN PROCloadpatch 19970ENDPROC 19980 19990DEFPROCmaster 20000PROCloadcode("CodeM") 20010OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,2 "+STR$~(memory+&C000) 20020OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,2 "+STR$~(roms+romsize%*16) 20030OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20040socket%=15 20050PROCloadROM("M128.Terminal",1) 20060?(roms+romsize%*15+&18B7)=3 20070?(roms+romsize%*15+&18B8)=&80 : REM intercept .readCMOS 20080?(roms+romsize%*15+&18E4)=3 20090?(roms+romsize%*15+&18E5)=&81 : REM intercept .writeCMOS 20100PROCloadROM("M128.View",1) 20110PROCloadROM("VDFS",1) 20120REMPROCloadROM("M128.ADFS",1) 20130PROCloadROM("M128.BASICIV84",1) 20140PROCloadROM("M128.Edit1,00",1) 20150PROCloadROM("M128.ViewSheet",1) 20160PROCloadROM("M128.DFS2,24",1) 20170REM?(roms+&4000*9+&1163)=3 20180REM?(roms+&4000*9+&1164)=&82 : REM intercept OSWORD 7F? 20190REMPROCloadROM("VDFS",1) 20200PROCSRRAM 20210PROCSRRAM 20220PROCSRRAM 20230PROCSRRAM 20240PROCSRRAM 20250ENDPROC 20260 20270DEFPROCmaster35 20280PROCloadcode("CodeM") 20290OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,5 "+STR$~(memory+&C000) 20300OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,5 "+STR$~(roms+romsize%*16) 20310OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20320socket%=15 20330PROCloadROM("M128.Terminal35",1) 20340?(roms+romsize%*15+&16A3)=3 20350?(roms+romsize%*15+&16A4)=&80 : REM intercept .readCMOS 20360?(roms+romsize%*15+&16D0)=3 20370?(roms+romsize%*15+&16D1)=&81 : REM intercept .writeCMOS 20380PROCloadROM("M128.ViewB3,3",1) 20390PROCloadROM("VDFS",1) 20400REMPROCloadROM("M128.ADFS2,03",1) 20410PROCloadROM("M128.BASIC4r32",1) 20420PROCloadROM("M128.Edit1,50r",1) 20430PROCloadROM("M128.ViewSh1,01",1) 20440PROCloadROM("M128.DFS2,45",1) 20450REM?(roms+&4000*9+&1163)=3 20460REM?(roms+&4000*9+&1164)=&82 : REM intercept OSWORD 7F? 20470REMPROCloadROM("VDFS",1) 20480PROCSRRAM 20490PROCSRRAM 20500PROCSRRAM 20510PROCSRRAM 20520PROCSRRAM 20530ENDPROC 20540 20550DEFPROCcompact 20560PROCloadcode("CodeM") 20570OSCLI"LOAD <6502Em$Dir>.ROMS.Compact.OS5,1 "+STR$~(memory+&C000) 20580OSCLI"LOAD <6502Em$Dir>.ROMS.Compact.OS5,1 "+STR$~(roms+&4000*16) 20590OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20600socket%=15 20610PROCloadROM("Compact.Utils",1) 20620?(roms+romsize%*15+&9E3A-&8000)=3 20630?(roms+romsize%*15+&9E3B-&8000)=&82 : REM intercept .readCMOS 20640?(roms+romsize%*15+&9F3A-&8000)=3 20650?(roms+romsize%*15+&9F3B-&8000)=&83 : REM intercept .writeCMOS 20660PROCloadROM("Compact.BASICIV86",1) 20670REMPROCloadROM("M128.ADFS",1) 20680PROCloadROM("VDFS",1) 20690socket%=7 20700PROCSRRAM 20710PROCSRRAM 20720PROCSRRAM 20730PROCSRRAM 20740ENDPROC 20750 20760DEFPROCelectron 20770PROCloadcode("CodeE") 20780OSCLI"LOAD <6502Em$Dir>.ROMS.ELECTRON "+STR$~(memory+&C000) 20790REMmemory?&F0E8=3 : REM OSFSC 20800REMmemory?&FFCE=3 : REM OSFIND 20810REMmemory?&FFD1=3 : REM OSGBPB 20820REMmemory?&FFD4=3 : REM OSBPUT 20830REMmemory?&FFD7=3 : REM OSBGET 20840REMmemory?&FFDA=3 : REM OSARGS 20850REMmemory?&FFDD=3 : REM OSFILE 20860 20870socket%=15 20880PROCloadROM("BASICII",1) 20890PROCloadROM("VDFS",1) 20900ENDPROC 20910 20920DEFPROCBBCB 20930PROCloadcode("Code") 20940?ACCCON=0 20950OSCLI"LOAD <6502Em$Dir>.ROMS.OS1,2 "+STR$~(memory+&C000) 20960REMOSCLI"LOAD <6502Em$Dir>.ROMS.OS1,2 "+STR$~(roms+&4000*16) 20970OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20980REMmemory?&F1B1=3 : REM OSFSC 20990REMmemory?&FFCE=3 : REM OSFIND 21000REMmemory?&FFD1=3 : REM OSGBPB 21010REMmemory?&FFD4=3 : REM OSBPUT 21020REMmemory?&FFD7=3 : REM OSBGET 21030REMmemory?&FFDA=3 : REM OSARGS 21040REMmemory?&FFDD=3 : REM OSFILE 21050 21060socket%=15 21070PROCloadROM("BASICII",1) 21080PROCloadROM("VDFS",1) 21090PROCSRRAM 21100ENDPROC 21110 21120DEFPROCnewmachine 21130PROCclearmem(roms,roms+16*romsize%) 21140PROCclearmem(memory-&200,memory+64*1024) 21150PROCinitROMs 21160 21170IF machine%>4 THEN machine%=0 21180REMIF Machine%(machine%)=FALSE THEN machine%=default_machine% 21190 21200PROCpokeicontext(10,Machine$(machine%)) 21210 21220CASE machine% OF 21230 21240WHEN 1 : 21250IF Machine%(1)=0 THEN machine%+=1:PROCnewmachine:ENDPROC 21260PROCmaster 21270 21280WHEN 2 : 21290IF Machine%(2)=0 THEN machine%+=1:PROCnewmachine:ENDPROC 21300PROCmaster35 21310 21320WHEN 3 : 21330IF Machine%(3)=0 THEN machine%+=1:PROCnewmachine:ENDPROC 21340PROCcompact 21350 21360WHEN 4 : 21370PROCelectron 21380 21390OTHERWISE : PROCBBCB 21400ENDCASE 21410REMPROCreset(1) 21420REMOSRDCH_loc=FNpeek(&FFE0) 21430OSRDCH_loc=memory?&FFE0 21440 21450PROCreinstall(MachineSprite$(machine%)) 21460 21470PROCreset(1) 21480 21490ENDPROC 21500 21510DEFPROCdefault_options 21520tapefile$="<6502Em$Dir>.^.Tape-In" 21530Palette%=TRUE 21540OSRDCH%=TRUE 21550ROMSEL%=TRUE 21560Cursor%=FALSE 21570Oscli%=FALSE 21580machine%=default_machine% 21590sound_on%=TRUE 21600scroll_hack%=FALSE 21610file_xxx=FALSE 21620volume%=127 21630PROCsetkeymap("Default") 21640PROCnewspeed(100) 21650ENDPROC 21660 21670DEFPROCsave_options 21680Q=OPENOUT"<6502Em$Res>.Options" 21690PRINT#Q,Palette% 21700PRINT#Q,OSRDCH% 21710PRINT#Q,ROMSEL% 21720PRINT#Q,Cursor% 21730PRINT#Q,Oscli% 21740PRINT#Q,0 21750PRINT#Q,machine% 21760PRINT#Q,sound_on% 21770PRINT#Q,file_xxx 21780PRINT#Q,volume% 21790PRINT#Q,KeyMap$ 21800PRINT#Q,speed 21810CLOSE#Q 21820ENDPROC 21830 21840DEFPROCload_options 21850tapefile$="<6502Em$Dir>.^.Tape-In" 21860Q=OPENIN"<6502Em$Res>.Options" 21870IF Q=0 THEN PROCdefault_options : ENDPROC 21880INPUT#Q,Palette% 21890INPUT#Q,OSRDCH% 21900INPUT#Q,ROMSEL% 21910INPUT#Q,Cursor% 21920INPUT#Q,Oscli% 21930INPUT#Q,exact% 21940INPUT#Q,machine% 21950INPUT#Q,sound_on% 21960scroll_hack%=FALSE 21970INPUT#Q,file_xxx 21980INPUT#Q,volume% 21990INPUT#Q,K$ : PROCsetkeymap(K$) 22000INPUT#Q,speed 22010CLOSE#Q 22020ENDPROC 22030 22040DEFPROCswapmem(A%,B%,C%) 22050P%=buffer 22060[OPT2 22070.swap 22080SUBS R2,R2,#4 22090LDR R3,[R0,R2] 22100LDR R4,[R1,R2] 22110STR R3,[R1,R2] 22120STR R4,[R0,R2] 22130BNE swap 22140MOV PC,R14 22150] 22160CALL swap 22170ENDPROC 22180 22190DEFPROCclearmem(S%,E%) 22200P%=buffer 22210[OPT2 22220EQUD S% ; memory 22230EQUD E% ; memory+&8000 22240.clear 22250MOV R0,#0 22260LDR R1,buffer 22270LDR R2,buffer+4 22280.loop 22290STR R0,[R1],#4 22300CMP R1,R2 22310BNE loop 22320MOV PC,R14 22330] 22340CALL clear 22350ENDPROC 22360 22370DEFPROCosbyte2 22380PROCrts 22390ENDPROC 22400 22410DEFPROCosword2 22420LOCALaddr,sec%,len%,buff%,track%,log_sec_size,drive% 22430addr=memory?&F0 22440addr+=memory?&F1 << 8 22450addr=FNaddr(addr) 22460CASE memory?&EF OF 22470WHEN &7F 22480IF dfssupport THEN 22490SYS "XImageDFS_OSWORD7F",,memory?&F0,memory?&F1,memory 22500a?3=0 22510ELSE 22520drive%=addr?0 22530buff%=FNaddr(addr!1 AND &FFFF) 22540track%=addr?7 22550sec%=addr?8 22560len%=(addr?9) AND %11111 22570log_sec_size=((addr?9) >> 5) + 7 22580buffer?0=log_sec_size 22590buffer?1=10 22600buffer?2=1 : REM heads 22610buffer?3=1 22620buffer!4=0 22630buffer!8=0 22640buffer!12=1 << 29 : REM drive% << 29 22650buffer!16=&64000 22660buffer!20=0 22670buffer!24=0 22680buffer!28=0 22690SYS "XADFS_DiscOp",,1+(buffer << 6),(track%*10+sec%)*2^log_sec_size+(osword7F_drive% << 29),buff%,len%*2^log_sec_size TO A% ; F 22700IF (F AND 1)=0 THEN addr?10=0 ELSE addr?10=A% 22710 22720a?3=0 22730 22740ENDIF 22750 22760WHEN &72 22770REMPRINT"OSWORD 72";addr?5 22780IF addr?5=8 THEN 22790sec%=addr?8 22800sec%+=addr?7 << 8 22810sec%+=(addr?6 AND %11111) << 16 22820len%=addr?9 22830buff%=FNaddr(addr!1 AND &FFFF) 22840 22850SYS "XADFS_DiscOp",,1,sec%*256+(osword72_drive% << 29),buff%,len%*256 TO A% ; F 22860IF (F AND 1)=0 THEN ?addr=0 ELSE ?addr=A% 22870 22880REMOSCLI"SAVE MEM:DUMP "+STR$~buff%+" +"+STR$~(len%*256)+" "+STR$~(addr!1 AND &FFFF) 22890 22900a?3=0 : REM claim service call! 22910ENDIF 22920OTHERWISE REMPRINT"OSWORD ";~?&EF:Q=GET 22930ENDCASE 22940 22950PROCrts 22960REMPRINT~!pc_store 22970REMQ=GET 22980ENDPROC 22990 23000DEFPROCsplit(RETURN A$,RETURN B$) 23010LOCAL I% 23020WHILE LEFT$(A$,1)=" " 23030A$=RIGHT$(A$,LENA$-1) 23040ENDWHILE 23050FORI%=2 TO LENA$ 23060IF MID$(A$,I%,1)="+" THEN A$=LEFT$(A$,I%-1)+" "+RIGHT$(A$,1+LENA$-I%):I%=255 23070NEXT 23080I%=INSTR(A$," ") 23090REMIF INSTR(A$,"+")>1 AND INSTR(A$,"+")<I% THEN I%=INSTR(A$,"+") 23100B$=LEFT$(A$,I%-1) 23110A$=RIGHT$(A$,LENA$-I%) 23120ENDPROC 23130 23140DEFPROCsplit2(RETURN A$,RETURN B$) 23150LOCAL I% 23160WHILE LEFT$(A$,1)=" " 23170A$=RIGHT$(A$,LENA$-1) 23180ENDWHILE 23190I%=INSTR(A$," ") 23200B$=LEFT$(A$,I%-1) 23210A$=RIGHT$(A$,LENA$-I%) 23220ENDPROC 23230 23240DEFPROCsplit3(RETURN A$,RETURN B$) 23250LOCAL I%,J% 23260WHILE (LEFT$(A$,1)=" " OR LEFT$(A$,1)=".") 23270A$=RIGHT$(A$,LENA$-1) 23280ENDWHILE 23290I%=INSTR(A$," ") 23300J%=INSTR(A$,".") 23310IF J%>0 AND (J%<I% OR I%=0) THEN I%=J% 23320B$=LEFT$(A$,I%-1) 23330A$=RIGHT$(A$,LENA$-I%) 23340ENDPROC 23350 23360DEFPROCsrwrite 23370 23380LOCAL A$,C$,addr,I%,J% 23390addr=memory?&F2 23400addr+=(memory?&F3) << 8 23410addr=FNaddr(addr) 23420addr+=y?3 23430C$=$addr 23440 23450PROCsplit(C$,A$) 23460 23470IF LENA$>4 THEN PROCbrk(0,"Bad Address"):ENDPROC 23480FORI%=1 TO LENA$ 23490J%=ASCMID$(A$,I%,1) 23500IF (J%<48 OR J%>57) AND (J%<65 OR J%>70) THEN PROCbrk(0,"Bad Address"):ENDPROC 23510NEXT 23520 23530start%=EVAL("&"+A$) 23540 23550IF start%>&8000 THEN PROCbrk(0,"Bad Address"):ENDPROC 23560 23570PROCsplit(C$,A$) 23580 23590IF LEFT$(A$,1)="+" THEN end%=start%:A$=RIGHT$(A$,LENA$-1) ELSE end%=0 23600 23610IF LENA$>4 THEN PROCbrk(0,"Bad Address"):ENDPROC 23620FORI%=1 TO LENA$ 23630J%=ASCMID$(A$,I%,1) 23640IF (J%<48 OR J%>57) AND (J%<65 OR J%>70) THEN PROCbrk(0,"Bad Address"):ENDPROC 23650NEXT 23660 23670end%+=EVAL("&"+A$) 23680 23690IF end%<start% OR end%>&8000 THEN PROCbrk(0,"Bad Address"):ENDPROC 23700 23710PROCsplit(C$,A$) 23720 23730IF LENA$<>4 THEN PROCbrk(0,"Bad Address"):ENDPROC 23740FORI%=1 TO LENA$ 23750J%=ASCMID$(A$,I%,1) 23760IF (J%<48 OR J%>57) AND (J%<65 OR J%>70) THEN PROCbrk(0,"Bad Address"):ENDPROC 23770NEXT 23780 23790dest%=EVAL("&"+A$) 23800 23810IF dest%<&8000 OR dest%>&BFFF THEN PROCbrk(0,"Bad Address"):ENDPROC 23820 23830PROCsplit(C$,A$) 23840CASE LENA$ OF 23850WHEN 1 23860A%=ASCA$ 23870IF A%>=ASC"W" AND A%<=ASC"Z" THEN A%=A%-ASC"W"+ASC"4" 23880IF A%>64 AND A%<71 THEN A%-=7 23890socket%=A%-48 23900IF socket%>15 OR socket%<0 THEN PROCbrk(0,"Bad Socket"):ENDPROC 23910WHEN 2 23920IF LEFT$(A$,1)<"0" OR LEFT$(A$,1)>"9" OR RIGHT$(A$,1)<"0" OR RIGHT$(A$,1)>"9" THEN PROCbrk(0,"Bad Socket"):ENDPROC 23930socket%=VALA$ 23940IF socket%>15 OR socket%<0 THEN PROCbrk(0,"Bad Socket"):ENDPROC 23950OTHERWISE 23960PROCbrk(0,"Bad Socket"):ENDPROC 23970ENDCASE 23980 23990REMPRINT~start%,~end%,~dest%:Q=GET 24000 24010FOR I%=0 TO FNmin(end%-start%,&BFFF-dest%) STEP 4 24020!(roms+romsize%*socket%+I%+dest%-&8000)=start%!(memory+I%) 24030NEXT 24040 24050ROMRAM?socket%=0 24060 24070a?3=0 24080PROCrts 24090 24100ENDPROC 24110 24120DEFPROCmount 24130LOCAL A$,C$,addr,drive% 24140addr=memory?&F2 24150addr+=(memory?&F3) << 8 24160addr=FNaddr(addr) 24170REMaddr+=y?3 24180C$=$addr 24190 24200PROCstrip2(C$) 24210 24220IF LEFT$(FNupper(C$),5)="MOUNT" THEN :C$="MOUNT "+RIGHT$(C$,LENC$-5) 24230 24240PROCsplit3(C$,file$) 24250 24260PROCsplit3(C$,A$) 24270 24280drive%=VALA$ 24290 24300REMSYS "OS_File",5,"ADFS::"+A$+".$" TO Q 24310SYS "ADFS_Drives" TO D%,F%,H% 24320IF A$="" THEN a?3=0:PROCrts:ENDPROC 24330IF drive%<F% OR (drive%>3 AND drive%<H%+4) THEN 24340fs$="ADFS:" 24350disc$=":"+STR$drive%+"." 24360path$="$" 24370subpath$="" 24380 24390a?3=0 24400PROCrts 24410ELSE 24420PROCbrk(0,"Bad drive "+A$):ENDPROC 24430ENDIF 24440 24450ENDPROC 24460 24470 24480DEFPROCdrive 24490LOCAL A$,C$,addr,drive% 24500addr=memory?&F2 24510addr+=(memory?&F3) << 8 24520addr=FNaddr(addr) 24530REMaddr+=y?3 24540C$=$addr 24550PROCstrip2(C$) 24560IF LEFT$(FNupper(C$),5)="DRIVE" THEN C$="DRIVE "+RIGHT$(C$,LENC$-5) 24570 24580PROCsplit3(C$,file$) 24590 24600PROCsplit3(C$,A$) 24610drive%=VALC$ 24620 24630CASE C$ OF 24640WHEN "0","1","2","3" 24650IF dfssupport THEN 24660 IF imagefile% THEN 24670 path$=LEFT$(path$,INSTR(path$,"DFSSide2")-2) 24680 ELSE 24690 SYS "ImageDFS_DFSToADFSDrive",drive% TO dfsdrive% 24700 REMpath$="ADFS::"+STR$drive%+".$" 24710 fs$="ADFS:":disc$=":"+STR$dfsdrive%+".":path$="$" 24720 ENDIF 24730ELSE 24740 path$=LEFT$(path$,INSTR(path$,"DFSSide2")-2) 24750ENDIF 24760 24770subpath$="" 24780IF drive%=2 OR drive%=3 THEN 24790SYS "OS_File",5,fs$+disc$+path$+".DFSSide2" TO Q 24800IF Q<>0 path$=path$+".DFSSide2" 24810ENDIF 24820 24830WHEN "R","r" 24840PROCreadCSD 24850 24860OTHERWISE 24870PROCbrk(0,"Bad Drive "+C$):ENDPROC 24880 24890ENDCASE 24900 24910a?3=0 24920PROCrts 24930ENDPROC 24940 24950DEFPROCsrload 24960LOCAL A$,C$,addr,I%,J% 24970addr=memory?&F2 24980addr+=(memory?&F3) << 8 24990addr=FNaddr(addr) 25000addr+=y?3 25010C$=$addr 25020 25030PROCsplit2(C$,file$) 25040 25050PROCsplit(C$,A$) 25060IF LENA$<>4 THEN PROCbrk(0,"Bad Address"):ENDPROC 25070FORI%=1 TO LENA$ 25080J%=ASCMID$(A$,I%,1) 25090IF (J%<48 OR J%>57) AND (J%<65 OR J%>70) THEN PROCbrk(0,"Bad Address"):ENDPROC 25100NEXT 25110 25120load%=EVAL("&"+A$) 25130IF load%<&8000 OR load%>&BFFF THEN PROCbrk(0,"Bad Address"):ENDPROC 25140PROCsplit(C$,A$) 25150IF RIGHT$(A$,1)="Q" THEN A$=LEFT$(A$,LENA$-1) 25160CASE LENA$ OF 25170WHEN 1 25180A%=ASCA$ 25190IF A%>=ASC"W" AND A%<=ASC"Z" THEN A%=A%-ASC"W"+ASC"4" 25200IF A%>64 AND A%<71 THEN A%-=7 25210socket%=A%-48 25220IF socket%>15 OR socket%<0 THEN PROCbrk(0,"Bad Socket"):ENDPROC 25230WHEN 2 25240IF LEFT$(A$,1)<"0" OR LEFT$(A$,1)>"9" OR RIGHT$(A$,1)<"0" OR RIGHT$(A$,1)>"9" THEN PROCbrk(0,"Bad Socket"):ENDPROC 25250socket%=VALA$ 25260IF socket%>15 OR socket%<0 THEN PROCbrk(0,"Bad Socket"):ENDPROC 25270OTHERWISE 25280PROCbrk(0,"Bad Socket"):ENDPROC 25290ENDCASE 25300 25310SYS "XOS_Find",&40+%1101,FNadd_(file$),FN_path(file$) TO A% ; F 25320IF (F AND 1)<>0 THEN PROCswi_error:ENDPROC 25330H%=A% 25340SYS "XOS_GBPB",4,A%,load%-&8000+roms+romsize%*socket%,&C000-load% TO A% ; F 25350IF (F AND 1)<>0 THEN PROCswi_error:ENDPROC 25360?(ROMRAM+socket%)=0 25370SYS "XOS_Find",0,H% TO A% ; F 25380IF (F AND 1)<>0 THEN PROCswi_error:ENDPROC 25390 25400a?3=0 25410PROCrts 25420ENDPROC 25430 25440DEFPROCelkkeys(F$) 25450 25460LOCAL Q,S$,K%,A$ 25470 25480SYS "6502_GetElectronMap" TO keymap 25490 25500FORI%=0 TO 1023 STEP 4 25510keymap!I%=&FF 25520NEXT 25530 25540Q=OPENINF$ 25550IF Q=0 THEN ERROR 0,F$+" not found" 25560REPEAT 25570S$=FNgetword 25580IF LEFT$(S$,1)="#" THEN 25590 PROCignoreline 25600 IF INSTR(S$,"RiscPC") AND INKEY-256<&A5 THEN S$="" 25610ELSE 25620 IF S$<>"" THEN 25630 S%=FNgetelk(S$) 25640 REPEAT 25650 A$=FNgetword 25660 IF A$<>"" THEN 25670 K%=FNgetarc(A$) 25680 keymap!(K%*4)=S% 25690 ENDIF 25700 UNTILA$="" 25710 ENDIF 25720ENDIF 25730UNTIL S$="" OR EOF#Q 25740 25750CLOSE#Q 25760 25770ENDPROC 25780 25790DEFPROCreadkeys(F$) 25800 25810LOCAL Q,S$,K%,A$,shift% 25811 25830SYS "6502_ReadKeyMapAddress" TO keymap 25840FORI%=0 TO 255+256 25850keymap?I%=255 25860NEXT 25870 25880Q=OPENINF$ 25890IF Q=0 THEN ERROR 0,F$+" not found" 25900REPEAT 25910S$=FNgetword 25920IF LEFT$(S$,1)="#" THEN 25930 PROCignoreline 25940 IF INSTR(S$,"RiscPC") AND INKEY-256<&A5 THEN S$="" 25960ELSE 25970 IF S$<>"" THEN 25980 IF LEFT$(S$,1)="s" AND LENS$>1 THEN shift%=TRUE:S$=RIGHT$(S$,LENS$-1) ELSE shift%=FALSE 25990 REMVDU4:PRINTS$:VDU5:PRINTGET 26000 S%=FNgetbbc(S$) 26010 REPEAT 26020 A$=FNgetword 26030 IF A$<>"" THEN 26040 K%=FNgetarc(A$) 26050 IF shift%=FALSE THEN keymap?K%=S% 26060 keymap?(K%+256)=S% 26070 ENDIF 26080 UNTILA$="" 26090 ENDIF 26100ENDIF 26110UNTIL S$="" OR EOF#Q 26120 26130CLOSE#Q 26140 26150ENDPROC 26160 26170DEFFNgetword 26180LOCAL I%,A$ 26190REPEAT I%=BGET#Q : UNTIL I%>32 OR I%=10 26200IF I%=10 THEN ="" 26210A$=CHR$I% 26220REPEAT I%=BGET#Q : A$=A$+CHR$I% : UNTIL I%<33 26230PTR#Q=PTR#Q-1 26240=LEFT$(A$,LENA$-1) 26250 26260DEFPROCignoreline 26270LOCALI% 26280REPEAT I%=BGET#Q : UNTILI%=&A 26290ENDPROC 26300 26310DEFFNgetelk(A$) 26320LOCALI%,J%,K% 26330FORI%=0 TO 3 26340FORJ%=0 TO 13 26350IF Elec$(I%,J%)=A$ THEN K%=(I%<<8)+J%:I%=4:J%=14 26360NEXT 26370NEXT 26380=K% 26390 26400DEFFNgetbbc(A$) 26410LOCALI%,J% 26420FOR I%=0 TO &7C 26430IF BBC$(I%)=A$ THEN J%=I%:I%=&80 26440NEXT 26450=J% 26460 26470DEFFNgetarc(A$) 26480LOCALI%,J% 26490FOR I%=&0 TO &78 26500IF ARC$(I%)=A$ THEN J%=I%:I%=&68 26510NEXT 26520=J% 26530 26540REM Electron Keys 26550DATA Escape,1,2,3,4,5,6,7,8,9,0,-,Left,Right 26560DATA CapsLock,Q,W,E,R,T,Y,U,I,O,P,Up,Down,Copy 26570DATA Ctrl,A,S,D,F,G,H,J,K,L,;,:,Return,"" 26580DATA Shift,Z,X,C,V,B,N,M,",",.,/,"",Delete,Space 26590 26600REM BBC Keys 26610DATA Shift,Ctrl,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,"","","" 26620DATA Q,3,4,5,f4,8,f7,-,^,Left,K6,K7,"" 26630DATA f0,W,E,T,7,I,9,0,_,Down,K8,K9,"" 26640DATA 1,2,D,R,6,U,O,P,[,Up,K+,K-,KReturn 26650DATA CapsLock,A,X,F,Y,J,K,@,:,Return,K/,KDelete,"K." 26660DATA ShiftLock,S,C,G,H,N,L,;,],Delete,K#,K*,"K," 26670DATA Tab,Z,Space,V,B,M,",",".",/,Copy,K0,K1,K3 26680DATA Escape,f1,f2,f3,f5,f6,f8,f9,\,Right,K4,K5,K2 26690 26700REM RISC OS Keys 26710DATA Escape,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,"",Print,"","" 26720DATA `,1,2,3,4,5,6,7,8,9,0,-,=,FALSE,<-|,Insert,Home,PageUp,NumLock,K/,K*,K#,Tab,Q,W,E,R,T,Y,U,I,O,P,[,],\,Delete,Copy,PageDown,K7,K8,K9,K-,LCtrl,A,S,D,F,G,H,J,K,L,;,',Return,K4,K5,K6,K+ 26730DATA LShift,,Z,X,C,V,B,N,M,",",.,/,RShift,Up,K1,K2,K3,CapsLock,LAlt,Space,RAlt,RCtrl,Left,Down,Right,K0,K.,Enter 26740DATA "","","","","","","","","","","","","","","","" 26750DATA # : REM Risc PC key #~ 26760 26770DEFPROCsetmemmap 26780IF paging%=FALSE OR machine%=0 OR machine%=4 THEN ENDPROC 26790!&97000=&A0A0A0A0 26800!&97004=&A0A0A0A0 26810!&97008=&A0A0A0A0 26820!&9700C=&A0A0A0A0 26830REMIF (?ACCCON AND %100)<>0 THEN ?&97003=&8D:!&97004=&8D8D8D8D:PROCswapmem(&A3000,&90000,&5000) 26840PROCswapmem(&A8000,roms+(?romsel AND %1111)*romsize%,romsize%) 26850?&97008=&44+(?romsel AND %1111)*4 26860?&97009=&44+(?romsel AND %1111)*4 26870?&9700A=&44+(?romsel AND %1111)*4 26880?&9700B=&44+(?romsel AND %1111)*4 26890IF (?ACCCON AND %1000)<>0 THEN ?&9700C=&89:?&9700D=&89:PROCswapmem(&AC000,&95000,&2000) 26900IF (?romsel AND %10000000)<>0 THEN ?&97008=&89:PROCswapmem(&A8000,&9D000,&1000) 26910 26920ENDPROC 26930 26940DEFPROCsetmemmap2 26950IF paging%=FALSE OR machine%=0 OR machine%=4 THEN ENDPROC 26960IF (?romsel AND %10000000)<>0 THEN PROCswapmem(&A8000,&9D000,&1000) 26970IF (?ACCCON AND %1000)<>0 THEN PROCswapmem(&AC000,&95000,&2000) 26980PROCswapmem(&A8000,roms+(?romsel AND %1111)*romsize%,romsize%) 26990REMIF (?ACCCON AND %100)<>0 THEN PROCswapmem(&A3000,&90000,&5000) 27000ENDPROC 27010 27020DEFFNpeek(A%)=?FNaddr(A%) 27030 27040DEFFNaddr(A%)=memory+A% 27050 27060DEFFNaddr2(A%) 27070LOCAL B%,C%,D% 27080IF paging% AND (machine%>0 AND machine%<4) THEN 27090B%=&97000+(A%>>>12) 27100C%=(?B%)<<12 27110D%=A%+C% 27120ELSE 27130D%=memory+A% 27140ENDIF 27150=D% 27160 27170 27180DEFPROCpoke(A%,V%) 27190memory?A%=V%:ENDPROC 27200 27210DEFPROCdisableCFS 27220IF machine%>0 AND machine%<4 THEN ENDPROC 27230vectors%=memory?&FFB7+(memory?&FFB8<<8) 27240 27250vectors%=FNaddr(vectors%) 27260addr%=vectors%?&1E+(vectors%?&1F<<8) 27270memory2=roms+romsize%*16-&C000 27280 27290memory?addr%=3 : REM OSFSC 27300memory2?addr%=3 27310memory?&FFCE=3 : REM OSFIND 27320memory2?&FFCE=3 27330memory?&FFD1=3 : REM OSGBPB 27340memory2?&FFD1=3 27350memory?&FFD4=3 : REM OSBPUT 27360memory2?&FFD4=3 27370memory?&FFD7=3 : REM OSBGET 27380memory2?&FFD7=3 27390memory?&FFDA=3 : REM OSARGS 27400memory2?&FFDA=3 27410memory?&FFDD=3 : REM OSFILE 27420memory2?&FFDD=3 27430ENDPROC 27440 27450DEFPROCboot 27460 27470REMSYS "OS_FSControl",11,fs$ : REM set temporary filing system 27480REMSYS "OS_FSControl",0,disc$+path$+subpath$ : REM change dir 27490REMSYS "XOS_GBPB",5,,buffer 27500REMSYS "OS_FSControl",19 27510 27520REMboot%=?(buffer+?buffer+1) 27530PROCrts 27540 27550IF machine%<>0 THEN ENDPROC 27560 27570Q=OPENIN(fs$+disc$+path$+subpath$+".!Boot") 27580IF Q<>0 THEN CLOSE#Q:disable_reset=TRUE:PROCfile_load(fs$+disc$+path$+subpath$+".!Boot"):disable_reset=FALSE:ENDPROC 27590Q=OPENIN(fs$+disc$+path$+subpath$+".!Run") 27600IF Q<>0 THEN CLOSE#Q:disable_reset=TRUE:PROCsnap_load(fs$+disc$+path$+subpath$+".!Run"):disable_reset=FALSE:ENDPROC 27610 27620PROCbrk(214,"File not found") 27630 27640ENDPROC 27650 27660DEFPROCopenmenu(menu%,X%,Y%) 27670PROCmenus 27680SYS "Wimp_CreateMenu",,menu%,X%,Y% 27690current_menu%=menu% 27700ENDPROC 27710 27720DEFPROCconfig 27730q%!0=config% 27740CASE i% OF 27750WHEN 1 27760q%!4=1:SYS "Wimp_GetIconState",,q% : ROMSEL%=((q%!24 AND 2^21)<>0) 27770WHEN 2 27780q%!4=2:SYS "Wimp_GetIconState",,q% : Palette%=((q%!24 AND 2^21)<>0) 27790WHEN 3 27800q%!4=3:SYS "Wimp_GetIconState",,q% : Cursor%=((q%!24 AND 2^21)<>0) 27810WHEN 4 27820q%!4=4:SYS "Wimp_GetIconState",,q% : Oscli%=((q%!24 AND 2^21)<>0) 27830WHEN 5 27840q%!4=5:SYS "Wimp_GetIconState",,q% : scroll_hack%=((q%!24 AND 2^21)<>0) 27850WHEN 6 27860q%!4=6:SYS "Wimp_GetIconState",,q% : file_xxx=((q%!24 AND 2^21)<>0) 27870IF file_xxx THEN OSCLI"IconSprites <6502Em$Res>.file_xxx" ELSE OSCLI"IconSprites <6502Em$Res>.no_xxx" 27880WHEN 7 27890q%!4=7:SYS "Wimp_GetIconState",,q% : sound_on%=((q%!24 AND 2^21)<>0) 27900WHEN 10 : IF mb%=2 THEN PROCopenmenu(machine_menu%,mx%-64,my%) 27910WHEN 11 : PROCopenmenu(machine_menu%,mx%-64,my%) 27920WHEN 12 : IF mb%=2 PROCopenmenu(keysmenu%,mx%-64,my%) 27930WHEN 13 : PROCopenmenu(keysmenu%,mx%-64,my%) 27940WHEN 14 : IF mb%=2 PROCopenmenu(patchmenu%,mx%-64,my%) 27950WHEN 15 : PROCopenmenu(patchmenu%,mx%-64,my%) 27960WHEN 16 : IF mb%=2 PROCopenmenu(speedmenu%,mx%-64,my%) 27970WHEN 17 : PROCopenmenu(speedmenu%,mx%-64,my%) 27980WHEN 20 : PROCdefault_options:PROCsetconfig 27990WHEN 21 : PROCsave_options 28000WHEN 22 : !q%=config% : SYS "Wimp_CloseWindow",,q% 28010ENDCASE 28020ENDPROC 28030 28040DEFPROCsetconfig 28050!q%=config%:q%!12=2^21 28060q%!4=1:q%!8=-2^21*(ROMSEL%<>0):SYS "Wimp_SetIconState",,q% 28070q%!4=2:q%!8=-2^21*(Palette%<>0):SYS "Wimp_SetIconState",,q% 28080q%!4=3:q%!8=-2^21*(Cursor%<>0):SYS "Wimp_SetIconState",,q% 28090q%!4=4:q%!8=-2^21*(Oscli%<>0):SYS "Wimp_SetIconState",,q% 28100q%!4=5:q%!8=-2^21*(scroll_hack%<>0):SYS "Wimp_SetIconState",,q% 28110q%!4=6:q%!8=-2^21*(file_xxx<>0):SYS "Wimp_SetIconState",,q% 28120q%!4=7:q%!8=-2^21*(sound_on%<>0):SYS "Wimp_SetIconState",,q% 28130PROCpokeicontext(16,STR$speed+"%") 28140buffer!0=0:buffer!4=0:buffer!8=0 28150SYS "OS_ReadVarVal","6502Em$Keymap",buffer,255 TO ,S$ 28160keymap%=FNkeymap(S$) 28170PROCpokeicontext(12,S$) 28180ENDPROC 28190 28200DEFPROCpokeicontext(N%,A$) 28210q%!0=config% 28220q%!4=N% 28230SYS "Wimp_GetIconState",,q% 28240$(q%!28)=A$+CHR$0 28250q%!8=0:q%!12=0 28260SYS "Wimp_SetIconState",,q% 28270ENDPROC 28280 28290DEFPROCnewspeed(S) 28300speed=S 28310PROCpokeicontext(16,STR$speed+"%") 28320ENDPROC 28330 28340DEFPROCdfsimage(A$) 28350SYS "XOS_SWINumberFromString",,"ImageDFS_Version" TO ; F 28360IF (F AND 1)=0 THEN dfssupport=TRUE ELSE dfssupport=FALSE 28370IF dfssupport=FALSE THEN PROCreport("ImageDFS (available from WSS) must be loaded to access this file"):ENDPROC 28380imagefile%=TRUE 28390PROCfile_load(A$+".!BOOT") 28400PROCBBC 28410ENDPROC 28420 28430DEFPROCreport(A$) 28440SYS"Wimp_ReportError"," "+A$,%11001,"6502Em" 28450ENDPROC 28460 28470DEFPROCopenconfig 28480 PROCsetconfig 28490 q%!0=config% 28500 SYS "Wimp_GetWindowState",,q% 28510 28520 IF config_open%=FALSE THEN 28530 SYS "OS_ReadModeVariable",-1,4 TO ,,xeig% 28540 SYS "OS_ReadModeVariable",-1,5 TO ,,yeig% 28550 SYS "OS_ReadModeVariable",-1,11 TO ,,screenx% 28560 SYS "OS_ReadModeVariable",-1,12 TO ,,screeny% 28570 sx%=q%!12-q%!4 : sy%=q%!16-q%!8 28580 q%!4=((screenx%<<xeig%)-sx%)/2 28590 q%!8=((screeny%<<yeig%)-sy%)/2 28600 q%!12=q%!4+sx% 28610 q%!16=q%!8+sy% 28620 ENDIF 28630 28640 q%!28=-1 28650 SYS "Wimp_OpenWindow",,q% 28660ENDPROC
� > !RunImage ,� 6502Em (desktop frontend for binaries) *� (c) Michael and Anne Borcherds, 1995 (E� LOCK ROMRAM,memory,roms,osword7F_drive%,osword72_drive%,paging% 2(version$="2.10 (24th November 1996)" < Fi� � ș "XWimp_CloseDown":ș "XWimp_ReportError"," Fatal internal error "+� �+": "+�$,1,"6502Em":Ș P Z@osword7F_drive%=1 : � drive accessed for protected DFS discs dAosword72_drive%=0 : � drive accessed for protected ADFS discs n paging%=� x top%=� � ��=�-96*1024 �;!�=0:ș "OS_ReadVarVal","6502Em$SaveScreen",�,255 � ,S$ �� �S$,3)="Yes" � �sprite=� �save_sprite=� �� ��=�+96*1024 �sprite=0 �save_sprite=� �� � �c�=�-(64+64)*1024 : � 64k BBC memory map + 32k Master extra memory + 256 bytes variables + spare memory=�+64*1024 F� memory<>&A0000 � � 0,"6502Em initialisation: Fatal memory error" " ,Dsheila=memory-&200 : �FORI%=&100 TO &1FF STEP 4:sheila!I%=0:NEXT 6 @�=�-17*16*1024:roms=� J�=�-160*1024:code=� Tromsize%=&4000 ^ hfiletype%=&BBC r |� volume between 0 and 127 �ț "<6502Em$Res>.Sound7a" � ��templates ��initBBC ��sound_init ��newmachine � �init � �poll � �� � � ���install(sprite$) � sx%,sy%,sm%,px%,py% &� text_buff &100, sprite_buff &100 4ș "Wimp_SpriteOp",40,,sprite$ � ,,,sx%,sy%,,sm% &9ș "OS_ReadModeVariable",sm%,4 � ,,px% : sx%=sx%<<px% 09ș "OS_ReadModeVariable",sm%,5 � ,,py% : sy%=sy%<<py% : !q%=-1 D/q%!4=0:q%!8=-16:q%!12=q%!4+sx%:q%!16=20+sy% N"�q%!20=&1700312B (filled icon) Xq%!20=&1700310B b l!(q%+24)=text_buff v!(q%+28)=sprite_buff �$text_buff=sprite$ �$sprite_buff="S"+sprite$ �!(q%+32)=&100 �"ș "Wimp_CreateIcon",,q% � !q% �bar_hand=!q% �� � ���reinstall(sprite$) �$sprite_buff="S"+sprite$ �$text_buff=sprite$ �buffer!0=-2 �buffer!4=bar_hand ��buffer!8=0 �buffer!12=0 buffer!8=&00800080 buffer!12=&00800080 !ș"Wimp_SetIconState",,buffer *-�SYS"Wimp_ForceRedraw",-2,0,0,&FFFF,&FFFF 4buffer!8=0 >buffer!12=&00800080 H!ș"Wimp_SetIconState",,buffer R� \ f��templates p� t 4:$t="TASK" z4ș "Wimp_Initialise",200,!t,"6502Em" � RO%,hand% �b� q% 256, q2% 256, iconmenu% 300, miscmenu% 200,rommenu% 800, machine_menu% 200, oscli_menu 20 �8� pokemenu% 50, pokevalid% 12, poketext% 12, drag 40 �!� temp_regs 12*4, buffer &100 ��clearmem(�,top%) ��install("OS�1.2") � ��readpatches ��readspeeds � �� RO%>299 � �3ș "OS_Byte",161,140 � ,,t% : THREED%=-(t% � 1) �v� THREED%=� � ș "Wimp_OpenTemplate",,"<6502Em$Res>.Template3D" � ș "Wimp_OpenTemplate",,"<6502Em$Res>.Templates" �3ș "Wimp_LoadTemplate",,-1,,,-1,"info" � ,A%,B% 8ș "Wimp_LoadTemplate",,-1,,,-1,"xfer_send" � ,C%,D% 9ș "Wimp_LoadTemplate",,-1,,,-1,"xfer_send2" � ,E%,F% 5ș "Wimp_LoadTemplate",,-1,,,-1,"config" � ,G%,H% $� .4ș "Wimp_OpenTemplate",,"<6502Em$Res>.Templates" 85A%=700 : B%=300 : C%=400 : D%=350 : E%=C% : F%=D% BG%=2000:H%=2000 L� VF� buffer2 A%, icon3 B%, xfer1 C%+4, xfer2 D%, xfer3 E%+4, xfer4 F% `� config G%, config2 H%+4 j<ș "Wimp_LoadTemplate",,buffer2,icon3,icon3+B%,-1,"info" t?ș "Wimp_LoadTemplate",,xfer1,xfer2,xfer2+D%,-1,"xfer_send" ~@ș "Wimp_LoadTemplate",,xfer3,xfer4,xfer4+F%,-1,"xfer_send2" �Aș "Wimp_LoadTemplate",,config,config2,config2+H%,-1,"config" �ș "Wimp_CloseTemplate" �/ș "Wimp_CreateWindow",,xfer1 � A%:xfer%=A% �0ș "Wimp_CreateWindow",,xfer3 � A%:xfer2%=A% �Cș "Wimp_CreateWindow",,config � A%:config%=A% : config_open%=� �1ș "Wimp_CreateWindow",,buffer2 � A%:info%=A% � �!buffer=info% �buffer!4=9 �"ș "Wimp_GetIconState",,buffer �$(buffer!28)=version$+�0 � !buffer=info% buffer!4=11 "ș "Wimp_GetIconState",,buffer 0�"Load <6502Em$Res>.SerialNo "+�~(buffer!28) (� 2 < ��init Fș "OS_GetEnv" � A$ P� �A$,1)=" " � ZI%=0 d�I%+=1:��A$,�A$-I%,1)<>" " nA$=�A$,�A$-I%) x� � � �A$,1)=�34 � A$=�A$,�A$-1) � � �A$,1)=�34 � A$=�A$,�A$-1) �I%=0 �&�I%+=1:��A$,�A$-I%,1)=" " � I%=�A$ �A$=�A$,I%) �?� �upper(�A$,�A$-9,10))<>".!RUNIMAGE" � �snap_load(A$):�BBC � �� � � ��poll �$� � � �report(�$,�<>1)=2 � �quit � �� mask%=%1100000110011 %ș "Wimp_Poll",mask%,q% � action% "Ȏ action% � ,E� 2 : ș "Wimp_OpenWindow",,q%:� !q%=config% � config_open%=� 6F� 3 : ș "Wimp_CloseWindow",,q%:� !q%=config% � config_open%=� @� 6 : �click J� 7 : �save T� 8 : �key ^� 9 : �decodemenu h� 17,18 : �message r� | ��� �� � � ��message �Ȏ q%!16 � �� 0 : �quit � � 2 : �� q%!12=myref% � �ș "OS_WriteN",q%+44 � A$ �� A$="<Wimp$Scrap>" � �/ș "XOS_ReadVarVal","Wimp$Scrap",,-1 � ,,A% �H� A%=0 � ș "Wimp_ReportError"," Scrap file not set",1,"6502Em":� �� � save_sprite% � �sprite_save(A$) !buffer=xfer2% &� 0�snap_save(A$) :!buffer=xfer% D� N X� �A$,6)<>"<Wimp$" � bbuffer!4=1 l"ș "Wimp_GetIconState",,buffer v$(buffer!28)=A$ �� � �;q%!16=3 : q%!12=q%!8 : ș "Wimp_SendMessage",17,q%,q%!4 �� �� 3 �ș "OS_WriteN",q%+44 � A$ �Ȏ q%!40 � �� &B22 : �dfsimage(A$) � � filetype% : �snap_load(A$) �%� &FFB,&FFE : �file_load(A$):�BBC �� � � 5 : �Ȏ q%!40 � � filetype% : � Snapshot 8q%!16=4:q%!12=q%!8:ș "Wimp_SendMessage",17,q%,q%!20 ș "OS_WriteN",q%+44 � A$ *�snap_load(A$) : �BBC 4 > H� ��-1 � Rș "OS_WriteN",q%+44 � A$ \ F$=A$ f2ș "OS_File",5,F$ � type%,,load%,exec%,length% p2� type%=2 � ��F$,�F$-��leaf(F$)-1),1)<>"!" � � z�� type%=2 � F$=A$+".!Run":ș "OS_File",5,F$ � type%,,load%,exec%,length%:� (load% � &FFF00)=&BBC00 � q%!16=4:q%!12=q%!8:ș "Wimp_SendMessage",17,q%,q%!20:�snap_load(F$) : �BBC : � �^� type%=0 � F$=A$+"."+�A$,�A$-��leaf(A$)-2):ș "OS_File",5,F$ � type%,,load%,exec%,length% � � �f � ((load%>>>16)=0 � (load%>>>16)=&FFFF � (load%>>>16)=&00FF) � (load% � &FFFF)<&8000 � type%=1 � �: q%!16=4:q%!12=q%!8:ș "Wimp_SendMessage",17,q%,q%!20 � �file_load(F$) � �BBC � � �� �� �� &400C1 : �PROCmode �� �� ��key Ȏ !q% � $ � config% . 8� q%!24=13 � q%!4=16 � Bș "Wimp_GetIconState",,q% L�newspeed(�$(q%!28)) V� `ș "Wimp_ProcessKey",q%!24 j� t ~� xfer%,xfer2% � �� q%!4=1 � q%!24=13 � �!buffer=!q% �buffer!4=1 �"ș "Wimp_GetIconState",,buffer �G� !q%=xfer% � �snap_save($(buffer!28)) � �sprite_save($(buffer!28)) �ș "Wimp_CreateMenu",-1 �� �ș "Wimp_ProcessKey",q%!24 �� � �� � ��click mx%=q%!0 (my%=q%!4 2mb%=q%!8 <h%=q%!12 Fi%=q%!16 P� h%=config% � �config:� Z � h%=-2 � d1� mb%=2 � �openmenu(iconmenu%,mx%-64,96+7*44) n � mb%=1 � x�PROCreadCSD ��PROCBBC ��openconfig �� � � mb%=4 � �� �-1 � �-2 � �readCSD ��BBC �� �� �=� i%=3 � (h%=xfer% � h%=xfer2%) � ș "Wimp_CreateMenu",-1 � �7� (h%=xfer% � h%=xfer2%) � i%=2 � (mb%=1 � mb%=4) � �!buffer=h% �buffer!4=1 "ș "Wimp_GetIconState",,buffer F� h%=xfer% � �snap_save($(buffer!28)) � �sprite_save($(buffer!28)) &� mb%<>1 � ș "Wimp_CreateMenu",-1 "� , 6� h%=xfer% � i%=0 � @save_sprite%=� J1!xfer1=xfer% : ș "Wimp_GetWindowInfo",,xfer1 T?!buffer=xfer% : buffer!4=0 : ș "Wimp_GetIconState",,buffer ^drag!0=0 hdrag!8=xfer1!4+buffer!8 rdrag!12=xfer1!16+buffer!12 |drag!16=xfer1!4+buffer!16 �drag!20=xfer1!16+buffer!20 �"ș "OS_Byte",161,&1C � ,,byte% �� RO%>299 � (byte% � 2)=2 � �drag!4=7 �solid%=� �� �drag!4=5 �solid%=� �� �drag!24=-100 �drag!28=-100 �drag!32=30000 �drag!36=30000 ]� solid% � ș "DragASprite_Start",%11000101,1,"file_BBC",drag+8 � ș "Wimp_DragBox",,drag � � h%=xfer2% � i%=0 � &save_sprite%=� 02!xfer3=xfer2% : ș "Wimp_GetWindowInfo",,xfer3 :@!buffer=xfer2% : buffer!4=0 : ș "Wimp_GetIconState",,buffer Ddrag!0=0 Ndrag!8=xfer3!4+buffer!8 Xdrag!12=xfer3!16+buffer!12 bdrag!16=xfer3!4+buffer!16 ldrag!20=xfer3!16+buffer!20 v"ș "OS_Byte",161,&1C � ,,byte% �� RO%>299 � (byte% � 2)=2 � �drag!4=7 �solid%=� �� �drag!4=5 �solid%=� �� �drag!24=-100 �drag!28=-100 �drag!32=30000 �drag!36=30000 �]� solid% � ș "DragASprite_Start",%11000101,1,"file_FF9",drag+8 � ș "Wimp_DragBox",,drag �� � ��menus *�P% 49�menuheader(iconmenu%,"6502Em",�"Single Task "*16+12) >'�menuitem(0,info%,&07000001,"Info") H*�menuitem(0,rommenu%,&07000001,"ROMs") R+�menuitem(0,miscmenu%,&07000001,"Misc") \,�PROCmenuitem(0,-1,&07000001,"Read CSD") f)�PROCmenuitem(0,-1,&07000001,"Reset") p'�menuitem(0,xfer%,&07000001,"Save") z� sprite=0 � �3�menuitem(0,xfer2%,&07000001 � (2^22),"Sprite") �� �A�menuitem(0,xfer2%,&07000001 � -(2^22)*(sprite!4=0),"Sprite") �� �)�menuitem(0,-1,&07000001,"Config...") �&�menuitem(&80,-1,&07000001,"Quit") � �$buffer!0=0:buffer!4=0:buffer!8=0 �7ș "OS_ReadVarVal","6502Em$Keymap",buffer,255 � ,S$ �keymap%=�keymap(S$) � �� keymaps%<>0 � �,�menuheader(keysmenu%,"Keymap",12*16+12) �I%=1 � keymaps% G�menuitem(-&80*(I%=keymaps%)-(keymap%=I%),-1,&07000001,keymap$(I%)) � $� . 8� patches%<>0 � B.�menuheader(patchmenu%,"Patches",12*16+12) L�I%=1 � patches% V7�menuitem(-2*(I%=patches%),-1,&07000001,patch$(I%)) `� j(�menuitem(&80,-1,&07000001,"(none)") t� ~ �+�menuheader(speedmenu%,"Speed",6*16+12) ��I%=0 � speeds% �8�menuitem(-&80*(I%=speeds%),-1,&07000001,speed$(I%)) �� � �/�menuheader(rommenu%,"Protected?",12*16+12) ��I%=15 � 0 � -1 �F�menuitem(-(?(ROMRAM+I%)<>0)-&80*(I%=0),-1,&07000001,�ROMname(I%)) �� � �8�menuheader(miscmenu%,"Misc",�"Disable Tape "*16+12) �(�menuitem(0,-1,&07000001,"Read CSD") %�menuitem(0,-1,&07000001,"Reset") � machine%=0 � machine%=4 � ,�menuitem(0,-1,&07000001,"Disable Tape") � (3�menuitem(0,-1,&07000001 � 2^22,"Disable Tape") 2� <-�menuitem(&80,-1,&07000001,"No Joystick") F P=�menuheader(machine_menu%,"Machine",�"Master 128 "*16+12) ZC�menuitem(0,-1,&07000001 � -(2^22)*(Machine%(0)=0),Machine$(0)) dC�menuitem(0,-1,&07000001 � -(2^22)*(Machine%(1)=0),Machine$(1)) nC�menuitem(0,-1,&07000001 � -(2^22)*(Machine%(2)=0),Machine$(2)) xC�menuitem(0,-1,&07000001 � -(2^22)*(Machine%(3)=0),Machine$(3)) �E�menuitem(&80,-1,&07000001 � -(2^22)*(Machine%(4)=0),Machine$(4)) � �� � ���menuheader(A%,B$,G%) � P%=A% �$P%=B$+�13 �)P%?12=7 : P%?13=2 : P%?14=7 : P%?15=0 �!P%!16=G% : P%!20=44 : P%!24=0 � P%+=28 �� � ���menuitem(A%,B%,C%,D$) P%!0=A% P%!4=B% P%!8=C% "$(P%+12)=D$+�13 , P%+=24 6� @ J$��indirecteditem(A%,B%,C%,D$,E%) TP%!0=A% ^P%!4=B% hP%!8=C%+&07000000 rP%!12=E% |P%!16=0 �P%!20=�D$+1 �$E%=D$+�13 � P%+=24 �� � ���decodemenu �Ȏ current_menu% � �� iconmenu% : �iconmenu �J� machine_menu% : � !q%<>-1 � !q%<>machine% � machine%=!q%:�newmachine �<� keysmenu% : � !q%<>-1 � �setkeymap(keymap$(!q%+1)) � �'� patchmenu% : � !q%>=patches% � �< patch%=0:�pokeicontext(14,"(none)") � B � patch%<>!q%+1 � patch%=!q%+1:�loadpatch � &@� speedmenu% : �newspeed(�(�speed$(!q%),�speed$(!q%)-1))) 0� : ș "Wimp_GetPointerInfo",,q% D2� (q%!8 � %1)>0 � �openmenu(current_menu%,0,0) N� X b��iconmenu lȎ !q% � v � 0 : � Info � � 5 : � Configure � �openconfig � � 1 : � ROMs � � q%!4 > -1 � � S%=15-(q%!4 � 15) �* � �validROM(S%) � ?(ROMRAM+S%)=2 � �G � ?(ROMRAM+S%)=2 � ?(ROMRAM+S%)=0 � ?(ROMRAM+S%)=1-?(ROMRAM+S%) � � � ?(ROMRAM+S%)=2 � � � � � � 2 : � Misc � � q%!4 > -1 � Ȏ q%!4 � � 0 : �readCSD � 1 : �reset(2) � 2 : �disableCFS * � 3 : joystick%=� 4 � > � H � 3 : � Save R � 4 : � Sprite \ : �quit f� p� z �"��menuitem2(A%,B%,C%,D%,E%,F%) �P%!0=A% �P%!4=B% �P%!8=C% �P%!12=D% �P%!16=E% �P%!20=F% � P%+=24 �� � �ݤcount(A$,B$) � �I%,C% ��I%=1 � �A$ � �A$,I%,1)=B$ � C%+=1 � =C% $ .ݤletter(A$) 8� I%,J% B�I%=1 � �A$ L.� �"ABCDEFabcdef",�A$,I%,1)) � J%=�:I%=�A$ V� `=J% j t ~ ��save �$� solid% � ș "DragASprite_Stop" � K$="" �/� save_sprite% � !drag=xfer2% � !drag=xfer% �drag!4=1 � ș "Wimp_GetIconState",,drag �P%=drag!28-1 �� P%+=1 �� ?P%<>13 � K$=K$+�?P% �!� ?P%=�"." � ?P%=�":" � K$="" ��?P%=13 � ș "Wimp_GetPointerInfo",,q% �<� q%!12<>xfer% � q%!12<>xfer2% � ș "Wimp_CreateMenu",-1 q%!20=q%!12 q%!24=q%!16 q%!28=q%!0 q%!32=q%!4 ( 2� save_sprite%=� � <q%!36=65667 Fq%!40=filetype% P� Zq%!36=80*1024 dq%!40=&FF9 n� x �q%!12=0 �q%!16=1 �$(q%+44)=K$+�0 �q%!0=(48+�K$) � %111111100 � �,ș "XWimp_SendMessage",17,q%,q%!20,q%!24 �myref%=q%!8 �� � �ݤleaf(A$) �� I% �I%=�A$+1 ��I%-=1:� �A$,I%,1)="." =�A$,I%-1) ��err "� � ,#� �report(�$,�) � �quit � �poll 6� @ J��err2(M%) T� � ^ � � �err h6� hand%<>0 � ș "XOS_Find",0,hand% : � CLOSE#hand% r8ș "XWimp_SetMode",M% : ș "X6502_RemoveExitHandler" |� sound%=� � �sound_restore �#� �report(�$,�) � �quit � �poll �� � �� �report(a$,E%) �� A% � � E% � �N ș "XWimp_ReportError"," Internal error "+� �+": "+a$,3,"6502Em" � ,A% �7� ș "XWimp_ReportError"," "+a$,1,"6502Em" � ,A% �� �=A% � � ݤcsd �ș "OS_GBPB",6,,buffer buffer?(buffer?1+2)=13 =$(buffer+2) & ��readCSD 0 :� � D N�� � � : � � : fs$="ADFS:":disc$="":path$="$":subpath$="":ș "XWimp_ReportError"," Error in reading current directory: "+�$,1,"6502Em":� X b l� I%=0 � 1 vș "OS_Args" � FS% �0ș "OS_FSControl",33,FS%,�20," "),20 � ,,fs$ �8� fs$<>"" � fs$=fs$+":":I%=1 � �"DIR <6502Em$Dir>.^" �� � �ș "OS_GBPB",5,,buffer �buffer?(?buffer+1)=13 �disc$=$(buffer+1) �<� disc$=�34+"Unset"+�34 � disc$="" � disc$=":"+disc$+"." � �path$=�csd �� path$<>"$" � ��SYS "OS_FSControl",11,"@" �� ș "OS_FSControl",0,"^" CSD$=�csd path$=CSD$+"."+path$ � CSD$="$" *+� �path$,7)=�34+"Unset"+�34 � path$="$" 4ș "OS_FSControl",0,path$ >� H Rsubpath$="" \� f p ��initBBC z �!&97000=&A0A0A0A0 �!&97004=&A0A0A0A0 �!&97008=&A0A0A0A0 �!&9700C=&A0A0A0A0 � �joystick%=� � �� R%(7) � �%� BBC$(&7C),ARC$(&78),Elec$(3,13) �� � �I%=0 � 3 ��J%=13 � 0 � -1 � Elec$(I%,J%) � � $ �I%=0 � 7 .�J%=0 � 12 8� BBC$(I%*16+J%) B� L� V�I%=0 � &78 `� ARC$(I%) j� t ~�readkeymaps ��PROCsetkeymap("Default") �$�elkkeys("<6502Em$Res>.ElkKeys") �ș "6502_Register" � �/� Machine$(4),Machine%(4),MachineSprite$(4) � �imagefile%=� �disable_reset=� �default_machine%=0 � �;Machine$(0)="BBC B" : MachineSprite$(0)="OS�1.2" �;Machine$(1)="Master 128" : MachineSprite$(1)="OS�3.2" ;Machine$(2)=" MOS 3.5" : MachineSprite$(2)="OS�3.5" ;Machine$(3)="Compact" : MachineSprite$(3)="OS�5.1" ;Machine$(4)="Electron" : MachineSprite$(4)="OS�1.0" (!Q=�"<6502Em$RomPath>Electron" 2.� Q<>0 � �#Q:Machine%(4)=� � Machine%(4)=� < FQ=�"<6502Em$RomPath>OS1,2" P.� Q<>0 � �#Q:Machine%(0)=� � Machine%(0)=� Z(� Machine%(0)=� � default_machine%=1 d n#Q=�"<6502Em$RomPath>M128.OS3,2" x0� Q<>0 � �#Q : Machine%(1)=� � Machine%(1)=� �8� Machine%(0)=� � Machine%(1)=� � default_machine%=2 � �#Q=�"<6502Em$RomPath>M128.OS3,5" �0� Q<>0 � �#Q : Machine%(2)=� � Machine%(2)=� �H� Machine%(0)=� � Machine%(1)=� � Machine%(2)=� � default_machine%=3 � �&Q=�"<6502Em$RomPath>Compact.OS5,1" �0� Q<>0 � �#Q : Machine%(3)=� � Machine%(3)=� �q� Machine%(0)=� � Machine%(1)=� � Machine%(2)=� � Machine%(3)=� � � 0,"No ROMs found - please run !Rip65Host" � � �Q=OPENIN"<6502Em$Dir>.Code" � �L%=EXT#Q ��CLOSE#Q �DIM code L%+3000 �DIM roms 17*16*1024 "� cmos%(63) : �loadCMOS , � eeprom%(255) : �loadEEPROM 60�WHILE (code AND 15)<>0 : code+=1 : ENDWHILE @ J'indexfile$="":index%=0:newindex%=-1 T ^�!buffer=0 h>�SYS "OS_ReadVarVal","6502Em$SaveScreen",buffer,255 TO ,S$ r�IF LEFT$(S$,3)="Yes" THEN |�DIM sprite 80*1024+300 ��sprite!0=80*1024+256 ��sprite!8=16 �#�SYS "OS_SpriteOp",256+9,sprite ��save_sprite=FALSE � �ELSE � �sprite=0 ��save_sprite=FALSE � �ENDIF � ��readCSD �5FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ � � �assemble �load_options -�OSCLI"LOAD <6502Em$Dir>.Code "+STR$~code �CALL code+!init_addr &�PROCnewmachine 0 : D5� file_xxx � �"IconSprites <6502Em$Res>.file_xxx" N X b l�memory?&F1B1=3 : REM OSFSC v �memory?&FFCE=3 : REM OSFIND � �memory?&FFD1=3 : REM OSGBPB � �memory?&FFD4=3 : REM OSBPUT � �memory?&FFD7=3 : REM OSBGET � �memory?&FFDA=3 : REM OSARGS � �memory?&FFDD=3 : REM OSFILE � � �memory?&FFF1=3 : REM OSWORD �"�memory?&FFE0=&23 : REM OSRDCH � �*FX229,1 � � �patch%=0:�PROCreset(1) �memory?&FFF7=3 : REM OSCLI �memory?&DF89=3 : REM OSCLI �memory?&EF02=3 :REM KEYV *"�memory?&FFF4=&13 : REM OSBYTE 4"�memory?&FFE0=&23 : REM OSRDCH >�memory?&FFCB=&23 H� R \��SRRAM f?(ROMRAM+socket%)=0 psocket%=(socket%-1) � 15 z� � ���killROM(S%) ��I% �?(ROMRAM+S%)=2 : � empty �� I%=0 � 255 � 16 �I%!(roms+romsize%*S%)=0 �� �� � ���loadROM(R$,R%) ��Q% �6� machine%=4 � (socket%=9 � socket%=8) � socket%=7 �S%=socket% socket%=(socket%-1) � 15 -ș "OS_Find",&4E,R$,"6502Em$ROMPath" � Q% ,ș "OS_GBPB",3,Q%,roms+romsize%*S%,&4000 $�#Q% .?(ROMRAM+S%)=R% 8� B L��initROMs V� S% `� S%=0 � 15 j?(ROMRAM+S%)=2 : � 0=RAM t � 1=ROM ~ � 2=empty �� �� � �ݤROMname(S%) �� ?(ROMRAM+S%)=2 � ="Empty" � �N$,I% �I%=roms?(romsize%*S%+7) �� �validROM(S%) � ��I%=0 � 11 �#N$=N$+�roms?(romsize%*S%+&9+I%) �%� roms?(romsize%*S%+&B)=0 � I%=11 �� � N$="RAM "+�~S% � =N$ ( 2ݤvalidROM(S%) <�I% FI%=roms?(romsize%*S%+7) Pg� roms?(romsize%*S%+I%+1)=&28 � roms?(romsize%*S%+I%+2)=&43 � roms?(romsize%*S%+I%+3)=&29 � =� � =� Z=0 d��reset(A%) n� disable_reset � � x �,� A%>=2 � �clearmem(memory,memory+&8000) � � � A%>=1 � �?ier=&80 : � ier �?ier2=&80 : � ier2 � ?Eifr=%10 �?Eier=%0 � ?Elatch=0 �!T1R=&F0<<24 �!T2R=&F0<<24 �!T3R=&F0<<24 �!T4R=&F0<<24 �)�"LOAD <6502Em$Res>.SHEILA "+�~sheila � ?fe10=&22 : � motor off etc sheila!&C0=&7070B7AB " ,�setmemmap 6 ?ACCCON=0 @�setmemmap2 J T#�IF patch%=0 THEN Palette%=TRUE ^ h?f=%100 r |�memory?&FE40=0 ��memory?&FE60=0 � �sheila?&20=2 : � teletext � �.�memory?&E0A4=3 : REM where OSWRCH goes to �.�memory?&E7EB=3 : REM where OSWORD goes to � �7�memory?&E98F=10 : REM default repeat delay (OS1.2) � �/�memory?&FE4E=&0 : REM force power on reset ��memory?&FE6E=&0 � �,�memory?ier=0 : REM force power on reset �memory?ier2=0 �memory?&28E=&80 : REM 32K &�memory?&DA2F=&EA 0�memory?&DA30=&EA :�memory?&355=7 D N'�!pc_store=&8000 << 16 : !a=1 << 24 X�!pc_store=&D9CD << 16 b�!pc_store=&47B1 << 16 l8!pc_store=(memory?&FFFC + (memory?&FFFD << 8)) << 16 v;�!pc_store=(FNpeek(&FFFC) + (FNpeek(&FFFD) << 8)) << 16 �� � � ��BBC �� � � �:ș "XOS_SWINumberFromString",,"ImageDFS_Version" � ; F �-� (F � 1)=0 � dfssupport=� � dfssupport=� � �/� dfssupport ș "ImageDFS_EnteringEmulator" � � �*FX9 �wimp_mode=� !�SYS "6502_ReInit" !?lastmode=255 !ș "Hourglass_Smash" ! (� Assign sound channels & start note !*�sound_setup !4*ș "6502_InstallExitHandler",wimp_mode !> !H� � �err2(wimp_mode) !R !\�!patch_on=((machine%<>4) � (patch%>0) � %1) + (joystick% � %10) + (Cursor% � %100) + (scroll_hack% � %1000) + (�sound_on% � %10000) !f !p!!speed_loc=speed*2000000/5000 !z !��23,16,1,254| : � NOSCROLL !�#ș "OS_Byte",202,0,255 � ,FX202 !�#ș "OS_Byte",247,0,255 � ,FX247 !�ș "OS_Byte",247,255,0 !� !�4ș "OS_Byte",106,&81 : � unlink pointer, shape 1 !�ȗ � 3,255,255,255 !� !�3ș "OS_Byte",202,memory?&25A � %10000,%11101111 !�ș "OS_Byte",118 !� !�hand%=�tapefile$ !�?tape_handle=hand% " "� " "$#� newindex%>=0 index%=newindex% ".:� OSRDCH% � �poke(&FFE0,OSRDCH_loc) � �poke(&FFE0,&23) "8?ROMSEL=1+ROMSEL% "B?Palette=1+Palette% "L�?cursor_on=1+Cursor% "V�setmemmap "`A%=roms "jD%=memory : � R3 "t-ș &600FA,0 : � Wimp_SetWatchdogState Off "~b%=�(code+!start_offset) "�,ș &600FA,1 : � Wimp_SetWatchdogState On "��setmemmap2 "� *FX15 "��PRINTb%:VDU7:Q=GET "�Ȏ b% � "�� 11 "�� �-2 � "�,� hand%<>0 � �#hand%=�max(0,�#hand%-350) "�� "�#� �-1 � volume%+=5 � volume%-=5 "�� volume%>127 � volume%=127 "�� volume%<0 � volume%=0 # �sound_restore:�sound_setup # � # #?� 10 : �:?lastmode=255:�SYS "6502_ReInit":REMmemory?&EC=&E2 #(� 66 : �~!pc_store:Q=� #2� 15 #<!� �-3 � �reset(2) � �reset(0) #F #P� 3 #ZL�PRINT "*****";~!pc_store >>> 16 : PRINT'a?3,y?3 : REPEATQ=GET:UNTILQ=48 #d8�OSCLI"SAVE RAM:$.Memory "+STR$~memory+" +10000 0 0" #n<� �peek(!pc_store >>> 16)=3 � (!pc_store >>> 16)<&C000 � #x]�IF memory?((!pc_store >>> 16)+1)<&80 THEN PRINT"LL"memory?((!pc_store >>> 16)+1) : Q=GET #�A�PRINT TAB(0,0);~FNpeek((!pc_store >>> 16)+1);" ";:REMQ=GET #�$Ȏ �peek((!pc_store >>> 16)+1) � #�� 0 : �osfsc #�� 1 : �osfind #�� 2 : �osgbpb #�� 3 : �osbput #�� 4 : �osbget #�� 5 : �osargs #�� 6 : �osfile #�� &40 : �osword2 #�� &41 : �osbyte2 #�� &80 : �readCMOS #�� &81 : �writeCMOS $� &82 : �readEEPROM $� &83 : �writeEEPROM $� &D0 : �srload $"� &D1 : �srwrite $,� &D2 : �drive $6� &D3 : �boot $@ � &D5 : �back : a?3=0 : �rts $J� &D6 : �mount $T"� &FF : b%=12 : �rts : � *Quit $^� $h� $rȎ (!pc_store >>> 16) � $|� &FFF1,&E7EB : �osword2 $�� &FFE0 : �osrdch $�� &FFD7 : �osbget $�� &FFD4 : �osbput $�� &FFDD : �osfile $�� &FFDA : �osargs $�� &FFD1 : �osgbpb $�=� &FFCE : �osfind :� Open or close a file for byte access $�� &F1B1,&F0E8 : �osfsc $�� $� $�� $� $�� 7 %cb=(y?3)<<8 %cb+=x?3 %cb+=memory %&� I%=0 � 7 %0R%(I%)=cb!(9+I%*4) %:2� (cb?4 � (1<<I%)) <> 0 � R%(I%)=�addr(R%(I%)) %D� %N swi%=cb?0 %Xswi%+=(cb?1)<<8 %bswi%+=(cb?2)<<16 %l %v�IF swi%=&61140 THEN %��base=cb!9 %�,�PRINT"GGG";~memory?(base+6);"GGG":Q=GET %� �ENDIF %� %�8�SYS "OS_SWINumberToString",swi%,buffer,255 TO ,swi$ %�!�PRINT"Opcode 7 ";~swi%:Q=GET %�� dfssupport � %� %� Ȏ swi% � %� %�'� &61140 : �"XPRESDFS_FDCOperation" %� base=cb!9 %� Ȏ memory?base � & � 0,1,2,3 & � &21 : memory?base=0 & � &4B : memory?base=1 & � &E0 : memory?base=2 &* � &EA : memory?base=3 &4 &> �"Drive ";memory?base;" " &H � &R/� memory?(base+6)=&80 � memory?(base+6)=&53 &\/� memory?(base+6)=&A0 � memory?(base+6)=&4B &f'�PRINT"FDCOp ";memory?(base+6);" " &p=� memory?(base+11)<>0 � memory?(base+9)=memory?(base+9)+1 &z3memory?(base+9)=(memory?(base+9) � %11111) � 32 &�^� memory?(base+6)<>&81 � ș "XImageDFS_OSWORD7F",,base � 256,base � 256,memory � R%(0) ; F &� &�)� &61141 : � "XPRESDFS_ReadFDCStatus" &� &�(� &61142 : � "XPRESDFS_SetDFSdrives" &��PRINT~R%(0),~R%(1) &�+�SYS "DFS_RISCOSToBBCDrive",R%(0),R%(1) &� &�&� &61143 : � "XPRESDFS_SetDFSStep" &�)� R%(0)=40 or 80 for *STEP40, *STEP80 &� &� &�zș (swi% � 2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) � R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) ; F ' '� ' '$� '.zș (swi% � 2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) � R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7) ; F '8� 'B 'L� cb?3<>0 � 'V� I%=0 � cb?3-1 '`2� (cb?5 � (1<<I%)) <> 0 � R%(I%)=R%(I%)-memory 'jcb!(9+I%*4)=R%(I%) 't� '~� '� '� '� '�$� (F � 1)<>0 � (swi% � 2^17)=0 � '�A%=R%(0) '��swi_error '�� '� '�� (F � 1)<>0 � cb?8<>0 � '�err=cb?6 '�err+=(cb?7)<<8 '�err+=memory ( J%=� ( err?0=0 (� I%=0 � cb?8-2 (err?(I%+1)=R%(0)?I% ((� err?I%=0 � J%=� (2� (<� J%=� � err?(cb?8-1)=0 (F� (P (Z!!pc_store=!pc_store+(1 << 16) (d?f=?f � %1100011 (n$� (F � 1)<>0 � ?f=?f � %01000000 (x$� (F � 2)<>0 � ?f=?f � %00000001 (�$� (F � 4)<>0 � ?f=?f � %00000010 (�$� (F � 8)<>0 � ?f=?f � %10000000 (� (�� (� (� � 12: (� (� (� (��PRINT"b% = ";b% : Q=GET (� (�� (� ) �b%=12 ) )6� hand%<>0 � ș "XOS_Find",0,hand% : � CLOSE#hand% )" ),ș "OS_Byte",202,FX202 )6ș "OS_Byte",247,FX247 )@ )J2ș "OS_Byte",106,1 : � relink pointer, shape 1 )T )^ *Set Key$11 "<6502Em$Key11>" )h *Set Key$12 "<6502Em$Key12>" )r )|ș "6502_RemoveExitHandler" )� )�� Restore sound channels )��sound_restore )� )�� sprite<>0 � )�sprite!0=80*1024+256 )�sprite!8=16 )�"ș "XOS_SpriteOp",256+9,sprite )�?ș "XOS_SpriteOp",256+16,sprite,"BBCScreen",1,0,0,1279,1023 )�� )� )�ș "Wimp_SetMode",wimp_mode )� **FX15,0 * *.� dfssupport ș "ImageDFS_LeavingEmulator" *& *0� *: *Dݤmax(A%,B%) *N� A%>B% � =A% � =B% *X=0 *b��pullpc *lsp?3=sp?3+1 *v"pc_store?2=?(memory+&100+sp?3) *�sp?3=sp?3+1 *�"pc_store?3=?(memory+&100+sp?3) *�� *� *���assemble *�a=memory-&100+0 *�a=memory-&100+0 *�x=memory-&100+4 *�y=memory-&100+8 *�f=memory-&100+12 *�sp=memory-&100+16 *�pc_store=memory-&100+20 *�T1R=memory-&100+32 +T2R=memory-&100+40 +T3R=memory-&100+48 +T4R=memory-&100+56 + screenR=memory-&100+64 +*ifr=memory-&100+76 +4ier=memory-&100+77 +>ifr2=memory-&100+78 +Hier2=memory-&100+79 +Rrom=memory-&100+96 +\ +fROMSEL=memory-&100+92 +promsel=memory-&100+96 +zPalette=memory-&100+164 +�ROMRAM=memory-&100+100 +�(patch_on=memory-&100+176:!patch_on=0 +�lastmode=memory-&100+178 +�fe10=memory-&100+179 +�tape_handle=memory-&100+117 +�tape_count=memory-&100+180 +�ACCCON=memory-&100+172 +�Elatch=memory-&100+188 +�Eifr=memory-&100+189 +�Eier=memory-&100+190 +�ROMint=memory-&100+191 +�speed_loc=memory-&100+196 +� ,P%=code , [OPT2 ,.Oa ,$ EQUD 0 ,..Ox ,8 EQUD 0 ,B.Oy ,L EQUD 0 ,V.Of ,` EQUD 0 ,j.Osp ,t EQUD 0 ,~.Opc_store ,� EQUD 0 ,�.start_offset ,� EQUD 0 ,� .trace ,� EQUD 0 ,�.trace2 ,� EQUD 0 ,�.init_addr ,� EQUD 0 ,� .crt_addr ,� EQUD 0 ,�.T1_addr - EQUD 0 - .ifr_addr - EQUD 0 -.column_counter_addr -( EQUD 0 -2.ROMSEL_addr -< EQUD 0 -F.Palette_addr -P EQUD 0 -Z.speed_addr -d EQUD 0 -n.elite_addr -x EQUD 0 -�(.opco_addr EQUD 0 -�(.bcd_addr EQUD 0 -�(.sheila_writetab_addr EQUD 0 -�(.sheila_readtab_addr EQUD 0 -�(.sound_vectors_addr EQUD 0 -�(.patch_addr EQUD 0 -�] -�� -� -� ��rts -�sp?3=sp?3+1 -�!pc_store?2=memory?(&100+sp?3) -�sp?3=sp?3+1 .!pc_store?3=memory?(&100+sp?3) .!!pc_store=!pc_store+(1 << 16) .�PRINT~!pc_store:Q=GET ."� .,!!pc_store=&8004 << 16 : � RTS .6 .@#�pc_store?2=?(sp?3+&101+memory) .J#�pc_store?3=?(sp?3+&102+memory) .T�sp?3=sp?3 + 2 .^� .h .r��osfile .|�PRINT"OSFILE "a?3:Q=GET .�addr=memory+x?3+(y?3)*256 .�Ȏ a?3 � .�� 0 .� a%=a?3 .�)b$=�addpath($(�addr(addr!0 � &FFFF))) .� c%=addr!2 .� d%=addr!6 .�e%=�addr((addr!10 � &FFFF)) .�f%=�addr((addr!14 � &FFFF)) .��PRINT~a%,b$,~c%,~d%,e%,~f% .�,ș "XOS_File",a%,b$,c%,d%,e%,f% � A% ; F .�#� (F � 1)=0 � �rts � �swi_error .�� 5 /b$=$(�addr(addr!0 � &FFFF)) /Aș "XOS_File",13,�add_(b$),,,�_path(b$) � A%,,c%,d%,e%,f% ; F /� (F � 1)=1 � /&�swi_error /0� /: a?3=A% /D addr!2=c% /N addr!6=d% /Xaddr!10=e% /baddr!14=f% /l�rts /v� /�� 6 /�b$=$(�addr(addr!0 � &FFFF)) /�6ș "XOS_File",6,�addpath(b$) � A%,,c%,d%,e%,f% ; F /�� (F � 1)=1 � /��swi_error /�� /� a?3=A% /� addr!2=c% /� addr!6=d% /�addr!10=e% /�addr!14=f% /��rts /�� 0 0 � 255 0 a%=a?3 0 b$=$(�addr(addr!0 � &FFFF)) 0*!�B%=(addr!0 AND &FFFF)+memory 04c%=�addr(addr!2 � &FFFF) 0>1� (addr!2 � &FFFF0000)=&FFFE0000 � c%-=&13000 0H d%=addr?6 0RY� d%<>0 � ș "XOS_File",13,�add_(b$),,,�_path(b$) � ,,c%: d%=0 : c%=�addr(c% � &FFFF) 0\9ș "XOS_File",13,�add_(b$),,,�_path(b$) � ,,,,length% 0f1� c%+length%>memory+&8000 � c%<memory+&8000 � 0plength%=memory+&7FFF-c% 0z3ș "XOS_Find",&4D,�add_(b$),�_path(b$) � A% ; F 0�T� (F � 1)=0 � ș "XOS_GBPB",4,A%,c%,length%:ș "XOS_Find",0,A%:�rts � �swi_error 0�� 0�Dș "XOS_File",12,�add_(b$),c%,0,�_path(b$) � A%,,c%,d%,e%,f% ; F 0� a?3=A% 0� addr!2=c% 0� addr!6=d% 0�addr!10=e% 0�addr!14=f% 0�#� (F � 1)=0 � �rts � �swi_error 0�� 0�(�PRINT~a%,b$,~c%,~d%,~memory : Q=GET 0�I�SYS "XOS_File",12,FNadd_(b$),c%,0,FN_path(b$) TO A%,,c%,d%,e%,f% ; F 0� a?3=1 1�a?3=A% 1�addr!2=c% 1�addr!6=d% 1$�addr!10=e% 1.�addr!14=f% 183�IF (F AND 1)=0 THEN PROCrts ELSE PROCswi_error 1B�PRINT~!pc_store : Q=GET 1L 1V�"OSFILE ";a?3 : Q=� 1`� 1j� 1t 1~��swi_error 1��A$ 1� A$="" 1�� I%=0 � 253 1�:�IF A%?I%=0 THEN I%=260 ELSE A$=A$+CHR$(A%?I%):PRINTA$ 1�memory?(&102+I%)=A%?(I%+4) 1�� A%?(I%+4)=0 � I%=253 1�� 1��A$=A$+CHR$13 1�memory?&100=0 1�memory?&101=?A% 1��$(memory+&102)=A$ 1�!pc_store=&100 << 16 2 � 2 2��brk(A%,A$) 2A$=A$+�0 2(� I%=0 � �A$-1 22!memory?(&102+I%)=��A$,I%+1,1) 2<� 2Fmemory?&100=0 2Pmemory?&101=A% 2Z!pc_store=&100 << 16 2d� 2n 2x$ݤmin(A%,B%) � A%<B% � =A% � =B% 2�=0 2� 2���osgbpb 2��PRINT"OSGBPB";a?3 : Q=GET 2�addr%=memory+x?3+(y?3 << 8) 2� b%=?addr% 2�c%=addr%!1 2�d%=addr%!5 2�e%=addr%!9 2� 2� 2� � a?3=9 � 2� 3^ ș "XOS_GBPB",a?3,fs$+disc$+path$+subpath$,�addr(c% � &FFFF),b%,e%,d%,0 � A%,,,d%,e% ; F 3 � (F � 1)=0 � 3 ?addr%=d% 3" addr%!9=e% 3,5 � (F � %10)=0 � ?f=(?f � %11111110) � ?f=?f � 1 36 �rts 3@ � 3J �swi_error 3T � 3^ 3h� 3r 3|> ș "OS_FSControl",11,fs$ : � set temporary filing system 3�= ș "OS_FSControl",0,disc$+path$+subpath$ : � change dir 3� 3�Y � (a?3=3 � a?3=4) � c%<&8000 � c%+e%>&8000 � e%=&8000-c% : � stop overflow at &8000 3� 3�E ș "XOS_GBPB",a?3,b%,�addr(c% � &FFFF),d%,e% � A%,,c%,d%,e% ; F 3� 3� ș "OS_FSControl",19 3� 3� � (F � 1)=0 � 3� addr%!1=c%-memory 3� addr%!5=d% 3� addr%!9=e% 3�5 � (F � %10)=0 � ?f=(?f � %11111110) � ?f=?f � 1 4 �rts 4 � 4 �swi_error 4& � 40 4:� 4D� 4N 4X��osargs 4bȎ a?3 � 4l � 0 : 4v� y?3<>0 � 4�&ș "XOS_Args",a?3,y?3 � A%,,L% ; F 4�3� (F � 1)=0 � memory!(x?3)=L%:�rts � �swi_error 4�� 4�a?3=4 : �rts 4�� 4� � 1 : 4�/ș "XOS_Args",a?3,y?3,memory!(x?3) � A% ; F 4�#� (F � 1)=0 � �rts � �swi_error 4� � 2 : 4�&ș "XOS_Args",a?3,y?3 � A%,,L% ; F 4�3� (F � 1)=0 � memory!(x?3)=L%:�rts � �swi_error 4�� 255 : 4�"ș "XOS_Args",a?3,y?3 � A% ; F 5#� (F � 1)=0 � �rts � �swi_error 5 : �rts 5� 5 � 5* 54ݤupper(A$) 5> �I%,B$ 5H�I%=1 � �A$ 5RP� �A$,I%,1)>="a" � �A$,I%,1)<="z" � B$=B$+�(��A$,I%,1)-32) � B$=B$+�A$,I%,1) 5\� 5f=B$ 5p 5z ��quit 5�� � 5�ș "X6502_DeRegister" � A% 5�,� A%=0 � ș "XOS_Module",4,"6502Support" 5�ș "Wimp_CloseDown" 5�� 5�� 5� 5���snap_save(F$) 5Ԃ� �F$,".")=0 � �F$,":")=0 � �F$,6)<>"<Wimp$" � ș "Wimp_ReportError"," To save, drag the file icon to a directory viewer":� 5� �Q,I% 5� 5�length%=&10200-&8000 5�!buffer=xfer%:buffer!4=4 6"ș "Wimp_GetIconState",,buffer 62� (buffer!24 � 2^21)<>0 � length%=&10200-&4000 6!buffer=xfer%:buffer!4=5 6$"ș "Wimp_GetIconState",,buffer 6.,� (buffer!24 � 2^21)<>0 � length%=&10200 68 6B Q=�F$ 6L�#Q,"BBC Snapshot101" 6V(ș "OS_GBPB",2,Q,memory-&200,length% 6`�#Q 6j"�"SetType "+F$+" "+�~filetype% 6t� 6~ 6���snap_load(file$) 6�%� file%,I%,ok%,machine$,M%,patch$ 6�file%=�(file$) 6�type$=�#file% 6�$� �#file%=0 � type$="BBC Script" 6�D� �type$,64)=�48,�0)+"!BBC tape file!"+�0 � type$="BBC Tapefile" 6� 6�Ȏ type$ � 6� 6�� "BBC Tapefile" 6� 6��#file% 7 tapefile$=file$ 7 7� "BBC Script" 7 7(� � 72 7<k� � � : � � : ș "XWimp_ReportError"," Error in script: "+�$,3,"6502Em" � ,A%:� A%=2 � �quit � �poll 7F 7Pscroll_hack%=� 7Z 7d 7n � �#file% � 7x A$="" 7� � 7� A$=�upper(�#file%) 7� � 7� � 7� B$=�A$,�A$," ")-1) 7� ok%=� 7� Ȏ B$ � 7� � "PALETTE" 7�/ � �A$,"ON") � Palette%=� � Palette%=� 7� � "CURSOR" 7�- � �A$,"ON") � Cursor%=� � Cursor%=� 7� � "EXACTSPEED" 7�9 � �A$,"ON") � �newspeed(100) � �newspeed(10000) 8 � "SOUND" 81 � �A$,"ON") � sound_on%=� � sound_on%=� 8 � "DISABLETAPE" 8" �disableCFS 8, � "SCROLLHACK" 86 scroll_hack%=� 8@ � "KEYMAP" 8J K$=�A$,�A$-�A$," ")) 8T �setkeymap(K$) 8^ � "PATCH" 8h � patches%<>0 � 8r patch%=0 8| �I%=1 � patches% 8�% patch$=�A$,�patch$(I%)) 8� �strip(patch$) 8�+ � �upper(patch$(I%))=patch$ � 8� patch%=I% 8� �loadpatch 8� � 8� � 8� � 8� � "SPEED" 8� �newspeed(��A$,�A$-6)) 8� � "INDEXFILE" 8� T$=�A$,�A$-10) 8�# T%=�(�leaf(file$)+"."+T$) 9d � T%<>0 � �#T%:indexfile$=�leaf(file$)+"."+T$:index%=0 � � 1,"Index File "+T$+" not found" 9 � "TAPEFILE" 9 T$=�A$,�A$-9) 9&# T%=�(�leaf(file$)+"."+T$) 90Y � T%<>0 � �#T%:tapefile$=�leaf(file$)+"."+T$ � � 1,"Tape File "+T$+" not found" 9: � "LOADROM" 9D L$=�A$,�A$-8) 9N � �L$,":")=0 � 9X+ �loadROM(�leaf(file$)+"."+L$,1) 9b � 9l �loadROM(L$,1) 9v � 9� � "LOADRAM" 9� L$=�A$,�A$-8) 9� � �L$,":")=0 � 9�+ �loadROM(�leaf(file$)+"."+L$,0) 9� � 9� �loadROM(L$,1) 9� � 9� � "KILLROM" 9� L$=�A$,�A$-8) 9� � I%=0 � 15 9�8 � ��upper(�ROMname(I%)),�L$)=L$ � �killROM(I%) 9� � 9� � "MACHINE" : machine$=�A$,�A$-8) : �strip(machine$) : Ȏ machine$ � : � "BBC","BBCB","BBC B" :* M%=0 :4- � "MASTER","MASTER128","MASTER 128" :> M%=1 :H- � "OS3.5","OS 3.5","OS3,5","OS 3.5" :R M%=2 :\& � "COMPACT","MASTER COMPACT" :f M%=3 :p � "ELECTRON","ELK" :z M%=4 :� :�8 �#file%:� 1,"Unknown machine '"+machine$+"'" :� � :�2 � M%<>machine% � machine%=M%:�newmachine :� :� ok%=� :� � :� � ok% � :� � �#file% � :� A$="" :� � :� A$=�upper(�#file%) :� � ; � ;� � �i("PATCH") � �i("PALETTE") � �i("MACHINE") � �i("INDEXFILE") � �i("TAPEFILE") � �i("KEYMAP") � �i("CURSOR") � �i("EXACTSPEED") � �i("DISABLETAPE") � �i("LOADROM") � �i("LOADRAM") � �i("KILLROM") � �i("SOUND") � �i("SCROLLHACK") � �i("SPEED") ; ;$ �#file% ;. � A$="" � ;8 A$=�leaf(file$) ;B0 �file_load(A$+"."+�A$,�A$-��leaf(A$)-2)) ;L � ;V4 � �A$,5)="CHAIN" � �A$,1)="*" � �A$," ")>0 � ;` osrdch$=A$+�13 ;j �reset(2) ;t osrdch_count%=0 ;~# OSRDCH_loc_tmp=OSRDCH_loc ;� OSRDCH_loc=3 ;�( �newpath(�leaf(file$)+".JUNK") ;� � ;�) �file_load(�leaf(file$)+"."+A$) ;� � ;� � ;�� "BBC Snapshot " : ;� � �#file%=&10110 � ;�/ ș "OS_GBPB",4,file%,memory-&100,&10100 ;� �#file%=&10110-&200 ;�( ș "OS_GBPB",4,file%,sheila,&100 ;� � <