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
;� �
<