home *** CD-ROM | disk | FTP | other *** search
/ Software Du Jour / SoftwareDuJour.iso / BUSINESS / DBASE / DBAPG.ARC / TIMEWAIT.ASM < prev    next >
Assembly Source File  |  1984-08-08  |  6KB  |  184 lines

  1. ;------------------------------------------------------------------------;
  2. ; TIMEWAIT.ASM  by Steve Manes                                           ;
  3. ;                                     ;
  4. ;    Prints current system time at locations specified in entry      ;
  5. ;    character variable (ROW,COLUMN). Format for X,Y is identical        ;
  6. ;    to dBASE convention in the "@ x,y" command.             ;
  7. ;                                         ;
  8. ;    Two (2) character variables MUST be pre-initialized before calling  ;
  9. ╗    thi≤ routinσ anΣ I╬ THI╙ ORDER║    STOR┼ "00:00:00" T╧ memvar1      ;
  10. ╗                                       STOR┼ "x,y" T╧ memvar2           ;
  11. ;    Caution: NO error checking is done for the correct initialization   ;
  12. ;             of these variables!                     ;
  13. ;                                     ;
  14. ;    When keyboard entry is detected, the time display is erased and     ;
  15. ;    keyboard entry will commence at the same X,Y coordinates and the    ;
  16. ;    contents will be written to memvar2.  Keyboard entry will cease     ;
  17. ;    when a carriage return is detected or string length exceeds the     ;
  18. ;    pre-initialized length of memvar2.  The time when keyboard entry    ;
  19. ;    commenced will reside in memvar1.                                   ;
  20. ;                                     ;
  21. ;    CALLing convention:  CALL memvar2                         ;
  22. ;------------------------------------------------------------------------;
  23.  
  24.  
  25. CSEG     SEGMENT 'CODE'
  26.     ASSUME CS:CSEG
  27.         mov si,bx    ; we need BX so save variable address in SI
  28.  
  29.         mov ch,45    ; turn off cursor
  30.         mov cl,13
  31.         mov ah,1
  32.         int 10h
  33.  
  34. ;---------------------------------------------------------------------;
  35. ; Convert screen coordinates to binary. Hold X,Y address word in DI   ;
  36. ;---------------------------------------------------------------------;
  37.         sub cx,cx        ; clear the register
  38.         mov ch,2        ; through the loop twice
  39.         mov dl,10        ; multiplier
  40.  
  41. convert_XY:    
  42.         sub ax,ax        ; clear the register
  43.         inc bx            ; next digit
  44.         mov al,byte ptr [bx]    ; read 1st digit
  45.         and al,0Fh        ;  and convert to binary
  46.         inc bx            ; next digit
  47.         mov dh,byte ptr [bx]
  48.         cmp dh,'0'        ; is it a digit?
  49.         jb next_nmbr
  50.  
  51.         mul dl            ; two digit #. Mult hi-digit by 10
  52.         and dh,0Fh        ; convert low digit to binary
  53.         add al,dh        ; add high and low digits to AL
  54.         inc bx
  55.  
  56. next_nmbr:    dec ch            ; decrement loop counter
  57.         cmp ch,0        ; have X and Y been converted?
  58.         je load_Y        ; no, X loaded; Y not converted yet.
  59.  
  60. load_X:        mov cl,al        ; store X temporarily in CL
  61.         jmp convert_XY
  62.  
  63. load_Y:        sub bx,bx        ; clear the register
  64.         mov bl,al        ; load Y value
  65.         mov bh,cl        ; load X value
  66.         mov di,bx        ; store coordinates in DI
  67.  
  68.         jmp main_prog        ;  and move on
  69.  
  70. print_time    PROC     NEAR
  71.         push si            ; save string pointer
  72.         mov bx,0        ; "zero" display page
  73.         mov cx,1        ; display one character
  74.         mov dx,di        ; get X,Y coordinates
  75.         sub si,9        ; back up to preceding TIME variable
  76.         mov bp,8        ; loop counter
  77. write:        mov ah,2        ; locate cursor
  78.         int 10h
  79.         mov al,byte ptr [si]      ; write character
  80.         mov ah,10
  81.         int 10h
  82.         inc dl            ; increment cursor column
  83.         inc si            ; next character in string
  84.         dec bp            ; decrement counter
  85.         cmp bp,0        ; all eight characters displayed?
  86.         ja write        ; no, finish writing time
  87.         pop si            ; restore original string pointer
  88.         ret
  89. print_time    ENDP
  90.  
  91. make_ascii    PROC    NEAR
  92.         div dl            ; divide AX value by 10
  93.         add al,'0'        ; convert remainder to ASCII
  94.         add ah,'0'        ; convert quotient to ASCII
  95.         dec bx            ; back up string pointer
  96.         mov byte ptr [bx],ah    ; write low digit to string
  97.         dec bx
  98.         mov byte ptr [bx],al    ; write high digit to string
  99.         dec bx
  100.         ret
  101. make_ascii    ENDP
  102.  
  103. main_prog:
  104.         mov bx,si        ; X,Y variable contents address -1
  105.         sub bx,1        ; move to end of previous TIME
  106.                     ;   variable.
  107.         mov ah,2Ch        ; get current time from BIOS
  108.         int 21h
  109.  
  110.         mov dl,10        ; divisor
  111.         sub ax,ax        ; clear the register
  112.         mov al,dh        ; load seconds and convert to ASCII
  113.         call make_ascii
  114.         sub ax,ax    
  115.         mov al,cl        ;load minutes
  116.         call make_ascii
  117.         sub ax,ax
  118.         mov al,ch        ; load hours
  119.         call make_ascii
  120.  
  121.         call print_time        ; write current time to screen
  122.         mov ah,0Bh        ; see if key has been pressed
  123.         int 21h
  124.         cmp al,0FFh        ; is character available?
  125.         je keybd_entry        ; yes, get input
  126.         jmp main_prog        ; no, keep writing time
  127.  
  128. ;------------------------------------------------------------------------;
  129. ; This routine will write the keyboard entry to the original screen      ;
  130. ; coordinate variable. Entry will stop when carriage return is detected  ;
  131. ; or the length of the entry string equals the original length of the    ;
  132. ╗ screeε coordinatσ variable«                         ;
  133. ;------------------------------------------------------------------------;
  134. keybd_entry:                ; erase screen at time variable
  135.         mov bp,8        ; loop counter
  136.         mov cx,1        ; character count
  137.         mov bx,0        ; "zero" display page    
  138.         mov dx,di        ; get original X,Y coordinates
  139. erase:        mov ah,2        ; locate cursor
  140.         int 10h
  141.         mov al,' '        ; print ASCII space
  142.         mov ah,10
  143.         int 10h
  144.         inc dl            ; next column
  145.         dec bp            ; decrement loop counter
  146.         cmp bp,0        ; all 8 characters blanked?
  147.         ja erase        ; no, blank the next character
  148.  
  149.         mov dx,di        ; cursor back to original X,Y
  150.         mov ah,2
  151.         int 10h
  152.         mov ch,12        ; turn cursor back on 
  153.         mov cl,13
  154.         mov ah,1
  155.         int 10h
  156.  
  157.         mov bx,si        ; null the CALLing variable
  158.         mov cl,byte ptr [bx]    ; get length byte
  159. init:        inc bx            ; next character
  160.         mov byte ptr [bx],' '    ; ASCII space character
  161.         dec cl    
  162.         cmp cl,0        ; are all characters blanked?
  163.         ja init            ; no, blank the next character
  164.  
  165.         mov bx,si        ; variable contents address -1
  166.         mov cl,byte ptr [bx]    ; load the length byte to loop limiter
  167. key1:        inc bx            
  168.         mov ah,1        ; keyboard input function
  169.         int 21h
  170.         cmp al,0Dh        ; carriage return?
  171.         je dB_return        ; yes, exit program
  172.         mov byte ptr [bx],al    ; no, write it to string
  173.         dec cl             ; decrement loop counter
  174.         cmp cl,0        ; limit reached?
  175.         je dB_return        ; yes, exit program
  176.         jmp key1        ;   and continue reading input.
  177.  
  178. dB_return:    
  179.         ret            ; should be an intra-segment RET
  180.  
  181. CSEG    ENDS
  182.     END
  183. ;------------------------------------------------------------------------;
  184.