; *** PROGRAM : LIFE    ver 1.0
; ***           850612
; ***

SL[CKT EQU  0
T[ND   EQU  1
WUPDAT EQU  1
WOUTPC EQU  2
WOLDPC EQU  3
SIZE   EQU  50          ; 50*50
RADMIN EQU  10
RADMAX EQU  RADMIN+SIZE-1
KOLMIN EQU  14
KOLMAX EQU  KOLMIN+SIZE-1
RAMSCR EQU  884
KEYBRD EQU  65013
CTRL_C EQU  65031

       ORG  49152
LIFE   PUSH IX          ; Spara IX,IY
       PUSH IY
CPOPUL LD   HL,POPUL
       LD   (HL),0
       LD   DE,POPUL+1
       LD   BC,END-POPUL-1
       LDIR             ; Rensat!
       LD   A,WOLDPC
       LD   (WHAT),A
       CALL NEWPIC
FIXPIC LD   A,WUPDAT
       LD   (WHAT),A
       CALL NEWPIC      ; Uppdatera ny bild
       LD   A,WOUTPC
       LD   (WHAT),A
       CALL NEWPIC      ; Visa ny bild
       LD   A,(KEYBRD)  ; H{mta ev tangentnedtryckning
       AND  127         ; Maska av bit 7
       CP   "A"         ; Var det "A"
       JR   NZ,FIXPIC
LIFEND SUB  A
       LD   (CTRL_C),A
       LD   (KEYBRD),A
       POP  IY          ; Ta tillbaka IY (BASICen beh|ver den)
       POP  IX
       RET

; *** SUBRUTIN : NEWPIC
NEWPIC LD   IX,POPUL+SIZE+1
       LD   IY,CHANGE+SIZE+1
       LD   D,RADMIN+1  ; RADr{knare
NDLOOP LD   E,KOLMIN+1  ; KOLr{knare
NELOOP LD   A,(WHAT)
       CP   WUPDAT
       JP   Z,UPDATE
       CP   WOUTPC
       JP   Z,OUTPIC
       LD   C,D         ; Flytta fr}n bildsk{rm till minnet
       LD   L,E
       CALL DOT
       LD   C,D
       LD   L,E
       JR   Z,NPINV     ; Hoppa om sl{ckt
       LD   (IX+0),T[ND
       CALL CLRDOT
       JR   NPNEXT
NPINV  LD   (IX+0),SL[CKT
       CALL SETDOT
NPNEXT INC  IX
       INC  IY
       INC  E           ; Kol n}tt max?
       LD   A,E
       CP   KOLMAX
       JR   NZ,NELOOP
       INC  IX          ; IX+2
       INC  IX
       INC  IY          ; IY+2
       INC  IY
       INC  D           ; Rad n}tt max?
       LD   A,D
       CP   RADMAX
       JR   NZ,NDLOOP
       RET

; *** SUBRUTIN : UPDATE
UPDATE SUB  A           ; Nollst{ll
       ADD  (IX-SIZE-1) ; Addera antalet omgivande grannar
       ADD  (IX-SIZE)
       ADD  (IX-SIZE+1)
       ADD  (IX-1)
       ADD  (IX+1)
       ADD  (IX+SIZE-1)
       ADD  (IX+SIZE)
       ADD  (IX+SIZE+1)
       CP   2           ; 2 grannar
       JR   Z,NTV]
       CP   3           ; 3 grannar
       JR   Z,NTRE
       LD   (IY+0),SL[CKT
       JP   NPNEXT
NTV]   LD   A,(IX+0)
       LD   (IY+0),A
       JP   NPNEXT
NTRE   LD   (IY+0),T[ND
       JP   NPNEXT

; *** SUBRUTIN : OUTPIC
OUTPIC LD   A,(IY+0)
       CP   (IX+0)      ; [ndrats?
       JP   Z,NPNEXT    ; Nej=>hoppa
       LD   C,D         ; rad&kol
       LD   L,E
       LD   (IX+0),A    ; S{tt dit nytt
       CP   SL[CKT      ; Ska det t{ndas
       JR   Z,OPT[ND    ; Ja=>hoppa
       CALL CLRDOT      ; Sl{ck punkt
       JP   NPNEXT
OPT[ND CALL SETDOT      ; T{nd punkt
       JP   NPNEXT

; *** SUBRUTIN : SETDOT
; *** IN : C  = rad
; ***    : L  = kolumn
; *** UT : T{nd punkt p} bildsk{rmen
SETDOT CALL EDOT
       OR   (HL)
       OR   32
       LD   (HL),A
       RET

; *** SUBRUTIN : CLRDOT
; *** IN : C  = rad
; ***    : L  = kolumn
; *** UT : sl{ckt punkt p} bildsk{rmen
CLRDOT CALL EDOT
       CPL
       AND  (HL)
       OR   32
       LD   (HL),A
       RET

; *** SUBRUTIN : DOT
; *** IN : C  = rad
; ***    : L  = kolumn
; *** UT : Z-flagga om punkt sl{ckt
DOT    CALL EDOT
       AND  (HL)
       RET

; *** SUBRUTIN : EDOT
; *** IN : C  = rad
; ***    : L  = kolumn
; *** UT : HL = adress
; ***      A  = Bildsk{rmsparameter
EDOT   LD   A,L
       LD   B,64
       RRA
       JR   NC,EDOT1
       LD   B,128
EDOT1  LD   L,A
       LD   A,C
       LD   C,L
       LD   HL,RAMSCR-2
EDOTHL INC  HL
       INC  HL
       SUB  3
       JR   NC,EDOTHL
EDOTB  RRC  B
       RRC  B
       INC  A
       JR   NZ,EDOTB
       LD   A,(HL)      ; Adress till punkten
       ADD  C
       INC  HL
       LD   H,(HL)
       LD   L,A
       LD   A,B
       ADD  32
       AND  223
       RET

; *** Reservera plats f|r arbetsarea
WHAT   DEFB 0
POPUL  DEFS 2500        ; SIZE * SIZE
CHANGE DEFS 2500        ; SIZE * SIZE

; *** Spara filen
       FIL  LIFE.KOD
END    END
