bits 8

minstack 2
minheap 2

@define case_result %numb
@define test_cases %int
@define test_end %text
@define test_end_data '\n'
@define total_tests %uint
imm r1 1

out total_tests 16

// NOTE: `sub` is tested in `core.urcl`
// NOTE: `nop` and `hlt` are not tested (obviously)

// jmp
    jmp .jmp_ok1
    out case_result 1
    .jmp_ok1
    out case_result 0

    imm r1 .jmp_ok2
    jmp r1
    out case_result 2
    .jmp_ok2
    out case_result 0
out test_cases 2
out test_end test_end_data

// mov
    mov r2 3
    mov r1 r2
    sub r1 r1 3
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// lsh
    lsh r1 0x88
    sub r1 r1 0x10
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// inc
    inc r1 255
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// dec
    dec r1 0
    sub r1 r1 255
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// neg
    neg r1 0x69
    sub r1 r1 0x97
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// and
    and r1 5 3
    sub r1 r1 1
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// or
    or r1 5 3
    sub r1 r1 7
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// not
    not r1 0
    sub r1 r1 255
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// xnor
    xnor r1 5 3
    sub r1 r1 249
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// xor
    xor r1 5 3
    sub r1 r1 6
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// nand
    nand r1 5 3
    sub r1 r1 254
    out case_result r1
out test_cases 1
out test_end test_end_data
imm r1 1

// brl
    brl .brl_ok_1 240 246
    out case_result 1

    .brl_ok_1
    out case_result 0
    brl .brl_fail_2 246 240
    out case_result 0
    bge .brl_ok_2 r0 r0
    .brl_fail_2
    out case_result 2

    .brl_ok_2
    brl .brl_fail_3 240 240
    out case_result 0
    bge .brl_ok_3 r0 r0
    .brl_fail_3
    out case_result 3
    .brl_ok_3
out test_cases 3
out test_end test_end_data
imm r1 1

// brg
    brg .brg_ok_1 246 240
    out case_result 1

    .brg_ok_1
    out case_result 0
    brg .brg_fail_2 240 246
    out case_result 0
    bge .brg_ok_2 r0 r0
    .brg_fail_2
    out case_result 2

    .brg_ok_2
    brg .brg_fail_3 240 240
    out case_result 0
    bge .brg_ok_3 r0 r0
    .brg_fail_3
    out case_result 3
    .brg_ok_3
out test_cases 3
out test_end test_end_data
imm r1 1

// bre
    bre .bre_ok_1 69 325
    out case_result 1

    .bre_ok_1
    out case_result 0
    bre .bre_fail_2 69 42
    out case_result 0
    bge .bre_ok_2 r0 r0

    .bre_fail_2
    out case_result 2
    .bre_ok_2
out test_cases 2
out test_end test_end_data
imm r1 1

// bne
    bne .bne_ok_1 69 42
    out case_result 1

    .bne_ok_1
    out case_result 0
    bne .bne_fail_2 69 325
    out case_result 0
    bge .bne_ok_2 r0 r0

    .bne_fail_2
    out case_result 2
    .bne_ok_2
out test_cases 2
out test_end test_end_data
imm r1 1
