Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ************************************************************
- * COMMON CONSTANTS *
- ************************************************************
- ; Screen-related constants
- TK_SCREEN_WIDTH EQU 640
- TK_SCREEN_HEIGHT EQU 480
- ; Task groups
- TK_GROUP_DBUFFER EQU 0
- TK_GROUP_MOUSE EQU 1
- TK_GROUP_KEYBOARD EQU 2
- TK_GROUP_PLAYER EQU 3
- TK_GROUP_BULLET EQU 4
- TK_GROUP_CONTROLLER EQU 5
- TK_GROUP_ASTEROID EQU 6
- ; General-purpose TMP offsets
- TK_VAR_ID EQU 0 ; Word
- TK_VAR_GROUP EQU 2 ; Word
- ; SMP offsets
- TK_VAR_MOUSE_X EQU 0 ; Word
- TK_VAR_MOUSE_Y EQU 2 ; Word
- TK_VAR_MOUSE_BUT EQU 4 ; Byte
- TK_VAR_MOUSE_CLK EQU 5 ; Byte
- TK_VAR_SPC_PRESS EQU 6 ; Byte
- TK_VAR_SPC_CLK EQU 7 ; Byte
- TK_VAR_UP_PRESS EQU 8 ; Byte
- TK_VAR_UP_CLK EQU 9 ; Byte
- TK_VAR_DWN_PRESS EQU 10 ; Byte
- TK_VAR_DWN_CLK EQU 11 ; Byte
- TK_VAR_RNG_SEED EQU 12 ; Long
- TK_VAR_LIVES EQU 16 ; Word
- TK_VAR_LEVEL EQU 18 ; Word
- TK_VAR_PLAYER_Y EQU 20 ; Word
- TK_VAR_AST_SPEED EQU 22 ; Word
- ************************************************************
- * COMMON MACROS *
- ************************************************************
- *-----------------------------------------------------------
- * Macro to set screen resolution.
- * Parameters: \1: Width (pixels)
- * \2: Height (pixels)
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_SET_RES MACRO
- move.b #33, D0
- move.l #\1*$10000+\2, D1
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to set windowed mode
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_SET_WINDOWED MACRO
- move.b #33, D0
- move.l #1, D1
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to enable double buffer
- * Parameters:
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_ENABLE_DBUFFER MACRO
- move.b #17, D1
- move.b #92, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to repaint screen (only in double buffer mode)
- * Parameters:
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_REPAINT_SCREEN MACRO
- move.b #94, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to clear the screen
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_CLEAR MACRO
- move.b #11, D0
- move.w #$FF00, D1
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to set the pen color.
- * Parameters: \1: Color in format $00BBGGRR
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_SET_PEN MACRO
- move.l \1, D1
- move.b #80, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to set the fill color.
- * Parameters: \1: Color in format $00BBGGRR
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_SET_FILL MACRO
- move.l \1, D1
- move.b #81, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to draw a rectangle
- * Parameters: No parameters. Coordinates are specified using
- * D1.W(Left), D2.W(Top), D3.W(Right), D4.W(Bottom)
- * Modifies : D0
- *-----------------------------------------------------------
- TK_DRAW_RECTANGLE MACRO
- move.b #87, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to draw an ellipse
- * Parameters: No parameters. Coordinates are specified using
- * D1.W(Left), D2.W(Top), D3.W(Right), D4.W(Bottom)
- * Modifies : D0
- *-----------------------------------------------------------
- TK_DRAW_ELLIPSE MACRO
- move.b #88, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- *-----------------------------------------------------------
- * Macro to locate the text cursor
- * Parameters: \1: X
- * \2: Y
- * Modifies : D0, D1
- *-----------------------------------------------------------
- TK_LOCATE MACRO
- move.b \1, D1 ; Put X coordinate
- lsl.w #8, D1
- move.b \2, D1 ; Put Y coordinate
- move.b #11, D0
- trap #15
- ENDM
- *-----------------------------------------------------------
- ************************************************************
- * INITIALIZATION ROUTINE *
- ************************************************************
- * ----------------------------------------------------------
- TK_INIT:
- * Adds the tasks in the approppriate order into the task
- * manager.
- * ----------------------------------------------------------
- ; Define minimum cycle time
- move.l #3, D1
- move.b #11, D0
- trap #0
- ; Add double buffer task
- lea T1_TEP, A0 ; TEP
- move.w #TK_GROUP_DBUFFER, D1 ; GROUP
- move.b #0, D0 ; TM Function 0
- trap #0
- ; Add mouse task
- lea T2_TEP, A0 ; TEP
- move.w #TK_GROUP_MOUSE, D1 ; GROUP
- move.b #0, D0 ; TM Function 0
- trap #0
- ; Add keyboard task
- lea T3_TEP, A0 ; TEP
- move.w #TK_GROUP_KEYBOARD, D1 ; GROUP
- move.b #0, D0 ; TM Function 0
- trap #0
- ; Add player task
- lea T4_TEP, A0 ; TEP
- move.w #TK_GROUP_PLAYER, D1 ; GROUP
- move.b #0, D0 ; TM Function 0
- trap #0
- ; Add controller task
- lea T6_TEP, A0 ; TEP
- move.w #TK_GROUP_CONTROLLER, D1 ; GROUP
- move.b #0, D0 ; TM Function 0
- trap #0
- rts
- * ----------------------------------------------------------
- ************************************************************
- * ALL-PURPOSE FUNCTIONS *
- ************************************************************
- * ----------------------------------------------------------
- TK_RNG_GENERATE_SEED:
- * Description : Generates a seed for the RNG to use
- * Pre : A1: SMP
- * Post : TK_RNG_SEED gets updated with a seed
- *-----------------------------------------------------------
- movem.l D0-D1/A0, -(A7)
- move.b #8, D0
- trap #15
- move.l D1, TK_VAR_RNG_SEED(A1)
- movem.l (A7)+, D0-D1/A0
- rts
- * ----------------------------------------------------------
- TK_RNG_NEXT:
- * Description : Returns a pseudo-randomly generated long number
- * Pre : A1: SMP
- * Post : D0.L contains the generated number
- * TK_RNG_SEED gets updated with a new seed
- *-----------------------------------------------------------
- movem.l D1/A0, -(A7)
- move.l TK_VAR_RNG_SEED(A1), D0
- move.l D0, D1
- ror.l #3, D1
- add.l D0, D1
- rol.l #4, D1
- move.l D1, TK_VAR_RNG_SEED(A1)
- movem.l (A7)+, D1/A0
- rts
- ************************************************************
- * TASK 1 *
- * -------------------------------------------------------- *
- * Name: DOUBLE BUFFER MANAGER *
- * Description: Initializes screen and manages double *
- * buffer. *
- ************************************************************
- ; ==========================================================
- ; Task 1 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T1_TEP:
- * Task 1 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T1_INIT
- ; Update the task logic
- bsr T1_UPDATE
- ; Do the graphical stuff
- bsr T1_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T1_INIT:
- * Task 1 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Set the screen resolution
- TK_SET_RES TK_SCREEN_WIDTH, TK_SCREEN_HEIGHT
- ; Set windowed mode
- TK_SET_WINDOWED
- ; Enable double buffer
- TK_ENABLE_DBUFFER
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T1_UPDATE:
- * Task 1 update task logic
- * ----------------------------------------------------------
- ; Nothing to do right now
- rts
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T1_PLOT:
- * Task 1 drawing stuff
- * ----------------------------------------------------------
- ; Update double buffer
- TK_REPAINT_SCREEN
- ; Clear next frame
- TK_CLEAR
- ; That's it!
- rts
- * ----------------------------------------------------------
- ************************************************************
- * TASK 2 *
- * -------------------------------------------------------- *
- * Name : MOUSE MANAGER *
- * Description: Polls mouse, stores its state in shared *
- * memory and prints coordinates. *
- ************************************************************
- ; ==========================================================
- ; Task 2 constants
- ; ==========================================================
- ; TMP offsets
- T2_VAR_MOUSE_PRE EQU 4 ; Byte
- ; ==========================================================
- ; Task 2 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T2_TEP:
- * Task 2 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T2_INIT
- ; Update the task logic
- bsr T2_UPDATE
- ; Do graphicap stuff
- bsr T2_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T2_INIT:
- * Task 2 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Init current mouse state to non-pressed
- clr.b TK_VAR_MOUSE_BUT(A1)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T2_UPDATE:
- * Task 2 update task logic
- * ----------------------------------------------------------
- ; Store previous state
- move.b TK_VAR_MOUSE_BUT(A1), T2_VAR_MOUSE_PRE(A0)
- ; Query mouse
- clr.b D1
- move.b #61, D0
- trap #15
- ; Store X coordinate
- move.w D1, TK_VAR_MOUSE_X(A1)
- swap D1
- ; Store Y coordinate
- move.w D1, TK_VAR_MOUSE_Y(A1)
- ; Store mouse button state
- and.b #$01, D0
- move.b D0, TK_VAR_MOUSE_BUT(A1)
- ; Compute click
- move.b T2_VAR_MOUSE_PRE(A0), D1
- not.b D1
- and.b D0, D1
- and.b #$01, D1
- move.b D1, TK_VAR_MOUSE_CLK(A1)
- ; That's it
- rts
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T2_PLOT:
- * Task 3 drawing stuff
- * ----------------------------------------------------------
- ; That's it
- rts
- * ----------------------------------------------------------
- ; ==========================================================
- ; Task 2 strings
- ; ==========================================================
- T2_STR_COMMA: dc.b ', ',0
- ds.w 0
- ************************************************************
- * TASK 3 *
- * -------------------------------------------------------- *
- * Name : KEYBOARD MANAGER *
- * Description: Checks for SPACE, UP and DOWN keypresses *
- * and stores them in shared memory. *
- ************************************************************
- ; ==========================================================
- ; Task 3 constants
- ; ==========================================================
- ; TMP offsets
- T3_VAR_SPC_PRE EQU 4 ; Byte
- T3_VAR_UP_PRE EQU 5 ; Byte
- T3_VAR_DWN_PRE EQU 6 ; Byte
- ; ==========================================================
- ; Task 3 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T3_TEP:
- * Task 3 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T3_INIT
- ; Update the task logic
- bsr T3_UPDATE
- ; Do graphical stuff
- bsr T3_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T3_INIT:
- * Task 3 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Initialize to non-pressed
- clr.l TK_VAR_SPC_PRESS(A1)
- clr.l TK_VAR_UP_PRESS(A1)
- clr.l TK_VAR_UP_PRESS(A1)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T3_UPDATE:
- * Task 3 update task logic
- * ----------------------------------------------------------
- ; Update previous
- move.b TK_VAR_SPC_PRESS(A1), T3_VAR_SPC_PRE(A0)
- move.b TK_VAR_UP_PRESS(A1), T3_VAR_UP_PRE(A0)
- move.b TK_VAR_DWN_PRESS(A1), T3_VAR_DWN_PRE(A0)
- ; Check space and M
- move.b #19, D0
- move.l #$28<<24+$26<<16+' '<<8+' ',D1
- trap #15
- ; Store space
- move.b D1, TK_VAR_SPC_PRESS(A1)
- ; Compute space click
- move.b T3_VAR_SPC_PRE(A0), D0
- not.b D0
- and.b D0, D1
- move.b D1, TK_VAR_SPC_CLK(A1)
- ; Store UP
- swap D1
- move.b D1, TK_VAR_UP_PRESS(A1)
- ; Compute UP click
- move.b T3_VAR_UP_PRE(A0), D0
- not.b D0
- and.b D0, D1
- move.b D1, TK_VAR_UP_CLK(A1)
- ; Store DOWN
- lsr #8, D1
- move.b D1, TK_VAR_DWN_PRESS(A1)
- ; Compute UP click
- move.b T3_VAR_DWN_PRE(A0), D0
- not.b D0
- and.b D0, D1
- move.b D1, TK_VAR_DWN_CLK(A1)
- ; That's it
- .END: rts
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T3_PLOT:
- * Task 3 drawing stuff
- * ----------------------------------------------------------
- move.l A1, A2
- ; Check if UP is pressed
- move.b TK_VAR_UP_PRESS(A1), D0
- or.b D0, D0
- beq .DOWN
- ; Print the string
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$0000FF00
- TK_LOCATE #0, #2
- move.l #T3_STR_UP, A1
- move.b #14, D0
- trap #15
- ; Check if DOWN is pressed
- .DOWN: move.b TK_VAR_DWN_PRESS(A1), D0
- or.b D0, D0
- beq .END
- ; Print the string
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$0000FF00
- TK_LOCATE #0, #3
- move.l #T3_STR_DWN, A1
- move.b #14, D0
- trap #15
- ; That's it!
- .END: move.l A2, A1
- rts
- * ----------------------------------------------------------
- ; ==========================================================
- ; Task 3 strings
- ; ==========================================================
- T3_STR_SPACE: dc.b 'SPACE PRESSED',0
- T3_STR_UP: dc.b 'UP PRESSED',0
- T3_STR_DWN: dc.b 'DOWN PRESSED',0
- ds.w 0
- ************************************************************
- * TASK 4 *
- * -------------------------------------------------------- *
- * Name : PLAYER *
- * Description: Displays a battleship that can be moved *
- * with the arrow keys and shoot bullets with *
- * the spacebar. *
- ************************************************************
- ; ==========================================================
- ; Task 4 constants
- ; ==========================================================
- ; General constants
- T4_PLAYER_HALF_SIZE EQU 16
- T4_PLAYER_SPEED EQU 16
- ; TMP offsets
- T4_VAR_SY EQU 4 ; Word
- ; ==========================================================
- ; Task 4 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T4_TEP:
- * Task 4 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T4_INIT
- ; Update the player logic
- bsr T4_UPDATE
- ; Paint the player
- bsr T4_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T4_INIT:
- * Task 4 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Place the initial player coordinates at the center of the
- ; left part of the screen
- move.w #TK_SCREEN_HEIGHT/2-T4_PLAYER_HALF_SIZE, TK_VAR_PLAYER_Y(A1)
- ; Init speed to 0
- move.w #0, T4_VAR_SY(A0)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T4_UPDATE:
- * Task 4 update task logic
- * ----------------------------------------------------------
- ; Check if UP or DOWN are pressed
- move.b TK_VAR_UP_PRESS(A1), D0
- move.b TK_VAR_DWN_PRESS(A1), D1
- eor.b D0, D1
- beq .SPACE
- or.b D0, D0
- bne .UP
- or.b D1, D1
- bne .DOWN
- .KINEMATICS: ; Simple kinematic model: Y=Y+SY
- move.w TK_VAR_PLAYER_Y(A1), D0
- add.w T4_VAR_SY(A0), D0
- ; If it would move out of the screen, don't update
- bmi .SPACE
- move.w #TK_SCREEN_HEIGHT-T4_PLAYER_HALF_SIZE*2, D1
- sub.w D0, D1
- bmi .SPACE
- ; Else update the Y variable
- move.w D0, TK_VAR_PLAYER_Y(A1)
- .SPACE: ; Check if SPACE was clicked
- move.b TK_VAR_SPC_CLK(A1), D0
- or.b D0, D0
- beq .END
- ; If clicked, create a new bullet
- move.l A0, A3
- lea T5_TEP, A0
- move.w #TK_GROUP_BULLET, D1
- move.b #0, D0
- trap #0
- move.l A3, A0
- ; That's it!
- .END: rts
- .UP: ; UP pressed means we have to move up
- move.w #0-T4_PLAYER_SPEED, T4_VAR_SY(A0)
- bra .KINEMATICS
- .DOWN: ; DOWN pressed means we have to move down
- move.w #T4_PLAYER_SPEED, T4_VAR_SY(A0)
- bra .KINEMATICS
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T4_PLOT:
- * Task 4 drawing stuff
- * ----------------------------------------------------------
- ; Prepare colors
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$000000FF
- ; Get the player's coordinates
- move.w #T4_PLAYER_HALF_SIZE, D1
- move.w TK_VAR_PLAYER_Y(A1), D2
- ; Draw the player
- move.b #86, D0
- trap #15
- add.w #32, D1
- add.w #T4_PLAYER_HALF_SIZE, D2
- move.b #85, D0
- trap #15
- sub.w #32, D1
- add.w #T4_PLAYER_HALF_SIZE, D2
- move.b #85, D0
- trap #15
- sub.w #32, D2
- move.b #85, D0
- trap #15
- add.w #T4_PLAYER_HALF_SIZE, D1
- add.w #T4_PLAYER_HALF_SIZE, D2
- move.b #89, D0
- trap #15
- ; That's it
- rts
- * ----------------------------------------------------------
- ************************************************************
- * TASK 5 *
- * -------------------------------------------------------- *
- * Name : BULLET *
- * Description: Displays a bullet that can moves from left *
- * to right and collides with asteroids. *
- ************************************************************
- ; ==========================================================
- ; Task 5 constants
- ; ==========================================================
- ; General constants
- T5_BULLET_WIDTH EQU 32
- T5_BULLET_HALF_HEIGHT EQU 1
- T5_BULLET_SPEED EQU 16
- ; TMP offsets
- T5_VAR_X EQU 4 ; Word
- T5_VAR_Y EQU 6 ; Word
- ; ==========================================================
- ; Task 5 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T5_TEP:
- * Task 5 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T5_INIT
- ; Update the player logic
- bsr T5_UPDATE
- ; Paint the player
- bsr T5_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T5_INIT:
- * Task 5 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Place the initial bullet coordinate at the player
- move.w #T4_PLAYER_HALF_SIZE*2, T5_VAR_X(A0)
- move.w TK_VAR_PLAYER_Y(A1), D0
- add.w #T4_PLAYER_HALF_SIZE-T5_BULLET_HALF_HEIGHT, D0
- move.w D0, T5_VAR_Y(A0)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T5_UPDATE:
- * Task 5 update task logic
- * ----------------------------------------------------------
- ; Simple kinematic model: X=X+SY
- move.w T5_VAR_X(A0), D0
- add.w #T5_BULLET_SPEED, D0
- ; If it moves out of the screen, remove the task
- move.w #TK_SCREEN_WIDTH, D1
- sub.w D0, D1
- bmi .REMOVE
- ; Else update the X variable
- move.w D0, T5_VAR_X(A0)
- ; Store task TMP
- move.l A0, A3
- ; Get first task info
- move.b #6, D0
- trap #0
- ; Is it the last one?
- .LOOP: cmp.l #$FFFFFFFF, A2
- beq .END
- ; Is it in the asteroid group?
- cmp.w #TK_GROUP_ASTEROID, D2
- bne .NEXT
- ; Is it running?
- cmp.w #TM_TCB_STATUS_RUN, D3
- bne .NEXT
- ; This task is a running asteroid. Let's check coordinates
- move.w T5_VAR_X(A3), D0
- move.w T5_VAR_Y(A3), D1
- move.w T7_VAR_X(A0), D4
- move.w T7_VAR_Y(A0), D5
- move.w D4, D6
- add.w #T7_ASTEROID_SIZE, D6
- move.w D5, D7
- add.w #T7_ASTEROID_SIZE, D7
- ; Left
- cmp.w D0, D6
- ble .NEXT
- ; Right
- add.w #T5_BULLET_WIDTH, D0
- cmp.w D0, D4
- bgt .NEXT
- ; Top
- cmp.w D1, D7
- ble .NEXT
- ; Bottom
- add.w #T5_BULLET_HALF_HEIGHT*2, D1
- cmp.w D1, D5
- bgt .NEXT
- ; Add 1 to lives
- add.w #1, TK_VAR_LIVES(A1)
- ; Remove the asteroid and the bullet
- move.w TK_VAR_ID(A0), D1
- move.b #1, D0
- trap #0
- move.w TK_VAR_ID(A3), D1
- move.b #1, D0
- trap #0
- bra .END
- .NEXT: ; Next task info
- move.b #7, D0
- trap #0
- bra .LOOP
- ; That's it!
- .END: move.l A3, A0
- .END2: rts
- .REMOVE: ; Decreases the lives and removes the bullet
- sub.w #1, TK_VAR_LIVES(A1)
- move.w TK_VAR_ID(A0), D1
- move.b #1, D0
- trap #0
- bra .END2
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T5_PLOT:
- * Task 5 drawing stuff
- * ----------------------------------------------------------
- ; Prepare colors
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$00FFFFFF
- ; Get the bullet's bounding box
- move.w T5_VAR_X(A0), D1
- move.w T5_VAR_Y(A0), D2
- move.w D1, D3
- add.w #T5_BULLET_WIDTH, D3
- move.w D2, D4
- add.w #T5_BULLET_HALF_HEIGHT*2, D4
- ; Draw the bullet
- TK_DRAW_RECTANGLE
- ; That's it
- rts
- * ----------------------------------------------------------
- ************************************************************
- * TASK 6 *
- * -------------------------------------------------------- *
- * Name : CONTROLLER *
- * Description: Creates asteroid tasks and controls the *
- * pace of the game. *
- ************************************************************
- ; ==========================================================
- ; Task 6 constants
- ; ==========================================================
- ; General constants
- T6_NUMBER_INCREASE EQU 10
- ; TMP offsets
- T6_VAR_AST_NUMBER EQU 4 ; Word
- ; ==========================================================
- ; Task 6 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T6_TEP:
- * Task 6 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T6_INIT
- ; Update the task logic
- bsr T6_UPDATE
- ; Do graphical stuff
- bsr T6_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T6_INIT:
- * Task 6 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Set the RNG seed to a new one
- bsr TK_RNG_GENERATE_SEED
- ; Set the level to 1
- move.w #1, TK_VAR_LEVEL(A1)
- ; Set the lives to 3
- move.w #3, TK_VAR_LIVES(A1)
- ; Set the initial number and chance
- move.w #T6_NUMBER_INCREASE, T6_VAR_AST_NUMBER(A0)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T6_UPDATE:
- * Task 6 update task logic
- * ----------------------------------------------------------
- ; Get the remaining number of asteroids
- move.w T6_VAR_AST_NUMBER(A0), D1
- or.w D1, D1
- beq .NEXTLEVEL
- ; Generate an asteroid at a random time
- bsr TK_RNG_NEXT
- and.l #$1F, D0 ; Number between 0 and 31
- bne .END
- ; Decrease the number if its greater than 0
- sub.w #1, D1
- move.w D1, T6_VAR_AST_NUMBER(A0)
- ; Create an asteroid task
- lea T7_TEP, A0
- move.w #TK_GROUP_ASTEROID, D1
- move.b #0, D0
- trap #0
- bra .END
- .NEXTLEVEL: ; Increase the level if there are no more asteroids
- ; Store task TMP
- move.l A0, A3
- ; Get first task info
- move.b #6, D0
- trap #0
- ; Is it the last one?
- .LOOP: cmp.l #$FFFFFFFF, A2
- beq .INCREASELEVEL
- ; Is it in the asteroid group?
- cmp.w #TK_GROUP_ASTEROID, D2
- beq .END2
- .NEXT: ; Next task info
- move.b #7, D0
- trap #0
- bra .LOOP
- .INCREASELEVEL: ; Increase the level
- add.w #1, TK_VAR_LEVEL(A1)
- move.w TK_VAR_LEVEL(A1), D0
- mulu #T6_NUMBER_INCREASE, D0
- move.w D0, T6_VAR_AST_NUMBER(A3)
- .END2: ; That's it
- move.l A3, A0
- .END: rts
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T6_PLOT:
- * Task 6 drawing stuff
- * ----------------------------------------------------------
- move.l A1, A2
- ; Print the lives
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$00000000
- TK_LOCATE #0, #0
- move.l #T6_STR_LIVES, A1
- move.b #14, D0
- trap #15
- move.w TK_VAR_LIVES(A2), D1
- ext.l D1
- move.b #3, D0
- trap #15
- ; Print the level
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$00000000
- TK_LOCATE #0, #1
- move.l #T6_STR_LEVEL, A1
- move.b #14, D0
- trap #15
- move.w TK_VAR_LEVEL(A2), D1
- move.b #3, D0
- trap #15
- move.l A2, A1
- .END: rts
- * ----------------------------------------------------------
- ; ==========================================================
- ; Task 6 strings
- ; ==========================================================
- T6_STR_LEVEL: dc.b 'LEVEL ',0
- T6_STR_LIVES: dc.b 'LIVES ',0
- ds.w 0
- ************************************************************
- * TASK 7 *
- * -------------------------------------------------------- *
- * Name : ASTEROID *
- * Description: Displays an asteroid that can moves from *
- * left to right and collides with asteroids. *
- ************************************************************
- ; ==========================================================
- ; Task 7 constants
- ; ==========================================================
- ; General constants
- T7_ASTEROID_SIZE EQU 32
- ; TMP offsets
- T7_VAR_X EQU 4 ; Word
- T7_VAR_SX EQU 6 ; Word
- T7_VAR_Y EQU 8 ; Word
- T7_VAR_SY EQU 10 ; Word
- ; ==========================================================
- ; Task 7 functions
- ; ==========================================================
- * ----------------------------------------------------------
- T7_TEP:
- * Task 7 entry point.
- * ----------------------------------------------------------
- ; Check if status is "initializing". If so,
- ; execute the initialization code.
- cmp.w #TM_TCB_STATUS_INIT, D3
- beq T7_INIT
- ; Update the task logic
- bsr T7_UPDATE
- ; Do graphical stuff
- bsr T7_PLOT
- ; That's it. End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T7_INIT:
- * Task 7 initialization code
- * ----------------------------------------------------------
- ; Store the task ID and GROUP in TMP to
- ; ease further access if necessary.
- move.w D1, TK_VAR_ID(A0)
- move.w D2, TK_VAR_GROUP(A0)
- ; Set the X to the right edge of the screen
- move.w #TK_SCREEN_WIDTH, T7_VAR_X(A0)
- ; Set the Y to a random number
- bsr TK_RNG_NEXT ; Get random number
- and.l #$F, D0 ; Number between 0 and 15
- mulu #29, D0 ; Number between 0 and 435
- add.w #(TK_SCREEN_HEIGHT-(435+T7_ASTEROID_SIZE))/2, D0
- move.w D0, T7_VAR_Y(A0) ; Center the range and set Y
- ; Init speed vector to random numbers based on level
- move.w TK_VAR_LEVEL(A1), D1
- move.w D1, D0
- neg.w D0
- move.w D0, T7_VAR_SX(A0)
- bsr TK_RNG_NEXT ; Get random number
- and.l #$7, D0 ; Number between 0 and 7
- sub.w #4, D0 ; Number between -4 and 3
- mulu D1, D0
- move.w D0, T7_VAR_SY(A0)
- ; End by switching to next task
- move.b #4, D0
- trap #0
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T7_UPDATE:
- * Task 7 update task logic
- * ----------------------------------------------------------
- ; Check if too much to the left
- move.w T7_VAR_X(A0), D0
- or.w D0, D0
- bmi .REMOVE
- ; Check if vertically colliding with screen
- ; boundaries.
- cmp.w #0, T7_VAR_Y(A0)
- bls .YBOUNCE
- cmp.w #TK_SCREEN_HEIGHT-T7_ASTEROID_SIZE, T7_VAR_Y(A0)
- bhs .YBOUNCE
- .KINEMATICS: ; Simple kinematic model: X=X+SX, Y=Y+SY
- move.w T7_VAR_X(A0), D0
- move.w T7_VAR_Y(A0), D1
- add.w T7_VAR_SX(A0), D0
- add.w T7_VAR_SY(A0), D1
- move.w D0, T7_VAR_X(A0)
- move.w D1, T7_VAR_Y(A0)
- ; That's it!
- .END: rts
- .REMOVE: ; Decreases the lives and deletes the asteroid
- sub.w #3, TK_VAR_LIVES(A1)
- move.w TK_VAR_ID(A0), D1
- move.b #1, D0
- trap #0
- bra .END
- .YBOUNCE: ; Y bouncing is just changing the Y speed sign
- neg T7_VAR_SY(A0)
- bra .KINEMATICS
- * ----------------------------------------------------------
- * ----------------------------------------------------------
- T7_PLOT:
- * Task 7 drawing stuff
- * ----------------------------------------------------------
- ; Prepare colors
- TK_SET_PEN #$00FFFFFF
- TK_SET_FILL #$000000FF
- ; Get the asteroid's coordinates
- move.w T7_VAR_X(A0), D1
- move.w T7_VAR_Y(A0), D2
- ; Compute bounding box
- move.w D1, D3
- move.w D2, D4
- add.w #T7_ASTEROID_SIZE, D3
- add.w #T7_ASTEROID_SIZE, D4
- ; Draw it
- TK_DRAW_ELLIPSE
- ; That's it
- rts
- * ----------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement