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 >
Assembly Source File  |  1984-04-29  |  17KB  |  999 lines

  1. ;LIFE PROGRAM FOR THE VDM
  2. ;    BY WARD CHRISTENSEN
  3. ;
  4. ;THANKS TO:
  5. ;    CAREY TYLER SCHUG
  6. ;FOR THE ALGORITHM OF ADDING 1 TO EACH CELL
  7. ;AROUND A LIVE ONE, INSTEAD OF COUNTING
  8. ;LIVE CELLS AROUND EACH CELL.
  9. ;
  10. ;    BOB VAN VALZAH
  11. ;FOR SUGGESTING "INR M INSTEAD OF "ADI 10"
  12. ;FOR KEEPING TRACK OF THE NEXT GENERATION.
  13. ;ALSO FOR SUGGESTING THE RANDOM MUTATIONS
  14. ;(R) COMMAND. 
  15. ;
  16. ;    RANDY SUESS
  17. ;FOR SUGGESTING THE SPEED FUNCTION.
  18. ;
  19. ;    --MODS LOG--
  20. ;
  21. ;    10/24/79
  22. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  23. ;
  24. ;    12/23/79
  25. ;PUT IN LOTS MORE COMMENTS, FOR CP/M U.G.
  26. ;
  27.     ORG    100H
  28. VDM    EQU    0CC00H
  29. VDMPORT    EQU    0C8H
  30. CR    EQU    0DH
  31. LF    EQU    0AH
  32. ;MAKE FOLLOWING ' ' IF YOU HAVE NO ERASE CHAR.
  33. ;IT'S USED ONLY IN THE HELP FUNCTION, SO IS NOT
  34. ;CRITICAL
  35. ERASE    EQU    1AH    ;SCREEN ERASE CHAR
  36. CHAR    EQU    0      ;SCREEN CHAR
  37. ;
  38.     JMP    START
  39. ;
  40. INITMSG    DB    'LIFE8 AS OF 12/23/79',CR,LF
  41.     DB    'Type ? for help, X to exit'
  42.     DB    cr,lf,cr,lf,1
  43. ;
  44. START    XRA    A    ;RESET VDM..
  45.     OUT    VDMPORT    ;..PORT
  46. ;
  47. ;INIT LOCAL STACK
  48. ;
  49.     LXI    H,0
  50.     DAD    SP
  51.     SHLD    STACK
  52.     LXI    SP,STACK
  53. ;
  54. ;SET UP BIOS VECTORS
  55. ;
  56.     LHLD    1
  57.     LXI    D,3
  58.     DAD    D
  59.     SHLD    VCONST+1
  60.     DAD    D
  61.     SHLD    VKEYIN+1
  62.     DAD    D
  63.     SHLD    VTYPE+1
  64. ;
  65.     LXI    H,INITMSG
  66.     CALL    MSGPRT
  67. ;
  68. ;COMMAND MODE
  69. ;
  70. COMMAND    CALL    KEYIN
  71. COMM2    CPI    '/'    ! JZ    RANDOM
  72.     CPI    '?'    ! JZ    HELP
  73.     CPI    '<'    ! JZ    SAVE
  74.     CPI    '>'    ! JZ    RESTORE
  75.     CPI    0DH    ! JZ    SETRUN
  76.     CPI    'C'    ! JZ    CLEAR
  77.     CPI    'I'    ! JZ    INPUT
  78.     CPI    'M'    ! JZ    MOVERS
  79.     CPI    'R'    ! JZ    RANDHIT
  80.     CPI    'S'    ! JZ    SPEED
  81.     CPI    'T'    ! JZ    RTOGGLE
  82.     CPI    'W'    ! JZ    WTOGGLE
  83.     CPI    'X'    ! JZ    EXIT
  84.     JMP    COMMAND
  85. ;
  86. ;TOGGLE THE SCREEN WRAP FLAG
  87. ;
  88. WTOGGLE    LDA    WRAPFLG
  89.     XRI    1
  90.     STA    WRAPFLG
  91.     JMP    COMMAND
  92. ;
  93. ;REQUEST RANDOM HIT EVERY TURN
  94. ;
  95. RANDHIT    CALL    KEYIN    ;GET DIGIT (OR ANY CHAR)
  96.     ANI    0FH    ;MAKE 0-F
  97.     MOV    B,A
  98.     ADD    A    ;X2
  99.     ADD    A    ;X4
  100.     ADD    B    ;X5
  101.     ADD    A    ;X10
  102.     MOV    B,A
  103.     CALL    KEYIN    ;GET NEXT DIGIT
  104.     ANI    0FH
  105.     ADD    B
  106.     STA    RFLG    ;NON ZERO FLAG
  107.     JMP    COMMAND
  108. ;
  109. ;TOGGLE WHETHER RANDOM HITS ARE FLIP-FLOP
  110. ;    (OFF IF ON, ON IF OFF) OR JUST ON
  111. ;
  112. RTOGGLE    LDA    RTOG
  113.     XRI    1
  114.     STA    RTOG
  115.     MVI    A,'T'
  116.     JZ    RTS    ;SHOW TOGGLING
  117.     MVI    A,'O'    ;SHOW JUST ON
  118. RTS    STA    VDM+3FFH
  119.     JMP    COMMAND
  120. ;
  121. ;CLEAR THE VDM
  122. ;
  123. CLEAR    LXI    H,VDM
  124.     MVI    B,4    ;4 PAGES
  125.     MVI    A,' '    ;CHAR TO CLEAR WITH
  126. ;
  127. CLRLP    MOV    M,A    ;CLEAR..
  128.     INR    L    ;..A..
  129.     JNZ    CLRLP    ;..PAGE
  130.     INR    H    ;NEXT PAGE
  131.     DCR    B    ;MORE PAGES?..
  132.     JNZ    CLRLP    ;..YES
  133.     JMP    COMMAND
  134. ;
  135. ;INPUT MODE
  136. ;
  137. INPUT    LXI    H,VDM+512+32 ;CENTER OF SCREEN
  138.     LXI    D,0    ;DFLT MOVE DIR=0
  139. ;
  140. MOVE    DAD    D
  141. INPLP    MOV    A,M    ;TURN..
  142.     XRI    80H    ;..ON..
  143.     MOV    M,A    ;..CURSOR
  144.     CALL    KEYIN    ;GET A CHAR
  145.     PUSH    PSW    ;TURN..
  146.     MOV    A,M    ;..OFF..
  147.     XRI    80H    ;..THE..
  148.     MOV    M,A    ;..CURSOR
  149.     POP    PSW
  150.     CPI    '1'    ;REPEAT REQUEST?
  151.     JC    N1    ;..NO..
  152.     CPI    '9'+1    ;..HI LIMIT TEST..
  153.     JC    REPEAT    ;..YES, REPEAT
  154. N1    CPI    ' '    ;REQUEST TO FLIP BIT?
  155.     JZ    TOGGLE    ;..YES, TOGGLE IT
  156.     CPI    'C'    ;CLEAR?
  157.     JZ    CLEAR
  158.     LXI    D,64
  159.     CPI    'J'    ;DOWN 1?
  160.     JZ    MOVE
  161.     LXI    D,-64
  162.     CPI    'K'    ;UP 1?
  163.     JZ    MOVE
  164.     LXI    D,-1
  165.     CPI    'H'    ;BACK 1?
  166.     JZ    MOVE
  167.     LXI    D,1
  168.     CPI    'L'    ;RIGHT 1?
  169.     JZ    MOVE
  170.     CPI    0DH    ;RUN?
  171.     JZ    SETRUN
  172.     JMP    INPLP    ;INVALID, TRY AGAIN
  173. ;
  174. ;TOGGLE THE BIT UNDER THE CURSOR
  175. ;
  176. TOGGLE    MOV    A,M    ;GET CHAR
  177.     CMA
  178.     ADI    ' '+CHAR+1 ;FLIP IT
  179.     MOV    M,A
  180.     JMP    INPLP
  181. ;
  182. ;REPEAT DIRECTION 1-9 TIMES
  183. ;
  184. REPEAT    SUI    '0'    ;MAKE '1'-'9' INTO 1-9
  185.     MOV    B,A    ;SAVE IT
  186.     MOV    A,M    ;TURN..
  187.     ANI    7FH    ;..OFF..
  188.     MOV    M,A    ;..CURSOR
  189. REPLP    DAD    D    ;MOVE
  190.     DCR    B    ;DONE?..
  191.     JNZ    REPLP    ;..NO
  192.     JMP    INPLP
  193. ;
  194. ;SAVE A SCREEN IN MEMORY
  195. ;
  196. SAVE    CALL    GETSNO    ;GET SCREEN NUMBER/ADDRESS
  197.     LXI    D,VDM
  198.     CALL    MOVESCR    ;MOVE IT
  199.     JMP    COMMAND
  200. ;
  201. ;RESTORE A SCREEN FROM MEMORY
  202. ;
  203. RESTORE    CALL    GETSNO    ;GET SCREEN NUMBER/ADDRESS
  204.     LXI    D,VDM
  205.     XCHG        ;OPP. DIR. OF SAVE
  206.     CALL    MOVESCR
  207.     JMP    COMMAND
  208. ;
  209. ;GET A DIGIT, CONVERT IT TO A SAVED SCREEN ADDRESS
  210. ;
  211. GETSNO    CALL    KEYIN    ;GET THE #
  212.     ANI    0FH    ;MAKE BINARY
  213.     ADD    A
  214.     ADD    A
  215.     ADD    A
  216.     ADD    A    ;A=16*A
  217.     MOV    L,A
  218.     MVI    H,0
  219.     DAD    H    ;*32
  220.     DAD    H
  221.     DAD    H
  222.     DAD    H    ;*256
  223.     DAD    H
  224.     DAD    H    ;*1024
  225.     LXI    D,SCRMEM ;BASE ADDR OF SAVED SCREENS
  226.     DAD    D
  227.     RET        ;SCREEN ADDR IN HL
  228. ;
  229. ;---->    MOVESCR MOVES 1 SCREEN FROM DE TO HL
  230. ;
  231. MOVESCR    LXI    B,1024 ;SCREEN SIZE
  232. MSLP    LDAX    D
  233.     INX    D
  234.     MOV    M,A
  235.     INX    H
  236.     DCX    B
  237.     MOV    A,B
  238.     ORA    C
  239.     JNZ    MSLP
  240.     RET
  241. ;
  242. ;SETRUN - SETS UP AND RUNS
  243. ;
  244. SETRUN    LXI    H,VDM
  245.     LXI    D,WORK
  246.     MVI    B,4
  247. SETLOW    MVI    C,0    ;DEAD
  248.     MOV    A,M    ;GET SCREEN CHAR
  249.     CPI    ' '    ;DEAD?
  250.     JZ    SETL    ;YES, SET IT
  251.     CPI    '+'    ;PAST GENERATION?
  252.     JZ    SETL
  253.     MVI    C,80H    ;LIVE CELL IS 80H
  254. SETL    MOV    A,C    ;GET 0 OR 80H
  255.     STAX    D    ;SAVE IN WORK
  256.     INR    L    ;NEXT CHAR IN PAGE
  257.     INR    E    ; "    "    "
  258.     JNZ    SETLOW    ;END OF PAGE?
  259.     INR    H    ;NEXT PAGE
  260.     INR    D    ;  "    "
  261.     DCR    B    ;MORE PAGES?..
  262.     JNZ    SETLOW    ;..YES, LOOP.
  263. ;
  264. ;LOW MEMORY MATRIX IS BUILT - 
  265. ;INIT GENERATION COUNTER
  266. ;
  267.     LXI    H,COUNT
  268.     MVI    B,10
  269.     MVI    A,' '
  270. CCLR    MOV    M,A
  271.     INX    H
  272.     DCR    B
  273.     JNZ    CCLR
  274. ;
  275. ;"BLAST" THE TOP AND BOTTOM, LEFT AND RIGHT
  276. ;
  277. RUN    LXI    H,WORK
  278.     PUSH    H
  279. ;    CALL    CLRLINE    ;FOUND BEST NOT TO DO THIS
  280.     POP    H
  281.     LDA    WRAPFLG    ;WRAP AROUND?
  282.     ORA    A
  283.     JZ    NOWRAP
  284.     CALL    CLRCOL
  285.     LXI    H,WORK+63
  286.     CALL    CLRCOL
  287. NOWRAP    LXI    H,WORK+15*64
  288. ;    CALL    CLRLINE    ;FOUND BEST NOT TO.
  289. ;
  290. ;ZERO # OF CELLS
  291. ;
  292.     LXI    H,ALIVE
  293.     MVI    B,5
  294.     MVI    A,' '
  295. BALIVE    MOV    M,A
  296.     INX    H
  297.     DCR    B
  298.     JNZ    BALIVE
  299.     CALL    MOVEM    ;POSITION MOVERS
  300.     CALL    POSTS    ;SET THE POST
  301. ;
  302. ;DO SPEED DELAY
  303. ;
  304.     LDA    SPDVAL
  305.     ADD    A
  306.     JZ    FAST    ;IT'S ZERO ANYWAY
  307.     ADD    A
  308.     ADD    A
  309.     ADD    A    ;TIMES 16
  310.     MOV    H,A
  311.     MVI    L,0
  312. DELAY    DCX    H
  313.     MOV    A,H
  314.     ORA    L
  315.     JNZ    DELAY
  316. FAST    LXI    H,WORK+64
  317.     LXI    B,-65    ;INIT THINGS IN REGS..
  318.     LXI    D,62    ;..FOR SPEED
  319. ;
  320. CALC    MOV    A,M
  321.     ORA    A    ;HI BIT ON = ALIVE
  322.     JP    NOADD8
  323. ;
  324. ;ADD 1 TO THE 8 AROUND A LIVE CELL
  325. ;
  326.     PUSH    H
  327.     DAD    B    ;-65
  328.     INR    M    ;UPPER LEFT
  329.     INX    H
  330.     INR    M    ;UPPER MIDDLE
  331.     INX    H
  332.     INR    M    ;UPPER RIGHT
  333. ;
  334.     DAD    D    ;+62
  335.     INR    M    ;LEFT MIDDLE
  336.     INX    H    ;SKIP MID-MID
  337.     INX    H
  338.     INR    M    ;RIGHT MIDDLE
  339. ;
  340.     DAD    D    ;+62 TO BOTTOM LINE
  341.     INR    M    ;LOWER LEFT
  342.     INX    H
  343.     INR    M    ;LOWER MIDDLE
  344.     INX    H
  345.     INR    M    ;LOWER RIGHT
  346.     LXI    H,ALIVE+3
  347.     CALL    ADD1
  348.     POP    H
  349. NOADD8    INR    L    ;NEXT CELL IN PAGE
  350.     JNZ    CALC    ;
  351.     INR    H    ;NEXT PAGE
  352.     MOV    A,H    ;SEE IF DONE
  353.     CPI    4+(WORK/256)
  354.     JNZ    CALC
  355. ;
  356. ;GOT NEXT GENERATION - SHOW IT
  357. ;
  358.     CALL    SHOW
  359.     CALL    CONST    ;KEY PRESSED?
  360.     JZ    RUN    ;NO, RUN
  361. ;
  362. ;---->    END OF GENERATION
  363. ;
  364.     CALL    KEYIN    ;GET THE CHAR
  365.     CPI    '+'
  366.     JZ    TOGGEN2    ;TOGGLE GENERATION 2
  367.     CPI    '_'
  368.     JZ    TOGBIR    ;TOGGLE BIRTH FLAG
  369.     CPI    'A'
  370.     JZ    TOGMOVE    ;TOGGLE SINGLE MOVER
  371.     CPI    ' '
  372.     JZ    TOGPOST
  373.     CPI    'H'
  374.     JZ    POSTL    ;LEFT
  375.     CPI    'J'
  376.     JZ    POSTD    ;DOWN
  377.     CPI    'K'
  378.     JZ    POSTU    ;UP
  379.     CPI    'L'
  380.     JZ    POSTR    ;RIGHT
  381.     CPI    '0'
  382.     JC    COMM2    ;NOT SPEED REQ
  383.     CPI    '9'+1
  384.     JC    SETSPD
  385.     JMP    COMM2
  386. ;
  387. ;TOGGLE GENERATION 2 - CAUSES '+' TO APPEAR ON
  388. ;SCREEN FOR CELLS IN THE "PREVIOUS GENERATION"
  389. ;(JUST FOR ALL YOU REINCARNATIONISTS OUT THERE)
  390. ;
  391. TOGGEN2    LXI    H,PAST+1
  392.     MVI    A,'+'+' '    ;<-- YES, THAT'S RIGHT
  393.     SUB    M
  394.     MOV    M,A    ;TOGGLE BETWEEN '+' AND ' '
  395.     JMP    RUN
  396. ;
  397. ;TOGGLE THE REV VIDEO FOR BIRTHS FLAG.
  398. ;
  399. TOGBIR    LDA    BIRTH+1
  400.     XRI    80H
  401.     STA    BIRTH+1
  402.     JMP    RUN
  403. ;
  404. ;TOGGLE POSTS ON/OFF
  405. ;
  406. TOGPOST    LXI    H,POSTCHR
  407.     MVI    A,' '+CHAR
  408.     SUB    M
  409.     MOV    M,A
  410.     JMP    RUN
  411. ;
  412. ;MOVE POSTS, UP, DOWN, LEFT, RIGHT
  413. ;
  414. POSTU    LDA    POST    ;GET VERT POST POS.
  415.     DCR    A
  416.     STA    POST
  417.     JMP    RUN
  418. POSTD    LDA    POST
  419.     INR    A
  420.     STA    POST
  421.     JMP    RUN
  422. POSTL    LDA    POST+1    ;GET HORIZ POST POS
  423.     DCR    A
  424.     STA    POST+1
  425.     JMP    RUN
  426. POSTR    LDA    POST+1
  427.     INR    A
  428.     STA    POST+1
  429.     JMP    RUN
  430. ;
  431. ;SET SPEED DURING RUN, CONTINUE RUNNING
  432. ;
  433. SPEED    CALL    KEYIN    ;GET THE SPEED
  434. SETSPD    ANI    0FH    ;SAVE 4 BITS
  435.     STA    SPDVAL
  436.     JMP    RUN    ;..THEN RUN
  437. ;
  438. ;TOGGLE SINGLE BIT OF MOVER ON/OFF
  439. ;DURING RUN
  440. ;
  441. TOGMOVE    LDA    NMOVERS
  442.     XRI    1
  443.     STA    NMOVERS
  444.     JMP    RUN
  445. ;
  446. ;SHOW THE RESULTS
  447. ;
  448. SHOW    LXI    D,WORK
  449.     LXI    H,VDM
  450.     MVI    B,4
  451.     MVI    C,' '    ;DEAD CELL
  452. SHOWLP    LDAX    D
  453.     ORA    A
  454.     JZ    DEAD
  455.     CPI    80H    ;LIVE IN PAST GEN?
  456.     JZ    PAST    ;PAST GENERATION ONLY
  457.     CPI    82H    ;LIVE W/2 NEIGHBORS?
  458.     JZ    LIVE
  459.     CPI    3    ;DEAD, 3 NEIGHBORS?
  460.     JZ    BIRTH    ;A NEW BOUNCING BABY ZORK
  461.     CPI    83H    ;LIVE, 3 NEIGHBORS?
  462.     JZ    LIVE
  463.     ORA    A
  464.     JM    PAST    ;WAS ALIVE?
  465.     JMP    DEAD
  466. ;
  467. BIRTH    MVI    M,CHAR
  468.     JMP    LIVE2
  469. ;
  470. LIVE    MVI    M,CHAR
  471. LIVE2    MVI    A,80H
  472.     JMP    STCELL
  473. ;
  474. ;PAST GENERATION WAS ALIVE, STORE '+' OR ' '
  475. ;
  476. PAST    MVI    M,' '    ;GET CHAR (MOD BY "+" COMMAND)
  477.     JMP    DEAD2
  478. ;
  479. DEAD    MOV    M,C    ;MOVE IN ' '
  480. DEAD2    XRA    A
  481. STCELL    STAX    D
  482.     INR    L    ;MORE IN PAGE?
  483.     INR    E
  484.     JNZ    SHOWLP
  485.     INR    H    ;NEXT PAGE
  486.     INR    D
  487.     DCR    B    ;DONE?
  488.     JNZ    SHOWLP
  489. ;
  490. ;PUT IN A RANDOM HIT
  491. ;
  492.     LDA    RFLG    ;RANDOM HIT REQ?
  493.     ORA    A
  494.     CNZ    RHIT    ;RANDOM HIT
  495. ;
  496. ;COUNT THE GENERATIONS
  497. ;
  498.     LXI    H,COUNT+9
  499.     CALL    ADD1    ;ADD IN 1
  500. ;
  501. ;SHOW THE GENERATION COUNT
  502. ;
  503. SHOWCT    LXI    H,VDM+3FFH
  504.     LXI    D,COUNT+9
  505.     MVI    B,14
  506. CTMVLP    LDAX    D
  507.     MOV    M,A
  508.     DCX    D
  509.     DCX    H
  510.     DCR    B
  511.     JNZ    CTMVLP
  512.     RET
  513. ;
  514. ;ROUTINE TO ADD 1 TO AN ASCII NUMBER
  515. ;
  516. ADD1    MOV    A,M
  517.     ORI    '0'    ;CONV ' ' TO '0'
  518.     INR    A
  519.     MOV    M,A
  520.     CPI    '9'+1    ;CARRY?
  521.     RNZ        ;..NO, RETURN
  522.     MVI    M,'0'    ;STORE 0,..
  523.     DCX    H    ;..BACK UP
  524.     JMP    ADD1    ;..BUMP HIGHER DIGIT
  525. ;
  526. ;RANDOMLY HIT THE MATRIX
  527. ;
  528. RHIT    LDA    RFLG
  529.     MOV    B,A    ;COUNT
  530. RHLP    CALL    RAND    ;GET ROW
  531.     ANI    0F0H    ;MAKE 4 BIT NUMBER * 16
  532.     MOV    L,A
  533.     MVI    H,0
  534.     DAD    H    ;*32
  535.     DAD    H    ;*64
  536.     CALL    RAND    ;CALL TWICE TO MIX 'EM UP
  537.     CALL    RAND    ;GET COL
  538.     ANI    3FH    ;SAVE DISPL
  539.     ADD    L    ;ADD IN (CAN'T CARRY)
  540.     MOV    L,A
  541.     XCHG
  542.     LXI    H,WORK    ;TO BASE
  543.     DAD    D    ;ADD DISPL
  544.     LDA    RTOG    ;SEE IF TOGGLING
  545.     ORA    A
  546.     JZ    TOG    ;..YES
  547. ;
  548. ;STORE CHAR ON, INSTEAD OF JUST TOGGLING
  549. ;
  550.     MVI    M,80H    ;NOT TOGGLE, JUST TURN ON
  551.     LXI    H,VDM
  552.     DAD    D
  553.     MVI    M,CHAR
  554.     JMP    RHCONT
  555. TOG    MVI    A,80H    ;TOGGLE THE CELL
  556.     XRA    M
  557.     MOV    M,A
  558.     LXI    H,VDM
  559.     DAD    D    ;FLIP ON THE SCREEN, TOO
  560.     MVI    A,' '+CHAR
  561.     SUB    M
  562.     MOV    M,A
  563. RHCONT    DCR    B
  564.     JNZ    RHLP
  565.     RET        ;FROM RHIT
  566. ;
  567. ;CLEAR LINE OF VDM (I BELIEVE I NO LONGER USE THIS)
  568. ;
  569. CLRLINE    MVI    A,0 
  570.     MVI    B,64
  571. CLRLLP    MOV    M,A
  572.     INX    H
  573.     DCR    B
  574.     JNZ    CLRLLP
  575.     RET        ;FROM CLRLINE
  576. ;
  577. ;CLEAR A COLUMN OF THE VDM - USED
  578. ;WHEN NOT WRAPPING LEFT/RIGHT
  579. ;
  580. CLRCOL    LXI    D,64
  581.     MVI    A,0 
  582.     MVI    B,16
  583. CLRCLL    MOV    M,A
  584.     DAD    D
  585.     DCR    B
  586.     JNZ    CLRCLL
  587.     RET        ;FROM CLRCOL
  588. ;
  589. ;CP/M CONSOLE STAUS TEST
  590. ;
  591. CONST    PUSH    B
  592.     PUSH    D
  593.     PUSH    H
  594. VCONST    CALL    $-$
  595.     POP    H
  596.     POP    D
  597.     POP    B
  598.     ORA    A    ;SET 0 IF NO CHAR
  599.     RET
  600. ;
  601. ;CP/M KEYBOARD INPUT ROUTINE
  602. ;
  603. KEYIN    PUSH    B
  604.     PUSH    D
  605.     PUSH    H
  606. VKEYIN    CALL    $-$
  607.     ANI    7FH
  608.     POP    H
  609.     POP    D
  610.     POP    B
  611.     STA    VDM+3FFH    ;"ECHO" CHAR
  612.     CPI    61H    ;LOWER CASE A?
  613.     RC
  614.     ANI    5FH    ;MAKE UPPER CASE
  615.     RET        ;(TURNS DEL INTO "_")
  616. ;
  617. ;CP/M CHARACTER OUTPUT
  618. ;
  619. TYPE    PUSH    B
  620.     PUSH    D
  621.     PUSH    H
  622.     MOV    C,A
  623. VTYPE    CALL    $-$
  624.     POP    H
  625.     POP    D
  626.     POP    B
  627.     RET
  628. ;
  629. ;EXIT, RETURNING TO CP/M
  630. ;
  631. EXIT    LHLD    STACK
  632.     SPHL
  633.     RET
  634. ;
  635. ;RANDOM SCREEN FILL
  636. ;
  637. RANDOM    CALL    KEYIN    ;GET DENSITY
  638.     ANI    0FH    ;MAKE IT 0-F HEX
  639.     MOV    C,A    ;SAVE DENSITY
  640.     LXI    H,VDM
  641. RANFILL    CALL    RAND
  642.     CALL    RAND
  643.     ANI    0FH
  644.     CMP    C    ;THIS CELL?
  645.     MVI    A,CHAR
  646.     JNC    NSTORE    ;NO
  647.     MOV    M,A
  648. NSTORE    INX    H
  649.     MOV    A,H
  650.     CPI    4+(VDM/256)
  651.     JNZ    RANFILL
  652.     JMP    COMMAND
  653. ;
  654. ;MOVERS:
  655. ;    ARE SINGLE CELLS WHICH STAY ALIVE,
  656. ;    AND MOVE ABOUT THE SCREEN.  WHEN
  657. ;    THEY TOUCH SOMETHING, THEY EFFECT IT,
  658. ;    BUT CONTINUE TO MOVE, UNDYING.
  659. ;
  660. MOVERS    CALL    KEYIN    ;GET HOW MANY
  661.     ANI    0FH
  662.     STA    NMOVERS    ;SET COUNT
  663.     JZ    COMMAND    ;NONE
  664. ;
  665. ;GOT REQUEST FOR MOVERS, RANDOMLY SET UP
  666. ;EACH ONES POSITION, AND DIRECTION.
  667. ;
  668.     MOV    B,A    ;SAVE COUNT
  669.     LXI    H,NMOVERS+1    ;TO TABLE
  670. MOVESET    CALL    DISP    ;GET INITIAL DIRECTION
  671.     MOV    M,A
  672.     INX    H
  673.     CALL    RAND    ;GET ROW
  674.     RAR ! RAR ! RAR    ;MIX THINGS UP
  675.     ANI    0FH
  676.     MOV    M,A    ;SAVE ROW
  677.     INX    H    ;POINT TO COLUMN DISP
  678.     CALL    DISP
  679.     ADD    A    ;X2
  680.     MOV    C,A
  681.     CALL    DISP
  682.     ADD    C
  683.     MOV    M,A    ;STORE COL DISP
  684.     INX    H
  685.     CALL    RAND    ;GET COLUMN
  686.     ANI    3FH    ;ISOLATE COLUMN
  687.     MOV    M,A
  688.     INX    H    ;TO NEXT ROW DISP
  689.     DCR    B    ;MORE?
  690.     JNZ    MOVESET    ;..YES, LOOP
  691.     JMP    COMMAND    ;..NO RETURN
  692. ;
  693. ;MOVE THE RANDOM MOVERS    (IF ANY)
  694. ;
  695. MOVEM    LDA    NMOVERS
  696.     ORA    A
  697.     RZ        ;NONE
  698.     LXI    H,NMOVERS+1 ;POINT TO TABLE
  699.     MOV    B,A    ;SAVE COUNT
  700. MOVEMLP    MOV    A,M    ;GET ROW DISP
  701.     INX    H    ;TO ROW
  702.     ADD    M    ;MODIFY ROW
  703.     JM    BADROW    ;DON'T GO <0
  704.     CPI    15
  705.     JC    ROWOK
  706. BADROW    DCX    H    ;BACK TO DISPL
  707.     CALL    DISP
  708.     MOV    M,A
  709.     INX    H    ;BACK TO ROW
  710.     MOV    A,M    ;GET OLD
  711.     JMP    OLDROW    ;USE OLD THIS TIME
  712. ROWOK    MOV    M,A    ;SAVE NEW POSITION
  713. OLDROW    XCHG        ;SAVE HL
  714.     MOV    L,A
  715.     MVI    H,0    ;SETUP FOR MULT
  716.     DAD    H
  717.     DAD    H
  718.     DAD    H
  719.     DAD    H
  720.     DAD    H
  721.     DAD    H    ;X64
  722.     XCHG        ;HL BACK
  723. ;
  724.     INX    H    ;TO COL DISP
  725.     MOV    A,M
  726.     INX    H
  727.     ADD    M    ;MODIFY ROW
  728.     JM    BADCOL    ;DON'T GO < 0
  729.     CPI    63
  730.     JC    COLOK
  731. ;
  732. BADCOL    DCX    H    ;BACK TO DISPL
  733.     CALL    DISP
  734.     ADD    A    ;X2
  735.     MOV    C,A
  736.     CALL    DISP
  737.     ADD    C
  738.     MOV    M,A
  739.     INX    H    ;BACK TO COL
  740.     MOV    A,M    ;GET OLD
  741.     JMP    OLDCOL    ;USE OLD THIS TIME
  742. COLOK    MOV    M,A    ;SAVE NEW POSITION
  743. OLDCOL    INX    H    ;TO NEXT ROW DISP
  744.     ADD    E    ;CALC POS
  745.     MOV    E,A
  746.     PUSH    H
  747.     LXI    H,VDM
  748.     DAD    D
  749.     MVI    A,'A'-1
  750.     ADD    B    ;'A'=FIRST, ETC
  751.     MOV    M,A
  752.     LXI    H,WORK
  753.     DAD    D
  754.     MVI    M,80H    ;SET LIVE
  755.     POP    H
  756.     DCR    B
  757.     JNZ    MOVEMLP
  758.     RET
  759. ;
  760. ;CALCULATE A DISPLACEMENT FOR MOVERS,
  761. ;    -1, 0, OR 1
  762. ;
  763. DISP    CALL    RAND    ;MIX 'EM UP
  764.     CALL    RAND    ;GET A DIRECTION
  765.     ANI    3
  766.     JZ    DISP    ;MAKE IT 1, 2, 3
  767.     SUI    2    ;MAKE IT -1, 0, 1
  768.     JZ    DISP    ;TRY AGAIN IF 0
  769.     RET
  770. ;
  771. ;POST IS A NEVER DYING, NEVER MOVING CELL,
  772. ;WHICH IS CONTROLLABLE IN RUN MODE AS IF
  773. ;YOU WERE IN INPUT MODE
  774. ;
  775. POSTS    LDA    POSTCHR
  776.     CPI    ' '
  777.     RZ
  778.     LDA    POST
  779.     MOV    L,A
  780.     MVI    H,0
  781.     DAD    H
  782.     DAD    H
  783.     DAD    H
  784.     DAD    H
  785.     DAD    H
  786.     DAD    H    ;X64
  787.     LDA    POST+1    ;GET COLUMN
  788.     ADD    L
  789.     MOV    L,A
  790.     XCHG
  791.     LXI    H,VDM
  792.     DAD    D
  793.     MVI    M,CHAR
  794.     LXI    H,WORK
  795.     DAD    D
  796.     MVI    M,80H
  797.     RET
  798. ;
  799. ;RANDOM NUMBER GENERATOR,
  800. ;(SHIFT AND EXCLUSIVE-OR TYPE)
  801. ;
  802. RAND    PUSH    H
  803.     PUSH    B
  804.     LXI    H,RNO
  805.     PUSH    H
  806.     MVI    B,7    ;LENGTH
  807.     ORA    A
  808. RANDLP    MOV    A,M
  809.     RAL
  810.     MOV    M,A
  811.     INX    H
  812.     DCR    B
  813.     JNZ    RANDLP
  814.     DCX    H    ;TO LAST DIGIT
  815.     RAL
  816.     RAL
  817.     XRA    M
  818.     RLC
  819.     ANI    1
  820.     POP    H
  821.     ORA    M
  822.     MOV    M,A
  823.     POP    B
  824.     POP    H
  825.     RET
  826. ;
  827. ;HELP MODE - PRINT MENU, ACCEPT SINGLE
  828. ;CHAR COMMAND FOR DETAIL HELP
  829. ;
  830. HELP    MVI    A,ERASE    ;WARD'S SCREEN CLEAR
  831.     CALL    TYPE
  832.     LXI    H,HMSG
  833.     CALL    MSGPRT
  834.     CALL    KEYIN
  835.     MOV    B,A    ;SAVE FOR MATCH
  836.     LXI    H,HMSG
  837. HFIND    MOV    A,M
  838.     ORA    A
  839.     JZ    COMMAND    ;NOT FOUND
  840.     DCR    A
  841.     INX    H
  842.     JNZ    HFIND
  843. ;
  844. ;AT CHAR.  SEE IF IT MATCHES
  845. ;
  846.     MOV    A,B
  847.     CMP    M
  848.     JNZ    HFIND
  849.     INX    H
  850.     MVI    A,ERASE
  851.     CALL    TYPE
  852.     CALL    MSGPRT    ;PRINT IT
  853.     LXI    H,MSG2
  854.     CALL    MSGPRT
  855.     JMP    COMMAND
  856. ;
  857. ;PRINT MSG POINTED TO BY HL, 1 TERMINATES
  858. ;
  859. MSGPRT    MOV    A,M
  860.     CALL    TYPE
  861.     INX    H
  862.     MOV    A,M
  863.     CPI    1
  864.     RZ
  865.     JMP    MSGPRT
  866. ;
  867. MSG2    DB    cr,lf,'..back to command mode now.',cr,lf
  868.     db    'type ? again if required.',cr,lf,1
  869. ;
  870. HMSG    db    'Command: /* command mode */',cr,lf
  871.     db    ' C/R  goto Run',cr,lf
  872.     db    ' /  goto Random fill',cr,lf
  873.     db    ' <  goto Save',cr,lf
  874.     db    ' >  goto Restore',cr,lf
  875.     db    ' C  goto Clear',cr,lf
  876.     db    ' I  goto Input',cr,lf
  877.     db    ' M  goto Movers',cr,lf
  878.     db    ' R  goto Random mutate',cr,lf
  879.     db    ' S  goto Set speed',cr,lf
  880.     db    ' T  goto Toggle',cr,lf
  881.     DB    ' W  goto Wrap',cr,lf
  882.     db    ' X  exit to CP/M',cr,lf
  883.     db    'More help? Type command char, '
  884.     db    'or space to return to command.',cr,lf
  885. ;
  886.     DB    1,'S'
  887.     DB    'Set speed:',cr,lf
  888.     db    ' 0-9 Set speed (0=fastest)',cr,lf
  889.     db    ' goto Command',cr,lf
  890. ;
  891.     db    1,'W'
  892.     db    'Wrap:',cr,lf
  893.     db    ' Toggle the screen wrap (l/r) bit'
  894.     db    ' goto Command.',cr,lf
  895. ;
  896.     db    1,'C'
  897.     db    'Clear:',cr,lf
  898.     db    ' Clear the screen.',cr,lf
  899.     db    ' Goto command.',cr,lf
  900. ;
  901.     db    1,'I'
  902.     db    'Input: /* input mode */',cr,lf
  903.     db    ' (space) toggle char under cursor.',cr,lf
  904.     db    ' J down  1; goto Input',cr,lf
  905.     db    ' H back  1; goto Input',cr,lf
  906.     db    ' K up    1; goto Input',cr,lf
  907.     db    ' L right 1 ;goto Input',cr,lf
  908.     db    ' 0-9 repeat prev direction '
  909.     db        'n times; goto Input',cr,lf
  910.     db    ' C/R R goto Run',cr,lf
  911.     db    ' C goto Clear',cr,lf
  912.     db    '   goto Input',cr,lf
  913. ;
  914.     db    1,'X'
  915.     db    ' X returns immediately to CP/M',cr,lf
  916. ;
  917.     db    1,cr
  918.     db    'Run: /* run mode */',cr,lf
  919.     db    ' A toggle single mover on/off',cr,lf
  920.     db    ' 0-9 set speed',cr,lf
  921.     DB    ' + toggle death show flag',cr,lf
  922.     db    ' _ toggles birth show flag',cr,lf
  923.     db    ' (space) toggles "post" (undying cell) '
  924.     db    'on/off',cr,lf
  925.     db    ' H, J, K, L move the "post" as if in '
  926.     db    'input mode',cr,lf
  927.     db    ' (any char: goto command '
  928.     db    'with that char)',cr,lf
  929. ;
  930.     db    1,'/'
  931.     db    'Random fill:',cr,lf
  932.     db    ' Accept a digit, ANI 0FH.',cr,lf
  933.     db    ' Fill screen randomly, density n/16.',cr,lf
  934.     db    ' goto Command.',cr,lf
  935. ;
  936.     db    1,'M'
  937.     db    'Movers:',cr,lf
  938.     db    ' Accept a digit, which is how many',cr,lf
  939.     db    ' movers on screen per generation.',cr,lf
  940.     db    ' goto Command.',cr,lf
  941. ;
  942.     db    1,'<'
  943.     db    'Save:',cr,lf
  944.     db    ' Accept a digit.',cr,lf
  945.     db    ' Save current screen under that number'
  946.     db    cr,lf,' Goto command.',cr,lf
  947. ;
  948.     db    1,'>'
  949.     db    'Restore:',cr,lf
  950.     db    ' Accept a digit.',cr,lf
  951.     db    ' Restore screen under that number'
  952.     db    cr,lf,' Goto command.',cr,lf
  953. ;
  954.     db    1,'T'
  955.     db    'Toggle:',cr,lf
  956.     db    ' Toggle random mutation switch,',cr,lf
  957.     db    ' to toggle (=T) or only turn on (=O)'
  958.     db    cr,lf,' when mutating.',cr,lf
  959.     db    ' (Bottom corner shows the T or O)'
  960.     db    cr,lf,cr,lf
  961. ;
  962.     db    1,'R'
  963.     db    'Random mutate',cr,lf
  964.     db    ' Accept a 2 digit number.',cr,lf
  965.     db    ' Store as # of random hits per cycle.',cr,lf
  966.     db    ' goto Command.',cr,lf,1,0
  967. ;
  968. SPDVAL    DB    0    ;SPEED (0=FAST)
  969. WRAPFLG    DB    0    ;WRAP SCREEN?
  970. RNO    DB    1,0FEH,0AFH,45,34,26,18,45,27
  971.     DB    1,2,3,4,5
  972. ;
  973. RTOG    DB    0    ;TOGGLE RANDOM OR JUST ON?
  974. RFLG    DB    0    ;1 IF RANDOM
  975. ;
  976. POSTCHR    DB    ' '
  977. POST    DB    8,32    ;UNMOVABLE OBJECT
  978. ;
  979. ;MOVERS TABLE (FOLLOWS NMOVERS)
  980. ;    ROW DISP, ROW, COL DISP, COL
  981. ;
  982. NMOVERS    DB    0    ;# OF MOVERS
  983.     DB    3,1,1,1    ;DEFAULT FIRST MOVER
  984.     DS    4*15    ;TABLE FOR 15 MOVERS
  985. ;
  986. ALIVE    DS    5
  987. COUNT    DS    10
  988. ;
  989.     DS    100
  990. STACK    DS    2
  991. ;
  992. WORK    ORG    ($+255) AND 0FF00H
  993.     DS    1024    ;1 SCREEN
  994.     DS    64    ;LAST LINE GARBAGE HERE
  995. ;
  996. ;DEFINE MEMORY FOR UP TO 16 SAVED SCREENS
  997. ;
  998. SCRMEM    EQU    $
  999.