home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / trainer / trainer.asm < prev    next >
Assembly Source File  |  1995-08-08  |  6KB  |  219 lines

  1. ;            ****************************************************
  2. ;            ***                                              ***
  3. ;            ***            Trainer for *******               ***
  4. ;            ***                                              ***
  5. ;            ***   (c) 1995 by ABACUS/1994 by DATA Becker     ***
  6. ;            ***                                              ***
  7. ;            ***   Author: Boris Bertelsons                   ***
  8. ;            ***                                              ***
  9. ;            ****************************************************
  10. ;
  11. ;
  12.  
  13. .286
  14.   w equ word ptr
  15.   b equ byte ptr
  16. code segment public
  17. public insthand
  18. public handler21
  19. public reslim
  20. public oldint21
  21. public oldint65
  22. public ID
  23. public IDlen
  24. public check_inst
  25.  
  26. assume cs:code,ds:code
  27. ID: db 'ABACUS'
  28. oldint21: dd 0
  29. oldint65: dd 0
  30. procedure: dd ?
  31. IDlen equ offset oldint21 - offset ID
  32.  
  33.  
  34. ;  *********************************************************************
  35. ;  ***                                                               ***
  36. ;  ***  The actual Trainer routines are here                         ***
  37. ;  ***                                                               ***
  38. ;  *********************************************************************
  39.  
  40.  
  41. ;  **********************************************************************
  42. ;  ***                                                                ***
  43. ;  ***  The new INT 21h. The procedure checks whether the             ***
  44. ;  ***  "in al,60h" command is in the specified location in memory,   ***
  45. ;  ***  and if necessary, replaces it                                 ***
  46. ;  ***  with "int 65h" !                                              ***
  47. ;  ***                                                                ***
  48. ;  **********************************************************************
  49. handler21 proc pascal
  50.   pushf
  51.   push bp
  52.   push ds
  53.   push bx
  54.   mov  bp,sp
  55.   mov  bx,[bp+10]  ; cs at time of interrupt to BX, DOS !!!
  56.                    ; IMPORTANT ! In TD [bp+16] !!!
  57.   add  bx,0366h    ; CS of 1st int 21h + 2136h = CS of keyboard routine
  58.   mov  ds,bx       ; cs of keyboard routine to ds
  59.   mov  bx,568Bh    ; 8B56h = mov dx,[bp+06]
  60.   cmp  ds:word ptr [0005h],bx     ; is it in the keyboard routine ?
  61.   jne  not_change
  62.   mov  ds:word ptr [0005h],9090h  ; write in int 65h !
  63.   mov  ds:word ptr [0007h],65CDh  ; write in int 65h !
  64. not_change:
  65.   pop  bx
  66.   pop  ds
  67.   pop  bp
  68.   popf
  69.   jmp dword ptr cs:oldint21       ; call old int 21h
  70. handler21 endp
  71.  
  72. ;  *************************************************************************
  73. ;  ***                                                                   ***
  74. ;  ***  Int 65h procedure. It reads in a character via "in al,60h"       ***
  75. ;  ***  and checks whether the read character was defined as the         ***
  76. ;  ***  Trainer key. If the answer is yes, the allocated memory          ***
  77. ;  ***  changes and procedure calls are executed. Enter your training    ***
  78. ;  ***  variables here !!!                                               ***
  79. ;  ***                                                                   ***
  80. ;  *************************************************************************
  81.  
  82. handler65 proc far
  83.   pushf
  84.   push bp
  85.   push ds
  86.   push bx
  87.   mov  bp,sp
  88.   mov  bx,[bp+10]  ; cs at time of interrupt to BX
  89.   in  al,60h       ; read character
  90.   cmp al,63        ; F5 key
  91.   je  Full_Shoots_j
  92.   cmp al,64        ; F6 key
  93.   je  Full_Lives_J
  94.   cmp al,65        ; F7 key
  95.   je Weapon_new_j  ;
  96.   cmp al,66        ; F8 key
  97.   je Weapon_new_j  ;
  98.   cmp al,67        ; F9 key
  99.   je Weapon_new_j  ;
  100.   cmp al,68        ; F10 key
  101.   je  More_Points_J
  102.  
  103. End_Keyb:
  104.   pop bx
  105.   pop ds
  106.   pop bp
  107.   popf
  108.   iret
  109.  
  110. Full_Shoots_j:
  111.   jmp Full_Shoots
  112. Full_Lives_j:
  113.   jmp Full_Lives
  114. More_Points_j:
  115.   jmp More_Points
  116. Weapon_new_j:
  117.   jmp Weapon_new
  118.  
  119. Full_Shoots:
  120.   pushf
  121.   PUSHA
  122.   sub  bx,0    ; since already correct CS
  123.   mov word ptr procedure+2,bx
  124.   mov  bx,1401h    ; es:[bx]  =  14EF:1401
  125.   mov word ptr procedure,bx
  126. ;--------
  127.   mov ds:byte ptr [0DA3h],20h
  128.   mov ax,20h
  129.   push ax
  130.   call dword ptr [procedure]
  131.   POPA
  132.   popf
  133.   jmp End_Keyb
  134.  
  135. Full_Lives:
  136.   pushf
  137.   pusha
  138.   sub  bx,0  ;
  139.   mov word ptr procedure+2,bx
  140.   mov  bx,1317h  ; es:[bx]  =  14EF:1317
  141.   mov word ptr procedure,bx
  142. ;-----------
  143.   mov ds:byte ptr [0DA3h],0009
  144.   mov ax,9
  145.   push ax
  146.   call dword ptr [procedure]
  147.   popa
  148.   popf
  149.   jmp End_Keyb
  150.  
  151. Weapon_new:
  152.   pushf
  153.   pusha
  154.   sub  bx,0  ;
  155.   mov word ptr procedure+2,bx
  156.   mov  bx,1454h  ; es:[bx]  =  14EF:1454
  157.   mov word ptr procedure,bx
  158. ;-----------
  159.   sub al,65
  160.   mov ah,0
  161.   mov ds:byte ptr [0DA2h],al
  162.   push ax
  163.   call dword ptr [procedure]
  164.   popa
  165.   popf
  166.   jmp End_Keyb
  167.  
  168. More_Points:
  169.   pushf
  170.   pusha
  171.   sub  bx,0  ;
  172.   mov word ptr procedure+2,bx
  173.   mov  bx,1BD0h  ; es:[bx]  =  14EF:1BD0
  174.   mov word ptr procedure,bx
  175. ;-----------
  176.   mov ax,1000
  177.   push ax
  178.   call dword ptr [procedure]
  179.   popa
  180.   popf
  181.   jmp End_Keyb
  182.  
  183. handler65 endp
  184.  
  185. insthand proc pascal
  186. reslim label byte
  187.   push ds
  188.   pop ds
  189.   mov ax,3521h                    ; store old INT 21
  190.   int 21h
  191.   mov w oldint21,bx
  192.   mov w oldint21 + 2,es
  193.   mov ax,3565h                    ; store old INT 65h
  194.   int 21h
  195.   mov w oldint65,bx
  196.   mov w oldint65 + 2,es
  197.   mov ax,2521h                    ; bend/deflect INT 21h to custom routine
  198.   lea dx,handler21
  199.   int 21h
  200.   mov ax,2565h                    ; INT 65h to custom keyboard routine
  201.   lea dx,handler65
  202.   int 21h
  203.      ret
  204. insthand endp
  205.  
  206. check_inst proc near
  207.   mov ax,3521h                    ; get interrupt vector
  208.   int 21h
  209.   mov di,bx
  210.   mov si,offset ID
  211.   mov di,si
  212.   mov cx,IDlen
  213.   repe cmpsb                      ; check for ID
  214.     ret
  215. check_inst endp
  216.  
  217. code ends
  218. end
  219.