汇编实现的小闹钟

kain posted @ 2010年9月07日 07:39 in Linux , 3176 阅读

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

加载程序里主要调用了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
Avatar_small
25penny.com 说:
2023年4月16日 14:55

During your visit to our website, there are chances to collect more information without making you directly acknowledged. Website does collect your personal information such as name, identity, Gender and would also collect the geographic location. During your visit to our website, there are chances to collect more information without 25penny.com making you directly acknowledged. Website does collect your personal information such as name, identity, Gender and would also collect the geographic location.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter