Advertisement
Guest User

Zniggy

a guest
Jun 6th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Zniggy the Znig
  3. ; Copyright 2019 anonymous
  4. ; 4chan /vr/ board
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6.  
  7. ; ZX Spectrum Memory Map
  8. ; 0x0000 - 0x3FFF RESERVED: basic ROM
  9. ; 0x4000 - 0x57FF RAM: Screen 256x192 1bpp
  10. ; 0x5800 - 0x5AFF RAM: 8x8 color cells 32x24
  11. ; 0x5B00 - 0x5BFF RESERVED: Printer Buffer (?)
  12. ; 0x5C00 - 0x5CBF RESERVED: System variables (?)
  13. ; 0x5CC0 - 0x5CCA RESERVED: ???
  14. ; 0x5CCB - 0xFF57 FREE RAM OUR GAME
  15. ; 0xFF58 - 0xFFFF RESERVED: ???
  16.  
  17. org $8000
  18.  
  19. ;==============================================================
  20. ; Defines
  21. ;==============================================================
  22.  
  23. SCREEN_PIXEL_START          equ $4000
  24. SCREEN_PIXEL_SIZE           equ $1800
  25.  
  26. SCREEN_ATTRIBUTE_START      equ $5800
  27. SCREEN_ATTRIBUTE_SIZE       equ $0300
  28.  
  29. SCREEN_BORDER_COLOR         equ $FE ; Last 3 bits defines color
  30.  
  31. BLACK_INK                   equ $00
  32. BLUE_INK                    equ $01
  33. RED_INK                     equ $02
  34. PURPLE_INK                  equ $03
  35. GREEN_INK                   equ $04
  36. CYAN_INK                    equ $05
  37. YELLOW_INK                  equ $06
  38. WHITE_INK                   equ $07
  39.  
  40. BLACK_PAPER                 equ BLACK_INK << 3
  41. BLUE_PAPER                  equ BLUE_INK << 3
  42. RED_PAPER                   equ RED_INK << 3
  43. PURPLE_PAPER                equ PURPLE_INK << 3
  44. GREEN_PAPER                 equ GREEN_INK << 3
  45. CYAN_PAPER                  equ CYAN_INK << 3
  46. YELLOW_PAPER                equ YELLOW_INK << 3
  47. WHITE_PAPER                 equ WHITE_INK << 3
  48.  
  49. FLASH                       equ $80
  50. BRIGHT                      equ $40
  51.  
  52. SCRATCH_ADDRESS1            equ $5CCB
  53. SCRATCH_ADDRESS2            equ $5CCD
  54. SCRATCH_ADDRESS3            equ $5CD3
  55. CURRENT_ROOM_ADDRESS        equ $5CCE
  56. CURRENT_ROOM_NUMBER         equ $5CD0
  57. CURRENT_SPRITE              equ $5CD4
  58. SPRITE_LENGTH               equ $5CD2
  59. BUG_COUNT                   equ $5FFF
  60. WALKER_COUNT                equ $5FFE
  61.  
  62. PLAYER_POS                  equ $5D00
  63. PLAYER_X                    equ $5D00
  64. PLAYER_Y                    equ $5D01
  65. PLAYER_VEL                  equ $5D02
  66. PLAYER_ANIM                 equ $5D03
  67. PLAYER_SPRITE               equ $5D04
  68. PLAYER_BX                   equ $5D06
  69. PLAYER_BY                   equ $5D07
  70.  
  71. MONSTER_START               equ $6000
  72. MONSTER_POS                 equ $6000
  73. MONSTER_X                   equ $6000
  74. MONSTER_Y                   equ $6001
  75. MONSTER_SPRITE              equ $6002
  76. MONSTER_DIR                 equ $6004
  77. MONSTER_SIZE                equ 5
  78.  
  79. ROOM_WIDTH                  equ 32
  80. ROOM_HEIGHT                 equ 18
  81. ROOM_SIZE                   equ 32*18
  82. SCREEN_HEIGHT               equ 24
  83. MAP_WIDTH                   equ 2
  84.  
  85. ;==============================================================
  86. ; Data
  87. ;==============================================================
  88. DATA_TILE_PIXELS:
  89.  
  90. DATA_SPRITES:
  91. DATA_ZIGGY_RIGHT:
  92. ; zniggy_0
  93. db %00011000>>0, %00011000<<8
  94. db %00111100>>0, %00111100<<8
  95. db %01111010>>0, %01111010<<8
  96. db %11111111>>0, %11111111<<8
  97. db %01110000>>0, %01110000<<8
  98. db %00111100>>0, %00111100<<8
  99. db %00011000>>0, %00011000<<8
  100. db %00111100>>0, %00111100<<8
  101.  
  102. db %01111110>>0, %01111110<<8
  103. db %11111111>>0, %11111111<<8
  104. db %01111110>>0, %01111110<<8
  105. db %00111100>>0, %00111100<<8
  106. db %00011000>>0, %00011000<<8
  107. db %00011000>>0, %00011000<<8
  108. db %00011000>>0, %00011000<<8
  109. db %00011110>>0, %00011110<<8
  110. ; zniggy_1
  111. db %00011000>>1, %00011000<<7
  112. db %00111100>>1, %00111100<<7
  113. db %01111010>>1, %01111010<<7
  114. db %11111111>>1, %11111111<<7
  115. db %01110000>>1, %01110000<<7
  116. db %00111100>>1, %00111100<<7
  117. db %00011000>>1, %00011000<<7
  118. db %00111100>>1, %00111100<<7
  119.  
  120. db %01111110>>1, %01111110<<7
  121. db %11111111>>1, %11111111<<7
  122. db %01111110>>1, %01111110<<7
  123. db %00111100>>1, %00111100<<7
  124. db %00011000>>1, %00011000<<7
  125. db %01101100>>1, %01101100<<7
  126. db %10000111>>1, %10000111<<7
  127. db %01000000>>1, %01000000<<7
  128. ; zniggy_2
  129. db %00011000>>2, %00011000<<6
  130. db %00111100>>2, %00111100<<6
  131. db %01111010>>2, %01111010<<6
  132. db %11111111>>2, %11111111<<6
  133. db %01110000>>2, %01110000<<6
  134. db %00111100>>2, %00111100<<6
  135. db %00011000>>2, %00011000<<6
  136. db %00111100>>2, %00111100<<6
  137.  
  138. db %01111110>>2, %01111110<<6
  139. db %11111111>>2, %11111111<<6
  140. db %01111110>>2, %01111110<<6
  141. db %00111100>>2, %00111100<<6
  142. db %00011000>>2, %00011000<<6
  143. db %00101001>>2, %00101001<<6
  144. db %01000110>>2, %01000110<<6
  145. db %10000100>>2, %10000100<<6
  146. ; zniggy_3
  147. db %00011000>>3, %00011000<<5
  148. db %00111100>>3, %00111100<<5
  149. db %01111010>>3, %01111010<<5
  150. db %11111111>>3, %11111111<<5
  151. db %01110000>>3, %01110000<<5
  152. db %00111100>>3, %00111100<<5
  153. db %00011000>>3, %00011000<<5
  154. db %00111100>>3, %00111100<<5
  155.  
  156. db %01111110>>3, %01111110<<5
  157. db %11111111>>3, %11111111<<5
  158. db %01111110>>3, %01111110<<5
  159. db %00111100>>3, %00111100<<5
  160. db %00011000>>3, %00011000<<5
  161. db %00101000>>3, %00101000<<5
  162. db %01010000>>3, %01010000<<5
  163. db %01011110>>3, %01011110<<5
  164.  
  165. ; zniggy_4
  166. db %00011000>>4, %00011000<<4
  167. db %00111100>>4, %00111100<<4
  168. db %01111010>>4, %01111010<<4
  169. db %11111111>>4, %11111111<<4
  170. db %01110000>>4, %01110000<<4
  171. db %00111100>>4, %00111100<<4
  172. db %00011000>>4, %00011000<<4
  173. db %00111100>>4, %00111100<<4
  174.  
  175. db %01111110>>4, %01111110<<4
  176. db %11111111>>4, %11111111<<4
  177. db %01111110>>4, %01111110<<4
  178. db %00111100>>4, %00111100<<4
  179. db %00011000>>4, %00011000<<4
  180. db %00011000>>4, %00011000<<4
  181. db %00011000>>4, %00011000<<4
  182. db %00011110>>4, %00011110<<4
  183. ; zniggy_5
  184. db %00011000>>5, %00011000<<3
  185. db %00111100>>5, %00111100<<3
  186. db %01111010>>5, %01111010<<3
  187. db %11111111>>5, %11111111<<3
  188. db %01110000>>5, %01110000<<3
  189. db %00111100>>5, %00111100<<3
  190. db %00011000>>5, %00011000<<3
  191. db %00111100>>5, %00111100<<3
  192.  
  193. db %01111110>>5, %01111110<<3
  194. db %11111111>>5, %11111111<<3
  195. db %01111110>>5, %01111110<<3
  196. db %00111100>>5, %00111100<<3
  197. db %00011000>>5, %00011000<<3
  198. db %01101100>>5, %01101100<<3
  199. db %10000111>>5, %10000111<<3
  200. db %01000000>>5, %01000000<<3
  201. ; zniggy_6
  202. db %00011000>>6, %00011000<<2
  203. db %00111100>>6, %00111100<<2
  204. db %01111010>>6, %01111010<<2
  205. db %11111111>>6, %11111111<<2
  206. db %01110000>>6, %01110000<<2
  207. db %00111100>>6, %00111100<<2
  208. db %00011000>>6, %00011000<<2
  209. db %00111100>>6, %00111100<<2
  210.  
  211. db %01111110>>6, %01111110<<2
  212. db %11111111>>6, %11111111<<2
  213. db %01111110>>6, %01111110<<2
  214. db %00111100>>6, %00111100<<2
  215. db %00011000>>6, %00011000<<2
  216. db %00101001>>6, %00101001<<2
  217. db %01000110>>6, %01000110<<2
  218. db %10000100>>6, %10000100<<2
  219. ; zniggy_7
  220. db %00011000>>7, %00011000<<1
  221. db %00111100>>7, %00111100<<1
  222. db %01111010>>7, %01111010<<1
  223. db %11111111>>7, %11111111<<1
  224. db %01110000>>7, %01110000<<1
  225. db %00111100>>7, %00111100<<1
  226. db %00011000>>7, %00011000<<1
  227. db %00111100>>7, %00111100<<1
  228.  
  229. db %01111110>>7, %01111110<<1
  230. db %11111111>>7, %11111111<<1
  231. db %01111110>>7, %01111110<<1
  232. db %00111100>>7, %00111100<<1
  233. db %00011000>>7, %00011000<<1
  234. db %00101000>>7, %00101000<<1
  235. db %01010000>>7, %01010000<<1
  236. db %01011110>>7, %01011110<<1
  237.  
  238.  
  239.  
  240. DATA_ZIGGY_LEFT:
  241. ; zniggy_0
  242. db %00011000>>0, %00011000<<8
  243. db %00111100>>0, %00111100<<8
  244. db %01011110>>0, %01011110<<8
  245. db %11111111>>0, %11111111<<8
  246. db %00001110>>0, %00001110<<8
  247. db %00111100>>0, %00111100<<8
  248. db %00011000>>0, %00011000<<8
  249. db %00111100>>0, %00111100<<8
  250.  
  251. db %01111110>>0, %01111110<<8
  252. db %11111111>>0, %11111111<<8
  253. db %01111110>>0, %01111110<<8
  254. db %00111100>>0, %00111100<<8
  255. db %00011000>>0, %00011000<<8
  256. db %00011000>>0, %00011000<<8
  257. db %00011000>>0, %00011000<<8
  258. db %01111000>>0, %01111000<<8
  259. ; zniggy_1
  260. db %00011000>>1, %00011000<<7
  261. db %00111100>>1, %00111100<<7
  262. db %01011110>>1, %01011110<<7
  263. db %11111111>>1, %11111111<<7
  264. db %00001110>>1, %00001110<<7
  265. db %00111100>>1, %00111100<<7
  266. db %00011000>>1, %00011000<<7
  267. db %00111100>>1, %00111100<<7
  268.  
  269. db %01111110>>1, %01111110<<7
  270. db %11111111>>1, %11111111<<7
  271. db %01111110>>1, %01111110<<7
  272. db %00111100>>1, %00111100<<7
  273. db %00011000>>1, %00011000<<7
  274. db %00110110>>1, %00110110<<7
  275. db %11100001>>1, %11100001<<7
  276. db %00000010>>1, %00000010<<7
  277. ; zniggy_2
  278. db %00011000>>2, %00011000<<6
  279. db %00111100>>2, %00111100<<6
  280. db %01011110>>2, %01011110<<6
  281. db %11111111>>2, %11111111<<6
  282. db %00001110>>2, %00001110<<6
  283. db %00111100>>2, %00111100<<6
  284. db %00011000>>2, %00011000<<6
  285. db %00111100>>2, %00111100<<6
  286.  
  287. db %01111110>>2, %01111110<<6
  288. db %11111111>>2, %11111111<<6
  289. db %01111110>>2, %01111110<<6
  290. db %00111100>>2, %00111100<<6
  291. db %00011000>>2, %00011000<<6
  292. db %10010100>>2, %10010100<<6
  293. db %01100010>>2, %01100010<<6
  294. db %00100001>>2, %00100001<<6
  295. ; zniggy_3
  296. db %00011000>>3, %00011000<<5
  297. db %00111100>>3, %00111100<<5
  298. db %01011110>>3, %01011110<<5
  299. db %11111111>>3, %11111111<<5
  300. db %00001110>>3, %00001110<<5
  301. db %00111100>>3, %00111100<<5
  302. db %00011000>>3, %00011000<<5
  303. db %00111100>>3, %00111100<<5
  304.  
  305. db %01111110>>3, %01111110<<5
  306. db %11111111>>3, %11111111<<5
  307. db %01111110>>3, %01111110<<5
  308. db %00111100>>3, %00111100<<5
  309. db %00011000>>3, %00011000<<5
  310. db %00010100>>3, %00010100<<5
  311. db %00001010>>3, %00001010<<5
  312. db %01111010>>3, %01111010<<5
  313.  
  314. ; zniggy_4
  315. db %00011000>>4, %00011000<<4
  316. db %00111100>>4, %00111100<<4
  317. db %01011110>>4, %01011110<<4
  318. db %11111111>>4, %11111111<<4
  319. db %00001110>>4, %00001110<<4
  320. db %00111100>>4, %00111100<<4
  321. db %00011000>>4, %00011000<<4
  322. db %00111100>>4, %00111100<<4
  323.  
  324. db %01111110>>4, %01111110<<4
  325. db %11111111>>4, %11111111<<4
  326. db %01111110>>4, %01111110<<4
  327. db %00111100>>4, %00111100<<4
  328. db %00011000>>4, %00011000<<4
  329. db %00011000>>4, %00011000<<4
  330. db %00011000>>4, %00011000<<4
  331. db %01111000>>4, %01111000<<4
  332. ; zniggy_5
  333. db %00011000>>5, %00011000<<3
  334. db %00111100>>5, %00111100<<3
  335. db %01011110>>5, %01011110<<3
  336. db %11111111>>5, %11111111<<3
  337. db %00001110>>5, %00001110<<3
  338. db %00111100>>5, %00111100<<3
  339. db %00011000>>5, %00011000<<3
  340. db %00111100>>5, %00111100<<3
  341.  
  342. db %01111110>>5, %01111110<<3
  343. db %11111111>>5, %11111111<<3
  344. db %01111110>>5, %01111110<<3
  345. db %00111100>>5, %00111100<<3
  346. db %00011000>>5, %00011000<<3
  347. db %00110110>>5, %00110110<<3
  348. db %11100001>>5, %11100001<<3
  349. db %00000010>>5, %00000010<<3
  350. ; zniggy_6
  351. db %00011000>>6, %00011000<<2
  352. db %00111100>>6, %00111100<<2
  353. db %01011110>>6, %01011110<<2
  354. db %11111111>>6, %11111111<<2
  355. db %00001110>>6, %00001110<<2
  356. db %00111100>>6, %00111100<<2
  357. db %00011000>>6, %00011000<<2
  358. db %00111100>>6, %00111100<<2
  359.  
  360. db %01111110>>6, %01111110<<2
  361. db %11111111>>6, %11111111<<2
  362. db %01111110>>6, %01111110<<2
  363. db %00111100>>6, %00111100<<2
  364. db %00011000>>6, %00011000<<2
  365. db %10010100>>6, %10010100<<2
  366. db %01100010>>6, %01100010<<2
  367. db %00100001>>6, %00100001<<2
  368. ; zniggy_7
  369. db %00011000>>7, %00011000<<1
  370. db %00111100>>7, %00111100<<1
  371. db %01011110>>7, %01011110<<1
  372. db %11111111>>7, %11111111<<1
  373. db %00001110>>7, %00001110<<1
  374. db %00111100>>7, %00111100<<1
  375. db %00011000>>7, %00011000<<1
  376. db %00111100>>7, %00111100<<1
  377.  
  378. db %01111110>>7, %01111110<<1
  379. db %11111111>>7, %11111111<<1
  380. db %01111110>>7, %01111110<<1
  381. db %00111100>>7, %00111100<<1
  382. db %00011000>>7, %00011000<<1
  383. db %00010100>>7, %00010100<<1
  384. db %00001010>>7, %00001010<<1
  385. db %01111010>>7, %01111010<<1
  386.  
  387.  
  388. DATA_BUG:
  389. db %00001100, %00110000
  390. db %00010011, %11001000
  391. db %00000011, %11000000
  392. db %00001111, %11110000
  393. db %00000101, %10100000
  394. db %10011110, %01111001
  395. db %01111000, %00011110
  396. db %00010110, %01101000
  397.  
  398. db %00010010, %01001000
  399. db %00010010, %01001000
  400. db %11110010, %01001111
  401. db %00110000, %00001100
  402. db %00111111, %11111100
  403. db %01001011, %11010010
  404. db %00000111, %11100000
  405. db %00000001, %10000000
  406.  
  407.  
  408. DATA_BLOCK_SPRITES:
  409. BLOCK_0:
  410. db %00000000
  411. db %00000000
  412. db %00000000
  413. db %00000000
  414. db %00000000
  415. db %00000000
  416. db %00000000
  417. db %00000000
  418. BLOCK_1:
  419. db %10110100
  420. db %11111111
  421. db %11111111
  422. db %11111111
  423. db %11111111
  424. db %11111111
  425. db %11111111
  426. db %11111111
  427. BLOCK_2:
  428. db %00000000
  429. db %00000000
  430. db %00000000
  431. db %00000000
  432. db %00000000
  433. db %00000000
  434. db %00000000
  435. db %00000000
  436. BLOCK_3:
  437. db %00011100
  438. db %00111111
  439. db %00111111
  440. db %01111111
  441. db %01111111
  442. db %01111111
  443. db %01111111
  444. db %00111111
  445. BLOCK_4:
  446. db %01110110
  447. db %11111111
  448. db %11111111
  449. db %11111111
  450. db %11111111
  451. db %11111111
  452. db %11111111
  453. db %11111111
  454. BLOCK_5:
  455. db %01100000
  456. db %11111000
  457. db %11111100
  458. db %11111000
  459. db %11111100
  460. db %11111110
  461. db %11111110
  462. db %11111100
  463. BLOCK_6:
  464. db %01111111
  465. db %01111111
  466. db %00111111
  467. db %00111111
  468. db %00111111
  469. db %01111111
  470. db %00111110
  471. db %00111100
  472. BLOCK_7:
  473. db %11111111
  474. db %11111111
  475. db %11111111
  476. db %11111111
  477. db %11111111
  478. db %11111111
  479. db %11111111
  480. db %01001110
  481. BLOCK_8:
  482. db %11111100
  483. db %11111110
  484. db %11111110
  485. db %11111100
  486. db %11111110
  487. db %11111110
  488. db %11111110
  489. db %11001000
  490. DATA_BLOCK_ATTRIBS:
  491. db BLACK_PAPER | BLACK_INK | BRIGHT
  492. db BLACK_PAPER | GREEN_INK | BRIGHT
  493. db GREEN_PAPER | GREEN_INK | BRIGHT
  494. db BLACK_PAPER | WHITE_INK | BRIGHT
  495. db BLACK_PAPER | WHITE_INK | BRIGHT
  496. db BLACK_PAPER | WHITE_INK | BRIGHT
  497. db BLACK_PAPER | WHITE_INK | BRIGHT
  498. db BLACK_PAPER | WHITE_INK | BRIGHT
  499. db BLACK_PAPER | WHITE_INK | BRIGHT
  500.  
  501. DATA_ROOMS:
  502. ROOM_0:
  503. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  504. db 0,3,4,4,5,0,0,0,0,0,0,0,0,3,4,4,4,4,5,0,0,0,0,0,0,0,3,4,4,5,0,0
  505. db 0,6,7,7,8,0,0,3,4,5,0,0,0,6,7,7,7,7,8,0,0,3,5,0,0,0,6,7,7,8,0,0
  506. db 0,0,0,0,0,0,0,6,7,8,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0
  507. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  508. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  509. db 0,0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  510. db 0,0,0,0,0,0,0,0,0,0,0,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  511. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  512. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  513. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  514. db 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  515. db 0,0,0,0,1,2,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  516. db 0,0,0,1,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0
  517. db 0,0,1,2,2,2,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,1,0,0
  518. db 1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1
  519. db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  520. db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  521. ;Monsters
  522. db 6,2
  523. db 64, 70, DATA_BUG, DATA_BUG>>8, 1
  524. db 88, 70, DATA_BUG, DATA_BUG>>8, 1
  525. db 104, 70, DATA_BUG, DATA_BUG>>8, 1
  526. db 120, 70, DATA_BUG, DATA_BUG>>8, 1
  527. db 136, 70, DATA_BUG, DATA_BUG>>8, 1
  528. db 152, 70, DATA_BUG, DATA_BUG>>8, 1
  529. db 160, 103, DATA_ZIGGY_LEFT, DATA_ZIGGY_LEFT>>8, 1
  530. db 160, 95, DATA_ZIGGY_LEFT, DATA_ZIGGY_LEFT>>8, 1
  531.  
  532. ROOM_1:
  533. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  534. db 0,3,4,4,4,4,4,5,0,0,0,0,0,3,4,4,4,4,5,0,0,0,0,0,0,0,3,4,4,5,0,0
  535. db 0,6,7,7,7,7,7,8,0,0,0,0,0,6,7,7,7,7,8,0,0,0,0,0,0,0,6,7,7,8,0,0
  536. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  537. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  538. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0
  539. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0
  540. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  541. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0
  542. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0
  543. db 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  544. db 0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  545. db 0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  546. db 0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0
  547. db 0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,1,1,1,2,2,2,1,0,0
  548. db 1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,1,1,2,2,2,2,2,2,2,1,1
  549. db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2
  550. db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2
  551.  
  552. db 4,0
  553. db 40, 70, DATA_BUG, DATA_BUG>>8, 1
  554. db 88, 35, DATA_BUG, DATA_BUG>>8, 1
  555. db 184, 35, DATA_BUG, DATA_BUG>>8, 1
  556. db 168, 70, DATA_BUG, DATA_BUG>>8, 1
  557.  
  558. ROOM_2:
  559. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  560. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  561. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  562. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  563. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  564. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  565. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  566. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  567. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  568. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  569. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  570. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  571. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  572. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  573. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  574. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  575. db 0,3,4,4,4,4,4,4,4,5,0,0,0,3,4,4,4,4,4,5,0,0,0,0,0,0,3,4,4,5,0,0
  576. db 0,6,7,7,7,7,7,7,7,8,0,0,0,6,7,7,7,7,7,8,0,0,0,0,0,0,6,7,7,8,0,0
  577.  
  578. db 0,0
  579.  
  580. ROOM_3:
  581. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  582. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  583. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  584. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  585. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  586. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  587. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  588. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  589. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  590. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  591. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  592. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  593. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  594. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  595. db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  596. db 0,3,4,4,5,0,0,0,0,0,0,0,0,3,4,4,4,4,5,0,0,0,0,0,3,4,4,4,4,4,5,0
  597. db 0,6,7,7,8,0,0,3,4,5,0,0,0,6,7,7,7,7,8,0,0,3,5,0,6,7,7,7,7,7,8,0
  598. db 0,0,0,0,0,0,0,6,7,8,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0
  599.  
  600. db 0,0
  601.  
  602. DATA_ROOM_LIST:
  603. db ROOM_0>>8, ROOM_0, ROOM_1>>8, ROOM_1
  604. db ROOM_2>>8, ROOM_2, ROOM_3>>8, ROOM_3
  605.  
  606.  
  607. ;==============================================================
  608. ; Utility Functions
  609. ;==============================================================
  610.  
  611. ;--------------------------------------------------------------
  612. PROC
  613. proc_clear_screen_pixels
  614. ;--------------------------------------------------------------
  615.     ; IN: -
  616.     ; OUT: -
  617.     ; Affects hl, de, bc
  618.  
  619.     ld hl, SCREEN_PIXEL_START
  620.     ld de, SCREEN_PIXEL_START + 1
  621.     ld bc, SCREEN_PIXEL_SIZE - 1
  622.     ld (hl), 0
  623.     ldir
  624. ret
  625. ENDP
  626.  
  627. ;--------------------------------------------------------------
  628. PROC
  629. proc_fill_screen_attribute:
  630. ;--------------------------------------------------------------
  631.     ; IN:   a = attribute
  632.     ; OUT:  -  
  633.     ; AFFECTS: hl, de, bc
  634.  
  635.     ld hl, SCREEN_ATTRIBUTE_START
  636.     ld de, SCREEN_ATTRIBUTE_START + 1
  637.     ld bc, SCREEN_ATTRIBUTE_SIZE - 1
  638.     ld (hl), a
  639.     ldir
  640. ret
  641. ENDP
  642.  
  643. ;-------------------------------------------------------------
  644. PROC
  645. proc_get_screen_attribute_address:
  646. ;-------------------------------------------------------------
  647.     ; IN: b = y-cell coord (0..23), c: x-cell coord (0..31)
  648.     ; OUT: hl = attribute address
  649.     ; AFFECTS: hl, de, a
  650.    
  651.     ; Explanation
  652.     ; b = -- -- -- y4 y3 y2 y1 y0
  653.     ; c = -- -- -- x4 x3 x2 x1 x0
  654.     ; hl = addr + y * 32 + x = addr + de
  655.     ; y7 y6 y5 and x7 x6 x5 are all zero since x,y<32
  656.     ; de = -- -- -- -- -- -- y4 y3|y2 y1 y0 x4 x3 x2 x1 x0
  657.     ;      -----------d-----------|------------e----------
  658.  
  659.     ; put y4 y3 into lower two bits in d
  660.     ld a, b
  661.     and $18
  662.     sra a
  663.     sra a
  664.     sra a
  665.     ld d, a
  666.  
  667.     ; put y2..y0 in upper bits of e
  668.     ld a, b
  669.     sla a
  670.     sla a
  671.     sla a
  672.     sla a
  673.     sla a
  674.  
  675.     ; put x4...x0 in lower bits of e
  676.     add a, c
  677.     ld e, a
  678.  
  679.     ld hl, SCREEN_ATTRIBUTE_START
  680.     add hl, de
  681. ret
  682. ENDP
  683.  
  684. ;-------------------------------------------------------------
  685. PROC
  686. proc_get_screen_pixel_address:
  687. ;-------------------------------------------------------------
  688.     ; IN: b = y-pixel coord (0..191), c: x-cell coord (0..31)
  689.     ; OUT: hl = screen address
  690.     ; AFFECTS: hl, de, a
  691.  
  692.     ld a, b         ; Work on the upper byte of the address
  693.     and %00000111   ; a = Y2 Y1 y0
  694.     or %01000000    ; first three bits are always 010
  695.     ld h,a          ; store in h
  696.     ld a,b          ; get bits Y7, Y6
  697.     rra             ; move them into place
  698.     rra             ;
  699.     rra             ;
  700.     and %00011000   ; mask off
  701.     or h            ; a = 0 1 0 Y7 Y6 Y2 Y1 Y0
  702.     ld h,a          ; calculation of h is now complete
  703.     ld a,b          ; get y
  704.     rla             ;
  705.     rla             ;
  706.     and %11100000   ; a = y5 y4 y3 0 0 0 0 0
  707.     ld l,a          ; store in l
  708.     ld a,c          ;
  709.     and %00011111   ; a = X4 X3 X2 X1
  710.     or l            ; a = Y5 Y4 Y3 X4 X3 X2 X1
  711.     ld l,a          ; calculation of l is complete
  712. ret
  713. ENDP
  714.  
  715.  
  716. ;-------------------------------------------------------------
  717. PROC
  718. proc_get_cell_coord:
  719. ;-------------------------------------------------------------
  720.     ; IN: b = y-pixel coord (0..191), c: x-pixel coord (0..248)
  721.     ; OUT: b = y-cell coord (0..23), c: x-pixel coord (0..31)
  722.     ; AFFECTS: a, b, c
  723.     ld a,b
  724.     ccf
  725.     and %11111000
  726.     rra
  727.     rra
  728.     rra
  729.     ld b,a
  730.     ld a,c
  731.     and %11111000
  732.     rra
  733.     rra
  734.     rra
  735.     ld c,a
  736. ret
  737. ENDP
  738.  
  739. ;-------------------------------------------------------------
  740. PROC
  741. proc_get_cell_index:
  742. ;-------------------------------------------------------------
  743.     ; IN: b = y-cell coord (0..23), c: x-pixel coord (0..31)
  744.     ; OUT: hl = cell index (0..767)
  745.     ; AFFECTS: a, b, c, hl
  746.     ld a,b
  747.     ccf
  748.     and %11111000
  749.     rra
  750.     rra
  751.     rra
  752.     ld b,a
  753.     ld a,c
  754.     and %11111000
  755.     rra
  756.     rra
  757.     rra
  758.     ld c,a
  759. ret
  760. ENDP
  761.  
  762.  
  763. ;-------------------------------------------------------------
  764. PROC
  765. proc_move_player_right:
  766. ;-------------------------------------------------------------
  767.     inc b
  768.     inc d
  769.     ld hl, DATA_ZIGGY_RIGHT
  770.     ld (PLAYER_SPRITE), hl
  771. ret
  772. ENDP
  773.  
  774. ;-------------------------------------------------------------
  775. PROC
  776. proc_move_player_left:
  777. ;-------------------------------------------------------------
  778.     dec b
  779.     inc d
  780.     ld hl, DATA_ZIGGY_LEFT
  781.     ld (PLAYER_SPRITE), hl
  782. ret
  783. ENDP
  784.  
  785. ;-------------------------------------------------------------
  786. PROC
  787. proc_move_player_out_walls:
  788. ;-------------------------------------------------------------
  789.     ld a,(PLAYER_X)
  790.     rra
  791.     rra
  792.     rra
  793.     and %00011111
  794.     ld c,a
  795.     ld a,(PLAYER_Y)
  796.     add a,16
  797.     ld b,a
  798.     push bc
  799.     call proc_get_block_index
  800.     ld a,(hl)
  801.     cp 0
  802.     jr z, proc_move_player_out_walls2
  803.     ld a,(PLAYER_X)
  804.     and %11111000
  805.     add a,8
  806.     ld (PLAYER_X),a
  807. proc_move_player_out_walls2:
  808.     pop bc
  809.     push bc
  810.     inc c
  811.     call proc_get_block_index
  812.     ld a,(hl)
  813.     cp 0
  814.     jr z, proc_move_player_out_walls3
  815.     ld a,(PLAYER_X)
  816.     and %11111000
  817.     dec a
  818.     ld (PLAYER_X),a
  819. proc_move_player_out_walls3:
  820.     pop bc
  821.     ld a,b
  822.     sub 18
  823.     ret c
  824.     ld b,a
  825.     call proc_get_block_index
  826.     ld a,(hl)
  827.     cp 0
  828.     ret z
  829.     ld a,(PLAYER_VEL)
  830.     xor a
  831.     ld (PLAYER_VEL),a
  832. ret
  833. ENDP
  834.  
  835. ;-------------------------------------------------------------
  836. PROC
  837. proc_check_transition:
  838. ;-------------------------------------------------------------
  839.     ld a,(PLAYER_X)
  840.     ld b,a
  841.     ld a, 246
  842.     cp b
  843.     jr nc, proc_check_transition2
  844.     ld a,8
  845.     ld (PLAYER_X),a
  846.     ld a,(CURRENT_ROOM_NUMBER)
  847.     inc a
  848.     and MAP_WIDTH-1
  849.     ld c,a
  850.     ld a,(CURRENT_ROOM_NUMBER)
  851.     and ~(MAP_WIDTH-1)
  852.     add a,c
  853.     ld (CURRENT_ROOM_NUMBER),a
  854.     call proc_load_map
  855.     ret
  856. proc_check_transition2:
  857.     ld a,2
  858.     cp b
  859.     jr c, proc_check_transition3
  860.     ld a,240
  861.     ld (PLAYER_X),a
  862.     ld a,(CURRENT_ROOM_NUMBER)
  863.     dec a
  864.     and MAP_WIDTH-1
  865.     ld c,a
  866.     ld a,(CURRENT_ROOM_NUMBER)
  867.     and ~(MAP_WIDTH-1)
  868.     add a,c
  869.     ld (CURRENT_ROOM_NUMBER),a
  870.     call proc_load_map
  871.     ret
  872. proc_check_transition3:
  873.     ld a,(PLAYER_Y)
  874.     ld b,a
  875.     ld a,124
  876.     cp b
  877.     jr nc, proc_check_transition4
  878.     ld a, 8
  879.     ld (PLAYER_Y),a
  880.     ld a,(CURRENT_ROOM_NUMBER)
  881.     sub MAP_WIDTH
  882.     ld (CURRENT_ROOM_NUMBER),a
  883.     call proc_load_map
  884.     ret
  885. proc_check_transition4:
  886.     ld a,2
  887.     cp b
  888.     ret c
  889.     ld a, 111
  890.     ld (PLAYER_Y),a
  891.     ld a,(CURRENT_ROOM_NUMBER)
  892.     add a,MAP_WIDTH
  893.     ld (CURRENT_ROOM_NUMBER),a
  894.     call proc_load_map
  895. ret
  896. ENDP
  897.  
  898. ;-------------------------------------------------------------
  899. PROC
  900. proc_update_player:
  901. ;-------------------------------------------------------------
  902.     ; AFFECTS: hl, de, a, b
  903.     ld bc, &FDFE
  904.     ld d,0
  905.     in a,(c)
  906.     ld (SCRATCH_ADDRESS1),a
  907.     bit 2,a
  908.     ld hl, PLAYER_X
  909.     ld b,(hl)
  910.     call z, proc_move_player_right
  911.     bit 0,a
  912.     call z, proc_move_player_left
  913. proc_update_player_vel:
  914.     ld hl, PLAYER_X
  915.     ld (hl),b
  916.     inc hl
  917.     ld b,(hl)
  918.     inc hl
  919.     ld a,(hl)
  920.     inc a
  921.     cp 6
  922.     jr nz, proc_update_player_cap
  923.     ld a,5
  924. proc_update_player_cap:
  925.     push de
  926.     push bc
  927.     push hl
  928.     push af
  929.     add a,1
  930.     ld a,(PLAYER_X)
  931.     add a,4
  932.     rra
  933.     rra
  934.     rra
  935.     and %00011111
  936.     ld c,a 
  937.     ld a,(PLAYER_Y)
  938.     add a,23
  939.     and %11111000
  940.     ld b,a
  941.     call proc_get_block_index
  942.     ld d,(hl)
  943.     pop af
  944.     inc d
  945.     dec d
  946.     ld (SCRATCH_ADDRESS2),a
  947.     jr z, proc_update_player_reset_vel
  948.     pop hl
  949.     pop bc
  950.     ld a,b
  951.     or %00000111
  952.     ld b,a
  953.     push bc
  954.     push hl
  955.     xor a
  956.     ld (SCRATCH_ADDRESS2),a
  957.     ld bc,&FBFE
  958.     in a,(c)
  959.     bit 1,a
  960.     jr nz, proc_update_player_reset_vel
  961.     ld a,248
  962.     ld (SCRATCH_ADDRESS2),a
  963.    
  964. proc_update_player_reset_vel:
  965.     ld a,(SCRATCH_ADDRESS2)
  966.     pop hl
  967.     pop bc
  968.     pop de
  969.     ld (hl),a
  970.     dec hl
  971.     add a,b
  972.     ld (hl),a
  973.    
  974. proc_update_player_anim:
  975.     ld hl,PLAYER_ANIM
  976.     ld a,d
  977.     cp 0
  978.     jr nz,proc_update_player_anim_r
  979.     ld (hl),0
  980.     jr proc_update_player_end
  981. proc_update_player_anim_r:
  982.     inc (hl)
  983.     ld a,16
  984.     cp (hl)
  985.     jr nz, proc_update_player_end
  986.     ld (hl),0
  987. proc_update_player_end:
  988.     call proc_move_player_out_walls
  989.     call proc_check_transition
  990. ret
  991. ENDP
  992.  
  993.  
  994. ;-------------------------------------------------------------
  995. PROC
  996. proc_update_bugs:
  997. ;-------------------------------------------------------------
  998.     push ix
  999.     ld ix,MONSTER_X
  1000.     ld a,(BUG_COUNT)
  1001.     cp 0
  1002.     jr z,proc_update_bugs_end
  1003. proc_update_bugs_loop:
  1004.     push af
  1005.     ld a,(ix)
  1006.     rra
  1007.     rra
  1008.     rra
  1009.     and %00011111
  1010.     ld c,a
  1011.     ld a,(ix+4)
  1012.     cp 0
  1013.     jr nz, proc_update_bugs2
  1014.     ld a,(ix+1)
  1015.     inc a
  1016.     ld (ix+1),a
  1017.     add a,17
  1018.     ld b,a
  1019.     jr proc_update_bugs3
  1020. proc_update_bugs2:
  1021.     ld a,(ix+1)
  1022.     dec a
  1023.     ld (ix+1),a
  1024.     sub 2
  1025.     ld b,a
  1026. proc_update_bugs3:
  1027.     call proc_get_block_index
  1028.     ld a,(hl)
  1029.     cp 0
  1030.     jr nz, proc_update_bugs4
  1031.     ld a,(ix+1)
  1032.     cp 1
  1033.     jr z, proc_update_bugs4
  1034.     cp 127
  1035.     jr z, proc_update_bugs4
  1036.     jr proc_update_bugs_loop_end
  1037. proc_update_bugs4:
  1038.     ld a,(ix+4)
  1039.     ld b,a
  1040.     ld a,1
  1041.     sub b
  1042.     ld (ix+4),a
  1043. proc_update_bugs_loop_end
  1044.     ld de,5
  1045.     add ix,de
  1046.     pop af
  1047.     dec a
  1048.     jr nz,proc_update_bugs_loop
  1049. proc_update_bugs_end:
  1050.     pop ix
  1051. ret
  1052. ENDP
  1053.  
  1054.  
  1055. ;-------------------------------------------------------------
  1056. PROC
  1057. proc_update_walkers:
  1058. ;-------------------------------------------------------------
  1059.     ld a,(BUG_COUNT)
  1060.     ld b,a
  1061.     rla
  1062.     rla
  1063.     add a,b
  1064.     ld b,0
  1065.     ld c,a
  1066.     push ix
  1067.     ld ix,MONSTER_POS
  1068.     add ix,bc ; ix now contains the first address of walkers
  1069.     ld a,(WALKER_COUNT)
  1070.     cp 0
  1071.     jr z,proc_update_walkers_loop_end
  1072.     ld b,a
  1073. proc_update_walkers_loop:
  1074.     push bc
  1075.     ld a,(ix+4)
  1076.     cp 0
  1077.     ld a,(ix)
  1078.     jr nz, proc_update_walkers_2
  1079.     inc a
  1080.     ld (ix),a
  1081.     add a,9
  1082.     jr proc_update_walkers_3
  1083. proc_update_walkers_2:
  1084.     dec a
  1085.     ld (ix),a
  1086.     dec a
  1087. proc_update_walkers_3:
  1088.     rra
  1089.     rra
  1090.     rra
  1091.     and %00011111
  1092.     ld c,a
  1093.     ld a,(ix+1)
  1094.     add a,9
  1095.     ld b,a
  1096.     call proc_get_block_index
  1097.     ld a,(hl)
  1098.     cp 0
  1099.     jr z, proc_update_walkers_end
  1100.     ld b,(ix+4)
  1101.     ld a,1
  1102.     sub b
  1103.     ld (ix+4),a
  1104. proc_update_walkers_end:
  1105.     pop bc
  1106.     ld de,MONSTER_SIZE
  1107.     add ix,de
  1108.     dec b
  1109.     jr nz,proc_update_walkers_loop
  1110. proc_update_walkers_loop_end:
  1111.    
  1112.  
  1113.     pop ix
  1114. ret
  1115. ENDP
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121. ;-------------------------------------------------------------
  1122. PROC
  1123. proc_draw_sprite:
  1124. ;-------------------------------------------------------------
  1125.     ;Input: b: y-position, c: x-position, d: sprite attribute ix: sprite address
  1126.     ;Affects: Everything
  1127.    
  1128. ;Get sprite address from x value
  1129.     ld a,c
  1130.     rla
  1131.     rla
  1132.     rla
  1133.     rla
  1134.     rla
  1135.     and %11100000
  1136.     push bc
  1137.     ld b,0
  1138.     ld c,a
  1139.     add ix,bc ;ix now contains the sprite address
  1140.     pop bc
  1141.     ld a,c
  1142.     rra
  1143.     rra
  1144.     rra
  1145.     and %00011111
  1146.     ld c,a
  1147.    
  1148.     push bc
  1149.     push de
  1150.     ld a,b
  1151.     rra
  1152.     rra
  1153.     rra
  1154.     and %00011111
  1155.     ld b,a
  1156.     call proc_get_screen_attribute_address
  1157.     pop de
  1158.     ld bc,32
  1159.     ld a,d
  1160.     ld (hl),a
  1161.     inc hl
  1162.     ld (hl),a
  1163.     add hl,bc
  1164.     ld (hl),a
  1165.     dec hl
  1166.     ld (hl),a
  1167.     add hl,bc
  1168.     ld (hl),a
  1169.     inc hl
  1170.     ld (hl),a
  1171.     pop bc
  1172.    
  1173.     ld d,16
  1174. proc_draw_sprite_loop:
  1175.     push de
  1176.     call proc_get_screen_pixel_address
  1177.     ld a,(ix)
  1178.     ld (hl),a
  1179.     inc hl
  1180.     inc ix
  1181.     ld a,(ix)
  1182.     ld (hl),a  
  1183.     inc hl
  1184.     inc ix
  1185.     pop de
  1186.     inc b
  1187.     dec d
  1188.     jr nz, proc_draw_sprite_loop
  1189. ret
  1190. ENDP
  1191.  
  1192.  
  1193. ;-------------------------------------------------------------
  1194. PROC
  1195. proc_draw_sprites:
  1196. ;-------------------------------------------------------------
  1197.     ; AFFECTS: everything
  1198.     ; Draws player
  1199.    
  1200.  
  1201.     ld bc,(PLAYER_POS)
  1202.     ld ix,(PLAYER_SPRITE)
  1203.     ld d,BLACK_PAPER | PURPLE_INK | BRIGHT
  1204.     call proc_draw_sprite  
  1205.    
  1206.     ld iy,MONSTER_X
  1207.     ld a,(BUG_COUNT)
  1208.     ld b,a
  1209.     ld a,(WALKER_COUNT)
  1210.     add a,b
  1211.     cp 0
  1212.     jr z,proc_draw_sprites_bugs_end
  1213.     ld b,a
  1214.     ld a,0
  1215.     ld (SCRATCH_ADDRESS3),a
  1216. proc_draw_sprites_loop:
  1217.     ld a,b
  1218.     push bc
  1219.     ld a,(iy)
  1220.     ld c,a
  1221.     ld a,(iy+1)
  1222.     ld b,a
  1223.     ld a,(iy+2)
  1224.     ld (CURRENT_SPRITE),a
  1225.     ld a,(iy+3)
  1226.     ld (CURRENT_SPRITE+1),a
  1227.     ld ix,(CURRENT_SPRITE)
  1228.     ld d,BLACK_PAPER | YELLOW_INK | BRIGHT
  1229.     call proc_draw_sprite
  1230.     ld bc,MONSTER_SIZE
  1231.     add iy,bc
  1232.     pop bc
  1233.     dec b
  1234.     jr nz,proc_draw_sprites_loop
  1235. proc_draw_sprites_bugs_end:
  1236. ret
  1237. ENDP
  1238.  
  1239.  
  1240. ;-------------------------------------------------------------
  1241. PROC
  1242. proc_get_block_index:
  1243. ;-------------------------------------------------------------
  1244.     ; IN: b = y-pixel coord (0..191), c: x-cell coord (0..31)
  1245.     ; OUT: hl = block address
  1246.     ; AFFECTS: a,bc,hl
  1247.     ld a,b
  1248.     and %11111000
  1249.     ld b,0
  1250.     ld hl,(CURRENT_ROOM_ADDRESS)
  1251.     rla
  1252.     rl b
  1253.     rla
  1254.     rl b
  1255.     add a,c
  1256.     ld c,a
  1257.     xor a
  1258.     adc a,b
  1259.     add hl,bc
  1260. ret
  1261. ENDP   
  1262.  
  1263. ;-------------------------------------------------------------
  1264. PROC
  1265. proc_draw_block:
  1266. ;-------------------------------------------------------------
  1267.     ; AFFECTS: everything
  1268.     call proc_get_screen_attribute_address
  1269.     ld (SCRATCH_ADDRESS1),hl
  1270.     ld a,b
  1271.     ld b,0
  1272.     rla
  1273.     rla
  1274.     rla
  1275.     and %11111000
  1276.     ld b,a
  1277.     call proc_get_screen_pixel_address
  1278.     push hl
  1279.     call proc_get_block_index
  1280.     ld a,(hl) ; Get block number
  1281.     ld hl,DATA_BLOCK_ATTRIBS
  1282.     push af ; Store block number
  1283.     push bc
  1284.     ld b,0
  1285.     ld c,a
  1286.     ld de,(SCRATCH_ADDRESS1)
  1287.     add hl,bc
  1288.     ld a,(hl)
  1289.     ld (de),a
  1290.     pop bc
  1291.     pop af
  1292.     rla
  1293.     rla
  1294.     rla
  1295.     ld bc,0
  1296.     ld c,a
  1297.     ld hl,BLOCK_0
  1298.     add hl,bc
  1299.     ld b,h
  1300.     ld c,l
  1301.     pop hl
  1302.     ld d,8
  1303. proc_draw_block_loop:
  1304.     ld a,(bc)
  1305.     ld (hl),a
  1306.     inc bc
  1307.     push de
  1308.     ld de,32*8
  1309.     add hl,de
  1310.     pop de
  1311.     dec d
  1312.     jr nz, proc_draw_block_loop
  1313. ret
  1314. ENDP
  1315.    
  1316. ;-------------------------------------------------------------
  1317. PROC
  1318. proc_draw_blocks:
  1319. ;-------------------------------------------------------------
  1320.     ; AFFECTS: everything
  1321.     ld bc,0
  1322. proc_draw_blocks_loop:
  1323.     push bc
  1324.     call proc_draw_block
  1325.     pop bc
  1326.     inc c
  1327.     ld a,32
  1328.     cp c
  1329.     jr nz,proc_draw_blocks_loop
  1330.     ld c,0
  1331.     inc b
  1332.     ld a,ROOM_HEIGHT
  1333.     cp b
  1334.     jr nz,proc_draw_blocks_loop
  1335. ret
  1336. ENDP
  1337.  
  1338. ;-------------------------------------------------------------
  1339. PROC
  1340. proc_redraw_blocks:
  1341. ;-------------------------------------------------------------
  1342.     ; AFFECTS: everything
  1343.     ld bc,(PLAYER_POS)
  1344.     ld a,b
  1345.     rra
  1346.     rra
  1347.     rra
  1348.     and %00011111
  1349.     ld b,a
  1350.     ld a,c
  1351.     rra
  1352.     rra
  1353.     rra
  1354.     and %00011111
  1355.     ld c,a
  1356.     push bc
  1357.     call proc_draw_block
  1358.     pop bc
  1359.     inc c
  1360.     push bc
  1361.     call proc_draw_block
  1362.     pop bc
  1363.     inc b
  1364.     push bc
  1365.     call proc_draw_block
  1366.     pop bc
  1367.     dec c
  1368.     push bc
  1369.     call proc_draw_block
  1370.     pop bc
  1371.     inc b
  1372.     push bc
  1373.     call proc_draw_block
  1374.     pop bc
  1375.     inc c
  1376.     call proc_draw_block
  1377.    
  1378.     ld iy,MONSTER_START
  1379.     ld a,(BUG_COUNT)
  1380.     cp 0
  1381.     jr z, proc_redraw_blocks_bugs_end
  1382.     ld b,a
  1383. proc_redraw_blocks_loop:
  1384.     push bc
  1385.     ld a,(iy)
  1386.     rra
  1387.     rra
  1388.     rra
  1389.     and %00011111
  1390.     ld c,a
  1391.     ld a,(iy+1)
  1392.     dec a
  1393.     ld b,a
  1394.     ld a,(iy+4)
  1395.     cp 0
  1396.     jr z,proc_redraw_blocks2
  1397.     ld a,b
  1398.     add a,17
  1399.     ld b,a
  1400. proc_redraw_blocks2:
  1401.     push bc
  1402.     call proc_get_block_index
  1403.     pop bc
  1404.     ld (CURRENT_SPRITE),hl
  1405.     ld ix,(CURRENT_SPRITE)
  1406.     call proc_get_screen_pixel_address
  1407.     ld a,(ix)
  1408.     ld (hl),a
  1409.     inc ix
  1410.     inc hl
  1411.     ld a,(ix)
  1412.     ld (hl),a
  1413.     ld de,MONSTER_SIZE
  1414.     add iy,de
  1415.     pop bc
  1416.     dec b
  1417.     jr nz,proc_redraw_blocks_loop
  1418. proc_redraw_blocks_bugs_end:
  1419.     ld a,(WALKER_COUNT)
  1420.     cp 0
  1421.     jr z,proc_redreaw_blocks_walkers_end
  1422.     ld b,a
  1423. proc_redraw_blocks_loop2:
  1424.     push bc
  1425.     ld a,(iy)
  1426.     and %00000111
  1427.     jr nz, proc_redraw_blocks_loop2_end
  1428.     ld a,(iy)
  1429.     dec a
  1430.     rra
  1431.     rra
  1432.     rra
  1433.     and %00011111
  1434.     ld c,a
  1435.     ld a,(iy+1)
  1436.     rra
  1437.     rra
  1438.     rra
  1439.     and %00011111
  1440.     ld b,a
  1441.     inc b
  1442.     push bc
  1443.     call proc_draw_block
  1444.     pop bc
  1445.     inc b
  1446.     call proc_draw_block
  1447. proc_redraw_blocks_loop2_end:
  1448.     pop bc
  1449.     ld de, 5
  1450.     add iy,de
  1451.     dec b
  1452.     jr nz,proc_redraw_blocks_loop2
  1453. proc_redreaw_blocks_walkers_end:
  1454. ret
  1455. ENDP
  1456.  
  1457.  
  1458. ;-------------------------------------------------------------
  1459. PROC
  1460. proc_load_map:
  1461. ;-------------------------------------------------------------
  1462.     ; AFFECTS: everything
  1463.     ld b,0
  1464.     ld a,(CURRENT_ROOM_NUMBER)
  1465.     rla
  1466.     and %00000110
  1467.     ld c,a
  1468.     ld hl,DATA_ROOM_LIST
  1469.     add hl,bc
  1470.     ld b,(hl)
  1471.     inc hl
  1472.     ld c,(hl)
  1473.     ld (CURRENT_ROOM_ADDRESS),bc
  1474.    
  1475.     push bc
  1476.     call proc_draw_blocks
  1477.     pop hl
  1478.     ld bc,ROOM_SIZE
  1479.     add hl,bc
  1480.     ld a,(hl)
  1481.     ld de,MONSTER_START
  1482.     ld (BUG_COUNT),a
  1483.     ld b,a
  1484.     inc hl
  1485.     ld a,(hl)
  1486.     ld (WALKER_COUNT),a
  1487.     add a,b
  1488.    
  1489.     inc a
  1490.     ld b,a
  1491.     rla
  1492.     rla
  1493.     add a,b
  1494.     ld b,0
  1495.     ld c,a
  1496.     inc c
  1497.     inc hl
  1498.     ldir   
  1499. ret
  1500. ENDP
  1501.  
  1502.  
  1503. ;==============================================================
  1504. ; Initialization
  1505. ;==============================================================
  1506. start:
  1507.     ld a, BLUE_PAPER | WHITE_INK
  1508.     call proc_fill_screen_attribute
  1509.     ld hl, PLAYER_POS
  1510.     ld a, 40
  1511.     ld (hl),a
  1512.     ld a, 24d
  1513.     inc hl
  1514.     ld (hl),a
  1515.     xor a
  1516.     inc hl
  1517.     ld (hl),a
  1518.     ld hl, PLAYER_ANIM
  1519.     ld (hl),a
  1520.     ld hl, DATA_ZIGGY_RIGHT
  1521.     ld (PLAYER_SPRITE), hl
  1522.     ld hl, CURRENT_ROOM_NUMBER
  1523.     ld (hl),0
  1524.    
  1525.     call proc_load_map
  1526. loopyboy:
  1527.     halt
  1528.     call proc_redraw_blocks
  1529.     call proc_update_player
  1530.     call proc_draw_sprites
  1531.     call proc_update_bugs
  1532.     call proc_update_walkers
  1533.     jr loopyboy
  1534. ret
  1535. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement