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