Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- BIOS reads 512 bytes from cylinder: 0, head: 0, sector: 1
- ; of bootable floppy drive, then it loads this data into
- ; memory at 0000:7c00h and starts the execution from the first byte.
- #fasm# ; use flat assembler syntax
- #make_boot#
- ORG 0x7C00 ;Origin, tell the assembler that where the code will be in memory after it
- is been loaded
- jmp main ; Salt la punctul de intrare in program
- WriteString:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura de afisare a unui sir de caractere ;;
- ;; Functia 0x13 a intreruperii BIOS 0x10 ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ah, 0x13 ; Codul functiei de afisare a unui sir
- mov al, 1 ; Modul de afisare
- mov bh, 0x00 ; Numarul paginii
- int 0x10 ; Call video interrupt
- ret
- Delay:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura de efectuare a unei retineri ;;
- ;; Functia 0x86 a intreruperii BIOS 0x15 ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- push ax ;Salvam
- push cx ;continutul
- push dx ;registrelor
- mov ah, 0x86 ; Codul functiei
- mov cx, 0x3 ; Durata pauzei in microsecunde (in cx bitul superior)
- mov dx, 0x20 ; in dx bitul inferior (800 milisecunde)
- int 0x15 ; Apelarea intreruperii BIOS
- pop dx ; Restabilim
- pop cx ; continutul
- pop ax ; registrelor
- ret
- ClearScreen: ; Ecranul are dimensiunea de 24x79 pixeli
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura de curatare a ecranului ;;
- ;; Functia 0x06 a intreruperii BIOS 0x10 ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- push ax ; Salvam continutul
- push bx ; |registrelor in starea
- push cx ; in care se aflau inainte de
- push dx ; apelarea functiei
- mov ah, 0x06 ; Codul functiei
- mov al, 0 ; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
- mov bh, 0x00 ; Setarile grafice (culoarea fundalului pentru liniile curatate)
- mov ch, 0 ; Rindul din care incepe curatarea
- mov cl, 0 ; Coloana din care incepe curatarea
- mov dh, 24 ; Rindul in care sfirseste curatarea
- mov dl, 79 ; Coloana in care sfirseste curatarea
- int 0x10 ; Apelarea intreruperii BIOS
- pop dx ; Restabilim
- pop cx ; continutul
- pop bx ; registrelor
- pop ax ; in starea inainte de apelare
- ret
- WriteMessages:
- push ax ; Salvam continutul
- push bx ; registrelor in starea
- push cx ; in care se aflau inainte de
- push dx ; apelarea functiei
- mov bp, str1 ; salvam offsetul mesajului in bp (Hello World!)
- mov bl, 0001 ; setam codul culorii
- mov cx, word[str1_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 10 ; rindul din care incepe afisarea
- mov dl, [str1_x] ; coloana din care incepe afisarea
- call WriteString
- mov bp, str2 ; salvam offsetul mesajului in bp (This is )
- mov bl, 0001 ; setam codul culorii
- mov cx, word[str2_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 11 ; rindul din care incepe afisarea
- mov dl, [str2_x] ; coloana din care incepe afisarea
- call WriteString
- mov bp, str3 ; salvam offsetul mesajului in bp (my new )
- mov bl, 0001 ; setam codul culorii
- mov cx, word[str3_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 11 ; rindul din care incepe afisarea
- mov dl, [str3_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
- sirului afisat anterior)
- call WriteString
- mov bp, str4 ; salvam offsetul mesajului in bp (test OS.)
- mov bl, 0001 ; setam codul culorii
- mov cx, word[str4_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 0xB ; rindul din care incepe afisarea
- mov dl, [str4_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
- sirului afisat anterior)
- call WriteString
- mov bp, str5 ; salvam offsetul mesajului in bp (Enjoy )
- mov bl, 0001 ; setam codul culorii
- mov cx, [str5_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 12 ; rindul din care incepe afisarea
- mov dl, [str5_x] ; coloana din care incepe afisarea
- call WriteString
- mov bp, str6 ; salvam offsetul mesajului in bp (it!)
- mov bl, 0001 ; setam codul culorii
- mov cx, [str6_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 12 ; rindul din care incepe afisarea
- mov dl, [str6_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
- sirului afisat anterior)
- call WriteString
- mov bp, str7 ; salvam offsetul mesajului in bp (Popov )
- mov bl, [color] ; setam codul culorii
- mov cx, [str7_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 13 ; rindul din care incepe afisarea
- mov dl, [str7_x] ; coloana din care incepe afisarea
- call WriteString
- mov bp, str8 ; salvam offsetul mesajului in bp (Eugen)
- mov bl, [color] ; setam codul culorii
- mov cx, [str8_len] ; incarcam in cx numarul de caractere a sirului
- mov dh, 13 ; rindul din care incepe afisarea
- mov dl, [str8_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
- sirului afisat anterior)
- call WriteString
- pop dx ; Restabilim
- pop cx ; continutul
- pop bx ; registrelor
- pop ax ; in starea inainte de apelare
- ret
- Decrement:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura decrementeaza coordonatele de afisare ;;
- ;; a mesajelor pentru a realiza miscarea acestora ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov al, [str1_x]
- sub al, 1
- mov [str1_x], al
- mov al, [str2_x]
- sub al, 1
- mov [str2_x], al
- mov al, [str3_x]
- sub al, 1
- mov [str3_x], al
- mov al, [str4_x]
- sub al, 1
- mov [str4_x], al
- mov al, [str5_x]
- sub al, 1
- mov [str5_x], al
- mov al, [str6_x]
- sub al, 1
- mov [str6_x], al
- ret
- RestartMessages:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura restabileste coordonatele mesajeor ;;
- ;; in pozitia extreama din dreapta ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov byte[str1_x],62
- mov byte[str2_x],56
- mov byte[str3_x],64
- mov byte[str4_x],71
- mov byte[str5_x],64
- mov byte[str6_x],69
- ret
- Divide:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Procedura imparte contorul ciclului principal la 8 ;;
- ;; astfel la fiecare a 8-a iteratie se reseteaza ;;
- ;; contorul schimbarii culorii mesajului ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ax, cx
- mov bl, 8
- div bl
- ret
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- main:
- mov cx, 200 ; Setam contorul ciclului principal
- et:
- call WriteMessages ; Afisam mesajele
- cmp byte[str2_x], 0 ; Comparam pozitia mesajelor cu pozitia extrema din stinga
- jnz et1 ; Daca nu am ajuns la coordonata 0 - salt la et1
- call RestartMessages ; Daca am ajuns la coordonata 0 , amplasam mesajele in pozitia
- extrema dreapta
- et1:
- call Delay ; Apelam retinerea de 800 microsecunde
- call ClearScreen ; Curatim ecram
- call Decrement ; Calculam coordonatele noi ale mesajelor
- call Divide ; Impartim contorul cx la 8
- cmp ah, 0 ; Daca restul impartirii(AH) nu este 0 - salt la et2
- jnz et2
- inc byte[color] ; Daca restul este 0 schimbam culoarea mesajului (la fiecarea a 8-a
- iteratie)
- et2:
- cmp byte[color], 8 ; Daca codul culorii nu este 8 - salt la et3
- jnz et3
- mov byte[color], 1 ; Daca codul culorii este 8 - il resetam la 1
- et3:
- cmp cx,1 ; Comparam contorul cx cu 1 pentru a verifica terminarea ciclului
- jz main ; Daca contorul este 1 - salt la main. Reluam ciclul.
- LOOP et
- ;Data
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Definima: 4 mesaje in 8 offset-uri ;;
- ;; Lungimea fiecarui string ;;
- ;; Coordonata pe x a fiecarui string ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- str1 db 'Hello World!', 0
- str1_len dw 12
- str1_x db 34
- str2 db 'This is ' ,0
- str2_len dw 8
- str2_x db 0x1C
- str3 db 'my new ' ,0
- str3_len dw 7
- str3_x db 36
- str4 db 'test OS.' ,0
- str4_len dw 8
- str4_x db 43
- str5 db 'Enjoy ' ,0
- str5_len dw 6
- str5_x db 36
- str6 db 'it!' ,0
- str6_len dw 3
- str6_x db 41
- str7 db 'Popov ' ,0
- str7_len dw 6
- str7_x db 34
- str8 db 'Eugen' ,0
- str8_len dw 5
- str8_x db 40
- color db 0001
- TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
- DW 0xAA55
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement