John Breaux
fc8f8b9622
- Everything has been rewritten - Modularity is improved somewhat - No dependency injection in preprocessor/parser, though - There are now early and late constant evaluation engines - This engine allows for by-value access to already-assembled code - Performs basic math operations, remainder, bitwise logic, bit shifts, negation, and bit inversion - Also allows for indexing into already-generated code using pointer-arithmetic syntax: `*(&main + 10)`. This is subject to change? It's clunky, and only allows word-aligned access. However, this rewrite is taking far too long, so I'll call the bikeshedding here. - Pretty sure this constant evaluation is computationally equivalent to Deadfish?
281 lines
4.2 KiB
NASM
Executable File
281 lines
4.2 KiB
NASM
Executable File
;© 2023 John Breaux
|
|
; examples of valid assembly
|
|
;
|
|
|
|
; testing labels
|
|
jmp main
|
|
|
|
; testing directives
|
|
.string "ABA"
|
|
.string "ABAB"
|
|
.word 0b0101101001011010
|
|
.words [0xdead 0xbeef 0x0000]
|
|
|
|
main:
|
|
; testing defines
|
|
.define asdfgh #0x1000
|
|
.define qwerty @sp+
|
|
br asdfgh
|
|
mov qwerty, r15
|
|
|
|
|
|
|
|
_register_mode:
|
|
.define numbered r1
|
|
mov r0, r1
|
|
mov r1, r2
|
|
mov r2, r3
|
|
mov r3, r4
|
|
mov r4, r5
|
|
mov r5, r6
|
|
mov r6, r7
|
|
mov r7, r8
|
|
mov r8, r9
|
|
mov r9, r10
|
|
mov r10, r11
|
|
mov r11, r12
|
|
mov r12, r13
|
|
mov r13, r14
|
|
mov r14, r15
|
|
|
|
.define special r2
|
|
mov pc, r15
|
|
mov sp, r15
|
|
mov sr, r15
|
|
mov cg, r15
|
|
|
|
|
|
indirect_mode:
|
|
.define numbered r3
|
|
mov @r0, r1
|
|
mov @r1, r2
|
|
;mov @r2, r3
|
|
;mov @r3, r4
|
|
mov @r4, r5
|
|
mov @r5, r6
|
|
mov @r6, r7
|
|
mov @r7, r8
|
|
mov @r8, r9
|
|
mov @r9, r10
|
|
mov @r10, r11
|
|
mov @r11, r12
|
|
mov @r12, r13
|
|
mov @r13, r14
|
|
mov @r14, r15
|
|
|
|
.define special r4
|
|
mov @pc, r15
|
|
mov @sp, r15
|
|
;mov @sr, r15 ; These are part of encodings for #immediate values [-1, 0, 1, 2, 4, 8]
|
|
;mov @cg, r15
|
|
|
|
indirect_pi_mode:
|
|
.define numbered r5
|
|
;mov @r0+, r1
|
|
mov @r1+, r2
|
|
;mov @r2+, r3
|
|
;mov @r3+, r4
|
|
mov @r4+, r5
|
|
mov @r5+, r6
|
|
mov @r6+, r7
|
|
mov @r7+, r8
|
|
mov @r8+, r9
|
|
mov @r9+, r10
|
|
mov @r10+, r11
|
|
mov @r11+, r12
|
|
mov @r12+, r13
|
|
mov @r13+, r14
|
|
mov @r14+, r15
|
|
|
|
.define special r6
|
|
; mov , r14
|
|
; mov @pc+, r15 ; This is a mov-immediate, and may corrupt your output
|
|
mov @sp+, r15 ; pop r15
|
|
mov @sr+, r15 ; These are part of encodings for #immediate values [-1, 0, 1, 2, 4, 8]
|
|
mov @cg+, r15
|
|
|
|
indexed_mode:
|
|
.define numbered r7
|
|
mov.b 0x10(r0), r1
|
|
mov 0x10(r1), r2
|
|
;mov 10(r2), r3 ; Invalid: cannot index relative to sr
|
|
;mov 10(r3), r4 ; Invalid: cannot index relative to cg
|
|
mov 0x10(r4), r5
|
|
mov 0x10(r5), r6
|
|
mov 0x10(r6), r7
|
|
mov 0x10(r7), r8
|
|
mov 0x10(r8), r9
|
|
mov 0x10(r9), r10
|
|
mov 0x10(r10), r11
|
|
mov 0x10(r11), r12
|
|
mov 0x10(r12), r13
|
|
mov 0x10(r13), r14
|
|
mov 0x10(r14), r15
|
|
|
|
.define special r8
|
|
mov 0x10(pc), r15
|
|
mov 0x10(sp), r15
|
|
;mov 10(sr), r15 ; These are part of encodings for #immediate values [-1, 0, 1, 2, 4, 8]
|
|
;mov 10(cg), r15
|
|
|
|
_immediate_mode:
|
|
.define numbered r9
|
|
mov #0xbeef, r0
|
|
mov #0xbeef, r1
|
|
mov #0xbeef, r2
|
|
mov #0xbeef, r3
|
|
mov #0xbeef, r4
|
|
mov #0xbeef, r5
|
|
mov #0xbeef, r6
|
|
mov #0xbeef, r7
|
|
mov #0xbeef, r8
|
|
mov #0xbeef, r9
|
|
mov #0xbeef, r10
|
|
mov #0xbeef, r11
|
|
mov #0xbeef, r12
|
|
mov #0xbeef, r13
|
|
mov #0xbeef, r14
|
|
mov #0xbeef, r15
|
|
|
|
.define special r10
|
|
mov #0xbeef, pc
|
|
mov #0xbeef, sp
|
|
mov #0xbeef, sr
|
|
mov #0xbeef, cg
|
|
|
|
jmp _register_mode
|
|
jmp 0x3fe
|
|
jmp -0x3fc
|
|
ret
|
|
|
|
; Funky encodings
|
|
mov r6, r4
|
|
mov @r6, r4
|
|
mov @r6+, r4
|
|
mov 0x0(r6), r4
|
|
mov 0x4141(r6), r4
|
|
mov #-1, r4
|
|
mov #0xffff, r4
|
|
mov #0, r4
|
|
mov #1, r4
|
|
mov #2, r4
|
|
mov #4, r4
|
|
mov #8, r4
|
|
mov r6, 0(r4)
|
|
mov @r6, 0(r4)
|
|
mov @r6+, 0(r4)
|
|
mov 0(r6), 0(r4)
|
|
mov 0x4141(r6), 0(r4)
|
|
mov #-1, 0(r4)
|
|
mov #0xffff, 0(r4)
|
|
mov #0, 0(r4)
|
|
mov #1, 0(r4)
|
|
mov #2, 0(r4)
|
|
mov #4, 0(r4)
|
|
mov #8, 0(r4)
|
|
mov r6, 0x4141(r4)
|
|
mov @r6, 0x4141(r4)
|
|
mov @r6+, 0x4141(r4)
|
|
mov 0(r6), 0x4141(r4)
|
|
mov 0x4141(r6), 0x4141(r4)
|
|
mov #-1, 0x4141(r4)
|
|
mov #0xffff, 0x4141(r4)
|
|
mov #0, 0x4141(r4)
|
|
mov #1, 0x4141(r4)
|
|
mov #2, 0x4141(r4)
|
|
mov #4, 0x4141(r4)
|
|
mov #8, 0x4141(r4)
|
|
mov r6, #0
|
|
mov @r6, #0
|
|
mov @r6+, #0
|
|
mov 0(r6), #0
|
|
mov 0x4141(r6), #0
|
|
mov #-1, #0
|
|
mov #0xffff, #0
|
|
mov #0, #0
|
|
mov #1, #0
|
|
mov #2, #0
|
|
mov #4, #0
|
|
mov #8, #0
|
|
mov r6, #1
|
|
mov @r6, #1
|
|
mov @r6+, #1
|
|
mov 0(r6), #1
|
|
mov 0x4141(r6), #1
|
|
mov #-1, #1
|
|
mov #0xffff, #1
|
|
mov #0, #1
|
|
mov #1, #1
|
|
mov #2, #1
|
|
mov #4, #1
|
|
mov #8, #1
|
|
|
|
; Instruction exercise
|
|
; Jumps
|
|
jne 0x10
|
|
jeq 0x10
|
|
jlo 0x10
|
|
jhs 0x10
|
|
jn 0x10
|
|
jge 0x10
|
|
jl 0x10
|
|
jmp 0x10
|
|
|
|
; Two-ops
|
|
mov r14, r15
|
|
add r14, r15
|
|
addc r14, r15
|
|
subc r14, r15
|
|
sub r14, r15
|
|
cmp r14, r15
|
|
dadd r14, r15
|
|
bit r14, r15
|
|
bic r14, r15
|
|
bis r14, r15
|
|
xor r14, r15
|
|
and r14, 0x10(r15)
|
|
|
|
; One-ops
|
|
rrc r15
|
|
swpb r15
|
|
rra r15
|
|
sxt r15
|
|
push r15
|
|
call r15
|
|
; reti is special
|
|
reti
|
|
|
|
; Jump aliases
|
|
jnc 0x10
|
|
jnz 0x10
|
|
jc 0x10
|
|
jz 0x10
|
|
|
|
; "emulated" no-op instructions
|
|
ret
|
|
clrc
|
|
setc
|
|
clrz
|
|
setz
|
|
clrn
|
|
setn
|
|
dint
|
|
eint
|
|
nop
|
|
|
|
; "emulated" one-op instructions
|
|
br r15
|
|
pop r15
|
|
rla r15
|
|
rlc r15
|
|
inv r15
|
|
clr r15
|
|
tst r15
|
|
dec r15
|
|
decd r15
|
|
inc r15
|
|
incd r15
|
|
adc r15
|
|
dadc r15
|
|
sbc r15
|