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
<