45
|
1 ********************************************************************
|
|
2 * Boot - WD1002-05 boot module
|
|
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
|
|
15 ttl WD1002-05 boot module
|
|
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
|
|
329 fcb $39,$39,$39,$39,$39,$39,$39,$39
|
|
330 fcb $39,$39,$39,$39,$39,$39,$39,$39
|
|
331
|
|
332 emod
|
|
333 BEnd equ *
|
|
334 end
|
|
335
|