home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1989 / 06 / sysint.asm < prev    next >
Assembly Source File  |  1988-07-15  |  3KB  |  65 lines

  1. CODE    SEGMENT
  2.         ASSUME  CS:CODE, DS:CODE
  3.         ORG     100H
  4.  
  5. SYSINT  PROC    FAR
  6.         PUSH    BP              ; Save BP - required for BASIC
  7.         MOV     BP,SP           ; Get variable descriptor address
  8.         MOV     BX,[BP+10]      ; Get address of INT no.
  9.         MOV     AX,[BX]         ; Put interrupt number in AX
  10.         MOV     BX,[BP+6]       ; Get REG.OUT%() descriptor
  11.         MOV     CX,BX           ; Store address in CX for now
  12.         MOV     BX,[BP+8]       ; Get REG.IN%() descriptor
  13.         PUSH    ES              ; Save ES - required for BASIC
  14.         PUSH    DS              ; Save DS - required for BASIC
  15.         CALL    BEGIN           ; Skip past data
  16. REG_OUT DW      ?               ; [BP] pointer to REG.OUT%(0)
  17.  
  18. INT     PROC    NEAR            ; Called to execute interrupt
  19.         INT     0               ; [BP+3] where we place Int number
  20.         RET                     ; Return
  21. INT     ENDP
  22.  
  23. BEGIN:  POP     BP              ; Get base address for variables
  24.         MOV     [BP+3],AL       ; Put interrupt number into this code
  25.         MOV     [BP],CX         ; Store REG.OUT%(0) address
  26.         MOV     CX,[BX+4]       ; Set CX from REG.IN%(2)
  27.         MOV     DX,[BX+6]       ; Set DX from REG.IN%(3)
  28.         MOV     SI,[BX+8]       ; Set SI from REG.IN%(4)
  29.         MOV     DI,[BX+10]      ; Set DI from REG.IN%(5)
  30.         MOV     AX,[BX+14]      ; Put ES in AX
  31.         CMP     AX,0FFFFH       ; Is it -1?
  32.         JE      DEF_ES          ; If yes, take default value
  33.         MOV     ES,AX           ; otherwise set ES
  34. DEF_ES:
  35.         MOV     AX,[BX+12]      ; Get DS in AX
  36.         CMP     AX,0FFFFH       ; Is it -1?
  37.         JE      DEF_DS          ; If yes, take default value
  38.         MOV     DS,AX           ; otherwise set DS
  39. DEF_DS:
  40.         MOV     AX,SS:[BX]      ; Set AX from REG.IN%(0) - SS still points
  41.                                 ; to BASIC dataseg, even if DS doesn't
  42.         MOV     BX,SS:[BX+2]    ; Set BX from REG.IN%(2)
  43.         CALL    INT             ; Execute interrupt
  44.         PUSH    BX              ; Save returned BX temporarily
  45.         MOV     BX,SS:[BP]      ; Set BX to base REG.OUT%() address
  46.         MOV     SS:[BX],AX      ; Set AX in REG.OUT%(0)
  47.         POP     SS:[BX+2]       ; Set BX in REG.OUT%(1)
  48.         MOV     AX,DS           ; Get DS in AX
  49.         MOV     SS:[BX+12],AX   ; Set DS in REG.OUT%(6)
  50.         POP     DS              ; Get old DS - DS now points to BASIC dataseg
  51.         MOV     AX,ES           ; Get returned ES in AX
  52.         MOV     [BX+14],AX      ; Set ES in REG.OUT%(7)
  53.         POP     ES              ; Get old ES
  54.         MOV     [BX+4],CX       ; Set CX in REG.OUT%(2)
  55.         MOV     [BX+6],DX       ; Set DX in REG.OUT%(3)
  56.         MOV     [BX+8],SI       ; Set SI in REG.OUT%(4)
  57.         MOV     [BX+10],DI      ; Set DI in REG.OUT%(5)
  58.  
  59.         POP     BP              ; Get original BP for BASIC
  60.         RET     6               ; Return, skipping 3 parameters
  61. SYSINT  ENDP
  62. CODE    ENDS
  63.         END     SYSINT
  64.  
  65.