home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / BYTE24.ZIP / MISCSUBS.ASM < prev    next >
Assembly Source File  |  1991-05-22  |  16KB  |  997 lines

  1. ; miscellaneous asm subroutines for the byte benchmarks
  2. ;
  3. ; BYTE Magazine, Spring 1990
  4. ;
  5. ; Modified 8/9/90 -- put  in extra check for overflow in Getmhz - Steve.
  6. ; 5/15/91 -- patch - stubbed out getmhz due to incompatibility - Steve.
  7. ;
  8.  
  9. _data    segment word public 'DATA'
  10.     control        dw    ?    ;For floating-point control word
  11.     cap_reqd    dw    ?    ; disk capacity required
  12.             dw    ?
  13.     extrn    video_seg: WORD
  14.  
  15. _data    ends
  16.  
  17. dgroup    group    _data
  18. assume    cs:_text, ds:dgroup
  19. public     _strip0s, _machine_detect, _disk_check, _set_default, _get_default
  20. public  _getpath, _cdir, _click
  21.  
  22. _text    segment byte public 'CODE'
  23.  
  24. _strip0s    proc    near
  25.  
  26. ; void strip0s(char *buffer, unsigned int buflen);
  27. ; strips (turns into spaces) zeros from a char buffer.
  28. ;
  29.  
  30.     strip0sframe    struc
  31.     s0bptr        dw    ?
  32.     s0raddr        dw    ?
  33.     s0bufptr    dw    ?
  34.     s0buflen    dw    ?
  35.     strip0sframe    ends
  36.  
  37. s0sframe        equ    [bp-s0bptr]
  38.  
  39.     push     bp        ; Stack frame manipulations
  40.     mov     bp,sp
  41.     sub    sp,s0bptr
  42.     push    di
  43.     push    es
  44.  
  45.     mov    cx, s0sframe.s0buflen
  46.     jcxz    S0EXIT
  47.     push    ds
  48.     pop    es
  49.     mov    ax, s0sframe.s0bufptr
  50.     mov    di, ax
  51.     xor    al, al
  52. S0S0:
  53.  
  54. repne    scasb
  55.     jne    S0EXIT
  56.     dec    di
  57.     inc    cx
  58.     mov    byte ptr [di], ' '
  59.     jmp    short    S0S0
  60.  
  61. S0EXIT:
  62.  
  63.     pop    es
  64.     pop    di
  65.         pop    bp
  66.            ret
  67.  
  68. _strip0s    ENDP
  69.  
  70. ;-----------------------------------------------------------
  71.  
  72. getproc    proc    near
  73.  
  74. ; detects processor type
  75. ; returns value in ax
  76. ; This routine is adapted from Michael Young's _MS-DOS_Advanced_
  77. ; Programming_
  78.  
  79.     push    di
  80.     push    es
  81.     pushf
  82.  
  83. ; 808x test
  84. ; Attempt to zero flag register. If four high-order bits still
  85. ; set, its an 808x.
  86. ;
  87.  
  88.     xor    ax, ax
  89.     push    ax
  90.     popf
  91.     pushf
  92.     pop    ax
  93.     and    ax, 0f000h
  94.     cmp    ax, 0f000h
  95.     jne    GP186TEST
  96.     mov    ax, 86
  97.     jmp    short    GPEXIT
  98.  
  99. GP186TEST:
  100. ; 186 test
  101. ; Push SP. 80186 decrements SP before pushing, so popped SP will
  102. ; not be equal. 286 and 386 decrement after push.
  103.  
  104.     push    sp
  105.     pop    ax
  106.     cmp    ax, sp
  107.     je    GP286TEST
  108.     mov    ax, 186
  109.     jmp    short    GPEXIT
  110.  
  111. GP286TEST:
  112. ; 286 test
  113. ; Attempt to set bits 15-12 of the flags register. If they don't set,
  114. ; it's a 286.
  115.  
  116.     mov    ax, 0f000h
  117.     push    ax
  118.     popf
  119.     pushf
  120.     pop    ax
  121.     and    ax, 0f000h
  122.     jnz    GP386
  123.     mov    ax, 286
  124.     jmp    short    GPEXIT
  125.  
  126. GP386:
  127. ; all that's left. 486s and sxes are not considered.
  128.  
  129.     mov    ax, 386
  130. GPEXIT:
  131.     popf
  132.     pop    es
  133.     pop    di
  134.     ret
  135.  
  136. getproc    ENDP
  137.  
  138. ;-----------------------------------------------------------
  139.  
  140. getfpu        proc        near
  141.  
  142. ; detects fpu type
  143. ; returns value in ax
  144.  
  145.     push    di
  146.     push    es
  147.  
  148.     mov    bx, ax
  149.     int    11h
  150.     and    ax, 02h
  151.     jz    FPUEXIT            ; no fpu installed
  152.  
  153.     cmp    bx, 286
  154.     jle    FNOT386
  155.  
  156. ; Test for 287 or 387.  This code adapted from the defunct but 
  157. ; fondly remembered PC Tech Journal.
  158.  
  159.     finit
  160.     fld1
  161.     fldz
  162.     fdiv                ;Create infinity
  163.     fld    st
  164.     fchs                ;Create negative infinity
  165.     fcompp                ;Compare
  166.     fstsw    control            ;Save control word
  167.     fwait                ;Just in case...
  168.     mov    ax,control
  169.     sahf                ;Control word in flags
  170.     mov    ax,287            ;Assume 80287
  171.     jz    FIS287
  172.     mov    ax,387            ;Nope, 80387
  173. FIS287:
  174.     jmp    short    FPUEXIT
  175. FNOT386:
  176.     mov    ax, bx
  177.     inc    ax
  178. FPUEXIT:
  179.     pop    es
  180.     pop    di
  181.     ret
  182.  
  183. getfpu    ENDP
  184.  
  185. ;-----------------------------------------------------------
  186.  
  187. getmhz        proc        near
  188.  
  189. ; this routine determines machine approximate speed for use in later
  190. ; estimates. while it uses as few memory accesses as possible, it will
  191. ; be affected by memory speed.
  192. ; On entry -- ax= proc type, 88=8088, etc.
  193. ; On exit -- ax = approx megahertz.
  194.  
  195.     jmp    short    GMHREALSTART
  196.  
  197.     checkval    db    0
  198.     convfact    dw    0
  199.  
  200. ; checkval == 1 if main routine has initialized and counter is 
  201. ; ready to run, 0 otherwise
  202. ; bl is the pass counter
  203.  
  204. FACT88        equ    7002
  205. FACT286        equ    4091
  206. FACT386        equ    3210
  207.  
  208. GMH1CHANDLER:
  209.  
  210.     push    ax
  211.  
  212.     push    cs
  213.     pop    ds
  214.  
  215.     mov    al, 1
  216.     cmp    al, checkval
  217.     jne    GMHCHAIN
  218.  
  219. ; now initialize routine has zeroed bx if this is the first pass
  220.  
  221.     inc    bl
  222.     cmp    al, bl
  223.     je    ONETWOEXIT    ; its the first pass
  224.  
  225.     mov    checkval, 0    ; clear checkval so we're done
  226.  
  227. ONETWOEXIT:
  228.  
  229.     pop    ax
  230.     iret
  231.  
  232. GMHCHAIN:
  233.  
  234.     pop    ax
  235.             db    0eah    ; sleazy far jump trick
  236.     gmhovo        dw    0
  237.     gmhovs        dw    0
  238.  
  239. GMHREALSTART:
  240.  
  241. ;************* this routine has been stubbed out because of interrupt
  242. ;************* incompatibility in some systems - 5/91
  243.  
  244.     mov    ax, 20            ; patched for unclean interrupts
  245.     ret
  246.  
  247.     push    di
  248.     push    es
  249.     push    ds
  250.  
  251.     push    cs
  252.     pop    ds
  253.  
  254.  
  255. ; store conversion factor
  256.  
  257.     cmp    ax, 386
  258.     jl    GMH28
  259.     mov    convfact, FACT386
  260.     jmp    short    GMFACTDONE
  261. GMH28:
  262.     cmp    ax, 286
  263.     jl    GMH88
  264.     mov    convfact, FACT286
  265.     jmp    short    GMFACTDONE
  266. GMH88:
  267.     mov    convfact, FACT88
  268. GMFACTDONE:
  269.  
  270. ; install new int 1c handler
  271. ; get old owner's address and install
  272.  
  273.     mov    ax,351ch    ; prepare for function call
  274.     int    21h        ; get address of int 1c handler in es:bx
  275.     mov    gmhovo, bx
  276.     mov    gmhovs, es
  277.     mov    dx, offset GMH1CHANDLER
  278.     mov    ax, 251ch
  279.     int    21h
  280.  
  281.     mov    al, 1
  282.     xor    cx, cx
  283.     xor    dx, dx
  284.     xor    bx, bx
  285.  
  286. ; turn on interrupt
  287.  
  288.     cli
  289.     mov    checkval, al
  290.     sti
  291.  
  292. GML0:
  293.     cmp    al, bl
  294.     jg    GML0
  295.  
  296. GML1:
  297.     cmp    al, bl
  298.     jl     DONE
  299.     loop    GML1
  300.     dec    dx
  301.     jmp    short    GML1
  302.  
  303. DONE:
  304. ; now hibits are in dx, lobits are in cx
  305.  
  306.     push    dx
  307.     push    cx
  308.  
  309. ; uninstall the nasty handler
  310.  
  311.     mov    dx, gmhovo
  312.     mov    ax, gmhovs
  313.     mov    ds, ax
  314.     mov    ax, 251ch
  315.     int    21h
  316.  
  317. ; mov numbers to dx:ax
  318.  
  319.     pop    ax
  320.     pop    dx
  321.  
  322.     neg    dx
  323.     neg    ax
  324.  
  325. ; compensate for time spent in interrupts
  326.  
  327.     add    ax, 15
  328.     adc    dx, 0
  329.  
  330. ; multiply by conversion factor to get thousands of cycles per second --
  331.  
  332.     push    dx        ; save high order
  333.     mov    bx, convfact
  334.     mul    bx
  335.  
  336.     pop    cx        ; old high order
  337.     push    ax        ; new low order
  338.     push    dx        ; new high order
  339.  
  340.     mov    ax, cx
  341.     mul    bx
  342.  
  343. ; if dx is not clear we're going to overflow
  344.  
  345.     cmp    dx, 0
  346.     je    GMNOOFLOW
  347.     pop    ax
  348.     pop    ax
  349.     pop    ds
  350.     mov    ax, 0ffffh
  351.     ret
  352.  
  353. GMNOOFLOW:
  354.  
  355.     pop    dx
  356.     add    dx, ax        ; multiplied result
  357.     pop    ax
  358.  
  359. ; divide by 10000
  360.  
  361.     mov    bx, 10000
  362.     cmp    bx, dx
  363.     jle    GMOFLOW2
  364.     div    bx
  365.     jmp    short  GMNOOFLOW2
  366.  
  367. GMOFLOW2:
  368.     mov    ax, 0ffffh    ; fastest machine there is 
  369.  
  370. GMNOOFLOW2:
  371. ; further divide by 1000 to convert to MHz
  372.  
  373.     xor    dx, dx
  374.     mov    bx, 1000
  375.     div    bx
  376.  
  377.     sar    bx,1
  378.     cmp    dx, bx
  379.     jl    GMNOROUNDUP
  380.     inc    ax
  381.  
  382. GMNOROUNDUP:
  383.  
  384.     pop    ds
  385.     pop    es
  386.     pop    di
  387.     ret
  388.  
  389. getmhz    ENDP
  390.  
  391. ;-----------------------------------------------------------
  392.  
  393. getga        proc        near
  394.  
  395. ; detects graphics adapter
  396. ; returns value in ax
  397. ; sets up the proper video segment for windowing routines.
  398. ; Adapted from routines in _Programmer's_Guide_to_PC_and_PS/2_
  399. ; _Video_Systems_, by Richard Wilton
  400. ;
  401. ;    Function returns the following values:
  402. ;    MDA - 6            CGA, - 3            None - 0
  403. ;    HERC - 5        EGA, Enhanced color - 2
  404. ;    EGA, Mono - 4       VGA - 1
  405. ;
  406.  
  407.     push    di
  408.     push    es
  409.  
  410.     xor      ax,ax        ;PS/2
  411.     mov     ax,1A00h
  412.     int     10h
  413.     xor     bh,bh        ;Discard inactive
  414.     mov     cl,bl
  415.     xor     bl,bl
  416.     cmp     cl,7        ;7 and 8 are VGA
  417.     jne     DUMMY
  418.     jmp     VGAFND
  419. DUMMY:    cmp     cl,8
  420.     jne      DUM1
  421.     jmp    VGAFND
  422. DUM1:    mov     bl,10h
  423.     mov     ah,12h
  424.     int     10h
  425.     cmp     bl,10h
  426.     je     CGATST
  427.     xor     bx,bx
  428.     mov     ax,40h        ;EGA maybe
  429.     mov     es,ax
  430.     mov     al,es:[87h]
  431.     test     al,08h        ;Test if EGA present but inactive
  432.     jnz     CGATST
  433.     test     al,02h        ;Test if EGA has mono display
  434.     jnz     EGMFND
  435.     jmp     EGAFND
  436. CGATST:    mov     ah,0Fh        ;Determine if any monochrome displays active
  437.     int     10h        ;    before continuing
  438.     cmp    al,7
  439.     je     MDATST
  440.            xor     bx,bx
  441.     mov     dx,3D4h
  442.     mov     al,0Fh
  443.     out     dx,al
  444.     inc     dx
  445.     in      al,dx
  446.     mov     ah,al
  447.     mov     al,77h        ;Arbitrary write value to test for 6845
  448.     out     dx,al
  449.     mov     cx,100h
  450. STALL1:    loop     STALL1
  451.     in      al,dx
  452.     xchg     ah,al
  453.     out     dx,al        ;Put it back
  454.     cmp     ah,77h
  455.     je      CGAFND 
  456. MDATST:    xor     bx,bx
  457.     mov     dx,3b4h        ;Same test, new address, for MDA, Herc
  458.     mov     al,0Fh
  459.     out     dx,al
  460.     inc     dx
  461.     in      al,dx
  462.     mov     ah,al
  463.     mov     al,77h        ;Arbitrary write value to test for 6845
  464.     out     dx,al
  465.     mov     cx,100h
  466. STALL2:    loop     STALL2
  467.     in      al,dx
  468.     xchg     ah,al
  469.     out     dx,al        ;Put it back
  470.     cmp     ah,77h
  471.     jne     LOST        ;Out of possibilities
  472.     mov     dx,3BAh        ;Differentiate between MDA, Herc
  473.     in      al,dx
  474.     and     al,80h
  475.     mov     ah,al
  476.     mov    cx,8000h    ;Wait 32 768 tries
  477. STALL3:    in    al,dx        ;Keep checking if bit changes
  478.     and     al,80h
  479.     cmp     ah,al
  480.     loope     STALL3
  481.     je     MDAFND
  482.     inc    bx
  483.     cmp    bx, 50        ; make it change over and over
  484.     jb     STALL3
  485.     xor    bx, bx
  486.     jmp    HRCFND
  487. MDAFND:    mov     bx,1    ;MDA start incrementing
  488. HRCFND: inc     bx    ;Different increments for different cards
  489. EGMFND: inc     bx
  490. CGAFND: inc     bx
  491. EGAFND: inc     bx
  492. VGAFND: inc     bx
  493. LOST:   mov    ax,bx
  494.  
  495.     cmp    ax, 3
  496.     jg    VIDEOFOUND
  497.  
  498.     push    ax
  499.     mov    ah, 0fh
  500.     int    10h
  501.     cmp    al, 07h
  502.     pop    ax
  503.     je    VIDEOFOUND
  504.  
  505. ;    vga, ega, or cga display found
  506.  
  507.     push    ax
  508.     mov    ah, 0fh
  509.     int    10h
  510.  
  511. ;    now current page is in bh
  512.  
  513.     mov    ax, 100h
  514.     mul    bh
  515.     add    ax, 0b800h
  516.     mov    video_seg, ax
  517.     pop    ax
  518.  
  519. VIDEOFOUND:
  520.  
  521.     pop    es
  522.     pop    di
  523.  
  524.            ret
  525.  
  526. getga    ENDP
  527.  
  528. ;-----------------------------------------------------------
  529.  
  530. getnumh        proc        near
  531.  
  532. ; detects number of hard disks 
  533. ; returns value in ax
  534.  
  535.     push    di
  536.     push    es
  537.  
  538.     mov    ah, 8
  539.     mov    dl, 80h
  540.     int    13h
  541.  
  542.     jnc    NHOKAY
  543.     xor    ax, ax
  544.     jmp    short    NHEXIT
  545. NHOKAY:
  546.     mov    al, dl
  547.     xor    ah, ah
  548.  
  549. NHEXIT:
  550.     pop    es
  551.     pop    di
  552.     ret
  553.  
  554. getnumh    ENDP
  555.  
  556. ;-----------------------------------------------------------
  557. _machine_detect    proc    near
  558.  
  559. ; void machine_detect (struct mcfig*);
  560. ; Detects processor speed and type, fpu, and graphics type, number
  561. ; of hard disks.
  562.  
  563.     mac_d        struc
  564.     mdbptr        dw    ?
  565.     mdraddr        dw    ?
  566.     mdhandle    dw    ?
  567.     mac_d        ends
  568.  
  569.  
  570. ; structure equates
  571.  
  572. graphics_type    equ    word ptr [di+15]
  573. proc_type    equ    word ptr [di+17]
  574. fpu_type    equ    word ptr [di+19]
  575. MHz        equ    word ptr [di+21]
  576. num_hard    equ    word ptr [di+23]
  577.  
  578. mdframe        equ    [bp-mdbptr]
  579.  
  580.     push     bp        ; Stack frame manipulations
  581.     mov     bp,sp
  582.     sub    sp,mdbptr
  583.     push    di
  584.     push    es
  585.  
  586.     push    ds
  587.     pop    es
  588.     mov    ax, mdframe.mdhandle
  589.     mov    di, ax
  590.  
  591. ; call detector routines
  592. ; all routines but getmhz and getfpu take no arguments and return value in ax
  593.  
  594.  
  595.     call    getga
  596.     mov    graphics_type, ax
  597.  
  598.     call    getproc
  599.     mov    proc_type, ax
  600.  
  601.     push    ax
  602.  
  603. ; getfpu and getmhz take proc_type in ax, so must follow getproc
  604.  
  605.     call    getfpu
  606.     mov    fpu_type, ax
  607.  
  608.     pop    ax
  609.  
  610.     call    getmhz
  611.     mov    MHz, ax
  612.  
  613.     call    getnumh
  614.     mov    num_hard, ax
  615.  
  616.     pop    es
  617.     pop    di
  618.         pop    bp
  619.            ret
  620.  
  621. _machine_detect    ENDP
  622.  
  623. ;-----------------------------------------------------------
  624.  
  625. _disk_check    proc    near
  626.  
  627. ; int disk_check (int drive number, int capcheckflag);
  628. ;
  629. ; given 1-based drive number returns 1 or zero based on the following:
  630. ; If the drive is not ready or invalid, return -1.
  631. ; If the drive is a floppy, return FLOPPY_KBYTES_REQD if 
  632. ; space is available; 0 if not.
  633. ; If the drive is a hard drive, return HD_KBYTES_REQD if space is 
  634. ; available; 0 if not.
  635. ;
  636. ; if capcheckflag == 0, do not ready or invalid check only.
  637. ;
  638. ;
  639.  
  640. FLOPPY_BYTES_REQD    equ    500
  641. HD_BYTES_REQD        equ    2000
  642.  
  643.     driv_ck        struc
  644.     dcbptr        dw    ?
  645.     dcraddr        dw    ?
  646.     drivnum        dw    ?
  647.     dcapflag    dw    ?
  648.     driv_ck        ends
  649.  
  650. ; structure equates
  651.  
  652. dcframe        equ    [bp-dcbptr]
  653.  
  654.     push     bp        ; Stack frame manipulations
  655.     mov     bp,sp
  656.     sub    sp,dcbptr
  657.     push    ds
  658.     push    es
  659.     push    di
  660.  
  661. ; determine if fixed or floppy using dos-free ioctl
  662.  
  663.     mov    ax, 4408h
  664.     mov    bx, dcframe.drivnum
  665.     int    21h
  666.  
  667.     jc    DCNOTRMV
  668.     cmp    al, 1
  669.     je    DCNOTRMV
  670.  
  671. ; check for drive not ready errors using bios, so no Abort,... message
  672. ; first get a buffer
  673.  
  674.     mov    bx, 33    ; paranoia
  675.     mov    ah, 48h
  676.     int    21h
  677.     jnc    DC_GOT_MEMORY
  678.     mov    ax, -1
  679.     jmp    DCEXIT
  680.  
  681. DC_GOT_MEMORY:
  682.  
  683.     mov    es, ax
  684.     mov    cx, 3
  685.  
  686. DC_TRYAGAIN:
  687.     xor    bx, bx
  688.     mov    dx, dcframe.drivnum
  689.     xor    dh, dh
  690.     dec    dl
  691.     push    cx
  692.     mov    cx, 1
  693.     mov    ax, 0401h        ; verify sector 0, cyl 0, head 0
  694.     int    13h
  695.     pop    cx
  696.     jnc    DCDRIVEREADY
  697.     xor    ah, ah
  698.      int    13h            ; reset before trying again
  699.     loop    DC_TRYAGAIN
  700.  
  701. ; lose
  702.     mov    ah, 49h
  703.     int     21h
  704.     mov    ax, -1
  705.     jmp     short    DCEXIT
  706.  
  707. DCDRIVEREADY:
  708.  
  709.     mov    ah, 49h    ; deallocate memory
  710.     int     21h
  711.  
  712. DCNOTRMV:
  713.  
  714. ; stop here if you don't care about capacity
  715.  
  716.     mov    ax, dcframe.dcapflag
  717.     cmp    ax, 0
  718.     jne    DCCONTINUE
  719.     mov    ax, 1
  720.     jmp    short    DCEXIT
  721.  
  722. DCCONTINUE:
  723. ; dos check
  724.  
  725.     push    ds
  726.     mov    ah, 1ch
  727.     mov    dx, dcframe.drivnum
  728.     int    21h
  729.  
  730. ; return -1 on error
  731.  
  732.     cmp    al, 0ffh
  733.     jne    DCNOERR
  734.     cbw
  735.     pop    ds
  736.     jmp    short    DCEXIT
  737. DCNOERR:
  738.  
  739. ; is this is a floppy?
  740.  
  741.     mov    bl, [ds:bx]
  742.     pop    ds
  743.  
  744.     cmp    bl, 0f8h
  745.     je    DCHARD
  746.  
  747. ; is it a 360k or non-standard (720k 5.25) drive?
  748.  
  749.     cmp    bl, 0fch
  750.     jl    DCFLOPOK
  751.     xor    ax, ax
  752.     jmp    short    DCEXIT
  753.  
  754. DCFLOPOK:
  755.     mov    bx, FLOPPY_BYTES_REQD
  756.     jmp    short CAPCHECK
  757. DCHARD:
  758.     mov    bx, HD_BYTES_REQD
  759. CAPCHECK:
  760.     push    bx    ; return value, eventually
  761.  
  762.     mov    ax, 1024
  763.     mul    bx
  764.  
  765.     mov    cap_reqd, ax
  766.     mov    cap_reqd+2, dx    ; save required bytes
  767.  
  768.     mov    ah, 36h
  769.     mov    dx, dcframe.drivnum
  770.     int    21h
  771.  
  772. ; determine if space is available
  773.  
  774.     push    bx    ; clusters available
  775.     push    ax    ; sectors per cluster
  776.     push    cx    ; bytes per sector
  777.  
  778.     mov    dx, cap_reqd+2
  779.     mov    ax, cap_reqd
  780.  
  781.     pop    bx    ; bytes per sector
  782.     div    bx    ; should leave the result a word for all reasonable 
  783.             ; space required (up to 32 megs at 512 bytes/sec)
  784.     xor    dx,dx
  785.     pop    bx    ; sectors per cluster
  786.     div    bx
  787.  
  788.     xor    dx, dx
  789.     pop    bx    ; clusters available
  790.     cmp    bx, 0
  791.     je    DCLOSER
  792.     div    bx
  793.  
  794. ; as long as ax is zero, we're fine
  795.  
  796.     cmp    ax, 0
  797.     jne    DCLOSER
  798.  
  799.     pop    ax
  800.     jmp    short    DCEXIT
  801.  
  802. DCLOSER:
  803.     pop    ax        ; bytes reqd - don't need now
  804.     xor    ax, ax
  805. DCEXIT:
  806.  
  807.     pop    di
  808.     pop    es
  809.     pop    ds
  810.     pop    bp
  811.            ret
  812. _disk_check    ENDP
  813.  
  814. ;___________________________________________________________________
  815.  
  816.  
  817. _get_default    proc    near
  818.  
  819. ; int get_default (void);
  820. ;
  821. ; Get default drive
  822.  
  823.     def_drive    struc
  824.     ddbptr        dw    ?
  825.     ddraddr        dw    ?
  826.     def_drive    ends
  827.  
  828. ; structure equates
  829.  
  830. ddframe        equ    [bp-ddbptr]
  831.  
  832.     push     bp        ; Stack frame manipulations
  833.     mov     bp,sp
  834.     sub    sp,ddbptr
  835.  
  836.     mov    ah, 19h
  837.     int    21h
  838.  
  839.     xor    ah, ah
  840.  
  841.     pop    bp
  842.            ret
  843. _get_default    ENDP
  844.  
  845. ;___________________________________________________________________
  846.  
  847.  
  848. _set_default    proc    near
  849.  
  850. ; void set_default (int);
  851. ;
  852. ; Get default drive
  853.  
  854.     sdef_drive    struc
  855.     sdbptr        dw    ?
  856.     sdraddr        dw    ?
  857.     sddrive        dw    ?
  858.     sdef_drive    ends
  859.  
  860. ; structure equates
  861.  
  862. sdframe        equ    [bp-sdbptr]
  863.  
  864.     push     bp        ; Stack frame manipulations
  865.     mov     bp,sp
  866.     sub    sp,sdbptr
  867.  
  868.     mov    ah, 0eh
  869.     mov    dx, sdframe.sddrive
  870.     int    21h
  871.  
  872.     pop    bp
  873.            ret
  874. _set_default    ENDP
  875.  
  876.  
  877. ;-----------------------------------------------------------
  878. _getpath    proc    near
  879.  
  880. ; void getpath (int drive, char * bufptr);
  881. ;
  882. ; Get current path
  883.  
  884.     g_path        struc
  885.     gpbptr        dw    ?
  886.     gpraddr        dw    ?
  887.     gpdrive        dw    ?
  888.     gp_pptr        dw    ?
  889.     g_path        ends
  890.  
  891. ; structure equates
  892.  
  893. gpframe        equ    [bp-gpbptr]
  894.  
  895.     push     bp        ; Stack frame manipulations
  896.     mov     bp,sp
  897.     sub    sp,gpbptr
  898.     push    si
  899.  
  900.     mov    dx, gpframe.gpdrive
  901.     inc    dl        ; make it 1-based
  902.     mov    ax, gpframe.gp_pptr
  903.     mov    si, ax
  904.  
  905.     mov    ah, 47h
  906.     int    21h
  907.  
  908.     pop    si
  909.     pop    bp
  910.            ret
  911. _getpath    ENDP
  912.  
  913. ;-----------------------------------------------------------
  914. _cdir    proc    near
  915.  
  916. ; int cdir (char * path);
  917. ;
  918. ; Change directories
  919.  
  920.     c_dir        struc
  921.     chdbptr        dw    ?
  922.     chdraddr    dw    ?
  923.     chd_pptr    dw    ?
  924.     c_dir        ends
  925.  
  926. ; structure equates
  927.  
  928. chdframe        equ    [bp-chdbptr]
  929.  
  930.     push     bp        ; Stack frame manipulations
  931.     mov     bp,sp
  932.     sub    sp,chdbptr
  933.  
  934.     mov    dx, chdframe.chd_pptr
  935.     xor    bx, bx
  936.  
  937.     mov    ah, 3bh
  938.     int    21h
  939.     adc    bx, 0
  940.     not    bl
  941.     and    bl, 1
  942.     mov    ax, bx
  943.  
  944.     pop    bp
  945.            ret
  946. _cdir    ENDP
  947.  
  948. ;-----------------------------------------------------------------
  949. _click    proc    near
  950.  
  951. PPI_61        equ    61h        ; -enable keyboard or
  952.                     ; +clear keyboard (bit 7)
  953. ;
  954. ; void click( void);
  955. ;
  956.     clik        struc
  957.     clkbptr        dw    ?
  958.     clkraddr    dw    ?
  959.     clik        ends
  960.  
  961. ; structure equates
  962.  
  963. clkframe        equ    [bp-clkbptr]
  964.  
  965.     push     bp        ; Stack frame manipulations
  966.     mov     bp,sp
  967.     sub    sp,clkbptr
  968.  
  969. ; Make a keyclick
  970.  
  971.     mov    bx,08
  972.  
  973. click_loop:
  974.     in    al,PPI_61
  975.     or    al,2            ; Speaker on
  976.     out    PPI_61,al
  977.     mov    cx,0060
  978. click1:
  979.     loop    click1
  980.     and    al,0fdh            ; Speaker off
  981.     out    PPI_61,al
  982.     mov    cx,0060
  983. click2:
  984.     loop    click2
  985.     dec    bx
  986.     jnz    click_loop
  987. click_out:
  988.     pop    bp
  989.     ret
  990.  
  991. _click    endp
  992. ;-----------------------------------------------------------
  993.  
  994. _text    ends
  995.     END
  996.  
  997.