SPO600 Lab3 - 수학 랩 업데이트 만화경

3409 단어
안녕 내 친구, 여기서 다시 만나서 반갑습니다. 오늘은 몇 주 전에 시작한 랩 3을 업데이트하려고 합니다. 불행하게도, 우리 그룹 동료들과 나는 6502 어셈블리 언어를 사용하여 Pong 게임을 풀 수 없습니다. 우리의 문제는 벽에 부딪히게 하는 방법을 모른다는 것입니다. 그래서 우리는 새로운 프로젝트를 시작하기로 결정했습니다. Pong 게임에 여전히 관심이 있고 더 자세히 알아보고 싶다면 . 그러나 이제 새로운 프로젝트는 Kaleidoscope입니다.

이 프로젝트에서는 화살표 키를 누를 때 화면의 각 분기에 동일한 모양을 그리는 프로젝트를 만들어야 했습니다. 이것은 코드입니다:

define POINTER     $10      ;ptr: start of row
 define POINTER_H   $11 
define ROW     $20      ;current row
 define COL     $21         ; current column
 define DOT     $01         ; dot colour location
 define CURSOR      $05     ; green colour
setup: lda #$0f         ; initial ROW,COL
    sta ROW
    sta COL
    LDA #$01
    STA DOT
 draw:  jsr draw_cursor
 getkey:    lda $ff         ; get the keystroke
    ldx #$00            ; clear the key buffer
    stx $ff
    cmp #$30
    bmi getkey
    cmp #$40
    bpl continue
    SEC
    sbc #$30
    tay
    lda color_pallete, y
    sta DOT
    jmp done

continue:   cmp #$43    
    beq clear
    cmp #$63
    beq clear
    cmp #$80    
    bmi getkey
    cmp #$84
    bpl getkey
    pha    
    lda DOT
    sta (POINTER),y
    jsr draw_on_quads
    pla
    cmp #$80
    bne check1
    dec ROW  
    jmp done

 check1:    cmp #$81    ; right key
    bne check2
    inc COL     ; increment COL
    jmp done

 check2:    cmp #$82    ; down key
    bne check3
    inc ROW     ; increment ROW
    jmp done

 check3:    cmp #$83    ; left key
    bne done
    dec COL     ; decrement COL
    clc
    bcc done

 clear: lda table_low   ; clear screen
    sta POINTER
    lda table_high
    sta POINTER_H
    ldy #$00
    tya

 c_loop:    sta (POINTER),y
    iny
    bne c_loop
    inc POINTER_H
    ldx POINTER_H
    cpx #$06
    bne c_loop

 done:  clc   
    bcc draw

 draw_cursor:
    lda ROW     
    and #$0f
    sta ROW
    lda COL     
    and #$0f
    sta COL
    ldy ROW     
    lda table_low,y
    sta POINTER
    lda table_high,y
    sta POINTER_H
    ldy COL     
    lda #CURSOR
    sta (POINTER),y
    rts

 draw_on_quads:     
    LDA POINTER 
    PHA         
    LDA POINTER_H
    PHA
    LDA #$10
    CLC
    SBC COL
    CLC
    ADC #$10
    TAY
    LDA DOT
    STA (POINTER),y
    TYA
    PHA 
    lda #$10    
    CLC
    SBC ROW
    CLC
    ADC #$10
    TAY
    lda table_low,y
    sta POINTER
    lda table_high,y
    sta POINTER_H
    ldy COL     
    lda DOT
    sta (POINTER),y
    PLA
    TAY
    lda DOT
    sta (POINTER),y
    PLA
    STA POINTER_H
    PLA
    STA POINTER
    RTS
 table_high:
 dcb $02,$02,$02,$02,$02,$02,$02,$02
 dcb $03,$03,$03,$03,$03,$03,$03,$03
 dcb $04,$04,$04,$04,$04,$04,$04,$04
 dcb $05,$05,$05,$05,$05,$05,$05,$05,
table_low:
 dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
 dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
 dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
 dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
color_pallete:
dcb $01,$02,$03,$04,$05,$06,$07,$08,$09,$0a


다음은 결과의 샘플입니다.


반사



이 실습에서는 실제로 완전한 기능을 갖춘 프로그램을 작업했으며 이 프로그램은 사용자의 입력을 받아 다이어그램을 그릴 수 있습니다. 이 실습을 마친 후 서브루틴 작업 방법과 어셈블리 언어의 구문 및 논리를 깊이 있게 이해하는 방법을 배웠습니다. 어셈블리 언어는 메모리와 레지스터에 자주 명시적으로 액세스하는 저수준 프로그래밍 언어입니다. 이 연습을 통해 앞으로 6502 어셈블리 언어를 더 쉽게 작업할 수 있기를 바랍니다.

좋은 웹페이지 즐겨찾기