소스 검색

zasm: make "RET cc" work

pull/10/head
Virgil Dupras 5 년 전
부모
커밋
a7dc1e7b4a
1개의 변경된 파일24개의 추가작업 그리고 29개의 파일을 삭제
  1. +24
    -29
      apps/zasm/zasm.asm

+ 24
- 29
apps/zasm/zasm.asm 파일 보기

@@ -1,12 +1,10 @@
#include "user.inc"

; *** Consts ***
; Number of rows in the "single" argspec string
ARGSPEC_SINGLE_CNT .equ 7
; Number of rows in the argspec table
ARGSPEC_TBL_CNT .equ 12
ARGSPEC_TBL_CNT .equ 27
; Number of rows in the primary instructions table
INSTR_TBLP_CNT .equ 30
INSTR_TBLP_CNT .equ 33
; size in bytes of each row in the primary instructions table
INSTR_TBLP_ROWSIZE .equ 8

@@ -179,10 +177,6 @@ parseArg:
push de
push hl

cp 1
jr z, .matchsingle ; Arg is one char? We have a "single" type.

; Not a "single" arg. Do the real thing then.
ld de, argspecTbl
; DE now points the the "argspec char" part of the entry, but what
; we're comparing in the loop is the string next to it. Let's offset
@@ -204,23 +198,6 @@ parseArg:
; found the matching argspec row. Our result is one byte left of DE.
dec de
ld a, (de)
jr .end

.matchsingle:
ld a, (hl)
ld hl, argspecsSingle
ld bc, ARGSPEC_SINGLE_CNT
.loop2:
cpi
jr z, .end ; found! our result is already in A. go straight
; to end.
jp po, .loop2notfound
jr .loop2
.loop2notfound:
; something's wrong. error
ld a, 0xff
jr .end

.end:
pop hl
pop de
@@ -360,6 +337,18 @@ matchPrimaryRow:
; of bytes written in A.
parseLine:
call readLine
; Check whether we have errors. We don't do any parsing if we do.
ld a, (curArg1)
cp 0xff
jr z, .error
ret z
ld a, (curArg2)
cp 0xff
jr nz, .noerror
.error:
ld a, 0
ret
.noerror:
push de
ld de, instrTBlPrimary
ld b, INSTR_TBLP_CNT
@@ -440,11 +429,15 @@ parseLine:
; 1-10 : group id (see Groups section)
; 0xff: error

argspecsSingle:
.db "ABCDEHL"

; Format: 1 byte argspec + 4 chars string
argspecTbl:
.db 'A', "A", 0, 0, 0
.db 'B', "B", 0, 0, 0
.db 'C', "C", 0, 0, 0
.db 'D', "D", 0, 0, 0
.db 'E', "E", 0, 0, 0
.db 'H', "H", 0, 0, 0
.db 'L', "L", 0, 0, 0
.db 'h', "HL", 0, 0
.db 'l', "(HL)"
.db 'd', "DE", 0, 0
@@ -517,11 +510,13 @@ instrTBlPrimary:
.db "LD",0,0, 'A', 'e', 0, 0x0a ; LD A, (DE)
.db "LD",0,0, 's', 'h', 0, 0x0a ; LD SP, HL
.db "LD",0,0, 'l', 0xb, 0, 0b01110000 ; LD (HL), r
.db "LD",0,0, 0xb, 'l', 3, 0b01000110 ; LD r, (HL)
.db "NOP", 0, 0, 0, 0, 0x00 ; NOP
.db "OR",0,0, 'l', 0, 0, 0xb6 ; OR (HL)
.db "OR",0,0, 0xb, 0, 0, 0b10110000 ; OR r
.db "POP", 0, 0x1, 0, 4, 0b11000001 ; POP qq
.db "RET", 0, 0xa, 0, 3, 0b11000000 ; RET cc
.db "RET", 0, 0, 0, 0, 0xc9 ; RET
.db "RET", 0, 0xb, 0, 3, 0b11000000 ; RET cc
.db "RLA", 0, 0, 0, 0, 0x17 ; RLA
.db "RLCA", 0, 0, 0, 0x07 ; RLCA
.db "RRA", 0, 0, 0, 0, 0x1f ; RRA


불러오는 중...
취소
저장