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="" />

  1. OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj \
  2. int.obj fifo.obj
  3.  
  4. TOOLPATH = ../z_tools/
  5. INCPATH = ../z_tools/haribote/
  6.  
  7. MAKE = $(TOOLPATH)make.exe -r
  8. NASK = $(TOOLPATH)nask.exe
  9. CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
  10. GAS2NASK = $(TOOLPATH)gas2nask.exe -a
  11. OBJ2BIM = $(TOOLPATH)obj2bim.exe
  12. MAKEFONT = $(TOOLPATH)makefont.exe
  13. BIN2OBJ = $(TOOLPATH)bin2obj.exe
  14. BIM2HRB = $(TOOLPATH)bim2hrb.exe
  15. RULEFILE = $(TOOLPATH)haribote/haribote.rul
  16. EDIMG = $(TOOLPATH)edimg.exe
  17. IMGTOL = $(TOOLPATH)imgtol.com
  18. COPY = copy
  19. DEL = del
  20.  
  21. # 设置默认命令为产生img
  22.  
  23. default :
  24. $(MAKE) img
  25.  
  26. # 正常执行过程
  27. # 将ipl10.nas编译为ipl10.bin文件
  28. ipl10.bin : ipl10.nas Makefile
  29. $(NASK) ipl10.nas ipl10.bin ipl10.lst
  30.  
  31. # 将asmhead.asm编译为asmhead.bin
  32. asmhead.bin : asmhead.nas Makefile
  33. $(NASK) asmhead.nas asmhead.bin asmhead.lst
  34.  
  35. # 将字库hankaku.txt编译为hankaku.bin
  36. hankaku.bin : hankaku.txt Makefile
  37. $(MAKEFONT) hankaku.txt hankaku.bin
  38.  
  39. # 将字库转换为.obj
  40. hankaku.obj : hankaku.bin Makefile
  41. $(BIN2OBJ) hankaku.bin hankaku.obj _hankaku
  42.  
  43. # 将OBJS_BOOTPACK的obj编译为.bim映像文件,这里的前提条件是有OBJS_BOOTPACK,所以会自动执行把naskfunc.nas和其它.c文件编译为obj文件
  44. bootpack.bim : $(OBJS_BOOTPACK) Makefile
  45. $(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
  46. $(OBJS_BOOTPACK)
  47. # 3MB+64KB=3136KB
  48.  
  49. # 将bootpack.bim映像编译为.hrb文件
  50. bootpack.hrb : bootpack.bim Makefile
  51. $(BIM2HRB) bootpack.bim bootpack.hrb
  52.  
  53. # 将.hrb映像和asmhead.bin 合并做成haribote.sys系统文件
  54. haribote.sys : asmhead.bin bootpack.hrb Makefile
  55. copy /B asmhead.bin+bootpack.hrb haribote.sys
  56.  
  57. # 把ipl10.bin和haribote.sys结合做成操作系统文件haribote.img
  58. haribote.img : ipl10.bin haribote.sys Makefile
  59. $(EDIMG) imgin:../z_tools/fdimg0at.tek \
  60. wbinimg src:ipl10.bin len: from: to: \
  61. copy from:haribote.sys to:@: \
  62. imgout:haribote.img
  63.  
  64. # 对c文件进行编译
  65. # 把.c文件编译为.gas文件,需要.c bootpack.h 和 Makefile文件,然后调用cc1.exe进行处理
  66. %.gas : %.c bootpack.h Makefile
  67. $(CC1) -o $*.gas $*.c
  68.  
  69. # 把.gas文件转换为.nas文件,其他类似上面的说明
  70. %.nas : %.gas Makefile
  71. $(GAS2NASK) $*.gas $*.nas
  72.  
  73. # 把.nas转为.obj文件并输出.lst文件
  74. %.obj : %.nas Makefile
  75. $(NASK) $*.nas $*.obj $*.lst
  76.  
  77. # 根据不同的命令分别执行下面的情况,默认为img
  78.  
  79. img :
  80. $(MAKE) haribote.img
  81.  
  82. run :
  83. $(MAKE) img
  84. $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
  85. $(MAKE) -C ../z_tools/qemu
  86.  
  87. install :
  88. $(MAKE) img
  89. $(IMGTOL) w a: haribote.img
  90.  
  91. clean :
  92. -$(DEL) *.bin
  93. -$(DEL) *.lst
  94. -$(DEL) *.obj
  95. -$(DEL) bootpack.map
  96. -$(DEL) bootpack.bim
  97. -$(DEL) bootpack.hrb
  98. -$(DEL) haribote.sys
  99.  
  100. src_only :
  101. $(MAKE) clean
  102. -$(DEL) haribote.img

Makefile文件,负责编译全过程

>_<" 此外还需要一个make.bat的脚本程序,这样把相应的编译器和上面的文件放到对应的位置(参看Makefile文件),运行DOS窗口输入:make run就能直接编译,打包,导入,运行在虚拟机上了~为了在UE上调试方便,我把make run命令也写成了脚本.bat,这样可在UE中直接调试运行~

  1. ..\z_tools\make.exe % % % % % % % % %

make.bat

  1. @ECHO OFF
  2. cd/d C:\Users\LiTao\Desktop\30OS\aaaa\A20110738\tolset\副
  3. make run

脚本.bat[UE的高级,工具配置]


2、代码详解:

  1. ; haribote-ipl
  2. ; TAB=4
  3. CYLS EQU ; 定义读的柱面数
  4. ORG 0x7c00 ; 指明程序装载地址
  5.  
  6. ; 以下这段是FAT12格式软盘专用代码 0x7c00--0x7dff 125字节 用于启动区
  7. JMP entry
  8. DB 0x90
  9. DB "HARIBOTE" ; 启动区的名字可以是任意的,但必须是8字节
  10. DW ; 每个扇区(sector)的大小必须为512字节
  11. DB ; 簇(cluster)的大小必须为1个扇区
  12. DW ; FAT的起始位置(一般从第一个扇区开始)
  13. DB ; FAT的个数(必须为2)
  14. DW ; 根目录的大小(一般设为244项)
  15. DW ; 该磁盘的的大小(必须为2880扇区)
  16. DB 0xf0 ; 磁盘的种类(必须为0xfd)
  17. DW ; FAT的长度(必须为9扇区)
  18. DW ; 一个磁道(track)有几个扇区(必须为18)
  19. DW ; 磁头数(必须为2)
  20. DD ; 不使用分区(必须为0)
  21. DD ; 重写一次磁盘大小
  22. DB ,,0x29 ; 意义不明,固定
  23. DD 0xffffffff ; (可能是)卷标号码
  24. DB "HARIBOTEOS " ; 磁盘名称(11字节)
  25. DB "FAT12 " ; 磁盘格式名称(8字节)
  26. RESB ; 先腾出18字节
  27.  
  28. ; 程序核心
  29. entry:
  30. MOV AX, ; 初始化寄存器
  31. MOV SS,AX
  32. MOV SP,0x7c00
  33. MOV DS,AX
  34.  
  35. ; 读磁盘(从软盘中读数据装到内存中0x8200--0x83ff 125字节的地方)
  36. MOV AX,0x0820 ; ES:BX=缓冲地址
  37. MOV ES,AX
  38. MOV CH, ; 柱面0
  39. MOV DH, ; 磁头0
  40. MOV CL, ; 扇区2
  41. readloop:
  42. MOv SI, ; 记录失败次数的寄存器
  43. retry:
  44. MOV AH,0x02 ; AH=0x02 : 读盘
  45. MOV AL, ; 1个扇区
  46. MOV BX,
  47. MOV DL,0x00 ; A驱动器
  48. INT 0x13 ; 调用磁盘BIOS
  49. JNC next ; 没出错就跳转到next继续读下一个做准备
  50. ADD SI, ; SI++
  51. CMP SI, ; 比较SI5
  52. JAE error ; SI>=5时,跳转到error
  53. MOV AH,0x00
  54. MOV DL,0x00 ; A驱动器
  55. INT 0x13 ; 重置驱动器
  56. JMP retry
  57. next:
  58. MOV AX,ES ; 把内存地址后移0x200
  59. ADD AX,0x0020
  60. MOV ES,AX ; 因为没有ADD ES,0x200指令,所以这里绕个弯
  61. ADD CL, ; CL里加1 (所读扇区标号,开始是2,见初始化部分)
  62. CMP CL, ; 18比较
  63. JBE readloop ; 小于18就跳转到readloop继续读
  64. MOV CL, ; 扇区1
  65. ADD DH, ; 磁头+1
  66. CMP DH, ; 判断磁头是否超过2
  67. JB readloop ; 没有超过就继续读
  68. MOV DH, ; 超过2就转为0
  69. ADD CH, ; CH记录读取的柱面数
  70. CMP CH,CYLS ; CYLS在前面定义 CYLS EQU 10
  71. JB readloop
  72.  
  73. ; 磁盘内容装载内容的结束地址告诉haribote.sys
  74. MOV [0x0ff0],CH ; CYLS的值写到内存地址0x0ff0
  75. JMP 0xc200
  76.  
  77. error:
  78. MOV SI,msg ; 循环输出msg里面的内容
  79.  
  80. putloop:
  81. MOV AL,[SI]
  82. ADD SI, ; SI1
  83. CMP AL,
  84. JE fin
  85. MOV AH,0x0e ; 显示一个文字
  86. MOV BX, ; 指定字符颜色
  87. INT 0x10 ; 调用显卡BIOS
  88. JMP putloop
  89. fin:
  90. HLT ; CPU停止等待指令
  91. JMP fin ; 无限循环
  92.  
  93. msg:
  94. DB 0x0a, 0x0a ; 换行2
  95. DB "load error"
  96. DB 0x0a ; 换行
  97. DB
  98.  
  99. RESB 0x7dfe-$ ; 0x7dfe傑偱傪0x00偱杽傔傞柦椷
  100.  
  101. DB 0x55, 0xaa

ipl10.nas

PS: 负责读盘到内存,读完盘之后跳转到0xc200处,即asmhead.nas

  1. ; haribote-os boot asm
  2. ; TAB=4
  3.  
  4. BOTPAK EQU 0x00280000 ; bootpack的内存首址
  5. DSKCAC EQU 0x00100000 ;
  6. DSKCAC0 EQU 0x00008000 ;
  7.  
  8. ; BOOT_INFO相关
  9. CYLS EQU 0x0ff0 ; 设定启动区
  10. LEDS EQU 0x0ff1
  11. VMODE EQU 0x0ff2 ; 关于颜色的信息颜色的位数
  12. SCRNX EQU 0x0ff4 ; 分辨率X
  13. SCRNY EQU 0x0ff6 ; 分辨率Y
  14. VRAM EQU 0x0ff8 ; 图像缓冲区的开始地址
  15.  
  16. ORG 0xc200 ; 这个程序要装在到什么位置,在ipl10读盘结束的地方转到该处
  17.  
  18. MOV AL,0x13 ; VGA显卡,320X200X8位色彩
  19. MOV AH,0x00
  20. INT 0x10
  21. MOV BYTE [VMODE], ; 记录画面模式
  22. MOV WORD [SCRNX],
  23. MOV WORD [SCRNY],
  24. MOV DWORD [VRAM],0x000a0000
  25.  
  26. ; BIOS获得键盘上各种LED指示灯的状态
  27. MOV AH,0x02
  28. INT 0x16 ; keyboard BIOS
  29. MOV [LEDS],AL
  30.  
  31. ; PIC关闭一切中断
  32. ; 根据AT兼容机的规格,如果要初始化PIC(Programmable Interrupt Controller)
  33. ; 必须在CLI之前进行,否则有时会挂起
  34. ; 随后进行PIC的初始化
  35. ; 这段等价于:
  36. ; io_out8(PIC0_IMR,0xff);禁止主PIC的中断
  37. ; io_out8(PIC1_IMR,0xff);禁止从PIC的中断
  38. ; io_cli();禁止CPU级中断
  39.  
  40. MOV AL,0xff
  41. OUT 0x21,AL
  42. NOP ; 如果连续执行OUT指令有些机种会无法执行
  43. OUT 0xa1,AL
  44.  
  45. CLI ; 禁止CPU级别中断
  46.  
  47. ; 为了让CPU访问1MB以上的内存空间,设定A20GATE
  48. ; 相当于
  49. ; #define KEYCMD_WRITE_OUTPORT 0xd1
  50. ; #define KBC_OUTPORT_A20G_ENABLE 0xdf
  51. ; wait_KBC_sendready();
  52. ; io_out8(PORT_KEYCMD,KEYCMD_WRITE_OUTPORT);
  53. ; wait_KBC_sendready();
  54. ; io_out8(PORT_KEYDAT,KBC_OUTPORT_A20G_ENABLE);
  55. ; wait_KBC_sendready();
  56. ; 该程序和init_keyboard完全相同,仅仅是向键盘控制电路发送指令,这里发送的指令,是指令键盘控制电路的附属端口输出0xdf
  57. ; 这个附属端口,连接着主板上的很多地方,通过这个端口发送不同的命令,就可以实现各种各样的控制功能了
  58. ; 这次输出所要完成的功能,是让A20GATE信号变成ON状态,是让1MB以上的内存变成可用状态
  59.  
  60. CALL waitkbdout
  61. MOV AL,0xd1
  62. OUT 0x64,AL
  63. CALL waitkbdout
  64. MOV AL,0xdf ; enable A20
  65. OUT 0x60,AL
  66. CALL waitkbdout
  67.  
  68. ; 切换保护模式
  69. ; INSTRSET指令是为了386以后的LGDT,EAX,CR0
  70. ; LGDT指令把随意准备的GDT读出来,对于这个暂定的GDT我们今后还要重新设定,然后将CR0这一特殊的32位寄存器的值带入EAX
  71. ; 并将高位置0,低位置1,再将这个值返回给CR0,这就完成了模式转化,进入到不用颁的保护模式。
  72. ; CR0control register 0是一个非常重要的寄存器,只有操作系统才能操作它
  73. ; protected virtual address mode 受保护的虚拟内存地址模式,在该模式下,应用程序不能随便改变段的设定,又不能使用操作系统的段。操作系统受CPU保护
  74. ; 在保护模式中主要有受保护的16位模式和受保护的32位模式,我们要使用的是受保护的32位模式
  75. ; 在讲解CPU的书上会写到,通过带入CR0而切换到保护模式时,马上就执行JMP指令。所以我们也执行这一指令。为什么要jmp呢?因为变成保护模式后,机器语言的解释发生变化,
  76. ; CPU为了加快指令的执行速度而使用了管道(pipeline)这一机制,也就是说前一条指令还在执行时,就开始解释下一条甚至是再下一条指令,因为模式变了就要重新解释一遍,so..
  77. ; 而且在程序中,进入保护模式后,段寄存器的意思也变了(不是*16再加算的意思),除了CS以外所有的段寄存器的值都从0x0000变成了0x0008.CS保持不变是因为CS如果变了就乱了
  78. ; 所以只有CS要放到后面处理。这里的0x0008相当于gdt+1的段
  79.  
  80. [INSTRSET "i486p"] ; ”想要使用486指令"的叙述
  81.  
  82. LGDT [GDTR0] ; 设定临时的GDT(Global Descriptor Table)
  83. MOV EAX,CR0
  84. AND EAX,0x7fffffff ; 设bit31为0(为了禁止颁)
  85. OR EAX,0x00000001 ; 设bit0为1(为了切换保护模式)
  86. MOV CR0,EAX
  87. JMP pipelineflush
  88. pipelineflush:
  89. MOV AX,* ; 可读写的段32bit
  90. MOV DS,AX
  91. MOV ES,AX
  92. MOV FS,AX
  93. MOV GS,AX
  94. MOV SS,AX
  95.  
  96. ; bootpack传送
  97. ; 简单来说,这部分只是在调用memcpy函数(大概意思是:下面表达仅为了说明意思,可能不正确)
  98. ; memcpy(转送源地址 ,转送目的地址,转送数据大小);大小用双字,所以用字节/4、
  99. ; memcpy(bootpack ,BOTPAK ,512*1024/4 );//从bootpack的地址开始的512kb内容复制到0x00280000号地去[512kb比bootpack.hrb大很多]
  100. ; memcpy(0x7c00 ,DSKCAC ,512/4 );//从0x7c00复制512字节到0x10000000是将启动扇区复制到1MB以后的内存去,[启动区的0x00007c00-0x00007dff,125字节]
  101. ; memcpy(DSKCAC+512 ,DSKCAC+512 ,cyls*512*18*2/4-512/4);//从始于磁盘0x00008200的内容,复制到0x00100200内存去[从磁盘读取数据装到0x8200后的地方]
  102. ; bootpack是asmhead的最后一个标签,因为.sys是通过asmhead.bin和bootpack.hrb连接而成,所以asmhead结束的地方就是bootpack.hrb最开始地方
  103. MOV ESI,bootpack ; 转送源
  104. MOV EDI,BOTPAK ; 转送目的地
  105. MOV ECX,*/
  106. CALL memcpy
  107.  
  108. ; 磁盘的数据最终转送到它本来的位置去
  109.  
  110. ; 首先从启动扇区开始
  111.  
  112. MOV ESI,0x7c00 ; 转送源
  113. MOV EDI,DSKCAC ; 转送目的地
  114. MOV ECX,/
  115. CALL memcpy
  116.  
  117. ; 所有剩下的
  118.  
  119. MOV ESI,DSKCAC0+ ; 转送源
  120. MOV EDI,DSKCAC+ ; 转送目的地
  121. MOV ECX,
  122. MOV CL,BYTE [CYLS]
  123. IMUL ECX,**/ ; 从柱面数转为字节数/4
  124. SUB ECX,/ ; 减去IPL
  125. CALL memcpy
  126.  
  127. ; 必须由asmhead来完成,至此全部完毕
  128. ; 以后就交给bootpack来完成
  129.  
  130. ; bootpack的启动
  131. ; 还是执行memecpy程序,将bootpack.hrb第0x10c8字节开始的0x11a8字节复制到0x00310000号地址去
  132. ; 最后将0x310000代入到ESP中,然后用一个特殊的JMP指令,将2*8代入到CS里,同时移动到0x1b号地址,这里的0x1b是指第二个段的0x1b号地址
  133. ; 第2个段的基址是0x280000,所以是从0x28001b开始执行,即bootpack.hrb的0x1b号地址
  134. MOV EBX,BOTPAK
  135. MOV ECX,[EBX+]
  136. ADD ECX, ; ECX += 3;
  137. SHR ECX, ; ECX /= 4;
  138. JZ skip ; 没有要转送的东西时
  139. MOV ESI,[EBX+] ; 转送源
  140. ADD ESI,EBX
  141. MOV EDI,[EBX+] ; 转送目的地
  142. CALL memcpy
  143. skip:
  144. MOV ESP,[EBX+] ; 栈初始值
  145. JMP DWORD *:0x0000001b
  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. ;----------------------------------------------------------------------------------------------------
  157.  
  158. ; 和wait_KBC_sendready相同,但加入了0x60号设备进行IN处理,也就是如果控制器里有键盘代码,或已经积累了鼠标数据,就顺便读出来
  159. waitkbdout:
  160. IN AL,0x64
  161. AND AL,0x02
  162. JNZ waitkbdout ; AND偺寢壥偑0偱側偗傟偽waitkbdout傊
  163. RET
  164.  
  165. ; 复制程序
  166. memcpy:
  167. MOV EAX,[ESI]
  168. ADD ESI,
  169. MOV [EDI],EAX
  170. ADD EDI,
  171. SUB ECX,
  172. JNZ memcpy ; 减法运算的结果如果不是0,就跳转到memcpy
  173. RET
  174.  
  175. ; GDT0也是一种特定的GDT,0是空区域(null sector),不能在那里定义段,1号和2号分别由下式设定:
  176. ; set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, AR_DATA32_RW);//设定全局段
  177. ; set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);//设定bootpack512字节的段
  178.  
  179. ALIGNB ;一直添加DBO,直到地址能被16整除,如果GDT0地址不是8的倍数就会慢一些,所以...
  180. GDT0:
  181. RESB ; NULL selector
  182. DW 0xffff,0x0000,0x9200,0x00cf ; 可以读写的段(segment) 32bit
  183. DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的段(segment) 32bit (bootpack用)
  184.  
  185. DW
  186. GDTR0: ;是LGDT指令,通知GDT0有了GDT,在GDT0写入了16位的段上限和32位段其实地址
  187. DW *-
  188. DD GDT0
  189.  
  190. ALIGNB
  191. bootpack:
  192.  
  193. ; 也就是说,最初的状态时,GDT在asmhead.nas里并不在0x00270000-0x0027ffff的范围里。IDT连设定都没设定,所以仍处于中断禁止状态
  194. ; 应当趁着硬件上积累过多的数据而产生的错误之前,尽快开放中断,接受数据。因此,在bootpack.c的hariMain里,应该在进行调色板的
  195. ; 初始化之前及画面准备之前,赶紧重新建立GDT和IDT,初始化PIC,并执行io_sti();

asmhead.nas

PS: 负责显示模式及分辨率设置及从16位转换为32位保护模式,是c语言和汇编语言的桥梁,所以称为asmhead文件,执行到最后就转到bootpack.c的主函数

  1. /* bootpack文件*/
  2.  
  3. #include "bootpack.h"
  4. #include <stdio.h>
  5.  
  6. struct MOUSE_DEC {//鼠标移动结构体
  7. unsigned char buf[], phase;
  8. int x, y, btn;//鼠标移动距离,鼠标点击信息[低3位从高到低依次:LMR]
  9. };
  10.  
  11. extern struct FIFO8 keyfifo, mousefifo;
  12. void enable_mouse(struct MOUSE_DEC *mdec);//使能鼠标
  13. void init_keyboard(void);//初始化键盘
  14. int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);//鼠标消息处理
  15.  
  16. void HariMain(void)
  17. {
  18. struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
  19. char s[], mcursor[], keybuf[], mousebuf[];
  20. int mx, my, i;
  21. struct MOUSE_DEC mdec;
  22.  
  23. init_gdtidt();//在dsctbl.c中,负责分区和中断分区初始化[包括键盘和鼠标中断设定]
  24. init_pic();//在int.c中,负责中断初始化(硬件)
  25. io_sti(); //在naskfunc.nas中,仅仅执行STI指令,是CLI的逆指令,前者是开中断,后者是禁止中断
  26. fifo8_init(&keyfifo, , keybuf);//在fifo.c中,负责缓冲区初始化(缓冲区结构体,大小,缓冲区首址)
  27. fifo8_init(&mousefifo, , mousebuf);
  28. /*这里IMR是(interrupt mask register),意思是“中断屏蔽寄存器”,是8位寄存器,分别对应8路IRQ信号,如果一路是1则该路被屏蔽
  29. 因为键盘中断是IRQ1,鼠标中断是IRQ12,且PIC分主从2个,从PIC连接主PIC的IRQ2,所以想要有鼠标和键盘中断,要PIC0的IRQ1和IRQ2,和PIC1的IRQ4*/
  30. io_out8(PIC0_IMR, 0xf9);
  31. io_out8(PIC1_IMR, 0xef);
  32.  
  33. init_keyboard();//在这个文件夹内:鼠标和键盘模式设置
  34.  
  35. init_palette();//在文件graphic.c里,初始化调色板,建立静态16个颜色映射,然后调用set_palette进行设置
  36. init_screen8(binfo->vram, binfo->scrnx, binfo->scrny);//在文件graphic.c里,初始化屏幕,画矩形,形成最初的窗口界面
  37. mx = (binfo->scrnx - ) / ; /* 画面中央的坐标计算 */
  38. my = (binfo->scrny - - ) / ;
  39. init_mouse_cursor8(mcursor, COL8_008484);//在文件graphic.c里,存放鼠标颜色信息的字符指针,窗口背景颜色
  40. putblock8_8(binfo->vram, binfo->scrnx, , , mx, my, mcursor, );//在文件graphic.c里,绘制鼠标
  41. sprintf(s, "(%3d, %3d)", mx, my);//将鼠标位置坐标转换为字符串s
  42. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);//在文件graphic.c里,显示字符串在0,0位置
  43.  
  44. enable_mouse(&mdec);//使能鼠标,在本文件内
  45.  
  46. for (;;) {
  47. io_cli();//关闭中断,汇编函数
  48. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == ) {//如果键盘和鼠标的缓冲区里没有数据就SLT什么都不做并且STI恢复中断
  49. io_stihlt();
  50. } else {//如果缓冲区中有数据
  51. if (fifo8_status(&keyfifo) != ) {
  52. i = fifo8_get(&keyfifo);//获取一个数据FIFO
  53. io_sti();//开中断,汇编函数
  54. sprintf(s, "%02X", i);//转换为字符串
  55. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );//在graphic.c文件中,填充VRAM实现画矩形操作,负责清屏操作[这一块]
  56. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);//显示字符串
  57. } else if (fifo8_status(&mousefifo) != ) {
  58. i = fifo8_get(&mousefifo);
  59. io_sti();
  60. if (mouse_decode(&mdec, i) != ) {//对鼠标移动消息进行处理[这里比较特殊,在本文件夹内]
  61. sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);//将鼠标坐标和lcr信息封装成字符串待输出,这里的x,y是移动距离
  62. if ((mdec.btn & 0x01) != ) {//通过判断,将点击事件的字符改为大写
  63. s[] = 'L';
  64. }
  65. if ((mdec.btn & 0x02) != ) {
  66. s[] = 'R';
  67. }
  68. if ((mdec.btn & 0x04) != ) {
  69. s[] = 'C';
  70. }
  71. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , + * - , );//输出鼠标移动消息
  72. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
  73. //鼠标指针移动
  74. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + , my + ); /*隐藏鼠标*/
  75. mx += mdec.x;//计算当前鼠标的位置
  76. my += mdec.y;
  77. if (mx < ) {//超屏控制
  78. mx = ;
  79. }
  80. if (my < ) {
  81. my = ;
  82. }
  83. if (mx > binfo->scrnx - ) {
  84. mx = binfo->scrnx - ;
  85. }
  86. if (my > binfo->scrny - ) {
  87. my = binfo->scrny - ;
  88. }
  89. sprintf(s, "(%3d, %3d)", mx, my);
  90. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , ); /*隐藏鼠标坐标消息*/
  91. putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s); /*显示鼠标坐标消息*/
  92. putblock8_8(binfo->vram, binfo->scrnx, , , mx, my, mcursor, ); /*显示鼠标*/
  93. }
  94. }
  95. }
  96. }
  97. }
  98.  
  99. #define PORT_KEYDAT 0x0060
  100. #define PORT_KEYSTA 0x0064
  101. #define PORT_KEYCMD 0x0064
  102. #define KEYSTA_SEND_NOTREADY 0x02
  103. #define KEYCMD_WRITE_MODE 0x60
  104. #define KBC_MODE 0x47
  105.  
  106. /////////////////////////////////////////////////////////////////////////////////////
  107. //功能:等待键盘控制电路准备完毕
  108. //参数:无
  109. //附加:如果键盘控制电路可以接受CPU指令,CPU从设备号码0x0064处所读取的数据的倒数第二位应该是0,否则就一种循环等待
  110. void wait_KBC_sendready(void)
  111. {
  112. for (;;) {
  113. if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == ) {
  114. break;
  115. }
  116. }
  117. return;
  118. }
  119. void init_keyboard(void)//初始化键盘控制电路
  120. {
  121. wait_KBC_sendready();//让键盘控制电路做好准备,等待控制指令的到来
  122. io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);//键盘模式设置指令
  123. wait_KBC_sendready();
  124. io_out8(PORT_KEYDAT, KBC_MODE);//鼠标模式设置指令
  125. return;
  126. }
  127.  
  128. #define KEYCMD_SENDTO_MOUSE 0xd4
  129. #define MOUSECMD_ENABLE 0xf4
  130. /////////////////////////////////////////////////////////////////////////////////////
  131. //功能:使能鼠标
  132. //参数:
  133. //附加:这个函数和init_keyboard十分相似,不同的在于输入的数据不同
  134. //如果向键盘控制电路发送指令0xd4,下一数据就会自动发送给鼠标,利用这一特性来发送激活鼠标的指令
  135. //其中答复消息为0xfa
  136. void enable_mouse(struct MOUSE_DEC *mdec)
  137. {
  138. wait_KBC_sendready();//让键盘控制电路做好准备,等待控制指令的到来
  139. io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
  140. wait_KBC_sendready();
  141. io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
  142. mdec->phase = ;
  143. return;
  144. }
  145. /////////////////////////////////////////////////////////////////////////////////////
  146. //功能:鼠标信息解码程序,把信息保存在鼠标结构体中
  147. //参数:鼠标结构体,从缓冲区读取的数据
  148. //附加:首先把最初读到的0xfa舍掉,之后从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累计3字节时候就作相应处理[这里返回1]
  149. //最后将鼠标的点击信息放在btn中,将鼠标的移动信息保存在x,y中
  150. int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
  151. {
  152. if (mdec->phase == ) {
  153. /*等待鼠标的0xfa状态*/
  154. if (dat == 0xfa) {
  155. mdec->phase = ;
  156. }
  157. return ;
  158. }
  159. if (mdec->phase == ) {
  160. /*等待鼠标的第一字节*/
  161. if ((dat & 0xc8) == 0x08) {
  162. /* 正しい1バイト目だった */
  163. mdec->buf[] = dat;
  164. mdec->phase = ;
  165. }
  166. return ;
  167. }
  168. if (mdec->phase == ) {
  169. /*等待鼠标的第二字节*/
  170. mdec->buf[] = dat;
  171. mdec->phase = ;
  172. return ;
  173. }
  174. if (mdec->phase == ) {
  175. /*等待鼠标的第三字节,并作处理*/
  176. mdec->buf[] = dat;
  177. mdec->phase = ;//注意这里是恢复到1不是0,见附加说明,刚开始舍去0xfa以后每次3字节
  178. /*下面是根据buf的3个数据进行计算鼠标信息
  179. 这里btn是buf[0]的低3位,最低位表示鼠标左击,中间表示鼠标中间被击,第3位表示鼠标右击
  180. 鼠标的x,和y坐标基本和buf[1],buf[2]相等,但是要根据buf[0]的前半部分作相应的变化:要么第8位及8位以后的全部设成1,或全部保留为0
  181. */
  182. mdec->btn = mdec->buf[] & 0x07;
  183. mdec->x = mdec->buf[];
  184. mdec->y = mdec->buf[];
  185. if ((mdec->buf[] & 0x10) != ) {
  186. mdec->x |= 0xffffff00;
  187. }
  188. if ((mdec->buf[] & 0x20) != ) {
  189. mdec->y |= 0xffffff00;
  190. }
  191. mdec->y = - mdec->y; /* 因为鼠标和屏幕的方向恰好相反,所以这里取反*/
  192. return ;
  193. }
  194. return -;
  195. }

bootpack.c

  1. /* In this file, not only have the defination of the function, but also
  2. hava the description of where the function is.*/
  3.  
  4. /* asmhead.nas */
  5. struct BOOTINFO { /* 0x0ff0-0x0fff */
  6. char cyls; /* what's the end of the start zone read the data */
  7. char leds; /* when boot,the LED's state of the keyboard */
  8. char vmode; /* GPU mode:how many bits of color */
  9. char reserve;
  10. short scrnx, scrny; /* resolution */
  11. char *vram;
  12. };
  13. #define ADR_BOOTINFO 0x00000ff0
  14.  
  15. /* naskfunc.nas */
  16. void io_hlt(void);
  17. void io_cli(void);
  18. void io_sti(void);
  19. void io_stihlt(void);
  20. int io_in8(int port);
  21. void io_out8(int port, int data);
  22. int io_load_eflags(void);
  23. void io_store_eflags(int eflags);
  24. void load_gdtr(int limit, int addr);
  25. void load_idtr(int limit, int addr);
  26. void asm_inthandler21(void);
  27. void asm_inthandler27(void);
  28. void asm_inthandler2c(void);
  29.  
  30. /* fifo.c */
  31. struct FIFO8 {//FIFO缓冲区数据结构
  32. unsigned char *buf;//缓冲区
  33. int p, q, size, free, flags;//下一个数据的写入地址,下一个数据的读出地址,缓冲区的大小,free是缓冲区没有数据的字节数,flag是是否溢出
  34. };
  35. void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);
  36. int fifo8_put(struct FIFO8 *fifo, unsigned char data);
  37. int fifo8_get(struct FIFO8 *fifo);
  38. int fifo8_status(struct FIFO8 *fifo);
  39.  
  40. /* graphic.c */
  41. void init_palette(void);
  42. void set_palette(int start, int end, unsigned char *rgb);
  43. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);
  44. void init_screen8(char *vram, int x, int y);
  45. void putfont8(char *vram, int xsize, int x, int y, char c, char *font);
  46. void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s);
  47. void init_mouse_cursor8(char *mouse, char bc);
  48. void putblock8_8(char *vram, int vxsize, int pxsize,
  49. int pysize, int px0, int py0, char *buf, int bxsize);
  50. #define COL8_000000 0
  51. #define COL8_FF0000 1
  52. #define COL8_00FF00 2
  53. #define COL8_FFFF00 3
  54. #define COL8_0000FF 4
  55. #define COL8_FF00FF 5
  56. #define COL8_00FFFF 6
  57. #define COL8_FFFFFF 7
  58. #define COL8_C6C6C6 8
  59. #define COL8_840000 9
  60. #define COL8_008400 10
  61. #define COL8_848400 11
  62. #define COL8_000084 12
  63. #define COL8_840084 13
  64. #define COL8_008484 14
  65. #define COL8_848484 15
  66.  
  67. /* dsctbl.c about GDT IDT that's Global Descriptor Table and Interrupt Descriptor Table*/
  68. struct SEGMENT_DESCRIPTOR {//8 bytes segment infomation,total 8192 parts [here similar to the method of the setting palette]
  69. short limit_low, base_low;//address of segment base[high:mid:low=1:1:2]=4 bytes =32 bits
  70. char base_mid, access_right;//segment limit[high:low=1:2],only 20 bits = high byte's low 4 bits + low 2bytes' 16bits
  71. 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
  72. };
  73. //PS 1):segment limit equals the number of GDT's effective bytes -1
  74. //PS 2):the segment limit just only has 20 bits, which can represent 1MB, and the segment property has 1 bit flag,
  75. //if this flag =1,and the limit's unit uses page to replace byte(here 1 page = 4kb)
  76. //PS 3):the segment property has 16 bits liking that:xxxx0000 xxxxxxxx
  77. //the high 4 bits are extended access
  78. //the low 8 bits are:
  79. // 0x00:unused description table
  80. // 0x92:system exclusive,readable and writable,non-executable
  81. // 0x9a:system exclusive,readable and non-writable,executable
  82. // 0xf2:application useing,readable and writable,non-executable
  83. // 0xfa:application useing,readable and non-writable,executable
  84.  
  85. struct GATE_DESCRIPTOR {//
  86. short offset_low, selector;
  87. char dw_count, access_right;
  88. short offset_high;
  89. };
  90. void init_gdtidt(void);
  91. void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);
  92. void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar);
  93. #define ADR_IDT 0x0026f800
  94. #define LIMIT_IDT 0x000007ff
  95. #define ADR_GDT 0x00270000
  96. #define LIMIT_GDT 0x0000ffff
  97. #define ADR_BOTPAK 0x00280000
  98. #define LIMIT_BOTPAK 0x0007ffff
  99. #define AR_DATA32_RW 0x4092
  100. #define AR_CODE32_ER 0x409a
  101. #define AR_INTGATE32 0x008e
  102.  
  103. /* int.c */
  104. void init_pic(void);
  105. void inthandler21(int *esp);
  106. void inthandler27(int *esp);
  107. void inthandler2c(int *esp);
  108. #define PIC0_ICW1 0x0020
  109. #define PIC0_OCW2 0x0020
  110. #define PIC0_IMR 0x0021
  111. #define PIC0_ICW2 0x0021
  112. #define PIC0_ICW3 0x0021
  113. #define PIC0_ICW4 0x0021
  114. #define PIC1_ICW1 0x00a0
  115. #define PIC1_OCW2 0x00a0
  116. #define PIC1_IMR 0x00a1
  117. #define PIC1_ICW2 0x00a1
  118. #define PIC1_ICW3 0x00a1
  119. #define PIC1_ICW4 0x00a1

bootpack.h

PS: 主函数在此,做好初始化各种操作然后接收键盘和鼠标信息,并对鼠标信息进行解析,呈现在屏幕上,此外还有文字显示(字库),鼠标显示,鼠标位置计算...这里用到了GDT和IDT,对消息的接收要用中断,对消息的保存要用到FIFO缓冲区...

  1. /* dsctbl.c GDT IDT分段及中断相关 */
  2.  
  3. #include "bootpack.h"
  4.  
  5. /////////////////////////////////////////////////////////////////////////////////////
  6. //功能:
  7. //参数:
  8. //附件:
  9. void init_gdtidt(void)
  10. {
  11. /*在bootpack.h文件里面定义了分段结构体和中断结构体,这里实例化gdt和idt*/
  12. struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;//从0x00270000~0x0027ffff共8192个分段
  13. struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) ADR_IDT;//从0x0026f800~0x0026ffff共256个分段
  14. int i;
  15.  
  16. /* GDT的初始化 */
  17. for (i = ; i <= LIMIT_GDT / ; i++) {
  18. set_segmdesc(gdt + i, , , );
  19. }
  20. //,上限,地址,属性
  21. set_segmdesc(gdt + , 0xffffffff, 0x00000000, AR_DATA32_RW);//设定全局段
  22. set_segmdesc(gdt + , LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);//设定bootpack512字节的段
  23. /* ;1) 这个函数用来指定的段上限和地址赋值给GDTR的48位寄存器,这是个很特殊的寄存器,并不能用MOV来直接赋值
  24. ;,唯一的方法就是指定一个内存地址,从指定的内存地址读取6字节(也就是48位),然后赋值给GDTR寄存器。完成这一任务的指令就是LGDT
  25. ;2) 该寄存器的低16位(即内存的最初的2个字节)是段上限,它等于“GDT的有效的字节数-1”,剩下的32位,代表GDT的开始地址
  26. ;3) 这里2个参数是ESP+4和ESP+8里存放,而我们要的是6字节形式的,所以要转换为我们想要的形式~ */
  27. load_gdtr(LIMIT_GDT, ADR_GDT);
  28.  
  29. /* IDT的初始化 */
  30. for (i = ; i <= LIMIT_IDT / ; i++) {
  31. set_gatedesc(idt + i, , , );
  32. }
  33. load_idtr(LIMIT_IDT, ADR_IDT);
  34.  
  35. /* IDT的設定 */
  36. set_gatedesc(idt + 0x21, (int) asm_inthandler21, * , AR_INTGATE32);
  37. set_gatedesc(idt + 0x27, (int) asm_inthandler27, * , AR_INTGATE32);
  38. set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, * , AR_INTGATE32);
  39. /*这里asm_inthadler21注册在idt的第0x21号,这样如果发生了中断,CPU就会自动调用asm_inthandler21.
  40. 这里的2*8表示asm_inthandler21属于哪一个段,即段号2,乘以8是因为低3位有别的意思,这低3位必须为0
  41. 这里段号为2的段在初始化的地方我们设置为bootpack全局段
  42. 最后的AR_INTGATE32将IDT的属性,设定为0x008e,表示用于中断处理的有效性
  43. */
  44. return;
  45. }
  46.  
  47. void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
  48. {
  49. if (limit > 0xfffff) {
  50. ar |= 0x8000; /* G_bit = 1 */
  51. limit /= 0x1000;
  52. }
  53. sd->limit_low = limit & 0xffff;
  54. sd->base_low = base & 0xffff;
  55. sd->base_mid = (base >> ) & 0xff;
  56. sd->access_right = ar & 0xff;
  57. sd->limit_high = ((limit >> ) & 0x0f) | ((ar >> ) & 0xf0);
  58. sd->base_high = (base >> ) & 0xff;
  59. return;
  60. }
  61.  
  62. void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar)
  63. {
  64. gd->offset_low = offset & 0xffff;
  65. gd->selector = selector;
  66. gd->dw_count = (ar >> ) & 0xff;
  67. gd->access_right = ar & 0xff;
  68. gd->offset_high = (offset >> ) & 0xffff;
  69. return;
  70. }

