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 과제를 위해 작성되었습니다.

좋은 웹페이지 즐겨찾기