VIM之cscope和taglist

一直想尝试下放弃sourceinsight,今天中午终于有时间试了下cscope和taglist插件

cscope主要是生成文档之间和函数之间的以来关系,比ctag要强大,taglsit主要是显示像sourceinsight一样的声明信息

 

cscope可以通过yum install安装

taglist主要是vim的插件,官网上可以下载,放到~/.vim/下(如果没有,则创建,记得打开vim的后,输入helptags  ~/.vim/doc/ ,这样才能查看 help文档)

 

在工程的根目录下面使用cscope的命令

find -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.file

cscope -bkq -i cscope.file

ctags -R

分别查找到工程目录文件,添加到cscope.file中,然后根据它里面的内容,生成依赖关系

 

taglist的配置,可以写到/etc/vimrc 里面

let Tlist_Ctags_Cmd = '/usr/bin/ctags'

let Tlist_Show_One_File = 1

let Tlist_Exit_OnlyWindow = 1         仅标签页存在则关闭

 

 

在命令模式输入TlistOpen打开

ctrl+w可以在左右窗口切换

ctrl+t生成显示该定义的新的标签页,命令行模式输入tabn,tabp可切换

 

 

 

32-bit x86LLVM,KLEE安装

1

先在网上下载了LLVM2.8的代码,然后解压到

 

 

 

 

 

 

llvm-2.8文件夹

 

 

 

 

 

 

 

 

$ curl -O http://llvm.org/releases/2.8/llvm-2.8.tgz 
$ tar zxvf llvm-2.8.tgz 
$ cd llvm-2.8 
$ ./configure --enable-optimized --enable-assertions

 

 

 

 

 

 

 

后半句的作用就是使用代码优化


$ make

   make install

 

 

2

安装LLVM-gcc

在网上下载LLVM 2.8 release of llvm-gcc 源码

解压到llvm-gcc文件夹

然后在与llvm-gcc等同的目录下创建obj,install文件夹

进入obj文件夹下

执行配置命令

../llvm-gcc4.2-x.y.source/configure --prefix=`pwd`/../install --program-prefix=llvm --enable-llvm=$LLVMOBJDIR --enable-languages=c,c++$EXTRALANGS $TARGETOPTIONS --target=i686-pc-linux-gnu --with-tune=generic --with-arch=pentium4

说明:

 

 

 

 

 

 

 

--prefix=`pwd`/../install安装在了等级的install文件(刚刚创建的)

 

 

 

 

 

 

 

 

生成make $BUILDOPTIONS

 

然后make install

 

 

 

 

 

 

 

make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

添加路径到  vim ~/.bash_profile

source ~/.bash_profile使路径立即生效

 

 

 

 

 

 

 

重新make了llvm,使用了configure -h 查看帮助

除了上面两个选项外,又重新增加了指定llvmgcc,llvmg++的绝对路径(不然make check的时候会有问题,而且编译uClibc的时候要改变$LLVMGCC到llvmgcc的绝对路径)

 

 

3.安装KLEE

3.1先安装uClibc

 

$ tar zxvf klee-uclibc-0.01.tgz 

 

 

 

 

 

 

 

$ ./configure --with-llvm=path/to/llvm 
$ make

这时候出现了问题,说什么找不到,主要是自动生成的Makefile的问题,这时候修改Rules.mak中tool的路径(在llvm下面,Realease+Assert/bin)

 

在make

3.2安装KLEE

 

下载

配置

 

 

 

 

 

./configure --with-llvm=path/to/llvm --with-uclibc=path/to/klee-uclibc --enable-posix-runtime

 

make

 

 

 

 

 

这时候的make check就可以通过了

 

小技巧:find /fse/ | xargs grep  “llvm”

查找/fse/文件夹下面的文件,谁的内容有llvm               

QStandardItemModel数据更新,scroll unchanged

最近在写OS课设,一个系统monitor,

把进程的信息读入QStandardItemModel表

timer定时,更新数据,QStandardItemModel附在QTableView上

这时有个问题,如果我拖动滑动条,当更新时,它又会还原,最后终于找到了解决方法

在timer的SLOT(update)中,添加如下代码,即记住了更新前的位置,并在更新后还原。。。

 

int last_position = tableView->verticalScrollBar()->value();
... some update...
tableView->verticalScrollBar()->setValue(position);

Ubuntu 安装Qt及qwt

这几天做操作系统的课设,以前在Fdora上用过Qt,是下载的源码,自己编译的,这次因为涉及内核编译,于是在VirtualBox中安装了Ubuntu,

使用apt-get install 安装了Qt, 相当简单,

 

sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer

这里有个插曲,如果你配置了自己的apt 源,安装完成后使用qmake 可能提示找不到qmake,

这时使用apt-get -f install libqt4-dev安装

若出现一堆依赖性错误,那就是源的问题,改回初始的源,就可以安装成功了

正常运行qmake后,我们开始安装qwt

 

sudo apt-get install libqwt5-qt4 libqwt5-qt4-dev

然后qmake -project 后修改

.pro文件

加上

 

 

LIBS += -L /usr/lib/ -lqwt-qt4
 
INCLUDEPATH += /usr/include/qwt-qt4/

 

注意红绿色部分,你要自己寻找你的qwt头文件,库文件的所在文件夹,把正确的路径添加上去

/usr/lib/是我的qwt相关库文件的所在地

/usr/include/qwt-qt4是头文件所在地

尤其要注意 -lqwt-qt4 网上很多都是-lqwt,这样在make时会提示lqwt找不到,googleN就没答案,经多方看贴综合分析

我估摸着应该是和头文件所在的qwt-qt4重名吧

尝试着改成-lqwt-qt4后就ok了,不求甚解之:-)

 

这样我就成功了,话说搞了一上午的问题/////////////////////////////

汇编实现的小闹钟

这是个系统平台限制的闹钟程序,开机直接可以运行,它的主要部件是一个引导程序和一个加载程序,其中时钟写在了加载程序里,而引导程序是来自《自己动手写操作系统》一书

加载程序里主要调用了BIOS读取时间的int 0x1a,而界面是int 13h中断,写了三四天吧,其实主要的时间是浪费在了实现已知两点,求两点间的整数点的坐标,但是到最后还是没有好的方法求出来,悲剧(用c写了函数,打印了从圆心到圆上的60个点之间的坐标)

将程序写入.img文件,就可以加载运行了,就界面比较简陋,主要是比较难画,而且也不想画了

使用程序的前提是要linux环境下(我用的fedora13),而且安装了bochs(很好的系统调试虚拟机)

bochsrc文件(不同的安装bochs,位置不同):

 

###############################################################
# Configuration file for Bochs
###############################################################
 
# how much memory the emulated machine will have
megs: 32
 
# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=a.img, status=inserted
 
# choose the boot disk.
boot: a
 
# where do we send log messages?
# log: bochsout.txt
 
# disable the mouse
mouse: enabled=0
 
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
 
 
 
 
 
 
 
 
 
 
 
 
boot.asm(作者实现)
 
;%define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!将此行打开后用 nasm Boot.asm -o Boot.com 做成一个.COM文件易于调试
 
%ifdef _BOOT_DEBUG_
org  0100h ; 调试状态, 做成 .COM 文件, 可调试
%else
org  07c00h ; Boot 状态, Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
%endif
 
;================================================================================================
%ifdef _BOOT_DEBUG_
BaseOfStack equ 0100h ; 调试状态下堆栈基地址(栈底, 从这个位置向低地址生长)
%else
BaseOfStack equ 07c00h ; Boot状态下堆栈基地址(栈底, 从这个位置向低地址生长)
%endif
 
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ----  段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址
 
RootDirSectors equ 14 ; 根目录占用空间
SectorNoOfRootDirectory equ 19 ; Root Directory 的第一个扇区号
SectorNoOfFAT1 equ 1 ; FAT1 的第一个扇区号 = BPB_RsvdSecCnt
DeltaSectorNo equ 17 ; DeltaSectorNo = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) - 2
; 文件的开始Sector号 = DirEntry中的开始Sector号 + 根目录占用Sector数目 + DeltaSectorNo
;================================================================================================
 
jmp short LABEL_START ; Start to boot.
nop ; 这个 nop 不可少
 
; 下面是 FAT12 磁盘的头
BS_OEMName DB 'ForrestY' ; OEM String, 必须 8 个字节
BPB_BytsPerSec DW 512 ; 每扇区字节数
BPB_SecPerClus DB 1 ; 每簇多少扇区
BPB_RsvdSecCnt DW 1 ; Boot 记录占用多少扇区
BPB_NumFATs DB 2 ; 共有多少 FAT 表
BPB_RootEntCnt DW 224 ; 根目录文件数最大值
BPB_TotSec16 DW 2880 ; 逻辑扇区总数
BPB_Media DB 0xF0 ; 媒体描述符
BPB_FATSz16 DW 9 ; 每FAT扇区数
BPB_SecPerTrk DW 18 ; 每磁道扇区数
BPB_NumHeads DW 2 ; 磁头数(面数)
BPB_HiddSec DD 0 ; 隐藏扇区数
BPB_TotSec32 DD 0 ; 如果 wTotalSectorCount 是 0 由这个值记录扇区数
BS_DrvNum DB 0 ; 中断 13 的驱动器号
BS_Reserved1 DB 0 ; 未使用
BS_BootSig DB 29h ; 扩展引导标记 (29h)
BS_VolID DD 0 ; 卷序列号
BS_VolLab DB 'OrangeS0.02'; 卷标, 必须 11 个字节
BS_FileSysType DB 'FAT12   ' ; 文件系统类型, 必须 8个字节  
 
LABEL_START:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
 
; 清屏
mov ax, 0600h ; AH = 6,  AL = 0h
mov bx, 0700h ; 黑底白字(BL = 07h)
mov cx, 0 ; 左上角: (0, 0)
mov dx, 0184fh ; 右下角: (80, 50)
int 10h ; int 10h
 
mov dh, 0 ; "Booting  "
call DispStr ; 显示字符串
 
xor ah, ah ; ┓
xor dl, dl ; ┣ 软驱复位
int 13h ; ┛
 
; 下面在 A 盘的根目录寻找 LOADER.BIN
mov word [wSectorNo], SectorNoOfRootDirectory
LABEL_SEARCH_IN_ROOT_DIR_BEGIN:
cmp word [wRootDirSizeForLoop], 0 ; ┓
jz LABEL_NO_LOADERBIN ; ┣ 判断根目录区是不是已经读完
dec word [wRootDirSizeForLoop] ; ┛ 如果读完表示没有找到 LOADER.BIN
mov ax, BaseOfLoader
mov es, ax ; es <- BaseOfLoader
mov bx, OffsetOfLoader ; bx <- OffsetOfLoader 于是, es:bx = BaseOfLoader:OffsetOfLoader
mov ax, [wSectorNo] ; ax <- Root Directory 中的某 Sector 号
mov cl, 1
call ReadSector
 
mov si, LoaderFileName ; ds:si -> "LOADER  BIN"
mov di, OffsetOfLoader ; es:di -> BaseOfLoader:0100 = BaseOfLoader*10h+100
cld
mov dx, 10h
LABEL_SEARCH_FOR_LOADERBIN:
cmp dx, 0 ; ┓循环次数控制,
jz LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR ; ┣如果已经读完了一个 Sector,
dec dx ; ┛就跳到下一个 Sector
mov cx, 11
LABEL_CMP_FILENAME:
cmp cx, 0
jz LABEL_FILENAME_FOUND ; 如果比较了 11 个字符都相等, 表示找到
dec cx
lodsb ; ds:si -> al
cmp al, byte [es:di]
jz LABEL_GO_ON
jmp LABEL_DIFFERENT ; 只要发现不一样的字符就表明本 DirectoryEntry 不是
; 我们要找的 LOADER.BIN
LABEL_GO_ON:
inc di
jmp LABEL_CMP_FILENAME ; 继续循环
 
LABEL_DIFFERENT:
and di, 0FFE0h ; else ┓ di &= E0 为了让它指向本条目开头
add di, 20h ;     ┃
mov si, LoaderFileName ;     ┣ di += 20h  下一个目录条目
jmp LABEL_SEARCH_FOR_LOADERBIN;    ┛
 
LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR:
add word [wSectorNo], 1
jmp LABEL_SEARCH_IN_ROOT_DIR_BEGIN
 
LABEL_NO_LOADERBIN:
mov dh, 2 ; "No LOADER."
call DispStr ; 显示字符串
%ifdef _BOOT_DEBUG_
mov ax, 4c00h ; ┓
int 21h ; ┛没有找到 LOADER.BIN, 回到 DOS
%else
jmp $ ; 没有找到 LOADER.BIN, 死循环在这里
%endif
 
LABEL_FILENAME_FOUND: ; 找到 LOADER.BIN 后便来到这里继续
mov ax, RootDirSectors
and di, 0FFE0h ; di -> 当前条目的开始
add di, 01Ah ; di -> 首 Sector
mov cx, word [es:di]
push cx ; 保存此 Sector 在 FAT 中的序号
add cx, ax
add cx, DeltaSectorNo ; cl <- LOADER.BIN的起始扇区号(0-based)
mov ax, BaseOfLoader
mov es, ax ; es <- BaseOfLoader
mov bx, OffsetOfLoader ; bx <- OffsetOfLoader
mov ax, cx ; ax <- Sector 号
 
LABEL_GOON_LOADING_FILE:
push ax ; `.
push bx ;  |
mov ah, 0Eh ;  | 每读一个扇区就在 "Booting  " 后面
mov al, '.' ;  | 打一个点, 形成这样的效果:
mov bl, 0Fh ;  | Booting ......
int 10h ;  |
pop bx ;  |
pop ax ; /
 
mov cl, 1
call ReadSector
pop ax ; 取出此 Sector 在 FAT 中的序号
call GetFATEntry
cmp ax, 0FFFh
jz LABEL_FILE_LOADED
push ax ; 保存 Sector 在 FAT 中的序号
mov dx, RootDirSectors
add ax, dx
add ax, DeltaSectorNo
add bx, [BPB_BytsPerSec]
jmp LABEL_GOON_LOADING_FILE
LABEL_FILE_LOADED:
 
mov dh, 1 ; "Ready."
call DispStr ; 显示字符串
 
; *****************************************************************************************************
jmp BaseOfLoader:OffsetOfLoader ; 这一句正式跳转到已加载到内
; 存中的 LOADER.BIN 的开始处,
; 开始执行 LOADER.BIN 的代码。
; Boot Sector 的使命到此结束。
; *****************************************************************************************************
 
 
 
;============================================================================
;变量
;----------------------------------------------------------------------------
wRootDirSizeForLoop dw RootDirSectors ; Root Directory 占用的扇区数, 在循环中会递减至零.
wSectorNo dw 0 ; 要读取的扇区号
bOdd db 0 ; 奇数还是偶数
 
;============================================================================
;字符串
;----------------------------------------------------------------------------
LoaderFileName db "LOADER  BIN", 0 ; LOADER.BIN 之文件名
; 为简化代码, 下面每个字符串的长度均为 MessageLength
MessageLength equ 9
BootMessage: db "Booting  "; 9字节, 不够则用空格补齐. 序号 0
Message1 db "Ready.   "; 9字节, 不够则用空格补齐. 序号 1
Message2 db "No LOADER"; 9字节, 不够则用空格补齐. 序号 2
;============================================================================
 
 
;----------------------------------------------------------------------------
; 函数名: DispStr
;----------------------------------------------------------------------------
; 作用:
; 显示一个字符串, 函数开始时 dh 中应该是字符串序号(0-based)
DispStr:
mov ax, MessageLength
mul dh
add ax, BootMessage
mov bp, ax ; ┓
mov ax, ds ; ┣ ES:BP = 串地址
mov es, ax ; ┛
mov cx, MessageLength ; CX = 串长度
mov ax, 01301h ; AH = 13,  AL = 01h
mov bx, 0007h ; 页号为0(BH = 0) 黑底白字(BL = 07h)
mov dl, 0
int 10h ; int 10h
ret
 
 
;----------------------------------------------------------------------------
; 函数名: ReadSector
;----------------------------------------------------------------------------
; 作用:
; 从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
ReadSector:
; -----------------------------------------------------------------------
; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
; -----------------------------------------------------------------------
; 设扇区号为 x
;                           ┌ 柱面号 = y >> 1
;       x           ┌ 商 y ┤
; -------------- => ┤      └ 磁头号 = y & 1
;  每磁道扇区数     │
;                   └ 余 z => 起始扇区号 = z + 1
push bp
mov bp, sp
sub esp, 2 ; 辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]
 
mov byte [bp-2], cl
push bx ; 保存 bx
mov bl, [BPB_SecPerTrk] ; bl: 除数
div bl ; y 在 al 中, z 在 ah 中
inc ah ; z ++
mov cl, ah ; cl <- 起始扇区号
mov dh, al ; dh <- y
shr al, 1 ; y >> 1 (其实是 y/BPB_NumHeads, 这里BPB_NumHeads=2)
mov ch, al ; ch <- 柱面号
and dh, 1 ; dh & 1 = 磁头号
pop bx ; 恢复 bx
; 至此, "柱面号, 起始扇区, 磁头号" 全部得到 ^^^^^^^^^^^^^^^^^^^^^^^^
mov dl, [BS_DrvNum] ; 驱动器号 (0 表示 A 盘)
.GoOnReading:
mov ah, 2 ; 读
mov al, byte [bp-2] ; 读 al 个扇区
int 13h
jc .GoOnReading ; 如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止
 
add esp, 2
pop bp
 
ret
 
;----------------------------------------------------------------------------
; 函数名: GetFATEntry
;----------------------------------------------------------------------------
; 作用:
; 找到序号为 ax 的 Sector 在 FAT 中的条目, 结果放在 ax 中
; 需要注意的是, 中间需要读 FAT 的扇区到 es:bx 处, 所以函数一开始保存了 es 和 bx
GetFATEntry:
push es
push bx
push ax
mov ax, BaseOfLoader; `.
sub ax, 0100h ;  | 在 BaseOfLoader 后面留出 4K 空间用于存放 FAT
mov es, ax ; /
pop ax
mov byte [bOdd], 0
mov bx, 3
mul bx ; dx:ax = ax * 3
mov bx, 2
div bx ; dx:ax / 2  ==>  ax <- 商, dx <- 余数
cmp dx, 0
jz LABEL_EVEN
mov byte [bOdd], 1
LABEL_EVEN:;偶数
; 现在 ax 中是 FATEntry 在 FAT 中的偏移量,下面来
; 计算 FATEntry 在哪个扇区中(FAT占用不止一个扇区)
xor dx, dx
mov bx, [BPB_BytsPerSec]
div bx ; dx:ax / BPB_BytsPerSec
  ;  ax <- 商 (FATEntry 所在的扇区相对于 FAT 的扇区号)
  ;  dx <- 余数 (FATEntry 在扇区内的偏移)。
push dx
mov bx, 0 ; bx <- 0 于是, es:bx = (BaseOfLoader - 100):00
add ax, SectorNoOfFAT1 ; 此句之后的 ax 就是 FATEntry 所在的扇区号
mov cl, 2
call ReadSector ; 读取 FATEntry 所在的扇区, 一次读两个, 避免在边界
  ; 发生错误, 因为一个 FATEntry 可能跨越两个扇区
pop dx
add bx, dx
mov ax, [es:bx]
cmp byte [bOdd], 1
jnz LABEL_EVEN_2
shr ax, 4
LABEL_EVEN_2:
and ax, 0FFFh
 
LABEL_GET_FAT_ENRY_OK:
 
pop bx
pop es
ret
;----------------------------------------------------------------------------
 
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
 
;%define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!将此行打开后用 nasm Boot.asm -o Boot.com 做成一个.COM文件易于调试
 
