summaryrefslogtreecommitdiff
path: root/v2.0/source/TCODE4.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/TCODE4.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/TCODE4.ASM')
-rw-r--r--v2.0/source/TCODE4.ASM1002
1 files changed, 1002 insertions, 0 deletions
diff --git a/v2.0/source/TCODE4.ASM b/v2.0/source/TCODE4.ASM
new file mode 100644
index 0000000..a8c44a6
--- /dev/null
+++ b/v2.0/source/TCODE4.ASM
@@ -0,0 +1,1002 @@
1TITLE PART4 - COMMAND Transient routines.
2
3 INCLUDE COMSW.ASM
4
5.xlist
6.xcref
7 INCLUDE DOSSYM.ASM
8 INCLUDE DEVSYM.ASM
9 INCLUDE COMSEG.ASM
10.list
11.cref
12
13 INCLUDE COMEQU.ASM
14
15
16DATARES SEGMENT PUBLIC
17 EXTRN RESTDIR:BYTE
18DATARES ENDS
19
20TRANDATA SEGMENT PUBLIC
21 EXTRN BADDRV:BYTE,BADSWT:BYTE
22 EXTRN BADDAT:BYTE,NEWDAT:BYTE,BADTIM:BYTE
23 EXTRN DMES:BYTE,CURDAT_PRE:BYTE,CURDAT_MID:BYTE,CURDAT_POST:BYTE
24 EXTRN RENERR:BYTE,VERMES_PRE:BYTE,VERMES_POST:BYTE
25 EXTRN DIRHEAD_PRE:BYTE,DIRHEAD_POST:BYTE
26 EXTRN ACRLF:BYTE,BADARGS:BYTE,NOTFND:BYTE
27 EXTRN NEWTIM:BYTE,BADCD:BYTE,BADMKD:BYTE,CLSSTRING:BYTE
28 EXTRN CURTIM_PRE:BYTE,CURTIM_POST:BYTE,PauseMes:BYTE
29 EXTRN BADRMD:BYTE
30TRANDATA ENDS
31
32TRANSPACE SEGMENT PUBLIC
33 EXTRN COMBUF:BYTE,DIRCHAR:BYTE,USERDIR1:BYTE
34 EXTRN BYTCNT:WORD,CURDRV:BYTE,COMSW:WORD,ARGTS:WORD
35 EXTRN LINCNT:BYTE,LINLEN:BYTE,FILECNT:WORD,CHARBUF:BYTE
36 EXTRN DIRBUF:BYTE,BITS:WORD,PATHPOS:WORD
37 EXTRN DESTISDIR:BYTE,DESTTAIL:WORD,DESTINFO:BYTE,FULLSCR:WORD
38 EXTRN INTERNATVARS:BYTE,RESSEG:WORD,TPA:WORD
39TRANSPACE ENDS
40
41
42TRANCODE SEGMENT PUBLIC BYTE
43ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
44
45 EXTRN NOTEST2:NEAR,PRINTVOL:NEAR,Print_Date:NEAR
46 EXTRN CERROR:NEAR,SWITCH:NEAR,PWD:NEAR,SETREST:NEAR,MESTRAN:NEAR
47 EXTRN NOTFNDERR:NEAR,CHKCNT:NEAR,GETKEYSTROKE:NEAR
48 EXTRN SETPATH:NEAR,PATHCRUNCH:NEAR,PRINT:NEAR,ZPRINT:NEAR
49 EXTRN DISPSIZE:NEAR,OUT:NEAR,OUT2:NEAR,ERROR_PRINT:NEAR
50 EXTRN SCANOFF:NEAR,OUTBYTE:NEAR,GETNUM:NEAR,ERROR_OUTPUT:NEAR
51
52
53 PUBLIC PRINT_TIME,CATALOG
54 PUBLIC BADCDERR,PRINT_VERSION,CLS,SAVUDIR,SAVUDIR1
55 PUBLIC TYPEFIL,CRENAME,$RMDIR
56 PUBLIC CTIME,$CHDIR,ONESPC,DATINIT
57 PUBLIC $MKDIR,VERSION,RESTUDIR1
58 PUBLIC RESTUDIR,CRLF2,ERASE
59 PUBLIC volume,date,P_date,PAUSE
60
61
62CATALOG:
63 CALL OKVOLARG
64 MOV AL,"?" ; *.* is default file spec.
65 MOV DI,5DH
66 MOV CX,11
67 REP STOSB
68 MOV SI,81H
69 CALL SWITCH
70 MOV DI,FCB
71 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 0DH ; Parse with default name and extension
72 INT int_command
73
74; Begin by processing any switches that may have been specified.
75; BITS will contain any information about switches that was
76; found when the command line was parsed.
77
78SETSWT:
79 MOV AX,[COMSW] ; Get switches from command
80 OR AX,[ARGTS] ; OR in switches from all of tail
81 MOV [BITS],AX
82 MOV BYTE PTR[FULLSCR],LINPERPAG
83 TEST AL,1 ; Look for W switch
84 MOV AL,NORMPERLIN
85 JZ DIR
86 MOV AL,WIDEPERLIN
87DIR:
88 MOV [LINLEN],AL ; Set number of entries per line
89 MOV [LINCNT],AL
90 MOV [FILECNT],0 ; Keep track of how many files found
91 MOV DX,OFFSET TRANGROUP:DIRBUF ; Set Disk transfer address
92 MOV AH,SET_DMA
93 INT int_command
94 CALL PATHCRUNCH ; Get where we're going
95 PUSHF
96 JNC NOTEST
97 CMP [DESTISDIR],0 ; No CHDIRs worked
98 JZ NOTEST ; see if they should have
99 JMP BADCDERR
100
101NOTEST:
102 MOV SI,FCB
103 MOV DI,OFFSET TRANGROUP:DIRBUF
104 MOV DX,DI
105 MOV CX,12
106 REP MOVSB
107 MOV AH,FCB_OPEN
108 INT int_command
109 MOV DX,OFFSET TRANGROUP:DIRHEAD_PRE ; Print "Directory of"
110 PUSH AX ; save return code
111 CALL PRINT
112 CALL PWD ; print the path
113 MOV DX,OFFSET TRANGROUP:DIRHEAD_POST
114 CALL PRINT
115 POP AX
116 OR AL,AL
117 JNZ OKDODIR ; Go ahead and dir if open fail
118 TEST [DIRBUF+fcb_DEVID],devid_device
119 JZ OKDODIR
120 JMP NOTFNDERR ; Can't DIR a device
121OKDODIR:
122 MOV AH,DIR_SEARCH_FIRST
123 MOV BYTE PTR DS:[FCB-7],0FFH
124 MOV BYTE PTR DS:[FCB-1],010H
125 POPF
126 JC SHOWDIR ; Current dir
127 JZ DOFIRST ; FCB is *.*
128 MOV AL,"?"
129 MOV DI,5DH
130 MOV CX,11
131 REP STOSB ; Remake default FCB
132 MOV SI,[DESTTAIL]
133 MOV DI,FCB
134 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 0EH ; Parse with default drive, name and extension
135 INT int_command
136 MOV AH,DIR_SEARCH_FIRST
137DOFIRST:
138 MOV DX,FCB-7
139 INT int_command
140 PUSH AX
141 CALL RESTUDIR
142 POP AX
143 JMP SHORT DIRSTART
144
145SHOWDIR:
146 MOV DX,FCB-7 ; DX -> Unopened FCB
147 INT int_command ; Search for a file to match FCB
148DIRSTART:
149 INC AL ; FF = file not found
150 JNZ AGAIN ; Either an error or we are finished
151 JMP CHKCNT
152NEXENTJ:
153 JMP NEXENT
154AGAIN:
155 INC [FILECNT] ; Keep track of how many we find
156 MOV SI,OFFSET TRANGROUP:DIRBUF+8 ; SI -> information returned by sys call
157 CALL SHONAME
158 TEST BYTE PTR[BITS],WSWITCH ; W switch set?
159 JNZ NEXENTJ ; If so, no size, date, or time
160 MOV SI,OFFSET TRANGROUP:DIRBUF+8+dir_attr
161 TEST BYTE PTR [SI],attr_directory
162 JZ FILEENT
163 MOV DX,OFFSET TRANGROUP:DMES
164 CALL PRINT
165 JMP SHORT NOFSIZ
166FILEENT:
167 CALL DISPSIZE ; Print size of file
168NOFSIZ:
169 MOV AX,WORD PTR [DIRBUF+8+dir_date] ; Get date
170 OR AX,AX
171 JZ NEXENT ; Skip if no date
172 MOV DI,OFFSET TRANGROUP:CHARBUF
173 PUSH AX
174 MOV AX," "
175 STOSW
176 POP AX
177 MOV BX,AX
178 AND AX,1FH ; get day
179 MOV DL,AL
180 MOV AX,BX
181 MOV CL,5
182 SHR AX,CL ; Align month
183 AND AL,0FH ; Get month
184 MOV DH,AL
185 MOV CL,BH
186 SHR CL,1 ; Align year
187 XOR CH,CH
188 ADD CX,80 ; Relative 1980
189 CMP CL,100
190 JB MILLENIUM
191 SUB CL,100
192MILLENIUM:
193 CALL DATE_CXDX
194 MOV CX,WORD PTR[DIRBUF+8+dir_time] ; Get time
195 JCXZ PRBUF ; Time field present?
196 MOV AX," "
197 STOSW
198 SHR CX,1
199 SHR CX,1
200 SHR CX,1
201 SHR CL,1
202 SHR CL,1 ; Hours in CH, minutes in CL
203 MOV BL,[INTERNATVARS.Time_24]
204 OR BL,80H ; Tell P_TIME called from DIR
205 CALL P_TIME ; Don't care about DX, never used with DIR
206PRBUF:
207 XOR AX,AX
208 STOSB
209 MOV DX,OFFSET TRANGROUP:CHARBUF
210 CALL ZPRINT
211NEXENT:
212 DEC [LINCNT]
213 JNZ SAMLIN
214NEXLIN:
215 MOV AL,[LINLEN]
216 MOV [LINCNT],AL
217 CALL CRLF2
218 TEST BYTE PTR[BITS],PSWITCH ; P switch present?
219 JZ SCROLL ; If not, just continue
220 DEC BYTE PTR[FULLSCR]
221 JNZ SCROLL
222 MOV BYTE PTR[FULLSCR],LINPERPAG
223 MOV DX,OFFSET TRANGROUP:PAUSEMES
224 CALL PRINT
225 CALL GetKeystroke
226 CALL CRLF2
227SCROLL:
228 MOV AH,DIR_SEARCH_NEXT
229 JMP SHOWDIR
230
231SAMLIN:
232 MOV AL,9 ; Output a tab
233 CALL OUT
234 JMP SHORT SCROLL
235
236SHONAME:
237 MOV DI,OFFSET TRANGROUP:CHARBUF
238 MOV CX,8
239 REP MOVSB
240 MOV AL," "
241 STOSB
242 MOV CX,3
243 REP MOVSB
244 XOR AX,AX
245 STOSB
246 PUSH DX
247 MOV DX,OFFSET TRANGROUP:CHARBUF
248 CALL ZPRINT
249 POP DX
250 return
251
252ONESPC:
253 MOV AL," "
254 JMP OUT
255
256CRLF2:
257 PUSH DX
258 MOV DX,OFFSET TRANGROUP:ACRLF
259PR:
260 PUSH DS
261 PUSH CS
262 POP DS
263 CALL PRINT
264 POP DS
265 POP DX
266 return
267
268PAUSE:
269 MOV DX,OFFSET TRANGROUP:PAUSEMES
270 CALL ERROR_PRINT
271 CALL GetKeystroke
272 CALL CRLF2
273 return
274
275ERASE:
276 MOV DX,OFFSET TRANGROUP:BADARGS
277 MOV SI,80H
278 LODSB
279 OR AL,AL
280 JZ ERRJ2
281 CALL SCANOFF
282 CMP AL,13 ; RETURN KEY?
283 JZ ERRJ2 ; IF SO NO PARAMETERS SPECIFIED
284
285ERA1:
286 CALL PATHCRUNCH
287 JNC NOTEST2J
288 CMP [DESTISDIR],0 ; No CHDIRs worked
289 JZ NOTEST2J ; see if they should have
290BADCDERR:
291 MOV DX,OFFSET TRANGROUP:BADCD
292ERRJ2:
293 JMP CERROR
294
295NOTEST2J:
296 JMP NOTEST2
297
298CRENAME:
299 CALL PATHCRUNCH
300 JNC NOTEST3
301 CMP [DESTISDIR],0 ; No CHDIRs worked
302 JZ NOTEST3 ; see if they should have
303 JMP BADCDERR
304
305NOTEST3:
306 MOV SI,[PATHPOS]
307 MOV DI,FCB+10H
308 CALL SCANOFF
309 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR 01H
310 INT int_command
311 CMP BYTE PTR DS:[FCB+10H+1]," " ; Check if parameter exists
312 MOV DX,OFFSET TRANGROUP:BADARGS
313 JZ ERRJ ; Error if missing parameter
314 MOV AH,FCB_RENAME
315 MOV DX,FCB
316 INT int_command
317 PUSH AX
318 CALL RESTUDIR
319 POP AX
320 MOV DX,OFFSET TRANGROUP:RENERR
321 INC AL
322 retnz
323ERRJ:
324 JMP CERROR
325
326ASSUME DS:TRANGROUP,ES:TRANGROUP
327TYPEFIL:
328 mov si,81H
329 call SCANOFF ; Skip to first non-delim
330 cmp al,0DH
331 jnz GOTTARG
332 jmp NOARGERR ; No args
333GOTTARG:
334 CALL SETPATH
335 MOV AX,OPEN SHL 8
336 INT int_command
337 MOV DX,OFFSET TRANGROUP:NOTFND
338 JC ERRJ
339 MOV BX,AX ; Handle
340 MOV DS,[TPA]
341 XOR DX,DX
342ASSUME DS:NOTHING
343TYPELP:
344 MOV CX,[BYTCNT]
345 MOV AH,READ
346 INT int_command
347 MOV CX,AX
348 JCXZ RET56
349 PUSH BX
350 MOV BX,1
351 MOV AH,WRITE
352 INT int_command
353 POP BX
354 JC ERROR_OUTPUTJ
355 CMP AX,CX
356 JZ TYPELP
357 DEC CX
358 CMP AX,CX
359 retz ; One less byte OK (^Z)
360ERROR_OUTPUTJ:
361 MOV BX,1
362 MOV AX,IOCTL SHL 8
363 INT int_command
364 TEST DL,devid_ISDEV
365 retnz ; If device, no error message
366 JMP ERROR_OUTPUT
367
368RESTUDIR1:
369 PUSH DS
370 MOV DS,[RESSEG]
371ASSUME DS:RESGROUP
372 CMP [RESTDIR],0
373 POP DS
374ASSUME DS:TRANGROUP
375 retz
376RESTUDIR:
377 MOV DX,OFFSET TRANGROUP:USERDIR1
378 MOV AH,CHDIR
379 INT int_command ; Restore users DIR
380 XOR AL,AL
381 CALL SETREST
382RET56:
383 return
384
385
386VOLUME:
387 mov si,81H
388 call SCANOFF ; Skip to first non-delim
389 CMP BYTE PTR DS:[FCB],0 ;Default drive?
390 JZ CHECKNOARG ;Yes
391 INC SI
392 INC SI ;Skip over d:
393 MOV BX,SI
394 CALL SCANOFF
395 CMP BX,SI
396 JNZ OKVOLARG ; If we skipped some delims at this point, OK
397CHECKNOARG:
398 cmp al,0DH
399 JZ OKVOLARG
400BADVOLARG:
401 MOV DX,OFFSET TRANGROUP:BADDRV
402 JMP CERROR
403
404OKVOLARG:
405 CALL CRLF2
406 PUSH DS
407 POP ES
408 MOV DI,FCB-7 ; Set up extended FCB
409 MOV AX,-1
410 STOSB
411 XOR AX,AX
412 STOSW
413 STOSW
414 STOSB
415 MOV AL,8 ; Look for volume label
416 STOSB
417 INC DI ; Skip drive byte
418 MOV CX,11
419 MOV AL,'?'
420 REP STOSB
421 MOV DX,OFFSET TRANGROUP:DIRBUF
422 MOV AH,SET_DMA
423 INT int_command
424 MOV DX,FCB-7
425 MOV AH,DIR_SEARCH_FIRST
426 INT int_command
427 JMP PRINTVOL
428
429VERSION:
430 CALL CRLF2
431 CALL PRINT_VERSION
432 JMP CRLF2
433
434PRINT_VERSION:
435 MOV DI,OFFSET TRANGROUP:CHARBUF
436 MOV SI,OFFSET TRANGROUP:VERMES_PRE
437 CALL MESTRAN
438 MOV AH,GET_VERSION
439 INT int_command
440 PUSH AX
441 XOR AH,AH
442 MOV CL,10
443 DIV CL
444 MOV CL,4
445 SHL AL,CL
446 OR AL,AH
447 MOV CX,1110H
448 MOV DL,AL
449 CALL OUTBYTE
450 MOV AL,'.'
451 STOSB
452 POP AX
453 MOV AL,AH
454 XOR AH,AH
455 MOV CL,10
456 DIV CL
457 MOV CL,4
458 SHL AL,CL
459 OR AL,AH
460 MOV CX,1010H
461 MOV DL,AL
462 CALL OUTBYTE
463 MOV SI,OFFSET TRANGROUP:VERMES_POST
464 CALL MESTRAN
465 XOR AX,AX
466 STOSB
467 MOV DX,OFFSET TRANGROUP:CHARBUF
468 JMP ZPRINT
469
470ASSUME DS:TRANGROUP
471
472CLS:
473 IF IBMVER
474 MOV BX,1
475 MOV AX,IOCTL SHL 8
476 INT int_command
477 TEST DL,devid_ISDEV
478 JZ ANSICLS ; If a file put out ANSI
479 TEST DL,devid_SPECIAL
480 JZ ANSICLS ; If not special CON, do ANSI
481 MOV AX,(GET_INTERRUPT_VECTOR SHL 8) OR 29H
482 INT int_command
483 MOV DX,ES
484 MOV AX,(GET_INTERRUPT_VECTOR SHL 8) OR 20H
485 INT int_command
486 MOV AX,ES
487 CMP DX,AX
488 JA ANSICLS ; If not default driver, do ANSI
489 MOV AH,11 ; Set overscan to black
490 XOR BX,BX
491 INT 16
492 MOV AH,15
493 INT 16
494 MOV DL,AH
495 DEC DL
496
497 IF KANJI
498 MOV DH,23
499 ELSE
500 MOV DH,25
501 ENDIF
502
503 XOR AX,AX
504 MOV CX,AX
505
506 IF KANJI
507 MOV BH,0
508 ELSE
509 MOV BH,7
510 ENDIF
511
512 MOV AH,6
513 INT 16
514 XOR DX,DX
515 MOV BH,0
516 MOV AH,2
517 INT 16
518 return
519
520ANSICLS:
521 ENDIF
522
523 MOV SI,OFFSET TRANGROUP:CLSSTRING
524 LODSB
525 MOV CL,AL
526 XOR CH,CH
527 MOV AH,RAW_CON_IO
528CLRLOOP:
529 LODSB
530 MOV DL,AL
531 INT int_command
532 LOOP CLRLOOP
533 return
534
535$CHDIR:
536 MOV AX,[COMSW]
537 OR AX,[ARGTS]
538 MOV DX,OFFSET TRANGROUP:BADSWT
539 JNZ CERRORJ3
540 mov si,81H
541 call SCANOFF ; Skip to first non-delim
542 cmp al,0DH
543 jz PWDJ ; No args
544 inc si ; Skip first char
545 lodsw
546 cmp ax,(0DH SHL 8) OR ':' ; d:<CR> ?
547 jnz REALCD ; no
548PWDJ:
549 jmp PWD ; Drive only specified
550REALCD:
551 CALL SETPATH
552 TEST [DESTINFO],2
553 JNZ BADCDERRJ
554 MOV AH,CHDIR
555 INT int_command
556 retnc
557BADCDERRJ:
558 JMP BADCDERR
559
560$MKDIR:
561 CALL SETRMMK
562 JNZ BADMDERR
563 MOV AH,MKDIR
564 INT int_command
565 retnc
566BADMDERR:
567 MOV DX,OFFSET TRANGROUP:BADMKD
568CERRORJ3:
569 JMP CERROR
570
571NOARGERR:
572 MOV DX,OFFSET TRANGROUP:BADARGS
573 JMP SHORT CERRORJ3
574
575SETRMMK:
576 mov si,81H
577 call SCANOFF ; Skip to first non-delim
578 cmp al,0DH
579 jz NOARGERR ; No args
580 MOV AX,[COMSW]
581 OR AX,[ARGTS]
582 MOV DX,OFFSET TRANGROUP:BADSWT
583 JNZ CERRORJ3
584 CALL SETPATH
585 TEST [DESTINFO],2
586 return
587
588$RMDIR:
589 CALL SETRMMK
590 JNZ BADRDERR
591 MOV AH,RMDIR
592 INT int_command
593 retnc
594BADRDERR:
595 MOV DX,OFFSET TRANGROUP:BADRMD
596 JMP CERROR
597
598SAVUDIR:
599; DL is drive number A=1
600 MOV DI,OFFSET TRANGROUP:USERDIR1
601SAVUDIR1:
602 MOV AL,DL
603 ADD AL,'@'
604 CMP AL,'@'
605 JNZ GOTUDRV
606 ADD AL,[CURDRV]
607 INC AL ; A = 1
608GOTUDRV:
609 STOSB
610 MOV AH,[DIRCHAR]
611 MOV AL,DRVCHAR
612 STOSW
613 PUSH ES
614 POP DS
615ASSUME DS:NOTHING
616 MOV SI,DI
617 MOV AH,CURRENT_DIR ; Get the Directory Text
618 INT int_command
619 retc
620 PUSH CS
621 POP DS
622ASSUME DS:TRANGROUP
623 return
624
625ASSUME DS:TRANGROUP,ES:TRANGROUP
626
627; Date and time are set during initialization and use
628; this routines since they need to do a long return
629
630DATINIT PROC FAR
631 PUSH ES
632 PUSH DS ; Going to use the previous stack
633 MOV AX,CS ; Set up the appropriate segment registers
634 MOV ES,AX
635 MOV DS,AX
636 MOV DX,OFFSET TRANGROUP:INTERNATVARS ;Set up internat vars
637 MOV AX,INTERNATIONAL SHL 8
638 INT 21H
639 MOV WORD PTR DS:[81H],13 ; Want to prompt for date during initialization
640 MOV [COMBUF],COMBUFLEN ; Init COMBUF
641 MOV WORD PTR [COMBUF+1],0D01H
642 CALL DATE
643 CALL CTIME
644 POP DS
645 POP ES
646 RET
647DATINIT ENDP
648
649; DATE - Gets and sets the time
650
651DATE_CXDX:
652 MOV BX,CX
653P_DATE:
654 MOV AX,BX
655 MOV CX,DX
656 MOV DL,100
657 DIV DL
658 XCHG AL,AH
659 XCHG AX,DX
660 MOV BH,"0"-" " ; Enable leading zero suppression
661 MOV AX,WORD PTR [INTERNATVARS.Date_tim_format]
662 OR AX,AX
663 JZ USPDAT
664 DEC AX
665 JZ EUPDAT
666 MOV BH,0 ; Disable leading zero suppression
667 CALL P_YR
668 CALL P_DSEP
669 CALL P_MON
670 CALL P_DSEP
671 CALL P_DAY
672 return
673
674USPDAT:
675 CALL P_MON
676 CALL P_DSEP
677 CALL P_DAY
678PLST:
679 CALL P_DSEP
680 CALL P_YR
681 return
682
683EUPDAT:
684 CALL P_DAY
685 CALL P_DSEP
686 CALL P_MON
687 JMP PLST
688
689P_MON:
690 MOV AL,CH
691 CALL OUT2
692 return
693
694P_DSEP:
695 MOV AL,BYTE PTR [INTERNATVARS.Date_sep]
696 STOSB
697 return
698
699P_DAY:
700 MOV AL,CL
701 CALL OUT2
702 return
703
704P_YR:
705 MOV AL,DH
706 OR AL,AL
707 JZ TWODIGYR ; Two instead of 4 digit year
708 CALL OUT2
709TWODIGYR:
710 MOV AL,DL
711 CALL OUT2
712 return
713
714DATE:
715 MOV SI,81H ; Accepting argument for date inline
716 CALL SCANOFF
717 CMP AL,13
718 JZ PRMTDAT
719 JMP COMDAT
720
721PRMTDAT:
722 MOV DX,OFFSET TRANGROUP:CURDAT_PRE
723 CALL PRINT ; Print "Current date is "
724 CALL PRINT_DATE
725 MOV DX,OFFSET TRANGROUP:CURDAT_POST
726 CALL PRINT
727GETDAT:
728 MOV DX,OFFSET TRANGROUP:NEWDAT
729 CALL ERROR_PRINT ; Print "Enter new date: "
730 MOV AH,STD_CON_STRING_INPUT
731 MOV DX,OFFSET TRANGROUP:COMBUF
732 INT int_command ; Get input line
733 CALL CRLF2
734 MOV SI,OFFSET TRANGROUP:COMBUF+2
735 CMP BYTE PTR[SI],13 ; Check if new date entered
736 retz
737COMDAT:
738 MOV AX,WORD PTR [INTERNATVARS.Date_tim_format]
739 OR AX,AX
740 JZ USSDAT
741 DEC AX
742 JZ EUSDAT
743 CALL GET_YR
744 JC DATERRJ
745 CALL GET_DSEP
746 JC DATERRJ
747 CALL GET_MON
748 JC DATERRJ
749 CALL GET_DSEP
750 JC DATERRJ
751 CALL GET_DAY
752DAT_SET:
753 JC DATERR
754 LODSB
755 CMP AL,13
756 JNZ DATERR
757 MOV AH,SET_DATE
758 INT int_command
759 OR AL,AL
760 JNZ DATERR
761 return
762
763USSDAT:
764 CALL GET_MON
765 JC DATERR
766 CALL GET_DSEP
767DATERRJ:
768 JC DATERR
769 CALL GET_DAY
770TGET:
771 JC DATERR
772 CALL GET_DSEP
773 JC DATERR
774 CALL GET_YR
775 JMP DAT_SET
776
777EUSDAT:
778 CALL GET_DAY
779 JC DATERR
780 CALL GET_DSEP
781 JC DATERR
782 CALL GET_MON
783 JMP TGET
784
785GET_MON:
786 CALL GETNUM ; Get one or two digit number
787 retc
788 MOV DH,AH ; Put in position
789 return
790
791GET_DAY:
792 CALL GETNUM
793 MOV DL,AH ; Put in position
794 return
795
796GET_YR:
797 CALL GETNUM
798 retc
799 MOV CX,1900
800 CALL GET_DSEP
801 PUSHF
802 DEC SI
803 POPF
804 JZ BIAS
805 CMP BYTE PTR[SI],13
806 JZ BIAS
807 MOV AL,100
808 MUL AH
809 MOV CX,AX
810 CALL GETNUM
811 retc
812BIAS:
813 MOV AL,AH
814 MOV AH,0
815 ADD CX,AX
816
817 IF IBM AND KANJI
818;
819; Gross hack for PC-J machine: CMOS clock cannot handle years after 2079
820;
821 CMP CX,2080
822 JB YearOk
823 STC
824 return
825YearOk: CLC
826 ENDIF
827 return
828
829DATERR:
830 MOV DX,OFFSET TRANGROUP:BADDAT
831 CALL PRINT
832 JMP GETDAT
833
834GET_DSEP:
835 LODSB
836 CMP AL,'/'
837 retz
838 CMP AL,'.'
839 retz
840 CMP AL,'-'
841 retz
842 STC
843 return
844
845; TIME gets and sets the time
846
847CTIME:
848 MOV SI,81H ; Accepting argument for time inline
849 CALL SCANOFF
850 CMP AL,13
851 JZ PRMTTIM
852 MOV BX,".:"
853 CALL INLINE
854 JMP COMTIM
855
856PRINT_TIME:
857 MOV AH,GET_TIME
858 INT int_command ; Get time in CX:DX
859 PUSH DI
860 PUSH ES
861 PUSH CS
862 POP ES
863 MOV DI,OFFSET TRANGROUP:CHARBUF
864 MOV BL,1 ; Always 24 hour time
865 CALL P_TIME
866 XOR AX,AX
867 STOSB
868 MOV DX,OFFSET TRANGROUP:CHARBUF
869 CALL ZPRINT
870 POP ES
871 POP DI
872 return
873
874P_TIME:
875 MOV AL,CH
876 TEST BL,07FH ; Ignore high bit
877 JNZ T24 ; 24 hr time?
878 MOV BH,"a" ; Assume A.M.
879 CMP AL,12 ; In the afternoon?
880 JB MORN
881 MOV BH,"p"
882 JE MORN
883 SUB AL,12 ; Keep it to 12 hours or less
884MORN:
885 OR AL,AL ; Before 1 am?
886 JNZ T24
887 MOV AL,12
888T24:
889 PUSH BX
890 MOV BH,"0"-" " ; Enable leading zero suppression
891 CALL OUT2
892 CALL P_TSEP
893 MOV AL,CL
894 CALL OUT2
895 POP BX
896 PUSH BX
897 TEST BL,80H
898 JNZ PAP ; If from DIR, go directly to am pm
899 MOV BH,0 ; Disable leading zero suppression
900 CALL P_TSEP
901 MOV AL,DH
902 CALL OUT2
903 IF NOT IBMJAPAN
904 MOV AL,"."
905 STOSB
906 MOV AL,DL
907 CALL OUT2
908 ENDIF
909PAP:
910 POP BX
911 TEST BL,07FH ; Ignore high bit
912 retnz ; 24 hour time, no am pm
913 MOV AL,BH
914 STOSB ; Store 'a' or 'p'
915 return
916
917P_TSEP:
918 MOV AL,[INTERNATVARS.Time_sep]
919 STOSB
920 return
921
922
923PRMTTIM:
924 MOV DX,OFFSET TRANGROUP:CURTIM_PRE
925 CALL PRINT ; Print "Current time is "
926 CALL PRINT_TIME
927 MOV DX,OFFSET TRANGROUP:CURTIM_POST
928 CALL PRINT
929GETTIM:
930 XOR CX,CX ; Initialize hours and minutes to zero
931 MOV DX,OFFSET TRANGROUP:NEWTIM
932 MOV BX,".:"
933 CALL GETBUF
934COMTIM:
935 retz ; If no time present, don't change it
936 JC TIMERR
937 MOV CX,DX
938 XOR DX,DX
939 LODSB
940 CMP AL,13
941 JZ SAVTIM
942 CMP AL,BL
943 JZ GOTSEC
944 CMP AL,BH
945 JNZ TIMERR
946GOTSEC:
947 CALL GETNUM
948 JC TIMERR
949 MOV DH,AH ; Position seconds
950 LODSB
951 CMP AL,13
952 JZ SAVTIM
953 CMP AL,"."
954 JNZ TIMERR
955 CALL GETNUM
956 JC TIMERR
957 MOV DL,AH
958 LODSB
959 CMP AL,13
960 JNZ TIMERR
961SAVTIM:
962 MOV AH,SET_TIME
963 INT int_command
964 OR AL,AL
965 retz ; Error in time?
966TIMERR:
967 MOV DX,OFFSET TRANGROUP:BADTIM
968 CALL PRINT ; Print error message
969 JMP GETTIM ; Try again
970
971GETBUF:
972 CALL ERROR_PRINT ; Print "Enter new time: "
973 MOV AH,STD_CON_STRING_INPUT
974 MOV DX,OFFSET TRANGROUP:COMBUF
975 INT int_command ; Get input line
976 CALL CRLF2
977 MOV SI,OFFSET TRANGROUP:COMBUF+2
978 CMP BYTE PTR[SI],13 ; Check if new time entered
979 retz
980INLINE:
981 CALL GETNUM ; Get one or two digit number
982 retc
983 MOV DH,AH ; Put in position
984 LODSB
985 CMP AL,BL
986 JZ NEXT
987 CMP AL,BH
988 JZ NEXT
989 DEC SI ; Clears zero flag
990 CLC
991 MOV DL,0
992 return ; Time may have only an hour specified
993
994NEXT:
995 CALL GETNUM
996 MOV DL,AH ; Put in position
997 return
998
999
1000TRANCODE ENDS
1001 END
1002