home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pctech / 1986_08 / atbench / time.asm < prev   
Assembly Source File  |  1986-04-27  |  54KB  |  1,142 lines

  1.                 NAME    TIME
  2.  
  3. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  4. _TEXT   ENDS
  5. CONST   SEGMENT  WORD PUBLIC 'CONST'
  6. CONST   ENDS
  7. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  8. _BSS    ENDS
  9. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  10. _DATA   ENDS
  11. DGROUP  GROUP   CONST,  _BSS,   _DATA
  12.         ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  13.  
  14. TESTSEG SEGMENT WORD PUBLIC 'TEST'
  15.  
  16. TESTSEG_START   DW      32767 DUP (?)
  17.  
  18. TESTSEG ENDS
  19.  
  20. PPI_PORT        EQU     061H
  21. TIMER2_PORT     EQU     042H
  22. TIMER_CTRL      EQU     043H
  23.  
  24. _DATA           SEGMENT
  25.  
  26. EMMBASE         DW      9000H
  27. PID             DW      ?
  28. EMM_NAME        DB      "EMMXXXX0"
  29.  
  30. _DATA           ENDS
  31.  
  32. _TEXT           SEGMENT
  33.  
  34. ;***************************************************************;
  35. ;                                                               ;
  36. ;       _MULTIME                                                ;
  37. ;                                                               ;
  38. ;       TIME EXECUTION OF MULTIPLY INSTRUCTIONS                 ;
  39. ;                                                               ;
  40. ;***************************************************************;
  41.  
  42.                 PUBLIC  _MULTIME
  43. _MULTIME        PROC    NEAR
  44.  
  45.         PUSH    BP                      ; SAVE FRAME
  46.         MOV     BP, SP                  ;
  47.         PUSH    DI                      ; SAVE DI
  48.         CALL    SETUP_TIMER             ; SET UP TIMER
  49.         MOV     DI, 0                   ; CLEAR DI
  50.         MOV     AX, [BP+4]              ; GET COUNT ARGUMENT
  51.         ADD     AX, 99                  ; ROUND UP
  52.         MOV     CX, 100                 ; DIVIDE BY 100 =
  53.         DIV     CL                      ;  NUMBER OF INSTRUCTIONS
  54.         MOV     CL, AL                  ;  PER PASS
  55.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  56.         MOV     BL, AL                  ; SAVE IN BL
  57.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  58.         CLI                             ; STOP INTERRUPTS
  59.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  60. ML:     MUL     DI                      ; DO 100 MULTIPLIES
  61.         MUL     DI                      ;
  62.         MUL     DI                      ;
  63.         MUL     DI                      ;
  64.         MUL     DI                      ;
  65.         MUL     DI                      ;
  66.         MUL     DI                      ;
  67.         MUL     DI                      ;
  68.         MUL     DI                      ;
  69.         MUL     DI                      ;
  70.         MUL     DI                      ;
  71.         MUL     DI                      ;
  72.         MUL     DI                      ;
  73.         MUL     DI                      ;
  74.         MUL     DI                      ;
  75.         MUL     DI                      ;
  76.         MUL     DI                      ;
  77.         MUL     DI                      ;
  78.         MUL     DI                      ;
  79.         MUL     DI                      ;
  80.         MUL     DI                      ;
  81.         MUL     DI                      ;
  82.         MUL     DI                      ;
  83.         MUL     DI                      ;
  84.         MUL     DI                      ;
  85.         MUL     DI                      ;
  86.         MUL     DI                      ;
  87.         MUL     DI                      ;
  88.         MUL     DI                      ;
  89.         MUL     DI                      ;
  90.         MUL     DI                      ;
  91.         MUL     DI                      ;
  92.         MUL     DI                      ;
  93.         MUL     DI                      ;
  94.         MUL     DI                      ;
  95.         MUL     DI                      ;
  96.         MUL     DI                      ;
  97.         MUL     DI                      ;
  98.         MUL     DI                      ;
  99.         MUL     DI                      ;
  100.         MUL     DI                      ;
  101.         MUL     DI                      ;
  102.         MUL     DI                      ;
  103.         MUL     DI                      ;
  104.         MUL     DI                      ;
  105.         MUL     DI                      ;
  106.         MUL     DI                      ;
  107.         MUL     DI                      ;
  108.         MUL     DI                      ;
  109.         MUL     DI                      ;
  110.         MUL     DI                      ;
  111.         MUL     DI                      ;
  112.         MUL     DI                      ;
  113.         MUL     DI                      ;
  114.         MUL     DI                      ;
  115.         MUL     DI                      ;
  116.         MUL     DI                      ;
  117.         MUL     DI                      ;
  118.         MUL     DI                      ;
  119.         MUL     DI                      ;
  120.         MUL     DI                      ;
  121.         MUL     DI                      ;
  122.         MUL     DI                      ;
  123.         MUL     DI                      ;
  124.         MUL     DI                      ;
  125.         MUL     DI                      ;
  126.         MUL     DI                      ;
  127.         MUL     DI                      ;
  128.         MUL     DI                      ;
  129.         MUL     DI                      ;
  130.         MUL     DI                      ;
  131.         MUL     DI                      ;
  132.         MUL     DI                      ;
  133.         MUL     DI                      ;
  134.         MUL     DI                      ;
  135.         MUL     DI                      ;
  136.         MUL     DI                      ;
  137.         MUL     DI                      ;
  138.         MUL     DI                      ;
  139.         MUL     DI                      ;
  140.         MUL     DI                      ;
  141.         MUL     DI                      ;
  142.         MUL     DI                      ;
  143.         MUL     DI                      ;
  144.         MUL     DI                      ;
  145.         MUL     DI                      ;
  146.         MUL     DI                      ;
  147.         MUL     DI                      ;
  148.         MUL     DI                      ;
  149.         MUL     DI                      ;
  150.         MUL     DI                      ;
  151.         MUL     DI                      ;
  152.         MUL     DI                      ;
  153.         MUL     DI                      ;
  154.         MUL     DI                      ;
  155.         MUL     DI                      ;
  156.         MUL     DI                      ;
  157.         MUL     DI                      ;
  158.         MUL     DI                      ;
  159.         MUL     DI                      ;
  160.         DEC     CX                      ; COUNT THIS PASS
  161.         JZ      MD                      ; JUMP IF COMPLETE
  162.         JMP     ML                      ; LOOP BACK IF NOT DONE
  163. MD:     MOV     AL, BL                  ; RESTORE CONTROL VALUE
  164.         OUT     PPI_PORT, AL            ;
  165.         STI                             ; START INTERRUPTS
  166.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  167.         POP     DI                      ; RESTORE DI
  168.         POP     BP                      ; RESTORE BP
  169.         RET                             ; RETURN
  170.  
  171. _MULTIME        ENDP
  172.  
  173. ;***************************************************************;
  174. ;                                                               ;
  175. ;       _WMOVTIME                                               ;
  176. ;                                                               ;
  177. ;       TIME EXECUTION OF MOV INSTRUCTION (INSTR. READ TIME)    ;
  178. ;                                                               ;
  179. ;***************************************************************;
  180.  
  181.                 PUBLIC  _WMOVTIME
  182. _WMOVTIME       PROC    NEAR
  183.  
  184.         PUSH    BP                      ; SAVE FRAME
  185.         MOV     BP, SP                  ;
  186.         PUSH    DI                      ; SAVE DI
  187.         CALL    SETUP_TIMER             ; SET UP TIMER
  188.         MOV     DI, 0                   ; CLEAR DI
  189.         MOV     AX, [BP+4]              ; GET COUNT ARGUMENT
  190.         ADD     AX, 99                  ; ROUND UP
  191.         MOV     CX, 100                 ; DIVIDE BY 100 =
  192.         DIV     CL                      ;  NUMBER OF INSTRUCTIONS
  193.         MOV     CL, AL                  ;  PER PASS
  194.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  195.         MOV     BL, AL                  ; SAVE IN BL
  196.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  197.         CLI                             ; STOP INTERRUPTS
  198.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  199. IL:     MOV     DX, BX                  ; DO 100 MULTIPLIES
  200.         MOV     DX, BX                  ;
  201.         MOV     DX, BX                  ;
  202.         MOV     DX, BX                  ;
  203.         MOV     DX, BX                  ;
  204.         MOV     DX, BX                  ;
  205.         MOV     DX, BX                  ;
  206.         MOV     DX, BX                  ;
  207.         MOV     DX, BX                  ;
  208.         MOV     DX, BX                  ;
  209.         MOV     DX, BX                  ;
  210.         MOV     DX, BX                  ;
  211.         MOV     DX, BX                  ;
  212.         MOV     DX, BX                  ;
  213.         MOV     DX, BX                  ;
  214.         MOV     DX, BX                  ;
  215.         MOV     DX, BX                  ;
  216.         MOV     DX, BX                  ;
  217.         MOV     DX, BX                  ;
  218.         MOV     DX, BX                  ;
  219.         MOV     DX, BX                  ;
  220.         MOV     DX, BX                  ;
  221.         MOV     DX, BX                  ;
  222.         MOV     DX, BX                  ;
  223.         MOV     DX, BX                  ;
  224.         MOV     DX, BX                  ;
  225.         MOV     DX, BX                  ;
  226.         MOV     DX, BX                  ;
  227.         MOV     DX, BX                  ;
  228.         MOV     DX, BX                  ;
  229.         MOV     DX, BX                  ;
  230.         MOV     DX, BX                  ;
  231.         MOV     DX, BX                  ;
  232.         MOV     DX, BX                  ;
  233.         MOV     DX, BX                  ;
  234.         MOV     DX, BX                  ;
  235.         MOV     DX, BX                  ;
  236.         MOV     DX, BX                  ;
  237.         MOV     DX, BX                  ;
  238.         MOV     DX, BX                  ;
  239.         MOV     DX, BX                  ;
  240.         MOV     DX, BX                  ;
  241.         MOV     DX, BX                  ;
  242.         MOV     DX, BX                  ;
  243.         MOV     DX, BX                  ;
  244.         MOV     DX, BX                  ;
  245.         MOV     DX, BX                  ;
  246.         MOV     DX, BX                  ;
  247.         MOV     DX, BX                  ;
  248.         MOV     DX, BX                  ;
  249.         MOV     DX, BX                  ;
  250.         MOV     DX, BX                  ;
  251.         MOV     DX, BX                  ;
  252.         MOV     DX, BX                  ;
  253.         MOV     DX, BX                  ;
  254.         MOV     DX, BX                  ;
  255.         MOV     DX, BX                  ;
  256.         MOV     DX, BX                  ;
  257.         MOV     DX, BX                  ;
  258.         MOV     DX, BX                  ;
  259.         MOV     DX, BX                  ;
  260.         MOV     DX, BX                  ;
  261.         MOV     DX, BX                  ;
  262.         MOV     DX, BX                  ;
  263.         MOV     DX, BX                  ;
  264.         MOV     DX, BX                  ;
  265.         MOV     DX, BX                  ;
  266.         MOV     DX, BX                  ;
  267.         MOV     DX, BX                  ;
  268.         MOV     DX, BX                  ;
  269.         MOV     DX, BX                  ;
  270.         MOV     DX, BX                  ;
  271.         MOV     DX, BX                  ;
  272.         MOV     DX, BX                  ;
  273.         MOV     DX, BX                  ;
  274.         MOV     DX, BX                  ;
  275.         MOV     DX, BX                  ;
  276.         MOV     DX, BX                  ;
  277.         MOV     DX, BX                  ;
  278.         MOV     DX, BX                  ;
  279.         MOV     DX, BX                  ;
  280.         MOV     DX, BX                  ;
  281.         MOV     DX, BX                  ;
  282.         MOV     DX, BX                  ;
  283.         MOV     DX, BX                  ;
  284.         MOV     DX, BX                  ;
  285.         MOV     DX, BX                  ;
  286.         MOV     DX, BX                  ;
  287.         MOV     DX, BX                  ;
  288.         MOV     DX, BX                  ;
  289.         MOV     DX, BX                  ;
  290.         MOV     DX, BX                  ;
  291.         MOV     DX, BX                  ;
  292.         MOV     DX, BX                  ;
  293.         MOV     DX, BX                  ;
  294.         MOV     DX, BX                  ;
  295.         MOV     DX, BX                  ;
  296.         MOV     DX, BX                  ;
  297.         MOV     DX, BX                  ;
  298.         MOV     DX, BX                  ;
  299.         DEC     CX                      ; COUNT THIS PASS
  300.         JZ      ID                      ; JUMP IF COMPLETE
  301.         JMP     IL                      ; LOOP BACK IF NOT DONE
  302. ID:     MOV     AL, BL                  ; RESTORE CONTROL VALUE
  303.         OUT     PPI_PORT, AL            ;
  304.         STI                             ; START INTERRUPTS
  305.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  306.         POP     DI                      ; RESTORE DI
  307.         POP     BP                      ; RESTORE BP
  308.         RET                             ; RETURN
  309.  
  310. _WMOVTIME       ENDP
  311.  
  312. ;***************************************************************;
  313. ;                                                               ;
  314. ;       _BMVSTIME                                               ;
  315. ;                                                               ;
  316. ;       TIME EXECUTION OF REP MOVSB INSTRUCTION                 ;
  317. ;                                                               ;
  318. ;***************************************************************;
  319.  
  320.                 PUBLIC  _BMVSTIME
  321. _BMVSTIME       PROC    NEAR
  322.  
  323.         PUSH    BP                      ; SAVE FRAME
  324.         MOV     BP, SP                  ;
  325.         PUSH    DS                      ; SAVE DS
  326.         PUSH    ES                      ; SAVE ES
  327.         PUSH    SI                      ; SAVE SI
  328.         PUSH    DI                      ; SAVE DI
  329.         CALL    SETUP_TIMER             ; SET UP TIMER
  330.         MOV     DI, TESTSEG             ;
  331.         MOV     ES, DI                  ;
  332.         MOV     DS, DI                  ;
  333.         LEA     SI, TESTSEG_START       ; DS:SI -> TEST SEGMENT
  334.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  335.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  336.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  337.         MOV     BL, AL                  ; SAVE IN BL
  338.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  339.         CLI                             ; STOP INTERRUPTS
  340.         CLD                             ; SET FORWARD DIRECTION
  341.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  342.         REP MOVSB                       ; RUN TEST
  343.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  344.         OUT     PPI_PORT, AL            ;
  345.         STI                             ; START INTERRUPTS
  346.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  347.         POP     DI                      ; RESTORE DI
  348.         POP     SI                      ; RESTORE SI
  349.         POP     ES                      ; RESTORE ES
  350.         POP     DS                      ; RESTORE DS
  351.         POP     BP                      ; RESTORE BP
  352.         RET                             ; RETURN
  353.  
  354. _BMVSTIME       ENDP
  355.  
  356. ;***************************************************************;
  357. ;                                                               ;
  358. ;       _WMVSTIME                                               ;
  359. ;                                                               ;
  360. ;       TIME EXECUTION OF REP MOVSW INSTRUCTION                 ;
  361. ;                                                               ;
  362. ;***************************************************************;
  363.  
  364.                 PUBLIC  _WMVSTIME
  365. _WMVSTIME       PROC    NEAR
  366.  
  367.         PUSH    BP                      ; SAVE FRAME
  368.         MOV     BP, SP                  ;
  369.         PUSH    DS                      ; SAVE DS
  370.         PUSH    ES                      ; SAVE ES
  371.         PUSH    SI                      ; SAVE SI
  372.         PUSH    DI                      ; SAVE DI
  373.         CALL    SETUP_TIMER             ; SET UP TIMER
  374.         MOV     DI, TESTSEG             ;
  375.         MOV     ES, DI                  ;
  376.         MOV     DS, DI                  ;
  377.         LEA     SI, TESTSEG_START       ; DS:SI -> TEST SEGMENT
  378.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  379.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  380.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  381.         MOV     BL, AL                  ; SAVE IN BL
  382.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  383.         CLI                             ; STOP INTERRUPTS
  384.         CLD                             ; SET FORWARD DIRECTION
  385.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  386.         REP MOVSW                       ; RUN TEST
  387.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  388.         OUT     PPI_PORT, AL            ;
  389.         STI                             ; START INTERRUPTS
  390.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  391.         POP     DI                      ; RESTORE DI
  392.         POP     SI                      ; RESTORE SI
  393.         POP     ES                      ; RESTORE ES
  394.         POP     DS                      ; RESTORE DS
  395.         POP     BP                      ; RESTORE BP
  396.         RET                             ; RETURN
  397.  
  398. _WMVSTIME       ENDP
  399.  
  400. ;***************************************************************;
  401. ;                                                               ;
  402. ;       _BROMTIME                                               ;
  403. ;                                                               ;
  404. ;       TIME EXECUTION OF REP MOVSB INSTRUCTION FROM ROM        ;
  405. ;                                                               ;
  406. ;***************************************************************;
  407.  
  408.                 PUBLIC  _BROMTIME
  409. _BROMTIME       PROC    NEAR
  410.  
  411.         PUSH    BP                      ; SAVE FRAME
  412.         MOV     BP, SP                  ;
  413.         PUSH    DS                      ; SAVE DS
  414.         PUSH    ES                      ; SAVE ES
  415.         PUSH    SI                      ; SAVE SI
  416.         PUSH    DI                      ; SAVE DI
  417.         CALL    SETUP_TIMER             ; SET UP TIMER
  418.         MOV     DI, TESTSEG             ;
  419.         MOV     ES, DI                  ;
  420.         MOV     DI, 0F000H              ; SET DS TO ROM START
  421.         MOV     DS, DI                  ;
  422.         MOV     SI, 0                   ; DS:SI -> ROM
  423.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  424.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  425.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  426.         MOV     BL, AL                  ; SAVE IN BL
  427.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  428.         CLI                             ; STOP INTERRUPTS
  429.         CLD                             ; SET FORWARD DIRECTION
  430.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  431.         REP MOVSB                       ; RUN TEST
  432.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  433.         OUT     PPI_PORT, AL            ;
  434.         STI                             ; START INTERRUPTS
  435.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  436.         POP     DI                      ; RESTORE DI
  437.         POP     SI                      ; RESTORE SI
  438.         POP     ES                      ; RESTORE ES
  439.         POP     DS                      ; RESTORE DS
  440.         POP     BP                      ; RESTORE BP
  441.         RET                             ; RETURN
  442.  
  443. _BROMTIME       ENDP
  444.  
  445. ;***************************************************************;
  446. ;                                                               ;
  447. ;       _WROMTIME                                               ;
  448. ;                                                               ;
  449. ;       TIME EXECUTION OF REP MOVSW INSTRUCTION FROM ROM        ;
  450. ;                                                               ;
  451. ;***************************************************************;
  452.  
  453.                 PUBLIC  _WROMTIME
  454. _WROMTIME       PROC    NEAR
  455.  
  456.         PUSH    BP                      ; SAVE FRAME
  457.         MOV     BP, SP                  ;
  458.         PUSH    DS                      ; SAVE DS
  459.         PUSH    ES                      ; SAVE ES
  460.         PUSH    SI                      ; SAVE SI
  461.         PUSH    DI                      ; SAVE DI
  462.         CALL    SETUP_TIMER             ; SET UP TIMER
  463.         MOV     DI, TESTSEG             ;
  464.         MOV     ES, DI                  ;
  465.         MOV     DI, 0F000H              ; SET DS TO ROM START
  466.         MOV     DS, DI                  ;
  467.         MOV     SI, 0                   ; DS:SI -> ROM
  468.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  469.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  470.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  471.         MOV     BL, AL                  ; SAVE IN BL
  472.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  473.         CLI                             ; STOP INTERRUPTS
  474.         CLD                             ; SET FORWARD DIRECTION
  475.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  476.         REP MOVSW                       ; RUN TEST
  477.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  478.         OUT     PPI_PORT, AL            ;
  479.         STI                             ; START INTERRUPTS
  480.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  481.         POP     DI                      ; RESTORE DI
  482.         POP     SI                      ; RESTORE SI
  483.         POP     ES                      ; RESTORE ES
  484.         POP     DS                      ; RESTORE DS
  485.         POP     BP                      ; RESTORE BP
  486.         RET                             ; RETURN
  487.  
  488. _WROMTIME       ENDP
  489.  
  490. ;***************************************************************;
  491. ;                                                               ;
  492. ;       _BSTOTIME                                               ;
  493. ;                                                               ;
  494. ;       TIME EXECUTION OF REP STOSB INSTRUCTION                 ;
  495. ;                                                               ;
  496. ;***************************************************************;
  497.  
  498.                 PUBLIC  _BSTOTIME
  499. _BSTOTIME       PROC    NEAR
  500.  
  501.         PUSH    BP                      ; SAVE FRAME
  502.         MOV     BP, SP                  ;
  503.         PUSH    ES                      ; SAVE ES
  504.         PUSH    DI                      ; SAVE DI
  505.         CALL    SETUP_TIMER             ; SET UP TIMER
  506.         MOV     DI, TESTSEG             ;
  507.         MOV     ES, DI                  ;
  508.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  509.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  510.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  511.         MOV     BL, AL                  ; SAVE IN BL
  512.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  513.         CLI                             ; STOP INTERRUPTS
  514.         CLD                             ; SET FORWARD DIRECTION
  515.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  516.         REP STOSB                       ; RUN TEST
  517.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  518.         OUT     PPI_PORT, AL            ;
  519.         STI                             ; START INTERRUPTS
  520.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  521.         POP     DI                      ; RESTORE DI
  522.         POP     ES                      ; RESTORE ES
  523.         POP     BP                      ; RESTORE BP
  524.         RET                             ; RETURN
  525.  
  526. _BSTOTIME       ENDP
  527.  
  528. ;***************************************************************;
  529. ;                                                               ;
  530. ;       _WSTOTIME                                               ;
  531. ;                                                               ;
  532. ;       TIME EXECUTION OF REP STOSW INSTRUCTION                 ;
  533. ;                                                               ;
  534. ;***************************************************************;
  535.  
  536.                 PUBLIC  _WSTOTIME
  537. _WSTOTIME       PROC    NEAR
  538.  
  539.         PUSH    BP                      ; SAVE FRAME
  540.         MOV     BP, SP                  ;
  541.         PUSH    ES                      ; SAVE ES
  542.         PUSH    DI                      ; SAVE DI
  543.         CALL    SETUP_TIMER             ; SET UP TIMER
  544.         MOV     DI, TESTSEG             ;
  545.         MOV     ES, DI                  ;
  546.         LEA     DI, TESTSEG_START       ; ES:DI -> TEST SEGMENT
  547.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  548.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  549.         MOV     BL, AL                  ; SAVE IN BL
  550.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  551.         CLI                             ; STOP INTERRUPTS
  552.         CLD                             ; SET FORWARD DIRECTION
  553.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  554.         REP STOSW                       ; RUN TEST
  555.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  556.         OUT     PPI_PORT, AL            ;
  557.         STI                             ; START INTERRUPTS
  558.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  559.         POP     DI                      ; RESTORE DI
  560.         POP     ES                      ; RESTORE ES
  561.         POP     BP                      ; RESTORE BP
  562.         RET                             ; RETURN
  563.  
  564. _WSTOTIME       ENDP
  565.  
  566. ;***************************************************************;
  567. ;                                                               ;
  568. ;       _BVIDTIME                                               ;
  569. ;                                                               ;
  570. ;       TIME EXECUTION OF REP STOSB INTO VIDEO MEMORY           ;
  571. ;                                                               ;
  572. ;***************************************************************;
  573.  
  574.                 PUBLIC  _BVIDTIME
  575. _BVIDTIME       PROC    NEAR
  576.  
  577.         PUSH    BP                      ; SAVE FRAME
  578.         MOV     BP, SP                  ;
  579.         PUSH    ES                      ; SAVE ES
  580.         PUSH    DI                      ; SAVE DI
  581.         CALL    SETUP_TIMER             ; SET UP TIMER
  582.         MOV     DI, 0B800H              ;
  583.         MOV     ES, DI                  ;
  584.         MOV     DI, 0                   ; ES:DI -> VIDEO MEMORY
  585.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  586.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  587.         MOV     BL, AL                  ; SAVE IN BL
  588.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  589.         CLI                             ; STOP INTERRUPTS
  590.         CLD                             ; SET FORWARD DIRECTION
  591.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  592.         REP STOSB                       ; RUN TEST
  593.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  594.         OUT     PPI_PORT, AL            ;
  595.         STI                             ; START INTERRUPTS
  596.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  597.         POP     DI                      ; RESTORE DI
  598.         POP     ES                      ; RESTORE ES
  599.         POP     BP                      ; RESTORE BP
  600.         RET                             ; RETURN
  601.  
  602. _BVIDTIME       ENDP
  603.  
  604.  
  605. ;***************************************************************;
  606. ;                                                               ;
  607. ;       _WVIDTIME                                               ;
  608. ;                                                               ;
  609. ;       TIME EXECUTION OF REP STOSW INTO VIDEO MEMORY           ;
  610. ;                                                               ;
  611. ;***************************************************************;
  612.  
  613.                 PUBLIC  _WVIDTIME
  614. _WVIDTIME       PROC    NEAR
  615.  
  616.         PUSH    BP                      ; SAVE FRAME
  617.         MOV     BP, SP                  ;
  618.         PUSH    ES                      ; SAVE ES
  619.         PUSH    DI                      ; SAVE DI
  620.         CALL    SETUP_TIMER             ; SET UP TIMER
  621.         MOV     DI, 0B800H              ;
  622.         MOV     ES, DI                  ;
  623.         MOV     DI, 0                   ; ES:DI -> VIDEO MEMORY
  624.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  625.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  626.         MOV     BL, AL                  ; SAVE IN BL
  627.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  628.         CLI                             ; STOP INTERRUPTS
  629.         CLD                             ; SET FORWARD DIRECTION
  630.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  631.         REP STOSW                       ; RUN TEST
  632.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  633.         OUT     PPI_PORT, AL            ;
  634.         STI                             ; START INTERRUPTS
  635.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  636.         POP     DI                      ; RESTORE DI
  637.         POP     ES                      ; RESTORE ES
  638.         POP     BP                      ; RESTORE BP
  639.         RET                             ; RETURN
  640.  
  641. _WVIDTIME       ENDP
  642.  
  643. ;***************************************************************;
  644. ;                                                               ;
  645. ;       _FPTIME                                                 ;
  646. ;                                                               ;
  647. ;       TIME EXECUTION OF FLOATING POINT DIVIDE                 ;
  648. ;                                                               ;
  649. ;***************************************************************;
  650.  
  651.                 PUBLIC  _FPTIME
  652. _FPTIME         PROC    NEAR
  653.  
  654.         PUSH    BP                      ; SAVE FRAME
  655.         MOV     BP, SP                  ;
  656.         PUSH    DI                      ; SAVE DI
  657.         CALL    SETUP_TIMER             ; SET UP TIMER
  658.         MOV     DI, 0                   ; CLEAR DI
  659.         MOV     AX, [BP+4]              ; GET COUNT ARGUMENT
  660.         ADD     AX, 99                  ; ROUND UP
  661.         MOV     CX, 100                 ; DIVIDE BY 100 =
  662.         DIV     CL                      ;  NUMBER OF INSTRUCTIONS
  663.         MOV     CL, AL                  ;  PER PASS
  664.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  665.         MOV     BL, AL                  ; SAVE IN BL
  666.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  667.         FNINIT                          ; INIT FP
  668.         FLD1                            ; DIVIDE 1.0
  669.         FLD1                            ; BY 1.0
  670.         CLI                             ; STOP INTERRUPTS
  671.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  672. FL:     FDIV    ST(1), ST               ; DO 100 DIVIDES
  673.         FDIV    ST(1), ST               ;
  674.         FDIV    ST(1), ST               ;
  675.         FDIV    ST(1), ST               ;
  676.         FDIV    ST(1), ST               ;
  677.         FDIV    ST(1), ST               ;
  678.         FDIV    ST(1), ST               ;
  679.         FDIV    ST(1), ST               ;
  680.         FDIV    ST(1), ST               ;
  681.         FDIV    ST(1), ST               ;
  682.         FDIV    ST(1), ST               ;
  683.         FDIV    ST(1), ST               ;
  684.         FDIV    ST(1), ST               ;
  685.         FDIV    ST(1), ST               ;
  686.         FDIV    ST(1), ST               ;
  687.         FDIV    ST(1), ST               ;
  688.         FDIV    ST(1), ST               ;
  689.         FDIV    ST(1), ST               ;
  690.         FDIV    ST(1), ST               ;
  691.         FDIV    ST(1), ST               ;
  692.         FDIV    ST(1), ST               ;
  693.         FDIV    ST(1), ST               ;
  694.         FDIV    ST(1), ST               ;
  695.         FDIV    ST(1), ST               ;
  696.         FDIV    ST(1), ST               ;
  697.         FDIV    ST(1), ST               ;
  698.         FDIV    ST(1), ST               ;
  699.         FDIV    ST(1), ST               ;
  700.         FDIV    ST(1), ST               ;
  701.         FDIV    ST(1), ST               ;
  702.         FDIV    ST(1), ST               ;
  703.         FDIV    ST(1), ST               ;
  704.         FDIV    ST(1), ST               ;
  705.         FDIV    ST(1), ST               ;
  706.         FDIV    ST(1), ST               ;
  707.         FDIV    ST(1), ST               ;
  708.         FDIV    ST(1), ST               ;
  709.         FDIV    ST(1), ST               ;
  710.         FDIV    ST(1), ST               ;
  711.         FDIV    ST(1), ST               ;
  712.         FDIV    ST(1), ST               ;
  713.         FDIV    ST(1), ST               ;
  714.         FDIV    ST(1), ST               ;
  715.         FDIV    ST(1), ST               ;
  716.         FDIV    ST(1), ST               ;
  717.         FDIV    ST(1), ST               ;
  718.         FDIV    ST(1), ST               ;
  719.         FDIV    ST(1), ST               ;
  720.         FDIV    ST(1), ST               ;
  721.         FDIV    ST(1), ST               ;
  722.         FDIV    ST(1), ST               ;
  723.         FDIV    ST(1), ST               ;
  724.         FDIV    ST(1), ST               ;
  725.         FDIV    ST(1), ST               ;
  726.         FDIV    ST(1), ST               ;
  727.         FDIV    ST(1), ST               ;
  728.         FDIV    ST(1), ST               ;
  729.         FDIV    ST(1), ST               ;
  730.         FDIV    ST(1), ST               ;
  731.         FDIV    ST(1), ST               ;
  732.         FDIV    ST(1), ST               ;
  733.         FDIV    ST(1), ST               ;
  734.         FDIV    ST(1), ST               ;
  735.         FDIV    ST(1), ST               ;
  736.         FDIV    ST(1), ST               ;
  737.         FDIV    ST(1), ST               ;
  738.         FDIV    ST(1), ST               ;
  739.         FDIV    ST(1), ST               ;
  740.         FDIV    ST(1), ST               ;
  741.         FDIV    ST(1), ST               ;
  742.         FDIV    ST(1), ST               ;
  743.         FDIV    ST(1), ST               ;
  744.         FDIV    ST(1), ST               ;
  745.         FDIV    ST(1), ST               ;
  746.         FDIV    ST(1), ST               ;
  747.         FDIV    ST(1), ST               ;
  748.         FDIV    ST(1), ST               ;
  749.         FDIV    ST(1), ST               ;
  750.         FDIV    ST(1), ST               ;
  751.         FDIV    ST(1), ST               ;
  752.         FDIV    ST(1), ST               ;
  753.         FDIV    ST(1), ST               ;
  754.         FDIV    ST(1), ST               ;
  755.         FDIV    ST(1), ST               ;
  756.         FDIV    ST(1), ST               ;
  757.         FDIV    ST(1), ST               ;
  758.         FDIV    ST(1), ST               ;
  759.         FDIV    ST(1), ST               ;
  760.         FDIV    ST(1), ST               ;
  761.         FDIV    ST(1), ST               ;
  762.         FDIV    ST(1), ST               ;
  763.         FDIV    ST(1), ST               ;
  764.         FDIV    ST(1), ST               ;
  765.         FDIV    ST(1), ST               ;
  766.         FDIV    ST(1), ST               ;
  767.         FDIV    ST(1), ST               ;
  768.         FDIV    ST(1), ST               ;
  769.         FDIV    ST(1), ST               ;
  770.         FDIV    ST(1), ST               ;
  771.         FDIV    ST(1), ST               ;
  772.         DEC     CX                      ; COUNT THIS PASS
  773.         JZ      FD                      ; JUMP IF COMPLETE
  774.         JMP     FL                      ; LOOP BACK IF NOT DONE
  775. FD:     MOV     AL, BL                  ; RESTORE CONTROL VALUE
  776.         OUT     PPI_PORT, AL            ;
  777.         STI                             ; START INTERRUPTS
  778.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  779.         POP     DI                      ; RESTORE DI
  780.         POP     BP                      ; RESTORE BP
  781.         RET                             ; RETURN
  782.  
  783. _FPTIME        ENDP
  784.  
  785. ;***************************************************************;
  786. ;                                                               ;
  787. ;       _BEMSTIME                                               ;
  788. ;                                                               ;
  789. ;       TIME EXECUTION OF REP STOSB INSTRUCTION                 ;
  790. ;                                                               ;
  791. ;***************************************************************;
  792.  
  793.                 PUBLIC  _BEMSTIME
  794. _BEMSTIME       PROC    NEAR
  795.  
  796.         PUSH    BP                      ; SAVE FRAME
  797.         MOV     BP, SP                  ;
  798.         PUSH    ES                      ; SAVE ES
  799.         PUSH    DI                      ; SAVE DI
  800.         CALL    SETUP_TIMER             ; SET UP TIMER
  801.         MOV     ES, EMMBASE             ; SET UP EMM BASE ADDRESS
  802.         XOR     DI, DI                  ; ES:DI -> TEST SEGMENT
  803.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  804.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  805.         MOV     BL, AL                  ; SAVE IN BL
  806.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  807.         CLI                             ; STOP INTERRUPTS
  808.         CLD                             ; SET FORWARD DIRECTION
  809.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  810.         REP STOSB                       ; RUN TEST
  811.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  812.         OUT     PPI_PORT, AL            ;
  813.         STI                             ; START INTERRUPTS
  814.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  815.         POP     DI                      ; RESTORE DI
  816.         POP     ES                      ; RESTORE ES
  817.         POP     BP                      ; RESTORE BP
  818.         RET                             ; RETURN
  819.  
  820. _BEMSTIME       ENDP
  821.  
  822. ;***************************************************************;
  823. ;                                                               ;
  824. ;       _WEMSTIME                                               ;
  825. ;                                                               ;
  826. ;       TIME EXECUTION OF REP STOSW INSTRUCTION                 ;
  827. ;                                                               ;
  828. ;***************************************************************;
  829.  
  830.                 PUBLIC  _WEMSTIME
  831. _WEMSTIME       PROC    NEAR
  832.  
  833.         PUSH    BP                      ; SAVE FRAME
  834.         MOV     BP, SP                  ;
  835.         PUSH    ES                      ; SAVE ES
  836.         PUSH    DI                      ; SAVE DI
  837.         CALL    SETUP_TIMER             ; SET UP TIMER
  838.         MOV     ES, EMMBASE             ; SET UP EMM BASE ADDRESS
  839.         XOR     DI, DI                  ; ES:DI -> TEST SEGMENT
  840.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  841.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  842.         MOV     BL, AL                  ; SAVE IN BL
  843.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  844.         CLI                             ; STOP INTERRUPTS
  845.         CLD                             ; SET FORWARD DIRECTION
  846.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  847.         REP STOSW                       ; RUN TEST
  848.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  849.         OUT     PPI_PORT, AL            ;
  850.         STI                             ; START INTERRUPTS
  851.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  852.         POP     DI                      ; RESTORE DI
  853.         POP     ES                      ; RESTORE ES
  854.         POP     BP                      ; RESTORE BP
  855.         RET                             ; RETURN
  856.  
  857. _WEMSTIME       ENDP
  858.  
  859. ;***************************************************************;
  860. ;                                                               ;
  861. ;       _BEMMTIME                                               ;
  862. ;                                                               ;
  863. ;       TIME EXECUTION OF REP MOVSB INSTRUCTION                 ;
  864. ;                                                               ;
  865. ;***************************************************************;
  866.  
  867.                 PUBLIC  _BEMMTIME
  868. _BEMMTIME       PROC    NEAR
  869.  
  870.         PUSH    BP                      ; SAVE FRAME
  871.         MOV     BP, SP                  ;
  872.         PUSH    DS                      ; SAVE DS
  873.         PUSH    ES                      ; SAVE ES
  874.         PUSH    SI                      ; SAVE SI
  875.         PUSH    DI                      ; SAVE DI
  876.         CALL    SETUP_TIMER             ; SET UP TIMER
  877.         MOV     DI, EMMBASE             ; SET UP EMM BASE ADDRESS
  878.         MOV     ES, DI                  ;
  879.         MOV     DS, DI                  ;
  880.         XOR     DI, DI                  ; ES:DI -> TEST SEGMENT
  881.         XOR     SI, SI                  ; DS:SI -> TEST SEGMENT
  882.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  883.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  884.         MOV     BL, AL                  ; SAVE IN BL
  885.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  886.         CLI                             ; STOP INTERRUPTS
  887.         CLD                             ; SET FORWARD DIRECTION
  888.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  889.         REP MOVSB                       ; RUN TEST
  890.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  891.         OUT     PPI_PORT, AL            ;
  892.         STI                             ; START INTERRUPTS
  893.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  894.         POP     DI                      ; RESTORE DI
  895.         POP     SI                      ; RESTORE SI
  896.         POP     ES                      ; RESTORE ES
  897.         POP     DS                      ; RESTORE DS
  898.         POP     BP                      ; RESTORE BP
  899.         RET                             ; RETURN
  900.  
  901. _BEMMTIME       ENDP
  902.  
  903. ;***************************************************************;
  904. ;                                                               ;
  905. ;       _WEMMTIME                                               ;
  906. ;                                                               ;
  907. ;       TIME EXECUTION OF REP MOVSW INSTRUCTION                 ;
  908. ;                                                               ;
  909. ;***************************************************************;
  910.  
  911.                 PUBLIC  _WEMMTIME
  912. _WEMMTIME       PROC    NEAR
  913.  
  914.         PUSH    BP                      ; SAVE FRAME
  915.         MOV     BP, SP                  ;
  916.         PUSH    DS                      ; SAVE DS
  917.         PUSH    ES                      ; SAVE ES
  918.         PUSH    SI                      ; SAVE SI
  919.         PUSH    DI                      ; SAVE DI
  920.         CALL    SETUP_TIMER             ; SET UP TIMER
  921.         MOV     DI, EMMBASE             ; SET UP EMM BASE ADDRESS
  922.         MOV     ES, DI                  ;
  923.         MOV     DS, DI                  ;
  924.         XOR     DI, DI                  ; ES:DI -> TEST SEGMENT
  925.         XOR     SI, SI                  ; DS:SI -> TEST SEGMENT
  926.         MOV     CX, [BP+4]              ; GET COUNT ARGUMENT
  927.         IN      AL, PPI_PORT            ; GET CURRENT CONTROL
  928.         MOV     BL, AL                  ; SAVE IN BL
  929.         OR      AX, 1                   ; SET TIMER ENABLE BIT
  930.         CLI                             ; STOP INTERRUPTS
  931.         CLD                             ; SET FORWARD DIRECTION
  932.         OUT     PPI_PORT, AL            ; ENABLE TIMER
  933.         REP MOVSW                       ; RUN TEST
  934.         MOV     AL, BL                  ; RESTORE CONTROL VALUE
  935.         OUT     PPI_PORT, AL            ;
  936.         STI                             ; START INTERRUPTS
  937.         CALL    GET_TIMER               ; OBTAIN FINAL COUNT
  938.         POP     DI                      ; RESTORE DI
  939.         POP     SI                      ; RESTORE SI
  940.         POP     ES                      ; RESTORE ES
  941.         POP     DS                      ; RESTORE DS
  942.         POP     BP                      ; RESTORE BP
  943.         RET                             ; RETURN
  944.  
  945. _WEMMTIME       ENDP
  946.  
  947. ;***************************************************************;
  948. ;                                                               ;
  949. ;       _SETUP_EMM                                              ;
  950. ;                                                               ;
  951. ;       SET UP EXPANDED MEMORY AND RETURN THE BASE              ;
  952. ;                                                               ;
  953. ;***************************************************************;
  954.  
  955.                 PUBLIC  _SETUP_EMM
  956. _SETUP_EMM      PROC    NEAR
  957.  
  958.         PUSH    BP                      ; SAVE REGISTERS
  959.         PUSH    ES                      ;
  960.         PUSH    SI                      ;
  961.         PUSH    DI                      ;
  962.         MOV     AH, 35H                 ; GET EMM INTERRUPT
  963.         MOV     AL, 67H                 ; VECTOR
  964.         INT     21H                     ;
  965.         MOV     AX, ES                  ; CHECK FOR VALID BASE
  966.         MOV     BX, CS                  ; MUST BE BELOW CS
  967.         CMP     AX, BX                  ;
  968.         JA      SENO                    ; JUMP IF NOT GOOD
  969.         MOV     DI, 000AH               ; OFFSET OF DRIVER NAME
  970.         LEA     SI, EMM_NAME            ; COMPARE STRING
  971.         MOV     CX, 8                   ; LENGTH OF STRING
  972.         CLD                             ;
  973.         REPE    CMPSB                   ; COMPARE THE NAME
  974.         JNE     SENO                    ; JUMP IF NO GOOD
  975.                                         ;
  976. SE1:    MOV     AH, 40H                 ; FUNCTION 1:
  977.         INT     67H                     ; GET MANAGER STATUS
  978.         CMP     AH, 82H                 ; CHECK FOR BUSY
  979.         JE      SE1                     ; TRY AGAIN IF BUSY
  980.         OR      AH, AH                  ; CHECK FOR ERROR
  981.         JNZ     SENO                    ; JUMP ON ERROR
  982.                                         ;
  983. SE2:    MOV     AH, 41H                 ; FUNCTION 2:
  984.         INT     67H                     ; GET PAGE FRAME BASE
  985.         CMP     AH, 82H                 ; CHECK FOR BUSY
  986.         JE      SE2                     ; TRY AGAIN IF BUSY
  987.         OR      AH, AH                  ; CHECK FOR ERROR
  988.         JNZ     SENO                    ; JUMP ON ERROR
  989.         MOV     EMMBASE, BX             ; SAVE THE BASE
  990.                                         ;
  991. SE3:    MOV     AH, 42H                 ; FUNCTION 3:
  992.         INT     67H                     ; GET NUMBER OF PAGES
  993.         CMP     AH, 82H                 ; CHECK FOR BUSY
  994.         JE      SE3                     ; TRY AGAIN IF BUSY
  995.         OR      AH, AH                  ; CHECK FOR ERROR
  996.         JNZ     SENO                    ; JUMP ON ERROR
  997.         OR      BX, BX                  ; CHECK UNALLOCATED PAGES
  998.         JZ      SENO                    ; JUMP IF NONE AVAILABLE
  999.                                         ;
  1000. SE4:    MOV     AH, 43H                 ; FUNCTION 4:
  1001.         MOV     BX, 1                   ; ALLOCATE ONE PAGE
  1002.         INT     67H                     ;
  1003.         CMP     AH, 82H                 ; CHECK FOR BUSY
  1004.         JE      SE4                     ; TRY AGAIN IF BUSY
  1005.         OR      AH, AH                  ; CHECK FOR ERROR
  1006.         JNZ     SENO                    ; JUMP ON ERROR
  1007.         MOV     PID, DX                 ; SAVE THE PROCESS ID
  1008.                                         ;
  1009. SE5:    MOV     AH, 44H                 ; FUNCTION 5:
  1010.         XOR     BX, BX                  ; MAP THE PAGE TO
  1011.         XOR     AL, AL                  ;  FRAME BASE
  1012.         INT     67H                     ;
  1013.         CMP     AH, 82H                 ; CHECK FOR BUSY
  1014.         JE      SE5                     ; TRY AGAIN IF BUSY
  1015.         OR      AH, AH                  ; CHECK FOR ERROR
  1016.         JNZ     SENC                    ; JUMP ON ERROR
  1017.                                         ;
  1018.         XOR     AX, AX                  ;
  1019.         POP     DI                      ; RESTORE REGISTERS
  1020.         POP     SI                      ;
  1021.         POP     ES                      ;
  1022.         POP     BP                      ;
  1023.         RET                             ; RETURN 0
  1024.  
  1025. SENC:   MOV     AH, 45H                 ; FUNCTION 6:
  1026.         INT     67H                     ; CLOSE EMM
  1027.         CMP     AH, 82H                 ; CHECK FOR BUSY
  1028.         JE      SENC                    ; TRY AGAIN IF BUSY
  1029. SENO:   MOV     AX, 0FFFFH              ;
  1030.         POP     DI                      ; RESTORE REGISTERS
  1031.         POP     SI                      ;
  1032.         POP     ES                      ;
  1033.         POP     BP                      ;
  1034.         RET                             ; RETURN -1
  1035.  
  1036. _SETUP_EMM      ENDP
  1037.  
  1038. ;***************************************************************;
  1039. ;                                                               ;
  1040. ;       _FINISH_EMM                                             ;
  1041. ;                                                               ;
  1042. ;       CLOSE THE EMM DEVICE, RELEASE THE PAGE                  ;
  1043. ;                                                               ;
  1044. ;***************************************************************;
  1045.  
  1046.                 PUBLIC  _FINISH_EMM
  1047. _FINISH_EMM     PROC    NEAR
  1048.  
  1049.         PUSH    BP                      ; SAVE REGISTERS
  1050.         PUSH    ES                      ;
  1051.         PUSH    SI                      ;
  1052.         PUSH    DI                      ;
  1053. SE6:    MOV     AH, 45H                 ; FUNCTION 6:
  1054.         MOV     DX, PID                 ; CLOSE EMM
  1055.         INT     67H                     ;
  1056.         CMP     AH, 82H                 ; CHECK FOR BUSY
  1057.         JE      SE6                     ; TRY AGAIN IF BUSY
  1058.         POP     DI                      ; RESTORE REGISTERS
  1059.         POP     SI                      ;
  1060.         POP     ES                      ;
  1061.         POP     BP                      ;
  1062.         RET                             ; RETURN
  1063.  
  1064. _FINISH_EMM     ENDP
  1065.  
  1066. ;***************************************************************;
  1067. ;                                                               ;
  1068. ;       SETUP_TIMER                                             ;
  1069. ;                                                               ;
  1070. ;       SET UP THE TIMER FOR MAXIMUM COUNT, TO TIME A RUN       ;
  1071. ;                                                               ;
  1072. ;***************************************************************;
  1073.  
  1074. SETUP_TIMER     PROC    NEAR
  1075.  
  1076.         PUSH    AX                      ; SAVE AX
  1077.         IN      AL, PPI_PORT            ; STOP THE TIMER
  1078.         AND     AL, 0FCH                ;
  1079.         OUT     PPI_PORT, AL            ;
  1080.         MOV     AL, 0B4H                ; INITIALIZE THE TIMER
  1081.         OUT     TIMER_CTRL, AL          ;
  1082.         MOV     AL, 0                   ; CLEAR THE COUNT
  1083.         OUT     TIMER2_PORT, AL         ;
  1084.         NOP                             ;
  1085.         OUT     TIMER2_PORT, AL         ;
  1086.         POP     AX                      ; RESTORE AX
  1087.         RET                             ; RETURN
  1088.  
  1089. SETUP_TIMER     ENDP
  1090.  
  1091.  
  1092. ;***************************************************************;
  1093. ;                                                               ;
  1094. ;       GET_TIMER                                               ;
  1095. ;                                                               ;
  1096. ;       TAKE THE COUNT FROM THE TIMER                           ;
  1097. ;                                                               ;
  1098. ;***************************************************************;
  1099.  
  1100. GET_TIMER       PROC    NEAR
  1101.  
  1102.         PUSH    BX                      ; SAVE REGISTERS
  1103.         IN      AL, TIMER2_PORT         ; GET LOW BYTE OF TIME
  1104.         MOV     AH, AL                  ;
  1105.         IN      AL, TIMER2_PORT         ; GET HIGH BYTE
  1106.         XCHG    AL, AH                  ; TIME IN AX
  1107.         NEG     AX                      ; CORRECT FOR COUNT-DOWN
  1108.         POP     BX                      ; RESTORE REGISTERS
  1109.         RET                             ; RETURN
  1110.  
  1111. GET_TIMER       ENDP
  1112.  
  1113. ;***************************************************************;
  1114. ;                                                               ;
  1115. ;       _NDP_PRESENT                                            ;
  1116. ;                                                               ;
  1117. ;       CHECK IF 80287 IS PRESENT                               ;
  1118. ;                                                               ;
  1119. ;***************************************************************;
  1120.  
  1121.                 PUBLIC  _NDP_PRESENT
  1122. _NDP_PRESENT    PROC    NEAR
  1123.  
  1124.         PUSH    BP                      ; SAVE FRAME
  1125.         MOV     BP, SP                  ;
  1126.         INT     11H                     ; BIOS EQUIP CHECK
  1127.         TEST    AL,02H                  ; IS 80287 BIT SET?
  1128.         JZ      NO                      ; NO MEANS NO 80287
  1129.         MOV     AX,01h                  ; RETURN TRUE
  1130.         JMP     EXIT                    ; ALL DONE
  1131. NO:     XOR     AX,AX                   ; SET AX TO FALSE
  1132. EXIT:   MOV     SP, BP                  ; RESTORE SP
  1133.         POP     BP                      ; RESTORE BP
  1134.         RET                             ; RETURN
  1135.  
  1136. _NDP_PRESENT    ENDP
  1137.  
  1138.  
  1139. _TEXT           ENDS
  1140.  
  1141.                 END
  1142.