%ifdef _BOOT_DEBUG_
org  0100h ; 调试状态, 做成 .COM 文件, 可调试
%else
org  07c00h ; Boot 状态, Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
%endif
 
;================================================================================================
%ifdef _BOOT_DEBUG_
BaseOfStack equ 0100h ; 调试状态下堆栈基地址(栈底, 从这个位置向低地址生长)
%else
BaseOfStack equ 07c00h ; Boot状态下堆栈基地址(栈底, 从这个位置向低地址生长)
%endif
 
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ----  段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址
 
RootDirSectors equ 14 ; 根目录占用空间
SectorNoOfRootDirectory equ 19 ; Root Directory 的第一个扇区号
SectorNoOfFAT1 equ 1 ; FAT1 的第一个扇区号 = BPB_RsvdSecCnt
DeltaSectorNo equ 17 ; DeltaSectorNo = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) - 2
; 文件的开始Sector号 = DirEntry中的开始Sector号 + 根目录占用Sector数目 + DeltaSectorNo
;================================================================================================
 
jmp short LABEL_START ; Start to boot.
nop ; 这个 nop 不可少
 
; 下面是 FAT12 磁盘的头
BS_OEMName DB 'ForrestY' ; OEM String, 必须 8 个字节
BPB_BytsPerSec DW 512 ; 每扇区字节数
BPB_SecPerClus DB 1 ; 每簇多少扇区
BPB_RsvdSecCnt DW 1 ; Boot 记录占用多少扇区
BPB_NumFATs DB 2 ; 共有多少 FAT 表
BPB_RootEntCnt DW 224 ; 根目录文件数最大值
BPB_TotSec16 DW 2880 ; 逻辑扇区总数
BPB_Media DB 0xF0 ; 媒体描述符
BPB_FATSz16 DW 9 ; 每FAT扇区数
BPB_SecPerTrk DW 18 ; 每磁道扇区数
BPB_NumHeads DW 2 ; 磁头数(面数)
BPB_HiddSec DD 0 ; 隐藏扇区数
BPB_TotSec32 DD 0 ; 如果 wTotalSectorCount 是 0 由这个值记录扇区数
BS_DrvNum DB 0 ; 中断 13 的驱动器号
BS_Reserved1 DB 0 ; 未使用
BS_BootSig DB 29h ; 扩展引导标记 (29h)
BS_VolID DD 0 ; 卷序列号
BS_VolLab DB 'OrangeS0.02'; 卷标, 必须 11 个字节
BS_FileSysType DB 'FAT12   ' ; 文件系统类型, 必须 8个字节  
 
LABEL_START:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
 
; 清屏
mov ax, 0600h ; AH = 6,  AL = 0h
mov bx, 0700h ; 黑底白字(BL = 07h)
mov cx, 0 ; 左上角: (0, 0)
mov dx, 0184fh ; 右下角: (80, 50)
int 10h ; int 10h
 
mov dh, 0 ; "Booting  "
call DispStr ; 显示字符串
 
xor ah, ah ; ┓
xor dl, dl ; ┣ 软驱复位
int 13h ; ┛
 
; 下面在 A 盘的根目录寻找 LOADER.BIN
mov word [wSectorNo], SectorNoOfRootDirectory
LABEL_SEARCH_IN_ROOT_DIR_BEGIN:
cmp word [wRootDirSizeForLoop], 0 ; ┓
jz LABEL_NO_LOADERBIN ; ┣ 判断根目录区是不是已经读完
dec word [wRootDirSizeForLoop] ; ┛ 如果读完表示没有找到 LOADER.BIN
mov ax, BaseOfLoader
mov es, ax ; es <- BaseOfLoader
mov bx, OffsetOfLoader ; bx <- OffsetOfLoader 于是, es:bx = BaseOfLoader:OffsetOfLoader
mov ax, [wSectorNo] ; ax <- Root Directory 中的某 Sector 号
mov cl, 1
call ReadSector
 
mov si, LoaderFileName ; ds:si -> "LOADER  BIN"
mov di, OffsetOfLoader ; es:di -> BaseOfLoader:0100 = BaseOfLoader*10h+100
cld
mov dx, 10h
LABEL_SEARCH_FOR_LOADERBIN:
cmp dx, 0 ; ┓循环次数控制,
jz LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR ; ┣如果已经读完了一个 Sector,
dec dx ; ┛就跳到下一个 Sector
mov cx, 11
LABEL_CMP_FILENAME:
cmp cx, 0
jz LABEL_FILENAME_FOUND ; 如果比较了 11 个字符都相等, 表示找到
dec cx
lodsb ; ds:si -> al
cmp al, byte [es:di]
jz LABEL_GO_ON
jmp LABEL_DIFFERENT ; 只要发现不一样的字符就表明本 DirectoryEntry 不是
; 我们要找的 LOADER.BIN
LABEL_GO_ON:
inc di
jmp LABEL_CMP_FILENAME ; 继续循环
 
LABEL_DIFFERENT:
and di, 0FFE0h ; else ┓ di &= E0 为了让它指向本条目开头
add di, 20h ;     ┃
mov si, LoaderFileName ;     ┣ di += 20h  下一个目录条目
jmp LABEL_SEARCH_FOR_LOADERBIN;    ┛
 
LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR:
add word [wSectorNo], 1
jmp LABEL_SEARCH_IN_ROOT_DIR_BEGIN
 
LABEL_NO_LOADERBIN:
mov dh, 2 ; "No LOADER."
call DispStr ; 显示字符串
%ifdef _BOOT_DEBUG_
mov ax, 4c00h ; ┓
int 21h ; ┛没有找到 LOADER.BIN, 回到 DOS
%else
jmp $ ; 没有找到 LOADER.BIN, 死循环在这里
%endif
 
LABEL_FILENAME_FOUND: ; 找到 LOADER.BIN 后便来到这里继续
mov ax, RootDirSectors
and di, 0FFE0h ; di -> 当前条目的开始
add di, 01Ah ; di -> 首 Sector
mov cx, word [es:di]
push cx ; 保存此 Sector 在 FAT 中的序号
add cx, ax
add cx, DeltaSectorNo ; cl <- LOADER.BIN的起始扇区号(0-based)
mov ax, BaseOfLoader
mov es, ax ; es <- BaseOfLoader
mov bx, OffsetOfLoader ; bx <- OffsetOfLoader
mov ax, cx ; ax <- Sector 号
 
LABEL_GOON_LOADING_FILE:
push ax ; `.
push bx ;  |
mov ah, 0Eh ;  | 每读一个扇区就在 "Booting  " 后面
mov al, '.' ;  | 打一个点, 形成这样的效果:
mov bl, 0Fh ;  | Booting ......
int 10h ;  |
pop bx ;  |
pop ax ; /
 
mov cl, 1
call ReadSector
pop ax ; 取出此 Sector 在 FAT 中的序号
call GetFATEntry
cmp ax, 0FFFh
jz LABEL_FILE_LOADED
push ax ; 保存 Sector 在 FAT 中的序号
mov dx, RootDirSectors
add ax, dx
add ax, DeltaSectorNo
add bx, [BPB_BytsPerSec]
jmp LABEL_GOON_LOADING_FILE
LABEL_FILE_LOADED:
 
mov dh, 1 ; "Ready."
call DispStr ; 显示字符串
 
; *****************************************************************************************************
jmp BaseOfLoader:OffsetOfLoader ; 这一句正式跳转到已加载到内
; 存中的 LOADER.BIN 的开始处,
; 开始执行 LOADER.BIN 的代码。
; Boot Sector 的使命到此结束。
; *****************************************************************************************************
 
 
 
;============================================================================
;变量
;----------------------------------------------------------------------------
wRootDirSizeForLoop dw RootDirSectors ; Root Directory 占用的扇区数, 在循环中会递减至零.
wSectorNo dw 0 ; 要读取的扇区号
bOdd db 0 ; 奇数还是偶数
 
;============================================================================
;字符串
;----------------------------------------------------------------------------
LoaderFileName db "LOADER  BIN", 0 ; LOADER.BIN 之文件名
; 为简化代码, 下面每个字符串的长度均为 MessageLength
MessageLength equ 9
BootMessage: db "Booting  "; 9字节, 不够则用空格补齐. 序号 0
Message1 db "Ready.   "; 9字节, 不够则用空格补齐. 序号 1
Message2 db "No LOADER"; 9字节, 不够则用空格补齐. 序号 2
;============================================================================
 
 
;----------------------------------------------------------------------------
; 函数名: DispStr
;----------------------------------------------------------------------------
; 作用:
; 显示一个字符串, 函数开始时 dh 中应该是字符串序号(0-based)
DispStr:
mov ax, MessageLength
mul dh
add ax, BootMessage
mov bp, ax ; ┓
mov ax, ds ; ┣ ES:BP = 串地址
mov es, ax ; ┛
mov cx, MessageLength ; CX = 串长度
mov ax, 01301h ; AH = 13,  AL = 01h
mov bx, 0007h ; 页号为0(BH = 0) 黑底白字(BL = 07h)
mov dl, 0
int 10h ; int 10h
ret
 
 
;----------------------------------------------------------------------------
; 函数名: ReadSector
;----------------------------------------------------------------------------
; 作用:
; 从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
ReadSector:
; -----------------------------------------------------------------------
; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
; -----------------------------------------------------------------------
; 设扇区号为 x
;                           ┌ 柱面号 = y >> 1
;       x           ┌ 商 y ┤
; -------------- => ┤      └ 磁头号 = y & 1
;  每磁道扇区数     │
;                   └ 余 z => 起始扇区号 = z + 1
push bp
mov bp, sp
sub esp, 2 ; 辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]
 
mov byte [bp-2], cl
push bx ; 保存 bx
mov bl, [BPB_SecPerTrk] ; bl: 除数
div bl ; y 在 al 中, z 在 ah 中
inc ah ; z ++
mov cl, ah ; cl <- 起始扇区号
mov dh, al ; dh <- y
shr al, 1 ; y >> 1 (其实是 y/BPB_NumHeads, 这里BPB_NumHeads=2)
mov ch, al ; ch <- 柱面号
and dh, 1 ; dh & 1 = 磁头号
pop bx ; 恢复 bx
; 至此, "柱面号, 起始扇区, 磁头号" 全部得到 ^^^^^^^^^^^^^^^^^^^^^^^^
mov dl, [BS_DrvNum] ; 驱动器号 (0 表示 A 盘)
.GoOnReading:
mov ah, 2 ; 读
mov al, byte [bp-2] ; 读 al 个扇区
int 13h
jc .GoOnReading ; 如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止
 
add esp, 2
pop bp
 
ret
 
;----------------------------------------------------------------------------
; 函数名: GetFATEntry
;----------------------------------------------------------------------------
; 作用:
; 找到序号为 ax 的 Sector 在 FAT 中的条目, 结果放在 ax 中
; 需要注意的是, 中间需要读 FAT 的扇区到 es:bx 处, 所以函数一开始保存了 es 和 bx
GetFATEntry:
push es
push bx
push ax
mov ax, BaseOfLoader; `.
sub ax, 0100h ;  | 在 BaseOfLoader 后面留出 4K 空间用于存放 FAT
mov es, ax ; /
pop ax
mov byte [bOdd], 0
mov bx, 3
mul bx ; dx:ax = ax * 3
mov bx, 2
div bx ; dx:ax / 2  ==>  ax <- 商, dx <- 余数
cmp dx, 0
jz LABEL_EVEN
mov byte [bOdd], 1
LABEL_EVEN:;偶数
; 现在 ax 中是 FATEntry 在 FAT 中的偏移量,下面来
; 计算 FATEntry 在哪个扇区中(FAT占用不止一个扇区)
xor dx, dx
mov bx, [BPB_BytsPerSec]
div bx ; dx:ax / BPB_BytsPerSec
  ;  ax <- 商 (FATEntry 所在的扇区相对于 FAT 的扇区号)
  ;  dx <- 余数 (FATEntry 在扇区内的偏移)。
push dx
mov bx, 0 ; bx <- 0 于是, es:bx = (BaseOfLoader - 100):00
add ax, SectorNoOfFAT1 ; 此句之后的 ax 就是 FATEntry 所在的扇区号
mov cl, 2
call ReadSector ; 读取 FATEntry 所在的扇区, 一次读两个, 避免在边界
  ; 发生错误, 因为一个 FATEntry 可能跨越两个扇区
pop dx
add bx, dx
mov ax, [es:bx]
cmp byte [bOdd], 1
jnz LABEL_EVEN_2
shr ax, 4
LABEL_EVEN_2:
and ax, 0FFFh
 
LABEL_GET_FAT_ENRY_OK:
 
pop bx
pop es
ret
;----------------------------------------------------------------------------
 
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
 
 
 
Irvine16.inc
 
; Irvine16.inc - Include file for programs using
; the Irvine16.lib (Real-address mode library).
 
; Last update: 7/29/05
 
.NOLIST
 
.model small,STDCALL
.stack 200h
.386
 
Clrscr PROTO
Crlf PROTO
Delay PROTO
DumpMem PROTO
DumpRegs PROTO
GetCommandtail PROTO
GetMaxXY PROTO
GetMseconds PROTO
Gotoxy PROTO
IsDigit PROTO
Randomize PROTO
RandomRange PROTO
Random32 PROTO
ReadHex PROTO
ReadInt PROTO
ReadChar PROTO
ReadFloat PROTO
ReadString PROTO
SetTextColor PROTO
ShowFPUStack PROTO
WaitMsg PROTO
WriteBin PROTO
WriteBinB PROTO
WriteChar PROTO
WriteDec PROTO
WriteHex PROTO
WriteHexB PROTO
WriteInt PROTO
WriteString PROTO
WriteFloat PROTO
 
; Copy a source string to a target string.
Str_copy PROTO,
  source:PTR BYTE,
  target:PTR BYTE
 
; Return the length of a null-terminated string..
Str_length PROTO,
pString:PTR BYTE
 
; Compare string1 to string2. Set the Zero and
; Carry flags in the same way as the CMP instruction.
Str_compare PROTO,
string1:PTR BYTE,
string2:PTR BYTE
 
; Trim a given trailing character from a string.
; The second argument is the character to trim.
Str_trim PROTO,
pString:PTR BYTE,
char:BYTE
 
; Convert a null-terminated string to upper case.
Str_ucase PROTO,
pString:PTR BYTE
 
 
exit EQU <.EXIT>
@cmdline EQU <OFFSET __98765765cmdline>
 
;-----------------------------------
; STANDARD 4-bit COLOR DEFINITIONS
;-----------------------------------
black        = 0000b
blue         = 0001b
green        = 0010b
cyan         = 0011b
red          = 0100b
magenta      = 0101b
brown        = 0110b
lightGray    = 0111b
gray         = 1000b
lightBlue    = 1001b
lightGreen   = 1010b
lightCyan    = 1011b
lightRed     = 1100b
lightMagenta = 1101b
yellow       = 1110b
white        = 1111b
 
; Alternate color constants (used in Chapter 15, printints 1-2)
; added 1/8/2003
 
BLACK        = 0000b
BLUE         = 0001b
GREEN        = 0010b
CYAN         = 0011b
RED          = 0100b
MAGENTA      = 0101b
BROWN        = 0110b
LIGHT_GRAY   = 0111b
GRAY         = 1000b
LIGHT_BLUE   = 1001b
LIGHT_GREEN  = 1010b
LIGHT_CYAN   = 1011b
LIGHT_RED    = 1100b
LIGHT_MAGENTA = 1101b
YELLOW       = 1110b
WHITE        = 1111b
 
;-------------------------------------------------
; SYMBOLS
;-------------------------------------------------
 
; Constants related to creating and opening files. From the Windows 9x SDK.
 
FILE_CREATE = 0010h
FILE_OPEN = 0001h
FILE_TRUNCATE = 0002h
 
ACTION_OPENED = 0001h
ACTION_CREATED_OPENED = 0002h
ACTION_REPLACED_OPENED = 0003h
 
OPEN_SHARE_COMPATIBLE = 0000h
OPEN_SHARE_DENYREADWRITE = 0010h
OPEN_SHARE_DENYWRITE = 0020h
OPEN_SHARE_DENYREAD = 0030h
OPEN_SHARE_DENYNONE = 0040h
 
OPEN_FLAGS_NOINHERIT = 0080h
OPEN_FLAGS_NO_BUFFERING = 0100h
OPEN_FLAGS_NO_COMPRESS = 0200h
OPEN_FLAGS_ALIAS_HINT = 0400h
OPEN_FLAGS_NOCRITERR = 2000h
OPEN_FLAGS_COMMIT = 4000h
 
OPEN_ACCESS_READONLY = 0000h
OPEN_ACCESS_WRITEONLY = 0001h
OPEN_ACCESS_READWRITE = 0002h
OPEN_ACCESS_RO_NOMODLASTACCESS = 0004h
 
_A_NORMAL = 0000h
_A_RDONLY = 0001h
_A_HIDDEN = 0002h
_A_SYSTEM = 0004h
_A_VOLID = 0008h
_A_ARCH = 0020h
 
;--------------------------------------------------
; Structures
;--------------------------------------------------
 
; CursorPosStruc and VideoInfoStruc are used by INT 10h, Function 1Bh
; (Get Video Information).See the GetMaxXY procedure for details.
; (Added 10/21/2002)
 
CursorPosStruc STRUCT
Ycoord BYTE ?
Xcoord BYTE ?
CursorPosStruc ENDS
 
VideoInfoStruc STRUC
supportedInfoPtr     DWORD ?
videoMode            BYTE ?
numCharColumns       WORD ?
videoBufferLen       WORD ?
videoBufferStartPtr  WORD ?
cursors CursorPosStruc 8 DUP(<>) ; video pages 0-7
cursorStartLine      BYTE ?
cursorEndLine        BYTE ?
activeDisplayPage    BYTE ?
adapterBasePortAddr  WORD ?
currentRegister3B8or3D8 BYTE ?
currentRegister3B9or3D9 BYTE ?
numCharRows          BYTE ?
characterScanHeight  WORD ?
activeDisplayCode    BYTE ?
inactiveDisplayCode  BYTE ?
numberOfColors       WORD ?
numberOfVideoPages   BYTE ?
numberOfScanLines    WORD ?
primaryCharBlock     BYTE ?
secondaryCharBlock   BYTE ?
miscStateInfo        BYTE ?
                    BYTE 3 DUP(?)
videoMemAvail        BYTE ?
savePointerStateInfo BYTE ?
                    BYTE 13 DUP(?)
VideoInfoStruc ENDS
 
 
 
; ExtGetDskFreSpcStruc is used by INT 21h Function 7303h
; (Get Disk Free Space):
 
ExtGetDskFreSpcStruc STRUC
    StructSize                WORD  ?
    Level                     WORD  ?
    SectorsPerCluster         DWORD ?
    BytesPerSector            DWORD ?
    AvailableClusters         DWORD ?
    TotalClusters             DWORD ?
    AvailablePhysSectors      DWORD ?
    TotalPhysSectors          DWORD ?
    AvailableAllocationUnits  DWORD ?
    TotalAllocationUnits      DWORD ?
    Rsvd                      DWORD 2 DUP (?)
ExtGetDskFreSpcStruc ENDS
 
; TimeRecord structure. Will be copied from an include file.
 
TimeRecord STRUCT
hours    BYTE ?
minutes  BYTE ?
seconds  BYTE ?
hhss     BYTE ?
TimeRecord ENDS
 
; This structure is returned by the FSTSW
; instruction in real-address mode:
 
FPU_ENVIRON STRUCT
controlWord     WORD ?
ALIGN DWORD
statusWord      WORD ?
ALIGN DWORD
tagWord         WORD ?
ALIGN DWORD
instrPtrLow     WORD ?
ALIGN DWORD
opcodeAndInstrPtrHi  DWORD ?
operandPtrLow        WORD ?
ALIGN DWORD
operandPtrHi         DWORD ?
FPU_ENVIRON ENDS
 
 
.LIST
 
 
 
 
 
 
 
loader.asm(闹钟主程序)
 
[bits 16]
org 0100h
BaseOfStack equ 0100h
 
 
jmp long _start
 
BootMessage: db "Time:        "
 
db 0,0,0,0
circle:
 
 
db 236,122,236,123,236,124,235,126,235,127,234,128,234,129,233,131,233,132,232,133,231,135,231,136,230,137,229,138,229,140,228,141
db 227,142,227,143,226,144,225,145,224,147,223,148,223,149,222,150,221,151,220,152,219,153,218,154,217,155,216,156,215,157,214,158
db 213,159,212,160,211,161,210,162,209,163,208,163,207,164,205,165,204,166,203,167,202,167,201,168,199,169,198,169,197,170,196,171
db 195,171,193,172,192,173,191,173,189,174,188,174,187,175,186,175,184,176,183,176,182,176,180,177,179,177,177,177,176,178,175,178
db 173,178,172,179,171,179,169,179,168,179,166,179,165,179,164,179,162,179,161,179,160,179,158,179,157,179,155,179,154,179,153,179
db 151,179,150,179,148,179,147,179,146,178,144,178,143,178,142,177,140,177,139,177,137,176,136,176,135,176,133,175,132,175,131,174
db 130,174,128,173,127,173,126,172,124,171,123,171,122,170,121,169,119,169,118,168,117,167,116,167,115,166,114,165,112,164,111,163
db 110,163,109,162,108,161,107,160,106,159,105,158,104,157,103,156,102,155,101,154,100,153,99,152,98,151,97,150,96,149,96,148,95,147
db 94,145,93,144,92,143,92,142,91,141,90,140,90,138,89,137,88,136,88,135,87,133,86,132,86,131,85,129,85,128,84,127,84,126,83,124,83
db 123,83,122,82,120,82,119,82,117,81,116,81,115,81,113,80,112,80,111,80,109,80,108,80,106,80,105,80,104,80,102,80,101,80,100,80,98
db 80,97,80,95,80,94,80,93,80,91,80,90,80,88,80,87,81,86,81,84,81,83,82,82,82,80,82,79,83,77,83,76,83,75,84,73,84,72,85,71,85,70,86
db 68,86,67,87,66,88,64,88,63,89,62,90,61,90,60,91,58,92,57,92,56,93,55,94,54,95,52,96,51,96,50,97,49,98,48,99,47,100,46,101,45,102
db 44,103,43,104,42,105,41,106,40,107,39,108,38,109,37,110,36,111,36,112,35,114,34,115,33,116,32,117,32,118,31,120,30,121,30,122,29
db 123,28,124,28,126,27,127,26,128,26,130,25,131,25,132,24,133,24,135,23,136,23,137,23,139,22,140,22,142,22,143,21,144,21,146,21,147
db 20,148,20,150,20,151,20,153,20,154,20,155,20,157,20,158,20,160,20,161,20,162,20,164,20,165,20,166,20,168,20,169,20,171,20,172,20
db 173,21,175,21,176,21,177,22,179,22,180,22,182,23,183,23,184,23,186,24,187,24,188,25,189,25,191,26,192,26,193,27,195,28,196,28,197
db 29,198,30,199,30,201,31,202,32,203,32,204,33,205,34,207,35,208,36,209,36,210,37,211,38,212,39,213,40,214,41,215,42,216,43,217,44
db 218,45,219,46,220,47,221,48,222,49,223,50,223,51,224,52,225,54,226,55,227,56,227,57,228,58,229,59,229,61,230,62,231,63,231,64,232
db 66,233,67,233,68,234,70,234,71,235,72,235,73,236,75,236,76,236,77,237,79,237,80,237,82,238,83,238,84,238,86,239,87,239,88,239,90,239
db 91,239,93,239,94,239,95,239,97,239,98,239,99
db 240,100,239,101,239,102,239,104,239,105,239,106,239,108,239,109,239,111,239,112,238,113,238,115,238,116,237,117,237,119,237,120
 
 
 
 
line:
db 160, 60,160, 80,160, 90,160, 95,160, 97,160, 98,160, 99,160, 98,160, 96,160, 96,160, 95,160, 92,160, 93,160, 94,160, 93,160, 91,160, 91,160, 90,160, 85,160, 87,160, 88,160, 89,160, 88,160, 86,160, 86,160, 85,160, 82,160, 83,160, 84,160, 83,160, 81,160, 81,160, 80,160, 70,160, 75,160, 77,160, 78,160, 79,160, 78,160, 76,160, 76,160, 75,160, 72,160, 73,160, 74,160, 73,160, 71,160, 71,160, 70,160, 65,160, 67,160, 68,160, 69,160, 68,160, 66,160, 66,160, 65,160, 62,160, 63,160, 64,160, 63,160, 61,160, 61,160, 60,160, 40,160, 50,160, 55,160, 57,160, 58,160, 59,160, 58,160, 56,160, 56,160, 55,160, 52,160, 53,160, 54,160, 53,160, 51,160, 51,160, 50,160, 45,160, 47,160, 48,160, 49,160, 48,160, 46,160, 46,160, 45,160, 42,160, 43,160, 44,160, 43,160, 41,160, 41,160, 40,160, 30,160, 35,160, 37,160, 38,160, 39,160, 38,160, 36,160, 36,160, 35,160, 32,160, 33,160, 34,160, 33,160, 31,160, 31,160, 30,160, 25,160, 27,160, 28,160, 29,160, 28,160, 26,160, 26,160, 25,160, 22,160, 23,160, 24,160, 23,160, 21,160, 21,160, 20,
db 164, 60,162, 80,161, 90,160, 95,160, 97,160, 98,160, 99,160, 98,160, 96,160, 96,160, 95,160, 92,160, 93,160, 94,160, 93,160, 91,160, 91,160, 90,161, 85,161, 87,161, 88,161, 89,161, 88,161, 86,161, 86,161, 85,161, 82,161, 83,161, 84,161, 83,161, 81,161, 81,161, 80,163, 70,162, 75,162, 77,162, 78,162, 79,162, 78,162, 76,162, 76,162, 75,162, 72,162, 73,162, 74,162, 73,162, 71,162, 71,162, 70,163, 65,163, 67,163, 68,163, 69,163, 68,163, 66,163, 66,163, 65,163, 62,163, 63,163, 64,163, 63,163, 61,163, 61,163, 60,166, 40,165, 50,164, 55,164, 57,164, 58,164, 59,164, 58,164, 56,164, 56,164, 55,164, 52,164, 53,164, 54,164, 53,164, 51,164, 51,164, 50,165, 45,165, 47,165, 48,165, 49,165, 48,165, 46,165, 46,165, 45,165, 42,165, 43,165, 44,165, 43,165, 41,165, 41,165, 40,167, 30,166, 35,166, 37,166, 38,166, 39,166, 38,166, 36,166, 36,166, 35,166, 32,166, 33,166, 34,166, 33,166, 31,166, 31,166, 30,167, 25,167, 27,167, 28,167, 29,167, 28,167, 26,167, 26,167, 25,167, 22,167, 23,167, 24,167, 23,167, 21,167, 21,167, 20,
db 168, 60,164, 80,162, 90,161, 95,160, 97,160, 98,160, 99,160, 98,160, 96,160, 96,160, 95,161, 92,161, 93,161, 94,161, 93,161, 91,161, 91,161, 90,163, 85,162, 87,162, 88,162, 89,162, 88,162, 86,162, 87,162, 85,163, 82,163, 83,163, 84,163, 83,163, 81,163, 82,163, 80,166, 70,165, 75,164, 77,164, 79,164, 79,164, 78,164, 76,164, 77,164, 75,165, 72,165, 74,165, 74,165, 73,165, 71,165, 72,165, 70,167, 65,166, 67,166, 69,166, 69,166, 68,166, 66,166, 67,166, 66,167, 62,167, 64,167, 64,167, 63,167, 61,167, 62,167, 61,172, 40,170, 50,169, 55,168, 58,168, 59,168, 59,168, 58,168, 56,168, 57,168, 56,169, 53,169, 54,169, 54,169, 53,169, 51,169, 52,169, 51,171, 45,170, 48,170, 49,170, 50,170, 48,170, 46,170, 47,170, 46,171, 43,171, 44,171, 45,171, 43,171, 41,171, 42,171, 41,174, 30,173, 35,172, 38,172, 39,172, 40,172, 38,172, 37,172, 37,172, 36,173, 33,173, 34,173, 35,173, 33,173, 32,173, 32,173, 31,175, 25,174, 28,174, 29,174, 30,174, 29,174, 27,174, 27,174, 26,175, 23,175, 24,175, 25,175, 24,175, 22,175, 22,175, 21,
db 172, 61,166, 80,163, 90,161, 95,160, 97,160, 98,160, 99,160, 98,161, 96,160, 96,161, 95,162, 92,161, 93,161, 94,162, 93,162, 91,162, 92,162, 90,164, 85,163, 87,163, 89,163, 89,163, 88,164, 86,163, 87,164, 86,165, 83,164, 84,164, 84,165, 83,165, 81,165, 82,165, 81,169, 71,167, 75,166, 78,166, 79,166, 80,166, 78,167, 77,166, 77,167, 76,168, 73,167, 74,167, 75,168, 74,168, 72,168, 72,168, 71,170, 66,169, 68,169, 69,169, 70,169, 69,170, 67,169, 68,170, 66,171, 63,170, 65,170, 65,171, 64,171, 62,171, 63,171, 62,178, 42,175, 51,173, 56,172, 59,172, 60,172, 60,172, 59,173, 57,172, 58,173, 57,174, 54,173, 55,173, 56,174, 54,174, 53,174, 53,174, 52,176, 47,175, 49,175, 50,175, 51,175, 50,176, 48,175, 48,176, 47,177, 44,176, 45,176, 46,177, 45,177, 43,177, 44,177, 42,181, 32,179, 37,178, 39,178, 41,178, 41,178, 40,179, 38,178, 39,179, 38,180, 35,179, 36,179, 36,180, 35,180, 33,180, 34,180, 33,182, 27,181, 30,181, 31,181, 32,181, 30,182, 29,181, 29,182, 28,183, 25,182, 26,182, 27,183, 26,183, 24,183, 24,183, 23,
db 176, 63,168, 81,164, 90,162, 95,161, 97,160, 98,160, 99,160, 98,161, 96,161, 97,161, 95,163, 93,162, 94,162, 94,162, 93,163, 91,163, 92,163, 91,166, 86,165, 88,164, 89,164, 90,164, 89,165, 87,165, 87,165, 86,167, 83,166, 84,166, 85,166, 84,167, 82,167, 83,167, 82,172, 72,170, 76,169, 79,168, 80,168, 80,168, 79,169, 78,169, 78,169, 77,171, 74,170, 75,170, 76,170, 75,171, 73,171, 73,171, 72,174, 67,173, 69,172, 71,172, 71,172, 70,173, 68,173, 69,173, 68,175, 65,174, 66,174, 67,174, 65,175, 64,175, 64,175, 63,184, 44,180, 53,178, 58,177, 60,176, 61,176, 62,176, 61,177, 59,177, 60,177, 58,179, 56,178, 57,178, 57,178, 56,179, 54,179, 55,179, 54,182, 49,181, 51,180, 52,180, 53,180, 52,181, 50,181, 50,181, 49,183, 46,182, 47,182, 48,182, 47,183, 45,183, 46,183, 45,188, 35,186, 39,185, 42,184, 43,184, 43,184, 42,185, 41,185, 41,185, 40,187, 37,186, 38,186, 39,186, 38,187, 36,187, 36,187, 35,190, 30,189, 32,188, 34,188, 34,188, 33,189, 31,189, 32,189, 31,191, 28,190, 29,190, 30,190, 28,191, 27,191, 27,191, 26,
db 179, 65,169, 82,164, 91,162, 95,161, 97,160, 98,160, 99,160, 98,161, 96,161, 97,162, 96,163, 93,163, 94,162, 95,163, 93,164, 92,163, 92,164, 91,167, 86,166, 89,165, 90,165, 90,165, 89,166, 87,166, 88,167, 87,168, 84,167, 85,167, 86,168, 85,169, 83,168, 84,169, 83,174, 73,172, 78,170, 80,170, 81,170, 81,170, 80,171, 79,171, 79,171, 78,173, 75,172, 77,172, 77,173, 76,174, 74,173, 75,174, 74,177, 69,175, 71,175, 72,174, 73,175, 72,176, 70,176, 71,176, 69,178, 67,177, 68,177, 68,177, 67,178, 66,178, 66,179, 65,189, 47,184, 56,181, 60,180, 62,180, 63,179, 64,180, 63,181, 61,181, 62,181, 61,183, 58,182, 59,182, 60,182, 58,183, 57,183, 57,184, 56,186, 51,185, 54,184, 55,184, 55,185, 54,186, 52,185, 53,186, 52,188, 49,187, 50,187, 51,187, 50,188, 48,188, 49,188, 48,194, 38,191, 43,190, 45,189, 46,189, 46,190, 45,191, 44,190, 44,191, 43,192, 40,192, 42,191, 42,192, 41,193, 39,193, 40,193, 39,196, 34,195, 36,194, 37,194, 38,195, 37,195, 35,195, 36,196, 34,197, 32,197, 33,196, 33,197, 32,198, 31,198, 31,198, 30,
db 183, 67,171, 83,165, 91,162, 95,161, 97,160, 98,160, 99,161, 98,162, 96,161, 97,162, 96,164, 93,163, 94,163, 95,164, 94,165, 92,164, 93,165, 92,168, 87,167, 89,166, 90,166, 91,166, 90,168, 88,167, 89,168, 88,170, 85,169, 86,169, 87,169, 86,171, 84,170, 85,171, 84,177, 75,174, 79,173, 81,172, 82,172, 83,172, 82,173, 80,173, 81,174, 80,176, 77,175, 78,175, 79,175, 78,176, 76,176, 77,177, 76,180, 71,179, 73,178, 74,177, 75,178, 74,179, 72,179, 73,180, 72,182, 69,181, 70,180, 71,181, 70,182, 68,182, 69,183, 68,195, 51,189, 59,186, 63,184, 65,184, 66,183, 66,184, 65,185, 64,185, 64,186, 63,187, 61,187, 62,186, 62,187, 61,188, 60,188, 60,189, 59,192, 55,190, 57,190, 58,189, 58,190, 57,191, 56,191, 56,191, 55,193, 53,193, 54,192, 54,193, 53,194, 52,194, 52,194, 51,201, 43,198, 47,196, 49,195, 50,195, 50,196, 49,197, 48,197, 48,197, 47,199, 45,198, 46,198, 46,199, 45,200, 44,200, 44,200, 43,204, 39,202, 41,201, 42,201, 42,202, 41,203, 40,202, 40,203, 39,205, 37,204, 38,204, 38,205, 37,206, 36,205, 36,206, 35,
db 186, 70,173, 85,166, 92,163, 96,161, 98,160, 99,160, 99,161, 98,162, 97,162, 97,162, 96,164, 94,164, 95,163, 95,164, 94,165, 93,165, 93,166, 92,169, 88,168, 90,167, 91,167, 92,167, 91,169, 89,168, 90,169, 89,171, 86,170, 87,170, 88,171, 87,172, 85,172, 86,172, 85,179, 77,176, 81,174, 83,174, 84,173, 84,174, 83,175, 82,175, 82,176, 81,178, 79,177, 80,176, 80,177, 79,179, 78,178, 78,179, 77,183, 73,181, 75,180, 76,180, 77,181, 76,182, 74,181, 75,182, 74,184, 71,184, 72,183, 73,184, 72,185, 70,185, 71,186, 70,199, 55,193, 62,189, 66,188, 68,187, 69,186, 69,187, 68,188, 67,188, 67,189, 66,191, 64,190, 65,190, 65,191, 64,192, 63,191, 63,192, 62,196, 58,194, 60,193, 61,193, 62,194, 61,195, 59,195, 60,196, 59,198, 56,197, 57,196, 58,197, 57,198, 55,198, 56,199, 55,206, 47,203, 51,201, 53,200, 54,200, 54,200, 53,202, 52,201, 52,202, 51,204, 49,203, 50,203, 50,204, 49,205, 48,205, 48,205, 47,209, 43,208, 45,207, 46,206, 47,207, 46,208, 44,208, 45,209, 44,211, 41,210, 42,210, 43,210, 42,212, 40,211, 41,212, 40,
db 189, 73,174, 86,167, 93,163, 96,161, 98,160, 99,160, 99,161, 98,162, 97,162, 97,163, 97,165, 94,164, 95,164, 96,165, 95,166, 94,165, 94,166, 93,171, 89,169, 91,168, 92,167, 92,168, 91,170, 90,169, 91,170, 90,172, 88,171, 89,171, 89,172, 88,173, 87,173, 87,174, 86,182, 79,178, 83,176, 84,175, 85,175, 86,176, 85,177, 83,177, 84,177, 83,180, 81,179, 82,178, 82,179, 81,181, 80,180, 81,181, 80,185, 76,183, 78,183, 78,182, 79,183, 78,184, 77,184, 77,185, 76,187, 74,186, 75,186, 75,187, 75,188, 73,188, 74,189, 73,204, 59,196, 66,193, 69,191, 71,190, 72,189, 72,190, 71,192, 70,191, 70,192, 70,195, 67,194, 68,193, 69,194, 68,195, 67,195, 67,196, 66,200, 62,198, 64,197, 65,197, 65,198, 64,199, 63,199, 64,200, 63,202, 61,201, 62,201, 62,201, 61,203, 60,202, 60,203, 59,211, 52,207, 56,206, 57,205, 58,204, 59,205, 58,207, 56,206, 57,207, 56,209, 54,208, 55,208, 55,209, 54,210, 53,210, 54,211, 53,215, 49,213, 51,212, 51,212, 52,213, 51,214, 50,213, 50,214, 49,217, 47,216, 48,215, 48,216, 48,218, 46,217, 47,218, 46,
db 192, 76,176, 88,168, 94,164, 97,162, 98,161, 99,160, 99,161, 98,163, 97,162, 98,163, 97,166, 95,165, 96,164, 96,165, 95,167, 94,166, 95,167, 94,172, 91,170, 92,169, 93,168, 93,169, 92,171, 91,170, 92,171, 91,174, 89,173, 90,172, 90,173, 89,175, 88,174, 89,175, 88,184, 82,180, 85,178, 86,177, 87,176, 87,177, 86,179, 85,178, 86,179, 85,182, 83,181, 84,180, 84,181, 83,183, 82,182, 83,183, 82,188, 79,186, 80,185, 81,184, 81,185, 80,187, 79,186, 80,187, 79,190, 77,189, 78,188, 78,189, 77,191, 76,190, 77,191, 76,208, 64,200, 70,196, 73,194, 74,193, 75,192, 75,193, 74,195, 73,194, 74,195, 73,198, 71,197, 72,196, 72,197, 71,199, 70,198, 71,199, 70,204, 67,202, 68,201, 69,200, 69,201, 68,203, 67,202, 68,203, 67,206, 65,205, 66,204, 66,205, 65,207, 64,206, 65,207, 64,216, 58,212, 61,210, 62,209, 63,208, 63,209, 62,211, 61,210, 62,211, 61,214, 59,213, 60,212, 60,213, 59,215, 58,214, 59,215, 58,220, 55,218, 56,217, 57,216, 57,217, 56,219, 55,218, 56,219, 55,222, 53,221, 54,220, 54,221, 53,223, 52,222, 53,223, 52,
db 194, 79,177, 89,168, 94,164, 97,162, 98,161, 99,160, 99,161, 99,163, 98,162, 98,163, 97,166, 96,165, 96,164, 97,165, 96,167, 95,167, 95,168, 95,172, 92,170, 93,169, 94,169, 94,170, 93,171, 92,171, 93,172, 92,175, 91,174, 91,173, 91,174, 91,176, 90,175, 90,176, 90,185, 84,181, 87,179, 88,178, 89,177, 89,178, 88,180, 87,179, 88,181, 87,183, 85,182, 86,182, 86,183, 86,184, 85,184, 85,185, 84,190, 82,188, 83,186, 83,186, 84,187, 83,189, 82,188, 83,189, 82,192, 80,191, 81,190, 81,191, 81,193, 80,192, 80,193, 79,211, 69,203, 74,198, 76,196, 78,195, 78,195, 79,196, 78,197, 77,197, 77,198, 77,200, 75,199, 76,199, 76,200, 75,202, 75,201, 75,202, 74,207, 71,205, 73,204, 73,203, 74,204, 73,206, 72,205, 72,206, 72,209, 70,208, 71,207, 71,209, 70,210, 69,210, 70,211, 69,220, 64,216, 66,213, 67,212, 68,212, 68,213, 68,214, 67,214, 67,215, 67,218, 65,217, 66,216, 66,217, 65,219, 64,218, 65,219, 64,224, 61,222, 62,221, 63,220, 63,221, 63,223, 62,223, 62,224, 61,226, 60,225, 60,225, 61,226, 60,227, 59,227, 59,228, 59,
db 196, 83,178, 91,169, 95,164, 97,162, 98,161, 99,160, 99,161, 99,163, 98,162, 98,163, 98,166, 96,165, 97,165, 97,166, 97,167, 96,167, 96,168, 96,173, 93,171, 94,170, 95,169, 95,170, 95,172, 94,171, 94,173, 94,175, 92,174, 93,174, 93,175, 93,177, 92,176, 92,177, 92,187, 87,182, 89,180, 90,179, 91,178, 91,179, 90,181, 90,181, 90,182, 89,185, 88,183, 89,183, 89,184, 88,186, 88,185, 88,186, 87,191, 85,189, 86,188, 87,187, 87,189, 86,190, 86,190, 86,191, 85,194, 84,193, 85,192, 85,193, 84,195, 84,194, 84,195, 83,214, 75,205, 79,201, 81,198, 82,197, 82,197, 83,198, 82,199, 81,199, 82,200, 81,203, 80,202, 80,201, 81,202, 80,204, 79,203, 80,205, 79,210, 77,207, 78,206, 78,206, 79,207, 78,209, 77,208, 78,209, 77,212, 76,211, 76,210, 77,211, 76,213, 75,213, 76,214, 75,223, 71,219, 73,217, 74,215, 74,215, 74,216, 74,218, 73,217, 73,218, 73,221, 72,220, 72,219, 72,221, 72,222, 71,222, 71,223, 71,228, 69,226, 70,225, 70,224, 70,225, 70,227, 69,226, 69,227, 69,230, 68,229, 68,229, 68,230, 68,231, 67,231, 67,232, 67,
db 198, 87,179, 93,169, 96,164, 98,162, 99,161, 99,160, 99,161, 99,163, 98,162, 99,164, 98,167, 97,165, 98,165, 98,166, 97,168, 97,167, 97,168, 97,174, 95,171, 96,170, 96,170, 96,171, 96,173, 95,172, 95,173, 95,176, 94,175, 94,174, 95,176, 94,177, 94,177, 94,178, 93,188, 90,183, 92,181, 92,180, 93,179, 93,180, 93,182, 92,181, 92,183, 92,186, 91,184, 91,184, 91,185, 91,187, 91,186, 91,187, 90,193, 89,190, 89,189, 90,189, 90,190, 90,192, 89,191, 89,192, 89,195, 88,194, 88,193, 88,195, 88,196, 87,196, 88,197, 87,217, 81,207, 84,202, 85,200, 86,199, 87,198, 87,199, 86,201, 86,200, 86,202, 86,205, 85,203, 85,203, 85,204, 85,206, 84,205, 84,206, 84,212, 82,209, 83,208, 83,208, 84,209, 83,211, 83,210, 83,211, 83,214, 82,213, 82,212, 82,214, 82,215, 81,215, 81,216, 81,226, 78,221, 79,219, 80,218, 80,217, 81,218, 80,220, 80,219, 80,221, 79,224, 78,222, 79,222, 79,223, 79,225, 78,224, 78,225, 78,231, 76,228, 77,227, 77,227, 77,228, 77,230, 76,229, 77,230, 76,233, 75,232, 76,231, 76,233, 75,234, 75,234, 75,235, 75,
db 199, 91,179, 95,169, 97,164, 98,162, 99,161, 99,160, 99,161, 99,163, 99,163, 99,164, 99,167, 98,166, 98,165, 98,166, 98,168, 98,167, 98,169, 98,174, 96,172, 97,170, 97,170, 97,171, 97,173, 97,172, 97,174, 96,177, 96,175, 96,175, 96,176, 96,178, 96,177, 96,178, 95,189, 93,184, 94,181, 95,180, 95,180, 95,181, 95,183, 94,182, 95,183, 94,186, 94,185, 94,184, 94,186, 94,188, 93,187, 94,188, 93,194, 92,191, 93,190, 93,189, 93,191, 93,192, 92,192, 92,193, 92,196, 92,195, 92,194, 92,195, 92,197, 91,197, 91,198, 91,218, 87,208, 89,203, 90,201, 90,200, 91,199, 91,200, 91,202, 90,202, 90,203, 90,206, 89,205, 90,204, 90,205, 90,207, 89,206, 89,208, 89,213, 88,211, 88,209, 89,209, 89,210, 88,212, 88,211, 88,213, 88,216, 87,214, 88,214, 88,215, 87,217, 87,216, 87,217, 87,228, 85,223, 86,220, 86,219, 86,219, 87,220, 86,222, 86,221, 86,222, 86,225, 85,224, 85,223, 86,225, 85,227, 85,226, 85,227, 85,233, 84,230, 84,229, 84,228, 84,230, 84,231, 84,231, 84,232, 84,235, 83,234, 83,233, 83,234, 83,236, 83,236, 83,237, 83,
db 199, 95,179, 97,169, 98,164, 99,162, 99,161, 99,160, 99,161, 99,163, 99,163, 99,164, 99,167, 99,166, 99,165, 99,166, 99,168, 99,168, 99,169, 98,174, 98,172, 98,171, 98,170, 98,171, 98,173, 98,172, 98,174, 98,177, 98,176, 98,175, 98,176, 98,178, 97,177, 97,179, 97,189, 96,184, 97,182, 97,180, 97,180, 97,181, 97,183, 97,182, 97,184, 97,187, 96,185, 97,185, 97,186, 96,188, 96,187, 96,189, 96,194, 96,192, 96,190, 96,190, 96,191, 96,193, 96,192, 96,193, 96,197, 95,195, 95,195, 95,196, 95,198, 95,197, 95,198, 95,219, 93,209, 94,204, 94,201, 95,200, 95,200, 95,201, 95,203, 95,202, 95,203, 95,206, 94,205, 94,205, 94,206, 94,208, 94,207, 94,208, 94,214, 93,211, 94,210, 94,209, 94,211, 94,213, 93,212, 94,213, 93,216, 93,215, 93,214, 93,216, 93,218, 93,217, 93,218, 93,229, 92,224, 92,221, 92,220, 93,219, 93,221, 93,222, 92,222, 92,223, 92,226, 92,225, 92,224, 92,226, 92,227, 92,227, 92,228, 92,234, 91,231, 91,230, 91,229, 92,230, 91,232, 91,232, 91,233, 91,236, 91,235, 91,234, 91,235, 91,237, 91,237, 91,238, 91,
db 200, 100,180, 100,170, 100,165, 100,162, 100,161, 100,160, 100,161, 100,163, 100,163, 100,164, 100,167, 100,166, 100,165, 100,166, 100,168, 100,168, 100,169, 100,175, 100,172, 100,171, 100,170, 100,171, 100,173, 100,173, 100,174, 100,177, 100,176, 100,175, 100,176, 100,178, 100,178, 100,179, 100,190, 100,185, 100,182, 100,181, 100,180, 100,181, 100,183, 100,183, 100,184, 100,187, 100,186, 100,185, 100,186, 100,188, 100,188, 100,189, 100,195, 100,192, 100,191, 100,190, 100,191, 100,193, 100,193, 100,194, 100,197, 100,196, 100,195, 100,196, 100,198, 100,198, 100,199, 100,220, 100,210, 100,205, 100,202, 100,201, 100,200, 100,201, 100,203, 100,203, 100,204, 100,207, 100,206, 100,205, 100,206, 100,208, 100,208, 100,209, 100,215, 100,212, 100,211, 100,210, 100,211, 100,213, 100,213, 100,214, 100,217, 100,216, 100,215, 100,216, 100,218, 100,218, 100,219, 100,230, 100,225, 100,222, 100,221, 100,220, 100,221, 100,223, 100,223, 100,224, 100,227, 100,226, 100,225, 100,226, 100,228, 100,228, 100,229, 100,235, 100,232, 100,231, 100,230, 100,231, 100,233, 100,233, 100,234, 100,237, 100,236, 100,235, 100,236, 100,238, 100,238, 100,239, 100,
db 199, 104,179, 102,169, 101,164, 100,162, 100,161, 100,160, 100,161, 100,163, 100,163, 100,164, 100,167, 100,166, 100,165, 100,166, 100,168, 100,168, 100,169, 100,174, 101,172, 101,171, 101,170, 101,171, 101,173, 101,172, 101,174, 101,177, 101,176, 101,175, 101,176, 101,178, 101,177, 101,179, 101,189, 103,184, 102,182, 102,180, 102,180, 102,181, 102,183, 102,182, 102,184, 102,187, 102,185, 102,185, 102,186, 102,188, 102,187, 102,189, 102,194, 103,192, 103,190, 103,190, 103,191, 103,193, 103,192, 103,193, 103,197, 103,195, 103,195, 103,196, 103,198, 103,197, 103,198, 103,219, 106,209, 105,204, 104,201, 104,200, 104,200, 104,201, 104,203, 104,202, 104,203, 104,206, 104,205, 104,205, 104,206, 104,208, 104,207, 104,208, 104,214, 105,211, 105,210, 105,209, 105,211, 105,213, 105,212, 105,213, 105,216, 105,215, 105,214, 105,216, 105,218, 105,217, 105,218, 105,229, 107,224, 106,221, 106,220, 106,219, 106,221, 106,222, 106,222, 106,223, 106,226, 106,225, 106,224, 106,226, 106,227, 106,227, 106,228, 106,234, 107,231, 107,230, 107,229, 107,230, 107,232, 107,232, 107,233, 107,236, 107,235, 107,234, 107,235, 107,237, 107,237, 107,238, 107,
db 199, 108,179, 104,169, 102,164, 101,162, 100,161, 100,160, 100,161, 100,163, 100,163, 100,164, 100,167, 101,166, 101,165, 101,166, 101,168, 101,167, 101,169, 101,174, 103,172, 102,170, 102,170, 102,171, 102,173, 102,172, 102,174, 102,177, 103,175, 103,175, 103,176, 103,178, 103,177, 103,178, 103,189, 106,184, 105,181, 104,180, 104,180, 104,181, 104,183, 104,182, 104,183, 104,186, 105,185, 105,184, 105,186, 105,188, 105,187, 105,188, 105,194, 107,191, 106,190, 106,189, 106,191, 106,192, 106,192, 106,193, 106,196, 107,195, 107,194, 107,195, 107,197, 107,197, 107,198, 107,218, 112,208, 110,203, 109,201, 108,200, 108,199, 108,200, 108,202, 108,202, 108,203, 108,206, 109,205, 109,204, 109,205, 109,207, 109,206, 109,208, 109,213, 111,211, 110,209, 110,209, 110,210, 110,212, 110,211, 110,213, 110,216, 111,214, 111,214, 111,215, 111,217, 111,216, 111,217, 111,228, 114,223, 113,220, 112,219, 112,219, 112,220, 112,222, 112,221, 112,222, 112,225, 113,224, 113,223, 113,225, 113,227, 113,226, 113,227, 113,233, 115,230, 114,229, 114,228, 114,230, 114,231, 114,231, 114,232, 114,235, 115,234, 115,233, 115,234, 115,236, 115,236, 115,237, 115,
db 198, 112,179, 106,169, 103,164, 101,162, 100,161, 100,160, 100,161, 100,163, 101,162, 100,164, 101,167, 102,165, 101,165, 101,166, 102,168, 102,167, 102,168, 102,174, 104,171, 103,170, 103,170, 103,171, 103,173, 104,172, 103,173, 104,176, 105,175, 104,174, 104,176, 105,177, 105,177, 105,178, 105,188, 109,183, 107,181, 106,180, 106,179, 106,180, 106,182, 107,181, 106,183, 107,186, 108,184, 107,184, 107,185, 108,187, 108,186, 108,187, 108,193, 110,190, 109,189, 109,189, 109,190, 109,192, 110,191, 109,192, 110,195, 111,194, 110,193, 110,195, 111,196, 111,196, 111,197, 111,217, 118,207, 115,202, 113,200, 112,199, 112,198, 112,199, 112,201, 113,200, 112,202, 113,205, 114,203, 113,203, 113,204, 114,206, 114,205, 114,206, 114,212, 116,209, 115,208, 115,208, 115,209, 115,211, 116,210, 115,211, 116,214, 117,213, 116,212, 116,214, 117,215, 117,215, 117,216, 117,226, 121,221, 119,219, 118,218, 118,217, 118,218, 118,220, 119,219, 118,221, 119,224, 120,222, 119,222, 119,223, 120,225, 120,224, 120,225, 120,231, 122,228, 121,227, 121,227, 121,228, 121,230, 122,229, 121,230, 122,233, 123,232, 122,231, 122,233, 123,234, 123,234, 123,235, 123,
db 196, 116,178, 108,169, 104,164, 102,162, 101,161, 100,160, 100,161, 100,163, 101,162, 101,163, 101,166, 103,165, 102,165, 102,166, 102,167, 103,167, 103,168, 103,173, 106,171, 105,170, 104,169, 104,170, 104,172, 105,171, 105,173, 105,175, 107,174, 106,174, 106,175, 106,177, 107,176, 107,177, 107,187, 112,182, 110,180, 109,179, 108,178, 108,179, 108,181, 109,181, 109,182, 109,185, 111,183, 110,183, 110,184, 110,186, 111,185, 111,186, 111,191, 114,189, 113,188, 112,187, 112,189, 112,190, 113,190, 113,191, 113,194, 115,193, 114,192, 114,193, 114,195, 115,194, 115,195, 115,214, 124,205, 120,201, 118,198, 117,197, 116,197, 116,198, 116,199, 117,199, 117,200, 117,203, 119,202, 118,201, 118,202, 118,204, 119,203, 119,205, 119,210, 122,207, 121,206, 120,206, 120,207, 120,209, 121,208, 121,209, 121,212, 123,211, 122,210, 122,211, 122,213, 123,213, 123,214, 123,223, 128,219, 126,217, 125,215, 124,215, 124,216, 124,218, 125,217, 125,218, 125,221, 127,220, 126,219, 126,221, 126,222, 127,222, 127,223, 127,228, 130,226, 129,225, 128,224, 128,225, 128,227, 129,226, 129,227, 129,230, 131,229, 130,229, 130,230, 130,231, 131,231, 131,232, 131,
db 194, 120,177, 110,168, 105,164, 102,162, 101,161, 100,160, 100,161, 100,163, 101,162, 101,163, 102,166, 103,165, 103,164, 102,165, 103,167, 104,167, 104,168, 104,172, 107,170, 106,169, 105,169, 105,170, 105,171, 106,171, 106,172, 107,175, 108,174, 108,173, 107,174, 108,176, 109,175, 109,176, 109,185, 115,181, 112,179, 111,178, 110,177, 110,178, 110,180, 111,179, 111,181, 112,183, 113,182, 113,182, 112,183, 113,184, 114,184, 114,185, 114,190, 117,188, 116,186, 115,186, 115,187, 115,189, 116,188, 116,189, 117,192, 118,191, 118,190, 117,191, 118,193, 119,192, 119,193, 119,211, 130,203, 125,198, 122,196, 121,195, 120,195, 120,196, 120,197, 121,197, 121,198, 122,200, 123,199, 123,199, 122,200, 123,202, 124,201, 124,202, 124,207, 127,205, 126,204, 125,203, 125,204, 125,206, 126,205, 126,206, 127,209, 128,208, 128,207, 127,209, 128,210, 129,210, 129,211, 129,220, 135,216, 132,213, 131,212, 130,212, 130,213, 130,214, 131,214, 131,215, 132,218, 133,217, 133,216, 132,217, 133,219, 134,218, 134,219, 134,224, 137,222, 136,221, 135,220, 135,221, 135,223, 136,223, 136,224, 137,226, 138,225, 138,225, 137,226, 138,227, 139,227, 139,228, 139,
db 192, 123,176, 111,168, 105,164, 102,162, 101,161, 100,160, 100,161, 101,163, 102,162, 101,163, 102,166, 104,165, 103,164, 103,165, 104,167, 105,166, 104,167, 105,172, 108,170, 107,169, 106,168, 106,169, 106,171, 108,170, 107,171, 108,174, 110,173, 109,172, 109,173, 109,175, 111,174, 110,175, 111,184, 117,180, 114,178, 113,177, 112,176, 112,177, 112,179, 113,178, 113,179, 114,182, 116,181, 115,180, 115,181, 115,183, 116,182, 116,183, 117,188, 120,186, 119,185, 118,184, 117,185, 118,187, 119,186, 119,187, 120,190, 122,189, 121,188, 120,189, 121,191, 122,190, 122,191, 123,208, 135,200, 129,196, 126,194, 124,193, 124,192, 123,193, 124,195, 125,194, 125,195, 126,198, 127,197, 127,196, 126,197, 127,199, 128,198, 128,199, 129,204, 132,202, 130,201, 130,200, 129,201, 130,203, 131,202, 131,203, 131,206, 133,205, 133,204, 132,205, 133,207, 134,206, 134,207, 134,216, 141,212, 138,210, 136,209, 135,208, 135,209, 136,211, 137,210, 137,211, 137,214, 139,213, 138,212, 138,213, 139,215, 140,214, 140,215, 140,220, 144,218, 142,217, 141,216, 141,217, 142,219, 143,218, 142,219, 143,222, 145,221, 144,220, 144,221, 145,223, 146,222, 145,223, 146,
db 189, 126,174, 113,167, 106,163, 103,161, 101,160, 100,160, 100,161, 101,162, 102,162, 102,163, 102,165, 104,164, 104,164, 103,165, 104,166, 105,165, 105,166, 106,171, 109,169, 108,168, 107,167, 107,168, 107,170, 109,169, 108,170, 109,172, 111,171, 110,171, 110,172, 111,173, 112,173, 112,174, 112,182, 119,178, 116,176, 114,175, 114,175, 113,176, 114,177, 115,177, 115,177, 116,180, 118,179, 117,178, 116,179, 117,181, 119,180, 118,181, 119,185, 123,183, 121,183, 120,182, 120,183, 121,184, 122,184, 121,185, 122,187, 124,186, 124,186, 123,187, 124,188, 125,188, 125,189, 126,204, 139,196, 133,193, 129,191, 128,190, 127,189, 126,190, 127,192, 128,191, 128,192, 129,195, 131,194, 130,193, 130,194, 131,195, 132,195, 131,196, 132,200, 136,198, 134,197, 133,197, 133,198, 134,199, 135,199, 135,200, 136,202, 138,201, 137,201, 136,201, 137,203, 138,202, 138,203, 139,211, 146,207, 143,206, 141,205, 140,204, 140,205, 140,207, 142,206, 141,207, 142,209, 144,208, 143,208, 143,209, 144,210, 145,210, 145,211, 145,215, 149,213, 148,212, 147,212, 146,213, 147,214, 148,213, 148,214, 149,217, 151,216, 150,215, 150,216, 150,218, 152,217, 151,218, 152,
db 186, 129,173, 114,166, 107,163, 103,161, 101,160, 100,160, 100,161, 101,162, 102,162, 102,162, 103,164, 105,164, 104,163, 104,164, 105,165, 106,165, 105,166, 106,169, 111,168, 109,167, 108,167, 107,167, 108,169, 110,168, 109,169, 110,171, 112,170, 111,170, 111,171, 112,172, 113,172, 113,172, 114,179, 122,176, 118,174, 116,174, 115,173, 115,174, 116,175, 117,175, 117,176, 117,178, 120,177, 119,176, 118,177, 119,179, 121,178, 120,179, 121,183, 125,181, 123,180, 123,180, 122,181, 123,182, 124,181, 124,182, 125,184, 127,184, 126,183, 126,184, 127,185, 128,185, 128,186, 129,199, 144,193, 136,189, 133,188, 131,187, 130,186, 129,187, 130,188, 132,188, 131,189, 132,191, 135,190, 134,190, 133,191, 134,192, 135,191, 135,192, 136,196, 140,194, 138,193, 137,193, 137,194, 138,195, 139,195, 139,196, 140,198, 142,197, 141,196, 141,197, 141,198, 143,198, 142,199, 143,206, 151,203, 147,201, 146,200, 145,200, 144,200, 145,202, 147,201, 146,202, 147,204, 149,203, 148,203, 148,204, 149,205, 150,205, 150,205, 151,209, 155,208, 153,207, 152,206, 152,207, 153,208, 154,208, 153,209, 154,211, 157,210, 156,210, 155,210, 156,212, 158,211, 157,212, 158,
db 183, 132,171, 116,165, 108,162, 104,161, 102,160, 101,160, 100,161, 101,162, 103,161, 102,162, 103,164, 106,163, 105,163, 104,164, 105,165, 107,164, 106,165, 107,168, 112,167, 110,166, 109,166, 108,166, 109,168, 111,167, 110,168, 111,170, 114,169, 113,169, 112,169, 113,171, 115,170, 114,171, 115,177, 124,174, 120,173, 118,172, 117,172, 116,172, 117,173, 119,173, 118,174, 119,176, 122,175, 121,175, 120,175, 121,176, 123,176, 122,177, 123,180, 128,179, 126,178, 125,177, 124,178, 125,179, 127,179, 126,180, 127,182, 130,181, 129,180, 128,181, 129,182, 131,182, 130,183, 131,195, 148,189, 140,186, 136,184, 134,184, 133,183, 132,184, 133,185, 135,185, 134,186, 135,187, 138,187, 137,186, 136,187, 137,188, 139,188, 138,189, 139,192, 144,190, 142,190, 141,189, 140,190, 141,191, 143,191, 142,191, 143,193, 146,193, 145,192, 144,193, 145,194, 147,194, 146,194, 147,201, 156,198, 152,196, 150,195, 149,195, 148,196, 149,197, 151,197, 150,197, 151,199, 154,198, 153,198, 152,199, 153,200, 155,200, 154,200, 155,204, 160,202, 158,201, 157,201, 156,202, 157,203, 159,202, 158,203, 159,205, 162,204, 161,204, 160,205, 161,206, 163,205, 162,206, 163,
db 179, 134,169, 117,164, 108,162, 104,161, 102,160, 101,160, 100,160, 101,161, 103,161, 102,162, 103,163, 106,163, 105,162, 104,163, 105,164, 107,163, 107,164, 108,167, 112,166, 110,165, 109,165, 109,165, 110,166, 111,166, 111,167, 112,168, 115,167, 114,167, 113,168, 114,169, 116,168, 115,169, 116,174, 125,172, 121,170, 119,170, 118,170, 117,170, 118,171, 120,171, 119,171, 121,173, 123,172, 122,172, 122,173, 123,174, 124,173, 124,174, 125,177, 130,175, 128,175, 126,174, 126,175, 127,176, 129,176, 128,176, 129,178, 132,177, 131,177, 130,177, 131,178, 133,178, 132,179, 133,189, 151,184, 143,181, 138,180, 136,180, 135,179, 135,180, 136,181, 137,181, 137,181, 138,183, 140,182, 139,182, 139,182, 140,183, 142,183, 141,184, 142,186, 147,185, 145,184, 144,184, 143,185, 144,186, 146,185, 145,186, 146,188, 149,187, 148,187, 147,187, 149,188, 150,188, 150,188, 151,194, 160,191, 156,190, 153,189, 152,189, 152,190, 153,191, 154,190, 154,191, 155,192, 158,192, 157,191, 156,192, 157,193, 159,193, 158,193, 159,196, 164,195, 162,194, 161,194, 160,195, 161,195, 163,195, 163,196, 164,197, 166,197, 165,196, 165,197, 166,198, 167,198, 167,198, 168,
db 176, 136,168, 118,164, 109,162, 104,161, 102,160, 101,160, 100,160, 101,161, 103,161, 102,161, 103,163, 106,162, 105,162, 105,162, 106,163, 107,163, 107,163, 108,166, 113,165, 111,164, 110,164, 109,164, 110,165, 112,165, 111,165, 113,167, 115,166, 114,166, 114,166, 115,167, 117,167, 116,167, 117,172, 127,170, 122,169, 120,168, 119,168, 118,168, 119,169, 121,169, 121,169, 122,171, 125,170, 123,170, 123,170, 124,171, 126,171, 125,171, 126,174, 131,173, 129,172, 128,172, 127,172, 129,173, 130,173, 130,173, 131,175, 134,174, 133,174, 132,174, 133,175, 135,175, 134,175, 135,184, 154,180, 145,178, 141,177, 138,176, 137,176, 137,176, 138,177, 139,177, 139,177, 140,179, 143,178, 142,178, 141,178, 142,179, 144,179, 143,179, 145,182, 150,181, 147,180, 146,180, 146,180, 147,181, 149,181, 148,181, 149,183, 152,182, 151,182, 150,182, 151,183, 153,183, 153,183, 154,188, 163,186, 159,185, 157,184, 155,184, 155,184, 156,185, 158,185, 157,185, 158,187, 161,186, 160,186, 159,186, 161,187, 162,187, 162,187, 163,190, 168,189, 166,188, 165,188, 164,188, 165,189, 167,189, 166,189, 167,191, 170,190, 169,190, 169,190, 170,191, 171,191, 171,191, 172,
db 172, 138,166, 119,163, 109,161, 104,160, 102,160, 101,160, 100,160, 101,161, 103,160, 102,161, 104,162, 107,161, 105,161, 105,162, 106,162, 108,162, 107,162, 108,164, 114,163, 111,163, 110,163, 110,163, 111,164, 113,163, 112,164, 113,165, 116,164, 115,164, 114,165, 116,165, 117,165, 117,165, 118,169, 128,167, 123,166, 121,166, 120,166, 119,166, 120,167, 122,166, 121,167, 123,168, 126,167, 124,167, 124,168, 125,168, 127,168, 126,168, 127,170, 133,169, 130,169, 129,169, 129,169, 130,170, 132,169, 131,170, 132,171, 135,170, 134,170, 133,171, 135,171, 136,171, 136,171, 137,178, 157,175, 147,173, 142,172, 140,172, 139,172, 138,172, 139,173, 141,172, 140,173, 142,174, 145,173, 143,173, 143,174, 144,174, 146,174, 145,174, 146,176, 152,175, 149,175, 148,175, 148,175, 149,176, 151,175, 150,176, 151,177, 154,176, 153,176, 152,177, 154,177, 155,177, 155,177, 156,181, 166,179, 161,178, 159,178, 158,178, 157,178, 158,179, 160,178, 159,179, 161,180, 164,179, 162,179, 162,180, 163,180, 165,180, 164,180, 165,182, 171,181, 168,181, 167,181, 167,181, 168,182, 170,181, 169,182, 170,183, 173,182, 172,182, 171,183, 173,183, 174,183, 174,183, 175,
db 168, 139,164, 119,162, 109,161, 104,160, 102,160, 101,160, 100,160, 101,160, 103,160, 103,160, 104,161, 107,161, 106,161, 105,161, 106,161, 108,161, 107,161, 109,163, 114,162, 112,162, 110,162, 110,162, 111,162, 113,162, 112,162, 114,163, 117,163, 115,163, 115,163, 116,163, 118,163, 117,163, 118,166, 129,165, 124,164, 121,164, 120,164, 120,164, 121,164, 123,164, 122,164, 123,165, 126,165, 125,165, 124,165, 126,165, 128,165, 127,165, 128,167, 134,166, 131,166, 130,166, 129,166, 131,166, 132,166, 132,166, 133,167, 136,167, 135,167, 134,167, 135,167, 137,167, 137,167, 138,172, 158,170, 148,169, 143,168, 141,168, 140,168, 139,168, 140,168, 142,168, 142,168, 143,169, 146,169, 145,169, 144,169, 145,169, 147,169, 146,169, 148,171, 153,170, 151,170, 149,170, 149,170, 150,170, 152,170, 151,170, 153,171, 156,171, 154,171, 154,171, 155,171, 157,171, 156,171, 157,174, 168,173, 163,172, 160,172, 159,172, 159,172, 160,172, 162,172, 161,172, 162,173, 165,173, 164,173, 163,173, 165,173, 167,173, 166,173, 167,175, 173,174, 170,174, 169,174, 168,174, 170,174, 171,174, 171,174, 172,175, 175,175, 174,175, 173,175, 174,175, 176,175, 176,175, 177,
db 164, 139,162, 119,161, 109,160, 104,160, 102,160, 101,160, 100,160, 101,160, 103,160, 103,160, 104,160, 107,160, 106,160, 105,160, 106,160, 108,160, 108,160, 109,161, 114,161, 112,161, 111,161, 110,161, 111,161, 113,161, 112,161, 114,161, 117,161, 116,161, 115,161, 116,161, 118,161, 117,161, 119,163, 129,162, 124,162, 122,162, 120,162, 120,162, 121,162, 123,162, 122,162, 124,162, 127,162, 125,162, 125,162, 126,162, 128,162, 127,162, 129,163, 134,163, 132,163, 130,163, 130,163, 131,163, 133,163, 132,163, 133,163, 137,163, 135,163, 135,163, 136,163, 138,163, 137,163, 138,166, 159,165, 149,164, 144,164, 141,164, 140,164, 140,164, 141,164, 143,164, 142,164, 143,164, 146,164, 145,164, 145,164, 146,164, 148,164, 147,164, 148,165, 154,165, 151,165, 150,165, 149,165, 151,165, 153,165, 152,165, 153,165, 156,165, 155,165, 154,165, 156,165, 158,165, 157,165, 158,167, 169,166, 164,166, 161,166, 160,166, 159,166, 161,166, 162,166, 162,166, 163,166, 166,166, 165,166, 164,166, 166,166, 167,166, 167,166, 168,167, 174,167, 171,167, 170,167, 169,167, 170,167, 172,167, 172,167, 173,167, 176,167, 175,167, 174,167, 175,167, 177,167, 177,167, 178,
db 160, 139,160, 119,160, 109,160, 104,160, 102,160, 101,160, 100,160, 101,160, 103,160, 103,160, 104,160, 107,160, 106,160, 105,160, 106,160, 108,160, 108,160, 109,160, 114,160, 112,160, 111,160, 110,160, 111,160, 113,160, 112,160, 114,160, 117,160, 116,160, 115,160, 116,160, 118,160, 117,160, 119,160, 129,160, 124,160, 122,160, 120,160, 120,160, 121,160, 123,160, 122,160, 124,160, 127,160, 125,160, 125,160, 126,160, 128,160, 127,160, 129,160, 134,160, 132,160, 130,160, 130,160, 131,160, 133,160, 132,160, 133,160, 137,160, 135,160, 135,160, 136,160, 138,160, 137,160, 138,160, 159,160, 149,160, 144,160, 141,160, 140,160, 140,160, 141,160, 143,160, 142,160, 143,160, 146,160, 145,160, 145,160, 146,160, 148,160, 147,160, 148,160, 154,160, 151,160, 150,160, 149,160, 151,160, 153,160, 152,160, 153,160, 156,160, 155,160, 154,160, 156,160, 158,160, 157,160, 158,160, 169,160, 164,160, 161,160, 160,160, 159,160, 161,160, 162,160, 162,160, 163,160, 166,160, 165,160, 164,160, 166,160, 167,160, 167,160, 168,160, 174,160, 171,160, 170,160, 169,160, 170,160, 172,160, 172,160, 173,160, 176,160, 175,160, 174,160, 175,160, 177,160, 177,160, 178,
db 155, 139,157, 119,158, 109,159, 104,159, 102,159, 101,159, 100,159, 101,159, 103,159, 103,159, 104,159, 107,159, 106,159, 105,159, 106,159, 108,159, 108,158, 109,158, 114,158, 112,158, 111,158, 110,158, 111,158, 113,158, 112,158, 114,158, 117,158, 116,158, 115,158, 116,157, 118,157, 117,157, 119,156, 129,157, 124,157, 122,157, 120,157, 120,157, 121,157, 123,157, 122,157, 124,156, 127,157, 125,157, 125,156, 126,156, 128,156, 127,156, 129,156, 134,156, 132,156, 130,156, 130,156, 131,156, 133,156, 132,156, 133,155, 137,155, 135,155, 135,155, 136,155, 138,155, 137,155, 138,153, 159,154, 149,154, 144,155, 141,155, 140,155, 140,155, 141,155, 143,155, 142,155, 143,154, 146,154, 145,154, 145,154, 146,154, 148,154, 147,154, 148,153, 154,154, 151,154, 150,154, 149,154, 151,153, 153,154, 152,153, 153,153, 156,153, 155,153, 154,153, 156,153, 158,153, 157,153, 158,152, 169,152, 164,152, 161,153, 160,153, 159,153, 161,152, 162,152, 162,152, 163,152, 166,152, 165,152, 164,152, 166,152, 167,152, 167,152, 168,151, 174,151, 171,151, 170,152, 169,151, 170,151, 172,151, 172,151, 173,151, 176,151, 175,151, 174,151, 175,151, 177,151, 177,151, 178,
db 151, 139,155, 119,157, 109,158, 104,159, 102,159, 101,159, 100,159, 101,159, 103,159, 103,159, 104,158, 107,158, 106,158, 105,158, 106,158, 108,158, 107,158, 109,156, 114,157, 112,157, 110,157, 110,157, 111,157, 113,157, 112,156, 114,156, 117,156, 115,156, 115,156, 116,156, 118,156, 117,155, 118,153, 129,154, 124,155, 121,155, 120,155, 120,155, 121,154, 123,155, 122,154, 123,154, 126,154, 125,154, 124,154, 126,153, 128,154, 127,153, 128,152, 134,153, 131,153, 130,153, 129,153, 131,152, 132,152, 132,152, 133,152, 136,152, 135,152, 134,152, 135,151, 137,151, 137,151, 138,147, 158,149, 148,150, 143,150, 141,151, 140,151, 139,151, 140,150, 142,150, 142,150, 143,149, 146,150, 145,150, 144,150, 145,149, 147,149, 146,149, 148,148, 153,148, 151,149, 149,149, 149,148, 150,148, 152,148, 151,148, 153,147, 156,148, 154,148, 154,147, 155,147, 157,147, 156,147, 157,145, 168,146, 163,146, 160,146, 159,147, 159,146, 160,146, 162,146, 161,146, 162,145, 165,145, 164,146, 163,145, 165,145, 167,145, 166,145, 167,144, 173,144, 170,144, 169,144, 168,144, 170,144, 171,144, 171,144, 172,143, 175,143, 174,143, 173,143, 174,143, 176,143, 176,143, 177,
db 147, 138,153, 119,156, 109,158, 104,159, 102,159, 101,159, 100,159, 101,158, 103,159, 102,158, 104,157, 107,158, 105,158, 105,157, 106,157, 108,157, 107,157, 108,155, 114,156, 111,156, 110,156, 110,156, 111,155, 113,155, 112,155, 113,154, 116,154, 115,155, 114,154, 116,154, 117,154, 117,153, 118,150, 128,152, 123,152, 121,153, 120,153, 119,153, 120,152, 122,152, 121,152, 123,151, 126,151, 124,151, 124,151, 125,151, 127,151, 126,150, 127,149, 133,149, 130,150, 129,150, 129,150, 130,149, 132,149, 131,149, 132,148, 135,148, 134,148, 133,148, 135,147, 136,148, 136,147, 137,141, 157,144, 147,145, 142,146, 140,147, 139,147, 138,146, 139,146, 141,146, 140,146, 142,145, 145,145, 143,145, 143,145, 144,144, 146,144, 145,144, 146,142, 152,143, 149,143, 148,144, 148,143, 149,143, 151,143, 150,143, 151,142, 154,142, 153,142, 152,142, 154,141, 155,141, 155,141, 156,138, 166,139, 161,140, 159,140, 158,141, 157,140, 158,140, 160,140, 159,139, 161,138, 164,139, 162,139, 162,139, 163,138, 165,138, 164,138, 165,136, 171,137, 168,137, 167,137, 167,137, 168,136, 170,137, 169,136, 170,135, 173,136, 172,136, 171,135, 173,135, 174,135, 174,135, 175,
db 143, 136,151, 118,155, 109,157, 104,158, 102,159, 101,159, 100,159, 101,158, 103,158, 102,158, 103,156, 106,157, 105,157, 105,157, 106,156, 107,156, 107,156, 108,153, 113,154, 111,155, 110,155, 109,155, 110,154, 112,154, 111,154, 113,152, 115,153, 114,153, 114,153, 115,152, 117,152, 116,152, 117,147, 127,149, 122,150, 120,151, 119,151, 118,150, 119,150, 121,150, 121,149, 122,148, 125,149, 123,149, 123,148, 124,148, 126,148, 125,147, 126,145, 131,146, 129,147, 128,147, 127,146, 129,146, 130,146, 130,145, 131,144, 134,145, 133,145, 132,144, 133,144, 135,144, 134,143, 135,135, 154,139, 145,141, 141,142, 138,142, 137,143, 137,142, 138,141, 139,142, 139,141, 140,140, 143,140, 142,141, 141,140, 142,139, 144,140, 143,139, 145,137, 150,138, 147,138, 146,139, 146,138, 147,137, 149,138, 148,137, 149,136, 152,136, 151,137, 150,136, 151,135, 153,136, 153,135, 154,131, 163,133, 159,134, 157,134, 155,134, 155,134, 156,133, 158,133, 157,133, 158,132, 161,132, 160,132, 159,132, 161,131, 162,131, 162,131, 163,129, 168,130, 166,130, 165,130, 164,130, 165,129, 167,129, 166,129, 167,128, 170,128, 169,128, 169,128, 170,127, 171,127, 171,127, 172,
db 139, 134,149, 117,154, 108,157, 104,158, 102,159, 101,159, 100,159, 101,158, 103,158, 102,157, 103,156, 106,156, 105,157, 104,156, 105,155, 107,155, 107,155, 108,152, 112,153, 110,154, 109,154, 109,153, 110,152, 111,153, 111,152, 112,151, 115,151, 114,151, 113,151, 114,150, 116,150, 115,150, 116,144, 125,147, 121,148, 119,149, 118,149, 117,148, 118,147, 120,148, 119,147, 121,145, 123,146, 122,146, 122,146, 123,145, 124,145, 124,144, 125,142, 130,143, 128,143, 126,144, 126,143, 127,142, 129,143, 128,142, 129,140, 132,141, 131,141, 130,141, 131,140, 133,140, 132,139, 133,129, 151,134, 143,136, 138,138, 136,138, 135,139, 135,138, 136,137, 137,137, 137,137, 138,135, 140,136, 139,136, 139,135, 140,135, 142,135, 141,134, 142,131, 147,133, 145,133, 144,134, 143,133, 144,132, 146,132, 145,132, 146,130, 149,131, 148,131, 147,130, 149,129, 150,130, 150,129, 151,124, 160,126, 156,127, 153,128, 152,128, 152,128, 153,127, 154,127, 154,127, 155,125, 158,126, 157,126, 156,125, 157,124, 159,125, 158,124, 159,121, 164,122, 162,123, 161,123, 160,123, 161,122, 163,122, 163,121, 164,120, 166,120, 165,121, 165,120, 166,119, 167,119, 167,119, 168,
db 136, 132,148, 116,154, 108,157, 104,158, 102,159, 101,159, 100,158, 101,157, 103,158, 102,157, 103,155, 106,156, 105,156, 104,155, 105,154, 107,155, 106,154, 107,151, 112,152, 110,153, 109,153, 108,152, 109,151, 111,152, 110,151, 111,149, 114,150, 113,150, 112,149, 113,148, 115,149, 114,148, 115,142, 124,145, 120,146, 118,147, 117,147, 116,146, 117,145, 119,146, 118,145, 119,143, 122,144, 121,144, 120,143, 121,142, 123,143, 122,142, 123,139, 128,140, 126,141, 125,141, 124,140, 125,139, 127,140, 126,139, 127,137, 130,138, 129,138, 128,137, 129,136, 131,137, 130,136, 131,124, 148,130, 140,133, 136,134, 134,135, 133,135, 132,134, 133,133, 135,134, 134,133, 135,131, 138,132, 137,132, 136,131, 137,130, 139,131, 138,130, 139,127, 144,128, 142,129, 141,129, 140,128, 141,127, 143,128, 142,127, 143,125, 146,126, 145,126, 144,125, 145,124, 147,125, 146,124, 147,118, 156,121, 152,122, 150,123, 149,123, 148,122, 149,121, 151,122, 150,121, 151,119, 154,120, 153,120, 152,119, 153,118, 155,119, 154,118, 155,115, 160,116, 158,117, 157,117, 156,116, 157,115, 159,116, 158,115, 159,113, 162,114, 161,114, 160,113, 161,112, 163,113, 162,112, 163,
db 133, 129,146, 114,153, 107,156, 103,158, 101,159, 100,159, 100,158, 101,157, 102,157, 102,157, 103,154, 105,155, 104,156, 104,155, 105,154, 106,154, 105,153, 106,149, 111,151, 109,152, 108,152, 107,151, 108,150, 110,151, 109,150, 110,148, 112,149, 111,149, 111,148, 112,147, 113,147, 113,146, 114,139, 122,143, 118,144, 116,145, 115,146, 115,145, 116,143, 117,144, 117,143, 117,141, 120,142, 119,142, 118,141, 119,140, 121,141, 120,140, 121,136, 125,138, 123,138, 123,139, 122,138, 123,137, 124,137, 124,136, 125,134, 127,135, 126,135, 126,135, 127,133, 128,134, 128,133, 129,119, 144,126, 136,129, 133,131, 131,132, 130,132, 129,131, 130,130, 132,130, 131,130, 132,127, 135,128, 134,129, 133,128, 134,127, 135,127, 135,126, 136,122, 140,124, 138,125, 137,125, 137,124, 138,123, 139,124, 139,123, 140,121, 142,122, 141,122, 141,121, 141,120, 143,120, 142,119, 143,112, 151,116, 147,117, 146,118, 145,119, 144,118, 145,116, 147,117, 146,116, 147,114, 149,115, 148,115, 148,114, 149,113, 150,114, 150,113, 151,109, 155,111, 153,111, 152,112, 152,111, 153,110, 154,110, 153,109, 154,107, 157,108, 156,108, 155,108, 156,106, 158,107, 157,106, 158,
db 130, 126,145, 113,152, 106,156, 103,158, 101,159, 100,159, 100,158, 101,157, 102,157, 102,156, 102,154, 104,155, 104,155, 103,154, 104,153, 105,153, 105,152, 106,148, 109,150, 108,151, 107,152, 107,151, 107,149, 109,150, 108,149, 109,146, 111,147, 110,148, 110,147, 111,145, 112,146, 112,145, 112,137, 119,141, 116,143, 114,144, 114,144, 113,143, 114,142, 115,142, 115,141, 116,139, 118,140, 117,140, 116,139, 117,138, 119,138, 118,137, 119,133, 123,135, 121,136, 120,137, 120,136, 121,134, 122,135, 121,134, 122,131, 124,132, 124,133, 123,132, 124,130, 125,131, 125,130, 126,115, 139,122, 133,126, 129,128, 128,129, 127,129, 126,128, 127,127, 128,127, 128,126, 129,124, 131,125, 130,125, 130,124, 131,123, 132,123, 131,122, 132,118, 136,120, 134,121, 133,122, 133,121, 134,119, 135,120, 135,119, 136,116, 138,117, 137,118, 136,117, 137,115, 138,116, 138,115, 139,107, 146,111, 143,113, 141,114, 140,114, 140,113, 140,112, 142,112, 141,111, 142,109, 144,110, 143,110, 143,109, 144,108, 145,108, 145,107, 145,103, 149,105, 148,106, 147,107, 146,106, 147,104, 148,105, 148,104, 149,101, 151,102, 150,103, 150,102, 150,100, 152,101, 151,100, 152,
db 127, 123,143, 111,151, 105,155, 102,157, 101,158, 100,159, 100,158, 101,156, 102,157, 101,156, 102,153, 104,154, 103,155, 103,154, 104,152, 105,153, 104,152, 105,147, 108,149, 107,150, 106,151, 106,150, 106,148, 108,149, 107,148, 108,145, 110,146, 109,147, 109,146, 109,144, 111,145, 110,144, 111,135, 117,139, 114,141, 113,142, 112,143, 112,142, 112,140, 113,141, 113,140, 114,137, 116,138, 115,139, 115,138, 115,136, 116,137, 116,136, 117,131, 120,133, 119,134, 118,135, 117,134, 118,132, 119,133, 119,132, 120,129, 122,130, 121,131, 120,130, 121,128, 122,129, 122,128, 123,111, 135,119, 129,123, 126,125, 124,126, 124,126, 123,125, 124,124, 125,124, 125,123, 126,121, 127,122, 127,122, 126,121, 127,120, 128,120, 128,119, 129,115, 132,117, 130,118, 130,118, 129,117, 130,116, 131,116, 131,115, 131,113, 133,114, 133,114, 132,113, 133,112, 134,112, 134,111, 134,103, 141,107, 138,109, 136,110, 135,110, 135,109, 136,108, 137,108, 137,107, 137,105, 139,106, 138,106, 138,105, 139,104, 140,104, 140,103, 140,99, 144,101, 142,102, 141,102, 141,101, 142,100, 143,100, 142,99, 143,97, 145,98, 144,98, 144,97, 145,96, 146,96, 145,95, 146,
db 125, 120,142, 110,151, 105,155, 102,157, 101,158, 100,159, 100,158, 100,156, 101,157, 101,156, 102,153, 103,154, 103,155, 102,153, 103,152, 104,152, 104,151, 104,146, 107,149, 106,150, 105,150, 105,149, 105,147, 106,148, 106,147, 107,144, 108,145, 108,146, 107,145, 108,143, 109,144, 109,143, 109,133, 115,138, 112,140, 111,141, 110,141, 110,140, 110,139, 111,139, 111,138, 112,135, 113,137, 113,137, 112,136, 113,134, 114,135, 114,134, 114,129, 117,131, 116,132, 115,133, 115,132, 115,130, 116,131, 116,129, 117,127, 118,128, 118,128, 117,127, 118,126, 119,126, 119,125, 119,107, 130,116, 125,120, 122,122, 121,123, 120,124, 120,123, 120,121, 121,122, 121,121, 122,118, 123,119, 123,120, 122,118, 123,117, 124,117, 124,116, 124,111, 127,114, 126,115, 125,115, 125,114, 125,112, 126,113, 126,112, 127,109, 128,110, 128,111, 127,110, 128,108, 129,109, 129,108, 129,98, 135,103, 132,105, 131,106, 130,106, 130,105, 130,104, 131,104, 131,103, 132,100, 133,102, 133,102, 132,101, 133,99, 134,100, 134,99, 134,94, 137,96, 136,97, 135,98, 135,97, 135,95, 136,96, 136,94, 137,92, 138,93, 138,93, 137,92, 138,91, 139,91, 139,90, 139,
db 123, 116,141, 108,150, 104,155, 102,157, 101,158, 100,159, 100,158, 100,156, 101,157, 101,155, 101,153, 103,154, 102,154, 102,153, 102,151, 103,152, 103,151, 103,146, 106,148, 105,149, 104,150, 104,149, 104,147, 105,147, 105,146, 105,143, 107,144, 106,145, 106,144, 106,142, 107,143, 107,142, 107,132, 112,136, 110,139, 109,140, 108,140, 108,139, 108,138, 109,138, 109,137, 109,134, 111,135, 110,136, 110,135, 110,133, 111,133, 111,132, 111,127, 114,129, 113,131, 112,131, 112,130, 112,128, 113,129, 113,128, 113,125, 115,126, 114,127, 114,125, 114,124, 115,124, 115,123, 115,104, 124,113, 120,118, 118,120, 117,121, 116,122, 116,121, 116,119, 117,120, 117,118, 117,116, 119,117, 118,117, 118,116, 118,114, 119,115, 119,114, 119,109, 122,111, 121,112, 120,113, 120,112, 120,110, 121,110, 121,109, 121,106, 123,107, 122,108, 122,107, 122,105, 123,106, 123,105, 123,95, 128,99, 126,102, 125,103, 124,103, 124,102, 124,101, 125,101, 125,100, 125,97, 127,98, 126,99, 126,98, 126,96, 127,96, 127,95, 127,90, 130,92, 129,94, 128,94, 128,93, 128,91, 129,92, 129,91, 129,88, 131,89, 130,90, 130,88, 130,87, 131,87, 131,86, 131,
db 121, 112,140, 106,150, 103,155, 101,157, 100,158, 100,159, 100,158, 100,156, 101,156, 100,155, 101,152, 102,153, 101,154, 101,153, 102,151, 102,152, 102,150, 102,145, 104,147, 103,149, 103,149, 103,148, 103,146, 104,147, 103,146, 104,143, 105,144, 104,144, 104,143, 105,141, 105,142, 105,141, 105,131, 109,135, 107,138, 106,139, 106,140, 106,138, 106,137, 107,137, 106,136, 107,133, 108,134, 107,135, 107,134, 108,132, 108,132, 108,131, 108,126, 110,128, 109,129, 109,130, 109,129, 109,127, 110,128, 109,126, 110,123, 111,125, 110,125, 110,124, 111,122, 111,123, 111,122, 111,102, 118,111, 115,116, 113,119, 112,120, 112,120, 112,119, 112,117, 113,118, 112,117, 113,114, 114,115, 113,116, 113,114, 114,113, 114,113, 114,112, 114,107, 116,109, 115,110, 115,111, 115,110, 115,108, 116,108, 115,107, 116,104, 117,105, 116,106, 116,105, 117,103, 117,104, 117,102, 117,92, 121,97, 119,99, 118,101, 118,101, 118,100, 118,98, 119,99, 118,98, 119,95, 120,96, 119,96, 119,95, 120,93, 120,94, 120,93, 120,87, 122,90, 121,91, 121,92, 121,90, 121,89, 122,89, 121,88, 122,85, 123,86, 122,87, 122,86, 123,84, 123,84, 123,83, 123,
db 120, 108,140, 104,150, 102,155, 101,157, 100,158, 100,159, 100,158, 100,156, 100,156, 100,155, 100,152, 101,153, 101,154, 101,153, 101,151, 101,151, 101,150, 101,145, 103,147, 102,148, 102,149, 102,148, 102,146, 102,147, 102,145, 102,142, 103,143, 103,144, 103,143, 103,141, 103,142, 103,140, 103,130, 106,135, 105,137, 104,139, 104,139, 104,138, 104,136, 104,137, 104,135, 104,132, 105,134, 105,134, 105,133, 105,131, 105,132, 105,130, 105,125, 107,127, 106,129, 106,129, 106,128, 106,126, 106,127, 106,126, 106,122, 107,124, 107,124, 107,123, 107,121, 107,122, 107,121, 107,100, 112,110, 110,115, 109,118, 108,119, 108,119, 108,118, 108,116, 108,117, 108,116, 108,113, 109,114, 109,114, 109,113, 109,111, 109,112, 109,111, 109,105, 111,108, 110,109, 110,110, 110,108, 110,106, 110,107, 110,106, 110,103, 111,104, 111,105, 111,103, 111,101, 111,102, 111,101, 111,90, 114,95, 113,98, 112,99, 112,100, 112,98, 112,97, 112,97, 112,96, 112,93, 113,94, 113,95, 113,93, 113,92, 113,92, 113,91, 113,85, 115,88, 114,89, 114,90, 114,89, 114,87, 114,87, 114,86, 114,83, 115,84, 115,85, 115,84, 115,82, 115,82, 115,81, 115,
db 120, 104,140, 102,150, 101,155, 100,157, 100,158, 100,159, 100,158, 100,156, 100,156, 100,155, 100,152, 100,153, 100,154, 100,153, 100,151, 100,151, 100,150, 100,145, 101,147, 101,148, 101,149, 101,148, 101,146, 101,146, 101,145, 101,142, 101,143, 101,144, 101,143, 101,141, 101,141, 101,140, 101,130, 103,135, 102,137, 102,138, 102,139, 102,138, 102,136, 102,136, 102,135, 102,132, 102,133, 102,134, 102,133, 102,131, 102,131, 102,130, 102,125, 103,127, 103,128, 103,129, 103,128, 103,126, 103,126, 103,125, 103,122, 103,123, 103,124, 103,123, 103,121, 103,121, 103,120, 103,100, 106,110, 105,115, 104,117, 104,118, 104,119, 104,118, 104,116, 104,116, 104,115, 104,112, 104,113, 104,114, 104,113, 104,111, 104,111, 104,110, 104,105, 105,107, 105,108, 105,109, 105,108, 105,106, 105,106, 105,105, 105,102, 105,103, 105,104, 105,103, 105,101, 105,101, 105,100, 105,90, 107,95, 106,97, 106,98, 106,99, 106,98, 106,96, 106,96, 106,95, 106,92, 106,93, 106,94, 106,93, 106,91, 106,91, 106,90, 106,85, 107,87, 107,88, 107,89, 107,88, 107,86, 107,86, 107,85, 107,82, 107,83, 107,84, 107,83, 107,81, 107,81, 107,80, 107,
db 120, 100,140, 100,150, 100,155, 100,157, 100,158, 100,159, 100,158, 100,156, 100,156, 100,155, 100,152, 100,153, 100,154, 100,153, 100,151, 100,151, 100,150, 100,145, 100,147, 100,148, 100,149, 100,148, 100,146, 100,146, 100,145, 100,142, 100,143, 100,144, 100,143, 100,141, 100,141, 100,140, 100,130, 100,135, 100,137, 100,138, 100,139, 100,138, 100,136, 100,136, 100,135, 100,132, 100,133, 100,134, 100,133, 100,131, 100,131, 100,130, 100,125, 100,127, 100,128, 100,129, 100,128, 100,126, 100,126, 100,125, 100,122, 100,123, 100,124, 100,123, 100,121, 100,121, 100,120, 100,100, 100,110, 100,115, 100,117, 100,118, 100,119, 100,118, 100,116, 100,116, 100,115, 100,112, 100,113, 100,114, 100,113, 100,111, 100,111, 100,110, 100,105, 100,107, 100,108, 100,109, 100,108, 100,106, 100,106, 100,105, 100,102, 100,103, 100,104, 100,103, 100,101, 100,101, 100,100, 100,90, 100,95, 100,97, 100,98, 100,99, 100,98, 100,96, 100,96, 100,95, 100,92, 100,93, 100,94, 100,93, 100,91, 100,91, 100,90, 100,85, 100,87, 100,88, 100,89, 100,88, 100,86, 100,86, 100,85, 100,82, 100,83, 100,84, 100,83, 100,81, 100,81, 100,80, 100,
db 120, 95,140, 97,150, 98,155, 99,157, 99,158, 99,159, 99,158, 99,156, 99,156, 99,155, 99,152, 99,153, 99,154, 99,153, 99,151, 99,151, 99,150, 98,145, 98,147, 98,148, 98,149, 98,148, 98,146, 98,146, 98,145, 98,142, 98,143, 98,144, 98,143, 98,141, 97,141, 97,140, 97,130, 96,135, 97,137, 97,138, 97,139, 97,138, 97,136, 97,136, 97,135, 97,132, 96,133, 97,134, 97,133, 96,131, 96,131, 96,130, 96,125, 96,127, 96,128, 96,129, 96,128, 96,126, 96,126, 96,125, 96,122, 95,123, 95,124, 95,123, 95,121, 95,121, 95,120, 95,100, 93,110, 94,115, 94,117, 95,118, 95,119, 95,118, 95,116, 95,116, 95,115, 95,112, 94,113, 94,114, 94,113, 94,111, 94,111, 94,110, 94,105, 93,107, 94,108, 94,109, 94,108, 94,106, 93,106, 94,105, 93,102, 93,103, 93,104, 93,103, 93,101, 93,101, 93,100, 93,90, 92,95, 92,97, 92,98, 93,99, 93,98, 93,96, 92,96, 92,95, 92,92, 92,93, 92,94, 92,93, 92,91, 92,91, 92,90, 92,85, 91,87, 91,88, 91,89, 92,88, 91,86, 91,86, 91,85, 91,82, 91,83, 91,84, 91,83, 91,81, 91,81, 91,80, 91,
db 120, 91,140, 95,150, 97,155, 98,157, 99,158, 99,159, 99,158, 99,156, 99,156, 99,155, 99,152, 98,153, 98,154, 98,153, 98,151, 98,151, 98,150, 98,145, 96,147, 97,148, 97,149, 97,148, 97,146, 97,147, 97,145, 96,142, 96,143, 96,144, 96,143, 96,141, 96,142, 96,140, 95,130, 93,135, 94,137, 95,139, 95,139, 95,138, 95,136, 94,137, 95,135, 94,132, 94,134, 94,134, 94,133, 94,131, 93,132, 94,130, 93,125, 92,127, 93,129, 93,129, 93,128, 93,126, 92,127, 92,126, 92,122, 92,124, 92,124, 92,123, 92,121, 91,122, 91,121, 91,100, 87,110, 89,115, 90,118, 90,119, 91,119, 91,118, 91,116, 90,117, 90,116, 90,113, 89,114, 90,114, 90,113, 90,111, 89,112, 89,111, 89,105, 88,108, 88,109, 89,110, 89,108, 88,106, 88,107, 88,106, 88,103, 87,104, 88,105, 88,103, 87,101, 87,102, 87,101, 87,90, 85,95, 86,98, 86,99, 86,100, 87,98, 86,97, 86,97, 86,96, 86,93, 85,94, 85,95, 86,93, 85,92, 85,92, 85,91, 85,85, 84,88, 84,89, 84,90, 84,89, 84,87, 84,87, 84,86, 84,83, 83,84, 83,85, 83,84, 83,82, 83,82, 83,81, 83,
db 121, 87,140, 93,150, 96,155, 98,157, 99,158, 99,159, 99,158, 99,156, 98,156, 99,155, 98,152, 97,153, 98,154, 98,153, 97,151, 97,152, 97,150, 97,145, 95,147, 96,149, 96,149, 96,148, 96,146, 95,147, 95,146, 95,143, 94,144, 94,144, 95,143, 94,141, 94,142, 94,141, 93,131, 90,135, 92,138, 92,139, 93,140, 93,138, 93,137, 92,137, 92,136, 92,133, 91,134, 91,135, 91,134, 91,132, 91,132, 91,131, 90,126, 89,128, 89,129, 90,130, 90,129, 90,127, 89,128, 89,126, 89,123, 88,125, 88,125, 88,124, 88,122, 87,123, 88,122, 87,102, 81,111, 84,116, 85,119, 86,120, 87,120, 87,119, 86,117, 86,118, 86,117, 86,114, 85,115, 85,116, 85,114, 85,113, 84,113, 84,112, 84,107, 82,109, 83,110, 83,111, 84,110, 83,108, 83,108, 83,107, 83,104, 82,105, 82,106, 82,105, 82,103, 81,104, 81,102, 81,92, 78,97, 79,99, 80,101, 80,101, 81,100, 80,98, 80,99, 80,98, 79,95, 78,96, 79,96, 79,95, 79,93, 78,94, 78,93, 78,87, 76,90, 77,91, 77,92, 77,90, 77,89, 76,89, 77,88, 76,85, 75,86, 76,87, 76,86, 75,84, 75,84, 75,83, 75,
db 123, 83,141, 91,150, 95,155, 97,157, 98,158, 99,159, 99,158, 99,156, 98,157, 98,155, 98,153, 96,154, 97,154, 97,153, 97,151, 96,152, 96,151, 96,146, 93,148, 94,149, 95,150, 95,149, 95,147, 94,147, 94,146, 94,143, 92,144, 93,145, 93,144, 93,142, 92,143, 92,142, 92,132, 87,136, 89,139, 90,140, 91,140, 91,139, 90,138, 90,138, 90,137, 89,134, 88,135, 89,136, 89,135, 88,133, 88,133, 88,132, 87,127, 85,129, 86,131, 87,131, 87,130, 86,128, 86,129, 86,128, 85,125, 84,126, 85,127, 85,125, 84,124, 84,124, 84,123, 83,104, 75,113, 79,118, 81,120, 82,121, 82,122, 83,121, 82,119, 81,120, 82,118, 81,116, 80,117, 80,117, 81,116, 80,114, 79,115, 80,114, 79,109, 77,111, 78,112, 78,113, 79,112, 78,110, 77,110, 78,109, 77,106, 76,107, 76,108, 77,107, 76,105, 75,106, 76,105, 75,95, 71,99, 73,102, 74,103, 74,103, 74,102, 74,101, 73,101, 73,100, 73,97, 72,98, 72,99, 72,98, 72,96, 71,96, 71,95, 71,90, 69,92, 70,94, 70,94, 70,93, 70,91, 69,92, 69,91, 69,88, 68,89, 68,90, 68,88, 68,87, 67,87, 67,86, 67,
db 125, 80,142, 90,151, 95,155, 97,157, 98,158, 99,159, 99,158, 99,156, 98,157, 98,156, 97,153, 96,154, 96,155, 97,153, 96,152, 95,152, 95,151, 95,146, 92,149, 93,150, 94,150, 94,149, 94,147, 93,148, 93,147, 92,144, 91,145, 91,146, 92,145, 91,143, 90,144, 90,143, 90,133, 85,138, 87,140, 88,141, 89,141, 89,140, 89,139, 88,139, 88,138, 87,135, 86,137, 86,137, 87,136, 86,134, 85,135, 85,134, 85,129, 82,131, 83,132, 84,133, 84,132, 84,130, 83,131, 83,129, 82,127, 81,128, 81,128, 82,127, 81,126, 80,126, 80,125, 80,107, 70,116, 75,120, 77,122, 78,123, 79,124, 79,123, 79,121, 78,122, 78,121, 77,118, 76,119, 76,120, 77,118, 76,117, 75,117, 75,116, 75,111, 72,114, 73,115, 74,115, 74,114, 74,112, 73,113, 73,112, 72,109, 71,110, 71,111, 72,110, 71,108, 70,109, 70,108, 70,98, 65,103, 67,105, 68,106, 69,106, 69,105, 69,104, 68,104, 68,103, 67,100, 66,102, 66,102, 67,101, 66,99, 65,100, 65,99, 65,94, 62,96, 63,97, 64,98, 64,97, 64,95, 63,96, 63,94, 62,92, 61,93, 61,93, 62,92, 61,91, 60,91, 60,90, 60,
db 127, 76,143, 88,151, 94,155, 97,157, 98,158, 99,159, 99,158, 98,156, 97,157, 98,156, 97,153, 95,154, 96,155, 96,154, 95,152, 94,153, 95,152, 94,147, 91,149, 92,150, 93,151, 93,150, 92,148, 91,149, 92,148, 91,145, 89,146, 90,147, 90,146, 89,144, 88,145, 89,144, 88,135, 82,139, 85,141, 86,142, 87,143, 87,142, 86,140, 85,141, 86,140, 85,137, 83,138, 84,139, 84,138, 83,136, 82,137, 83,136, 82,131, 79,133, 80,134, 81,135, 81,134, 80,132, 79,133, 80,132, 79,129, 77,130, 78,131, 78,130, 77,128, 76,129, 77,128, 76,111, 64,119, 70,123, 73,125, 74,126, 75,126, 75,125, 74,124, 73,124, 74,123, 73,121, 71,122, 72,122, 72,121, 71,120, 70,120, 71,119, 70,115, 67,117, 68,118, 69,118, 69,117, 68,116, 67,116, 68,115, 67,113, 65,114, 66,114, 66,113, 65,112, 64,112, 65,111, 64,103, 58,107, 61,109, 62,110, 63,110, 63,109, 62,108, 61,108, 62,107, 61,105, 59,106, 60,106, 60,105, 59,104, 58,104, 59,103, 58,99, 55,101, 56,102, 57,102, 57,101, 56,100, 55,100, 56,99, 55,97, 53,98, 54,98, 54,97, 53,96, 52,96, 53,95, 52,
db 130, 73,145, 86,152, 93,156, 96,158, 98,159, 99,159, 99,158, 98,157, 97,157, 97,156, 97,154, 94,155, 95,155, 96,154, 95,153, 94,153, 94,152, 93,148, 89,150, 91,151, 92,152, 92,151, 91,149, 90,150, 91,149, 90,146, 88,147, 89,148, 89,147, 88,145, 87,146, 87,145, 86,137, 79,141, 83,143, 84,144, 85,144, 86,143, 85,142, 83,142, 84,141, 83,139, 81,140, 82,140, 82,139, 81,138, 80,138, 81,137, 80,133, 76,135, 78,136, 78,137, 79,136, 78,134, 77,135, 77,134, 76,131, 74,132, 75,133, 75,132, 75,130, 73,131, 74,130, 73,115, 59,122, 66,126, 69,128, 71,129, 72,129, 72,128, 71,127, 70,127, 70,126, 70,124, 67,125, 68,125, 69,124, 68,123, 67,123, 67,122, 66,118, 62,120, 64,121, 65,122, 65,121, 64,119, 63,120, 64,119, 63,116, 61,117, 62,118, 62,117, 61,115, 60,116, 60,115, 59,107, 52,111, 56,113, 57,114, 58,114, 59,113, 58,112, 56,112, 57,111, 56,109, 54,110, 55,110, 55,109, 54,108, 53,108, 54,107, 53,103, 49,105, 51,106, 51,107, 52,106, 51,104, 50,105, 50,104, 49,101, 47,102, 48,103, 48,102, 48,100, 46,101, 47,100, 46,
db 133, 70,146, 85,153, 92,156, 96,158, 98,159, 99,159, 99,158, 98,157, 97,157, 97,157, 96,154, 94,155, 95,156, 95,155, 94,154, 93,154, 93,153, 92,149, 88,151, 90,152, 91,152, 92,151, 91,150, 89,151, 90,150, 89,148, 86,149, 87,149, 88,148, 87,147, 85,147, 86,146, 85,139, 77,143, 81,144, 83,145, 84,146, 84,145, 83,143, 82,144, 82,143, 81,141, 79,142, 80,142, 80,141, 79,140, 78,141, 78,140, 77,136, 73,138, 75,138, 76,139, 77,138, 76,137, 74,137, 75,136, 74,134, 71,135, 72,135, 73,135, 72,133, 70,134, 71,133, 70,119, 55,126, 62,129, 66,131, 68,132, 69,132, 69,131, 68,130, 67,130, 67,130, 66,127, 64,128, 65,129, 65,128, 64,127, 63,127, 63,126, 62,122, 58,124, 60,125, 61,125, 62,124, 61,123, 59,124, 60,123, 59,121, 56,122, 57,122, 58,121, 57,120, 55,120, 56,119, 55,112, 47,116, 51,117, 53,118, 54,119, 54,118, 53,116, 52,117, 52,116, 51,114, 49,115, 50,115, 50,114, 49,113, 48,114, 48,113, 47,109, 43,111, 45,111, 46,112, 47,111, 46,110, 44,110, 45,109, 44,107, 41,108, 42,108, 43,108, 42,106, 40,107, 41,106, 40,
db 136, 67,148, 83,154, 91,157, 95,158, 97,159, 98,159, 99,158, 98,157, 96,158, 97,157, 96,155, 93,156, 94,156, 95,155, 94,154, 92,155, 93,154, 92,151, 87,152, 89,153, 90,153, 91,152, 90,151, 88,152, 89,151, 88,149, 85,150, 86,150, 87,149, 86,148, 84,149, 85,148, 84,142, 75,145, 79,146, 81,147, 82,147, 83,146, 82,145, 80,146, 81,145, 80,143, 77,144, 78,144, 79,143, 78,142, 76,143, 77,142, 76,139, 71,140, 73,141, 74,141, 75,140, 74,139, 72,140, 73,139, 72,137, 69,138, 70,138, 71,137, 70,136, 68,137, 69,136, 68,124, 51,130, 59,133, 63,134, 65,135, 66,135, 66,134, 65,133, 64,134, 64,133, 63,131, 61,132, 62,132, 62,131, 61,130, 60,131, 60,130, 59,127, 55,128, 57,129, 58,129, 58,128, 57,127, 56,128, 56,127, 55,125, 53,126, 54,126, 54,125, 53,124, 52,125, 52,124, 51,118, 43,121, 47,122, 49,123, 50,123, 50,122, 49,121, 48,122, 48,121, 47,119, 45,120, 46,120, 46,119, 45,118, 44,119, 44,118, 43,115, 39,116, 41,117, 42,117, 42,116, 41,115, 40,116, 40,115, 39,113, 37,114, 38,114, 38,113, 37,112, 36,113, 36,112, 35,
db 140, 65,150, 82,155, 91,157, 95,158, 97,159, 98,159, 99,159, 98,158, 96,158, 97,157, 96,156, 93,156, 94,157, 95,156, 93,155, 92,155, 92,155, 91,152, 86,153, 89,154, 90,154, 90,154, 89,153, 87,153, 88,152, 87,151, 84,151, 85,152, 86,151, 85,150, 83,150, 84,150, 83,145, 73,147, 78,148, 80,149, 81,149, 81,149, 80,148, 79,148, 79,147, 78,146, 75,146, 77,147, 77,146, 76,145, 74,145, 75,145, 74,142, 69,143, 71,144, 72,144, 73,144, 72,143, 70,143, 71,142, 69,141, 67,141, 68,142, 68,141, 67,140, 66,140, 66,140, 65,130, 47,135, 56,137, 60,138, 62,139, 63,139, 64,139, 63,138, 61,138, 62,137, 61,136, 58,136, 59,137, 60,136, 58,135, 57,135, 57,135, 56,132, 51,133, 54,134, 55,134, 55,134, 54,133, 52,133, 53,132, 52,131, 49,131, 50,132, 51,131, 50,130, 48,130, 49,130, 48,125, 38,127, 43,128, 45,129, 46,129, 46,129, 45,128, 44,128, 44,127, 43,126, 40,126, 42,127, 42,126, 41,125, 39,125, 40,125, 39,122, 34,123, 36,124, 37,124, 38,124, 37,123, 35,123, 36,122, 34,121, 32,121, 33,122, 33,121, 32,120, 31,120, 31,120, 30,
db 143, 63,151, 81,155, 90,157, 95,158, 97,159, 98,159, 99,159, 98,158, 96,158, 97,158, 95,156, 93,157, 94,157, 94,157, 93,156, 91,156, 92,156, 91,153, 86,154, 88,155, 89,155, 90,155, 89,154, 87,154, 87,154, 86,152, 83,153, 84,153, 85,153, 84,152, 82,152, 83,152, 82,147, 72,149, 76,150, 79,151, 80,151, 80,150, 79,150, 78,150, 78,149, 77,148, 74,149, 75,149, 76,148, 75,148, 73,148, 73,147, 72,145, 67,146, 69,147, 71,147, 71,146, 70,146, 68,146, 69,145, 68,144, 65,145, 66,145, 67,144, 65,144, 64,144, 64,143, 63,135, 44,139, 53,141, 58,142, 60,142, 61,143, 62,142, 61,141, 59,142, 60,141, 58,140, 56,140, 57,141, 57,140, 56,139, 54,140, 55,139, 54,137, 49,138, 51,138, 52,139, 53,138, 52,137, 50,138, 50,137, 49,136, 46,136, 47,137, 48,136, 47,135, 45,136, 46,135, 45,131, 35,133, 39,134, 42,134, 43,134, 43,134, 42,133, 41,133, 41,133, 40,132, 37,132, 38,132, 39,132, 38,131, 36,131, 36,131, 35,129, 30,130, 32,130, 34,130, 34,130, 33,129, 31,129, 32,129, 31,128, 28,128, 29,128, 30,128, 28,127, 27,127, 27,127, 26,
db 147, 61,153, 80,156, 90,158, 95,159, 97,159, 98,159, 99,159, 98,158, 96,159, 96,158, 95,157, 92,158, 93,158, 94,157, 93,157, 91,157, 92,157, 90,155, 85,156, 87,156, 89,156, 89,156, 88,155, 86,155, 87,155, 86,154, 83,154, 84,155, 84,154, 83,154, 81,154, 82,153, 81,150, 71,152, 75,152, 78,153, 79,153, 80,153, 78,152, 77,152, 77,152, 76,151, 73,151, 74,151, 75,151, 74,151, 72,151, 72,150, 71,149, 66,149, 68,150, 69,150, 70,150, 69,149, 67,149, 68,149, 66,148, 63,148, 65,148, 65,148, 64,147, 62,148, 63,147, 62,141, 42,144, 51,145, 56,146, 59,147, 60,147, 60,146, 59,146, 57,146, 58,146, 57,145, 54,145, 55,145, 56,145, 54,144, 53,144, 53,144, 52,142, 47,143, 49,143, 50,144, 51,143, 50,143, 48,143, 48,143, 47,142, 44,142, 45,142, 46,142, 45,141, 43,141, 44,141, 42,138, 32,139, 37,140, 39,140, 41,141, 41,140, 40,140, 38,140, 39,139, 38,138, 35,139, 36,139, 36,139, 35,138, 33,138, 34,138, 33,136, 27,137, 30,137, 31,137, 32,137, 30,136, 29,137, 29,136, 28,135, 25,136, 26,136, 27,135, 26,135, 24,135, 24,135, 23,
db 151, 60,155, 80,157, 90,158, 95,159, 97,159, 98,159, 99,159, 98,159, 96,159, 96,159, 95,158, 92,158, 93,158, 94,158, 93,158, 91,158, 91,158, 90,156, 85,157, 87,157, 88,157, 89,157, 88,157, 86,157, 87,156, 85,156, 82,156, 83,156, 84,156, 83,156, 81,156, 82,155, 80,153, 70,154, 75,155, 77,155, 79,155, 79,155, 78,154, 76,155, 77,154, 75,154, 72,154, 74,154, 74,154, 73,153, 71,154, 72,153, 70,152, 65,153, 67,153, 69,153, 69,153, 68,152, 66,152, 67,152, 66,152, 62,152, 64,152, 64,152, 63,151, 61,151, 62,151, 61,147, 40,149, 50,150, 55,150, 58,151, 59,151, 59,151, 58,150, 56,150, 57,150, 56,149, 53,150, 54,150, 54,150, 53,149, 51,149, 52,149, 51,148, 45,148, 48,149, 49,149, 50,148, 48,148, 46,148, 47,148, 46,147, 43,148, 44,148, 45,147, 43,147, 41,147, 42,147, 41,145, 30,146, 35,146, 38,146, 39,147, 40,146, 38,146, 37,146, 37,146, 36,145, 33,145, 34,146, 35,145, 33,145, 32,145, 32,145, 31,144, 25,144, 28,144, 29,144, 30,144, 29,144, 27,144, 27,144, 26,143, 23,143, 24,143, 25,143, 24,143, 22,143, 22,143, 21,
db 155, 60,157, 80,158, 90,159, 95,159, 97,159, 98,159, 99,159, 98,159, 96,159, 96,159, 95,159, 92,159, 93,159, 94,159, 93,159, 91,159, 91,158, 90,158, 85,158, 87,158, 88,158, 89,158, 88,158, 86,158, 86,158, 85,158, 82,158, 83,158, 84,158, 83,157, 81,157, 81,157, 80,156, 70,157, 75,157, 77,157, 78,157, 79,157, 78,157, 76,157, 76,157, 75,156, 72,157, 73,157, 74,156, 73,156, 71,156, 71,156, 70,156, 65,156, 67,156, 68,156, 69,156, 68,156, 66,156, 66,156, 65,155, 62,155, 63,155, 64,155, 63,155, 61,155, 61,155, 60,153, 40,154, 50,154, 55,155, 57,155, 58,155, 59,155, 58,155, 56,155, 56,155, 55,154, 52,154, 53,154, 54,154, 53,154, 51,154, 51,154, 50,153, 45,154, 47,154, 48,154, 49,154, 48,153, 46,154, 46,153, 45,153, 42,153, 43,153, 44,153, 43,153, 41,153, 41,153, 40,152, 30,152, 35,152, 37,153, 38,153, 39,153, 38,152, 36,152, 36,152, 35,152, 32,152, 33,152, 34,152, 33,152, 31,152, 31,152, 30,151, 25,151, 27,151, 28,152, 29,151, 28,151, 26,151, 26,151, 25,151, 22,151, 23,151, 24,151, 23,151, 21,151, 21,151, 20,
db 160, 60,160, 80,160, 90,160, 95,160, 97,160, 98,160, 99,160, 98,160, 96,160, 96,160, 95,160, 92,160, 93,160, 94,160, 93,160, 91,160, 91,160, 90,160, 85,160, 87,160, 88,160, 89,160, 88,160, 86,160, 86,160, 85,160, 82,160, 83,160, 84,160, 83,160, 81,160, 81,160, 80,160, 70,160, 75,160, 77,160, 78,160, 79,160, 78,160, 76,160, 76,160, 75,160, 72,160, 73,160, 74,160, 73,160, 71,160, 71,160, 70,160, 65,160, 67,160, 68,160, 69,160, 68,160, 66,160, 66,160, 65,160, 62,160, 63,160, 64,160, 63,160, 61,160, 61,160, 60,160, 40,160, 50,160, 55,160, 57,160, 58,160, 59,160, 58,160, 56,160, 56,160, 55,160, 52,160, 53,160, 54,160, 53,160, 51,160, 51,160, 50,160, 45,160, 47,160, 48,160, 49,160, 48,160, 46,160, 46,160, 45,160, 42,160, 43,160, 44,160, 43,160, 41,160, 41,160, 40,160, 30,160, 35,160, 37,160, 38,160, 39,160, 38,160, 36,160, 36,160, 35,160, 32,160, 33,160, 34,160, 33,160, 31,160, 31,160, 30,160, 25,160, 27,160, 28,160, 29,160, 28,160, 26,160, 26,160, 25,160, 22,160, 23,160, 24,160, 23,160, 21,160, 21,160, 20,
 
 
db 0,0,0,0,0,0,0,0,0
 
