[自制簡單操作系統] 2、鼠標及鍵盤中斷處理事件[PIC\GDT\IDT\FIFO]


 

 

1、大致介紹:

>_<" 大致執行順序是:ipl10.nas->asmhead.nas->bootpack.c

PS: 這里bootpack.c要調用graphic.c、dsctbl.c、fifo.c、int.c實現功能,其中有些函數還必須匯編來寫,所以單獨寫一個匯編文件naskfunc.nas,為了方便看全部函數和結構體,所以寫一個bootpack.h來寫一些結構體和函數聲明~

>_<" 下面是編譯圖解:最終生成的haribote.img可放在軟盤來啟動電腦,加載操作系統~

  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 0
 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:512 from:0 to:0 \
 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 %1 %2 %3 %4 %5 %6 %7 %8 %9
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        10                ; 定義讀的柱面數
  4         ORG        0x7c00            ; 指明程序裝載地址
  5 
  6 ; 以下這段是FAT12格式軟盤專用代碼  0x7c00--0x7dff 125字節 用於啟動區
  7         JMP        entry
  8         DB        0x90
  9         DB        "HARIBOTE"         ; 啟動區的名字可以是任意的,但必須是8字節
 10         DW        512                ; 每個扇區(sector)的大小必須為512字節
 11         DB        1                  ; 簇(cluster)的大小必須為1個扇區
 12         DW        1                  ; FAT的起始位置(一般從第一個扇區開始)
 13         DB        2                  ; FAT的個數(必須為2)
 14         DW        224                ; 根目錄的大小(一般設為244項)
 15         DW        2880               ; 該磁盤的的大小(必須為2880扇區)
 16         DB        0xf0               ; 磁盤的種類(必須為0xfd)
 17         DW        9                  ; FAT的長度(必須為9扇區)
 18         DW        18                 ; 一個磁道(track)有幾個扇區(必須為18)
 19         DW        2                  ; 磁頭數(必須為2)
 20         DD        0                  ; 不使用分區(必須為0)
 21         DD        2880               ; 重寫一次磁盤大小
 22         DB        0,0,0x29           ; 意義不明,固定
 23         DD        0xffffffff         ; (可能是)卷標號碼
 24         DB        "HARIBOTEOS "      ; 磁盤名稱(11字節)
 25         DB        "FAT12   "         ; 磁盤格式名稱(8字節)
 26         RESB    18                   ; 先騰出18字節
 27 
 28 ; 程序核心
 29 entry:
 30         MOV        AX,0              ; 初始化寄存器
 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              ; 柱面0
 39         MOV        DH,0              ; 磁頭0
 40         MOV        CL,2              ; 扇區2   
 41 readloop:        
 42         MOv     SI,0                 ; 記錄失敗次數的寄存器
 43 retry:
 44         MOV        AH,0x02           ; AH=0x02 : 讀盤
 45         MOV        AL,1              ; 1個扇區
 46         MOV        BX,0
 47         MOV        DL,0x00           ; A驅動器
 48         INT        0x13              ; 調用磁盤BIOS
 49         JNC     next                 ; 沒出錯就跳轉到next繼續讀下一個做准備
 50         ADD     SI,1                 ; SI++
 51         CMP     SI,5                 ; 比較SI和5
 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,1                 ; 往CL里加1 (所讀扇區標號,開始是2,見初始化部分)
 62         CMP     CL,18                ; 和18比較 
 63         JBE     readloop             ; 小於18就跳轉到readloop繼續讀 
 64         MOV     CL,1                 ; 扇區1
 65         ADD     DH,1                 ; 磁頭+1
 66         CMP     DH,2                 ; 判斷磁頭是否超過2
 67         JB      readloop             ; 沒有超過就繼續讀
 68         MOV     DH,0                 ; 超過2就轉為0
 69         ADD     CH,1                 ; 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,1              ; 給SI加1
 83         CMP        AL,0
 84         JE        fin
 85         MOV        AH,0x0e           ; 顯示一個文字
 86         MOV        BX,15             ; 指定字符顏色
 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        0
 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],8    ; 記錄畫面模式
 22         MOV        WORD [SCRNX],320
 23         MOV        WORD [SCRNY],200
 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 ; CR0是control 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,1*8            ;  可讀寫的段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,512*1024/4
