aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@gmail.com>2022-08-20 15:57:06 -0500
committerJacques Comeaux <jacquesrcomeaux@gmail.com>2022-08-20 15:57:06 -0500
commitef373cb4047e51381819b1ffe5385fa8d2edcc7f (patch)
tree14ab211b099c3f27f8035de61ff35d4b65454d21
parentac8d628827aa1cdf746fce8b4cdce140558e0f89 (diff)
Add S-Exp printer
-rw-r--r--print.s73
1 files changed, 62 insertions, 11 deletions
diff --git a/print.s b/print.s
index f84ca70..3955d56 100644
--- a/print.s
+++ b/print.s
@@ -1,11 +1,62 @@
- MOV R1, -(SP)
- BR 20$
-10$:
- TSTB @#177564
- BEQ 10$
- MOVB R1, @#177566
-20$:
- MOVB (R0)+, R1
- BNE 10$
- MOV (SP)+, R1
- RTS PC
+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