home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / batutl / echsys10.arc / ECHOSYS.ASM next >
Assembly Source File  |  1989-09-25  |  23KB  |  557 lines

  1. ; EchoSys : show current system data (drive, dir, time, date etc)
  2. ;           for redirection purposes
  3. ;
  4. ; Version 1.0
  5. ;
  6. ; Free Software by TapirSoft Gisbert W.Selke, Sept 1989
  7. ;
  8. ; This programme may be used and copied any way you wish, except don't
  9. ; sell it. Give credit where credit is due, please. - The copyright remains
  10. ; with me; I do not guarantee proper operation of this utility; the whole
  11. ; risk of use lies with the user.
  12. ;
  13. ; Usage:   echosys <string>
  14. ;          String is echoed to stdout; two-char sequences introduced by '^'
  15. ;          are replaced as indicated at 'Usage' below.
  16. ;
  17. ; TASM     echosys                  or        MASM   echosys
  18. ; TLINK /t echosys                            LINK   echosys
  19. ;                                             EXEBIN echosys.exe echosys.com
  20.  
  21. BackSpace       Equ     08h
  22. LineFeed        Equ     0Ah
  23. Return          Equ     0Dh
  24. CtrlZ           Equ     1Ah
  25.  
  26.  
  27. DisplayAL       Macro                           ; macro to echo the
  28.                 Mov     dl, al                  ; contents of AL to stdout
  29.                 Mov     ah, 02h
  30.                 Int     21h
  31.                 Endm
  32.  
  33. DisplayChar     Macro   Chr                     ; macro to echo a character
  34.                 Mov     dl, Chr                 ; character to stdout
  35.                 Mov     ah, 02h
  36.                 Int     21h
  37.                 Endm
  38.  
  39. Jmps            Macro   Label                   ; Jump short
  40.                 Jmp short Label
  41.                 Endm
  42.  
  43.  
  44. cseg            Segment
  45.  
  46.                 Org 0080h
  47. Parameter       Db      ?
  48.  
  49.                 Org 100h
  50.                 Assume CS:cseg, DS:cseg, ES:cseg
  51.  
  52. Start:          Jmp     Begin
  53.  
  54.                 db      'SPECIAL='
  55. Special         db      '^'
  56.  
  57.                 db      Return
  58. Copyright       db      'EchoSys 1.0 - Free software by TapirSoft'
  59.                 db      ' Gisbert W.Selke, Sept 89', Return, LineFeed
  60.                 db      'Use at your own risk.$', BackSpace, ' '
  61.                 db      Return, LineFeed, CtrlZ
  62.  
  63. Usage1          db      Return, LineFeed, LineFeed
  64.                 db      'Usage: echosys <string>', Return, LineFeed
  65.                 db      'The string is echoed to stdout with "$'
  66. Usage2          db      '@" replaced as indicated by @:', Return, LineFeed
  67.                 db      ': drive; \ directory; F free disk space; '
  68.                 db      'T total disk space; R free RAM;', Return, LineFeed
  69.                 db      'r RAM size; l #drives; f #floppies; P #printers; '
  70.                 db      'S #serial ports;', Return, Linefeed
  71.                 db      '7 coprocessor? L LPT1 status; V video mode; '
  72.                 db      'w screen width; t type of PC;', Return, LineFeed
  73.                 db      'v DOS version; b BIOS version; i "<" symbol; '
  74.                 db      'o ">" symbol; p "|" symbol; ', Return, LineFeed
  75.                 db      'O switch char; A author''s note; '
  76.                 db      'x char given by next 2 hex digits;', Return, LineFeed
  77.                 db      'K key typed by user; C country code; $'
  78. Usage3          db      ' currency string;', Return, LineFeed
  79.                 db      'k 1000s separator; 1 decimal separator; '
  80.                 db      '/ date separator; - time separator;'
  81.                 db      Return, LineFeed
  82.                 db      'D day; M month; Y year; W weekday; h hour; m minute; '
  83.                 db      's second; c centisecond.'
  84.                 db      Return, LineFeed, Return, LineFeed, '$'
  85.  
  86. RetVal          db      0
  87.  
  88. ModelString     db      '??80AP30??ATJRXTPC'
  89. ModelStrLen     Label   Byte
  90.  
  91. CmdLetters      db      'csmhWYMD-/1k$CpoiKxAObvtwVL7SPflRrTF\:';command letters
  92. EndCmdLetters   Label   Word
  93.  
  94. ; **NOTE**: order of CmdLetters and Dispatch is reversed w.r.t. each other!
  95.  
  96. Dispatch        dw      Drive, Directory, FreeSpace, TotalSpace, MemSize
  97.                 dw      FreeMem, LogicDrives, Floppies, Printers
  98.                 dw      CommPorts, Coproc, LptStat, VideoMode, VideoWidth
  99.                 dw      SysModel, DosVersion, BiosVersion, SwitchChar, Author
  100.                 dw      Hexnumber, KeyBoard
  101.                 dw      StdInSymbol, StdOutSymbol, PipeSymbol, CountryInfo
  102.                 dw      Currency, Thousands, Decimal, DateSep, TimeSep
  103.                 dw      Day, Month, Year, WeekDay
  104.                 dw      Hour, Minute, Second, CentiSecond
  105.  
  106.  
  107. Begin:          Mov     sp, Offset OurStack     ; point to our own stack
  108.                 Mov     bx, Offset ProgEnd + 15 ; pointer to end of programme
  109.                 Mov     cl, 4                   ; convert size to paragraphs
  110.                 ShR     bx, cl
  111.                 Mov     ah, 4Ah                 ; return unused memory to DOS
  112.                 Int     21h
  113.  
  114.                 Mov     ah, 2Ch                 ; get current time right now
  115.                 Int     21h
  116.                 Mov     [TimeBuf],   ch         ; stow away
  117.                 Mov     [TimeBuf+1], cl
  118.                 Mov     [TimeBuf+2], dh
  119.                 Mov     [TimeBuf+3], dl
  120.                 Mov     ah, 2Ah                 ; get current date
  121.                 Int     21h
  122.                 Sub     cx, 1900                ; remove centuries
  123.                 Mov     word ptr [DateBuf], cx  ; stow away
  124.                 Mov     [DateBuf+2], dh
  125.                 Mov     [DateBuf+3], dl
  126.                 Mov     [DateBuf+4], al
  127.  
  128.                 Mov     si, 1+offset Parameter  ; command line string
  129.                 Lodsb
  130.                 Cmp     al, ' '                 ; skip first char, if
  131.                 Je      NextChar                ; blank or tab
  132.                 Cmp     al, 09h
  133.                 Je      NextChar
  134.                 Cmp     al, Return
  135.                 Jne     CheckSpecials
  136.                 Mov     dx, offset Copyright    ; show author's note
  137.                 Mov     ah, 09h
  138.                 Int     21h
  139.                 Mov     dx, offset Usage1       ; show usage hints
  140.                 Mov     ah, 09h
  141.                 Int     21h
  142.                 DisplayChar Special
  143.                 Mov     dx, offset Usage2       ; more usage hints
  144.                 Mov     ah, 09h
  145.                 Int     21h
  146.                 DisplayChar '$'
  147.                 Mov     dx, offset Usage3       ; more usage hints
  148.                 Mov     ah, 09h
  149.                 Int     21h
  150.                 Mov     [RetVal], 0FFh          ; termination code
  151.                 Jmps    Done
  152.  
  153. NextChar:       Lodsb
  154.                 Cmp     al, Return              ; are we done?
  155.                 Jne     CheckSpecials
  156. Done:           Mov     ah, 4Ch                 ; terminate normally
  157.                 Mov     al, [RetVal]            ; return code
  158.                 Int     21h
  159.  
  160.  
  161. CheckSpecials:  Cmp     al, Special             ; is it special sequence?
  162.                 Je      DoSpecials
  163. CheckSp2:       DisplayAL                       ; otherwise just display it
  164.                 Jmps    NextChar                ; and loop
  165.  
  166. DoSpecials:     Lodsb                           ; get next char of sequence
  167.                 Mov     di, offset CmdLetters   ; look up in table
  168.                 Mov     cx, (offset EndCmdLetters) - (offset CmdLetters)
  169.                 Repne   Scasb
  170.                 Jz      DoSp2                   ; jump if found
  171.                 Cmp     al, Return              ; otherwise: are we done?
  172.                 Je      Done
  173.                 Jmps    CheckSp2                ; otherwise treat normal
  174.  
  175. DoSp2:          Add     cx, cx                  ; double for Word
  176.                 Mov     bx, cx
  177.                 Call    [dispatch+bx]           ; call the subroutine
  178.                 Jmps    NextChar
  179.  
  180.  
  181. Drive:          Mov     ah, 19h                 ; get current drive
  182.                 Int     21h
  183.                 Add     al, 41h                 ; convert to ASCII
  184.                 Mov     [RetVal], al            ; store for return
  185.                 DisplayAL                       ; and show it
  186.                 DisplayChar ':'                 ; and a colon
  187.                 Ret
  188.  
  189.  
  190. Directory:      Mov     cx, si                  ; save si
  191.                 Mov     si, offset DirString    ; buffer for dir string
  192.                 Xor     dl, dl                  ; use current drive
  193.                 Mov     ah, 47h                 ; get directory string
  194.                 Int     21h
  195.  
  196.                 DisplayChar '\'                 ; initial backslash
  197.  
  198. ShowDirLoop:    Lodsb                           ; get next byte
  199.                 Or      al, al                  ; is it terminating null?
  200.                 Jz      ShowDirEnd
  201.                 mov     dl, al                  ; otherwise show char
  202.                 Int     21h                     ; (ah is ok!)
  203.                 Jmps    ShowDirLoop             ; and loop
  204. ShowDirEnd:     Mov     si, cx                  ; restore si
  205.                 Ret
  206.  
  207.  
  208. FreeSpace:      Mov     ah, 36h                 ; get disk space
  209.                 Xor     dl, dl                  ; on default disk
  210.                 Int     21h
  211.                 Jmps    ShowSpace
  212.  
  213.  
  214. TotalSpace:     Mov     ah, 36h                 ; get disk space
  215.                 Xor     dl, dl                  ; on default disk
  216.                 Int     21h
  217.                 Mov     bx, dx                  ; choose total clusters
  218. ShowSpace:      Mul     cx                      ; dx:ax = bytes per cluster
  219.                 Mov     cx, 10                  ; prepare conversion to kB
  220. ShowSp2:        Or      dx, dx                  ; if dx > 0, shift it
  221.                 Jz      ShowSp3
  222.                 Inc     cl
  223.                 Shr     dx, 1
  224.                 Rcr     ax, 1
  225.                 Jmps    ShowSp2
  226. ShowSp3:        Mul     bx                      ; multiply by clusters
  227. ShowSp4:        Shr     dx, 1                   ; divide by 1024
  228.                 Rcr     ax, 1
  229.                 Loop    ShowSp4
  230.                 Mov     cx, 1000                ; process high digits first
  231.                 Div     cx
  232.                 Mov     [RetVal], al            ; save for return
  233.                 Mov     bx, dx                  ; save remainder
  234.                 Xor     dh, dh                  ; no minimum # of digits
  235.                 Or      ax, ax                  ; are there high digits?
  236.                 Jz      ShowSp5                 ; if not, skip
  237.                 Call    DisplayNumber           ; otherwise display
  238.                 Mov     dh, 3                   ; then minimum 3 digits
  239. ShowSp5:        Mov     ax, bx                  ; retrieve low digits
  240.                 Jmp     DisplayNumber
  241.                 Ret
  242.  
  243.  
  244. MemSize:        Int     12h                     ; get memory size
  245.                 Mov     [RetVal], ah            ; save for return
  246.                 Xor     dh, dh                  ; no minimum # of digits
  247.                 Jmp     Displaynumber
  248.  
  249.  
  250. FreeMem:        Int     12h                     ; get total RAM size
  251.                 Mov     bx, es                  ; get start address of PSP
  252.                 Mov     cl, 6                   ; convert paras to KB
  253.                 Shr     bx, cl
  254.                 Sub     ax, bx                  ; subtract from total RAM
  255.                 Mov     [RetVal], ah            ; save for return
  256.                 Xor     dh, dh
  257.                 Jmp     DisplayNumber           ; presto: free RAM!
  258.  
  259.  
  260. LogicDrives:    Mov     ah, 19h                 ; get number of logical drives
  261.                 Int     21h                     ; first, get current disk
  262.                 Mov     dl, al
  263.                 Mov     ah, 0Eh                 ; now get that number
  264.                 Int     21h
  265.                 Jmp     DisplayVeryShort
  266.  
  267.  
  268. Floppies:       Int     11h                     ; number of floppies
  269.                 Test    al, 00000001b           ; is floppy installed?
  270.                 Jne     FloppiesFound           ; skip if so
  271.                 Xor     al, al                  ; otherwise set to 0
  272.                 Jmp     DisplayVeryShort
  273.  
  274. FloppiesFound:  Mov     cl, 6                   ; isolate number of floppies
  275.                 ShR     al, cl
  276.                 And     al, 0F3h
  277.                 Inc     al
  278.                 Jmp     DisplayVeryShort
  279.  
  280.  
  281. Printers:       Int     11h                     ; number of printers
  282.                 Mov     cl, 14                  ; isolate number of printers
  283.                 ShR     ax, cl
  284.                 Jmp     DisplayVeryShort
  285.  
  286.  
  287. CommPorts:      Int     11h                     ; number of comm ports
  288.                 Mov     cl, 9                   ; isolate number of ports
  289.                 ShR     ax, cl
  290.                 And     al, 7
  291.                 Jmp     DisplayVeryShort
  292.  
  293.  
  294. Coproc:         Int     11h                     ; is coprocessor installed?
  295.                 ShR     al, 1                   ; output as 0 or 1
  296.                 And     al, 1
  297.                 Jmp     DisplayVeryShort
  298.  
  299.  
  300. LptStat:        Mov     ah, 02h                 ; get printer status
  301.                 Xor     dx, dx                  ; printer port #0
  302.                 Int     17h
  303.                 Mov     al, ah
  304.                 Xor     dl, dl
  305.                 Jmp     DisplayShort
  306.  
  307.  
  308. VideoMode:      Mov     ah, 0Fh                 ; get video mode
  309.                 Int     10h
  310.                 Xor     dh, dh
  311.                 Jmp     DisplayShort            ; display number
  312.  
  313.  
  314. VideoWidth:     Mov     ah, 0Fh                 ; get screen width
  315.                 Int     10h
  316.                 Mov     al, ah                  ; width was in ah
  317.                 Xor     dh, dh
  318.                 Jmp     DisplayShort
  319.  
  320.  
  321. SysModel:       Push    es                      ; get model indicator
  322.                 Mov     bx, 0F000h              ; save ES; set up ES to
  323.                 Mov     es, bx                  ; point to ROM location
  324.                 Mov     bl, byte ptr es:0FFFEh  ; this is model indicator
  325.                 Pop     es                      ; restore ES
  326.                 Sub     bl, 0F7h                ; subtract offset
  327.                 Mov     [RetVal], bl            ; save for return
  328.                 Shl     bl, 1
  329.                 Xor     bh, bh
  330.                 Cmp     bl, ModelStrLen - ModelString
  331.                 Jbe     SysModel2
  332.                 Xor     bl, bl
  333. SysModel2:      DisplayChar [ModelString+bx]    ; display ID
  334.                 DisplayChar [(ModelString+1)+bx]
  335.                 Ret
  336.  
  337.  
  338. DosVersion:     Mov     ah, 30h                 ; get DOS version
  339.                 Int     21h
  340.                 Push    ax
  341.                 Call    DisplayVeryShort        ; show major version number
  342.                 DisplayChar '.'
  343.                 Pop     ax
  344.                 Xchg    ah, al                  ; and minor version number, too
  345.                 Jmp     DisplayTwoDigs
  346.  
  347.  
  348. BiosVersion:    Push    ds                      ; get BIOS version; save DS
  349.                 Push    si                      ; ... and SI
  350.                 Mov     ax, 0FFFFh              ; set up DS
  351.                 Mov     ds, ax                  ; to point to ROM location
  352.                 Mov     si, 5h
  353.                 Mov     cx, 8                   ; 8 bytes length
  354.                 Mov     ah, 02h
  355. BiosVer2:       Lodsb
  356.                 Mov     dl, al                  ; display char
  357.                 Int     21h
  358.                 Loop    BiosVer2                ; loop for 8 chars
  359.                 Pop     si                      ; restore SI...
  360.                 Pop     ds                      ; and DS
  361.                 Ret
  362.  
  363.  
  364. SwitchChar:     Mov     ax, 3700h               ; get switch character
  365.                 Int     21h
  366.                 Mov     [RetVal], dl            ; save for return
  367.                 Mov     ah, 02h
  368.                 Int     21h
  369.                 Ret
  370.  
  371.  
  372. Author:         Mov     dx, offset Copyright    ; show author's note
  373.                 Mov     ah, 09h
  374.                 Int     21h
  375.                 Ret
  376.  
  377.  
  378. KeyBoard:       Xor     ah, ah                  ; get key from user
  379.                 Int     16h
  380.                 Or      al, al                  ; was it extended key?
  381.                 Je      KeyBoard                ; if so, try again
  382.                 Mov     [RetVal], al            ; save for return
  383.                 DisplayAL                       ; otherwise echo
  384.                 Ret
  385.  
  386.  
  387. StdInSymbol:    DisplayChar '<'                 ; display stdin redir.symbol
  388.                 Mov     [RetVal], '<'           ; save for return
  389.                 Ret
  390.  
  391.  
  392. StdOutSymbol:   DisplayChar '>'                 ; display stdout redir.symbol
  393.                 Mov     [RetVal], '>'           ; save for return
  394.                 Ret
  395.  
  396.  
  397. PipeSymbol:     DisplayChar '|'                 ; display pipe symbol
  398.                 Mov     [RetVal], '|'           ; save for return
  399.                 Ret
  400.  
  401.  
  402. HexNumber:      Lodsb                           ; display byte given by
  403.                 Cmp     al, Return              ; two hex digits
  404.                 Je      HexEnd
  405.                 Sub     al, '0'                 ; subtract ASCII offset
  406.                 Cmp     al, 9                   ; was that enough?
  407.                 Jbe     Digit1OK                ; if so, skip
  408.                 Sub     al, 7                   ; subtract rest
  409.                 Cmp     al, 0Fh                 ; was that enough?
  410.                 Jbe     Digit1OK                ; if so, skip
  411.                 Sub     al, 'a'-'A'             ; otherwise assume lower-case
  412.  
  413. Digit1OK:       Mov     cl, 4                   ; shift as appropriate
  414.                 ShL     al, cl
  415.                 Mov     dl, al
  416.                 Lodsb                           ; get second digit
  417.                 Cmp     al, Return
  418.                 Je      HexEnd
  419.                 Sub     al, '0'                 ; subtract ASCII offset
  420.                 Cmp     al, 9                   ; was that enough?
  421.                 Jbe     Digit2OK                ; if so, skip
  422.                 Sub     al, 7                   ; subtract rest
  423.                 Cmp     al, 0Fh                 ; was that enough?
  424.                 Jbe     Digit2OK                ; if so, skip
  425.                 Sub     al, 'a'-'A'             ; otherwise assume lower-case
  426.  
  427. Digit2OK:       Or      dl, al                  ; combine digits
  428.                 Mov     [RetVal], dl            ; save for return
  429.                 Mov     ah, 02h                 ; and put 'em out
  430.                 Int     21h
  431.                 Ret
  432.  
  433. HexEnd:         Pop     ax                      ; premature end; pop address
  434.                 Jmp     Done
  435.  
  436.  
  437. CountryInfo:    Mov     ax, 3800h               ; get country info
  438.                 Mov     dx, offset DirString
  439.                 Int     21h
  440.                 Mov     al, bl
  441.                 Jmps    DisplayVeryShort        ; show it
  442.  
  443.  
  444. Currency:       Mov     ax, 3800h               ; get country info
  445.                 Mov     dx, offset DirString
  446.                 Int     21h
  447.                 Mov     ah, [DirString+2]
  448.                 Mov     [RetVal], ah            ; save for return
  449.                 Mov     ah, 02h                 ; prepare to output ASCIZ
  450.                 Xor     bx, bx
  451. Curr2:          Mov     dl, [(DirString+2)+bx]
  452.                 Or      dl, dl
  453.                 Je      Curr3
  454.                 Int     21h
  455.                 Inc     bx
  456.                 Jmps    Curr2
  457. Curr3:          Ret
  458.  
  459.  
  460. Thousands:      Mov     cx, 7                   ; prepare to get 1000 sep.
  461.                 Jmps    GetCountry
  462.  
  463.  
  464. Decimal:        Mov     cx, 9                   ; prepare to decimal sep.
  465.                 Jmps    GetCountry
  466.  
  467.  
  468. DateSep:        Mov     cx, 11                  ; prepare to date separator
  469.                 Jmps    GetCountry
  470.  
  471.  
  472. TimeSep:        Mov     cx, 13                  ; prepare to time separator
  473. GetCountry:     Mov     ax, 3800h               ; get country info
  474.                 Mov     dx, offset DirString    ; pointer to buffer
  475.                 Int     21h
  476.                 Mov     bx, cx
  477.                 Mov     al, [DirString+bx]      ; save for return
  478.                 Mov     [RetVal], al            ; save for return
  479.                 DisplayAL
  480.                 Ret
  481.  
  482.  
  483. Day:            Mov     al, [DateBuf+3]         ; get day
  484.                 Jmps    DisplayTwoDigs
  485.  
  486.  
  487. Month:          Mov     al, [DateBuf+2]         ; get month
  488.                 Jmps    DisplayTwoDigs
  489.  
  490.  
  491. Year:           Mov     ax, word ptr [DateBuf]  ; get year
  492.                 Jmps    DisplayTwoDigs
  493.  
  494.  
  495. WeekDay:        Mov     al, [DateBuf+4]         ; get weekday
  496.                 Jmps    DisplayVeryShort
  497.  
  498.  
  499. Hour:           Mov     al, [TimeBuf]           ; get hours
  500.                 Jmps    DisplayTwoDigs
  501.  
  502.  
  503. Minute:         Mov     al, [TimeBuf+1]         ; get minutes
  504.                 Jmps    DisplayTwoDigs
  505.  
  506.  
  507. Second:         Mov     al, [TimeBuf+2]         ; get seconds
  508.                 Jmps    DisplayTwoDigs
  509.  
  510.  
  511. CentiSecond:    Mov     al, [TimeBuf+3]         ; get centiseconds
  512.  
  513. DisplayVeryShort: Xor   dh, dh                  ; short number, no min digits
  514.                 Jmps    DisplayShort
  515. DisplayTwoDigs: Mov     dh, 02                  ; display >= 2 digits
  516. DisplayShort:   Xor     ah, ah                  ; output number up to 255
  517.                 Mov     [RetVal], al            ; save for return
  518. DisplayNumber:  Xor     cx, cx                  ; output number up to 2559
  519.                                                 ; dh  is min # of digits
  520.                 Mov     dl, 10                  ; divisor
  521. DispNum2:       Div     dl
  522.                 Push    ax                      ; one digit
  523.                 Inc     cl
  524.                 Xor     ah, ah
  525.                 Or      al, al
  526.                 Jnz     DispNum2                ; loop until we are done
  527.  
  528.                 Cmp     cl, dh                  ; do we have enough digits?
  529.                 Jae     DispNum3                ; if so, skip
  530.                 Push    cx
  531.                 Sub     dh, cl
  532.                 Mov     cl, dh
  533. DispNum2a:      DisplayChar '0'                 ; otherwise output leading 0s
  534.                 Loop    DispNum2a
  535.                 Pop     cx
  536.  
  537. DispNum3:       Pop     dx                      ; get back one digit
  538.                 Xchg    dh, dl
  539.                 Or      dl, '0'                 ; convert to ASCII
  540.                 Mov     ah, 02h                 ; and display
  541.                 Int     21h
  542.                 Loop    DispNum3
  543.  
  544.                 Ret
  545.  
  546.  
  547. DirString       db      64 dup (?)              ; buffer for directory name etc.
  548. TimeBuf         db      4  dup (?)              ; buffer for current time
  549. DateBuf         db      5  dup (?)              ; buffer for current date
  550.                 db      64 dup (?)              ; stack area
  551. OurStack        Label   byte
  552.  
  553. ProgEnd         Label   byte
  554.  
  555. cseg            ends
  556. end start
  557.