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 / KAYPRO / ADVENT1.ARK / CSPATCH.ASM < prev    next >
Assembly Source File  |  1986-09-19  |  4KB  |  134 lines

  1. ; CSPATCH.ASM  CALC STAR PATCHES FOR TURBOROM 6-5-86
  2. ;
  3. ; Works with version 1.46
  4. ;
  5. ; These patches are intended to make the arrow key definitions
  6. ; match the Micropro "STANDARD".  As the Calc Star root module, CS.COM
  7. ; is overwritten, the "DE-INITIALIZATION" of the arrow keys on exit
  8. ; from CALC STAR is complicated.  These patches:
  9. ;
  10. ;    1. Save the current arrow key definitions in low memory.
  11. ;    2. Change the arrow key definitions to match the MicroPRO pattern.
  12. ;    3. Move a small piece of executable code up under the BDOS
  13. ;       to trap calls to the BIOS Warm Boot entry.
  14. ;    4. The Warm Boot vector (in the BIOS jump table) is saveed.  
  15. ;       The vector is changed to ensure that the trap code is
  16. ;    executed.
  17. ;    5. The BDOS pointer in low memory is saved; then modified to
  18. ;     ensure that the trap code is not overwritten.
  19. ;
  20. ; The trap module when executed:
  21. ;
  22. ;    1. Restores the original arrow key definitons
  23. ;    2. Restores the orginal BIOS Warm Boot Vector.
  24. ;    3. Restores the orginal BDOS pointer in low memory
  25. ;    4. Exits to the acutal BIOS warm boot code. 
  26. ;
  27. ; USE DDT TO PATCH CS.COM:
  28. ;
  29. ; A>DDT CS.COM
  30. ; DDT VERS 2.1
  31. ; NEXT PC
  32. ; 0400 0100
  33. ; -ICSPATCH.HEX
  34. ; -R
  35. ; NEXT PC
  36. ; 0400 0100
  37. ; -G0
  38. ;
  39. ; Warm Boot 
  40. ; A>SAVE 4 CS.COM
  41. ;
  42. OLDBIOS    EQU    50H    ; WHERE OLD BIOS VECTOR #0 WILL BE STORED WHILE RUNNING
  43. OLDBDOS    EQU    52H    ; WHERE OLD BDOS VECTOR WILL BE STORED
  44. DINIST    EQU    54H    ; WHERE DEINIT STRING WILL BE FOR DEINITIALIZATION
  45.  
  46. BASE    EQU    0    ; FOR REBOOTING AND REFERENCING
  47. BDOS    EQU    5    ; FOR BDOS REFERENCES
  48.  
  49.  
  50. LDIR    MACRO
  51.     DB    0EDH, 0B0H    ; LDIR (MOVE) INSTRUCTION
  52.     ENDM
  53.  
  54.     ORG    15AH    ; ID STRING
  55.     DB    'CS'
  56.  
  57.     ORG    100H
  58.     JMP    INISUB        ; INITIALIZE ARROW KEYS
  59.  
  60.     ORG    300H
  61.  
  62. INISUB:    LHLD    BASE+1        ; GET BIOS VECTOR
  63.     LXI    D,32H        ; OFFSET TO KEYBOARD TABLE
  64.     DAD    D        ; HL--> KEYBOARD TABLE
  65.     PUSH    H        ; SAVE --> TO TABLE
  66.     LXI    D,DINIST    ; SAVE KEYBOARD TABLE IN LOW MEMORY
  67.     LXI    B,4
  68.     LDIR            ; LDIR (MOVE) INSTRUCTION
  69. ;
  70.     LXI    H,INISTR    ; SOURCE --> TO NEW VALUES
  71.     POP    D        ; DEST --> IS KEYBOARD TABLE
  72.     LXI    B,4        ; LENGTH OF MOVE
  73.     LDIR            ; MOVE NEW VALUES INTO BIOS
  74. ;
  75.     LHLD    BDOS+1        ; GET BDOS VECTOR
  76.     SHLD    OLDBDOS        ; STORE IT ELSEWHERE IN BASE PAGE
  77.     LXI    D,0-PATLEN-3    ; NEGATIVE PATCH LENGTH
  78.     DAD    D        ; ADD OFFSET TO MAKE TPA THAT MUCH SMALLER
  79.     SHLD    BDOS+1        ; STORE NEW BDOS ADDRESS
  80.     MVI    M,0C3H        ; PUT JUMP THERE
  81.     INX    H        ; POINT TO NEXT ADDRESS
  82.     XCHG            ; INTO DE
  83.     LHLD    OLDBDOS        ; GET REAL BDOS ADDRESS
  84.     XCHG            ; INTO DE
  85.     MOV    M,E        ; MAKE JUMP TO REAL BDOS
  86.     INX    H
  87.     MOV    M,D
  88.     INX    H
  89.     PUSH    H
  90.     XCHG            ; START OF WHERE TO PUT CODE IN DE
  91.     LXI    H,DEINIT    ; POINT TO CODE TO MOVE IN HL
  92.     LXI    B,PATLEN    ; LENGTH IN BC
  93.     LDIR            ; LDIR (MOVE) INSTRUCTION
  94.     POP    D        ; ADDRESS OF PATCHES INTO DE
  95.     LHLD    BASE+1        ; GET BIOS ADDRESS
  96.     INX    H        ; ADD 1 FOR STORING NEW BIOS VECTOR 0
  97.     PUSH    H        ; SAVE IT FOR THE MOMENT: DE HAS ADDRESS OF
  98.     PUSH    D        ; PATCHES, HL HAS ADDRESS OF VECTOR
  99.     MOV    E,M        ; GET OLD VECTOR TO OLDBIOS
  100.     INX    H
  101.     MOV    D,M        ; BIOS COLD BOOT INTO DE
  102.     XCHG
  103.     SHLD    OLDBIOS        ; PUT THIS INTO OLDBIOS FOR RESTORATION LATER
  104.     POP    D        ; RESTORE REGS
  105.     POP    H
  106.     MOV    M,E        ; PUT NEW VALUES IN
  107.     INX    H
  108.     MOV    M,D
  109.     LHLD    BDOS+1        ; DO THE CODE THAT WE OVERWROTE IN THE BGINING
  110.     JMP    103H
  111.  
  112. DEINIT:    LHLD    OLDBDOS        ; GET OLD BDOS VECTOR
  113.     SHLD    BDOS+1        ; STORE IT
  114.     LHLD    OLDBIOS        ; GET OLD BIOS VECTOR ADDRESS 0
  115.     XCHG            ; INTO DE
  116.     LHLD    BASE+1        ; GET BIOS ADDRESS
  117.     INX    H        ; POINT TO NEXT ADDRESS (WHERE VECTOR GOES)
  118.     MOV    M,E        ; STORE LOW ORDER
  119.     INX    H        ; POINT TO NEXT
  120.     MOV    M,D        ; STORE HI ORDER
  121.     LHLD    BASE+1        ; GET BIOS BASE ADDRESS
  122.     LXI    D,32H        ; NOW DEINITIALIZE KEYS...
  123.     DAD    D        ; THE SAME WAY WE DID ABOVE
  124.     LXI    D,DINIST
  125.     XCHG
  126.     LXI    B,4
  127.     LDIR            ; LDIR (MOVE) INSTRUCTION
  128.     JMP    0        ; EXIT TO BIOS WARM BOOT
  129. PATLEN    EQU    $-DEINIT
  130.  
  131. INISTR:    DB    5, 18H, 13H, 4
  132.  
  133.     END
  134.