
********************
* includes
********************

   INCLUDE  "exec/types.i"
   INCLUDE  "exec/memory.i"
   INCLUDE  "intuition/intuition.i"
   INCLUDE  "graphics/view.i"
   INCLUDE  "graphics/rastport.i"

********************
* macros
********************

SYS   MACRO
      XREF  _LVO\1
      jsr   _LVO\1(a6)
      ENDM

********************
* external vars
********************

   XREF  _AbsExecBase

********************
* equates
********************

ebase    equ   _AbsExecBase

width    equ   320
height   equ   400
depth    equ   4

w_width  equ   100
w_height equ   150

dis1     equ   -w_width
dis2     equ   1-w_width
dis3     equ   1
dis4     equ   1+w_width
dis5     equ   w_width
dis6     equ   w_width-1
dis7     equ   -1
dis8     equ   -w_width-1

ledge    equ   110
tedge    equ   125

k1       equ   2
k2       equ   2
g        equ   20

********************
* code
********************

open_libs
   move.l   ebase,a6
   lea.l    iname,a1
   clr.l    d0
   SYS      OpenLibrary
   beq      cleanup_1
   move.l   d0,ibase

   move.l   ebase,a6
   lea.l    gname,a1
   clr.l    d0
   SYS      OpenLibrary
   beq      cleanup_2
   move.l   d0,gbase

create_bitmaps
   move.l   ebase,a6
   move.l   #w_width*w_height,d0
   move.l   #MEMF_FAST!MEMF_CLEAR,d1
   SYS      AllocMem
   beq      cleanup_3
   move.l   d0,bm0

   move.l   ebase,a6
   move.l   #w_width*w_height,d0
   move.l   #MEMF_FAST!MEMF_CLEAR,d1
   SYS      AllocMem
   beq      cleanup_4
   move.l   d0,bm1

open_scrn
   move.l   ibase,a6
   lea.l    my_nscreen,a0
   SYS      OpenScreen
   beq      cleanup_5
   move.l   d0,my_screen

load_colors
   move.l   my_screen,a0
   lea.l    sc_RastPort(a0),a1
   move.l   a1,s_rastport

   lea.l    sc_ViewPort(a0),a0
   move.l   vp_RasInfo(a0),a1
   move.l   a1,s_rasinfo
   move.l   a0,my_viewport
   move.l   vp_ColorMap(a0),a0
   move.l   cm_ColorTable(a0),a0
   lea.l    my_ncolors,a1
   move.w   #16,count0
lc_loop
   move.w   (a1)+,(a0)+
   sub.w    #1,count0
   bne      lc_loop

clear_display
   move.l   gbase,a6
   move.l   s_rastport,a1
   moveq.l  #5,d0
   SYS      SetRast

open_wndw
   move.l   my_screen,d0
   move.l   d0,sc_pointer
   move.l   ibase,a6
   lea.l    my_nwindow,a0
   SYS      OpenWindow
   beq      cleanup_6
   move.l   d0,my_window
   move.l   d0,a0
   move.l   wd_RPort(a0),w_rastport

redraw_display
   move.l   ibase,a6
   move.l   my_screen,a0
   SYS      MakeScreen
   SYS      RethinkDisplay

init_rnd_seed
   move.l   #0,d0
   bsr      randomseed

init_bitmap
   move.l   #w_width*w_height,d1
   move.l   bm0,a0

bm_loop1
   movem.l  d1/a0,-(sp)
   move.l   #100,d0
   bsr      random

   movem.l  (sp)+,d1/a0
   move.b   d0,(a0)+
   sub.l    #1,d1
   cmp.l    #0,d1
   bge      bm_loop1

init_window
   move.l   bm0,a0
   move.l   a0,-(sp)
   move.w   #w_width,w_x

iw_loop2
   move.w   #w_height,w_y

iw_loop1
   move.l   (sp)+,a0
   moveq    #0,d0
   move.b   (a0)+,d0
   move.l   a0,-(sp)
   divu.w   #7,d0
   move.l   w_rastport,a1
   move.l   gbase,a6
   SYS      SetAPen

   move.l   gbase,a6
   moveq    #0,d0
   move.w   w_x,d0
   move.w   w_y,d1
   move.l   w_rastport,a1
   SYS      WritePixel
   sub.w    #1,w_y
   cmp      #3,w_y
   bgt      iw_loop1
   sub.w    #1,w_x
   cmp      #0,w_x
   bgt      iw_loop2

   move.l   (sp)+,a0
   move.w   #1,phase

main_program
   cmp.w    #0,phase
   beq      sw1
   move.l   bm0,cur_map
   move.l   bm1,work_map
   move.w   #0,phase
   bra      main_loop

sw1
   move.l   bm1,cur_map
   move.l   bm0,work_map
   move.w   #1,phase

main_loop
   move.w   #w_height,w_y

loop1
   move.w   #w_width,w_x

any_mouse
   move.l   my_window,a0
   move.l   wd_UserPort(a0),a0
   move.l   ebase,a6
   SYS      GetMsg
   tst      d0
   bne      exit

loop2
   moveq    #0,d0
   move.w   #0,ill
   move.w   #0,dead
   move.w   #0,totals

   move.l   gbase,a6
   move.w   w_x,d0
   move.w   w_y,d1
   move.l   w_rastport,a1
   SYS      ReadPixel
   cmp      #-1,d0
   beq      pix_dead

   move.l   cur_map,a0
   move.b   (a0),d0
   cmp.b    #100,d0
   bge      pix_dead
   cmp.b    #0,d0
   ble      pix_healthy

   bra      pix_ill

pix_dead
   moveq    #0,d0
pix_fin
   move.l   work_map,a1
pix_fin1
   move.b   d0,(a1)
   moveq    #0,d0
   move.b   (a1),d0
   divu.w   #7,d0
   move.l   gbase,a6
   move.l   w_rastport,a1
   SYS      SetAPen
   move.w   w_x,d0
   move.w   w_y,d1
   SYS      WritePixel
   moveq    #0,d0
   add.l    #1,cur_map
   add.l    #1,work_map
   sub.w    #1,w_x
   cmp.w    #0,w_x
   bgt      loop2
   sub.w    #1,w_y
   cmp.w    #3,w_y
   bgt      loop1
   bra      main_program

pix_ill
   add.w    d0,totals
   add.w    #1,ill
   bsr      tally
   move.w   totals,d0
   move.w   ill,d1
   divu.w   d1,d0
   add.w    #g,d0
   bra      pix_done

pix_healthy
   bsr      tally
   move.w   ill,d0
   divu.w   #k1,d0

   move.w   dead,d1
   divu.w   #k2,d1

   add.w   d1,d0

pix_done
   cmp.b    #100,d0
   blt      hlt1
   move.w   #100,d0
hlt1
   bra      pix_fin

exit
   move.l   ibase,a6
   move.l   my_window,a0
   SYS      CloseWindow

cleanup_6
   move.l   ibase,a6
   move.l   my_screen,a0
   SYS      CloseScreen

cleanup_5
   move.l   ebase,a6
   move.l   bm1,a1
   move.l   #w_width*w_height,d0
   SYS      FreeMem

cleanup_4
   move.l   ebase,a6
   move.l   bm0,a1
   move.l   #w_width*w_height,d0
   SYS      FreeMem

cleanup_3
   move.l   ebase,a6
   move.l   gbase,a1
   SYS      CloseLibrary

cleanup_2
   move.l   ebase,a6
   move.l   ibase,a1
   SYS      CloseLibrary

cleanup_1
   rts

********************
* subroutines
********************

*-------------------
tally
   move.l   cur_map,a0

   move.b   dis1(a0),d0
   bsr      accum

   move.b   dis2(a0),d0
   bsr      accum

   move.b   dis3(a0),d0
   bsr      accum

   move.b   dis4(a0),d0
   bsr      accum

   move.b   dis5(a0),d0
   bsr      accum

   move.b   dis6(a0),d0
   bsr      accum

   move.b   dis7(a0),d0
   bsr      accum

   move.b   dis8(a0),d0
   bsr      accum

   rts

*-------------------
accum
acc0
   cmp.b    #0,d0
   beq      acc_done

acc1
   add.w    d0,totals
   cmp      #100,d0
   bne      acc2
   add.w    #1,dead
   bra      acc_done

acc2
   add.w    #1,ill

acc_done
   rts

*-------------------
randomseed
   add.l    d0,d1
   movem.l  d0/d1,rnd

longrnd
   movem.l  d2-d3,-(SP)
   movem.l  rnd,d0/d1
   andi.b   #$0E,d0
   ori.b    #$20,d0
   move.l   d0,d2
   move.l   d1,d3
   add.l    d2,d2
   addx.l   d3,d3
   add.l    d2,d0
   addx.l   d3,d1
   swap     d3
   swap     d2
   move.w   d2,d3
   clr.w    d2
   add.l    d2,d0
   addx.l   d3,d1
   movem.l  d0/d1,rnd
   move.l   d1,d0
   movem.l  (SP)+,d2-d3
   rts

random
   move.w   d2,-(SP)
   move.w   d0,d2
   beq      rnd_done
   bsr      longrnd
   clr.w    d0
   swap     d0
   divu.w   d2,d0
   clr.w    d0
   swap     d0
rnd_done
   move.w   (SP)+,d2
   rts

********************
* data
********************

            cnop  0,2
iname       dc.b  'intuition.library',0
gname       dc.b  'graphics.library',0

            cnop  0,2
my_nscreen  dc.w  0,0,width,height,depth
            dc.b  8,0
            dc.w  V_LACE
            dc.w  CUSTOMSCREEN
            dc.l  0
            dc.l  0
            dc.l  0
cbm         dc.l  0

            cnop  0,2
my_nwindow  dc.w  ledge,tedge,w_width,w_height
            dc.b  -1,10
            dc.l  MOUSEBUTTONS
            dc.l  GIMMEZEROZERO!ACTIVATE
            dc.l  0
            dc.l  0
            dc.l  0
sc_pointer  dc.l  0
            dc.l  0
            dc.w  0,0,0,0
            dc.w  CUSTOMSCREEN

            cnop  0,2
my_ncolors  dc.w  $000,$001,$002,$003
            dc.w  $004,$005,$006,$007
            dc.w  $008,$009,$00A,$00B
            dc.w  $00C,$00D,$00E,$00F

********************
* bcc
********************

            cnop  0,2
ibase       ds.l  1
gbase       ds.l  1

my_screen   ds.l  1
my_window   ds.l  1
my_viewport ds.l  1

s_rastport  ds.l  1
s_rasinfo   ds.l  1
w_rastport  ds.l  1

bm0         ds.l  1
bm1         ds.l  1

cur_map     ds.l  1
work_map    ds.l  1

w_x         ds.w  1
w_y         ds.w  1

rnd         ds.l  2

temp0       ds.l  1

count0      ds.w  1

totals      ds.w  1
dead        ds.w  1
ill         ds.w  1

phase       ds.w  1

   END

