Advertisement
Guest User

Untitled

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