summaryrefslogtreecommitdiff
path: root/settime.lst
blob: f810bb8a0131267c58b279d88d324291bca8c2de (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
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