REM >!MathChars.MakeCode
filename$="!MathChars.code"
codelength%=&1000
codestart%=&8000
:
DIM code% codelength%
:
FOR pass%=12 TO 15 STEP 3
PROCasm(pass%)
NEXT
:
OSCLI("Save "+filename$+" "+STR$~code%+" "+STR$~O%)
OSCLI("SetType "+filename$+" Data")
END
:
DEFPROCasm(pass%)
P%=codestart%
O%=code%
L%=code%+codelength%
[OPT pass%
                 STMFD r13!,{r14}
                 SWI   "Wimp_BaseOfSprites" \ Find start of RMA ram sparea (r1)
                 MOV   r0,#256+8            \ Sparea description.
                 SWI   &2e                  \ OS_SpriteOp
                 MOV   r4,r3                \ We will use r4 as a loop counter
                 ADD   r4,r4,#1             \ Increment, to counter dec. later
                 ADR   r2,datablock         \ Useable area
                 MOV   r10,#0
.loop_thru_sprites
                 SUB   r4,r4,#1             \ Decrement loop counter
                 MOV   r0,#13
                 ADD   r0,r0,#256           \ Get sprite name
                 STR   r10,datablock
                 STR   r10,datablock+4
                 STR   r10,datablock+8      \ Clear useable area
                 MOV   r3,#12               \ Size of useable area
                 SWI   &2e
                 LDR   r8,[r2]              \ r8=first 4 bytes of sprite name
                 LDR   r9,comparison_data   \ r9=first 4 bytes of expected name
                 CMP   r8,r9                \ Is sprite ours?
                 MOVEQ r0,#25
                 ADDEQ r0,r0,#256           \ Delete sprite
                 SWIEQ &2e                  \ But only if sprite was ours
                 CMP   r4,#1                \ Check for loop limits
                 BGT   loop_thru_sprites    \ If not, go back
                 LDMFD r13!,{pc}            \ Otherwise, return to caller
.datablock       EQUD 0
                 EQUD 0
                 EQUD 0
.comparison_data EQUS "!cha"
]
ENDPROC
