home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / basic / mbasic.lst < prev    next >
File List  |  1984-04-17  |  5KB  |  102 lines

  1.  
  2. Date: Tuesday, 10 April 1984  20:59-MST
  3. From: ABN.ISCAMS at Usc-Isid.ARPA
  4. To:   INFO-CPM at Amsaa.ARPA
  5. Re:   MBASIC Printer/Console Switching
  6.  
  7. How often have you wished you could find an easy way to switch your
  8. BASIC to direct PRINT statements to the printer or the console as
  9. you or the user desires, without the typical
  10.  
  11. IF HARDCOPY THEN LPRINT "FOOBAR" ELSE PRINT "FOOBAR"
  12.  
  13. This sure can get tiresome - I have some programs that permit the user
  14. to elect screen display and/or printer display, and perhaps 1/3
  15. of the code is that sort of redundancy!
  16.  
  17. The one-page article in "Programmer's Guide to CP/M" (Creative
  18. Computing Press, Morris Plains NJ, 1982), entitled "Choosing Between
  19. CRT & Printer Output" gave me hope, but the bloody Sample Program
  20. just wouldn't work!
  21.  
  22. I suspect some problems with the POKEing and PEEKing being limited to
  23. one byte and returning an integer between -32768 and +32768.  I KNOW
  24. the BASIC-80 manual says the Extended and Disk versions permit POKEing
  25. and PEEKing integers in the range 0 to 65536, but damned if mine will!
  26. Try POKEing a large value (like 60000 or so) anywhere, and then PEEK at
  27. the same place (if you get that far), and you'll see what I mean.
  28.  
  29. The following little piece of code can be patched into your BASIC
  30. programs.  It'll find YOUR Console Out and List Out jumps in your
  31. BIOS jump table (using the BIOS jump table location found at 0001 and
  32. 0002 of CP/M), and will plug them in to the appropriate place in BASIC.
  33.  
  34. I got this idea from CPM-PERT.BAS, out at SIMTEL20's Public Domain
  35. library in MICRO:<CPM.BASIC>.  Unfortunately the location of the Call
  36. to Console Out for Microsoft BASIC-80 Version 5.21 is different from my
  37. Version 5.1.  However both values are given below.
  38.  
  39. If it doesn't work, use DDT's T(race) utility to track through your
  40. MBASIC as it initializes its BIOS calls.  It takes about 50 or so steps,
  41. but eventually you'll see a series of moving bytes from high memory (in
  42. my system the EA00h area) into D and E , XCHGing them, and SPHLing them
  43. to a serious of locations in the 4100h area.  The LAST one of this series
  44. of very similar storage moves will be the storing of LIST (list device out),
  45. and the NEXT to last one will be the CONOUT (console out) jump.  Watch
  46. where BASIC stores that BIOS CONOUT location -- that's the location of
  47. BASIC's CONOUT call.  (Sorry - a little hard to explain DDT's T(race)
  48. function; you gotta see it to believe it!)  Never had much use for the T
  49. function, but found it handy this time.
  50.  
  51. If you know the location of your BIOS jump table's jumps to CONOUT and
  52. LIST, that alone won't be enough.  BASIC doesn't use the location of
  53. the JMP in the BIOS jump table itself, but the address of that JMP!
  54. Saves one JMP, but kind of tricky unless you know what to expect!
  55. I didn't mess with that with my PEEKs and POKEs - just used the actual
  56. JMP in the jump table itself.
  57.  
  58. Have fun - hope this works OK for you.  It sure is saving me a lot of
  59. redundant BASIC code, and the sheer bloody elegance of BASIC looking
  60. at CP/M, and then poking itself a new belly button really tickles me!
  61.  
  62.  
  63. David Kirschbaum, Toad Hall
  64. 7573 Jennings Lane, Fayetteville NC 28303  (919)868-3471/396-6862
  65. ARPANet ABN.ISCAMS@USC-ISID
  66.  
  67.  
  68. 130 '== Locate CONOUT (console out) and LIST in CP/M BIOS Jump Table ==
  69. 140 '
  70. 150 ' Location of warm boot in BIOS jump table can be found at bytes 0001
  71. 160 ' (Least Significant Byte, LSB), and 0002 (Most Significant Byte, MSB).
  72. 170 '
  73. 180 COUT1% = PEEK(1) : COUT2% = PEEK(2)    'get LSB and MSB of warm boot jump
  74. 190 COUT1% = COUT1% + 9    'bump up 9 bytes from warm boot to COUT
  75. 200   IF COUT1% < 256 THEN 220        'no need to increase MSB
  76. 210 COUT2% = COUT2% + 256 : COUT1% = COUT1% - 256    'inx MSB, dx LSB
  77. 220 LST2% = COUT2% : LST1% = COUT1% + 3    'bump up 3 bytes from COUT to LIST
  78. 230   IF LST1% < 256 THEN 280        'no need to increase MSB
  79. 240 LST2% = LST2% + 256 : LST1% = LST1% - 256        'inx MSB, dx LSB
  80. 290 CONOUT% = &H41B8    'Loc in MBASIC 5.1 of call to CONOUT
  81. 300 '             (value for MBASIC 5.21 is &H41E4)
  82.  
  83.                 - - - - - - - -
  84.            Here's where you switch the printer/console display
  85.  
  86. 390 PRINT "Do you want a HARD-COPY record?  (Y/N):  ";
  87. 400 HC$=INKEY$:IF LEN(HC$)<1 THEN 400 ELSE PRINT HC$
  88. 410   IF HC$<>"Y" AND HC$<>"N" THEN PRINT "ERROR!  Try again.":GOTO 390
  89.  
  90.                 - - - - - - - -
  91.        Here's where you switch BASIC's CALL to CONOUT to the LIST device
  92.  
  93. 620   IF HC$<>"Y" THEN 660
  94. 630 POKE CONOUT%, LST1% : POKE CONOUT%+1, LST2%        'Turn printer on
  95. 640 PRINT "This should be a hardcopy printout on your printer."
  96. 650 POKE CONOUT%, COUT1% : POKE CONOUT%+1, COUT2%    'Turn console back on
  97. 660 PRINT "This should be a display on your CRT."
  98.  
  99. - - - - - - - -
  100.  
  101. 800 END
  102.