home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / FastSpr / Source
Encoding:
Text File  |  1995-08-07  |  33.7 KB  |  1,994 lines

  1.  
  2. ;  You'll have fun with this!!!
  3.  
  4. #name FastSpr
  5. #type &ffa
  6. #base 0
  7. #set Swibase = &47d00
  8.  
  9. struct v {
  10.   .screenstart    DCD 0
  11.   .screensize    DCD 0
  12.   .vpix        DCD 0
  13.   .hbytes    DCD 0
  14.   .modesize    DCD 0
  15.   .screenuse    DCD 0
  16.   .datastart    DCD 0
  17.   .cminx    DCD 0
  18.   .cminy    DCD 0
  19.   .cmaxx    DCD 0
  20.   .cmaxy    DCD 0
  21.   .backdropstr    DCD 0
  22.   .flashstr    DCD 0
  23.   .startblock    DBD &40
  24.   .sizeof
  25. }
  26.   
  27. DCD 0
  28. DCD init
  29. DCD final
  30. DCD service
  31. DCD title
  32. DCD helpstring
  33. DCD helptable
  34. DCD Swibase
  35. DCD swicode
  36. DCD switab
  37. DCD 0
  38.  
  39. .title
  40. DCB "FastSpr",0
  41. ALIGN
  42. .helpstring
  43. DCB "FastSpr",9,9,"3.01 (16 Oct 1994)",0
  44. ALIGN
  45. .helptable
  46. DCB "FastSpr"
  47. DCB 0
  48. ALIGN
  49. DCD 0
  50. DCD 0
  51. DCD 0
  52. DCD help
  53. DCB "FastSprPlot"
  54. DCB 0
  55. ALIGN
  56. DCD plot
  57. DCD &0003FF03
  58. DCD plotsyn
  59. DCD plothelp
  60. DCB "FastSprLoad"
  61. DCB 0
  62. ALIGN
  63. DCD fsploadcommand
  64. DCD &0002FF01
  65. DCD fsploadsyn
  66. DCD fsploadhelp
  67. DCB "FastSprWipe"
  68. DCB 0
  69. ALIGN
  70. DCD wipecommand
  71. DCD &0001FF00
  72. DCD fspwipesyn
  73. DCD fspwipehelp
  74. DCB "FastSprBackdrop"
  75. DCB 0
  76. ALIGN
  77. DCD backdrop
  78. DCD &0001FF01
  79. DCD backdropsyn
  80. DCD backdrophelp
  81. DCB "FastSprFlash"
  82. DCB 0
  83. ALIGN
  84. DCD flash
  85. DCD &0001FF01
  86. DCD flashsyn
  87. DCD flashhelp
  88. DCB "FastSprSWIs"
  89. DCB 0
  90. ALIGN
  91. DCD 0
  92. DCD 0
  93. DCD 0
  94. DCD swihelp
  95. DCD 0    ;*** END MARKER ***
  96.  
  97. .plothelp
  98. DCB 27,0," issues a plot command via FastSpr_Plot.  Use this command for testing only please (very slow).",10,13
  99. .plotsyn
  100. DCB 27,1," <number> <x coord> <y coord>",0
  101.  
  102. .help
  103. DCB 27,0," is an optimised sprite plotter, using a special sprite format.",10,13
  104. DCB "© A.Southgate 1994 - may be freely included in commercial or non-commercial software.",10,13
  105. DCB "The flash facility is not active in this release.",10,13
  106. DCB 0
  107.  
  108. .fsploadhelp
  109. DCB 27,0," loads a FastSpr file into the RMA.",10,13
  110. .fsploadsyn
  111. DCB 27,1," [pool] <filename>",0
  112. .fspwipehelp
  113. DCB 27,0," removes one or more FastSpr files from memory.",10,13
  114. .fspwipesyn
  115. DCB 27,1," [pool]",0
  116. .backdrophelp
  117. DCB 27,0," sets the colour used to fill the clip window, used by the SWI ",34,"FastSpr_ClearWindow",34,".  Colours are numbered 0-255 as in !Paint.",10,13
  118. .backdropsyn
  119. DCB 27,1," <colour>",0
  120. .flashhelp
  121. DCB 27,0," sets the colour used to paint a sprite when flash is specified by setting bit 30 in the sprite number.  Colours are numbered 0-255 as in !Paint.",10,13
  122. DCB "*** SetFlash is inactive in this release ***",10,13
  123. .flashsyn
  124. DCB 27,1," <colour>",0
  125. .swihelp
  126. DCB "The module supports the following SWIs, based at &47D00.",10,13,10,13
  127. DCB 9,"&47D00",9,34,"FastSpr_Plot",34,",spritenum,x,y",10,13
  128. DCB 9,"&47D01",9,34,"FastSpr_ClearWindow",34,10,13
  129. DCB 9,"&47D02",9,34,"FastSpr_SetClipWindow",34,",xmix,ymin,xmax,ymax",10,13
  130. DCB 9,"&47D03",9,34,"FastSpr_Load",34,",filename$,pool",10,13
  131. DCB 9,"&47D04",9,34,"FastSpr_GetAddress",34," TO PlotsAdr,ClearsAdr,BanksAdr,,VarsAdr",10,13
  132. DCB 9,"&47D05",9,34,"FastSpr_SetBackdrop",34,",colour",10,13
  133. DCB 9,"&47D06",9,34,"FastSpr_ScreenBank",34,",bank",10,13
  134. DCB 9,"&47D07",9,34,"FastSpr_SpritesAreAt",34,",address",10,13
  135. DCB 9,"&47D08",9,34,"FastSpr_ReadSize",34,",number TO xsize,ysize",10,13
  136. DCB 9,"&47D09",9,34,"FastSpr_GetPointer",34,",pool TO address",10,13
  137. DCB 9,"&47D0A",9,34,"FastSpr_SetFlash",34,",colour",10,13
  138. DCB 10,13
  139. DCB "PlotsAdr, ClearsAdr and BanksAdr are call addresses for the three routines, to bypass the SWI system.",10,13
  140. DCB "VarsAdr is the address of FastSpr’s variables.",10,13
  141. DCB "*** SetFlash is inactive in this release ***",10,13
  142. DCB 0
  143.  
  144.  
  145. ALIGN
  146.  
  147. .switab
  148. DCB "FastSpr"
  149. DCB 0
  150. DCB "Plot",0
  151. DCB "ClearWindow",0
  152. DCB "SetClipWindow",0
  153. DCB "Load",0
  154. DCB "GetAddress",0
  155. DCB "SetBackdrop",0
  156. DCB "ScreenBank",0
  157. DCB "SpritesAreAt",0
  158. DCB "ReadSize",0
  159. DCB "GetPointer",0
  160. DCB "SetFlash",0
  161. DCB 0; *** END MARKER ***
  162. ALIGN
  163.  
  164. #set swino = 11
  165.  
  166. .service
  167. CMP R1,#&46
  168. MOVNES PC,R14
  169. STMFD R13!,{R0-R2,R14}
  170. LDR R12,[R12]
  171. BL moderead
  172. LDMFD R13!,{R0-R2,PC}
  173.  
  174. .swicode
  175. LDR R12,[R12]
  176. CMP R11,#0
  177. BEQ plotswi
  178. CMP R11,#swino
  179. BGE unknownswi
  180. ADR R10,swiofstab
  181. LDR R11,[R10,R11,LSL #2]
  182. ADD PC,R10,R11
  183. .swiofs
  184. .swiofstab
  185. DCD plotswi         - swiofs
  186. DCD clearwindowswi       - swiofs
  187. DCD setclipwindowswi    - swiofs
  188. DCD fsploadswi        - swiofs
  189. DCD getaddressswi    - swiofs
  190. DCD setbackdropswi    - swiofs
  191. DCD setscreenbankswi    - swiofs
  192. DCD spritesareatswi    - swiofs
  193. DCD readsizeswi        - swiofs
  194. DCD getpoolpointerswi    - swiofs
  195. DCD setflashswi        - swiofs
  196.  
  197.  
  198. .setclipwindowswi
  199. STMFD R13!,{R4,R14}
  200. CMP R0,#0
  201. CMPGE R1,#0
  202. BLT badwindow
  203. LDR R4,[R12,#v.hbytes]
  204. CMP R2,R4
  205. BGT badwindow
  206. LDR R4,[R12,#v.vpix]
  207. CMP R3,R4
  208. BGT badwindow
  209. CMP R0,R2
  210. CMPLT R1,R3
  211. BGE badwindow
  212. CMP R0,#2
  213. CMPLT R1,#1
  214. CMPLT R2,#3
  215. BLT badwindow
  216. STR R0,[R12,#v.cminx]
  217. STR R1,[R12,#v.cminy]
  218. STR R2,[R12,#v.cmaxx]
  219. STR R3,[R12,#v.cmaxy]
  220. LDMFD R13!,{R4,PC}
  221.  
  222.  
  223. .spritesareatswi
  224. STMFD R13!,{R1-R2,R14}
  225. LDR R2,[R12,#v.datastart]
  226. STR R0,[R12,#v.datastart]
  227. MOV R0,#7
  228. CMP R2,#&1800000
  229. SWIGE XOS_Module
  230. LDMFD R13!,{R1-R2,PC}^
  231.  
  232. .getpoolpointerswi
  233. STMFD R13!,{R14}
  234. AND R0,R0,#&3F
  235. CMP R0,#0
  236. ADDEQ R0,R12,#v.datastart
  237. LDMEQFD R13!,{PC}^
  238. MOV R0,R0,LSL #2
  239. ADD R0,R12,R0
  240. ADD R0,R0,#v.startblock
  241. LDMFD R13!,{PC}^
  242.  
  243. .wipecommand
  244. STMFD R13!,{R14}
  245. LDR R12,[R12]
  246. CMP R1,#0
  247. BEQ wipeall
  248. MOV R1,R0
  249. MOV R0,#10
  250. SWI OS_ReadUnsigned
  251. MOV R0,#0
  252. MOV R1,R2
  253. BL fsploadswi
  254. LDMFD R13!,{PC}
  255. .wipeall
  256. BL releasestartblock
  257. LDMFD R13!,{PC}
  258.  
  259. .fsploadcommand
  260.  
  261. LDR R12,[R12]
  262. CMP R1,#1
  263. MOVEQ R1,#0;pool 0
  264. BEQ fsploadswi
  265. STMFD R13!,{R14}
  266. MOV R1,R0
  267. MOV R0,#10
  268. SWI OS_ReadUnsigned
  269. MOV R0,R1
  270. MOV R1,R2
  271. BL fsploadswi
  272. LDMFD R13!,{PC}
  273.  
  274.  
  275.  
  276. .fsploadswi
  277. STMFD R13!,{R1-R9,R14}
  278. MOV R6,R0
  279. MOV R0,R1
  280. BL getpoolpointerswi
  281. MOV R10,R0
  282. LDR R2,[R10]
  283. MOV R0,#0
  284. STR R0,[R10]
  285. MOV R0,#7
  286. TST R2,#1
  287. BIC R2,R2,#3
  288. SWINE XOS_Module
  289. MOV R0,#0
  290. STR R0,[R10]
  291. MOV R1,R6
  292. CMP R1,#0
  293. LDMEQFD R13!,{R1-R9,PC}^
  294. MOV R0,#5
  295. SWI OS_File
  296. CMP R0,#1
  297. LDMNEFD R13!,{R1-R9,R14}
  298. BNE badfileerr
  299. MOV R6,R1
  300. MOV R0,#6
  301. MOV R3,R4
  302. SWI XOS_Module
  303. LDMVSFD R13!,{R1-R9,R14}
  304. BVS nospaceerr
  305. ORR R2,R2,#1
  306. STR R2,[R10]
  307. BIC R2,R2,#3
  308. MOV R3,#0
  309. MOV R1,R6
  310. MOV R0,#&FF
  311. SWI OS_File
  312. LDR R0,[R10]
  313. BIC R0,R0,#3
  314. LDR R0,[R0]
  315. LDR R1,idbyte1
  316. CMP R0,R1
  317. LDR R1,idbyte2
  318. CMPNE R0,R1
  319. LDMNEFD R13!,{R1-R9,R14}
  320. BNE badfileerr2
  321. LDMFD R13!,{R1-R9,PC}^
  322.  
  323. .backdrop
  324. STMFD R13!,{R14}
  325. MOV R1,R0
  326. MOV R0,#10
  327. ORR R0,R0,#3<<30
  328. SWI OS_ReadUnsigned
  329. MOV R0,R2
  330. BL setbackdropswi
  331. LDMFD R13!,{PC}
  332.  
  333. .flash
  334. STMFD R13!,{R14}
  335. MOV R1,R0
  336. MOV R0,#10
  337. ORR R0,R0,#3<<30
  338. SWI OS_ReadUnsigned
  339. MOV R0,R2
  340. BL setflashswi
  341. LDMFD R13!,{PC}
  342.  
  343. .plot
  344. STMFD R13!,{R14}
  345. LDR R12,[R12]
  346. MOV R1,R0
  347. MOV R0,#10
  348. SWI OS_ReadUnsigned
  349. MOV R3,R2
  350. SWI OS_ReadUnsigned
  351. MOV R4,R2
  352. SWI OS_ReadUnsigned
  353. MOV R0,R3
  354. MOV R1,R4
  355. BL plotswi
  356. LDMFD R13!,{PC}
  357.  
  358. .init
  359. STMFD R13!,{R1-R11,R14}
  360. MOV R4,R12
  361. LDR R12,[R12]
  362. CMP R12,#0
  363. BNE dontclaim
  364. MOV R0,#6
  365. MOV R3,#v.sizeof         ;variable block size
  366. SWI OS_Module
  367. STR R2,[R4]
  368. MOV R12,R2
  369. .dontclaim
  370. STR R12,varstr
  371. MOV R1,#v.sizeof
  372. MOV R0,#0
  373. MOV R2,R12
  374. .loop11
  375. STR R0,[R2],#4
  376. SUBS R1,R1,#4
  377. BGT loop11
  378. BL moderead
  379. MVN R0,#0
  380. STR R0,[R12,#v.flashstr]
  381. LDMFD R13!,{R1-R11,PC}
  382.  
  383. .releasestartblock
  384. STMFD R13!,{R14}
  385. LDR R2,[R12,#v.datastart]
  386. MOV R0,#0
  387. STR R0,[R12,#v.datastart]
  388. MOV R0,#7
  389. TST R2,#1
  390. BIC R2,R2,#3
  391. SWINE XOS_Module       ;don't generate errors while finalising
  392.  
  393. ADD R4,R12,#v.startblock
  394. MOV R5,#&3F
  395.  
  396. .loopx
  397. LDR R2,[R4]
  398. MOV R0,#0
  399. STR R0,[R4],#4
  400. MOV R0,#7
  401. TST R2,#1
  402. BIC R2,R2,#3
  403. SWINE XOS_Module
  404. SUBS R5,R5,#1
  405. BGT loopx
  406. LDMFD R13!,{PC}^
  407.  
  408.  
  409. .final
  410. STMFD R13!,{R1-R11,R14}; needs a rewrite
  411. LDR R12,[R12]
  412. BL releasestartblock
  413. CMP R10,#0
  414. MOV R0,#7
  415. MOV R2,R12
  416. SWINE XOS_Module
  417. LDMFD R13!,{R1-R11,PC}^
  418.  
  419.  
  420. .moderead
  421. STMFD R13!,{R14}
  422. MOV R0,#112
  423. MOV R1,#1
  424. SWI OS_Byte
  425. MOV R3,R1
  426. ADR R0,vdutab
  427. ADD R1,R12,#v.screenstart
  428. SWI OS_ReadVduVariables
  429. MOV R0,#112
  430. MOV R1,R3
  431. SWI OS_Byte
  432. LDR R0,[R12,#v.hbytes]
  433. LDR R1,[R12,#v.modesize]
  434. MVN R2,#0
  435. .vduloop
  436. SUBS R1,R1,R0
  437. ADD R2,R2,#1
  438. BPL vduloop
  439. STR R2,[R12,#v.vpix]
  440. MOV R0,#0
  441. STR R0,[R12,#v.cminx]
  442. STR R0,[R12,#v.cminy]
  443. LDR R0,[R12,#v.hbytes]
  444. STR R0,[R12,#v.cmaxx]
  445. LDR R0,[R12,#v.vpix]
  446. STR R0,[R12,#v.cmaxy]
  447. MOV R0,#0
  448. BL setscreenbankswi
  449. LDMFD R13!,{PC}
  450. .vdutab
  451. DCD 148;  screenstart
  452. DCD 150;  screensize
  453. DCD 5  ;  vert.pix.res
  454. DCD 6  ;  bytes per row
  455. DCD 7  ;  modesize
  456. DCD -1
  457.  
  458. .getaddressswi
  459. STMFD R13!,{R14}
  460. ADR R0,plotveneer
  461. ADR R1,clearveneer
  462. ADR R2,bankveneer
  463. MOV R4,R12
  464. LDMFD R13!,{PC}
  465.  
  466. .plotveneer
  467. STMFD R13!,{R10-R12,R14}
  468. LDR R12,varstr
  469. BL plotswi
  470. LDMFD R13!,{R10-R12,PC}
  471.  
  472. .clearveneer
  473. STMFD R13!,{R10-R12,R14}
  474. LDR R12,varstr
  475. BL clearwindowswi
  476. LDMFD R13!,{R10-R12,PC}
  477.  
  478. .bankveneer
  479. STMFD R13!,{R10-R12,R14}
  480. LDR R12,varstr
  481. BL setscreenbankswi
  482. LDMFD R13!,{R10-R12,PC}
  483. .varstr
  484. DCD 0
  485.  
  486. .setbackdropswi
  487. STMFD R13!,{R0,R14}
  488. ADD R0,R0,R0,LSL #8
  489. ADD R0,R0,R0,LSL #16
  490. STR R0,[R12,#v.backdropstr]
  491. LDMFD R13!,{R0,PC}
  492.  
  493. .setflashswi
  494. STMFD R13!,{R0,R14}
  495. ADD R0,R0,R0,LSL #8
  496. ADD R0,R0,R0,LSL #16
  497. STR R0,[R12,#v.flashstr]
  498. LDMFD R13!,{R0,PC}
  499.  
  500. .setscreenbankswi
  501. STMFD R13!,{R1-R2,R14}
  502. LDR R1,[R12,#v.screenstart]
  503. LDR R2,[R12,#v.modesize]
  504. CMP R0,#1
  505. ADDEQ R1,R1,R2
  506. CMP R0,#&8000
  507. MOVGE R1,R0
  508. STR R1,[R12,#v.screenuse]
  509. LDMFD R13!,{R1-R2,PC}
  510.  
  511. .clearwindowswi
  512. STMFD R13!,{R1-R9,R14}
  513. LDR R10,[R12,#v.screenuse]
  514. LDR R2,[R12,#v.hbytes]
  515. LDR R1,[R12,#v.cminy]
  516. MUL R0,R1,R2
  517. ADD R11,R10,R0
  518. LDR R0,[R12,#v.cminx]
  519. CMP R0,#0
  520. LDREQ R0,[R12,#v.cmaxx]
  521. CMPEQ R0,R2
  522.  
  523. BEQ clearblast
  524. LDR R0,[R12,#v.cmaxx]
  525. ANDS R0,R0,#3
  526. LDREQ R0,[R12,#v.cminx]
  527. ANDEQS R0,R0,#3
  528. BEQ almostblast
  529. STMFD R13!,{R10,R11}
  530. LDR R0,[R12,#v.cmaxy]
  531.  
  532.  
  533. MUL R9,R2,R0
  534. ADD R9,R10,R9
  535.  
  536. LDR R0,[R12,#v.cminx]
  537. LDR R1,[R12,#v.cmaxx]
  538.  
  539. ADD R10,R11,R1
  540. ADD R11,R11,R0
  541. LDR R0,[R12,#v.backdropstr]
  542. .loop16
  543. STRB R0,[R11]
  544. STRB R0,[R11,#1]
  545. STRB R0,[R11,#2]
  546.  
  547. STRB R0,[R10,#-1]
  548. STRB R0,[R10,#-2]
  549. STRB R0,[R10,#-3]
  550. ADD R10,R10,R2
  551. ADD  R11,R11,R2
  552. CMP R10,R9
  553. BLE loop16
  554.  
  555. LDMFD R13!,{R10,R11}
  556. LDR R0,[R12,#v.cmaxy]
  557. LDR R1,[R12,#v.cminy]
  558. SUB R8,R0,R1
  559. MUL R0,R2,R0
  560. ADD R9,R10,R0
  561. LDR R0,[R12,#v.cminx]
  562. ADD R0,R0,#3
  563. BIC R0,R0,#3
  564. ADD R11,R11,R0
  565. LDR R1,[R12,#v.cmaxx]
  566. BIC R1,R1,#3
  567. CMP R1,R0
  568. BGT almostinsert
  569. LDMFD R13!,{R1-R9,PC}
  570.  
  571. .almostblast
  572. LDR R0,[R12,#v.cmaxy]
  573. SUB R8,R0,R1
  574. MUL R0,R2,R0
  575. ADD R9,R10,R0
  576. LDR R0,[R12,#v.cminx]
  577. ADD R11,R11,R0
  578. LDR R1,[R12,#v.cmaxx]
  579. .almostinsert
  580. SUB R8,R1,R0
  581. CMP R8,#640
  582. LDMHIFD R13!,{R1-R9,R14}
  583. BHI toowideerr
  584. RSB R8,R8,#640
  585. SUB R1,R2,R1
  586. ADD R10,R0,R1
  587. LDR R0,[R12,#v.backdropstr]
  588. MOV R1,R0
  589. MOV R2,R0
  590. MOV R3,R0
  591. MOV R4,R0
  592. MOV R5,R0
  593. MOV R6,R0
  594. MOV R7,R0
  595. .loop15
  596. AND R12,R8,#&3E0
  597.  
  598. ADD PC,PC,R12,LSR #3
  599. MOV R0,R0
  600. STMIA R11!,{R0-R7}
  601. STMIA R11!,{R0-R7}
  602. STMIA R11!,{R0-R7}
  603. STMIA R11!,{R0-R7}
  604. STMIA R11!,{R0-R7}
  605. STMIA R11!,{R0-R7}
  606. STMIA R11!,{R0-R7}
  607. STMIA R11!,{R0-R7}
  608. STMIA R11!,{R0-R7}
  609. STMIA R11!,{R0-R7}
  610. STMIA R11!,{R0-R7}
  611. STMIA R11!,{R0-R7}
  612. STMIA R11!,{R0-R7}
  613. STMIA R11!,{R0-R7}
  614. STMIA R11!,{R0-R7}
  615. STMIA R11!,{R0-R7}
  616. STMIA R11!,{R0-R7}
  617. STMIA R11!,{R0-R7}
  618. STMIA R11!,{R0-R7}
  619. AND R12,R8,#&1C
  620. ADD PC,PC,R12
  621. MOV R0,R0
  622. STR R1,[R11],#4
  623. STR R1,[R11],#4
  624. STR R1,[R11],#4
  625. STR R1,[R11],#4
  626. STR R1,[R11],#4
  627. STR R1,[R11],#4
  628. STR R1,[R11],#4
  629. STR R1,[R11],#4
  630. ADD R11,R11,R10
  631. CMP R11,R9
  632. BLT loop15
  633. LDMFD R13!,{R1-R9,PC}
  634.  
  635.  
  636.  
  637.  
  638. .clearblast
  639.  
  640. LDR R1,[R12,#v.cmaxy]
  641. MUL R0,R1,R2
  642. ADD R10,R10,R0
  643. LDR R0,[R12,#v.backdropstr]
  644. MOV R1,R0
  645. MOV R2,R0
  646. MOV R3,R0
  647. MOV R4,R0
  648. MOV R5,R0
  649. MOV R6,R0
  650. MOV R7,R0
  651. MOV R8,R0
  652. MOV R9,R0
  653.  
  654. SUB R0,R10,R11
  655. CMP R0,#40*10
  656. BLE loop13
  657. .loop12
  658. LDR R0,[R12,#v.backdropstr]
  659. STMIA R11!,{R0-R9}
  660. STMIA R11!,{R0-R9}
  661. STMIA R11!,{R0-R9}
  662. STMIA R11!,{R0-R9}
  663. STMIA R11!,{R0-R9}
  664. STMIA R11!,{R0-R9}
  665. STMIA R11!,{R0-R9}
  666. STMIA R11!,{R0-R9}
  667. STMIA R11!,{R0-R9}
  668. STMIA R11!,{R0-R9}
  669. SUB R0,R10,R11
  670. CMP R0,#40*10
  671. BGT loop12
  672. CMP R0,#36
  673. BLE loop14
  674. .loop13
  675. STMIA R11!,{R1-R9}
  676. SUB R0,R10,R11
  677. CMP R0,#36
  678. BGT loop13
  679.  
  680. .loop14
  681. CMP R10,R11
  682. LDMEQFD R13!,{R1-R9,PC}
  683. STRB R1,[R11],#1
  684. B loop14
  685.  
  686. .idbyte1
  687. DCB "FSP1"
  688. .idbyte2
  689. DCB "FSP2"
  690.  
  691. .nodata    ;kept out of plot path
  692. LDMFD R13!,{R1-R9,R14}
  693. B nodataerr
  694.  
  695. .toobig    ;kept out of plot path
  696. LDMFD R13!,{R1-R9,R14}
  697. B toobigerr
  698.  
  699. .slotempty
  700. LDMFD R13!,{R1-R9,R14}
  701. ORR R14,R14,#1<<29; set carry
  702. MOVS PC,R14
  703.  
  704. .readsizeswi
  705. STMFD R13!,{R2-R11,R14}
  706. MOV R4,R0
  707. MOV R0,R0,LSR #24
  708. BL getpoolpointerswi
  709. MOV R10,R0
  710. LDR R10,[R10]
  711. BIC R10,R10,#3
  712. BIC R0,R4,#&FF<<24
  713. LDR R1,[R10]
  714. ADR R2,idbyte1
  715. LDMIA R2,{R3,R4}
  716. CMP R1,R3
  717. BEQ fsp1size
  718. CMP R1,R4
  719. BNE sizenodata    ;drops through
  720.  
  721. .fsp2size
  722. LDR R1,[R10,#4]
  723. BIC R3,R0,#&FF<<16
  724. CMP R1,R3
  725. CMNGT R3,#1
  726. BLE sizetoobig
  727. ADD R3,R3,#3               ;get sprite block offset
  728. LDR R3,[R10,R3,LSL #2]
  729. CMP R3,#0
  730. BEQ sizeslotempty
  731. AND R4,R3,#&FF
  732. AND R4,R4,R0,LSR #16
  733. ADD R3,R3,R4,LSL #12
  734. LDR R4,[R10,R3,LSR #8]
  735. LDR R0,[R10,R4,LSR #8]
  736. BIC R1,R0,#&FF<<24
  737. BIC R1,R1 #&FF<<16         ;y size
  738. MOV R0,R0,LSR #16          ;x size
  739. LDMFD R13!,{R2-R11,PC}^
  740.  
  741. .fsp1size
  742.  
  743. LDR R1,[R10,#12]
  744. CMP R1,R0
  745. CMNGT R0,#1
  746. BLE sizetoobig
  747. ADD R0,R0,#4               ;get sprite block offset
  748. LDR R0,[R10,R0,LSL #2]
  749. CMP R0,#0
  750. BEQ sizeslotempty
  751. LDR R1,[R10,R0]!
  752.  
  753. AND R0,R1,#&FF            ;x size
  754. AND R1,R1,#&FF<<8         ;y size - R7,R8 -- sprite width, height
  755. MOV R1,R1,LSR #8
  756. LDMFD R13!,{R2-R11,PC}^
  757.  
  758. .sizenodata
  759. LDMFD R13!,{R2-R11,R14}
  760. B nodataerr
  761.  
  762. .sizetoobig
  763. LDMFD R13!,{R2-R11,R14}
  764. B toobigerr
  765.  
  766. .sizeslotempty
  767. MOV R0,#0
  768. MOV R1,#0
  769. LDMFD R13!,{R2-R11,PC}^
  770.  
  771.  
  772.  
  773. .plotswi
  774. BIC R14,R14,#&0f<<28; clear flags for return
  775. STMFD R13!,{R1-R9,R14}
  776. AND R6,R0,#&3F<<24
  777. BIC R0,R0,#&FF<<24
  778. ADD R10,R12,#v.startblock
  779. ADD R10,R10,R6,LSR #22
  780. CMP R6,#0
  781. ADDEQ R10,R12,#v.datastart
  782. LDR R10,[R10]
  783. BIC R10,R10,#3; mask out flag bits
  784. LDR R7,[R10]
  785. ADR R6,idbyte1
  786. LDMIA R6,{R8,R9}
  787. CMP R7,R8
  788. BEQ fsp1plot
  789. CMP R7,R9
  790. BNE nodata
  791.         ;drops through
  792. .fsp2plot
  793.  
  794. LDR R9,[R10,#4]
  795. BIC R3,R0,#&FF<<16
  796. CMP R9,R3
  797. CMNGT R3,#1
  798. BLE toobig
  799. ADD R3,R3,#3               ;get sprite block offset
  800. LDR R3,[R10,R3,LSL #2]
  801. CMP R3,#0
  802. BEQ slotempty
  803. AND R4,R3,#&FF      ; get frame limit
  804. AND R4,R4,R0,LSR #16; get animation frame
  805. ADD R3,R3,R4,LSL #12 ; 
  806. LDR R4,[R10,R3,LSR #8]     ; get address of sprite to plot
  807. ADD R4,R10,R4,LSR #8
  808.  
  809. LDMIA R4,{R8,R9}
  810. AND R0,R1,#3
  811. SUB R1,R1,R9,ASR #16       ;x ofs
  812. MOV R9,R9,ASL #16
  813. SUB R2,R2,R9,ASR #16       ;y ofs
  814. ADD R3,R3,R0,LSL #10
  815. LDR R3,[R10,R3,LSR #8]
  816. ADD R10,R10,R3,LSR #8
  817. TST R3,#4
  818. SUBNE R1,R1,#4
  819. TST R3,#8
  820. BICEQ R1,R1,#3               ;align R1 as for h-locks
  821. ANDEQ R3,R3,#3
  822. ORREQ R1,R1,R3               ;R3 & 3 contains the bits that we expect in the
  823.                            ;low order of R11
  824.  
  825.  
  826. LDR R11,[R12,#v.screenuse] ;get screen address
  827. LDR R9,[R12,#v.hbytes]
  828. MUL R0,R9,R2
  829. ADD R11,R11,R0
  830. ADD R11,R11,R1
  831.  
  832. BIC R9,R8,#&FF<<24
  833. BIC R9,R9 #&FF<<16         ;y size
  834. MOV R8,R8,LSR #16          ;x size
  835.  
  836. ADD R0,R12,#v.cminx
  837. LDMIA R0,{R3-R6}           ;get clip margins pronto
  838.                            ;R3,R4,R5,R6 -- min x,min y, max x, max y
  839. SUB R5,R5,R8
  840. SUB R6,R6,R9
  841. CMP R1,R3
  842. CMPGE R2,R4
  843. CMPGE R5,R1
  844. CMPGE R6,R2
  845. MOVGE R8,#0
  846. MOV R7,#0
  847. BGE fsp2fullon             ;fully on screen, so go for it
  848. LDMIA R0,{R3-R6}           ;again
  849. SUB R3,R3,R8               ;checking for completely off screen
  850. SUB R4,R4,R9
  851. CMP R1,R3
  852. CMPGT R2,R4
  853. CMPGT R5,R1
  854. CMPGT R6,R2
  855. LDMLEFD R13!,{R1-R9,PC}^   ;fully off screen
  856. LDMIA R0,{R3-R4}
  857.             
  858. SUB R0,R6,R9
  859. CMP R2,R0                ;bottom clip
  860.  SUBGT R9,R6,R2
  861. CMP R2,R4               ;top clip
  862. SUB R0,R5,R8            ;squeezed in - part of horiz.clip
  863. MOV R8,#0               ;ditto
  864.  SUBLT R8,R4,R2
  865.  
  866. CMP R1,R0
  867.  SUBGE R7,R5,R1         ;right clip
  868.  
  869. CMP R1,R3
  870.  SUBLT R0,R3,R1         ;left clip
  871.  
  872.  ADDLT R7,R7,R0,ASL #16
  873. .fsp2fullon
  874. LDR R0,[R10,#8]
  875. CMP R0,#0
  876. BLNE stmblast
  877. LDR R0,[R10,#12]
  878. CMP R0,#0
  879. BLNE strblast
  880. LDR R0,[R10,#16]
  881. CMP R0,#0
  882. BNE strbpaint
  883. LDMFD R13!,{R1-R9,PC}^
  884.  
  885. .fsp1plot
  886.  
  887. LDR R9,[R10,#12]
  888. CMP R9,R0
  889. CMNGT R0,#1
  890. BLE toobig
  891. ADD R0,R0,#4               ;get sprite block offset
  892. LDR R0,[R10,R0,LSL #2]
  893. CMP R0,#0
  894. BEQ slotempty
  895. LDR R11,[R10,R0]!          ;Move by offsets - remember byte order
  896. AND R0,R11,#&FF<<16        ;x ofs
  897. SUB R1,R1,R0,LSR #16
  898. AND R0,R11,#&FF<<24        ;y ofs
  899. SUB R2,R2,R0,LSR #24       ;R1,R2 -- x,y coord of top left corner
  900.  
  901. AND R8,R11,#&FF            ;x size
  902. AND R9,R11,#&FF<<8         ;y size - R7,R8 -- sprite width, height
  903. MOV R9,R9,LSR #8
  904.  
  905. LDR R11,[R12,#v.screenuse] ;get screen address
  906. LDR R0,[R12,#v.hbytes]
  907. MUL R0,R2,R0
  908. ADD R11,R11,R0
  909. ADD R11,R11,R1
  910.  
  911. ADD R0,R12,#v.cminx
  912. LDMIA R0,{R3-R6}           ;get clip margins pronto
  913.                            ;R3,R4,R5,R6 -- min x,min y, max x, max y
  914. SUB R5,R5,R8
  915. SUB R6,R6,R9
  916. CMP R1,R3
  917. CMPGE R2,R4
  918. CMPGE R5,R1
  919. CMPGE R6,R2
  920. MOVGE R8,#0
  921. MOV R7,#0  ;right/left clip indicator
  922. BGE fsp1fullon             ;fully on screen, so go for it
  923.  
  924. LDMIA R0,{R3-R6}           ;again
  925. SUB R3,R3,R8               ;checking for completely off screen
  926. SUB R4,R4,R9
  927. CMP R1,R3
  928. CMPGT R2,R4
  929. CMPGT R5,R1
  930. CMPGT R6,R2
  931. LDMLEFD R13!,{R1-R9,PC}^   ;fully off screen
  932. LDMIA R0,{R3-R4}
  933.             
  934. SUB R0,R6,R9
  935. CMP R2,R0                ;bottom clip
  936.  SUBGT R9,R6,R2
  937. CMP R2,R4               ;top clip
  938. SUB R0,R5,R8            ;squeezed in - part of horiz.clip
  939. MOV R8,#0               ;ditto
  940.  SUBLT R8,R4,R2
  941.  
  942. CMP R1,R0
  943.  SUBGE R7,R5,R1         ;right clip
  944. CMP R1,R3
  945.  SUBLT R0,R3,R1         ;left clip
  946.  ADDLT R7,R7,R0,ASL #16
  947. .fsp1fullon
  948. .fsp1blast
  949. ADD R8,R8,#1
  950. ADD R9,R9,#1
  951. CMP R7,#0
  952. BNE fsp1rightclip
  953. B blastins
  954. .strbpaint
  955.             ;drops through
  956. .blast
  957. ADD R10,R10,R0,LSR #8
  958. CMP R7,#0
  959. BNE rightclip
  960. .blastins
  961. LDR R8,[R10,R8,LSL #2]
  962. LDR R9,[R10,R9,LSL #2]
  963. CMP R9,R8
  964. LDMLEFD R13!,{R1-R9,PC}^
  965. ADD R9,R10,R9
  966. ADD R10,R10,R8
  967.  
  968. .loop2
  969. SUB R12,R9,R10
  970. CMP R12,#22<<2
  971. BLT skip1
  972. .loop3
  973. LDMIA R10!,{R0-R8,R12,R14}
  974. STRB R0,[R11,R0,LSR #8]
  975. STRB R1,[R11,R1,LSR #8]
  976. STRB R2,[R11,R2,LSR #8]
  977. STRB R3,[R11,R3,LSR #8]
  978. STRB R4,[R11,R4,LSR #8]
  979. STRB R5,[R11,R5,LSR #8]
  980. STRB R6,[R11,R6,LSR #8]
  981. STRB R7,[R11,R7,LSR #8]
  982. STRB R8,[R11,R8,LSR #8]
  983. STRB R12,[R11,R12,LSR #8]
  984. STRB R14,[R11,R14,LSR #8]
  985. .loop1
  986. LDMIA R10!,{R0-R8,R12,R14}
  987. STRB R0,[R11,R0,LSR #8]
  988. STRB R1,[R11,R1,LSR #8]
  989. STRB R2,[R11,R2,LSR #8]
  990. STRB R3,[R11,R3,LSR #8]
  991. STRB R4,[R11,R4,LSR #8]
  992. STRB R5,[R11,R5,LSR #8]
  993. STRB R6,[R11,R6,LSR #8]
  994. STRB R7,[R11,R7,LSR #8]
  995. STRB R8,[R11,R8,LSR #8]
  996. STRB R12,[R11,R12,LSR #8]
  997. STRB R14,[R11,R14,LSR #8]
  998. SUB R12,R9,R10
  999. CMP R12,#22<<2
  1000. BGE loop3
  1001. .skip1
  1002. CMP R12,#11<<2
  1003. BGE loop1
  1004. LDMIA R10!,{R0-R8,R14}
  1005. RSB R12,R12,#10<<2
  1006. ADD PC,PC,R12
  1007. MOV R0,R0
  1008. STRB R14,[R11,R14,LSR #8]
  1009. STRB R8,[R11,R8,LSR #8]
  1010. STRB R7,[R11,R7,LSR #8]
  1011. STRB R6,[R11,R6,LSR #8]
  1012. STRB R5,[R11,R5,LSR #8]
  1013. STRB R4,[R11,R4,LSR #8]
  1014. STRB R3,[R11,R3,LSR #8]
  1015. STRB R2,[R11,R2,LSR #8]
  1016. STRB R1,[R11,R1,LSR #8]
  1017. STRB R0,[R11,R0,LSR #8]
  1018.  
  1019. .offscrn
  1020. LDMFD R13!,{R1-R9,PC}^
  1021.  
  1022.  
  1023. .fsp1rightclip
  1024. CMP R7,#&10000
  1025. BGE fsp1leftclip
  1026. LDR R0,[R12,#v.hbytes]
  1027. MUL R1,R8,R0
  1028. SUB R1,R1,R0
  1029. B rightclipins
  1030.  
  1031. .rightclip
  1032. CMP R7,#&10000
  1033. BGE leftclip
  1034. LDR R0,[R12,#v.hbytes]
  1035. MUL R1,R8,R0    ;R8 = top line to plot
  1036.         ;R9 = bottom line to plot
  1037.                 ;R7 = positon to clip on right
  1038. .rightclipins
  1039. ADD R5,R7,R1    
  1040. MOV R14,R5,LSL #8  ;create threshold for clip
  1041. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1042. ADD R7,R10,R7
  1043. .loop5
  1044. MOV R6,R7        ; retrieve R6 from previous R7
  1045. ADD R8,R8,#1
  1046. LDR R7,[R10,R8,LSL #2]
  1047. ADD R7,R10,R7          ;translate to read positions
  1048. CMP R8,R9
  1049. LDMGTFD R13!,{R1-R9,PC}^  ;finished
  1050. CMP R6,R7        ; nothing on this line
  1051. ADDGE R14,R14,R0,LSL #8
  1052. BGE loop5
  1053.  
  1054. SUB R0,R7,R6
  1055. CMP R0,#12<<2
  1056. BLT rightskip
  1057.  
  1058. .loop6
  1059. LDMIA R6!,{R0-R5}
  1060. CMP R14,R0
  1061. STRGEB R0,[R11,R0,LSR #8]
  1062. CMP R14,R1
  1063. STRGEB R1,[R11,R1,LSR #8]
  1064. CMP R14,R2
  1065. STRGEB R2,[R11,R2,LSR #8]
  1066. CMP R14,R3
  1067. STRGEB R3,[R11,R3,LSR #8]
  1068. CMP R14,R4
  1069. STRGEB R4,[R11,R4,LSR #8]
  1070. CMP R14,R5
  1071. STRGEB R5,[R11,R5,LSR #8]
  1072. BLT rightclipnextline
  1073. .loop4
  1074. LDMIA R6!,{R0-R5}
  1075. CMP R14,R0
  1076. STRGEB R0,[R11,R0,LSR #8]
  1077. CMP R14,R1
  1078. STRGEB R1,[R11,R1,LSR #8]
  1079. CMP R14,R2
  1080. STRGEB R2,[R11,R2,LSR #8]
  1081. CMP R14,R3
  1082. STRGEB R3,[R11,R3,LSR #8]
  1083. CMP R14,R4
  1084. STRGEB R4,[R11,R4,LSR #8]
  1085. CMP R14,R5
  1086. STRGEB R5,[R11,R5,LSR #8]
  1087. BLT rightclipnextline
  1088. SUB R0,R7,R6
  1089. CMP R0,#12<<2
  1090. BGE loop6
  1091.  
  1092. .rightskip
  1093. CMP R0,#6<<2
  1094. BGE loop4
  1095. SUB R5,R7,R6
  1096. LDMIA R6!,{R0-R4}
  1097. RSBS R5,R5,#5<<2
  1098. ADDNE PC,PC,R5,LSL #1
  1099. MOV R0,R0
  1100. CMP R14,R4
  1101. STRGEB R4,[R11,R4,LSR #8]
  1102. CMP R14,R3
  1103. STRGEB R3,[R11,R3,LSR #8]
  1104. CMP R14,R2
  1105. STRGEB R2,[R11,R2,LSR #8]
  1106. CMP R14,R1
  1107. STRGEB R1,[R11,R1,LSR #8]
  1108. CMP R14,R0
  1109. STRGEB R0,[R11,R0,LSR #8]
  1110.  
  1111. .rightclipnextline
  1112. LDR R0,[R12,#v.hbytes]
  1113. ADD R14,R14,R0,LSL #8
  1114. B loop5
  1115.  
  1116.  
  1117. .fsp1leftclip
  1118. TST R7,#&FF
  1119. TSTEQ R7,#&FF<<8
  1120. BNE fsp1fullclip
  1121. LDR R0,[R12,#v.hbytes]
  1122. MUL R1,R8,R0
  1123. SUB R1,R1,R0
  1124. B leftclipins
  1125.  
  1126. .leftclip
  1127. TST R7,#&FF
  1128. TSTEQ R7,#&FF<<8
  1129. BNE fullclip
  1130. LDR R0,[R12,#v.hbytes]
  1131. MUL R1,R8,R0    ;R8 = top line to plot
  1132.         ;R9 = bottom line to plot
  1133.                 ;R7 = positon to clip on left
  1134. .leftclipins
  1135. MOV R7,R7,LSR #16
  1136. ADD R5,R7,R1    
  1137. MOV R14,R5,LSL #8  ;create threshold for clip
  1138. .loop7
  1139. LDR R6,[R10,R8,LSL #2]
  1140. ADD R6,R10,R6
  1141. ADD R8,R8,#1
  1142. LDR R7,[R10,R8,LSL #2]
  1143. ADD R7,R10,R7          ;translate to read positions
  1144. CMP R8,R9
  1145. LDMGTFD R13!,{R1-R9,PC}^  ;finished
  1146. CMP R6,R7        ; nothing on this line
  1147. ADDGE R14,R14,R0,LSL #8
  1148. BGE loop7
  1149.  
  1150. SUB R0,R7,R6
  1151. CMP R0,#12<<2
  1152. BLT leftskip
  1153.  
  1154. .loop8
  1155. LDMDB R7!,{R0-R5}
  1156. CMP R14,R0
  1157. STRLEB R0,[R11,R0,LSR #8]
  1158. CMP R14,R1
  1159. STRLEB R1,[R11,R1,LSR #8]
  1160. CMP R14,R2
  1161. STRLEB R2,[R11,R2,LSR #8]
  1162. CMP R14,R3
  1163. STRLEB R3,[R11,R3,LSR #8]
  1164. CMP R14,R4
  1165. STRLEB R4,[R11,R4,LSR #8]
  1166. CMP R14,R5
  1167. STRLEB R5,[R11,R5,LSR #8]
  1168. BGT leftclipnextline
  1169. .loop9
  1170. LDMDB R7!,{R0-R5}
  1171. CMP R14,R0
  1172. STRLEB R0,[R11,R0,LSR #8]
  1173. CMP R14,R1
  1174. STRLEB R1,[R11,R1,LSR #8]
  1175. CMP R14,R2
  1176. STRLEB R2,[R11,R2,LSR #8]
  1177. CMP R14,R3
  1178. STRLEB R3,[R11,R3,LSR #8]
  1179. CMP R14,R4
  1180. STRLEB R4,[R11,R4,LSR #8]
  1181. CMP R14,R5
  1182. STRLEB R5,[R11,R5,LSR #8]
  1183. BGT leftclipnextline
  1184. SUB R0,R7,R6
  1185. CMP R0,#12<<2
  1186. BGE loop8
  1187.  
  1188. .leftskip
  1189. CMP R0,#6<<2
  1190. BGE loop9
  1191. SUB R5,R7,R6
  1192. LDMDB R7!,{R0-R4}
  1193. RSBS R5,R5,#5<<2
  1194. ADDGT PC,PC,R5,LSL #1
  1195. MOV R0,R0
  1196. CMP R14,R0
  1197. STRLEB R0,[R11,R0,LSR #8]
  1198. CMP R14,R1
  1199. STRLEB R1,[R11,R1,LSR #8]
  1200. CMP R14,R2
  1201. STRLEB R2,[R11,R2,LSR #8]
  1202. CMP R14,R3
  1203. STRLEB R3,[R11,R3,LSR #8]
  1204. CMP R14,R4
  1205. STRLEB R4,[R11,R4,LSR #8]
  1206.  
  1207. .leftclipnextline
  1208. LDR R0,[R12,#v.hbytes]
  1209. ADD R14,R14,R0,LSL #8
  1210. B loop7
  1211.  
  1212. .fsp1fullclip
  1213. LDR R0,[R12,#v.hbytes]
  1214. MUL R1,R8,R0
  1215. SUB R1,R1,R0
  1216. B fullclipins
  1217.  
  1218. .fullclip
  1219. LDR R0,[R12,#v.hbytes]
  1220. MUL R1,R8,R0    ;R8 = top line to plot
  1221.         ;R9 = bottom line to plot
  1222.                 ;R7 = positon to clip on right
  1223. .fullclipins
  1224. MOV R6,R7,LSR #16
  1225. BIC R7,R7,#&FFFF<<16
  1226. ADD R5,R7,R1
  1227.     
  1228. MOV R14,R5,LSL #8  ;create threshold for clip
  1229. ADD R5,R6,R1
  1230. MOV R5,R5,LSL #8
  1231. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1232. ADD R7,R10,R7
  1233. .loop55
  1234. MOV R6,R7        ; retrieve R6 from previous R7
  1235. ADD R8,R8,#1
  1236. LDR R7,[R10,R8,LSL #2]
  1237. ADD R7,R10,R7          ;translate to read positions
  1238. CMP R8,R9
  1239. LDMGTFD R13!,{R1-R9,PC}^  ;finished
  1240. CMP R6,R7        ; nothing on this line
  1241. ADDGE R14,R14,R0,LSL #8
  1242. ADDGE R5,R5,R0,LSL #8
  1243. BGE loop55
  1244.  
  1245. SUB R0,R7,R6
  1246. CMP R0,#10<<2
  1247. BLT fullskip
  1248.  
  1249. .loop56
  1250. LDMIA R6!,{R0-R4}
  1251. CMP R14,R0
  1252. CMPGE R0,R5
  1253. STRGEB R0,[R11,R0,LSR #8]
  1254. CMP R14,R1
  1255. CMPGE R1,R5
  1256. STRGEB R1,[R11,R1,LSR #8]
  1257. CMP R14,R2
  1258. CMPGE R2,R5
  1259. STRGEB R2,[R11,R2,LSR #8]
  1260. CMP R14,R3
  1261. CMPGE R3,R5
  1262. STRGEB R3,[R11,R3,LSR #8]
  1263. CMP R14,R4
  1264. CMPGE R4,R5
  1265. STRGEB R4,[R11,R4,LSR #8]
  1266. BLT fullclipnextline
  1267. .loop54
  1268. LDMIA R6!,{R0-R4}
  1269. CMP R14,R0
  1270. CMPGE R0,R5
  1271. STRGEB R0,[R11,R0,LSR #8]
  1272. CMP R14,R1
  1273. CMPGE R1,R5
  1274. STRGEB R1,[R11,R1,LSR #8]
  1275. CMP R14,R2
  1276. CMPGE R2,R5
  1277. STRGEB R2,[R11,R2,LSR #8]
  1278. CMP R14,R3
  1279. CMPGE R3,R5
  1280. STRGEB R3,[R11,R3,LSR #8]
  1281. CMP R14,R4
  1282. CMPGE R4,R5
  1283. STRGEB R4,[R11,R4,LSR #8]
  1284. BLT fullclipnextline
  1285. SUB R0,R7,R6
  1286. CMP R0,#10<<2
  1287. BGE loop56
  1288.  
  1289. .fullskip
  1290. CMP R0,#5<<2
  1291. BGE loop54
  1292. SUB R4,R7,R6
  1293. LDMIA R6!,{R0-R3}
  1294.  
  1295. CMP R4,#4<<2
  1296. CMPGE R14,R3
  1297. CMPGE R3,R5
  1298. STRGEB R3,[R11,R3,LSR #8]
  1299. CMP R4,#3<<2
  1300. CMPGE R14,R2
  1301. CMPGE R2,R5
  1302. STRGEB R2,[R11,R2,LSR #8]
  1303. CMP R4,#2<<2
  1304. CMPGE R14,R1
  1305. CMPGE R1,R5
  1306. STRGEB R1,[R11,R1,LSR #8]
  1307. CMP R4,#1<<2
  1308. CMPGE R14,R0
  1309. CMPGE R0,R5
  1310. STRGEB R0,[R11,R0,LSR #8]
  1311.  
  1312. .fullclipnextline
  1313. LDR R0,[R12,#v.hbytes]
  1314. ADD R14,R14,R0,LSL #8
  1315. ADD R5,R5,R0,LSL #8
  1316. B loop55
  1317.  
  1318.  
  1319.  
  1320. .strblast
  1321. STMFD R13!,{R6-R11,R14}
  1322. ADD R10,R10,R0,LSR #8
  1323. CMP R7,#0
  1324. BNE strrightclip
  1325. LDMNEFD R13!,{R6-R11,PC}^
  1326. LDR R8,[R10,R8,LSL #2]
  1327. LDR R9,[R10,R9,LSL #2]
  1328. CMP R9,R8
  1329. LDMLEFD R13!,{R6-R11,PC}^
  1330. ADD R9,R10,R9
  1331. ADD R10,R10,R8
  1332. SUB R0,R9,R10
  1333. CMP R0,#4*32
  1334. BLT strskip
  1335.  
  1336. .loop36
  1337. LDMIA R10!,{R0-R7}
  1338. STR R1,[R11,R0,LSR #8]
  1339. STR R3,[R11,R2,LSR #8]
  1340. STR R5,[R11,R4,LSR #8]
  1341. STR R7,[R11,R6,LSR #8]
  1342. LDMIA R10!,{R0-R7}
  1343. STR R1,[R11,R0,LSR #8]
  1344. STR R3,[R11,R2,LSR #8]
  1345. STR R5,[R11,R4,LSR #8]
  1346. STR R7,[R11,R6,LSR #8]
  1347. .loop37
  1348. LDMIA R10!,{R0-R7}
  1349. STR R1,[R11,R0,LSR #8]
  1350. STR R3,[R11,R2,LSR #8]
  1351. STR R5,[R11,R4,LSR #8]
  1352. STR R7,[R11,R6,LSR #8]
  1353. LDMIA R10!,{R0-R7}
  1354. STR R1,[R11,R0,LSR #8]
  1355. STR R3,[R11,R2,LSR #8]
  1356. STR R5,[R11,R4,LSR #8]
  1357. STR R7,[R11,R6,LSR #8]
  1358. SUB R0,R9,R10
  1359. CMP R0,#4*32
  1360. BGE loop36
  1361. .strskip
  1362. CMP R0,#2*32
  1363. BGE loop37
  1364. CMP R0,#32
  1365. LDMGEIA R10!,{R0-R7}
  1366. STRGE R1,[R11,R0,LSR #8]
  1367. STRGE R3,[R11,R2,LSR #8]
  1368. STRGE R5,[R11,R4,LSR #8]
  1369. STRGE R7,[R11,R6,LSR #8]
  1370. SUB R9,R9,R10
  1371. LDMIA R10!,{R0-R7}
  1372. CMP R9,#8
  1373. STRGE R1,[R11,R0,LSR #8]
  1374. CMP R9,#16
  1375. STRGE R3,[R11,R2,LSR #8]
  1376. CMP R9,#24
  1377. STRGE R5,[R11,R4,LSR #8]
  1378. CMP R9,#32
  1379. STRGE R7,[R11,R6,LSR #8]
  1380. LDMFD R13!,{R6-R11,PC}^
  1381.  
  1382. .strrightclip
  1383. CMP R7,#&10000
  1384. BGE strleftclip
  1385. LDR R0,[R12,#v.hbytes]
  1386. MUL R1,R8,R0    ;R8 = top line to plot
  1387.         ;R9 = bottom line to plot
  1388.                 ;R7 = positon to clip on right
  1389. ADD R14,R7,R1
  1390. MOV R14,R14,LSL #8
  1391. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1392. ADD R7,R10,R7
  1393.  
  1394. .loop40
  1395. MOV R6,R7        ; retrieve R6 from previous R7
  1396. ADD R8,R8,#1
  1397. LDR R7,[R10,R8,LSL #2]
  1398. ADD R7,R10,R7           ;translate to a read position
  1399. CMP R8,R9
  1400. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1401. CMP R6,R7        ; nothing on this line
  1402. ADDGE R14,R14,R0,LSL #8
  1403. BGE loop40
  1404. SUB R0,R7,R6
  1405. CMP R0,#12*8
  1406. BLT strrightskip
  1407. .loop41
  1408. LDMIA R6!,{R0-R5}
  1409. CMP R0,R14
  1410. STRLT R1,[R11,R0,LSR #8]
  1411. CMP R2,R14
  1412. STRLT R3,[R11,R2,LSR #8]
  1413. CMP R4,R14
  1414. STRLT R5,[R11,R4,LSR #8]
  1415. LDMIA R6!,{R0-R5}
  1416. CMP R0,R14
  1417. STRLT R1,[R11,R0,LSR #8]
  1418. CMP R2,R14
  1419. STRLT R3,[R11,R2,LSR #8]
  1420. CMP R4,R14
  1421. STRLT R5,[R11,R4,LSR #8]
  1422. .loop42
  1423. LDMIA R6!,{R0-R5}
  1424. CMP R0,R14
  1425. STRLT R1,[R11,R0,LSR #8]
  1426. CMP R2,R14
  1427. STRLT R3,[R11,R2,LSR #8]
  1428. CMP R4,R14
  1429. STRLT R5,[R11,R4,LSR #8]
  1430. .loop43
  1431. LDMIA R6!,{R0-R5}
  1432. CMP R0,R14
  1433. STRLT R1,[R11,R0,LSR #8]
  1434. CMP R2,R14
  1435. STRLT R3,[R11,R2,LSR #8]
  1436. CMP R4,R14
  1437. STRLT R5,[R11,R4,LSR #8]
  1438. SUB R0,R7,R6
  1439. CMP R0,#12*8
  1440. BGE loop41
  1441.  
  1442. .strrightskip
  1443. CMP R0,#6*8
  1444. BGE loop42
  1445. CMP R0,#3*8
  1446. BGE loop43
  1447. RSB R5,R0,#2*8
  1448. LDMIA R6!,{R0-R3}
  1449. CMP R5,#1*8+1
  1450. CMPLT R0,R14
  1451. STRLT R1,[R11,R0,LSR #8]
  1452. CMPLT R5,#0*8+1
  1453. CMPLT R2,R14
  1454. STRLT R3,[R11,R2,LSR #8]
  1455. .strrightnextline
  1456. LDR R0,[R12,#v.hbytes]
  1457. ADD R14,R14,R0,LSL #8
  1458. B loop40
  1459.  
  1460.  
  1461. .strleftclip
  1462. TST R7,#&FF
  1463. TSTEQ R7,#&FF<<8
  1464. BNE strfullclip
  1465. LDR R0,[R12,#v.hbytes]
  1466. MUL R1,R8,R0    ;R8 = top line to plot
  1467.         ;R9 = bottom line to plot
  1468.                 ;R7 = positon to clip on right
  1469. MOV R7,R7,LSR #16
  1470. ADD R14,R7,R1
  1471. MOV R14,R14,LSL #8
  1472.  
  1473. .loop44
  1474. LDR R6,[R10,R8,LSL #2]        ; retrieve R6 from previous R7
  1475. ADD R6,R10,R6
  1476. ADD R8,R8,#1
  1477. LDR R7,[R10,R8,LSL #2]
  1478. ADD R7,R10,R7           ;translate to a read position
  1479. CMP R8,R9
  1480. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1481. CMP R6,R7        ; nothing on this line
  1482. ADDGE R14,R14,R0,LSL #8
  1483. BGE loop44
  1484. SUB R0,R7,R6
  1485. CMP R0,#12*8
  1486. BLT strleftskip
  1487. .loop45
  1488. LDMDB R7!,{R0-R5}
  1489. CMP R14,R0
  1490. STRLT R1,[R11,R0,LSR #8]
  1491. CMP R14,R2
  1492. STRLT R3,[R11,R2,LSR #8]
  1493. CMP R14,R4
  1494. STRLT R5,[R11,R4,LSR #8]
  1495. LDMDB R7!,{R0-R5}
  1496. CMP R14,R0
  1497. STRLT R1,[R11,R0,LSR #8]
  1498. CMP R14,R2
  1499. STRLT R3,[R11,R2,LSR #8]
  1500. CMP R14,R4
  1501. STRLT R5,[R11,R4,LSR #8]
  1502. .loop46
  1503. LDMDB R7!,{R0-R5}
  1504. CMP R14,R0
  1505. STRLT R1,[R11,R0,LSR #8]
  1506. CMP R14,R2
  1507. STRLT R3,[R11,R2,LSR #8]
  1508. CMP R14,R4
  1509. STRLT R5,[R11,R4,LSR #8]
  1510. .loop47
  1511. LDMDB R7!,{R0-R5}
  1512. CMP R14,R0
  1513. STRLT R1,[R11,R0,LSR #8]
  1514. CMP R14,R2
  1515. STRLT R3,[R11,R2,LSR #8]
  1516. CMP R14,R4
  1517. STRLT R5,[R11,R4,LSR #8]
  1518. SUB R0,R7,R6
  1519. CMP R0,#12*8
  1520. BGE loop45
  1521.  
  1522. .strleftskip
  1523. CMP R0,#6*8
  1524. BGE loop46
  1525. CMP R0,#3*8
  1526. BGE loop47
  1527. RSB R5,R0,#2*8
  1528. LDMDB R7!,{R0-R3}
  1529. CMP R5,#1*8+1
  1530. CMPLT R14,R2
  1531. STRLT R3,[R11,R2,LSR #8]
  1532. CMPLT R5,#0*8+1
  1533. CMPLT R14,R0
  1534. STRLT R1,[R11,R0,LSR #8]
  1535. .strleftnextline
  1536. LDR R0,[R12,#v.hbytes]
  1537. ADD R14,R14,R0,LSL #8
  1538. B loop44
  1539.  
  1540. .strfullclip
  1541. MOV R6,R7,LSR #16
  1542. BIC R7,R7,#&FFFF<<16
  1543. LDR R0,[R12,#v.hbytes]
  1544. MUL R1,R8,R0    ;R8 = top line to plot
  1545.         ;R9 = bottom line to plot
  1546.                 ;R7 = positon to clip on right
  1547. ADD R14,R7,R1
  1548. ADD R5,R6,R1
  1549. MOV R14,R14,LSL #8
  1550. MOV R5,R5,LSL #8
  1551. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1552. ADD R7,R10,R7
  1553.  
  1554. .loop52
  1555. MOV R6,R7        ; retrieve R6 from previous R7
  1556. ADD R8,R8,#1
  1557. LDR R7,[R10,R8,LSL #2]
  1558. ADD R7,R10,R7           ;translate to a read position
  1559. CMP R8,R9
  1560. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1561. CMP R6,R7        ; nothing on this line
  1562. ADDGE R14,R14,R0,LSL #8
  1563. ADDGE R5,R5,R0,LSL #8
  1564. BGE loop52
  1565. SUBS R0,R7,R6
  1566. CMP R0,#4*4
  1567. BLT strfullskip
  1568. .loop53
  1569.  
  1570. LDMIA R6!,{R0-R3}
  1571. CMP R0,R14
  1572. CMPLT R5,R0
  1573. STRLT R1,[R11,R0,LSR #8]
  1574. CMP R2,R14
  1575. CMPLT R5,R2
  1576. STRLT R3,[R11,R2,LSR #8]
  1577. SUB R0,R7,R6
  1578. CMP R0,#4*4
  1579. BGE loop53
  1580.  
  1581. .strfullskip
  1582. CMP R0,#2*4
  1583. BLT strfullnextline
  1584. LDMIA R6!,{R0-R1}
  1585. CMP R0,R14
  1586. CMPLT R5,R0
  1587. STRLT R1,[R11,R0,LSR #8]
  1588.  
  1589. .strfullnextline
  1590. LDR R0,[R12,#v.hbytes]
  1591. ADD R14,R14,R0,LSL #8
  1592. ADD R5,R5,R0,LSL #8
  1593. B loop52
  1594.  
  1595.  
  1596. .stmblast
  1597. STMFD R13!,{R6-R11,R14}
  1598. ADD R10,R10,R0,LSR #8
  1599. CMP R7,#0
  1600. BNE stmrightclip
  1601. LDR R8,[R10,R8,LSL #2]
  1602. LDR R9,[R10,R9,LSL #2]
  1603. CMP R9,R8
  1604. LDMLEFD R13!,{R6-R11,PC}^
  1605. ADD R9,R10,R9
  1606. ADD R10,R10,R8
  1607. SUB R0,R9,R10
  1608. CMP R0,#4*32
  1609. BLT stmskip
  1610. .loop24
  1611. LDMIA R10,{R0-R7}
  1612. AND R14,R0,#&C
  1613. ADD R10,R10,R14,LSL #2
  1614. ADD R0,R11,R0,LSR #8
  1615. CMP R14,#8
  1616. STMEQIA R0,{R1-R7}
  1617. STMNEIA R0,{R1-R3}
  1618. LDMIA R10,{R0-R7}
  1619. AND R14,R0,#&C
  1620. ADD R10,R10,R14,LSL #2
  1621. ADD R0,R11,R0,LSR #8
  1622. CMP R14,#8
  1623. STMEQIA R0,{R1-R7}
  1624. STMNEIA R0,{R1-R3}
  1625. .loop28
  1626. LDMIA R10,{R0-R7}
  1627. AND R14,R0,#&C
  1628. ADD R10,R10,R14,LSL #2
  1629. ADD R0,R11,R0,LSR #8
  1630. CMP R14,#8
  1631. STMEQIA R0,{R1-R7}
  1632. STMNEIA R0,{R1-R3}
  1633. LDMIA R10,{R0-R7}
  1634. AND R14,R0,#&C
  1635. ADD R10,R10,R14,LSL #2
  1636. ADD R0,R11,R0,LSR #8
  1637. CMP R14,#8
  1638. STMEQIA R0,{R1-R7}
  1639. STMNEIA R0,{R1-R3}
  1640. SUB R0,R9,R10
  1641. CMP R0,#4*32
  1642. BGE loop24
  1643. CMP R0,#2*32
  1644. BGE loop28
  1645. .stmskip
  1646. .loop27
  1647. CMP R10,R9
  1648. LDMGEFD R13!,{R6-R11,PC}^
  1649. LDMIA R10,{R0-R7}
  1650. AND R14,R0,#&C
  1651. ADD R10,R10,R14,LSL #2
  1652. ADD R0,R11,R0,LSR #8
  1653. CMP R14,#8
  1654. STMEQIA R0,{R1-R7}
  1655. STMNEIA R0,{R1-R3}
  1656. CMP R10,R9
  1657. LDMGEFD R13!,{R6-R11,PC}^
  1658. LDMIA R10,{R0-R7}
  1659. AND R14,R0,#&C
  1660. ADD R10,R10,R14,LSL #2
  1661. ADD R0,R11,R0,LSR #8
  1662. CMP R14,#8
  1663. STMEQIA R0,{R1-R7}
  1664. STMNEIA R0,{R1-R3}
  1665. CMP R10,R9
  1666. LDMGEFD R13!,{R6-R11,PC}^
  1667. LDMIA R10,{R0-R7}
  1668. AND R14,R0,#&C
  1669. ADD R10,R10,R14,LSL #2
  1670. ADD R0,R11,R0,LSR #8
  1671. CMP R14,#8
  1672. STMEQIA R0,{R1-R7}
  1673. STMNEIA R0,{R1-R3}
  1674. CMP R10,R9
  1675. LDMGEFD R13!,{R6-R11,PC}^
  1676. LDMIA R10,{R0-R7}
  1677. AND R14,R0,#&C
  1678. ADD R10,R10,R14,LSL #2
  1679. ADD R0,R11,R0,LSR #8
  1680. CMP R14,#8
  1681. STMEQIA R0,{R1-R7}
  1682. STMNEIA R0,{R1-R3}
  1683. B loop27
  1684.  
  1685. .stmrightclip
  1686. CMP R7,#&10000
  1687. BGE stmleftclip
  1688. LDR R0,[R12,#v.hbytes]
  1689. MUL R1,R8,R0    ;R8 = top line to plot
  1690.         ;R9 = bottom line to plot
  1691.                 ;R7 = positon to clip on right
  1692. ADD R5,R7,R1
  1693. BIC R5,R5,#3    ;word align
  1694. ADD R14,R11,R5      ;create threshold for clip
  1695. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1696. ADD R7,R10,R7
  1697.  
  1698. .loop30
  1699. MOV R6,R7        ; retrieve R6 from previous R7
  1700. ADD R8,R8,#1
  1701. LDR R7,[R10,R8,LSL #2]
  1702. ADD R7,R10,R7           ;translate to a read position
  1703. CMP R8,R9
  1704. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1705. CMP R6,R7        ; nothing on this line
  1706. ADDGE R14,R14,R0
  1707. BGE loop30
  1708. .loop31
  1709. SUB R0,R7,R6
  1710. CMP R0,#0
  1711. BLE stmrightnextline
  1712. LDMIA R6!,{R0-R3}
  1713. AND R5,R0,#&C
  1714. ADD R0,R11,R0,LSR #8
  1715. SUBS R4,R14,R0
  1716. BMI loop31
  1717. CMP R5,#8
  1718. BEQ stmright8
  1719. CMP R4,#8
  1720. STMGTIA R0,{R1-R3}
  1721. BGT loop31
  1722. CMP R4,#4
  1723. STMGTIA R0,{R1-R2}
  1724. BGT loop31
  1725. CMP R4,#0
  1726. STRGT R1,[R0]
  1727. B loop31
  1728.  
  1729. .stmright8
  1730. CMP R4,#28
  1731. MOVGT R4,#28
  1732. ADD R4,R4,#3
  1733. AND R4,R4,#28
  1734. RSBS R4,R4,#28
  1735. ADDNE PC,PC,R4,LSL #2
  1736. MOV R0,R0
  1737.  
  1738. STMIA R0!,{R1-R3}
  1739. LDMIA R6!,{R1-R4}
  1740. STMIA R0,{R1-R4}
  1741. B loop31
  1742. STMIA R0!,{R1-R3}
  1743. LDMIA R6!,{R1-R4}
  1744. STMIA R0,{R1-R3}
  1745. B loop31
  1746. STMIA R0!,{R1-R3}
  1747. LDMIA R6!,{R1-R4}
  1748. STMIA R0,{R1-R2}
  1749. B loop31
  1750. STMIA R0!,{R1-R3}
  1751. LDMIA R6!,{R1-R4}
  1752. STR R1,[R0]
  1753. B loop31
  1754. STMIA R0!,{R1-R3}
  1755. ADD R6,R6,#16
  1756. B loop31
  1757. DCD &E6000090
  1758. STMIA R0!,{R1-R2}
  1759. ADD R6,R6,#16
  1760. B loop31
  1761. DCD &E6000090
  1762. STR R1,[R0]
  1763. ADD R6,R6,#16
  1764. B loop31
  1765. DCD &E6000090
  1766. ADD R6,R6,#16
  1767. B loop31
  1768.  
  1769. .stmrightnextline
  1770. LDR R0,[R12,#v.hbytes]
  1771. ADD R14,R14,R0
  1772. B loop30
  1773.  
  1774. .stmleftclip
  1775. TST R7,#&FF
  1776. TSTEQ R7,#&FF<<8
  1777. BNE stmfullclip
  1778. LDR R0,[R12,#v.hbytes]
  1779. MUL R1,R8,R0    ;R8 = top line to plot
  1780.         ;R9 = bottom line to plot
  1781.                 ;R7 = positon to clip on left
  1782. MOV R7,R7,ASR #16
  1783. ADD R7,R7,R1
  1784. ADD R14,R11,R7          ;create threshold for clip
  1785. LDR R7,[R10,R8,LSL #2]  ;indirect via vertical clipping offsets
  1786. ADD R7,R10,R7
  1787.  
  1788. .loop34
  1789. MOV R6,R7        ; retrieve R6 from previous R7
  1790. ADD R8,R8,#1
  1791. LDR R7,[R10,R8,LSL #2]
  1792. ADD R7,R10,R7           ;translate to a read position
  1793. CMP R8,R9
  1794. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1795. CMP R6,R7        ; nothing on this line
  1796. ADDGE R14,R14,R0
  1797. BGE loop34
  1798. .loop35
  1799. SUB R0,R7,R6
  1800. CMP R0,#0
  1801. BLE stmleftnextline
  1802. LDMIA R6!,{R0-R3}
  1803. AND R5,R0,#&C
  1804. CMP R5,#4
  1805. ADD R0,R11,R0,LSR #8
  1806. BGT stmleft8
  1807.  
  1808. CMP R0,R14
  1809. STMGEIA R0!,{R1-R3}
  1810. BGE loop35
  1811. SUB R5,R14,#8
  1812. CMP R0,R5
  1813. STRGE R3,[R0,#8]
  1814. SUB R5,R14,#4 
  1815. CMP R0,R5
  1816. STRGE R2,[R0,#4]
  1817. B loop35
  1818.  
  1819. .stmleft8
  1820. CMP R0,R14
  1821. STMGEIA R0!,{R1-R3}
  1822. LDMGEIA R6!,{R1-R4}
  1823. STMGEIA R0,{R1-R4}
  1824. BGE loop35
  1825. SUB R5,R14,#8
  1826. CMP R0,R5
  1827. STRGE R3,[R0,#8]
  1828. SUB R5,R14,#4
  1829. CMPGE R0,R5
  1830. STRGE R2,[R0,#4]     ;Will never have to store R1 here
  1831. LDMIA R6!,{R1-R4}
  1832. ADD R0,R0,#12
  1833. STMGEIA R0!,{R1-R4}
  1834. BGE loop35
  1835. SUB R5,R14,#12
  1836. CMP R0,R5
  1837. STRGE R4,[R0,#12]
  1838. SUB R5,R14,#8
  1839. CMP R0,R5
  1840. STRGE R3,[R0,#8]
  1841. SUB R5,R14,#4
  1842. CMPGE R0,R5
  1843. STRGE R2,[R0,#4]
  1844. CMPGE R0,R14
  1845. STRGE R1,[R0,#0]
  1846. B loop35
  1847. .stmleftnextline
  1848. LDR R0,[R12,#v.hbytes]
  1849. ADD R14,R14,R0
  1850. B loop34
  1851.  
  1852. .stmfullclip
  1853. MOV R6,R7,LSR #16
  1854. BIC R7,R7,#&FFFF<<16
  1855. LDR R0,[R12,#v.hbytes]
  1856. MUL R1,R8,R0    ;R8 = top line to plot
  1857.         ;R9 = bottom line to plot
  1858.                 ;R7 = positon to clip on right
  1859. ADD R5,R7,R1
  1860. BIC R5,R5,#3    ;word align
  1861. ADD R14,R11,R5      ;create threshold for clip
  1862. ADD R5,R6,R1
  1863. SUB R5,R5,#1
  1864. BIC R5,R5,#3
  1865. ADD R5,R11,R5
  1866.  
  1867. LDR R7,[R10,R8,LSL #2] ;indirect via vertical clipping offsets
  1868. ADD R7,R10,R7
  1869.  
  1870. .loop50
  1871. MOV R6,R7        ; retrieve R6 from previous R7
  1872. ADD R8,R8,#1
  1873. LDR R7,[R10,R8,LSL #2]
  1874. ADD R7,R10,R7           ;translate to a read position
  1875. CMP R8,R9
  1876. LDMGTFD R13!,{R6-R11,PC}^  ;finished
  1877. CMP R6,R7        ; nothing on this line
  1878. ADDGE R14,R14,R0
  1879. ADDGE R5,R5,R0
  1880. BGE loop50
  1881. .loop51
  1882. SUB R0,R7,R6
  1883. CMP R0,#0
  1884. BLE stmfullnextline
  1885. LDMIA R6!,{R0-R3}
  1886. AND R4,R0,#&C
  1887. ADD R0,R11,R0,LSR #8
  1888. CMP R0,R14
  1889. CMPLT R5,R0
  1890. STRLT R1,[R0]
  1891. ADD R0,R0,#4
  1892. CMP R0,R14
  1893. CMPLT R5,R0
  1894. STRLT R2,[R0]
  1895. ADD R0,R0,#4
  1896. CMP R0,R14
  1897. CMPLT R5,R0
  1898. STRLT R3,[R0]
  1899. ADD R0,R0,#4
  1900. CMP R4,#4
  1901. BLE loop51
  1902. LDMIA R6!,{R1-R4}
  1903. CMP R0,R14
  1904. CMPLT R5,R0
  1905. STRLT R1,[R0]
  1906. ADD R0,R0,#4
  1907. CMP R0,R14
  1908. CMPLT R5,R0
  1909. STRLT R2,[R0]
  1910. ADD R0,R0,#4
  1911. CMP R0,R14
  1912. CMPLT R5,R0
  1913. STRLT R3,[R0]
  1914. ADD R0,R0,#4
  1915. CMP R0,R14
  1916. CMPLT R5,R0
  1917. STRLT R4,[R0]
  1918. B loop51
  1919. .stmfullnextline
  1920. LDR R0,[R12,#v.hbytes]
  1921. ADD R5,R5,R0
  1922. ADD R14,R14,R0
  1923. B loop50
  1924.  
  1925.  
  1926. .err
  1927. ORR R14,R14,#1<<28
  1928. MOVS PC,R14
  1929.  
  1930. .badfileerr
  1931. ADR R0,badfileerrtext
  1932. B err
  1933. .badfileerrtext
  1934. DCD &809D20
  1935. DCB "FastSpr : File not found"
  1936. DCB 0
  1937. ALIGN
  1938. .badfileerr2
  1939. ADR R0,badfileerrtext2
  1940. B err
  1941. .badfileerrtext2
  1942. DCD &809D21
  1943. DCB "FastSpr : File not suitable for this module"
  1944. DCB 0
  1945. ALIGN
  1946. .nospaceerr
  1947. ADR R0,nospaceerrtext
  1948. B err
  1949. .nospaceerrtext
  1950. DCD &809D22
  1951. DCB "FastSpr : No room in RMA for file"
  1952. DCB 0
  1953. ALIGN
  1954. .nodataerr
  1955. ADR R0,nodatatext
  1956. B err
  1957. .nodatatext
  1958. DCD &809D23
  1959. DCB "FastSpr : Attempt to plot with no valid spritefile"
  1960. DCB 0
  1961. ALIGN
  1962. .toobigerr
  1963. ADR R0,toobigtext
  1964. B err
  1965. .toobigtext
  1966. DCD &809D24
  1967. DCB "FastSpr : Sprite number out of range"
  1968. DCB 0
  1969. ALIGN
  1970. .toowideerr
  1971. ADR R0,toowideerrtext
  1972. B err
  1973. .toowideerrtext
  1974. DCD &809D25
  1975. DCB "FastSpr : Clip window too wide"
  1976. DCB 0
  1977. ALIGN
  1978. .badwindow
  1979. ADR R0,badwindowtext
  1980. B err
  1981. .badwindowtext
  1982. DCD &809D26
  1983. DCB "FastSpr : Bad clipping window"
  1984. DCB 0
  1985. ALIGN
  1986. .unknownswi
  1987. ADR R0,unknownswitext
  1988. B err
  1989. .unknownswitext
  1990. DCD &809D27
  1991. DCB "FastSpr : Unknown FastSpr SWI"
  1992. DCB 0
  1993. ALIGN
  1994.