-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathc0t.s
More file actions
159 lines (151 loc) · 1.66 KB
/
c0t.s
File metadata and controls
159 lines (151 loc) · 1.66 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/ assure fake printf (no floating)
.globl fltused; fltused = 0
/ convert stream to number; result is type.
/ value in cval or fcval
fpp = 1
.globl _getnum
.globl _peekc
.globl _getchar
.globl _cval
.globl _fcval
.globl _error
_getnum:
.if fpp
movif $10.,fr3
clrf fr0
.endif
clr nfract
clr totdig
clr decpt
clr _cval
mov 2(sp),base
mov r2,-(sp)
1:
jsr r5,getdig
br 2f
.if fpp
mulf fr3,fr0
movif r0,fr1
addf fr1,fr0
.endif
inc nfract
br 1b
2:
tst decpt
bne 1f
clr nfract
cmp r0,$'.
bne 1f
mov pc,decpt
br 1b
1:
tst totdig
beq 1f
cmp r0,$'e
bne 1f
clr -(sp)
clr _cval
mov pc,decpt
clr _cval
mov $10.,base
jsr pc,_getchar
cmp r0,$'+
beq 2f
cmp r0,$'-
bne 3f
inc (sp)
br 2f
3:
mov r0,_peekc
2:
jsr r5,getdig
br 2f
br 2b
2:
tst (sp)+
beq 2f
neg _cval
2:
sub _cval,nfract
1:
mov r0,_peekc
tst totdig
bne 1f
mov $39.,r0 / "." operator
9:
mov (sp)+,r2
rts pc
1:
tst decpt
bne 1f
mov $21.,r0 / fixed constant
br 9b
1:
.if fpp
movif $1,fr2
mov nfract,r2
mov r2,-(sp)
beq 2f
bgt 1f
neg r2
1:
mulf fr3,fr2
sob r2,1b
2:
tst (sp)+
ble 1f
divf fr2,fr0
br 2f
1:
mulf fr2,fr0
2:
mov $_fcval,r0
movf fr0,(r0)
tst (r0)+
tst (r0)+
bne 1f
tst (r0)+
bne 1f
tst (r0)+
bne 1f
mov $24.,r0
mov _fcval,_cval
br 9b
1:
mov $23.,r0
br 9b
.endif
.if 1-fpp
mov $fperr,-(sp)
jsr pc,_error
tst (sp)+
mov $21.,r0
br 9b
fperr: <No floating point!\0>; .even
.endif
getdig:
mov _peekc,r0
beq 1f
clr _peekc
br 2f
1:
jsr pc,_getchar
2:
sub $'0,r0
cmp r0,$9.
bhi 1f
inc totdig
mov _cval,r1
mul base,r1
add r0,r1
mov r1,_cval
tst (r5)+
rts r5
1:
add $'0,r0
rts r5
.bss
base: .=.+2
nfract: .=.+2
decpt: .=.+2
totdig: .=.+2