]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/pbs.s
dont put plan9.ini bootimage in cd root
[plan9front.git] / sys / src / boot / pc / pbs.s
1 #include "x16.h"
2 #include "mem.h"
3
4 #define RELOC 0x7c00
5
6 TEXT _magic(SB), $0
7         BYTE $0xEB; BYTE $0x3C;         /* jmp .+ 0x3C  (_start0x3E) */
8         BYTE $0x90                      /* nop */
9 TEXT _version(SB), $0
10         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
11         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
12 TEXT _sectsize(SB), $0
13         BYTE $0x00; BYTE $0x00
14 TEXT _clustsize(SB), $0
15         BYTE $0x00
16 TEXT _nresrv(SB), $0
17         BYTE $0x00; BYTE $0x00
18 TEXT _nfats(SB), $0
19         BYTE $0x00
20 TEXT _rootsize(SB), $0
21         BYTE $0x00; BYTE $0x00
22 TEXT _volsize(SB), $0
23         BYTE $0x00; BYTE $0x00
24 TEXT _mediadesc(SB), $0
25         BYTE $0x00
26 TEXT _fatsize(SB), $0
27         BYTE $0x00; BYTE $0x00
28 TEXT _trksize(SB), $0
29         BYTE $0x00; BYTE $0x00
30 TEXT _nheads(SB), $0
31         BYTE $0x00; BYTE $0x00
32 TEXT _nhiddenlo(SB), $0
33         BYTE $0x00; BYTE $0x00
34 TEXT _nhiddenhi(SB), $0
35         BYTE $0x00; BYTE $0x00;
36 TEXT _bigvolsize(SB), $0
37         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
38 TEXT _driveno(SB), $0
39         BYTE $0x00
40 TEXT _reserved0(SB), $0
41         BYTE $0x00
42 TEXT _bootsig(SB), $0
43         BYTE $0x00
44 TEXT _volid(SB), $0
45         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
46 TEXT _label(SB), $0
47         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
48         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
49         BYTE $0x00; BYTE $0x00; BYTE $0x00
50 TEXT _type(SB), $0
51         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
52         BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
53
54 _start0x3E:
55         CLI
56         CLR(rAX)
57         MTSR(rAX, rSS)                  /* 0000 -> rSS */
58         MTSR(rAX, rDS)                  /* 0000 -> rDS, source segment */
59         MTSR(rAX, rES)
60
61         LWI(0x100, rCX)
62         LWI(RELOC, rSI)
63         MW(rSI, rSP)
64         LWI(_magic(SB), rDI)
65         CLD
66         REP; MOVSL                      /* MOV DS:[(E)SI] -> ES:[(E)DI] */
67
68         PUSHA
69         MW(rSP, rBP)
70
71         PUSHR(rCX)
72         PUSHI(start16(SB))
73         BYTE $0xCB                      /* FAR RET */
74
75 TEXT halt(SB), $0
76 _halt:
77         JMP _halt
78
79 TEXT start16(SB), $0
80         STI
81         LWI(hello(SB), rSI)
82         CALL16(print16(SB))
83         LWI(crnl(SB), rSI)
84         CALL16(print16(SB))
85         LW(_volid(SB), rAX)             /* Xrootlo */
86         LW(_volid+2(SB), rBX)           /* Xroothi */
87         PUSHR(rBP)
88         LW(_sectsize(SB), rCX)
89         SUB(rCX, rSP)
90         MW(rSP, rBP)
91         MW(rSP, rSI)
92
93 _nextsect:
94         PUSHR(rAX)
95         CALL16(readsect16(SB))
96         OR(rAX, rAX)
97         JNE _halt
98
99         LW(_sectsize(SB), rCX)
100         SHRI(5, rCX)
101
102 _nextdir:
103         PUSHR(rCX)
104         PUSHR(rSI)                      /* save for later if it matches */
105         LWI(bootname(SB), rDI)
106         LW(bootnamelen(SB), rCX)
107         CLD
108         REP
109         CMPSB
110         POPR(rSI)
111         POPR(rCX)
112         JEQ _found
113         ADDI(0x20, rSI) 
114         LOOP _nextdir
115         POPR(rAX)
116         ADDI(1, rAX)
117         ADC(rCX, rBX)
118         JMP _nextsect
119
120 _found:
121         PUSHR(rDX)
122
123         CLR(rBX)
124
125         LW(_rootsize(SB), rAX)          /* calculate and save Xrootsz */
126         LWI(0x20, rCX)
127         MUL(rCX)
128         LW(_sectsize(SB), rCX)
129         PUSHR(rCX)
130         DEC(rCX)
131         ADD(rCX, rAX)
132         ADC(rBX, rDX)
133         POPR(rCX)                       /* _sectsize(SB) */
134         DIV(rCX)
135         PUSHR(rAX)                      /* Xrootsz */
136
137         LXW(0x1a, xSI, rAX)             /* starting sector address */
138         DEC(rAX)                        /* that's just the way it is */
139         DEC(rAX)
140         LB(_clustsize(SB), rCL)
141         CLRB(rCH)
142         MUL(rCX)
143         LW(_volid(SB), rCX)             /* Xrootlo */
144         ADD(rCX, rAX)
145         LW(_volid+2(SB), rCX)           /* Xroothi */
146         ADC(rCX, rDX)
147         POPR(rCX)                       /* Xrootsz */
148         ADD(rCX, rAX)
149         ADC(rBX, rDX)
150
151         PUSHR(rAX)                      /* calculate how many sectors to read */
152         PUSHR(rDX)
153         LXW(0x1c, xSI, rAX)
154         LXW(0x1e, xSI, rDX)
155         LW(_sectsize(SB), rCX)
156         PUSHR(rCX)
157         DEC(rCX)
158         ADD(rCX, rAX)
159         ADC(rBX, rDX)
160         POPR(rCX)                       /* _sectsize(SB) */
161         DIV(rCX)
162         MW(rAX, rCX)
163         POPR(rBX)
164         POPR(rAX)
165         POPR(rDX)
166
167         LWI(RELOC, rSI)
168         PUSHR(rSI)
169
170 _loadnext:
171         PUSHR(rCX)
172         PUSHR(rAX)
173         CALL16(readsect16(SB))
174         OR(rAX, rAX)
175         JNE _loaderror
176         POPR(rAX)
177         CLR(rCX)
178         ADDI(1, rAX)
179         ADC(rCX, rBX)
180         LW(_sectsize(SB), rCX)
181         ADD(rCX, rSI)
182         POPR(rCX)
183         LOOP _loadnext
184         CLI
185         RET
186
187 _loaderror:
188         LWI(ioerror(SB), rSI)
189         CALL16(print16(SB))
190         CALL16(halt(SB))
191
192 TEXT print16(SB), $0
193         PUSHA
194         CLR(rBX)
195 _printnext:
196         LODSB
197         ORB(rAL, rAL)
198         JEQ _printret
199         LBI(0x0E, rAH)
200         BIOSCALL(0x10)
201         JMP _printnext
202 _printret:
203         POPA
204         RET
205
206 /*
207  * in:
208  *      DL drive
209  *      AX:BX lba32,
210  *      0000:SI buffer
211  */
212 TEXT readsect16(SB), $0
213         PUSHA
214         CLR(rCX)
215
216         PUSHR(rCX)              /* qword lba */
217         PUSHR(rCX)
218         PUSHR(rBX)
219         PUSHR(rAX)
220
221         PUSHR(rCX)              /* dword buffer */
222         PUSHR(rSI)
223
224         INC(rCX)
225         PUSHR(rCX)              /* word # of sectors */
226
227         PUSHI(0x0010)           /* byte reserved, byte packet size */
228
229         MW(rSP, rSI)
230         LWI(0x4200, rAX)
231         BIOSCALL(0x13)
232         JCC _readok
233         ADDI(0x10, rSP)
234         POPA
235         CLR(rAX)
236         DEC(rAX)
237         RET
238 _readok:
239         ADDI(0x10, rSP)
240         POPA
241         CLR(rAX)
242         RET
243
244 TEXT bootnamelen(SB), $0
245         WORD $8
246 TEXT bootname(SB), $0
247         BYTE $'9'; BYTE $'B'; BYTE $'O'; BYTE $'O';
248         BYTE $'T'; BYTE $'F'; BYTE $'A'; BYTE $'T';
249         BYTE $0
250
251 TEXT ioerror(SB), $0
252         BYTE $'i'; BYTE $'/'; BYTE $'o'; BYTE $'-';
253         BYTE $'e'; BYTE $'r'; BYTE $'r'; BYTE $0
254
255 TEXT hello(SB), $0
256         BYTE $'p'; BYTE $'b'; BYTE $'s'; BYTE $0
257
258 TEXT crnl(SB), $0
259         BYTE $'\r'; BYTE $'\n'; BYTE $0