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
<