count dw 5
hour db 0
min db 0
sec db 0
xVal dw 0
yVal dw 0
 
clour_hour db 0
clour_min  db 0
clour_sec  db 0
 
_start:
 
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
 
;call ScrollWindows
 
call     SetVideoMode         ; 调用视频模式切换子程序
 
call     SetBackGround        ; 调用背景颜色设置子程序
 
time:
  call showTime
call     DisplayString        ; 调用字符串显示子程序
call Draw_circle
 
push ax
 
;;;;sec
mov byte [clour_sec],1
mov ax, 0
mov al, [sec]
cmp al, 0
jne buhuanyuan_sec
add al, 60
buhuanyuan_sec:
sub al, 1
call Clean_line
add al, 1
 
call Draw_line
mov byte [clour_sec],0
;;;;;min
mov byte [clour_min],1
mov ax, 0
mov al, [min]
cmp al, 0
jne buhuanyuan_min
add al, 60
buhuanyuan_min:
sub al, 1
call Clean_line
add al, 1
call Draw_line
mov byte [clour_min],0
;;;;;hour
mov byte [clour_hour],1
mov ax, 0
mov al, [hour]
cmp al, 12
jbe buhuanyuan_hour
sub al, 12
buhuanyuan_hour:
 
sub al, 1
push bx
push ax
mov bx, 5
mul bl
call Clean_line
pop ax
pop bx
 