dsctbl.c

PS: GDT IDT分段及中断相关,这里的分段和调色板的分段有异曲同工之妙~

  1. /* 操作系统函数集合 */
  2.  
  3. #include "bootpack.h"
  4.  
  5. // -----------------------------------------------------------------------------------
  6. //调色板相关
  7. //-----------------------------------------------------------------------------------
  8.  
  9. /////////////////////////////////////////////////////////////////////////////////////
  10. //功能:初始化调色板,建立静态16个颜色映射,然后调用set_palette进行设置
  11. //参数:无
  12. //附件:要调用set_palette函数
  13. void init_palette(void)
  14. {
  15. static unsigned char table_rgb[ * ] = {
  16. 0x00, 0x00, 0x00, /* 0:黑 */
  17. 0xff, 0x00, 0x00, /* 1:亮红 */
  18. 0x00, 0xff, 0x00, /* 2:亮绿 */
  19. 0xff, 0xff, 0x00, /* 3:亮黄 */
  20. 0x00, 0x00, 0xff, /* 4:亮蓝 */
  21. 0xff, 0x00, 0xff, /* 5:亮紫 */
  22. 0x00, 0xff, 0xff, /* 6:浅亮蓝 */
  23. 0xff, 0xff, 0xff, /* 7:白 */
  24. 0xc6, 0xc6, 0xc6, /* 8:亮灰 */
  25. 0x84, 0x00, 0x00, /* 9:暗红 */
  26. 0x00, 0x84, 0x00, /* 10:暗绿 */
  27. 0x84, 0x84, 0x00, /* 11:暗黄 */
  28. 0x00, 0x00, 0x84, /* 12:暗青 */
  29. 0x84, 0x00, 0x84, /* 13:暗紫 */
  30. 0x00, 0x84, 0x84, /* 14:浅暗蓝 */
  31. 0x84, 0x84, 0x84 /* 15:暗灰 */
  32. };
  33. set_palette(, , table_rgb);
  34. return;
  35. /*C语言中static char只能用于数据,就像汇编中的DB指令 */
  36. }
  37. /////////////////////////////////////////////////////////////////////////////////////
  38. //功能:初始化设置调色板
  39. //参数:开始标号,结束标号,16*3的颜色表
  40. //附加:关闭中断,进行设置(要知道具体设置要求),恢复中断
  41. void set_palette(int start, int end, unsigned char *rgb)
  42. {
  43. int i, eflags;
  44. eflags = io_load_eflags(); /* 记录中断许可标志 */
  45. io_cli(); /* 将中断许可标志置0,禁止中断 */
  46. io_out8(0x03c8, start);
  47. for (i = start; i <= end; i++) {
  48. io_out8(0x03c9, rgb[] / );
  49. io_out8(0x03c9, rgb[] / );
  50. io_out8(0x03c9, rgb[] / );
  51. rgb += ;
  52. }
  53. io_store_eflags(eflags); /* 恢复原中断 */
  54. return;
  55. }
  56.  
  57. //-----------------------------------------------------------------------------------
  58. //调色板相关
  59. //-----------------------------------------------------------------------------------
  60.  
  61. /////////////////////////////////////////////////////////////////////////////////////
  62. //功能:填充VRAM实现画矩形操作
  63. //参数:VRAM初址,x轴像素,颜色标号,后面4个是位置矩形
  64. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
  65. {
  66. int x, y;
  67. for (y = y0; y <= y1; y++) {
  68. for (x = x0; x <= x1; x++)
  69. vram[y * xsize + x] = c;
  70. }
  71. return;
  72. }
  73. /////////////////////////////////////////////////////////////////////////////////////
  74. //功能:初始化屏幕,画矩形,形成最初的窗口界面
  75. //参数:VRAM初址,屏幕宽和长
  76. //附加:要调用boxfill8函数
  77. void init_screen8(char *vram, int x, int y)
  78. {
  79. boxfill8(vram, x, COL8_008484, , , x - , y - );
  80. boxfill8(vram, x, COL8_C6C6C6, , y - , x - , y - );
  81. boxfill8(vram, x, COL8_FFFFFF, , y - , x - , y - );
  82. boxfill8(vram, x, COL8_C6C6C6, , y - , x - , y - );
  83.  
  84. boxfill8(vram, x, COL8_FFFFFF, , y - , , y - );
  85. boxfill8(vram, x, COL8_FFFFFF, , y - , , y - );
  86. boxfill8(vram, x, COL8_848484, , y - , , y - );
  87. boxfill8(vram, x, COL8_848484, , y - , , y - );
  88. boxfill8(vram, x, COL8_000000, , y - , , y - );
  89. boxfill8(vram, x, COL8_000000, , y - , , y - );
  90.  
  91. boxfill8(vram, x, COL8_848484, x - , y - , x - , y - );
  92. boxfill8(vram, x, COL8_848484, x - , y - , x - , y - );
  93. boxfill8(vram, x, COL8_FFFFFF, x - , y - , x - , y - );
  94. boxfill8(vram, x, COL8_FFFFFF, x - , y - , x - , y - );
  95. return;
  96. }
  97.  
  98. //-----------------------------------------------------------------------------------
  99. //字符显示相关
  100. //-----------------------------------------------------------------------------------
  101.  
  102. /////////////////////////////////////////////////////////////////////////////////////
  103. //功能:在指定位置显示一个字符
  104. //参数:VRAM初址,窗口宽,待显示的位置,颜色,显示文字的初址(这里采用16个char表示一个字符)
  105. void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
  106. {
  107. int i;
  108. char *p, d /* data */;
  109. for (i = ; i < ; i++) {
  110. //查询每个char的8个位,如果不为0,就
  111. p = vram + (y + i) * xsize + x;
  112. d = font[i];
  113. if ((d & 0x80) != ) { p[] = c; }
  114. if ((d & 0x40) != ) { p[] = c; }
  115. if ((d & 0x20) != ) { p[] = c; }
  116. if ((d & 0x10) != ) { p[] = c; }
  117. if ((d & 0x08) != ) { p[] = c; }
  118. if ((d & 0x04) != ) { p[] = c; }
  119. if ((d & 0x02) != ) { p[] = c; }
  120. if ((d & 0x01) != ) { p[] = c; }
  121. }
  122. return;
  123. }
  124. /////////////////////////////////////////////////////////////////////////////////////
  125. //功能:在指定位置显示一个字符串
  126. //参数:VRAM初址,窗口宽,待显示的位置,颜色,待显示文字串的初址(这里采用16个char表示一个字符)
  127. //附加:这里采用ASCII,字符串以0x00结尾,要调用putfont8()函数,这里可以和printf()函数连用将数据格式化为字符串类型
  128. void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)
  129. {
  130. extern char hankaku[];
  131. for (; *s != 0x00; s++) {
  132. putfont8(vram, xsize, x, y, c, hankaku + *s * );
  133. x += ;
  134. }
  135. return;
  136. }
  137.  
  138. //-----------------------------------------------------------------------------------
  139. //显示鼠标指针
  140. //-----------------------------------------------------------------------------------
  141.  
  142. /////////////////////////////////////////////////////////////////////////////////////
  143. //功能:准备鼠标指针(16*16)
  144. //参数:存放鼠标颜色信息的字符指针,窗口背景颜色
  145. //附件:先定义一个cursor鼠标效果数组,然后转换为鼠标颜色数组(即,每一点应该涂什么颜色)
  146. void init_mouse_cursor8(char *mouse, char bc)
  147. {
  148. static char cursor[][] = {
  149. "**************..",
  150. "*OOOOOOOOOOO*...",
  151. "*OOOOOOOOOO*....",
  152. "*OOOOOOOOO*.....",
  153. "*OOOOOOOO*......",
  154. "*OOOOOOO*.......",
  155. "*OOOOOOO*.......",
  156. "*OOOOOOOO*......",
  157. "*OOOO**OOO*.....",
  158. "*OOO*..*OOO*....",
  159. "*OO*....*OOO*...",
  160. "*O*......*OOO*..",
  161. "**........*OOO*.",
  162. "*..........*OOO*",
  163. "............*OO*",
  164. ".............***"
  165. };//16*16的字节的内存
  166. int x, y;
  167.  
  168. for (y = ; y < ; y++) {//根据上面的鼠标数组建立一个绘制方案保存在mouse里
  169. for (x = ; x < ; x++) {
  170. if (cursor[y][x] == '*') {//边缘涂黑色
  171. mouse[y * + x] = COL8_000000;
  172. }
  173. if (cursor[y][x] == 'O') {//内部涂白色
  174. mouse[y * + x] = COL8_FFFFFF;
  175. }
  176. if (cursor[y][x] == '.') {//外部图背景色
  177. mouse[y * + x] = bc;
  178. }
  179. }
  180. }
  181. return;
  182. }
  183. /////////////////////////////////////////////////////////////////////////////////////
  184. //功能:绘制鼠标
  185. //参数:VRAM初址,x轴像素,鼠标指针大小,位置,鼠标绘制方案,bxsize和pxsize大体相同
  186. //附件:鼠标绘制方案即初始化函数得到的mouse,真正用的时候,先初始化,然后就可以用这个函数绘制鼠标啦
  187. void putblock8_8(char *vram, int vxsize, int pxsize,
  188. int pysize, int px0, int py0, char *buf, int bxsize)
  189. {
  190. int x, y;
  191. for (y = ; y < pysize; y++) {
  192. for (x = ; x < pxsize; x++) {
  193. vram[(py0 + y) * vxsize + (px0 + x)] = buf[y * bxsize + x];
  194. }
  195. }
  196. return;
  197. }

graphic.c

PS: 设置调色板,显示字符串,绘制矩形,绘制鼠标,绘制窗口,总之和VRAM相关的函数

  1. /* the part of interrupt */
  2.  
  3. #include "bootpack.h"
  4. #include <stdio.h>
  5.  
  6. /////////////////////////////////////////////////////////////////////////////////////
  7. //功能:中断初始化函数
  8. //参数:无
  9. void init_pic(void)
  10. /* PIC(programmable interrupt controller) initialize */
  11. {
  12. io_out8(PIC0_IMR, 0xff ); /* disabled all interrupts */
  13. io_out8(PIC1_IMR, 0xff ); /* disabled all interrupts */
  14.  
  15. io_out8(PIC0_ICW1, 0x11 ); /* edge trigger mode */
  16. io_out8(PIC0_ICW2, 0x20 ); /* IRQ0-7 are received by INT20-27 */
  17. io_out8(PIC0_ICW3, << ); /* PIC1 is connected by IRQ2 */
  18. io_out8(PIC0_ICW4, 0x01 ); /* unbuffered mode */
  19.  
  20. io_out8(PIC1_ICW1, 0x11 ); /* edge trigger mode */
  21. io_out8(PIC1_ICW2, 0x28 ); /* IRQ8-15 are received by INT28-2f */
  22. io_out8(PIC1_ICW3, ); /* PIC1 is connnected by IRQ2 */
  23. io_out8(PIC1_ICW4, 0x01 ); /* unbuffered mode */
  24.  
  25. io_out8(PIC0_IMR, 0xfb ); /* 11111011 disable all interrupts except PIC1 */
  26. io_out8(PIC1_IMR, 0xff ); /* 11111111 disable all interrupts */
  27.  
  28. return;
  29. }
  30.  
  31. // -----------------------------------------------------------------------------------
  32. //鼠标和键盘中断处理函数
  33. //鼠标是IRQ12,键盘是IRQ1,所以我们编写INT 0x2c和INT 0x21的中断处理程序(handler),即中断处理程序
  34. //-----------------------------------------------------------------------------------
  35. #define PORT_KEYDAT 0x0060
  36. struct FIFO8 keyfifo;
  37.  
  38. /////////////////////////////////////////////////////////////////////////////////////
  39. //功能:PS/2的键盘中断,一会在汇编中调用这个函数实现真正的中断:_asm_inthandler21
  40. void inthandler21(int *esp)
  41. {
  42. unsigned char data;
  43. io_out8(PIC0_OCW2, 0x61); /* IRQ-01受付完了をPICに通知 */
  44. data = io_in8(PORT_KEYDAT);
  45. fifo8_put(&keyfifo, data);//将数据放进缓冲区
  46. return;
  47. }
  48.  
  49. struct FIFO8 mousefifo;
  50. /////////////////////////////////////////////////////////////////////////////////////
  51. //功能:PS/2的鼠标中断,一会在汇编中调用这个函数实现真正的中断:_asm_inthandler2c
  52. void inthandler2c(int *esp)
  53. {
  54. unsigned char data;
  55. io_out8(PIC1_OCW2, 0x64); /* IRQ-12受付完了をPIC1に通知 */
  56. io_out8(PIC0_OCW2, 0x62); /* IRQ-02受付完了をPIC0に通知 */
  57. data = io_in8(PORT_KEYDAT);
  58. fifo8_put(&mousefifo, data); //将数据放进缓冲区
  59. return;
  60. }
  61.  
  62. void inthandler27(int *esp)
  63. {
  64. io_out8(PIC0_OCW2, 0x67); /* IRQ-07受付完了をPICに通知 */
  65. return;
  66. }

int.c

PS: 中断句柄函数,但是这些并不是中断真正入口,真正入口是对应汇编函数,这些函数只是对应汇编函数要调用的~这些函数包括鼠标中断和键盘中断,因为为了加速,所以要把收到的数据放进FIFO缓冲区,防止因为在中断中进行大量的处理而影响速度~

  1. /* FIFO用来存放鼠标和键盘信息的链表
  2. 其实就是用数组实现的循环链表,这里原著处理的不好,
  3. 建议用数据结构里的知识来处理 */
  4.  
  5. #include "bootpack.h"
  6.  
  7. #define FLAGS_OVERRUN 0x0001
  8.  
  9. /////////////////////////////////////////////////////////////////////////////////////
  10. //功能:缓冲区初始化
  11. //参数:缓冲区结构体指针,大小,缓冲区开始位置
  12. void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
  13. {
  14. fifo->size = size;
  15. fifo->buf = buf;
  16. fifo->free = size;
  17. fifo->flags = ;
  18. fifo->p = ;
  19. fifo->q = ;
  20. return;
  21. }
  22. //往缓冲区内插入一个数据
  23. int fifo8_put(struct FIFO8 *fifo, unsigned char data)
  24. {
  25. if (fifo->free == ) {//溢出
  26. fifo->flags |= FLAGS_OVERRUN;
  27. return -;
  28. }
  29. fifo->buf[fifo->p] = data;
  30. fifo->p++;
  31. if (fifo->p == fifo->size) {//当插入位置到达最后时再返回第一个位置
  32. fifo->p = ;
  33. }
  34. fifo->free--;
  35. return ;
  36. }
  37. //从缓冲区取出一个数据
  38. int fifo8_get(struct FIFO8 *fifo)
  39. {
  40. int data;
  41. if (fifo->free == fifo->size) {//没有数据
  42. return -;
  43. }
  44. data = fifo->buf[fifo->q];
  45. fifo->q++;
  46. if (fifo->q == fifo->size) {//如果取出数据的位置到达最后了就从第一个位置开始
  47. fifo->q = ;
  48. }
  49. fifo->free++;
  50. return data;
  51. }
  52. //获取缓冲区状态,数据量
  53. int fifo8_status(struct FIFO8 *fifo)
  54. {
  55. return fifo->size - fifo->free;
  56. }

fifo.c

