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 / BEEHIVE / GAMES / CRAM36.ARC / CRAM.DOC < prev    next >
Text File  |  1990-07-21  |  12KB  |  331 lines

  1.                         CRAM version 3.6
  2.  
  3.                    Written for Bondwell 14 by:
  4.                          Robert Johanson
  5.                          ph (02) 6021795
  6.                             08/05/87
  7.  
  8.   Originally written by Hardin Brothers (80 Micro 2/84:108-124)
  9.  
  10.  
  11. GAME OVERVIEW
  12.  
  13. CRAM is a rather simple game, which inspite of this simplicity is
  14. rather addictive and enjoyable to play.
  15.  
  16. To Play, use the arrow keys to move the cursor around the screen.
  17. As it moves,  the cursor leaves a trail behind it.  If the cursor
  18. runs into its trail,  or a wall,  the game ends. The score is the
  19. number of pixels successfully filled in. To add a little variety,
  20. there are some other modes of play.  One starts off with a number
  21. of  obstacles which must also be avoided.  The other  dynamically
  22. adds obstacles in random locations as the game progresses  (tough
  23. luck if it happens to be right in the way of the cursor!).
  24.  
  25. The  game opens with a title screen,  which includes the  current
  26. High  Score  Table (one for each level of  difficulty).  It  also
  27. plays a tune.  If you press <RETURN>, you will be asked to select
  28. the  difficulty level (1 - 9).  The game commenses with the  next
  29. key press.  If, like me, you get sick of having to press <RETURN>
  30. everytime,  you  may bypass that and select the difficulty  level
  31. directly  from the title screen.  Pressing ^C (that's <CTRL>  and
  32. <C> together) will return to CP/M, saving the high scores if they
  33. have  been updated.  Also at the title screen,  you may vary  the
  34. volume  of the sound by use of the UP or DOWN ARROWS.  Just  hold
  35. the arrow down until the desired volume is obtained.  This  sound
  36. level will be remembered for next time.
  37.  
  38. HIGH SCORES
  39.  
  40. In the simplest mode, the highest possible score is about 10,800.
  41. I  have personally obtained 7,500,  but have left the high  score
  42. table  blank so as not to discourage the young children (for whom
  43. this game would be more suited!).  When your score is  determined
  44. to  be  higher  than the previous high score for  that  level  of
  45. difficulty,  you will be asked to fill in your name, so that your
  46. feat will be remembered forever.  The name input routine uses the
  47. CP/M  editing that you will all be familiar with (if not,  have a
  48. look  at  the table on page 3-5 of the CP/M 3 User's  Guide  that
  49. came with the Bondwell).  The most useful to remember is that  ^W
  50. recalls any previous input, so you don't have to keep typing your
  51. name when you're running hot!
  52.  
  53. DISCLAIMER
  54.  
  55. CRAM.COM  will only run on a BONDWELL 14.  No  responsibility  is
  56. accepted  for any mishap related to the use of this program.  The
  57. program  has the ability to access disk files,  and therefore  if
  58. your copy is corrupted, has the ability to destroy.
  59.  
  60. If  you  have  a copy of CRC.COM,  run it.  A  result  of  11  21
  61. indicates a valid copy.
  62.  
  63. HISTORY
  64.  
  65. Cram first appeared to my knowledge as a simple BASIC program for
  66. the  TRS-80  in 80 Micro 8/82:234-239.  It was written by  Harden
  67. Brothers.  In  that issue,  it was described as being "simple  to
  68. play but hard to master,  in short a real frustrator! Playing one
  69. game of cram is like trying to eat just one potato  chip.  Betcha
  70. can't play just one!!".
  71.  
  72. As an encore, Harden Brothers used similar game strategies for an
  73. assembly  language tutorial program which he titled CRAM  2.  (80
  74. Micro 2/84:108-124).
  75.  
  76. As  a  learning exercise,  I decided to adapt the program to  the
  77. Bondwell  14 hardware/software environment.  It turned out to  be
  78. relatively  easy,  as  most ROM calls for the TRS-80 have a  CP/M
  79. equivalent,  or in any event were not difficult to emulate. Also,
  80. both  computers have a memory mapped display,  and so most of the
  81. game logic worked as published.
  82.  
  83. CRAM version 3.0
  84.      This was the first result.  It had sound for the title page,
  85. and  played at the character level (as did cram 2).  It also  had
  86. some  very  bad points.  As the block graphics character  on  the
  87. Bondwell is 3 pixels high and only 2 pixels wide, the game played
  88. faster  if  you  were  on a vertical run than if you  were  on  a
  89. horizontal run. It also got rather boring to play after a while.
  90.  
  91. CRAM version 3.1
  92.      This  was  the  first  major  departure  from  the  original
  93. program. It went to pixel level graphics.
  94.  
  95. Cram version 3.3
  96.      This used a different mode of play - as the game progressed,
  97. random  pixel obstacles were turned on.  This was an  attempt  to
  98. keep  the players on their toes.  It suffered from the problem of
  99. being  jerky - I was using simple arithmetic to scale the  random
  100. numbers,  which  was actually causing a random pause everytime  a
  101. random number was scaled.
  102.  
  103. Cram version 3.4
  104.      This  got  around  the problems of  3.3  by  generating  yet
  105. another mode of play.  At the beginning of the game,  a number of
  106. pixel obstacles were turned on.  The higher the difficulty level,
  107. the more pixels were turned on. It was when I had this version up
  108. and running that my harshest critic (my dear wife) poked her head
  109. into My Room,  and said: "So where's the high score table". So it
  110. ended up with one of those.
  111.  
  112. Cram version 3.5
  113.      This was to be the final version. I was starting to get sick
  114. of  this  admittedly trivial game.  I used a much  faster  random
  115. number  generator,  and  instead of scaling  the  result,  simply
  116. discarded any value outside the range of the screen.  It had  the
  117. works  - 3  different  modes of play,  all with  three  different
  118. speeds.  A  highest  score  for each of  these  nine  levels  was
  119. maintained  in  a  separate file.  The program also  developed  a
  120. snigger everytime you crashed.
  121.  
  122. Cram version 3.6
  123.      As I was intending the program to go onto my computer  users
  124. group BBS,  it bothered me that the program required two files to
  125. be  downloaded for it to work successfully.  I then came up  with
  126. the  idea  of using the first two sectors of the  actual  program
  127. file to store the high scores.  In addition,  some people who had
  128. tried  the  game  were  bothered by the sound,  so  I  added  the
  129. variable  volume.  This is stored in exactly the same way as  the
  130. high  scores,  so whatever level is present when the  program  is
  131. finished  will  be maintained next time the program is  run.  The
  132. volume ranges from completely off to very loud. I remain bothered
  133. by  the fact that the user cannot rename the program file without
  134. either reassembling or patching the new name, but tough!
  135.  
  136.  
  137. TECHNICAL ASPECTS
  138.  
  139. Pixel level graphics
  140.      I  used some of the ideas developed by Wilfred Kazoks  (Your
  141. Computer Feb 86 pp 72-73) for handling the individual pixels, the
  142. major difference being that his routines were in Turbo Pascal and
  143. mine  are in Z80 machine code.  There is also a major  conceptual
  144. difference.  He  viewed the screen as a 2  dimensional  cartesian
  145. plane, with points (x,y). (0,0) was at the top left corner of the
  146. screen,  and  (159,74)  was the bottom right hand corner  of  the
  147. screen.  I  chose  to  view  the screen as  a  contiguous  block,
  148. completely analogous to the way CRAM was able to view the  screen
  149. at  the  character level.  Pixel # 0 was the top  left,  Pixel  #
  150. 11,999  was  the bottom right.  For any pixel on the screen  (#n)
  151. (excluding  those  on  the  boundaries),   there  was  a   simple
  152. relationship between adjoining pixels:
  153.  
  154.                          n-160
  155.  
  156.                     n-1    n    n+1
  157.  
  158.                          n+160
  159.  
  160. The  two methods for pixel numbering can be easily interconverted
  161. using the formulae:
  162.  
  163. for pixel (x,y), pixel # = x + (y*160)
  164.  
  165. for pixel # n, x = n MOD 160
  166.  
  167.                y = INT(n/160)
  168.  
  169. Using  the pixel #,  it was possible to retain the original logic
  170. of the high level subroutines.
  171.  
  172. The pixel level subroutines used by CRAM are called MEMPOS, MASK,
  173. RANGE, SET, and POINT, and are based on the  folowing  formulae:
  174.  
  175. Memory Address of screen character containing pixel # n:
  176.  
  177. Address = 0F800H + (80 * INT(n/480)) + INT((n MOD 160)/2)
  178.  
  179. Bit Mask required to deal with a given pixel #n contained in  the
  180. screen character:
  181.  
  182. If n is even, C = 1. If n is odd, C = 0.
  183.  
  184. R = 2*((n MOD 480) DIV 160)
  185.   = 0, 2 or 4
  186.  
  187. Pixel bit = R + C             1 0
  188.           = 0 -> 5   -->      3 2
  189.                               5 4
  190.  
  191. The bit mask is then generated by setting the pixel bit.
  192. eg:
  193.  Pixel bit       Mask
  194.      1         00000001
  195.      4         00001000
  196.  
  197. To SET pixel,       newchar = oldchar OR mask
  198.  
  199. To RESET pixel,     newchar = oldchar XOR mask
  200.  
  201. (The  subroutine RESET was not required for CRAM,  but is similar
  202. to SET, and shares common code)
  203.  
  204. If a given pixel is set,
  205.                     (oldchar AND mask) <> 0
  206.  
  207. If any character to be manipulated is > 080H,  then it must first
  208. be adjusted:
  209.                     oldchar = oldchar XOR 0BFH
  210.  
  211. Similarly,  if any manipulation produces a character > 01FH, then
  212. it must be adjusted before being stored back in screen memory:
  213.  
  214.                     newchar = newchar XOR 0BFH
  215.  
  216.  
  217.  
  218. Sound
  219.      When I bought my Bondwell, I envisaged the voice synthesizer
  220. as being a built in speech processor chip, with perhaps a text to
  221. allophone  convertor chip alongside!  It would ideally have  been
  222. set  up as a CP/M physical device to which programs could  direct
  223. text to be spoken.  Of course,  the salesman didn't go out of his
  224. way  to  disillusion  me.
  225.  
  226.      The  Bondwell  does  not  in fact have a  a  built-in  voice
  227. synthesizer as we were all wrongly informed,  but has a  built-in
  228. digital  to  analogue  converter  which is wired up  to  a  small
  229. amplifier.  With fairly complex software,  this can be driven  to
  230. sound like speech.  It is quite a simple matter to get the output
  231. to  sound  like  various notes.
  232.  
  233.      The  audio register is located at I/O port 50H.  Any  number
  234. output to this location is latched to the DAC. If you alternately
  235. output  a  high  number and a low number,  the  signal  from  the
  236. amplifier will be a note with a pitch determined by the speed  of
  237. the alternation,  and a volume determined by the magnitude of the
  238. difference between the two numbers.
  239.  
  240.      The  sound  routine that I have used is almost identical  to
  241. the many sound generating programs published for the TRS-80,  and
  242. suffers from similar disadvantages. It is quite adequate for game
  243. sound effects,  but is definately not Hi-Fi quality.  It produces
  244. clicks every now and then which I assume are the result of sudden
  245. discontinuities. I tried a number of complex strategies to reduce
  246. this,  but none totally eliminated the effect,  so I reverted  to
  247. the  original simple routine.  Also,  if you use the routines  to
  248. play  a  tune,  you will find that the duration of each  note  is
  249. influenced  by  the  pitch.  The  obvious solution  to  all  such
  250. problems is to get a proper games computer (like a Commodore 128)
  251. - but for me, the Bondwell is quite good enough!
  252.  
  253.      The 'snigger' at the end of each game is the result of using
  254. the contents of the memory-refresh register (effectively a random
  255. number 0-127) as the pitch value.
  256.  
  257.  
  258. Screen Flash
  259.      The  flash  routine  depends  on the fact  that  all  screen
  260. characters can be inverted by toggling Bit 7.
  261.  
  262.      One  problem  with the screen flash is that there is no  way
  263. (that  I  know  of) to coordinate screen memory access  with  the
  264. video blanking period. This results in an annoying flicker as the
  265. screen is being inverted.
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331. ^[P^[x^A