home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / sampler0 / me.asm < prev    next >
Assembly Source File  |  1989-01-03  |  14KB  |  488 lines

  1.         TITLE   me
  2.  
  3. _TEXT   SEGMENT
  4.         ASSUME  cs:_TEXT, ds:_TEXT, ss:_TEXT, es:_TEXT
  5.         ORG     100h
  6.  
  7.  
  8. ESC_CHR         EQU     '$'             ; Escape character
  9.  
  10. ;
  11. ; Command line escape sequence characters
  12. ;
  13.  
  14. DOLLAR          EQU     '$'             ; $ character
  15. TIME            EQU     't'             ; Time
  16. DATE            EQU     'd'             ; Date
  17. CUR_DIR         EQU     'p'             ; Current directory
  18. DOS_VER         EQU     'v'             ; DOS Version number
  19. DRIVE           EQU     'n'             ; Default drive letter
  20. GREATER         EQU     'g'             ; > character
  21. LESS            EQU     'l'             ; < character
  22. PIPE            EQU     'b'             ; | character
  23. EQUAL           EQU     'q'             ; = character
  24. BS              EQU     'h'             ; Backspace
  25. ESCAPE          EQU     'e'             ; ESCape character
  26. CR_LF           EQU     '_'             ; CR LF sequence
  27.  
  28. ;
  29. ; Miscellanious equates
  30. ;
  31.  
  32. CR              EQU     0Ah
  33. LF              EQU     0Dh
  34.  
  35. char_ptr        EQU     [bx+82h]
  36.  
  37. ;
  38. ; Macro declarations
  39. ;
  40.  
  41. out_chr         MACRO   p1              ;; Display a character
  42.                 mov     ah, 02h
  43.                 mov     dl, p1          ;; Character to be displayed
  44.                 int     21h             ;; DOS interrupt
  45.                 ENDM
  46.  
  47. out_str         MACRO   p1              ;; Display a $ terminated string
  48.                 mov     ah, 09h
  49.                 mov     dx, offset p1
  50.                 int     21h
  51.                 ENDM
  52.  
  53. is_it           MACRO   p1, p2          ;; Compare characters
  54.                 cmp     byte ptr p2, p1 ;; Compare supplied values
  55.                 ENDM
  56.  
  57. tolower         MACRO   p1
  58.                 LOCAL   no_conversion           ;; Local label name
  59.                 cmp     byte ptr p1, 'A'
  60.                 jl      no_conversion
  61.                 cmp     byte ptr p1, 'Z'
  62.                 jg      no_conversion
  63.                 or      byte ptr p1, 20h        ;; Convert to lowercase
  64. no_conversion:
  65.                 ENDM
  66.  
  67. ascii_z         MACRO   p1                      ;; Output a zero terminated string
  68.                 LOCAL   loop, done
  69.                 mov     si, 0
  70. loop:
  71.                 cmp     p1[si], 0
  72.                 je      done
  73.                 out_chr p1[si]
  74.                 inc     si
  75.                 jmp     loop
  76. done:
  77.                 ENDM
  78.  
  79. pr_byte         MACRO   p1
  80.  
  81.                 mov     ah, p1
  82.                 mov     save, ah                ;; Save value of AH
  83.                 mov     al, save                ;; Restore to AL
  84.                 mov     ah, 0                   ;; Zero AH
  85.                 cwd
  86.                 mov     bl, 10                  ;; Divide by 10
  87.                 div     bl                      ;; Integer divide
  88.                 add     al, '0'                 ;; Make ASCII
  89.                 mov     temp, al                ;; Move to print area
  90.                 add     ah, '0'                 ;; NEW
  91.                 mov     save, ah                ;; NEW
  92.                 out_chr temp                    ;; Print character
  93.                 out_chr save                    ;; NEW
  94.  
  95. ;               mov     ah, 0                   ;; Zero AH
  96. ;               mov     al, save                ;; Restore saved value
  97. ;               cwd
  98. ;               mov     bl, 10
  99. ;               div     bl
  100. ;               add     ah, '0'                 ;; Make remainder ASCII
  101. ;               mov     temp, ah                ;; More to print area
  102. ;               out_chr temp                    ;; Print character
  103.  
  104.                 ENDM
  105.  
  106. start:  jmp     begin                   ; Jump over data
  107.  
  108. ;
  109. ; Data declarations
  110. ;
  111.  
  112. tm_fmt  db      3                       ; Time format
  113.                                         ; 1 - MM/DD/YYYY
  114.                                         ; 2 - MM/DD/YY
  115.                                         ; 3 - DDD MM/DD/YYYY
  116.  
  117. sun     db      'Sun$'
  118. mon     db      'Mon$'
  119. tue     db      'Tue$'
  120. wed     db      'Wed$'
  121. thu     db      'Thu$'
  122. fri     db      'Fri$'
  123. sat     db      'Sat$'
  124.  
  125. day_num db      0
  126.  
  127. temp    db      0
  128. save    db      0
  129.  
  130. month   db      0
  131. day     db      0
  132. century db      0
  133. year    db      0
  134.  
  135. hours   db      0
  136. minutes db      0
  137. seconds db      0
  138.  
  139. save_bx dw      ?
  140. save_cx dw      ?
  141.  
  142. major   db      0
  143. minor   db      0
  144.  
  145. huh     db      CR, LF, 7, 'Unknown escape sequence - $'
  146. dir     db      67 dup (?)
  147. not_yet db      CR, LF, 7, 'Escape sequence not implemented - $', CR, LF
  148.  
  149. usage   db              'MyEcho - Version 1.00 (Production)'
  150.         db      CR, LF, 'Copyright (C) 1988, 1989 by Mark G. Plancke'
  151.         db      CR, LF, 'To form an escape sequence you must first specify the escape character - "$",'
  152.         db      CR, LF, 'followed by one of the characters listed below.'
  153.         db      CR, LF
  154.         db      CR, LF, 'ESC Sequence   Description'
  155.         db      CR, LF, '    $          The escape character'
  156.         db      CR, LF, '    $$         Print the dollar sign'
  157.         db      CR, LF, '    $T         Print the time'
  158.         db      CR, LF, '    $D         Print the date'
  159.         db      CR, LF, '    $P         Print the current directory'
  160.         db      CR, LF, '    $V         Print the DOS version'
  161.         db      CR, LF, '    $N         Print the default drive'
  162.         db      CR, LF, '    $G         Print the > character'
  163.         db      CR, LF, '    $L         Print the < character'
  164.         db      CR, LF, '    $B         Print the | character'
  165.         db      CR, LF, '    $Q         Print the = character'
  166.         db      CR, LF, '    $H         Print the back space character'
  167.         db      CR, LF, '    $E         Print the escape character'
  168.         db      CR, LF, '    $_         Print a CR/LF sequence'
  169.         db      CR, LF
  170.         db      CR, LF, 'For example, the command line - "$P$GHello" would result in "C:\DIR>Hello"'
  171.         db      CR, LF, 'being printed. This program can be used to enter ANSI escape sequences as well.'
  172.         db      0
  173.  
  174.  
  175. begin:
  176.     mov    si, 80h                 ; Offset command line length
  177.     mov    cl, es:[si]             ; Get command line length
  178.            xor    ch, ch                  ; Test for null
  179.         cmp     cx, 0
  180.         jne     commands_there
  181.     call    pr_usage                ; Print help screen
  182.         jmp     exit_prog
  183.  
  184. commands_there:
  185.         dec     cl                      ; Subtract one byte - for leading blank
  186.  
  187.         mov     bx, 0                   ; Initialize counter
  188.  
  189. main_loop:
  190.         mov     al, ESC_CHR
  191.         cmp     byte ptr char_ptr, al   ; Is this an escape sequence?
  192.  
  193.         je      escape_seq              ; Yes, process it
  194.  
  195. display:
  196.         out_chr char_ptr                ; Display character
  197.  
  198. resume:
  199.         inc     bx                      ; Increment character pointer
  200.         cmp     bx, cx                  ; End of string?
  201.         jnz     main_loop               ; No, get next character
  202.  
  203.         mov     al, 0                   ; Set exit code
  204. exit_prog:
  205.         mov     ah, 4ch                 ; DOS exit
  206.         int     21h                     ; Terminate
  207.  
  208. ;
  209. ; Evaluate escape sequences
  210. ;
  211.  
  212. escape_seq:
  213.         inc     bx                      ; Advance to next character
  214.         cmp     bx, cx                  ; Are we past the end of line?
  215.         jnz     esc_DOLLAR              ; No, evaluate next character
  216.         jmp     esc_UNKNOWN             ; Yes, display error message
  217.  
  218. esc_DOLLAR:
  219.         tolower char_ptr                ; Convert to lowercase
  220.         is_it   DOLLAR, char_ptr        ; Is it a dollar escape?
  221.         jne     esc_TIME                ; No, check next in line
  222.         out_chr '$'                     ; Display a dollar sign
  223.         jmp     resume                  ; Get next character
  224.  
  225. esc_TIME:
  226.         is_it   TIME, char_ptr
  227.         jne     esc_DATE
  228.         call    disp_time
  229.         jmp     resume
  230.  
  231. esc_DATE:
  232.         is_it   DATE, char_ptr
  233.         jne     esc_CUR_DIR
  234.         call    disp_date
  235.         jmp     resume
  236.  
  237. esc_CUR_DIR:
  238.         is_it   CUR_DIR, char_ptr
  239.         jne     esc_DOS_VER
  240.         call    disp_cur_dir
  241.         jmp     resume
  242.  
  243. esc_DOS_VER:
  244.         is_it   DOS_VER, char_ptr
  245.         jne     esc_DRIVE
  246.         call    disp_dos_ver
  247.         jmp     resume
  248.  
  249. esc_DRIVE:
  250.         is_it   DRIVE, char_ptr
  251.         jne     esc_GREATER
  252.         call    disp_drive
  253.         jmp     resume
  254.  
  255. esc_GREATER:
  256.         is_it   GREATER, char_ptr
  257.         jne     esc_LESS
  258.         out_chr '>'
  259.         jmp     resume
  260.  
  261. esc_LESS:
  262.         is_it   LESS, char_ptr
  263.         jne     esc_PIPE
  264.         out_chr '<'
  265.         jmp     resume
  266.  
  267.  
  268. esc_PIPE:
  269.         is_it   PIPE, char_ptr
  270.         jne     esc_EQUAL
  271.         out_chr '|'
  272.         jmp     resume
  273.  
  274. esc_EQUAL:
  275.         is_it   EQUAL, char_ptr
  276.         jne     esc_BS
  277.         out_chr '='
  278.         jmp     resume
  279.  
  280. esc_BS:
  281.         is_it   BS, char_ptr
  282.         jne     esc_ESCAPE
  283.         out_chr 09h
  284.         jmp     resume
  285.  
  286. esc_ESCAPE:
  287.         is_it   ESCAPE, char_ptr
  288.         jne     esc_CRLF
  289.         out_chr 1Bh
  290.         jmp     resume
  291.  
  292. esc_CRLF:
  293.         is_it   CR_LF, char_ptr
  294.         jne     esc_UNKNOWN
  295.         out_chr CR
  296.         out_chr LF
  297.         jmp     resume
  298.  
  299. esc_UNKNOWN:
  300.         out_str huh                     ; Display error message
  301.         out_chr '$'                     ; Display escape sequence...
  302.         out_chr char_ptr
  303.         out_chr CR
  304.         out_chr LF
  305.         call    pr_usage
  306.         mov     al, 1                   ; Set exit code
  307.         jmp     exit_prog               ; Terminate program
  308.  
  309. ;
  310. ; Subroutines
  311. ;
  312.  
  313. ;
  314. ; Pr_Usage
  315. ;
  316. pr_usage        proc
  317.         ascii_z usage
  318.         ret
  319. pr_usage        endp
  320.  
  321. ;
  322. ; Display time
  323. ;
  324. disp_time       proc
  325.         mov     save_bx, bx
  326.         mov     save_cx, cx
  327.  
  328.         mov     ah, 2Ch
  329.         int     21h
  330.  
  331.         mov     hours, ch
  332.         mov     minutes, cl
  333.         mov     seconds, dh
  334.  
  335.         pr_byte hours
  336.         out_chr ':'
  337.         pr_byte minutes
  338.         out_chr ':'
  339.         pr_byte seconds
  340.  
  341.         mov     bx, save_bx
  342.         mov     cx, save_cx
  343.  
  344.         ret
  345. disp_time       endp
  346. ;
  347. ; Display date
  348. ;
  349. disp_date       proc
  350.  
  351.         mov     save_bx, bx
  352.         mov     save_cx, cx
  353.  
  354.         mov     ah, 2Ah                 ; Get current date
  355.         int     21h                     ; Time of day service
  356.  
  357.         mov     day_num, al
  358.         mov     month, dh
  359.         mov     day, dl
  360.         mov     ax, cx
  361.         cwd
  362.         mov     bl, 100
  363.         div     bl
  364.  
  365.         mov     century, al
  366.         mov     year, ah
  367.  
  368.         cmp     tm_fmt, 3
  369.         jnz     skip_day
  370.  
  371.  
  372.         cmp     day_num, 0
  373.         jnz     mon_chk
  374.         out_str sun
  375.         jmp     done_day
  376.  
  377. mon_chk:
  378.         cmp     day_num, 1
  379.         jnz     tue_chk
  380.         out_str mon
  381.         jmp     done_day
  382.  
  383. tue_chk:
  384.  
  385.         cmp     day_num, 2
  386.         jnz     wed_chk
  387.         out_str tue
  388.         jmp     done_day
  389.  
  390. wed_chk:
  391.         cmp     day_num, 3
  392.         jnz     thu_chk
  393.         out_str wed
  394.         jmp     done_day
  395.  
  396. thu_chk:
  397.         cmp     day_num, 4
  398.         jnz     fri_chk
  399.         out_str thu
  400.         jmp     done_day
  401.  
  402. fri_chk:
  403.         cmp     day_num, 5
  404.         jnz     sat_chk
  405.         out_str fri
  406.         jmp     done_day
  407.  
  408. sat_chk:
  409.         out_str sat
  410.  
  411. done_day:
  412.         out_chr ' '
  413.  
  414. skip_day:
  415.  
  416.         pr_byte month
  417.         out_chr '/'
  418.         pr_byte day
  419.         out_chr '/'
  420.  
  421.         cmp     tm_fmt, 2
  422.         jz      disp_year
  423.  
  424.         pr_byte century
  425.  
  426. disp_year:
  427.  
  428.         pr_byte year
  429.  
  430.         mov     bx, save_bx
  431.         mov     cx, save_cx
  432.         ret
  433.  
  434. disp_date       endp
  435. ;
  436. ; Display current directory
  437. ;
  438. disp_cur_dir    proc
  439.         mov     ah,19h                  ; Get default drive code
  440.         int     21h                     ; DOS interrupt
  441.         mov     dir[0], al              ; Move to display area
  442.         add     dir[0], 'A'             ; Make into drive letter
  443.         mov     dir[1], ':'             ; Assign colon and
  444.         mov     dir[2], '\'             ; Slash
  445.         mov     ah, 47h                 ; DOS function - current directory
  446.         mov     dl, 0                   ; Current drive
  447.         mov     si, offset dir + 3      ; Address of receiveing string
  448.         int     21h                     ; DOS interrupt
  449.         ascii_z dir                     ; Display string
  450.         ret
  451. disp_cur_dir    endp
  452. ;
  453. ; Display DOS version
  454. ;
  455. disp_dos_ver    proc
  456.         mov     save_bx, bx
  457.         mov     save_cx, cx
  458.  
  459.         mov     ah, 030h
  460.         int     21h
  461.  
  462.         mov     major, al
  463.         mov     minor, ah
  464.  
  465.         pr_byte major
  466.         out_chr '.'
  467.         pr_byte minor
  468.  
  469.         mov     bx, save_bx
  470.         mov     cx, save_cx
  471.  
  472.         ret
  473. disp_dos_ver    endp
  474. ;
  475. ; Display drive
  476. ;
  477. disp_drive      proc
  478.         mov     ah,19h                  ; Get default drive code
  479.         int     21h                     ; DOS interrupt
  480.         mov     dir[0], al              ; Move to display area
  481.         add     dir[0], 'A'             ; Make into drive letter
  482.         out_chr dir[0]                  ; Display string
  483.         ret
  484. disp_drive      endp
  485.  
  486. _TEXT   ends
  487.         end     start
  488.