Guest User

Untitled

a guest
Sep 3rd, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Twister 02
  2.  
  3.                
  4. //==================================================================================================================
  5. // Preprocessor
  6.                 .const testmode = 1 // Make zero to enable final assembly
  7.                
  8. //==================================================================================================================
  9. // Globals (start at $0340)
  10.                 .const twisteri = $fa
  11.                 .const twistersi = $fd
  12.                
  13. //==================================================================================================================
  14. // Autostart
  15.                 .if(testmode == 1) {
  16.                     .pc = $0801 "Autostart Stub"
  17.                     :BasicUpstart(autostart)
  18.                     .pc = $0810 "Main Program"
  19. autostart:     
  20.                
  21. //==================================================================================================================
  22. // Init
  23.                     // Small test kernel
  24.                     sei
  25.                    
  26.                     lda #$35
  27.                     sta $01
  28.                    
  29.                     lda #$1b
  30.                     sta $d011
  31.                    
  32.                     lda #$7f
  33.                     sta $dc0d
  34.                     sta $dd0d
  35.                     lda #$01
  36.                     sta $d01a
  37.                    
  38.                     // Init effect
  39.                     jsr twisterdsetup
  40.                     jsr twistersetup
  41.                    
  42.                     lda $dc0d
  43.                     lda $dd0d
  44.                     asl $d019
  45.                     cli
  46.                    
  47.                     jmp *
  48.                    
  49. //==================================================================================================================
  50. // Music Hack
  51.                     .pc = $1003 "Music Hack"
  52.                     // Allow effect to call music routine when none exists
  53.                     rts
  54.                 }
  55.                
  56. //==================================================================================================================
  57. // Twister
  58.                 .if(testmode == 1) {
  59.                     .pc = $1200 "Effect Data Setup"
  60.                 } else {
  61.                     .pc = $7000 "Effect Data Setup"
  62.                 }
  63.                 // Relocate sprite data
  64. twisterdsetup:  ldx #$3f
  65. !:                  lda twistersprite - $01,x
  66.                     sta $2fbf,x
  67.                 dex
  68.                 bne !-
  69.                 // Relocate char data
  70. !:                  .for(var i = 0;i < 16;i++) {
  71.                         lda twisterchars + i * $100,x
  72.                         sta $3000 + i * $100,x
  73.                     }
  74.                 inx
  75.                 bne !-
  76.                 rts
  77.                
  78.                 .pc = * "Effect Setup"
  79.                 // Set irq
  80. twistersetup:   lda #<twister
  81.                 sta $fffe
  82.                 lda #>twister
  83.                 sta $ffff
  84.                 lda #$00
  85.                 sta $d012
  86.                 // Set index var(s) and set up VIC reg's
  87.                 sta $d027
  88.                 sta $d028
  89.                 sta twisteri
  90.                 tax
  91.                 lda $d016
  92.                 ora #$10
  93.                 sta $d016
  94.                 lda #$06
  95.                 sta $d021
  96.                 lda #$0e
  97.                 sta $d022
  98.                 lda #$03
  99.                 sta $d023
  100.                 // Set up screen colors
  101.                 lda #$06
  102. !:                  sta $d800,x
  103.                     sta $d900,x
  104.                     sta $da00,x
  105.                     sta $dae8,x
  106.                 inx
  107.                 bne !-
  108.                 lda #$09
  109.                 ldx #$28
  110. !:                  .for(var y = 0;y < 16;y++) {
  111.                         sta $d800 + [y + 5] * 40 - 1,x
  112.                     }
  113.                 dex
  114.                 bne !-
  115.                 // Set up l/r border sprites
  116.                 lda #$bf
  117.                 sta $07f8
  118.                 sta $07f9
  119.                 lda #$18
  120.                 sta $d000
  121.                 lda #$56
  122.                 sta $d002
  123.                 lda #$02
  124.                 sta $d010
  125.                 lda #$03
  126.                 sta $d015
  127.                 lda #$03
  128.                 sta $d017
  129.                 rts
  130.                
  131.                 .pc = * "Effect"
  132. twister:        jsr $1003
  133.                 // Set up re-entrant irq for top border line
  134.                 lda #<twister2
  135.                 sta $fffe
  136.                 lda #>twister2
  137.                 sta $ffff
  138.                 lda #$30
  139.                 sta $d012
  140.                 lda #$0e
  141.                 sta $d020
  142.                 asl $d019
  143.                 cli
  144.                 // Update twister
  145.                 inc twisteri
  146.                 lda twisteri
  147.                 asl
  148.                 and #$02
  149.                 sta $fb
  150.                 lda $d018
  151.                 and #$f1
  152.                 ora #$0d
  153.                 sta $d018
  154.                 ldy twisteri
  155.                 lda twisteritab,y
  156.                 sta $fb
  157.                 ldx #$28
  158. !:                  stx $fc
  159.                     lda $fb
  160.                     adc twisterdtab,y
  161.                     sta $fb
  162.                     tax
  163.                     lda twisterttab,x
  164.                     ldx $fc
  165.                     // Gotta love this little bit of speedcode :)
  166.                     .for(var r = 0;r < 8;r++) {
  167.                         .if(r > 0) {
  168.                             .if(r > 1) {
  169.                                 and #$f8
  170.                             }
  171.                             ora #r
  172.                         }
  173.                         sta $03ff + [r + 5] * 40,x
  174.                         sta $03ff + [r + 13] * 40,x
  175.                     }
  176.                     iny
  177.                 dex
  178.                 bne !-
  179.                 // Change charset halfway through twister
  180.                 lda #$9a
  181.                     cmp $d012
  182.                 bne * - 3
  183.                 ldx #$09
  184.                     dex
  185.                 bne * - 1
  186.                 bit $00
  187.                 inc $d018
  188.                 // Bottom border line
  189.                 lda #$fa
  190.                     cmp $d012
  191.                 bne * - 3
  192.                 ldx #$0a
  193.                     dex
  194.                 bne * - 1
  195.                 lda #$00
  196.                 sta $d020
  197.                 lda #$fc
  198.                     cmp $d012
  199.                 bne * - 3
  200.                 ldx #$0a
  201.                     dex
  202.                 bne * - 1
  203.                 lda #$0e
  204.                 sta $d020
  205.                 asl $d019
  206.                 rti
  207.                
  208. twister2:       sta twister2smca + 1
  209.                 stx twister2smcx + 1
  210.                 // Switch to and set up re-entrant irq for l/r sprite borders
  211.                 lda #<twisters
  212.                 sta $fffe
  213.                 lda #>twisters
  214.                 sta $ffff
  215.                 lda #$5c
  216.                 sta $d012
  217.                 sta twistersi
  218.                 // Top border line
  219.                 ldx #$04
  220.                     dex
  221.                 bne * - 1
  222.                 lda #$00
  223.                 sta $d020
  224.                 lda #$32
  225.                 sta $d001
  226.                 sta $d003
  227.                 lda #$32
  228.                     cmp $d012
  229.                 bne * - 3
  230.                 ldx #$0a
  231.                     dex
  232.                 bne * - 1
  233.                 lda #$0f
  234.                 sta $d020
  235. twister2smca:   lda #$00
  236. twister2smcx:   ldx #$00
  237.                 asl $d019
  238.                 rti
  239.                
  240. twisters:       sta twisterssmca + 1
  241.                 stx twisterssmcx + 1
  242.                 // Move sprites
  243.                 lda twistersi
  244.                 sta $d001
  245.                 sta $d003
  246.                 clc
  247.                 adc #$2a
  248.                 sta twistersi
  249.                 // Reset original irq if necessary
  250.                 cmp #$04
  251.                 bne !+
  252.                     lda #<twister
  253.                     sta $fffe
  254.                     lda #>twister
  255.                     sta $ffff
  256.                     lda #$00
  257. !:              sta $d012
  258. twisterssmca:   lda #$00
  259. twisterssmcx:   ldx #$00
  260.                 asl $d019
  261.                 rti
  262.                
  263. //==================================================================================================================
  264. // Data
  265.                 .pc = * "Data"
  266.                 // Index table (moves twister l/r)
  267. twisteritab:    .for(var i = 0;i < 256;i++) {
  268.                     .byte sin(i / 256 * 2 * 3.141592 * 3 + 0.8) * 32 + i
  269.                 }
  270.                
  271.                 // Delta table (twists harder/softer)
  272. twisterdtab:    .for(var i = 0;i < 256;i++) {
  273.                     .byte [sin(i / 256 * 2 * 3.141592) + cos(i / 256 * 2 * 3.141592 * 2 + 0.3) * 0.5] * 7
  274.                 }
  275.                
  276.                 // Twist table (translates a twist index into a char index, and twists a little bit more)
  277. twisterttab:    .for(var i = 0;i < 256;i++) {
  278.                     .byte [i / 256 * 32 * 4] << 3
  279.                 }
  280.                
  281.                 .pc = * "Sprite Data"
  282.                 // L/r border sprite
  283. twistersprite:  .byte %11000000,%00000000,%00000000
  284.                 .byte %11000000,%00000000,%00000000
  285.                 .byte %11000000,%00000000,%00000000
  286.                 .byte %11000000,%00000000,%00000000
  287.                 .byte %11000000,%00000000,%00000000
  288.                 .byte %11000000,%00000000,%00000000
  289.                 .byte %11000000,%00000000,%00000000
  290.                 .byte %11000000,%00000000,%00000000
  291.                 .byte %11000000,%00000000,%00000000
  292.                 .byte %11000000,%00000000,%00000000
  293.                 .byte %11000000,%00000000,%00000000
  294.                 .byte %11000000,%00000000,%00000000
  295.                 .byte %11000000,%00000000,%00000000
  296.                 .byte %11000000,%00000000,%00000000
  297.                 .byte %11000000,%00000000,%00000000
  298.                 .byte %11000000,%00000000,%00000000
  299.                 .byte %11000000,%00000000,%00000000
  300.                 .byte %11000000,%00000000,%00000000
  301.                 .byte %11000000,%00000000,%00000000
  302.                 .byte %11000000,%00000000,%00000000
  303.                 .byte %11000000,%00000000,%00000000
  304.                
  305.                 .pc = * "Character Data"
  306.                 // Raycaster :) generates twister charset. 32 8x1 half frames in two charsets, giving 32 16x1 full twist frames.
  307.                 .function object(p) {
  308.                     .var q = Vector(p.getX(),cos(a) * p.getY() + sin(a) * p.getZ(),cos(a) * p.getZ() - sin(a) * p.getY())
  309.                     //.return max(abs(q.getY()),abs(q.getZ())) - 2
  310.                     //.return sqrt(q.getY() * q.getY() + q.getZ() * q.getZ()) - 2.5 + cos(atan2(q.getZ(),q.getY()) * 4) * 0.6
  311.                     .return sqrt(q.getY() * q.getY() + q.getZ() * q.getZ()) - 2.5 + cos(atan2(q.getZ(),q.getY()) * 8) * 0.2
  312.                 }
  313. twisterchars:   .for(var s = 0;s < 2;s++) {
  314.                     .for(var t = 0;t < 32;t++) {
  315.                         .for(var r = 0;r < 8;r++) {
  316.                             .for(var y = 0;y < 8;y++) {
  317.                                 .var output = 0
  318.                                 .var a = t / 32 * 2 * 3.141592 / 8
  319.                                 .var e = Vector(0,0,-7)
  320.                                 .var v = Vector(0,-[[s * 64 + r * 8 + y] / 128 - 0.5],1)
  321.                                 .eval v = v / sqrt(v.getX() * v.getX() + v.getY() * v.getY() + v.getZ() * v.getZ())
  322.                                 .var done = false
  323.                                 .for(var i = 0;i < 20;i++) {
  324.                                     .if(!done) {
  325.                                         .var d = object(e)
  326.                                         .if(d <= 0) {
  327.                                             .eval done = true
  328.                                             .var n = Vector(object(e + Vector(0.01,0,0)) - d,object(e + Vector(0,0.01,0)) - d,object(e + Vector(0,0,0.01)) - d)
  329.                                             .eval n = n / sqrt(n.getX() * n.getX() + n.getY() * n.getY() + n.getZ() * n.getZ())
  330.                                             .var l = Vector(0,1,-1)
  331.                                             .eval l = l / sqrt(l.getX() * l.getX() + l.getY() * l.getY() + l.getZ() * l.getZ())
  332.                                             .var ill = max(n * l,0)
  333.                                             .var outputc = ill * 3.04
  334.                                             .var dither = [outputc * 2] & 1
  335.                                             .if(dither == 0) {
  336.                                                 .eval output = output | outputc
  337.                                                 .eval output = output << 2
  338.                                                 .eval output = output | outputc
  339.                                                 .eval output = output << 2
  340.                                                 .eval output = output | outputc
  341.                                                 .eval output = output << 2
  342.                                                 .eval output = output | outputc
  343.                                             } else {
  344.                                                 .var outputc2 = outputc + 1
  345.                                                 .if(outputc2 > 3) .eval outputc2 = 3
  346.                                                 .if([y & 1] == 0) {
  347.                                                     .eval output = output | outputc
  348.                                                     .eval output = output << 2
  349.                                                     .eval output = output | outputc2
  350.                                                     .eval output = output << 2
  351.                                                     .eval output = output | outputc
  352.                                                     .eval output = output << 2
  353.                                                     .eval output = output | outputc2
  354.                                                 } else {
  355.                                                     .eval output = output | outputc2
  356.                                                     .eval output = output << 2
  357.                                                     .eval output = output | outputc
  358.                                                     .eval output = output << 2
  359.                                                     .eval output = output | outputc2
  360.                                                     .eval output = output << 2
  361.                                                     .eval output = output | outputc
  362.                                                 }
  363.                                             }
  364.                                         }
  365.                                         .if(d < 0.001) .eval d = 0.001
  366.                                         .eval e = e + v * d
  367.                                     }
  368.                                 }
  369.                                 .byte output
  370.                             }
  371.                         }
  372.                     }
  373.                 }
Add Comment
Please, Sign In to add comment