add al, 1
push bx
push ax
mov bx, 5
mul bl
call Draw_line
pop ax
pop bx
 
mov byte [clour_hour],0
;;;
 
 
pop ax
mov word [count], 5
jmp time
 
 
 
;;;;;;backspace
 
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; show time
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
showTime:
mov ax, 0
mov ah,0x02
int 0x1a
 
 
mov al,ch
call bcd2bin
mov [hour], al
call parseNumber
 
mov al,cl
call bcd2bin
mov [min], al
call parseNumber
 
mov al,dh
call bcd2bin
mov [sec], al
call parseNumber
 
 
ret
 
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; parse number
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
parseNumber:
push ecx
push bx
push edx
 
xor bh,bh
mov ecx,  BootMessage
mov edx, 0
mov dx, [count]
.parseTen
cmp al,10
jl .parseNum
sub al,10
inc bh
jmp .parseTen
.parseNum
mov bl,al
mov al,bh
add al, 30h
mov [ecx + edx], al
add edx, 1
mov al,bl
add al, 30h
mov [ecx + edx], al
add edx, 1
mov al, ':'
mov [ecx + edx], al
add edx, 1
mov [count], dx
 
pop edx
pop bx
pop ecx
ret
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; turn bcd to bin (al to al)
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
bcd2bin:
push bx
mov bl,0
mov bh,0
.bcdTen
cmp al,16
jl .bcdNum
sub al,16
inc bl
jmp .bcdTen
.bcdNum
mov bh,al
mov ah,0
mov al,bl
imul ax,10
add al,bh
pop bx
ret
 
 
 
