📄 rxdosprm.asm
字号:
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 + -