Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ************************************************************
  2. *                     COMMON CONSTANTS                     *
  3. ************************************************************
  4. ; Screen-related constants
  5. TK_SCREEN_WIDTH EQU 640
  6. TK_SCREEN_HEIGHT EQU    480
  7.  
  8. ; Task groups
  9. TK_GROUP_DBUFFER EQU    0
  10. TK_GROUP_MOUSE  EQU 1
  11. TK_GROUP_KEYBOARD EQU   2
  12. TK_GROUP_PLAYER EQU 3
  13. TK_GROUP_BULLET EQU     4
  14. TK_GROUP_CONTROLLER EQU 5
  15. TK_GROUP_ASTEROID EQU   6
  16.  
  17. ; General-purpose TMP offsets
  18. TK_VAR_ID   EQU 0   ; Word
  19. TK_VAR_GROUP    EQU 2   ; Word
  20.  
  21. ; SMP offsets
  22. TK_VAR_MOUSE_X  EQU 0   ; Word
  23. TK_VAR_MOUSE_Y  EQU 2   ; Word
  24. TK_VAR_MOUSE_BUT EQU    4   ; Byte
  25. TK_VAR_MOUSE_CLK EQU    5   ; Byte
  26. TK_VAR_SPC_PRESS EQU    6   ; Byte
  27. TK_VAR_SPC_CLK  EQU    7   ; Byte
  28. TK_VAR_UP_PRESS EQU 8   ; Byte
  29. TK_VAR_UP_CLK  EQU 9   ; Byte
  30. TK_VAR_DWN_PRESS EQU    10  ; Byte
  31. TK_VAR_DWN_CLK  EQU 11  ; Byte
  32.  
  33. TK_VAR_RNG_SEED EQU 12  ; Long
  34. TK_VAR_LIVES    EQU 16  ; Word
  35. TK_VAR_LEVEL    EQU 18  ; Word
  36. TK_VAR_PLAYER_Y EQU 20  ; Word
  37. TK_VAR_AST_SPEED EQU    22  ; Word
  38.  
  39. ************************************************************
  40. *                       COMMON MACROS                      *
  41. ************************************************************
  42.  
  43. *-----------------------------------------------------------
  44. * Macro to set screen resolution.                          
  45. * Parameters: \1: Width (pixels)                          
  46. *             \2: Height (pixels)
  47. * Modifies  : D0, D1
  48. *-----------------------------------------------------------
  49. TK_SET_RES MACRO
  50.         move.b  #33, D0
  51.         move.l  #\1*$10000+\2, D1
  52.         trap    #15
  53.         ENDM
  54. *-----------------------------------------------------------
  55.                
  56. *-----------------------------------------------------------
  57. * Macro to set windowed mode
  58. * Modifies  : D0, D1
  59. *-----------------------------------------------------------
  60. TK_SET_WINDOWED MACRO
  61.         move.b  #33, D0
  62.         move.l  #1, D1
  63.         trap    #15
  64.         ENDM
  65. *-----------------------------------------------------------
  66.                
  67. *-----------------------------------------------------------
  68. * Macro to enable double buffer
  69. * Parameters:
  70. * Modifies  : D0, D1
  71. *-----------------------------------------------------------
  72. TK_ENABLE_DBUFFER MACRO
  73.         move.b  #17, D1
  74.         move.b  #92, D0
  75.         trap    #15
  76.         ENDM
  77. *-----------------------------------------------------------
  78.        
  79. *-----------------------------------------------------------
  80. * Macro to repaint screen (only in double buffer mode)
  81. * Parameters:
  82. * Modifies  : D0, D1
  83. *-----------------------------------------------------------
  84. TK_REPAINT_SCREEN MACRO
  85.         move.b  #94, D0
  86.         trap    #15
  87.         ENDM
  88. *-----------------------------------------------------------
  89.  
  90. *-----------------------------------------------------------
  91. * Macro to clear the screen
  92. * Modifies  : D0, D1
  93. *-----------------------------------------------------------
  94. TK_CLEAR    MACRO
  95.         move.b  #11, D0
  96.         move.w  #$FF00, D1
  97.         trap    #15
  98.         ENDM
  99. *-----------------------------------------------------------
  100.  
  101. *-----------------------------------------------------------
  102. * Macro to set the pen color.
  103. * Parameters: \1: Color in format $00BBGGRR
  104. * Modifies  : D0, D1
  105. *-----------------------------------------------------------       
  106. TK_SET_PEN  MACRO
  107.         move.l  \1, D1
  108.         move.b  #80, D0
  109.         trap    #15
  110.         ENDM
  111. *-----------------------------------------------------------       
  112.  
  113. *-----------------------------------------------------------
  114. * Macro to set the fill color.
  115. * Parameters: \1: Color in format $00BBGGRR
  116. * Modifies  : D0, D1
  117. *-----------------------------------------------------------       
  118. TK_SET_FILL MACRO
  119.         move.l  \1, D1
  120.         move.b  #81, D0
  121.         trap    #15
  122.         ENDM
  123. *-----------------------------------------------------------
  124.  
  125. *-----------------------------------------------------------
  126. * Macro to draw a rectangle
  127. * Parameters: No parameters. Coordinates are specified using
  128. *             D1.W(Left), D2.W(Top), D3.W(Right), D4.W(Bottom)
  129. * Modifies  : D0
  130. *-----------------------------------------------------------       
  131. TK_DRAW_RECTANGLE MACRO
  132.         move.b  #87, D0
  133.         trap    #15
  134.         ENDM
  135. *-----------------------------------------------------------   
  136.  
  137. *-----------------------------------------------------------
  138. * Macro to draw an ellipse
  139. * Parameters: No parameters. Coordinates are specified using
  140. *             D1.W(Left), D2.W(Top), D3.W(Right), D4.W(Bottom)
  141. * Modifies  : D0
  142. *-----------------------------------------------------------       
  143. TK_DRAW_ELLIPSE MACRO
  144.         move.b  #88, D0
  145.         trap    #15
  146.         ENDM
  147. *-----------------------------------------------------------   
  148.  
  149. *-----------------------------------------------------------
  150. * Macro to locate the text cursor
  151. * Parameters: \1: X
  152. *             \2: Y
  153. * Modifies  : D0, D1
  154. *-----------------------------------------------------------
  155. TK_LOCATE   MACRO      
  156.         move.b  \1, D1  ; Put X coordinate
  157.         lsl.w   #8, D1
  158.         move.b  \2, D1  ; Put Y coordinate
  159.         move.b  #11, D0
  160.         trap    #15
  161.         ENDM
  162. *-----------------------------------------------------------
  163.  
  164. ************************************************************
  165. *                    INITIALIZATION ROUTINE                *
  166. ************************************************************
  167.  
  168. * ----------------------------------------------------------
  169. TK_INIT:
  170. * Adds the tasks in the approppriate order into the task
  171. * manager.
  172. * ----------------------------------------------------------
  173. ; Define minimum cycle time
  174.         move.l  #3, D1
  175.         move.b  #11, D0
  176.         trap    #0
  177.  
  178. ; Add double buffer task
  179.         lea T1_TEP, A0          ; TEP
  180.         move.w  #TK_GROUP_DBUFFER, D1       ; GROUP
  181.         move.b  #0, D0              ; TM Function 0
  182.         trap    #0
  183.        
  184. ; Add mouse task
  185.         lea T2_TEP, A0          ; TEP
  186.         move.w  #TK_GROUP_MOUSE, D1     ; GROUP
  187.         move.b  #0, D0              ; TM Function 0
  188.         trap    #0
  189.  
  190. ; Add keyboard task
  191.         lea T3_TEP, A0          ; TEP
  192.         move.w  #TK_GROUP_KEYBOARD, D1      ; GROUP
  193.         move.b  #0, D0              ; TM Function 0
  194.         trap    #0
  195.  
  196. ; Add player task
  197.         lea T4_TEP, A0          ; TEP
  198.         move.w  #TK_GROUP_PLAYER, D1        ; GROUP
  199.         move.b  #0, D0              ; TM Function 0
  200.         trap    #0
  201.  
  202. ; Add controller task
  203.         lea T6_TEP, A0          ; TEP
  204.         move.w  #TK_GROUP_CONTROLLER, D1    ; GROUP
  205.         move.b  #0, D0              ; TM Function 0
  206.         trap    #0
  207.            
  208.         rts
  209. * ----------------------------------------------------------
  210.  
  211. ************************************************************
  212. *                    ALL-PURPOSE FUNCTIONS                 *
  213. ************************************************************
  214.  
  215. * ----------------------------------------------------------
  216. TK_RNG_GENERATE_SEED:                                                      
  217. * Description : Generates a seed for the RNG to use
  218. * Pre         : A1: SMP
  219. * Post        : TK_RNG_SEED gets updated with a seed
  220. *-----------------------------------------------------------
  221.                 movem.l D0-D1/A0, -(A7)
  222.                
  223.                 move.b  #8, D0
  224.                 trap    #15
  225.                 move.l  D1, TK_VAR_RNG_SEED(A1)
  226.                
  227.                 movem.l (A7)+, D0-D1/A0
  228.                 rts
  229.                
  230. * ----------------------------------------------------------
  231. TK_RNG_NEXT:                                                       
  232. * Description : Returns a pseudo-randomly generated long number
  233. * Pre         : A1: SMP
  234. * Post        : D0.L contains the generated number
  235. *               TK_RNG_SEED gets updated with a new seed
  236. *-----------------------------------------------------------
  237.                 movem.l D1/A0, -(A7)
  238.                
  239.                 move.l  TK_VAR_RNG_SEED(A1), D0
  240.                 move.l  D0, D1
  241.                 ror.l   #3, D1
  242.                 add.l   D0, D1
  243.                 rol.l   #4, D1
  244.                 move.l  D1, TK_VAR_RNG_SEED(A1)
  245.                
  246.                 movem.l (A7)+, D1/A0
  247.                 rts
  248.  
  249. ************************************************************
  250. *                            TASK 1                        *
  251. * -------------------------------------------------------- *
  252. * Name:        DOUBLE BUFFER MANAGER                       *
  253. * Description: Initializes screen and manages double       *
  254. *              buffer.                                     *
  255. ************************************************************
  256.  
  257. ; ==========================================================
  258. ; Task 1 functions
  259. ; ==========================================================
  260.  
  261. * ----------------------------------------------------------
  262. T1_TEP:
  263. * Task 1 entry point.
  264. * ----------------------------------------------------------
  265.         ; Check if status is "initializing". If so,
  266.         ; execute the initialization code.
  267.         cmp.w   #TM_TCB_STATUS_INIT, D3
  268.         beq T1_INIT
  269.        
  270.         ; Update the task logic
  271.         bsr T1_UPDATE
  272.        
  273.         ; Do the graphical stuff
  274.         bsr T1_PLOT
  275.        
  276.         ; That's it. End by switching to next task
  277.         move.b  #4, D0
  278.         trap    #0     
  279. * ----------------------------------------------------------
  280.  
  281. * ----------------------------------------------------------
  282. T1_INIT:                                                       
  283. * Task 1 initialization code
  284. * ----------------------------------------------------------
  285.         ; Store the task ID and GROUP in TMP to
  286.         ; ease further access if necessary.
  287.         move.w  D1, TK_VAR_ID(A0)
  288.         move.w  D2, TK_VAR_GROUP(A0)
  289.        
  290.         ; Set the screen resolution
  291.         TK_SET_RES  TK_SCREEN_WIDTH, TK_SCREEN_HEIGHT
  292.        
  293.         ; Set windowed mode
  294.         TK_SET_WINDOWED
  295.        
  296.         ; Enable double buffer
  297.         TK_ENABLE_DBUFFER
  298.                
  299.         ; End by switching to next task
  300.         move.b  #4, D0
  301.         trap    #0     
  302. * ----------------------------------------------------------
  303.        
  304. * ----------------------------------------------------------
  305. T1_UPDATE:                                                     
  306. * Task 1 update task logic
  307. * ----------------------------------------------------------
  308.         ; Nothing to do right now
  309.         rts    
  310. * ----------------------------------------------------------
  311.  
  312. * ----------------------------------------------------------
  313. T1_PLOT:                                                       
  314. * Task 1 drawing stuff
  315. * ----------------------------------------------------------
  316.         ; Update double buffer
  317.         TK_REPAINT_SCREEN
  318.        
  319.         ; Clear next frame
  320.         TK_CLEAR       
  321.        
  322.         ; That's it!
  323.         rts
  324. * ----------------------------------------------------------
  325.  
  326. ************************************************************
  327. *                            TASK 2                        *
  328. * -------------------------------------------------------- *
  329. * Name       : MOUSE MANAGER                               *
  330. * Description: Polls mouse, stores its state in shared     *
  331. *              memory and prints coordinates.              *
  332. ************************************************************
  333.  
  334. ; ==========================================================
  335. ; Task 2 constants
  336. ; ==========================================================
  337. ; TMP offsets
  338. T2_VAR_MOUSE_PRE EQU    4   ; Byte
  339.  
  340. ; ==========================================================
  341. ; Task 2 functions
  342. ; ==========================================================
  343.  
  344. * ----------------------------------------------------------
  345. T2_TEP:
  346. * Task 2 entry point.
  347. * ----------------------------------------------------------
  348.         ; Check if status is "initializing". If so,
  349.         ; execute the initialization code.
  350.         cmp.w   #TM_TCB_STATUS_INIT, D3
  351.         beq T2_INIT
  352.        
  353.         ; Update the task logic
  354.         bsr T2_UPDATE
  355.        
  356.         ; Do graphicap stuff
  357.         bsr T2_PLOT
  358.        
  359.         ; That's it. End by switching to next task
  360.         move.b  #4, D0
  361.         trap    #0     
  362. * ----------------------------------------------------------
  363.  
  364. * ----------------------------------------------------------
  365. T2_INIT:                                                       
  366. * Task 2 initialization code
  367. * ----------------------------------------------------------
  368.         ; Store the task ID and GROUP in TMP to
  369.         ; ease further access if necessary.
  370.         move.w  D1, TK_VAR_ID(A0)
  371.         move.w  D2, TK_VAR_GROUP(A0)
  372.        
  373.         ; Init current mouse state to non-pressed
  374.         clr.b TK_VAR_MOUSE_BUT(A1)
  375.                        
  376.         ; End by switching to next task
  377.         move.b  #4, D0
  378.         trap    #0     
  379. * ----------------------------------------------------------
  380.        
  381. * ----------------------------------------------------------
  382. T2_UPDATE:                                                     
  383. * Task 2 update task logic
  384. * ----------------------------------------------------------
  385.         ; Store previous state
  386.         move.b  TK_VAR_MOUSE_BUT(A1), T2_VAR_MOUSE_PRE(A0)
  387.        
  388.         ; Query mouse
  389.         clr.b   D1
  390.         move.b  #61, D0
  391.         trap    #15    
  392.        
  393.         ; Store X coordinate
  394.         move.w  D1, TK_VAR_MOUSE_X(A1)
  395.         swap    D1
  396.        
  397.         ; Store Y coordinate
  398.         move.w  D1, TK_VAR_MOUSE_Y(A1)
  399.        
  400.         ; Store mouse button state
  401.         and.b   #$01, D0   
  402.         move.b  D0, TK_VAR_MOUSE_BUT(A1)
  403.  
  404.         ; Compute click
  405.         move.b  T2_VAR_MOUSE_PRE(A0), D1
  406.         not.b   D1
  407.         and.b   D0, D1
  408.         and.b   #$01, D1
  409.         move.b  D1, TK_VAR_MOUSE_CLK(A1)
  410.        
  411.         ; That's it
  412.         rts    
  413. * ----------------------------------------------------------
  414.  
  415. * ----------------------------------------------------------
  416. T2_PLOT:                                                       
  417. * Task 3 drawing stuff
  418. * ----------------------------------------------------------
  419.                 ; That's it
  420.         rts
  421. * ----------------------------------------------------------
  422.  
  423. ; ==========================================================
  424. ; Task 2 strings
  425. ; ==========================================================
  426. T2_STR_COMMA:   dc.b    ', ',0
  427.         ds.w    0
  428.        
  429. ************************************************************
  430. *                            TASK 3                        *
  431. * -------------------------------------------------------- *
  432. * Name       : KEYBOARD MANAGER                            *
  433. * Description: Checks for SPACE, UP and DOWN keypresses    *
  434. *              and stores them in shared memory.           *
  435. ************************************************************
  436.  
  437. ; ==========================================================
  438. ; Task 3 constants
  439. ; ==========================================================
  440. ; TMP offsets
  441. T3_VAR_SPC_PRE  EQU 4   ; Byte
  442. T3_VAR_UP_PRE   EQU 5   ; Byte
  443. T3_VAR_DWN_PRE  EQU 6   ; Byte
  444.  
  445. ; ==========================================================
  446. ; Task 3 functions
  447. ; ==========================================================
  448.  
  449. * ----------------------------------------------------------
  450. T3_TEP:
  451. * Task 3 entry point.
  452. * ----------------------------------------------------------
  453.         ; Check if status is "initializing". If so,
  454.         ; execute the initialization code.
  455.         cmp.w   #TM_TCB_STATUS_INIT, D3
  456.         beq T3_INIT
  457.        
  458.         ; Update the task logic
  459.         bsr T3_UPDATE
  460.        
  461.         ; Do graphical stuff
  462.         bsr T3_PLOT
  463.        
  464.         ; That's it. End by switching to next task
  465.         move.b  #4, D0
  466.         trap    #0     
  467. * ----------------------------------------------------------
  468.  
  469. * ----------------------------------------------------------
  470. T3_INIT:                                                       
  471. * Task 3 initialization code
  472. * ----------------------------------------------------------
  473.         ; Store the task ID and GROUP in TMP to
  474.         ; ease further access if necessary.
  475.         move.w  D1, TK_VAR_ID(A0)
  476.         move.w  D2, TK_VAR_GROUP(A0)
  477.        
  478.         ; Initialize to non-pressed
  479.         clr.l   TK_VAR_SPC_PRESS(A1)
  480.         clr.l   TK_VAR_UP_PRESS(A1)
  481.         clr.l   TK_VAR_UP_PRESS(A1)
  482.        
  483.         ; End by switching to next task
  484.         move.b  #4, D0
  485.         trap    #0     
  486. * ----------------------------------------------------------
  487.        
  488. * ----------------------------------------------------------
  489. T3_UPDATE:                                                     
  490. * Task 3 update task logic
  491. * ----------------------------------------------------------
  492.         ; Update previous
  493.         move.b  TK_VAR_SPC_PRESS(A1), T3_VAR_SPC_PRE(A0)
  494.         move.b  TK_VAR_UP_PRESS(A1), T3_VAR_UP_PRE(A0)
  495.         move.b  TK_VAR_DWN_PRESS(A1), T3_VAR_DWN_PRE(A0)       
  496.  
  497.         ; Check space and M
  498.         move.b  #19, D0
  499.         move.l  #$28<<24+$26<<16+' '<<8+' ',D1
  500.         trap    #15
  501.        
  502.         ; Store space
  503.         move.b  D1, TK_VAR_SPC_PRESS(A1)
  504.        
  505.         ; Compute space click
  506.         move.b  T3_VAR_SPC_PRE(A0), D0
  507.         not.b   D0
  508.         and.b   D0, D1
  509.         move.b  D1, TK_VAR_SPC_CLK(A1)
  510.        
  511.         ; Store UP
  512.         swap    D1
  513.         move.b  D1, TK_VAR_UP_PRESS(A1)
  514.        
  515.         ; Compute UP click
  516.         move.b  T3_VAR_UP_PRE(A0), D0
  517.         not.b   D0
  518.         and.b   D0, D1
  519.         move.b  D1, TK_VAR_UP_CLK(A1)
  520.        
  521.         ; Store DOWN
  522.         lsr     #8, D1
  523.         move.b  D1, TK_VAR_DWN_PRESS(A1)
  524.        
  525.         ; Compute UP click
  526.         move.b  T3_VAR_DWN_PRE(A0), D0
  527.         not.b   D0
  528.         and.b   D0, D1
  529.         move.b  D1, TK_VAR_DWN_CLK(A1)
  530.  
  531.         ; That's it
  532. .END:       rts    
  533. * ----------------------------------------------------------
  534.  
  535. * ----------------------------------------------------------
  536. T3_PLOT:                                                       
  537. * Task 3 drawing stuff
  538. * ----------------------------------------------------------
  539.         move.l  A1, A2
  540.        
  541.         ; Check if UP is pressed       
  542.         move.b  TK_VAR_UP_PRESS(A1), D0
  543.         or.b    D0, D0
  544.         beq .DOWN
  545.  
  546.         ; Print the string
  547.         TK_SET_PEN #$00FFFFFF
  548.         TK_SET_FILL #$0000FF00     
  549.         TK_LOCATE #0, #2
  550.         move.l  #T3_STR_UP, A1
  551.         move.b  #14, D0
  552.         trap    #15
  553.        
  554.         ; Check if DOWN is pressed     
  555. .DOWN:      move.b  TK_VAR_DWN_PRESS(A1), D0
  556.         or.b    D0, D0
  557.         beq .END
  558.  
  559.         ; Print the string
  560.         TK_SET_PEN #$00FFFFFF
  561.         TK_SET_FILL #$0000FF00     
  562.         TK_LOCATE #0, #3
  563.         move.l  #T3_STR_DWN, A1
  564.         move.b  #14, D0
  565.         trap    #15
  566.        
  567.         ; That's it!       
  568. .END:       move.l  A2, A1
  569.                 rts
  570. * ----------------------------------------------------------
  571.  
  572. ; ==========================================================
  573. ; Task 3 strings
  574. ; ==========================================================
  575. T3_STR_SPACE:   dc.b    'SPACE PRESSED',0
  576. T3_STR_UP:  dc.b    'UP PRESSED',0
  577. T3_STR_DWN: dc.b    'DOWN PRESSED',0
  578.         ds.w    0
  579.  
  580. ************************************************************
  581. *                            TASK 4                        *
  582. * -------------------------------------------------------- *
  583. * Name       : PLAYER                                      *
  584. * Description: Displays a battleship that can be moved     *
  585. *              with the arrow keys and shoot bullets with  *
  586. *              the spacebar.                               *
  587. ************************************************************
  588.  
  589. ; ==========================================================
  590. ; Task 4 constants
  591. ; ==========================================================
  592. ; General constants
  593. T4_PLAYER_HALF_SIZE    EQU 16
  594. T4_PLAYER_SPEED     EQU 16
  595.  
  596. ; TMP offsets
  597. T4_VAR_SY       EQU 4   ; Word
  598.  
  599. ; ==========================================================
  600. ; Task 4 functions
  601. ; ==========================================================
  602.  
  603. * ----------------------------------------------------------
  604. T4_TEP:
  605. * Task 4 entry point.
  606. * ----------------------------------------------------------
  607.         ; Check if status is "initializing". If so,
  608.         ; execute the initialization code.
  609.         cmp.w   #TM_TCB_STATUS_INIT, D3
  610.         beq T4_INIT
  611.        
  612.         ; Update the player logic
  613.         bsr T4_UPDATE
  614.        
  615.         ; Paint the player
  616.         bsr T4_PLOT
  617.        
  618.         ; That's it. End by switching to next task
  619.         move.b  #4, D0
  620.         trap    #0     
  621. * ----------------------------------------------------------
  622.  
  623. * ----------------------------------------------------------
  624. T4_INIT:                                                       
  625. * Task 4 initialization code
  626. * ----------------------------------------------------------
  627.         ; Store the task ID and GROUP in TMP to
  628.         ; ease further access if necessary.
  629.         move.w  D1, TK_VAR_ID(A0)
  630.         move.w  D2, TK_VAR_GROUP(A0)
  631.        
  632.         ; Place the initial player coordinates at the center of the
  633.         ; left part of the screen
  634.         move.w  #TK_SCREEN_HEIGHT/2-T4_PLAYER_HALF_SIZE, TK_VAR_PLAYER_Y(A1)
  635.        
  636.         ; Init speed to 0
  637.         move.w  #0, T4_VAR_SY(A0)
  638.        
  639.         ; End by switching to next task
  640.         move.b  #4, D0
  641.         trap    #0     
  642. * ----------------------------------------------------------
  643.        
  644. * ----------------------------------------------------------
  645. T4_UPDATE:                                                     
  646. * Task 4 update task logic
  647. * ----------------------------------------------------------
  648.             ; Check if UP or DOWN are pressed
  649.         move.b  TK_VAR_UP_PRESS(A1), D0
  650.         move.b  TK_VAR_DWN_PRESS(A1), D1
  651.         eor.b   D0, D1
  652.         beq     .SPACE
  653.         or.b    D0, D0
  654.         bne .UP
  655.         or.b    D1, D1
  656.         bne .DOWN
  657.        
  658. .KINEMATICS:    ; Simple kinematic model: Y=Y+SY
  659.         move.w  TK_VAR_PLAYER_Y(A1), D0
  660.         add.w   T4_VAR_SY(A0), D0
  661.        
  662.         ; If it would move out of the screen, don't update
  663.         bmi     .SPACE
  664.             move.w  #TK_SCREEN_HEIGHT-T4_PLAYER_HALF_SIZE*2, D1
  665.             sub.w   D0, D1
  666.             bmi     .SPACE
  667.            
  668.             ; Else update the Y variable
  669.         move.w  D0, TK_VAR_PLAYER_Y(A1)
  670.        
  671. .SPACE:     ; Check if SPACE was clicked
  672.         move.b  TK_VAR_SPC_CLK(A1), D0
  673.         or.b    D0, D0
  674.         beq     .END
  675.        
  676.         ; If clicked, create a new bullet
  677.         move.l  A0, A3
  678.         lea T5_TEP, A0
  679.         move.w  #TK_GROUP_BULLET, D1
  680.         move.b  #0, D0
  681.         trap    #0
  682.         move.l  A3, A0
  683.        
  684.         ; That's it!
  685. .END:           rts
  686.  
  687. .UP:           ; UP pressed means we have to move up
  688.                 move.w  #0-T4_PLAYER_SPEED, T4_VAR_SY(A0)
  689.         bra .KINEMATICS
  690.        
  691. .DOWN:         ; DOWN pressed means we have to move down
  692.                 move.w  #T4_PLAYER_SPEED, T4_VAR_SY(A0)
  693.         bra .KINEMATICS
  694. * ----------------------------------------------------------
  695.  
  696. * ----------------------------------------------------------
  697. T4_PLOT:                                                       
  698. * Task 4 drawing stuff
  699. * ----------------------------------------------------------
  700.         ; Prepare colors
  701.         TK_SET_PEN  #$00FFFFFF
  702.         TK_SET_FILL #$000000FF
  703.  
  704.         ; Get the player's coordinates
  705.         move.w  #T4_PLAYER_HALF_SIZE, D1
  706.         move.w  TK_VAR_PLAYER_Y(A1), D2
  707.        
  708.         ; Draw the player
  709.                 move.b  #86, D0
  710.         trap    #15
  711.        
  712.                 add.w   #32, D1
  713.                 add.w   #T4_PLAYER_HALF_SIZE, D2
  714.         move.b  #85, D0
  715.         trap    #15
  716.        
  717.         sub.w   #32, D1
  718.                 add.w   #T4_PLAYER_HALF_SIZE, D2
  719.         move.b  #85, D0
  720.         trap    #15
  721.        
  722.                 sub.w   #32, D2
  723.         move.b  #85, D0
  724.         trap    #15
  725.        
  726.                 add.w   #T4_PLAYER_HALF_SIZE, D1
  727.                 add.w   #T4_PLAYER_HALF_SIZE, D2
  728.         move.b  #89, D0
  729.         trap    #15
  730.        
  731.         ; That's it
  732.         rts
  733. * ----------------------------------------------------------
  734.  
  735. ************************************************************
  736. *                            TASK 5                        *
  737. * -------------------------------------------------------- *
  738. * Name       : BULLET                                      *
  739. * Description: Displays a bullet that can moves from left  *
  740. *              to right and collides with asteroids.       *
  741. ************************************************************
  742.  
  743. ; ==========================================================
  744. ; Task 5 constants
  745. ; ==========================================================
  746. ; General constants
  747. T5_BULLET_WIDTH    EQU 32
  748. T5_BULLET_HALF_HEIGHT  EQU 1
  749. T5_BULLET_SPEED     EQU 16
  750.  
  751. ; TMP offsets
  752. T5_VAR_X        EQU 4   ; Word
  753. T5_VAR_Y        EQU 6   ; Word
  754.  
  755. ; ==========================================================
  756. ; Task 5 functions
  757. ; ==========================================================
  758.  
  759. * ----------------------------------------------------------
  760. T5_TEP:
  761. * Task 5 entry point.
  762. * ----------------------------------------------------------
  763.         ; Check if status is "initializing". If so,
  764.         ; execute the initialization code.
  765.         cmp.w   #TM_TCB_STATUS_INIT, D3
  766.         beq T5_INIT
  767.        
  768.         ; Update the player logic
  769.         bsr T5_UPDATE
  770.        
  771.         ; Paint the player
  772.         bsr T5_PLOT
  773.        
  774.         ; That's it. End by switching to next task
  775.         move.b  #4, D0
  776.         trap    #0     
  777. * ----------------------------------------------------------
  778.  
  779. * ----------------------------------------------------------
  780. T5_INIT:                                                       
  781. * Task 5 initialization code
  782. * ----------------------------------------------------------
  783.         ; Store the task ID and GROUP in TMP to
  784.         ; ease further access if necessary.
  785.         move.w  D1, TK_VAR_ID(A0)
  786.         move.w  D2, TK_VAR_GROUP(A0)
  787.        
  788.         ; Place the initial bullet coordinate at the player
  789.         move.w  #T4_PLAYER_HALF_SIZE*2, T5_VAR_X(A0)
  790.         move.w  TK_VAR_PLAYER_Y(A1), D0
  791.         add.w   #T4_PLAYER_HALF_SIZE-T5_BULLET_HALF_HEIGHT, D0
  792.         move.w  D0, T5_VAR_Y(A0)
  793.        
  794.         ; End by switching to next task
  795.         move.b  #4, D0
  796.         trap    #0     
  797. * ----------------------------------------------------------
  798.        
  799. * ----------------------------------------------------------
  800. T5_UPDATE:                                                     
  801. * Task 5 update task logic
  802. * ----------------------------------------------------------       
  803.             ; Simple kinematic model: X=X+SY
  804.         move.w  T5_VAR_X(A0), D0
  805.         add.w   #T5_BULLET_SPEED, D0
  806.        
  807.         ; If it moves out of the screen, remove the task
  808.             move.w  #TK_SCREEN_WIDTH, D1
  809.             sub.w   D0, D1
  810.             bmi     .REMOVE
  811.            
  812.             ; Else update the X variable
  813.         move.w  D0, T5_VAR_X(A0)
  814.        
  815.         ; Store task TMP
  816.         move.l  A0, A3
  817.        
  818.         ; Get first task info
  819.         move.b  #6, D0
  820.         trap    #0     
  821.                
  822.                 ; Is it the last one?
  823. .LOOP:      cmp.l   #$FFFFFFFF, A2
  824.         beq .END
  825.        
  826.         ; Is it in the asteroid group?
  827.         cmp.w   #TK_GROUP_ASTEROID, D2
  828.         bne .NEXT
  829.        
  830.         ; Is it running?
  831.         cmp.w   #TM_TCB_STATUS_RUN, D3
  832.         bne .NEXT
  833.        
  834.         ; This task is a running asteroid. Let's check coordinates     
  835.         move.w  T5_VAR_X(A3), D0
  836.         move.w  T5_VAR_Y(A3), D1
  837.        
  838.         move.w  T7_VAR_X(A0), D4
  839.         move.w  T7_VAR_Y(A0), D5
  840.         move.w  D4, D6
  841.         add.w   #T7_ASTEROID_SIZE, D6
  842.         move.w  D5, D7
  843.         add.w   #T7_ASTEROID_SIZE, D7
  844.        
  845.         ; Left
  846.         cmp.w   D0, D6
  847.         ble     .NEXT
  848.        
  849.         ; Right
  850.         add.w   #T5_BULLET_WIDTH, D0
  851.         cmp.w   D0, D4
  852.         bgt     .NEXT
  853.        
  854.         ; Top
  855.         cmp.w   D1, D7
  856.         ble     .NEXT
  857.        
  858.         ; Bottom
  859.         add.w   #T5_BULLET_HALF_HEIGHT*2, D1
  860.         cmp.w   D1, D5
  861.         bgt     .NEXT
  862.        
  863.         ; Add 1 to lives
  864.         add.w  #1, TK_VAR_LIVES(A1)
  865.        
  866.         ; Remove the asteroid and the bullet
  867.         move.w  TK_VAR_ID(A0), D1
  868.         move.b  #1, D0
  869.         trap    #0
  870.         move.w  TK_VAR_ID(A3), D1
  871.         move.b  #1, D0
  872.         trap    #0
  873.         bra     .END
  874.        
  875. .NEXT:      ; Next task info
  876.                 move.b  #7, D0
  877.         trap    #0
  878.         bra .LOOP
  879.        
  880.         ; That's it!
  881. .END:       move.l  A3, A0
  882. .END2:         rts
  883.                
  884. .REMOVE:       ; Decreases the lives and removes the bullet
  885.         sub.w  #1, TK_VAR_LIVES(A1)
  886.                 move.w  TK_VAR_ID(A0), D1
  887.         move.b  #1, D0
  888.         trap    #0
  889.                 bra     .END2
  890. * ----------------------------------------------------------
  891.  
  892. * ----------------------------------------------------------
  893. T5_PLOT:                                                       
  894. * Task 5 drawing stuff
  895. * ----------------------------------------------------------
  896.         ; Prepare colors
  897.         TK_SET_PEN  #$00FFFFFF
  898.         TK_SET_FILL #$00FFFFFF
  899.  
  900.         ; Get the bullet's bounding box
  901.         move.w  T5_VAR_X(A0), D1
  902.         move.w  T5_VAR_Y(A0), D2
  903.         move.w  D1, D3
  904.         add.w   #T5_BULLET_WIDTH, D3
  905.         move.w  D2, D4
  906.         add.w   #T5_BULLET_HALF_HEIGHT*2, D4
  907.        
  908.         ; Draw the bullet
  909.                 TK_DRAW_RECTANGLE
  910.        
  911.         ; That's it
  912.         rts
  913. * ----------------------------------------------------------
  914.  
  915. ************************************************************
  916. *                            TASK 6                        *
  917. * -------------------------------------------------------- *
  918. * Name       : CONTROLLER                                  *
  919. * Description: Creates asteroid tasks and controls the     *
  920. *              pace of the game.                           *
  921. ************************************************************
  922.  
  923. ; ==========================================================
  924. ; Task 6 constants
  925. ; ==========================================================
  926. ; General constants
  927. T6_NUMBER_INCREASE  EQU 10
  928.  
  929. ; TMP offsets
  930. T6_VAR_AST_NUMBER   EQU 4   ; Word
  931.  
  932. ; ==========================================================
  933. ; Task 6 functions
  934. ; ==========================================================
  935.  
  936. * ----------------------------------------------------------
  937. T6_TEP:
  938. * Task 6 entry point.
  939. * ----------------------------------------------------------
  940.         ; Check if status is "initializing". If so,
  941.         ; execute the initialization code.
  942.         cmp.w   #TM_TCB_STATUS_INIT, D3
  943.         beq T6_INIT
  944.        
  945.         ; Update the task logic
  946.         bsr T6_UPDATE
  947.        
  948.         ; Do graphical stuff
  949.         bsr T6_PLOT
  950.        
  951.         ; That's it. End by switching to next task
  952.         move.b  #4, D0
  953.         trap    #0     
  954. * ----------------------------------------------------------
  955.  
  956. * ----------------------------------------------------------
  957. T6_INIT:                                                       
  958. * Task 6 initialization code
  959. * ----------------------------------------------------------
  960.         ; Store the task ID and GROUP in TMP to
  961.         ; ease further access if necessary.
  962.         move.w  D1, TK_VAR_ID(A0)
  963.         move.w  D2, TK_VAR_GROUP(A0)
  964.        
  965.         ; Set the RNG seed to a new one
  966.         bsr     TK_RNG_GENERATE_SEED
  967.        
  968.         ; Set the level to 1
  969.         move.w  #1, TK_VAR_LEVEL(A1)
  970.        
  971.         ; Set the lives to 3
  972.         move.w  #3, TK_VAR_LIVES(A1)
  973.        
  974.         ; Set the initial number and chance
  975.         move.w  #T6_NUMBER_INCREASE, T6_VAR_AST_NUMBER(A0)
  976.        
  977.         ; End by switching to next task
  978.         move.b  #4, D0
  979.         trap    #0     
  980. * ----------------------------------------------------------
  981.        
  982. * ----------------------------------------------------------
  983. T6_UPDATE:                                                     
  984. * Task 6 update task logic
  985. * ----------------------------------------------------------
  986.                 ; Get the remaining number of asteroids
  987.                 move.w  T6_VAR_AST_NUMBER(A0), D1
  988.                 or.w    D1, D1
  989.                 beq     .NEXTLEVEL
  990.  
  991.                 ; Generate an asteroid at a random time
  992.                 bsr     TK_RNG_NEXT
  993.                 and.l   #$1F, D0        ; Number between 0 and 31
  994.                 bne     .END
  995.                
  996.                 ; Decrease the number if its greater than 0
  997.                 sub.w   #1, D1
  998.                 move.w  D1, T6_VAR_AST_NUMBER(A0)
  999.                
  1000.                 ; Create an asteroid task
  1001.         lea T7_TEP, A0
  1002.         move.w  #TK_GROUP_ASTEROID, D1
  1003.         move.b  #0, D0
  1004.         trap    #0
  1005.         bra     .END
  1006.        
  1007. .NEXTLEVEL: ; Increase the level if there are no more asteroids
  1008.                 ; Store task TMP
  1009.         move.l  A0, A3
  1010.        
  1011.         ; Get first task info
  1012.         move.b  #6, D0
  1013.         trap    #0
  1014.                
  1015.                 ; Is it the last one?
  1016. .LOOP:      cmp.l   #$FFFFFFFF, A2
  1017.         beq .INCREASELEVEL
  1018.        
  1019.         ; Is it in the asteroid group?
  1020.         cmp.w   #TK_GROUP_ASTEROID, D2
  1021.         beq .END2
  1022.        
  1023. .NEXT:      ; Next task info
  1024.                 move.b  #7, D0
  1025.         trap    #0
  1026.         bra .LOOP
  1027.        
  1028. .INCREASELEVEL: ; Increase the level
  1029.                 add.w   #1, TK_VAR_LEVEL(A1)
  1030.                 move.w  TK_VAR_LEVEL(A1), D0
  1031.                 mulu    #T6_NUMBER_INCREASE, D0
  1032.                 move.w  D0, T6_VAR_AST_NUMBER(A3)
  1033.                
  1034. .END2:      ; That's it
  1035.                 move.l  A3, A0
  1036. .END:       rts    
  1037. * ----------------------------------------------------------
  1038.  
  1039. * ----------------------------------------------------------
  1040. T6_PLOT:                                                       
  1041. * Task 6 drawing stuff
  1042. * ----------------------------------------------------------
  1043.         move.l  A1, A2
  1044.        
  1045.         ; Print the lives
  1046.         TK_SET_PEN #$00FFFFFF
  1047.         TK_SET_FILL #$00000000     
  1048.         TK_LOCATE #0, #0
  1049.         move.l  #T6_STR_LIVES, A1
  1050.         move.b  #14, D0
  1051.         trap    #15
  1052.         move.w  TK_VAR_LIVES(A2), D1
  1053.         ext.l   D1
  1054.         move.b  #3, D0
  1055.         trap    #15
  1056.        
  1057.         ; Print the level
  1058.         TK_SET_PEN #$00FFFFFF
  1059.         TK_SET_FILL #$00000000     
  1060.         TK_LOCATE #0, #1
  1061.         move.l  #T6_STR_LEVEL, A1
  1062.         move.b  #14, D0
  1063.         trap    #15
  1064.         move.w  TK_VAR_LEVEL(A2), D1
  1065.         move.b  #3, D0
  1066.         trap    #15
  1067.        
  1068.         move.l  A2, A1
  1069.        
  1070. .END:       rts
  1071. * ----------------------------------------------------------
  1072.  
  1073. ; ==========================================================
  1074. ; Task 6 strings
  1075. ; ==========================================================
  1076. T6_STR_LEVEL:   dc.b    'LEVEL ',0
  1077. T6_STR_LIVES:   dc.b    'LIVES ',0
  1078.         ds.w    0
  1079.  
  1080. ************************************************************
  1081. *                            TASK 7                        *
  1082. * -------------------------------------------------------- *
  1083. * Name       : ASTEROID                                    *
  1084. * Description: Displays an asteroid that can moves from    *
  1085. *              left to right and collides with asteroids.  *
  1086. ************************************************************
  1087.  
  1088. ; ==========================================================
  1089. ; Task 7 constants
  1090. ; ==========================================================
  1091. ; General constants
  1092. T7_ASTEROID_SIZE   EQU 32
  1093.  
  1094. ; TMP offsets
  1095. T7_VAR_X        EQU 4   ; Word
  1096. T7_VAR_SX       EQU 6   ; Word
  1097. T7_VAR_Y        EQU 8   ; Word
  1098. T7_VAR_SY       EQU 10  ; Word
  1099.  
  1100. ; ==========================================================
  1101. ; Task 7 functions
  1102. ; ==========================================================
  1103.  
  1104. * ----------------------------------------------------------
  1105. T7_TEP:
  1106. * Task 7 entry point.
  1107. * ----------------------------------------------------------
  1108.         ; Check if status is "initializing". If so,
  1109.         ; execute the initialization code.
  1110.         cmp.w   #TM_TCB_STATUS_INIT, D3
  1111.         beq T7_INIT
  1112.        
  1113.         ; Update the task logic
  1114.         bsr T7_UPDATE
  1115.        
  1116.         ; Do graphical stuff
  1117.         bsr T7_PLOT
  1118.        
  1119.         ; That's it. End by switching to next task
  1120.         move.b  #4, D0
  1121.         trap    #0     
  1122. * ----------------------------------------------------------
  1123.  
  1124. * ----------------------------------------------------------
  1125. T7_INIT:                                                       
  1126. * Task 7 initialization code
  1127. * ----------------------------------------------------------
  1128.         ; Store the task ID and GROUP in TMP to
  1129.         ; ease further access if necessary.
  1130.         move.w  D1, TK_VAR_ID(A0)
  1131.         move.w  D2, TK_VAR_GROUP(A0)
  1132.        
  1133.         ; Set the X to the right edge of the screen
  1134.         move.w  #TK_SCREEN_WIDTH, T7_VAR_X(A0)
  1135.        
  1136.         ; Set the Y to a random number
  1137.         bsr     TK_RNG_NEXT             ; Get random number
  1138.         and.l   #$F, D0                 ; Number between 0 and 15
  1139.         mulu    #29, D0                 ; Number between 0 and 435
  1140.         add.w   #(TK_SCREEN_HEIGHT-(435+T7_ASTEROID_SIZE))/2, D0
  1141.         move.w  D0, T7_VAR_Y(A0)        ; Center the range and set Y
  1142.        
  1143.         ; Init speed vector to random numbers based on level
  1144.         move.w  TK_VAR_LEVEL(A1), D1
  1145.         move.w  D1, D0
  1146.         neg.w   D0
  1147.         move.w  D0, T7_VAR_SX(A0)
  1148.         bsr     TK_RNG_NEXT             ; Get random number
  1149.         and.l   #$7, D0                 ; Number between 0 and 7
  1150.         sub.w   #4, D0                  ; Number between -4 and 3
  1151.         mulu    D1, D0
  1152.         move.w  D0, T7_VAR_SY(A0)
  1153.        
  1154.         ; End by switching to next task
  1155.         move.b  #4, D0
  1156.         trap    #0     
  1157. * ----------------------------------------------------------
  1158.        
  1159. * ----------------------------------------------------------
  1160. T7_UPDATE:                                                     
  1161. * Task 7 update task logic
  1162. * ----------------------------------------------------------
  1163.                 ; Check if too much to the left
  1164.                 move.w  T7_VAR_X(A0), D0
  1165.                 or.w    D0, D0
  1166.         bmi .REMOVE
  1167.                
  1168.         ; Check if vertically colliding with screen
  1169.         ; boundaries.
  1170.         cmp.w   #0, T7_VAR_Y(A0)
  1171.         bls .YBOUNCE
  1172.         cmp.w   #TK_SCREEN_HEIGHT-T7_ASTEROID_SIZE, T7_VAR_Y(A0)
  1173.         bhs .YBOUNCE
  1174.        
  1175. .KINEMATICS:    ; Simple kinematic model: X=X+SX, Y=Y+SY
  1176.         move.w  T7_VAR_X(A0), D0
  1177.         move.w  T7_VAR_Y(A0), D1
  1178.         add.w   T7_VAR_SX(A0), D0
  1179.         add.w   T7_VAR_SY(A0), D1
  1180.         move.w  D0, T7_VAR_X(A0)
  1181.         move.w  D1, T7_VAR_Y(A0)
  1182.        
  1183.         ; That's it!
  1184. .END:       rts    
  1185.  
  1186. .REMOVE:       ; Decreases the lives and deletes the asteroid
  1187.                 sub.w   #3, TK_VAR_LIVES(A1)
  1188.                 move.w  TK_VAR_ID(A0), D1
  1189.         move.b  #1, D0
  1190.         trap    #0
  1191.                 bra     .END
  1192.        
  1193. .YBOUNCE:   ; Y bouncing is just changing the Y speed sign
  1194.         neg T7_VAR_SY(A0)
  1195.         bra .KINEMATICS        
  1196. * ----------------------------------------------------------
  1197.  
  1198. * ----------------------------------------------------------
  1199. T7_PLOT:                                                       
  1200. * Task 7 drawing stuff
  1201. * ----------------------------------------------------------
  1202.                 ; Prepare colors
  1203.         TK_SET_PEN  #$00FFFFFF
  1204.         TK_SET_FILL #$000000FF 
  1205.  
  1206.         ; Get the asteroid's coordinates
  1207.         move.w  T7_VAR_X(A0), D1
  1208.         move.w  T7_VAR_Y(A0), D2       
  1209.        
  1210.         ; Compute bounding box     
  1211.         move.w  D1, D3
  1212.         move.w  D2, D4
  1213.         add.w   #T7_ASTEROID_SIZE, D3
  1214.         add.w   #T7_ASTEROID_SIZE, D4
  1215.        
  1216.         ; Draw it
  1217.         TK_DRAW_ELLIPSE
  1218.        
  1219.         ; That's it
  1220.         rts
  1221. * ----------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement