Conway's Game of Life - 3D 68000er Assembler-Code für 8x8x8 Game of Life.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

core_00.s 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. poly_fil:
  2. filxbuf:
  3. move.w no_in,d7
  4. beq fil_end
  5. lea crds_in,a3
  6. subq.w #1,d7
  7. move.w #399,d5
  8. clr.w d6
  9. filbuf1:
  10. lea xbuf,a2
  11. addq.l #2,a2
  12. move.w (a3)+,d0
  13. move.w (a3)+,d1
  14. move.w (a3)+,d2
  15. move.w (a3)+,d3
  16. subq.l #4,a3
  17. cmp.w d5,d1
  18. bge filbuf3
  19. move.w d1,d5
  20. filbuf3:
  21. cmp.w d1,d6
  22. bge filbuf5
  23. move.w d1,d6
  24. filbuf5:
  25. exg.l d5,a5
  26. exg.l d6,a6
  27. clr.w d4
  28. moveq #1,d6
  29. cmp.w d1,d3
  30. beq y_limits
  31. bgt ascend
  32. exg.l d0,d2
  33. exg.l d1,d3
  34. subq.l #2,a2
  35. ascend:
  36. sub.w d1,d3
  37. lsl.w #2,d1
  38. ; adda.w d1,a2
  39. lea 0(a2,d1.w),a2
  40. sub.w d0,d2
  41. beq vertical
  42. bgt pos_slope
  43. neg.w d6
  44. neg.w d2
  45. pos_slope:
  46. cmp.w d2,d3
  47. bgt hislope
  48. move.w d2,d5
  49. subq.w #1,d5
  50. add.w d3,d3
  51. move.w d3,d4
  52. neg.w d2
  53. add.w d2,d4
  54. add.w d4,d2
  55. move.w d0,(a2)
  56. inc_x:
  57. add.w d6,d0
  58. tst.w d4
  59. bmi no_stk
  60. addq.l #4,a2
  61. move.w d0,(a2)
  62. add.w d2,d4
  63. bra.s next_x
  64. no_stk:
  65. add.w d3,d4
  66. next_x:
  67. dbra d5,inc_x
  68. bra y_limits
  69. hislope:
  70. move.w d3,d5
  71. subq.w #1,d5
  72. add.w d2,d2
  73. move.w d2,d4
  74. neg.w d3
  75. add.w d3,d4
  76. add.w d4,d3
  77. move.w d0,(a2)
  78. inc_y:
  79. addq.l #4,a2
  80. tst.w d4
  81. bmi same_x
  82. add.w d6,d0
  83. add.w d3,d4
  84. bra.s next_y
  85. same_x:
  86. add.w d2,d4
  87. next_y:
  88. move.w d0,(a2)
  89. dbra d5,inc_y
  90. bra y_limits
  91. vertical:
  92. move.w d0,(a2)
  93. addq.l #4,a2
  94. dbra d3,vertical
  95. y_limits:
  96. exg.l d5,a5
  97. exg.l d6,a6
  98. next_line:
  99. dbra d7,filbuf1
  100. next_poly:
  101. lea xbuf,a1
  102. sub.w d5,d6
  103. move.w d6,d7
  104. beq poly3
  105. move.w d5,d3
  106. lsl.w #2,d5
  107. ; adda.w d5,a1
  108. lea 0(a1,d5.w),a1
  109. move.w colour,d4
  110. subq.w #1,d3
  111. poly2:
  112. addq.w #1,d3
  113. move.w (a1)+,d2
  114. move.w (a1)+,d1
  115. sub.w d2,d1
  116. bmi poly4
  117. addq.w #1,d1
  118. movea.l screen,a4
  119. movem.l d0-d7/a0-a6,-(sp)
  120. bsr holine
  121. movem.l (sp)+,d0-d7/a0-a6
  122. poly4:
  123. dbra d7,poly2
  124. poly3:
  125. rts
  126. holine:
  127. lea hln_tbl,a3
  128. lsl.w #2,d3
  129. movea.l 0(a4,d3.w),a4
  130. move.w d2,d5
  131. andi.w #$fff0,d5
  132. lsr.w #1,d5
  133. ; adda.w d5,a4
  134. lea 0(a4,d5.w),a4
  135. andi.w #$000f,d2
  136. move.w d2,d0
  137. subi.w #16,d0
  138. neg.w d0
  139. cmp.w d1,d0
  140. bmi long_line
  141. move.w d1,d0
  142. bsr draw_it
  143. rts
  144. long_line:
  145. sub.w d0,d1
  146. bsr draw_it
  147. clr.w d0
  148. not.w d0
  149. move.w d1,d2
  150. lsr.w #4,d2
  151. beq last_word
  152. subi.w #1,d2
  153. move.w d0,d3
  154. not.w d3
  155. move.w #4-1,d5
  156. move.w d4,d6
  157. subq.l #2,a4
  158. inc_plane:
  159. addq.l #2,a4
  160. movea.l a4,a5
  161. move.w d2,d7
  162. lsr.w #1,d6
  163. bcc clr_word
  164. set_word:
  165. or.w d0,(a5)
  166. adda.l #8,a5
  167. dbra d7,set_word
  168. bra new_plane
  169. clr_word:
  170. and.w d3,(a5)
  171. adda.l #8,a5
  172. dbra d7,clr_word
  173. new_plane:
  174. dbra d5,inc_plane
  175. subq.w #6,a5
  176. movea.l a5,a4
  177. last_word:
  178. andi.w #$f,d1
  179. cmpi.w #0,d1
  180. beq holine_end
  181. clr.w d2
  182. move.w d1,d0
  183. bsr draw_it
  184. holine_end:
  185. rts
  186. draw_it:
  187. lsl.w #5,d2
  188. move.w d0,d5
  189. subq.w #1,d5
  190. lsl.w #1,d5
  191. add.w d5,d2
  192. move.w 0(a3,d2.w),d0
  193. move.w d0,d3
  194. not.w d3
  195. moveq #3,d5
  196. move.w d4,d6
  197. next_plane:
  198. lsr.w #1,d6
  199. bcc not_set
  200. or.w d0,(a4)+
  201. dbf d5,next_plane
  202. rts
  203. not_set:
  204. and.w d3,(a4)+
  205. dbf d5,next_plane
  206. fil_end:
  207. rts
  208. poly_point:
  209. movem.l d0-d7/a0-a6,-(sp)
  210. movea.l screen,a0 ; screen address
  211. move.w no_in,d7
  212. subq.w #1,d7
  213. lea crds_in,a1
  214. lea table2,a2
  215. lea pitchmul,a3
  216. lea col_lst,a5
  217. lea vcoordsz,a6 ; for the size
  218. polypt_loop:
  219. moveq #3,d6
  220. move.w (a5)+,d2
  221. move.w (a6)+,d3
  222. move.w (a1)+,d0
  223. move.w (a1)+,d1
  224. polypt_next:
  225. tst.w d1
  226. bmi polypt_cont
  227. tst.w d0
  228. bmi polypt_cont
  229. ; clip max
  230. move.w d1,d5
  231. move.w d0,d4
  232. cmpi.w #xmaxpz,d0
  233. bgt polypt_cont
  234. cmpi.w #ymaxpz,d1
  235. bgt polypt_cont
  236. add.w d1,d1
  237. move.w 0(a3,d1.w),d1
  238. lea 0(a0,d1.w),a4
  239. lsl.w #2,d0
  240. move.l 0(a2,d0.w),d0 ; data from table2: d1-low: address offset within line, d1-high: bit-mask for x-position
  241. ; color 1 switch plane
  242. tst.w d2
  243. beq.s polyptpln0
  244. addq.w #4,a4
  245. polyptpln0:
  246. addq.w #2,a4
  247. adda.w d0,a4
  248. swap.w d0
  249. or.w d0,(a4)
  250. cmp.w Ooz,d3
  251. bge.s polypt_cont
  252. addi.w #50,d3
  253. ;; asr.w #1,d3
  254. move.w d4,d0
  255. move.w d5,d1
  256. cmpi.w #3,d6
  257. blt.s square0
  258. addq.w #1,d1
  259. dbra d6,polypt_next
  260. square0:
  261. cmpi.w #1,d6
  262. beq.s square1
  263. tst.w d6
  264. beq.s polypt_cont
  265. addq.w #1,d0
  266. ; tst.w d1
  267. dbra d6,polypt_next
  268. square1:
  269. subq.w #1,d1
  270. dbra d6,polypt_next
  271. polypt_cont:
  272. dbra d7,polypt_loop
  273. movem.l (sp)+,d0-d7/a0-a6
  274. rts
  275. poly_line:
  276. movem.l d0-d7/a0-a6,-(sp)
  277. move.w no_in,d7
  278. beq polyl_end
  279. ; lea screen,a0
  280. movea.l screen,a0
  281. ; movea.l (a1),a0
  282. ; addq.l #4,a0
  283. lea crds_in,a1
  284. subq.w #1,d7
  285. polyl_loop:
  286. ; move.w (a1)+,d2
  287. ; move.w (a1)+,d3
  288. ; movea.w (a1)+,a2
  289. ; movea.w (a1)+,a3
  290. ; subq.l #4,a1
  291. ; movem.l d7/a0/a1,-(sp)
  292. ; bsr line
  293. move.w (a1)+,d0
  294. move.w (a1)+,d1
  295. move.w (a1)+,d2
  296. move.w (a1)+,d3
  297. subq.l #4,a1
  298. movem.l d7/a0/a1,-(sp)
  299. ; ignore color
  300. ; tst.w colour
  301. ; beq.s dline
  302. ; addq.l #2,a0
  303. dline:
  304. bsr line
  305. ;; bsr SL
  306. movem.l (sp)+,d7/a0/a1
  307. dbra d7,polyl_loop
  308. polyl_end:
  309. movem.l (sp)+,d0-d7/a0-a6
  310. rts
  311. lineslow:
  312. ; input: d2,d3 (x1,y1) to a2,a3 (x2,y2)
  313. ; in color d6, screenaddress at a0
  314. movem.l d7/a1,-(sp)
  315. clr.l d4
  316. movea.w #1,a4
  317. movea.w a4,a5
  318. move.w a2,d6
  319. sub.w d2,d6
  320. bge dxipos
  321. neg.w d6
  322. movea.w #-1,a4
  323. dxipos:
  324. move.w a3,d7
  325. sub.w d3,d7
  326. bgt plotit
  327. beq dyis_0
  328. neg.w d7
  329. movea.w #-1,a5
  330. bra plotit
  331. dyis_0:
  332. not.w d4
  333. plotit:
  334. ; tst.w d2
  335. ; bmi draw_it2
  336. ; tst.w d3
  337. ; bmi draw_it2
  338. ; cmpi.w #319,d2
  339. ; bhi draw_it2
  340. ; cmpi.w #199,d3
  341. ; bhi draw_it2
  342. move.w d3,d0
  343. ; y in d3
  344. ; x in d2
  345. movem.l d0-d7/a0-a6,-(sp)
  346. move.w d2,d0
  347. move.w d3,d1
  348. move.w #2,d2
  349. bsr set_pixel
  350. movem.l (sp)+,d0-d7/a0-a6
  351. ; lsl.w #2,d0
  352. ; movea.l 0(a0,d0.w),a1
  353. ; move.w d2,d1
  354. ;; for mono
  355. ;; lsr.w #3,d1
  356. ;; first /16
  357. ; lsr.w #4,d1
  358. ;; then *8 -> byte address of word in plane
  359. ; lsl.w #3,d1
  360. ; move.w 0(a1,d1.w),d0
  361. ; move.w d2,d5
  362. ;;not.w d5
  363. ; andi.w #$f,d5
  364. ; bset d5,d0
  365. ; move.w d0,0(a1,d1.w)
  366. ;;move.w d2,d0
  367. ;;not.w d0
  368. ;;bset d0,0(a1,d1.w)
  369. draw_it2:
  370. cmpa.w d2,a2
  371. bne notend
  372. cmpa.w d3,a3
  373. beq endit
  374. notend:
  375. tst.w d4
  376. bge ystep
  377. xstep:
  378. add.w a4,d2
  379. add.w d7,d4
  380. bra plotit
  381. ystep:
  382. add.w a5,d3
  383. sub.w d6,d4
  384. bra plotit
  385. drawend:
  386. endit:
  387. movem.l (sp)+,d7/a1
  388. rts
  389. set_pixel:
  390. ; lea screen,a0
  391. lsl.w #2,d1
  392. movea.l 0(a0,d1.w),a0
  393. move.w d0,d5
  394. andi.w #$fff0,d5
  395. lsr.w #1,d5
  396. lea 0(a0,d5.w),a0
  397. andi.w #$f,d0
  398. subi.w #15,d0
  399. neg.w d0
  400. clr.w d1
  401. bset d0,d1
  402. move.w d1,d3
  403. not.w d3
  404. move.w #4-1,d7
  405. next_planepx:
  406. lsr.w #1,d2
  407. bcc clear_bit
  408. or.w d1,(a0)+
  409. dbra d7,next_planepx
  410. rts
  411. clear_bit:
  412. and.w d3,(a0)+
  413. dbra d7,next_planepx
  414. rts
  415. ; .INCLUDE 'POLYZOOM.IS'