Advertisement
Guest User

Untitled

a guest
Oct 20th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.89 KB | None | 0 0
  1. .file "src/game/game.s"
  2.  
  3. .global gameInit
  4. .global gameLoop
  5.  
  6. .section .game.data
  7. pressedStr: .asciz "A key was pressed!"
  8. world: .ascii "################################################################################################################################################################################################### ###### ###### ###### M M ###### ###### M ###### ###### #################################################### ###### # # ###### # M # ###### # # ###### # M # M ###### # # M ###### # M # ###### # # ###### # M # ###### # M # ########## ################### # # # ###### # # # ###### ##################### # M # M ###### # # ###### M # # M ###### M # # ###### # M # ###### ##################### # # ###### # # # ###### # M M M # ################ ###### # # # ###### # M M M # # ###### # # # ###### ##################### # # M ###### # ############# ###### # # ###### # M M M M M # ###### # # ###### ################# ###### # ###### # M ###### # ###### # ##################### # ###### ###### ############# #### ################## # # # ###### # # M # ###### M # # # ###### #### # M # ###### M # # # ###### # ####### M # ###### # # # # ###### # # M # M # ###### ####### M # # # # ###### M # # # # ###### # # # # ###### # M # # # ###### # ########### M # ###### X # # ###### M # M M # ###### # # ###################################################################################################################################################################################################"
  9. worldSize: .quad 4096
  10. worldWidth: .quad 64
  11. worldHeight: .quad 64
  12. cameraSize: .quad 1125
  13. cameraWidth: .quad 45
  14. cameraHeight: .quad 25
  15. playerX: .quad 0
  16. playerY: .quad 0
  17. pointerX: .quad 0
  18. pointerY: .quad 0
  19. killcounter: .quad 0
  20. .section .game.text
  21.  
  22. printString: #take %rdi as string address
  23. pushq %r13
  24. pushq %r14
  25. movq %rdi, %r13
  26. movq $0, %r14
  27. printStringLoop:
  28. cmpb $0, (%r13)
  29. je printStringExit
  30.  
  31. movb (%r13), %dl
  32. movq %r14, %rdi
  33. movq $0, %rsi
  34. movb $0xf0, %cl
  35. call putChar
  36. incq %r13
  37. incq %r14
  38. jmp printStringLoop
  39. printStringExit:
  40. popq %r14
  41. popq %r13
  42. movq %rbp, %rsp
  43. popq %rbp
  44. ret
  45.  
  46. printInteger: #rdi is gonna be the quad we are gonna print.
  47. pushq %rbp
  48. movq %rsp, %rbp
  49. pushq %r12
  50. pushq %r13
  51. pushq %r14
  52. #here we insert the code
  53. movq %rdi, %rax
  54. movq $0, %r13
  55. movq $10, %r12 #divisor register
  56. movq $1, %r14 #Digit counter register
  57. printIntegerPushLoop:
  58. xor %rdx, %rdx
  59. div %r12
  60. incq %r14
  61. pushq %rdx
  62. cmpq $0, %rax
  63. je printIntegerPopLoop
  64. jmp printIntegerPushLoop
  65. printIntegerPopLoop:
  66. decq %r14
  67. cmpq $0, %r14
  68. je printIntegerExit
  69. popq %rdx
  70. addq $48, %rdx
  71. #output the character somehow
  72. movq %r13, %rdi
  73. movq $0, %rsi
  74. #movb $64, %dl
  75. movb $0x0f, %cl
  76. call putChar
  77. #####
  78. incq %r13
  79. jmp printIntegerPopLoop
  80. printIntegerExit:
  81. popq %r14
  82. popq %r13
  83. popq %r12
  84. movq %rbp, %rsp
  85. popq %rbp
  86. ret
  87. genWorld:
  88. pushq %rbp
  89. movq %rsp, %rbp
  90. pushq %r12
  91. pushq %r13
  92. pushq %r14
  93. pushq %r15
  94. movq $world, %r13
  95. movq $0, %r14
  96. movq worldWidth, %r15
  97. genWorldLoop:
  98. #cmpq $worldSize,%r13
  99. #jge drawWorldLoopExit
  100. cmpq worldSize,%r14
  101. jge genWorldExit
  102. xor %rdx,%rdx
  103. movq %r14, %rax
  104. divq %r15
  105.  
  106. movq %rax, %rsi
  107. movq %rdx, %rdi
  108. pushq %rdi
  109. pushq %rsi
  110. call getWrldPtr
  111. popq %rsi
  112. popq %rdi
  113. cmpq $2, %rdi
  114. jle genWorldLoopWall
  115. cmpq $2, %rsi
  116. jle genWorldLoopWall
  117. movq worldWidth, %r12
  118. subq $3, %r12
  119. cmpq %r12, %rdi
  120. jge genWorldLoopWall
  121. movq worldHeight, %r12
  122. subq $3, %r12
  123. cmpq %r12, %rsi
  124. jge genWorldLoopWall
  125. movb $' ',(%rax)
  126. jmp genWorldLoopEnd
  127. genWorldLoopWall:
  128. movb $0x23,(%rax)
  129. genWorldLoopEnd:
  130. incq %r13
  131. incq %r14
  132. jmp genWorldLoop
  133. genWorldExit:
  134. popq %r15
  135. popq %r14
  136. popq %r13
  137. popq %r12
  138. movq %rbp, %rsp
  139. popq %rbp
  140. ret
  141.  
  142. drawWorld:
  143. pushq %rbp
  144. movq %rsp, %rbp
  145. pushq %r14
  146. pushq %r15
  147. movq $0, %r14
  148. movq cameraWidth, %r15
  149. drawWorldLoop:
  150. #cmpq $worldSize,%r13
  151. #jge drawWorldLoopExit
  152. cmpq cameraSize,%r14
  153. jge drawWorldLoopExit
  154. xor %rdx,%rdx
  155. movq %r14, %rax
  156. divq %r15
  157.  
  158. movq %rax, %rsi
  159. movq %rdx, %rdi
  160. pushq %rdi
  161. pushq %rsi
  162. movq $playerX,%r12
  163. addq (%r12), %rdi
  164. movq cameraWidth,%r12
  165. shrq $1,%r12
  166. subq %r12, %rdi
  167. decq %rdi
  168.  
  169. movq $playerY,%r12
  170. addq (%r12), %rsi
  171. movq cameraHeight,%r12
  172. shrq $1,%r12
  173. subq %r12, %rsi
  174.  
  175. call getWrldPtr
  176. popq %rsi
  177. popq %rdi
  178. addq $35, %rdi
  179. movb (%rax), %dl
  180. movb $0xf0, %cl
  181. call putChar
  182. incq %r14
  183. jmp drawWorldLoop
  184. drawWorldLoopExit:
  185. popq %r15
  186. popq %r14
  187. movq %rbp, %rsp
  188. popq %rbp
  189. ret
  190. getWrldPtr: #let %rdi be the x and %rsi be the y
  191. pushq %rbp
  192. movq %rsp, %rbp
  193. cmpq $0, %rdi
  194. jl getWrldPtrInvalid
  195. cmpq $0, %rsi
  196. jl getWrldPtrInvalid
  197. cmpq worldWidth, %rdi
  198. jge getWrldPtrInvalid
  199. cmpq worldHeight, %rsi
  200. jge getWrldPtrInvalid
  201.  
  202. movq %rsi, %rax
  203. movq worldWidth, %rsi
  204. mulq %rsi
  205. addq $world, %rax
  206. addq %rdi, %rax
  207. movq %rbp, %rsp
  208. popq %rbp
  209. ret
  210. getWrldPtrInvalid:
  211. movq $world, %rax
  212. movq %rbp, %rsp
  213. popq %rbp
  214. ret
  215.  
  216. clearScreen: #let %rdi be the clear color (only the lower 8 bits are relevant) and %rsi be the min and max x (low and high byte respectively)
  217. pushq %rbp
  218. movq %rsp, %rbp
  219. pushq %r13
  220. movq $0xB8000, %r13
  221. clearScreenLoop:
  222. cmpq $0xB8FA0,%r13
  223. jge clearScreenLoopExit
  224. movb $0, (%r13)
  225. movb %dil, 1(%r13)
  226. addq $2, %r13
  227. jmp clearScreenLoop
  228. clearScreenLoopExit:
  229. popq %r13
  230. movq %rbp, %rsp
  231. popq %rbp
  232. ret
  233. gameInit:
  234. pushq %rbp
  235. movq %rsp, %rbp
  236. pushq %r12
  237. movq $39773, %rdi #sets the game loop to 30hz
  238. call setTimer
  239. #call genWorld
  240. movb $0x0f, %dil
  241. call clearScreen
  242. movq $playerX,%r12
  243. movq $58, (%r12)
  244. movq $playerY,%r12
  245. movq $58, (%r12)
  246. popq %r12
  247. movq %rbp, %rsp
  248. popq %rbp
  249. ret
  250. gameLoop:
  251. pushq %rbp
  252. movq %rsp, %rbp
  253. call inputs
  254. call drawWorld
  255. movq $1234, %rdi
  256. call printInteger
  257. movq $58, %rdi
  258. movq $12, %rsi
  259. movb $64, %dl
  260. movb $0xf0, %cl
  261. call putChar
  262. movq %rbp, %rsp
  263. popq %rbp
  264. ret
  265. inputs:
  266. call readKeyCode
  267. cmpb $0x11, %al
  268. je wpress
  269. cmpb $0x1F, %al
  270. je spress
  271. cmpb $0x1E, %al
  272. je apress
  273. cmpb $0x20, %al
  274. je dpress
  275. cmpb $0x17, %al
  276. je ipress
  277. cmpb $0x25, %al
  278. je kpress
  279. cmpb $0x24, %al
  280. je jpress
  281. cmpb $0x26, %al
  282. je lpress
  283.  
  284. ret
  285. wpress:
  286. movq playerX, %rdi
  287. movq playerY, %rsi
  288. decq %rsi
  289. call getWrldPtr
  290. cmpb $'X', (%rax)
  291. je endgame
  292. cmpb $0x23, (%rax)
  293. jne wmove
  294. ret
  295. wmove:
  296. decq playerY
  297. ret
  298. spress:
  299. movq playerX, %rdi
  300. movq playerY, %rsi
  301. incq %rsi
  302. call getWrldPtr
  303. cmpb $'X', (%rax)
  304. je endgame
  305. cmpb $0x23, (%rax)
  306. jne smove
  307. ret
  308. smove:
  309. incq playerY
  310. ret
  311. apress:
  312. movq playerX, %rdi
  313. movq playerY, %rsi
  314. decq %rdi
  315. call getWrldPtr
  316. cmpb $'X', (%rax)
  317. je endgame
  318. cmpb $0x23, (%rax)
  319. jne amove
  320. ret
  321. amove:
  322. decq playerX
  323. ret
  324. dpress:
  325. movq playerX, %rdi
  326. movq playerY, %rsi
  327. incq %rdi
  328. call getWrldPtr
  329. cmpb $'X', (%rax)
  330. je endgame
  331. cmpb $0x23, (%rax)
  332. jne dmove
  333. ret
  334. dmove:
  335. incq playerX
  336. ret
  337. ipress:
  338. movq playerX, %rdi
  339. movq playerY, %rsi
  340. decq %rsi
  341. call getWrldPtr
  342. cmpb $0x23, (%rax)
  343. je stopattack
  344. call attacki1
  345. decq %rsi
  346. call getWrldPtr
  347. cmpb $0x23, (%rax)
  348. je stopattack
  349. call attacki2
  350. decq %rsi
  351. call getWrldPtr
  352. cmpb $0x23, (%rax)
  353. je stopattack
  354. call attacki3
  355. ret
  356.  
  357. kpress:
  358. movq playerX, %rdi
  359. movq playerY, %rsi
  360. incq %rsi
  361. call getWrldPtr
  362. cmpb $0x23, (%rax)
  363. je stopattack
  364. call attackk1
  365. incq %rsi
  366. call getWrldPtr
  367. cmpb $0x23, (%rax)
  368. je stopattack
  369. call attackk2
  370. incq %rsi
  371. call getWrldPtr
  372. cmpb $0x23, (%rax)
  373. je stopattack
  374. call attackk3
  375. ret
  376. jpress:
  377. movq playerX, %rdi
  378. movq playerY, %rsi
  379. decq %rdi
  380. call getWrldPtr
  381. cmpb $0x23, (%rax)
  382. je stopattack
  383. call attackj1
  384. decq %rdi
  385. call getWrldPtr
  386. cmpb $0x23, (%rax)
  387. je stopattack
  388. call attackj2
  389. decq %rdi
  390. call getWrldPtr
  391. cmpb $0x23, (%rax)
  392. je stopattack
  393. call attackj3
  394. ret
  395. lpress:
  396. movq playerX, %rdi
  397. movq playerY, %rsi
  398. incq %rdi
  399. call getWrldPtr
  400. cmpb $0x23, (%rax)
  401. je stopattack
  402. call attackl1
  403. incq %rdi
  404. call getWrldPtr
  405. cmpb $0x23, (%rax)
  406. je stopattack
  407. call attackl2
  408. incq %rdi
  409. call getWrldPtr
  410. cmpb $0x23, (%rax)
  411. je stopattack
  412. call attackl3
  413. ret
  414. stopattack:
  415. ret
  416. attacki1:
  417. movq playerX, %rdi
  418. movq playerY, %rsi
  419. decq %rsi
  420. call getWrldPtr
  421. cmpb $0x4D, (%rax)
  422. je kill
  423. ret
  424. attacki2:
  425. #movq playerX, %rdi
  426. # movq playerY, %rsi
  427. # decq %rsi
  428. # decq %rsi
  429. # call getWrldPtr
  430. # cmpb $0x4D, (%rax)
  431. # je kill
  432. ret
  433. attacki3:
  434. #movq playerX, %rdi
  435. #movq playerY, %rsi
  436. # decq %rsi
  437. # decq %rsi
  438. # decq %rsi
  439. # call getWrldPtr
  440. # cmpb $0x4D, (%rax)
  441. # je kill
  442. ret
  443. attackk1:
  444. movq playerX, %rdi
  445. movq playerY, %rsi
  446. incq %rsi
  447. call getWrldPtr
  448. cmpb $0x4D, (%rax)
  449. je kill
  450. ret
  451. attackk2:
  452. #movq playerX, %rdi
  453. # movq playerY, %rsi
  454. # incq %rsi
  455. # incq %rsi
  456. # call getWrldPtr
  457. # cmpb $0x4D, (%rax)
  458. # je kill
  459. ret
  460. attackk3:
  461. #movq playerX, %rdi
  462. #movq playerY, %rsi
  463. # incq %rsi
  464. # incq %rsi
  465. # incq %rsi
  466. # call getWrldPtr
  467. # cmpb $0x4D, (%rax)
  468. # je kill
  469. ret
  470. attackj1:
  471. movq playerX, %rdi
  472. movq playerY, %rsi
  473. decq %rdi
  474. call getWrldPtr
  475. cmpb $0x4D, (%rax)
  476. je kill
  477. ret
  478. attackj2:
  479. #movq playerX, %rdi
  480. # movq playerY, %rsi
  481. # decq %rdi
  482. # decq %rdi
  483. # call getWrldPtr
  484. # cmpb $0x4D, (%rax)
  485. # je kill
  486. ret
  487. attackj3:
  488. #movq playerX, %rdi
  489. #movq playerY, %rsi
  490. # decq %rdi
  491. # decq %rdi
  492. # decq %rdi
  493. # call getWrldPtr
  494. # cmpb $0x4D, (%rax)
  495. # je kill
  496. ret
  497. attackl1:
  498. movq playerX, %rdi
  499. movq playerY, %rsi
  500. incq %rdi
  501. call getWrldPtr
  502. cmpb $0x4D, (%rax)
  503. je kill
  504. ret
  505. attackl2:
  506. #movq playerX, %rdi
  507. # movq playerY, %rsi
  508. # incq %rdi
  509. # incq %rdi
  510. # call getWrldPtr
  511. # cmpb $0x4D, (%rax)
  512. # je kill
  513. ret
  514. attackl3:
  515. #movq playerX, %rdi
  516. #movq playerY, %rsi
  517. # incq %rdi
  518. # incq %rdi
  519. # incq %rdi
  520. # call getWrldPtr
  521. # cmpb $0x4D, (%rax)
  522. # je kill
  523. ret
  524.  
  525. kill:
  526. movb $'$', (%rax)
  527. incq killcounter
  528. ret
  529. endgame:
  530. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement