⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rxdosprm.asm

📁 dos source
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        defbytes _printbuffer, 128

        call CheckOptOneArg                             ; see if 1 arg 
        ifc _timeInvalid                                ; if error in args 

        mov si, word ptr [ di ]                         ; get first arg
        or si, si                                       ; if arg, go parse -->
        jnz _time_26

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  display current time
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        lea di, offset [ _buffer ][ bp ]
        push di
        call formatCurrentTime                          ; get current time

        mov di, offset _ShowCurrentTime
        push di
        lea di, offset [ _printbuffer ][ bp ]
        push di
        call _sprintf
        add sp, ax                                      ; # args passed
        call DisplayLine

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  please enter time
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_time_12:
        mov dx, offset _PleaseEnterTime
        call DisplayLine

        lea di, offset [ _buffer ][ bp ]
        mov byte ptr [ bufMaxLength ][ di ], 128
        mov word ptr [ bufActualLength ][ di ], 0

        mov dx, di                                      ; where buffer
        call _getStdinLine                              ; read buffer
        
        call CRLF

        mov bl, byte ptr [ _buffer. bufActualLength ][ bp ]
        and bx, 255
        ifz _timeReturn

        add bx, bp
        mov byte ptr [ _buffer. bufData ][ bx ], 00     ; place a null terminator
        lea si, offset [ _buffer. bufData ][ bp ]       ; parse text
        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  parse arg at [ si ]       ** must internationalize by matching template **
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_time_26:
        xor ax, ax
        mov word ptr [ _parsedTime. _HOURS      ][ bp ], ax
        mov word ptr [ _parsedTime. _MINUTES    ][ bp ], ax
        mov word ptr [ _parsedTime. _SECONDS    ][ bp ], ax
        mov word ptr [ _parsedTime. _HUNDREDTHS ][ bp ], ax

        call _GetNumber                                 ; get hours
        mov word ptr [ _parsedTime. _HOURS ][ bp ], dx

        call _checkSeparator
        jc _timeInvalid
        jz _time_36
        call _GetNumber                                 ; get mins
        mov word ptr [ _parsedTime. _MINUTES ][ bp ], dx

        call _checkSeparator
        jc _timeInvalid
        jz _time_36
        call _GetNumber                                 ; get seconds
        mov word ptr [ _parsedTime. _SECONDS ][ bp ], dx

        call _checkSeparator
        jc _timeInvalid
        jz _time_36
        call _GetNumber                                 ; get hundreths of seconds
        mov word ptr [ _parsedTime. _HUNDREDTHS ][ bp ], dx

_time_36:
        mov dl, byte ptr [ _parsedTime. _HUNDREDTHS ][ bp ]
        mov dh, byte ptr [ _parsedTime. _SECONDS    ][ bp ]
        mov cl, byte ptr [ _parsedTime. _MINUTES    ][ bp ]
        mov ch, byte ptr [ _parsedTime. _HOURS      ][ bp ]
        Int21 SetTime
        or al, al                                       ; date valid ?
        jnz _timeInvalid                                ; no -->

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  return
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_timeReturn:
        Return

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  invalid time
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_timeInvalid:
        mov dx, offset CmndError_InvalidTime
        call DisplayLine
        jmp _time_12

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Test Time Separator                                          ;
        ;...............................................................;

_checkSeparator:

        mov al, byte ptr [ si-1 ]                       ; get last character processed
        or al, al                                       ; if end of line -->
        jz _checkSeparator_24                           ; return end of line -->

        cmp al, ' '
        jnz _checkSeparator_06                          ; skip any spaces -->

        inc si
        jmp _checkSeparator

_checkSeparator_06:
        call _lowerCase

        cmp al, ':'
        jz _checkSeparator_24                           ; return end of line -->
        cmp al, '.'        
        jz _checkSeparator_24                           ; return end of line -->

        cmp al, 'a'                                     ; am / pm ?
        jz _checkSeparator_12                           ; yes -->
        cmp al, 'p'                                     ; am / pm ?
        jz _checkSeparator_10                           ; yes -->

        stc                                             ; anything else is an error
        ret

_checkSeparator_10:
        cmp byte ptr [ _hours ][ bp ], 12
        jge _checkSeparator_12
        add byte ptr [ _hours ][ bp ], 12

_checkSeparator_12:
        xor ax, ax

_checkSeparator_24:
        or al, al
        ret

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Get International Date Template                              ;
        ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
        ;                                                               ;
        ;  Usage:                                                       ;
        ;   si     pointer to DayMonthYear buffer                       ;
        ;   di     pointer to DayMonthYear array of pointers to be      ;
        ;           returned.                                           ;
        ;...............................................................;

_GetDateTemplate:

        Entry
        def _DayMonthYear, si
        def _DayMonthYearPtrs, di

        mov word ptr ss:[ di ], si
        mov word ptr ss:[ di + 2 ], si
        mov word ptr ss:[ di + 4 ], si                  ; initialize pointers to base

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  scan date template
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        call returnDateTimeTemplate

        xor bx, bx                                      ; argument order
        getarg di, _DayMonthYearPtrs                    ; start with arg array 

_GetDateTemplate_14:
        lodsw                                           ; get characters
        Goto 'd', _GetDateTemplate_Day                  ; if day   -->
        Goto 'm', _GetDateTemplate_Month                ; if month -->
        Goto 'y', _GetDateTemplate_Year                 ; if year  -->
        jmp short _GetDateTemplate_Done

_GetDateTemplate_Day:
        add word ptr ss:[ di + bx ], _DAY
        jmp short _GetDateTemplate_SkipToSeparator
        
_GetDateTemplate_Month:
        add word ptr ss:[ di + bx ], _MONTH
        jmp short _GetDateTemplate_SkipToSeparator

_GetDateTemplate_Year:
        add word ptr ss:[ di + bx ], _YEAR
      ; jmp short _GetDateTemplate_SkipToSeparator

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  skip to next argument
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_GetDateTemplate_SkipToSeparator:
        lodsb
        or al, al                                       ; end of string ?
        jz _GetDateTemplate_Done                        ; yes, done -->
        cmp al, 'a'                                     ; none text ?
        jnc _GetDateTemplate_SkipToSeparator            ; still on text -->

        inc bx
        inc bx                                          ; advance reference pointer
        jmp _GetDateTemplate_14                         ; continue -->
        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  done
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_GetDateTemplate_Done:

        Return

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Display Get Date Prompt                                      ;
        ;...............................................................;

DisplayPleaseEnterDate:

        mov dx, offset _PleaseEnterDate
        call DisplayLine

        mov dl, '('
        Int21 DisplayOutput

        call returnDateTimeTemplate
        mov cx, bx
        sub cx, si                                      ; length of string.
        dec cx

DisplayPleaseEnterDate_08:
        lodsb
        mov dl, al
        Int21 DisplayOutput
        loop DisplayPleaseEnterDate_08

        mov dl, ')'
        Int21 DisplayOutput
        mov dl, ':'
        Int21 DisplayOutput
        mov dl, ' '
        Int21 DisplayOutput

        ret        

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Find International Date /Time Template                       ;
        ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
        ;                                                               ;
        ;  Returns:                                                     ;
        ;   si     pointer to Date Template                             ;
        ;   bx     pointer to Time Template                             ;
        ;   ax     country code                                         ;
        ;...............................................................;

returnDateTimeTemplate:

        Entry
        def _countryCode
        def _dateTemplate
        def _timeTemplate
        defbytes _countryInfo, sizeCOUNTRYINFO

        push di
        lea dx, offset [ _countryInfo ][ bp ]
        Int21 CountryDependentInfo, 00                  ; get country info
        mov word ptr [ _countryCode ][ bp ], bx         ; save value.

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  locate international template
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        mov di, offset RxDOSIntl_DateTimeTable

returnTemplate_08:
        inc di
        inc di
        cmp bx, word ptr [ di - 2 ]                     ; is it current entry ?
        jz returnTemplate_12                            ; yes -->

        mov cx, -1
        xor ax, ax
        repnz scasb                                     ; scan for null terminator

        cmp word ptr [ di ], 0000                       ; end of table ?
        jnz returnTemplate_08                           ; no, continue looking -->

        mov di, offset RxDOSIntl_DateTimeTable          ; assume USA if no valid entry

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  compute time template
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

returnTemplate_12:
        storarg _dateTemplate, di

        mov al, ' '
        mov cx, -1
        repnz scasb                                     ; search for space delimeter

        mov bx, di                                      ; time template address
        getarg si, _dateTemplate                        ; date template address
        getarg ax, _countrycode                         ; country code

        pop di
        Return

RxDOSCMD                        ENDS
                                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -