Mercurial > hg > Members > kono > nitros9-code
annotate 3rdparty/booters/boot_wd1002.asm @ 460:255b5bab1b72
Now use fill pseud-op
author | boisy |
---|---|
date | Thu, 26 Sep 2002 15:26:12 +0000 |
parents | 3e3f1f79ba00 |
children |
rev | line source |
---|---|
45 | 1 ******************************************************************** |
392 | 2 * Boot - Eliminator WD1002-05 Boot Module |
45 | 3 * |
4 * $Id$ | |
5 * | |
6 * WD 1002-05 OS-9 Boot Subroutine (called by OS9p1) | |
7 * Copyright 1988, 1989 Bruce Isted | |
8 * All Rights Reserved | |
9 * | |
10 * Ed. Comments Who YY/MM/DD | |
11 * ------------------------------------------------------------------ | |
12 * 2 Created by Bruce Isted BRI ??/??/?? | |
13 | |
14 nam Boot | |
392 | 15 ttl Eliminator WD1002-05 Boot Module |
45 | 16 |
17 * These equates should be set before assembly: | |
18 FDStep equ $09 see Step Rate Table | |
19 HDStep equ $0F see step rate table | |
20 | |
21 *Step Rate Table: | |
22 *+------------------+------------------+------------------+------------------+ | |
23 *! Value=FD/HD Rate ! Value=FD/HD Rate ! Value=FD/HD Rate ! Value=FD/HD Rate ! | |
24 *+------------------+------------------+------------------+------------------+ | |
25 *! $00=40mS/7.5mS ! $04=16mS/5.5mS ! $08=08mS/3.5mS ! $0C=03mS/1.5mS ! | |
26 *! $01=25mS/7.0mS ! $05=14mS/5.0mS ! $09=06mS/3.0mS ! $0D=02mS/1.0mS ! | |
27 *! $02=20mS/6.5mS ! $06=12mS/4.5mS ! $0A=05mS/2.5mS ! $0E=01mS/0.5mS ! | |
28 *! $03=18mS/6.0mS ! $07=10mS/4.0mS ! $0B=04mS/2.0mS ! $0F=15uS/ 35uS ! | |
29 *+------------------+------------------+------------------+------------------+ | |
30 | |
31 ifp1 | |
32 use defsfile | |
33 endc | |
34 | |
35 * These equates should not have to be changed: | |
36 BEdtn equ 2 | |
37 BVrsn equ 1 | |
38 MaxCyls equ 1024 maximum cylinders supported | |
39 MaxHeads equ 16 maximum heads supported | |
40 MaxSctrs equ 64 maximum sectors per track supported | |
41 PhysDrv0 equ %10000000 SDH register mask for HD0 | |
42 PhysDrv1 equ %10001000 SDH register mask for HD1 | |
43 PhysDrv2 equ %10010000 SDH register mask for HD2 | |
44 PhysDrv3 equ %00011000 SDH register mask for FD0 | |
45 PhysDrv4 equ %00011010 SDH register mask for FD1 | |
46 PhysDrv5 equ %00011100 SDH register mask for FD2 | |
47 PhysDrv6 equ %00011110 SDH register mask for FD3 | |
48 ReadSctr equ %00100000 read sector command | |
49 Restore equ %00010000 base restore command | |
50 SelfTest equ %10010000 WD 1002-05 diagnostic test command | |
51 | |
52 * HCA memory map: | |
53 org 0 | |
54 WDData rmb 2 WD 1002-05 sector buffer/task files | |
55 rmb 2 reserved - do not use | |
56 PA equ . PIA PA offset | |
57 DDRA rmb 1 PIA DDRA offset | |
58 CRA rmb 1 PIA CRA offset | |
59 PB equ . PIA PB offset | |
60 DDRB rmb 1 PIA DDRB offset | |
61 CRB rmb 1 PIA CRB offset | |
62 | |
63 * WD 1002-05 register definitions: | |
64 org 0 | |
65 WDBuff rmb 1 WD 1002-05 sector buffer address | |
66 ErrReg equ . error register address (read) | |
67 WPCReg rmb 1 write precomp register address (write) | |
68 SctrCnt rmb 1 sector count register address | |
69 SctrReg rmb 1 sector number register address | |
70 CylLow rmb 1 cylinder LSB register address | |
71 CylHigh rmb 1 cylinder MSB register address | |
72 SDHReg rmb 1 Size/Drive/Head register address | |
73 StatReg equ . status register address (read) | |
74 CmdReg rmb 1 command register address (write) | |
75 | |
76 org 0 | |
77 U.BSZ rmb 2 boot file size | |
78 U.BSct rmb 1 number of sectors in boot file | |
79 U.BT rmb 3 boot file start LSN | |
80 U.BtStrt rmb 2 boot file start address | |
81 U.CrtCyl rmb 2 current cylinder number | |
82 U.CrtSct rmb 1 current sector number | |
83 U.CrtSid rmb 1 current side (head) number | |
84 U.Restor rmb 1 restore command incl. step rate code | |
85 U.SDH rmb 1 base WD Size/Drive/Head register copy | |
86 U.Sides rmb 1 number of disk sides (heads) | |
87 U.SPC rmb 2 sectors per cylinder | |
88 U.SPT rmb 2 sectors per track | |
89 U.StSctr rmb 1 start sector number (HD=0, FD=1) | |
90 BootMem equ . | |
91 | |
92 mod BEnd,BNam,Systm+Objct,ReEnt+BVrsn,BExec,$00 | |
93 BNam fcs "Boot" | |
94 fcb BEdtn edition number | |
95 | |
96 * base SDH register table | |
97 SDHTable equ * | |
98 fcb PhysDrv0,PhysDrv1,PhysDrv2 base SDH for hard drives | |
99 fcb PhysDrv3,PhysDrv4,PhysDrv5,PhysDrv6 base SDH for floppys | |
100 *** | |
101 * Boot subroutine module | |
102 * | |
103 * INPUT: none | |
104 * | |
105 * OUTPUT: [D]=size of bootstrap file | |
106 * [X]=start address of bootstrap file in memory | |
107 * y,u registers altered | |
108 * | |
109 * ERROR OUTPUT: [CC]=carry set | |
110 * [B]=error code | |
111 BExec ldy <D.WDAddr get HCA base address (set by auto-boot EPROM) | |
112 cmpy #$FF40 base address too low? | |
113 blo UnitErr yes, go report error... | |
114 cmpy #$FF7F base address too high? | |
115 bhi UnitErr yes, go report error... | |
116 lda <D.WDBtDr get boot drive number (set by auto-boot EPROM | |
117 cmpa #$07 legal drive number? | |
118 blo InitPIA yes, go initialize PIA... | |
119 UnitErr ldb #E$Unit | |
120 coma | |
121 rts | |
122 | |
123 DumpRead clr PB,y set WD address to sector buffer | |
124 DumpR0 lda WDData,y get a byte from WD sector buffer | |
125 decb done yet? | |
126 bne DumpR0 no, go dump another byte | |
127 rts | |
128 LSN0Info ldb #DD.FMT load number of bytes to dump | |
129 bsr DumpRead go dump LSN0 up to DD.FMT | |
130 lda WDData,y get DD.FMT (disk density, sides) | |
131 anda #$01 mask out all but disk sides bit | |
132 inca correction to bit coding | |
133 sta U.Sides,u save disk sides (not valid if HD > 2 heads) | |
134 ldd WDData,y get DD.SPT (sectors per track) | |
135 std U.SPT,u | |
136 ldb #DD.BT-DD.RES load number of bytes to dump | |
137 bsr DumpRead go dump LSN0 from DD.RES to DD.BT | |
138 lda WDData,y get DD.BT (boot file start LSN) MSB | |
139 sta U.BT,u | |
140 ldd WDData,y get DD.BT (boot file start LSN) LSBs | |
141 std U.BT+1,u | |
142 ldd WDData,y get DD.BSZ (boot file size) | |
143 std U.BSZ,u | |
144 ldb U.StSctr,u floppy drive? (start sector = 1) | |
145 bne GotInfo yes, sides info OK, go return | |
146 ldb #DD.OPT+(PD.SID-PD.OPT)-DD.DAT load number of bytes to dump | |
147 bsr DumpRead go dump LSN0 from DD.DAT to number of sides in option table | |
148 lda WDData,y get number of sides from DD.OPT section | |
149 sta U.Sides,u | |
150 GotInfo rts | |
151 | |
152 InitPIA clr CRA,y enable PIA DDRA | |
153 ldd #$033E [A]=DDRA: PA bits 7-2 = inputs, bits 1-0 = outputs | |
154 std DDRA,y [B]=CRA: PIA CA2 out high, PA slct, CA1 low to high, no IRQs | |
155 clr CRB,y enable PIA DDRB | |
156 lda #$FF [A]=DDRB: PB bits 7-0 all outputs | |
157 std DDRB,y [B]=CRB: PIA CB2 out high, PB slct, CB1 low to high, no IRQs | |
158 leas -BootMem,s open up some space for variables | |
159 leau ,s point [U] to start of variables | |
160 ldb #BootMem number of bytes to clear | |
161 leax ,u point [X] to start of variables | |
162 ClrLoop clr ,x+ initialize a byte to 0 | |
163 decb done yet? | |
164 bne ClrLoop no, go clear another byte | |
165 lda #SelfTest WD 1002-05 internal diagnostic command | |
166 lbsr CmdUpdat go issue WD command, ensure everything is ready... | |
167 bcs ReadErr error, go report it... | |
168 lda #Restore!($0F&^HDStep) default to Restore with HD step rate | |
169 ldb <D.WDBtDr get boot drive number | |
170 cmpb #$03 hard drive? | |
171 blo SaveRstr yes, go save HD Restore command... | |
172 inc U.StSctr,u set start sector to 1 for floppy disks | |
173 lda #Restore!($0F&^FDStep) get Restore with FD step rate | |
174 SaveRstr sta U.Restor,u | |
175 leax SDHTable,pc | |
176 lda b,x get base SDH register | |
177 sta U.SDH,u save it... | |
178 * restore head to track 0 | |
179 lbsr SetupTF go update WD task files (except command) | |
180 lda U.Restor,u load WD restore command code | |
181 lbsr CmdUpdat go issue WD command | |
182 bcs ReadErr error, go report it... | |
183 * read cylinder 0, head 0, first sector | |
184 lbsr GetSctr go set up, issue read command | |
185 bcs ReadErr error, go report it... | |
186 bsr LSN0Info go get disk info from LSN0 | |
187 ldd U.BSZ,u get boot file size/cylinder offset number | |
188 bne ChkInfo must be boot file size, go check other LSN0 info... | |
189 ldd U.BT+1,u get offset cylinder number | |
190 beq ReadErr must not be boot disk, go report error... | |
191 cmpd #MaxCyls offset cylinder number OK? | |
192 bhs ReadErr no, go return error... | |
193 std U.CrtCyl,u save offset cylinder | |
194 * read offset cylinder, head 0, first sector | |
195 lbsr GetSctr go set up, issue read command | |
196 bcs ReadErr error, go exit... | |
197 lbsr LSN0Info go get disk info from offset LSN0 | |
198 ldd U.BSZ,u get boot file size | |
199 beq ReadErr must not be boot disk, go report error... | |
200 * check LSN0 info | |
201 ChkInfo ldd U.SPT,u get sectors per track | |
202 beq ReadErr 0 sectors per track, go return error | |
203 cmpd #MaxSctrs sectors per track OK? | |
204 bhi ReadErr no, go return error | |
205 lda U.Sides,u get disk sides (heads) | |
206 beq ReadErr 0 sides, go return error | |
207 cmpa #MaxHeads number of heads OK? | |
208 bhi ReadErr no, go return error | |
209 mul calculate sectors per cylinder | |
210 std U.SPC,u save sectors per cylinder | |
211 ldd U.BSZ,u get boot file size | |
212 addd #$00FF round up to even sector... | |
213 sta U.BSct,u save number of sectors in boot file | |
214 * calculate boot file start cylinder, head, & sector | |
215 ldd U.BT+1,u get boot file LSN LSBs | |
216 ldx U.CrtCyl,u get current (offset) cylinder number | |
217 CylLoop subd U.SPC,u subtract sectors/cylinder | |
218 blo ChkBtMSB [D] underflow, go check boot file LSN MSB | |
219 CylLoop0 leax 1,x increment current cylinder number | |
220 bne CylLoop no overflow, go do another subtraction | |
221 ReadErr ldb #E$Read | |
222 coma set Carry for error | |
223 leas BootMem,s restore stack pointer | |
224 rts | |
225 ChkBtMSB tst U.BT,u boot file LSN MSB = 0? | |
226 beq GotCyl yes, go determine head number | |
227 dec U.BT,u decrement boot file LSN MSB | |
228 bra CylLoop0 go on... | |
229 GotCyl addd U.SPC,u restore sector number | |
230 stx U.CrtCyl,u save current cylinder number | |
231 TrkLoop subd U.SPT,u subtract sectors/track | |
232 blo GotSide [D] underflow, go save current sector number | |
233 inc U.CrtSid,u increment current side number | |
234 bra TrkLoop go do another subtraction | |
235 GotSide addd U.SPT,u restore sector number | |
236 stb U.CrtSct,u save it | |
237 * request boot file memory | |
238 pshs u save data pointer | |
239 ldd U.BSZ,u get boot file size | |
240 os9 F$SRqMem | |
241 tfr u,x move start address into [X] | |
242 puls u recover data pointer | |
243 bcs BtExit0 go return F$SRqMem error | |
244 stx U.BtStrt,u save boot file start address | |
245 ldd U.CrtCyl,u get cylinder number | |
246 bra ChkCyl go check cylinder & get first sector | |
247 | |
248 * load boot file into memory | |
249 BootLoad inc U.CrtSct,u move on to next sector | |
250 lda U.SPT+1,u get sectors per track LSB (MSB is always 0) | |
251 cmpa U.CrtSct,u done track? | |
252 bhi LoadSctr no, go get sector | |
253 clr U.CrtSct,u reset current sector number to 0 | |
254 inc U.CrtSid,u move on to next side | |
255 lda U.CrtSid,u get side number | |
256 cmpa U.Sides,u done cylinder? | |
257 blo LoadSctr no, go get sector | |
258 clr U.CrtSid,u reset side number to 0 | |
259 ldd U.CrtCyl,u get cylinder number | |
260 addd #1 move on to next cylinder | |
261 std U.CrtCyl,u save cylinder number | |
262 ChkCyl cmpd #MaxCyls cylinder number OK? | |
263 bhs ReadErr no, go return error | |
264 LoadSctr bsr GetSctr go get current sector from WD 1002-05 | |
265 bcs ReadErr error, go exit | |
266 clrb transfer 256 bytes | |
267 stb PB,y set WD sector buffer address | |
268 ReadLoop lda WDData,y get byte from WD 1002-05 | |
269 sta ,x+ save byte to buffer | |
270 decb done yet? | |
271 bne ReadLoop no, go get another byte | |
272 dec U.BSct,u count down boot file sectors remaining | |
273 bne BootLoad | |
274 clrb clear carry | |
275 ldd U.BSZ,u get boot file size | |
276 ldx U.BtStrt,u get boot file start address | |
277 BtExit0 leas BootMem,s restore stack pointer | |
278 rts | |
279 | |
280 GetSctr bsr SetupTF go set up WD task files (except command) | |
281 lda #ReadSctr load WD read sector command code | |
282 CmdUpdat ldb #CmdReg load WD command register address | |
283 bsr TFUpdat go issue command... | |
284 BusyWait ldb #StatReg | |
285 stb PB,y set WD status register address | |
286 BusyW0 ldb WDData,y get WD 1002-05 status | |
287 bitb #%00000010 valid data? (WD 1002-05 powered & connected?) | |
288 bne BWErr no, go report error... | |
289 tstb ensure [CC] sign flag is current | |
290 bmi BusyW0 yes, go check again | |
291 ldb WDData,y get valid controller status | |
292 rorb rotate error bit into carry | |
293 bcc NoError | |
294 ldb #ErrReg | |
295 stb PB,y set WD error register address | |
296 ldb WDData,y get error register contents | |
297 bne BWErr | |
298 NoError clrb | |
299 rts | |
300 BWErr comb error, set [CC] Carry... | |
301 rts | |
302 | |
303 SetupTF ldd #$01*256+SctrCnt single sector commands only | |
304 bsr TFUpdat | |
305 lda U.CrtCyl,u get current cylinder number MSB | |
306 ldb #CylHigh | |
307 bsr TFUpdat | |
308 lda U.CrtCyl+1,u get current cylinder number LSB | |
309 ldb #CylLow | |
310 bsr TFUpdat | |
311 lda U.CrtSct,u get current sector number | |
312 adda U.StSctr,u add offset... | |
313 ldb #SctrReg | |
314 bsr TFUpdat | |
315 clrb default extended head disabled | |
316 lda U.CrtSid,u get current side (head) number | |
317 cmpa #$08 extended head? | |
318 blo StdHead no, go on... | |
319 incb set enable code | |
320 anda #$07 mask out all but standard head number | |
321 StdHead stb PA,y set extended head enable/disable | |
322 ora U.SDH,u mask in base SDH copy | |
323 ldb #SDHReg | |
324 TfUpdat stb PB,y set WD register address | |
325 sta WDData,y write data to WD 1002-05 | |
326 rts | |
327 | |
328 * pad Boot module out to $01D0 exactly | |
459
3e3f1f79ba00
Sources now use 'fill' pseudo-op to fill out for L2 modules
boisy
parents:
392
diff
changeset
|
329 Pad fill $39,$1D0-3-* |
45 | 330 |
331 emod | |
332 BEnd equ * | |
333 end | |
334 |