8-Bit Software Online Conversion
:2.$.MKBCOD - Listing
10 *FX225,129
20 DIM CODE 2000
30 int1=&80:int2=&84:mod=&80:div=&82
40 divisor=&7E:store=&70
50 sign1=&8E:sign2=&8F
60 rdeg=&88:sdeg=&89:cdeg=&8A
70 posneg=&8B:tabloc=&8C
80 rsign=&72:ssign=&73:csign=&74
90 rstore=&75:sstore=&77:cstore=&79
100 table=&900
110:
120 FOR I%=4 TO 7 STEP3
122 O%=CODE
130 P%=&2800
140[OPTI%
150.mainloop
160 JSR tra`int:JSR plus
170 JSR check360:JSR trint`a
180:
190 LDA &404:STA int1
200 LDA &405:STA int1+1
210 LDA &40C:STA int1+2
220 LDA &40D:STA int1+3
230 JSR multiply:JSR check360:JSR cast
240 LDA int1:STA rstore
250 LDA int1+1:STA rstore+1
260 LDA posneg:STA rsign
270:
280 JSR tra`int:JSR check360:JSR cast
290 LDA int1:STA sstore
300 LDA int1+1:STA sstore+1
310 LDA posneg:STA ssign
320:
330 JSR tra`int
340 LDA #90:STA int2
350 LDA #0:STA int2+1
360 STA int2+2:STA int2+3
370 JSR plus:JSR check360:JSR cast
380 LDA int1:STA cstore
390 LDA int1+1:STA cstore+1
400 LDA posneg:STA csign
410:
420 LDA rstore:STA int1+2
430 LDA rstore+1:STA int1+3
440 JSR multiply:JSR ror18
480 LDA rsign:CMP csign:BNE cpos
490 JSR negate
500.cpos
510 LDA int1:STA cstore
520 LDA int1+1:STA cstore+1
530:
540 LDA sstore:STA int1
550 LDA sstore+1:STA int1+1
560 LDA rstore:STA int1+2
570 LDA rstore+1:STA int1+3
580 JSR multiply:JSR ror18
600 LDA rsign:CMP ssign:BNE spos
610 JSR negate
620.spos
630 LDA int1:STA sstore
640 LDA int1+1:STA sstore+1
642 JSR plot
644:
660 JSR tra`int
670 LDA int1+3:BEQ t2:JMP mainloop
672.t2
680 LDA int1+2:BEQ t3:JMP mainloop
690.t3
700 LDA int1+1:BEQ t4:JMP mainloop
710.t4
720 LDA int1:BEQ t5:JMP mainloop
722.t5
730½" Back to basic
740 RTS
750.trint`a
760 LDX #8:LDY #0
770.trnloop1
780 LDA int1,Y:STA &404,Y
790 INY:DEX:BNE trnloop1
800 RTS
810.tra`int
820 LDX #8:LDY #0
830.trnloop2
840 LDA &404,Y:STA int1,Y
850 INY:DEX:BNE trnloop2
860 RTS
870.plot
880 LDA #25:JSR &FFEE
890 LDA #5 :JSR &FFEE
900 LDA sstore:JSR &FFEE
910 LDA sstore+1:JSR &FFEE
920 LDA cstore:JSR &FFEE
930 LDA cstore+1:JSR &FFEE
940 RTS
950.cast
960 JSR minus180:JSR minus90
970½" table+(deg*4)
974 ASL int1:ROL int1+1
975 ASL int1:ROL int1+1
1030 LDA #table DIV &100:STA int2+1
1040 LDA #table MOD &100:STA int2
1050 LDA #0:STA int2+2:STA int2+3
1060 JSR plus
1080 LDA int1:STA tabloc
1090 LDA int1+1:STA tabloc+1
1100 LDY #3
1110.fetch
1120 LDA (tabloc),Y:STA int1,Y
1130 DEY:BPL fetch
1150 RTS
1160.minus90
1170 LDA int1:CMP #&5A
1180 BEQ nomin:BCC nomin
1190.min90
1200 LDA #&4C:STA int2
1210 LDA #&FF:STA int2+1
1220 STA int2+2:STA int2+3
1240 JSR plus:JSR negate
1250 RTS
1260.minus180
1270 LDA #0:STA posneg
1280 LDA int1+1:BNE min180
1290 LDA int1:CMP #&B4
1300 BEQ nomin:BCC nomin
1310.min180
1320 LDA #&4C:STA int2
1330 LDA #&FF:STA int2+1
1340 STA int2+2:STA int2+3
1350 JSR plus
1360 LDA #&FF:STA posneg
1370.nomin
1380 RTS
1390.plus
1400 CLC
1410 LDA int1 :ADC int2 :STA int1
1420 LDA int1+1:ADC int2+1:STA int1+1
1430 LDA int1+2:ADC int2+2:STA int1+2
1440 LDA int1+3:ADC int2+3:STA int1+3
1450 RTS
1460.ror18
1470 LDY #17
1480.ro1
1490 CLC
1500 ROR int1+3
1510 ROR int1+2
1520 ROR int1+1
1530 ROR int1
1540 DEY
1550 BNE ro1
1560 RTS
1570.neglow
1580 SEC
1590 LDA #0:SBC int1 :STA int1
1600 LDA #0:SBC int1+1:STA int1+1
1610 RTS
1620.neghigh
1630 SEC
1640 LDA #0:SBC int1+2:STA int1+2
1650 LDA #0:SBC int1+3:STA int1+3
1660 RTS
1670.negate
1680 SEC
1690 LDA #0:SBC int1 :STA int1
1700 LDA #0:SBC int1+1:STA int1+1
1710 LDA #0:SBC int1+2:STA int1+2
1720 LDA #0:SBC int1+3:STA int1+3
1730 RTS
1740.check360
1750 LDA int1+2:BNE more
1760 LDA int1+3:BNE more
1770 LDA int1+1:CMP #&01:BCC less
1780 BNE more
1790 LDA int1 :CMP #&68:BCC less
1800 ½ beq less
1810.more
1820 JSR mod360
1830.less
1840 RTS
1850.mod360
1860 LDA #&68:STA divisor
1870 LDA #&01:STA divisor+1
1880 LDA int1+3:BPL pos1
1890 LDA #&01:STA sign1
1900.pos1
1910 JSR divmod
1920 LDA #0:STA int1+2:STA int1+3
1930 LDA sign1:BEQ pos2
1940 JSR negate
1950.pos2
1960 LDA #0:STA sign1
1970 RTS
1980½" 32bit / 16bit
1990½" 16bit div 16bit mod
2000.divmod
2010 LDY #0
2020 STY store
2030 LDA int1
2040 LDY int1+2
2050 STY int1
2060 ASL A
2070 STA int1+2
2080 LDA int1+1
2090 LDY int1+3
2100 STY int1+1
2110 ROL A
2120 STA int1+3
2130 LDX #&10
2140.dv1
2150 ROL int1
2160 ROL int1+1
2170 ROL store
2180 SEC
2190 LDA int1
2200 SBC divisor
2210 TAY
2220 LDA int1+1
2230 SBC divisor+1
2240 PHA
2250 LDA store
2260 SBC #0
2270 PLA
2280 BCC dv2
2290 STY int1
2300 STA int1+1
2310.dv2
2320 ROL int1+2
2330 ROL int1+3
2340 DEX
2350 BNE dv1
2360 RTS
2370.multiply
2380 LDA int1+1:BPL not1
2390 LDA #1:STA sign1:JSR neglow
2400.not1
2410 LDA int1+3:BPL not2
2420 LDA #1:STA sign2:JSR neghigh
2430.not2
2440 JSR mult
2450 LDA sign1:CMP sign2:BEQ not3
2460 JSR negate
2470.not3
2480 LDA #0:STA sign1:STA sign2
2490 RTS
2500½" 16bit * 16bit = 32bit
2510.mult
2520 LDA int1+2
2530 STA store
2540 LDA int1+3
2550 STA store+1
2560 LDY #0:TYA
2570 STA int1+2
2580 CLC
2590 LDX #&11
2600 BNE ml2
2610.ml1
2620 BCC ml2
2630 PHA
2640 CLC
2650 LDA int1+2
2660 ADC store
2670 STA int1+2
2680 PLA
2690 ADC store+1
2700.ml2
2710 ROR A
2720 ROR int1+2
2730 ROR int1+1
2740 ROR int1
2750 DEX
2760 BNE ml1
2770 STA int1+3
2780 RTS
2990.T%
3010]NEXT
3020:
3030:
3040 REM" LOAD SIN TABLE
3050 FOR I%=0 TO 90
3060 READ D%:!(&900+I%*4)=D%
3070 NEXT
3080:
3130 OSCLI("SAVE BCOD "+STR$÷(CODE)+" +
"+STR$÷(O%-CODE)+" "+STR$÷(mainloop))
3140:
3150 REM" SIN(X)*2^13
3160DATA0,142,285,428,571
3170DATA713,856,998,1139
3180DATA1281,1422,1562,1702
3190DATA1842,1981,2119,2257
3200DATA2394,2531,2666,2801
3210DATA2935,3068,3200,3331
3220DATA3461,3590,3718,3845
3230DATA3970,4095,4218,4340
3240DATA4460,4580,4697,4814
3250DATA4929,5042,5154,5264
3260DATA5373,5480,5586,5689
3270DATA5791,5891,5990,6086
3280DATA6181,6274,6365,6454
3290DATA6541,6626,6709,6790
3300DATA6869,6946,7021,7093
3310DATA7164,7232,7298,7362
3320DATA7423,7483,7540,7594
3330DATA7647,7697,7745,7790
3340DATA7833,7874,7912,7948
3350DATA7981,8012,8041,8067
3360DATA8090,8111,8130,8146
3370DATA8160,8171,8180,8186
3380DATA8190,8192