PS: 就是个简单的用数组的形式建立的FIFO循环链表,建议看一下那个经典的黑色的数据结构的书,上面讲的很好,甚至有自动增加大小的循环链表,这个数据结构主要用来存放鼠标和键盘的信息~

  1. OSASK偺敿妏僼僅儞僩傪棳梡
  2.  
  3. char 0x00
  4. ........
  5. ........
  6. ........
  7. ........
  8. ........
  9. ........
  10. ........
  11. ........
  12. ........
  13. ........
  14. ........
  15. ........
  16. ........
  17. ........
  18. ........
  19. ........
  20.  
  21. char 0x01
  22. ........
  23. ........
  24. ..***...
  25. .*...*..
  26. *.....*.
  27. *.*.*.*.
  28. *.*.*.*.
  29. *.....*.
  30. *.....*.
  31. *.*.*.*.
  32. *..*..*.
  33. .*...*..
  34. ..***...
  35. ........
  36. ........
  37. ........
  38.  
  39. char 0x02
  40. ........
  41. ........
  42. ..***...
  43. .*****..
  44. *******.
  45. **.*.**.
  46. **.*.**.
  47. *******.
  48. *******.
  49. **.*.**.
  50. ***.***.
  51. .*****..
  52. ..***...
  53. ........
  54. ........
  55. ........
  56.  
  57. char 0x03
  58. ........
  59. ........
  60. ........
  61. ........
  62. .**.**..
  63. *******.
  64. *******.
  65. *******.
  66. .*****..
  67. ..***...
  68. ...*....
  69. ........
  70. ........
  71. ........
  72. ........
  73. ........
  74.  
  75. char 0x04
  76. ........
  77. ........
  78. ........
  79. ........
  80. ...*....
  81. ..***...
  82. .*****..
  83. *******.
  84. .*****..
  85. ..***...
  86. ...*....
  87. ........
  88. ........
  89. ........
  90. ........
  91. ........
  92.  
  93. char 0x05
  94. ........
  95. ........
  96. ........
  97. ........
  98. ...*....
  99. ..***...
  100. .*.*.*..
  101. *******.
  102. .*.*.*..
  103. ...*....
  104. ..***...
  105. ........
  106. ........
  107. ........
  108. ........
  109. ........
  110.  
  111. char 0x06
  112. ........
  113. ........
  114. ........
  115. ........
  116. ...*....
  117. ..***...
  118. .*****..
  119. *******.
  120. **.*.**.
  121. ...*....
  122. ..***...
  123. ........
  124. ........
  125. ........
  126. ........
  127. ........
  128.  
  129. char 0x07
  130. ........
  131. ........
  132. ........
  133. ........
  134. ........
  135. ........
  136. ...**...
  137. ..****..
  138. ..****..
  139. ...**...
  140. ........
  141. ........
  142. ........
  143. ........
  144. ........
  145. ........
  146.  
  147. char 0x08
  148. ********
  149. ********
  150. ********
  151. ********
  152. ********
  153. ********
  154. ***..***
  155. **....**
  156. **....**
  157. ***..***
  158. ********
  159. ********
  160. ********
  161. ********
  162. ********
  163. ********
  164.  
  165. char 0x09
  166. ........
  167. ........
  168. ........
  169. ........
  170. ........
  171. ..****..
  172. .**..**.
  173. .*....*.
  174. .*....*.
  175. .**..**.
  176. ..****..
  177. ........
  178. ........
  179. ........
  180. ........
  181. ........
  182.  
  183. char 0x0a
  184. ********
  185. ********
  186. ********
  187. ********
  188. ********
  189. **....**
  190. *..**..*
  191. *.****.*
  192. *.****.*
  193. *..**..*
  194. **....**
  195. ********
  196. ********
  197. ********
  198. ********
  199. ********
  200.  
  201. char 0x0b
  202. ........
  203. ...*....
  204. ..***...
  205. .*.*.*..
  206. *..*..*.
  207. ...*....
  208. ...*....
  209. ..***...
  210. .*...*..
  211. *.....*.
  212. *.....*.
  213. *.....*.
  214. .*...*..
  215. ..***...
  216. ........
  217. ........
  218.  
  219. char 0x0c
  220. ........
  221. ..***...
  222. .*...*..
  223. *.....*.
  224. *.....*.
  225. *.....*.
  226. .*...*..
  227. ..***...
  228. ...*....
  229. ...*....
  230. *******.
  231. ...*....
  232. ...*....
  233. ...*....
  234. ........
  235. ........
  236.  
  237. char 0x0d
  238. ........
  239. ........
  240. ....**..
  241. ....***.
  242. ....*.**
  243. ....*.**
  244. ....*.*.
  245. ....*...
  246. ....*...
  247. ...**...
  248. .****...
  249. *****...
  250. .***....
  251. ........
  252. ........
  253. ........
  254.  
  255. char 0x0e
  256. ........
  257. ........
  258. ...*****
  259. ...*****
  260. ...*...*
  261. ...*...*
  262. ...*...*
  263. ...*...*
  264. ...*...*
  265. ...*...*
  266. .***.***
  267. ********
  268. .**..**.
  269. ........
  270. ........
  271. ........
  272.  
  273. char 0x0f
  274. ........
  275. ........
  276. ........
  277. ........
  278. ...*....
  279. .*.*.*..
  280. ..***...
  281. ..*.*...
  282. ..***...
  283. .*.*.*..
  284. ...*....
  285. ........
  286. ........
  287. ........
  288. ........
  289. ........
  290.  
  291. char 0x10
  292. ........
  293. *.......
  294. **......
  295. ***.....
  296. ****....
  297. *****...
  298. ******..
  299. *******.
  300. ******..
  301. *****...
  302. ****....
  303. ***.....
  304. **......
  305. *.......
  306. ........
  307. ........
  308.  
  309. char 0x11
  310. ........
  311. ......*.
  312. .....**.
  313. ....***.
  314. ...****.
  315. ..*****.
  316. .******.
  317. *******.
  318. .******.
  319. ..*****.
  320. ...****.
  321. ....***.
  322. .....**.
  323. ......*.
  324. ........
  325. ........
  326.  
  327. char 0x12
  328. ........
  329. ........
  330. ...*....
  331. ..***...
  332. .*.*.*..
  333. *..*..*.
  334. ...*....
  335. ...*....
  336. ...*....
  337. *..*..*.
  338. .*.*.*..
  339. ..***...
  340. ...*....
  341. ........
  342. ........
  343. ........
  344.  
  345. char 0x13
  346. ........
  347. ........
  348. .*...*..
  349. .*...*..
  350. .*...*..
  351. .*...*..
  352. .*...*..
  353. .*...*..
  354. .*...*..
  355. .*...*..
  356. ........
  357. ........
  358. .*...*..
  359. .*...*..
  360. ........
  361. ........
  362.  
  363. char 0x14
  364. ........
  365. ..*****.
  366. .*..*.*.
  367. *...*.*.
  368. *...*.*.
  369. *...*.*.
  370. *...*.*.
  371. .*..*.*.
  372. ..***.*.
  373. ....*.*.
  374. ....*.*.
  375. ....*.*.
  376. ....*.*.
  377. ....*.*.
  378. ........
  379. ........
  380.  
  381. char 0x15
  382. .*****..
  383. *.....*.
  384. .*......
  385. ..*.....
  386. ..***...
  387. .*...*..
  388. *.....*.
  389. *.....*.
  390. *.....*.
  391. .*...*..
  392. ..***...
  393. ....*...
  394. .....*..
  395. *.....*.
  396. .*****..
  397. ........
  398.  
  399. char 0x16
  400. ........
  401. ........
  402. ........
  403. ........
  404. ........
  405. ........
  406. ........
  407. ........
  408. ........
  409. ........
  410. ........
  411. *******.
  412. *******.
  413. *******.
  414. ........
  415. ........
  416.  
  417. char 0x17
  418. ........
  419. ........
  420. ...*....
  421. ..***...
  422. .*.*.*..
  423. *..*..*.
  424. ...*....
  425. ...*....
  426. ...*....
  427. *..*..*.
  428. .*.*.*..
  429. ..***...
  430. ...*....
  431. .*****..
  432. ........
  433. ........
  434.  
  435. char 0x18
  436. ........
  437. ...*....
  438. ..***...
  439. .*.*.*..
  440. *..*..*.
  441. ...*....
  442. ...*....
  443. ...*....
  444. ...*....
  445. ...*....
  446. ...*....
  447. ...*....
  448. ...*....
  449. ...*....
  450. ........
  451. ........
  452.  
  453. char 0x19
  454. ........
  455. ...*....
  456. ...*....
  457. ...*....
  458. ...*....
  459. ...*....
  460. ...*....
  461. ...*....
  462. ...*....
  463. ...*....
  464. *..*..*.
  465. .*.*.*..
  466. ..***...
  467. ...*....
  468. ........
  469. ........
  470.  
  471. char 0x1a
  472. ........
  473. ........
  474. ........
  475. ........
  476. ...*....
  477. ....*...
  478. .....*..
  479. *******.
  480. .....*..
  481. ....*...
  482. ...*....
  483. ........
  484. ........
  485. ........
  486. ........
  487. ........
  488.  
  489. char 0x1b
  490. ........
  491. ........
  492. ........
  493. ........
  494. ...*....
  495. ..*.....
  496. .*......
  497. *******.
  498. .*......
  499. ..*.....
  500. ...*....
  501. ........
  502. ........
  503. ........
  504. ........
  505. ........
  506.  
  507. char 0x1c
  508. ........
  509. ........
  510. ........
  511. ........
  512. ........
  513. ........
  514. ........
  515. ........
  516. ........
  517. ........
  518. ........
  519. *.......
  520. *.......
  521. *******.
  522. ........
  523. ........
  524.  
  525. char 0x1d
  526. ........
  527. ........
  528. ........
  529. ........
  530. ........
  531. ..*.*...
  532. .*...*..
  533. *******.
  534. .*...*..
  535. ..*.*...
  536. ........
  537. ........
  538. ........
  539. ........
  540. ........
  541. ........
  542.  
  543. char 0x1e
  544. ........
  545. ........
  546. ........
  547. ........
  548. ...*....
  549. ...*....
  550. ..***...
  551. ..***...
  552. .*****..
  553. .*****..
  554. *******.
  555. *******.
  556. ........
  557. ........
  558. ........
  559. ........
  560.  
  561. char 0x1f
  562. ........
  563. ........
  564. ........
  565. ........
  566. *******.
  567. *******.
  568. .*****..
  569. .*****..
  570. ..***...
  571. ..***...
  572. ...*....
  573. ...*....
  574. ........
  575. ........
  576. ........
  577. ........
  578.  
  579. char 0x20
  580. ........
  581. ........
  582. ........
  583. ........
  584. ........
  585. ........
  586. ........
  587. ........
  588. ........
  589. ........
  590. ........
  591. ........
  592. ........
  593. ........
  594. ........
  595. ........
  596.  
  597. char 0x21
  598. ........
  599. ...*....
  600. ...*....
  601. ...*....
  602. ...*....
  603. ...*....
  604. ...*....
  605. ...*....
  606. ...*....
  607. ...*....
  608. ........
  609. ........
  610. ...*....
  611. ...*....
  612. ........
  613. ........
  614.  
  615. char 0x22
  616. ..*.*...
  617. ..*.*...
  618. ..*.*...
  619. ........
  620. ........
  621. ........
  622. ........
  623. ........
  624. ........
  625. ........
  626. ........
  627. ........
  628. ........
  629. ........
  630. ........
  631. ........
  632.  
  633. char 0x23
  634. ........
  635. .*...*..
  636. .*...*..
  637. .*...*..
  638. *******.
  639. .*...*..
  640. .*...*..
  641. .*...*..
  642. .*...*..
  643. .*...*..
  644. *******.
  645. .*...*..
  646. .*...*..
  647. .*...*..
  648. ........
  649. ........
  650.  
  651. char 0x24
  652. ...*....
  653. ..***.*.
  654. .*.*.**.
  655. *..*..*.
  656. *..*..*.
  657. *..*....
  658. .*.*....
  659. ..***...
  660. ...*.*..
  661. ...*..*.
  662. *..*..*.
  663. *..*..*.
  664. **.*.*..
  665. *.***...
  666. ...*....
  667. ...*....
  668.  
  669. char 0x25
  670. .**...*.
  671. *..*..*.
  672. *..*.*..
  673. *..*.*..
  674. .**.*...
  675. ....*...
  676. ...*....
  677. ...*....
  678. ..*.....
  679. ..*.**..
  680. .*.*..*.
  681. .*.*..*.
  682. *..*..*.
  683. *...**..
  684. ........
  685. ........
  686.  
  687. char 0x26
  688. ........
  689. .***....
  690. *...*...
  691. *...*...
  692. *...*...
  693. *..*....
  694. .**.....
  695. .*...***
  696. *.*...*.
  697. *..*..*.
  698. *...*.*.
  699. *....*..
  700. .*...**.
  701. ..***..*
  702. ........
  703. ........
  704.  
  705. char 0x27
  706. .....*..
  707. ....*...
  708. ...*....
  709. ........
  710. ........
  711. ........
  712. ........
  713. ........
  714. ........
  715. ........
  716. ........
  717. ........
  718. ........
  719. ........
  720. ........
  721. ........
  722.  
  723. char 0x28
  724. ......*.
  725. .....*..
  726. ....*...
  727. ....*...
  728. ...*....
  729. ...*....
  730. ...*....
  731. ...*....
  732. ...*....
  733. ...*....
  734. ...*....
  735. ....*...
  736. ....*...
  737. .....*..
  738. ......*.
  739. ........
  740.  
  741. char 0x29
  742. *.......
  743. .*......
  744. ..*.....
  745. ..*.....
  746. ...*....
  747. ...*....
  748. ...*....
  749. ...*....
  750. ...*....
  751. ...*....
  752. ...*....
  753. ..*.....
  754. ..*.....
  755. .*......
  756. *.......
  757. ........
  758.  
  759. char 0x2a
  760. ........
  761. ........
  762. ........
  763. ........
  764. ........
  765. ...*....
  766. *..*..*.
  767. .*.*.*..
  768. ..***...
  769. .*.*.*..
  770. *..*..*.
  771. ...*....
  772. ........
  773. ........
  774. ........
  775. ........
  776.  
  777. char 0x2b
  778. ........
  779. ........
  780. ........
  781. ........
  782. ........
  783. ...*....
  784. ...*....
  785. ...*....
  786. *******.
  787. ...*....
  788. ...*....
  789. ...*....
  790. ........
  791. ........
  792. ........
  793. ........
  794.  
  795. char 0x2c
  796. ........
  797. ........
  798. ........
  799. ........
  800. ........
  801. ........
  802. ........
  803. ........
  804. ........
  805. ........
  806. ........
  807. ...**...
  808. ...**...
  809. ....*...
  810. ....*...
  811. ...*....
  812.  
  813. char 0x2d
  814. ........
  815. ........
  816. ........
  817. ........
  818. ........
  819. ........
  820. ........
  821. ........
  822. *******.
  823. ........
  824. ........
  825. ........
  826. ........
  827. ........
  828. ........
  829. ........
  830.  
  831. char 0x2e
  832. ........
  833. ........
  834. ........
  835. ........
  836. ........
  837. ........
  838. ........
  839. ........
  840. ........
  841. ........
  842. ........
  843. ........
  844. ...**...
  845. ...**...
  846. ........
  847. ........
  848.  
  849. char 0x2f
  850. ......*.
  851. ......*.
  852. .....*..
  853. .....*..
  854. ....*...
  855. ....*...
  856. ....*...
  857. ...*....
  858. ...*....
  859. ..*.....
  860. ..*.....
  861. .*......
  862. .*......
  863. .*......
  864. *.......
  865. *.......
  866.  
  867. char 0x30
  868. ........
  869. ...**...
  870. ..*..*..
  871. ..*..*..
  872. .*....*.
  873. .*....*.
  874. .*....*.
  875. .*....*.
  876. .*....*.
  877. .*....*.
  878. .*....*.
  879. ..*..*..
  880. ..*..*..
  881. ...**...
  882. ........
  883. ........
  884.  
  885. char 0x31
  886. ........
  887. ....*...
  888. ...**...
  889. ..*.*...
  890. ....*...
  891. ....*...
  892. ....*...
  893. ....*...
  894. ....*...
  895. ....*...
  896. ....*...
  897. ....*...
  898. ....*...
  899. ..*****.
  900. ........
  901. ........
  902.  
  903. char 0x32
  904. ........
  905. ...**...
  906. ..*..*..
  907. .*....*.
  908. .*....*.
  909. ......*.
  910. .....*..
  911. ....*...
  912. ...*....
  913. ..*.....
  914. ..*.....
  915. .*......
  916. .*......
  917. .******.
  918. ........
  919. ........
  920.  
  921. char 0x33
  922. ........
  923. ...**...
  924. ..*..*..
  925. .*....*.
  926. ......*.
  927. ......*.
  928. .....*..
  929. ...**...
  930. .....*..
  931. ......*.
  932. ......*.
  933. .*....*.
  934. ..*..*..
  935. ...**...
  936. ........
  937. ........
  938.  
  939. char 0x34
  940. ........
  941. ....**..
  942. ....**..
  943. ....**..
  944. ...*.*..
  945. ...*.*..
  946. ...*.*..
  947. ..*..*..
  948. ..*..*..
  949. .*...*..
  950. .******.
  951. .....*..
  952. .....*..
  953. ...****.
  954. ........
  955. ........
  956.  
  957. char 0x35
  958. ........
  959. .*****..
  960. .*......
  961. .*......
  962. .*......
  963. .*.**...
  964. .**..*..
  965. ......*.
  966. ......*.
  967. ......*.
  968. ......*.
  969. .*....*.
  970. ..*..*..
  971. ...**...
  972. ........
  973. ........
  974.  
  975. char 0x36
  976. ........
  977. ...**...
  978. ..*..*..
  979. .*....*.
  980. .*......
  981. .*.**...
  982. .**..*..
  983. .*....*.
  984. .*....*.
  985. .*....*.
  986. .*....*.
  987. .*....*.
  988. ..*..*..
  989. ...**...
  990. ........
  991. ........
  992.  
  993. char 0x37
  994. ........
  995. .******.
  996. .*....*.
  997. .*....*.
  998. .....*..
  999. .....*..
  1000. ....*...
  1001. ....*...
  1002. ....*...
  1003. ...*....
  1004. ...*....
  1005. ...*....
  1006. ...*....
  1007. ..***...
  1008. ........
  1009. ........
  1010.  
  1011. char 0x38
  1012. ........
  1013. ...**...
  1014. ..*..*..
  1015. .*....*.
  1016. .*....*.
  1017. .*....*.
  1018. ..*..*..
  1019. ...**...
  1020. ..*..*..
  1021. .*....*.
  1022. .*....*.
  1023. .*....*.
  1024. ..*..*..
  1025. ...**...
  1026. ........
  1027. ........
  1028.  
  1029. char 0x39
  1030. ........
  1031. ...**...
  1032. ..*..*..
  1033. .*....*.
  1034. .*....*.
  1035. .*....*.
  1036. .*....*.
  1037. .*....*.
  1038. ..*..**.
  1039. ...**.*.
  1040. ......*.
  1041. .*....*.
  1042. ..*..*..
  1043. ...**...
  1044. ........
  1045. ........
  1046.  
  1047. char 0x3a
  1048. ........
  1049. ........
  1050. ........
  1051. ........
  1052. ........
  1053. ...**...
  1054. ...**...
  1055. ........
  1056. ........
  1057. ........
  1058. ........
  1059. ........
  1060. ...**...
  1061. ...**...
  1062. ........
  1063. ........
  1064.  
  1065. char 0x3b
  1066. ........
  1067. ........
  1068. ........
  1069. ........
  1070. ........
  1071. ...**...
  1072. ...**...
  1073. ........
  1074. ........
  1075. ........
  1076. ........
  1077. ...**...
  1078. ...**...
  1079. ....*...
  1080. ....*...
  1081. ...*....
  1082.  
  1083. char 0x3c
  1084. ........
  1085. ......*.
  1086. .....*..
  1087. ....*...
  1088. ...*....
  1089. ..*.....
  1090. .*......
  1091. *.......
  1092. *.......
  1093. .*......
  1094. ..*.....
  1095. ...*....
  1096. ....*...
  1097. .....*..
  1098. ......*.
  1099. ........
  1100.  
  1101. char 0x3d
  1102. ........
  1103. ........
  1104. ........
  1105. ........
  1106. ........
  1107. ........
  1108. *******.
  1109. ........
  1110. ........
  1111. *******.
  1112. ........
  1113. ........
  1114. ........
  1115. ........
  1116. ........
  1117. ........
  1118.  
  1119. char 0x3e
  1120. ........
  1121. *.......
  1122. .*......
  1123. ..*.....
  1124. ...*....
  1125. ....*...
  1126. .....*..
  1127. ......*.
  1128. ......*.
  1129. .....*..
  1130. ....*...
  1131. ...*....
  1132. ..*.....
  1133. .*......
  1134. *.......
  1135. ........
  1136.  
  1137. char 0x3f
  1138. ........
  1139. ..***...
  1140. .*...*..
  1141. *.....*.
  1142. *.....*.
  1143. *.....*.
  1144. .....*..
  1145. ....*...
  1146. ...*....
  1147. ...*....
  1148. ........
  1149. ........
  1150. ...**...
  1151. ...**...
  1152. ........
  1153. ........
  1154.  
  1155. char 0x40
  1156. ........
  1157. ..***...
  1158. .*...*..
  1159. *.....*.
  1160. *..**.*.
  1161. *.*.*.*.
  1162. *.*.*.*.
  1163. *.*.*.*.
  1164. *.*.*.*.
  1165. *.*.*.*.
  1166. *..***..
  1167. *.......
  1168. .*...**.
  1169. ..***...
  1170. ........
  1171. ........
  1172.  
  1173. char 0x41
  1174. ........
  1175. ...**...
  1176. ...**...
  1177. ...**...
  1178. ...**...
  1179. ..*..*..
  1180. ..*..*..
  1181. ..*..*..
  1182. ..*..*..
  1183. .******.
  1184. .*....*.
  1185. .*....*.
  1186. .*....*.
  1187. ***..***
  1188. ........
  1189. ........
  1190.  
  1191. char 0x42
  1192. ........
  1193. ****....
  1194. .*..*...
  1195. .*...*..
  1196. .*...*..
  1197. .*...*..
  1198. .*..*...
  1199. .****...
  1200. .*...*..
  1201. .*....*.
  1202. .*....*.
  1203. .*....*.
  1204. .*...*..
  1205. *****...
  1206. ........
  1207. ........
  1208.  
  1209. char 0x43
  1210. ........
  1211. ..***.*.
  1212. .*...**.
  1213. .*....*.
  1214. *.....*.
  1215. *.......
  1216. *.......
  1217. *.......
  1218. *.......
  1219. *.......
  1220. *.....*.
  1221. .*....*.
  1222. .*...*..
  1223. ..***...
  1224. ........
  1225. ........
  1226.  
  1227. char 0x44
  1228. ........
  1229. *****...
  1230. .*...*..
  1231. .*...*..
  1232. .*....*.
  1233. .*....*.
  1234. .*....*.
  1235. .*....*.
  1236. .*....*.
  1237. .*....*.
  1238. .*....*.
  1239. .*...*..
  1240. .*...*..
  1241. *****...
  1242. ........
  1243. ........
  1244.  
  1245. char 0x45
  1246. ........
  1247. *******.
  1248. .*....*.
  1249. .*....*.
  1250. .*......
  1251. .*......
  1252. .*...*..
  1253. .*****..
  1254. .*...*..
  1255. .*......
  1256. .*......
  1257. .*....*.
  1258. .*....*.
  1259. *******.
  1260. ........
  1261. ........
  1262.  
  1263. char 0x46
  1264. ........
  1265. *******.
  1266. .*....*.
  1267. .*....*.
  1268. .*......
  1269. .*......
  1270. .*...*..
  1271. .*****..
  1272. .*...*..
  1273. .*...*..
  1274. .*......
  1275. .*......
  1276. .*......
  1277. ****....
  1278. ........
  1279. ........
  1280.  
  1281. char 0x47
  1282. ........
  1283. ..***.*.
  1284. .*...**.
  1285. .*....*.
  1286. *.....*.
  1287. *.......
  1288. *.......
  1289. *..****.
  1290. *.....*.
  1291. *.....*.
  1292. *.....*.
  1293. .*....*.
  1294. .*...**.
  1295. ..***...
  1296. ........
  1297. ........
  1298.  
  1299. char 0x48
  1300. ........
  1301. ***..***
  1302. .*....*.
  1303. .*....*.
  1304. .*....*.
  1305. .*....*.
  1306. .*....*.
  1307. .******.
  1308. .*....*.
  1309. .*....*.
  1310. .*....*.
  1311. .*....*.
  1312. .*....*.
  1313. ***..***
  1314. ........
  1315. ........
  1316.  
  1317. char 0x49
  1318. ........
  1319. .*****..
  1320. ...*....
  1321. ...*....
  1322. ...*....
  1323. ...*....
  1324. ...*....
  1325. ...*....
  1326. ...*....
  1327. ...*....
  1328. ...*....
  1329. ...*....
  1330. ...*....
  1331. .*****..
  1332. ........
  1333. ........
  1334.  
  1335. char 0x4a
  1336. ........
  1337. ...*****
  1338. .....*..
  1339. .....*..
  1340. .....*..
  1341. .....*..
  1342. .....*..
  1343. .....*..
  1344. .....*..
  1345. .....*..
  1346. .....*..
  1347. .....*..
  1348. *....*..
  1349. .*..*...
  1350. ..**....
  1351. ........
  1352.  
  1353. char 0x4b
  1354. ........
  1355. ***..***
  1356. .*....*.
  1357. .*...*..
  1358. .*..*...
  1359. .*.*....
  1360. .*.*....
  1361. .**.....
  1362. .*.*....
  1363. .*.*....
  1364. .*..*...
  1365. .*...*..
  1366. .*....*.
  1367. ***..***
  1368. ........
  1369. ........
  1370.  
  1371. char 0x4c
  1372. ........
  1373. ****....
  1374. .*......
  1375. .*......
  1376. .*......
  1377. .*......
  1378. .*......
  1379. .*......
  1380. .*......
  1381. .*......
  1382. .*......
  1383. .*....*.
  1384. .*....*.
  1385. *******.
  1386. ........
  1387. ........
  1388.  
  1389. char 0x4d
  1390. ........
  1391. **....**
  1392. .*....*.
  1393. .**..**.
  1394. .**..**.
  1395. .**..**.
  1396. .*.**.*.
  1397. .*.**.*.
  1398. .*.**.*.
  1399. .*....*.
  1400. .*....*.
  1401. .*....*.
  1402. .*....*.
  1403. ***..***
  1404. ........
  1405. ........
  1406.  
  1407. char 0x4e
  1408. ........
  1409. **...***
  1410. .*....*.
  1411. .**...*.
  1412. .**...*.
  1413. .*.*..*.
  1414. .*.*..*.
  1415. .*.*..*.
  1416. .*..*.*.
  1417. .*..*.*.
  1418. .*..*.*.
  1419. .*...**.
  1420. .*...**.
  1421. ***...*.
  1422. ........
  1423. ........
  1424.  
  1425. char 0x4f
  1426. ........
  1427. ..***...
  1428. .*...*..
  1429. *.....*.
  1430. *.....*.
  1431. *.....*.
  1432. *.....*.
  1433. *.....*.
  1434. *.....*.
  1435. *.....*.
  1436. *.....*.
  1437. *.....*.
  1438. .*...*..
  1439. ..***...
  1440. ........
  1441. ........
  1442.  
  1443. char 0x50
  1444. ........
  1445. *****...
  1446. .*...*..
  1447. .*....*.
  1448. .*....*.
  1449. .*....*.
  1450. .*...*..
  1451. .****...
  1452. .*......
  1453. .*......
  1454. .*......
  1455. .*......
  1456. .*......
  1457. ****....
  1458. ........
  1459. ........
  1460.  
  1461. char 0x51
  1462. ........
  1463. ..***...
  1464. .*...*..
  1465. *.....*.
  1466. *.....*.
  1467. *.....*.
  1468. *.....*.
  1469. *.....*.
  1470. *.....*.
  1471. *.....*.
  1472. *..*..*.
  1473. *...*.*.
  1474. .*...*..
  1475. ..***.*.
  1476. ........
  1477. ........
  1478.  
  1479. char 0x52
  1480. ........
  1481. ******..
  1482. .*....*.
  1483. .*....*.
  1484. .*....*.
  1485. .*....*.
  1486. .*****..
  1487. .*...*..
  1488. .*....*.
  1489. .*....*.
  1490. .*....*.
  1491. .*....*.
  1492. .*....*.
  1493. ***..***
  1494. ........
  1495. ........
  1496.  
  1497. char 0x53
  1498. ........
  1499. ..***.*.
  1500. .*...**.
  1501. *.....*.
  1502. *.....*.
  1503. *.......
  1504. .*......
  1505. ..***...
  1506. .....*..
  1507. ......*.
  1508. *.....*.
  1509. *.....*.
  1510. **...*..
  1511. *.***...
  1512. ........
  1513. ........
  1514.  
  1515. char 0x54
  1516. ........
  1517. *******.
  1518. *..*..*.
  1519. *..*..*.
  1520. ...*....
  1521. ...*....
  1522. ...*....
  1523. ...*....
  1524. ...*....
  1525. ...*....
  1526. ...*....
  1527. ...*....
  1528. ...*....
  1529. .*****..
  1530. ........
  1531. ........
  1532.  
  1533. char 0x55
  1534. ........
  1535. ***..***
  1536. .*....*.
  1537. .*....*.
  1538. .*....*.
  1539. .*....*.
  1540. .*....*.
  1541. .*....*.
  1542. .*....*.
  1543. .*....*.
  1544. .*....*.
  1545. .*....*.
  1546. ..*..*..
  1547. ..****..
  1548. ........
  1549. ........
  1550.  
  1551. char 0x56
  1552. ........
  1553. ***..***
  1554. .*....*.
  1555. .*....*.
  1556. .*....*.
  1557. .*....*.
  1558. ..*..*..
  1559. ..*..*..
  1560. ..*..*..
  1561. ..*..*..
  1562. ...**...
  1563. ...**...
  1564. ...**...
  1565. ...**...
  1566. ........
  1567. ........
  1568.  
  1569. char 0x57
  1570. ........
  1571. ***..***
  1572. .*....*.
  1573. .*....*.
  1574. .*....*.
  1575. .*.**.*.
  1576. .*.**.*.
  1577. .*.**.*.
  1578. .*.**.*.
  1579. ..*..*..
  1580. ..*..*..
  1581. ..*..*..
  1582. ..*..*..
  1583. ..*..*..
  1584. ........
  1585. ........
  1586.  
  1587. char 0x58
  1588. ........
  1589. ***..***
  1590. .*....*.
  1591. .*....*.
  1592. ..*..*..
  1593. ..*..*..
  1594. ..*..*..
  1595. ...**...
  1596. ..*..*..
  1597. ..*..*..
  1598. ..*..*..
  1599. .*....*.
  1600. .*....*.
  1601. ***..***
  1602. ........
  1603. ........
  1604.  
  1605. char 0x59
  1606. ........
  1607. ***.***.
  1608. .*...*..
  1609. .*...*..
  1610. .*...*..
  1611. ..*.*...
  1612. ..*.*...
  1613. ..*.*...
  1614. ...*....
  1615. ...*....
  1616. ...*....
  1617. ...*....
  1618. ...*....
  1619. .*****..
  1620. ........
  1621. ........
  1622.  
  1623. char 0x5a
  1624. ........
  1625. *******.
  1626. *....*..
  1627. *....*..
  1628. ....*...
  1629. ....*...
  1630. ...*....
  1631. ...*....
  1632. ..*.....
  1633. ..*.....
  1634. .*......
  1635. .*....*.
  1636. *.....*.
  1637. *******.
  1638. ........
  1639. ........
  1640.  
  1641. char 0x5b
  1642. ........
  1643. ..*****.
  1644. ..*.....
  1645. ..*.....
  1646. ..*.....
  1647. ..*.....
  1648. ..*.....
  1649. ..*.....
  1650. ..*.....
  1651. ..*.....
  1652. ..*.....
  1653. ..*.....
  1654. ..*.....
  1655. ..*.....
  1656. ..*****.
  1657. ........
  1658.  
  1659. char 0x5c
  1660. *.......
  1661. *.......
  1662. .*......
  1663. .*......
  1664. ..*.....
  1665. ..*.....
  1666. ..*.....
  1667. ...*....
  1668. ...*....
  1669. ....*...
  1670. ....*...
  1671. .....*..
  1672. .....*..
  1673. .....*..
  1674. ......*.
  1675. ......*.
  1676.  
  1677. char 0x5d
  1678. ........
  1679. .*****..
  1680. .....*..
  1681. .....*..
  1682. .....*..
  1683. .....*..
  1684. .....*..
  1685. .....*..
  1686. .....*..
  1687. .....*..
  1688. .....*..
  1689. .....*..
  1690. .....*..
  1691. .....*..
  1692. .*****..
  1693. ........
  1694.  
  1695. char 0x5e
  1696. ........
  1697. ...*....
  1698. ..*.*...
  1699. .*...*..
  1700. *.....*.
  1701. ........
  1702. ........
  1703. ........
  1704. ........
  1705. ........
  1706. ........
  1707. ........
  1708. ........
  1709. ........
  1710. ........
  1711. ........
  1712.  
  1713. char 0x5f
  1714. ........
  1715. ........
  1716. ........
  1717. ........
  1718. ........
  1719. ........
  1720. ........
  1721. ........
  1722. ........
  1723. ........
  1724. ........
  1725. ........
  1726. ........
  1727. ........
  1728. *******.
  1729. ........
  1730.  
  1731. char 0x60
  1732. ...*....
  1733. ....*...
  1734. .....*..
  1735. ........
  1736. ........
  1737. ........
  1738. ........
  1739. ........
  1740. ........
  1741. ........
  1742. ........
  1743. ........
  1744. ........
  1745. ........
  1746. ........
  1747. ........
  1748.  
  1749. char 0x61
  1750. ........
  1751. ........
  1752. ........
  1753. ........
  1754. ........
  1755. .***....
  1756. ....*...
  1757. .....*..
  1758. ..****..
  1759. .*...*..
  1760. *....*..
  1761. *....*..
  1762. *...**..
  1763. .***.**.
  1764. ........
  1765. ........
  1766.  
  1767. char 0x62
  1768. **......
  1769. .*......
  1770. .*......
  1771. .*......
  1772. .*......
  1773. .*.**...
  1774. .**..*..
  1775. .*....*.
  1776. .*....*.
  1777. .*....*.
  1778. .*....*.
  1779. .*....*.
  1780. .**..*..
  1781. .*.**...
  1782. ........
  1783. ........
  1784.  
  1785. char 0x63
  1786. ........
  1787. ........
  1788. ........
  1789. ........
  1790. ........
  1791. ..**....
  1792. .*..**..
  1793. *....*..
  1794. *....*..
  1795. *.......
  1796. *.......
  1797. *.....*.
  1798. .*...*..
  1799. ..***...
  1800. ........
  1801. ........
  1802.  
  1803. char 0x64
  1804. ....**..
  1805. .....*..
  1806. .....*..
  1807. .....*..
  1808. .....*..
  1809. ..**.*..
  1810. .*..**..
  1811. *....*..
  1812. *....*..
  1813. *....*..
  1814. *....*..
  1815. *....*..
  1816. .*..**..
  1817. ..**.**.
  1818. ........
  1819. ........
  1820.  
  1821. char 0x65
  1822. ........
  1823. ........
  1824. ........
  1825. ........
  1826. ........
  1827. ..***...
  1828. .*...*..
  1829. *.....*.
  1830. *.....*.
  1831. ******..
  1832. *.......
  1833. *.....*.
  1834. .*....*.
  1835. ..****..
  1836. ........
  1837. ........
  1838.  
  1839. char 0x66
  1840. ....***.
  1841. ...*....
  1842. ...*....
  1843. ...*....
  1844. ...*....
  1845. .*****..
  1846. ...*....
  1847. ...*....
  1848. ...*....
  1849. ...*....
  1850. ...*....
  1851. ...*....
  1852. ...*....
  1853. .*****..
  1854. ........
  1855. ........
  1856.  
  1857. char 0x67
  1858. ........
  1859. ........
  1860. ........
  1861. ........
  1862. ........
  1863. ..**.**.
  1864. .*..**..
  1865. *....*..
  1866. *....*..
  1867. *....*..
  1868. *....*..
  1869. .*..**..
  1870. ..**.*..
  1871. .....*..
  1872. .....*..
  1873. .****...
  1874.  
  1875. char 0x68
  1876. **......
  1877. .*......
  1878. .*......
  1879. .*......
  1880. .*......
  1881. .*.**...
  1882. .**..*..
  1883. .*....*.
  1884. .*....*.
  1885. .*....*.
  1886. .*....*.
  1887. .*....*.
  1888. .*....*.
  1889. ***...**
  1890. ........
  1891. ........
  1892.  
  1893. char 0x69
  1894. ........
  1895. ...*....
  1896. ...*....
  1897. ........
  1898. ........
  1899. ..**....
  1900. ...*....
  1901. ...*....
  1902. ...*....
  1903. ...*....
  1904. ...*....
  1905. ...*....
  1906. ...*....
  1907. ..***...
  1908. ........
  1909. ........
  1910.  
  1911. char 0x6a
  1912. ........
  1913. .....*..
  1914. .....*..
  1915. ........
  1916. ........
  1917. ....**..
  1918. .....*..
  1919. .....*..
  1920. .....*..
  1921. .....*..
  1922. .....*..
  1923. .....*..
  1924. .....*..
  1925. ....*...
  1926. ....*...
  1927. ..**....
  1928.  
  1929. char 0x6b
  1930. **......
  1931. .*......
  1932. .*......
  1933. .*......
  1934. .*......
  1935. .*..***.
  1936. .*...*..
  1937. .*..*...
  1938. .*.*....
  1939. .**.....
  1940. .*.*....
  1941. .*..*...
  1942. .*...*..
  1943. ***..**.
  1944. ........
  1945. ........
  1946.  
  1947. char 0x6c
  1948. ..**....
  1949. ...*....
  1950. ...*....
  1951. ...*....
  1952. ...*....
  1953. ...*....
  1954. ...*....
  1955. ...*....
  1956. ...*....
  1957. ...*....
  1958. ...*....
  1959. ...*....
  1960. ...*....
  1961. ..***...
  1962. ........
  1963. ........
  1964.  
  1965. char 0x6d
  1966. ........
  1967. ........
  1968. ........
  1969. ........
  1970. ........
  1971. ****.**.
  1972. .*..*..*
  1973. .*..*..*
  1974. .*..*..*
  1975. .*..*..*
  1976. .*..*..*
  1977. .*..*..*
  1978. .*..*..*
  1979. **.**.**
  1980. ........
  1981. ........
  1982.  
  1983. char 0x6e
  1984. ........
  1985. ........
  1986. ........
  1987. ........
  1988. ........
  1989. **.**...
  1990. .**..*..
  1991. .*....*.
  1992. .*....*.
  1993. .*....*.
  1994. .*....*.
  1995. .*....*.
  1996. .*....*.
  1997. ***...**
  1998. ........
  1999. ........
  2000.  
  2001. char 0x6f
  2002. ........
  2003. ........
  2004. ........
  2005. ........
  2006. ........
  2007. ..***...
  2008. .*...*..
  2009. *.....*.
  2010. *.....*.
  2011. *.....*.
  2012. *.....*.
  2013. *.....*.
  2014. .*...*..
  2015. ..***...
  2016. ........
  2017. ........
  2018.  
  2019. char 0x70
  2020. ........
  2021. ........
  2022. ........
  2023. ........
  2024. ........
  2025. **.**...
  2026. .**..*..
  2027. .*....*.
  2028. .*....*.
  2029. .*....*.
  2030. .*....*.
  2031. .*....*.
  2032. .**..*..
  2033. .*.**...
  2034. .*......
  2035. ***.....
  2036.  
  2037. char 0x71
  2038. ........
  2039. ........
  2040. ........
  2041. ........
  2042. ........
  2043. ..**.*..
  2044. .*..**..
  2045. *....*..
  2046. *....*..
  2047. *....*..
  2048. *....*..
  2049. *....*..
  2050. .*..**..
  2051. ..**.*..
  2052. .....*..
  2053. ....***.
  2054.  
  2055. char 0x72
  2056. ........
  2057. ........
  2058. ........
  2059. ........
  2060. ........
  2061. **.***..
  2062. .**...*.
  2063. .*....*.
  2064. .*......
  2065. .*......
  2066. .*......
  2067. .*......
  2068. .*......
  2069. ***.....
  2070. ........
  2071. ........
  2072.  
  2073. char 0x73
  2074. ........
  2075. ........
  2076. ........
  2077. ........
  2078. ........
  2079. .****.*.
  2080. *....**.
  2081. *.....*.
  2082. **......
  2083. ..***...
  2084. .....**.
  2085. *.....*.
  2086. **....*.
  2087. *.****..
  2088. ........
  2089. ........
  2090.  
  2091. char 0x74
  2092. ........
  2093. ........
  2094. ...*....
  2095. ...*....
  2096. ...*....
  2097. .*****..
  2098. ...*....
  2099. ...*....
  2100. ...*....
  2101. ...*....
  2102. ...*....
  2103. ...*....
  2104. ...*....
  2105. ....***.
  2106. ........
  2107. ........
  2108.  
  2109. char 0x75
  2110. ........
  2111. ........
  2112. ........
  2113. ........
  2114. ........
  2115. **...**.
  2116. .*....*.
  2117. .*....*.
  2118. .*....*.
  2119. .*....*.
  2120. .*....*.
  2121. .*....*.
  2122. .*...**.
  2123. ..***.**
  2124. ........
  2125. ........
  2126.  
  2127. char 0x76
  2128. ........
  2129. ........
  2130. ........
  2131. ........
  2132. ........
  2133. ***..***
  2134. .*....*.
  2135. .*....*.
  2136. .*....*.
  2137. ..*..*..
  2138. ..*..*..
  2139. ..*..*..
  2140. ...**...
  2141. ...**...
  2142. ........
  2143. ........
  2144.  
  2145. char 0x77
  2146. ........
  2147. ........
  2148. ........
  2149. ........
  2150. ........
  2151. ***..***
  2152. .*....*.
  2153. .*....*.
  2154. .*.**.*.
  2155. .*.**.*.
  2156. .*.**.*.
  2157. ..*..*..
  2158. ..*..*..
  2159. ..*..*..
  2160. ........
  2161. ........
  2162.  
  2163. char 0x78
  2164. ........
  2165. ........
  2166. ........
  2167. ........
  2168. ........
  2169. **...**.
  2170. .*...*..
  2171. ..*.*...
  2172. ..*.*...
  2173. ...*....
  2174. ..*.*...
  2175. ..*.*...
  2176. .*...*..
  2177. **...**.
  2178. ........
  2179. ........
  2180.  
  2181. char 0x79
  2182. ........
  2183. ........
  2184. ........
  2185. ........
  2186. ........
  2187. ***..***
  2188. .*....*.
  2189. .*....*.
  2190. ..*..*..
  2191. ..*..*..
  2192. ..*..*..
  2193. ...**...
  2194. ...**...
  2195. ...*....
  2196. ...*....
  2197. .**.....
  2198.  
  2199. char 0x7a
  2200. ........
  2201. ........
  2202. ........
  2203. ........
  2204. ........
  2205. *******.
  2206. *.....*.
  2207. *....*..
  2208. ....*...
  2209. ...*....
  2210. ..*.....
  2211. .*....*.
  2212. *.....*.
  2213. *******.
  2214. ........
  2215. ........
  2216.  
  2217. char 0x7b
  2218. ........
  2219. .....**.
  2220. ....*...
  2221. ...*....
  2222. ...*....
  2223. ...*....
  2224. ...*....
  2225. .**.....
  2226. ...*....
  2227. ...*....
  2228. ...*....
  2229. ...*....
  2230. ....*...
  2231. .....**.
  2232. ........
  2233. ........
  2234.  
  2235. char 0x7c
  2236. ...*....
  2237. ...*....
  2238. ...*....
  2239. ...*....
  2240. ...*....
  2241. ...*....
  2242. ...*....
  2243. ...*....
  2244. ...*....
  2245. ...*....
  2246. ...*....
  2247. ...*....
  2248. ...*....
  2249. ...*....
  2250. ...*....
  2251. ...*....
  2252.  
  2253. char 0x7d
  2254. ........
  2255. .**.....
  2256. ...*....
  2257. ....*...
  2258. ....*...
  2259. ....*...
  2260. ....*...
  2261. .....**.
  2262. ....*...
  2263. ....*...
  2264. ....*...
  2265. ....*...
  2266. ...*....
  2267. .**.....
  2268. ........
  2269. ........
  2270.  
  2271. char 0x7e
  2272. ........
  2273. .***..*.
  2274. *...**..
  2275. ........
  2276. ........
  2277. ........
  2278. ........
  2279. ........
  2280. ........
  2281. ........
  2282. ........
  2283. ........
  2284. ........
  2285. ........
  2286. ........
  2287. ........
  2288.  
  2289. char 0x7f
  2290. ........
  2291. ........
  2292. ........
  2293. ........
  2294. ...*....
  2295. ..*.*...
  2296. .*...*..
  2297. *.....*.
  2298. *******.
  2299. *.....*.
  2300. *******.
  2301. ........
  2302. ........
  2303. ........
  2304. ........
  2305. ........
  2306.  
  2307. char 0x80
  2308. ........
  2309. ..***...
  2310. .*...*..
  2311. *.....*.
  2312. *.......
  2313. *.......
  2314. *.......
  2315. *.......
  2316. *.......
  2317. *.......
  2318. *.......
  2319. *.....*.
  2320. .*...*..
  2321. ..***...
  2322. ...*....
  2323. ..*.....
  2324.  
  2325. char 0x81
  2326. ........
  2327. ........
  2328. ..*..*..
  2329. ..*..*..
  2330. ........
  2331. *.....*.
  2332. *.....*.
  2333. *.....*.
  2334. *.....*.
  2335. *.....*.
  2336. *.....*.
  2337. *.....*.
  2338. .*....*.
  2339. ..*****.
  2340. ........
  2341. ........
  2342.  
  2343. char 0x82
  2344. ....**..
  2345. ....*...
  2346. ...*....
  2347. ........
  2348. ........
  2349. ..***...
  2350. .*...*..
  2351. *.....*.
  2352. *.....*.
  2353. *******.
  2354. *.......
  2355. *.....*.
  2356. .*...*..
  2357. ..***...
  2358. ........
  2359. ........
  2360.  
  2361. char 0x83
  2362. ........
  2363. ...*....
  2364. ..*.*...
  2365. .*...*..
  2366. ........
  2367. .****...
  2368. .....*..
  2369. .....*..
  2370. ..****..
  2371. .*...*..
  2372. *....*..
  2373. *....*..
  2374. .*...*..
  2375. ..*****.
  2376. ........
  2377. ........
  2378.  
  2379. char 0x84
  2380. ........
  2381. ........
  2382. ..*..*..
  2383. ..*..*..
  2384. ........
  2385. .****...
  2386. .....*..
  2387. .....*..
  2388. ..****..
  2389. .*...*..
  2390. *....*..
  2391. *....*..
  2392. .*...*..
  2393. ..*****.
  2394. ........
  2395. ........
  2396.  
  2397. char 0x85
  2398. ...*....
  2399. ....*...
  2400. .....*..
  2401. ........
  2402. ........
  2403. .****...
  2404. .....*..
  2405. .....*..
  2406. ..****..
  2407. .*...*..
  2408. *....*..
  2409. *....*..
  2410. .*...*..
  2411. ..*****.
  2412. ........
  2413. ........
  2414.  
  2415. char 0x86
  2416. ........
  2417. ...**...
  2418. ..*..*..
  2419. ...**...
  2420. ........
  2421. .****...
  2422. .....*..
  2423. .....*..
  2424. ..****..
  2425. .*...*..
  2426. *....*..
  2427. *....*..
  2428. .*...*..
  2429. ..*****.
  2430. ........
  2431. ........
  2432.  
  2433. char 0x87
  2434. ........
  2435. ........
  2436. ........
  2437. ........
  2438. ........
  2439. ..****..
  2440. .*....*.
  2441. *.......
  2442. *.......
  2443. *.......
  2444. *.......
  2445. *.......
  2446. .*....*.
  2447. ..****..
  2448. ....*...
  2449. ...*....
  2450.  
  2451. char 0x88
  2452. ........
  2453. ...*....
  2454. ..*.*...
  2455. .*...*..
  2456. ........
  2457. ..***...
  2458. .*...*..
  2459. *.....*.
  2460. *.....*.
  2461. *******.
  2462. *.......
  2463. *.....*.
  2464. .*...*..
  2465. ..***...
  2466. ........
  2467. ........
  2468.  
  2469. char 0x89
  2470. ........
  2471. ........
  2472. ..*..*..
  2473. ..*..*..
  2474. ........
  2475. ..***...
  2476. .*...*..
  2477. *.....*.
  2478. *.....*.
  2479. *******.
  2480. *.......
  2481. *.....*.
  2482. .*...*..
  2483. ..***...
  2484. ........
  2485. ........
  2486.  
  2487. char 0x8a
  2488. ...*....
  2489. ....*...
  2490. .....*..
  2491. ........
  2492. ........
  2493. ..***...
  2494. .*...*..
  2495. *.....*.
  2496. *.....*.
  2497. *******.
  2498. *.......
  2499. *.....*.
  2500. .*...*..
  2501. ..***...
  2502. ........
  2503. ........
  2504.  
  2505. char 0x8b
  2506. ........
  2507. ........
  2508. ..*..*..
  2509. ..*..*..
  2510. ........
  2511. ...*....
  2512. ...*....
  2513. ...*....
  2514. ...*....
  2515. ...*....
  2516. ...*....
  2517. ...*....
  2518. ...*....
  2519. ...*....
  2520. ........
  2521. ........
  2522.  
  2523. char 0x8c
  2524. ........
  2525. ...*....
  2526. ..*.*...
  2527. .*...*..
  2528. ........
  2529. ...*....
  2530. ...*....
  2531. ...*....
  2532. ...*....
  2533. ...*....
  2534. ...*....
  2535. ...*....
  2536. ...*....
  2537. ...*....
  2538. ........
  2539. ........
  2540.  
  2541. char 0x8d
  2542. ...*....
  2543. ....*...
  2544. .....*..
  2545. ........
  2546. ........
  2547. ...*....
  2548. ...*....
  2549. ...*....
  2550. ...*....
  2551. ...*....
  2552. ...*....
  2553. ...*....
  2554. ...*....
  2555. ...*....
  2556. ........
  2557. ........
  2558.  
  2559. char 0x8e
  2560. ..*..*..
  2561. ..*..*..
  2562. ........
  2563. ..***...
  2564. .*...*..
  2565. *.....*.
  2566. *.....*.
  2567. *.....*.
  2568. *.....*.
  2569. *******.
  2570. *.....*.
  2571. *.....*.
  2572. *.....*.
  2573. *.....*.
  2574. ........
  2575. ........
  2576.  
  2577. char 0x8f
  2578. ........
  2579. ..***...
  2580. .*...*..
  2581. ..***...
  2582. .*...*..
  2583. *.....*.
  2584. *.....*.
  2585. *.....*.
  2586. *.....*.
  2587. *******.
  2588. *.....*.
  2589. *.....*.
  2590. *.....*.
  2591. *.....*.
  2592. ........
  2593. ........
  2594.  
  2595. char 0x90
  2596. ....**..
  2597. ....*...
  2598. ...*....
  2599. *******.
  2600. *.......
  2601. *.......
  2602. *.......
  2603. *.......
  2604. *****...
  2605. *.......
  2606. *.......
  2607. *.......
  2608. *.......
  2609. *******.
  2610. ........
  2611. ........
  2612.  
  2613. char 0x91
  2614. ........
  2615. ........
  2616. ........
  2617. ........
  2618. ........
  2619. .**.....
  2620. ...***..
  2621. ...*..*.
  2622. .***..*.
  2623. *..****.
  2624. *..*....
  2625. *..*....
  2626. *..*..*.
  2627. .**.**..
  2628. ........
  2629. ........
  2630.  
  2631. char 0x92
  2632. ....**..
  2633. ...*....
  2634. ..*.....
  2635. ..*.*...
  2636. ..*.*...
  2637. ..*.*...
  2638. *******.
  2639. ..*.*...
  2640. ..*.*...
  2641. ..*.*...
  2642. ..*.*...
  2643. ..*.*...
  2644. ..*.*...
  2645. ..*.*...
  2646. ........
  2647. ........
  2648.  
  2649. char 0x93
  2650. ........
  2651. ...*....
  2652. ..*.*...
  2653. .*...*..
  2654. ........
  2655. ..***...
  2656. .*...*..
  2657. *.....*.
  2658. *.....*.
  2659. *.....*.
  2660. *.....*.
  2661. *.....*.
  2662. .*...*..
  2663. ..***...
  2664. ........
  2665. ........
  2666.  
  2667. char 0x94
  2668. ........
  2669. ........
  2670. ..*..*..
  2671. ..*..*..
  2672. ........
  2673. ..***...
  2674. .*...*..
  2675. *.....*.
  2676. *.....*.
  2677. *.....*.
  2678. *.....*.
  2679. *.....*.
  2680. .*...*..
  2681. ..***...
  2682. ........
  2683. ........
  2684.  
  2685. char 0x95
  2686. ...*....
  2687. ....*...
  2688. .....*..
  2689. ........
  2690. ........
  2691. ..***...
  2692. .*...*..
  2693. *.....*.
  2694. *.....*.
  2695. *.....*.
  2696. *.....*.
  2697. *.....*.
  2698. .*...*..
  2699. ..***...
  2700. ........
  2701. ........
  2702.  
  2703. char 0x96
  2704. ........
  2705. ...*....
  2706. ..*.*...
  2707. .*...*..
  2708. ........
  2709. *.....*.
  2710. *.....*.
  2711. *.....*.
  2712. *.....*.
  2713. *.....*.
  2714. *.....*.
  2715. *.....*.
  2716. .*....*.
  2717. ..*****.
  2718. ........
  2719. ........
  2720.  
  2721. char 0x97
  2722. ...*....
  2723. ....*...
  2724. .....*..
  2725. ........
  2726. ........
  2727. *.....*.
  2728. *.....*.
  2729. *.....*.
  2730. *.....*.
  2731. *.....*.
  2732. *.....*.
  2733. *.....*.
  2734. .*....*.
  2735. ..*****.
  2736. ........
  2737. ........
  2738.  
  2739. char 0x98
  2740. ........
  2741. ........
  2742. ..*..*..
  2743. ..*..*..
  2744. ........
  2745. *.....*.
  2746. *.....*.
  2747. .*...*..
  2748. .*...*..
  2749. ..*.*...
  2750. ..*.*...
  2751. ...*....
  2752. ...*....
  2753. ..*.....
  2754. ..*.....
  2755. .*......
  2756.  
  2757. char 0x99
  2758. ..*..*..
  2759. ..*..*..
  2760. ........
  2761. ..***...
  2762. .*...*..
  2763. *.....*.
  2764. *.....*.
  2765. *.....*.
  2766. *.....*.
  2767. *.....*.
  2768. *.....*.
  2769. *.....*.
  2770. .*...*..
  2771. ..***...
  2772. ........
  2773. ........
  2774.  
  2775. char 0x9a
  2776. ..*..*..
  2777. ..*..*..
  2778. ........
  2779. *.....*.
  2780. *.....*.
  2781. *.....*.
  2782. *.....*.
  2783. *.....*.
  2784. *.....*.
  2785. *.....*.
  2786. *.....*.
  2787. *.....*.
  2788. .*...*..
  2789. ..***...
  2790. ........
  2791. ........
  2792.  
  2793. char 0x9b
  2794. ........
  2795. ..*.*...
  2796. ..*.*...
  2797. ..*.*...
  2798. ..****..
  2799. .**.*.*.
  2800. *.*.*...
  2801. *.*.*...
  2802. *.*.*...
  2803. *.*.*...
  2804. *.*.*...
  2805. .**.*.*.
  2806. ..****..
  2807. ..*.*...
  2808. ..*.*...
  2809. ..*.*...
  2810.  
  2811. char 0x9c
  2812. ........
  2813. ....**..
  2814. ...*..*.
  2815. ..*.....
  2816. ..*.....
  2817. ..*.....
  2818. ******..
  2819. ..*.....
  2820. ..*.....
  2821. ..*.....
  2822. .**.....
  2823. *.*.....
  2824. *.**..*.
  2825. .*..**..
  2826. ........
  2827. ........
  2828.  
  2829. char 0x9d
  2830. ........
  2831. *.....*.
  2832. *.....*.
  2833. .*...*..
  2834. ..*.*...
  2835. ...*....
  2836. *******.
  2837. ...*....
  2838. ...*....
  2839. *******.
  2840. ...*....
  2841. ...*....
  2842. ...*....
  2843. ...*....
  2844. ........
  2845. ........
  2846.  
  2847. char 0x9e
  2848. ........
  2849. ***.....
  2850. *..*....
  2851. *...*...
  2852. *...*...
  2853. *...*...
  2854. *..*.*..
  2855. ***..*..
  2856. *..*****
  2857. *....*..
  2858. *....*..
  2859. *....*..
  2860. *....*..
  2861. *....*..
  2862. ........
  2863. ........
  2864.  
  2865. char 0x9f
  2866. ........
  2867. ....**..
  2868. ...*..*.
  2869. ...*....
  2870. ...*....
  2871. ...*....
  2872. *******.
  2873. ...*....
  2874. ...*....
  2875. ...*....
  2876. ...*....
  2877. ...*....
  2878. *..*....
  2879. .**.....
  2880. ........
  2881. ........
  2882.  
  2883. char 0xa0
  2884. ....**..
  2885. ....*...
  2886. ...*....
  2887. ........
  2888. ........
  2889. .****...
  2890. .....*..
  2891. .....*..
  2892. ..****..
  2893. .*...*..
  2894. *....*..
  2895. *....*..
  2896. .*...*..
  2897. ..*****.
  2898. ........
  2899. ........
  2900.  
  2901. char 0xa1
  2902. ....**..
  2903. ....*...
  2904. ...*....
  2905. ........
  2906. ........
  2907. ...*....
  2908. ...*....
  2909. ...*....
  2910. ...*....
  2911. ...*....
  2912. ...*....
  2913. ...*....
  2914. ...*....
  2915. ...*....
  2916. ........
  2917. ........
  2918.  
  2919. char 0xa2
  2920. ....**..
  2921. ....*...
  2922. ...*....
  2923. ........
  2924. ........
  2925. ..***...
  2926. .*...*..
  2927. *.....*.
  2928. *.....*.
  2929. *.....*.
  2930. *.....*.
  2931. *.....*.
  2932. .*...*..
  2933. ..***...
  2934. ........
  2935. ........
  2936.  
  2937. char 0xa3
  2938. ....**..
  2939. ....*...
  2940. ...*....
  2941. ........
  2942. ........
  2943. *.....*.
  2944. *.....*.
  2945. *.....*.
  2946. *.....*.
  2947. *.....*.
  2948. *.....*.
  2949. *.....*.
  2950. .*....*.
  2951. ..*****.
  2952. ........
  2953. ........
  2954.  
  2955. char 0xa4
  2956. ........
  2957. ...*..*.
  2958. ..*.*.*.
  2959. ..*..*..
  2960. ........
  2961. *****...
  2962. *....*..
  2963. *.....*.
  2964. *.....*.
  2965. *.....*.
  2966. *.....*.
  2967. *.....*.
  2968. *.....*.
  2969. *.....*.
  2970. ........
  2971. ........
  2972.  
  2973. char 0xa5
  2974. ...*..*.
  2975. ..*.*.*.
  2976. ..*..*..
  2977. ........
  2978. *.....*.
  2979. **....*.
  2980. **....*.
  2981. *.*...*.
  2982. *..*..*.
  2983. *..*..*.
  2984. *...*.*.
  2985. *....**.
  2986. *....**.
  2987. *.....*.
  2988. ........
  2989. ........
  2990.  
  2991. char 0xa6
  2992. ........
  2993. ........
  2994. ........
  2995. .****...
  2996. .....*..
  2997. .....*..
  2998. ..****..
  2999. .*...*..
  3000. *....*..
  3001. *....*..
  3002. .*...*..
  3003. ..*****.
  3004. ........
  3005. *******.
  3006. ........
  3007. ........
  3008.  
  3009. char 0xa7
  3010. ........
  3011. ........
  3012. ........
  3013. ..***...
  3014. .*...*..
  3015. *.....*.
  3016. *.....*.
  3017. *.....*.
  3018. *.....*.
  3019. *.....*.
  3020. .*...*..
  3021. ..***...
  3022. ........
  3023. *******.
  3024. ........
  3025. ........
  3026.  
  3027. char 0xa8
  3028. ........
  3029. ...*....
  3030. ...*....
  3031. ........
  3032. ........
  3033. ...*....
  3034. ...*....
  3035. ..*.....
  3036. .*...*..
  3037. *.....*.
  3038. *.....*.
  3039. *.....*.
  3040. .*...*..
  3041. ..***...
  3042. ........
  3043. ........
  3044.  
  3045. char 0xa9
  3046. ........
  3047. ........
  3048. ........
  3049. ........
  3050. ........
  3051. ........
  3052. ........
  3053. ........
  3054. ........
  3055. ........
  3056. *******.
  3057. *.......
  3058. *.......
  3059. *.......
  3060. ........
  3061. ........
  3062.  
  3063. char 0xaa
  3064. ........
  3065. ........
  3066. ........
  3067. ........
  3068. ........
  3069. ........
  3070. ........
  3071. ........
  3072. ........
  3073. ........
  3074. *******.
  3075. ......*.
  3076. ......*.
  3077. ......*.
  3078. ........
  3079. ........
  3080.  
  3081. char 0xab
  3082. ........
  3083. ...*....
  3084. ..**....
  3085. ...*....
  3086. ...*....
  3087. ...*....
  3088. ........
  3089. *******.
  3090. ........
  3091. .****...
  3092. .....*..
  3093. ..***...
  3094. .*......
  3095. .*****..
  3096. ........
  3097. ........
  3098.  
  3099. char 0xac
  3100. ........
  3101. ...*....
  3102. ..**....
  3103. ...*....
  3104. ...*....
  3105. ...*....
  3106. ........
  3107. *******.
  3108. ........
  3109. ...**...
  3110. ..*.*...
  3111. .*..*...
  3112. .*****..
  3113. ....*...
  3114. ........
  3115. ........
  3116.  
  3117. char 0xad
  3118. ........
  3119. ...*....
  3120. ...*....
  3121. ........
  3122. ........
  3123. ...*....
  3124. ...*....
  3125. ...*....
  3126. ...*....
  3127. ...*....
  3128. ...*....
  3129. ...*....
  3130. ...*....
  3131. ...*....
  3132. ........
  3133. ........
  3134.  
  3135. char 0xae
  3136. ........
  3137. ........
  3138. ........
  3139. ........
  3140. ...*..*.
  3141. ..*..*..
  3142. .*..*...
  3143. *..*....
  3144. *..*....
  3145. .*..*...
  3146. ..*..*..
  3147. ...*..*.
  3148. ........
  3149. ........
  3150. ........
  3151. ........
  3152.  
  3153. char 0xaf
  3154. ........
  3155. ........
  3156. ........
  3157. ........
  3158. *..*....
  3159. .*..*...
  3160. ..*..*..
  3161. ...*..*.
  3162. ...*..*.
  3163. ..*..*..
  3164. .*..*...
  3165. *..*....
  3166. ........
  3167. ........
  3168. ........
  3169. ........
  3170.  
  3171. char 0xb0
  3172. ...*...*
  3173. .*...*..
  3174. ...*...*
  3175. .*...*..
  3176. ...*...*
  3177. .*...*..
  3178. ...*...*
  3179. .*...*..
  3180. ...*...*
  3181. .*...*..
  3182. ...*...*
  3183. .*...*..
  3184. ...*...*
  3185. .*...*..
  3186. ...*...*
  3187. .*...*..
  3188.  
  3189. char 0xb1
  3190. .*.*.*.*
  3191. *.*.*.*.
  3192. .*.*.*.*
  3193. *.*.*.*.
  3194. .*.*.*.*
  3195. *.*.*.*.
  3196. .*.*.*.*
  3197. *.*.*.*.
  3198. .*.*.*.*
  3199. *.*.*.*.
  3200. .*.*.*.*
  3201. *.*.*.*.
  3202. .*.*.*.*
  3203. *.*.*.*.
  3204. .*.*.*.*
  3205. *.*.*.*.
  3206.  
  3207. char 0xb2
  3208. .***.***
  3209. **.***.*
  3210. .***.***
  3211. **.***.*
  3212. .***.***
  3213. **.***.*
  3214. .***.***
  3215. **.***.*
  3216. .***.***
  3217. **.***.*
  3218. .***.***
  3219. **.***.*
  3220. .***.***
  3221. **.***.*
  3222. .***.***
  3223. **.***.*
  3224.  
  3225. char 0xb3
  3226. ...*....
  3227. ...*....
  3228. ...*....
  3229. ...*....
  3230. ...*....
  3231. ...*....
  3232. ...*....
  3233. ...*....
  3234. ...*....
  3235. ...*....
  3236. ...*....
  3237. ...*....
  3238. ...*....
  3239. ...*....
  3240. ...*....
  3241. ...*....
  3242.  
  3243. char 0xb4
  3244. ...*....
  3245. ...*....
  3246. ...*....
  3247. ...*....
  3248. ...*....
  3249. ...*....
  3250. ...*....
  3251. ****....
  3252. ...*....
  3253. ...*....
  3254. ...*....
  3255. ...*....
  3256. ...*....
  3257. ...*....
  3258. ...*....
  3259. ...*....
  3260.  
  3261. char 0xb5
  3262. ...*....
  3263. ...*....
  3264. ...*....
  3265. ...*....
  3266. ...*....
  3267. ...*....
  3268. ...*....
  3269. ****....
  3270. ...*....
  3271. ****....
  3272. ...*....
  3273. ...*....
  3274. ...*....
  3275. ...*....
  3276. ...*....
  3277. ...*....
  3278.  
  3279. char 0xb6
  3280. ...*.*..
  3281. ...*.*..
  3282. ...*.*..
  3283. ...*.*..
  3284. ...*.*..
  3285. ...*.*..
  3286. ...*.*..
  3287. ****.*..
  3288. ...*.*..
  3289. ...*.*..
  3290. ...*.*..
  3291. ...*.*..
  3292. ...*.*..
  3293. ...*.*..
  3294. ...*.*..
  3295. ...*.*..
  3296.  
  3297. char 0xb7
  3298. ........
  3299. ........
  3300. ........
  3301. ........
  3302. ........
  3303. ........
  3304. ........
  3305. ******..
  3306. ...*.*..
  3307. ...*.*..
  3308. ...*.*..
  3309. ...*.*..
  3310. ...*.*..
  3311. ...*.*..
  3312. ...*.*..
  3313. ...*.*..
  3314.  
  3315. char 0xb8
  3316. ........
  3317. ........
  3318. ........
  3319. ........
  3320. ........
  3321. ........
  3322. ........
  3323. ****....
  3324. ...*....
  3325. ****....
  3326. ...*....
  3327. ...*....
  3328. ...*....
  3329. ...*....
  3330. ...*....
  3331. ...*....
  3332.  
  3333. char 0xb9
  3334. ...*.*..
  3335. ...*.*..
  3336. ...*.*..
  3337. ...*.*..
  3338. ...*.*..
  3339. ...*.*..
  3340. ...*.*..
  3341. ****.*..
  3342. .....*..
  3343. ****.*..
  3344. ...*.*..
  3345. ...*.*..
  3346. ...*.*..
  3347. ...*.*..
  3348. ...*.*..
  3349. ...*.*..
  3350.  
  3351. char 0xba
  3352. ...*.*..
  3353. ...*.*..
  3354. ...*.*..
  3355. ...*.*..
  3356. ...*.*..
  3357. ...*.*..
  3358. ...*.*..
  3359. ...*.*..
  3360. ...*.*..
  3361. ...*.*..
  3362. ...*.*..
  3363. ...*.*..
  3364. ...*.*..
  3365. ...*.*..
  3366. ...*.*..
  3367. ...*.*..
  3368.  
  3369. char 0xbb
  3370. ........
  3371. ........
  3372. ........
  3373. ........
  3374. ........
  3375. ........
  3376. ........
  3377. ******..
  3378. .....*..
  3379. ****.*..
  3380. ...*.*..
  3381. ...*.*..
  3382. ...*.*..
  3383. ...*.*..
  3384. ...*.*..
  3385. ...*.*..
  3386.  
  3387. char 0xbc
  3388. ...*.*..
  3389. ...*.*..
  3390. ...*.*..
  3391. ...*.*..
  3392. ...*.*..
  3393. ...*.*..
  3394. ...*.*..
  3395. ****.*..
  3396. .....*..
  3397. ******..
  3398. ........
  3399. ........
  3400. ........
  3401. ........
  3402. ........
  3403. ........
  3404.  
  3405. char 0xbd
  3406. ...*.*..
  3407. ...*.*..
  3408. ...*.*..
  3409. ...*.*..
  3410. ...*.*..
  3411. ...*.*..
  3412. ...*.*..
  3413. ******..
  3414. ........
  3415. ........
  3416. ........
  3417. ........
  3418. ........
  3419. ........
  3420. ........
  3421. ........
  3422.  
  3423. char 0xbe
  3424. ...*....
  3425. ...*....
  3426. ...*....
  3427. ...*....
  3428. ...*....
  3429. ...*....
  3430. ...*....
  3431. ****....
  3432. ...*....
  3433. ****....
  3434. ........
  3435. ........
  3436. ........
  3437. ........
  3438. ........
  3439. ........
  3440.  
  3441. char 0xbf
  3442. ........
  3443. ........
  3444. ........
  3445. ........
  3446. ........
  3447. ........
  3448. ........
  3449. ****....
  3450. ...*....
  3451. ...*....
  3452. ...*....
  3453. ...*....
  3454. ...*....
  3455. ...*....
  3456. ...*....
  3457. ...*....
  3458.  
  3459. char 0xc0
  3460. ...*....
  3461. ...*....
  3462. ...*....
  3463. ...*....
  3464. ...*....
  3465. ...*....
  3466. ...*....
  3467. ...*****
  3468. ........
  3469. ........
  3470. ........
  3471. ........
  3472. ........
  3473. ........
  3474. ........
  3475. ........
  3476.  
  3477. char 0xc1
  3478. ...*....
  3479. ...*....
  3480. ...*....
  3481. ...*....
  3482. ...*....
  3483. ...*....
  3484. ...*....
  3485. ********
  3486. ........
  3487. ........
  3488. ........
  3489. ........
  3490. ........
  3491. ........
  3492. ........
  3493. ........
  3494.  
  3495. char 0xc2
  3496. ........
  3497. ........
  3498. ........
  3499. ........
  3500. ........
  3501. ........
  3502. ........
  3503. ********
  3504. ...*....
  3505. ...*....
  3506. ...*....
  3507. ...*....
  3508. ...*....
  3509. ...*....
  3510. ...*....
  3511. ...*....
  3512.  
  3513. char 0xc3
  3514. ...*....
  3515. ...*....
  3516. ...*....
  3517. ...*....
  3518. ...*....
  3519. ...*....
  3520. ...*....
  3521. ...*****
  3522. ...*....
  3523. ...*....
  3524. ...*....
  3525. ...*....
  3526. ...*....
  3527. ...*....
  3528. ...*....
  3529. ...*....
  3530.  
  3531. char 0xc4
  3532. ........
  3533. ........
  3534. ........
  3535. ........
  3536. ........
  3537. ........
  3538. ........
  3539. ********
  3540. ........
  3541. ........
  3542. ........
  3543. ........
  3544. ........
  3545. ........
  3546. ........
  3547. ........
  3548.  
  3549. char 0xc5
  3550. ...*....
  3551. ...*....
  3552. ...*....
  3553. ...*....
  3554. ...*....
  3555. ...*....
  3556. ...*....
  3557. ********
  3558. ...*....
  3559. ...*....
  3560. ...*....
  3561. ...*....
  3562. ...*....
  3563. ...*....
  3564. ...*....
  3565. ...*....
  3566.  
  3567. char 0xc6
  3568. ...*....
  3569. ...*....
  3570. ...*....
  3571. ...*....
  3572. ...*....
  3573. ...*....
  3574. ...*....
  3575. ...*****
  3576. ...*....
  3577. ...*****
  3578. ...*....
  3579. ...*....
  3580. ...*....
  3581. ...*....
  3582. ...*....
  3583. ...*....
  3584.  
  3585. char 0xc7
  3586. ...*.*..
  3587. ...*.*..
  3588. ...*.*..
  3589. ...*.*..
  3590. ...*.*..
  3591. ...*.*..
  3592. ...*.*..
  3593. ...*.***
  3594. ...*.*..
  3595. ...*.*..
  3596. ...*.*..
  3597. ...*.*..
  3598. ...*.*..
  3599. ...*.*..
  3600. ...*.*..
  3601. ...*.*..
  3602.  
  3603. char 0xc8
  3604. ...*.*..
  3605. ...*.*..
  3606. ...*.*..
  3607. ...*.*..
  3608. ...*.*..
  3609. ...*.*..
  3610. ...*.*..
  3611. ...*.***
  3612. ...*....
  3613. ...*****
  3614. ........
  3615. ........
  3616. ........
  3617. ........
  3618. ........
  3619. ........
  3620.  
  3621. char 0xc9
  3622. ........
  3623. ........
  3624. ........
  3625. ........
  3626. ........
  3627. ........
  3628. ........
  3629. ...*****
  3630. ...*....
  3631. ...*.***
  3632. ...*.*..
  3633. ...*.*..
  3634. ...*.*..
  3635. ...*.*..
  3636. ...*.*..
  3637. ...*.*..
  3638.  
  3639. char 0xca
  3640. ...*.*..
  3641. ...*.*..
  3642. ...*.*..
  3643. ...*.*..
  3644. ...*.*..
  3645. ...*.*..
  3646. ...*.*..
  3647. ****.***
  3648. ........
  3649. ********
  3650. ........
  3651. ........
  3652. ........
  3653. ........
  3654. ........
  3655. ........
  3656.  
  3657. char 0xcb
  3658. ........
  3659. ........
  3660. ........
  3661. ........
  3662. ........
  3663. ........
  3664. ........
  3665. ********
  3666. ........
  3667. ****.***
  3668. ...*.*..
  3669. ...*.*..
  3670. ...*.*..
  3671. ...*.*..
  3672. ...*.*..
  3673. ...*.*..
  3674.  
  3675. char 0xcc
  3676. ...*.*..
  3677. ...*.*..
  3678. ...*.*..
  3679. ...*.*..
  3680. ...*.*..
  3681. ...*.*..
  3682. ...*.*..
  3683. ...*.***
  3684. ...*....
  3685. ...*.***
  3686. ...*.*..
  3687. ...*.*..
  3688. ...*.*..
  3689. ...*.*..
  3690. ...*.*..
  3691. ...*.*..
  3692.  
  3693. char 0xcd
  3694. ........
  3695. ........
  3696. ........
  3697. ........
  3698. ........
  3699. ........
  3700. ........
  3701. ********
  3702. ........
  3703. ********
  3704. ........
  3705. ........
  3706. ........
  3707. ........
  3708. ........
  3709. ........
  3710.  
  3711. char 0xce
  3712. ...*.*..
  3713. ...*.*..
  3714. ...*.*..
  3715. ...*.*..
  3716. ...*.*..
  3717. ...*.*..
  3718. ...*.*..
  3719. ****.***
  3720. ........
  3721. ****.***
  3722. ...*.*..
  3723. ...*.*..
  3724. ...*.*..
  3725. ...*.*..
  3726. ...*.*..
  3727. ...*.*..
  3728.  
  3729. char 0xcf
  3730. ...*....
  3731. ...*....
  3732. ...*....
  3733. ...*....
  3734. ...*....
  3735. ...*....
  3736. ...*....
  3737. ********
  3738. ........
  3739. ********
  3740. ........
  3741. ........
  3742. ........
  3743. ........
  3744. ........
  3745. ........
  3746.  
  3747. char 0xd0
  3748. ...*.*..
  3749. ...*.*..
  3750. ...*.*..
  3751. ...*.*..
  3752. ...*.*..
  3753. ...*.*..
  3754. ...*.*..
  3755. ********
  3756. ........
  3757. ........
  3758. ........
  3759. ........
  3760. ........
  3761. ........
  3762. ........
  3763. ........
  3764.  
  3765. char 0xd1
  3766. ........
  3767. ........
  3768. ........
  3769. ........
  3770. ........
  3771. ........
  3772. ........
  3773. ********
  3774. ........
  3775. ********
  3776. ...*....
  3777. ...*....
  3778. ...*....
  3779. ...*....
  3780. ...*....
  3781. ...*....
  3782.  
  3783. char 0xd2
  3784. ........
  3785. ........
  3786. ........
  3787. ........
  3788. ........
  3789. ........
  3790. ........
  3791. ********
  3792. ...*.*..
  3793. ...*.*..
  3794. ...*.*..
  3795. ...*.*..
  3796. ...*.*..
  3797. ...*.*..
  3798. ...*.*..
  3799. ...*.*..
  3800.  
  3801. char 0xd3
  3802. ...*.*..
  3803. ...*.*..
  3804. ...*.*..
  3805. ...*.*..
  3806. ...*.*..
  3807. ...*.*..
  3808. ...*.*..
  3809. ...*****
  3810. ........
  3811. ........
  3812. ........
  3813. ........
  3814. ........
  3815. ........
  3816. ........
  3817. ........
  3818.  
  3819. char 0xd4
  3820. ...*....
  3821. ...*....
  3822. ...*....
  3823. ...*....
  3824. ...*....
  3825. ...*....
  3826. ...*....
  3827. ...*****
  3828. ...*....
  3829. ...*****
  3830. ........
  3831. ........
  3832. ........
  3833. ........
  3834. ........
  3835. ........
  3836.  
  3837. char 0xd5
  3838. ........
  3839. ........
  3840. ........
  3841. ........
  3842. ........
  3843. ........
  3844. ........
  3845. ...*****
  3846. ...*....
  3847. ...*****
  3848. ...*....
  3849. ...*....
  3850. ...*....
  3851. ...*....
  3852. ...*....
  3853. ...*....
  3854.  
  3855. char 0xd6
  3856. ........
  3857. ........
  3858. ........
  3859. ........
  3860. ........
  3861. ........
  3862. ........
  3863. ...*****
  3864. ...*.*..
  3865. ...*.*..
  3866. ...*.*..
  3867. ...*.*..
  3868. ...*.*..
  3869. ...*.*..
  3870. ...*.*..
  3871. ...*.*..
  3872.  
  3873. char 0xd7
  3874. ...*.*..
  3875. ...*.*..
  3876. ...*.*..
  3877. ...*.*..
  3878. ...*.*..
  3879. ...*.*..
  3880. ...*.*..
  3881. ****.***
  3882. ...*.*..
  3883. ...*.*..
  3884. ...*.*..
  3885. ...*.*..
  3886. ...*.*..
  3887. ...*.*..
  3888. ...*.*..
  3889. ...*.*..
  3890.  
  3891. char 0xd8
  3892. ...*....
  3893. ...*....
  3894. ...*....
  3895. ...*....
  3896. ...*....
  3897. ...*....
  3898. ...*....
  3899. ********
  3900. ...*....
  3901. ********
  3902. ...*....
  3903. ...*....
  3904. ...*....
  3905. ...*....
  3906. ...*....
  3907. ...*....
  3908.  
  3909. char 0xd9
  3910. ...*....
  3911. ...*....
  3912. ...*....
  3913. ...*....
  3914. ...*....
  3915. ...*....
  3916. ...*....
  3917. ****....
  3918. ........
  3919. ........
  3920. ........
  3921. ........
  3922. ........
  3923. ........
  3924. ........
  3925. ........
  3926.  
  3927. char 0xda
  3928. ........
  3929. ........
  3930. ........
  3931. ........
  3932. ........
  3933. ........
  3934. ........
  3935. ...*****
  3936. ...*....
  3937. ...*....
  3938. ...*....
  3939. ...*....
  3940. ...*....
  3941. ...*....
  3942. ...*....
  3943. ...*....
  3944.  
  3945. char 0xdb
  3946. ********
  3947. ********
  3948. ********
  3949. ********
  3950. ********
  3951. ********
  3952. ********
  3953. ********
  3954. ********
  3955. ********
  3956. ********
  3957. ********
  3958. ********
  3959. ********
  3960. ********
  3961. ********
  3962.  
  3963. char 0xdc
  3964. ........
  3965. ........
  3966. ........
  3967. ........
  3968. ........
  3969. ........
  3970. ........
  3971. ........
  3972. ********
  3973. ********
  3974. ********
  3975. ********
  3976. ********
  3977. ********
  3978. ********
  3979. ********
  3980.  
  3981. char 0xdd
  3982. ****....
  3983. ****....
  3984. ****....
  3985. ****....
  3986. ****....
  3987. ****....
  3988. ****....
  3989. ****....
  3990. ****....
  3991. ****....
  3992. ****....
  3993. ****....
  3994. ****....
  3995. ****....
  3996. ****....
  3997. ****....
  3998.  
  3999. char 0xde
  4000. ....****
  4001. ....****
  4002. ....****
  4003. ....****
  4004. ....****
  4005. ....****
  4006. ....****
  4007. ....****
  4008. ....****
  4009. ....****
  4010. ....****
  4011. ....****
  4012. ....****
  4013. ....****
  4014. ....****
  4015. ....****
  4016.  
  4017. char 0xdf
  4018. ********
  4019. ********
  4020. ********
  4021. ********
  4022. ********
  4023. ********
  4024. ********
  4025. ********
  4026. ........
  4027. ........
  4028. ........
  4029. ........
  4030. ........
  4031. ........
  4032. ........
  4033. ........
  4034.  
  4035. char 0xe0
  4036. ........
  4037. ........
  4038. ........
  4039. ........
  4040. ........
  4041. ........
  4042. ........
  4043. ........
  4044. ........
  4045. ........
  4046. ........
  4047. ........
  4048. ........
  4049. ........
  4050. ........
  4051. ........
  4052.  
  4053. char 0xe1
  4054. ........
  4055. ........
  4056. ........
  4057. ........
  4058. ........
  4059. ........
  4060. ........
  4061. ........
  4062. ........
  4063. ........
  4064. ........
  4065. ........
  4066. ........
  4067. ........
  4068. ........
  4069. ........
  4070.  
  4071. char 0xe2
  4072. ........
  4073. ........
  4074. ........
  4075. ........
  4076. ........
  4077. ........
  4078. ........
  4079. ........
  4080. ........
  4081. ........
  4082. ........
  4083. ........
  4084. ........
  4085. ........
  4086. ........
  4087. ........
  4088.  
  4089. char 0xe3
  4090. ........
  4091. ........
  4092. ........
  4093. ........
  4094. ........
  4095. ........
  4096. ........
  4097. ........
  4098. ........
  4099. ........
  4100. ........
  4101. ........
  4102. ........
  4103. ........
  4104. ........
  4105. ........
  4106.  
  4107. char 0xe4
  4108. ........
  4109. ........
  4110. ........
  4111. ........
  4112. ........
  4113. ........
  4114. ........
  4115. ........
  4116. ........
  4117. ........
  4118. ........
  4119. ........
  4120. ........
  4121. ........
  4122. ........
  4123. ........
  4124.  
  4125. char 0xe5
  4126. ........
  4127. ........
  4128. ........
  4129. ........
  4130. ........
  4131. ........
  4132. ........
  4133. ........
  4134. ........
  4135. ........
  4136. ........
  4137. ........
  4138. ........
  4139. ........
  4140. ........
  4141. ........
  4142.  
  4143. char 0xe6
  4144. ........
  4145. ........
  4146. ........
  4147. ........
  4148. ........
  4149. ........
  4150. ........
  4151. ........
  4152. ........
  4153. ........
  4154. ........
  4155. ........
  4156. ........
  4157. ........
  4158. ........
  4159. ........
  4160.  
  4161. char 0xe7
  4162. ........
  4163. ........
  4164. ........
  4165. ........
  4166. ........
  4167. ........
  4168. ........
  4169. ........
  4170. ........
  4171. ........
  4172. ........
  4173. ........
  4174. ........
  4175. ........
  4176. ........
  4177. ........
  4178.  
  4179. char 0xe8
  4180. ........
  4181. ........
  4182. ........
  4183. ........
  4184. ........
  4185. ........
  4186. ........
  4187. ........
  4188. ........
  4189. ........
  4190. ........
  4191. ........
  4192. ........
  4193. ........
  4194. ........
  4195. ........
  4196.  
  4197. char 0xe9
  4198. ........
  4199. ........
  4200. ........
  4201. ........
  4202. ........
  4203. ........
  4204. ........
  4205. ........
  4206. ........
  4207. ........
  4208. ........
  4209. ........
  4210. ........
  4211. ........
  4212. ........
  4213. ........
  4214.  
  4215. char 0xea
  4216. ........
  4217. ........
  4218. ........
  4219. ........
  4220. ........
  4221. ........
  4222. ........
  4223. ........
  4224. ........
  4225. ........
  4226. ........
  4227. ........
  4228. ........
  4229. ........
  4230. ........
  4231. ........
  4232.  
  4233. char 0xeb
  4234. ........
  4235. ........
  4236. ........
  4237. ........
  4238. ........
  4239. ........
  4240. ........
  4241. ........
  4242. ........
  4243. ........
  4244. ........
  4245. ........
  4246. ........
  4247. ........
  4248. ........
  4249. ........
  4250.  
  4251. char 0xec
  4252. ........
  4253. ........
  4254. ........
  4255. ........
  4256. ........
  4257. ........
  4258. ........
  4259. ........
  4260. ........
  4261. ........
  4262. ........
  4263. ........
  4264. ........
  4265. ........
  4266. ........
  4267. ........
  4268.  
  4269. char 0xed
  4270. ........
  4271. ........
  4272. ........
  4273. ........
  4274. ........
  4275. ........
  4276. ........
  4277. ........
  4278. ........
  4279. ........
  4280. ........
  4281. ........
  4282. ........
  4283. ........
  4284. ........
  4285. ........
  4286.  
  4287. char 0xee
  4288. ........
  4289. ........
  4290. ........
  4291. ........
  4292. ........
  4293. ........
  4294. ........
  4295. ........
  4296. ........
  4297. ........
  4298. ........
  4299. ........
  4300. ........
  4301. ........
  4302. ........
  4303. ........
  4304.  
  4305. char 0xef
  4306. ........
  4307. ........
  4308. ........
  4309. ........
  4310. ........
  4311. ........
  4312. ........
  4313. ........
  4314. ........
  4315. ........
  4316. ........
  4317. ........
  4318. ........
  4319. ........
  4320. ........
  4321. ........
  4322.  
  4323. char 0xf0
  4324. ........
  4325. ........
  4326. ........
  4327. ........
  4328. ........
  4329. ........
  4330. ........
  4331. ........
  4332. ........
  4333. ........
  4334. ........
  4335. ........
  4336. ........
  4337. ........
  4338. ........
  4339. ........
  4340.  
  4341. char 0xf1
  4342. ........
  4343. ........
  4344. ........
  4345. ........
  4346. ........
  4347. ........
  4348. ........
  4349. ........
  4350. ........
  4351. ........
  4352. ........
  4353. ........
  4354. ........
  4355. ........
  4356. ........
  4357. ........
  4358.  
  4359. char 0xf2
  4360. ........
  4361. ........
  4362. ........
  4363. ........
  4364. ........
  4365. ........
  4366. ........
  4367. ........
  4368. ........
  4369. ........
  4370. ........
  4371. ........
  4372. ........
  4373. ........
  4374. ........
  4375. ........
  4376.  
  4377. char 0xf3
  4378. ........
  4379. ........
  4380. ........
  4381. ........
  4382. ........
  4383. ........
  4384. ........
  4385. ........
  4386. ........
  4387. ........
  4388. ........
  4389. ........
  4390. ........
  4391. ........
  4392. ........
  4393. ........
  4394.  
  4395. char 0xf4
  4396. ........
  4397. ........
  4398. ........
  4399. ........
  4400. ........
  4401. ........
  4402. ........
  4403. ........
  4404. ........
  4405. ........
  4406. ........
  4407. ........
  4408. ........
  4409. ........
  4410. ........
  4411. ........
  4412.  
  4413. char 0xf5
  4414. ........
  4415. ........
  4416. ........
  4417. ........
  4418. ........
  4419. ........
  4420. ........
  4421. ........
  4422. ........
  4423. ........
  4424. ........
  4425. ........
  4426. ........
  4427. ........
  4428. ........
  4429. ........
  4430.  
  4431. char 0xf6
  4432. ........
  4433. ........
  4434. ........
  4435. ........
  4436. ........
  4437. ........
  4438. ........
  4439. ........
  4440. ........
  4441. ........
  4442. ........
  4443. ........
  4444. ........
  4445. ........
  4446. ........
  4447. ........
  4448.  
  4449. char 0xf7
  4450. ........
  4451. ........
  4452. ........
  4453. ........
  4454. ........
  4455. ........
  4456. ........
  4457. ........
  4458. ........
  4459. ........
  4460. ........
  4461. ........
  4462. ........
  4463. ........
  4464. ........
  4465. ........
  4466.  
  4467. char 0xf8
  4468. ........
  4469. ........
  4470. ........
  4471. ........
  4472. ........
  4473. ........
  4474. ........
  4475. ........
  4476. ........
  4477. ........
  4478. ........
  4479. ........
  4480. ........
  4481. ........
  4482. ........
  4483. ........
  4484.  
  4485. char 0xf9
  4486. ........
  4487. ........
  4488. ........
  4489. ........
  4490. ........
  4491. ........
  4492. ........
  4493. ........
  4494. ........
  4495. ........
  4496. ........
  4497. ........
  4498. ........
  4499. ........
  4500. ........
  4501. ........
  4502.  
  4503. char 0xfa
  4504. ........
  4505. ........
  4506. ........
  4507. ........
  4508. ........
  4509. ........
  4510. ........
  4511. ........
  4512. ........
  4513. ........
  4514. ........
  4515. ........
  4516. ........
  4517. ........
  4518. ........
  4519. ........
  4520.  
  4521. char 0xfb
  4522. ........
  4523. ........
  4524. ........
  4525. ........
  4526. ........
  4527. ........
  4528. ........
  4529. ........
  4530. ........
  4531. ........
  4532. ........
  4533. ........
  4534. ........
  4535. ........
  4536. ........
  4537. ........
  4538.  
  4539. char 0xfc
  4540. ........
  4541. ........
  4542. ........
  4543. ........
  4544. ........
  4545. ........
  4546. ........
  4547. ........
  4548. ........
  4549. ........
  4550. ........
  4551. ........
  4552. ........
  4553. ........
  4554. ........
  4555. ........
  4556.  
  4557. char 0xfd
  4558. ........
  4559. ........
  4560. ........
  4561. ........
  4562. ........
  4563. ........
  4564. ........
  4565. ........
  4566. ........
  4567. ........
  4568. ........
  4569. ........
  4570. ........
  4571. ........
  4572. ........
  4573. ........
  4574.  
  4575. char 0xfe
  4576. ........
  4577. ........
  4578. ........
  4579. ........
  4580. ........
  4581. ........
  4582. ........
  4583. ........
  4584. ........
  4585. ........
  4586. ........
  4587. ........
  4588. ........
  4589. ........
  4590. ........
  4591. ........
  4592.  
  4593. char 0xff
  4594. ........
  4595. ........
  4596. ........
  4597. ........
  4598. ........
  4599. ........
  4600. ........
  4601. ........
  4602. ........
  4603. ........
  4604. ........
  4605. ........
  4606. ........
  4607. ........
  4608. ........
  4609. ........

