home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / CROSSASM / ASM370.ZIP / HATGIRL2.ALC < prev    next >
Encoding:
Text File  |  1985-09-08  |  7.4 KB  |  200 lines

  1.          TITLE 'HATGIRL2.ALC - CALCULATE VALUE OF E FOR N HATS'
  2. *  PGMID.  HATGIRL2.ALC
  3. *  AUTHOR. DON HIGGINS.
  4. *          6365 - 32 AVENUE NORTH
  5. *          ST. PETERSBURG, FL 33710
  6. *
  7. *  DATE.    09/07/85.
  8. *  REMARKS. THIS PROGRAM CALCULATES VALUE OF E (BASE OF NATUARAL
  9. *           LOGRITHMS) USING THE CARELESS HAT CHECK GIRL ALGORITHM
  10. *           DESCRIBED BY ROBERT T. KUROSAKA IN 9/85 BYTE.  HE
  11. *           SHOWS THAT E IS EQUAL TO N! DIVIDED BY THE NUMBER OF
  12. *           WAYS THAT N HATS CAN BE DISTRIBUTED SUCH THAT NO ONE
  13. *           GETS THE CORRECT HAT.
  14. *
  15. *           THIS ALGORITHM IS WRITTEN IN IBM 370 ASSEMBLER TO BE
  16. *           RUN ON AN IBM PC USING THE PC/370 ASSEMBLER AND
  17. *           EMULATOR.  THIS PROGRAM DIFFERS FROM THE BASIC PROGRAM
  18. *           SHOWN IN BYTE, IN THAT IT IS DETERMINISTIC RATHER THAN
  19. *           USING A RANDOM SAMPLE OF DISTRIBUTIONS TO APPROXIMATE
  20. *           THE ANSWER FOR A GIVEN N.  THIS PROGRAM CALCULATES THE
  21. *           EXACT ANSWER FOR A GIVEN N.  THE LARGER THE VALUE OF N,
  22. *           THE MORE ACCURATE THE ANSWER IS.
  23. *
  24. *           PC/370 IS A FREEWARE PACKAGE AVAILABLE ON MANY PC USER
  25. *           GROUP ELECTRONIC BULLETIN BOARDS.
  26. *
  27. HATGIRL2 CSECT
  28.          LR    BASE,ENTRY
  29.          USING HATGIRL2,BASE
  30.          LA    N,2
  31.          LA    ONE,1
  32.          LA    BADCOMB,0
  33.          L     ENTRY,=V(TIMER)
  34.          BALR  LINK,ENTRY      SAVE STARTING TIME IN 100TH SECONDS
  35.          ST    R0,TIME
  36. MAINLOOP EQU   *
  37.          BAL   LINK,CALCBAD    COUNT BAD COMBINATIONS FOR CURRENT N
  38.          BAL   LINK,CALCE      CALCULATE N! AND E FOR CURRENT N
  39.          L     ENTRY,=V(TIMER)
  40.          BALR  LINK,ENTRY
  41.          L     R1,TIME
  42.          ST    R0,TIME         SAVE NEW TIME
  43.          SR    R0,R1
  44.          CVD   R0,PWORK
  45.          MVC   DS,DSMASK
  46.          ED    DS,PWORK+4      EDIT SECONDS
  47.          LA    R2,MSGLINE
  48.          SVC   WTO             DISPLAY RESULTS FOR CURRENT N
  49.          AR    N,ONE
  50.          CH    N,=AL2(MAXN)
  51.          BNH   MAINLOOP
  52.          SVC   EXIT
  53.          TITLE 'CALCBAD - CALCULATE NUMBER OF BAD COMBINATIONS FOR N'
  54. CALCBAD  EQU   *              CALCULATE BADCOMB = TOTAL BAD COMBINATIONS
  55. *
  56. *  INCREMENT COMBINATION COUNTER D(N) TO NEXT BAD COMBINATION
  57. *  INCREMENT BADCOMB
  58. *  EXIT WHEN COUNTER OVERFLOWS
  59. *
  60.          XR    BADCOMB,BADCOMB
  61.          MVC   D,DINIT
  62.          MVC   DP,DPINIT
  63.          LA    I,1
  64.          XR    R1,R1
  65.          XR    R2,R2
  66.          LR    NM1,N
  67.          BCTR  NM1,0         SET NM1 = N - 1
  68. INCDI    EQU   *             INCREMENT D(I) TO NEXT BAD DIGIT
  69.          IC    J,D-1(I)
  70. FINDD    EQU   *             SEARCH DP(J) TO DP(N) FOR NEXT DIGIT
  71.          AR    J,ONE
  72.          CLR   J,N
  73.          BH    NOTFOUND      NO BAD DIGITS FOUND, GO INCR PREV DIGIT
  74.          IC    R1,DP-1(J)
  75.          CLR   I,R1          IS NEXT HIGHEST DIGIT AVAILABLE
  76.          BNL   FINDD         NO, GO TO NEXT LARGER DIGIT
  77.          CLR   J,I           IS NEXT DIGIT BAD
  78.          BE    FINDD         NO, GO TO NEXT LARGER DIGIT
  79. FOUND    EQU   *             SWAP LARGER DIGIT WITH D(I)
  80.          IC    R1,D-1(I)     SAVE OLD DIGIT
  81.          IC    R2,DP-1(J)    SAVE OLD POSITION OF NEW DIGIT
  82.          STC   J,D-1(I)      STORE NEW DIGIT
  83.          STC   I,DP-1(J)     SET POSITION OF NEW DIGIT
  84.          STC   R1,D-1(R2)    STORE OLD DIGIT
  85.          STC   R2,DP-1(R1)   SET POSITION OF OLD DIGIT
  86. SORT     EQU   *
  87. *
  88. *    SORT D(I+1) TO D(N) IN ASCENDING ORDER
  89. *
  90.          XR    J,J
  91.          LR    K,I
  92. NEXTDK   EQU   *             SEARCH DP(J) FOR NEXT DIGIT FOR D(K)
  93.          AR    K,ONE
  94.          CLR   K,N
  95.          BNL   CHKLAST       GO CHECK IF LAST SORTED DIGIT D(N) IS BAD
  96. NEXTDPJ  EQU   *             FIND NEXT HIGHEST DIGIT FOR D(K)
  97.          AR    J,ONE
  98.          IC    R1,DP-1(J)
  99.          CLR   K,R1          IS THIS DIGIT AVAILABLE
  100.          BH    NEXTDPJ
  101.          BE    CHKDIGIT      IF ALREADY AT K, SKIP SWAP
  102.          IC    R1,D-1(K)     SAVE OLD DIGIT
  103.          IC    R2,DP-1(J)    SAVE OLD POSITION OF NEW DIGIT
  104.          STC   J,D-1(K)      STORE NEW DIGIT
  105.          STC   K,DP-1(J)     SET POSITION OF NEW DIGIT
  106.          STC   R1,D-1(R2)    STORE OLD DIGIT
  107.          STC   R2,DP-1(R1)   SET POSITION OF OLD DIGIT
  108. CHKDIGIT EQU   *
  109.          CLR   J,K           IS SORT DIGIT BAD
  110.          BNE   NEXTDK        YES, CONTINUE SORT
  111.          LR    I,K           NO, GO INCR GOOD DIGIT
  112.          B     INCDI
  113. CHKLAST  EQU   *
  114.          IC    R1,D-1(K)
  115.          CLR   K,R1          IS LAST DIGIT BAD
  116.          BNE   SORTOK        YES, SORT DONE
  117.          LR    I,NM1         NO,  GO INCR D(N-1)
  118.          B     INCDI
  119. SORTOK   EQU   *
  120.          AR    BADCOMB,ONE   COUNT BAD COMBINATION
  121.          LR    I,NM1         GO INCR D(N-1)
  122.          B     INCDI
  123. NOTFOUND EQU   *
  124.          BCTR  I,0           DECREMENT I
  125.          IC    R1,D-1(I)
  126.          LTR   R1,R1         IF NOT OVERFLOW
  127.          BNE   INCDI         THEN GO INCREMENT NEW D(I)
  128.          BR    LINK          ELSE EXIT WITH BAD COMBINATION COUNT
  129.          TITLE 'CALCE - CALCULATE N! AND E FOR GIVEN N'
  130. CALCE    EQU   *               CALCULATE AND FORMAT RESULTS
  131.          CVD   N,PWORK
  132.          MVC   DNN,DNMASK
  133.          ED    DNN,PWORK+6      N
  134.          LR    R1,N
  135.          LR    R2,N
  136.          BCTR  R2,0
  137. NFAC     EQU   *
  138.          MR    R0,R2           GENERATE N!
  139.          BCT   R2,NFAC
  140.          CVD   R1,PWORK
  141.          MVC   DT,DTMASK
  142.          ED    DT,PWORK+4      N!
  143.          ZAP   PT,PWORK
  144.          CVD   BADCOMB,PWORK
  145.          MVC   DB,DBMASK
  146.          ED    DB,PWORK+4      BAD COMBINATIONS
  147.          MP    PT,=P'100000000'
  148.          DP    PT,PWORK+4(4)
  149.          MVC   DE,DEMASK
  150.          ED    DE,PT+7         E
  151.          BR    LINK
  152. *
  153. *  REGISTER ASSIGNMENTS
  154. *
  155. R0       EQU   0   WORK
  156. R1       EQU   1   WORK
  157. R2       EQU   2   WORK
  158. N        EQU   3   NUMBER OF HATS
  159. BADCOMB  EQU   4   BAD COMBINATION COUNTER
  160. I        EQU   5   INDEX FOR DIGITS D(I) AND DP(I)
  161. J        EQU   6   INDEX FOR DIGITS D(J) AND DP(J)
  162. K        EQU   7   INDEX FOR DIGITS D(K) AND DP(K)
  163. ONE      EQU   10  FREQUENTLY USED CONSTANT
  164. NM1      EQU   11  FREQUENTLY USED CONSTANT N-1
  165. BASE     EQU   12  BASE
  166. LINK     EQU   14  LINK
  167. ENTRY    EQU   15  ENTRY
  168. *
  169. *        PC/370 SYSTEM SVC'S
  170. *
  171. WTO      EQU   209  WRITE TO OPERATOR (R2 = ADDRESS OF TEXT FOLLOWED BY $)
  172. EXIT     EQU   0    RETURN TO MSDOS
  173. *
  174. *        DATA AREAS
  175. *
  176. MAXN     EQU   12              MAX NUMBER OF COMBINATIONS (HATS)
  177. DINIT    DC    (MAXN)AL1(*-DINIT+1)   COMBINATION REGISTER WITH DIGITS
  178. DPINIT   DC    (MAXN)AL1(*-DPINIT+1)   POSITION OF VALUE IN D(I)
  179.          DC    C'*** D REG ***'
  180.          DC    X'00'           FORCE OVERFLOW ON CARRY OUT
  181. D        DC    XL(MAXN)'00'    BAD COMBINATION REGISTER
  182.          DC    C'*** DP REG ***'
  183. DP       DC    XL(MAXN)'00'    DIGIT POSITION INDEX REGISER
  184. PWORK    DC    D'0'            WORK AREA FOR CVD
  185. PT       DC    PL16'0'         WORK AREA TO CALC TOTCOMB/BADCOMP
  186. TIME     DC    F'0'
  187. MSGLINE  EQU   *
  188.          DC    C' N='
  189. DNN      DC    C' ZZZ',C'  N!='
  190. DT       DC    C' Z,ZZZ,ZZZ',C'  BAD='
  191. DB       DC    C' Z,ZZZ,ZZZ',C'  E='
  192. DE       DC    C' 9.99999999',C'  SEC='
  193. DS       DC    C' ZZ,ZZZ',C'$'
  194. DNMASK   DC    X'40202020'
  195. DTMASK   DC    X'4020',C',',X'202020',C',',X'202020'
  196. DBMASK   DC    X'4020',C',',X'202020',C',',X'202020'
  197. DEMASK   DC    X'4021',C'.',8X'21'
  198. DSMASK   DC    X'402020',C',',X'202121'
  199.          END   HATGIRL2
  200.