aboutsummaryrefslogtreecommitdiff
path: root/print.s
blob: 3955d5663af4a4d51ceeb9ffd39da56c0984e829 (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
print:
004000 012705 MOV #6000, R5         ; store print buffer address in R5
004002 006000
004004 032700 BIT #1, R0            ; test if sexp is cons or atom
004006 000001
004010 001003 BNE 6
004012 004727 JSR PC, #handle_cons
004014 004100
004016 000402 BR 4
004020 004727 JSR PC, #handle_atom
004022 004200
004024 012725 MOV #"\n\0", (R5)+    ; move newline and null byte into print buffer
004026 000012
004030 000127 JMP #print_buffer
004032 004300

handle_cons:
004100 016046 MOV 2(R0), -(SP)      ; push cdr onto stack
004102 000002
004104 011000 MOV @R0, R0           ; traverse to car
004106 032700 BIT #1, R0            ; test if car is cons or atom
004110 000001
004112 001005 BNE 12
004114 112725 MOVB #"(", (R5)+      ; if cons output open paren
004116 000050
004120 004727 JSR PC, #handle_cons  ; recurse
004122 004100
004124 000402 BR 4
004126 004727 JSR PC, #handle_atom  ; if atom output atom
004130 004200
004132 012600 MOV (SP)+, R0         ; pop cdr from stack
004134 032700 BIT #1, R0            ; test if cdr is cons or atom
004136 001005 BNE 12
004140 112725 MOVB #" ", (R5)+      ; if cons output space
004142 000040
004144 004727 JSR PC, #handle_cons  ; recurse
004156 004100
004150 000402 BR 4
004152 112725 MOVB #")", (R5)+      ; if atom output close paren
004154 000051
004156 000207 RTS PC

handle_atom:
004200 000401 BR 2            ;
004202 110125 MOVB R1, (R5)+  ; move char to print buffer
004204 112001 MOVB (R0)+, R1  ; get next byte
004206 001372 BNE -6          ; if not null continue
004210 000207 RTS PC          ;

print_buffer:
004300 012705 MOV #6000, R5       ; restore print buffer pointer
004302 006000
004304 000404 BR 12
004306 105737 TSTB @#177564       ; test if console ready
004310 177564
004312 001772 BEQ -6              ; loop while not ready
004314 110137 MOVB R1, @#177566   ; send char to console
004316 177566
004320 112501 MOVB (R5)+, R1      ; get next byte
004322 001362 BNE -16             ; if not null continue
004324 000127 JMP #read (002000)
004326 002000