; haribote-ipl
; TAB=4
; 03_days\harib00g ipl10.nas
;读取10个柱面
CYLS EQU 10 ;读取10个柱面
ORG 0x7c00
;以下的标记用于标准的FAT12格式软盘专用的代码
JMP entry
DB 0x90
DB "HARIBOTE" ; 启动区的名称
DW 512 ;扇区(sector)大小512字节
DB 1 ;簇的大小(必须为1扇区)
DW 1 ;FAT的起始位置(一般从第一扇区开始)
DB 2 ;FAT的个数(必须为2)
DW 224 ;根目录的大小(一般设置成224项)
DW 2880 ;该磁盘的大小必须是2880扇区
DB 0xf0 ;磁盘的种类
DW 9 ;FAT的长度(必须是9扇区)
DW 18 ;1磁道扇区数 固定是18
DW 2 ;磁头数(必须是2)
DD 0 ;不使用分区,必须是0
DD 2880 ;重复一次磁盘大小
DB 0,0,0x29 ;意义不明 固定
DD 0xffffffff ;卷标号码
DB "HARIBOTEOS " ;磁盘的名称(11字节)
DB "FAT12 " ;磁盘格式名称(8字节)
RESB 18 ;先空出18字节
entry:
MOV AX,0 ;初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV AX,0x0820 ;启动区以后地址0x7e00--0x9fbff
MOV ES,AX ;ES:BX 缓冲区段寻址
MOV CH,0 ;柱面0
MOV DH,0 ;磁头0
MOV CL,2 ;扇区2
readloop:
MOV SI,0 ;记录失败次数的寄存器
retry:
MOV AH,0x02 ;AH=0x02 : 读盘
MOV AL,1 ;一个扇区
MOV BX,0 ;
MOV DL,0x00 ;A驱动器
INT 0x13 ;调用磁盘BIOS
JNC next ;标志寄存器 如果进位标志为0
ADD SI,1 ;si加1
CMP SI,5 ;si
JAE error ;si>=5时,跳转
MOV AH,0x00
MOV DL,0x00 ;A驱动器
INT 0x13 ;
JMP retry
next:
MOV AX,ES ;读取下一扇区
ADD AX,0x0020
MOV ES,AX
ADD CL,1
CMP CL,18 ;读18个扇区
JBE readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop
MOV [0x0ff0],CH ;将CYLS的值写到0xff0中 柱面
JMP 0xc200 ;跳转到10个扇区后的程序中
error:
MOV SI,msg ;显示错误信息
putloop:
MOV AL,[SI] ;[si]内存地址
ADD SI,1
CMP AL,0
JE fin
MOV AH,0x0e
MOV BX,15
INT 0x10 ;调用显示
JMP putloop
fin:
HLT ;让CPU停止;等待指令
JMP fin
msg:
DB 0x0a, 0x0a ;换行2次
DB "load error"
DB 0x0a ;换行
DB 0
RESB 0x7dfe-$
DB 0x55, 0xaa ;启动区标志
------------------------
; haribote-os boot asm
; TAB=4
;asmhead.nas
BOTPAK EQU 0x00280000 ;
DSKCAC EQU 0x00100000 ;
DSKCAC0 EQU 0x00008000 ;
;有关BOOT_INFO
CYLS EQU 0x0ff0 ; 设定启动区
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2 ; 关于颜色数目的信息.颜色的位数.
SCRNX EQU 0x0ff4 ; 分辨率的X(screen x)
SCRNY EQU 0x0ff6 ;
VRAM EQU 0x0ff8 ; 图像缓冲区的开始地址
ORG 0xc200 ; 程序被加载到内存的地址
MOV AL,0x13 ;
MOV AH,0x00
INT 0x10 ;调用显卡BIOS
MOV BYTE [VMODE],8 ; 记录画面模式
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000a0000
;
MOV AH,0x02
INT 0x16 ; keyboard BIOS
MOV [LEDS],AL
;
;
;
;
MOV AL,0xff
OUT 0x21,AL
NOP ;
OUT 0xa1,AL
CLI ;
;
CALL waitkbdout
MOV AL,0xd1
OUT 0x64,AL
CALL waitkbdout
MOV AL,0xdf ; enable A20
OUT 0x60,AL
CALL waitkbdout
;
[INSTRSET "i486p"] ;
LGDT [GDTR0] ;
MOV EAX,CR0
AND EAX,0x7fffffff ; bit31
OR EAX,0x00000001 ; bit0
MOV CR0,EAX
JMP pipelineflush
pipelineflush:
MOV AX,1*8 ;
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
; bootpack
MOV ESI,bootpack ;
MOV EDI,BOTPAK ;
MOV ECX,512*1024/4
CALL memcpy
MOV ESI,0x7c00 ;
MOV EDI,DSKCAC ;
MOV ECX,512/4
CALL memcpy
MOV ESI,DSKCAC0+512 ;
MOV EDI,DSKCAC+512 ;
MOV ECX,0
MOV CL,BYTE [CYLS]
IMUL ECX,512*18*2/4 ;
SUB ECX,512/4 ;
CALL memcpy
MOV EBX,BOTPAK
MOV ECX,[EBX+16]
ADD ECX,3 ; ECX += 3;
SHR ECX,2 ; ECX /= 4;
JZ skip ;
MOV ESI,[EBX+20] ;
ADD ESI,EBX
MOV EDI,[EBX+12] ;
CALL memcpy
skip:
MOV ESP,[EBX+12] ;
JMP DWORD 2*8:0x0000001b
waitkbdout:
IN AL,0x64
AND AL,0x02
JNZ waitkbdout ;
RET
memcpy:
MOV EAX,[ESI]
ADD ESI,4
MOV [EDI],EAX
ADD EDI,4
SUB ECX,1
JNZ memcpy ;
RET
ALIGNB 16
GDT0:
RESB 8 ;
DW 0xffff,0x0000,0x9200,0x00cf ;
DW 0xffff,0x0000,0x9a28,0x0047 ;
DW 0
GDTR0:
DW 8*3-1
DD GDT0
ALIGNB 16
bootpack:
----
; naskfunc
; TAB=4
[FORMAT "WCOFF"] ; 制作目标文件的模式
[BITS 32] ; 制作32位模式用的机械语言
;制作目标文件的信息
[FILE "naskfunc.nas"] ; 源文件名信息
GLOBAL _io_hlt ; 程序中包涵的函数名
;以下是实际的函数
[SECTION .text] ; 目标文件中写了这些之后再写程序
_io_hlt: ; void io_hlt(void);
HLT
RET