6502- Lab4(옵션 1): 계산기 추가

6346 단어 6502programming

소개



이 블로그에서는 6502 어셈블리 언어를 사용하여 계산기를 만들어 보겠습니다. 사용자가 최대 2자리 숫자를 입력하고 적절한 사용자 프롬프트와 피드백을 제공할 수 있는 서브루틴을 만들 것입니다.

계산기 요구 사항 추가


  • 사용자가 최대 2자리의 숫자 2개를 입력할 수 있는 서브루틴을 만듭니다. 커서가 있는 위치를 표시하고 사용자가 숫자 키(0-9), 백스페이스 및 Enter 키를 사용할 수 있도록 합니다. 누산기(A) 레지스터에 사용자의 입력 값을 반환합니다.
  • 이 서브루틴을 사용하여 두 개의 숫자(각각 0-99 범위에 있음)를 더하고 결과를 인쇄하는 프로그램을 작성하십시오.

  • 생각과 단계



    -> 첫 번째 숫자, 두 번째 숫자 및 결과를 저장하고 화면에 표시할 수 있습니다.
    -> 사용자에게 적절한 문장을 프롬프트합니다.
    "첫 번째 숫자를 입력하세요: "
    -> 첫 번째 숫자에 대한 사용자 입력을 받습니다.
    -> 사용자는 "ENTER"를 사용하여 번호를 저장하고 백스페이스를 사용하여 삭제할 수 있습니다.
    -> 사용자에게 적절한 문장을 프롬프트합니다.
    "두 번째 숫자를 입력하세요: "
    -> 두 번째 숫자에 대한 사용자 입력을 받습니다.
    -> 사용자는 "ENTER"를 사용하여 번호를 저장하고 백스페이스를 사용하여 삭제할 수 있습니다.
    -> 사용자에게 결과를 프롬프트하고 화면에 표시합니다.

    변수 정의




    define NUM1   $15;   for the first number of user's input 
    define NUM2   $16;   for the second number of user's input
    
    define ENTER  $0d;   for the ENTER key
    define BACKSPACE $08; for the BACKSPACE key
    define RIGHT  $81;   for the RIGHT Key
    define LEFT  $83;    for the LEFT key
    
    define  SCREEN  $ffed; for getting the screen size
    define  PLOT    $fff0; for getting or setting the cursor coordinates
    define  SCINIT  $ff81; for initializing or clearing the screen
    define  CHRIN  $ffcf; for taking the input character from keyboard
    define  CHROUT  $ffd2; for displaying the output character to screen
    
    


    이 랩의 솔루션




    define NUM1   $15;   for the first number of user's input 
    define NUM2   $16;   for the second number of user's input
    
    define ENTER  $0d;   for the ENTER key
    define BACKSPACE $08; for the BACKSPACE key
    define RIGHT  $81;   for the RIGHT Key
    define LEFT  $83;    for the LEFT key
    
    define  SCREEN  $ffed; for getting the screen size
    define  PLOT    $fff0; for getting or setting the cursor coordinates
    define  SCINIT  $ff81; for initializing or clearing the screen
    define  CHRIN  $ffcf; for taking the input character from keyboard
    define  CHROUT  $ffd2; for displaying the output character to screen
    
    jsr SCINIT
    
    mainLoop:
         ldy #$00
         jsr firstNumInput ; first number input question
         jsr getNum; receive the first number
         jsr firstNumStore  ; store the input number
    
         ldy #$00
         jsr secondNumInput  ; second number input question
         jsr getNum; receive the second number
         jsr secondNumStore  ; store the input number
    
         ldy #$00
         jsr resultStr  ; for displaying the result string
         jsr result ; for displaying the calculation result
         jmp mainLoop  ; go back to the first step
    
    
    getNum:
         sec
         jsr PLOT
         ldx #$15
         clc
         jsr PLOT
    
    getNumLoop:
         sec
         jsr PLOT
         jsr CHRIN
    
    keyboardCheck: 
         cmp #BACKSPACE ; after using BACKSPACE, one digit will be deleted
         beq delete
    
         cmp #RIGHT ; using RIGHT arrow key, the program goes to the first digit
         beq moveR
    
         cmp #LEFT ; using LEFT arrow key, the program goes to the second digit
         beq moveL
    
         cmp #ENTER ; after pressing ENTER, the program goes to the next process
         beq move
    
    drawNum:
         cmp #$30
         bcc getNumLoop
    
         clc
         cmp #$3a
         bcs getNumLoop
    
         jsr CHROUT
    
         sec
         jsr PLOT
         cpx #$17
         bne getNumLoop
         dex
         clc
         jsr PLOT
         jmp getNumLoop
    
    moveL: 
     cpx #$15 ; first digit
         beq getNumLoop
         jsr CHROUT
         jmp getNumLoop
    
    moveR: 
     cpx #$16 ; second digit
         beq getNumLoop
         jsr CHROUT
         jmp getNumLoop
    
    delete:
     cpx #$15
         beq getNumLoop
         jsr CHROUT
         jmp getNumLoop
    
    
    move:
         sec
         jsr PLOT
         ldx #$15 ; first digit
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         clc
         sbc #$2F
    
         asl
         asl
         asl
         asl
    
         pha
    
         ldx #$16
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         clc
         sbc #$2F
         pha
    
         ldx #$00
         iny
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         pla
         tax
         pla
    
         rts
    
    firstNumStore:
         sta NUM1
         txa
         eor NUM1
         sta NUM1
         rts
    
    
    secondNumStore:
         sta NUM2
         txa
         eor NUM2
         sta NUM2
         rts
    
    
    calculateAdd:
         lsr
         lsr
         lsr
         lsr
         clc
         adc #$30;
         jsr CHROUT
    
         pla
         and #$0F
         clc
         adc #$30;
         jsr CHROUT
    
         sec
         jsr PLOT
         ldx #$00
         iny
         clc
         jsr PLOT
    
         rts
    
    result:
         sec
         jsr PLOT
         ldx #$15
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         sed
         lda NUM1
         adc NUM2
         cld
         pha
    
         bcc calculateAdd
         ldx #$14
         clc
         jsr PLOT
         sec
         jsr PLOT
         lda #$31
         jsr CHROUT
    
    firstNum:
    dcb "E","N","T","E","R",32,"F","I","R","S","T",32,"N","U","M","B","E","R",":",32,32,"0","0"
    dcb 00
    
    
    secondNum:
    dcb "E","N","T","E","R",32,"S","E","C","O","N","D",32,"N","U","M","B","E","R",":",32,"0","0"
    dcb 00
    
    results:
    dcb "R","E","S","U","L","T",":"
    dcb 00
    
    
    firstNumInput:
     lda firstNum,y
            beq goback_main
            jsr CHROUT
            iny
            bne firstNumInput
    
    secondNumInput:
     lda secondNum,y
            beq goback_main
            jsr CHROUT
            iny
            bne secondNumInput
    
    resultStr:
     lda results,y
            beq goback_main
            jsr CHROUT
            iny
            bne resultStr
    
    goback_main:
         rts
    
    
    


    결과





    생각



    6502는 지금 내가 이해하기 점점 더 어려워지고 있습니다. 이번 실습을 하면서 많은 어려움을 겪었습니다. 의사 코드를 먼저 작성하고 의사 코드를 따라 실제 코드를 작성하는 것이 중요합니다. 이 작업의 요점은 이 작업을 더 명확하게 볼 수 있도록 돕는 것입니다. 사용자 입력 값을 검색하고, 값을 저장하고, 결과를 표시하는 것은 이 실습에서 저에게 세 가지 큰 작업입니다. 지금은 언어를 제대로 사용하는 것이 아직 익숙하지 않습니다. 나는 치트 시트를 반복해서 찾아야합니다. 그러나이 프로세스는 레지스터가 작동하는 방식과 6502 어셈블리 언어가 작동하는 방식에 대해 더 많이 이해하는 데 도움이 되었습니다.

    좋은 웹페이지 즐겨찾기