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 / DISTPLUS.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  11KB  |  318 lines

  1. ; 30 AUG; FIXED EAST-SIDE ERROR IN 'DIST'.. MOSHELL.
  2. ;
  3. * WHERE * TYE SHULTZ /  3 FEB 79  /  VERSION 2.1
  4. *
  5. * 'WHERE' RETURNS VIA 'OUTPARM' THE X,Y LOCATION OF THE 
  6. ; CENTER  OF  GRAVITY OF THE OBJECT NAMED BY FIRST PARAM.THE
  7. * PIXEL COORDINATES ARE PLACED IN THE NEXT TWO PARAMETERS BY 'OUTPAR'.
  8. * SYSTEM SUBROUTINES: INPARM, OBJR, OUTPARM.
  9. *
  10. * ALL REGISTERS ARE RESTORED.
  11. *
  12. CTRGRAVX EQU    2
  13. INPARM    EQU    5030H
  14. OUTPARM    EQU    5033H
  15. OBJR    EQU    5006H
  16. *
  17.     ORG    2E50H
  18. WHERE:    MVI    H,0    ;
  19.     CALL    INPARM    ; GET OBJECT # INTO D.
  20.     MOV    D,E
  21.     MVI    E,CTRGRAVX    ; POINT E AT  CTR.OF GRAV. X COORD.
  22.     CALL    OBJR    ; GET FIRST X INTO A.
  23.     XCHG
  24.     MOV    E,A
  25.     CALL    OUTPARM    ; PUT X INTO SECOND PARAMETER.
  26.     XCHG
  27.     INR    E    ; POINT  E AT FIRST  PIXEL Y COORD.
  28.     CALL    OBJR    ; GET Y INTO A.
  29.     XCHG
  30.     MOV    E,A
  31.     CALL    OUTPARM    ; PUT IT IN THE THIRD PARAMETER.
  32.     RET
  33. ***********************************************************************
  34. *                                                                     *
  35. *                   DISTANCE OPERATOR                                 *
  36. *                   VERSION 1.1                                       *
  37. *                   MAR. 26, 1979                                     *
  38. *                   TYE SHULTZ                                        *
  39. *                                      *
  40. *    THIS ROUTINE FINDS THE DISTANCE BETWEEN THE TWO OBJECTS          *
  41. *    SPECIFIED IN THE FIRST TWO PARAMETERS FOLLOWING THE OPCODE.      *
  42. *    THE DISTANCE FOUND IS PLACED IN THE THIRD PARAMETER.             *
  43. *                                          *
  44. *    THERE ARE TWO MAJOR PHASES TO THIS ROUTINE:              *
  45. *      1) FIND THE MINIMUM AND MAXIMUM X COORDINATE AND Y COORD       *
  46. *         IN EACH OF THE OBJECTS AND SAVE THEM IN 8 CONSECUTIVE       *
  47. *         BYTES.                              *
  48. *      2) USING THE MINIMUMS AND MAXIMUMS FOUND IN PHASE I, FIND      *
  49. *         THE DISTANCE BETWEEN THE TWO OBJECTS AND PLACE IT IN        *
  50. *         THE THIRD PARAMETER.  THE ALGORITHM FOR THIS IS DESCRIBED   *
  51. *         BELOW (SEE PHASE II).                             *
  52. *                                      *
  53. *    SUBROUTINES CALLED --                          *
  54. *      INPARM - RETURNS THE NEXT PARAMETER IN THE PROGRAM QUEUE     *
  55. *                 IN REGISTERS D AND E (16 BIT PARAMS) OR IN E (8     *
  56. *                 BIT PARAMS).                          *
  57. *        OUTPARM - PLACES THE 16 BIT VALUE IN D,E OR THE 8 BIT VALUE  *
  58. *               IN E INTO THE NEXT PARAMETER IN THE PROGRAM        *
  59. *              QUEUE. IF THE VALUE IS IN E ONLY, D MUST          *
  60. *           BE ZERO.                          *
  61. *        OBJR - RETURNS A BYTE FROM AN OBJECT IN REGISTER A. THE      *
  62. *        NUMBER OF THE DESIRED OBJECT MEST BE IN D AND THE     *
  63. *               NUMBER OF THE DESIRED BYTE MUST BE IN E.          *
  64. *     OBJW - PUTS THE CONTENTS OF REGISTER A INTO A BYTE OF    *
  65. *               OF AN OBJECT. REGISTERS ARE AS IN OBJR.                 *
  66. *     SCANNER - SCANS THE PIXELS BYTES OF AN OBJECT AND          *
  67. *            RETURNS THE MINIMUM AND MAXIMUM X AND Y           *
  68. *           COORDINATES IN THE OBJECT. WHEN SCANNER IS       *
  69. *            CALLED, REGISTERS D AND E MUST HAVE THE OBJECT     *
  70. *           NUMBER AND THE NUMBER OF THE BYTE WHICH CONTAINS   *
  71. *           THE Y COORD OF THE FIRST PIXEL (CURRENTLY THE    *
  72. *           5TH BYTE OF THE OBJECT). REGISTERS BC AND HL          *
  73. *           MUST HAVE THE X,Y COORDS OF THE FIRST PIXEL.          *
  74. *                                      *
  75. ***********************************************************************
  76. *
  77. INPARM    EQU    5030H
  78. OUTPARM EQU    5033H
  79. OBJR    EQU    5006H
  80. PIXEL1X EQU    4
  81. ;
  82. ;
  83.     ORG    2E70H
  84. DIST:    MVI    A,1    ;SET OBJECT FLAG TO 1 INITIALLY. WHEN AN OBJECT
  85.     STA    OBJFLAG    ;HAS BEEN SCANNED, OBJFLAG IS DECREMENTD BY 1. IF
  86.             ;IT IS THEN NON-NEGATIVE, THE NEXT OBJECT IS
  87.             ;SCANNED. OTHERWISE, PHASE II BEGINS.
  88.     LXI    H,OBJ1XMAX    ;GET THE ADDRESS OF THE FIRST OF THE 8
  89.     PUSH    H        ;BYTES THAT WILL HOLD THE MIN AND MAX X AND
  90.                 ;Y COORDS.
  91. ;
  92. ;
  93. ************
  94. *
  95. *    PHASE I -- GET THE NUMBER OF THE OBJECT SPECIFIED BY THE NEXT
  96. *             PARAMETER IN THE QUEUE AND INITIALIZE THE MINS AND MAXIMUMS
  97. *        FOR THAT OBJECT. CALL THE SCANNER TO RETURN THE ACTUAL
  98. *        MINIMUMS AND MAXIMUMS AND SAVE THEM. THEN CHECK IF ANOTHER
  99. *        OBJECT REMAINS TO BE SCANNED. IF ONE DOES REMAIN, CONTINUE
  100. *        PHASE I AT THE TOP; OTHERWISE GO ON TO PHASE II.
  101. ;
  102. ;
  103. PHASE1:    CALL    INPARM        ;GET THE NUMBER OF THE NEXT OBJECT INTO D
  104.     MOV    D,E        ;AND THE BYTE NUMBER OF THE FIRST PIXEL X
  105.     MVI    E,PIXEL1X    ;COORD INTO E.
  106.     CALL    OBJR        ;GET THE VALUE OF THE FIRST PIXEL X COORD INTO
  107.     MOV    B,A        ;REGISTERS B AND H (INITIAL MIN AND MAX).
  108.     MOV    H,A        ;THEN POINT REGISTER E AT THE FIRST PIXEL Y
  109.     INR    E        ;COORD, GET THE Y VALUE, AND INITIALIZE THE
  110.     CALL    OBJR        ;MINIMUM AND MAXIMUM Y COORD
  111.     MOV    C,A        ;REGISTER C AND L.
  112.     MOV    L,A
  113.     CALL    SCANNER        ;SCAN THE OBJECT FOR THE ACTUAL MINIMUM AND
  114.                 ;MAXIMUM X AND Y (X MIN IN B, MAX IN H - Y
  115.                 ;MIN IN C AND MAX IN L).
  116. ;
  117. ;    SAVE THE MINIMUM AND MAXIMUM VALUES FOR THE CURRENT OBJECT.
  118. ;
  119.     XCHG            ;SAVE THE MAX X AND Y IN DE. THEN GET THE ADDRESS
  120.     POP    H        ;OF THE FIRST OF THE FOUR BYTES WHICH WILL
  121.     MOV    M,D        ;HOLD THE MINS AND MAXES. SAVE THE MAX X.
  122.     INX    H        ;
  123.     MOV    M,B        ;SAVE THE MIN X.
  124.     INX    H
  125.     MOV    M,E        ;SAVE THE MAX Y.
  126.     INX    H        ;
  127.     MOV    M,C        ;SAVE THE MIN Y.
  128.     INX    H        ;LEAVE HL POINTING AT THE NEXT BYTE TO HOLD
  129.                 ;A MAX X (IF THERE IS ANOTHER OBJECT TO BE
  130.                 ;SCANNED).
  131. ;
  132. ;    CHECK IF ANOTHER OBJECT NEEDS TO BE SCANNED. IF ONE DOES, GO BACK
  133. ;    TO THE START OF PHASE I. OTHERWISE, GO ON TO PHASE II.
  134. ;
  135.     LDA    OBJFLAG        ;GET THE END OF PHASE I FLAG AND DECREMENT IT.
  136.     DCR    A        ;IF THE RESULT IS NEGATIVE, BOTH OBJECTS HAVE
  137.     JM    PHASE2        ;BEEN SCANNED --> GO TO PHASE II. OTHERWISE, 
  138.     STA    OBJFLAG        ;SAVE THE FLAG AND THE ADDRESS OF THE BYTE
  139.     PUSH    H        ;BYTE WHICH WILL RECEIVE THE MAX X OF THE
  140.     JMP    PHASE1        ;SECOND OBJECT AND CONTINUE PHASE I.
  141. ;
  142. ;
  143. *****************
  144. *
  145. *    PHASE II -- THIS PHASE DETERMINES THE DISTANCE BETWEEN THE TWO
  146. *         OBJECTS AND PLACES THAT DISTANCE IN THE NEXT PARAMETER
  147. *         IN THE QUEUE. TO DETERMINE THE DISTANCE BETWEEN THE TWO
  148. *         OBJECTS, THIS VERSION FIRST FINDS THE DISPLACEMENTS
  149. *         BETWEEN THE OBJECTS IN THE X AND Y DIRECTIONS. IF THE
  150. *         OBJECTS OVERLAP IN EITHER (OR BOTH) DIRECTIONS, A
  151. *         DISPLACEMENT OF -1 IS ASSIGNED IN THAT DIRECTION. THE
  152. *         LARGER OF THE TWO DISPLACEMENTS IS THEN CHOSEN AS THE
  153. *         DISTANCE BETWEEN THE OBJECTS. IF BOTH DISPLACEMENTS ARE
  154. *         -1, A DISTANCE OF 0 IS CHOSEN.
  155. *
  156. *****************
  157. ;
  158. ;
  159. *
  160. *    THIS SECTION DETERMINES THE DISPLACEMENT OF THE TWO OBJECTS IN THE X
  161. *    DIRECTION AND EXITS WITH THAT DISPLACEMENT IN REGISTER H.
  162. *
  163. ;
  164. PHASE2:    LDA    OBJ1XMAX    ;CHECK IF THE MAXIMUM X OF THE FIRST OBJECT
  165.     MOV    B,A        ;IS <= THE MINIMUM X OF THE SECOND OBJECT.
  166.     LDA    OBJ2XMIN    ;IF IT IS, GET THE X DISPLACEMENT INTO A AND
  167.     SUB    B        ;JUMP TO THE END OF THIS SECTION. OTHERWISE,
  168.     JM    XTEST2        ;JUMP TO THE NEXT TEST.
  169.     JMP    SECTEND
  170. ;
  171. XTEST2:    LDA    OBJ2XMAX    ;CHECK IF THE MAX X OF THE SECOND OBJECT IS
  172.     MOV    B,A        ; <= THE MINIMUM X OF THE FIRST OBJECT.
  173.     LDA    OBJ1XMIN    ;IF IT IS, GET THE X DISPLACEMENT INTO A AND
  174.     SUB    B
  175.     JP    SECTEND        ;JUMP TO THE END OF THIS SECTION. OTHERWISE,
  176.     XRA    A        ;THE OBJECTS OVERLAP AND A DISPLACEMENT OF
  177.     DCR    A        ; -1 IS SAVED.
  178. SECTEND:    MOV    H,A    ;SAVE THE DISPLACEMENT FOUND FOR USE IN THE THIRD
  179.                 ;SECTION.
  180. ;
  181. ;
  182. *
  183. *    THIS SECTION DETERMINES THE DISPLACEMENT OF THE TWO OBJECTS IN THE Y
  184. *    DIRECTION AND EXITS WITH THE DISPLACEMENT FOUND IN REGISTER A.
  185. *
  186. ;
  187. ;
  188.     LDA    OBJ1YMAX    ;LOGIC IS THE SAME AS THE LAST SECTION.
  189.     MOV    B,A
  190.     LDA    OBJ2YMIN
  191.     SUB    B
  192.     JP    GETDIST
  193. ;
  194.     LDA    OBJ2YMAX
  195.     MOV    B,A
  196.     LDA    OBJ1YMIN
  197.     SUB    B
  198.     JP    GETDIST
  199. ;
  200.     XRA    A
  201.     DCR    A
  202. ;
  203. ;
  204. ;
  205. *
  206. *    THIS SECTION CHOOSES THE LARGER OF THE TWO DISPLACEMENTS FOUND PREVIOUSLY
  207. *    AND SETS THE NEXT PARAMETER IN THE QUEUE TO THIS DISTANCE. IF
  208. *    BOTH DISPLACEMENTS = -1, THE DISTANCE BETWEEN THE TWO
  209. *    OBJECTS IS ZERO.
  210. *
  211. ;
  212. GETDIST:    CMP    H    ;IF THE TWO DISPLACEMENTS ARE EQUAL, GO CHECK
  213.     JZ    TSTOUCH        ;IF THEY ARE BOTH = -1. IF THE Y DISPLACEMENT
  214.     JP    SAVYDIST    ;(IN A) IS GREATER, GO SAVE IT.
  215.     MOV    E,H        ;ELSE SAVE THE X DISPLACEMENT AND GO EXIT
  216.     JMP    ENDIST        ;THIS SECTION.
  217. ;
  218. TSTOUCH:    ANA    A    ;CHECK IF THE Y DISPLACEMENT IS -1. IF NOT,
  219.     JP    SAVYDIST    ;GO SAVE IT AS THE DISTANCE. IF IT IS, 
  220.     XRA    A        ;SET IT TO 0 AND FALL THROUGH.
  221. SAVYDIST:    MOV    E,A    ;SAVE THE Y DISPLACEMENT (OR A ZERO IF 
  222.                 ;BOTH DISPLACEMENTS WERE -1.
  223. ENDIST:    XRA    A        ;MOVE A ZERO INTO D AND PUT THE DISTANCE INTO
  224.     MOV    D,A    ;THE NEXT PARAMETER.THEN RETURN CONTROL TO EXEC.
  225.     PUSH    D
  226.     CALL    OUTPARM
  227.     POP    D
  228. ;
  229. ; SET THE ZERO FLAG IF DISTANCE IS ZERO.CLEAR IT OTHERWISE.
  230. ZFLAG    EQU    40H
  231. NOZFLAG    EQU    0BFH
  232. FLAGS    EQU    114H
  233. ;
  234.     XRA    A
  235.     CMP    E    ;IF E IS ZERO,
  236.     JZ    YESZERO
  237. NOZERO:    LDA    FLAGS
  238.     ANI    NOZFLAG
  239.     STA    FLAGS
  240.     RET
  241. YESZERO:LDA    FLAGS
  242.     ORI    ZFLAG
  243.     STA    FLAGS
  244.     RET
  245. ;
  246. ;
  247. ;
  248. *************************************************************************
  249. *                                    *
  250. *    SCANNER -- THIS ROUTINE SCANS THROUGH THE OBJECT, COMPARING EACH    *
  251. *            X AND Y COORD TO THE MINIMUM AND MAXIMUM X AND Y FOUND    *
  252. *        SO FAR. ON ENTRY, BC AND HL MUST HAVE THE X,Y OF THE     *
  253. *        FIRST PIXEL. DE MUST HAVE THE NUMBER OF THE OBJECT    *
  254. *        TO BE SCANNED AND THE NUMBER OF THE BYTE WHICH HAS    *
  255. *        THE Y OF THE FIRST PIXEL.                *
  256. *                                    *
  257. *************************************************************************
  258. ;
  259. ;
  260. SPECODE    EQU    0FFH
  261. ENDFLAG    EQU    80H
  262. ;
  263. SCANNER:    INR    E    ;CHECK IF THE NEXT BYTE OF THE OBJECT IS A
  264.     CALL    OBJR        ;IS A SPECIAL CODE (HEX FF). IF IT IS,
  265.     CPI    SPECODE        ;JUMP TO A ROUTINE TO CHECK IF THE END
  266.     JZ    TESTEND        ;OF THE OBJECT HAS BEEN REACHED. THIS ROUTINE
  267.                 ;BUMPS REG E TO THE NEXT PIXEL AND RETURNS
  268.                 ;TO THE TOP OF THE SCANNER IF THE END WASN'T
  269.                 ;REACHED.
  270.     CMP    B        ;CHECK IF THE NEX X IS A NEW MIN OR MAX.
  271.     JM    NEWXMIN        ;IF IT'S A NEW MIN, GO SAVE IT AND CHECK FOR
  272.     CMP    H        ;A NEW Y MIN OR MAX. ELSE DO THE SAME FOR A NEW
  273.     JM    CHECKY        ;X MAX. IF IT'S NOT A NEW MIN OR MAX X,
  274.                 ;GO CHECK THE NEXT Y.
  275. NEWXMAX:MOV    H,A
  276.     JMP    CHECKY
  277. NEWXMIN:MOV    B,A    ;SAVE THE NEW MINIMUM X.
  278. CHECKY:    INR    E        ;POINT E AT THE NEXT BYTE (A Y COORD).
  279.     CALL    OBJR
  280.     CMP    C
  281.     JM    NEWYMIN
  282.     CMP    L
  283.     JM    SCANNER
  284.     MOV    L,A        ;SAVE A NEW Y MAX.
  285.     JMP    SCANNER
  286. NEWYMIN:    MOV    C,A    ;SAVE A NEW Y MIN.
  287.         JMP    SCANNER
  288. ;
  289. ;
  290. ;    THIS ROUTINE CHECKS IF THE BYTE FOLLOWING A SPECIAL CODE BYTE IS AN
  291. ;    END OF OBJECT FLAG (HEX 80). IF IT IS, A RETURN FROM THE SCANNER
  292. ;    IS EXECUTED. IF NOT, CONTROL RETURNS TO THE TOP OF THE SCANNER.
  293. ;
  294. TESTEND:    INR    E
  295.         CALL    OBJR
  296.         CPI    ENDFLAG
  297.         JNZ    SCANNER
  298.         RET
  299. ;
  300. ;
  301. *********************************************************************
  302. *
  303. *    DATA AREA FOR DISTANCE OPERATOR.
  304. *
  305. *********************************************************************
  306. ;
  307. ;
  308. OBJ1XMAX    DB    0H
  309. OBJ1XMIN    DB    0H
  310. OBJ1YMAX    DB    0H
  311. OBJ1YMIN    DB    0H
  312. OBJ2XMAX    DB    0H
  313. OBJ2XMIN    DB    0H
  314. OBJ2YMAX    DB    0H
  315. OBJ2YMIN    DB    0H
  316. OBJFLAG        DB    1
  317.