106         CALL    memcpy
107 
108 ; 磁盤的數據最終轉送到它本來的位置去
109 
110 ; 首先從啟動扇區開始
111 
112         MOV        ESI,0x7c00        ; 轉送源
113         MOV        EDI,DSKCAC        ; 轉送目的地
114         MOV        ECX,512/4
115         CALL    memcpy
116 
117 ; 所有剩下的
118 
119         MOV        ESI,DSKCAC0+512    ; 轉送源
120         MOV        EDI,DSKCAC+512    ; 轉送目的地
121         MOV        ECX,0
122         MOV        CL,BYTE [CYLS]
123         IMUL    ECX,512*18*2/4    ; 從柱面數轉為字節數/4
124         SUB        ECX,512/4        ; 減去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+16]
136         ADD        ECX,3            ; ECX += 3;
137         SHR        ECX,2            ; ECX /= 4;
138         JZ        skip            ; 沒有要轉送的東西時
139         MOV        ESI,[EBX+20]    ; 轉送源
140         ADD        ESI,EBX
141         MOV        EDI,[EBX+12]    ; 轉送目的地
142         CALL    memcpy
143 skip:
144         MOV        ESP,[EBX+12]    ; 棧初始值
145         JMP        DWORD 2*8: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,4
169         MOV        [EDI],EAX
170         ADD        EDI,4
171         SUB        ECX,1
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    16;一直添加DBO,直到地址能被16整除,如果GDT0地址不是8的倍數就會慢一些,所以...
180 GDT0:                
181         RESB    8                ; NULL selector
182         DW        0xffff,0x0000,0x9200,0x00cf    ; 可以讀寫的段(segment) 32bit
183         DW        0xffff,0x0000,0x9a28,0x0047    ; 可執行的段(segment) 32bit (bootpack用)
184 
185         DW        0
186 GDTR0:            ;是LGDT指令,通知GDT0有了GDT,在GDT0寫入了16位的段上限和32位段其實地址
187         DW        8*3-1
188         DD        GDT0
189 
190         ALIGNB    16
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[3], 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[40], mcursor[256], keybuf[32], mousebuf[128];
 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, 32, keybuf);//在fifo.c中,負責緩沖區初始化(緩沖區結構體,大小,緩沖區首址)
 27     fifo8_init(&mousefifo, 128, 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 - 16) / 2; /* 畫面中央的坐標計算 */
 38     my = (binfo->scrny - 28 - 16) / 2;
 39     init_mouse_cursor8(mcursor, COL8_008484);//在文件graphic.c里,存放鼠標顏色信息的字符指針,窗口背景顏色
 40     putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16);//在文件graphic.c里,繪制鼠標
 41     sprintf(s, "(%3d, %3d)", mx, my);//將鼠標位置坐標轉換為字符串s
 42     putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, 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) == 0) {//如果鍵盤和鼠標的緩沖區里沒有數據就SLT什么都不做並且STI恢復中斷
 49             io_stihlt();
 50         } else {//如果緩沖區中有數據
 51             if (fifo8_status(&keyfifo) != 0) {
 52                 i = fifo8_get(&keyfifo);//獲取一個數據FIFO
 53                 io_sti();//開中斷,匯編函數
 54                 sprintf(s, "%02X", i);//轉換為字符串
 55                 boxfill8(binfo->vram, binfo->scrnx, COL8_008484,  0, 16, 15, 31);//在graphic.c文件中,填充VRAM實現畫矩形操作,負責清屏操作[這一塊]
 56                 putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);//顯示字符串
 57             } else if (fifo8_status(&mousefifo) != 0) {
 58                 i = fifo8_get(&mousefifo);
 59                 io_sti();
 60                 if (mouse_decode(&mdec, i) != 0) {//對鼠標移動消息進行處理[這里比較特殊,在本文件夾內]
 61                     sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);//將鼠標坐標和lcr信息封裝成字符串待輸出,這里的x,y是移動距離
 62                     if ((mdec.btn & 0x01) != 0) {//通過判斷,將點擊事件的字符改為大寫
 63                         s[1] = 'L';
 64                     }
 65                     if ((mdec.btn & 0x02) != 0) {
 66                         s[3] = 'R';
 67                     }
 68                     if ((mdec.btn & 0x04) != 0) {
 69                         s[2] = 'C';
 70                     }
 71                     boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31);//輸出鼠標移動消息
 72                     putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
 73                     //鼠標指針移動
 74                     boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /*隱藏鼠標*/
 75                     mx += mdec.x;//計算當前鼠標的位置
 76                     my += mdec.y;
 77                     if (mx < 0) {//超屏控制
 78                         mx = 0;
 79                     }
 80                     if (my < 0) {
 81                         my = 0;
 82                     }
 83                     if (mx > binfo->scrnx - 16) {
 84                         mx = binfo->scrnx - 16;
 85                     }
 86                     if (my > binfo->scrny - 16) {
 87                         my = binfo->scrny - 16;
 88                     }
 89                     sprintf(s, "(%3d, %3d)", mx, my);
 90                     boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /*隱藏鼠標坐標消息*/
 91                     putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /*顯示鼠標坐標消息*/
 92                     putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /*顯示鼠標*/
 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) == 0) {
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 = 0;
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 == 0) {
153         /*等待鼠標的0xfa狀態*/
154         if (dat == 0xfa) {
155             mdec->phase = 1;
156         }
157         return 0;
158     }
159     if (mdec->phase == 1) {
160         /*等待鼠標的第一字節*/
161         if ((dat & 0xc8) == 0x08) {
162             /* 正しい1バイト目だった */
163             mdec->buf[0] = dat;
164             mdec->phase = 2;
165         }
166         return 0;
167     }
168     if (mdec->phase == 2) {
169         /*等待鼠標的第二字節*/
170         mdec->buf[1] = dat;
171         mdec->phase = 3;
172         return 0;
173     }
174     if (mdec->phase == 3) {
175         /*等待鼠標的第三字節,並作處理*/
176         mdec->buf[2] = dat;
177         mdec->phase = 1;//注意這里是恢復到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[0] & 0x07;
183         mdec->x = mdec->buf[1];
184         mdec->y = mdec->buf[2];
185         if ((mdec->buf[0] & 0x10) != 0) {
186             mdec->x |= 0xffffff00;
187         }
188         if ((mdec->buf[0] & 0x20) != 0) {
189             mdec->y |= 0xffffff00;
190         }
191         mdec->y = - mdec->y; /* 因為鼠標和屏幕的方向恰好相反,所以這里取反*/
192         return 1;
193     }
194     return -1; 
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 //附件:
10 void init_gdtidt(void)
11 {
12     /*在bootpack.h文件里面定義了分段結構體和中斷結構體,這里實例化gdt和idt*/
13     struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;//從0x00270000~0x0027ffff共8192個分段
14     struct GATE_DESCRIPTOR    *idt = (struct GATE_DESCRIPTOR    *) ADR_IDT;//從0x0026f800~0x0026ffff共256個分段
15     int i;
16 
17     /* GDT的初始化 */
18     for (i = 0; i <= LIMIT_GDT / 8; i++) {
19         set_segmdesc(gdt + i, 0, 0, 0);
20     }
21     //,上限,地址,屬性
22     set_segmdesc(gdt + 1, 0xffffffff,   0x00000000, AR_DATA32_RW);//設定全局段
23     set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);//設定bootpack512字節的段
24     /* ;1) 這個函數用來指定的段上限和地址賦值給GDTR的48位寄存器,這是個很特殊的寄存器,並不能用MOV來直接賦值
25     ;,唯一的方法就是指定一個內存地址,從指定的內存地址讀取6字節(也就是48位),然后賦值給GDTR寄存器。完成這一任務的指令就是LGDT
26     ;2) 該寄存器的低16位(即內存的最初的2個字節)是段上限,它等於“GDT的有效的字節數-1”,剩下的32位,代表GDT的開始地址
27     ;3) 這里2個參數是ESP+4和ESP+8里存放,而我們要的是6字節形式的,所以要轉換為我們想要的形式~ */
28     load_gdtr(LIMIT_GDT, ADR_GDT);
29 
30     /* IDT的初始化 */
31     for (i = 0; i <= LIMIT_IDT / 8; i++) {
32         set_gatedesc(idt + i, 0, 0, 0);
33     }
34     load_idtr(LIMIT_IDT, ADR_IDT);
35 
36     /* IDT的設定 */
37     set_gatedesc(idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32);
38     set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32);
39     set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32);
40     /*這里asm_inthadler21注冊在idt的第0x21號,這樣如果發生了中斷,CPU就會自動調用asm_inthandler21.
41     這里的2*8表示asm_inthandler21屬於哪一個段,即段號2,乘以8是因為低3位有別的意思,這低3位必須為0
42     這里段號為2的段在初始化的地方我們設置為bootpack全局段
43     最后的AR_INTGATE32將IDT的屬性,設定為0x008e,表示用於中斷處理的有效性
44     */
45     return;
46 }
47 
48 void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
49 {
50     if (limit > 0xfffff) {
51         ar |= 0x8000; /* G_bit = 1 */
52         limit /= 0x1000;
53     }
54     sd->limit_low    = limit & 0xffff;
55     sd->base_low     = base & 0xffff;
56     sd->base_mid     = (base >> 16) & 0xff;
57     sd->access_right = ar & 0xff;
58     sd->limit_high   = ((limit >> 16) & 0x0f) | ((ar >> 8) & 0xf0);
59     sd->base_high    = (base >> 24) & 0xff;
60     return;
61 }
62 
63 void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar)
64 {
65     gd->offset_low   = offset & 0xffff;
66     gd->selector     = selector;
67     gd->dw_count     = (ar >> 8) & 0xff;
68     gd->access_right = ar & 0xff;
69     gd->offset_high  = (offset >> 16) & 0xffff;
70     return;
71 }
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 * 3] = {
 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(0, 15, 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[0] / 4);
 49         io_out8(0x03c9, rgb[1] / 4);
 50         io_out8(0x03c9, rgb[2] / 4);
 51         rgb += 3;
 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,  0,     0,      x -  1, y - 29);
 80     boxfill8(vram, x, COL8_C6C6C6,  0,     y - 28, x -  1, y - 28);
 81     boxfill8(vram, x, COL8_FFFFFF,  0,     y - 27, x -  1, y - 27);
 82     boxfill8(vram, x, COL8_C6C6C6,  0,     y - 26, x -  1, y -  1);
 83 
 84     boxfill8(vram, x, COL8_FFFFFF,  3,     y - 24, 59,     y - 24);
 85     boxfill8(vram, x, COL8_FFFFFF,  2,     y - 24,  2,     y -  4);
 86     boxfill8(vram, x, COL8_848484,  3,     y -  4, 59,     y -  4);
 87     boxfill8(vram, x, COL8_848484, 59,     y - 23, 59,     y -  5);
 88     boxfill8(vram, x, COL8_000000,  2,     y -  3, 59,     y -  3);
 89     boxfill8(vram, x, COL8_000000, 60,     y - 24, 60,     y -  3);
 90 
 91     boxfill8(vram, x, COL8_848484, x - 47, y - 24, x -  4, y - 24);
 92     boxfill8(vram, x, COL8_848484, x - 47, y - 23, x - 47, y -  4);
 93     boxfill8(vram, x, COL8_FFFFFF, x - 47, y -  3, x -  4, y -  3);
 94     boxfill8(vram, x, COL8_FFFFFF, x -  3, y - 24, x -  3, y -  3);
 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 = 0; i < 16; i++) {
110         //查詢每個char的8個位,如果不為0,就
111         p = vram + (y + i) * xsize + x;
112         d = font[i];
113         if ((d & 0x80) != 0) { p[0] = c; }
114         if ((d & 0x40) != 0) { p[1] = c; }
115         if ((d & 0x20) != 0) { p[2] = c; }
116         if ((d & 0x10) != 0) { p[3] = c; }
117         if ((d & 0x08) != 0) { p[4] = c; }
118         if ((d & 0x04) != 0) { p[5] = c; }
119         if ((d & 0x02) != 0) { p[6] = c; }
120         if ((d & 0x01) != 0) { p[7] = 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[4096];
131     for (; *s != 0x00; s++) {
132         putfont8(vram, xsize, x, y, c, hankaku + *s * 16);
133         x += 8;
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[16][16] = {
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 = 0; y < 16; y++) {//根據上面的鼠標數組建立一個繪制方案保存在mouse里
169         for (x = 0; x < 16; x++) {
170             if (cursor[y][x] == '*') {//邊緣塗黑色
171                 mouse[y * 16 + x] = COL8_000000;
172             }
173             if (cursor[y][x] == 'O') {//內部塗白色
174                 mouse[y * 16 + x] = COL8_FFFFFF;
175             }
176             if (cursor[y][x] == '.') {//外部圖背景色
177                 mouse[y * 16 + 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 = 0; y < pysize; y++) {
192         for (x = 0; 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, 1 << 2); /* 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, 2     ); /* 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 = 0;
18     fifo->p = 0; 
19     fifo->q = 0;
20     return;
21 }
22 //往緩沖區內插入一個數據
23 int fifo8_put(struct FIFO8 *fifo, unsigned char data)
24 {
25     if (fifo->free == 0) {//溢出
26         fifo->flags |= FLAGS_OVERRUN;
27         return -1;
28     }
29     fifo->buf[fifo->p] = data;
30     fifo->p++;
31     if (fifo->p == fifo->size) {//當插入位置到達最后時再返回第一個位置
32         fifo->p = 0;
33     }
34     fifo->free--;
35     return 0;
36 }
37 //從緩沖區取出一個數據
38 int fifo8_get(struct FIFO8 *fifo)
39 {
40     int data;
41     if (fifo->free == fifo->size) {//沒有數據
42         return -1;
43     }
44     data = fifo->buf[fifo->q];
45     fifo->q++;
46     if (fifo->q == fifo->size) {//如果取出數據的位置到達最后了就從第一個位置開始
47         fifo->q = 0;
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]                        ; 制作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+4]        ; port
 38         MOV        EAX,0
 39         IN        AL,DX
 40         RET
 41 
 42 _io_in16:    ; int io_in16(int port);
 43         MOV        EDX,[ESP+4]        ; port
 44         MOV        EAX,0
 45         IN        AX,DX
 46         RET
 47 
 48 _io_in32:    ; int io_in32(int port);
 49         MOV        EDX,[ESP+4]        ; port
 50         IN        EAX,DX
 51         RET
 52 
 53 _io_out8:    ; void io_out8(int port, int data);
 54         MOV        EDX,[ESP+4]        ; port
 55         MOV        AL,[ESP+8]        ; data
 56         OUT        DX,AL
 57         RET
 58 
 59 _io_out16:    ; void io_out16(int port, int data);
 60         MOV        EDX,[ESP+4]        ; port
 61         MOV        EAX,[ESP+8]        ; data
 62         OUT        DX,AX
 63         RET
 64 
 65 _io_out32:    ; void io_out32(int port, int data);
 66         MOV        EDX,[ESP+4]        ; port
 67         MOV        EAX,[ESP+8]        ; 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+4]
 78         PUSH    EAX
 79         POPFD        ; POP EFLAGS という意味
 80         RET
 81 
 82 _load_gdtr:        ; void load_gdtr(int limit, int addr);
 83         MOV        AX,[ESP+4]        ; limit
 84         MOV        [ESP+6],AX
 85         LGDT    [ESP+6]
 86         RET
 87 
 88 
 89 ;1) 這個函數用來指定的段上限和地址賦值給GDTR的48位寄存器,這是個很特殊的寄存器,並不能用MOV來直接賦值
 90 ;,唯一的方法就是指定一個內存地址,從指定的內存地址讀取6字節(也就是48位),然后賦值給GDTR寄存器。完成這一任務的指令就是LGDT
 91 ;2) 該寄存器的低16位(即內存的最初的2個字節)是段上限,它等於“GDT的有效的字節數-1”,剩下的32位,代表GDT的開始地址
 92 ;3) 這里2個參數是ESP+4和ESP+8里存放,而我們要的是6字節形式的,所以要轉換為我們想要的形式~
 93 _load_idtr:        ; void load_idtr(int limit, int addr);
 94         MOV        AX,[ESP+4]        ; limit
 95         MOV        [ESP+6],AX
 96         LIDT    [ESP+6]
 97         RET
 98 
 99 ;這個函數只是將寄存器的值保存在棧里,然后將DS和ES調整到與SS相等,再調用_inthandler21,返回后將所有寄存器的值再返回到原來的值,然后執行IRETD
100 ;之所以如此小心翼翼地保護寄存器,原因在於,中斷處理發生在函數處理途中,通過IREDT從中斷處理后,寄存器就亂了
101 _asm_inthandler21:
102         PUSH    ES
103         PUSH    DS
104         PUSHAD
105         MOV        EAX,ESP
106         PUSH    EAX
107         MOV        AX,SS
108         MOV        DS,AX
109         MOV        ES,AX
110         CALL    _inthandler21
111         POP        EAX
112         POPAD
113         POP        DS
114         POP        ES
115         IRETD
116 
117 _asm_inthandler27:
118         PUSH    ES
119         PUSH    DS
120         PUSHAD
121         MOV        EAX,ESP
122         PUSH    EAX
123         MOV        AX,SS
124         MOV        DS,AX
125         MOV        ES,AX
126         CALL    _inthandler27
127         POP        EAX
128         POPAD
129         POP        DS
130         POP        ES
131         IRETD
132 
133 _asm_inthandler2c:
134         PUSH    ES
135         PUSH    DS
136         PUSHAD
137         MOV        EAX,ESP
138         PUSH    EAX
139         MOV        AX,SS
140         MOV        DS,AX
141         MOV        ES,AX
142         CALL    _inthandler2c
143         POP        EAX
144         POPAD
145         POP        DS
146         POP        ES
147         IRETD
naskfunc.nas

PS: 一些不能用c語言來完成的函數還得用匯編,於是就都放在這個文件里了~

 


 

3、效果說明:

>_<" 這里已經實現了文字顯示,鼠標顯示,鍵盤和鼠標信息的讀取,其中涉及的知識有:GDT,IDT,中斷,FIFO,VRAM,字庫等,最終效果如下:

PS: 最上面顯示鼠標當前位置,第二行左邊顯示按鍵信息,右邊lcr顯示鼠標點擊事件(如果左邊被點擊l就變大寫L,其他相同道理),后面兩個數據是鼠標此次移動距離~

PS: 該系統的內存分布圖:在文件asmhead.nas有詳細注釋

146 ;---------------------------------------------------------------------------------------------------- 147 ;內存分配: 148 ; 0x00000000-0x000fffff:雖然在啟動中會多次使用,但之后就會變空(1M) 149 ; 0x00100000-0x00267fff:用於保存軟盤的內容(1440KB) 150 ; 0x00268000-0x0026f7ff:空(30KB) 151 ; 0x0026f800-0x0026ffff:IDT(2KB) 152 ; 0x00270000-0x0027ffff:GDT(64KB) 153 ; 0x00280000-0x002fffff:bootpack.hrb(512KB) 154 ; 0x00300000-0x003fffff:棧及其他(1MB) 155 ; 0x00400000- :空 156 ;----------------------------------------------------------------------------------------------------

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM