home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / emulate / z80emula.lha / Life.ASM next >
Assembly Source File  |  1992-03-08  |  3KB  |  135 lines

  1. ; The classic John Conway game of Life
  2. ; Z80 Implementation (and not a very good one) by Phil Brown
  3. ; Overcrowded if cells>4
  4. ; Lonely if cells<2
  5. ; Birth if empty and cells=3
  6. ;
  7. ; Change random seed to get different initial generations
  8.  
  9.           org 1000
  10. cellch    equ 'O'
  11. blnkch    equ #32
  12.  
  13. random    ld hl,(seed)        ; places a "random" value in HL
  14.           push de
  15.           ld d,h
  16.           ld e,h
  17.           add hl,hl
  18.           add hl,hl
  19.           add hl,de
  20.           add hl,hl
  21.           add hl,hl
  22.           add hl,hl
  23.           add hl,de
  24.           ld (seed),hl
  25.           pop de
  26.           ret
  27.  
  28. display   ld a,#27
  29.           out (1),a           ; print ESC 0 to clear console
  30.           ld a,#0
  31.           out (1),a
  32.           ld hl,cells
  33.           ld c,#16
  34. disp_1    ld b,#16
  35. disp_2    ld a,(hl)
  36.           out (1),a
  37.           inc hl
  38.           djnz disp_2
  39.           ld a,#13
  40.           out (1),a           ; print newline
  41.           dec c
  42.           ld a,c
  43.           cp 0
  44.           jr nz,disp_1
  45.           ret
  46.  
  47. create    ld de,cells
  48.           ld a,#27
  49.           out (1),a           ; print ESC 0 to clear console
  50.           ld a,0
  51.           out (1),a
  52.           ld c,#16
  53. create_1  ld b,#16
  54. create_2  call random         ; returns "random" value in HL
  55.           ld a,l
  56.           cp #80
  57.           ld a,blnkch
  58.           jr c,outcell        ; L<80
  59.           ld a,cellch
  60. outcell   ld (de),a
  61.           inc de
  62.           djnz create_2
  63.           dec c
  64.           ld a,c
  65.           cp #0
  66.           jr nz,create_1
  67.           ret
  68.  
  69. copy      ld de,copys
  70.           ld hl,cells
  71.           ld bc,#256
  72.           ldir
  73.           ret
  74.  
  75. generate  ld de,copys
  76.           ld c,#16
  77. gen_1     ld b,#16
  78. gen_3     push bc
  79.           push de
  80.           ld c,#0             ; count of number of adjacent cells
  81.           ld hl,offsets       ; pointer to table of offsets
  82.           ld b,#8             ; 8 adjacent cells
  83. gen_2     ld a,e
  84.           add a,(hl)
  85.           inc hl
  86.           ld e,a              ; de now contains address of adjacent cell
  87.           ld a,(de)           ; get this adjacent cell
  88.           cp blnkch           ; is it empty?
  89.           jr z,blnk_adj
  90.           inc c               ; increment counter of adjacent cells
  91. blnk_adj  djnz gen_2
  92.           pop de
  93.           ld a,c
  94.           cp #3
  95.           ld a,cellch
  96.           jr z,put_cell
  97.           ld a,(de)
  98.           cp blnkch
  99.           ld a,blnkch
  100.           jr z,put_cell
  101.           ld a,c
  102.           cp #2
  103.           ld a,cellch
  104.           jr z,put_cell
  105.           ld a,blnkch
  106. put_cell  dec d               ; point to cells not copys
  107.           ld (de),a
  108.           inc d               ; point back to copys
  109.           inc de              ; next cell
  110.           pop bc
  111.           djnz gen_3
  112.           dec c
  113.           ld a,c              ; done all 16 rows?
  114.           cp #0
  115.           jr nz,gen_1         ; no, go back and do them then!
  116.           ret
  117. life      call create
  118. next_gen  call display
  119.           call copy
  120.           call generate
  121.           jr next_gen
  122.  
  123.           org #10*#256        ; needs to be page aligned
  124. cells     defs #256           ; 16 * 16 array of cells
  125. copys     defs #256           ; copy when calculating next generation
  126. offsets   defb #239           ; table for eight relative offsets
  127.           defb #1
  128.           defb #1
  129.           defb #14
  130.           defb #2
  131.           defb #14
  132.           defb #1
  133.           defb #1
  134. seed      defw #56123
  135.