AN EXTENDED SPRITE INFO UTILITY

by Lee Calcraft

The command *Sinfo gives information about resident system sprites. But it is no help where Wimp sprites or user sprites are concerned. When debugging a program which uses user sprites, this can be a serious set-back. Moreover, *Sinfo gives no information about each sprite apart from its name. The accompanying utility provides a new star command *Xsinfo to fill this gap, displaying the address of the sprite area and its size, together with a listing of all resident sprites, their pixel sizes, their native mode, and their mask status.

The command Xsinfo takes a single parameter as follows:
0for System sprites
1for Wimp ROM-based sprites
2for Wimp RAM-based sprites

A hex address for user sprites

If you issue the command without a parameter, syntax help is provided.

To install the utility, type in the listing, and save it to disc. When you run the program it will create the machine code utility, and save it to disc in the current directory using the file name Xsinfo and file type &FFC (utility). To install it in the Library directory for instant use, type *DIR $.Library before running the Basic program. Once installed, the utility may be called at any time as described above.

10 REM >XsinfoSrcH
20 REM Program Sprite Info Utility
30 REM Version A 0.1H
40 REM Author Lee Calcraft
50 REM RISC User October 1989
60 REM Program Subject to Copyright
70 :
80 MODE 12
90 DIM code &1000
100 cr$=CHR$10+CHR$13
110 width=3:height=4:mask=5
120 free=5:mode=6:size=6
130 syst=7 :REM 0 for syst, or 256
140 type=8:count=8:oldsp=9
150 no=10 :REM Number of sprites
160 addr=11 :REM Sprite base address
170 :
180 FOR pass=0 TO 3 STEP 3
190 P%=code
200 [OPT pass
210 STMFD R13!,{R14}
220 MOV oldsp,R13:MOV type,#4
230 LDRB R0,[R1] :CMP R0,#0
240 BEQ help \No param so Help
250 MOV R0,#16 :MOV R2,#1<<31
260 SWI "XOS_ReadUnsigned"
270 LDMVSFD R13!,{PC}
280 MOV type,R2 :MOV addr,R2
290 CMP R2,#0 :MOVEQ syst,#0
300 MOVNE syst,#256:BEQ cont
310 CMP R2,#3 :BHS cont
320 SWI "XWimp_BaseOfSprites"
330 LDMVSFD R13!,{PC}
340 CMP type,#1
350 MOVEQ addr,R0 \ROM Wimp sprts
360 MOVNE addr,R1 \RAM Wimp sprts
370 \addr=base for user or Wimp sprts
380 .cont
390 ADR R0,text1:SWI "OS_Write0"
400 CMP type,#4 :BHI user
410 CMP type,#1 :CMPNE type,#2
420 BEQ wimp
430 \System heading
440 ADR R0,text2:SWI "OS_Write0"
450 B skip
460 .wimp \Wimp heading
470 ADR R0,text3:SWI "OS_Write0"
480 B skip1
490 .user \User heading
500 ADR R0,text4:SWI "OS_Write0"
510 .skip1
520 MOV R0,addr :MOV R2,#0
530 MOV R3,#0 \Flag hex
540 BL number
550 .skip
560 MOV R1,addr :ADD R0,syst,#8
570 SWI "XOS_SpriteOp"
580 LDMVSFD R13!,{PC}
590 MOV size,R2 :MOV no,R3
600 MOV free,R5 :ADR R0,indent1
610 SWI "OS_Write0"
620 ADR R0,text5 \block size
630 SWI "OS_Write0"
640 MOV R0,size :MOV R2,#0
650 MOV R3,#1 \Flag decimal
660 BL number:ADR R0,indent1
670 SWI "OS_Write0"
680 SUB free,size,free
690 MOV R0,free :MOV R2,#0
700 BL number :ADR R0,text6
710 SWI "OS_Write0"
720 MOV R0,no :MOV R2,#0
730 BL number :CMP no,#0
740 BEQ quit :MOV count,#1
750 .catloop
760 ADR R0,indent2
770 SWI "OS_Write0"
780 BL getdata :BL outline
790 ADD count,count,#1
800 CMP count,no:BLS catloop
810 B quit
820 .help
830 ADR R0,helptxt:SWI "OS_Write0"
840 .quit
850 SWI "OS_NewLine"
860 LDMFD R13!,{PC}^
870 .getdata
880 STMFD R13!,{R14}
890 ADD R0,syst,#13:MOV R1,addr
900 MOV R2,R12 :MOV R3,#&10
910 MOV R4,count:SWI "XOS_SpriteOp"
920 MOVVS R13,oldsp:LDMVSFD R13!,{PC}
930 BL name :ADD R0,syst,#40
940 SWI "XOS_SpriteOp"
950 MOVVS R13,oldsp
960 LDMFD R13!,{PC}
970 .name
980 STMFD R13!,{R0-R3,R14}
990 MOV R0,R2 \Spr name
1000 MOV R1,R3 :SWI "OS_WriteN"
1010 MOV R2,#14 \Pad spr name
1020 SUB R2,R2,R3
1030 .out2
1040 SWI 256+32 :SUBS R2,R2,#1
1050 BNE out2
1060 LDMFD R13!,{R0-R3,PC}
1070 .outline
1080 STMFD R13!,{R14}
1090 MOV R0,width:MOV R3,#1
1100 MOV R2,#6 :BL number
1110 SWI "OS_WriteS"
1120 EQUS " by"+CHR$0:ALIGN
1130 MOV R0,height:MOV R2,#5
1140 BL number :SWI "OS_WriteS"
1150 EQUS " mode"+CHR$0:ALIGN
1160 MOV R0,mode :MOV R2,#4
1170 BL number :CMP mask,#0
1180 BNE amask:SWIEQ "OS_WriteS"
1190 EQUS " no mask"+CHR$0
1200 ALIGN :B out3
1210 .amask
1220 SWINE "OS_WriteS"
1230 EQUS " with mask"+CHR$0:ALIGN
1240 .out3
1250 LDMFD R13!,{PC} \===Return===
1260 .helptxt
1270 EQUS "XSinfo takes a parameter:"+cr$
1280 EQUS " 0 for system sprites"+cr$
1290 EQUS " 1 for Wimp sprites (ROM)"+cr$
1300 EQUS " 2 for Wimp sprites (RAM)"+cr$
1310 EQUS " A hex address for user "
1320 EQUS "sprites"+CHR$0
1330 .text
1340 SWI "OS_Write0":MOV PC,R14
1350 .indent1
1360 EQUS cr$+" "+CHR$0:ALIGN
1370 .indent2
1380 EQUS cr$+" "+CHR$0:ALIGN
1390 .text1
1400 EQUS cr$+"Extended Sprite Info"
1410 EQUS cr$+CHR$0:ALIGN
1420 .text2
1430 EQUS "System Sprites"+CHR$0:ALIGN
1440 .text3
1450 EQUS "Wimp Sprites at &"+CHR$0
1460 ALIGN:.text4
1470 EQUS "User Sprites at &"+CHR$0
1480 ALIGN:.text5
1490 EQUS "Sprite area="+CHR$0:ALIGN
1500 .text6
1510 EQUS " byte(s) free"+cr$
1520 EQUS " Sprites present: "+CHR$0
1530 ALIGN:.number
1540 STMFD R13!,{R14}
1550 MOV R1,R12 :CMP R2,#0
1560 MOVEQ R2,#256 :CMP R3,#0
1570 SWIEQ "XOS_ConvertHex8"
1580 MOVVS R13,oldsp:LDMVSFD R13!,{PC}
1590 SWINE "XOS_ConvertCardinal4"
1600 MOVVS R13,oldsp:LDMVSFD R13!,{PC}
1610 .numb1
1620 CMP R2,#80 :BHI numb2
1630 CMP R2,#0 :BEQ numb2
1640 SWI 256+32 :SUBS R2,R2,#1
1650 BHI numb1
1660 .numb2
1670 SWI "OS_Write0":LDMFD R13!,{PC}
1680 ]NEXT
1690 SYS "OS_File",10,"XSinfo",&FFC,,code,P%