A large commit.
[pdp8.git] / sw / src / life / main.pa
diff --git a/sw/src/life/main.pa b/sw/src/life/main.pa
new file mode 100644 (file)
index 0000000..fb46851
--- /dev/null
@@ -0,0 +1,372 @@
+/********************************************************************
+/********************************************************************
+/ MAIN PROGRAM
+       *200
+       CLA CLL
+       JMS I   XDINIT
+       ION             / WELCOME TO HELL!
+
+MLOOP,                 / MAIN EVENT LOOP
+       JMS I   XDUMP   / START A DUMP, PLEASE
+       JMS I   XCALC   / CALCULATE NEW DATA
+       CLA CLL
+
+       TAD     TPTR
+       DCA     DPTR
+       TAD     SPTR
+       DCA     TPTR
+       TAD     DPTR
+       DCA     SPTR
+       JMP     MLOOP
+
+/********************************************************************
+/ THE CALCULATION
+       PAGE
+CCADDR,        0               / CURRENT CELL ADDRESS
+CROW,  0
+CCOL,  0
+NBORS, 0
+
+CALC,  0
+       CLA CLL
+       DCA     CCADDR
+
+       TAD     KROWS
+       CIA
+       DCA     CROW
+
+CRLOOP,        CLA CLL
+       TAD     KCOLS
+       CIA
+       DCA     CCOL
+
+CCLOOP,
+       / NOW, DO IT, PLEASE!
+       TAD     CCADDR
+       JMS I   XCOUNT
+       DCA     NBORS
+       
+       TAD     CCADDR
+       JMS I   XGET
+       SNA
+       JMP     ISDEAD
+
+ISALIV,        CLA CLL
+       TAD     NBORS
+       TAD     KN4
+       SMA
+       JMP     DIE
+       
+       CLA CLL
+       TAD     NBORS
+       TAD     KN2
+       SMA
+       JMP     LIVE
+       JMP     DIE
+               
+ISDEAD,        TAD     NBORS
+       TAD     KN3
+       SZA
+       JMP     DIE
+       JMP     LIVE
+
+LIVE,  CLA CLL
+       TAD     CCADDR
+       JMS I   XSET    / NOW, IT'S ALIVE!
+       JMP     CDONE
+DIE,   CLA CLL
+       TAD     CCADDR
+       JMS I   XCLEAR
+CDONE, CLA CLL
+
+       ISZ     CCADDR
+       ISZ     CCOL
+       JMP     CCLOOP
+       
+       TAD     CCADDR
+       TAD     K100
+       AND     K7700
+       ISZ     CROW
+       JMP     CRLOOP
+       
+       JMP I   CALC
+KN2,   -2
+KN3,   -3
+KN4,   -4
+K100,  100
+
+/********************************************************************
+/ DATA DUMPING
+       PAGE
+       NLINE=JMS CRLF
+       HOME=JMS HOM
+
+DBASE, 0
+DDPTR, 0
+DOFF,  0
+
+DUMPS, 0
+       JMS I   XTSTRT
+       JMP I   DUMPS
+       CLA
+       TAD     SPTR
+       DCA     DBASE
+       JMP     DMPINT
+
+DUMPT, 0
+       JMS I   XTSTRT
+       JMP I   DUMPT
+       CLA
+       TAD     TPTR
+       DCA     DBASE
+       JMP     DMPINT
+
+DUMP,  0
+       JMS I   XTSTRT
+       JMP I   DUMP
+       CLA
+       TAD     DPTR
+       DCA     DBASE
+       
+DMPINT,        DCA     DOFF
+       
+       TAD     KROWS
+       CIA
+       DCA     ROWCNT
+
+//     NLINE;NLINE
+       HOME
+
+/ START OF ROW
+RLOOP, CLA CLL
+       TAD     KCOLS
+       CIA
+       DCA     COLCNT
+       TAD     K200
+       DCA     DMSK
+
+       TAD     DBASE   / BUFFER BASE ADDRESS
+       TAD     DOFF    / CURRENT WORD OFFSET
+       DCA     DDPTR   / TO INTERNAL POINTER
+
+/ START OF COLUMN
+CLOOP, TAD     DMSK    / BIT MASK, DYNAMIC
+       AND I   DDPTR   / COMBINE CURRENT WORD
+       SZA     
+       JMP     ONE
+ZERO,  TAD     KDEAD
+       JMP     TT      
+ONE,   CLA
+       TAD     KALIVE
+TT,    JMS I   XTYPE
+
+       CLA CLL
+       TAD     DMSK
+       RAR
+       SZA
+       JMP     MASKOK
+       TAD     K200
+       ISZ     DDPTR
+MASKOK,        DCA     DMSK
+
+       ISZ     COLCNT
+       JMP     CLOOP
+
+       NLINE
+
+       CLA CLL 
+       TAD     DOFF
+       TAD     K10
+       DCA     DOFF
+       
+       ISZ     ROWCNT
+       JMP     RLOOP
+
+       JMP I   XTSTOP  / STOP INTERRUPT MADNESS.
+
+HOM,   0
+       CLA CLL
+       TAD     K035
+       JMS I   XTYPE
+       CLA CLL
+       JMS I   XTYPE   / FILLER CHARACTERS!
+       JMS I   XTYPE
+       JMS I   XTYPE
+       JMS I   XTYPE
+       JMP I   HOM
+
+CRLF,  0
+       CLA CLL
+       TAD     CR
+       JMS I   XTYPE
+       CLA CLL
+       TAD     LF
+       JMS I   XTYPE
+       JMP I   CRLF
+       
+DMSK,  0
+K035,  35
+CR,    215
+LF,    212
+
+ROWCNT,        0
+COLCNT,        0
+
+/********************************************************************
+/ NEIGHBORHOOD COUNTING
+/ (ADDRESS IN AC)
+       PAGE
+POS,   0
+
+COUNT, 0
+       DCA     POS
+       DCA     CNT
+
+       TAD     POS
+       TAD     KCOLM1  / STEP LEFT
+       TAD     KROWM1  / STEP UP
+       JMS     ACCNT
+       
+       TAD     KCOLP1
+       JMS     ACCNT
+       
+       TAD     KCOLP1
+       JMS     ACCNT
+       
+       TAD     KROWP1
+       JMS     ACCNT
+       
+       TAD     KROWP1
+       JMS     ACCNT
+       
+       TAD     KCOLM1
+       JMS     ACCNT
+       
+       TAD     KCOLM1
+       JMS     ACCNT
+       
+       TAD     KROWM1
+       JMS     ACCNT
+       
+       CLA CLL
+       TAD     CNT
+       JMP I   COUNT
+
+ACCNT, 0
+       DCA     POS
+       TAD     POS
+       JMS I   XGET
+       SZA
+       ISZ     CNT
+       CLA CLL
+       TAD     POS
+       JMP I   ACCNT           
+
+CNT,   0               / COUNTER VARIABLE
+
+
+/********************************************************************
+/ DATA HOLDING AND ACCESS
+
+       PAGE            / START ON NEW PAGE
+
+/ INTERNAL DATA
+
+CADR,  0               / CURRENT CELL ADDRESS
+MASK,  0               / BIT MASK TO CURRENT CELL BIT
+APTR,  0               / ACCESS POINTER TO CURRENT CELL WORD
+
+/ GET A BIT OF DATA
+GET,   0               / GET POSITION'S VALUE
+       JMS     ASETUP  / CHECK LIMITS, STORE ADDRESS ETC.
+       JMP I   GET     / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
+       TAD     APTR    
+       TAD     SPTR    / ADD SOURCE DATA BASE
+       DCA     APTR
+       TAD I   APTR    / LOAD DATA
+       AND     MASK    / MASK OUT DESIRED BIT
+       SZA
+       CLA CLL IAC     / MAKE A ONE OUT OF AC CONTENTS
+       JMP I   GET     / RETURN
+       
+SET,   0               / SET POSITION'S VALUE TO 1
+       JMS     ASETUP  / CHECK LIMITS, STORE ADDRESS ETC.
+       JMP I   SET     / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
+       TAD     APTR    
+       TAD     TPTR    / ADD SOURCE DATA BASE
+       DCA     APTR
+       TAD     MASK    / GET MASK
+       CMA             / INVERT
+       AND I   APTR    / COMBINE WITH DATA
+       TAD     MASK    / SET BIT
+       DCA I   APTR    / UPDATE DATA
+       JMP I   SET     / RETURN
+
+CLEAR, 0               / CLEAR POSITION'S VALUE TO 0
+       JMS     ASETUP  / CHECK LIMITS, STORE ADDRESS ETC.
+       JMP I   CLEAR   / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
+       TAD     APTR    
+       TAD     TPTR    / ADD SOURCE DATA BASE
+       DCA     APTR
+       TAD     MASK    / GET MASK
+       CMA             / INVERT
+       AND I   APTR    / COMBINE WITH DATA
+       DCA I   APTR    / UPDATE DATA
+       JMP I   CLEAR   / RETURN
+
+ASETUP,        0
+       DCA     CADR    / SAVE ADDRESS FOR LATER USE
+
+/ LIMIT CHECK
+       TAD     CADR
+       BSW             / NOW ROW ADDRESS IN LOWER BITS
+       AND     K77     / MASK OUT UPPER BITS
+       TAD     KNMROW
+       SPA
+       JMP     LGD1    / ONE LIMIT GOOD
+       CLA
+       TAD     KBORD   / BORDER STANDARD RETURN VALUE
+       JMP I   ASETUP  / ERROR RETURN
+LGD1,  CLA CLL
+       TAD     CADR
+       AND     K77
+       TAD     KNMCO
+       SPA
+       JMP     LGD2
+       CLA CLL
+       TAD     KBORD
+       JMP I   ASETUP  / ERROR RETURN
+LGD2,  CLA CLL
+
+/ SETUP POINTER AND MASK
+       TAD     CADR    
+       RTR
+       RAR
+       AND     K377
+       DCA     APTR    / ACCESS POINTER
+       TAD     CADR
+       AND     K7
+       TAD     MASKSP
+       DCA     MPTR
+       TAD I   MPTR
+       DCA     MASK
+
+       ISZ     ASETUP  / PREPARE GOOD RETURN
+       JMP I   ASETUP  / GOOD RETURN
+
+
+
+MPTR,  0
+MASKSP,        MASKS           
+MASKS, 200
+       100
+       040
+       020
+       010
+       004
+       002
+       001
+
+
+
+