[自制简单操作系统] 2、鼠标及键盘中断处理事件[PIC\GDT\IDT\FIFO]
1、大致介绍:
>_<" 大致执行顺序是:ipl10.nas->asmhead.nas->bootpack.c
PS: 这里bootpack.c要调用graphic.c、dsctbl.c、fifo.c、int.c实现功能,其中有些函数还必须汇编来写,所以单独写一个汇编文件naskfunc.nas,为了方便看全部函数和结构体,所以写一个bootpack.h来写一些结构体和函数声明~
>_<" 下面是编译图解:最终生成的haribote.img可放在软盘来启动电脑,加载操作系统~
aaarticlea/png;base64,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" alt="" />
- OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj \
- int.obj fifo.obj
- TOOLPATH = ../z_tools/
- INCPATH = ../z_tools/haribote/
- MAKE = $(TOOLPATH)make.exe -r
- NASK = $(TOOLPATH)nask.exe
- CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
- GAS2NASK = $(TOOLPATH)gas2nask.exe -a
- OBJ2BIM = $(TOOLPATH)obj2bim.exe
- MAKEFONT = $(TOOLPATH)makefont.exe
- BIN2OBJ = $(TOOLPATH)bin2obj.exe
- BIM2HRB = $(TOOLPATH)bim2hrb.exe
- RULEFILE = $(TOOLPATH)haribote/haribote.rul
- EDIMG = $(TOOLPATH)edimg.exe
- IMGTOL = $(TOOLPATH)imgtol.com
- COPY = copy
- DEL = del
- # 设置默认命令为产生img
- default :
- $(MAKE) img
- # 正常执行过程
- # 将ipl10.nas编译为ipl10.bin文件
- ipl10.bin : ipl10.nas Makefile
- $(NASK) ipl10.nas ipl10.bin ipl10.lst
- # 将asmhead.asm编译为asmhead.bin
- asmhead.bin : asmhead.nas Makefile
- $(NASK) asmhead.nas asmhead.bin asmhead.lst
- # 将字库hankaku.txt编译为hankaku.bin
- hankaku.bin : hankaku.txt Makefile
- $(MAKEFONT) hankaku.txt hankaku.bin
- # 将字库转换为.obj
- hankaku.obj : hankaku.bin Makefile
- $(BIN2OBJ) hankaku.bin hankaku.obj _hankaku
- # 将OBJS_BOOTPACK的obj编译为.bim映像文件,这里的前提条件是有OBJS_BOOTPACK,所以会自动执行把naskfunc.nas和其它.c文件编译为obj文件
- bootpack.bim : $(OBJS_BOOTPACK) Makefile
- $(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
- $(OBJS_BOOTPACK)
- # 3MB+64KB=3136KB
- # 将bootpack.bim映像编译为.hrb文件
- bootpack.hrb : bootpack.bim Makefile
- $(BIM2HRB) bootpack.bim bootpack.hrb
- # 将.hrb映像和asmhead.bin 合并做成haribote.sys系统文件
- haribote.sys : asmhead.bin bootpack.hrb Makefile
- copy /B asmhead.bin+bootpack.hrb haribote.sys
- # 把ipl10.bin和haribote.sys结合做成操作系统文件haribote.img
- haribote.img : ipl10.bin haribote.sys Makefile
- $(EDIMG) imgin:../z_tools/fdimg0at.tek \
- wbinimg src:ipl10.bin len: from: to: \
- copy from:haribote.sys to:@: \
- imgout:haribote.img
- # 对c文件进行编译
- # 把.c文件编译为.gas文件,需要.c bootpack.h 和 Makefile文件,然后调用cc1.exe进行处理
- %.gas : %.c bootpack.h Makefile
- $(CC1) -o $*.gas $*.c
- # 把.gas文件转换为.nas文件,其他类似上面的说明
- %.nas : %.gas Makefile
- $(GAS2NASK) $*.gas $*.nas
- # 把.nas转为.obj文件并输出.lst文件
- %.obj : %.nas Makefile
- $(NASK) $*.nas $*.obj $*.lst
- # 根据不同的命令分别执行下面的情况,默认为img
- img :
- $(MAKE) haribote.img
- run :
- $(MAKE) img
- $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
- $(MAKE) -C ../z_tools/qemu
- install :
- $(MAKE) img
- $(IMGTOL) w a: haribote.img
- clean :
- -$(DEL) *.bin
- -$(DEL) *.lst
- -$(DEL) *.obj
- -$(DEL) bootpack.map
- -$(DEL) bootpack.bim
- -$(DEL) bootpack.hrb
- -$(DEL) haribote.sys
- src_only :
- $(MAKE) clean
- -$(DEL) haribote.img
Makefile文件,负责编译全过程
>_<" 此外还需要一个make.bat的脚本程序,这样把相应的编译器和上面的文件放到对应的位置(参看Makefile文件),运行DOS窗口输入:make run就能直接编译,打包,导入,运行在虚拟机上了~为了在UE上调试方便,我把make run命令也写成了脚本.bat,这样可在UE中直接调试运行~
- ..\z_tools\make.exe % % % % % % % % %
make.bat
- @ECHO OFF
- cd/d C:\Users\LiTao\Desktop\30OS\aaaa\A20110738\tolset\副本
- make run
脚本.bat[UE的高级,工具配置]
2、代码详解:
- ; haribote-ipl
- ; TAB=4
- CYLS EQU ; 定义读的柱面数
- ORG 0x7c00 ; 指明程序装载地址
- ; 以下这段是FAT12格式软盘专用代码 0x7c00--0x7dff 125字节 用于启动区
- JMP entry
- DB 0x90
- DB "HARIBOTE" ; 启动区的名字可以是任意的,但必须是8字节
- DW ; 每个扇区(sector)的大小必须为512字节
- DB ; 簇(cluster)的大小必须为1个扇区
- DW ; FAT的起始位置(一般从第一个扇区开始)
- DB ; FAT的个数(必须为2)
- DW ; 根目录的大小(一般设为244项)
- DW ; 该磁盘的的大小(必须为2880扇区)
- DB 0xf0 ; 磁盘的种类(必须为0xfd)
- DW ; FAT的长度(必须为9扇区)
- DW ; 一个磁道(track)有几个扇区(必须为18)
- DW ; 磁头数(必须为2)
- DD ; 不使用分区(必须为0)
- DD ; 重写一次磁盘大小
- DB ,,0x29 ; 意义不明,固定
- DD 0xffffffff ; (可能是)卷标号码
- DB "HARIBOTEOS " ; 磁盘名称(11字节)
- DB "FAT12 " ; 磁盘格式名称(8字节)
- RESB ; 先腾出18字节
- ; 程序核心
- entry:
- MOV AX, ; 初始化寄存器
- MOV SS,AX
- MOV SP,0x7c00
- MOV DS,AX
- ; 读磁盘(从软盘中读数据装到内存中0x8200--0x83ff 125字节的地方)
- MOV AX,0x0820 ; ES:BX=缓冲地址
- MOV ES,AX
- MOV CH, ; 柱面0
- MOV DH, ; 磁头0
- MOV CL, ; 扇区2
- readloop:
- MOv SI, ; 记录失败次数的寄存器
- retry:
- MOV AH,0x02 ; AH=0x02 : 读盘
- MOV AL, ; 1个扇区
- MOV BX,
- MOV DL,0x00 ; A驱动器
- INT 0x13 ; 调用磁盘BIOS
- JNC next ; 没出错就跳转到next继续读下一个做准备
- ADD SI, ; SI++
- CMP SI, ; 比较SI和5
- JAE error ; SI>=5时,跳转到error
- MOV AH,0x00
- MOV DL,0x00 ; A驱动器
- INT 0x13 ; 重置驱动器
- JMP retry
- next:
- MOV AX,ES ; 把内存地址后移0x200
- ADD AX,0x0020
- MOV ES,AX ; 因为没有ADD ES,0x200指令,所以这里绕个弯
- ADD CL, ; 往CL里加1 (所读扇区标号,开始是2,见初始化部分)
- CMP CL, ; 和18比较
- JBE readloop ; 小于18就跳转到readloop继续读
- MOV CL, ; 扇区1
- ADD DH, ; 磁头+1
- CMP DH, ; 判断磁头是否超过2
- JB readloop ; 没有超过就继续读
- MOV DH, ; 超过2就转为0
- ADD CH, ; CH记录读取的柱面数
- CMP CH,CYLS ; CYLS在前面定义 CYLS EQU 10
- JB readloop
- ; 磁盘内容装载内容的结束地址告诉haribote.sys
- MOV [0x0ff0],CH ; 将CYLS的值写到内存地址0x0ff0中
- JMP 0xc200
- error:
- MOV SI,msg ; 循环输出msg里面的内容
- putloop:
- MOV AL,[SI]
- ADD SI, ; 给SI加1
- CMP AL,
- JE fin
- MOV AH,0x0e ; 显示一个文字
- MOV BX, ; 指定字符颜色
- INT 0x10 ; 调用显卡BIOS
- JMP putloop
- fin:
- HLT ; 让CPU停止等待指令
- JMP fin ; 无限循环
- msg:
- DB 0x0a, 0x0a ; 换行2次
- DB "load error"
- DB 0x0a ; 换行
- DB
- RESB 0x7dfe-$ ; 0x7dfe傑偱傪0x00偱杽傔傞柦椷
- DB 0x55, 0xaa
ipl10.nas
PS: 负责读盘到内存,读完盘之后跳转到0xc200处,即asmhead.nas
- ; haribote-os boot asm
- ; TAB=4
- BOTPAK EQU 0x00280000 ; bootpack的内存首址
- DSKCAC EQU 0x00100000 ;
- DSKCAC0 EQU 0x00008000 ;
- ; BOOT_INFO相关
- CYLS EQU 0x0ff0 ; 设定启动区
- LEDS EQU 0x0ff1
- VMODE EQU 0x0ff2 ; 关于颜色的信息颜色的位数
- SCRNX EQU 0x0ff4 ; 分辨率X
- SCRNY EQU 0x0ff6 ; 分辨率Y
- VRAM EQU 0x0ff8 ; 图像缓冲区的开始地址
- ORG 0xc200 ; 这个程序要装在到什么位置,在ipl10读盘结束的地方转到该处
- MOV AL,0x13 ; VGA显卡,320X200X8位色彩
- MOV AH,0x00
- INT 0x10
- MOV BYTE [VMODE], ; 记录画面模式
- MOV WORD [SCRNX],
- MOV WORD [SCRNY],
- MOV DWORD [VRAM],0x000a0000
- ; 用BIOS获得键盘上各种LED指示灯的状态
- MOV AH,0x02
- INT 0x16 ; keyboard BIOS
- MOV [LEDS],AL
- ; PIC关闭一切中断
- ; 根据AT兼容机的规格,如果要初始化PIC(Programmable Interrupt Controller)
- ; 必须在CLI之前进行,否则有时会挂起
- ; 随后进行PIC的初始化
- ; 这段等价于:
- ; io_out8(PIC0_IMR,0xff);禁止主PIC的中断
- ; io_out8(PIC1_IMR,0xff);禁止从PIC的中断
- ; io_cli();禁止CPU级中断
- MOV AL,0xff
- OUT 0x21,AL
- NOP ; 如果连续执行OUT指令有些机种会无法执行
- OUT 0xa1,AL
- CLI ; 禁止CPU级别中断
- ; 为了让CPU访问1MB以上的内存空间,设定A20GATE
- ; 相当于
- ; #define KEYCMD_WRITE_OUTPORT 0xd1
- ; #define KBC_OUTPORT_A20G_ENABLE 0xdf
- ; wait_KBC_sendready();
- ; io_out8(PORT_KEYCMD,KEYCMD_WRITE_OUTPORT);
- ; wait_KBC_sendready();
- ; io_out8(PORT_KEYDAT,KBC_OUTPORT_A20G_ENABLE);
- ; wait_KBC_sendready();
- ; 该程序和init_keyboard完全相同,仅仅是向键盘控制电路发送指令,这里发送的指令,是指令键盘控制电路的附属端口输出0xdf
- ; 这个附属端口,连接着主板上的很多地方,通过这个端口发送不同的命令,就可以实现各种各样的控制功能了
- ; 这次输出所要完成的功能,是让A20GATE信号变成ON状态,是让1MB以上的内存变成可用状态
- CALL waitkbdout
- MOV AL,0xd1
- OUT 0x64,AL
- CALL waitkbdout
- MOV AL,0xdf ; enable A20
- OUT 0x60,AL
- CALL waitkbdout
- ; 切换保护模式
- ; INSTRSET指令是为了386以后的LGDT,EAX,CR0
- ; LGDT指令把随意准备的GDT读出来,对于这个暂定的GDT我们今后还要重新设定,然后将CR0这一特殊的32位寄存器的值带入EAX
- ; 并将高位置0,低位置1,再将这个值返回给CR0,这就完成了模式转化,进入到不用颁的保护模式。
- ; CR0是control register 0是一个非常重要的寄存器,只有操作系统才能操作它
- ; protected virtual address mode 受保护的虚拟内存地址模式,在该模式下,应用程序不能随便改变段的设定,又不能使用操作系统的段。操作系统受CPU保护
- ; 在保护模式中主要有受保护的16位模式和受保护的32位模式,我们要使用的是受保护的32位模式
- ; 在讲解CPU的书上会写到,通过带入CR0而切换到保护模式时,马上就执行JMP指令。所以我们也执行这一指令。为什么要jmp呢?因为变成保护模式后,机器语言的解释发生变化,
- ; CPU为了加快指令的执行速度而使用了管道(pipeline)这一机制,也就是说前一条指令还在执行时,就开始解释下一条甚至是再下一条指令,因为模式变了就要重新解释一遍,so..
- ; 而且在程序中,进入保护模式后,段寄存器的意思也变了(不是*16再加算的意思),除了CS以外所有的段寄存器的值都从0x0000变成了0x0008.CS保持不变是因为CS如果变了就乱了
- ; 所以只有CS要放到后面处理。这里的0x0008相当于gdt+1的段
- [INSTRSET "i486p"] ; ”想要使用486指令"的叙述
- LGDT [GDTR0] ; 设定临时的GDT(Global Descriptor Table)
- MOV EAX,CR0
- AND EAX,0x7fffffff ; 设bit31为0(为了禁止颁)
- OR EAX,0x00000001 ; 设bit0为1(为了切换保护模式)
- MOV CR0,EAX
- JMP pipelineflush
- pipelineflush:
- MOV AX,* ; 可读写的段32bit
- MOV DS,AX
- MOV ES,AX
- MOV FS,AX
- MOV GS,AX
- MOV SS,AX
- ; bootpack传送
- ; 简单来说,这部分只是在调用memcpy函数(大概意思是:下面表达仅为了说明意思,可能不正确)
- ; memcpy(转送源地址 ,转送目的地址,转送数据大小);大小用双字,所以用字节/4、
- ; memcpy(bootpack ,BOTPAK ,512*1024/4 );//从bootpack的地址开始的512kb内容复制到0x00280000号地去[512kb比bootpack.hrb大很多]
- ; memcpy(0x7c00 ,DSKCAC ,512/4 );//从0x7c00复制512字节到0x10000000是将启动扇区复制到1MB以后的内存去,[启动区的0x00007c00-0x00007dff,125字节]
- ; memcpy(DSKCAC+512 ,DSKCAC+512 ,cyls*512*18*2/4-512/4);//从始于磁盘0x00008200的内容,复制到0x00100200内存去[从磁盘读取数据装到0x8200后的地方]
- ; bootpack是asmhead的最后一个标签,因为.sys是通过asmhead.bin和bootpack.hrb连接而成,所以asmhead结束的地方就是bootpack.hrb最开始地方
- MOV ESI,bootpack ; 转送源
- MOV EDI,BOTPAK ; 转送目的地
- MOV ECX,*/
- CALL memcpy
- ; 磁盘的数据最终转送到它本来的位置去
- ; 首先从启动扇区开始
- MOV ESI,0x7c00 ; 转送源
- MOV EDI,DSKCAC ; 转送目的地
- MOV ECX,/
- CALL memcpy
- ; 所有剩下的
- MOV ESI,DSKCAC0+ ; 转送源
- MOV EDI,DSKCAC+ ; 转送目的地
- MOV ECX,
- MOV CL,BYTE [CYLS]
- IMUL ECX,**/ ; 从柱面数转为字节数/4
- SUB ECX,/ ; 减去IPL
- CALL memcpy
- ; 必须由asmhead来完成,至此全部完毕
- ; 以后就交给bootpack来完成
- ; bootpack的启动
- ; 还是执行memecpy程序,将bootpack.hrb第0x10c8字节开始的0x11a8字节复制到0x00310000号地址去
- ; 最后将0x310000代入到ESP中,然后用一个特殊的JMP指令,将2*8代入到CS里,同时移动到0x1b号地址,这里的0x1b是指第二个段的0x1b号地址
- ; 第2个段的基址是0x280000,所以是从0x28001b开始执行,即bootpack.hrb的0x1b号地址
- MOV EBX,BOTPAK
- MOV ECX,[EBX+]
- ADD ECX, ; ECX += 3;
- SHR ECX, ; ECX /= 4;
- JZ skip ; 没有要转送的东西时
- MOV ESI,[EBX+] ; 转送源
- ADD ESI,EBX
- MOV EDI,[EBX+] ; 转送目的地
- CALL memcpy
- skip:
- MOV ESP,[EBX+] ; 栈初始值
- JMP DWORD *:0x0000001b
- ;----------------------------------------------------------------------------------------------------
- ;内存分配:
- ; 0x00000000-0x000fffff:虽然在启动中会多次使用,但之后就会变空(1M)
- ; 0x00100000-0x00267fff:用于保存软盘的内容(1440KB)
- ; 0x00268000-0x0026f7ff:空(30KB)
- ; 0x0026f800-0x0026ffff:IDT(2KB)
- ; 0x00270000-0x0027ffff:GDT(64KB)
- ; 0x00280000-0x002fffff:bootpack.hrb(512KB)
- ; 0x00300000-0x003fffff:栈及其他(1MB)
- ; 0x00400000- :空
- ;----------------------------------------------------------------------------------------------------
- ; 和wait_KBC_sendready相同,但加入了0x60号设备进行IN处理,也就是如果控制器里有键盘代码,或已经积累了鼠标数据,就顺便读出来
- waitkbdout:
- IN AL,0x64
- AND AL,0x02
- JNZ waitkbdout ; AND偺寢壥偑0偱側偗傟偽waitkbdout傊
- RET
- ; 复制程序
- memcpy:
- MOV EAX,[ESI]
- ADD ESI,
- MOV [EDI],EAX
- ADD EDI,
- SUB ECX,
- JNZ memcpy ; 减法运算的结果如果不是0,就跳转到memcpy
- RET
- ; GDT0也是一种特定的GDT,0是空区域(null sector),不能在那里定义段,1号和2号分别由下式设定:
- ; set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, AR_DATA32_RW);//设定全局段
- ; set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);//设定bootpack512字节的段
- ALIGNB ;一直添加DBO,直到地址能被16整除,如果GDT0地址不是8的倍数就会慢一些,所以...
- GDT0:
- RESB ; NULL selector
- DW 0xffff,0x0000,0x9200,0x00cf ; 可以读写的段(segment) 32bit
- DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的段(segment) 32bit (bootpack用)
- DW
- GDTR0: ;是LGDT指令,通知GDT0有了GDT,在GDT0写入了16位的段上限和32位段其实地址
- DW *-
- DD GDT0
- ALIGNB
- bootpack:
- ; 也就是说,最初的状态时,GDT在asmhead.nas里并不在0x00270000-0x0027ffff的范围里。IDT连设定都没设定,所以仍处于中断禁止状态
- ; 应当趁着硬件上积累过多的数据而产生的错误之前,尽快开放中断,接受数据。因此,在bootpack.c的hariMain里,应该在进行调色板的
- ; 初始化之前及画面准备之前,赶紧重新建立GDT和IDT,初始化PIC,并执行io_sti();
asmhead.nas
PS: 负责显示模式及分辨率设置及从16位转换为32位保护模式,是c语言和汇编语言的桥梁,所以称为asmhead文件,执行到最后就转到bootpack.c的主函数
- /* bootpack文件*/
- #include "bootpack.h"
- #include <stdio.h>
- struct MOUSE_DEC {//鼠标移动结构体
- unsigned char buf[], phase;
- int x, y, btn;//鼠标移动距离,鼠标点击信息[低3位从高到低依次:LMR]
- };
- extern struct FIFO8 keyfifo, mousefifo;
- void enable_mouse(struct MOUSE_DEC *mdec);//使能鼠标
- void init_keyboard(void);//初始化键盘
- int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);//鼠标消息处理
- void HariMain(void)
- {
- struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
- char s[], mcursor[], keybuf[], mousebuf[];
- int mx, my, i;
- struct MOUSE_DEC mdec;
- init_gdtidt();//在dsctbl.c中,负责分区和中断分区初始化[包括键盘和鼠标中断设定]
- init_pic();//在int.c中,负责中断初始化(硬件)
- io_sti(); //在naskfunc.nas中,仅仅执行STI指令,是CLI的逆指令,前者是开中断,后者是禁止中断
- fifo8_init(&keyfifo, , keybuf);//在fifo.c中,负责缓冲区初始化(缓冲区结构体,大小,缓冲区首址)
- fifo8_init(&mousefifo, , mousebuf);
- /*这里IMR是(interrupt mask register),意思是“中断屏蔽寄存器”,是8位寄存器,分别对应8路IRQ信号,如果一路是1则该路被屏蔽
- 因为键盘中断是IRQ1,鼠标中断是IRQ12,且PIC分主从2个,从PIC连接主PIC的IRQ2,所以想要有鼠标和键盘中断,要PIC0的IRQ1和IRQ2,和PIC1的IRQ4*/
- io_out8(PIC0_IMR, 0xf9);
- io_out8(PIC1_IMR, 0xef);
- init_keyboard();//在这个文件夹内:鼠标和键盘模式设置
- init_palette();//在文件graphic.c里,初始化调色板,建立静态16个颜色映射,然后调用set_palette进行设置
- init_screen8(binfo->vram, binfo->scrnx, binfo->scrny);//在文件graphic.c里,初始化屏幕,画矩形,形成最初的窗口界面
- mx = (binfo->scrnx - ) / ; /* 画面中央的坐标计算 */
- my = (binfo->scrny - - ) / ;
- init_mouse_cursor8(mcursor, COL8_008484);//在文件graphic.c里,存放鼠标颜色信息的字符指针,窗口背景颜色
- putblock8_8(binfo->vram, binfo->scrnx, , , mx, my, mcursor, );//在文件graphic.c里,绘制鼠标
- sprintf(s, "(%3d, %3d)", mx, my);//将鼠标位置坐标转换为字符串s
- putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);//在文件graphic.c里,显示字符串在0,0位置
- enable_mouse(&mdec);//使能鼠标,在本文件内
- for (;;) {
- io_cli();//关闭中断,汇编函数
- if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == ) {//如果键盘和鼠标的缓冲区里没有数据就SLT什么都不做并且STI恢复中断
- io_stihlt();
- } else {//如果缓冲区中有数据
- if (fifo8_status(&keyfifo) != ) {
- i = fifo8_get(&keyfifo);//获取一个数据FIFO
- io_sti();//开中断,汇编函数
- sprintf(s, "%02X", i);//转换为字符串
- boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );//在graphic.c文件中,填充VRAM实现画矩形操作,负责清屏操作[这一块]
- putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);//显示字符串
- } else if (fifo8_status(&mousefifo) != ) {
- i = fifo8_get(&mousefifo);
- io_sti();
- if (mouse_decode(&mdec, i) != ) {//对鼠标移动消息进行处理[这里比较特殊,在本文件夹内]
- sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);//将鼠标坐标和lcr信息封装成字符串待输出,这里的x,y是移动距离
- if ((mdec.btn & 0x01) != ) {//通过判断,将点击事件的字符改为大写
- s[] = 'L';
- }
- if ((mdec.btn & 0x02) != ) {
- s[] = 'R';
- }
- if ((mdec.btn & 0x04) != ) {
- s[] = 'C';
- }
- boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , + * - , );//输出鼠标移动消息
- putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
- //鼠标指针移动
- boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + , my + ); /*隐藏鼠标*/
- mx += mdec.x;//计算当前鼠标的位置
- my += mdec.y;
- if (mx < ) {//超屏控制
- mx = ;
- }
- if (my < ) {
- my = ;
- }
- if (mx > binfo->scrnx - ) {
- mx = binfo->scrnx - ;
- }
- if (my > binfo->scrny - ) {
- my = binfo->scrny - ;
- }
- sprintf(s, "(%3d, %3d)", mx, my);
- boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , ); /*隐藏鼠标坐标消息*/
- putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s); /*显示鼠标坐标消息*/
- putblock8_8(binfo->vram, binfo->scrnx, , , mx, my, mcursor, ); /*显示鼠标*/
- }
- }
- }
- }
- }
- #define PORT_KEYDAT 0x0060
- #define PORT_KEYSTA 0x0064
- #define PORT_KEYCMD 0x0064
- #define KEYSTA_SEND_NOTREADY 0x02
- #define KEYCMD_WRITE_MODE 0x60
- #define KBC_MODE 0x47
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:等待键盘控制电路准备完毕
- //参数:无
- //附加:如果键盘控制电路可以接受CPU指令,CPU从设备号码0x0064处所读取的数据的倒数第二位应该是0,否则就一种循环等待
- void wait_KBC_sendready(void)
- {
- for (;;) {
- if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == ) {
- break;
- }
- }
- return;
- }
- void init_keyboard(void)//初始化键盘控制电路
- {
- wait_KBC_sendready();//让键盘控制电路做好准备,等待控制指令的到来
- io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);//键盘模式设置指令
- wait_KBC_sendready();
- io_out8(PORT_KEYDAT, KBC_MODE);//鼠标模式设置指令
- return;
- }
- #define KEYCMD_SENDTO_MOUSE 0xd4
- #define MOUSECMD_ENABLE 0xf4
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:使能鼠标
- //参数:
- //附加:这个函数和init_keyboard十分相似,不同的在于输入的数据不同
- //如果向键盘控制电路发送指令0xd4,下一数据就会自动发送给鼠标,利用这一特性来发送激活鼠标的指令
- //其中答复消息为0xfa
- void enable_mouse(struct MOUSE_DEC *mdec)
- {
- wait_KBC_sendready();//让键盘控制电路做好准备,等待控制指令的到来
- io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
- wait_KBC_sendready();
- io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
- mdec->phase = ;
- return;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:鼠标信息解码程序,把信息保存在鼠标结构体中
- //参数:鼠标结构体,从缓冲区读取的数据
- //附加:首先把最初读到的0xfa舍掉,之后从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累计3字节时候就作相应处理[这里返回1]
- //最后将鼠标的点击信息放在btn中,将鼠标的移动信息保存在x,y中
- int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
- {
- if (mdec->phase == ) {
- /*等待鼠标的0xfa状态*/
- if (dat == 0xfa) {
- mdec->phase = ;
- }
- return ;
- }
- if (mdec->phase == ) {
- /*等待鼠标的第一字节*/
- if ((dat & 0xc8) == 0x08) {
- /* 正しい1バイト目だった */
- mdec->buf[] = dat;
- mdec->phase = ;
- }
- return ;
- }
- if (mdec->phase == ) {
- /*等待鼠标的第二字节*/
- mdec->buf[] = dat;
- mdec->phase = ;
- return ;
- }
- if (mdec->phase == ) {
- /*等待鼠标的第三字节,并作处理*/
- mdec->buf[] = dat;
- mdec->phase = ;//注意这里是恢复到1不是0,见附加说明,刚开始舍去0xfa以后每次3字节
- /*下面是根据buf的3个数据进行计算鼠标信息
- 这里btn是buf[0]的低3位,最低位表示鼠标左击,中间表示鼠标中间被击,第3位表示鼠标右击
- 鼠标的x,和y坐标基本和buf[1],buf[2]相等,但是要根据buf[0]的前半部分作相应的变化:要么第8位及8位以后的全部设成1,或全部保留为0
- */
- mdec->btn = mdec->buf[] & 0x07;
- mdec->x = mdec->buf[];
- mdec->y = mdec->buf[];
- if ((mdec->buf[] & 0x10) != ) {
- mdec->x |= 0xffffff00;
- }
- if ((mdec->buf[] & 0x20) != ) {
- mdec->y |= 0xffffff00;
- }
- mdec->y = - mdec->y; /* 因为鼠标和屏幕的方向恰好相反,所以这里取反*/
- return ;
- }
- return -;
- }
bootpack.c
- /* In this file, not only have the defination of the function, but also
- hava the description of where the function is.*/
- /* asmhead.nas */
- struct BOOTINFO { /* 0x0ff0-0x0fff */
- char cyls; /* what's the end of the start zone read the data */
- char leds; /* when boot,the LED's state of the keyboard */
- char vmode; /* GPU mode:how many bits of color */
- char reserve;
- short scrnx, scrny; /* resolution */
- char *vram;
- };
- #define ADR_BOOTINFO 0x00000ff0
- /* naskfunc.nas */
- void io_hlt(void);
- void io_cli(void);
- void io_sti(void);
- void io_stihlt(void);
- int io_in8(int port);
- void io_out8(int port, int data);
- int io_load_eflags(void);
- void io_store_eflags(int eflags);
- void load_gdtr(int limit, int addr);
- void load_idtr(int limit, int addr);
- void asm_inthandler21(void);
- void asm_inthandler27(void);
- void asm_inthandler2c(void);
- /* fifo.c */
- struct FIFO8 {//FIFO缓冲区数据结构
- unsigned char *buf;//缓冲区
- int p, q, size, free, flags;//下一个数据的写入地址,下一个数据的读出地址,缓冲区的大小,free是缓冲区没有数据的字节数,flag是是否溢出
- };
- void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);
- int fifo8_put(struct FIFO8 *fifo, unsigned char data);
- int fifo8_get(struct FIFO8 *fifo);
- int fifo8_status(struct FIFO8 *fifo);
- /* graphic.c */
- void init_palette(void);
- void set_palette(int start, int end, unsigned char *rgb);
- void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);
- void init_screen8(char *vram, int x, int y);
- void putfont8(char *vram, int xsize, int x, int y, char c, char *font);
- void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s);
- void init_mouse_cursor8(char *mouse, char bc);
- void putblock8_8(char *vram, int vxsize, int pxsize,
- int pysize, int px0, int py0, char *buf, int bxsize);
- #define COL8_000000 0
- #define COL8_FF0000 1
- #define COL8_00FF00 2
- #define COL8_FFFF00 3
- #define COL8_0000FF 4
- #define COL8_FF00FF 5
- #define COL8_00FFFF 6
- #define COL8_FFFFFF 7
- #define COL8_C6C6C6 8
- #define COL8_840000 9
- #define COL8_008400 10
- #define COL8_848400 11
- #define COL8_000084 12
- #define COL8_840084 13
- #define COL8_008484 14
- #define COL8_848484 15
- /* dsctbl.c about GDT IDT that's Global Descriptor Table and Interrupt Descriptor Table*/
- struct SEGMENT_DESCRIPTOR {//8 bytes segment infomation,total 8192 parts [here similar to the method of the setting palette]
- short limit_low, base_low;//address of segment base[high:mid:low=1:1:2]=4 bytes =32 bits
- char base_mid, access_right;//segment limit[high:low=1:2],only 20 bits = high byte's low 4 bits + low 2bytes' 16bits
- char limit_high, base_high;//segment property access[limit_high:right=1:1],only 12 bits = limit_high's high 4 bits + access_right's 8 bits
- };
- //PS 1):segment limit equals the number of GDT's effective bytes -1
- //PS 2):the segment limit just only has 20 bits, which can represent 1MB, and the segment property has 1 bit flag,
- //if this flag =1,and the limit's unit uses page to replace byte(here 1 page = 4kb)
- //PS 3):the segment property has 16 bits liking that:xxxx0000 xxxxxxxx
- //the high 4 bits are extended access
- //the low 8 bits are:
- // 0x00:unused description table
- // 0x92:system exclusive,readable and writable,non-executable
- // 0x9a:system exclusive,readable and non-writable,executable
- // 0xf2:application useing,readable and writable,non-executable
- // 0xfa:application useing,readable and non-writable,executable
- struct GATE_DESCRIPTOR {//
- short offset_low, selector;
- char dw_count, access_right;
- short offset_high;
- };
- void init_gdtidt(void);
- void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);
- void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar);
- #define ADR_IDT 0x0026f800
- #define LIMIT_IDT 0x000007ff
- #define ADR_GDT 0x00270000
- #define LIMIT_GDT 0x0000ffff
- #define ADR_BOTPAK 0x00280000
- #define LIMIT_BOTPAK 0x0007ffff
- #define AR_DATA32_RW 0x4092
- #define AR_CODE32_ER 0x409a
- #define AR_INTGATE32 0x008e
- /* int.c */
- void init_pic(void);
- void inthandler21(int *esp);
- void inthandler27(int *esp);
- void inthandler2c(int *esp);
- #define PIC0_ICW1 0x0020
- #define PIC0_OCW2 0x0020
- #define PIC0_IMR 0x0021
- #define PIC0_ICW2 0x0021
- #define PIC0_ICW3 0x0021
- #define PIC0_ICW4 0x0021
- #define PIC1_ICW1 0x00a0
- #define PIC1_OCW2 0x00a0
- #define PIC1_IMR 0x00a1
- #define PIC1_ICW2 0x00a1
- #define PIC1_ICW3 0x00a1
- #define PIC1_ICW4 0x00a1
bootpack.h
PS: 主函数在此,做好初始化各种操作然后接收键盘和鼠标信息,并对鼠标信息进行解析,呈现在屏幕上,此外还有文字显示(字库),鼠标显示,鼠标位置计算...这里用到了GDT和IDT,对消息的接收要用中断,对消息的保存要用到FIFO缓冲区...
- /* dsctbl.c GDT IDT分段及中断相关 */
- #include "bootpack.h"
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:
- //参数:
- //附件:
- void init_gdtidt(void)
- {
- /*在bootpack.h文件里面定义了分段结构体和中断结构体,这里实例化gdt和idt*/
- struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;//从0x00270000~0x0027ffff共8192个分段
- struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) ADR_IDT;//从0x0026f800~0x0026ffff共256个分段
- int i;
- /* GDT的初始化 */
- for (i = ; i <= LIMIT_GDT / ; i++) {
- set_segmdesc(gdt + i, , , );
- }
- //,上限,地址,属性
- set_segmdesc(gdt + , 0xffffffff, 0x00000000, AR_DATA32_RW);//设定全局段
- set_segmdesc(gdt + , LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);//设定bootpack512字节的段
- /* ;1) 这个函数用来指定的段上限和地址赋值给GDTR的48位寄存器,这是个很特殊的寄存器,并不能用MOV来直接赋值
- ;,唯一的方法就是指定一个内存地址,从指定的内存地址读取6字节(也就是48位),然后赋值给GDTR寄存器。完成这一任务的指令就是LGDT
- ;2) 该寄存器的低16位(即内存的最初的2个字节)是段上限,它等于“GDT的有效的字节数-1”,剩下的32位,代表GDT的开始地址
- ;3) 这里2个参数是ESP+4和ESP+8里存放,而我们要的是6字节形式的,所以要转换为我们想要的形式~ */
- load_gdtr(LIMIT_GDT, ADR_GDT);
- /* IDT的初始化 */
- for (i = ; i <= LIMIT_IDT / ; i++) {
- set_gatedesc(idt + i, , , );
- }
- load_idtr(LIMIT_IDT, ADR_IDT);
- /* IDT的設定 */
- set_gatedesc(idt + 0x21, (int) asm_inthandler21, * , AR_INTGATE32);
- set_gatedesc(idt + 0x27, (int) asm_inthandler27, * , AR_INTGATE32);
- set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, * , AR_INTGATE32);
- /*这里asm_inthadler21注册在idt的第0x21号,这样如果发生了中断,CPU就会自动调用asm_inthandler21.
- 这里的2*8表示asm_inthandler21属于哪一个段,即段号2,乘以8是因为低3位有别的意思,这低3位必须为0
- 这里段号为2的段在初始化的地方我们设置为bootpack全局段
- 最后的AR_INTGATE32将IDT的属性,设定为0x008e,表示用于中断处理的有效性
- */
- return;
- }
- void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
- {
- if (limit > 0xfffff) {
- ar |= 0x8000; /* G_bit = 1 */
- limit /= 0x1000;
- }
- sd->limit_low = limit & 0xffff;
- sd->base_low = base & 0xffff;
- sd->base_mid = (base >> ) & 0xff;
- sd->access_right = ar & 0xff;
- sd->limit_high = ((limit >> ) & 0x0f) | ((ar >> ) & 0xf0);
- sd->base_high = (base >> ) & 0xff;
- return;
- }
- void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar)
- {
- gd->offset_low = offset & 0xffff;
- gd->selector = selector;
- gd->dw_count = (ar >> ) & 0xff;
- gd->access_right = ar & 0xff;
- gd->offset_high = (offset >> ) & 0xffff;
- return;
- }
dsctbl.c
PS: GDT IDT分段及中断相关,这里的分段和调色板的分段有异曲同工之妙~
- /* 操作系统函数集合 */
- #include "bootpack.h"
- // -----------------------------------------------------------------------------------
- //调色板相关
- //-----------------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:初始化调色板,建立静态16个颜色映射,然后调用set_palette进行设置
- //参数:无
- //附件:要调用set_palette函数
- void init_palette(void)
- {
- static unsigned char table_rgb[ * ] = {
- 0x00, 0x00, 0x00, /* 0:黑 */
- 0xff, 0x00, 0x00, /* 1:亮红 */
- 0x00, 0xff, 0x00, /* 2:亮绿 */
- 0xff, 0xff, 0x00, /* 3:亮黄 */
- 0x00, 0x00, 0xff, /* 4:亮蓝 */
- 0xff, 0x00, 0xff, /* 5:亮紫 */
- 0x00, 0xff, 0xff, /* 6:浅亮蓝 */
- 0xff, 0xff, 0xff, /* 7:白 */
- 0xc6, 0xc6, 0xc6, /* 8:亮灰 */
- 0x84, 0x00, 0x00, /* 9:暗红 */
- 0x00, 0x84, 0x00, /* 10:暗绿 */
- 0x84, 0x84, 0x00, /* 11:暗黄 */
- 0x00, 0x00, 0x84, /* 12:暗青 */
- 0x84, 0x00, 0x84, /* 13:暗紫 */
- 0x00, 0x84, 0x84, /* 14:浅暗蓝 */
- 0x84, 0x84, 0x84 /* 15:暗灰 */
- };
- set_palette(, , table_rgb);
- return;
- /*C语言中static char只能用于数据,就像汇编中的DB指令 */
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:初始化设置调色板
- //参数:开始标号,结束标号,16*3的颜色表
- //附加:关闭中断,进行设置(要知道具体设置要求),恢复中断
- void set_palette(int start, int end, unsigned char *rgb)
- {
- int i, eflags;
- eflags = io_load_eflags(); /* 记录中断许可标志 */
- io_cli(); /* 将中断许可标志置0,禁止中断 */
- io_out8(0x03c8, start);
- for (i = start; i <= end; i++) {
- io_out8(0x03c9, rgb[] / );
- io_out8(0x03c9, rgb[] / );
- io_out8(0x03c9, rgb[] / );
- rgb += ;
- }
- io_store_eflags(eflags); /* 恢复原中断 */
- return;
- }
- //-----------------------------------------------------------------------------------
- //调色板相关
- //-----------------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:填充VRAM实现画矩形操作
- //参数:VRAM初址,x轴像素,颜色标号,后面4个是位置矩形
- void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
- {
- int x, y;
- for (y = y0; y <= y1; y++) {
- for (x = x0; x <= x1; x++)
- vram[y * xsize + x] = c;
- }
- return;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:初始化屏幕,画矩形,形成最初的窗口界面
- //参数:VRAM初址,屏幕宽和长
- //附加:要调用boxfill8函数
- void init_screen8(char *vram, int x, int y)
- {
- boxfill8(vram, x, COL8_008484, , , x - , y - );
- boxfill8(vram, x, COL8_C6C6C6, , y - , x - , y - );
- boxfill8(vram, x, COL8_FFFFFF, , y - , x - , y - );
- boxfill8(vram, x, COL8_C6C6C6, , y - , x - , y - );
- boxfill8(vram, x, COL8_FFFFFF, , y - , , y - );
- boxfill8(vram, x, COL8_FFFFFF, , y - , , y - );
- boxfill8(vram, x, COL8_848484, , y - , , y - );
- boxfill8(vram, x, COL8_848484, , y - , , y - );
- boxfill8(vram, x, COL8_000000, , y - , , y - );
- boxfill8(vram, x, COL8_000000, , y - , , y - );
- boxfill8(vram, x, COL8_848484, x - , y - , x - , y - );
- boxfill8(vram, x, COL8_848484, x - , y - , x - , y - );
- boxfill8(vram, x, COL8_FFFFFF, x - , y - , x - , y - );
- boxfill8(vram, x, COL8_FFFFFF, x - , y - , x - , y - );
- return;
- }
- //-----------------------------------------------------------------------------------
- //字符显示相关
- //-----------------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:在指定位置显示一个字符
- //参数:VRAM初址,窗口宽,待显示的位置,颜色,显示文字的初址(这里采用16个char表示一个字符)
- void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
- {
- int i;
- char *p, d /* data */;
- for (i = ; i < ; i++) {
- //查询每个char的8个位,如果不为0,就
- p = vram + (y + i) * xsize + x;
- d = font[i];
- if ((d & 0x80) != ) { p[] = c; }
- if ((d & 0x40) != ) { p[] = c; }
- if ((d & 0x20) != ) { p[] = c; }
- if ((d & 0x10) != ) { p[] = c; }
- if ((d & 0x08) != ) { p[] = c; }
- if ((d & 0x04) != ) { p[] = c; }
- if ((d & 0x02) != ) { p[] = c; }
- if ((d & 0x01) != ) { p[] = c; }
- }
- return;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:在指定位置显示一个字符串
- //参数:VRAM初址,窗口宽,待显示的位置,颜色,待显示文字串的初址(这里采用16个char表示一个字符)
- //附加:这里采用ASCII,字符串以0x00结尾,要调用putfont8()函数,这里可以和printf()函数连用将数据格式化为字符串类型
- void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)
- {
- extern char hankaku[];
- for (; *s != 0x00; s++) {
- putfont8(vram, xsize, x, y, c, hankaku + *s * );
- x += ;
- }
- return;
- }
- //-----------------------------------------------------------------------------------
- //显示鼠标指针
- //-----------------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:准备鼠标指针(16*16)
- //参数:存放鼠标颜色信息的字符指针,窗口背景颜色
- //附件:先定义一个cursor鼠标效果数组,然后转换为鼠标颜色数组(即,每一点应该涂什么颜色)
- void init_mouse_cursor8(char *mouse, char bc)
- {
- static char cursor[][] = {
- "**************..",
- "*OOOOOOOOOOO*...",
- "*OOOOOOOOOO*....",
- "*OOOOOOOOO*.....",
- "*OOOOOOOO*......",
- "*OOOOOOO*.......",
- "*OOOOOOO*.......",
- "*OOOOOOOO*......",
- "*OOOO**OOO*.....",
- "*OOO*..*OOO*....",
- "*OO*....*OOO*...",
- "*O*......*OOO*..",
- "**........*OOO*.",
- "*..........*OOO*",
- "............*OO*",
- ".............***"
- };//16*16的字节的内存
- int x, y;
- for (y = ; y < ; y++) {//根据上面的鼠标数组建立一个绘制方案保存在mouse里
- for (x = ; x < ; x++) {
- if (cursor[y][x] == '*') {//边缘涂黑色
- mouse[y * + x] = COL8_000000;
- }
- if (cursor[y][x] == 'O') {//内部涂白色
- mouse[y * + x] = COL8_FFFFFF;
- }
- if (cursor[y][x] == '.') {//外部图背景色
- mouse[y * + x] = bc;
- }
- }
- }
- return;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:绘制鼠标
- //参数:VRAM初址,x轴像素,鼠标指针大小,位置,鼠标绘制方案,bxsize和pxsize大体相同
- //附件:鼠标绘制方案即初始化函数得到的mouse,真正用的时候,先初始化,然后就可以用这个函数绘制鼠标啦
- void putblock8_8(char *vram, int vxsize, int pxsize,
- int pysize, int px0, int py0, char *buf, int bxsize)
- {
- int x, y;
- for (y = ; y < pysize; y++) {
- for (x = ; x < pxsize; x++) {
- vram[(py0 + y) * vxsize + (px0 + x)] = buf[y * bxsize + x];
- }
- }
- return;
- }
graphic.c
PS: 设置调色板,显示字符串,绘制矩形,绘制鼠标,绘制窗口,总之和VRAM相关的函数
- /* the part of interrupt */
- #include "bootpack.h"
- #include <stdio.h>
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:中断初始化函数
- //参数:无
- void init_pic(void)
- /* PIC(programmable interrupt controller) initialize */
- {
- io_out8(PIC0_IMR, 0xff ); /* disabled all interrupts */
- io_out8(PIC1_IMR, 0xff ); /* disabled all interrupts */
- io_out8(PIC0_ICW1, 0x11 ); /* edge trigger mode */
- io_out8(PIC0_ICW2, 0x20 ); /* IRQ0-7 are received by INT20-27 */
- io_out8(PIC0_ICW3, << ); /* PIC1 is connected by IRQ2 */
- io_out8(PIC0_ICW4, 0x01 ); /* unbuffered mode */
- io_out8(PIC1_ICW1, 0x11 ); /* edge trigger mode */
- io_out8(PIC1_ICW2, 0x28 ); /* IRQ8-15 are received by INT28-2f */
- io_out8(PIC1_ICW3, ); /* PIC1 is connnected by IRQ2 */
- io_out8(PIC1_ICW4, 0x01 ); /* unbuffered mode */
- io_out8(PIC0_IMR, 0xfb ); /* 11111011 disable all interrupts except PIC1 */
- io_out8(PIC1_IMR, 0xff ); /* 11111111 disable all interrupts */
- return;
- }
- // -----------------------------------------------------------------------------------
- //鼠标和键盘中断处理函数
- //鼠标是IRQ12,键盘是IRQ1,所以我们编写INT 0x2c和INT 0x21的中断处理程序(handler),即中断处理程序
- //-----------------------------------------------------------------------------------
- #define PORT_KEYDAT 0x0060
- struct FIFO8 keyfifo;
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:PS/2的键盘中断,一会在汇编中调用这个函数实现真正的中断:_asm_inthandler21
- void inthandler21(int *esp)
- {
- unsigned char data;
- io_out8(PIC0_OCW2, 0x61); /* IRQ-01受付完了をPICに通知 */
- data = io_in8(PORT_KEYDAT);
- fifo8_put(&keyfifo, data);//将数据放进缓冲区
- return;
- }
- struct FIFO8 mousefifo;
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:PS/2的鼠标中断,一会在汇编中调用这个函数实现真正的中断:_asm_inthandler2c
- void inthandler2c(int *esp)
- {
- unsigned char data;
- io_out8(PIC1_OCW2, 0x64); /* IRQ-12受付完了をPIC1に通知 */
- io_out8(PIC0_OCW2, 0x62); /* IRQ-02受付完了をPIC0に通知 */
- data = io_in8(PORT_KEYDAT);
- fifo8_put(&mousefifo, data); //将数据放进缓冲区
- return;
- }
- void inthandler27(int *esp)
- {
- io_out8(PIC0_OCW2, 0x67); /* IRQ-07受付完了をPICに通知 */
- return;
- }
int.c
PS: 中断句柄函数,但是这些并不是中断真正入口,真正入口是对应汇编函数,这些函数只是对应汇编函数要调用的~这些函数包括鼠标中断和键盘中断,因为为了加速,所以要把收到的数据放进FIFO缓冲区,防止因为在中断中进行大量的处理而影响速度~
- /* FIFO用来存放鼠标和键盘信息的链表
- 其实就是用数组实现的循环链表,这里原著处理的不好,
- 建议用数据结构里的知识来处理 */
- #include "bootpack.h"
- #define FLAGS_OVERRUN 0x0001
- /////////////////////////////////////////////////////////////////////////////////////
- //功能:缓冲区初始化
- //参数:缓冲区结构体指针,大小,缓冲区开始位置
- void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
- {
- fifo->size = size;
- fifo->buf = buf;
- fifo->free = size;
- fifo->flags = ;
- fifo->p = ;
- fifo->q = ;
- return;
- }
- //往缓冲区内插入一个数据
- int fifo8_put(struct FIFO8 *fifo, unsigned char data)
- {
- if (fifo->free == ) {//溢出
- fifo->flags |= FLAGS_OVERRUN;
- return -;
- }
- fifo->buf[fifo->p] = data;
- fifo->p++;
- if (fifo->p == fifo->size) {//当插入位置到达最后时再返回第一个位置
- fifo->p = ;
- }
- fifo->free--;
- return ;
- }
- //从缓冲区取出一个数据
- int fifo8_get(struct FIFO8 *fifo)
- {
- int data;
- if (fifo->free == fifo->size) {//没有数据
- return -;
- }
- data = fifo->buf[fifo->q];
- fifo->q++;
- if (fifo->q == fifo->size) {//如果取出数据的位置到达最后了就从第一个位置开始
- fifo->q = ;
- }
- fifo->free++;
- return data;
- }
- //获取缓冲区状态,数据量
- int fifo8_status(struct FIFO8 *fifo)
- {
- return fifo->size - fifo->free;
- }
fifo.c
PS: 就是个简单的用数组的形式建立的FIFO循环链表,建议看一下那个经典的黑色的数据结构的书,上面讲的很好,甚至有自动增加大小的循环链表,这个数据结构主要用来存放鼠标和键盘的信息~
- OSASK偺敿妏僼僅儞僩傪棳梡
- char 0x00
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x01
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.*.*.*.
- *.*.*.*.
- *.....*.
- *.....*.
- *.*.*.*.
- *..*..*.
- .*...*..
- ..***...
- ........
- ........
- ........
- char 0x02
- ........
- ........
- ..***...
- .*****..
- *******.
- **.*.**.
- **.*.**.
- *******.
- *******.
- **.*.**.
- ***.***.
- .*****..
- ..***...
- ........
- ........
- ........
- char 0x03
- ........
- ........
- ........
- ........
- .**.**..
- *******.
- *******.
- *******.
- .*****..
- ..***...
- ...*....
- ........
- ........
- ........
- ........
- ........
- char 0x04
- ........
- ........
- ........
- ........
- ...*....
- ..***...
- .*****..
- *******.
- .*****..
- ..***...
- ...*....
- ........
- ........
- ........
- ........
- ........
- char 0x05
- ........
- ........
- ........
- ........
- ...*....
- ..***...
- .*.*.*..
- *******.
- .*.*.*..
- ...*....
- ..***...
- ........
- ........
- ........
- ........
- ........
- char 0x06
- ........
- ........
- ........
- ........
- ...*....
- ..***...
- .*****..
- *******.
- **.*.**.
- ...*....
- ..***...
- ........
- ........
- ........
- ........
- ........
- char 0x07
- ........
- ........
- ........
- ........
- ........
- ........
- ...**...
- ..****..
- ..****..
- ...**...
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x08
- ********
- ********
- ********
- ********
- ********
- ********
- ***..***
- **....**
- **....**
- ***..***
- ********
- ********
- ********
- ********
- ********
- ********
- char 0x09
- ........
- ........
- ........
- ........
- ........
- ..****..
- .**..**.
- .*....*.
- .*....*.
- .**..**.
- ..****..
- ........
- ........
- ........
- ........
- ........
- char 0x0a
- ********
- ********
- ********
- ********
- ********
- **....**
- *..**..*
- *.****.*
- *.****.*
- *..**..*
- **....**
- ********
- ********
- ********
- ********
- ********
- char 0x0b
- ........
- ...*....
- ..***...
- .*.*.*..
- *..*..*.
- ...*....
- ...*....
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x0c
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ...*....
- ...*....
- *******.
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x0d
- ........
- ........
- ....**..
- ....***.
- ....*.**
- ....*.**
- ....*.*.
- ....*...
- ....*...
- ...**...
- .****...
- *****...
- .***....
- ........
- ........
- ........
- char 0x0e
- ........
- ........
- ...*****
- ...*****
- ...*...*
- ...*...*
- ...*...*
- ...*...*
- ...*...*
- ...*...*
- .***.***
- ********
- .**..**.
- ........
- ........
- ........
- char 0x0f
- ........
- ........
- ........
- ........
- ...*....
- .*.*.*..
- ..***...
- ..*.*...
- ..***...
- .*.*.*..
- ...*....
- ........
- ........
- ........
- ........
- ........
- char 0x10
- ........
- *.......
- **......
- ***.....
- ****....
- *****...
- ******..
- *******.
- ******..
- *****...
- ****....
- ***.....
- **......
- *.......
- ........
- ........
- char 0x11
- ........
- ......*.
- .....**.
- ....***.
- ...****.
- ..*****.
- .******.
- *******.
- .******.
- ..*****.
- ...****.
- ....***.
- .....**.
- ......*.
- ........
- ........
- char 0x12
- ........
- ........
- ...*....
- ..***...
- .*.*.*..
- *..*..*.
- ...*....
- ...*....
- ...*....
- *..*..*.
- .*.*.*..
- ..***...
- ...*....
- ........
- ........
- ........
- char 0x13
- ........
- ........
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- ........
- ........
- .*...*..
- .*...*..
- ........
- ........
- char 0x14
- ........
- ..*****.
- .*..*.*.
- *...*.*.
- *...*.*.
- *...*.*.
- *...*.*.
- .*..*.*.
- ..***.*.
- ....*.*.
- ....*.*.
- ....*.*.
- ....*.*.
- ....*.*.
- ........
- ........
- char 0x15
- .*****..
- *.....*.
- .*......
- ..*.....
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ....*...
- .....*..
- *.....*.
- .*****..
- ........
- char 0x16
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- *******.
- *******.
- ........
- ........
- char 0x17
- ........
- ........
- ...*....
- ..***...
- .*.*.*..
- *..*..*.
- ...*....
- ...*....
- ...*....
- *..*..*.
- .*.*.*..
- ..***...
- ...*....
- .*****..
- ........
- ........
- char 0x18
- ........
- ...*....
- ..***...
- .*.*.*..
- *..*..*.
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x19
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- *..*..*.
- .*.*.*..
- ..***...
- ...*....
- ........
- ........
- char 0x1a
- ........
- ........
- ........
- ........
- ...*....
- ....*...
- .....*..
- *******.
- .....*..
- ....*...
- ...*....
- ........
- ........
- ........
- ........
- ........
- char 0x1b
- ........
- ........
- ........
- ........
- ...*....
- ..*.....
- .*......
- *******.
- .*......
- ..*.....
- ...*....
- ........
- ........
- ........
- ........
- ........
- char 0x1c
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *.......
- *.......
- *******.
- ........
- ........
- char 0x1d
- ........
- ........
- ........
- ........
- ........
- ..*.*...
- .*...*..
- *******.
- .*...*..
- ..*.*...
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x1e
- ........
- ........
- ........
- ........
- ...*....
- ...*....
- ..***...
- ..***...
- .*****..
- .*****..
- *******.
- *******.
- ........
- ........
- ........
- ........
- char 0x1f
- ........
- ........
- ........
- ........
- *******.
- *******.
- .*****..
- .*****..
- ..***...
- ..***...
- ...*....
- ...*....
- ........
- ........
- ........
- ........
- char 0x20
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x21
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- ...*....
- ...*....
- ........
- ........
- char 0x22
- ..*.*...
- ..*.*...
- ..*.*...
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x23
- ........
- .*...*..
- .*...*..
- .*...*..
- *******.
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- .*...*..
- *******.
- .*...*..
- .*...*..
- .*...*..
- ........
- ........
- char 0x24
- ...*....
- ..***.*.
- .*.*.**.
- *..*..*.
- *..*..*.
- *..*....
- .*.*....
- ..***...
- ...*.*..
- ...*..*.
- *..*..*.
- *..*..*.
- **.*.*..
- *.***...
- ...*....
- ...*....
- char 0x25
- .**...*.
- *..*..*.
- *..*.*..
- *..*.*..
- .**.*...
- ....*...
- ...*....
- ...*....
- ..*.....
- ..*.**..
- .*.*..*.
- .*.*..*.
- *..*..*.
- *...**..
- ........
- ........
- char 0x26
- ........
- .***....
- *...*...
- *...*...
- *...*...
- *..*....
- .**.....
- .*...***
- *.*...*.
- *..*..*.
- *...*.*.
- *....*..
- .*...**.
- ..***..*
- ........
- ........
- char 0x27
- .....*..
- ....*...
- ...*....
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x28
- ......*.
- .....*..
- ....*...
- ....*...
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ....*...
- ....*...
- .....*..
- ......*.
- ........
- char 0x29
- *.......
- .*......
- ..*.....
- ..*.....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ..*.....
- ..*.....
- .*......
- *.......
- ........
- char 0x2a
- ........
- ........
- ........
- ........
- ........
- ...*....
- *..*..*.
- .*.*.*..
- ..***...
- .*.*.*..
- *..*..*.
- ...*....
- ........
- ........
- ........
- ........
- char 0x2b
- ........
- ........
- ........
- ........
- ........
- ...*....
- ...*....
- ...*....
- *******.
- ...*....
- ...*....
- ...*....
- ........
- ........
- ........
- ........
- char 0x2c
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ....*...
- ....*...
- ...*....
- char 0x2d
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x2e
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ........
- ........
- char 0x2f
- ......*.
- ......*.
- .....*..
- .....*..
- ....*...
- ....*...
- ....*...
- ...*....
- ...*....
- ..*.....
- ..*.....
- .*......
- .*......
- .*......
- *.......
- *.......
- char 0x30
- ........
- ...**...
- ..*..*..
- ..*..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ..*..*..
- ...**...
- ........
- ........
- char 0x31
- ........
- ....*...
- ...**...
- ..*.*...
- ....*...
- ....*...
- ....*...
- ....*...
- ....*...
- ....*...
- ....*...
- ....*...
- ....*...
- ..*****.
- ........
- ........
- char 0x32
- ........
- ...**...
- ..*..*..
- .*....*.
- .*....*.
- ......*.
- .....*..
- ....*...
- ...*....
- ..*.....
- ..*.....
- .*......
- .*......
- .******.
- ........
- ........
- char 0x33
- ........
- ...**...
- ..*..*..
- .*....*.
- ......*.
- ......*.
- .....*..
- ...**...
- .....*..
- ......*.
- ......*.
- .*....*.
- ..*..*..
- ...**...
- ........
- ........
- char 0x34
- ........
- ....**..
- ....**..
- ....**..
- ...*.*..
- ...*.*..
- ...*.*..
- ..*..*..
- ..*..*..
- .*...*..
- .******.
- .....*..
- .....*..
- ...****.
- ........
- ........
- char 0x35
- ........
- .*****..
- .*......
- .*......
- .*......
- .*.**...
- .**..*..
- ......*.
- ......*.
- ......*.
- ......*.
- .*....*.
- ..*..*..
- ...**...
- ........
- ........
- char 0x36
- ........
- ...**...
- ..*..*..
- .*....*.
- .*......
- .*.**...
- .**..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ...**...
- ........
- ........
- char 0x37
- ........
- .******.
- .*....*.
- .*....*.
- .....*..
- .....*..
- ....*...
- ....*...
- ....*...
- ...*....
- ...*....
- ...*....
- ...*....
- ..***...
- ........
- ........
- char 0x38
- ........
- ...**...
- ..*..*..
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ...**...
- ..*..*..
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ...**...
- ........
- ........
- char 0x39
- ........
- ...**...
- ..*..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ..*..**.
- ...**.*.
- ......*.
- .*....*.
- ..*..*..
- ...**...
- ........
- ........
- char 0x3a
- ........
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ........
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ........
- ........
- char 0x3b
- ........
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ........
- ........
- ........
- ........
- ...**...
- ...**...
- ....*...
- ....*...
- ...*....
- char 0x3c
- ........
- ......*.
- .....*..
- ....*...
- ...*....
- ..*.....
- .*......
- *.......
- *.......
- .*......
- ..*.....
- ...*....
- ....*...
- .....*..
- ......*.
- ........
- char 0x3d
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- ........
- ........
- *******.
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x3e
- ........
- *.......
- .*......
- ..*.....
- ...*....
- ....*...
- .....*..
- ......*.
- ......*.
- .....*..
- ....*...
- ...*....
- ..*.....
- .*......
- *.......
- ........
- char 0x3f
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- .....*..
- ....*...
- ...*....
- ...*....
- ........
- ........
- ...**...
- ...**...
- ........
- ........
- char 0x40
- ........
- ..***...
- .*...*..
- *.....*.
- *..**.*.
- *.*.*.*.
- *.*.*.*.
- *.*.*.*.
- *.*.*.*.
- *.*.*.*.
- *..***..
- *.......
- .*...**.
- ..***...
- ........
- ........
- char 0x41
- ........
- ...**...
- ...**...
- ...**...
- ...**...
- ..*..*..
- ..*..*..
- ..*..*..
- ..*..*..
- .******.
- .*....*.
- .*....*.
- .*....*.
- ***..***
- ........
- ........
- char 0x42
- ........
- ****....
- .*..*...
- .*...*..
- .*...*..
- .*...*..
- .*..*...
- .****...
- .*...*..
- .*....*.
- .*....*.
- .*....*.
- .*...*..
- *****...
- ........
- ........
- char 0x43
- ........
- ..***.*.
- .*...**.
- .*....*.
- *.....*.
- *.......
- *.......
- *.......
- *.......
- *.......
- *.....*.
- .*....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x44
- ........
- *****...
- .*...*..
- .*...*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*...*..
- .*...*..
- *****...
- ........
- ........
- char 0x45
- ........
- *******.
- .*....*.
- .*....*.
- .*......
- .*......
- .*...*..
- .*****..
- .*...*..
- .*......
- .*......
- .*....*.
- .*....*.
- *******.
- ........
- ........
- char 0x46
- ........
- *******.
- .*....*.
- .*....*.
- .*......
- .*......
- .*...*..
- .*****..
- .*...*..
- .*...*..
- .*......
- .*......
- .*......
- ****....
- ........
- ........
- char 0x47
- ........
- ..***.*.
- .*...**.
- .*....*.
- *.....*.
- *.......
- *.......
- *..****.
- *.....*.
- *.....*.
- *.....*.
- .*....*.
- .*...**.
- ..***...
- ........
- ........
- char 0x48
- ........
- ***..***
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .******.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ***..***
- ........
- ........
- char 0x49
- ........
- .*****..
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- .*****..
- ........
- ........
- char 0x4a
- ........
- ...*****
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- *....*..
- .*..*...
- ..**....
- ........
- char 0x4b
- ........
- ***..***
- .*....*.
- .*...*..
- .*..*...
- .*.*....
- .*.*....
- .**.....
- .*.*....
- .*.*....
- .*..*...
- .*...*..
- .*....*.
- ***..***
- ........
- ........
- char 0x4c
- ........
- ****....
- .*......
- .*......
- .*......
- .*......
- .*......
- .*......
- .*......
- .*......
- .*......
- .*....*.
- .*....*.
- *******.
- ........
- ........
- char 0x4d
- ........
- **....**
- .*....*.
- .**..**.
- .**..**.
- .**..**.
- .*.**.*.
- .*.**.*.
- .*.**.*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ***..***
- ........
- ........
- char 0x4e
- ........
- **...***
- .*....*.
- .**...*.
- .**...*.
- .*.*..*.
- .*.*..*.
- .*.*..*.
- .*..*.*.
- .*..*.*.
- .*..*.*.
- .*...**.
- .*...**.
- ***...*.
- ........
- ........
- char 0x4f
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x50
- ........
- *****...
- .*...*..
- .*....*.
- .*....*.
- .*....*.
- .*...*..
- .****...
- .*......
- .*......
- .*......
- .*......
- .*......
- ****....
- ........
- ........
- char 0x51
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *..*..*.
- *...*.*.
- .*...*..
- ..***.*.
- ........
- ........
- char 0x52
- ........
- ******..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*****..
- .*...*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ***..***
- ........
- ........
- char 0x53
- ........
- ..***.*.
- .*...**.
- *.....*.
- *.....*.
- *.......
- .*......
- ..***...
- .....*..
- ......*.
- *.....*.
- *.....*.
- **...*..
- *.***...
- ........
- ........
- char 0x54
- ........
- *******.
- *..*..*.
- *..*..*.
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- .*****..
- ........
- ........
- char 0x55
- ........
- ***..***
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ..****..
- ........
- ........
- char 0x56
- ........
- ***..***
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ..*..*..
- ..*..*..
- ..*..*..
- ...**...
- ...**...
- ...**...
- ...**...
- ........
- ........
- char 0x57
- ........
- ***..***
- .*....*.
- .*....*.
- .*....*.
- .*.**.*.
- .*.**.*.
- .*.**.*.
- .*.**.*.
- ..*..*..
- ..*..*..
- ..*..*..
- ..*..*..
- ..*..*..
- ........
- ........
- char 0x58
- ........
- ***..***
- .*....*.
- .*....*.
- ..*..*..
- ..*..*..
- ..*..*..
- ...**...
- ..*..*..
- ..*..*..
- ..*..*..
- .*....*.
- .*....*.
- ***..***
- ........
- ........
- char 0x59
- ........
- ***.***.
- .*...*..
- .*...*..
- .*...*..
- ..*.*...
- ..*.*...
- ..*.*...
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- .*****..
- ........
- ........
- char 0x5a
- ........
- *******.
- *....*..
- *....*..
- ....*...
- ....*...
- ...*....
- ...*....
- ..*.....
- ..*.....
- .*......
- .*....*.
- *.....*.
- *******.
- ........
- ........
- char 0x5b
- ........
- ..*****.
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*.....
- ..*****.
- ........
- char 0x5c
- *.......
- *.......
- .*......
- .*......
- ..*.....
- ..*.....
- ..*.....
- ...*....
- ...*....
- ....*...
- ....*...
- .....*..
- .....*..
- .....*..
- ......*.
- ......*.
- char 0x5d
- ........
- .*****..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .*****..
- ........
- char 0x5e
- ........
- ...*....
- ..*.*...
- .*...*..
- *.....*.
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x5f
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- ........
- char 0x60
- ...*....
- ....*...
- .....*..
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x61
- ........
- ........
- ........
- ........
- ........
- .***....
- ....*...
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- *...**..
- .***.**.
- ........
- ........
- char 0x62
- **......
- .*......
- .*......
- .*......
- .*......
- .*.**...
- .**..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .**..*..
- .*.**...
- ........
- ........
- char 0x63
- ........
- ........
- ........
- ........
- ........
- ..**....
- .*..**..
- *....*..
- *....*..
- *.......
- *.......
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x64
- ....**..
- .....*..
- .....*..
- .....*..
- .....*..
- ..**.*..
- .*..**..
- *....*..
- *....*..
- *....*..
- *....*..
- *....*..
- .*..**..
- ..**.**.
- ........
- ........
- char 0x65
- ........
- ........
- ........
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- ******..
- *.......
- *.....*.
- .*....*.
- ..****..
- ........
- ........
- char 0x66
- ....***.
- ...*....
- ...*....
- ...*....
- ...*....
- .*****..
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- .*****..
- ........
- ........
- char 0x67
- ........
- ........
- ........
- ........
- ........
- ..**.**.
- .*..**..
- *....*..
- *....*..
- *....*..
- *....*..
- .*..**..
- ..**.*..
- .....*..
- .....*..
- .****...
- char 0x68
- **......
- .*......
- .*......
- .*......
- .*......
- .*.**...
- .**..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ***...**
- ........
- ........
- char 0x69
- ........
- ...*....
- ...*....
- ........
- ........
- ..**....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ..***...
- ........
- ........
- char 0x6a
- ........
- .....*..
- .....*..
- ........
- ........
- ....**..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- .....*..
- ....*...
- ....*...
- ..**....
- char 0x6b
- **......
- .*......
- .*......
- .*......
- .*......
- .*..***.
- .*...*..
- .*..*...
- .*.*....
- .**.....
- .*.*....
- .*..*...
- .*...*..
- ***..**.
- ........
- ........
- char 0x6c
- ..**....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ..***...
- ........
- ........
- char 0x6d
- ........
- ........
- ........
- ........
- ........
- ****.**.
- .*..*..*
- .*..*..*
- .*..*..*
- .*..*..*
- .*..*..*
- .*..*..*
- .*..*..*
- **.**.**
- ........
- ........
- char 0x6e
- ........
- ........
- ........
- ........
- ........
- **.**...
- .**..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- ***...**
- ........
- ........
- char 0x6f
- ........
- ........
- ........
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x70
- ........
- ........
- ........
- ........
- ........
- **.**...
- .**..*..
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .**..*..
- .*.**...
- .*......
- ***.....
- char 0x71
- ........
- ........
- ........
- ........
- ........
- ..**.*..
- .*..**..
- *....*..
- *....*..
- *....*..
- *....*..
- *....*..
- .*..**..
- ..**.*..
- .....*..
- ....***.
- char 0x72
- ........
- ........
- ........
- ........
- ........
- **.***..
- .**...*.
- .*....*.
- .*......
- .*......
- .*......
- .*......
- .*......
- ***.....
- ........
- ........
- char 0x73
- ........
- ........
- ........
- ........
- ........
- .****.*.
- *....**.
- *.....*.
- **......
- ..***...
- .....**.
- *.....*.
- **....*.
- *.****..
- ........
- ........
- char 0x74
- ........
- ........
- ...*....
- ...*....
- ...*....
- .*****..
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ....***.
- ........
- ........
- char 0x75
- ........
- ........
- ........
- ........
- ........
- **...**.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*....*.
- .*...**.
- ..***.**
- ........
- ........
- char 0x76
- ........
- ........
- ........
- ........
- ........
- ***..***
- .*....*.
- .*....*.
- .*....*.
- ..*..*..
- ..*..*..
- ..*..*..
- ...**...
- ...**...
- ........
- ........
- char 0x77
- ........
- ........
- ........
- ........
- ........
- ***..***
- .*....*.
- .*....*.
- .*.**.*.
- .*.**.*.
- .*.**.*.
- ..*..*..
- ..*..*..
- ..*..*..
- ........
- ........
- char 0x78
- ........
- ........
- ........
- ........
- ........
- **...**.
- .*...*..
- ..*.*...
- ..*.*...
- ...*....
- ..*.*...
- ..*.*...
- .*...*..
- **...**.
- ........
- ........
- char 0x79
- ........
- ........
- ........
- ........
- ........
- ***..***
- .*....*.
- .*....*.
- ..*..*..
- ..*..*..
- ..*..*..
- ...**...
- ...**...
- ...*....
- ...*....
- .**.....
- char 0x7a
- ........
- ........
- ........
- ........
- ........
- *******.
- *.....*.
- *....*..
- ....*...
- ...*....
- ..*.....
- .*....*.
- *.....*.
- *******.
- ........
- ........
- char 0x7b
- ........
- .....**.
- ....*...
- ...*....
- ...*....
- ...*....
- ...*....
- .**.....
- ...*....
- ...*....
- ...*....
- ...*....
- ....*...
- .....**.
- ........
- ........
- char 0x7c
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0x7d
- ........
- .**.....
- ...*....
- ....*...
- ....*...
- ....*...
- ....*...
- .....**.
- ....*...
- ....*...
- ....*...
- ....*...
- ...*....
- .**.....
- ........
- ........
- char 0x7e
- ........
- .***..*.
- *...**..
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0x7f
- ........
- ........
- ........
- ........
- ...*....
- ..*.*...
- .*...*..
- *.....*.
- *******.
- *.....*.
- *******.
- ........
- ........
- ........
- ........
- ........
- char 0x80
- ........
- ..***...
- .*...*..
- *.....*.
- *.......
- *.......
- *.......
- *.......
- *.......
- *.......
- *.......
- *.....*.
- .*...*..
- ..***...
- ...*....
- ..*.....
- char 0x81
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*....*.
- ..*****.
- ........
- ........
- char 0x82
- ....**..
- ....*...
- ...*....
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *******.
- *.......
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x83
- ........
- ...*....
- ..*.*...
- .*...*..
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- ........
- char 0x84
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- ........
- char 0x85
- ...*....
- ....*...
- .....*..
- ........
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- ........
- char 0x86
- ........
- ...**...
- ..*..*..
- ...**...
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- ........
- char 0x87
- ........
- ........
- ........
- ........
- ........
- ..****..
- .*....*.
- *.......
- *.......
- *.......
- *.......
- *.......
- .*....*.
- ..****..
- ....*...
- ...*....
- char 0x88
- ........
- ...*....
- ..*.*...
- .*...*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *******.
- *.......
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x89
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *******.
- *.......
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x8a
- ...*....
- ....*...
- .....*..
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *******.
- *.......
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x8b
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x8c
- ........
- ...*....
- ..*.*...
- .*...*..
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x8d
- ...*....
- ....*...
- .....*..
- ........
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x8e
- ..*..*..
- ..*..*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *******.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- ........
- ........
- char 0x8f
- ........
- ..***...
- .*...*..
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *******.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- ........
- ........
- char 0x90
- ....**..
- ....*...
- ...*....
- *******.
- *.......
- *.......
- *.......
- *.......
- *****...
- *.......
- *.......
- *.......
- *.......
- *******.
- ........
- ........
- char 0x91
- ........
- ........
- ........
- ........
- ........
- .**.....
- ...***..
- ...*..*.
- .***..*.
- *..****.
- *..*....
- *..*....
- *..*..*.
- .**.**..
- ........
- ........
- char 0x92
- ....**..
- ...*....
- ..*.....
- ..*.*...
- ..*.*...
- ..*.*...
- *******.
- ..*.*...
- ..*.*...
- ..*.*...
- ..*.*...
- ..*.*...
- ..*.*...
- ..*.*...
- ........
- ........
- char 0x93
- ........
- ...*....
- ..*.*...
- .*...*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x94
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x95
- ...*....
- ....*...
- .....*..
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x96
- ........
- ...*....
- ..*.*...
- .*...*..
- ........
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*....*.
- ..*****.
- ........
- ........
- char 0x97
- ...*....
- ....*...
- .....*..
- ........
- ........
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*....*.
- ..*****.
- ........
- ........
- char 0x98
- ........
- ........
- ..*..*..
- ..*..*..
- ........
- *.....*.
- *.....*.
- .*...*..
- .*...*..
- ..*.*...
- ..*.*...
- ...*....
- ...*....
- ..*.....
- ..*.....
- .*......
- char 0x99
- ..*..*..
- ..*..*..
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x9a
- ..*..*..
- ..*..*..
- ........
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0x9b
- ........
- ..*.*...
- ..*.*...
- ..*.*...
- ..****..
- .**.*.*.
- *.*.*...
- *.*.*...
- *.*.*...
- *.*.*...
- *.*.*...
- .**.*.*.
- ..****..
- ..*.*...
- ..*.*...
- ..*.*...
- char 0x9c
- ........
- ....**..
- ...*..*.
- ..*.....
- ..*.....
- ..*.....
- ******..
- ..*.....
- ..*.....
- ..*.....
- .**.....
- *.*.....
- *.**..*.
- .*..**..
- ........
- ........
- char 0x9d
- ........
- *.....*.
- *.....*.
- .*...*..
- ..*.*...
- ...*....
- *******.
- ...*....
- ...*....
- *******.
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0x9e
- ........
- ***.....
- *..*....
- *...*...
- *...*...
- *...*...
- *..*.*..
- ***..*..
- *..*****
- *....*..
- *....*..
- *....*..
- *....*..
- *....*..
- ........
- ........
- char 0x9f
- ........
- ....**..
- ...*..*.
- ...*....
- ...*....
- ...*....
- *******.
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- *..*....
- .**.....
- ........
- ........
- char 0xa0
- ....**..
- ....*...
- ...*....
- ........
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- ........
- char 0xa1
- ....**..
- ....*...
- ...*....
- ........
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0xa2
- ....**..
- ....*...
- ...*....
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0xa3
- ....**..
- ....*...
- ...*....
- ........
- ........
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*....*.
- ..*****.
- ........
- ........
- char 0xa4
- ........
- ...*..*.
- ..*.*.*.
- ..*..*..
- ........
- *****...
- *....*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- ........
- ........
- char 0xa5
- ...*..*.
- ..*.*.*.
- ..*..*..
- ........
- *.....*.
- **....*.
- **....*.
- *.*...*.
- *..*..*.
- *..*..*.
- *...*.*.
- *....**.
- *....**.
- *.....*.
- ........
- ........
- char 0xa6
- ........
- ........
- ........
- .****...
- .....*..
- .....*..
- ..****..
- .*...*..
- *....*..
- *....*..
- .*...*..
- ..*****.
- ........
- *******.
- ........
- ........
- char 0xa7
- ........
- ........
- ........
- ..***...
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- *******.
- ........
- ........
- char 0xa8
- ........
- ...*....
- ...*....
- ........
- ........
- ...*....
- ...*....
- ..*.....
- .*...*..
- *.....*.
- *.....*.
- *.....*.
- .*...*..
- ..***...
- ........
- ........
- char 0xa9
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- *.......
- *.......
- *.......
- ........
- ........
- char 0xaa
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- *******.
- ......*.
- ......*.
- ......*.
- ........
- ........
- char 0xab
- ........
- ...*....
- ..**....
- ...*....
- ...*....
- ...*....
- ........
- *******.
- ........
- .****...
- .....*..
- ..***...
- .*......
- .*****..
- ........
- ........
- char 0xac
- ........
- ...*....
- ..**....
- ...*....
- ...*....
- ...*....
- ........
- *******.
- ........
- ...**...
- ..*.*...
- .*..*...
- .*****..
- ....*...
- ........
- ........
- char 0xad
- ........
- ...*....
- ...*....
- ........
- ........
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ........
- ........
- char 0xae
- ........
- ........
- ........
- ........
- ...*..*.
- ..*..*..
- .*..*...
- *..*....
- *..*....
- .*..*...
- ..*..*..
- ...*..*.
- ........
- ........
- ........
- ........
- char 0xaf
- ........
- ........
- ........
- ........
- *..*....
- .*..*...
- ..*..*..
- ...*..*.
- ...*..*.
- ..*..*..
- .*..*...
- *..*....
- ........
- ........
- ........
- ........
- char 0xb0
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- ...*...*
- .*...*..
- char 0xb1
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- .*.*.*.*
- *.*.*.*.
- char 0xb2
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- .***.***
- **.***.*
- char 0xb3
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xb4
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ****....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xb5
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ****....
- ...*....
- ****....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xb6
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xb7
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ******..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xb8
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ****....
- ...*....
- ****....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xb9
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.*..
- .....*..
- ****.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xba
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xbb
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ******..
- .....*..
- ****.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xbc
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.*..
- .....*..
- ******..
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xbd
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ******..
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xbe
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ****....
- ...*....
- ****....
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xbf
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ****....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xc0
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*****
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xc1
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xc2
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xc3
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*****
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xc4
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xc5
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ********
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xc6
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*****
- ...*....
- ...*****
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xc7
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xc8
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.***
- ...*....
- ...*****
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xc9
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...*****
- ...*....
- ...*.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xca
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.***
- ........
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xcb
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ........
- ****.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xcc
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.***
- ...*....
- ...*.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xcd
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ........
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xce
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.***
- ........
- ****.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xcf
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ********
- ........
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xd0
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xd1
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ........
- ********
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xd2
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xd3
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*****
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xd4
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*****
- ...*....
- ...*****
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xd5
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...*****
- ...*....
- ...*****
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xd6
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...*****
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xd7
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ****.***
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- ...*.*..
- char 0xd8
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ********
- ...*....
- ********
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xd9
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ****....
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xda
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ...*****
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- ...*....
- char 0xdb
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- char 0xdc
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- char 0xdd
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- ****....
- char 0xde
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- ....****
- char 0xdf
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ********
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe0
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe1
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe2
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe3
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe4
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe5
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe6
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe7
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe8
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xe9
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xea
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xeb
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xec
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xed
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xee
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xef
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf0
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf1
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf2
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf3
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf4
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf5
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf6
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf7
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf8
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xf9
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xfa
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xfb
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xfc
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xfd
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xfe
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- char 0xff
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
- ........
hankaku.txt
PS: 这就是个字库,对于硬件级工程,字库是必须的!为什么我们编辑器里选择字形时英文这么多,汉字这么少,是因为设计中文字库的人少,一方面劳动量大,另一方面没钱赚,所以我们有着丰富的书法文化却只有几个可怜的字形可以选择!
- ; naskfunc
- ; TAB=4
- [FORMAT "WCOFF"] ; 制成目标文件的形式
- [INSTRSET "i486p"] ; 使用486格式命令
- [BITS ] ; 制作32模式用的机器语言
- [FILE "naskfunc.nas"] ; 源文件名信息
- ; 程序中包含的函数名
- GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt
- GLOBAL _io_in8, _io_in16, _io_in32
- GLOBAL _io_out8, _io_out16, _io_out32
- GLOBAL _io_load_eflags, _io_store_eflags
- GLOBAL _load_gdtr, _load_idtr
- GLOBAL _asm_inthandler21, _asm_inthandler27, _asm_inthandler2c
- EXTERN _inthandler21, _inthandler27, _inthandler2c
- [SECTION .text] ; 目标文件中写了这些后再写程序
- _io_hlt: ; void io_hlt(void);
- HLT
- RET
- _io_cli: ; void io_cli(void);
- CLI
- RET
- _io_sti: ; void io_sti(void);
- STI
- RET
- _io_stihlt: ; void io_stihlt(void);
- STI
- HLT
- RET
- _io_in8: ; int io_in8(int port);
- MOV EDX,[ESP+] ; port
- MOV EAX,
- IN AL,DX
- RET
- _io_in16: ; int io_in16(int port);
- MOV EDX,[ESP+] ; port
- MOV EAX,
- IN AX,DX
- RET
- _io_in32: ; int io_in32(int port);
- MOV EDX,[ESP+] ; port
- IN EAX,DX
- RET
- _io_out8: ; void io_out8(int port, int data);
- MOV EDX,[ESP+] ; port
- MOV AL,[ESP+] ; data
- OUT DX,AL
- RET
- _io_out16: ; void io_out16(int port, int data);
- MOV EDX,[ESP+] ; port
- MOV EAX,[ESP+] ; data
- OUT DX,AX
- RET
- _io_out32: ; void io_out32(int port, int data);
- MOV EDX,[ESP+] ; port
- MOV EAX,[ESP+] ; data
- OUT DX,EAX
- RET
- _io_load_eflags: ; int io_load_eflags(void);
- PUSHFD ; PUSH EFLAGS という意味
- POP EAX
- RET
- _io_store_eflags: ; void io_store_eflags(int eflags);
- MOV EAX,[ESP+]
- PUSH EAX
- POPFD ; POP EFLAGS という意味
- RET
- _load_gdtr: ; void load_gdtr(int limit, int addr);
- MOV AX,[ESP+] ; limit
- MOV [ESP+],AX
- LGDT [ESP+]
- RET
- ;1) 这个函数用来指定的段上限和地址赋值给GDTR的48位寄存器,这是个很特殊的寄存器,并不能用MOV来直接赋值
- ;,唯一的方法就是指定一个内存地址,从指定的内存地址读取6字节(也就是48位),然后赋值给GDTR寄存器。完成这一任务的指令就是LGDT
- ;2) 该寄存器的低16位(即内存的最初的2个字节)是段上限,它等于“GDT的有效的字节数-1”,剩下的32位,代表GDT的开始地址
- ;3) 这里2个参数是ESP+4和ESP+8里存放,而我们要的是6字节形式的,所以要转换为我们想要的形式~
- _load_idtr: ; void load_idtr(int limit, int addr);
- MOV AX,[ESP+] ; limit
- MOV [ESP+],AX
- LIDT [ESP+]
- RET
- ;这个函数只是将寄存器的值保存在栈里,然后将DS和ES调整到与SS相等,再调用_inthandler21,返回后将所有寄存器的值再返回到原来的值,然后执行IRETD
- ;之所以如此小心翼翼地保护寄存器,原因在于,中断处理发生在函数处理途中,通过IREDT从中断处理后,寄存器就乱了
- _asm_inthandler21:
- PUSH ES
- PUSH DS
- PUSHAD
- MOV EAX,ESP
- PUSH EAX
- MOV AX,SS
- MOV DS,AX
- MOV ES,AX
- CALL _inthandler21
- POP EAX
- POPAD
- POP DS
- POP ES
- IRETD
- _asm_inthandler27:
- PUSH ES
- PUSH DS
- PUSHAD
- MOV EAX,ESP
- PUSH EAX
- MOV AX,SS
- MOV DS,AX
- MOV ES,AX
- CALL _inthandler27
- POP EAX
- POPAD
- POP DS
- POP ES
- IRETD
- _asm_inthandler2c:
- PUSH ES
- PUSH DS
- PUSHAD
- MOV EAX,ESP
- PUSH EAX
- MOV AX,SS
- MOV DS,AX
- MOV ES,AX
- CALL _inthandler2c
- POP EAX
- POPAD
- POP DS
- POP ES
- IRETD
naskfunc.nas
PS: 一些不能用c语言来完成的函数还得用汇编,于是就都放在这个文件里了~
3、效果说明:
>_<" 这里已经实现了文字显示,鼠标显示,键盘和鼠标信息的读取,其中涉及的知识有:GDT,IDT,中断,FIFO,VRAM,字库等,最终效果如下:
PS: 最上面显示鼠标当前位置,第二行左边显示按键信息,右边lcr显示鼠标点击事件(如果左边被点击l就变大写L,其他相同道理),后面两个数据是鼠标此次移动距离~
PS: 该系统的内存分布图:在文件asmhead.nas有详细注释
- 146 ;----------------------------------------------------------------------------------------------------
- 147 ;内存分配:
- 148 ; 0x00000000-0x000fffff:虽然在启动中会多次使用,但之后就会变空(1M)
- 149 ; 0x00100000-0x00267fff:用于保存软盘的内容(1440KB)
- 150 ; 0x00268000-0x0026f7ff:空(30KB)
- 151 ; 0x0026f800-0x0026ffff:IDT(2KB)
- 152 ; 0x00270000-0x0027ffff:GDT(64KB)
- 153 ; 0x00280000-0x002fffff:bootpack.hrb(512KB)
- 154 ; 0x00300000-0x003fffff:栈及其他(1MB)
- 155 ; 0x00400000- :空
- 156 ;----------------------------------------------------------------------------------------------------
LZ:http://www.cnblogs.com/zjutlitao/
[自制简单操作系统] 2、鼠标及键盘中断处理事件[PIC\GDT\IDT\FIFO]的更多相关文章
- [自制简单操作系统] 7、多任务(二)——任务管理自动化&任务休眠
前言 >_<" 这里仿照窗口管理的方式将任务管理也修改成相应的管理模式,这样可以灵活的添加多个任务,而不必每次都要修改任务切换函数:此外还在任务休眠做了尝试,通过将任务挂起和唤醒 ...
- [自制简单操作系统] 1、从0-1到汇编再到c语言的奥秘
目录: 1.用0-1编写最简单的操作系统 2.用汇编改写上面0-1程序 2.1 只用DB的汇编改写版 2.2 加入RESB汇编的改写版 2.3 进一步使用汇编替换0-1文件 2.4 核心程序也用 ...
- 操作系统开发系列—12.g.在内核中设置键盘中断
8259A虽然已经设置完成,但是我们还没有真正开始使用它呢. 所有的中断都会触发一个函数spurious_irq(),这个函数的定义如下: PUBLIC void spurious_irq(int i ...
- MFC--响应鼠标和键盘操作
一个程序最重要的部分之一是对鼠标和键盘操作的响应. 一. 理解鼠标事件.之前对鼠标事件的认识仅仅局限于处理控件的单击与双击事件.但实际鼠标的操作包含很多.这里将以一个画图的小程序讲解对鼠标的响应. ...
- [python] PyMouse、PyKeyboard用python操作鼠标和键盘
1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quart ...
- 50-用Python监听鼠标和键盘事件
转自:https://www.cnblogs.com/qiernonstop/p/3654021.html 用Python监听鼠标和键盘事件 PyHook是一个基于Python的“钩子”库,主要用于监 ...
- 用Python监听鼠标和键盘事件
PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所 ...
- C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是,在WPF中不能使用这个方法了. 我们知道,在 ...
- Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作
目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...
随机推荐
- 一个PHP日历程序
<?php //<-------处理通过GET方法提交的变量;开始--------> if($HTTP_GET_VARS[year]=="") { ...
- 【项目】搜索广告CTR预估(一)
本文介绍CTR相关基础知识. 一.广告投放系统 广告系统包含多个子系统.除了上图所示的广告投放系统外,还包含商业系统(广告库的获得),统计系统(点击展示日志的获得)等. 广告投放系统主要是面向用户的, ...
- pickle
[pickle] Python提供了pickle模块来实现序列化. 首先,我们尝试把一个对象序列化并写入文件: pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个by ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- 如何在十分钟内插入1亿条记录到Oracle数据库?
这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...
- Debussy与modelsim联仿时 do 文件脚本
quit -sim set PATH1 D:/Program/modelsim/vivado_lib set PATH2 D:/Program/Vivado/Vivado/2014.4/data/ve ...
- Unity3D手游开发日记(9) - 互动草的效果
所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...
- VS2013使用rtklib中需要注意的一些问题(编译)
最近因为项目需要需要对rtcm数据进行解码,rtklib提供了很多底层的函数,准备直接输出标准DLL的方式供C#调用.下面把项目中引用rtklib源码需要注意的地方记录下. 1. 首先在vs2013中 ...
- Oracle一个中文汉字占用几个字节
Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('language') from dual; 如 ...
- SQL语句一次INSERT多条记录的方法
1.SQL Server或MySQL中: INSERT INTO `userTable` (`user_id`, `user_name`) VALUES (, 'dsf'), (, 'fgy'), ( ...