Lab2 : In class

Below is the code we used to perform various tasks to alter the result of the code. This code is a circle animation starting at the top left of the screen that moves to the opposite corner then repeats the animation.


;

; The subroutine is below starting at the 

; label "DRAW:"

;


; Test code for our subroutine

; Moves an image diagonally across the screen


; Zero-page variables

define XPOS $20

define YPOS $21


; Set up the data structure

; The syntax #<LABEL returns the low byte of LABEL

; The syntax #>LABEL returns the high byte of LABEL

LDA #<G_X     ; POINTER TO GRAPHIC

STA $10

LDA #>G_X

STA $11

LDA #$05

STA $12       ; IMAGE WIDTH

STA $13       ; IMAGE HEIGHT


; Set initial position X=Y=0

LDA #$00

STA XPOS

STA YPOS


; Main loop for diagonal animation

MAINLOOP:


  ; Set pointer to the image

  ; Use G_O or G_X as desired

  LDA #<G_O

  STA $10

  LDA #>G_O

  STA $11


  ; Place the image on the screen

  LDA #$10  ; Address in zeropage of the data structure

  LDX XPOS  ; X position

  LDY YPOS  ; Y position

  JSR DRAW  ; Call the subroutine


  ; Delay to show the image

  LDY #$00

  LDX #$50

DELAY:

  DEY

  BNE DELAY

  DEX

  BNE DELAY


  ; Set pointer to the blank graphic

  LDA #<G_BLANK

  STA $10

  LDA #>G_BLANK

  STA $11


  ; Draw the blank graphic to clear the old image

  LDA #$10 ; LOCATION OF DATA STRUCTURE

  LDX XPOS

  LDY YPOS

  JSR DRAW


  ; Increment the position

  INC XPOS

  INC YPOS


  ; Continue for 29 frames of animation

  LDA #28

  CMP XPOS

  BNE MAINLOOP


  ; Repeat infinitely

  JMP $0600


; ==========================================

;

; DRAW :: Subroutine to draw an image on 

;         the bitmapped display

;

; Entry conditions:

;    A - location in zero page of: 

;        a pointer to the image (2 bytes)

;        followed by the image width (1 byte)

;        followed by the image height (1 byte)

;    X - horizontal location to put the image

;    Y - vertical location to put the image

;

; Exit conditions:

;    All registers are undefined

;

; Zero-page memory locations

define IMGPTR    $A0

define IMGPTRH   $A1

define IMGWIDTH  $A2

define IMGHEIGHT $A3

define SCRPTR    $A4

define SCRPTRH   $A5

define SCRX      $A6

define SCRY      $A7


DRAW:

  ; SAVE THE X AND Y REG VALUES

  STY SCRY

  STX SCRX


  ; GET THE DATA STRUCTURE

  TAY

  LDA $0000,Y

  STA IMGPTR

  LDA $0001,Y

  STA IMGPTRH

  LDA $0002,Y

  STA IMGWIDTH

  LDA $0003,Y

  STA IMGHEIGHT


  ; CALCULATE THE START OF THE IMAGE ON

  ; SCREEN AND PLACE IN SCRPTRH

  ;

  ; THIS IS $0200 (START OF SCREEN) +

  ; SCRX + SCRY * 32

  ; 

  ; WE'LL DO THE MULTIPLICATION FIRST

  ; START BY PLACING SCRY INTO SCRPTR

  LDA #$00

  STA SCRPTRH

  LDA SCRY

  STA SCRPTR

  ; NOW DO 5 LEFT SHIFTS TO MULTIPLY BY 32

  LDY #$05     ; NUMBER OF SHIFTS

MULT:

  ASL SCRPTR   ; PERFORM 16-BIT LEFT SHIFT

  ROL SCRPTRH

  DEY

  BNE MULT


  ; NOW ADD THE X VALUE

  LDA SCRX

  CLC

  ADC SCRPTR

  STA SCRPTR

  LDA #$00

  ADC SCRPTRH

  STA SCRPTRH


  ; NOW ADD THE SCREEN BASE ADDRESS OF $0200

  ; SINCE THE LOW BYTE IS $00 WE CAN IGNORE IT

  LDA #$02

  CLC

  ADC SCRPTRH

  STA SCRPTRH

  ; NOTE WE COULD HAVE DONE TWO: INC SCRPTRH


  ; NOW WE HAVE A POINTER TO THE IMAGE IN MEM

  ; COPY A ROW OF IMAGE DATA

COPYROW:

  LDY #$00

ROWLOOP:

  LDA (IMGPTR),Y

  STA (SCRPTR),Y

  INY

  CPY IMGWIDTH

  BNE ROWLOOP


  ; NOW WE NEED TO ADVANCE TO THE NEXT ROW

  ; ADD IMGWIDTH TO THE IMGPTR

  LDA IMGWIDTH

  CLC

  ADC IMGPTR

  STA IMGPTR

  LDA #$00

  ADC IMGPTRH

  STA IMGPTRH

 

  ; ADD 32 TO THE SCRPTR

  LDA #32

  CLC

  ADC SCRPTR

  STA SCRPTR

  LDA #$00

  ADC SCRPTRH

  STA SCRPTRH


  ; DECREMENT THE LINE COUNT AND SEE IF WE'RE

  ; DONE

  DEC IMGHEIGHT

  BNE COPYROW


  RTS


; ==========================================


; 5x5 pixel images


; Image of a blue "O" on black background

G_O:

DCB $00,$0e,$0e,$0e,$00

DCB $0e,$00,$00,$00,$0e

DCB $0e,$00,$00,$00,$0e

DCB $0e,$00,$00,$00,$0e

DCB $00,$0e,$0e,$0e,$00


; Image of a yellow "X" on a black background

G_X:

DCB $07,$00,$00,$00,$07

DCB $00,$07,$00,$07,$00

DCB $00,$00,$07,$00,$00

DCB $00,$07,$00,$07,$00

DCB $07,$00,$00,$00,$07


; Image of a black square

G_BLANK:

DCB $00,$00,$00,$00,$00

DCB $00,$00,$00,$00,$00

DCB $00,$00,$00,$00,$00

DCB $00,$00,$00,$00,$00

DCB $00,$00,$00,$00,$00


The first tasks was to change the starting location x, and y coordinates of the bouncing circle animation,

this was very easy to do. The only changes required were to add an additional LDA command for the Y position of the circle.

; Set initial position X=Y=0

LDA #$00

STA XPOS

LDA #$0A

STA YPOS

This results in the storage of the y position to be at 0A rather than 00 like the X.

Now for the portion of the lab where I had difficulties, to understand my process I will explain the code further in depth. The image is comprised of 3 small images, G_O, G_X, and G_Blank. These images are represented as a 5x5 circle. To change the position of the circle XPOS and YPOS are incremented as the code loops. 

To change the increments we need to introduce a new variable, lets call it X and YINC.

LDA #$01 

STA XINC 

LDA #$01 

STA YINC 

This creates two variables that have the value of 1, to increase or decrease we just need to increase/decrease the numbers that are stored in them.

This was all that I could finish during the lab section, I will write a follow up finishing the remaining portion of the lab

Comments

Popular posts from this blog

Early stages of project

Building GCC again on aarch64-002

Project Stage 2: Testing