hankaku.txt

PS: 这就是个字库,对于硬件级工程,字库是必须的!为什么我们编辑器里选择字形时英文这么多,汉字这么少,是因为设计中文字库的人少,一方面劳动量大,另一方面没钱赚,所以我们有着丰富的书法文化却只有几个可怜的字形可以选择!

  1. ; naskfunc
  2. ; TAB=4
  3.  
  4. [FORMAT "WCOFF"] ; 制成目标文件的形式
  5. [INSTRSET "i486p"] ; 使用486格式命令
  6. [BITS ] ; 制作32模式用的机器语言
  7. [FILE "naskfunc.nas"] ; 源文件名信息
  8. ; 程序中包含的函数名
  9. GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt
  10. GLOBAL _io_in8, _io_in16, _io_in32
  11. GLOBAL _io_out8, _io_out16, _io_out32
  12. GLOBAL _io_load_eflags, _io_store_eflags
  13. GLOBAL _load_gdtr, _load_idtr
  14. GLOBAL _asm_inthandler21, _asm_inthandler27, _asm_inthandler2c
  15. EXTERN _inthandler21, _inthandler27, _inthandler2c
  16.  
  17. [SECTION .text] ; 目标文件中写了这些后再写程序
  18.  
  19. _io_hlt: ; void io_hlt(void);
  20. HLT
  21. RET
  22.  
  23. _io_cli: ; void io_cli(void);
  24. CLI
  25. RET
  26.  
  27. _io_sti: ; void io_sti(void);
  28. STI
  29. RET
  30.  
  31. _io_stihlt: ; void io_stihlt(void);
  32. STI
  33. HLT
  34. RET
  35.  
  36. _io_in8: ; int io_in8(int port);
  37. MOV EDX,[ESP+] ; port
  38. MOV EAX,
  39. IN AL,DX
  40. RET
  41.  
  42. _io_in16: ; int io_in16(int port);
  43. MOV EDX,[ESP+] ; port
  44. MOV EAX,
  45. IN AX,DX
  46. RET
  47.  
  48. _io_in32: ; int io_in32(int port);
  49. MOV EDX,[ESP+] ; port
  50. IN EAX,DX
  51. RET
  52.  
  53. _io_out8: ; void io_out8(int port, int data);
  54. MOV EDX,[ESP+] ; port
  55. MOV AL,[ESP+] ; data
  56. OUT DX,AL
  57. RET
  58.  
  59. _io_out16: ; void io_out16(int port, int data);
  60. MOV EDX,[ESP+] ; port
  61. MOV EAX,[ESP+] ; data
  62. OUT DX,AX
  63. RET
  64.  
  65. _io_out32: ; void io_out32(int port, int data);
  66. MOV EDX,[ESP+] ; port
  67. MOV EAX,[ESP+] ; data
  68. OUT DX,EAX
  69. RET
  70.  
  71. _io_load_eflags: ; int io_load_eflags(void);
  72. PUSHFD ; PUSH EFLAGS という意味
  73. POP EAX
  74. RET
  75.  
  76. _io_store_eflags: ; void io_store_eflags(int eflags);
  77. MOV EAX,[ESP+]
  78. PUSH EAX
  79. POPFD ; POP EFLAGS という意味
  80. RET
  81.  
  82. _load_gdtr: ; void load_gdtr(int limit, int addr);
  83. MOV AX,[ESP+] ; limit
  84. MOV [ESP+],AX
  85. LGDT [ESP+]
  86. RET
  87.  
  88. ;1) 这个函数用来指定的段上限和地址赋值给GDTR48位寄存器,这是个很特殊的寄存器,并不能用MOV来直接赋值
  89. ;,唯一的方法就是指定一个内存地址,从指定的内存地址读取6字节(也就是48位),然后赋值给GDTR寄存器。完成这一任务的指令就是LGDT
  90. ;2) 该寄存器的低16位(即内存的最初的2个字节)是段上限,它等于“GDT的有效的字节数-1”,剩下的32位,代表GDT的开始地址
  91. ;3) 这里2个参数是ESP+4ESP+8里存放,而我们要的是6字节形式的,所以要转换为我们想要的形式~
  92. _load_idtr: ; void load_idtr(int limit, int addr);
  93. MOV AX,[ESP+] ; limit
  94. MOV [ESP+],AX
  95. LIDT [ESP+]
  96. RET
  97.  
  98. ;这个函数只是将寄存器的值保存在栈里,然后将DSES调整到与SS相等,再调用_inthandler21,返回后将所有寄存器的值再返回到原来的值,然后执行IRETD
  99. ;之所以如此小心翼翼地保护寄存器,原因在于,中断处理发生在函数处理途中,通过IREDT从中断处理后,寄存器就乱了
  100. _asm_inthandler21:
  101. PUSH ES
  102. PUSH DS
  103. PUSHAD
  104. MOV EAX,ESP
  105. PUSH EAX
  106. MOV AX,SS
  107. MOV DS,AX
  108. MOV ES,AX
  109. CALL _inthandler21
  110. POP EAX
  111. POPAD
  112. POP DS
  113. POP ES
  114. IRETD
  115.  
  116. _asm_inthandler27:
  117. PUSH ES
  118. PUSH DS
  119. PUSHAD
  120. MOV EAX,ESP
  121. PUSH EAX
  122. MOV AX,SS
  123. MOV DS,AX
  124. MOV ES,AX
  125. CALL _inthandler27
  126. POP EAX
  127. POPAD
  128. POP DS
  129. POP ES
  130. IRETD
  131.  
  132. _asm_inthandler2c:
  133. PUSH ES
  134. PUSH DS
  135. PUSHAD
  136. MOV EAX,ESP
  137. PUSH EAX
  138. MOV AX,SS
  139. MOV DS,AX
  140. MOV ES,AX
  141. CALL _inthandler2c
  142. POP EAX
  143. POPAD
  144. POP DS
  145. POP ES
  146. IRETD

