6502 어셈블러 에뮬레이터로 추가 계산기를 만드는 방법
소개
오늘은 어셈블리 언어와 6502 에뮬레이터로 작은 계산기를 만들어 보겠습니다.
6502는 16비트 주소 버스가 있는 8비트 프로세서입니다. 따라서 64킬로바이트(216바이트)에 액세스할 수 있습니다. 각 16비트 주소는 두 개의 8비트 바이트로 구성되므로 메모리는 각각 256바이트의 256페이지로 볼 수 있습니다.
여기 내 코드를 볼 수 있습니다.
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 ARG1 $15; for the first number of user's input
define ARG2 $16; for the second number of user's input
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
autoRestart:
ldy #$00
jsr firstArgInput ; first number input question
jsr getArg; receive the first number
jsr firstArgStore ; store the input number
ldy #$00
jsr secondArgInput ; second number input question
jsr getArg; receive the second number
jsr secondArgStore ; store the input number
ldy #$00
jsr resultStr ; for displaying the result string
jsr result ; for displaying the calculation result
jmp autoRestart ; go back to the first step
getArg:
sec
jsr PLOT
ldx #$15
clc
jsr PLOT
numLoop:
sec
jsr PLOT
jsr CHRIN
keyboardCheck:
cmp #RIGHT ; using RIGHT arrow key, the program goes to the first digit
beq right
cmp #LEFT ; using LEFT arrow key, the program goes to the second digit
beq left
cmp #BACKSPACE ; after using BACKSPACE, one digit will be deleted
beq delete
cmp #ENTER ; after pressing ENTER, the program goes to the next process
beq move
print:
cmp #$30
bcc numLoop
clc
cmp #$3a
bcs numLoop
jsr CHROUT
sec
jsr PLOT
cpx #$17
bne numLoop
dex
clc
jsr PLOT
jmp numLoop
left:
cpx #$15 ; first digit
beq numLoop
jsr CHROUT
jmp numLoop
right:
cpx #$16 ; second digit
beq numLoop
jsr CHROUT
jmp numLoop
delete:
cpx #$15
beq numLoop
jsr CHROUT
jmp numLoop
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
firstArgStore:
sta ARG1
txa
eor ARG1
sta ARG1
rts
secondArgStore:
sta ARG2
txa
eor ARG2
sta ARG2
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 ARG1
adc ARG2
cld
pha
bcc calculateAdd
ldx #$14
clc
jsr PLOT
sec
jsr PLOT
lda #$31
jsr CHROUT
firstArg:
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
secondArg:
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
firstArgInput:
lda firstArg,y
beq goback_main
jsr CHROUT
iny
bne firstArgInput
secondArgInput:
lda secondArg,y
beq goback_main
jsr CHROUT
iny
bne secondArgInput
resultStr:
lda results,y
beq goback_main
jsr CHROUT
iny
bne resultStr
goback_main:
rts
아직 진행 중...
결론
이 실험을 진행하는 동안 Assembly Compiler의 사소한 버그를 해결했습니다. 풀 요청에 대한 링크를 참조하십시오.
⚠️ 개발자용 오픈 소스 블로그 게시물:
연결
🖇 자식 https://github.com/aserputov
🖇 트위터
p.s 이 글은 제 SPO 수업 Lab 3 과제를 위해 작성되었습니다.
Reference
이 문제에 관하여(6502 어셈블러 에뮬레이터로 추가 계산기를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/serputov/how-to-create-adding-calculator-with-6502-assembler-emulator-4a2e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)