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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
|
1: ;; settime.z
2: ;;
3: ;; Read date and time from xtrs 1.9 emulator trap and set
4: ;; TRS-80 system date and time.
5: ;;
6: ;; Copyright (c) 1998 Ulrich Mueller
7: ;;
8: ;; This software may be copied, modified, and used for any
9: ;; purpose without fee, provided that (1) the above copyright
10: ;; notice is retained, and (2) modified versions are clearly
11: ;; marked as having been modified, with the modifier's name and
12: ;; the date included.
13: ;;
14: ;; Last modified on Fri May 19 00:38:41 PDT 2000 by mann
15: ;; modified on Sun Feb 22 21:27:13 CET 1998 by ulm
16:
17: ;; Model I/III addresses
18: 402D @exit equ 402dh
19: 4030 @abort equ 4030h
20:
21: ;; Model 1 and 3 store the last 2 digits of the year in the year byte
22: 4041 time1$ equ 4041h ; seconds/minutes/hours
23: 4044 date1$ equ 4044h ; year/day/month
24: 4217 time3$ equ 4217h
25: 421A date3$ equ 421ah
26:
27: ;; Model 4 SVCs
28: 0028 @svc equ 40 ; rst address for SVCs
29: ;@svc equ 5 ; older zmac requires 8080-style "rst 5"
30: 0016 @exit6 equ 22
31: 0015 @abort6 equ 21
32:
33: ;; Model 4 stores the offset from 1900 in the year byte
34: 002D time4$ equ 002dh
35: 0033 date4$ equ 0033h
36:
37: ;; Emulator trap instructions
38: 36ED emt_time equ 36edh
39:
40: 5200 org 5200h
41: 5200 settime:
42: 5200 CDB452 call initj ; init OS-dependent tables
43: 5203 01FFFF ld bc, 0ffffh
44: 5206 3E01 ld a, 1 ; get local time from Unix
45: 5208 ED36 defw emt_time ; BCDE: seconds since 1970
46: 520A 78 ld a, b
47: 520B A1 and c
48: 520C 3C inc a
49: 520D CA9052 jp z, abort
50: 5210 F3 di
51: 5211 2A9352 ld hl, (time)
52: 5214 3E3C ld a, 60
53: 5216 CD7452 call divide
54: 5219 77 ld (hl), a ; seconds
55: 521A 23 inc hl
56: 521B 3E3C ld a, 60
57: 521D CD7452 call divide
58: 5220 77 ld (hl), a ; minutes
59: 5221 23 inc hl
60: 5222 3E18 ld a, 24
61: 5224 CD7452 call divide
62: 5227 77 ld (hl), a ; hours
63: 5228 EB ex de, hl ; HL: days since 1970
64: 5229 014513 ld bc, 19*256+70-1
65: 522C 116D01 ld de, 365
66: 522F 0C year1: inc c ; count years in C
67: 5230 79 ld a, c
68: 5231 D664 sub 100
69: 5233 3803 jr c, year2
70: 5235 4F ld c, a
71: 5236 04 inc b ; centuries
72: 5237 78 ld a, b
73: 5238 E603 year2: and 3
74: 523A D601 sub 1
75: 523C ED52 sbc hl, de
76: 523E 30EF jr nc, year1
77: 5240 07 rlca
78: 5241 ED5A adc hl, de ; HL: days since 1 january
79: 5243 E5 push hl
80: 5244 2A9552 ld hl, (date)
81: 5247 CD9752 call putyr ; year to (hl)
82: 524A 23 inc hl
83: 524B E3 ex (sp), hl
84: 524C E601 and 1 ; A=1 for leap year, 0 else
85: 524E C61C add a, 28
86: 5250 4F ld c, a
87: 5251 0600 ld b, 0
88: 5253 50 ld d, b
89: 5254 04 month1: inc b ; count months in B
90: 5255 78 ld a, b
91: 5256 59 ld e, c
92: 5257 FE02 cp 2
93: 5259 2808 jr z, month2 ; february
94: 525B 1E1F ld e, 31
95: 525D E609 and 9
96: 525F E26352 jp po, month2 ; 31 days
97: 5262 1D dec e ; 30 days
98: 5263 ED52 month2: sbc hl, de ; subtract length of month
99: 5265 30ED jr nc, month1
100: 5267 ED5A adc hl, de
101: 5269 4D ld c, l
102: 526A E1 pop hl
103: 526B 71 ld (hl), c ; day
104: 526C 23 inc hl
105: 526D 70 ld (hl), b ; month
106: 526E FB ei
107: 526F 210000 ld hl,0 ; needed on Model 4 --mann
108: 5272 1819 jr exit
109:
110: ;; divide BCDE / A
111: ;; returns quotient in BCDE, remainder in A
112: 5274 E5 divide: push hl
113: 5275 ED44 neg
114: 5277 67 ld h, a
115: 5278 97 sub a
116: 5279 2E21 ld l, 33
117: 527B 17 div1: rla
118: 527C 84 add a, h
119: 527D 3801 jr c, div2
120: 527F 94 sub h
121: 5280 CB13 div2: rl e
122: 5282 CB12 rl d
123: 5284 CB11 rl c
124: 5286 CB10 rl b
125: 5288 2D dec l
126: 5289 20F0 jr nz, div1
127: 528B E1 pop hl
128: 528C C9 ret
129:
130: ;; Jump tables for OS independence
131: ;; Model 1
132: 528D startj:
133: 528D C32D40 exit: jp @exit
134: 5290 C33040 abort: jp @abort
135: 5293 4140 time: defw time1$
136: 5295 4440 date: defw date1$
137: 5297 C3D052 putyr: jp putyr1
138: 529A endj:
139:
140: ;; Model 3
141: 529A startj3:
142: 529A C32D40 jp @exit
143: 529D C33040 jp @abort
144: 52A0 1742 defw time3$
145: 52A2 1A42 defw date3$
146: 52A4 C3D052 jp putyr3
147:
148: ;; Model 4
149: 52A7 startj4:
150: 52A7 3E16 ld a, @exit6
151: 52A9 EF rst @svc
152: 52AA 3E15 ld a, @abort6
153: 52AC EF rst @svc
154: 52AD 2D00 defw time4$
155: 52AF 3300 defw date4$
156: 52B1 C3D252 jp putyr4
157:
158: ;; Initialize tables
159: ;; Changed to work even on a Model III (or Model 4 in III mode)
160: ;; using MODELA/III as its ROM. Previous version didn't. --mann
161: ;;
162: 52B4 21A752 initj: ld hl, startj4 ; model 4?
163: 52B7 3A0A00 ld a, (000ah)
164: 52BA FE40 cp 40h
165: 52BC 2009 jr nz, movej ; go if so
166: 52BE 219A52 ld hl, startj3 ; model 3?
167: 52C1 3A2501 ld a, (0125h)
168: 52C4 FE49 cp 'I'
169: 52C6 C0 ret nz ; return if not
170: 52C7 118D52 movej: ld de, startj
171: 52CA 010D00 ld bc, endj - startj
172: 52CD EDB0 ldir
173: 52CF C9 ret
174:
175: ;; Create year byte.
176: ;; On entry, c has 2-digit year, b has century.
177: ;; On exit, (hl) has year byte.
178:
179: ;; Model I/III, put 2-digit year
180: 52D0 putyr1:
181: 52D0 71 putyr3: ld (hl), c
182: 52D1 C9 ret
183:
184: ;; Model 4, put offset from 1900 (laboriously recomputed, sigh)
185: 52D2 F5 putyr4: push af
186: 52D3 C5 push bc
187: 52D4 78 ld a, b
188: 52D5 D613 sub 19
189: 52D7 47 ld b, a
190: 52D8 79 ld a, c
191: 52D9 2804 jr z, py41
192: 52DB C664 py40: add a, 100
193: 52DD 10FC djnz py40
194: 52DF 77 py41: ld (hl), a
195: 52E0 C1 pop bc
196: 52E1 F1 pop af
197: 52E2 C9 ret
198:
199: 5200 end settime
Statistics:
36 symbols
227 bytes
Symbol Table:
@abort =4030 emt_time =36ed settime 5200
@abort6 = 15 endj 529a startj 528d
@exit =402d exit 528d startj3 529a
@exit6 = 16 initj 52b4 startj4 52a7
@svc = 28 month1 5254 time 5293
abort 5290 month2 5263 time1 =4041
date 5295 movej 52c7 time3 =4217
date1 =4044 putyr 5297 time4 = 2d
date3 =421a putyr1 52d0 year1 522f
date4 = 33 putyr3 52d0 year2 5238
div1 527b putyr4 52d2
div2 5280 py40 52db
divide 5274 py41 52df
|