Home » Archimedes archive » Micro User » MU 1992-06.adf » PD » !FunkyDemo/!RunMain
!FunkyDemo/!RunMain
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 » Micro User » MU 1992-06.adf » PD |
| Filename: | !FunkyDemo/!RunMain |
| Read OK: | ✔ |
| File size: | 1250F bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > !FunkyDemo.!RunMain
20REM (C) JSG 1992
30
40IF FALSE THEN
50 VOICES 8
60 MODE12
70 COLOUR 4,0,0,0
80 COLOUR 4+128
90 CLS
100 *SPEAKER OFF
110 *KEY 1 " |MTWINO8|M"
120 VDU 19,0,24,32,32,32
130ENDIF
140
150DIM code 32768
160DIM sprites 81920
170DIM plotspriteacode(7,3)
180DIM rgval(2),bval(2)
190
200rgval(0)=0
210rgval(1)=0.6
220rgval(2)=1
230bval(0)=0
240bval(1)=0.3
250bval(2)=0.5
260xorigin=320
270yorigin=64
280
290cos%=32768*COS(0.12)+0.5
300sin%=32768*SIN(0.12)+0.5
310
320PROCassemble
330
340OSCLI"LOAD <Funky$Dir>.Sprites "+STR$~sprites
350SYS"Tracker_TuneInfo" TO A
360IF A=0 THEN
370 *RMAFree 300K
380 SYS"Tracker_Load","<Funky$Dir>.GtRdyFrThs"
390ENDIF
400
410COLOUR 3,255,255,255
420GCOL 0
430FOR N%=0 TO 127
440 A%=startab!(N%<<2)
450 POINT (A% MOD 320)*4,1023-(A% DIV 320)*4
460 POINT (A% MOD 320)*4+2,1023-(A% DIV 320)*4
470NEXT
480
490FOR N=0 TO 15
500 COLOUR 7,192-N*12,192-N*12,192-N*12
510 COLOUR 0,0,0,N*12
520 COLOUR 3,192-N*12,192-N*12,192-N*12
530 *FX 19
540 *FX 19
550 *FX 19
560NEXT N
570
580!curplotbank=1
590COLOUR 0,0,0,192
600COLOUR 1,192,0,0
610COLOUR 2,192,96,0
620COLOUR 3,64,128,48
630FOR C2%=1 TO 2
640 COLOUR 12+C2%,127*bval(C2%),127*bval(C2%),255*bval(C2%)
650NEXT
660COLOUR 15,255,255,255
670COLOUR 15
680PROCsetpalette(B0%,B1%)
690
700FOR N%=0 TO 31
710 SYS"Tracker_ReadSampleTable",N%+1 TO ,,,,,,sampleaddrtab!(N%<<2)
720NEXT
730SYS"Tracker_Stereo",1
740
750A%=torsotrans:B%=spin1:C%=torsotrans
760CALL multiply:CALL multiply:CALL multiply
770CALL multiply
780A%=torsotrans:B%=spin3:C%=torsotrans
790CALL multiply:CALL multiply:CALL multiply
800
810E%=0
820COLOUR 15
830
840*FX 176,2,0
850SYS"Tracker_SetPos",0,0
860SYS"Tracker_Play"
870
880REPEAT
890 CALL changeframe
900 CALL clearscreen
910 CALL control
920 CALL update
930 CALL drawgraphs
940 CALL drawperson
950 IF RND(12)=1 THEN !curcol1=RND(10)-1:!curcol2=RND(10)-1
960 IF RND(6)=1 THEN graphpostab!(RND(4)*48-48+45)=RND(6)-1
970 MOUSE X%,Y%,B%
980 IF B% AND 2 THEN
990 *PLAYPAUSE
1000 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=0
1010 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=2
1020 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=0
1030 *PLAYSTART
1040 ENDIF
1050UNTIL B% AND 4
1060
1070SYS"Tracker_Pause"
1080MODE0
1090END
1100
1110DEF PROCsetpalette(B0%,B1%)
1120 FOR C1%=0 TO 2
1130 FOR C0%=0 TO 2
1140 BR%=(B0%*rgval(C0%)+B1%*rgval(C1%))/2
1150 COLOUR 4+3*C1%+C0%,BR%,BR%,BR%
1160 NEXT
1170 NEXT
1180ENDPROC
1190
1200DEF FNROUND(A)
1210=A+0.5*SGN(A)
1220
1230DEF PROCassemble
1240 FOR pass%=0 TO 2 STEP 2
1250 P%=code
1260 [OPT pass%
1270
1280 .currepqind
1290 EQUD currepq-P%
1300
1310 .plotscreenind0
1320 EQUD plotscreenbase-P%
1330
1340 \ Plot Sprite size a (32*n mode 12) with implicit mask but no clipping
1350 \ Value 0 -> no plot
1360 \ 1-3 -> (illegal do not use)
1370 \ 4-15 -> plot pixel
1380 \ R0 = X pos of centre (internal)
1390 \ R1 = Y pos of centre (internal)
1400 \ R2 = number of lines in sprite (n)
1410 \ R3 = address of sprite data (word aligned)
1420 .plotspritea
1430 STMFD R13!,{R0-R12,R14}
1440
1450 ADR R10,currepqind
1460 LDR R12,[R10]
1470 LDR R10,[R12,R10]
1480 CMP R10,#1
1490 BEQ psa1
1500 CMP R10,#2
1510 BEQ psa2
1520 CMP R10,#3
1530 BEQ psa3
1540
1550 MOV R10,R3 \ R10 = address of sprite data
1560
1570 MOV R11,R2 \ R11 = number of lines
1580
1590 SUB R0,R0,#16
1600 SUB R1,R1,R11,ASR #1 \ get top left corner
1610
1620 CMN R0,#1
1630 CMNGT R1,R11
1640 LDMLEFD R13!,{R0-R12,PC}^
1650 CMP R0,#640-32
1660 CMPLE R1,#256-1
1670 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
1680
1690 CMP R1,#0
1700 ADDLT R11,R11,R1
1710 SUBLT R10,R10,R1,LSL #4
1720 MOVLT R1,#0 \ trim top
1730
1740 RSB R4,R1,#256
1750 CMP R11,R4
1760 MOVGT R11,R4 \ trim bottom
1770
1780 ADR R9,plotscreenind0
1790 LDR R12,[R9]
1800 LDR R9,[R9,R12]
1810 ADD R9,R9,R1,LSL #8
1820 ADD R9,R9,R1,LSL #6
1830 BIC R1,R0,#7
1840 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
1850
1860 MOV R12,#%1000
1870 ORR R12,R12,R12,LSL #16
1880 ORR R12,R12,R12,LSL #8
1890 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit
1900
1910 AND R1,R0,#7
1920 ADR R0,caselist
1930 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
1940 ADR R1,base
1950 ADD PC,R0,R1
1960
1970 .caselist
1980 ]
1990 FOR N%=0 TO 7
2000 [OPT pass%
2010 EQUD plotspriteacode(N%,0)-base
2020 ]
2030 NEXT N%
2040 [OPT pass%
2050 .base
2060 ]
2070 FOR N%=0 TO 7
2080 shiftleft = N%*4
2090 shiftright = 32-N%*4
2100 [OPT pass% \ do 8 compilations
2110
2120 .plotspriteacode(N%,0) \ doubles as loop start
2130 LDMIA R10!,{R0-R3}
2140
2150 LDMIA R9,{R4-R8}
2160
2170 ]
2180 FOR M%=0 TO 3
2190 Rdata = M%
2200 Rcurword = M%+4
2210 Rnextword = M%+5
2220 [OPT pass% \ for four words...
2230
2240 ORR R14,Rdata,Rdata,LSL #1
2250 AND R14,R12,R14
2260 ORR R14,R14,R14,LSR #2
2270 ORR R14,R14,R14,LSR #1
2280 BIC Rcurword,Rcurword,R14,LSL #shiftleft
2290 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft
2300 BIC Rnextword,Rnextword,R14,LSR #shiftright
2310 ORR Rnextword,Rnextword,Rdata,LSR #shiftright
2320 ]
2330 NEXT M%
2340 [OPT pass%
2350
2360 STMIA R9,{R4-R8}
2370 ADD R9,R9,#320
2380
2390 SUBS R11,R11,#1
2400 BGT plotspriteacode(N%,0)
2410
2420 LDMFD R13!,{R0-R12,PC}^
2430
2440 ]
2450 NEXT N%
2460 [OPT pass%
2470
2480 .plotscreenind1
2490 EQUD plotscreenbase-P%
2500
2510 .psa1
2520 MOV R10,R3 \ R10 = address of sprite data
2530
2540 MOV R11,R2,ASR #1 \ R11 = number of lines
2550
2560 SUB R0,R0,#16
2570 MOV R1,R1,ASR #1
2580 SUB R1,R1,R11,ASR #1 \ get top left corner
2590
2600 CMN R0,#1
2610 CMNGT R1,R11
2620 LDMLEFD R13!,{R0-R12,PC}^
2630 CMP R0,#640-32
2640 CMPLE R1,#256-1
2650 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
2660
2670 CMP R1,#0
2680 ADDLT R11,R11,R1
2690 SUBLT R10,R10,R1,LSL #4
2700 MOVLT R1,#0 \ trim top
2710
2720 RSB R4,R1,#256
2730 CMP R11,R4
2740 MOVGT R11,R4 \ trim bottom
2750
2760 ADR R9,plotscreenind1
2770 LDR R12,[R9]
2780 LDR R9,[R9,R12]
2790 ADD R9,R9,R1,LSL #8
2800 ADD R9,R9,R1,LSL #6
2810 BIC R1,R0,#7
2820 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
2830
2840 MOV R12,#%1000
2850 ORR R12,R12,R12,LSL #16
2860 ORR R12,R12,R12,LSL #8
2870 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit
2880
2890 AND R1,R0,#7
2900 ADR R0,caselist1
2910 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
2920 ADR R1,base1
2930 ADD PC,R0,R1
2940
2950 .caselist1
2960 ]
2970 FOR N%=0 TO 7
2980 [OPT pass%
2990 EQUD plotspriteacode(N%,1)-base1
3000 ]
3010 NEXT N%
3020 [OPT pass%
3030 .base1
3040 ]
3050 FOR N%=0 TO 7
3060 shiftleft = N%*4
3070 shiftright = 32-N%*4
3080 [OPT pass% \ do 8 compilations
3090
3100 .plotspriteacode(N%,1) \ doubles as loop start
3110 LDMIA R10,{R0-R3}
3120 ADD R10,R10,#32
3130
3140 LDMIA R9,{R4-R8}
3150
3160 ]
3170 FOR M%=0 TO 3
3180 Rdata = M%
3190 Rcurword = M%+4
3200 Rnextword = M%+5
3210 [OPT pass% \ for four words...
3220
3230 ORR R14,Rdata,Rdata,LSL #1
3240 AND R14,R12,R14
3250 ORR R14,R14,R14,LSR #2
3260 ORR R14,R14,R14,LSR #1
3270 BIC Rcurword,Rcurword,R14,LSL #shiftleft
3280 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft
3290 BIC Rnextword,Rnextword,R14,LSR #shiftright
3300 ORR Rnextword,Rnextword,Rdata,LSR #shiftright
3310 ]
3320 NEXT M%
3330 [OPT pass%
3340
3350 STMIA R9,{R4-R8}
3360 ADD R9,R9,#320
3370
3380 SUBS R11,R11,#1
3390 BGT plotspriteacode(N%,1)
3400
3410 LDMFD R13!,{R0-R12,PC}^
3420
3430 ]
3440 NEXT N%
3450 [OPT pass%
3460
3470 .plotscreenind
3480 EQUD plotscreenbase-P%
3490
3500 .psa2
3510 MOV R10,R3 \ R10 = address of sprite data
3520
3530 MOV R11,R2,ASR #2 \ R11 = number of lines
3540
3550 SUB R0,R0,#16
3560 SUB R0,R0,#160
3570 MOV R1,R1,ASR #2
3580 SUB R1,R1,R11,ASR #1 \ get top left corner
3590
3600 CMN R0,#1
3610 CMNGT R1,R11
3620 LDMLEFD R13!,{R0-R12,PC}^
3630 CMP R0,#640-32
3640 CMPLE R1,#256-1
3650 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
3660
3670 CMP R1,#0
3680 ADDLT R11,R11,R1
3690 SUBLT R10,R10,R1,LSL #4
3700 MOVLT R1,#0 \ trim top
3710
3720 RSB R4,R1,#256
3730 CMP R11,R4
3740 MOVGT R11,R4 \ trim bottom
3750
3760 ADR R9,plotscreenind
3770 LDR R12,[R9]
3780 LDR R9,[R9,R12]
3790 ADD R9,R9,R1,LSL #8
3800 ADD R9,R9,R1,LSL #6
3810 BIC R1,R0,#7
3820 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
3830
3840 MOV R12,#%1000
3850 ORR R12,R12,R12,LSL #16
3860 ORR R12,R12,R12,LSL #8
3870 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit
3880
3890 AND R1,R0,#7
3900 ADR R0,caselist2
3910 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
3920 ADR R1,base2
3930 ADD PC,R0,R1
3940
3950 .caselist2
3960 ]
3970 FOR N%=0 TO 7
3980 [OPT pass%
3990 EQUD plotspriteacode(N%,2)-base2
4000 ]
4010 NEXT N%
4020 [OPT pass%
4030 .base2
4040 ]
4050 FOR N%=0 TO 7
4060 shiftleft = N%*4
4070 shiftright = 32-N%*4
4080 [OPT pass% \ do 8 compilations
4090
4100 .plotspriteacode(N%,2) \ doubles as loop start
4110 LDMIA R10,{R0-R3}
4120 ADD R10,R10,#64
4130 LDMIA R9,{R4-R8}
4140
4150 ]
4160 FOR M%=0 TO 3
4170 Rdata = M%
4180 Rcurword = M%+4
4190 Rnextword = M%+5
4200 [OPT pass% \ for four words...
4210
4220 ORR R14,Rdata,Rdata,LSL #1
4230 AND R14,R12,R14
4240 ORR R14,R14,R14,LSR #2
4250 ORR R14,R14,R14,LSR #1
4260 BIC Rcurword,Rcurword,R14,LSL #shiftleft
4270 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft
4280 BIC Rnextword,Rnextword,R14,LSR #shiftright
4290 ORR Rnextword,Rnextword,Rdata,LSR #shiftright
4300 ]
4310 NEXT M%
4320 [OPT pass%
4330
4340 STMIA R9,{R4-R8}
4350 ADD R9,R9,#320
4360
4370 SUBS R11,R11,#1
4380 BGT plotspriteacode(N%,2)
4390
4400 LDMFD R13!,{R0-R12,PC}^
4410
4420 ]
4430 NEXT N%
4440 [OPT pass%
4450
4460 .psa3
4470 MOV R10,R3 \ R10 = address of sprite data
4480
4490 MOV R11,R2,ASR #3 \ R11 = number of lines
4500
4510 SUB R0,R0,#16
4520 SUB R0,R0,#160
4530 MOV R0,R0,ASR #1
4540 MOV R1,R1,ASR #3
4550 SUB R1,R1,R11,ASR #1 \ get top left corner
4560
4570 CMN R0,#1
4580 CMNGT R1,R11
4590 LDMLEFD R13!,{R0-R12,PC}^
4600 CMP R0,#640-32
4610 CMPLE R1,#256-1
4620 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
4630
4640 CMP R1,#0
4650 ADDLT R11,R11,R1
4660 SUBLT R10,R10,R1,LSL #4
4670 MOVLT R1,#0 \ trim top
4680
4690 RSB R4,R1,#256
4700 CMP R11,R4
4710 MOVGT R11,R4 \ trim bottom
4720
4730 LDR R9,plotscreenbase
4740 ADD R9,R9,R1,LSL #8
4750 ADD R9,R9,R1,LSL #6
4760 BIC R1,R0,#7
4770 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
4780
4790 MOV R12,#%1000
4800 ORR R12,R12,R12,LSL #16
4810 ORR R12,R12,R12,LSL #8
4820 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit
4830
4840 AND R1,R0,#7
4850 ADR R0,caselist3
4860 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
4870 ADR R1,base3
4880 ADD PC,R0,R1
4890
4900 .caselist3
4910 ]
4920 FOR N%=0 TO 7
4930 [OPT pass%
4940 EQUD plotspriteacode(N%,3)-base3
4950 ]
4960 NEXT N%
4970 [OPT pass%
4980 .base3
4990 ]
5000 FOR N%=0 TO 7
5010 shiftleft = N%*4
5020 shiftright = 32-N%*4
5030 [OPT pass% \ do 8 compilations
5040
5050 .plotspriteacode(N%,3) \ doubles as loop start
5060 LDMIA R10,{R0-R3}
5070 ADD R10,R10,#128
5080 LDMIA R9,{R4-R8}
5090
5100 ]
5110 FOR M%=0 TO 1
5120 Rdata = M%*2
5130 Rcurword = M%+4
5140 Rnextword = M%+5
5150 [OPT pass% \ for four words...
5160
5170 ORR R14,Rdata,Rdata,LSL #1
5180 AND R14,R12,R14
5190 ORR R14,R14,R14,LSR #2
5200 ORR R14,R14,R14,LSR #1
5210 BIC Rcurword,Rcurword,R14,LSL #shiftleft
5220 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft
5230 BIC Rnextword,Rnextword,R14,LSR #shiftright
5240 ORR Rnextword,Rnextword,Rdata,LSR #shiftright
5250 ]
5260 NEXT M%
5270 [OPT pass%
5280
5290 STMIA R9,{R4-R8}
5300 ADD R9,R9,#320
5310
5320 SUBS R11,R11,#1
5330 BGT plotspriteacode(N%,3)
5340
5350 LDMFD R13!,{R0-R12,PC}^
5360
5370 ]
5380 NEXT N%
5390 [OPT pass%
5400
5410 .plotscreenbase
5420 EQUD 0
5430
5440 .spritefilebase
5450 EQUD 0
5460
5470 \ Empty routine for timing test purposes
5480 .null
5490 MOV PC,R14
5500
5510
5520 \ Fill screen area with colour bands etc
5530 .clearscreen
5540 STMFD R13!,{R0-R3,R14}
5550
5560 MOV R0,#4
5570 MOV R1,#0
5580 LDR R3,currepq
5590
5600 CMP R3,#0
5610 MOVEQ R2,#256
5620 BLEQ fillsection
5630 CMP R3,#1
5640 MOVEQ R2,#128
5650 BLEQ fillsection
5660 CMP R3,#2
5670 MOVEQ R2,#64
5680 BLEQ fillsectionhalf
5690 CMP R3,#3
5700 MOVEQ R2,#32
5710 BLEQ fillsectionquarter
5720
5730 LDMFD R13!,{R0-R3,PC}^
5740
5750 .currepq
5760 EQUD 0
5770
5780 \ Fill screen area with lots of sprites
5790 .repeatdata
5800 STMFD R13!,{R0-R12,R14}
5810
5820 MOV R0,#4
5830 MOV R1,#0
5840 LDR R3,currepq
5850
5860 CMP R3,#1
5870 BEQ rep1
5880 CMP R3,#2
5890 BEQ rep2
5900 CMP R3,#3
5910 BEQ rep3
5920
5930 LDMFD R13!,{R0-R12,PC}^
5940
5950
5960 \ Fill section of screen with given nibble
5970 \ R0 = Word to insert
5980 \ R1 = Line to start at
5990 \ R2 = Number of lines
6000 .fillsection
6010 STMFD R13!,{R0-R12,R14}
6020 STR R13,r13sto \ save R13
6030
6040 MOV R14,R2
6050
6060 LDR R13,plotscreenbase
6070 ADD R13,R13,R1,LSL #8
6080 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
6090
6100 AND R0,R0,#%1111
6110 ORR R0,R0,R0,LSL #4
6120 ORR R0,R0,R0,LSL #8
6130 ORR R0,R0,R0,LSL #16 \ expand into word
6140
6150 MOV R1,R0
6160 MOV R2,R0
6170 MOV R3,R0
6180 MOV R4,R0
6190 MOV R5,R0
6200 MOV R6,R0
6210 MOV R7,R0
6220 MOV R8,R0
6230 MOV R9,R0
6240 MOV R10,R0
6250 MOV R11,R0 \ set registers for fill
6260
6270 .fsloop
6280 STMIA R13!,{R0-R11} \ 48 bytes
6290 STMIA R13!,{R0-R11} \ 48 bytes
6300 STMIA R13!,{R0-R11} \ 48 bytes
6310 STMIA R13!,{R0-R11} \ 48 bytes
6320 STMIA R13!,{R0-R11} \ 48 bytes
6330 STMIA R13!,{R0-R11} \ 48 bytes
6340 STMIA R13!,{R0-R7} \ 32 bytes
6350
6360 SUBS R14,R14,#1
6370 BGT fsloop
6380
6390 LDR R13,r13sto \ recover R13
6400 LDMFD R13!,{R0-R12,PC}^
6410
6420 \ Fill half section of screen with given nibble
6430 \ R0 = Word to insert
6440 \ R1 = Line to start at
6450 \ R2 = Number of lines
6460 .fillsectionhalf
6470 STMFD R13!,{R0-R12,R14}
6480 STR R13,r13sto \ save R13
6490
6500 MOV R14,R2
6510
6520 LDR R13,plotscreenbase
6530 ADD R13,R13,R1,LSL #8
6540 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
6550
6560 AND R0,R0,#%1111
6570 ORR R0,R0,R0,LSL #4
6580 ORR R0,R0,R0,LSL #8
6590 ORR R0,R0,R0,LSL #16 \ expand into word
6600
6610 MOV R1,R0
6620 MOV R2,R0
6630 MOV R3,R0
6640 MOV R4,R0
6650 MOV R5,R0
6660 MOV R6,R0
6670 MOV R7,R0
6680 MOV R8,R0
6690 MOV R9,R0
6700 MOV R10,R0
6710 MOV R11,R0 \ set registers for fill
6720
6730 .fsloop1
6740 STMIA R13!,{R0-R11} \ 48 bytes
6750 STMIA R13!,{R0-R11} \ 48 bytes
6760 STMIA R13!,{R0-R11} \ 48 bytes
6770 STMIA R13!,{R0-R3} \ 16 bytes
6780
6790 ADD R13,R13,#160
6800 SUBS R14,R14,#1
6810 BGT fsloop1
6820
6830 LDR R13,r13sto \ recover R13
6840 LDMFD R13!,{R0-R12,PC}^
6850
6860 \ Fill quarter section of screen with given nibble
6870 \ R0 = Word to insert
6880 \ R1 = Line to start at
6890 \ R2 = Number of lines
6900 .fillsectionquarter
6910 STMFD R13!,{R0-R12,R14}
6920 STR R13,r13sto \ save R13
6930
6940 MOV R14,R2
6950
6960 LDR R13,plotscreenbase
6970 ADD R13,R13,R1,LSL #8
6980 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
6990
7000 AND R0,R0,#%1111
7010 ORR R0,R0,R0,LSL #4
7020 ORR R0,R0,R0,LSL #8
7030 ORR R0,R0,R0,LSL #16 \ expand into word
7040
7050 MOV R1,R0
7060 MOV R2,R0
7070 MOV R3,R0
7080 MOV R4,R0
7090 MOV R5,R0
7100 MOV R6,R0
7110 MOV R7,R0
7120 MOV R8,R0
7130 MOV R9,R0
7140 MOV R10,R0
7150 MOV R11,R0 \ set registers for fill
7160
7170 .fsloop2
7180 STMIA R13!,{R0-R11} \ 48 bytes
7190 STMIA R13!,{R0-R7} \ 32 bytes
7200
7210 ADD R13,R13,#240
7220 SUBS R14,R14,#1
7230 BGT fsloop2
7240
7250 LDR R13,r13sto \ recover R13
7260 LDMFD R13!,{R0-R12,PC}^
7270
7280 .rep1
7290 STR R13,r13sto
7300
7310 LDR R13,plotscreenbase
7320 ADD R12,R13,#128*320
7330 MOV R14,#128
7340
7350 .reploop1
7360 LDMIA R13!,{R0-R11}
7370 STMIA R12!,{R0-R11}
7380 LDMIA R13!,{R0-R11}
7390 STMIA R12!,{R0-R11}
7400 LDMIA R13!,{R0-R11}
7410 STMIA R12!,{R0-R11}
7420 LDMIA R13!,{R0-R11}
7430 STMIA R12!,{R0-R11}
7440 LDMIA R13!,{R0-R11}
7450 STMIA R12!,{R0-R11}
7460 LDMIA R13!,{R0-R11}
7470 STMIA R12!,{R0-R11}
7480 LDMIA R13!,{R0-R7}
7490 STMIA R12!,{R0-R7}
7500 SUBS R14,R14,#1
7510 BGT reploop1
7520
7530 LDR R13,r13sto
7540 LDMFD R13!,{R0-R12,PC}^
7550
7560 .rep2
7570 STR R13,r13sto
7580
7590 LDR R13,plotscreenbase
7600 MOV R14,#64
7610
7620 .reploop2
7630 LDMIA R13!,{R0-R11}
7640 ADD R12,R13,#160-48
7650 STMIA R12,{R0-R11}
7660 ADD R12,R12,#320*64
7670 STMIA R12,{R0-R11}
7680 ADD R12,R12,#320*64
7690 STMIA R12,{R0-R11}
7700 ADD R12,R12,#320*64
7710 STMIA R12,{R0-R11}
7720 SUB R12,R12,#160
7730 STMIA R12,{R0-R11}
7740 SUB R12,R12,#320*64
7750 STMIA R12,{R0-R11}
7760 SUB R12,R12,#320*64
7770 STMIA R12,{R0-R11}
7780 LDMIA R13!,{R0-R11}
7790 ADD R12,R13,#160-48
7800 STMIA R12,{R0-R11}
7810 ADD R12,R12,#320*64
7820 STMIA R12,{R0-R11}
7830 ADD R12,R12,#320*64
7840 STMIA R12,{R0-R11}
7850 ADD R12,R12,#320*64
7860 STMIA R12,{R0-R11}
7870 SUB R12,R12,#160
7880 STMIA R12,{R0-R11}
7890 SUB R12,R12,#320*64
7900 STMIA R12,{R0-R11}
7910 SUB R12,R12,#320*64
7920 STMIA R12,{R0-R11}
7930 LDMIA R13!,{R0-R11}
7940 ADD R12,R13,#160-48
7950 STMIA R12,{R0-R11}
7960 ADD R12,R12,#320*64
7970 STMIA R12,{R0-R11}
7980 ADD R12,R12,#320*64
7990 STMIA R12,{R0-R11}
8000 ADD R12,R12,#320*64
8010 STMIA R12,{R0-R11}
8020 SUB R12,R12,#160
8030 STMIA R12,{R0-R11}
8040 SUB R12,R12,#320*64
8050 STMIA R12,{R0-R11}
8060 SUB R12,R12,#320*64
8070 STMIA R12,{R0-R11}
8080 LDMIA R13!,{R0-R3}
8090 ADD R12,R13,#160-16
8100 STMIA R12,{R0-R3}
8110 ADD R12,R12,#320*64
8120 STMIA R12,{R0-R3}
8130 ADD R12,R12,#320*64
8140 STMIA R12,{R0-R3}
8150 ADD R12,R12,#320*64
8160 STMIA R12,{R0-R3}
8170 SUB R12,R12,#160
8180 STMIA R12,{R0-R3}
8190 SUB R12,R12,#320*64
8200 STMIA R12,{R0-R3}
8210 SUB R12,R12,#320*64
8220 STMIA R12,{R0-R3}
8230
8240 ADD R13,R13,#160
8250 SUBS R14,R14,#1
8260 BGT reploop2
8270 LDR R13,r13sto
8280 LDMFD R13!,{R0-R12,PC}^
8290
8300 .rep3
8310 STR R13,r13sto
8320
8330 LDR R13,plotscreenbase
8340 MOV R14,#32
8350
8360 .reploop3
8370 LDMIA R13!,{R0-R11}
8380 ADD R12,R13,#80-48:STMIA R12,{R0-R11}
8390 ADD R12,R12,#80:STMIA R12,{R0-R11}
8400 ADD R12,R12,#80:STMIA R12,{R0-R11}
8410 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8420 SUB R12,R12,#80:STMIA R12,{R0-R11}
8430 SUB R12,R12,#80:STMIA R12,{R0-R11}
8440 SUB R12,R12,#80:STMIA R12,{R0-R11}
8450 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8460 ADD R12,R12,#80:STMIA R12,{R0-R11}
8470 ADD R12,R12,#80:STMIA R12,{R0-R11}
8480 ADD R12,R12,#80:STMIA R12,{R0-R11}
8490 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8500 SUB R12,R12,#80:STMIA R12,{R0-R11}
8510 SUB R12,R12,#80:STMIA R12,{R0-R11}
8520 SUB R12,R12,#80:STMIA R12,{R0-R11}
8530 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8540 ADD R12,R12,#80:STMIA R12,{R0-R11}
8550 ADD R12,R12,#80:STMIA R12,{R0-R11}
8560 ADD R12,R12,#80:STMIA R12,{R0-R11}
8570 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8580 SUB R12,R12,#80:STMIA R12,{R0-R11}
8590 SUB R12,R12,#80:STMIA R12,{R0-R11}
8600 SUB R12,R12,#80:STMIA R12,{R0-R11}
8610 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8620 ADD R12,R12,#80:STMIA R12,{R0-R11}
8630 ADD R12,R12,#80:STMIA R12,{R0-R11}
8640 ADD R12,R12,#80:STMIA R12,{R0-R11}
8650 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
8660 SUB R12,R12,#80:STMIA R12,{R0-R11}
8670 SUB R12,R12,#80:STMIA R12,{R0-R11}
8680 SUB R12,R12,#80:STMIA R12,{R0-R11}
8690 LDMIA R13!,{R0-R7}
8700 ADD R12,R13,#80-32:STMIA R12,{R0-R7}
8710 ADD R12,R12,#80:STMIA R12,{R0-R7}
8720 ADD R12,R12,#80:STMIA R12,{R0-R7}
8730 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8740 SUB R12,R12,#80:STMIA R12,{R0-R7}
8750 SUB R12,R12,#80:STMIA R12,{R0-R7}
8760 SUB R12,R12,#80:STMIA R12,{R0-R7}
8770 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8780 ADD R12,R12,#80:STMIA R12,{R0-R7}
8790 ADD R12,R12,#80:STMIA R12,{R0-R7}
8800 ADD R12,R12,#80:STMIA R12,{R0-R7}
8810 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8820 SUB R12,R12,#80:STMIA R12,{R0-R7}
8830 SUB R12,R12,#80:STMIA R12,{R0-R7}
8840 SUB R12,R12,#80:STMIA R12,{R0-R7}
8850 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8860 ADD R12,R12,#80:STMIA R12,{R0-R7}
8870 ADD R12,R12,#80:STMIA R12,{R0-R7}
8880 ADD R12,R12,#80:STMIA R12,{R0-R7}
8890 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8900 SUB R12,R12,#80:STMIA R12,{R0-R7}
8910 SUB R12,R12,#80:STMIA R12,{R0-R7}
8920 SUB R12,R12,#80:STMIA R12,{R0-R7}
8930 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8940 ADD R12,R12,#80:STMIA R12,{R0-R7}
8950 ADD R12,R12,#80:STMIA R12,{R0-R7}
8960 ADD R12,R12,#80:STMIA R12,{R0-R7}
8970 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
8980 SUB R12,R12,#80:STMIA R12,{R0-R7}
8990 SUB R12,R12,#80:STMIA R12,{R0-R7}
9000 SUB R12,R12,#80:STMIA R12,{R0-R7}
9010 ADD R13,R13,#240
9020 SUBS R14,R14,#1
9030 BGT reploop3
9040 LDR R13,r13sto
9050 LDMFD R13!,{R0-R12,PC}^
9060
9070
9080 .r13sto
9090 EQUD 0
9100
9110 \ Routine to plot any sphere in normal range
9120 \ R0 points to pos vector, size (0-13)
9130 .gensphere
9140 STMFD R13!,{R0-R12,R14}
9150
9160 LDMIA R0,{R0-R3}
9170
9180 CMP R3,#1
9190 LDMLEFD R13!,{R0-R12,PC}^
9200
9210 MOV R0,R0,ASR #7
9220 ADD R0,R0,#xorigin \ Translate X
9230
9240 ADD R1,R1,R1,ASR #3
9250 MOV R1,R1,ASR #8
9260 RSB R1,R1,#yorigin \ Translate Y
9270
9280 MOV R2,#18 \ height 18
9290
9300 LDR R5,spritefilebase
9310 MOV R4,#288
9320 SUB R3,R3,#2
9330 MLA R3,R4,R3,R5 \ point to appropriate sphere
9340
9350 BL plotspritea \ plot
9360
9370 LDMFD R13!,{R0-R12,PC}^
9380
9390 \ Routine to plot head
9400 \ R0 points to pos vector, expression
9410 .head
9420 STMFD R13!,{R0-R12,R14}
9430
9440 LDMIA R0,{R0-R3}
9450
9460 MOV R0,R0,ASR #7
9470 ADD R0,R0,#xorigin-16 \ Translate X
9480
9490 ADD R1,R1,R1,ASR #3
9500 MOV R1,R1,ASR #8
9510 RSB R1,R1,#yorigin \ Translate Y
9520
9530 MOV R2,#36 \ height 36
9540
9550 LDR R5,spritefilebase
9560 MOV R4,#288
9570 ADD R3,R3,R3,LSL #3
9580 ADD R3,R3,#268
9590 MLA R3,R4,R3,R5 \ point to appropriate sprite
9600
9610 BL plotspritea \ plot left
9620
9630 ADD R3,R3,#288*2
9640 ADD R0,R0,#32
9650 BL plotspritea \ plot right
9660
9670 LDMFD R13!,{R0-R12,PC}^
9680
9690 \ Bungie line routine draws line with a sphere size 10 at far end
9700 \ R0 points to vector A, vector B, length as in table
9710 .bungieline
9720 STMFD R13!,{R0-R12,R14}
9730
9740 MOV R12,R0
9750 LDMIA R0,{R0-R6}
9760
9770 MLA R0,R3,R6,R0
9780 MLA R1,R4,R6,R1
9790 MLA R2,R5,R6,R2 \ Go to far end
9800
9810 MOV R0,R0,ASR #7
9820 ADD R0,R0,#xorigin \ Translate X
9830
9840 ADD R1,R1,R1,ASR #3
9850 MOV R1,R1,ASR #8
9860 RSB R1,R1,#yorigin \ Translate Y
9870
9880 MOV R2,#18 \ height 18
9890
9900 LDR R5,spritefilebase
9910 MOV R4,#288
9920 MOV R3,#10-2
9930 MLA R3,R4,R3,R5 \ point to appropriate sphere
9940
9950 BL plotspritea \ plot
9960
9970 MOV R0,R12
9980 B linesideentry
9990
10000 \ Routine to put line stating at A, dir B in 3d
10010 \ R0 points to vector A, vector B, length as in table
10020 .line
10030 STMFD R13!,{R0-R12,R14}
10040
10050 .linesideentry
10060
10070 LDMIA R0,{R4-R10}
10080
10090 CMP R10,#0
10100 LDMEQFD R13!,{R0-R12,PC}^
10110 RSBLT R7,R7,#0
10120 RSBLT R8,R8,#0
10130 RSBLT R9,R9,#0
10140 RSBLT R10,R10,#0
10150
10160 CMP R9,#0
10170 BLE lineforwards
10180 MLA R4,R7,R10,R4
10190 MLA R5,R8,R10,R5
10200 RSB R7,R7,#0
10210 RSB R8,R8,#0 \ ensure line goes toward viewer
10220 .lineforwards
10230
10240 ADD R4,R4,R7,ASR #1
10250 ADD R5,R5,R8,ASR #1 \ add half a unit to pos
10260
10270 LDR R1,mulconst
10280
10290 RSB R11,R7,#2560+160
10300 MUL R11,R1,R11
10310 MOV R11,R11,ASR #25 \ column
10320
10330 ADD R12,R8,#2560+160
10340 MUL R12,R1,R12
10350 MOV R12,R12,ASR #25 \ row
10360
10370 ORR R0,R11,R12
10380 TST R0,#16
10390 RSBNE R11,R11,#16
10400 RSBNE R12,R12,#16 \ if either go above 15 wrap round by inverting BOTH
10410
10420 LDR R14,linetype
10430 CMP R14,#0
10440 ADDEQ R3,R11,#12
10450 ADDEQ R3,R3,R12,LSL #4
10460 MOVNE R3,#8
10470 LDR R0,spritefilebase
10480 MOV R1,#288
10490 MLA R3,R1,R3,R0 \ point to appropriate line section
10500 MOV R2,#18 \ height 18
10510
10520 .lloop
10530 MOV R0,R4,ASR #7
10540 ADD R0,R0,#xorigin \ Translate X
10550
10560 ADD R1,R5,R5,ASR #3
10570 MOV R1,R1,ASR #8
10580 RSB R1,R1,#yorigin \ Translate Y
10590
10600 BL plotspritea \ plot
10610
10620 ADD R4,R4,R7
10630 ADD R5,R5,R8 \ add unit to pos
10640
10650 SUBS R10,R10,#1
10660 BGT lloop
10670
10680 LDMFD R13!,{R0-R12,PC}^
10690
10700 .mulconst
10710 EQUD 104858
10720
10730 .plottabqind
10740 EQUD plottabq
10750
10760 \ Routine to draw funky dancer
10770 .drawperson
10780 STMFD R13!,{R0-R12,R14}
10790
10800 MOV R0,#0
10810 LDR R1,plottabqind
10820 STR R0,[R1]
10830
10840 ADR R0,torsopos
10850 ADR R1,torsotrans
10860 ADR R2,realpos
10870 BL transform
10880
10890 ADR R0,vectemp
10900 ADR R1,torsotrans
10910 ADR R2,minusunitvec
10920 BL transform
10930 ADR R0,temppos
10940 ADR R1,vectemp
10950 MOV R2,#752
10960 ADR R3,torsopos
10970 BL vectormla
10980 ADR R1,vectemp
10990 ADR R0,temppos
11000 MOV R2,#1
11010 BL logline
11020 ADR R0,temppos
11030 ADR R1,vectemp
11040 MOV R2,#1*1024
11050 ADD R2,R2,#752+1504
11060 ADR R3,torsopos
11070 BL vectormla \ neck
11080
11090 ADR R0,temppos
11100 MOV R1,#0
11110 BL loghead
11120
11130 ADR R0,vectemp
11140 ADR R1,torsotrans
11150 ADR R2,sidewaysvec
11160 BL transform
11170 ADR R0,temppos
11180 ADR R1,vectemp
11190 MVN R2,#1328
11200 ADR R3,torsopos
11210 BL vectormla
11220 ADR R0,mattemp1
11230 ADR R1,lshouldertrans
11240 ADR R2,torsotrans
11250 BL multiply \ left shoulder
11260
11270 ADR R0,vectemp
11280 ADR R1,mattemp1
11290 ADR R2,unitvec
11300 BL transform
11310 ADR R0,temppos
11320 ADR R1,vectemp
11330 MOV R2,#5*1024
11340 ADR R3,temppos \ left upper arm
11350 BL vectormla
11360 ADR R0,temppos
11370 ADR R1,vectemp
11380 MVN R2,#NOT (-5)
11390 BL logbungieline
11400
11410 ADR R0,mattemp2
11420 ADR R1,lelbowtrans
11430 ADR R2,mattemp1
11440 BL multiply \ left elbow
11450
11460 ADR R0,vectemp
11470 ADR R1,mattemp2
11480 ADR R2,unitvec
11490 BL transform
11500 ADR R0,temppos
11510 ADR R1,vectemp
11520 MOV R2,#5
11530 BL logbungieline \ left lower arm
11540
11550 ADR R0,vectemp
11560 ADR R1,torsotrans
11570 ADR R2,sidewaysvec
11580 BL transform
11590 ADR R0,temppos
11600 ADR R1,vectemp
11610 MOV R2,#1328
11620 ADR R3,torsopos
11630 BL vectormla
11640 ADR R0,mattemp1
11650 ADR R1,rshouldertrans
11660 ADR R2,torsotrans
11670 BL multiply \ right shoulder
11680
11690 ADR R0,vectemp
11700 ADR R1,mattemp1
11710 ADR R2,unitvec
11720 BL transform
11730 ADR R0,temppos
11740 ADR R1,vectemp
11750 MOV R2,#5*1024
11760 ADR R3,temppos \ right upper arm
11770 BL vectormla
11780 ADR R0,temppos
11790 ADR R1,vectemp
11800 MVN R2,#NOT (-5)
11810 BL logbungieline
11820
11830 ADR R0,mattemp2
11840 ADR R1,relbowtrans
11850 ADR R2,mattemp1
11860 BL multiply \ right elbow
11870
11880 ADR R0,vectemp
11890 ADR R1,mattemp2
11900 ADR R2,unitvec
11910 BL transform
11920 ADR R0,temppos
11930 ADR R1,vectemp
11940 MOV R2,#5
11950 BL logbungieline \ right lower arm
11960
11970 ADR R0,vectemp
11980 ADR R1,torsotrans
11990 ADR R2,unitvec
12000 BL transform
12010 ADR R0,temppos
12020 ADR R1,vectemp
12030 MOV R2,#752
12040 ADR R3,torsopos
12050 BL vectormla
12060 ADR R1,vectemp
12070 ADR R0,temppos
12080 MOV R2,#4
12090 BL logline
12100 ADR R0,bumpos
12110 ADR R1,vectemp
12120 MOV R2,#4*1024
12130 ADD R2,R2,#2*752
12140 ADR R3,torsopos
12150 BL vectormla \ torso
12160
12170 ADR R0,vectemp
12180 ADR R1,torsotrans
12190 ADR R2,sidewaysvec
12200 BL transform
12210 ADR R0,temppos
12220 ADR R1,vectemp
12230 MVN R2,#1328
12240 ADR R3,bumpos
12250 BL vectormla
12260 ADR R0,mattemp1
12270 ADR R1,lhiptrans
12280 ADR R2,torsotrans
12290 BL multiply \ left hip
12300
12310 ADR R0,vectemp
12320 ADR R1,mattemp1
12330 ADR R2,unitvec
12340 BL transform
12350 ADR R0,temppos
12360 ADR R1,vectemp
12370 MOV R2,#5*1024
12380 ADR R3,temppos
12390 BL vectormla \ left thigh
12400 ADR R1,vectemp
12410 ADR R0,temppos
12420 MVN R2,#NOT (-5)
12430 BL logbungieline
12440
12450 ADR R0,mattemp2
12460 ADR R1,lkneetrans
12470 ADR R2,mattemp1
12480 BL multiply \ left knee
12490
12500 ADR R0,vectemp
12510 ADR R1,mattemp2
12520 ADR R2,unitvec
12530 BL transform
12540 ADR R1,vectemp
12550 ADR R0,temppos
12560 MOV R2,#5
12570 BL logbungieline \ left calf
12580
12590 ADR R0,vectemp
12600 ADR R1,torsotrans
12610 ADR R2,sidewaysvec
12620 BL transform
12630 ADR R0,temppos
12640 ADR R1,vectemp
12650 MOV R2,#1328
12660 ADR R3,bumpos
12670 BL vectormla
12680 ADR R0,mattemp1
12690 ADR R1,rhiptrans
12700 ADR R2,torsotrans
12710 BL multiply \ right hip
12720
12730 ADR R0,vectemp
12740 ADR R1,mattemp1
12750 ADR R2,unitvec
12760 BL transform
12770 ADR R0,temppos
12780 ADR R1,vectemp
12790 MOV R2,#5*1024
12800 ADR R3,temppos
12810 BL vectormla \ right thigh
12820 ADR R1,vectemp
12830 ADR R0,temppos
12840 MVN R2,#NOT (-5)
12850 BL logbungieline
12860
12870 ADR R0,mattemp2
12880 ADR R1,rkneetrans
12890 ADR R2,mattemp1
12900 BL multiply \ right knee
12910
12920 ADR R0,vectemp
12930 ADR R1,mattemp2
12940 ADR R2,unitvec
12950 BL transform
12960 ADR R1,vectemp
12970 ADR R0,temppos
12980 MOV R2,#5
12990 BL logbungieline \ right calf
13000
13010 ADR R0,torsopos
13020 MOV R1,#13
13030 BL logsphere
13040
13050 ADR R0,bumpos
13060 MOV R1,#13
13070 BL logsphere
13080
13090 BL spinningspheres
13100 BL display
13110 BL repeatdata
13120
13130 LDMFD R13!,{R0-R12,PC}^
13140
13150 .vectemp
13160 EQUD 0 :EQUD 0 :EQUD 0
13170
13180 .temppos
13190 EQUD 0 :EQUD 0 :EQUD 0
13200
13210 .mattemp1
13220 EQUD 0 :EQUD 0 :EQUD 0
13230 EQUD 0 :EQUD 0 :EQUD 0
13240 EQUD 0 :EQUD 0 :EQUD 0
13250
13260 .mattemp2
13270 EQUD 0 :EQUD 0 :EQUD 0
13280 EQUD 0 :EQUD 0 :EQUD 0
13290 EQUD 0 :EQUD 0 :EQUD 0
13300
13310 .unitvec \ transform this vector to get direction of line
13320 EQUD 0 :EQUD 2560 :EQUD 0
13330
13340 .minusunitvec \ transform this vector to get opposite to direction of line
13350 EQUD 0 :EQUD -2560 :EQUD 0
13360
13370 .sidewaysvec \ transform this vector to get a sideways directon
13380 EQUD 2560 :EQUD 0 :EQUD 0
13390
13400 .torsopos
13410 EQUD 0 :EQUD 0 :EQUD 0
13420
13430 .bumpos
13440 EQUD 0 :EQUD 0 :EQUD 0
13450
13460 .changeabledata
13470 .realpos
13480 EQUD 0 :EQUD 0 :EQUD 0 \set
13490
13500 .torsotrans
13510 EQUD 0 :EQUD -32768:EQUD 0 \set
13520 EQUD -32768:EQUD 0 :EQUD 0
13530 EQUD 0 :EQUD 0 :EQUD 32768
13540
13550 .lshouldertrans
13560 EQUD 28596 :EQUD 16000 :EQUD 0 \set
13570 EQUD -16000:EQUD 28596 :EQUD 0
13580 EQUD 0 :EQUD 0 :EQUD 32768
13590
13600 .lelbowtrans
13610 EQUD 31776 :EQUD -8000 :EQUD 0 \set
13620 EQUD 8000 :EQUD 31776 :EQUD 0
13630 EQUD 0 :EQUD 0 :EQUD 32768
13640
13650 .rshouldertrans
13660 EQUD 28596 :EQUD -16000:EQUD 0 \set
13670 EQUD 16000 :EQUD 28596 :EQUD 0
13680 EQUD 0 :EQUD 0 :EQUD 32768
13690
13700 .relbowtrans
13710 EQUD 31776 :EQUD 8000 :EQUD 0 \set
13720 EQUD -8000 :EQUD 31776 :EQUD 0
13730 EQUD 0 :EQUD 0 :EQUD 32768
13740
13750 .lhiptrans
13760 EQUD 31776 :EQUD 8000 :EQUD 0 \set
13770 EQUD -8000 :EQUD 31776 :EQUD 0
13780 EQUD 0 :EQUD 0 :EQUD 32768
13790
13800 .lkneetrans
13810 EQUD 32768 :EQUD 0 :EQUD 0 \set
13820 EQUD 0 :EQUD 32768 :EQUD 0
13830 EQUD 0 :EQUD 0 :EQUD 32768
13840
13850 .rhiptrans
13860 EQUD 31776 :EQUD -8000 :EQUD 0 \set
13870 EQUD 8000 :EQUD 31776 :EQUD 0
13880 EQUD 0 :EQUD 0 :EQUD 32768
13890
13900 .rkneetrans
13910 EQUD 32768 :EQUD 0 :EQUD 0 \set
13920 EQUD 0 :EQUD 32768 :EQUD 0
13930 EQUD 0 :EQUD 0 :EQUD 32768
13940
13950 .identity
13960 EQUD 32768 :EQUD 0 :EQUD 0
13970 EQUD 0 :EQUD 32768 :EQUD 0
13980 EQUD 0 :EQUD 0 :EQUD 32768
13990
14000 .spin1
14010 EQUD cos% :EQUD 0 :EQUD -sin%
14020 EQUD 0 :EQUD 32768 :EQUD 0
14030 EQUD sin% :EQUD 0 :EQUD cos%
14040
14050 .spin2
14060 EQUD cos% :EQUD -sin% :EQUD 0
14070 EQUD sin% :EQUD cos% :EQUD 0
14080 EQUD 0 :EQUD 0 :EQUD 32768
14090
14100 .spin3
14110 EQUD 32768 :EQUD 0 :EQUD 0
14120 EQUD 0 :EQUD cos% :EQUD -sin%
14130 EQUD 0 :EQUD sin% :EQUD cos%
14140
14150 .spin1b
14160 EQUD cos% :EQUD 0 :EQUD sin%
14170 EQUD 0 :EQUD 32768 :EQUD 0
14180 EQUD -sin% :EQUD 0 :EQUD cos%
14190
14200 .spin2b
14210 EQUD cos% :EQUD sin% :EQUD 0
14220 EQUD -sin% :EQUD cos% :EQUD 0
14230 EQUD 0 :EQUD 0 :EQUD 32768
14240
14250 .spin3b
14260 EQUD 32768 :EQUD 0 :EQUD 0
14270 EQUD 0 :EQUD cos% :EQUD sin%
14280 EQUD 0 :EQUD -sin% :EQUD cos%
14290
14300 .angletab0 \ normal prone position
14310 EQUB 0 \ sideways
14320 EQUB 0 \ height realpos
14330 EQUB 10 \ tilt
14340 EQUB 0 \ rot torsotrans
14350 EQUB 20 \ tilt
14360 EQUB 248 \ rot lshouldertrans
14370 EQUB 34 \ tilt
14380 EQUB 73 \ rot lelbowtrans
14390 EQUB 20 \ tilt
14400 EQUB 120 \ rot rshouldertrans
14410 EQUB 222 \ tilt
14420 EQUB 73 \ rot relbowtrans
14430 EQUB 24 \ tilt
14440 EQUB 36 \ rot lhiptrans
14450 EQUB 24 \ tilt
14460 EQUB 128 \ rot lkneetrans
14470 EQUB 24 \ tilt
14480 EQUB 92 \ rot rhiptrans
14490 EQUB 24 \ tilt
14500 EQUB 128 \ rot rkneetrans
14510
14520 .angletab1 \ 'getting down'
14530 EQUB 0 \ sideways
14540 EQUB 84 \ height realpos
14550 EQUB 10 \ tilt
14560 EQUB 0 \ rot torsotrans
14570 EQUB 38 \ tilt
14580 EQUB 248 \ rot lshouldertrans
14590 EQUB 84 \ tilt
14600 EQUB 73 \ rot lelbowtrans
14610 EQUB 38 \ tilt
14620 EQUB 120 \ rot rshouldertrans
14630 EQUB 172 \ tilt
14640 EQUB 73 \ rot relbowtrans
14650 EQUB 52 \ tilt
14660 EQUB 36 \ rot lhiptrans
14670 EQUB 80 \ tilt
14680 EQUB 128 \ rot lkneetrans
14690 EQUB 52 \ tilt
14700 EQUB 92 \ rot rhiptrans
14710 EQUB 80 \ tilt
14720 EQUB 128 \ rot rkneetrans
14730
14740 .angletab2 \ yeh
14750 EQUB 0 \ sideways
14760 EQUB 84 \ height realpos
14770 EQUB 10 \ tilt
14780 EQUB 0 \ rot torsotrans
14790 EQUB 38 \ tilt
14800 EQUB 248 \ rot lshouldertrans
14810 EQUB 84 \ tilt
14820 EQUB 73 \ rot lelbowtrans
14830 EQUB 120 \ tilt
14840 EQUB 120 \ rot rshouldertrans
14850 EQUB 224 \ tilt
14860 EQUB 180 \ rot relbowtrans
14870 EQUB 52 \ tilt
14880 EQUB 36 \ rot lhiptrans
14890 EQUB 80 \ tilt
14900 EQUB 128 \ rot lkneetrans
14910 EQUB 52 \ tilt
14920 EQUB 92 \ rot rhiptrans
14930 EQUB 80 \ tilt
14940 EQUB 128 \ rot rkneetrans
14950
14960 .angletab3 \ foot raised
14970 EQUB 0 \ sideways
14980 EQUB 0 \ height realpos
14990 EQUB 10 \ tilt
15000 EQUB 0 \ rot torsotrans
15010 EQUB 20 \ tilt
15020 EQUB 248 \ rot lshouldertrans
15030 EQUB 34 \ tilt
15040 EQUB 73 \ rot lelbowtrans
15050 EQUB 20 \ tilt
15060 EQUB 120 \ rot rshouldertrans
15070 EQUB 222 \ tilt
15080 EQUB 73 \ rot relbowtrans
15090 EQUB 30 \ tilt
15100 EQUB 36 \ rot lhiptrans
15110 EQUB 36 \ tilt
15120 EQUB 128 \ rot lkneetrans
15130 EQUB 24 \ tilt
15140 EQUB 92 \ rot rhiptrans
15150 EQUB 24 \ tilt
15160 EQUB 128 \ rot rkneetrans
15170
15180 .angletab4 \ foot raised
15190 EQUB 0 \ sideways
15200 EQUB 0 \ height realpos
15210 EQUB 10 \ tilt
15220 EQUB 0 \ rot torsotrans
15230 EQUB 38 \ tilt
15240 EQUB 248 \ rot lshouldertrans
15250 EQUB 84 \ tilt
15260 EQUB 73 \ rot lelbowtrans
15270 EQUB 38 \ tilt
15280 EQUB 120 \ rot rshouldertrans
15290 EQUB 172 \ tilt
15300 EQUB 73 \ rot relbowtrans
15310 EQUB 30 \ tilt
15320 EQUB 36 \ rot lhiptrans
15330 EQUB 36 \ tilt
15340 EQUB 128 \ rot lkneetrans
15350 EQUB 24 \ tilt
15360 EQUB 92 \ rot rhiptrans
15370 EQUB 24 \ tilt
15380 EQUB 128 \ rot rkneetrans
15390
15400 .angletab5 \ hands in front
15410 EQUB 0 \ sideways
15420 EQUB 0 \ height realpos
15430 EQUB 10 \ tilt
15440 EQUB 0 \ rot torsotrans
15450 EQUB 50 \ tilt
15460 EQUB 48 \ rot lshouldertrans
15470 EQUB 78 \ tilt
15480 EQUB 0 \ rot lelbowtrans
15490 EQUB 50 \ tilt
15500 EQUB 80 \ rot rshouldertrans
15510 EQUB 178 \ tilt
15520 EQUB 128 \ rot relbowtrans
15530 EQUB 24 \ tilt
15540 EQUB 36 \ rot lhiptrans
15550 EQUB 24 \ tilt
15560 EQUB 128 \ rot lkneetrans
15570 EQUB 24 \ tilt
15580 EQUB 92 \ rot rhiptrans
15590 EQUB 24 \ tilt
15600 EQUB 128 \ rot rkneetrans
15610
15620 .angletab6 \ hands behind
15630 EQUB 0 \ sideways
15640 EQUB 84 \ height realpos
15650 EQUB 10 \ tilt
15660 EQUB 0 \ rot torsotrans
15670 EQUB 96 \ tilt
15680 EQUB 48 \ rot lshouldertrans
15690 EQUB 78 \ tilt
15700 EQUB 0 \ rot lelbowtrans
15710 EQUB 96 \ tilt
15720 EQUB 80 \ rot rshouldertrans
15730 EQUB 178 \ tilt
15740 EQUB 128 \ rot relbowtrans
15750 EQUB 52 \ tilt
15760 EQUB 36 \ rot lhiptrans
15770 EQUB 80 \ tilt
15780 EQUB 128 \ rot lkneetrans
15790 EQUB 52 \ tilt
15800 EQUB 92 \ rot rhiptrans
15810 EQUB 80 \ tilt
15820 EQUB 128 \ rot rkneetrans
15830
15840 .angletab7 \ hands crossed 1
15850 EQUB 0 \ sideways
15860 EQUB 84 \ height realpos
15870 EQUB 10 \ tilt
15880 EQUB 0 \ rot torsotrans
15890 EQUB 50 \ tilt
15900 EQUB 56 \ rot lshouldertrans
15910 EQUB 62 \ tilt
15920 EQUB 32 \ rot lelbowtrans
15930 EQUB 50 \ tilt
15940 EQUB 72 \ rot rshouldertrans
15950 EQUB 162 \ tilt
15960 EQUB 96 \ rot relbowtrans
15970 EQUB 52 \ tilt
15980 EQUB 36 \ rot lhiptrans
15990 EQUB 80 \ tilt
16000 EQUB 128 \ rot lkneetrans
16010 EQUB 52 \ tilt
16020 EQUB 92 \ rot rhiptrans
16030 EQUB 80 \ tilt
16040 EQUB 128 \ rot rkneetrans
16050
16060 .angletab8 \ hands crossed 1
16070 EQUB 0 \ sideways
16080 EQUB 84 \ height realpos
16090 EQUB 10 \ tilt
16100 EQUB 0 \ rot torsotrans
16110 EQUB 50 \ tilt
16120 EQUB 56 \ rot lshouldertrans
16130 EQUB 94 \ tilt
16140 EQUB 32 \ rot lelbowtrans
16150 EQUB 50 \ tilt
16160 EQUB 72 \ rot rshouldertrans
16170 EQUB 194 \ tilt
16180 EQUB 96 \ rot relbowtrans
16190 EQUB 52 \ tilt
16200 EQUB 36 \ rot lhiptrans
16210 EQUB 80 \ tilt
16220 EQUB 128 \ rot lkneetrans
16230 EQUB 52 \ tilt
16240 EQUB 92 \ rot rhiptrans
16250 EQUB 80 \ tilt
16260 EQUB 128 \ rot rkneetrans
16270
16280 .angletab9 \ the splits
16290 EQUB 0 \ sideways
16300 EQUB 150 \ height realpos
16310 EQUB 10 \ tilt
16320 EQUB 0 \ rot torsotrans
16330 EQUB 116 \ tilt
16340 EQUB 248 \ rot lshouldertrans
16350 EQUB 5 \ tilt
16360 EQUB 73 \ rot lelbowtrans
16370 EQUB 116 \ tilt
16380 EQUB 120 \ rot rshouldertrans
16390 EQUB 251 \ tilt
16400 EQUB 73 \ rot relbowtrans
16410 EQUB 80 \ tilt
16420 EQUB 0 \ rot lhiptrans
16430 EQUB 10 \ tilt
16440 EQUB 128 \ rot lkneetrans
16450 EQUB 80 \ tilt
16460 EQUB 128 \ rot rhiptrans
16470 EQUB 10 \ tilt
16480 EQUB 128 \ rot rkneetrans
16490
16500 .angletabcur
16510 EQUD 0
16520 EQUD 0
16530 EQUD 0
16540 EQUD 0
16550 EQUD 0
16560
16570 .mconst
16580 EQUD 65536/6+0.5
16590
16600 .sincostabind
16610 EQUD sincostab
16620
16630 .changeabledataind
16640 EQUD changeabledata
16650
16660 .plotscreeninda
16670 EQUD plotscreenbase
16680
16690 \ Update movements
16700 .update
16710 STMFD R13!,{R0-R12,R14}
16720
16730 LDR R2,mstore
16740 LDR R1,nstore
16750 LDR R0,kstore \ get position in track
16760
16770 ADR R4,angletab0
16780
16790 CMP R0,#7
16800 CMPNE R0,#8
16810 CMPNE R0,#16
16820 CMPNE R0,#17
16830 BNE noyeh
16840 TST R1,#2
16850 ADRNE R4,angletab1
16860
16870 MOV R6,R1,LSR #1
16880 AND R6,R6,#7
16890 MOV R7,R1,LSR #4
16900 AND R7,R7,#3
16910 CMP R6,#5
16920 ADREQ R4,angletab2
16930 CMP R7,#3
16940 BNE noyeh1
16950 CMP R6,#3
16960 ADREQ R4,angletab2
16970 .noyeh1
16980 CMP R0,#7
16990 CMPNE R0,#16
17000 BEQ noyeh
17010 CMP R6,#1
17020 ADREQ R4,angletab9
17030 .noyeh
17040
17050 CMP R0,#10
17060 CMPNE R0,#11
17070 CMPNE R0,#12
17080 CMPNE R0,#13
17090 BNE nocross
17100 TST R1,#4
17110 ADRNE R4,angletab7
17120 ADREQ R4,angletab8
17130 TST R1,#2
17140 ADREQ R4,angletab5
17150 .nocross
17160
17170 CMP R0,#5
17180 CMPNE R0,#6
17190 CMPNE R0,#14
17200 CMPNE R0,#15
17210 CMPNE R0,#18
17220 CMPNE R0,#19
17230 BNE noother
17240 TST R1,#2
17250 ADRNE R4,angletab6
17260 ADREQ R4,angletab5
17270 .noother
17280
17290 CMP R0,#2
17300 BNE nofooty
17310 TST R1,#2
17320 ADREQ R4,angletab3
17330 .nofooty
17340
17350 CMP R0,#3
17360 BNE nofooty1
17370 TST R1,#2
17380 ADREQ R4,angletab4
17390 .nofooty1
17400
17410 LDR R5,lasttablepos
17420 AND R6,R1,#1
17430 CMP R6,#1
17440 CMPEQ R2,#2
17450 STREQ R4,lasttablepos
17460 AND R1,R1,#1
17470 ADD R2,R2,R1,LSL #0
17480 ADD R2,R2,R1,LSL #1 \ 0..5
17490 LDR R6,mconst
17500 MUL R2,R6,R2 \ 0..65535
17510 RSB R3,R2,#65536 \ R3+R2=65536
17520
17530 ADR R14,angletabcur
17540 MOV R6,#20
17550 .udintloop
17560 LDRB R0,[R4],#1
17570 LDRB R1,[R5],#1
17580 MUL R0,R2,R0
17590 MLA R0,R3,R1,R0
17600 MOV R0,R0,ASR #16
17610 STRB R0,[R14],#1
17620 SUBS R6,R6,#1
17630 BGT udintloop
17640
17650 ADR R14,angletabcur
17660 LDR R2,mstore
17670 LDR R1,nstore
17680 LDR R0,kstore \ get position in track (again)
17690
17700 CMP R0,#10
17710 BLT noturn
17720 CMP R0,#14
17730 BGE noturn
17740 ADD R4,R2,R1,LSL #0
17750 ADD R4,R4,R1,LSL #1
17760 LDR R3,mconst
17770 MUL R4,R3,R4
17780 MOV R4,R4,ASR #21-8
17790 STRB R4,[R14,#3]
17800 MOV R4,#40
17810 STRB R4,[R14,#2]
17820 CMP R0,#10
17830 BNE noturn
17840 CMP R1,#20
17850 BGE noturn
17860 ADD R4,R2,R1,LSL #0
17870 ADD R4,R4,R1,LSL #1
17880 MOV R4,R4,ASR #1
17890 ADD R4,R4,#10
17900 STRB R4,[R14,#2]
17910 .noturn \ turning in musical bit
17920
17930 LDR R12,changeabledataind
17940 LDR R10,sincostabind
17950 ADD R11,R10,#1024
17960 MOV R9,#0
17970
17980 LDRB R0,[R14],#1
17990 LDRB R1,[R14],#1
18000 MOV R0,R0,LSL #7
18010 MOV R1,R1,LSL #7
18020 STR R0,[R12],#4
18030 STR R1,[R12],#8 \ convert realpos
18040
18050 LDRB R4,[R14],#1 \ get tilt
18060 LDR R0,[R10,R4,LSL #2] \ tilt sin s
18070 LDR R1,[R11,R4,LSL #2] \ tilt cos c
18080 LDRB R4,[R14],#1 \ get rot
18090 LDR R2,[R10,R4,LSL #2] \ rot sin S
18100 LDR R3,[R11,R4,LSL #2] \ rot cos C
18110
18120 STR R3,[R12],#4 \ C
18130 STR R9,[R12],#4 \ 0
18140 SUB R4,R9,R2
18150 STR R4,[R12],#4 \ -S
18160 MUL R4,R0,R2
18170 ADD R4,R9,R4,ASR #15
18180 STR R4,[R12],#4 \ Ss
18190 SUB R4,R9,R1
18200 STR R4,[R12],#4 \ -c
18210 MUL R4,R0,R3
18220 ADD R4,R9,R4,ASR #15
18230 STR R4,[R12],#4 \ Cs
18240 MUL R4,R1,R2
18250 ADD R4,R9,R4,ASR #15
18260 STR R4,[R12],#4 \ Sc
18270 STR R0,[R12],#4 \ s
18280 MUL R4,R1,R3
18290 ADD R4,R9,R4,ASR #15
18300 STR R4,[R12],#4 \ Cc
18310
18320 MOV R8,#8
18330 .udconvertloop
18340
18350 LDRB R4,[R14],#1 \ get tilt
18360 LDR R0,[R10,R4,LSL #2] \ tilt sin s
18370 LDR R1,[R11,R4,LSL #2] \ tilt cos c
18380 LDRB R4,[R14],#1 \ get rot
18390 LDR R2,[R10,R4,LSL #2] \ rot sin S
18400 LDR R3,[R11,R4,LSL #2] \ rot cos C
18410
18420 MUL R4,R1,R3
18430 ADD R4,R9,R4,ASR #15
18440 STR R4,[R12],#4 \ Cc
18450 MUL R4,R0,R3
18460 SUB R4,R9,R4,ASR #15
18470 STR R4,[R12],#4 \ -Cs
18480 SUB R4,R9,R2
18490 STR R4,[R12],#4 \ -S
18500 STR R0,[R12],#4 \ s
18510 STR R1,[R12],#4 \ c
18520 STR R9,[R12],#4 \ 0
18530 MUL R4,R1,R2
18540 ADD R4,R9,R4,ASR #15
18550 STR R4,[R12],#4 \ Sc
18560 MUL R4,R0,R2
18570 SUB R4,R9,R4,ASR #15
18580 STR R4,[R12],#4 \ -Ss
18590 STR R3,[R12],#4 \ C
18600
18610 SUBS R8,R8,#1
18620 BGT udconvertloop
18630
18640 LDR R0,counter
18650
18660 CMP R0,#50
18670 RSBLE R1,R0,#50
18680 MOVLE R1,R1,LSL #10
18690 STRLE R1,realpos+4 \ make him float up at start
18700
18710 ADD R0,R0,#1
18720 STR R0,counter
18730
18740 LDR R0,startabind
18750 LDR R1,plotscreeninda
18760 LDR R1,[R1]
18770 MOV R2,#&00 \ two pixels
18780 MOV R3,#127
18790
18800 LDR R5,curseq
18810 CMP R5,#0
18820 BEQ noseq
18830 LDR R6,staroffset
18840 LDR R5,[R5,R6,LSL #2]
18850 ADD R6,R6,#1
18860 CMP R6,#24
18870 SUBGE R6,R6,#24
18880 STR R6,staroffset \ read offset from table
18890 STR R5,lastoffset
18900 .noseq
18910 LDR R5,lastoffset
18920
18930 CMP R5,#0
18940 ADDLT R5,R5,#81920
18950 .starloop
18960 LDR R4,[R0,R3,LSL #2]
18970 SUBS R4,R4,R5
18980 ADDLT R4,R4,#81920
18990 STRB R2,[R1,R4]
19000 SUB R3,R3,#1
19010 LDR R4,[R0,R3,LSL #2]
19020 SUBS R4,R4,R5
19030 ADDLT R4,R4,#81920
19040 STRB R2,[R1,R4]
19050 SUBS R3,R3,#1
19060 BGT starloop
19070
19080 LDMFD R13!,{R0-R12,PC}^
19090
19100 .lasttablepos
19110 EQUD angletab0
19120
19130 .curseq
19140 EQUD 0
19150
19160 .lastoffset
19170 EQUD 0
19180
19190 .staroffset
19200 EQUD 0
19210
19220 .startabind
19230 EQUD startab
19240
19250 .counter
19260 EQUD 0
19270
19280 .curspin
19290 EQUD identity
19300
19310 .cctab
19320 EQUD rgval(0)*256+0.5
19330 EQUD rgval(1)*256+0.5
19340 EQUD rgval(2)*256+0.5
19350
19360 \ Set new colour into given light record
19370 \ R2 = base addr of record
19380 \ R3 = colour number
19390 .newcolour
19400 STMFD R13!,{R0,R1,R14}
19410 ADR R1,coltemplates
19420 ADD R1,R1,R3,ASL #0
19430 ADD R1,R1,R3,ASL #1
19440 LDRB R0,[R1],#1
19450 STR R0,[R2,#0]
19460 LDRB R0,[R1],#1
19470 STR R0,[R2,#4]
19480 LDRB R0,[R1],#1
19490 STR R0,[R2,#8]
19500 LDMFD R13!,{R0,R1,PC}^
19510
19520 \ Flash given light record
19530 \ R2 = base addr of record
19540 .flash
19550 STMFD R13!,{R0,R14}
19560 MOV R0,#65536
19570 STR R0,[R2,#12]
19580 LDMFD R13!,{R0,PC}^
19590
19600 \ Turn off all light records
19610 .turnoff
19620 STMFD R13!,{R0,R1,R14}
19630 MOV R0,#0
19640 ADR R1,col1
19650 STR R0,[R1,#12]
19660 ADR R1,col2
19670 STR R0,[R1,#12]
19680 LDMFD R13!,{R0,R1,PC}^
19690
19700 \ Set dim red glow in record
19710 \ R2 = base addr of record
19720 .dimglow
19730 STMFD R13!,{R0,R3-R6,R14}
19740 ADR R0,dimglowtemplate
19750 LDMIA R0,{R3-R6}
19760 STMIA R2,{R3-R6}
19770 LDMFD R13!,{R0,R3-R6,PC}^
19780
19790 .dimglowtemplate
19800 EQUD 112
19810 EQUD 32
19820 EQUD 0
19830 EQUD 65536
19840
19850 .linetype
19860 EQUD 0
19870
19880 .coltemplates
19890 :=255 := 255 := 255 \ white
19900 :=255 := 0 := 32 \ red
19910 :=255 := 128 := 0 \ orange
19920 :=192 := 255 := 0 \ yellow
19930 :=0 := 255 := 0 \ green
19940 :=0 := 208 := 192 \ cyan
19950 :=0 := 32 := 255 \ blue
19960 :=192 := 0 := 255 \ purple
19970 :=255 := 128 := 128 \ pink
19980 :=128 := 128 := 255 \ pale blue
19990
20000 ALIGN
20010
20020 .nstore
20030 EQUD -1
20040 .kstore
20050 EQUD 0
20060 .mstore
20070 EQUD 0
20080
20090 \ transform a vector through a matrix
20100 \ R0 points to result vector
20110 \ R1 points to matrix
20120 \ R2 points to vector
20130 .transform
20140 STMFD R13!,{R0-R12,R14}
20150
20160 MOV R12,R0
20170
20180 LDMIA R2,{R9-R11}
20190 LDMIA R1,{R0-R8}
20200
20210 MUL R0,R9,R0
20220 MLA R0,R10,R1,R0
20230 MLA R0,R11,R2,R0
20240 MUL R1,R9,R3
20250 MLA R1,R10,R4,R1
20260 MLA R1,R11,R5,R1
20270 MUL R2,R9,R6
20280 MLA R2,R10,R7,R2
20290 MLA R2,R11,R8,R2
20300
20310 MOV R0,R0,ASR #15
20320 MOV R1,R1,ASR #15
20330 MOV R2,R2,ASR #15
20340
20350 STMIA R12,{R0-R2}
20360
20370 LDMFD R13!,{R0-R12,PC}^
20380
20390 \ multiply two matrices
20400 \ R0 points to result matrix
20410 \ R1 points to pre-transforming matrix
20420 \ R2 points to initial matrix
20430 .multiply
20440 STMFD R13!,{R0-R12,R14}
20450 STR R13,r13sto
20460
20470 LDMIA R2,{R3-R11}
20480 STMIA R0,{R3-R11}
20490
20500 MOV R12,R0
20510 LDMIA R1,{R0-R8}
20520
20530 MOV R14,#3
20540 .multloop
20550
20560 LDMIA R12,{R9-R11}
20570
20580 MUL R13,R9,R0
20590 MLA R13,R10,R3,R13
20600 MLA R13,R11,R6,R13
20610 MOV R13,R13,ASR #15
20620 STR R13,[R12],#4
20630
20640 MUL R13,R9,R1
20650 MLA R13,R10,R4,R13
20660 MLA R13,R11,R7,R13
20670 MOV R13,R13,ASR #15
20680 STR R13,[R12],#4
20690
20700 MUL R13,R9,R2
20710 MLA R13,R10,R5,R13
20720 MLA R13,R11,R8,R13
20730 MOV R13,R13,ASR #15
20740 STR R13,[R12],#4
20750
20760 SUBS R14,R14,#1
20770 BGT multloop
20780
20790 LDR R13,r13sto
20800 LDMFD R13!,{R0-R12,PC}^
20810
20820 \ Vector multiply with accumulate
20830 \ R0 points to output vector
20840 \ R1 points to multiplying vector
20850 \ R2 is multiplying scalar * 1024
20860 \ R3 points to initial vector
20870 .vectormla
20880 STMFD R13!,{R0-R12,R14}
20890
20900 LDMIA R3,{R3-R5}
20910 LDMIA R1,{R6-R8}
20920
20930 MUL R9,R2,R6
20940 ADD R3,R3,R9,ASR #10
20950 MUL R9,R2,R7
20960 ADD R4,R4,R9,ASR #10
20970 MUL R9,R2,R8
20980 ADD R5,R5,R9,ASR #10
20990
21000 STMIA R0,{R3-R5}
21010
21020 LDMFD R13!,{R0-R12,PC}^
21030
21040 .readvduinput
21050 EQUD 148 \ screen start - vdu drivers
21060 EQUD -1
21070
21080 .readvduoutput
21090 EQUD 0
21100
21110 .curplotbank
21120 EQUD 0
21130
21140 REM wait for vsync then swap over screens and note new plot address
21150 .changeframe
21160 STMFD R13!,{R0-R12,R14}
21170
21180 MOV R0,#&B0
21190 MOV R1,#0
21200 MOV R2,#&FF
21210 SWI "OS_Byte"
21220 CMP R1,#255-2
21230 BLE overload
21240
21250 .idleloop
21260 MOV R0,#&B0
21270 MOV R1,#0
21280 MOV R2,#&FF
21290 SWI "OS_Byte"
21300 CMP R1,#255-2
21310 BNE idleloop \ wait for vsync when counter crosses 255-2 ie 2 frames
21320
21330 .overload
21340
21350 MOV R0,#&B0
21360 MOV R1,#255
21370 MOV R2,#0
21380 SWI "OS_Byte"
21390
21400 LDR R3,curplotbank
21410 MOV R1,R3
21420 MOV R0,#&71
21430 SWI "OS_Byte"
21440 RSB R1,R3,#3
21450 STR R1,curplotbank
21460 MOV R0,#&70
21470 SWI "OS_Byte" \ swap screens
21480
21490 ADR R0,readvduinput
21500 ADR R1,readvduoutput
21510 SWI "OS_ReadVduVariables"
21520 LDR R0,readvduoutput
21530 LDR R1,plotscreenindfs
21540 STR R0,[R1] \ get plot address
21550
21560 LDR R8,colfade
21570 ADR R14,col1
21580 LDR R7,[R14,#12]
21590 MUL R7,R8,R7
21600 MOV R7,R7,ASR #8
21610 STR R7,[R14,#12]
21620 MOV R7,R7,ASR #8
21630 LDMIA R14,{R1-R3}
21640 MUL R1,R7,R1
21650 MUL R2,R7,R2
21660 MUL R3,R7,R3 \ colour 1
21670
21680 ADR R14,col2
21690 LDR R7,[R14,#12]
21700 MUL R7,R8,R7
21710 MOV R7,R7,ASR #8
21720 STR R7,[R14,#12]
21730 MOV R7,R7,ASR #8
21740 LDMIA R14,{R4-R6}
21750 MUL R4,R7,R4
21760 MUL R5,R7,R5
21770 MUL R6,R7,R6 \ colour 2
21780
21790 ADR R12,cctab
21800 MOV R11,#5
21810 MOV R8,#0
21820 .udouter
21830 LDR R10,[R12,R8,LSL #2]
21840 CMP R8,#0
21850 MOVNE R7,#0
21860 MOVEQ R7,#1
21870 .udinner
21880 LDR R9,[R12,R7,LSL #2]
21890
21900 SWI &100+19 \ VDU 19,
21910
21920 MOV R0,R11
21930 SWI "OS_WriteC" \ n,
21940
21950 SWI &100+16 \ 16,
21960
21970 MUL R0,R1,R9
21980 MLA R0,R4,R10,R0
21990 MOV R0,R0,ASR #16
22000 SWI "OS_WriteC" \ red,
22010
22020 MUL R0,R2,R9
22030 MLA R0,R5,R10,R0
22040 MOV R0,R0,ASR #16
22050 SWI "OS_WriteC" \ green,
22060
22070 MUL R0,R3,R9
22080 MLA R0,R6,R10,R0
22090 MOV R0,R0,ASR #16
22100 SWI "OS_WriteC" \ blue
22110
22120 ADD R11,R11,#1
22130 ADD R7,R7,#1
22140 CMP R7,#3
22150 BLT udinner
22160 ADD R8,R8,#1
22170 CMP R8,#3
22180 BLT udouter
22190
22200 LDMFD R13!,{R0-R12,PC}^
22210
22220 .plotscreenindfs
22230 EQUD plotscreenbase
22240
22250 .colfade
22260 EQUD 256 \ rate of fade*256
22270
22280 .col1
22290 EQUD 0 \ red
22300 EQUD 0 \ green
22310 EQUD 0 \ blue
22320 EQUD 0 \ brightness
22330
22340 .col2
22350 EQUD 0 \ red
22360 EQUD 0 \ green
22370 EQUD 0 \ blue
22380 EQUD 0 \ brightness
22390
22400 \ dancing and lighting control routine
22410 .control
22420 STMFD R13!,{R0-R12,R14}
22430
22440 LDR R2,mstore
22450 ADD R2,R2,#1
22460 STR R2,mstore
22470
22480 LDR R3,nstore
22490 SWI "Tracker_ReadPos"
22500 STR R1,nstore \ R0=K, R1=N
22510
22520 CMP R0,#14
22530 BLEQ turnoff
22540
22550 CMP R1,R3
22560 LDMEQFD R13!,{R0-R12,PC} \ no new event
22570
22580 STR R0,kstore
22590
22600 MOV R2,#0
22610 STR R2,mstore
22620
22630 CMP R0,#1
22640 CMPEQ R1,#0
22650 ADREQ R2,col1
22660 BLEQ dimglow
22670
22680 CMP R0,#1
22690 CMPEQ R1,#56
22700 MOVEQ R2,#240
22710 STREQ R2,colfade
22720
22730 CMP R0,#0
22740 MOVEQ R2,#256
22750 STREQ R2,colfade
22760
22770 CMP R0,#20
22780 MOVEQ R2,#253
22790 STREQ R2,colfade
22800
22810 CMP R0,#2
22820 LDMLTFD R13!,{R0-R12,PC}^ \ K<2
22830
22840 CMP R0,#5
22850 CMPNE R0,#6
22860 CMPNE R0,#14
22870 CMPNE R0,#15
22880 CMPNE R0,#18
22890 CMPNE R0,#19
22900 TSTEQ R1,#15
22910 ADREQ R2,sseq2
22920 STREQ R2,curseq
22930 MOVEQ R2,#3
22940 STREQ R2,staroffset \ circle stars
22950
22960 CMP R0,#7
22970 CMPNE R0,#8
22980 CMPNE R0,#16
22990 CMPNE R0,#17
23000 TSTEQ R1,#15
23010 ADREQ R2,sseq1
23020 STREQ R2,curseq
23030 MOVEQ R2,#3
23040 STREQ R2,staroffset \ bouncy stars
23050
23060 CMP R0,#0
23070 CMPNE R0,#9
23080 CMPNE R0,#20
23090 TSTEQ R1,#15
23100 MOVEQ R2,#0
23110 STREQ R2,curseq \ stationary
23120
23130 CMP R0,#20
23140 LDMEQFD R13!,{R0-R12,PC}^ \ K=20
23150
23160 CMP R0,#14
23170 BNE nostrobe
23180 LDR R6,mstore
23190 MOV R3,#0
23200 ADR R2,col1
23210 BL newcolour
23220 CMP R6,#0
23230 BLEQ flash
23240 ADR R2,col2
23250 BL newcolour
23260 CMP R6,#0
23270 BLEQ flash
23280 B strobe
23290 .nostrobe
23300
23310 AND R2,R1,#3
23320 CMP R2,#0
23330 ADREQ R2,col1
23340 LDR R3,curcol1
23350 BLEQ newcolour
23360 BLEQ flash
23370
23380 AND R2,R1,#3
23390 CMP R2,#2
23400 ANDNE R2,R1,#7
23410 CMPNE R2,#0
23420 ADREQ R2,col2
23430 LDR R3,curcol2
23440 BLEQ newcolour
23450 BLEQ flash
23460
23470 .strobe
23480
23490 CMP R0,#11
23500 CMPNE R0,#13
23510 BNE norepeat
23520 ADD R2,R1,#1
23530 TST R2,#15
23540 BNE norepeat
23550 MOV R2,R2,ASR #4
23560 AND R2,R2,#3
23570 ADR R3,currepqcind
23580 LDR R4,[R3]
23590 STR R2,[R3,R4]
23600 .norepeat \ multiple images
23610
23620 CMP R0,#12
23630 CMPNE R0,#13
23640 MOVNE R2,#0
23650 MOVEQ R2,#1
23660 STR R2,linetype
23670
23680 LDMFD R13!,{R0-R12,PC}^
23690
23700 .currepqcind
23710 EQUD currepq-P%
23720
23730 .curcol1
23740 EQUD 0
23750
23760 .curcol2
23770 EQUD 1
23780
23790 .sseq1
23800 EQUD INT(32*COS(0*PI/12))+INT(24*SIN(0*PI/12))*320
23810 EQUD INT(32*COS(1*PI/12))+INT(24*SIN(1*PI/12))*320
23820 EQUD INT(32*COS(2*PI/12))+INT(24*SIN(2*PI/12))*320
23830 EQUD INT(32*COS(3*PI/12))+INT(24*SIN(3*PI/12))*320
23840 EQUD INT(32*COS(4*PI/12))+INT(24*SIN(4*PI/12))*320
23850 EQUD INT(32*COS(5*PI/12))+INT(24*SIN(5*PI/12))*320
23860 EQUD INT(32*COS(6*PI/12))+INT(24*SIN(6*PI/12))*320
23870 EQUD INT(32*COS(7*PI/12))+INT(24*SIN(7*PI/12))*320
23880 EQUD INT(32*COS(8*PI/12))+INT(24*SIN(8*PI/12))*320
23890 EQUD INT(32*COS(9*PI/12))+INT(24*SIN(9*PI/12))*320
23900 EQUD INT(32*COS(10*PI/12))+INT(24*SIN(10*PI/12))*320
23910 EQUD INT(32*COS(11*PI/12))+INT(24*SIN(11*PI/12))*320
23920 EQUD INT(32*COS(12*PI/12))+INT(24*SIN(12*PI/12))*320
23930 EQUD INT(32*COS(11*PI/12))+INT(24*SIN(11*PI/12))*320
23940 EQUD INT(32*COS(10*PI/12))+INT(24*SIN(10*PI/12))*320
23950 EQUD INT(32*COS(9*PI/12))+INT(24*SIN(9*PI/12))*320
23960 EQUD INT(32*COS(8*PI/12))+INT(24*SIN(8*PI/12))*320
23970 EQUD INT(32*COS(7*PI/12))+INT(24*SIN(7*PI/12))*320
23980 EQUD INT(32*COS(6*PI/12))+INT(24*SIN(6*PI/12))*320
23990 EQUD INT(32*COS(5*PI/12))+INT(24*SIN(5*PI/12))*320
24000 EQUD INT(32*COS(4*PI/12))+INT(24*SIN(4*PI/12))*320
24010 EQUD INT(32*COS(3*PI/12))+INT(24*SIN(3*PI/12))*320
24020 EQUD INT(32*COS(2*PI/12))+INT(24*SIN(2*PI/12))*320
24030 EQUD INT(32*COS(1*PI/12))+INT(24*SIN(1*PI/12))*320
24040
24050 .sseq2
24060 EQUD INT(10*COS(0*PI/6))+INT(11*SIN(0*PI/6))*320
24070 EQUD INT(10*COS(1*PI/6))+INT(11*SIN(1*PI/6))*320
24080 EQUD INT(10*COS(2*PI/6))+INT(11*SIN(2*PI/6))*320
24090 EQUD INT(10*COS(3*PI/6))+INT(11*SIN(3*PI/6))*320
24100 EQUD INT(10*COS(4*PI/6))+INT(11*SIN(4*PI/6))*320
24110 EQUD INT(10*COS(5*PI/6))+INT(11*SIN(5*PI/6))*320
24120 EQUD INT(10*COS(6*PI/6))+INT(11*SIN(6*PI/6))*320
24130 EQUD INT(10*COS(7*PI/6))+INT(11*SIN(7*PI/6))*320
24140 EQUD INT(10*COS(8*PI/6))+INT(11*SIN(8*PI/6))*320
24150 EQUD INT(10*COS(9*PI/6))+INT(11*SIN(9*PI/6))*320
24160 EQUD INT(10*COS(10*PI/6))+INT(11*SIN(10*PI/6))*320
24170 EQUD INT(10*COS(11*PI/6))+INT(11*SIN(11*PI/6))*320
24180 EQUD INT(10*COS(0*PI/6))+INT(11*SIN(0*PI/6))*320
24190 EQUD INT(10*COS(1*PI/6))+INT(11*SIN(1*PI/6))*320
24200 EQUD INT(10*COS(2*PI/6))+INT(11*SIN(2*PI/6))*320
24210 EQUD INT(10*COS(3*PI/6))+INT(11*SIN(3*PI/6))*320
24220 EQUD INT(10*COS(4*PI/6))+INT(11*SIN(4*PI/6))*320
24230 EQUD INT(10*COS(5*PI/6))+INT(11*SIN(5*PI/6))*320
24240 EQUD INT(10*COS(6*PI/6))+INT(11*SIN(6*PI/6))*320
24250 EQUD INT(10*COS(7*PI/6))+INT(11*SIN(7*PI/6))*320
24260 EQUD INT(10*COS(8*PI/6))+INT(11*SIN(8*PI/6))*320
24270 EQUD INT(10*COS(9*PI/6))+INT(11*SIN(9*PI/6))*320
24280 EQUD INT(10*COS(10*PI/6))+INT(11*SIN(10*PI/6))*320
24290 EQUD INT(10*COS(11*PI/6))+INT(11*SIN(11*PI/6))*320
24300
24310 .plottabind
24320 EQUD plottab
24330
24340 \ Log line in the plot list
24350 \ R0 points to A
24360 \ R1 points to direction
24370 \ R2 = length
24380 .logline
24390 STMFD R13!,{R0-R12,R14}
24400
24410 LDR R11,plottabq
24420 LDR R12,plottabind
24430 ADD R12,R12,R11,LSL #6 \ get pos in table
24440
24450 MOV R3,#0 \ line
24460 LDMIA R0,{R4-R6} \ A
24470 LDMIA R1,{R7-R9} \ direction
24480 MOV R10,R2 \ length
24490 MUL R2,R9,R10
24500 ADD R2,R6,R2,ASR #1 \ average z
24510 SUB R2,R2,#1280 \ minus half a unit
24520 STMIA R12,{R2-R10} \ store whole lot
24530
24540 ADD R11,R11,#1
24550 STR R11,plottabq \ store new quantity
24560
24570 LDMFD R13!,{R0-R12,PC}^
24580
24590 \ Log bungie line in the plot list
24600 \ R0 points to A
24610 \ R1 points to direction
24620 \ R2 = length
24630 .logbungieline
24640 STMFD R13!,{R0-R12,R14}
24650
24660 LDR R11,plottabq
24670 LDR R12,plottabind
24680 ADD R12,R12,R11,LSL #6 \ get pos in table
24690
24700 MOV R3,#2 \ bungie line
24710 LDMIA R0,{R4-R6} \ A
24720 LDMIA R1,{R7-R9} \ direction
24730 MOV R10,R2 \ length
24740 MUL R2,R9,R10
24750 ADD R2,R6,R2,ASR #1 \ average z
24760 STMIA R12,{R2-R10} \ store whole lot
24770
24780 ADD R11,R11,#1
24790 STR R11,plottabq \ store new quantity
24800
24810 LDMFD R13!,{R0-R12,PC}^
24820
24830 \ Log sphere in the plot list
24840 \ R0 points to position
24850 \ R1 = size (0-13)
24860 .logsphere
24870 STMFD R13!,{R0-R12,R14}
24880
24890 LDR R11,plottabq
24900 LDR R12,plottabind
24910 ADD R12,R12,R11,LSL #6 \ get pos in table
24920
24930 MOV R3,#1 \ sphere
24940 LDMIA R0,{R4-R6} \ position
24950 MOV R7,R1 \ size
24960 MOV R2,R6
24970 STMIA R12,{R2-R7} \ store whole lot
24980
24990 ADD R11,R11,#1
25000 STR R11,plottabq \ store new quantity
25010
25020 LDMFD R13!,{R0-R12,PC}^
25030
25040 \ Log head in the plot list
25050 \ R0 points to position
25060 \ R1 = expression
25070 .loghead
25080 STMFD R13!,{R0-R12,R14}
25090
25100 LDR R11,plottabq
25110 LDR R12,plottabind
25120 ADD R12,R12,R11,LSL #6 \ get pos in table
25130
25140 MOV R3,#3 \ head
25150 LDMIA R0,{R4-R6} \ position
25160 MOV R7,R1 \ expression
25170 MOV R2,R6
25180 STMIA R12,{R2-R7} \ store whole lot
25190
25200 ADD R11,R11,#1
25210 STR R11,plottabq \ store new quantity
25220
25230 LDMFD R13!,{R0-R12,PC}^
25240
25250 \ display contents of plot list in revese order of distance
25260 .display
25270 STMFD R13!,{R0-R12,R14}
25280
25290 LDR R10,plottabq
25300
25310 .douter
25320 LDR R12,plottabind
25330 LDR R11,plottabq
25340 MVN R9,#NOT (-&1000001)
25350
25360 .dinner
25370 LDR R0,[R12],#64
25380 CMP R0,R9
25390 MOVGE R9,R0
25400 SUBGE R8,R12,#64
25410 SUBS R11,R11,#1
25420 BGT dinner \ loop to find farthest away item
25430
25440 LDR R9,[R8,#4]
25450 ADD R0,R8,#8
25460
25470 CMP R9,#0
25480 BLEQ line \ draw line
25490
25500 CMP R9,#1
25510 BLEQ gensphere \ draw sphere
25520
25530 CMP R9,#2
25540 BLEQ bungieline \ draw line with sphere at end point
25550
25560 CMP R9,#3
25570 BLEQ head \ draw big sphere
25580
25590 MVN R0,#NOT (-&1000001)
25600 STR R0,[R8,#0] \ set big negative value in distance to prevent
25610 \ item being plotted again
25620 SUBS R10,R10,#1
25630 BGT douter
25640
25650 LDMFD R13!,{R0-R12,PC}^
25660
25670 .plottabq
25680 EQUD 0
25690
25700 .sincostabind
25710 EQUD sincostab
25720
25730 .spinningspheres
25740 STMFD R13!,{R14}
25750
25760 LDR R11,sincostabind
25770 ADD R12,R11,#1024
25780 ADR R9,tempvector
25790
25800 LDR R6,sphereheight+0
25810 LDR R1,sphereheight+4
25820 ADD R6,R6,R1
25830 CMP R6,#32768
25840 MVNGE R1,R1
25850 CMP R6,#0
25860 MVNLT R1,R1
25870 STR R6,sphereheight+0
25880 STR R1,sphereheight+4
25890
25900 ADR R8,spheredata
25910 MOV R7,#6
25920
25930 .spinningloop
25940 LDR R10,[R8,#0]
25950 SUB R10,R10,#1
25960 STR R10,[R8,#0]
25970 AND R10,R10,#255
25980 LDR R0,[R11,R10,LSL #2]
25990 SUB R0,R0,R0,ASR #2
26000 CMP R7,#3
26010 MOVGT R1,R6
26020 RSBLE R1,R6,#32768
26030 LDR R2,[R12,R10,LSL #2]
26040 SUB R2,R2,R2,ASR #2
26050 STMIA R9,{R0-R2}
26060
26070 MOV R0,R9
26080 LDR R1,torsotransind
26090 MOV R2,R9
26100 BL transform
26110
26120 LDR R1,[R8,#4]
26130 LDR R2,[R8,#8]
26140 ADD R1,R1,R2
26150 CMP R1,#13
26160 MOVEQ R1,#11
26170 MVNEQ R2,#NOT -1
26180 CMP R1,#2
26190 MOVEQ R1,#4
26200 MOVEQ R2,#+1
26210 STR R1,[R8,#4]
26220 STR R2,[R8,#8]
26230 BL logsphere
26240
26250 ADD R8,R8,#12
26260 SUBS R7,R7,#1
26270 BGT spinningloop
26280
26290 LDMFD R13!,{PC}^
26300
26310 .sphereheight
26320 EQUD 0
26330 EQUD 300
26340
26350 .spheredata
26360 EQUD 0 \ angle
26370 EQUD 3 \ size
26380 EQUD +1 \ increment
26390
26400 EQUD 85 \ angle
26410 EQUD 9 \ size
26420 EQUD +1 \ increment
26430
26440 EQUD 170 \ angle
26450 EQUD 9 \ size
26460 EQUD -1 \ increment
26470
26480 EQUD 43 \ angle
26490 EQUD 3 \ size
26500 EQUD -1 \ increment
26510
26520 EQUD 128 \ angle
26530 EQUD 9 \ size
26540 EQUD -1 \ increment
26550
26560 EQUD 213 \ angle
26570 EQUD 9 \ size
26580 EQUD +1 \ increment
26590
26600 .torsotransind
26610 EQUD torsotrans
26620
26630 .tempvector
26640 EQUD 0
26650 EQUD 0
26660 EQUD 0
26670
26680 .gplotscreenind
26690 EQUD plotscreenbase
26700
26710 \ Draw digital waveform graph
26720 \ R0 = base address of sample
26730 \ R1 = offset into sample*65536
26740 \ R2 = phase increment*65536
26750 \ R3 = pointer to graph orientation and screen position
26760 .graph
26770 STMFD R13!,{R0-R12,R14}
26780
26790 MOV R14,R3
26800 ADD R0,R0,R1,LSR #16 \ address of data to plot
26810 LDR R1,[R14,#36]
26820 MOV R12,R1,LSL #23
26830 LDR R1,[R14,#40]
26840 SUB R12,R12,R1,LSL #8 \ position of origin ( -> time axis)
26850 LDR R5,gplotscreenind
26860 LDR R5,[R5] \ address of screen
26870 MOV R6,#&11 \ byte for axes
26880 MOV R7,#&22 \ byte for points
26890 LDR R1,[R14,#0]
26900 MOV R1,R1,ASR #8
26910 MOV R8,R1,LSL #16
26920 LDR R1,[R14,#12]
26930 SUB R8,R8,R1,ASR #7 \ time axis increment
26940 SUB R12,R12,R8,LSL #5
26950 SUB R12,R12,R8,LSL #4
26960 LDR R1,[R14,#4]
26970 SUB R1,R1,R1,ASR #2
26980 MOV R1,R1,ASR #8
26990 MOV R9,R1,LSL #16
27000 LDR R1,[R14,#16]
27010 SUB R9,R9,R1,ASR #7 \ volume axis increment
27020 SUB R12,R12,R9,LSL #4
27030 SUB R12,R12,R9,LSL #3
27040 MOV R11,#96 \ number of points
27050 MOV R3,#&3F \ mask for sample bit isolation
27060 MOV R4,R12
27070
27080 .gloop
27090 LDR R1,[R0],#4
27100 AND R2,R4,#&FF00
27110 ADD R2,R2,R2,LSR #2
27120 ADD R2,R2,R4,LSR #23
27130 STRB R6,[R5,R2]
27140 AND R2,R3,R1,LSR #2
27150 MLA R10,R9,R2,R4
27160 AND R2,R10,#&FF00
27170 ADD R2,R2,R2,LSR #2
27180 ADD R2,R2,R10,LSR #23
27190 STRB R7,[R5,R2]
27200 ADD R4,R4,R8
27210 AND R2,R4,#&FF00
27220 ADD R2,R2,R2,LSR #2
27230 ADD R2,R2,R4,LSR #23
27240 STRB R6,[R5,R2]
27250 AND R2,R3,R1,LSR #10
27260 MLA R10,R9,R2,R4
27270 AND R2,R10,#&FF00
27280 ADD R2,R2,R2,LSR #2
27290 ADD R2,R2,R10,LSR #23
27300 STRB R7,[R5,R2]
27310 ADD R4,R4,R8
27320 AND R2,R4,#&FF00
27330 ADD R2,R2,R2,LSR #2
27340 ADD R2,R2,R4,LSR #23
27350 STRB R6,[R5,R2]
27360 AND R2,R3,R1,LSR #18
27370 MLA R10,R9,R2,R4
27380 AND R2,R10,#&FF00
27390 ADD R2,R2,R2,LSR #2
27400 ADD R2,R2,R10,LSR #23
27410 STRB R7,[R5,R2]
27420 ADD R4,R4,R8
27430 AND R2,R4,#&FF00
27440 ADD R2,R2,R2,LSR #2
27450 ADD R2,R2,R4,LSR #23
27460 STRB R6,[R5,R2]
27470 AND R2,R3,R1,LSR #26
27480 MLA R10,R9,R2,R4
27490 AND R2,R10,#&FF00
27500 ADD R2,R2,R2,LSR #2
27510 ADD R2,R2,R10,LSR #23
27520 STRB R7,[R5,R2]
27530 ADD R4,R4,R8
27540 SUBS R11,R11,#4
27550 BGT gloop
27560
27570 MOV R4,R12 \ position of origin ( -> time axis)
27580 MOV R11,#64 \ number of points
27590
27600 .gloop0
27610 AND R2,R4,#&FF00
27620 ADD R2,R2,R2,LSR #2
27630 ADD R2,R2,R4,LSR #23
27640 STRB R6,[R5,R2]
27650 ADD R4,R4,R9
27660 AND R2,R4,#&FF00
27670 ADD R2,R2,R2,LSR #2
27680 ADD R2,R2,R4,LSR #23
27690 STRB R6,[R5,R2]
27700 ADD R4,R4,R9
27710 SUBS R11,R11,#2
27720 BGT gloop0
27730
27740
27750 LDMFD R13!,{R0-R12,PC}^
27760
27770 .drawgraphs
27780 STMFD R13!,{R0-R12,R14}
27790
27800 LDR R8,kstore
27810 CMP R8,#2
27820 LDMLTFD R13!,{R0-R12,PC}^
27830 CMP R8,#10
27840 BLT notmusical
27850 CMP R8,#14
27860 LDMLTFD R13!,{R0-R12,PC}^
27870 .notmusical
27880
27890 ADR R12,soundinfotab
27900 MOV R0,R12
27910 SWI "Tracker_SoundInfo"
27920 MOV R11,#4
27930 ADR R3,graphpostab
27940 LDR R9,sincostabind
27950 ADD R10,R9,#1024
27960 ADR R7,spinlist
27970
27980 .dgloop
27990 LDRB R0,[R3,#44]
28000 LDR R1,[R9,R0,LSL #2]
28010 MOV R2,#104
28020 MUL R1,R2,R1
28030 MOV R1,R1,ASR #15
28040 ADD R1,R1,#160
28050 STR R1,[R3,#36]
28060 LDR R1,[R10,R0,LSL #2]
28070 MOV R2,#70
28080 MUL R1,R2,R1
28090 MOV R1,R1,ASR #15
28100 ADD R1,R1,#128
28110 STR R1,[R3,#40]
28120 ADD R0,R0,#3
28130 STRB R0,[R3,#44]
28140
28150 CMP R8,#5
28160 BLT nofunkyrot
28170
28180 MOV R0,R3
28190 LDRB R1,[R3,#45]
28200 LDR R1,[R7,R1,LSL #2]
28210 MOV R2,R3
28220 BL multiply
28230 .nofunkyrot
28240
28250 CMP R8,#2
28260 LDREQ R0,identityind
28270 STMEQFD R13!,{R4-R9}
28280 LDMEQIA R0,{R0-R2,R4-R9}
28290 STMEQIA R3,{R0-R2,R4-R9}
28300 LDMEQFD R13!,{R4-R9}
28310
28320 LDR R0,[R12,#16]
28330 CMP R0,#0
28340 BEQ nullsample
28350 SUB R0,R0,#1
28360 ADR R1,sampleaddrtab
28370 LDR R0,[R1,R0,LSL #2]
28380 LDMIA R12,{R1,R2}
28390 LDR R4,[R12,#24]
28400 CMP R4,#0
28410 BGT oksample
28420 .nullsample
28430 LDR R0,nullsampletabind
28440 MOV R1,#0
28450 MOV R2,#0
28460 .oksample
28470 BL graph
28480 ADD R3,R3,#48
28490 ADD R12,R12,#32
28500 SUBS R11,R11,#1
28510 BGT dgloop
28520
28530 LDMFD R13!,{R0-R12,PC}^
28540
28550 .spinlist
28560 EQUD spin1
28570 EQUD spin2
28580 EQUD spin3
28590 EQUD spin1b
28600 EQUD spin2b
28610 EQUD spin3b
28620
28630 .nullsampletabind
28640 EQUD nullsampletab
28650
28660 .identityind
28670 EQUD identity
28680
28690 .graphpostab
28700 EQUD 32768:EQUD 0:EQUD 0
28710 EQUD 0:EQUD 32768:EQUD 0
28720 EQUD 0:EQUD 0:EQUD 32768
28730 EQUD 160:EQUD 64:EQUB 0
28740 EQUB 0:ALIGN
28750
28760 EQUD 32768:EQUD 0:EQUD 0
28770 EQUD 0:EQUD 32768:EQUD 0
28780 EQUD 0:EQUD 0:EQUD 32768
28790 EQUD 240:EQUD 128:EQUB 64
28800 EQUB 0:ALIGN
28810
28820 EQUD 32768:EQUD 0:EQUD 0
28830 EQUD 0:EQUD 32768:EQUD 0
28840 EQUD 0:EQUD 0:EQUD 32768
28850 EQUD 160:EQUD 192:EQUB 128
28860 EQUB 0:ALIGN
28870
28880 EQUD 32768:EQUD 0:EQUD 0
28890 EQUD 0:EQUD 32768:EQUD 0
28900 EQUD 0:EQUD 0:EQUD 32768
28910 EQUD 80:EQUD 128 :EQUB 192
28920 EQUB 0:ALIGN
28930
28940 ]
28950
28960 sampleaddrtab=P%
28970 P%+=128
28980
28990 soundinfotab=P%
29000 P%+=256
29010
29020 plottab=P%
29030 P%+=2048
29040 REM type line sphere bline head
29050 REM base+0 = effective average distance for all types
29060 REM base+4 = 0 1 2 3
29070 REM base+8 = xA x xA x
29080 REM base+12 = yA y yA y
29090 REM base+16 = zA z zA z
29100 REM base+20 = xx size xx expr.
29110 REM base+24 = yy yy
29120 REM base+28 = zz zz
29130 REM base+32 = length length
29140
29150 startab=P%
29160 P%+=512
29170
29180 sincostab=P%
29190 P%+=2048
29200
29210 nullsampletab=P%
29220 P%+=128
29230
29240 NEXT pass%
29250
29260 FOR N%=0 TO 511 STEP 4
29270 startab!N%=RND(81920)-1
29280 NEXT
29290
29300 FOR N%=0 TO 1023 STEP 4
29310 sincostab!(N%+0)=32768*SIN(N%*2*PI/1024)
29320 sincostab!(N%+1024)=32768*COS(N%*2*PI/1024)
29330 NEXT
29340
29350 FOR N%=0 TO 127
29360 nullsampletab?N%=128
29370 NEXT
29380
29390 !spritefilebase=sprites
29400ENDPROC
29410
� > !FunkyDemo.!RunMain
� (C) JSG 1992
( � � �
2
È 8
< �12
F � 4,0,0,0
P
� 4+128
Z �
d *SPEAKER OFF
n *KEY 1 " |MTWINO8|M"
x � 19,0,24,32,32,32
��
�
�� code 32768
�� sprites 81920
�� plotspriteacode(7,3)
�� rgval(2),bval(2)
�
�rgval(0)=0
�rgval(1)=0.6
�rgval(2)=1
�
bval(0)=0
�bval(1)=0.3
�bval(2)=0.5
xorigin=320
yorigin=64
"cos%=32768*�(0.12)+0.5
,sin%=32768*�(0.12)+0.5
6
@
�assemble
J
T*�"LOAD <Funky$Dir>.Sprites "+�~sprites
^ș"Tracker_TuneInfo" � A
h� A=0 �
r *RMAFree 300K
|/ È™"Tracker_Load","<Funky$Dir>.GtRdyFrThs"
��
�
�� 3,255,255,255
�� 0
�� N%=0 � 127
� A%=startab!(N%<<2)
�' Ȓ (A% � 320)*4,1023-(A% � 320)*4
�) Ȓ (A% � 320)*4+2,1023-(A% � 320)*4
��
�
�� N=0 � 15
�$ � 7,192-N*12,192-N*12,192-N*12
� � 0,0,0,N*12
$ � 3,192-N*12,192-N*12,192-N*12
*FX 19
*FX 19
& *FX 19
0� N
:
D!curplotbank=1
N� 0,0,0,192
X� 1,192,0,0
b� 2,192,96,0
l� 3,64,128,48
v� C2%=1 � 2
�8 � 12+C2%,127*bval(C2%),127*bval(C2%),255*bval(C2%)
��
�� 15,255,255,255
�� 15
��setpalette(B0%,B1%)
�
�� N%=0 � 31
�D ș"Tracker_ReadSampleTable",N%+1 � ,,,,,,sampleaddrtab!(N%<<2)
��
�ș"Tracker_Stereo",1
�
�(A%=torsotrans:B%=spin1:C%=torsotrans
�$� multiply:� multiply:� multiply
� multiply
(A%=torsotrans:B%=spin3:C%=torsotrans
$� multiply:� multiply:� multiply
*E%=0
4� 15
>
H*FX 176,2,0
RÈ™"Tracker_SetPos",0,0
\È™"Tracker_Play"
f
p�
z � changeframe
� � clearscreen
� � control
� � update
� � drawgraphs
� � drawperson
�3 � �(12)=1 � !curcol1=�(10)-1:!curcol2=�(10)-1
�3 � �(6)=1 � graphpostab!(�(4)*48-48+45)=�(6)-1
� ȗ X%,Y%,B%
� � B% � 2 �
� *PLAYPAUSE
�" �:ȗ X%,Y%,B%:� (B% � 2)=0
�" �:ȗ X%,Y%,B%:� (B% � 2)=2
�" �:ȗ X%,Y%,B%:� (B% � 2)=0
*PLAYSTART
�
� B% � 4
$
.È™"Tracker_Pause"
8�0
B�
L
V� �setpalette(B0%,B1%)
` � C1%=0 � 2
j � C0%=0 � 2
t/ BR%=(B0%*rgval(C0%)+B1%*rgval(C1%))/2
~# � 4+3*C1%+C0%,BR%,BR%,BR%
� �
� �
��
�
�� �ROUND(A)
�=A+0.5*�(A)
�
�� �assemble
� � pass%=0 � 2 � 2
�
P%=code
� [OPT pass%
�
.currepqind
EQUD currepq-P%
.plotscreenind0
( EQUD plotscreenbase-P%
2
<L \ Plot Sprite size a (32*n mode 12) with implicit mask but no clipping
F \ Value 0 -> no plot
P* \ 1-3 -> (illegal do not use)
Z \ 4-15 -> plot pixel
d' \ R0 = X pos of centre (internal)
n' \ R1 = Y pos of centre (internal)
x* \ R2 = number of lines in sprite (n)
�2 \ R3 = address of sprite data (word aligned)
� .plotspritea
� STMFD R13!,{R0-R12,R14}
�
� ADR R10,currepqind
� LDR R12,[R10]
� LDR R10,[R12,R10]
� CMP R10,#1
� BEQ psa1
� CMP R10,#2
� BEQ psa2
� CMP R10,#3
� BEQ psa3
@ MOV R10,R3 \ R10 = address of sprite data
"9 MOV R11,R2 \ R11 = number of lines
,
6 SUB R0,R0,#16
@7 SUB R1,R1,R11,ASR #1 \ get top left corner
J
T CMN R0,#1
^ CMNGT R1,R11
h LDMLEFD R13!,{R0-R12,PC}^
r CMP R0,#640-32
| CMPLE R1,#256-1
�@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
�
� CMP R1,#0
� ADDLT R11,R11,R1
� SUBLT R10,R10,R1,LSL #4
�, MOVLT R1,#0 \ trim top
�
� RSB R4,R1,#256
� CMP R11,R4
�/ MOVGT R11,R4 \ trim bottom
�
� ADR R9,plotscreenind0
� LDR R12,[R9]
LDR R9,[R9,R12]
ADD R9,R9,R1,LSL #8
ADD R9,R9,R1,LSL #6
& BIC R1,R0,#7
0N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
:
D MOV R12,#%1000
N �R R12,R12,R12,LSL #16
X �R R12,R12,R12,LSL #8
bH �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit
l
v � R1,R0,#7
� ADR R0,caselist
�R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
� ADR R1,base
� ADD PC,R0,R1
�
� .caselist
� ]
� � N%=0 � 7
� [OPT pass%
�* EQUD plotspriteacode(N%,0)-base
� ]
�
� N%
� [OPT pass%
.base
]
� N%=0 � 7
shiftleft = N%*4
* shiftright = 32-N%*4
45 [OPT pass% \ do 8 compilations
>
H; .plotspriteacode(N%,0) \ doubles as loop start
R LDMIA R10!,{R0-R3}
\
f LDMIA R9,{R4-R8}
p
z ]
� � M%=0 � 3
� Rdata = M%
� Rcurword = M%+4
� Rnextword = M%+5
�5 [OPT pass% \ for four words...
�
�' �R R14,Rdata,Rdata,LSL #1
� � R14,R12,R14
�# �R R14,R14,R14,LSR #2
�# �R R14,R14,R14,LSR #1
�6 BIC Rcurword,Rcurword,R14,LSL #shiftleft
�7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft
�9 BIC Rnextword,Rnextword,R14,LSR #shiftright
: �R Rnextword,Rnextword,Rdata,LSR #shiftright
]
� M%
$ [OPT pass%
.
8 STMIA R9,{R4-R8}
B ADD R9,R9,#320
L
V SUBS R11,R11,#1
`% BGT plotspriteacode(N%,0)
j
t! LDMFD R13!,{R0-R12,PC}^
~
� ]
�
� N%
� [OPT pass%
�
� .plotscreenind1
� EQUD plotscreenbase-P%
�
� .psa1
�@ MOV R10,R3 \ R10 = address of sprite data
�
�9 MOV R11,R2,ASR #1 \ R11 = number of lines
�
SUB R0,R0,#16
MOV R1,R1,ASR #1
7 SUB R1,R1,R11,ASR #1 \ get top left corner
( CMN R0,#1
2 CMNGT R1,R11
< LDMLEFD R13!,{R0-R12,PC}^
F CMP R0,#640-32
P CMPLE R1,#256-1
Z@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
d
n CMP R1,#0
x ADDLT R11,R11,R1
� SUBLT R10,R10,R1,LSL #4
�, MOVLT R1,#0 \ trim top
�
� RSB R4,R1,#256
� CMP R11,R4
�/ MOVGT R11,R4 \ trim bottom
�
� ADR R9,plotscreenind1
� LDR R12,[R9]
� LDR R9,[R9,R12]
� ADD R9,R9,R1,LSL #8
� ADD R9,R9,R1,LSL #6
� BIC R1,R0,#7
N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
MOV R12,#%1000
" �R R12,R12,R12,LSL #16
, �R R12,R12,R12,LSL #8
6H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit
@
J � R1,R0,#7
T ADR R0,caselist1
^R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
h ADR R1,base1
r ADD PC,R0,R1
|
� .caselist1
� ]
� � N%=0 � 7
� [OPT pass%
�+ EQUD plotspriteacode(N%,1)-base1
� ]
�
� N%
� [OPT pass%
� .base1
� ]
� � N%=0 � 7
� shiftleft = N%*4
� shiftright = 32-N%*4
5 [OPT pass% \ do 8 compilations
9 .plotspriteacode(N%,1) \ doubles as loop start
& LDMIA R10,{R0-R3}
0 ADD R10,R10,#32
:
D LDMIA R9,{R4-R8}
N
X ]
b � M%=0 � 3
l Rdata = M%
v Rcurword = M%+4
� Rnextword = M%+5
�5 [OPT pass% \ for four words...
�
�' �R R14,Rdata,Rdata,LSL #1
� � R14,R12,R14
�# �R R14,R14,R14,LSR #2
�# �R R14,R14,R14,LSR #1
�6 BIC Rcurword,Rcurword,R14,LSL #shiftleft
�7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft
�9 BIC Rnextword,Rnextword,R14,LSR #shiftright
�: �R Rnextword,Rnextword,Rdata,LSR #shiftright
� ]
� � M%
[OPT pass%
STMIA R9,{R4-R8}
ADD R9,R9,#320
*
4 SUBS R11,R11,#1
>% BGT plotspriteacode(N%,1)
H
R! LDMFD R13!,{R0-R12,PC}^
\
f ]
p
� N%
z [OPT pass%
�
� .plotscreenind
� EQUD plotscreenbase-P%
�
� .psa2
�@ MOV R10,R3 \ R10 = address of sprite data
�
�9 MOV R11,R2,ASR #2 \ R11 = number of lines
�
� SUB R0,R0,#16
� SUB R0,R0,#160
� MOV R1,R1,ASR #2
�7 SUB R1,R1,R11,ASR #1 \ get top left corner
CMN R0,#1
CMNGT R1,R11
$ LDMLEFD R13!,{R0-R12,PC}^
. CMP R0,#640-32
8 CMPLE R1,#256-1
B@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
L
V CMP R1,#0
` ADDLT R11,R11,R1
j SUBLT R10,R10,R1,LSL #4
t, MOVLT R1,#0 \ trim top
~
� RSB R4,R1,#256
� CMP R11,R4
�/ MOVGT R11,R4 \ trim bottom
�
� ADR R9,plotscreenind
� LDR R12,[R9]
� LDR R9,[R9,R12]
� ADD R9,R9,R1,LSL #8
� ADD R9,R9,R1,LSL #6
� BIC R1,R0,#7
�N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
�
MOV R12,#%1000
�R R12,R12,R12,LSL #16
�R R12,R12,R12,LSL #8
H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit
(
2 � R1,R0,#7
< ADR R0,caselist2
FR LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
P ADR R1,base2
Z ADD PC,R0,R1
d
n .caselist2
x ]
� � N%=0 � 7
� [OPT pass%
�+ EQUD plotspriteacode(N%,2)-base2
� ]
�
� N%
� [OPT pass%
� .base2
� ]
� � N%=0 � 7
� shiftleft = N%*4
� shiftright = 32-N%*4
�5 [OPT pass% \ do 8 compilations
�
9 .plotspriteacode(N%,2) \ doubles as loop start
LDMIA R10,{R0-R3}
ADD R10,R10,#64
" LDMIA R9,{R4-R8}
,
6 ]
@ � M%=0 � 3
J Rdata = M%
T Rcurword = M%+4
^ Rnextword = M%+5
h5 [OPT pass% \ for four words...
r
|' �R R14,Rdata,Rdata,LSL #1
� � R14,R12,R14
�# �R R14,R14,R14,LSR #2
�# �R R14,R14,R14,LSR #1
�6 BIC Rcurword,Rcurword,R14,LSL #shiftleft
�7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft
�9 BIC Rnextword,Rnextword,R14,LSR #shiftright
�: �R Rnextword,Rnextword,Rdata,LSR #shiftright
� ]
� � M%
� [OPT pass%
�
� STMIA R9,{R4-R8}
� ADD R9,R9,#320
SUBS R11,R11,#1
% BGT plotspriteacode(N%,2)
&
0! LDMFD R13!,{R0-R12,PC}^
:
D ]
N
� N%
X [OPT pass%
b
l .psa3
v@ MOV R10,R3 \ R10 = address of sprite data
�
�9 MOV R11,R2,ASR #3 \ R11 = number of lines
�
� SUB R0,R0,#16
� SUB R0,R0,#160
� MOV R0,R0,ASR #1
� MOV R1,R1,ASR #3
�7 SUB R1,R1,R11,ASR #1 \ get top left corner
�
� CMN R0,#1
� CMNGT R1,R11
� LDMLEFD R13!,{R0-R12,PC}^
� CMP R0,#640-32
CMPLE R1,#256-1
@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites
CMP R1,#0
* ADDLT R11,R11,R1
4 SUBLT R10,R10,R1,LSL #4
>, MOVLT R1,#0 \ trim top
H
R RSB R4,R1,#256
\ CMP R11,R4
f/ MOVGT R11,R4 \ trim bottom
p
z LDR R9,plotscreenbase
� ADD R9,R9,R1,LSL #8
� ADD R9,R9,R1,LSL #6
� BIC R1,R0,#7
�N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting
�
� MOV R12,#%1000
� �R R12,R12,R12,LSL #16
� �R R12,R12,R12,LSL #8
�H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit
�
� � R1,R0,#7
� ADR R0,caselist3
�R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case
ADR R1,base3
ADD PC,R0,R1
$ .caselist3
. ]
8 � N%=0 � 7
B [OPT pass%
L+ EQUD plotspriteacode(N%,3)-base3
V ]
`
� N%
j [OPT pass%
t .base3
~ ]
� � N%=0 � 7
� shiftleft = N%*4
� shiftright = 32-N%*4
�5 [OPT pass% \ do 8 compilations
�
�9 .plotspriteacode(N%,3) \ doubles as loop start
� LDMIA R10,{R0-R3}
� ADD R10,R10,#128
� LDMIA R9,{R4-R8}
�
� ]
� � M%=0 � 1
Rdata = M%*2
Rcurword = M%+4
Rnextword = M%+5
5 [OPT pass% \ for four words...
(
2' �R R14,Rdata,Rdata,LSL #1
< � R14,R12,R14
F# �R R14,R14,R14,LSR #2
P# �R R14,R14,R14,LSR #1
Z6 BIC Rcurword,Rcurword,R14,LSL #shiftleft
d7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft
n9 BIC Rnextword,Rnextword,R14,LSR #shiftright
x: �R Rnextword,Rnextword,Rdata,LSR #shiftright
� ]
� � M%
� [OPT pass%
�
� STMIA R9,{R4-R8}
� ADD R9,R9,#320
�
� SUBS R11,R11,#1
�% BGT plotspriteacode(N%,3)
�
�! LDMFD R13!,{R0-R12,PC}^
�
� ]
� N%
[OPT pass%
" .plotscreenbase
, EQUD 0
6
@ .spritefilebase
J EQUD 0
T
^. \ Empty routine for timing test purposes
h .null
r MOV PC,R14
|
�
�. \ Fill screen area with colour bands etc
� .clearscreen
� STMFD R13!,{R0-R3,R14}
�
� MOV R0,#4
� MOV R1,#0
� LDR R3,currepq
�
� CMP R3,#0
� �Q R2,#256
� BLEQ fillsection
� CMP R3,#1
�Q R2,#128
BLEQ fillsection
CMP R3,#2
& �Q R2,#64
0 BLEQ fillsectionhalf
: CMP R3,#3
D �Q R2,#32
N BLEQ fillsectionquarter
X
b LDMFD R13!,{R0-R3,PC}^
l
v .currepq
� EQUD 0
�
�- \ Fill screen area with lots of sprites
� .repeatdata
� STMFD R13!,{R0-R12,R14}
�
� MOV R0,#4
� MOV R1,#0
� LDR R3,currepq
�
� CMP R3,#1
� BEQ rep1
� CMP R3,#2
BEQ rep2
CMP R3,#3
BEQ rep3
* LDMFD R13!,{R0-R12,PC}^
4
>
H0 \ Fill section of screen with given nibble
R \ R0 = Word to insert
\ \ R1 = Line to start at
f \ R2 = Number of lines
p .fillsection
z STMFD R13!,{R0-R12,R14}
�1 STR R13,r13sto \ save R13
�
� MOV R14,R2
�
� LDR R13,plotscreenbase
� ADD R13,R13,R1,LSL #8
�H ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
�
� � R0,R0,#%1111
� �R R0,R0,R0,LSL #4
� �R R0,R0,R0,LSL #8
�8 �R R0,R0,R0,LSL #16 \ expand into word
�
MOV R1,R0
MOV R2,R0
MOV R3,R0
$ MOV R4,R0
. MOV R5,R0
8 MOV R6,R0
B MOV R7,R0
L MOV R8,R0
V MOV R9,R0
` MOV R10,R0
j? MOV R11,R0 \ set registers for fill
t
~
.fsloop
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R11} \ 48 bytes
�1 STMIA R13!,{R0-R7} \ 32 bytes
�
� SUBS R14,R14,#1
� BGT fsloop
�
�4 LDR R13,r13sto \ recover R13
LDMFD R13!,{R0-R12,PC}^
5 \ Fill half section of screen with given nibble
\ R0 = Word to insert
( \ R1 = Line to start at
2 \ R2 = Number of lines
< .fillsectionhalf
F STMFD R13!,{R0-R12,R14}
P1 STR R13,r13sto \ save R13
Z
d MOV R14,R2
n
x LDR R13,plotscreenbase
� ADD R13,R13,R1,LSL #8
�H ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
�
� � R0,R0,#%1111
� �R R0,R0,R0,LSL #4
� �R R0,R0,R0,LSL #8
�8 �R R0,R0,R0,LSL #16 \ expand into word
�
� MOV R1,R0
� MOV R2,R0
� MOV R3,R0
� MOV R4,R0
� MOV R5,R0
MOV R6,R0
MOV R7,R0
MOV R8,R0
" MOV R9,R0
, MOV R10,R0
6? MOV R11,R0 \ set registers for fill
@
J .fsloop1
T1 STMIA R13!,{R0-R11} \ 48 bytes
^1 STMIA R13!,{R0-R11} \ 48 bytes
h1 STMIA R13!,{R0-R11} \ 48 bytes
r1 STMIA R13!,{R0-R3} \ 16 bytes
|
� ADD R13,R13,#160
� SUBS R14,R14,#1
� BGT fsloop1
�
�4 LDR R13,r13sto \ recover R13
� LDMFD R13!,{R0-R12,PC}^
�
�8 \ Fill quarter section of screen with given nibble
� \ R0 = Word to insert
� \ R1 = Line to start at
� \ R2 = Number of lines
� .fillsectionquarter
� STMFD R13!,{R0-R12,R14}
1 STR R13,r13sto \ save R13
MOV R14,R2
&
0 LDR R13,plotscreenbase
: ADD R13,R13,R1,LSL #8
DH ADD R13,R13,R1,LSL #6 \ address (in screen) to start at
N
X � R0,R0,#%1111
b �R R0,R0,R0,LSL #4
l �R R0,R0,R0,LSL #8
v8 �R R0,R0,R0,LSL #16 \ expand into word
�
� MOV R1,R0
� MOV R2,R0
� MOV R3,R0
� MOV R4,R0
� MOV R5,R0
� MOV R6,R0
� MOV R7,R0
� MOV R8,R0
� MOV R9,R0
� MOV R10,R0
�? MOV R11,R0 \ set registers for fill
�
.fsloop2
1 STMIA R13!,{R0-R11} \ 48 bytes
1 STMIA R13!,{R0-R7} \ 32 bytes
* ADD R13,R13,#240
4 SUBS R14,R14,#1
> BGT fsloop2
H
R4 LDR R13,r13sto \ recover R13
\ LDMFD R13!,{R0-R12,PC}^
f
p .rep1
z STR R13,r13sto
�
� LDR R13,plotscreenbase
� ADD R12,R13,#128*320
� MOV R14,#128
�
� .reploop1
� LDMIA R13!,{R0-R11}
� STMIA R12!,{R0-R11}
� LDMIA R13!,{R0-R11}
� STMIA R12!,{R0-R11}
� LDMIA R13!,{R0-R11}
� STMIA R12!,{R0-R11}
� LDMIA R13!,{R0-R11}
STMIA R12!,{R0-R11}
LDMIA R13!,{R0-R11}
STMIA R12!,{R0-R11}
$ LDMIA R13!,{R0-R11}
. STMIA R12!,{R0-R11}
8 LDMIA R13!,{R0-R7}
B STMIA R12!,{R0-R7}
L SUBS R14,R14,#1
V BGT reploop1
`
j LDR R13,r13sto
t LDMFD R13!,{R0-R12,PC}^
~
� .rep2
� STR R13,r13sto
�
� LDR R13,plotscreenbase
� MOV R14,#64
�
� .reploop2
� LDMIA R13!,{R0-R11}
� ADD R12,R13,#160-48
� STMIA R12,{R0-R11}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R11}
ADD R12,R12,#320*64
STMIA R12,{R0-R11}
ADD R12,R12,#320*64
STMIA R12,{R0-R11}
( SUB R12,R12,#160
2 STMIA R12,{R0-R11}
< SUB R12,R12,#320*64
F STMIA R12,{R0-R11}
P SUB R12,R12,#320*64
Z STMIA R12,{R0-R11}
d LDMIA R13!,{R0-R11}
n ADD R12,R13,#160-48
x STMIA R12,{R0-R11}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R11}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R11}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R11}
� SUB R12,R12,#160
� STMIA R12,{R0-R11}
� SUB R12,R12,#320*64
� STMIA R12,{R0-R11}
� SUB R12,R12,#320*64
� STMIA R12,{R0-R11}
� LDMIA R13!,{R0-R11}
ADD R12,R13,#160-48
STMIA R12,{R0-R11}
ADD R12,R12,#320*64
" STMIA R12,{R0-R11}
, ADD R12,R12,#320*64
6 STMIA R12,{R0-R11}
@ ADD R12,R12,#320*64
J STMIA R12,{R0-R11}
T SUB R12,R12,#160
^ STMIA R12,{R0-R11}
h SUB R12,R12,#320*64
r STMIA R12,{R0-R11}
| SUB R12,R12,#320*64
� STMIA R12,{R0-R11}
� LDMIA R13!,{R0-R3}
� ADD R12,R13,#160-16
� STMIA R12,{R0-R3}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R3}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R3}
� ADD R12,R12,#320*64
� STMIA R12,{R0-R3}
� SUB R12,R12,#160
� STMIA R12,{R0-R3}
� SUB R12,R12,#320*64
STMIA R12,{R0-R3}
SUB R12,R12,#320*64
STMIA R12,{R0-R3}
&
0 ADD R13,R13,#160
: SUBS R14,R14,#1
D BGT reploop2
N LDR R13,r13sto
X LDMFD R13!,{R0-R12,PC}^
b
l .rep3
v STR R13,r13sto
�
� LDR R13,plotscreenbase
� MOV R14,#32
�
� .reploop3
� LDMIA R13!,{R0-R11}
�4 ADD R12,R13,#80-48:STMIA R12,{R0-R11}
�1 ADD R12,R12,#80:STMIA R12,{R0-R11}
�1 ADD R12,R12,#80:STMIA R12,{R0-R11}
�5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!1 ADD R12,R12,#80:STMIA R12,{R0-R11}
! 1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!*5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!41 SUB R12,R12,#80:STMIA R12,{R0-R11}
!>1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!H1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!R5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!\1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!f1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!p1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!z5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!�5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!�1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!�1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!�1 ADD R12,R12,#80:STMIA R12,{R0-R11}
!�5 ADD R12,R12,#320*32:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!�1 SUB R12,R12,#80:STMIA R12,{R0-R11}
!� LDMIA R13!,{R0-R7}
!�3 ADD R12,R13,#80-32:STMIA R12,{R0-R7}
"0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"$0 SUB R12,R12,#80:STMIA R12,{R0-R7}
".0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"80 SUB R12,R12,#80:STMIA R12,{R0-R7}
"B4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"L0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"V0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"`0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"j4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"t0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"~0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"�0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"�0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"�0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"�0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"�0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"�0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"�0 SUB R12,R12,#80:STMIA R12,{R0-R7}
"�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
"�0 ADD R12,R12,#80:STMIA R12,{R0-R7}
"�0 ADD R12,R12,#80:STMIA R12,{R0-R7}
# 0 ADD R12,R12,#80:STMIA R12,{R0-R7}
#
4 ADD R12,R12,#320*32:STMIA R12,{R0-R7}
#0 SUB R12,R12,#80:STMIA R12,{R0-R7}
#0 SUB R12,R12,#80:STMIA R12,{R0-R7}
#(0 SUB R12,R12,#80:STMIA R12,{R0-R7}
#2 ADD R13,R13,#240
#< SUBS R14,R14,#1
#F BGT reploop3
#P LDR R13,r13sto
#Z LDMFD R13!,{R0-R12,PC}^
#d
#n
#x
.r13sto
#� EQUD 0
#�
#�2 \ Routine to plot any sphere in normal range
#�, \ R0 points to pos vector, size (0-13)
#� .gensphere
#� STMFD R13!,{R0-R12,R14}
#�
#� LDMIA R0,{R0-R3}
#�
#� CMP R3,#1
#� LDMLEFD R13!,{R0-R12,PC}^
#�
#� MOV R0,R0,ASR #7
$2 ADD R0,R0,#xorigin \ Translate X
$
$ ADD R1,R1,R1,ASR #3
$" MOV R1,R1,ASR #8
$,2 RSB R1,R1,#yorigin \ Translate Y
$6
$@, MOV R2,#18 \ height 18
$J
$T LDR R5,spritefilebase
$^ MOV R4,#288
$h SUB R3,R3,#2
$r> MLA R3,R4,R3,R5 \ point to appropriate sphere
$|
$�' BL plotspritea \ plot
$�
$� LDMFD R13!,{R0-R12,PC}^
$�
$� \ Routine to plot head
$�+ \ R0 points to pos vector, expression
$� .head
$� STMFD R13!,{R0-R12,R14}
$�
$� LDMIA R0,{R0-R3}
$�
$� MOV R0,R0,ASR #7
$�2 ADD R0,R0,#xorigin-16 \ Translate X
%
% ADD R1,R1,R1,ASR #3
% MOV R1,R1,ASR #8
%&2 RSB R1,R1,#yorigin \ Translate Y
%0
%:, MOV R2,#36 \ height 36
%D
%N LDR R5,spritefilebase
%X MOV R4,#288
%b ADD R3,R3,R3,LSL #3
%l ADD R3,R3,#268
%v> MLA R3,R4,R3,R5 \ point to appropriate sprite
%�
%�, BL plotspritea \ plot left
%�
%� ADD R3,R3,#288*2
%� ADD R0,R0,#32
%�- BL plotspritea \ plot right
%�
%� LDMFD R13!,{R0-R12,PC}^
%�
%�G \ Bungie line routine draws line with a sphere size 10 at far end
%�; \ R0 points to vector A, vector B, length as in table
%� .bungieline
%� STMFD R13!,{R0-R12,R14}
&
& MOV R12,R0
& LDMIA R0,{R0-R6}
&
&* MLA R0,R3,R6,R0
&4 MLA R1,R4,R6,R1
&>0 MLA R2,R5,R6,R2 \ Go to far end
&H
&R MOV R0,R0,ASR #7
&\2 ADD R0,R0,#xorigin \ Translate X
&f
&p ADD R1,R1,R1,ASR #3
&z MOV R1,R1,ASR #8
&�2 RSB R1,R1,#yorigin \ Translate Y
&�
&�, MOV R2,#18 \ height 18
&�
&� LDR R5,spritefilebase
&� MOV R4,#288
&� MOV R3,#10-2
&�> MLA R3,R4,R3,R5 \ point to appropriate sphere
&�
&�' BL plotspritea \ plot
&�
&� MOV R0,R12
&� B linesideentry
'
'5 \ Routine to put line stating at A, dir B in 3d
'; \ R0 points to vector A, vector B, length as in table
'$ .line
'. STMFD R13!,{R0-R12,R14}
'8
'B .linesideentry
'L
'V LDMIA R0,{R4-R10}
'`
'j CMP R10,#0
't LDMEQFD R13!,{R0-R12,PC}^
'~ RSBLT R7,R7,#0
'� RSBLT R8,R8,#0
'� RSBLT R9,R9,#0
'� RSBLT R10,R10,#0
'�
'� CMP R9,#0
'� BLE lineforwards
'� MLA R4,R7,R10,R4
'� MLA R5,R8,R10,R5
'� RSB R7,R7,#0
'�A RSB R8,R8,#0 \ ensure line goes toward viewer
'� .lineforwards
'�
( ADD R4,R4,R7,ASR #1
(
9 ADD R5,R5,R8,ASR #1 \ add half a unit to pos
(
( LDR R1,mulconst
((
(2 RSB R11,R7,#2560+160
(< MUL R11,R1,R11
(F( MOV R11,R11,ASR #25 \ column
(P
(Z ADD R12,R8,#2560+160
(d MUL R12,R1,R12
(n% MOV R12,R12,ASR #25 \ row
(x
(� �R R0,R11,R12
(� TST R0,#16
(� RSBNE R11,R11,#16
(�R RSBNE R12,R12,#16 \ if either go above 15 wrap round by inverting BOTH
(�
(� LDR R14,linetype
(� CMP R14,#0
(� ADDEQ R3,R11,#12
(� ADDEQ R3,R3,R12,LSL #4
(� MOVNE R3,#8
(� LDR R0,spritefilebase
(� MOV R1,#288
(�D MLA R3,R1,R3,R0 \ point to appropriate line section
), MOV R2,#18 \ height 18
)
) .lloop
)" MOV R0,R4,ASR #7
),4 ADD R0,R0,#xorigin \ Translate X
)6
)@ ADD R1,R5,R5,ASR #3
)J MOV R1,R1,ASR #8
)T4 RSB R1,R1,#yorigin \ Translate Y
)^
)h) BL plotspritea \ plot
)r
)| ADD R4,R4,R7
)�4 ADD R5,R5,R8 \ add unit to pos
)�
)� SUBS R10,R10,#1
)� BGT lloop
)�
)� LDMFD R13!,{R0-R12,PC}^
)�
)� .mulconst
)� EQUD 104858
)�
)� .plottabqind
)� EQUD plottabq
)�
*$ \ Routine to draw funky dancer
* .drawperson
* STMFD R13!,{R0-R12,R14}
*&
*0 MOV R0,#0
*: LDR R1,plottabqind
*D STR R0,[R1]
*N
*X ADR R0,torsopos
*b ADR R1,torsotrans
*l ADR R2,realpos
*v BL transform
*�
*� ADR R0,vectemp
*� ADR R1,torsotrans
*� ADR R2,minusunitvec
*� BL transform
*� ADR R0,temppos
*� ADR R1,vectemp
*� MOV R2,#752
*� ADR R3,torsopos
*� BL vectormla
*� ADR R1,vectemp
*� ADR R0,temppos
*� MOV R2,#1
+ BL logline
+ ADR R0,temppos
+ ADR R1,vectemp
+ MOV R2,#1*1024
+* ADD R2,R2,#752+1504
+4 ADR R3,torsopos
+>( BL vectormla \ neck
+H
+R ADR R0,temppos
+\ MOV R1,#0
+f BL loghead
+p
+z ADR R0,vectemp
+� ADR R1,torsotrans
+� ADR R2,sidewaysvec
+� BL transform
+� ADR R0,temppos
+� ADR R1,vectemp
+� MVN R2,#1328
+� ADR R3,torsopos
+� BL vectormla
+� ADR R0,mattemp1
+� ADR R1,lshouldertrans
+� ADR R2,torsotrans
+�. BL multiply \ left shoulder
+�
, ADR R0,vectemp
, ADR R1,mattemp1
, ADR R2,unitvec
,$ BL transform
,. ADR R0,temppos
,8 ADR R1,vectemp
,B MOV R2,#5*1024
,L. ADR R3,temppos \ left upper arm
,V BL vectormla
,` ADR R0,temppos
,j ADR R1,vectemp
,t MVN R2,#� (-5)
,~ BL logbungieline
,�
,� ADR R0,mattemp2
,� ADR R1,lelbowtrans
,� ADR R2,mattemp1
,�+ BL multiply \ left elbow
,�
,� ADR R0,vectemp
,� ADR R1,mattemp2
,� ADR R2,unitvec
,� BL transform
,� ADR R0,temppos
,� ADR R1,vectemp
- MOV R2,#5
-
. BL logbungieline \ left lower arm
-
- ADR R0,vectemp
-( ADR R1,torsotrans
-2 ADR R2,sidewaysvec
-< BL transform
-F ADR R0,temppos
-P ADR R1,vectemp
-Z MOV R2,#1328
-d ADR R3,torsopos
-n BL vectormla
-x ADR R0,mattemp1
-� ADR R1,rshouldertrans
-� ADR R2,torsotrans
-�/ BL multiply \ right shoulder
-�
-� ADR R0,vectemp
-� ADR R1,mattemp1
-� ADR R2,unitvec
-� BL transform
-� ADR R0,temppos
-� ADR R1,vectemp
-� MOV R2,#5*1024
-�/ ADR R3,temppos \ right upper arm
-� BL vectormla
. ADR R0,temppos
. ADR R1,vectemp
. MVN R2,#� (-5)
." BL logbungieline
.,
.6 ADR R0,mattemp2
.@ ADR R1,relbowtrans
.J ADR R2,mattemp1
.T, BL multiply \ right elbow
.^
.h ADR R0,vectemp
.r ADR R1,mattemp2
.| ADR R2,unitvec
.� BL transform
.� ADR R0,temppos
.� ADR R1,vectemp
.� MOV R2,#5
.�0 BL logbungieline \ right lower arm
.�
.� ADR R0,vectemp
.� ADR R1,torsotrans
.� ADR R2,unitvec
.� BL transform
.� ADR R0,temppos
.� ADR R1,vectemp
.� MOV R2,#752
/ ADR R3,torsopos
/ BL vectormla
/ ADR R1,vectemp
/& ADR R0,temppos
/0 MOV R2,#4
/: BL logline
/D ADR R0,bumpos
/N ADR R1,vectemp
/X MOV R2,#4*1024
/b ADD R2,R2,#2*752
/l ADR R3,torsopos
/v) BL vectormla \ torso
/�
/� ADR R0,vectemp
/� ADR R1,torsotrans
/� ADR R2,sidewaysvec
/� BL transform
/� ADR R0,temppos
/� ADR R1,vectemp
/� MVN R2,#1328
/� ADR R3,bumpos
/� BL vectormla
/� ADR R0,mattemp1
/� ADR R1,lhiptrans
/� ADR R2,torsotrans
0, BL multiply \ left hip
0
0 ADR R0,vectemp
0 ADR R1,mattemp1
0* ADR R2,unitvec
04 BL transform
0> ADR R0,temppos
0H ADR R1,vectemp
0R MOV R2,#5*1024
0\ ADR R3,temppos
0f- BL vectormla \ left thigh
0p ADR R1,vectemp
0z ADR R0,temppos
0� MVN R2,#� (-5)
0� BL logbungieline
0�
0� ADR R0,mattemp2
0� ADR R1,lkneetrans
0� ADR R2,mattemp1
0�- BL multiply \ left knee
0�
0� ADR R0,vectemp
0� ADR R1,mattemp2
0� ADR R2,unitvec
0� BL transform
0� ADR R1,vectemp
1 ADR R0,temppos
1 MOV R2,#5
1, BL logbungieline \ left calf
1$
1. ADR R0,vectemp
18 ADR R1,torsotrans
1B ADR R2,sidewaysvec
1L BL transform
1V ADR R0,temppos
1` ADR R1,vectemp
1j MOV R2,#1328
1t ADR R3,bumpos
1~ BL vectormla
1� ADR R0,mattemp1
1� ADR R1,rhiptrans
1� ADR R2,torsotrans
1�- BL multiply \ right hip
1�
1� ADR R0,vectemp
1� ADR R1,mattemp1
1� ADR R2,unitvec
1� BL transform
1� ADR R0,temppos
1� ADR R1,vectemp
1� MOV R2,#5*1024
2 ADR R3,temppos
2
/ BL vectormla \ right thigh
2 ADR R1,vectemp
2 ADR R0,temppos
2( MVN R2,#� (-5)
22 BL logbungieline
2<
2F ADR R0,mattemp2
2P ADR R1,rkneetrans
2Z ADR R2,mattemp1
2d. BL multiply \ right knee
2n
2x ADR R0,vectemp
2� ADR R1,mattemp2
2� ADR R2,unitvec
2� BL transform
2� ADR R1,vectemp
2� ADR R0,temppos
2� MOV R2,#5
2�. BL logbungieline \ right calf
2�
2� ADR R0,torsopos
2� MOV R1,#13
2� BL logsphere
2�
2� ADR R0,bumpos
3 MOV R1,#13
3 BL logsphere
3
3" BL spinningspheres
3, BL display
36 BL repeatdata
3@
3J LDMFD R13!,{R0-R12,PC}^
3T
3^ .vectemp
3h- EQUD 0 :EQUD 0 :EQUD 0
3r
3| .temppos
3�- EQUD 0 :EQUD 0 :EQUD 0
3�
3� .mattemp1
3�- EQUD 0 :EQUD 0 :EQUD 0
3�- EQUD 0 :EQUD 0 :EQUD 0
3�- EQUD 0 :EQUD 0 :EQUD 0
3�
3� .mattemp2
3�- EQUD 0 :EQUD 0 :EQUD 0
3�- EQUD 0 :EQUD 0 :EQUD 0
3�- EQUD 0 :EQUD 0 :EQUD 0
3�
3�F .unitvec \ transform this vector to get direction of line
4- EQUD 0 :EQUD 2560 :EQUD 0
4
4R .minusunitvec \ transform this vector to get opposite to direction of line
4&- EQUD 0 :EQUD -2560 :EQUD 0
40
4:H .sidewaysvec \ transform this vector to get a sideways directon
4D- EQUD 2560 :EQUD 0 :EQUD 0
4N
4X .torsopos
4b- EQUD 0 :EQUD 0 :EQUD 0
4l
4v
.bumpos
4�- EQUD 0 :EQUD 0 :EQUD 0
4�
4� .changeabledata
4� .realpos
4�7 EQUD 0 :EQUD 0 :EQUD 0 \set
4�
4� .torsotrans
4�7 EQUD 0 :EQUD -32768:EQUD 0 \set
4�- EQUD -32768:EQUD 0 :EQUD 0
4�1 EQUD 0 :EQUD 0 :EQUD 32768
4�
4� .lshouldertrans
4�7 EQUD 28596 :EQUD 16000 :EQUD 0 \set
5- EQUD -16000:EQUD 28596 :EQUD 0
51 EQUD 0 :EQUD 0 :EQUD 32768
5
5 .lelbowtrans
5*7 EQUD 31776 :EQUD -8000 :EQUD 0 \set
54- EQUD 8000 :EQUD 31776 :EQUD 0
5>1 EQUD 0 :EQUD 0 :EQUD 32768
5H
5R .rshouldertrans
5\7 EQUD 28596 :EQUD -16000:EQUD 0 \set
5f- EQUD 16000 :EQUD 28596 :EQUD 0
5p1 EQUD 0 :EQUD 0 :EQUD 32768
5z
5� .relbowtrans
5�7 EQUD 31776 :EQUD 8000 :EQUD 0 \set
5�- EQUD -8000 :EQUD 31776 :EQUD 0
5�1 EQUD 0 :EQUD 0 :EQUD 32768
5�
5� .lhiptrans
5�7 EQUD 31776 :EQUD 8000 :EQUD 0 \set
5�- EQUD -8000 :EQUD 31776 :EQUD 0
5�1 EQUD 0 :EQUD 0 :EQUD 32768
5�
5� .lkneetrans
5�7 EQUD 32768 :EQUD 0 :EQUD 0 \set
5�- EQUD 0 :EQUD 32768 :EQUD 0
61 EQUD 0 :EQUD 0 :EQUD 32768
6
6 .rhiptrans
6$7 EQUD 31776 :EQUD -8000 :EQUD 0 \set
6.- EQUD 8000 :EQUD 31776 :EQUD 0
681 EQUD 0 :EQUD 0 :EQUD 32768
6B
6L .rkneetrans
6V7 EQUD 32768 :EQUD 0 :EQUD 0 \set
6`- EQUD 0 :EQUD 32768 :EQUD 0
6j1 EQUD 0 :EQUD 0 :EQUD 32768
6t
6~ .identity
6�- EQUD 32768 :EQUD 0 :EQUD 0
6�- EQUD 0 :EQUD 32768 :EQUD 0
6�1 EQUD 0 :EQUD 0 :EQUD 32768
6�
6� .spin1
6�1 EQUD cos% :EQUD 0 :EQUD -sin%
6�- EQUD 0 :EQUD 32768 :EQUD 0
6�0 EQUD sin% :EQUD 0 :EQUD cos%
6�
6� .spin2
6�- EQUD cos% :EQUD -sin% :EQUD 0
6�- EQUD sin% :EQUD cos% :EQUD 0
7 1 EQUD 0 :EQUD 0 :EQUD 32768
7
7 .spin3
7- EQUD 32768 :EQUD 0 :EQUD 0
7(1 EQUD 0 :EQUD cos% :EQUD -sin%
720 EQUD 0 :EQUD sin% :EQUD cos%
7<
7F
.spin1b
7P0 EQUD cos% :EQUD 0 :EQUD sin%
7Z- EQUD 0 :EQUD 32768 :EQUD 0
7d0 EQUD -sin% :EQUD 0 :EQUD cos%
7n
7x
.spin2b
7�- EQUD cos% :EQUD sin% :EQUD 0
7�- EQUD -sin% :EQUD cos% :EQUD 0
7�1 EQUD 0 :EQUD 0 :EQUD 32768
7�
7�
.spin3b
7�- EQUD 32768 :EQUD 0 :EQUD 0
7�0 EQUD 0 :EQUD cos% :EQUD sin%
7�0 EQUD 0 :EQUD -sin% :EQUD cos%
7�
7�3 .angletab0 \ normal prone position
7� EQUB 0 \ sideways
7�' EQUB 0 \ height realpos
7� EQUB 10 \ tilt
8* EQUB 0 \ rot torsotrans
8 EQUB 20 \ tilt
8. EQUB 248 \ rot lshouldertrans
8" EQUB 34 \ tilt
8,+ EQUB 73 \ rot lelbowtrans
86 EQUB 20 \ tilt
8@. EQUB 120 \ rot rshouldertrans
8J EQUB 222 \ tilt
8T+ EQUB 73 \ rot relbowtrans
8^ EQUB 24 \ tilt
8h) EQUB 36 \ rot lhiptrans
8r EQUB 24 \ tilt
8|* EQUB 128 \ rot lkneetrans
8� EQUB 24 \ tilt
8�) EQUB 92 \ rot rhiptrans
8� EQUB 24 \ tilt
8�* EQUB 128 \ rot rkneetrans
8�
8�, .angletab1 \ 'getting down'
8� EQUB 0 \ sideways
8�' EQUB 84 \ height realpos
8� EQUB 10 \ tilt
8�* EQUB 0 \ rot torsotrans
8� EQUB 38 \ tilt
8�. EQUB 248 \ rot lshouldertrans
8� EQUB 84 \ tilt
9+ EQUB 73 \ rot lelbowtrans
9 EQUB 38 \ tilt
9. EQUB 120 \ rot rshouldertrans
9& EQUB 172 \ tilt
90+ EQUB 73 \ rot relbowtrans
9: EQUB 52 \ tilt
9D) EQUB 36 \ rot lhiptrans
9N EQUB 80 \ tilt
9X* EQUB 128 \ rot lkneetrans
9b EQUB 52 \ tilt
9l) EQUB 92 \ rot rhiptrans
9v EQUB 80 \ tilt
9�* EQUB 128 \ rot rkneetrans
9�
9�! .angletab2 \ yeh
9� EQUB 0 \ sideways
9�' EQUB 84 \ height realpos
9� EQUB 10 \ tilt
9�* EQUB 0 \ rot torsotrans
9� EQUB 38 \ tilt
9�. EQUB 248 \ rot lshouldertrans
9� EQUB 84 \ tilt
9�+ EQUB 73 \ rot lelbowtrans
9� EQUB 120 \ tilt
9�. EQUB 120 \ rot rshouldertrans
: EQUB 224 \ tilt
:+ EQUB 180 \ rot relbowtrans
: EQUB 52 \ tilt
: ) EQUB 36 \ rot lhiptrans
:* EQUB 80 \ tilt
:4* EQUB 128 \ rot lkneetrans
:> EQUB 52 \ tilt
:H) EQUB 92 \ rot rhiptrans
:R EQUB 80 \ tilt
:\* EQUB 128 \ rot rkneetrans
:f
:p) .angletab3 \ foot raised
:z EQUB 0 \ sideways
:�' EQUB 0 \ height realpos
:� EQUB 10 \ tilt
:�* EQUB 0 \ rot torsotrans
:� EQUB 20 \ tilt
:�. EQUB 248 \ rot lshouldertrans
:� EQUB 34 \ tilt
:�+ EQUB 73 \ rot lelbowtrans
:� EQUB 20 \ tilt
:�. EQUB 120 \ rot rshouldertrans
:� EQUB 222 \ tilt
:�+ EQUB 73 \ rot relbowtrans
:� EQUB 30 \ tilt
:�) EQUB 36 \ rot lhiptrans
; EQUB 36 \ tilt
;* EQUB 128 \ rot lkneetrans
; EQUB 24 \ tilt
;$) EQUB 92 \ rot rhiptrans
;. EQUB 24 \ tilt
;8* EQUB 128 \ rot rkneetrans
;B
;L) .angletab4 \ foot raised
;V EQUB 0 \ sideways
;`' EQUB 0 \ height realpos
;j EQUB 10 \ tilt
;t* EQUB 0 \ rot torsotrans
;~ EQUB 38 \ tilt
;�. EQUB 248 \ rot lshouldertrans
;� EQUB 84 \ tilt
;�+ EQUB 73 \ rot lelbowtrans
;� EQUB 38 \ tilt
;�. EQUB 120 \ rot rshouldertrans
;� EQUB 172 \ tilt
;�+ EQUB 73 \ rot relbowtrans
;� EQUB 30 \ tilt
;�) EQUB 36 \ rot lhiptrans
;� EQUB 36 \ tilt
;�* EQUB 128 \ rot lkneetrans
;� EQUB 24 \ tilt
<