Advertisement
Guest User

Untitled

a guest
Oct 27th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; BIOS reads 512 bytes from cylinder: 0, head: 0, sector: 1
  2. ; of bootable floppy drive, then it loads this data into
  3. ; memory at 0000:7c00h and starts the execution from the first byte.
  4.  
  5. #make_boot#
  6. ORG 0x7C00 ;Origin, tell the assembler that where the code will be in memory after it is been loaded
  7. jmp main ; Salt la punctul de intrare in program
  8. WriteString:
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10. ;; Procedura de afisare a unui sir de caractere ;;
  11. ;; Functia 0x13 a intreruperii BIOS 0x10 ;;
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. mov ah, 0x13 ; Codul functiei de afisare a unui sir
  14. mov al, 1 ; Modul de afisare
  15. mov bh, 0x00 ; Numarul paginii
  16. int 0x10 ; Call video interrupt
  17. ret
  18. Delay:
  19. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  20. ;; Procedura de efectuare a unei retineri ;;
  21. ;; Functia 0x86 a intreruperii BIOS 0x15 ;;
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. push ax ;Salvam
  24. push cx ;continutul
  25. push dx ;registrelor
  26. mov ah, 0x86 ; Codul functiei
  27. mov cx, 0x3 ; Durata pauzei in microsecunde (in cx bitul superior)
  28. mov dx, 0x20 ; in dx bitul inferior (800 milisecunde)
  29. int 0x15 ; Apelarea intreruperii BIOS
  30. pop dx ; Restabilim
  31. pop cx ; continutul
  32. pop ax ; registrelor
  33. ret
  34. ClearScreen: ; Ecranul are dimensiunea de 24x79 pixeli
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;; Procedura de curatare a ecranului ;;
  37. ;; Functia 0x06 a intreruperii BIOS 0x10 ;;
  38. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  39. push ax ; Salvam continutul
  40. push bx ; |registrelor in starea
  41. push cx ; in care se aflau inainte de
  42. push dx ; apelarea functiei
  43. mov ah, 0x06 ; Codul functiei
  44. mov al, 0 ; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
  45. mov bh, 0x00 ; Setarile grafice (culoarea fundalului pentru liniile curatate)
  46. mov ch, 0 ; Rindul din care incepe curatarea
  47. mov cl, 0 ; Coloana din care incepe curatarea
  48. mov dh, 24 ; Rindul in care sfirseste curatarea
  49. mov dl, 79 ; Coloana in care sfirseste curatarea
  50. int 0x10 ; Apelarea intreruperii BIOS
  51. pop dx ; Restabilim
  52. pop cx ; continutul
  53. pop bx ; registrelor
  54. pop ax ; in starea inainte de apelare
  55. ret
  56. WriteMessages:
  57. push ax ; Salvam continutul
  58. push bx ; registrelor in starea
  59. push cx ; in care se aflau inainte de
  60. push dx ; apelarea functiei
  61. mov bp, str1 ; salvam offsetul mesajului in bp (Hello World!)
  62. mov bl, 0001 ; setam codul culorii
  63. mov cx, word[str1_len] ; incarcam in cx numarul de caractere a sirului
  64. mov dh, 10 ; rindul din care incepe afisarea
  65. mov dl, [str1_x] ; coloana din care incepe afisarea
  66. call WriteString
  67. mov bp, str2 ; salvam offsetul mesajului in bp (This is )
  68. mov bl, 0001 ; setam codul culorii
  69. mov cx, word[str2_len] ; incarcam in cx numarul de caractere a sirului
  70. mov dh, 11 ; rindul din care incepe afisarea
  71. mov dl, [str2_x] ; coloana din care incepe afisarea
  72. call WriteString
  73. mov bp, str3 ; salvam offsetul mesajului in bp (my new )
  74. mov bl, 0001 ; setam codul culorii
  75. mov cx, word[str3_len] ; incarcam in cx numarul de caractere a sirului
  76. mov dh, 11 ; rindul din care incepe afisarea
  77. mov dl, [str3_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimeasirului afisat anterior)
  78. call WriteString
  79. mov bp, str4 ; salvam offsetul mesajului in bp (test OS.)
  80. mov bl, 0001 ; setam codul culorii
  81. mov cx, word[str4_len] ; incarcam in cx numarul de caractere a sirului
  82. mov dh, 0xB ; rindul din care incepe afisarea
  83. mov dl, [str4_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimeasirului afisat anterior)
  84. call WriteString
  85. mov bp, str5 ; salvam offsetul mesajului in bp (Enjoy )
  86. mov bl, 0001 ; setam codul culorii
  87. mov cx, [str5_len] ; incarcam in cx numarul de caractere a sirului
  88. mov dh, 12 ; rindul din care incepe afisarea
  89. mov dl, [str5_x] ; coloana din care incepe afisarea
  90. call WriteString
  91. mov bp, str6 ; salvam offsetul mesajului in bp (it!)
  92. mov bl, 0001 ; setam codul culorii
  93. mov cx, [str6_len] ; incarcam in cx numarul de caractere a sirului
  94. mov dh, 12 ; rindul din care incepe afisarea
  95. mov dl, [str6_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimeasirului afisat anterior)
  96. call WriteString
  97. mov bp, str7 ; salvam offsetul mesajului in bp (Popov )
  98. mov bl, [color] ; setam codul culorii
  99. mov cx, [str7_len] ; incarcam in cx numarul de caractere a sirului
  100. mov dh, 13 ; rindul din care incepe afisarea
  101. mov dl, [str7_x] ; coloana din care incepe afisarea
  102. call WriteString
  103. mov bp, str8 ; salvam offsetul mesajului in bp (Eugen)
  104. mov bl, [color] ; setam codul culorii
  105. mov cx, [str8_len] ; incarcam in cx numarul de caractere a sirului
  106. mov dh, 13 ; rindul din care incepe afisarea
  107. mov dl, [str8_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimeasirului afisat anterior)
  108. call WriteString
  109. pop dx ; Restabilim
  110. pop cx ; continutul
  111. pop bx ; registrelor
  112. pop ax ; in starea inainte de apelare
  113. ret
  114. Decrement:
  115. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  116. ;; Procedura decrementeaza coordonatele de afisare ;;
  117. ;; a mesajelor pentru a realiza miscarea acestora ;;
  118. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  119. mov al, [str1_x]
  120. sub al, 1
  121. mov [str1_x], al
  122. mov al, [str2_x]
  123. sub al, 1
  124. mov [str2_x], al
  125. mov al, [str3_x]
  126. sub al, 1
  127. mov [str3_x], al
  128. mov al, [str4_x]
  129. sub al, 1
  130. mov [str4_x], al
  131. mov al, [str5_x]
  132. sub al, 1
  133. mov [str5_x], al
  134. mov al, [str6_x]
  135. sub al, 1
  136. mov [str6_x], al
  137. ret
  138. RestartMessages:
  139. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  140. ;; Procedura restabileste coordonatele mesajeor ;;
  141. ;; in pozitia extreama din dreapta ;;
  142. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  143. mov byte[str1_x],62
  144. mov byte[str2_x],56
  145. mov byte[str3_x],64
  146. mov byte[str4_x],71
  147. mov byte[str5_x],64
  148. mov byte[str6_x],69
  149. ret
  150. Divide:
  151. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  152. ;; Procedura imparte contorul ciclului principal la 8 ;;
  153. ;; astfel la fiecare a 8-a iteratie se reseteaza ;;
  154. ;; contorul schimbarii culorii mesajului ;;
  155. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  156. mov ax, cx
  157. mov bl, 8
  158. div bl
  159. ret
  160. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  161. main:
  162. mov cx, 200 ; Setam contorul ciclului principal
  163. et:
  164. call WriteMessages ; Afisam mesajele
  165. cmp byte[str2_x], 0 ; Comparam pozitia mesajelor cu pozitia extrema din stinga
  166. jnz et1 ; Daca nu am ajuns la coordonata 0 - salt la et1
  167. call RestartMessages ; Daca am ajuns la coordonata 0 , amplasam mesajele in pozitiaextrema dreapta
  168. et1:
  169. call Delay ; Apelam retinerea de 800 microsecunde
  170. call ClearScreen ; Curatim ecram
  171. call Decrement ; Calculam coordonatele noi ale mesajelor
  172. call Divide ; Impartim contorul cx la 8
  173. cmp ah, 0 ; Daca restul impartirii(AH) nu este 0 - salt la et2
  174. jnz et2
  175. inc byte[color] ; Daca restul este 0 schimbam culoarea mesajului (la fiecarea a 8-aiteratie)
  176. et2:
  177. cmp byte[color], 8 ; Daca codul culorii nu este 8 - salt la et3
  178. jnz et3
  179. mov byte[color], 1 ; Daca codul culorii este 8 - il resetam la 1
  180. et3:
  181. cmp cx,1 ; Comparam contorul cx cu 1 pentru a verifica terminarea ciclului
  182. jz main ; Daca contorul este 1 - salt la main. Reluam ciclul.
  183. LOOP et
  184. ;Data
  185. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  186. ;; Definima: 4 mesaje in 8 offset-uri ;;
  187. ;; Lungimea fiecarui string ;;
  188. ;; Coordonata pe x a fiecarui string ;;
  189. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  190. str1 db 'Laboratorul1 !', 0
  191. str1_len dw 12
  192. str1_x db 34
  193. str2 db 'Somipp ' ,0
  194. str2_len dw 8
  195. str2_x db 0x1C
  196. str3 db 'Utm ' ,0
  197. str3_len dw 7
  198. str3_x db 36
  199. str4 db '2017.' ,0
  200. str4_len dw 8
  201. str4_x db 43
  202. str5 db 'Dep. ' ,0
  203. str5_len dw 6
  204. str5_x db 36
  205. str6 db 'ISA!' ,0
  206. str6_len dw 3
  207. str6_x db 41
  208. str7 db 'Alex / ' ,0
  209. str7_len dw 6
  210. str7_x db 34
  211. str8 db ' Igor' ,0
  212. str8_len dw 5
  213. str8_x db 40
  214. color db 0001
  215. TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
  216. DW 0xAA55 ;Add boot signature at the end of bootloader
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement