home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0020 - 0029 / ibm0020-0029 / ibm0028.tar / ibm0028 / INSTALL2.TD0 / SOURCES.LIF / _GETSYS.ASM next >
Encoding:
Assembly Source File  |  1990-09-27  |  12.3 KB  |  505 lines

  1. ;=============================================================================
  2. ;
  3. ;     The INSTALL program source code, object code, sample  script files,
  4. ;     executable  program,  and  documentation  are  subject to copyright
  5. ;     protection under the laws of the United States and other countries.
  6. ;
  7. ;     This software is licensed, not sold, and may only be  redistributed
  8. ;     in  executable format and only in accordance with the provisions of
  9. ;     the INSTALL Source Code License Agreement.
  10. ;
  11. ;        INSTALL is Copyright(C) 1987-1989 by Knowledge Dynamics Corp
  12. ;       Highway Contract 4 Box 185-H, Canyon Lake, TX (USA) 78133-3508
  13. ;              512-964-3994 (Voice)   512-964-3958 (24-hr FAX)
  14. ;
  15. ;                     All rights reserved worldwide.
  16. ;
  17. ;===============================================================================
  18. ;
  19. ;FILENAME:
  20. ;       _getsys.asm
  21. ;
  22. ;AUTHOR:
  23. ;    eric jon heflin
  24. ;
  25. ;PUBLIC FUNCTIONS:
  26. ;
  27. ;LOCAL FUNCTIONS:
  28. ;
  29. ;DESCRIPTION:
  30. ;       The purpose of the functions in this file are to determine
  31. ;       information not available to a high-level language under MS-DOS.
  32. ;
  33. ;       Under OS/2, most of these functions are not applicable, or are
  34. ;       directly available through a API call.  The single exception is the
  35. ;       function _cpu_type which is the only function in this file needed
  36. ;       for the OS/2 version.
  37. ;
  38. ;REVISION HISTORY:
  39. ;       DATE:    AUTHOR:        DESCRIPTION OF CHANGES:
  40. ;    900130  ejh             Added OS/2 compatiblility.
  41. ;
  42. ;==============================================================================*/
  43.  
  44. TITLE getsys - copr(c) 1989 Knowledge Dynamics Corp.
  45. PAGE 66,132
  46.  
  47. IFNDEF LCODE
  48.     IF1
  49.     err
  50.     %out//////////////////////////////////////////////////////////////////////////////
  51.     %out// You must define the memory model using the "/DLCODE=#" command line      //
  52.     %out// argument to either TASM, MASM, or LASM, where # indicates data seg size  //
  53.     %out// and is either:                                                           //
  54.     %out//          0 for the compact model                                         //
  55.     %out//          1 for the large model                                           //
  56.     %out//                                                                          //
  57.     %out// For example /DLCODE=0 assembles this file in the compact model,          //
  58.     %out// /DLCODE=1  assembles this file in the large model.                       //
  59.     %out//                                                                          //
  60.     %out// To assemble this file automatically use the 'make' utility.  For         //
  61.     %out// Knowledge Dynamics' make, just type 'make'.                              //
  62.     %out//////////////////////////////////////////////////////////////////////////////
  63.     nowarn
  64.     ENDIF
  65. ENDIF
  66.  
  67. IF LCODE EQ 1
  68. .model large
  69. ELSE
  70. .model compact
  71. ENDIF
  72.  
  73. IF1
  74. IF ((@CodeSize EQ 0) AND (@DataSize EQ 0))
  75.     %out _GETSYS.ASM Has Been Assembled In The Small or Tiny Memory Model
  76. ENDIF
  77. IF ((@CodeSize EQ 0) AND (@DataSize EQ 1))
  78.     %out _GETSYS.ASM Has Been Assembled In The Compact Memory Model
  79. ENDIF
  80. IF ((@CodeSize EQ 1) AND (@DataSize EQ 0))
  81.     %out _GETSYS.ASM Has Been Assembled In The Medium Memory Model
  82. ENDIF
  83. IF ((@CodeSize EQ 1) AND (@DataSize EQ 3))
  84.     %out _GETSYS.ASM Has Been Assembled In The Huge Memory Model
  85. ENDIF
  86. IF ((@CodeSize EQ 1) AND (@DataSize EQ 1))
  87.     %out _GETSYS.ASM Has Been Assembled In The Large Memory Model
  88. ENDIF
  89. ENDIF
  90.  
  91. if (@CodeSize EQ 1)
  92.     x    equ    6
  93. else
  94.     x    equ    4
  95. endif
  96.  
  97.     sgmnt    equ    0
  98.     offst    equ    2
  99.  
  100. if (@DataSize EQ 1) OR (@DataSize EQ 2)
  101.     s_off    equ    4
  102.     s_seg    equ    6
  103.     len        equ    8
  104. else
  105.     string    equ    4
  106.     len        equ    6
  107. endif
  108.  
  109. IFNDEF OS2_TARGET
  110.  
  111. ;----------------------------------------------------------------------------
  112. ;
  113. ; DESC:
  114. ;     Return EMM status information in three global vars.
  115. ;
  116. ; REFERENCES:
  117. ;    Advanced MS-DOS Programming, Ray Duncan.
  118. ;
  119. ; RETURNS:
  120. ;       _emm_major = major version number (i.e. 3 or 4 for 3.0 or 4.0)
  121. ;    _emm_minor = minor version number
  122. ;    _emm_total = total number of pages of EMM installed
  123. ;    _emm_avail = total number of pages of EMM available for allocation
  124. ;
  125. ;----------------------------------------------------------------------------
  126.  
  127. emm        equ    67h
  128.  
  129. .data
  130.     public    __emm_major
  131.     public    __emm_minor
  132.     public    __emm_total
  133.     public    __emm_avail
  134.  
  135. __emm_major    db    ?
  136. __emm_minor    db    ?
  137. __emm_total    dw    ?
  138. __emm_avail    dw    ?
  139. emm_name    db    "EMMXXXX0",0    ;EMM device driver name (always)
  140.  
  141. .code
  142.     public    _emm_stat
  143. _emm_stat    proc
  144.     push    bp            ;Save regs
  145.     mov     bp,sp                   ;set up our stack addressability
  146.     push    es
  147.     push    si
  148.     push    di
  149.     push    ds
  150.     push    cx
  151.     push    dx
  152.     pushf                ;save flags (esp. direction flag)
  153.  
  154. ;    assume the worst - no emm
  155.     xor    ax,ax
  156.     mov    __emm_major,al
  157.     mov    __emm_minor,al
  158.     mov    __emm_avail,ax
  159.     mov    __emm_total,ax
  160.  
  161.     mov    al,emm            ;EMM int number
  162.     mov    ah,35h            ;get vector
  163.     int    21h            ;ES:0000 = base of EMM
  164.     mov    di,10
  165. ;    the following two lines may be needed by some compilers
  166. ;    mov    si,seg emm_name
  167. ;    mov    ds,si
  168.     mov    si,offset emm_name
  169.     mov    cx,8            ;length of name
  170.     cld
  171. repz    cmpsb                ;compare names
  172.     jnz    @@bye            ;jmp if no EMM driver
  173.  
  174. ;    now get EMM status
  175.     mov    ah,40h
  176.     int    67h
  177.     or    ah,ah
  178.     jnz    @@bye
  179.  
  180. ;    now get EMM version
  181.     mov    ah,46h
  182.     int    67h
  183.     or    ah,ah
  184.     jnz    @@bye
  185.     mov    __emm_minor,al
  186.     and    __emm_minor,0fh
  187.     mov    ah,al
  188.     shr    al,1
  189.     shr    al,1
  190.     shr    al,1
  191.     shr    al,1
  192.     mov    __emm_major,al
  193.  
  194. ;    ensure version >= 3.0
  195.     cmp    ah,030h
  196.     jb    @@bye
  197.  
  198. ;    get total & available 16K pages
  199.     mov    ah,42h
  200.     int    67h
  201.     or    ah,ah
  202.     jnz    @@bye
  203.     mov    __emm_total,dx
  204.     mov    __emm_avail,bx
  205. @@bye:
  206.     popf
  207.     pop    dx
  208.     pop    cx
  209.     pop    ds
  210.     pop    di
  211.     pop    si
  212.     pop    es
  213.     pop    bp
  214.     ret
  215. _emm_stat endp
  216.  
  217. ;----------------------------------------------------------------------------
  218. ;
  219. ; DESC:
  220. ;     Return RAM size information in two global vars.
  221. ;
  222. ; REFERENCES:
  223. ;    IBM PC Technical Reference Manual.
  224. ;
  225. ; RETURNS:
  226. ;    _ram_total = total number of paragraphs of RAM installed
  227. ;    _ram_avail = total paragrpahs of RAM available for allocation
  228. ;
  229. ;----------------------------------------------------------------------------
  230.  
  231. .data
  232.     public    __ram_total
  233.     public    __ram_avail
  234.  
  235. __ram_total    dw    ?
  236. __ram_avail    dw    ?
  237.  
  238. .code
  239.     public    _ram_stat
  240. _ram_stat    proc
  241.     push    bp            ;Save regs
  242.     mov     bp,sp                   ;set up our stack addressability
  243.     push    cx
  244.     push    dx
  245.  
  246.     xor    ax,ax
  247.     int    12h        ; get conventional memory size
  248.     mov    __ram_total,ax
  249.  
  250.     pop    dx
  251.     pop    cx
  252.     pop    bp
  253.     ret
  254. _ram_stat endp
  255.  
  256. ;----------------------------------------------------------------------------
  257. ;
  258. ; DESC:
  259. ;     Return RAM size information in two global vars.
  260. ;
  261. ; REFERENCES:
  262. ;    IBM PC Technical Reference Manual.
  263. ;
  264. ; RETURNS:
  265. ;    _ram_total = total number of paragraphs of RAM installed
  266. ;    _ram_avail = total paragrpahs of RAM available for allocation
  267. ;
  268. ;----------------------------------------------------------------------------
  269. .data
  270.     public    __equ_list
  271. __equ_list    dw    ?
  272.  
  273. .code
  274.     public    _equ_stat
  275. _equ_stat    proc
  276.     push    bp            ;Save regs
  277.     mov     bp,sp                   ;set up our stack addressability
  278.     push    cx
  279.     push    dx
  280.  
  281.     xor    ax,ax
  282.     int    11h        ; get conventional memory size
  283.     mov    __equ_list,ax
  284.  
  285.     pop    dx
  286.     pop    cx
  287.     pop    bp
  288.     ret
  289. _equ_stat endp
  290.  
  291.  
  292.  
  293. ;-----------------------------------------------------------------------------
  294. ;
  295. ; DESCRIPTION:
  296. ;    This function determines if the BIOS supports extended keyboard
  297. ;    calls.
  298. ;
  299. ; RETURNS:
  300. ;     0 = extended keyboard calls not supported.
  301. ;       >0 = extended keyboard calls supported.
  302. ;
  303. ;    All regs preserved except AX.
  304. ;-----------------------------------------------------------------------------
  305.  
  306.     public _kbdtype
  307. _kbdtype    proc
  308.     push    bp                     ; std entry
  309.     mov     bp,sp                   ; set up our stack addressability
  310.  
  311.     push    ds            ; save used regs
  312.     push    es
  313.     push    bx
  314.     push    cx
  315.     push    dx
  316.  
  317.     xor    ax,ax            ; clear es
  318.     mov    es,ax
  319.     mov    ah,12h            ; ask for extended 'get shift info'
  320.     int    16h            ; call BIOS
  321.     cmp    al,byte ptr es:[417h]    ; see if al agrees with actual status
  322.     jne    @@bad            ; jmp if al is incorrect
  323.  
  324.     xor    byte ptr es:[417h],80h    ; change data area
  325.     mov    ah,12h            ; get extended shift info again
  326.     int    16h
  327.     cmp    al,byte ptr es:[417h]    ; check al and data area again
  328.     jne    @@bad            ; jmp al is wrong
  329.     mov    ax,1            ; return 1
  330.     jmp    short @@good
  331. @@bad:
  332.     xor    ax,ax            ; return 0
  333. @@good:
  334.     xor    byte ptr es:[417h],80h    ; restore data area
  335.  
  336.     pop    dx            ; restore regs
  337.     pop    cx
  338.     pop    bx
  339.     pop    es
  340.     pop    ds
  341.     pop    bp            ; std exit
  342.     ret
  343. _kbdtype    endp
  344.  
  345. ;-----------------------------------------------------------------------------
  346. ;
  347. ; DESCRIPTION:
  348. ;    Using safe methods, deterime if NetBIOS is installed.
  349. ;
  350. ; RETURNS:
  351. ;    -1 = could not safely determine presence.
  352. ;     0 = NetBIOS is not present.
  353. ;    >0 = NetBios is present.
  354. ;
  355. ; CAUTIONS:
  356. ;    Testing for the presence of NetBIOS can result in a system crash
  357. ;    on IBM-XT class machines if care is not taken.  This routine
  358. ;    takes the approach that will result in a return of -1 (unknown)
  359. ;    if it decides that it would be dangerous to use other tests.  This
  360. ;    code takes advantage of the BIOS power-on behaviour of initializing
  361. ;    unused interupt vectors in the low-memory table to point to an
  362. ;    IRET instruction.  Unfornuately, PC's and XT's uninitilized vectors
  363. ;    point to 0000:0000.  If a debugger takes over the NetBIOS interrupt
  364. ;    thus changing the interupt to not point to 0000:0000, there is no
  365. ;    reliable method to determine if the vector is valid withought
  366. ;    crashing the machine.  Don't blame Knowledge Dynamics, this
  367. ;    deplorable situation is due to IBM & Microsoft design decisions
  368. ;    made over 10 years ago.
  369. ;
  370. ;-----------------------------------------------------------------------------
  371.     public    _netbios
  372. _netbios    proc
  373.         push    bp                     ; Save regs
  374.     mov     bp,sp                   ; set up our stack addressability
  375.     push    es
  376.     push    si
  377.     push    di
  378.     push    ds
  379.  
  380. ;    first, confirm DOS version supports networks >= 3.1
  381.     mov    ah,30h
  382.     int    21h
  383.     cmp    ax,301h
  384.     jb    @@no_net
  385.  
  386. ;    next, see if a LANA card is installed
  387.     mov    ax,0cc00h        ; addr of NetBIOS ROM option
  388.     mov    es,ax
  389.     cmp    byte ptr es:[0],0aah    ; look for extended ROM signature
  390.     cmp    byte ptr es:[1],55h
  391.     jne    @@no_net
  392.  
  393. ;    see if SHARE.EXE is installed by checking multiplex interrupt
  394.  
  395.  
  396. ;    now see if network interrupts point to a reasonable value
  397.     mov    ah,35h
  398.     mov    al,2ah            ; check int 2ah
  399.     int    21h
  400.     mov    ax,es
  401.     cmp    ax,0
  402.     je    @@no_net
  403.     cmp    ax,0f000h
  404.     je    @@no_net
  405.     mov    ah,35h
  406.     mov    ah,5ch            ; check int 5ch
  407.     int    21h
  408.     mov    ax,es
  409.     cmp    ax,0
  410.     je    @@no_net
  411.     cmp    ax,0f000h
  412.     je    @@no_net
  413.  
  414. ;    finally, issue a bad NetBIOS call and see if ah is changed
  415.     xor    ah,ah
  416.     int    2ah            ; set if NetBIOS is loaded
  417.     cmp    ah,0            ; if ah == 0, NetBIOS is not loaded
  418.     jne    @@no_net
  419.  
  420. ;    if execute gets here, NetBIOS is available
  421.     mov    ax,1            ; return present status
  422.     jmp    short @@net_ok
  423.  
  424. @@no_net:
  425.     xor    ax,ax            ; return not present status
  426.  
  427. @@net_ok:
  428.     pop    ds
  429.     pop    di
  430.     pop    si
  431.     pop    es
  432.     pop    bp
  433.     ret
  434. _netbios    endp
  435.  
  436. ENDIF   ; !OS2_TARGET
  437.  
  438.  
  439. ;-----------------------------------------------------------------------------
  440. ;
  441. ; DESC:
  442. ;    Determine CPU class.
  443. ;
  444. ; REFERENCES:
  445. ;     Based on COMPAQ DESKPRO 386/20 Technical Reference Guide
  446. ;     (originally suggested by INTEL).
  447. ;
  448. ; RETURNS:
  449. ;    AX = CPU type
  450. ;    0086 if 8088/8086
  451. ;    0286 if 80286
  452. ;    0386 if 80386
  453. ;
  454. ;    All regs preserved except AX.
  455. ;
  456. ;-----------------------------------------------------------------------------
  457. .code
  458.     public    _cputype
  459. _cputype    proc
  460.         push    bp                     ; Save regs
  461.     mov     bp,sp                   ; set up our stack addressability
  462.     pushf            ;save the real flags register
  463.  
  464.     pop    ax        ;get register off stack
  465.     push    ax        ;and save it again
  466.  
  467.     and    ax,0fffh    ;zero out bits 12-15
  468.     push    ax
  469.     popf            ;try to put into flags
  470.     pushf
  471.     pop    ax        ;let's see what came out
  472.                 ;of flags
  473.     and    ax,0F000h    ;mask off bits 12-15
  474.     cmp    ax,0F000h    ;were these bits all 1's
  475.     je    is_86        ;if so, it's an 8086
  476.  
  477.     pop    ax        ;get flags register to AX
  478.     push    ax        ;and save it again
  479.  
  480.     or    ax,0F000h    ;now try to set bits 12-15
  481.     push    ax
  482.     popf            ;of the flags register
  483.     pushf
  484.     pop    ax        ;and see what came out
  485.     and    ax,0F000h    ;are high bits set
  486.     je    is_286        ;if so, we have a 386
  487. is_386:    mov    ax,0386
  488.     jmp    short    cpu_exit
  489.  
  490. is_286:    mov    ax,0286
  491.     jmp    short    cpu_exit
  492.  
  493. is_86:    mov    ax,86
  494.  
  495. cpu_exit:
  496.     popf            ;restore flags
  497.     pop    bp
  498.     ret
  499. _cputype    endp
  500.  
  501.     end
  502.  
  503. ; end-of-file
  504.  
  505.