--- /dev/null
+/ CONWAY'S GAME OF LIFE - BREED LIFE ON YOUR PDP8
+
+/********************************************************************
+/********************************************************************
+/
+/ PAL-8 IMPLEMENTATION OF CONWAY'S GAME OF LIFE
+/
+/ PHILIPP HACHTMANN, JULY 2010
+/
+/ REVISIONS:
+/
+/ 2010-07-24 - INITIAL RELEASE
+/
+/********************************************************************
+/********************************************************************
+
+
+/********************************************************************
+/********************************************************************
+/
+/ GAME CONFIGURATION PARAMETERS
+/ CHANGE ONLY IF YOU KNOW WHAT YOU'RE DOING!
+
+/ SIZE OF THE PLAYING FIELD
+/ =========================
+
+/ THE PLAYING FIELD HAS A MAXIMUM SIZE OF 32 ROWS BY 64 COLUMNS.
+/
+/ THE DATA IS ORGANIZED AS FOLLOWS:
+/ EVERY CELL OCCUPIES ONE BIT. THE CELLS OF EACH ROW ARE STORED IN
+/ A CONTIGUOUS PIECE OF MEMORY. BUT ONLY THE LOWER 8 BITS OF A WORD
+/ ARE USED!
+/ THE WHOLE GAME BUFFER CONSISTS OF 32 ROWS OF 8 WORDS EACH. THIS
+/ LEADS TO A MEMORY FOOTPRINT OF 256 WORDS.
+/ THERE'S ONE RESTRICTION: THE LAST COLUMN IS NOT USABLE DUE TO
+/ BORDER DETECTION. THAT MEANS THAT THE MAXIMUM SIZE OF THE ACTUAL
+/ CELL ROW IS ONLY 63!!!
+/ THE FOLLOWIN PARAMETERS DEFINE THE DIMENSIONS OF THE ACTUAL
+/ SIZE OF THE CELL ARRAY. KEEP IN MIND THAT THIS WILL NOT CHANGE
+/ THE MEMORY FOOTPRINT!
+ PROWS=37
+ PCOLS=77
+
+/ CELL ADDRESS CODING:
+/
+/ 0RR RRR CCC CCC <- AS USED THROUGHOUT THE PROGRAM
+/
+/ WHERE
+/ R - ROW ADDRESS BIT
+/ C - COLUMN ADDRESS BIT
+
+/ COLUMN ADDRESS IS SPLIT INTO
+/
+/ WWW BBB
+/ WHERE
+/ W - WORD ADDRESS
+/ B - BIT IN WORD ADDRESS
+/
+/ A CELL ADDRESS CAN BE TRANSLATED INTO A MEMORY OFFSET BY SIMPLY
+/ SHIFTING THREE BITS TO THE RIGHT AND MASKING WITH 0377:
+/
+/ 000 0RR RRR CCC
+/
+/ HERE THE LOWER 3 COLUMN ADDRESS BITS WHICH SPECIFY THE BIT ADDRESS
+/ IN A WORD ARE DISCARDED.
+
+/ HAS THE FIELD LIMITS OR IS IT ENDLESS? (CURRENTLY UNSUPPORTED!)
+
+/ ENDLESS=1
+
+
+/ BORDER BEHAVIOUR FOR LIMITED FIELD
+/ 0 - OFF FIELD POSITIONS ARE ASSUMED TO BE ALWAYS DEAD
+/ 1 - OFF FIELD POSITIONS ARE ASSUMED TO BE ALWAYS ALIFE
+
+ BORDER=0
+
+/ CHARACTER CODES TO USE FOR CELL DISPLAY OUTPUT
+/ 55:-
+/ 52:*
+/ DEAD=55
+ DEAD=40
+ ALIVE=52
+
+
+/********************************************************************
+/ HELP FOR PALBART - CAN BE OMITTED WITH REAL PAL-8
+
+ KCF=6030
+ SPF=6040
+
+/********************************************************************
+/********************************************************************
+/ ZERO PAGE STUFF
+
+ *0
+INTR, 0 / INTERRUPT TARGET
+ JMP I XIHAND / JUMP TO INTERRUPT HANDLER
+XIHAND, IHAND
+
+ *10
+AUTO0, 0
+AUTO1, 1
+
+ *100
+/ MAJOR POITERS
+SPTR, DATA0 / POINTER TO SOURCE DATA (GET, COUNT)
+TPTR, DATA1 / POINTER TO TARGET DATA (SET, RESET)
+DPTR, DATA0 / POINTER TO DUMP DATA
+
+/ INTERRUPT BACKUPS
+INTAC, 0 / INTERRUPT BACKUP AC
+INTLNK, 0 / INTERRUPT BACKUP OF LINK
+
+/ TYPING THREAD DATA
+SAVTLI, 0 / SAVED LINK FOR TYPING THREAD
+SAVTAC, 0 / SAVED AC FOR TYPING THREAD
+TAC, 0 / TEMPORARY AC, USED ON TYPING START
+TTACT, 0 / TYPING THREAD ACTIVE FLAG
+
+/ KEYBOARD COMMANDS
+CMKILL, 0
+CMDUMP, 0
+
+/********************************************************************
+/ ZERO PAGE CONSTANTS
+
+K7, 7
+K10, 10
+K77, 77
+K200, 200
+K377, 377
+K7700, 7700
+
+KROWS, PROWS
+KCOLS, PCOLS
+
+KDEAD, DEAD
+KALIVE, ALIVE
+
+KNMCO, 1-PCOLS / NEGATIVE OF LAST COLUMN ADDRESS
+KNMROW, 1-PROWS / NEGATIVE OF LAST ROW ADDRESS
+KBORD, BORDER
+
+KCOLM1, -1
+KCOLP1, 1
+KROWM1, -100
+KROWP1, 100
+
+/********************************************************************
+/ ZERO PAGE POINTERS AND SHORTCUTS
+
+XDUMPS, DUMPS / START DATA DUMP
+XDUMPT, DUMPT / START DATA DUMP
+XDUMP, DUMP
+XCALC, CALC
+XTYPE, TYPE
+XGET, GET / GET A CELL STATE
+XSET, SET / SET A CELL TO LIVING
+XCLEAR, CLEAR / SET A CELL TO DEAD
+XTSTRT, TSTART
+XTSTOP, TSTOP
+XEXIT, EXIT
+XCOUNT, COUNT
+/********************************************************************
+/********************************************************************
+/ MAIN PROGRAM
+ *200
+ CLA CLL
+ DCA TTACT
+ TCF
+ ION / WELCOME TO HELL!
+
+MLOOP, / MAIN EVENT LOOP
+ JMS I XDUMP / START A DUMP, PLEASE
+ JMS I XCALC / CALCULATE NEW DATA
+ CLA CLL
+ TAD TTACT
+ SZA
+ JMP .-2
+ CLA CLL
+ TAD TPTR
+ DCA DPTR
+ TAD SPTR
+ DCA TPTR
+ TAD DPTR
+ DCA SPTR
+ JMP MLOOP
+
+EXIT, CLA CLL
+ IOF
+ TAD ADR1
+ JMS I XCOUNT
+ HLT
+
+ JMP 200
+
+ADR1, 0202
+/********************************************************************
+/ INTERRUPT HANDLER
+
+ PAGE
+
+IHAND, DCA INTAC / SAVE AC AND LINK
+ RAR
+ DCA INTLNK
+
+ KSF
+ SKP
+ JMP TTIHAN / TELETYPE INPUT
+ TSF
+ SKP
+ JMP TTOHAN / TELETYPE OUTPUT
+
+ HLT / OH, AN UNKNOWN INTERRUPT!
+
+ / RESTORE AC AND LINK AND GO BACK TO WORK
+
+IEND, CLA CLL
+ TAD INTLNK
+ RAL
+ TAD INTAC
+ ION
+ JMP I INTR / BACK TO NORMAL OPERATION
+
+/********************************************************************
+/ TELETYPE INPUT HANDLER
+
+TTIHAN,
+ KRB / READ AND CLEAR FLAG
+ AND K177 / MASK TO 7 BITS - I HATE PARITY!
+ DCA KBCHAR / SAVE FOR USE
+
+ TAD KBCHAR
+ TAD CKDMPS
+ SNA
+ JMS I XDUMPS / SOURCE DUMP (DEBUG)
+
+ CLA CLL
+ TAD KBCHAR
+ TAD CKDMPT
+ SNA
+ JMS I XDUMPT / TARGET DUMP (DEBUG)
+
+ CLA CLL
+ TAD KBCHAR
+ TAD CKDUMP
+ SNA
+ JMS I XDUMP / NORMAL DUMP
+
+ CLA CLL
+ TAD KBCHAR
+ TAD CKKILL
+ SNA
+ JMP I XEXIT
+
+ CLA CLL
+ TAD KBCHAR
+ TAD CKHALT
+ SNA
+ HLT
+
+ JMP IEND
+
+K177, 177
+KBCHAR, 0
+
+/ COMMAND KEYS
+
+CKDUMP, -104 / D
+CKDMPS, -123 / S
+CKDMPT, -124 / T
+
+CKKILL, -3 / CTRL-C
+CKHALT, -10 / CTRL-H
+
+/********************************************************************
+/ TELETYPE OUTPUT HANDLER AND MANAGEMENT
+
+TTOHAN,
+ TCF / CLEAR FLAG
+ TAD TTACT / ACTIVITY GOING ON?
+ SZA
+ JMP TRESUM / JUMP INTO ONGOING ACTIVITY
+ HLT / DEBUG HALT - THIS SHOULD NEVER BE HIT!
+ JMP IEND / DO NOTHING, SAY GOODBYE.
+
+TSTART, 0 / SCHEDULE TYPING TO BE DONE. NEW "PROCESS"
+ / STARTS ONE WORD AFTER THIS CALL'S REGULAR
+ / RETURN.
+ DCA TAC / SAVE AC FOR NOW
+
+/ TSWAIT, CLA CLL
+/ TAD TTACT
+/ SZA
+/ JMP TSWAIT / WAIT UNTIL TYPING SYSTEM IS IDLE!
+
+ CLA CLL
+ TAD TTACT
+ SZA
+ JMP I TSTART / RETURN, WE'RE BUSY!
+
+ ISZ TTACT / NOW IT IS ACTIVE (AGAIN?)
+ TAD TAC / GET BACK THE TEMPORARY AC
+ DCA SAVTAC / SAVE FOR NEW THREAD
+ RAR
+ DCA SAVTLI / SAME FOR LINK
+ TAD TSTART / POINTER TO MAIN THREAD RETURN CALL
+ IAC / NOW POINTER TO FIRST EXTRA THREAD LOCATION
+ DCA TYPE / INSTALL AS WAKEUP ADDRESS
+ SPF / WE WILL BE INTERRUPTED RIGHT NOW!
+ JMP I TSTART / RETURN TO CALLER
+
+TYPE, 0 / TYPE CHARACTER
+ TLS / GET IT OUT!
+ DCA SAVTAC / SAVE AC, JUST POLITE
+ RAR
+ DCA SAVTLI / SAVE LINK, STILL POLITE
+ JMP IEND / END OF INTERRUPT HANDLING
+TRESUM, TAD SAVTLI
+ RAL
+ TAD SAVTAC
+ JMP I TYPE / WAKE UP INTERRUPTED PROCESS
+
+TSTOP, CLA / JUMP HERE TO KILL TYPING THREAD
+ DCA TTACT / CLEAR ACTIVITY FLAG
+ TCF / CLEAR TELEPRINTER FLAG
+ JMP IEND / END OF INTERRUPT HANDLING
+
+/********************************************************************
+/ 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
+
+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
+
+/ 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.
+
+CRLF, 0
+ CLA CLL
+ TAD CR
+ JMS I XTYPE
+ CLA CLL
+ TAD LF
+ JMS I XTYPE
+ JMP I CRLF
+
+DMSK, 0
+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
+
+
+
+/********************************************************************
+/********************************************************************
+ PAGE
+DATA0,
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0007;0000;0000;0000;0000
+ 0000;0000;0000;0005;0000;0000;0000;0000
+ 0000;0000;0000;0005;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0005;0000;0000;0000;0000
+ 0000;0000;0000;0005;0000;0000;0000;0000
+ 0000;0000;0000;0007;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+
+ PAGE
+DATA1,
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+ 0000;0000;0000;0000;0000;0000;0000;0000
+
+
+/********************************************************************
+/********************************************************************
+/ THIS IS IT, FOLKS!
+/********************************************************************
+/********************************************************************
+$
+
+
\ No newline at end of file