home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / PASCUTIL.ZIP / PASCLSVC.ASM < prev    next >
Encoding:
Assembly Source File  |  1985-11-07  |  3.1 KB  |  86 lines

  1.  page 60,132
  2.  TITLE CALLSVC  issues bios/dos interrupt for PC PASCAL program
  3. ;
  4. ; THIS ROUTINE ASSUMES IT IS CALLED FROM PC PASCAL
  5. ;IT CAN BE USED TO DIRECTLY INVOKE ANY BIOS/DOS INTERRUPT
  6. ;EXCEPT DOS INT 20 WHICH  REQUIRES SETTING THE CS REGISTER
  7. ;THE ABOVE IS AN EXIT WHICH CAN BE DONE VIA THE ABORT FUNCTION.
  8. ;
  9. ;  TO INVOKE THIS PROGRAM A RECORD IS PASSED AS THE ONLY
  10. ;PARM.  THIS RECORD CONTAINS BEFORE AND AFTER SETTINGS
  11. ;FOR MOST OF THE REGISTERS IN THE 8088/86
  12. ;
  13. ;    CALLSVC  (VAR  : T_PARM_CALLSVC) ;
  14. ;
  15. ;  THE FORMAT OF THE RECORD IS DEFINED IN THE
  16. ;FILE CALLSVC.ENT
  17. ;
  18. ZSVC    SEGMENT 'CODE'
  19.           PUBLIC CALLSVC
  20. CALLSVC   PROC   FAR
  21.           ASSUME CS:ZSVC,DS:NOTHING,ES:NOTHING,SS:NOTHING
  22.           PUSH   BP      ;SAVE FRAME POINTER
  23.           MOV    BP,SP   ;FOR PARMS ADDRESSING
  24.           PUSH   BX      ;SAVE CALLERS REGISTERS
  25.           PUSH   CX      ;
  26.           PUSH   DX      ;
  27.           PUSH   SI      ;
  28.           PUSH   DI      ;
  29.           PUSH   DS      ;
  30.           PUSH   ES      ;
  31.           MOV    BX,[BP+6] ;GET POINTER TO RECORD
  32.           MOV    AL,[BX]    ;GET INTERRUPT
  33.           LEA    SI,INT+1   ;GET INSTRUCTION LOCATION
  34.           PUSH   DS      ;SAVE IT
  35.           PUSH   CS      ;FAKE OUT ASSEMBLER
  36.           POP    DS      ;INTO LETTING ME STORE IN CODE AREA
  37.           MOV    [SI],AL ;MOVE DAT INTERRUPT NUMBER
  38.           POP    DS      ;RESTORE ORIGINAL
  39. ;                         SET UP REGS FOR INTERRUPT/SVC
  40.           MOV    AX,[BX+2]
  41.           MOV    CX,[BX+6]
  42.           MOV    DX,[BX+8]
  43.           MOV    DI,[BX+12]
  44.           MOV    ES,[BX+16]
  45.           MOV    SI,[BX+10]
  46. ;                         THINGS NOW GET A LITTLE TRICKY
  47.           PUSH   BP      ; SAVE PTR TO PARMS
  48.           MOV    BP,[BX+4] ;GET INPUT BX CONTENTS
  49.           PUSH   BP        ;SAVE IT TEMPORARILY
  50.           MOV    BP,[BX+14] ;GET INPUT DS CONTENTS
  51.           PUSH   BP        ;SAVE IT TEMPORARILY
  52.           POP    DS         ;PUT RECORD VALUE IN DS
  53.           POP    BX         ; SAME FOR BX
  54. INT:      INT    0          ;DO THE INTERRUPT
  55.           POP    BP         ;RESTORE GOOD STUFF
  56.           PUSHF             ;SAVE FLAGS
  57.           PUSH   BX         ;SAVE BX AFTER SVC
  58.           PUSH   DS         ;SAME
  59.           MOV    DS,SS:[BP-12] ;FISH ORIGINAL DS FROM STACK
  60.           MOV    BX,[BP+6]  ; GET RECORD ADDRESS
  61.           MOV    [BX+18],AX ; START STUFFING WITH RESULTS
  62.           MOV    [BX+22],CX
  63.           MOV    [BX+24],DX
  64.           MOV    [BX+26],SI
  65.           MOV    [BX+28],DI
  66.           MOV    [BX+32],ES
  67.           POP    SI         ;GET DS RESULT
  68.           MOV    [BX+30],SI
  69.           POP    SI         ;GET BX RESULT
  70.           MOV    [BX+20],SI
  71.           POP    SI         ;GET FLAGS
  72.           MOV    [BX+34],SI
  73. ;   INTERUPT COMPLETE RESTORE REGS AND EXIT
  74.           POP    ES
  75.           POP    DS
  76.           POP    DI
  77.           POP    SI
  78.           POP    DX
  79.           POP    CX
  80.           POP    BX
  81.           POP    BP
  82.           RET    2           ;POP PAST PARMS
  83. CALLSVC   ENDP
  84. ZSVC      ENDS
  85.           END
  86.