Lab3 바운싱 그래픽/공(파트 II)

Lab3 개요



이 실습은 6502 어셈블리 언어로 산술/수학 코드를 작성하여 보다 복잡한 x86_64 및 AArch64 어셈블리 언어 학습을 준비합니다.

내가 선택한 옵션은 바운싱 그래픽입니다. 화면에 그래픽을 배치하고, 화면 주위에서 물체를 튕기며, 물체가 화면 가장자리 또는 다른 물체와 충돌했을 때 감지하는 등 여러 가지 기술이 필요합니다.

이 단계에서 저는 전체 프로세스에 대해 더 명확해지고 있습니다.
  • 6502 시뮬레이터의 특정 페이지에서 특정 위치의 ROW 및 COLUMN(x, y)을 초기화합니다.
  • 포인터 계산
  • 비트맵 출력(너비 5 및 높이 5)에 공을 그립니다
  • .
  • 공을 45도 각도로 이동(처음에는 대각선)
  • 키 입력을 확인하십시오. 키가 위, 아래, 오른쪽 또는 왼쪽인 경우 ROW 또는 COLUMN 값 변경(키보드의 화살표 키에 대한 응답)
  • 포인터가 가장자리에 있는지 확인하십시오. 그렇다면 ROW 또는 COLUMN의 플래그를 뒤집으십시오
  • .
  • 화면을 지우고 그래픽을 다시 그립니다(바운스 백)
  • 2단계부터 다시 시작

  • 이전 에서는 1단계와 2단계를 주로 다루었습니다.

    이제부터는 과정을 단순화하기 위해 먼저 공을 그리고 45도 각도로 공을 튕겨보도록 하겠습니다. 공을 그리려면 너비와 높이 변수를 정의해야 합니다. "hits-edge"기능과 "화살표 키 응답"기능은 나중에 구현될 예정입니다.

    이 코드의 주요 아이디어는 공을 움직이게 하는 것입니다.

    암호:

    define WIDTH   5
    define HEIGHT  5
    
    define  POINTER    $10 
    define  POINTER_H  $11 
    define  ROW_COUNT  $13
    define  ROW        $14
    define  COLUMN     $15 
    define  PTR_CALCULATE $19
    
    
    
    lda  #$04          
    sta  ROW
    lda  #$04 
    sta  COLUMN
    
    ;Calculation 
    
    cal_init:
    
      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   ; if row is done, deal with col
     bne row_count      ; if not fix row
    
    ;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:
      lda PTR_CALCULATE
      clc
      adc  COLUMN
     sta PTR_CALCULATE
    
    ; store pointer
      sta  POINTER
    
    ; draw graphic
    
     lda #$00
     sta ROW_COUNT
    
     ldx #$00  
     ldy #$00  
    
    ; draw graph
    draw: lda ball,x
    
     sta (POINTER),y
    
     inx
     iny
     cpy #WIDTH
     bne draw
    
     inc ROW_COUNT
    
     lda #HEIGHT
     cmp ROW_COUNT
     beq draw
    
     lda POINTER 
     clc
     adc #$20
     sta POINTER
     lda POINTER_H
     adc #$00
     sta POINTER_H 
    
     ldy #$00
     beq draw
    
    ; 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 (dcb instruction)
    ball:
     dcb 00,03,03,03,00
     dcb 03,03,03,03,03
     dcb 03,03,03,03,03
     dcb 03,03,03,03,03
     dcb 00,03,03,03,00
    




    이 작업에서 가장 흥미로운 부분은 비트맵 화면에서 공을 그리는 방법을 배웠다는 것입니다. 가장 중요한 부분은 행과 열을 사용하여 포인트 위치를 계산하고 캐리 플래그를 통해 페이지 번호를 결정하는 것입니다. 여기서 트릭은 20으로 더하고 페이지 번호는 캐리 플래그로 결정됩니다.
    45도 각도를 사용했기 때문에 행과 열에 1을 더해 이동을 단순화했습니다.
    이동 기능은 이 단계에서 제대로 작동하지 않습니다. 주로 서브루틴이 제대로 결합되지 않았기 때문입니다.
    여기서 학습 목표는 서브루틴을 이해하고 익숙해지는 것입니다.

    좋은 웹페이지 즐겨찾기