SPO600 Lab4 String lab 옵션 1: 계산기 추가

5169 단어
안녕하세요, SPO600(Software Portability and Optimization) Lab 4에 오신 것을 환영합니다. 이곳은 재료를 위한 Lab입니다. 우리 팀은 옵션 1과 옵션 4를 작업하기로 했습니다.

소개



이 블로그는 옵션 1을 위한 것이며 6502 어셈블리 언어를 사용하여 추가 계산기를 만들었습니다. 사용자가 2개의 숫자를 삽입하고 함께 추가하는 서브루틴을 생성하겠습니다.

요구 사항


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

  • 코딩




    define  SCINIT  $ff81 ; initialize/clear screen
    define  CHRIN  $ffcf ; input character from keyboard
    define  CHROUT  $ffd2 ; output character to screen
    define  SCREEN  $ffed ; get screen size
    define  PLOT    $fff0 ; get/set cursor coordinates
    
    define RIGHT  $81
    define LEFT  $83
    define ENTER  $0d
    define BACKSPACE $08
    
    define NUM1    $15;
    define  NUM2    $16;
    
    jsr SCINIT
    
    ldy #$00
    jsr firstNumPrint ; ask for input for first number
    jsr getNum; get the first number
    jsr storeFirstNum  ; then store the first number
    ldy #$00
    jsr secondNumPrint  ; ask for input for second number
    jsr getNum; get the second number
    jsr storeSecondNum  ; store the second number
    ldy #$00
    jsr resultPrintString  ; print a string 'Result'
    jsr printResult ; print the result
    jmp mainLoop  ; go back to the first step
    
    getNum:
         sec
         jsr PLOT
         ldx #$15
         clc
         jsr PLOT
    
    getNumLoop:
         sec
         jsr PLOT
         jsr CHRIN
    
    
    charCheck: 
         cmp #BACKSPACE ; if user enter backspace, it erase the #$15 digit
         beq move_back
    
         cmp #RIGHT ; if user enter right arrow, it goes to the first digit
         beq move_right
    
         cmp #LEFT ; if user enter left arrow, it goes to the second digit
         beq move_left
    
         cmp #ENTER ; if user enter enter, it goes to the next process
         beq move
    
    printNum:
         cmp #$30
         bcc getNumLoop
    
         clc
         cmp #$3a
         bcs getNumLoop
    
         jsr CHROUT
    
         sec
         jsr PLOT
         cpx #$17
         bne getNumLoop
         dex
         clc
         jsr PLOT
         jmp getNumLoop
    
    move_back:
     cpx #$15
     beq getNumLoop
     jsr CHROUT
     jmp getNumLoop
    
    move_left: 
         cpx #$15 ; first digit
         beq getNumLoop
         jsr CHROUT
         jmp getNumLoop
    
    move_right: 
     cpx #$16 ; second digit
         beq getNumLoop
         jsr CHROUT
         jmp getNumLoop
    
    move:
         sec
         jsr PLOT
         ldx #$15 ; first digit
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         clc
         sbc #$2F ; to calculate it, it should be subtracted by #$2f
    
         asl
         asl
         asl
         asl
    
         pha
    
         ldx #$16
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         clc
         sbc #$2F ; to calculate it, it should be subtracted by #$2f
         pha
    
         ldx #$00
         iny
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         pla
         tax
         pla
    
         rts
    
    storeFirstNum:
         sta NUM1
         txa
         eor NUM1
         sta NUM1
         rts
    
    storeSecondNum:
         sta NUM2
         txa
         eor NUM2
         sta NUM2
         rts
    
    printResult:
         sec
         jsr PLOT
         ldx #$15
         clc
         jsr PLOT
         sec
         jsr PLOT
    
         sed
         lda NUM1
         adc NUM2
         cld
         pha
    
         bcc outputAddition
         ldx #$14
         clc
         jsr PLOT
         sec
         jsr PLOT
         lda #$31
         jsr CHROUT
    
    outputAddition:
         lsr
         lsr
         lsr
         lsr
         clc
         adc #$30 ; as the received number does not fit for ASCII, it needs to add 
         jsr CHROUT
    
         pla
         and #$0F
         clc
         adc #$30 ; as the received number does not fit for ASCII, it needs to add 
         jsr CHROUT
    
         sec
         jsr PLOT
         ldx #$00
         iny
         clc
         jsr PLOT
    
         rts
    
    firstNumPrint:
         lda firstNum,y
         beq goback_main
         jsr CHROUT
         iny
         bne firstNumPrint
    
    secondNumPrint:
     lda secondNum,y
            beq goback_main
            jsr CHROUT
            iny
            bne secondNumPrint
    
    resultPrintString:
     lda result,y
            beq goback_main
            jsr CHROUT
            iny
            bne resultPrintString
    
    goback_main:
         rts
    
    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
    
    result:
    dcb "R","E","S","U","L","T",":"
    dcb 00
    


    결과는 다음과 같습니다.


    생각과 성찰



    어셈블리 언어 프로그램은 이전보다 더 어려워지고 있으며, 세 번째 랩보다 더 어렵습니다. 이 실습에서는 사용자 입력을 받고 두 개의 숫자와 결과를 저장하고 결과를 화면에 표시하는 방법에 많은 시간을 할애했습니다. 6502 어셈블리 언어에 대해 각 블로그에서 말했듯이 매우 낮은 수준의 프로그래밍 언어이며 메모리 및 레지스터에 자주 액세스합니다. 우리가 이 프로그램을 위해 설계한 작업은 어떤 고급 언어에서도 매우 쉽습니다. 그러나 어셈블러 언어에서는 여전히 구문에 익숙하지 않습니다. 점점 더 많은 연습이 문제를 쉽게 해결하는 데 도움이 되기를 바랍니다.

    좋은 웹페이지 즐겨찾기