top of page

Lab3- Assembly Language Math (Working)

In my previous Lab 3 post, there was a semi-working solution for this lab but we as a team already figure the principals of this lab and we got our ball moving and hitting off the edges. This lab solution can be tested ( http://6502.cdot.systems/) on our simulator.


This lab requires us to create a simple graphic in a square that is 5x5 or 7x7 pixels in size. Encoding the graphic in bytes using Declare Constant Byte instructions. Write the code to make the graphic bounce around the screen and reflecting off the edges when it hits. Finally, make the speed keyboard adjustable and perturb the object path.


Lab Solution:


define POINTER $10

define POINTER_H $11

define ROW_COUNT $13

define ROW $14

define COLUMN $15

define CHECK_LINE $16

define ROWFLIP_FLAG $17

define COLFLIP_FLAG $18

define PTR_CALCULATE $19

define DATA_INDEX $20

define SCREENCOL_INDEX $21

define KEY $22


define WIDTH 5

define HEIGHT 5


lda #$04 ; Set a row value 1f

sta ROW

lda #$04 ; Set a column value 5

sta COLUMN


lda #$00

sta ROWFLIP_FLAG

sta COLFLIP_FLAG


; ====== Calculation ======

; ====== Initialize for calculation ======

cal_initialize:


lda #$00 ; create a pointer at $10

sta POINTER

lda #$02

sta POINTER_H

lda #$00

sta ROW_COUNT


lda #$00

sta PTR_CALCULATE


cmp ROW

beq column_count

bne row_count


;====== row count =======

row_count:

lda PTR_CALCULATE

clc

adc #$20

sta PTR_CALCULATE

lda POINTER_H

adc #$00

sta POINTER_H


inc ROW_COUNT

lda ROW

cmp ROW_COUNT

bne row_count

beq column_count


;===== column_count =====

column_count:

lda PTR_CALCULATE

clc

adc COLUMN

sta PTR_CALCULATE


;===== store the value to pointer (calculation done) =====

sta POINTER


;===== draw graphic =====

; initializing for drawing graph

lda #$00

sta ROW_COUNT


ldx #$00 ; index for data

ldy #$00 ; index for screen column


; draw graph

draw: lda ball,x


sta (POINTER),y


inx

iny

cpy #WIDTH

bne draw


inc ROW_COUNT


lda #HEIGHT

cmp ROW_COUNT

beq getkey_initialize

lda POINTER

clc

adc #$20

sta POINTER

lda POINTER_H

adc #$00

sta POINTER_H


ldy #$00

beq draw


; ======= get key =======

getkey_initialize:

txa

sta DATA_INDEX

tya

sta SCREENCOL_INDEX

getkey: lda $ff ; get a keystroke

ldx #$00 ; clear out the key buffer

stx $ff


cmp #$80 ; if not a cursor key, ignore

bmi getkey_done

cmp #$84

bpl getkey_done

cmp #$80 ; check key == up

bne check1

dec ROW ; ... if yes, decrement ROW

jmp getkey_done

check1:

cmp #$81 ; check key == right

bne check2

inc COLUMN ; ... if yes, increment COL

jmp getkey_done

check2:

cmp #$82 ; check if key == down

bne check3

inc ROW ; ... if yes, increment ROW

jmp getkey_done

check3:

cmp #$83 ; check if key == left

bne getkey_done

dec COLUMN ; ... if yes, decrement COL

clc

bcc getkey_done


getkey_done:

ldx DATA_INDEX

ldy SCREENCOL_INDEX

jmp check_location


; ======= Check the location ======

check_location:

jsr check_top

jsr check_bottom

jsr check_right

jsr check_left

jsr move_pointer


check_initialize:

lda #$00

sta CHECK_LINE

rts

check_top:

jsr check_initialize

lda ROW

cmp #$01

lda CHECK_LINE

adc #$00

cmp #$00

beq flip_rowFlag

rts


check_bottom:

jsr check_initialize

lda ROW

cmp #$1b

lda CHECK_LINE

adc #$00

cmp #$01

beq flip_rowFlag

rts


check_left:

jsr check_initialize

lda COLUMN

cmp #$01

lda CHECK_LINE

adc #$00

cmp #$00

beq flip_colFlag

rts


check_right:

jsr check_initialize

lda COLUMN

cmp #$1b

lda CHECK_LINE

adc #$00

cmp #$01

beq flip_colFlag

rts


; ======= Flip Row Flag ======

flip_rowFlag:

lda ROWFLIP_FLAG

cmp #$00

beq inc_rowFlag

bne dec_rowFlag

rts


inc_rowFlag:

inc ROWFLIP_FLAG

rts


dec_rowFlag:

dec ROWFLIP_FLAG

rts



; ======= Flip Col Flag ======

flip_colFlag:

lda COLFLIP_FLAG

cmp #$00

beq inc_colFlag

bne dec_colFlag

rts


inc_colFlag:

inc COLFLIP_FLAG

rts


dec_colFlag:

dec COLFLIP_FLAG

rts


; ======= move the graph ========

move_pointer:

jsr row_check

jsr col_check

jmp clear


row_check:

lda ROWFLIP_FLAG

cmp #$01

beq dec_row

bne inc_row


col_check:

lda COLFLIP_FLAG

cmp #$01

beq dec_col

bne inc_col


inc_row:

inc ROW

rts


dec_row:

dec ROW

rts


inc_col:

inc COLUMN

rts


dec_col:

dec COLUMN

rts


; ======= move the graph =======

;move: inc ROW

; inc COLUMN


; ======= clear the screen before redraw the graph =====

clear: lda ball

sta POINTER

lda #$02

sta POINTER_H

ldy #$00

tya


clear_loop:

sta (POINTER),y

iny

bne clear_loop

inc POINTER_H

ldx POINTER_H

cpx #$06

bne clear_loop


jsr cal_initialize


; data constant byte

ball:

dcb 00,03,03,03,00

dcb 07,00,00,00,07

dcb 07,00,00,00,07

dcb 07,00,00,00,07

dcb 00,03,03,03,00

__________________________________________________________________

As mention on the previous post we took some Example codes provide to us in class as a started for this lab (https://wiki.cdot.senecacollege.ca/wiki/6502_Emulator_Example_Code#Place_a_Graphic_on_the_Screen).


We got our ball displaying and moving on the screen. It is interactive as well if you use your arrows in your keyboard you can make the ball move in different directions. Also, every time the ball hits an edge it will bounce off from the corner and continue moving.


Reflection Note:

Although this lab took longer to complete it was a fun challenge, we encounter a lot of problems making the ball move after hitting an edge or how to make it move with the arrows functions. But, with the guidance of our instructor and some lectures from our class course, we eventually figure it out and deliver our final product.

Recent Posts

See All

Comentarios


Drop Me a Line, Let Me Know What You Think

Thanks for submitting!

© 2023 by Train of Thoughts. Proudly created with Wix.com

bottom of page