home *** CD-ROM | disk | FTP | other *** search
- ; 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