naskfunc.nas

PS: 一些不能用c语言来完成的函数还得用汇编,于是就都放在这个文件里了~


3、效果说明:

>_<" 这里已经实现了文字显示,鼠标显示,键盘和鼠标信息的读取,其中涉及的知识有:GDT,IDT,中断,FIFO,VRAM,字库等,最终效果如下:

PS: 最上面显示鼠标当前位置,第二行左边显示按键信息,右边lcr显示鼠标点击事件(如果左边被点击l就变大写L,其他相同道理),后面两个数据是鼠标此次移动距离~

PS: 该系统的内存分布图:在文件asmhead.nas有详细注释

  1. 146 ;----------------------------------------------------------------------------------------------------
  2. 147 ;内存分配:
  3. 148 ; 0x00000000-0x000fffff:虽然在启动中会多次使用,但之后就会变空(1M)
  4. 149 ; 0x00100000-0x00267fff:用于保存软盘的内容(1440KB)
  5. 150 ; 0x00268000-0x0026f7ff:空(30KB)
  6. 151 ; 0x0026f800-0x0026ffff:IDT(2KB)
  7. 152 ; 0x00270000-0x0027ffff:GDT(64KB)
  8. 153 ; 0x00280000-0x002fffff:bootpack.hrb(512KB)
  9. 154 ; 0x00300000-0x003fffff:栈及其他(1MB)
  10. 155 ; 0x00400000- :空
  11. 156 ;----------------------------------------------------------------------------------------------------

