Home » Archimedes archive » Archimedes World » AW-1996-08.adf » !6502DEm_6502Dem » !6502Dem/!RunImage
!6502Dem/!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 » Archimedes World » AW-1996-08.adf » !6502DEm_6502Dem |
Filename: | !6502Dem/!RunImage |
Read OK: | ✔ |
File size: | B178 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM > !RunImage 20REM 6502Em (desktop frontend for binaries) 30REM (c) Michael and Anne Borcherds, 1995 40version$="1.50D (29th May 1996)" 60ONERRORSYS"XWimp_CloseDown":SYS"XWimp_ReportError"," Fatal internal error "+STR$ERL+": "+REPORT$,1,"Z80Em":QUIT 80osword7F_drive%=1 90osword72_drive%=0 110top%=HIMEM 120useMEMC%=FALSE 130IFuseMEMC%THEN 150HIMEM=HIMEM-19*32*1024 160memory=HIMEM+2*32*1024 170roms=memory+32*1024 180rom=memory-&100+96 200ELSE 220HIMEM=HIMEM-(64+64)*1024 230memory=HIMEM+64*1024 250ENDIF 270sheila=memory-&200 290PROCreadmemmap 310filetype%=&BBC 340LIBRARY"<6502Em$Res>.Sound7a" 360PROCtemplates 370PROCinitBBC 380PROCsound_init 390PROCnewmachine 400PROCinit 410PROCpoll 430END 460DEFPROCinstall(sprite$) 470LOCALsx%,sy%,sm%,px%,py% 480DIMtext_buff&100,sprite_buff&100 490SYS"Wimp_SpriteOp",40,,sprite$TO,,,sx%,sy%,,sm% 500SYS"OS_ReadModeVariable",sm%,4TO,,px%:sx%=sx%<<px% 510SYS"OS_ReadModeVariable",sm%,5TO,,py%:sy%=sy%<<py% 520!q%=-1 530q%!4=0:q%!8=-16:q%!12=q%!4+sx%:q%!16=20+sy% 550q%!20=&1700310B 570!(q%+24)=text_buff 580!(q%+28)=sprite_buff 590$text_buff=sprite$ 600$sprite_buff="S"+sprite$ 610!(q%+32)=&100 620SYS"Wimp_CreateIcon",,q%TO!q% 630bar_hand=!q% 640ENDPROC 660DEFPROCreinstall(sprite$) 670$sprite_buff="S"+sprite$ 680$text_buff=sprite$ 690buffer!0=-2 700buffer!4=bar_hand 730buffer!8=&00800080 740buffer!12=&00800080 750SYS"Wimp_SetIconState",,buffer 770buffer!8=0 780buffer!12=&00800080 790SYS"Wimp_SetIconState",,buffer 800ENDPROC 820DEFPROCtemplates 830DIMt 4:$t="TASK" 840SYS"Wimp_Initialise",200,!t,"6502Em"TORO%,hand% 850DIMq%256,q2%256,iconmenu%300,optionmenu%400,miscmenu%200,rommenu%800,machine_menu%200,oscli_menu 20 860DIMpokemenu%50,pokevalid%12,poketext%12,drag 40 870DIMtemp_regs 12*4,buffer&100 880PROCinstall("OS�1.2") 900PROCreadpatches 920IFRO%>299THEN 930SYS"OS_Byte",161,140TO,,t%:THREED%=-(t%AND 1) 940IFTHREED%=TRUETHENSYS"Wimp_OpenTemplate",,"<6502Em$Res>.Template3D"ELSESYS"Wimp_OpenTemplate",,"<6502Em$Res>.Templates" 950SYS"Wimp_LoadTemplate",,-1,,,-1,"info"TO,A%,B% 960SYS"Wimp_LoadTemplate",,-1,,,-1,"xfer_send"TO,C%,D% 970SYS"Wimp_LoadTemplate",,-1,,,-1,"xfer_send2"TO,E%,F% 980ELSE 990SYS"Wimp_OpenTemplate",,"<6502Em$Res>.Templates" 1000A%=700:B%=300:C%=400:D%=350:E%=C%:F%=D% 1010ENDIF 1020DIMbuffer2 A%,icon3 B%,xfer1 C%+4,xfer2 D%,xfer3 E%+4,xfer4 F% 1030SYS"Wimp_LoadTemplate",,buffer2,icon3,icon3+B%,-1,"info" 1040SYS"Wimp_LoadTemplate",,xfer1,xfer2,xfer2+D%,-1,"xfer_send" 1050SYS"Wimp_LoadTemplate",,xfer3,xfer4,xfer4+F%,-1,"xfer_send2" 1060SYS"Wimp_CloseTemplate" 1070SYS"Wimp_CreateWindow",,xfer1TOA%:xfer%=A% 1080SYS"Wimp_CreateWindow",,xfer3TOA%:xfer2%=A% 1090SYS"Wimp_CreateWindow",,buffer2TOA%:info%=A% 1110!buffer=info% 1120buffer!4=9 1130SYS"Wimp_GetIconState",,buffer 1140$(buffer!28)=version$+CHR$0 1160!buffer=info% 1170buffer!4=11 1180SYS"Wimp_GetIconState",,buffer 1190OSCLI"Load <6502Em$Res>.SerialNo "+STR$~(buffer!28) 1200ENDPROC 1220DEFPROCinit 1230SYS"OS_GetEnv"TOA$ 1240IFRIGHT$(A$,1)=" "THEN 1250I%=0 1260REPEATI%+=1:UNTILMID$(A$,LENA$-I%,1)<>" " 1270A$=LEFT$(A$,LENA$-I%) 1280ENDIF 1290IFRIGHT$(A$,1)=CHR$34THENA$=LEFT$(A$,LENA$-1) 1300IFLEFT$(A$,1)=CHR$34THENA$=RIGHT$(A$,LENA$-1) 1310I%=0 1320REPEATI%+=1:UNTILMID$(A$,LENA$-I%,1)=" "ORI%=LENA$ 1330A$=RIGHT$(A$,I%) 1340IFFNupper(MID$(A$,LENA$-9,10))<>".!RUNIMAGE"THENPROCsnap_load(A$):PROCBBC 1360ENDPROC 1380DEFPROCpoll 1390ONERRORIFFNreport(REPORT$,ERR<>1)=2THENPROCquit 1410REPEAT 1420mask%=%1100000110011 1430PROCresetmemmap 1440SYS"Wimp_Poll",mask%,q%TOaction% 1450PROCsetupmemmap 1470CASEaction%OF 1480WHEN2:SYS"Wimp_OpenWindow",,q% 1490WHEN3:SYS"Wimp_CloseWindow",,q% 1500WHEN6:PROCclick 1510WHEN7:PROCsave 1530WHEN9:PROCdecodemenu 1540WHEN17,18:PROCmessage 1550ENDCASE 1570UNTILFALSE 1580ENDPROC 1600DEFPROCmessage 1610CASEq%!16OF 1620WHEN0:PROCquit 1870WHEN3 1880SYS"OS_WriteN",q%+44TOA$ 1890CASEq%!40OF 1900WHENfiletype%:PROCsnap_load(A$) 1910WHEN&FFB,&FFE:PROCfile_load(A$):PROCBBC 1920ENDCASE 1930WHEN5 1940CASEq%!40OF 1960WHENfiletype% 1970q%!16=4:q%!12=q%!8:SYS"Wimp_SendMessage",17,q%,q%!20 1980SYS"OS_WriteN",q%+44TOA$ 1990PROCsnap_load(A$):PROCBBC 2010OTHERWISE 2020IFNOTINKEY-1THEN 2030SYS"OS_WriteN",q%+44TOA$ 2040F$=A$ 2050SYS"OS_File",5,F$TOtype%,,load%,exec%,length% 2060IFtype%=2ANDLEFT$(RIGHT$(F$,LENF$-LENFNleaf(F$)-1),1)<>"!"THENENDPROC 2070IFtype%=2THENF$=A$+".!Run":SYS"OS_File",5,F$TOtype%,,load%,exec%,length%:IF(load%AND&FFF00)=&BBC00THENq%!16=4:q%!12=q%!8:SYS"Wimp_SendMessage",17,q%,q%!20:PROCsnap_load(F$):PROCBBC:ENDPROC 2080IFtype%=0THENF$=A$+"."+RIGHT$(A$,LENA$-LENFNleaf(A$)-2):SYS"OS_File",5,F$TOtype%,,load%,exec%,length% 2110IF((load%>>>16)=0OR(load%>>>16)=&FFFFOR(load%>>>16)=&00FF)AND(load%AND&FFFF)<&8000AND type%=1THEN 2120q%!16=4:q%!12=q%!8:SYS"Wimp_SendMessage",17,q%,q%!20 2130PROCfile_load(F$) 2140PROCBBC 2150ENDIF 2160ENDIF 2170ENDCASE 2180WHEN&400C1 2190ENDCASE 2200ENDPROC 2310DEFPROCclick 2320mx%=q%!0 2330my%=q%!4 2340mb%=q%!8 2350h%=q%!12 2360i%=q%!16 2370IFh%=-2THEN 2380IFmb%=2THENPROCmenus:SYS"Wimp_CreateMenu",,iconmenu%,mx%-64,96+8*44 2390IFmb%=1THEN 2400PROCreadCSD 2410PROCBBC 2420ENDIF 2430IFmb%=4THENPROCBBC 2440ENDIF 2450IFi%=3AND(h%=xfer%ORh%=xfer2%)THENSYS"Wimp_CreateMenu",-1 3010ENDPROC 3040DEFPROCmenus 3050LOCALP% 3060PROCmenuheader(iconmenu%,"6502Em",LEN"Single Task "*16+12) 3070PROCmenuitem(0,info%,&07000001,"Info") 3080PROCmenuitem(0,optionmenu%,&07000001,"Options") 3090PROCmenuitem(-(patch%<>0),patchmenu%,&07000001OR-(2^22)*(patches%=0),"Patch") 3100PROCmenuitem(0,rommenu%,&07000001,"ROMs") 3110PROCmenuitem(0,miscmenu%,&07000001,"Misc") 3140PROCmenuitem(0,xfer%,&07000001OR(2^22),"Save") 3160PROCmenuitem(0,xfer2%,&07000001OR(2^22),"Sprite") 3200PROCmenuitem(&80,-1,&07000001,"Quit") 3220buffer!0=0:buffer!4=0:buffer!8=0 3230SYS"OS_ReadVarVal","6502Em$Keymap",buffer,255TO,S$ 3240keymap%=FNkeymap(S$) 3260IFkeymaps%<>0THEN 3270PROCmenuheader(keysmenu%,"Keymaps",12*16+12) 3280FORI%=1TOkeymaps% 3290PROCmenuitem(-&80*(I%=keymaps%)-(keymap%=I%),-1,&07000001,keymap$(I%)) 3300NEXT 3310ENDIF 3330IFpatches%<>0THEN 3340PROCmenuheader(patchmenu%,"Patches",12*16+12) 3350FORI%=1TOpatches% 3360PROCmenuitem(-&80*(I%=patches%)-(patch%=I%),-1,&07000001,patch$(I%)) 3370NEXT 3380ENDIF 3400PROCmenuheader(rommenu%,"Protected?",12*16+12) 3410FORI%=15TO0STEP-1 3420PROCmenuitem(-(?(ROMRAM+I%)<>0)-&80*(I%=0),-1,&07000001,FNROMname(I%)) 3430NEXT 3450PROCmenuheader(miscmenu%,"Misc",LEN"Disable Tape "*16+12) 3460PROCmenuitem(0,-1,&07000001,"Read CSD") 3470PROCmenuitem(0,-1,&07000001,"Reset") 3480IFmachine%=0ORmachine%=4THEN 3490PROCmenuitem(&80,-1,&07000001,"Disable Tape") 3500ELSE 3510PROCmenuitem(&80,-1,&07000001OR2^22,"Disable Tape") 3520ENDIF 3540PROCmenuheader(optionmenu%,"Options",LEN"Save Options "*16+12) 3560PROCmenuitem(0,keysmenu%,&07000001OR-(2^22)*(keymaps%=0),"Keymap") 3580PROCmenuitem(-ROMSEL%,-1,&07000001,"Paged ROMs") 3590PROCmenuitem(-Palette%,-1,&07000001,"Palette") 3600PROCmenuitem(-Cursor%,-1,&07000001,"Cursor") 3610PROCindirecteditem(-Oscli%,-1,%100000001,"Pass on OSCLI",oscli_menu) 3620PROCmenuitem(-exact%,-1,&07000001,"Exact Speed") 3630PROCmenuitem(0,machine_menu%,&07000001,"Machine") 3640PROCmenuitem(-sound_on%,-1,&07000001,"Sound") 3650PROCmenuitem(-scroll_hack%,-1,&07000001,"Scroll Hack") 3660PROCmenuitem(-file_xxx,-1,&07000001,"file_xxx") 3670PROCmenuitem(0,-1,&07000001,"Default") 3680PROCmenuitem(&80,-1,&07000001,"Save Options") 3700PROCmenuheader(machine_menu%,"Machine",LEN"Master 128 "*16+12) 3710PROCmenuitem(-(machine%=0),-1,&07000001OR-(2^22)*(Machine%(0)=0),Machine$(0)) 3720PROCmenuitem(-(machine%=1),-1,&07000001OR-(2^22)*(Machine%(1)=0),Machine$(1)) 3730PROCmenuitem(-(machine%=2),-1,&07000001OR-(2^22)*(Machine%(2)=0),Machine$(2)) 3740PROCmenuitem(-(machine%=3),-1,&07000001OR-(2^22)*(Machine%(3)=0),Machine$(3)) 3750PROCmenuitem(&80-(machine%=4),-1,&07000001OR-(2^22)*(Machine%(4)=0),Machine$(4)) 3770ENDPROC 3790DEFPROCmenuheader(A%,B$,G%) 3800P%=A% 3810$P%=B$+CHR$13 3820P%?12=7:P%?13=2:P%?14=7:P%?15=0 3830P%!16=G%:P%!20=44:P%!24=0 3840P%+=28 3850ENDPROC 3870DEFPROCmenuitem(A%,B%,C%,D$) 3880P%!0=A% 3890P%!4=B% 3900P%!8=C% 3910$(P%+12)=D$+CHR$13 3920P%+=24 3930ENDPROC 3950DEFPROCindirecteditem(A%,B%,C%,D$,E%) 3960P%!0=A% 3970P%!4=B% 3980P%!8=C%+&07000000 3990P%!12=E% 4000P%!16=0 4010P%!20=LEND$+1 4020$E%=D$+CHR$13 4030P%+=24 4040ENDPROC 4060DEFPROCdecodemenu 4070CASE!q%OF 4080WHEN0 4090WHEN1 4100IFq%!4>-1THEN 4110CASEq%!4OF 4120WHEN0 4130IFq%!8<>-1THENPROCsetkeymap(keymap$(q%!8+1)) 4140WHEN1:ROMSEL%=NOTROMSEL% 4150WHEN2:Palette%=NOTPalette% 4160WHEN3:Cursor%=NOTCursor% 4170WHEN4:Oscli%=NOTOscli% 4180WHEN5:exact%=NOTexact% 4190WHEN6:IFq%!8<>-1AND q%!8<>machine%THENmachine%=q%!8:PROCnewmachine 4200WHEN7:sound_on%=NOTsound_on% 4210WHEN8:scroll_hack%=NOTscroll_hack% 4220WHEN9:file_xxx=NOTfile_xxx:IFfile_xxxTHENOSCLI"IconSprites <6502Em$Res>.file_xxx"ELSEOSCLI"IconSprites <6502Em$Res>.no_xxx" 4230WHEN10:PROCdefault_options:PROCnewmachine 4240WHEN11:PROCsave_options 4250ENDCASE 4260ENDIF 4270WHEN2 4280IFq%!4=-1THEN 4290patch%=0 4300ELSE 4310IFpatch%<>q%!4+1THENpatch%=q%!4+1:PROCloadpatch 4320ENDIF 4330WHEN3 4340IFq%!4>-1THEN 4350S%=15-(q%!4AND 15) 4360IFFNvalidROM(S%)OR?(ROMRAM+S%)=2THEN 4370IF?(ROMRAM+S%)=2THEN?(ROMRAM+S%)=0ELSE?(ROMRAM+S%)=1-?(ROMRAM+S%) 4380ELSE 4390?(ROMRAM+S%)=2 4400ENDIF 4410ENDIF 4420WHEN4 4430IFq%!4>-1THEN 4440CASEq%!4OF 4450WHEN0:PROCreadCSD 4460WHEN1:PROCreset(1) 4470WHEN2:PROCdisableCFS 4480ENDCASE 4490ENDIF 4500WHEN5 4510WHEN6 4520OTHERWISE:PROCquit 4530ENDCASE 4540SYS"Wimp_GetPointerInfo",,q% 4550IF(q%!8AND%1)>0THENPROCmenus:SYS"Wimp_CreateMenu",,iconmenu%,mx%-iconmenu%!16/2-24,16*4+44*2+12 4560ENDPROC 4580DEFPROCmenuitem2(A%,B%,C%,D%,E%,F%) 4590P%!0=A% 4600P%!4=B% 4610P%!8=C% 4620P%!12=D% 4630P%!16=E% 4640P%!20=F% 4650P%+=24 4660ENDPROC 4680DEFFNcount(A$,B$) 4690LOCALI%,C% 4700FORI%=1TOLENA$ 4710IFMID$(A$,I%,1)=B$THENC%+=1 4720NEXT 4730=C% 4750DEFFNletter(A$) 4760LOCALI%,J% 4770FORI%=1TOLENA$ 4780IFINSTR("ABCDEFabcdef",MID$(A$,I%,1))THENJ%=TRUE:I%=LENA$ 4790NEXT 4800=J% 4830DEFPROCsave 4840IFsolid%THENSYS"DragASprite_Stop" 4850K$="" 4860IFsave_sprite%THEN!drag=xfer2%ELSE!drag=xfer% 4870drag!4=1 4880SYS"Wimp_GetIconState",,drag 4890P%=drag!28-1 4900REPEATP%+=1 4910IF?P%<>13THENK$=K$+CHR$?P% 4920IF?P%=ASC"."OR?P%=ASC":"THENK$="" 4930UNTIL?P%=13 4940SYS"Wimp_GetPointerInfo",,q% 4950IFq%!12<>xfer%AND q%!12<>xfer2%THENSYS"Wimp_CreateMenu",-1 4960q%!20=q%!12 4970q%!24=q%!16 4980q%!28=q%!0 4990q%!32=q%!4 5010IFsave_sprite%=FALSETHEN 5020q%!36=65667 5030q%!40=filetype% 5040ELSE 5050q%!36=80*1024 5060q%!40=&FF9 5070ENDIF 5090q%!12=0 5100q%!16=1 5110$(q%+44)=K$+CHR$0 5120q%!0=(48+LENK$)AND%111111100 5140SYS"XWimp_SendMessage",17,q%,q%!20,q%!24 5150myref%=q%!8 5160ENDPROC 5180DEFFNleaf(A$) 5190LOCALI% 5200I%=LENA$+1 5210REPEATI%-=1:UNTILMID$(A$,I%,1)="." 5220=LEFT$(A$,I%-1) 5240DEFPROCerr 5250ONERROROFF 5260IFFNreport(REPORT$,TRUE)THENPROCquitELSEPROCpoll 5270ENDPROC 5290DEFPROCerr2(M%) 5300LOCALERROR 5310ONERRORLOCALPROCerr 5320IFhand%<>0THENSYS"XOS_Find",0,hand% 5330SYS"XWimp_SetMode",M%:SYS"X6502_RemoveExitHandler" 5340IFsound%=TRUETHENPROCsound_restore 5350IFFNreport(REPORT$,TRUE)THENPROCquitELSEPROCpoll 5360ENDPROC 5380DEFFNreport(a$,E%) 5390LOCALA% 5400IFE%THEN 5410SYS"XWimp_ReportError"," Internal error "+STR$ERL+": "+a$,3,"6502Em"TO,A% 5420ELSESYS"XWimp_ReportError"," "+a$,1,"6502Em"TO,A% 5430ENDIF 5440=A% 5460DEFFNcsd 5470SYS"OS_GBPB",6,,buffer 5480buffer?(buffer?1+2)=13 5490=$(buffer+2) 5510DEFPROCreadCSD 5530LOCALERROR 5550ONERRORLOCAL:RESTOREERROR:fs$="ADFS:":disc$="":path$="$":subpath$="":SYS"XWimp_ReportError"," Error in reading current directory: "+REPORT$,1,"6502Em":ENDPROC 5580FORI%=0TO1 5590SYS"OS_Args"TOFS% 5600SYS"OS_FSControl",33,FS%,STRING$(20," "),20TO,,fs$ 5610IFfs$<>""THENfs$=fs$+":":I%=1ELSEOSCLI"DIR <6502Em$Dir>.^" 5620NEXT 5640SYS"OS_GBPB",5,,buffer 5650buffer?(?buffer+1)=13 5660disc$=$(buffer+1) 5670IFdisc$=CHR$34+"Unset"+CHR$34THENdisc$=""ELSEdisc$=":"+disc$+"." 5690path$=FNcsd 5700IFpath$<>"$"THEN 5720REPEAT 5730SYS"OS_FSControl",0,"^" 5740CSD$=FNcsd 5750path$=CSD$+"."+path$ 5760UNTILCSD$="$" 5770IFRIGHT$(path$,7)=CHR$34+"Unset"+CHR$34THENpath$="$" 5780SYS"OS_FSControl",0,path$ 5790ENDIF 5810subpath$="" 5820ENDPROC 5840DEFPROCinitBBC 5860DIMR%(7) 5880DIMBBC$(&7C),ARC$(&78),Elec$(3,13) 5890RESTORE 5900FORI%=0TO3 5910FORJ%=13TO0STEP-1 5920READElec$(I%,J%) 5930NEXT 5940NEXT 5950FORI%=0TO7 5960FORJ%=0TO12 5970READBBC$(I%*16+J%) 5980NEXT 5990NEXT 6000FORI%=0TO&78 6010READARC$(I%) 6020NEXT 6040PROCreadkeymaps 6050PROCsetkeymap("Default") 6060PROCelkkeys("<6502Em$Res>.ElkKeys") 6070SYS"6502_Register" 6090DIMMachine$(4),Machine%(4),MachineSprite$(4) 6110disable_reset=FALSE 6120default_machine%=0 6140Machine$(0)="BBC B":MachineSprite$(0)="OS�1.2" 6150Machine$(1)="Master 128":MachineSprite$(1)="OS�3.2" 6160Machine$(2)=" MOS 3.5":MachineSprite$(2)="OS�3.5" 6170Machine$(3)="Compact":MachineSprite$(3)="OS�5.1" 6180Machine$(4)="Electron":MachineSprite$(4)="OS�1.0" 6211Machine%(4)=FALSE 6230Q=OPENIN"<6502Em$RomPath>OS1,2" 6240IFQ<>0THENCLOSE#Q:Machine%(0)=TRUEELSEMachine%(0)=FALSE 6250IFMachine%(0)=FALSETHENdefault_machine%=1 6270Q=OPENIN"<6502Em$RomPath>M128.OS3,2" 6280IFQ<>0THENCLOSE#Q:Machine%(1)=TRUEELSEMachine%(1)=FALSE 6290IFMachine%(0)=FALSEAND Machine%(1)=FALSETHENdefault_machine%=2 6310Q=OPENIN"<6502Em$RomPath>M128.OS3,5" 6320IFQ<>0THENCLOSE#Q:Machine%(2)=TRUEELSEMachine%(2)=FALSE 6330IFMachine%(0)=FALSEAND Machine%(1)=FALSEAND Machine%(2)=FALSETHENdefault_machine%=3 6350Q=OPENIN"<6502Em$RomPath>Compact.OS5,1" 6360IFQ<>0THENCLOSE#Q:Machine%(3)=TRUEELSEMachine%(3)=FALSE 6370IFMachine%(0)=FALSEAND Machine%(1)=FALSEAND Machine%(2)=FALSEAND Machine%(3)=FALSETHENERROR0,"No ROMs found - please run !Rip65Host" 6390Q=OPENIN"<6502Em$Dir>.Code" 6400L%=EXT#Q 6410CLOSE#Q 6420DIMcode L%+3000 6430IFNOTuseMEMC%THENDIMroms 17*16*1024 6450DIMcmos%(63):PROCloadCMOS 6460DIMeeprom%(255):PROCloadEEPROM 6470WHILE(codeAND 15)<>0:code+=1:ENDWHILE 6490indexfile$="":index%=0:newindex%=-1 6600sprite=0 6610save_sprite=FALSE 6640PROCreadCSD 6650FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ 6670PROCassemble 6680PROCload_options 6740IFfile_xxxTHENOSCLI"IconSprites <6502Em$Res>.file_xxx" 6890*FX229,1 6920patch%=0 7000ENDPROC 7020DEFPROCSRRAM 7030?(ROMRAM+socket%)=0 7040socket%=(socket%-1)AND 15 7050ENDPROC 7070DEFPROCkillROM(S%) 7080LOCALI% 7090?(ROMRAM+S%)=2 7100FORI%=0TO255STEP16 7110I%!(roms+romsize%*S%)=0 7120NEXT 7130ENDPROC 7150DEFPROCloadROM(R$,R%) 7160LOCALQ% 7170IFmachine%=4AND(socket%=9ORsocket%=8)THENsocket%=7 7180S%=socket% 7190socket%=(socket%-1)AND 15 7200SYS"OS_Find",&4E,R$,"6502Em$ROMPath"TOQ% 7210SYS"OS_GBPB",3,Q%,roms+romsize%*S%,&4000 7220CLOSE#Q% 7230?(ROMRAM+S%)=R% 7240ENDPROC 7260DEFPROCinitROMs 7270LOCALS% 7280FORS%=0TO15 7290?(ROMRAM+S%)=2 7320NEXT 7330ENDPROC 7350DEFFNROMname(S%) 7360IF?(ROMRAM+S%)=2THEN="Empty" 7370PROCresetmemmap 7380LOCALN$,I% 7390I%=roms?(romsize%*S%+7) 7400IFFNvalidROM(S%)THEN 7410FORI%=0TO11 7420N$=N$+CHR$roms?(romsize%*S%+&9+I%) 7430IFroms?(romsize%*S%+&B)=0THENI%=11 7440NEXT 7450ELSE 7460N$="RAM "+STR$~S% 7470ENDIF 7480PROCsetupmemmap 7490=N$ 7510DEFFNvalidROM(S%) 7520LOCALI% 7530I%=roms?(romsize%*S%+7) 7540IFroms?(romsize%*S%+I%+1)=&28AND roms?(romsize%*S%+I%+2)=&43AND roms?(romsize%*S%+I%+3)=&29THEN=TRUEELSE=FALSE 7560DEFPROCreset(A%) 7570IFdisable_resetTHENENDPROC 7580PROCsetupmemmap 7590?fe10=&22 7600sheila!&C0=&7070B7AB 7620?ACCCON=0 7660?f=%100 7710IFA%=1THEN 7720PROCclearmem(memory,memory+&8000) 7730?ier=&80 7740?ier2=&80 7750?Eifr=%10 7760?Eier=%0 7770?Elatch=0 7780!T1R=&F0<<24 7790!T2R=&F0<<24 7800!T3R=&F0<<24 7810!T4R=&F0<<24 7820OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 7830ENDIF 7850sheila?&20=2 8060!pc_store=(memory?&FFFC+(memory?&FFFD<<8))<<16 8080ENDPROC 8100DEFPROCBBC 8120PROCdemo("This is a demo version of 6502Em. It will work for about 2 minutes. Press F12 to finish.") 8150LOCALERROR 8170SYS"XOS_SWINumberFromString",,"ImageDFS_Version"TO;F 8180IF(FAND 1)=0THENdfssupport=TRUEELSEdfssupport=FALSE 8200*FX9 8210wimp_mode=MODE 8230?lastmode=255 8240SYS"Hourglass_Smash" 8260PROCsound_setup 8270SYS"6502_InstallExitHandler",wimp_mode 8290ONERRORLOCALPROCerr2(wimp_mode) 8310!patch_on=((patch%>0)AND%1)+(exact%AND%10)+(Cursor%AND%100)+(scroll_hack%AND%1000)+(NOTsound_on%AND%10000) 8330VDU23,16,1,254| 8340SYS"OS_Byte",202,0,255TO,FX202 8350SYS"OS_Byte",247,0,255TO,FX247 8360SYS"OS_Byte",247,255,0 8380SYS"OS_Byte",106,&81 8390MOUSECOLOUR3,255,255,255 8410SYS"OS_Byte",202,memory?&25AAND%10000,%11101111 8420SYS"OS_Byte",118 8440hand%=OPENINtapefile$ 8450?tape_handle=hand% 8470REPEAT 8490IFnewindex%>=0 index%=newindex% 8500IFOSRDCH%THENPROCpoke(&FFE0,OSRDCH_loc)ELSEPROCpoke(&FFE0,&23) 8510?ROMSEL=1+ROMSEL% 8520?Palette=1+Palette% 8540A%=roms 8550D%=memory 8560PROCsetupmemmap 8570SYS&600FA,0 8580b%=USR(code+!start_offset) 8590PROCsetupmemmap 8600SYS&600FA,1 8610IFsprite<>0THENSYS"XOS_SpriteOp",256+16,sprite,"BBCScreen",1,0,0,1279,1023 8620*FX15 8640CASEb%OF 8650WHEN11 8660IFINKEY-2THEN 8670IFhand%<>0THENPTR#hand%=FNmax(0,PTR#hand%-350) 8680ELSE 8690IFINKEY-1THENvolume%+=5ELSEvolume%-=5 8700IFvolume%>127THENvolume%=127 8710IFvolume%<0THENvolume%=0 8720PROCsound_restore:PROCsound_setup 8730ENDIF 8740ENDIF 8760WHEN10:CLS:?lastmode=255 8770WHEN66:PRINT~!pc_store:Q=GET 8780WHEN15 8790IFINKEY-3THENPROCreset(1)ELSEPROCreset(0) 8800ENDIF 8820WHEN3 8850IFFNpeek(!pc_store>>>16)=3AND(!pc_store>>>16)<&C000THEN 8870CASEFNpeek((!pc_store>>>16)+1)OF 8880WHEN0:PROCosfsc 8890WHEN1:PROCosfind 8900WHEN2:PROCosgbpb 8910WHEN3:PROCosbput 8920WHEN4:PROCosbget 8930WHEN5:PROCosargs 8940WHEN6:PROCosfile 8950WHEN&40:PROCosword2 8960WHEN&41:PROCosbyte2 8970WHEN&80:PROCreadCMOS 8980WHEN&81:PROCwriteCMOS 8990WHEN&82:PROCreadEEPROM 9000WHEN&83:PROCwriteEEPROM 9010WHEN&D0:PROCsrload 9020WHEN&D1:PROCsrwrite 9030WHEN&D2:PROCdrive 9040WHEN&D3:PROCboot 9050WHEN&D5:PROCback:a?3=0:PROCrts 9060WHEN&FF:b%=12:PROCrts 9070ENDCASE 9080ELSE 9090CASE(!pc_store>>>16)OF 9100WHEN&FFF1,&E7EB:PROCosword 9110WHEN&FFE0:PROCosrdch 9120WHEN&FFD7:PROCosbget 9130WHEN&FFD4:PROCosbput 9140WHEN&FFDD:PROCosfile 9150WHEN&FFDA:PROCosargs 9160WHEN&FFD1:PROCosgbpb 9170WHEN&FFCE:PROCosfind 9180WHEN&F1B1,&F0E8:PROCosfsc 9190ENDCASE 9210ENDIF 9230WHEN7 9240cb=(y?3)<<8 9250cb+=x?3 9260cb+=memory 9270FORI%=0TO7 9280R%(I%)=cb!(9+I%*4) 9290IF(cb?4AND(1<<I%))<>0THENR%(I%)=R%(I%)+memory 9300NEXT 9310swi%=cb?0 9320swi%+=(cb?1)<<8 9330swi%+=(cb?2)<<16 9420IFdfssupportTHEN 9440CASEswi%OF 9460WHEN&61140 9470base=cb!9 9480CASEmemory?baseOF 9490WHEN0,1,2,3 9500WHEN&21:memory?base=0 9510WHEN&4B:memory?base=1 9520WHEN&E0:memory?base=2 9530WHEN&EA:memory?base=3 9540OTHERWISE 9550PRINT"Drive ";memory?base;" " 9560ENDCASE 9570IFmemory?(base+6)=&80THENmemory?(base+6)=&53 9580IFmemory?(base+6)=&A0THENmemory?(base+6)=&4B 9600IFmemory?(base+11)<>0THENmemory?(base+9)=memory?(base+9)+1 9610memory?(base+9)=(memory?(base+9)AND%11111)OR32 9620IFmemory?(base+6)<>&81THENSYS"XImageDFS_OSWORD7F",,baseMOD256,baseDIV256,memoryTOR%(0);F 9640WHEN&61141 9660WHEN&61142 9700WHEN&61143 9730OTHERWISE 9740SYS(swi%OR2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7)TOR%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7);F 9760ENDCASE 9780ELSE 9790SYS(swi%OR2^17),R%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7)TOR%(0),R%(1),R%(2),R%(3),R%(4),R%(5),R%(6),R%(7);F 9800ENDIF 9820IFcb?3<>0THEN 9830FORI%=0TOcb?3-1 9840IF(cb?5AND(1<<I%))<>0THENR%(I%)=R%(I%)-memory 9850cb!(9+I%*4)=R%(I%) 9860NEXT 9870ENDIF 9910IF(FAND 1)<>0AND(swi%AND 2^17)=0THEN 9920A%=R%(0) 9930PROCswi_error 9940ELSE 9960IF(FAND 1)<>0AND cb?8<>0THEN 9970err=cb?6 9980err+=(cb?7)<<8 9990err+=memory 10000J%=FALSE 10010err?0=0 10020FORI%=0TOcb?8-2 10030err?(I%+1)=R%(0)?I% 10040IFerr?I%=0THENJ%=TRUE 10050NEXT 10060IFJ%=FALSETHENerr?(cb?8-1)=0 10070ENDIF 10090!pc_store=!pc_store+(1<<16) 10100?f=?fAND%1100011 10110IF(FAND 1)<>0THEN?f=?fOR%01000000 10120IF(FAND 2)<>0THEN?f=?fOR%00000001 10130IF(FAND 4)<>0THEN?f=?fOR%00000010 10140IF(FAND 8)<>0THEN?f=?fOR%10000000 10160ENDIF 10180WHEN12 10210OTHERWISE 10240ENDCASE 10260UNTILb%=12 10280IFhand%<>0THENSYS"XOS_Find",0,hand% 10300SYS"OS_Byte",202,FX202 10310SYS"OS_Byte",247,FX247 10330SYS"OS_Byte",106,1 10350*Set Key$11 "<6502Em$Key11>" 10360*Set Key$12 "<6502Em$Key12>" 10380SYS"6502_RemoveExitHandler" 10410PROCsound_restore 10430SYS"Wimp_SetMode",wimp_mode 10450*FX15,0 10470PROCdemo("The full version is available for �15 from: Warm Silence Software, St Catherine's College, Oxford, OX1 3UJ.") 10500ENDPROC 10520DEFFNmax(A%,B%) 10530IFA%>B%THEN=A%ELSE=B% 10550DEFPROCpullpc 10560sp?3=sp?3+1 10570pc_store?2=?(memory+&100+sp?3) 10580sp?3=sp?3+1 10590pc_store?3=?(memory+&100+sp?3) 10600ENDPROC 10620DEFPROCassemble 10630a=memory-&100+0 10640a=memory-&100+0 10650x=memory-&100+4 10660y=memory-&100+8 10670f=memory-&100+12 10680sp=memory-&100+16 10690pc_store=memory-&100+20 10700T1R=memory-&100+32 10710T2R=memory-&100+40 10720T3R=memory-&100+48 10730T4R=memory-&100+56 10740screenR=memory-&100+64 10750ifr=memory-&100+76 10760ier=memory-&100+77 10770ifr2=memory-&100+78 10780ier2=memory-&100+79 10790rom=memory-&100+96 10810ROMSEL=memory-&100+92 10820Palette=memory-&100+164 10830ROMRAM=memory-&100+100 10840patch_on=memory-&100+176:!patch_on=0 10850lastmode=memory-&100+178 10860fe10=memory-&100+179 10870tape_handle=memory-&100+117 10880tape_count=memory-&100+180 10890ACCCON=memory-&100+172 10900Elatch=memory-&100+188 10910Eifr=memory-&100+189 10920Eier=memory-&100+190 10930ROMint=memory-&100+191 10950P%=code 10960[OPT2 10970.Oa 10980EQUD 0 10990.Ox 11000EQUD 0 11010.Oy 11020EQUD 0 11030.Of 11040EQUD 0 11050.Osp 11060EQUD 0 11070.Opc_store 11080EQUD 0 11090.start_offset 11100EQUD 0 11110.trace 11120EQUD 0 11130.trace2 11140EQUD 0 11150.init_addr 11160EQUD 0 11170.crt_addr 11180EQUD 0 11190.T1_addr 11200EQUD 0 11210.ifr_addr 11220EQUD 0 11230.column_counter_addr 11240EQUD 0 11250.ROMSEL_addr 11260EQUD 0 11270.Palette_addr 11280EQUD 0 11290.speed_addr 11300EQUD 0 11310.elite_addr 11320EQUD 0 11330.opco_addr EQUD 0 11340.bcd_addr EQUD 0 11350.sheila_writetab_addr EQUD 0 11360.sheila_readtab_addr EQUD 0 11370.sound_vectors_addr EQUD 0 11380.patch_addr EQUD 0 11390] 11400ENDPROC 11420DEFPROCrts 11430sp?3=sp?3+1 11440pc_store?2=memory?(&100+sp?3) 11450sp?3=sp?3+1 11460pc_store?3=memory?(&100+sp?3) 11470!pc_store=!pc_store+(1<<16) 11490ENDPROC 11500!pc_store=&8004<<16 11550ENDPROC 11570DEFPROCosfile 11590addr=memory+x?3+(y?3)*256 11600CASEa?3OF 11610WHEN0 11620a%=a?3 11630b$=FNaddpath($((addr!0AND&FFFF)+memory)) 11640c%=addr!2 11650d%=addr!6 11660e%=(addr!10AND&FFFF)+memory 11670f%=(addr!14AND&FFFF)+memory 11690SYS"XOS_File",a%,b$,c%,d%,e%,f%TOA%;F 11700IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 11710WHEN5 11720b$=$((addr!0AND&FFFF)+memory) 11730SYS"XOS_File",13,FNadd_(b$),,,FN_path(b$)TOA%,,c%,d%,e%,f%;F 11740IF(FAND 1)=1THEN 11750PROCswi_error 11760ELSE 11770a?3=A% 11780addr!2=c% 11790addr!6=d% 11800addr!10=e% 11810addr!14=f% 11820PROCrts 11830ENDIF 11840WHEN6 11850b$=$((addr!0AND&FFFF)+memory) 11860SYS"XOS_File",6,FNaddpath(b$)TOA%,,c%,d%,e%,f%;F 11870IF(FAND 1)=1THEN 11880PROCswi_error 11890ELSE 11900a?3=A% 11910addr!2=c% 11920addr!6=d% 11930addr!10=e% 11940addr!14=f% 11950PROCrts 11960ENDIF 11980WHEN255 11990a%=a?3 12000b$=$((addr!0AND&FFFF)+memory) 12020c%=(addr!2AND&FFFF)+memory 12030IF(addr!2AND&FFFF0000)=&FFFE0000THENc%-=&13000 12040d%=addr?6 12050IFd%<>0THENSYS"XOS_File",13,FNadd_(b$),,,FN_path(b$)TO,,c%:d%=0:c%=(c%AND&FFFF)+memory 12060SYS"XOS_File",13,FNadd_(b$),,,FN_path(b$)TO,,,,length% 12070IFc%+length%>memory+&8000AND c%<memory+&8000THEN 12080length%=memory+&7FFF-c% 12090SYS"XOS_Find",&4D,FNadd_(b$),FN_path(b$)TOA%;F 12100IF(FAND 1)=0THENSYS"XOS_GBPB",4,A%,c%,length%:SYS"XOS_Find",0,A%:PROCrtsELSEPROCswi_error 12110ELSE 12120SYS"XOS_File",12,FNadd_(b$),c%,0,FN_path(b$)TOA%,,c%,d%,e%,f%;F 12130a?3=A% 12140addr!2=c% 12150addr!6=d% 12160addr!10=e% 12170addr!14=f% 12180IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 12190ENDIF 12220a?3=1 12300OTHERWISE 12310PRINT"OSFILE ";a?3:Q=GET 12320ENDCASE 12330ENDPROC 12350DEFPROCswi_error 12360LOCALA$ 12370A$="" 12380FORI%=0TO253 12400memory?(&102+I%)=A%?(I%+4) 12410IFA%?(I%+4)=0THENI%=253 12420NEXT 12440memory?&100=0 12450memory?&101=?A% 12470!pc_store=&100<<16 12480ENDPROC 12500DEFPROCbrk(A%,A$) 12510A$=A$+CHR$0 12520FORI%=0TOLENA$-1 12530memory?(&102+I%)=ASCMID$(A$,I%+1,1) 12540NEXT 12550memory?&100=0 12560memory?&101=A% 12570!pc_store=&100<<16 12580ENDPROC 12600DEFFNmin(A%,B%)IFA%<B%THEN=A%ELSE=B% 12620DEFPROCosword 12630CASEa?3OF 12640WHEN0,1,2,3,4 12650pc_store?2=memory?&20C 12660pc_store?3=memory?&20D 12670WHEN0123 12680addr=x?3+(y?3<<8) 12690buff=memory?addr+(memory?(addr+1)<<8) 12700SYS"OS_ReadLine",buff+memory,memory?(addr+2),memory?(addr+3),memory?(addr+4)TO,Y%;F% 12710IF(F%AND%10)=0THENmemory?(buff+Y%)=13:Y%+=1 12720y?3=Y% 12730?f=(?fAND%11111110)OR((F%AND%10)>>1) 12740PROCrts 12750WHEN91,93 12760SYS"OS_Word",1,x?3+(y?3<<8)+memory 12770PROCrts 12780WHEN92 12790SYS"OS_Word",2,x?3+(y?3<<8)+memory 12800PROCrts 12810WHEN7 12820buffer=memory+x?3+(y?3<<8) 12910channel%=?bufferAND%11 12920flush%=?bufferAND%10000 12930sync%=buffer?1AND%111 12940cont%=buffer?1AND%11110000 12950ampl%=buffer?2:IFampl%>&EFTHENampl%+=&FF00ELSEampl%+=301:channel%+=4 12960pitch%=buffer?4 12970dur%=buffer?6 12980IFchannel%=0THEN 12990CASEpitch%AND%111OF 13000WHEN0,4:pitch%=220 13010WHEN1,5:pitch%=160 13020WHEN2,6:pitch%=100 13030WHEN3,7:pitch%=chan1_pitch% 13040ENDCASE 13050ENDIF 13060IFchannel%=1THENchan1_pitch%=pitch% 13080IFcont%=0THENSYS"Sound_Control",channel%+1,ampl%,pitch%,dur% 13100PROCrts 13120WHEN8 13170IF?(memory+x?3+(y?3<<8)+1)=0THEN?(memory+x?3+(y?3<<8)+1)=1 13180SYS"Sarah_Envelope",0,memory+x?3+(y?3<<8) 13200PROCrts 13220WHEN&7F 13230addr%=x?3+(y?3<<8)+memory 13240track%=addr%?7 13250sector%=addr%?8 13260disc_address%=sector%*256+track%*2560 13270length%=(memory?9AND%1111)*256 13280addr%?10=0 13290PROCrts 13310OTHERWISEIFa?3>20THEN 13320pc_store?2=memory?&20C 13330pc_store?3=memory?&20D 13340ENDCASE 13350ENDPROC 13370DEFPROCosgbpb 13390addr%=memory+x?3+(y?3<<8) 13400b%=?addr% 13410c%=addr%!1 13420d%=addr%!5 13430e%=addr%!9 13460IFa?3=9THEN 13480SYS"XOS_GBPB",a?3,fs$+disc$+path$+subpath$,memory+(c%AND&FFFF),b%,e%,d%,0TOA%,,,d%,e%;F 13490IF(FAND 1)=0THEN 13500?addr%=d% 13510addr%!9=e% 13520IF(FAND%10)=0THEN?f=(?fAND%11111110)ELSE?f=?fOR1 13530PROCrts 13540ELSE 13550PROCswi_error 13560ENDIF 13580ELSE 13600SYS"OS_FSControl",11,fs$ 13610SYS"OS_FSControl",0,disc$+path$+subpath$ 13630IF(a?3=3ORa?3=4)AND c%<&8000AND c%+e%>&8000THENe%=&8000-c% 13650SYS"XOS_GBPB",a?3,b%,memory+(c%AND&FFFF),d%,e%TOA%,,c%,d%,e%;F 13670SYS"OS_FSControl",19 13690IF(FAND 1)=0THEN 13700addr%!1=c%-memory 13710addr%!5=d% 13720addr%!9=e% 13730IF(FAND%10)=0THEN?f=(?fAND%11111110)ELSE?f=?fOR1 13740PROCrts 13750ELSE 13760PROCswi_error 13770ENDIF 13790ENDIF 13800ENDPROC 13820DEFPROCosargs 13830CASEa?3OF 13840WHEN0 13850IFy?3<>0THEN 13860SYS"XOS_Args",a?3,y?3TOA%,,L%;F 13870IF(FAND 1)=0THENmemory!(x?3)=L%:PROCrtsELSEPROCswi_error 13880ELSE 13890a?3=4:PROCrts 13900ENDIF 13910WHEN1 13920SYS"XOS_Args",a?3,y?3,memory!(x?3)TOA%;F 13930IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 13940WHEN2 13950SYS"XOS_Args",a?3,y?3TOA%,,L%;F 13960IF(FAND 1)=0THENmemory!(x?3)=L%:PROCrtsELSEPROCswi_error 13970WHEN255 13980SYS"XOS_Args",a?3,y?3TOA%;F 13990IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 14000OTHERWISE:PROCrts 14010ENDCASE 14020ENDPROC 14040DEFFNupper(A$) 14050LOCALI%,B$ 14060FORI%=1TOLENA$ 14070IFMID$(A$,I%,1)>="a"ANDMID$(A$,I%,1)<="z"THENB$=B$+CHR$(ASCMID$(A$,I%,1)-32)ELSEB$=B$+MID$(A$,I%,1) 14080NEXT 14090=B$ 14110DEFPROCquit 14120ONERROROFF 14130PROCresetmemmap 14140SYS"X6502_DeRegister"TOA% 14150IFA%=0THENSYS"XOS_Module",4,"6502Support" 14160SYS"Wimp_CloseDown" 14170END 14180ENDPROC 14390DEFPROCsnap_load(file$) 14400LOCALfile%,I%,ok%,machine$,M%,patch$ 14410file%=OPENIN(file$) 14420type$=GET$#file% 14430IFEXT#file%=0THENtype$="BBC Script" 14450CASEtype$OF 14470WHEN"BBC Tapefile" 14490CLOSE#file% 14500tapefile$=file$ 14520WHEN"BBC Script" 14540LOCALERROR 14560ONERRORLOCAL:RESTOREERROR:SYS"XWimp_ReportError"," Error in script: "+REPORT$,3,"6502Em"TO,A%:IFA%=2THENPROCquitELSEPROCpoll 14580scroll_hack%=FALSE 14610IFEOF#file%THEN 14620A$="" 14630ELSE 14640A$=FNupper(GET$#file%) 14650ENDIF 14660REPEAT 14670B$=LEFT$(A$,INSTR(A$," ")-1) 14680ok%=TRUE 14690CASEB$OF 14700WHEN"PALETTE" 14710IFINSTR(A$,"ON")THENPalette%=TRUEELSEPalette%=FALSE 14720WHEN"CURSOR" 14730IFINSTR(A$,"ON")THENCursor%=TRUEELSECursor%=FALSE 14740WHEN"EXACTSPEED" 14750IFINSTR(A$,"ON")THENexact%=TRUEELSEexact%=FALSE 14760WHEN"SOUND" 14770IFINSTR(A$,"ON")THENsound_on%=TRUEELSEsound_on%=FALSE 14780WHEN"DISABLETAPE" 14790PROCdisableCFS 14800WHEN"SCROLLHACK" 14810scroll_hack%=TRUE 14820WHEN"KEYMAP" 14830K$=RIGHT$(A$,LENA$-INSTR(A$," ")) 14840PROCsetkeymap(K$) 14850WHEN"PATCH" 14860IFpatches%<>0THEN 14870patch%=0 14880FORI%=1TOpatches% 14890patch$=RIGHT$(A$,LENpatch$(I%)) 14900PROCstrip(patch$) 14910IFFNupper(patch$(I%))=patch$THEN 14920patch%=I% 14930PROCloadpatch 14940ENDIF 14950NEXT 14960ENDIF 14970WHEN"INDEXFILE" 14980T$=RIGHT$(A$,LENA$-10) 14990T%=OPENIN(FNleaf(file$)+"."+T$) 15000IFT%<>0THENCLOSE#T%:indexfile$=FNleaf(file$)+"."+T$:index%=0ELSEERROR1,"Index File "+T$+" not found" 15010WHEN"TAPEFILE" 15020T$=RIGHT$(A$,LENA$-9) 15030T%=OPENIN(FNleaf(file$)+"."+T$) 15040IFT%<>0THENCLOSE#T%:tapefile$=FNleaf(file$)+"."+T$ELSEERROR1,"Tape File "+T$+" not found" 15050WHEN"LOADROM" 15060L$=RIGHT$(A$,LENA$-8) 15070IFINSTR(L$,":")=0THEN 15080PROCloadROM(FNleaf(file$)+"."+L$,1) 15090ELSE 15100PROCloadROM(L$,1) 15110ENDIF 15120WHEN"LOADRAM" 15130L$=RIGHT$(A$,LENA$-8) 15140IFINSTR(L$,":")=0THEN 15150PROCloadROM(FNleaf(file$)+"."+L$,0) 15160ELSE 15170PROCloadROM(L$,1) 15180ENDIF 15190WHEN"KILLROM" 15200L$=RIGHT$(A$,LENA$-8) 15210FORI%=0TO15 15220IFLEFT$(FNupper(FNROMname(I%)),LENL$)=L$THENPROCkillROM(I%) 15230NEXT 15240WHEN"MACHINE" 15250machine$=RIGHT$(A$,LENA$-8) 15260PROCstrip(machine$) 15270CASEmachine$OF 15280WHEN"BBC","BBCB","BBC B" 15290M%=0 15300WHEN"MASTER","MASTER128","MASTER 128" 15310M%=1 15320WHEN"OS3.5","OS 3.5","OS3,5","OS 3.5" 15330M%=2 15340WHEN"COMPACT","MASTER COMPACT" 15350M%=3 15360WHEN"ELECTRON","ELK" 15370M%=4 15380OTHERWISE 15390CLOSE#file%:ERROR1,"Unknown machine '"+machine$+"'" 15400ENDCASE 15410IFM%<>machine%THENmachine%=M%:PROCnewmachine 15420OTHERWISE 15430ok%=FALSE 15440ENDCASE 15450IFok%THEN 15460IFEOF#file%THEN 15470A$="" 15480ELSE 15490A$=FNupper(GET$#file%) 15500ENDIF 15510ENDIF 15520UNTILFNi("PATCH")ANDFNi("PALETTE")ANDFNi("MACHINE")ANDFNi("INDEXFILE")ANDFNi("TAPEFILE")ANDFNi("KEYMAP")ANDFNi("CURSOR")ANDFNi("EXACTSPEED")ANDFNi("DISABLETAPE")ANDFNi("LOADROM")ANDFNi("LOADRAM")ANDFNi("KILLROM")ANDFNi("SOUND")ANDFNi("SCROLLHACK") 15540CLOSE#file% 15550IFA$=""THEN 15560A$=FNleaf(file$) 15570PROCfile_load(A$+"."+RIGHT$(A$,LENA$-LENFNleaf(A$)-2)) 15580ELSE 15590IFLEFT$(A$,5)="CHAIN"ORLEFT$(A$,1)="*"ORINSTR(A$," ")>0THEN 15600osrdch$=A$+CHR$13 15610PROCreset(1) 15620osrdch_count%=0 15630OSRDCH_loc_tmp=OSRDCH_loc 15640OSRDCH_loc=3 15650PROCnewpath(FNleaf(file$)+".JUNK") 15660ELSE 15670PROCfile_load(FNleaf(file$)+"."+A$) 15680ENDIF 15690ENDIF 15700WHEN"BBC Snapshot " 15710IFEXT#file%=&10110THEN 15720SYS"OS_GBPB",4,file%,memory-&100,&10100 15730PTR#file%=&10110-&200 15740SYS"OS_GBPB",4,file%,sheila,&100 15750ELSE 15760SYS"OS_GBPB",4,file%,memory-&100,EXT#file%-&110 15770SYS"OS_GBPB",4,file%,sheila,&100 15780ENDIF 15790CLOSE#file% 15800WHEN"BBC Snapshot101" 15810SYS"OS_GBPB",4,file%,memory-&200,EXT#file%-&10 15820CLOSE#file% 15830OTHERWISE 15840CLOSE#file% 15850PROCloadROM(A$,1) 15860ENDCASE 15870ENDPROC 15890DEFFNi(B$) 15900IFINSTR(A$,B$)=0THEN=TRUEELSE=FALSE 15920DEFPROCfile_load(F$) 15930PROCnewpath(F$) 15950FORI%=1TOLENF$ 15960IFMID$(F$,LENF$-I%,1)="."ORMID$(F$,LENF$-I%,1)=":"THENL%=I%:I%=LENF$ 15970NEXT 15980A$=RIGHT$(F$,L%) 15990SYS"OS_File",5,F$TO,,load2%,exec2%,length% 16000load%=load2%AND&FFFF 16010exec%=exec2%AND&FFFF 16020osrdch$="*/"+A$+CHR$13 16030IFexec%=&801FORexec%=&8023ORexec%=&802BORexec%=&80E7THENosrdch$="PAGE=&"+STR$~load%+CHR$13+"CHAIN"+CHR$34+A$+CHR$34+CHR$13 16040IF(load2%AND&FFF00)=&FFB00THENosrdch$="CHAIN"+CHR$34+A$+CHR$34+CHR$13 16050IFexec%=&FFFFOR(load2%AND&FFF00)=&FFE00OR(load2%=0AND exec2%=0)THENosrdch$="*EXEC "+A$+CHR$13:IFmachine%=0THENosrdch$="PAGE=&1900:"+osrdch$ 16060PROCreset(1) 16070osrdch_count%=0 16080OSRDCH_loc_tmp=OSRDCH_loc 16090OSRDCH_loc=3 16100ENDPROC 16120DEFPROCosrdch 16130osrdch_count%+=1 16140a?3=ASCMID$(osrdch$,osrdch_count%,1) 16150PROCrts 16160IFosrdch_count%=LENosrdch$THENOSRDCH_loc=OSRDCH_loc_tmp:PROCpoke(&FFE0,OSRDCH_loc) 16170ENDPROC 16190DEFFNbinary(B%) 16200LOCALA$,I% 16210FORI%=0TO7 16220IF(B%AND 2^I%)=0THENA$="0"+A$ELSEA$="1"+A$ 16230NEXT 16240=A$ 16260DEFPROCnewpath(F$) 16270SYS"OS_GSTrans",F$,buffer,255TO,F$ 16280fs$=LEFT$(F$,INSTR(F$,":")) 16290F$=RIGHT$(F$,LENF$-LENfs$) 16310IFLEFT$(F$,1)=":"THEN 16320disc$=LEFT$(F$,INSTR(F$,".")) 16330F$=RIGHT$(F$,LENF$-LENdisc$) 16340ELSE 16350disc$="" 16360ENDIF 16380path$=FNleaf(F$) 16390subpath$="" 16400IFMID$(path$,LENpath$-1,1)="."THENsubpath$=RIGHT$(path$,2):path$=LEFT$(path$,LENpath$-2) 16410ENDPROC 16430DEFFNnumeric(A$) 16440IFA$>="0"AND A$<="9"THEN=TRUEELSE=FALSE 16460DEFFNadd_(F$) 16470IFLEFT$(F$,1)=":"ANDFNnumeric(MID$(F$,2,1))ANDMID$(F$,3,1)="."THENF$=RIGHT$(F$,LENF$-3) 16480IFINSTR(F$,":")THEN=F$ 16490IFLEFT$(F$,1)=CHR$34ANDRIGHT$(F$,1)=CHR$34THENF$=MID$(F$,2,LENF$-2) 16510IF(F$=""ORINSTR(F$,"|"))AND indexfile$<>""THEN 16520Q=OPENINindexfile$ 16530PTR#Q=index% 16540F$=GET$#Q 16550newindex%=PTR#Q 16560IFnewindex%=EXT#QTHENnewindex%=0 16570CLOSE#Q 16580ENDIF 16600IFMID$(F$,2,1)="."THEN 16610IFLEFT$(F$,1)="$"THEN=RIGHT$(F$,LENF$-2) 16620=F$ 16630ELSE 16640=F$ 16650ENDIF 16660="" 16680DEFFN_path(F$) 16690IFLEFT$(F$,1)=":"ANDFNnumeric(MID$(F$,2,1))ANDMID$(F$,3,1)="."THENF$=RIGHT$(F$,LENF$-3) 16700IFINSTR(F$,":")THEN="" 16710IFMID$(F$,2,1)="."THEN 16720=fs$+disc$+path$+"." 16730ELSE 16740=fs$+disc$+path$+subpath$+"." 16750ENDIF 16760="" 16780DEFFNaddpath(F$) 16790IFLEFT$(F$,1)=":"ANDFNnumeric(MID$(F$,2,1))ANDMID$(F$,3,1)="."THENF$=RIGHT$(F$,LENF$-3) 16800IFINSTR(F$,":")THEN=F$ 16810IFLEFT$(F$,1)=CHR$34ANDRIGHT$(F$,1)=CHR$34THENF$=MID$(F$,2,LENF$-2) 16820IFMID$(F$,2,1)="."THEN 16830IFLEFT$(F$,1)="$"THEN=path$+"."+RIGHT$(F$,LENF$-2) 16840=fs$+disc$+path$+"."+F$ 16850ELSE 16860=fs$+disc$+path$+subpath$+"."+F$ 16870ENDIF 16880="" 16900DEFFNstrip(F$) 16910LOCALI% 16920REPEATI%+=1:UNTILMID$(F$,I%,1)<>"*"ANDMID$(F$,I%,1)<>" " 16930=RIGHT$(F$,LENF$-I%+1) 16950DEFPROCstrip(RETURNs$) 16960WHILELEFT$(s$,1)=" " 16970s$=MID$(s$,2) 16980ENDWHILE 16990WHILERIGHT$(s$,1)=" " 17000s$=LEFT$(s$,LENs$-1) 17010ENDWHILE 17020ENDPROC 17040DEFPROCdir(D$) 17050FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ 17070LOCALI% 17080REPEATI%+=1:UNTILMID$(D$,I%,1)<>" " 17090D$=RIGHT$(D$,LEND$-I%+1) 17100IFINSTR(D$," ")THEN 17110D$=LEFT$(D$,INSTR(D$," ")-1) 17120ELSE 17130IFLEND$=4ANDLEFT$(FNupper(D$),3)="DIR"THEND$=RIGHT$(D$,1) 17140ENDIF 17160IFD$="^"THEN 17170IFsubpath$<>""THENsubpath$="":PROCrts:ENDPROC 17180IFINSTR(path$,".")=0THENpath$="$":PROCrts:ENDPROC 17190I%=LENpath$ 17200REPEATI%-=1:UNTILMID$(path$,I%,1)="." 17210path$=LEFT$(path$,I%-1) 17220PROCrts:ENDPROC 17230ENDIF 17250IFD$="$"ORLEND$=0THENsubpath$="":PROCrts:ENDPROC 17260IFLEND$=1THEN 17270SYS"XOS_File",13,D$,,,fs$+disc$+path$+"."TOA%;F 17280IF(FAND 1)<>0THENPROCswi_error:ENDPROC 17290IF(A%AND 2)=0ANDLEND$=1THENsubpath$="":PROCrts:ENDPROC 17300IF(A%AND 2)=0THENPROCbrk(214,"Directory '"+D$+"' not found")ELSEsubpath$="."+D$:PROCrts 17310ENDPROC 17320ENDIF 17340IFINSTR(D$,":")>1THEN 17350IFRIGHT$(D$,1)<>":"THENSYS"XOS_File",17,D$TOA%;F:IF(FAND 1)<>0THENPROCswi_error:ENDPROC 17360SYS"OS_FSControl",11,D$TO,E$,E% 17370IFE%<>-1THENSYS"OS_FSControl",19:fs$=LEFT$(D$,LEND$-LENE$):D$=E$ELSEPROCbrk(248,"No such filing system"):ENDPROC 17380path$="" 17390subpath$="" 17400disc$="" 17410IFLEFT$(D$,1)<>":"THENpath$="$" 17420ENDIF 17440IFLEFT$(D$,1)=":"THEN 17450I%=0:disc$="" 17460REPEATI%+=1 17470disc$=disc$+MID$(D$,I%,1) 17480UNTILMID$(D$,I%+1,1)="."ORI%=LEND$ 17490IFI%=LEND$THEND$=""ELSED$=RIGHT$(D$,LEND$-LENdisc$-1) 17500path$="":subpath$="" 17510ENDIF 17530IFLEFT$(D$,1)="$"ANDLEND$>2THENpath$="$":subpath$="":D$=RIGHT$(D$,LEND$-2) 17550IFdisc$<>""ANDRIGHT$(disc$,1)<>"."AND path$<>""THENdisc$=disc$+"." 17560SYS"XOS_File",13,D$,,,fs$+disc$+path$+subpath$+"."TOA%;F 17570IFdisc$<>""ANDRIGHT$(disc$,1)<>"."THENdisc$=disc$+"." 17580IF(FAND 1)<>0THENPROCrestoreCSD:PROCswi_error:ENDPROC 17590IF(A%AND 2)=0THEN 17600PROCrestoreCSD 17610PROCbrk(214,"Directory '"+D$+"' not found") 17620ELSE 17630IFD$<>""THEN 17640IFpath$<>""THENpath$=path$+subpath$+"."+D$:subpath$=""ELSEpath$=D$ 17650ENDIF 17660PROCrts 17670ENDIF 17680IFpath$=""THENpath$="$" 17690ENDPROC 17710DEFPROCback 17720SWAPfs$,FS$ 17730SWAPdisc$,DISC$ 17740SWAPpath$,PATH$ 17750SWAPsubpath$,SUBPATH$ 17760ENDPROC 17780DEFPROCrestoreCSD 17790fs$=FS$:disc$=DISC$:path$=PATH$:subpath$=SUBPATH$ 17800ENDPROC 17820DEFPROCosfsc 17840CASEa?3OF 17850WHEN1 17860SYS"XOS_Args",5,x?3TOA%,,x?3;F 17870IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 17880IFx?3<>0THENx?3=&FF 17890WHEN3:addr=x?3+((y?3)<<8)+memory 17900b$=FNstrip($addr) 17910SYS"XOS_Find",&4D,FNadd_(b$),FN_path(b$)TOQ;F 17920A%=Q 17940IFQ=0OR(FAND 1)<>0THEN 17950IFLEFT$(FNupper(b$),4)="DIR "OR(LEFT$(FNupper(b$),3)="DIR"ANDLENb$=4)THEN 17960PROCdir(RIGHT$(b$,LENb$-4)) 17970ELSE 17980IFOscli%THEN 17990SYS"XOS_CLI",b$TOA%;F 18000IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 18010ELSE 18020PROCbrk(254,"Bad Command") 18030ENDIF 18040ENDIF 18050ELSE 18060CLOSE#Q 18070b$=FNaddpath(b$) 18080SYS"OS_File",5,b$TO,,c%,d%:c%=(c%AND&FFFF)+memory 18090SYS"OS_File",255,b$,c%,0 18100!pc_store=d%<<16 18110ENDIF 18120WHEN2,4:addr=x?3+((y?3)<<8)+memory 18130b$=$addr 18150SYS"XOS_File",13,FNadd_(b$),,,FN_path(b$)TOA%,,c%,d%,length%;f%:c%=(c%AND&FFFF)+memory 18160IFc%+length%>memory+&8000AND c%<memory+&8000THENlength%=memory+&8000-c% 18170SYS"XOS_Find",&4D,FNadd_(b$),FN_path(b$)TOA%;f% 18180IF(f%AND 1)=0THENSYS"XOS_GBPB",4,A%,c%,length%:SYS"XOS_Find",0,A% 18200IF(f%AND 1)=0THEN!pc_store=d%<<16ELSEPROCswi_error 18210WHEN5:PROCrts 18220WHEN0,6,8:PROCrts 18230WHEN9,10,11:PROCrts 18240OTHERWISEPRINT"OSFSC ";a?3:Q=GET 18250ENDCASE 18260ENDPROC 18280DEFPROCosfind 18290addr=memory+x?3+(y?3)*256 18300IFa?3=0THEN 18310SYS"XOS_Find",0,y?3TOA%;F 18320ELSE 18330SYS"XOS_Find",(a?3)OR1,FNadd_($addr),FN_path($addr)TOA%;F 18340ENDIF 18350IF(FAND 1)=0THENa?3=A%:PROCrtsELSEPROCswi_error 18360ENDPROC 18380DEFPROCosbget 18390SYS"XOS_BGet",a?3,y?3TOA%;F% 18400IF(FAND 1)=0THEN 18410a?3=A% 18420?f=?fAND%11111110 18430IF(F%AND 2)<>0THEN?f+=1 18440PROCrts 18450ELSE 18460PROCswi_error 18470ENDIF 18480ENDPROC 18500DEFPROCosbput 18510SYS"XOS_BPut",a?3,y?3TOA%;F 18520IF(FAND 1)=0THENPROCrtsELSEPROCswi_error 18530ENDPROC 18550DEFPROCsprite_save(F$) 18560IFINSTR(F$,".")=0ANDINSTR(F$,":")=0ANDLEFT$(F$,6)<>"<Wimp$"THENSYS"Wimp_ReportError"," To save, drag the file icon to a directory viewer":ENDPROC 18570SYS"OS_SpriteOp",256+12,sprite,F$ 18580ENDPROC 18600DEFFNkeymap(A$) 18610LOCALI% 18620FORI%=1TOkeymaps% 18630IFFNupper(keymap$(I%))=FNupper(A$)THEN=I% 18640NEXT 18650=0 18670DEFPROCsetkeymap(A$) 18680LOCALI% 18690KeyMap$="Default" 18700IFFNupper(A$)="DEFAULT"THEN 18710IFMODE>255THENA$="RiscPC"ELSEA$="Archimedes" 18720ENDIF 18730OSCLI"Set 6502Em$Keymap "+A$ 18740FORI%=1TOkeymaps% 18750IFFNupper(keymap$(I%))=FNupper(A$)THENKeyMap$=A$:keymap%=I%:I%=1000:PROCreadkeys("<6502Em$Dir>.Keymaps."+A$) 18760NEXT 18770ENDPROC 18790DEFPROCreadkeymaps 18800LOCALoffset%,N% 18810keymap%=0 18820keymaps%=0 18830REPEAT 18840SYS"OS_GBPB",9,"<6502Em$Dir>.Keymaps",q%,100,offset%,&100,0TO,,,N%,offset% 18850keymaps%+=N% 18860UNTILoffset%=-1 18870IFkeymaps%=0THENkeysmenu%=-1:ENDPROC 18880DIMkeymap$(keymaps%),keysmenu%32+24*keymaps% 18890offset%=0 18900FORN%=1TOkeymaps% 18910SYS"OS_GBPB",9,"<6502Em$Dir>.Keymaps",q%,1,offset%,&100,0TO,,,,offset% 18920keymap$(N%)=FNstring(q%) 18930NEXT 18940ENDPROC 18960DEFPROCreadpatches 18970LOCALoffset%,N% 18980patch%=0 18990patches%=0 19000REPEAT 19010SYS"OS_GBPB",9,"<6502Em$Dir>.Patches",q%,100,offset%,&100,0TO,,,N%,offset% 19020patches%+=N% 19030UNTILoffset%=-1 19040IFpatches%=0THENpatchmenu%=-1:ENDPROC 19050DIMpatch$(patches%),patchmenu%32+24*patches% 19060offset%=0 19070FORN%=1TOpatches% 19080SYS"OS_GBPB",9,"<6502Em$Dir>.Patches",q%,1,offset%,&100,0TO,,,,offset% 19090patch$(N%)=FNstring(q%) 19100NEXT 19110ENDPROC 19130DEFFNstring(A%) 19140LOCALA$,I% 19150REPEAT 19160A$=A$+CHR$(A%?I%) 19170I%+=1 19180UNTILA%?I%=0 19190=A$ 19210DEFPROCloadpatch 19220OSCLI"Load <6502Em$Dir>.Patches."+patch$(patch%)+" "+STR$~(code+!patch_addr) 19230?patch_on=?patch_onOR1 19240ENDPROC 19260DEFFNosword14_1(A%) 19270?buffer=1 19280SYS"OS_Word",14,buffer 19290=buffer?A% 19310DEFPROCreadCMOS 19320CASEx?3AND 63OF 19330WHEN0:y?3=FNosword14_1(6) 19340WHEN1:y?3=1 19350WHEN2:y?3=FNosword14_1(5) 19360WHEN3:y?3=1 19370WHEN4:y?3=FNosword14_1(4) 19380WHEN5:y?3=1 19390WHEN6:y?3=FNosword14_1(3) 19400WHEN7:y?3=FNosword14_1(2) 19410WHEN8:y?3=FNosword14_1(1) 19420WHEN9:y?3=FNosword14_1(0) 19430WHEN10:y?3=%00100000 19440WHEN11:y?3=%00000010 19450WHEN12:y?3=0 19460WHEN13:y?3=0 19470OTHERWISE:y?3=cmos%(x?3AND 63) 19490ENDCASE 19510a?3=y?3 19540PROCrts 19550ENDPROC 19570DEFPROCreadEEPROM 19580y?3=eeprom%(x?3) 19590a?3=y?3 19600PROCrts 19610ENDPROC 19630DEFPROCwriteCMOS 19640cmos%(x?3AND 63)=y?3 19650PROCrts 19660IF(x?3AND 63)>13THEN 19670Q=OPENUP"<6502Em$Res>.CMOS" 19680PTR#Q=x?3AND 63 19690BPUT#Q,y?3 19700CLOSE#Q 19710ENDIF 19720ENDPROC 19740DEFPROCwriteEEPROM 19750eeprom%(x?3)=y?3 19760PROCrts 19770Q=OPENUP"<6502Em$Res>.EEPROM" 19780PTR#Q=x?3 19790BPUT#Q,y?3 19800CLOSE#Q 19810ENDPROC 19830DEFPROCloadCMOS 19840LOCALQ,I% 19850Q=OPENIN"<6502Em$Res>.CMOS" 19860FORI%=0TO63 19870cmos%(I%)=BGET#Q 19880NEXT 19890CLOSE#Q 19900ENDPROC 19920DEFPROCloadEEPROM 19930LOCALQ,I% 19940Q=OPENIN"<6502Em$Res>.EEPROM" 19950FORI%=0TO255 19960eeprom%(I%)=BGET#Q 19970NEXT 19980CLOSE#Q 19990ENDPROC 20010DEFPROCloadcode(C$) 20020OSCLI"LOAD <6502Em$Dir>."+C$+" "+STR$~code 20030CALLcode+!init_addr 20040PROCsound_reinit 20050IFpatch%<>0THENPROCloadpatch 20060ENDPROC 20080DEFPROCmaster 20090PROCloadcode("CodeM") 20100OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,2 "+STR$~(memory+&C000) 20110OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,2 "+STR$~(roms+romsize%*16) 20120OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20130socket%=15 20140PROCloadROM("M128.Terminal",1) 20150?(roms+romsize%*15+&18B7)=3 20160?(roms+romsize%*15+&18B8)=&80 20170?(roms+romsize%*15+&18E4)=3 20180?(roms+romsize%*15+&18E5)=&81 20190PROCloadROM("M128.View",1) 20200PROCloadROM("VDFS",1) 20220PROCloadROM("M128.BASICIV84",1) 20230PROCloadROM("M128.Edit1,00",1) 20240PROCloadROM("M128.ViewSheet",1) 20250PROCloadROM("M128.DFS2,24",1) 20290PROCSRRAM 20300PROCSRRAM 20310PROCSRRAM 20320PROCSRRAM 20330PROCSRRAM 20340ENDPROC 20360DEFPROCmaster35 20370PROCloadcode("CodeM") 20380OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,5 "+STR$~(memory+&C000) 20390OSCLI"LOAD <6502Em$Dir>.ROMS.M128.OS3,5 "+STR$~(roms+romsize%*16) 20400OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20410socket%=15 20420PROCloadROM("M128.Terminal35",1) 20430?(roms+romsize%*15+&16A3)=3 20440?(roms+romsize%*15+&16A4)=&80 20450?(roms+romsize%*15+&16D0)=3 20460?(roms+romsize%*15+&16D1)=&81 20470PROCloadROM("M128.ViewB3,3",1) 20480PROCloadROM("VDFS",1) 20500PROCloadROM("M128.BASIC4r32",1) 20510PROCloadROM("M128.Edit1,50r",1) 20520PROCloadROM("M128.ViewSh1,01",1) 20530PROCloadROM("M128.DFS2,45",1) 20570PROCSRRAM 20580PROCSRRAM 20590PROCSRRAM 20600PROCSRRAM 20610PROCSRRAM 20620ENDPROC 20640DEFPROCcompact 20650PROCloadcode("CodeM") 20660OSCLI"LOAD <6502Em$Dir>.ROMS.Compact.OS5,1 "+STR$~(memory+&C000) 20670OSCLI"LOAD <6502Em$Dir>.ROMS.Compact.OS5,1 "+STR$~(roms+&4000*16) 20680OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 20690socket%=15 20700PROCloadROM("Compact.Utils",1) 20710?(roms+romsize%*15+&9E3A-&8000)=3 20720?(roms+romsize%*15+&9E3B-&8000)=&82 20730?(roms+romsize%*15+&9F3A-&8000)=3 20740?(roms+romsize%*15+&9F3B-&8000)=&83 20750PROCloadROM("Compact.BASICIV86",1) 20770PROCloadROM("VDFS",1) 20780socket%=7 20790PROCSRRAM 20800PROCSRRAM 20810PROCSRRAM 20820PROCSRRAM 20830ENDPROC 20850DEFPROCelectron 20860PROCloadcode("CodeE") 20870OSCLI"LOAD <6502Em$Dir>.ROMS.ELECTRON "+STR$~(memory+&C000) 20960socket%=15 20970PROCloadROM("BASICII",1) 20980PROCloadROM("VDFS",1) 20990ENDPROC 21010DEFPROCBBCB 21020PROCloadcode("Code") 21030?ACCCON=0 21040IFuseMEMC%THEN 21050FORI%=0TO15 21060OSCLI"LOAD <6502Em$Dir>.ROMS.OS1,2 "+STR$~(roms+&4000+&8000*I%) 21070NEXT 21080ELSE 21090OSCLI"LOAD <6502Em$Dir>.ROMS.OS1,2 "+STR$~(memory+&C000) 21110OSCLI"LOAD <6502Em$Res>.SHEILA "+STR$~sheila 21120ENDIF 21210socket%=15 21220PROCloadROM("BASICII",1) 21230PROCloadROM("VDFS",1) 21240PROCSRRAM 21250ENDPROC 21270DEFPROCnewmachine 21280IFNOTuseMEMC%THENPROCclearmem(roms,roms+16*romsize%) 21290PROCinitROMs 21310IFmachine%>4THENmachine%=0 21340CASEmachine%OF 21360WHEN1 21370IFMachine%(1)=0THENmachine%+=1:PROCnewmachine:ENDPROC 21380PROCmaster 21400WHEN2 21410IFMachine%(2)=0THENmachine%+=1:PROCnewmachine:ENDPROC 21420PROCmaster35 21440WHEN3 21450IFMachine%(3)=0THENmachine%+=1:PROCnewmachine:ENDPROC 21460PROCcompact 21480WHEN4 21490PROCelectron 21510OTHERWISE:PROCBBCB 21520ENDCASE 21530PROCreset(1) 21540OSRDCH_loc=FNpeek(&FFE0) 21560PROCreinstall(MachineSprite$(machine%)) 21590ENDPROC 21610DEFPROCdefault_options 21620tapefile$="<6502Em$Dir>.^.Tape-In" 21630Palette%=TRUE 21640OSRDCH%=TRUE 21650ROMSEL%=TRUE 21660Cursor%=FALSE 21670Oscli%=FALSE 21680exact%=TRUE 21690machine%=default_machine% 21700sound_on%=TRUE 21710scroll_hack%=FALSE 21720file_xxx=FALSE 21730volume%=127 21740PROCsetkeymap("Default") 21750ENDPROC 21770DEFPROCsave_options 21780Q=OPENOUT"<6502Em$Res>.Options" 21790PRINT#Q,Palette% 21800PRINT#Q,OSRDCH% 21810PRINT#Q,ROMSEL% 21820PRINT#Q,Cursor% 21830PRINT#Q,Oscli% 21840PRINT#Q,exact% 21850PRINT#Q,machine% 21860PRINT#Q,sound_on% 21870PRINT#Q,file_xxx 21880PRINT#Q,volume% 21890PRINT#Q,KeyMap$ 21900CLOSE#Q 21910ENDPROC 21930DEFPROCload_options 21940tapefile$="<6502Em$Dir>.^.Tape-In" 21950Q=OPENIN"<6502Em$Res>.Options" 21960IFQ=0THENPROCdefault_options:ENDPROC 21970INPUT#Q,Palette% 21980INPUT#Q,OSRDCH% 21990INPUT#Q,ROMSEL% 22000INPUT#Q,Cursor% 22010INPUT#Q,Oscli% 22020INPUT#Q,exact% 22030INPUT#Q,machine% 22040INPUT#Q,sound_on% 22050scroll_hack%=FALSE 22060INPUT#Q,file_xxx 22070INPUT#Q,volume% 22080INPUT#Q,K$:PROCsetkeymap("Default"):PROCsetkeymap(K$) 22090CLOSE#Q 22100ENDPROC 22120DEFPROCclearmem(S%,E%) 22130P%=buffer 22140[OPT2 22150EQUD S%;memory 22160EQUD E%;memory+&8000 22170.clear 22180MOV R0,#0 22190LDR R1,buffer 22200LDR R2,buffer+4 22210.loop 22220STR R0,[R1],#4 22230CMP R1,R2 22240BNE loop 22250MOV PC,R14 22260] 22270CALLclear 22280ENDPROC 22300DEFPROCosbyte2 22310PROCrts 22320ENDPROC 22340DEFPROCosword2 22350LOCALaddr,sec%,len%,buff%,track%,log_sec_size,drive% 22360addr=memory?&F0 22370addr+=memory?&F1<<8 22380addr+=memory 22390CASEmemory?&EFOF 22400WHEN&7F 22410IFdfssupportTHEN 22420SYS"XImageDFS_OSWORD7F",,memory?&F0,memory?&F1,memory 22430a?3=0 22440ELSE 22450drive%=addr?0 22460buff%=memory+(addr!1AND&FFFF) 22470track%=addr?7 22480sec%=addr?8 22490len%=(addr?9)AND%11111 22500log_sec_size=((addr?9)>>5)+7 22510buffer?0=log_sec_size 22520buffer?1=10 22530buffer?2=1 22540buffer?3=1 22550buffer!4=0 22560buffer!8=0 22570buffer!12=1<<29 22580buffer!16=&64000 22590buffer!20=0 22600buffer!24=0 22610buffer!28=0 22620SYS"XADFS_DiscOp",,1+(buffer<<6),(track%*10+sec%)*2^log_sec_size+(osword7F_drive%<<29),buff%,len%*2^log_sec_sizeTOA%;F 22630IF(FAND 1)=0THENaddr?10=0ELSEaddr?10=A% 22650a?3=0 22670ENDIF 22690WHEN&72 22710IFaddr?5=8THEN 22720sec%=addr?8 22730sec%+=addr?7<<8 22740sec%+=(addr?6AND%11111)<<16 22750len%=addr?9 22760buff%=memory+(addr!1AND&FFFF) 22780SYS"XADFS_DiscOp",,1,sec%*256+(osword72_drive%<<29),buff%,len%*256TOA%;F 22790IF(FAND 1)=0THEN?addr=0ELSE?addr=A% 22830a?3=0 22840ENDIF 22850OTHERWISE 22860ENDCASE 22880PROCrts 22910ENDPROC 22930DEFPROCsplit(RETURNA$,RETURNB$) 22940LOCALI% 22950WHILELEFT$(A$,1)=" " 22960A$=RIGHT$(A$,LENA$-1) 22970ENDWHILE 22980FORI%=2TOLENA$ 22990IFMID$(A$,I%,1)="+"THENA$=LEFT$(A$,I%-1)+" "+RIGHT$(A$,1+LENA$-I%):I%=255 23000NEXT 23010I%=INSTR(A$," ") 23030B$=LEFT$(A$,I%-1) 23040A$=RIGHT$(A$,LENA$-I%) 23050ENDPROC 23070DEFPROCsplit2(RETURNA$,RETURNB$) 23080LOCALI% 23090WHILELEFT$(A$,1)=" " 23100A$=RIGHT$(A$,LENA$-1) 23110ENDWHILE 23120I%=INSTR(A$," ") 23130B$=LEFT$(A$,I%-1) 23140A$=RIGHT$(A$,LENA$-I%) 23150ENDPROC 23170DEFPROCsrwrite 23190LOCALA$,C$,addr,I%,J% 23200addr=memory?&F2 23210addr+=(memory?&F3)<<8 23220addr+=memory 23230addr+=y?3 23240C$=$addr 23260PROCsplit(C$,A$) 23280IFLENA$>4THENPROCbrk(0,"Bad Address"):ENDPROC 23290FORI%=1TOLENA$ 23300J%=ASCMID$(A$,I%,1) 23310IF(J%<48ORJ%>57)AND(J%<65ORJ%>70)THENPROCbrk(0,"Bad Address"):ENDPROC 23320NEXT 23340start%=EVAL("&"+A$) 23360IFstart%>&8000THENPROCbrk(0,"Bad Address"):ENDPROC 23380PROCsplit(C$,A$) 23400IFLEFT$(A$,1)="+"THENend%=start%:A$=RIGHT$(A$,LENA$-1)ELSEend%=0 23420IFLENA$>4THENPROCbrk(0,"Bad Address"):ENDPROC 23430FORI%=1TOLENA$ 23440J%=ASCMID$(A$,I%,1) 23450IF(J%<48ORJ%>57)AND(J%<65ORJ%>70)THENPROCbrk(0,"Bad Address"):ENDPROC 23460NEXT 23480end%+=EVAL("&"+A$) 23500IFend%<start%ORend%>&8000THENPROCbrk(0,"Bad Address"):ENDPROC 23520PROCsplit(C$,A$) 23540IFLENA$<>4THENPROCbrk(0,"Bad Address"):ENDPROC 23550FORI%=1TOLENA$ 23560J%=ASCMID$(A$,I%,1) 23570IF(J%<48ORJ%>57)AND(J%<65ORJ%>70)THENPROCbrk(0,"Bad Address"):ENDPROC 23580NEXT 23600dest%=EVAL("&"+A$) 23620IFdest%<&8000ORdest%>&BFFFTHENPROCbrk(0,"Bad Address"):ENDPROC 23640PROCsplit(C$,A$) 23650CASELENA$OF 23660WHEN1 23670A%=ASCA$ 23680IFA%>=ASC"W"AND A%<=ASC"Z"THENA%=A%-ASC"W"+ASC"4" 23690IFA%>64AND A%<71THENA%-=7 23700socket%=A%-48 23710IFsocket%>15ORsocket%<0THENPROCbrk(0,"Bad Socket"):ENDPROC 23720WHEN2 23730IFLEFT$(A$,1)<"0"ORLEFT$(A$,1)>"9"ORRIGHT$(A$,1)<"0"ORRIGHT$(A$,1)>"9"THENPROCbrk(0,"Bad Socket"):ENDPROC 23740socket%=VALA$ 23750IFsocket%>15ORsocket%<0THENPROCbrk(0,"Bad Socket"):ENDPROC 23760OTHERWISE 23770PROCbrk(0,"Bad Socket"):ENDPROC 23780ENDCASE 23820FORI%=0TOFNmin(end%-start%,&BFFF-dest%)STEP4 23830!(roms+romsize%*socket%+I%+dest%-&8000)=start%!(memory+I%) 23840NEXT 23860ROMRAM?socket%=0 23880a?3=0 23890PROCrts 23910ENDPROC 23930DEFPROCdrive 23940LOCALA$,C$,addr,drive% 23950addr=memory?&F2 23960addr+=(memory?&F3)<<8 23970addr+=memory 23980addr+=y?3 23990C$=$addr 24010PROCsplit(C$,file$) 24030PROCsplit(C$,A$) 24050CASEA$OF 24060WHEN"0","1" 24070IFdfssupportTHEN 24080SYS"XImageDFS_BBCToRiscOSDrive",VALA$TOdrive% 24100fs$="ADFS:" 24110disc$=":"+STR$drive%+"." 24120path$="$" 24130subpath$="" 24140ENDIF 24150WHEN"2","3" 24160IFdfssupportTHEN 24170SYS"XImageDFS_BBCToRiscOSDrive",VALA$TOdrive% 24180fs$="ADFS:" 24190disc$=":"+STR$drive%+"." 24200path$="$.DFSSide2" 24210subpath$="" 24220ENDIF 24230WHEN"R","r" 24240PROCreadCSD 24250OTHERWISE 24260PROCbrk(0,"Bad Drive"):ENDPROC 24270ENDCASE 24290a?3=0 24300PROCrts 24310ENDPROC 24330DEFPROCsrload 24340LOCALA$,C$,addr,I%,J% 24350addr=memory?&F2 24360addr+=(memory?&F3)<<8 24370addr+=memory 24380addr+=y?3 24390C$=$addr 24410PROCsplit2(C$,file$) 24430PROCsplit(C$,A$) 24440IFLENA$<>4THENPROCbrk(0,"Bad Address"):ENDPROC 24450FORI%=1TOLENA$ 24460J%=ASCMID$(A$,I%,1) 24470IF(J%<48ORJ%>57)AND(J%<65ORJ%>70)THENPROCbrk(0,"Bad Address"):ENDPROC 24480NEXT 24500load%=EVAL("&"+A$) 24510IFload%<&8000ORload%>&BFFFTHENPROCbrk(0,"Bad Address"):ENDPROC 24520PROCsplit(C$,A$) 24530IFRIGHT$(A$,1)="Q"THENA$=LEFT$(A$,LENA$-1) 24540CASELENA$OF 24550WHEN1 24560A%=ASCA$ 24570IFA%>=ASC"W"AND A%<=ASC"Z"THENA%=A%-ASC"W"+ASC"4" 24580IFA%>64AND A%<71THENA%-=7 24590socket%=A%-48 24600IFsocket%>15ORsocket%<0THENPROCbrk(0,"Bad Socket"):ENDPROC 24610WHEN2 24620IFLEFT$(A$,1)<"0"ORLEFT$(A$,1)>"9"ORRIGHT$(A$,1)<"0"ORRIGHT$(A$,1)>"9"THENPROCbrk(0,"Bad Socket"):ENDPROC 24630socket%=VALA$ 24640IFsocket%>15ORsocket%<0THENPROCbrk(0,"Bad Socket"):ENDPROC 24650OTHERWISE 24660PROCbrk(0,"Bad Socket"):ENDPROC 24670ENDCASE 24690SYS"XOS_Find",&40+%1101,FNadd_(file$),FN_path(file$)TOA%;F 24700IF(FAND 1)<>0THENPROCswi_error:ENDPROC 24710H%=A% 24720SYS"XOS_GBPB",4,A%,load%-&8000+roms+romsize%*socket%,&C000-load%TOA%;F 24730IF(FAND 1)<>0THENPROCswi_error:ENDPROC 24740?(ROMRAM+socket%)=0 24750SYS"XOS_Find",0,H%TOA%;F 24760IF(FAND 1)<>0THENPROCswi_error:ENDPROC 24780a?3=0 24790PROCrts 24800ENDPROC 24820DEFPROCelkkeys(F$) 24840LOCALQ,S$,K%,A$ 24860SYS"6502_GetElectronMap"TOkeymap 24880FORI%=0TO1023STEP4 24890keymap!I%=&FF 24900NEXT 24920Q=OPENINF$ 24930IFQ=0THENERROR0,F$+" not found" 24940REPEAT 24950S$=FNgetword 24960IFLEFT$(S$,1)="#"THEN 24970PROCignoreline 24980ELSE 24990IFS$<>""THEN 25000S%=FNgetelk(S$) 25010REPEAT 25020A$=FNgetword 25030IFA$<>""THEN 25040K%=FNgetarc(A$) 25050keymap!(K%*4)=S% 25060ENDIF 25070UNTILA$="" 25080ENDIF 25090ENDIF 25100UNTILS$=""OREOF#Q 25120CLOSE#Q 25140ENDPROC 25160DEFPROCreadkeys(F$) 25180LOCALQ,S$,K%,A$ 25200SYS"6502_ReadKeyMapAddress"TOkeymap 25210FORI%=0TO255 25220keymap?I%=255 25230NEXT 25250Q=OPENINF$ 25260IFQ=0THENERROR0,F$+" not found" 25270REPEAT 25280S$=FNgetword 25290IFLEFT$(S$,1)="#"THEN 25300PROCignoreline 25310ELSE 25320IFS$<>""THEN 25330S%=FNgetbbc(S$) 25340REPEAT 25350A$=FNgetword 25360IFA$<>""THEN 25370K%=FNgetarc(A$) 25380keymap?K%=S% 25390ENDIF 25400UNTILA$="" 25410ENDIF 25420ENDIF 25430UNTILS$=""OREOF#Q 25450CLOSE#Q 25470ENDPROC 25490DEFFNgetword 25500LOCALI%,A$ 25510REPEATI%=BGET#Q:UNTILI%>32ORI%=10 25520IFI%=10THEN="" 25530A$=CHR$I% 25540REPEATI%=BGET#Q:A$=A$+CHR$I%:UNTILI%<33 25550PTR#Q=PTR#Q-1 25560=LEFT$(A$,LENA$-1) 25580DEFPROCignoreline 25590LOCALI% 25600REPEATI%=BGET#Q:UNTILI%=&A 25610ENDPROC 25630DEFFNgetelk(A$) 25640LOCALI%,J%,K% 25650FORI%=0TO3 25660FORJ%=0TO13 25670IFElec$(I%,J%)=A$THENK%=(I%<<8)+J%:I%=4:J%=14 25680NEXT 25690NEXT 25700=K% 25720DEFFNgetbbc(A$) 25730LOCALI%,J% 25740FORI%=0TO&7C 25750IFBBC$(I%)=A$THENJ%=I%:I%=&80 25760NEXT 25770=J% 25790DEFFNgetarc(A$) 25800LOCALI%,J% 25810FORI%=&0TO&78 25820IFARC$(I%)=A$THENJ%=I%:I%=&68 25830NEXT 25840=J% 25870DATA Escape,1,2,3,4,5,6,7,8,9,0,-,Left,Right 25880DATA CapsLock,Q,W,E,R,T,Y,U,I,O,P,Up,Down,Copy 25890DATA Ctrl,A,S,D,F,G,H,J,K,L,;,:,Return,"" 25900DATA Shift,Z,X,C,V,B,N,M,",",.,/,"",Delete,Space 25930DATA Shift,Ctrl,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,"","","" 25940DATA Q,3,4,5,f4,8,f7,-,^,Left,K6,K7,"" 25950DATA f0,W,E,T,7,I,9,0,_,Down,K8,K9,"" 25960DATA 1,2,D,R,6,U,O,P,[,Up,K+,K-,KReturn 25970DATA CapsLock,A,X,F,Y,J,K,@,:,Return,K/,KDelete,"K." 25980DATA ShiftLock,S,C,G,H,N,L,;,],Delete,K#,K*,"K," 25990DATA Tab,Z,Space,V,B,M,",",".",/,Copy,K0,K1,K3 26000DATA Escape,f1,f2,f3,f5,f6,f8,f9,\,Right,K4,K5,K2 26030DATA Escape,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,"",Print,"","" 26040DATA `,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+ 26050DATA LShift,,Z,X,C,V,B,N,M,",",.,/,RShift,Up,K1,K2,K3,CapsLock,LAlt,Space,RAlt,RCtrl,Left,Down,Right,K0,K.,Enter 26060DATA "","","","","","","","","","","","","","","","" 26070DATA # : REM Risc PC key #~ 26090DEFPROCreadmemmap 26100IFNOTuseMEMC%THENromsize%=&4000:ENDPROC 26110romsize%=&8000 26120DIMMEMC(15),buff 256 26130SYS"OS_ReadMemMapInfo"TOS%,N% 26140IFS%<>32*1024THENERROR 26150FORI%=0TO15 26160FORJ%=0TON%-1 26170!buff=J% 26180buff!4=0 26190buff!8=0 26200buff!12=-1 26210SYS"OS_ReadMemMapEntries",buff 26220IFbuff!4=roms+32*1024*I%THENMEMC(I%)=J%:?(memory-&8000+I%)=J%:J%=N% 26230NEXT 26240NEXT 26250ENDPROC 26270DEFPROCsetupmemmap 26280IFNOTuseMEMC%THENENDPROC 26290LOCALI% 26300FORI%=0TO15 26310!buff=MEMC(I%) 26320buff!4=roms+&8000*I% 26330buff!8=0 26340buff!12=-1 26350SYS"OS_SetMemMapEntries",buff 26360NEXT 26370!buff=MEMC(?romAND 15) 26380buff!4=memory+&8000 26390buff!8=0 26400buff!12=-1 26410SYS"OS_SetMemMapEntries",buff 26420!buff=MEMC(0) 26430buff!4=roms+&8000*(?romAND 15) 26440buff!8=0 26450buff!12=-1 26460SYS"OS_SetMemMapEntries",buff 26470ENDPROC 26490DEFPROCresetmemmap 26500IFNOTuseMEMC%THENENDPROC 26510LOCALI% 26520FORI%=0TO15 26530!buff=MEMC(I%) 26540buff!4=roms+&8000*I% 26550buff!8=0 26560buff!12=-1 26570SYS"OS_SetMemMapEntries",buff 26580NEXT 26590ENDPROC 26610DEFFNpeek(A%) 26620IFNOTuseMEMC%THEN=memory?A%:ENDPROC 26630IFA%<&8000THEN 26640=memory?A% 26650ELSE 26660=?(roms-&8000+A%) 26670ENDIF 26690DEFPROCpoke(A%,V%) 26700IFNOTuseMEMC%THENmemory?A%=V%:ENDPROC 26710FORI%=0TO15 26720memory?(A%+&8000*I%)=V% 26730NEXT 26740ENDPROC 26760DEFPROCdisableCFS 26770IFmachine%>0AND machine%<4THENENDPROC 26780vectors%=memory?&FFB7+(memory?&FFB8<<8) 26800vectors%+=memory 26810addr%=vectors%?&1E+(vectors%?&1F<<8) 26820memory2=roms+romsize%*16-&C000 26840memory?addr%=3 26850memory2?addr%=3 26860memory?&FFCE=3 26870memory2?&FFCE=3 26880memory?&FFD1=3 26890memory2?&FFD1=3 26900memory?&FFD4=3 26910memory2?&FFD4=3 26920memory?&FFD7=3 26930memory2?&FFD7=3 26940memory?&FFDA=3 26950memory2?&FFDA=3 26960memory?&FFDD=3 26970memory2?&FFDD=3 26980ENDPROC 27000DEFPROCboot 27080PROCrts 27100Q=OPENIN(fs$+disc$+path$+subpath$+".!Boot") 27110IFQ<>0THENCLOSE#Q:disable_reset=TRUE:PROCfile_load(fs$+disc$+path$+subpath$+".!Boot"):disable_reset=FALSE:ENDPROC 27120Q=OPENIN(fs$+disc$+path$+subpath$+".!Run") 27130IFQ<>0THENCLOSE#Q:disable_reset=TRUE:PROCsnap_load(fs$+disc$+path$+subpath$+".!Run"):disable_reset=FALSE:ENDPROC 27150PROCbrk(214,"File not found") 27170ENDPROC 27190DEFPROCdemo(A$) 27200SYS"Wimp_ReportError"," "+A$,%11001,"6502Em" 27210ENDPROC
� > !RunImage ,� 6502Em (desktop frontend for binaries) *� (c) Michael and Anne Borcherds, 1995 ($version$="1.50D (29th May 1996)" <c�ș"XWimp_CloseDown":ș"XWimp_ReportError"," Fatal internal error "+Þ+": "+�$,1,"Z80Em":Ș Posword7F_drive%=1 Zosword72_drive%=0 n top%=� xuseMEMC%=� ��useMEMC%� ��=�-19*32*1024 �memory=�+2*32*1024 �roms=memory+32*1024 �rom=memory-&100+96 �� ��=�-(64+64)*1024 �memory=�+64*1024 �� sheila=memory-&200 "�readmemmap 6filetype%=&BBC Tț"<6502Em$Res>.Sound7a" h�templates r�initBBC |�sound_init ��newmachine � �init � �poll �� ���install(sprite$) ��sx%,sy%,sm%,px%,py% �"�text_buff&100,sprite_buff&100 �1ș"Wimp_SpriteOp",40,,sprite$�,,,sx%,sy%,,sm% �4ș"OS_ReadModeVariable",sm%,4�,,px%:sx%=sx%<<px% �4ș"OS_ReadModeVariable",sm%,5�,,py%:sy%=sy%<<py% !q%=-1 /q%!4=0:q%!8=-16:q%!12=q%!4+sx%:q%!16=20+sy% &q%!20=&1700310B :!(q%+24)=text_buff D!(q%+28)=sprite_buff N$text_buff=sprite$ X$sprite_buff="S"+sprite$ b!(q%+32)=&100 lș"Wimp_CreateIcon",,q%�!q% vbar_hand=!q% �� ���reinstall(sprite$) �$sprite_buff="S"+sprite$ �$text_buff=sprite$ �buffer!0=-2 �buffer!4=bar_hand �buffer!8=&00800080 �buffer!12=&00800080 �!ș"Wimp_SetIconState",,buffer buffer!8=0 buffer!12=&00800080 !ș"Wimp_SetIconState",,buffer � 4��templates >�t 4:$t="TASK" H1ș"Wimp_Initialise",200,!t,"6502Em"�RO%,hand% Re�q%256,q2%256,iconmenu%300,optionmenu%400,miscmenu%200,rommenu%800,machine_menu%200,oscli_menu 20 \1�pokemenu%50,pokevalid%12,poketext%12,drag 40 f�temp_regs 12*4,buffer&100 p�install("OS�1.2") ��readpatches � �RO%>299� �-ș"OS_Byte",161,140�,,t%:THREED%=-(t%� 1) �o�THREED%=��ș"Wimp_OpenTemplate",,"<6502Em$Res>.Template3D"�ș"Wimp_OpenTemplate",,"<6502Em$Res>.Templates" �0ș"Wimp_LoadTemplate",,-1,,,-1,"info"�,A%,B% �5ș"Wimp_LoadTemplate",,-1,,,-1,"xfer_send"�,C%,D% �6ș"Wimp_LoadTemplate",,-1,,,-1,"xfer_send2"�,E%,F% �� �3ș"Wimp_OpenTemplate",,"<6502Em$Res>.Templates" �+A%=700:B%=300:C%=400:D%=350:E%=C%:F%=D% �� �@�buffer2 A%,icon3 B%,xfer1 C%+4,xfer2 D%,xfer3 E%+4,xfer4 F% ;ș"Wimp_LoadTemplate",,buffer2,icon3,icon3+B%,-1,"info" >ș"Wimp_LoadTemplate",,xfer1,xfer2,xfer2+D%,-1,"xfer_send" ?ș"Wimp_LoadTemplate",,xfer3,xfer4,xfer4+F%,-1,"xfer_send2" $ș"Wimp_CloseTemplate" .,ș"Wimp_CreateWindow",,xfer1�A%:xfer%=A% 8-ș"Wimp_CreateWindow",,xfer3�A%:xfer2%=A% B.ș"Wimp_CreateWindow",,buffer2�A%:info%=A% V!buffer=info% `buffer!4=9 j!ș"Wimp_GetIconState",,buffer t$(buffer!28)=version$+�0 �!buffer=info% �buffer!4=11 �!ș"Wimp_GetIconState",,buffer �0�"Load <6502Em$Res>.SerialNo "+�~(buffer!28) �� � ��init �ș"OS_GetEnv"�A$ ���A$,1)=" "� �I%=0 ��I%+=1:��A$,�A$-I%,1)<>" " �A$=�A$,�A$-I%) � ��A$,1)=�34�A$=�A$,�A$-1) �A$,1)=�34�A$=�A$,�A$-1) I%=0 ($�I%+=1:��A$,�A$-I%,1)=" "�I%=�A$ 2A$=�A$,I%) <<�upper(�A$,�A$-9,10))<>".!RUNIMAGE"��snap_load(A$):�BBC P� d ��poll n��report(�$,�<>1)=2��quit �� �mask%=%1100000110011 ��resetmemmap �"ș"Wimp_Poll",mask%,q%�action% ��setupmemmap �Ȏaction%� ��2:ș"Wimp_OpenWindow",,q% ��3:ș"Wimp_CloseWindow",,q% � �6:�click ��7:�save ��9:�decodemenu �17,18:�message � "�� ,� @ ��message JȎq%!16� T�0:�quit N�3 Xș"OS_WriteN",q%+44�A$ bȎq%!40� l�filetype%:�snap_load(A$) v"�&FFB,&FFE:�file_load(A$):�BBC �� ��5 �Ȏq%!40� ��filetype% �7q%!16=4:q%!12=q%!8:ș"Wimp_SendMessage",17,q%,q%!20 �ș"OS_WriteN",q%+44�A$ ��snap_load(A$):�BBC � � 符-1� �ș"OS_WriteN",q%+44�A$ � F$=A$ /ș"OS_File",5,F$�type%,,load%,exec%,length% -�type%=2���F$,�F$-��leaf(F$)-1),1)<>"!"�� ��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:� X�type%=0�F$=A$+"."+�A$,�A$-��leaf(A$)-2):ș"OS_File",5,F$�type%,,load%,exec%,length% >Y�((load%>>>16)=0�(load%>>>16)=&FFFF�(load%>>>16)=&00FF)�(load%�&FFFF)<&8000� type%=1� H7q%!16=4:q%!12=q%!8:ș"Wimp_SendMessage",17,q%,q%!20 R�file_load(F$) \�BBC f� p� z� ��&400C1 �� �� ��click mx%=q%!0 my%=q%!4 $mb%=q%!8 .h%=q%!12 8i%=q%!16 B�h%=-2� L?�mb%=2��menus:ș"Wimp_CreateMenu",,iconmenu%,mx%-64,96+8*44 V�mb%=1� `�readCSD j�BBC t� ~�mb%=4��BBC �� �5�i%=3�(h%=xfer%�h%=xfer2%)�ș"Wimp_CreateMenu",-1 �� ���menus ��P% �9�menuheader(iconmenu%,"6502Em",�"Single Task "*16+12) �'�menuitem(0,info%,&07000001,"Info") 0�menuitem(0,optionmenu%,&07000001,"Options") M�menuitem(-(patch%<>0),patchmenu%,&07000001�-(2^22)*(patches%=0),"Patch") *�menuitem(0,rommenu%,&07000001,"ROMs") &+�menuitem(0,miscmenu%,&07000001,"Misc") D.�menuitem(0,xfer%,&07000001�(2^22),"Save") X1�menuitem(0,xfer2%,&07000001�(2^22),"Sprite") �&�menuitem(&80,-1,&07000001,"Quit") �$buffer!0=0:buffer!4=0:buffer!8=0 �4ș"OS_ReadVarVal","6502Em$Keymap",buffer,255�,S$ �keymap%=�keymap(S$) ��keymaps%<>0� �-�menuheader(keysmenu%,"Keymaps",12*16+12) ��I%=1�keymaps% �G�menuitem(-&80*(I%=keymaps%)-(keymap%=I%),-1,&07000001,keymap$(I%)) �� �� �patches%<>0� .�menuheader(patchmenu%,"Patches",12*16+12) �I%=1�patches% E�menuitem(-&80*(I%=patches%)-(patch%=I%),-1,&07000001,patch$(I%)) *� 4� H/�menuheader(rommenu%,"Protected?",12*16+12) R�I%=15�0�-1 \F�menuitem(-(?(ROMRAM+I%)<>0)-&80*(I%=0),-1,&07000001,�ROMname(I%)) f� z8�menuheader(miscmenu%,"Misc",�"Disable Tape "*16+12) �(�menuitem(0,-1,&07000001,"Read CSD") �%�menuitem(0,-1,&07000001,"Reset") ��machine%=0�machine%=4� �.�menuitem(&80,-1,&07000001,"Disable Tape") �� �3�menuitem(&80,-1,&07000001�2^22,"Disable Tape") �� �=�menuheader(optionmenu%,"Options",�"Save Options "*16+12) �B�menuitem(0,keysmenu%,&07000001�-(2^22)*(keymaps%=0),"Keymap") �1�menuitem(-ROMSEL%,-1,&07000001,"Paged ROMs") /�menuitem(-Palette%,-1,&07000001,"Palette") -�menuitem(-Cursor%,-1,&07000001,"Cursor") E�indirecteditem(-Oscli%,-1,%100000001,"Pass on OSCLI",oscli_menu) $1�menuitem(-exact%,-1,&07000001,"Exact Speed") .2�menuitem(0,machine_menu%,&07000001,"Machine") 8.�menuitem(-sound_on%,-1,&07000001,"Sound") B7�menuitem(-scroll_hack%,-1,&07000001,"Scroll Hack") L0�menuitem(-file_xxx,-1,&07000001,"file_xxx") V'�menuitem(0,-1,&07000001,"Default") `.�menuitem(&80,-1,&07000001,"Save Options") t=�menuheader(machine_menu%,"Machine",�"Master 128 "*16+12) ~M�menuitem(-(machine%=0),-1,&07000001�-(2^22)*(Machine%(0)=0),Machine$(0)) �M�menuitem(-(machine%=1),-1,&07000001�-(2^22)*(Machine%(1)=0),Machine$(1)) �M�menuitem(-(machine%=2),-1,&07000001�-(2^22)*(Machine%(2)=0),Machine$(2)) �M�menuitem(-(machine%=3),-1,&07000001�-(2^22)*(Machine%(3)=0),Machine$(3)) �P�menuitem(&80-(machine%=4),-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% 2P%!4=B% <P%!8=C% F$(P%+12)=D$+�13 P P%+=24 Z� n$��indirecteditem(A%,B%,C%,D$,E%) xP%!0=A% �P%!4=B% �P%!8=C%+&07000000 �P%!12=E% �P%!16=0 �P%!20=�D$+1 �$E%=D$+�13 � P%+=24 �� ���decodemenu � Ȏ!q%� ��0 ��1 �q%!4>-1� Ȏq%!4� �0 ")�q%!8<>-1��setkeymap(keymap$(q%!8+1)) ,�1:ROMSEL%=�ROMSEL% 6�2:Palette%=�Palette% @�3:Cursor%=�Cursor% J�4:Oscli%=�Oscli% T�5:exact%=�exact% ^:�6:�q%!8<>-1� q%!8<>machine%�machine%=q%!8:�newmachine h�7:sound_on%=�sound_on% r!�8:scroll_hack%=�scroll_hack% |k�9:file_xxx=�file_xxx:�file_xxx��"IconSprites <6502Em$Res>.file_xxx"��"IconSprites <6502Em$Res>.no_xxx" �$�10:�default_options:�newmachine ��11:�save_options �� �� ��2 � �q%!4=-1� �patch%=0 �� �,�patch%<>q%!4+1�patch%=q%!4+1:�loadpatch �� ��3 � �q%!4>-1� �S%=15-(q%!4� 15) "�validROM(S%)�?(ROMRAM+S%)=2� >�?(ROMRAM+S%)=2�?(ROMRAM+S%)=0�?(ROMRAM+S%)=1-?(ROMRAM+S%) � &?(ROMRAM+S%)=2 0� :� D�4 N �q%!4>-1� XȎq%!4� b�0:�readCSD l�1:�reset(1) v�2:�disableCFS �� �� ��5 ��6 �:�quit �� �ș"Wimp_GetPointerInfo",,q% �Y�(q%!8�%1)>0��menus:ș"Wimp_CreateMenu",,iconmenu%,mx%-iconmenu%!16/2-24,16*4+44*2+12 �� �"��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 4� Hݤcount(A$,B$) R �I%,C% \ �I%=1��A$ f�A$,I%,1)=B$�C%+=1 p� z=C% �ݤletter(A$) � �I%,J% � �I%=1��A$ �+�"ABCDEFabcdef",�A$,I%,1))�J%=�:I%=�A$ �� �=J% � ��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% 8�?P%=�"."�?P%=�":"�K$="" B�?P%=13 Lș"Wimp_GetPointerInfo",,q% V7�q%!12<>xfer%� q%!12<>xfer2%�ș"Wimp_CreateMenu",-1 `q%!20=q%!12 jq%!24=q%!16 tq%!28=q%!0 ~q%!32=q%!4 ��save_sprite%=�� �q%!36=65667 �q%!40=filetype% �� �q%!36=80*1024 �q%!40=&FF9 �� �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$) F�I% PI%=�A$+1 Z�I%-=1:��A$,I%,1)="." d=�A$,I%-1) x ��err � ��report(�$,�)��quit��poll �� ���err2(M%) �� ����err �"�hand%<>0�ș"XOS_Find",0,hand% �4ș"XWimp_SetMode",M%:ș"X6502_RemoveExitHandler" ��sound%=���sound_restore ��report(�$,�)��quit��poll �� ݤreport(a$,E%) �A% �E%� "Iș"XWimp_ReportError"," Internal error "+Þ+": "+a$,3,"6502Em"�,A% ,3�ș"XWimp_ReportError"," "+a$,1,"6502Em"�,A% 6� @=A% T ݤcsd ^ș"OS_GBPB",6,,buffer hbuffer?(buffer?1+2)=13 r=$(buffer+2) � ��readCSD �� ����:��:fs$="ADFS:":disc$="":path$="$":subpath$="":ș"XWimp_ReportError"," Error in reading current directory: "+�$,1,"6502Em":� ��I%=0�1 �ș"OS_Args"�FS% �-ș"OS_FSControl",33,FS%,�20," "),20�,,fs$ �3�fs$<>""�fs$=fs$+":":I%=1��"DIR <6502Em$Dir>.^" �� ș"OS_GBPB",5,,buffer buffer?(?buffer+1)=13 disc$=$(buffer+1) &7�disc$=�34+"Unset"+�34�disc$=""�disc$=":"+disc$+"." :path$=�csd D�path$<>"$"� X� bș"OS_FSControl",0,"^" l CSD$=�csd vpath$=CSD$+"."+path$ � �CSD$="$" �(��path$,7)=�34+"Unset"+�34�path$="$" �ș"OS_FSControl",0,path$ �� �subpath$="" �� � ��initBBC � �R%(7) �$�BBC$(&7C),ARC$(&78),Elec$(3,13) � �I%=0�3 �J%=13�0�-1 �Elec$(I%,J%) *� 4� >�I%=0�7 H�J%=0�12 R�BBC$(I%*16+J%) \� f� p �I%=0�&78 z �ARC$(I%) �� ��readkeymaps ��setkeymap("Default") �$�elkkeys("<6502Em$Res>.ElkKeys") �ș"6502_Register" �.�Machine$(4),Machine%(4),MachineSprite$(4) �disable_reset=� �default_machine%=0 �2Machine$(0)="BBC B":MachineSprite$(0)="OS�1.2" 7Machine$(1)="Master 128":MachineSprite$(1)="OS�3.2" 7Machine$(2)=" MOS 3.5":MachineSprite$(2)="OS�3.5" 4Machine$(3)="Compact":MachineSprite$(3)="OS�5.1" $5Machine$(4)="Electron":MachineSprite$(4)="OS�1.0" CMachine%(4)=� VQ=�"<6502Em$RomPath>OS1,2" `)�Q<>0��#Q:Machine%(0)=��Machine%(0)=� j%�Machine%(0)=��default_machine%=1 ~#Q=�"<6502Em$RomPath>M128.OS3,2" �)�Q<>0��#Q:Machine%(1)=��Machine%(1)=� �4�Machine%(0)=�� Machine%(1)=��default_machine%=2 �#Q=�"<6502Em$RomPath>M128.OS3,5" �)�Q<>0��#Q:Machine%(2)=��Machine%(2)=� �C�Machine%(0)=�� Machine%(1)=�� Machine%(2)=��default_machine%=3 �&Q=�"<6502Em$RomPath>Compact.OS5,1" �)�Q<>0��#Q:Machine%(3)=��Machine%(3)=� �j�Machine%(0)=�� Machine%(1)=�� Machine%(2)=�� Machine%(3)=���0,"No ROMs found - please run !Rip65Host" �Q=�"<6502Em$Dir>.Code" L%=�#Q �#Q �code L%+3000 �useMEMC%��roms 17*16*1024 2�cmos%(63):�loadCMOS <�eeprom%(255):�loadEEPROM Fȕ(code� 15)<>0:code+=1:� Z'indexfile$="":index%=0:newindex%=-1 �sprite=0 �save_sprite=� ��readCSD �5FS$=fs$:DISC$=disc$:PATH$=path$:SUBPATH$=subpath$ �assemble �load_options T2�file_xxx��"IconSprites <6502Em$Res>.file_xxx" �*FX229,1 patch%=0 X� l��SRRAM v?(ROMRAM+socket%)=0 �socket%=(socket%-1)� 15 �� ���killROM(S%) ��I% �?(ROMRAM+S%)=2 ��I%=0�255�16 �I%!(roms+romsize%*S%)=0 �� �� ���loadROM(R$,R%) ��Q% /�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 4�#Q% >?(ROMRAM+S%)=R% H� \��initROMs f�S% p�S%=0�15 z?(ROMRAM+S%)=2 �� �� �ݤROMname(S%) ��?(ROMRAM+S%)=2�="Empty" ��resetmemmap � �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% .� 8�setupmemmap B=N$ VݤvalidROM(S%) `�I% jI%=roms?(romsize%*S%+7) t`�roms?(romsize%*S%+I%+1)=&28� roms?(romsize%*S%+I%+2)=&43� roms?(romsize%*S%+I%+3)=&29�=��=� ���reset(A%) ��disable_reset�� ��setupmemmap � ?fe10=&22 �sheila!&C0=&7070B7AB � ?ACCCON=0 �?f=%100 �A%=1� ("�clearmem(memory,memory+&8000) 2?ier=&80 < ?ier2=&80 F ?Eifr=%10 P?Eier=%0 Z ?Elatch=0 d!T1R=&F0<<24 n!T2R=&F0<<24 x!T3R=&F0<<24 �!T4R=&F0<<24 �)�"LOAD <6502Em$Res>.SHEILA "+�~sheila �� �sheila?&20=2 |2!pc_store=(memory?&FFFC+(memory?&FFFD<<8))<<16 �� � ��BBC �e�demo("This is a demo version of 6502Em. It will work for about 2 minutes. Press F12 to finish.") �� �6ș"XOS_SWINumberFromString",,"ImageDFS_Version"�;F �'�(F� 1)=0�dfssupport=��dfssupport=� *FX9 wimp_mode=� &?lastmode=255 0ș"Hourglass_Smash" D�sound_setup N)ș"6502_InstallExitHandler",wimp_mode b���err2(wimp_mode) vb!patch_on=((patch%>0)�%1)+(exact%�%10)+(Cursor%�%100)+(scroll_hack%�%1000)+(�sound_on%�%10000) ��23,16,1,254| � ș"OS_Byte",202,0,255�,FX202 � ș"OS_Byte",247,0,255�,FX247 �ș"OS_Byte",247,255,0 �ș"OS_Byte",106,&81 �ȗ�3,255,255,255 �0ș"OS_Byte",202,memory?&25A�%10000,%11101111 �ș"OS_Byte",118 �hand%=�tapefile$ !?tape_handle=hand% !� !*"�newindex%>=0 index%=newindex% !45�OSRDCH%��poke(&FFE0,OSRDCH_loc)��poke(&FFE0,&23) !>?ROMSEL=1+ROMSEL% !H?Palette=1+Palette% !\A%=roms !f D%=memory !p�setupmemmap !zș&600FA,0 !�b%=�(code+!start_offset) !��setupmemmap !�ș&600FA,1 !�I�sprite<>0�ș"XOS_SpriteOp",256+16,sprite,"BBCScreen",1,0,0,1279,1023 !� *FX15 !� Ȏ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 "� "$� "8�10:�:?lastmode=255 "B�66:�~!pc_store:Q=� "L�15 "V�-3��reset(1)��reset(0) "`� "t�3 "�4�peek(!pc_store>>>16)=3�(!pc_store>>>16)<&C000� "� Ȏ�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 #2�&D0:�srload #<�&D1:�srwrite #F�&D2:�drive #P�&D3:�boot #Z�&D5:�back:a?3=0:�rts #d�&FF:b%=12:�rts #n� #x� #�Ȏ(!pc_store>>>16)� #��&FFF1,&E7EB:�osword #��&FFE0:�osrdch #��&FFD7:�osbget #��&FFD4:�osbput #��&FFDD:�osfile #��&FFDA:�osargs #��&FFD1:�osgbpb #��&FFCE:�osfind #��&F1B1,&F0E8:�osfsc #�� #�� $�7 $cb=(y?3)<<8 $"cb+=x?3 $,cb+=memory $6�I%=0�7 $@R%(I%)=cb!(9+I%*4) $J+�(cb?4�(1<<I%))<>0�R%(I%)=R%(I%)+memory $T� $^ swi%=cb?0 $hswi%+=(cb?1)<<8 $rswi%+=(cb?2)<<16 $��dfssupport� $�Ȏswi%� $��&61140 $� base=cb!9 %Ȏmemory?base� %�0,1,2,3 %�&21:memory?base=0 %&�&4B:memory?base=1 %0�&E0:memory?base=2 %:�&EA:memory?base=3 %D %N�"Drive ";memory?base;" " %X� %b,�memory?(base+6)=&80�memory?(base+6)=&53 %l,�memory?(base+6)=&A0�memory?(base+6)=&4B %�:�memory?(base+11)<>0�memory?(base+9)=memory?(base+9)+1 %�/memory?(base+9)=(memory?(base+9)�%11111)�32 %�R�memory?(base+6)<>&81�ș"XImageDFS_OSWORD7F",,base�256,base�256,memory�R%(0);F %��&61141 %��&61142 %��&61143 & &sș(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 & � &4� &>sș(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 &H� &\ �cb?3<>0� &f�I%=0�cb?3-1 &p+�(cb?5�(1<<I%))<>0�R%(I%)=R%(I%)-memory &zcb!(9+I%*4)=R%(I%) &�� &�� &��(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% '8�err?I%=0�J%=� 'B� 'L�J%=��err?(cb?8-1)=0 'V� 'j!pc_store=!pc_store+(1<<16) 't?f=?f�%1100011 '~�(F� 1)<>0�?f=?f�%01000000 '��(F� 2)<>0�?f=?f�%00000001 '��(F� 4)<>0�?f=?f�%00000010 '��(F� 8)<>0�?f=?f�%10000000 '�� '��12 '� ( � ( �b%=12 (("�hand%<>0�ș"XOS_Find",0,hand% (<ș"OS_Byte",202,FX202 (Fș"OS_Byte",247,FX247 (Zș"OS_Byte",106,1 (n *Set Key$11 "<6502Em$Key11>" (x *Set Key$12 "<6502Em$Key12>" (�ș"6502_RemoveExitHandler" (��sound_restore (�ș"Wimp_SetMode",wimp_mode (�*FX15,0 (�x�demo("The full version is available for �15 from: Warm Silence Software, St Catherine's College, Oxford, OX1 3UJ.") )� )ݤmax(A%,B%) )"�A%>B%�=A%�=B% )6��pullpc )@sp?3=sp?3+1 )J"pc_store?2=?(memory+&100+sp?3) )Tsp?3=sp?3+1 )^"pc_store?3=?(memory+&100+sp?3) )h� )|��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 *ier=memory-&100+77 *ifr2=memory-&100+78 *ier2=memory-&100+79 *&rom=memory-&100+96 *:ROMSEL=memory-&100+92 *DPalette=memory-&100+164 *NROMRAM=memory-&100+100 *X(patch_on=memory-&100+176:!patch_on=0 *blastmode=memory-&100+178 *lfe10=memory-&100+179 *vtape_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 *�P%=code *� [OPT2 *�.Oa *� EQUD 0 *�.Ox *� EQUD 0 +.Oy + EQUD 0 +.Of + EQUD 0 +*.Osp +4 EQUD 0 +>.Opc_store +H EQUD 0 +R.start_offset +\ EQUD 0 +f .trace +p EQUD 0 +z.trace2 +� EQUD 0 +�.init_addr +� EQUD 0 +� .crt_addr +� EQUD 0 +�.T1_addr +� EQUD 0 +� .ifr_addr +� EQUD 0 +�.column_counter_addr +� EQUD 0 +�.ROMSEL_addr +� EQUD 0 ,.Palette_addr , EQUD 0 ,.speed_addr ,$ EQUD 0 ,..elite_addr ,8 EQUD 0 ,B.opco_addr EQUD 0 ,L.bcd_addr EQUD 0 ,V .sheila_writetab_addr EQUD 0 ,`.sheila_readtab_addr EQUD 0 ,j.sound_vectors_addr EQUD 0 ,t.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) ,�� ,�!pc_store=&8004<<16 -� -2��osfile -Faddr=memory+x?3+(y?3)*256 -P Ȏa?3� -Z�0 -d a%=a?3 -n)b$=�addpath($((addr!0�&FFFF)+memory)) -x c%=addr!2 -� d%=addr!6 -�e%=(addr!10�&FFFF)+memory -�f%=(addr!14�&FFFF)+memory -�'ș"XOS_File",a%,b$,c%,d%,e%,f%�A%;F -��(F� 1)=0��rts��swi_error -��5 -�b$=$((addr!0�&FFFF)+memory) -�<ș"XOS_File",13,�add_(b$),,,�_path(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 .6� .@�6 .Jb$=$((addr!0�&FFFF)+memory) .T1ș"XOS_File",6,�addpath(b$)�A%,,c%,d%,e%,f%;F .^�(F� 1)=1� .h�swi_error .r� .| a?3=A% .� addr!2=c% .� addr!6=d% .�addr!10=e% .�addr!14=f% .��rts .�� .��255 .� a%=a?3 .�b$=$((addr!0�&FFFF)+memory) .�c%=(addr!2�&FFFF)+memory .�,�(addr!2�&FFFF0000)=&FFFE0000�c%-=&13000 / d%=addr?6 /P�d%<>0�ș"XOS_File",13,�add_(b$),,,�_path(b$)�,,c%:d%=0:c%=(c%�&FFFF)+memory /6ș"XOS_File",13,�add_(b$),,,�_path(b$)�,,,,length% /&.�c%+length%>memory+&8000� c%<memory+&8000� /0length%=memory+&7FFF-c% /:.ș"XOS_Find",&4D,�add_(b$),�_path(b$)�A%;F /DL�(F� 1)=0�ș"XOS_GBPB",4,A%,c%,length%:ș"XOS_Find",0,A%:�rts��swi_error /N� /X?ș"XOS_File",12,�add_(b$),c%,0,�_path(b$)�A%,,c%,d%,e%,f%;F /b a?3=A% /l addr!2=c% /v addr!6=d% /�addr!10=e% /�addr!14=f% /��(F� 1)=0��rts��swi_error /�� /� a?3=1 0 0�"OSFILE ";a?3:Q=� 0 � 0*� 0>��swi_error 0H�A$ 0R A$="" 0\ �I%=0�253 0pmemory?(&102+I%)=A%?(I%+4) 0z�A%?(I%+4)=0�I%=253 0�� 0�memory?&100=0 0�memory?&101=?A% 0�!pc_store=&100<<16 0�� 0���brk(A%,A$) 0�A$=A$+�0 0��I%=0��A$-1 0�!memory?(&102+I%)=��A$,I%+1,1) 0�� 1memory?&100=0 1memory?&101=A% 1!pc_store=&100<<16 1$� 18ݤmin(A%,B%)�A%<B%�=A%�=B% 1L��osword 1V Ȏa?3� 1`�0,1,2,3,4 1jpc_store?2=memory?&20C 1tpc_store?3=memory?&20D 1~ �0123 1�addr=x?3+(y?3<<8) 1�)buff=memory?addr+(memory?(addr+1)<<8) 1�Vș"OS_ReadLine",buff+memory,memory?(addr+2),memory?(addr+3),memory?(addr+4)�,Y%;F% 1�)�(F%�%10)=0�memory?(buff+Y%)=13:Y%+=1 1� y?3=Y% 1�#?f=(?f�%11111110)�((F%�%10)>>1) 1��rts 1� �91,93 1�%ș"OS_Word",1,x?3+(y?3<<8)+memory 1��rts 1��92 1�%ș"OS_Word",2,x?3+(y?3<<8)+memory 2 �rts 2 �7 2buffer=memory+x?3+(y?3<<8) 2nchannel%=?buffer�%11 2xflush%=?buffer�%10000 2�sync%=buffer?1�%111 2�cont%=buffer?1�%11110000 2�Aampl%=buffer?2:�ampl%>&EF�ampl%+=&FF00�ampl%+=301:channel%+=4 2�pitch%=buffer?4 2�dur%=buffer?6 2��channel%=0� 2�Ȏpitch%�%111� 2��0,4:pitch%=220 2��1,5:pitch%=160 2��2,6:pitch%=100 2��3,7:pitch%=chan1_pitch% 2�� 2�� 3#�channel%=1�chan1_pitch%=pitch% 3;�cont%=0�ș"Sound_Control",channel%+1,ampl%,pitch%,dur% 3,�rts 3@�8 3r:�?(memory+x?3+(y?3<<8)+1)=0�?(memory+x?3+(y?3<<8)+1)=1 3|,ș"Sarah_Envelope",0,memory+x?3+(y?3<<8) 3��rts 3��&7F 3�addr%=x?3+(y?3<<8)+memory 3�track%=addr%?7 3�sector%=addr%?8 3�)disc_address%=sector%*256+track%*2560 3� length%=(memory?9�%1111)*256 3�addr%?10=0 3��rts 3� �a?3>20� 4pc_store?2=memory?&20C 4pc_store?3=memory?&20D 4� 4&� 4:��osgbpb 4Naddr%=memory+x?3+(y?3<<8) 4X b%=?addr% 4bc%=addr%!1 4ld%=addr%!5 4ve%=addr%!9 4��a?3=9� 4�Wș"XOS_GBPB",a?3,fs$+disc$+path$+subpath$,memory+(c%�&FFFF),b%,e%,d%,0�A%,,,d%,e%;F 4��(F� 1)=0� 4� ?addr%=d% 4�addr%!9=e% 4�(�(F�%10)=0�?f=(?f�%11111110)�?f=?f�1 4��rts 4�� 4��swi_error 4�� 5� 5 ș"OS_FSControl",11,fs$ 5*+ș"OS_FSControl",0,disc$+path$+subpath$ 5>5�(a?3=3�a?3=4)� c%<&8000� c%+e%>&8000�e%=&8000-c% 5R>ș"XOS_GBPB",a?3,b%,memory+(c%�&FFFF),d%,e%�A%,,c%,d%,e%;F 5fș"OS_FSControl",19 5z�(F� 1)=0� 5�addr%!1=c%-memory 5�addr%!5=d% 5�addr%!9=e% 5�(�(F�%10)=0�?f=(?f�%11111110)�?f=?f�1 5��rts 5�� 5��swi_error 5�� 5�� 5�� 5���osargs 6 Ȏa?3� 6�0 6�y?3<>0� 6$!ș"XOS_Args",a?3,y?3�A%,,L%;F 6.-�(F� 1)=0�memory!(x?3)=L%:�rts��swi_error 68� 6Ba?3=4:�rts 6L� 6V�1 6`*ș"XOS_Args",a?3,y?3,memory!(x?3)�A%;F 6j�(F� 1)=0��rts��swi_error 6t�2 6~!ș"XOS_Args",a?3,y?3�A%,,L%;F 6�-�(F� 1)=0�memory!(x?3)=L%:�rts��swi_error 6��255 6�ș"XOS_Args",a?3,y?3�A%;F 6��(F� 1)=0��rts��swi_error 6� :�rts 6�� 6�� 6�ݤupper(A$) 6� �I%,B$ 6� �I%=1��A$ 6�I�A$,I%,1)>="a"��A$,I%,1)<="z"�B$=B$+�(��A$,I%,1)-32)�B$=B$+�A$,I%,1) 7 � 7 =B$ 7 ��quit 7( 72�resetmemmap 7<ș"X6502_DeRegister"�A% 7F(�A%=0�ș"XOS_Module",4,"6502Support" 7Pș"Wimp_CloseDown" 7Z� 7d� 86��snap_load(file$) 8@$�file%,I%,ok%,machine$,M%,patch$ 8Jfile%=�(file$) 8Ttype$=�#file% 8^!�#file%=0�type$="BBC Script" 8rȎtype$� 8��"BBC Tapefile" 8��#file% 8�tapefile$=file$ 8��"BBC Script" 8�� 8�\��:��:ș"XWimp_ReportError"," Error in script: "+�$,3,"6502Em"�,A%:�A%=2��quit��poll 8�scroll_hack%=� 9 ��#file%� 9 A$="" 9&� 90A$=�upper(�#file%) 9:� 9D� 9NB$=�A$,�A$," ")-1) 9X ok%=� 9b ȎB$� 9l�"PALETTE" 9v$�A$,"ON")�Palette%=��Palette%=� 9� �"CURSOR" 9�"�A$,"ON")�Cursor%=��Cursor%=� 9��"EXACTSPEED" 9� �A$,"ON")�exact%=��exact%=� 9��"SOUND" 9�&�A$,"ON")�sound_on%=��sound_on%=� 9��"DISABLETAPE" 9��disableCFS 9��"SCROLLHACK" 9�scroll_hack%=� 9� �"KEYMAP" 9�K$=�A$,�A$-�A$," ")) 9��setkeymap(K$) :�"PATCH" :�patches%<>0� :patch%=0 : �I%=1�patches% :*patch$=�A$,�patch$(I%)) :4�strip(patch$) :>�upper(patch$(I%))=patch$� :H patch%=I% :R�loadpatch :\� :f� :p� :z�"INDEXFILE" :�T$=�A$,�A$-10) :�T%=�(�leaf(file$)+"."+T$) :�X�T%<>0��#T%:indexfile$=�leaf(file$)+"."+T$:index%=0��1,"Index File "+T$+" not found" :��"TAPEFILE" :�T$=�A$,�A$-9) :�T%=�(�leaf(file$)+"."+T$) :�M�T%<>0��#T%:tapefile$=�leaf(file$)+"."+T$��1,"Tape File "+T$+" not found" :��"LOADROM" :�L$=�A$,�A$-8) :��L$,":")=0� :�#�loadROM(�leaf(file$)+"."+L$,1) :�� :��loadROM(L$,1) ;� ;�"LOADRAM" ;L$=�A$,�A$-8) ;$�L$,":")=0� ;.#�loadROM(�leaf(file$)+"."+L$,0) ;8� ;B�loadROM(L$,1) ;L� ;V�"KILLROM" ;`L$=�A$,�A$-8) ;j�I%=0�15 ;t/�upper(�ROMname(I%)),�L$)=L$��killROM(I%) ;~� ;��"MACHINE" ;�machine$=�A$,�A$-8) ;��strip(machine$) ;�Ȏmachine$� ;��"BBC","BBCB","BBC B" ;�M%=0 ;�&�"MASTER","MASTER128","MASTER 128" ;�M%=1 ;�&�"OS3.5","OS 3.5","OS3,5","OS 3.5" ;�M%=2 ;��"COMPACT","MASTER COMPACT" ;�M%=3 <