ccmdm-re/isa.inc

245 lines
4.5 KiB
PHP

; vim: set ft=nasm:
r0 equ 0
r1 equ 1
r2 equ 2
r3 equ 3
r4 equ 4
r5 equ 5
r6 equ 6
r7 equ 7
r8 equ 8
r9 equ 9
r10 equ 10
r11 equ 11
r12 equ 12
r13 equ 13
r14 equ 14
r15 equ 15
pc equ 16
;;;;; alu ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro or 2
%ifid %1
dw 0x0000 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x0200 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro and 2
%ifid %1
dw 0x0400 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x0600 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro xor 2
%ifid %1
dw 0x0800 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x0a00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro tst 2
%ifid %1
dw 0x0c00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x0e00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro mov 2
%ifid %1
dw 0x1000 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x1200 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro add 2
%ifid %1
dw 0x1400 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x1600 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro sub 2
%ifid %1
dw 0x1800 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x1a00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
%macro cmp 2
%ifid %1
dw 0x1c00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%else
dw 0x1e00 | (((%2)&0xf) << 0) | (((%1)&0x1f) << 4)
%endif
%endmacro
;;;;; bit ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro btst 2
dw 0x2200 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%endmacro
%macro bclr 2
dw 0x2a00 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%endmacro
;;;;; shift ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro sl0 2
%ifid %1
dw 0x3000 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%else
dw 0x3100 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%endif
%endmacro
%macro sr0 2
%ifid %1
dw 0x3800 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%else
dw 0x3900 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%endif
%endmacro
%macro srx 2
%ifid %1
dw 0x3c00 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%else
dw 0x3d00 | (((%2)&0xf) << 0) | (((%1)&0xf) << 4)
%endif
%endmacro
;;;;; branch ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro beq 1
dw 0x4000 | ((((%1)&0x7ff)<<0)>>1)
%endmacro
%macro bne 1
dw 0x4400 | ((((%1)&0x7ff)<<0)>>1)
%endmacro
%macro bmi 1
dw 0x4800 | ((((%1)&0x7ff)<<0)>>1)
%endmacro
%macro bpl 1
dw 0x4c00 | ((((%1)&0x7ff)<<0)>>1)
%endmacro
;;;;; jump+regind ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro jmp 1
%ifid %1
; jmp abs
dw 0x6000 | (((((%1)+0)&0x7ff)<<0)>>1)
%else
; jmp (reg)
dw 0x6c00 | (((%1)&0xf)<<0)
%endif
%endmacro
%macro jsr 1
dw 0x6400 | (((((%1)+0)&0x7ff)<<0)>>1)
%endmacro
%macro loop 1
dw 0x6800 | (((((%1)+0)&0x7ff)<<0)>>1)
%endmacro
%macro input 2
%ifid %1
; input abs, reg
dw 0x8000 | (((%1)&0xff)<<4) | ((%2)&0xf)
%elifnum %1
; input abs, reg
dw 0x8000 | (((%1)&0xff)<<4) | ((%2)&0xf)
%else
; input (reg), reg
dw 0x6d00 | (((%2)&0xf)<<0) | (((%1)&0xf)<<4)
%endif
%endmacro
%macro output 2
%ifid %2
; output reg, abs
dw 0x9000 | (((%2)&0xff)<<4) | ((%1)&0xf)
%elifnum %2
; output reg, abs
dw 0x9000 | (((%2)&0xff)<<4) | ((%1)&0xf)
%else
; output reg, (reg)
dw 0x6e00 | (((%1)&0xf)<<0) | (((%2)&0xf)<<4)
%endif
%endmacro
%macro lmd 2
%ifid %1
; lmd abs, reg
dw 0x7800 | ((((%1)&0xff)<<4)>>1) | (((%2)&0xf)<<0)
%elifnum %1
; lmd abs, reg
dw 0x7800 | ((((%1)&0xff)<<4)>>1) | (((%2)&0xf)<<0)
%else
; lmd (reg), reg
dw 0x6f00 | (((%2)&0xf)<<0) | (((%1)&0xf)<<4)
%endif
%endmacro
;;;;; I/O + misc ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro rts 0
dw 0x7000
%endmacro
%macro wait 0
dw 0x7100
%endmacro
%macro outclr 1
dw 0x7200 | ((%1)&0xff)
%endmacro
%macro outset 1
dw 0x7300 | ((%1)&0xff)
%endmacro
;;;;; I/O bit ops ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro outbclr 2
dw 0xa000 | ((%1)&0xf) | (((%2)&0xff)<<4)
%endmacro
; this is a bug in the original source! this shouldn't happen!
%macro outclr 2
outclr %1
;outbclr %1, %2
%endmacro
%macro outbset 2
dw 0xb000 | ((%1)&0xf) | (((%2)&0xff)<<4)
%endmacro
;%macro outset 2
; outbset %1, %2
;%endmacro
;;;;; lli ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro lli 2
dw 0xc000 | (((%1)&0x3ff)<<4) | (((%2)&0xf)<<0)
%endmacro
%macro nop 0
or r0, r0
%endmacro