/ life.asm 2005-01-02 / CONSTANTS EQU ZERO 000 EQU CTLC 003 EQU BS 010 EQU GRID_SIZE 110 EQU CTLP 020 EQU NUM_ROWS 030 EQU NUM_COLS 030 EQU SPACE 040 EQU DOT 056 EQU QUIT 161 EQU CX 130 EQU CAPQUIT 121 EQU CR 015 EQU LF 012 EQU VT 013 EQU FF 014 EQU ASTERISK 052 / DATA OFFSETS [ON PAGE ABOVE END OF CODE] EQU OLD_GRID 000 /CURRENT PATTERN EQU NEW_GRID 110 /NEXT PATTERN EQU CUR_ROW 220 /ROW BEING ANALYZED EQU CUR_COL 221 /COLUMN BEING ANALYZED EQU END_DATA 222 /END OF DATA ORG 001 000 /LOAD ABOVE RST VECTORS ENTRY START /INITIALIZE DATA START, LHI FINIS/400 /LAST PAGE OF PROGRAM INH /DATA PAGE /GET NEW SETUP NEW, CAL CLEAR_DATA /CLEAR ALL DATA LAI FF /FORM FEED CAL CON /CLEAR SCREEN NXTKBD, CAL KBD /GET USER INPUT CPI CTLC /ABORT? RTZ /YES - RETURN TO MONITOR CPI BS /BACK SPACE? JTZ PRVCHR /YES CPI QUIT /END OF INPUT? JTZ NEXT /GO FIGURE CPI CAPQUIT /END OF INPUT? JTZ NEXT /GO FIGURE CAL CON /ECHO TO USER CPI CR /END OF ROW? JFZ NXTCHR /NO, CONTINUE CAL NEWROW /SKIP REST OF ROW LAI LF /NEW LINE CAL CON /ECHO TO USER JMP NXTKBD /KEEP IT MOVING NXTCHR, CPI SPACE /EMPTY CELL? JTZ NXTCOL /MARK CELL EMPTY CPI DOT /EMPTY CELL? JTZ NXTCOL /MARK CELL EMPTY CAL LOADMC /POINT TO CELL ORM /UPDATE CELL JMP NXTCOL /DONE WITH THIS ENTRY MEMPTY, CAL LOADMC /POINT TO CELL XRI 377 /INVERT MASK FOR AND NDM /UPDATE CELL NXTCOL, LMA /SAVE UPDATE CAL CHKEOL /ADVANCE AND CHECK EOL JTZ NEXT /GRID IS FULL JMP NXTKBD /KEEP IT MOVING PRVCHR, LLI CUR_COL /CURRENT COL LBM /GET COL DCB /BACK UP ONE COLUMN JTS NXTKBD /ALREADY AT START OF ROW LMB /UPDATE ROW LAI BS /BACK SPACE CAL CON /ECHO TO DISPLAY JMP NXTKBD /TRY AGAIN /CALCULATE NEXT ITERATION NEXT, CAL CLEAR_NEW /CLEAR NEW GRID CAL CLRPTR /CLEAR ROW AND COLUMN POINTERS CHKALL, CAL TSTCEL /DOES CELL EXIST? JTZ BIRTH /NO CAL CHKUL /COUNT NEIGHBORS LAC /DOES THIS CELL LIVE? CPI 002 /LONELY? JTS CHKNXT /YES CPI 004 /CROWDED? JFS CHKNXT /YES CAL SETNEW /MARK NEW GRID JMP CHKNXT BIRTH, CAL CHKUL /COUNT NEIGHBORS LAC /NEIGHBOR COUNT CPI 003 /BLESSED EVENT? JFZ CHKNXT /NO CAL SETNEW /MARK NEW GRID CHKNXT, CAL NXTCEL /ADVANCE ROW AND COL JFZ CHKALL /ANALYZE NEXT POINT /DISPLAY RESULT DISPLAY, LAI FF /FORM FEED CAL CON /CLEAR SCREEN CAL COPY_NEW /GET NEW GENERATION CAL CLRPTR /CLEAR ROW AND COLUMN POINTERS NXTDSP, CAL TSTCEL /DOES CELL EXIST? JTZ DSPSP /GO DISPLAY SPACE LAI CX JMP DSPCEL DSPSP, LAI SPACE DSPCEL, CAL CON /DISPLAY CELL CAL CHKEOL /ADVANCE AND MAYBE SEND LF JTZ CHECK /DONE JMP NXTDSP /KEEP IT MOVING /CHECK FOR NEW SETUP CHECK, INP 0 /GET INPUT STATUS NDI 001 /KBD READY? JTZ NEXT /NO CAL KBD /GET KEYSTROKE CPI CR /RESTART? JTZ NEW /YES CAL KBD /WAIT FOR ANY KEY JMP NEXT /RESTART ANIMATION /SUBROUTINES KBD, INP 0 /GET INPUT STATUS NDI 001 /KBD READY? JTZ KBD /NO INP 1 /READ KBD LBA /SAVE INPUT CHAR LAI 376 /PORT 11 RESET MASK OUT 10 /ACK KBD LAB /RESTORE INPUT RET CON, OUT 11 /WRITE TO DISPLAY RET CLEAR_DATA, LLI OLD_GRID /START OF DATA LAI END_DATA /END OF DATA SUL /LESS START LBA /COUNT LAI ZERO /VALUE TO SET CLEAR_NXT, LMA /ZERO FIELD INL /NEXT BYTE DCB /DECREMENT COUNT JFZ CLEAR_NXT /KEEP IT MOVING RET CLEAR_NEW, LLI NEW_GRID /START OF DATA LAI CUR_ROW /END OF DATA SUL /LESS START LBA /COUNT LAI ZERO /VALUE TO SET NXT_NEW, LMA /ZERO FIELD INL DCB /DECREMENT COUNT JFZ NXT_NEW /KEEP IT MOVING RET COPY_NEW, LLI OLD_GRID /START OF DATA LAI NEW_GRID /END OF DATA SUL /LESS START LBA /COUNT COPY_NXT, LAL /OLD GRID POINTER ADI GRID_SIZE /OFFSET TO NEW GRID LLA /NEW GRID POINTER LCM /VALUE TO MOVE SUI GRID_SIZE /OFFSET TO OLD GRID LLA /OLD GRID POINTER LMC /MOVE VALUE INL /NEXT BYTE DCB /DECREMENT COUNT JFZ COPY_NXT /KEEP IT MOVING RET / COUNT NEIGHBOR AT PASSED CELL CNT_CELL, CAL MASK_CELL /POINT TO CELL NDM /TEST CELL RTZ /NO CELL FOUND INC /COUNT CELL RET / LOAD CURRENT ROW AND COL AND / FALL THROUGH TO MASK_CELL LOADMC, LLI CUR_ROW /POINT TO ROW LDM /GET ROW INL /POINT TO COLUMN LEM /GET COL / CONVERT D=ROW:E=COL TO HL->OFFSET:A=MASK MASK_CELL, LAD /ROW ADD /ROW*2 ADD /ROW*3 LLA /SAVE PARTIAL RESULT LAE /COLUMN NDI 370 /CLEAR REMAINDER BITS RRC /COLUMN/2 RRC /COLUMN/4 RRC /COLUMN/8 ADL /ADD TO PREVIOUS RESULT LLA /RETURN OFFSET LAE /COLUMN NDI 007 /ISOLATE SHIFT BITS LEA /MOVE TO COUNTER LAI 200 /MASK FOR FIRST BIT SHIFT, JTZ MASK_END /NOTHING TO SHIFT RRC /SHIFT MASK BIT DCE /DECREMENT COUNTER JMP SHIFT /KEEP IT MOVING MASK_END, RET /ADVANCE TO NEXT CELL - RETURN ZFLAG IF DONE NXTCEL, LLI CUR_COL /CURRENT COL LAM /LOAD COL ADI 001 /NEXT COL LMA /SAVE UPDATED COL CPI NUM_COLS /DONE WITH ROW? JTZ NEWROW /YES RET NEWROW, XRA /CLEAR ACCUMULATOR LLI CUR_COL /CURRENT COL LMA /RESET COL DCL /POINT TO ROW LAM /LOAD ROW ADI 001 /NEXT ROW LMA /SAVE UPDATED ROW CPI NUM_ROWS /ALL ROWS DONE? RET /COUNT NEIGHBORS OF PASSED CELL / CHECK UL NEIGHBOR CHKUL, LLI CUR_ROW /CURRENT ROW LCI ZERO /CLEAR COUNT REGISTER LDM DCD /IN TOP ROW? JTS CHKUM /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM DCE /IN LEFT COLUMN? CFS CNT_CELL /COUNT THIS CELL / CHECK UM NEIGHBOR CHKUM, LLI CUR_ROW /CURRENT ROW LDM DCD /IN TOP ROW? JTS CHKUR /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM CAL CNT_CELL /COUNT THIS CELL / CHECK UR NEIGHBOR CHKUR, LLI CUR_ROW /CURRENT ROW LDM DCD /IN TOP ROW? JTS CHKML /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM INE LAE CPI NUM_COLS /IN RIGHT COLUMN? CFZ CNT_CELL /COUNT THIS CELL / CHECK ML NEIGHBOR CHKML, LLI CUR_ROW /CURRENT ROW LDM INL /POINT TO COL LEM DCE /IN LEFT COLUMN? CFS CNT_CELL /COUNT THIS CELL / CHECK MR NEIGHBOR CHKMR, LLI CUR_ROW /CURRENT ROW LDM INL /POINT TO COL LEM INE LAE CPI NUM_COLS /IN RIGHT COLUMN? CFZ CNT_CELL /COUNT THIS CELL / CHECK LL NEIGHBOR CHKLL, LLI CUR_ROW /CURRENT ROW LDM IND LAD CPI NUM_ROWS /IN BOTTOM ROW? JTZ CHKLM /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM DCE /IN LEFT COLUMN? CFS CNT_CELL /COUNT THIS CELL / CHECK LM NEIGHBOR CHKLM, LLI CUR_ROW /CURRENT ROW LDM IND LAD CPI NUM_ROWS /IN BOTTOM ROW? JTZ CHKLR /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM CAL CNT_CELL /COUNT THIS CELL / CHECK LR NEIGHBOR CHKLR, LLI CUR_ROW /CURRENT ROW LDM IND LAD CPI NUM_ROWS /IN BOTTOM ROW? JTZ CHKEND /NO POSSIBLE NEIGHBOR INL /POINT TO COL LEM INE LAE CPI NUM_COLS /IN RIGHT COLUMN? CFZ CNT_CELL /COUNT THIS CELL CHKEND, RET /TEST IF CELL EXISTS - RETURNS ZFLAG TSTCEL, CAL LOADMC /POINT TO CELL NDM /TEST CELL RET /CLEAR ROW AND COLUMN POINTERS CLRPTR, XRA /CLEAR ACCUMULATOR LLI CUR_ROW /POINT TO ROW LMA /CLEAR ROW INL /POINT TO COL LMA /CLEAR COLUMN RET /MARK NEW GRID SETNEW, CAL LOADMC LBA /SAVE MASK LAL /OFFSET ADI GRID_SIZE LLA /POINT INTO NEW GRID LAM /GET CURRENT POINTS ORB /ADD CURRENT POINT LMA /UPDATE NEW GRID RET /ADVANCE ROW & COLUMN AND SEND CRLF IF EOL CHKEOL, CAL NXTCEL /ADVANCE ROW AND COLUMN RTZ /DONE LLI CUR_COL /POINT TO COLUMN LAM /COLUMN NUMBER ORA /SET CONDITION FLAGS RFZ /ROW NOT FINISHED LAI CR /CARRIAGE RETURN CAL CON LAI LF /NEW LINE CAL CON /SEND TO CONSOLE ORA /TURN OFF ZFLAG RET FINIS, HLT /END OF PROGRAM