/ 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! PCOLS=76 PROWS=23 / 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 /******************************************************************** / 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 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 /******************************************************************** /******************************************************************** 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 /******************************************************************** / PROGRAM TERMINATION - IGNORED BY OS/8! *7600 EXIT, CLA CLL IOF HLT JMP I XSTA XSTA, 200 /******************************************************************** / THIS IS IT, FOLKS! /******************************************************************** /******************************************************************** $