OSDN Git Service

実行ファイルを2つに分けたいけど分けられず
[haribote-os-xe/hariboteXE.git] / asmhead.pas
1 unit asmhead;
2
3 interface
4
5 type
6   TAsmhead = class
7   private
8     procedure resb(count: integer); virtual;
9     procedure align16; virtual;
10     procedure Init;
11     procedure Boot;
12   public
13     constructor Create;
14   end;
15
16 procedure io_halt;
17 procedure io_cli;
18 procedure io_sti;
19 procedure io_stihlt;
20 function io_in8(port: integer): integer;
21 function io_in16(port: integer): integer;
22 function io_in32(port: integer): integer;
23 procedure io_out8(port, data: integer);
24 procedure io_out16(port, data: integer);
25 procedure io_out32(port, data: integer);
26 function io_load_eflags: integer;
27 procedure io_store_eflags(eflags: integer);
28 procedure load_gdtr(limit, addr: integer);
29 procedure load_idtr(limit, addr: integer);
30 function load_cr0: integer;
31 procedure store_cr0(cr0: integer);
32
33 implementation
34
35 procedure io_halt;
36 asm
37   HLT;
38   RET;
39 end;
40
41 procedure io_cli;
42 asm
43   CLI;
44   RET;
45 end;
46
47 procedure io_sti;
48 asm
49   STI;
50   RET;
51 end;
52
53 procedure io_stihlt;
54 asm
55   STI;
56   HLT;
57   RET;
58 end;
59
60 function io_in8(port: integer): integer;
61 asm
62   MOV   EDX,[ESP+4];
63   MOV   EAX,0;
64   IN    AL,DX;
65   RET;
66 end;
67
68 function io_in16(port: integer): integer;
69 asm
70   MOV   EDX,[ESP+4];
71   MOV   EAX,0;
72   IN    AX,DX;
73   RET;
74 end;
75
76 function io_in32(port: integer): integer;
77 asm
78   MOV   EDX,[ESP+4];
79   IN    EAX,DX;
80   RET;
81 end;
82
83 procedure io_out8(port, data: integer);
84 asm
85   MOV   EDX,[ESP+4];
86   MOV   AL,[ESP+8];
87   OUT   DX,AL;
88   RET;
89 end;
90
91 procedure io_out16(port, data: integer);
92 asm
93   MOV   EDX,[ESP+4];
94   MOV   EAX,[ESP+8];
95   OUT   DX,AX;
96   RET;
97 end;
98
99 procedure io_out32(port, data: integer);
100 asm
101   MOV   EDX,[ESP+4];
102   MOV   EAX,[ESP+8];
103   OUT   DX,EAX;
104   RET;
105 end;
106
107 function io_load_eflags: integer;
108 asm
109   PUSHFD;
110   POP   EAX;
111   RET;
112 end;
113
114 procedure io_store_eflags(eflags: integer);
115 asm
116   MOV   EAX,[ESP+4];
117   PUSH  EAX;
118   POPFD;
119   RET;
120 end;
121
122 procedure load_gdtr(limit, addr: integer);
123 asm
124   MOV   AX,[ESP+4];
125   MOV   [ESP+6],AX;
126   LGDT  [ESP+6];
127   RET;
128 end;
129
130 procedure load_idtr(limit, addr: integer);
131 asm
132   MOV   AX,[ESP+4];
133   MOV   [ESP+6],AX;
134   LIDT  [ESP+6];
135   RET;
136 end;
137
138 function load_cr0: integer;
139 asm
140   MOV   EAX,CR0
141   RET;
142 end;
143
144 procedure store_cr0(cr0: integer);
145 asm
146   MOV   EAX,[ESP+4];
147   MOV   CR0,EAX;
148   RET;
149 end;
150
151 { TAsmhead }
152
153 procedure TAsmhead.resb(count: integer);
154 asm
155   MOV   ECX,count
156 @start:
157   DB    $00
158   LOOP  @start
159   RET
160 end;
161
162 procedure TAsmhead.align16;
163 asm
164   MOV   EBX,ESP
165   AND   EBX,$00000001
166   MOV   EAX,Self
167   MOV   EDX,[EAX]
168   CALL  [EDX + VMTOFFSET TAsmhead.resb(EBX)]
169   RET
170 end;
171
172 procedure TAsmhead.Boot;
173 const
174   VBEMODE: UInt16 = $105;
175
176   BOTPAK: UInt32 = $00280000;
177   DSKCAC: UInt32 = $00100000;
178   DSKCAC0: UInt32 = $00008000;
179
180   CYLS: UInt16 = $0FF0;
181   LEDS: UInt16 = $0FF1;
182   VMODE: UInt16 = $0FF2;
183   SCRNX: UInt16 = $0FF4;
184   SCRNY: UInt16 = $0FF6;
185   VRAM: UInt16 = $0FF8;
186   asm
187     MOV   EBP,$00c200
188
189     MOV   AX,$9000
190     MOV   ES,AX
191     MOV   DI,0
192     INT   $10
193     CMP   AX,$004f
194     JNE   @scrn320
195
196     MOV   AX,[ES:DI+4]
197     CMP   AX,$0200
198     JB    @scrn320
199
200     MOV   CX,VBEMODE
201     MOV   AX,$4f01
202     INT   $10
203     CMP   BYTE PTR [ES:DI+$1b],4
204     JNE   @scrn320
205     MOV   AX,[ES:DI+$00]
206     AND   AX,$0080
207     JZ    @scrn320
208
209     MOV   BX,VBEMODE+$4000
210     MOV   AX,$4f02
211     INT   $10
212     MOV   BYTE PTR [VMODE],8
213     MOV   AX,[ES:DI+$12]
214     MOV   [SCRNX],AX
215     MOV   EAX,[ES:DI+$28]
216     MOV   [VRAM],AX
217     JMP   @keystatus
218
219   @scrn320:
220     MOV   AL,$13
221     MOV   AH,$00
222     INT   $10
223     MOV   BYTE PTR [VMODE],8
224     MOV   WORD PTR [SCRNX],320
225     MOV   WORD PTR [SCRNY],200
226     MOV   DWORD PTR [VRAM],$000a0000
227
228   @keystatus:
229     MOV   AH,$02
230     INT   $16
231     MOV   BYTE PTR [LEDS],AL
232
233     MOV   AL,$ff
234     OUT   $21,AL
235     NOP
236     OUT   $a1,AL
237
238     CLI
239
240     CALL  @waitkbdout
241
242     MOV   AL,$d1
243     OUT   $64,AL
244     CALL  @waitkbdout
245     MOV   AL,$df
246     OUT   $60,AL
247     CALL  @waitkbdout
248
249     LGDT  [@GDTR0]
250     MOV   EAX,CR0
251     AND   EAX,$7FFFFFFF
252     OR    EAX,$00000001
253     MOV   CR0,EAX
254     JMP   @pipelineflush
255
256   @pipelineflush:
257     MOV   AX,1*8
258     MOV   DS,AX
259     MOV   ES,AX
260     MOV   FS,AX
261     MOV   GS,AX
262     MOV   SS,AX
263
264     MOV   ESI,DWORD PTR @bootpack
265     MOV   EDI,BOTPAK
266     MOV   ECX,512*1024/4
267     CALL  @memcpy
268
269     MOV   ESI,$7C00
270     MOV   EDI,DSKCAC
271     MOV   ECX,512/4
272     CALL  @memcpy
273
274     MOV   ESI,DSKCAC0+512
275     MOV   EDI,DSKCAC+512
276     MOV   ECX,0
277     MOV   CL,BYTE PTR [CYLS]
278     IMUL  ECX,512*18*2/4
279     SUB   ECX,512/4
280     CALL  @memcpy
281
282     MOV   EBX,BOTPAK
283     MOV   ECX,[EBX+16]
284     ADD   ECX,3
285     SHR   ECX,2
286     JZ    @skip
287     MOV   ESI,[EBX+20]
288     ADD   ESI,EBX
289     MOV   EDI,[EBX+12]
290     CALL  @memcpy
291
292   @skip:
293     MOV   ESP,[EBX+12]
294     MOV   EAX,2*8 SHL 1
295     INC   EAX
296     JMP   EAX
297
298   @waitkbdout:
299     IN    AL,$64
300     AND   AL,$02
301     JNZ   @waitkbdout
302     RET
303   @memcpy:
304     MOV   EAX,[ESI]
305     ADD   ESI,4
306     MOV   EDI,[EAX]
307     ADD   EDI,4
308     LOOP  @memcpy
309     RET
310
311     MOV   EAX,Self
312     MOV   EDX,[EAX]
313     CALL  DWORD PTR [EDX + VMTOFFSET TAsmhead.align16]
314   @GDT0:
315     MOV   EAX,Self
316     MOV   EDX,[EAX]
317     CALL  DWORD PTR [EDX + VMTOFFSET TAsmhead.resb(8)]
318     DW    $ffff,$0000,$9200,$00cf
319     DW    $ffff,$0000,$9a28,$0047
320
321     DW    0
322   @GDTR0:
323     DW    8*3-1
324     DD    @GDT0
325
326     MOV   EAX,Self
327     MOV   EDX,[EAX]
328     CALL  DWORD PTR [EDX + VMTOFFSET TAsmhead.align16]
329   @bootpack:
330 end;
331
332 constructor TAsmhead.Create;
333 begin
334   inherited;
335   Init;
336   Boot;
337 end;
338
339 procedure TAsmhead.Init;
340 const
341   CYLS: UInt8 = 10;
342   asm
343     MOV   EBP,$007c00
344     JMP   @entry
345     DB    $90
346     DB    'HARIBOTE'
347     DW    512
348     DB    1
349     DW    1
350     DB    2
351     DW    224
352     DW    2880
353     DB    $f0
354     DW    9
355     DW    18
356     DW    2
357     DD    0
358     DD    2880
359     DB    0,0,$29
360     DD    $ffffffff
361     DB    'HARIBOTEOS '
362     DB    'FAT12   '
363     MOV   EAX,Self
364     MOV   EDX,[EAX]
365     CALL  DWORD PTR [EDX + VMTOFFSET TAsmhead.resb(18)]
366   @entry:
367     MOV   AX,0
368     MOV   SS,AX
369     MOV   SP,$7c00
370     MOV   DS,AX
371
372     MOV   AX,$0820
373     MOV   ES,AX
374     MOV   CH,0
375     MOV   DH,0
376     MOV   CL,2
377   @readloop:
378     MOV   SI,0
379   @retry:
380     MOV   AH,$02
381     MOV   AL,1
382     MOV   BX,0
383     MOV   DL,$00
384     INT   $13
385     JNC   @next
386     ADD   SI,1
387     CMP   SI,5
388     JAE   @error
389     MOV   AH,$00
390     MOV   DL,$00
391     INT   $13
392     JMP   @retry
393   @next:
394     MOV   AX,ES
395     ADD   AX,$0020
396     MOV   ES,AX
397     ADD   CL,1
398     CMP   CL,18
399     JBE   @readloop
400     MOV   CL,1
401     ADD   DH,1
402     CMP   DH,2
403     JB    @readloop
404     MOV   DH,0
405     ADD   CH,1
406     CMP   CH,CYLS
407     JB    @readloop
408
409     MOV   [$0ff0],CH
410     MOV   EAX,$00c200
411     JMP   EAX
412   @error:
413     MOV   SI,WORD PTR @msg
414   @putloop:
415     MOV   AL,[SI]
416     ADD   SI,1
417     CMP   AL,0
418     JE    @fin
419     MOV   AH,$0e
420     MOV   BX,15
421     INT   $10
422     JMP   @putloop
423   @fin:
424     HLT
425     JMP   @fin
426   @msg:
427     DB    $0a,$0a
428     DB    'load error'
429     DB    $0a
430     DB    0
431     MOV   EAX,$7dfe
432     SUB   EAX,ESP
433     MOV   EBX,EAX
434     MOV   EAX,Self
435     MOV   EDX,[EAX]
436     CALL  DWORD PTR [EDX + VMTOFFSET TAsmhead.resb(EBX)]
437     DB    $55,$AA
438 end;
439
440 end.