SPO 600 LAB 4ストリング研究室オプション1:計算機を加えること

5356 ワード

こんにちは、Spo 600(ソフトウェア移植性と最適化)のために研究室4へようこそ.これは材料の研究室です.私のチームはオプション1とオプション4で働きました.

導入
このブログはオプション1のために、私たちは6502アセンブリ言語を使用して追加計算機を作成しました.私は2つの数字を挿入し、それらを一緒に追加するユーザーのためのサブルーチンを作成します.

要件
  • ユーザーが2桁までの2桁の数字を入力できるようにするサブルーチンを作成します.カーソルがどこにあるかを示して、ユーザーが数字キー(0 - 9)、バックスペースとキーを入力するのを許してください.アキュムレータ( a )レジスタにユーザーの入力値を返します.
  • このサブルーチンを使用して、2つの数字(それぞれ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
    
    これが結果です.


    思考と反射
    アセンブリ言語プログラムは以前よりも難しくなってきており、この研究室では第3の研究室よりも難しくなっています.ユーザの入力の仕方、2つの数字と結果を保存し、結果を画面に表示する方法について多くの時間を費やしました.私が6502アセンブリ言語についての各ブログで述べたように、それは非常に低レベルのプログラミング言語であり、頻繁にメモリとレジスタにアクセスします.我々はこのプログラムのために設計された操作は、任意のより高いレベルの言語で非常に簡単です.しかしアセンブラ言語では、まだ構文に慣れていません.もっと多くのプラクティスが簡単にこの問題を解決するのを助けてくれることを願っています.