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 / MODEMS / MODEM / MODEMPAT.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  6KB  |  197 lines

  1. ;        MODEMPAT.ASM ver 1.0
  2. ;          by Keith Petersen, W8SDZ
  3. ;          (revised 4/25/82)
  4. ;
  5. ;This program moves alternate console and list
  6. ;drivers into high memory and then patches CP/M
  7. ;to use them instead of the regular CBIOS routines.
  8. ;These routines include poling of both the normal
  9. ;console port and an external serial port, allowing
  10. ;a modem to be connected to the system as a second
  11. ;console.  This program is not intended for automatic
  12. ;operation - just as a way to give temporary control
  13. ;of the system to the modem.  The patches will remain
  14. ;intact until the next cold boot.
  15. ;
  16. ;------------------------------------------------
  17. ;Change the following equate to an area in your high
  18. ;memory where the alternate console and list drivers
  19. ;may be located without interference to or from CP/M.
  20. ;
  21. DEST    EQU    0FB80H    ;RUNNING LOCATION OF CODE
  22. ;
  23. ;------------------------------------------------
  24. ;
  25. ;Define I/O ports and status bits
  26. ;
  27. CRTS    EQU    20H    ;CRT STATUS PORT
  28. CRTD    EQU    21H    ;CRT DATA PORT
  29. CRTTBE    EQU    04H    ;CRT TRANS. BUF. EMPTY
  30. ;
  31. KBDS    EQU    0EH    ;KBD STATUS PORT
  32. KBDD    EQU    0CH    ;KBD DATA PORT
  33. KBDRDA    EQU    01H    ;KBD RECEIVE DATA AVAIL.
  34. ;
  35. MODSTA    EQU    02H    ;MODEM STATUS PORT
  36. MODDAT    EQU    03H    ;MODEM DATA PORT
  37. MODTBE    EQU    80H    ;MODEM TRANS. BUF. EMPTY
  38. MODRDA    EQU    40H    ;MODEM RECEIVE DATA AVAIL.
  39. ;
  40. NRNULL    EQU    9    ;NUMBER OF NULLS NEEDED FOR MODEM
  41. ;
  42. CR    EQU    0DH    ;CARRIAGE RETURN
  43. LF    EQU    0AH    ;LINE FEED
  44. NULL    EQU    00H    ;NULL CHARACTER
  45. BDOS    EQU    0005H    ;BDOS ENTRY ADRS
  46. ;
  47.     ORG    100H
  48. ;
  49. ;Move the console and list drivers up to high RAM
  50. ;
  51. MOVEUP:    LXI    B,PEND-START+1        ;NUMBER OF BYTES TO MOVE
  52.     LXI    H,DEST+PEND-START+1    ;END OF MOVED CODE
  53.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  54. ;
  55. MVLP:    LDAX    D    ;GET BYTE
  56.     DCX    H    ;BUMP POINTERS
  57.     MOV    M,A    ;NEW HOME
  58.     DCX    D
  59.     DCX    B    ;BUMP BYTE COUNT
  60.     MOV    A,B    ;CHECK IF ZERO
  61.     ORA    C
  62.     JNZ    MVLP    ;IF NOT, DO SOME MORE
  63. ;
  64. ;Now patch CP/M to use the new drivers
  65.     LHLD    1         ;GET CP/M JUMP TABLE ADRS
  66.     LXI    D,4         ;READY TO ADD 4
  67.     DAD    D         ;HL = CONSTAT + 1
  68. ;
  69.     MVI    M,CSTAT AND 0FFH ;PATCH LSB OF JMP ADRS
  70.     INX    H
  71.     MVI    M,CSTAT SHR 8     ;PATCH MSB JMP ADRS
  72. ;
  73.     INX    H
  74.     INX    H         ;HL = CONIN + 1
  75.     MVI    M,CONIN AND 0FFH ;PATCH LSB OF JMP ADRS
  76.     INX    H
  77.     MVI    M,CONIN SHR 8     ;PATCH MSB JMP ADRS
  78. ;
  79.     INX    H
  80.     INX    H         ;HL = CONOUT + 1
  81.     MVI    M,CONOUT AND 0FFH ;MODIFY LSB JMP ADRS
  82.     INX    H
  83.     MVI    M,CONOUT SHR 8     ;MODIFY MSB JMP ADRS
  84. ;
  85.     INX    H
  86.     INX    H         ;HL = LISTOUT + 1
  87.     MVI    M,LISOUT AND 0FFH ;MODIFY LSB JMP ADRS
  88.     INX    H
  89.     MVI    M,LISOUT SHR 8     ;MODIFY MSB JMP ADRS
  90. ;
  91. ;Print message saying what has been done, then exit to CP/M
  92.     LXI    D,MSG    ;POINT TO MESSAGE
  93.     MVI    C,9    ;BDOS PRINT STRING FUNCTION
  94.     JMP    BDOS    ;PRINT MSG THEN RETURN TO CCP
  95. ;
  96. MSG:    DB    '++Dual CONSOLE and MODEM '
  97.     DB    'drivers now patched++',CR,LF,'$'
  98. ;
  99. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  100. ;
  101. OFFSET    EQU    DEST-SOURCE    ;RELOC AMOUNT
  102. ;-----------------------------------------------;
  103. ;    The following code gets moved        ;
  104. ;    to high RAM located at "DEST"        ;
  105. ;-----------------------------------------------;
  106. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  107. ;XX   C A U T I O N :  If modifying anything     XX
  108. ;XX     in this program from here on:         XX
  109. ;XX      A-L-L  labels MUST be of the form:    XX
  110. ;XX    LABEL    EQU    $+OFFSET        XX
  111. ;XX    in order that the relocation to high       XX
  112. ;XX    RAM work successfully.  Forgetting to    XX
  113. ;XX    specify '$+OFFSET' will cause the pro-    XX
  114. ;XX    gram to JMP into whatever is currently    XX
  115. ;XX    in low memory, with unpredictable    XX
  116. ;XX    results.  Be careful....        XX
  117. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  118. ;
  119. START    EQU    $+OFFSET
  120. ;
  121. ;This is the new dual console status routine
  122. CSTAT    EQU    $+OFFSET
  123.     IN    MODSTA    ;GET MODEM STATUS
  124.     ANI    MODRDA    ;CHARACTER WAITING?
  125.     MVI    A,0FFH    ;IN CASE ONE IS
  126.     RNZ        ;RETURN IF CHAR WAITING
  127.     IN    KBDS    ;GET KEYBOARD STATUS
  128.     ANI    KBDRDA    ;CHARACTER WAITING?
  129.     MVI    A,0
  130.     RZ        ;NO, RETURN WITH 0
  131.     CMA        ;ELSE MAKE IT 0FFH
  132.     RET
  133. ;
  134. ;This is the new console input routine
  135. CONIN    EQU    $+OFFSET
  136.     IN    KBDS    ;GET KEYBOARD STATUS
  137.     ANI    KBDRDA    ;CHARACTER WAITING?
  138.     JZ    MDMIN    ;NO, GO CHECK MODEM
  139.     IN    KBDD    ;GET CHARACTER
  140.     ANI    7FH    ;STRIP PARITY
  141.     JZ    CONIN    ;IGNORE NULLS
  142.     RET
  143. ;
  144. ;This is the new modem input routine
  145. MDMIN    EQU    $+OFFSET
  146.     IN    MODSTA    ;GET MODEM STATUS
  147.     ANI    MODRDA    ;CHARACTER WAITING?
  148.     JZ    CONIN    ;NO, LOOP AND WAIT
  149.     IN    MODDAT    ;GET CHARACTER
  150.     ANI    7FH    ;STRIP PARITY
  151.     JZ    CONIN    ;IGNORE NULLS
  152.     RET
  153. ;
  154. ;This is the new console output routine
  155. CONOUT    EQU    $+OFFSET
  156.     IN    CRTS    ;GET CRT STATUS
  157.     ANI    CRTTBE    ;READY FOR CHARACTER?
  158.     JZ    CONOUT    ;NO, LOOP AND WAIT
  159.     MOV    A,C    ;GET CHARACTER
  160.     ANI    7FH    ;STRIP PARITY
  161.     RZ        ;IGNORE NULLS
  162.     CPI    7FH    ;RUBOUT?
  163.     RZ        ;YES, IGNORE IT
  164.     OUT    CRTD    ;ELSE SEND TO CRT
  165. ;
  166. ;This is the new modem output routine
  167. MDMOUT    EQU    $+OFFSET
  168.     IN    MODSTA    ;GET MODEM STATUS
  169.     ANI    MODTBE    ;READY FOR CHARACTER?
  170.     JZ    MDMOUT    ;NO, LOOP AND WAIT
  171.     MOV    A,C    ;GET CHARACTER
  172.     ANI    7FH    ;STRIP PARITY
  173.     OUT    MODDAT    ;SEND TO MODEM
  174.     CPI    LF    ;WAS IT A LINE FEED?
  175.     RNZ        ;NO, RETURN
  176. ;
  177. ;Send NULL to modem to allow time for carriage to return
  178.     PUSH    B    ;SAVE LINE FEED
  179.     MVI    B,NRNULL ;NUMBER OF NULLS
  180. ;
  181. NULOOP    EQU    $+OFFSET
  182.     MVI    C,NULL    ;GET A NULL
  183.     CALL    MDMOUT    ;SEND IT TO MODEM
  184.     DCR    B    ;ANY MORE TO SEND?
  185.     JNZ    NULOOP    ;YES, GO SEND MORE
  186.     POP    B    ;RESTORE LINE FEED
  187.     RET
  188. ;
  189. LISOUT    EQU    $+OFFSET
  190.     RET        ;LIST OUTPUT DISABLED
  191. ;
  192. PEND    EQU    $+OFFSET ;END OF RELOCATED CODE
  193. ;
  194. ENDMARK    EQU    $+OFFSET ;! IGNORE ERROR MESSAGE
  195. ;
  196.     END
  197.