6502- Lab4(옵션 1): 계산기 추가
6346 단어 6502programming
소개
이 블로그에서는 6502 어셈블리 언어를 사용하여 계산기를 만들어 보겠습니다. 사용자가 최대 2자리 숫자를 입력하고 적절한 사용자 프롬프트와 피드백을 제공할 수 있는 서브루틴을 만들 것입니다.
계산기 요구 사항 추가
생각과 단계
-> 첫 번째 숫자, 두 번째 숫자 및 결과를 저장하고 화면에 표시할 수 있습니다.
-> 사용자에게 적절한 문장을 프롬프트합니다.
"첫 번째 숫자를 입력하세요: "
-> 첫 번째 숫자에 대한 사용자 입력을 받습니다.
-> 사용자는 "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 어셈블리 언어가 작동하는 방식에 대해 더 많이 이해하는 데 도움이 되었습니다.
Reference
이 문제에 관하여(6502- Lab4(옵션 1): 계산기 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/qiwenyu/6502-lab4option-1-adding-calculator-9l3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)