home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG042.ARK
/
LIFE8.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
17KB
|
999 lines
;LIFE PROGRAM FOR THE VDM
; BY WARD CHRISTENSEN
;
;THANKS TO:
; CAREY TYLER SCHUG
;FOR THE ALGORITHM OF ADDING 1 TO EACH CELL
;AROUND A LIVE ONE, INSTEAD OF COUNTING
;LIVE CELLS AROUND EACH CELL.
;
; BOB VAN VALZAH
;FOR SUGGESTING "INR M INSTEAD OF "ADI 10"
;FOR KEEPING TRACK OF THE NEXT GENERATION.
;ALSO FOR SUGGESTING THE RANDOM MUTATIONS
;(R) COMMAND.
;
; RANDY SUESS
;FOR SUGGESTING THE SPEED FUNCTION.
;
; --MODS LOG--
;
; 10/24/79
;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
;
; 12/23/79
;PUT IN LOTS MORE COMMENTS, FOR CP/M U.G.
;
ORG 100H
VDM EQU 0CC00H
VDMPORT EQU 0C8H
CR EQU 0DH
LF EQU 0AH
;MAKE FOLLOWING ' ' IF YOU HAVE NO ERASE CHAR.
;IT'S USED ONLY IN THE HELP FUNCTION, SO IS NOT
;CRITICAL
ERASE EQU 1AH ;SCREEN ERASE CHAR
CHAR EQU 0 ;SCREEN CHAR
;
JMP START
;
INITMSG DB 'LIFE8 AS OF 12/23/79',CR,LF
DB 'Type ? for help, X to exit'
DB cr,lf,cr,lf,1
;
START XRA A ;RESET VDM..
OUT VDMPORT ;..PORT
;
;INIT LOCAL STACK
;
LXI H,0
DAD SP
SHLD STACK
LXI SP,STACK
;
;SET UP BIOS VECTORS
;
LHLD 1
LXI D,3
DAD D
SHLD VCONST+1
DAD D
SHLD VKEYIN+1
DAD D
SHLD VTYPE+1
;
LXI H,INITMSG
CALL MSGPRT
;
;COMMAND MODE
;
COMMAND CALL KEYIN
COMM2 CPI '/' ! JZ RANDOM
CPI '?' ! JZ HELP
CPI '<' ! JZ SAVE
CPI '>' ! JZ RESTORE
CPI 0DH ! JZ SETRUN
CPI 'C' ! JZ CLEAR
CPI 'I' ! JZ INPUT
CPI 'M' ! JZ MOVERS
CPI 'R' ! JZ RANDHIT
CPI 'S' ! JZ SPEED
CPI 'T' ! JZ RTOGGLE
CPI 'W' ! JZ WTOGGLE
CPI 'X' ! JZ EXIT
JMP COMMAND
;
;TOGGLE THE SCREEN WRAP FLAG
;
WTOGGLE LDA WRAPFLG
XRI 1
STA WRAPFLG
JMP COMMAND
;
;REQUEST RANDOM HIT EVERY TURN
;
RANDHIT CALL KEYIN ;GET DIGIT (OR ANY CHAR)
ANI 0FH ;MAKE 0-F
MOV B,A
ADD A ;X2
ADD A ;X4
ADD B ;X5
ADD A ;X10
MOV B,A
CALL KEYIN ;GET NEXT DIGIT
ANI 0FH
ADD B
STA RFLG ;NON ZERO FLAG
JMP COMMAND
;
;TOGGLE WHETHER RANDOM HITS ARE FLIP-FLOP
; (OFF IF ON, ON IF OFF) OR JUST ON
;
RTOGGLE LDA RTOG
XRI 1
STA RTOG
MVI A,'T'
JZ RTS ;SHOW TOGGLING
MVI A,'O' ;SHOW JUST ON
RTS STA VDM+3FFH
JMP COMMAND
;
;CLEAR THE VDM
;
CLEAR LXI H,VDM
MVI B,4 ;4 PAGES
MVI A,' ' ;CHAR TO CLEAR WITH
;
CLRLP MOV M,A ;CLEAR..
INR L ;..A..
JNZ CLRLP ;..PAGE
INR H ;NEXT PAGE
DCR B ;MORE PAGES?..
JNZ CLRLP ;..YES
JMP COMMAND
;
;INPUT MODE
;
INPUT LXI H,VDM+512+32 ;CENTER OF SCREEN
LXI D,0 ;DFLT MOVE DIR=0
;
MOVE DAD D
INPLP MOV A,M ;TURN..
XRI 80H ;..ON..
MOV M,A ;..CURSOR
CALL KEYIN ;GET A CHAR
PUSH PSW ;TURN..
MOV A,M ;..OFF..
XRI 80H ;..THE..
MOV M,A ;..CURSOR
POP PSW
CPI '1' ;REPEAT REQUEST?
JC N1 ;..NO..
CPI '9'+1 ;..HI LIMIT TEST..
JC REPEAT ;..YES, REPEAT
N1 CPI ' ' ;REQUEST TO FLIP BIT?
JZ TOGGLE ;..YES, TOGGLE IT
CPI 'C' ;CLEAR?
JZ CLEAR
LXI D,64
CPI 'J' ;DOWN 1?
JZ MOVE
LXI D,-64
CPI 'K' ;UP 1?
JZ MOVE
LXI D,-1
CPI 'H' ;BACK 1?
JZ MOVE
LXI D,1
CPI 'L' ;RIGHT 1?
JZ MOVE
CPI 0DH ;RUN?
JZ SETRUN
JMP INPLP ;INVALID, TRY AGAIN
;
;TOGGLE THE BIT UNDER THE CURSOR
;
TOGGLE MOV A,M ;GET CHAR
CMA
ADI ' '+CHAR+1 ;FLIP IT
MOV M,A
JMP INPLP
;
;REPEAT DIRECTION 1-9 TIMES
;
REPEAT SUI '0' ;MAKE '1'-'9' INTO 1-9
MOV B,A ;SAVE IT
MOV A,M ;TURN..
ANI 7FH ;..OFF..
MOV M,A ;..CURSOR
REPLP DAD D ;MOVE
DCR B ;DONE?..
JNZ REPLP ;..NO
JMP INPLP
;
;SAVE A SCREEN IN MEMORY
;
SAVE CALL GETSNO ;GET SCREEN NUMBER/ADDRESS
LXI D,VDM
CALL MOVESCR ;MOVE IT
JMP COMMAND
;
;RESTORE A SCREEN FROM MEMORY
;
RESTORE CALL GETSNO ;GET SCREEN NUMBER/ADDRESS
LXI D,VDM
XCHG ;OPP. DIR. OF SAVE
CALL MOVESCR
JMP COMMAND
;
;GET A DIGIT, CONVERT IT TO A SAVED SCREEN ADDRESS
;
GETSNO CALL KEYIN ;GET THE #
ANI 0FH ;MAKE BINARY
ADD A
ADD A
ADD A
ADD A ;A=16*A
MOV L,A
MVI H,0
DAD H ;*32
DAD H
DAD H
DAD H ;*256
DAD H
DAD H ;*1024
LXI D,SCRMEM ;BASE ADDR OF SAVED SCREENS
DAD D
RET ;SCREEN ADDR IN HL
;
;----> MOVESCR MOVES 1 SCREEN FROM DE TO HL
;
MOVESCR LXI B,1024 ;SCREEN SIZE
MSLP LDAX D
INX D
MOV M,A
INX H
DCX B
MOV A,B
ORA C
JNZ MSLP
RET
;
;SETRUN - SETS UP AND RUNS
;
SETRUN LXI H,VDM
LXI D,WORK
MVI B,4
SETLOW MVI C,0 ;DEAD
MOV A,M ;GET SCREEN CHAR
CPI ' ' ;DEAD?
JZ SETL ;YES, SET IT
CPI '+' ;PAST GENERATION?
JZ SETL
MVI C,80H ;LIVE CELL IS 80H
SETL MOV A,C ;GET 0 OR 80H
STAX D ;SAVE IN WORK
INR L ;NEXT CHAR IN PAGE
INR E ; " " "
JNZ SETLOW ;END OF PAGE?
INR H ;NEXT PAGE
INR D ; " "
DCR B ;MORE PAGES?..
JNZ SETLOW ;..YES, LOOP.
;
;LOW MEMORY MATRIX IS BUILT -
;INIT GENERATION COUNTER
;
LXI H,COUNT
MVI B,10
MVI A,' '
CCLR MOV M,A
INX H
DCR B
JNZ CCLR
;
;"BLAST" THE TOP AND BOTTOM, LEFT AND RIGHT
;
RUN LXI H,WORK
PUSH H
; CALL CLRLINE ;FOUND BEST NOT TO DO THIS
POP H
LDA WRAPFLG ;WRAP AROUND?
ORA A
JZ NOWRAP
CALL CLRCOL
LXI H,WORK+63
CALL CLRCOL
NOWRAP LXI H,WORK+15*64
; CALL CLRLINE ;FOUND BEST NOT TO.
;
;ZERO # OF CELLS
;
LXI H,ALIVE
MVI B,5
MVI A,' '
BALIVE MOV M,A
INX H
DCR B
JNZ BALIVE
CALL MOVEM ;POSITION MOVERS
CALL POSTS ;SET THE POST
;
;DO SPEED DELAY
;
LDA SPDVAL
ADD A
JZ FAST ;IT'S ZERO ANYWAY
ADD A
ADD A
ADD A ;TIMES 16
MOV H,A
MVI L,0
DELAY DCX H
MOV A,H
ORA L
JNZ DELAY
FAST LXI H,WORK+64
LXI B,-65 ;INIT THINGS IN REGS..
LXI D,62 ;..FOR SPEED
;
CALC MOV A,M
ORA A ;HI BIT ON = ALIVE
JP NOADD8
;
;ADD 1 TO THE 8 AROUND A LIVE CELL
;
PUSH H
DAD B ;-65
INR M ;UPPER LEFT
INX H
INR M ;UPPER MIDDLE
INX H
INR M ;UPPER RIGHT
;
DAD D ;+62
INR M ;LEFT MIDDLE
INX H ;SKIP MID-MID
INX H
INR M ;RIGHT MIDDLE
;
DAD D ;+62 TO BOTTOM LINE
INR M ;LOWER LEFT
INX H
INR M ;LOWER MIDDLE
INX H
INR M ;LOWER RIGHT
LXI H,ALIVE+3
CALL ADD1
POP H
NOADD8 INR L ;NEXT CELL IN PAGE
JNZ CALC ;
INR H ;NEXT PAGE
MOV A,H ;SEE IF DONE
CPI 4+(WORK/256)
JNZ CALC
;
;GOT NEXT GENERATION - SHOW IT
;
CALL SHOW
CALL CONST ;KEY PRESSED?
JZ RUN ;NO, RUN
;
;----> END OF GENERATION
;
CALL KEYIN ;GET THE CHAR
CPI '+'
JZ TOGGEN2 ;TOGGLE GENERATION 2
CPI '_'
JZ TOGBIR ;TOGGLE BIRTH FLAG
CPI 'A'
JZ TOGMOVE ;TOGGLE SINGLE MOVER
CPI ' '
JZ TOGPOST
CPI 'H'
JZ POSTL ;LEFT
CPI 'J'
JZ POSTD ;DOWN
CPI 'K'
JZ POSTU ;UP
CPI 'L'
JZ POSTR ;RIGHT
CPI '0'
JC COMM2 ;NOT SPEED REQ
CPI '9'+1
JC SETSPD
JMP COMM2
;
;TOGGLE GENERATION 2 - CAUSES '+' TO APPEAR ON
;SCREEN FOR CELLS IN THE "PREVIOUS GENERATION"
;(JUST FOR ALL YOU REINCARNATIONISTS OUT THERE)
;
TOGGEN2 LXI H,PAST+1
MVI A,'+'+' ' ;<-- YES, THAT'S RIGHT
SUB M
MOV M,A ;TOGGLE BETWEEN '+' AND ' '
JMP RUN
;
;TOGGLE THE REV VIDEO FOR BIRTHS FLAG.
;
TOGBIR LDA BIRTH+1
XRI 80H
STA BIRTH+1
JMP RUN
;
;TOGGLE POSTS ON/OFF
;
TOGPOST LXI H,POSTCHR
MVI A,' '+CHAR
SUB M
MOV M,A
JMP RUN
;
;MOVE POSTS, UP, DOWN, LEFT, RIGHT
;
POSTU LDA POST ;GET VERT POST POS.
DCR A
STA POST
JMP RUN
POSTD LDA POST
INR A
STA POST
JMP RUN
POSTL LDA POST+1 ;GET HORIZ POST POS
DCR A
STA POST+1
JMP RUN
POSTR LDA POST+1
INR A
STA POST+1
JMP RUN
;
;SET SPEED DURING RUN, CONTINUE RUNNING
;
SPEED CALL KEYIN ;GET THE SPEED
SETSPD ANI 0FH ;SAVE 4 BITS
STA SPDVAL
JMP RUN ;..THEN RUN
;
;TOGGLE SINGLE BIT OF MOVER ON/OFF
;DURING RUN
;
TOGMOVE LDA NMOVERS
XRI 1
STA NMOVERS
JMP RUN
;
;SHOW THE RESULTS
;
SHOW LXI D,WORK
LXI H,VDM
MVI B,4
MVI C,' ' ;DEAD CELL
SHOWLP LDAX D
ORA A
JZ DEAD
CPI 80H ;LIVE IN PAST GEN?
JZ PAST ;PAST GENERATION ONLY
CPI 82H ;LIVE W/2 NEIGHBORS?
JZ LIVE
CPI 3 ;DEAD, 3 NEIGHBORS?
JZ BIRTH ;A NEW BOUNCING BABY ZORK
CPI 83H ;LIVE, 3 NEIGHBORS?
JZ LIVE
ORA A
JM PAST ;WAS ALIVE?
JMP DEAD
;
BIRTH MVI M,CHAR
JMP LIVE2
;
LIVE MVI M,CHAR
LIVE2 MVI A,80H
JMP STCELL
;
;PAST GENERATION WAS ALIVE, STORE '+' OR ' '
;
PAST MVI M,' ' ;GET CHAR (MOD BY "+" COMMAND)
JMP DEAD2
;
DEAD MOV M,C ;MOVE IN ' '
DEAD2 XRA A
STCELL STAX D
INR L ;MORE IN PAGE?
INR E
JNZ SHOWLP
INR H ;NEXT PAGE
INR D
DCR B ;DONE?
JNZ SHOWLP
;
;PUT IN A RANDOM HIT
;
LDA RFLG ;RANDOM HIT REQ?
ORA A
CNZ RHIT ;RANDOM HIT
;
;COUNT THE GENERATIONS
;
LXI H,COUNT+9
CALL ADD1 ;ADD IN 1
;
;SHOW THE GENERATION COUNT
;
SHOWCT LXI H,VDM+3FFH
LXI D,COUNT+9
MVI B,14
CTMVLP LDAX D
MOV M,A
DCX D
DCX H
DCR B
JNZ CTMVLP
RET
;
;ROUTINE TO ADD 1 TO AN ASCII NUMBER
;
ADD1 MOV A,M
ORI '0' ;CONV ' ' TO '0'
INR A
MOV M,A
CPI '9'+1 ;CARRY?
RNZ ;..NO, RETURN
MVI M,'0' ;STORE 0,..
DCX H ;..BACK UP
JMP ADD1 ;..BUMP HIGHER DIGIT
;
;RANDOMLY HIT THE MATRIX
;
RHIT LDA RFLG
MOV B,A ;COUNT
RHLP CALL RAND ;GET ROW
ANI 0F0H ;MAKE 4 BIT NUMBER * 16
MOV L,A
MVI H,0
DAD H ;*32
DAD H ;*64
CALL RAND ;CALL TWICE TO MIX 'EM UP
CALL RAND ;GET COL
ANI 3FH ;SAVE DISPL
ADD L ;ADD IN (CAN'T CARRY)
MOV L,A
XCHG
LXI H,WORK ;TO BASE
DAD D ;ADD DISPL
LDA RTOG ;SEE IF TOGGLING
ORA A
JZ TOG ;..YES
;
;STORE CHAR ON, INSTEAD OF JUST TOGGLING
;
MVI M,80H ;NOT TOGGLE, JUST TURN ON
LXI H,VDM
DAD D
MVI M,CHAR
JMP RHCONT
TOG MVI A,80H ;TOGGLE THE CELL
XRA M
MOV M,A
LXI H,VDM
DAD D ;FLIP ON THE SCREEN, TOO
MVI A,' '+CHAR
SUB M
MOV M,A
RHCONT DCR B
JNZ RHLP
RET ;FROM RHIT
;
;CLEAR LINE OF VDM (I BELIEVE I NO LONGER USE THIS)
;
CLRLINE MVI A,0
MVI B,64
CLRLLP MOV M,A
INX H
DCR B
JNZ CLRLLP
RET ;FROM CLRLINE
;
;CLEAR A COLUMN OF THE VDM - USED
;WHEN NOT WRAPPING LEFT/RIGHT
;
CLRCOL LXI D,64
MVI A,0
MVI B,16
CLRCLL MOV M,A
DAD D
DCR B
JNZ CLRCLL
RET ;FROM CLRCOL
;
;CP/M CONSOLE STAUS TEST
;
CONST PUSH B
PUSH D
PUSH H
VCONST CALL $-$
POP H
POP D
POP B
ORA A ;SET 0 IF NO CHAR
RET
;
;CP/M KEYBOARD INPUT ROUTINE
;
KEYIN PUSH B
PUSH D
PUSH H
VKEYIN CALL $-$
ANI 7FH
POP H
POP D
POP B
STA VDM+3FFH ;"ECHO" CHAR
CPI 61H ;LOWER CASE A?
RC
ANI 5FH ;MAKE UPPER CASE
RET ;(TURNS DEL INTO "_")
;
;CP/M CHARACTER OUTPUT
;
TYPE PUSH B
PUSH D
PUSH H
MOV C,A
VTYPE CALL $-$
POP H
POP D
POP B
RET
;
;EXIT, RETURNING TO CP/M
;
EXIT LHLD STACK
SPHL
RET
;
;RANDOM SCREEN FILL
;
RANDOM CALL KEYIN ;GET DENSITY
ANI 0FH ;MAKE IT 0-F HEX
MOV C,A ;SAVE DENSITY
LXI H,VDM
RANFILL CALL RAND
CALL RAND
ANI 0FH
CMP C ;THIS CELL?
MVI A,CHAR
JNC NSTORE ;NO
MOV M,A
NSTORE INX H
MOV A,H
CPI 4+(VDM/256)
JNZ RANFILL
JMP COMMAND
;
;MOVERS:
; ARE SINGLE CELLS WHICH STAY ALIVE,
; AND MOVE ABOUT THE SCREEN. WHEN
; THEY TOUCH SOMETHING, THEY EFFECT IT,
; BUT CONTINUE TO MOVE, UNDYING.
;
MOVERS CALL KEYIN ;GET HOW MANY
ANI 0FH
STA NMOVERS ;SET COUNT
JZ COMMAND ;NONE
;
;GOT REQUEST FOR MOVERS, RANDOMLY SET UP
;EACH ONES POSITION, AND DIRECTION.
;
MOV B,A ;SAVE COUNT
LXI H,NMOVERS+1 ;TO TABLE
MOVESET CALL DISP ;GET INITIAL DIRECTION
MOV M,A
INX H
CALL RAND ;GET ROW
RAR ! RAR ! RAR ;MIX THINGS UP
ANI 0FH
MOV M,A ;SAVE ROW
INX H ;POINT TO COLUMN DISP
CALL DISP
ADD A ;X2
MOV C,A
CALL DISP
ADD C
MOV M,A ;STORE COL DISP
INX H
CALL RAND ;GET COLUMN
ANI 3FH ;ISOLATE COLUMN
MOV M,A
INX H ;TO NEXT ROW DISP
DCR B ;MORE?
JNZ MOVESET ;..YES, LOOP
JMP COMMAND ;..NO RETURN
;
;MOVE THE RANDOM MOVERS (IF ANY)
;
MOVEM LDA NMOVERS
ORA A
RZ ;NONE
LXI H,NMOVERS+1 ;POINT TO TABLE
MOV B,A ;SAVE COUNT
MOVEMLP MOV A,M ;GET ROW DISP
INX H ;TO ROW
ADD M ;MODIFY ROW
JM BADROW ;DON'T GO <0
CPI 15
JC ROWOK
BADROW DCX H ;BACK TO DISPL
CALL DISP
MOV M,A
INX H ;BACK TO ROW
MOV A,M ;GET OLD
JMP OLDROW ;USE OLD THIS TIME
ROWOK MOV M,A ;SAVE NEW POSITION
OLDROW XCHG ;SAVE HL
MOV L,A
MVI H,0 ;SETUP FOR MULT
DAD H
DAD H
DAD H
DAD H
DAD H
DAD H ;X64
XCHG ;HL BACK
;
INX H ;TO COL DISP
MOV A,M
INX H
ADD M ;MODIFY ROW
JM BADCOL ;DON'T GO < 0
CPI 63
JC COLOK
;
BADCOL DCX H ;BACK TO DISPL
CALL DISP
ADD A ;X2
MOV C,A
CALL DISP
ADD C
MOV M,A
INX H ;BACK TO COL
MOV A,M ;GET OLD
JMP OLDCOL ;USE OLD THIS TIME
COLOK MOV M,A ;SAVE NEW POSITION
OLDCOL INX H ;TO NEXT ROW DISP
ADD E ;CALC POS
MOV E,A
PUSH H
LXI H,VDM
DAD D
MVI A,'A'-1
ADD B ;'A'=FIRST, ETC
MOV M,A
LXI H,WORK
DAD D
MVI M,80H ;SET LIVE
POP H
DCR B
JNZ MOVEMLP
RET
;
;CALCULATE A DISPLACEMENT FOR MOVERS,
; -1, 0, OR 1
;
DISP CALL RAND ;MIX 'EM UP
CALL RAND ;GET A DIRECTION
ANI 3
JZ DISP ;MAKE IT 1, 2, 3
SUI 2 ;MAKE IT -1, 0, 1
JZ DISP ;TRY AGAIN IF 0
RET
;
;POST IS A NEVER DYING, NEVER MOVING CELL,
;WHICH IS CONTROLLABLE IN RUN MODE AS IF
;YOU WERE IN INPUT MODE
;
POSTS LDA POSTCHR
CPI ' '
RZ
LDA POST
MOV L,A
MVI H,0
DAD H
DAD H
DAD H
DAD H
DAD H
DAD H ;X64
LDA POST+1 ;GET COLUMN
ADD L
MOV L,A
XCHG
LXI H,VDM
DAD D
MVI M,CHAR
LXI H,WORK
DAD D
MVI M,80H
RET
;
;RANDOM NUMBER GENERATOR,
;(SHIFT AND EXCLUSIVE-OR TYPE)
;
RAND PUSH H
PUSH B
LXI H,RNO
PUSH H
MVI B,7 ;LENGTH
ORA A
RANDLP MOV A,M
RAL
MOV M,A
INX H
DCR B
JNZ RANDLP
DCX H ;TO LAST DIGIT
RAL
RAL
XRA M
RLC
ANI 1
POP H
ORA M
MOV M,A
POP B
POP H
RET
;
;HELP MODE - PRINT MENU, ACCEPT SINGLE
;CHAR COMMAND FOR DETAIL HELP
;
HELP MVI A,ERASE ;WARD'S SCREEN CLEAR
CALL TYPE
LXI H,HMSG
CALL MSGPRT
CALL KEYIN
MOV B,A ;SAVE FOR MATCH
LXI H,HMSG
HFIND MOV A,M
ORA A
JZ COMMAND ;NOT FOUND
DCR A
INX H
JNZ HFIND
;
;AT CHAR. SEE IF IT MATCHES
;
MOV A,B
CMP M
JNZ HFIND
INX H
MVI A,ERASE
CALL TYPE
CALL MSGPRT ;PRINT IT
LXI H,MSG2
CALL MSGPRT
JMP COMMAND
;
;PRINT MSG POINTED TO BY HL, 1 TERMINATES
;
MSGPRT MOV A,M
CALL TYPE
INX H
MOV A,M
CPI 1
RZ
JMP MSGPRT
;
MSG2 DB cr,lf,'..back to command mode now.',cr,lf
db 'type ? again if required.',cr,lf,1
;
HMSG db 'Command: /* command mode */',cr,lf
db ' C/R goto Run',cr,lf
db ' / goto Random fill',cr,lf
db ' < goto Save',cr,lf
db ' > goto Restore',cr,lf
db ' C goto Clear',cr,lf
db ' I goto Input',cr,lf
db ' M goto Movers',cr,lf
db ' R goto Random mutate',cr,lf
db ' S goto Set speed',cr,lf
db ' T goto Toggle',cr,lf
DB ' W goto Wrap',cr,lf
db ' X exit to CP/M',cr,lf
db 'More help? Type command char, '
db 'or space to return to command.',cr,lf
;
DB 1,'S'
DB 'Set speed:',cr,lf
db ' 0-9 Set speed (0=fastest)',cr,lf
db ' goto Command',cr,lf
;
db 1,'W'
db 'Wrap:',cr,lf
db ' Toggle the screen wrap (l/r) bit'
db ' goto Command.',cr,lf
;
db 1,'C'
db 'Clear:',cr,lf
db ' Clear the screen.',cr,lf
db ' Goto command.',cr,lf
;
db 1,'I'
db 'Input: /* input mode */',cr,lf
db ' (space) toggle char under cursor.',cr,lf
db ' J down 1; goto Input',cr,lf
db ' H back 1; goto Input',cr,lf
db ' K up 1; goto Input',cr,lf
db ' L right 1 ;goto Input',cr,lf
db ' 0-9 repeat prev direction '
db 'n times; goto Input',cr,lf
db ' C/R R goto Run',cr,lf
db ' C goto Clear',cr,lf
db ' goto Input',cr,lf
;
db 1,'X'
db ' X returns immediately to CP/M',cr,lf
;
db 1,cr
db 'Run: /* run mode */',cr,lf
db ' A toggle single mover on/off',cr,lf
db ' 0-9 set speed',cr,lf
DB ' + toggle death show flag',cr,lf
db ' _ toggles birth show flag',cr,lf
db ' (space) toggles "post" (undying cell) '
db 'on/off',cr,lf
db ' H, J, K, L move the "post" as if in '
db 'input mode',cr,lf
db ' (any char: goto command '
db 'with that char)',cr,lf
;
db 1,'/'
db 'Random fill:',cr,lf
db ' Accept a digit, ANI 0FH.',cr,lf
db ' Fill screen randomly, density n/16.',cr,lf
db ' goto Command.',cr,lf
;
db 1,'M'
db 'Movers:',cr,lf
db ' Accept a digit, which is how many',cr,lf
db ' movers on screen per generation.',cr,lf
db ' goto Command.',cr,lf
;
db 1,'<'
db 'Save:',cr,lf
db ' Accept a digit.',cr,lf
db ' Save current screen under that number'
db cr,lf,' Goto command.',cr,lf
;
db 1,'>'
db 'Restore:',cr,lf
db ' Accept a digit.',cr,lf
db ' Restore screen under that number'
db cr,lf,' Goto command.',cr,lf
;
db 1,'T'
db 'Toggle:',cr,lf
db ' Toggle random mutation switch,',cr,lf
db ' to toggle (=T) or only turn on (=O)'
db cr,lf,' when mutating.',cr,lf
db ' (Bottom corner shows the T or O)'
db cr,lf,cr,lf
;
db 1,'R'
db 'Random mutate',cr,lf
db ' Accept a 2 digit number.',cr,lf
db ' Store as # of random hits per cycle.',cr,lf
db ' goto Command.',cr,lf,1,0
;
SPDVAL DB 0 ;SPEED (0=FAST)
WRAPFLG DB 0 ;WRAP SCREEN?
RNO DB 1,0FEH,0AFH,45,34,26,18,45,27
DB 1,2,3,4,5
;
RTOG DB 0 ;TOGGLE RANDOM OR JUST ON?
RFLG DB 0 ;1 IF RANDOM
;
POSTCHR DB ' '
POST DB 8,32 ;UNMOVABLE OBJECT
;
;MOVERS TABLE (FOLLOWS NMOVERS)
; ROW DISP, ROW, COL DISP, COL
;
NMOVERS DB 0 ;# OF MOVERS
DB 3,1,1,1 ;DEFAULT FIRST MOVER
DS 4*15 ;TABLE FOR 15 MOVERS
;
ALIVE DS 5
COUNT DS 10
;
DS 100
STACK DS 2
;
WORK ORG ($+255) AND 0FF00H
DS 1024 ;1 SCREEN
DS 64 ;LAST LINE GARBAGE HERE
;
;DEFINE MEMORY FOR UP TO 16 SAVED SCREENS
;
SCRMEM EQU $