; clock.asm
; Coco07
; 硬盘主引导扇区程序 动态时钟显示
; 2022.3.4
SECTION main vstart=0x7c00
jmp start
;----------data
stack times 32 dw 0
string_hello db 'Hello! Welcome to Coco07 World.',0
start: ;主程序
;----------code
;-初始化-
mov ax,stack
mov ss,ax
xor ax,ax
mov sp,ax
mov ax,0xb800
mov es,ax
xor ax,ax
mov di,ax
;-显示字符串-
mov dl,0x07 ;黑底白字
mov bx,string_hello
call o_string
;-显示时间-
mov dl,0x04 ;黑底红字
mov ax,12*160+27*2 ;日期/时间从12行27列开始显示
mov di,ax
start_s1 push di ;备份
call o_date_time
mov byte [es:di],' '
inc di
mov byte [es:di],0x07
pop di ;恢复
jmp start_s1
;------------------------------------------------------------
o_string: ;子程序 显示字符串
;字符串以0结束,首偏移地址bx,显存地址es:di,字符属性dl
push ax
o_string_s mov al,[bx]
cmp al,0
jne o_string_con
pop ax
ret
o_string_con inc bx
mov [es:di],al
inc di
mov [es:di],dl
inc di
jmp o_string_s
;------------------------------------------------------------
o_date_time: ;子程序 获取/显示日期和时间(CMOS RAM)
;显示格式:年/月/日-周 时:分:秒,显存地址es:di,字符属性dl
;----------code
push ax
push cx
push si
;-获取-
xor ax,ax
mov si,ax
mov cx,7
o_dt_s1 mov al,[o_dt_w1+si]
or al,0x80
out 0x70,al
in al,0x71
call bcd_to_ascii
push ax
inc si
loop o_dt_s1
;-显示-
xor ax,ax
mov si,ax
mov cx,7
o_dt_s2 pop ax
mov [es:di],ah
inc di
mov [es:di],dl
inc di
mov [es:di],al
inc di
mov [es:di],dl
inc di
mov al,[o_dt_w2+si]
inc si
mov [es:di],al
inc di
mov [es:di],dl
inc di
loop o_dt_s2
pop si
pop cx
pop ax
ret
;----------data
o_dt_w1 db 0,2,4,6,7,8,9
o_dt_w2 db '//- :: ' ;分隔
;------------------------------------------------------------
bcd_to_ascii: ;子程序 BCD转ASCII
;BCD码al,转换为ASCII码ah和al
push cx
mov ah,al ;拆分成两个数字
and al,0b00001111 ;低4位
add al,'0'
shr ah,4
and ah,0b00001111 ;高4位
add ah,'0'
pop cx
ret
;------------------------------------------------------------
times 510-($-$$) db 0
db 0x55,0xaa