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
/
TROMPAT1.LBR
/
CSPATCH.AQM
/
CSPATCH.ASM
Wrap
Assembly Source File
|
2000-06-30
|
4KB
|
134 lines
; CSPATCH.ASM CALC STAR PATCHES FOR TURBOROM 6-5-86
;
; Works with version 1.46
;
; These patches are intended to make the arrow key definitions
; match the Micropro "STANDARD". As the Calc Star root module, CS.COM
; is overwritten, the "DE-INITIALIZATION" of the arrow keys on exit
; from CALC STAR is complicated. These patches:
;
; 1. Save the current arrow key definitions in low memory.
; 2. Change the arrow key definitions to match the MicroPRO pattern.
; 3. Move a small piece of executable code up under the BDOS
; to trap calls to the BIOS Warm Boot entry.
; 4. The Warm Boot vector (in the BIOS jump table) is saveed.
; The vector is changed to ensure that the trap code is
; executed.
; 5. The BDOS pointer in low memory is saved; then modified to
; ensure that the trap code is not overwritten.
;
; The trap module when executed:
;
; 1. Restores the original arrow key definitons
; 2. Restores the orginal BIOS Warm Boot Vector.
; 3. Restores the orginal BDOS pointer in low memory
; 4. Exits to the acutal BIOS warm boot code.
;
; USE DDT TO PATCH CS.COM:
;
; A>DDT CS.COM
; DDT VERS 2.1
; NEXT PC
; 0400 0100
; -ICSPATCH.HEX
; -R
; NEXT PC
; 0400 0100
; -G0
;
; Warm Boot
; A>SAVE 4 CS.COM
;
OLDBIOS EQU 50H ; WHERE OLD BIOS VECTOR #0 WILL BE STORED WHILE RUNNING
OLDBDOS EQU 52H ; WHERE OLD BDOS VECTOR WILL BE STORED
DINIST EQU 54H ; WHERE DEINIT STRING WILL BE FOR DEINITIALIZATION
BASE EQU 0 ; FOR REBOOTING AND REFERENCING
BDOS EQU 5 ; FOR BDOS REFERENCES
LDIR MACRO
DB 0EDH, 0B0H ; LDIR (MOVE) INSTRUCTION
ENDM
ORG 15AH ; ID STRING
DB 'CS'
ORG 100H
JMP INISUB ; INITIALIZE ARROW KEYS
ORG 300H
INISUB: LHLD BASE+1 ; GET BIOS VECTOR
LXI D,32H ; OFFSET TO KEYBOARD TABLE
DAD D ; HL--> KEYBOARD TABLE
PUSH H ; SAVE --> TO TABLE
LXI D,DINIST ; SAVE KEYBOARD TABLE IN LOW MEMORY
LXI B,4
LDIR ; LDIR (MOVE) INSTRUCTION
;
LXI H,INISTR ; SOURCE --> TO NEW VALUES
POP D ; DEST --> IS KEYBOARD TABLE
LXI B,4 ; LENGTH OF MOVE
LDIR ; MOVE NEW VALUES INTO BIOS
;
LHLD BDOS+1 ; GET BDOS VECTOR
SHLD OLDBDOS ; STORE IT ELSEWHERE IN BASE PAGE
LXI D,0-PATLEN-3 ; NEGATIVE PATCH LENGTH
DAD D ; ADD OFFSET TO MAKE TPA THAT MUCH SMALLER
SHLD BDOS+1 ; STORE NEW BDOS ADDRESS
MVI M,0C3H ; PUT JUMP THERE
INX H ; POINT TO NEXT ADDRESS
XCHG ; INTO DE
LHLD OLDBDOS ; GET REAL BDOS ADDRESS
XCHG ; INTO DE
MOV M,E ; MAKE JUMP TO REAL BDOS
INX H
MOV M,D
INX H
PUSH H
XCHG ; START OF WHERE TO PUT CODE IN DE
LXI H,DEINIT ; POINT TO CODE TO MOVE IN HL
LXI B,PATLEN ; LENGTH IN BC
LDIR ; LDIR (MOVE) INSTRUCTION
POP D ; ADDRESS OF PATCHES INTO DE
LHLD BASE+1 ; GET BIOS ADDRESS
INX H ; ADD 1 FOR STORING NEW BIOS VECTOR 0
PUSH H ; SAVE IT FOR THE MOMENT: DE HAS ADDRESS OF
PUSH D ; PATCHES, HL HAS ADDRESS OF VECTOR
MOV E,M ; GET OLD VECTOR TO OLDBIOS
INX H
MOV D,M ; BIOS COLD BOOT INTO DE
XCHG
SHLD OLDBIOS ; PUT THIS INTO OLDBIOS FOR RESTORATION LATER
POP D ; RESTORE REGS
POP H
MOV M,E ; PUT NEW VALUES IN
INX H
MOV M,D
LHLD BDOS+1 ; DO THE CODE THAT WE OVERWROTE IN THE BGINING
JMP 103H
DEINIT: LHLD OLDBDOS ; GET OLD BDOS VECTOR
SHLD BDOS+1 ; STORE IT
LHLD OLDBIOS ; GET OLD BIOS VECTOR ADDRESS 0
XCHG ; INTO DE
LHLD BASE+1 ; GET BIOS ADDRESS
INX H ; POINT TO NEXT ADDRESS (WHERE VECTOR GOES)
MOV M,E ; STORE LOW ORDER
INX H ; POINT TO NEXT
MOV M,D ; STORE HI ORDER
LHLD BASE+1 ; GET BIOS BASE ADDRESS
LXI D,32H ; NOW DEINITIALIZE KEYS...
DAD D ; THE SAME WAY WE DID ABOVE
LXI D,DINIST
XCHG
LXI B,4
LDIR ; LDIR (MOVE) INSTRUCTION
JMP 0 ; EXIT TO BIOS WARM BOOT
PATLEN EQU $-DEINIT
INISTR: DB 5, 18H, 13H, 4
END