-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathboot.aii
327 lines (252 loc) · 3.77 KB
/
boot.aii
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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
;
; Host FST boot loader.
;
;
;
;
;
string asis
case on
include 'gsos.equ'
include 'fst.macros'
include 'records.equ'
macro
&lab call_host
&lab dc.b $42, $ff
endm
macro
&lab host_print
&lab dc.b $42, $fe
endm
macro
&lab host_hexdump
&lab dc.b $42, $fd
endm
gbuffer equ $9a00
header proc org $2000
import startup
import readfile
import getbootname
import getfstname
export aux_value
jmp startup
nop
dc.w readfile
dc.w getbootname
dc.w getfstname
dc.w startup-header
aux_value dc.w 0
endp
; getfst_name(name*)
;
getfstname proc
nameptr equ $0
plx ; rts
pla
sta <nameptr
pla
sta <nameptr+2
phx
ldy |fst_str
iny
short m
@loop
lda fst_str,y
sta [nameptr],y
dey
bpl @loop
long m
clc
lda #0
rts
fst_str str.w 'Host.fst'
endp
getbootname proc
nameptr equ $0
plx ; rts
pla
sta <nameptr
pla
sta <nameptr+2
phx
ldy |volume_str
iny
short m
@loop
lda volume_str,y
sta [nameptr],y
dey
bpl @loop
long m
clc
lda #0
rts
volume_str str.w ':Host'
endp
readfile proc
;
;
;
import OpenDCB:OpenRecGS
import CloseDCB:CloseRecGS
import ReadDCB:IORecGS
import open_read_close
plx ; rts
pla
sta ReadDCB.dataBuffer
pla
sta ReadDCB.dataBuffer+2
pla
sta OpenDCB.pathname
pla
sta OpenDCB.pathname+2
phx ; rts
jsr open_read_close
bcs @error
lda OpenDCB.fileType
sta 3,s
lda OpenDCB.auxType
sta 5,s
lda OpenDCB.eof
sta 7,s
lda OpenDCB.eof+2
sta 9,s
lda #0
clc
rts
@error ; A should have error code....
rts
endp
open_read_close proc
;
; pathname, dataBuffer set up in DCBs.
;
import OpenDCB:OpenRecGS
import CloseDCB:CloseRecGS
import ReadDCB:IORecGS
import fakedp
with fst_parms
phd
phb
phk
plb
lda #fakedp
tcd
lda gbuffer
sta scratch
lda #OpenDCB
sta param_blk_ptr
lda #^OpenDCB
sta param_blk_ptr+2
stz dev1_num
stz dev2_num
lda OpenDCB.pathname
sta path1_ptr
lda OpenDCB.pathname+2
sta path1_ptr+2
stz path2_ptr
stz path2_ptr+2
lda #$4000
sta path_flag
lda #11
sta span1
stz span2
ldx #$2010
stx call_number
sec
call_host
bcs @exit
; x = cookie for open/close.
txy ; cookie
lda OpenDCB.eof
sta ReadDCB.requestCount
lda OpenDCB.eof+2
sta ReadDCB.requestCount+2
; global data buffer -
; readline mask.
stz $9a00
stz ReadDCB.transferCount
stz ReadDCB.transferCount+2
lda #ReadDCB
sta param_blk_ptr
lda #^ReadDCB
sta param_blk_ptr+2
stz dev1_num
stz dev2_num
stz path1_ptr
stz path1_ptr+2
stz path2_ptr
stz path2_ptr+2
stz path_flag
stz span1
stz span2
ldx #$2012
stx call_number
sec
call_host
; close...
lda #CloseDCB
sta param_blk_ptr
lda #^CloseDCB
sta param_blk_ptr+2
ldx #$2014
stx call_number
sec
call_host
@exit
lda scratch
sta gbuffer
plb
pld
rts
scratch ds.w 1
endp
startup proc
clc
xce
long m,x
import OpenDCB:OpenRecGS
import CloseDCB:CloseRecGS
import ReadDCB:IORecGS
import aux_value
; 0. host fst start up.
lda #0
ldx #$8001
call_host
; 1. open/read/close start.gsos
; 2. execute start.gsos
lda #15
sta OpenDCB.pCount
lda #start_str
sta OpenDCB.pathname
lda #^start_str
sta OpenDCB.pathname+2
lda #1
sta OpenDCB.requestAccess
lda #1
sta CloseDCB.pCount
lda #3
sta ReadDCB.pCount
lda #$6800
sta ReadDCB.dataBuffer
lda #$0000
sta ReadDCB.dataBuffer+2
jsr open_read_close
lda OpenDCB.auxType
sta aux_value
lda #$1000 ; want *:System:Drivers:Boot.Driver
ldx #0
ldy #0
jmp $6803
start_str str.w 'System:Start.GS.OS'
endp
Data record
export OpenDCB, CloseDCB, ReadDCB
OpenDCB ds OpenRecGS
CloseDCB ds CloseRecGS
ReadDCB ds IORecGS
; needs to be last.
export fakedp
fakedp
endr
end