提交 0bf88f34 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/*.img
/bochs/bios.bin-1.7.5
/bochs/bochs.exe
/bochs/bochsdbg.exe
/bochs/VGABIOS-lgpl-latest
/Debug
/Release
bochsout.txt
*.bak
\ No newline at end of file
memory: guest=32, host=32
romimage: file=Bochs/bios.bin-1.7.5 # http://www.seabios.org/SeaBIOS
vgaromimage: file=Bochs/VGABIOS-lgpl-latest
clock: sync=realtime, time0=local
pci: enabled=1, chipset=i440fx, slot1=pcivga
private_colormap: enabled=0
boot: disk
floppy_bootsig_check: disabled=0
log: bochsout.txt
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
debugger_log: -
parport1: enabled=1, file="parport.out"
speaker: enabled=1, mode=sound
e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=slirp.conf
usb_uhci: enabled=1, port1=disk:USBstick.img
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="PC010" ProjectType="pcproject" ProjectTemplateID="c090f5e3-f902-4de6-a4cc-6285cc93d41c" TemplatePath="PC010\Project" IncrementalUpload="-1" ProjectID="eaca8d26-1cf5-4977-9a72-7dc953c2a327" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" ConfigurationType="2" DebuggerFlavor="2">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool"/>
<Tool Name="JWASMAssemblerTool" ObjectFile="$(IntDir)\$(InputName).bin" ObjectFormate="0" ListFile="$(InputName).lst" GenerateDebugInformation="-1" VersionDebugInfo="-1" AdditionalOptions="/W0"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool" AdditionalOptions="disable 1014"/>
<Tool Name="PostBuildEventTool" CommandLine="echo U̾ļ...&#xA;mkimage.exe &quot;$(IntDir)\boot.bin&quot; &quot;$(IntDir)\loader.bin&quot; &quot;USBstick.img&quot;&#xA;"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="Bochs">
<File RelativePath=".\Bochs\bios.bin-1.7.5" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochs.exe" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochsdbg.exe" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochsrc.bxrc" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\VGABIOS-lgpl-latest" NoUpload="-1">
</File>
</Filter>
<File RelativePath=".\loader.asm">
</File>
<File RelativePath=".\bochsout.txt" NoUpload="-1">
</File>
<File RelativePath=".\boot.asm">
</File>
<File RelativePath=".\serialout.txt" NoUpload="-1">
</File>
<File RelativePath=".\USBstick.img">
</File>
</Files>
</ASMProject>
添加文件
LOADER_BASE equ 1000h
codeseg segment
org 7c00h ;告诉编译器程序加载到7c00处
start:
mov ax, 0 ;读取0面0道2扇区的内容到0:1000(即loader的内容)
mov es, ax
mov bx, LOADER_BASE
mov al, 4 ;读取的扇区数(拟定loader占用4个扇区)
mov ch, 0 ;磁道
mov cl, 2 ;扇区号(读第二个扇区)
mov dl, 80h ;硬盘从80h开始
mov dh, 0 ;0面
mov ah, 2 ;读扇区操作
int 13h
mov bx, 0b800h ;清屏
mov es, bx
mov bx, 0
mov cx, 25*80
clear:
mov word ptr es:[bx], 20h ;空格
mov word ptr es:[bx+1], 7h ;字符属性
add bx, 2
loop clear
mov ax, LOADER_BASE ;程序跳转到0:1000h处执行loader.bin
jmp ax
db 446- ($-start) dup (0) ;前446字节的内容不满时,用0填充
;硬盘分区表(共64字节,每16字节为一项,每项表示一个分区,共4项)
;每项中第一个字节表示引导指示符,80h表示活动分区,00h表示无效分区
db 80h
;第二、三、四个字节在这里没有用到。
db 00h, 00h, 00h
;第五个字节定义分区类型。01h表示未定义的分区类型。
db 01h
;第六、七、八个字节在这里没有用到。
db 00h, 00h, 00h
;第九到第十二字节表示逻辑起始扇区号(相对于逻辑0扇区的扇区数)。一个扇区大小为 512 字节。
dd 00010000h ;第一个分区前有 32MB 空白区域
;第十三到第十六字节表示该分区所占用的扇区数(总扇区数)
dd 00010000h ;第一个分区共 32MB 大小
;其余三项全部为0,表示没有其他分区。
db 16 dup (0)
db 16 dup (0)
db 16 dup (0)
dw 0aa55h ;可引导标志,2字节。这样446+64+2=512字节,恰好等于引导扇区的字节数。
codeseg ends
end
codeseg segment
org 1000h ;告诉编译器程序加载到1000处
jmp start
countsi dw 0820h ;规定接收的字符的显示位置在分隔线的下面一行
countdi dw 0 ;计数用
start:
mov ax, cs ;全部置0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 7c00h ;初始化栈
;***************************在屏幕中间显示分隔线*****************************************
mov ah, 2 ;设置光标位置
mov bh, 0
mov dx, 0c00h
int 10h
mov ah, 9 ;在光标处显示字符“_”
mov al, '-'
mov bl, 7
mov bh, 0
mov cx, 80
int 10h
mov ah, 2 ;设置初始光标位置,在第1行第1列
mov bh, 0
mov dx, 0
int 10h
;*********************安装新的int 0Ch中断************************************************
;因为8250串口1连接了主片8259A的IRQ4,IRQ4的中断类型号是0ch
;所以改写新的中断向量
cli
mov word ptr es:[0ch * 4], new0C ;安装新的int 0ch中断例程
mov word ptr es:[0ch * 4 + 2], 0
mov word ptr es:[9h * 4], new9 ;安装新的int 9h中断例程
mov word ptr es:[9h * 4 + 2], 0
;*******************************初始化芯片***********************************************
mov al, 0 ;设置8259A,使其能响应串口的中断
out 21h, al ;复位所有屏蔽中断
;初始化8250
;选择除数寄存器,DLAB=1
;写入通信线路控制寄存器
;分频系数,1.8432MHz / (1200*16) = 96=60h
;写入低8位
;写入高8位
;7个数据位,1个停止位,奇校验
;写入通信线路控制寄存器。同时使DLAB=0,以方便下述初始化过程
;中断工作方式,控制OUT2为低,允许INTRPT产生请求
;写入中断允许寄存器
sti
over:
jmp over ;程序在这里死循环
;*************************新的int 0Ch中断向量********************************************
new0C:
cli ;关中断,防止程序执行时外部产生的中断造成影响
push ax ;将相关寄存器中的值入栈保护
push bx
push dx
push es
push si
;读取8250中断识别寄存器到al
;只有当接收数据准备好的时候才会接着往下执行,否则中断结束
;读接收寄存器中接收到的字符
;在屏幕下半部显示出接收的字符
mov bx, 0b800h
mov es, bx
mov si, countsi
mov es:[si], al ;ASCII值
mov es:[si+1], 04h ;属性
inc si
inc si
mov countsi, si
ok:
;服务程序返回前发送EOI命令,告诉8259A中断结束,因为IRQ4属于主片的端口,所以需要向主片发送EOI命令
mov al, 20h
out 20h, al ;写入主片EOI命令
pop si
pop es
pop dx
pop bx
pop ax
iret
;*****************************新的int 9h中断例程*****************************************
new9:
cli
push ax
push bx
push es
push di
push dx
in al, 60h
cmp al, 0bh ;当取出的扫描码数据大于0bh,则中断停止
ja ok1
add ax, 2fh ;将0-9的扫描码转换成ASCII码
mov bx, 0b800h
mov es, bx
mov di, countdi
mov es:[di], al ;ASCII值
mov es:[di+1], 02h ;属性
inc di
inc di
mov countdi, di
;将输入的字符写到发送保持寄存器(发送)
;读通信线路状态寄存器LSR
;只有发送保持器空THRE为1,数据才能正确被发送,才能向下执行中断返回
;否则一直在此处循环读LSR
ok1:
;服务程序返回前发送EOI命令,告诉8259A中断结束,因为IRQ4属于主片的端口,所以需要向主片发送EOI命令
mov al, 20h
out 20h, al ;写入主片EOI命令
pop dx
pop di
pop es
pop bx
pop ax
iret
;****************************************************************************************
codeseg ends
end
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论