245 lines
4.5 KiB
PHP
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
|