home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / cbios / lstpatch.aqm / LSTPATCH.ASM
Assembly Source File  |  1985-02-09  |  4KB  |  126 lines

  1. ;        LSTPATCH.ASM ver 1.0
  2. ;          by Keith Petersen, W8SDZ
  3. ;          (revised 12/29/84)
  4. ;
  5. ;This program moves an alternate list driver into high
  6. ;memory and then patches CP/M to use it instead of the
  7. ;regular CBIOS list routine.  The patch will remain
  8. ;intact until the next cold boot.
  9. ;
  10. ;Why this is useful: if your list driver is too long
  11. ;to fit into your CBIOS or the list STAT routine is
  12. ;not implemented, this program can be used to patch it
  13. ;in after CP/M is booted.  Another use would be if
  14. ;a temporary list driver is needed for an otherwise
  15. ;unimplemented port.
  16. ;
  17. ;------------------------------------------------
  18. ;Change the following equate to an area in your high
  19. ;memory where the alternate list driver may be located
  20. ;without interference to or from CP/M.
  21. ;
  22. DEST    EQU    0FB80H        ;running location of code
  23. ;
  24. ;------------------------------------------------
  25. ;
  26. ;Define I/O ports and status bits
  27. ;
  28. LISTS    EQU    02H        ;list status port
  29. LISTD    EQU    03H        ;list data port
  30. LISRDY    EQU    80H        ;list trans. buf. empty
  31. ;
  32. CR    EQU    0DH        ;carriage return
  33. LF    EQU    0AH        ;line feed
  34. NULL    EQU    00H        ;null character
  35. BDOS    EQU    0005H        ;BDOS entry adrs
  36. ;
  37.     ORG    100H
  38. ;
  39. ;Move the console and list drivers up to high ram
  40. ;
  41. MOVEUP:    LXI    B,PEND-START+1        ;number of bytes to move
  42.     LXI    H,DEST+PEND-START+1 ;end of moved code
  43.     LXI    D,SOURCE+PEND-START ;end of source code
  44. ;
  45. MVLP:    LDAX    D        ;get byte
  46.     DCX    H        ;bump pointers
  47.     MOV    M,A        ;new home
  48.     DCX    D
  49.     DCX    B        ;bump byte count
  50.     MOV    A,B        ;check if zero
  51.     ORA    C
  52.     JNZ    MVLP        ;if not, do some more
  53. ;
  54. ;now patch cp/m to use the new drivers
  55.     LHLD    1        ;get CP/M jump table adrs
  56.     LXI    D,13        ;ready to add 13
  57.     DAD    D        ;HL = LISTOUT + 1
  58. ;
  59.     MVI    M,LISOUT AND 0FFH ;modify LSB jmp adrs
  60.     INX    H
  61.     MVI    M,LISOUT SHR 8      ;modify MSB jmp adrs
  62.     LXI    D,29          ;ready to add 29
  63.     DAD    D          ;hl = lststat + 1
  64.     MVI    M,LSTSTAT AND 0FFH ;modify LSB jmp adrs
  65.     INX    H
  66.     MVI    M,LSTSTAT SHR 8       ;modify MSB jmp adrs
  67. ;
  68. ;Print message saying what has been done, then exit to CP/M
  69.     LXI    D,MSG        ;point to message
  70.     MVI    C,9        ;bdos print string function
  71.     JMP    BDOS        ;print msg then return to CCP
  72. ;
  73. MSG:    DB    '++Alternate LIST driver now patched++',CR,LF,'$'
  74. ;
  75. SOURCE    EQU    $        ;boundary memory marker
  76. ;
  77. OFFSET    EQU    DEST-SOURCE    ;reloc amount
  78. ;-----------------------------------------------;
  79. ;    The following code gets moved        ;
  80. ;    to high RAM located at "DEST"        ;
  81. ;-----------------------------------------------;
  82. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  83. ;xx   C A U T I O N :  if modifying anything    xx
  84. ;xx    in this program from here on:        xx
  85. ;xx    A-L-L  labels must be of the form:    xx
  86. ;xx    LABEL    EQU    $+OFFSET        xx
  87. ;xx    in order that the relocation to high    xx
  88. ;xx    RAM work successfully.    Forgetting to    xx
  89. ;xx    specify '$+OFFSET' will cause the pro-    xx
  90. ;xx    gram to JMP into whatever is currently    xx
  91. ;xx    in low memory, with unpredictable    xx
  92. ;xx    results.  Be careful....        xx
  93. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  94. ;
  95. START    EQU    $+OFFSET
  96. ;
  97. ;This is the new list output routine
  98. LISOUT    EQU    $+OFFSET
  99.     IN    LISTS        ;get list status
  100.     ANI    LISRDY        ;ready for character?
  101.     JZ    LISOUT        ;no, loop and wait
  102.     MOV    A,C        ;get character
  103.     ANI    7FH        ;strip parity
  104.     OUT    LISTD        ;send to printer
  105.     CPI    LF        ;was it a line feed?
  106.     RNZ            ;no, return
  107. ;
  108. ;Send null to printer to allow time for carriage to return
  109.     MVI    C,NULL        ;get a null
  110.     CALL    LISOUT        ;send it to printer
  111.     MVI    C,LF        ;restore line feed
  112.     RET
  113. ;
  114. ;This is the new list status routine
  115. LSTSTAT    EQU    $+OFFSET
  116.     IN    LISTS        ;get list status
  117.     ANI    LISRDY        ;ready for character?
  118.     MVI    A,0
  119.     RZ            ;no, return with 0
  120.     CMA            ;else make it 0ffh
  121.     RET
  122. ;
  123. PEND    EQU    $+OFFSET    ;end of relocated code
  124. ;
  125.     END
  126.