Advertisement
martinmunozdr

Simple assembly graphic bootable game

Feb 18th, 2014
445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. BITS 16
  2.  
  3. %macro m_delay 1
  4. pusha
  5. mov ah, 00h ; parameter to interruption get clock
  6. int 1Ah ; get time on cx and dx: cxdx
  7. mov [clock_before], dx ; put current time on clock_before
  8.  
  9. %%delay:
  10.  
  11. mov ah, 00h ; parameter to interruption get clock
  12. int 1Ah ; get time on cx and dx, cx is high dx is low (I am only using dx)
  13. sub dx, [clock_before]
  14. cmp dx, %1
  15. jl %%delay
  16.  
  17. popa ; get saved registers
  18. %endmacro
  19.  
  20. ;----------------------------------------------------------------------------
  21. start:
  22. mov ah, 0Fh ;get video mode
  23. int 10h
  24. mov [video_org], al ;save original video mode
  25.  
  26.  
  27. mov ax, 07C0h ; Set up 4K stack space after this bootloader
  28. add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
  29. mov ss, ax
  30. mov sp, 4096
  31.  
  32. mov ax, 07C0h ; Set data segment to where we're loaded
  33. mov ds, ax
  34.  
  35.  
  36. mov si, text_string ; Put string position into SI
  37. call print_string ; Call our string-printing routine
  38. m_delay 4*18 ;aprox 4 seconds
  39.  
  40. mov ah, 00h ;video mode
  41. mov al, 12h ;640 * 480
  42. int 10h
  43.  
  44. ;----------------------------------------------------------------------------
  45. move:
  46.  
  47. ;erase------------------------
  48. ;not byte [v_page] ;change between
  49. ;and byte [v_page],1 ;1 and 0 v_page
  50.  
  51. ;mov ax,0A000h
  52. ;mov es,ax
  53. ;xor di,di
  54. ;xor ax,ax
  55. ;mov cx,56800
  56. ;cld
  57. ;rep stosw
  58. ;mov cx,56800
  59. ;cld
  60. ;rep stosw
  61.  
  62. ;draw ship -------------------------------------------
  63. ;first erase
  64. mov byte [colour],0
  65. push word [x_coor]
  66. push word [y_coor]
  67.  
  68. mov ax,[before_x_coor]
  69. mov [x_coor],ax
  70. mov ax,[before_y_coor]
  71. mov [y_coor],ax
  72.  
  73. mov ax,[x_coor]
  74. mov [x_coor2],ax
  75. add word [x_coor2],40
  76. mov ax,[before_y_coor]
  77. mov word [y_coor2],ax
  78. add word [y_coor2],20
  79. call draw_line
  80.  
  81. sub word [x_coor2],25
  82. call draw_line
  83.  
  84. add word [y_coor],40
  85. call draw_line
  86.  
  87. add word [x_coor2],25
  88. call draw_line
  89.  
  90. pop word [y_coor]
  91. pop word [x_coor]
  92.  
  93. ;-draw
  94. mov byte [colour],5
  95.  
  96. mov ax,[x_coor]
  97. mov [x_coor2],ax
  98. add word [x_coor2],40
  99. mov ax,[y_coor]
  100. mov word [y_coor2],ax
  101. add word [y_coor2],20
  102. call draw_line
  103.  
  104. sub word [x_coor2],25
  105. call draw_line
  106.  
  107. add word [y_coor],40
  108. call draw_line
  109.  
  110. add word [x_coor2],25
  111. call draw_line
  112.  
  113. sub word [y_coor],40 ;return to original y_coor
  114.  
  115.  
  116. mov ax,[x_coor]
  117. mov [before_x_coor],ax
  118. mov ax,[y_coor]
  119. mov [before_y_coor],ax
  120.  
  121. .eval_key: mov ah, 1 ;Is a key available?
  122. int 16h
  123. jz .eval_key ;If no, try again
  124. ;if yes
  125. mov [code],ah ;save scan code
  126. mov ah, 0 ;Flush this character from the
  127. int 16h ; buffer
  128.  
  129. cmp byte [code], 1 ;if ESC
  130. je .end ;end
  131. cmp byte [code], 4Dh
  132. jne .continue1
  133. add word [x_coor],30
  134. .continue1:
  135. cmp byte [code],4Bh
  136. jne .continue2
  137. sub word [x_coor], 30
  138. .continue2:
  139. cmp byte [code],48h
  140. jne .continue3
  141. sub word [y_coor] ,30
  142. .continue3:
  143. cmp byte [code],50h
  144. jne move
  145. add word [y_coor] , 30
  146.  
  147. jmp move ;else, other time
  148. ;----------------------------------------------------------------------------
  149.  
  150. .end:
  151. mov ah,42h
  152. int 10h
  153.  
  154. mov ah, 00h ;video mode
  155. mov al, [video_org]
  156. int 10h
  157. mov si, goodbay_string ; Put string position into SI
  158. call print_string ; Call our string-printing routine
  159.  
  160. jmp $ ; Jump here - infinite loop!
  161.  
  162.  
  163. text_string db 'Juego creado por Martin Munoz del Rio', 0
  164. goodbay_string db 'Gracias por probar este juego.', 0
  165. clock_before dw 0
  166. video_org db 0
  167. code db 0
  168. current_y dw 0
  169. colour db 5
  170. x_coor dw 300
  171. y_coor dw 200
  172. x_coor2 dw 350
  173. y_coor2 dw 250
  174. before_x_coor dw 300
  175. before_y_coor dw 200
  176. v_page db 0
  177. ;----------------------------------------------------------------------------
  178. print_string: ; Routine: output string in SI to screen
  179. mov ah, 0Eh ; int 10h 'print char' function
  180.  
  181. .repeat:
  182. lodsb ; Get character from string
  183. cmp al, 0
  184. je .done ; If char is zero, end of string
  185. int 10h ; Otherwise, print it
  186. jmp .repeat
  187.  
  188. .done:
  189. ret
  190. ;----------------------------------------------------------------------------
  191. draw_line:
  192. mov ah, 0Ch ;draw
  193. mov cx, [x_coor] ;coordinate x
  194. mov dx, [y_coor] ;coordinate y
  195. mov bh,[v_page] ; video page
  196. mov al,[colour] ;colour
  197. mov [current_y],dx ;init current_y with y
  198. .draw: ;drawing a line
  199. pusha
  200. mov ax,[y_coor2]
  201. sub ax,[y_coor]
  202. xor dx,dx
  203. sub cx, [x_coor]
  204. imul cx
  205. mov bx, [x_coor2]
  206. sub bx, [x_coor]
  207. idiv bx
  208. add ax, [y_coor]
  209. mov [current_y], ax
  210. popa
  211. mov dx,[current_y]
  212. int 10h
  213. inc cx
  214. cmp cx, [x_coor2]
  215. jle .draw
  216.  
  217. ret
  218. ;-------------------------------------------------------------------------------
  219. times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
  220. dw 0xAA55 ; The standard PC boot signature
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement