summary refs log tree commit diff
path: root/code/calc.a
blob: 2aa1b02411852460dc3a9dc1c8c50b986a95f9e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
.label len 1

jmp start
read_input:
    mov a 0
    mov b 0
    mov c 64
    sys
    mov b 1
    sub
    str c len
    ret

str_to_num:
    ; pointer to current character
    .label ptr 2
    ld a len
    mov b 63
    add
    str c ptr
    .label mult 3
    mov a 1
    str a mult
    .label num 4
    mov a 0
    str a num
    .label zero 48
    stm_loop:
        ;load char, subtract zero, multiply by 10
        ld b ptr
        ldr a b
        mov b zero
        sub
        swp c a
        ld b mult
        mul

        ; add to num
        swp c b
        ld a num
        add
        str c num

        ld a mult
        mov b 10
        mul
        str c mult

        ; move pointer
        ld a ptr
        mov b 1
        sub
        str c ptr
        cmp c 63
        jz stm_loop
    ret

start:
    jmr read_input
    jmr str_to_num
    ld a 4
    str a 8 ; store number 1 to 8
    jmr read_input
    jmr str_to_num
    ld a 4 ; load number from read
    ld b 8
    add
    str c 16 ; put our number into 16
    #using printer.a
    jmr print_num ; print number at 16 (well not print but stringify)
    mov a 1 ; write
    mov b 1 ; stdout
    mov c 32 ; address
    sys ; syscall