Advertisement
vladikcomper

Blast Assembly Code Sample

Aug 29th, 2015
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ===============================================================
  2. ; ---------------------------------------------------------------
  3. ; The Merry Christmas Screen-Saver
  4. ;
  5. ; - Written in Blast ASM
  6. ; - Uses LabEngine-compatible SCL-functions
  7. ;
  8. ; (c) 2014, Developed by Vladikcomper
  9. ; ---------------------------------------------------------------
  10.  
  11.  
  12. ; ---------------------------------------------------------------
  13. ; Compilation constants / variables
  14. ; ---------------------------------------------------------------
  15.  
  16.     ; SCL-table indecies
  17.     .set    _Dummy, $00
  18.     .set    _LoadTexture, $01
  19.     .set    _DisplaySprite, $02
  20.     .set    _Redraw, $03
  21.     .set    _GetMem16, $04
  22.     .set    _DisplayMsg, $05
  23.  
  24. ; ---------------------------------------------------------------
  25. ; Start of RAM actual vector table
  26. ; ---------------------------------------------------------------
  27.  
  28.     bra Init        ; PC = $0000
  29.     bra MainLoop    ; PC = $0003
  30.  
  31. ; ===============================================================
  32. ; ---------------------------------------------------------------
  33. ; Initialization programme
  34. ; ---------------------------------------------------------------
  35.  
  36. Init:
  37.     ; Clear interal memory (registers)
  38.     sub r0,r0           ; r0 = $0000
  39.     move    r0,r1           ; clear data registers
  40.     move    r1,r2           ;
  41.     move    r2,r3           ;
  42.     move    r3,r4           ;
  43.     move    r4,r5           ;
  44.     move    r5,r6           ;
  45.     move    r6,r7           ;
  46.     move    r7,sp           ; reset stack
  47.     move    sp,cc           ; reset conditional codes register
  48.  
  49.     ; Load global textures
  50.     move    #Textures,r0
  51.     move    (r0),r1         ; r1 = Number of textures
  52.     add #2,r0           ; next 2 bytes
  53.  
  54. Init_LoadTexture:
  55.     scl _LoadTexture        ; obtain texture struct
  56.     sub #1,r1               ; subtract 1 from number of textures remaining
  57.     bra nz,Init_LoadTexture ; if textures remain, branch
  58.  
  59.     ; Clear object RAM
  60.     move    #ObjectRAM,r0
  61.     move    #$400,r1
  62.     sub r2,r2           ; r2 = $0000
  63.    
  64. Init_ClearObjRAM:
  65.     move    r2,(r0)
  66.     add #2,r0
  67.     sub #1,r1
  68.     bra nz,Init_ClearObjRAM
  69.  
  70.     rti
  71.  
  72.  
  73. ; ===============================================================
  74. ; ---------------------------------------------------------------
  75. ; Main loop programme (update logic)
  76. ; ---------------------------------------------------------------
  77.  
  78. MainLoop:
  79.     bsr ProcessBG
  80.     bsr GenerateSnowflakes
  81.     bsr ProcessSnowflakes
  82.  
  83.     ; Debug memory view
  84. ;   move    #ObjectRAM,r0
  85. ;   scl _GetMem16
  86. ;   add #$10,r0
  87. ;   scl _GetMem16
  88.  
  89.     scl _Redraw
  90.     rti
  91.  
  92.  
  93. ; ---------------------------------------------------------------
  94. ; Subroutine to process background
  95. ; ---------------------------------------------------------------
  96.  
  97. ProcessBG:
  98.     move    #Spr_BG,r0
  99.     sub r1,r1           ; r1 = 0
  100.     sub r2,r2           ; r2 = 0
  101.     scl _DisplaySprite
  102.     rts
  103.  
  104. ; ---------------------------------------------------------------
  105. ; Subroutine to generate snowflakes
  106. ; ---------------------------------------------------------------
  107.  
  108. Message:
  109.     .dc 'Snowflake was created at $%X'
  110.  
  111. GenerateSnowflakes:
  112.     sub #1,GenSnowfls_Timer ; subtract 1 from timer
  113.     bra nz,GenSnowfls_Done  ; if time remains, branch
  114.     move    #8,GenSnowfls_Timer ; reset timer
  115.  
  116.     ; Find free slot in Object RAM
  117.     move    #$80,r7         ; r7 = Objects counter
  118.     move    #ObjectRAM,r6       ; r6 = Object RAM
  119.  
  120. GenSnowfls_FindLoop:
  121.     move    (r6),r0         ; r0 = Sprite pointer
  122.     bra z,GenSnowfls_SlotFound  ; if found, branch
  123.  
  124.     add #$10,r6         ; next snowflake struct
  125.     sub #1,r7           ; subtract 1 from number of snowflakes processed
  126.     bra nz,GenSnowfls_FindLoop  ; if snowflakes remain, branch
  127.  
  128.     rts             ; emergency!
  129.  
  130. GenSnowfls_SlotFound:
  131.     move    r6,r5
  132.  
  133.     move    #Message, r0
  134.     move    r6,r1
  135.     scl _DisplayMsg
  136.  
  137.     ; Load pattern structure for the snowflake
  138.     move    #GenSnowfls_Patterns,r0 ; load patterns array
  139.     move    GenSnowfls_PatPtr,r1
  140.     add #8,r1
  141.     and #%111000,r1
  142.     add r1,r0           ; load current pattern
  143.     move    r1,GenSnowfls_PatPtr
  144.  
  145.     ; Copy sprite pointer
  146.     move    (r0),(r5)
  147.     add #2,r0
  148.     add #2,r5
  149.  
  150.     ; Generate pseudo-random X-pos
  151.     add #49,GenSnowfls_XPos
  152.     move    GenSnowfls_XPos,r1
  153.     and #$3FF,r1        ; r1 = 0...1024
  154.     sub #640,r1         ; r1 -= 640
  155.     bra nc,GenSnowfls_SetXY
  156.     add #640,r1
  157.  
  158. GenSnowfls_SetXY:
  159.     ; Sets XY- position
  160.     move    r1,(r5)         ; set XPos
  161.     add #2,r5
  162.     move    #$FFE0,(r5)     ; set Ypos
  163.     add #2,r5
  164.  
  165.     ; Copy YVel, Angle and gain
  166.     move    (r0),(r5)
  167.     add #2,r0
  168.     add #2,r5
  169.     move    (r0),(r5)
  170.     add #2,r0
  171.     add #2,r5
  172.     move    (r0),(r5)
  173.     add #2,r0
  174.     add #2,r5
  175.  
  176.     ; Set base XPos
  177.     move    r1,(r5)
  178.    
  179.     move    r6,r0
  180.     scl _GetMem16
  181.  
  182.     ;scl    0
  183.  
  184. GenSnowfls_Done:
  185.     rts
  186.  
  187. ; ---------------------------------------------------------------
  188. GenSnowfls_Timer:
  189.     .dc 30
  190.  
  191. GenSnowfls_XPos:
  192.     .dc $0000
  193.  
  194. GenSnowfls_PatPtr:
  195.     .dc $0000
  196.  
  197. GenSnowfls_Patterns:
  198.     ;   8 bytes x 8 entries
  199.     ;   sprite          yvel    angle  gain
  200.     .dc Spr_BigSnowflake,   4$0000, $0180
  201.     .dc Spr_SmallSnowflake, 1$8000, $FF40
  202.     .dc Spr_SmallSnowflake, 2$8000, $FF40
  203.     .dc Spr_BigSnowflake,   4$8000, $FE80
  204.     .dc Spr_SmallSnowflake, 2$2000, $FF40
  205.     .dc Spr_SmallSnowflake, 1$2C00, $FF40
  206.     .dc Spr_BigSnowflake,   2$0000, $00C0
  207.     .dc Spr_SmallSnowflake, 2$2C00, $FF40
  208.  
  209. ; ---------------------------------------------------------------
  210. ; Subroutine to process snowflakes
  211. ; ---------------------------------------------------------------
  212.  
  213. Messsage2:
  214.     .dc 'Snowflake was removed from $%X'
  215.  
  216. ProcessSnowflakes:
  217.     move    #$80,r7         ; r7 = Objects counter
  218.     move    #ObjectRAM,r6       ; r6 = Object RAM
  219.  
  220. ProcSnowfls_Loop:
  221.     move    (r6),r0         ; r0 = Sprite pointer
  222.     bra z,ProcSnowfls_Next  ; if Sprite pointer wasn't set, skip this snowflake
  223.  
  224.     ; Display the snowflake at it's old position
  225.     move    r6,r5
  226.     add #2,r5
  227.     move    (r5),r1         ; r1 = XPos
  228.     push    r5          ; remember XPos pointer
  229.     add #2,r5
  230.     move    (r5),r2         ; r2 = YPos
  231.     push    r5          ; remember YPos pointer
  232.     add #2,r5
  233.     scl _DisplaySprite      ; display snowflake at current pos (fetches r0, r1, r2)
  234.  
  235.     ; Update Y-position
  236.     add (r5),r2         ; r2 = YPos + YVel
  237.     pop r0
  238.     add #2,r5
  239.     cmp #516,r2         ; is YPos > 512?
  240.     bra mi,ProcSnowfls_NoWrap
  241. ;   move    #$FFE0,r2       ; reset Ypos
  242.     sub (r6),(r6)       ; free obj struct
  243.     pop r0
  244.  
  245.     push    r0
  246.     push    r1
  247.     move    #Messsage2,r0
  248.     move    r6,r1
  249.     scl _DisplayMsg
  250.     pop r1
  251.     pop r0
  252.  
  253.     bra ProcSnowfls_Next
  254.  
  255. ProcSnowfls_NoWrap:
  256.     move    r2,(r0)         ; update YPos
  257.  
  258.     ; Update X-position
  259.     move    (r5),r0         ; r0 = Angle
  260.     push    r5          ; save angle pointer
  261.     add #2,r5
  262.     add (r5),r0         ; r0 = Angle + Angle Gain
  263.     add #2,r5
  264.     move    (r5),r2         ; r2 = XPos (actual)
  265.     bsr CalcSine        ; r1 = Sine
  266.     sra r1          ; r1 >>= 3
  267.     sra r1
  268.     add r2,r1           ; r1 = XPos (actual) + Sin(Angle)
  269.     move    r0,r2           ; r2 = Angle
  270.     pop r0
  271.     move    r2,(r0)         ; update angle
  272.     pop r0
  273.     move    r1,(r0)         ; update XPos
  274.  
  275. ProcSnowfls_Next:
  276.     add #$10,r6         ; next snowflake struct
  277.     sub #1,r7           ; subtract 1 from number of snowflakes processed
  278.     bra nz,ProcSnowfls_Loop ; if snowflakes remain, branch
  279.  
  280.     rts
  281.  
  282.  
  283. ; ===============================================================
  284. ; ---------------------------------------------------------------
  285. ; Subroutine to calculate sine and cosine
  286. ; ---------------------------------------------------------------
  287. ; Input:
  288. ;   r0  - Angle ($00.00 -- $FF.FF)
  289. ;
  290. ; Output:
  291. ;   r1  - Sine (8.8)
  292. ; ---------------------------------------------------------------
  293.  
  294. CalcSine:
  295.     push    r0
  296.     move    r0,UInt16
  297.     move    UInt8,r0        ; convert r0 to a 8-bit number
  298.     sl  r0          ; doulbe it
  299.     add #Sinewave,r0        ; add Sinewave base to it
  300.     move    (r0),r1         ; r1 = Sin value (8.8)
  301.     pop r0
  302.     rts
  303.  
  304. ; ===============================================================
  305. ; ---------------------------------------------------------------
  306. ; Integer convertor (extender) struct
  307. ; ---------------------------------------------------------------
  308.  
  309. ; 32-bit format:     $1122.3344
  310.  
  311. UInt32: .rs 1   ; $44   -- $00
  312. UInt16: .rs 1   ; $33   -- .
  313. UInt8: .dc $0000   ; $22   -- .
  314.             ; $11   -- $00
  315.  
  316. Int32:  .rs 1   ; $44   -- $00
  317. Int16:  .rs 1   ; $33   -- .
  318. Int8:   .dc $FFFF   ; $22   -- .
  319.             ; $11   -- $FF
  320.  
  321.  
  322. ; ===============================================================
  323. ; ---------------------------------------------------------------
  324. ; Resources data block
  325. ; ---------------------------------------------------------------
  326.  
  327.     .align  $100
  328.  
  329. ; ---------------------------------------------------------------
  330. Sinewave:
  331.     .include 'sinewave.bin'
  332.  
  333. ; ---------------------------------------------------------------
  334. Textures:
  335.     .dc 2   ; number of textures
  336.  
  337.     ;   id  path            width   height
  338.     .dc 1'BG_1024x512.raw'1024,   512
  339.     .dc 2'Snowflakes_64x64.raw', 64, 64
  340.  
  341. ; ---------------------------------------------------------------
  342. Spr_BG:
  343.     .dc 1, 0, 0, 640, 480
  344.  
  345. ; ---------------------------------------------------------------
  346. Spr_BigSnowflake:
  347.     .dc 2, 0, 0, 32, 32
  348.  
  349. ; ---------------------------------------------------------------
  350. Spr_SmallSnowflake:
  351.     .dc 2, 32, 0, 32, 32
  352.  
  353.  
  354. ; ===============================================================
  355. ; ---------------------------------------------------------------
  356. ; Object RAM
  357. ; ---------------------------------------------------------------
  358. ; Format ($10 bytes):
  359. ;
  360. ;   $00 - Sprite pointer
  361. ;   $02 - XPos
  362. ;   $04 - YPos
  363. ;   $06 - YVel
  364. ;   $08 - Angle
  365. ;   $0A - Angle gain
  366. ;   $0C - XPos (actual)
  367. ;   $0E - <Free/Unused>
  368. ;
  369. ; ---------------------------------------------------------------
  370.  
  371.     .align  $100
  372.  
  373. ObjectRAM:
  374.     ; NOTICE: Should be initialized
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement