Wymagania są takie, że program musi być napisany w trybie 16bitowym, ponieważ będzie uruchamiany na procesorze pracyjącym w trybie rzeczywistym. Drugie wymaganie to program nie może być większy jak 512 bajtów, to ograniczenie wynika z tego że BIOS komputera jest w stanie wczytać tylko jeden 512 bajtów sektor i go uruchomić.
Żeby uruchomić program trzeba go wgrać do zerowego sektora dysietki lub pendrive a następnie zabootować z tego urządzenia komputer.
O to program zegar.asm
Kod: Zaznacz cały
[org 0x7c00]
start:
jmp word 0:code
;ES:DI - adres VRAM
;B800:0000 - początek - tryb tekstowy
code:
mov ax, 0xb800
mov es, ax
xor di, di
mov ds, di
xor ax, ax
mov cx, 80*25
cld
rep stosw ;fill CX words at ES:DI with AX
mov di, (80*12+40-6)*2
mov si, text
mov cx, text_dl
write:
movsb ; mov byte DS:SI -> ES:DI
mov al, 12
stosb ;store AL at address ES:DI
loop write
czas:
;#######################################
;odczyt godziny (tryb BCD)
clc
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
mov ah, 0x2
int 1ah
;przetwarzanie godziny
;godzina
xor ax, ax
mov al, ch
shr al, 4
add al, "0"
mov [data], al
mov al, ch
and al, 0b00001111
add al, "0"
mov [data+1], al
mov al,":"
mov [data+2], al
;minuta
mov al, cl
shr al, 4
add al, "0"
mov [data+3], al
mov al, cl
and al, 0b00001111
add al, "0"
mov [data+4], al
mov al,":"
mov [data+5], al
;sekunda
mov al, dh
shr al, 4
add al, "0"
mov [data+6], al
mov al, dh
and al, 0b00001111
add al, "0"
mov [data+7], al
mov al, " "
mov [data+8], al
mov [data+9], al
;wypisanie godziny
mov di, (80*13+40-4)*2
mov si, data
mov cx, data_dl
write2:
movsb
mov al, 4
stosb
loop write2
;#########################################
;odczyt daty
clc
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
mov ah, 0x4
int 1ah
;przetwarzanie daty
;century
xor ax, ax
mov al, ch
shr al, 4
add al, "0"
mov [data], al
mov al, ch
and al, 0b00001111
add al, "0"
mov [data+1], al
;rok
mov al, cl
shr al, 4
add al, "0"
mov [data+2], al
mov al, cl
and al, 0b00001111
add al, "0"
mov [data+3], al
mov al,"-"
mov [data+4], al
;miesiac
mov al, dh
shr al, 4
add al, "0"
mov [data+5], al
mov al, dh
and al, 0b00001111
add al, "0"
mov [data+6], al
mov al,"-"
mov [data+7], al
;dzien
mov al, dl
shr al, 4
add al, "0"
mov [data+8], al
mov al, dl
and al, 0b00001111
add al, "0"
mov [data+9], al
;wypisanie godziny
mov di, (80*14+40-5)*2
mov si, data
mov cx, data_dl
write3:
movsb
mov al, 6
stosb
loop write3
;czekanie na klawisz
;xor ax, ax
;int 16h
jmp czas
; stop
jmp $
text db "ZEGAR PROTON"
text_dl equ $ - text
data times 10 db " "
data_dl equ $ - data
; botesctor
times (510-($-start)) db 0
db 0x55, 0xAA
times ((1440*1024)-($-start)) db 0
Kompilascja Netwide Assemblerem, tworzy ona obraz dyskietki.
nasm zegar.asm -o zegar.img
Efekt działania programu pod VirtualBoxem
Porgram powstał na bazie artykułów z miesięcznika programista, "Bliżej krzemu"