; 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