LZ:http://www.cnblogs.com/zjutlitao/

[自制简单操作系统] 2、鼠标及键盘中断处理事件[PIC\GDT\IDT\FIFO]的更多相关文章

  1. [自制简单操作系统] 7、多任务(二)——任务管理自动化&任务休眠

    前言 >_<" 这里仿照窗口管理的方式将任务管理也修改成相应的管理模式,这样可以灵活的添加多个任务,而不必每次都要修改任务切换函数:此外还在任务休眠做了尝试,通过将任务挂起和唤醒 ...

  2. [自制简单操作系统] 1、从0-1到汇编再到c语言的奥秘

    目录: 1.用0-1编写最简单的操作系统 2.用汇编改写上面0-1程序 2.1 只用DB的汇编改写版  2.2 加入RESB汇编的改写版  2.3 进一步使用汇编替换0-1文件  2.4 核心程序也用 ...

  3. 操作系统开发系列—12.g.在内核中设置键盘中断

    8259A虽然已经设置完成,但是我们还没有真正开始使用它呢. 所有的中断都会触发一个函数spurious_irq(),这个函数的定义如下: PUBLIC void spurious_irq(int i ...

  4. MFC--响应鼠标和键盘操作

    一个程序最重要的部分之一是对鼠标和键盘操作的响应. 一.  理解鼠标事件.之前对鼠标事件的认识仅仅局限于处理控件的单击与双击事件.但实际鼠标的操作包含很多.这里将以一个画图的小程序讲解对鼠标的响应. ...

  5. [python] PyMouse、PyKeyboard用python操作鼠标和键盘

      1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quart ...

  6. 50-用Python监听鼠标和键盘事件

    转自:https://www.cnblogs.com/qiernonstop/p/3654021.html 用Python监听鼠标和键盘事件 PyHook是一个基于Python的“钩子”库,主要用于监 ...

  7. 用Python监听鼠标和键盘事件

    PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所 ...

  8. C# WPF 中用代码模拟鼠标和键盘的操作

    原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是,在WPF中不能使用这个方法了. 我们知道,在 ...

  9. Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作

    目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...

随机推荐

  1. 一个PHP日历程序

    <?php  //<-------处理通过GET方法提交的变量;开始-------->  if($HTTP_GET_VARS[year]=="")  {      ...

  2. 【项目】搜索广告CTR预估(一)

    本文介绍CTR相关基础知识. 一.广告投放系统 广告系统包含多个子系统.除了上图所示的广告投放系统外,还包含商业系统(广告库的获得),统计系统(点击展示日志的获得)等. 广告投放系统主要是面向用户的, ...

  3. pickle

    [pickle] Python提供了pickle模块来实现序列化. 首先,我们尝试把一个对象序列化并写入文件: pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个by ...

  4. SQL触发器中的deleted表和inserted表

    SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...

  5. 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...

  6. Debussy与modelsim联仿时 do 文件脚本

    quit -sim set PATH1 D:/Program/modelsim/vivado_lib set PATH2 D:/Program/Vivado/Vivado/2014.4/data/ve ...

  7. Unity3D手游开发日记(9) - 互动草的效果

    所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...

  8. VS2013使用rtklib中需要注意的一些问题(编译)

    最近因为项目需要需要对rtcm数据进行解码,rtklib提供了很多底层的函数,准备直接输出标准DLL的方式供C#调用.下面把项目中引用rtklib源码需要注意的地方记录下. 1. 首先在vs2013中 ...

  9. Oracle一个中文汉字占用几个字节

    Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定   查看oracle server端字符集 select userenv('language') from dual; 如 ...

  10. SQL语句一次INSERT多条记录的方法

    1.SQL Server或MySQL中: INSERT INTO `userTable` (`user_id`, `user_name`) VALUES (, 'dsf'), (, 'fgy'), ( ...