home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / utilitys / cop12.arc / COP12.MAC < prev    next >
Text File  |  1991-08-11  |  13KB  |  357 lines

  1.     TITLE    COP - Console Output Processor
  2.     SUBTTL    Author:  Mike Freeman 9-May-89
  3. ;
  4. ;Copyright 1989 by Michael Freeman; 301 N.E. 107th Street;
  5. ;Vancouver, Wa 98685; Telephone (206)574-8221
  6. ;Permission is hereby granted to use and/or modify this code and its
  7. ;accompanying documentation as long as such modified code and/or
  8. ;documentation is not distributed without the permission, either in
  9. ;writing or electronically, of the copyright-holder.  Commercial use and/or
  10. ;sale of this program, its code and/or documentation is strictly
  11. ;prohibited except that a blind person may use the program in his/her
  12. ;place of employment in order to facilitate his/her work.  Notwithstanding
  13. ;the foregoing, any of these provisions which may be deemed to be in
  14. ;violation of the copyright of Mr. Hastwell-Batten are null and void.
  15. ; The code which relocates the program to high-memory (just below the CCP)
  16. ; is copyrighted 1982, 1984 by John Hastwell-Batten of Australia.
  17. ;
  18. ; This program relocates itself into high memory just below the CCP.
  19. ; It then acts as a preprocessor for characters destined for Console output.
  20. ; A string of repeated characters may be displayed as one or more
  21. ; occurrences of the character, the maximum number of which is specified by
  22. ; the user.  For example, a string of five asterisks may be displayed
  23. ; as one, two, three, four or five asterisks, depending upon the user's
  24. ; preference.  Characters may be suppressed from Console output altogether.
  25. ; A maximum of 40 such characters (together with their display-counts)
  26. ; may be specified.  A display-count of 0 for a character is interpreted
  27. ; as meaning that the character should be suppressed.
  28. ;This is useful for blind computer users employing Braille output devices
  29. ;or voice synthesizers to access the computer screen.  Ruled lines of
  30. ;equals signs (=) or asterisk borders (*), used by the; sighted to
  31. ;prettify and/or clarify their computer output can be tamed.
  32. ; In addition, with Space-compression enabled, <tab> characters
  33. ; are displayed as spaces and multiple spaces are displayed as a single
  34. ; space.  This should help those who read the computer screen with
  35. ; Braille output devices or Optacons.
  36. ;
  37. ; To install the RSX, just run COP.  It will ask for characters to be
  38. ; compressed/suppressed (see COP.DOC) and if Space-compression is desired.
  39. ; COP then exits to the CCP.
  40. ; To remove the RSX, just run COP again.
  41. ;
  42. ; To compile/link COP using M80/L80:
  43. ; Obtain a copy of RELOC23.LBR and extract the files RELOC.ABS,
  44. ; RELOC.REL and RELOC.COM
  45. ; Extract RELOC.SUB from this archive
  46. ; Compile COPxx.MAC:
  47. ; A>M80 =COPxx.MAC
  48. ; Making sure all files are on drive A (or the default drive if
  49. ; you've modified your CCP/SUBMIT/XSUB accordingly, type:
  50. ; A>SUBMIT RELOC COPxx -
  51. ; The result will be a copy of COPxx.COM (where xx is version-number)
  52. ; This .COM-file is ready for execution
  53. ;
  54.     .Z80            ;Use Zilog mnemonics
  55. ;
  56. ; BDOS EQUATES
  57. ;
  58. WBT    EQU    0H        ;Warm-boot to CP/M
  59. BDOS    EQU    05H        ;Jump to BDOS
  60. WSC    EQU    09H        ;Write String to Console
  61. RSC    EQU    0AH        ;Read String from Console
  62. RDS    EQU    0DH        ;Reset Disk System
  63. ;
  64. ; ASCII equates
  65. ;
  66. CR    EQU    0DH        ;<cr>
  67. LF    EQU    0AH        ;<lf>
  68. ;
  69. ; Miscellaneous symbols
  70. ;
  71. CHBLEN    EQU    40        ;Length of character processing buffer
  72.     ;
  73.     SUBTTL    Revision History
  74. ;
  75. ;Version    Description
  76. ;
  77. ;1.0        Initial Release 01/15/89
  78. ;1.1        Maintainence release 04/01/89; fixed a bug wherein Warm-boot
  79. ;        and BDOS addresses were not being restored during
  80. ;        warm-boots after installation of COP.  This prevented 
  81. ;        removal of COP after running DDT.  Thanks to Howard
  82. ;        Goldstein of New Haven, CT, for pointing out this one.
  83. ;1.2        ;Program enhanced 05/09/89
  84. ;        Implemented ability to specify the maximum number of
  85. ;        times repeated characters are to be displayed (previously
  86. ;        always showed only one time); also implemented
  87. ;        space/tab compression
  88. ;
  89.     SUBTTL    Main program
  90. ;
  91.     DSEG            ;Data segment
  92. ;
  93. $MEMRY::            ;Here for L80 to put address of
  94.     DEFW    0        ;First Free Location in memory
  95.     JP    START        ;Vector to start of program after relocation
  96.                 ;$MEMRY and the vector to START **MUST**
  97.                 ;be in the order here shown in order for
  98.                 ;the relocator module to relocate
  99.                 ;this program to high-memory (see
  100.                 ;RELOC.DOC from RELOC23.LBR)
  101. ;
  102. ; Here after program has been relocated
  103. ;
  104. START:    LD    IX,(BDOS+1)    ;Point to vector into BDOS
  105.     LD    A,(IX+3)    ;Get 1st byte beyond jump
  106.     CP    'C'        ;If COP not already present,
  107.     JR    NZ,INITOK    ;Go set things up
  108.     LD    A,(IX+4)    ;COP possibly here, get next character
  109.     CP    'O'        ;If COP not here,
  110.     JR    NZ,INITOK    ;Go set things up
  111.     LD    A,(IX+5)    ;COP may still be present, get next char
  112.     CP    'P'        ;If COP not present,
  113.     JR    NZ,INITOK    ;Go init things, else
  114.     PUSH    IX        ;Save register IX
  115.     LD    DE,FINMSG    ;Type termination message
  116.     LD    C,WSC        ;...
  117.     CALL    BDOS        ;...
  118.     POP    IX        ;Restore register IX
  119.     LD    IY,(WBT+1)    ;Point into BIOS dispatch table
  120.     LD    E,(IX+9)    ;Get real CP/M Console output routine address
  121.     LD    D,(IX+10)    ;...
  122.     LD    (IY+10),E    ;and restore real Console output address
  123.     LD    (IY+11),D    ;...
  124.     LD    L,(IX+1)    ;Get real BDOS address
  125.     LD    H,(IX+2)    ;...
  126.     LD    (BDOS+1),HL    ;and restore it
  127.     LD    L,(IX+6)    ;Get real CP/M warm-boot address
  128.     LD    H,(IX+7)    ;...
  129.     LD    (IY+1),L    ;and restore it
  130.     LD    (IY+2),H    ;...
  131.     JP    WBT        ;and exit to CP/M
  132. ;Here to initialize various pointers and buffers
  133. INITOK:    LD    DE,HELLO    ;Type sign-on message
  134.     LD    C,WSC        ;...
  135.     CALL    BDOS        ;...
  136. INITOK0:LD    DE,CHRMSG    ;Now ask user for characters
  137.     LD    C,WSC        ;to be compressed/suppressed
  138.     CALL    BDOS        ;...
  139.     LD    DE,CONBUF    ;Get user's characters to be
  140.     LD    C,RSC        ;compressed/suppressed
  141.     CALL    BDOS        ;...
  142.     LD    DE,CONBUF+2    ;Point to Console buffer
  143.     LD    IX,CHRBUF    ;and character buffer
  144. INIT0:    LD    A,(DE)        ;Get a character to process
  145.     OR    A        ;Done yet?
  146.     JR    Z,INIT2        ;Yes
  147.     INC    DE        ;Increment Console buffer pointer
  148.     LD    (IX),A        ;and store character
  149.     LD    (IX+CHRCNT),0    ;Zap character counter for this character
  150.     LD    A,(DE)        ;Get next character
  151.     INC    DE        ;...
  152.     CP    '('        ;If start of display-count,
  153.     JR    Z,INIT1        ;All is well, else
  154. INIT0A:    LD    DE,FMTERR    ;Complain to the user
  155.     LD    C,WSC        ;about his/her lousy typing
  156.     CALL    BDOS        ;...
  157.     JR    INITOK0        ;and ask again
  158. INIT1:    CALL    DECIN        ;Get display-count
  159.     CP    ')'        ;If not terminated by ")",
  160.     JR    NZ,INIT0A    ;Complain again
  161.     LD    (IX+DSPCNT),L    ;Remember display-count (low-order 8 bits)
  162.     LD    A,(CHBCNT)    ;Increment count of chars to process
  163.     INC    A        ;...
  164.     LD    (CHBCNT),A    ;...
  165.     INC    IX        ;Increment character pointer
  166.     JR    INIT0        ;and look for more characters
  167. INIT2:    LD    DE,SPCMSG    ;Ask about space-compression
  168.     LD    C,WSC        ;...
  169.     CALL    BDOS        ;...
  170.     LD    DE,CONBUF    ;Get user's answer
  171.     LD    C,RSC        ;...
  172.     CALL    BDOS        ;...
  173.     LD    A,(CONBUF+1)    ;Did user want space-compression?
  174.     OR    A        ;...
  175.     JR    Z,INIT3        ;No
  176.     LD    A,(CONBUF+2)    ;Get answer (only 1st char counts)
  177.     CP    'Y'        ;If "yes",
  178.     JR    Z,INIT2A    ;Set space-compression
  179.     CP    'Y'+20H        ;...
  180.     JR    NZ,INIT3    ;...
  181. INIT2A:    LD    A,0FFH        ;Set space-compression
  182.     LD    (SPCFLG),A    ;...
  183. INIT3:    LD    IX,(WBT+1)    ;Point into BIOS jump table
  184.     LD    (BTADR),IX    ;and remember it
  185.     LD    L,(IX+1)    ;Get real CP/M warm-boot address
  186.     LD    H,(IX+2)    ;...
  187.     LD    (WBTADR),HL    ;and remember for later
  188.     LD    L,(IX+10)    ;Get address of Console output routine
  189.     LD    H,(IX+11)    ;...
  190.     LD    (JPCONO+1),HL    ;and remember for later
  191.     LD    HL,CONOUT    ;Substitute our own routine
  192.     LD    (IX+10),L    ;...
  193.     LD    (IX+11),H    ;...
  194.     LD    HL,(BDOS+1)    ;Get BDOS entry address
  195.     LD    (JPBDOS+1),HL    ;and remember it
  196.     LD    HL,JPBDOS    ;Substitute our own branch
  197.     LD    (BDOS+1),HL    ;...
  198.     EX    (SP),HL        ;Get CP/M's CCP address
  199.     LD    (CPMRET),HL    ;and remember it
  200.     EX    (SP),HL    ;Restore HL-return address
  201.     LD    HL,NWBOOT    ;Use our own warm-boot routine
  202.     LD    (IX+1),L    ;...
  203.     LD    (IX+2),H    ;...
  204.     LD    DE,INIMSG    ;Say COP is installed
  205.     LD    C,WSC        ;...
  206.     JP    BDOS        ;and return to CP/M CCP
  207. ;
  208. ;DECIN - Get decimal number from Console buffer CONBUF and place it in HL
  209. ;Terminates on non-numeric character (left in A)
  210. ;
  211. DECIN:    LD    HL,0        ;Zero result
  212. DECIN0:    LD    A,(DE)        ;Get character
  213.     INC    DE        ;and increment character pointer
  214.     CP    '0'        ;If not numeric,
  215.     RET    C        ;Return with terminator in A
  216.     CP    '9'+1        ;...
  217.     RET    NC        ;...
  218.     LD    B,H        ;Save result
  219.     LD    C,L        ;...
  220.     ADD    HL,HL        ;Multiply interim result by ten
  221.     ADD    HL,HL        ;...
  222.     ADD    HL,HL        ;...
  223.     ADD    HL,BC        ;...
  224.     ADD    HL,BC        ;...
  225.     AND    0FH        ;Make character binary digit
  226.     LD    B,0        ;Put in BC
  227.     LD    C,A        ;...
  228.     ADD    HL,BC        ;Put digit into the result
  229.     JR    DECIN0        ;Get all digits
  230. ;
  231. HELLO:    DEFB    CR,LF,'Console Output Processor Version 1.2'
  232.     DEFB    ' 9-May-89'
  233.     DEFB    CR,LF,'Copyright 1989 by Michael Freeman'
  234.     DEFB    CR,LF,'Program Relocation Module copyright 1984 by '
  235.     DEFB    'John Hastwell-Batten',CR,LF,'$'    ;Sign-on message
  236. CHRMSG:    DEFB    CR,LF,'Characters>$';Prompt
  237. FINMSG:    DEFB    CR,LF,'Removing Console Output Processor',CR,LF,'$'
  238.                 ;Termination message
  239. INIMSG:    DEFB    CR,LF,'Console Output Processor is installed'
  240.     DEFB    CR,LF,'$'    ;Installation announcement
  241. ;
  242. SPCMSG:    DEFB    CR,LF,'Space-compression (Y or N)[N]? $';Space-comp message
  243. ;
  244. FMTERR:    DEFB    CR,LF,'? Format error -- Please try again!!',CR,LF,'$'
  245. ;
  246. CONBUF:    DEFB    255,0        ;Console input buffer
  247.     REPT    256        ;...
  248.     DEFB    0        ;...
  249.     ENDM            ;...
  250. ;
  251. ; Console Output Processor RSX begins here
  252. ;
  253. JPBDOS:    DEFB    0C3H,0,0    ;Vector to BDOS
  254. ;
  255.     DEFB    'COP'        ;Identifying characters
  256. ;
  257. WBTADR:    DEFW    0        ;Holds address of CP/M's warm-boot routine
  258. JPCONO:    JP    $-$        ;Holds jump to Console output routine
  259. BTADR:    DEFW    0        ;Holds address of BIOS jump to boot
  260. CPMRET:    DEFW    0        ;Holds return address of CCP
  261. ;
  262. WBTMSG:    DEFB    CR,LF,'Console Output Processor active',CR,LF,'$'
  263.                 ;Warm-boot message
  264. ;
  265. CHBCNT:    DEFB    0        ;# of characters to check
  266. CHRBUF:                ;Character buffer
  267.     .PHASE    0
  268.     DEFS    CHBLEN        ;Reserve space for buffer
  269. DSPCNT:    DEFS    CHBLEN        ;Number of times to display chars
  270. CHRCNT:    DEFS    CHBLEN        ;Number of times chars have been displayed
  271.     .DEPHASE
  272. ;
  273. LSTCHR:    DEFB    0        ;Holds last character processed
  274. SPCFLG:    DEFB    0        ;0FFH means space-compression
  275. ;
  276. CPMSTK:    DEFW    0        ;Holds CP/M's stack pointer
  277.     DEFS    32        ;Local stack
  278. LOCSTK:                ;...
  279. ;
  280. ;CONOUT - Console Output Routine
  281. ;Preserves all registers
  282. ;
  283. CONOUT:    LD    (CPMSTK),SP    ;Save current stack pointer
  284.     LD    SP,LOCSTK    ;Use local stack
  285.     PUSH    AF        ;Save AF-IY
  286.     PUSH    BC        ;...
  287.     PUSH    DE        ;...
  288.     PUSH    HL        ;...
  289.     PUSH    IX        ;...
  290.     PUSH    IY        ;...
  291.     LD    A,(SPCFLG)    ;Is space-compression in effect?
  292.     INC    A        ;...
  293.     JR    NZ,CONOU2        ;No
  294.     LD    A,(LSTCHR)    ;Get last character processed
  295.     LD    E,A        ;and salt it away for checking
  296.     LD    A,C        ;Get current character in process
  297.     CP    09H        ;If a tab,
  298.     JR    NZ,CONOU3    ;...
  299.     LD    A,20H        ;Make it a space
  300.     LD    C,A        ;...
  301. CONOU3:    LD    (LSTCHR),A    ;and make it last character processed
  302.     CP    20H        ;If character is not a space,
  303.     JR    NZ,CONOU2    ;Process normally, else
  304.     CP    E        ;If previous character was a space,
  305.     JR    Z,CONOUX    ;Don't type anything
  306. CONOU2:    LD    A,(CHBCNT)    ;Get # of chars to be compressed/suppressed
  307.     OR    A        ;Any there?
  308.     JR    Z,CCOUT        ;No, type current character and return
  309.     LD    B,A        ;Put in B to loop over chars
  310.     LD    IX,CHRBUF    ;Point to character buffer
  311. CONOU0:    LD    A,(IX)        ;Get a character of interest
  312.     CP    C        ;Is current character this one?
  313.     JR    NZ,CONOU1    ;No, check next buffer character
  314.     LD    A,(IX+DSPCNT)    ;Get # of times char should be shown
  315.     OR    A        ;Is character to be suppressed?
  316.     JR    Z,CONOUX    ;Yes, don't type it
  317.     LD    D,A        ;Save display count
  318.     INC    D        ;Increment it by one
  319.     LD    A,(IX+CHRCNT)    ;Get # times char has been typed
  320.     INC    A        ;and increment it
  321.     LD    (IX+CHRCNT),A    ;...
  322.     CP    D        ;Should we display the character?
  323.     JR    C,CCOUT        ;Yes, type it
  324.     JR    CONOUX        ;No, suppress it
  325. CONOU1:    LD    (IX+CHRCNT),0    ;This char hasn't been seen
  326.     INC    IX        ;Increment buffer pointer
  327.     DJNZ    CONOU0        ;Go thru character buffer
  328. CCOUT:    CALL    JPCONO        ;Type character in C to Console
  329. CONOUX:    POP    IY        ;Restore registers
  330.     POP    IX        ;...
  331.     POP    HL        ;...
  332.     POP    DE        ;...
  333.     POP    BC        ;...
  334.     POP    AF        ;...
  335.     LD    SP,(CPMSTK)    ;Restore original stack pointer
  336.     RET            ;and return
  337. ;
  338. ;NWBOOT - Substitute warm-boot routine
  339. ;
  340. NWBOOT:    LD    SP,WBTSTK    ;Use our own stack
  341.     LD    HL,(BTADR)    ;Restore address in BIOS jumping to warm-boot
  342.     LD    (WBT+1),HL    ;...
  343.     LD    HL,JPBDOS    ;Reset our BDOS entry vector
  344.     LD    (BDOS+1),HL    ;...
  345.     LD    C,RDS        ;Reset disk system
  346.     CALL    BDOS        ;...
  347.     LD    DE,WBTMSG    ;Type warm-boot message
  348.     LD    C,WSC        ;to tell user COP RSX is loaded
  349.     CALL    BDOS        ;...
  350.     LD    HL,(CPMRET)    ;Get CCP entry address
  351.     JP    (HL)        ;and go to CCP
  352. ;
  353.     DEFS    16        ;Boot stack
  354. WBTSTK:                ;...
  355. ;
  356.     END    START            ;End of program
  357.