home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cbios / dvrpatch.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  4.6 KB  |  171 lines

  1. ;        DVRPATCH.ASM ver 1.0
  2. ;          by Keith Petersen, W8SDZ
  3. ;          (revised 3/14/81)
  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. ;The patches will remain intact until the next
  9. ;cold boot.
  10. ;
  11. ;Why this is useful: if your console and/or list
  12. ;drivers are too long to fit into your CBIOS, this
  13. ;program can be used to patch them in after CP/M is
  14. ;booted.  Another use might be when some special
  15. ;drivers are temporarily needed, such as allowing
  16. ;a modem port to be patched in so it is the console
  17. ;or the list device.
  18. ;
  19. ;------------------------------------------------
  20. ;Change the following equate to an area in your high
  21. ;memory where the alternate console and list drivers
  22. ;may be located without interference to or from CP/M.
  23. ;
  24. DEST    EQU    0FB80H    ;RUNNING LOCATION OF CODE
  25. ;
  26. ;------------------------------------------------
  27. ;
  28. ;Define I/O ports and status bits
  29. ;
  30. CRTS    EQU    20H    ;CRT STATUS PORT
  31. CRTD    EQU    21H    ;CRT DATA PORT
  32. CRTRDY    EQU    04H    ;CRT TRANS. BUF. EMPTY
  33. KBDS    EQU    0EH    ;KBD STATUS PORT
  34. KBDD    EQU    0CH    ;KBD DATA PORT
  35. KBDRDY    EQU    01H    ;KBD RECEIVE DATA AVAIL.
  36. LISTS    EQU    02H    ;LIST STATUS PORT
  37. LISTD    EQU    03H    ;LIST DATA PORT
  38. LISRDY    EQU    80H    ;LIST TRANS. BUF. EMPTY
  39. ;
  40. CR    EQU    0DH    ;CARRIAGE RETURN
  41. LF    EQU    0AH    ;LINE FEED
  42. NULL    EQU    00H    ;NULL CHARACTER
  43. BDOS    EQU    0005H    ;BDOS ENTRY ADRS
  44. ;
  45.     ORG    100H
  46. ;
  47. ;Move the console and list drivers up to high RAM
  48. ;
  49. MOVEUP:    LXI    B,PEND-START+1        ;NUMBER OF BYTES TO MOVE
  50.     LXI    H,DEST+PEND-START+1    ;END OF MOVED CODE
  51.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  52. ;
  53. MVLP:    LDAX    D    ;GET BYTE
  54.     DCX    H    ;BUMP POINTERS
  55.     MOV    M,A    ;NEW HOME
  56.     DCX    D
  57.     DCX    B    ;BUMP BYTE COUNT
  58.     MOV    A,B    ;CHECK IF ZERO
  59.     ORA    C
  60.     JNZ    MVLP    ;IF NOT, DO SOME MORE
  61. ;
  62. ;Now patch CP/M to use the new drivers
  63.     LHLD    1         ;GET CP/M JUMP TABLE ADRS
  64.     LXI    D,4         ;READY TO ADD 4
  65.     DAD    D         ;HL = CONSTAT + 1
  66. ;
  67.     MVI    M,CSTAT AND 0FFH ;PATCH LSB OF JMP ADRS
  68.     INX    H
  69.     MVI    M,CSTAT SHR 8     ;PATCH MSB JMP ADRS
  70. ;
  71.     INX    H
  72.     INX    H         ;HL = CONIN + 1
  73.     MVI    M,CONIN AND 0FFH ;PATCH LSB OF JMP ADRS
  74.     INX    H
  75.     MVI    M,CONIN SHR 8     ;PATCH MSB JMP ADRS
  76. ;
  77.     INX    H
  78.     INX    H         ;HL = CONOUT + 1
  79.     MVI    M,CONOUT AND 0FFH ;MODIFY LSB JMP ADRS
  80.     INX    H
  81.     MVI    M,CONOUT SHR 8     ;MODIFY MSB JMP ADRS
  82. ;
  83.     INX    H
  84.     INX    H         ;HL = LISTOUT + 1
  85.     MVI    M,LISOUT AND 0FFH ;MODIFY LSB JMP ADRS
  86.     INX    H
  87.     MVI    M,LISOUT SHR 8     ;MODIFY MSB JMP ADRS
  88. ;
  89. ;Print message saying what has been done, then exit to CP/M
  90.     LXI    D,MSG    ;POINT TO MESSAGE
  91.     MVI    C,9    ;BDOS PRINT STRING FUNCTION
  92.     JMP    BDOS    ;PRINT MSG THEN RETURN TO CCP
  93. ;
  94. MSG:    DB    '++Alternate CONSOLE and LIST '
  95.     DB    'drivers now patched++',CR,LF,'$'
  96. ;
  97. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  98. ;
  99. OFFSET    EQU    DEST-SOURCE    ;RELOC AMOUNT
  100. ;-----------------------------------------------;
  101. ;    The following code gets moved        ;
  102. ;    to high RAM located at "DEST"        ;
  103. ;-----------------------------------------------;
  104. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  105. ;XX   C A U T I O N :  If modifying anything     XX
  106. ;XX     in this program from here on:         XX
  107. ;XX      A-L-L  labels MUST be of the form:    XX
  108. ;XX    LABEL    EQU    $+OFFSET        XX
  109. ;XX    in order that the relocation to high       XX
  110. ;XX    RAM work successfully.  Forgetting to    XX
  111. ;XX    specify '$+OFFSET' will cause the pro-    XX
  112. ;XX    gram to JMP into whatever is currently    XX
  113. ;XX    in low memory, with unpredictable    XX
  114. ;XX    results.  Be careful....        XX
  115. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  116. ;
  117. START    EQU    $+OFFSET
  118. ;
  119. ;This is the new console status routine
  120. CSTAT    EQU    $+OFFSET
  121.     IN    KBDS    ;GET KEYBOARD STATUS
  122.     ANI    KBDRDY    ;CHARACTER WAITING?
  123.     MVI    A,0
  124.     RZ        ;NO, RETURN WITH 0
  125.     CMA        ;ELSE MAKE IT 0FFH
  126.     RET
  127. ;
  128. ;This is the new console input routine
  129. CONIN    EQU    $+OFFSET
  130.     IN    KBDS    ;GET KEYBOARD STATUS
  131.     ANI    KBDRDY    ;CHARACTER WAITING?
  132.     JZ    CONIN    ;NO, LOOP AND WAIT
  133.     IN    KBDD    ;GET CHARACTER
  134.     ANI    7FH    ;STRIP PARITY
  135.     JZ    CONIN    ;IGNORE NULLS
  136.     RET
  137. ;
  138. ;This is the new console output routine
  139. CONOUT    EQU    $+OFFSET
  140.     IN    CRTS    ;GET CRT STATUS
  141.     ANI    CRTRDY    ;READY FOR CHARACTER?
  142.     JZ    CONOUT    ;NO, LOOP AND WAIT
  143.     MOV    A,C    ;GET CHARACTER
  144.     ANI    7FH    ;STRIP PARITY
  145.     RZ        ;IGNORE NULLS
  146.     CPI    7FH    ;RUBOUT?
  147.     RZ        ;YES, IGNORE IT
  148.     OUT    CRTD    ;ELSE SEND TO CRT
  149.     RET
  150. ;
  151. ;This is the new list output routine
  152. LISOUT    EQU    $+OFFSET
  153.     IN    LISTS    ;GET LIST STATUS
  154.     ANI    LISRDY    ;READY FOR CHARACTER?
  155.     JZ    LISOUT    ;NO, LOOP AND WAIT
  156.     MOV    A,C    ;GET CHARACTER
  157.     ANI    7FH    ;STRIP PARITY
  158.     OUT    LISTD    ;SEND TO PRINTER
  159.     CPI    LF    ;WAS IT A LINE FEED?
  160.     RNZ        ;NO, RETURN
  161. ;
  162. ;Send NULL to printer to allow time for carriage to return
  163.     MVI    C,NULL    ;GET A NULL
  164.     CALL    LISOUT    ;SEND IT TO PRINTER
  165.     MVI    C,LF    ;RESTORE LINE FEED
  166.     RET
  167. ;
  168. PEND    EQU    $+OFFSET ;END OF RELOCATED CODE
  169. ;
  170.     END
  171.