home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / decus / RB128 / findmax.txt < prev    next >
Text File  |  1995-06-04  |  9KB  |  424 lines

  1. /
  2. /                        FIND-MAX
  3. /
  4. /       This is a simple demonstration  program for the
  5. / simul8 simulator.
  6. /
  7. /       The program is to read from input  a sequence
  8. / of numbers; it is to find the largest number in this sequence and
  9. / the number of items in the sequence. These values are then
  10. / to be printed 
  11. /
  12. /       The input should consist of a sequence of small positive
  13. / numbers (in decimal) separated by spaces and terminated by
  14. / a number 0
  15. /
  16. /       The program does not attempt to validate the input, check
  17. / for overflow or perform and other testing.
  18. /
  19. / The program contains shift-add multiply and corresoponding divide
  20. / subroutines
  21. /
  22. *20
  23. char,   0               / next character read or written
  24. nchar,  0               / value as number if character was a digit
  25. num,    0               / number being worked on
  26. max,    0               / maximum found so far
  27. items,  0               / count of numbers processed.
  28. *160
  29. mplr,   0               / multiplier
  30. mpand,  0               / multiplicand
  31. prod,   0               / single length product
  32. temp,   0               / work space used by multiply routine
  33. divsr,  0               / divisor
  34. divdn,  0               / dividend
  35. quot,   0               / quotient
  36. rem,    0               / remainder
  37. kd12,   14              / 12 decimal, the number of bits
  38. kd10,   12              / 10 decimal
  39. kd100,  144             / 100 decimal
  40. kd1000, 1750            / 1000 decimal
  41. cntr,   0               / used when looping as a counter
  42. *200
  43. start,  cla cll
  44.     dca max
  45.     dca items
  46. / main loop, get next character, echo it
  47. loop,   jms i pget
  48.     jms i pput1
  49. / test if it's a digit, if so then it starts a number and must read numeric
  50. / data, if not a digit --- then go back and collect next character input
  51.     jms i pisdig
  52.     jmp loop
  53.     dca nchar
  54. /       have a number, complete reading process
  55.     jms readnm
  56. /       is it zero, if so finished
  57.     tad num
  58.     sna
  59.     jmp quit
  60. /       is it maximum?
  61.     cia
  62.     tad max
  63.     sma cla
  64.     jmp upda                /no, seen bigger
  65. /       yes, replace max
  66.     tad num
  67.     dca max
  68. /       update count of items
  69. upda,   isz items
  70.     nop
  71. /       loop back to get another number
  72.     jmp loop
  73. /       to quit, found the zero at end of input.
  74. quit,   jms i pfinis
  75.     hlt
  76. pisdig, isdig
  77. pfinis, finis
  78. pput1, put
  79. pget,   get
  80. / - - - - - - - - - - - - -
  81. /       readnm:
  82. /               entered when have read first digit
  83. /               of a number
  84. /               complete reading characters and combining them
  85. /               in to form a number
  86. readnm, 0
  87. / initialize number to value of digit character just read
  88.     tad nchar
  89.     dca num
  90. / now main loop of readnumber
  91. lrdnm,  jms i pget      / get next character
  92.     jms i pput1
  93.     jms i pisdig    / is it a digit
  94.     jmp i readnm     / no, so finished
  95.     dca nchar       / yes, so save it
  96. /       now need to multiply current number by 10 decimal
  97.     tad num
  98.     dca mpand
  99.     tad kd10
  100.     dca mplr
  101.     jms i pmult
  102.     tad prod
  103.     tad nchar
  104.     dca num
  105.     jmp lrdnm
  106. pmult,  mult
  107. *400
  108. /       Here we have a "shift and add" multiply routine.
  109. /
  110. /       Several simplifying assumptions:
  111. /       1) its intended only for positive numbers (so not
  112. /               going to worry about two's complement notation
  113. /               for integers).
  114. /       2) its intended only for small numbers (the product
  115. /               of two 12-bit numbers can require 24-bits,
  116. /               that would mean simulating a double length
  117. /               register which is practical but tiresome,
  118. /               so assume that will only be working with
  119. /               small numbers  and that product will be
  120. /               represented in 12-bits; no attempt made
  121. /               to detect overflow).
  122. /       3) note the crude way of passing the arguments (multiplier
  123. /               and multiplicand) via page 0 locations.
  124. mult,   0
  125.     cla cll
  126. /       first, set up a loop that will take us through the
  127. /       12 (decimal) bits of the words to be multiplied.
  128.     tad kd12
  129.     cia
  130.     dca cntr
  131.     tad mpand
  132.     dca temp
  133. /       zero the product
  134.     dca prod
  135. lmult,  cla cll
  136. /       isolate next bit of multiplier
  137.     tad mplr
  138.     rar
  139.     dca mplr
  140. /       test if a 1, for then need to add in another
  141. /       partial product
  142.     snl
  143.     jmp mult1       / that bit was a zero, so ignore
  144.     tad temp
  145.     tad prod
  146.     dca prod
  147. /       to mult1, now  shift temp left as considering next power
  148. /       of 2
  149. mult1,  cla cll
  150.     tad temp
  151.     ral
  152.     dca temp
  153. /       check if have finished the loop
  154.     isz cntr
  155.     jmp lmult
  156. emult,  jmp i mult
  157. /
  158. /       and here is a shift and subtract division routine,
  159. /       much the same limitations as in the multiply
  160. div,    0
  161.     cla cll
  162.     dca quot
  163.     dca rem
  164.     tad divdn
  165.     dca temp
  166.     tad kd12
  167.     cia
  168.     dca cntr
  169. ldiv,   cla cll
  170. /       move next bit into rem
  171.     tad temp
  172.     ral
  173.     dca temp
  174.     tad rem
  175.     ral
  176.     dca rem
  177. /       do subtraction,
  178.     tad divsr
  179.     cia
  180.     tad rem
  181. /       if result -ve, dont't set bit in quotient
  182.     spa
  183.     jmp div1
  184.     dca rem
  185. /       set a 1 in link
  186.     cll cml
  187.     jmp div2
  188. /       set a 0 in link
  189. div1,   cla cll
  190. /       now move bit into quotient
  191. div2,   tad quot
  192.     ral
  193.     dca quot
  194.     cla cll
  195. /       check if have finished loop
  196.     isz cntr
  197.     jmp ldiv
  198. ediv,   jmp i div
  199. *600
  200. /       Basic flag-driven i/o
  201. /
  202. /       get: read character from keyboard (normal wait for key stroke)
  203. /               and store in "char"
  204. get,    0
  205.     cla cll
  206. lget,   ksf
  207.     jmp lget
  208.     krb
  209.     dca char
  210.     jmp i get
  211. /       put: print character held in "char"
  212. /               (send the character, wait till notified that it got off
  213. /               safely)
  214. put,    0
  215.     cla cll
  216.     tad char
  217.     tls
  218. lput,   tsf
  219.     jmp lput
  220.     cla cll
  221.     jmp i put
  222. /
  223. /
  224. /       msg: print a message,
  225. /               on entry, acc should contain address of where
  226. /               some characters forming message are stored
  227. /               characters should be stored one per word
  228. /               and terminated by a word containing zero.
  229. msg,    0
  230.     dca mptr
  231. lmsg,   tad i mptr
  232.     sna
  233.     jmp i msg
  234.     dca char
  235.     jms put
  236.     isz mptr
  237.     nop
  238.     jmp lmsg
  239. mptr,    0
  240. /
  241. /
  242. /       isdig:
  243. /               check on character in "char"
  244. /               is it a digit, (i.e. >= '0', <='9'),
  245. /               if so return its numeric value in acc
  246. /                       and MODIFY RETURN address
  247. /
  248. /       so, will be returning to address immediately
  249. /               following call if its not a digit (and acc will be zero)
  250. /           but returning to address subsequent to that if it
  251. /               is a digit
  252. /
  253. isdig,  0
  254.     cla cll
  255.     tad zero
  256.     cia
  257.     tad char
  258.     spa cla
  259.     jmp i isdig             / its less than zero character
  260.     tad char
  261.     cia
  262.     tad nine
  263.     spa cla
  264.     jmp i isdig
  265. /       its a digit as in correct range of character values
  266. /       convert from character form to numeric
  267.     tad zero
  268.     cia
  269.     tad char
  270.     isz isdig
  271.     nop
  272.     jmp i isdig
  273. zero,   60              / value representing '0'
  274. nine,   71              / value representing '9'
  275. *1000
  276. /       finis:
  277. /               end marker in input encountered
  278. /
  279. /               put some newlines after the echoed input
  280. /               print message "# read : "
  281. /               then print item-count
  282. /               then print message representing couple of newlines
  283. /               then print "Largest : "
  284. /               print max
  285. /               print newlines
  286. finis,  0
  287.     tad amsg2
  288.     jms i pmsg
  289.     tad amsg1
  290.     jms i pmsg
  291. /       now print count
  292.     tad items
  293.     jms i pprnum
  294.     tad amsg2
  295.     jms i pmsg
  296.     tad amsg3
  297.     jms i pmsg
  298. /       largest value
  299.     tad max
  300.     jms i pprnum
  301.     tad amsg2
  302.     jms i pmsg
  303.     jmp i finis
  304. pprnum, prnum
  305. pmsg,   msg
  306. amsg1,  msg1
  307. amsg2,  msg2
  308. amsg3,  msg3
  309. msg1,   43              / #
  310.     40              / space
  311.     162             / r
  312.     145             / e
  313.     141             / a
  314.     144             / d
  315.     40
  316.     40
  317.     72              / :
  318.     40
  319.     0
  320. msg2,   15
  321.     15
  322.     12
  323.     0
  324. msg3,   114             / L
  325.     141             / a
  326.     162             / r
  327.     147             / g
  328.     145             / e
  329.     163             / s
  330.     164             / t
  331.     40
  332.     72
  333.     40
  334.     0
  335. *1200
  336. /       An oversimplified number printing routine
  337. /
  338. /       Its a bit specific to this problem,
  339. /       numbers can be assumed to be smallish positive
  340. /       values.
  341. /
  342. /       will divide by 1000 (decimal) and convert quotient
  343. /       to character representing number of thousands
  344. /
  345. /       take remainder, divide by 100 (decimal) print result
  346. /
  347. /       and so forth,
  348. /
  349. /
  350. prnum,  0
  351.     dca divdn
  352.   dca chflag
  353. / do the divides by 1000
  354.     tad kd1000
  355.     dca divsr
  356.     jms i pdiv
  357. / look at result, if zero don't want to print anything
  358.     tad quot
  359.     sna
  360.     jmp prn1  
  361. / but if have a thousands digit, then convert value to character form
  362. / and print
  363.     tad przero
  364.     dca char
  365.     jms i pput
  366. / and note that we have printed some characters
  367.   isz chflag
  368.   nop
  369. /
  370. / now deal with the hundreds
  371. prn1,   tad rem
  372.     dca divdn
  373.     tad kd100
  374.     dca divsr
  375.     jms i pdiv
  376. / again do we have a hundreds digit, or have we already printed a
  377. / thousands digit
  378. / if we've already printed a thousands digit, best print hundreds digit
  379. / even if its a zero
  380.   tad chflag
  381.   sza cla
  382.   jmp prn1c 
  383. / if no characters printed so far, again check to see if this is a zero
  384. / in which case will omit
  385.     tad quot
  386.     sna cla
  387.     jmp prn2
  388. / prn1c, convert hundreds digit to character form and print
  389. prn1c,    tad quot
  390.   tad przero
  391.     dca char
  392.     jms i pput
  393.   isz chflag
  394.   nop
  395. / deal with tens in like manner
  396. prn2,   tad rem
  397.     dca divdn
  398.     tad kd10
  399.     dca divsr
  400.     jms i pdiv
  401. / usual checks regarding printing of leading zeros
  402.   tad chflag
  403.   sza cla
  404.   jmp prn2c
  405.     tad quot
  406.     sna cla
  407.     jmp prn3
  408. prn2c,    tad quot
  409.   tad przero
  410.     dca char
  411.     jms i pput
  412. prn3,   tad rem
  413.     tad przero
  414.     dca char
  415.     jms i pput
  416.     jmp i prnum
  417. pput,  put
  418. pdiv,   div
  419. przero, 60
  420. chflag,0
  421. $
  422.  
  423.  
  424.