Home » Archimedes archive » Acorn Computing » 1994 02 subscription disc.adf » 9402s » PD/ArmSi/!ArmSI/!RunImage
PD/ArmSi/!ArmSI/!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 » Acorn Computing » 1994 02 subscription disc.adf » 9402s |
Filename: | PD/ArmSi/!ArmSI/!RunImage |
Read OK: | ✔ |
File size: | CE2F bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM > !RunImage 20REM ArmSI - Speed Index appliction 30REM Versions <= 3.12 by J.Abbot 40REM Hacked about (postfix H) by Nick Smith, nas20@uk.ac.cam.phx 50 60ON ERROR PROCerror(ERR,REPORT$):PROCpoll:END 70 80DIM block% 1024,window% 10*1024,icon_block% 512,error_blk% 512,block1% 512 90DIM indirected% 10*1024,menu_indirected% 512,menu_block% 1024 100DIM ib_block% 64, tpcode% 1024, C%(35), B%(20) 110DIM ptr1% 256, ptr2% 256 120 130app_name$="ArmSI" 140full_app_name$="ArmSI Speed Index" 150app_version$="3.31H (21-Nov-92)" 160 170PROCInitialise 180PROCcalcsi 190PROCupdateicon(2,FNmachineguess) 200 210PROCpoll 220 230END 240: 250REM *** 260REM *** Wimp routines 270REM *** 280: 290REM Main polling routine 300DEF PROCpoll 310LOCAL poll_mask%, reason% 320poll_mask% = %000110001 330quit% = FALSE 340REPEAT 350 SYS "Wimp_Poll", poll_mask%, block% TO reason% 360 CASE reason% OF 370 WHEN 1 :PROCredraw 380 WHEN 2 :SYS "Wimp_OpenWindow",, block% 390 WHEN 3 :SYS "Wimp_CloseWindow",, block% 400 WHEN 6 :PROCbutton 410 WHEN 7 :PROCdrag_box 420 WHEN 8 :PROCkey_pressed 430 WHEN 9 :PROCmenu_select 440 WHEN 17,18:PROCreceive 450 ENDCASE 460UNTIL (quit%=TRUE) 470SYS "Wimp_CloseDown" 480END 490ENDPROC 500: 510DEF PROCredraw 520LOCAL L% 530SYS "Wimp_RedrawWindow",,block% TO L% 540WHILE L% 550 SYS "Wimp_GetRectangle",,block% TO L% 560ENDWHILE 570ENDPROC 580: 590REM Open Main SI window 600DEF PROCopensi 610!block% = sysinfo% 620SYS "Wimp_GetWindowState",, block% 630block%!28=-1 640SYS "Wimp_OpenWindow",, block% 650ENDPROC 660: 670REM Open Floating-Point results window 680DEF PROCopenfi 690!block% = fpuinfo% 700SYS "Wimp_GetWindowState",, block% 710block%!28=-1 720SYS "Wimp_OpenWindow",, block% 730ENDPROC 740: 750DEF PROCreceive 760LOCAL type%, w% 770w%=block%!20 780type%=block%!40 790CASE block%!16 OF 800 WHEN 0:quit%=TRUE 810 WHEN 2 820 IF my_ref%>0 AND (my_ref%=block%!12) THEN 830 IF type%=our_filetype% THEN PROCsavesi(FNgetname(block%+44)) 840 ENDIF 850 WHEN 3 860 full_file$=FNgetname(block%+44) 870 IF (w%=-2 OR w%=sysinfo% OR w%=fpuinfo%) AND type%=our_filetype% THEN 880 PROCloadsi(full_file$) 890 ENDIF 900 WHEN 5 910 IF type%=our_filetype% THEN 920 full_file$=FNgetname(block%+44) 930 block%!12=block%!8 940 SYS "XWimp_SendMessage",17,block%,w% 950 PROCloadsi(full_file$) 960 ENDIF 970 ENDCASE 980ENDPROC 990: 1000DEF PROCsave(A$,B%) 1010SYS "Wimp_CreateMenu",,-1 1020SYS "Wimp_GetPointerInfo",,icon_block% 1030CASE icon_block%!12 OF 1040 WHEN sysinfo%,proginfo%,savesi% 1050 OTHERWISE 1060 block1%!0=(((45+LEN(A$)) DIV4)+1)*4 1070 block1%!12=0 1080 block1%!16=1 1090 block1%!20=icon_block%!12 1100 block1%!24=icon_block%!16 1110 block1%!28=icon_block%!0 1120 block1%!32=icon_block%!4 1130 block1%!36=-1 1140 block1%!40=B% 1150 $(block1%+44)=A$:?(block1%+44+LEN(A$))=0 1160 SYS "Wimp_SendMessage",17,block1%,icon_block%!12,icon_block%!16 TO ,,task_handle% 1170 my_ref%=block1%!8 1180ENDCASE 1190ENDPROC 1200: 1210DEF PROCbutton 1220LOCAL X%,Y%,button_type% 1230IF block%!16=-1 AND block%!12<>sysinfo% AND block%!12<>fpuinfo% ENDPROC 1240X%=block%!0:Y%=block%!4 1250button_type%=0 1260IF (block%!8 AND %101)>0 button_type%=3 1270IF block%!8=4 button_type%=0 1280IF block%!8=2 button_type%=1 1290IF block%!8=1 button_type%=4 1300IF block%!8=64 button_type%=3 1310CASE block%!12 OF 1320 WHEN -2 1330 IF button_type%=1 menu%=0:PROCmenu(X%,400,"") 1340 IF button_type%=0 PROCopensi 1350 IF button_type%=4 THEN PROCopenfi 1360 WHEN sysinfo% 1370 IF button_type%<2 SYS "Wimp_SetCaretPosition",-1,-1 1380 IF button_type%=1 AND block%!16<>36 THEN 1390 SYS "Wimp_GetPointerInfo",,block1% 1400 menu%=0:PROCmenu(block1%!0,block1%!4,"") 1410 ENDIF 1420 WHEN fpuinfo% 1430 IF button_type%=1 THEN 1440 SYS "Wimp_GetPointerInfo",,block1% 1450 menu%=0:PROCmenu(block1%!0,block1%!4,"") 1460 ENDIF 1470 WHEN savesi% 1480 IF block%!16=2 AND button_type%=0 AND block%!12=savesi% PROCsavesi(FNR_String(savesi%,1)):ENDPROC 1490 IF block%!16=0 AND button_type%=3 THEN 1500 IF block%!12=savesi% drag_icon%=-1 1510 block%!0=block%!12 1520 block%!4=block%!16 1530 SYS "Wimp_GetIconState",,block% 1540 icon_block%!0=block%!0:SYS "Wimp_GetWindowInfo",,icon_block% 1550 X%=icon_block%!4 1560 Y%=icon_block%!16 1570 block%!4=5 1580 block%!8=block%!8+X% 1590 block%!16=block%!16+X% 1600 block%!12=block%!12+Y% 1610 block%!20=block%!20+Y% 1620 block%!24=0 1630 block%!28=0 1640 block%!32=XPixels%<<XFactor% 1650 block%!36=YPixels% 1660 SYS "Wimp_DragBox",,block% 1670 ENDIF 1680ENDCASE 1690ENDPROC 1700: 1710DEF PROCmenu_select 1720LOCAL I% 1730SYS "Wimp_GetPointerInfo",,icon_block% 1740I%=-(icon_block%!8 AND 1) 1750CASE menu% OF 1760 WHEN 0 1770 CASE block%!0 OF 1780 WHEN 1:PROCopensi 1790 WHEN 2:PROCopenfi 1800 WHEN 3:PROCcalcsi 1810 WHEN 4 1820 CASE block%!4 OF 1830 REM ROM speed 1840 WHEN 0:HighROMSpeed=1:PROCUpdateMEMC(&C0,&C0) 1850 WHEN 1:HighROMSpeed=2:PROCUpdateMEMC(&80,&C0) 1860 WHEN 2:HighROMSpeed=3:PROCUpdateMEMC(&40,&C0) 1870 WHEN 3:HighROMSpeed=4:PROCUpdateMEMC(&00,&C0) 1880 WHEN 4:VideoDMA%=NOT(VideoDMA%) 1890 WHEN 5: 1900 IF NOT(FasterBASIC%) THEN 1910 SYS "XWimp_StartTask","RMFaster BASIC" 1920 FasterBASIC%=TRUE 1930 ELSE 1940 SYS "XWimp_StartTask","Obey <ArmSI$Dir>.Resources.OldModule BASIC" 1950 FasterBASIC%=FALSE 1960 ENDIF 1970 WHEN 6: 1980 IF NOT(FasterFPE%) THEN 1990 SYS "XWimp_StartTask","RMFaster FPEmulator" 2000 FasterFPE%=TRUE 2010 ELSE 2020 SYS "XWimp_StartTask","Obey <ArmSI$Dir>.Resources.OldModule FPEmulator" 2030 FasterFPE%=FALSE 2040 ENDIF 2050 WHEN 7: 2060 IF Processor%=3 THEN 2070 CALL readreg 2080 IF (!regword% AND 1)=1 THEN 2090 !regword%=!regword% AND %11111110 2100 CALL writereg 2110 CacheON%=FALSE 2120 ELSE 2130 !regword%=!regword% OR %1 2140 CALL writereg 2150 CacheON%=TRUE 2160 ENDIF 2170 ENDIF 2180 ENDCASE 2190 WHEN 5 2200 CASE block%!4 OF 2210 WHEN 0:IF calcMC% THEN calcMC%=FALSE ELSE calcMC%=TRUE 2220 WHEN 1:IF calcBASIC% THEN calcBASIC%=FALSE ELSE calcBASIC%=TRUE 2230 WHEN 2:IF calcFPU% THEN calcFPU%=FALSE ELSE calcFPU%=TRUE 2240 WHEN 3:IF calcDHRY% THEN calcDHRY%=FALSE ELSE calcDHRY%=TRUE 2250 ENDCASE 2260 WHEN 7:quit%=TRUE 2270 ENDCASE 2280 IF I% menu%=0:PROCmenu(X%,360,"") 2290ENDCASE 2300ENDPROC 2310: 2320DEF PROCkey_pressed 2330IF block%!24<>&D THEN SYS "Wimp_ProcessKey",block%!24:ENDPROC 2340CASE block%!0 OF 2350 WHEN savesi% 2360 IF block%!4>0 THEN 2370 PROCsavesi(FNR_String(savesi%,1)) 2380 ELSE 2390 SYS "Wimp_ProcessKey",block%!24 2400 ENDIF 2410 WHEN sysinfo%:SYS "Wimp_SetCaretPosition",-1,-1 2420 OTHERWISE SYS "Wimp_ProcessKey", block%!24 2430ENDCASE 2440ENDPROC 2450: 2460DEF PROCdrag_box 2470IF drag_icon%=-1 THEN PROCsave(FNleaf(FNR_String(savesi%,1)),our_filetype%) 2480ENDPROC 2490: 2500REM *** 2510REM *** Calculation/Display routines (the 'real' bits of code) 2520REM *** 2530: 2540DEF PROCcalcsi 2550LOCAL temp$, ver%, J%, temp%, flags%, paddr%, pr12%, pbuf%, E%, E1%, A% 2560LOCAL Z%, V%, size%, chunk% 2570 2580IF calcDHRY%=TRUE THEN 2590 SYS "XOS_Module",18,"SharedCLibrary" TO ,,,temp%;flags% 2600 IF (flags% AND 1)=1 THEN PROCerror(0, "You require version 3.75 or above of the SharedCLibrary to run the Dhrystones test"):ENDPROC 2610 temp$=FNgetname(!(temp%+&14)+temp%) 2620 temp$=RIGHT$(temp$,18) 2630 ver%=VAL(RIGHT$(temp$,18))*100 2640 IF ver%<375 THEN PROCerror(0, "You require version 3.75 or above of the SharedCLibrary to run the Dhrystones test"):ENDPROC 2650 J%=OPENIN("<ArmSI$Dir>.Resources.Dhrystones") 2660 CLOSE#J% 2670ENDIF 2680 2690REM ** Operating system bits 2700OSver%=OurOSver% : REM Read at Wimp_Initialise (unlikely to change!) 2710OSstr$=FNosver : REM Cunning (!) routine to get OS string 2720mode%=MODE 2730SYS "OS_ReadModeVariable",mode%,7 TO ,,ScreenSize% 2740 2750REM ** Chip Set information 2760IOCType%=1 2770VIDCType%=1 2780 2790IF OSver%<300 THEN 2800 IOEBType%=0 2810 PeriphType%=0 2820 LCDType%=0 2830 UniqueIDa%=0 2840 UniqueIDb%=0 2850ELSE 2860 SYS "OS_ReadSysInfo",2 TO IOEBType%,PeriphType%,LCDType%,UniqueIDa%,UniqueIDb% 2870 IF (OSver%>=301) AND (PeriphType%=1) THEN 2880 SYS "OS_ReadSysInfo",3 TO temp% 2890 CASE ((temp% >> 20) AND %1111) OF 2900 WHEN 1:PeriphType%=1 2910 WHEN 2:PeriphType%=2 2920 OTHERWISE 2930 PerhipType=-1 2940 ENDCASE 2950 ENDIF 2960ENDIF 2970 2980REM ** Call main code, setting up illegal instruction handler code 2990SYS "OS_ChangeEnvironment",1,retcd1,0,0 TO ,paddr%,pr12%,pbuf% 3000CALL assm_main 3010SYS "OS_ChangeEnvironment",1,retcd2,0,0 3020 3030FPstr$="Unknown" 3040temp%=(!fputype% >> 24) MOD 256 3050CASE temp% OF 3060 WHEN 0 3070 FPAType%=0 3080 FPstr$="Old FPEmulator, v" 3090 SYS "XOS_Module",18,"FPEmulator" TO ,,,temp% 3100 temp$=FNgetname(!(temp%+&14)+temp%) 3110 FPstr$+=RIGHT$(temp$,18) 3120 WHEN 1 3130 FPAType%=0 3140 FPstr$="New FPEmulator, v" 3150 SYS "XOS_Module",18,"FPEmulator" TO ,,,temp% 3160 temp$=FNgetname(!(temp%+&14)+temp%) 3170 FPstr$+=RIGHT$(temp$,18) 3180 WHEN &80:FPAType%=1:FPstr$="FP Protocol Convertor card (WE2206)" 3190 WHEN &81:FPAType%=2:FPstr$="ARM FP Accelerator chip" 3200 OTHERWISE FPAType%=-1:FasterFPE%=FALSE 3210ENDCASE 3220 3230IF calcFPU% AND (FPstr$="Unknown" OR FPAType%=-1) THEN 3240 PROCerror(0, "You require a version of the FPEmulator to run the FP tests"):ENDPROC 3250ENDIF 3260 3270Processor%=!tpres% 3280ProcessorType%=!protype% 3290MEMCType%=!memctype% 3300IF !tpres%=3 THEN 3310 temp%=(ProcessorType% >> 8) AND 255 3320 CASE temp% OF 3330 WHEN 3:Processor%=3 3340 WHEN 6 3350 IF ((ProcessorType% >> 4) AND 255)=&61 THEN Processor%=610 ELSE Processor%=600 3360 WHEN 7:Processor%=700 3370 WHEN 8:Processor%=800 3380 OTHERWISE Processor%=3 3390 ENDCASE 3400ENDIF 3410 3420REM Can't have an 'ARM250' id and no IOEB chip, so either ARM61 or ARM2as 3430IF (!tpres%=250) AND (IOEBType%<=0) THEN Processor%=61 3440 3450TimeTaken1=1<<27 :TimeTaken1L=1<<27 3460TimeTaken1a=1<<27:TimeTaken1aL=1<<27 3470TimeTaken2=1<<27 :TimeTaken2L=1<<27 3480TimeTaken3=1<<27 :TimeTaken3L=1<<27 3490TimeTaken4=1<<27 :TimeTaken4L=1<<27 3500 3510SYS "OS_ReadPalette",0,16 TO ,,C% 3520REM ** Disable Video & Sound DMA (turn DRAM refresh on continuously) 3530IF VideoDMA%=FALSE THEN 3540 VDU 19,0,0| 3550 oldmemc%=FNReadMEMC 3560 WAIT:PROCUpdateMEMC(%0011<<8,%1111<<8) 3570ELSE 3580 SYS "Hourglass_On" 3590ENDIF 3600 3610CALL readclock 3620FOR A%=1 TO 4 3630CALL calcARM:CALL calcARML 3640IF !ARMcount1<TimeTaken1 TimeTaken1=!ARMcount1 3650IF !ARMcount1a<TimeTaken1a TimeTaken1a=!ARMcount1a 3660IF !ARMcount2<TimeTaken2 TimeTaken2=!ARMcount2 3670IF !ARMcount3<TimeTaken3 TimeTaken3=!ARMcount3 3680IF !ARMcount4<TimeTaken4 TimeTaken4=!ARMcount4 3690IF !ARMcount1L<TimeTaken1L TimeTaken1L=!ARMcount1L 3700IF !ARMcount1aL<TimeTaken1aL TimeTaken1aL=!ARMcount1aL 3710IF !ARMcount2L<TimeTaken2L TimeTaken2L=!ARMcount2L 3720IF !ARMcount3L<TimeTaken3L TimeTaken3L=!ARMcount3L 3730IF !ARMcount4L<TimeTaken4L TimeTaken4L=!ARMcount4L 3740NEXT 3750 3760OneClockTick=(1/100)/!timer0 3770 3780REM ** RAM/ROM Speeds 3790RAMSpeed=10E8/((&FFFF AND (!ramspeed%))*1000) 3800MemoryBandwidth=(1/(RAMSpeed*10E-10))*3.2 : REM one N-cycle + 3 S-cycles 3810MEMCState%=FNReadMEMC 3820CASE (MEMCState%>>6) AND %11 OF 3830 WHEN %00:HighROMSpeed=4 3840 WHEN %01:HighROMSpeed=3 3850 WHEN %10:HighROMSpeed=2 3860 WHEN %11:HighROMSpeed=1 3870ENDCASE 3880CASE (MEMCState%>>4) AND %11 OF 3890 WHEN %00:LowROMSpeed=4 3900 WHEN %01:LowROMSpeed=3 3910 WHEN %10:LowROMSpeed=2 3920 WHEN %11:LowROMSpeed=1 3930ENDCASE 3940 3950DRAMRefresh%=(MEMCState%>>8) AND %11 3960CASE DRAMRefresh% OF 3970 WHEN %00:DRAMBandwidth=0 3980 WHEN %01:DRAMBandwidth=(((1/4E-6)/50)*4)*100/MemoryBandwidth 3990 WHEN %10:DRAMBandwidth=0 4000 WHEN %11:DRAMBandwidth=((1/4E-6)*4)*100/MemoryBandwidth 4010ENDCASE 4020 4030E%=FALSE:E1%=FALSE 4040 4050REM ** Calculate FP stuff 4060!FPUtimer=!timer0 4070Z%=0:WHILE FPUresults!(Z%*12)<>-1:FPUresults!(Z%*12)=0:Z%+=1:ENDWHILE 4080IF calcFPU% AND FNfpufound THEN 4090 FOR A%=1 TO 2 4100 CALL calcFPU 4110 NEXT 4120ELSE 4130 IF calcFPU% E1%=TRUE:calcFPU%=FALSE 4140ENDIF 4150SYS "OS_ChangeEnvironment",1,paddr%,pr12%,pbuf% 4160 4170REM ** i,s & n-cycles (for *base* machine) 4180i=125:s=125:n=250 4190 4200!MCcount=0 4210BASICcount=0 4220DHRYmsec=0 4230DHRYvalue=0 4240 4250REM ** MC calc 4260IF calcMC% CALL calcMC 4270 4280REM ** BASIC calc (a bit simple!!) 4290IF calcBASIC% WAIT:TIME=0:FORA%=0TO100000:NEXT:BASICcount=TIME 4300 4310REM ** Video refresh rate, etc 4320SYS "OS_ReadModeVariable",-1,11 TO ,,x%:x%+=1 4330SYS "OS_ReadModeVariable",-1,12 TO ,,y%:y%+=1 4340SYS "OS_ReadModeVariable",-1,3 TO ,,bpp%:IF bpp%=63 THEN bpp%=255 4350bpp%+=1:bpp%=LOG(bpp%)/LOG(2) 4360TIME=0:WAIT:FOR l%=1 TO 20:WAIT:WAIT:WAIT:WAIT:NEXT:hz%=(80/TIME)*1000 4370SYS "OS_ReadModeVariable",-1,7 TO ,,size% 4380band%=(size%*(hz%/10))/104857.6 4390VIDEOstr$="Mode "+STR$(mode%)+" ("+STR$x%+"x"+STR$y%+", "+STR$bpp%+" bpp, "+STR$(hz% DIV 10)+"."+STR$(hz% MOD 10)+" Hz, "+STR$(band% DIV 10)+"."+STR$(band% MOD 10)+" Mb/S)" 4400 4410REM Recalc DRAMBandwidth using screen refresh rate 4420CASE DRAMRefresh% OF 4430 WHEN %00:DRAMBandwidth=0 4440 WHEN %01:DRAMBandwidth=(((1/4E-6)/(hz%/10))*4)*100/MemoryBandwidth 4450 WHEN %10:DRAMBandwidth=0 4460 WHEN %11:DRAMBandwidth=((1/4E-6)*4)*100/MemoryBandwidth 4470ENDCASE 4480 4490REM ** Dhrystone calc 4500IF calcDHRY% THEN 4510 OSCLI "UnSet ArmSI$Dhrystone" 4520 SYS "XWimp_StartTask", "<ArmSI$Dir>.Resources.Dhrystones" 4530 SYS "XOS_ReadVarVal","ArmSI$Dhrystone",ptr1%,32+(1<<31),0,0 TO ,,exist% 4540 IF exist%=0 THEN 4550 DHRYmsec=-1 4560 DHRYvalue=-1 4570 ELSE 4580 SYS "OS_ReadVarVal","ArmSI$Dhrystone",ptr1%,32,0,0 4590 temp$=FNgetname(ptr1%) 4600 DHRYmsec=VAL(temp$) 4610 temp$=MID$(temp$,INSTR(temp$," ")) 4620 DHRYvalue=VAL(temp$) 4630 ENDIF 4640ENDIF 4650 4660REM ** Turn back on Video/sound DMA 4670IF VideoDMA%=FALSE THEN 4680 WAIT 4690 PROCUpdateMEMC(oldmemc%,%1111<<8) 4700 VDU19,0,C% AND &FF,(C%>>8 AND &FF),(C%>>16 AND &FF),(C%>>24 AND &FF); 4710ELSE 4720 SYS "Hourglass_Off" 4730ENDIF 4740 4750InstructionTime1=(s*Instructions)*10E-10 4760InstructionTime1a=((s+16*i)*Instructions)*10E-10 4770InstructionTime2=((s+n+i+2*n)*(Instructions/2))*10E-10 4780InstructionTime3=((7*s+n+i+s*6+2*n)*(Instructions/2))*10E-10 4790InstructionTime4=((2*s+n)*Instructions)*10E-10 4800InstructionTime1L=((4*s+n)*Instructions)*10E-10 4810InstructionTime1aL=((4*s+n+16*i)*Instructions)*10E-10 4820InstructionTime2L=((4*s+4*n+i)*(Instructions/2))*10E-10 4830InstructionTime3L=((16*s+4*n+i)*(Instructions/2))*10E-10 4840InstructionTime4L=((5*s+2*n)*Instructions)*10E-10 4850 4860TimeTaken1=(!timer0-TimeTaken1)*OneClockTick 4870TimeTaken1a=(!timer0-TimeTaken1a)*OneClockTick 4880TimeTaken2=(!timer0-TimeTaken2)*OneClockTick 4890TimeTaken3=(!timer0-TimeTaken3)*OneClockTick 4900TimeTaken4=(!timer0-TimeTaken4)*OneClockTick 4910TimeTaken1L=(!timer0-TimeTaken1L)*OneClockTick 4920TimeTaken1aL=(!timer0-TimeTaken1aL)*OneClockTick 4930TimeTaken2L=(!timer0-TimeTaken2L)*OneClockTick 4940TimeTaken3L=(!timer0-TimeTaken3L)*OneClockTick 4950TimeTaken4L=(!timer0-TimeTaken4L)*OneClockTick 4960 4970MIPS1=INT((Instructions/TimeTaken1)/10000)/100 4980MIPS1a=INT((Instructions/TimeTaken1a)/10000)/100 4990MIPS2=INT((Instructions/TimeTaken2)/10000)/100 5000MIPS3=INT((Instructions/TimeTaken3)/10000)/100 5010MIPS4=INT((Instructions/TimeTaken4)/10000)/100 5020 5030Index1=INT(InstructionTime1/TimeTaken1*100)/100 5040Index1a=INT(InstructionTime1a/TimeTaken1a*100)/100 5050Index2=INT(InstructionTime2/TimeTaken2*100)/100 5060Index3=INT(InstructionTime3/TimeTaken3*100)/100 5070Index4=INT(InstructionTime4/TimeTaken4*100)/100 5080Index1L=INT(InstructionTime1L/TimeTaken1L*100)/100 5090Index1aL=INT(InstructionTime1aL/TimeTaken1aL*100)/100 5100Index2L=INT(InstructionTime2L/TimeTaken2L*100)/100 5110Index3L=INT(InstructionTime3L/TimeTaken3L*100)/100 5120Index4L=INT(InstructionTime4L/TimeTaken4L*100)/100 5130 5140MIPS1L=INT(MIPS1/Index1*Index1L*100)/100 5150MIPS1aL=INT(MIPS1a/Index1a*Index1aL*100)/100 5160MIPS2L=INT(MIPS2/Index2*Index2L*100)/100 5170MIPS3L=INT(MIPS3/Index3*Index3L*100)/100 5180MIPS4L=INT(MIPS4/Index4*Index4L*100)/100 5190 5200Index1=Index1/.75 : REM Re-calibrate to 300 series 5210Index1a=Index1a/.49 5220Index2=Index2/.81 5230Index3=Index3/.77 5240Index4=Index4/.83 5250Index1L=Index1L/.80 5260Index1aL=Index1aL/.53 5270Index2L=Index2L/.81 5280Index3L=Index3L/.78 5290Index4L=Index4L/.84 5300 5310CASE Processor% OF 5320 5330 WHEN 1 5340 Index1a=0:Index1aL=0:MIPS1a=0:MIPS1aL=0:TimeTaken1a=0:TimeTaken1aL=0 5350 Z=(MIPS1*686+MIPS2*290+MIPS3*9+MIPS4*15+MIPS1L*686+MIPS2L*290+MIPS3L*9+MIPS4L*15)/2 5360 TotalMIPS=INT(Z/1000*100)/100 5370 TotalIndex=INT((Index1+.49+Index2+Index3+Index4+Index1L+.53+Index2L+Index3L+Index4L)/10*100)/100 5380 5390OTHERWISE 5400 5410 Z=(MIPS1*685+MIPS1a+MIPS2*290+MIPS3*9+MIPS4*15+MIPS1L*685+MIPS1aL+MIPS2L*290+MIPS3L*9+MIPS4L*15)/2 5420 TotalMIPS=INT(Z/1000*100)/100 5430 TotalIndex=INT((Index1+Index1a+Index2+Index3+Index4+Index1L+Index1aL+Index2L+Index3L+Index4L)/10*100)/100 5440ENDCASE 5450 5460MCIndex=0:BASICIndex=0:DHRYIndex=0 5470IF calcMC% MCIndex=INT(161/(!MCcount)*1000)/1000 5480IF calcBASIC% BASICIndex=INT(143/BASICcount*1000)/1000 5490IF calcDHRY% DHRYIndex=DHRYvalue/5920.7 5500 5510REM ** RAM/ROM Sizes 5520SYS "OS_ReadMemMapInfo" TO A%,B%:RAMSize%=(A%*B%) DIV 1024:RAMPageSize%=A% 5530IF OSver%<300 THEN 5540 REM No extension ROMs possible 5550 ROMsize%=512*1024:ROMsize5th%=0:ROMnum5th%=0 5560ELSE 5570 SYS "XPodule_ReturnNumber" TO ,ROMnum5th%;flags% 5580 IF (flags% AND 1)=1 THEN 5590 REM Can't read number of extension ROMs, so mark as 'Unknown', -1 5600 ROMsize%=2048*1024:ROMsize5th%=0:ROMnum5th%=-1 5610 ELSE 5620 ROMsize%=2048*1024 5630 ROMsize5th%=0 5640 IF ROMnum5th%>0 THEN 5650 FOR loop%=-2 TO -(ROMnum5th%+1) STEP -1 5660 chunk%=0 5670 REPEAT 5680 SYS "XPodule_EnumerateChunksWithInfo",chunk%,,,loop% TO chunk%,size%;flags% 5690 V%=flags% AND 1 5700 IF (chunk%<>0) AND (V%=0) THEN ROMsize5th%+=size% 5710 UNTIL (chunk%=0) OR (V%=1) 5720 NEXT 5730 ENDIF 5740 ENDIF 5750ENDIF 5760 5770ScreenBandwidth=(ScreenSize%*(hz%/10))*100/MemoryBandwidth 5780ProcessorBandwidth=100-ScreenBandwidth-DRAMBandwidth 5790CASE Processor% OF 5800 WHEN 2:REM ARM2 takes all remaining bandwidth 5810 WHEN 3:IF ProcessorBandwidth>14 ProcessorBandwidth=14 5820 CALL readreg 5830 IF (!regword% AND 1) = 1 THEN CacheON%=TRUE ELSE CacheON%=FALSE 5840ENDCASE 5850 5860SYS "XOS_Module",18,"BASIC",,0 TO ,,,temp% 5870IF temp%<&03800000 THEN FasterBASIC%=TRUE ELSE FasterBASIC%=FALSE 5880IF temp%<=0 THEN FasterBASIC%=-99 5890SYS "XOS_Module",18,"FPEmulator",,0 TO ,,,temp% 5900IF temp%<&03800000 THEN FasterFPE%=TRUE ELSE FasterFPE%=FALSE 5910IF temp%<=0 THEN FasterFPE%=FALSE 5920 5930REM ** A500 ID (looks at keyboard type) 5940SYS "OS_InstallKeyHandler",1 TO keyid% 5950IF keyid%=0 THEN 5960 REM Looks like we've found ourselves a genuine A500 folks ! 5970 VIDCType%=3 5980ENDIF 5990 6000REM *** Test for PCATS enhancer card (SWI Enhancer_HardwarePresent) 6010SYS &62A4D TO ;flags% 6020IF (flags% AND 1) = 0 THEN VIDCType%+=128 6030 6040PROCdisplaysi 6050ENDPROC 6060: 6070DEF FNosver 6080LOCAL ERROR 6090ON ERROR LOCAL:=REPORT$ 6100SYS "OS_Byte",0,0 6110="Unknown" 6120: 6130REM A fun little routine that makes a fair guess of machine type 6140REM Please correct/improve and return to me! Nick. 6150REM Possible improvments - distinguish machines based on sizes/types 6160REM of HD. eg, A4x0/1 series had built in ST506 controller, A540 has 6170REM a SCSI podule as standard, etc. Hack, hack, hack ! 6180: 6190DEF FNmachineguess 6200LOCAL name$ 6210 6220IF VIDCType%=3 THEN name$="A500 prototype, "+LEFT$(OSstr$,12):=name$ 6230CASE Processor% OF 6240 WHEN 1:name$="Unknown ARM1 machine" 6250 WHEN 2: 6260 CASE MEMCType% OF 6270 WHEN 0 6280 CASE RAMSize% OF 6290 WHEN 512:name$="Original A305" 6300 WHEN 1024:name$="Original A310" 6310 WHEN 2048:name$="Expanded A305/310" 6320 WHEN 4096:name$="Original A440" 6330 OTHERWISE name$="Unknown ARM2+MEMC1 machine" 6340 ENDCASE 6350 WHEN 1 6360 CASE RAMSize% OF 6370 WHEN 512:name$="Expanded A305, MEMC1a" 6380 WHEN 1024:name$="Original A410/1 or A3000" 6390 WHEN 2048:name$="Original A420/1" 6400 WHEN 4096:name$="Original A440/1" 6410 OTHERWISE name$="Unknown ARM2+MEMC1a" 6420 ENDCASE 6430 OTHERWISE name$="Unknown ARM2 machine" 6440 ENDCASE 6450 6460 WHEN 3: 6470 CASE IOEBType% OF 6480 WHEN 0 6490 IF RAMSpeed<120 THEN 6500 CASE RAMSize% OF 6510 WHEN 4096:name$="Original A540" 6520 WHEN 8192:name$="Expanded A540, 8MB" 6530 WHEN 12288:name$="Expanded A540, 12MB" 6540 WHEN 16384:name$="Expanded A540, 16MB" 6550 OTHERWISE name$="Unknown fast-RAM ARM3 machine" 6560 ENDCASE 6570 ELSE 6580 CASE RAMSize% OF 6590 WHEN 512:name$="Expanded A305, ARM3" 6600 WHEN 1024:name$="Expanded A410/1, ARM3" 6610 WHEN 2048:name$="Expanded A420/1, ARM3" 6620 WHEN 4096:name$="Expanded A440/1, ARM3" 6630 WHEN 8192:name$="Expanded A440/1, 8MB" 6640 OTHERWISE name$="Unknown ARM3 machine" 6650 ENDCASE 6660 ENDIF 6670 WHEN 1 6680 CASE RAMSize% OF 6690 WHEN 2048 6700 CASE LCDType% OF 6710 WHEN 0:name$="Original A5000" 6720 WHEN 1:name$="Original A4 portable" 6730 OTHERWISE name$="Unknown 2MB ARM3+IOEB machine" 6740 ENDCASE 6750 WHEN 4096 6760 CASE LCDType% OF 6770 WHEN 0:name$="A5000, 4MB" 6780 WHEN 1:name$="Expanded A4 portable, 4MB" 6790 OTHERWISE name$="Unknown 4MB ARM3+IOEB machine" 6800 ENDCASE 6810 WHEN 8192:name$="Expanded A5000, 8MB" 6820 OTHERWISE name$="Unknown ARM3+IOEB machine" 6830 ENDCASE 6840 OTHERWISE name$="Unknown IOEB machine" 6850 ENDCASE 6860 6870 WHEN 250: 6880 CASE RAMSize% OF 6890 WHEN 1024:name$="Original A3010" 6900 WHEN 2048:name$="Original A3020/A4000" 6910 WHEN 4096:name$="Expanded A3010/3020/4000, 4MB" 6920 OTHERWISE name$="Unknown ARM250 machine" 6930 ENDCASE 6940 6950 OTHERWISE name$="Machine Unknown" 6960ENDCASE 6970=name$+", "+LEFT$(OSstr$,12) 6980: 6990DEF PROCdisplaysi 7000LOCAL temp 7010SYS "Hourglass_On" 7020 7030block1%!0=sysinfo% 7040SYS "Wimp_GetWindowState",,block1% 7050SH%=block1%!28 7060WO%=(block1%!32>>16) AND %1 7070SYS "Wimp_CloseWindow",,block1% 7080block1%!0=fpuinfo% 7090SYS "Wimp_GetWindowState",,block1% 7100FH%=block1%!28 7110WO%+=(block1%!32>>15) AND %10 7120SYS "Wimp_CloseWindow",,block1% 7130 7140REM ** RAM/ROM Sizes 7150IF RAMPageSize%<=0 THEN 7160 PROCupdateicon(4,STR$(RAMSize%)+" K") 7170ELSE 7180 PROCupdateicon(4,STR$(RAMSize%)+" K ("+STR$(RAMPageSize% DIV 1024)+"K x "+STR$(RAMSize%/(RAMPageSize%/1024))+")") 7190ENDIF 7200IF ROMsize%<=0 THEN 7210 PROCupdateicon(6,"Unknown") 7220ELSE 7230 CASE ROMnum5th% OF 7240 WHEN -1:PROCupdateicon(6,STR$(INT(ROMsize%/1024))+" K (? extension ROMs)") 7250 WHEN 0:PROCupdateicon(6,STR$(INT(ROMsize%/1024))+" K") 7260 OTHERWISE 7270 PROCupdateicon(6,STR$(INT(ROMsize%/1024))+" K (+"+STR$(INT(ROMsize5th%/1024))+"K in "+STR$(ROMnum5th%)+" extension ROMs)") 7280 ENDCASE 7290ENDIF 7300 7310REM ** RAM/ROM Speeds 7320IF INT(RAMSpeed)=125 THEN 7330 CASE INT(HighROMSpeed) OF 7340 WHEN 1:PROCupdateicon(8,"125 nS (Paged mode)") 7350 WHEN 2:PROCupdateicon(8,"200 nS (2 n-cycles)") 7360 WHEN 3:PROCupdateicon(8,"325 nS (3 n-cycles)") 7370 WHEN 4:PROCupdateicon(8,"450 nS (4 n-cycles)") 7380 ENDCASE 7390 CASE INT(LowROMSpeed) OF 7400 WHEN 1:PROCupdateicon(1,"125 nS (Paged mode)") 7410 WHEN 2:PROCupdateicon(1,"200 nS (2 n-cycles)") 7420 WHEN 3:PROCupdateicon(1,"325 nS (3 n-cycles)") 7430 WHEN 4:PROCupdateicon(1,"450 nS (4 n-cycles)") 7440 ENDCASE 7450ELSE 7460 IF HighROMSpeed-INT(HighROMSpeed)>=0.1 THEN 7470 PROCupdateicon(8,STR$(INT(HighROMSpeed*RAMSpeed))+" nS ("+STR$(INT(HighROMSpeed)+1)+" n-cycles)") 7480 ELSE 7490 PROCupdateicon(8,STR$(INT(HighROMSpeed*RAMSpeed))+" nS ("+STR$(HighROMSpeed)+" n-cycles)") 7500 ENDIF 7510 IF LowROMSpeed-INT(LowROMSpeed)>=0.1 THEN 7520 PROCupdateicon(1,STR$(INT(LowROMSpeed*RAMSpeed))+" nS ("+STR$(INT(LowROMSpeed)+1)+" n-cycles)") 7530 ELSE 7540 PROCupdateicon(1,STR$(INT(LowROMSpeed*RAMSpeed))+" nS ("+STR$(LowROMSpeed)+" n-cycles)") 7550 ENDIF 7560ENDIF 7570 7580temp=(INT((1/RAMSpeed)*100000))/100 7590PROCupdateicon(12,STR$(INT(RAMSpeed))+" nS ("+STR$(temp)+" MHz)") 7600 7610CASE DRAMRefresh% OF 7620 WHEN %00:PROCupdateicon(14,"None") 7630 WHEN %01:PROCupdateicon(14,"During Video Flyback only") 7640 WHEN %10:PROCupdateicon(14,"None") 7650 WHEN %11:PROCupdateicon(14,"Continuous") 7660ENDCASE 7670 7680PROCupdateicon(17,STR$(INT(MemoryBandwidth))+" bytes/sec") 7690PROCupdateicon(21,FNstrpad(ScreenBandwidth,4)+"%") 7700B%(1)=FNbar(B%(1),10.28*ScreenBandwidth) 7710PROCupdateicon(24,FNstrpad(DRAMBandwidth,4)+"%") 7720B%(2)=FNbar(B%(2),10.28*DRAMBandwidth) 7730PROCupdateicon(27,FNstrpad(ProcessorBandwidth,4)+"%") 7740B%(3)=FNbar(B%(3),10.28*ProcessorBandwidth) 7750PROCupdateicon(30,FNstrpad(100-ScreenBandwidth-DRAMBandwidth-ProcessorBandwidth,4)+"%") 7760B%(4)=FNbar(B%(4),10.28*(100-ScreenBandwidth-DRAMBandwidth-ProcessorBandwidth)) 7770PROCupdateicon(34,FNstrpad(TotalMIPS,2)+" MIPS") 7780PROCupdateicon(37,FNstrpad(TotalIndex,2)) 7790B%(5)=FNbar(B%(5),154*TotalIndex) 7800 7810PROCupdateicon(42,FNstrpad(Index1,2)) 7820B%(6)=FNbar(B%(6),154*Index1) 7830IF Processor%=1 PROCupdateicon(45,"N/A") ELSE PROCupdateicon(45,FNstrpad(Index1a,2)) 7840B%(7)=FNbar(B%(7),154*Index1a) 7850PROCupdateicon(48,FNstrpad(Index2,2)) 7860B%(8)=FNbar(B%(8),154*Index2) 7870PROCupdateicon(51,FNstrpad(Index3,2)) 7880B%(9)=FNbar(B%(9),154*Index3) 7890PROCupdateicon(54,FNstrpad(Index4,2)) 7900B%(14)=FNbar(B%(14),154*Index4) 7910PROCupdateicon(58,FNstrpad(Index1L,2)) 7920B%(15)=FNbar(B%(15),154*Index1L) 7930IF Processor%=1 PROCupdateicon(61,"N/A") ELSE PROCupdateicon(61,FNstrpad(Index1aL,2)) 7940B%(16)=FNbar(B%(16),154*Index1aL) 7950PROCupdateicon(64,FNstrpad(Index2L,2)) 7960B%(17)=FNbar(B%(17),154*Index2L) 7970PROCupdateicon(67,FNstrpad(Index3L,2)) 7980B%(18)=FNbar(B%(18),154*Index3L) 7990PROCupdateicon(70,FNstrpad(Index4L,2)) 8000B%(19)=FNbar(B%(19),154*Index4L) 8010PROCupdateicon(28,FNstrpad(TotalIndex,3)) 8020B%(10)=FNbar(B%(10),154*(TotalIndex)) 8030Z=TotalIndex:D%=1 8040 8050IF calcMC% THEN 8060 Z+=MCIndex:D%+=1 8070 PROCupdateicon(46,FNstrpad(MCIndex,3)) 8080 B%(11)=FNbar(B%(11),154*MCIndex) 8090ELSE 8100 PROCupdateicon(46,"Not computed") 8110 B%(11)=FNbar(B%(11),0) 8120ENDIF 8130 8140IF calcBASIC% THEN 8150 Z+=BASICIndex:D%+=1 8160 PROCupdateicon(55,FNstrpad(BASICIndex,3)) 8170 B%(12)=FNbar(B%(12),154*BASICIndex) 8180ELSE 8190 PROCupdateicon(55,"Not computed") 8200 B%(12)=FNbar(B%(12),0) 8210ENDIF 8220 8230IF calcDHRY% THEN 8240 IF DHRYmsec=-1 THEN 8250 PROCupdateicon(65,"Not computed") 8260 B%(20)=FNbar(B%(20),0) 8270 ELSE 8280 Z+=DHRYIndex:D%+=1 8290 PROCupdateicon(65,FNstrpad(DHRYIndex,3)) 8300 B%(20)=FNbar(B%(20),154*DHRYIndex) 8310 ENDIF 8320ELSE 8330 PROCupdateicon(65,"Not computed") 8340 B%(20)=FNbar(B%(20),0) 8350ENDIF 8360 8370PROCupdateicon(31,FNstrpad(Z/D%,3)) 8380B%(13)=FNbar(B%(13),154*(Z/D%)) 8390 8400REM ** Chip set 8410CASE MEMCType% OF 8420 WHEN 0:PROCupdateicon(74,"MEMC1 - VL86C110") 8430 WHEN 1:PROCupdateicon(74,"MEMC1a - VL86C110") 8440OTHERWISE 8450 PROCupdateicon(74,"Unknown") 8460ENDCASE 8470 8480CASE IOCType% OF 8490 WHEN 1:PROCupdateicon(76,"IOC1 - VL86C410") 8500 WHEN 2:PROCupdateicon(76,"IOC2") 8510OTHERWISE 8520 PROCupdateicon(76,"Unknown") 8530ENDCASE 8540 8550PROCupdateicon(78,"Unknown") 8560 8570CASE VIDCType% OF 8580 WHEN 1:PROCupdateicon(80,"VIDC1a - VL86C310") 8590 WHEN 2:PROCupdateicon(80,"VIDC1a plus VIDC Enhancer") 8600 WHEN 3:PROCupdateicon(80,"VIDC1") 8610 WHEN 20:PROCupdateicon(80,"VIDC20") 8620 WHEN 129:PROCupdateicon(80,"VIDC1a - VL86C310 (+PCATS Graphics card)") 8630 WHEN 131:PROCupdateicon(80,"VIDC1 (+PCATS Graphics card)") 8640OTHERWISE 8650 PROCupdateicon(80,"Unknown") 8660ENDCASE 8670 8680CASE Processor% OF 8690 WHEN 1:PROCupdateicon(82,"ARM1") 8700 WHEN 2:PROCupdateicon(82,"ARM2 - VL86C010") 8710 WHEN 3 8720 CASE (ProcessorType%>>8) AND &FF OF 8730 WHEN &03:A$="- VL86C020" 8740 OTHERWISE 8750 A$="- VL86C0??" 8760 ENDCASE 8770 A$+=" rev. "+STR$(ProcessorType% AND &FF) 8780 PROCupdateicon(82,"ARM3 "+A$) 8790 WHEN 61:PROCupdateicon(82,"ARM2as/ARM61") 8800 WHEN 250:PROCupdateicon(82,"ARM250 (ARM2as macrocell)") 8810 WHEN 600 8820 CASE (ProcessorType%>>8) AND &FF OF 8830 WHEN &06:A$="- VL86C0??" 8840 OTHERWISE 8850 A$="- VL86C0??" 8860 ENDCASE 8870 A$+=" rev. "+STR$(ProcessorType% AND &0F) 8880 PROCupdateicon(82,"ARM600 "+A$) 8890 WHEN 610 8900 CASE (ProcessorType%>>8) AND &FF OF 8910 WHEN &06:A$="- VL86C0??" 8920 OTHERWISE 8930 A$="- VL86C0??" 8940 ENDCASE 8950 A$+=" rev. "+STR$(ProcessorType% AND &0F) 8960 PROCupdateicon(82,"ARM610 "+A$) 8970 WHEN 700 8980 CASE (ProcessorType%>>8) AND &FF OF 8990 WHEN &07:A$="- VL86C0??" 9000 OTHERWISE 9010 A$="- VL86C0??" 9020 ENDCASE 9030 A$+=" rev. "+STR$(ProcessorType% AND &FF) 9040 PROCupdateicon(82,"ARM700 "+A$) 9050 WHEN 800 9060 CASE (ProcessorType%>>8) AND &FF OF 9070 WHEN &08:A$="- VL86C0??" 9080 OTHERWISE 9090 A$="- VL86C0??" 9100 ENDCASE 9110 A$+=" rev. "+STR$(ProcessorType% AND &FF) 9120 PROCupdateicon(82,"ARM800 "+A$) 9130 OTHERWISE 9140 PROCupdateicon(82,"Unknown") 9150ENDCASE 9160 9170CASE IOEBType% OF 9180 WHEN -1:PROCupdateicon(78,"Unknown") 9190 WHEN 0:PROCupdateicon(78,"Not present") 9200OTHERWISE 9210 PROCupdateicon(78,"IOEB type "+STR$(INT(IOEBType%))) 9220ENDCASE 9230 9240CASE FPAType% OF 9250 WHEN -1:PROCupdateicon(84,"Unknown") 9260 WHEN 0:PROCupdateicon(84,"Not fitted") 9270 WHEN 1:PROCupdateicon(84,"FP Protocol Convertor card (WE2206)") 9280 WHEN 2:PROCupdateicon(84,"ARM FP Accelerator chip") 9290OTHERWISE 9300 PROCupdateicon(84,"Unknown") 9310ENDCASE 9320 9330CASE PeriphType% OF 9340 WHEN -1:PROCupdateicon(68,"Unknown") 9350 WHEN 0:PROCupdateicon(68,"Not fitted") 9360 WHEN 1:PROCupdateicon(68,"82C710") 9370 WHEN 2:PROCupdateicon(68,"82C711") 9380OTHERWISE 9390 PROCupdateicon(68,"Unknown") 9400ENDCASE 9410 9420CASE LCDType% OF 9430 WHEN -1:PROCupdateicon(39,"Unknown") 9440 WHEN 0:PROCupdateicon(39,"Not fitted") 9450OTHERWISE 9460 PROCupdateicon(39,"LCD type "+STR$(INT(LCDType%))) 9470ENDCASE 9480 9490REM ** OS info 9500PROCupdateicon(87,OSstr$) 9510PROCupdateicon(89,VIDEOstr$) 9520CASE UniqueIDa% OF 9530 WHEN -1:PROCupdateicon(91,"Unknown") 9540 WHEN 0:PROCupdateicon(91,"Not available") 9550 OTHERWISE 9560 PROCupdateicon(91,"&"+FNdec_to_hex(UniqueIDa%)+" "+FNdec_to_hex(UniqueIDb%)) 9570ENDCASE 9580PROCupdateicon(93,FPstr$) 9590IF DHRYmsec<=0 THEN 9600 PROCupdateicon(95,"Not computed") 9610 PROCupdateicon(96,"Not computed") 9620ELSE 9630 PROCupdateicon(95,STR$(DHRYmsec)+" �S/loop") 9640 PROCupdateicon(96,STR$(DHRYvalue)+" dhrystones/S") 9650ENDIF 9660PROCupdateicon(99,STR$(mode%)) 9670 9680REM ** FP info 9690FPUtime=0:FPUins=0 9700FPUindex=0 9710A%=0 9720WHILE FPUresults!(12*A%)<>-1 9730 index=INT(((FPUresults!(12*A%+8)/(!FPUtimer-FPUresults!(12*A%)))+0.01)*50)/50 9740 IF FPUresults!(12*A%)>0 THEN 9750 PROCupdateicon2(47+A%,FNstrpad(index,2)) 9760 C%(A%+1)=FNbar2(C%(A%+1),154*index) 9770 FPUindex+=index 9780 FPUtime+=!FPUtimer-FPUresults!(12*A%) 9790 ELSE 9800 PROCupdateicon2(47+A%,"N/A") 9810 C%(A%+1)=FNbar2(C%(A%+1),0) 9820 ENDIF 9830 FPUins+=FPUresults!(12*A%+4)*2 9840 A%+=1 9850ENDWHILE 9860 9870FPUindex=FPUindex/A% 9880IF FPUindex>0 THEN PROCupdateicon2(46,FNstrpad(FPUindex+.005,2)) ELSE PROCupdateicon2(46,"N/A") 9890C%(0)=FNbar2(C%(0),154*FPUindex) 9900IF FPUindex>0 THEN PROCupdateicon2(45,STR$(INT(FPUins/(FPUtime*OneClockTick)))+" FLOPS") ELSE PROCupdateicon2(45,"Not calculated") 9910 9920IF (WO% AND %1) AND SH%<>fpuinfo% THEN 9930 block1%!0=sysinfo%:SYS "Wimp_GetWindowState",,block1% 9940 block1%!28=SH%:SYS "Wimp_OpenWindow",,block1% 9950ENDIF 9960IF WO% AND %10 THEN 9970 block1%!0=fpuinfo%:SYS "Wimp_GetWindowState",,block1% 9980 block1%!28=FH%:SYS "Wimp_OpenWindow",,block1% 9990ENDIF 10000IF (WO% AND %1) AND SH%=fpuinfo% THEN 10010 block1%!0=sysinfo%:SYS "Wimp_GetWindowState",,block1% 10020 block1%!28=SH%:SYS "Wimp_OpenWindow",,block1% 10030ENDIF 10040 10050SYS "Hourglass_Off" 10060IF E% PROCerror(0,"Unable to compute MC/BASIC/FPU/Dhrystone indexes without DRAM refresh"):E%=FALSE 10070IF E1% PROCerror(0,"No Floating Point Unit/Emulator/Chip present"):E1%=FALSE 10080ENDPROC 10090: 10100REM *** 10110REM *** Load/Save code 10120REM *** 10130: 10140REM Save off ArmSI file 10150DEF PROCsavesi(file_name$) 10160LOCAL name$, F%, Z% 10170LOCAL ERROR 10180ON ERROR LOCAL:PROCerror(0, "Couldn't save file - "+REPORT$):CLOSE#F%:ENDPROC 10190PROCU_String(savesi%,1,file_name$) 10200F%=OPENOUT(file_name$) 10210PRINT#F%,330:REM Version 330 (3.30 * 100) 10220name$=FNR_String(sysinfo%,2) 10230PRINT#F%,name$ 10240PRINT#F%,mode%,ScreenSize%,MEMCState%,OneClockTick 10250PRINT#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 10260PRINT#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L 10270PRINT#F%,!MCcount,BASICcount 10280PRINT#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 10290PRINT#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L 10300PRINT#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 10310PRINT#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L 10320PRINT#F%,Processor%,ProcessorType%,IOCType%,MEMCType%,VIDCType% 10330PRINT#F%,RAMSize%,HighROMSpeed,LowROMSpeed,RAMSpeed,DRAMRefresh% 10340PRINT#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth 10350PRINT#F%,TotalMIPS,TotalIndex,MCIndex 10360PRINT#F%,Index1,Index1a,Index2,Index3,Index4 10370PRINT#F%,Index1L,Index1aL,Index2L,Index3L,Index4L 10380PRINT#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% 10390PRINT#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% 10400PRINT#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% 10410Z%=0 10420WHILE FPUresults!(Z%*12)<>-1 10430 PRINT#F%,FPUresults!(Z%*12) 10440 Z%+=1 10450ENDWHILE 10460PRINT#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% 10470PRINT#F%,OSstr$ 10480PRINT#F%,UniqueIDa%,UniqueIDb% 10490PRINT#F%,FPstr$ 10500PRINT#F%,IOEBType%,FPAType%,PeriphType%,LCDType% 10510PRINT#F%,VIDEOstr$ 10520PRINT#F%,FasterBASIC%,FasterFPE%,CacheON% 10530PRINT#F%,VideoDMA%,RAMPageSize% 10540CLOSE#F% 10550OSCLI "SetType "+file_name$+" "+STR$our_filetype% 10560SYS "Wimp_CreateMenu",-1 10570ENDPROC 10580: 10590DEF PROCloadsi(file_name$) 10600LOCAL Z%,F%,V% 10610LOCAL ERROR 10620ON ERROR LOCAL:PROCerror(0, "Couldn't load file '"+file_name$+"' - "+REPORT$):CLOSE#F%:ENDPROC 10630PROCU_String(savesi%,1,file_name$) 10640Z%=0 10650WHILE FPUresults!(Z%*12)<>-1 10660 FPUresults!(Z%*12)=0 10670 Z%+=1 10680ENDWHILE 10690calcFPU%=FALSE 10700E%=FALSE 10710E1%=FALSE 10720 10730F%=OPENIN(file_name$) 10740INPUT#F%,V% 10750CASE V% OF 10760WHEN 1 10770 10780REM Version 1 10790INPUT#F%,A$:PROCupdateicon(2,A$) 10800INPUT#F%,mode%,S,M,OneClockTick 10810ScreenSize%=S:MEMCState%=M 10820INPUT#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3 10830INPUT#F%,!MCcount,BASICcount 10840INPUT#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3 10850INPUT#F%,MIPS1,MIPS1a,MIPS2,MIPS3,P,ProcessorType%,I,M,V 10860Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V 10870INPUT#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D 10880RAMSize%=R 10890INPUT#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth 10900INPUT#F%,TotalMIPS,TotalIndex,Index1,Index1a,Index2,Index3,MCIndex 10910INPUT#F%,BASICIndex,calcMC%,calcBASIC%,D% 10920IF INT(HighROMSpeed)=150 THEN HighROMSpeed=200 10930HighROMSpeed=HighROMSpeed/RAMSpeed 10940LowROMSpeed=LowROMSpeed/RAMSpeed 10950Index4=0 10960Index1L=0:Index1aL=0:Index2L=0:Index3L=0:Index4L=0 10970Index1=Index1/.75 : REM Re-calibrate to 300 series 10980Index1a=Index1a/.49 10990Index2=Index2/.81 11000Index3=Index3/.77 11010TotalIndex=TotalIndex/.74 11020OSver%=-1:ROMsize%=-1:ROMsize5th%=0:ROMnum5th%=-1 11030DHRYIndex=-1:DHRYmsec=-1:DHRYvalue=-1:calcDHRY%=FALSE 11040OSstr$="Unknown" 11050UniqueIDa%=-1:UniqueIDb%=-1 11060FPstr$="Unknown" 11070IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 11080VIDEOstr$="Unknown" 11090FasterBASIC%=FALSE:FasterFPE%=FALSE 11100CacheON%=FALSE:VideoDMA%=FALSE:RAMPageSize%=-1 11110PROCdisplaysi 11120 11130WHEN 2,3 11140REM Version 2,3 11150INPUT#F%,A$:PROCupdateicon(2,A$) 11160INPUT#F%,mode%,S,M,OneClockTick 11170ScreenSize%=S:MEMCState%=M 11180INPUT#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 11190INPUT#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L 11200INPUT#F%,!MCcount,BASICcount 11210INPUT#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 11220INPUT#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L 11230INPUT#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 11240INPUT#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L 11250INPUT#F%,P,ProcessorType%,I,M,V 11260Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V 11270INPUT#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D 11280RAMSize%=R 11290INPUT#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth 11300INPUT#F%,TotalMIPS,TotalIndex,MCIndex 11310INPUT#F%,Index1,Index1a,Index2,Index3,Index4 11320INPUT#F%,Index1L,Index1aL,Index2L,Index3L,Index4L 11330INPUT#F%,BASICIndex,calcMC%,calcBASIC%,D% 11340IF INT(HighROMSpeed)=150 THEN HighROMSpeed=200 11350HighROMSpeed=HighROMSpeed/RAMSpeed 11360LowROMSpeed=LowROMSpeed/RAMSpeed 11370IF V%=3 THEN 11380 INPUT#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% 11390 Z%=0 11400 WHILE FPUresults!(Z%*12)<>-1 11410 INPUT#F%,FPUresults!(Z%*12) 11420 Z%+=1 11430 ENDWHILE 11440ENDIF 11450Index1=Index1/.75 : REM Re-calibrate to 300 series 11460Index1a=Index1a/.49 11470Index2=Index2/.81 11480Index3=Index3/.77 11490Index4=Index4/.83 11500Index1L=Index1L/.80 11510Index1aL=Index1aL/.53 11520Index2L=Index2L/.81 11530Index3L=Index3L/.78 11540Index4L=Index4L/.84 11550TotalIndex=TotalIndex/.74 11560OSver%=-1:ROMsize%=-1:ROMsize5th%=0:ROMnum5th%=-1 11570DHRYIndex=-1:DHRYmsec=-1:DHRYvalue=-1:calcDHRY%=FALSE 11580OSstr$="Unknown" 11590UniqueIDa%=-1:UniqueIDb%=-1 11600FPstr$="Unknown" 11610IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 11620VIDEOstr$="Unknown" 11630FasterBASIC%=FALSE:FasterFPE%=FALSE 11640CacheON%=FALSE:VideoDMA%=FALSE:RAMPageSize%=-1 11650PROCdisplaysi 11660 11670OTHERWISE 11680 IF V%<100 THEN CLOSE#F%:PROCerror(0, "You require version "+STR$V%+".00 or above to read "+file_name$):ENDPROC 11690 IF V%<330 THEN 11700 INPUT#F%,A$ 11710 PROCupdateicon(2,A$) 11720 INPUT#F%,mode%,S,M,OneClockTick 11730 ScreenSize%=S:MEMCState%=M 11740 INPUT#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 11750 INPUT#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L 11760 INPUT#F%,!MCcount,BASICcount 11770 INPUT#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 11780 INPUT#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L 11790 INPUT#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 11800 INPUT#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L 11810 INPUT#F%,P,ProcessorType%,I,M,V 11820 Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V 11830 INPUT#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D 11840 RAMSize%=R 11850 INPUT#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth 11860 INPUT#F%,TotalMIPS,TotalIndex,MCIndex 11870 INPUT#F%,Index1,Index1a,Index2,Index3,Index4 11880 INPUT#F%,Index1L,Index1aL,Index2L,Index3L,Index4L 11890 INPUT#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% 11900 INPUT#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% 11910 INPUT#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% 11920 Z%=0 11930 WHILE FPUresults!(Z%*12)<>-1 11940 INPUT#F%,FPUresults!(Z%*12) 11950 Z%+=1 11960 ENDWHILE 11970 INPUT#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% 11980 INPUT#F%,OSstr$ 11990 INPUT#F%,UniqueIDa%,UniqueIDb% 12000 INPUT#F%,FPstr$ 12010 INPUT#F%,IOEBType%,FPAType%,PeriphType%,LCDType% 12020 INPUT#F%,VIDEOstr$ 12030 IF V%<=324 THEN 12040 FasterBASIC%=FALSE:FasterFPE%=FALSE 12050 CacheON%=FALSE 12060 ELSE 12070 INPUT#F%,FasterBASIC%,FasterFPE%,CacheON% 12080 ENDIF 12090 VideoDMA%=FALSE:RAMPageSize%=-1 12100 PROCdisplaysi 12110 ENDIF 12120 12130 IF V%>326 AND V%<=330 THEN 12140 REM Version 3.30H 12150 INPUT#F%,A$ 12160 PROCupdateicon(2,A$) 12170 INPUT#F%,mode%,ScreenSize%,MEMCState%,OneClockTick 12180 INPUT#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 12190 INPUT#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L 12200 INPUT#F%,!MCcount,BASICcount 12210 INPUT#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 12220 INPUT#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L 12230 INPUT#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 12240 INPUT#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L 12250 INPUT#F%,Processor%,ProcessorType%,IOCType%,MEMCType%,VIDCType% 12260 INPUT#F%,RAMSize%,HighROMSpeed,LowROMSpeed,RAMSpeed,DRAMRefresh% 12270 INPUT#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth 12280 INPUT#F%,TotalMIPS,TotalIndex,MCIndex 12290 INPUT#F%,Index1,Index1a,Index2,Index3,Index4 12300 INPUT#F%,Index1L,Index1aL,Index2L,Index3L,Index4L 12310 INPUT#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% 12320 INPUT#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% 12330 INPUT#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% 12340 Z%=0 12350 WHILE FPUresults!(Z%*12)<>-1 12360 INPUT#F%,FPUresults!(Z%*12) 12370 Z%+=1 12380 ENDWHILE 12390 INPUT#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% 12400 INPUT#F%,OSstr$ 12410 INPUT#F%,UniqueIDa%,UniqueIDb% 12420 INPUT#F%,FPstr$ 12430 INPUT#F%,IOEBType%,FPAType%,PeriphType%,LCDType% 12440 INPUT#F%,VIDEOstr$ 12450 INPUT#F%,FasterBASIC%,FasterFPE%,CacheON% 12460 IF V%>=330 THEN 12470 INPUT#F%,VideoDMA%,RAMPageSize% 12480 ELSE 12490 VideoDMA%=FALSE:RAMPageSize%=-1 12500 ENDIF 12510 PROCdisplaysi 12520 ENDIF 12530 IF V%>330 THEN 12540 PROCerror(0, "You require version "+STR$(V%/100)+" or above to read "+file_name$) 12550 ENDIF 12560 12570ENDCASE 12580CLOSE#F% 12590PROCopensi 12600ENDPROC 12610: 12620REM *** 12630REM *** Shared SI routines 12640REM *** 12650: 12660DEF PROCmenu(X%,Y%,T$) 12670LOCAL pointer%,A%,L%, A$,F%,I% 12680pointer%=menu_block% 12690$pointer%=app_name$ 12700RESTORE +10 12710READ pointer%?12,pointer%?13,pointer%?14,pointer%?15,pointer%!16,pointer%!20,pointer%!24,number% 12720A%=menu_indirected% 12730FOR L%=1 TO number% 12740 IF L%>1 THEN 12750 READ A$,pointer%?12,pointer%?13,pointer%?14,pointer%?15,pointer%!16,pointer%!20,pointer%!24:IF A$="fi$" $pointer%=fi$ ELSE $pointer%=A$ 12760 ENDIF 12770 pointer%+=28 12780 REPEAT 12790 READ F%,I%,A$:IF (F% AND &200)>0 A$+=T$ 12800 $A%=A$ 12810 pointer%!0=F% AND &FF 12820 IF (F% AND &100)=0 pointer%!4=-1 ELSE READ pointer%!4 12830 IF A$="Paged ROM access" THEN 12840 REM No *way* can we get ROMs this fast - it will just crash the machine! 12850 IF RAMSpeed<100 OR OSver%>=300 THEN I%+=(1<<22) 12860 ENDIF 12870 IF A$="RMFaster BASIC" THEN IF FasterBASIC%=-99 THEN I%+=(1<<22) 12880 IF A$="RMFaster FPEmulator" THEN IF OSver%<300 THEN I%+=(1<<22) 12890 IF A$="ARM3 cache on" THEN 12900 CASE INT(Processor%) OF 12910 WHEN 3:REM OK 12920 OTHERWISE I%+=(1<<22) 12930 ENDCASE 12940 ENDIF 12950 IF A$="Write buffer on" THEN 12960 CASE INT(Processor%) OF 12970 WHEN 600,610,700,800:REM OK 12980 OTHERWISE I%+=(1<<22) 12990 ENDCASE 13000 ENDIF 13010 pointer%!8=I% 13020 pointer%!12=A% 13030 pointer%!16=-1 13040 pointer%!20=LENA$ 13050 pointer%+=24:A%+=LEN(A$)+1 13060 UNTIL (F% AND &80)>0 13070NEXT 13080SYS "Wimp_CreateMenu",,menu_block%,X%-(menu_block%!16/2),Y%+16 13090ENDPROC 13100: 13110REM Menu definition statements (ug!) 13120DATA 7,2,7,0,(13*8+12)<<XFactor%,10*4,0,3 13130DATA &100,&7000111,"Info",proginfo% 13140DATA 0,&7000111,"System Info" 13150DATA 0,&7000111,"FP Info" 13160DATA 0,&7000111,"Re-calculate" 13170DATA &100,&7000111,"Improvements",pointer%+24*8+28 13180DATA &100,&7000111,"Speed Indexes",pointer%+24*3 13190DATA &100,&7000111,"Save",savesi% 13200DATA &80,&7000111,"Quit" 13210 13220DATA "S'Indexes",7,2,7,0,(18*8+12)<<XFactor%,10*4,0 13230DATA 0-calcMC%,&7000111,"Machine Code" 13240DATA 0-calcBASIC%,&7000111,"BASIC" 13250DATA 0-calcFPU%,&7000111,"FP index" 13260DATA &80-calcDHRY%,&7000111,"Dhrystone" 13270 13280DATA "Improvement",7,2,7,0,(18*8+16)<<XFactor%,10*4,0 13290DATA 0-(HighROMSpeed=1),&7000111,"Paged ROM access" 13300DATA 0-(HighROMSpeed=2),&7000111,"ROM (2 n-cycles)" 13310DATA 0-(HighROMSpeed=3),&7000111,"ROM (3 n-cycles)" 13320DATA 0-(HighROMSpeed=4),&7000111,"ROM (4 n-cycles)" 13330DATA 2-(VideoDMA%=0),&7000111,"No Video DMA" 13340DATA 0-FasterBASIC%,&7000111,"RMFaster BASIC" 13350DATA 0-FasterFPE%,&7000111,"RMFaster FPEmulator" 13360DATA &80-CacheON%,&7000111,"ARM3 cache on" 13370: 13380DEF PROCerror(err%, report$) 13390IF err%<>0 THEN ERROR 0,report$+" internal error ("+STR$(ERL)+")" 13400!error_blk% = err% 13410$(error_blk%+4)=report$ 13420?(error_blk%+4+LENreport$)=0 13430SYS "XWimp_ReportError", error_blk%, %1, full_app_name$ 13440ENDPROC 13450: 13460REM Update a main SI window icon 13470DEF PROCupdateicon(I%,A$) 13480!icon_block%=sysinfo% 13490icon_block%!4=I% 13500SYS "Wimp_GetIconState",,icon_block% 13510IF icon_block%!24 AND 1<<8 THEN 13520 $(icon_block%!28)=A$ 13530ENDIF 13540!block%=sysinfo% 13550block%!4=I% 13560block%!8=0 13570block%!12=0 13580SYS "Wimp_SetIconState",,block% 13590ENDPROC 13600: 13610REM Update the bar in the main SI window 13620DEF FNbar(I%,W%) 13630IF W%=0 W%=2 13640!icon_block%=sysinfo% 13650icon_block%!4=I% 13660SYS "Wimp_GetIconState",,icon_block% 13670icon_block%!16=icon_block%!8+W% 13680icon_block%!4=sysinfo% 13690SYS "Wimp_CreateIcon",,icon_block%+4 TO W% 13700icon_block%!4=I% 13710icon_block%!8=&11<<24 13720icon_block%!12=&FF<<24 13730SYS "Wimp_SetIconState",,icon_block% 13740!block%=sysinfo% 13750block%!4=I% 13760SYS "Wimp_DeleteIcon",,block% 13770!block%=sysinfo% 13780block%!4=W% 13790block%!8=0 13800block%!12=0 13810SYS "Wimp_SetIconState",,block% 13820=W% 13830: 13840REM Update icon in the FP window 13850DEF PROCupdateicon2(I%,A$) 13860!icon_block%=fpuinfo% 13870icon_block%!4=I% 13880SYS "Wimp_GetIconState",,icon_block% 13890IF icon_block%!24 AND 1<<8 THEN 13900 $(icon_block%!28)=A$ 13910ENDIF 13920!block%=fpuinfo% 13930block%!4=I% 13940block%!8=0 13950block%!12=0 13960SYS "Wimp_SetIconState",,block% 13970ENDPROC 13980: 13990REM Update a bar in the FP window 14000DEF FNbar2(I%,W%) 14010IF W%=0 W%=2 14020!icon_block%=fpuinfo% 14030icon_block%!4=I% 14040SYS "Wimp_GetIconState",,icon_block% 14050icon_block%!16=icon_block%!8+W% 14060icon_block%!4=fpuinfo% 14070SYS "Wimp_CreateIcon",,icon_block%+4 TO W% 14080icon_block%!4=I% 14090icon_block%!8=&11<<24 14100icon_block%!12=&FF<<24 14110SYS "Wimp_SetIconState",,icon_block% 14120!block%=fpuinfo% 14130block%!4=I% 14140SYS "Wimp_DeleteIcon",,block% 14150!block%=fpuinfo% 14160block%!4=W% 14170block%!8=0 14180block%!12=0 14190SYS "Wimp_SetIconState",,block% 14200=W% 14210: 14220REM Check for an FPU/FPA present 14230DEF FNfpufound 14240SYS "OS_ChangeEnvironment",1,retcd3,0,0 14250!nofpu%=0 14260CALL testfpu 14270=(!nofpu%=0) 14280: 14290DEF PROCUpdateMEMC(new%,mask%) 14300SYS "XOS_UpdateMEMC",new%,mask% 14310ENDPROC 14320: 14330DEF FNReadMEMC 14340LOCAL res% 14350SYS "XOS_UpdateMEMC",0,0 TO res% 14360=res% 14370: 14380REM *** 14390REM *** Initialisation routines 14400REM *** 14410: 14420DEF PROCInitialise 14430indirected_pointer%=indirected% 14440ib_block%!0=131 14450ib_block%!4=-1 14460SYS"OS_ReadVduVariables",ib_block%,ib_block% 14470$block% = "TASK" 14480SYS "Wimp_Initialise",200,!block%,full_app_name$ TO OurOSver%,ourtask% 14490SYS "OS_ReadModeVariable",MODE,4 TO ,,XFactor% 14500PROC_load_templates 14510PROC_icon_bar 14520PROC_load_assm 14530PROC_assm_code 14540PROCU_String(savesi%,1,"SI") 14550PROCReset_vars 14560SYS "OS_ReadModeVariable",MODE,4 TO ,,XFactor% 14570SYS "OS_ReadModeVariable",MODE,11 TO ,,XPixels% 14580YPixels%=(!ib_block%)*4+4 14590XPixels%+=1 14600ENDPROC 14610: 14620REM Reset SI variables 14630DEF PROCReset_vars 14640LOCAL loop% 14650 14660REM Display bar icon handles 14670RESTORE +10 14680FOR loop%=1 TO 20 14690 READ B%(loop%) 14700NEXT loop% 14710FOR loop%=0 TO 35 14720 C%(loop%)=82+loop% 14730NEXT loop% 14740 14750our_filetype%=3 14760my_ref%=0 14770DRAMCheck%=FALSE 14780VideoDMA%=TRUE 14790calcMC%=FALSE 14800calcBASIC%=FALSE 14810calcFPU%=FALSE 14820mode%=0:ScreenSize%=0:MEMCState%=0 14830Processor%=0:ProcessorType%=0:IOCType%=0:MEMCType%=0:VIDCType%=0 14840RAMSize%=0:HighROMSpeed=0:LowROMSpeed=0:RAMSpeed=0:DRAMRefresh%=0 14850MemoryBandwidth=0:ScreenBandwidth=0:DRAMBandwidth=0:ProcessorBandwidth=0 14860BASICIndex=0 14870DHRYIndex=0:DHRYmsec=0:DHRYvalue=0 14880FPUindex=0:FPUtime=0 14890OSver%=0:ROMsize%=0:ROMsize5th%=0:ROMnum5th%=0 14900OSstr$="" 14910UniqueIDa%=-1:UniqueIDb%=-1 14920FPstr$="" 14930IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 14940VIDEOstr$="" 14950FasterBASIC%=FALSE 14960FasterFPE%=FALSE 14970CacheON%=FALSE 14980calcDHRY%=FALSE 14990RAMPageSize%=-1 15000 15010ENDPROC 15020: 15030REM Display bar icon handles 15040DATA 100,101,102,103,104 15050DATA 105,106,107,108,115 15060DATA 116,117,119,109,110 15070DATA 111,112,113,114,118 15080: 15090REM Load templates into workspace 15100DEF PROC_load_templates 15110SYS "Wimp_OpenTemplate",,"<ArmSI$Dir>.Resources.Templates" 15120PROCload_template("fpuInfo") 15130SYS "Wimp_CreateWindow",, window% TO fpuinfo% 15140PROCload_template("sysInfo") 15150SYS "Wimp_CreateWindow",, window% TO sysinfo% 15160PROCload_template("progInfo") 15170SYS "Wimp_CreateWindow",, window% TO proginfo% 15180PROCU_String(proginfo%, 4, app_version$) 15190PROCload_template("xfersend") 15200SYS "Wimp_CreateWindow",, window% TO savesi% 15210SYS "Wimp_CloseTemplate" 15220ENDPROC 15230: 15240DEF PROCload_template(A$) 15250$block1%=A$ 15260SYS "Wimp_LoadTemplate",, window%, indirected_pointer%, indirected%+(1024*8), -1, block1%, 0 TO ,,indirected_pointer%,,,,A% 15270IF A%=0 ERROR 0,"Unable to find template definition ("+A$+")" 15280ENDPROC 15290: 15300REM Place an icon on the iconbar 15310DEF PROC_icon_bar 15320LOCAL width%,height% 15330SYS "XWimp_SpriteOp",40,1,"!"+app_name$ TO ,,,width%,height% 15340width%=width%<<XFactor% 15350icon_block%!0=-1 15360icon_block%!4=0 15370icon_block%!8=0 15380icon_block%!12=width%+4 15390icon_block%!16=48+height% 15400icon_block%!20=%000000010 OR (3<<12) OR (7<<24) OR (1<<28) 15410$(icon_block%+24)="!"+app_name$ 15420SYS "Wimp_CreateIcon",,icon_block% TO ib_handle% 15430ENDPROC 15440: 15450REM Load separately assembled code 15460DEF PROC_load_assm 15470$block%="<ArmSI$Dir>.Resources.Code" 15480SYS "OS_File",5,block% TO ,,,,CodeLength% 15490DIM code CodeLength%+&C 15500IF (code AND &F)<>0 code+=4 15510IF (code AND &F)<>0 code+=4 15520IF (code AND &F)<>0 code+=4 15530SYS "OS_File",&FF,block%,code,0 15540 15550$block%="<ArmSI$Dir>.Resources.Code2" 15560SYS "OS_File",5,block% TO ,,,,CodeLength2% 15570DIM code2 CodeLength2%+&C 15580IF (code2 AND &F)<>0 code2+=4 15590IF (code2 AND &F)<>0 code2+=4 15600IF (code2 AND &F)<>0 code2+=4 15610SYS "OS_File",&FF,block%,code2,0 15620 15630Instructions=!code 15640readclock=code+4 15650calcARM=code+8 15660calcARML=code+32 15670calcMC=code+12 15680timer0=code+16 15690ARMcount1=code+20 15700ARMcount1a=code+24 15710ARMcount2=code+28 15720ARMcount3=code+CodeLength%-8 15730ARMcount4=code+CodeLength%-12 15740ARMcount1L=code+CodeLength%-16 15750ARMcount1aL=code+CodeLength%-20 15760ARMcount2L=code+CodeLength%-24 15770ARMcount3L=code+CodeLength%-28 15780ARMcount4L=code+CodeLength%-32 15790MCcount=code+CodeLength%-4 15800calcFPU=code2 15810FPUtimer=code2+4 15820FPUresults=code2+8 15830 15840ENDPROC 15850: 15860REM Some assembler for finding out various things ... 15870DEF PROC_assm_code 15880LOCAL pass%,P% 15890FOR pass%=0 TO 2 STEP 2 15900P%=tpcode% 15910[OPT pass% 15920 15930.assm_main 15940 STMFD R13!, {R0-R12, R14} 15950 SWI "OS_EnterOS" ; Enter SVC mode 15960 MOV R0,PC 15970 ORR R0,R0,#&0C000000 15980 TEQP R0,#0 15990 MOV R0,R0 ; Mustn't use MOVNV ! 16000 16010; Reads from zero page memory 16020 16030 MOV R0, #&100 ; Read MEMC type (in case of protected zero page) 16040 LDRB R1, [R0,#&12] 16050 AND R1, R1, #1 16060 STR R1, memctype% 16070 LDR R1, [R0,#&10] ; Read RAMSpeed 16080 STR R1, ramspeed% 16090 16100; Determine processor type 16110 16120 MOV R1,#0 16130 ADR R2,protype% 16140 MOV R0,#1 ; if no results ARM1 16150 EQUD &E0000091 ; MUL R0,R1,R0 16160 MOV R0,#2 ; ARM 2 16170 EQUD &E1021091 ; SWP R1,R1,[R2] 16180 MOV R0,#250 ; ARM 250 16190 16200; To a coprocessor->register transfer instruction. This will read the processor 16210; id (if available) for ARM3, ARM600, etc. 16220; 16230; R1 = 32 bit processor identity field 16240; bit 31-24 | Designer (41h = Acorn 'A') 16250; bit 23-16 | Manufacturer (56h = vlsi 'V') 16260; bit 15-8 | Part type (03h = arm3, 06h = arm6x0) 16270; bit 7-0 | Revision (0 = revision 0) 16280 16290; ARM6x0 processors ; 16300; bit 15-4 | Part type (060h = arm600, 061h = arm610) 16310; bit 3-0 | Revision (0 = revision 0) 16320 16330 16340 EQUD &EE101F10 ; MRCEQ CP15,0,R1,C0,C0 - request processor type 16350 MOV R0,#3 16360 STR R0,tpres% ; Store type found 16370 STR R1,protype% 16380 MVN R0, #0 16390 EQUD &EE300110 ; RFS R0 - Read FP status register 16400 MOV R0, R0 16410 STR R0, fputype% 16420 TSTP PC,#&F0000000 16430 MOV R0,R0 ; Return to user mode 16440 LDMFD R13!,{R0-R12,PC} 16450 16460; Return-from-exception 'handlers' 16470 16480.retcd1 ADDS PC,R14,#4 16490.retcd2 MOVS PC,R14 16500.retcd3 STR R14,nofpu% 16510 MOVS PC,R14 16520 16530; Test for FPU present 16540 16550.testfpu 16560 EQUD &EE098101 ; MVFE F0,F1 - test for FPU 16570 MOV PC,R14 16580 16590; Read/write ARM3 status registers (for cache on or off) 16600; Yes, I know there is an SWI to do this, but it may not be the same across 16610; different ARM3 upgrades, etc 16620 16630.readreg 16640 STMFD R13!, {R0-R1, R14} 16650 SWI "OS_EnterOS" 16660 MOV R0,PC 16670 ORR R0,R0,#&0C000000 16680 TEQP R0,#0 16690 MOV R0,R0 ; Mustn't use MOVNV ! 16700 EQUD &EE121F10 ; MRCEQ CP15,0,R1,C2,C0 - request status register 16710 STR R1, regword% 16720 TSTP PC,#&F0000000 16730 MOV R0,R0 ; Return to user mode 16740 LDMFD R13!,{R0-R1,PC} 16750 16760.writereg 16770 STMFD R13!, {R0-R1, R14} 16780 SWI "OS_EnterOS" 16790 MOV R0,PC 16800 ORR R0,R0,#&0C000000 16810 TEQP R0,#0 16820 MOV R0,R0 ; Mustn't use MOVNV ! 16830 LDR R1, regword% 16840 EQUD &EE021F10 ; MCREQ CP15,0,R1,C2,C0 - write status register 16850 STR R1, regword% 16860 TSTP PC,#&F0000000 16870 MOV R0,R0 ; Return to user mode 16880 LDMFD R13!,{R0-R1,PC} 16890 16900; Results block 16910 16920.tpres% EQUD 0 16930.protype% EQUD 0 16940.nofpu% EQUD 0 16950.fputype% EQUD 0 16960.memctype% EQUD 0 16970.ramspeed% EQUD 0 16980.regword% EQUD 0 16990 17000] 17010NEXT pass% 17020ENDPROC 17030: 17040REM *** 17050REM *** Nick's Common BASIC library (or at least bits of ... ) 17060REM *** 17070: 17080DEF PROCU_String(window%, icon%, s$) 17090ptr1%!0=window% 17100ptr1%!4=icon% 17110SYS "Wimp_GetIconState",,ptr1% 17120$(ptr1%!28)=s$ 17130ptr2%!0=window% 17140ptr2%!4=icon% 17150ptr2%!8=0 17160ptr2%!12=0 17170SYS "Wimp_SetIconState",,ptr2% 17180ENDPROC 17190: 17200DEF PROCU_Icon(window%, icon%, bit%, eor%, clear%) 17210ptr2%!0=window% 17220ptr2%!4=icon% 17230ptr2%!8=(eor%<<bit%) 17240ptr2%!12=(clear%<<bit%) 17250SYS "Wimp_SetIconState",,ptr2% 17260ENDPROC 17270: 17280DEF PROCU_Sprite(window%, icon%, s$) 17290REM Indirected sprite+text 17300ptr1%!0=window% 17310ptr1%!4=icon% 17320SYS "Wimp_GetIconState",,ptr1% 17330$(ptr1%!32)="S"+s$ 17340ptr2%!0=window% 17350ptr2%!4=icon% 17360ptr2%!8=0 17370ptr2%!12=0 17380SYS "Wimp_SetIconState",,ptr2% 17390ENDPROC 17400: 17410DEF PROCUI_Sprite(window%, icon%, s$) 17420REM Indirected sprite 17430ptr1%!0=window% 17440ptr1%!4=icon% 17450SYS "Wimp_GetIconState",,ptr1% 17460$(ptr1%!28)=s$ 17470ptr2%!0=window% 17480ptr2%!4=icon% 17490ptr2%!8=0 17500ptr2%!12=0 17510SYS "Wimp_SetIconState",,ptr2% 17520ENDPROC 17530: 17540DEF FNgetname(p1%) 17550LOCAL p$ 17560p$="" 17570WHILE ((?p1%>31) OR (?p1%=9)) 17580p$+=CHR$(?p1%):p1%+=1 17590ENDWHILE 17600=p$ 17610: 17620DEF FNR_IconState(window%, icon%) 17630LOCAL state% 17640ptr1%!0=window% 17650ptr1%!4=icon% 17660SYS "Wimp_GetIconState",,ptr1% 17670IF ABS((ptr1%!24)>>21) MOD 2 = 1 THEN state%=TRUE ELSE state%=FALSE 17680=state% 17690: 17700DEF FNleaf(f$) 17710WHILE INSTR(f$,".") 17720 f$=MID$(f$,INSTR(f$,".")+1) 17730ENDWHILE 17740=f$ 17750: 17760DEF FNhex_to_dec(s$) 17770LOCAL s% 17780SYS "XOS_ReadUnsigned",16,s$ TO ,,s% 17790=s% 17800: 17810DEF FNdec_to_hex(s%) 17820SYS "OS_ConvertHex8",s%,ptr2%,10 17830=FNgetname(ptr2%) 17840: 17850DEF FNsubleaf(f$) 17860REM Strips off filename string. ie, returns the path string 17870LOCAL p$ 17880WHILE INSTR(f$,".") 17890 p$=p$+LEFT$(f$,1) 17900 f$=RIGHT$(f$,LEN(f$)-1) 17910ENDWHILE 17920=LEFT$(p$,LEN(p$)-1) 17930: 17940DEF FNR_String(window%, icon%) 17950LOCAL s$ 17960ptr1%!0=window% 17970ptr1%!4=icon% 17980SYS "Wimp_GetIconState",,ptr1% 17990s$=FNgetname(ptr1%!28) 18000=s$ 18010: 18020REM Outputs padding (aligned) strings 18030DEF FNstrpad(A, padding%) 18040LOCAL res$, A$ 18050IF padding%=0 THEN 18060 res$=STR$(INT(A)) 18070ELSE 18080 A$=STR$(A) 18090 IF INSTR(A$,".")>0 THEN 18100 res$=LEFT$(A$+STRING$(padding%,"0"), INSTR(A$,".")+padding%) 18110 ELSE 18120 res$=A$+"."+STRING$(padding%,"0") 18130 ENDIF 18140ENDIF 18150=res$
� > !RunImage $� ArmSI - Speed Index appliction !� Versions <= 3.12 by J.Abbot (A� Hacked about (postfix H) by Nick Smith, nas20@uk.ac.cam.phx 2 <� � �error(�,�$):�poll:� F PL� block% 1024,window% 10*1024,icon_block% 512,error_blk% 512,block1% 512 Z?� indirected% 10*1024,menu_indirected% 512,menu_block% 1024 d0� ib_block% 64, tpcode% 1024, C%(35), B%(20) n� ptr1% 256, ptr2% 256 x �app_name$="ArmSI" �&full_app_name$="ArmSI Speed Index" �$app_version$="3.31H (21-Nov-92)" � ��Initialise ��calcsi � �updateicon(2,�machineguess) � � �poll � �� �: � � *** � *** Wimp routines � *** : "� Main polling routine ,� �poll 6� poll_mask%, reason% @poll_mask% = %000110001 J quit% = � T� ^2 ș "Wimp_Poll", poll_mask%, block% � reason% h Ȏ reason% � r � 1 :�redraw |- � 2 :ș "Wimp_OpenWindow",, block% �. � 3 :ș "Wimp_CloseWindow",, block% � � 6 :�button � � 7 :�drag_box � � 8 :�key_pressed � � 9 :�menu_select � � 17,18:�receive � � �� (quit%=�) �ș "Wimp_CloseDown" �� �� �: � � �redraw � L% 'ș "Wimp_RedrawWindow",,block% � L% ȕ L% &) ș "Wimp_GetRectangle",,block% � L% 0� :� D: N� Open Main SI window X � �opensi b!block% = sysinfo% l%ș "Wimp_GetWindowState",, block% vblock%!28=-1 �!ș "Wimp_OpenWindow",, block% �� �: �(� Open Floating-Point results window � � �openfi �!block% = fpuinfo% �%ș "Wimp_GetWindowState",, block% �block%!28=-1 �!ș "Wimp_OpenWindow",, block% �� �: �� �receive �� type%, w% w%=block%!20 type%=block%!40 Ȏ block%!16 � � 0:quit%=� * � 2 4+ � my_ref%>0 � (my_ref%=block%!12) � >> � type%=our_filetype% � �savesi(�getname(block%+44)) H � R � 3 \& full_file$=�getname(block%+44) fE � (w%=-2 � w%=sysinfo% � w%=fpuinfo%) � type%=our_filetype% � p �loadsi(full_file$) z � � � 5 � � type%=our_filetype% � �( full_file$=�getname(block%+44) � block%!12=block%!8 �- ș "XWimp_SendMessage",17,block%,w% � �loadsi(full_file$) � � � � �� �: �� �save(A$,B%) �ș "Wimp_CreateMenu",,-1 �)ș "Wimp_GetPointerInfo",,icon_block% Ȏ icon_block%!12 � " � sysinfo%,proginfo%,savesi% $' block1%!0=(((45+�(A$)) �4)+1)*4 . block1%!12=0 8 block1%!16=1 B! block1%!20=icon_block%!12 L! block1%!24=icon_block%!16 V block1%!28=icon_block%!0 ` block1%!32=icon_block%!4 j block1%!36=-1 t block1%!40=B% ~. $(block1%+44)=A$:?(block1%+44+�(A$))=0 �W ș "Wimp_SendMessage",17,block1%,icon_block%!12,icon_block%!16 � ,,task_handle% � my_ref%=block1%!8 �� �� �: � � �button �� X%,Y%,button_type% �@� block%!16=-1 � block%!12<>sysinfo% � block%!12<>fpuinfo% � �X%=block%!0:Y%=block%!4 �button_type%=0 �(� (block%!8 � %101)>0 button_type%=3 �� block%!8=4 button_type%=0 � block%!8=2 button_type%=1 � block%!8=1 button_type%=4 � block%!8=64 button_type%=3 Ȏ block%!12 � ( � -2 21 � button_type%=1 menu%=0:�menu(X%,400,"") < � button_type%=0 �opensi F" � button_type%=4 � �openfi P � sysinfo% Z9 � button_type%<2 ș "Wimp_SetCaretPosition",-1,-1 d* � button_type%=1 � block%!16<>36 � n+ ș "Wimp_GetPointerInfo",,block1% x/ menu%=0:�menu(block1%!0,block1%!4,"") � � � � fpuinfo% � � button_type%=1 � �+ ș "Wimp_GetPointerInfo",,block1% �/ menu%=0:�menu(block1%!0,block1%!4,"") � � � � savesi% �Z � block%!16=2 � button_type%=0 � block%!12=savesi% �savesi(�R_String(savesi%,1)):� �( � block%!16=0 � button_type%=3 � �+ � block%!12=savesi% drag_icon%=-1 � block%!0=block%!12 � block%!4=block%!16 �( ș "Wimp_GetIconState",,block% E icon_block%!0=block%!0:ș "Wimp_GetWindowInfo",,icon_block% X%=icon_block%!4 Y%=icon_block%!16 " block%!4=5 , block%!8=block%!8+X% 6 block%!16=block%!16+X% @ block%!12=block%!12+Y% J block%!20=block%!20+Y% T block%!24=0 ^ block%!28=0 h& block%!32=XPixels%<<XFactor% r block%!36=YPixels% |# ș "Wimp_DragBox",,block% � � �� �� �: �� �menu_select �� I% �)ș "Wimp_GetPointerInfo",,icon_block% �I%=-(icon_block%!8 � 1) �Ȏ menu% � � � 0 � Ȏ block%!0 � � � 1:�opensi � � 2:�openfi � 3:�calcsi � 4 Ȏ block%!4 � & � ROM speed 05 � 0:HighROMSpeed=1:�UpdateMEMC(&C0,&C0) :5 � 1:HighROMSpeed=2:�UpdateMEMC(&80,&C0) D5 � 2:HighROMSpeed=3:�UpdateMEMC(&40,&C0) N5 � 3:HighROMSpeed=4:�UpdateMEMC(&00,&C0) X( � 4:VideoDMA%=�(VideoDMA%) b � 5: l# � �(FasterBASIC%) � v7 ș "XWimp_StartTask","RMFaster BASIC" � FasterBASIC%=� � � �S ș "XWimp_StartTask","Obey <ArmSI$Dir>.Resources.OldModule BASIC" � FasterBASIC%=� � � � � 6: �! � �(FasterFPE%) � �< ș "XWimp_StartTask","RMFaster FPEmulator" � FasterFPE%=� � � �X ș "XWimp_StartTask","Obey <ArmSI$Dir>.Resources.OldModule FPEmulator" � FasterFPE%=� � � � 7: � Processor%=3 � � readreg ' � (!regword% � 1)=1 � *3 !regword%=!regword% � %11111110 4 � writereg > CacheON%=� H � R, !regword%=!regword% � %1 \ � writereg f CacheON%=� p � z � � � � � 5 � Ȏ block%!4 � �3 � 0:� calcMC% � calcMC%=� � calcMC%=� �< � 1:� calcBASIC% � calcBASIC%=� � calcBASIC%=� �6 � 2:� calcFPU% � calcFPU%=� � calcFPU%=� �9 � 3:� calcDHRY% � calcDHRY%=� � calcDHRY%=� � � � � 7:quit%=� � � �% � I% menu%=0:�menu(X%,360,"") �� �� : � �key_pressed 6� block%!24<>&D � ș "Wimp_ProcessKey",block%!24:� $Ȏ block%!0 � . � savesi% 8 � block%!4>0 � B' �savesi(�R_String(savesi%,1)) L � V( ș "Wimp_ProcessKey",block%!24 ` � j1 � sysinfo%:ș "Wimp_SetCaretPosition",-1,-1 t' ș "Wimp_ProcessKey", block%!24 ~� �� �: �� �drag_box �F� drag_icon%=-1 � �save(�leaf(�R_String(savesi%,1)),our_filetype%) �� �: � � *** �@� *** Calculation/Display routines (the 'real' bits of code) � � *** �: � � �calcsi �G� temp$, ver%, J%, temp%, flags%, paddr%, pr12%, pbuf%, E%, E1%, A% � Z%, V%, size%, chunk% � calcDHRY%=� � ; ș "XOS_Module",18,"SharedCLibrary" � ,,,temp%;flags% (z � (flags% � 1)=1 � �error(0, "You require version 3.75 or above of the SharedCLibrary to run the Dhrystones test"):� 2( temp$=�getname(!(temp%+&14)+temp%) < temp$=�temp$,18) F ver%=�(�temp$,18))*100 Pt � ver%<375 � �error(0, "You require version 3.75 or above of the SharedCLibrary to run the Dhrystones test"):� Z. J%=�("<ArmSI$Dir>.Resources.Dhrystones") d �#J% n� x �� ** Operating system bits �FOSver%=OurOSver% : � Read at Wimp_Initialise (unlikely to change!) �<OSstr$=�osver : � Cunning (!) routine to get OS string �mode%=� �4ș "OS_ReadModeVariable",mode%,7 � ,,ScreenSize% � �� ** Chip Set information �IOCType%=1 �VIDCType%=1 � �� OSver%<300 � � IOEBType%=0 � PeriphType%=0 LCDType%=0 UniqueIDa%=0 UniqueIDb%=0 "� ,R ș "OS_ReadSysInfo",2 � IOEBType%,PeriphType%,LCDType%,UniqueIDa%,UniqueIDb% 6) � (OSver%>=301) � (PeriphType%=1) � @% ș "OS_ReadSysInfo",3 � temp% J$ Ȏ ((temp% >> 20) � %1111) � T � 1:PeriphType%=1 ^ � 2:PeriphType%=2 h r PerhipType=-1 | � � � �� � �D� ** Call main code, setting up illegal instruction handler code �@ș "OS_ChangeEnvironment",1,retcd1,0,0 � ,paddr%,pr12%,pbuf% �� assm_main �*ș "OS_ChangeEnvironment",1,retcd2,0,0 � �FPstr$="Unknown" �!temp%=(!fputype% >> 24) � 256 �Ȏ temp% � � � 0 � FPAType%=0 " FPstr$="Old FPEmulator, v" 2 ș "XOS_Module",18,"FPEmulator" � ,,,temp% * temp$=�getname(!(temp%+&14)+temp%) & FPstr$+=�temp$,18) 0 � 1 : FPAType%=0 D" FPstr$="New FPEmulator, v" N2 ș "XOS_Module",18,"FPEmulator" � ,,,temp% X* temp$=�getname(!(temp%+&14)+temp%) b FPstr$+=�temp$,18) lC � &80:FPAType%=1:FPstr$="FP Protocol Convertor card (WE2206)" v7 � &81:FPAType%=2:FPstr$="ARM FP Accelerator chip" � FPAType%=-1:FasterFPE%=� �� � �3� calcFPU% � (FPstr$="Unknown" � FPAType%=-1) � �P �error(0, "You require a version of the FPEmulator to run the FP tests"):� �� � �Processor%=!tpres% �ProcessorType%=!protype% �MEMCType%=!memctype% �� !tpres%=3 � �' temp%=(ProcessorType% >> 8) � 255 � Ȏ temp% � � 3:Processor%=3 � 6 O � ((ProcessorType% >> 4) � 255)=&61 � Processor%=610 � Processor%=600 � 7:Processor%=700 * � 8:Processor%=800 4 Processor%=3 > � H� R \K� Can't have an 'ARM250' id and no IOEB chip, so either ARM61 or ARM2as f4� (!tpres%=250) � (IOEBType%<=0) � Processor%=61 p z'TimeTaken1=1<<27 :TimeTaken1L=1<<27 �(TimeTaken1a=1<<27:TimeTaken1aL=1<<27 �'TimeTaken2=1<<27 :TimeTaken2L=1<<27 �'TimeTaken3=1<<27 :TimeTaken3L=1<<27 �'TimeTaken4=1<<27 :TimeTaken4L=1<<27 � �#ș "OS_ReadPalette",0,16 � ,,C% �F� ** Disable Video & Sound DMA (turn DRAM refresh on continuously) �� VideoDMA%=� � � � 19,0,0| � oldmemc%=�ReadMEMC �' Ȗ:�UpdateMEMC(%0011<<8,%1111<<8) �� � ș "Hourglass_On" � � readclock $� A%=1 � 4 .� calcARM:� calcARML 81� !ARMcount1<TimeTaken1 TimeTaken1=!ARMcount1 B5� !ARMcount1a<TimeTaken1a TimeTaken1a=!ARMcount1a L1� !ARMcount2<TimeTaken2 TimeTaken2=!ARMcount2 V1� !ARMcount3<TimeTaken3 TimeTaken3=!ARMcount3 `1� !ARMcount4<TimeTaken4 TimeTaken4=!ARMcount4 j5� !ARMcount1L<TimeTaken1L TimeTaken1L=!ARMcount1L t9� !ARMcount1aL<TimeTaken1aL TimeTaken1aL=!ARMcount1aL ~5� !ARMcount2L<TimeTaken2L TimeTaken2L=!ARMcount2L �5� !ARMcount3L<TimeTaken3L TimeTaken3L=!ARMcount3L �5� !ARMcount4L<TimeTaken4L TimeTaken4L=!ARMcount4L �� � � OneClockTick=(1/100)/!timer0 � �� ** RAM/ROM Speeds �/RAMSpeed=10E8/((&FFFF � (!ramspeed%))*1000) �JMemoryBandwidth=(1/(RAMSpeed*10E-10))*3.2 : � one N-cycle + 3 S-cycles �MEMCState%=�ReadMEMC �Ȏ (MEMCState%>>6) � %11 � � � %00:HighROMSpeed=4 � %01:HighROMSpeed=3 � %10:HighROMSpeed=2 � %11:HighROMSpeed=1 � (Ȏ (MEMCState%>>4) � %11 � 2 � %00:LowROMSpeed=4 < � %01:LowROMSpeed=3 F � %10:LowROMSpeed=2 P � %11:LowROMSpeed=1 Z� d n&DRAMRefresh%=(MEMCState%>>8) � %11 xȎ DRAMRefresh% � � � %00:DRAMBandwidth=0 �? � %01:DRAMBandwidth=(((1/4E-6)/50)*4)*100/MemoryBandwidth � � %10:DRAMBandwidth=0 �: � %11:DRAMBandwidth=((1/4E-6)*4)*100/MemoryBandwidth �� � �E%=�:E1%=� � �� ** Calculate FP stuff �!FPUtimer=!timer0 �?Z%=0:ȕ FPUresults!(Z%*12)<>-1:FPUresults!(Z%*12)=0:Z%+=1:� �� calcFPU% � �fpufound � � � A%=1 � 2 � calcFPU � � "! � calcFPU% E1%=�:calcFPU%=� ,� 62ș "OS_ChangeEnvironment",1,paddr%,pr12%,pbuf% @ J,� ** i,s & n-cycles (for *base* machine) Ti=125:s=125:n=250 ^ h!MCcount=0 rBASICcount=0 |DHRYmsec=0 �DHRYvalue=0 � �� ** MC calc �� calcMC% � calcMC � �$� ** BASIC calc (a bit simple!!) �3� calcBASIC% Ȗ:�=0:�A%=0�100000:�:BASICcount=� � � � ** Video refresh rate, etc �/ș "OS_ReadModeVariable",-1,11 � ,,x%:x%+=1 �/ș "OS_ReadModeVariable",-1,12 � ,,y%:y%+=1 �?ș "OS_ReadModeVariable",-1,3 � ,,bpp%:� bpp%=63 � bpp%=255 �bpp%+=1:bpp%=�(bpp%)/�(2) 4�=0:Ȗ:� l%=1 � 20:Ȗ:Ȗ:Ȗ:Ȗ:�:hz%=(80/�)*1000 +ș "OS_ReadModeVariable",-1,7 � ,,size% #band%=(size%*(hz%/10))/104857.6 &�VIDEOstr$="Mode "+�(mode%)+" ("+�x%+"x"+�y%+", "+�bpp%+" bpp, "+�(hz% � 10)+"."+�(hz% � 10)+" Hz, "+�(band% � 10)+"."+�(band% � 10)+" Mb/S)" 0 :4� Recalc DRAMBandwidth using screen refresh rate DȎ DRAMRefresh% � N � %00:DRAMBandwidth=0 XE � %01:DRAMBandwidth=(((1/4E-6)/(hz%/10))*4)*100/MemoryBandwidth b � %10:DRAMBandwidth=0 l: � %11:DRAMBandwidth=((1/4E-6)*4)*100/MemoryBandwidth v� � �� ** Dhrystone calc �� calcDHRY% � � � "UnSet ArmSI$Dhrystone" �> ș "XWimp_StartTask", "<ArmSI$Dir>.Resources.Dhrystones" �K ș "XOS_ReadVarVal","ArmSI$Dhrystone",ptr1%,32+(1<<31),0,0 � ,,exist% � � exist%=0 � � DHRYmsec=-1 � DHRYvalue=-1 � � �9 ș "OS_ReadVarVal","ArmSI$Dhrystone",ptr1%,32,0,0 � temp$=�getname(ptr1%) � DHRYmsec=�(temp$) ! temp$=�temp$,�temp$," ")) DHRYvalue=�(temp$) � � * 4%� ** Turn back on Video/sound DMA >� VideoDMA%=� � H Ȗ R$ �UpdateMEMC(oldmemc%,%1111<<8) \A �19,0,C% � &FF,(C%>>8 � &FF),(C%>>16 � &FF),(C%>>24 � &FF); f� p ș "Hourglass_Off" z� � �,InstructionTime1=(s*Instructions)*10E-10 �4InstructionTime1a=((s+16*i)*Instructions)*10E-10 �:InstructionTime2=((s+n+i+2*n)*(Instructions/2))*10E-10 �@InstructionTime3=((7*s+n+i+s*6+2*n)*(Instructions/2))*10E-10 �2InstructionTime4=((2*s+n)*Instructions)*10E-10 �3InstructionTime1L=((4*s+n)*Instructions)*10E-10 �9InstructionTime1aL=((4*s+n+16*i)*Instructions)*10E-10 �;InstructionTime2L=((4*s+4*n+i)*(Instructions/2))*10E-10 �<InstructionTime3L=((16*s+4*n+i)*(Instructions/2))*10E-10 �5InstructionTime4L=((5*s+2*n)*Instructions)*10E-10 � �0TimeTaken1=(!timer0-TimeTaken1)*OneClockTick 2TimeTaken1a=(!timer0-TimeTaken1a)*OneClockTick 0TimeTaken2=(!timer0-TimeTaken2)*OneClockTick 0TimeTaken3=(!timer0-TimeTaken3)*OneClockTick $0TimeTaken4=(!timer0-TimeTaken4)*OneClockTick .2TimeTaken1L=(!timer0-TimeTaken1L)*OneClockTick 84TimeTaken1aL=(!timer0-TimeTaken1aL)*OneClockTick B2TimeTaken2L=(!timer0-TimeTaken2L)*OneClockTick L2TimeTaken3L=(!timer0-TimeTaken3L)*OneClockTick V2TimeTaken4L=(!timer0-TimeTaken4L)*OneClockTick ` j0MIPS1=�((Instructions/TimeTaken1)/10000)/100 t2MIPS1a=�((Instructions/TimeTaken1a)/10000)/100 ~0MIPS2=�((Instructions/TimeTaken2)/10000)/100 �0MIPS3=�((Instructions/TimeTaken3)/10000)/100 �0MIPS4=�((Instructions/TimeTaken4)/10000)/100 � �1Index1=�(InstructionTime1/TimeTaken1*100)/100 �4Index1a=�(InstructionTime1a/TimeTaken1a*100)/100 �1Index2=�(InstructionTime2/TimeTaken2*100)/100 �1Index3=�(InstructionTime3/TimeTaken3*100)/100 �1Index4=�(InstructionTime4/TimeTaken4*100)/100 �4Index1L=�(InstructionTime1L/TimeTaken1L*100)/100 �7Index1aL=�(InstructionTime1aL/TimeTaken1aL*100)/100 �4Index2L=�(InstructionTime2L/TimeTaken2L*100)/100 �4Index3L=�(InstructionTime3L/TimeTaken3L*100)/100 4Index4L=�(InstructionTime4L/TimeTaken4L*100)/100 *MIPS1L=�(MIPS1/Index1*Index1L*100)/100 .MIPS1aL=�(MIPS1a/Index1a*Index1aL*100)/100 (*MIPS2L=�(MIPS2/Index2*Index2L*100)/100 2*MIPS3L=�(MIPS3/Index3*Index3L*100)/100 <*MIPS4L=�(MIPS4/Index4*Index4L*100)/100 F P:Index1=Index1/.75 : � Re-calibrate to 300 series ZIndex1a=Index1a/.49 dIndex2=Index2/.81 nIndex3=Index3/.77 xIndex4=Index4/.83 �Index1L=Index1L/.80 �Index1aL=Index1aL/.53 �Index2L=Index2L/.81 �Index3L=Index3L/.78 �Index4L=Index4L/.84 � �Ȏ Processor% � � � � 1 �L Index1a=0:Index1aL=0:MIPS1a=0:MIPS1aL=0:TimeTaken1a=0:TimeTaken1aL=0 �[ Z=(MIPS1*686+MIPS2*290+MIPS3*9+MIPS4*15+MIPS1L*686+MIPS2L*290+MIPS3L*9+MIPS4L*15)/2 �# TotalMIPS=�(Z/1000*100)/100 �f TotalIndex=�((Index1+.49+Index2+Index3+Index4+Index1L+.53+Index2L+Index3L+Index4L)/10*100)/100 "h Z=(MIPS1*685+MIPS1a+MIPS2*290+MIPS3*9+MIPS4*15+MIPS1L*685+MIPS1aL+MIPS2L*290+MIPS3L*9+MIPS4L*15)/2 ,! TotalMIPS=�(Z/1000*100)/100 6m TotalIndex=�((Index1+Index1a+Index2+Index3+Index4+Index1L+Index1aL+Index2L+Index3L+Index4L)/10*100)/100 @� J T&MCIndex=0:BASICIndex=0:DHRYIndex=0 ^1� calcMC% MCIndex=�(161/(!MCcount)*1000)/1000 h7� calcBASIC% BASICIndex=�(143/BASICcount*1000)/1000 r*� calcDHRY% DHRYIndex=DHRYvalue/5920.7 | �� ** RAM/ROM Sizes �Jș "OS_ReadMemMapInfo" � A%,B%:RAMSize%=(A%*B%) � 1024:RAMPageSize%=A% �� OSver%<300 � �" � No extension ROMs possible �2 ROMsize%=512*1024:ROMsize5th%=0:ROMnum5th%=0 �� �4 ș "XPodule_ReturnNumber" � ,ROMnum5th%;flags% � � (flags% � 1)=1 � �G � Can't read number of extension ROMs, so mark as 'Unknown', -1 �6 ROMsize%=2048*1024:ROMsize5th%=0:ROMnum5th%=-1 � � � ROMsize%=2048*1024 � ROMsize5th%=0 � ROMnum5th%>0 � + � loop%=-2 � -(ROMnum5th%+1) � -1 chunk%=0 & � 0W ș "XPodule_EnumerateChunksWithInfo",chunk%,,,loop% � chunk%,size%;flags% : V%=flags% � 1 D9 � (chunk%<>0) � (V%=0) � ROMsize5th%+=size% N! � (chunk%=0) � (V%=1) X � b � l � v� � �>ScreenBandwidth=(ScreenSize%*(hz%/10))*100/MemoryBandwidth �8ProcessorBandwidth=100-ScreenBandwidth-DRAMBandwidth �Ȏ Processor% � �. � 2:� ARM2 takes all remaining bandwidth �7 � 3:� ProcessorBandwidth>14 ProcessorBandwidth=14 � � readreg �< � (!regword% � 1) = 1 � CacheON%=� � CacheON%=� �� � �,ș "XOS_Module",18,"BASIC",,0 � ,,,temp% �7� temp%<&03800000 � FasterBASIC%=� � FasterBASIC%=� �!� temp%<=0 � FasterBASIC%=-99 1ș "XOS_Module",18,"FPEmulator",,0 � ,,,temp% 3� temp%<&03800000 � FasterFPE%=� � FasterFPE%=� � temp%<=0 � FasterFPE%=� *)� ** A500 ID (looks at keyboard type) 4(ș "OS_InstallKeyHandler",1 � keyid% >� keyid%=0 � H? � Looks like we've found ourselves a genuine A500 folks ! R VIDCType%=3 \� f pE� *** Test for PCATS enhancer card (SWI Enhancer_HardwarePresent) zș &62A4D � ;flags% �'� (flags% � 1) = 0 � VIDCType%+=128 � ��displaysi �� �: �� �osver �� � � � � �:=�$ �ș "OS_Byte",0,0 �="Unknown" �: �B� A fun little routine that makes a fair guess of machine type �4� Please correct/improve and return to me! Nick. F� Possible improvments - distinguish machines based on sizes/types F� of HD. eg, A4x0/1 series had built in ST506 controller, A540 has 8� a SCSI podule as standard, etc. Hack, hack, hack ! $: .� �machineguess 8� name$ B L?� VIDCType%=3 � name$="A500 prototype, "+�OSstr$,12):=name$ VȎ Processor% � `& � 1:name$="Unknown ARM1 machine" j � 2: t Ȏ MEMCType% � ~ � 0 � Ȏ RAMSize% � �) � 512:name$="Original A305" �* � 1024:name$="Original A310" �. � 2048:name$="Expanded A305/310" �* � 4096:name$="Original A440" �2 name$="Unknown ARM2+MEMC1 machine" � � � � 1 � Ȏ RAMSize% � �1 � 512:name$="Expanded A305, MEMC1a" �5 � 1024:name$="Original A410/1 or A3000" �, � 2048:name$="Original A420/1" , � 4096:name$="Original A440/1" + name$="Unknown ARM2+MEMC1a" � ( name$="Unknown ARM2 machine" ( � 2 < � 3: F Ȏ IOEBType% � P � 0 Z � RAMSpeed<120 � d Ȏ RAMSize% � n, � 4096:name$="Original A540" x1 � 8192:name$="Expanded A540, 8MB" �3 � 12288:name$="Expanded A540, 12MB" �3 � 16384:name$="Expanded A540, 16MB" �9 name$="Unknown fast-RAM ARM3 machine" � � � � � Ȏ RAMSize% � �1 � 512:name$="Expanded A305, ARM3" �4 � 1024:name$="Expanded A410/1, ARM3" �4 � 2048:name$="Expanded A420/1, ARM3" �4 � 4096:name$="Expanded A440/1, ARM3" �3 � 8192:name$="Expanded A440/1, 8MB" �0 name$="Unknown ARM3 machine" � � � � 1 Ȏ RAMSize% � " � 2048 , Ȏ LCDType% � 6, � 0:name$="Original A5000" @2 � 1:name$="Original A4 portable" J9 name$="Unknown 2MB ARM3+IOEB machine" T � ^ � 4096 h Ȏ LCDType% � r( � 0:name$="A5000, 4MB" |7 � 1:name$="Expanded A4 portable, 4MB" �9 name$="Unknown 4MB ARM3+IOEB machine" � � �0 � 8192:name$="Expanded A5000, 8MB" �1 name$="Unknown ARM3+IOEB machine" � � �( name$="Unknown IOEB machine" � � � � � 250: � Ȏ RAMSize% � �' � 1024:name$="Original A3010" �- � 2048:name$="Original A3020/A4000" �6 � 4096:name$="Expanded A3010/3020/4000, 4MB" * name$="Unknown ARM250 machine" � & name$="Machine Unknown" 0� :=name$+", "+�OSstr$,12) D: N� �displaysi X � temp bș "Hourglass_On" l vblock1%!0=sysinfo% �%ș "Wimp_GetWindowState",,block1% �SH%=block1%!28 �WO%=(block1%!32>>16) � %1 �"ș "Wimp_CloseWindow",,block1% �block1%!0=fpuinfo% �%ș "Wimp_GetWindowState",,block1% �FH%=block1%!28 �WO%+=(block1%!32>>15) � %10 �"ș "Wimp_CloseWindow",,block1% � �� ** RAM/ROM Sizes �� RAMPageSize%<=0 � �% �updateicon(4,�(RAMSize%)+" K") � i �updateicon(4,�(RAMSize%)+" K ("+�(RAMPageSize% � 1024)+"K x "+�(RAMSize%/(RAMPageSize%/1024))+")") � � ROMsize%<=0 � * �updateicon(6,"Unknown") 4� > Ȏ ROMnum5th% � HG � -1:�updateicon(6,�(�(ROMsize%/1024))+" K (? extension ROMs)") R3 � 0:�updateicon(6,�(�(ROMsize%/1024))+" K") \ ft �updateicon(6,�(�(ROMsize%/1024))+" K (+"+�(�(ROMsize5th%/1024))+"K in "+�(ROMnum5th%)+" extension ROMs)") p � z� � �� ** RAM/ROM Speeds �� �(RAMSpeed)=125 � � Ȏ �(HighROMSpeed) � �0 � 1:�updateicon(8,"125 nS (Paged mode)") �0 � 2:�updateicon(8,"200 nS (2 n-cycles)") �0 � 3:�updateicon(8,"325 nS (3 n-cycles)") �0 � 4:�updateicon(8,"450 nS (4 n-cycles)") � � � Ȏ �(LowROMSpeed) � �0 � 1:�updateicon(1,"125 nS (Paged mode)") �0 � 2:�updateicon(1,"200 nS (2 n-cycles)") �0 � 3:�updateicon(1,"325 nS (3 n-cycles)") 0 � 4:�updateicon(1,"450 nS (4 n-cycles)") � � $+ � HighROMSpeed-�(HighROMSpeed)>=0.1 � .\ �updateicon(8,�(�(HighROMSpeed*RAMSpeed))+" nS ("+�(�(HighROMSpeed)+1)+" n-cycles)") 8 � BW �updateicon(8,�(�(HighROMSpeed*RAMSpeed))+" nS ("+�(HighROMSpeed)+" n-cycles)") L � V) � LowROMSpeed-�(LowROMSpeed)>=0.1 � `Z �updateicon(1,�(�(LowROMSpeed*RAMSpeed))+" nS ("+�(�(LowROMSpeed)+1)+" n-cycles)") j � tU �updateicon(1,�(�(LowROMSpeed*RAMSpeed))+" nS ("+�(LowROMSpeed)+" n-cycles)") ~ � �� � �%temp=(�((1/RAMSpeed)*100000))/100 �:�updateicon(12,�(�(RAMSpeed))+" nS ("+�(temp)+" MHz)") � �Ȏ DRAMRefresh% � �" � %00:�updateicon(14,"None") �7 � %01:�updateicon(14,"During Video Flyback only") �" � %10:�updateicon(14,"None") �( � %11:�updateicon(14,"Continuous") �� � 6�updateicon(17,�(�(MemoryBandwidth))+" bytes/sec") 2�updateicon(21,�strpad(ScreenBandwidth,4)+"%") +B%(1)=�bar(B%(1),10.28*ScreenBandwidth) 0�updateicon(24,�strpad(DRAMBandwidth,4)+"%") ()B%(2)=�bar(B%(2),10.28*DRAMBandwidth) 25�updateicon(27,�strpad(ProcessorBandwidth,4)+"%") <.B%(3)=�bar(B%(3),10.28*ProcessorBandwidth) FW�updateicon(30,�strpad(100-ScreenBandwidth-DRAMBandwidth-ProcessorBandwidth,4)+"%") PRB%(4)=�bar(B%(4),10.28*(100-ScreenBandwidth-DRAMBandwidth-ProcessorBandwidth)) Z0�updateicon(34,�strpad(TotalMIPS,2)+" MIPS") d)�updateicon(37,�strpad(TotalIndex,2)) n$B%(5)=�bar(B%(5),154*TotalIndex) x �%�updateicon(42,�strpad(Index1,2)) � B%(6)=�bar(B%(6),154*Index1) �M� Processor%=1 �updateicon(45,"N/A") � �updateicon(45,�strpad(Index1a,2)) �!B%(7)=�bar(B%(7),154*Index1a) �%�updateicon(48,�strpad(Index2,2)) � B%(8)=�bar(B%(8),154*Index2) �%�updateicon(51,�strpad(Index3,2)) � B%(9)=�bar(B%(9),154*Index3) �%�updateicon(54,�strpad(Index4,2)) �"B%(14)=�bar(B%(14),154*Index4) �&�updateicon(58,�strpad(Index1L,2)) �#B%(15)=�bar(B%(15),154*Index1L) �N� Processor%=1 �updateicon(61,"N/A") � �updateicon(61,�strpad(Index1aL,2)) $B%(16)=�bar(B%(16),154*Index1aL) &�updateicon(64,�strpad(Index2L,2)) #B%(17)=�bar(B%(17),154*Index2L) "&�updateicon(67,�strpad(Index3L,2)) ,#B%(18)=�bar(B%(18),154*Index3L) 6&�updateicon(70,�strpad(Index4L,2)) @#B%(19)=�bar(B%(19),154*Index4L) J)�updateicon(28,�strpad(TotalIndex,3)) T(B%(10)=�bar(B%(10),154*(TotalIndex)) ^Z=TotalIndex:D%=1 h r� calcMC% � | Z+=MCIndex:D%+=1 �( �updateicon(46,�strpad(MCIndex,3)) �% B%(11)=�bar(B%(11),154*MCIndex) �� �$ �updateicon(46,"Not computed") � B%(11)=�bar(B%(11),0) �� � �� calcBASIC% � � Z+=BASICIndex:D%+=1 �+ �updateicon(55,�strpad(BASICIndex,3)) �( B%(12)=�bar(B%(12),154*BASICIndex) �� �$ �updateicon(55,"Not computed") B%(12)=�bar(B%(12),0) � &� calcDHRY% � 0 � DHRYmsec=-1 � :& �updateicon(65,"Not computed") D B%(20)=�bar(B%(20),0) N � X Z+=DHRYIndex:D%+=1 b, �updateicon(65,�strpad(DHRYIndex,3)) l) B%(20)=�bar(B%(20),154*DHRYIndex) v � �� �$ �updateicon(65,"Not computed") � B%(20)=�bar(B%(20),0) �� � �#�updateicon(31,�strpad(Z/D%,3)) �"B%(13)=�bar(B%(13),154*(Z/D%)) � �� ** Chip set �Ȏ MEMCType% � �, � 0:�updateicon(74,"MEMC1 - VL86C110") �- � 1:�updateicon(74,"MEMC1a - VL86C110") � ! �updateicon(74,"Unknown") !� ! ! Ȏ IOCType% � !*+ � 1:�updateicon(76,"IOC1 - VL86C410") !4 � 2:�updateicon(76,"IOC2") !> !H �updateicon(76,"Unknown") !R� !\ !f�updateicon(78,"Unknown") !p !zȎ VIDCType% � !�- � 1:�updateicon(80,"VIDC1a - VL86C310") !�5 � 2:�updateicon(80,"VIDC1a plus VIDC Enhancer") !�! � 3:�updateicon(80,"VIDC1") !�# � 20:�updateicon(80,"VIDC20") !�F � 129:�updateicon(80,"VIDC1a - VL86C310 (+PCATS Graphics card)") !�: � 131:�updateicon(80,"VIDC1 (+PCATS Graphics card)") !� !� �updateicon(80,"Unknown") !�� !� !�Ȏ Processor% � !� � 1:�updateicon(82,"ARM1") !�+ � 2:�updateicon(82,"ARM2 - VL86C010") " � 3 "& Ȏ (ProcessorType%>>8) � &FF � " � &03:A$="- VL86C020" "$ ". A$="- VL86C0??" "8 � "B, A$+=" rev. "+�(ProcessorType% � &FF) "L" �updateicon(82,"ARM3 "+A$) "V) � 61:�updateicon(82,"ARM2as/ARM61") "`7 � 250:�updateicon(82,"ARM250 (ARM2as macrocell)") "j � 600 "t& Ȏ (ProcessorType%>>8) � &FF � "~ � &06:A$="- VL86C0??" "� "� A$="- VL86C0??" "� � "�, A$+=" rev. "+�(ProcessorType% � &0F) "�$ �updateicon(82,"ARM600 "+A$) "� � 610 "�& Ȏ (ProcessorType%>>8) � &FF � "� � &06:A$="- VL86C0??" "� "� A$="- VL86C0??" "� � "�, A$+=" rev. "+�(ProcessorType% � &0F) # $ �updateicon(82,"ARM610 "+A$) # � 700 #& Ȏ (ProcessorType%>>8) � &FF � # � &07:A$="- VL86C0??" #( #2 A$="- VL86C0??" #< � #F, A$+=" rev. "+�(ProcessorType% � &FF) #P$ �updateicon(82,"ARM700 "+A$) #Z � 800 #d& Ȏ (ProcessorType%>>8) � &FF � #n � &08:A$="- VL86C0??" #x #� A$="- VL86C0??" #� � #�, A$+=" rev. "+�(ProcessorType% � &FF) #�$ �updateicon(82,"ARM800 "+A$) #� #�! �updateicon(82,"Unknown") #�� #� #�Ȏ IOEBType% � #�$ � -1:�updateicon(78,"Unknown") #�' � 0:�updateicon(78,"Not present") #� #�2 �updateicon(78,"IOEB type "+�(�(IOEBType%))) $� $ $Ȏ FPAType% � $"$ � -1:�updateicon(84,"Unknown") $,& � 0:�updateicon(84,"Not fitted") $6? � 1:�updateicon(84,"FP Protocol Convertor card (WE2206)") $@3 � 2:�updateicon(84,"ARM FP Accelerator chip") $J $T �updateicon(84,"Unknown") $^� $h $rȎ PeriphType% � $|$ � -1:�updateicon(68,"Unknown") $�& � 0:�updateicon(68,"Not fitted") $�" � 1:�updateicon(68,"82C710") $�" � 2:�updateicon(68,"82C711") $� $� �updateicon(68,"Unknown") $�� $� $�Ȏ LCDType% � $�$ � -1:�updateicon(39,"Unknown") $�& � 0:�updateicon(39,"Not fitted") $� $�0 �updateicon(39,"LCD type "+�(�(LCDType%))) $�� % %� ** OS info %�updateicon(87,OSstr$) %&�updateicon(89,VIDEOstr$) %0Ȏ UniqueIDa% � %:$ � -1:�updateicon(91,"Unknown") %D) � 0:�updateicon(91,"Not available") %N %XO �updateicon(91,"&"+�dec_to_hex(UniqueIDa%)+" "+�dec_to_hex(UniqueIDb%)) %b� %l�updateicon(93,FPstr$) %v� DHRYmsec<=0 � %�$ �updateicon(95,"Not computed") %�$ �updateicon(96,"Not computed") %�� %�, �updateicon(95,�(DHRYmsec)+" �S/loop") %�2 �updateicon(96,�(DHRYvalue)+" dhrystones/S") %�� %��updateicon(99,�(mode%)) %� %�� ** FP info %�FPUtime=0:FPUins=0 %�FPUindex=0 %�A%=0 %�ȕ FPUresults!(12*A%)<>-1 &Q index=�(((FPUresults!(12*A%+8)/(!FPUtimer-FPUresults!(12*A%)))+0.01)*50)/50 & � FPUresults!(12*A%)>0 � &, �updateicon2(47+A%,�strpad(index,2)) & * C%(A%+1)=�bar2(C%(A%+1),154*index) &* FPUindex+=index &4- FPUtime+=!FPUtimer-FPUresults!(12*A%) &> � &H! �updateicon2(47+A%,"N/A") &R" C%(A%+1)=�bar2(C%(A%+1),0) &\ � &f$ FPUins+=FPUresults!(12*A%+4)*2 &p A%+=1 &z� &� &�FPUindex=FPUindex/A% &�U� FPUindex>0 � �updateicon2(46,�strpad(FPUindex+.005,2)) � �updateicon2(46,"N/A") &�#C%(0)=�bar2(C%(0),154*FPUindex) &�t� FPUindex>0 � �updateicon2(45,�(�(FPUins/(FPUtime*OneClockTick)))+" FLOPS") � �updateicon2(45,"Not calculated") &� &�"� (WO% � %1) � SH%<>fpuinfo% � &�: block1%!0=sysinfo%:ș "Wimp_GetWindowState",,block1% &�2 block1%!28=SH%:ș "Wimp_OpenWindow",,block1% &�� &�� WO% � %10 � &�: block1%!0=fpuinfo%:ș "Wimp_GetWindowState",,block1% &�2 block1%!28=FH%:ș "Wimp_OpenWindow",,block1% '� '!� (WO% � %1) � SH%=fpuinfo% � ': block1%!0=sysinfo%:ș "Wimp_GetWindowState",,block1% '$2 block1%!28=SH%:ș "Wimp_OpenWindow",,block1% '.� '8 'Bș "Hourglass_Off" 'L_� E% �error(0,"Unable to compute MC/BASIC/FPU/Dhrystone indexes without DRAM refresh"):E%=� 'VH� E1% �error(0,"No Floating Point Unit/Emulator/Chip present"):E1%=� '`� 'j: 't � *** '~� *** Load/Save code '� � *** '�: '�� Save off ArmSI file '�� �savesi(file_name$) '�� name$, F%, Z% '�� � '�6� � �:�error(0, "Couldn't save file - "+�$):�#F%:� '�#�U_String(savesi%,1,file_name$) '�F%=�(file_name$) '�'�#F%,330:� Version 330 (3.30 * 100) '�name$=�R_String(sysinfo%,2) '��#F%,name$ ( 2�#F%,mode%,ScreenSize%,MEMCState%,OneClockTick ( @�#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 (E�#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L (�#F%,!MCcount,BASICcount ((^�#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 (2c�#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L (<'�#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 (F,�#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L (P?�#F%,Processor%,ProcessorType%,IOCType%,MEMCType%,VIDCType% (Z@�#F%,RAMSize%,HighROMSpeed,LowROMSpeed,RAMSpeed,DRAMRefresh% (dI�#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth (n%�#F%,TotalMIPS,TotalIndex,MCIndex (x,�#F%,Index1,Index1a,Index2,Index3,Index4 (�1�#F%,Index1L,Index1aL,Index2L,Index3L,Index4L (�1�#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% (�/�#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% (�4�#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% (�Z%=0 (�ȕ FPUresults!(Z%*12)<>-1 (� �#F%,FPUresults!(Z%*12) (� Z%+=1 (�� (�/�#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% (��#F%,OSstr$ (��#F%,UniqueIDa%,UniqueIDb% (��#F%,FPstr$ )0�#F%,IOEBType%,FPAType%,PeriphType%,LCDType% )�#F%,VIDEOstr$ ))�#F%,FasterBASIC%,FasterFPE%,CacheON% )"�#F%,VideoDMA%,RAMPageSize% ),�#F% )6.� "SetType "+file_name$+" "+�our_filetype% )@ș "Wimp_CreateMenu",-1 )J� )T: )^� �loadsi(file_name$) )h� Z%,F%,V% )r� � )|G� � �:�error(0, "Couldn't load file '"+file_name$+"' - "+�$):�#F%:� )�#�U_String(savesi%,1,file_name$) )�Z%=0 )�ȕ FPUresults!(Z%*12)<>-1 )� FPUresults!(Z%*12)=0 )� Z%+=1 )�� )�calcFPU%=� )�E%=� )� E1%=� )� )�F%=�(file_name$) )��#F%,V% )�Ȏ V% � *� 1 * *� Version 1 *&�#F%,A$:�updateicon(2,A$) *0�#F%,mode%,S,M,OneClockTick *:ScreenSize%=S:MEMCState%=M *D5�#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3 *N�#F%,!MCcount,BASICcount *XM�#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3 *b8�#F%,MIPS1,MIPS1a,MIPS2,MIPS3,P,ProcessorType%,I,M,V *l2Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V *v.�#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D *�RAMSize%=R *�I�#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth *�B�#F%,TotalMIPS,TotalIndex,Index1,Index1a,Index2,Index3,MCIndex *�)�#F%,BASICIndex,calcMC%,calcBASIC%,D% *�,� �(HighROMSpeed)=150 � HighROMSpeed=200 *�&HighROMSpeed=HighROMSpeed/RAMSpeed *�$LowROMSpeed=LowROMSpeed/RAMSpeed *�Index4=0 *�6Index1L=0:Index1aL=0:Index2L=0:Index3L=0:Index4L=0 *�:Index1=Index1/.75 : � Re-calibrate to 300 series *�Index1a=Index1a/.49 *�Index2=Index2/.81 *�Index3=Index3/.77 +TotalIndex=TotalIndex/.74 +5OSver%=-1:ROMsize%=-1:ROMsize5th%=0:ROMnum5th%=-1 +5DHRYIndex=-1:DHRYmsec=-1:DHRYvalue=-1:calcDHRY%=� + OSstr$="Unknown" +*UniqueIDa%=-1:UniqueIDb%=-1 +4FPstr$="Unknown" +>7IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 +HVIDEOstr$="Unknown" +RFasterBASIC%=�:FasterFPE%=� +\*CacheON%=�:VideoDMA%=�:RAMPageSize%=-1 +f�displaysi +p +z � 2,3 +�� Version 2,3 +��#F%,A$:�updateicon(2,A$) +��#F%,mode%,S,M,OneClockTick +�ScreenSize%=S:MEMCState%=M +�@�#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 +�E�#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L +��#F%,!MCcount,BASICcount +�^�#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 +�c�#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L +�'�#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 +�,�#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L +��#F%,P,ProcessorType%,I,M,V +�2Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V ,.�#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D ,RAMSize%=R ,I�#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth ,$%�#F%,TotalMIPS,TotalIndex,MCIndex ,.,�#F%,Index1,Index1a,Index2,Index3,Index4 ,81�#F%,Index1L,Index1aL,Index2L,Index3L,Index4L ,B)�#F%,BASICIndex,calcMC%,calcBASIC%,D% ,L,� �(HighROMSpeed)=150 � HighROMSpeed=200 ,V&HighROMSpeed=HighROMSpeed/RAMSpeed ,`$LowROMSpeed=LowROMSpeed/RAMSpeed ,j� V%=3 � ,t6 �#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% ,~ Z%=0 ,� ȕ FPUresults!(Z%*12)<>-1 ,� �#F%,FPUresults!(Z%*12) ,� Z%+=1 ,� � ,�� ,�:Index1=Index1/.75 : � Re-calibrate to 300 series ,�Index1a=Index1a/.49 ,�Index2=Index2/.81 ,�Index3=Index3/.77 ,�Index4=Index4/.83 ,�Index1L=Index1L/.80 ,�Index1aL=Index1aL/.53 - Index2L=Index2L/.81 - Index3L=Index3L/.78 -Index4L=Index4L/.84 -TotalIndex=TotalIndex/.74 -(5OSver%=-1:ROMsize%=-1:ROMsize5th%=0:ROMnum5th%=-1 -25DHRYIndex=-1:DHRYmsec=-1:DHRYvalue=-1:calcDHRY%=� -<OSstr$="Unknown" -FUniqueIDa%=-1:UniqueIDb%=-1 -PFPstr$="Unknown" -Z7IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 -dVIDEOstr$="Unknown" -nFasterBASIC%=�:FasterFPE%=� -x*CacheON%=�:VideoDMA%=�:RAMPageSize%=-1 -��displaysi -� -� -�` � V%<100 � �#F%:�error(0, "You require version "+�V%+".00 or above to read "+file_name$):� -� � V%<330 � -� �#F%,A$ -� �updateicon(2,A$) -�# �#F%,mode%,S,M,OneClockTick -�" ScreenSize%=S:MEMCState%=M -�D �#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 -�I �#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L -� �#F%,!MCcount,BASICcount -�b �#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 .g �#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L .+ �#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 .0 �#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L ."# �#F%,P,ProcessorType%,I,M,V .,6 Processor%=P:IOCType%=I:MEMCType%=M:VIDCType=V .62 �#F%,R,HighROMSpeed,LowROMSpeed,RAMSpeed,D .@ RAMSize%=R .JM �#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth .T) �#F%,TotalMIPS,TotalIndex,MCIndex .^0 �#F%,Index1,Index1a,Index2,Index3,Index4 .h5 �#F%,Index1L,Index1aL,Index2L,Index3L,Index4L .r5 �#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% .|3 �#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% .�8 �#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% .� Z%=0 .�! ȕ FPUresults!(Z%*12)<>-1 .�! �#F%,FPUresults!(Z%*12) .� Z%+=1 .� � .�3 �#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% .� �#F%,OSstr$ .�" �#F%,UniqueIDa%,UniqueIDb% .� �#F%,FPstr$ .�4 �#F%,IOEBType%,FPAType%,PeriphType%,LCDType% .� �#F%,VIDEOstr$ .� � V%<=324 � /% FasterBASIC%=�:FasterFPE%=� / CacheON%=� / � /&/ �#F%,FasterBASIC%,FasterFPE%,CacheON% /0 � /:# VideoDMA%=�:RAMPageSize%=-1 /D �displaysi /N � /X /b � V%>326 � V%<=330 � /l � Version 3.30H /v �#F%,A$ /� �updateicon(2,A$) /�6 �#F%,mode%,ScreenSize%,MEMCState%,OneClockTick /�D �#F%,TimeTaken1,TimeTaken1a,TimeTaken2,TimeTaken3,TimeTaken4 /�I �#F%,TimeTaken1L,TimeTaken1aL,TimeTaken2L,TimeTaken3L,TimeTaken4L /� �#F%,!MCcount,BASICcount /�b �#F%,InstructionTime1,InstructionTime1a,InstructionTime2,InstructionTime3,InstructionTime4 /�g �#F%,InstructionTime1L,InstructionTime1aL,InstructionTime2L,InstructionTime3L,InstructionTime4L /�+ �#F%,MIPS1,MIPS1a,MIPS2,MIPS3,MIPS4 /�0 �#F%,MIPS1L,MIPS1aL,MIPS2L,MIPS3L,MIPS4L /�C �#F%,Processor%,ProcessorType%,IOCType%,MEMCType%,VIDCType% /�D �#F%,RAMSize%,HighROMSpeed,LowROMSpeed,RAMSpeed,DRAMRefresh% /�M �#F%,MemoryBandwidth,ScreenBandwidth,DRAMBandwidth,ProcessorBandwidth /�) �#F%,TotalMIPS,TotalIndex,MCIndex 00 �#F%,Index1,Index1a,Index2,Index3,Index4 05 �#F%,Index1L,Index1aL,Index2L,Index3L,Index4L 05 �#F%,BASICIndex,calcMC%,calcBASIC%,DRAMCheck% 0 3 �#F%,DHRYIndex,DHRYmsec,DHRYvalue,calcDHRY% 0*8 �#F%,FPUindex,FPUtime,FPUtime,!FPUtimer,calcFPU% 04 Z%=0 0>! ȕ FPUresults!(Z%*12)<>-1 0H! �#F%,FPUresults!(Z%*12) 0R Z%+=1 0\ � 0f3 �#F%,OSver%,ROMsize%,ROMsize5th%,ROMnum5th% 0p �#F%,OSstr$ 0z" �#F%,UniqueIDa%,UniqueIDb% 0� �#F%,FPstr$ 0�4 �#F%,IOEBType%,FPAType%,PeriphType%,LCDType% 0� �#F%,VIDEOstr$ 0�- �#F%,FasterBASIC%,FasterFPE%,CacheON% 0� � V%>=330 � 0�% �#F%,VideoDMA%,RAMPageSize% 0� � 0�% VideoDMA%=�:RAMPageSize%=-1 0� � 0� �displaysi 0� � 0� � V%>330 � 0�S �error(0, "You require version "+�(V%/100)+" or above to read "+file_name$) 1 � 1 1� 1$�#F% 1.�opensi 18� 1B: 1L � *** 1V� *** Shared SI routines 1` � *** 1j: 1t� �menu(X%,Y%,T$) 1~� pointer%,A%,L%, A$,F%,I% 1�pointer%=menu_block% 1�$pointer%=app_name$ 1� � +10 1�a� pointer%?12,pointer%?13,pointer%?14,pointer%?15,pointer%!16,pointer%!20,pointer%!24,number% 1�A%=menu_indirected% 1�� L%=1 � number% 1� � L%>1 � 1Έ � A$,pointer%?12,pointer%?13,pointer%?14,pointer%?15,pointer%!16,pointer%!20,pointer%!24:� A$="fi$" $pointer%=fi$ � $pointer%=A$ 1� � 1� pointer%+=28 1� � 1�) � F%,I%,A$:� (F% � &200)>0 A$+=T$ 2 $A%=A$ 2 pointer%!0=F% � &FF 24 � (F% � &100)=0 pointer%!4=-1 � � pointer%!4 2! � A$="Paged ROM access" � 2(P � No *way* can we get ROMs this fast - it will just crash the machine! 224 � RAMSpeed<100 � OSver%>=300 � I%+=(1<<22) 2< � 2F@ � A$="RMFaster BASIC" � � FasterBASIC%=-99 � I%+=(1<<22) 2P? � A$="RMFaster FPEmulator" � � OSver%<300 � I%+=(1<<22) 2Z � A$="ARM3 cache on" � 2d Ȏ �(Processor%) � 2n � 3:� OK 2x I%+=(1<<22) 2� � 2� � 2� � A$="Write buffer on" � 2� Ȏ �(Processor%) � 2�" � 600,610,700,800:� OK 2� I%+=(1<<22) 2� � 2� � 2� pointer%!8=I% 2� pointer%!12=A% 2� pointer%!16=-1 2� pointer%!20=�A$ 2� pointer%+=24:A%+=�(A$)+1 3 � (F% � &80)>0 3� 3Aș "Wimp_CreateMenu",,menu_block%,X%-(menu_block%!16/2),Y%+16 3"� 3,: 36&� Menu definition statements (ug!) 3@*� 7,2,7,0,(13*8+12)<<XFactor%,10*4,0,3 3J$� &100,&7000111,"Info",proginfo% 3T� 0,&7000111,"System Info" 3^� 0,&7000111,"FP Info" 3h� 0,&7000111,"Re-calculate" 3r3� &100,&7000111,"Improvements",pointer%+24*8+28 3|1� &100,&7000111,"Speed Indexes",pointer%+24*3 3�"� &100,&7000111,"Save",savesi% 3�� &80,&7000111,"Quit" 3� 3�4� "S'Indexes",7,2,7,0,(18*8+12)<<XFactor%,10*4,0 3�'� 0-calcMC%,&7000111,"Machine Code" 3�#� 0-calcBASIC%,&7000111,"BASIC" 3�$� 0-calcFPU%,&7000111,"FP index" 3�(� &80-calcDHRY%,&7000111,"Dhrystone" 3� 3�6� "Improvement",7,2,7,0,(18*8+16)<<XFactor%,10*4,0 3�4� 0-(HighROMSpeed=1),&7000111,"Paged ROM access" 3�4� 0-(HighROMSpeed=2),&7000111,"ROM (2 n-cycles)" 3�4� 0-(HighROMSpeed=3),&7000111,"ROM (3 n-cycles)" 44� 0-(HighROMSpeed=4),&7000111,"ROM (4 n-cycles)" 4-� 2-(VideoDMA%=0),&7000111,"No Video DMA" 4.� 0-FasterBASIC%,&7000111,"RMFaster BASIC" 4&1� 0-FasterFPE%,&7000111,"RMFaster FPEmulator" 40+� &80-CacheON%,&7000111,"ARM3 cache on" 4:: 4D� �error(err%, report$) 4N8� err%<>0 � � 0,report$+" internal error ("+�(�)+")" 4X!error_blk% = err% 4b$(error_blk%+4)=report$ 4l?(error_blk%+4+�report$)=0 4v:ș "XWimp_ReportError", error_blk%, %1, full_app_name$ 4�� 4�: 4�"� Update a main SI window icon 4�� �updateicon(I%,A$) 4�!icon_block%=sysinfo% 4�icon_block%!4=I% 4�'ș "Wimp_GetIconState",,icon_block% 4�� icon_block%!24 � 1<<8 � 4� $(icon_block%!28)=A$ 4�� 4�!block%=sysinfo% 4�block%!4=I% 4�block%!8=0 5block%!12=0 5"ș "Wimp_SetIconState",,block% 5� 5 : 5**� Update the bar in the main SI window 54� �bar(I%,W%) 5>� W%=0 W%=2 5H!icon_block%=sysinfo% 5Ricon_block%!4=I% 5\'ș "Wimp_GetIconState",,icon_block% 5f#icon_block%!16=icon_block%!8+W% 5picon_block%!4=sysinfo% 5z,ș "Wimp_CreateIcon",,icon_block%+4 � W% 5�icon_block%!4=I% 5�icon_block%!8=&11<<24 5�icon_block%!12=&FF<<24 5�'ș "Wimp_SetIconState",,icon_block% 5�!block%=sysinfo% 5�block%!4=I% 5� ș "Wimp_DeleteIcon",,block% 5�!block%=sysinfo% 5�block%!4=W% 5�block%!8=0 5�block%!12=0 5�"ș "Wimp_SetIconState",,block% 5�=W% 6: 6"� Update icon in the FP window 6� �updateicon2(I%,A$) 6$!icon_block%=fpuinfo% 6.icon_block%!4=I% 68'ș "Wimp_GetIconState",,icon_block% 6B� icon_block%!24 � 1<<8 � 6L $(icon_block%!28)=A$ 6V� 6`!block%=fpuinfo% 6jblock%!4=I% 6tblock%!8=0 6~block%!12=0 6�"ș "Wimp_SetIconState",,block% 6�� 6�: 6�#� Update a bar in the FP window 6�� �bar2(I%,W%) 6�� W%=0 W%=2 6�!icon_block%=fpuinfo% 6�icon_block%!4=I% 6�'ș "Wimp_GetIconState",,icon_block% 6�#icon_block%!16=icon_block%!8+W% 6�icon_block%!4=fpuinfo% 6�,ș "Wimp_CreateIcon",,icon_block%+4 � W% 7 icon_block%!4=I% 7 icon_block%!8=&11<<24 7icon_block%!12=&FF<<24 7'ș "Wimp_SetIconState",,icon_block% 7(!block%=fpuinfo% 72block%!4=I% 7< ș "Wimp_DeleteIcon",,block% 7F!block%=fpuinfo% 7Pblock%!4=W% 7Zblock%!8=0 7dblock%!12=0 7n"ș "Wimp_SetIconState",,block% 7x=W% 7�: 7�"� Check for an FPU/FPA present 7�� �fpufound 7�*ș "OS_ChangeEnvironment",1,retcd3,0,0 7� !nofpu%=0 7� � testfpu 7�=(!nofpu%=0) 7�: 7�� �UpdateMEMC(new%,mask%) 7�"ș "XOS_UpdateMEMC",new%,mask% 7�� 7�: 7�� �ReadMEMC 8 � res% 8"ș "XOS_UpdateMEMC",0,0 � res% 8 =res% 8": 8, � *** 86!� *** Initialisation routines 8@ � *** 8J: 8T� �Initialise 8^#indirected_pointer%=indirected% 8hib_block%!0=131 8rib_block%!4=-1 8|/ș"OS_ReadVduVariables",ib_block%,ib_block% 8�$block% = "TASK" 8�Hș "Wimp_Initialise",200,!block%,full_app_name$ � OurOSver%,ourtask% 8�-ș "OS_ReadModeVariable",�,4 � ,,XFactor% 8��_load_templates 8��_icon_bar 8��_load_assm 8��_assm_code 8��U_String(savesi%,1,"SI") 8��Reset_vars 8�-ș "OS_ReadModeVariable",�,4 � ,,XFactor% 8�.ș "OS_ReadModeVariable",�,11 � ,,XPixels% 8�YPixels%=(!ib_block%)*4+4 8�XPixels%+=1 9� 9: 9� Reset SI variables 9&� �Reset_vars 90� loop% 9: 9D� Display bar icon handles 9N � +10 9X� loop%=1 � 20 9b � B%(loop%) 9l� loop% 9v� loop%=0 � 35 9� C%(loop%)=82+loop% 9�� loop% 9� 9�our_filetype%=3 9� my_ref%=0 9�DRAMCheck%=� 9�VideoDMA%=� 9� calcMC%=� 9�calcBASIC%=� 9�calcFPU%=� 9�&mode%=0:ScreenSize%=0:MEMCState%=0 9�DProcessor%=0:ProcessorType%=0:IOCType%=0:MEMCType%=0:VIDCType%=0 9�ERAMSize%=0:HighROMSpeed=0:LowROMSpeed=0:RAMSpeed=0:DRAMRefresh%=0 :LMemoryBandwidth=0:ScreenBandwidth=0:DRAMBandwidth=0:ProcessorBandwidth=0 :BASICIndex=0 :&DHRYIndex=0:DHRYmsec=0:DHRYvalue=0 : FPUindex=0:FPUtime=0 :*2OSver%=0:ROMsize%=0:ROMsize5th%=0:ROMnum5th%=0 :4 OSstr$="" :>UniqueIDa%=-1:UniqueIDb%=-1 :H FPstr$="" :R7IOEBType%=-1:FPAType%=-1:PeriphType%=-1:LCDType%=-1 :\VIDEOstr$="" :fFasterBASIC%=� :pFasterFPE%=� :zCacheON%=� :�calcDHRY%=� :�RAMPageSize%=-1 :� :�� :�: :�� Display bar icon handles :�� 100,101,102,103,104 :�� 105,106,107,108,115 :�� 116,117,119,109,110 :�� 111,112,113,114,118 :�: :�#� Load templates into workspace :�� �_load_templates ;=ș "Wimp_OpenTemplate",,"<ArmSI$Dir>.Resources.Templates" ;�load_template("fpuInfo") ;/ș "Wimp_CreateWindow",, window% � fpuinfo% ;$�load_template("sysInfo") ;./ș "Wimp_CreateWindow",, window% � sysinfo% ;8�load_template("progInfo") ;B0ș "Wimp_CreateWindow",, window% � proginfo% ;L)�U_String(proginfo%, 4, app_version$) ;V�load_template("xfersend") ;`.ș "Wimp_CreateWindow",, window% � savesi% ;jș "Wimp_CloseTemplate" ;t� ;~: ;�� �load_template(A$) ;�$block1%=A$ ;�}ș "Wimp_LoadTemplate",, window%, indirected_pointer%, indirected%+(1024*8), -1, block1%, 0 � ,,indirected_pointer%,,,,A% ;�<� A%=0 � 0,"Unable to find template definition ("+A$+")" ;�� ;�: ;�"� Place an icon on the iconbar ;�� �_icon_bar ;�� width%,height% ;�>ș "XWimp_SpriteOp",40,1,"!"+app_name$ � ,,,width%,height% ;�width%=width%<<XFactor% ;�icon_block%!0=-1 <