ScrollWindows:
        mov     ax, 0600h            ; AH 赋值为功能号06h(窗口上滚)       (BIOS INT 10-06h 定义参数)
                                     ; AL 赋值为0, 窗口信息全部移出(清屏) (BIOS INT 10-06h 定义参数)
        mov     bx, 0700h            ; BH 底部空白行属性赋值为黑底灰白字  (BIOS INT 10-06h 定义参数)
                                     ; BL 保留
        mov     cx, 0707h            ; 窗口左上角的行列、号赋值为00h 00h  (BIOS INT 10-06h 定义参数)
        mov     dx, 0xc7c7            ; 窗口右下角的行列、号赋值为18h 4fh  (BIOS INT 10-06h 定义参数)
                                     ;     ---------------------------------------------------
                                     ;              0(00h)                      79(4fh)
                                     ;       0(00h)┏━━━━━━━━━━━━━━━━┓
                                     ;             ┃                                ┃
                                     ;             ┃                                ┃
                                     ;             ┃                                ┃
                                     ;             ┃     显示器  25*80 显示方式     ┃
                                     ;             ┃                                ┃
                                     ;             ┃                                ┃
                                     ;             ┃                                ┃
                                     ;      24(18h)┗━━━━━━━━━━━━━━━━┛
                                     ;
        int     10h                  ; BIOS 10h号中断-06h号功能           (清屏功能调用)
        ret                          ; 子程序无参数返回
 
