|
|
1.1 root 1: / (lgl-
2: / COHERENT Driver Kit Version 1.1.0
3: / Copyright (c) 1982, 1990 by Mark Williams Company.
4: / All rights reserved. May not be copied without permission.
5: / -lgl)
6: ////////
7: /
8: / PS Hard Disk Assembler Support
9:
10:
11: .globl com_data_, fcn_trn0_, fcn_trn1_,fcn_trn2_,fcn_trn15_
12: .globl i0_, i1_, i2_, i15_, end_table_
13:
14: .shri
15:
16: .globl iresult_, mlkh_
17: iresult_:
18: mov ax,cs:mlkh_
19: ret
20:
21: mlkh_: .word 0x1234
22:
23: .blkb 15
24: extram: .blkb 15
25:
26: .blkb 15
27: com_data_:
28: .blkb 0x80
29: fcn_trn0_:
30: .blkb 0xb0 ; .blkb 0x10
31: dev_blk0_:
32: .blkb 0xb0 ; .blkb 0x10
33: fcn_trn1_:
34: .blkb 0xb0 ; .blkb 0x50
35: dev_blk1_:
36: .blkb 0xb0 ; .blkb 0x56
37: fcn_trn2_:
38: .blkb 0xb0 ; .blkb 0x40
39: dev_blk2_:
40: .blkb 0xf0 ; .blkb 0x96
41: fcn_trn15_:
42: .blkb 0xb0 ; .blkb 0x58
43: dev_blk15_:
44: .blkb 0xb0 ; .blkb 0x2e
45: end_table_:
46:
47: i0_: .word 0
48: i1_: .word 0
49: i2_: .word 0
50: i15_: .word 0
51:
52: sp_: .blkw 0x24
53: it_: .blkw 576 /This gives room for 24 items
54:
55:
56: .globl iabios_r_
57: iabios_r_:
58: mov ax,cs
59: mov ds,ax
60: mov es,ax
61:
62: mov di,$sp_ / Destination for the system parameter table
63: call build_sys_p
64: cmp ax,0
65: jne 3f / Quit on an error
66:
67: mov di,$it_ / Destination for the Initialization tables
68: call build_itab
69: cmp ax,0
70: jne 3f / Quit on an error
71:
72: mov si,0
73: movb cl,$24
74: 0:
75: mov ax, si
76: cmp ax, sp_+30
77: jge 2f
78:
79: imulb cl
80: mov di, ax
81: add di,$it_
82:
83: cmp (di), $0
84: jne 1f
85: mov i0_, di
86: 1:
87: cmp (di), $1
88: jne 1f
89: mov i1_, di
90: 1:
91: cmp (di), $2
92: jne 1f
93: mov i2_, di
94: 1:
95: cmp (di), $15
96: jne 1f
97: mov i15_, di
98: 1:
99: inc si
100: jmp 0b
101: 2:
102: call init_dev
103: 3:
104: mov cs:mlkh_, ax
105: ret
106:
107:
108: build_sys_p:
109: push ds
110:
111: xor ax,ax / Set Ds to 0, meaning that there are no Ram
112: mov ds,ax / extentions to be loaded
113: movb ah,$4
114: int 0x15 / Bios call to build the System parameter table
115:
116: jc 1f / Error?
117:
118: xor ax,ax / No error
119:
120: 0: pop ds / Restore registers and return
121: ret
122:
123: 1: mov ax,$0xffff / Return that an error has occured
124: jmp 0b
125:
126:
127:
128: build_itab:
129: push ds
130:
131: mov ax,$extram / Set up extram so that it starts at the
132: shr ax,$4 / begining of a segment. This is becuase
133: mov bx,ds / the Cbios is expecting a pointer of the
134: add ax,bx / sort DS:0
135: mov ds,ax
136: mov 0,$0xaa55 / Extram header value.
137: movb ah,$5
138: int 0x15 / Cbios call to build init table
139:
140: jc 1f / Error?
141:
142: xor ax,ax / No error
143:
144: 0: pop ds / Restore registers and return
145: ret
146:
147: 1: mov ax,$0xfffe / Return that an error has occured
148: jmp 0b
149:
150:
151: init_dev:
152: mov ax,$com_data_/ Set up com_data so that it starts at the
153: shr ax,$4 / begining of a segment. This is becuase
154: mov dx,ds / the Cbios is expecting a pointer of the
155: add ax,dx / sort DS:0 for the Common data table
156: mov ds,ax
157:
158: mov 0,$64 / Pointer to pointer 0. Note that as we add
159: / devices to the system, this will move
160: / farther down by 8 for every db/ftt pair
161: / and 6 for every data pointer.
162:
163: mov 2,$6 / Number of pointer pairs in the table
164: mov 8,$0 / Dummy dev blk and fcn tbl pntr for Id 1
165: mov 10,$0 / This is required for initialization
166: mov 12,$0 / Remember only to have one for Id 1. This
167: mov 14,$0 / Fails if you also have one for Id 0.
168: mov 16,$dev_blk0_ /\
169: mov 18,dx / \
170: mov 20,$fcn_trn0_ / \
171: mov 22,dx / |
172: mov 24,$dev_blk1_ / |
173: mov 26,dx / |
174: mov 28,$fcn_trn1_ / | long ptrs to the device blocks and
175: mov 30,dx / | the function transfer tables for
176: mov 32,$dev_blk15_ / | devs 0, 1, 15, 2
177: mov 34,dx / |
178: mov 36,$fcn_trn15_ / |
179: mov 38,dx / |
180: mov 40,$dev_blk2_ / |
181: mov 42,dx / |
182: mov 44,$fcn_trn2_ / /
183: mov 46,dx / /
184:
185: / At this point we should initialize the pointer
186: / part of the table, but since these values
187: / are already 0, we can skip it.
188:
189:
190: mov bx, cs:i0_ / Initialize the internal functions
191: mov cx,$1
192: mov dx,$0x2 / Logical device 2
193:
194: .word 0xff26, 0x065f / calll es:(bx+6)
195:
196: cmpb al,$0 / Was there an error?
197: jne 0f
198:
199: mov bx, cs:i1_ / Initialize the diskette
200: mov cx,$1
201: mov dx,$3 / Logical device 3
202:
203: .word 0xff26, 0x065f / calll es:(bx+6)
204:
205: cmpb al,$0 / Was there an error?
206: jne 0f
207:
208: mov bx, cs:i15_ / Initialize the DMA
209: mov cx,$1
210: mov dx,$4 / Logical device 5
211:
212: .word 0xff26, 0x065f / calll es:(bx+6)
213:
214: cmpb al,$0 / Was there an error?
215: jne 0f
216:
217: mov bx, cs:i2_ / Initialize the hard disk
218: mov cx,$1
219: mov dx,$5 / Logical device 6
220:
221: .word 0xff26, 0x065f / calll es:(bx+6)
222:
223: cmpb al,$0 / Was there an Error?
224: je 1f
225:
226: 0: mov ax,$0xfffd / Inform caller that we could not init
227: 1: ret
228:
229:
230: .globl d2_func_, com_data_p_, fcn2_, fcn2p_, dev2p_
231: d2_func_:
232: push bp
233: mov bp,sp
234:
235: push com_data_p_+2 / save the anchor pointer segment
236:
237: push sds_ / Save the request block segment
238: push 4(bp) / Save the request block offset
239:
240: push fcn2p_+2 / Save the Function transfer table Segment
241: push fcn2p_ / Save the Function transfer table Offset
242:
243: push dev2p_+2 / Save the device block Segment
244: push dev2p_ / Save the device block Offset
245:
246: mov bx,6(bp) / Bx points to start, interrupt or time-out
247: .word 0x9fff,fcn2_ / Call far (bx + fcn2_)
248: 1:
249: add sp,$0xe / Clean up the stack
250:
251: pop bp
252: ret
253:
254:
255:
256: .globl d1_func_, fcn1_, fcn1p_, dev1p_
257: d1_func_:
258: push bp
259: mov bp,sp
260:
261: push com_data_p_+2 / save the anchor pointer segment
262:
263: push sds_ / Save the request block segment
264: push 4(bp) / Save the request block offset
265:
266: push fcn1p_+2 / Save the Function transfer table Segment
267: push fcn1p_ / Save the Function transfer table Offset
268:
269: push dev1p_+2 / Save the device block Segment
270: push dev1p_ / Save the device block Offset
271:
272: mov bx,6(bp) / Bx points to start, interrupt or time-out
273: .word 0x9fff,fcn1_ / Call far (bx + fcn2_)
274: 1:
275: add sp,$0xe / Clean up the stack
276:
277: pop bp
278: ret
279:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.