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 / CPM / TERM / REMSCR.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  21KB  |  617 lines

  1. ;REMSCRN.ASM
  2. ;
  3. ;WRITTEN 2/28/86 BY JOHN GOTSCHALL
  4. ;
  5. ;
  6. ;
  7. ;
  8. ;    GENERIC SCREEN CONTROL STRING FILTER
  9. ;    REPLACES OUTBOUND SCREEN COMMAND STRINGS WITH
  10. ;    STRINGS THAT PERFORM IDENTICLE FUNCTIONS ON A
  11. ;    REMOTE CONSOLE,  THIS PROGRAM WAS DEVELOPED FOR
  12. ;    USE IN AN APPLICATION WHERE A BUSINESS HAD A CP/M
  13. ;    MACHINE RUNNING DBASE II, THEY DID NOT WANT TO 
  14. ;    GET A MULTI-USER MACHINE, BUT THEY DID WANT
  15. ;    SIMULTANEOUS I/O TO A REMOTE HAZELTINE 1500, SO
  16. ;    THAT WHEN ONE TERMINAL WAS NOT IN USE THE OTHER COULD
  17. ;    BE USED, VERY SIMILAR IN FUNCTION TO A BYE PROGRAM,
  18. ;    WITH THE EXCEPTION THAT THERE WAS NO MODEM INVOLVED.
  19. ;    THE REMOTE IN THIS CASE HAD A DIFFERENT SET OF SCREEN COMMAND
  20. ;    SEQUENCES THAN THE LOCAL, NECESSITATING CONVERSION
  21. ;    OF THE LOCAL'S NATIVE COMMAND STRINGS INTO THE REMOTES
  22. ;    NATIVE TONGUE.  THIS MODULE PERFORMS THAT FUNCTION,
  23. ;    RATHER NICELY.  
  24. ;
  25. ;    I WROTE THIS LITTLE THING, AND AS IT IS MY VERY FIRST
  26. ;    100% SUCCESSFUL ASSEMBLY PROGRAM WITH PRACTICAL APPLICATION,
  27. ;    I HAVE MADE IT AVAILABLE TO THE GENERAL PUBLIC AND THUS
  28. ;    MAY BE USED BY ANY PERSON FOR NON-PROFIT USE.  IF YOU 
  29. ;    DO USE IT FOR PROFIT, YOU OWE ME ONE U.S. DOLLAR FOR
  30. ;    EVERY PERSON THAT USES IT. (PRETTY CHEAP HUH?, THAT'S NOT
  31. ;    ASKING A HECK OF A LOT.)
  32. ;
  33. ;    IF YOU OWE ME A BUCK SEND IT TO:
  34. ;
  35. ;     JOHN GOTSCHALL
  36. ;     PO BOX 2475
  37. ;     SEATTLE  WA  98111
  38. ;
  39. ;     ANYWAY, IMPLEMENTATION OF THIS CODE SHOULD BE PRETTY
  40. ;     OBVIOUS, JUST PATCH THE FIRST TABLE WITH THE VALUES
  41. ;     FOR YOUR LOCAL TERMINAL, THEN PLACE THE APPROPRIATE
  42. ;     REPLACEMENT VALUES INTO THE SECOND TABLE, WHEN OUTPUTTING
  43. ;     TO THE REMOTE, IF THE STRING THAT APPEARS IN THE FIRST
  44. ;     FOUR BYTES OF THE FIRST TABLE GETS SENT TO THE LOCAL,
  45. ;     THE CONTENTS OF THE FIRST FOUR BYTES OF THE SECOND
  46. ;     TABLE WILL BE SENT TO THE REMOTE IN PLACE OF WHAT WAS SENT
  47. ;     TO THE LOCAL.  IF YOU ARE USING A BYE PROGRAM, ALL YOU
  48. ;     NEED TO DO IS ADD THIS CODE TO YOUR BYE PROGRAM SOURCE
  49. ;     CODE (MAKING SURE TO FIX ANY DUPLICATED LABELS), THEN HAVE
  50. ;     YOUR BBS PROGRAM POKE THE VALUES FOR THE REMOTE'S
  51. ;     COMMAND STRINGS INTO THE SECOND TABLE, THEN YOUR BYE
  52. ;     MERGED WITH THIS PROGRAM WILL TAKE CARE OF MAKING
  53. ;     SURE THE REMOTE GETS SCREEN CONTROL SEQUENCES THAT IT CAN
  54. ;     UNDERSTAND, YET YOUR BBS PROGRAM NEED NOT DO ANYMORE
  55. ;     THAN PRETEND THAT YOUR LOCAL AND THE REMOTE HAVE THE
  56. ;     SAME SCREEN COMMAND SET.  WORKS PERFECT WITH THE
  57. ;     BUILT IN COMMANDS LIKE IN DBASE II AND TURBO PASCAL,
  58. ;     IT EVEN WORKED PERFECT WITH WORDSTAR IN MY APPLICATION.
  59. ;     WELL, IF YOU HAVE READ ALL OF THIS, I CERTAINLY HOPE YOU
  60. ;     CAN MAKE USE OF THIS PROGRAM, AS YOU ALREADY HAVE SOME
  61. ;     TIME INTO IT.
  62. ;
  63. ;     BE FORWARNED, WHILE THIS CODE NEVER USES A STACK,
  64. ;     IT WILL, WITHOUT A DOUBT DESTROY THE CONTENTS OF
  65. ;     THE CPU REGISTERS, SO SAVE ANYTHING YOU WANT TO KEEP
  66. ;     BEFORE CALLING THIS SUBROUTINE!!!!!
  67. ;
  68. ;     DELIVER OUTBOUND CHARACTERS TO THIS ROUTINE IN BOTH
  69. ;     THE A AND C REGISTERS !!
  70. ;
  71. ;
  72. ;=======================================================
  73. ;The following section of code filters the output to the remote,
  74. ;checking for the presence of screen command sequences, and when
  75. ;encountered, replaces the strings that are native to the local
  76. ;with strings that are native to the remote.  This is done
  77. ;through the use of two look-up tables.  The first of the two
  78. ;tables contains all of the sequences that are expected to be
  79. ;sent out, and are in code that is native to the local screen.
  80. ;the second table is where we patch in the corresponding strings,
  81. ;but there they are the strings that the remote will recognize
  82. ;as they are native to the remote.  
  83. ;=======================================================
  84. ;
  85. ;******************************************************
  86. ;There are many calls to a routine labeled 'REMOUT',
  87. ;you will not find remout in this listing, whenever this
  88. ;code calls remout, it thinks that it is delivering a 
  89. ;single character to the remote...  all waiting for status
  90. ;for the remote must take place in remout, your version
  91. ;of bye should already have a routine to output characters
  92. ;to the remote.....  THAT routine is the one that this code
  93. ;refers to when it calls remout.  The character to be sent to the
  94. ;renote from this code will be found in the C register whenever remout
  95. ;is called.
  96. ;********************************************************
  97. ;
  98. ;
  99. ;THE FOLLOWING TWO TABLES ARE 60 BYTES LONG, THEY ARE
  100. ;ORGANIZED SO THERE ARE 15 STRINGS OF 4 BYTES.  THE FIRST
  101. ;TABLE IS SCANNED PRIOR TO ANY OUTPUT TO THE REMOTE, IF
  102. ;THE CURRENT OUTBOUND CHARACTER MATCHES ANY OF THE CHARACTERS
  103. ;IN THE FIRST POSITIONS OF THE FIRST TABLE, THE CHARACTER IS
  104. ;BUFFERED, WHEN THE NEXT CHARACTER COMES THROUGH, A TEST IS
  105. ;MADE TO FIND ANY WHOLE MATCHING STRINGS, IF THERE IS A 
  106. ;POSSIBILITY OF A MATCH ON THE THIRD CHARACTER, THE SECOND
  107. ;CHARACTER IS BUFFERED, AND THE ROUTINE WAITS UNTIL THE
  108. ;THIRD CHARACTER COMES THROUGH, IT THEN TESTS TO SEE IF
  109. ;THERE IS A POSSIBILITY OF A COMPLETE MATCH.  ON CHARACTERS
  110. ;2, AND 3, CHECKS ARE MADE FOR BOTH PENDING MATCHES, AND
  111. ;COMPLETE MATCHES, ANY COMPLETE MATCHES WIN AND ARE IMMEDIATLY
  112. ;CONVERTED TO THE REMOTE'S COMMAND SET, AND ARE IMMEDIATLY SENT OUT
  113. ;TO THE REMOTE.
  114. ;
  115. ;IF THERE IS A MATCH IN ANY OF THE STRINGS IN THE FIRST TABLE
  116. ;THE STRING IS REPLACED WITH THE CONTENTS OF THE SAME POSITIONS
  117. ;IN THE SECOND TABLE...  ANY STRINGS MAY BE PUT IN ANY LOCATIONS,
  118. ;WITH THE EXCEPTION THAT THE LAST STRING OF 4 IN EACH TABLE IS
  119. ;RESERVED FOR THE CURSOR POSITIONING LEAD IN STRINGS, THE
  120. ;FOLLOWING THREE BYTES ARE FOR THE X AND Y COORDINATES AND
  121. ;THERE IS A FLAG THAT DENOTES WHICH COORDINATE COMES FIRST.
  122. ;
  123. ;THE MAXIMUM LENGTH FOR ANY COMMAND STRING IS FOUR BYTES!
  124. ;
  125. INSTNG    EQU    $+OFFSET
  126.     DB    01BH,045H,01BH,048H    ;CLEAR AND HOME CURSOR        
  127.     DB    01BH,05AH,0,0        ;CLEAR TO EOL
  128.     DB    01BH,04AH,0,0        ;CLEAR TO EOS
  129.     DB    27,69,0,0        ;ANOTHER STRING THAT IS CL & HME
  130.     DB    01BH,048H,01BH,045H    ;YET ANOTHER CL & HOME STRING
  131.     DB    01BH,'K',0,0        ;IF LESS THAN 4 BYTES LONG,           
  132.     DB    0,0,0,0                 ;LEAVE 0'S TO FILL THE EXTRAS,        
  133.     DB    0,0,0,0                 ;THE ZEROS WON'T BE SENT OUT          
  134.     DB    0,0,0,0
  135.     DB    0,0,0,0
  136.     DB    0,0,0,0
  137.     DB    0,0,0,0
  138.     DB    0,0,0,0
  139.     DB    0,0,0,0
  140.     DB    27,70,0,0    ;**LEAD-IN** CHARACTERS FOR THE
  141.                 ;LOCAL CONSOLE'S CURSOR POSITIONING
  142.                 ;STRING, IF LESS THAN 4 BYTES LONG,
  143.                 ;LEAVE A '0' TO FILL THE EXTRAS
  144. ;
  145. ICCC    EQU    $+OFFSET
  146.     DB    2      ;WHICH COORDINATE CARRIES THE COLUMN DATA?
  147.             ;THE FIRST OR THE SECOND
  148. ;
  149. ICCO    EQU    $+OFFSET
  150.     DB    32    ;VALUE OF COLUMN OFFSET FOR LOCAL
  151. ;
  152. ICRO    EQU    $+OFFSET
  153.     DB    32    ;VALUE OF ROW OFFSET FOR LOCAL
  154. ;
  155. ;
  156. OUTSTNG    EQU    $+OFFSET
  157.     DB    07EH,01CH,0A0H,0    ;REPLACEMENT COMMAND STRINGS
  158.     DB    07EH,0FH,0,0        ;THAT ARE TO BE INSERTED IN THE
  159.     DB    07EH,018H,0,0        ;DATA FLOW TO THE REMOTE IN
  160.     DB    07EH,01CH,0A0H,0    ;IN PLACE OF THE COMMAND STRINGS
  161.     DB    07EH,01CH,0A0H,0    ;FOUND IN THE ABOVE TABLE.  THE
  162.     DB    07EH,0FH,0,0        ;STRINGS IN THE TABLE ABOVE MUST
  163.     DB    0,0,0,0            ;MATCH THE STRINGS THAT WILL BE
  164.     DB    0,0,0,0            ;SENT TO THE LOCAL CONSOLE, WHILE
  165.     DB    0,0,0,0            ;THESE MUST CARRY THE STRINGS FOR
  166.     DB    0,0,0,0            ;THE SAME FUNCTIONS, BUT IN THE 
  167.     DB    0,0,0,0            ;REMOTE'S NATIVE TONGUE.
  168.     DB    0,0,0,0            ;IF LESS THAN 4 BYTES LONG,   
  169.     DB    0,0,0,0                 ;LEAVE 0'S TO FILL THE EXTRAS,        
  170.     DB    0,0,0,0                 ;THE ZEROS WON'T BE SENT OUT          
  171.     DB    07EH,011H,0,0    ;**LEAD-IN** CHARACTERS FOR THE
  172.                 ;REMOTE CONSOLE'S CURSOR POSITIONING
  173.                 ;STRING, IF LESS THAN 4 BYTES LONG,
  174.                 ;LEAVE 0'S TO FILL THE EXTRAS,
  175. ;                ;THE ZEROS WON'T BE SENT OUT          
  176. ;
  177. OCCC    EQU    $+OFFSET
  178.     DB    1     ;POSITION IN CURSOR POSITIONING
  179.             ;STRING THAT CARRIES THE COLUMN
  180.             ;FOR REMOTE
  181. ;
  182. OCCO    EQU    $+OFFSET
  183.     DB    0    ;VALUE OF COLUMN OFFSET FOR REMOTE
  184. ;
  185. OCRO    EQU    $+OFFSET
  186.     DB    0    ;VALUE OF ROW OFFSET FOR REMOTE
  187. ;
  188. ;
  189. ;MOVE (HL) TO (DE) LENGTH IN (B)
  190. ;
  191. ;THE FOLLOWING IS COMMENTED OUT, THIS ROUTINE IS DUPLICATED EXACTLY
  192. ;IN MY VERSION OF BYE.COM, SO I DON'T NEED THIS AGAIN, BUT IF YOUR
  193. ;VERSION OF BYE.COM DOES NOT HAVE THIS ROUTINE IN IT, USE THIS ONE
  194. ;OR IF YOU MAKE AN OVERLAY OF THIS FILE YOU WILL NEED IT
  195. ;
  196. ;
  197. ;MOVE    EQU    $+OFFSET
  198. ;    MOV    A,M    ;GET A BYTE
  199. ;    STAX    D    ;PUT IT IN NEW HOME
  200. ;    INX    D    ;BUMP POINTERS
  201. ;    INX    H
  202. ;    DCR    B    ;DEC BYTE COUNT
  203. ;    JNZ    MOVE    ;IF MORE, DO IT
  204. ;    RET        ;IF NOT, RETURN
  205. ;
  206. ;**************************************************
  207. ;**************************************************
  208. ;*  MAIN PROGRAM SECTION, THIS IS THE PART THAT   *
  209. ;*  DOES ALL THE FILTERING OF CURSOR COMMAND      *
  210. ;*  SEQUENCES.......                              *
  211. ;**************************************************
  212. ;
  213. ;
  214. ;the call to vconout below calls the routine that is already
  215. ;in my version of bye.  I replaced the call for vconout in
  216. ;my version of bye with a call for 'OUTPUT' below, so that the
  217. ;program comes here just prior to outputing to the local.
  218. ;
  219. OUTPUT    EQU    $+OFFSET
  220.     CALL    STRT        ;STORE CHAR IN FIRST EMPTY BUFFER LOC
  221.     CALL    VCONOUT        ;SEND IT TO THE LOCAL
  222. ;
  223. MT1    EQU    $+OFFSET
  224.     LDA    CLCF        ;POINT TO CURSOR LOCATION COMMAND FLG
  225.     CPI    1        ;ARE WE AWAITING A CURSOR COMMAND?
  226.     JZ    CPF        ;YES, GOTO CURSOR POS.FILTER
  227. MT2    EQU    $+OFFSET
  228.      LDA    MTSTR        ;POINT TO MATCHSTRING
  229.     CPI    01H        ;IS IT A 1?
  230.     JZ    MMF        ;THERE WAS A PRIVIOUS MATCH, AND NOT A CURSOR
  231.                 ;COMMAND, SO
  232.                 ;LETS TAKE THIS CHAR TO THE MAIN
  233.                 ;MATCH FINDER
  234. MT3    EQU    $+OFFSET
  235.     JMP    QCHK        ;NOTHING MATCHED LAST TIME
  236.                 ;WE OUTPUTTED, AND WER'E NOT LOOKIN
  237.                 ;FOR A CURSOR COORDINATE, SO LET'S JUST
  238.                 ;QUICKLY SCAN FOR A FIRST
  239.                 ;CHAR MATCH
  240. ;
  241. QCHK    EQU    $+OFFSET
  242.     LXI    H,BUFLOC    ;GET THE ADDRESS OF THE BUFFER
  243.     SHLD    BUFPTR        ;PUT IT IN THE BUFFERPOINTER
  244.     LXI    H,INSTNG    ;GET THE ADDRESS OF INSTING
  245.     SHLD    INSPTR        ;PUT IT IN THE POINTER
  246.     MOV    B,C        ;SAVE THE CHAR IN B
  247.     MVI    A,0
  248.     STA    COUNT
  249.     STA    COUNT1
  250.     LXI    H,INSTNG    ;POINT TO THE BEGINNING OF THE INSTING
  251. QCHCK1    EQU    $+OFFSET
  252.     MOV    A,M        ;GET THE CONTENTS
  253.     CMP    C        ;IS IT THE SAME AS OUR CHAR?
  254.     JZ    ST1MT        ;IT'S A MATCH
  255. QCHK2    EQU    $+OFFSET
  256.     INX    H    ;BUMP
  257.     INX    H    ;UP TO THE
  258.     INX    H    ;BEGINNING OF THE NEXT
  259.     INX    H    ;STRING OF FOUR BYTES
  260.     LDA    COUNT
  261.     INR    A
  262.     STA    COUNT    ;KEEP TRACK OF WHICH GROUP OF FOUR WERE' ON
  263.     CPI    0FH    ;PAST 15 YET?, IF SO, THEN THERE IS NO POSSIBLE
  264.     JZ    DONE    ;MATCH SO GO DUMP THE CHARACTER FROM THE BUFFER
  265.     JMP    QCHCK1
  266. ST1MT    EQU    $+OFFSET
  267.     LXI    H,MTSTR    ;THERE IS A MATCH IN ONE OF THE FIRST
  268.     MVI    A,1    ;POSITIONS OF THE INSTRING LINES
  269.     MOV    M,A    ;LEAVE NOTE OF THIS IN THE MTSTR GROUP.
  270.     RET        ;TO CP/M, WE'LL SEND OUT THIS CHAR LATER..
  271. ;
  272. ;
  273. ;###########################
  274. ;
  275. ; MMF (MAIN MATCH FINDER,
  276. ;  ROUTINE CHECKS ENTIRE INSTRING, COMPARES TO THE CONTENTS OF THE
  277. ;  BUFFER TO THE INSTNG TABLE, MAKES NOTATION TO SHOW POSSIBLE
  278. ;  PENDING MATCHES, OR PARTIAL BUT IMPOSSIBLE MATCHES, AND MAKES
  279. ;  THE FINAL DECISION ON WHETHER OR NOT THERE IS A MATCH OF
  280. ;  AN ENTIRE STRING.
  281. ;
  282. ;
  283. ;
  284. MMF    EQU     $+OFFSET
  285.     LXI    H,INSTNG    ;GET ADDRESS OF INSTNG INTO (D,E)
  286.     SHLD    INSPTR        ;RESET POINTER
  287.     LXI    H,BUFLOC    ;POINT TO FIRST BUFFER POSITION
  288.     SHLD    BUFPTR        ;RESET BUFPTR
  289.     MVI    A,0        ;GET A 0
  290.     STA    POSMTCH        ;RESET POSSIBLE MATCH FLAG
  291.     STA    COUNT        ;RESET COUNT FLAG
  292.     STA    COUNT1
  293. ENT    EQU    $+OFFSET
  294.     LDA    COUNT1        ;REACHED END OF INSTNG?
  295.     CPI    15    
  296.     JZ    ANT1        ;YEP...GO AND CHECK FOR A PENDING MATCH...
  297.                 ;IT MAY BE THAT WE NEED TO WAIT FOR MORE
  298.                 ;CHARACTERS TO COME THROUGH...
  299.     LHLD    BUFPTR        ;POINT TO THE CURRENT BUFFER ADDRESS
  300. ;
  301. ;COME INTO ENT1 WITH THE CURRENT BUFFER ADDR IN HL
  302. ;
  303. ENT1    EQU    $+OFFSET
  304.     MOV    A,M        ;GET VALUE OF CHAR AT BUFFER
  305.     LHLD    INSPTR        ;POINT TO TABLE
  306.     CMP    M        ;DOES BUFFER CHAR MATCH TABLE CHAR?
  307.     JNZ    ENT7        ;NOPE...
  308. ENT2    EQU    $+OFFSET
  309.     LDA    COUNT        ;IF WE ARE AT THE FIRST OF 4,
  310.     CPI    0        ;COUNT WILL BE 0
  311.     JNZ    ENT6        ;NOPE...
  312. ENT3    EQU    $+OFFSET
  313.     MVI    A,1        ;SINCE THERE IS A MATCH IN THE
  314.     STA    POSMTCH        ;FIRST OF 4 IN THE TABLE, MAKE
  315.                 ;A NOTE OF IT
  316. ENT4    EQU    $+OFFSET
  317.     LXI    H,MTSTR        ;POINT TO MATCHSTRING
  318.     LDA    COUNT        ;ALSO MAKE NOTE IN THE MATCHSTRING
  319.     MOV    B,A        ;ADD COUNT TO MATCHSTR LOCATION
  320. ENT4A     EQU    $+OFFSET
  321.     MOV    A,B        ;MAKE SURE WE STILL HAVE IT
  322.     CPI    0        ;MATCHING LOCATIONS YET?
  323.     JZ    ENT4B         ;YEP
  324.     INX    H        ;BUMP POINTER
  325.     DCR    B        ;COUNTDOWN
  326.     JMP    ENT4A 
  327. ENT4B     EQU    $+OFFSET
  328.     MVI    A,1        ;GET A ONE
  329.     MOV    M,A        ;PUT THE FLAG INTO THE MATCHSTRING
  330. ENT5    EQU    $+OFFSET        
  331.     LDA    COUNT        ;CECK TO SEE IF THIS IS THE
  332.     CPI    3        ;4TH CHAR IN THE STRING
  333.     JNZ    ENT8        ;NOPE, GO DO SOME MORE....
  334.     JMP    WHM        ;WE HAVE A FULL MATCH FOR A WHOLE
  335.                 ;STRING OF FOUR !!!!!!!
  336. ENT6    EQU    $+OFFSET
  337.     LDA    POSMTCH        ;IS THERE A POSSIBLE MATCH?
  338.     CPI    1        ;
  339.     JZ    ENT4
  340.     JMP    ENT8
  341. ENT7    EQU    $+OFFSET
  342.     LXI    H,POSMTCH    ;POINT TO POSMTCH
  343.     MVI    A,0        ;GET A 0
  344.     MOV    M,A        ;RESET POSMTCH
  345. ENT8    EQU    $+OFFSET
  346.     LHLD    BUFPTR        ;GET THE ADDRESS IN THE BUFFER POINTER
  347.     INX    H        ;INCREMENT IT
  348.     SHLD    BUFPTR        ;PUT IT BACK
  349.     LHLD    INSPTR        ;GET THE ADDRESS IN THE INSTRING POINTER
  350.     INX    H        ;INCREMENT IT
  351.     SHLD    INSPTR        ;PUT IT BACK
  352.     LDA    COUNT        ;GET THE COUNT
  353.     INR    A        ;INCREMENT IT
  354.     STA    COUNT        ;PUT IT BACK
  355. ENT9    EQU    $+OFFSET
  356.     LDA    COUNT        ;MAKE SURE WE HAVE THE COUNT
  357.     CPI    4        ;PAST THE 4TH CHAR YET?
  358.     JNZ    ENT        ;NOPE , GO DO MORE
  359. ENT10    EQU    $+OFFSET
  360.     MVI    A,0        ;WE'RE AT HE 4TH, SO
  361.     STA    COUNT        ;RESET COUNT
  362.     LDA    COUNT1        ;WERE LOOKING AT THE NEXT
  363.     INR    A        ;STRING IN THE TABLE, SO
  364.     STA    COUNT1        ;MAKE NOTE OF THAT
  365.     LXI     H,BUFLOC    ;ALSO, ON THE NEXT PASS,
  366.     SHLD    BUFPTR        ;WE WANT TO POINT TO
  367.                 ;THE FIRST CHAR IN THE BUFFER
  368.     JMP    ENT
  369. ;################################################
  370. ;
  371. ;END OF MATCH FINDER, IF THERE WAS NO EXACT MATCH,
  372. ;WE MAY JUST NOT HAVE ALL THE CHARACTERS YET, SO NOW WE CHECK TO
  373. ;SEE IF ANY PARTIAL MATCH IS A POSSIBLE MATCH
  374. ;
  375. ANT1    EQU    $+OFFSET
  376.     LXI    H,MTSTR        ;POINT TO THE FIRST POS OF MTSTR
  377.     MOV    A,M        ;GET THE CONTENTS
  378.     CPI    1        ;IS IT A ONE?
  379.     JNZ    DONE        ;NOPE, GO EMPTY BUFFER TO REMOTE,
  380.                 ;THERE IS NO CHANCE OF A MATCH..
  381. ANT2    EQU    $+OFFSET
  382.     INX    H        ;POINT TO NEXT LOCATION IN MTSTR
  383.     MOV    A,M        ;IS IT A ONE?
  384.     CPI    1        ;NOPE, 
  385.     JNZ    BZ        ;GO CHECK BUFFER STRING
  386. ANT3    EQU    $+OFFSET
  387.     INX    H        ;POINT TO NEXT LOCATION
  388.     MOV    A,M        ;GET CONTENTS
  389.     CPI    1    
  390.     JNZ    BZ1        ;GO CHECK BUFFER STRING
  391.     JMP    BZ2
  392. BZ    EQU    $+OFFSET
  393.     LXI    H,BUFLOC        ;POINT TO BUFFER
  394.     INX    H        ;POINT TO 2ND CHAR
  395.     MOV    A,M        ;GET THE CHAR
  396.     CPI    0        ;IS THE POSITION IN THE BUFFER EMPTY?
  397.     RZ            ;YES, THEN RETURN TO CP/M, LEAVE ALL AS IT
  398.                                 ;IS, THERE MAY BE MORE CHARACTERS NEEDE TO
  399.                 ;MAKE A MATCHING STRING
  400.     JMP    DONE        ;THERE IS NO POSSIBILITY OF A MATCH,
  401.                 ;SO GO DUMP THE BUFFER
  402. BZ1    EQU    $+OFFSET
  403.     LXI    H,BUFLOC        ;POINT TO THE
  404.     INX    H        ;3RD CHAR IN BUFFER
  405.     INX    H        ;THERE WE ARE.....
  406.     MOV    A,M        ;GET THE CHAR, IS IT EMPTY?
  407.     CPI    0
  408.     RZ            ;YEP, SAME AS IN BZ....
  409.     JMP    DONE
  410. BZ2    EQU    $+OFFSET
  411.     LXI    H,BUFLOC    ;SAME AS BZ & BZ1,
  412.     INX    H
  413.     INX    H
  414.     INX    H        ;BUT CHECK THE LAST CHAR IN BUFFER
  415.     MOV    A,M        ;GET THE CHAR..
  416.     CPI    0        ;IS THE POSITION EMPTY?
  417.     RZ            ;STILL EMPTY,GO TO CP/M AND TO IT AGIN,
  418.     JMP    DONE        ;BUFFER IS FULL AND NO MATCHES, SO GO EMPTY
  419.                 ;THE BUFFER.
  420. ;*****************************************
  421. ;END OF MAIN MATCH FINDER.....
  422. ;****************************************
  423. ;   
  424. ;
  425. ;
  426. ;****************************************
  427. ;THIS IS WHERE WE GO WHEN WE HAVE A MATCH
  428. ;WE NEED TO SEND OUT THE STRING THAT CORRESPONDS TO
  429. ;THE STRING THAT MATCHED IN THE TABLE, IF IT WAS THE 
  430. ;CURSOR POSITIONING STRING, WE WILL HAVE TO HANDLE THAT HERE ALSO.
  431. ;
  432. WHM    EQU    $+OFFSET
  433.     LXI    H,BUFLOC    ;POINT TO BUFFER
  434.     XCHG            ;MOVE TO DE
  435. WHM1    EQU    $+OFFSET
  436.     LXI    H,COUNT1
  437.     MOV    B,M        ;PUT THE VALUE INTO B:
  438.     LXI    H,OUTSTNG    ;GET THE ADDRESS OF THE TABLE
  439. WHM2    EQU    $+OFFSET
  440.     MOV    A,B        ;PUT B INTO A
  441.     CPI    0        ;POINTING TO THE CORRECT SUBSTRING?
  442.     JZ    WHM3        ;YEP
  443.     INX    H        ;MOVE POINTER UP 
  444.     INX    H        ;BYE FOUR, THUS
  445.     INX    H        ;POINTING AT
  446.     INX    H        ;THE NEXT SUBSTRING IN THE OUTSTNG
  447.     DCR    B        ;BUMP B DOWN
  448.     JMP    WHM2        ;LOOP SOME MORE
  449. WHM3    EQU    $+OFFSET
  450.     MVI    B,4        ;4 BYTES TO MOVE
  451.     CALL    MOVE        ;MOVE THE CONTENTS TO THE BUFFER
  452. ;******************************
  453. ;DONE MOVING THE NEW STRING INTO THE BUFFER, NOW LET'S
  454. ;SEE IF IT IS A CURSOR POSITIONING STRING....
  455. ;
  456.     LDA    COUNT1        ;GET THE TABLE STRING POINTER
  457.     CPI    14        ;IS IT A CURSOR COMMAND?
  458.     JNZ    DONE        ;NOPE, SO GO EMPTY BUFFER & RESET ALL
  459.     MVI    A,1        ;GET A 1
  460.     STA    CLCF        ;SET CURSOR COMMAND FLAG TO TRUE
  461.     JMP    DONE        ;GO EMPTY THE BUFFER TO THE REMOTE....
  462. ;********************************
  463. ;SINCE WE JUST SET THE CLCF, WE WILL COME HERE ON
  464. ;THE NEXT 2 CONSOLE OUTPUT CALLS....
  465. ;OUR VALUE IS IN THE BUFFER, BUT IF THE SECOND BUFFER POSITION
  466. ;IS EMPTY, THEN WE NEED ONE MORE CHARACTER...
  467. ;ALSO, SINCE ONE OR BOTH OF OUR CURSOR AND ROW VALUES
  468. ;MAY BE A 0, WE'LL DUMP THE BUFFER HERE INSTEAD OF USING
  469. ;THE 'DONE ' ROUTINE....
  470. ;WE ARE COUNTING ON GETTING AN OFFSET OF >0 FROM THE LOCAL
  471. ;FOR THE FIRST POSITION...
  472. CPF    EQU    $+OFFSET
  473.     LXI    H,BUFLOC    ;POINT TO THE BUFFER'S
  474.     INX    H        ;SECOND POSITION
  475.     MOV    A,M        ;GET THE CHAR
  476.     CPI    0        ;IS THERE A CHAR THERE?
  477.     RZ            ;NOPE, GOTO CP/M AND AWAIT ANOTHER
  478. CPF1    EQU    $+OFFSET    ;NOW WE HAVE THE TWO CHARACTERS WE WANT
  479.     LXI    H,OCCC      ;POINT TO THE FIRST BUFFER LOCATION
  480.     MOV    B,M        ;GET THE VALUE INTO B
  481.     LDA    ICCC        ;GET THE OTHER ONE
  482.     CMP    B        ;DO THEY MATCH?
  483.     JZ     CPF2        ;YEP,DON'T NEED TO REVERSE THE BUFFER CONTENTS
  484.     LDA    BUFLOC        ;GET THE FIRST CHAR
  485.     MOV    B,A        ;SAVE IT IN B
  486.     LDA    BUFLOC+1    ;GET THE NEXT ONE
  487.     STA    BUFLOC        ;PUT IT WHERE THE FIRST ONE WAS
  488.     MOV    A,B        ;GET THE ONE THAT WAS THE FIRST
  489.     STA    BUFLOC+1    ;AND PUT IT IN THE SECOND POSITION
  490. ;
  491. ;NOW MODIFY THE X,Y COORDINATE VALUES
  492. ;BY STRIPPING THEM OF THEIR ORIGINAL OFFSET(S)
  493. ;
  494. CPF2    EQU    $+OFFSET
  495.     LXI    H,ICCO        ;POINT TO VAL OF LOCAL OFFSET
  496.     LDA    BUFLOC        ;GET THE FIRST CHAR
  497.     SUB    M        ;SUBTRACT THE OFFSET
  498.     STA    BUFLOC        ;PUT IT BACK
  499.     LXI    H,ICRO        ;POINT TO VAL OF 2ND LOCAL OFFSET
  500.     LDA    BUFLOC+1    ;GET 2ND VAL FROM BUFFER
  501.     SUB    M        ;SUBTRACT THE OFFSET
  502.     STA    BUFLOC    +1    ;PUT IT BACK
  503. ;
  504. ;NOW ADD THE NEW OFFSETS TO THEM
  505. ;
  506. CPF3    EQU    $+OFFSET
  507.     LXI    H,OCCO        ;POINT TO THE OUTSTNG VALUE
  508.     LDA    BUFLOC        ;GET THE VALUE OF THE 1ST CHAR
  509.     ADD    M        ;ADD THE NEW OFFSET
  510.     STA    BUFLOC
  511.     LXI    H,OCRO        ;POINT TO THE OTHER ONE
  512.     LDA    BUFLOC+1    ;GET THE SECOND VAL FROM BUFFER
  513.     ADD    M        ;ADD THE NEW OFFSET
  514.     STA    BUFLOC+1    ;PUT IT BACK
  515.     LDA    BUFLOC        ;GET 1ST CHAR
  516.     MOV    C,A        ;PUT IT IN C
  517.     CALL    REMOUT        ;SEND IT OUT
  518.     LDA    BUFLOC+1    ;GET SECOND
  519.     MOV    C,A        ;PUT IT IN C
  520.     CALL    REMOUT        ;SEND IT OUT
  521.     MVI    A,0        ;NOW KILL THE CHARS IN THE BUFFER
  522.     STA    BUFLOC
  523.     STA    BUFLOC+1
  524.     CALL    DONE2        ;USE DONE'S ROUTINES TO CLEAR THINGS
  525. INIT9    EQU    $+OFFSET
  526.     LXI    H,CLCF        ;POINT TO THE FIRST OF THE FLAGS AND BUFFERS
  527.     LXI    B,BUFPTR-CLCF    ;# OF VARIABLES TO CLEAR
  528.     MVI    A,0        ;GET A ZERO
  529. INIT10    EQU    $+OFFSET
  530.     MOV    M,A        ;PUT IT IN THE VAR OR FLAG
  531.     DCX    B        ;BUMP COUNTER
  532.     MOV    B,A
  533.     CPI    0
  534.     RZ            ;ALLDONE, BACK TO CP/M
  535.     INX    H        ;POINT TO NEXT BYTE
  536.     MVI    A,0        ;GET THE ZERO BACK
  537.     JMP    INIT10
  538. ;********************************************
  539. ;DONE OUTPUTTING ANYTHING THAT COMES ALONG, CONVERTED AS NECESSARY
  540. ;******************************************
  541. ;
  542. ;COME HERE WITH A NEW CHARACTER, BEFORE OUTPUTING IT TO
  543. ;THE LOCAL
  544. ;
  545. STRT    EQU    $+OFFSET
  546.     MVI    A,0
  547.     STA    COUNT        ;ZERO THE COUNTER
  548.     LXI    H,BUFLOC    ;POINT TO THE BUFFER
  549. STRT1    EQU    $+OFFSET
  550.     MOV    A,M        ;GET THE CONTENTS
  551.     CPI    0        ;IS THERE A 0 THERE?
  552.     JZ    STRT2        ;YES, BUFFER IS EMPTY
  553.     LDA    COUNT        ;NO? THEN HOW MANY CHAR IN IT?
  554.     INR    A        ;LETS LOOK AT THEM AND COUNT
  555.     STA    COUNT        ;THE CHARACTERS
  556.     CPI    6        ;BETTER NOT BE MORE THAN 6
  557.     JZ    ERRXIT        ;OOPS, GOT A PROBLEM
  558.     INX    H        ;POINT TO NEXT POSITION
  559.     JMP    STRT1        ;MORE CHARS TO CHECK
  560. STRT2    EQU    $+OFFSET
  561.     MOV    M,C        ;PUT OUTBOUND CHAR INTO BUFFER
  562.     RET
  563. ;**************************************
  564. ;
  565. ;DONE... THIS IS WERE WE END UP WHEN WE WANT TO DUMP THE BUFFER TO
  566. ;        THE REMOTE.....
  567. ;
  568. DONE    EQU    $+OFFSET
  569.     MVI    B,0        ;SET COUNT TO 0
  570.     LXI    H,BUFLOC    ;POINT TO THE BUFFER
  571. DONE1    EQU    $+OFFSET
  572.     MOV    A,M        ;GET THE CHAR
  573.     CPI    0        ;IS IT A 0?
  574.     JZ    DONE2        ;RETURN IF 0
  575.     MOV    C,M        ;NOT A 0 SO GET THE CHAR
  576.     CALL    REMOUT        ;GO OUTPUT IT
  577.     MVI    A,0
  578.     MOV    M,A        ;KILL THE BUFFER CHAR
  579.     INX    H        ;POINT TO NEXT CHAR
  580.     JMP    DONE1
  581. DONE2    EQU    $+OFFSET
  582.     LXI    H,POSMTCH    ;POINT TO POSMTCH FLAG
  583.     MOV    M,A        ;PUT A ZERO THERE
  584.     LXI    H,MTSTR        ;POINT TO MATCH STR
  585.     MVI    B,5        ;SET COUNT
  586. DONE3    EQU    $+OFFSET
  587.     MOV    M,A        ;ZERO THE MTSTR ALSO    
  588.     DCR    B
  589.     CMP    B        ;IS B A 0 YET?
  590.     JZ    DONE4        ;ALL DONE
  591.     INX    H        ;POINT TO NEXT
  592.     MVI    A,0        ;GET A 0
  593.     JMP    DONE3        ;
  594. DONE4    EQU    $+OFFSET
  595.     RET
  596. ;
  597. CLCF    EQU    $+OFFSET
  598.     DB    0
  599. POSMTCH    EQU    $+OFFSET
  600.     DB    0
  601. OSPTR    EQU    $+OFFSET
  602.     DB    0,0
  603. INSPTR    EQU    $+OFFSET
  604.     DB    0,0
  605. MTSTR    EQU    $+OFFSET
  606.     DB    0,0,0,0,0,0
  607. COUNT    EQU    $+OFFSET
  608.     DB    0
  609. COUNT1    EQU    $+OFFSET
  610.     DB    0
  611. BUFLOC    EQU    $+OFFSET    ;LOCATION OF OUTBOUND BUFFERED STRING
  612.     DB    0,0,0,0,0,0,0
  613. BUFPTR    EQU    $+OFFSET
  614.     DB    0,0
  615. ;==========================================================
  616. ;END OF SCREEN COMMAND STRING FILTER SECTION.
  617. ;==========================================================