DisplayString:
mov ax, ss
mov es, ax
        mov     ax, BootMessage      ; 取字符串数据(段)的首地址
        mov     bp, ax               ; ES:BP 赋值为待显示字符串的首地址   (BIOS INT 10-13h 定义参数)
        mov     cx, 13              ; CX 赋值为字符串长度(此处为固定值)  (BIOS INT 10-13h 定义参数)
        mov     ax, 01301h           ; AH 赋值为功能号13h(显示字符串)     (BIOS INT 10-13h 定义参数)
                                     ; AL 输出模式参数赋值为03h           (BIOS INT 10-13h 定义参数)
                                     ;     ---------------------------------------------------
                                     ;     第 0 位 : 在输出之后更新光标位置
                                     ;     第 1 位 : 字符串包含交替的字符和属性
                                     ;
        mov     bx, 0111h            ; BH 页号赋值为0                     (BIOS INT 10-13h 定义参数)
                                     ; BL 属性赋值为黑底浅红字(属性字BL使用的前提为AL的高位置0)
                                     ;      ---------------------------------------------------
                                     ;    16位色彩编码表 (D7 D6 D5 D4为背景色,D3 D2 D1 D0为前景色)
                                     ;       ┏━━━━━━━━━━━┳━━━━━━━━━━━┓
                                     ;       ┃   0 0 0 0     黑     ┃   1 0 0 0      灰    ┃
                                     ;       ┃   0 0 0 1     蓝     ┃   1 0 0 1     浅蓝   ┃
                                     ;       ┃   0 0 1 0     绿     ┃   1 0 1 0     浅绿   ┃
                                     ;       ┃   0 0 1 1     青     ┃   1 0 1 1     浅青   ┃
                                     ;       ┃   0 1 0 0     红     ┃   1 1 0 0     浅红   ┃
                                     ;       ┃   0 1 0 1    品红    ┃   1 1 0 1    浅品红  ┃
                                     ;       ┃   0 1 1 0     棕     ┃   1 1 1 0      黄    ┃
                                     ;       ┃   0 1 1 1    灰白    ┃   1 1 1 1      白    ┃
                                     ;       ┗━━━━━━━━━━━┻━━━━━━━━━━━┛
                                     ;
        mov     dx, 0000h            ; DL 赋值为字符串显示的起始行、列号  (BIOS INT 10-13h 定义参数)
        int     10h                  ; BIOS 10h号中断-13h号功能           (字符串屏显功能调用)
        
 
