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 / UTILITYS / GTR03.ARC / GTR+RSX.Z80 < prev    next >
Text File  |  1991-01-13  |  9KB  |  281 lines

  1. ; Graphics Terminal Remapper.  v 0.3   For ZPM3 and CP/M 3
  2.  
  3. ; This is an RSX to allow remapping of hi-bit-set characters to other
  4. ;  characters before sending them to the screen.  It may be used to tranlate
  5. ;  any single character to any other single character, but was devised
  6. ;  particularly for reading IBM type graphics on an ordinary terminal.
  7. ;  This program was inspired by CORK10 by Steven Greenberg, but is only
  8. ;  for CP/M 3 and ZPM3.  It is also somewhat more simple due to the
  9. ;  improvements in CP/M 3 and ZPM3.
  10.  
  11. ; This code will assemble to two different RSXs depending on the TYPE
  12. ;  equate below:
  13.  
  14. ; Type 0 is used is a standalone program.  Using GENCOM, a dummy .COM file
  15. ;  is made which contains the RSX.  When first called, it installs the
  16. ;  RSX.  When called again it removes it.
  17.  
  18. ;  Type 1 can be used as an RSX which is attached to another program (such
  19. ;  as ZMP) so that it is automatically installed and removed with the host
  20. ;  program.
  21.  
  22. ; Note that many communications programs strip the high bit before sending
  23. ;  characters to the console.  Such programs can NOT use GTR+ successfully.
  24.  
  25. ; Simeon Cran.  September 7 1990.  Brisbane Australia
  26.  
  27. ; Version Updates
  28.  
  29. ; v0.3
  30. ; Added support to remap characters to suit a terminals own block graphics
  31. ; Bruce Dudley  January 7 1991. Perth Western Australia
  32. ;---------------------------------------------------------------------------
  33. esc    equ    27
  34.  
  35. TYPE    EQU    0    ; 0 = Use as a stand alone COM file
  36.             ; 1 = To be attatched to your OWN com file as an RSX
  37.  
  38. ;-------------------------------------------------------------------------
  39.  
  40.     dseg        ; DR's LINK.COM will put the data segment at the
  41.             ; end of the code... Just as well!
  42. select    macro     name
  43.     include    name
  44.     endm
  45.  
  46. ; If you are going to use the terminals graphic mode then select your terminal
  47. ; from the following list. If your terminal is not listed then you
  48. ; must enter the ESC sequence to turn on/off graphic mode. Also
  49. ; you will need to make a look up table to suit your terminal.
  50.  
  51. ; Just comment out the relevent name (select) to suit your terminal..
  52. ; If your terminal is not listed them edit one of the INC files to suit
  53. ; your terminals facilities and include it in the following format..
  54.  
  55. select    NOGRAPH.INC        ; No terminal graphic facilities
  56. ;select    AMSTRAD.INC        ; Amstrad CPC6128 CP/M 3 computer
  57. ;select    FREEDOM.INC        ; Freedom 200 terminal
  58.  
  59. ;=============================================================================
  60.  
  61.     cseg        ; This is the real beginning of the code
  62.  
  63. ; RSX header.
  64.     ds    6    ; Room for serial number
  65. entry:    jp    ftest    ;6 Entry jump
  66. next:    jp    0    ;9
  67.     dw    0    ;c Room for previous pointer
  68. remove:    db    0ffh    ;e Remove flag (changed by RSX)
  69.     db    0    ;f Non-resident flag
  70. name:    db    'GTR+0.3 '    ;10 Name
  71.     db    0    ;18 Loader flag
  72.     dw    0    ;19 Reserved area
  73.  
  74. ;-----------------------------------------------------------------------------
  75. ;1a
  76.     if    not type    ; For standalone program
  77. ; Remove the RSX
  78.     ld    a,0ffh
  79.     ld    (remove),a    ; Set to remove on next warm boot
  80.     call    rem$jmp        ; Restore the jump vector
  81.     ld    de,remMSG    ; Inform the user that it has been removed
  82.     ld    c,9
  83.     call    next
  84.     ret
  85.  
  86. ftest:
  87. ; On first call to BDOS, check to see if an identical RSX has already been
  88. ;  installed.  If it has, remove it and this RSX.  If it hasn't, install
  89. ;  the new jump vector, and fix to make future BDOS calls ignore the RSX.
  90.     push    bc
  91.     push    de    ; Save entry parameters
  92.     ld    hl,next
  93.     ld    (entry+1),hl    ; Make sure this RSX is ignored from now on
  94. RSXlook:
  95.     ld    l,0bh        ; Point to the next address
  96.     ld    h,(hl)        ; Get it in HL
  97.     ld    l,18h    ; Point to the loader flag
  98.     ld    a,(hl)    ; Get it
  99.     or    a
  100.     jr    nz,loadFND    ; If we found the loader, then there is
  101.                 ;  no identical RSX in place.
  102.     ld    l,10h        ; Point to the name
  103.     ld    bc,8        ; Length of name
  104.     ld    de,name-1    ; Point to our name
  105. RSXl1:    inc    de        ; Point to next character
  106.     ld    a,(de)        ; Get a character
  107.     cpi
  108.     jr    nz,RSXlook    ; If it didn't match, check the next one
  109.     jp    pe,RSXl1    ; If it matched so far, keep checking    
  110.     ld    l,1ah        ; Point to the remove code of the identical
  111.                 ;  RSX.
  112.     call    ipchl        ; Call its remove code
  113.     pop    de
  114.     pop    bc        ; Restore entry parameters
  115.     jr    next        ; And done.  
  116.  
  117. ipchl:    jp    (hl)
  118.  
  119. loadFND:    ; Here, we have found the loader which means there are no
  120.         ;  other identical RSXs.  Install this one and continue.
  121.     xor    a
  122.     ld    (remove),a    ; Clear the remove flag so that it stays
  123.                 ; resident.
  124.     call    ins$jmp        ; Install the new jump
  125.     ld    de,insMSG
  126.     ld    c,9        ; Print the message
  127.     call    next
  128.     pop    de        ; Restore the entry paramaters
  129.     pop    bc
  130.     jr    next        ; All done.
  131.  
  132. insMSG:    db    ' Graphics remapper  INSTALLED$'
  133. remMSG:    db    ' Graphics remapper  REMOVED$'
  134.  
  135. ;-----------------------------------------------------------------------------
  136.     else        ; If attached RSX
  137. ftest:
  138. ; On first call to BDOS, install the new jump vector, and fix to make future
  139. ;  BDOS calls ignore the RSX
  140.     push    bc
  141.     push    de    ; Save entry parameters
  142.     ld    hl,next
  143.     ld    (entry+1),hl    ; Make sure this RSX is ignored from now on
  144.     call    ins$jmp    ; Install the new jump vectors in the BIOS and modify
  145.             ;  the SCB traps
  146.     pop    de
  147.     pop    bc    ; Restore entry parameters
  148.     jr    next    ; And continue
  149.  
  150. oldboot:
  151.     dw    0    ; Stores the old boot vector
  152.  
  153.     endif
  154. ;-----------------------------------------------------------------------------
  155. ins$jmp:    ; Install the new jump vector(s)
  156.     ld    hl,(1)        ; Get the BIOS vector pointer
  157.     ld    l,13        ; Point to the conout vector
  158.     ld    de,newjmp    ; Get the new jump
  159.     ld    c,(hl)        ; Get the old jump.  Low byte
  160.     ld    (hl),e        ; Put new in
  161.     inc    hl
  162.     ld    b,(hl)        ; Same for high byte
  163.     ld    (hl),d
  164.     ld    (conout+1),bc    ; Save the old jump
  165.     dec    h        ; Point to the SCB
  166.     ld    l,0fah
  167.     ld    a,(hl)        ; Get common memory base page
  168.     dec    a        ; minus 1
  169.     cp    d        ; Compare it with this page
  170.     jr    c,ins$j1    ; Don't modify trap if this RSX is in common
  171.     ld    l,7ah
  172.     ld    (hl),21h    ; Convert the trap
  173. ins$j1:
  174.     if    type        ; If attached RSX
  175.     ld    de,rem$jmp    ; Get the new jump
  176.     cp    d        ; Compare it with this page
  177.     jr    c,ins$j2    ; Don't modify trap if this RSX is in common
  178.     ld    l,68h
  179.     ld    (hl),21h    ; Convert the warm boot trap
  180. ins$j2:
  181.     inc    h        ; Point back to bios
  182.     ld    l,4        ; Point to the warm boot code
  183.     ld    c,(hl)        ; Get the old jump.  Low byte
  184.     ld    (hl),e        ; Put new in
  185.     inc    hl
  186.     ld    b,(hl)        ; Same for high byte
  187.     ld    (hl),d
  188.     ld    (oldboot),bc    ; Save the old jump
  189.     endif
  190.  
  191.     ret
  192.  
  193. rem$jmp:    ; Restore the modified jumps.
  194.     ld    hl,(1)        ; Get the BIOS pointer
  195.     ld    de,(conout+1)    ; Get the old jump
  196.     ld    l,13        ; Point to the jump
  197.     ld    (hl),e
  198.     inc    hl
  199.     ld    (hl),d        ; Change it back
  200.     dec    h        ; Point to the SCB
  201.     ld    l,0fah        ; Get common memory base address
  202.     ld    a,(hl)
  203.     dec    a        ; Minus 1
  204.     cp    d        ; Compare it with the replacment jump
  205.     jr    c,rem$j1
  206.     ld    l,7ah
  207.     ld    (hl),0c3h    ; Restore the SCB trap
  208. rem$j1:
  209.     if    type        ; If the attached RSX.  Remove the warm boot
  210.                 ;  trap.
  211.  
  212.     ld    de,(oldboot)    ; Get the old boot
  213.     cp    d
  214.     jr    c,rem$j2
  215.     ld    l,68h
  216.     ld    (hl),0c3h    ; Restore the SCB trap
  217. rem$j2:    inc    h
  218.     ld    l,4
  219.     ld    (hl),e
  220.     inc    hl
  221.     ld    (hl),d        ; Restore the old boot vector
  222.     jp    0        ; And continue warm boot
  223.     endif
  224.     ret
  225. ;==============================================================================
  226. ; This is the actual translation code.  All calls to CONOUT in the BIOS land
  227. ; here.  Character in C.
  228.  
  229. newjmp:    bit    7,c        ; Test the high bit
  230.     jr    nz,graphic     ; Must be a graphic character! Go process it.
  231.  
  232. ; Test to be sure that graphics mode of the terminal gets turned
  233. ; off for the next ASCII character..
  234.  
  235.     ld    a,(flag)
  236.     or    a
  237.     jr    nz,conout    ; Graphic mode not set so just send the char
  238.     ld    a,c
  239.     ld    (flag),a    ; Save the char plus use it as a flag
  240.     ld    hl,graoff    ; String to turn off graphic mode
  241.     call    seterm        ; Do it!
  242.     ld    a,(flag)    ; retrive character
  243.     ld    c,a
  244.     jr    conout        ; Send it
  245.  
  246. seterm:    ld    a,(hl)        ; Get the first character of esc sequence
  247.     or    a        ; Test fot zero
  248.     ret    z
  249.     ld    c,a
  250.     push    hl
  251.     call    conout        ; Send character for esc sequence
  252.     pop    hl
  253.     inc    hl        ; Point to the next character
  254.     jr    seterm        ; Go do it all again
  255.  
  256. ; Here we do the actual translation.
  257.  
  258. graphic:xor    a
  259.     ld    (flag),a    ; Set flag to indicate graphic mode enabled
  260.     ld    hl,graon    ; Turn graphic mode on
  261.     push    bc
  262.     call    seterm
  263.     pop    bc
  264.     ld    a,c
  265.     ld    hl,table-80h    ; Point to the table
  266.     add    l
  267.     ld    l,a        ; Add HL and A to HL
  268.     ld    a,h
  269.     adc    0
  270.     ld    h,a
  271.     ld    a,(hl)        ; Get the entry
  272.     or    a        ; See if there was in fact an entry
  273.     jr    z,conout    ; If no entry, then just output the character
  274.                 ; with the high bit cleared.
  275.     ld    c,a        ; Put it in C to output
  276. conout:    jp    0        ; This is modified
  277.  
  278. flag:    db    -1        ; If 'flag' is zero then grahpic mode is on
  279.                  ; and if it's not zero then graphic mode
  280.                 ; not enabled
  281.