home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / kaypro / kpgrafic.txt < prev    next >
Text File  |  1994-07-13  |  23KB  |  436 lines

  1. =====================================================================
  2.  
  3.                       GRAPHICS ON CP/M KAYPROS
  4.  
  5.                           by Peter Donnelly
  6.                      964 Heywood Ave., Apt. 220
  7.                            Victoria, B.C.
  8.                            Canada V8V 2Y5
  9.  
  10.                             January 1986
  11.  
  12. =====================================================================
  13.  
  14.      The graphics capabilities of the Kaypro are generally not well 
  15. documented; indeed, buyers of the new Kaypro 1 might read the user's 
  16. guide from cover to cover without obtaining the slightest hint that 
  17. their machine has graphics at all. 
  18.       The purpose of this article is to assemble some facts so that 
  19. the reader can use the Kaypro graphics fully - at least, as fully as 
  20. can be done without resorting to machine language. As far as I know, 
  21. what is said here applies to all CP/M Kaypros manufactured since 
  22. 1984, and to earlier model 10s.
  23.  
  24. 1. ESCAPE SEQUENCES
  25.  
  26.      Some screen functions are handled through escape sequences: that 
  27. is, a string consisting of the ^[ character plus one or more other 
  28. characters is sent to the screen. In MBASIC the sequence "ESCape, B, 
  29. 0" (as it appears in the Kaypro manual) would take the form:
  30.  
  31.      PRINT CHR$(27) + "B0"; 
  32. or   PRINT CHR$(27); "B0";
  33.  
  34. When variable integers form part of an escape sequence they are 
  35. sent in the form of the character having that ASCII decimal number. 
  36. For example, to position the cursor at row R, column C, where the 
  37. general form of the sequence is "ESC, =, row + 32, col + 32", you 
  38. would use this command:
  39.  
  40.      PRINT CHR$(27) + "=" + CHR$(R + 32) + CHR$(C + 32);
  41.  
  42. Escape sequences can also be sent from the system prompt by pressing 
  43. the ESC key followed by the appropriate letter keys, then RETURN. The 
  44. system will echo the command to the screen, followed by a question 
  45. mark, and as a result the escape sequence will take effect. This is 
  46. handy when you break out of a program unexpectedly and find that your 
  47. cursor has disappeared or that everything is still in inverse video, 
  48. and you want to restore things to normal without a cold boot. (It's 
  49. also handy - though this has nothing to do with graphics - for 
  50. sending escape sequences to set up a printer. Just add ^P to the 
  51. sequence.)
  52.  
  53. 2. CONTROL CHARACTERS
  54.  
  55.      Certain control characters, when ordered to be printed to the 
  56. CRT, will manipulate screen output; these are summarized in the 
  57. appendix. They can be sent by a program, or like escape sequences 
  58. they can be entered at the system prompt. For example, to clear the 
  59. screen at the prompt just type CTRL-Z RETURN.
  60.      Cursor movement through control characters is limited. You 
  61. cannot backspace, for example, over an empty part of the screen; 
  62. something has to have been printed there, if only spaces. 
  63.  
  64. 3. CURSOR ADDRESSING
  65.  
  66.      The cursor can be sent to any point on the screen through the 
  67. escape sequence mentioned in paragraph 1 above. 
  68.      MBASIC has a peculiarity worth mentioning. Because there is a 
  69. limit on how much it will handle as a string without a carriage 
  70. return, you cannot just keep sending the cursor from one point to 
  71. another with an input loop; if you do, MBASIC will respond by 
  72. spitting out odd characters and line feeds. The solution is to insert 
  73. into the loop another command like PRINT CHR$(30) (with no 
  74. semicolon).
  75.      Remember, every time the cursor prints a character it will 
  76. advance. Thus the last column of row 24 is effectively off-limits if 
  77. you want to preserve a whole screenful of graphics; when you print 
  78. something there the cursor will try to drop down and thus force 
  79. everything to scroll up a line.
  80.  
  81. 4. STATUS LINE
  82.  
  83.      The so-called status line is the 25th line of the screen, and it 
  84. is only accessible through direct cursor addressing. If you turn on 
  85. "status line preservation," anything printed on the line will remain 
  86. there despite whatever happens on the screen above, whether scrolling 
  87. or clearing.
  88.  
  89. 5. SPECIAL EFFECTS
  90.  
  91.      The four special video effects - inverse video, reduced 
  92. intensity, blinking, and underlining - can be toggled on and off with 
  93. escape sequences and can be used in any combination. They affect only 
  94. what is printed while they are toggled on, and they apply to all 
  95. characters, whether keyboard characters or graphics.
  96.      The Kaypro has no true highlighting; the only way the effect can 
  97. be emulated is to print most things at half-intensity and the 
  98. "highlighted" strings at normal intensity. But of course this makes 
  99. it necessary for the user to adjust his screen brightness control. 
  100.      My own view is that half-intensity should never be used for text 
  101. except in combination with inverse video. A number of programs, 
  102. including a few commercial ones, use a combination of normal and 
  103. half-intensity text to highlight key letters in menus and so on, and 
  104. the result is less than satisfactory. Most people, I'm sure, have 
  105. their screens adjusted so that normal text is comfortably readable, 
  106. and at this setting half-intensity uninverted text almost disappears. 
  107. (Particularly puzzling is TURBO PASCAL's installation for "Kaypro 
  108. with highlight," where what ought to be highlighted is in fact 
  109. printed at half-intensity; and if you turn your screen up to make 
  110. these parts reasonably visible, everything else including the text on 
  111. the editing screen becomes uncomfortably bright. While it's possible 
  112. to modify this feature, the installation program doesn't allow a long 
  113. enough escape sequence to set highlighting to half-intensity AND 
  114. inverse.)
  115.  
  116. 6. THE ASCII GRAPHICS
  117.  
  118. (A.) In addition to the ordinary keyboard characters, the Kaypro 
  119. terminal is capable of displaying a number of graphics characters 
  120. each occupying one "cell," the screen being made up of 25 by 80 such 
  121. cells. All post-1984 machines have what might be called "block 
  122. graphics" associated with the upper part of the ASCII set. Any of 
  123. these graphics can be displayed by a simple command to send the 
  124. character of the appropriate number to the screen, e.g. PRINT 
  125. CHR$(255). 
  126.      The characters are made up of eight pixels or tiny squares, each 
  127. either green ("on") or black ("off"). These graphics can be seen as 
  128. eight-bit binaries where the upper right corner is the least 
  129. significant bit, the upper left the next most significant, and so on 
  130. to the lower left corner, which represents the most significant bit, 
  131. or 2 to the 7th power. A cell may be mapped as follows, with the 
  132. numbers representing the amount added to the bit value of the 
  133. character if that pixel is "on":
  134.  
  135.                           -----------
  136.                           |  2 |  1 |
  137.                           -----------
  138.                           |  8 |  4 |
  139.                           -----------
  140.                           | 32 | 16 |
  141.                           -----------
  142.                           |128 | 64 |
  143.                           -----------
  144.  
  145.      The first of the graphics characters is #128, a blank space, 
  146. with a bit value of 0; the last is #255, which is lacking only the 
  147. lower left corner and so has a value of the sum of the first 7 powers 
  148. of 2, or 127. It is thus possible to derive the form of any of these 
  149. graphics characters from its ASCII number, the bit value being the 
  150. ASCII number minus 128. 
  151.      Having reached the upper limit of the ASCII set without finding 
  152. any characters which have the lower left corner filled in, we now 
  153. have to go into inverse video, where we encounter another 128 
  154. symbols, each the negative image of its counterpart and thus having 
  155. the inverse (or ones complement) bit image; #128, for example, binary 
  156. 0000 0000, now becomes a full block whose on-bits, 1111 1111, total 
  157. 255. The bit value of each inverse character is 383 minus its ASCII 
  158. number.
  159.      The state of any pixel in a given graphics character can be 
  160. determined by an arithmetic "and" test. Let "y" be the bit value of 
  161. the character as determined from its ASCII number and the state of 
  162. inverse video, let "x" be the power of 2 corresponding to the 
  163. position of the pixel in question, and let "pixelon" be a Boolean 
  164. returning "true" if the pixel is illuminated. The statement in Pascal 
  165. would then take the form:
  166.  
  167.      if (x and y) > 0 then pixelon else not pixelon;
  168.  
  169. This determination is the key to writing a routine to translate the 
  170. screen graphics into terms your printer can understand. (See section 
  171. 11 below.)
  172.  
  173. (B.)  The Kaypro video controller is capable of displaying a number 
  174. of other graphics including thin horizontal, vertical, and diagonal 
  175. lines, triangular blocks, and mathematical symbols. Each of these 
  176. graphics is, again, associated with an ASCII number, this time in the 
  177. range 0-31. (One of the triangles also shows up mysteriously as #127, 
  178. the DEL character.) 
  179.      Unfortunately, these graphics won't always appear on demand. To 
  180. begin with, your programming language may interpret a character in 
  181. this range as a control code. MBASIC, for example, always treats 
  182. CHR$(9) as a horizontal tab. (Ever notice that you can't use it as 
  183. part of an escape sequence in an MBASIC printer set-up?) Second, the 
  184. operating system itself may also insist on treating certain 
  185. characters as control codes (e.g. #7 as a bell, #13 as a carriage 
  186. return). 
  187.      In the Kaypros running CP/M 2.2u it appears that ALL characters 
  188. in the lower range are scooped up before reaching the screen, even 
  189. those that have no active control function. A command like PRINT 
  190. CHR$(1) produces nothing at all.
  191.      On "older newer" models like my '84 2X it's possible to print 20 
  192. or so of these low-range characters with simple "write" commands in 
  193. Pascal, and most of these are also accessible through MBASIC. I can 
  194. also conjure them up by typing the matching control code at the 
  195. system prompt and pressing RETURN. But there's no way to coax out the 
  196. graphics that lie behind active control codes like ^G, ^J, ^M, and 
  197. ^Z.
  198.      It is a frustrating situation for the programmer. One could have 
  199. hoped for a simple escape sequence that would somehow disable the 
  200. control codes and allow the full potential of the video chip to be 
  201. exploited. However, if such a sequence exists it is a well-kept 
  202. secret. Consequently if you want to see the full menu of Kaypro 
  203. graphics, or use them, you'll have to turn to the KBOARD segment of 
  204. the commercial program REMBRANDT (by DG Systems), which accesses them 
  205. by doing an end-run around the BIOS and taking direct control of the 
  206. video chip. Where the capable author of that program has gone I dare 
  207. say not many will follow.
  208.  
  209.  
  210. 7. PIXEL GRAPHICS
  211.  
  212.      Since each block graphics character is made up of 4 rows and 2 
  213. columns of pixels, the screen may be seen as an array of 100 by 160 
  214. pixels, and with the appropriate escape sequence we can fill in any 
  215. individual pixel on the screen. 
  216.      The terminal is not actually printing every pixel location 
  217. independently; it's really just assigning an ASCII block graphic to 
  218. each cell of eight pixel locations and changing it whenever a pixel 
  219. is added or taken away. For the programmer this doesn't make a great 
  220. deal of difference, but you will notice that a pixel is printed in 
  221. half-intensity when it is plunked down among half-intensity 
  222. neighbors. You will also find that pixels can't be printed in a cell 
  223. where there is already a keyboard character, even if there wouldn't 
  224. be any actual overlap.
  225.  
  226. 8. VIDEO MODE
  227.  
  228.      So far all I've been able to discover about video mode is that 
  229. when it's turned on you must print a graphics character twice, or two 
  230. graphics characters in succession, before anything appears on the 
  231. screen. Then what you see is the first character printed normally, 
  232. and the second character superimposed with the bits "swapped"; i.e. 
  233. the value of the least significant bit is traded for the most 
  234. significant, and so on. Thus #129 (upper right bit "on") and #255 
  235. (lower left bit "off") can be printed together to make a solid block, 
  236. and indeed all the block graphics with the high bit (lower left 
  237. corner) "on" can be generated by superimposing a "swapped" #129 on 
  238. the ASCII characters from #128 to #255. This is another way of doing 
  239. what one can do with inverse video; whether it has any advantages I 
  240. cannot say.
  241.  
  242. 9. THE TYPE COMMAND
  243.  
  244.      The TYPE command will read any text file, and text files can 
  245. include graphics and escape sequences. 
  246.      Most word-processing programs won't normally allow the insertion 
  247. of non-keyboard characters into text. You can sneak them in with 
  248. Xpert Software's XTRAKEY, which allows you to turn any keyboard 
  249. character into a block graphic by setting the high bit "on," i.e. 
  250. adding 128 to the ASCII number. The graphics won't show up within the 
  251. word-processing program, but they will be TYPEable. (WordStar users 
  252. must go into non-document mode to prepare TYPEable files, since 
  253. document mode uses the high bit for its own purposes.) 
  254.      For portability, TYPEable files and indeed any graphics routines 
  255. shouldn't include characters that might not show up on another 
  256. machine such as the Kaypro 1 - namely the phantom graphics from the 
  257. lower part of the ASCII set. On such machines these characters will 
  258. not even show up as spaces; rather nothing at all will be printed, 
  259. and so the alignment of columns will be thrown out of whack.
  260.  
  261. 10. GRAPHICS UNDER ZCPR
  262.  
  263.      The alternative operating system ZCPR disables the Kaypro 
  264. graphics, and while there is a command to re-enable them, helpful 
  265. programmers can save the user the trouble by poking the byte FF into 
  266. location 004F at the beginning of any graphics routine, and restoring 
  267. the value 00 at the end. There appears to be no conflict with CP/M.
  268.  
  269. 11. PRINTING GRAPHICS
  270.  
  271.      It would be nice if you could print any graphics character just 
  272. by sending the appropriate ASCII number to the printer, but 
  273. unfortunately this is not the case. Most dot-matrix printers have 
  274. italics and international characters associated with the upper half 
  275. of the ASCII set; if there is an alternative graphics set, it will be 
  276. for the IBM system. 
  277.      Consequently, to print the Kaypro block graphics you must put 
  278. the printer in "graphics mode" and define which pins are to be fired 
  279. at each impact. This means breaking the graphic character into its 
  280. two component columns and examining each of these for "on" pixels, 
  281. then converting the bit-sum of the column into the byte required by 
  282. your printer so that it knows which pins to fire as it prints that 
  283. column. How many pins you will use for each pixel, and how many times 
  284. they will be fired, will depend on the size and proportions of the 
  285. desired result. For example, using standard density graphics on the 
  286. Epson - 480 dots per line - to reproduce the full width of the screen 
  287. (160 pixel columns) as the full width of the paper, the pins would be 
  288. fired 3 times for every column, and 2 of the 8 pins would be used for 
  289. each "on" pixel.
  290.      As for the graphics in the lower part of the ASCII set, they 
  291. would presumably have to be individually designed as "downloadable 
  292. characters" - a large task - and then downloaded to the printer to be 
  293. printed in text mode. 
  294.  
  295. 12. AVAILABLE SOFTWARE
  296.  
  297.      At least three commercial and two non-commercial drawing 
  298. programs are now available for the Kaypro. I will describe briefly 
  299. those I've had experience with. 
  300.  
  301. SCS-DRAW (Second City Software, Box 267960, Chicago IL 60626)
  302.  
  303.      A very likeable program for designing images to be printed to 
  304. paper. Drawing is done in black on a large green canvas of 336 x 362 
  305. pixels, a portion of which is displayed in a window that occupies 
  306. about two-thirds of the screen, the rest being taken up by a menu and 
  307. window-position indicator. While inversion is used to good effect 
  308. (you can draw a line that shows black against green and green against 
  309. black), every pixel is simply either on or off, and hence there are 
  310. no real video effects like half-intensity or blinking. A nice touch 
  311. is that you can draw or erase a single pixel without leaving "move" 
  312. status, saving much confusion. Text can be added in a choice of 
  313. rudimentary fonts and enlarged to as much as banner size. There are 
  314. many other features including cut-and-paste, merging of images in 
  315. various ways, automatic drawing of lines, circles, and rectangles, 
  316. easy block erase, rapid cursor moves, pattern-fill, and on-screen 
  317. enlargement in two separate dimensions. Options at the printing stage 
  318. enable further enlargement, flipping, rotating, and repeating of 
  319. images. The program is helpful, quick, and easy to use throughout. 
  320.  
  321. REMBRANDT (DG Systems, 22458 Ventura Bvd., Ste. E, Woodland Hills, CA 
  322. 91364)
  323.  
  324.      REMBRANDT is both screen- and printer-oriented, a good all-round 
  325. program that is the only one to exploit all the graphics capabilities 
  326. of the Kaypro. Drawing is done with the entire ASCII set - all 256 
  327. characters - on a full-screen canvas. You have 10 graphics characters 
  328. on your "palette" at one time, choosing one by striking a number key 
  329. - painting by numbers, as it were. Ordinary keyboard characters can 
  330. be typed in anytime. Access to the fine-line graphics makes possible 
  331. much more varied effects than the block graphics allow, such as 
  332. graphs that look like they're drawn on graph paper. Screens can be 
  333. chained together for presentation in a "slide-show" format with 
  334. various effects such as fade-in. Auxiliary programs will prepare 
  335. various types of graphs automatically from entered data. REMBRANDT 
  336. puts out good printed images, and reproduces half-intensity on paper 
  337. as well as on the screen, but as a printing program it is less 
  338. flexible than SCS-DRAW; nor is the overall presentation as attractive 
  339. and fast-moving. 
  340.  
  341. DDRAW (non-commercial; available from many sources)
  342.  
  343.      This pioneer program uses pixel drawing and keyboard characters 
  344. on a full-screen canvas. Features include automatic drawing of 
  345. circles, lines, and rectangles and filling of enclosed areas. All the 
  346. video effects are available; they are added to blocks after they have 
  347. been drawn. The cut-and-paste routine is limited to smallish areas 
  348. with no text, but you can store up to four details (called 
  349. subpictures) in memory to be shuffled about at will. An optional 
  350. status line keeps track of the cursor position and the drawing/ 
  351. erasing/moving status, and there is a separate screen giving a menu 
  352. of commands. Files can be saved in TYPEable format, something that is 
  353. not true of either of the commercial programs reviewed. DDRAW fully 
  354. supports the Gemini printer; my Panasonic (a machine similar to the 
  355. Epson) will print the graphics small but not text and graphics 
  356. combined.
  357.  
  358. ARTIE (non-commercial; if all else fails, send me a postal money 
  359. order for $5 at the above address)
  360.  
  361.      My own entry into the field. ARTIE uses the ASCII graphics, 
  362. including (on machines where they are TYPEable) some from the lower 
  363. range. Graphics can be chosen from a palette above the canvas or from 
  364. a separate menu. You can cover the canvas more quickly than with 
  365. DDRAW, but that program is better for detailed sketching. (DDRAW 
  366. files can be read into ARTIE screens, so it's possible to have the 
  367. best of both programs.) The canvas is only 20 lines but an auxiliary 
  368. program links two files to make a 24-line display. Details can be cut 
  369. and moved or written to file, then read back into the screen with 
  370. various video effects added. Rapid fill and empty functions; disk 
  371. logging and directory of relevant files; five help screens as well as 
  372. status-line reminders; a toggle for the keyboard clicker - ARTIE is 
  373. definitely built for comfort, which is why it weighs in at 50k or so 
  374. on disk. So far the Panasonic and Diablo/Juki printers are supported, 
  375. but the emphasis is on preparing screen displays.
  376.  
  377.      By the way, the Juki printer that has been distributed with 
  378. many Kaypros is supported by SCS-DRAW and REMBRANDT as well as ARTIE. 
  379. The process may be painfully slow, noisy, and ribbon-consuming, but 
  380. your daisy-wheel printer CAN produce some very good graphics. 
  381.  
  382. =====================================================================
  383.  
  384.                               APPENDIX 
  385.  
  386.          ESCAPE SEQUENCES, CONTROL CODES, AND PORT COMMANDS
  387.  
  388. Cursor left                        ^H    ASCII 7 decimal
  389. Cursor right                       ^L         12
  390. Cursor down                        ^J         10
  391. Cursor up                          ^K         11
  392. Erase from cursor to end of screen ^W         23
  393. Erase from cursor to end of line   ^X         24
  394. Clear screen                       ^Z         26
  395.   (also cancels special effects)
  396. Home cursor                        ^^         30
  397.  
  398. The following are all preceded by ESC, character #27:
  399.  
  400. Insert line                        E     | contrary to  
  401. Delete line                        R     | manuals 
  402. Inverse video on/off               B0/C0
  403. Reduced intensity on/off           B1/C1
  404. Blinking on/off                    B2/C2
  405. Underlining on/off                 B3/C3
  406. Cursor visible/invisible           B4/C4
  407. Video mode on/off                  B5/C5   
  408. Remember/recover cursor position   B6/C6
  409. Status line preservation on/off    B7/C7
  410. Cursor address                     =, row + 32, col + 32
  411.  
  412. Where row and col refer to the matrix of 100 by 160:
  413.  
  414. Print pixel            *, row + 31, col + 31
  415. Erase pixel            #32 (space), row + 31, col + 31
  416. Print line             L, row1 + 31, col1 + 31, row2 + 31, col2 + 31
  417. Erase line             D, row1 + 31, col1 + 31, row2 + 31, col2 + 31
  418.  
  419. The following two commands are shown in their MBASIC format:
  420.  
  421. Stop cursor blinking     OUT 28, 10: OUT 29, 0
  422. Turn cursor to underline OUT 28, 10: OUT 29, 15* 
  423.                          (* or 79 or 111 for blink rate)
  424.  
  425. In Pascal these commands would take the form port[28]:= 10; etc.
  426.  
  427. =====================================================================
  428.  
  429.                              POSTSCRIPT 
  430.  
  431. I would like to offer my thanks to those who have shared their 
  432. knowledge of this somewhat obscure subject; I will not name them, 
  433. because the mistakes here are all my own. Corrections and additions 
  434. will be most welcome at the above address.
  435.  
  436. =====================================================================