ret                          ; 子程序无参数返回
 
 
SetVideoMode:
        mov     ax, 0013h            ; 320 * 200 * 256 图形模式
                                     ;     ---------------------------------------------------
                                     ;              0(00h)                     319(13fh)
                                     ;        0(00h)┏━━━━━━━━━━━━━━━━┓
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃   显示器  320 * 200 显示方式   ┃
                                     ;              ┃            4 种色彩            ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;      199(C7h)┗━━━━━━━━━━━━━━━━┛
                                     ;
        int     10h                  ; BIOS 10h号中断-00h号功能           (视频模式切换功能调用)
        
 
 
ret                          ; 子程序无参数返回
 
SetBackGround:
mov dx, 3c8h
mov al, 0
out dx, al
;把屏幕设置为深蓝
mov dx, 3c9h
mov al, 50
out dx, al
mov al, 50
out dx, al
mov al, 50
out dx, al
        ret                          ; 子程序无参数返回
 
 
 
 
 
 
 
;-----------------------------------------------
Draw_Some_Pixels:
;
; Sets individual palette colors and draws 
; several pixels.
;------------------------------------------------
 
; Change the color at index 1 to white (63,63,63).
 
push   0A000h     ;视频段地址
pop es     ;
 
mov dx,3c8h
mov al,1 ; set palette index 1
out dx,al
 
mov dx,3c9h
mov al,63 ; red
out dx,al
mov al,63 ; green
out dx,al
mov al,63 ; blue
out dx,al
 
; Calculate the video buffer offset of the first pixel.
; Method is specific to mode 13h, which is 320 X 200.
 
mov word [xVal],160 ; middle of screen
mov word [yVal],100
mov ax,320 ; 320 for video mode 13h
mul word [yVal] ; y-coordinate
add ax,word [xVal] ; x-coordinate
 
; Place the color index into the video buffer.
 
mov cx,10 ; draw 10 pixels
mov di,ax ; AX contains buffer offset
 
; Draw the pixels now. By default, the assembler assumes 
; DI is an offset from the segment address in DS. The 
; segment override ES:[DI] tells the CPU to use the segment 
; address in ES instead. ES currently points to VRAM.
 
DP1:
 
mov byte [es:di],22
add di,1 ; move 5 pixels to the right
loop DP1
 
ret
 
 
 
 
 
 
 
 
 
 
 
 
 
;实现画圆,360个点
Draw_circle:
 
push eax
push bx
push cx
push edx
push   0A000h     ;视频段地址
pop es     ;
 
mov dx,3c8h
mov al,1 ; set palette index 1
out dx,al
 
mov dx,3c9h
mov al,63 ; red
out dx,al
mov al,63 ; green
out dx,al
mov al,63 ; blue
out dx,al
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
mov eax, 0
mov bx, 0
mov cx, 0
loop_circle:
mov edx, circle
 
mov cl, [circle+eax]
add ax, 1
mov bl, [circle+eax]
 
call Draw_point
 
add ax, 1
cmp ax, 720
jbe loop_circle
 
pop edx
pop cx
pop bx
pop eax
 
 
ret
 
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
;实现打点,cx:x, bx:y
Draw_point:
push ax
push di
push dx
mov word [xVal],cx ; middle of screen
mov word [yVal],bx
mov ax,320 ; 320 for video mode 13h
mul word [yVal] ; y-coordinate
add ax,word [xVal] ; x-coordinate
mov di,ax ; AX contains buffer offset
push cx
mov cx, 0
mov cl, [clour_hour]
cmp cl, 1
jne hour_pass
mov byte [es:di],33
jmp huiqu
hour_pass:
mov cl, [clour_min]
cmp cl, 1
jne min_pass
mov byte [es:di], 44
jmp huiqu
min_pass:
mov byte [es:di], 77
 
 
 
huiqu:
pop cx
pop  dx
pop di
pop ax
ret
Del_point:
push ax
push di
push dx
mov word [xVal],cx ; middle of screen
mov word [yVal],bx
mov ax,320 ; 320 for video mode 13h
mul word [yVal] ; y-coordinate
add ax,word [xVal] ; x-coordinate
mov di,ax ; AX contains buffer offset
mov byte [es:di],0
pop dx
pop di
pop ax
ret
 
;;;;;;;;;;;;;;;;;;;;;;;;画线ax,时间
Draw_line:
push eax
push ebx
push ecx
push edx
push   0A000h     ;视频段地址
pop es     ;
 
push ax
mov dx,3c8h
mov al,1 ; set palette index 1
out dx,al
 
mov dx,3c9h
mov al,63 ; red
out dx,al
mov al,63 ; green
out dx,al
mov al,63 ; blue
out dx,al
pop ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov bl, 254
mul bl
mov ebx, 0
mov edx, 0
 
loop_drawline:
 
 
mov cl, [line+eax+edx]
add dx, 1
mov bl, [line+eax+edx]
push dx
call Draw_point
pop  dx
add dx, 1
cmp dx, 254
jbe loop_drawline
 
 
 
pop edx
pop ecx
pop ebx
pop eax
ret
 
 
Clean_line:
push eax
push ebx
push ecx
push edx
push   0A000h     ;视频段地址
pop es     ;
 
push ax
mov dx,3c8h
mov al,1 ; set palette index 1
out dx,al
 
mov dx,3c9h
mov al,63 ; red
out dx,al
mov al,63 ; green
out dx,al
mov al,63 ; blue
out dx,al
pop ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov bl, 254
mul bl
mov ebx, 0
mov edx, 0
 
loop_cleanline:
 
 
mov cl, [line+eax+edx]
add dx, 1
mov bl, [line+eax+edx]
push dx
call Del_point
pop  dx
add dx, 1
cmp dx, 254
jbe loop_cleanline
 
 
 
pop edx
pop ecx
pop ebx
pop eax
ret
 
 
 
 
 
Makefile文件
 
##################################################
# Makefile
##################################################
 
BOOT:=boot.asm
LDR:=loader.asm
BOOT_BIN:=$(subst .asm,.bin,$(BOOT))
LDR_BIN:=$(subst .asm,.bin,$(LDR))
 
IMG:=a.img
FLOPPY:=/mnt/floppy/
 
.PHONY : everything
 
 
everything : $(BOOT_BIN) $(LDR_BIN)
dd if=$(BOOT_BIN) of=$(IMG) bs=512 count=1 conv=notrunc
sudo mount -o loop $(IMG) $(FLOPPY)
sudo cp $(LDR_BIN) $(FLOPPY) -v
sudo umount $(FLOPPY)
 
clean :
rm -f $(BOOT_BIN) $(LDR_BIN)
 
$(BOOT_BIN) : $(BOOT)
nasm $< -o $@
 
$(LDR_BIN) : $(LDR)
nasm loader.asm -o loader.bin
 
 
课程设计要求的时win32函数调用,决的不爽,就自己玩着写了个,fun

fedora安装chrome和RealPlayer

今天重装了系统,从网上下载了chrome和RealPlayer到rpm安装包

使用yum install *.rpm 进行安装(yum 指令比rpm要好,很多包它自动帮你下了)

1不过装载chrome到时候,最后出现了问题,说是key有问题,google了下,找到了答案,在目录下建立*.pub文件

 

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
 
mQGiBEXwb0YRBADQva2NLpYXxgjNkbuP0LnPoEXruGmvi3XMIxjEUFuGNCP4Rj/a
kv2E5VixBP1vcQFDRJ+p1puh8NU0XERlhpyZrVMzzS/RdWdyXf7E5S8oqNXsoD1z
fvmI+i9b2EhHAA19Kgw7ifV8vMa4tkwslEmcTiwiw8lyUl28Wh4Et8SxzwCggDcA
feGqtn3PP5YAdD0km4S4XeMEAJjlrqPoPv2Gf//tfznY2UyS9PUqFCPLHgFLe80u
QhI2U5jt6jUKN4fHauvR6z3seSAsh1YyzyZCKxJFEKXCCqnrFSoh4WSJsbFNc4PN
b0V0SqiTCkWADZyLT5wll8sWuQ5ylTf3z1ENoHf+G3um3/wk/+xmEHvj9HCTBEXP
78X0A/0Tqlhc2RBnEf+AqxWvM8sk8LzJI/XGjwBvKfXe+l3rnSR2kEAvGzj5Sg0X
4XmfTg4Jl8BNjWyvm2Wmjfet41LPmYJKsux3g0b8yzQxeOA4pQKKAU3Z4+rgzGmf
HdwCG5MNT2A5XxD/eDd+L4fRx0HbFkIQoAi1J3YWQSiTk15fw7RMR29vZ2xlLCBJ
bmMuIExpbnV4IFBhY2thZ2UgU2lnbmluZyBLZXkgPGxpbnV4LXBhY2thZ2VzLWtl
eW1hc3RlckBnb29nbGUuY29tPohjBBMRAgAjAhsDBgsJCAcDAgQVAggDBBYCAwEC
HgECF4AFAkYVdn8CGQEACgkQoECDD3+sWZHKSgCfdq3HtNYJLv+XZleb6HN4zOcF
AJEAniSFbuv8V5FSHxeRimHx25671az+uQINBEXwb0sQCACuA8HT2nr+FM5y/kzI
A51ZcC46KFtIDgjQJ31Q3OrkYP8LbxOpKMRIzvOZrsjOlFmDVqitiVc7qj3lYp6U
rgNVaFv6Qu4bo2/ctjNHDDBdv6nufmusJUWq/9TwieepM/cwnXd+HMxu1XBKRVk9
XyAZ9SvfcW4EtxVgysI+XlptKFa5JCqFM3qJllVohMmr7lMwO8+sxTWTXqxsptJo
pZeKz+UBEEqPyw7CUIVYGC9ENEtIMFvAvPqnhj1GS96REMpry+5s9WKuLEaclWpd
K3krttbDlY1NaeQUCRvBYZ8iAG9YSLHUHMTuI2oea07Rh4dtIAqPwAX8xn36JAYG
2vgLAAMFB/wKqaycjWAZwIe98Yt0qHsdkpmIbarD9fGiA6kfkK/UxjL/k7tmS4Vm
CljrrDZkPSQ/19mpdRcGXtb0NI9+nyM5trweTvtPw+HPkDiJlTaiCcx+izg79Fj9
KcofuNb3lPdXZb9tzf5oDnmm/B+4vkeTuEZJ//IFty8cmvCpzvY+DAz1Vo9rA+Zn
cpWY1n6z6oSS9AsyT/IFlWWBZZ17SpMHu+h4Bxy62+AbPHKGSujEGQhWq8ZRoJAT
G0KSObnmZ7FwFWu1e9XFoUCt0bSjiJWTIyaObMrWu/LvJ3e9I87HseSJStfw6fki
5og9qFEkMrIrBCp3QGuQWBq/rTdMuwNFiEkEGBECAAkFAkXwb0sCGwwACgkQoECD
D3+sWZF/WACfeNAu1/1hwZtUo1bR+MWiCjpvHtwAnA1R3IHqFLQ2X3xJ40XPuAyY
/FJG
=Quqp
-----END PGP PUBLIC KEY BLOCK-----
copy进去,然后调用*.pub,之后yum install则可
 
2.安装RealPlayer时,最后显示Package RealPlayer11GOLD.rpm is not signed
 
在安装时 yum localinstall RealPlayer11GOLD.rpm --nogpgcheck 即可

Fedora13下安装chrome

  今天在虚拟机里装了Fedora13,想试一下apt的威力,不过配置了source.list 文件,update后,install chrome, 无法找到

  然后又使用yum指令,yum install chrome, 还是no package chrome available

  浏览各大论坛后终于发现了解决之道(当然我知道在google直接就能下chrome linux版)

  首先 “vi /etc/yum.repos.d/google.repo”添加源

[google]

name=Google - i386
baseurl=http://dl.google.com/linux/rpm/stable/i386
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/rpm/stable/i386
enabled=1
gpgcheck=1

  然后使用 “yum list google-chrome-*” 指令

  则可以发现

Available packages

google-chrome-beta.386

google-chrome-stable.386

google-chrome-unstable.386

"yum install google-chrome-stable.386"即开始安装