|
|
1.1 root 1: ////////
2: /
3: / Display XT/AT Disk Parameter Bootblock.
4: / Copy to a boot block on hard disk partition, then reboot to display info.
5: /
6: ////////
7:
8: NSTK = 256 / # of bytes of stack.
9: CR = 0x0D / CR character.
10: LF = 0x0A / LF character.
11: BOOTLC = 0x7C00 / Boot location (ROM).
12: BOOTS = 0 / boot segment (ROM).
13: RBOOTS = 0x2060 / Relocated boot segment.
14: BSHIFT = 9 / Shift, bytes to blocks.
15: BUFSIZE = 512 / Block size.
16: BUFMSK2 = 0x00FF / Block [word] mask, for reads.
17: DISK = 0x13 / Disk Interrupt
18: KEYBD = 0x16 / Keyboard Interrupt
19: READ1 = 0x0201 / read one sector
20: JMPF = 0xEA / Jump far, direct.
21: FIRST = 8 / relative start of partition
22:
23: ////////
24: /
25: /
26: ////////
27:
28: .blkb 0x0100 / PC-DOS base page.
29: entry:
30: mov ax, es
31: mov ds, ax
32:
33: restart:
34: call login / print signon message
35: ///
36: xorb bl, bl / zero the drive count
37: 2:
38: movb drive, bl
39: movb dl, $0x80 / get drive number
40: addb dl, bl
41: movb ah, $8 / get drive parameters
42: push bx
43: int DISK
44:
45: push dx
46: movb al, ch / fetch cyl(lo)
47: movb ah, cl / move cyl(hi), sects
48: rolb ah, $1 / shift cylinder high to
49: rolb ah, $1 / the least sig bits
50: andb ah, $3 / mask out cylinder bits
51: inc ax
52: mov cyls, ax
53:
54: movb al, $0x3F / sector mask
55: andb al,cl / mask sector
56: movb sects, al
57:
58: incb dh / change to # of heads
59: movb heads, dh
60: ///
61: mov si, $msgdrive
62: call print
63: sub ax, ax
64: movb al, drive
65: call putu
66: mov si, $msgcyls
67: call print
68: mov ax, cyls
69: call putu
70: mov si, $msgheads
71: call print
72: sub ax, ax
73: movb al, heads
74: call putu
75: mov si, $msgsects
76: call print
77: sub ax, ax
78: movb al, sects
79: call putu
80:
81: mov si, $crlf
82: call print
83:
84: pop dx / recall # of drives in dl
85: pop bx / recall # of previous drive in bl
86: incb bl
87: cmpb bl, dl / more drives to check?
88: jb 2b
89: 0:
90: movb al, $'? / set prompt
91: call putc
92:
93: movb ah, $0 / Get ASCII opcode.
94: int KEYBD / Read keyboard ROM call.
95:
96: mov si, $crlf / Echo LF followed by CR.
97: call print
98:
99: int 0x19 / reboot, in real mode
100:
101: ////////
102: /
103: / Print signon message
104: /
105: ////////
106:
107: login: mov si, $msg00 / point si to message
108:
109: print: movb al, (si)
110: inc si
111: orb al, al /
112: je 0f
113: call putc / Type it and
114: jne print / go back for more.
115: 0: ret
116:
117: ////////
118: /
119: / Write the character in "al" out to
120: / the display, using routines in the ROM.
121: / Like most calls to the ROM, this routine spends
122: / most of its time saving and restoring the
123: / registers.
124: /
125: / Note: The ZF in the PSW word must be preserved.
126: /
127: ////////
128:
129: putc: push si / Save registers.
130: push di
131: push bp
132: pushf
133:
134: cmpb lz, $1 / zero suppress?
135: jne 2f / skip if not
136: cmpb al, $'0
137: je 3f / skip if we're suppressing a zero now
138: movb lz, $0 / else turn off zero suppression and print char
139: 2:
140: mov bx, $0x0007 / Page 0, white on black
141: movb ah, $0x0E / Write TTY.
142: int 0x10 / Call video I/O in ROM.
143: 3:
144: popf
145: pop bp / Restore registers.
146: pop di
147: pop si
148: return: ret / Return
149:
150: ////////
151: /
152: / Output the unsigned integer in AX.
153: /
154: ////////
155:
156: putu: / putu( i )
157: push si / int i;
158: push di /
159: push bp /
160:
161: sub dx, dx /
162: movb lz, $1 / suppress leading zeroes
163: mov bx, $10000 /
164: div bx /
165: push dx /
166: addb al, $'0 /
167: call putc /
168: pop ax /
169:
170: sub dx, dx /
171: mov bx, $1000 /
172: div bx /
173: push dx /
174: addb al, $'0 /
175: call putc /
176: pop ax /
177:
178: sub dx, dx /
179: mov bx, $100 /
180: div bx /
181: push dx /
182: addb al, $'0 /
183: call putc /
184: pop ax /
185:
186: sub dx, dx /
187: mov bx, $10 /
188: div bx /
189: push dx /
190: addb al, $'0 /
191: call putc /
192: pop ax /
193:
194: movb lz, $0 / don't suppress final leading zero
195: addb al, $'0 /
196: call putc /
197:
198: pop bp /
199: pop di
200: pop si
201: ret
202:
203: ////////
204: /
205: / Data. There is some pure data in
206: / the "prvd" segment. This data is moved to the
207: / new memory when the boot is relocated. All buffers
208: / are in the BSS, and are not actually moved, or even
209: / saved in the boot block.
210: /
211: ////////
212:
213: NHD = 1
214: NSPT = 9
215: NTRK = 40
216:
217: .prvd
218:
219: cyls: .word 0
220: sects: .byte 0
221: heads: .byte 0
222:
223: drive: .byte 0
224: first: .word 0
225: .word 0
226:
227: lz: .byte 0 / nonzero if we are doing zero suppression
228:
229: msgdrive:.ascii "Drive "
230: .byte 0
231: msgheads:.ascii " Heads="
232: .byte 0
233: msgcyls:.ascii ": Cylinders="
234: .byte 0
235: msgsects:.ascii " Sectors per track="
236: .byte 0
237: msg00:
238: .byte CR, LF
239: .ascii "Here are the BIOS parameters for your hard drive(s)."
240: .byte CR, LF
241: .ascii "Write them down for use during installation."
242: .byte CR, LF
243: .ascii "Then press <Enter> to reboot."
244: .byte CR, LF
245: crlf: .byte CR, LF
246: .byte 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.