LAB 02

Exploring Mob Programming with 6502 Assembly Language

What is Mob Programming?

Mob Programming is an advanced form of Pair Programming where the entire team works together on the same problem at the same time, sharing a single computer and screen. While one person acts as the "Driver" and types the code, the others, known as "Observers," provide suggestions, guidance, and feedback. The role of the Driver rotates regularly to ensure that everyone contributes to the solution and gains experience.

How to Implement Mob Programming in 6502 Assembly

Step 1: Team Roles and Setup

  • The Driver: The Driver is the person who actively writes the code. They are responsible for typing out the instructions and maintaining the structure of the program.
  • Observers: These are the team members who aren't typing but are actively involved in the process. They provide input, suggest improvements, discuss ideas, and review code as it’s written. Their primary job is to ensure the code is of high quality.

Step 2: Collaborate and Code Together

While the Driver is working, the Observers will help with key decisions, such as:

  • Choosing how to structure the code: 6502 Assembly can be tricky in terms of managing variables, memory locations, and subroutines. The team can brainstorm the best way to structure the program.
  • Problem-solving: The Observers should point out any mistakes or inefficiencies as the Driver types, helping to ensure high-quality, optimized code.
  • Improving readability: Assembly can often become cryptic, so the team should discuss ways to make the code more readable and maintainable for others.

Step 3: Testing and Debugging

After writing and compiling the code, the team should test it in the emulator. During testing, the Driver can execute the program while the Observers note any bugs or areas for improvement. 6502

Bouncing Graphic Challenge in 6502 Assembly

A great way to experience Mob Programming in 6502 Assembly is to create a "Bouncing Graphic" program. Here’s a simplified outline of the process:

  1. Initialize Variables: Define the starting coordinates for the graphic, such as X = $20 and Y = $21, and set their increments (either +1 or -1).

  2. Move the Graphic: Add the X and Y increments to move the graphic across the screen. The graphic should move diagonally, adjusting its X and Y positions with each frame.

  3. Handle Screen Boundaries: Make sure the graphic "bounces" when it reaches the edge of the screen. This involves checking if the graphic’s position exceeds the screen boundaries (both horizontally and vertically) and adjusting the direction of movement accordingly.

  4. Testing and Adjustments: Test the program and adjust the logic as needed to ensure smooth animation and proper bouncing behavior.


Benefits of Mob Programming in 6502 Assembly

  • Collective Knowledge
  • Improved Code Quality
  • Enhanced Problem Solving
  • Effective Learning

Challenges of Mob Programming in Assembly

  • Communication Overload
  • Steep Learning Curve
  • Time-Intensive

Conclusion

Mob Programming is an excellent approach for tackling challenging tasks like 6502 Assembly programming. By leveraging collective knowledge and collaborative problem-solving, teams can overcome the complexities of low-level programming while improving code quality and sharing valuable insights. 

OUTPUTS & CODE






;
; draw-image-subroutine.6502
;
; This is a routine that can place an arbitrary 
; rectangular image on to the screen at given
; coordinates.
;
; Chris Tyler 2024-09-17
; Licensed under GPLv2+
;

;
; 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


START:

; Set up the width and height elements of the data structure
  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
  ; The syntax #<LABEL returns the low byte of LABEL
  ; The syntax #>LABEL returns the high byte of LABEL

  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 START

; ==========================================
;
; 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













Comments

Popular posts from this blog

Project Stage 1: Create a GCC pass

LAB 03

Project Stage 2: Part 2( The End)