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 / CPMUG035.ARK / DOODLE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  14KB  |  580 lines

  1. ;7 SEPT; FULL-MESSAGE,PATHMAKE - SPACE .
  2. ;
  3. **************************************************************************
  4. *                                     *
  5. *                DOODLE                     *
  6. * -A PART OF THE 'FELIX' ANIMATION SYSTEM. U OF TENNESSEE.
  7. * MUKESH & LOVELACE 2/79 ... MODS BY MOSHELL 3/79                       *
  8. *
  9. *                                     *
  10. *    THIS ROUTINE DOODLES AN OBJECT ON THE SCREEN AND SAVES THE     *
  11. *    PIXELS BY CALLING 'OBJW'. WHEN TERMINATED BY CTRL/C, THE CORRECT
  12. *       'CENTER OF GRAVITY' IS CALCULATED AND INSERTED AT HEAD
  13. *    OF OBJECT. INITIAL COLOR IS SET BY INPUT CURSOR COLOR.INITIAL
  14. *      ORIENTATION IS ZERO. FURTHER COLORS ARE SET BY INSERTING CORRECT
  15. *    SPECIAL CODES INTO THE OBJECT BEING CREATED.
  16. *    CTRL/N 'CLOSES'CURRENT OBJECT,RESTARTS PROGRAM.
  17. *    CTRL/C 'CLOSES' OBJECT, RETURNS TO CP/M.
  18. *    TYPING 'Z' CLEARS THE SCREEN,DOESN'T CHANGE OBJECTS.
  19. *
  20. *                                     *
  21. **************************************************************************
  22. *
  23. * CALLS:  OBJW,PUT,CP/M (I/O)
  24. *
  25. *    THE TABLE OF EQUATES:
  26. *
  27. *
  28. *
  29. *
  30. UP     EQU    'I'            ;COMMAND ASCII VALUES:
  31. DOWN     EQU    ','
  32. LEFT     EQU    'J'
  33. RIGHT     EQU    'L'
  34. UPLEFT     EQU    'U'
  35. UPRIGHT     EQU    'O'
  36. DOWNLEFT EQU    'M'
  37. DOWNRGT     EQU    '.'
  38. *
  39. RED     EQU    'R'
  40. GREEN     EQU    'G'
  41. BLUE     EQU    'B'
  42. CYAN     EQU    'C'
  43. YELLOW     EQU    'Y'
  44. PURPLE     EQU    'P'
  45. WHITE     EQU    'W'
  46. BLACK     EQU    '#'
  47. NOCOLOR     EQU    '0'
  48. *
  49. HI$INTEN EQU    '!'
  50. *
  51. BINRED     EQU    01H            ;BINARY VALUES OF COLORS
  52. BINBLUE     EQU    04H
  53. BINGREEN EQU    02H
  54. BINCYAN     EQU    06H
  55. BINYELLW EQU    03H
  56. BINPRPL     EQU    05H
  57. BINWHITE EQU    07H
  58. BINBLACK EQU    00H
  59. *
  60. CIREAL     EQU    5027H            ;WE HAVE A LOCAL 'CI'0TO GRAB CTRL/C...
  61. DISPOFF EQU    5057H
  62. DISPON    EQU    5054H
  63. BACKBUF    EQU    5092H
  64. CO     EQU    502AH
  65. PRINT     EQU    502DH
  66. GETW     EQU    5003H
  67. PUTW     EQU    5000H
  68. OBJR    EQU    5006H
  69. CR    EQU    0DH
  70. LF    EQU    0AH
  71. OBJW     EQU    5009H
  72. *
  73. BIOS    EQU    5H
  74. CLEAR    EQU    5021H
  75. ONBUF    EQU    5090H
  76. ;
  77.     ORG    100H
  78.     LXI    SP,4000H    ;SAFE PLACE,WE THINK.
  79.     CALL    SURVIVAL    ;MAKE SURE FELIX UTILS ARE THERE.
  80.     LHLD    ONBUF
  81.     SHLD    ONBSTASH    ;POINT 'PUT'&'GET' AT BACKBUF.
  82.     LHLD    BACKBUF
  83.     SHLD    ONBUF
  84.     CALL    DISPON        ;TURN ON THE SCREEN,AND CLEAR.
  85.     SUB    A
  86.     CALL    CLEAR    ;FILL SCREEN WITH BLANK.
  87. ;
  88. OBJECT1     LXI    H,MSG1            ;OUTPUT STARTING MESSAGE - PROMPT
  89. *                     FOR OBJECT #
  90.      CALL    PRINT            ;NEXT, GET INPUT CHARACTER AFTER
  91.      CALL    CI            ;PRINTING MSG.
  92.      CALL    CONVRT            ;CONVERT THE ASCII TO BINARY &
  93.      JC    OBJECT1            ;IF ILLEGAL, REPEAT. ELSE
  94.      STA    OBJNO            ;STORE IN MEMORY.
  95. *
  96. *
  97. *    FOUND CORRECT (CONFIRMED) OBJECT #. INITIALIZE CERTAIN FLAGS, BYTES,
  98. *    ET. AL.
  99. *
  100.      SUB    A            ;ZERO OUT A
  101.      STA    BYTENO            ;BYTE # IS 0
  102. *
  103.     MVI    A,20H    ;START CURSOR IN CNTR OF SCREEN.
  104. *
  105.      MOV    B,A            ;INIT X COORD
  106.      MOV    C,A            ; & Y COORD.
  107.     MVI    A,0FFH    ;FIRST COLOR IS WHITE.
  108.      STA    COLOR            ;INIT COLOR BYTE
  109. *
  110. *    THIS IS THE TOP OF A HUGE LOOP. CONTROL IS BROUGHT HERE IF THE CURSOR
  111. *    HAS BEEN MOVED INTO A NEW PIXEL. INITIALLY, THIS IS SO.
  112. *
  113. NEWPIXEL CALL    GETW            ;FIND OUT WHAT THE EXISTING VALUE
  114. *                     OF PIXEL IS,
  115.      STA    BKGND            ;AND PUT THIS IN MEMORY FOR LATER.
  116. *
  117. *    THIS POINT IS THE ACTUAL POINT ON ANY OTHER COMMAND.
  118. *
  119. FLASHER     MVI    D,0FH            ;SET UP TO OUTPUT WHITE IN PIXEL
  120.      CALL    PUTW            ;THIS IS THE BLINKING CURSOR.
  121.      CALL    DELAY            ;DELAY A BIT BEFORE CHANGING
  122.      MVI    D,BINBLACK        ;TO BLACK
  123.      CALL    PUTW
  124. *
  125. *    NOW SEE IF THERE IS A CHARACTER INPUT
  126. *
  127.     PUSH    H
  128.     PUSH    D
  129.     PUSH    B
  130.     MVI    C,11    ;CONSOLE STATUS READY?
  131.     CALL    BIOS
  132.     POP    B
  133.     POP    D
  134.     POP    H
  135.     ANI    01    ;CHECK READY BIT IN A.
  136.     JNZ    GETCOMMD
  137. *
  138. *    NO CHARACTER INPUT YET.
  139. *
  140.      CALL    DELAY            ;DELAY SOME & THEN
  141.      JMP    FLASHER            ;REPEAT WHOLE PROCESS.
  142. *
  143. *    A CHARACTER HAS BEEN FOUND ON INPUT.
  144. *
  145. GETCOMMD CALL    CI            ;ASCII CHAR IN A
  146. *
  147.      LXI    H,FLASHER        ;TOP OF GRAND LOOP - FLASHING CURSOR
  148.      PUSH    H            ;PUSH TO REDUCE CODE SPACE LATER
  149. *                 ON MULTIPLE RETURNS.
  150. *
  151. *    ALL THE MOVES:
  152. *
  153.      LXI    H,MOVPROCS        ;PUSH THIS LABEL FOR COMMON JUMP IN MOVE
  154.      PUSH    H            ;PROCESSING SEGMENTS.
  155. *
  156.      CPI    UP            ;COMPARE SUCCESSIVELY & JUMP TO 
  157.      JZ    MOVEUP            ;HANDLING CODE.
  158.      CPI    DOWN
  159.      JZ    MOVEDOWN
  160.      CPI    LEFT
  161.      JZ    MOVELEFT
  162.      CPI    RIGHT
  163.      JZ    MOVRIGHT
  164.      CPI    UPLEFT
  165.      JZ    MOVUPLFT
  166.      CPI    UPRIGHT
  167.      JZ    MOVUPRGT
  168.      CPI    DOWNLEFT
  169.      JZ    MOVDNLFT
  170.      CPI    DOWNRGT
  171.      JZ    MOVDNRGT
  172. *
  173. *    ALL THE COLORS HANDLED SEPARATELY.
  174. *
  175.      POP    H            ;POP EARLIER WRONG LABEL.
  176.      LXI    H,STORCOLR        ;PUSH LABEL FOR COMMON JUMP ON PROC.
  177.      PUSH    H            ;DIFFERENT COLORS.
  178. *
  179.      CPI    RED
  180.      JZ    COLRED
  181.      CPI    BLUE
  182.      JZ    COLBLUE
  183.      CPI    GREEN
  184.      JZ    COLGREEN
  185.      CPI    CYAN
  186.      JZ    COLCYAN
  187.      CPI    YELLOW
  188.      JZ    COLYELLW
  189.      CPI    PURPLE
  190.      JZ    COLPRPL
  191.      CPI    WHITE
  192.      JZ    COLWHITE
  193.      CPI    BLACK
  194.      JZ    COLBLACK
  195. *
  196.      CPI    NOCOLOR            ;TURN OFF COLOR DEPOSIT.
  197.      JZ    TRNOFFCL
  198. *
  199.      POP    H            ;COMMON POINT NO MORE NECESSARY.
  200. *
  201. *    INTENSITY HIGH CHANGE.
  202. *
  203.      CPI    HI$INTEN
  204.      JZ    INTENS
  205. *
  206. *    MOVE HANDLING CODES:
  207. *
  208. MOVEUP     SUB    A            ;DELX=0, DELY=1
  209.      STA    DELX
  210.      INR    A
  211.      STA    DELY
  212.      RET
  213. *
  214. MOVEDOWN SUB    A            ;DELX=0, DELY=-1
  215.      STA    DELX
  216.      DCR    A
  217.      STA    DELY
  218.      RET
  219. *
  220. MOVELEFT SUB    A            ;DELX=-1, DELY=0
  221.      STA    DELY
  222.      DCR    A
  223.      STA    DELX
  224.      RET
  225. *
  226. MOVRIGHT SUB    A            ;DELX=1, DELY=0
  227.      STA    DELY
  228.      INR    A
  229.      STA    DELX
  230.      RET
  231. *
  232. MOVUPLFT MVI    A,01H            ;DELX=-1, DELY=1
  233.      STA    DELY
  234.      DCR    A
  235.      DCR    A
  236.      STA    DELX
  237.      RET
  238. *
  239. MOVUPRGT MVI    A,01H            ;DELX=1, DELY=1
  240.      STA    DELX
  241.      STA    DELY
  242.      RET
  243. *
  244. MOVDNLFT MVI    A,0FFH            ;DELX=-1, DELY=-1
  245.      STA    DELX
  246.      STA    DELY
  247.      RET
  248. *
  249. MOVDNRGT MVI    A,01H            ;DELX=1, DELY=-1
  250.      STA    DELX
  251.      DCR    A
  252.      DCR    A
  253.      STA    DELY
  254.      RET
  255. *
  256. *    THIS IS THE COMMON POINT FOR ALL MOVES. BY EXECUTING THE RETURN,
  257. *    AT THE END OF EACH SEPARATE SEGMENT OF CODE, A JUMP IS TAKEN TO THIS
  258. *    POINT.
  259. *
  260. MOVPROCS LXI    H,INTENBYT        ;POINT HL AT INTENSITY BYTE
  261.      MOV    A,M            ;PICK UP THAT BYTE
  262.      INX    H            ;INCREMENT HL TO POINT TO COLOR BYTE
  263.      ORA    M            ;(ARRANGED SUCH). OR THE INTENSITY WITH
  264.      MOV    D,A            ;COLOR & SETTLE IN D (COPY STILL IN A).
  265.      CPI    80H            ;SEE IF LESS THAN THIS #. CARRY FLAG SET
  266.      JC    PUTCOLOR        ;IF THIS IS TRUE.
  267. *
  268. *    HERE, RESTORE BACKGROUND COLOR, FOUND AT THE TIME OF ENTRY OF CURSOR
  269. *    INTO PIXEL.
  270. *
  271.      LDA    BKGND            ;GET BACKGROUND COLOR
  272.      MOV    D,A            ;PUT IN D & PUT OUT THE
  273.      CALL    PUTW            ;PIXEL.
  274.      MOV    A,C            ;PUT THE Y COORD IN ACC FOR CONTINUITY.
  275.      JMP    INCCOORD        ;INCREMENT COORDS FOR MOVE.
  276. *
  277. *    A COLOR TO BE OUTPUT IN COORD POSITION
  278. *
  279. PUTCOLOR CALL    PUTW            ;OUTPUT PIXEL WITH COLOR IN D.
  280. *
  281. *    IF IT IS BYTE # 0, THEN WRITE OUT COLOR AND THEN 0 AND THEN COORDS.
  282. *
  283.      LDA    BYTENO            ;GET BYTE # IN A
  284.     CPI    0H        ;SET ZERO FLAG FOR LATER...
  285.      MOV    E,A            ;MOVE BYTE # TO D. FLAG IS SET FOR CHECK
  286.      LXI    H,OBJNO            ;POINT HL AT OBJ # BYTE FOR LATER.
  287.      MOV    A,D            ;PUT COLOR IN A
  288.      MOV    D,M            ;GET OBJECT # IN D
  289.      JNZ    COLCHNG            ;FLAG SET BY EARLIER COMPARISON TESTED:
  290.      CALL    OBJW            ;BYTE 0 IS BEING WRITTEN - COLOR
  291.      INR    E            ;INCREMENT THE BYTE #
  292.      SUB    A            ;ZERO A FOR 2ND BYTE
  293.      CALL    OBJW            ;WRITE 00 INTO BYTE 2
  294.     INR    E    ;SAVE 2 BYTES IN OBJECT FOR
  295.     INR    E    ;'CENTER OF GRAVITY'.
  296.      INR    E            ;INC. BYTE #
  297.      LDA    COLOR            ;MAKE THE OLD COLOR THE SAME
  298.      STA    OLDCOLOR        ;AS THE NEW COLOR.
  299.      JMP    OUTCOORD        ;THEN, OUTPUT THE COORDS.
  300. *
  301. *    THIS IS HOW OBJECT IS FORMATTED, SEQUENTIALLY, STARTING WITH BYTE 0:
  302. *
  303. *       COLOR :ORIENTATION:X-CTR-OF-GRAV:Y-CTR-OF-GRAV: X1 : Y1 : ... ETC
  304. *       UNTIL AN 'X-COORD' IS :FF: THEN THE NEXT BYTE IS A NEW COLOR.
  305. *
  306. *
  307. *    CHECK HERE IF THERE IS A CHANGE IN COLOR: BYTE # IN E, OBJECT # IN D.
  308. *
  309. COLCHNG     LXI    H,OLDCOLOR        ;POINT HL AT OLD COLOR FOR
  310.      CMP    M            ;COMPARISON WITH COLOR IN A
  311.      JZ    OUTCOORD        ;IF SAME, BRANCH.
  312.      MOV    H,A            ;ELSE, SAVE NEW COLOR IN H
  313.      MVI    A,0FFH            ;WRITE OUT FF IN OBJECT LIST
  314.      CALL    OBJW
  315.      INR    E            ;INCREMENT THE BYTE NUMBER
  316.      MOV    A,H            ;RESTORE COLOR IN A
  317.      CALL    OBJW            ;AND WRITE OUT THE COLOR
  318.      INR    E            ;INC. BYTE #
  319.      STA    OLDCOLOR        ;MAKE OLDCOLOR=COLOR.
  320. *
  321. *    NEXT OUTPUT COORDINATES X & Y IN BC PAIR TO OBJECT.
  322. *
  323. OUTCOORD MOV    A,B            ;OUTPUT X COORD
  324.      CALL    OBJW
  325.      INR    E
  326.      MOV    A,C            ;OUTPUT Y COORD AFTER INCREMENTING BYTE#
  327.      CALL    OBJW
  328.      INR    E            ;INC. BYTE #.
  329.      LXI    H,BYTENO        ;POINT HL AT BYTE# TO SAVE LATEST VALUE.
  330.      MOV    M,E            ;SAVED.
  331. ;
  332. ;CHECK TO SEE IF WE SHOULD ABEND BECAUSE OF "FULL OBJECT".
  333. ;
  334.     PUSH    PSW
  335.     MVI    A,251    ;LAST LEGIT SPOT IN OBJECT.
  336.     CMP    E    ;(A-E);CARRY=BORROW IFF E>251.
  337.     JNC    STILLOK
  338. ;
  339. ;OBJECT IS FULL.
  340. ;
  341.     MVI    E,252    ;GET 4 FINAL BYTES TO WORK WITH.
  342.     CALL    WINDUP    ;DO C-OF-G,ENDMARK,PATH-LOCATIONS.
  343.     LXI    H,FULLMSG
  344.     CALL    PRINT
  345.     JMP    OBJECT1
  346. FULLMSG:DB    'THIS OBJECT IS FULL.SORRY...',CR,LF,'$'
  347. STILLOK:POP    PSW
  348. *
  349. *    HERE INCREMENT COORDS BY ADDING DELX & DELY TO B,C.
  350. *
  351. INCCOORD LXI    H,DELY            ;A CONTAINS Y COORD.
  352.      ADD    M            ;ADD DELY
  353.      MOV    C,A            ;PUT BACK IN C
  354.      MOV    A,B            ;GET X COORD IN A
  355.      DCX    H            ;POINT H AT DELX (ARRANGED SO)
  356.      ADD    M            ;ADD DELX
  357.      MOV    B,A            ;PUT BACK IN B
  358.      POP    H            ;DUMB POP SO AS NOT TO EAT STACK.
  359.      JMP    NEWPIXEL
  360. *
  361. *    COLOR HANDLING CODE:
  362. *
  363. COLRED     MVI    A,BINRED        ;PUT RED CODE IN COLOR
  364.      RET
  365. *
  366. COLBLUE     MVI    A,BINBLUE        ;PUT BLUE CODE IN COLOR
  367.      RET
  368. *
  369. COLGREEN MVI    A,BINGREEN        ;PUT GREEN CODE IN COLOR
  370.      RET
  371. *
  372. COLCYAN     MVI    A,BINCYAN        ;PUT CYAN CODE IN COLOR
  373.      RET
  374. *
  375. COLYELLW MVI    A,BINYELLW        ;PUT YELLOW CODE IN COLOR
  376.      RET
  377. *
  378. COLPRPL     MVI    A,BINPRPL        ;PUT PURPLE CODE IN COLOR
  379.      RET
  380. *
  381. COLWHITE MVI    A,BINWHITE        ;PUT WHITE CODE IN COLOR
  382.      RET
  383. *
  384. COLBLACK MVI    A,BINBLACK        ;PUT BLACK CODE IN COLOR
  385.      RET
  386. *
  387. TRNOFFCL MVI    A,80H            ;PUT TURN-OFF-COLOR CODE IN COLOR
  388. *
  389. *    HERE, THE ACCUMULATOR CONTAINS CODE FOR VARIOUS COLORS OR 80 FOR TURN-
  390. *    OFF.
  391. *
  392. STORCOLR STA    COLOR
  393.      RET                ;THIS TAKES IT BACK TO FLASHER.
  394. *
  395. *    SET HIGH INTENSITY
  396. *
  397. INTENS     LDA    INTENBYT        ;INTENSITY BIT OF COLOR NIBBLE.
  398.      XRI    08H            ;FLIP THE BIT
  399.      STA    INTENBYT
  400.      RET
  401. *
  402. *    DATA AREA
  403. *
  404. ONBSTASH DW    0    ;TO HOLD 'ONBUF'ADDR WHILE WE USE BACKBUF.
  405. MSG1     DB    CR,LF,'ENTER OBJECT # > $'
  406. *
  407. INTENBYT DB    0            ;INTENSITY OF COLOR
  408.  
  409. COLOR     DB    0            ;ENTERED COLOR
  410. OLDCOLOR DB    0FFH            ;OLD COLOR BEFORE COLOR CHANGE (IF ANY)
  411. DELX     DB    0            ;X INCREMENT FOR MOVE
  412. DELY     DB    0            ;Y INCREMENT FOR MOVE
  413. BYTENO     DB    0            ;BYTE # TO BE WRITTEN OUT
  414. OBJNO     DB    0            ;OBJECT # BEING WRITTEN
  415. BKGND     DB    0
  416. *    THIS SUBROUTINE PRODUCES A DELAY, BY EXECUTING A LOOP OF NOPS,
  417. *    WITHIN ANOTHER LOOP. BOTH LOOPS COUNT DOWN FROM 255.
  418. *
  419. DELAY    PUSH    PSW        ;SAVE A AND FLAGS
  420.     PUSH     D        ; "   DE PAIR
  421.     MVI    A,044H        ;SET UP COUNT DOWN VALUE IN A
  422.     MOV    D,A        ;PUT IN D, THE OUTER LOOP COUNTER &
  423. LOOP1    MOV    E,A        ;PUT IN E, THE INNER LOOP COUNTER.
  424. LOOP2    NOP            ;DELAY --- WASTE
  425.     NOP            ;    TIME
  426.     NOP
  427.     DCR    E        ;DECREMENT INNER LOOP COUNTER
  428.     JNZ    LOOP2        ;IF NOT 0, REPEAT; ELSE
  429.     DCR    D        ;DROP OUT OF LOOP & DECREMENT OUTER LOOP CTR,
  430.     JNZ    LOOP1        ;& IF NOT 0, START INNER LOOP AGAIN.
  431.     POP    D        ;ELSE, RESTORE DE PAIR &
  432.     POP    PSW        ;A & FLAGS &
  433.     RET            ;RETURN.
  434. *    SUBROUTINE TO CONVERT AN ASCII CHARACTER INPUT TO NUMERIC (HEX) IF
  435. *    SUCH A CHARACTER. THE CARRY FLAG IS SET ON RETURN IF THIS IS NOT SO.
  436. *    INPUT IS THE ASCII CHAR IN THE ACCUMULATOR.
  437. *    OUTPUT IS THE BINARY VALUE IN A IF LEGAL.
  438. *
  439. CONVRT     SUI    '0'            ;CHAR - '0'
  440.      JC    ERROR            ;IF < 0, ERROR
  441.     ADI    0E9H    ;ADD '0'-'G'.
  442.      JC    ERROR            ;IF > F, ERROR
  443.      ADI    6            ;INC BASE FOR A-F
  444.      JP    ATHRUF            ;IF +VE, ONE OF A-F
  445.      ADI    7            ;ELSE, MAYBE 0-9
  446.      JC    ERROR            ;IF > 9, ERROR
  447. ATHRUF     ADI    10            ;CORRECT THE BASE
  448.      ORA    A            ;CLEAR CARRY
  449.      RET
  450. *
  451. *    ERROR CODE
  452. ERROR    STC
  453.     RET
  454. ;
  455. ; LOOK FOR CTRL/C OR CTRL/N,TERMINATION COMMANDS.
  456. ;
  457. CI:    CALL    CIREAL    ;WE    GO GET A CHARACTER VIA CP/M.
  458.     CPI    'Z'    ;CLEAR SCREEN?
  459.     JNZ    CTRLN
  460.     SUB    A
  461.     CALL    CLEAR
  462.     JMP    CI
  463. CTRLN:    CPI    0EH    ;CTRL/N?(NEXT OBJECT REQUEST).
  464.     JNZ    CTRLC
  465.     CALL    WINDUP    ;CLOSE THIS OBJECT.
  466.     JMP    OBJECT1
  467. CTRLC:    CPI    03H    ;CTRL/C? (END OF DOODLING).
  468.     RNZ
  469.     CALL    WINDUP
  470.     CALL    DISPOFF
  471.     LHLD    ONBSTASH
  472.     SHLD    ONBUF    ;CORRECT POINTERS WE MESSED WITH.
  473.     JMP    0H    ;GOTO CP/M.
  474. ;
  475. ; WINDUP: PUTS ENDCODE ON OBJECT,EVALUATES CTR-OF-GRAVITY.
  476. ;
  477. WINDUP:    MVI    A,0FFH
  478.     LDA    OBJNO
  479.     MOV    D,A    ;SELECT OBJ. FOR FINAL WRITEOUT.
  480.     MVI    A,0FFH
  481.     CALL    OBJW
  482.     INR    E
  483.     MVI    A,80H
  484.     CALL    OBJW
  485. ;
  486. ; CENTER - OF - GRAVITY CALCULATION: FIND MAX,MIN X,Y
  487. ; SET CNTRX=(MAXX+MINX)/2, LIKEWISE Y.
  488. ;
  489.     MVI    B,0FFH    ;B HAS MIN-X
  490.     MOV    H,B    ;H HAS MIN-Y
  491.     MVI    C,0H    ;C HAS MAX-X
  492.     MOV    L,C    ;L HAS MAX-Y    ;NOTE:UNSIGNED COMPARES USED 
  493. ;                    ;IN ALL THIS ROUTINE.
  494.     MVI    E,4    ;START WITH FIRST PIXEL-PLACE IN OBJECT.
  495. COGTOP:    CALL    OBJR
  496.     CPI    0FFH    ;SPECIAL CODE?
  497.     JZ    SPECIAL
  498. ;
  499. ; COMPUTE MAX AND MIN VALUES
  500. ;
  501.     CMP    B
  502.     JNC    XMAX    ;IF (A-B)>=0 THEN B<=A.LEAVE IT.
  503.     MOV    B,A    ;NEW MINX WAS FOUND.
  504. XMAX:    CMP    C
  505.     JC    YMIN
  506.     MOV    C,A    ;NEW MAXX WAS FOUND.
  507. YMIN:    INR    E    ;GO LOOK AT THIS PIXEL'S Y.
  508.     CALL    OBJR
  509.     CMP    H
  510.     JNC    YMAX
  511.     MOV    H,A    ;NEW MINY WAS FOUND.
  512. YMAX:    CMP    L
  513.     JC    MAXBOT
  514.     MOV    L,A    ;NEW MAXY.
  515. MAXBOT:    INR    E
  516.     JMP    COGTOP
  517. ;
  518. ; WAS THIS AN ENDMARKER?
  519. ;
  520. SPECIAL:INR    E
  521.     CALL    OBJR
  522.     INR    E
  523.     CPI    80H    ;ENDMARKER?
  524.     JNZ    COGTOP    ;GO ROUND SMORE;T'WASNT.
  525. ;
  526. ; CALCULATE C-OF-GRAVITY NOW;WE:RE DONE.
  527. ;
  528.     MVI    E,2    ;WHERE TO PUT IT.
  529.     MOV    A,B
  530.     ADD    C
  531.     STC
  532.     CMC        ;GIVE ME A HI-BIT ZERO
  533.     RAR        ;TO COVER WHEN I DIVIDE BY 2
  534.     CALL    OBJW    ;AND PUT IT IN AS X-CTR-OF-G.
  535.     INR    E
  536.     MOV    A,H
  537.     ADD    L
  538.     STC
  539.     CMC
  540.     RAR
  541.     CALL    OBJW    ;PUT OUT Y-CTR-OF-G.
  542. ;
  543. ;WE PREPARE TWO BYTES AT THE END OF THE OBJECT
  544. ;FOR 'PATH' TO STORE INFO IF THIS OBJECT EVER
  545. ; MOVES ALONG A PATH.
  546. ;
  547.     XRA    A
  548.     MVI    E,254    ;NULL OBJECT'S LAST TWO BYTES
  549.     CALL    OBJW
  550.     INR    E    ;FOR USE BY PATH.
  551.     CALL    OBJW
  552. ;
  553.     RET
  554. ;
  555. *
  556. ; 16 JULY 79 : MOSHELL
  557. ;
  558. ;TACK ON CODE FOR ROUTINES THAT EXPECT THE 'FELIX' UTILITY
  559. ;PACKAGE TO BE IN RESIDENCE. CRIES 'HELP HELP' (ACTUALLY
  560. ;IN A DIGNIFIED WAY) WHEN THE DISPATCH TABLE
  561. ;AT 5000H IS MISSING. CALLS CPM BIOS...JUMPS TO WARM BOOT
  562. ;IF THE TABLE ISN'T THERE.
  563. ;
  564. ;THIS HAS NO ORG BECAUSE IT'S TACKED ON TO STUFF.
  565. ;
  566. CPM    EQU    0
  567. SURVIVAL:LDA    5000H    ;WHERE 'FELIX' STARTS.
  568.     CPI    0C3H    ;IS IT A JUMP?
  569.     JNZ    BAD    ;IF NOT WE'RE WITHOUT UTILITIES.
  570.     LDA    5003H
  571.     CPI    0C3H    ;IS THERE ANOTHER ONE?
  572.     RZ        ;IF SO WE ASSUME ALL'S WELL.
  573. BAD:    LXI    D,TEXT
  574.     MVI    C,9    ;CALL FOR TEXT-PRINT
  575.     CALL    BIOS
  576.     JMP    CPM
  577. TEXT:    DB    'PLEASE LOAD THE FELIX UTILITIES BY '
  578.     DB    'TYPING "FELIX" FIRST.',0DH,0AH,'$'
  579.     END
  580.