From 88fae5397a08271235f3fbef01658be91118874a Mon Sep 17 00:00:00 2001 From: Erdogan Tan <124918396+turkishrational@users.noreply.github.com> Date: Thu, 15 Aug 2024 18:20:16 +0300 Subject: [PATCH] Add files via upload --- retrodos5/command/archive/COMMAND.COM | Bin 52443 -> 52443 bytes retrodos5/command/archive/COMMAND7.COM | Bin 52443 -> 52443 bytes retrodos5/command/archive/command7.s | 115 +- retrodos5/command/archive/command7.txt | 87515 ++++++++-------- .../command/archive/command7_15_8_2024.zip | Bin 0 -> 893233 bytes retrodos5/command/archive/command7_2024.zip | Bin 924893 -> 893233 bytes 6 files changed, 43818 insertions(+), 43812 deletions(-) create mode 100644 retrodos5/command/archive/command7_15_8_2024.zip diff --git a/retrodos5/command/archive/COMMAND.COM b/retrodos5/command/archive/COMMAND.COM index c319f58651169b87034286b0b523575c778a62d2..12579cc61f7a27fbc92223ba76dfc4f2baf66458 100644 GIT binary patch delta 23 fcmcaTllk^c<_#N}8A~>AVvdwyG~LXjaDEK{c6AVvdwyG~LXjaDEK{c6 cf = 0 - jnc short gdf_ret + jnc short gdf_ret or ah,0F0h ; caller expects 16 bit special values ;jmp short gdf_success @@ -20337,7 +20340,7 @@ ReadCVFile: cmp ax,cx ; read it all? ;je short rcf_ret ; yes, CY clear - ; 08/06/2023 + ; 08/06/2023 ; ax < cx ;stc ; end-of-file? rcf_ret: @@ -20441,11 +20444,11 @@ erase_scan: cmp byte [si+1],':' ;AC000; drive specified? jne short erase_drive_ok ;AC000; no - continue - ;cmp byte [si+2],END_OF_LINE_OUT + ;cmp byte [si+2],END_OF_LINE_OUT cmp byte [si+2],0 ;AC000; was only drive entered? jne short erase_drive_ok ;AC000; no - continue - mov ax,ERROR_FILE_NOT_FOUND ; 2 + mov ax,ERROR_FILE_NOT_FOUND ; 2 ;AN022; get message number in control block jmp short extend_setup ;AC000; exit @@ -36117,7 +36120,7 @@ SYSLOADMSG: ; -------------------------- ; MSDOS 5.0 COMMAND.COM - TRANGROUP5192h - ;$M_BUILD_PTRS %$M_NUM_CLS ;;AN000;; Build all utility classes + ;$M_BUILD_PTRS %$M_NUM_CLS ;;AN000;; Build all utility classes call $M_CLS_3 ; Get addressibility to class F mov [$M_RT+$M_RES_ADDRS.$M_CLASS_ADDRS],di ;mov [$M_RT+44],di @@ -36231,7 +36234,7 @@ SYSGETMSG: ;pop ds ;;AN000;; jmp short $MEN32 $MIF32: - push cs ;;AN000;; + push cs ;;AN000;; ;pop ds ;;AN000;; $MEN32: ; 07/04/2023 @@ -43551,7 +43554,7 @@ screen_f_1: ;db 10 ;AN000;maximum width ;db 10 ;AN000;minimum width screen_f_2: - db 14 ; MSDOS 6.22 COMMAND.COM + db 14 ; MSDOS 6.22 COMMAND.COM db 14 db blank ; 20h ;AN000;pad character @@ -43624,7 +43627,7 @@ dmes_ptr: ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM space_4_ptr : - dw 1105 + dw 1105 db no_subst ; 0 ; destructive back space @@ -43753,7 +43756,7 @@ screen_f_4: ;db 10 ; minimum width screen_f_5: db 14 ; MSDOS 6.22 COMMAND.COM - db 14 + db 14 db blank ; 20h ; pad character %else ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM @@ -43874,17 +43877,17 @@ dosrev_ptr: ; "DOS is in ROM" DosRom_Ptr: dw 1091 - db no_subst ; 0 + db no_subst ; 0 ; "DOS is in HMA" DosHma_Ptr: dw 1092 - db no_subst ; 0 + db no_subst ; 0 ; "DOS is in low memory" DosLow_Ptr: dw 1093 - db no_subst ; 0 + db no_subst ; 0 ; "Cannot Loadhigh batch file" ;M016 NoExecBat_Ptr: @@ -43915,17 +43918,17 @@ NoCntry_Ptr: ; "LoadHigh: Invalid argument" LhInvArg_Ptr: dw 1097 - db no_subst ; 0 + db no_subst ; 0 ; "Required parameter missing" ReqParmMiss: dw 1098 - db no_subst ; 0 + db no_subst ; 0 ; "Unrecognized switch" LhInvSwt_Ptr: dw 1099 - db no_subst ; 0 + db no_subst ; 0 ; "A bad UMB number has been specified" LhBadUMB_Ptr: @@ -44798,7 +44801,7 @@ Dir_Sw_Ptrs: ; list of ptrs to switch synonyms %if 0 ; 18/06/2023 ; MSDOS 6.0 COMMAND.COM ; * - dw DIR_SW_NEG_C ; * + dw DIR_SW_NEG_C ; * Dir_Sw_Ptrs_2: dw DIR_SW_C ; * ; MSDOS 5.0 COMMAND.COM @@ -44947,7 +44950,7 @@ sCVFRoot: ; 06/08/2024 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9C3Eh REXX_EXE: - db 'REXX.EXE',0 + db 'REXX.EXE',0 %endif ; ---------------------------------------------------------------------------- @@ -45068,7 +45071,7 @@ $P_err_flag: ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9F2Fh ; 13/08/2024 - ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9D23h + ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9D23h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; @@ -45185,30 +45188,30 @@ USERDIR1: times DIRSTRLEN+3 db 0 ; 70 ; Storage for users current directory EXECPATH: times COMBUFLEN+3 db 0 ; 131 ; Path for external command RE_INSTR: times DIRSTRLEN+16 db 0 ; 83 ; path for input to redirection -; Variables passed up from resident ; in the Resident portion: (initial values) +; Variables passed up from resident ; in the Resident portion: (initial values) HEADCALL: dw 0 ; TRANVARS (dw THEADFIX) -RESSEG: dw 0 ; MYSEG (dw 0) -TPA: dw 0 ; LTPA (dw 0) +RESSEG: dw 0 ; MYSEG (dw 0) +TPA: dw 0 ; LTPA (dw 0) SWITCHAR: db 0 ; RSWITCHAR (db '-') DIRCHAR: db 0 ; RDIRCHAR (db '/') EXEC_ADDR: - dd 0 ; (dw EXT_EXEC) - ; MYSEG1 (dw 0) + dd 0 ; (dw EXT_EXEC) + ; MYSEG1 (dw 0) RCH_ADDR: - dd 0 ; (dw TREMCHECK) + dd 0 ; (dw TREMCHECK) ; MYSEG2 (dw 0) ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM ; PCDOS 7.1 COMMAND.COM %if 0 - dw 0 ; RESTEST (dw 0) + dw 0 ; RESTEST (dw 0) %endif TRAN_TPA: - dw 0 ; RES_TPA (dw 0) + dw 0 ; RES_TPA (dw 0) CHKDRV: db 0 IFNOTFLAG: @@ -45220,13 +45223,13 @@ Concat: db 0 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM %if 1 notzerofile: - db 0 ; (if 1, destination file size is not zero) + db 0 ; (if 1, destination file size is not zero) %endif PARM2: ArgC: db 0 COMSW: dw 0 ; Switches between command and 1st arg ARG1S: dw 0 ; Switches between 1st and 2nd arg -ARG2S: ; Switches after 2nd arg +ARG2S: ; Switches after 2nd arg DestSwitch: dw 0 ARGTS: @@ -45301,15 +45304,15 @@ FileSizTotal: ccluUsed: dw 0 ; count of DOS clusters used ccluUsedDir: - dw 0 + dw 0 ccluUsedTotal: - dw 0 + dw 0 csecUsed: dd 0 ; count of comp sectors used csecUsedDir: - dd 0 + dd 0 csecUsedTotal: - dd 0 + dd 0 ; Note: keep FileCntTotal through csecUsedTotal together! @@ -45352,7 +45355,7 @@ CHARBUF: DESTFCB2: IDLEN: db 0 ID: times 8 db 0 -COM: times 3 db 0 +COM: times 3 db 0 DEST: times 37 db 0 DESTNAME: times 11 db 0 @@ -45367,7 +45370,7 @@ DIRBUF: times DIRSTRLEN+3 db 0 ; 70 DIRBUF_ATTRIB1 equ DIRBUF+19 ; byte ; INT 21h AH=11h (8+DIR_ENTRY struc) DIRBUF_ATTRIB2 equ DIRBUF+21 ; byte ; INT 21h AH=4Eh (FIND_BUF struc) DIRBUF_FTIME equ DIRBUF+30 ; word -DIRBUF_FDATE equ DIRBUF+32 ; word +DIRBUF_FDATE equ DIRBUF+32 ; word DIRBUF_FSIZ_L equ DIRBUF+36 ; word DIRBUF_FSIZ_H equ DIRBUF+38 ; word @@ -45376,7 +45379,7 @@ DIRBUF_FSIZ_H equ DIRBUF+38 ; word ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0A584h SDIRBUF: - times 12 db 0 + times 12 db 0 _Bits: dw 0 PathCnt: @@ -45401,15 +45404,15 @@ system_cpage: ; 03/08/2024 - PCDOS 7.1 COMMAND.COM %if 0 Arg_Buf: - times 128 db 0 + times 128 db 0 %endif File_Size_Low: - dw 0 + dw 0 File_Size_High: - dw 0 + dw 0 string_ptr_2: - dw 0 + dw 0 Copy_num: dw 0 cpyflag: @@ -45536,7 +45539,7 @@ ELPOS: db 0 ; MSDOS 5.0 SKPDEL: ; 18/06/2023 - db 0 ; MSDOS 6.22 (& MSDOS 5.0) + db 0 ; MSDOS 6.22 (& MSDOS 5.0) SOURCE: times 11 db 0 ext_entered: @@ -45583,7 +45586,7 @@ subst_buffer: times parm_block_size*2 db 0 ; times 22 db 0 ;AN061; ; 15/04/2023 -KPARSE: db 0 ; 3/3/KK +KPARSE: db 0 ; 3/3/KK ; Data declarations taken out of parse.asm @@ -45616,7 +45619,7 @@ ARGV0_ARGSW_WORD: ARGV0_OCOMPTR: dw 0 ARGV1_ARGPOINTER: - dw 0 ; ARGV[1] + dw 0 ; ARGV[1] times 5 db 0 ARGV1_ARGSW_WORD: dw 0 @@ -45740,7 +45743,7 @@ DECIMAL_SEP: DATE_SEP: db 0,0 ; Date separator 2 bytes TIME_SEP: - db 0,0 ; Time separator 2 bytes + db 0,0 ; Time separator 2 bytes BIT_FIELD: db 0 ; Bit values ; Bit 0 = 0 if currency symbol first @@ -45756,7 +45759,7 @@ MAP_CALL: ; THIS IS TWO WORDS SO IT CAN BE INITIALIZED ; in pieces. DATA_SEP: - db 0,0 ; Data list separator character + db 0,0 ; Data list separator character times 8 db 0 @@ -45780,7 +45783,7 @@ CountryPtr: dd 0 OldCtrlCHandler: - dd 0 ; previous int 23 vector + dd 0 ; previous int 23 vector BATLEN equ 32 diff --git a/retrodos5/command/archive/command7.txt b/retrodos5/command/archive/command7.txt index 79c4c6cd..80fb6c19 100644 --- a/retrodos5/command/archive/command7.txt +++ b/retrodos5/command/archive/command7.txt @@ -1,7 +1,7 @@ 1 ; **************************************************************************** 2 ; COMMAND.COM (PCDOS 7.1 Command Interpreter) - RETRO DOS v5.0 by ERDOGAN TAN 3 ; ---------------------------------------------------------------------------- - 4 ; Last Update: 14/08/2024 + 4 ; Last Update: 15/08/2024 5 ; ---------------------------------------------------------------------------- 6 ; Beginning: 18/07/2024 (v7.1) - ((Previous: 19/06/2023 COMMAND.COM v6.22)) 7 ; ---------------------------------------------------------------------------- @@ -2185,7 +2185,7 @@ 2176 00000316 06 push es ; save segments 2177 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM (ds=cs=RESGROUP) 2178 ;push cs - 2179 ;pop ds + 2179 ;pop ds 2180 ;assume ds:RESGROUP 2181 2182 ; M004; Save size of transient here before INIT segment is deallocated @@ -2383,44793 +2383,44796 @@ 2374 ; 21/01/2023 2375 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0398h 2376 000003AC 803E[5420]00 cmp byte [AllocedEnv],0 ; flag - old environment segment - 2377 000003B1 7506 jne short no_free - 2378 - 2379 000003B3 8EC5 mov es,bp - 2380 000003B5 B449 mov ah,49h - 2381 ;mov ah,DEALLOC - 2382 000003B7 CD21 int 21h ; Free it - 2383 no_free: - 2384 - 2385 ; M004; Start of changes - 2386 - 2387 ; Move the transient now. We will allocate the biggest block available - 2388 ; now and move the transient to the top of the block. We will then - 2389 ; deallocate this block. When the resident starts executing, it will - 2390 ; hopefully allocate this block again and find the transient intact. - 2391 - 2392 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2393 ; PCDOS 7.1 COMMAND.COM - 2394 %if 1 - 2395 000003B9 31DB xor bx,bx ; low memory first fit - 2396 000003BB B80158 mov ax,5801h - 2397 000003BE CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 2398 ; AL = function code: set allocation strategy - 2399 000003C0 31DB xor bx,bx ; remove UMBs from DOS memory chain - 2400 000003C2 B80358 mov ax,5803h ; set UMB link state - 2401 000003C5 CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 2402 ; AL = function code: (DOS 5beta) set UMB link state - 2403 %endif - 2404 000003C7 C606[9102]01 mov byte [TrnMvFlg],1 ; Indicate that transient has been moved - 2405 000003CC 06 push es - 2406 ;;mov si,offset ResGroup:TranStart - 2407 ; 09/01/2023 - 2408 ;;mov si,2320h ; MSDOS 5.0 COMMAND.COM RESGROUP:03ABh - 2409 ; 05/06/2023 - 2410 ;mov si,26E0h ; MSDOS 6.22 COMMAND.COM RESGROUP:0475h - 2411 ; 19/07/2024 - 2412 ;mov si,2890h ; PCDOS 7.1 COMMAND.COM RESGROUP:04DDh - 2413 000003CD BED027 mov si,TRANSTART ; (End of the resident portion) - 2414 ;mov di,0 - 2415 000003D0 31FF xor di,di ; 0 - 2416 ;;mov cx,offset TranGroup:TranSpaceEnd ; size to move - 2417 ;mov cx,98C5h - 2418 ; 05/06/2023 - MSDOS 6.22 COMMAND.COM RESGROUP:047Bh - 2419 ;mov cx,0AF95h ; TRANSIENT portion size - 2420 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 2421 ;mov cx,0AA9Ah - 2422 000003D2 B90BA6 mov cx,TRANSPACEEND - 2423 - 2424 ; Find the largest block available - 2425 - 2426 000003D5 BBFFFF mov bx,0FFFFh - 2427 000003D8 B448 mov ah,48h - 2428 ;mov ah,ALLOC - 2429 000003DA CD21 int 21h - 2430 - 2431 ; dx = size of transient saved previously - 2432 - 2433 000003DC 39D3 cmp bx,dx ; enough memory? - 2434 000003DE 722B jb short nomem_err ; not enough memory for transient + 2377 ; !!!! ; 15/08/2024 + 2378 ;jne short no_free ; MSDOS 5.0 COMMAND.COM - RESGROUP:039Dh + 2379 ; PCDOS 7.1 COMMAND.COM - RESGROUP:04C0h + 2380 000003B1 7406 je short no_free ; MSDOS 6.22 COMMAND.COM - RESGROUP:0467h + 2381 + 2382 000003B3 8EC5 mov es,bp + 2383 000003B5 B449 mov ah,49h + 2384 ;mov ah,DEALLOC + 2385 000003B7 CD21 int 21h ; Free it + 2386 no_free: + 2387 + 2388 ; M004; Start of changes + 2389 + 2390 ; Move the transient now. We will allocate the biggest block available + 2391 ; now and move the transient to the top of the block. We will then + 2392 ; deallocate this block. When the resident starts executing, it will + 2393 ; hopefully allocate this block again and find the transient intact. + 2394 + 2395 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2396 ; PCDOS 7.1 COMMAND.COM + 2397 %if 1 + 2398 000003B9 31DB xor bx,bx ; low memory first fit + 2399 000003BB B80158 mov ax,5801h + 2400 000003BE CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 2401 ; AL = function code: set allocation strategy + 2402 000003C0 31DB xor bx,bx ; remove UMBs from DOS memory chain + 2403 000003C2 B80358 mov ax,5803h ; set UMB link state + 2404 000003C5 CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 2405 ; AL = function code: (DOS 5beta) set UMB link state + 2406 %endif + 2407 000003C7 C606[9102]01 mov byte [TrnMvFlg],1 ; Indicate that transient has been moved + 2408 000003CC 06 push es + 2409 ;;mov si,offset ResGroup:TranStart + 2410 ; 09/01/2023 + 2411 ;;mov si,2320h ; MSDOS 5.0 COMMAND.COM RESGROUP:03ABh + 2412 ; 05/06/2023 + 2413 ;mov si,26E0h ; MSDOS 6.22 COMMAND.COM RESGROUP:0475h + 2414 ; 19/07/2024 + 2415 ;mov si,2890h ; PCDOS 7.1 COMMAND.COM RESGROUP:04DDh + 2416 000003CD BED027 mov si,TRANSTART ; (End of the resident portion) + 2417 ;mov di,0 + 2418 000003D0 31FF xor di,di ; 0 + 2419 ;;mov cx,offset TranGroup:TranSpaceEnd ; size to move + 2420 ;mov cx,98C5h + 2421 ; 05/06/2023 - MSDOS 6.22 COMMAND.COM RESGROUP:047Bh + 2422 ;mov cx,0AF95h ; TRANSIENT portion size + 2423 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 2424 ;mov cx,0AA9Ah + 2425 000003D2 B90BA6 mov cx,TRANSPACEEND + 2426 + 2427 ; Find the largest block available + 2428 + 2429 000003D5 BBFFFF mov bx,0FFFFh + 2430 000003D8 B448 mov ah,48h + 2431 ;mov ah,ALLOC + 2432 000003DA CD21 int 21h + 2433 + 2434 ; dx = size of transient saved previously 2435 - 2436 000003E0 B448 mov ah,48h - 2437 ;mov ah,ALLOC - 2438 000003E2 CD21 int 21h ; get the largest block - 2439 000003E4 7225 jc short nomem_err ; something is really screwed up - 2440 - 2441 000003E6 50 push ax ; save memory address - 2442 000003E7 01D8 add ax,bx ; ax = top of my memory block - 2443 000003E9 29D0 sub ax,dx ; less size of transient - 2444 000003EB A3[8F02] mov [TrnSeg],ax ; save transient segment - 2445 000003EE 8EC0 mov es,ax ; - 2446 000003F0 58 pop ax ; restore our seg addr - 2447 - 2448 ; Everything is set for a move. We need to move in the reverse direction to - 2449 ; make sure we dont overwrite ourselves while copying + 2436 000003DC 39D3 cmp bx,dx ; enough memory? + 2437 000003DE 722B jb short nomem_err ; not enough memory for transient + 2438 + 2439 000003E0 B448 mov ah,48h + 2440 ;mov ah,ALLOC + 2441 000003E2 CD21 int 21h ; get the largest block + 2442 000003E4 7225 jc short nomem_err ; something is really screwed up + 2443 + 2444 000003E6 50 push ax ; save memory address + 2445 000003E7 01D8 add ax,bx ; ax = top of my memory block + 2446 000003E9 29D0 sub ax,dx ; less size of transient + 2447 000003EB A3[8F02] mov [TrnSeg],ax ; save transient segment + 2448 000003EE 8EC0 mov es,ax ; + 2449 000003F0 58 pop ax ; restore our seg addr 2450 - 2451 000003F1 01CE add si,cx - 2452 000003F3 4E dec si - 2453 000003F4 01CF add di,cx - 2454 000003F6 4F dec di - 2455 000003F7 FD std - 2456 000003F8 F3A4 rep movsb - 2457 000003FA FC cld - 2458 - 2459 ; Now we have to free up this block so that resident can get hold of it - 2460 - 2461 000003FB 8EC0 mov es,ax - 2462 000003FD B449 mov ah,49h - 2463 ;mov ah,DEALLOC - 2464 000003FF CD21 int 21h ; release the memory block - 2465 - 2466 ; M004; End of changes - 2467 - 2468 ;mov InitFlag,FALSE ; indicate INIT is done - 2469 ; 09/01/2023 - 2470 00000401 C606[1203]00 mov byte [InitFlag],0 - 2471 - 2472 00000406 07 pop es - 2473 00000407 1F pop ds - 2474 ;assume ds:nothing - 2475 - 2476 ; Bugbug: did we need to save & restore seg reg's during EndInit? - 2477 - 2478 00000408 E9D5FC jmp LodCom_Trap ; allocate transient - 2479 - 2480 nomem_err: - 2481 - 2482 ;We call the error routine which will never return. It will either exit - 2483 ;with an error ( if not the first COMMAND ) or just hang after an error - 2484 ;message ( if first COMMAND ) - 2485 - 2486 0000040B E9B21B jmp Alloc_error - 2487 - 2488 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2489 ; --------------------------------------- - 2490 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0520h - 2491 %if 1 - 2492 COMMAND_HIGH: - 2493 0000040E 00 db 0 ; load high status of COMMAND.COM (/H switch) - 2494 %endif - 2495 ; --------------------------------------- - 2496 - 2497 ;EndCodeInit: ; label byte ; M004 - 2498 - 2499 ; 16/04/2023 - 2500 EndCodeInit equ $ + 2451 ; Everything is set for a move. We need to move in the reverse direction to + 2452 ; make sure we dont overwrite ourselves while copying + 2453 + 2454 000003F1 01CE add si,cx + 2455 000003F3 4E dec si + 2456 000003F4 01CF add di,cx + 2457 000003F6 4F dec di + 2458 000003F7 FD std + 2459 000003F8 F3A4 rep movsb + 2460 000003FA FC cld + 2461 + 2462 ; Now we have to free up this block so that resident can get hold of it + 2463 + 2464 000003FB 8EC0 mov es,ax + 2465 000003FD B449 mov ah,49h + 2466 ;mov ah,DEALLOC + 2467 000003FF CD21 int 21h ; release the memory block + 2468 + 2469 ; M004; End of changes + 2470 + 2471 ;mov InitFlag,FALSE ; indicate INIT is done + 2472 ; 09/01/2023 + 2473 00000401 C606[1203]00 mov byte [InitFlag],0 + 2474 + 2475 00000406 07 pop es + 2476 00000407 1F pop ds + 2477 ;assume ds:nothing + 2478 + 2479 ; Bugbug: did we need to save & restore seg reg's during EndInit? + 2480 + 2481 00000408 E9D5FC jmp LodCom_Trap ; allocate transient + 2482 + 2483 nomem_err: + 2484 + 2485 ;We call the error routine which will never return. It will either exit + 2486 ;with an error ( if not the first COMMAND ) or just hang after an error + 2487 ;message ( if first COMMAND ) + 2488 + 2489 0000040B E9B21B jmp Alloc_error + 2490 + 2491 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2492 ; --------------------------------------- + 2493 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0520h + 2494 %if 1 + 2495 COMMAND_HIGH: + 2496 0000040E 00 db 0 ; load high status of COMMAND.COM (/H switch) + 2497 %endif + 2498 ; --------------------------------------- + 2499 + 2500 ;EndCodeInit: ; label byte ; M004 2501 - 2502 ;; M004; Check if the EndInit code will fit into the Pipe buffers above. - 2503 ;; M004; If not, we signal an assembly error - 2504 ; - 2505 ;IF2 - 2506 ; IF ($ GT EndPipe) - 2507 ; .err - 2508 ; %out "ENDINIT CODE TOO BIG" - 2509 ; ENDIF - 2510 ;ENDIF - 2511 - 2512 ;; M004; Set the origin back to what it was at the end of the buffers - 2513 ;; - 2514 ; ORG EndPipe ; M004 - 2515 - 2516 ; 09/01/2023 - 2517 ; MSDOS 5.0 COMMAND.COM - CODERES:03EDh - 2518 ; 05/06/2023 - 2519 ; MSDOS 6.22 COMMAND.COM - CODERES:04B7h - 2520 ; times 84 db 0 ; db (EndPipe-EndCodeInit) dup(0) - 2521 - 2522 ; 16/04/2023 - 2523 FillBytes equ EndPipe - EndCodeInit + 2502 ; 16/04/2023 + 2503 EndCodeInit equ $ + 2504 + 2505 ;; M004; Check if the EndInit code will fit into the Pipe buffers above. + 2506 ;; M004; If not, we signal an assembly error + 2507 ; + 2508 ;IF2 + 2509 ; IF ($ GT EndPipe) + 2510 ; .err + 2511 ; %out "ENDINIT CODE TOO BIG" + 2512 ; ENDIF + 2513 ;ENDIF + 2514 + 2515 ;; M004; Set the origin back to what it was at the end of the buffers + 2516 ;; + 2517 ; ORG EndPipe ; M004 + 2518 + 2519 ; 09/01/2023 + 2520 ; MSDOS 5.0 COMMAND.COM - CODERES:03EDh + 2521 ; 05/06/2023 + 2522 ; MSDOS 6.22 COMMAND.COM - CODERES:04B7h + 2523 ; times 84 db 0 ; db (EndPipe-EndCodeInit) dup(0) 2524 - 2525 ;%if EndCodeInit0 - 2528 ;times EndPipe - EndCodeInit db 0 - 2529 0000040F 00 times FillBytes db 0 - 2530 %endif - 2531 - 2532 ; 09/01/2023 - Retrodos v4.0 (& v4.1) - 2533 ; MSDOS 5.0 COMMAND.COM - CODERES:0441h ; EndInit+289 + 2525 ; 16/04/2023 + 2526 FillBytes equ EndPipe - EndCodeInit + 2527 + 2528 ;%if EndCodeInit0 + 2531 ;times EndPipe - EndCodeInit db 0 + 2532 0000040F 00 times FillBytes db 0 + 2533 %endif 2534 - 2535 ; 05/06/2023 - Retrodos v4.2 - 2536 ; MSDOS 6.22 COMMAND.COM - CODERES:050Bh ; EndInit+289 + 2535 ; 09/01/2023 - Retrodos v4.0 (& v4.1) + 2536 ; MSDOS 5.0 COMMAND.COM - CODERES:0441h ; EndInit+289 2537 - 2538 ; 19/07/2024 - Retrodos v5.0 COMMAND.COM - 2539 ; PCDOS 7.1 COMMAND.COM - CODERES:053Fh ; EndInit+289 + 2538 ; 05/06/2023 - Retrodos v4.2 + 2539 ; MSDOS 6.22 COMMAND.COM - CODERES:050Bh ; EndInit+289 2540 - 2541 ;InPipePtr dw offset DATARES:Pipe1 ; 320h - 2542 ;OutPipePtr dw offset DATARES:Pipe2 ; 36Fh + 2541 ; 19/07/2024 - Retrodos v5.0 COMMAND.COM + 2542 ; PCDOS 7.1 COMMAND.COM - CODERES:053Fh ; EndInit+289 2543 - 2544 00000436 [1503] InPipePtr: dw Pipe1 ;; 320h for MSDOS 5.0 COMMAND.COM - 2545 ; 3EAh for MSDOS 6.22 COMMAND.COM - 2546 ; 19/07/2024 ; 41Eh for PCDOS 7.1 COMMAND.COM - 2547 00000438 [6403] OutPipePtr: dw Pipe2 ;; 36Fh for MSDOS 5.0 COMMAND.COM - 2548 ; 439h for MSDOS 6.22 COMMAND.COM - 2549 ; 19/07/2024 ; 46Dh for PCDOS 7.1 COMMAND.COM - 2550 - 2551 Exec_Block: ; label byte ; the data block for exec calls - 2552 0000043A 0000 EnvirSeg: dw 0 - 2553 Com_Ptr: ; label dword - 2554 0000043C 8000 dw 80h ; point at unformatted parameters - 2555 0000043E 0000 dw 0 - 2556 Com_Fcb1: ; label dword - 2557 00000440 5C00 dw 5Ch - 2558 00000442 0000 dw 0 - 2559 Com_Fcb2: ; label dword - 2560 00000444 6C00 dw 6Ch - 2561 00000446 0000 dw 0 - 2562 - 2563 ; variables passed to transient - 2564 TranVars: ; label byte - 2565 ;dw offset DATARES:HeadFix_Trap - 2566 00000448 [F400] dw HeadFix_Trap - 2567 0000044A 0000 MySeg: dw 0 ; put our own segment here - 2568 0000044C 0000 LTpa: dw 0 ; will store tpa segment here - 2569 0000044E 2F RSwitChar: db "/" - 2570 0000044F 5C RDirChar: db "\" - 2571 ;dw offset DATARES:Issue_Exec_Call - 2572 00000450 [E701] dw Issue_Exec_Call - 2573 00000452 0000 MySeg1: dw 0 - 2574 ;dw offset DATARES:RemCheck_Trap - 2575 00000454 [CC00] dw RemCheck_Trap - 2576 00000456 0000 MySeg2: dw 0 - 2577 - 2578 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2579 ; PCDOS 7.1 COMMAND.COM - 2580 %if 0 - 2581 ResTest: dw 0 - 2582 %endif - 2583 - 2584 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0561h - 2585 - 2586 00000458 0000 Res_Tpa: dw 0 ; original tpa (not rounded to 64k) - 2587 - 2588 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 2589 0000045A 0000 Y_Flag: dw 0 + 2544 ;InPipePtr dw offset DATARES:Pipe1 ; 320h + 2545 ;OutPipePtr dw offset DATARES:Pipe2 ; 36Fh + 2546 + 2547 00000436 [1503] InPipePtr: dw Pipe1 ;; 320h for MSDOS 5.0 COMMAND.COM + 2548 ; 3EAh for MSDOS 6.22 COMMAND.COM + 2549 ; 19/07/2024 ; 41Eh for PCDOS 7.1 COMMAND.COM + 2550 00000438 [6403] OutPipePtr: dw Pipe2 ;; 36Fh for MSDOS 5.0 COMMAND.COM + 2551 ; 439h for MSDOS 6.22 COMMAND.COM + 2552 ; 19/07/2024 ; 46Dh for PCDOS 7.1 COMMAND.COM + 2553 + 2554 Exec_Block: ; label byte ; the data block for exec calls + 2555 0000043A 0000 EnvirSeg: dw 0 + 2556 Com_Ptr: ; label dword + 2557 0000043C 8000 dw 80h ; point at unformatted parameters + 2558 0000043E 0000 dw 0 + 2559 Com_Fcb1: ; label dword + 2560 00000440 5C00 dw 5Ch + 2561 00000442 0000 dw 0 + 2562 Com_Fcb2: ; label dword + 2563 00000444 6C00 dw 6Ch + 2564 00000446 0000 dw 0 + 2565 + 2566 ; variables passed to transient + 2567 TranVars: ; label byte + 2568 ;dw offset DATARES:HeadFix_Trap + 2569 00000448 [F400] dw HeadFix_Trap + 2570 0000044A 0000 MySeg: dw 0 ; put our own segment here + 2571 0000044C 0000 LTpa: dw 0 ; will store tpa segment here + 2572 0000044E 2F RSwitChar: db "/" + 2573 0000044F 5C RDirChar: db "\" + 2574 ;dw offset DATARES:Issue_Exec_Call + 2575 00000450 [E701] dw Issue_Exec_Call + 2576 00000452 0000 MySeg1: dw 0 + 2577 ;dw offset DATARES:RemCheck_Trap + 2578 00000454 [CC00] dw RemCheck_Trap + 2579 00000456 0000 MySeg2: dw 0 + 2580 + 2581 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2582 ; PCDOS 7.1 COMMAND.COM + 2583 %if 0 + 2584 ResTest: dw 0 + 2585 %endif + 2586 + 2587 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0561h + 2588 + 2589 00000458 0000 Res_Tpa: dw 0 ; original tpa (not rounded to 64k) 2590 - 2591 TranVarEnd: ; label byte - 2592 - 2593 0000045C 0000 OldErrNo: dw 0 - 2594 - 2595 ;* NOTE: MsgBuffer and SafePathBuffer use the same memory. - 2596 ; MsgBuffer is only used while a command is being executed. - 2597 ; SafePathBuffer is no longer needed, since it is used for - 2598 ; unsuccessful program launches. - 2599 - 2600 MsgBuffer: ; label byte ; buffer for messages from disk - 2601 SafePathBuffer: ; label byte ; resident pathname for EXEC - 2602 ;Bugbug: Why so big a buffer? - 2603 ;db 64+3+13 dup (0) ; path + 'd:\' 'file.ext' + null - 2604 0000045E 00 times 64+3+13 db 0 - 2605 - 2606 LENMSGORPATHBUF equ $ - MsgBuffer - 2607 - 2608 000004AE 00000000 Int2fHandler: dd 0 ; address of next int 2f handler - 2609 000004B2 0000 ResMsgEnd: dw 0 ; holds offset of msg end (end of resident) + 2591 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 2592 0000045A 0000 Y_Flag: dw 0 + 2593 + 2594 TranVarEnd: ; label byte + 2595 + 2596 0000045C 0000 OldErrNo: dw 0 + 2597 + 2598 ;* NOTE: MsgBuffer and SafePathBuffer use the same memory. + 2599 ; MsgBuffer is only used while a command is being executed. + 2600 ; SafePathBuffer is no longer needed, since it is used for + 2601 ; unsuccessful program launches. + 2602 + 2603 MsgBuffer: ; label byte ; buffer for messages from disk + 2604 SafePathBuffer: ; label byte ; resident pathname for EXEC + 2605 ;Bugbug: Why so big a buffer? + 2606 ;db 64+3+13 dup (0) ; path + 'd:\' 'file.ext' + null + 2607 0000045E 00 times 64+3+13 db 0 + 2608 + 2609 LENMSGORPATHBUF equ $ - MsgBuffer 2610 - 2611 ;SR; - 2612 ; The three vars below have been added for a pure COMMAND.COM + 2611 000004AE 00000000 Int2fHandler: dd 0 ; address of next int 2f handler + 2612 000004B2 0000 ResMsgEnd: dw 0 ; holds offset of msg end (end of resident) 2613 - 2614 000004B4 0000 ResSize: dw 0 - 2615 - 2616 ;SR; - 2617 ; Moved the stack here from the code segment - 2618 ; - 2619 ; bugbug: Why this odd stack size? And what should stack size be? - 2620 - 2621 ;db (80h - 3) dup (?) - 2622 ;align 2 - 2623 ;times 124 db 0 - 2624 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - RESGROUP:05BFh - 2625 000004B6 00 times 120 db 0 - 2626 - 2627 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2628 align 2 - 2629 - 2630 ; MSDOS 5.0 COMMAND.COM - RESGROUP:053Eh (offset RStack) - 2631 ; 05/06/2023 - 2632 ; MSDOS 6.22 COMMAND.COM - RESGROUP:060Ah (offset RStack) - 2633 ; 19/07/2024 - 2634 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0637h (offset RStack) - 2635 - 2636 RStack: ; label word - 2637 0000052E 0000 OldDS: dw 0 ; keeps old ds value when jumping to - 2638 ; resident code segments - 2639 ;LoadHiFlg db 0 ; Flag set to 1 if UMB loading enabled ; M003 - 2640 - 2641 ; include highvar.inc ; Add variables for 6.0 loadhigh functionality - 2642 ; ------------------------------- + 2614 ;SR; + 2615 ; The three vars below have been added for a pure COMMAND.COM + 2616 + 2617 000004B4 0000 ResSize: dw 0 + 2618 + 2619 ;SR; + 2620 ; Moved the stack here from the code segment + 2621 ; + 2622 ; bugbug: Why this odd stack size? And what should stack size be? + 2623 + 2624 ;db (80h - 3) dup (?) + 2625 ;align 2 + 2626 ;times 124 db 0 + 2627 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - RESGROUP:05BFh + 2628 000004B6 00 times 120 db 0 + 2629 + 2630 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2631 align 2 + 2632 + 2633 ; MSDOS 5.0 COMMAND.COM - RESGROUP:053Eh (offset RStack) + 2634 ; 05/06/2023 + 2635 ; MSDOS 6.22 COMMAND.COM - RESGROUP:060Ah (offset RStack) + 2636 ; 19/07/2024 + 2637 ; PCDOS 7.1 COMMAND.COM - RESGROUP:0637h (offset RStack) + 2638 + 2639 RStack: ; label word + 2640 0000052E 0000 OldDS: dw 0 ; keeps old ds value when jumping to + 2641 ; resident code segments + 2642 ;LoadHiFlg db 0 ; Flag set to 1 if UMB loading enabled ; M003 2643 - 2644 ; fInHigh - Is set to 1 during HideUMBs(), and back to zero in UnHideUMBs(). - 2645 ; fUmbTiny - Is set to 1 if the user has specified /S on the command line. - 2646 ; SegLoad - Segment address for first UMB specified; set automatically. - 2647 ; UmbLoad - The load UMB number; for example, this is 3 if the user has - 2648 ; given a command-line like "/L:3,500;4" - 2649 ; UmbUsed - An array of characters, each of which is 1 iff the UMB - 2650 ; matching its index number was specified on the command-line; - 2651 ; for example, after "/L:3,500;4;7", UmbUsed[3], [4] and [7] - 2652 ; will be set to 1. All others will be set to 0. - 2653 ; UmbSize - An array of words, each of which is interpereted as a size - 2654 ; specified by the user for a UMB (in the above example, all - 2655 ; elements would be zero save UmbSize[3], which would be 500. - 2656 ; fm_umb - Set to the old UMB link-state (0x80 or 0x00) - 2657 ; fm_strat - Set to the old memory-allocation strategy (0$00000???) - 2658 ; fm_argc - Number of arguments received by ParseVar() (see ParseVar() - 2659 ; for details). - 2660 - 2661 ; - MSDOS 6.0 COMMAND.COM - - 2662 ;; To keep track of which UMBs were specified on the DH/LH command lines, and - 2663 ;; to keep track of the minimum sizes given for each, there're two arrays kept - 2664 ;; in { IO.SYS: sysinitseg / COMMAND.COM: DATARES }... each is MAXUMB elements - 2665 ;; big. 16 should be around 14 too many for most users, so there's no expected - 2666 ;; space problem (it's just such a nice round number, eh?). - 2667 - 2668 ; 05/06/2023 - 2669 MAXUMB equ 16 + 2644 ; include highvar.inc ; Add variables for 6.0 loadhigh functionality + 2645 ; ------------------------------- + 2646 + 2647 ; fInHigh - Is set to 1 during HideUMBs(), and back to zero in UnHideUMBs(). + 2648 ; fUmbTiny - Is set to 1 if the user has specified /S on the command line. + 2649 ; SegLoad - Segment address for first UMB specified; set automatically. + 2650 ; UmbLoad - The load UMB number; for example, this is 3 if the user has + 2651 ; given a command-line like "/L:3,500;4" + 2652 ; UmbUsed - An array of characters, each of which is 1 iff the UMB + 2653 ; matching its index number was specified on the command-line; + 2654 ; for example, after "/L:3,500;4;7", UmbUsed[3], [4] and [7] + 2655 ; will be set to 1. All others will be set to 0. + 2656 ; UmbSize - An array of words, each of which is interpereted as a size + 2657 ; specified by the user for a UMB (in the above example, all + 2658 ; elements would be zero save UmbSize[3], which would be 500. + 2659 ; fm_umb - Set to the old UMB link-state (0x80 or 0x00) + 2660 ; fm_strat - Set to the old memory-allocation strategy (0$00000???) + 2661 ; fm_argc - Number of arguments received by ParseVar() (see ParseVar() + 2662 ; for details). + 2663 + 2664 ; - MSDOS 6.0 COMMAND.COM - + 2665 ;; To keep track of which UMBs were specified on the DH/LH command lines, and + 2666 ;; to keep track of the minimum sizes given for each, there're two arrays kept + 2667 ;; in { IO.SYS: sysinitseg / COMMAND.COM: DATARES }... each is MAXUMB elements + 2668 ;; big. 16 should be around 14 too many for most users, so there's no expected + 2669 ;; space problem (it's just such a nice round number, eh?). 2670 - 2671 ; 10/01/2023 - Retro DOS v4.0 COMMAND.COM - 2672 ; MSDOS 5.0 COMMAND.COM RESGROUP:0540h (DATARES:0540h) + 2671 ; 05/06/2023 + 2672 MAXUMB equ 16 2673 - 2674 00000530 00 fInHigh: db 0 - 2675 - 2676 ; MSDOS 6.0 COMMAND.COM - 2677 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 2678 ; MSDOS 6.22 COMMAND.COM RESGROUP:060Dh (DATARES:060Dh) - 2679 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2680 ; PCDOS 7.1 COMMAND.COM - RESGROUP:063Ah (DATARES:063Ah) - 2681 - 2682 00000531 00 fUmbTiny: db 0 - 2683 00000532 0000 SegLoad: dw 0 - 2684 00000534 00 UmbLoad: db 0 - 2685 - 2686 ; 19/07/2024 - 2687 ; PCDOS 7.1 COMMAND.COM - 2688 %if 0 - 2689 UmbUsed: times MAXUMB db 0 ; db MAXUMB dup (?) - 2690 UmbSize: times MAXUMB dw 0 ; dw MAXUMB dup (?) - 2691 %else - 2692 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2693 UmbUsed equ MsgBuffer ; 16 bytes - 2694 UmbSize equ UmbUsed+MAXUMB ; UmbUsed+16; 16 words - 2695 %endif - 2696 - 2697 00000535 00 fm_umb: db 0 - 2698 00000536 00 fm_strat: db 0 - 2699 00000537 00 fm_argc: db 0 - 2700 - 2701 ; UmbLoad is set to UNSPECIFED, below, until /L:umb is read; at which point - 2702 ; UmbLoad is set to the UMB number given. + 2674 ; 10/01/2023 - Retro DOS v4.0 COMMAND.COM + 2675 ; MSDOS 5.0 COMMAND.COM RESGROUP:0540h (DATARES:0540h) + 2676 + 2677 00000530 00 fInHigh: db 0 + 2678 + 2679 ; MSDOS 6.0 COMMAND.COM + 2680 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 2681 ; MSDOS 6.22 COMMAND.COM RESGROUP:060Dh (DATARES:060Dh) + 2682 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2683 ; PCDOS 7.1 COMMAND.COM - RESGROUP:063Ah (DATARES:063Ah) + 2684 + 2685 00000531 00 fUmbTiny: db 0 + 2686 00000532 0000 SegLoad: dw 0 + 2687 00000534 00 UmbLoad: db 0 + 2688 + 2689 ; 19/07/2024 + 2690 ; PCDOS 7.1 COMMAND.COM + 2691 %if 0 + 2692 UmbUsed: times MAXUMB db 0 ; db MAXUMB dup (?) + 2693 UmbSize: times MAXUMB dw 0 ; dw MAXUMB dup (?) + 2694 %else + 2695 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2696 UmbUsed equ MsgBuffer ; 16 bytes + 2697 UmbSize equ UmbUsed+MAXUMB ; UmbUsed+16; 16 words + 2698 %endif + 2699 + 2700 00000535 00 fm_umb: db 0 + 2701 00000536 00 fm_strat: db 0 + 2702 00000537 00 fm_argc: db 0 2703 - 2704 ;*** MESSAGES - 2705 ; and other translatable text + 2704 ; UmbLoad is set to UNSPECIFED, below, until /L:umb is read; at which point + 2705 ; UmbLoad is set to the UMB number given. 2706 - 2707 ; include comrmsg.inc ; M00 - 2708 ; ------------------------------ + 2707 ;*** MESSAGES + 2708 ; and other translatable text 2709 - 2710 ; 10/01/2023 - Retro DOS v4.0 COMMAND.COM - 2711 ; MSDOS 5.0 COMMAND.COM RESGROUP:0541h (DATARES:0541h) + 2710 ; include comrmsg.inc ; M00 + 2711 ; ------------------------------ 2712 - 2713 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 2714 ; MSDOS 6.22 COMMAND.COM RESGROUP:0644h (DATARES:0644h) + 2713 ; 10/01/2023 - Retro DOS v4.0 COMMAND.COM + 2714 ; MSDOS 5.0 COMMAND.COM RESGROUP:0541h (DATARES:0541h) 2715 - 2716 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 2717 ; PCDOS 7.1 COMMAND.COM RESGROUP:0641h (DATARES:0641h) + 2716 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 2717 ; MSDOS 6.22 COMMAND.COM RESGROUP:0644h (DATARES:0644h) 2718 - 2719 00000538 41 ABORT_CHAR: db 'A' - 2720 00000539 52 RETRY_CHAR: db 'R' - 2721 0000053A 49 IGNORE_CHAR: db 'I' - 2722 0000053B 46 FAIL_CHAR: db 'F' - 2723 0000053C 59 YES_CHAR: db 'Y' - 2724 0000053D 4E NO_CHAR: db 'N' - 2725 0000053E 05 REQ_ABORT: db 5 - 2726 0000053F 41626F7274 db 'Abort' - 2727 00000544 07 REQ_RETRY: db 7 - 2728 00000545 2C205265747279 db ', Retry' - 2729 0000054C 08 REQ_IGNORE: db 8 - 2730 0000054D 2C2049676E6F7265 db ', Ignore' - 2731 00000555 06 REQ_FAIL: db 6 - 2732 00000556 2C204661696C db ', Fail' - 2733 0000055C 01 REQ_END: db 1 - 2734 0000055D 3F db '?' - 2735 0000055E 08 MREAD: db 8 - 2736 0000055F 72656164696E6700 db 'reading', 0 - 2737 00000567 08 MWRITE: db 8 - 2738 00000568 77726974696E6700 db 'writing', 0 - 2739 00000570 0E MDRIVE: db 14 - 2740 00000571 202531206472697665- db ' %1 drive %2',0Dh,0Ah - 2740 0000057A 2025320D0A - 2741 0000057F 0F MDEVICE: db 15 - 2742 00000580 202531206465766963- db ' %1 device %2',0Dh,0Ah - 2742 00000589 652025320D0A - 2743 0000058F 26 MVOLSERIAL: db 38 - 2744 00000590 506C6561736520696E- db 'Please insert volume %1 serial %2-%3',0Dh,0Ah - 2744 00000599 7365727420766F6C75- - 2744 000005A2 6D6520253120736572- - 2744 000005AB 69616C2025322D2533- - 2744 000005B4 0D0A - 2745 000005B6 25 BADFATMSG: db 37 - 2746 000005B7 46696C6520616C6C6F- db 'File allocation table bad, drive %1',0Dh,0Ah - 2746 000005C0 636174696F6E207461- - 2746 000005C9 626C65206261642C20- - 2746 000005D2 64726976652025310D- - 2746 000005DB 0A - 2747 000005DC 15 COMBAD: db 21 - 2748 000005DD 496E76616C69642043- db 'Invalid COMMAND.COM',0Dh,0Ah - 2748 000005E6 4F4D4D414E442E434F- - 2748 000005EF 4D0D0A - 2749 000005F2 21 PUTBACKMSG: db 33 - 2750 000005F3 496E73657274206469- db 'Insert disk with %1 in drive %2',0Dh,0Ah - 2750 000005FC 736B20776974682025- - 2750 00000605 3120696E2064726976- - 2750 0000060E 652025320D0A - 2751 00000614 21 PROMPT: db 33 - 2752 00000615 507265737320616E79- db 'Press any key to continue . . .',0Dh,0Ah - 2752 0000061E 206B657920746F2063- - 2752 00000627 6F6E74696E7565202E- - 2752 00000630 202E202E0D0A - 2753 00000636 1C ENDBATMES: db 28 - 2754 00000637 0D0A db 0Dh,0Ah - 2755 00000639 5465726D696E617465- db 'Terminate batch job (Y/N)?' - 2755 00000642 206261746368206A6F- - 2755 0000064B 622028592F4E293F - 2756 00000653 13 EXECEMES: db 19 - 2757 00000654 43616E6E6F74206578- db 'Cannot execute %1',0Dh,0Ah - 2757 0000065D 65637574652025310D- - 2757 00000666 0A - 2758 00000667 13 EXEBAD: db 19 - 2759 00000668 4572726F7220696E20- db 'Error in EXE file',0Dh,0Ah - 2759 00000671 4558452066696C650D- - 2759 0000067A 0A - 2760 0000067B 22 TOOBIG: db 34 - 2761 0000067C 50726F6772616D2074- db 'Program too big to fit in memory',0Dh,0Ah - 2761 00000685 6F6F2062696720746F- - 2761 0000068E 2066697420696E206D- - 2761 00000697 656D6F72790D0A - 2762 0000069E 16 NOHANDMES: db 22 - 2763 0000069F 0D0A db 0Dh,0Ah - 2764 000006A1 4E6F20667265652066- db 'No free file handles' - 2764 000006AA 696C652068616E646C- - 2764 000006B3 6573 - 2765 000006B5 1A RBADNAM: db 26 - 2766 000006B6 42616420436F6D6D61- db 'Bad Command or file name',0Dh,0Ah - 2766 000006BF 6E64206F722066696C- - 2766 000006C8 65206E616D650D0A - 2767 ACCDENIED: ; 14/01/2023 - 2768 ; 10/01/2023 - 2769 ACCDEN: ;db 14 - 2770 ;db 'Access denied ' - 2771 ; 19/07/2024 - PCDOS 7.1 - 2772 000006D0 0D db 13 - 2773 000006D1 416363657373206465- db 'Access denied' - 2773 000006DA 6E696564 - 2774 000006DE 19 BMEMMES: db 25 - 2775 000006DF 0D0A4D656D6F727920- db 0Dh,0Ah,'Memory allocation error' - 2775 000006E8 616C6C6F636174696F- - 2775 000006F1 6E206572726F72 - 2776 000006F8 26 HALTMES: db 38 - 2777 000006F9 0D0A db 0Dh,0Ah - 2778 000006FB 43616E6E6F74206C6F- db 'Cannot load COMMAND, system halted',0Dh,0Ah - 2778 00000704 616420434F4D4D414E- - 2778 0000070D 442C2073797374656D- - 2778 00000716 2068616C7465640D0A - 2779 0000071F 21 FRETMES: db 33 - 2780 00000720 0D0A db 0Dh,0Ah, - 2781 00000722 43616E6E6F74207374- db 'Cannot start COMMAND, exiting',0Dh,0Ah - 2781 0000072B 61727420434F4D4D41- - 2781 00000734 4E442C206578697469- - 2781 0000073D 6E670D0A - 2782 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 2783 %if 0 - 2784 ;%if 1 ; 20/07/2024 - Retro DOS v5.1 COMMAND.COM - 2785 PATRICIDE: db 46 - 2786 db 0Dh,0Ah - 2787 db 'Top level process aborted, cannot continue' - 2788 db 0Dh,0Ah - 2789 %endif - 2790 00000741 02 NEWLINE: db 2 - 2791 00000742 0D0A db 0Dh, 0Ah - 2792 - 2793 ; 10/01/2023 - 2794 ;; MSDOS 5.0 COMMAND.COM RESGROUP:077Dh - 2795 ; 05/06/2023 - 2796 ; MSDOS 6.22 COMMAND.COM RESGROUP:0880h - 2797 - 2798 ; 19/07/2024 - 2799 ; PCDOS 7.1 COMMAND.COM RESGROUP:0832h + 2719 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 2720 ; PCDOS 7.1 COMMAND.COM RESGROUP:0641h (DATARES:0641h) + 2721 + 2722 00000538 41 ABORT_CHAR: db 'A' + 2723 00000539 52 RETRY_CHAR: db 'R' + 2724 0000053A 49 IGNORE_CHAR: db 'I' + 2725 0000053B 46 FAIL_CHAR: db 'F' + 2726 0000053C 59 YES_CHAR: db 'Y' + 2727 0000053D 4E NO_CHAR: db 'N' + 2728 0000053E 05 REQ_ABORT: db 5 + 2729 0000053F 41626F7274 db 'Abort' + 2730 00000544 07 REQ_RETRY: db 7 + 2731 00000545 2C205265747279 db ', Retry' + 2732 0000054C 08 REQ_IGNORE: db 8 + 2733 0000054D 2C2049676E6F7265 db ', Ignore' + 2734 00000555 06 REQ_FAIL: db 6 + 2735 00000556 2C204661696C db ', Fail' + 2736 0000055C 01 REQ_END: db 1 + 2737 0000055D 3F db '?' + 2738 0000055E 08 MREAD: db 8 + 2739 0000055F 72656164696E6700 db 'reading', 0 + 2740 00000567 08 MWRITE: db 8 + 2741 00000568 77726974696E6700 db 'writing', 0 + 2742 00000570 0E MDRIVE: db 14 + 2743 00000571 202531206472697665- db ' %1 drive %2',0Dh,0Ah + 2743 0000057A 2025320D0A + 2744 0000057F 0F MDEVICE: db 15 + 2745 00000580 202531206465766963- db ' %1 device %2',0Dh,0Ah + 2745 00000589 652025320D0A + 2746 0000058F 26 MVOLSERIAL: db 38 + 2747 00000590 506C6561736520696E- db 'Please insert volume %1 serial %2-%3',0Dh,0Ah + 2747 00000599 7365727420766F6C75- + 2747 000005A2 6D6520253120736572- + 2747 000005AB 69616C2025322D2533- + 2747 000005B4 0D0A + 2748 000005B6 25 BADFATMSG: db 37 + 2749 000005B7 46696C6520616C6C6F- db 'File allocation table bad, drive %1',0Dh,0Ah + 2749 000005C0 636174696F6E207461- + 2749 000005C9 626C65206261642C20- + 2749 000005D2 64726976652025310D- + 2749 000005DB 0A + 2750 000005DC 15 COMBAD: db 21 + 2751 000005DD 496E76616C69642043- db 'Invalid COMMAND.COM',0Dh,0Ah + 2751 000005E6 4F4D4D414E442E434F- + 2751 000005EF 4D0D0A + 2752 000005F2 21 PUTBACKMSG: db 33 + 2753 000005F3 496E73657274206469- db 'Insert disk with %1 in drive %2',0Dh,0Ah + 2753 000005FC 736B20776974682025- + 2753 00000605 3120696E2064726976- + 2753 0000060E 652025320D0A + 2754 00000614 21 PROMPT: db 33 + 2755 00000615 507265737320616E79- db 'Press any key to continue . . .',0Dh,0Ah + 2755 0000061E 206B657920746F2063- + 2755 00000627 6F6E74696E7565202E- + 2755 00000630 202E202E0D0A + 2756 00000636 1C ENDBATMES: db 28 + 2757 00000637 0D0A db 0Dh,0Ah + 2758 00000639 5465726D696E617465- db 'Terminate batch job (Y/N)?' + 2758 00000642 206261746368206A6F- + 2758 0000064B 622028592F4E293F + 2759 00000653 13 EXECEMES: db 19 + 2760 00000654 43616E6E6F74206578- db 'Cannot execute %1',0Dh,0Ah + 2760 0000065D 65637574652025310D- + 2760 00000666 0A + 2761 00000667 13 EXEBAD: db 19 + 2762 00000668 4572726F7220696E20- db 'Error in EXE file',0Dh,0Ah + 2762 00000671 4558452066696C650D- + 2762 0000067A 0A + 2763 0000067B 22 TOOBIG: db 34 + 2764 0000067C 50726F6772616D2074- db 'Program too big to fit in memory',0Dh,0Ah + 2764 00000685 6F6F2062696720746F- + 2764 0000068E 2066697420696E206D- + 2764 00000697 656D6F72790D0A + 2765 0000069E 16 NOHANDMES: db 22 + 2766 0000069F 0D0A db 0Dh,0Ah + 2767 000006A1 4E6F20667265652066- db 'No free file handles' + 2767 000006AA 696C652068616E646C- + 2767 000006B3 6573 + 2768 000006B5 1A RBADNAM: db 26 + 2769 000006B6 42616420436F6D6D61- db 'Bad Command or file name',0Dh,0Ah + 2769 000006BF 6E64206F722066696C- + 2769 000006C8 65206E616D650D0A + 2770 ACCDENIED: ; 14/01/2023 + 2771 ; 10/01/2023 + 2772 ACCDEN: ;db 14 + 2773 ;db 'Access denied ' + 2774 ; 19/07/2024 - PCDOS 7.1 + 2775 000006D0 0D db 13 + 2776 000006D1 416363657373206465- db 'Access denied' + 2776 000006DA 6E696564 + 2777 000006DE 19 BMEMMES: db 25 + 2778 000006DF 0D0A4D656D6F727920- db 0Dh,0Ah,'Memory allocation error' + 2778 000006E8 616C6C6F636174696F- + 2778 000006F1 6E206572726F72 + 2779 000006F8 26 HALTMES: db 38 + 2780 000006F9 0D0A db 0Dh,0Ah + 2781 000006FB 43616E6E6F74206C6F- db 'Cannot load COMMAND, system halted',0Dh,0Ah + 2781 00000704 616420434F4D4D414E- + 2781 0000070D 442C2073797374656D- + 2781 00000716 2068616C7465640D0A + 2782 0000071F 21 FRETMES: db 33 + 2783 00000720 0D0A db 0Dh,0Ah, + 2784 00000722 43616E6E6F74207374- db 'Cannot start COMMAND, exiting',0Dh,0Ah + 2784 0000072B 61727420434F4D4D41- + 2784 00000734 4E442C206578697469- + 2784 0000073D 6E670D0A + 2785 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 2786 %if 0 + 2787 ;%if 1 ; 20/07/2024 - Retro DOS v5.1 COMMAND.COM + 2788 PATRICIDE: db 46 + 2789 db 0Dh,0Ah + 2790 db 'Top level process aborted, cannot continue' + 2791 db 0Dh,0Ah + 2792 %endif + 2793 00000741 02 NEWLINE: db 2 + 2794 00000742 0D0A db 0Dh, 0Ah + 2795 + 2796 ; 10/01/2023 + 2797 ;; MSDOS 5.0 COMMAND.COM RESGROUP:077Dh + 2798 ; 05/06/2023 + 2799 ; MSDOS 6.22 COMMAND.COM RESGROUP:0880h 2800 - 2801 00000744 [280C] MsgPtrLists: dw EXTMSGPTRS ; extended error messages - 2802 00000746 0100 dw 1 - 2803 00000748 [E309] dw PARSMSGPTRS ; parse error messages - 2804 0000074A 0100 dw 1 - 2805 0000074C [280C] dw EXTMSGPTRS ; critical error messages - 2806 0000074E 0100 dw 1 - 2807 00000750 0000 dw 0 ; File system error messages - 2808 00000752 0000 dw 0 ; are not supported. - 2809 00000754 [EA00] dw MsgRetrv_Trap ; disk retriever routine - 2810 00000756 0000 MySeg3: dw 0 ; segment of retriever routine - 2811 - 2812 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0791h - 2813 ; 05/06/2023 - 2814 ; MSDOS 6.22 COMMAND.COM RESGROUP:0894h - 2815 - 2816 ; 19/07/2024 - 2817 ; PCDOS 7.1 COMMAND.COM RESGROUP:0846h + 2801 ; 19/07/2024 + 2802 ; PCDOS 7.1 COMMAND.COM RESGROUP:0832h + 2803 + 2804 00000744 [280C] MsgPtrLists: dw EXTMSGPTRS ; extended error messages + 2805 00000746 0100 dw 1 + 2806 00000748 [E309] dw PARSMSGPTRS ; parse error messages + 2807 0000074A 0100 dw 1 + 2808 0000074C [280C] dw EXTMSGPTRS ; critical error messages + 2809 0000074E 0100 dw 1 + 2810 00000750 0000 dw 0 ; File system error messages + 2811 00000752 0000 dw 0 ; are not supported. + 2812 00000754 [EA00] dw MsgRetrv_Trap ; disk retriever routine + 2813 00000756 0000 MySeg3: dw 0 ; segment of retriever routine + 2814 + 2815 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0791h + 2816 ; 05/06/2023 + 2817 ; MSDOS 6.22 COMMAND.COM RESGROUP:0894h 2818 - 2819 00000758 13 CRMSG0: db 19 - 2820 00000759 57726974652070726F- db 'Write protect error' - 2820 00000762 74656374206572726F- - 2820 0000076B 72 - 2821 0000076C 0C CRMSG1: db 12 - 2822 0000076D 496E76616C69642075- db 'Invalid unit' - 2822 00000776 6E6974 - 2823 00000779 09 CRMSG2: db 9 - 2824 0000077A 4E6F74207265616479 db 'Not ready' - 2825 00000783 16 CRMSG3: db 22 - 2826 00000784 496E76616C69642064- db 'Invalid device request' - 2826 0000078D 657669636520726571- - 2826 00000796 75657374 - 2827 0000079A 0A CRMSG4: db 10 - 2828 0000079B 44617461206572726F- db 'Data error' - 2828 000007A4 72 - 2829 000007A5 21 CRMSG5: db 33 - 2830 000007A6 496E76616C69642064- db 'Invalid device request parameters' - 2830 000007AF 657669636520726571- - 2830 000007B8 756573742070617261- - 2830 000007C1 6D6574657273 - 2831 000007C7 0A CRMSG6: db 10 - 2832 000007C8 5365656B206572726F- db 'Seek error' - 2832 000007D1 72 - 2833 000007D2 12 CRMSG7: db 18 - 2834 000007D3 496E76616C6964206D- db 'Invalid media type' - 2834 000007DC 656469612074797065 - 2835 000007E5 10 CRMSG8: db 16 - 2836 000007E6 536563746F72206E6F- db 'Sector not found' - 2836 000007EF 7420666F756E64 - 2837 000007F6 1A CRMSG9: db 26 - 2838 000007F7 5072696E746572206F- db 'Printer out of paper error' - 2838 00000800 7574206F6620706170- - 2838 00000809 6572206572726F72 - 2839 00000811 11 CRMSG10: db 17 - 2840 00000812 577269746520666175- db 'Write fault error' - 2840 0000081B 6C74206572726F72 - 2841 00000823 10 CRMSG11: db 16 - 2842 00000824 52656164206661756C- db 'Read fault error' - 2842 0000082D 74206572726F72 - 2843 00000834 0F CRMSG12: db 15 - 2844 00000835 47656E6572616C2066- db 'General failure' - 2844 0000083E 61696C757265 - 2845 00000844 11 CRMSG13: db 17 - 2846 00000845 53686172696E672076- db 'Sharing violation' - 2846 0000084E 696F6C6174696F6E - 2847 00000856 0E CRMSG14: db 14 - 2848 00000857 4C6F636B2076696F6C- db 'Lock violation' - 2848 00000860 6174696F6E - 2849 00000865 13 CRMSG15: db 19 - 2850 00000866 496E76616C69642064- db 'Invalid disk change' - 2850 0000086F 69736B206368616E67- - 2850 00000878 65 - 2851 00000879 0F CRMSG16: db 15 - 2852 0000087A 46434220756E617661- db 'FCB unavailable' - 2852 00000883 696C61626C65 - 2853 00000889 19 CRMSG17: db 25 - 2854 0000088A 53797374656D207265- db 'System resource exhausted' - 2854 00000893 736F75726365206578- - 2854 0000089C 68617573746564 - 2855 000008A3 12 CRMSG18: db 18 - 2856 000008A4 436F64652070616765- db 'Code page mismatch' - 2856 000008AD 206D69736D61746368 - 2857 000008B6 0C CRMSG19: db 12 - 2858 000008B7 4F7574206F6620696E- db 'Out of input' - 2858 000008C0 707574 - 2859 000008C3 17 CRMSG20: db 23 - 2860 000008C4 496E73756666696369- db 'Insufficient disk space' - 2860 000008CD 656E74206469736B20- - 2860 000008D6 7370616365 - 2861 - 2862 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0914h - 2863 ; 05/06/2023 - 2864 ; MSDOS 6.22 COMMAND.COM RESGROUP:0A17h - 2865 - 2866 ; 19/07/2024 - 2867 ; PCDOS 7.1 COMMAND.COM RESGROUP:09C9h + 2819 ; 19/07/2024 + 2820 ; PCDOS 7.1 COMMAND.COM RESGROUP:0846h + 2821 + 2822 00000758 13 CRMSG0: db 19 + 2823 00000759 57726974652070726F- db 'Write protect error' + 2823 00000762 74656374206572726F- + 2823 0000076B 72 + 2824 0000076C 0C CRMSG1: db 12 + 2825 0000076D 496E76616C69642075- db 'Invalid unit' + 2825 00000776 6E6974 + 2826 00000779 09 CRMSG2: db 9 + 2827 0000077A 4E6F74207265616479 db 'Not ready' + 2828 00000783 16 CRMSG3: db 22 + 2829 00000784 496E76616C69642064- db 'Invalid device request' + 2829 0000078D 657669636520726571- + 2829 00000796 75657374 + 2830 0000079A 0A CRMSG4: db 10 + 2831 0000079B 44617461206572726F- db 'Data error' + 2831 000007A4 72 + 2832 000007A5 21 CRMSG5: db 33 + 2833 000007A6 496E76616C69642064- db 'Invalid device request parameters' + 2833 000007AF 657669636520726571- + 2833 000007B8 756573742070617261- + 2833 000007C1 6D6574657273 + 2834 000007C7 0A CRMSG6: db 10 + 2835 000007C8 5365656B206572726F- db 'Seek error' + 2835 000007D1 72 + 2836 000007D2 12 CRMSG7: db 18 + 2837 000007D3 496E76616C6964206D- db 'Invalid media type' + 2837 000007DC 656469612074797065 + 2838 000007E5 10 CRMSG8: db 16 + 2839 000007E6 536563746F72206E6F- db 'Sector not found' + 2839 000007EF 7420666F756E64 + 2840 000007F6 1A CRMSG9: db 26 + 2841 000007F7 5072696E746572206F- db 'Printer out of paper error' + 2841 00000800 7574206F6620706170- + 2841 00000809 6572206572726F72 + 2842 00000811 11 CRMSG10: db 17 + 2843 00000812 577269746520666175- db 'Write fault error' + 2843 0000081B 6C74206572726F72 + 2844 00000823 10 CRMSG11: db 16 + 2845 00000824 52656164206661756C- db 'Read fault error' + 2845 0000082D 74206572726F72 + 2846 00000834 0F CRMSG12: db 15 + 2847 00000835 47656E6572616C2066- db 'General failure' + 2847 0000083E 61696C757265 + 2848 00000844 11 CRMSG13: db 17 + 2849 00000845 53686172696E672076- db 'Sharing violation' + 2849 0000084E 696F6C6174696F6E + 2850 00000856 0E CRMSG14: db 14 + 2851 00000857 4C6F636B2076696F6C- db 'Lock violation' + 2851 00000860 6174696F6E + 2852 00000865 13 CRMSG15: db 19 + 2853 00000866 496E76616C69642064- db 'Invalid disk change' + 2853 0000086F 69736B206368616E67- + 2853 00000878 65 + 2854 00000879 0F CRMSG16: db 15 + 2855 0000087A 46434220756E617661- db 'FCB unavailable' + 2855 00000883 696C61626C65 + 2856 00000889 19 CRMSG17: db 25 + 2857 0000088A 53797374656D207265- db 'System resource exhausted' + 2857 00000893 736F75726365206578- + 2857 0000089C 68617573746564 + 2858 000008A3 12 CRMSG18: db 18 + 2859 000008A4 436F64652070616765- db 'Code page mismatch' + 2859 000008AD 206D69736D61746368 + 2860 000008B6 0C CRMSG19: db 12 + 2861 000008B7 4F7574206F6620696E- db 'Out of input' + 2861 000008C0 707574 + 2862 000008C3 17 CRMSG20: db 23 + 2863 000008C4 496E73756666696369- db 'Insufficient disk space' + 2863 000008CD 656E74206469736B20- + 2863 000008D6 7370616365 + 2864 + 2865 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0914h + 2866 ; 05/06/2023 + 2867 ; MSDOS 6.22 COMMAND.COM RESGROUP:0A17h 2868 - 2869 000008DB [5807] CRITMSGPTRS: dw CRMSG0 - 2870 000008DD [6C07] dw CRMSG1 - 2871 000008DF [7907] dw CRMSG2 - 2872 000008E1 [8307] dw CRMSG3 - 2873 000008E3 [9A07] dw CRMSG4 - 2874 000008E5 [A507] dw CRMSG5 - 2875 000008E7 [C707] dw CRMSG6 - 2876 000008E9 [D207] dw CRMSG7 - 2877 000008EB [E507] dw CRMSG8 - 2878 000008ED [F607] dw CRMSG9 - 2879 000008EF [1108] dw CRMSG10 - 2880 000008F1 [2308] dw CRMSG11 - 2881 000008F3 [3408] dw CRMSG12 - 2882 000008F5 [4408] dw CRMSG13 - 2883 000008F7 [5608] dw CRMSG14 - 2884 000008F9 [6508] dw CRMSG15 - 2885 000008FB [7908] dw CRMSG16 - 2886 000008FD [8908] dw CRMSG17 - 2887 000008FF [A308] dw CRMSG18 - 2888 00000901 [B608] dw CRMSG19 - 2889 00000903 [C308] dw CRMSG20 - 2890 - 2891 ; 14/01/2023 - 2892 ;DataresEnd: ;; MSDOS 5.0 COMMAND.COM - DATARES:093Eh (RESGROUP:093Eh) - 2893 ; 05/06/2023 - 2894 DataresEnd: ; MSDOS 6.22 COMMAND.COM - DATARES:0A41h (RESGROUP:0A41h) - 2895 - 2896 00000905 13 PAERRMSG0: db 19 - 2897 00000906 546F6F206D616E7920- db 'Too many parameters' - 2897 0000090F 706172616D65746572- - 2897 00000918 73 - 2898 00000919 1A PAERRMSG1: db 26 - 2899 0000091A 526571756972656420- db 'Required parameter missing' - 2899 00000923 706172616D65746572- - 2899 0000092C 206D697373696E67 - 2900 00000934 0E PAERRMSG2: db 14 - 2901 00000935 496E76616C69642073- db 'Invalid switch' - 2901 0000093E 7769746368 - 2902 00000943 0F PAERRMSG3: db 15 - 2903 00000944 496E76616C6964206B- db 'Invalid keyword' - 2903 0000094D 6579776F7264 - 2904 00000953 01 PAERRMSG4: db 1 - 2905 00000954 20 db 20h - 2906 00000955 24 PAERRMSG5: db 36 - 2907 00000956 506172616D65746572- db 'Parameter value not in allowed range' - 2907 0000095F 2076616C7565206E6F- - 2907 00000968 7420696E20616C6C6F- - 2907 00000971 7765642072616E6765 - 2908 PAERRMSG6: ; 10/01/2023 - 2909 0000097A 1B PAERRMSG7: db 27 - 2910 0000097B 506172616D65746572- db 'Parameter value not allowed' - 2910 00000984 2076616C7565206E6F- - 2910 0000098D 7420616C6C6F776564 - 2911 ;PAERRMSG7: db 27 - 2912 ; db 'Parameter value not allowed' - 2913 00000996 1C PAERRMSG8: db 28 - 2914 00000997 506172616D65746572- db 'Parameter format not correct' - 2914 000009A0 20666F726D6174206E- - 2914 000009A9 6F7420636F72726563- - 2914 000009B2 74 - 2915 000009B3 11 PAERRMSG9: db 17 - 2916 000009B4 496E76616C69642070- db 'Invalid parameter' - 2916 000009BD 6172616D65746572 - 2917 000009C5 1D PAERRMSG10: db 29 - 2918 000009C6 496E76616C69642070- db 'Invalid parameter combination' - 2918 000009CF 6172616D6574657220- - 2918 000009D8 636F6D62696E617469- - 2918 000009E1 6F6E - 2919 - 2920 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0A38h - 2921 ; 05/06/2023 - 2922 ; MSDOS 6.22 COMMAND.COM RESGROUP:0B3Bh - 2923 - 2924 ; 19/07/2024 - 2925 ; PCDOS 7.1 COMMAND.COM RESGROUP:0AD1h + 2869 ; 19/07/2024 + 2870 ; PCDOS 7.1 COMMAND.COM RESGROUP:09C9h + 2871 + 2872 000008DB [5807] CRITMSGPTRS: dw CRMSG0 + 2873 000008DD [6C07] dw CRMSG1 + 2874 000008DF [7907] dw CRMSG2 + 2875 000008E1 [8307] dw CRMSG3 + 2876 000008E3 [9A07] dw CRMSG4 + 2877 000008E5 [A507] dw CRMSG5 + 2878 000008E7 [C707] dw CRMSG6 + 2879 000008E9 [D207] dw CRMSG7 + 2880 000008EB [E507] dw CRMSG8 + 2881 000008ED [F607] dw CRMSG9 + 2882 000008EF [1108] dw CRMSG10 + 2883 000008F1 [2308] dw CRMSG11 + 2884 000008F3 [3408] dw CRMSG12 + 2885 000008F5 [4408] dw CRMSG13 + 2886 000008F7 [5608] dw CRMSG14 + 2887 000008F9 [6508] dw CRMSG15 + 2888 000008FB [7908] dw CRMSG16 + 2889 000008FD [8908] dw CRMSG17 + 2890 000008FF [A308] dw CRMSG18 + 2891 00000901 [B608] dw CRMSG19 + 2892 00000903 [C308] dw CRMSG20 + 2893 + 2894 ; 14/01/2023 + 2895 ;DataresEnd: ;; MSDOS 5.0 COMMAND.COM - DATARES:093Eh (RESGROUP:093Eh) + 2896 ; 05/06/2023 + 2897 DataresEnd: ; MSDOS 6.22 COMMAND.COM - DATARES:0A41h (RESGROUP:0A41h) + 2898 + 2899 00000905 13 PAERRMSG0: db 19 + 2900 00000906 546F6F206D616E7920- db 'Too many parameters' + 2900 0000090F 706172616D65746572- + 2900 00000918 73 + 2901 00000919 1A PAERRMSG1: db 26 + 2902 0000091A 526571756972656420- db 'Required parameter missing' + 2902 00000923 706172616D65746572- + 2902 0000092C 206D697373696E67 + 2903 00000934 0E PAERRMSG2: db 14 + 2904 00000935 496E76616C69642073- db 'Invalid switch' + 2904 0000093E 7769746368 + 2905 00000943 0F PAERRMSG3: db 15 + 2906 00000944 496E76616C6964206B- db 'Invalid keyword' + 2906 0000094D 6579776F7264 + 2907 00000953 01 PAERRMSG4: db 1 + 2908 00000954 20 db 20h + 2909 00000955 24 PAERRMSG5: db 36 + 2910 00000956 506172616D65746572- db 'Parameter value not in allowed range' + 2910 0000095F 2076616C7565206E6F- + 2910 00000968 7420696E20616C6C6F- + 2910 00000971 7765642072616E6765 + 2911 PAERRMSG6: ; 10/01/2023 + 2912 0000097A 1B PAERRMSG7: db 27 + 2913 0000097B 506172616D65746572- db 'Parameter value not allowed' + 2913 00000984 2076616C7565206E6F- + 2913 0000098D 7420616C6C6F776564 + 2914 ;PAERRMSG7: db 27 + 2915 ; db 'Parameter value not allowed' + 2916 00000996 1C PAERRMSG8: db 28 + 2917 00000997 506172616D65746572- db 'Parameter format not correct' + 2917 000009A0 20666F726D6174206E- + 2917 000009A9 6F7420636F72726563- + 2917 000009B2 74 + 2918 000009B3 11 PAERRMSG9: db 17 + 2919 000009B4 496E76616C69642070- db 'Invalid parameter' + 2919 000009BD 6172616D65746572 + 2920 000009C5 1D PAERRMSG10: db 29 + 2921 000009C6 496E76616C69642070- db 'Invalid parameter combination' + 2921 000009CF 6172616D6574657220- + 2921 000009D8 636F6D62696E617469- + 2921 000009E1 6F6E + 2922 + 2923 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0A38h + 2924 ; 05/06/2023 + 2925 ; MSDOS 6.22 COMMAND.COM RESGROUP:0B3Bh 2926 - 2927 000009E3 [0509] PARSMSGPTRS: dw PAERRMSG0 - 2928 000009E5 [1909] dw PAERRMSG1 - 2929 000009E7 [3409] dw PAERRMSG2 - 2930 000009E9 [4309] dw PAERRMSG3 - 2931 000009EB [5309] dw PAERRMSG4 - 2932 000009ED [5509] dw PAERRMSG5 - 2933 000009EF [7A09] dw PAERRMSG6 - 2934 000009F1 [7A09] dw PAERRMSG7 - 2935 000009F3 [9609] dw PAERRMSG8 - 2936 000009F5 [B309] dw PAERRMSG9 - 2937 000009F7 [C509] dw PAERRMSG10 - 2938 ; 21/04/2023 - 2939 NUMPARSMSGS equ ($-PARSMSGPTRS)>>1 ; 14/01/2023 - 2940 - 2941 000009F9 10 INVLFUNCT: db 16 - 2942 000009FA 496E76616C69642066- db 'Invalid function' - 2942 00000A03 756E6374696F6E - 2943 00000A0A 0E FNOTFOUND: db 14 - 2944 00000A0B 46696C65206E6F7420- db 'File not found' - 2944 00000A14 666F756E64 - 2945 00000A19 0E PNOTFOUND: db 14 - 2946 00000A1A 50617468206E6F7420- db 'Path not found' - 2946 00000A23 666F756E64 - 2947 00000A28 13 TOOMANYOF: db 19 - 2948 00000A29 546F6F206D616E7920- db 'Too many open files' - 2948 00000A32 6F70656E2066696C65- - 2948 00000A3B 73 - 2949 ; 14/01/2023 - 2950 ;ACCDEN: ; 10/01/2023 - 2951 ;ACCDENIED: db 14 - 2952 ; db 'Access denied ' - 2953 00000A3C 0E INVHANDLE: db 14 - 2954 00000A3D 496E76616C69642068- db 'Invalid handle' - 2954 00000A46 616E646C65 - 2955 00000A4B 1F MEMCBDEST: db 31 - 2956 00000A4C 4D656D6F727920636F- db 'Memory control blocks destroyed' - 2956 00000A55 6E74726F6C20626C6F- - 2956 00000A5E 636B73206465737472- - 2956 00000A67 6F796564 - 2957 00000A6B 13 INSUFFMEM: db 19 - 2958 00000A6C 496E73756666696369- db 'Insufficient memory' - 2958 00000A75 656E74206D656D6F72- - 2958 00000A7E 79 - 2959 00000A7F 1C INVMEMBLA: db 28 - 2960 00000A80 496E76616C6964206D- db 'Invalid memory block address' - 2960 00000A89 656D6F727920626C6F- - 2960 00000A92 636B20616464726573- - 2960 00000A9B 73 - 2961 00000A9C 13 INVENVIRO: db 19 - 2962 00000A9D 496E76616C69642045- db 'Invalid Environment' - 2962 00000AA6 6E7669726F6E6D656E- - 2962 00000AAF 74 - 2963 00000AB0 0E INVFORMAT: db 14 - 2964 00000AB1 496E76616C69642066- db 'Invalid format' - 2964 00000ABA 6F726D6174 - 2965 00000ABF 1A INVFNPARM: db 26 - 2966 00000AC0 496E76616C69642066- db 'Invalid function parameter' - 2966 00000AC9 756E6374696F6E2070- - 2966 00000AD2 6172616D65746572 - 2967 00000ADA 0C INVLDDATA: db 12 - 2968 00000ADB 496E76616C69642064- db 'Invalid data' - 2968 00000AE4 617461 - 2969 00000AE7 1B INVDRVSPC: db 27 - 2970 00000AE8 496E76616C69642064- db 'Invalid drive specification' - 2970 00000AF1 726976652073706563- - 2970 00000AFA 696669636174696F6E - 2971 00000B03 23 ATRCURDIR: db 35 - 2972 00000B04 417474656D70742074- db 'Attempt to remove current directory' - 2972 00000B0D 6F2072656D6F766520- - 2972 00000B16 63757272656E742064- - 2972 00000B1F 69726563746F7279 - 2973 00000B27 0F NOTSAMDEV: db 15 - 2974 00000B28 4E6F742073616D6520- db 'Not same device' - 2974 00000B31 646576696365 - 2975 00000B37 0D NOMOREFIL: db 13 - 2976 00000B38 4E6F206D6F72652066- db 'No more files' - 2976 00000B41 696C6573 - 2977 00000B45 0B FILEXISTS: db 11 - 2978 00000B46 46696C652065786973- db 'File exists' - 2978 00000B4F 7473 - 2979 00000B51 1B CANTMKDIR: db 27 - 2980 00000B52 43616E6E6F74206D61- db 'Cannot make directory entry' - 2980 00000B5B 6B6520646972656374- - 2980 00000B64 6F727920656E747279 - 2981 00000B6D 0E FAILINT24: db 14 - 2982 00000B6E 4661696C206F6E2049- db 'Fail on INT 24' - 2982 00000B77 4E54203234 - 2983 00000B7C 15 TOOMANYRD: db 21 - 2984 00000B7D 546F6F206D616E7920- db 'Too many redirections' - 2984 00000B86 726564697265637469- - 2984 00000B8F 6F6E73 - 2985 00000B92 15 DUPLREDIR: db 21 - 2986 00000B93 4475706C6963617465- db 'Duplicate redirection' - 2986 00000B9C 207265646972656374- - 2986 00000BA5 696F6E - 2987 00000BA8 10 INVPASSWD: db 16 - 2988 00000BA9 496E76616C69642070- db 'Invalid password' - 2988 00000BB2 617373776F7264 - 2989 00000BB9 11 INVLDPARM: db 17 - 2990 00000BBA 496E76616C69642070- db 'Invalid parameter' - 2990 00000BC3 6172616D65746572 - 2991 00000BCB 12 NETDATFAU: db 18 - 2992 00000BCC 4E6574776F726B2064- db 'Network data fault' - 2992 00000BD5 617461206661756C74 - 2993 00000BDE 21 FNOSUPNET: db 33 - 2994 00000BDF 46756E6374696F6E20- db 'Function not supported by network' - 2994 00000BE8 6E6F7420737570706F- - 2994 00000BF1 72746564206279206E- - 2994 00000BFA 6574776F726B - 2995 00000C00 27 RSCNOTINS: db 39 - 2996 00000C01 526571756972656420- db 'Required system component not installed' - 2996 00000C0A 73797374656D20636F- - 2996 00000C13 6D706F6E656E74206E- - 2996 00000C1C 6F7420696E7374616C- - 2996 00000C25 6C6564 - 2997 - 2998 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0C8Ch - 2999 ; 05/06/2023 - 3000 ; MSDOS 6.22 COMMAND.COM RESGROUP:0D8Fh - 3001 - 3002 ; 19/07/2024 - 3003 ; PCDOS 7.1 COMMAND.COM RESGROUP:0D24h + 2927 ; 19/07/2024 + 2928 ; PCDOS 7.1 COMMAND.COM RESGROUP:0AD1h + 2929 + 2930 000009E3 [0509] PARSMSGPTRS: dw PAERRMSG0 + 2931 000009E5 [1909] dw PAERRMSG1 + 2932 000009E7 [3409] dw PAERRMSG2 + 2933 000009E9 [4309] dw PAERRMSG3 + 2934 000009EB [5309] dw PAERRMSG4 + 2935 000009ED [5509] dw PAERRMSG5 + 2936 000009EF [7A09] dw PAERRMSG6 + 2937 000009F1 [7A09] dw PAERRMSG7 + 2938 000009F3 [9609] dw PAERRMSG8 + 2939 000009F5 [B309] dw PAERRMSG9 + 2940 000009F7 [C509] dw PAERRMSG10 + 2941 ; 21/04/2023 + 2942 NUMPARSMSGS equ ($-PARSMSGPTRS)>>1 ; 14/01/2023 + 2943 + 2944 000009F9 10 INVLFUNCT: db 16 + 2945 000009FA 496E76616C69642066- db 'Invalid function' + 2945 00000A03 756E6374696F6E + 2946 00000A0A 0E FNOTFOUND: db 14 + 2947 00000A0B 46696C65206E6F7420- db 'File not found' + 2947 00000A14 666F756E64 + 2948 00000A19 0E PNOTFOUND: db 14 + 2949 00000A1A 50617468206E6F7420- db 'Path not found' + 2949 00000A23 666F756E64 + 2950 00000A28 13 TOOMANYOF: db 19 + 2951 00000A29 546F6F206D616E7920- db 'Too many open files' + 2951 00000A32 6F70656E2066696C65- + 2951 00000A3B 73 + 2952 ; 14/01/2023 + 2953 ;ACCDEN: ; 10/01/2023 + 2954 ;ACCDENIED: db 14 + 2955 ; db 'Access denied ' + 2956 00000A3C 0E INVHANDLE: db 14 + 2957 00000A3D 496E76616C69642068- db 'Invalid handle' + 2957 00000A46 616E646C65 + 2958 00000A4B 1F MEMCBDEST: db 31 + 2959 00000A4C 4D656D6F727920636F- db 'Memory control blocks destroyed' + 2959 00000A55 6E74726F6C20626C6F- + 2959 00000A5E 636B73206465737472- + 2959 00000A67 6F796564 + 2960 00000A6B 13 INSUFFMEM: db 19 + 2961 00000A6C 496E73756666696369- db 'Insufficient memory' + 2961 00000A75 656E74206D656D6F72- + 2961 00000A7E 79 + 2962 00000A7F 1C INVMEMBLA: db 28 + 2963 00000A80 496E76616C6964206D- db 'Invalid memory block address' + 2963 00000A89 656D6F727920626C6F- + 2963 00000A92 636B20616464726573- + 2963 00000A9B 73 + 2964 00000A9C 13 INVENVIRO: db 19 + 2965 00000A9D 496E76616C69642045- db 'Invalid Environment' + 2965 00000AA6 6E7669726F6E6D656E- + 2965 00000AAF 74 + 2966 00000AB0 0E INVFORMAT: db 14 + 2967 00000AB1 496E76616C69642066- db 'Invalid format' + 2967 00000ABA 6F726D6174 + 2968 00000ABF 1A INVFNPARM: db 26 + 2969 00000AC0 496E76616C69642066- db 'Invalid function parameter' + 2969 00000AC9 756E6374696F6E2070- + 2969 00000AD2 6172616D65746572 + 2970 00000ADA 0C INVLDDATA: db 12 + 2971 00000ADB 496E76616C69642064- db 'Invalid data' + 2971 00000AE4 617461 + 2972 00000AE7 1B INVDRVSPC: db 27 + 2973 00000AE8 496E76616C69642064- db 'Invalid drive specification' + 2973 00000AF1 726976652073706563- + 2973 00000AFA 696669636174696F6E + 2974 00000B03 23 ATRCURDIR: db 35 + 2975 00000B04 417474656D70742074- db 'Attempt to remove current directory' + 2975 00000B0D 6F2072656D6F766520- + 2975 00000B16 63757272656E742064- + 2975 00000B1F 69726563746F7279 + 2976 00000B27 0F NOTSAMDEV: db 15 + 2977 00000B28 4E6F742073616D6520- db 'Not same device' + 2977 00000B31 646576696365 + 2978 00000B37 0D NOMOREFIL: db 13 + 2979 00000B38 4E6F206D6F72652066- db 'No more files' + 2979 00000B41 696C6573 + 2980 00000B45 0B FILEXISTS: db 11 + 2981 00000B46 46696C652065786973- db 'File exists' + 2981 00000B4F 7473 + 2982 00000B51 1B CANTMKDIR: db 27 + 2983 00000B52 43616E6E6F74206D61- db 'Cannot make directory entry' + 2983 00000B5B 6B6520646972656374- + 2983 00000B64 6F727920656E747279 + 2984 00000B6D 0E FAILINT24: db 14 + 2985 00000B6E 4661696C206F6E2049- db 'Fail on INT 24' + 2985 00000B77 4E54203234 + 2986 00000B7C 15 TOOMANYRD: db 21 + 2987 00000B7D 546F6F206D616E7920- db 'Too many redirections' + 2987 00000B86 726564697265637469- + 2987 00000B8F 6F6E73 + 2988 00000B92 15 DUPLREDIR: db 21 + 2989 00000B93 4475706C6963617465- db 'Duplicate redirection' + 2989 00000B9C 207265646972656374- + 2989 00000BA5 696F6E + 2990 00000BA8 10 INVPASSWD: db 16 + 2991 00000BA9 496E76616C69642070- db 'Invalid password' + 2991 00000BB2 617373776F7264 + 2992 00000BB9 11 INVLDPARM: db 17 + 2993 00000BBA 496E76616C69642070- db 'Invalid parameter' + 2993 00000BC3 6172616D65746572 + 2994 00000BCB 12 NETDATFAU: db 18 + 2995 00000BCC 4E6574776F726B2064- db 'Network data fault' + 2995 00000BD5 617461206661756C74 + 2996 00000BDE 21 FNOSUPNET: db 33 + 2997 00000BDF 46756E6374696F6E20- db 'Function not supported by network' + 2997 00000BE8 6E6F7420737570706F- + 2997 00000BF1 72746564206279206E- + 2997 00000BFA 6574776F726B + 2998 00000C00 27 RSCNOTINS: db 39 + 2999 00000C01 526571756972656420- db 'Required system component not installed' + 2999 00000C0A 73797374656D20636F- + 2999 00000C13 6D706F6E656E74206E- + 2999 00000C1C 6F7420696E7374616C- + 2999 00000C25 6C6564 + 3000 + 3001 ;; MSDOS 5.0 COMMAND.COM RESGROUP:0C8Ch + 3002 ; 05/06/2023 + 3003 ; MSDOS 6.22 COMMAND.COM RESGROUP:0D8Fh 3004 - 3005 00000C28 [F909] EXTMSGPTRS: dw INVLFUNCT - 3006 00000C2A [0A0A] dw FNOTFOUND - 3007 00000C2C [190A] dw PNOTFOUND - 3008 00000C2E [280A] dw TOOMANYOF - 3009 00000C30 [D006] dw ACCDENIED - 3010 00000C32 [3C0A] dw INVHANDLE - 3011 00000C34 [4B0A] dw MEMCBDEST - 3012 00000C36 [6B0A] dw INSUFFMEM - 3013 00000C38 [7F0A] dw INVMEMBLA - 3014 00000C3A [9C0A] dw INVENVIRO - 3015 00000C3C [B00A] dw INVFORMAT - 3016 00000C3E [BF0A] dw INVFNPARM - 3017 00000C40 [DA0A] dw INVLDDATA - 3018 00000C42 0000 dw 0 - 3019 00000C44 [E70A] dw INVDRVSPC - 3020 00000C46 [030B] dw ATRCURDIR - 3021 00000C48 [270B] dw NOTSAMDEV - 3022 00000C4A [370B] dw NOMOREFIL - 3023 00000C4C [5807] dw CRMSG0 - 3024 00000C4E [6C07] dw CRMSG1 - 3025 00000C50 [7907] dw CRMSG2 - 3026 00000C52 [8307] dw CRMSG3 - 3027 00000C54 [9A07] dw CRMSG4 - 3028 00000C56 [A507] dw CRMSG5 - 3029 00000C58 [C707] dw CRMSG6 - 3030 00000C5A [D207] dw CRMSG7 - 3031 00000C5C [E507] dw CRMSG8 - 3032 00000C5E [F607] dw CRMSG9 - 3033 00000C60 [1108] dw CRMSG10 - 3034 00000C62 [2308] dw CRMSG11 - 3035 00000C64 [3408] dw CRMSG12 - 3036 00000C66 [4408] dw CRMSG13 - 3037 00000C68 [5608] dw CRMSG14 - 3038 00000C6A [6508] dw CRMSG15 - 3039 00000C6C [7908] dw CRMSG16 - 3040 00000C6E [8908] dw CRMSG17 - 3041 00000C70 [A308] dw CRMSG18 - 3042 00000C72 [B608] dw CRMSG19 - 3043 00000C74 [C308] dw CRMSG20 - 3044 00000C76 0000 times 40 dw 0 ; db 80 dup(0) - 3045 00000CC6 [450B] dw FILEXISTS - 3046 00000CC8 0000 dw 0 - 3047 00000CCA [510B] dw CANTMKDIR - 3048 00000CCC [6D0B] dw FAILINT24 - 3049 00000CCE [7C0B] dw TOOMANYRD - 3050 00000CD0 [920B] dw DUPLREDIR - 3051 00000CD2 [A80B] dw INVPASSWD - 3052 00000CD4 [B90B] dw INVLDPARM - 3053 00000CD6 [CB0B] dw NETDATFAU - 3054 00000CD8 [DE0B] dw FNOSUPNET - 3055 00000CDA [000C] dw RSCNOTINS - 3056 ; ---------------------------------------------------------------------------- - 3057 ; 17/04/2023 - 3058 ExtMsgEnd: - 3059 - 3060 ; 21/04/2023 - 3061 NUMEXTMSGS equ ($-EXTMSGPTRS)>>1 ; 14/01/2023 + 3005 ; 19/07/2024 + 3006 ; PCDOS 7.1 COMMAND.COM RESGROUP:0D24h + 3007 + 3008 00000C28 [F909] EXTMSGPTRS: dw INVLFUNCT + 3009 00000C2A [0A0A] dw FNOTFOUND + 3010 00000C2C [190A] dw PNOTFOUND + 3011 00000C2E [280A] dw TOOMANYOF + 3012 00000C30 [D006] dw ACCDENIED + 3013 00000C32 [3C0A] dw INVHANDLE + 3014 00000C34 [4B0A] dw MEMCBDEST + 3015 00000C36 [6B0A] dw INSUFFMEM + 3016 00000C38 [7F0A] dw INVMEMBLA + 3017 00000C3A [9C0A] dw INVENVIRO + 3018 00000C3C [B00A] dw INVFORMAT + 3019 00000C3E [BF0A] dw INVFNPARM + 3020 00000C40 [DA0A] dw INVLDDATA + 3021 00000C42 0000 dw 0 + 3022 00000C44 [E70A] dw INVDRVSPC + 3023 00000C46 [030B] dw ATRCURDIR + 3024 00000C48 [270B] dw NOTSAMDEV + 3025 00000C4A [370B] dw NOMOREFIL + 3026 00000C4C [5807] dw CRMSG0 + 3027 00000C4E [6C07] dw CRMSG1 + 3028 00000C50 [7907] dw CRMSG2 + 3029 00000C52 [8307] dw CRMSG3 + 3030 00000C54 [9A07] dw CRMSG4 + 3031 00000C56 [A507] dw CRMSG5 + 3032 00000C58 [C707] dw CRMSG6 + 3033 00000C5A [D207] dw CRMSG7 + 3034 00000C5C [E507] dw CRMSG8 + 3035 00000C5E [F607] dw CRMSG9 + 3036 00000C60 [1108] dw CRMSG10 + 3037 00000C62 [2308] dw CRMSG11 + 3038 00000C64 [3408] dw CRMSG12 + 3039 00000C66 [4408] dw CRMSG13 + 3040 00000C68 [5608] dw CRMSG14 + 3041 00000C6A [6508] dw CRMSG15 + 3042 00000C6C [7908] dw CRMSG16 + 3043 00000C6E [8908] dw CRMSG17 + 3044 00000C70 [A308] dw CRMSG18 + 3045 00000C72 [B608] dw CRMSG19 + 3046 00000C74 [C308] dw CRMSG20 + 3047 00000C76 0000 times 40 dw 0 ; db 80 dup(0) + 3048 00000CC6 [450B] dw FILEXISTS + 3049 00000CC8 0000 dw 0 + 3050 00000CCA [510B] dw CANTMKDIR + 3051 00000CCC [6D0B] dw FAILINT24 + 3052 00000CCE [7C0B] dw TOOMANYRD + 3053 00000CD0 [920B] dw DUPLREDIR + 3054 00000CD2 [A80B] dw INVPASSWD + 3055 00000CD4 [B90B] dw INVLDPARM + 3056 00000CD6 [CB0B] dw NETDATFAU + 3057 00000CD8 [DE0B] dw FNOSUPNET + 3058 00000CDA [000C] dw RSCNOTINS + 3059 ; ---------------------------------------------------------------------------- + 3060 ; 17/04/2023 + 3061 ExtMsgEnd: 3062 - 3063 ; ---------------------------------------------------------------------------- - 3064 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 3065 %if 1 ; 20/07/2024 - 3066 00000CDC 2E PATRICIDE: db 46 - 3067 00000CDD 0D0A db 0Dh,0Ah - 3068 00000CDF 546F70206C6576656C- db 'Top level process aborted, cannot continue' - 3068 00000CE8 2070726F6365737320- - 3068 00000CF1 61626F727465642C20- - 3068 00000CFA 63616E6E6F7420636F- - 3068 00000D03 6E74696E7565 - 3069 00000D09 0D0A db 0Dh,0Ah - 3070 %endif - 3071 - 3072 ; ---------------------------------------------------------------------------- - 3073 - 3074 ; 20/04/2023 - 3075 - 3076 00000D0B 90 align 16 - 3077 - 3078 ; ---------------------------------------------------------------------------- - 3079 - 3080 ; 10/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 3081 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:0D40h (CODERES:0000h) - 3082 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 3083 ; MSDOS 6.22 COMMAND.COM - RESGROUP:0E50h (CODERES:0000h) - 3084 - 3085 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 3086 ; PCDOS 7.1 COMMAND.COM RESGROUP:0E10h (CODERES:0000h) + 3063 ; 21/04/2023 + 3064 NUMEXTMSGS equ ($-EXTMSGPTRS)>>1 ; 14/01/2023 + 3065 + 3066 ; ---------------------------------------------------------------------------- + 3067 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 3068 %if 1 ; 20/07/2024 + 3069 00000CDC 2E PATRICIDE: db 46 + 3070 00000CDD 0D0A db 0Dh,0Ah + 3071 00000CDF 546F70206C6576656C- db 'Top level process aborted, cannot continue' + 3071 00000CE8 2070726F6365737320- + 3071 00000CF1 61626F727465642C20- + 3071 00000CFA 63616E6E6F7420636F- + 3071 00000D03 6E74696E7565 + 3072 00000D09 0D0A db 0Dh,0Ah + 3073 %endif + 3074 + 3075 ; ---------------------------------------------------------------------------- + 3076 + 3077 ; 20/04/2023 + 3078 + 3079 00000D0B 90 align 16 + 3080 + 3081 ; ---------------------------------------------------------------------------- + 3082 + 3083 ; 10/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 3084 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:0D40h (CODERES:0000h) + 3085 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 3086 ; MSDOS 6.22 COMMAND.COM - RESGROUP:0E50h (CODERES:0000h) 3087 - 3088 ; ---------------------------------------------------------------------------- - 3089 ; SEGMENT - CODERES - 3090 ; ---------------------------------------------------------------------------- - 3091 - 3092 ; 11/01/2023 - 3093 RCODE_START: + 3088 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 3089 ; PCDOS 7.1 COMMAND.COM RESGROUP:0E10h (CODERES:0000h) + 3090 + 3091 ; ---------------------------------------------------------------------------- + 3092 ; SEGMENT - CODERES + 3093 ; ---------------------------------------------------------------------------- 3094 - 3095 ; ---------------------------------------------------------------------------- - 3096 ;*** EXEC error handling - 3097 ; - 3098 ; COMMAND has issued an EXEC system call and it has returned an error. - 3099 ; We examine the error code and select an appropriate message. - 3100 ; -------------------------- - 3101 ; Bugbug: optimize reg usage in following code? Careful of DX! - 3102 ; Condense the error scan? - 3103 ; RBADNAM is checked by transient, no need here? - 3104 ; Move below Ext_Exec. - 3105 ; ---------------------------------------------------------------------------- - 3106 - 3107 Exec_Err: - 3108 ;SR; - 3109 ; ds,es are setup when the transient jumps to Ext_Exec. So segment regs are - 3110 ; in order here - 3111 - 3112 ; Bugbug: can we use byte compares here? - 3113 ; Might be able to use byte msg#s, too. + 3095 ; 11/01/2023 + 3096 RCODE_START: + 3097 + 3098 ; ---------------------------------------------------------------------------- + 3099 ;*** EXEC error handling + 3100 ; + 3101 ; COMMAND has issued an EXEC system call and it has returned an error. + 3102 ; We examine the error code and select an appropriate message. + 3103 ; -------------------------- + 3104 ; Bugbug: optimize reg usage in following code? Careful of DX! + 3105 ; Condense the error scan? + 3106 ; RBADNAM is checked by transient, no need here? + 3107 ; Move below Ext_Exec. + 3108 ; ---------------------------------------------------------------------------- + 3109 + 3110 Exec_Err: + 3111 ;SR; + 3112 ; ds,es are setup when the transient jumps to Ext_Exec. So segment regs are + 3113 ; in order here 3114 - 3115 ; Store errors in a 3 or 4 byte table. Msg #s in another. - 3116 ; Speed not high priority here. + 3115 ; Bugbug: can we use byte compares here? + 3116 ; Might be able to use byte msg#s, too. 3117 - 3118 ; Move this to transient. - 3119 - 3120 ; 10/01/2023 - 3121 - 3122 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 3123 ;if 0 ; PCDOS 7.1 COMMAND.COM doesn't use 'RBADNAM' error msg here - 3124 %if 1 ; Retro DOS v5.0 COMMAND.COM (and MSDOS 6.22 COMMAND.COM) - 3125 ;mov bx,RBADNAM ; offset DATARES:RBadNam - 3126 00000D10 BA[B506] mov dx,RBADNAM - 3127 00000D13 3C02 cmp al,ERROR_FILE_NOT_FOUND ; 2 - 3128 00000D15 741B je short GotExecEMes ; bad command - 3129 %endif - 3130 ;mov bx,TOOBIG ; offset DATARES:TooBig - 3131 00000D17 BA[7B06] mov dx,TOOBIG - 3132 00000D1A 3C08 cmp al,ERROR_NOT_ENOUGH_MEMORY ; 8 - 3133 00000D1C 7414 je short GotExecEMes ; file not found - 3134 ;mov bx,EXEBAD ; offset DATARES:ExeBad - 3135 00000D1E BA[6706] mov dx,EXEBAD - 3136 00000D21 3C0B cmp al,ERROR_BAD_FORMAT ; 11 ; 0Bh - 3137 00000D23 740D je short GotExecEMes ; bad exe file - 3138 ;mov bx,ACCDEN ; offset DATARES:AccDen - 3139 00000D25 BA[D006] mov dx,ACCDEN - 3140 00000D28 3C05 cmp al,ERROR_ACCESS_DENIED ; 5 - 3141 00000D2A 7406 je short GotExecEMes ; access denied - 3142 - 3143 Default_Message: - 3144 ;mov bx,EXECEMES ; offset DATARES:ExecEMes - 3145 00000D2C BA[5306] mov dx,EXECEMES - 3146 ; default message - 3147 00000D2F BE[3002] mov si,ExecErrSubst ; offset DATARES:ExecErrSubst - 3148 ; get address of subst block - 3149 GotExecEMes: - 3150 ;mov dx,bx ; DX = ptr to msg - 3151 00000D32 E8A606 call RPrint ; invoke RPrint - 3152 00000D35 EB09 jmp short NoExec - 3153 - 3154 ; ---------------------------------------------------------------------------- - 3155 ;*** EXEC call - 3156 ; - 3157 ; The transient has set up everything for an EXEC system call. - 3158 ; For cleanliness, we issue the EXEC here in the resident - 3159 ; so that we may be able to recover cleanly upon success. - 3160 ; - 3161 ; CS,DS,ES,SS = DATARES seg addr - 3162 ; ---------------------------------------------------------------------------- - 3163 - 3164 Ext_Exec: - 3165 ;SR; - 3166 ; The words put on the stack by the stub will be popped off when we finally - 3167 ;jump to LodCom (by LodCom). - 3168 - 3169 ; 10/01/2023 - 3170 ;int 21h ; do the exec - 3171 ; 10/01/2023 - MSDOS 5.0 COMMAND.COM - RESGROUP:0D69h (CODERES:0029h) - 3172 Exec_Ret: - 3173 00000D37 72D7 jc short Exec_Err ; exec failed - 3174 - 3175 ; The exec has completed. Retrieve the exit code. - 3176 - 3177 Exec_Wait: - 3178 00000D39 B44D mov ah,4Dh - 3179 ;mov ah,WAITPROCESS ; 4Dh ; get errorlevel - 3180 00000D3B CD21 int 21h ; get the return code - 3181 ;mov [cs:RetCode],ax - 3182 ; 11/01/2023 - 3183 00000D3D A3[9A02] mov [RetCode],ax - 3184 - 3185 ; See if we can reload the transient. The external command - 3186 ; may have overwritten part of the transient. + 3118 ; Store errors in a 3 or 4 byte table. Msg #s in another. + 3119 ; Speed not high priority here. + 3120 + 3121 ; Move this to transient. + 3122 + 3123 ; 10/01/2023 + 3124 + 3125 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 3126 ;if 0 ; PCDOS 7.1 COMMAND.COM doesn't use 'RBADNAM' error msg here + 3127 %if 1 ; Retro DOS v5.0 COMMAND.COM (and MSDOS 6.22 COMMAND.COM) + 3128 ;mov bx,RBADNAM ; offset DATARES:RBadNam + 3129 00000D10 BA[B506] mov dx,RBADNAM + 3130 00000D13 3C02 cmp al,ERROR_FILE_NOT_FOUND ; 2 + 3131 00000D15 741B je short GotExecEMes ; bad command + 3132 %endif + 3133 ;mov bx,TOOBIG ; offset DATARES:TooBig + 3134 00000D17 BA[7B06] mov dx,TOOBIG + 3135 00000D1A 3C08 cmp al,ERROR_NOT_ENOUGH_MEMORY ; 8 + 3136 00000D1C 7414 je short GotExecEMes ; file not found + 3137 ;mov bx,EXEBAD ; offset DATARES:ExeBad + 3138 00000D1E BA[6706] mov dx,EXEBAD + 3139 00000D21 3C0B cmp al,ERROR_BAD_FORMAT ; 11 ; 0Bh + 3140 00000D23 740D je short GotExecEMes ; bad exe file + 3141 ;mov bx,ACCDEN ; offset DATARES:AccDen + 3142 00000D25 BA[D006] mov dx,ACCDEN + 3143 00000D28 3C05 cmp al,ERROR_ACCESS_DENIED ; 5 + 3144 00000D2A 7406 je short GotExecEMes ; access denied + 3145 + 3146 Default_Message: + 3147 ;mov bx,EXECEMES ; offset DATARES:ExecEMes + 3148 00000D2C BA[5306] mov dx,EXECEMES + 3149 ; default message + 3150 00000D2F BE[3002] mov si,ExecErrSubst ; offset DATARES:ExecErrSubst + 3151 ; get address of subst block + 3152 GotExecEMes: + 3153 ;mov dx,bx ; DX = ptr to msg + 3154 00000D32 E8A606 call RPrint ; invoke RPrint + 3155 00000D35 EB09 jmp short NoExec + 3156 + 3157 ; ---------------------------------------------------------------------------- + 3158 ;*** EXEC call + 3159 ; + 3160 ; The transient has set up everything for an EXEC system call. + 3161 ; For cleanliness, we issue the EXEC here in the resident + 3162 ; so that we may be able to recover cleanly upon success. + 3163 ; + 3164 ; CS,DS,ES,SS = DATARES seg addr + 3165 ; ---------------------------------------------------------------------------- + 3166 + 3167 Ext_Exec: + 3168 ;SR; + 3169 ; The words put on the stack by the stub will be popped off when we finally + 3170 ;jump to LodCom (by LodCom). + 3171 + 3172 ; 10/01/2023 + 3173 ;int 21h ; do the exec + 3174 ; 10/01/2023 - MSDOS 5.0 COMMAND.COM - RESGROUP:0D69h (CODERES:0029h) + 3175 Exec_Ret: + 3176 00000D37 72D7 jc short Exec_Err ; exec failed + 3177 + 3178 ; The exec has completed. Retrieve the exit code. + 3179 + 3180 Exec_Wait: + 3181 00000D39 B44D mov ah,4Dh + 3182 ;mov ah,WAITPROCESS ; 4Dh ; get errorlevel + 3183 00000D3B CD21 int 21h ; get the return code + 3184 ;mov [cs:RetCode],ax + 3185 ; 11/01/2023 + 3186 00000D3D A3[9A02] mov [RetCode],ax 3187 - 3188 NoExec: - 3189 ;SR; - 3190 ; ds = es = ss = DATARES when we jump to LodCom - 3191 ; - 3192 00000D40 E97A01 jmp LodCom - 3193 - 3194 ; ---------------------------------------------------------------------------- - 3195 ;*** Int 23 (ctrl-c) handler - 3196 ; - 3197 ; This is the default system INT 23 handler. All processes - 3198 ; (including COMMAND) get it by default. There are some - 3199 ; games that are played: We ignore ^C during most of the - 3200 ; INIT code. This is because we may perform an ALLOC and - 3201 ; diddle the header! Also, if we are prompting for date/time - 3202 ; in the init code, we are to treat ^C as empty responses. - 3203 ; --------------------------- - 3204 ; Bugbug: put init ctrl-c handling in init module. - 3205 ; ---------------------------------------------------------------------------- - 3206 - 3207 ;SR; - 3208 ;The stub has pushed the previous ds and DATARES onto the stack. We get - 3209 ;both these values off the stack now - 3210 ; - 3211 ;ContC proc far - 3212 - 3213 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING - 3214 - 3215 ; 11/01/2023 - Retro DOS v5.40 COMMAND.COM - 3216 ; MSDOS 5.0 COMMAND.COM RESGROUP:0D75h (CODERES:0035h) - 3217 ContC: - 3218 00000D43 1F pop ds ; ds = DATARES - 3219 ; assume ds:DATARES - 3220 ;; pop word [OldDS] ; OldDS = old ds - 3221 - 3222 00000D44 F606[1203]01 test byte [InitFlag],INITINIT ; 1 - 3223 ;test byte [cs:INITFLAG],INITINIT ; 1 ; in initialization? - 3224 00000D49 740D jz short NotAtInit ; no - 3225 00000D4B F606[1203]02 test byte [InitFlag],INITSPECIAL ; 2 - 3226 ;test byte [cs:INITFLAG],INITSPECIAL ; 2 ; doing special stuff? - 3227 00000D50 7404 jz short CmdIret ; no, ignore ^C - 3228 00000D52 1F pop ds ; restore before jumping; M021 - 3229 ;jmp RESGROUP:Init_ContC_SpecialCase ; Yes, go handle it - 3230 00000D53 E9E90F jmp init_contc_specialcase - 3231 CmdIret: - 3232 ;SR; - 3233 ; Restore ds to its previous value - 3234 ; - 3235 - 3236 ;; mov ds,[OLdDS] ; - 3237 00000D56 1F pop ds - 3238 00000D57 CF iret ; yes, ignore the ^C - 3239 - 3240 NotAtInit: - 3241 00000D58 F606[1203]04 test byte [InitFlag],INITCTRLC ; 4 - 3242 ;test byte [cs:INITFLAG],INITCTRLC ; 4 ; are we already in a ^C? - 3243 00000D5D 7411 jz short NotInit ; nope too. - 3244 - 3245 ;* We are interrupting ourselves in this ^C handler. We need - 3246 ; to set carry and return to the user sans flags only if the - 3247 ; system call was a 1-12 one. Otherwise, we ignore the ^C. - 3248 - 3249 ;cmp ah,1 - 3250 ;jb short CmdIret - 3251 ; 19/07/2024 - 3252 00000D5F 84E4 test ah,ah - 3253 00000D61 74F3 jz short CmdIret - 3254 - 3255 00000D63 80FC0C cmp ah,12 - 3256 00000D66 77EE ja short CmdIret + 3188 ; See if we can reload the transient. The external command + 3189 ; may have overwritten part of the transient. + 3190 + 3191 NoExec: + 3192 ;SR; + 3193 ; ds = es = ss = DATARES when we jump to LodCom + 3194 ; + 3195 00000D40 E97A01 jmp LodCom + 3196 + 3197 ; ---------------------------------------------------------------------------- + 3198 ;*** Int 23 (ctrl-c) handler + 3199 ; + 3200 ; This is the default system INT 23 handler. All processes + 3201 ; (including COMMAND) get it by default. There are some + 3202 ; games that are played: We ignore ^C during most of the + 3203 ; INIT code. This is because we may perform an ALLOC and + 3204 ; diddle the header! Also, if we are prompting for date/time + 3205 ; in the init code, we are to treat ^C as empty responses. + 3206 ; --------------------------- + 3207 ; Bugbug: put init ctrl-c handling in init module. + 3208 ; ---------------------------------------------------------------------------- + 3209 + 3210 ;SR; + 3211 ;The stub has pushed the previous ds and DATARES onto the stack. We get + 3212 ;both these values off the stack now + 3213 ; + 3214 ;ContC proc far + 3215 + 3216 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 3217 + 3218 ; 11/01/2023 - Retro DOS v5.40 COMMAND.COM + 3219 ; MSDOS 5.0 COMMAND.COM RESGROUP:0D75h (CODERES:0035h) + 3220 ContC: + 3221 00000D43 1F pop ds ; ds = DATARES + 3222 ; assume ds:DATARES + 3223 ;; pop word [OldDS] ; OldDS = old ds + 3224 + 3225 00000D44 F606[1203]01 test byte [InitFlag],INITINIT ; 1 + 3226 ;test byte [cs:INITFLAG],INITINIT ; 1 ; in initialization? + 3227 00000D49 740D jz short NotAtInit ; no + 3228 00000D4B F606[1203]02 test byte [InitFlag],INITSPECIAL ; 2 + 3229 ;test byte [cs:INITFLAG],INITSPECIAL ; 2 ; doing special stuff? + 3230 00000D50 7404 jz short CmdIret ; no, ignore ^C + 3231 00000D52 1F pop ds ; restore before jumping; M021 + 3232 ;jmp RESGROUP:Init_ContC_SpecialCase ; Yes, go handle it + 3233 00000D53 E9E90F jmp init_contc_specialcase + 3234 CmdIret: + 3235 ;SR; + 3236 ; Restore ds to its previous value + 3237 ; + 3238 + 3239 ;; mov ds,[OLdDS] ; + 3240 00000D56 1F pop ds + 3241 00000D57 CF iret ; yes, ignore the ^C + 3242 + 3243 NotAtInit: + 3244 00000D58 F606[1203]04 test byte [InitFlag],INITCTRLC ; 4 + 3245 ;test byte [cs:INITFLAG],INITCTRLC ; 4 ; are we already in a ^C? + 3246 00000D5D 7411 jz short NotInit ; nope too. + 3247 + 3248 ;* We are interrupting ourselves in this ^C handler. We need + 3249 ; to set carry and return to the user sans flags only if the + 3250 ; system call was a 1-12 one. Otherwise, we ignore the ^C. + 3251 + 3252 ;cmp ah,1 + 3253 ;jb short CmdIret + 3254 ; 19/07/2024 + 3255 00000D5F 84E4 test ah,ah + 3256 00000D61 74F3 jz short CmdIret 3257 - 3258 00000D68 1F pop ds ;restore ds to old value - 3259 00000D69 83C406 add sp,6 ; remove int frame - 3260 00000D6C F9 stc - 3261 - 3262 ;; mov ds,[OldDS] ;restore ds to its old value - 3263 00000D6D CA0200 retf 2 ; remove those flags... + 3258 00000D63 80FC0C cmp ah,12 + 3259 00000D66 77EE ja short CmdIret + 3260 + 3261 00000D68 1F pop ds ;restore ds to old value + 3262 00000D69 83C406 add sp,6 ; remove int frame + 3263 00000D6C F9 stc 3264 - 3265 NotInit: - 3266 - 3267 ;* We have now received a ^C for some process (maybe ourselves - 3268 ; but not at INIT). - 3269 ; - 3270 ; Note that we are running on the user's stack!!! Bad news if - 3271 ; any of the system calls below go and issue another INT - 3272 ; 24... Massive stack overflow! Another bad point is that - 3273 ; SavHand will save an already saved handle, thus losing a - 3274 ; possible redirection... - 3275 ; - 3276 ; All we need to do is set the flag to indicate nested ^C. - 3277 ; The above code will correctly flag the ^C diring the - 3278 ; message output and prompting while ignoring the ^C the rest - 3279 ; of the time. - 3280 ; - 3281 ; Clean up: flush disk. If we are in the middle of a batch - 3282 ; file, we ask if he wants to terminate it. If he does, then - 3283 ; we turn off all internal flags and let the DOS abort. - 3284 - 3285 00000D70 800E[1203]04 or byte [InitFlag],INITCTRLC ; 4 - 3286 ;or byte [cs:INITFLAG],INITCTRLC ; 4 ; nested ^c is on - 3287 00000D75 FB sti - 3288 - 3289 ; push cs ; el yucko! change the user's ds!! - 3290 ; pop ds + 3265 ;; mov ds,[OldDS] ;restore ds to its old value + 3266 00000D6D CA0200 retf 2 ; remove those flags... + 3267 + 3268 NotInit: + 3269 + 3270 ;* We have now received a ^C for some process (maybe ourselves + 3271 ; but not at INIT). + 3272 ; + 3273 ; Note that we are running on the user's stack!!! Bad news if + 3274 ; any of the system calls below go and issue another INT + 3275 ; 24... Massive stack overflow! Another bad point is that + 3276 ; SavHand will save an already saved handle, thus losing a + 3277 ; possible redirection... + 3278 ; + 3279 ; All we need to do is set the flag to indicate nested ^C. + 3280 ; The above code will correctly flag the ^C diring the + 3281 ; message output and prompting while ignoring the ^C the rest + 3282 ; of the time. + 3283 ; + 3284 ; Clean up: flush disk. If we are in the middle of a batch + 3285 ; file, we ask if he wants to terminate it. If he does, then + 3286 ; we turn off all internal flags and let the DOS abort. + 3287 + 3288 00000D70 800E[1203]04 or byte [InitFlag],INITCTRLC ; 4 + 3289 ;or byte [cs:INITFLAG],INITCTRLC ; 4 ; nested ^c is on + 3290 00000D75 FB sti 3291 - 3292 ; assume ds:RESGROUP - 3293 - 3294 00000D76 58 pop ax ; discard the old ds value - 3295 - 3296 00000D77 A1[A502] mov ax,[SingleCom] - 3297 00000D7A 09C0 or ax,ax - 3298 00000D7C 7506 jnz short NoReset - 3299 00000D7E 50 push ax - 3300 00000D7F B40D mov ah,DISK_RESET ; 0Dh - 3301 00000D81 CD21 int 21h ; reset disks in case files were open - 3302 00000D83 58 pop ax - 3303 - 3304 NoReset: - 3305 - 3306 ; In the generalized version of FOR, PIPE and BATCH, we would - 3307 ; walk the entire active list and free each segment. Here, - 3308 ; we just free the single batch segment. - 3309 - 3310 00000D84 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh - 3311 00000D8A 7452 jz short ContCTerm - 3312 00000D8C 09C0 or ax,ax - 3313 00000D8E 754E jnz short ContCTerm - 3314 00000D90 E89402 call SavHand - 3315 00000D93 E8D903 call AskEnd ; ask if user wants to end batch - 3316 - 3317 ; If the carry flag is clear, we do NOT free up the batch file - 3318 - 3319 00000D96 7340 jnc short ContBatch - 3320 00000D98 8A0E[9D02] mov cl,[EchoFlag] ; get current echo flag - 3321 00000D9C 53 push bx - 3322 - 3323 ClearBatch: - 3324 00000D9D 8E06[4902] mov es,[Batch] ; get batch segment - 3325 ;mov di,20h - 3326 00000DA1 8B3E2000 mov di,[BATCHSEGMENT.BatFile] ; get offset of batch file name - 3327 ; MSDOS 5.0 & MSDOS 6.0 (ES:5) - 3328 ;mov bx,es:BatForPtr ; get old FOR segment - 3329 00000DA5 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:5] - 3330 ; MSDOS 3.3 ([ES:4]) - 3331 ;mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:4] ; get old FOR segment - 3332 ; - 3333 ; 19/07/2024 - 3334 ;cmp bx,0 ; is a FOR in progress - 3335 ;je short No_Bat_For ; no - don't deallocate - 3336 00000DAA 85DB test bx,bx - 3337 00000DAC 7408 jz short No_Bat_For - 3338 - 3339 00000DAE 06 push es ; - 3340 00000DAF 8EC3 mov es,bx ; yes - free it up... - 3341 00000DB1 B449 mov ah,49h - 3342 ;mov ah,DEALLOC ; 49h ; - 3343 00000DB3 CD21 int 21h ; - 3344 00000DB5 07 pop es ; restore to batch segment - 3345 - 3346 No_Bat_For: - 3347 ;mov cl,[es:1] - 3348 00000DB6 268A0E0100 mov cl,[es:BATCHSEGMENT.BatEchoFlag] ; get old echo flag - 3349 ;mov bx,[es:3] - 3350 00000DBB 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] ; get old batch segment - 3351 00000DC0 B449 mov ah,49h - 3352 ;mov ah,DEALLOC ; 49h ; free it up... - 3353 00000DC2 CD21 int 21h - 3354 00000DC4 891E[4902] mov [Batch],bx ; get ready to deallocate next batch - 3355 00000DC8 FF0E[AE02] dec word [Nest] ; is there another batch file? - 3356 00000DCC 75CF jnz short ClearBatch ; keep going until no batch file - 3357 - 3358 ; We are terminating a batch file; restore the echo status - 3359 - 3360 ;Shell_Bat_Cont: ; continue batch for SHELL - 3361 00000DCE 5B pop bx - 3362 00000DCF 880E[9D02] mov [EchoFlag],cl ; reset echo status - 3363 ; 29/05/2018 - 3364 00000DD3 C606[1303]00 mov byte [PipeFlag],0 ; turn off pipeflag - 3365 - 3366 ContBatch: - 3367 00000DD8 E8FD05 call crlf ; print out crlf before returning - 3368 00000DDB E87302 call RestHand - 3369 - 3370 ; Yes, we are terminating. Turn off flags and allow the DOS to abort. - 3371 - 3372 ContCTerm: - 3373 00000DDE 31C0 xor ax,ax ; indicate no read - 3374 00000DE0 89C5 mov bp,ax - 3375 - 3376 ; The following resetting of the state flags is good for the - 3377 ; generalized batch processing. + 3292 ; push cs ; el yucko! change the user's ds!! + 3293 ; pop ds + 3294 + 3295 ; assume ds:RESGROUP + 3296 + 3297 00000D76 58 pop ax ; discard the old ds value + 3298 + 3299 00000D77 A1[A502] mov ax,[SingleCom] + 3300 00000D7A 09C0 or ax,ax + 3301 00000D7C 7506 jnz short NoReset + 3302 00000D7E 50 push ax + 3303 00000D7F B40D mov ah,DISK_RESET ; 0Dh + 3304 00000D81 CD21 int 21h ; reset disks in case files were open + 3305 00000D83 58 pop ax + 3306 + 3307 NoReset: + 3308 + 3309 ; In the generalized version of FOR, PIPE and BATCH, we would + 3310 ; walk the entire active list and free each segment. Here, + 3311 ; we just free the single batch segment. + 3312 + 3313 00000D84 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh + 3314 00000D8A 7452 jz short ContCTerm + 3315 00000D8C 09C0 or ax,ax + 3316 00000D8E 754E jnz short ContCTerm + 3317 00000D90 E89402 call SavHand + 3318 00000D93 E8D903 call AskEnd ; ask if user wants to end batch + 3319 + 3320 ; If the carry flag is clear, we do NOT free up the batch file + 3321 + 3322 00000D96 7340 jnc short ContBatch + 3323 00000D98 8A0E[9D02] mov cl,[EchoFlag] ; get current echo flag + 3324 00000D9C 53 push bx + 3325 + 3326 ClearBatch: + 3327 00000D9D 8E06[4902] mov es,[Batch] ; get batch segment + 3328 ;mov di,20h + 3329 00000DA1 8B3E2000 mov di,[BATCHSEGMENT.BatFile] ; get offset of batch file name + 3330 ; MSDOS 5.0 & MSDOS 6.0 (ES:5) + 3331 ;mov bx,es:BatForPtr ; get old FOR segment + 3332 00000DA5 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:5] + 3333 ; MSDOS 3.3 ([ES:4]) + 3334 ;mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:4] ; get old FOR segment + 3335 ; + 3336 ; 19/07/2024 + 3337 ;cmp bx,0 ; is a FOR in progress + 3338 ;je short No_Bat_For ; no - don't deallocate + 3339 00000DAA 85DB test bx,bx + 3340 00000DAC 7408 jz short No_Bat_For + 3341 + 3342 00000DAE 06 push es ; + 3343 00000DAF 8EC3 mov es,bx ; yes - free it up... + 3344 00000DB1 B449 mov ah,49h + 3345 ;mov ah,DEALLOC ; 49h ; + 3346 00000DB3 CD21 int 21h ; + 3347 00000DB5 07 pop es ; restore to batch segment + 3348 + 3349 No_Bat_For: + 3350 ;mov cl,[es:1] + 3351 00000DB6 268A0E0100 mov cl,[es:BATCHSEGMENT.BatEchoFlag] ; get old echo flag + 3352 ;mov bx,[es:3] + 3353 00000DBB 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] ; get old batch segment + 3354 00000DC0 B449 mov ah,49h + 3355 ;mov ah,DEALLOC ; 49h ; free it up... + 3356 00000DC2 CD21 int 21h + 3357 00000DC4 891E[4902] mov [Batch],bx ; get ready to deallocate next batch + 3358 00000DC8 FF0E[AE02] dec word [Nest] ; is there another batch file? + 3359 00000DCC 75CF jnz short ClearBatch ; keep going until no batch file + 3360 + 3361 ; We are terminating a batch file; restore the echo status + 3362 + 3363 ;Shell_Bat_Cont: ; continue batch for SHELL + 3364 00000DCE 5B pop bx + 3365 00000DCF 880E[9D02] mov [EchoFlag],cl ; reset echo status + 3366 ; 29/05/2018 + 3367 00000DD3 C606[1303]00 mov byte [PipeFlag],0 ; turn off pipeflag + 3368 + 3369 ContBatch: + 3370 00000DD8 E8FD05 call crlf ; print out crlf before returning + 3371 00000DDB E87302 call RestHand + 3372 + 3373 ; Yes, we are terminating. Turn off flags and allow the DOS to abort. + 3374 + 3375 ContCTerm: + 3376 00000DDE 31C0 xor ax,ax ; indicate no read + 3377 00000DE0 89C5 mov bp,ax 3378 - 3379 00000DE2 A2[AA02] mov [IfFlag],al ; turn off iffing - 3380 00000DE5 A2[AB02] mov [ForFlag],al ; turn off for processing - 3381 00000DE8 E81C00 call ResPipeOff - 3382 00000DEB 3906[A502] cmp [SingleCom],ax ; see if we need to set SingleCom - 3383 00000DEF 7406 jz short NoSetSing - 3384 00000DF1 C706[A502]FFFF mov word [SingleCom],-1 ; cause termination on - 3385 ; pipe, batch, for - 3386 NoSetSing: - 3387 - 3388 ; If we are doing an internal command, go through the reload process. - 3389 ; If we are doing an external, let DOS abort the process. - 3390 ; In both cases, we are now done with the ^C processing. - 3391 - 3392 00000DF7 8026[1203]FB and byte [InitFlag],~INITCTRLC ; 0FBh - 3393 00000DFC 3806[9902] cmp [ExtCom],al - 3394 00000E00 7503 jnz short DoDAb ; internal ^c - 3395 00000E02 E94701 jmp LodCom1 - 3396 DoDAb: - 3397 00000E05 F9 stc ; tell dos to abort - 3398 - 3399 ;SR; - 3400 ;We dont need to restore ds here because we are forcing DOS to do an abort - 3401 ;by setting carry and leaving flags on the stack - 3402 - 3403 00000E06 CB retf ; Leave flags on stack - 3404 - 3405 ;ContC endp - 3406 - 3407 ;SR; - 3408 ;ds = DATARES on entry. This routine is called from DskErr and LodCom1 and - 3409 ;both have ds = DATARES - 3410 - 3411 ; 11/01/2023 - 3412 ResPipeOff: - 3413 00000E07 50 push ax - 3414 00000E08 31C0 xor ax,ax - 3415 ;xchg al,[cs:PIPEFLAG] - 3416 00000E0A 8606[1303] xchg al,[PipeFlag] - 3417 00000E0E 08C0 or al,al - 3418 00000E10 7404 jz short NoPipePop - 3419 ;shr byte [cs:ECHOFLAG],1 - 3420 00000E12 D02E[9D02] shr byte [EchoFlag],1 - 3421 NoPipePop: - 3422 00000E16 58 pop ax - 3423 00000E17 C3 retn - 3424 - 3425 ;CODERES ends - 3426 - 3427 ;============================================================================= - 3428 ; COMMAND2.ASM, MSDOS 6.0, 1991 - 3429 ;============================================================================= - 3430 ; 21/09/2018 - Retro DOS v3.0 - 3431 - 3432 ; title COMMAND2 - resident code for COMMAND.COM part II - 3433 ; name COMMAND2 + 3379 ; The following resetting of the state flags is good for the + 3380 ; generalized batch processing. + 3381 + 3382 00000DE2 A2[AA02] mov [IfFlag],al ; turn off iffing + 3383 00000DE5 A2[AB02] mov [ForFlag],al ; turn off for processing + 3384 00000DE8 E81C00 call ResPipeOff + 3385 00000DEB 3906[A502] cmp [SingleCom],ax ; see if we need to set SingleCom + 3386 00000DEF 7406 jz short NoSetSing + 3387 00000DF1 C706[A502]FFFF mov word [SingleCom],-1 ; cause termination on + 3388 ; pipe, batch, for + 3389 NoSetSing: + 3390 + 3391 ; If we are doing an internal command, go through the reload process. + 3392 ; If we are doing an external, let DOS abort the process. + 3393 ; In both cases, we are now done with the ^C processing. + 3394 + 3395 00000DF7 8026[1203]FB and byte [InitFlag],~INITCTRLC ; 0FBh + 3396 00000DFC 3806[9902] cmp [ExtCom],al + 3397 00000E00 7503 jnz short DoDAb ; internal ^c + 3398 00000E02 E94701 jmp LodCom1 + 3399 DoDAb: + 3400 00000E05 F9 stc ; tell dos to abort + 3401 + 3402 ;SR; + 3403 ;We dont need to restore ds here because we are forcing DOS to do an abort + 3404 ;by setting carry and leaving flags on the stack + 3405 + 3406 00000E06 CB retf ; Leave flags on stack + 3407 + 3408 ;ContC endp + 3409 + 3410 ;SR; + 3411 ;ds = DATARES on entry. This routine is called from DskErr and LodCom1 and + 3412 ;both have ds = DATARES + 3413 + 3414 ; 11/01/2023 + 3415 ResPipeOff: + 3416 00000E07 50 push ax + 3417 00000E08 31C0 xor ax,ax + 3418 ;xchg al,[cs:PIPEFLAG] + 3419 00000E0A 8606[1303] xchg al,[PipeFlag] + 3420 00000E0E 08C0 or al,al + 3421 00000E10 7404 jz short NoPipePop + 3422 ;shr byte [cs:ECHOFLAG],1 + 3423 00000E12 D02E[9D02] shr byte [EchoFlag],1 + 3424 NoPipePop: + 3425 00000E16 58 pop ax + 3426 00000E17 C3 retn + 3427 + 3428 ;CODERES ends + 3429 + 3430 ;============================================================================= + 3431 ; COMMAND2.ASM, MSDOS 6.0, 1991 + 3432 ;============================================================================= + 3433 ; 21/09/2018 - Retro DOS v3.0 3434 - 3435 ;/* - 3436 ; * Microsoft Confidential - 3437 ; * Copyright (C) Microsoft Corporation 1991 - 3438 ; * All Rights Reserved. - 3439 ; */ - 3440 - 3441 ; - 3442 ; Revision History - 3443 ; ================ + 3435 ; title COMMAND2 - resident code for COMMAND.COM part II + 3436 ; name COMMAND2 + 3437 + 3438 ;/* + 3439 ; * Microsoft Confidential + 3440 ; * Copyright (C) Microsoft Corporation 1991 + 3441 ; * All Rights Reserved. + 3442 ; */ + 3443 3444 ; - 3445 ; M038 SR 11/5/90 Changed stuff for Novell RPL. These guys cannot - 3446 ; reserve memory by changing int 12h and then give it - 3447 ; back to DOS by changing arenas in autoexec.bat. - 3448 ; This makes command.com reload transient and this - 3449 ; cannot be done at this stage. - 3450 ; - 3451 - 3452 ;CODERES segment public byte - 3453 - 3454 ;* If we cannot allocate enough memory for the transient or there - 3455 ; was some other allocation error, we display a message and - 3456 ; then die. - 3457 - 3458 ;SR; - 3459 ; We will have to make sure that at this entry point and at FatalC, - 3460 ;ds = DATARES. All jumps to these points are made from only within this file - 3461 ;and so we should be able to do this - 3462 - 3463 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 3464 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0E4Bh (CODERES:010Bh) + 3445 ; Revision History + 3446 ; ================ + 3447 ; + 3448 ; M038 SR 11/5/90 Changed stuff for Novell RPL. These guys cannot + 3449 ; reserve memory by changing int 12h and then give it + 3450 ; back to DOS by changing arenas in autoexec.bat. + 3451 ; This makes command.com reload transient and this + 3452 ; cannot be done at this stage. + 3453 ; + 3454 + 3455 ;CODERES segment public byte + 3456 + 3457 ;* If we cannot allocate enough memory for the transient or there + 3458 ; was some other allocation error, we display a message and + 3459 ; then die. + 3460 + 3461 ;SR; + 3462 ; We will have to make sure that at this entry point and at FatalC, + 3463 ;ds = DATARES. All jumps to these points are made from only within this file + 3464 ;and so we should be able to do this 3465 - 3466 ;assume ds:DATARES - 3467 BadMemErr: - 3468 00000E18 BA[DE06] mov dx,BMEMMES ; DX = ptr to msg - 3469 FatalC: - 3470 ; 12/01/2023 - 3471 ;; push cs - 3472 ;; pop ds - 3473 ;; assume ds:ResGroup - 3474 ; invoke RPrint - 3475 - 3476 ; 12/01/2023 - 3477 ; MSDOS 5.0 (& MSDOS 6.0-6.22) - 3478 00000E1B E8BD05 call RPrint - 3479 - 3480 ; MSDOS 3.3 - 3481 ;call RDISPMSG + 3466 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 3467 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0E4Bh (CODERES:010Bh) + 3468 + 3469 ;assume ds:DATARES + 3470 BadMemErr: + 3471 00000E18 BA[DE06] mov dx,BMEMMES ; DX = ptr to msg + 3472 FatalC: + 3473 ; 12/01/2023 + 3474 ;; push cs + 3475 ;; pop ds + 3476 ;; assume ds:ResGroup + 3477 ; invoke RPrint + 3478 + 3479 ; 12/01/2023 + 3480 ; MSDOS 5.0 (& MSDOS 6.0-6.22) + 3481 00000E1B E8BD05 call RPrint 3482 - 3483 ; If this is NOT a permanent (top-level) COMMAND, then we exit; - 3484 ; we can't do anything else! + 3483 ; MSDOS 3.3 + 3484 ;call RDISPMSG 3485 - 3486 00000E1E 803E[A202]00 cmp byte [PermCom],0 - 3487 00000E23 7410 je short FatalRet + 3486 ; If this is NOT a permanent (top-level) COMMAND, then we exit; + 3487 ; we can't do anything else! 3488 - 3489 ; We are a permanent command. If we are in the process of the - 3490 ; magic interrupt (Singlecom) then exit too. + 3489 00000E1E 803E[A202]00 cmp byte [PermCom],0 + 3490 00000E23 7410 je short FatalRet 3491 - 3492 00000E25 833E[A502]00 cmp word [SingleCom],0 ; if PermCom and SingleCom - 3493 00000E2A 7509 jne short FatalRet ; must take int_2e exit + 3492 ; We are a permanent command. If we are in the process of the + 3493 ; magic interrupt (Singlecom) then exit too. 3494 - 3495 ; Permanent command. We can't do ANYthing except halt. - 3496 - 3497 00000E2C BA[F806] mov dx,HALTMES ; DX = ptr to msg - 3498 ;invoke RPrint - 3499 ; 12/01/2023 - 3500 ; MSDOS 5.0 (& MSDOS 6.0-6.22) - 3501 00000E2F E8A905 call RPrint - 3502 ; MSDOS 3.3 - 3503 ;call RDISPMSG - 3504 00000E32 FB sti - 3505 Stall: - 3506 00000E33 EBFE jmp short Stall ; crash the system nicely - 3507 - 3508 FatalRet: - 3509 00000E35 BA[1F07] mov dx,FRETMES ; DX = ptr to msg - 3510 ;call RDISPMSG - 3511 ; 12/01/2023 - 3512 00000E38 E8A005 call RPrint - 3513 FatalRet2: - 3514 00000E3B 803E[A202]00 cmp byte [PermCom],0 ; if we get here and PermCom, - 3515 00000E40 7519 jne short Ret_2e ; must be int_2e - 3516 - 3517 ; Bugbug: this is where we'd want to unhook int 2F, *if* we - 3518 ; were a non-permanent COMMAND that had hooked it! (Just in - 3519 ; case we decide to do that.) - 3520 - 3521 00000E42 A1[3E02] mov ax,[Parent] - 3522 ;mov [16h],ax - 3523 00000E45 A31600 mov [PDB.PARENT_PID],ax ; mov [cs:16h],ax - 3524 00000E48 A1[4002] mov ax,[OldTerm] - 3525 ;mov [0Ah],ax - 3526 00000E4B A30A00 mov [PDB.EXIT],ax ; mov [cs:0Ah],ax - 3527 00000E4E A1[4202] mov ax,[OldTerm+2] - 3528 ;mov [0Ch],ax - 3529 00000E51 A30C00 mov [PDB.EXIT+2],ax ; mov [cs:0Ch],ax - 3530 ;mov ax,4C00h - 3531 ;;mov ax,(EXIT<<8) ; 4C00h ; return to lower level - 3532 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 3533 00000E54 B44C mov ah,4Ch ; EXIT - 3534 00000E56 A0[9A02] mov al,[RetCode] - 3535 00000E59 CD21 int 21h - 3536 Ret_2e: - 3537 ;SR; - 3538 ; We will ensure that ds = DATARES for all entries to this place - 3539 ; - 3540 - 3541 ;; push cs - 3542 ;; pop ds - 3543 ;; assume ds:resgroup,es:nothing,ss:nothing - 3544 - 3545 ; assume ds:DATARES - 3546 - 3547 ;PUSH CS - 3548 ;POP DS + 3495 00000E25 833E[A502]00 cmp word [SingleCom],0 ; if PermCom and SingleCom + 3496 00000E2A 7509 jne short FatalRet ; must take int_2e exit + 3497 + 3498 ; Permanent command. We can't do ANYthing except halt. + 3499 + 3500 00000E2C BA[F806] mov dx,HALTMES ; DX = ptr to msg + 3501 ;invoke RPrint + 3502 ; 12/01/2023 + 3503 ; MSDOS 5.0 (& MSDOS 6.0-6.22) + 3504 00000E2F E8A905 call RPrint + 3505 ; MSDOS 3.3 + 3506 ;call RDISPMSG + 3507 00000E32 FB sti + 3508 Stall: + 3509 00000E33 EBFE jmp short Stall ; crash the system nicely + 3510 + 3511 FatalRet: + 3512 00000E35 BA[1F07] mov dx,FRETMES ; DX = ptr to msg + 3513 ;call RDISPMSG + 3514 ; 12/01/2023 + 3515 00000E38 E8A005 call RPrint + 3516 FatalRet2: + 3517 00000E3B 803E[A202]00 cmp byte [PermCom],0 ; if we get here and PermCom, + 3518 00000E40 7519 jne short Ret_2e ; must be int_2e + 3519 + 3520 ; Bugbug: this is where we'd want to unhook int 2F, *if* we + 3521 ; were a non-permanent COMMAND that had hooked it! (Just in + 3522 ; case we decide to do that.) + 3523 + 3524 00000E42 A1[3E02] mov ax,[Parent] + 3525 ;mov [16h],ax + 3526 00000E45 A31600 mov [PDB.PARENT_PID],ax ; mov [cs:16h],ax + 3527 00000E48 A1[4002] mov ax,[OldTerm] + 3528 ;mov [0Ah],ax + 3529 00000E4B A30A00 mov [PDB.EXIT],ax ; mov [cs:0Ah],ax + 3530 00000E4E A1[4202] mov ax,[OldTerm+2] + 3531 ;mov [0Ch],ax + 3532 00000E51 A30C00 mov [PDB.EXIT+2],ax ; mov [cs:0Ch],ax + 3533 ;mov ax,4C00h + 3534 ;;mov ax,(EXIT<<8) ; 4C00h ; return to lower level + 3535 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 3536 00000E54 B44C mov ah,4Ch ; EXIT + 3537 00000E56 A0[9A02] mov al,[RetCode] + 3538 00000E59 CD21 int 21h + 3539 Ret_2e: + 3540 ;SR; + 3541 ; We will ensure that ds = DATARES for all entries to this place + 3542 ; + 3543 + 3544 ;; push cs + 3545 ;; pop ds + 3546 ;; assume ds:resgroup,es:nothing,ss:nothing + 3547 + 3548 ; assume ds:DATARES 3549 - 3550 00000E5B C706[A502]0000 mov word [SingleCom],0 ; turn off SingleCom - 3551 00000E61 8E06[5804] mov es,[Res_Tpa] - 3552 ;mov ah,49h ; 12/01/2023 - 3553 00000E65 B449 mov ah,DEALLOC - 3554 00000E67 CD21 int 21h ; free up space used by transient - 3555 00000E69 8B1E[3C02] mov bx,[Save_Pdb] - 3556 00000E6D B450 mov ah,50h - 3557 ;mov ah,SET_CURRENT_PDB ; 50h - 3558 00000E6F CD21 int 21h ; current process is user - 3559 00000E71 A1[9A02] mov ax,[RetCode] - 3560 00000E74 803E[9902]00 cmp byte [ExtCom],0 - 3561 00000E79 7502 jne short GotECode - 3562 00000E7B 31C0 xor ax,ax ; internals always return 0 - 3563 GotECode: - 3564 00000E7D C606[9902]01 mov byte [ExtCom],1 ; force external - 3565 - 3566 ;SR; This is actually returning to the caller. However, the old code had - 3567 ;ds = RESGROUP so I guess we can keep ds = DATARES for us. - 3568 ;Yes, int 2eh can corrupt all registers so we are ok. - 3569 - 3570 ; 12/01/2023 - 3571 00000E82 FF2E[3802] jmp far [Int_2e_Ret] ; "iret" + 3550 ;PUSH CS + 3551 ;POP DS + 3552 + 3553 00000E5B C706[A502]0000 mov word [SingleCom],0 ; turn off SingleCom + 3554 00000E61 8E06[5804] mov es,[Res_Tpa] + 3555 ;mov ah,49h ; 12/01/2023 + 3556 00000E65 B449 mov ah,DEALLOC + 3557 00000E67 CD21 int 21h ; free up space used by transient + 3558 00000E69 8B1E[3C02] mov bx,[Save_Pdb] + 3559 00000E6D B450 mov ah,50h + 3560 ;mov ah,SET_CURRENT_PDB ; 50h + 3561 00000E6F CD21 int 21h ; current process is user + 3562 00000E71 A1[9A02] mov ax,[RetCode] + 3563 00000E74 803E[9902]00 cmp byte [ExtCom],0 + 3564 00000E79 7502 jne short GotECode + 3565 00000E7B 31C0 xor ax,ax ; internals always return 0 + 3566 GotECode: + 3567 00000E7D C606[9902]01 mov byte [ExtCom],1 ; force external + 3568 + 3569 ;SR; This is actually returning to the caller. However, the old code had + 3570 ;ds = RESGROUP so I guess we can keep ds = DATARES for us. + 3571 ;Yes, int 2eh can corrupt all registers so we are ok. 3572 - 3573 ;*** Int_2e, magic command executer - 3574 - 3575 Int_2e: - 3576 ;assume ds:NOTHING,es:NOTHING,ss:NOTHING - 3577 ;SR; - 3578 ;We are going to come here from the stub with the old ds and DATARES value - 3579 ;pushed on the stack in that order. Pick up this stuff off the stack - 3580 - 3581 ; 12/01/2023 - Retro DOS v4.0 COMMAND.COM - 3582 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0EB7h (CODERES:0177h) + 3573 ; 12/01/2023 + 3574 00000E82 FF2E[3802] jmp far [Int_2e_Ret] ; "iret" + 3575 + 3576 ;*** Int_2e, magic command executer + 3577 + 3578 Int_2e: + 3579 ;assume ds:NOTHING,es:NOTHING,ss:NOTHING + 3580 ;SR; + 3581 ;We are going to come here from the stub with the old ds and DATARES value + 3582 ;pushed on the stack in that order. Pick up this stuff off the stack 3583 - 3584 00000E86 1F pop ds ; ds = DATARES - 3585 ;assume ds:DATARES - 3586 00000E87 58 pop ax - 3587 ; ;pop ds:OldDS ; Save old value of ds - 3588 - 3589 ;pop word [cs:Int_2e_Ret] - 3590 ;pop word [cs:Int_2e_Ret+2] ; store return address - 3591 ;pop ax ; chuck flags - 3592 00000E88 8F06[3802] pop word [Int_2e_Ret] - 3593 00000E8C 8F06[3A02] pop word [Int_2e_Ret+2] - 3594 - 3595 00000E90 83C402 add sp,2 - 3596 - 3597 ;; push cs - 3598 ;; pop es + 3584 ; 12/01/2023 - Retro DOS v4.0 COMMAND.COM + 3585 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0EB7h (CODERES:0177h) + 3586 + 3587 00000E86 1F pop ds ; ds = DATARES + 3588 ;assume ds:DATARES + 3589 00000E87 58 pop ax + 3590 ; ;pop ds:OldDS ; Save old value of ds + 3591 + 3592 ;pop word [cs:Int_2e_Ret] + 3593 ;pop word [cs:Int_2e_Ret+2] ; store return address + 3594 ;pop ax ; chuck flags + 3595 00000E88 8F06[3802] pop word [Int_2e_Ret] + 3596 00000E8C 8F06[3A02] pop word [Int_2e_Ret+2] + 3597 + 3598 00000E90 83C402 add sp,2 3599 - 3600 00000E93 1E push ds - 3601 00000E94 07 pop es ; es = DATARES - 3602 ; ;mov ds,OldDS - 3603 00000E95 8ED8 mov ds,ax - 3604 ;assume ds:nothing ; ds = old value - 3605 - 3606 00000E97 BF8000 mov di,80h - 3607 00000E9A B94000 mov cx,64 - 3608 ; Bugbug: cld - 3609 00000E9D F3A5 rep movsw - 3610 00000E9F B451 mov ah,51h - 3611 ;mov ah,GET_CURRENT_PDB ; 51h - 3612 00000EA1 CD21 int 21h ; get user's header - 3613 ; 12/01/2023 - 3614 00000EA3 26891E[3C02] mov [es:Save_Pdb],bx - 3615 ;mov [cs:Save_Pdb],bx - 3616 00000EA8 B450 mov ah,50h - 3617 ;mov ah,SET_CURRENT_PDB ; 50h - 3618 - 3619 ;; mov bx,cs - 3620 ;SR; - 3621 ;Set ds = DATARES because BadMemErr expects this - 3622 - 3623 ; 12/01/2023 - 3624 00000EAA 06 push es - 3625 00000EAB 1F pop ds - 3626 ;assume ds:DATARES - 3627 - 3628 00000EAC 8CDB mov bx,ds ; es = our PSP now - 3629 ;mov bx,cs + 3600 ;; push cs + 3601 ;; pop es + 3602 + 3603 00000E93 1E push ds + 3604 00000E94 07 pop es ; es = DATARES + 3605 ; ;mov ds,OldDS + 3606 00000E95 8ED8 mov ds,ax + 3607 ;assume ds:nothing ; ds = old value + 3608 + 3609 00000E97 BF8000 mov di,80h + 3610 00000E9A B94000 mov cx,64 + 3611 ; Bugbug: cld + 3612 00000E9D F3A5 rep movsw + 3613 00000E9F B451 mov ah,51h + 3614 ;mov ah,GET_CURRENT_PDB ; 51h + 3615 00000EA1 CD21 int 21h ; get user's header + 3616 ; 12/01/2023 + 3617 00000EA3 26891E[3C02] mov [es:Save_Pdb],bx + 3618 ;mov [cs:Save_Pdb],bx + 3619 00000EA8 B450 mov ah,50h + 3620 ;mov ah,SET_CURRENT_PDB ; 50h + 3621 + 3622 ;; mov bx,cs + 3623 ;SR; + 3624 ;Set ds = DATARES because BadMemErr expects this + 3625 + 3626 ; 12/01/2023 + 3627 00000EAA 06 push es + 3628 00000EAB 1F pop ds + 3629 ;assume ds:DATARES 3630 - 3631 00000EAE CD21 int 21h ; current process is me - 3632 ;mov word [cs:SingleCom],81h - 3633 ;mov byte [cs:ExtCom],1 ; make sure this case forced - 3634 ; 12/01/2023 - 3635 00000EB0 C706[A502]8100 mov word [SingleCom],81h - 3636 00000EB6 C606[9902]01 mov byte [ExtCom],1 ; make sure this case forced - 3637 - 3638 ;SR; - 3639 ;We can enter LodCom directly after a command shell is terminated or we - 3640 ;can fall thru from above. When we enter directly from the stub, the stack - 3641 ;has the old ds value and the data seg value on the stack, so that ds can - 3642 ;be properly set. To fake this, we push dummy values here. - 3643 - 3644 ; 12/01/2023 - 3645 00000EBB 1E push ds ; old value of ds - 3646 00000EBC 1E push ds ; data seg value, ds = DATARES - 3647 LodCom: ; termination handler - 3648 00000EBD 1F pop ds ; ds = DATARES - 3649 ;assume ds:DATARES - 3650 00000EBE 83C402 add sp,2 - 3651 ; ;pop OldDS ; store old ds - 3652 ;cmp ExtCom,0 - 3653 00000EC1 803E[9902]00 cmp byte [ExtCom],0 - 3654 ;cmp byte [cs:ExtCom],0 - 3655 ;jne short @f ; internal cmd - memory allocated - 3656 ; 16/04/2023 - 3657 00000EC6 7503 jne short LodCom0 ; 24/09/2018 - 3658 00000EC8 E98100 jmp LodCom1 - 3659 ;je short LodCom1 ; 25/09/2018 - 3660 ;@@: - 3661 LodCom0: ; 24/09/2018 - 3662 00000ECB BBFFFF mov bx,0FFFFh - 3663 00000ECE B448 mov ah,48h ; 12/01/2023 - 3664 ;mov ah,ALLOC ; 48h - 3665 00000ED0 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 3666 ; BX = number of 16-byte paragraphs desired - 3667 00000ED2 E80A00 call SetSize - 3668 00000ED5 83C020 add ax,20h - 3669 00000ED8 39C3 cmp bx,ax - 3670 00000EDA 730B jnb short MemOk ; > 512 byte buffer - good enough - 3671 BadMemErrJ: - 3672 00000EDC E939FF jmp BadMemErr ; not enough memory - 3673 - 3674 ;*** SetSize - get transient size in paragraphs - 3675 - 3676 SetSize: - 3677 ; 12/01/2023 - 3678 ;;;mov ax,offset TRANGROUP:TranSpaceEnd + 15 - 3679 ;;mov ax,98D4h ; MSDOS 5.0 COMMAND.COM - 3680 ; 05/06/2023 - 3681 ;mov ax,0AFA4h ; MSDOS 6.22 COMMAND.COM - 3682 00000EDF B81AA6 mov ax,TRANSPACEEND+15 ; mov AX,4D6Bh ; MSDOS 3.3 - 3683 00000EE2 B104 mov cl,4 - 3684 00000EE4 D3E8 shr ax,cl - 3685 00000EE6 C3 retn - 3686 - 3687 MemOk: - 3688 ;assume ds:DATARES ;we have set ds = DATARES + 3631 00000EAC 8CDB mov bx,ds ; es = our PSP now + 3632 ;mov bx,cs + 3633 + 3634 00000EAE CD21 int 21h ; current process is me + 3635 ;mov word [cs:SingleCom],81h + 3636 ;mov byte [cs:ExtCom],1 ; make sure this case forced + 3637 ; 12/01/2023 + 3638 00000EB0 C706[A502]8100 mov word [SingleCom],81h + 3639 00000EB6 C606[9902]01 mov byte [ExtCom],1 ; make sure this case forced + 3640 + 3641 ;SR; + 3642 ;We can enter LodCom directly after a command shell is terminated or we + 3643 ;can fall thru from above. When we enter directly from the stub, the stack + 3644 ;has the old ds value and the data seg value on the stack, so that ds can + 3645 ;be properly set. To fake this, we push dummy values here. + 3646 + 3647 ; 12/01/2023 + 3648 00000EBB 1E push ds ; old value of ds + 3649 00000EBC 1E push ds ; data seg value, ds = DATARES + 3650 LodCom: ; termination handler + 3651 00000EBD 1F pop ds ; ds = DATARES + 3652 ;assume ds:DATARES + 3653 00000EBE 83C402 add sp,2 + 3654 ; ;pop OldDS ; store old ds + 3655 ;cmp ExtCom,0 + 3656 00000EC1 803E[9902]00 cmp byte [ExtCom],0 + 3657 ;cmp byte [cs:ExtCom],0 + 3658 ;jne short @f ; internal cmd - memory allocated + 3659 ; 16/04/2023 + 3660 00000EC6 7503 jne short LodCom0 ; 24/09/2018 + 3661 00000EC8 E98100 jmp LodCom1 + 3662 ;je short LodCom1 ; 25/09/2018 + 3663 ;@@: + 3664 LodCom0: ; 24/09/2018 + 3665 00000ECB BBFFFF mov bx,0FFFFh + 3666 00000ECE B448 mov ah,48h ; 12/01/2023 + 3667 ;mov ah,ALLOC ; 48h + 3668 00000ED0 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 3669 ; BX = number of 16-byte paragraphs desired + 3670 00000ED2 E80A00 call SetSize + 3671 00000ED5 83C020 add ax,20h + 3672 00000ED8 39C3 cmp bx,ax + 3673 00000EDA 730B jnb short MemOk ; > 512 byte buffer - good enough + 3674 BadMemErrJ: + 3675 00000EDC E939FF jmp BadMemErr ; not enough memory + 3676 + 3677 ;*** SetSize - get transient size in paragraphs + 3678 + 3679 SetSize: + 3680 ; 12/01/2023 + 3681 ;;;mov ax,offset TRANGROUP:TranSpaceEnd + 15 + 3682 ;;mov ax,98D4h ; MSDOS 5.0 COMMAND.COM + 3683 ; 05/06/2023 + 3684 ;mov ax,0AFA4h ; MSDOS 6.22 COMMAND.COM + 3685 00000EDF B81AA6 mov ax,TRANSPACEEND+15 ; mov AX,4D6Bh ; MSDOS 3.3 + 3686 00000EE2 B104 mov cl,4 + 3687 00000EE4 D3E8 shr ax,cl + 3688 00000EE6 C3 retn 3689 - 3690 00000EE7 B448 mov ah,48h - 3691 ;mov ah,ALLOC ; 48h - 3692 00000EE9 CD21 int 21h - 3693 00000EEB 72EF jc short BadMemErrJ ; memory arenas probably trashed - 3694 ;mov byte [cs:ExtCom],0 - 3695 ;mov [cs:Res_Tpa],ax - 3696 ; 12/01/2023 - 3697 00000EED C606[9902]00 mov byte [ExtCom],0 ; flag not to alloc again - 3698 00000EF2 A3[5804] mov [Res_Tpa],ax ; save current tpa segment - 3699 - 3700 00000EF5 2500F0 and ax,0F000h - 3701 00000EF8 050010 add ax,1000h ; round up to next 64k boundary - 3702 00000EFB 7212 jc short Bad_Tpa ; memory wrap if carry set - 3703 - 3704 ; Make sure that new boundary is within allocated range - 3705 - 3706 ;mov dx,[cs:Res_Tpa] - 3707 ; 12/01/2023 - 3708 00000EFD 8B16[5804] mov dx,[Res_Tpa] - 3709 00000F01 01DA add dx,bx ; compute maximum address - 3710 00000F03 39C2 cmp dx,ax ; is 64k address out of range? - 3711 00000F05 7608 jbe short Bad_Tpa - 3712 - 3713 ; Must have 64K of usable space. - 3714 - 3715 00000F07 29C2 sub dx,ax ; compute the usable space - 3716 00000F09 81FA0010 cmp dx,1000h ; is space >= 64k ? - 3717 00000F0D 7303 jae short LTpaSet - 3718 Bad_Tpa: - 3719 ;mov ax,[cs:Res_Tpa] - 3720 ; 12/01/2023 - 3721 00000F0F A1[5804] mov ax,[Res_Tpa] - 3722 LTpaSet: - 3723 ;mov [cs:LTPA],ax - 3724 ;mov ax,[cs:Res_Tpa] - 3725 ; 12/01/2023 - 3726 00000F12 A3[4C04] mov [LTpa],ax ; usable tpa is 64k buffer aligned - 3727 00000F15 A1[5804] mov ax,[Res_Tpa] ; actual tpa is buffer allocated - 3728 00000F18 01C3 add bx,ax - 3729 ;mov [cs:MemSiz],bx - 3730 00000F1A 891E[9502] mov [MemSiz],bx - 3731 00000F1E E8BEFF call SetSize - 3732 00000F21 29C3 sub bx,ax - 3733 - 3734 ; MSDOS 6.0 - 3735 - 3736 ;M038; Start of changes - 3737 ;Changes for Novell RPL. These guys reserve memory for themselves by - 3738 ;reducing int 12h size and add this memory to the system at autoexec time by - 3739 ;running a program that changes arenas. This changes the largest block that - 3740 ;command.com gets and so changes the transient segment. So, command.com does - 3741 ;a checksum at the wrong address and thinks that the transient is destroyed - 3742 ;and tries to reload it. At this point, no Comspec is defined and so the - 3743 ;reload fails, hanging the system. To get around this we just copy the - 3744 ;transient from the previous address to the new address(if changed) and - 3745 ;then let command.com do the checksum. So, if the transient area is not - 3746 ;corrupted, there will not be any reload. In Novell's case, the transient - 3747 ;is not really corrupted and so this should work. - 3748 - 3749 ; 12/01/2023 - 3750 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0F5Ah (CODERES:021Ah) + 3690 MemOk: + 3691 ;assume ds:DATARES ;we have set ds = DATARES + 3692 + 3693 00000EE7 B448 mov ah,48h + 3694 ;mov ah,ALLOC ; 48h + 3695 00000EE9 CD21 int 21h + 3696 00000EEB 72EF jc short BadMemErrJ ; memory arenas probably trashed + 3697 ;mov byte [cs:ExtCom],0 + 3698 ;mov [cs:Res_Tpa],ax + 3699 ; 12/01/2023 + 3700 00000EED C606[9902]00 mov byte [ExtCom],0 ; flag not to alloc again + 3701 00000EF2 A3[5804] mov [Res_Tpa],ax ; save current tpa segment + 3702 + 3703 00000EF5 2500F0 and ax,0F000h + 3704 00000EF8 050010 add ax,1000h ; round up to next 64k boundary + 3705 00000EFB 7212 jc short Bad_Tpa ; memory wrap if carry set + 3706 + 3707 ; Make sure that new boundary is within allocated range + 3708 + 3709 ;mov dx,[cs:Res_Tpa] + 3710 ; 12/01/2023 + 3711 00000EFD 8B16[5804] mov dx,[Res_Tpa] + 3712 00000F01 01DA add dx,bx ; compute maximum address + 3713 00000F03 39C2 cmp dx,ax ; is 64k address out of range? + 3714 00000F05 7608 jbe short Bad_Tpa + 3715 + 3716 ; Must have 64K of usable space. + 3717 + 3718 00000F07 29C2 sub dx,ax ; compute the usable space + 3719 00000F09 81FA0010 cmp dx,1000h ; is space >= 64k ? + 3720 00000F0D 7303 jae short LTpaSet + 3721 Bad_Tpa: + 3722 ;mov ax,[cs:Res_Tpa] + 3723 ; 12/01/2023 + 3724 00000F0F A1[5804] mov ax,[Res_Tpa] + 3725 LTpaSet: + 3726 ;mov [cs:LTPA],ax + 3727 ;mov ax,[cs:Res_Tpa] + 3728 ; 12/01/2023 + 3729 00000F12 A3[4C04] mov [LTpa],ax ; usable tpa is 64k buffer aligned + 3730 00000F15 A1[5804] mov ax,[Res_Tpa] ; actual tpa is buffer allocated + 3731 00000F18 01C3 add bx,ax + 3732 ;mov [cs:MemSiz],bx + 3733 00000F1A 891E[9502] mov [MemSiz],bx + 3734 00000F1E E8BEFF call SetSize + 3735 00000F21 29C3 sub bx,ax + 3736 + 3737 ; MSDOS 6.0 + 3738 + 3739 ;M038; Start of changes + 3740 ;Changes for Novell RPL. These guys reserve memory for themselves by + 3741 ;reducing int 12h size and add this memory to the system at autoexec time by + 3742 ;running a program that changes arenas. This changes the largest block that + 3743 ;command.com gets and so changes the transient segment. So, command.com does + 3744 ;a checksum at the wrong address and thinks that the transient is destroyed + 3745 ;and tries to reload it. At this point, no Comspec is defined and so the + 3746 ;reload fails, hanging the system. To get around this we just copy the + 3747 ;transient from the previous address to the new address(if changed) and + 3748 ;then let command.com do the checksum. So, if the transient area is not + 3749 ;corrupted, there will not be any reload. In Novell's case, the transient + 3750 ;is not really corrupted and so this should work. 3751 - 3752 00000F23 3B1E[8F02] cmp bx,[TrnSeg] ; Segment still the same? - 3753 00000F27 7423 je short LodCom1 ; yes, dont copy + 3752 ; 12/01/2023 + 3753 ; MSDOS 5.0 COMMAND.COM - RESGROUP:0F5Ah (CODERES:021Ah) 3754 - 3755 ;Check if the new segment is above or below the current move. If the new - 3756 ;segment is above (i.e new block is larger than previous block), then we - 3757 ;have to move in the reverse direction - 3758 - 3759 ;;mov cx,98C5h - 3760 ; 05/06/2023 - 3761 ; MSDOS 6.22 COMMAND.COM - RESGROUP:106Ah (CODERES:021Ah) - 3762 ;mov cx,0AF95h - 3763 ;;mov cx,0AA9Ah ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 3764 00000F29 B90BA6 mov cx,TRANSPACEEND ; cx = length to move - 3765 00000F2C 7707 ja short mov_down ; new seg > old seg, reverse move - 3766 00000F2E 31F6 xor si,si ; normal move - 3767 00000F30 89F7 mov di,si - 3768 00000F32 FC cld - 3769 00000F33 EB06 jmp short copy_trans - 3770 mov_down: - 3771 00000F35 89CE mov si,cx ; reverse move, start from end - 3772 00000F37 4E dec si - 3773 00000F38 89F7 mov di,si - 3774 00000F3A FD std - 3775 copy_trans: - 3776 00000F3B 1E push ds - 3777 00000F3C 06 push es - 3778 00000F3D 8EC3 mov es,bx ; dest segment - 3779 00000F3F 8E1E[8F02] mov ds,[TrnSeg] ; source segment - 3780 ;assume ds:nothing - 3781 - 3782 00000F43 F3A4 rep movsb ; copy transient - 3783 00000F45 FC cld - 3784 00000F46 07 pop es - 3785 00000F47 1F pop ds - 3786 ;assume ds:DATARES - 3787 - 3788 ;M038; End of changes - 3789 - 3790 ;mov [cs:TrnSeg],bx ; new location of transient - 3791 ; 12/01/2023 - 3792 00000F48 891E[8F02] mov [TrnSeg],bx - 3793 - 3794 LodCom1: - 3795 ;; mov ax,cs - 3796 ;; mov ss,ax - 3797 ;SR; At this point ds = DATARES which is where the stack is located - 3798 - 3799 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 3800 ; MSDOS 5.0 (& MSDOS 6.0-6.22) - 3801 00000F4C 8CD8 mov ax,ds - 3802 00000F4E 8ED0 mov ss,ax - 3803 ;assume ss:DATARES - 3804 ;;;mov sp,offset DATARES:RStack - 3805 ;;mov sp,53Eh - 3806 ; 05/06/2023 - 3807 ;;mov sp,60Ah ; MSDOS 6.22 COMMAND.COM - 3808 ;mov sp,637h ; PCDOS 7.1 COMMAND.COM ; 19/07/2024 - 3809 00000F50 BC[2E05] mov sp,RStack - 3810 - 3811 ;; mov ds,ax - 3812 - 3813 ;assume ds:DATARES - 3814 - 3815 ; MSDOS 3.3 - 3816 ;mov ax,cs - 3817 ;mov ss,ax - 3818 ;mov sp,RSTACK - 3819 ;mov ds,ax - 3820 - 3821 00000F53 E88500 call HeadFix ; close files, restore stdin, stdout - 3822 00000F56 31ED xor bp,bp ; flag command ok - 3823 00000F58 B8FFFF mov ax,-1 - 3824 00000F5B 8706[A702] xchg ax,[VerVal] - 3825 00000F5F 83F8FF cmp ax,-1 - 3826 00000F62 7404 je short NoSetVer - 3827 00000F64 B42E mov ah,2Eh - 3828 ;mov ah,SET_VERIFY_ON_WRITE ; 2Eh ; AL has correct value - 3829 00000F66 CD21 int 21h ; DOS - SET VERIFY FLAG - 3830 ; DL = 00h, AL = 01h VERIFY on / 00h VERIFY off - 3831 NoSetVer: - 3832 00000F68 833E[A502]FF cmp word [SingleCom],-1 - 3833 00000F6D 7503 jne short NoSng - 3834 00000F6F E9C9FE jmp FatalRet2 ; we have finished the single command - 3835 NoSng: - 3836 00000F72 E88101 call ChkSum ; check the transient - 3837 ;cmp dx,[Sum] - 3838 ;je short HavCom ; transient ok - 3839 - 3840 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 3841 %if 0 - 3842 ; 12/01/2023 - 3843 jz short HavCom - 3844 - 3845 %else ; PCDOS 7.1 COMMAND.COM - 3846 00000F75 7505 jnz short Bogus_Com - 3847 00000F77 E8A701 call chk_transient - 3848 00000F7A 7417 jz short HavCom - 3849 %endif - 3850 - 3851 Bogus_Com: - 3852 00000F7C C606[4802]01 mov byte [Loading],1 ; flag DskErr routine - 3853 00000F81 E82801 call LoadCom - 3854 ChkSame: - 3855 00000F84 E86F01 call ChkSum - 3856 ;cmp dx,[Sum] - 3857 ;je short HavCom ; same command - 3858 - 3859 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 3860 %if 0 - 3861 ; 12/01/2023 - 3862 jz short HavCom - 3863 - 3864 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 3865 %else ; PCDOS 7.1 COMMAND.COM - 3866 00000F87 7505 jnz short Also_Bogus - 3867 00000F89 E89501 call chk_transient - 3868 00000F8C 7405 jz short HavCom - 3869 %endif - 3870 Also_Bogus: - 3871 00000F8E E85D01 call WrongCom - 3872 00000F91 EBF1 jmp short ChkSame - 3873 - 3874 ; 12/01/2023 - 3875 ;HavCom: - 3876 ; ; 25/09/2018 - 3877 ; mov ax,(CHAR_OPER*256) ; 3700h - 3878 ; int 21h ; DOS - 2+ internal - GET SWITCHAR/AVAILDEV - 3879 ; ; Return: AL = FFh unsupported subfunction - 3880 ; ; DL = current switch character - 3881 ; mov [RSWITCHAR],dl - 3882 ; cmp dl,'/' - 3883 ; jnz short USESLASH - 3884 ; ;mov cl,'\' - 3885 ; ;mov [RDIRCHAR],cl - 3886 ; mov byte [RDIRCHAR],'\' - 3887 ;USESLASH: - 3888 - 3889 HavCom: - 3890 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 3891 00000F93 C606[4802]00 mov byte [Loading],0 ; flag to DskErr - 3892 ;;;mov si,offset DATARES:TranVars - 3893 ;;mov si,453h ; MSDOS 5.0 COMMAND.COM - 3894 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 3895 ;mov si,51Dh ; MSDOS 6.22 COMMAND.COM - 3896 ; 19/07/2024 - 3897 ;mov si,551h ; PCDOS 7.1 COMMAND.COM - 3898 00000F98 BE[4804] mov si,TranVars - 3899 ;;;mov di,offset TRANGROUP:HeadCall - 3900 ;;mov di,8D75h ; MSDOS 5.0 COMMAND.COM - 3901 ; 05/06/2023 - 3902 ;mov di,0A303h ; MSDOS 6.22 COMMAND.COM - 3903 ; 19/07/2024 - 3904 ;mov di,0A082h ; PCDOS 7.1 COMMAND.COM - 3905 00000F9B BF[F39B] mov di,HEADCALL - 3906 00000F9E 8E06[8F02] mov es,[TrnSeg] - 3907 00000FA2 FC cld - 3908 ;;;mov cx,467h ; MSDOS 5.0 COMMAND.COM - 3909 ;;mov cx,533h ; MSDOS 6.22 COMMAND.COM - 3910 ;mov cx,565h ; PCDOS 7.1 COMMAND.COM - 3911 00000FA3 B9[5C04] mov cx,TranVarEnd - 3912 00000FA6 29F1 sub cx,si - 3913 00000FA8 F3A4 rep movsb ; transfer info to transient - 3914 00000FAA A1[9502] mov ax,[MemSiz] - 3915 00000FAD A30200 mov [PDB.BLOCK_LEN],ax ; mov [ds:2],ax ; adjust my own header - 3916 - 3917 ;*** TJmp - jump-off to transient - 3918 ; - 3919 ; Public label so debugger can find this spot. - 3920 - 3921 TJmp: ; 12/01/2023 - 3922 00000FB0 FF2E[8D02] jmp far [Trans] ; jmp dword ptr Trans + 3755 00000F23 3B1E[8F02] cmp bx,[TrnSeg] ; Segment still the same? + 3756 00000F27 7423 je short LodCom1 ; yes, dont copy + 3757 + 3758 ;Check if the new segment is above or below the current move. If the new + 3759 ;segment is above (i.e new block is larger than previous block), then we + 3760 ;have to move in the reverse direction + 3761 + 3762 ;;mov cx,98C5h + 3763 ; 05/06/2023 + 3764 ; MSDOS 6.22 COMMAND.COM - RESGROUP:106Ah (CODERES:021Ah) + 3765 ;mov cx,0AF95h + 3766 ;;mov cx,0AA9Ah ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 3767 00000F29 B90BA6 mov cx,TRANSPACEEND ; cx = length to move + 3768 00000F2C 7707 ja short mov_down ; new seg > old seg, reverse move + 3769 00000F2E 31F6 xor si,si ; normal move + 3770 00000F30 89F7 mov di,si + 3771 00000F32 FC cld + 3772 00000F33 EB06 jmp short copy_trans + 3773 mov_down: + 3774 00000F35 89CE mov si,cx ; reverse move, start from end + 3775 00000F37 4E dec si + 3776 00000F38 89F7 mov di,si + 3777 00000F3A FD std + 3778 copy_trans: + 3779 00000F3B 1E push ds + 3780 00000F3C 06 push es + 3781 00000F3D 8EC3 mov es,bx ; dest segment + 3782 00000F3F 8E1E[8F02] mov ds,[TrnSeg] ; source segment + 3783 ;assume ds:nothing + 3784 + 3785 00000F43 F3A4 rep movsb ; copy transient + 3786 00000F45 FC cld + 3787 00000F46 07 pop es + 3788 00000F47 1F pop ds + 3789 ;assume ds:DATARES + 3790 + 3791 ;M038; End of changes + 3792 + 3793 ;mov [cs:TrnSeg],bx ; new location of transient + 3794 ; 12/01/2023 + 3795 00000F48 891E[8F02] mov [TrnSeg],bx + 3796 + 3797 LodCom1: + 3798 ;; mov ax,cs + 3799 ;; mov ss,ax + 3800 ;SR; At this point ds = DATARES which is where the stack is located + 3801 + 3802 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 3803 ; MSDOS 5.0 (& MSDOS 6.0-6.22) + 3804 00000F4C 8CD8 mov ax,ds + 3805 00000F4E 8ED0 mov ss,ax + 3806 ;assume ss:DATARES + 3807 ;;;mov sp,offset DATARES:RStack + 3808 ;;mov sp,53Eh + 3809 ; 05/06/2023 + 3810 ;;mov sp,60Ah ; MSDOS 6.22 COMMAND.COM + 3811 ;mov sp,637h ; PCDOS 7.1 COMMAND.COM ; 19/07/2024 + 3812 00000F50 BC[2E05] mov sp,RStack + 3813 + 3814 ;; mov ds,ax + 3815 + 3816 ;assume ds:DATARES + 3817 + 3818 ; MSDOS 3.3 + 3819 ;mov ax,cs + 3820 ;mov ss,ax + 3821 ;mov sp,RSTACK + 3822 ;mov ds,ax + 3823 + 3824 00000F53 E88500 call HeadFix ; close files, restore stdin, stdout + 3825 00000F56 31ED xor bp,bp ; flag command ok + 3826 00000F58 B8FFFF mov ax,-1 + 3827 00000F5B 8706[A702] xchg ax,[VerVal] + 3828 00000F5F 83F8FF cmp ax,-1 + 3829 00000F62 7404 je short NoSetVer + 3830 00000F64 B42E mov ah,2Eh + 3831 ;mov ah,SET_VERIFY_ON_WRITE ; 2Eh ; AL has correct value + 3832 00000F66 CD21 int 21h ; DOS - SET VERIFY FLAG + 3833 ; DL = 00h, AL = 01h VERIFY on / 00h VERIFY off + 3834 NoSetVer: + 3835 00000F68 833E[A502]FF cmp word [SingleCom],-1 + 3836 00000F6D 7503 jne short NoSng + 3837 00000F6F E9C9FE jmp FatalRet2 ; we have finished the single command + 3838 NoSng: + 3839 00000F72 E88101 call ChkSum ; check the transient + 3840 ;cmp dx,[Sum] + 3841 ;je short HavCom ; transient ok + 3842 + 3843 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 3844 %if 0 + 3845 ; 12/01/2023 + 3846 jz short HavCom + 3847 + 3848 %else ; PCDOS 7.1 COMMAND.COM + 3849 00000F75 7505 jnz short Bogus_Com + 3850 00000F77 E8A701 call chk_transient + 3851 00000F7A 7417 jz short HavCom + 3852 %endif + 3853 + 3854 Bogus_Com: + 3855 00000F7C C606[4802]01 mov byte [Loading],1 ; flag DskErr routine + 3856 00000F81 E82801 call LoadCom + 3857 ChkSame: + 3858 00000F84 E86F01 call ChkSum + 3859 ;cmp dx,[Sum] + 3860 ;je short HavCom ; same command + 3861 + 3862 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 3863 %if 0 + 3864 ; 12/01/2023 + 3865 jz short HavCom + 3866 + 3867 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 3868 %else ; PCDOS 7.1 COMMAND.COM + 3869 00000F87 7505 jnz short Also_Bogus + 3870 00000F89 E89501 call chk_transient + 3871 00000F8C 7405 jz short HavCom + 3872 %endif + 3873 Also_Bogus: + 3874 00000F8E E85D01 call WrongCom + 3875 00000F91 EBF1 jmp short ChkSame + 3876 + 3877 ; 12/01/2023 + 3878 ;HavCom: + 3879 ; ; 25/09/2018 + 3880 ; mov ax,(CHAR_OPER*256) ; 3700h + 3881 ; int 21h ; DOS - 2+ internal - GET SWITCHAR/AVAILDEV + 3882 ; ; Return: AL = FFh unsupported subfunction + 3883 ; ; DL = current switch character + 3884 ; mov [RSWITCHAR],dl + 3885 ; cmp dl,'/' + 3886 ; jnz short USESLASH + 3887 ; ;mov cl,'\' + 3888 ; ;mov [RDIRCHAR],cl + 3889 ; mov byte [RDIRCHAR],'\' + 3890 ;USESLASH: + 3891 + 3892 HavCom: + 3893 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 3894 00000F93 C606[4802]00 mov byte [Loading],0 ; flag to DskErr + 3895 ;;;mov si,offset DATARES:TranVars + 3896 ;;mov si,453h ; MSDOS 5.0 COMMAND.COM + 3897 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 3898 ;mov si,51Dh ; MSDOS 6.22 COMMAND.COM + 3899 ; 19/07/2024 + 3900 ;mov si,551h ; PCDOS 7.1 COMMAND.COM + 3901 00000F98 BE[4804] mov si,TranVars + 3902 ;;;mov di,offset TRANGROUP:HeadCall + 3903 ;;mov di,8D75h ; MSDOS 5.0 COMMAND.COM + 3904 ; 05/06/2023 + 3905 ;mov di,0A303h ; MSDOS 6.22 COMMAND.COM + 3906 ; 19/07/2024 + 3907 ;mov di,0A082h ; PCDOS 7.1 COMMAND.COM + 3908 00000F9B BF[F39B] mov di,HEADCALL + 3909 00000F9E 8E06[8F02] mov es,[TrnSeg] + 3910 00000FA2 FC cld + 3911 ;;;mov cx,467h ; MSDOS 5.0 COMMAND.COM + 3912 ;;mov cx,533h ; MSDOS 6.22 COMMAND.COM + 3913 ;mov cx,565h ; PCDOS 7.1 COMMAND.COM + 3914 00000FA3 B9[5C04] mov cx,TranVarEnd + 3915 00000FA6 29F1 sub cx,si + 3916 00000FA8 F3A4 rep movsb ; transfer info to transient + 3917 00000FAA A1[9502] mov ax,[MemSiz] + 3918 00000FAD A30200 mov [PDB.BLOCK_LEN],ax ; mov [ds:2],ax ; adjust my own header + 3919 + 3920 ;*** TJmp - jump-off to transient + 3921 ; + 3922 ; Public label so debugger can find this spot. 3923 - 3924 ;*** TRemCheck - far version of RemCheck for transient - 3925 - 3926 TRemCheck: - 3927 ; 12/01/2023 - 3928 00000FB4 1F pop ds ; ds = DATARES - 3929 00000FB5 83C402 add sp,2 ; discard old value of ds - 3930 - 3931 00000FB8 E80100 call RemCheck - 3932 00000FBB CB retf + 3924 TJmp: ; 12/01/2023 + 3925 00000FB0 FF2E[8D02] jmp far [Trans] ; jmp dword ptr Trans + 3926 + 3927 ;*** TRemCheck - far version of RemCheck for transient + 3928 + 3929 TRemCheck: + 3930 ; 12/01/2023 + 3931 00000FB4 1F pop ds ; ds = DATARES + 3932 00000FB5 83C402 add sp,2 ; discard old value of ds 3933 - 3934 ;*** RemCheck - 3935 ; - 3936 ; ENTRY AL = drive (0=default, 1=A, ...) - 3937 ; - 3938 ; EXIT ZR set if removeable media - 3939 ; ZR clear if fixed media + 3934 00000FB8 E80100 call RemCheck + 3935 00000FBB CB retf + 3936 + 3937 ;*** RemCheck + 3938 ; + 3939 ; ENTRY AL = drive (0=default, 1=A, ...) 3940 ; - 3941 ; USED none - 3942 - 3943 ; 12/01/2023 - 3944 RemCheck: - 3945 00000FBC 50 push ax - 3946 00000FBD 53 push bx - 3947 00000FBE 89C3 mov bx,ax - 3948 00000FC0 B80844 mov ax,4408h - 3949 ;mov ax,(IOCTL<<8)+8 ; 4408h - 3950 00000FC3 CD21 int 21h ; DOS - 2+ - IOCTL - - 3951 00000FC5 7304 jnc short rcCont - 3952 - 3953 ; If an error occurred, assume the media is non-removable. - 3954 ; AX contains the non-zero error code from the int 21, so - 3955 ; 'or ax,ax; sets non-zero. This behavior makes network drives - 3956 ; appear to be non-removable. - 3957 - 3958 00000FC7 09C0 or ax,ax - 3959 00000FC9 EB05 jmp short ResRegs - 3960 rcCont: - 3961 00000FCB 83E001 and ax,1 - 3962 00000FCE F7D0 not ax - 3963 ResRegs: - 3964 00000FD0 5B pop bx - 3965 00000FD1 58 pop ax - 3966 00000FD2 C3 retn - 3967 - 3968 ;*** THeadFix - 3969 ; - 3970 ; Far version of HeadFix, called from transient. - 3971 - 3972 THeadFix: - 3973 ; 12/01/2023 - 3974 00000FD3 1F pop ds ; ds = DATARES - 3975 00000FD4 83C402 add sp,2 ; discard old ds value on stack - 3976 - 3977 00000FD7 E80100 call HeadFix - 3978 00000FDA CB retf + 3941 ; EXIT ZR set if removeable media + 3942 ; ZR clear if fixed media + 3943 ; + 3944 ; USED none + 3945 + 3946 ; 12/01/2023 + 3947 RemCheck: + 3948 00000FBC 50 push ax + 3949 00000FBD 53 push bx + 3950 00000FBE 89C3 mov bx,ax + 3951 00000FC0 B80844 mov ax,4408h + 3952 ;mov ax,(IOCTL<<8)+8 ; 4408h + 3953 00000FC3 CD21 int 21h ; DOS - 2+ - IOCTL - + 3954 00000FC5 7304 jnc short rcCont + 3955 + 3956 ; If an error occurred, assume the media is non-removable. + 3957 ; AX contains the non-zero error code from the int 21, so + 3958 ; 'or ax,ax; sets non-zero. This behavior makes network drives + 3959 ; appear to be non-removable. + 3960 + 3961 00000FC7 09C0 or ax,ax + 3962 00000FC9 EB05 jmp short ResRegs + 3963 rcCont: + 3964 00000FCB 83E001 and ax,1 + 3965 00000FCE F7D0 not ax + 3966 ResRegs: + 3967 00000FD0 5B pop bx + 3968 00000FD1 58 pop ax + 3969 00000FD2 C3 retn + 3970 + 3971 ;*** THeadFix + 3972 ; + 3973 ; Far version of HeadFix, called from transient. + 3974 + 3975 THeadFix: + 3976 ; 12/01/2023 + 3977 00000FD3 1F pop ds ; ds = DATARES + 3978 00000FD4 83C402 add sp,2 ; discard old ds value on stack 3979 - 3980 ;*** HeadFix - 3981 - 3982 ; 12/01/2023 - 3983 HeadFix: - 3984 00000FDB E85001 call SetVect ; set vectors to our values - 3985 - 3986 ; Clean up header - 3987 - 3988 ; Bugbug: optimize: - 3989 ; mov word ptr ds:Pdb_Jfn_Table,cx instead of separate bytes + 3980 00000FD7 E80100 call HeadFix + 3981 00000FDA CB retf + 3982 + 3983 ;*** HeadFix + 3984 + 3985 ; 12/01/2023 + 3986 HeadFix: + 3987 00000FDB E85001 call SetVect ; set vectors to our values + 3988 + 3989 ; Clean up header 3990 - 3991 00000FDE 31DB xor bx,bx ; BX = handle = 0 - 3992 00000FE0 8B0E[9F02] mov cx,[Io_Save] ; CX = original stdin, stdout - 3993 ;mov dx,[18h] - 3994 00000FE4 8B161800 mov dx,[PDB.JFN_TABLE] ; DX = current stdin, stdout - 3995 00000FE8 38D1 cmp cl,dl - 3996 00000FEA 7407 je short Chk1 ; stdin matches - 3997 - 3998 ; 19/07/2024 - Retro DOS v5 COMMAND.COM - 3999 %if 0 ; PCDOS 7.1 COMMAND.COM - 4000 mov ah,3Eh - 4001 ;mov ah,CLOSE ; 3Eh - 4002 int 21h ; close stdin - 4003 %else - 4004 ;mov ah,3Eh - 4005 ;call int21h - 4006 ; 19/07/2024 - 4007 00000FEC E86E01 call int21h_close - 4008 %endif - 4009 ;mov [18h],cl - 4010 00000FEF 880E1800 mov [PDB.JFN_TABLE],cl ; restore stdin - 4011 Chk1: - 4012 00000FF3 43 inc bx ; BX = handle = 1 - 4013 00000FF4 38F5 cmp ch,dh - 4014 00000FF6 7407 je short ChkOtherHand ; stdout matches - 4015 - 4016 ; 19/07/2024 - Retro DOS v5 COMMAND.COM - 4017 %if 0 ; PCDOS 7.1 COMMAND.COM - 4018 mov ah,3Eh - 4019 ;mov ah,CLOSE ; 3Eh - 4020 int 21h ; close stdout - 4021 %else - 4022 ;mov ah,3Eh - 4023 ;call int21h - 4024 ; 19/07/2024 - 4025 00000FF8 E86201 call int21h_close - 4026 %endif - 4027 ;mov [19h],ch - 4028 00000FFB 882E1900 mov [PDB.JFN_TABLE+1],ch ; restore stdout - 4029 ChkOtherHand: - 4030 00000FFF 83C304 add bx,4 ; skip handles 2,3,4 - 4031 00001002 B90F00 mov cx,FILPERPROC-5 ; 15 ; CX = # handles to close - 4032 ; (handles 0-4 already done) - 4033 CloseLoop: - 4034 ; 19/07/2024 - Retro DOS v5 COMMAND.COM - 4035 %if 0 ; PCDOS 7.1 COMMAND.COM - 4036 mov ah,3Eh - 4037 ;mov ah,CLOSE ; 3Eh - 4038 int 21h ; close file - 4039 %else - 4040 ;cmp byte [bx+18h],0FFh - 4041 00001005 807F18FF cmp byte [bx+PDB.JFN_TABLE],0FFh - 4042 00001009 7403 je short CloseLoopNxt - 4043 - 4044 ;mov ah,3Eh - 4045 ;call int21h - 4046 ; 19/07/2024 - 4047 0000100B E84F01 call int21h_close - 4048 CloseLoopNxt: - 4049 %endif - 4050 0000100E 43 inc bx ; BX = next handle - 4051 0000100F E2F4 loop CloseLoop - 4052 - 4053 ; MSDOS 6.0 - 4054 ; Bugbug: since this is for transient code, move it there - 4055 - 4056 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4057 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:103Dh) - 4058 ; 19/07/2024 - 4059 ; (PCDOS 7.1 COMMAND.COM - RESGROUP:1119h) - 4060 - 4061 ; M012: remove this CS -> DS. Must've been missed during - 4062 ; purification. - 4063 ;; push ds ; save data segment - 4064 ;; push cs ; get local segment into DS - 4065 ;; pop ds ; - 4066 00001011 803E[C002]FF cmp byte [Append_Flag],-1 ; do we need to reset APPEND? - 4067 00001016 750E jne short Append_Fix_End ; no - just exit - 4068 00001018 B807B7 mov ax,0B707h - 4069 ;mov ax,AppendSetState ; set the state of Append - 4070 0000101B 8B1E[BE02] mov bx,[Append_State] ; back to the original state - 4071 0000101F CD2F int 2Fh ; - 4072 00001021 C606[C002]00 mov byte [Append_Flag],0 ; set append flag to invalid - 4073 Append_Fix_End: ; - 4074 ;; pop ds ; get data segment back - 4075 00001026 C3 retn - 4076 - 4077 ; MSDOS 3.3 - 4078 ;retn + 3991 ; Bugbug: optimize: + 3992 ; mov word ptr ds:Pdb_Jfn_Table,cx instead of separate bytes + 3993 + 3994 00000FDE 31DB xor bx,bx ; BX = handle = 0 + 3995 00000FE0 8B0E[9F02] mov cx,[Io_Save] ; CX = original stdin, stdout + 3996 ;mov dx,[18h] + 3997 00000FE4 8B161800 mov dx,[PDB.JFN_TABLE] ; DX = current stdin, stdout + 3998 00000FE8 38D1 cmp cl,dl + 3999 00000FEA 7407 je short Chk1 ; stdin matches + 4000 + 4001 ; 19/07/2024 - Retro DOS v5 COMMAND.COM + 4002 %if 0 ; PCDOS 7.1 COMMAND.COM + 4003 mov ah,3Eh + 4004 ;mov ah,CLOSE ; 3Eh + 4005 int 21h ; close stdin + 4006 %else + 4007 ;mov ah,3Eh + 4008 ;call int21h + 4009 ; 19/07/2024 + 4010 00000FEC E86E01 call int21h_close + 4011 %endif + 4012 ;mov [18h],cl + 4013 00000FEF 880E1800 mov [PDB.JFN_TABLE],cl ; restore stdin + 4014 Chk1: + 4015 00000FF3 43 inc bx ; BX = handle = 1 + 4016 00000FF4 38F5 cmp ch,dh + 4017 00000FF6 7407 je short ChkOtherHand ; stdout matches + 4018 + 4019 ; 19/07/2024 - Retro DOS v5 COMMAND.COM + 4020 %if 0 ; PCDOS 7.1 COMMAND.COM + 4021 mov ah,3Eh + 4022 ;mov ah,CLOSE ; 3Eh + 4023 int 21h ; close stdout + 4024 %else + 4025 ;mov ah,3Eh + 4026 ;call int21h + 4027 ; 19/07/2024 + 4028 00000FF8 E86201 call int21h_close + 4029 %endif + 4030 ;mov [19h],ch + 4031 00000FFB 882E1900 mov [PDB.JFN_TABLE+1],ch ; restore stdout + 4032 ChkOtherHand: + 4033 00000FFF 83C304 add bx,4 ; skip handles 2,3,4 + 4034 00001002 B90F00 mov cx,FILPERPROC-5 ; 15 ; CX = # handles to close + 4035 ; (handles 0-4 already done) + 4036 CloseLoop: + 4037 ; 19/07/2024 - Retro DOS v5 COMMAND.COM + 4038 %if 0 ; PCDOS 7.1 COMMAND.COM + 4039 mov ah,3Eh + 4040 ;mov ah,CLOSE ; 3Eh + 4041 int 21h ; close file + 4042 %else + 4043 ;cmp byte [bx+18h],0FFh + 4044 00001005 807F18FF cmp byte [bx+PDB.JFN_TABLE],0FFh + 4045 00001009 7403 je short CloseLoopNxt + 4046 + 4047 ;mov ah,3Eh + 4048 ;call int21h + 4049 ; 19/07/2024 + 4050 0000100B E84F01 call int21h_close + 4051 CloseLoopNxt: + 4052 %endif + 4053 0000100E 43 inc bx ; BX = next handle + 4054 0000100F E2F4 loop CloseLoop + 4055 + 4056 ; MSDOS 6.0 + 4057 ; Bugbug: since this is for transient code, move it there + 4058 + 4059 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4060 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:103Dh) + 4061 ; 19/07/2024 + 4062 ; (PCDOS 7.1 COMMAND.COM - RESGROUP:1119h) + 4063 + 4064 ; M012: remove this CS -> DS. Must've been missed during + 4065 ; purification. + 4066 ;; push ds ; save data segment + 4067 ;; push cs ; get local segment into DS + 4068 ;; pop ds ; + 4069 00001011 803E[C002]FF cmp byte [Append_Flag],-1 ; do we need to reset APPEND? + 4070 00001016 750E jne short Append_Fix_End ; no - just exit + 4071 00001018 B807B7 mov ax,0B707h + 4072 ;mov ax,AppendSetState ; set the state of Append + 4073 0000101B 8B1E[BE02] mov bx,[Append_State] ; back to the original state + 4074 0000101F CD2F int 2Fh ; + 4075 00001021 C606[C002]00 mov byte [Append_Flag],0 ; set append flag to invalid + 4076 Append_Fix_End: ; + 4077 ;; pop ds ; get data segment back + 4078 00001026 C3 retn 4079 - 4080 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4081 ; PCDOS 7.1 COMMAND.COM - RESGROUP:112Fh + 4080 ; MSDOS 3.3 + 4081 ;retn 4082 - 4083 ;*** SavHand - save current program's stdin/out & set to our stderr - 4084 ; - 4085 ; ENTRY nothing - 4086 ; - 4087 ; EXIT nothing - 4088 ; - 4089 ; USED flags - 4090 ; - 4091 ; EFFECTS - 4092 ; Handle01 = current program's stdin,stdout JFN entries - 4093 ; current program's stdin,stdout set to our stderr - 4094 ; - 4095 - 4096 ;SR; - 4097 ; Changed ds = DATARES. We need it to access our JFN_Table - 4098 ; Called from ContC ( ds = DATARES ) and DskErr ( ds = DATARES ). - 4099 - 4100 SavHand: - 4101 ;assume ds:DATARES,es:NOTHING,ss:NOTHING + 4083 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4084 ; PCDOS 7.1 COMMAND.COM - RESGROUP:112Fh + 4085 + 4086 ;*** SavHand - save current program's stdin/out & set to our stderr + 4087 ; + 4088 ; ENTRY nothing + 4089 ; + 4090 ; EXIT nothing + 4091 ; + 4092 ; USED flags + 4093 ; + 4094 ; EFFECTS + 4095 ; Handle01 = current program's stdin,stdout JFN entries + 4096 ; current program's stdin,stdout set to our stderr + 4097 ; + 4098 + 4099 ;SR; + 4100 ; Changed ds = DATARES. We need it to access our JFN_Table + 4101 ; Called from ContC ( ds = DATARES ) and DskErr ( ds = DATARES ). 4102 - 4103 ; 12/01/2023 - 4104 ;push ds ; MSDOS 3.3 + 4103 SavHand: + 4104 ;assume ds:DATARES,es:NOTHING,ss:NOTHING 4105 - 4106 00001027 53 push bx ;preserve registers - 4107 00001028 50 push ax - 4108 ; 12/01/2023 - 4109 00001029 06 push es - 4110 0000102A 1E push ds ; save DATARES value - 4111 - 4112 0000102B B451 mov ah,51h - 4113 ;mov ah,GET_CURRENT_PDB ; 51h + 4106 ; 12/01/2023 + 4107 ;push ds ; MSDOS 3.3 + 4108 + 4109 00001027 53 push bx ;preserve registers + 4110 00001028 50 push ax + 4111 ; 12/01/2023 + 4112 00001029 06 push es + 4113 0000102A 1E push ds ; save DATARES value 4114 - 4115 ; 19/07/2024 - Retro DOS v5 COMMAND.COM - 4116 %if 0 ; PCDOS 7.1 COMMAND.COM - 4117 int 21h ; BX = user's header seg addr - 4118 %else - 4119 0000102D E82F01 call int21h - 4120 %endif - 4121 00001030 8EDB mov ds,bx ; DS = user's header seg addr - 4122 ;lds bx,[34h] - 4123 00001032 C51E3400 lds bx,[PDB.JFN_Pointer] ; DS:BX = ptr to JFN table - 4124 00001036 8B07 mov ax,[bx] ; AX = stdin,stdout JFN's - 4125 ; 12/01/2023 - 4126 00001038 07 pop es ; es = DATARES - 4127 00001039 06 push es ; save it back on stack - 4128 0000103A 26A3[4602] mov [es:Handle01],ax ; save user's stdin, stdout - 4129 ;mov [cs:HANDLE01],ax - 4130 - 4131 ;SR; - 4132 ; Use es to address Handle01 & our JFN_Table + 4115 0000102B B451 mov ah,51h + 4116 ;mov ah,GET_CURRENT_PDB ; 51h + 4117 + 4118 ; 19/07/2024 - Retro DOS v5 COMMAND.COM + 4119 %if 0 ; PCDOS 7.1 COMMAND.COM + 4120 int 21h ; BX = user's header seg addr + 4121 %else + 4122 0000102D E82F01 call int21h + 4123 %endif + 4124 00001030 8EDB mov ds,bx ; DS = user's header seg addr + 4125 ;lds bx,[34h] + 4126 00001032 C51E3400 lds bx,[PDB.JFN_Pointer] ; DS:BX = ptr to JFN table + 4127 00001036 8B07 mov ax,[bx] ; AX = stdin,stdout JFN's + 4128 ; 12/01/2023 + 4129 00001038 07 pop es ; es = DATARES + 4130 00001039 06 push es ; save it back on stack + 4131 0000103A 26A3[4602] mov [es:Handle01],ax ; save user's stdin, stdout + 4132 ;mov [cs:HANDLE01],ax 4133 - 4134 ; 12/01/2023 - 4135 ;mov al,[es:1Ah] - 4136 0000103E 26A01A00 mov al,[es:PDB.JFN_TABLE+2] ; AL = COMMAND stderr - 4137 ;mov al,[cs:PDB.JFN_TABLE+2] ; mov al,[cs:1Ah] - 4138 00001042 88C4 mov ah,al ; AH = COMMAND stderr - 4139 00001044 8907 mov [bx],ax ; set user's stdin/out to our stderr - 4140 ; 12/01/2023 - 4141 00001046 1F pop ds ; restore registers - 4142 00001047 07 pop es - 4143 00001048 58 pop ax - 4144 00001049 5B pop bx - 4145 ;pop ds ; MSDOS 3.3 - 4146 0000104A C3 retn - 4147 - 4148 ;assume ds:DATARES - 4149 GetComDsk2: - 4150 0000104B E81F00 call GetComDsk - 4151 0000104E E9FBFE jmp LodCom1 ; memory already allocated - 4152 - 4153 RestHand: - 4154 00001051 1E push ds - 4155 00001052 53 push bx ; restore stdin, stdout to user - 4156 00001053 50 push ax - 4157 ; 12/01/2023 - 4158 00001054 B451 mov ah,51h - 4159 ;mov ah,GET_CURRENT_PDB ; 51h - 4160 00001056 CD21 int 21h ; point to user's header - 4161 00001058 A1[4602] mov ax,[Handle01] - 4162 0000105B 8EDB mov ds,bx - 4163 ;assume ds:NOTHING - 4164 ;lds bx,[34h] - 4165 0000105D C51E3400 lds bx,[PDB.JFN_Pointer] ; DS:BX = ptr to jfn table - 4166 00001061 8907 mov [bx],ax ; stuff his old 0 and 1 - 4167 00001063 58 pop ax - 4168 00001064 5B pop bx - 4169 00001065 1F pop ds - 4170 00001066 C3 retn - 4171 - 4172 ;assume ds:DATARES,ss:DATARES - 4173 Hopeless: - 4174 00001067 BA[DC05] mov dx,COMBAD - 4175 0000106A E9AEFD jmp FatalC - 4176 - 4177 GetComDsk: - 4178 0000106D A0[9402] mov al,[ComDrv] - 4179 00001070 E849FF call RemCheck - 4180 00001073 75F2 jnz short Hopeless ; non-removable media - 4181 GetComDsk3: - 4182 00001075 81FA[DC05] cmp dx,COMBAD ; cmp dx,offset DATARES:ComBad - 4183 00001079 7503 jne short GetComDsk4 - 4184 ;;mov dx,offset DATARES:ComBad ; DX = ptr to msg - 4185 ; 12/01/2023 - 4186 ;;mov dx,COMBAD ; (MSDOS 5.0 COMMAND.COM - RESGROUP:10A6h) - 4187 ; 05/06/2023 - 4188 ;mov dx,COMBAD ; (MSDOS 6.22 COMMAND.COM - RESGROUP:11B6h) - 4189 ;invoke RPrint ; say COMMAND is invalid - 4190 0000107B E85D03 call RPrint - 4191 ;call RDISPMSG - 4192 - 4193 GetComDsk4: - 4194 - 4195 ; Bugbug: there's always a drive here? No need to check? - 4196 - 4197 0000107E 803E[2F02]00 cmp byte [PutBackDrv],0 ; is there a drive in the comspec? - 4198 00001083 750A jne short Users_Drive ; yes - use it - 4199 00001085 B419 mov ah,19h - 4200 ;mov ah,GET_DEFAULT_DRIVE ; 19h ; use default drive - 4201 - 4202 ; 19/07/2024 - Retro DOS v5 COMMAND.COM - 4203 %if 0 ; PCDOS 7.1 COMMAND.COM - 4204 int 21h ; BX = user's header seg addr - 4205 %else - 4206 00001087 E8D500 call int21h - 4207 %endif - 4208 0000108A 0441 add al,"A" ; convert to ascii - 4209 0000108C A2[2F02] mov [PutBackDrv],al ; put in message to print out - 4210 - 4211 Users_Drive: - 4212 ; 12/01/2023 - 4213 ; MSDOS 6.0 - 4214 0000108F BA[F205] mov dx,PUTBACKMSG ; prompt for diskette - 4215 ;mov si,offset DATARES:PutBackSubst - 4216 ;invoke RPrint - 4217 00001092 BE[2902] mov si,PutBackSubst ; containing COMMAND - 4218 00001095 E84303 call RPrint - 4219 ;mov dx,offset DATARES:Prompt - 4220 ;invoke RPrint - 4221 00001098 BA[1406] mov dx,PROMPT ; "Press any key" - 4222 0000109B E83D03 call RPrint - 4223 - 4224 ; MSDOS 3.3 - 4225 ;mov dx,PUTBACKMSG ; prompt for diskette - 4226 ;call RDISPMSG - 4227 ;mov dx,[PUTBACKSUBSTPTR] - 4228 ;mov si,[COMSPEC_END] - 4229 ;mov byte [si+1],'$' - 4230 ;call RDISPMSG - 4231 ;mov byte [si+1],0 - 4232 ;mov dx,PROMPT + 4134 ;SR; + 4135 ; Use es to address Handle01 & our JFN_Table + 4136 + 4137 ; 12/01/2023 + 4138 ;mov al,[es:1Ah] + 4139 0000103E 26A01A00 mov al,[es:PDB.JFN_TABLE+2] ; AL = COMMAND stderr + 4140 ;mov al,[cs:PDB.JFN_TABLE+2] ; mov al,[cs:1Ah] + 4141 00001042 88C4 mov ah,al ; AH = COMMAND stderr + 4142 00001044 8907 mov [bx],ax ; set user's stdin/out to our stderr + 4143 ; 12/01/2023 + 4144 00001046 1F pop ds ; restore registers + 4145 00001047 07 pop es + 4146 00001048 58 pop ax + 4147 00001049 5B pop bx + 4148 ;pop ds ; MSDOS 3.3 + 4149 0000104A C3 retn + 4150 + 4151 ;assume ds:DATARES + 4152 GetComDsk2: + 4153 0000104B E81F00 call GetComDsk + 4154 0000104E E9FBFE jmp LodCom1 ; memory already allocated + 4155 + 4156 RestHand: + 4157 00001051 1E push ds + 4158 00001052 53 push bx ; restore stdin, stdout to user + 4159 00001053 50 push ax + 4160 ; 12/01/2023 + 4161 00001054 B451 mov ah,51h + 4162 ;mov ah,GET_CURRENT_PDB ; 51h + 4163 00001056 CD21 int 21h ; point to user's header + 4164 00001058 A1[4602] mov ax,[Handle01] + 4165 0000105B 8EDB mov ds,bx + 4166 ;assume ds:NOTHING + 4167 ;lds bx,[34h] + 4168 0000105D C51E3400 lds bx,[PDB.JFN_Pointer] ; DS:BX = ptr to jfn table + 4169 00001061 8907 mov [bx],ax ; stuff his old 0 and 1 + 4170 00001063 58 pop ax + 4171 00001064 5B pop bx + 4172 00001065 1F pop ds + 4173 00001066 C3 retn + 4174 + 4175 ;assume ds:DATARES,ss:DATARES + 4176 Hopeless: + 4177 00001067 BA[DC05] mov dx,COMBAD + 4178 0000106A E9AEFD jmp FatalC + 4179 + 4180 GetComDsk: + 4181 0000106D A0[9402] mov al,[ComDrv] + 4182 00001070 E849FF call RemCheck + 4183 00001073 75F2 jnz short Hopeless ; non-removable media + 4184 GetComDsk3: + 4185 00001075 81FA[DC05] cmp dx,COMBAD ; cmp dx,offset DATARES:ComBad + 4186 00001079 7503 jne short GetComDsk4 + 4187 ;;mov dx,offset DATARES:ComBad ; DX = ptr to msg + 4188 ; 12/01/2023 + 4189 ;;mov dx,COMBAD ; (MSDOS 5.0 COMMAND.COM - RESGROUP:10A6h) + 4190 ; 05/06/2023 + 4191 ;mov dx,COMBAD ; (MSDOS 6.22 COMMAND.COM - RESGROUP:11B6h) + 4192 ;invoke RPrint ; say COMMAND is invalid + 4193 0000107B E85D03 call RPrint + 4194 ;call RDISPMSG + 4195 + 4196 GetComDsk4: + 4197 + 4198 ; Bugbug: there's always a drive here? No need to check? + 4199 + 4200 0000107E 803E[2F02]00 cmp byte [PutBackDrv],0 ; is there a drive in the comspec? + 4201 00001083 750A jne short Users_Drive ; yes - use it + 4202 00001085 B419 mov ah,19h + 4203 ;mov ah,GET_DEFAULT_DRIVE ; 19h ; use default drive + 4204 + 4205 ; 19/07/2024 - Retro DOS v5 COMMAND.COM + 4206 %if 0 ; PCDOS 7.1 COMMAND.COM + 4207 int 21h ; BX = user's header seg addr + 4208 %else + 4209 00001087 E8D500 call int21h + 4210 %endif + 4211 0000108A 0441 add al,"A" ; convert to ascii + 4212 0000108C A2[2F02] mov [PutBackDrv],al ; put in message to print out + 4213 + 4214 Users_Drive: + 4215 ; 12/01/2023 + 4216 ; MSDOS 6.0 + 4217 0000108F BA[F205] mov dx,PUTBACKMSG ; prompt for diskette + 4218 ;mov si,offset DATARES:PutBackSubst + 4219 ;invoke RPrint + 4220 00001092 BE[2902] mov si,PutBackSubst ; containing COMMAND + 4221 00001095 E84303 call RPrint + 4222 ;mov dx,offset DATARES:Prompt + 4223 ;invoke RPrint + 4224 00001098 BA[1406] mov dx,PROMPT ; "Press any key" + 4225 0000109B E83D03 call RPrint + 4226 + 4227 ; MSDOS 3.3 + 4228 ;mov dx,PUTBACKMSG ; prompt for diskette + 4229 ;call RDISPMSG + 4230 ;mov dx,[PUTBACKSUBSTPTR] + 4231 ;mov si,[COMSPEC_END] + 4232 ;mov byte [si+1],'$' 4233 ;call RDISPMSG - 4234 - 4235 ;call GetRawFlushedByte - 4236 ;retn - 4237 ; 12/01/2023 - 4238 ;jmp short GetRawFlushedByte - 4239 - 4240 ;*** GetRawFlushedByte - flush world and get raw input - 4241 - 4242 GetRawFlushedByte: - 4243 ; 12/01/2023 - 4244 0000109E B8070C mov ax,0C07h - 4245 ;mov ax,(STD_CON_INPUT_FLUSH<<8) | RAW_CON_INPUT ; 0C07h - 4246 000010A1 CD21 int 21h ; get char without testing or echo - 4247 000010A3 B8000C mov ax,0C00h - 4248 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + 0 ; 0C00h - 4249 000010A6 CD21 int 21h - 4250 - 4251 ; Bugbug: get rid of this return and the following retz. - 4252 - 4253 LoadCom_retn: - 4254 000010A8 C3 retn + 4234 ;mov byte [si+1],0 + 4235 ;mov dx,PROMPT + 4236 ;call RDISPMSG + 4237 + 4238 ;call GetRawFlushedByte + 4239 ;retn + 4240 ; 12/01/2023 + 4241 ;jmp short GetRawFlushedByte + 4242 + 4243 ;*** GetRawFlushedByte - flush world and get raw input + 4244 + 4245 GetRawFlushedByte: + 4246 ; 12/01/2023 + 4247 0000109E B8070C mov ax,0C07h + 4248 ;mov ax,(STD_CON_INPUT_FLUSH<<8) | RAW_CON_INPUT ; 0C07h + 4249 000010A1 CD21 int 21h ; get char without testing or echo + 4250 000010A3 B8000C mov ax,0C00h + 4251 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + 0 ; 0C00h + 4252 000010A6 CD21 int 21h + 4253 + 4254 ; Bugbug: get rid of this return and the following retz. 4255 - 4256 ; 21/04/2023 - 4257 TryDoOpen: - 4258 000010A9 E8C1FF call GetComDsk - 4259 ;jmp short LoadCom - 4260 - 4261 ;*** LoadCom - load in transient - 4262 - 4263 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4264 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:10DAh - CODERES:039Ah) + 4256 LoadCom_retn: + 4257 000010A8 C3 retn + 4258 + 4259 ; 21/04/2023 + 4260 TryDoOpen: + 4261 000010A9 E8C1FF call GetComDsk + 4262 ;jmp short LoadCom + 4263 + 4264 ;*** LoadCom - load in transient 4265 - 4266 LoadCom: - 4267 ;assume ds:DATARES - 4268 - 4269 000010AC 45 inc bp ; flag command read - 4270 - 4271 000010AD BA[4B02] mov dx,ComSpec - 4272 000010B0 B8003D mov ax,3D00h - 4273 ;mov ax,OPEN<<8 ; 3D00h - 4274 000010B3 CD21 int 21h ; open command.com - 4275 000010B5 730B jnc short ReadCom - 4276 ;cmp ax,4 - 4277 000010B7 83F804 cmp ax,ERROR_TOO_MANY_OPEN_FILES - 4278 000010BA 75ED jnz short TryDoOpen - 4279 000010BC BA[9E06] mov dx,NOHANDMES - 4280 000010BF E959FD jmp FatalC ; will never find a handle - 4281 - 4282 ; 21/04/2023 - 4283 ;TryDoOpen: - 4284 ;call GetComDsk - 4285 ;jmp short LoadCom - 4286 - 4287 ReadCom: - 4288 000010C2 89C3 mov bx,ax ; BX = handle - 4289 ;mov dx,offset RESGROUP:TranStart - 4290 ; 05/06/2023 - 4291 ;mov dx,26E0h ; MSDOS 6.22 COMMAND.COM - 4292 ; 19/07/2024 - 4293 ;mov dx,2980h ; PCDOS 7.1 COMMAND.COM - 4294 000010C4 BAD027 mov dx,TRANSTART - 4295 000010C7 31C9 xor cx,cx ; CX:DX = seek loc - 4296 000010C9 B80042 mov ax,4200h - 4297 ;mov ax,LSEEK<<8 ; 4200h - 4298 000010CC CD21 int 21h - 4299 000010CE 7210 jc short WrongCom1 - 4300 ; 12/01/2023 - 4301 ;;mov cx,offset TRANGROUP:TranSpaceEnd - 100h - 4302 ;mov cx,97C5h ; MSDOS 5.0 COMMAND.COM - 4303 ; 05/06/2023 - 4304 ;mov cx,0AE95h ; MSDOS 6.22 COMMAND.COM - 4305 ; 19/07/2024 - 4306 ;mov cx,0A99Ah ; PCDOS 7.1 COMMAND.COM - 4307 000010D0 B90BA5 mov cx,TRANSPACEEND-100h ; 4C5Ch (for original MSDOS 3.3!) - 4308 000010D3 1E push ds - 4309 000010D4 8E1E[8F02] mov ds,[TrnSeg] - 4310 ;assume ds:NOTHING - 4311 000010D8 BA0001 mov dx,100h - 4312 000010DB B43F mov ah,3Fh - 4313 ;mov ah,READ ; 3Fh - 4314 000010DD CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE - 4315 ; BX = file handle, CX = number of bytes to read - 4316 ; DS:DX -> buffer - 4317 000010DF 1F pop ds - 4318 ;assume ds:DATARES - 4319 WrongCom1: - 4320 000010E0 9C pushf - 4321 000010E1 50 push ax - 4322 000010E2 B43E mov ah,3Eh - 4323 ;mov ah,CLOSE ; 3Eh - 4324 000010E4 CD21 int 21h ; close command.com - 4325 000010E6 58 pop ax - 4326 000010E7 9D popf - 4327 000010E8 7204 jc short WrongCom ; error on read - 4328 000010EA 39C8 cmp ax,cx - 4329 ;retz ; size matched - 4330 000010EC 74BA jz short LoadCom_retn - 4331 WrongCom: - 4332 000010EE BA[DC05] mov dx,COMBAD - 4333 000010F1 E879FF call GetComDsk - 4334 000010F4 EBB6 jmp short LoadCom ; try again - 4335 - 4336 ;*** ChkSum - compute transient checksum - 4337 - 4338 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4339 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1129h - 4340 - 4341 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 4342 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1239h - 4343 - 4344 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4345 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1207h - 4346 ChkSum: - 4347 000010F6 1E push ds - 4348 000010F7 8E1E[8F02] mov ds,[TrnSeg] - 4349 000010FB BE0001 mov si,100h - 4350 ;;;mov cx,offset TRANGROUP:TranDataEnd - 100h - 4351 ;;mov cx,87C2h ; MSDOS 5.0 - 4352 ; 05/06/2023 - 4353 ;mov cx,9D53h ; MSDOS 6.22 - 4354 ; 19/07/2024 - 4355 ;mov cx,9B47h ; PCDOS 7.1 COMMAND.COM - 4356 000010FE B9[B896] mov cx,TRANDATAEND-100h ; 3E44h (for original MSDOS 3.3!) - 4357 Check_Sum: - 4358 00001101 FC cld - 4359 00001102 D1E9 shr cx,1 - 4360 00001104 31D2 xor dx,dx - 4361 - 4362 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4363 %if 1 ; PCDOS 7.1 COMMAND.COM - 4364 00001106 C606[D58F]FF mov byte [msg_disp_class],0FFh - 4365 0000110B 8916[D78F] mov [extend_buf_ptr],dx ; 0 - 4366 0000110F 8816[D98F] mov [extend_buf_sub],dl ; 0 - 4367 %endif - 4368 - 4369 Chk: - 4370 00001113 AD lodsw - 4371 00001114 01C2 add dx,ax - 4372 00001116 83D200 adc dx,0 - 4373 00001119 E2F8 loop Chk - 4374 - 4375 ; 04/05/2023 - 4376 0000111B 1F pop ds + 4266 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4267 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:10DAh - CODERES:039Ah) + 4268 + 4269 LoadCom: + 4270 ;assume ds:DATARES + 4271 + 4272 000010AC 45 inc bp ; flag command read + 4273 + 4274 000010AD BA[4B02] mov dx,ComSpec + 4275 000010B0 B8003D mov ax,3D00h + 4276 ;mov ax,OPEN<<8 ; 3D00h + 4277 000010B3 CD21 int 21h ; open command.com + 4278 000010B5 730B jnc short ReadCom + 4279 ;cmp ax,4 + 4280 000010B7 83F804 cmp ax,ERROR_TOO_MANY_OPEN_FILES + 4281 000010BA 75ED jnz short TryDoOpen + 4282 000010BC BA[9E06] mov dx,NOHANDMES + 4283 000010BF E959FD jmp FatalC ; will never find a handle + 4284 + 4285 ; 21/04/2023 + 4286 ;TryDoOpen: + 4287 ;call GetComDsk + 4288 ;jmp short LoadCom + 4289 + 4290 ReadCom: + 4291 000010C2 89C3 mov bx,ax ; BX = handle + 4292 ;mov dx,offset RESGROUP:TranStart + 4293 ; 05/06/2023 + 4294 ;mov dx,26E0h ; MSDOS 6.22 COMMAND.COM + 4295 ; 19/07/2024 + 4296 ;mov dx,2980h ; PCDOS 7.1 COMMAND.COM + 4297 000010C4 BAD027 mov dx,TRANSTART + 4298 000010C7 31C9 xor cx,cx ; CX:DX = seek loc + 4299 000010C9 B80042 mov ax,4200h + 4300 ;mov ax,LSEEK<<8 ; 4200h + 4301 000010CC CD21 int 21h + 4302 000010CE 7210 jc short WrongCom1 + 4303 ; 12/01/2023 + 4304 ;;mov cx,offset TRANGROUP:TranSpaceEnd - 100h + 4305 ;mov cx,97C5h ; MSDOS 5.0 COMMAND.COM + 4306 ; 05/06/2023 + 4307 ;mov cx,0AE95h ; MSDOS 6.22 COMMAND.COM + 4308 ; 19/07/2024 + 4309 ;mov cx,0A99Ah ; PCDOS 7.1 COMMAND.COM + 4310 000010D0 B90BA5 mov cx,TRANSPACEEND-100h ; 4C5Ch (for original MSDOS 3.3!) + 4311 000010D3 1E push ds + 4312 000010D4 8E1E[8F02] mov ds,[TrnSeg] + 4313 ;assume ds:NOTHING + 4314 000010D8 BA0001 mov dx,100h + 4315 000010DB B43F mov ah,3Fh + 4316 ;mov ah,READ ; 3Fh + 4317 000010DD CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE + 4318 ; BX = file handle, CX = number of bytes to read + 4319 ; DS:DX -> buffer + 4320 000010DF 1F pop ds + 4321 ;assume ds:DATARES + 4322 WrongCom1: + 4323 000010E0 9C pushf + 4324 000010E1 50 push ax + 4325 000010E2 B43E mov ah,3Eh + 4326 ;mov ah,CLOSE ; 3Eh + 4327 000010E4 CD21 int 21h ; close command.com + 4328 000010E6 58 pop ax + 4329 000010E7 9D popf + 4330 000010E8 7204 jc short WrongCom ; error on read + 4331 000010EA 39C8 cmp ax,cx + 4332 ;retz ; size matched + 4333 000010EC 74BA jz short LoadCom_retn + 4334 WrongCom: + 4335 000010EE BA[DC05] mov dx,COMBAD + 4336 000010F1 E879FF call GetComDsk + 4337 000010F4 EBB6 jmp short LoadCom ; try again + 4338 + 4339 ;*** ChkSum - compute transient checksum + 4340 + 4341 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4342 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1129h + 4343 + 4344 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 4345 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1239h + 4346 + 4347 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4348 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1207h + 4349 ChkSum: + 4350 000010F6 1E push ds + 4351 000010F7 8E1E[8F02] mov ds,[TrnSeg] + 4352 000010FB BE0001 mov si,100h + 4353 ;;;mov cx,offset TRANGROUP:TranDataEnd - 100h + 4354 ;;mov cx,87C2h ; MSDOS 5.0 + 4355 ; 05/06/2023 + 4356 ;mov cx,9D53h ; MSDOS 6.22 + 4357 ; 19/07/2024 + 4358 ;mov cx,9B47h ; PCDOS 7.1 COMMAND.COM + 4359 000010FE B9[B896] mov cx,TRANDATAEND-100h ; 3E44h (for original MSDOS 3.3!) + 4360 Check_Sum: + 4361 00001101 FC cld + 4362 00001102 D1E9 shr cx,1 + 4363 00001104 31D2 xor dx,dx + 4364 + 4365 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4366 %if 1 ; PCDOS 7.1 COMMAND.COM + 4367 00001106 C606[D58F]FF mov byte [msg_disp_class],0FFh + 4368 0000110B 8916[D78F] mov [extend_buf_ptr],dx ; 0 + 4369 0000110F 8816[D98F] mov [extend_buf_sub],dl ; 0 + 4370 %endif + 4371 + 4372 Chk: + 4373 00001113 AD lodsw + 4374 00001114 01C2 add dx,ax + 4375 00001116 83D200 adc dx,0 + 4376 00001119 E2F8 loop Chk 4377 - 4378 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4379 0000111C 3B16[9702] cmp dx,[Sum] + 4378 ; 04/05/2023 + 4379 0000111B 1F pop ds 4380 - 4381 ;pop ds ; 04/05/2023 - 4382 00001120 C3 retn + 4381 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4382 0000111C 3B16[9702] cmp dx,[Sum] 4383 - 4384 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4385 ; --------------------------------------- - 4386 ; PCDOS 7.1 COMMAND.COM - RESGROUP:122Eh - 4387 %if 1 - 4388 chk_transient: ; check transient portion is valid or not - 4389 00001121 1E push ds - 4390 00001122 8E1E[8F02] mov ds,[TrnSeg] - 4391 00001126 813E[0401]9090 cmp word [TCOMMAND],9090h ; nop, nop - 4392 0000112C 1F pop ds - 4393 0000112D C3 retn - 4394 %endif - 4395 ; --------------------------------------- - 4396 - 4397 ;*** SetVect - set interrupt vectors - 4398 - 4399 SetVect: - 4400 - 4401 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4402 ; PCDOS 7.1 COMMAND.COM - 4403 %if 0 - 4404 ;mov dx,offset DATARES:LodCom_Trap - 4405 ; 12/01/2023 - 4406 mov dx,LodCom_Trap - 4407 ;mov dx,LODCOM ; MSDOS 3.3 - 4408 mov [PDB.EXIT],dx ; mov ds:0Ah,dx - 4409 mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds - 4410 - 4411 mov ax,2522h - 4412 ;mov ax,(SET_INTERRUPT_VECTOR<<8) | 22h ; 2522h - 4413 int 21h - 4414 ;mov dx,offset DATARES:Ctrlc_Trap - 4415 mov dx,Ctrlc_Trap - 4416 ;mov dx,CONTC ; MSDOS 3.3 - 4417 inc al ; 23h - 4418 int 21h - 4419 ;mov dx,offset DATARES:CritErr_Trap - 4420 mov dx,CritErr_Trap - 4421 ;mov dx,CRITERR ; MSDOS 3.3 - 4422 inc al ; 24h - 4423 int 21h - 4424 retn - 4425 %else - 4426 ; PCDOS 7.1 COMMAND.COM - 4427 ;mov dx,LodCom_Trap - 4428 ;mov [PDB.EXIT],dx ; mov ds:0Ah,dx - 4429 ;mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds - 4430 - 4431 ;push es - 4432 ;push bx - 4433 ;xor bx,bx - 4434 ;mov es,bx - 4435 ;mov bl,88h ; INT 22h vector - 4436 ;cli - 4437 ;mov [es:bx],dx - 4438 ;mov [es:bx+2],ds - 4439 ;mov dx,Ctrlc_Trap - 4440 ;mov bl,8Ch ; INT 23h vector - 4441 ;mov [es:bx],dx - 4442 ;mov [es:bx+2],ds - 4443 ;mov dx,CritErr_Trap - 4444 ;mov bl,90h ; INT 24h vector - 4445 ;mov [es:bx],dx - 4446 ;mov [es:bx+2],ds - 4447 ;sti - 4448 ;pop bx - 4449 ;pop es - 4450 ;retn - 4451 - 4452 ; 19/07/2024 - 4453 ; Retro DOS v5.0 COMMAND.COM + 4384 ;pop ds ; 04/05/2023 + 4385 00001120 C3 retn + 4386 + 4387 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4388 ; --------------------------------------- + 4389 ; PCDOS 7.1 COMMAND.COM - RESGROUP:122Eh + 4390 %if 1 + 4391 chk_transient: ; check transient portion is valid or not + 4392 00001121 1E push ds + 4393 00001122 8E1E[8F02] mov ds,[TrnSeg] + 4394 00001126 813E[0401]9090 cmp word [TCOMMAND],9090h ; nop, nop + 4395 0000112C 1F pop ds + 4396 0000112D C3 retn + 4397 %endif + 4398 ; --------------------------------------- + 4399 + 4400 ;*** SetVect - set interrupt vectors + 4401 + 4402 SetVect: + 4403 + 4404 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4405 ; PCDOS 7.1 COMMAND.COM + 4406 %if 0 + 4407 ;mov dx,offset DATARES:LodCom_Trap + 4408 ; 12/01/2023 + 4409 mov dx,LodCom_Trap + 4410 ;mov dx,LODCOM ; MSDOS 3.3 + 4411 mov [PDB.EXIT],dx ; mov ds:0Ah,dx + 4412 mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds + 4413 + 4414 mov ax,2522h + 4415 ;mov ax,(SET_INTERRUPT_VECTOR<<8) | 22h ; 2522h + 4416 int 21h + 4417 ;mov dx,offset DATARES:Ctrlc_Trap + 4418 mov dx,Ctrlc_Trap + 4419 ;mov dx,CONTC ; MSDOS 3.3 + 4420 inc al ; 23h + 4421 int 21h + 4422 ;mov dx,offset DATARES:CritErr_Trap + 4423 mov dx,CritErr_Trap + 4424 ;mov dx,CRITERR ; MSDOS 3.3 + 4425 inc al ; 24h + 4426 int 21h + 4427 retn + 4428 %else + 4429 ; PCDOS 7.1 COMMAND.COM + 4430 ;mov dx,LodCom_Trap + 4431 ;mov [PDB.EXIT],dx ; mov ds:0Ah,dx + 4432 ;mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds + 4433 + 4434 ;push es + 4435 ;push bx + 4436 ;xor bx,bx + 4437 ;mov es,bx + 4438 ;mov bl,88h ; INT 22h vector + 4439 ;cli + 4440 ;mov [es:bx],dx + 4441 ;mov [es:bx+2],ds + 4442 ;mov dx,Ctrlc_Trap + 4443 ;mov bl,8Ch ; INT 23h vector + 4444 ;mov [es:bx],dx + 4445 ;mov [es:bx+2],ds + 4446 ;mov dx,CritErr_Trap + 4447 ;mov bl,90h ; INT 24h vector + 4448 ;mov [es:bx],dx + 4449 ;mov [es:bx+2],ds + 4450 ;sti + 4451 ;pop bx + 4452 ;pop es + 4453 ;retn 4454 - 4455 0000112E 06 push es - 4456 ;push di - 4457 0000112F 31FF xor di,di - 4458 00001131 8EC7 mov es,di - 4459 00001133 BF8800 mov di,88h - 4460 00001136 1E push ds - 4461 00001137 1E push ds - 4462 00001138 1E push ds - 4463 00001139 B8[E000] mov ax,LodCom_Trap - 4464 0000113C A30A00 mov [PDB.EXIT],ax ; mov ds:0Ah,ax - 4465 0000113F 8C1E0C00 mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds - 4466 00001143 FA cli - 4467 00001144 AB stosw - 4468 00001145 58 pop ax ; segment (ds) - 4469 00001146 AB stosw - 4470 00001147 B8[AC00] mov ax,Ctrlc_Trap - 4471 0000114A AB stosw - 4472 0000114B 58 pop ax ; segment (ds) - 4473 0000114C AB stosw - 4474 0000114D B8[B700] mov ax,CritErr_Trap - 4475 00001150 AB stosw - 4476 00001151 58 pop ax ; segment (ds) - 4477 00001152 AB stosw - 4478 00001153 FB sti - 4479 ;pop di - 4480 00001154 07 pop es - 4481 00001155 C3 retn - 4482 %endif - 4483 - 4484 ; ---------------------- - 4485 ; MSDOS 6.0 - 4486 ;;SR; - 4487 ;We have this to take care of the extra values pushed on the stack by - 4488 ;the stub before jumping to LodCom1. We set up ds here and then jump to - 4489 ;Lodcom1 - 4490 - 4491 ;public TrnLodCom1 - 4492 ; 12/01/2023 - 4493 TrnLodCom1: - 4494 00001156 1F pop ds ; ds = DATARES - 4495 00001157 83C402 add sp,2 - 4496 ; pop ds:OldDS - 4497 0000115A E9EFFD jmp LodCom1 - 4498 ; ---------------------- - 4499 - 4500 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4501 ; --------------------------------------- - 4502 %if 1 ; PCDOS 7.1 COMMAND.COM - 4503 int21h_close: - 4504 0000115D B43E mov ah,3Eh ; CLOSE file - 4505 int21h: - 4506 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1272h - 4507 0000115F 06 push es - 4508 00001160 53 push bx - 4509 00001161 31DB xor bx,bx - 4510 00001163 8EC3 mov es,bx ; 0 - 4511 00001165 5B pop bx - 4512 00001166 9C pushf ; Int 21h simulation (ES=0) - 4513 00001167 FA cli - 4514 ;call dword ptr es:84h - 4515 00001168 26FF1E8400 call far [es:84h] ; INT 21h handler - 4516 0000116D 07 pop es - 4517 0000116E C3 retn - 4518 %endif - 4519 ; --------------------------------------- - 4520 - 4521 ;============================================================================= - 4522 ; RUCODE.ASM, MSDOS 6.0, 1991 - 4523 ;============================================================================= - 4524 ; 22/09/2018 - Retro DOS v3.0 - 4525 - 4526 ; title Localizable code for resident COMMAND - 4527 - 4528 ;assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING - 4529 - 4530 ; ---------------------------------------------------------------------------- - 4531 ;*** AskEnd - ask user to confirm batch file termination - 4532 ; - 4533 ; Confirm with user before freeing batch ... - 4534 ; - 4535 ; ENTRY nothing - 4536 ; - 4537 ; EXIT CY = set if batch termination is confirmed - 4538 ; - 4539 ; CY = clear if batch should continue - 4540 ; - 4541 ; USED AX,DX,... - 4542 ; - 4543 ; Bugbug: move this to transient, copy to batch segment. - 4544 ; Bugbug: or move it to command1 1st. + 4455 ; 19/07/2024 + 4456 ; Retro DOS v5.0 COMMAND.COM + 4457 + 4458 0000112E 06 push es + 4459 ;push di + 4460 0000112F 31FF xor di,di + 4461 00001131 8EC7 mov es,di + 4462 00001133 BF8800 mov di,88h + 4463 00001136 1E push ds + 4464 00001137 1E push ds + 4465 00001138 1E push ds + 4466 00001139 B8[E000] mov ax,LodCom_Trap + 4467 0000113C A30A00 mov [PDB.EXIT],ax ; mov ds:0Ah,ax + 4468 0000113F 8C1E0C00 mov [PDB.EXIT+2],ds ; mov ds:0Ch,ds + 4469 00001143 FA cli + 4470 00001144 AB stosw + 4471 00001145 58 pop ax ; segment (ds) + 4472 00001146 AB stosw + 4473 00001147 B8[AC00] mov ax,Ctrlc_Trap + 4474 0000114A AB stosw + 4475 0000114B 58 pop ax ; segment (ds) + 4476 0000114C AB stosw + 4477 0000114D B8[B700] mov ax,CritErr_Trap + 4478 00001150 AB stosw + 4479 00001151 58 pop ax ; segment (ds) + 4480 00001152 AB stosw + 4481 00001153 FB sti + 4482 ;pop di + 4483 00001154 07 pop es + 4484 00001155 C3 retn + 4485 %endif + 4486 + 4487 ; ---------------------- + 4488 ; MSDOS 6.0 + 4489 ;;SR; + 4490 ;We have this to take care of the extra values pushed on the stack by + 4491 ;the stub before jumping to LodCom1. We set up ds here and then jump to + 4492 ;Lodcom1 + 4493 + 4494 ;public TrnLodCom1 + 4495 ; 12/01/2023 + 4496 TrnLodCom1: + 4497 00001156 1F pop ds ; ds = DATARES + 4498 00001157 83C402 add sp,2 + 4499 ; pop ds:OldDS + 4500 0000115A E9EFFD jmp LodCom1 + 4501 ; ---------------------- + 4502 + 4503 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4504 ; --------------------------------------- + 4505 %if 1 ; PCDOS 7.1 COMMAND.COM + 4506 int21h_close: + 4507 0000115D B43E mov ah,3Eh ; CLOSE file + 4508 int21h: + 4509 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1272h + 4510 0000115F 06 push es + 4511 00001160 53 push bx + 4512 00001161 31DB xor bx,bx + 4513 00001163 8EC3 mov es,bx ; 0 + 4514 00001165 5B pop bx + 4515 00001166 9C pushf ; Int 21h simulation (ES=0) + 4516 00001167 FA cli + 4517 ;call dword ptr es:84h + 4518 00001168 26FF1E8400 call far [es:84h] ; INT 21h handler + 4519 0000116D 07 pop es + 4520 0000116E C3 retn + 4521 %endif + 4522 ; --------------------------------------- + 4523 + 4524 ;============================================================================= + 4525 ; RUCODE.ASM, MSDOS 6.0, 1991 + 4526 ;============================================================================= + 4527 ; 22/09/2018 - Retro DOS v3.0 + 4528 + 4529 ; title Localizable code for resident COMMAND + 4530 + 4531 ;assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 4532 + 4533 ; ---------------------------------------------------------------------------- + 4534 ;*** AskEnd - ask user to confirm batch file termination + 4535 ; + 4536 ; Confirm with user before freeing batch ... + 4537 ; + 4538 ; ENTRY nothing + 4539 ; + 4540 ; EXIT CY = set if batch termination is confirmed + 4541 ; + 4542 ; CY = clear if batch should continue + 4543 ; + 4544 ; USED AX,DX,... 4545 ; - 4546 ; Bugbug: No_Char and Yes_Char should be constants. - 4547 ; ---------------------------------------------------------------------------- - 4548 - 4549 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4550 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1169h (CODERES:0429h) + 4546 ; Bugbug: move this to transient, copy to batch segment. + 4547 ; Bugbug: or move it to command1 1st. + 4548 ; + 4549 ; Bugbug: No_Char and Yes_Char should be constants. + 4550 ; ---------------------------------------------------------------------------- 4551 - 4552 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 4553 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1279h (CODERES:0429h) + 4552 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4553 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1169h (CODERES:0429h) 4554 - 4555 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4556 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1289h - 4557 AskEnd: - 4558 ;assume ds:DATARES - 4559 - 4560 0000116F BA[3606] mov dx,ENDBATMES ; DX = message # - 4561 00001172 E86602 call RPrint - 4562 ;call RDISPMSG ; MSDOS 3.3 - 4563 00001175 B8010C mov ax,0C01h - 4564 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + STD_CON_INPUT ;0C01h - 4565 00001178 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER - 4566 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. - 4567 0000117A E8F702 call CharToUpper ; change to upper case - 4568 0000117D 3A06[3D05] cmp al,[NO_CHAR] - 4569 00001181 7407 je short aeRet ; answer is no (CY is clear) - 4570 00001183 3A06[3C05] cmp al,[YES_CHAR] - 4571 00001187 75E6 jne short AskEnd ; invalid response, try again - 4572 00001189 F9 stc ; answer is yes - 4573 aeRet: - 4574 0000118A C3 retn - 4575 - 4576 ; ---------------------------------------------------------------------------- - 4577 ;*** DskErr - critical error handler - 4578 ; - 4579 ; Default critical error handler unless user intercepts int 24h. - 4580 ; - 4581 ; ENTRY int 24h - 4582 ; - 4583 ; EXIT - 4584 ; - 4585 ; USED - 4586 ; - 4587 ; EFFECTS - 4588 ; ---------------------------------------------------------------------------- - 4589 - 4590 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4591 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1185h (CODERES:0445h) + 4555 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 4556 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1279h (CODERES:0429h) + 4557 + 4558 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4559 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1289h + 4560 AskEnd: + 4561 ;assume ds:DATARES + 4562 + 4563 0000116F BA[3606] mov dx,ENDBATMES ; DX = message # + 4564 00001172 E86602 call RPrint + 4565 ;call RDISPMSG ; MSDOS 3.3 + 4566 00001175 B8010C mov ax,0C01h + 4567 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + STD_CON_INPUT ;0C01h + 4568 00001178 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER + 4569 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. + 4570 0000117A E8F702 call CharToUpper ; change to upper case + 4571 0000117D 3A06[3D05] cmp al,[NO_CHAR] + 4572 00001181 7407 je short aeRet ; answer is no (CY is clear) + 4573 00001183 3A06[3C05] cmp al,[YES_CHAR] + 4574 00001187 75E6 jne short AskEnd ; invalid response, try again + 4575 00001189 F9 stc ; answer is yes + 4576 aeRet: + 4577 0000118A C3 retn + 4578 + 4579 ; ---------------------------------------------------------------------------- + 4580 ;*** DskErr - critical error handler + 4581 ; + 4582 ; Default critical error handler unless user intercepts int 24h. + 4583 ; + 4584 ; ENTRY int 24h + 4585 ; + 4586 ; EXIT + 4587 ; + 4588 ; USED + 4589 ; + 4590 ; EFFECTS + 4591 ; ---------------------------------------------------------------------------- 4592 - 4593 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM - 4594 ; PCDOS 7.1 COMMAND.COM - RESGROUP:12A5h + 4593 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4594 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1185h (CODERES:0445h) 4595 - 4596 ;SR; - 4597 ;The stub is going to push the old ds value and the resident data segment - 4598 ;onto the stack in that order. Get it off the stack - 4599 - 4600 ;DskErr proc far - 4601 DSKERR: - 4602 ;assume ds:NOTHING,es:NOTHING,ss:NOTHING - 4603 ; 12/01/2023 - 4604 0000118B 1F pop ds ; ds = DATARES - 4605 ;assume ds:DATARES - 4606 0000118C 8F06[2E05] pop word [OldDS] ; save old ds value - 4607 - 4608 ;CRITERR: ; MSDOS 3.3 - 4609 00001190 FB sti - 4610 ; 12/01/2023 - 4611 ;push ds ; 25/09/2018 - 4612 00001191 06 push es - 4613 00001192 56 push si - 4614 00001193 51 push cx - 4615 00001194 57 push di - 4616 00001195 51 push cx - 4617 00001196 50 push ax - 4618 - 4619 00001197 1E push ds ;save our data segment - 4620 ;push cs ; 25/09/2018 - 4621 00001198 07 pop es ;es = DATARES - 4622 - 4623 00001199 8EDD mov ds,bp - 4624 ;assume ds:nothing + 4596 ; 19/07/2024 - Retro DOS v5.0 COMMAND.COM + 4597 ; PCDOS 7.1 COMMAND.COM - RESGROUP:12A5h + 4598 + 4599 ;SR; + 4600 ;The stub is going to push the old ds value and the resident data segment + 4601 ;onto the stack in that order. Get it off the stack + 4602 + 4603 ;DskErr proc far + 4604 DSKERR: + 4605 ;assume ds:NOTHING,es:NOTHING,ss:NOTHING + 4606 ; 12/01/2023 + 4607 0000118B 1F pop ds ; ds = DATARES + 4608 ;assume ds:DATARES + 4609 0000118C 8F06[2E05] pop word [OldDS] ; save old ds value + 4610 + 4611 ;CRITERR: ; MSDOS 3.3 + 4612 00001190 FB sti + 4613 ; 12/01/2023 + 4614 ;push ds ; 25/09/2018 + 4615 00001191 06 push es + 4616 00001192 56 push si + 4617 00001193 51 push cx + 4618 00001194 57 push di + 4619 00001195 51 push cx + 4620 00001196 50 push ax + 4621 + 4622 00001197 1E push ds ;save our data segment + 4623 ;push cs ; 25/09/2018 + 4624 00001198 07 pop es ;es = DATARES 4625 - 4626 ;mov ax,[si].SDEVATT - 4627 0000119B 8B4404 mov ax,[si+SYSDEV.ATT] ; mov ax,[si+4] - 4628 0000119E 268826[2502] mov [es:CDevAt],ah - 4629 - 4630 ;push cs - 4631 ;pop es + 4626 00001199 8EDD mov ds,bp + 4627 ;assume ds:nothing + 4628 + 4629 ;mov ax,[si].SDEVATT + 4630 0000119B 8B4404 mov ax,[si+SYSDEV.ATT] ; mov ax,[si+4] + 4631 0000119E 268826[2502] mov [es:CDevAt],ah 4632 - 4633 000011A3 BF[1802] mov di,DevName - 4634 000011A6 B90800 mov cx,8 - 4635 ;add si,SDEVNAME ; add si,10 - 4636 000011A9 83C60A add si,SYSDEV.NAME ; save device name (even for block device) - 4637 - 4638 000011AC FC cld - 4639 000011AD F3A4 rep movsb - 4640 000011AF 58 pop ax - 4641 000011B0 59 pop cx - 4642 000011B1 5F pop di - 4643 - 4644 ; Stack still contains DS and ES. - 4645 - 4646 ;SR; - 4647 ;We need ds = DATARES for SavHand + 4633 ;push cs + 4634 ;pop es + 4635 + 4636 000011A3 BF[1802] mov di,DevName + 4637 000011A6 B90800 mov cx,8 + 4638 ;add si,SDEVNAME ; add si,10 + 4639 000011A9 83C60A add si,SYSDEV.NAME ; save device name (even for block device) + 4640 + 4641 000011AC FC cld + 4642 000011AD F3A4 rep movsb + 4643 000011AF 58 pop ax + 4644 000011B0 59 pop cx + 4645 000011B1 5F pop di + 4646 + 4647 ; Stack still contains DS and ES. 4648 - 4649 ;12/01/2023 - 4650 000011B2 06 push es - 4651 000011B3 1F pop ds - 4652 ;assume ds:DATARES - 4653 - 4654 ;invoke SavHand ; save user's stdin/out, set to our stderr - 4655 000011B4 E870FE call SavHand + 4649 ;SR; + 4650 ;We need ds = DATARES for SavHand + 4651 + 4652 ;12/01/2023 + 4653 000011B2 06 push es + 4654 000011B3 1F pop ds + 4655 ;assume ds:DATARES 4656 - 4657 ; 12/01/2023 - 4658 ; 25/09/2018 - 4659 ;;push cs - 4660 ;push es - 4661 ;pop ds ; set up local data segment - 4662 ;assume ds:resgroup - 4663 - 4664 000011B7 52 push dx - 4665 000011B8 E81D02 call crlf - 4666 000011BB 5A pop dx - 4667 - 4668 ; Bugbug: rename Crit_Err_Info to CritErrAH? - 4669 - 4670 000011BC 8826[9C02] mov [Crit_Err_Info],ah ; save critical error flags - 4671 - 4672 ; Compute and save ASCII drive letter (nonsense for char devices) - 4673 - 4674 000011C0 0441 add al,'A' - 4675 000011C2 A2[0502] mov [DrvLet],al + 4657 ;invoke SavHand ; save user's stdin/out, set to our stderr + 4658 000011B4 E870FE call SavHand + 4659 + 4660 ; 12/01/2023 + 4661 ; 25/09/2018 + 4662 ;;push cs + 4663 ;push es + 4664 ;pop ds ; set up local data segment + 4665 ;assume ds:resgroup + 4666 + 4667 000011B7 52 push dx + 4668 000011B8 E81D02 call crlf + 4669 000011BB 5A pop dx + 4670 + 4671 ; Bugbug: rename Crit_Err_Info to CritErrAH? + 4672 + 4673 000011BC 8826[9C02] mov [Crit_Err_Info],ah ; save critical error flags + 4674 + 4675 ; Compute and save ASCII drive letter (nonsense for char devices) 4676 - 4677 ; Bugbug: These labels are awful. Change, especially 'NoHardE'. - 4678 - 4679 000011C5 F6C480 test ah,80h - 4680 000011C8 740A jz short NoHardE ; it's a disk-device error - 4681 000011CA F606[2502]80 test byte [CDevAt],DEVTYP>>8 ; 80h - 4682 000011CF 7503 jnz short NoHardE ; it's a character device - 4683 000011D1 E9F701 jmp FatErr ; it's a FAT error - 4684 - 4685 NoHardE: - 4686 000011D4 BE[5E05] mov si,MREAD ; SI = "read" msg # - 4687 000011D7 F6C401 test ah,1 - 4688 000011DA 7403 jz short SavMes ; it's a read error - 4689 000011DC BE[6705] mov si,MWRITE ; SI = "write" msg # - 4690 SavMes: - 4691 000011DF 893E[5C04] mov [OldErrNo],di ; save critical error code - 4692 - 4693 ; Bugbug: don't need to save/restore all here? - 4694 - 4695 000011E3 06 push es - 4696 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 4697 ;push ds ; GetExtendedError likes to STOMP - 4698 ; 12/01/2023 - 4699 ; (all registers are changed -in dos service- except bp) * - 4700 ;push bp - 4701 ; 19/07/2024 - 4702 ;push si - 4703 ;push dx - 4704 000011E4 51 push cx - 4705 000011E5 53 push bx - 4706 ; 05/06/2023 - 4707 000011E6 B459 mov ah,59h ; * - 4708 ;mov ah,GetExtendedError ; 59h ; get extended error info - 4709 000011E8 CD21 int 21h - 4710 000011EA 5B pop bx - 4711 000011EB 59 pop cx - 4712 ; 19/07/2024 - 4713 ;pop dx - 4714 ;pop si - 4715 ; 12/01/2023 - 4716 ;pop bp - 4717 ; 19/07/2024 - 4718 ;pop ds - 4719 000011EC 893E[3302] mov [NeedVol],di ; save possible ptr to volume label - 4720 000011F0 8C06[3502] mov [NeedVol+2],es - 4721 000011F4 07 pop es - 4722 - 4723 ; Bugbug: AX has extended error code, so no need to zero AH? - 4724 - 4725 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM - 4726 ;xor ah,ah - 4727 000011F5 89C7 mov di,ax ; DI = error code - 4728 - 4729 ; Bugbug: somewhat obsolete documentation? - 4730 ; - 4731 ; DI is now the correct error code. Classify things to see what we are - 4732 ; allowed to report. We convert DI into a 0-based index into a message table. - 4733 ; This presumes that the int 24 errors (oldstyle) and new errors (sharing and - 4734 ; the like) are contiguous. - 4735 - 4736 ; Bugbug: simplify following code by cmp'ing instead of sub'ing. - 4737 ; Check use of ErrCd_24, though. + 4677 000011C0 0441 add al,'A' + 4678 000011C2 A2[0502] mov [DrvLet],al + 4679 + 4680 ; Bugbug: These labels are awful. Change, especially 'NoHardE'. + 4681 + 4682 000011C5 F6C480 test ah,80h + 4683 000011C8 740A jz short NoHardE ; it's a disk-device error + 4684 000011CA F606[2502]80 test byte [CDevAt],DEVTYP>>8 ; 80h + 4685 000011CF 7503 jnz short NoHardE ; it's a character device + 4686 000011D1 E9F701 jmp FatErr ; it's a FAT error + 4687 + 4688 NoHardE: + 4689 000011D4 BE[5E05] mov si,MREAD ; SI = "read" msg # + 4690 000011D7 F6C401 test ah,1 + 4691 000011DA 7403 jz short SavMes ; it's a read error + 4692 000011DC BE[6705] mov si,MWRITE ; SI = "write" msg # + 4693 SavMes: + 4694 000011DF 893E[5C04] mov [OldErrNo],di ; save critical error code + 4695 + 4696 ; Bugbug: don't need to save/restore all here? + 4697 + 4698 000011E3 06 push es + 4699 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 4700 ;push ds ; GetExtendedError likes to STOMP + 4701 ; 12/01/2023 + 4702 ; (all registers are changed -in dos service- except bp) * + 4703 ;push bp + 4704 ; 19/07/2024 + 4705 ;push si + 4706 ;push dx + 4707 000011E4 51 push cx + 4708 000011E5 53 push bx + 4709 ; 05/06/2023 + 4710 000011E6 B459 mov ah,59h ; * + 4711 ;mov ah,GetExtendedError ; 59h ; get extended error info + 4712 000011E8 CD21 int 21h + 4713 000011EA 5B pop bx + 4714 000011EB 59 pop cx + 4715 ; 19/07/2024 + 4716 ;pop dx + 4717 ;pop si + 4718 ; 12/01/2023 + 4719 ;pop bp + 4720 ; 19/07/2024 + 4721 ;pop ds + 4722 000011EC 893E[3302] mov [NeedVol],di ; save possible ptr to volume label + 4723 000011F0 8C06[3502] mov [NeedVol+2],es + 4724 000011F4 07 pop es + 4725 + 4726 ; Bugbug: AX has extended error code, so no need to zero AH? + 4727 + 4728 ; 19/07/2024 - PCDOS 7.1 COMMAND.COM + 4729 ;xor ah,ah + 4730 000011F5 89C7 mov di,ax ; DI = error code + 4731 + 4732 ; Bugbug: somewhat obsolete documentation? + 4733 ; + 4734 ; DI is now the correct error code. Classify things to see what we are + 4735 ; allowed to report. We convert DI into a 0-based index into a message table. + 4736 ; This presumes that the int 24 errors (oldstyle) and new errors (sharing and + 4737 ; the like) are contiguous. 4738 - 4739 000011F7 83EF13 sub di,ERROR_WRITE_PROTECT ; 13h - 4740 000011FA 7303 jae short HavCod + 4739 ; Bugbug: simplify following code by cmp'ing instead of sub'ing. + 4740 ; Check use of ErrCd_24, though. 4741 - 4742 ; Bugbug: wouldn't it be better to display the original error msg, - 4743 ; even though it's not a critical error? + 4742 000011F7 83EF13 sub di,ERROR_WRITE_PROTECT ; 13h + 4743 000011FA 7303 jae short HavCod 4744 - 4745 000011FC BF0C00 mov di,ERROR_GEN_FAILURE - ERROR_WRITE_PROTECT ; mov di,0Ch - 4746 - 4747 ; DI now has the mapped error code. Old style errors are: - 4748 ; FOOBAR ing drive ZZ. - 4749 ; New style errors are: - 4750 ; FOOBAR - 4751 ; We need to figure out which the particular error belongs to. - 4752 - 4753 HavCod: - 4754 000011FF C606[3702]00 mov byte [ErrType],0 ; assume old style - 4755 00001204 83FF10 cmp di,ERROR_FCB_UNAVAILABLE - ERROR_WRITE_PROTECT ; cmp di,10h - 4756 00001207 7405 je short SetStyle - 4757 00001209 83FF11 cmp di,ERROR_SHARING_BUFFER_EXCEEDED - ERROR_WRITE_PROTECT ; cmp di,11h - 4758 0000120C 7504 jne short GotStyle - 4759 - 4760 SetStyle: - 4761 ; Bugbug: use INC - 4762 ;mov byte [ErrType],1 ; must be new type - 4763 0000120E FE06[3702] inc byte [ErrType] ; Retro DOS v3.0 COMMAND.COM - 22/09/2018 - 4764 - 4765 GotStyle: - 4766 00001212 893E[4402] mov [ErrCd_24],di - 4767 ; 12/01/2023 - 4768 ; 25/09/2018 - 4769 ; MSDOS 6.0 - 4770 00001216 83FF14 cmp di,ERROR_HANDLE_DISK_FULL - ERROR_WRITE_PROTECT ; cmp di,14h - 4771 ; MSDOS 3.3 - 4772 ;cmp di,ERROR_SHARING_BUFFER_EXCEEDED - ERROR_WRITE_PROTECT ; cmp di,11h - 4773 - 4774 ; If the error message is unknown - 4775 00001219 7641 jbe short NormalError ; redirector, continue. Otherwise, + 4745 ; Bugbug: wouldn't it be better to display the original error msg, + 4746 ; even though it's not a critical error? + 4747 + 4748 000011FC BF0C00 mov di,ERROR_GEN_FAILURE - ERROR_WRITE_PROTECT ; mov di,0Ch + 4749 + 4750 ; DI now has the mapped error code. Old style errors are: + 4751 ; FOOBAR ing drive ZZ. + 4752 ; New style errors are: + 4753 ; FOOBAR + 4754 ; We need to figure out which the particular error belongs to. + 4755 + 4756 HavCod: + 4757 000011FF C606[3702]00 mov byte [ErrType],0 ; assume old style + 4758 00001204 83FF10 cmp di,ERROR_FCB_UNAVAILABLE - ERROR_WRITE_PROTECT ; cmp di,10h + 4759 00001207 7405 je short SetStyle + 4760 00001209 83FF11 cmp di,ERROR_SHARING_BUFFER_EXCEEDED - ERROR_WRITE_PROTECT ; cmp di,11h + 4761 0000120C 7504 jne short GotStyle + 4762 + 4763 SetStyle: + 4764 ; Bugbug: use INC + 4765 ;mov byte [ErrType],1 ; must be new type + 4766 0000120E FE06[3702] inc byte [ErrType] ; Retro DOS v3.0 COMMAND.COM - 22/09/2018 + 4767 + 4768 GotStyle: + 4769 00001212 893E[4402] mov [ErrCd_24],di + 4770 ; 12/01/2023 + 4771 ; 25/09/2018 + 4772 ; MSDOS 6.0 + 4773 00001216 83FF14 cmp di,ERROR_HANDLE_DISK_FULL - ERROR_WRITE_PROTECT ; cmp di,14h + 4774 ; MSDOS 3.3 + 4775 ;cmp di,ERROR_SHARING_BUFFER_EXCEEDED - ERROR_WRITE_PROTECT ; cmp di,11h 4776 - 4777 ; We do not know how to handle this error. Ask IFSFUNC if she knows - 4778 ; how to handle things + 4777 ; If the error message is unknown + 4778 00001219 7641 jbe short NormalError ; redirector, continue. Otherwise, 4779 - 4780 ;input to IFSFUNC: AL=1 - 4781 ; BX=extended error number - 4782 ; - 4783 ;output from IFSFUNC: AL=error type (0 or 1) - 4784 ; 0= error (read/writ)ing (drive/device) xxx - 4785 ; Abort, Retry, Ignore - 4786 ; 1= - 4787 ; Abort, Retry, Ignore - 4788 ; ES:DI=pointer to message text - 4789 ; carry set=>no message - 4790 - 4791 0000121B 89C7 mov di,ax ; retrieve correct extended error... - 4792 0000121D B80005 mov ax,0500h ; is the redir there? - 4793 00001220 CD2F int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - INSTALLATION CHECK - 4794 ; Return: AL = 00h not installed, OK to install - 4795 ; 01h not installed, can't install - 4796 ; FFh installed - 4797 00001222 3CFF cmp al,0FFh - 4798 00001224 7529 jne short NoHandler ; no, go to NoHandler - 4799 - 4800 ; 12/01/2023 - 4801 ; MSDOS 6.0 - 4802 00001226 53 push bx - 4803 00001227 89FB mov bx,di ; get ErrType and ptr to error msg - 4804 00001229 B80105 mov ax,0501h - 4805 0000122C CD2F int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - - 4806 0000122E 5B pop bx - 4807 0000122F 721E jc short NoHandler - 4808 - 4809 ; MSDOS 3.3 - 4810 ;mov ax,di - 4811 ;mov ah,5 - 4812 ;int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - - 4813 ;jc short NOHANDLER - 4814 - 4815 ; Bugbug: need to record error type? - 4816 - 4817 00001231 A2[3702] mov [ErrType],al - 4818 - 4819 00001234 1E push ds - 4820 00001235 06 push es - 4821 00001236 1F pop ds - 4822 00001237 89FA mov dx,di - 4823 00001239 B9FFFF mov cx,-1 ; find end of msg - 4824 0000123C 30C0 xor al,al - 4825 - 4826 0000123E FC cld - 4827 0000123F F2AE repnz scasb + 4780 ; We do not know how to handle this error. Ask IFSFUNC if she knows + 4781 ; how to handle things + 4782 + 4783 ;input to IFSFUNC: AL=1 + 4784 ; BX=extended error number + 4785 ; + 4786 ;output from IFSFUNC: AL=error type (0 or 1) + 4787 ; 0= error (read/writ)ing (drive/device) xxx + 4788 ; Abort, Retry, Ignore + 4789 ; 1= + 4790 ; Abort, Retry, Ignore + 4791 ; ES:DI=pointer to message text + 4792 ; carry set=>no message + 4793 + 4794 0000121B 89C7 mov di,ax ; retrieve correct extended error... + 4795 0000121D B80005 mov ax,0500h ; is the redir there? + 4796 00001220 CD2F int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - INSTALLATION CHECK + 4797 ; Return: AL = 00h not installed, OK to install + 4798 ; 01h not installed, can't install + 4799 ; FFh installed + 4800 00001222 3CFF cmp al,0FFh + 4801 00001224 7529 jne short NoHandler ; no, go to NoHandler + 4802 + 4803 ; 12/01/2023 + 4804 ; MSDOS 6.0 + 4805 00001226 53 push bx + 4806 00001227 89FB mov bx,di ; get ErrType and ptr to error msg + 4807 00001229 B80105 mov ax,0501h + 4808 0000122C CD2F int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - + 4809 0000122E 5B pop bx + 4810 0000122F 721E jc short NoHandler + 4811 + 4812 ; MSDOS 3.3 + 4813 ;mov ax,di + 4814 ;mov ah,5 + 4815 ;int 2Fh ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - + 4816 ;jc short NOHANDLER + 4817 + 4818 ; Bugbug: need to record error type? + 4819 + 4820 00001231 A2[3702] mov [ErrType],al + 4821 + 4822 00001234 1E push ds + 4823 00001235 06 push es + 4824 00001236 1F pop ds + 4825 00001237 89FA mov dx,di + 4826 00001239 B9FFFF mov cx,-1 ; find end of msg + 4827 0000123C 30C0 xor al,al 4828 - 4829 ; Bugbug: we can do better than this. - 4830 - 4831 ;mov byte [di-1],'$' - 4832 ; 19/07/2024 - 4833 00001241 4F dec di - 4834 00001242 C60524 mov byte [di],'$' - 4835 - 4836 ;CALL RDISPMSG ; MSDOS 3.3 - 4837 - 4838 00001245 B409 mov ah,STD_CON_STRING_OUTPUT ; 9 ; print the message - 4839 00001247 CD21 int 21h - 4840 - 4841 ;mov byte [di-1],0 ; restore terminal byte - 4842 ; 19/07/2024 - 4843 00001249 C60500 mov byte [di],0 - 4844 - 4845 0000124C 1F pop ds ; clean up and continue - 4846 0000124D EB15 jmp short CheckErrType + 4829 0000123E FC cld + 4830 0000123F F2AE repnz scasb + 4831 + 4832 ; Bugbug: we can do better than this. + 4833 + 4834 ;mov byte [di-1],'$' + 4835 ; 19/07/2024 + 4836 00001241 4F dec di + 4837 00001242 C60524 mov byte [di],'$' + 4838 + 4839 ;CALL RDISPMSG ; MSDOS 3.3 + 4840 + 4841 00001245 B409 mov ah,STD_CON_STRING_OUTPUT ; 9 ; print the message + 4842 00001247 CD21 int 21h + 4843 + 4844 ;mov byte [di-1],0 ; restore terminal byte + 4845 ; 19/07/2024 + 4846 00001249 C60500 mov byte [di],0 4847 - 4848 ;* Redir isn't available or doesn't recognize the error. - 4849 ; Restore regs to unextended error. + 4848 0000124C 1F pop ds ; clean up and continue + 4849 0000124D EB15 jmp short CheckErrType 4850 - 4851 NoHandler: - 4852 0000124F C606[3702]00 mov byte [ErrType],0 - 4853 ; Bugbug: won't this break, since we add error_write_protect back in? - 4854 00001254 8B3E[5C04] mov di,[OldErrNo] - 4855 00001258 893E[4402] mov [ErrCd_24],di - 4856 - 4857 NormalError: - 4858 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4859 ; MSDOS 6.0 - 4860 0000125C 83C713 add di,ERROR_WRITE_PROTECT - 4861 0000125F 87FA xchg di,dx ; may need dx later - 4862 00001261 E89001 call RPrintCrit ; print error type - 4863 - 4864 ; MSDOS 3.3 - 4865 ;shl di,1 - 4866 ;mov di,[CRMSGTBL+di] - 4867 ;xchg di,dx - 4868 ;call RDISPMSG - 4869 - 4870 CheckErrType: - 4871 00001264 803E[3702]00 cmp byte [ErrType],0 ; Check error style... - 4872 00001269 7405 je short ContOld - 4873 0000126B E86A01 call crlf ; if new style then done printing - 4874 0000126E EB31 jmp short Ask - 4875 - 4876 ContOld: - 4877 ; 12/01/2023 - 4878 ; MSDOS 6.0 - 4879 00001270 46 inc si ; DS:SI = ptr to asciiz string - 4880 - 4881 ; Bugbug: combine some of the following two sections? - 4882 - 4883 ; 12/01/2023 - 4884 00001271 F606[2502]80 test byte [CDevAt],DEVTYP>>8 ; 80h - 4885 ;test byte [CDevAt],DEVTYP shr 8 ; 80h - 4886 00001276 740F jz short BlkErr - 4887 ;;mov dx,offset DATARES:CharDevErr ; DX = ptr to device message - 4888 ;mov dx,ChardevErr - 4889 00001278 BA[7F05] mov dx,MDEVICE - 4890 ;mov [CharDevErrRw.SubstPtr],si ; point to read/write string - 4891 0000127B 8936[0702] mov [CharDevErrRw],si - 4892 ;mov si,offset DATARES:CharDevErrSubst; SI = ptr to subst block - 4893 0000127F BE[0602] mov si,CharDevErrSubst - 4894 - 4895 00001282 E85601 call RPrint ; print the message - 4896 00001285 EB1A jmp short Ask ; don't ralph on command + 4851 ;* Redir isn't available or doesn't recognize the error. + 4852 ; Restore regs to unextended error. + 4853 + 4854 NoHandler: + 4855 0000124F C606[3702]00 mov byte [ErrType],0 + 4856 ; Bugbug: won't this break, since we add error_write_protect back in? + 4857 00001254 8B3E[5C04] mov di,[OldErrNo] + 4858 00001258 893E[4402] mov [ErrCd_24],di + 4859 + 4860 NormalError: + 4861 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4862 ; MSDOS 6.0 + 4863 0000125C 83C713 add di,ERROR_WRITE_PROTECT + 4864 0000125F 87FA xchg di,dx ; may need dx later + 4865 00001261 E89001 call RPrintCrit ; print error type + 4866 + 4867 ; MSDOS 3.3 + 4868 ;shl di,1 + 4869 ;mov di,[CRMSGTBL+di] + 4870 ;xchg di,dx + 4871 ;call RDISPMSG + 4872 + 4873 CheckErrType: + 4874 00001264 803E[3702]00 cmp byte [ErrType],0 ; Check error style... + 4875 00001269 7405 je short ContOld + 4876 0000126B E86A01 call crlf ; if new style then done printing + 4877 0000126E EB31 jmp short Ask + 4878 + 4879 ContOld: + 4880 ; 12/01/2023 + 4881 ; MSDOS 6.0 + 4882 00001270 46 inc si ; DS:SI = ptr to asciiz string + 4883 + 4884 ; Bugbug: combine some of the following two sections? + 4885 + 4886 ; 12/01/2023 + 4887 00001271 F606[2502]80 test byte [CDevAt],DEVTYP>>8 ; 80h + 4888 ;test byte [CDevAt],DEVTYP shr 8 ; 80h + 4889 00001276 740F jz short BlkErr + 4890 ;;mov dx,offset DATARES:CharDevErr ; DX = ptr to device message + 4891 ;mov dx,ChardevErr + 4892 00001278 BA[7F05] mov dx,MDEVICE + 4893 ;mov [CharDevErrRw.SubstPtr],si ; point to read/write string + 4894 0000127B 8936[0702] mov [CharDevErrRw],si + 4895 ;mov si,offset DATARES:CharDevErrSubst; SI = ptr to subst block + 4896 0000127F BE[0602] mov si,CharDevErrSubst 4897 - 4898 ; 12/01/2023 - 4899 ; MSDOS 3.3 - 4900 ;mov dx,ERRMES - 4901 ;call RDISPMSG - 4902 ;mov dx,si - 4903 ;call RDISPMSG - 4904 ; - 4905 ;test byte [CDevAt],80h - 4906 ;jz short BLKERR - 4907 ;mov dx,CHARDEVERR ; " device " - 4908 ;mov ah,STD_CON_STRING_OUTPUT ; 9 - 4909 ;int 21h ; DOS - PRINT STRING - 4910 ; ; DS:DX -> string terminated by "$" - 4911 ;jmp short ASK - 4912 - 4913 BlkErr: - 4914 ; 12/01/2023 - 4915 ; MSDOS 6.0 - 4916 ;;mov dx,offset DATARES:BlkDevErr ; DX = error msg # - 4917 ;mov dx,BlkDevErr - 4918 00001287 BA[7005] mov dx,MDRIVE - 4919 ;mov [BlkDevErrRw.SubstPtr],si ; "reading","writing" ptr - 4920 0000128A 8936[0002] mov [BlkDevErrRw],si - 4921 ;mov si,offset DATARES:BlkDevErrSubst ; SI = ptr to subst block - 4922 0000128E BE[FF01] mov si,BlkDevErrSubst - 4923 00001291 E84701 call RPrint - 4924 - 4925 ; MSDOS 3.3 - 4926 ;mov dx,BLKDEVERR - 4927 ;call RDISPMSG - 4928 - 4929 00001294 803E[4802]00 cmp byte [Loading],0 - 4930 00001299 7406 jz short Ask - 4931 0000129B E8B3FD call RestHand - 4932 0000129E E9AAFD jmp GetComDsk2 ; if error loading COMMAND, re-prompt - 4933 Ask: - 4934 000012A1 833E[4402]0F cmp word [ErrCd_24],15 ; error 15 has an extra message - 4935 000012A6 751E jne short Not15 ; not error 15 - 4936 - 4937 ;* For error 15, tell the user which volume/serial # are needed. - 4938 - 4939 000012A8 51 push cx - 4940 - 4941 ; Bugbug: does this push/pop need to be done? - 4942 - 4943 000012A9 1E push ds - 4944 000012AA 07 pop es - 4945 000012AB C536[3302] lds si,[NeedVol] - 4946 ;assume ds:NOTHING - 4947 000012AF 57 push di - 4948 000012B0 BF[1502] mov di,VolName - 4949 ; 12/01/2023 - 4950 ; MSDOS 6.0 - 4951 000012B3 B91000 mov cx,16 ; copy volume name & serial # - 4952 ; MSDOS 3.3 - 4953 ;mov cx,11 ; copy volume name - 4954 000012B6 FC cld - 4955 000012B7 F3A4 rep movsb - 4956 000012B9 5F pop di - 4957 000012BA 06 push es - 4958 000012BB 1F pop ds - 4959 000012BC 59 pop cx - 4960 ;assume ds:DATARES - 4961 ; 12/01/2023 - 4962 ; MSDOS 6.0 - 4963 ;mov dx,offset DATARES:NeedVolMsg ; DX = ptr to msg - 4964 ;mov si,offset DATARES:NeedVolSubst ; DS:SI = ptr to subst block - 4965 ;mov dx,NeedVolMsg - 4966 000012BD BA[8F05] mov dx,MVOLSERIAL - 4967 000012C0 BE[0C02] mov si,NeedVolSubst - 4968 000012C3 E81501 call RPrint - 4969 - 4970 ; MSDOS 3.3 - 4971 ;mov dx,NEEDVOLMSG - 4972 ;mov ah,STD_CON_STRING_OUTPUT ; 9 - 4973 ;int 21h ; DOS - PRINT STRING - 4974 ; ; DS:DX -> string terminated by "$" - 4975 Not15: - 4976 ;* Print abort, retry, ignore, fail message. - 4977 ; Print only options that are valid. - 4978 - 4979 ; Bugbug: sizzle this. - 4980 - 4981 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 4982 000012C6 BA[3E05] mov dx,REQ_ABORT - 4983 000012C9 E80F01 call RPrint - 4984 ;call RDISPMSG - 4985 000012CC F606[9C02]10 test byte [Crit_Err_Info],RETRY_ALLOWED ; 10h - 4986 000012D1 7406 jz short Try_Ignore - 4987 000012D3 BA[4405] mov dx,REQ_RETRY - 4988 000012D6 E80201 call RPrint - 4989 ;call RDISPMSG - 4990 Try_Ignore: - 4991 000012D9 F606[9C02]20 test byte [Crit_Err_Info],IGNORE_ALLOWED ; 20h - 4992 000012DE 7406 jz short Try_Fail - 4993 000012E0 BA[4C05] mov dx,REQ_IGNORE - 4994 000012E3 E8F500 call RPrint - 4995 ;call RDISPMSG - 4996 Try_Fail: - 4997 000012E6 F606[9C02]08 test byte [Crit_Err_Info],FAIL_ALLOWED ; 08h - 4998 000012EB 7406 jz short Term_Question - 4999 000012ED BA[5505] mov dx,REQ_FAIL - 5000 000012F0 E8E800 call RPrint - 5001 ;call RDISPMSG - 5002 Term_Question: - 5003 000012F3 BA[5C05] mov dx,REQ_END - 5004 000012F6 E8E200 call RPrint - 5005 ;call RDISPMSG - 5006 - 5007 ; If the /f switch was given, we fail all requests. - 5008 - 5009 000012F9 F606[A902]FF test byte [fFail],-1 - 5010 000012FE 741B jz short DoPrompt - 5011 00001300 B403 mov ah,3 ; signal fail - 5012 00001302 E9B700 jmp EExit - 5013 - 5014 ; 16/04/2023 - 5015 Abort_Process: - 5016 00001305 F606[1203]01 test byte [InitFlag],INITINIT ; 1 ; COMMAND init interrupted? - 5017 0000130A 746C jz short AbortCont ; no, handle it normally - 5018 0000130C 803E[A202]00 cmp byte [PermCom],0 ; are we top level process? - 5019 00001311 745A jz short JustExit ; yes, just exit - 5020 - 5021 00001313 BA[DC0C] mov dx,PATRICIDE ; no, load ptr to error msg - 5022 ; 12/01/2023 - 5023 00001316 E8C200 call RPrint ; print it - 5024 ;call RDISPMSG - 5025 DeadInTheWater: - 5026 00001319 EBFE jmp short DeadInTheWater ; loop until the user reboots - 5027 - 5028 DoPrompt: - 5029 ; 12/01/2023 - 5030 0000131B B8010C mov ax,0C01h - 5031 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + STD_CON_INPUT ; 0C01h - 5032 0000131E CD21 int 21h ; get response - 5033 - 5034 ; 21/07/2024 - PCDOS 7.1 COMMAND.COM - 5035 %if 1 - 5036 ;ifdef DBCS - 5037 ;invoke TestKanjR ; 3/3/KK - 5038 00001320 E85A01 call ITestKanj - 5039 00001323 740A jz short NotKanj ; 3/3/KK - 5040 - 5041 ;mov ax,(STD_CON_INPUT shl 8) ; eat the 2nd byte of ECS code 3/3/KK - 5042 00001325 B80001 mov ax,0100h - 5043 00001328 CD21 int 21h ; 3/3/KK - 5044 0000132A E8AB00 call crlf ; 3/3/KK - 5045 ;jmp short Ask ; 3/3/KK - 5046 ; 22/07/2024 - 5047 0000132D EB3B jmp short AskJ - 5048 NotKanj: - 5049 ;endif - 5050 %endif - 5051 0000132F E8A600 call crlf - 5052 00001332 E83F01 call CharToUpper ; convert to upper case - 5053 00001335 B400 mov ah,0 ; return code for ignore - 5054 00001337 F606[9C02]20 test byte [Crit_Err_Info],IGNORE_ALLOWED ; 20h ; is ignore allowed? - 5055 0000133C 7406 jz short User_Retry - 5056 0000133E 3A06[3A05] cmp al,[IGNORE_CHAR] ; ignore? - 5057 ;jz short EExitJ - 5058 ; 16/04/2023 - 5059 00001342 7478 jz short EExit - 5060 - 5061 ; Bugbug: optimize following code. - 5062 - 5063 User_Retry: - 5064 00001344 FEC4 inc ah ; return code for retry - 5065 00001346 F606[9C02]10 test byte [Crit_Err_Info],RETRY_ALLOWED ; 10h ; is retry allowed? - 5066 0000134B 7406 jz short User_Abort - 5067 0000134D 3A06[3905] cmp al,[RETRY_CHAR] ; retry? - 5068 ;jz short EExitJ - 5069 ; 16/04/2023 - 5070 00001351 7469 jz short EExit - 5071 User_Abort: - 5072 00001353 FEC4 inc ah ; return code for abort - 5073 ; (abort always allowed) - 5074 00001355 3A06[3805] cmp al,[ABORT_CHAR] ; abort? - 5075 00001359 74AA jz short Abort_Process ; exit user program - 5076 0000135B FEC4 inc ah ; return code for fail - 5077 0000135D F606[9C02]08 test byte [Crit_Err_Info],FAIL_ALLOWED ; 08h ; is fail allowed? - 5078 00001362 7406 jz short AskJ - 5079 00001364 3A06[3B05] cmp al,[FAIL_CHAR] ; fail? - 5080 ;jz short EExitJ - 5081 ; 16/04/2023 - 5082 00001368 7452 jz short EExit - 5083 AskJ: - 5084 0000136A E934FF jmp Ask - 5085 - 5086 ; 12/01/2023 - 5087 ;EExitJ: - 5088 ;jmp short EExit - 5089 - 5090 JustExit: - 5091 ;assume ds:DATARES - 5092 ; 12/01/2023 - 5093 0000136D A1[3E02] mov ax,[Parent] ; load real parent pid - 5094 ;mov [16h],ax - 5095 00001370 A31600 mov [PDB.PARENT_PID],ax ; put it back where it belongs - 5096 00001373 B8FF4C mov ax,4CFFh - 5097 ;mov ax,(EXIT<<8) | 255 ; 4CFFh - 5098 00001376 CD21 int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT) - 5099 ; AL = exit code - 5100 AbortCont: - 5101 00001378 F606[9202]FF test byte [In_Batch],-1 ; Are we accessing a batch file? - 5102 0000137D 7405 jz short Not_Batch_Abort - 5103 0000137F C606[9302]01 mov byte [Batch_Abort],1 ; set flag for abort - 5104 - 5105 Not_Batch_Abort: - 5106 00001384 8A16[1303] mov dl,[PipeFlag] - 5107 00001388 E87CFA call ResPipeOff - 5108 0000138B 08D2 or dl,dl - 5109 0000138D 740D je short CheckForA - 5110 0000138F 833E[A502]00 cmp word [SingleCom],0 - 5111 00001394 7406 je short CheckForA - 5112 00001396 C706[A502]FFFF mov word [SingleCom],-1 ; make sure SingleCom exits - 5113 - 5114 CheckForA: - 5115 0000139C 833E[4402]00 cmp word [ErrCd_24],0 ; write protect? - 5116 000013A1 7407 je short abortfor - 5117 000013A3 833E[4402]02 cmp word [ErrCd_24],2 ; drive not ready? - 5118 000013A8 7512 jne short EExit ; don't abort the FOR - 5119 - 5120 abortfor: - 5121 000013AA C606[AB02]00 mov byte [ForFlag],0 ; abort a FOR in progress - 5122 000013AF 833E[A502]00 cmp word [SingleCom],0 - 5123 000013B4 7406 je short EExit - 5124 000013B6 C706[A502]FFFF mov word [SingleCom],-1 ; make sure SingleCom exits - 5125 - 5126 EExit: - 5127 000013BC 88E0 mov al,ah - 5128 000013BE 89FA mov dx,di - 5129 RestHd: - 5130 000013C0 E88EFC call RestHand - 5131 000013C3 59 pop cx - 5132 000013C4 5E pop si ; restore registers - 5133 000013C5 07 pop es - 5134 - 5135 ; 12/01/2023 - 5136 ; MSDOS 6.0 - 5137 ;; pop ds - 5138 ;SR; - 5139 ;ds has to be got from the variable we saved it in - 5140 - 5141 000013C6 8E1E[2E05] mov ds,[OldDS] ; restore old value of ds - 5142 - 5143 ; pop ds - 5144 ; assume ds:nothing + 4898 00001282 E85601 call RPrint ; print the message + 4899 00001285 EB1A jmp short Ask ; don't ralph on command + 4900 + 4901 ; 12/01/2023 + 4902 ; MSDOS 3.3 + 4903 ;mov dx,ERRMES + 4904 ;call RDISPMSG + 4905 ;mov dx,si + 4906 ;call RDISPMSG + 4907 ; + 4908 ;test byte [CDevAt],80h + 4909 ;jz short BLKERR + 4910 ;mov dx,CHARDEVERR ; " device " + 4911 ;mov ah,STD_CON_STRING_OUTPUT ; 9 + 4912 ;int 21h ; DOS - PRINT STRING + 4913 ; ; DS:DX -> string terminated by "$" + 4914 ;jmp short ASK + 4915 + 4916 BlkErr: + 4917 ; 12/01/2023 + 4918 ; MSDOS 6.0 + 4919 ;;mov dx,offset DATARES:BlkDevErr ; DX = error msg # + 4920 ;mov dx,BlkDevErr + 4921 00001287 BA[7005] mov dx,MDRIVE + 4922 ;mov [BlkDevErrRw.SubstPtr],si ; "reading","writing" ptr + 4923 0000128A 8936[0002] mov [BlkDevErrRw],si + 4924 ;mov si,offset DATARES:BlkDevErrSubst ; SI = ptr to subst block + 4925 0000128E BE[FF01] mov si,BlkDevErrSubst + 4926 00001291 E84701 call RPrint + 4927 + 4928 ; MSDOS 3.3 + 4929 ;mov dx,BLKDEVERR + 4930 ;call RDISPMSG + 4931 + 4932 00001294 803E[4802]00 cmp byte [Loading],0 + 4933 00001299 7406 jz short Ask + 4934 0000129B E8B3FD call RestHand + 4935 0000129E E9AAFD jmp GetComDsk2 ; if error loading COMMAND, re-prompt + 4936 Ask: + 4937 000012A1 833E[4402]0F cmp word [ErrCd_24],15 ; error 15 has an extra message + 4938 000012A6 751E jne short Not15 ; not error 15 + 4939 + 4940 ;* For error 15, tell the user which volume/serial # are needed. + 4941 + 4942 000012A8 51 push cx + 4943 + 4944 ; Bugbug: does this push/pop need to be done? + 4945 + 4946 000012A9 1E push ds + 4947 000012AA 07 pop es + 4948 000012AB C536[3302] lds si,[NeedVol] + 4949 ;assume ds:NOTHING + 4950 000012AF 57 push di + 4951 000012B0 BF[1502] mov di,VolName + 4952 ; 12/01/2023 + 4953 ; MSDOS 6.0 + 4954 000012B3 B91000 mov cx,16 ; copy volume name & serial # + 4955 ; MSDOS 3.3 + 4956 ;mov cx,11 ; copy volume name + 4957 000012B6 FC cld + 4958 000012B7 F3A4 rep movsb + 4959 000012B9 5F pop di + 4960 000012BA 06 push es + 4961 000012BB 1F pop ds + 4962 000012BC 59 pop cx + 4963 ;assume ds:DATARES + 4964 ; 12/01/2023 + 4965 ; MSDOS 6.0 + 4966 ;mov dx,offset DATARES:NeedVolMsg ; DX = ptr to msg + 4967 ;mov si,offset DATARES:NeedVolSubst ; DS:SI = ptr to subst block + 4968 ;mov dx,NeedVolMsg + 4969 000012BD BA[8F05] mov dx,MVOLSERIAL + 4970 000012C0 BE[0C02] mov si,NeedVolSubst + 4971 000012C3 E81501 call RPrint + 4972 + 4973 ; MSDOS 3.3 + 4974 ;mov dx,NEEDVOLMSG + 4975 ;mov ah,STD_CON_STRING_OUTPUT ; 9 + 4976 ;int 21h ; DOS - PRINT STRING + 4977 ; ; DS:DX -> string terminated by "$" + 4978 Not15: + 4979 ;* Print abort, retry, ignore, fail message. + 4980 ; Print only options that are valid. + 4981 + 4982 ; Bugbug: sizzle this. + 4983 + 4984 ; 12/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 4985 000012C6 BA[3E05] mov dx,REQ_ABORT + 4986 000012C9 E80F01 call RPrint + 4987 ;call RDISPMSG + 4988 000012CC F606[9C02]10 test byte [Crit_Err_Info],RETRY_ALLOWED ; 10h + 4989 000012D1 7406 jz short Try_Ignore + 4990 000012D3 BA[4405] mov dx,REQ_RETRY + 4991 000012D6 E80201 call RPrint + 4992 ;call RDISPMSG + 4993 Try_Ignore: + 4994 000012D9 F606[9C02]20 test byte [Crit_Err_Info],IGNORE_ALLOWED ; 20h + 4995 000012DE 7406 jz short Try_Fail + 4996 000012E0 BA[4C05] mov dx,REQ_IGNORE + 4997 000012E3 E8F500 call RPrint + 4998 ;call RDISPMSG + 4999 Try_Fail: + 5000 000012E6 F606[9C02]08 test byte [Crit_Err_Info],FAIL_ALLOWED ; 08h + 5001 000012EB 7406 jz short Term_Question + 5002 000012ED BA[5505] mov dx,REQ_FAIL + 5003 000012F0 E8E800 call RPrint + 5004 ;call RDISPMSG + 5005 Term_Question: + 5006 000012F3 BA[5C05] mov dx,REQ_END + 5007 000012F6 E8E200 call RPrint + 5008 ;call RDISPMSG + 5009 + 5010 ; If the /f switch was given, we fail all requests. + 5011 + 5012 000012F9 F606[A902]FF test byte [fFail],-1 + 5013 000012FE 741B jz short DoPrompt + 5014 00001300 B403 mov ah,3 ; signal fail + 5015 00001302 E9B700 jmp EExit + 5016 + 5017 ; 16/04/2023 + 5018 Abort_Process: + 5019 00001305 F606[1203]01 test byte [InitFlag],INITINIT ; 1 ; COMMAND init interrupted? + 5020 0000130A 746C jz short AbortCont ; no, handle it normally + 5021 0000130C 803E[A202]00 cmp byte [PermCom],0 ; are we top level process? + 5022 00001311 745A jz short JustExit ; yes, just exit + 5023 + 5024 00001313 BA[DC0C] mov dx,PATRICIDE ; no, load ptr to error msg + 5025 ; 12/01/2023 + 5026 00001316 E8C200 call RPrint ; print it + 5027 ;call RDISPMSG + 5028 DeadInTheWater: + 5029 00001319 EBFE jmp short DeadInTheWater ; loop until the user reboots + 5030 + 5031 DoPrompt: + 5032 ; 12/01/2023 + 5033 0000131B B8010C mov ax,0C01h + 5034 ;mov ax,(STD_CON_INPUT_FLUSH<<8) + STD_CON_INPUT ; 0C01h + 5035 0000131E CD21 int 21h ; get response + 5036 + 5037 ; 21/07/2024 - PCDOS 7.1 COMMAND.COM + 5038 %if 1 + 5039 ;ifdef DBCS + 5040 ;invoke TestKanjR ; 3/3/KK + 5041 00001320 E85A01 call ITestKanj + 5042 00001323 740A jz short NotKanj ; 3/3/KK + 5043 + 5044 ;mov ax,(STD_CON_INPUT shl 8) ; eat the 2nd byte of ECS code 3/3/KK + 5045 00001325 B80001 mov ax,0100h + 5046 00001328 CD21 int 21h ; 3/3/KK + 5047 0000132A E8AB00 call crlf ; 3/3/KK + 5048 ;jmp short Ask ; 3/3/KK + 5049 ; 22/07/2024 + 5050 0000132D EB3B jmp short AskJ + 5051 NotKanj: + 5052 ;endif + 5053 %endif + 5054 0000132F E8A600 call crlf + 5055 00001332 E83F01 call CharToUpper ; convert to upper case + 5056 00001335 B400 mov ah,0 ; return code for ignore + 5057 00001337 F606[9C02]20 test byte [Crit_Err_Info],IGNORE_ALLOWED ; 20h ; is ignore allowed? + 5058 0000133C 7406 jz short User_Retry + 5059 0000133E 3A06[3A05] cmp al,[IGNORE_CHAR] ; ignore? + 5060 ;jz short EExitJ + 5061 ; 16/04/2023 + 5062 00001342 7478 jz short EExit + 5063 + 5064 ; Bugbug: optimize following code. + 5065 + 5066 User_Retry: + 5067 00001344 FEC4 inc ah ; return code for retry + 5068 00001346 F606[9C02]10 test byte [Crit_Err_Info],RETRY_ALLOWED ; 10h ; is retry allowed? + 5069 0000134B 7406 jz short User_Abort + 5070 0000134D 3A06[3905] cmp al,[RETRY_CHAR] ; retry? + 5071 ;jz short EExitJ + 5072 ; 16/04/2023 + 5073 00001351 7469 jz short EExit + 5074 User_Abort: + 5075 00001353 FEC4 inc ah ; return code for abort + 5076 ; (abort always allowed) + 5077 00001355 3A06[3805] cmp al,[ABORT_CHAR] ; abort? + 5078 00001359 74AA jz short Abort_Process ; exit user program + 5079 0000135B FEC4 inc ah ; return code for fail + 5080 0000135D F606[9C02]08 test byte [Crit_Err_Info],FAIL_ALLOWED ; 08h ; is fail allowed? + 5081 00001362 7406 jz short AskJ + 5082 00001364 3A06[3B05] cmp al,[FAIL_CHAR] ; fail? + 5083 ;jz short EExitJ + 5084 ; 16/04/2023 + 5085 00001368 7452 jz short EExit + 5086 AskJ: + 5087 0000136A E934FF jmp Ask + 5088 + 5089 ; 12/01/2023 + 5090 ;EExitJ: + 5091 ;jmp short EExit + 5092 + 5093 JustExit: + 5094 ;assume ds:DATARES + 5095 ; 12/01/2023 + 5096 0000136D A1[3E02] mov ax,[Parent] ; load real parent pid + 5097 ;mov [16h],ax + 5098 00001370 A31600 mov [PDB.PARENT_PID],ax ; put it back where it belongs + 5099 00001373 B8FF4C mov ax,4CFFh + 5100 ;mov ax,(EXIT<<8) | 255 ; 4CFFh + 5101 00001376 CD21 int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT) + 5102 ; AL = exit code + 5103 AbortCont: + 5104 00001378 F606[9202]FF test byte [In_Batch],-1 ; Are we accessing a batch file? + 5105 0000137D 7405 jz short Not_Batch_Abort + 5106 0000137F C606[9302]01 mov byte [Batch_Abort],1 ; set flag for abort + 5107 + 5108 Not_Batch_Abort: + 5109 00001384 8A16[1303] mov dl,[PipeFlag] + 5110 00001388 E87CFA call ResPipeOff + 5111 0000138B 08D2 or dl,dl + 5112 0000138D 740D je short CheckForA + 5113 0000138F 833E[A502]00 cmp word [SingleCom],0 + 5114 00001394 7406 je short CheckForA + 5115 00001396 C706[A502]FFFF mov word [SingleCom],-1 ; make sure SingleCom exits + 5116 + 5117 CheckForA: + 5118 0000139C 833E[4402]00 cmp word [ErrCd_24],0 ; write protect? + 5119 000013A1 7407 je short abortfor + 5120 000013A3 833E[4402]02 cmp word [ErrCd_24],2 ; drive not ready? + 5121 000013A8 7512 jne short EExit ; don't abort the FOR + 5122 + 5123 abortfor: + 5124 000013AA C606[AB02]00 mov byte [ForFlag],0 ; abort a FOR in progress + 5125 000013AF 833E[A502]00 cmp word [SingleCom],0 + 5126 000013B4 7406 je short EExit + 5127 000013B6 C706[A502]FFFF mov word [SingleCom],-1 ; make sure SingleCom exits + 5128 + 5129 EExit: + 5130 000013BC 88E0 mov al,ah + 5131 000013BE 89FA mov dx,di + 5132 RestHd: + 5133 000013C0 E88EFC call RestHand + 5134 000013C3 59 pop cx + 5135 000013C4 5E pop si ; restore registers + 5136 000013C5 07 pop es + 5137 + 5138 ; 12/01/2023 + 5139 ; MSDOS 6.0 + 5140 ;; pop ds + 5141 ;SR; + 5142 ;ds has to be got from the variable we saved it in + 5143 + 5144 000013C6 8E1E[2E05] mov ds,[OldDS] ; restore old value of ds 5145 - 5146 ; MSDOS 3.3 - 5147 ;pop ds + 5146 ; pop ds + 5147 ; assume ds:nothing 5148 - 5149 000013CA CF iret - 5150 - 5151 FatErr: - 5152 ; 12/01/2023 - 5153 ; MSDOS 6.0 - 5154 ;mov dx,offset DATARES:BadFatMsg - 5155 ;mov si,offset DATARES:BadFatSubst - 5156 000013CB BA[B605] mov dx,BADFATMSG - 5157 000013CE BE[2602] mov si,BadFatSubst - 5158 000013D1 E80700 call RPrint - 5159 - 5160 ; MSDOS 3.3 - 5161 ;mov dx,BADFATMSG - 5162 ;call RDISPMSG - 5163 ;mov dx,BLKDEVERR - 5164 ;call RDISPMSG - 5165 - 5166 000013D4 B002 mov al,2 ; abort - 5167 000013D6 EBE8 jmp short RestHd + 5149 ; MSDOS 3.3 + 5150 ;pop ds + 5151 + 5152 000013CA CF iret + 5153 + 5154 FatErr: + 5155 ; 12/01/2023 + 5156 ; MSDOS 6.0 + 5157 ;mov dx,offset DATARES:BadFatMsg + 5158 ;mov si,offset DATARES:BadFatSubst + 5159 000013CB BA[B605] mov dx,BADFATMSG + 5160 000013CE BE[2602] mov si,BadFatSubst + 5161 000013D1 E80700 call RPrint + 5162 + 5163 ; MSDOS 3.3 + 5164 ;mov dx,BADFATMSG + 5165 ;call RDISPMSG + 5166 ;mov dx,BLKDEVERR + 5167 ;call RDISPMSG 5168 - 5169 ;DskErr endp - 5170 - 5171 ; MSDOS 6.0 - 5172 ; ---------------------------------------------------------------------------- - 5173 ;*** RPrint - print message - 5174 ;*** Crlf - display cr/lf - 5175 ; - 5176 ; ENTRY DS:DX = ptr to count byte, followed by message text - 5177 ; DS:SI = ptr to 1st substitution block for this msg, if any - 5178 ; variable fields related to substitution blocks are set - 5179 ; - 5180 ; EXIT nothing - 5181 ; - 5182 ; USED flags - 5183 ; - 5184 ; EFFECTS - 5185 ; Message is displayed on stdout. + 5169 000013D4 B002 mov al,2 ; abort + 5170 000013D6 EBE8 jmp short RestHd + 5171 + 5172 ;DskErr endp + 5173 + 5174 ; MSDOS 6.0 + 5175 ; ---------------------------------------------------------------------------- + 5176 ;*** RPrint - print message + 5177 ;*** Crlf - display cr/lf + 5178 ; + 5179 ; ENTRY DS:DX = ptr to count byte, followed by message text + 5180 ; DS:SI = ptr to 1st substitution block for this msg, if any + 5181 ; variable fields related to substitution blocks are set + 5182 ; + 5183 ; EXIT nothing + 5184 ; + 5185 ; USED flags 5186 ; - 5187 ; NOTE - 5188 ; Number of substitutions (%1, %2,...) in message text must not - 5189 ; be greater than number of substition blocks present. - 5190 ; ---------------------------------------------------------------------------- - 5191 - 5192 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5193 ; MSDOS 5.0 COMMAND.COM - RESGROUP:13D1h (CODERES:0691h) + 5187 ; EFFECTS + 5188 ; Message is displayed on stdout. + 5189 ; + 5190 ; NOTE + 5191 ; Number of substitutions (%1, %2,...) in message text must not + 5192 ; be greater than number of substition blocks present. + 5193 ; ---------------------------------------------------------------------------- 5194 - 5195 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 5196 ; PCDOS 7.1 COMMAND.COM - RESGROUP:14F6h - 5197 crlf: - 5198 ;mov dx,offset DATARES:Newlin ; cheap newline - 5199 ; 14/01/2023 - 5200 000013D8 BA[4107] mov dx,NEWLINE - 5201 - 5202 ;RPrint proc - 5203 ; - 5204 ; assume ds:DATARES,ss:DATARES - 5205 ; - 5206 ; 14/01/2023 - 5207 RPrint: - 5208 - 5209 ; Bugbug: do we need to save all reg's? - 5210 - 5211 000013DB 56 push si ; preserve registers - 5212 000013DC 50 push ax - 5213 000013DD 53 push bx - 5214 000013DE 51 push cx - 5215 000013DF 52 push dx - 5216 - 5217 000013E0 89F3 mov bx,si ; DS:BX = ptr to subst block - 5218 000013E2 89D6 mov si,dx ; DS:SI = ptr to count byte - 5219 000013E4 AC lodsb ; AL = message length - 5220 ; DS:SI = ptr to message text - 5221 000013E5 31C9 xor cx,cx - 5222 000013E7 88C1 mov cl,al ; CX = message length - 5223 000013E9 E303 jcxz rpRet - 5224 - 5225 000013EB E81900 call RDispMsg - 5226 - 5227 000013EE 5A rpRet: pop dx - 5228 000013EF 59 pop cx - 5229 000013F0 5B pop bx - 5230 000013F1 58 pop ax - 5231 000013F2 5E pop si - 5232 000013F3 C3 retn - 5233 - 5234 ;RPrint endp - 5235 - 5236 ; 14/01/2023 - 5237 ; ; MSDOS 3.3 - 5238 ;CRLF: - 5239 ; mov dx,NEWLIN - 5240 ; - 5241 ;RDISPMSG: ; Display message/text - 5242 ; ; DS:DX = ($ terminated) Message/Text address - 5243 ; push ax - 5244 ; mov ah,STD_CON_STRING_OUTPUT ; 9 - 5245 ; clc - 5246 ; int 21h ; DOS - PRINT STRING - 5247 ; ; DS:DX -> string terminated by "$" - 5248 ; pop ax - 5249 ; retn - 5250 - 5251 - 5252 ; MSDOS 6.0 - 5253 ; ---------------------------------------------------------------------------- - 5254 ;*** RPrintCrit - print critical error message - 5255 ; - 5256 ; ENTRY DX = extended error # (19-39) - 5257 ; - 5258 ; EXIT nothing - 5259 ; - 5260 ; USED flags - 5261 ; - 5262 ; EFFECTS - 5263 ; Message is displayed on stdout - 5264 ; ---------------------------------------------------------------------------- - 5265 - 5266 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5267 - 5268 ;RPrintCrit proc - 5269 ; assume ds:DATARES,ss:DATARES + 5195 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5196 ; MSDOS 5.0 COMMAND.COM - RESGROUP:13D1h (CODERES:0691h) + 5197 + 5198 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 5199 ; PCDOS 7.1 COMMAND.COM - RESGROUP:14F6h + 5200 crlf: + 5201 ;mov dx,offset DATARES:Newlin ; cheap newline + 5202 ; 14/01/2023 + 5203 000013D8 BA[4107] mov dx,NEWLINE + 5204 + 5205 ;RPrint proc + 5206 ; + 5207 ; assume ds:DATARES,ss:DATARES + 5208 ; + 5209 ; 14/01/2023 + 5210 RPrint: + 5211 + 5212 ; Bugbug: do we need to save all reg's? + 5213 + 5214 000013DB 56 push si ; preserve registers + 5215 000013DC 50 push ax + 5216 000013DD 53 push bx + 5217 000013DE 51 push cx + 5218 000013DF 52 push dx + 5219 + 5220 000013E0 89F3 mov bx,si ; DS:BX = ptr to subst block + 5221 000013E2 89D6 mov si,dx ; DS:SI = ptr to count byte + 5222 000013E4 AC lodsb ; AL = message length + 5223 ; DS:SI = ptr to message text + 5224 000013E5 31C9 xor cx,cx + 5225 000013E7 88C1 mov cl,al ; CX = message length + 5226 000013E9 E303 jcxz rpRet + 5227 + 5228 000013EB E81900 call RDispMsg + 5229 + 5230 000013EE 5A rpRet: pop dx + 5231 000013EF 59 pop cx + 5232 000013F0 5B pop bx + 5233 000013F1 58 pop ax + 5234 000013F2 5E pop si + 5235 000013F3 C3 retn + 5236 + 5237 ;RPrint endp + 5238 + 5239 ; 14/01/2023 + 5240 ; ; MSDOS 3.3 + 5241 ;CRLF: + 5242 ; mov dx,NEWLIN + 5243 ; + 5244 ;RDISPMSG: ; Display message/text + 5245 ; ; DS:DX = ($ terminated) Message/Text address + 5246 ; push ax + 5247 ; mov ah,STD_CON_STRING_OUTPUT ; 9 + 5248 ; clc + 5249 ; int 21h ; DOS - PRINT STRING + 5250 ; ; DS:DX -> string terminated by "$" + 5251 ; pop ax + 5252 ; retn + 5253 + 5254 + 5255 ; MSDOS 6.0 + 5256 ; ---------------------------------------------------------------------------- + 5257 ;*** RPrintCrit - print critical error message + 5258 ; + 5259 ; ENTRY DX = extended error # (19-39) + 5260 ; + 5261 ; EXIT nothing + 5262 ; + 5263 ; USED flags + 5264 ; + 5265 ; EFFECTS + 5266 ; Message is displayed on stdout + 5267 ; ---------------------------------------------------------------------------- + 5268 + 5269 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 5270 - 5271 ; 14/01/2023 - 5272 RPrintCrit: - 5273 000013F4 52 push dx ; preserve DX - 5274 000013F5 87DA xchg bx,dx ; BX = extended error # - 5275 ; DX = saved BX - 5276 000013F7 83EB13 sub bx,19 ; BX = critical error index, from 0 - 5277 000013FA D1E3 shl bx,1 ; BX = offset in word table - 5278 000013FC 8B9F[DB08] mov bx,[bx+CRITMSGPTRS] ; BX = ptr to error msg - 5279 00001400 87DA xchg bx,dx ; DX = ptr to error msg - 5280 ; BX = restored - 5281 00001402 E8D6FF call RPrint ; print the message - 5282 00001405 5A pop dx ; restore DX - 5283 00001406 C3 retn - 5284 - 5285 ;RPrintCrit endp - 5286 - 5287 ; ---------------------------------------------------------------------------- - 5288 ;*** RDispMsg - display message - 5289 ; - 5290 ; Display message, with substitutions, for RPrint. - 5291 ; - 5292 ; ENTRY DS:SI = ptr to message text - 5293 ; CX = message length - 5294 ; DS:BX = ptr to substitution block, if any - 5295 ; - 5296 ; EXIT nothing - 5297 ; - 5298 ; USED AX,CX,DX,SI - 5299 ; ---------------------------------------------------------------------------- - 5300 - 5301 ;RDispMsg proc - 5302 ; assume ds:DATARES,ss:DATARES + 5271 ;RPrintCrit proc + 5272 ; assume ds:DATARES,ss:DATARES + 5273 + 5274 ; 14/01/2023 + 5275 RPrintCrit: + 5276 000013F4 52 push dx ; preserve DX + 5277 000013F5 87DA xchg bx,dx ; BX = extended error # + 5278 ; DX = saved BX + 5279 000013F7 83EB13 sub bx,19 ; BX = critical error index, from 0 + 5280 000013FA D1E3 shl bx,1 ; BX = offset in word table + 5281 000013FC 8B9F[DB08] mov bx,[bx+CRITMSGPTRS] ; BX = ptr to error msg + 5282 00001400 87DA xchg bx,dx ; DX = ptr to error msg + 5283 ; BX = restored + 5284 00001402 E8D6FF call RPrint ; print the message + 5285 00001405 5A pop dx ; restore DX + 5286 00001406 C3 retn + 5287 + 5288 ;RPrintCrit endp + 5289 + 5290 ; ---------------------------------------------------------------------------- + 5291 ;*** RDispMsg - display message + 5292 ; + 5293 ; Display message, with substitutions, for RPrint. + 5294 ; + 5295 ; ENTRY DS:SI = ptr to message text + 5296 ; CX = message length + 5297 ; DS:BX = ptr to substitution block, if any + 5298 ; + 5299 ; EXIT nothing + 5300 ; + 5301 ; USED AX,CX,DX,SI + 5302 ; ---------------------------------------------------------------------------- 5303 - 5304 RDispMsg: - 5305 ; 14/01/2023 - 5306 rdNextChar: - 5307 00001407 AC lodsb ; AL = next char - 5308 00001408 3C25 cmp al,'%' - 5309 0000140A 7511 jne short rdOutChar ; not a substitution - 5310 0000140C 8A14 mov dl,[si] ; DL = possible '1' - '9' - 5311 0000140E 80EA31 sub dl,'1' ; DL = 0 - 8 = '1' - '9' - 5312 00001411 80FA09 cmp dl,9 - 5313 00001414 7307 jae short rdOutChar ; not a substitution - 5314 - 5315 ;* A substitution code %1 - %9 has been encountered. - 5316 ; DL = 0-8, indicating %1-%9 - 5317 ; DS:BX = ptr to substitution block - 5318 - 5319 00001416 E80D00 call SubstMsg ; display the substitution - 5320 00001419 46 inc si ; SI = ptr past %n - 5321 0000141A 49 dec cx ; count extra character in %n - 5322 0000141B EB06 jmp short rdCharDone - 5323 - 5324 ;* Normal character output. - 5325 - 5326 rdOutChar: - 5327 0000141D 88C2 mov dl,al ; DL = char - 5328 0000141F B402 mov ah,2 ; AH = DOS Character Output code - 5329 00001421 CD21 int 21h ; call DOS - 5330 rdCharDone: - 5331 00001423 E2E2 loop rdNextChar - 5332 00001425 C3 retn - 5333 - 5334 ;RDispMsg endp - 5335 - 5336 ; ---------------------------------------------------------------------------- - 5337 ;*** SubstMsg - display message substitution - 5338 ; - 5339 ; Display a substitution string within a message. - 5340 ; Substitution can be a char, an ASCIIZ string, or - 5341 ; a word to be displayed as hex digits. - 5342 ; - 5343 ; ENTRY DL = substitution index 0-8 (for codes %1-%9) - 5344 ; DS:BX = ptr to substitution block + 5304 ;RDispMsg proc + 5305 ; assume ds:DATARES,ss:DATARES + 5306 + 5307 RDispMsg: + 5308 ; 14/01/2023 + 5309 rdNextChar: + 5310 00001407 AC lodsb ; AL = next char + 5311 00001408 3C25 cmp al,'%' + 5312 0000140A 7511 jne short rdOutChar ; not a substitution + 5313 0000140C 8A14 mov dl,[si] ; DL = possible '1' - '9' + 5314 0000140E 80EA31 sub dl,'1' ; DL = 0 - 8 = '1' - '9' + 5315 00001411 80FA09 cmp dl,9 + 5316 00001414 7307 jae short rdOutChar ; not a substitution + 5317 + 5318 ;* A substitution code %1 - %9 has been encountered. + 5319 ; DL = 0-8, indicating %1-%9 + 5320 ; DS:BX = ptr to substitution block + 5321 + 5322 00001416 E80D00 call SubstMsg ; display the substitution + 5323 00001419 46 inc si ; SI = ptr past %n + 5324 0000141A 49 dec cx ; count extra character in %n + 5325 0000141B EB06 jmp short rdCharDone + 5326 + 5327 ;* Normal character output. + 5328 + 5329 rdOutChar: + 5330 0000141D 88C2 mov dl,al ; DL = char + 5331 0000141F B402 mov ah,2 ; AH = DOS Character Output code + 5332 00001421 CD21 int 21h ; call DOS + 5333 rdCharDone: + 5334 00001423 E2E2 loop rdNextChar + 5335 00001425 C3 retn + 5336 + 5337 ;RDispMsg endp + 5338 + 5339 ; ---------------------------------------------------------------------------- + 5340 ;*** SubstMsg - display message substitution + 5341 ; + 5342 ; Display a substitution string within a message. + 5343 ; Substitution can be a char, an ASCIIZ string, or + 5344 ; a word to be displayed as hex digits. 5345 ; - 5346 ; EXIT nothing - 5347 ; - 5348 ; USED AX,DX - 5349 ; ---------------------------------------------------------------------------- - 5350 - 5351 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5352 - 5353 ;SubstMsg proc - 5354 ; assume ds:DATARES,ss:DATARES - 5355 - 5356 ; 14/01/2023 - 5357 SubstMsg: - 5358 00001426 53 push bx ; preserve BX - 5359 00001427 51 push cx ; preserve CX - 5360 - 5361 ;mov al,size SUBST ; AL = size of substitution block - 5362 00001428 B003 mov al,3 - 5363 0000142A F6E2 mul dl ; AX = offset of desired subst block - 5364 0000142C 01C3 add bx,ax ; DS:BX = ptr to desired subst block - 5365 - 5366 ;mov al,[bx].SubstType ; AX = substitution type flag - 5367 0000142E 8A07 mov al,[bx] - 5368 ;mov bx,[bx].SubstPtr ; BX = ptr to char, str, or hex value - 5369 00001430 8B5F01 mov bx,[bx+1] - 5370 - 5371 ; AL = 1, 2, or 3 for char, string, or hex type - 5372 - 5373 00001433 FEC8 dec al - 5374 00001435 7428 jz short smChar - 5375 00001437 FEC8 dec al - 5376 00001439 742C jz short smStr - 5377 - 5378 ;* Hex number substitution. - 5379 - 5380 ;mov ax,ds:[bx] ; AX = word value - 5381 0000143B 8B07 mov ax,[bx] - 5382 0000143D B90400 mov cx,4 ; CX = # digits to display - 5383 smDigit: - 5384 00001440 D1C0 rol ax,1 - 5385 00001442 D1C0 rol ax,1 - 5386 00001444 D1C0 rol ax,1 - 5387 00001446 D1C0 rol ax,1 ; AL<3:0> = next digit - 5388 - 5389 00001448 50 push ax ; save other digits - 5390 00001449 240F and al,0Fh ; AL = binary digit - 5391 0000144B 0430 add al,'0' ; AL = ascii digit if 0-9 - 5392 0000144D 3C39 cmp al,'9' - 5393 0000144F 7602 jbe short smDigit09 ; it's 0-9 - 5394 ;add al,7 - 5395 00001451 0407 add al,('A' - '0') - 10 ; AL = ascii digit A-F - 5396 smDigit09: - 5397 00001453 88C2 mov dl,al ; DL = ascii digit - 5398 00001455 B402 mov ah,2 - 5399 00001457 CD21 int 21h ; output the ascii digit - 5400 00001459 58 pop ax ; restore all digits - 5401 - 5402 0000145A E2E4 loop smDigit - 5403 ;jmp short smRet - 5404 ; 14/01/2023 - 5405 smRet: - 5406 0000145C 59 pop cx - 5407 0000145D 5B pop bx - 5408 0000145E C3 retn - 5409 - 5410 ;* Char substitution. - 5411 - 5412 smChar: - 5413 ;mov dl,ds:[bx] ; DL = char to output - 5414 0000145F 8A17 mov dl,[bx] - 5415 00001461 B402 mov ah,2 - 5416 00001463 CD21 int 21h - 5417 00001465 EBF5 jmp short smRet - 5418 - 5419 ;* String substitution. - 5420 - 5421 smStr: - 5422 ;mov dl,ds:[bx] ; DL = next char - 5423 00001467 8A17 mov dl,[bx] - 5424 00001469 08D2 or dl,dl - 5425 0000146B 74EF jz short smRet ; null char - we're done - 5426 0000146D B402 mov ah,2 - 5427 0000146F CD21 int 21h ; display char - 5428 00001471 43 inc bx ; DS:BX = ptr to next char - 5429 00001472 EBF3 jmp short smStr - 5430 - 5431 ;smRet: pop cx - 5432 ; pop bx - 5433 ; retn - 5434 - 5435 ;SubstMsg endp - 5436 - 5437 ; MSDOS 6.0 - 5438 ; ---------------------------------------------------------------------------- - 5439 ;*** CharToUpper - convert character to uppercase - 5440 ; - 5441 ; ENTRY AL = char - 5442 ; - 5443 ; EXIT AL = uppercase char - 5444 ; - 5445 ; USED AX - 5446 ; ---------------------------------------------------------------------------- - 5447 - 5448 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5449 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 5346 ; ENTRY DL = substitution index 0-8 (for codes %1-%9) + 5347 ; DS:BX = ptr to substitution block + 5348 ; + 5349 ; EXIT nothing + 5350 ; + 5351 ; USED AX,DX + 5352 ; ---------------------------------------------------------------------------- + 5353 + 5354 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5355 + 5356 ;SubstMsg proc + 5357 ; assume ds:DATARES,ss:DATARES + 5358 + 5359 ; 14/01/2023 + 5360 SubstMsg: + 5361 00001426 53 push bx ; preserve BX + 5362 00001427 51 push cx ; preserve CX + 5363 + 5364 ;mov al,size SUBST ; AL = size of substitution block + 5365 00001428 B003 mov al,3 + 5366 0000142A F6E2 mul dl ; AX = offset of desired subst block + 5367 0000142C 01C3 add bx,ax ; DS:BX = ptr to desired subst block + 5368 + 5369 ;mov al,[bx].SubstType ; AX = substitution type flag + 5370 0000142E 8A07 mov al,[bx] + 5371 ;mov bx,[bx].SubstPtr ; BX = ptr to char, str, or hex value + 5372 00001430 8B5F01 mov bx,[bx+1] + 5373 + 5374 ; AL = 1, 2, or 3 for char, string, or hex type + 5375 + 5376 00001433 FEC8 dec al + 5377 00001435 7428 jz short smChar + 5378 00001437 FEC8 dec al + 5379 00001439 742C jz short smStr + 5380 + 5381 ;* Hex number substitution. + 5382 + 5383 ;mov ax,ds:[bx] ; AX = word value + 5384 0000143B 8B07 mov ax,[bx] + 5385 0000143D B90400 mov cx,4 ; CX = # digits to display + 5386 smDigit: + 5387 00001440 D1C0 rol ax,1 + 5388 00001442 D1C0 rol ax,1 + 5389 00001444 D1C0 rol ax,1 + 5390 00001446 D1C0 rol ax,1 ; AL<3:0> = next digit + 5391 + 5392 00001448 50 push ax ; save other digits + 5393 00001449 240F and al,0Fh ; AL = binary digit + 5394 0000144B 0430 add al,'0' ; AL = ascii digit if 0-9 + 5395 0000144D 3C39 cmp al,'9' + 5396 0000144F 7602 jbe short smDigit09 ; it's 0-9 + 5397 ;add al,7 + 5398 00001451 0407 add al,('A' - '0') - 10 ; AL = ascii digit A-F + 5399 smDigit09: + 5400 00001453 88C2 mov dl,al ; DL = ascii digit + 5401 00001455 B402 mov ah,2 + 5402 00001457 CD21 int 21h ; output the ascii digit + 5403 00001459 58 pop ax ; restore all digits + 5404 + 5405 0000145A E2E4 loop smDigit + 5406 ;jmp short smRet + 5407 ; 14/01/2023 + 5408 smRet: + 5409 0000145C 59 pop cx + 5410 0000145D 5B pop bx + 5411 0000145E C3 retn + 5412 + 5413 ;* Char substitution. + 5414 + 5415 smChar: + 5416 ;mov dl,ds:[bx] ; DL = char to output + 5417 0000145F 8A17 mov dl,[bx] + 5418 00001461 B402 mov ah,2 + 5419 00001463 CD21 int 21h + 5420 00001465 EBF5 jmp short smRet + 5421 + 5422 ;* String substitution. + 5423 + 5424 smStr: + 5425 ;mov dl,ds:[bx] ; DL = next char + 5426 00001467 8A17 mov dl,[bx] + 5427 00001469 08D2 or dl,dl + 5428 0000146B 74EF jz short smRet ; null char - we're done + 5429 0000146D B402 mov ah,2 + 5430 0000146F CD21 int 21h ; display char + 5431 00001471 43 inc bx ; DS:BX = ptr to next char + 5432 00001472 EBF3 jmp short smStr + 5433 + 5434 ;smRet: pop cx + 5435 ; pop bx + 5436 ; retn + 5437 + 5438 ;SubstMsg endp + 5439 + 5440 ; MSDOS 6.0 + 5441 ; ---------------------------------------------------------------------------- + 5442 ;*** CharToUpper - convert character to uppercase + 5443 ; + 5444 ; ENTRY AL = char + 5445 ; + 5446 ; EXIT AL = uppercase char + 5447 ; + 5448 ; USED AX + 5449 ; ---------------------------------------------------------------------------- 5450 - 5451 ;CharToUpper proc - 5452 ; assume ds:DATARES - 5453 CharToUpper: - 5454 00001474 50 push ax ; put char on stack as arg to int 2F - 5455 00001475 B81312 mov ax,1213h ; AX = DOS int 2F 'Convert Char to Uppercase' - 5456 00001478 CD2F int 2Fh - 5457 0000147A 44 inc sp ; throw away old char on stack - 5458 0000147B 44 inc sp - 5459 0000147C C3 retn - 5460 - 5461 ;CharToUpper endp - 5462 - 5463 ; 14/01/2023 - 5464 ; ; MSDOS 3.3 - 5465 ;CHARTOUPPER: - 5466 ; cmp al,80h - 5467 ; jb short CHARTOUPPER1 - 5468 ; sub al,80h - 5469 ; push ds - 5470 ; push bx - 5471 ; lds bx,[UPPERCASETBL] - 5472 ; add bx,2 - 5473 ; xlat - 5474 ; pop bx - 5475 ; pop ds - 5476 ; jmp short CHARTOUPPER_RETN - 5477 ;CHARTOUPPER1: - 5478 ; cmp al,'a' - 5479 ; jb short CHARTOUPPER_RETN - 5480 ; cmp al,'z' - 5481 ; ja short CHARTOUPPER_RETN - 5482 ; sub al,20h - 5483 ;CHARTOUPPER_RETN: - 5484 ; retn - 5485 - 5486 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 5487 ; ---------------------------------------------------------------------------- - 5488 ; PCDOS 7.1 COMMAND.COM - RESGROUP:159Dh - 5489 - 5490 ;ifdef DBCS - 5491 %if 1 + 5451 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5452 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 5453 + 5454 ;CharToUpper proc + 5455 ; assume ds:DATARES + 5456 CharToUpper: + 5457 00001474 50 push ax ; put char on stack as arg to int 2F + 5458 00001475 B81312 mov ax,1213h ; AX = DOS int 2F 'Convert Char to Uppercase' + 5459 00001478 CD2F int 2Fh + 5460 0000147A 44 inc sp ; throw away old char on stack + 5461 0000147B 44 inc sp + 5462 0000147C C3 retn + 5463 + 5464 ;CharToUpper endp + 5465 + 5466 ; 14/01/2023 + 5467 ; ; MSDOS 3.3 + 5468 ;CHARTOUPPER: + 5469 ; cmp al,80h + 5470 ; jb short CHARTOUPPER1 + 5471 ; sub al,80h + 5472 ; push ds + 5473 ; push bx + 5474 ; lds bx,[UPPERCASETBL] + 5475 ; add bx,2 + 5476 ; xlat + 5477 ; pop bx + 5478 ; pop ds + 5479 ; jmp short CHARTOUPPER_RETN + 5480 ;CHARTOUPPER1: + 5481 ; cmp al,'a' + 5482 ; jb short CHARTOUPPER_RETN + 5483 ; cmp al,'z' + 5484 ; ja short CHARTOUPPER_RETN + 5485 ; sub al,20h + 5486 ;CHARTOUPPER_RETN: + 5487 ; retn + 5488 + 5489 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 5490 ; ---------------------------------------------------------------------------- + 5491 ; PCDOS 7.1 COMMAND.COM - RESGROUP:159Dh 5492 - 5493 ;*** ITestKanj - DBCS lead byte check - 5494 - 5495 ITestKanj: - 5496 TestKanjR: ; 3/3/KK - 5497 0000147D 1E push ds - 5498 0000147E 56 push si - 5499 0000147F 50 push ax - 5500 00001480 C536[BA02] lds si,[Dbcs_Vector_Addr] - 5501 ktLop: - 5502 00001484 833C00 cmp word [si],0 ; end of Lead Byte Table - 5503 00001487 740C je short NotLead - 5504 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 5505 ;pop ax - 5506 ;push ax - 5507 00001489 3A04 cmp al,[si] - 5508 0000148B 7208 jb short NotLead - 5509 0000148D 46 inc si - 5510 0000148E 3A04 cmp al,[si] - 5511 00001490 7607 jbe short IsLead - 5512 00001492 46 inc si - 5513 00001493 EBEF jmp short ktLop ; try another range - 5514 NotLead: - 5515 00001495 31C0 xor ax,ax ; set zero - 5516 00001497 EB03 jmp short ktRet - 5517 IsLead: - 5518 00001499 31C0 xor ax,ax ; reset zero - 5519 0000149B 40 inc ax - 5520 ktRet: - 5521 0000149C 58 pop ax - 5522 0000149D 5E pop si - 5523 0000149E 1F pop ds - 5524 0000149F C3 retn - 5525 - 5526 %endif - 5527 ;endif + 5493 ;ifdef DBCS + 5494 %if 1 + 5495 + 5496 ;*** ITestKanj - DBCS lead byte check + 5497 + 5498 ITestKanj: + 5499 TestKanjR: ; 3/3/KK + 5500 0000147D 1E push ds + 5501 0000147E 56 push si + 5502 0000147F 50 push ax + 5503 00001480 C536[BA02] lds si,[Dbcs_Vector_Addr] + 5504 ktLop: + 5505 00001484 833C00 cmp word [si],0 ; end of Lead Byte Table + 5506 00001487 740C je short NotLead + 5507 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 5508 ;pop ax + 5509 ;push ax + 5510 00001489 3A04 cmp al,[si] + 5511 0000148B 7208 jb short NotLead + 5512 0000148D 46 inc si + 5513 0000148E 3A04 cmp al,[si] + 5514 00001490 7607 jbe short IsLead + 5515 00001492 46 inc si + 5516 00001493 EBEF jmp short ktLop ; try another range + 5517 NotLead: + 5518 00001495 31C0 xor ax,ax ; set zero + 5519 00001497 EB03 jmp short ktRet + 5520 IsLead: + 5521 00001499 31C0 xor ax,ax ; reset zero + 5522 0000149B 40 inc ax + 5523 ktRet: + 5524 0000149C 58 pop ax + 5525 0000149D 5E pop si + 5526 0000149E 1F pop ds + 5527 0000149F C3 retn 5528 - 5529 ; ---------------------------------------------------------------------------- - 5530 - 5531 ;public EndCode - 5532 ;EndCode label byte + 5529 %endif + 5530 ;endif + 5531 + 5532 ; ---------------------------------------------------------------------------- 5533 - 5534 ; MSDOS 6.0 - 5535 ; ---------------------------------------------------------------------------- - 5536 ;*** MsgInt2fHandler - int 2f handler for message retrieval - 5537 ; - 5538 ; ENTRY If we handle it - - 5539 ; AX = ((MULTDOS shl 8) or MESSAGE_2F) = 122Eh - 5540 ; DL = operation = - 5541 ; 0 = get extended error messages - 5542 ; 1 = set extended error messages - 5543 ; 2 = get parse error messages - 5544 ; 3 = set parse error messages - 5545 ; 4 = get critical error messages - 5546 ; 5 = set critical error messages - 5547 ; 6 = get file system error messages - 5548 ; 7 = set file system error messages - 5549 ; 8 = get disk retriever routine - 5550 ; 9 = set disk retriever routine - 5551 ; ES:DI = address for 'set' operations - 5552 ; - 5553 ; EXIT ES:DI = ptr to list of message ptrs, for 'get' operations - 5554 ; - 5555 ; NOTE - 5556 ; This handler replaces the one that used to reside in DOS. - 5557 ; 'Set' operations are ignored. - 5558 ; 'File system error messages' are not supported. - 5559 ; ---------------------------------------------------------------------------- - 5560 - 5561 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5562 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1478h (CODERES:0738h) + 5534 ;public EndCode + 5535 ;EndCode label byte + 5536 + 5537 ; MSDOS 6.0 + 5538 ; ---------------------------------------------------------------------------- + 5539 ;*** MsgInt2fHandler - int 2f handler for message retrieval + 5540 ; + 5541 ; ENTRY If we handle it - + 5542 ; AX = ((MULTDOS shl 8) or MESSAGE_2F) = 122Eh + 5543 ; DL = operation = + 5544 ; 0 = get extended error messages + 5545 ; 1 = set extended error messages + 5546 ; 2 = get parse error messages + 5547 ; 3 = set parse error messages + 5548 ; 4 = get critical error messages + 5549 ; 5 = set critical error messages + 5550 ; 6 = get file system error messages + 5551 ; 7 = set file system error messages + 5552 ; 8 = get disk retriever routine + 5553 ; 9 = set disk retriever routine + 5554 ; ES:DI = address for 'set' operations + 5555 ; + 5556 ; EXIT ES:DI = ptr to list of message ptrs, for 'get' operations + 5557 ; + 5558 ; NOTE + 5559 ; This handler replaces the one that used to reside in DOS. + 5560 ; 'Set' operations are ignored. + 5561 ; 'File system error messages' are not supported. + 5562 ; ---------------------------------------------------------------------------- 5563 - 5564 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 5565 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1588h (CODERES:0738h) + 5564 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5565 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1478h (CODERES:0738h) 5566 - 5567 ;SR; - 5568 ;At the int 2fh entry point we push the old ds value and the resident data - 5569 ;segment address. Get them off the stack - 5570 - 5571 ;MsgInt2fHandler proc far - 5572 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 5567 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 5568 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1588h (CODERES:0738h) + 5569 + 5570 ;SR; + 5571 ;At the int 2fh entry point we push the old ds value and the resident data + 5572 ;segment address. Get them off the stack 5573 - 5574 ; 14/01/2023 - 5575 MsgInt2fHandler: - 5576 000014A0 1F pop ds ; ds = DATARES - 5577 ;assume ds:DATARES - 5578 ; pop word [OldDS] ; save old value of ds - 5579 - 5580 000014A1 3D2E12 cmp ax,122Eh - 5581 ;cmp ax,(MULTDOS<<8)|MESSAGE_2F - 5582 ;;cmp ax,(MULTDOS shl 8) or MESSAGE_2F - 5583 000014A4 742A je short miOurs ; it's ours - 5584 - 5585 ;ifndef ROMDOS - 5586 ;cmp ax,5500h - 5587 000014A6 3D0055 cmp ax,GET_COMMAND_STATE ; is it first COMMAND query? - 5588 ;else - 5589 ; cmp ax,GET_ROMCOMMAND_STATE ; is it first ROM COMMAND query? - 5590 ;endif ;ROMDOS - 5591 000014A9 741C je short fcOurs - 5592 - 5593 ;SR; - 5594 ;We cannot do a far jump any more because cs cannot be used. Push the cs:ip - 5595 ;onto the stack and do a far return to jump to the next 2fh handler. - 5596 ;Our old ds is on the stack. We need to restore it but we cannot lose the - 5597 ;current value of ds as it points at the data segment. So we do some kinky - 5598 ;stack manipulations. - 5599 - 5600 000014AB 50 push ax - 5601 000014AC 50 push ax ; create 2 words on stack for retf + 5574 ;MsgInt2fHandler proc far + 5575 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 5576 + 5577 ; 14/01/2023 + 5578 MsgInt2fHandler: + 5579 000014A0 1F pop ds ; ds = DATARES + 5580 ;assume ds:DATARES + 5581 ; pop word [OldDS] ; save old value of ds + 5582 + 5583 000014A1 3D2E12 cmp ax,122Eh + 5584 ;cmp ax,(MULTDOS<<8)|MESSAGE_2F + 5585 ;;cmp ax,(MULTDOS shl 8) or MESSAGE_2F + 5586 000014A4 742A je short miOurs ; it's ours + 5587 + 5588 ;ifndef ROMDOS + 5589 ;cmp ax,5500h + 5590 000014A6 3D0055 cmp ax,GET_COMMAND_STATE ; is it first COMMAND query? + 5591 ;else + 5592 ; cmp ax,GET_ROMCOMMAND_STATE ; is it first ROM COMMAND query? + 5593 ;endif ;ROMDOS + 5594 000014A9 741C je short fcOurs + 5595 + 5596 ;SR; + 5597 ;We cannot do a far jump any more because cs cannot be used. Push the cs:ip + 5598 ;onto the stack and do a far return to jump to the next 2fh handler. + 5599 ;Our old ds is on the stack. We need to restore it but we cannot lose the + 5600 ;current value of ds as it points at the data segment. So we do some kinky + 5601 ;stack manipulations. 5602 - 5603 000014AD 55 push bp - 5604 000014AE 50 push ax + 5603 000014AB 50 push ax + 5604 000014AC 50 push ax ; create 2 words on stack for retf 5605 - 5606 000014AF 89E5 mov bp,sp ; bp can be used to address stack - 5607 - 5608 ;Swap the old ds value with the second dummy word on the stack. Now, we can - 5609 ;do a 'pop ds' at the end to restore our ds + 5606 000014AD 55 push bp + 5607 000014AE 50 push ax + 5608 + 5609 000014AF 89E5 mov bp,sp ; bp can be used to address stack 5610 - 5611 000014B1 8B4608 mov ax,[bp+8] ; ax = old ds value - 5612 000014B4 894604 mov [bp+4],ax - 5613 - 5614 ;mov ax,word ptr ds:Int2fHandler+2 - 5615 000014B7 A1[B004] mov ax,[Int2fHandler+2] - 5616 000014BA 894608 mov [bp+8],ax ; put segment address - 5617 ;mov ax,word ptr ds:Int2fHandler - 5618 000014BD A1[AE04] mov ax,[Int2fHandler] - 5619 000014C0 894606 mov [bp+6],ax ; put offset address - 5620 - 5621 000014C3 58 pop ax - 5622 000014C4 5D pop bp - 5623 000014C5 1F pop ds - 5624 - 5625 000014C6 CB retf ; chain on to next handler - 5626 - 5627 ;; jmp Int2fHandler ; hand off to next 2f handler - 5628 - 5629 fcOurs: - 5630 - 5631 ;We have to clear ax, and return in ds:si a pointer to the stub jump table - 5632 - 5633 000014C7 58 pop ax ; discard ds currently on stack - 5634 000014C8 1E push ds ; store our data segment + 5611 ;Swap the old ds value with the second dummy word on the stack. Now, we can + 5612 ;do a 'pop ds' at the end to restore our ds + 5613 + 5614 000014B1 8B4608 mov ax,[bp+8] ; ax = old ds value + 5615 000014B4 894604 mov [bp+4],ax + 5616 + 5617 ;mov ax,word ptr ds:Int2fHandler+2 + 5618 000014B7 A1[B004] mov ax,[Int2fHandler+2] + 5619 000014BA 894608 mov [bp+8],ax ; put segment address + 5620 ;mov ax,word ptr ds:Int2fHandler + 5621 000014BD A1[AE04] mov ax,[Int2fHandler] + 5622 000014C0 894606 mov [bp+6],ax ; put offset address + 5623 + 5624 000014C3 58 pop ax + 5625 000014C4 5D pop bp + 5626 000014C5 1F pop ds + 5627 + 5628 000014C6 CB retf ; chain on to next handler + 5629 + 5630 ;; jmp Int2fHandler ; hand off to next 2f handler + 5631 + 5632 fcOurs: + 5633 + 5634 ;We have to clear ax, and return in ds:si a pointer to the stub jump table 5635 - 5636 ;mov si,offset DATARES:Int2f_Entry ; start of table - 5637 000014C9 BE[6600] mov si,Int2f_Entry + 5636 000014C7 58 pop ax ; discard ds currently on stack + 5637 000014C8 1E push ds ; store our data segment 5638 - 5639 000014CC 31C0 xor ax,ax ; indicate COMMAND present - 5640 000014CE EB11 jmp short miRet ; return to caller + 5639 ;mov si,offset DATARES:Int2f_Entry ; start of table + 5640 000014C9 BE[6600] mov si,Int2f_Entry 5641 - 5642 miOurs: - 5643 000014D0 F6C201 test dl,1 - 5644 000014D3 750C jnz short miRet ; ignore 'set' operations - 5645 - 5646 000014D5 53 push bx ; preserve BX - 5647 000014D6 89D3 mov bx,dx - 5648 000014D8 30FF xor bh,bh ; BX = index in word table - 5649 000014DA D1E3 shl bx,1 ; BX = index in dword table - 5650 ;les di,MsgPtrLists[bx] ; ES:DI = ptr to msg ptr list - 5651 000014DC C4BF[4407] les di,[bx+MsgPtrLists] - 5652 000014E0 5B pop bx ; restore BX - 5653 miRet: - 5654 ; mov ds,[OldDS] ; restore ds - 5655 000014E1 1F pop ds - 5656 ;assume ds:nothing - 5657 - 5658 000014E2 CF iret - 5659 - 5660 ;MsgInt2fHandler endp - 5661 - 5662 ; MSDOS 6.0 - 5663 ; ---------------------------------------------------------------------------- - 5664 ;*** MsgRetriever - message retrieval routine for utilities - 5665 ; - 5666 ; Address of this routine is passed to utility programs via - 5667 ; message services int 2f. We try to find the desired message - 5668 ; in memory or in our disk image. - 5669 ; - 5670 ; ENTRY AX = message # - 5671 ; DI = offset in RESGROUP of msg ptr list - 5672 ; ComSpec = asciiz pathname to our disk image - 5673 ; - 5674 ; EXIT CY clear for success - 5675 ; ES:DI = ptr to count byte, followed by message text + 5642 000014CC 31C0 xor ax,ax ; indicate COMMAND present + 5643 000014CE EB11 jmp short miRet ; return to caller + 5644 + 5645 miOurs: + 5646 000014D0 F6C201 test dl,1 + 5647 000014D3 750C jnz short miRet ; ignore 'set' operations + 5648 + 5649 000014D5 53 push bx ; preserve BX + 5650 000014D6 89D3 mov bx,dx + 5651 000014D8 30FF xor bh,bh ; BX = index in word table + 5652 000014DA D1E3 shl bx,1 ; BX = index in dword table + 5653 ;les di,MsgPtrLists[bx] ; ES:DI = ptr to msg ptr list + 5654 000014DC C4BF[4407] les di,[bx+MsgPtrLists] + 5655 000014E0 5B pop bx ; restore BX + 5656 miRet: + 5657 ; mov ds,[OldDS] ; restore ds + 5658 000014E1 1F pop ds + 5659 ;assume ds:nothing + 5660 + 5661 000014E2 CF iret + 5662 + 5663 ;MsgInt2fHandler endp + 5664 + 5665 ; MSDOS 6.0 + 5666 ; ---------------------------------------------------------------------------- + 5667 ;*** MsgRetriever - message retrieval routine for utilities + 5668 ; + 5669 ; Address of this routine is passed to utility programs via + 5670 ; message services int 2f. We try to find the desired message + 5671 ; in memory or in our disk image. + 5672 ; + 5673 ; ENTRY AX = message # + 5674 ; DI = offset in RESGROUP of msg ptr list + 5675 ; ComSpec = asciiz pathname to our disk image 5676 ; - 5677 ; CY set for failure - 5678 ; ES,DI undefined + 5677 ; EXIT CY clear for success + 5678 ; ES:DI = ptr to count byte, followed by message text 5679 ; - 5680 ; USED flags - 5681 ; - 5682 ; NOTE - 5683 ; The message # in AX is used to compute an offset into - 5684 ; the message ptr list pointed to by DI. The lists must - 5685 ; start with message # 1 and proceed through consecutive - 5686 ; message #'s. - 5687 ; - 5688 ; It is assumed that the msg ptr list is either ParsMsgPtrs or - 5689 ; ExtMsgPtrs. We use NUMPARSEMSGS and NUMEXTMSGS to check for - 5690 ; valid message #. ;M033 - 5691 ; - 5692 ; List positions with no corresponding message text are - 5693 ; indicated by null pointers, which this routine detects. - 5694 ; ---------------------------------------------------------------------------- - 5695 - 5696 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5697 - 5698 ;SR; This routine will be called directly by the utilities. So, we have - 5699 ; trap for it in the stub. The stub pushes the old value of ds and the - 5700 ; DATARES value on the stack. We get them off the stack to setup ds here - 5701 - 5702 ;MsgRetriever proc far - 5703 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 5680 ; CY set for failure + 5681 ; ES,DI undefined + 5682 ; + 5683 ; USED flags + 5684 ; + 5685 ; NOTE + 5686 ; The message # in AX is used to compute an offset into + 5687 ; the message ptr list pointed to by DI. The lists must + 5688 ; start with message # 1 and proceed through consecutive + 5689 ; message #'s. + 5690 ; + 5691 ; It is assumed that the msg ptr list is either ParsMsgPtrs or + 5692 ; ExtMsgPtrs. We use NUMPARSEMSGS and NUMEXTMSGS to check for + 5693 ; valid message #. ;M033 + 5694 ; + 5695 ; List positions with no corresponding message text are + 5696 ; indicated by null pointers, which this routine detects. + 5697 ; ---------------------------------------------------------------------------- + 5698 + 5699 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5700 + 5701 ;SR; This routine will be called directly by the utilities. So, we have + 5702 ; trap for it in the stub. The stub pushes the old value of ds and the + 5703 ; DATARES value on the stack. We get them off the stack to setup ds here 5704 - 5705 ; 14/01/2023 - 5706 MsgRetriever: - 5707 000014E3 1F pop ds ; ds = DATARES - 5708 ;assume ds:DATARES - 5709 ; pop word [OldDS] ; save old ds - 5710 - 5711 000014E4 50 push ax ; preserve registers - 5712 000014E5 53 push bx - 5713 000014E6 51 push cx - 5714 000014E7 52 push dx - 5715 000014E8 56 push si - 5716 - 5717 ;; push ds - 5718 ;; push cs - 5719 ;; pop ds ; DS = DATARES seg addr - 5720 ;; assume ds:RESGROUP + 5705 ;MsgRetriever proc far + 5706 ; assume cs:CODERES,ds:NOTHING,es:NOTHING,ss:NOTHING + 5707 + 5708 ; 14/01/2023 + 5709 MsgRetriever: + 5710 000014E3 1F pop ds ; ds = DATARES + 5711 ;assume ds:DATARES + 5712 ; pop word [OldDS] ; save old ds + 5713 + 5714 000014E4 50 push ax ; preserve registers + 5715 000014E5 53 push bx + 5716 000014E6 51 push cx + 5717 000014E7 52 push dx + 5718 000014E8 56 push si + 5719 + 5720 ;; push ds 5721 ;; push cs - 5722 - 5723 000014E9 1E push ds ; get es from ds - 5724 000014EA 07 pop es ; ES = DATARES seg addr + 5722 ;; pop ds ; DS = DATARES seg addr + 5723 ;; assume ds:RESGROUP + 5724 ;; push cs 5725 - 5726 ; Begin modification M033. - 5727 - 5728 ; Make sure msg # is valid. - 5729 ; Assume msg ptr list is either ParsMsgPtrs or ExtMsgPtrs. + 5726 000014E9 1E push ds ; get es from ds + 5727 000014EA 07 pop es ; ES = DATARES seg addr + 5728 + 5729 ; Begin modification M033. 5730 - 5731 ;mov bx,11 - 5732 000014EB BB0B00 mov bx,NUMPARSMSGS ; BX = # parse error msgs in list - 5733 ;cmp di,offset DATARES:ParsMsgPtrs - 5734 000014EE 81FF[E309] cmp di,PARSMSGPTRS - 5735 000014F2 7403 je short chkmsgnum ; it's ParsMsgPtrs - 5736 ;mov bx,90 - 5737 000014F4 BB5A00 mov bx,NUMEXTMSGS ; BX = # extended error msgs in list - 5738 chkmsgnum: - 5739 000014F7 39C3 cmp bx,ax - 5740 000014F9 725A jc short mrRet ; msg # too high, return carry - 5741 - 5742 ; Msg # is valid. - 5743 - 5744 ; End modification M033. - 5745 - 5746 000014FB 48 dec ax - 5747 000014FC D1E0 shl ax,1 ; AX = offset into msg ptr list - 5748 000014FE 01C7 add di,ax ; DI = ptr to msg ptr - 5749 - 5750 00001500 81FF[B204] cmp di,ResMsgEnd - 5751 00001504 7247 jb short mrInMem ; ptr (and message) in memory + 5731 ; Make sure msg # is valid. + 5732 ; Assume msg ptr list is either ParsMsgPtrs or ExtMsgPtrs. + 5733 + 5734 ;mov bx,11 + 5735 000014EB BB0B00 mov bx,NUMPARSMSGS ; BX = # parse error msgs in list + 5736 ;cmp di,offset DATARES:ParsMsgPtrs + 5737 000014EE 81FF[E309] cmp di,PARSMSGPTRS + 5738 000014F2 7403 je short chkmsgnum ; it's ParsMsgPtrs + 5739 ;mov bx,90 + 5740 000014F4 BB5A00 mov bx,NUMEXTMSGS ; BX = # extended error msgs in list + 5741 chkmsgnum: + 5742 000014F7 39C3 cmp bx,ax + 5743 000014F9 725A jc short mrRet ; msg # too high, return carry + 5744 + 5745 ; Msg # is valid. + 5746 + 5747 ; End modification M033. + 5748 + 5749 000014FB 48 dec ax + 5750 000014FC D1E0 shl ax,1 ; AX = offset into msg ptr list + 5751 000014FE 01C7 add di,ax ; DI = ptr to msg ptr 5752 - 5753 ;* Retrieve message from disk (or ROM) image. - 5754 ; Read once to get the ptr to the message, then again for the message. + 5753 00001500 81FF[B204] cmp di,ResMsgEnd + 5754 00001504 7247 jb short mrInMem ; ptr (and message) in memory 5755 - 5756 ;ifndef ROMDOS - 5757 ; 14/01/2023 - 5758 ;mov si,offset DATARES:ComSpec ; DS:SI = ptr to pathname - 5759 00001506 BE[4B02] mov si,ComSpec - 5760 00001509 BA0100 mov dx,1 ; EXT_EXISTS_OPEN ; DX = 'open existing file' - 5761 0000150C BB0020 mov bx,2000h ; INT_24_ERROR ; BX = 'fail on crit error' - 5762 0000150F B8006C mov ax,6C00h - 5763 ;mov ax,ExtOpen shl 8 ; AX = 'Extended Open File' - 5764 00001512 CD21 int 21h ; call DOS - 5765 00001514 723F jc short mrRet ; return failure - 5766 - 5767 00001516 89C3 mov bx,ax ; BX = file handle - 5768 00001518 89FA mov dx,di ; DX = ptr to msg ptr - 5769 0000151A 31F6 xor si,si ; SI = read count - 5770 mrRead: - 5771 0000151C 81EA0001 sub dx,100h ; DX = LSW of file offset - 5772 00001520 31C9 xor cx,cx ; CX = MSW of file offset - 5773 00001522 B80042 mov ax,4200h - 5774 ;mov ax,LSEEK shl 8 ; AX = 'Set File Pointer' - 5775 00001525 CD21 int 21h ; call DOS - 5776 00001527 721A jc short mrCloseFile ; handle error - 5777 - 5778 ;mov dx,offset DATARES:MsgBuffer ; DS:DX = input buffer - 5779 00001529 BA[5E04] mov dx,MsgBuffer - 5780 0000152C B94000 mov cx,64 ; CX = # bytes to read - 5781 0000152F B43F mov ah,3Fh - 5782 ;mov ah,READ ; AH = 'Read File' - 5783 00001531 CD21 int 21h ; call DOS - 5784 00001533 720E jc short mrCloseFile ; handle error - 5785 - 5786 00001535 09F6 or si,si ; (CY cleared) - 5787 00001537 750A jnz short mrCloseFile ; 2nd time thru - we're done - 5788 00001539 46 inc si ; mark one read done - 5789 0000153A 8B16[5E04] mov dx,[MsgBuffer] ; DX = ptr to message - 5790 0000153E 09D2 or dx,dx - 5791 00001540 75DA jnz short mrRead ; go read the message - 5792 00001542 F9 stc ; null ptr found- no msg - 5793 - 5794 mrCloseFile: - 5795 00001543 9C pushf ; save success/failure (CY) - 5796 00001544 B43E mov ah,3Eh - 5797 ;mov ah,CLOSE ; AH = 'Close File' - 5798 00001546 CD21 int 21h ; call DOS - 5799 ; Bugbug: should we avoid this popf? - 5800 00001548 9D popf ; CY = success/failure - 5801 00001549 89D7 mov di,dx ; ES:DI = ptr to msg, if successful - 5802 0000154B EB08 jmp short mrRet ; we're done - 5803 - 5804 ;else ;ROMDOS - 5805 ; - 5806 ;; DI = ptr to msg ptr - 5807 ; - 5808 ; mov si,di ; SI = ptr to msg ptr - 5809 ; sub si,100h ; SI = offset into image of msg ptr - 5810 ; mov cx,2 ; CX = # bytes to copy from image - 5811 ; - 5812 ;; ASSUME ES:NOTHING is still in effect. - 5813 ; - 5814 ; push ds - 5815 ; pop es ; ES = DATARES seg addr - 5816 ; mov di,offset DATARES:MsgBuffer ; ES:DI = ptr to buffer - 5817 ; invoke LoadFromROM ; copy msg ptr from ROM - 5818 ; mov si,word ptr MsgBuffer ; SI = ptr to message - 5819 ; or si,si - 5820 ; jz mrNoMsg ; null ptr- no message text - 5821 ; - 5822 ; sub si,100h ; SI = offset into image of msg - 5823 ; mov cx,64 ; CX = # bytes to copy from image - 5824 ; mov di,offset DATARES:MsgBuffer - 5825 ; invoke LoadFromROM - 5826 ; clc ; success - 5827 ; mov di,offset DATARES:MsgBuffer ; ES:DI = ptr to msg - 5828 ; jmp short mrRet - 5829 ; - 5830 ;mrNoMsg: - 5831 ; stc - 5832 ; jmp short mrRet - 5833 ; - 5834 ;;; mov ax,COMMAND_SEG-10h ; AX = seg addr of COMMAND image - 5835 ;;; mov es,ax ; ES:DI = ptr to msg ptr in image - 5836 ; assume es:NOTHING - 5837 ; - 5838 ;endif ;ROMDOS - 5839 - 5840 ;* Message ptr is in memory. - 5841 ; If ptr is in memory, assume message is in memory (/msg). + 5756 ;* Retrieve message from disk (or ROM) image. + 5757 ; Read once to get the ptr to the message, then again for the message. + 5758 + 5759 ;ifndef ROMDOS + 5760 ; 14/01/2023 + 5761 ;mov si,offset DATARES:ComSpec ; DS:SI = ptr to pathname + 5762 00001506 BE[4B02] mov si,ComSpec + 5763 00001509 BA0100 mov dx,1 ; EXT_EXISTS_OPEN ; DX = 'open existing file' + 5764 0000150C BB0020 mov bx,2000h ; INT_24_ERROR ; BX = 'fail on crit error' + 5765 0000150F B8006C mov ax,6C00h + 5766 ;mov ax,ExtOpen shl 8 ; AX = 'Extended Open File' + 5767 00001512 CD21 int 21h ; call DOS + 5768 00001514 723F jc short mrRet ; return failure + 5769 + 5770 00001516 89C3 mov bx,ax ; BX = file handle + 5771 00001518 89FA mov dx,di ; DX = ptr to msg ptr + 5772 0000151A 31F6 xor si,si ; SI = read count + 5773 mrRead: + 5774 0000151C 81EA0001 sub dx,100h ; DX = LSW of file offset + 5775 00001520 31C9 xor cx,cx ; CX = MSW of file offset + 5776 00001522 B80042 mov ax,4200h + 5777 ;mov ax,LSEEK shl 8 ; AX = 'Set File Pointer' + 5778 00001525 CD21 int 21h ; call DOS + 5779 00001527 721A jc short mrCloseFile ; handle error + 5780 + 5781 ;mov dx,offset DATARES:MsgBuffer ; DS:DX = input buffer + 5782 00001529 BA[5E04] mov dx,MsgBuffer + 5783 0000152C B94000 mov cx,64 ; CX = # bytes to read + 5784 0000152F B43F mov ah,3Fh + 5785 ;mov ah,READ ; AH = 'Read File' + 5786 00001531 CD21 int 21h ; call DOS + 5787 00001533 720E jc short mrCloseFile ; handle error + 5788 + 5789 00001535 09F6 or si,si ; (CY cleared) + 5790 00001537 750A jnz short mrCloseFile ; 2nd time thru - we're done + 5791 00001539 46 inc si ; mark one read done + 5792 0000153A 8B16[5E04] mov dx,[MsgBuffer] ; DX = ptr to message + 5793 0000153E 09D2 or dx,dx + 5794 00001540 75DA jnz short mrRead ; go read the message + 5795 00001542 F9 stc ; null ptr found- no msg + 5796 + 5797 mrCloseFile: + 5798 00001543 9C pushf ; save success/failure (CY) + 5799 00001544 B43E mov ah,3Eh + 5800 ;mov ah,CLOSE ; AH = 'Close File' + 5801 00001546 CD21 int 21h ; call DOS + 5802 ; Bugbug: should we avoid this popf? + 5803 00001548 9D popf ; CY = success/failure + 5804 00001549 89D7 mov di,dx ; ES:DI = ptr to msg, if successful + 5805 0000154B EB08 jmp short mrRet ; we're done + 5806 + 5807 ;else ;ROMDOS + 5808 ; + 5809 ;; DI = ptr to msg ptr + 5810 ; + 5811 ; mov si,di ; SI = ptr to msg ptr + 5812 ; sub si,100h ; SI = offset into image of msg ptr + 5813 ; mov cx,2 ; CX = # bytes to copy from image + 5814 ; + 5815 ;; ASSUME ES:NOTHING is still in effect. + 5816 ; + 5817 ; push ds + 5818 ; pop es ; ES = DATARES seg addr + 5819 ; mov di,offset DATARES:MsgBuffer ; ES:DI = ptr to buffer + 5820 ; invoke LoadFromROM ; copy msg ptr from ROM + 5821 ; mov si,word ptr MsgBuffer ; SI = ptr to message + 5822 ; or si,si + 5823 ; jz mrNoMsg ; null ptr- no message text + 5824 ; + 5825 ; sub si,100h ; SI = offset into image of msg + 5826 ; mov cx,64 ; CX = # bytes to copy from image + 5827 ; mov di,offset DATARES:MsgBuffer + 5828 ; invoke LoadFromROM + 5829 ; clc ; success + 5830 ; mov di,offset DATARES:MsgBuffer ; ES:DI = ptr to msg + 5831 ; jmp short mrRet + 5832 ; + 5833 ;mrNoMsg: + 5834 ; stc + 5835 ; jmp short mrRet + 5836 ; + 5837 ;;; mov ax,COMMAND_SEG-10h ; AX = seg addr of COMMAND image + 5838 ;;; mov es,ax ; ES:DI = ptr to msg ptr in image + 5839 ; assume es:NOTHING + 5840 ; + 5841 ;endif ;ROMDOS 5842 - 5843 mrInMem: - 5844 ; 14/01/2023 - 5845 0000154D 268B3D mov di,[es:di] ; ES:DI = ptr to msg - 5846 00001550 09FF or di,di ; (CY cleared) - 5847 00001552 7501 jnz short mrRet ; found message - 5848 00001554 F9 stc ; null ptr found - no message - 5849 mrRet: - 5850 00001555 5E pop si ; restore all registers - 5851 00001556 5A pop dx - 5852 00001557 59 pop cx - 5853 00001558 5B pop bx - 5854 00001559 58 pop ax - 5855 - 5856 ; mov ds,[OldDS] ; restore ds - 5857 0000155A 1F pop ds - 5858 ;assume ds:nothing - 5859 - 5860 0000155B CB retf ; 21/04/2023 - 5861 - 5862 ;MsgRetriever endp - 5863 - 5864 ; M003; Start of changes for UMB support - 5865 - 5866 ; ---------------------------------------------------------------------------- - 5867 ;*** Lh_OffUnlink -- Restore allocation strat and link state - 5868 ; - 5869 ; ENTRY al = Saved alloc strat and link state - 5870 ; b0 = 1 if alloc strat to restore is HighFirst - 5871 ; b1 = 1 if link state to restore is Linked - 5872 ; - 5873 ; EXIT None - 5874 ; - 5875 ; USED ax, bx, cx - 5876 ; ---------------------------------------------------------------------------- - 5877 - 5878 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5879 - 5880 ;public Lh_OffUnlink - 5881 Lh_OffUnlink: ; proc far - 5882 ; 14/01/2023 - 5883 0000155C 88C5 mov ch,al - 5884 0000155E 88C1 mov cl,al - 5885 ;;mov ax,(ALLOCOPER shl 8) OR 0 - 5886 ;mov ax,(ALLOCOPER<<8) - 5887 00001560 B80058 mov ax,5800h - 5888 00001563 CD21 int 21h - 5889 00001565 89C3 mov bx,ax - 5890 00001567 D0C9 ror cl,1 ; b7 = HighFirst bit - 5891 00001569 80E180 and cl,80h ; mask off b6-b0 - 5892 0000156C 80E37F and bl,7fh ; mask off HighFirst bit - 5893 0000156F 08CB or bl,cl ; set HighFirst bit state - 5894 ;;mov ax,(ALLOCOPER shl 8) OR 1 - 5895 ;mov ax,(ALLOCOPER<<8)|1 - 5896 00001571 B80158 mov ax,5801h - 5897 00001574 CD21 int 21h ; set alloc strat - 5898 - 5899 00001576 88EB mov bl,ch - 5900 00001578 D0EB shr bl,1 - 5901 0000157A 30FF xor bh,bh ; bx = linkstate - 5902 ;mov ax,(ALLOCOPER shl 8) OR 3 - 5903 ;mov ax,(ALLOCOPER<<8)|3 - 5904 0000157C B80358 mov ax,5803h - 5905 0000157F CD21 int 21h ; set linkstate - 5906 - 5907 00001581 CB retf - 5908 - 5909 ;Lh_OffUnlink endp - 5910 - 5911 ; M003; End of changes for UMB support - 5912 ;public EndCode - 5913 ; 14/01/2023 - 5914 ;EndCode: ; label byte - 5915 ; 06/06/2023 - 5916 ; 16/04/2023 - 5917 ; 14/08/2024 - 5918 ;EndCode equ ($-StartCode)+100h - 5919 - 5920 ; 06/06/2023 - 5921 ;EndCode equ $-StartCode + 5843 ;* Message ptr is in memory. + 5844 ; If ptr is in memory, assume message is in memory (/msg). + 5845 + 5846 mrInMem: + 5847 ; 14/01/2023 + 5848 0000154D 268B3D mov di,[es:di] ; ES:DI = ptr to msg + 5849 00001550 09FF or di,di ; (CY cleared) + 5850 00001552 7501 jnz short mrRet ; found message + 5851 00001554 F9 stc ; null ptr found - no message + 5852 mrRet: + 5853 00001555 5E pop si ; restore all registers + 5854 00001556 5A pop dx + 5855 00001557 59 pop cx + 5856 00001558 5B pop bx + 5857 00001559 58 pop ax + 5858 + 5859 ; mov ds,[OldDS] ; restore ds + 5860 0000155A 1F pop ds + 5861 ;assume ds:nothing + 5862 + 5863 0000155B CB retf ; 21/04/2023 + 5864 + 5865 ;MsgRetriever endp + 5866 + 5867 ; M003; Start of changes for UMB support + 5868 + 5869 ; ---------------------------------------------------------------------------- + 5870 ;*** Lh_OffUnlink -- Restore allocation strat and link state + 5871 ; + 5872 ; ENTRY al = Saved alloc strat and link state + 5873 ; b0 = 1 if alloc strat to restore is HighFirst + 5874 ; b1 = 1 if link state to restore is Linked + 5875 ; + 5876 ; EXIT None + 5877 ; + 5878 ; USED ax, bx, cx + 5879 ; ---------------------------------------------------------------------------- + 5880 + 5881 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5882 + 5883 ;public Lh_OffUnlink + 5884 Lh_OffUnlink: ; proc far + 5885 ; 14/01/2023 + 5886 0000155C 88C5 mov ch,al + 5887 0000155E 88C1 mov cl,al + 5888 ;;mov ax,(ALLOCOPER shl 8) OR 0 + 5889 ;mov ax,(ALLOCOPER<<8) + 5890 00001560 B80058 mov ax,5800h + 5891 00001563 CD21 int 21h + 5892 00001565 89C3 mov bx,ax + 5893 00001567 D0C9 ror cl,1 ; b7 = HighFirst bit + 5894 00001569 80E180 and cl,80h ; mask off b6-b0 + 5895 0000156C 80E37F and bl,7fh ; mask off HighFirst bit + 5896 0000156F 08CB or bl,cl ; set HighFirst bit state + 5897 ;;mov ax,(ALLOCOPER shl 8) OR 1 + 5898 ;mov ax,(ALLOCOPER<<8)|1 + 5899 00001571 B80158 mov ax,5801h + 5900 00001574 CD21 int 21h ; set alloc strat + 5901 + 5902 00001576 88EB mov bl,ch + 5903 00001578 D0EB shr bl,1 + 5904 0000157A 30FF xor bh,bh ; bx = linkstate + 5905 ;mov ax,(ALLOCOPER shl 8) OR 3 + 5906 ;mov ax,(ALLOCOPER<<8)|3 + 5907 0000157C B80358 mov ax,5803h + 5908 0000157F CD21 int 21h ; set linkstate + 5909 + 5910 00001581 CB retf + 5911 + 5912 ;Lh_OffUnlink endp + 5913 + 5914 ; M003; End of changes for UMB support + 5915 ;public EndCode + 5916 ; 14/01/2023 + 5917 ;EndCode: ; label byte + 5918 ; 06/06/2023 + 5919 ; 16/04/2023 + 5920 ; 14/08/2024 + 5921 ;EndCode equ ($-StartCode)+100h 5922 - 5923 ; 14/08/2024 - 5924 EndCode: - 5925 ENDCODE equ ($-StartCode)+100h - 5926 - 5927 ;CODERES ends - 5928 ; end + 5923 ; 06/06/2023 + 5924 ;EndCode equ $-StartCode + 5925 + 5926 ; 14/08/2024 + 5927 EndCode: + 5928 ENDCODE equ ($-StartCode)+100h 5929 - 5930 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5931 - 5932 ;times (((EndCode+15)>>4)<<4)-EndCode db 0 - 5933 ; 14/08/2024 - 5934 00001582 00 times (((ENDCODE+15)>>4)<<4)-ENDCODE db 0 - 5935 - 5936 ;align 16 - 5937 - 5938 ;============================================================================= - 5939 ; INIT.ASM, MSDOS 6.0 (COMMAND.COM), 1991 - 5940 ;============================================================================= - 5941 ; 22/09/2018 - Retro DOS v3.0 ('command3.s') - 5942 - 5943 ; INIT.ASM (MSDOS 2.11 COMMAND.COM, Retro DOS v2.0, 30/04/2018) - 5944 - 5945 ;TITLE COMMAND Initialization - 5946 - 5947 ;ENVIRONSIZ EQU 0A0H ; Must agree with values in ENVIRONMENT segment - 5948 ;ENVIRONSIZ2 EQU 092H - 5949 ;MAX_COMSPEC EQU ENVIRONSIZ2 ; = 146 ; 22/09/2018 - 5950 - 5951 ; UINIT.ASM, MSDOS 6.0, 1991 - 5952 ; 23/09/2018 - 5953 ENVBIG EQU 32768 ;AN000; maximum environment size - 5954 ; 14/01/2023 - 5955 ;ENVSML EQU 160 ;AN000; minimum environment size - 5956 - 5957 ; ---------------------------------------------------------------------------- - 5958 - 5959 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 5960 - 5961 ; 06/06/2023 - 5962 ; (MSDOS 5.0 COMMAND.COM -initial- Environment Structure size) - 5963 ;ENVIRONSIZ equ 160 - 5964 - 5965 ENVSML equ 256 ; minimum environment size - 5966 ;MAX_COMSPEC equ ENVIRONSIZ - Env_ComSpec - 5967 MAX_COMSPEC equ 146 - 5968 ECOMSPEC equ 14 - 5969 - 5970 ; 14/01/2023 - 5971 TAB_CHAR equ 09h - 5972 SPACE_CHAR equ 20h - 5973 - 5974 ; 06/06/2023 - 5975 ; (MSDOS 6.22 COMMAND.COM -initial- Environment Structure size) - 5976 ;ENVIRONSIZ equ 180 ; SIZE Environment - 5977 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 5978 ; (PCDOS 7.1 COMMAND.COM -initial- Environment Structure size) - 5979 ENVIRONSIZ equ 166 ; SIZE Environment - 5980 - 5981 ;---------------------------------------------------- - 5982 ; MSDOS 6.0 - ENVDATA.ASM - 1991 - 5983 ;---------------------------------------------------- - 5984 ;Environment Struc ; Default COMMAND environment - 5985 ; - 5986 ;Env_PathString db "path=" - 5987 ;Env_PathSpec db "c:\msdos" - 5988 ; db 0 - 5989 ;Env_PrmptString db "prompt=" - 5990 ;Env_PrmptSpec db "$p$g" + 5930 ;CODERES ends + 5931 ; end + 5932 + 5933 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5934 + 5935 ;times (((EndCode+15)>>4)<<4)-EndCode db 0 + 5936 ; 14/08/2024 + 5937 00001582 00 times (((ENDCODE+15)>>4)<<4)-ENDCODE db 0 + 5938 + 5939 ;align 16 + 5940 + 5941 ;============================================================================= + 5942 ; INIT.ASM, MSDOS 6.0 (COMMAND.COM), 1991 + 5943 ;============================================================================= + 5944 ; 22/09/2018 - Retro DOS v3.0 ('command3.s') + 5945 + 5946 ; INIT.ASM (MSDOS 2.11 COMMAND.COM, Retro DOS v2.0, 30/04/2018) + 5947 + 5948 ;TITLE COMMAND Initialization + 5949 + 5950 ;ENVIRONSIZ EQU 0A0H ; Must agree with values in ENVIRONMENT segment + 5951 ;ENVIRONSIZ2 EQU 092H + 5952 ;MAX_COMSPEC EQU ENVIRONSIZ2 ; = 146 ; 22/09/2018 + 5953 + 5954 ; UINIT.ASM, MSDOS 6.0, 1991 + 5955 ; 23/09/2018 + 5956 ENVBIG EQU 32768 ;AN000; maximum environment size + 5957 ; 14/01/2023 + 5958 ;ENVSML EQU 160 ;AN000; minimum environment size + 5959 + 5960 ; ---------------------------------------------------------------------------- + 5961 + 5962 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 5963 + 5964 ; 06/06/2023 + 5965 ; (MSDOS 5.0 COMMAND.COM -initial- Environment Structure size) + 5966 ;ENVIRONSIZ equ 160 + 5967 + 5968 ENVSML equ 256 ; minimum environment size + 5969 ;MAX_COMSPEC equ ENVIRONSIZ - Env_ComSpec + 5970 MAX_COMSPEC equ 146 + 5971 ECOMSPEC equ 14 + 5972 + 5973 ; 14/01/2023 + 5974 TAB_CHAR equ 09h + 5975 SPACE_CHAR equ 20h + 5976 + 5977 ; 06/06/2023 + 5978 ; (MSDOS 6.22 COMMAND.COM -initial- Environment Structure size) + 5979 ;ENVIRONSIZ equ 180 ; SIZE Environment + 5980 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 5981 ; (PCDOS 7.1 COMMAND.COM -initial- Environment Structure size) + 5982 ENVIRONSIZ equ 166 ; SIZE Environment + 5983 + 5984 ;---------------------------------------------------- + 5985 ; MSDOS 6.0 - ENVDATA.ASM - 1991 + 5986 ;---------------------------------------------------- + 5987 ;Environment Struc ; Default COMMAND environment + 5988 ; + 5989 ;Env_PathString db "path=" + 5990 ;Env_PathSpec db "c:\msdos" 5991 ; db 0 - 5992 ;Env_ComString db "comspec=" - 5993 ;Env_ComSpec db "\command.com" - 5994 ; db 134 dup (0) - 5995 ; - 5996 ;Environment ends - 5997 ;---------------------------------------------------- - 5998 - 5999 ;----------------------------------------------------------------------------- - 6000 - 6001 ;----------------------------------------------------------------------------- - 6002 ; START OF INIT PORTION - 6003 ; This code is deallocated after initialization. + 5992 ;Env_PrmptString db "prompt=" + 5993 ;Env_PrmptSpec db "$p$g" + 5994 ; db 0 + 5995 ;Env_ComString db "comspec=" + 5996 ;Env_ComSpec db "\command.com" + 5997 ; db 134 dup (0) + 5998 ; + 5999 ;Environment ends + 6000 ;---------------------------------------------------- + 6001 + 6002 ;----------------------------------------------------------------------------- + 6003 6004 ;----------------------------------------------------------------------------- - 6005 - 6006 ;INIT SEGMENT PUBLIC PARA - 6007 - 6008 ; EXTRN HEADER:BYTE - 6009 ; EXTRN BADCOMLKMES:BYTE + 6005 ; START OF INIT PORTION + 6006 ; This code is deallocated after initialization. + 6007 ;----------------------------------------------------------------------------- + 6008 + 6009 ;INIT SEGMENT PUBLIC PARA 6010 - 6011 ; PUBLIC CONPROC - 6012 - 6013 ;ASSUME CS:RESGROUP,DS:RESGROUP,ES:RESGROUP,SS:RESGROUP - 6014 - 6015 ;ORG 0 - 6016 ;ZERO = $ - 6017 ; 23/09/2018 - 6018 ZERO equ $ ; Offset 0E30h for original MSDOS 3.3 COMMAND.COM - 6019 - 6020 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 6021 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1560h (CODERES:0820h) + 6011 ; EXTRN HEADER:BYTE + 6012 ; EXTRN BADCOMLKMES:BYTE + 6013 + 6014 ; PUBLIC CONPROC + 6015 + 6016 ;ASSUME CS:RESGROUP,DS:RESGROUP,ES:RESGROUP,SS:RESGROUP + 6017 + 6018 ;ORG 0 + 6019 ;ZERO = $ + 6020 ; 23/09/2018 + 6021 ZERO equ $ ; Offset 0E30h for original MSDOS 3.3 COMMAND.COM 6022 - 6023 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 6024 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1670h (CODERES:0820h) - 6025 ConProc: - 6026 ;mov sp,offset ResGroup:RStack ; must be first instruction - 6027 00001590 BC[2E05] mov sp,RStack - 6028 - 6029 ; We need to set the PSP to us right at start because Carousel needs - 6030 ; to be lied to and it does not set PSP when it transfers control to - 6031 ; us after loading us as an overlay. By setting PSP, we ensure that - 6032 ; command.com is also not lied to. - 6033 - 6034 ; 14/01/2023 - 6035 ; MSDOS 6.0 - 6036 00001593 B450 mov ah,50h - 6037 ;mov ah,SET_CURRENT_PDB - 6038 00001595 8CC3 mov bx,es - 6039 00001597 CD21 int 21h - 6040 - 6041 ; 14/01/2023 - 6042 ;mov ah,30h - 6043 ;;mov ax,GET_VERSION<<8 ; 3000h - 6044 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6045 00001599 B80030 mov ax,3000h - 6046 0000159C CD21 int 21h - 6047 ;;;cmp ax,EXPECTED_VERSION ; 1E03h - 6048 ;;cmp ax,5 - 6049 ;cmp ax,EXPECTED_VERSION ; 0005h - 6050 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6051 0000159E 3D070A cmp ax,EXPECTED_VERSION ; 1606h - 6052 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM - 6053 ;cmp ax,0A07h - 6054 000015A1 7411 je short okdos ; DOS version is ok - 6055 - 6056 000015A3 BA[6321] mov dx,BADVERMSG ; DX = ptr to msg - 6057 000015A6 E832FE call RPrint + 6023 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 6024 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1560h (CODERES:0820h) + 6025 + 6026 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 6027 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1670h (CODERES:0820h) + 6028 ConProc: + 6029 ;mov sp,offset ResGroup:RStack ; must be first instruction + 6030 00001590 BC[2E05] mov sp,RStack + 6031 + 6032 ; We need to set the PSP to us right at start because Carousel needs + 6033 ; to be lied to and it does not set PSP when it transfers control to + 6034 ; us after loading us as an overlay. By setting PSP, we ensure that + 6035 ; command.com is also not lied to. + 6036 + 6037 ; 14/01/2023 + 6038 ; MSDOS 6.0 + 6039 00001593 B450 mov ah,50h + 6040 ;mov ah,SET_CURRENT_PDB + 6041 00001595 8CC3 mov bx,es + 6042 00001597 CD21 int 21h + 6043 + 6044 ; 14/01/2023 + 6045 ;mov ah,30h + 6046 ;;mov ax,GET_VERSION<<8 ; 3000h + 6047 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6048 00001599 B80030 mov ax,3000h + 6049 0000159C CD21 int 21h + 6050 ;;;cmp ax,EXPECTED_VERSION ; 1E03h + 6051 ;;cmp ax,5 + 6052 ;cmp ax,EXPECTED_VERSION ; 0005h + 6053 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6054 0000159E 3D070A cmp ax,EXPECTED_VERSION ; 1606h + 6055 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM + 6056 ;cmp ax,0A07h + 6057 000015A1 7411 je short okdos ; DOS version is ok 6058 - 6059 ; MSDOS 3.3 - 6060 ;mov ah,STD_CON_STRING_OUTPUT ; 9 - 6061 ;int 21h ; DOS - PRINT STRING - 6062 ; DS:DX -> string terminated by "$" - 6063 000015A9 8CC0 mov ax,es - 6064 000015AB 2639061600 cmp [es:PDB.PARENT_PID],ax - 6065 ;cmp [es:16h],ax ; if COMMAND is own parent, - 6066 Here: - 6067 000015B0 74FE jz short Here ; loop forever - 6068 - 6069 000015B2 CD20 int 20h ; otherwise, exit - 6070 okdos: - 6071 ; 23/09/2018 - 6072 - 6073 ; Calculate and save the end of the INIT segment (which is also - 6074 ; the beginning of TRANGROUP). + 6059 000015A3 BA[6321] mov dx,BADVERMSG ; DX = ptr to msg + 6060 000015A6 E832FE call RPrint + 6061 + 6062 ; MSDOS 3.3 + 6063 ;mov ah,STD_CON_STRING_OUTPUT ; 9 + 6064 ;int 21h ; DOS - PRINT STRING + 6065 ; DS:DX -> string terminated by "$" + 6066 000015A9 8CC0 mov ax,es + 6067 000015AB 2639061600 cmp [es:PDB.PARENT_PID],ax + 6068 ;cmp [es:16h],ax ; if COMMAND is own parent, + 6069 Here: + 6070 000015B0 74FE jz short Here ; loop forever + 6071 + 6072 000015B2 CD20 int 20h ; otherwise, exit + 6073 okdos: + 6074 ; 23/09/2018 6075 - 6076 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 6077 ; MSDOS 3.3 - 6078 ;mov ah,65h - 6079 ;mov al,2 - 6080 ;mov dx,-1 - 6081 ;mov bx,-1 - 6082 ;mov cx,5 - 6083 ;mov di,UCASE_ADDR - 6084 ;int 21h ; AH = 65h : GET EXTENDED COUNTRY INFORMATION (DOS 3.3+) - 6085 ; ; AL = 02h : Get pointer to character translation table - 6086 ; ; BX = code page (-1 = current global code page) - 6087 ; ; DX = country ID (-1 = current country) - 6088 ; ; CX = amount of data to return - 6089 ;; ES:DI = pointer to output buffer - 6090 ;; Buffer offset : - 6091 ;; 00h - byte, country Id - 6092 ;; 01h - dword, pointer to uppercase table - 6093 - 6094 ; 14/01/2023 - 6095 ; MSDOS 6.0 (& MSDOS 3.3) - 6096 ;mov dx,232Fh ; MSDOS 5.0 COMMAND.COM - 6097 ; 06/06/2023 - 6098 ;mov dx,26EFh ; MSDOS 6.22 COMMAND.COM - 6099 ; 18/07/2024 - 6100 ;mov dx,289Fh ; PCDOS 7.1 COMMAND.COM - 6101 000015B4 BADF27 mov dx,TRANSTART+15 ; get end of init code - 6102 ; 27/09/2018 - 6103 ;mov dx,TRANSTART ; (paragraph aligned address) - 6104 000015B7 B104 mov cl,4 ; change to paragraphs - 6105 000015B9 D3EA shr dx,cl ; - 6106 000015BB 8CC8 mov ax,cs ; get current segment - 6107 000015BD 01D0 add ax,dx ; calculate segment of end of init - 6108 000015BF A3[9020] mov [initend],ax ; save this - 6109 - 6110 ; 14/01/2023 - 6111 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1591h + 6076 ; Calculate and save the end of the INIT segment (which is also + 6077 ; the beginning of TRANGROUP). + 6078 + 6079 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 6080 ; MSDOS 3.3 + 6081 ;mov ah,65h + 6082 ;mov al,2 + 6083 ;mov dx,-1 + 6084 ;mov bx,-1 + 6085 ;mov cx,5 + 6086 ;mov di,UCASE_ADDR + 6087 ;int 21h ; AH = 65h : GET EXTENDED COUNTRY INFORMATION (DOS 3.3+) + 6088 ; ; AL = 02h : Get pointer to character translation table + 6089 ; ; BX = code page (-1 = current global code page) + 6090 ; ; DX = country ID (-1 = current country) + 6091 ; ; CX = amount of data to return + 6092 ;; ES:DI = pointer to output buffer + 6093 ;; Buffer offset : + 6094 ;; 00h - byte, country Id + 6095 ;; 01h - dword, pointer to uppercase table + 6096 + 6097 ; 14/01/2023 + 6098 ; MSDOS 6.0 (& MSDOS 3.3) + 6099 ;mov dx,232Fh ; MSDOS 5.0 COMMAND.COM + 6100 ; 06/06/2023 + 6101 ;mov dx,26EFh ; MSDOS 6.22 COMMAND.COM + 6102 ; 18/07/2024 + 6103 ;mov dx,289Fh ; PCDOS 7.1 COMMAND.COM + 6104 000015B4 BADF27 mov dx,TRANSTART+15 ; get end of init code + 6105 ; 27/09/2018 + 6106 ;mov dx,TRANSTART ; (paragraph aligned address) + 6107 000015B7 B104 mov cl,4 ; change to paragraphs + 6108 000015B9 D3EA shr dx,cl ; + 6109 000015BB 8CC8 mov ax,cs ; get current segment + 6110 000015BD 01D0 add ax,dx ; calculate segment of end of init + 6111 000015BF A3[9020] mov [initend],ax ; save this 6112 - 6113 ; Check for /? on the command line. If found, display help text and exit. - 6114 ; NOTE: this routine may terminate the program, never returning. + 6113 ; 14/01/2023 + 6114 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1591h 6115 - 6116 000015C2 E8EA07 call CheckHelp - 6117 - 6118 ; We have to patch the segment values for the various interrupt entry points. - 6119 ; This is because we need to have the default addresses of the handlers in our - 6120 ; stub before the relocation is done. These values will then be changed once - 6121 ; the resident is relocated - 6122 - 6123 000015C5 E8160A call patch_segs - 6124 - 6125 ; Turn APPEND off during initialization processing - 6126 - 6127 ; 14/01/2023 - 6128 000015C8 B800B7 mov ax,0B700h - 6129 ;mov ax,APPENDINSTALL ; see if append installed - 6130 000015CB CD2F int 2Fh ; - 6131 ;cmp al,0 ; append installed? - 6132 000015CD 08C0 or al,al - 6133 000015CF 7418 jz short set_msg_addr ; no - continue - 6134 - 6135 000015D1 B802B7 mov ax,0B702h - 6136 ;mov ax,APPENDDOS ; see if append DOS version right - 6137 000015D4 CD2F int 2Fh ; - 6138 ;cmp ax,-1 ; append version correct? - 6139 ;jne short set_msg_addr ; no - continue - 6140 000015D6 40 inc ax ; -1 -> 0 - 6141 000015D7 7510 jnz short set_msg_addr - 6142 - 6143 000015D9 B806B7 mov ax,0B706h - 6144 ;mov ax,APPENDGETSTATE ; Get the state of Append - 6145 000015DC CD2F int 2Fh ; - 6146 000015DE 891E[BE02] mov [Append_State],bx ; save append state - 6147 - 6148 000015E2 31DB xor bx,bx ; clear out state - 6149 000015E4 B807B7 mov ax,0B707h - 6150 ;mov ax,APPENDSETSTATE ; Set the state of Append - 6151 000015E7 CD2F int 2Fh ; set everything off - 6152 - 6153 set_msg_addr: - 6154 ; 14/01/2023 - 6155 ;;mov di,offset resgroup:DataresEnd ; get address of resident end - 6156 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:15BAh) - 6157 ;mov di,093Eh ; mov di,PAERRMSG0 ; MSDOS 5.0 COMMAND.COM - 6158 ; 06/06/2023 - 6159 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:16CBh) - 6160 ;mov di,0A41h ; mov di,PAERRMSG0 ; MSDOS 6.22 COMMAND.COM - 6161 ; 18/07/2024 - 6162 ;mov di,9F3h ; mov di,PAERRMSG0 ; PCDOS 7.1 COMMAND.COM - 6163 000015E9 BF[0509] mov di,DataresEnd - 6164 000015EC 893E[B204] mov [ResMsgEnd],di ; save it - 6165 - 6166 000015F0 E8FD09 call get_XMMAddr ; get XMM call address - 6167 - 6168 ; Check if this is the first instance of command.com. If not, we just exit - 6169 ; this routine without moving any code. - 6170 ; After the int 2fh, ds:si points at the resident jump table in the previous - 6171 ; stub. We just have to copy this over - 6172 - 6173 ;ifndef ROMDOS - 6174 000015F3 B80055 mov ax,5500h - 6175 ;mov ax,GET_COMMAND_STATE - 6176 ;else - 6177 ; mov ax,GET_ROMCOMMAND_STATE - 6178 ;endif ; ROMDOS - 6179 - 6180 000015F6 CD2F int 2Fh ; (Int 2Fh/AX=5500h - DOS 5+ - COMMAND.COM INTERFACE) - 6181 ;assume ds:nothing + 6116 ; Check for /? on the command line. If found, display help text and exit. + 6117 ; NOTE: this routine may terminate the program, never returning. + 6118 + 6119 000015C2 E8EA07 call CheckHelp + 6120 + 6121 ; We have to patch the segment values for the various interrupt entry points. + 6122 ; This is because we need to have the default addresses of the handlers in our + 6123 ; stub before the relocation is done. These values will then be changed once + 6124 ; the resident is relocated + 6125 + 6126 000015C5 E8160A call patch_segs + 6127 + 6128 ; Turn APPEND off during initialization processing + 6129 + 6130 ; 14/01/2023 + 6131 000015C8 B800B7 mov ax,0B700h + 6132 ;mov ax,APPENDINSTALL ; see if append installed + 6133 000015CB CD2F int 2Fh ; + 6134 ;cmp al,0 ; append installed? + 6135 000015CD 08C0 or al,al + 6136 000015CF 7418 jz short set_msg_addr ; no - continue + 6137 + 6138 000015D1 B802B7 mov ax,0B702h + 6139 ;mov ax,APPENDDOS ; see if append DOS version right + 6140 000015D4 CD2F int 2Fh ; + 6141 ;cmp ax,-1 ; append version correct? + 6142 ;jne short set_msg_addr ; no - continue + 6143 000015D6 40 inc ax ; -1 -> 0 + 6144 000015D7 7510 jnz short set_msg_addr + 6145 + 6146 000015D9 B806B7 mov ax,0B706h + 6147 ;mov ax,APPENDGETSTATE ; Get the state of Append + 6148 000015DC CD2F int 2Fh ; + 6149 000015DE 891E[BE02] mov [Append_State],bx ; save append state + 6150 + 6151 000015E2 31DB xor bx,bx ; clear out state + 6152 000015E4 B807B7 mov ax,0B707h + 6153 ;mov ax,APPENDSETSTATE ; Set the state of Append + 6154 000015E7 CD2F int 2Fh ; set everything off + 6155 + 6156 set_msg_addr: + 6157 ; 14/01/2023 + 6158 ;;mov di,offset resgroup:DataresEnd ; get address of resident end + 6159 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:15BAh) + 6160 ;mov di,093Eh ; mov di,PAERRMSG0 ; MSDOS 5.0 COMMAND.COM + 6161 ; 06/06/2023 + 6162 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:16CBh) + 6163 ;mov di,0A41h ; mov di,PAERRMSG0 ; MSDOS 6.22 COMMAND.COM + 6164 ; 18/07/2024 + 6165 ;mov di,9F3h ; mov di,PAERRMSG0 ; PCDOS 7.1 COMMAND.COM + 6166 000015E9 BF[0509] mov di,DataresEnd + 6167 000015EC 893E[B204] mov [ResMsgEnd],di ; save it + 6168 + 6169 000015F0 E8FD09 call get_XMMAddr ; get XMM call address + 6170 + 6171 ; Check if this is the first instance of command.com. If not, we just exit + 6172 ; this routine without moving any code. + 6173 ; After the int 2fh, ds:si points at the resident jump table in the previous + 6174 ; stub. We just have to copy this over + 6175 + 6176 ;ifndef ROMDOS + 6177 000015F3 B80055 mov ax,5500h + 6178 ;mov ax,GET_COMMAND_STATE + 6179 ;else + 6180 ; mov ax,GET_ROMCOMMAND_STATE + 6181 ;endif ; ROMDOS 6182 - 6183 ; 03/05/2023 - 6184 ; Return: - 6185 ; AX = 0000h if an instance of COMMAND.COM is already running - 6186 ; DS:SI -> entry point table - 6187 - 6188 ; (si = offset Int2f_Entry) ; (('MsgInt2fHandler:', 'fcOurs:')) - 6189 - 6190 000015F8 09C0 or ax,ax - 6191 000015FA 750C jnz short first_com ; this is the first instance + 6183 000015F6 CD2F int 2Fh ; (Int 2Fh/AX=5500h - DOS 5+ - COMMAND.COM INTERFACE) + 6184 ;assume ds:nothing + 6185 + 6186 ; 03/05/2023 + 6187 ; Return: + 6188 ; AX = 0000h if an instance of COMMAND.COM is already running + 6189 ; DS:SI -> entry point table + 6190 + 6191 ; (si = offset Int2f_Entry) ; (('MsgInt2fHandler:', 'fcOurs:')) 6192 - 6193 ; 14/01/2023 - 6194 000015FC 268936[9526] mov [es:ResJmpTable],si ; save old stub jump table - 6195 00001601 268C1E[9726] mov [es:ResJmpTable+2],ds - 6196 00001606 EB06 jmp short init_cntry - 6197 - 6198 first_com: - 6199 00001608 26C606[9926]01 mov byte [es:FirstCom],1 ; indicate first command.com + 6193 000015F8 09C0 or ax,ax + 6194 000015FA 750C jnz short first_com ; this is the first instance + 6195 + 6196 ; 14/01/2023 + 6197 000015FC 268936[9526] mov [es:ResJmpTable],si ; save old stub jump table + 6198 00001601 268C1E[9726] mov [es:ResJmpTable+2],ds + 6199 00001606 EB06 jmp short init_cntry 6200 - 6201 init_cntry: - 6202 ; 14/01/2023 - 6203 0000160E 06 push es - 6204 0000160F 1F pop ds - 6205 ;assume ds:RESGROUP - 6206 - 6207 00001610 B465 mov ah,65h - 6208 ;mov ah,GETEXTCNTRY ; get extended country info - 6209 00001612 B004 mov al,4 ; get file ucase table - 6210 00001614 BAFFFF mov dx,-1 ; - 6211 ;mov bx,-1 ; - 6212 00001617 89D3 mov bx,dx - 6213 00001619 B90500 mov cx,5 ; number of bytes we want - 6214 ;mov di,offset resgroup:FUCase_Addr ; buffer for address - 6215 0000161C BF[B502] mov di,FUCase_Addr - 6216 0000161F CD21 int 21h - 6217 ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION - 6218 ; AL = function - - 6219 - 6220 ; Bugbug: conditionalize dbcs_vector stuff? - 6221 - 6222 00001621 1E push ds ; - 6223 00001622 B80063 mov ax,6300h - 6224 ;mov ax,(ECS_CALL shl 8) or GETLEADBTBL ; - 6225 00001625 CD21 int 21h ; - 6226 ; DOS - 3.2+ only - GET DOUBLE BYTE CHARACTER SET LEAD TABLE - 6227 - 6228 00001627 8CDB mov bx,ds ; get segment to bx - 6229 00001629 1F pop ds ; - 6230 0000162A 8936[BA02] mov [Dbcs_Vector_Addr],si ; save address of - 6231 0000162E 891E[BC02] mov [Dbcs_Vector_Addr+2],bx ; dbcs vector - 6232 - 6233 ;mov ax,[16h] - 6234 00001632 A11600 mov ax,[PDB.PARENT_PID] - 6235 ; mov ax,ds:16h ; Init PARENT so we can exit - 6236 00001635 A3[3E02] mov [Parent],ax ; correctly. - 6237 00001638 A10A00 mov ax,[PDB.EXIT] ; mov ax,ds:0Ah - 6238 0000163B A3[4002] mov [OldTerm],ax - 6239 0000163E A10C00 mov ax,[PDB.EXIT+2] ; mov ax,ds:0Ch - 6240 00001641 A3[4202] mov [OldTerm+2],ax - 6241 - 6242 ; 14/01/2023 - 6243 ;;;mov ax,offset ResGroup:EndCode + 15 - 6244 ;;mov ax,1569h ; MSDOS 5.0 COMMAND.COM - 6245 ; 06/06/2023 - 6246 ;mov ax,1679h ; MSDOS 6.22 COMMAND.COM - 6247 ; 18/07/2024 - 6248 ;mov ax,16B3h ; PCDOS 7.1 COMMAND.COM - 6249 - 6250 ;mov ax,EndCode+15 - 6251 ;;mov ax,INITSTART+15 ; 24/09/2018 - 6252 ; 14/01/2023 - 6253 ;mov cl,4 ; ax = size of resident part of - 6254 ;shr ax,cl ; command in paragraphs. Add - 6255 ;mov cx,cs ; this to CS and you get the - 6256 ;add ax,cx ; segment of the TPA. - 6257 - 6258 00001644 8CC8 mov ax,cs - 6259 ; 14/08/2024 - 6260 EndCodeParag equ (ENDCODE+15)>>4 - 6261 ;add ax,(EndCode+15)>>4 - 6262 00001646 056901 add ax,EndCodeParag - 6263 - 6264 00001649 A3[5804] mov [Res_Tpa],ax ; Temporarily save the TPA segment - 6265 0000164C 2500F0 and ax,0F000h - 6266 0000164F 050010 add ax,1000h ; Round up to next 64K boundary - 6267 00001652 7303 jnc short TpaSet ; Memory wrap if carry set - 6268 00001654 A1[5804] mov ax,[Res_Tpa] - 6269 TpaSet: - 6270 00001657 A3[4C04] mov [LTpa],ax ; Good enough for the moment - 6271 ;mov ax,[2] - 6272 0000165A A10200 mov ax,[PDB.BLOCK_LEN] ; ax = # of paras given to command - 6273 - 6274 0000165D 8C1E[5204] mov [MySeg1],ds ; These 3 variables are used as part of - 6275 00001661 8C1E[5604] mov [MySeg2],ds ; 3 long ptrs that the transient will - 6276 00001665 8C1E[4A04] mov [MySeg],ds ; use to call resident routines. - 6277 ; 19/04/2023 - 6278 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1641h - 6279 00001669 8C1E[5607] mov [MySeg3],ds ; segment of msg retriever routine - 6280 - 6281 0000166D A3[9502] mov [MemSiz],ax ; Needed for execing other programs - 6282 - 6283 ; 14/01/2023 - Retro DOS v4.0 COMMAND.COM - 6284 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1648h + 6201 first_com: + 6202 00001608 26C606[9926]01 mov byte [es:FirstCom],1 ; indicate first command.com + 6203 + 6204 init_cntry: + 6205 ; 14/01/2023 + 6206 0000160E 06 push es + 6207 0000160F 1F pop ds + 6208 ;assume ds:RESGROUP + 6209 + 6210 00001610 B465 mov ah,65h + 6211 ;mov ah,GETEXTCNTRY ; get extended country info + 6212 00001612 B004 mov al,4 ; get file ucase table + 6213 00001614 BAFFFF mov dx,-1 ; + 6214 ;mov bx,-1 ; + 6215 00001617 89D3 mov bx,dx + 6216 00001619 B90500 mov cx,5 ; number of bytes we want + 6217 ;mov di,offset resgroup:FUCase_Addr ; buffer for address + 6218 0000161C BF[B502] mov di,FUCase_Addr + 6219 0000161F CD21 int 21h + 6220 ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION + 6221 ; AL = function - + 6222 + 6223 ; Bugbug: conditionalize dbcs_vector stuff? + 6224 + 6225 00001621 1E push ds ; + 6226 00001622 B80063 mov ax,6300h + 6227 ;mov ax,(ECS_CALL shl 8) or GETLEADBTBL ; + 6228 00001625 CD21 int 21h ; + 6229 ; DOS - 3.2+ only - GET DOUBLE BYTE CHARACTER SET LEAD TABLE + 6230 + 6231 00001627 8CDB mov bx,ds ; get segment to bx + 6232 00001629 1F pop ds ; + 6233 0000162A 8936[BA02] mov [Dbcs_Vector_Addr],si ; save address of + 6234 0000162E 891E[BC02] mov [Dbcs_Vector_Addr+2],bx ; dbcs vector + 6235 + 6236 ;mov ax,[16h] + 6237 00001632 A11600 mov ax,[PDB.PARENT_PID] + 6238 ; mov ax,ds:16h ; Init PARENT so we can exit + 6239 00001635 A3[3E02] mov [Parent],ax ; correctly. + 6240 00001638 A10A00 mov ax,[PDB.EXIT] ; mov ax,ds:0Ah + 6241 0000163B A3[4002] mov [OldTerm],ax + 6242 0000163E A10C00 mov ax,[PDB.EXIT+2] ; mov ax,ds:0Ch + 6243 00001641 A3[4202] mov [OldTerm+2],ax + 6244 + 6245 ; 14/01/2023 + 6246 ;;;mov ax,offset ResGroup:EndCode + 15 + 6247 ;;mov ax,1569h ; MSDOS 5.0 COMMAND.COM + 6248 ; 06/06/2023 + 6249 ;mov ax,1679h ; MSDOS 6.22 COMMAND.COM + 6250 ; 18/07/2024 + 6251 ;mov ax,16B3h ; PCDOS 7.1 COMMAND.COM + 6252 + 6253 ;mov ax,EndCode+15 + 6254 ;;mov ax,INITSTART+15 ; 24/09/2018 + 6255 ; 14/01/2023 + 6256 ;mov cl,4 ; ax = size of resident part of + 6257 ;shr ax,cl ; command in paragraphs. Add + 6258 ;mov cx,cs ; this to CS and you get the + 6259 ;add ax,cx ; segment of the TPA. + 6260 + 6261 00001644 8CC8 mov ax,cs + 6262 ; 14/08/2024 + 6263 EndCodeParag equ (ENDCODE+15)>>4 + 6264 ;add ax,(EndCode+15)>>4 + 6265 00001646 056901 add ax,EndCodeParag + 6266 + 6267 00001649 A3[5804] mov [Res_Tpa],ax ; Temporarily save the TPA segment + 6268 0000164C 2500F0 and ax,0F000h + 6269 0000164F 050010 add ax,1000h ; Round up to next 64K boundary + 6270 00001652 7303 jnc short TpaSet ; Memory wrap if carry set + 6271 00001654 A1[5804] mov ax,[Res_Tpa] + 6272 TpaSet: + 6273 00001657 A3[4C04] mov [LTpa],ax ; Good enough for the moment + 6274 ;mov ax,[2] + 6275 0000165A A10200 mov ax,[PDB.BLOCK_LEN] ; ax = # of paras given to command + 6276 + 6277 0000165D 8C1E[5204] mov [MySeg1],ds ; These 3 variables are used as part of + 6278 00001661 8C1E[5604] mov [MySeg2],ds ; 3 long ptrs that the transient will + 6279 00001665 8C1E[4A04] mov [MySeg],ds ; use to call resident routines. + 6280 ; 19/04/2023 + 6281 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1641h + 6282 00001669 8C1E[5607] mov [MySeg3],ds ; segment of msg retriever routine + 6283 + 6284 0000166D A3[9502] mov [MemSiz],ax ; Needed for execing other programs 6285 - 6286 ; First reallocate the COMMAND size to its memory image - 6287 - 6288 00001670 50 push ax - 6289 ;;;mov bx,2320h ; MSDOS 5.0 COMMAND.COM - 6290 ;;mov bx,offset RESGROUP:TranStart ; - 6291 ;mov bx,TRANSTART - 6292 ;;add bx,98C5h ; MSDOS 5.0 COMMAND.COM - 6293 ;add bx,offset TRANGROUP:TranSpaceEnd; - 6294 ;add bx,15 ; * ; round up the size - 6295 ; 06/06/2023 - 6296 ;mov bx,26E0h ; MSDOS 6.22 COMMAND.COM ; mov bx,offset RESGROUP:TranStart - 6297 ;add bx,0AF95h ; MSDOS 6.22 COMMAND.COM ; add bx,offset TRANGROUP:TranSpaceEnd - 6298 ;add bx,15 ; * ; round up the size - 6299 - 6300 ; 03/05/2023 - 6301 ;mov bx,TRANSTART+15 ; * ; 14/01/2023 - 6302 ;add bx,TRANSPACEEND - 6303 ; 06/06/2023 - 6304 ;mov bx,TRANSTART+TRANSPACEEND+15 - 6305 ;mov cl,4 ; - 6306 ;shr bx,cl ; size of command.com - 6307 00001671 BBDE0C mov bx,(TRANSTART+TRANSPACEEND+15)>>4 - 6308 - 6309 00001674 B44A mov ah,4Ah - 6310 ;mov ah,SETBLOCK ; free all memory above pgm - 6311 00001676 CD21 int 21h ; - 6312 00001678 58 pop ax ; - 6313 - 6314 ; Compute maximum size of environment - 6315 - 6316 ;;mov word [ENVMAX],69 ; = (160/16)+(973/16)-1 ; (11EEh-0E30h+0Fh/10h) = 3Ch - 6317 ;mov word [ENVMAX],((ENVIRONSIZ+15)/16) + ((ENVMAXIMUM-ZERO+15)/16) - 1 - 6318 ; 14/01/2023 - Retro DOS v4.0 COMMAND.COM - 6319 ;mov word [EnvMax],81 ; 10+72-1 ; MSDOS 5.0 COMMAND.COM - 6320 ;mov word [EndMax],90 ; 12+79-1 ; MSDOS 6.22 COMMAND.COM - 6321 ; 22/07/2024 - 6322 ;mov word [EndMax],95 ; - 6323 00001679 C706[8420]5800 mov word [EnvMax],((ENVIRONSIZ+15)/16) + ((EnvMaximum-ZERO+15)/16) - 1 - 6324 ; MSDOS 6.22 ; 12+(((1B53h-1670h)+15)/16)-1 = 90 - 6325 ; PCDOS 7.1 ; ((166+15+)/16)+(1BF5h-16B0h+15)/16)-1 = 95 - 6326 ; - 6327 ; Compute minimum size of environment - 6328 ; - 6329 ;;mov word [EnvSiz],10 ; = 160/16 ; MSDOS 3.3 COMMAND.COM - 6330 ;mov word [EnvSiz],16 ; = 256/16 ; MSDOS 5.0 COMMAND.COM - 6331 0000167F C706[8220]1000 mov word [EnvSiz],ENVSML/16 ; 256/16 - 6332 - 6333 ;;;mov dx,offset TranGroup:Transpaceend + 15 ; dx = size of transient - 6334 ;;mov dx,98D4h ; MSDOS 5.0 COMMAND.COM - 6335 ; 06/06/2023 - 6336 ;;mov dx,0AFA4h ; MSDOS 6.22 COMMAND.COM - 6337 ;mov dx,TRANSPACEEND+15 ; 4D5Ch+0Fh (for MSDOS 3.3 COMMAND.COM) - 6338 ; 22/07/2024 - 6339 ;mov dx,0AAA9h ; PCDOS 7.1 COMMAND.COM (0AA9Ah+0Fh) - 6340 ;mov cl,4 ; in paragraphs. - 6341 ;shr dx,cl - 6342 00001685 BA610A mov dx,(TRANSPACEEND+15)>>4 - 6343 - 6344 00001688 8916[9220] mov [TrnSize],dx ; save size of transient in paragraphs - 6345 - 6346 0000168C 29D0 sub ax,dx ; max seg addr - # para's needed for transient - 6347 0000168E A3[8F02] mov [TrnSeg],ax ; = seg addr to load the transient at. - 6348 ;mov ax,[2Ch] - 6349 00001691 A12C00 mov ax,[PDB.ENVIRON] ; ax = environment segment - 6350 - 6351 ; 14/01/2023 - 6352 ; MSDOS 6.0 - 6353 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6354 00001694 A3[3A04] mov [EnvirSeg],ax - 6355 - 6356 ; 21/01/2023 - 6357 00001697 09C0 or ax,ax ; if there is no environment segment, - 6358 00001699 7407 jz short buildenv ; make one - 6359 - 6360 ; 21/01/2023 - 6361 ; MSDOS 3.3 & MSDOS 5.0 - 6362 ;;inc byte [CHUCKENV] - 6363 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6364 ;inc byte [AllocedEnv] ; Flag - old environment segment - 6365 - 6366 ; MSDOS 3.3 & MSDOS 5.0 - 6367 ; 06/06/2023 - 6368 ;jmp short environpassed - 6369 - 6370 ; MSDOS 6.0 - 6371 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6372 0000169B 803E[9926]00 cmp byte [FirstCom],0 ; if this is the first command.com, - 6373 000016A0 7403 je short environpassed ; do a merge job (make sure COMSPEC exists) - 6374 - 6375 ; MSDOS 6.0 - 6376 - 6377 ; We allocate a buffer here just large enough to hold the 'PATH=' and - 6378 ; the COMSPEC. After parsing, we will allocate an environment of the right - 6379 ; size and free this buffer. We need this buffer because we no longer have an - 6380 ; ENVIRONMENT segment but need a place to store the COMSPEC which can be - 6381 ; given on the command line before we know the environment size. This routine - 6382 ; will not return in case of an allocation error. It will either exit or hang - 6383 ; depending on whether or not this is the first COMMAND.COM or not. - 6384 - 6385 ; 14/01/2023 - 6386 buildenv: - 6387 000016A2 E8E607 call alloc_env ; try to allocate buffer - 6388 environpassed: - 6389 ; 14/01/2023 - MSDOS 5.0 COMMAND.COM - 6390 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 6391 ;mov [EnvirSeg],ax - 6392 ; - 6393 000016A5 8EC0 mov es,ax ; and it load into es. - 6394 ;assume es:nothing - 6395 - 6396 gottheenvir: - 6397 - 6398 ; Initialize the command drive - 6399 - 6400 ; 14/01/2023 - 6401 ; MSDOS 3.3 & MSDOS 6.0 - 6402 000016A7 B419 mov ah,19h - 6403 ;mov ah,GET_DEFAULT_DRIVE ; 19h - 6404 000016A9 CD21 int 21h - 6405 000016AB FEC0 inc al - 6406 000016AD A2[9402] mov [ComDrv],al - 6407 - 6408 ;mov al,byte ptr ds:[FCB] ; al = default drive number for command - 6409 000016B0 A05C00 mov al,[FCB] ; [5Ch] - 6410 000016B3 08C0 or al,al - 6411 000016B5 7433 jz short nocomdrv ; no drive specified - 6412 - 6413 000016B7 B43A mov ah,':' - 6414 000016B9 A2[9402] mov [ComDrv],al - 6415 000016BC 0440 add al,40h ; convert number to uppercase character - 6416 - 6417 000016BE FD std - 6418 - 6419 ; MSDOS 6.0 - 6420 ; 06/06/2023 - 6421 ; MSDOS 6.22 - COMMAND.COM - RESGROUP:17B7h - 6422 000016BF 803E[5420]00 cmp byte [AllocedEnv],0 ; if a new environment is being built, - 6423 000016C4 7420 je short notwidenv ; move the default comspec string in it - 6424 ; 14/01/2023 - 6425 ; MSDOS 5.0 COMMAND.COM - 6426 000016C6 8B3E[6B20] mov di,[ComspOffset] - 6427 000016CA 26807D013A cmp byte [es:di+1],':' ; drive specifier already exist? - 6428 000016CF 7415 je short notwidenv ; yes, must have been inherited that way - 6429 - 6430 ; 06/06/2023 - 6431 ; MSDOS 3.3 - 6432 ;;cmp byte [CHUCKENV],0 - 6433 ;;jne short NOTWIDENV - 6434 ; 21/01/2021 - 6435 ; MSDOS 5.0 - COMMAND.COM - RESGROUP:16A5h - 6436 ;cmp byte [AllocedEnv],0 - 6437 ;ja short notwidenv - 6438 - 6439 000016D1 1E push ds ; 2 bytes to make room for a drivespec. - 6440 000016D2 06 push es ; the drivespec is in ax and is copied - 6441 000016D3 1F pop ds ; on to the front of the string. - 6442 - 6443 ; 06/06/2023 - 6444 %if 0 - 6445 ; 21/01/2023 - 6446 ; 14/01/2023 - 6447 ; MSDOS 5.0 COMMAND.COM - 6448 ; MSDOS 3.3 - 6449 ; 23/09/2018 - 6450 ; 30/04/2018 - 6451 ;mov di,159 - 6452 ;;MOV DI,OFFSET ENVIRONMENT:ECOMSPEC+ENVIRONSIZ2-1-10H - 6453 ;mov di,(ECOMSPEC-ENVIRONMENT)+ENVIRONSIZ2-1 ; mov di,9Fh - 6454 mov di,ENVIRONSIZ-1 ; 21/01/2023 - 6455 ;mov si,157 - 6456 ;;MOV SI,OFFSET ENVIRONMENT:ECOMSPEC+ENVIRONSIZ2-3-10H - 6457 ;mov si,(ECOMSPEC-ENVIRONMENT)+ENVIRONSIZ2-3 ; mov si,9Dh - 6458 mov si,ENVIRONSIZ-3 ; 21/01/2023 - 6459 ;MOV CX,ENVIRONSIZ2-2 ; mov cx,90h - 6460 mov cx,MAX_COMSPEC-2 ; 144 - 6461 %endif - 6462 ; MSDOS 6.0 - 6463 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - RESGROUP:17CCh - 6464 000016D4 8DB58F00 lea si,[di+MAX_COMSPEC-3] ; lea si,[di+143] - 6465 000016D8 8DBD9100 lea di,[di+MAX_COMSPEC-1] ; lea di,[di+145] - 6466 - 6467 000016DC B99000 mov cx,MAX_COMSPEC-2 ; 144 - 6468 - 6469 000016DF F3A4 rep movsb - 6470 000016E1 1F pop ds + 6286 ; 14/01/2023 - Retro DOS v4.0 COMMAND.COM + 6287 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1648h + 6288 + 6289 ; First reallocate the COMMAND size to its memory image + 6290 + 6291 00001670 50 push ax + 6292 ;;;mov bx,2320h ; MSDOS 5.0 COMMAND.COM + 6293 ;;mov bx,offset RESGROUP:TranStart ; + 6294 ;mov bx,TRANSTART + 6295 ;;add bx,98C5h ; MSDOS 5.0 COMMAND.COM + 6296 ;add bx,offset TRANGROUP:TranSpaceEnd; + 6297 ;add bx,15 ; * ; round up the size + 6298 ; 06/06/2023 + 6299 ;mov bx,26E0h ; MSDOS 6.22 COMMAND.COM ; mov bx,offset RESGROUP:TranStart + 6300 ;add bx,0AF95h ; MSDOS 6.22 COMMAND.COM ; add bx,offset TRANGROUP:TranSpaceEnd + 6301 ;add bx,15 ; * ; round up the size + 6302 + 6303 ; 03/05/2023 + 6304 ;mov bx,TRANSTART+15 ; * ; 14/01/2023 + 6305 ;add bx,TRANSPACEEND + 6306 ; 06/06/2023 + 6307 ;mov bx,TRANSTART+TRANSPACEEND+15 + 6308 ;mov cl,4 ; + 6309 ;shr bx,cl ; size of command.com + 6310 00001671 BBDE0C mov bx,(TRANSTART+TRANSPACEEND+15)>>4 + 6311 + 6312 00001674 B44A mov ah,4Ah + 6313 ;mov ah,SETBLOCK ; free all memory above pgm + 6314 00001676 CD21 int 21h ; + 6315 00001678 58 pop ax ; + 6316 + 6317 ; Compute maximum size of environment + 6318 + 6319 ;;mov word [ENVMAX],69 ; = (160/16)+(973/16)-1 ; (11EEh-0E30h+0Fh/10h) = 3Ch + 6320 ;mov word [ENVMAX],((ENVIRONSIZ+15)/16) + ((ENVMAXIMUM-ZERO+15)/16) - 1 + 6321 ; 14/01/2023 - Retro DOS v4.0 COMMAND.COM + 6322 ;mov word [EnvMax],81 ; 10+72-1 ; MSDOS 5.0 COMMAND.COM + 6323 ;mov word [EndMax],90 ; 12+79-1 ; MSDOS 6.22 COMMAND.COM + 6324 ; 22/07/2024 + 6325 ;mov word [EndMax],95 ; + 6326 00001679 C706[8420]5800 mov word [EnvMax],((ENVIRONSIZ+15)/16) + ((EnvMaximum-ZERO+15)/16) - 1 + 6327 ; MSDOS 6.22 ; 12+(((1B53h-1670h)+15)/16)-1 = 90 + 6328 ; PCDOS 7.1 ; ((166+15+)/16)+(1BF5h-16B0h+15)/16)-1 = 95 + 6329 ; + 6330 ; Compute minimum size of environment + 6331 ; + 6332 ;;mov word [EnvSiz],10 ; = 160/16 ; MSDOS 3.3 COMMAND.COM + 6333 ;mov word [EnvSiz],16 ; = 256/16 ; MSDOS 5.0 COMMAND.COM + 6334 0000167F C706[8220]1000 mov word [EnvSiz],ENVSML/16 ; 256/16 + 6335 + 6336 ;;;mov dx,offset TranGroup:Transpaceend + 15 ; dx = size of transient + 6337 ;;mov dx,98D4h ; MSDOS 5.0 COMMAND.COM + 6338 ; 06/06/2023 + 6339 ;;mov dx,0AFA4h ; MSDOS 6.22 COMMAND.COM + 6340 ;mov dx,TRANSPACEEND+15 ; 4D5Ch+0Fh (for MSDOS 3.3 COMMAND.COM) + 6341 ; 22/07/2024 + 6342 ;mov dx,0AAA9h ; PCDOS 7.1 COMMAND.COM (0AA9Ah+0Fh) + 6343 ;mov cl,4 ; in paragraphs. + 6344 ;shr dx,cl + 6345 00001685 BA610A mov dx,(TRANSPACEEND+15)>>4 + 6346 + 6347 00001688 8916[9220] mov [TrnSize],dx ; save size of transient in paragraphs + 6348 + 6349 0000168C 29D0 sub ax,dx ; max seg addr - # para's needed for transient + 6350 0000168E A3[8F02] mov [TrnSeg],ax ; = seg addr to load the transient at. + 6351 ;mov ax,[2Ch] + 6352 00001691 A12C00 mov ax,[PDB.ENVIRON] ; ax = environment segment + 6353 + 6354 ; 14/01/2023 + 6355 ; MSDOS 6.0 + 6356 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6357 00001694 A3[3A04] mov [EnvirSeg],ax + 6358 + 6359 ; 21/01/2023 + 6360 00001697 09C0 or ax,ax ; if there is no environment segment, + 6361 00001699 7407 jz short buildenv ; make one + 6362 + 6363 ; 21/01/2023 + 6364 ; MSDOS 3.3 & MSDOS 5.0 + 6365 ;;inc byte [CHUCKENV] + 6366 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6367 ;inc byte [AllocedEnv] ; Flag - old environment segment + 6368 + 6369 ; MSDOS 3.3 & MSDOS 5.0 + 6370 ; 06/06/2023 + 6371 ;jmp short environpassed + 6372 + 6373 ; MSDOS 6.0 + 6374 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6375 0000169B 803E[9926]00 cmp byte [FirstCom],0 ; if this is the first command.com, + 6376 000016A0 7403 je short environpassed ; do a merge job (make sure COMSPEC exists) + 6377 + 6378 ; MSDOS 6.0 + 6379 + 6380 ; We allocate a buffer here just large enough to hold the 'PATH=' and + 6381 ; the COMSPEC. After parsing, we will allocate an environment of the right + 6382 ; size and free this buffer. We need this buffer because we no longer have an + 6383 ; ENVIRONMENT segment but need a place to store the COMSPEC which can be + 6384 ; given on the command line before we know the environment size. This routine + 6385 ; will not return in case of an allocation error. It will either exit or hang + 6386 ; depending on whether or not this is the first COMMAND.COM or not. + 6387 + 6388 ; 14/01/2023 + 6389 buildenv: + 6390 000016A2 E8E607 call alloc_env ; try to allocate buffer + 6391 environpassed: + 6392 ; 14/01/2023 - MSDOS 5.0 COMMAND.COM + 6393 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 6394 ;mov [EnvirSeg],ax + 6395 ; + 6396 000016A5 8EC0 mov es,ax ; and it load into es. + 6397 ;assume es:nothing + 6398 + 6399 gottheenvir: + 6400 + 6401 ; Initialize the command drive + 6402 + 6403 ; 14/01/2023 + 6404 ; MSDOS 3.3 & MSDOS 6.0 + 6405 000016A7 B419 mov ah,19h + 6406 ;mov ah,GET_DEFAULT_DRIVE ; 19h + 6407 000016A9 CD21 int 21h + 6408 000016AB FEC0 inc al + 6409 000016AD A2[9402] mov [ComDrv],al + 6410 + 6411 ;mov al,byte ptr ds:[FCB] ; al = default drive number for command + 6412 000016B0 A05C00 mov al,[FCB] ; [5Ch] + 6413 000016B3 08C0 or al,al + 6414 000016B5 7433 jz short nocomdrv ; no drive specified + 6415 + 6416 000016B7 B43A mov ah,':' + 6417 000016B9 A2[9402] mov [ComDrv],al + 6418 000016BC 0440 add al,40h ; convert number to uppercase character + 6419 + 6420 000016BE FD std + 6421 + 6422 ; MSDOS 6.0 + 6423 ; 06/06/2023 + 6424 ; MSDOS 6.22 - COMMAND.COM - RESGROUP:17B7h + 6425 000016BF 803E[5420]00 cmp byte [AllocedEnv],0 ; if a new environment is being built, + 6426 000016C4 7420 je short notwidenv ; move the default comspec string in it + 6427 ; 14/01/2023 + 6428 ; MSDOS 5.0 COMMAND.COM + 6429 000016C6 8B3E[6B20] mov di,[ComspOffset] + 6430 000016CA 26807D013A cmp byte [es:di+1],':' ; drive specifier already exist? + 6431 000016CF 7415 je short notwidenv ; yes, must have been inherited that way + 6432 + 6433 ; 06/06/2023 + 6434 ; MSDOS 3.3 + 6435 ;;cmp byte [CHUCKENV],0 + 6436 ;;jne short NOTWIDENV + 6437 ; 21/01/2021 + 6438 ; MSDOS 5.0 - COMMAND.COM - RESGROUP:16A5h + 6439 ;cmp byte [AllocedEnv],0 + 6440 ;ja short notwidenv + 6441 + 6442 000016D1 1E push ds ; 2 bytes to make room for a drivespec. + 6443 000016D2 06 push es ; the drivespec is in ax and is copied + 6444 000016D3 1F pop ds ; on to the front of the string. + 6445 + 6446 ; 06/06/2023 + 6447 %if 0 + 6448 ; 21/01/2023 + 6449 ; 14/01/2023 + 6450 ; MSDOS 5.0 COMMAND.COM + 6451 ; MSDOS 3.3 + 6452 ; 23/09/2018 + 6453 ; 30/04/2018 + 6454 ;mov di,159 + 6455 ;;MOV DI,OFFSET ENVIRONMENT:ECOMSPEC+ENVIRONSIZ2-1-10H + 6456 ;mov di,(ECOMSPEC-ENVIRONMENT)+ENVIRONSIZ2-1 ; mov di,9Fh + 6457 mov di,ENVIRONSIZ-1 ; 21/01/2023 + 6458 ;mov si,157 + 6459 ;;MOV SI,OFFSET ENVIRONMENT:ECOMSPEC+ENVIRONSIZ2-3-10H + 6460 ;mov si,(ECOMSPEC-ENVIRONMENT)+ENVIRONSIZ2-3 ; mov si,9Dh + 6461 mov si,ENVIRONSIZ-3 ; 21/01/2023 + 6462 ;MOV CX,ENVIRONSIZ2-2 ; mov cx,90h + 6463 mov cx,MAX_COMSPEC-2 ; 144 + 6464 %endif + 6465 ; MSDOS 6.0 + 6466 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - RESGROUP:17CCh + 6467 000016D4 8DB58F00 lea si,[di+MAX_COMSPEC-3] ; lea si,[di+143] + 6468 000016D8 8DBD9100 lea di,[di+MAX_COMSPEC-1] ; lea di,[di+145] + 6469 + 6470 000016DC B99000 mov cx,MAX_COMSPEC-2 ; 144 6471 - 6472 ; MSDOS 6.0 - 6473 ; 06/06/2023 - 6474 000016E2 268945FF mov [es:di-1],ax - 6475 - 6476 ; MSDOS 3.3 - 6477 ;mov [es:0Eh],ax - 6478 ;;;MOV WORD PTR ES:[ECOMSPEC-10H],AX - 6479 ;;MOV [es:(ECOMSPEC-ENVIRONMENT)],ax ; mov [es:0Eh],ax - 6480 ; 14/01/2023 - 6481 ; 06/06/2023 - 6482 ;mov [es:ECOMSPEC],ax ; mov [es:0Eh],ax - 6483 - 6484 ; MSDOS 3.3 & MSDOS 6.0 - 6485 notwidenv: - 6486 000016E6 FC cld - 6487 000016E7 A3[3620] mov [AUTOBAT],ax ; db 0,":\AUTOEXEC.BAT" - 6488 - 6489 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 6490 %if 0 - 6491 ; 14/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM - 6492 ; (MSDOS 5.0 COMMAND.COM RESGROUP:16C3h) - 6493 ; 06/06/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM - 6494 mov [KAUTOBAT],ax ; db 0,":\AUTOEXEC.BAT" - 6495 %endif - 6496 - 6497 nocomdrv: - 6498 000016EA E841FA call SetVect ; Set the vectors + 6472 000016DF F3A4 rep movsb + 6473 000016E1 1F pop ds + 6474 + 6475 ; MSDOS 6.0 + 6476 ; 06/06/2023 + 6477 000016E2 268945FF mov [es:di-1],ax + 6478 + 6479 ; MSDOS 3.3 + 6480 ;mov [es:0Eh],ax + 6481 ;;;MOV WORD PTR ES:[ECOMSPEC-10H],AX + 6482 ;;MOV [es:(ECOMSPEC-ENVIRONMENT)],ax ; mov [es:0Eh],ax + 6483 ; 14/01/2023 + 6484 ; 06/06/2023 + 6485 ;mov [es:ECOMSPEC],ax ; mov [es:0Eh],ax + 6486 + 6487 ; MSDOS 3.3 & MSDOS 6.0 + 6488 notwidenv: + 6489 000016E6 FC cld + 6490 000016E7 A3[3620] mov [AUTOBAT],ax ; db 0,":\AUTOEXEC.BAT" + 6491 + 6492 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 6493 %if 0 + 6494 ; 14/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM + 6495 ; (MSDOS 5.0 COMMAND.COM RESGROUP:16C3h) + 6496 ; 06/06/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM + 6497 mov [KAUTOBAT],ax ; db 0,":\AUTOEXEC.BAT" + 6498 %endif 6499 - 6500 ; parsing starts here - 6501 - 6502 ; 14/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM - 6503 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:16C9h - CODERES:0989h) - 6504 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 6505 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:17E8h - CODERES:0998h) - 6506 ; MSDOS 6.0 - 6507 000016ED 0E push cs - 6508 000016EE 0E push cs - 6509 000016EF 1F pop ds - 6510 000016F0 07 pop es - 6511 ;assume ds:ResGroup,es:ResGroup - 6512 - 6513 000016F1 BE8000 mov si,80h ; get command line - 6514 000016F4 AC lodsb ; get length of line - 6515 000016F5 89F7 mov di,si ; get line position in di - 6516 000016F7 30E4 xor ah,ah ; ax = length of command line - 6517 - 6518 ; insure that the command line correctly ends with a cr - 6519 - 6520 000016F9 01C7 add di,ax ; go to end of command line - 6521 000016FB C6050D mov byte [di],0Dh ; insert a carriage return - 6522 000016FE 31C9 xor cx,cx ; clear cx - 6523 00001700 890E[5F21] mov [num_positionals],cx ; initialize positionals - 6524 - 6525 ; Scan the command line looking for the parameters - 6526 - 6527 Parse_command_line: - 6528 ;mov di,offset ResGroup:Parse_Command; Get address of parse_command - 6529 00001704 BF[9920] mov di,PARSE_COMMAND - 6530 00001707 8B0E[5F21] mov cx,[num_positionals] ; Get number of positionals - 6531 0000170B 31D2 xor dx,dx ; clear dx - 6532 0000170D 8936[6121] mov [old_parse_ptr],si ; save position before calling parser - 6533 ;call dword ptr Init_Parse - 6534 00001711 FF1E[8E20] call far [Init_Parse] ; call parser - 6535 00001715 890E[5F21] mov [num_positionals],cx ; Save number of positionals - 6536 ; 29/01/2023 - 6537 ;;cmp ax,END_OF_LINE ; 0FFFFh ; -1 ; are we at end of line? - 6538 ;cmp ax,-1 - 6539 ;jne short t1 - 6540 ; 10/06/2023 - 6541 00001719 40 inc ax ; cmp ax,-1 - 6542 0000171A 7503 jnz short t1 ; 0FFFFh -> 0 - 6543 ; ax = 0 - 6544 0000171C E99502 jmp ArgsDone ; yes - exit - 6545 t1: - 6546 ;;cmp ax,RESULT_NO_ERROR ; 0 ; did an error occur - 6547 ;;cmp ax,0 - 6548 ;and ax,ax - 6549 ; 10/06/2023 - 6550 0000171F 48 dec ax ; cmp ax,0 - 6551 00001720 7468 jz short parse_cont ; 1 -> 0 ; no - continue - 6552 - 6553 ; Before issuing error message - make sure switch is not /C - 6554 - 6555 parse_line_error: - 6556 ; 14/01/2023 - 6557 ;push si ; save line position - 6558 ;push ax ; save error number - 6559 ;cmp ax,3 - 6560 00001722 83F803 cmp ax,BadSwt_Ptr ; 3 ; Was error invalid switch? - 6561 ;jnz short parse_line_error_disp ; No - just issue message - 6562 00001725 7538 jne short parse_line_error_disp2 - 6563 00001727 56 push si ; ** ; save line position - 6564 00001728 50 push ax ; * ; save error number - 6565 00001729 89F7 mov di,si ; Get terminating pointer in DI - 6566 0000172B 8B36[6121] mov si,[old_parse_ptr] ; Get starting pointer in SI - 6567 - 6568 init_chk_delim: - 6569 0000172F 39FE cmp si,di ; at end of parsed parameter? - 6570 00001731 742A je short parse_line_error_disp ; Yes - just display message - 6571 00001733 AC lodsb ; - 6572 00001734 3C20 cmp al,20h ; ' ' ; 16/04/2023 - 6573 ;cmp al,space_chr ; 14/01/2023 - 6574 ;;cmp al,[space] ; Skip blank spaces - 6575 00001736 74F7 je short init_chk_delim ; - 6576 ;cmp al,9 - 6577 00001738 3C09 cmp al,tab_chr ; 9 ; Skip tab characters - 6578 0000173A 74F3 je short init_chk_delim ; - 6579 - 6580 0000173C 3A06[4E04] cmp al,[RSwitChar] ; '/' ; Switch? - 6581 00001740 751B jne short parse_line_error_disp ; No - just issue message - 6582 00001742 AC lodsb ; Get the char after the switch - 6583 - 6584 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 6585 ;ifdef DBCS - 6586 %if 1 - 6587 00001743 E837FD call ITestKanj ; Is it DBCS? - 6588 00001746 7515 jnz short parse_line_error_disp ; Yes - can't be /C or /K - 6589 %endif - 6590 ;endif - 6591 00001748 E8D505 call iupconv ; upper case it - 6592 - 6593 ;cmp al,[scswitch] ; 'C' ; it is /C? - 6594 ;jne short check_k_too ; MSDOS 6.0 ; - 6595 ; 16/04/2023 - 6596 0000174B 3C43 cmp al,'C' ; scswitch - 6597 ;jne short parse_line_error_disp ; MSDOS 5.0 COMMAND.COM - 6598 ; 06/06/2023 - 6599 ; MSDOS 6.22 COMMAND.COM - 6600 0000174D 7505 jne short check_k_too - 6601 0000174F 5A pop dx ; * ; even up stack - 6602 00001750 5A pop dx ; ** ; even up stack - 6603 00001751 E9D100 jmp SetSSwitch ; Yes - go set COMMAND /C - 6604 - 6605 ; MSDOS 6.0 - 6606 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 6607 check_k_too: - 6608 ;cmp al,[skswitch] ; 'K' ; it is /K? - 6609 ;jne short parse_line_error_disp ; - 6610 ; 06/06/2023 - 6611 00001754 3C4B cmp al,'K' - 6612 00001756 7505 jne short parse_line_error_disp - 6613 00001758 5A pop dx ; * ; even up stack - 6614 00001759 5A pop dx ; ** ; even up stack - 6615 0000175A E9C100 jmp SetKSwitch ; Yes - go set COMMAND /K - 6616 - 6617 parse_line_error_disp: - 6618 ; 14/01/2023 - 6619 0000175D 58 pop ax ; * ; restore error number - 6620 0000175E 5E pop si ; ** ; restore line position - 6621 parse_line_error_disp2: - 6622 0000175F 89C2 mov dx,ax ; get message number - 6623 00001761 E84C05 call RPrintParse - 6624 00001764 E871FC call crlf - 6625 00001767 EB9B jmp short Parse_command_line ; continue parsing - 6626 - 6627 ; 22/07/2024 - 6628 - 6629 ;CHECKDSWITCH: - 6630 ;;cmp al,'d' - 6631 ;cmp al,[letter_d] - 6632 ;jnz short CHECKCSWITCH - 6633 - 6634 ; 16/04/2023 - 6635 %if 1 - 6636 SetMSwitch: - 6637 ;cmp byte [ext_msg],1 - 6638 00001769 803E[9420]01 cmp byte [ext_msg],SET_EXTENDED_MSG ; has /MSG switch been set? - 6639 ; 16/04/2023 - 6640 ;jnz short setMswitchok ; no - set it - 6641 ;;mov ax,1 - 6642 ;mov ax,MoreArgs_Ptr ; set up too many arguments - 6643 ;jmp parse_line_error ; go issue error message - 6644 ; 16/04/2023 - 6645 0000176E 747C je short parse_line_error_j - 6646 setMswitchok: - 6647 ;mov byte [ext_msg],1 - 6648 00001770 C606[9420]01 mov byte [ext_msg],SET_EXTENDED_MSG ; set /MSG switch - 6649 ; 06/06/2023 - 6650 00001775 EB8D jmp short Parse_command_line ; keep parsing - 6651 %endif - 6652 - 6653 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6654 - 6655 SetDSwitch: - 6656 - 6657 ; Flag no date/time prompting. - 6658 - 6659 ; MSDOS 6.0 - 6660 00001777 803E[9620]00 cmp byte [dswitch],0 ; has /D switch been set? - 6661 ; 16/04/2023 - 6662 ;jz short setdateok ; no - set it - 6663 ;;mov ax,1 - 6664 ;mov ax,MoreArgs_Ptr ; set up too many arguments - 6665 ;jmp parse_line_error ; go issue error message - 6666 ; 16/04/2023 - 6667 0000177C 756E jnz short parse_line_error_j - 6668 setdateok: - 6669 0000177E FE06[9620] inc byte [dswitch] ; indicate /D entered - 6670 - 6671 ; MSDOS 3.3 & MSDOS 6.0 - 6672 00001782 C606[4720]01 mov byte [PRDATTM],1 ; User explicitly says no date time - 6673 ; MSDOS 3.3 - 6674 ;jmp short CHKARG - 6675 ; MSDOS 6.0 - 6676 00001787 E97AFF jmp Parse_command_line ; continue parsing - 6677 - 6678 parse_cont: - 6679 ; 15/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM - 6680 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:173Ch - CODERES:09FCh) - 6681 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 6682 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:1869h - CODERES:0A19h) - 6683 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6684 ; PCDOS 7.1 COMMAND.COM - RESGROUP:18AEh - 6685 - 6686 ; MSDOS 6.0 - 6687 - 6688 ; See if a switch was entered - 6689 ; - 6690 ; Bugbug: See if Comnd1_Syn can be moved into a reg. before the compare - 6691 - 6692 0000178A 813E[5821][D820] cmp word [COMND1_SYN],COMMAND_F_SYN ; was /F entered? - 6693 00001790 7460 je short SetFSwitch ; yes go set fail switch - 6694 00001792 813E[5821][CC20] cmp word [COMND1_SYN],COMMAND_P_SYN ; was /P entered? - 6695 00001798 744B je short SetPSwitch ; yes go set up PERMCOM - 6696 0000179A 813E[5821][E420] cmp word [COMND1_SYN],COMMAND_D_SYN ; was /D entered? - 6697 000017A0 74D5 je short SetDSwitch ; yes go set date switch - 6698 000017A2 813E[5821][0921] cmp word [COMND1_SYN],COMMAND_C_SYN ; was /C entered? - 6699 000017A8 747B je short SetSSwitch ; yes go set up SINGLECOM - 6700 ; 06/06/2023 - 6701 ; MSDOS 6.0 only! - 6702 000017AA 813E[5821][2F21] cmp word [COMND1_SYN],COMMAND_K_SYN ; was /K entered? - 6703 000017B0 746C je short SetKSwitch ; yes go set up SINGLECOM - 6704 ; - 6705 000017B2 813E[5821][F020] cmp word [COMND1_SYN],COMMAND_E_SYN ; was /E entered? - 6706 000017B8 747C je short SetESwitch ; yes go set up environment - 6707 - 6708 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6709 ; PCDOS 7.1 COMMAND.COM - 6710 %if 1 - 6711 000017BA 813E[5821][3B21] cmp word [COMND1_SYN],COMMAND_Y_SYN ; was /Y entered? - 6712 ;je short SetYSwitch ; yes (step switch) - 6713 ; 22/07/2024 - 6714 000017C0 7508 jne short parse_cont_@ - 6715 - 6716 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19C3h - 6717 SetYSwitch: - 6718 000017C2 800E[5A04]10 or byte [Y_Flag], 10h - 6719 000017C7 E93AFF jmp Parse_command_line - 6720 - 6721 parse_cont_@: - 6722 %endif - 6723 000017CA 813E[5821][1521] cmp word [COMND1_SYN],COMMAND_M_SYN ; was /MSG entered? - 6724 ;je short SetMSwitchjmp ; yes go set up message flag - 6725 ; 15/01/2023 - 6726 000017D0 7497 je short SetMSwitch - 6727 - 6728 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6729 ; PCDOS 7.1 COMMAND.COM - RESGROUP:18FDh - 6730 %if 1 - 6731 000017D2 813E[5821][4721] cmp word [COMND1_SYN],COMMAND_H_SYN ; was /H entered? - 6732 000017D8 747A je short SetHSwitch ; yes (load into UMB switch) - 6733 000017DA 813E[5821][5321] cmp word [COMND1_SYN],COMMAND_O_SYN ; was /O entered? - 6734 000017E0 747F je short SetOSwitch ; yes (disable overwrite prompt) - 6735 %endif - 6736 000017E2 E99800 jmp ChkOtherArgs ; Must be something else - 6737 - 6738 ; MSDOS 6.0 - 6739 ;SetMSwitchjmp: - 6740 ;jmp SetMSwitch - 6741 - 6742 ; 22/07/2024 - 6743 %if 1 - 6744 SetPSwitch: - 6745 - 6746 ; We have a permanent COMMAND switch /P. Flag this and stash the - 6747 ; termination address. + 6500 nocomdrv: + 6501 000016EA E841FA call SetVect ; Set the vectors + 6502 + 6503 ; parsing starts here + 6504 + 6505 ; 14/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM + 6506 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:16C9h - CODERES:0989h) + 6507 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 6508 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:17E8h - CODERES:0998h) + 6509 ; MSDOS 6.0 + 6510 000016ED 0E push cs + 6511 000016EE 0E push cs + 6512 000016EF 1F pop ds + 6513 000016F0 07 pop es + 6514 ;assume ds:ResGroup,es:ResGroup + 6515 + 6516 000016F1 BE8000 mov si,80h ; get command line + 6517 000016F4 AC lodsb ; get length of line + 6518 000016F5 89F7 mov di,si ; get line position in di + 6519 000016F7 30E4 xor ah,ah ; ax = length of command line + 6520 + 6521 ; insure that the command line correctly ends with a cr + 6522 + 6523 000016F9 01C7 add di,ax ; go to end of command line + 6524 000016FB C6050D mov byte [di],0Dh ; insert a carriage return + 6525 000016FE 31C9 xor cx,cx ; clear cx + 6526 00001700 890E[5F21] mov [num_positionals],cx ; initialize positionals + 6527 + 6528 ; Scan the command line looking for the parameters + 6529 + 6530 Parse_command_line: + 6531 ;mov di,offset ResGroup:Parse_Command; Get address of parse_command + 6532 00001704 BF[9920] mov di,PARSE_COMMAND + 6533 00001707 8B0E[5F21] mov cx,[num_positionals] ; Get number of positionals + 6534 0000170B 31D2 xor dx,dx ; clear dx + 6535 0000170D 8936[6121] mov [old_parse_ptr],si ; save position before calling parser + 6536 ;call dword ptr Init_Parse + 6537 00001711 FF1E[8E20] call far [Init_Parse] ; call parser + 6538 00001715 890E[5F21] mov [num_positionals],cx ; Save number of positionals + 6539 ; 29/01/2023 + 6540 ;;cmp ax,END_OF_LINE ; 0FFFFh ; -1 ; are we at end of line? + 6541 ;cmp ax,-1 + 6542 ;jne short t1 + 6543 ; 10/06/2023 + 6544 00001719 40 inc ax ; cmp ax,-1 + 6545 0000171A 7503 jnz short t1 ; 0FFFFh -> 0 + 6546 ; ax = 0 + 6547 0000171C E99502 jmp ArgsDone ; yes - exit + 6548 t1: + 6549 ;;cmp ax,RESULT_NO_ERROR ; 0 ; did an error occur + 6550 ;;cmp ax,0 + 6551 ;and ax,ax + 6552 ; 10/06/2023 + 6553 0000171F 48 dec ax ; cmp ax,0 + 6554 00001720 7468 jz short parse_cont ; 1 -> 0 ; no - continue + 6555 + 6556 ; Before issuing error message - make sure switch is not /C + 6557 + 6558 parse_line_error: + 6559 ; 14/01/2023 + 6560 ;push si ; save line position + 6561 ;push ax ; save error number + 6562 ;cmp ax,3 + 6563 00001722 83F803 cmp ax,BadSwt_Ptr ; 3 ; Was error invalid switch? + 6564 ;jnz short parse_line_error_disp ; No - just issue message + 6565 00001725 7538 jne short parse_line_error_disp2 + 6566 00001727 56 push si ; ** ; save line position + 6567 00001728 50 push ax ; * ; save error number + 6568 00001729 89F7 mov di,si ; Get terminating pointer in DI + 6569 0000172B 8B36[6121] mov si,[old_parse_ptr] ; Get starting pointer in SI + 6570 + 6571 init_chk_delim: + 6572 0000172F 39FE cmp si,di ; at end of parsed parameter? + 6573 00001731 742A je short parse_line_error_disp ; Yes - just display message + 6574 00001733 AC lodsb ; + 6575 00001734 3C20 cmp al,20h ; ' ' ; 16/04/2023 + 6576 ;cmp al,space_chr ; 14/01/2023 + 6577 ;;cmp al,[space] ; Skip blank spaces + 6578 00001736 74F7 je short init_chk_delim ; + 6579 ;cmp al,9 + 6580 00001738 3C09 cmp al,tab_chr ; 9 ; Skip tab characters + 6581 0000173A 74F3 je short init_chk_delim ; + 6582 + 6583 0000173C 3A06[4E04] cmp al,[RSwitChar] ; '/' ; Switch? + 6584 00001740 751B jne short parse_line_error_disp ; No - just issue message + 6585 00001742 AC lodsb ; Get the char after the switch + 6586 + 6587 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 6588 ;ifdef DBCS + 6589 %if 1 + 6590 00001743 E837FD call ITestKanj ; Is it DBCS? + 6591 00001746 7515 jnz short parse_line_error_disp ; Yes - can't be /C or /K + 6592 %endif + 6593 ;endif + 6594 00001748 E8D505 call iupconv ; upper case it + 6595 + 6596 ;cmp al,[scswitch] ; 'C' ; it is /C? + 6597 ;jne short check_k_too ; MSDOS 6.0 ; + 6598 ; 16/04/2023 + 6599 0000174B 3C43 cmp al,'C' ; scswitch + 6600 ;jne short parse_line_error_disp ; MSDOS 5.0 COMMAND.COM + 6601 ; 06/06/2023 + 6602 ; MSDOS 6.22 COMMAND.COM + 6603 0000174D 7505 jne short check_k_too + 6604 0000174F 5A pop dx ; * ; even up stack + 6605 00001750 5A pop dx ; ** ; even up stack + 6606 00001751 E9D100 jmp SetSSwitch ; Yes - go set COMMAND /C + 6607 + 6608 ; MSDOS 6.0 + 6609 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 6610 check_k_too: + 6611 ;cmp al,[skswitch] ; 'K' ; it is /K? + 6612 ;jne short parse_line_error_disp ; + 6613 ; 06/06/2023 + 6614 00001754 3C4B cmp al,'K' + 6615 00001756 7505 jne short parse_line_error_disp + 6616 00001758 5A pop dx ; * ; even up stack + 6617 00001759 5A pop dx ; ** ; even up stack + 6618 0000175A E9C100 jmp SetKSwitch ; Yes - go set COMMAND /K + 6619 + 6620 parse_line_error_disp: + 6621 ; 14/01/2023 + 6622 0000175D 58 pop ax ; * ; restore error number + 6623 0000175E 5E pop si ; ** ; restore line position + 6624 parse_line_error_disp2: + 6625 0000175F 89C2 mov dx,ax ; get message number + 6626 00001761 E84C05 call RPrintParse + 6627 00001764 E871FC call crlf + 6628 00001767 EB9B jmp short Parse_command_line ; continue parsing + 6629 + 6630 ; 22/07/2024 + 6631 + 6632 ;CHECKDSWITCH: + 6633 ;;cmp al,'d' + 6634 ;cmp al,[letter_d] + 6635 ;jnz short CHECKCSWITCH + 6636 + 6637 ; 16/04/2023 + 6638 %if 1 + 6639 SetMSwitch: + 6640 ;cmp byte [ext_msg],1 + 6641 00001769 803E[9420]01 cmp byte [ext_msg],SET_EXTENDED_MSG ; has /MSG switch been set? + 6642 ; 16/04/2023 + 6643 ;jnz short setMswitchok ; no - set it + 6644 ;;mov ax,1 + 6645 ;mov ax,MoreArgs_Ptr ; set up too many arguments + 6646 ;jmp parse_line_error ; go issue error message + 6647 ; 16/04/2023 + 6648 0000176E 747C je short parse_line_error_j + 6649 setMswitchok: + 6650 ;mov byte [ext_msg],1 + 6651 00001770 C606[9420]01 mov byte [ext_msg],SET_EXTENDED_MSG ; set /MSG switch + 6652 ; 06/06/2023 + 6653 00001775 EB8D jmp short Parse_command_line ; keep parsing + 6654 %endif + 6655 + 6656 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6657 + 6658 SetDSwitch: + 6659 + 6660 ; Flag no date/time prompting. + 6661 + 6662 ; MSDOS 6.0 + 6663 00001777 803E[9620]00 cmp byte [dswitch],0 ; has /D switch been set? + 6664 ; 16/04/2023 + 6665 ;jz short setdateok ; no - set it + 6666 ;;mov ax,1 + 6667 ;mov ax,MoreArgs_Ptr ; set up too many arguments + 6668 ;jmp parse_line_error ; go issue error message + 6669 ; 16/04/2023 + 6670 0000177C 756E jnz short parse_line_error_j + 6671 setdateok: + 6672 0000177E FE06[9620] inc byte [dswitch] ; indicate /D entered + 6673 + 6674 ; MSDOS 3.3 & MSDOS 6.0 + 6675 00001782 C606[4720]01 mov byte [PRDATTM],1 ; User explicitly says no date time + 6676 ; MSDOS 3.3 + 6677 ;jmp short CHKARG + 6678 ; MSDOS 6.0 + 6679 00001787 E97AFF jmp Parse_command_line ; continue parsing + 6680 + 6681 parse_cont: + 6682 ; 15/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM + 6683 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:173Ch - CODERES:09FCh) + 6684 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 6685 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:1869h - CODERES:0A19h) + 6686 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6687 ; PCDOS 7.1 COMMAND.COM - RESGROUP:18AEh + 6688 + 6689 ; MSDOS 6.0 + 6690 + 6691 ; See if a switch was entered + 6692 ; + 6693 ; Bugbug: See if Comnd1_Syn can be moved into a reg. before the compare + 6694 + 6695 0000178A 813E[5821][D820] cmp word [COMND1_SYN],COMMAND_F_SYN ; was /F entered? + 6696 00001790 7460 je short SetFSwitch ; yes go set fail switch + 6697 00001792 813E[5821][CC20] cmp word [COMND1_SYN],COMMAND_P_SYN ; was /P entered? + 6698 00001798 744B je short SetPSwitch ; yes go set up PERMCOM + 6699 0000179A 813E[5821][E420] cmp word [COMND1_SYN],COMMAND_D_SYN ; was /D entered? + 6700 000017A0 74D5 je short SetDSwitch ; yes go set date switch + 6701 000017A2 813E[5821][0921] cmp word [COMND1_SYN],COMMAND_C_SYN ; was /C entered? + 6702 000017A8 747B je short SetSSwitch ; yes go set up SINGLECOM + 6703 ; 06/06/2023 + 6704 ; MSDOS 6.0 only! + 6705 000017AA 813E[5821][2F21] cmp word [COMND1_SYN],COMMAND_K_SYN ; was /K entered? + 6706 000017B0 746C je short SetKSwitch ; yes go set up SINGLECOM + 6707 ; + 6708 000017B2 813E[5821][F020] cmp word [COMND1_SYN],COMMAND_E_SYN ; was /E entered? + 6709 000017B8 747C je short SetESwitch ; yes go set up environment + 6710 + 6711 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6712 ; PCDOS 7.1 COMMAND.COM + 6713 %if 1 + 6714 000017BA 813E[5821][3B21] cmp word [COMND1_SYN],COMMAND_Y_SYN ; was /Y entered? + 6715 ;je short SetYSwitch ; yes (step switch) + 6716 ; 22/07/2024 + 6717 000017C0 7508 jne short parse_cont_@ + 6718 + 6719 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19C3h + 6720 SetYSwitch: + 6721 000017C2 800E[5A04]10 or byte [Y_Flag], 10h + 6722 000017C7 E93AFF jmp Parse_command_line + 6723 + 6724 parse_cont_@: + 6725 %endif + 6726 000017CA 813E[5821][1521] cmp word [COMND1_SYN],COMMAND_M_SYN ; was /MSG entered? + 6727 ;je short SetMSwitchjmp ; yes go set up message flag + 6728 ; 15/01/2023 + 6729 000017D0 7497 je short SetMSwitch + 6730 + 6731 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6732 ; PCDOS 7.1 COMMAND.COM - RESGROUP:18FDh + 6733 %if 1 + 6734 000017D2 813E[5821][4721] cmp word [COMND1_SYN],COMMAND_H_SYN ; was /H entered? + 6735 000017D8 747A je short SetHSwitch ; yes (load into UMB switch) + 6736 000017DA 813E[5821][5321] cmp word [COMND1_SYN],COMMAND_O_SYN ; was /O entered? + 6737 000017E0 747F je short SetOSwitch ; yes (disable overwrite prompt) + 6738 %endif + 6739 000017E2 E99800 jmp ChkOtherArgs ; Must be something else + 6740 + 6741 ; MSDOS 6.0 + 6742 ;SetMSwitchjmp: + 6743 ;jmp SetMSwitch + 6744 + 6745 ; 22/07/2024 + 6746 %if 1 + 6747 SetPSwitch: 6748 - 6749 ; MSDOS 6.0 - 6750 000017E5 803E[A202]00 cmp byte [PermCom],0 ; has /p switch been set? - 6751 000017EA 7415 jz short permcomok ; no - set it - 6752 ; 16/04/2023 - 6753 parse_line_error_j: - 6754 ;mov ax,1 - 6755 000017EC B80100 mov ax,MoreArgs_Ptr ; set up too many arguments - 6756 000017EF E930FF jmp parse_line_error ; go issue error - 6757 %endif - 6758 - 6759 ; MSDOS 6.0 - 6760 SetFSwitch: - 6761 000017F2 803E[A902]FF cmp byte [fFail],-1 ; has fail switch been set? - 6762 ; 16/04/2023 - 6763 ;jne short failok ; no - set it - 6764 ;;mov ax,1 - 6765 ;mov ax,MoreArgs_Ptr ; set up too many arguments - 6766 ;jmp parse_line_error ; go issue error - 6767 ; 16/04/2023 - 6768 000017F7 74F3 je short parse_line_error_j - 6769 - 6770 ; MSDOS 3.3 & MSDOS 6.0 - 6771 failok: - 6772 000017F9 C606[A902]FF mov byte [fFail],-1 ; fail all INT 24s. - 6773 ; MSDOS 3.3 - 6774 ;jmp short CHKARG - 6775 ; MSDOS 6.0 - 6776 000017FE E903FF jmp Parse_command_line - 6777 - 6778 ;CHECKPSWITCH: - 6779 ;;cmp al,'p' ; Permanent COMMAND switch - 6780 ;cmp al,[letter_p] - 6781 ;jnz short CHECKDSWITCH - 6782 - 6783 ; 22/07/2024 - 6784 %if 0 - 6785 SetPSwitch: - 6786 - 6787 ; We have a permanent COMMAND switch /P. Flag this and stash the - 6788 ; termination address. + 6749 ; We have a permanent COMMAND switch /P. Flag this and stash the + 6750 ; termination address. + 6751 + 6752 ; MSDOS 6.0 + 6753 000017E5 803E[A202]00 cmp byte [PermCom],0 ; has /p switch been set? + 6754 000017EA 7415 jz short permcomok ; no - set it + 6755 ; 16/04/2023 + 6756 parse_line_error_j: + 6757 ;mov ax,1 + 6758 000017EC B80100 mov ax,MoreArgs_Ptr ; set up too many arguments + 6759 000017EF E930FF jmp parse_line_error ; go issue error + 6760 %endif + 6761 + 6762 ; MSDOS 6.0 + 6763 SetFSwitch: + 6764 000017F2 803E[A902]FF cmp byte [fFail],-1 ; has fail switch been set? + 6765 ; 16/04/2023 + 6766 ;jne short failok ; no - set it + 6767 ;;mov ax,1 + 6768 ;mov ax,MoreArgs_Ptr ; set up too many arguments + 6769 ;jmp parse_line_error ; go issue error + 6770 ; 16/04/2023 + 6771 000017F7 74F3 je short parse_line_error_j + 6772 + 6773 ; MSDOS 3.3 & MSDOS 6.0 + 6774 failok: + 6775 000017F9 C606[A902]FF mov byte [fFail],-1 ; fail all INT 24s. + 6776 ; MSDOS 3.3 + 6777 ;jmp short CHKARG + 6778 ; MSDOS 6.0 + 6779 000017FE E903FF jmp Parse_command_line + 6780 + 6781 ;CHECKPSWITCH: + 6782 ;;cmp al,'p' ; Permanent COMMAND switch + 6783 ;cmp al,[letter_p] + 6784 ;jnz short CHECKDSWITCH + 6785 + 6786 ; 22/07/2024 + 6787 %if 0 + 6788 SetPSwitch: 6789 - 6790 ; MSDOS 6.0 - 6791 cmp byte [PermCom],0 ; has /p switch been set? - 6792 jz short permcomok ; no - set it - 6793 ; 16/04/2023 - 6794 parse_line_error_j: - 6795 ;mov ax,1 - 6796 mov ax,MoreArgs_Ptr ; set up too many arguments - 6797 jmp parse_line_error ; go issue error - 6798 %endif - 6799 - 6800 permcomok: - 6801 ; MSDOS 3.3 & MSDOS 6.0 - 6802 00001801 FE06[A202] inc byte [PermCom] - 6803 ;mov word [OLDTERM],LODCOM - 6804 00001805 C706[4002][E000] mov word [OldTerm],LodCom_Trap - 6805 ;mov [OLDTERM+2],ds - 6806 0000180B 8C1E[4202] mov [OldTerm+2],ds - 6807 - 6808 ; make sure that we display the date and time. if the flag was not - 6809 ; initialized, set it to indicate yes, do prompt. + 6790 ; We have a permanent COMMAND switch /P. Flag this and stash the + 6791 ; termination address. + 6792 + 6793 ; MSDOS 6.0 + 6794 cmp byte [PermCom],0 ; has /p switch been set? + 6795 jz short permcomok ; no - set it + 6796 ; 16/04/2023 + 6797 parse_line_error_j: + 6798 ;mov ax,1 + 6799 mov ax,MoreArgs_Ptr ; set up too many arguments + 6800 jmp parse_line_error ; go issue error + 6801 %endif + 6802 + 6803 permcomok: + 6804 ; MSDOS 3.3 & MSDOS 6.0 + 6805 00001801 FE06[A202] inc byte [PermCom] + 6806 ;mov word [OLDTERM],LODCOM + 6807 00001805 C706[4002][E000] mov word [OldTerm],LodCom_Trap + 6808 ;mov [OLDTERM+2],ds + 6809 0000180B 8C1E[4202] mov [OldTerm+2],ds 6810 - 6811 ; MSDOS 3.3 - 6812 ;cmp byte [PRDATTM],-1 - 6813 ;jnz short CHKARG - 6814 ;mov byte [PRDATTM],0 - 6815 ;jmp short CHKARG - 6816 - 6817 ; MSDOS 6.0 - 6818 0000180F 803E[4720]FF cmp byte [PRDATTM],-1 - 6819 00001814 7505 jne short Parse_command_line_jmp - 6820 00001816 C606[4720]00 mov byte [PRDATTM],0 - 6821 Parse_command_line_jmp: - 6822 0000181B E9E6FE jmp Parse_command_line ; keep parsing - 6823 - 6824 ;COMRETURNSJ: - 6825 ; ; MSDOS 3.3 - 6826 ; JMP ARGSDONE - 6827 - 6828 ; 15/01/2023 - 6829 ; MSDOS 6.0 - 6830 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 6831 SetKSwitch: - 6832 0000181E C606[A302]00 mov byte [SemiPermCom],0 - 6833 00001823 EB05 jmp short SetSorKSwitch - 6834 - 6835 ;CHECKCSWITCH: - 6836 ;;cmp al,'c' - 6837 ;cmp al,[letter_c] - 6838 ;jnz short CHECKESWITCH - 6839 - 6840 SetSSwitch: - 6841 ;SETCSWITCH: + 6811 ; make sure that we display the date and time. if the flag was not + 6812 ; initialized, set it to indicate yes, do prompt. + 6813 + 6814 ; MSDOS 3.3 + 6815 ;cmp byte [PRDATTM],-1 + 6816 ;jnz short CHKARG + 6817 ;mov byte [PRDATTM],0 + 6818 ;jmp short CHKARG + 6819 + 6820 ; MSDOS 6.0 + 6821 0000180F 803E[4720]FF cmp byte [PRDATTM],-1 + 6822 00001814 7505 jne short Parse_command_line_jmp + 6823 00001816 C606[4720]00 mov byte [PRDATTM],0 + 6824 Parse_command_line_jmp: + 6825 0000181B E9E6FE jmp Parse_command_line ; keep parsing + 6826 + 6827 ;COMRETURNSJ: + 6828 ; ; MSDOS 3.3 + 6829 ; JMP ARGSDONE + 6830 + 6831 ; 15/01/2023 + 6832 ; MSDOS 6.0 + 6833 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 6834 SetKSwitch: + 6835 0000181E C606[A302]00 mov byte [SemiPermCom],0 + 6836 00001823 EB05 jmp short SetSorKSwitch + 6837 + 6838 ;CHECKCSWITCH: + 6839 ;;cmp al,'c' + 6840 ;cmp al,[letter_c] + 6841 ;jnz short CHECKESWITCH 6842 - 6843 ; Set up pointer to command line, flag no date/time and turn off SingleCom. - 6844 - 6845 00001825 C606[A202]00 mov byte [PermCom],0 ; A SingleCom must not be a PermCom - 6846 SetSorKSwitch: ; 06/06/2023 - 6847 0000182A 8936[A502] mov [SingleCom],si ; Point to the rest of the command line - 6848 0000182E C606[4720]01 mov byte [PRDATTM],1 ; no date or time either, explicit - 6849 ;COMRETURNSJ: ; 24/09/2018 - 6850 00001833 E97E01 jmp ArgsDone - 6851 - 6852 ;CHECKESWITCH: - 6853 ;cmp al,'e' - 6854 ;jnz short CHKARG - 6855 - 6856 ; Look for environment-size setting switch - 6857 - 6858 ; The environment size is represented in decimal bytes and is - 6859 ; converted into paragraphs (rounded up to the next paragraph). + 6843 SetSSwitch: + 6844 ;SETCSWITCH: + 6845 + 6846 ; Set up pointer to command line, flag no date/time and turn off SingleCom. + 6847 + 6848 00001825 C606[A202]00 mov byte [PermCom],0 ; A SingleCom must not be a PermCom + 6849 SetSorKSwitch: ; 06/06/2023 + 6850 0000182A 8936[A502] mov [SingleCom],si ; Point to the rest of the command line + 6851 0000182E C606[4720]01 mov byte [PRDATTM],1 ; no date or time either, explicit + 6852 ;COMRETURNSJ: ; 24/09/2018 + 6853 00001833 E97E01 jmp ArgsDone + 6854 + 6855 ;CHECKESWITCH: + 6856 ;cmp al,'e' + 6857 ;jnz short CHKARG + 6858 + 6859 ; Look for environment-size setting switch 6860 - 6861 SetESwitch: - 6862 ; MSDOS 6.0 - 6863 00001836 803E[9520]00 cmp byte [eswitch],0 ; has environment size switch been set? - 6864 ; 16/04/2023 - 6865 ;jz short eswitchok ; no - set it - 6866 ;;mov ax,1 - 6867 ;mov ax,MoreArgs_Ptr ; set up too many arguments - 6868 ;jmp parse_line_error ; go issue error message - 6869 ; 16/04/2023 - 6870 0000183B 75AF jnz short parse_line_error_j - 6871 eswitchok: - 6872 0000183D FE06[9520] inc byte [eswitch] ; indicate /E entered - 6873 - 6874 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 6875 ; 15/01/2023 - Retro DOS v4.1 (& v4.1) - MSDOS 5.0 COMMAND.COM - 6876 ; MSDOS 6.0 - 6877 ;mov di,offset ResGroup:Comnd1_Addr ; get number returned - 6878 00001841 BF[5A21] mov di,COMND1_ADDR - 6879 00001844 8B1D mov bx,[di] ; into bx - 6880 - 6881 00001846 83C30F add bx,0Fh ; Round up to next paragraph - 6882 00001849 B104 mov cl,4 ; convert to pargraphs - 6883 0000184B D3EB shr bx,cl ; by right 4 - 6884 - 6885 0000184D 891E[8220] mov [EnvSiz],bx ; EnvSiz is in paragraphs - 6886 00001851 E9B0FE jmp Parse_command_line ; continue parsing command line + 6861 ; The environment size is represented in decimal bytes and is + 6862 ; converted into paragraphs (rounded up to the next paragraph). + 6863 + 6864 SetESwitch: + 6865 ; MSDOS 6.0 + 6866 00001836 803E[9520]00 cmp byte [eswitch],0 ; has environment size switch been set? + 6867 ; 16/04/2023 + 6868 ;jz short eswitchok ; no - set it + 6869 ;;mov ax,1 + 6870 ;mov ax,MoreArgs_Ptr ; set up too many arguments + 6871 ;jmp parse_line_error ; go issue error message + 6872 ; 16/04/2023 + 6873 0000183B 75AF jnz short parse_line_error_j + 6874 eswitchok: + 6875 0000183D FE06[9520] inc byte [eswitch] ; indicate /E entered + 6876 + 6877 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 6878 ; 15/01/2023 - Retro DOS v4.1 (& v4.1) - MSDOS 5.0 COMMAND.COM + 6879 ; MSDOS 6.0 + 6880 ;mov di,offset ResGroup:Comnd1_Addr ; get number returned + 6881 00001841 BF[5A21] mov di,COMND1_ADDR + 6882 00001844 8B1D mov bx,[di] ; into bx + 6883 + 6884 00001846 83C30F add bx,0Fh ; Round up to next paragraph + 6885 00001849 B104 mov cl,4 ; convert to pargraphs + 6886 0000184B D3EB shr bx,cl ; by right 4 6887 - 6888 ; 16/04/2023 - 6889 %if 0 - 6890 SetMSwitch: - 6891 ;cmp byte [ext_msg],1 - 6892 cmp byte [ext_msg],SET_EXTENDED_MSG ; has /MSG switch been set? - 6893 jnz short setMswitchok ; no - set it - 6894 ;mov ax,1 - 6895 mov ax,MoreArgs_Ptr ; set up too many arguments - 6896 jmp parse_line_error ; go issue error message - 6897 setMswitchok: - 6898 ;mov byte [ext_msg],1 - 6899 mov byte [ext_msg],SET_EXTENDED_MSG ; set /MSG switch - 6900 jmp Parse_command_line ; keep parsing - 6901 %endif - 6902 - 6903 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6904 %if 1 - 6905 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1913h - 6906 SetHSwitch: - 6907 ;jmp short load_to_hma_umb ; load COMMAND.COM into HMA/UMB - 6908 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19CBh - 6909 load_to_hma_umb: - 6910 ;cmp byte [520h],0 - 6911 00001854 803E[0E04]00 cmp byte [COMMAND_HIGH],0 - 6912 00001859 741B jz short set_command_high_flag - 6913 parse_line_error_j2: ; 22/07/2024 - 6914 0000185B B80100 mov ax,1 ; too many parameters - 6915 0000185E E9C1FE jmp parse_line_error - 6916 - 6917 ;set_command_high_flag: - 6918 ; inc byte [COMMAND_HIGH] - 6919 ; jmp Parse_command_line - 6920 - 6921 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1916h - 6922 SetOSwitch: - 6923 ;jmp short disable_overwrite_msg - 6924 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19DFh - 6925 disable_overwrite_msg: - 6926 00001861 803E[FA01]63 cmp byte [cox_location],'c' ; "cox" - 6927 ;jz short change_cox_to_VCB - 6928 ;mov ax, 1 ; MoreArgs_Ptr - 6929 ;jmp parse_line_error - 6930 ; 22/07/2024 - 6931 00001866 75F3 jnz short parse_line_error_j2 - 6932 change_cox_to_VCB: - 6933 00001868 C606[FA01]56 mov byte [cox_location],56h ; 'V' ; "VCB" - 6934 0000186D C706[FB01]4342 mov word [cox_location+1],4243h ; 'CB' - 6935 00001873 E98EFE jmp Parse_command_line - 6936 - 6937 set_command_high_flag: - 6938 00001876 FE06[0E04] inc byte [COMMAND_HIGH] - 6939 0000187A E987FE jmp Parse_command_line - 6940 %endif - 6941 - 6942 ;ArgsDoneJ: - 6943 ;jmp ArgsDone + 6888 0000184D 891E[8220] mov [EnvSiz],bx ; EnvSiz is in paragraphs + 6889 00001851 E9B0FE jmp Parse_command_line ; continue parsing command line + 6890 + 6891 ; 16/04/2023 + 6892 %if 0 + 6893 SetMSwitch: + 6894 ;cmp byte [ext_msg],1 + 6895 cmp byte [ext_msg],SET_EXTENDED_MSG ; has /MSG switch been set? + 6896 jnz short setMswitchok ; no - set it + 6897 ;mov ax,1 + 6898 mov ax,MoreArgs_Ptr ; set up too many arguments + 6899 jmp parse_line_error ; go issue error message + 6900 setMswitchok: + 6901 ;mov byte [ext_msg],1 + 6902 mov byte [ext_msg],SET_EXTENDED_MSG ; set /MSG switch + 6903 jmp Parse_command_line ; keep parsing + 6904 %endif + 6905 + 6906 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6907 %if 1 + 6908 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1913h + 6909 SetHSwitch: + 6910 ;jmp short load_to_hma_umb ; load COMMAND.COM into HMA/UMB + 6911 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19CBh + 6912 load_to_hma_umb: + 6913 ;cmp byte [520h],0 + 6914 00001854 803E[0E04]00 cmp byte [COMMAND_HIGH],0 + 6915 00001859 741B jz short set_command_high_flag + 6916 parse_line_error_j2: ; 22/07/2024 + 6917 0000185B B80100 mov ax,1 ; too many parameters + 6918 0000185E E9C1FE jmp parse_line_error + 6919 + 6920 ;set_command_high_flag: + 6921 ; inc byte [COMMAND_HIGH] + 6922 ; jmp Parse_command_line + 6923 + 6924 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1916h + 6925 SetOSwitch: + 6926 ;jmp short disable_overwrite_msg + 6927 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19DFh + 6928 disable_overwrite_msg: + 6929 00001861 803E[FA01]63 cmp byte [cox_location],'c' ; "cox" + 6930 ;jz short change_cox_to_VCB + 6931 ;mov ax, 1 ; MoreArgs_Ptr + 6932 ;jmp parse_line_error + 6933 ; 22/07/2024 + 6934 00001866 75F3 jnz short parse_line_error_j2 + 6935 change_cox_to_VCB: + 6936 00001868 C606[FA01]56 mov byte [cox_location],56h ; 'V' ; "VCB" + 6937 0000186D C706[FB01]4342 mov word [cox_location+1],4243h ; 'CB' + 6938 00001873 E98EFE jmp Parse_command_line + 6939 + 6940 set_command_high_flag: + 6941 00001876 FE06[0E04] inc byte [COMMAND_HIGH] + 6942 0000187A E987FE jmp Parse_command_line + 6943 %endif 6944 - 6945 ; 15/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM - 6946 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:181Dh - CODERES:0ADDh) + 6945 ;ArgsDoneJ: + 6946 ;jmp ArgsDone 6947 - 6948 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 6949 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:196Dh - CODERES:0B1Dh) + 6948 ; 15/01/2023 - Retro DOS v4.0 (& V4.1) COMMAND.COM + 6949 ; (MSDOS 5.0 COMMAND.COM - RESGROUP:181Dh - CODERES:0ADDh) 6950 - 6951 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 6952 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19FAh + 6951 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 6952 ; (MSDOS 6.22 COMMAND.COM - RESGROUP:196Dh - CODERES:0B1Dh) 6953 - 6954 ChkOtherArgs: - 6955 - 6956 ; We have a non-switch character here. - 6957 - 6958 ; MSDOS 6.0 - 6959 0000187D 1E push ds ; **** ; - 6960 0000187E 56 push si ; *** ; save place in command line - 6961 0000187F C536[5A21] lds si,[COMND1_ADDR] ; get address of filespec - 6962 ;assume ds:nothing ; - 6963 - 6964 00001883 89F2 mov dx,si ; put in dx also - 6965 00001885 B8023D mov ax,3D02h - 6966 ;mov ax,(OPEN shl 8) or 2 ; Read and write - 6967 00001888 CD21 int 21h - 6968 0000188A 7260 jc short ChkSrchSpec ; Wasn't a file - 6969 0000188C 89C3 mov bx,ax - 6970 0000188E B80044 mov ax,4400h - 6971 ;mov ax,IOCTL shl 8 - 6972 00001891 CD21 int 21h - 6973 00001893 F6C280 test dl,80h - 6974 00001896 7506 jnz short IsaDevice - 6975 BadSetCon: - 6976 00001898 B43E mov ah,3Eh - 6977 ;mov ah,CLOSE ; Close initial handle, wasn't a device - 6978 0000189A CD21 int 21h - 6979 0000189C EB4E jmp short ChkSrchSpec - 6980 - 6981 ; 15/01/2023 - 6982 IsaDevice: - 6983 ; MSDOS 3.3 & MSDOS 6.0 - 6984 0000189E 30F6 xor dh,dh - 6985 000018A0 80CA03 or dl,3 ; Make sure has CON attributes - 6986 ;mov ax,(IOCTL shl 8) or 1 - 6987 000018A3 B80144 mov ax,(IOCTL*256)|1 ; 4401h - 6988 000018A6 CD21 int 21h - 6989 ; - 6990 ; 15/01/2023 - 6991 000018A8 72EE jc short BadSetCon ; MSDOS 6.0 (& 5.0) - 6992 ; 25/09/2018 - 6993 ;pop dx ; * - 6994 ;pop dx ; ** - 6995 ; - 6996 ;jc short BADSETCON ; MSDOS 6.0 ; Can't set attributes - quit - 6997 - 6998 000018AA 89DA mov dx,bx ; Save new handle - 6999 - 7000 ; MSDOS 6.0 - 7001 000018AC 26803E[9A26]01 cmp byte [es:DevFlag],1 - 7002 000018B2 742A jz short DevErr - 7003 - 7004 ; MSDOS 3.3 - 7005 ;pop bx ; * ; Throw away saved SI - 7006 ;pop bx ; ** ; Throw away saved CX - 7007 - 7008 ; MSDOS 3.3 & MSDOS 6.0 - 7009 000018B4 51 push cx ; ** - 7010 000018B5 B90300 mov cx,3 - 7011 000018B8 31DB xor bx,bx - 7012 - 7013 ; 15/01/2023 - 7014 rcclloop: - 7015 000018BA B43E mov ah,3Eh - 7016 ;mov ah,CLOSE ; 3Eh - 7017 000018BC CD21 int 21h - 7018 000018BE 43 inc bx - 7019 000018BF E2F9 loop rcclloop - 7020 - 7021 000018C1 89D3 mov bx,dx ; New device handle - 7022 000018C3 B445 mov ah,45h - 7023 ;mov ah,XDUP ; 45h - 7024 000018C5 CD21 int 21h ; Dup to 0 - 7025 000018C7 B445 mov ah,45h - 7026 ;mov ah,XDUP - 7027 000018C9 CD21 int 21h ; Dup to 1 - 7028 000018CB B445 mov ah,45h + 6954 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 6955 ; PCDOS 7.1 COMMAND.COM - RESGROUP:19FAh + 6956 + 6957 ChkOtherArgs: + 6958 + 6959 ; We have a non-switch character here. + 6960 + 6961 ; MSDOS 6.0 + 6962 0000187D 1E push ds ; **** ; + 6963 0000187E 56 push si ; *** ; save place in command line + 6964 0000187F C536[5A21] lds si,[COMND1_ADDR] ; get address of filespec + 6965 ;assume ds:nothing ; + 6966 + 6967 00001883 89F2 mov dx,si ; put in dx also + 6968 00001885 B8023D mov ax,3D02h + 6969 ;mov ax,(OPEN shl 8) or 2 ; Read and write + 6970 00001888 CD21 int 21h + 6971 0000188A 7260 jc short ChkSrchSpec ; Wasn't a file + 6972 0000188C 89C3 mov bx,ax + 6973 0000188E B80044 mov ax,4400h + 6974 ;mov ax,IOCTL shl 8 + 6975 00001891 CD21 int 21h + 6976 00001893 F6C280 test dl,80h + 6977 00001896 7506 jnz short IsaDevice + 6978 BadSetCon: + 6979 00001898 B43E mov ah,3Eh + 6980 ;mov ah,CLOSE ; Close initial handle, wasn't a device + 6981 0000189A CD21 int 21h + 6982 0000189C EB4E jmp short ChkSrchSpec + 6983 + 6984 ; 15/01/2023 + 6985 IsaDevice: + 6986 ; MSDOS 3.3 & MSDOS 6.0 + 6987 0000189E 30F6 xor dh,dh + 6988 000018A0 80CA03 or dl,3 ; Make sure has CON attributes + 6989 ;mov ax,(IOCTL shl 8) or 1 + 6990 000018A3 B80144 mov ax,(IOCTL*256)|1 ; 4401h + 6991 000018A6 CD21 int 21h + 6992 ; + 6993 ; 15/01/2023 + 6994 000018A8 72EE jc short BadSetCon ; MSDOS 6.0 (& 5.0) + 6995 ; 25/09/2018 + 6996 ;pop dx ; * + 6997 ;pop dx ; ** + 6998 ; + 6999 ;jc short BADSETCON ; MSDOS 6.0 ; Can't set attributes - quit + 7000 + 7001 000018AA 89DA mov dx,bx ; Save new handle + 7002 + 7003 ; MSDOS 6.0 + 7004 000018AC 26803E[9A26]01 cmp byte [es:DevFlag],1 + 7005 000018B2 742A jz short DevErr + 7006 + 7007 ; MSDOS 3.3 + 7008 ;pop bx ; * ; Throw away saved SI + 7009 ;pop bx ; ** ; Throw away saved CX + 7010 + 7011 ; MSDOS 3.3 & MSDOS 6.0 + 7012 000018B4 51 push cx ; ** + 7013 000018B5 B90300 mov cx,3 + 7014 000018B8 31DB xor bx,bx + 7015 + 7016 ; 15/01/2023 + 7017 rcclloop: + 7018 000018BA B43E mov ah,3Eh + 7019 ;mov ah,CLOSE ; 3Eh + 7020 000018BC CD21 int 21h + 7021 000018BE 43 inc bx + 7022 000018BF E2F9 loop rcclloop + 7023 + 7024 000018C1 89D3 mov bx,dx ; New device handle + 7025 000018C3 B445 mov ah,45h + 7026 ;mov ah,XDUP ; 45h + 7027 000018C5 CD21 int 21h ; Dup to 0 + 7028 000018C7 B445 mov ah,45h 7029 ;mov ah,XDUP - 7030 000018CD CD21 int 21h ; Dup to 2 - 7031 000018CF B43E mov ah,3Eh - 7032 ;mov ah,CLOSE - 7033 000018D1 CD21 int 21h ; Close initial handle - 7034 - 7035 000018D3 59 pop cx ; ** - 7036 - 7037 ; MSDOS 6.0 - 7038 000018D4 5E pop si ; *** ; restore position of command line - 7039 000018D5 1F pop ds ; **** ; - 7040 - 7041 ; Register the fact that we already have redirected the output - 7042 ; and can not do it again + 7030 000018C9 CD21 int 21h ; Dup to 1 + 7031 000018CB B445 mov ah,45h + 7032 ;mov ah,XDUP + 7033 000018CD CD21 int 21h ; Dup to 2 + 7034 000018CF B43E mov ah,3Eh + 7035 ;mov ah,CLOSE + 7036 000018D1 CD21 int 21h ; Close initial handle + 7037 + 7038 000018D3 59 pop cx ; ** + 7039 + 7040 ; MSDOS 6.0 + 7041 000018D4 5E pop si ; *** ; restore position of command line + 7042 000018D5 1F pop ds ; **** ; 7043 - 7044 000018D6 26FE06[9A26] inc byte [es:DevFlag] - 7045 000018DB E926FE jmp Parse_command_line ; continue parsing + 7044 ; Register the fact that we already have redirected the output + 7045 ; and can not do it again 7046 - 7047 ; MSDOS 3.3 - 7048 ;jcxz ARGSDONEJ2 - 7049 ;jmp CHKARG - 7050 - 7051 ; MSDOS 6.0 - 7052 DevErr: - 7053 000018DE 5E pop si ; *** - 7054 000018DF 1F pop ds ; **** - 7055 000018E0 BA0100 mov dx,1 - 7056 000018E3 E8CA03 call RPrintParse ; "Too many parameters" - 7057 000018E6 E8EFFA call crlf - 7058 000018E9 E918FE jmp Parse_command_line - 7059 - 7060 ChkSrchSpec: ; Not a device, so must be directory spec - 7061 ; MSDOS 6.0 - 7062 000018EC 26803E[9B26]01 cmp byte [es:PathFlag],1 ; already set COMSPEC? - 7063 000018F2 74EA jz short DevErr ; yes, error - 7064 - 7065 000018F4 26FE06[9B26] inc byte [es:PathFlag] ; mark that we have a path - 7066 - 7067 ; We have to override the passed environment. Allocate a buffer for use now. - 7068 ; This buffer will later be replaced by a proper environment + 7047 000018D6 26FE06[9A26] inc byte [es:DevFlag] + 7048 000018DB E926FE jmp Parse_command_line ; continue parsing + 7049 + 7050 ; MSDOS 3.3 + 7051 ;jcxz ARGSDONEJ2 + 7052 ;jmp CHKARG + 7053 + 7054 ; MSDOS 6.0 + 7055 DevErr: + 7056 000018DE 5E pop si ; *** + 7057 000018DF 1F pop ds ; **** + 7058 000018E0 BA0100 mov dx,1 + 7059 000018E3 E8CA03 call RPrintParse ; "Too many parameters" + 7060 000018E6 E8EFFA call crlf + 7061 000018E9 E918FE jmp Parse_command_line + 7062 + 7063 ChkSrchSpec: ; Not a device, so must be directory spec + 7064 ; MSDOS 6.0 + 7065 000018EC 26803E[9B26]01 cmp byte [es:PathFlag],1 ; already set COMSPEC? + 7066 000018F2 74EA jz short DevErr ; yes, error + 7067 + 7068 000018F4 26FE06[9B26] inc byte [es:PathFlag] ; mark that we have a path 7069 - 7070 ; 15/01/2023 - Retro DOS v4.0 COMMAND.COM - 7071 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1899h - 7072 ; 06/06/2023 - 7073 ;mov ax,[ss:EnvirSeg] - 7074 - 7075 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7076 ; MSDOS 6.22 COMMAND.COM - RESGROUP:19E9h - 7077 ; - 7078 ; MSDOS 6.0 - 7079 000018F9 E88F05 call alloc_env ; environment buffer - 7080 - 7081 ; 06/06/2023 - 7082 %if 0 - 7083 ; 15/01/2023 - 7084 ; MSDOS 5.0 - 7085 cmp byte [ss:AllocedEnv],1 - 7086 mov byte [ss:AllocedEnv],0 - 7087 jne short env_alloced - 7088 call alloc_env - 7089 mov [ss:EnvirSeg],ax - 7090 %endif - 7091 - 7092 env_alloced: - 7093 ; MSDOS 5.0 & MSDOS 6.0 - 7094 000018FC 8EC0 mov es,ax - 7095 ;assume es:nothing - 7096 000018FE 56 push si ; ** ; remember location of file - 7097 000018FF 31C9 xor cx,cx ; clear cx for counting - 7098 - 7099 ; 15/01/2023 - 7100 countloop: - 7101 00001901 AC lodsb ; get a character - 7102 00001902 41 inc cx ; increment counter - 7103 ;;cmp al,0 - 7104 ;cmp al,END_OF_LINE_OUT ; are we at end of line? - 7105 ;jne short countloop ; no - keep counting - 7106 00001903 08C0 or al,al - 7107 00001905 75FA jnz short countloop - 7108 ; 06/03/2023 - 7109 ; al = 0 ; (*) - 7110 - 7111 ;;;;mov al,[Space] - 7112 ;;;mov al,[ss:Space] ; 15/01/2023 - MSDOS 5.0 COMMAND.COM - 7113 ;;mov al,space_chr ; Retro DOS v4.0 (& v4.1) COMMAND.COM - 7114 ; 16/04/2023 - 7115 ;mov al,20h ; ' ' - 7116 00001907 4E dec si ; move back one - 7117 ;mov [si],al ; put a space at end of line - 7118 00001908 C60420 mov byte [si],20h ; ' ' ; space_chr - 7119 - 7120 ; We now know how long the new pathspec for command.com is. Time to - 7121 ; figure out how long the current COMSPEC setting is, and then to move - 7122 ; all the environment data up, throwing that COMSPEC setting away, and - 7123 ; preparing to append the new COMSPEC. ComspOffset (the offset of - 7124 ; where the filespec exists in the environment) is updated as well. - 7125 - 7126 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7127 ; MSDOS 6.22 COMMAND.COM - RESGROUP:19FEh + 7070 ; We have to override the passed environment. Allocate a buffer for use now. + 7071 ; This buffer will later be replaced by a proper environment + 7072 + 7073 ; 15/01/2023 - Retro DOS v4.0 COMMAND.COM + 7074 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1899h + 7075 ; 06/06/2023 + 7076 ;mov ax,[ss:EnvirSeg] + 7077 + 7078 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7079 ; MSDOS 6.22 COMMAND.COM - RESGROUP:19E9h + 7080 ; + 7081 ; MSDOS 6.0 + 7082 000018F9 E88F05 call alloc_env ; environment buffer + 7083 + 7084 ; 06/06/2023 + 7085 %if 0 + 7086 ; 15/01/2023 + 7087 ; MSDOS 5.0 + 7088 cmp byte [ss:AllocedEnv],1 + 7089 mov byte [ss:AllocedEnv],0 + 7090 jne short env_alloced + 7091 call alloc_env + 7092 mov [ss:EnvirSeg],ax + 7093 %endif + 7094 + 7095 env_alloced: + 7096 ; MSDOS 5.0 & MSDOS 6.0 + 7097 000018FC 8EC0 mov es,ax + 7098 ;assume es:nothing + 7099 000018FE 56 push si ; ** ; remember location of file + 7100 000018FF 31C9 xor cx,cx ; clear cx for counting + 7101 + 7102 ; 15/01/2023 + 7103 countloop: + 7104 00001901 AC lodsb ; get a character + 7105 00001902 41 inc cx ; increment counter + 7106 ;;cmp al,0 + 7107 ;cmp al,END_OF_LINE_OUT ; are we at end of line? + 7108 ;jne short countloop ; no - keep counting + 7109 00001903 08C0 or al,al + 7110 00001905 75FA jnz short countloop + 7111 ; 06/03/2023 + 7112 ; al = 0 ; (*) + 7113 + 7114 ;;;;mov al,[Space] + 7115 ;;;mov al,[ss:Space] ; 15/01/2023 - MSDOS 5.0 COMMAND.COM + 7116 ;;mov al,space_chr ; Retro DOS v4.0 (& v4.1) COMMAND.COM + 7117 ; 16/04/2023 + 7118 ;mov al,20h ; ' ' + 7119 00001907 4E dec si ; move back one + 7120 ;mov [si],al ; put a space at end of line + 7121 00001908 C60420 mov byte [si],20h ; ' ' ; space_chr + 7122 + 7123 ; We now know how long the new pathspec for command.com is. Time to + 7124 ; figure out how long the current COMSPEC setting is, and then to move + 7125 ; all the environment data up, throwing that COMSPEC setting away, and + 7126 ; preparing to append the new COMSPEC. ComspOffset (the offset of + 7127 ; where the filespec exists in the environment) is updated as well. 7128 - 7129 ; MSDOS 6.0 - 7130 0000190B 51 push cx ; * ; - 7131 0000190C B90080 mov cx,ENVBIG ; 32768 ; - 7132 0000190F 368B3E[6B20] mov di,[ss:ComspOffset] ; get location of COMSPEC - 7133 ;mov al,0 ; - 7134 ; 06/06/2023 - 7135 ; al = 0 ; (*) - 7136 00001914 F2AE repne scasb ; find the end of COMSPEC - 7137 00001916 89FE mov si,di ; - 7138 comp_endenv: ; - 7139 00001918 AE scasb ; end of env? - 7140 00001919 7404 je short got_endenv ; yes - 7141 0000191B F2AE repne scasb ; - 7142 0000191D EBF9 jmp short comp_endenv ; - 7143 got_endenv: ; - 7144 0000191F 89F9 mov cx,di ; - 7145 00001921 29F1 sub cx,si ; - 7146 00001923 368B3E[6B20] mov di,[ss:ComspOffset] ; - 7147 00001928 83EF08 sub di,ComspStrLen ; sub di,8 ; - 7148 0000192B 1E push ds ; + ; - 7149 0000192C 06 push es ; - 7150 0000192D 1F pop ds ; - 7151 0000192E F3A4 rep movsb ; - 7152 00001930 4F dec di ; copy in new COMSPEC= - 7153 00001931 0E push cs ; - 7154 00001932 1F pop ds ; - 7155 ;assume ds:RESGROUP ; - 7156 ;mov si,offset RESGROUP:ComspString ; - 7157 00001933 BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" - 7158 ;mov cx,ComspStrLen ; mov cx,8 ; - 7159 00001936 B108 mov cl,ComspStrLen ; mov cl,8 - 7160 00001938 F3A4 rep movsb ; - 7161 0000193A 893E[6B20] mov [ComspOffset],di ; - 7162 0000193E 1F pop ds ; + ; - 7163 ;assume ds:nothing ; - 7164 0000193F 59 pop cx ; * ; - 7165 ; - 7166 00001940 5E pop si ; ** ; get new comspec location back - 7167 - 7168 ;; MSDOS 3.3 COMMAND.COM - 7169 ;;mov byte [CHUCKENV],0 ; If search specified -- no inheritance - 7170 ;;mov ax,PATHSTRING ; "PATH=" ; Figure environment pointer - 7171 ;;mov cl,4 - 7172 ;;shr ax,cl - 7173 ;;mov dx,ds - 7174 ;;add ax,dx - 7175 ;;mov [ENVIRSEG],ax - 7176 ;;mov es,ax - 7177 ;;;mov al,' ' - 7178 ;;mov al,[SPACE_CHR] - 7179 ;;mov [si-1],al - 7180 ;;pop si ; ** ; Remember location - 7181 ;;pop cx ; * ; and count - 7182 ;;;mov di,[ECOMLOC] - 7183 ;;mov di,[COMSPOFFSET] - 7184 - 7185 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7186 ;; 15/01/2023 - 7187 ;; MSDOS 5.0 COMMAND.COM - 7188 ;pop si ; ** - 7189 ;;mov di,14 - 7190 ;mov di,ECOMSPEC ; mov di,0Eh - 7191 - 7192 ComtrLoop: - 7193 ; MSDOS 3.3 & MSDOS 6.0 - 7194 00001941 AC lodsb - 7195 00001942 49 dec cx - 7196 ;;;;cmp al,' ' - 7197 ;;;cmp al,[space_chr] - 7198 ;;cmp al,[ss:Space] ; MSDOS 5.0 COMMAND.COM - 7199 ;cmp al,space_chr ; Retro DOS v4.0 (& v4.1) COMMAND.COM - 7200 ; 16/04/2023 - 7201 00001943 3C20 cmp al,20h ; ' ' ; space_chr - 7202 00001945 7416 je short SetComsr - 7203 ; MSDOS 3.3 - 7204 ;cmp al,9 - 7205 ;je short SetComsr - 7206 ; MSDOS 3.3 & MSDOS 6.0 - 7207 00001947 AA stosb - 7208 - 7209 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7210 %if 1 - 7211 ;ifdef DBCS - 7212 00001948 30E4 xor ah,ah - 7213 ;endif - 7214 %endif - 7215 0000194A E311 jcxz SetComsr - 7216 - 7217 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7218 %if 1 - 7219 ;ifdef DBCS - 7220 0000194C 1E push ds ; Make sure we have - 7221 0000194D 0E push cs ; local DS for - 7222 0000194E 1F pop ds ; ItestKanj - 7223 0000194F E82BFB call ITestKanj - 7224 00001952 1F pop ds ; restore parser ds - 7225 00001953 74EC jz short ComtrLoop - 7226 00001955 49 dec cx - 7227 00001956 A4 movsb - 7228 00001957 FEC4 inc ah - 7229 00001959 E302 jcxz SetComsr - 7230 ;endif - 7231 %endif - 7232 0000195B EBE4 jmp short ComtrLoop - 7233 - 7234 SetComsr: - 7235 ; 15/01/2023 - 7236 ; MSDOS 6.0 - 7237 0000195D 51 push cx ; ** - 7238 0000195E 0E push cs ; Get local segment - 7239 0000195F 1F pop ds ; - 7240 ;assume ds:ResGroup ; - 7241 00001960 1E push ds ; * - 7242 ;mov si,offset ResGroup:ComSpect - 7243 00001961 BE[2820] mov si,COMSPECT ; "\COMMAND.COM" - 7244 00001964 B90E00 mov cx,14 - 7245 00001967 268A45FF mov al,[es:di-1] - 7246 - 7247 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7248 %if 1 - 7249 ;ifdef DBCS - 7250 0000196B 08E4 or ah,ah - 7251 0000196D 7508 jnz short iNotRoot ; Last char was KANJI second byte, might be '\' - 7252 ;endif - 7253 %endif - 7254 0000196F 3A06[4F04] cmp al,[RDirChar] - 7255 00001973 7502 jne short iNotRoot - 7256 00001975 46 inc si ; Don't make a double / - 7257 00001976 49 dec cx - 7258 - 7259 ; MSDOS 3.37 - 7260 ;push si - 7261 ;push cx - 7262 ;push ds - 7263 ;mov si,COMSPECT ; "/COMMAND.COM" - 7264 ;mov cx,14 - 7265 ;mov al,[es:di-1] - 7266 ;call PATHCHRCMPR - 7267 ;jnz short INOTROOT - 7268 ;inc si ; Don't make a double / - 7269 ;dec cx - 7270 - 7271 iNotRoot: - 7272 ; MSDOS 3.3 & MSDOS 6.0 - 7273 00001977 F3A4 rep movsb - 7274 - 7275 ;;mov dx,[ECOMLOC] ; Now lets make sure its good! - 7276 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7277 ; MSDOS 6.0 - 7278 00001979 8B16[6B20] mov dx,[ComspOffset] ; [COMSPOFFSET] - 7279 ; 15/01/2023 - 7280 ;;mov dx,14 - 7281 ;mov dx,ECOMSPEC ; mov dx,0Eh ; MSDOS 5.0 COMMAND.COM - 7282 - 7283 0000197D 06 push es - 7284 0000197E 1F pop ds - 7285 ;;mov ax,OPEN shl 8 - 7286 ;mov ax,OPEN*256 ; 3D00h - 7287 0000197F B8003D mov ax,3D00h ; 15/01/2023 - 7288 00001982 CD21 int 21h ; Open COMMAND.COM - 7289 00001984 1F pop ds ; * - 7290 00001985 720E jc short SetComsrBad ; No COMMAND.COM here - 7291 00001987 89C3 mov bx,ax ; Handle - 7292 00001989 B43E mov ah,3Eh ; 15/01/2023 - 7293 ;mov ah,CLOSE ; 3Eh - 7294 0000198B CD21 int 21h ; Close COMMAND.COM - 7295 SetComsrRet: - 7296 ; 15/01/2023 - 7297 0000198D 59 pop cx ; ** - 7298 0000198E 5E pop si ; *** - 7299 - 7300 ; MSDOS 6.0 - 7301 0000198F 1F pop ds ; **** ; - 7302 ;assume ds:ResGroup ; - 7303 ; - 7304 00001990 0E push cs ; Make sure local ES is - 7305 00001991 07 pop es ; restored - 7306 00001992 E96FFD jmp Parse_command_line ; continue parsing command line - 7307 - 7308 ; MSDOS 3.3 - 7309 ;ARGSDONEJ2: - 7310 ;jcxz ARGSDONE - 7311 ;jmp CHKARG - 7312 - 7313 ; 16/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 7314 SetComsrBad: - 7315 ; MSDOS 3.3 & MSDOS 6.0 - 7316 ;mov dx,offset ResGroup:BadComlkMsg ; dx = ptr to msg - 7317 00001995 BA[FB21] mov dx,BADCOMLKMES - 7318 - 7319 ; Note: we're about to make a near call to TriageError, which - 7320 ; lives in a different segment and group. Some linkers will - 7321 ; generate a warning like "Possible fix-up overflow". We're - 7322 ; ok, though, because we all fit in 64 KB and, at init time, - 7323 ; we're still all together. - 7324 - 7325 ; 16/01/2023 - 7326 ;TRIAGEERROR equ TRANSTART+TriageError - 7327 ;(MSDOS 5.0 COMMAND.COM, 2320h+2D92h) - 7328 - 7329 ; 06/06/2023 - 7330 TRIAGEERROR equ TRANSTART+TriageError - 7331 ;(MSDOS 6.22 COMMAND.COM, 26E0h+333Ch) - 7332 - 7333 ;;;call 50B2h ; MSDOS 5.0 COMMAND.COM - 7334 ;;call 5A1Ch ; MSDOS 6.22 COMMAND.COM - 7335 ; 18/07/2024 - 7336 ;call 5A6Ch ; PCDOS 7.1 COMMAND.COM - 7337 00001998 E8(7D58) call TRIAGEERROR ; TRIAGEERROR procedure is at offset 354Eh - 7338 ; in original MSDOS 3.3 COMMAND.COM - 7339 - 7340 ; TriageError procedure is at offset 50B2h - 7341 ; in original MSDOS 5.0 COMMAND.COM - 7342 0000199B 83F841 cmp ax,65 - 7343 0000199E 7503 jne short doprt - 7344 ;mov dx,offset ResGroup:BadComaccMsg ; dx = ptr to msg - 7345 000019A0 BA[2422] mov dx,BADCOMACCMSG - 7346 doprt: - 7347 000019A3 E835FA call RPrint - 7348 ;mov si,offset ResGroup:ComSpect - 7349 000019A6 BE[2820] mov si,COMSPECT ; "\COMMAND.COM" - 7350 ;;mov di,[ECOMLOC] - 7351 ; 06/06/2023 - 7352 000019A9 8B3E[6B20] mov di,[ComspOffset] ; MSDOS 6.22 COMMAND.COM - 7353 ; 16/01/2023 - 7354 ;mov di,ECOMSPEC ; mov di,0Eh ; MSDOS 5.0 COMMAND.COM - 7355 000019AD B90E00 mov cx,14 - 7356 000019B0 F3A4 rep movsb ; get my default back - 7357 - 7358 000019B2 EBD9 jmp short SetComsrRet - 7359 - 7360 ; 16/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 7361 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1927h (CODERES:0BE7h) + 7129 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7130 ; MSDOS 6.22 COMMAND.COM - RESGROUP:19FEh + 7131 + 7132 ; MSDOS 6.0 + 7133 0000190B 51 push cx ; * ; + 7134 0000190C B90080 mov cx,ENVBIG ; 32768 ; + 7135 0000190F 368B3E[6B20] mov di,[ss:ComspOffset] ; get location of COMSPEC + 7136 ;mov al,0 ; + 7137 ; 06/06/2023 + 7138 ; al = 0 ; (*) + 7139 00001914 F2AE repne scasb ; find the end of COMSPEC + 7140 00001916 89FE mov si,di ; + 7141 comp_endenv: ; + 7142 00001918 AE scasb ; end of env? + 7143 00001919 7404 je short got_endenv ; yes + 7144 0000191B F2AE repne scasb ; + 7145 0000191D EBF9 jmp short comp_endenv ; + 7146 got_endenv: ; + 7147 0000191F 89F9 mov cx,di ; + 7148 00001921 29F1 sub cx,si ; + 7149 00001923 368B3E[6B20] mov di,[ss:ComspOffset] ; + 7150 00001928 83EF08 sub di,ComspStrLen ; sub di,8 ; + 7151 0000192B 1E push ds ; + ; + 7152 0000192C 06 push es ; + 7153 0000192D 1F pop ds ; + 7154 0000192E F3A4 rep movsb ; + 7155 00001930 4F dec di ; copy in new COMSPEC= + 7156 00001931 0E push cs ; + 7157 00001932 1F pop ds ; + 7158 ;assume ds:RESGROUP ; + 7159 ;mov si,offset RESGROUP:ComspString ; + 7160 00001933 BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" + 7161 ;mov cx,ComspStrLen ; mov cx,8 ; + 7162 00001936 B108 mov cl,ComspStrLen ; mov cl,8 + 7163 00001938 F3A4 rep movsb ; + 7164 0000193A 893E[6B20] mov [ComspOffset],di ; + 7165 0000193E 1F pop ds ; + ; + 7166 ;assume ds:nothing ; + 7167 0000193F 59 pop cx ; * ; + 7168 ; + 7169 00001940 5E pop si ; ** ; get new comspec location back + 7170 + 7171 ;; MSDOS 3.3 COMMAND.COM + 7172 ;;mov byte [CHUCKENV],0 ; If search specified -- no inheritance + 7173 ;;mov ax,PATHSTRING ; "PATH=" ; Figure environment pointer + 7174 ;;mov cl,4 + 7175 ;;shr ax,cl + 7176 ;;mov dx,ds + 7177 ;;add ax,dx + 7178 ;;mov [ENVIRSEG],ax + 7179 ;;mov es,ax + 7180 ;;;mov al,' ' + 7181 ;;mov al,[SPACE_CHR] + 7182 ;;mov [si-1],al + 7183 ;;pop si ; ** ; Remember location + 7184 ;;pop cx ; * ; and count + 7185 ;;;mov di,[ECOMLOC] + 7186 ;;mov di,[COMSPOFFSET] + 7187 + 7188 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7189 ;; 15/01/2023 + 7190 ;; MSDOS 5.0 COMMAND.COM + 7191 ;pop si ; ** + 7192 ;;mov di,14 + 7193 ;mov di,ECOMSPEC ; mov di,0Eh + 7194 + 7195 ComtrLoop: + 7196 ; MSDOS 3.3 & MSDOS 6.0 + 7197 00001941 AC lodsb + 7198 00001942 49 dec cx + 7199 ;;;;cmp al,' ' + 7200 ;;;cmp al,[space_chr] + 7201 ;;cmp al,[ss:Space] ; MSDOS 5.0 COMMAND.COM + 7202 ;cmp al,space_chr ; Retro DOS v4.0 (& v4.1) COMMAND.COM + 7203 ; 16/04/2023 + 7204 00001943 3C20 cmp al,20h ; ' ' ; space_chr + 7205 00001945 7416 je short SetComsr + 7206 ; MSDOS 3.3 + 7207 ;cmp al,9 + 7208 ;je short SetComsr + 7209 ; MSDOS 3.3 & MSDOS 6.0 + 7210 00001947 AA stosb + 7211 + 7212 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7213 %if 1 + 7214 ;ifdef DBCS + 7215 00001948 30E4 xor ah,ah + 7216 ;endif + 7217 %endif + 7218 0000194A E311 jcxz SetComsr + 7219 + 7220 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7221 %if 1 + 7222 ;ifdef DBCS + 7223 0000194C 1E push ds ; Make sure we have + 7224 0000194D 0E push cs ; local DS for + 7225 0000194E 1F pop ds ; ItestKanj + 7226 0000194F E82BFB call ITestKanj + 7227 00001952 1F pop ds ; restore parser ds + 7228 00001953 74EC jz short ComtrLoop + 7229 00001955 49 dec cx + 7230 00001956 A4 movsb + 7231 00001957 FEC4 inc ah + 7232 00001959 E302 jcxz SetComsr + 7233 ;endif + 7234 %endif + 7235 0000195B EBE4 jmp short ComtrLoop + 7236 + 7237 SetComsr: + 7238 ; 15/01/2023 + 7239 ; MSDOS 6.0 + 7240 0000195D 51 push cx ; ** + 7241 0000195E 0E push cs ; Get local segment + 7242 0000195F 1F pop ds ; + 7243 ;assume ds:ResGroup ; + 7244 00001960 1E push ds ; * + 7245 ;mov si,offset ResGroup:ComSpect + 7246 00001961 BE[2820] mov si,COMSPECT ; "\COMMAND.COM" + 7247 00001964 B90E00 mov cx,14 + 7248 00001967 268A45FF mov al,[es:di-1] + 7249 + 7250 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7251 %if 1 + 7252 ;ifdef DBCS + 7253 0000196B 08E4 or ah,ah + 7254 0000196D 7508 jnz short iNotRoot ; Last char was KANJI second byte, might be '\' + 7255 ;endif + 7256 %endif + 7257 0000196F 3A06[4F04] cmp al,[RDirChar] + 7258 00001973 7502 jne short iNotRoot + 7259 00001975 46 inc si ; Don't make a double / + 7260 00001976 49 dec cx + 7261 + 7262 ; MSDOS 3.37 + 7263 ;push si + 7264 ;push cx + 7265 ;push ds + 7266 ;mov si,COMSPECT ; "/COMMAND.COM" + 7267 ;mov cx,14 + 7268 ;mov al,[es:di-1] + 7269 ;call PATHCHRCMPR + 7270 ;jnz short INOTROOT + 7271 ;inc si ; Don't make a double / + 7272 ;dec cx + 7273 + 7274 iNotRoot: + 7275 ; MSDOS 3.3 & MSDOS 6.0 + 7276 00001977 F3A4 rep movsb + 7277 + 7278 ;;mov dx,[ECOMLOC] ; Now lets make sure its good! + 7279 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7280 ; MSDOS 6.0 + 7281 00001979 8B16[6B20] mov dx,[ComspOffset] ; [COMSPOFFSET] + 7282 ; 15/01/2023 + 7283 ;;mov dx,14 + 7284 ;mov dx,ECOMSPEC ; mov dx,0Eh ; MSDOS 5.0 COMMAND.COM + 7285 + 7286 0000197D 06 push es + 7287 0000197E 1F pop ds + 7288 ;;mov ax,OPEN shl 8 + 7289 ;mov ax,OPEN*256 ; 3D00h + 7290 0000197F B8003D mov ax,3D00h ; 15/01/2023 + 7291 00001982 CD21 int 21h ; Open COMMAND.COM + 7292 00001984 1F pop ds ; * + 7293 00001985 720E jc short SetComsrBad ; No COMMAND.COM here + 7294 00001987 89C3 mov bx,ax ; Handle + 7295 00001989 B43E mov ah,3Eh ; 15/01/2023 + 7296 ;mov ah,CLOSE ; 3Eh + 7297 0000198B CD21 int 21h ; Close COMMAND.COM + 7298 SetComsrRet: + 7299 ; 15/01/2023 + 7300 0000198D 59 pop cx ; ** + 7301 0000198E 5E pop si ; *** + 7302 + 7303 ; MSDOS 6.0 + 7304 0000198F 1F pop ds ; **** ; + 7305 ;assume ds:ResGroup ; + 7306 ; + 7307 00001990 0E push cs ; Make sure local ES is + 7308 00001991 07 pop es ; restored + 7309 00001992 E96FFD jmp Parse_command_line ; continue parsing command line + 7310 + 7311 ; MSDOS 3.3 + 7312 ;ARGSDONEJ2: + 7313 ;jcxz ARGSDONE + 7314 ;jmp CHKARG + 7315 + 7316 ; 16/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 7317 SetComsrBad: + 7318 ; MSDOS 3.3 & MSDOS 6.0 + 7319 ;mov dx,offset ResGroup:BadComlkMsg ; dx = ptr to msg + 7320 00001995 BA[FB21] mov dx,BADCOMLKMES + 7321 + 7322 ; Note: we're about to make a near call to TriageError, which + 7323 ; lives in a different segment and group. Some linkers will + 7324 ; generate a warning like "Possible fix-up overflow". We're + 7325 ; ok, though, because we all fit in 64 KB and, at init time, + 7326 ; we're still all together. + 7327 + 7328 ; 16/01/2023 + 7329 ;TRIAGEERROR equ TRANSTART+TriageError + 7330 ;(MSDOS 5.0 COMMAND.COM, 2320h+2D92h) + 7331 + 7332 ; 06/06/2023 + 7333 TRIAGEERROR equ TRANSTART+TriageError + 7334 ;(MSDOS 6.22 COMMAND.COM, 26E0h+333Ch) + 7335 + 7336 ;;;call 50B2h ; MSDOS 5.0 COMMAND.COM + 7337 ;;call 5A1Ch ; MSDOS 6.22 COMMAND.COM + 7338 ; 18/07/2024 + 7339 ;call 5A6Ch ; PCDOS 7.1 COMMAND.COM + 7340 00001998 E8(7D58) call TRIAGEERROR ; TRIAGEERROR procedure is at offset 354Eh + 7341 ; in original MSDOS 3.3 COMMAND.COM + 7342 + 7343 ; TriageError procedure is at offset 50B2h + 7344 ; in original MSDOS 5.0 COMMAND.COM + 7345 0000199B 83F841 cmp ax,65 + 7346 0000199E 7503 jne short doprt + 7347 ;mov dx,offset ResGroup:BadComaccMsg ; dx = ptr to msg + 7348 000019A0 BA[2422] mov dx,BADCOMACCMSG + 7349 doprt: + 7350 000019A3 E835FA call RPrint + 7351 ;mov si,offset ResGroup:ComSpect + 7352 000019A6 BE[2820] mov si,COMSPECT ; "\COMMAND.COM" + 7353 ;;mov di,[ECOMLOC] + 7354 ; 06/06/2023 + 7355 000019A9 8B3E[6B20] mov di,[ComspOffset] ; MSDOS 6.22 COMMAND.COM + 7356 ; 16/01/2023 + 7357 ;mov di,ECOMSPEC ; mov di,0Eh ; MSDOS 5.0 COMMAND.COM + 7358 000019AD B90E00 mov cx,14 + 7359 000019B0 F3A4 rep movsb ; get my default back + 7360 + 7361 000019B2 EBD9 jmp short SetComsrRet 7362 - 7363 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7364 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1A99h (CODERES:0C49h) - 7365 ArgsDone: - 7366 ; MSDOS 6.0 - 7367 000019B4 8E06[3A04] mov es,[EnvirSeg] ; get environment back - 7368 ;assume es:nothing ; - 7369 - 7370 ; MSDOS 3.3 & MSDOS 6.0 - 7371 000019B8 803E[A202]00 cmp byte [PermCom],0 - 7372 000019BD 742E jz short ComReturns - 7373 - 7374 000019BF 06 push es ; Save environment pointer - 7375 000019C0 B450 mov ah,50h - 7376 ;mov ah,SET_CURRENT_PDB ; 50h - 7377 000019C2 8CDB mov bx,ds - 7378 000019C4 8EC3 mov es,bx - 7379 000019C6 CD21 int 21h ; current process is me - 7380 000019C8 BF0A00 mov di,PDB.EXIT ; mov di,0Ah ; Diddle the addresses in my header - 7381 ;;mov ax,offset RESGROUP:LODCOM - 7382 ;mov ax,LODCOM - 7383 ; 16/01/2023 - 7384 000019CB B8[E000] mov ax,LodCom_Trap - 7385 000019CE AB stosw - 7386 000019CF 8CD8 mov ax,ds - 7387 000019D1 AB stosw - 7388 ;;mov ax,offset RESGROUP:CONTC - 7389 ;mov ax,CONTC - 7390 ; 16/01/2023 - 7391 000019D2 B8[AC00] mov ax,Ctrlc_Trap - 7392 000019D5 AB stosw - 7393 000019D6 8CD8 mov ax,ds - 7394 000019D8 AB stosw - 7395 ;;mov ax,offset DATARES:CritErr_Trap ; MSDOS 6.0 - 7396 ;mov ax,CRITERR - 7397 ; 16/01/2023 - 7398 000019D9 B8[B700] mov ax,CritErr_Trap - 7399 000019DC AB stosw - 7400 000019DD 8CD8 mov ax,ds - 7401 000019DF AB stosw - 7402 ;;mov word ptr ds:16h,ds - 7403 ;mov word ptr ds:[Pdb_Parent_Pid],ds ; Parent is me forever - 7404 000019E0 8C1E1600 mov [PDB.PARENT_PID],ds - 7405 ;;mov dx,offset RESGROUP:Int_2e - 7406 ;mov dx,Int_2e - 7407 ; 16/01/2023 - 7408 000019E4 BA[A100] mov dx,Int2e_Trap - 7409 000019E7 B82E25 mov ax,252Eh - 7410 ;;mov ax,(SET_INTERRUPT_VECTOR SHL 8) OR 2Eh - 7411 ;mov ax,(SET_INTERRUPT_VECTOR*256) | 2Eh ; 252Eh - 7412 000019EA CD21 int 21h ; DOS - SET INTERRUPT VECTOR - 7413 ; AL = interrupt number - 7414 ; DS:DX = new vector to be used for specified interrupt - 7415 000019EC 07 pop es ; Remember environment - 7416 - 7417 ComReturns: - 7418 ;mov ax,word ptr ds:Pdb_Parent_Pid - 7419 000019ED A11600 mov ax,[PDB.PARENT_PID] ; mov ax,ds:16h - 7420 ; 16/01/2023 - 7421 000019F0 A3[3E02] mov [Parent],ax ; Save parent - 7422 ;mov word ptr ds:Pdb_Parent_Pid,ds ; Parent is me - 7423 000019F3 8C1E1600 mov [PDB.PARENT_PID],ds ; mov word ptr ds:16h,ds - 7424 ;mov ax,word ptr ds:PDB_Jfn_Table - 7425 000019F7 A11800 mov ax,[PDB.JFN_TABLE] ; mov ax,ds:18h - 7426 000019FA A3[9F02] mov [Io_Save],ax ; Get the default stdin and out - 7427 000019FD 8C1E[3E04] mov [Com_Ptr+2],ds ; Set all these to resident - 7428 00001A01 8C1E[4204] mov [Com_Fcb1+2],ds - 7429 00001A05 8C1E[4604] mov [Com_Fcb2+2],ds - 7430 ;mov di,offset ResGroup:ComSpec - 7431 00001A09 BF[4B02] mov di,ComSpec - 7432 - 7433 ;;mov si,[ECOMLOC] - 7434 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM - 7435 00001A0C 8B36[6B20] mov si,[ComspOffset] - 7436 ; 16/01/2023 - MSDOS 5.0 COMMAND.COM - 7437 ;mov si,ECOMSPEC ; mov si,0Eh - 7438 - 7439 00001A10 803E[5420]00 cmp byte [AllocedEnv],0 ; MSDOS 6.0 - 7440 ;cmp byte [CHUCKENV],0 ; MSDOS 3.3 - 7441 - 7442 00001A15 8CD8 mov ax,ds ; Xchg es,ds - 7443 00001A17 06 push es - 7444 00001A18 1F pop ds - 7445 00001A19 8EC0 mov es,ax - 7446 - 7447 ; 06/06/2023 - 7448 00001A1B 7517 jne short CopyComsp ; MSDOS 6.0 - 7449 ; 16/01/2023 - 7450 ;je short CopyComsp ; MSDOS 5.0 - 7451 ;;je short COPYCOMSP ; MSDOS 3.3 ; All set up for copy - 7452 - 7453 00001A1D 0E push cs - 7454 00001A1E 1F pop ds + 7363 ; 16/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 7364 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1927h (CODERES:0BE7h) + 7365 + 7366 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7367 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1A99h (CODERES:0C49h) + 7368 ArgsDone: + 7369 ; MSDOS 6.0 + 7370 000019B4 8E06[3A04] mov es,[EnvirSeg] ; get environment back + 7371 ;assume es:nothing ; + 7372 + 7373 ; MSDOS 3.3 & MSDOS 6.0 + 7374 000019B8 803E[A202]00 cmp byte [PermCom],0 + 7375 000019BD 742E jz short ComReturns + 7376 + 7377 000019BF 06 push es ; Save environment pointer + 7378 000019C0 B450 mov ah,50h + 7379 ;mov ah,SET_CURRENT_PDB ; 50h + 7380 000019C2 8CDB mov bx,ds + 7381 000019C4 8EC3 mov es,bx + 7382 000019C6 CD21 int 21h ; current process is me + 7383 000019C8 BF0A00 mov di,PDB.EXIT ; mov di,0Ah ; Diddle the addresses in my header + 7384 ;;mov ax,offset RESGROUP:LODCOM + 7385 ;mov ax,LODCOM + 7386 ; 16/01/2023 + 7387 000019CB B8[E000] mov ax,LodCom_Trap + 7388 000019CE AB stosw + 7389 000019CF 8CD8 mov ax,ds + 7390 000019D1 AB stosw + 7391 ;;mov ax,offset RESGROUP:CONTC + 7392 ;mov ax,CONTC + 7393 ; 16/01/2023 + 7394 000019D2 B8[AC00] mov ax,Ctrlc_Trap + 7395 000019D5 AB stosw + 7396 000019D6 8CD8 mov ax,ds + 7397 000019D8 AB stosw + 7398 ;;mov ax,offset DATARES:CritErr_Trap ; MSDOS 6.0 + 7399 ;mov ax,CRITERR + 7400 ; 16/01/2023 + 7401 000019D9 B8[B700] mov ax,CritErr_Trap + 7402 000019DC AB stosw + 7403 000019DD 8CD8 mov ax,ds + 7404 000019DF AB stosw + 7405 ;;mov word ptr ds:16h,ds + 7406 ;mov word ptr ds:[Pdb_Parent_Pid],ds ; Parent is me forever + 7407 000019E0 8C1E1600 mov [PDB.PARENT_PID],ds + 7408 ;;mov dx,offset RESGROUP:Int_2e + 7409 ;mov dx,Int_2e + 7410 ; 16/01/2023 + 7411 000019E4 BA[A100] mov dx,Int2e_Trap + 7412 000019E7 B82E25 mov ax,252Eh + 7413 ;;mov ax,(SET_INTERRUPT_VECTOR SHL 8) OR 2Eh + 7414 ;mov ax,(SET_INTERRUPT_VECTOR*256) | 2Eh ; 252Eh + 7415 000019EA CD21 int 21h ; DOS - SET INTERRUPT VECTOR + 7416 ; AL = interrupt number + 7417 ; DS:DX = new vector to be used for specified interrupt + 7418 000019EC 07 pop es ; Remember environment + 7419 + 7420 ComReturns: + 7421 ;mov ax,word ptr ds:Pdb_Parent_Pid + 7422 000019ED A11600 mov ax,[PDB.PARENT_PID] ; mov ax,ds:16h + 7423 ; 16/01/2023 + 7424 000019F0 A3[3E02] mov [Parent],ax ; Save parent + 7425 ;mov word ptr ds:Pdb_Parent_Pid,ds ; Parent is me + 7426 000019F3 8C1E1600 mov [PDB.PARENT_PID],ds ; mov word ptr ds:16h,ds + 7427 ;mov ax,word ptr ds:PDB_Jfn_Table + 7428 000019F7 A11800 mov ax,[PDB.JFN_TABLE] ; mov ax,ds:18h + 7429 000019FA A3[9F02] mov [Io_Save],ax ; Get the default stdin and out + 7430 000019FD 8C1E[3E04] mov [Com_Ptr+2],ds ; Set all these to resident + 7431 00001A01 8C1E[4204] mov [Com_Fcb1+2],ds + 7432 00001A05 8C1E[4604] mov [Com_Fcb2+2],ds + 7433 ;mov di,offset ResGroup:ComSpec + 7434 00001A09 BF[4B02] mov di,ComSpec + 7435 + 7436 ;;mov si,[ECOMLOC] + 7437 ; 06/06/2023 - MSDOS 6.22 COMMAND.COM + 7438 00001A0C 8B36[6B20] mov si,[ComspOffset] + 7439 ; 16/01/2023 - MSDOS 5.0 COMMAND.COM + 7440 ;mov si,ECOMSPEC ; mov si,0Eh + 7441 + 7442 00001A10 803E[5420]00 cmp byte [AllocedEnv],0 ; MSDOS 6.0 + 7443 ;cmp byte [CHUCKENV],0 ; MSDOS 3.3 + 7444 + 7445 00001A15 8CD8 mov ax,ds ; Xchg es,ds + 7446 00001A17 06 push es + 7447 00001A18 1F pop ds + 7448 00001A19 8EC0 mov es,ax + 7449 + 7450 ; 06/06/2023 + 7451 00001A1B 7517 jne short CopyComsp ; MSDOS 6.0 + 7452 ; 16/01/2023 + 7453 ;je short CopyComsp ; MSDOS 5.0 + 7454 ;;je short COPYCOMSP ; MSDOS 3.3 ; All set up for copy 7455 - 7456 ;mov si,offset ResGroup:ComspString - 7457 00001A1F BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" - 7458 00001A22 06 push es - 7459 00001A23 57 push di - 7460 00001A24 E89A02 call IfindE - 7461 00001A27 89FE mov si,di - 7462 00001A29 06 push es - 7463 00001A2A 1F pop ds - 7464 00001A2B 5F pop di - 7465 00001A2C 07 pop es - 7466 00001A2D 7305 jnc short CopyComsp - 7467 - 7468 ; 06/06/2023 - 7469 ; MSDOS 6.0 - 7470 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1B04h - 7471 ComSpecNofnd: - 7472 ;;mov si,offset ResGroup:ComspString - 7473 ;mov si,ComspString ; "COMSPEC=\COMMAND.COM" - 7474 ;add si,ComspStrLen ; add si,8 - 7475 00001A2F BE[7520] mov si,ComspString+ComspStrLen - 7476 - 7477 ;; 21/01/2023 - 7478 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:19A1h - 7479 ;;mov si,0Eh - 7480 ;mov si,ECOMSPEC - 7481 - 7482 00001A32 0E push cs - 7483 00001A33 1F pop ds - 7484 - 7485 ; 21/01/2023 - 7486 ;COMSPECNOFND: - 7487 ; MSDOS 3.3 - 7488 ;;mov si,[es:ECOMLOC] - 7489 ;mov si,[es:COMSPOFFSET] - 7490 ;;add si,offset RESGROUP:PATHSTRING - 7491 ;add si,PATHSTRING ; "PATH=" - 7492 ;push cs - 7493 ;pop ds - 7494 - 7495 CopyComsp: - 7496 ; 21/01/2023 - 7497 ;COPYCOMSP: - 7498 ; MSDOS 3.3 & MSDOS 6.0 - 7499 ;;mov es:PutBackComSpec.SubstPtr,di - 7500 ;mov [es:PUTBACKSUBSTPTR],di ; Save ptr to beginning of comspec path - 7501 00001A34 26893E[2A02] mov [es:PutBackComSpec],di - 7502 00001A39 807C013A cmp byte [si+1],':' ; Is there a drive specifier in comspec - 7503 00001A3D 7506 jne short CopyComspLoop ; If not, do not skip over first 2 bytes - 7504 ;;add es:PutBackComSpec.SubstPtr,2 - 7505 ;add word [es:PUTBACKSUBSTPTR],2 - 7506 00001A3F 268306[2A02]02 add word [es:PutBackComSpec],2 - 7507 CopyComspLoop: - 7508 00001A45 AC lodsb - 7509 00001A46 AA stosb - 7510 00001A47 08C0 or al,al - 7511 00001A49 75FA jnz short CopyComspLoop - 7512 - 7513 00001A4B 26893E[8B02] mov [es:ComSpec_End],di ; Save ptr to end of comspec path - 7514 00001A50 26FF0E[8B02] dec word [es:ComSpec_End] - 7515 00001A55 268A26[9402] mov ah,[es:ComDrv] - 7516 00001A5A 80C440 add ah,'A'-1 ; 40h - 7517 00001A5D 268826[2F02] mov [es:PutBackDrv],ah ; save drive letter - 7518 - 7519 ; 21/01/2023 - Retrro DOS v4.0 (& v4.1) COMMAND.COM - 7520 - 7521 ; MSDOS 6.0 - 7522 00001A62 E8E702 call setup_for_messages ; set up parse and extended error messages - 7523 - 7524 ; The routine below sets up the exact resident size of COMMAND. If this is not - 7525 ; the first COMMAND, then the resident code is not duplicated and the resident - 7526 ; size is just the data. If we are the first COMMAND, it checks if we are to - 7527 ; be loaded into HIMEM. If not, then the resident size includes the code and - 7528 ; the data otherwise it is just the data. - 7529 - 7530 00001A65 E88603 call Setup_res_end ; put resident size in ResSize - 7531 - 7532 00001A68 0E push cs - 7533 00001A69 1F pop ds - 7534 ;assume ds:RESGROUP - 7535 - 7536 ;Public EnvMaximum - 7537 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 7538 EnvMaximum: ; MSDOS 5.0 COMMAND.COM - RESGROUP:19DCh - 7539 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM - 7540 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1B53h - 7541 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 7542 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1B53h - 7543 - 7544 ; 21/01/2023 - 7545 ; MSDOS 6.0 - 7546 ;;mov si,offset RESGROUP:TranStart - 7547 ;;mov si,2320h ; MSDOS 5.0 COMMAND.COM - 7548 ; 06/06/2023 - 7549 ;;mov si,26E0h ; MSDOS 6.22 COMMAND.COM - 7550 ;mov si,TRANSTART - 7551 ;add si,100h - 7552 ; 23/04/2023 - 7553 00001A6A BED028 mov si,TRANSTART+100h - 7554 - 7555 ;;mov cx,offset TRANGROUP:TranDataEnd - 100H - 7556 ;;mov cx,87C2h ; MSDOS 5.0 COMMAND.COM - 7557 ; 06/06/2023 - 7558 ;;mov cx,9D53h ; MSDOS 6.22 COMMAND.COM - 7559 ; 18/07/2024 - 7560 ;mov cx,9B47h ; PCDOS 7.1 COMMAND.COM - 7561 00001A6D B9[B896] mov cx,TRANDATAEND-100h - 7562 - 7563 00001A70 FC cld - 7564 00001A71 D1E9 shr cx,1 - 7565 00001A73 31D2 xor dx,dx - 7566 Ichksum: - 7567 00001A75 AD lodsw - 7568 00001A76 01C2 add dx,ax - 7569 00001A78 83D200 adc dx,0 - 7570 00001A7B E2F8 loop Ichksum - 7571 - 7572 00001A7D 8916[9702] mov [Sum],dx ; store checksum - 7573 - 7574 00001A81 803E[4720]00 cmp byte [PRDATTM],0 - 7575 00001A86 750C jne short NoBatchSeg ; don't do autoexec or date time - 7576 - 7577 ; Allocate batch segment for d:/autoexec.bat + no arguments - 7578 - 7579 ;mov bx,((SIZE BatchSegment) + 15 + 1 + 0fh)/16 - 7580 ; 21/01/2023 - 7581 ;mov bx,4 - 7582 00001A88 BB0400 mov bx,((BATCHSEGMENT.SIZE)+16+0Fh)/16 ; (33+16+15)/16 - 7583 00001A8B B448 mov ah,48h - 7584 ;mov ah,ALLOC ; - 7585 00001A8D CD21 int 21h ; - 7586 00001A8F 7203 jc short NoBatchSeg ; didn't allocate - pretend no batch - 7587 00001A91 A3[4902] mov [Batch],ax ; save batch segment - 7588 - 7589 NoBatchSeg: - 7590 ; 21/01/2023 - 7591 ; MSDOS 6.0 (& MSDOS 5.0) - 7592 00001A94 8B1E[3A04] mov bx,[EnvirSeg] ; get old environment segment - 7593 00001A98 891E[8620] mov [OldEnv],bx ; save it - 7594 00001A9C C706[8820]0000 mov word [UsedEnv],0 ; initialize env size counter - 7595 00001AA2 8EDB mov ds,bx - 7596 ;assume ds:nothing - 7597 - 7598 00001AA4 31F6 xor si,si - 7599 00001AA6 89F7 mov di,si - 7600 - 7601 ; This is the maximum allowed size for the environment - 7602 - 7603 ; 21/01/2023 - 7604 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1A1Eh - 7605 ;mov bx,4096 - 1 ; 0FFFh ; max. allowed env. size - 7606 ;;mov [ss:EnvMax],bx - 7607 ;shl bx,1 - 7608 ;shl bx,1 - 7609 ;shl bx,1 + 7456 00001A1D 0E push cs + 7457 00001A1E 1F pop ds + 7458 + 7459 ;mov si,offset ResGroup:ComspString + 7460 00001A1F BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" + 7461 00001A22 06 push es + 7462 00001A23 57 push di + 7463 00001A24 E89A02 call IfindE + 7464 00001A27 89FE mov si,di + 7465 00001A29 06 push es + 7466 00001A2A 1F pop ds + 7467 00001A2B 5F pop di + 7468 00001A2C 07 pop es + 7469 00001A2D 7305 jnc short CopyComsp + 7470 + 7471 ; 06/06/2023 + 7472 ; MSDOS 6.0 + 7473 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1B04h + 7474 ComSpecNofnd: + 7475 ;;mov si,offset ResGroup:ComspString + 7476 ;mov si,ComspString ; "COMSPEC=\COMMAND.COM" + 7477 ;add si,ComspStrLen ; add si,8 + 7478 00001A2F BE[7520] mov si,ComspString+ComspStrLen + 7479 + 7480 ;; 21/01/2023 + 7481 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:19A1h + 7482 ;;mov si,0Eh + 7483 ;mov si,ECOMSPEC + 7484 + 7485 00001A32 0E push cs + 7486 00001A33 1F pop ds + 7487 + 7488 ; 21/01/2023 + 7489 ;COMSPECNOFND: + 7490 ; MSDOS 3.3 + 7491 ;;mov si,[es:ECOMLOC] + 7492 ;mov si,[es:COMSPOFFSET] + 7493 ;;add si,offset RESGROUP:PATHSTRING + 7494 ;add si,PATHSTRING ; "PATH=" + 7495 ;push cs + 7496 ;pop ds + 7497 + 7498 CopyComsp: + 7499 ; 21/01/2023 + 7500 ;COPYCOMSP: + 7501 ; MSDOS 3.3 & MSDOS 6.0 + 7502 ;;mov es:PutBackComSpec.SubstPtr,di + 7503 ;mov [es:PUTBACKSUBSTPTR],di ; Save ptr to beginning of comspec path + 7504 00001A34 26893E[2A02] mov [es:PutBackComSpec],di + 7505 00001A39 807C013A cmp byte [si+1],':' ; Is there a drive specifier in comspec + 7506 00001A3D 7506 jne short CopyComspLoop ; If not, do not skip over first 2 bytes + 7507 ;;add es:PutBackComSpec.SubstPtr,2 + 7508 ;add word [es:PUTBACKSUBSTPTR],2 + 7509 00001A3F 268306[2A02]02 add word [es:PutBackComSpec],2 + 7510 CopyComspLoop: + 7511 00001A45 AC lodsb + 7512 00001A46 AA stosb + 7513 00001A47 08C0 or al,al + 7514 00001A49 75FA jnz short CopyComspLoop + 7515 + 7516 00001A4B 26893E[8B02] mov [es:ComSpec_End],di ; Save ptr to end of comspec path + 7517 00001A50 26FF0E[8B02] dec word [es:ComSpec_End] + 7518 00001A55 268A26[9402] mov ah,[es:ComDrv] + 7519 00001A5A 80C440 add ah,'A'-1 ; 40h + 7520 00001A5D 268826[2F02] mov [es:PutBackDrv],ah ; save drive letter + 7521 + 7522 ; 21/01/2023 - Retrro DOS v4.0 (& v4.1) COMMAND.COM + 7523 + 7524 ; MSDOS 6.0 + 7525 00001A62 E8E702 call setup_for_messages ; set up parse and extended error messages + 7526 + 7527 ; The routine below sets up the exact resident size of COMMAND. If this is not + 7528 ; the first COMMAND, then the resident code is not duplicated and the resident + 7529 ; size is just the data. If we are the first COMMAND, it checks if we are to + 7530 ; be loaded into HIMEM. If not, then the resident size includes the code and + 7531 ; the data otherwise it is just the data. + 7532 + 7533 00001A65 E88603 call Setup_res_end ; put resident size in ResSize + 7534 + 7535 00001A68 0E push cs + 7536 00001A69 1F pop ds + 7537 ;assume ds:RESGROUP + 7538 + 7539 ;Public EnvMaximum + 7540 ; 14/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 7541 EnvMaximum: ; MSDOS 5.0 COMMAND.COM - RESGROUP:19DCh + 7542 ; 06/06/2023 - Retro DOS v4.2 COMMAND.COM + 7543 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1B53h + 7544 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 7545 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1B53h + 7546 + 7547 ; 21/01/2023 + 7548 ; MSDOS 6.0 + 7549 ;;mov si,offset RESGROUP:TranStart + 7550 ;;mov si,2320h ; MSDOS 5.0 COMMAND.COM + 7551 ; 06/06/2023 + 7552 ;;mov si,26E0h ; MSDOS 6.22 COMMAND.COM + 7553 ;mov si,TRANSTART + 7554 ;add si,100h + 7555 ; 23/04/2023 + 7556 00001A6A BED028 mov si,TRANSTART+100h + 7557 + 7558 ;;mov cx,offset TRANGROUP:TranDataEnd - 100H + 7559 ;;mov cx,87C2h ; MSDOS 5.0 COMMAND.COM + 7560 ; 06/06/2023 + 7561 ;;mov cx,9D53h ; MSDOS 6.22 COMMAND.COM + 7562 ; 18/07/2024 + 7563 ;mov cx,9B47h ; PCDOS 7.1 COMMAND.COM + 7564 00001A6D B9[B896] mov cx,TRANDATAEND-100h + 7565 + 7566 00001A70 FC cld + 7567 00001A71 D1E9 shr cx,1 + 7568 00001A73 31D2 xor dx,dx + 7569 Ichksum: + 7570 00001A75 AD lodsw + 7571 00001A76 01C2 add dx,ax + 7572 00001A78 83D200 adc dx,0 + 7573 00001A7B E2F8 loop Ichksum + 7574 + 7575 00001A7D 8916[9702] mov [Sum],dx ; store checksum + 7576 + 7577 00001A81 803E[4720]00 cmp byte [PRDATTM],0 + 7578 00001A86 750C jne short NoBatchSeg ; don't do autoexec or date time + 7579 + 7580 ; Allocate batch segment for d:/autoexec.bat + no arguments + 7581 + 7582 ;mov bx,((SIZE BatchSegment) + 15 + 1 + 0fh)/16 + 7583 ; 21/01/2023 + 7584 ;mov bx,4 + 7585 00001A88 BB0400 mov bx,((BATCHSEGMENT.SIZE)+16+0Fh)/16 ; (33+16+15)/16 + 7586 00001A8B B448 mov ah,48h + 7587 ;mov ah,ALLOC ; + 7588 00001A8D CD21 int 21h ; + 7589 00001A8F 7203 jc short NoBatchSeg ; didn't allocate - pretend no batch + 7590 00001A91 A3[4902] mov [Batch],ax ; save batch segment + 7591 + 7592 NoBatchSeg: + 7593 ; 21/01/2023 + 7594 ; MSDOS 6.0 (& MSDOS 5.0) + 7595 00001A94 8B1E[3A04] mov bx,[EnvirSeg] ; get old environment segment + 7596 00001A98 891E[8620] mov [OldEnv],bx ; save it + 7597 00001A9C C706[8820]0000 mov word [UsedEnv],0 ; initialize env size counter + 7598 00001AA2 8EDB mov ds,bx + 7599 ;assume ds:nothing + 7600 + 7601 00001AA4 31F6 xor si,si + 7602 00001AA6 89F7 mov di,si + 7603 + 7604 ; This is the maximum allowed size for the environment + 7605 + 7606 ; 21/01/2023 + 7607 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1A1Eh + 7608 ;mov bx,4096 - 1 ; 0FFFh ; max. allowed env. size + 7609 ;;mov [ss:EnvMax],bx 7610 ;shl bx,1 - 7611 00001AA8 BBF0FF mov bx,(4096-1)<<4 ; mov bx,0FFF0h - 7612 00001AAB 36891E[8420] mov [ss:EnvMax], bx ; convert envmax to bytes - 7613 00001AB0 4B dec bx ; dec by one to leave room for double 0 - 7614 00001AB1 31D2 xor dx,dx ; use dx to indicate that there was - 7615 ; no environment size error. - 7616 ;public NxtStr - 7617 NxtStr: - 7618 00001AB3 E8E101 call GetStrLen ; get the size of the current env string - 7619 - 7620 ;Bugbug: Can use ss here to address UsedEnv - 7621 - 7622 00001AB6 1E push ds ; get addressability to environment - 7623 00001AB7 0E push cs ; counter - 7624 00001AB8 1F pop ds ; - 7625 ;assume ds:ResGroup - 7626 00001AB9 010E[8820] add [UsedEnv],cx ; add the string length to env size - 7627 00001ABD 1F pop ds ; - 7628 ;assume ds:nothing - 7629 - 7630 00001ABE 83F901 cmp cx,1 ; end of environment was encountered. - 7631 00001AC1 7405 je short EnvExit - 7632 00001AC3 29CB sub bx,cx - 7633 ;jae short OkCpyStr ; can't fit in all of enviroment. - 7634 ; 21/01/2023 - 7635 00001AC5 73EC jae short NxtStr - 7636 00001AC7 42 inc dx ; out of env space msg must be displayed - 7637 ;jmp short EnvExit - 7638 - 7639 ;OkCpyStr: - 7640 ;jmp short NxtStr + 7611 ;shl bx,1 + 7612 ;shl bx,1 + 7613 ;shl bx,1 + 7614 00001AA8 BBF0FF mov bx,(4096-1)<<4 ; mov bx,0FFF0h + 7615 00001AAB 36891E[8420] mov [ss:EnvMax], bx ; convert envmax to bytes + 7616 00001AB0 4B dec bx ; dec by one to leave room for double 0 + 7617 00001AB1 31D2 xor dx,dx ; use dx to indicate that there was + 7618 ; no environment size error. + 7619 ;public NxtStr + 7620 NxtStr: + 7621 00001AB3 E8E101 call GetStrLen ; get the size of the current env string + 7622 + 7623 ;Bugbug: Can use ss here to address UsedEnv + 7624 + 7625 00001AB6 1E push ds ; get addressability to environment + 7626 00001AB7 0E push cs ; counter + 7627 00001AB8 1F pop ds ; + 7628 ;assume ds:ResGroup + 7629 00001AB9 010E[8820] add [UsedEnv],cx ; add the string length to env size + 7630 00001ABD 1F pop ds ; + 7631 ;assume ds:nothing + 7632 + 7633 00001ABE 83F901 cmp cx,1 ; end of environment was encountered. + 7634 00001AC1 7405 je short EnvExit + 7635 00001AC3 29CB sub bx,cx + 7636 ;jae short OkCpyStr ; can't fit in all of enviroment. + 7637 ; 21/01/2023 + 7638 00001AC5 73EC jae short NxtStr + 7639 00001AC7 42 inc dx ; out of env space msg must be displayed + 7640 ;jmp short EnvExit 7641 - 7642 EnvExit: - 7643 00001AC8 0E push cs - 7644 00001AC9 1F pop ds - 7645 ;assume ds:ResGroup - 7646 00001ACA 09D2 or dx,dx ; dx will be non-zero if error - 7647 00001ACC 7406 jz short EnvNoErr - 7648 ;mov dx,offset ResGroup:OutEnvMsg ; dx = ptr to msg - 7649 00001ACE BA[7B21] mov dx,OUTENVMSG - 7650 00001AD1 E807F9 call RPrint - 7651 EnvNoErr: - 7652 00001AD4 A1[8220] mov ax,[EnvSiz] ; env size previously set - 7653 00001AD7 B104 mov cl,4 - 7654 00001AD9 D3E0 shl ax,cl ; get size in bytes - 7655 00001ADB 3B06[8820] cmp ax,[UsedEnv] ; is it a new env? - 7656 00001ADF 7706 ja short st_envsize ; yes, store the size - 7657 00001AE1 A1[8820] mov ax,[UsedEnv] - 7658 00001AE4 83C00F add ax,15 ; round up - 7659 st_envsize: - 7660 00001AE7 D3E8 shr ax,cl - 7661 00001AE9 A3[8220] mov [EnvSiz],ax ; store env size needed(paras) - 7662 - 7663 ;if MSVER - 7664 ;cmp SingleCom,0 - 7665 ;jnz nophead ; don't print header if SingleCom - 7666 ;mov dx,offset ResGroup:CopyrightMsg ; dx = ptr to msg - 7667 ;call RPrint - 7668 ;nophead: - 7669 ;endif - 7670 ; 21/01/2023 - 7671 - 7672 ; MSDOS 3.3 & 6.0 - 7673 00001AEC 833E[4902]00 cmp word [Batch],0 ; did we set up a batch segment? - 7674 00001AF1 7503 jnz short DoDate ; yes - go initialize it - 7675 00001AF3 E99300 jmp NoDttm ; don't do autoexec or date time - 7676 - 7677 DoDate: - 7678 - 7679 ; allocate batch segment for d:/autoexec.bat + no arguments - 7680 - 7681 00001AF6 A1[4902] mov ax,[Batch] ; get batch segment - 7682 00001AF9 C606[9D02]03 mov byte [EchoFlag],3 ; set batch echo - 7683 00001AFE C706[AE02]0100 mov word [Nest],1 ; set nest flag to 1 batch - 7684 00001B04 8EC0 mov es,ax - 7685 - 7686 ; initialize the segment - 7687 - 7688 00001B06 31FF xor di,di - 7689 ;;mov al,0 - 7690 ;mov al,BATCHTYPE ; 0 - 7691 ; 06/06/2023 - 7692 00001B08 31C0 xor ax,ax - 7693 00001B0A AA stosb - 7694 ;mov al,1 ; initialize echo for batch exit - 7695 ;inc al - 7696 ; 22/07/2024 - 7697 00001B0B 40 inc ax - 7698 00001B0C AA stosb - 7699 - 7700 ; Hosebag! This guy does not use the struct fields to init the BatchSegment - 7701 - 7702 ;xor ax,ax ; initialize to zero - 7703 ; 06/06/2023 - 7704 ;dec al ; ax = 0 - 7705 ; 22/07/2024 - 7706 00001B0D 48 dec ax - 7707 - 7708 ; 21/01/2023 - 7709 00001B0E AA stosb ; MSDOS 6.0 ; clear out BatchEOF + 7642 ;OkCpyStr: + 7643 ;jmp short NxtStr + 7644 + 7645 EnvExit: + 7646 00001AC8 0E push cs + 7647 00001AC9 1F pop ds + 7648 ;assume ds:ResGroup + 7649 00001ACA 09D2 or dx,dx ; dx will be non-zero if error + 7650 00001ACC 7406 jz short EnvNoErr + 7651 ;mov dx,offset ResGroup:OutEnvMsg ; dx = ptr to msg + 7652 00001ACE BA[7B21] mov dx,OUTENVMSG + 7653 00001AD1 E807F9 call RPrint + 7654 EnvNoErr: + 7655 00001AD4 A1[8220] mov ax,[EnvSiz] ; env size previously set + 7656 00001AD7 B104 mov cl,4 + 7657 00001AD9 D3E0 shl ax,cl ; get size in bytes + 7658 00001ADB 3B06[8820] cmp ax,[UsedEnv] ; is it a new env? + 7659 00001ADF 7706 ja short st_envsize ; yes, store the size + 7660 00001AE1 A1[8820] mov ax,[UsedEnv] + 7661 00001AE4 83C00F add ax,15 ; round up + 7662 st_envsize: + 7663 00001AE7 D3E8 shr ax,cl + 7664 00001AE9 A3[8220] mov [EnvSiz],ax ; store env size needed(paras) + 7665 + 7666 ;if MSVER + 7667 ;cmp SingleCom,0 + 7668 ;jnz nophead ; don't print header if SingleCom + 7669 ;mov dx,offset ResGroup:CopyrightMsg ; dx = ptr to msg + 7670 ;call RPrint + 7671 ;nophead: + 7672 ;endif + 7673 ; 21/01/2023 + 7674 + 7675 ; MSDOS 3.3 & 6.0 + 7676 00001AEC 833E[4902]00 cmp word [Batch],0 ; did we set up a batch segment? + 7677 00001AF1 7503 jnz short DoDate ; yes - go initialize it + 7678 00001AF3 E99300 jmp NoDttm ; don't do autoexec or date time + 7679 + 7680 DoDate: + 7681 + 7682 ; allocate batch segment for d:/autoexec.bat + no arguments + 7683 + 7684 00001AF6 A1[4902] mov ax,[Batch] ; get batch segment + 7685 00001AF9 C606[9D02]03 mov byte [EchoFlag],3 ; set batch echo + 7686 00001AFE C706[AE02]0100 mov word [Nest],1 ; set nest flag to 1 batch + 7687 00001B04 8EC0 mov es,ax + 7688 + 7689 ; initialize the segment + 7690 + 7691 00001B06 31FF xor di,di + 7692 ;;mov al,0 + 7693 ;mov al,BATCHTYPE ; 0 + 7694 ; 06/06/2023 + 7695 00001B08 31C0 xor ax,ax + 7696 00001B0A AA stosb + 7697 ;mov al,1 ; initialize echo for batch exit + 7698 ;inc al + 7699 ; 22/07/2024 + 7700 00001B0B 40 inc ax + 7701 00001B0C AA stosb + 7702 + 7703 ; Hosebag! This guy does not use the struct fields to init the BatchSegment + 7704 + 7705 ;xor ax,ax ; initialize to zero + 7706 ; 06/06/2023 + 7707 ;dec al ; ax = 0 + 7708 ; 22/07/2024 + 7709 00001B0D 48 dec ax 7710 - 7711 00001B0F AB stosw ; batch segment of last job - batlast - 7712 00001B10 AB stosw ; segment for FOR - 7713 00001B11 AA stosb ; FOR flag - 7714 00001B12 AB stosw ; position in file - batseek - 7715 00001B13 AB stosw - 7716 - 7717 ; clean out the parameters - 7718 - 7719 ;mov ax,-1 ; initialize to no parameters - 7720 ; 06/06/2023 - 7721 00001B14 48 dec ax ; ax = -1 - 7722 - 7723 00001B15 B90A00 mov cx,10 - 7724 00001B18 F3AB rep stosw + 7711 ; 21/01/2023 + 7712 00001B0E AA stosb ; MSDOS 6.0 ; clear out BatchEOF + 7713 + 7714 00001B0F AB stosw ; batch segment of last job - batlast + 7715 00001B10 AB stosw ; segment for FOR + 7716 00001B11 AA stosb ; FOR flag + 7717 00001B12 AB stosw ; position in file - batseek + 7718 00001B13 AB stosw + 7719 + 7720 ; clean out the parameters + 7721 + 7722 ;mov ax,-1 ; initialize to no parameters + 7723 ; 06/06/2023 + 7724 00001B14 48 dec ax ; ax = -1 7725 - 7726 ; decide whether we should grab the default drive - 7727 - 7728 00001B1A 803E[3620]00 cmp byte [AUTOBAT],0 ; ":\AUTOEXEC.BAT" - 7729 00001B1F 7509 jne short NoAutSet - 7730 00001B21 B419 mov ah,19h ; 21/01/2023 - 7731 ;mov ah,GET_DEFAULT_DRIVE ; 19h - 7732 00001B23 CD21 int 21h - 7733 ;;add al,'A' - 7734 ;add al,[letter_A] ; Ucasea - 7735 ;add al,[ucasea] ; 21/01/2023 - 7736 ; 21/01/2023 - 7737 00001B25 0441 add al,'A' - 7738 00001B27 A2[3620] mov [AUTOBAT],al - 7739 - 7740 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7741 %if 0 - 7742 ; 21/01/2023 - 7743 ; 06/06/2023 - 7744 mov [KAUTOBAT],al - 7745 %endif - 7746 - 7747 NoAutSet: - 7748 - 7749 ; copy in the batch file name (including nul) - 7750 - 7751 ;mov si,offset ResGroup:AutoBat - 7752 00001B2A BE[3620] mov si,AUTOBAT - 7753 00001B2D B90800 mov cx,8 - 7754 00001B30 F3A5 rep movsw - 7755 ; 23/04/2023 - 7756 00001B32 A4 movsb ; MSDOS 6.0 ; move in carriage return to terminate string - 7757 - 7758 ;mov dx,offset ResGroup:AutoBat - 7759 00001B33 BA[3620] mov dx,AUTOBAT ; ":\AUTOEXEC.BAT" + 7726 00001B15 B90A00 mov cx,10 + 7727 00001B18 F3AB rep stosw + 7728 + 7729 ; decide whether we should grab the default drive + 7730 + 7731 00001B1A 803E[3620]00 cmp byte [AUTOBAT],0 ; ":\AUTOEXEC.BAT" + 7732 00001B1F 7509 jne short NoAutSet + 7733 00001B21 B419 mov ah,19h ; 21/01/2023 + 7734 ;mov ah,GET_DEFAULT_DRIVE ; 19h + 7735 00001B23 CD21 int 21h + 7736 ;;add al,'A' + 7737 ;add al,[letter_A] ; Ucasea + 7738 ;add al,[ucasea] ; 21/01/2023 + 7739 ; 21/01/2023 + 7740 00001B25 0441 add al,'A' + 7741 00001B27 A2[3620] mov [AUTOBAT],al + 7742 + 7743 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7744 %if 0 + 7745 ; 21/01/2023 + 7746 ; 06/06/2023 + 7747 mov [KAUTOBAT],al + 7748 %endif + 7749 + 7750 NoAutSet: + 7751 + 7752 ; copy in the batch file name (including nul) + 7753 + 7754 ;mov si,offset ResGroup:AutoBat + 7755 00001B2A BE[3620] mov si,AUTOBAT + 7756 00001B2D B90800 mov cx,8 + 7757 00001B30 F3A5 rep movsw + 7758 ; 23/04/2023 + 7759 00001B32 A4 movsb ; MSDOS 6.0 ; move in carriage return to terminate string 7760 - 7761 ;;mov ax,OPEN shl 8 - 7762 00001B36 B8003D mov ax,3D00h ; 21/01/2023 - 7763 ;mov ax,OPEN*256 ; 3D00h ; open for read - 7764 00001B39 CD21 int 21h ; see if autoexec.bat exists - 7765 00001B3B 7208 jc short noabat - 7766 00001B3D 89C3 mov bx,ax - 7767 00001B3F B43E mov ah,3Eh ; 21/01/2023 - 7768 ;mov ah,CLOSE ; 3Eh - 7769 00001B41 CD21 int 21h - 7770 ;jmp Drv0 ; go process autoexec - 7771 ; 22/07/2024 - 7772 00001B43 EB51 jmp short Drv0 - 7773 - 7774 noabat: - 7775 00001B45 50 push ax - 7776 00001B46 E85701 call Setup_Seg - 7777 00001B49 A3[5220] mov [triage_add+2],ax - 7778 00001B4C 58 pop ax - 7779 00001B4D FF1E[5020] call far [triage_add] ; get extended error - 7780 00001B51 83F841 cmp ax,65 ; network access denied? - 7781 ;jne short OPENERR ; no - go deallocate batch - 7782 ; 21/01/2023 - 7783 ;;je short AccDenErr - 7784 ; 22/07/2024 - 7785 00001B54 7506 jne short OpenErr - 7786 ; 06/06/2023 - 7787 ;je short AccDenErr - 7788 - 7789 ; 21/01/2023 - 7790 ;_ACCDENERROR: ; yes - put out message - 7791 ; ;mov dx,offset ResGroup:AccDen ; dx = ptr to msg - 7792 ; mov dx,ACCDENERR - 7793 ; call RPRINT - 7794 - 7795 ; 21/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 7796 - 7797 ; MSDOS 6.0 (& MSDOS 5.0) - 7798 - 7799 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7800 ; 06/06/2023 - 7801 ; 21/01/2023 - 7802 %if 0 - 7803 - 7804 ; If AUTOEXEC.BAT is not found, then check for KAUTOEXE.BAT. Changed - 7805 ; by Ellen to check only when in Korea. The country information - 7806 ; returned will overlay the old parse data area, but we don't care - 7807 ; since we won't need the parse information or country information. - 7808 ; We only care about the country code returned in BX. - 7809 - 7810 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1AE7h - 7811 ; 06/06/2023 - 7812 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1C5Eh - 7813 - 7814 ;mov dx,offset ResGroup:Internat_Info ; set up internat vars - 7815 mov dx,INTERNAT_INFO - 7816 mov ax,3800h - 7817 ;mov ax,INTERNATIONAL<<8 - 7818 ;;mov ax,INTERNATIONAL shl 8 ; get country dependent info - 7819 int 21h ; - 7820 jc short NoKabat ; error - don't bother with it - 7821 cmp bx,52h - 7822 ;cmp bx,KOREA_COUNTRY_CODE ; are we speaking korean? - 7823 jne short OpenErr ; no, don't check for kautoexe - 7824 - 7825 ;mov di,BatFile ; 3/3/kk - 7826 mov di,20h - 7827 ;mov si,offset ResGroup:KautoBat ; another trial to do 3/3/kk - 7828 mov si,KAUTOBAT - 7829 mov cx,8 ; auto execution for the 3/3/kk - 7830 rep movsw ; non-english country 3/3/kk - 7831 movsb ; move in carraige return to terminate string - 7832 ;mov dx,offset ResGroup:KautoBat ; 3/3/kk - 7833 mov dx,KAUTOBAT - 7834 mov ax,3D00h - 7835 ;mov ax,OPEN<<8 - 7836 ;;mov ax,OPEN shl 8 ; 3/3/kk - 7837 int 21h ; see if kautoexe.bat exists 3/3/kk - 7838 jc short NoKabat ; 3/3/kk - 7839 mov bx,ax ; 3/3/kk - 7840 mov ah,3Eh - 7841 ;mov ah,CLOSE ; 3/3/kk - 7842 int 21h ; 3/3/kk - 7843 jmp short Drv0 ; 3/3/kk - 7844 - 7845 NoKabat: ; 3/3/kk - 7846 call far [triage_add] ; get extended error - 7847 cmp ax,65 ; network access denied? - 7848 jnz short OpenErr ; no - go deallocate batch - 7849 - 7850 %endif - 7851 ; 06/06/2023 - Retro DOS 4.2 COMMAND.COM - 7852 ; 21/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 7853 - 7854 AccDenErr: ; yes - put out message - 7855 ;mov dx,offset ResGroup:AccDen ; dx = ptr to msg - 7856 00001B56 BA[D006] mov dx,ACCDEN - 7857 00001B59 E87FF8 call RPrint - 7858 OpenErr: - 7859 ;OPENERR: - 7860 00001B5C 8E06[4902] mov es,[Batch] ; not found--turn off batch job - 7861 00001B60 B449 mov ah,49h - 7862 ;mov ah,DEALLOC ; 49h - 7863 00001B62 CD21 int 21h - 7864 00001B64 C706[4902]0000 mov word [Batch],0 ; after dealloc in case of ^c - 7865 00001B6A C606[9D02]01 mov byte [EchoFlag],1 - 7866 00001B6F C706[AE02]0000 mov word [Nest],0 ; indicate no batch in progress - 7867 ;DoDttm: - 7868 ;mov ax,offset TranGroup:Datinit - 7869 00001B75 B8[9C32] mov ax,DATINIT - 7870 00001B78 A3[4820] mov [INITADD],ax - 7871 - 7872 ; MSDOS 6.0 - 7873 ;;M004;;mov ax,TrnSeg - 7874 ; - 7875 ; M004; We cant use TrnSeg now because it is not initialized. We now that - 7876 ; M004; the transient starts on a para boundary at the label TranStart. - 7877 ; M004; We use TranStart to get the start of the transient segment. - 7878 - 7879 ; 21/01/2023 - 7880 ;mov ax,offset RESGROUP:TranStart ; M004 - 7881 ;;mov ax,2320h ; MSDOS 5.0 COMMAND.COM - 7882 ; 06/06/2023 - 7883 ;mov ax,26E0h ; MSDOS 6.22 COMMAND.COM - 7884 ; - 7885 ;mov ax,TRANSTART - 7886 ;mov cl,4 ; M004 - 7887 ;shr ax,cl ; get relative seg ; M004 - 7888 ; 06/06/2023 - 7889 00001B7B B87D02 mov ax,TRANSTART>>4 - 7890 - 7891 00001B7E 8CC9 mov cx,cs - 7892 00001B80 01C8 add ax,cx ; ax = transient seg ; M004 + 7761 ;mov dx,offset ResGroup:AutoBat + 7762 00001B33 BA[3620] mov dx,AUTOBAT ; ":\AUTOEXEC.BAT" + 7763 + 7764 ;;mov ax,OPEN shl 8 + 7765 00001B36 B8003D mov ax,3D00h ; 21/01/2023 + 7766 ;mov ax,OPEN*256 ; 3D00h ; open for read + 7767 00001B39 CD21 int 21h ; see if autoexec.bat exists + 7768 00001B3B 7208 jc short noabat + 7769 00001B3D 89C3 mov bx,ax + 7770 00001B3F B43E mov ah,3Eh ; 21/01/2023 + 7771 ;mov ah,CLOSE ; 3Eh + 7772 00001B41 CD21 int 21h + 7773 ;jmp Drv0 ; go process autoexec + 7774 ; 22/07/2024 + 7775 00001B43 EB51 jmp short Drv0 + 7776 + 7777 noabat: + 7778 00001B45 50 push ax + 7779 00001B46 E85701 call Setup_Seg + 7780 00001B49 A3[5220] mov [triage_add+2],ax + 7781 00001B4C 58 pop ax + 7782 00001B4D FF1E[5020] call far [triage_add] ; get extended error + 7783 00001B51 83F841 cmp ax,65 ; network access denied? + 7784 ;jne short OPENERR ; no - go deallocate batch + 7785 ; 21/01/2023 + 7786 ;;je short AccDenErr + 7787 ; 22/07/2024 + 7788 00001B54 7506 jne short OpenErr + 7789 ; 06/06/2023 + 7790 ;je short AccDenErr + 7791 + 7792 ; 21/01/2023 + 7793 ;_ACCDENERROR: ; yes - put out message + 7794 ; ;mov dx,offset ResGroup:AccDen ; dx = ptr to msg + 7795 ; mov dx,ACCDENERR + 7796 ; call RPRINT + 7797 + 7798 ; 21/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 7799 + 7800 ; MSDOS 6.0 (& MSDOS 5.0) + 7801 + 7802 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7803 ; 06/06/2023 + 7804 ; 21/01/2023 + 7805 %if 0 + 7806 + 7807 ; If AUTOEXEC.BAT is not found, then check for KAUTOEXE.BAT. Changed + 7808 ; by Ellen to check only when in Korea. The country information + 7809 ; returned will overlay the old parse data area, but we don't care + 7810 ; since we won't need the parse information or country information. + 7811 ; We only care about the country code returned in BX. + 7812 + 7813 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1AE7h + 7814 ; 06/06/2023 + 7815 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1C5Eh + 7816 + 7817 ;mov dx,offset ResGroup:Internat_Info ; set up internat vars + 7818 mov dx,INTERNAT_INFO + 7819 mov ax,3800h + 7820 ;mov ax,INTERNATIONAL<<8 + 7821 ;;mov ax,INTERNATIONAL shl 8 ; get country dependent info + 7822 int 21h ; + 7823 jc short NoKabat ; error - don't bother with it + 7824 cmp bx,52h + 7825 ;cmp bx,KOREA_COUNTRY_CODE ; are we speaking korean? + 7826 jne short OpenErr ; no, don't check for kautoexe + 7827 + 7828 ;mov di,BatFile ; 3/3/kk + 7829 mov di,20h + 7830 ;mov si,offset ResGroup:KautoBat ; another trial to do 3/3/kk + 7831 mov si,KAUTOBAT + 7832 mov cx,8 ; auto execution for the 3/3/kk + 7833 rep movsw ; non-english country 3/3/kk + 7834 movsb ; move in carraige return to terminate string + 7835 ;mov dx,offset ResGroup:KautoBat ; 3/3/kk + 7836 mov dx,KAUTOBAT + 7837 mov ax,3D00h + 7838 ;mov ax,OPEN<<8 + 7839 ;;mov ax,OPEN shl 8 ; 3/3/kk + 7840 int 21h ; see if kautoexe.bat exists 3/3/kk + 7841 jc short NoKabat ; 3/3/kk + 7842 mov bx,ax ; 3/3/kk + 7843 mov ah,3Eh + 7844 ;mov ah,CLOSE ; 3/3/kk + 7845 int 21h ; 3/3/kk + 7846 jmp short Drv0 ; 3/3/kk + 7847 + 7848 NoKabat: ; 3/3/kk + 7849 call far [triage_add] ; get extended error + 7850 cmp ax,65 ; network access denied? + 7851 jnz short OpenErr ; no - go deallocate batch + 7852 + 7853 %endif + 7854 ; 06/06/2023 - Retro DOS 4.2 COMMAND.COM + 7855 ; 21/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 7856 + 7857 AccDenErr: ; yes - put out message + 7858 ;mov dx,offset ResGroup:AccDen ; dx = ptr to msg + 7859 00001B56 BA[D006] mov dx,ACCDEN + 7860 00001B59 E87FF8 call RPrint + 7861 OpenErr: + 7862 ;OPENERR: + 7863 00001B5C 8E06[4902] mov es,[Batch] ; not found--turn off batch job + 7864 00001B60 B449 mov ah,49h + 7865 ;mov ah,DEALLOC ; 49h + 7866 00001B62 CD21 int 21h + 7867 00001B64 C706[4902]0000 mov word [Batch],0 ; after dealloc in case of ^c + 7868 00001B6A C606[9D02]01 mov byte [EchoFlag],1 + 7869 00001B6F C706[AE02]0000 mov word [Nest],0 ; indicate no batch in progress + 7870 ;DoDttm: + 7871 ;mov ax,offset TranGroup:Datinit + 7872 00001B75 B8[9C32] mov ax,DATINIT + 7873 00001B78 A3[4820] mov [INITADD],ax + 7874 + 7875 ; MSDOS 6.0 + 7876 ;;M004;;mov ax,TrnSeg + 7877 ; + 7878 ; M004; We cant use TrnSeg now because it is not initialized. We now that + 7879 ; M004; the transient starts on a para boundary at the label TranStart. + 7880 ; M004; We use TranStart to get the start of the transient segment. + 7881 + 7882 ; 21/01/2023 + 7883 ;mov ax,offset RESGROUP:TranStart ; M004 + 7884 ;;mov ax,2320h ; MSDOS 5.0 COMMAND.COM + 7885 ; 06/06/2023 + 7886 ;mov ax,26E0h ; MSDOS 6.22 COMMAND.COM + 7887 ; + 7888 ;mov ax,TRANSTART + 7889 ;mov cl,4 ; M004 + 7890 ;shr ax,cl ; get relative seg ; M004 + 7891 ; 06/06/2023 + 7892 00001B7B B87D02 mov ax,TRANSTART>>4 7893 - 7894 ; 21/01/2023 - 7895 ; MSDOS 3.3 - 7896 ; 25/09/2018 - 7897 ;mov ax,[TrnSeg] ; COMMAND.COM (MSDOS 3.3) - Offset 1387h - 7898 - 7899 ; MSDOS 3.3 & MSDOS 6.0 - 7900 00001B82 A3[4A20] mov [INITADD+2],ax - 7901 ;call dword ptr InitAdd - 7902 00001B85 FF1E[4820] call far [INITADD] - 7903 - 7904 NoDttm: - 7905 ; MSDOS 6.0 - 7906 ; 21/01/2023 - 7907 ;Copyright: - 7908 ;public Copyright - 7909 ; Bugbug: remove Copyright label. - 7910 - 7911 ;if IBMVER - 7912 00001B89 833E[A502]00 cmp word [SingleCom],0 - 7913 00001B8E 7506 jnz short Drv0 ; don't print header if SingleCom - 7914 ;mov dx,offset ResGroup:CopyrightMsg ; dx = ptr to msg - 7915 00001B90 BA[9621] mov dx,COPYRIGHTMSG - 7916 00001B93 E845F8 call RPrint - 7917 ;endif - 7918 ; 21/01/2023 - 7919 ; MSDOS 3.3 - 7920 ;cmp word [SingleCom],0 ; don't print header if SingleCom - 7921 ;jnz short DRV0 - 7922 ;mov dx,HEADERPTR ; dx = ptr to msg - 7923 ;call RPRINT - 7924 ;DRV0: - 7925 ; MSDOS 3.3 - 7926 ;mov byte [INITFLAG],0 - 7927 ;jmp ENDINIT - 7928 - 7929 ; 21/01/2023 - 7930 ; MSDOS 6.0 - 7931 Drv0: ; Reset APPEND state - 7932 00001B96 1E push ds ; save data segment - 7933 00001B97 0E push cs ; Get local segment into DS - 7934 00001B98 1F pop ds ; - 7935 00001B99 B807B7 mov ax,0B707h ; 21/01/2023 - 7936 ;mov ax,APPENDSETSTATE ; Set the state of Append - 7937 00001B9C 8B1E[BE02] mov bx,[Append_State] ; back to the original state - 7938 00001BA0 CD2F int 2Fh ; - 7939 00001BA2 1F pop ds ; get data segment back - 7940 - 7941 ;Check FirstCom set previously to see if this is the first instance of - 7942 ;command.com. If not, we do not move command.com. Instead, we copy over the - 7943 ;jump table from the previous stub to the current stub. - 7944 - 7945 00001BA3 803E[9926]01 cmp byte [FirstCom],1 ; first command.com? - 7946 00001BA8 7431 jz short move_code ; yes, move it + 7894 00001B7E 8CC9 mov cx,cs + 7895 00001B80 01C8 add ax,cx ; ax = transient seg ; M004 + 7896 + 7897 ; 21/01/2023 + 7898 ; MSDOS 3.3 + 7899 ; 25/09/2018 + 7900 ;mov ax,[TrnSeg] ; COMMAND.COM (MSDOS 3.3) - Offset 1387h + 7901 + 7902 ; MSDOS 3.3 & MSDOS 6.0 + 7903 00001B82 A3[4A20] mov [INITADD+2],ax + 7904 ;call dword ptr InitAdd + 7905 00001B85 FF1E[4820] call far [INITADD] + 7906 + 7907 NoDttm: + 7908 ; MSDOS 6.0 + 7909 ; 21/01/2023 + 7910 ;Copyright: + 7911 ;public Copyright + 7912 ; Bugbug: remove Copyright label. + 7913 + 7914 ;if IBMVER + 7915 00001B89 833E[A502]00 cmp word [SingleCom],0 + 7916 00001B8E 7506 jnz short Drv0 ; don't print header if SingleCom + 7917 ;mov dx,offset ResGroup:CopyrightMsg ; dx = ptr to msg + 7918 00001B90 BA[9621] mov dx,COPYRIGHTMSG + 7919 00001B93 E845F8 call RPrint + 7920 ;endif + 7921 ; 21/01/2023 + 7922 ; MSDOS 3.3 + 7923 ;cmp word [SingleCom],0 ; don't print header if SingleCom + 7924 ;jnz short DRV0 + 7925 ;mov dx,HEADERPTR ; dx = ptr to msg + 7926 ;call RPRINT + 7927 ;DRV0: + 7928 ; MSDOS 3.3 + 7929 ;mov byte [INITFLAG],0 + 7930 ;jmp ENDINIT + 7931 + 7932 ; 21/01/2023 + 7933 ; MSDOS 6.0 + 7934 Drv0: ; Reset APPEND state + 7935 00001B96 1E push ds ; save data segment + 7936 00001B97 0E push cs ; Get local segment into DS + 7937 00001B98 1F pop ds ; + 7938 00001B99 B807B7 mov ax,0B707h ; 21/01/2023 + 7939 ;mov ax,APPENDSETSTATE ; Set the state of Append + 7940 00001B9C 8B1E[BE02] mov bx,[Append_State] ; back to the original state + 7941 00001BA0 CD2F int 2Fh ; + 7942 00001BA2 1F pop ds ; get data segment back + 7943 + 7944 ;Check FirstCom set previously to see if this is the first instance of + 7945 ;command.com. If not, we do not move command.com. Instead, we copy over the + 7946 ;jump table from the previous stub to the current stub. 7947 - 7948 00001BAA 06 push es - 7949 00001BAB 1E push ds + 7948 00001BA3 803E[9926]01 cmp byte [FirstCom],1 ; first command.com? + 7949 00001BA8 7431 jz short move_code ; yes, move it 7950 - 7951 00001BAC 1E push ds - 7952 00001BAD 07 pop es - 7953 ;mov di,offset DATARES:Int2f_Entry - 7954 00001BAE BF[6600] mov di,Int2f_Entry - 7955 - 7956 ;mov ds,[es:ResJmpTable+2] ; get segment address - 7957 ;mov si,[es:ResJmpTable] ; get offset address - 7958 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 7959 00001BB1 26C536[9526] lds si,[es:ResJmpTable] - 7960 - 7961 ;mov cx,11 - 7962 ;;mov cx,NUM_RELOC_ENTRIES ; number of dword ptrs - 7963 ;shl cx,1 - 7964 ;shl cx,1 ; size of table in bytes - 7965 ; 21/01/2023 - 7966 00001BB6 B92C00 mov cx,44 ; size of table in bytes - 7967 - 7968 00001BB9 FC cld - 7969 00001BBA F3A4 rep movsb ; copy the jump table + 7951 00001BAA 06 push es + 7952 00001BAB 1E push ds + 7953 + 7954 00001BAC 1E push ds + 7955 00001BAD 07 pop es + 7956 ;mov di,offset DATARES:Int2f_Entry + 7957 00001BAE BF[6600] mov di,Int2f_Entry + 7958 + 7959 ;mov ds,[es:ResJmpTable+2] ; get segment address + 7960 ;mov si,[es:ResJmpTable] ; get offset address + 7961 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 7962 00001BB1 26C536[9526] lds si,[es:ResJmpTable] + 7963 + 7964 ;mov cx,11 + 7965 ;;mov cx,NUM_RELOC_ENTRIES ; number of dword ptrs + 7966 ;shl cx,1 + 7967 ;shl cx,1 ; size of table in bytes + 7968 ; 21/01/2023 + 7969 00001BB6 B92C00 mov cx,44 ; size of table in bytes 7970 - 7971 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 7972 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1D6Ch - 7973 %if 1 - 7974 00001BBC A0[FA01] mov al,[cox_location] ; "cox" - 7975 00001BBF 26A2[FA01] mov [es:cox_location],al ; "cox" - 7976 00001BC3 A1[FB01] mov ax,[cox_location+1] - 7977 00001BC6 A3[FB01] mov [cox_location+1],ax - 7978 %endif - 7979 - 7980 ;Check if the resident code is in HMA. We assume that it is in HMA if its - 7981 ;code segment > 0f000h. If in HMA, we set the ComInHMA flag + 7971 00001BB9 FC cld + 7972 00001BBA F3A4 rep movsb ; copy the jump table + 7973 + 7974 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 7975 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1D6Ch + 7976 %if 1 + 7977 00001BBC A0[FA01] mov al,[cox_location] ; "cox" + 7978 00001BBF 26A2[FA01] mov [es:cox_location],al ; "cox" + 7979 00001BC3 A1[FB01] mov ax,[cox_location+1] + 7980 00001BC6 A3[FB01] mov [cox_location+1],ax + 7981 %endif 7982 - 7983 00001BC9 26817DFE00F0 cmp word [es:di-2],0F000h ; is resident code in HMA? - 7984 00001BCF 7206 jb short res_low ; no, dont set flag + 7983 ;Check if the resident code is in HMA. We assume that it is in HMA if its + 7984 ;code segment > 0f000h. If in HMA, we set the ComInHMA flag 7985 - 7986 00001BD1 26C606[9600]01 mov byte [es:ComInHMA],1 ; indicate code in HMA - 7987 res_low: - 7988 00001BD7 1F pop ds - 7989 00001BD8 07 pop es - 7990 00001BD9 EB03 jmp short finish_init - 7991 - 7992 ;Now, we can move the resident code to its final location, either to HIMEM - 7993 ;or to overlay the messages in the data segment if the user has not used the - 7994 ;/msg switch. - 7995 - 7996 move_code: - 7997 00001BDB E85702 call Move_res_code ; move the code + 7986 00001BC9 26817DFE00F0 cmp word [es:di-2],0F000h ; is resident code in HMA? + 7987 00001BCF 7206 jb short res_low ; no, dont set flag + 7988 + 7989 00001BD1 26C606[9600]01 mov byte [es:ComInHMA],1 ; indicate code in HMA + 7990 res_low: + 7991 00001BD7 1F pop ds + 7992 00001BD8 07 pop es + 7993 00001BD9 EB03 jmp short finish_init + 7994 + 7995 ;Now, we can move the resident code to its final location, either to HIMEM + 7996 ;or to overlay the messages in the data segment if the user has not used the + 7997 ;/msg switch. 7998 - 7999 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 8000 ; PCDOS 7.1 COMMAND.COM - 8001 %if 0 - 8002 finish_init: - 8003 ;jmp RESGROUP:EndInit ; finish initializing - 8004 jmp EndInit - 8005 %else - 8006 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1D8Fh - 8007 finish_init: - 8008 00001BDE 803E[A202]01 cmp byte [PermCom],1 - 8009 00001BE3 7523 jne short finish_init_@ - 8010 00001BE5 803E[0E04]01 cmp byte [COMMAND_HIGH],1 ; COMMAND.COM will be moved to HMA/UMB - 8011 00001BEA 751C jne short finish_init_@ - 8012 00001BEC BB4000 mov bx,40h ; high memory first fit - 8013 00001BEF B80158 mov ax,5801h ; set allocation strategy - 8014 00001BF2 CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 8015 ; AL = function code: set allocation strategy - 8016 00001BF4 BB0100 mov bx,1 ; add UMBs to DOS memory chain - 8017 00001BF7 B80358 mov ax,5803h ; set UMB link state - 8018 00001BFA CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 8019 ; AL = function code: (DOS 5beta) set UMB link state - 8020 00001BFC 720A jb short finish_init_@ - 8021 00001BFE 8B1E[B404] mov bx,[ResSize] - 8022 00001C02 B448 mov ah,48h - 8023 00001C04 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 8024 ; BX = number of 16-byte paragraphs desired - 8025 00001C06 7303 jnb short patch_segments_hma - 8026 finish_init_@: - 8027 00001C08 E90AE7 jmp EndInit - 8028 - 8029 patch_segments_hma: - 8030 ;mov [ds:0Ch],ax - 8031 00001C0B A30C00 mov [PDB.EXIT+2],ax - 8032 ;mov [ds:10h],ax - 8033 00001C0E A31000 mov [PDB.CTRL_C+2],ax - 8034 ;mov [ds:14h],ax - 8035 00001C11 A31400 mov [PDB.FATAL_ABORT+2],ax - 8036 ;mov [ds:16h],ax - 8037 00001C14 A31600 mov [PDB.PARENT_PID],ax - 8038 ;mov [ds:36h],ax - 8039 00001C17 A33600 mov [PDB.JFN_Pointer+2],ax - 8040 00001C1A A3[3E02] mov [Parent],ax - 8041 00001C1D A3[4202] mov [OldTerm+2],ax - 8042 00001C20 A3[3E04] mov [Com_Ptr+2],ax - 8043 00001C23 A3[4204] mov [Com_Fcb1+2],ax - 8044 00001C26 A3[4604] mov [Com_Fcb2+2],ax - 8045 00001C29 A3[4A04] mov [MySeg],ax - 8046 00001C2C A3[5204] mov [MySeg1],ax - 8047 00001C2F A3[5604] mov [MySeg2],ax - 8048 00001C32 A3[5607] mov [MySeg3],ax - 8049 00001C35 A3[2801] mov [int2fh_segm],ax ; [Carousel_i2f_Hook+3] ; 23/07/2024 - 8050 ;mov di,(offset Int2f_Entry+2) - 8051 00001C38 BF[6800] mov di,Int2f_Entry+2 - 8052 00001C3B 833DFF cmp word [di],0FFFFh - 8053 00001C3E 7409 jz short already_hma - 8054 00001C40 B10B mov cl,11 ; NUM_RELOC_ENTRIES - 8055 patch_entry_seg: - 8056 00001C42 8905 mov [di],ax - 8057 00001C44 83C704 add di,4 - 8058 00001C47 E2F9 loop patch_entry_seg - 8059 already_hma: - 8060 00001C49 8EC0 mov es,ax - 8061 00001C4B 31F6 xor si,si - 8062 00001C4D 31FF xor di,di - 8063 00001C4F B103 mov cl,3 ; BX = resident part size in paragraphs - 8064 ; after shifting: resident part size in words - 8065 00001C51 D3E3 shl bx,cl ; move resident part of COMMAND.COM to HMA (UMB) - 8066 00001C53 89D9 mov cx,bx ; number of words - 8067 00001C55 F3A5 rep movsw - 8068 00001C57 1E push ds - 8069 00001C58 8ED9 mov ds,cx ; 0 - 8070 ;mov [ds:0BAh],ax ; INT 2Eh segment - 8071 00001C5A A3BA00 mov [(2Eh*4)+2],ax - 8072 00001C5D 40 inc ax - 8073 ;mov [ds:0BEh],ax ; INT 2Fh segment - 8074 00001C5E A3BE00 mov [(2Fh*4)+2],ax - 8075 00001C61 1F pop ds - 8076 00001C62 8CC3 mov bx,es - 8077 00001C64 B450 mov ah,50h - 8078 00001C66 CD21 int 21h ; DOS - 2+ internal - SET PSP SEGMENT - 8079 ; BX = segment address of new PSP - 8080 00001C68 4B dec bx - 8081 00001C69 8EC3 mov es,bx ; memory arena header (segment) - 8082 00001C6B 43 inc bx ; PSP (program) address/segment - 8083 ;mov [es:1],bx - 8084 ;mov [es:ARENA.owner],bx - 8085 00001C6C 26891E0100 mov [es:arena_owner],bx - 8086 ;mov word [es:8],4F43h ; 'CO' ; [es:arena_name] - 8087 00001C71 26C7060800434F mov word [es:arena_name],4F43h - 8088 ;mov word [es:0Ah],4D4Dh ; 'MM' - 8089 00001C78 26C7060A004D4D mov word [es:arena_name+2],4D4Dh - 8090 ;mov word [es:0Ch],4E41h ; 'AN' - 8091 00001C7F 26C7060C00414E mov word [es:arena_name+4],4E41h - 8092 ;mov word [es:0Eh],44h ; 'D' - 8093 00001C86 26C7060E004400 mov word [es:arena_name+6],44h - 8094 00001C8D FE06[0E04] inc byte [COMMAND_HIGH] ; = 2 - 8095 ; Resident portion of COMMAND.COM is - 8096 ; in HMA/UMB flag (=2) - 8097 00001C91 53 push bx - 8098 ;mov ax,offset EndInit - 8099 00001C92 B8[1503] mov ax,EndInit - 8100 00001C95 50 push ax - 8101 00001C96 CB retf - 8102 %endif - 8103 - 8104 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8105 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1BA8h (CODERES:0E68h) + 7999 move_code: + 8000 00001BDB E85702 call Move_res_code ; move the code + 8001 + 8002 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 8003 ; PCDOS 7.1 COMMAND.COM + 8004 %if 0 + 8005 finish_init: + 8006 ;jmp RESGROUP:EndInit ; finish initializing + 8007 jmp EndInit + 8008 %else + 8009 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1D8Fh + 8010 finish_init: + 8011 00001BDE 803E[A202]01 cmp byte [PermCom],1 + 8012 00001BE3 7523 jne short finish_init_@ + 8013 00001BE5 803E[0E04]01 cmp byte [COMMAND_HIGH],1 ; COMMAND.COM will be moved to HMA/UMB + 8014 00001BEA 751C jne short finish_init_@ + 8015 00001BEC BB4000 mov bx,40h ; high memory first fit + 8016 00001BEF B80158 mov ax,5801h ; set allocation strategy + 8017 00001BF2 CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 8018 ; AL = function code: set allocation strategy + 8019 00001BF4 BB0100 mov bx,1 ; add UMBs to DOS memory chain + 8020 00001BF7 B80358 mov ax,5803h ; set UMB link state + 8021 00001BFA CD21 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 8022 ; AL = function code: (DOS 5beta) set UMB link state + 8023 00001BFC 720A jb short finish_init_@ + 8024 00001BFE 8B1E[B404] mov bx,[ResSize] + 8025 00001C02 B448 mov ah,48h + 8026 00001C04 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 8027 ; BX = number of 16-byte paragraphs desired + 8028 00001C06 7303 jnb short patch_segments_hma + 8029 finish_init_@: + 8030 00001C08 E90AE7 jmp EndInit + 8031 + 8032 patch_segments_hma: + 8033 ;mov [ds:0Ch],ax + 8034 00001C0B A30C00 mov [PDB.EXIT+2],ax + 8035 ;mov [ds:10h],ax + 8036 00001C0E A31000 mov [PDB.CTRL_C+2],ax + 8037 ;mov [ds:14h],ax + 8038 00001C11 A31400 mov [PDB.FATAL_ABORT+2],ax + 8039 ;mov [ds:16h],ax + 8040 00001C14 A31600 mov [PDB.PARENT_PID],ax + 8041 ;mov [ds:36h],ax + 8042 00001C17 A33600 mov [PDB.JFN_Pointer+2],ax + 8043 00001C1A A3[3E02] mov [Parent],ax + 8044 00001C1D A3[4202] mov [OldTerm+2],ax + 8045 00001C20 A3[3E04] mov [Com_Ptr+2],ax + 8046 00001C23 A3[4204] mov [Com_Fcb1+2],ax + 8047 00001C26 A3[4604] mov [Com_Fcb2+2],ax + 8048 00001C29 A3[4A04] mov [MySeg],ax + 8049 00001C2C A3[5204] mov [MySeg1],ax + 8050 00001C2F A3[5604] mov [MySeg2],ax + 8051 00001C32 A3[5607] mov [MySeg3],ax + 8052 00001C35 A3[2801] mov [int2fh_segm],ax ; [Carousel_i2f_Hook+3] ; 23/07/2024 + 8053 ;mov di,(offset Int2f_Entry+2) + 8054 00001C38 BF[6800] mov di,Int2f_Entry+2 + 8055 00001C3B 833DFF cmp word [di],0FFFFh + 8056 00001C3E 7409 jz short already_hma + 8057 00001C40 B10B mov cl,11 ; NUM_RELOC_ENTRIES + 8058 patch_entry_seg: + 8059 00001C42 8905 mov [di],ax + 8060 00001C44 83C704 add di,4 + 8061 00001C47 E2F9 loop patch_entry_seg + 8062 already_hma: + 8063 00001C49 8EC0 mov es,ax + 8064 00001C4B 31F6 xor si,si + 8065 00001C4D 31FF xor di,di + 8066 00001C4F B103 mov cl,3 ; BX = resident part size in paragraphs + 8067 ; after shifting: resident part size in words + 8068 00001C51 D3E3 shl bx,cl ; move resident part of COMMAND.COM to HMA (UMB) + 8069 00001C53 89D9 mov cx,bx ; number of words + 8070 00001C55 F3A5 rep movsw + 8071 00001C57 1E push ds + 8072 00001C58 8ED9 mov ds,cx ; 0 + 8073 ;mov [ds:0BAh],ax ; INT 2Eh segment + 8074 00001C5A A3BA00 mov [(2Eh*4)+2],ax + 8075 00001C5D 40 inc ax + 8076 ;mov [ds:0BEh],ax ; INT 2Fh segment + 8077 00001C5E A3BE00 mov [(2Fh*4)+2],ax + 8078 00001C61 1F pop ds + 8079 00001C62 8CC3 mov bx,es + 8080 00001C64 B450 mov ah,50h + 8081 00001C66 CD21 int 21h ; DOS - 2+ internal - SET PSP SEGMENT + 8082 ; BX = segment address of new PSP + 8083 00001C68 4B dec bx + 8084 00001C69 8EC3 mov es,bx ; memory arena header (segment) + 8085 00001C6B 43 inc bx ; PSP (program) address/segment + 8086 ;mov [es:1],bx + 8087 ;mov [es:ARENA.owner],bx + 8088 00001C6C 26891E0100 mov [es:arena_owner],bx + 8089 ;mov word [es:8],4F43h ; 'CO' ; [es:arena_name] + 8090 00001C71 26C7060800434F mov word [es:arena_name],4F43h + 8091 ;mov word [es:0Ah],4D4Dh ; 'MM' + 8092 00001C78 26C7060A004D4D mov word [es:arena_name+2],4D4Dh + 8093 ;mov word [es:0Ch],4E41h ; 'AN' + 8094 00001C7F 26C7060C00414E mov word [es:arena_name+4],4E41h + 8095 ;mov word [es:0Eh],44h ; 'D' + 8096 00001C86 26C7060E004400 mov word [es:arena_name+6],44h + 8097 00001C8D FE06[0E04] inc byte [COMMAND_HIGH] ; = 2 + 8098 ; Resident portion of COMMAND.COM is + 8099 ; in HMA/UMB flag (=2) + 8100 00001C91 53 push bx + 8101 ;mov ax,offset EndInit + 8102 00001C92 B8[1503] mov ax,EndInit + 8103 00001C95 50 push ax + 8104 00001C96 CB retf + 8105 %endif 8106 - 8107 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 8108 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1E48h + 8107 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8108 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1BA8h (CODERES:0E68h) 8109 - 8110 GetStrLen: - 8111 ; Get length of string pointed to by DS:SI. Length includes NULL. - 8112 ; Length is returned in CX - 8113 - 8114 ; MSDOS 3.3 & MSDOS 6.0 - 8115 00001C97 31C9 xor cx,cx - 8116 NxtChar: - 8117 00001C99 AC lodsb - 8118 00001C9A 41 inc cx - 8119 00001C9B 08C0 or al,al - 8120 00001C9D 75FA jnz short NxtChar - 8121 00001C9F C3 retn - 8122 - 8123 ; 29/01/2023 - 8124 Setup_Seg: + 8110 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 8111 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1E48h + 8112 + 8113 GetStrLen: + 8114 ; Get length of string pointed to by DS:SI. Length includes NULL. + 8115 ; Length is returned in CX + 8116 + 8117 ; MSDOS 3.3 & MSDOS 6.0 + 8118 00001C97 31C9 xor cx,cx + 8119 NxtChar: + 8120 00001C99 AC lodsb + 8121 00001C9A 41 inc cx + 8122 00001C9B 08C0 or al,al + 8123 00001C9D 75FA jnz short NxtChar + 8124 00001C9F C3 retn 8125 - 8126 ; If the transient has been loaded in TranSeg, then we need to use that - 8127 ; segment for calls to routines in the transient area. Otherwise, the current - 8128 ; code segment is used - 8129 ; Segment returned in AX. - 8130 - 8131 ; MSDOS 3.3 & MSDOS 6.0 - 8132 00001CA0 A1[8F02] mov ax,[TrnSeg] - 8133 00001CA3 803E[9102]01 cmp byte [TrnMvFlg],1 ; Has transient portion been moved - 8134 00001CA8 7405 je short setup_end - 8135 - 8136 ;06/06/2023 - 8137 %if 0 - 8138 push bx - 8139 mov bx,cs - 8140 ;mov ax,offset ResGroup:TranStart - 8141 ;mov ax,2320h ; MSDOS 5.0 COMMAND.COM - 8142 ; 06/06/2023 - 8143 ;mov ax,26E0h ; MSDOS 6.22 COMMAND.COM - 8144 ;mov ax,TRANSTART - 8145 ;shr ax,1 - 8146 ;shr ax,1 - 8147 ;shr ax,1 + 8126 ; 29/01/2023 + 8127 Setup_Seg: + 8128 + 8129 ; If the transient has been loaded in TranSeg, then we need to use that + 8130 ; segment for calls to routines in the transient area. Otherwise, the current + 8131 ; code segment is used + 8132 ; Segment returned in AX. + 8133 + 8134 ; MSDOS 3.3 & MSDOS 6.0 + 8135 00001CA0 A1[8F02] mov ax,[TrnSeg] + 8136 00001CA3 803E[9102]01 cmp byte [TrnMvFlg],1 ; Has transient portion been moved + 8137 00001CA8 7405 je short setup_end + 8138 + 8139 ;06/06/2023 + 8140 %if 0 + 8141 push bx + 8142 mov bx,cs + 8143 ;mov ax,offset ResGroup:TranStart + 8144 ;mov ax,2320h ; MSDOS 5.0 COMMAND.COM + 8145 ; 06/06/2023 + 8146 ;mov ax,26E0h ; MSDOS 6.22 COMMAND.COM + 8147 ;mov ax,TRANSTART 8148 ;shr ax,1 - 8149 ; 29/01/2023 - 8150 mov ax,TRANSTART>>4 - 8151 add ax,bx - 8152 pop bx - 8153 %endif - 8154 ; 06/06/2023 - 8155 00001CAA 8CC8 mov ax,cs - 8156 00001CAC 057D02 add ax,TRANSTART>>4 - 8157 - 8158 setup_end: - 8159 00001CAF C3 retn + 8149 ;shr ax,1 + 8150 ;shr ax,1 + 8151 ;shr ax,1 + 8152 ; 29/01/2023 + 8153 mov ax,TRANSTART>>4 + 8154 add ax,bx + 8155 pop bx + 8156 %endif + 8157 ; 06/06/2023 + 8158 00001CAA 8CC8 mov ax,cs + 8159 00001CAC 057D02 add ax,TRANSTART>>4 8160 - 8161 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8162 ;RPRINT: - 8163 ; MSDOS 3.3 - 8164 ;push ax - 8165 ;call SETUP_SEG - 8166 ;mov [PRINTADD+2], ax - 8167 ;;call dword ptr PRINTADD - 8168 ;call far [PRINTADD] - 8169 ;pop ax - 8170 ;retn - 8171 - 8172 ; 29/01/2023 - 8173 ; MSDOS 6.0 - 8174 ;*** RPrintParse - display parse error message - 8175 ; - 8176 ; ENTRY DX = parse error # - 8177 ; - 8178 ; EXIT nothing - 8179 ; - 8180 ; USED flags - 8181 ; - 8182 ; EFFECTS - 8183 ; Message is displayed on stdout. - 8184 - 8185 RPrintParse: ;proc - 8186 ;assume ds:ResGroup,ss:ResGroup + 8161 setup_end: + 8162 00001CAF C3 retn + 8163 + 8164 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8165 ;RPRINT: + 8166 ; MSDOS 3.3 + 8167 ;push ax + 8168 ;call SETUP_SEG + 8169 ;mov [PRINTADD+2], ax + 8170 ;;call dword ptr PRINTADD + 8171 ;call far [PRINTADD] + 8172 ;pop ax + 8173 ;retn + 8174 + 8175 ; 29/01/2023 + 8176 ; MSDOS 6.0 + 8177 ;*** RPrintParse - display parse error message + 8178 ; + 8179 ; ENTRY DX = parse error # + 8180 ; + 8181 ; EXIT nothing + 8182 ; + 8183 ; USED flags + 8184 ; + 8185 ; EFFECTS + 8186 ; Message is displayed on stdout. 8187 - 8188 00001CB0 52 push dx ; preserve DX - 8189 00001CB1 87DA xchg bx,dx ; bx = parse error # - 8190 ; dx = saved BX - 8191 00001CB3 4B dec bx ; bx = parse error index, from 0 - 8192 00001CB4 D1E3 shl bx,1 ; bx = offset in word table - 8193 ;mov bx,ParsMsgPtrs[bx] ; bx = ptr to error msg - 8194 00001CB6 8B9F[E309] mov bx,[bx+PARSMSGPTRS] - 8195 00001CBA 87DA xchg bx,dx ; dx = ptr to error msg - 8196 ; bx = restored - 8197 00001CBC E81CF7 call RPrint ; print the message - 8198 00001CBF 5A pop dx ; restore DX - 8199 00001CC0 C3 retn - 8200 - 8201 ;RPrintParse endp - 8202 - 8203 ; 29/01/2023 - 8204 ;PATHCHRCMPR: - 8205 ; MSDOS 3.3 - 8206 ;push dx - 8207 ;mov dl,[slash_chr] - 8208 ;;cmp byte [RSWITCHAR],'/' - 8209 ;cmp [RSWITCHAR],dl - 8210 ;je short RNOSLASHT - 8211 ;;cmp al,'/' - 8212 ;cmp al,dl - 8213 ;je short RET41 ; zf = 1 - 8214 ;RNOSLASHT: - 8215 ;;cmp al,'\' - 8216 ;cmp al,[bslash_chr] - 8217 ;RET41: - 8218 ;pop dx - 8219 ;retn - 8220 - 8221 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8222 IfindE: - 8223 ; MSDOS 3.3 & MSDOS 6.0 - 8224 00001CC1 E80300 call ifind ; find the name - 8225 ;jc short ifind2 ; carry means not found - 8226 ;jmp short Iscasb1 ; scan for = sign - 8227 ; 29/01/2023 - 8228 00001CC4 734E jnc short Iscasb1 - 8229 ifind2: - 8230 00001CC6 C3 retn - 8231 - 8232 ; 29/01/2023 - 8233 - 8234 ; on return of find1, es:di points to beginning of name - 8235 - 8236 ifind: - 8237 00001CC7 FC cld - 8238 00001CC8 E83B00 call Icount0 ; cx = length of name - 8239 00001CCB 8E06[3A04] mov es,[EnvirSeg] - 8240 00001CCF 31FF xor di,di - 8241 ifind1: - 8242 00001CD1 51 push cx - 8243 00001CD2 56 push si - 8244 00001CD3 57 push di - 8245 ifind11: - 8246 00001CD4 AC lodsb - 8247 - 8248 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM - 8249 ; PCDOS 7.1 COMMAND.COM - 8250 %if 1 - 8251 ;ifdef DBCS - 8252 00001CD5 E8A5F7 call ITestKanj - 8253 00001CD8 740F jz short _NotKanj4 - 8254 00001CDA 4E dec si - 8255 00001CDB AD lodsw - 8256 00001CDC 47 inc di - 8257 00001CDD 47 inc di - 8258 00001CDE 263B45FE cmp ax,[es:di-2] - 8259 00001CE2 7511 jne short ifind12 - 8260 00001CE4 49 dec cx - 8261 00001CE5 E2ED loop ifind11 - 8262 00001CE7 EB0C jmp short ifind12 - 8263 _NotKanj4: - 8264 ;endif - 8265 %endif - 8266 00001CE9 E83400 call iupconv - 8267 00001CEC 47 inc di - 8268 00001CED 263A45FF cmp al,[es:di-1] - 8269 00001CF1 7502 jnz short ifind12 - 8270 00001CF3 E2DF loop ifind11 - 8271 ifind12: - 8272 00001CF5 5F pop di - 8273 00001CF6 5E pop si - 8274 00001CF7 59 pop cx - 8275 00001CF8 74CC jz short ifind2 - 8276 00001CFA 51 push cx - 8277 00001CFB E81A00 call Iscasb2 ; scan for a nul - 8278 00001CFE 59 pop cx - 8279 ;cmp byte [es:di],0 - 8280 ;jnz short ifind1 - 8281 ;stc ; indicate not found - 8282 00001CFF 26803D01 cmp byte [es:di],1 - 8283 00001D03 73CC jnb short ifind1 - 8284 ; cf=1 ; indicate not found - 8285 ;ifind2: - 8286 00001D05 C3 retn - 8287 - 8288 ; 29/01/2023 - 8289 Icount0: - 8290 00001D06 1E push ds - 8291 00001D07 07 pop es - 8292 00001D08 89F7 mov di,si - 8293 - 8294 00001D0A 57 push di ; count number of chars until "=" - 8295 00001D0B E80600 call Iscasb1 - 8296 ; 25/09/2018 - 8297 ;jmp short Icountx - 8298 ;push di ; count number of chars until nul - 8299 ;call Iscasb2 - 8300 ;Icountx: - 8301 00001D0E 59 pop cx - 8302 00001D0F 29CF sub di,cx - 8303 00001D11 87F9 xchg di,cx - 8304 00001D13 C3 retn - 8305 - 8306 Iscasb1: - 8307 ; 29/01/2023 - 8308 00001D14 B03D mov al,"=" - 8309 ;mov al,[equalsign] ; [equal_sign] ; scan for an = - 8310 00001D16 EB02 jmp short Iscasbx - 8311 Iscasb2: - 8312 00001D18 30C0 xor al,al ; scan for a nul - 8313 Iscasbx: - 8314 00001D1A B90001 mov cx,256 ; 100h - 8315 00001D1D F2AE repnz scasb - 8316 00001D1F C3 retn - 8317 - 8318 ; 29/01/2023 - 8319 ;IUPCONV: - 8320 ; MSDOS 3.3 - 8321 ;;cmp al,"a" - 8322 ;cmp al,[letter_a] - 8323 ;jb short IRET22 - 8324 ;;cmp al,"z" - 8325 ;cmp al,[letter_z] - 8326 ;ja short IRET22 - 8327 ;sub al,20h ; Lower-case changed to upper-case - 8328 ;IRET22: - 8329 ;retn - 8330 - 8331 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8332 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1C32h + 8188 RPrintParse: ;proc + 8189 ;assume ds:ResGroup,ss:ResGroup + 8190 + 8191 00001CB0 52 push dx ; preserve DX + 8192 00001CB1 87DA xchg bx,dx ; bx = parse error # + 8193 ; dx = saved BX + 8194 00001CB3 4B dec bx ; bx = parse error index, from 0 + 8195 00001CB4 D1E3 shl bx,1 ; bx = offset in word table + 8196 ;mov bx,ParsMsgPtrs[bx] ; bx = ptr to error msg + 8197 00001CB6 8B9F[E309] mov bx,[bx+PARSMSGPTRS] + 8198 00001CBA 87DA xchg bx,dx ; dx = ptr to error msg + 8199 ; bx = restored + 8200 00001CBC E81CF7 call RPrint ; print the message + 8201 00001CBF 5A pop dx ; restore DX + 8202 00001CC0 C3 retn + 8203 + 8204 ;RPrintParse endp + 8205 + 8206 ; 29/01/2023 + 8207 ;PATHCHRCMPR: + 8208 ; MSDOS 3.3 + 8209 ;push dx + 8210 ;mov dl,[slash_chr] + 8211 ;;cmp byte [RSWITCHAR],'/' + 8212 ;cmp [RSWITCHAR],dl + 8213 ;je short RNOSLASHT + 8214 ;;cmp al,'/' + 8215 ;cmp al,dl + 8216 ;je short RET41 ; zf = 1 + 8217 ;RNOSLASHT: + 8218 ;;cmp al,'\' + 8219 ;cmp al,[bslash_chr] + 8220 ;RET41: + 8221 ;pop dx + 8222 ;retn + 8223 + 8224 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8225 IfindE: + 8226 ; MSDOS 3.3 & MSDOS 6.0 + 8227 00001CC1 E80300 call ifind ; find the name + 8228 ;jc short ifind2 ; carry means not found + 8229 ;jmp short Iscasb1 ; scan for = sign + 8230 ; 29/01/2023 + 8231 00001CC4 734E jnc short Iscasb1 + 8232 ifind2: + 8233 00001CC6 C3 retn + 8234 + 8235 ; 29/01/2023 + 8236 + 8237 ; on return of find1, es:di points to beginning of name + 8238 + 8239 ifind: + 8240 00001CC7 FC cld + 8241 00001CC8 E83B00 call Icount0 ; cx = length of name + 8242 00001CCB 8E06[3A04] mov es,[EnvirSeg] + 8243 00001CCF 31FF xor di,di + 8244 ifind1: + 8245 00001CD1 51 push cx + 8246 00001CD2 56 push si + 8247 00001CD3 57 push di + 8248 ifind11: + 8249 00001CD4 AC lodsb + 8250 + 8251 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM + 8252 ; PCDOS 7.1 COMMAND.COM + 8253 %if 1 + 8254 ;ifdef DBCS + 8255 00001CD5 E8A5F7 call ITestKanj + 8256 00001CD8 740F jz short _NotKanj4 + 8257 00001CDA 4E dec si + 8258 00001CDB AD lodsw + 8259 00001CDC 47 inc di + 8260 00001CDD 47 inc di + 8261 00001CDE 263B45FE cmp ax,[es:di-2] + 8262 00001CE2 7511 jne short ifind12 + 8263 00001CE4 49 dec cx + 8264 00001CE5 E2ED loop ifind11 + 8265 00001CE7 EB0C jmp short ifind12 + 8266 _NotKanj4: + 8267 ;endif + 8268 %endif + 8269 00001CE9 E83400 call iupconv + 8270 00001CEC 47 inc di + 8271 00001CED 263A45FF cmp al,[es:di-1] + 8272 00001CF1 7502 jnz short ifind12 + 8273 00001CF3 E2DF loop ifind11 + 8274 ifind12: + 8275 00001CF5 5F pop di + 8276 00001CF6 5E pop si + 8277 00001CF7 59 pop cx + 8278 00001CF8 74CC jz short ifind2 + 8279 00001CFA 51 push cx + 8280 00001CFB E81A00 call Iscasb2 ; scan for a nul + 8281 00001CFE 59 pop cx + 8282 ;cmp byte [es:di],0 + 8283 ;jnz short ifind1 + 8284 ;stc ; indicate not found + 8285 00001CFF 26803D01 cmp byte [es:di],1 + 8286 00001D03 73CC jnb short ifind1 + 8287 ; cf=1 ; indicate not found + 8288 ;ifind2: + 8289 00001D05 C3 retn + 8290 + 8291 ; 29/01/2023 + 8292 Icount0: + 8293 00001D06 1E push ds + 8294 00001D07 07 pop es + 8295 00001D08 89F7 mov di,si + 8296 + 8297 00001D0A 57 push di ; count number of chars until "=" + 8298 00001D0B E80600 call Iscasb1 + 8299 ; 25/09/2018 + 8300 ;jmp short Icountx + 8301 ;push di ; count number of chars until nul + 8302 ;call Iscasb2 + 8303 ;Icountx: + 8304 00001D0E 59 pop cx + 8305 00001D0F 29CF sub di,cx + 8306 00001D11 87F9 xchg di,cx + 8307 00001D13 C3 retn + 8308 + 8309 Iscasb1: + 8310 ; 29/01/2023 + 8311 00001D14 B03D mov al,"=" + 8312 ;mov al,[equalsign] ; [equal_sign] ; scan for an = + 8313 00001D16 EB02 jmp short Iscasbx + 8314 Iscasb2: + 8315 00001D18 30C0 xor al,al ; scan for a nul + 8316 Iscasbx: + 8317 00001D1A B90001 mov cx,256 ; 100h + 8318 00001D1D F2AE repnz scasb + 8319 00001D1F C3 retn + 8320 + 8321 ; 29/01/2023 + 8322 ;IUPCONV: + 8323 ; MSDOS 3.3 + 8324 ;;cmp al,"a" + 8325 ;cmp al,[letter_a] + 8326 ;jb short IRET22 + 8327 ;;cmp al,"z" + 8328 ;cmp al,[letter_z] + 8329 ;ja short IRET22 + 8330 ;sub al,20h ; Lower-case changed to upper-case + 8331 ;IRET22: + 8332 ;retn 8333 - 8334 ; MSDOS 6.0 - 8335 ; ***************************************************************** - 8336 ; * - 8337 ; * ROUTINE: IUPCONV (ADDED BY EMG 4.00) - 8338 ; * - 8339 ; * FUNCTION: This routine returns the upper case equivalent of - 8340 ; * the character in AL from the file upper case table - 8341 ; * in DOS if character if above ascii 128, else - 8342 ; * subtracts 20H if between "a" and "z". - 8343 ; * - 8344 ; * INPUT: DS set to resident - 8345 ; * AL char to be upper cased - 8346 ; * FUCASE_ADDR set to the file upper case table - 8347 ; * - 8348 ; * OUTPUT: AL upper cased character - 8349 ; * - 8350 ; ***************************************************************** - 8351 - 8352 iupconv: ;proc near - 8353 ;assume ds:ResGroup ; + 8334 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8335 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1C32h + 8336 + 8337 ; MSDOS 6.0 + 8338 ; ***************************************************************** + 8339 ; * + 8340 ; * ROUTINE: IUPCONV (ADDED BY EMG 4.00) + 8341 ; * + 8342 ; * FUNCTION: This routine returns the upper case equivalent of + 8343 ; * the character in AL from the file upper case table + 8344 ; * in DOS if character if above ascii 128, else + 8345 ; * subtracts 20H if between "a" and "z". + 8346 ; * + 8347 ; * INPUT: DS set to resident + 8348 ; * AL char to be upper cased + 8349 ; * FUCASE_ADDR set to the file upper case table + 8350 ; * + 8351 ; * OUTPUT: AL upper cased character + 8352 ; * + 8353 ; ***************************************************************** 8354 - 8355 00001D20 3C80 cmp al,80h ; see if char is > ascii 128 - 8356 00001D22 7210 jb short other_fucase ; no - upper case math - 8357 00001D24 2C80 sub al,80h ; only upper 128 chars in table - 8358 00001D26 1E push ds ; - 8359 00001D27 53 push bx ; - 8360 ;lds bx,dword ptr FUCase_Addr+1 ; get table address - 8361 00001D28 C51E[B602] lds bx,[FUCase_Addr+1] - 8362 00001D2C 83C302 add bx,2 ; skip over first word - 8363 ;xlat ds:byte ptr [bx] ; convert to upper case - 8364 00001D2F D7 xlat - 8365 00001D30 5B pop bx ; - 8366 00001D31 1F pop ds ; - 8367 00001D32 EB0A jmp short iupconv_end ; we finished - exit - 8368 - 8369 other_fucase: ; - 8370 ;cmp al,[lcasea] ; [letter_a] ; if between "a" and "z", - 8371 00001D34 3C61 cmp al,'a' - 8372 00001D36 7206 jb short iupconv_end ; subtract 20h to get - 8373 ;cmp al,[lcasez] ; [letter_z] ; upper case equivalent. - 8374 00001D38 3C7A cmp al,'z' - 8375 00001D3A 7702 ja short iupconv_end ; - 8376 00001D3C 2C20 sub al,20h ; Change lower-case to upper - 8377 iupconv_end: ; - 8378 00001D3E C3 retn - 8379 - 8380 ;iupConv endp - 8381 - 8382 ; 29/01/2023 - 8383 init_contc_specialcase: - 8384 ; MSDOS 3.3 & MSDOS 6.0 - 8385 ; This routine is called if control-C - 8386 00001D3F 83C406 add sp,6 ; is type during the date/time prompt - 8387 00001D42 56 push si ; at initialization time. The desired - 8388 00001D43 89D6 mov si,dx ; response is to make it look like the - 8389 00001D45 C74401000D mov word [si+1],0D00h ; user typed by "popping" the - 8390 00001D4A 5E pop si ; INT 21h stuff off the stack, putting - 8391 00001D4B CF iret ; a in the user's buffer, and - 8392 ; returning directly to the user. - 8393 ; In this case the user is TCODE. - 8394 - 8395 ; ---------------------------------------------------------------------------- - 8396 - 8397 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8398 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1C62h (CODERES:0F22h) + 8355 iupconv: ;proc near + 8356 ;assume ds:ResGroup ; + 8357 + 8358 00001D20 3C80 cmp al,80h ; see if char is > ascii 128 + 8359 00001D22 7210 jb short other_fucase ; no - upper case math + 8360 00001D24 2C80 sub al,80h ; only upper 128 chars in table + 8361 00001D26 1E push ds ; + 8362 00001D27 53 push bx ; + 8363 ;lds bx,dword ptr FUCase_Addr+1 ; get table address + 8364 00001D28 C51E[B602] lds bx,[FUCase_Addr+1] + 8365 00001D2C 83C302 add bx,2 ; skip over first word + 8366 ;xlat ds:byte ptr [bx] ; convert to upper case + 8367 00001D2F D7 xlat + 8368 00001D30 5B pop bx ; + 8369 00001D31 1F pop ds ; + 8370 00001D32 EB0A jmp short iupconv_end ; we finished - exit + 8371 + 8372 other_fucase: ; + 8373 ;cmp al,[lcasea] ; [letter_a] ; if between "a" and "z", + 8374 00001D34 3C61 cmp al,'a' + 8375 00001D36 7206 jb short iupconv_end ; subtract 20h to get + 8376 ;cmp al,[lcasez] ; [letter_z] ; upper case equivalent. + 8377 00001D38 3C7A cmp al,'z' + 8378 00001D3A 7702 ja short iupconv_end ; + 8379 00001D3C 2C20 sub al,20h ; Change lower-case to upper + 8380 iupconv_end: ; + 8381 00001D3E C3 retn + 8382 + 8383 ;iupConv endp + 8384 + 8385 ; 29/01/2023 + 8386 init_contc_specialcase: + 8387 ; MSDOS 3.3 & MSDOS 6.0 + 8388 ; This routine is called if control-C + 8389 00001D3F 83C406 add sp,6 ; is type during the date/time prompt + 8390 00001D42 56 push si ; at initialization time. The desired + 8391 00001D43 89D6 mov si,dx ; response is to make it look like the + 8392 00001D45 C74401000D mov word [si+1],0D00h ; user typed by "popping" the + 8393 00001D4A 5E pop si ; INT 21h stuff off the stack, putting + 8394 00001D4B CF iret ; a in the user's buffer, and + 8395 ; returning directly to the user. + 8396 ; In this case the user is TCODE. + 8397 + 8398 ; ---------------------------------------------------------------------------- 8399 - 8400 ; MSDOS 6.0 - 8401 ; **************************************************************** - 8402 ; * - 8403 ; * ROUTINE: Setup_for_messages - 8404 ; * - 8405 ; * FUNCTION: Sets up system for PARSE and EXTENDED ERROR - 8406 ; * messages as follows: + 8400 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8401 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1C62h (CODERES:0F22h) + 8402 + 8403 ; MSDOS 6.0 + 8404 ; **************************************************************** + 8405 ; * + 8406 ; * ROUTINE: Setup_for_messages 8407 ; * - 8408 ; * IF /P and /MSG are entered - 8409 ; * keep PARSE and EXTENDED ERRORS in memory - 8410 ; * ELSE IF /P is entered - 8411 ; * use PARSE and EXTENDED ERRORS on disk - 8412 ; * remove PARSE ERRORS from memory - 8413 ; * ELSE - 8414 ; * remove PARSE ERRORS from memory - 8415 ; * ENDIF - 8416 ; * - 8417 ; * INPUT: PERMCOM Set up with user input - 8418 ; * EXT_MSG Set up with user input - 8419 ; * System set up to retain PARSE ERRORS - 8420 ; * - 8421 ; * OUTPUT: registers unchanged - 8422 ; * - 8423 ; **************************************************************** - 8424 - 8425 setup_for_messages: ;proc near - 8426 - 8427 00001D4C 53 push bx - 8428 00001D4D 1E push ds ; save data segment - 8429 00001D4E 06 push es ; save environment segment - 8430 00001D4F 50 push ax ; - 8431 00001D50 52 push dx ; - 8432 00001D51 57 push di ; - 8433 00001D52 8CC8 mov ax,cs ; get local segment to ES and DS - 8434 00001D54 8ED8 mov ds,ax ; - 8435 00001D56 8EC0 mov es,ax ; - 8436 - 8437 00001D58 803E[A202]00 cmp byte [PermCom],0 ; was permcom set? - 8438 00001D5D 743C jz short no_permcom ; No - don't worry about messages + 8408 ; * FUNCTION: Sets up system for PARSE and EXTENDED ERROR + 8409 ; * messages as follows: + 8410 ; * + 8411 ; * IF /P and /MSG are entered + 8412 ; * keep PARSE and EXTENDED ERRORS in memory + 8413 ; * ELSE IF /P is entered + 8414 ; * use PARSE and EXTENDED ERRORS on disk + 8415 ; * remove PARSE ERRORS from memory + 8416 ; * ELSE + 8417 ; * remove PARSE ERRORS from memory + 8418 ; * ENDIF + 8419 ; * + 8420 ; * INPUT: PERMCOM Set up with user input + 8421 ; * EXT_MSG Set up with user input + 8422 ; * System set up to retain PARSE ERRORS + 8423 ; * + 8424 ; * OUTPUT: registers unchanged + 8425 ; * + 8426 ; **************************************************************** + 8427 + 8428 setup_for_messages: ;proc near + 8429 + 8430 00001D4C 53 push bx + 8431 00001D4D 1E push ds ; save data segment + 8432 00001D4E 06 push es ; save environment segment + 8433 00001D4F 50 push ax ; + 8434 00001D50 52 push dx ; + 8435 00001D51 57 push di ; + 8436 00001D52 8CC8 mov ax,cs ; get local segment to ES and DS + 8437 00001D54 8ED8 mov ds,ax ; + 8438 00001D56 8EC0 mov es,ax ; 8439 - 8440 ;* We're permanent. Install our message services int 2f handler. - 8441 - 8442 00001D5F 06 push es - 8443 ;mov ax,(GET_INTERRUPT_VECTOR shl 8) or 2Fh - 8444 00001D60 B82F35 mov ax,352Fh - 8445 00001D63 CD21 int 21h - 8446 ; DOS - 2+ - GET INTERRUPT VECTOR - 8447 ; AL = interrupt number - 8448 ; Return: ES:BX = value of interrupt vector - 8449 00001D65 891E[AE04] mov [Int2fHandler],bx - 8450 00001D69 8C06[B004] mov [Int2fHandler+2],es - 8451 00001D6D 07 pop es - 8452 - 8453 ; DS = RESGROUP seg addr - 8454 - 8455 ; M005; We will not hook int 2fh on any command.com other than the first. - 8456 ; M005; Carousel loads as a permanent command.com and when we exit Carousel, - 8457 ; M005; it just wipes our arena out. So, int 2fh is still hooked and the - 8458 ; M005; first int 2fh call after exit from Carousel (from the DOS terminate - 8459 ; M005; call) goes off into space. - 8460 - 8461 00001D6E 803E[9926]00 cmp byte [FirstCom],0 ; M005 - 8462 00001D73 7416 je short no_msg_hook ; M005 - 8463 ; - 8464 ; M005; !!!SLIMIEST CAROUSEL HACK OFF ALL!!! - 8465 ; M005; Carousel plays around with the interrupt vector tables. He saves it - 8466 ; M005; before loading a new command.com. Then, it takes hold of the current - 8467 ; M005; command.com's PSP and then looks at all interrupt vectors whose - 8468 ; M005; segment matches the command.com PSP and then updates these segments - 8469 ; M005; to the new command.com's PSP in his saved vector table. Whenever we - 8470 ; M005; we pop into his menu, he puts this saved table into the vector table. - 8471 ; M005; If we now quit, Carousel just wipes out command.com's arena and then - 8472 ; M005; issues a terminate. Unfortunately, the int 2fh vector is pointing at - 8473 ; M005; the command.com that was wiped out and so the next int 2fh call will - 8474 ; M005; bomb. To prevent Carousel from doing this clever(1**$$#) patching, we - 8475 ; M005; renormalize our int 2fh pointer so that its cs is not the same as the - 8476 ; M005; command.com PSP. Now, he does no such patching and our int 2fh vector - 8477 ; M005; remains nice and happy. The renormalized pointer points at a far - 8478 ; M005; jump to the actual int 2fh entry point. - 8479 ; - 8480 00001D75 1E push ds ; M005 - 8481 ;mov dx,offset DATARES:Carousel_i2f_Hook ; M005 - 8482 00001D76 BA[2501] mov dx,Carousel_i2f_Hook - 8483 00001D79 83EA10 sub dx,10h ; renormalize offset; M005 - 8484 00001D7C 8CD8 mov ax,ds ; M005 - 8485 00001D7E 40 inc ax ; Relocated cs ; M005 - 8486 00001D7F 8ED8 mov ds,ax ; M005 - 8487 ;mov ax,(SET_INTERRUPT_VECTOR shl 8) or 2Fh - 8488 00001D81 B82F25 mov ax,252Fh - 8489 00001D84 CD21 int 21h - 8490 ; DOS - SET INTERRUPT VECTOR - 8491 ; AL = interrupt number - 8492 ; DS:DX = new vector to be used for specified interrupt - 8493 00001D86 1F pop ds ; M005 - 8494 ;mov word ptr Carousel_i2f_Hook+3,ds ; M005 - 8495 00001D87 8C1E[2801] mov [Carousel_i2f_Hook+3],ds ; mov [int2fh_segm], ds ; 23/07/2024 - 8496 ; patch in the cs for jump - 8497 no_msg_hook: ; M005 - 8498 00001D8B 803E[9420]01 cmp byte [ext_msg],1 ; SET_EXTENDED_MSG - 8499 00001D90 7516 jne short permcom_end ; no /msg - exit - 8500 - 8501 permcom_slash_msg: ; Keep messages in memory - 8502 ;mov di,offset ResGroup:ExtMsgEnd ; get address of resident end - 8503 ;mov di,0DD8h ; PCDOS 7.1 COMMAND.COM (*) - 8504 00001D92 BF[DC0C] mov di,ExtMsgEnd ; = offset PATRICIDE ; 23/07/2024 (*) - 8505 00001D95 893E[B204] mov [ResMsgEnd],di ; save it - 8506 00001D99 EB0D jmp short permcom_end ; exit - 8507 - 8508 no_permcom: - 8509 ;cmp byte [ext_msg],SET_EXTENDED_MSG ; was /msg specified? - 8510 00001D9B 803E[9420]01 cmp byte [ext_msg],1 - 8511 00001DA0 7506 jne short permcom_end ; no - no error - 8512 ;mov dx,LessArgs_Ptr ; get message number for "Required parameter missing" - 8513 00001DA2 BA0200 mov dx,2 - 8514 00001DA5 E808FF call RPrintParse - 8515 - 8516 permcom_end: - 8517 00001DA8 5F pop di ; - 8518 00001DA9 5A pop dx ; - 8519 00001DAA 58 pop ax ; - 8520 00001DAB 07 pop es ; get environment back - 8521 00001DAC 1F pop ds ; - 8522 00001DAD 5B pop bx - 8523 - 8524 00001DAE C3 retn ; - 8525 - 8526 ;setup_for_messages endp - 8527 - 8528 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8529 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1CC5h + 8440 00001D58 803E[A202]00 cmp byte [PermCom],0 ; was permcom set? + 8441 00001D5D 743C jz short no_permcom ; No - don't worry about messages + 8442 + 8443 ;* We're permanent. Install our message services int 2f handler. + 8444 + 8445 00001D5F 06 push es + 8446 ;mov ax,(GET_INTERRUPT_VECTOR shl 8) or 2Fh + 8447 00001D60 B82F35 mov ax,352Fh + 8448 00001D63 CD21 int 21h + 8449 ; DOS - 2+ - GET INTERRUPT VECTOR + 8450 ; AL = interrupt number + 8451 ; Return: ES:BX = value of interrupt vector + 8452 00001D65 891E[AE04] mov [Int2fHandler],bx + 8453 00001D69 8C06[B004] mov [Int2fHandler+2],es + 8454 00001D6D 07 pop es + 8455 + 8456 ; DS = RESGROUP seg addr + 8457 + 8458 ; M005; We will not hook int 2fh on any command.com other than the first. + 8459 ; M005; Carousel loads as a permanent command.com and when we exit Carousel, + 8460 ; M005; it just wipes our arena out. So, int 2fh is still hooked and the + 8461 ; M005; first int 2fh call after exit from Carousel (from the DOS terminate + 8462 ; M005; call) goes off into space. + 8463 + 8464 00001D6E 803E[9926]00 cmp byte [FirstCom],0 ; M005 + 8465 00001D73 7416 je short no_msg_hook ; M005 + 8466 ; + 8467 ; M005; !!!SLIMIEST CAROUSEL HACK OFF ALL!!! + 8468 ; M005; Carousel plays around with the interrupt vector tables. He saves it + 8469 ; M005; before loading a new command.com. Then, it takes hold of the current + 8470 ; M005; command.com's PSP and then looks at all interrupt vectors whose + 8471 ; M005; segment matches the command.com PSP and then updates these segments + 8472 ; M005; to the new command.com's PSP in his saved vector table. Whenever we + 8473 ; M005; we pop into his menu, he puts this saved table into the vector table. + 8474 ; M005; If we now quit, Carousel just wipes out command.com's arena and then + 8475 ; M005; issues a terminate. Unfortunately, the int 2fh vector is pointing at + 8476 ; M005; the command.com that was wiped out and so the next int 2fh call will + 8477 ; M005; bomb. To prevent Carousel from doing this clever(1**$$#) patching, we + 8478 ; M005; renormalize our int 2fh pointer so that its cs is not the same as the + 8479 ; M005; command.com PSP. Now, he does no such patching and our int 2fh vector + 8480 ; M005; remains nice and happy. The renormalized pointer points at a far + 8481 ; M005; jump to the actual int 2fh entry point. + 8482 ; + 8483 00001D75 1E push ds ; M005 + 8484 ;mov dx,offset DATARES:Carousel_i2f_Hook ; M005 + 8485 00001D76 BA[2501] mov dx,Carousel_i2f_Hook + 8486 00001D79 83EA10 sub dx,10h ; renormalize offset; M005 + 8487 00001D7C 8CD8 mov ax,ds ; M005 + 8488 00001D7E 40 inc ax ; Relocated cs ; M005 + 8489 00001D7F 8ED8 mov ds,ax ; M005 + 8490 ;mov ax,(SET_INTERRUPT_VECTOR shl 8) or 2Fh + 8491 00001D81 B82F25 mov ax,252Fh + 8492 00001D84 CD21 int 21h + 8493 ; DOS - SET INTERRUPT VECTOR + 8494 ; AL = interrupt number + 8495 ; DS:DX = new vector to be used for specified interrupt + 8496 00001D86 1F pop ds ; M005 + 8497 ;mov word ptr Carousel_i2f_Hook+3,ds ; M005 + 8498 00001D87 8C1E[2801] mov [Carousel_i2f_Hook+3],ds ; mov [int2fh_segm], ds ; 23/07/2024 + 8499 ; patch in the cs for jump + 8500 no_msg_hook: ; M005 + 8501 00001D8B 803E[9420]01 cmp byte [ext_msg],1 ; SET_EXTENDED_MSG + 8502 00001D90 7516 jne short permcom_end ; no /msg - exit + 8503 + 8504 permcom_slash_msg: ; Keep messages in memory + 8505 ;mov di,offset ResGroup:ExtMsgEnd ; get address of resident end + 8506 ;mov di,0DD8h ; PCDOS 7.1 COMMAND.COM (*) + 8507 00001D92 BF[DC0C] mov di,ExtMsgEnd ; = offset PATRICIDE ; 23/07/2024 (*) + 8508 00001D95 893E[B204] mov [ResMsgEnd],di ; save it + 8509 00001D99 EB0D jmp short permcom_end ; exit + 8510 + 8511 no_permcom: + 8512 ;cmp byte [ext_msg],SET_EXTENDED_MSG ; was /msg specified? + 8513 00001D9B 803E[9420]01 cmp byte [ext_msg],1 + 8514 00001DA0 7506 jne short permcom_end ; no - no error + 8515 ;mov dx,LessArgs_Ptr ; get message number for "Required parameter missing" + 8516 00001DA2 BA0200 mov dx,2 + 8517 00001DA5 E808FF call RPrintParse + 8518 + 8519 permcom_end: + 8520 00001DA8 5F pop di ; + 8521 00001DA9 5A pop dx ; + 8522 00001DAA 58 pop ax ; + 8523 00001DAB 07 pop es ; get environment back + 8524 00001DAC 1F pop ds ; + 8525 00001DAD 5B pop bx + 8526 + 8527 00001DAE C3 retn ; + 8528 + 8529 ;setup_for_messages endp 8530 - 8531 ; MSDOS 6.0 - 8532 - 8533 ;*** CheckHelp - print help text and exit if /? is on command line - 8534 ; - 8535 ; ENTRY command-line tail at 81h - 8536 ; - 8537 ; EXIT return if /? not found - 8538 ; terminate if /? found + 8531 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8532 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1CC5h + 8533 + 8534 ; MSDOS 6.0 + 8535 + 8536 ;*** CheckHelp - print help text and exit if /? is on command line + 8537 ; + 8538 ; ENTRY command-line tail at 81h 8539 ; - 8540 ; USED AX,BX,CX,DX,SI,DI - 8541 ; - 8542 ; EFFECTS Help text displayed if /? found on command line - 8543 - 8544 CheckHelp: ; proc - 8545 ;assume cs:RESGROUP,ds:RESGROUP,es:RESGROUP,ss:RESGROUP + 8540 ; EXIT return if /? not found + 8541 ; terminate if /? found + 8542 ; + 8543 ; USED AX,BX,CX,DX,SI,DI + 8544 ; + 8545 ; EFFECTS Help text displayed if /? found on command line 8546 - 8547 00001DAF BE8100 mov si,81h ; DS:SI = ptr to command-line tail - 8548 ;mov di,offset RESGROUP:Parse_Command - 8549 00001DB2 BF[9920] mov di,PARSE_COMMAND - 8550 ; ES:DI = ptr to primary parse block - 8551 00001DB5 31C9 xor cx,cx ; CX = # positional param's found - 8552 00001DB7 31D2 xor dx,dx ; DX will be ptr to result buffer - 8553 chParse: - 8554 ;call dword ptr Init_Parse - 8555 00001DB9 FF1E[8E20] call far [Init_Parse] ; call system parser - 8556 - 8557 ;;cmp ax,END_OF_LINE - 8558 ;cmp ax,-1 ; 0FFFFh - 8559 ;je short chRet ; end of command line, no /? found - 8560 ;;cmp ax,RESULT_NO_ERROR - 8561 ;;cmp ax,0 - 8562 ;;je short chWhich ; valid syntax element found - 8563 ;;jmp short chParse ; go parse more - 8564 ;and ax,ax ; cmp ax,0 - 8565 ;jnz short chParse ; jne - 8566 ; 10/06/2023 - 8567 00001DBD 40 inc ax ; cmp ax,-1 - 8568 00001DBE 741B jz short chRet ; 0FFFFh -> 0 - 8569 00001DC0 48 dec ax ; cmp ax,0 - 8570 00001DC1 75F6 jnz short chParse ; 1 -> 0 - 8571 ; ax = 0 - 8572 chWhich: - 8573 ;cmp Comnd1_Syn,offset RESGROUP:Command_?_Syn - 8574 00001DC3 813E[5821][2321] cmp word [COMND1_SYN],COMMAND_?_SYN ; "/?" - 8575 00001DC9 7411 je short chHelp ; /? found - display help & exit - 8576 ;cmp Comnd1_Syn,offset RESGROUP:Command_C_Syn - 8577 00001DCB 813E[5821][0921] cmp word [COMND1_SYN],COMMAND_C_SYN ; "/C" - 8578 ; 06/06/2023 - 8579 00001DD1 7408 je short chRet ; /c found - ignore rest of line - 8580 ; 29/01/2023 - 8581 ;jne short chParse - 8582 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 8583 ; MSDOS 6.0 - 8584 ;cmp Comnd1_Syn,offset RESGROUP:Command_K_Syn - 8585 00001DD3 813E[5821][2F21] cmp word [COMND1_SYN],COMMAND_K_SYN ; "/K" - 8586 ;je short chRet ; /k found - ignore rest of line - 8587 ;jmp short chParse ; anything else - ignore, keep looking - 8588 ; 06/06/2023 - 8589 00001DD9 75DE jne short chParse - 8590 chRet: - 8591 00001DDB C3 retn - 8592 chHelp: - 8593 ;mov si,offset RESGROUP:HelpMsgs ; SI = ptr to msg ptr list - 8594 00001DDC BE[5F26] mov si,HelpMsgs - 8595 chHelpNext: - 8596 00001DDF AD lodsw ; AX = ptr to msg - 8597 00001DE0 09C0 or ax,ax - 8598 00001DE2 7407 jz short chHelpDone ; end of list - all done - 8599 00001DE4 89C2 mov dx,ax ; DX = ptr to msg - 8600 00001DE6 E8F2F5 call RPrint ; display msg - 8601 00001DE9 EBF4 jmp short chHelpNext ; go do next msg - 8602 - 8603 chHelpDone: - 8604 00001DEB CD20 int 20h ; terminate program - 8605 ;chRet: - 8606 00001DED C3 retn - 8607 - 8608 ;CheckHelp endp - 8609 - 8610 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8611 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D03h + 8547 CheckHelp: ; proc + 8548 ;assume cs:RESGROUP,ds:RESGROUP,es:RESGROUP,ss:RESGROUP + 8549 + 8550 00001DAF BE8100 mov si,81h ; DS:SI = ptr to command-line tail + 8551 ;mov di,offset RESGROUP:Parse_Command + 8552 00001DB2 BF[9920] mov di,PARSE_COMMAND + 8553 ; ES:DI = ptr to primary parse block + 8554 00001DB5 31C9 xor cx,cx ; CX = # positional param's found + 8555 00001DB7 31D2 xor dx,dx ; DX will be ptr to result buffer + 8556 chParse: + 8557 ;call dword ptr Init_Parse + 8558 00001DB9 FF1E[8E20] call far [Init_Parse] ; call system parser + 8559 + 8560 ;;cmp ax,END_OF_LINE + 8561 ;cmp ax,-1 ; 0FFFFh + 8562 ;je short chRet ; end of command line, no /? found + 8563 ;;cmp ax,RESULT_NO_ERROR + 8564 ;;cmp ax,0 + 8565 ;;je short chWhich ; valid syntax element found + 8566 ;;jmp short chParse ; go parse more + 8567 ;and ax,ax ; cmp ax,0 + 8568 ;jnz short chParse ; jne + 8569 ; 10/06/2023 + 8570 00001DBD 40 inc ax ; cmp ax,-1 + 8571 00001DBE 741B jz short chRet ; 0FFFFh -> 0 + 8572 00001DC0 48 dec ax ; cmp ax,0 + 8573 00001DC1 75F6 jnz short chParse ; 1 -> 0 + 8574 ; ax = 0 + 8575 chWhich: + 8576 ;cmp Comnd1_Syn,offset RESGROUP:Command_?_Syn + 8577 00001DC3 813E[5821][2321] cmp word [COMND1_SYN],COMMAND_?_SYN ; "/?" + 8578 00001DC9 7411 je short chHelp ; /? found - display help & exit + 8579 ;cmp Comnd1_Syn,offset RESGROUP:Command_C_Syn + 8580 00001DCB 813E[5821][0921] cmp word [COMND1_SYN],COMMAND_C_SYN ; "/C" + 8581 ; 06/06/2023 + 8582 00001DD1 7408 je short chRet ; /c found - ignore rest of line + 8583 ; 29/01/2023 + 8584 ;jne short chParse + 8585 ; 06/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 8586 ; MSDOS 6.0 + 8587 ;cmp Comnd1_Syn,offset RESGROUP:Command_K_Syn + 8588 00001DD3 813E[5821][2F21] cmp word [COMND1_SYN],COMMAND_K_SYN ; "/K" + 8589 ;je short chRet ; /k found - ignore rest of line + 8590 ;jmp short chParse ; anything else - ignore, keep looking + 8591 ; 06/06/2023 + 8592 00001DD9 75DE jne short chParse + 8593 chRet: + 8594 00001DDB C3 retn + 8595 chHelp: + 8596 ;mov si,offset RESGROUP:HelpMsgs ; SI = ptr to msg ptr list + 8597 00001DDC BE[5F26] mov si,HelpMsgs + 8598 chHelpNext: + 8599 00001DDF AD lodsw ; AX = ptr to msg + 8600 00001DE0 09C0 or ax,ax + 8601 00001DE2 7407 jz short chHelpDone ; end of list - all done + 8602 00001DE4 89C2 mov dx,ax ; DX = ptr to msg + 8603 00001DE6 E8F2F5 call RPrint ; display msg + 8604 00001DE9 EBF4 jmp short chHelpNext ; go do next msg + 8605 + 8606 chHelpDone: + 8607 00001DEB CD20 int 20h ; terminate program + 8608 ;chRet: + 8609 00001DED C3 retn + 8610 + 8611 ;CheckHelp endp 8612 - 8613 ; MSDOS 6.0 - 8614 - 8615 ;***** Setup_res_end -- This routine determines the resident size of COMMAND. - 8616 ; - 8617 ; It determines based on 2 factors: - 8618 ; 1. Is this is the first COMMAND? - 8619 ; 2. Is COMMAND to be loaded into HIMEM? - 8620 ; The strategy works as follows: - 8621 ; - 8622 ; if (First COMMAND) - 8623 ; then if (COMMAND in HIMEM) - 8624 ; ResSize = resident_data; - 8625 ; else - 8626 ; ResSize = resident_data + resident_code; - 8627 ; else - 8628 ; ResSize = resident_data; - 8629 ; - 8630 ; Int 2fh calls have been added to determine whether or not we are the first - 8631 ; COMMAND and whether DOS is in HIMEM. + 8613 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8614 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D03h + 8615 + 8616 ; MSDOS 6.0 + 8617 + 8618 ;***** Setup_res_end -- This routine determines the resident size of COMMAND. + 8619 ; + 8620 ; It determines based on 2 factors: + 8621 ; 1. Is this is the first COMMAND? + 8622 ; 2. Is COMMAND to be loaded into HIMEM? + 8623 ; The strategy works as follows: + 8624 ; + 8625 ; if (First COMMAND) + 8626 ; then if (COMMAND in HIMEM) + 8627 ; ResSize = resident_data; + 8628 ; else + 8629 ; ResSize = resident_data + resident_code; + 8630 ; else + 8631 ; ResSize = resident_data; 8632 ; - 8633 ; ENTRY: ResMsgEnd = resident size of data in paras - 8634 ; - 8635 ; EXIT: ResSize = resident size in low memory - 8636 ; - 8637 ; REGISTERS AFFECTED: ax,cx,dx - 8638 ; - 8639 - 8640 GET_HMA_ADDR equ 4A02h - 8641 - 8642 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8643 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1FBFh + 8633 ; Int 2fh calls have been added to determine whether or not we are the first + 8634 ; COMMAND and whether DOS is in HIMEM. + 8635 ; + 8636 ; ENTRY: ResMsgEnd = resident size of data in paras + 8637 ; + 8638 ; EXIT: ResSize = resident size in low memory + 8639 ; + 8640 ; REGISTERS AFFECTED: ax,cx,dx + 8641 ; + 8642 + 8643 GET_HMA_ADDR equ 4A02h 8644 - 8645 Setup_res_end: ;proc near - 8646 - 8647 00001DEE 1E push ds - 8648 00001DEF 8CC8 mov ax,cs - 8649 00001DF1 8ED8 mov ds,ax ;ds = RESGROUP - 8650 ;assume ds:RESGROUP - 8651 - 8652 00001DF3 8B0E[B204] mov cx,[ResMsgEnd] ;set resident size = data - 8653 - 8654 ;ifndef ROMDOS - 8655 - 8656 ;M042 -- Begin changes - 8657 ;If messages are to be kept behind, we need to round up the messages to - 8658 ;the next para boundary. This is because we have a dummy segment between the - 8659 ;data and the resident code segment so that the code segment starts on a - 8660 ;para boundary - 8661 - 8662 ;cmp cx,offset RESGROUP:ExtMsgEnd ;messages to be resident? - 8663 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM - 8664 ;cmp cx,0DD8h - 8665 00001DF7 81F9[DC0C] cmp cx,ExtMsgEnd - 8666 00001DFB 7506 jne short calc_res ;no, continue - 8667 00001DFD 83C10F add cx,15 ;round up - 8668 00001E00 83E1F0 and cx,0FFF0h - 8669 calc_res: - 8670 - 8671 ;M042 -- End changes - 8672 - 8673 ; 18/07/2024 - 8674 ;xor ax,ax - 8675 - 8676 00001E03 803E[9926]01 cmp byte [FirstCom],1 ;is it first command.com? - 8677 ;jne short not_first ;no, do not keep code - 8678 ; 06/06/2023 - 8679 00001E08 751A jne short not_first2 - 8680 - 8681 ;We issue a version check call with al=01 to detect if DOS is in HMA. If so, - 8682 ;bit 4 of dh is set + 8645 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8646 ; PCDOS 7.1 COMMAND.COM - RESGROUP:1FBFh + 8647 + 8648 Setup_res_end: ;proc near + 8649 + 8650 00001DEE 1E push ds + 8651 00001DEF 8CC8 mov ax,cs + 8652 00001DF1 8ED8 mov ds,ax ;ds = RESGROUP + 8653 ;assume ds:RESGROUP + 8654 + 8655 00001DF3 8B0E[B204] mov cx,[ResMsgEnd] ;set resident size = data + 8656 + 8657 ;ifndef ROMDOS + 8658 + 8659 ;M042 -- Begin changes + 8660 ;If messages are to be kept behind, we need to round up the messages to + 8661 ;the next para boundary. This is because we have a dummy segment between the + 8662 ;data and the resident code segment so that the code segment starts on a + 8663 ;para boundary + 8664 + 8665 ;cmp cx,offset RESGROUP:ExtMsgEnd ;messages to be resident? + 8666 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM + 8667 ;cmp cx,0DD8h + 8668 00001DF7 81F9[DC0C] cmp cx,ExtMsgEnd + 8669 00001DFB 7506 jne short calc_res ;no, continue + 8670 00001DFD 83C10F add cx,15 ;round up + 8671 00001E00 83E1F0 and cx,0FFF0h + 8672 calc_res: + 8673 + 8674 ;M042 -- End changes + 8675 + 8676 ; 18/07/2024 + 8677 ;xor ax,ax + 8678 + 8679 00001E03 803E[9926]01 cmp byte [FirstCom],1 ;is it first command.com? + 8680 ;jne short not_first ;no, do not keep code + 8681 ; 06/06/2023 + 8682 00001E08 751A jne short not_first2 8683 - 8684 00001E0A 53 push bx - 8685 00001E0B 51 push cx - 8686 ;mov ax,(Set_CTRL_C_Trapping shl 8) or 06h ;is DOS in HIMEM? ;M013 - 8687 00001E0C B80633 mov ax,3306h - 8688 00001E0F CD21 int 21h - 8689 ; DOS - 5+ Get TRUE Version Number - 8690 ; (BL major, BH minor, DL revision, DH flags) - 8691 00001E11 59 pop cx - 8692 - 8693 ;bugbug: remove version check after testing - 8694 - 8695 00001E12 80FB05 cmp bl,5 ;bl has true version ; M013 - 8696 00001E15 7207 jb short oldver + 8684 ;We issue a version check call with al=01 to detect if DOS is in HMA. If so, + 8685 ;bit 4 of dh is set + 8686 + 8687 00001E0A 53 push bx + 8688 00001E0B 51 push cx + 8689 ;mov ax,(Set_CTRL_C_Trapping shl 8) or 06h ;is DOS in HIMEM? ;M013 + 8690 00001E0C B80633 mov ax,3306h + 8691 00001E0F CD21 int 21h + 8692 ; DOS - 5+ Get TRUE Version Number + 8693 ; (BL major, BH minor, DL revision, DH flags) + 8694 00001E11 59 pop cx + 8695 + 8696 ;bugbug: remove version check after testing 8697 - 8698 00001E17 31C0 xor ax,ax - 8699 00001E19 80E610 and dh,10h ;is DOS in HMA ; M013 - 8700 ;pop bx - 8701 ;jnz short not_first ;DOS in HIMEM, code not - 8702 ; resident - 8703 ; 29/01/2023 - 8704 00001E1C 7503 jnz short not_first_pop - 8705 oldver: - 8706 ;mov ax,offset CODERES:EndCode ;size of code in bytes - 8707 ; 06/06/2023 - 8708 ;;mov ax,81Ah ; MSDOS 5.0 and MSDOS 6.22 COMMAND.COM - 8709 ; 06/06/2023 - 8710 ; 29/01/2023 - 8711 ;mov ax,EndCode-(RCODE_START+100h) ; 23/04/2023 - 8712 ; 03/05/2023 - 8713 00001E1E B87208 mov ax,EndCode-RCODE_START ; 06/06/2023 - 8714 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM - 8715 ;mov ax,894h ; EndCode-RCODE_START - 8716 - 8717 not_first_pop: - 8718 ; 29/01/2023 - 8719 00001E21 5B pop bx - 8720 - 8721 not_first: - 8722 - 8723 ;Note that ax = 0 (side effect of int 2fh), if the code is not to be retained - 8724 - 8725 00001E22 01C1 add cx,ax - 8726 - 8727 not_first2: ; 06/06/2023 - 8728 - 8729 ;endif ;not ROMDOS - 8730 - 8731 00001E24 83C10F add cx,15 ;round up to next para - 8732 00001E27 D1E9 shr cx,1 - 8733 00001E29 D1E9 shr cx,1 - 8734 00001E2B D1E9 shr cx,1 - 8735 00001E2D D1E9 shr cx,1 ;ax = para size of res code - 8736 00001E2F 890E[B404] mov [ResSize],cx ;store resident size - 8737 - 8738 00001E33 1F pop ds - 8739 ;assume ds:nothing - 8740 00001E34 C3 retn - 8741 - 8742 ;ifndef ROMDOS - 8743 - 8744 ;bugbug: remove this code (for version independent COMMAND) after testing - 8745 - 8746 ; 29/01/2023 - 8747 ;oldver: - 8748 ; pop bx - 8749 ; ;mov ax,offset CODERES:EndCode ;size of code in bytes - 8750 ; ;;mov ax,81Ah ; MSDOS 5.0 COMMAND.COM - 8751 ; ; 29/01/2023 - 8752 ; mov ax,EndCode-RCODE_START - 8753 ; jmp short not_first - 8754 - 8755 ;endif ;not ROMDOS - 8756 - 8757 ;setup_res_end endp - 8758 - 8759 ;ifndef ROMDOS - 8760 - 8761 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8762 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D52h + 8698 00001E12 80FB05 cmp bl,5 ;bl has true version ; M013 + 8699 00001E15 7207 jb short oldver + 8700 + 8701 00001E17 31C0 xor ax,ax + 8702 00001E19 80E610 and dh,10h ;is DOS in HMA ; M013 + 8703 ;pop bx + 8704 ;jnz short not_first ;DOS in HIMEM, code not + 8705 ; resident + 8706 ; 29/01/2023 + 8707 00001E1C 7503 jnz short not_first_pop + 8708 oldver: + 8709 ;mov ax,offset CODERES:EndCode ;size of code in bytes + 8710 ; 06/06/2023 + 8711 ;;mov ax,81Ah ; MSDOS 5.0 and MSDOS 6.22 COMMAND.COM + 8712 ; 06/06/2023 + 8713 ; 29/01/2023 + 8714 ;mov ax,EndCode-(RCODE_START+100h) ; 23/04/2023 + 8715 ; 03/05/2023 + 8716 00001E1E B87208 mov ax,EndCode-RCODE_START ; 06/06/2023 + 8717 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM + 8718 ;mov ax,894h ; EndCode-RCODE_START + 8719 + 8720 not_first_pop: + 8721 ; 29/01/2023 + 8722 00001E21 5B pop bx + 8723 + 8724 not_first: + 8725 + 8726 ;Note that ax = 0 (side effect of int 2fh), if the code is not to be retained + 8727 + 8728 00001E22 01C1 add cx,ax + 8729 + 8730 not_first2: ; 06/06/2023 + 8731 + 8732 ;endif ;not ROMDOS + 8733 + 8734 00001E24 83C10F add cx,15 ;round up to next para + 8735 00001E27 D1E9 shr cx,1 + 8736 00001E29 D1E9 shr cx,1 + 8737 00001E2B D1E9 shr cx,1 + 8738 00001E2D D1E9 shr cx,1 ;ax = para size of res code + 8739 00001E2F 890E[B404] mov [ResSize],cx ;store resident size + 8740 + 8741 00001E33 1F pop ds + 8742 ;assume ds:nothing + 8743 00001E34 C3 retn + 8744 + 8745 ;ifndef ROMDOS + 8746 + 8747 ;bugbug: remove this code (for version independent COMMAND) after testing + 8748 + 8749 ; 29/01/2023 + 8750 ;oldver: + 8751 ; pop bx + 8752 ; ;mov ax,offset CODERES:EndCode ;size of code in bytes + 8753 ; ;;mov ax,81Ah ; MSDOS 5.0 COMMAND.COM + 8754 ; ; 29/01/2023 + 8755 ; mov ax,EndCode-RCODE_START + 8756 ; jmp short not_first + 8757 + 8758 ;endif ;not ROMDOS + 8759 + 8760 ;setup_res_end endp + 8761 + 8762 ;ifndef ROMDOS 8763 - 8764 ; MSDOS 6.0 - 8765 ;*** Move_res_code -- This routine moves the resident code to its final - 8766 ; location. We check if DOS is in HIMEM. If so, we try to load ourselves - 8767 ; in HIMEM. If we fail, then we remain low and update ResSize to reflect - 8768 ; the correct resident size. When remaining low, we have to check if we - 8769 ; need to overlay the messages part of the data segment which is determined - 8770 ; by the /msg switch. - 8771 ; - 8772 ; ENTRY: ResMsgEnd = end of resident data - 8773 ; - 8774 ; EXIT: The resident code is either up high or in its final location - 8775 ; down low. + 8764 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8765 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D52h + 8766 + 8767 ; MSDOS 6.0 + 8768 ;*** Move_res_code -- This routine moves the resident code to its final + 8769 ; location. We check if DOS is in HIMEM. If so, we try to load ourselves + 8770 ; in HIMEM. If we fail, then we remain low and update ResSize to reflect + 8771 ; the correct resident size. When remaining low, we have to check if we + 8772 ; need to overlay the messages part of the data segment which is determined + 8773 ; by the /msg switch. + 8774 ; + 8775 ; ENTRY: ResMsgEnd = end of resident data 8776 ; - 8777 ; REGISTERS AFFECTED: ax,bx,cx,dx,si,di - 8778 - 8779 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8780 ; PCDOS 7.1 COMMAND.COM - RESGROUP:200Eh - 8781 - 8782 Move_res_code: ;proc near - 8783 - 8784 00001E35 1E push ds - 8785 00001E36 06 push es + 8777 ; EXIT: The resident code is either up high or in its final location + 8778 ; down low. + 8779 ; + 8780 ; REGISTERS AFFECTED: ax,bx,cx,dx,si,di + 8781 + 8782 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8783 ; PCDOS 7.1 COMMAND.COM - RESGROUP:200Eh + 8784 + 8785 Move_res_code: ;proc near 8786 - 8787 00001E37 8CC8 mov ax,cs - 8788 00001E39 8ED8 mov ds,ax - 8789 ;assume ds:RESGROUP - 8790 - 8791 ;mov ax,(Set_CTRL_C_Trapping shl 8) or 06h ; M013 - 8792 00001E3B B80633 mov ax,3306h - 8793 00001E3E CD21 int 21h ;DOS in HIMEM? - 8794 ; DOS - 5+ Get TRUE Version Number - 8795 ; (BL major, BH minor, DL revision, DH flags) - 8796 - 8797 00001E40 80E610 and dh,10h ; M013 - 8798 00001E43 7517 jnz short move_high ;yes, move code high + 8787 00001E35 1E push ds + 8788 00001E36 06 push es + 8789 + 8790 00001E37 8CC8 mov ax,cs + 8791 00001E39 8ED8 mov ds,ax + 8792 ;assume ds:RESGROUP + 8793 + 8794 ;mov ax,(Set_CTRL_C_Trapping shl 8) or 06h ; M013 + 8795 00001E3B B80633 mov ax,3306h + 8796 00001E3E CD21 int 21h ;DOS in HIMEM? + 8797 ; DOS - 5+ Get TRUE Version Number + 8798 ; (BL major, BH minor, DL revision, DH flags) 8799 - 8800 ;Check if messages have been discarded or not - 8801 - 8802 load_low: - 8803 00001E45 1E push ds - 8804 00001E46 07 pop es ;es = RESGROUP - 8805 00001E47 8B3E[B204] mov di,[ResMsgEnd] ;end offset in DATARES - 8806 ;;mov bx,offset RESGROUP:ExtMsgEnd ;end offset of messages - 8807 ;mov bx,ExtMsgEnd - 8808 - 8809 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8810 %if 0 ; PCDOS 7.1 COMMAND.COM + 8800 00001E40 80E610 and dh,10h ; M013 + 8801 00001E43 7517 jnz short move_high ;yes, move code high + 8802 + 8803 ;Check if messages have been discarded or not + 8804 + 8805 load_low: + 8806 00001E45 1E push ds + 8807 00001E46 07 pop es ;es = RESGROUP + 8808 00001E47 8B3E[B204] mov di,[ResMsgEnd] ;end offset in DATARES + 8809 ;;mov bx,offset RESGROUP:ExtMsgEnd ;end offset of messages + 8810 ;mov bx,ExtMsgEnd 8811 - 8812 ; 29/01/2023 - 8813 cmp di,ExtMsgEnd - 8814 ;cmp di,bx ;are messages to be kept? - 8815 je short no_move ;yes, dont move code - 8816 ;%else - 8817 ; Erdogan Tan - 18/07/2024 - 8818 ;mov bx,ExtMsgEnd ; (this bx is not used after here!) - 8819 %endif - 8820 - 8821 ; 18/07/2024 - 8822 %if 0 - 8823 jmp short setup_move ;es:di points at dest. - 8824 %else - 8825 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8826 setup_move: - 8827 ;mov si,offset RESGROUP:StartCode - 8828 ; 03/05/2023 - 8829 00001E4B BE[100D] mov si,RCODE_START ; Start addr of Resident Code (CODERES segment) - 8830 ; 0D40h for MSDOS 5.0 COMMAND.COM - 8831 ; 0E10h for PCDOS 7.1 COMMAND.COM ; 18/07/2024 - 8832 ;mov cx,offset CODERES:EndCode ;cx = bytes to move - 8833 ;mov cx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM - 8834 ; 06/06/2023 - 8835 ;mov cx,EndCode-(RCODE_START+100h) ; 23/04/2023 - 8836 ; 03/05/2023 - 8837 00001E4E B97208 mov cx,EndCode-RCODE_START ; 06/06/2023 - 8838 ;mov cx,894h ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 - 8839 - 8840 00001E51 FC cld - 8841 00001E52 57 push di ;need di for patching offset - 8842 00001E53 F3A4 rep movsb - 8843 00001E55 5F pop di - 8844 patch_up: - 8845 00001E56 E86A01 call patch_stub - 8846 00001E59 07 pop es - 8847 00001E5A 1F pop ds - 8848 ;assume ds:nothing - 8849 00001E5B C3 retn - 8850 %endif - 8851 - 8852 move_high: - 8853 - 8854 ;We have to call DOS to get the load address in HIMEM for COMMAND - 8855 ;We pass in bx the number of bytes we need + 8812 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8813 %if 0 ; PCDOS 7.1 COMMAND.COM + 8814 + 8815 ; 29/01/2023 + 8816 cmp di,ExtMsgEnd + 8817 ;cmp di,bx ;are messages to be kept? + 8818 je short no_move ;yes, dont move code + 8819 ;%else + 8820 ; Erdogan Tan - 18/07/2024 + 8821 ;mov bx,ExtMsgEnd ; (this bx is not used after here!) + 8822 %endif + 8823 + 8824 ; 18/07/2024 + 8825 %if 0 + 8826 jmp short setup_move ;es:di points at dest. + 8827 %else + 8828 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8829 setup_move: + 8830 ;mov si,offset RESGROUP:StartCode + 8831 ; 03/05/2023 + 8832 00001E4B BE[100D] mov si,RCODE_START ; Start addr of Resident Code (CODERES segment) + 8833 ; 0D40h for MSDOS 5.0 COMMAND.COM + 8834 ; 0E10h for PCDOS 7.1 COMMAND.COM ; 18/07/2024 + 8835 ;mov cx,offset CODERES:EndCode ;cx = bytes to move + 8836 ;mov cx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM + 8837 ; 06/06/2023 + 8838 ;mov cx,EndCode-(RCODE_START+100h) ; 23/04/2023 + 8839 ; 03/05/2023 + 8840 00001E4E B97208 mov cx,EndCode-RCODE_START ; 06/06/2023 + 8841 ;mov cx,894h ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 + 8842 + 8843 00001E51 FC cld + 8844 00001E52 57 push di ;need di for patching offset + 8845 00001E53 F3A4 rep movsb + 8846 00001E55 5F pop di + 8847 patch_up: + 8848 00001E56 E86A01 call patch_stub + 8849 00001E59 07 pop es + 8850 00001E5A 1F pop ds + 8851 ;assume ds:nothing + 8852 00001E5B C3 retn + 8853 %endif + 8854 + 8855 move_high: 8856 - 8857 ;mov bx,offset CODERES:EndCode - 8858 ; 29/01/2023 - 8859 ;;mov bx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM - 8860 ; 06/06/2023 - 8861 ;mov bx,EndCode-(RCODE_START+100h) ; 23/04/2023 ; 06/06/2023 - 8862 ; 03/05/2023 - 8863 00001E5C BB7208 mov bx,EndCode-RCODE_START ; 06/06/2023 - 8864 ; 18/07/2024 - 8865 ;mov bx,894h ; PCDOS 7.1 COMMAND.COM - 8866 - 8867 ;M030; - 8868 ; Set di=0ffffh so that we load low in case no one answers this int 2fh + 8857 ;We have to call DOS to get the load address in HIMEM for COMMAND + 8858 ;We pass in bx the number of bytes we need + 8859 + 8860 ;mov bx,offset CODERES:EndCode + 8861 ; 29/01/2023 + 8862 ;;mov bx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM + 8863 ; 06/06/2023 + 8864 ;mov bx,EndCode-(RCODE_START+100h) ; 23/04/2023 ; 06/06/2023 + 8865 ; 03/05/2023 + 8866 00001E5C BB7208 mov bx,EndCode-RCODE_START ; 06/06/2023 + 8867 ; 18/07/2024 + 8868 ;mov bx,894h ; PCDOS 7.1 COMMAND.COM 8869 - 8870 00001E5F BFFFFF mov di,0FFFFh ;DT - in case no-one handles - 8871 ;this ; M030 - 8872 00001E62 B8024A mov ax,GET_HMA_ADDR ; 4A02h - 8873 00001E65 CD2F int 2Fh - 8874 - 8875 ;If the offset = 0xffff, then no HMA available - 8876 - 8877 00001E67 83FFFF cmp di,0FFFFh ;HMA available? - 8878 00001E6A C606[9600]01 mov byte [ComInHMA],1 ;assume command.com in HMA - 8879 00001E6F 75DA jne short setup_move ;no error, es:di = memory - 8880 - 8881 ;mov byte [ComInHMA],0 ;could not load in HMA - 8882 ; 29/01/2023 - 8883 00001E71 FE0E[9600] dec byte [ComInHMA] ; 1 -> 0 - 8884 - 8885 ;Zero means that we do not have enough HIMEM. Remain low and update - 8886 ;ResSize to reflect this + 8870 ;M030; + 8871 ; Set di=0ffffh so that we load low in case no one answers this int 2fh + 8872 + 8873 00001E5F BFFFFF mov di,0FFFFh ;DT - in case no-one handles + 8874 ;this ; M030 + 8875 00001E62 B8024A mov ax,GET_HMA_ADDR ; 4A02h + 8876 00001E65 CD2F int 2Fh + 8877 + 8878 ;If the offset = 0xffff, then no HMA available + 8879 + 8880 00001E67 83FFFF cmp di,0FFFFh ;HMA available? + 8881 00001E6A C606[9600]01 mov byte [ComInHMA],1 ;assume command.com in HMA + 8882 00001E6F 75DA jne short setup_move ;no error, es:di = memory + 8883 + 8884 ;mov byte [ComInHMA],0 ;could not load in HMA + 8885 ; 29/01/2023 + 8886 00001E71 FE0E[9600] dec byte [ComInHMA] ; 1 -> 0 8887 - 8888 00001E75 8B0E[B204] mov cx,[ResMsgEnd] ;size of data in bytes - 8889 ;;mov ax,offset CODERES:EndCode ;size of code in bytes - 8890 ;;mov ax,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM - 8891 ;mov ax,EndCode-RCODE_START - 8892 ;add cx,ax - 8893 ; 06/06/2023 - 8894 ; 29/01/2023 - 8895 ;add cx,(EndCode-(RCODE_START+100h))+15 ; 23/04/2023 ; 06/06/2023 - 8896 ;add cx,15 ;round up to next para - 8897 ; 03/05/2023 - 8898 00001E79 81C18108 add cx,(EndCode-RCODE_START)+15 ; 06/06/2023 - 8899 00001E7D D1E9 shr cx,1 - 8900 00001E7F D1E9 shr cx,1 - 8901 00001E81 D1E9 shr cx,1 - 8902 00001E83 D1E9 shr cx,1 ;ax = para size of res code - 8903 00001E85 890E[B404] mov [ResSize],cx ;store resident size - 8904 00001E89 EBBA jmp short load_low ;let code remain low - 8905 - 8906 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8907 %if 0 ; PCDOS 7.1 COMMAND.COM - 8908 no_move: - 8909 ; 05/05/2023 - 8910 ;mov cl,4 - 8911 add di,0Fh - 8912 and di,0FFF0h ;round it to a para offset - 8913 jmp short patch_up - 8914 - 8915 setup_move: - 8916 ;mov si,offset RESGROUP:StartCode - 8917 ; 03/05/2023 - 8918 mov si,RCODE_START ; Start addr of Resident Code (CODERES segment) - 8919 ; 0D40h for MSDOS 5.0 COMMAND.COM - 8920 ; 0E10h for PCDOS 7.1 COMMAND.COM ; 18/07/2024 - 8921 ;mov cx,offset CODERES:EndCode ;cx = bytes to move - 8922 ;mov cx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM - 8923 ; 06/06/2023 - 8924 ;mov cx,EndCode-(RCODE_START+100h) ; 23/04/2023 - 8925 ; 03/05/2023 - 8926 mov cx,EndCode-RCODE_START ; 06/06/2023 - 8927 ;mov cx,894h ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 - 8928 - 8929 cld - 8930 push di ;need di for patching offset - 8931 rep movsb - 8932 pop di - 8933 - 8934 patch_up: - 8935 call patch_stub - 8936 pop es - 8937 pop ds - 8938 ;assume ds:nothing - 8939 retn - 8940 %endif - 8941 - 8942 ;Move_res_code endp - 8943 - 8944 ;else ;ROMDOS - 8945 ; - 8946 ;;*** Move_res_code - ROMDOS version - locate ROM resident - 8947 ; - 8948 ;Move_res_code proc - 8949 ; - 8950 ; push es - 8951 ; - 8952 ; invoke FindROMRes ; ES:DI = ptr to ROM resident code - 8953 ; call patch_stub + 8888 ;Zero means that we do not have enough HIMEM. Remain low and update + 8889 ;ResSize to reflect this + 8890 + 8891 00001E75 8B0E[B204] mov cx,[ResMsgEnd] ;size of data in bytes + 8892 ;;mov ax,offset CODERES:EndCode ;size of code in bytes + 8893 ;;mov ax,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM + 8894 ;mov ax,EndCode-RCODE_START + 8895 ;add cx,ax + 8896 ; 06/06/2023 + 8897 ; 29/01/2023 + 8898 ;add cx,(EndCode-(RCODE_START+100h))+15 ; 23/04/2023 ; 06/06/2023 + 8899 ;add cx,15 ;round up to next para + 8900 ; 03/05/2023 + 8901 00001E79 81C18108 add cx,(EndCode-RCODE_START)+15 ; 06/06/2023 + 8902 00001E7D D1E9 shr cx,1 + 8903 00001E7F D1E9 shr cx,1 + 8904 00001E81 D1E9 shr cx,1 + 8905 00001E83 D1E9 shr cx,1 ;ax = para size of res code + 8906 00001E85 890E[B404] mov [ResSize],cx ;store resident size + 8907 00001E89 EBBA jmp short load_low ;let code remain low + 8908 + 8909 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8910 %if 0 ; PCDOS 7.1 COMMAND.COM + 8911 no_move: + 8912 ; 05/05/2023 + 8913 ;mov cl,4 + 8914 add di,0Fh + 8915 and di,0FFF0h ;round it to a para offset + 8916 jmp short patch_up + 8917 + 8918 setup_move: + 8919 ;mov si,offset RESGROUP:StartCode + 8920 ; 03/05/2023 + 8921 mov si,RCODE_START ; Start addr of Resident Code (CODERES segment) + 8922 ; 0D40h for MSDOS 5.0 COMMAND.COM + 8923 ; 0E10h for PCDOS 7.1 COMMAND.COM ; 18/07/2024 + 8924 ;mov cx,offset CODERES:EndCode ;cx = bytes to move + 8925 ;mov cx,81Ah ; MSDOS 5.0 & MSDOS 6.22 COMMAND.COM + 8926 ; 06/06/2023 + 8927 ;mov cx,EndCode-(RCODE_START+100h) ; 23/04/2023 + 8928 ; 03/05/2023 + 8929 mov cx,EndCode-RCODE_START ; 06/06/2023 + 8930 ;mov cx,894h ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 + 8931 + 8932 cld + 8933 push di ;need di for patching offset + 8934 rep movsb + 8935 pop di + 8936 + 8937 patch_up: + 8938 call patch_stub + 8939 pop es + 8940 pop ds + 8941 ;assume ds:nothing + 8942 retn + 8943 %endif + 8944 + 8945 ;Move_res_code endp + 8946 + 8947 ;else ;ROMDOS + 8948 ; + 8949 ;;*** Move_res_code - ROMDOS version - locate ROM resident + 8950 ; + 8951 ;Move_res_code proc + 8952 ; + 8953 ; push es 8954 ; - 8955 ; pop es - 8956 ; ret + 8955 ; invoke FindROMRes ; ES:DI = ptr to ROM resident code + 8956 ; call patch_stub 8957 ; - 8958 ;Move_res_code endp - 8959 ; - 8960 ; assume ds:NOTHING ; to match ending assume above - 8961 ; - 8962 ;endif ;ROMDOS - 8963 - 8964 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 8965 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D52h + 8958 ; pop es + 8959 ; ret + 8960 ; + 8961 ;Move_res_code endp + 8962 ; + 8963 ; assume ds:NOTHING ; to match ending assume above + 8964 ; + 8965 ;endif ;ROMDOS 8966 - 8967 ; MSDOS 6.0 - 8968 ;*** Alloc_env -- This routine allocates the temporary environment for the - 8969 ; Init code to initialize the COMSPEC. This is not a complete environment. - 8970 ; Later on, at EndInit time, a proper sized environment is allocated and - 8971 ; the contents of this temporary environment are copied to it. This routine - 8972 ; will not be called in case a valid environment is passed to command.com - 8973 ; - 8974 ; ENTRY: FirstCom and initial EnvirSeg set - 8975 ; - 8976 ; EXIT: ax = EnvirSeg = segment of newly allocated environment segment - 8977 ; - 8978 ; REGISTERS AFFECTED: ax,bx,cx,dx - 8979 - 8980 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 8981 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1F3Fh + 8967 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 8968 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1D52h + 8969 + 8970 ; MSDOS 6.0 + 8971 ;*** Alloc_env -- This routine allocates the temporary environment for the + 8972 ; Init code to initialize the COMSPEC. This is not a complete environment. + 8973 ; Later on, at EndInit time, a proper sized environment is allocated and + 8974 ; the contents of this temporary environment are copied to it. This routine + 8975 ; will not be called in case a valid environment is passed to command.com + 8976 ; + 8977 ; ENTRY: FirstCom and initial EnvirSeg set + 8978 ; + 8979 ; EXIT: ax = EnvirSeg = segment of newly allocated environment segment + 8980 ; + 8981 ; REGISTERS AFFECTED: ax,bx,cx,dx 8982 - 8983 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 8984 ; PCDOS 7.1 COMMAND.COM - RESGROUP:206Eh + 8983 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 8984 ; MSDOS 6.22 COMMAND.COM - RESGROUP:1F3Fh 8985 - 8986 alloc_env: ;proc near - 8987 ;assume ds:nothing - 8988 - 8989 00001E8B 1E push ds - 8990 00001E8C 06 push es - 8991 00001E8D 56 push si - 8992 00001E8E 57 push di - 8993 - 8994 ; 07/06/2023 - 8995 ; 29/01/2023 - MSDOS 6.0 COMMAND.COM - 8996 ;%if 0 - 8997 %if 1 - 8998 00001E8F 16 push ss - 8999 00001E90 1F pop ds - 9000 ;assume ds:RESGROUP - 9001 - 9002 00001E91 A1[3A04] mov ax,[EnvirSeg] - 9003 - 9004 00001E94 803E[5420]00 cmp byte [AllocedEnv],0 - 9005 00001E99 7403 je short alloc_cont - 9006 00001E9B E91A01 jmp alloc_done - 9007 - 9008 alloc_cont: - 9009 00001E9E 29FF sub di,di ; default start - 9010 ;mov bx,SIZE Environment ; default size needed - 9011 ; 29/01/2023 - 9012 00001EA0 BBA600 mov bx,ENVIRONSIZ ; mov bx,180 ; 07/06/2023 - 9013 ; mov bx,166 ; 18/07/2024 ; PCDOS 7.1 - 9014 00001EA3 803E[9926]00 cmp byte [FirstCom],0 ; first COMMAND.COM? - 9015 00001EA8 7462 je short alloc_seg ; no - 9016 - 9017 ; Check EnvirSeg; if non-zero, then scan it for PATH and COMSPEC; - 9018 ; Record their respective locations and do not add the default vars. + 8986 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 8987 ; PCDOS 7.1 COMMAND.COM - RESGROUP:206Eh + 8988 + 8989 alloc_env: ;proc near + 8990 ;assume ds:nothing + 8991 + 8992 00001E8B 1E push ds + 8993 00001E8C 06 push es + 8994 00001E8D 56 push si + 8995 00001E8E 57 push di + 8996 + 8997 ; 07/06/2023 + 8998 ; 29/01/2023 - MSDOS 6.0 COMMAND.COM + 8999 ;%if 0 + 9000 %if 1 + 9001 00001E8F 16 push ss + 9002 00001E90 1F pop ds + 9003 ;assume ds:RESGROUP + 9004 + 9005 00001E91 A1[3A04] mov ax,[EnvirSeg] + 9006 + 9007 00001E94 803E[5420]00 cmp byte [AllocedEnv],0 + 9008 00001E99 7403 je short alloc_cont + 9009 00001E9B E91A01 jmp alloc_done + 9010 + 9011 alloc_cont: + 9012 00001E9E 29FF sub di,di ; default start + 9013 ;mov bx,SIZE Environment ; default size needed + 9014 ; 29/01/2023 + 9015 00001EA0 BBA600 mov bx,ENVIRONSIZ ; mov bx,180 ; 07/06/2023 + 9016 ; mov bx,166 ; 18/07/2024 ; PCDOS 7.1 + 9017 00001EA3 803E[9926]00 cmp byte [FirstCom],0 ; first COMMAND.COM? + 9018 00001EA8 7462 je short alloc_seg ; no 9019 - 9020 00001EAA 09C0 or ax,ax - 9021 00001EAC 745A jz short alloc_new ; no previous environment + 9020 ; Check EnvirSeg; if non-zero, then scan it for PATH and COMSPEC; + 9021 ; Record their respective locations and do not add the default vars. 9022 - 9023 00001EAE 8EC0 mov es,ax - 9024 ;assume es:nothing + 9023 00001EAA 09C0 or ax,ax + 9024 00001EAC 745A jz short alloc_new ; no previous environment 9025 - 9026 _find_path: - 9027 00001EB0 B000 mov al,0 - 9028 00001EB2 29FF sub di,di - 9029 comp_path: - 9030 00001EB4 AE scasb ; end of env? - 9031 00001EB5 7417 je short _find_prompt ; yes - 9032 ;je short find_comspec ; 18/07/2024 ; PCDOS 7.1 COMMAND.COM - 9033 00001EB7 4F dec di - 9034 00001EB8 B90500 mov cx,PathStrLen ; mov cx,5 ; "PATH=" - 9035 ;mov si,offset RESGROUP:PathString - 9036 00001EBB BE[5520] mov si,PathString ; "PATH=" - 9037 00001EBE F3A6 repe cmpsb - 9038 00001EC0 7407 je short got_path - 9039 00001EC2 B90001 mov cx,256 - 9040 00001EC5 F2AE repne scasb ; find next NULL - 9041 00001EC7 EBEB jmp short comp_path - 9042 - 9043 got_path: - 9044 00001EC9 C606[5520]00 mov byte [PathString],0 ; don't add it + 9026 00001EAE 8EC0 mov es,ax + 9027 ;assume es:nothing + 9028 + 9029 _find_path: + 9030 00001EB0 B000 mov al,0 + 9031 00001EB2 29FF sub di,di + 9032 comp_path: + 9033 00001EB4 AE scasb ; end of env? + 9034 00001EB5 7417 je short _find_prompt ; yes + 9035 ;je short find_comspec ; 18/07/2024 ; PCDOS 7.1 COMMAND.COM + 9036 00001EB7 4F dec di + 9037 00001EB8 B90500 mov cx,PathStrLen ; mov cx,5 ; "PATH=" + 9038 ;mov si,offset RESGROUP:PathString + 9039 00001EBB BE[5520] mov si,PathString ; "PATH=" + 9040 00001EBE F3A6 repe cmpsb + 9041 00001EC0 7407 je short got_path + 9042 00001EC2 B90001 mov cx,256 + 9043 00001EC5 F2AE repne scasb ; find next NULL + 9044 00001EC7 EBEB jmp short comp_path 9045 - 9046 _find_prompt: - 9047 - 9048 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 9049 ;%if 0 ; PCDOS 7.1 COMMAND.COM - 9050 ; sub di,di - 9051 ;comp_prompt: - 9052 ; scasb ; end of env? - 9053 ; je short find_comspec ; yes - 9054 ; dec di - 9055 ; mov cx,PrmptStrLen2 ; mov cx,7 - 9056 ; ;mov si,offset RESGROUP:PrmptString - 9057 ; mov si,PrmptString ; "PROMPT=$P$G" - 9058 ; repe cmpsb - 9059 ; je short got_prompt - 9060 ; mov cx,256 - 9061 ; repne scasb ; find next NULL - 9062 ; jmp short comp_prompt - 9063 ; - 9064 ;got_prompt: - 9065 ; mov byte [PrmptString],0 ; don't add it - 9066 ;%endif - 9067 - 9068 find_comspec: - 9069 00001ECE 29FF sub di,di - 9070 comp_comspec: - 9071 00001ED0 AE scasb ; end of env? - 9072 00001ED1 7423 je short got_envend ; yes - 9073 00001ED3 4F dec di - 9074 00001ED4 B90800 mov cx,ComspStrLen ; mov cx,8 - 9075 ;mov si,offset RESGROUP:ComspString - 9076 00001ED7 BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" - 9077 00001EDA F3A6 repe cmpsb - 9078 00001EDC 7407 je short got_comspec - 9079 00001EDE B90001 mov cx,256 - 9080 00001EE1 F2AE repne scasb ; find next NULL - 9081 00001EE3 EBEB jmp short comp_comspec - 9082 - 9083 got_comspec: - 9084 00001EE5 893E[6B20] mov [ComspOffset],di + 9046 got_path: + 9047 00001EC9 C606[5520]00 mov byte [PathString],0 ; don't add it + 9048 + 9049 _find_prompt: + 9050 + 9051 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 9052 ;%if 0 ; PCDOS 7.1 COMMAND.COM + 9053 ; sub di,di + 9054 ;comp_prompt: + 9055 ; scasb ; end of env? + 9056 ; je short find_comspec ; yes + 9057 ; dec di + 9058 ; mov cx,PrmptStrLen2 ; mov cx,7 + 9059 ; ;mov si,offset RESGROUP:PrmptString + 9060 ; mov si,PrmptString ; "PROMPT=$P$G" + 9061 ; repe cmpsb + 9062 ; je short got_prompt + 9063 ; mov cx,256 + 9064 ; repne scasb ; find next NULL + 9065 ; jmp short comp_prompt + 9066 ; + 9067 ;got_prompt: + 9068 ; mov byte [PrmptString],0 ; don't add it + 9069 ;%endif + 9070 + 9071 find_comspec: + 9072 00001ECE 29FF sub di,di + 9073 comp_comspec: + 9074 00001ED0 AE scasb ; end of env? + 9075 00001ED1 7423 je short got_envend ; yes + 9076 00001ED3 4F dec di + 9077 00001ED4 B90800 mov cx,ComspStrLen ; mov cx,8 + 9078 ;mov si,offset RESGROUP:ComspString + 9079 00001ED7 BE[6D20] mov si,ComspString ; "COMSPEC=\COMMAND.COM" + 9080 00001EDA F3A6 repe cmpsb + 9081 00001EDC 7407 je short got_comspec + 9082 00001EDE B90001 mov cx,256 + 9083 00001EE1 F2AE repne scasb ; find next NULL + 9084 00001EE3 EBEB jmp short comp_comspec 9085 - 9086 find_envend: - 9087 00001EE9 29FF sub di,di - 9088 00001EEB B90080 mov cx,ENVBIG ; 32768 ; max env size - 9089 comp_envend: - 9090 00001EEE 49 dec cx ; - 9091 00001EEF AE scasb ; end of env? - 9092 00001EF0 7404 je short got_envend ; yes - 9093 00001EF2 F2AE repne scasb - 9094 00001EF4 EBF8 jmp short comp_envend - 9095 - 9096 got_envend: - 9097 00001EF6 4F dec di - 9098 ; 07/06/2023 - 9099 00001EF7 8D9DA600 lea bx,[di+ENVIRONSIZ] ; add room for the basics - 9100 ; 18/07/2024 - 9101 ;lea bx,[di+166] ; PCDOS 7.1 COMMAND.COM - ENVIRONSIZ = 166 - 9102 - 9103 ; We want to fall through to alloc_new and set up default - 9104 ; path and prompt ONLY IF this is the first process; in all other - 9105 ; cases, we assume it is a bad idea to try editing the user's environment - 9106 - 9107 00001EFB 1E push ds - 9108 ;mov ds,ds:[PDB_Parent_Pid] - 9109 00001EFC 8E1E1600 mov ds,[PDB.PARENT_PID] - 9110 ;cmp ds:[PDB_Parent_Pid],0 ; is parent's parent pid field 0? - 9111 00001F00 833E160000 cmp word [PDB.PARENT_PID],0 - 9112 00001F05 1F pop ds - 9113 00001F06 7504 jne short alloc_seg ; no, we're not the first process - 9114 ; so don't muck with the env. - 9115 alloc_new: - 9116 00001F08 FE06[5420] inc byte [AllocedEnv] ; note we have virgin env. - 9117 - 9118 alloc_seg: - 9119 - 9120 ; Allocate default environment size - 9121 - 9122 00001F0C 89D9 mov cx,bx ; save byte-granular size in CX - 9123 00001F0E 83C30F add bx,15 - 9124 00001F11 D1EB shr bx,1 - 9125 00001F13 D1EB shr bx,1 - 9126 00001F15 D1EB shr bx,1 - 9127 00001F17 D1EB shr bx,1 ; BX = # paras - 9128 00001F19 B448 mov ah,ALLOC ; 48h - 9129 00001F1B CD21 int 21h - 9130 00001F1D 7303 jnc short init_ok - 9131 00001F1F E99B00 jmp init_nomem ; insufficient memory, error - 9132 - 9133 ; If a previous environment existed (ie, DI != 0), then copy it into - 9134 ; the new buffer + 9086 got_comspec: + 9087 00001EE5 893E[6B20] mov [ComspOffset],di + 9088 + 9089 find_envend: + 9090 00001EE9 29FF sub di,di + 9091 00001EEB B90080 mov cx,ENVBIG ; 32768 ; max env size + 9092 comp_envend: + 9093 00001EEE 49 dec cx ; + 9094 00001EEF AE scasb ; end of env? + 9095 00001EF0 7404 je short got_envend ; yes + 9096 00001EF2 F2AE repne scasb + 9097 00001EF4 EBF8 jmp short comp_envend + 9098 + 9099 got_envend: + 9100 00001EF6 4F dec di + 9101 ; 07/06/2023 + 9102 00001EF7 8D9DA600 lea bx,[di+ENVIRONSIZ] ; add room for the basics + 9103 ; 18/07/2024 + 9104 ;lea bx,[di+166] ; PCDOS 7.1 COMMAND.COM - ENVIRONSIZ = 166 + 9105 + 9106 ; We want to fall through to alloc_new and set up default + 9107 ; path and prompt ONLY IF this is the first process; in all other + 9108 ; cases, we assume it is a bad idea to try editing the user's environment + 9109 + 9110 00001EFB 1E push ds + 9111 ;mov ds,ds:[PDB_Parent_Pid] + 9112 00001EFC 8E1E1600 mov ds,[PDB.PARENT_PID] + 9113 ;cmp ds:[PDB_Parent_Pid],0 ; is parent's parent pid field 0? + 9114 00001F00 833E160000 cmp word [PDB.PARENT_PID],0 + 9115 00001F05 1F pop ds + 9116 00001F06 7504 jne short alloc_seg ; no, we're not the first process + 9117 ; so don't muck with the env. + 9118 alloc_new: + 9119 00001F08 FE06[5420] inc byte [AllocedEnv] ; note we have virgin env. + 9120 + 9121 alloc_seg: + 9122 + 9123 ; Allocate default environment size + 9124 + 9125 00001F0C 89D9 mov cx,bx ; save byte-granular size in CX + 9126 00001F0E 83C30F add bx,15 + 9127 00001F11 D1EB shr bx,1 + 9128 00001F13 D1EB shr bx,1 + 9129 00001F15 D1EB shr bx,1 + 9130 00001F17 D1EB shr bx,1 ; BX = # paras + 9131 00001F19 B448 mov ah,ALLOC ; 48h + 9132 00001F1B CD21 int 21h + 9133 00001F1D 7303 jnc short init_ok + 9134 00001F1F E99B00 jmp init_nomem ; insufficient memory, error 9135 - 9136 init_ok: - 9137 00001F22 8EC0 mov es,ax - 9138 ;assume es:nothing ; es = temp env segment - 9139 - 9140 00001F24 09FF or di,di - 9141 00001F26 7412 jz short copy_path + 9136 ; If a previous environment existed (ie, DI != 0), then copy it into + 9137 ; the new buffer + 9138 + 9139 init_ok: + 9140 00001F22 8EC0 mov es,ax + 9141 ;assume es:nothing ; es = temp env segment 9142 - 9143 00001F28 51 push cx - 9144 00001F29 1E push ds - 9145 00001F2A 8E1E[3A04] mov ds,[EnvirSeg] - 9146 ;assume ds:nothing - 9147 00001F2E 29F6 sub si,si - 9148 00001F30 89F9 mov cx,di - 9149 00001F32 29FF sub di,di - 9150 00001F34 F3A4 rep movsb - 9151 00001F36 1F pop ds - 9152 ;assume ds:RESGROUP - 9153 00001F37 59 pop cx - 9154 00001F38 29F9 sub cx,di - 9155 - 9156 copy_path: - 9157 - 9158 ; First clear out (the rest of) the buffer - 9159 - 9160 00001F3A 57 push di - 9161 00001F3B 29C0 sub ax,ax - 9162 00001F3D F3AA rep stosb - 9163 00001F3F 5F pop di - 9164 - 9165 ; Initialize the path string (PATH=) first - 9166 - 9167 ;mov si,offset RESGROUP:PathString ; DS:SI -> "PATH=\0" - 9168 00001F40 BE[5520] mov si,PathString - 9169 00001F43 3804 cmp byte [si],al ; add it? - 9170 00001F45 744D je short init_prompt ; no - 9171 ;;mov cx,PathStrLen+1 ; - 9172 ;mov cx,6 ; db "PATH=",0 - 9173 ; 14/08/2024 - 9174 00001F47 B106 mov cl,6 - 9175 00001F49 F3A4 rep movsb ; - 9176 00001F4B 3806[5420] cmp [AllocedEnv],al ; virgin env? - 9177 00001F4F 7443 je short init_prompt ; no - 9178 - 9179 ; Establish a more reasonable default for the PATH - 9180 - 9181 ;mov ah,GET_DEFAULT_DRIVE - 9182 00001F51 B419 mov ah,19h - 9183 00001F53 CD21 int 21h - 9184 00001F55 0441 add al,'A' ; convert to letter - 9185 00001F57 A2[5B20] mov [DefPathString],al ; - 9186 00001F5A A2[6220] mov [DefPath2String],al ; now our default paths are complete - 9187 - 9188 00001F5D B200 mov dl,0 ; get dir for default drive - 9189 00001F5F 1E push ds ; - 9190 00001F60 06 push es ; - 9191 00001F61 1F pop ds ; - 9192 00001F62 C6055C mov byte [di],'\' ; - 9193 00001F65 8D7501 lea si,[di+1] ; set DS:SI -> available space - 9194 ;mov ah,Current_Dir ; - 9195 00001F68 B447 mov ah,47h - 9196 00001F6A CD21 int 21h ; - 9197 00001F6C 1F pop ds ; - 9198 - 9199 ;mov cx,9 ; db "C:\MSDOS",0 - 9200 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM - 9201 ;;mov cx,7 ; db "C:\DOS",0 - 9202 ;mov cx,DefPathStrLen+1 ; 7 - 9203 ; 14/08/2024 ; ch = 0 - 9204 00001F6D B107 mov cl,DefPathStrLen+1 ; 7 - 9205 - 9206 ;mov dx,offset RESGROUP:DefPathString - 9207 00001F6F BA[5B20] mov dx,DefPathString ; "C:\MSDOS" - 9208 ; 18/07/2024 ; "C:\DOS" for PCDOS 7.1 COMMAND.COM - 9209 00001F72 89D6 mov si,dx ; - 9210 ;mov ah,CHDir ; - 9211 00001F74 B43B mov ah,3Bh - 9212 00001F76 CD21 int 21h ; - 9213 00001F78 730D jnc short init_setpath ; DefPathString exists! - 9214 - 9215 ;mov cx,7 ; db "C:\DOS",0 - 9216 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM - 9217 ;;mov cx,9 ; db "C:\MSDOS",0 - 9218 ;mov cx,DefPath2StrLen+1 ; 9 - 9219 ; 14/08/2024 ; ch = 0 - 9220 00001F7A B109 mov cl,DefPath2StrLen+1 ; 9 - 9221 - 9222 ;mov dx,offset RESGROUP:DefPath2String - 9223 00001F7C BA[6220] mov dx,DefPath2String ; "C:\DOS" - 9224 ; 18/07/2024 ; "C:\MSDOS" for PCDOS 7.1 COMMAND.COM - 9225 00001F7F 89D6 mov si,dx ; - 9226 ;mov ah,CHDir ; - 9227 00001F81 B43B mov ah,3Bh - 9228 00001F83 CD21 int 21h ; - 9229 00001F85 720D jc short init_prompt ; DefPath2String doesn't exist - 9230 - 9231 init_setpath: - 9232 00001F87 89FA mov dx,di ; success - 9233 00001F89 1E push ds ; so restore prev dir - 9234 00001F8A 06 push es ; - 9235 00001F8B 1F pop ds ; DS:DX -> prev dir - 9236 ;mov ah,CHDir ; - 9237 00001F8C B43B mov ah,3Bh - 9238 00001F8E CD21 int 21h ; - 9239 00001F90 1F pop ds ; - 9240 - 9241 00001F91 4F dec di ; then copy in DefPathString - 9242 00001F92 F3A4 rep movsb ; DS:SI -> "C:\\DOS\0" + 9143 00001F24 09FF or di,di + 9144 00001F26 7412 jz short copy_path + 9145 + 9146 00001F28 51 push cx + 9147 00001F29 1E push ds + 9148 00001F2A 8E1E[3A04] mov ds,[EnvirSeg] + 9149 ;assume ds:nothing + 9150 00001F2E 29F6 sub si,si + 9151 00001F30 89F9 mov cx,di + 9152 00001F32 29FF sub di,di + 9153 00001F34 F3A4 rep movsb + 9154 00001F36 1F pop ds + 9155 ;assume ds:RESGROUP + 9156 00001F37 59 pop cx + 9157 00001F38 29F9 sub cx,di + 9158 + 9159 copy_path: + 9160 + 9161 ; First clear out (the rest of) the buffer + 9162 + 9163 00001F3A 57 push di + 9164 00001F3B 29C0 sub ax,ax + 9165 00001F3D F3AA rep stosb + 9166 00001F3F 5F pop di + 9167 + 9168 ; Initialize the path string (PATH=) first + 9169 + 9170 ;mov si,offset RESGROUP:PathString ; DS:SI -> "PATH=\0" + 9171 00001F40 BE[5520] mov si,PathString + 9172 00001F43 3804 cmp byte [si],al ; add it? + 9173 00001F45 744D je short init_prompt ; no + 9174 ;;mov cx,PathStrLen+1 ; + 9175 ;mov cx,6 ; db "PATH=",0 + 9176 ; 14/08/2024 + 9177 00001F47 B106 mov cl,6 + 9178 00001F49 F3A4 rep movsb ; + 9179 00001F4B 3806[5420] cmp [AllocedEnv],al ; virgin env? + 9180 00001F4F 7443 je short init_prompt ; no + 9181 + 9182 ; Establish a more reasonable default for the PATH + 9183 + 9184 ;mov ah,GET_DEFAULT_DRIVE + 9185 00001F51 B419 mov ah,19h + 9186 00001F53 CD21 int 21h + 9187 00001F55 0441 add al,'A' ; convert to letter + 9188 00001F57 A2[5B20] mov [DefPathString],al ; + 9189 00001F5A A2[6220] mov [DefPath2String],al ; now our default paths are complete + 9190 + 9191 00001F5D B200 mov dl,0 ; get dir for default drive + 9192 00001F5F 1E push ds ; + 9193 00001F60 06 push es ; + 9194 00001F61 1F pop ds ; + 9195 00001F62 C6055C mov byte [di],'\' ; + 9196 00001F65 8D7501 lea si,[di+1] ; set DS:SI -> available space + 9197 ;mov ah,Current_Dir ; + 9198 00001F68 B447 mov ah,47h + 9199 00001F6A CD21 int 21h ; + 9200 00001F6C 1F pop ds ; + 9201 + 9202 ;mov cx,9 ; db "C:\MSDOS",0 + 9203 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM + 9204 ;;mov cx,7 ; db "C:\DOS",0 + 9205 ;mov cx,DefPathStrLen+1 ; 7 + 9206 ; 14/08/2024 ; ch = 0 + 9207 00001F6D B107 mov cl,DefPathStrLen+1 ; 7 + 9208 + 9209 ;mov dx,offset RESGROUP:DefPathString + 9210 00001F6F BA[5B20] mov dx,DefPathString ; "C:\MSDOS" + 9211 ; 18/07/2024 ; "C:\DOS" for PCDOS 7.1 COMMAND.COM + 9212 00001F72 89D6 mov si,dx ; + 9213 ;mov ah,CHDir ; + 9214 00001F74 B43B mov ah,3Bh + 9215 00001F76 CD21 int 21h ; + 9216 00001F78 730D jnc short init_setpath ; DefPathString exists! + 9217 + 9218 ;mov cx,7 ; db "C:\DOS",0 + 9219 ; 18/07/2024 - PCDOS 7.1 COMMAND.COM + 9220 ;;mov cx,9 ; db "C:\MSDOS",0 + 9221 ;mov cx,DefPath2StrLen+1 ; 9 + 9222 ; 14/08/2024 ; ch = 0 + 9223 00001F7A B109 mov cl,DefPath2StrLen+1 ; 9 + 9224 + 9225 ;mov dx,offset RESGROUP:DefPath2String + 9226 00001F7C BA[6220] mov dx,DefPath2String ; "C:\DOS" + 9227 ; 18/07/2024 ; "C:\MSDOS" for PCDOS 7.1 COMMAND.COM + 9228 00001F7F 89D6 mov si,dx ; + 9229 ;mov ah,CHDir ; + 9230 00001F81 B43B mov ah,3Bh + 9231 00001F83 CD21 int 21h ; + 9232 00001F85 720D jc short init_prompt ; DefPath2String doesn't exist + 9233 + 9234 init_setpath: + 9235 00001F87 89FA mov dx,di ; success + 9236 00001F89 1E push ds ; so restore prev dir + 9237 00001F8A 06 push es ; + 9238 00001F8B 1F pop ds ; DS:DX -> prev dir + 9239 ;mov ah,CHDir ; + 9240 00001F8C B43B mov ah,3Bh + 9241 00001F8E CD21 int 21h ; + 9242 00001F90 1F pop ds ; 9243 - 9244 ; Initialize the default prompt - 9245 - 9246 init_prompt: - 9247 ;init_compec: ; 18/07/2024 (PCDOS 7.1 COMMAND.COM - RESGROUP:217Ah) + 9244 00001F91 4F dec di ; then copy in DefPathString + 9245 00001F92 F3A4 rep movsb ; DS:SI -> "C:\\DOS\0" + 9246 + 9247 ; Initialize the default prompt 9248 - 9249 00001F94 57 push di ; - 9250 00001F95 29C0 sub ax,ax ; - 9251 ;mov cx,64 ; insure any data read in - 9252 ; 14/08/2024 - 9253 00001F97 B140 mov cl,64 ; ch = 0 - 9254 00001F99 F3AA rep stosb ; from Current_Dir is zapped - 9255 00001F9B 5F pop di ; - 9256 - 9257 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 9258 ;%if 0 ; PCDOS 7.1 COMMAND.COM - 9259 ; cmp [AllocedEnv],al ; virgin env? - 9260 ; je short init_comspec ; no - 9261 ; ;mov si,offset RESGROUP:PrmptString ; DS:SI -> "PROMPT=$P$G\0" - 9262 ; mov si,PrmptString - 9263 ; cmp [si],al ; add it? - 9264 ; je short init_comspec ; no - 9265 ; ;mov cx,PrmptStrLen+1 ; - 9266 ; mov cl,12 ; db "PROMPT=$P$G",0 - 9267 ; rep movsb ; - 9268 ;%endif - 9269 - 9270 ; Initialize the Comspec string - 9271 - 9272 init_comspec: - 9273 ; 18/07/2024 (PCDOS 7.1 COMMAND.COM - RESGROUP:2183h) + 9249 init_prompt: + 9250 ;init_compec: ; 18/07/2024 (PCDOS 7.1 COMMAND.COM - RESGROUP:217Ah) + 9251 + 9252 00001F94 57 push di ; + 9253 00001F95 29C0 sub ax,ax ; + 9254 ;mov cx,64 ; insure any data read in + 9255 ; 14/08/2024 + 9256 00001F97 B140 mov cl,64 ; ch = 0 + 9257 00001F99 F3AA rep stosb ; from Current_Dir is zapped + 9258 00001F9B 5F pop di ; + 9259 + 9260 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 9261 ;%if 0 ; PCDOS 7.1 COMMAND.COM + 9262 ; cmp [AllocedEnv],al ; virgin env? + 9263 ; je short init_comspec ; no + 9264 ; ;mov si,offset RESGROUP:PrmptString ; DS:SI -> "PROMPT=$P$G\0" + 9265 ; mov si,PrmptString + 9266 ; cmp [si],al ; add it? + 9267 ; je short init_comspec ; no + 9268 ; ;mov cx,PrmptStrLen+1 ; + 9269 ; mov cl,12 ; db "PROMPT=$P$G",0 + 9270 ; rep movsb ; + 9271 ;%endif + 9272 + 9273 ; Initialize the Comspec string 9274 - 9275 00001F9C 3906[6B20] cmp [ComspOffset],ax ; add it? - 9276 00001FA0 750D jne short init_done ; no - 9277 ;lea ax,[di+8] - 9278 00001FA2 8D4508 lea ax,[di+ComspStrLen] ; - 9279 00001FA5 A3[6B20] mov [ComspOffset],ax ; - 9280 ;mov si,offset RESGROUP:ComspString ; DS:SI -> "COMSPEC=\\COMMAND.COM\0" - 9281 00001FA8 BE[6D20] mov si,ComspString - 9282 ; 23/07/2024 - 9283 ;mov cx,ComspStrLen2+1 ; - 9284 ;;mov cx,21 ; db "COMSPEC=\COMMAND.COM",0 - 9285 ; 14/08/2024 - 9286 00001FAB B115 mov cl,ComspStrLen2+1 ; 21 - 9287 00001FAD F3A4 rep movsb ; - 9288 - 9289 init_done: - 9290 00001FAF 8CC0 mov ax,es ; return env seg in ax - 9291 00001FB1 A3[3A04] mov [EnvirSeg],ax ; save env seg - 9292 00001FB4 FE06[5420] inc byte [AllocedEnv] ; remember that *we* alloced it - 9293 %endif - 9294 - 9295 ; 07/06/2023 - 9296 ; 29/01/2023 - MSDOS 5.0 COMMAND.COM (RESGROUP:1DC4h) - 9297 ;%if 1 - 9298 %if 0 - 9299 ;mov bx,10 - 9300 mov bx,ENVIRONSIZ>>4 ; 160/16 - 9301 mov ah,48h - 9302 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 9303 ; BX = number of 16-byte paragraphs desired - 9304 jc short init_nomem - 9305 - 9306 init_ok: - 9307 mov es,ax - 9308 ;assume es:nothing ; es = temp env segment - 9309 - 9310 xor di,di - 9311 mov ax,di - 9312 ;mov cx,160 - 9313 mov cx,ENVIRONSIZ - 9314 rep stosb - 9315 - 9316 init_pathstr: - 9317 - 9318 ; Initialize the path string (PATH=) first - 9319 - 9320 push ss - 9321 pop ds + 9275 init_comspec: + 9276 ; 18/07/2024 (PCDOS 7.1 COMMAND.COM - RESGROUP:2183h) + 9277 + 9278 00001F9C 3906[6B20] cmp [ComspOffset],ax ; add it? + 9279 00001FA0 750D jne short init_done ; no + 9280 ;lea ax,[di+8] + 9281 00001FA2 8D4508 lea ax,[di+ComspStrLen] ; + 9282 00001FA5 A3[6B20] mov [ComspOffset],ax ; + 9283 ;mov si,offset RESGROUP:ComspString ; DS:SI -> "COMSPEC=\\COMMAND.COM\0" + 9284 00001FA8 BE[6D20] mov si,ComspString + 9285 ; 23/07/2024 + 9286 ;mov cx,ComspStrLen2+1 ; + 9287 ;;mov cx,21 ; db "COMSPEC=\COMMAND.COM",0 + 9288 ; 14/08/2024 + 9289 00001FAB B115 mov cl,ComspStrLen2+1 ; 21 + 9290 00001FAD F3A4 rep movsb ; + 9291 + 9292 init_done: + 9293 00001FAF 8CC0 mov ax,es ; return env seg in ax + 9294 00001FB1 A3[3A04] mov [EnvirSeg],ax ; save env seg + 9295 00001FB4 FE06[5420] inc byte [AllocedEnv] ; remember that *we* alloced it + 9296 %endif + 9297 + 9298 ; 07/06/2023 + 9299 ; 29/01/2023 - MSDOS 5.0 COMMAND.COM (RESGROUP:1DC4h) + 9300 ;%if 1 + 9301 %if 0 + 9302 ;mov bx,10 + 9303 mov bx,ENVIRONSIZ>>4 ; 160/16 + 9304 mov ah,48h + 9305 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 9306 ; BX = number of 16-byte paragraphs desired + 9307 jc short init_nomem + 9308 + 9309 init_ok: + 9310 mov es,ax + 9311 ;assume es:nothing ; es = temp env segment + 9312 + 9313 xor di,di + 9314 mov ax,di + 9315 ;mov cx,160 + 9316 mov cx,ENVIRONSIZ + 9317 rep stosb + 9318 + 9319 init_pathstr: + 9320 + 9321 ; Initialize the path string (PATH=) first 9322 - 9323 ;mov si,offset RESGROUP:PathString ; DS:SI -> "PATH=\0" - 9324 mov si,PathString - 9325 mov di,0 - 9326 init_cp_pathstr: - 9327 lodsb - 9328 stosb - 9329 or al,al - 9330 jnz short init_cp_pathstr - 9331 - 9332 ; Initialize the Comspec string - 9333 - 9334 init_comspec: - 9335 ;mov si,offset RESGROUP:ComspString ; DS:SI -> "COMSPEC=\\COMMAND.COM\0" - 9336 mov si,ComspString - 9337 ; 05/05/2023 - 9338 mov di,6 - 9339 init_cp_compstr: - 9340 lodsb - 9341 stosb - 9342 or al,al - 9343 jnz short init_cp_compstr - 9344 - 9345 init_done: - 9346 mov ax,es ; return env seg in ax - 9347 ;mov [EnvirSeg],ax ; save env seg - 9348 ;inc byte [AllocedEnv] ; remember that *we* alloced it - 9349 %endif - 9350 - 9351 ; 29/01/2023 - 9352 alloc_done: - 9353 00001FB8 5F pop di - 9354 00001FB9 5E pop si - 9355 00001FBA 07 pop es - 9356 00001FBB 1F pop ds - 9357 ;assume ds:nothing - 9358 00001FBC C3 retn - 9359 - 9360 ; 29/01/2023 - 9361 init_nomem: + 9323 push ss + 9324 pop ds + 9325 + 9326 ;mov si,offset RESGROUP:PathString ; DS:SI -> "PATH=\0" + 9327 mov si,PathString + 9328 mov di,0 + 9329 init_cp_pathstr: + 9330 lodsb + 9331 stosb + 9332 or al,al + 9333 jnz short init_cp_pathstr + 9334 + 9335 ; Initialize the Comspec string + 9336 + 9337 init_comspec: + 9338 ;mov si,offset RESGROUP:ComspString ; DS:SI -> "COMSPEC=\\COMMAND.COM\0" + 9339 mov si,ComspString + 9340 ; 05/05/2023 + 9341 mov di,6 + 9342 init_cp_compstr: + 9343 lodsb + 9344 stosb + 9345 or al,al + 9346 jnz short init_cp_compstr + 9347 + 9348 init_done: + 9349 mov ax,es ; return env seg in ax + 9350 ;mov [EnvirSeg],ax ; save env seg + 9351 ;inc byte [AllocedEnv] ; remember that *we* alloced it + 9352 %endif + 9353 + 9354 ; 29/01/2023 + 9355 alloc_done: + 9356 00001FB8 5F pop di + 9357 00001FB9 5E pop si + 9358 00001FBA 07 pop es + 9359 00001FBB 1F pop ds + 9360 ;assume ds:nothing + 9361 00001FBC C3 retn 9362 - 9363 ;We call the error routine from here. This routine never returns. It either - 9364 ;terminates COMMAND with error( if it is not the first invocation ) or hangs - 9365 ;the system ( if it is the first COMMAND.COM ). - 9366 - 9367 00001FBD E80000 call Alloc_error - 9368 - 9369 ;Alloc_env endp - 9370 - 9371 ;*** Alloc_error: This routine just jumps to the actual label where we - 9372 ; check if this is a permanent or secondary command.com and take the - 9373 ; appropriate action. - 9374 ; - 9375 ; ENTRY: ds = RESGROUP = DATARES - 9376 ; - 9377 ; EXIT: None - does not return - 9378 ; - 9379 ; REGISTERS AFFECTED: Does not matter - 9380 ; - 9381 - 9382 ;public Alloc_error - 9383 Alloc_error: ;proc near + 9363 ; 29/01/2023 + 9364 init_nomem: + 9365 + 9366 ;We call the error routine from here. This routine never returns. It either + 9367 ;terminates COMMAND with error( if it is not the first invocation ) or hangs + 9368 ;the system ( if it is the first COMMAND.COM ). + 9369 + 9370 00001FBD E80000 call Alloc_error + 9371 + 9372 ;Alloc_env endp + 9373 + 9374 ;*** Alloc_error: This routine just jumps to the actual label where we + 9375 ; check if this is a permanent or secondary command.com and take the + 9376 ; appropriate action. + 9377 ; + 9378 ; ENTRY: ds = RESGROUP = DATARES + 9379 ; + 9380 ; EXIT: None - does not return + 9381 ; + 9382 ; REGISTERS AFFECTED: Does not matter + 9383 ; 9384 - 9385 ;jmp RESGROUP:BadMemErr - 9386 ; 29/01/2023 - 9387 00001FC0 E955EE jmp BadMemErr - 9388 - 9389 ;Alloc_error endp - 9390 - 9391 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9392 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1DFFh + 9385 ;public Alloc_error + 9386 Alloc_error: ;proc near + 9387 + 9388 ;jmp RESGROUP:BadMemErr + 9389 ; 29/01/2023 + 9390 00001FC0 E955EE jmp BadMemErr + 9391 + 9392 ;Alloc_error endp 9393 - 9394 ; MSDOS 6.0 - 9395 ;*** Patch_stub -- This routine patches in the segment and offset values in - 9396 ; the stub table of the various entry points in the resident code segment. - 9397 ; Some of them are interrupt entry points and some of them are entries from - 9398 ; the transient to the resident code segment. - 9399 ; - 9400 ; ENTRY: ds = RESGROUP - 9401 ; es:di = segment:offset of final location of resident code + 9394 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9395 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1DFFh + 9396 + 9397 ; MSDOS 6.0 + 9398 ;*** Patch_stub -- This routine patches in the segment and offset values in + 9399 ; the stub table of the various entry points in the resident code segment. + 9400 ; Some of them are interrupt entry points and some of them are entries from + 9401 ; the transient to the resident code segment. 9402 ; - 9403 ; EXIT: All segments and offsets patched into the stub table - 9404 ; - 9405 ; REGISTERS AFFECTED: ax, bx, cx, dx, si, di - 9406 - 9407 patch_stub: ;proc near - 9408 ;assume ds:RESGROUP - 9409 - 9410 00001FC3 06 push es - 9411 - 9412 00001FC4 8CC3 mov bx,es ;bx = resident code segment - 9413 00001FC6 89FA mov dx,di - 9414 ;mov di,offset DATARES:Int2f_Entry - 9415 00001FC8 BF[6600] mov di,Int2f_Entry - 9416 ;mov si,offset RESGROUP:Reloc_Table - 9417 00001FCB BE[7F26] mov si,Reloc_Table - 9418 00001FCE 1E push ds - 9419 00001FCF 07 pop es ;es = RESGROUP = DATARES - 9420 - 9421 ;bx:dx = segment:offset of resident code segment - 9422 ;es:di = entry point table in stub - 9423 ;ds:si = offset table in INIT segment -- offsets of code entry points now - 9424 - 9425 ;mov cx,NUM_RELOC_ENTRIES ;number of entry points - 9426 00001FD0 B90B00 mov cx,11 ; MSDOS 5.0 COMMAND.COM - 9427 patchlp: - 9428 00001FD3 AD lodsw ;get current offset - 9429 00001FD4 01D0 add ax,dx ;offset it by code seg location - 9430 00001FD6 AB stosw ;store offset - 9431 00001FD7 89D8 mov ax,bx - 9432 00001FD9 AB stosw ;store segment - 9433 00001FDA E2F7 loop patchlp - 9434 - 9435 00001FDC 07 pop es - 9436 00001FDD C3 retn + 9403 ; ENTRY: ds = RESGROUP + 9404 ; es:di = segment:offset of final location of resident code + 9405 ; + 9406 ; EXIT: All segments and offsets patched into the stub table + 9407 ; + 9408 ; REGISTERS AFFECTED: ax, bx, cx, dx, si, di + 9409 + 9410 patch_stub: ;proc near + 9411 ;assume ds:RESGROUP + 9412 + 9413 00001FC3 06 push es + 9414 + 9415 00001FC4 8CC3 mov bx,es ;bx = resident code segment + 9416 00001FC6 89FA mov dx,di + 9417 ;mov di,offset DATARES:Int2f_Entry + 9418 00001FC8 BF[6600] mov di,Int2f_Entry + 9419 ;mov si,offset RESGROUP:Reloc_Table + 9420 00001FCB BE[7F26] mov si,Reloc_Table + 9421 00001FCE 1E push ds + 9422 00001FCF 07 pop es ;es = RESGROUP = DATARES + 9423 + 9424 ;bx:dx = segment:offset of resident code segment + 9425 ;es:di = entry point table in stub + 9426 ;ds:si = offset table in INIT segment -- offsets of code entry points now + 9427 + 9428 ;mov cx,NUM_RELOC_ENTRIES ;number of entry points + 9429 00001FD0 B90B00 mov cx,11 ; MSDOS 5.0 COMMAND.COM + 9430 patchlp: + 9431 00001FD3 AD lodsw ;get current offset + 9432 00001FD4 01D0 add ax,dx ;offset it by code seg location + 9433 00001FD6 AB stosw ;store offset + 9434 00001FD7 89D8 mov ax,bx + 9435 00001FD9 AB stosw ;store segment + 9436 00001FDA E2F7 loop patchlp 9437 - 9438 ;Patch_stub endp - 9439 - 9440 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9441 - 9442 ; MSDOS 6.0 - 9443 ;*** Patch_segs -- This routine patches the segment values in the dword - 9444 ; pointers that the stub uses to jump to the actual handler. These values - 9445 ; are temporarily needed to handle these interrupts if they occur before - 9446 ; the resident is relocated to its final position and all the addresses of - 9447 ; the handlers have been updated. - 9448 ; - 9449 ; ENTRY: es = PSP segment = code segment - 9450 ; - 9451 ; EXIT: Current segment values patched into the jump table in the - 9452 ; stub. + 9438 00001FDC 07 pop es + 9439 00001FDD C3 retn + 9440 + 9441 ;Patch_stub endp + 9442 + 9443 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9444 + 9445 ; MSDOS 6.0 + 9446 ;*** Patch_segs -- This routine patches the segment values in the dword + 9447 ; pointers that the stub uses to jump to the actual handler. These values + 9448 ; are temporarily needed to handle these interrupts if they occur before + 9449 ; the resident is relocated to its final position and all the addresses of + 9450 ; the handlers have been updated. + 9451 ; + 9452 ; ENTRY: es = PSP segment = code segment 9453 ; - 9454 ; REGISTERS AFFECTED: ax, cx, di - 9455 - 9456 patch_segs: ;proc near - 9457 - 9458 ;mov di,offset RESGROUP:Int2f_Entry - 9459 00001FDE BF[6600] mov di,Int2f_Entry - 9460 00001FE1 B90400 mov cx,4 ;we have to patch 4 handlers - 9461 00001FE4 83C702 add di,2 - 9462 00001FE7 8CC0 mov ax,es - 9463 pseglp: - 9464 00001FE9 AB stosw ;store the segment value - 9465 00001FEA 83C702 add di,2 ;skip the next offset value - 9466 00001FED E2FA loop pseglp - 9467 - 9468 00001FEF C3 retn - 9469 - 9470 ;Patch_segs endp - 9471 - 9472 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9473 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1E2Ch + 9454 ; EXIT: Current segment values patched into the jump table in the + 9455 ; stub. + 9456 ; + 9457 ; REGISTERS AFFECTED: ax, cx, di + 9458 + 9459 patch_segs: ;proc near + 9460 + 9461 ;mov di,offset RESGROUP:Int2f_Entry + 9462 00001FDE BF[6600] mov di,Int2f_Entry + 9463 00001FE1 B90400 mov cx,4 ;we have to patch 4 handlers + 9464 00001FE4 83C702 add di,2 + 9465 00001FE7 8CC0 mov ax,es + 9466 pseglp: + 9467 00001FE9 AB stosw ;store the segment value + 9468 00001FEA 83C702 add di,2 ;skip the next offset value + 9469 00001FED E2FA loop pseglp + 9470 + 9471 00001FEF C3 retn + 9472 + 9473 ;Patch_segs endp 9474 - 9475 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 9476 ; MSDOS 6.22 COMMAND.COM - RESGROUP:20D8h + 9475 ; 29/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9476 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1E2Ch 9477 - 9478 ; MSDOS 6.0 - 9479 ;*** get_XMMAddr -- This routine gets the call address for the XMM driver - 9480 ; by issuing the appropriate int 2fh. This is stored in a stub variable - 9481 ; and is used by the stub when we have to jump to the resident in HMA - 9482 ; - 9483 ; ENTRY: ds = RESGROUP - 9484 ; - 9485 ; EXIT: XMMCallAddr = XMM driver far call address - 9486 ; - 9487 ; REGISTERS AFFECTED: - 9488 ; - 9489 - 9490 get_XMMAddr: ;proc near - 9491 ;assume ds:RESGROUP + 9478 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9479 ; MSDOS 6.22 COMMAND.COM - RESGROUP:20D8h + 9480 + 9481 ; MSDOS 6.0 + 9482 ;*** get_XMMAddr -- This routine gets the call address for the XMM driver + 9483 ; by issuing the appropriate int 2fh. This is stored in a stub variable + 9484 ; and is used by the stub when we have to jump to the resident in HMA + 9485 ; + 9486 ; ENTRY: ds = RESGROUP + 9487 ; + 9488 ; EXIT: XMMCallAddr = XMM driver far call address + 9489 ; + 9490 ; REGISTERS AFFECTED: + 9491 ; 9492 - 9493 00001FF0 06 push es - 9494 - 9495 ;mov ax,XMM_MULTIPLEX SHL 8 + XMM_INSTALL_CHECK - 9496 00001FF1 B80043 mov ax,4300h - 9497 00001FF4 CD2F int 2Fh - 9498 ; - Multiplex - XMS - INSTALLATION CHECK - 9499 ; Return: AL = 80h XMS driver installed - 9500 ; AL <> 80h no driver - 9501 00001FF6 3C80 cmp al,80h ; Q: installed - 9502 00001FF8 750D jne short cXMMexit ; N: set error, quit - 9503 ; - 9504 ; get the XMM control functions entry point, save it, we - 9505 ; need to call it later. + 9493 get_XMMAddr: ;proc near + 9494 ;assume ds:RESGROUP + 9495 + 9496 00001FF0 06 push es + 9497 + 9498 ;mov ax,XMM_MULTIPLEX SHL 8 + XMM_INSTALL_CHECK + 9499 00001FF1 B80043 mov ax,4300h + 9500 00001FF4 CD2F int 2Fh + 9501 ; - Multiplex - XMS - INSTALLATION CHECK + 9502 ; Return: AL = 80h XMS driver installed + 9503 ; AL <> 80h no driver + 9504 00001FF6 3C80 cmp al,80h ; Q: installed + 9505 00001FF8 750D jne short cXMMexit ; N: set error, quit 9506 ; - 9507 ;mov ax,XMM_MULTIPLEX SHL 8 + XMM_FUNCTION_ADDR - 9508 00001FFA B81043 mov ax,4310h - 9509 00001FFD CD2F int 2Fh - 9510 ; - Multiplex - XMS - GET DRIVER ADDRESS - 9511 ; Return: ES:BX -> driver entry point - 9512 - 9513 00001FFF 891E[9200] mov [XMMCallAddr], bx - 9514 00002003 8C06[9400] mov [XMMCallAddr+2],es - 9515 cXMMexit: - 9516 00002007 07 pop es - 9517 00002008 C3 retn ; done - 9518 - 9519 ;get_XMMAddr endp - 9520 - 9521 ;============================================================================= - 9522 ; UNINIT.ASM, MSDOS 6.0, 1991 - 9523 ;============================================================================= - 9524 ; 24/09/2018 - Retro DOS v3.0 - 9525 - 9526 ; (30/04/2018 - Retro DOS v2.0, MSDOS 2.11 COMMAND.COM) - 9527 - 9528 ; TITLE COMMAND Initialization messages - 9529 - 9530 ;INIT SEGMENT PUBLIC PARA - 9531 - 9532 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9533 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9507 ; get the XMM control functions entry point, save it, we + 9508 ; need to call it later. + 9509 ; + 9510 ;mov ax,XMM_MULTIPLEX SHL 8 + XMM_FUNCTION_ADDR + 9511 00001FFA B81043 mov ax,4310h + 9512 00001FFD CD2F int 2Fh + 9513 ; - Multiplex - XMS - GET DRIVER ADDRESS + 9514 ; Return: ES:BX -> driver entry point + 9515 + 9516 00001FFF 891E[9200] mov [XMMCallAddr], bx + 9517 00002003 8C06[9400] mov [XMMCallAddr+2],es + 9518 cXMMexit: + 9519 00002007 07 pop es + 9520 00002008 C3 retn ; done + 9521 + 9522 ;get_XMMAddr endp + 9523 + 9524 ;============================================================================= + 9525 ; UNINIT.ASM, MSDOS 6.0, 1991 + 9526 ;============================================================================= + 9527 ; 24/09/2018 - Retro DOS v3.0 + 9528 + 9529 ; (30/04/2018 - Retro DOS v2.0, MSDOS 2.11 COMMAND.COM) + 9530 + 9531 ; TITLE COMMAND Initialization messages + 9532 + 9533 ;INIT SEGMENT PUBLIC PARA 9534 - 9535 ; 25/09/2018 - 9536 ; (15 bytes filler) - 9537 00002009 00 db 0 - 9538 ;db "25/9/2018 ETAN" - 9539 ; 30/01/2023 - 9540 ;db "30/1/2023 ETAN" - 9541 ; 19/06/2023 - 9542 ;db "19/6/2023 ETAN" - 9543 ; 31/07/2024 - 9544 0000200A 31342F382F32303234- db "14/8/2024 ETAN" ; 14/08/2024 - 9544 00002013 204554414E - 9545 00002018 00 db 0 - 9546 - 9547 ; 30/01/2023 - 9548 %if 0 - 9549 ; MSDOS 3.3 COMMAND.COM - offset 145Eh - 9550 ;dw 0 - 9551 COPYRIGHTMSG: ; MSDOS 3.3 COMMAND.COM - offset 1460h - 9552 db 0Dh,0Ah - 9553 db 0Dh,0Ah - 9554 db 'Microsoft(R) MS-DOS(R) Version 3.30' + 9535 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9536 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9537 + 9538 ; 25/09/2018 + 9539 ; (15 bytes filler) + 9540 00002009 00 db 0 + 9541 ;db "25/9/2018 ETAN" + 9542 ; 30/01/2023 + 9543 ;db "30/1/2023 ETAN" + 9544 ; 19/06/2023 + 9545 ;db "19/6/2023 ETAN" + 9546 ; 31/07/2024 + 9547 0000200A 31352F382F32303234- db "15/8/2024 ETAN" ; 15/08/2024 + 9547 00002013 204554414E + 9548 00002018 00 db 0 + 9549 + 9550 ; 30/01/2023 + 9551 %if 0 + 9552 ; MSDOS 3.3 COMMAND.COM - offset 145Eh + 9553 ;dw 0 + 9554 COPYRIGHTMSG: ; MSDOS 3.3 COMMAND.COM - offset 1460h 9555 db 0Dh,0Ah - 9556 db ' (C)Copyright Microsoft Corp 1981-1987 ' - 9557 db ' ',0Dh,0Ah - 9558 db ' ', - 9559 db 0Dh,0Ah,0 - 9560 - 9561 times 43 db 20h - 9562 - 9563 _152Fh: db 'Specified COMMAND search directory bad',0Dh,0Ah,0 - 9564 BADCOMLKMES: - 9565 dw _152Fh - 9566 - 9567 _155Ah: db 'Specified COMMAND search directory bad access denied',0Dh,0Ah,0 - 9568 BADCOMACCMSG: - 9569 dw _155Ah - 9570 - 9571 _1593h: db 'Access denied',0Dh,0Ah,0 - 9572 ACCDENERR: - 9573 dw _1593h - 9574 - 9575 _15A5h: db 'Out of environment space',0Dh,0Ah,0 - 9576 OUTENVMSG: - 9577 dw _15A5h - 9578 - 9579 BADVERMSG: - 9580 db 'Incorrect DOS version',0Dh,0Ah,'$' + 9556 db 0Dh,0Ah + 9557 db 'Microsoft(R) MS-DOS(R) Version 3.30' + 9558 db 0Dh,0Ah + 9559 db ' (C)Copyright Microsoft Corp 1981-1987 ' + 9560 db ' ',0Dh,0Ah + 9561 db ' ', + 9562 db 0Dh,0Ah,0 + 9563 + 9564 times 43 db 20h + 9565 + 9566 _152Fh: db 'Specified COMMAND search directory bad',0Dh,0Ah,0 + 9567 BADCOMLKMES: + 9568 dw _152Fh + 9569 + 9570 _155Ah: db 'Specified COMMAND search directory bad access denied',0Dh,0Ah,0 + 9571 BADCOMACCMSG: + 9572 dw _155Ah + 9573 + 9574 _1593h: db 'Access denied',0Dh,0Ah,0 + 9575 ACCDENERR: + 9576 dw _1593h + 9577 + 9578 _15A5h: db 'Out of environment space',0Dh,0Ah,0 + 9579 OUTENVMSG: + 9580 dw _15A5h 9581 - 9582 BADENVSIZMSG: - 9583 db 'Invalid environment size specified',0Dh,0Ah,'$' + 9582 BADVERMSG: + 9583 db 'Incorrect DOS version',0Dh,0Ah,'$' 9584 - 9585 HEADERPTR: - 9586 dw COPYRIGHTMSG - 9587 %endif - 9588 - 9589 ; 30/01/2023 - 9590 ;align 16 - 9591 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9592 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1E50h - 9593 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 9594 ; MSDOS 6.22 COMMAND.COM - RESGROUP:2100h - 9595 - 9596 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 9597 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2200h - 9598 ICONDEV: - 9599 00002019 2F4445562F db '/DEV/' - 9600 0000201E 434F4E000000000000 db 'CON',0,0,0,0,0,0 ; Room for 8 char device - 9601 BADCSPFL: - 9602 00002027 00 db 0 - 9603 COMSPECT: - 9604 00002028 5C434F4D4D414E442E- db '\COMMAND.COM',0 - 9604 00002031 434F4D00 - 9605 00002035 00 db 0 - 9606 AUTOBAT: - 9607 00002036 003A5C4155544F4558- db 0,':\AUTOEXEC.BAT',0,0Dh - 9607 0000203F 45432E424154000D - 9608 - 9609 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM - 9610 %if 0 - 9611 ; 07/06/2023 - 9612 KAUTOBAT: - 9613 db 0,':\KAUTOEXEC.BAT',0,0Dh - 9614 %endif - 9615 - 9616 PRDATTM: - 9617 00002047 FF db -1 ; 0FFh ; Init not to prompt for date time - 9618 INITADD: - 9619 00002048 00000000 dd 0 - 9620 print_add: - 9621 0000204C [1654] dw Printf_Init - 9622 0000204E 0000 dw 0 - 9623 triage_add: - 9624 00002050 [D430] dw Triage_Init - 9625 00002052 0000 dw 0 - 9626 ;CHUCKENV: - 9627 AllocedEnv: - 9628 00002054 00 db 0 - 9629 - 9630 ; 30/01/2023 - MSDOS 3.3 - 9631 ;COMSPOFFSET: - 9632 ;ECOMLOC: - 9633 ; ;dw 0Eh - 9634 ; ;dw offset ENVIRONMENT:ECOMSPEC-10h - 9635 ; dw ECOMSPEC-ENVIRONMENT ; 30/04/2018 - 9636 ;COMSPSTRING: - 9637 ; db 'COMSPEC=' - 9638 - 9639 ; 18/07/2024 - 9640 ; PCDOS 7.1 COMMAND.COM - RESGROUP:223Ch + 9585 BADENVSIZMSG: + 9586 db 'Invalid environment size specified',0Dh,0Ah,'$' + 9587 + 9588 HEADERPTR: + 9589 dw COPYRIGHTMSG + 9590 %endif + 9591 + 9592 ; 30/01/2023 + 9593 ;align 16 + 9594 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9595 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1E50h + 9596 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9597 ; MSDOS 6.22 COMMAND.COM - RESGROUP:2100h + 9598 + 9599 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 9600 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2200h + 9601 ICONDEV: + 9602 00002019 2F4445562F db '/DEV/' + 9603 0000201E 434F4E000000000000 db 'CON',0,0,0,0,0,0 ; Room for 8 char device + 9604 BADCSPFL: + 9605 00002027 00 db 0 + 9606 COMSPECT: + 9607 00002028 5C434F4D4D414E442E- db '\COMMAND.COM',0 + 9607 00002031 434F4D00 + 9608 00002035 00 db 0 + 9609 AUTOBAT: + 9610 00002036 003A5C4155544F4558- db 0,':\AUTOEXEC.BAT',0,0Dh + 9610 0000203F 45432E424154000D + 9611 + 9612 ; 22/07/2024 - PCDOS 7.1 COMMAND.COM + 9613 %if 0 + 9614 ; 07/06/2023 + 9615 KAUTOBAT: + 9616 db 0,':\KAUTOEXEC.BAT',0,0Dh + 9617 %endif + 9618 + 9619 PRDATTM: + 9620 00002047 FF db -1 ; 0FFh ; Init not to prompt for date time + 9621 INITADD: + 9622 00002048 00000000 dd 0 + 9623 print_add: + 9624 0000204C [1654] dw Printf_Init + 9625 0000204E 0000 dw 0 + 9626 triage_add: + 9627 00002050 [D430] dw Triage_Init + 9628 00002052 0000 dw 0 + 9629 ;CHUCKENV: + 9630 AllocedEnv: + 9631 00002054 00 db 0 + 9632 + 9633 ; 30/01/2023 - MSDOS 3.3 + 9634 ;COMSPOFFSET: + 9635 ;ECOMLOC: + 9636 ; ;dw 0Eh + 9637 ; ;dw offset ENVIRONMENT:ECOMSPEC-10h + 9638 ; dw ECOMSPEC-ENVIRONMENT ; 30/04/2018 + 9639 ;COMSPSTRING: + 9640 ; db 'COMSPEC=' 9641 - 9642 ; 30/01/2023 - MSDOS 5.0 & MSDOS 6.0 - 9643 PathString: - 9644 00002055 504154483D00 db 'PATH=',0 - 9645 PathStrLen equ ($-PathString)-1 - 9646 ;;; - 9647 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 9648 ; MSDOS 6.0 - 9649 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 9650 ; PCDOS 7.1 - 9651 DefPathString: - 9652 ;db 'C:\MSDOS',0 - 9653 0000205B 433A5C444F5300 db 'C:\DOS',0 ; 18/07/2024 - 9654 DefPathStrLen equ ($-DefPathString)-1 - 9655 DefPath2String: - 9656 ;db 'C:\DOS',0 - 9657 00002062 433A5C4D53444F5300 db 'C:\MSDOS',0 ; 18/07/2024 - 9658 DefPath2StrLen equ ($-DefPath2String)-1 - 9659 - 9660 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM - 9661 ; PCDOS 7.1 COMMAND.COM - 9662 %if 0 - 9663 PrmptString: - 9664 db 'PROMPT=$P$G',0 - 9665 PrmptStrLen equ ($-PrmptString)-1 - 9666 PrmptStrLen2 equ 7 ; length of PROMPT= - 9667 %endif - 9668 - 9669 ; 18/07/2024 - 9670 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2252h + 9642 ; 18/07/2024 + 9643 ; PCDOS 7.1 COMMAND.COM - RESGROUP:223Ch + 9644 + 9645 ; 30/01/2023 - MSDOS 5.0 & MSDOS 6.0 + 9646 PathString: + 9647 00002055 504154483D00 db 'PATH=',0 + 9648 PathStrLen equ ($-PathString)-1 + 9649 ;;; + 9650 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9651 ; MSDOS 6.0 + 9652 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 9653 ; PCDOS 7.1 + 9654 DefPathString: + 9655 ;db 'C:\MSDOS',0 + 9656 0000205B 433A5C444F5300 db 'C:\DOS',0 ; 18/07/2024 + 9657 DefPathStrLen equ ($-DefPathString)-1 + 9658 DefPath2String: + 9659 ;db 'C:\DOS',0 + 9660 00002062 433A5C4D53444F5300 db 'C:\MSDOS',0 ; 18/07/2024 + 9661 DefPath2StrLen equ ($-DefPath2String)-1 + 9662 + 9663 ; 18/07/2024 - Retro DOS v5.0 COMMAND.COM + 9664 ; PCDOS 7.1 COMMAND.COM + 9665 %if 0 + 9666 PrmptString: + 9667 db 'PROMPT=$P$G',0 + 9668 PrmptStrLen equ ($-PrmptString)-1 + 9669 PrmptStrLen2 equ 7 ; length of PROMPT= + 9670 %endif 9671 - 9672 ComspOffset: - 9673 0000206B 0000 dw 0 - 9674 ;;; - 9675 ComspString: - 9676 0000206D 434F4D535045433D5C- db 'COMSPEC=\COMMAND.COM',0 - 9676 00002076 434F4D4D414E442E43- - 9676 0000207F 4F4D00 - 9677 ComspStrLen equ 8 ; length of COMSPEC= - 9678 ComspStrLen2 equ ($-ComspString)-1 - 9679 ; length of full COMSPEC - 9680 ; 29/01/2023 - 9681 ;equal_sign: - 9682 ;equalsign: - 9683 ; db '=' - 9684 ;letter_a: - 9685 ;lcasea: - 9686 ; db 'a' - 9687 ;letter_z: - 9688 ;lcasez: - 9689 ; db 'z' - 9690 ; 30/01/2023 - 9691 ;;slash_chr: - 9692 ;; db '/' - 9693 ;;bslash_chr: - 9694 ;; db '\' - 9695 ;space_chr: - 9696 ;;space: - 9697 ; db 20h - 9698 ;;letter_p: - 9699 ;; db 'p' - 9700 ;;letter_d: - 9701 ;; db 'd' - 9702 ;;letter_c: - 9703 ;; db 'c' - 9704 ; 16/04/2023 - 9705 ; MSDOS 5.0 & MSDOS 6.0 - 9706 ;scswitch: - 9707 ; db 'C' ; Single command - 9708 ;;skswitch: - 9709 ; db 'K' ; MSDOS 6.0 - 9710 ;;letter_A: - 9711 ;ucasea: ; 21/01/2023 - 9712 ; db 'A' - 9713 - 9714 ; 30/01/2023 - 9715 EnvSiz: - 9716 00002082 0000 dw 0 ; size user wants to allocate - 9717 EnvMax: - 9718 00002084 0000 dw 0 ; maximum size allowed - 9719 OldEnv: - 9720 00002086 0000 dw 0 ; envirseg at initialization - 9721 UsedEnv: - 9722 00002088 0000 dw 0 ; amount of envirseg used - 9723 ; MSDOS 5.0 & MSDOS 6.0 - 9724 PARS_MSG_OFF: - 9725 0000208A 0000 dw 0 ; SAVED PARSE ERROR MESSAGE OFFSET - 9726 PARS_MSG_SEG: - 9727 0000208C 0000 dw 0 ; SAVED PARSE ERROR MESSAGE SEGMENT - 9728 - 9729 ;Do not separate the following two words. Used to call transient PARSE routine - 9730 - 9731 Init_Parse: - 9732 ;dw 4FFBh ; MSDOS 5.0 COMMAND.COM (TRANGROUP:APPEND_PARSE) - 9733 init_p: - 9734 0000208E [1254] dw append_parse ; dw 564Bh ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 - 9735 initend: - 9736 00002090 0000 dw 0 ; segment address of end of init - 9737 TrnSize: - 9738 00002092 0000 dw 0 ; size of transient in paragraphs - 9739 - 9740 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM - 9741 %if 0 - 9742 resetenv: - 9743 ;dw 0 ; set if we need to setblck env at endinit - 9744 ; 23/07/2024 - 9745 db 0 - 9746 %endif - 9747 - 9748 ext_msg: - 9749 00002094 00 db 0 ; set if /MSG switch entered - 9750 eswitch: - 9751 00002095 00 db 0 ; set if /e was entered - 9752 dswitch: - 9753 00002096 00 db 0 ; set if /d was entered - 9754 parsemes_ptr: - 9755 00002097 0000 dw 0 ; word to store parse error number - 9756 - 9757 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 9758 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1ED6h + 9672 ; 18/07/2024 + 9673 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2252h + 9674 + 9675 ComspOffset: + 9676 0000206B 0000 dw 0 + 9677 ;;; + 9678 ComspString: + 9679 0000206D 434F4D535045433D5C- db 'COMSPEC=\COMMAND.COM',0 + 9679 00002076 434F4D4D414E442E43- + 9679 0000207F 4F4D00 + 9680 ComspStrLen equ 8 ; length of COMSPEC= + 9681 ComspStrLen2 equ ($-ComspString)-1 + 9682 ; length of full COMSPEC + 9683 ; 29/01/2023 + 9684 ;equal_sign: + 9685 ;equalsign: + 9686 ; db '=' + 9687 ;letter_a: + 9688 ;lcasea: + 9689 ; db 'a' + 9690 ;letter_z: + 9691 ;lcasez: + 9692 ; db 'z' + 9693 ; 30/01/2023 + 9694 ;;slash_chr: + 9695 ;; db '/' + 9696 ;;bslash_chr: + 9697 ;; db '\' + 9698 ;space_chr: + 9699 ;;space: + 9700 ; db 20h + 9701 ;;letter_p: + 9702 ;; db 'p' + 9703 ;;letter_d: + 9704 ;; db 'd' + 9705 ;;letter_c: + 9706 ;; db 'c' + 9707 ; 16/04/2023 + 9708 ; MSDOS 5.0 & MSDOS 6.0 + 9709 ;scswitch: + 9710 ; db 'C' ; Single command + 9711 ;;skswitch: + 9712 ; db 'K' ; MSDOS 6.0 + 9713 ;;letter_A: + 9714 ;ucasea: ; 21/01/2023 + 9715 ; db 'A' + 9716 + 9717 ; 30/01/2023 + 9718 EnvSiz: + 9719 00002082 0000 dw 0 ; size user wants to allocate + 9720 EnvMax: + 9721 00002084 0000 dw 0 ; maximum size allowed + 9722 OldEnv: + 9723 00002086 0000 dw 0 ; envirseg at initialization + 9724 UsedEnv: + 9725 00002088 0000 dw 0 ; amount of envirseg used + 9726 ; MSDOS 5.0 & MSDOS 6.0 + 9727 PARS_MSG_OFF: + 9728 0000208A 0000 dw 0 ; SAVED PARSE ERROR MESSAGE OFFSET + 9729 PARS_MSG_SEG: + 9730 0000208C 0000 dw 0 ; SAVED PARSE ERROR MESSAGE SEGMENT + 9731 + 9732 ;Do not separate the following two words. Used to call transient PARSE routine + 9733 + 9734 Init_Parse: + 9735 ;dw 4FFBh ; MSDOS 5.0 COMMAND.COM (TRANGROUP:APPEND_PARSE) + 9736 init_p: + 9737 0000208E [1254] dw append_parse ; dw 564Bh ; PCDOS 7.1 COMMAND.COM ; 18/07/2024 + 9738 initend: + 9739 00002090 0000 dw 0 ; segment address of end of init + 9740 TrnSize: + 9741 00002092 0000 dw 0 ; size of transient in paragraphs + 9742 + 9743 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM + 9744 %if 0 + 9745 resetenv: + 9746 ;dw 0 ; set if we need to setblck env at endinit + 9747 ; 23/07/2024 + 9748 db 0 + 9749 %endif + 9750 + 9751 ext_msg: + 9752 00002094 00 db 0 ; set if /MSG switch entered + 9753 eswitch: + 9754 00002095 00 db 0 ; set if /e was entered + 9755 dswitch: + 9756 00002096 00 db 0 ; set if /d was entered + 9757 parsemes_ptr: + 9758 00002097 0000 dw 0 ; word to store parse error number 9759 - 9760 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 9761 ; MSDOS 6.22 COMMAND.COM - RESGROUP:21A5h + 9760 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 9761 ; MSDOS 5.0 COMMAND.COM - RESGROUP:1ED6h 9762 - 9763 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 9764 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2288h + 9763 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9764 ; MSDOS 6.22 COMMAND.COM - RESGROUP:21A5h 9765 - 9766 ; MSDOS 6.0 (UINIT.ASM, 1991) - 9767 ; The following parse control block is used for COMMAND. This block is - 9768 ; used for parsing during initialization. The syntax for COMMAND is: - 9769 ; COMMAND [/?] [d:][path][/P][/F][/D][/E:xxxxx][/MSG][/C executable] - 9770 ; - 9771 ; Anything on the command line after the /C switch will be passed to the - 9772 ; executable command, so if /C is used, it must be specified last. The - 9773 ; /MSG switch can only be specified if the /P switch is specified. - 9774 ; - 9775 ; The /? switch causes help text to be displayed. Any other options - 9776 ; on the command line are ignored. Command.com will not load if /? - 9777 ; is specified. - 9778 - 9779 INTERNAT_INFO: ; used for country info after parsing is completed - 9780 PARSE_COMMAND: - 9781 00002099 [9C20] dw COMMAND_PARMS - 9782 0000209B 00 db 0 ; no extra delimiter - 9783 COMMAND_PARMS: - 9784 0000209C 0002 db 0,2 ; 1 positional parm - 9785 0000209E [BA20] dw COMMAND_FILE - 9786 000020A0 [BA20] dw COMMAND_FILE - 9787 ; MSDOS 5.0 - 9788 ;db 7 ; 7 switches - 9789 ; MSDOS 6.0 - 9790 ;db 8 ; 8 switches - 9791 ; 07/06/2023 - 9792 ; MSDOS 6.22 - 9793 ;db 9 ; 9 switches - 9794 ; 22/07/2024 - 9795 ; PCDOS 7.1 - 9796 000020A2 0B db 11 ; 11 switches - 9797 000020A3 [C320] dw COMMAND_SWITCH1 - 9798 000020A5 [CF20] dw COMMAND_SWITCH2 - 9799 000020A7 [DB20] dw COMMAND_SWITCH3 - 9800 000020A9 [E720] dw COMMAND_SWITCH4 - 9801 000020AB [0021] dw COMMAND_SWITCH5 - 9802 000020AD [0C21] dw COMMAND_SWITCH6 - 9803 000020AF [1A21] dw COMMAND_SWITCH7 - 9804 ; 07/06/2023 - 9805 000020B1 [2621] dw COMMAND_SWITCH8 ; MSDOS 6.0 - 9806 000020B3 [3221] dw COMMAND_SWITCH9 ; MSDOS 6.22 - 9807 ; 22/07/2024 - 9808 000020B5 [3E21] dw COMMAND_SWITCH10 ; PCDOS 7.1 - 9809 000020B7 [4A21] dw COMMAND_SWITCH11 ; PCDOS 7.1 - 9810 000020B9 00 db 0 ; no keywords - 9811 - 9812 COMMAND_FILE: - 9813 000020BA 0102 dw 0201h ; filespec - optional - 9814 000020BC 0100 dw 1 ; capitalize - file table - 9815 000020BE [5621] dw COMND1_OUTPUT ; result buffer - 9816 000020C0 [5E21] dw NO_VAL ; - 9817 000020C2 00 db 0 ; no keywords - 9818 - 9819 COMMAND_SWITCH1: - 9820 000020C3 0000 dw 0 ; no match flags - 9821 000020C5 0200 dw 2 ; capitalize by char table - 9822 000020C7 [5621] dw COMND1_OUTPUT ; result buffer - 9823 000020C9 [5E21] dw NO_VAL ; - 9824 000020CB 01 db 1 ; 1 keyword - 9825 COMMAND_P_SYN: - 9826 000020CC 2F5000 db '/P',0 ; /P switch - 9827 - 9828 COMMAND_SWITCH2: - 9829 000020CF 0000 dw 0 ; no match flags - 9830 000020D1 0200 dw 2 ; capitalize by char table - 9831 000020D3 [5621] dw COMND1_OUTPUT ; result buffer - 9832 000020D5 [5E21] dw NO_VAL ; - 9833 000020D7 01 db 1 ; 1 keyword - 9834 COMMAND_F_SYN: - 9835 000020D8 2F4600 db '/F',0 ; /F switch - 9836 - 9837 COMMAND_SWITCH3: - 9838 000020DB 0000 dw 0 ; no match flags - 9839 000020DD 0200 dw 2 ; capitalize by char table - 9840 000020DF [5621] dw COMND1_OUTPUT ; result buffer - 9841 000020E1 [5E21] dw NO_VAL ; - 9842 000020E3 01 db 1 ; 1 keyword - 9843 COMMAND_D_SYN: - 9844 000020E4 2F4400 db '/D',0 ; /D switch - 9845 - 9846 COMMAND_SWITCH4: - 9847 000020E7 0080 dw 8000h ; numeric value - required - 9848 000020E9 0000 dw 0 ; no function flags - 9849 000020EB [5621] dw COMND1_OUTPUT ; result buffer - 9850 000020ED [F320] dw COMMAND_E_VAL ; pointer to value list - 9851 000020EF 01 db 1 ; 1 keyword - 9852 COMMAND_E_SYN: - 9853 000020F0 2F4500 db '/E',0 ; /E switch - 9854 - 9855 COMMAND_E_VAL: - 9856 000020F3 01 db 1 ; - 9857 000020F4 01 db 1 ; 1 range - 9858 000020F5 01 db 1 ; returned if result - 9859 ;dd ENVSML,ENVBIG ; minimum & maximum value - 9860 ; MSDOS 5.0 COMMAND.COM (RESGROUP:1F2Bh) - 9861 ; PCDOS 7.1 COMMAND.COM (RESGROUP:22E5h) - 9862 000020F6 A0000000 dd 160 ; ENVSML - 9863 000020FA 00800000 dd 32768 ; ENVBIG - 9864 000020FE 00 db 0 ; no numeric values - 9865 000020FF 00 db 0 ; no string values - 9866 - 9867 COMMAND_SWITCH5: - 9868 00002100 0000 dw 0 ; no match flags - 9869 00002102 0200 dw 2 ; capitalize by char table - 9870 00002104 [5621] dw COMND1_OUTPUT ; result buffer - 9871 00002106 [5E21] dw NO_VAL ; - 9872 00002108 01 db 1 ; 1 keyword - 9873 COMMAND_C_SYN: - 9874 00002109 2F4300 db '/C',0 ; /C switch - 9875 - 9876 COMMAND_SWITCH6: - 9877 0000210C 0000 dw 0 ; no match flags - 9878 0000210E 0200 dw 2 ; capitalize by char table - 9879 00002110 [5621] dw COMND1_OUTPUT ; result buffer - 9880 00002112 [5E21] dw NO_VAL ; - 9881 00002114 01 db 1 ; 1 keyword - 9882 COMMAND_M_SYN: - 9883 00002115 2F4D534700 db '/MSG',0 ; /MSG switch - 9884 - 9885 COMMAND_SWITCH7: - 9886 0000211A 0000 dw 0 ; no match flags - 9887 0000211C 0200 dw 2 ; capitalize by char table - 9888 0000211E [5621] dw COMND1_OUTPUT ; result buffer - 9889 00002120 [5E21] dw NO_VAL ; - 9890 00002122 01 db 1 ; 1 keyword - 9891 COMMAND_?_SYN: - 9892 00002123 2F3F00 db '/?',0 ; /? switch - 9893 - 9894 ; 07/06/2023 - 9895 ; MSDOS 6.0 - 9896 COMMAND_SWITCH8: - 9897 00002126 0000 dw 0 ; no match flags - 9898 00002128 0200 dw 2 ; capitalize by char table - 9899 0000212A [5621] dw COMND1_OUTPUT ; result buffer - 9900 0000212C [5E21] dw NO_VAL ; - 9901 0000212E 01 db 1 ; 1 keyword - 9902 COMMAND_K_SYN: - 9903 0000212F 2F4B00 db '/K',0 ; /K switch - 9904 - 9905 ; 07/06/2023 - 9906 ; MSDOS 6.22 - 9907 COMMAND_SWITCH9: - 9908 00002132 0000 dw 0 ; no match flags - 9909 00002134 0200 dw 2 ; capitalize by char table - 9910 00002136 [5621] dw COMND1_OUTPUT ; result buffer - 9911 00002138 [5E21] dw NO_VAL ; - 9912 0000213A 01 db 1 ; 1 keyword - 9913 COMMAND_Y_SYN: - 9914 0000213B 2F5900 db '/Y',0 ; /Y switch - 9915 - 9916 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM - 9917 %if 1 - 9918 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2336h - 9919 COMMAND_SWITCH10: - 9920 0000213E 0000 dw 0 ; no match flags - 9921 00002140 0200 dw 2 ; capitalize by char table - 9922 00002142 [5621] dw COMND1_OUTPUT ; result buffer - 9923 00002144 [5E21] dw NO_VAL ; - 9924 00002146 01 db 1 ; 1 keyword - 9925 COMMAND_H_SYN: - 9926 00002147 2F4800 db '/H',0 ; /H switch - 9927 - 9928 COMMAND_SWITCH11: - 9929 0000214A 0000 dw 0 ; no match flags - 9930 0000214C 0200 dw 2 ; capitalize by char table - 9931 0000214E [5621] dw COMND1_OUTPUT ; result buffer - 9932 00002150 [5E21] dw NO_VAL ; - 9933 00002152 01 db 1 ; 1 keyword - 9934 COMMAND_O_SYN: - 9935 00002153 2F4F00 db '/O',0 ; /O switch - 9936 %endif - 9937 - 9938 COMND1_OUTPUT: - 9939 COMND1_TYPE: - 9940 00002156 00 db 0 ; type - 9941 COMND1_CODE: - 9942 00002157 00 db 0 ; return value - 9943 COMND1_SYN: - 9944 00002158 0000 dw 0 ; synonym pointer - 9945 COMND1_ADDR: - 9946 0000215A 00000000 dd 0 ; numeric value / address - 9947 ; of string value - 9948 NO_VAL: - 9949 0000215E 00 db 0 ; no values - 9950 num_positionals: - 9951 0000215F 0000 dw 0 ; counter for positionals - 9952 old_parse_ptr: - 9953 00002161 0000 dw 0 ; SI position before calling parser - 9954 - 9955 ; 30/01/2023 - 9956 ;*** INITIALIZATION MESSAGES - 9957 ; ------------------------- - 9958 ; include comimsg.inc ;M00 - 9959 ;----------------------------------------------------------------------------- - 9960 - 9961 BADVERMSG: - 9962 00002163 17 db 23 - 9963 00002164 496E636F7272656374- db 'Incorrect DOS version',0Dh,0Ah - 9963 0000216D 20444F532076657273- - 9963 00002176 696F6E0D0A - 9964 OUTENVMSG: - 9965 0000217B 1A db 26 - 9966 0000217C 4F7574206F6620656E- db 'Out of environment space',0Dh,0Ah - 9966 00002185 7669726F6E6D656E74- - 9966 0000218E 2073706163650D0A - 9967 - 9968 ; 07/06/2023 - 9969 ;COPYRIGHTMSG: - 9970 ; db 94 - 9971 ; db 0Dh,0Ah - 9972 ; db 0Dh,0Ah - 9973 ; db 'Microsoft(R) MS-DOS(R) Version 5.00',0Dh,0Ah - 9974 ; db ' (C)Copyright Microsoft Corp 1981-1991.',0Dh,0Ah - 9975 - 9976 ; 23/07/2024 - 9977 %if 0 - 9978 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 9979 ; MSDOS 6.22 COMMAND.COM - RESGROUP:2286h - 9980 COPYRIGHTMSG: - 9981 db 94 - 9982 db 0Dh,0Ah - 9983 db 0Dh,0Ah - 9984 db 'Microsoft(R) MS-DOS(R) Version 6.22',0Dh,0Ah - 9985 db ' (C)Copyright Microsoft Corp 1981-1994.',0Dh,0Ah - 9986 %else - 9987 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM - 9988 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2385h - 9989 COPYRIGHTMSG: - 9990 00002196 64 db 100 - 9991 00002197 0D0A db 0Dh,0Ah - 9992 00002199 0D0A db 0Dh,0Ah - 9993 0000219B 504320444F53205665- db 'PC DOS Version 7.10',0Dh,0Ah - 9993 000021A4 7273696F6E20372E31- - 9993 000021AD 300D0A - 9994 000021B0 202020202020202020- db ' (C)Copyright International Business Machines Corp ' - 9994 000021B9 20202020284329436F- - 9994 000021C2 707972696768742049- - 9994 000021CB 6E7465726E6174696F- - 9994 000021D4 6E616C20427573696E- - 9994 000021DD 657373204D61636869- - 9994 000021E6 6E657320436F727020 - 9995 000021EF 313938312D32303032- db '1981-2002.',0Dh,0Ah - 9995 000021F8 2E0D0A - 9996 %endif - 9997 - 9998 BADCOMLKMES: - 9999 000021FB 28 db 40 - 10000 000021FC 537065636966696564- db 'Specified COMMAND search directory bad',0Dh,0Ah - 10000 00002205 20434F4D4D414E4420- - 10000 0000220E 736561726368206469- - 10000 00002217 726563746F72792062- - 10000 00002220 61640D0A - 10001 ; 07/06/2023 - 10002 BADCOMACCMSG: - 10003 00002224 37 db 55 - 10004 00002225 537065636966696564- db 'Specified COMMAND search directory bad, access denied',0Dh,0Ah - 10004 0000222E 20434F4D4D414E4420- - 10004 00002237 736561726368206469- - 10004 00002240 726563746F72792062- - 10004 00002249 61642C206163636573- - 10004 00002252 732064656E6965640D- - 10004 0000225B 0A - 10005 HELPMSG1: - 10006 0000225C 38 db 56 - 10007 ;db 'Starts a new copy of the MS-DOS command interpreter.',0Dh,0Ah - 10008 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 10009 0000225D 537461727473206120- db 'Starts a new copy of the PC DOS command interpreter.',0Dh,0Ah - 10009 00002266 6E657720636F707920- - 10009 0000226F 6F6620746865205043- - 10009 00002278 20444F5320636F6D6D- - 10009 00002281 616E6420696E746572- - 10009 0000228A 7072657465722E0D0A - 10010 00002293 0D0A db 0Dh,0Ah - 10011 ;HELPMSG2: - 10012 ; db 70 - 10013 ; db 'COMMAND [[drive:]path] [device] [/E:nnnnn] [/P] [/C string] [/MSG]' - 10014 ; db 0Dh,0Ah - 10015 ; db 0Dh,0Ah - 10016 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 10017 HELPMSG2: - 10018 00002295 38 db 56 - 10019 00002296 434F4D4D414E44205B- db 'COMMAND [[drive:]path] [device] [/E:nnnnn] [/P [/MSG]]',0Dh,0Ah - 10019 0000229F 5B64726976653A5D70- - 10019 000022A8 6174685D205B646576- - 10019 000022B1 6963655D205B2F453A- - 10019 000022BA 6E6E6E6E6E5D205B2F- - 10019 000022C3 50205B2F4D53475D5D- - 10019 000022CC 0D0A - 10020 HELPMSG3: - 10021 ;db 42 - 10022 ;db ' [/Y [/C command | /K command]]',0Dh,0Ah - 10023 ;db 0Dh,0Ah - 10024 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 10025 000022CE 34 db 52 - 10026 000022CF 20202020202020205B- db ' [/H] [/O] [/Y [/C command | /K command]]',0Dh,0Ah - 10026 000022D8 2F485D205B2F4F5D20- - 10026 000022E1 5B2F59205B2F432063- - 10026 000022EA 6F6D6D616E64207C20- - 10026 000022F3 2F4B20636F6D6D616E- - 10026 000022FC 645D5D0D0A - 10027 00002301 0D0A db 0Dh,0Ah - 10028 ;HELPMSG3: - 10029 HELPMSG4: - 10030 00002303 48 db 72 - 10031 00002304 20205B64726976653A- db ' [drive:]path Specifies the directory containing COMMAND.COM ' - 10031 0000230D 5D7061746820202020- - 10031 00002316 537065636966696573- - 10031 0000231F 207468652064697265- - 10031 00002328 63746F727920636F6E- - 10031 00002331 7461696E696E672043- - 10031 0000233A 4F4D4D414E442E434F- - 10031 00002343 4D20 - 10032 00002345 66696C652E0D0A db 'file.',0Dh,0Ah - 10033 ;HELPMSG4: - 10034 HELPMSG5: - 10035 0000234C 4D db 77 - 10036 0000234D 202064657669636520- db ' device Specifies the device to use for command input and ' - 10036 00002356 202020202020202020- - 10036 0000235F 537065636966696573- - 10036 00002368 207468652064657669- - 10036 00002371 636520746F20757365- - 10036 0000237A 20666F7220636F6D6D- - 10036 00002383 616E6420696E707574- - 10036 0000238C 20616E6420 - 10037 00002391 6F75747075742E0D0A db 'output.',0Dh,0Ah - 10038 ;HELPMSG5: - 10039 HELPMSG6: - 10040 0000239A 45 db 69 - 10041 0000239B 20202F453A6E6E6E6E- db ' /E:nnnnn Sets the initial environment size to nnnnn bytes.' - 10041 000023A4 6E2020202020202020- - 10041 000023AD 536574732074686520- - 10041 000023B6 696E697469616C2065- - 10041 000023BF 6E7669726F6E6D656E- - 10041 000023C8 742073697A6520746F- - 10041 000023D1 206E6E6E6E6E206279- - 10041 000023DA 7465732E - 10042 000023DE 0D0A db 0Dh,0Ah - 10043 ;HELPMSG6: - 10044 HELPMSG7: - 10045 000023E0 4D db 77 - 10046 000023E1 20202F502020202020- db ' /P Makes the new Command Interpreter permanent ' - 10046 000023EA 202020202020202020- - 10046 000023F3 4D616B657320746865- - 10046 000023FC 206E657720436F6D6D- - 10046 00002405 616E6420496E746572- - 10046 0000240E 707265746572207065- - 10046 00002417 726D616E656E7420 - 10047 0000241F 2863616E2774206578- db '(can',27h,'t exit).',0Dh,0Ah - 10047 00002428 6974292E0D0A - 10048 ;HELPMSG7: - 10049 HELPMSG8: - 10050 ;db 80 - 10051 ;db ' /C string Carries out the command specified by string, and ' - 10052 ;db 'then stops.',0Dh,0Ah - 10053 ; 07/06/2023 - 10054 0000242E 46 db 70 - 10055 0000242F 20202F4D5347202020- db ' /MSG Stores all error messages in memory (requires /P).' - 10055 00002438 202020202020202020- - 10055 00002441 53746F72657320616C- - 10055 0000244A 6C206572726F72206D- - 10055 00002453 657373616765732069- - 10055 0000245C 6E206D656D6F727920- - 10055 00002465 287265717569726573- - 10055 0000246E 202F50292E - 10056 00002473 0D0A db 0Dh,0Ah - 10057 - 10058 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM - 10059 ; PCDOS 7.1 COMMAND.COM - 10060 ;*** - 10061 HELPMSG9: - 10062 00002475 4A db 74 - 10063 00002476 20202F482020202020- db ' /H Loads the Command Interpreter into a UMB ' - 10063 0000247F 202020202020202020- - 10063 00002488 4C6F61647320746865- - 10063 00002491 20436F6D6D616E6420- - 10063 0000249A 496E74657270726574- - 10063 000024A3 657220696E746F2061- - 10063 000024AC 20554D4220 - 10064 000024B1 696620617661696C61- db 'if available.',0Dh,0Ah - 10064 000024BA 626C652E0D0A - 10065 HELPMSG10: - 10066 000024C0 4E db 78 - 10067 000024C1 20202F4F2020202020- db ' /O Disables overwrite prompt on COPY,XCOPY,and MOVE ' - 10067 000024CA 202020202020202020- - 10067 000024D3 44697361626C657320- - 10067 000024DC 6F7665727772697465- - 10067 000024E5 2070726F6D7074206F- - 10067 000024EE 6E20434F50592C5843- - 10067 000024F7 4F50592C616E64204D- - 10067 00002500 4F564520 - 10068 00002504 636F6D6D616E64732E- db 'commands.',0Dh,0Ah - 10068 0000250D 0D0A - 10069 ;*** - 10070 - 10071 ;HELPMSG8: - 10072 ; 23/07/2024 - PCDOS 7.1 COMMAND.COM - 10073 ;HELPMSG9: - 10074 HELPMSG11: - 10075 ;db 78 - 10076 ;db ' /MSG Specifies that all error messages be stored in ' - 10077 ;db 'memory. You',0Dh,0Ah - 10078 ;HELPMSG9: - 10079 ;db 56 - 10080 ;db ' need to specify /P with this switch.',0Dh,0Ah - 10081 0000250F 4A db 74 - 10082 00002510 20202F592020202020- db ' /Y Steps through the batch program specified by /C' - 10082 00002519 202020202020202020- - 10082 00002522 537465707320746872- - 10082 0000252B 6F7567682074686520- - 10082 00002534 62617463682070726F- - 10082 0000253D 6772616D2073706563- - 10082 00002546 696669656420627920- - 10082 0000254F 2F43 - 10083 00002551 206F72202F4B2E0D0A db ' or /K.',0Dh,0Ah - 10084 - 10085 ; 07/06/2023 - 10086 ; 23/07/2024 - 10087 ;HELPMSG10: - 10088 HELPMSG12: - 10089 0000255A 3F db 63 - 10090 0000255B 20202F4320636F6D6D- db ' /C command Executes the specified command and returns.',0Dh,0Ah - 10090 00002564 616E64202020202020- - 10090 0000256D 457865637574657320- - 10090 00002576 746865207370656369- - 10090 0000257F 6669656420636F6D6D- - 10090 00002588 616E6420616E642072- - 10090 00002591 657475726E732E0D0A - 10091 ; 23/07/2024 - 10092 ;HELPMSG11: - 10093 HELPMSG13: - 10094 0000259A 4B db 75 - 10095 0000259B 20202F4B20636F6D6D- db ' /K command Executes the specified command and continues running.' - 10095 000025A4 616E64202020202020- - 10095 000025AD 457865637574657320- - 10095 000025B6 746865207370656369- - 10095 000025BF 6669656420636F6D6D- - 10095 000025C8 616E6420616E642063- - 10095 000025D1 6F6E74696E75657320- - 10095 000025DA 72756E6E696E672E - 10096 000025E2 0D0A db 0Dh,0Ah - 10097 000025E4 0D0A db 0Dh,0Ah - 10098 ;HELPMSG12: - 10099 ; 23/07/2024 - 10100 HELPMSG14: - 10101 000025E6 4C db 76 - 10102 000025E7 546865202F5020616E- db 'The /P and /MSG switches may be used only when COMMAND is started' - 10102 000025F0 64202F4D5347207377- - 10102 000025F9 697463686573206D61- - 10102 00002602 792062652075736564- - 10102 0000260B 206F6E6C7920776865- - 10102 00002614 6E20434F4D4D414E44- - 10102 0000261D 206973207374617274- - 10102 00002626 6564 - 10103 00002628 206279207573696E67- db ' by using',0Dh,0Ah - 10103 00002631 0D0A - 10104 ;HELPMSG13: - 10105 ; 23/07/2024 - 10106 HELPMSG15: - 10107 00002633 2B db 43 - 10108 00002634 746865205348454C4C- db 'the SHELL command in the CONFIG.SYS file.',0Dh,0Ah - 10108 0000263D 20636F6D6D616E6420- - 10108 00002646 696E2074686520434F- - 10108 0000264F 4E4649472E53595320- - 10108 00002658 66696C652E0D0A - 10109 - 10110 HelpMsgs: - 10111 0000265F [5C22] dw HELPMSG1 - 10112 00002661 [9522] dw HELPMSG2 - 10113 00002663 [CE22] dw HELPMSG3 - 10114 00002665 [0323] dw HELPMSG4 - 10115 00002667 [4C23] dw HELPMSG5 - 10116 00002669 [9A23] dw HELPMSG6 - 10117 0000266B [E023] dw HELPMSG7 - 10118 0000266D [2E24] dw HELPMSG8 - 10119 0000266F [7524] dw HELPMSG9 - 10120 - 10121 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 10122 00002671 [C024] dw HELPMSG10 - 10123 00002673 [0F25] dw HELPMSG11 - 10124 00002675 [5A25] dw HELPMSG12 - 10125 00002677 [9A25] dw HELPMSG13 - 10126 - 10127 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 10128 00002679 [E625] dw HELPMSG14 - 10129 0000267B [3326] dw HELPMSG15 - 10130 - 10131 ; 23/04/2023 - 10132 0000267D 0000 dw 0 + 9766 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 9767 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2288h + 9768 + 9769 ; MSDOS 6.0 (UINIT.ASM, 1991) + 9770 ; The following parse control block is used for COMMAND. This block is + 9771 ; used for parsing during initialization. The syntax for COMMAND is: + 9772 ; COMMAND [/?] [d:][path][/P][/F][/D][/E:xxxxx][/MSG][/C executable] + 9773 ; + 9774 ; Anything on the command line after the /C switch will be passed to the + 9775 ; executable command, so if /C is used, it must be specified last. The + 9776 ; /MSG switch can only be specified if the /P switch is specified. + 9777 ; + 9778 ; The /? switch causes help text to be displayed. Any other options + 9779 ; on the command line are ignored. Command.com will not load if /? + 9780 ; is specified. + 9781 + 9782 INTERNAT_INFO: ; used for country info after parsing is completed + 9783 PARSE_COMMAND: + 9784 00002099 [9C20] dw COMMAND_PARMS + 9785 0000209B 00 db 0 ; no extra delimiter + 9786 COMMAND_PARMS: + 9787 0000209C 0002 db 0,2 ; 1 positional parm + 9788 0000209E [BA20] dw COMMAND_FILE + 9789 000020A0 [BA20] dw COMMAND_FILE + 9790 ; MSDOS 5.0 + 9791 ;db 7 ; 7 switches + 9792 ; MSDOS 6.0 + 9793 ;db 8 ; 8 switches + 9794 ; 07/06/2023 + 9795 ; MSDOS 6.22 + 9796 ;db 9 ; 9 switches + 9797 ; 22/07/2024 + 9798 ; PCDOS 7.1 + 9799 000020A2 0B db 11 ; 11 switches + 9800 000020A3 [C320] dw COMMAND_SWITCH1 + 9801 000020A5 [CF20] dw COMMAND_SWITCH2 + 9802 000020A7 [DB20] dw COMMAND_SWITCH3 + 9803 000020A9 [E720] dw COMMAND_SWITCH4 + 9804 000020AB [0021] dw COMMAND_SWITCH5 + 9805 000020AD [0C21] dw COMMAND_SWITCH6 + 9806 000020AF [1A21] dw COMMAND_SWITCH7 + 9807 ; 07/06/2023 + 9808 000020B1 [2621] dw COMMAND_SWITCH8 ; MSDOS 6.0 + 9809 000020B3 [3221] dw COMMAND_SWITCH9 ; MSDOS 6.22 + 9810 ; 22/07/2024 + 9811 000020B5 [3E21] dw COMMAND_SWITCH10 ; PCDOS 7.1 + 9812 000020B7 [4A21] dw COMMAND_SWITCH11 ; PCDOS 7.1 + 9813 000020B9 00 db 0 ; no keywords + 9814 + 9815 COMMAND_FILE: + 9816 000020BA 0102 dw 0201h ; filespec - optional + 9817 000020BC 0100 dw 1 ; capitalize - file table + 9818 000020BE [5621] dw COMND1_OUTPUT ; result buffer + 9819 000020C0 [5E21] dw NO_VAL ; + 9820 000020C2 00 db 0 ; no keywords + 9821 + 9822 COMMAND_SWITCH1: + 9823 000020C3 0000 dw 0 ; no match flags + 9824 000020C5 0200 dw 2 ; capitalize by char table + 9825 000020C7 [5621] dw COMND1_OUTPUT ; result buffer + 9826 000020C9 [5E21] dw NO_VAL ; + 9827 000020CB 01 db 1 ; 1 keyword + 9828 COMMAND_P_SYN: + 9829 000020CC 2F5000 db '/P',0 ; /P switch + 9830 + 9831 COMMAND_SWITCH2: + 9832 000020CF 0000 dw 0 ; no match flags + 9833 000020D1 0200 dw 2 ; capitalize by char table + 9834 000020D3 [5621] dw COMND1_OUTPUT ; result buffer + 9835 000020D5 [5E21] dw NO_VAL ; + 9836 000020D7 01 db 1 ; 1 keyword + 9837 COMMAND_F_SYN: + 9838 000020D8 2F4600 db '/F',0 ; /F switch + 9839 + 9840 COMMAND_SWITCH3: + 9841 000020DB 0000 dw 0 ; no match flags + 9842 000020DD 0200 dw 2 ; capitalize by char table + 9843 000020DF [5621] dw COMND1_OUTPUT ; result buffer + 9844 000020E1 [5E21] dw NO_VAL ; + 9845 000020E3 01 db 1 ; 1 keyword + 9846 COMMAND_D_SYN: + 9847 000020E4 2F4400 db '/D',0 ; /D switch + 9848 + 9849 COMMAND_SWITCH4: + 9850 000020E7 0080 dw 8000h ; numeric value - required + 9851 000020E9 0000 dw 0 ; no function flags + 9852 000020EB [5621] dw COMND1_OUTPUT ; result buffer + 9853 000020ED [F320] dw COMMAND_E_VAL ; pointer to value list + 9854 000020EF 01 db 1 ; 1 keyword + 9855 COMMAND_E_SYN: + 9856 000020F0 2F4500 db '/E',0 ; /E switch + 9857 + 9858 COMMAND_E_VAL: + 9859 000020F3 01 db 1 ; + 9860 000020F4 01 db 1 ; 1 range + 9861 000020F5 01 db 1 ; returned if result + 9862 ;dd ENVSML,ENVBIG ; minimum & maximum value + 9863 ; MSDOS 5.0 COMMAND.COM (RESGROUP:1F2Bh) + 9864 ; PCDOS 7.1 COMMAND.COM (RESGROUP:22E5h) + 9865 000020F6 A0000000 dd 160 ; ENVSML + 9866 000020FA 00800000 dd 32768 ; ENVBIG + 9867 000020FE 00 db 0 ; no numeric values + 9868 000020FF 00 db 0 ; no string values + 9869 + 9870 COMMAND_SWITCH5: + 9871 00002100 0000 dw 0 ; no match flags + 9872 00002102 0200 dw 2 ; capitalize by char table + 9873 00002104 [5621] dw COMND1_OUTPUT ; result buffer + 9874 00002106 [5E21] dw NO_VAL ; + 9875 00002108 01 db 1 ; 1 keyword + 9876 COMMAND_C_SYN: + 9877 00002109 2F4300 db '/C',0 ; /C switch + 9878 + 9879 COMMAND_SWITCH6: + 9880 0000210C 0000 dw 0 ; no match flags + 9881 0000210E 0200 dw 2 ; capitalize by char table + 9882 00002110 [5621] dw COMND1_OUTPUT ; result buffer + 9883 00002112 [5E21] dw NO_VAL ; + 9884 00002114 01 db 1 ; 1 keyword + 9885 COMMAND_M_SYN: + 9886 00002115 2F4D534700 db '/MSG',0 ; /MSG switch + 9887 + 9888 COMMAND_SWITCH7: + 9889 0000211A 0000 dw 0 ; no match flags + 9890 0000211C 0200 dw 2 ; capitalize by char table + 9891 0000211E [5621] dw COMND1_OUTPUT ; result buffer + 9892 00002120 [5E21] dw NO_VAL ; + 9893 00002122 01 db 1 ; 1 keyword + 9894 COMMAND_?_SYN: + 9895 00002123 2F3F00 db '/?',0 ; /? switch + 9896 + 9897 ; 07/06/2023 + 9898 ; MSDOS 6.0 + 9899 COMMAND_SWITCH8: + 9900 00002126 0000 dw 0 ; no match flags + 9901 00002128 0200 dw 2 ; capitalize by char table + 9902 0000212A [5621] dw COMND1_OUTPUT ; result buffer + 9903 0000212C [5E21] dw NO_VAL ; + 9904 0000212E 01 db 1 ; 1 keyword + 9905 COMMAND_K_SYN: + 9906 0000212F 2F4B00 db '/K',0 ; /K switch + 9907 + 9908 ; 07/06/2023 + 9909 ; MSDOS 6.22 + 9910 COMMAND_SWITCH9: + 9911 00002132 0000 dw 0 ; no match flags + 9912 00002134 0200 dw 2 ; capitalize by char table + 9913 00002136 [5621] dw COMND1_OUTPUT ; result buffer + 9914 00002138 [5E21] dw NO_VAL ; + 9915 0000213A 01 db 1 ; 1 keyword + 9916 COMMAND_Y_SYN: + 9917 0000213B 2F5900 db '/Y',0 ; /Y switch + 9918 + 9919 ; 22/07/2024 - Retro DOS v5.0 COMMAND.COM + 9920 %if 1 + 9921 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2336h + 9922 COMMAND_SWITCH10: + 9923 0000213E 0000 dw 0 ; no match flags + 9924 00002140 0200 dw 2 ; capitalize by char table + 9925 00002142 [5621] dw COMND1_OUTPUT ; result buffer + 9926 00002144 [5E21] dw NO_VAL ; + 9927 00002146 01 db 1 ; 1 keyword + 9928 COMMAND_H_SYN: + 9929 00002147 2F4800 db '/H',0 ; /H switch + 9930 + 9931 COMMAND_SWITCH11: + 9932 0000214A 0000 dw 0 ; no match flags + 9933 0000214C 0200 dw 2 ; capitalize by char table + 9934 0000214E [5621] dw COMND1_OUTPUT ; result buffer + 9935 00002150 [5E21] dw NO_VAL ; + 9936 00002152 01 db 1 ; 1 keyword + 9937 COMMAND_O_SYN: + 9938 00002153 2F4F00 db '/O',0 ; /O switch + 9939 %endif + 9940 + 9941 COMND1_OUTPUT: + 9942 COMND1_TYPE: + 9943 00002156 00 db 0 ; type + 9944 COMND1_CODE: + 9945 00002157 00 db 0 ; return value + 9946 COMND1_SYN: + 9947 00002158 0000 dw 0 ; synonym pointer + 9948 COMND1_ADDR: + 9949 0000215A 00000000 dd 0 ; numeric value / address + 9950 ; of string value + 9951 NO_VAL: + 9952 0000215E 00 db 0 ; no values + 9953 num_positionals: + 9954 0000215F 0000 dw 0 ; counter for positionals + 9955 old_parse_ptr: + 9956 00002161 0000 dw 0 ; SI position before calling parser + 9957 + 9958 ; 30/01/2023 + 9959 ;*** INITIALIZATION MESSAGES + 9960 ; ------------------------- + 9961 ; include comimsg.inc ;M00 + 9962 ;----------------------------------------------------------------------------- + 9963 + 9964 BADVERMSG: + 9965 00002163 17 db 23 + 9966 00002164 496E636F7272656374- db 'Incorrect DOS version',0Dh,0Ah + 9966 0000216D 20444F532076657273- + 9966 00002176 696F6E0D0A + 9967 OUTENVMSG: + 9968 0000217B 1A db 26 + 9969 0000217C 4F7574206F6620656E- db 'Out of environment space',0Dh,0Ah + 9969 00002185 7669726F6E6D656E74- + 9969 0000218E 2073706163650D0A + 9970 + 9971 ; 07/06/2023 + 9972 ;COPYRIGHTMSG: + 9973 ; db 94 + 9974 ; db 0Dh,0Ah + 9975 ; db 0Dh,0Ah + 9976 ; db 'Microsoft(R) MS-DOS(R) Version 5.00',0Dh,0Ah + 9977 ; db ' (C)Copyright Microsoft Corp 1981-1991.',0Dh,0Ah + 9978 + 9979 ; 23/07/2024 + 9980 %if 0 + 9981 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 9982 ; MSDOS 6.22 COMMAND.COM - RESGROUP:2286h + 9983 COPYRIGHTMSG: + 9984 db 94 + 9985 db 0Dh,0Ah + 9986 db 0Dh,0Ah + 9987 db 'Microsoft(R) MS-DOS(R) Version 6.22',0Dh,0Ah + 9988 db ' (C)Copyright Microsoft Corp 1981-1994.',0Dh,0Ah + 9989 %else + 9990 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM + 9991 ; PCDOS 7.1 COMMAND.COM - RESGROUP:2385h + 9992 COPYRIGHTMSG: + 9993 00002196 64 db 100 + 9994 00002197 0D0A db 0Dh,0Ah + 9995 00002199 0D0A db 0Dh,0Ah + 9996 0000219B 504320444F53205665- db 'PC DOS Version 7.10',0Dh,0Ah + 9996 000021A4 7273696F6E20372E31- + 9996 000021AD 300D0A + 9997 000021B0 202020202020202020- db ' (C)Copyright International Business Machines Corp ' + 9997 000021B9 20202020284329436F- + 9997 000021C2 707972696768742049- + 9997 000021CB 6E7465726E6174696F- + 9997 000021D4 6E616C20427573696E- + 9997 000021DD 657373204D61636869- + 9997 000021E6 6E657320436F727020 + 9998 000021EF 313938312D32303032- db '1981-2002.',0Dh,0Ah + 9998 000021F8 2E0D0A + 9999 %endif + 10000 + 10001 BADCOMLKMES: + 10002 000021FB 28 db 40 + 10003 000021FC 537065636966696564- db 'Specified COMMAND search directory bad',0Dh,0Ah + 10003 00002205 20434F4D4D414E4420- + 10003 0000220E 736561726368206469- + 10003 00002217 726563746F72792062- + 10003 00002220 61640D0A + 10004 ; 07/06/2023 + 10005 BADCOMACCMSG: + 10006 00002224 37 db 55 + 10007 00002225 537065636966696564- db 'Specified COMMAND search directory bad, access denied',0Dh,0Ah + 10007 0000222E 20434F4D4D414E4420- + 10007 00002237 736561726368206469- + 10007 00002240 726563746F72792062- + 10007 00002249 61642C206163636573- + 10007 00002252 732064656E6965640D- + 10007 0000225B 0A + 10008 HELPMSG1: + 10009 0000225C 38 db 56 + 10010 ;db 'Starts a new copy of the MS-DOS command interpreter.',0Dh,0Ah + 10011 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 10012 0000225D 537461727473206120- db 'Starts a new copy of the PC DOS command interpreter.',0Dh,0Ah + 10012 00002266 6E657720636F707920- + 10012 0000226F 6F6620746865205043- + 10012 00002278 20444F5320636F6D6D- + 10012 00002281 616E6420696E746572- + 10012 0000228A 7072657465722E0D0A + 10013 00002293 0D0A db 0Dh,0Ah + 10014 ;HELPMSG2: + 10015 ; db 70 + 10016 ; db 'COMMAND [[drive:]path] [device] [/E:nnnnn] [/P] [/C string] [/MSG]' + 10017 ; db 0Dh,0Ah + 10018 ; db 0Dh,0Ah + 10019 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 10020 HELPMSG2: + 10021 00002295 38 db 56 + 10022 00002296 434F4D4D414E44205B- db 'COMMAND [[drive:]path] [device] [/E:nnnnn] [/P [/MSG]]',0Dh,0Ah + 10022 0000229F 5B64726976653A5D70- + 10022 000022A8 6174685D205B646576- + 10022 000022B1 6963655D205B2F453A- + 10022 000022BA 6E6E6E6E6E5D205B2F- + 10022 000022C3 50205B2F4D53475D5D- + 10022 000022CC 0D0A + 10023 HELPMSG3: + 10024 ;db 42 + 10025 ;db ' [/Y [/C command | /K command]]',0Dh,0Ah + 10026 ;db 0Dh,0Ah + 10027 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 10028 000022CE 34 db 52 + 10029 000022CF 20202020202020205B- db ' [/H] [/O] [/Y [/C command | /K command]]',0Dh,0Ah + 10029 000022D8 2F485D205B2F4F5D20- + 10029 000022E1 5B2F59205B2F432063- + 10029 000022EA 6F6D6D616E64207C20- + 10029 000022F3 2F4B20636F6D6D616E- + 10029 000022FC 645D5D0D0A + 10030 00002301 0D0A db 0Dh,0Ah + 10031 ;HELPMSG3: + 10032 HELPMSG4: + 10033 00002303 48 db 72 + 10034 00002304 20205B64726976653A- db ' [drive:]path Specifies the directory containing COMMAND.COM ' + 10034 0000230D 5D7061746820202020- + 10034 00002316 537065636966696573- + 10034 0000231F 207468652064697265- + 10034 00002328 63746F727920636F6E- + 10034 00002331 7461696E696E672043- + 10034 0000233A 4F4D4D414E442E434F- + 10034 00002343 4D20 + 10035 00002345 66696C652E0D0A db 'file.',0Dh,0Ah + 10036 ;HELPMSG4: + 10037 HELPMSG5: + 10038 0000234C 4D db 77 + 10039 0000234D 202064657669636520- db ' device Specifies the device to use for command input and ' + 10039 00002356 202020202020202020- + 10039 0000235F 537065636966696573- + 10039 00002368 207468652064657669- + 10039 00002371 636520746F20757365- + 10039 0000237A 20666F7220636F6D6D- + 10039 00002383 616E6420696E707574- + 10039 0000238C 20616E6420 + 10040 00002391 6F75747075742E0D0A db 'output.',0Dh,0Ah + 10041 ;HELPMSG5: + 10042 HELPMSG6: + 10043 0000239A 45 db 69 + 10044 0000239B 20202F453A6E6E6E6E- db ' /E:nnnnn Sets the initial environment size to nnnnn bytes.' + 10044 000023A4 6E2020202020202020- + 10044 000023AD 536574732074686520- + 10044 000023B6 696E697469616C2065- + 10044 000023BF 6E7669726F6E6D656E- + 10044 000023C8 742073697A6520746F- + 10044 000023D1 206E6E6E6E6E206279- + 10044 000023DA 7465732E + 10045 000023DE 0D0A db 0Dh,0Ah + 10046 ;HELPMSG6: + 10047 HELPMSG7: + 10048 000023E0 4D db 77 + 10049 000023E1 20202F502020202020- db ' /P Makes the new Command Interpreter permanent ' + 10049 000023EA 202020202020202020- + 10049 000023F3 4D616B657320746865- + 10049 000023FC 206E657720436F6D6D- + 10049 00002405 616E6420496E746572- + 10049 0000240E 707265746572207065- + 10049 00002417 726D616E656E7420 + 10050 0000241F 2863616E2774206578- db '(can',27h,'t exit).',0Dh,0Ah + 10050 00002428 6974292E0D0A + 10051 ;HELPMSG7: + 10052 HELPMSG8: + 10053 ;db 80 + 10054 ;db ' /C string Carries out the command specified by string, and ' + 10055 ;db 'then stops.',0Dh,0Ah + 10056 ; 07/06/2023 + 10057 0000242E 46 db 70 + 10058 0000242F 20202F4D5347202020- db ' /MSG Stores all error messages in memory (requires /P).' + 10058 00002438 202020202020202020- + 10058 00002441 53746F72657320616C- + 10058 0000244A 6C206572726F72206D- + 10058 00002453 657373616765732069- + 10058 0000245C 6E206D656D6F727920- + 10058 00002465 287265717569726573- + 10058 0000246E 202F50292E + 10059 00002473 0D0A db 0Dh,0Ah + 10060 + 10061 ; 23/07/2024 - Retro DOS v5.0 COMMAND.COM + 10062 ; PCDOS 7.1 COMMAND.COM + 10063 ;*** + 10064 HELPMSG9: + 10065 00002475 4A db 74 + 10066 00002476 20202F482020202020- db ' /H Loads the Command Interpreter into a UMB ' + 10066 0000247F 202020202020202020- + 10066 00002488 4C6F61647320746865- + 10066 00002491 20436F6D6D616E6420- + 10066 0000249A 496E74657270726574- + 10066 000024A3 657220696E746F2061- + 10066 000024AC 20554D4220 + 10067 000024B1 696620617661696C61- db 'if available.',0Dh,0Ah + 10067 000024BA 626C652E0D0A + 10068 HELPMSG10: + 10069 000024C0 4E db 78 + 10070 000024C1 20202F4F2020202020- db ' /O Disables overwrite prompt on COPY,XCOPY,and MOVE ' + 10070 000024CA 202020202020202020- + 10070 000024D3 44697361626C657320- + 10070 000024DC 6F7665727772697465- + 10070 000024E5 2070726F6D7074206F- + 10070 000024EE 6E20434F50592C5843- + 10070 000024F7 4F50592C616E64204D- + 10070 00002500 4F564520 + 10071 00002504 636F6D6D616E64732E- db 'commands.',0Dh,0Ah + 10071 0000250D 0D0A + 10072 ;*** + 10073 + 10074 ;HELPMSG8: + 10075 ; 23/07/2024 - PCDOS 7.1 COMMAND.COM + 10076 ;HELPMSG9: + 10077 HELPMSG11: + 10078 ;db 78 + 10079 ;db ' /MSG Specifies that all error messages be stored in ' + 10080 ;db 'memory. You',0Dh,0Ah + 10081 ;HELPMSG9: + 10082 ;db 56 + 10083 ;db ' need to specify /P with this switch.',0Dh,0Ah + 10084 0000250F 4A db 74 + 10085 00002510 20202F592020202020- db ' /Y Steps through the batch program specified by /C' + 10085 00002519 202020202020202020- + 10085 00002522 537465707320746872- + 10085 0000252B 6F7567682074686520- + 10085 00002534 62617463682070726F- + 10085 0000253D 6772616D2073706563- + 10085 00002546 696669656420627920- + 10085 0000254F 2F43 + 10086 00002551 206F72202F4B2E0D0A db ' or /K.',0Dh,0Ah + 10087 + 10088 ; 07/06/2023 + 10089 ; 23/07/2024 + 10090 ;HELPMSG10: + 10091 HELPMSG12: + 10092 0000255A 3F db 63 + 10093 0000255B 20202F4320636F6D6D- db ' /C command Executes the specified command and returns.',0Dh,0Ah + 10093 00002564 616E64202020202020- + 10093 0000256D 457865637574657320- + 10093 00002576 746865207370656369- + 10093 0000257F 6669656420636F6D6D- + 10093 00002588 616E6420616E642072- + 10093 00002591 657475726E732E0D0A + 10094 ; 23/07/2024 + 10095 ;HELPMSG11: + 10096 HELPMSG13: + 10097 0000259A 4B db 75 + 10098 0000259B 20202F4B20636F6D6D- db ' /K command Executes the specified command and continues running.' + 10098 000025A4 616E64202020202020- + 10098 000025AD 457865637574657320- + 10098 000025B6 746865207370656369- + 10098 000025BF 6669656420636F6D6D- + 10098 000025C8 616E6420616E642063- + 10098 000025D1 6F6E74696E75657320- + 10098 000025DA 72756E6E696E672E + 10099 000025E2 0D0A db 0Dh,0Ah + 10100 000025E4 0D0A db 0Dh,0Ah + 10101 ;HELPMSG12: + 10102 ; 23/07/2024 + 10103 HELPMSG14: + 10104 000025E6 4C db 76 + 10105 000025E7 546865202F5020616E- db 'The /P and /MSG switches may be used only when COMMAND is started' + 10105 000025F0 64202F4D5347207377- + 10105 000025F9 697463686573206D61- + 10105 00002602 792062652075736564- + 10105 0000260B 206F6E6C7920776865- + 10105 00002614 6E20434F4D4D414E44- + 10105 0000261D 206973207374617274- + 10105 00002626 6564 + 10106 00002628 206279207573696E67- db ' by using',0Dh,0Ah + 10106 00002631 0D0A + 10107 ;HELPMSG13: + 10108 ; 23/07/2024 + 10109 HELPMSG15: + 10110 00002633 2B db 43 + 10111 00002634 746865205348454C4C- db 'the SHELL command in the CONFIG.SYS file.',0Dh,0Ah + 10111 0000263D 20636F6D6D616E6420- + 10111 00002646 696E2074686520434F- + 10111 0000264F 4E4649472E53595320- + 10111 00002658 66696C652E0D0A + 10112 + 10113 HelpMsgs: + 10114 0000265F [5C22] dw HELPMSG1 + 10115 00002661 [9522] dw HELPMSG2 + 10116 00002663 [CE22] dw HELPMSG3 + 10117 00002665 [0323] dw HELPMSG4 + 10118 00002667 [4C23] dw HELPMSG5 + 10119 00002669 [9A23] dw HELPMSG6 + 10120 0000266B [E023] dw HELPMSG7 + 10121 0000266D [2E24] dw HELPMSG8 + 10122 0000266F [7524] dw HELPMSG9 + 10123 + 10124 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 10125 00002671 [C024] dw HELPMSG10 + 10126 00002673 [0F25] dw HELPMSG11 + 10127 00002675 [5A25] dw HELPMSG12 + 10128 00002677 [9A25] dw HELPMSG13 + 10129 + 10130 ; 23/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 10131 00002679 [E625] dw HELPMSG14 + 10132 0000267B [3326] dw HELPMSG15 10133 - 10134 ;----------------------------------------------------------------------------- - 10135 - 10136 ;SR; - 10137 ; This table of offsets is used by the init code to calculate the new offsets - 10138 ;for these labels after the resident code has been relocated - 10139 - 10140 ;Reloc_Table: - 10141 ;dw offset CODERES:MsgInt2fHandler - 10142 ;dw offset CODERES:Int_2e - 10143 ;dw offset CODERES:ContC - 10144 ;dw offset CODERES:DskErr - 10145 ;dw offset CODERES:Exec_Ret - 10146 ;dw offset CODERES:TRemCheck - 10147 ;dw offset CODERES:TrnLodCom1 - 10148 ;dw offset CODERES:LodCom - 10149 ;dw offset CODERES:MsgRetriever - 10150 ;dw offset CODERES:THeadFix - 10151 ;dw offset CODERES:Lh_OffUnlink ; M003 - 10152 - 10153 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10154 ; MSDOS 5.0 COMMAND.COM - RESGROUP:22F6h + 10134 ; 23/04/2023 + 10135 0000267D 0000 dw 0 + 10136 + 10137 ;----------------------------------------------------------------------------- + 10138 + 10139 ;SR; + 10140 ; This table of offsets is used by the init code to calculate the new offsets + 10141 ;for these labels after the resident code has been relocated + 10142 + 10143 ;Reloc_Table: + 10144 ;dw offset CODERES:MsgInt2fHandler + 10145 ;dw offset CODERES:Int_2e + 10146 ;dw offset CODERES:ContC + 10147 ;dw offset CODERES:DskErr + 10148 ;dw offset CODERES:Exec_Ret + 10149 ;dw offset CODERES:TRemCheck + 10150 ;dw offset CODERES:TrnLodCom1 + 10151 ;dw offset CODERES:LodCom + 10152 ;dw offset CODERES:MsgRetriever + 10153 ;dw offset CODERES:THeadFix + 10154 ;dw offset CODERES:Lh_OffUnlink ; M003 10155 - 10156 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10157 ; MSDOS 6.22 COMMAND.COM - RESGROUP:26C1h + 10156 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10157 ; MSDOS 5.0 COMMAND.COM - RESGROUP:22F6h 10158 - 10159 Reloc_Table: ; 23/07/2024 ; PCDOS 7.1 COMMAND.COM CODERES addresses - 10160 0000267F 9007 dw MsgInt2fHandler - RCODE_START ; 7B2h (RESGROUP:7B2h+X) * - 10161 00002681 7601 dw Int_2e - RCODE_START ; 170h (RESGROUP:170h+X) * - 10162 00002683 3300 dw ContC - RCODE_START ; 02Eh (RESGROUP:02Eh+X) * - 10163 00002685 7B04 dw DSKERR - RCODE_START ; 495h (RESGROUP:495h+X) * - 10164 00002687 2700 dw Exec_Ret - RCODE_START ; 022h (RESGROUP:022h+X) * - 10165 00002689 A402 dw TRemCheck - RCODE_START ; 2A6h (RESGROUP:2A6h+X) * - 10166 0000268B 4604 dw TrnLodCom1 - RCODE_START ; 472h (RESGROUP:472h+X) * - 10167 0000268D AD01 dw LodCom - RCODE_START ; 1A7h (RESGROUP:1A7h+X) * - 10168 0000268F D307 dw MsgRetriever - RCODE_START ; 7F5h (RESGROUP:7F5h+X) * - 10169 00002691 C302 dw THeadFix - RCODE_START ; 2C5h (RESGROUP:2C5h+X) * - 10170 00002693 4C08 dw Lh_OffUnlink - RCODE_START ; 86Eh (RESGROUP:86Eh+X) * - 10171 - 10172 ; MSDOS 6.22 COMMAND.COM Reloc_Table CODERES addresses: - 10173 ; 738h,177h,035h,445h,029h,2A3h,422h,1AEh,77Bh,2C2h,7F4h + 10159 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10160 ; MSDOS 6.22 COMMAND.COM - RESGROUP:26C1h + 10161 + 10162 Reloc_Table: ; 23/07/2024 ; PCDOS 7.1 COMMAND.COM CODERES addresses + 10163 0000267F 9007 dw MsgInt2fHandler - RCODE_START ; 7B2h (RESGROUP:7B2h+X) * + 10164 00002681 7601 dw Int_2e - RCODE_START ; 170h (RESGROUP:170h+X) * + 10165 00002683 3300 dw ContC - RCODE_START ; 02Eh (RESGROUP:02Eh+X) * + 10166 00002685 7B04 dw DSKERR - RCODE_START ; 495h (RESGROUP:495h+X) * + 10167 00002687 2700 dw Exec_Ret - RCODE_START ; 022h (RESGROUP:022h+X) * + 10168 00002689 A402 dw TRemCheck - RCODE_START ; 2A6h (RESGROUP:2A6h+X) * + 10169 0000268B 4604 dw TrnLodCom1 - RCODE_START ; 472h (RESGROUP:472h+X) * + 10170 0000268D AD01 dw LodCom - RCODE_START ; 1A7h (RESGROUP:1A7h+X) * + 10171 0000268F D307 dw MsgRetriever - RCODE_START ; 7F5h (RESGROUP:7F5h+X) * + 10172 00002691 C302 dw THeadFix - RCODE_START ; 2C5h (RESGROUP:2C5h+X) * + 10173 00002693 4C08 dw Lh_OffUnlink - RCODE_START ; 86Eh (RESGROUP:86Eh+X) * 10174 - 10175 ; 07/06/2023 - 10176 ; X = 0D40h for MSDOS 5.0 COMMAND.COM - 10177 ; X = 0E50h for MSDOS 6.22 COMMAND.COM - 10178 ; 23/07/2024 - 10179 ; X = 0E10h for PCDOS 7.1 COMMAND.COM - 10180 ;; example: - 10181 ;; MsgIn2FHandler is at RESGROUP:15C2h or at CODERES:07B2h - 10182 ;; (in PCDOS 7.1 COMMAND.COM) - 10183 - 10184 NUM_RELOC_ENTRIES equ ($-Reloc_Table)/2 - 10185 - 10186 ResJmpTable: - 10187 00002695 00000000 dd 0 ; stores prev stub jump table addr - 10188 FirstCom: - 10189 00002699 00 db 0 ; flag set if first command.com - 10190 DevFlag: - 10191 0000269A 00 db 0 - 10192 PathFlag: - 10193 0000269B 00 db 0 - 10194 - 10195 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:2313h - 10196 ;;times 13 db 0 + 10175 ; MSDOS 6.22 COMMAND.COM Reloc_Table CODERES addresses: + 10176 ; 738h,177h,035h,445h,029h,2A3h,422h,1AEh,77Bh,2C2h,7F4h + 10177 + 10178 ; 07/06/2023 + 10179 ; X = 0D40h for MSDOS 5.0 COMMAND.COM + 10180 ; X = 0E50h for MSDOS 6.22 COMMAND.COM + 10181 ; 23/07/2024 + 10182 ; X = 0E10h for PCDOS 7.1 COMMAND.COM + 10183 ;; example: + 10184 ;; MsgIn2FHandler is at RESGROUP:15C2h or at CODERES:07B2h + 10185 ;; (in PCDOS 7.1 COMMAND.COM) + 10186 + 10187 NUM_RELOC_ENTRIES equ ($-Reloc_Table)/2 + 10188 + 10189 ResJmpTable: + 10190 00002695 00000000 dd 0 ; stores prev stub jump table addr + 10191 FirstCom: + 10192 00002699 00 db 0 ; flag set if first command.com + 10193 DevFlag: + 10194 0000269A 00 db 0 + 10195 PathFlag: + 10196 0000269B 00 db 0 10197 - 10198 ; 07/06/2023 - 10199 ; MSDOS 6.22 COMMAND.COM - RESGROUP:26DEh - 10200 ;times 2 db 0 - 10201 - 10202 ; 30/01/2023 - 10203 coderes_end equ $ + 10198 ;; MSDOS 5.0 COMMAND.COM - RESGROUP:2313h + 10199 ;;times 13 db 0 + 10200 + 10201 ; 07/06/2023 + 10202 ; MSDOS 6.22 COMMAND.COM - RESGROUP:26DEh + 10203 ;times 2 db 0 10204 - 10205 ;INIT ENDS - 10206 - 10207 ; END - 10208 - 10209 ;----------------------------------------------------------------------------- - 10210 ; 14/10/2018 (Retro DOS v3.0 COMMAND.COM Signature) - 10211 ;----------------------------------------------------------------------------- - 10212 - 10213 ;db "Retro DOS v3.0 COMMAND.COM by Erdogan Tan [2018]" - 10214 ; 30/01/2023 - 10215 0000269C 00 db 0 - 10216 ;db "Retro DOS v4.0 COMMAND.COM by Erdogan Tan [2023]" - 10217 ; 07/06/2023 - 10218 ;db "Retro DOS v4.2 COMMAND.COM by Erdogan Tan [2023]" - 10219 ; 21/07/2024 - 10220 0000269D 526574726F20444F53- db "Retro DOS v5.0 COMMAND.COM by Erdogan Tan [2024]" - 10220 000026A6 2076352E3020434F4D- - 10220 000026AF 4D414E442E434F4D20- - 10220 000026B8 6279204572646F6761- - 10220 000026C1 6E2054616E205B3230- - 10220 000026CA 32345D - 10221 000026CD 00 db 0 - 10222 - 10223 ;----------------------------------------------------------------------------- - 10224 ; 24/09/2018 (Retro DOS v3.0 COMMAND) - 10225 ;----------------------------------------------------------------------------- - 10226 - 10227 ;TAIL SEGMENT PUBLIC PARA - 10228 ; ORG 0 - 10229 ;TRANSTART LABEL WORD - 10230 ;TAIL ENDS - 10231 - 10232 ;ALIGN 16 ; 25/09/2018 - 10233 - 10234 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10235 - 10236 numbertodiv equ ($-StartCode)+100h ; 16/04/2023 - 10237 numbertomod equ (numbertodiv % 16) + 10205 ; 30/01/2023 + 10206 coderes_end equ $ + 10207 + 10208 ;INIT ENDS + 10209 + 10210 ; END + 10211 + 10212 ;----------------------------------------------------------------------------- + 10213 ; 14/10/2018 (Retro DOS v3.0 COMMAND.COM Signature) + 10214 ;----------------------------------------------------------------------------- + 10215 + 10216 ;db "Retro DOS v3.0 COMMAND.COM by Erdogan Tan [2018]" + 10217 ; 30/01/2023 + 10218 0000269C 00 db 0 + 10219 ;db "Retro DOS v4.0 COMMAND.COM by Erdogan Tan [2023]" + 10220 ; 07/06/2023 + 10221 ;db "Retro DOS v4.2 COMMAND.COM by Erdogan Tan [2023]" + 10222 ; 21/07/2024 + 10223 0000269D 526574726F20444F53- db "Retro DOS v5.0 COMMAND.COM by Erdogan Tan [2024]" + 10223 000026A6 2076352E3020434F4D- + 10223 000026AF 4D414E442E434F4D20- + 10223 000026B8 6279204572646F6761- + 10223 000026C1 6E2054616E205B3230- + 10223 000026CA 32345D + 10224 000026CD 00 db 0 + 10225 + 10226 ;----------------------------------------------------------------------------- + 10227 ; 24/09/2018 (Retro DOS v3.0 COMMAND) + 10228 ;----------------------------------------------------------------------------- + 10229 + 10230 ;TAIL SEGMENT PUBLIC PARA + 10231 ; ORG 0 + 10232 ;TRANSTART LABEL WORD + 10233 ;TAIL ENDS + 10234 + 10235 ;ALIGN 16 ; 25/09/2018 + 10236 + 10237 ; 30/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 10238 - 10239 %if numbertomod>0 & numbertomod<16 - 10240 000026CE 00 times (16-numbertomod) db 0 - 10241 %endif - 10242 - 10243 ; 30/01/2023 - 10244 ;TRANSTART: + 10239 numbertodiv equ ($-StartCode)+100h ; 16/04/2023 + 10240 numbertomod equ (numbertodiv % 16) + 10241 + 10242 %if numbertomod>0 & numbertomod<16 + 10243 000026CE 00 times (16-numbertomod) db 0 + 10244 %endif 10245 - 10246 ; 21/04/2018 (Retro DOS v2.0 COMMAND) - 10247 ; times 128 db 0 + 10246 ; 30/01/2023 + 10247 ;TRANSTART: 10248 - 10249 ;----------------------------------------------------------------------------- - 10250 ; SEGMENT - TRANSCODE - 10251 ;----------------------------------------------------------------------------- - 10252 - 10253 ;TRANGROUP: ; 21/04/2018 - 10254 - 10255 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10256 ;----------------------------------------------------------------------------- + 10249 ; 21/04/2018 (Retro DOS v2.0 COMMAND) + 10250 ; times 128 db 0 + 10251 + 10252 ;----------------------------------------------------------------------------- + 10253 ; SEGMENT - TRANSCODE + 10254 ;----------------------------------------------------------------------------- + 10255 + 10256 ;TRANGROUP: ; 21/04/2018 10257 - 10258 ; MSDOS 3.3 COMMAND.COM Transient Portion Addresses - 10259 - 10260 ; 21/04/2018 - Retro DOS v2.0 - 10261 ; transcom.s (COMMAND.COM source file 2 of 2) code/data addresses - 10262 ; (these values must be changed when transcom.s source code is changed - 10263 ; and data offsets are changed) - 10264 ; - 10265 ; 30/04/2018 - 10266 ; 29/04/2018 - 10267 - 10268 ; 24/09/2018 (original MSDOS 3.3 COMMAND.COM TrnSeg offset addresses) - 10269 ;COMMAND EQU 012CH - 10270 ;DATINIT EQU 2091H - 10271 ;HEADCALL EQU 428FH - 10272 ;TRANSPACEEND EQU 4D5CH - 10273 ;TRANDATAEND EQU 3F44H - 10274 - 10275 ; 29/04/2018 (original MSDOS 3.3 COMMAND.COM TrnSeg offset addresses) - 10276 ;TRIAGE_INIT EQU 1F15H - 10277 ;PRINTF_INIT EQU 34E0H - 10278 - 10279 ;GETEXTERRNUM EQU 1EEEH ; TRIAGEERROR (GET_EXT_ERR_NUMBER) proc addr - 10280 - 10281 ;TPA EQU 4293H - 10282 ;TRNLEN EQU 04D6H + 10258 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10259 ;----------------------------------------------------------------------------- + 10260 + 10261 ; MSDOS 3.3 COMMAND.COM Transient Portion Addresses + 10262 + 10263 ; 21/04/2018 - Retro DOS v2.0 + 10264 ; transcom.s (COMMAND.COM source file 2 of 2) code/data addresses + 10265 ; (these values must be changed when transcom.s source code is changed + 10266 ; and data offsets are changed) + 10267 ; + 10268 ; 30/04/2018 + 10269 ; 29/04/2018 + 10270 + 10271 ; 24/09/2018 (original MSDOS 3.3 COMMAND.COM TrnSeg offset addresses) + 10272 ;COMMAND EQU 012CH + 10273 ;DATINIT EQU 2091H + 10274 ;HEADCALL EQU 428FH + 10275 ;TRANSPACEEND EQU 4D5CH + 10276 ;TRANDATAEND EQU 3F44H + 10277 + 10278 ; 29/04/2018 (original MSDOS 3.3 COMMAND.COM TrnSeg offset addresses) + 10279 ;TRIAGE_INIT EQU 1F15H + 10280 ;PRINTF_INIT EQU 34E0H + 10281 + 10282 ;GETEXTERRNUM EQU 1EEEH ; TRIAGEERROR (GET_EXT_ERR_NUMBER) proc addr 10283 - 10284 ; 20/10/2018 - Retro DOS v3.0 COMMAND.COM transient portion addresses - 10285 ;COMMAND EQU 012CH - 10286 ;DATINIT EQU 206FH - 10287 ;HEADCALL EQU 426FH - 10288 ; 09/01/2023 - 10289 ;TRANSPACEEND EQU 4D3CH - 10290 ;TRANDATAEND EQU 3F24H - 10291 ;TRIAGE_INIT EQU 1EF3H - 10292 ;PRINTF_INIT EQU 34BFH - 10293 ; - 10294 ;GETEXTERRNUM EQU 1ECCH ; TRIAGEERROR (GET_EXT_ERR_NUMBER) proc addr - 10295 - 10296 ;----------------------------------------------------------------------------- - 10297 ; ARENA.INC, MSDOS 6.0, 1991 - 10298 ;----------------------------------------------------------------------------- - 10299 ; 13/10/2018 - Retro DOS 3.0 - 10300 ; 17/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10301 - 10302 ;BREAK - 10303 - 10304 ; (-*-) Same with MSDOS 2.11 & MSDOS 6.0 - 10305 - 10306 ; arena item - 10307 - 10308 struc ARENA - 10309 00000000 ?? .signature: resb 1 ; 4D for valid item, 5A for last item - 10310 00000001 ???? .owner: resw 1 ; owner of arena item - 10311 00000003 ???? .size: resw 1 ; size in paragraphs of item - 10312 endstruc - 10313 - 10314 ;----------------------------------------------------------------------------- - 10315 ;START OF TRANSIENT PORTION - 10316 ;This code is loaded at the end of memory and may be overwritten by - 10317 ;memory-intensive user programs. - 10318 ;----------------------------------------------------------------------------- - 10319 - 10320 ; 16/04/2023 - 10321 TRANSTART EQU ($-StartCode)+100h ; 18/04/2023 - 10322 ; 29/09/2018 - 10323 ; 31/01/2023 - 10324 ;TRANSTART: ; Offset 1660h in original MSDOS 3.3 COMMAND.COM - 10325 - 10326 ; 09/01/2023 - 10327 ; Offset 2320h in original MSDOS 5.0 COMMAND.COM + 10284 ;TPA EQU 4293H + 10285 ;TRNLEN EQU 04D6H + 10286 + 10287 ; 20/10/2018 - Retro DOS v3.0 COMMAND.COM transient portion addresses + 10288 ;COMMAND EQU 012CH + 10289 ;DATINIT EQU 206FH + 10290 ;HEADCALL EQU 426FH + 10291 ; 09/01/2023 + 10292 ;TRANSPACEEND EQU 4D3CH + 10293 ;TRANDATAEND EQU 3F24H + 10294 ;TRIAGE_INIT EQU 1EF3H + 10295 ;PRINTF_INIT EQU 34BFH + 10296 ; + 10297 ;GETEXTERRNUM EQU 1ECCH ; TRIAGEERROR (GET_EXT_ERR_NUMBER) proc addr + 10298 + 10299 ;----------------------------------------------------------------------------- + 10300 ; ARENA.INC, MSDOS 6.0, 1991 + 10301 ;----------------------------------------------------------------------------- + 10302 ; 13/10/2018 - Retro DOS 3.0 + 10303 ; 17/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10304 + 10305 ;BREAK + 10306 + 10307 ; (-*-) Same with MSDOS 2.11 & MSDOS 6.0 + 10308 + 10309 ; arena item + 10310 + 10311 struc ARENA + 10312 00000000 ?? .signature: resb 1 ; 4D for valid item, 5A for last item + 10313 00000001 ???? .owner: resw 1 ; owner of arena item + 10314 00000003 ???? .size: resw 1 ; size in paragraphs of item + 10315 endstruc + 10316 + 10317 ;----------------------------------------------------------------------------- + 10318 ;START OF TRANSIENT PORTION + 10319 ;This code is loaded at the end of memory and may be overwritten by + 10320 ;memory-intensive user programs. + 10321 ;----------------------------------------------------------------------------- + 10322 + 10323 ; 16/04/2023 + 10324 TRANSTART EQU ($-StartCode)+100h ; 18/04/2023 + 10325 ; 29/09/2018 + 10326 ; 31/01/2023 + 10327 ;TRANSTART: ; Offset 1660h in original MSDOS 3.3 COMMAND.COM 10328 - 10329 ; 07/06/2023 - 10330 ; Offset 26E0h in original MSDOS 6.22 COMMAND.COM - 10331 - 10332 ; 25/09/2018 - 10333 ; (original MSDOS 3.3 COMMAND.COM TRIAGEERROR offset address) - 10334 ; - 10335 ; 'GET_EXT_ERR_NUMBER' ('TRIAGEERROR') procedure is at offset 354Eh - 10336 ; in MSDOS 3.3 COMMAND.COM (It is at offset 1EEEh in transient porsion). + 10329 ; 09/01/2023 + 10330 ; Offset 2320h in original MSDOS 5.0 COMMAND.COM + 10331 + 10332 ; 07/06/2023 + 10333 ; Offset 26E0h in original MSDOS 6.22 COMMAND.COM + 10334 + 10335 ; 25/09/2018 + 10336 ; (original MSDOS 3.3 COMMAND.COM TRIAGEERROR offset address) 10337 ; - 10338 ;TRIAGEERROR EQU TRANSTART+GETEXTERRNUM-100H - 10339 ; + 10338 ; 'GET_EXT_ERR_NUMBER' ('TRIAGEERROR') procedure is at offset 354Eh + 10339 ; in MSDOS 3.3 COMMAND.COM (It is at offset 1EEEh in transient porsion). 10340 ; - 10341 ;COMTRANS: + 10341 ;TRIAGEERROR EQU TRANSTART+GETEXTERRNUM-100H 10342 ; - 10343 ; 20/10/2018 - Retro DOS v3.0 - 10344 ;INCBIN "TRANCOM3.BIN" + 10343 ; + 10344 ;COMTRANS: 10345 ; - 10346 ;COMLEN EQU $-COMTRANS ; End of COMMAND load. - 10347 ; - 10348 ; 29/04/2018 - 10349 ;BSS_SIZE EQU TRANSPACEEND-TRANDATAEND + 10346 ; 20/10/2018 - Retro DOS v3.0 + 10347 ;INCBIN "TRANCOM3.BIN" + 10348 ; + 10349 ;COMLEN EQU $-COMTRANS ; End of COMMAND load. 10350 ; - 10351 ;TIMES BSS_SIZE db 0 - 10352 ; - 10353 ;COMLEN EQU $-COMTRANS ; 30/04/2018 - 10354 - 10355 ;COMMANDCOMSIZE equ $ - 100h - 10356 - 10357 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10358 ; ============================================================================ - 10359 ; --- ('trancom5.s', 31/01/2023 - modified from 'trancom3.s', 20/10/2018) ---- - 10360 ; ============================================================================ - 10361 - 10362 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM (MSDOS 6.22 COMMAND.COM) - 10363 - 10364 ; ---------------------------------------------------------------------------- - 10365 ; START OF TRANSIENT PORTION - 10366 ; ---------------------------------------------------------------------------- - 10367 ; SEGMENT - TRANSCODE - 10368 ; ---------------------------------------------------------------------------- - 10369 - 10370 ; 18/04/2023 - 10371 section .TRANGROUP vstart=0 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) + 10351 ; 29/04/2018 + 10352 ;BSS_SIZE EQU TRANSPACEEND-TRANDATAEND + 10353 ; + 10354 ;TIMES BSS_SIZE db 0 + 10355 ; + 10356 ;COMLEN EQU $-COMTRANS ; 30/04/2018 + 10357 + 10358 ;COMMANDCOMSIZE equ $ - 100h + 10359 + 10360 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10361 ; ============================================================================ + 10362 ; --- ('trancom5.s', 31/01/2023 - modified from 'trancom3.s', 20/10/2018) ---- + 10363 ; ============================================================================ + 10364 + 10365 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM (MSDOS 6.22 COMMAND.COM) + 10366 + 10367 ; ---------------------------------------------------------------------------- + 10368 ; START OF TRANSIENT PORTION + 10369 ; ---------------------------------------------------------------------------- + 10370 ; SEGMENT - TRANSCODE + 10371 ; ---------------------------------------------------------------------------- 10372 10373 ; 18/04/2023 - 10374 ;----------------------------------------------------------------------------- - 10375 ; TRANSCODE segment offset 0 - 10376 TRANSIENTSTART: - 10377 - 10378 ; 31/01/2023 - 10379 00000000 00 times 256 db 0 ; Allow for 100H parameter area + 10374 section .TRANGROUP vstart=0 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) + 10375 + 10376 ; 18/04/2023 + 10377 ;----------------------------------------------------------------------------- + 10378 ; TRANSCODE segment offset 0 + 10379 TRANSIENTSTART: 10380 - 10381 ;============================================================================ - 10382 ; TCODE.ASM, MSDOS 6.0, 1991 - 10383 ;============================================================================ - 10384 ; 12/10/2018 - Retro DOS v3.0 - 10385 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) - 10386 - 10387 ;[ORG 100h] - 10388 - 10389 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0100h - 10390 - 10391 ; --------------------------------------------------------------------------- - 10392 - 10393 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10394 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:0100h) - 10395 - 10396 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10397 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:0100h) - 10398 SETDRV: - 10399 00000100 B40E mov ah,0Eh - 10400 ;mov ah,SET_DEFAULT_DRIVE ; 0Eh - 10401 00000102 CD21 int 21h ; DOS - SELECT DISK - 10402 ; DL = new default drive number - 10403 ; (0 = A, 1 = B, ..) - 10404 ; Return: AL = number of logical drives - 10405 - 10406 ; --------------------------------------------------------------------------- - 10407 - 10408 ; TCOMMAND is the recycle point in COMMAND. Nothing is known here. - 10409 ; No registers (CS:IP) no flags, nothing. + 10381 ; 31/01/2023 + 10382 00000000 00 times 256 db 0 ; Allow for 100H parameter area + 10383 + 10384 ;============================================================================ + 10385 ; TCODE.ASM, MSDOS 6.0, 1991 + 10386 ;============================================================================ + 10387 ; 12/10/2018 - Retro DOS v3.0 + 10388 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) + 10389 + 10390 ;[ORG 100h] + 10391 + 10392 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0100h + 10393 + 10394 ; --------------------------------------------------------------------------- + 10395 + 10396 ; 31/01/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10397 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:0100h) + 10398 + 10399 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10400 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:0100h) + 10401 SETDRV: + 10402 00000100 B40E mov ah,0Eh + 10403 ;mov ah,SET_DEFAULT_DRIVE ; 0Eh + 10404 00000102 CD21 int 21h ; DOS - SELECT DISK + 10405 ; DL = new default drive number + 10406 ; (0 = A, 1 = B, ..) + 10407 ; Return: AL = number of logical drives + 10408 + 10409 ; --------------------------------------------------------------------------- 10410 - 10411 TCOMMAND: - 10412 ; 21/07/2024 - PCDOS 7.1 COMMAND.COM - TRANGROUP:0104h - 10413 ; Retro DOS v5.0 COMMAND.COM - 10414 %if 1 - 10415 00000104 90 nop - 10416 00000105 90 nop - 10417 %endif - 10418 00000106 2E8E1E[F59B] mov ds,[cs:RESSEG] - 10419 0000010B B8FFFF mov ax,-1 - 10420 0000010E 8706[A702] xchg ax,[VerVal] - 10421 00000112 83F8FF cmp ax,-1 - 10422 00000115 7404 je short NOSETVER2 - 10423 00000117 B42E mov ah,2Eh - 10424 ;mov ah,SET_VERIFY_ON_WRITE ; 2Eh - 10425 00000119 CD21 int 21h ; DOS - SET VERIFY FLAG - 10426 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off - 10427 NOSETVER2: - 10428 0000011B 2EFF1E[F39B] call far [cs:HEADCALL] ; Make sure header fixed - 10429 00000120 31ED xor bp,bp ; Flag transient not read - 10430 00000122 833E[A502]FF cmp word [SingleCom],-1 - 10431 00000127 7505 jne short COMMAND - 10432 _$EXITPREP: - 10433 00000129 0E push cs - 10434 0000012A 1F pop ds - 10435 0000012B E9CF23 jmp _$EXIT ; Have finished the single command - 10436 - 10437 ; --------------------------------------------------------------------------- - 10438 ; - 10439 ; Main entry point from resident portion. - 10440 ; - 10441 ; If BP <> 0, then we have just loaded transient portion otherwise we are - 10442 ; just beginning the processing of another command. + 10411 ; TCOMMAND is the recycle point in COMMAND. Nothing is known here. + 10412 ; No registers (CS:IP) no flags, nothing. + 10413 + 10414 TCOMMAND: + 10415 ; 21/07/2024 - PCDOS 7.1 COMMAND.COM - TRANGROUP:0104h + 10416 ; Retro DOS v5.0 COMMAND.COM + 10417 %if 1 + 10418 00000104 90 nop + 10419 00000105 90 nop + 10420 %endif + 10421 00000106 2E8E1E[F59B] mov ds,[cs:RESSEG] + 10422 0000010B B8FFFF mov ax,-1 + 10423 0000010E 8706[A702] xchg ax,[VerVal] + 10424 00000112 83F8FF cmp ax,-1 + 10425 00000115 7404 je short NOSETVER2 + 10426 00000117 B42E mov ah,2Eh + 10427 ;mov ah,SET_VERIFY_ON_WRITE ; 2Eh + 10428 00000119 CD21 int 21h ; DOS - SET VERIFY FLAG + 10429 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off + 10430 NOSETVER2: + 10431 0000011B 2EFF1E[F39B] call far [cs:HEADCALL] ; Make sure header fixed + 10432 00000120 31ED xor bp,bp ; Flag transient not read + 10433 00000122 833E[A502]FF cmp word [SingleCom],-1 + 10434 00000127 7505 jne short COMMAND + 10435 _$EXITPREP: + 10436 00000129 0E push cs + 10437 0000012A 1F pop ds + 10438 0000012B E9CF23 jmp _$EXIT ; Have finished the single command + 10439 + 10440 ; --------------------------------------------------------------------------- + 10441 ; + 10442 ; Main entry point from resident portion. 10443 ; - 10444 ; --------------------------------------------------------------------------- - 10445 - 10446 ; We are not always sure of the state of the world at this time. We presume - 10447 ; worst case and initialize the relevant registers: segments and stack. + 10444 ; If BP <> 0, then we have just loaded transient portion otherwise we are + 10445 ; just beginning the processing of another command. + 10446 ; + 10447 ; --------------------------------------------------------------------------- 10448 - 10449 COMMAND: - 10450 0000012E FC cld - 10451 0000012F 8CC8 mov ax,cs - 10452 00000131 FA cli - 10453 00000132 8ED0 mov ss,ax - 10454 ;mov sp,offset TRANGROUP:STACK - 10455 ; 07/06/2023 - 10456 00000134 BC[9EA5] mov sp,STACK ; 0AF24h for MSDOS 6.22 COMMAND.COM - 10457 ; 09854h for MSDOS 5.0 COMMAND.COM - 10458 ; 25/07/2024 - 10459 ; 0AA2Dh for PCDOS 7.1 COMMAND.COM - 10460 00000137 FB sti - 10461 - 10462 00000138 8EC0 mov es,ax - 10463 - 10464 ; MSDOS 6.0 - 10465 0000013A 8ED8 mov ds,ax ;AN000; set DS to transient - 10466 ;ASSUME ES:TRANGROUP,DS:TRANGROUP ;AC000; - 10467 ;invoke TSYSLOADMSG ;AN000; preload messages - 10468 ; 31/01/2023 - 10469 0000013C E8C653 call TSYSLOADMSG - 10470 0000013F C606[369F]00 mov byte [append_exec],0 ;AN041; set internal append state off - 10471 - 10472 ; MSDOS 3.3 (& MSDOS 6.0) - 10473 ;mov ds,[ss:RESSEG] - 10474 ; 31/01/2023 - 10475 00000144 8E1E[F59B] mov ds,[RESSEG] - 10476 00000148 36C606[D199]80 mov byte [ss:UCOMBUF],128 ; Init UCOMBUF - 10477 0000014E 36C606[549A]80 mov byte [ss:COMBUF],128 ; Init COMBUF (Autoexec doing DATE) - 10478 - 10479 ; If we have just loaded the transient, then we do NOT need to initialize the - 10480 ; command buffer. ???? DO WE NEED TO RESTORE THE USERS DIRECTORY ???? - 10481 ; I guess not: the only circumstances in which we reload the command processor - 10482 ; is after a transient program execution. In this case, we let the current - 10483 ; directory lie where it may. - 10484 - 10485 00000154 09ED or bp,bp ; See if just read - 10486 00000156 7409 jz short TESTRDIR ; Not read, check user directory - 10487 00000158 36C706[D299]010D mov word [ss:UCOMBUF+1],0D01h ; Reset buffer - 10488 0000015F EB17 jmp short NOSETBUF - 10489 TESTRDIR: - 10490 00000161 803E[A102]00 cmp byte [RestDir],0 - 10491 00000166 7410 jz short NOSETBUF ; User directory OK - 10492 00000168 1E push ds - 10493 - 10494 ; We have an unusual situation to handle. The user *may* have changed his - 10495 ; directory as a result of an internal command that got aborted. Restoring it - 10496 ; twice may not help us: the problem may never go away. We just attempt it - 10497 ; once and give up. - 10498 - 10499 00000169 C606[A102]00 mov byte [RestDir],0 ; Flag users dirs OK - 10500 - 10501 ; Restore users directory - 10502 0000016E 0E push cs - 10503 0000016F 1F pop ds - 10504 00000170 BA[D79A] mov dx,USERDIR1 - 10505 00000173 B43B mov ah,3Bh - 10506 ;mov ah,CHDir ; 3Bh - 10507 00000175 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 10508 ; DS:DX -> ASCIZ directory name (may include drive) - 10509 00000177 1F pop ds - 10510 NOSETBUF: - 10511 00000178 803E[1403]00 cmp byte [PipeFiles],0 - 10512 0000017D 740A jz short NOPCLOSE ; Don't bother if they don't exist - 10513 0000017F 803E[1303]00 cmp byte [PipeFlag],0 - 10514 00000184 7503 jnz short NOPCLOSE ; Don't del if still piping - 10515 00000186 E8972F call PIPEDEL - 10516 NOPCLOSE: - 10517 ;mov byte [0BE9h],0 ; MSDOS 3.3 - 10518 ; 31/01/2023 - 10519 00000189 C606[9902]00 mov byte [ExtCom],0 ; Flag internal command - 10520 0000018E 8CC8 mov ax,cs ; Get segment we're in - 10521 00000190 8ED8 mov ds,ax - 10522 00000192 50 push ax - 10523 ; 07/06/2023 (INTERNATVARS addr = STACK addr) - 10524 00000193 BA[9EA5] mov dx,INTERNATVARS ; 0AF24h for MSDOS 6.22 COMMAND.COM - 10525 ; 09854h for MSDOS 5.0 COMMAND.COM - 10526 ; 25/07/2024 - 10527 ; 0AA2Dh for PCDOS 7.1 COMMAND.COM - 10528 00000196 B80038 mov ax,3800h - 10529 ;mov ax,INTERNATIONAL*256 ; 3800h - 10530 00000199 CD21 int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION - 10531 ; get current-country info - 10532 ; DS:DX -> buffer for returned info - 10533 0000019B 58 pop ax - 10534 0000019C 2B06[F79B] sub ax,[TPA] ; AX=size of TPA in paragraphs - 10535 000001A0 53 push bx - 10536 000001A1 BB1000 mov bx,16 - 10537 000001A4 F7E3 mul bx ; DX:AX=size of TPA in bytes - 10538 000001A6 5B pop bx - 10539 000001A7 09D2 or dx,dx ; See if over 64K - 10540 000001A9 7403 jz short SAVSIZ ; OK if not - 10541 000001AB B8FFFF mov ax,-1 ; If so, limit to 65535 bytes - 10542 SAVSIZ: - 10543 - 10544 ; AX is the number of bytes free in the buffer between the resident and the - 10545 ; transient with a maximum of 64K-1. We round this down to a multiple of 512. + 10449 ; We are not always sure of the state of the world at this time. We presume + 10450 ; worst case and initialize the relevant registers: segments and stack. + 10451 + 10452 COMMAND: + 10453 0000012E FC cld + 10454 0000012F 8CC8 mov ax,cs + 10455 00000131 FA cli + 10456 00000132 8ED0 mov ss,ax + 10457 ;mov sp,offset TRANGROUP:STACK + 10458 ; 07/06/2023 + 10459 00000134 BC[9EA5] mov sp,STACK ; 0AF24h for MSDOS 6.22 COMMAND.COM + 10460 ; 09854h for MSDOS 5.0 COMMAND.COM + 10461 ; 25/07/2024 + 10462 ; 0AA2Dh for PCDOS 7.1 COMMAND.COM + 10463 00000137 FB sti + 10464 + 10465 00000138 8EC0 mov es,ax + 10466 + 10467 ; MSDOS 6.0 + 10468 0000013A 8ED8 mov ds,ax ;AN000; set DS to transient + 10469 ;ASSUME ES:TRANGROUP,DS:TRANGROUP ;AC000; + 10470 ;invoke TSYSLOADMSG ;AN000; preload messages + 10471 ; 31/01/2023 + 10472 0000013C E8C653 call TSYSLOADMSG + 10473 0000013F C606[369F]00 mov byte [append_exec],0 ;AN041; set internal append state off + 10474 + 10475 ; MSDOS 3.3 (& MSDOS 6.0) + 10476 ;mov ds,[ss:RESSEG] + 10477 ; 31/01/2023 + 10478 00000144 8E1E[F59B] mov ds,[RESSEG] + 10479 00000148 36C606[D199]80 mov byte [ss:UCOMBUF],128 ; Init UCOMBUF + 10480 0000014E 36C606[549A]80 mov byte [ss:COMBUF],128 ; Init COMBUF (Autoexec doing DATE) + 10481 + 10482 ; If we have just loaded the transient, then we do NOT need to initialize the + 10483 ; command buffer. ???? DO WE NEED TO RESTORE THE USERS DIRECTORY ???? + 10484 ; I guess not: the only circumstances in which we reload the command processor + 10485 ; is after a transient program execution. In this case, we let the current + 10486 ; directory lie where it may. + 10487 + 10488 00000154 09ED or bp,bp ; See if just read + 10489 00000156 7409 jz short TESTRDIR ; Not read, check user directory + 10490 00000158 36C706[D299]010D mov word [ss:UCOMBUF+1],0D01h ; Reset buffer + 10491 0000015F EB17 jmp short NOSETBUF + 10492 TESTRDIR: + 10493 00000161 803E[A102]00 cmp byte [RestDir],0 + 10494 00000166 7410 jz short NOSETBUF ; User directory OK + 10495 00000168 1E push ds + 10496 + 10497 ; We have an unusual situation to handle. The user *may* have changed his + 10498 ; directory as a result of an internal command that got aborted. Restoring it + 10499 ; twice may not help us: the problem may never go away. We just attempt it + 10500 ; once and give up. + 10501 + 10502 00000169 C606[A102]00 mov byte [RestDir],0 ; Flag users dirs OK + 10503 + 10504 ; Restore users directory + 10505 0000016E 0E push cs + 10506 0000016F 1F pop ds + 10507 00000170 BA[D79A] mov dx,USERDIR1 + 10508 00000173 B43B mov ah,3Bh + 10509 ;mov ah,CHDir ; 3Bh + 10510 00000175 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 10511 ; DS:DX -> ASCIZ directory name (may include drive) + 10512 00000177 1F pop ds + 10513 NOSETBUF: + 10514 00000178 803E[1403]00 cmp byte [PipeFiles],0 + 10515 0000017D 740A jz short NOPCLOSE ; Don't bother if they don't exist + 10516 0000017F 803E[1303]00 cmp byte [PipeFlag],0 + 10517 00000184 7503 jnz short NOPCLOSE ; Don't del if still piping + 10518 00000186 E8972F call PIPEDEL + 10519 NOPCLOSE: + 10520 ;mov byte [0BE9h],0 ; MSDOS 3.3 + 10521 ; 31/01/2023 + 10522 00000189 C606[9902]00 mov byte [ExtCom],0 ; Flag internal command + 10523 0000018E 8CC8 mov ax,cs ; Get segment we're in + 10524 00000190 8ED8 mov ds,ax + 10525 00000192 50 push ax + 10526 ; 07/06/2023 (INTERNATVARS addr = STACK addr) + 10527 00000193 BA[9EA5] mov dx,INTERNATVARS ; 0AF24h for MSDOS 6.22 COMMAND.COM + 10528 ; 09854h for MSDOS 5.0 COMMAND.COM + 10529 ; 25/07/2024 + 10530 ; 0AA2Dh for PCDOS 7.1 COMMAND.COM + 10531 00000196 B80038 mov ax,3800h + 10532 ;mov ax,INTERNATIONAL*256 ; 3800h + 10533 00000199 CD21 int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION + 10534 ; get current-country info + 10535 ; DS:DX -> buffer for returned info + 10536 0000019B 58 pop ax + 10537 0000019C 2B06[F79B] sub ax,[TPA] ; AX=size of TPA in paragraphs + 10538 000001A0 53 push bx + 10539 000001A1 BB1000 mov bx,16 + 10540 000001A4 F7E3 mul bx ; DX:AX=size of TPA in bytes + 10541 000001A6 5B pop bx + 10542 000001A7 09D2 or dx,dx ; See if over 64K + 10543 000001A9 7403 jz short SAVSIZ ; OK if not + 10544 000001AB B8FFFF mov ax,-1 ; If so, limit to 65535 bytes + 10545 SAVSIZ: 10546 - 10547 000001AE 3D0002 cmp ax,512 - 10548 000001B1 7603 jbe short GOTSIZE - 10549 ;and ax,~1FFh - 10550 000001B3 2500FE and ax,0FE00h ; NOT 511 = NOT 1FF - 10551 GOTSIZE: - 10552 000001B6 A3[159C] mov [BYTCNT],ax ; Max no. of bytes that can be buffered - 10553 000001B9 8E1E[F59B] mov ds,[RESSEG] ; All batch work must use resident seg. - 10554 - 10555 000001BD F606[9D02]01 test byte [EchoFlag],1 - 10556 000001C2 741E jz short GETCOM ; Don't do the CRLF - 10557 000001C4 E8382F call SINGLETEST - 10558 000001C7 7219 jb short GETCOM - 10559 000001C9 F606[1303]FF test byte [PipeFlag],0FFh ; -1 - 10560 000001CE 7512 jnz short GETCOM - 10561 ; G Don't print prompt in FOR - 10562 000001D0 F606[AB02]FF test byte [ForFlag],0FFh ; -1 - 10563 000001D5 750B jnz short GETCOM - 10564 ; G Don't print prompt if in batch - 10565 000001D7 F706[4902]FFFF test word [Batch],0FFFFh ; -1 - 10566 000001DD 7503 jnz short GETCOM - 10567 000001DF E89727 call CRLF2 - 10568 - 10569 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10570 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:01E0h - 10571 GETCOM: - 10572 000001E2 833E[A502]00 cmp word [SingleCom],0 - 10573 000001E7 750D jnz short GETCOM2 - 10574 000001E9 F706[4902]FFFF test word [Batch],0FFFFh - 10575 000001EF 7505 jnz short GETCOM2 - 10576 000001F1 8026[5A04]EF and byte [Y_Flag],0EFh ; Y/N question overwrite flag ; ~10h - 10577 - 10578 ;GETCOM: ; MSDOS 5.0 COMMAND.COM - 10579 GETCOM2: - 10580 000001F6 C606[B002]00 mov byte [Call_Flag],0 ; G Reset call flags - 10581 000001FB C606[B102]00 mov byte [Call_Batch_Flag],0 - 10582 00000200 B419 mov ah,19h - 10583 ;mov ah,GET_DEFAULT_DRIVE ; 19h - 10584 00000202 CD21 int 21h ; DOS - GET DEFAULT DISK NUMBER - 10585 00000204 36A2[079C] mov [ss:CURDRV],al - 10586 00000208 F606[1303]FF test byte [PipeFlag],0FFh ; -1 ; Pipe has highest presedence - 10587 0000020D 7403 jz short NOPIPE - 10588 0000020F E9DF2F jmp PIPEPROC ; Continue the pipeline - 10589 NOPIPE: - 10590 00000212 F606[9D02]01 test byte [EchoFlag],1 - 10591 00000217 7417 jz short NOPDRV ; No prompt if echo off - 10592 00000219 E8E32E call SINGLETEST - 10593 0000021C 7212 jb short NOPDRV - 10594 0000021E F606[AB02]FF test byte [ForFlag],0FFh ; G Don't print prompt in FOR - 10595 00000223 750B jnz short NOPDRV - 10596 00000225 F706[4902]FFFF test word [Batch],0FFFFh ; G Don't print prompt if in batch - 10597 0000022B 750D jnz short TESTFORBAT - 10598 0000022D E8C01E call PRINT_PROMPT ; Prompt the user - 10599 NOPDRV: - 10600 00000230 F606[AB02]FF test byte [ForFlag],0FFh ; FOR has next highest precedence - 10601 00000235 7403 jz short TESTFORBAT - 10602 00000237 E9BD0C jmp FORPROC ; Continue the FOR - 10603 - 10604 TESTFORBAT: - 10605 0000023A 36C606[A09B]00 mov byte [ss:RE_INSTR],0 ; Turn redirection back off - 10606 00000240 C606[C202]00 mov byte [Re_OutStr],0 ; [0C09h] for MSDOS 3.3 - 10607 00000245 C606[C102]00 mov byte [Re_Out_App],0 ; [0C08h] for MSDOS 3.3 - 10608 0000024A C606[AA02]00 mov byte [IfFlag],0 ; no more ifs... - 10609 0000024F F706[4902]FFFF test word [Batch],0FFFFh ; Batch has lowest precedence - 10610 00000255 7441 jz short ISNOBAT - 10611 - 10612 ; 31/01/2023 - 10613 - 10614 ; MSDOS 6.0 - 10615 - 10616 ; Bugbug: MULT_SHELL_GET no longer used? - 10617 - 10618 00000257 06 push es ;AN000; save ES - 10619 00000258 1E push ds ;AN000; save DS - 10620 ;mov ax,mult_shell_get ;AN000; check to see if SHELL has command - 10621 ; 05/02/2023 - 10622 00000259 B80219 mov ax,1902h - 10623 0000025C 8E06[4902] mov es,[Batch] ;AN000; get batch segment - 10624 ;mov di,20h - 10625 00000260 BF2000 mov di,BATCHSEGMENT.BatFile ;AN000; get batch file name - 10626 00000263 0E push cs ;AN000; get local segment to DS - 10627 00000264 1F pop ds ;AN000; - 10628 ;mov dx,offset trangroup:combuf ;AN000; pass communications buffer - 10629 00000265 BA[549A] mov dx,COMBUF - 10630 00000268 CD2F int 2Fh ;AN000; call the shell - 10631 ; - Multiplex - DOS 4.x only SHELLB.COM - COMMAND.COM INTERFACE - 10632 ; ES:DI -> ASCIZ full filename of current batch file, with at least the - 10633 ; final filename element uppercased - 10634 ; DS:DX -> buffer for results - 10635 ;cmp al,0FFh - 10636 0000026A 3CFF cmp al,shell_action ;AN000; does shell have a commmand? - 10637 0000026C 1F pop ds ;AN000; restore DS - 10638 0000026D 07 pop es ;AN000; restore ES - 10639 0000026E 7424 jz short JDOCOM1 ;AN000; yes - go process command - 10640 - 10641 ; MSDOS 3.3 (& MSDOS 6.0) - 10642 00000270 1E push ds - 10643 00000271 E80E04 call READBAT ; Continue BATCH - 10644 00000274 1F pop ds - 10645 00000275 C606[B402]00 mov byte [NullFlag],0 ;G reset no command flag - 10646 0000027A F706[4902]FFFF test word [Batch],0FFFFh - 10647 00000280 7512 jnz short JDOCOM1 ;G if batch still in progress continue - 10648 00000282 8B1E[B202] mov bx,[Next_Batch] - 10649 ; 31/01/2023 - 10650 00000286 09DB or bx,bx - 10651 ;cmp bx,0 ;G see if there is a new batch file - 10652 00000288 740A jz short JDOCOM1 ;G no - go do command - 10653 0000028A 891E[4902] mov [Batch],bx ;G get segment of next batch file - 10654 0000028E C706[B202]0000 mov word [Next_Batch],0 ;G reset next batch - 10655 JDOCOM1: - 10656 00000294 0E push cs - 10657 00000295 1F pop ds - 10658 ;jmp short DOCOM1 - 10659 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 10660 00000296 EB5D jmp short DOCOM0 - 10661 ISNOBAT: - 10662 00000298 833E[A502]00 cmp word [SingleCom],0 - 10663 0000029D 741D jz short REGCOM - 10664 ; 07/06/2023 - MSDOS 6.22 COMMAND.COM - 10665 0000029F 8B36[A302] mov si,[SemiPermCom] ; MSDOS 6.0 - 10666 ;mov si,0FFFFh ; MSDOS 3.3 & MSDOS 5.0 - 10667 000002A3 8736[A502] xchg si,[SingleCom] - 10668 000002A7 BF[569A] mov di,COMBUF+2 - 10669 000002AA 31C9 xor cx,cx - 10670 SINGLELOOP: - 10671 000002AC AC lodsb - 10672 000002AD AA stosb - 10673 000002AE 41 inc cx - 10674 000002AF 3C0D cmp al,0Dh - 10675 000002B1 75F9 jnz short SINGLELOOP - 10676 000002B3 49 dec cx - 10677 000002B4 0E push cs - 10678 000002B5 1F pop ds - 10679 000002B6 880E[559A] mov [COMBUF+1],cl - 10680 - 10681 ; do NOT issue a trailing CRLF... - 10682 - 10683 ;jmp short DOCOM1 - 10684 ; 07/06/2023 - 10685 ; MSDOS 6.22 COMMAND.COM - 10686 000002BA EB39 jmp short DOCOM0 - 10687 - 10688 ;nop - 10689 - 10690 ; 31/01/2023 - Retro DOS v4.0 COMMAND.COM - 10691 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:02A6h + 10547 ; AX is the number of bytes free in the buffer between the resident and the + 10548 ; transient with a maximum of 64K-1. We round this down to a multiple of 512. + 10549 + 10550 000001AE 3D0002 cmp ax,512 + 10551 000001B1 7603 jbe short GOTSIZE + 10552 ;and ax,~1FFh + 10553 000001B3 2500FE and ax,0FE00h ; NOT 511 = NOT 1FF + 10554 GOTSIZE: + 10555 000001B6 A3[159C] mov [BYTCNT],ax ; Max no. of bytes that can be buffered + 10556 000001B9 8E1E[F59B] mov ds,[RESSEG] ; All batch work must use resident seg. + 10557 + 10558 000001BD F606[9D02]01 test byte [EchoFlag],1 + 10559 000001C2 741E jz short GETCOM ; Don't do the CRLF + 10560 000001C4 E8382F call SINGLETEST + 10561 000001C7 7219 jb short GETCOM + 10562 000001C9 F606[1303]FF test byte [PipeFlag],0FFh ; -1 + 10563 000001CE 7512 jnz short GETCOM + 10564 ; G Don't print prompt in FOR + 10565 000001D0 F606[AB02]FF test byte [ForFlag],0FFh ; -1 + 10566 000001D5 750B jnz short GETCOM + 10567 ; G Don't print prompt if in batch + 10568 000001D7 F706[4902]FFFF test word [Batch],0FFFFh ; -1 + 10569 000001DD 7503 jnz short GETCOM + 10570 000001DF E89727 call CRLF2 + 10571 + 10572 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10573 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:01E0h + 10574 GETCOM: + 10575 000001E2 833E[A502]00 cmp word [SingleCom],0 + 10576 000001E7 750D jnz short GETCOM2 + 10577 000001E9 F706[4902]FFFF test word [Batch],0FFFFh + 10578 000001EF 7505 jnz short GETCOM2 + 10579 000001F1 8026[5A04]EF and byte [Y_Flag],0EFh ; Y/N question overwrite flag ; ~10h + 10580 + 10581 ;GETCOM: ; MSDOS 5.0 COMMAND.COM + 10582 GETCOM2: + 10583 000001F6 C606[B002]00 mov byte [Call_Flag],0 ; G Reset call flags + 10584 000001FB C606[B102]00 mov byte [Call_Batch_Flag],0 + 10585 00000200 B419 mov ah,19h + 10586 ;mov ah,GET_DEFAULT_DRIVE ; 19h + 10587 00000202 CD21 int 21h ; DOS - GET DEFAULT DISK NUMBER + 10588 00000204 36A2[079C] mov [ss:CURDRV],al + 10589 00000208 F606[1303]FF test byte [PipeFlag],0FFh ; -1 ; Pipe has highest presedence + 10590 0000020D 7403 jz short NOPIPE + 10591 0000020F E9DF2F jmp PIPEPROC ; Continue the pipeline + 10592 NOPIPE: + 10593 00000212 F606[9D02]01 test byte [EchoFlag],1 + 10594 00000217 7417 jz short NOPDRV ; No prompt if echo off + 10595 00000219 E8E32E call SINGLETEST + 10596 0000021C 7212 jb short NOPDRV + 10597 0000021E F606[AB02]FF test byte [ForFlag],0FFh ; G Don't print prompt in FOR + 10598 00000223 750B jnz short NOPDRV + 10599 00000225 F706[4902]FFFF test word [Batch],0FFFFh ; G Don't print prompt if in batch + 10600 0000022B 750D jnz short TESTFORBAT + 10601 0000022D E8C01E call PRINT_PROMPT ; Prompt the user + 10602 NOPDRV: + 10603 00000230 F606[AB02]FF test byte [ForFlag],0FFh ; FOR has next highest precedence + 10604 00000235 7403 jz short TESTFORBAT + 10605 00000237 E9BD0C jmp FORPROC ; Continue the FOR + 10606 + 10607 TESTFORBAT: + 10608 0000023A 36C606[A09B]00 mov byte [ss:RE_INSTR],0 ; Turn redirection back off + 10609 00000240 C606[C202]00 mov byte [Re_OutStr],0 ; [0C09h] for MSDOS 3.3 + 10610 00000245 C606[C102]00 mov byte [Re_Out_App],0 ; [0C08h] for MSDOS 3.3 + 10611 0000024A C606[AA02]00 mov byte [IfFlag],0 ; no more ifs... + 10612 0000024F F706[4902]FFFF test word [Batch],0FFFFh ; Batch has lowest precedence + 10613 00000255 7441 jz short ISNOBAT + 10614 + 10615 ; 31/01/2023 + 10616 + 10617 ; MSDOS 6.0 + 10618 + 10619 ; Bugbug: MULT_SHELL_GET no longer used? + 10620 + 10621 00000257 06 push es ;AN000; save ES + 10622 00000258 1E push ds ;AN000; save DS + 10623 ;mov ax,mult_shell_get ;AN000; check to see if SHELL has command + 10624 ; 05/02/2023 + 10625 00000259 B80219 mov ax,1902h + 10626 0000025C 8E06[4902] mov es,[Batch] ;AN000; get batch segment + 10627 ;mov di,20h + 10628 00000260 BF2000 mov di,BATCHSEGMENT.BatFile ;AN000; get batch file name + 10629 00000263 0E push cs ;AN000; get local segment to DS + 10630 00000264 1F pop ds ;AN000; + 10631 ;mov dx,offset trangroup:combuf ;AN000; pass communications buffer + 10632 00000265 BA[549A] mov dx,COMBUF + 10633 00000268 CD2F int 2Fh ;AN000; call the shell + 10634 ; - Multiplex - DOS 4.x only SHELLB.COM - COMMAND.COM INTERFACE + 10635 ; ES:DI -> ASCIZ full filename of current batch file, with at least the + 10636 ; final filename element uppercased + 10637 ; DS:DX -> buffer for results + 10638 ;cmp al,0FFh + 10639 0000026A 3CFF cmp al,shell_action ;AN000; does shell have a commmand? + 10640 0000026C 1F pop ds ;AN000; restore DS + 10641 0000026D 07 pop es ;AN000; restore ES + 10642 0000026E 7424 jz short JDOCOM1 ;AN000; yes - go process command + 10643 + 10644 ; MSDOS 3.3 (& MSDOS 6.0) + 10645 00000270 1E push ds + 10646 00000271 E80E04 call READBAT ; Continue BATCH + 10647 00000274 1F pop ds + 10648 00000275 C606[B402]00 mov byte [NullFlag],0 ;G reset no command flag + 10649 0000027A F706[4902]FFFF test word [Batch],0FFFFh + 10650 00000280 7512 jnz short JDOCOM1 ;G if batch still in progress continue + 10651 00000282 8B1E[B202] mov bx,[Next_Batch] + 10652 ; 31/01/2023 + 10653 00000286 09DB or bx,bx + 10654 ;cmp bx,0 ;G see if there is a new batch file + 10655 00000288 740A jz short JDOCOM1 ;G no - go do command + 10656 0000028A 891E[4902] mov [Batch],bx ;G get segment of next batch file + 10657 0000028E C706[B202]0000 mov word [Next_Batch],0 ;G reset next batch + 10658 JDOCOM1: + 10659 00000294 0E push cs + 10660 00000295 1F pop ds + 10661 ;jmp short DOCOM1 + 10662 ; 07/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 10663 00000296 EB5D jmp short DOCOM0 + 10664 ISNOBAT: + 10665 00000298 833E[A502]00 cmp word [SingleCom],0 + 10666 0000029D 741D jz short REGCOM + 10667 ; 07/06/2023 - MSDOS 6.22 COMMAND.COM + 10668 0000029F 8B36[A302] mov si,[SemiPermCom] ; MSDOS 6.0 + 10669 ;mov si,0FFFFh ; MSDOS 3.3 & MSDOS 5.0 + 10670 000002A3 8736[A502] xchg si,[SingleCom] + 10671 000002A7 BF[569A] mov di,COMBUF+2 + 10672 000002AA 31C9 xor cx,cx + 10673 SINGLELOOP: + 10674 000002AC AC lodsb + 10675 000002AD AA stosb + 10676 000002AE 41 inc cx + 10677 000002AF 3C0D cmp al,0Dh + 10678 000002B1 75F9 jnz short SINGLELOOP + 10679 000002B3 49 dec cx + 10680 000002B4 0E push cs + 10681 000002B5 1F pop ds + 10682 000002B6 880E[559A] mov [COMBUF+1],cl + 10683 + 10684 ; do NOT issue a trailing CRLF... + 10685 + 10686 ;jmp short DOCOM1 + 10687 ; 07/06/2023 + 10688 ; MSDOS 6.22 COMMAND.COM + 10689 000002BA EB39 jmp short DOCOM0 + 10690 + 10691 ;nop 10692 - 10693 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10694 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02BBh + 10693 ; 31/01/2023 - Retro DOS v4.0 COMMAND.COM + 10694 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:02A6h 10695 - 10696 ; We have a normal command. - 10697 ; Printers are a bizarre quantity. Sometimes they are a stream and - 10698 ; sometimes they aren't. At this point, we automatically close all spool - 10699 ; files and turn on truncation mode. - 10700 - 10701 REGCOM: - 10702 ;mov ax,(ServerCall shl 8) + 9 - 10703 ; 31/01/2023 - 10704 000002BC B8095D mov ax,5D09h - 10705 ;mov ax,(SERVERCALL<<8)+9 - 10706 000002BF CD21 int 21h ; DOS - 3.1+ internal - FLUSH REDIRECTED PRINTER OUTPUT - 10707 ;mov ax,(ServerCall shl 8) + 8 - 10708 000002C1 B8085D mov ax,5D08h - 10709 ;mov ax,(SERVERCALL<<8)+8 - 10710 000002C4 B201 mov dl,1 - 10711 000002C6 CD21 int 21h ; DOS - 3.1+ internal - SET REDIRECTED PRINTER MODE - 10712 ; DL = 00h redirected output is combined - 10713 ; 01h redirected output placed in separate jobs - 10714 ; start new print job now - 10715 000002C8 0E push cs - 10716 000002C9 1F pop ds ; Need local segment to point to buffer - 10717 000002CA BA[D199] mov dx,UCOMBUF - 10718 - 10719 ; MSDOS 6.0 - 10720 ; Try to read interactive command line via DOSKey. - 10721 ; If that fails, use DOS Buffered Keyboard Input. - 10722 - 10723 ; 31/01/2023 - 10724 000002CD B81048 mov ax,4810h ; AX = DOSKey Read Line function - 10725 000002D0 CD2F int 2Fh - 10726 000002D2 09C0 or ax,ax - 10727 000002D4 7404 jz short GOTCOM ; DOSKey gave us a command line - 10728 - 10729 000002D6 B40A mov ah,0Ah - 10730 ;mov ah,Std_Con_String_Input ; AH = DOS Buffered Keyboard Input - 10731 000002D8 CD21 int 21h ; DOS - BUFFERED KEYBOARD INPUT - 10732 ; DS:DX -> buffer - 10733 GOTCOM: - 10734 000002DA 8A0E[D199] mov cl,[UCOMBUF] - 10735 000002DE 30ED xor ch,ch - 10736 000002E0 83C103 add cx,3 - 10737 000002E3 BE[D199] mov si,UCOMBUF - 10738 000002E6 BF[549A] mov di,COMBUF - 10739 000002E9 F3A4 rep movsb ; Transfer it to the cooked buffer - 10740 - 10741 ; ------------- - 10742 - 10743 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10744 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02EDh + 10696 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10697 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02BBh + 10698 + 10699 ; We have a normal command. + 10700 ; Printers are a bizarre quantity. Sometimes they are a stream and + 10701 ; sometimes they aren't. At this point, we automatically close all spool + 10702 ; files and turn on truncation mode. + 10703 + 10704 REGCOM: + 10705 ;mov ax,(ServerCall shl 8) + 9 + 10706 ; 31/01/2023 + 10707 000002BC B8095D mov ax,5D09h + 10708 ;mov ax,(SERVERCALL<<8)+9 + 10709 000002BF CD21 int 21h ; DOS - 3.1+ internal - FLUSH REDIRECTED PRINTER OUTPUT + 10710 ;mov ax,(ServerCall shl 8) + 8 + 10711 000002C1 B8085D mov ax,5D08h + 10712 ;mov ax,(SERVERCALL<<8)+8 + 10713 000002C4 B201 mov dl,1 + 10714 000002C6 CD21 int 21h ; DOS - 3.1+ internal - SET REDIRECTED PRINTER MODE + 10715 ; DL = 00h redirected output is combined + 10716 ; 01h redirected output placed in separate jobs + 10717 ; start new print job now + 10718 000002C8 0E push cs + 10719 000002C9 1F pop ds ; Need local segment to point to buffer + 10720 000002CA BA[D199] mov dx,UCOMBUF + 10721 + 10722 ; MSDOS 6.0 + 10723 ; Try to read interactive command line via DOSKey. + 10724 ; If that fails, use DOS Buffered Keyboard Input. + 10725 + 10726 ; 31/01/2023 + 10727 000002CD B81048 mov ax,4810h ; AX = DOSKey Read Line function + 10728 000002D0 CD2F int 2Fh + 10729 000002D2 09C0 or ax,ax + 10730 000002D4 7404 jz short GOTCOM ; DOSKey gave us a command line + 10731 + 10732 000002D6 B40A mov ah,0Ah + 10733 ;mov ah,Std_Con_String_Input ; AH = DOS Buffered Keyboard Input + 10734 000002D8 CD21 int 21h ; DOS - BUFFERED KEYBOARD INPUT + 10735 ; DS:DX -> buffer + 10736 GOTCOM: + 10737 000002DA 8A0E[D199] mov cl,[UCOMBUF] + 10738 000002DE 30ED xor ch,ch + 10739 000002E0 83C103 add cx,3 + 10740 000002E3 BE[D199] mov si,UCOMBUF + 10741 000002E6 BF[549A] mov di,COMBUF + 10742 000002E9 F3A4 rep movsb ; Transfer it to the cooked buffer + 10743 + 10744 ; ------------- 10745 - 10746 000002EB E88B26 call CRLF2 - 10747 000002EE 31C0 xor ax,ax - 10748 000002F0 EB06 jmp short DOCOM2 - 10749 ; ------------- - 10750 - 10751 DOCOM: - 10752 000002F2 E88426 call CRLF2 + 10746 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10747 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02EDh + 10748 + 10749 000002EB E88B26 call CRLF2 + 10750 000002EE 31C0 xor ax,ax + 10751 000002F0 EB06 jmp short DOCOM2 + 10752 ; ------------- 10753 - 10754 ; ------------- - 10755 - 10756 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10757 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02F4h + 10754 DOCOM: + 10755 000002F2 E88426 call CRLF2 + 10756 + 10757 ; ------------- 10758 - 10759 - 10760 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 10761 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:02F6h - 10762 DOCOM0: - 10763 000002F5 B80100 mov ax,1 - 10764 DOCOM2: - 10765 000002F8 1E push ds - 10766 000002F9 8E1E[F59B] mov ds,[RESSEG] - 10767 000002FD A3[FD01] mov [cox_Y_option],ax - 10768 00000300 1F pop ds - 10769 00000301 BE[549A] mov si,COMBUF - 10770 00000304 8A4C01 mov cl,[si+1] - 10771 00000307 30ED xor ch,ch - 10772 00000309 83C602 add si,2 - 10773 0000030C E82501 call get_cox_y_n_opt - 10774 0000030F 7303 jnc short DOCOM1 ; YES answer - 10775 ; 07/06/2023 - 10776 NULLCOMJ: - 10777 00000311 E90201 jmp NULLCOM ; NO answer - 10778 ; ------------- - 10779 - 10780 ; MSDOS 5.0 & MSDOS 6.0 COMMAND.COM - 10781 DOCOM1: - 10782 00000314 E8662A call PRESCAN ; Cook the input buffer - 10783 00000317 7403 jz short NOPIPEPROC - 10784 00000319 E9502E jmp PIPEPROCSTRT ; Fire up the pipe - 10785 - 10786 ; 07/06/2023 - 10787 ;NULLCOMJ: - 10788 ;jmp NULLCOM - 10789 - 10790 NOPIPEPROC: - 10791 0000031C E85831 call PARSELINE - 10792 0000031F 730B jnb short OKPARSE ; user error? or maybe we goofed? - 10793 BADPARSE: - 10794 00000321 0E push cs - 10795 00000322 1F pop ds - 10796 00000323 BA[FA8F] mov dx,BADNAM_PTR ; 31/01/2023 - 10797 00000326 E8F750 call std_eprintf - 10798 00000329 E9D8FD jmp TCOMMAND - 10799 - 10800 OKPARSE: - 10801 ;test byte [ARGV0_ARG_FLAGS],2 - 10802 ;test byte [ARG+ARGV_ELE.argflags],2 ; wildcard - 10803 ; 01/02/2023 - 10804 0000032C F606[529F]02 test byte [ARG+ARGV_ELE.argflags],2 - 10805 00000331 75EE jnz short BADPARSE ; ambiguous commands not allowed - 10806 ;cmp word [ARG_ARGVCNT],0 ; there WAS a command, wasn't there? - 10807 00000333 833E[10A2]00 cmp word [ARG+ARG_UNIT.argvcnt],0 - 10808 00000338 74D7 jz short NULLCOMJ - 10809 ;cmp word [ARGV0_ARGLEN],0 ; probably an unnecessary check... - 10810 0000033A 833E[559F]00 cmp word [ARG+ARGV_ELE.arglen],0 - 10811 0000033F 74D0 jz short NULLCOMJ ; guarantees argv[0] at least x - 10812 - 10813 00000341 BE[569A] mov si,COMBUF+2 - 10814 00000344 BF[BA9C] mov di,IDLEN - 10815 ;;mov ax,(Parse_File_Descriptor shl 8) or 01h - 10816 ; Make FCB with blank scan-off - 10817 ;mov ax,(Parse_File_Descriptor<<8)|01h - 10818 00000347 B80129 mov ax,2901h - 10819 0000034A CD21 int 21h ; DOS - PARSE FILENAME - 10820 ; DS:SI -> string to parse - 10821 ; ES:DI -> buffer to fill with unopened FCB - 10822 ; AL = bit mask to control parsing - 10823 ;mov bx,[ARG_ARGV] - 10824 0000034C 8B1E[509F] mov bx,[ARG+ARG_UNIT.argv] ; mov bx,[ARG] - 10825 00000350 807F013A cmp byte [bx+1],':' ; was a drive specified? - 10826 00000354 751B jne short DRVGD ; no, use default of zero... - 10827 00000356 8A17 mov dl,[bx] ; pick-up drive letter - 10828 ;mov dl,[bx+ARGV_ELE.argpointer] ; mov dl,[bx+0] - 10829 ;and dl,~20h - 10830 00000358 80E2DF and dl,0DFh ; uppercase the sucker - 10831 ;sub dl,[CAPITAL_A] ; convert it to a drive number, A=0 - 10832 ; 31/01/2023 - 10833 0000035B 80EA41 sub dl,'A' - 10834 0000035E 3CFF cmp al,-1 ; See what PARSE said about our drive letter. - 10835 00000360 740C je short DRVBADJ ; It was invalid. - 10836 ;mov di,[ARGV0_ARGSTARTEL] - 10837 00000362 8B3E[539F] mov di,[ARG+ARGV_ELE.argstartel] - 10838 00000366 803D00 cmp byte [di],0 ; is there actually a command there? - 10839 00000369 7506 jne short DRVGD ; if not, we have: "d:", "d:\", "d:/" - 10840 0000036B E992FD jmp SETDRV ; and set drive to new drive spec - 10841 DRVBADJ: - 10842 0000036E E9B128 jmp DRVBAD - 10843 DRVGD: - 10844 00000371 8A05 mov al,[di] - 10845 00000373 A2[149C] mov [SPECDRV],al - 10846 00000376 B020 mov al,' ' - 10847 00000378 B90900 mov cx,9 - 10848 0000037B 47 inc di - 10849 0000037C F2AE repne scasb ; Count number of letters in command name - 10850 0000037E B008 mov al,8 - 10851 00000380 28C8 sub al,cl - 10852 00000382 A2[BA9C] mov [IDLEN],al ; IDLEN is truly the length - 10853 00000385 BF8100 mov di,81h - 10854 00000388 56 push si - 10855 00000389 BE[569A] mov si,COMBUF+2 ; Skip over all leading delims - 10856 0000038C E8F725 call scanoff - 10857 - 10858 ; 01/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 10859 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0356h + 10759 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10760 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:02F4h + 10761 + 10762 + 10763 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 10764 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:02F6h + 10765 DOCOM0: + 10766 000002F5 B80100 mov ax,1 + 10767 DOCOM2: + 10768 000002F8 1E push ds + 10769 000002F9 8E1E[F59B] mov ds,[RESSEG] + 10770 000002FD A3[FD01] mov [cox_Y_option],ax + 10771 00000300 1F pop ds + 10772 00000301 BE[549A] mov si,COMBUF + 10773 00000304 8A4C01 mov cl,[si+1] + 10774 00000307 30ED xor ch,ch + 10775 00000309 83C602 add si,2 + 10776 0000030C E82501 call get_cox_y_n_opt + 10777 0000030F 7303 jnc short DOCOM1 ; YES answer + 10778 ; 07/06/2023 + 10779 NULLCOMJ: + 10780 00000311 E90201 jmp NULLCOM ; NO answer + 10781 ; ------------- + 10782 + 10783 ; MSDOS 5.0 & MSDOS 6.0 COMMAND.COM + 10784 DOCOM1: + 10785 00000314 E8662A call PRESCAN ; Cook the input buffer + 10786 00000317 7403 jz short NOPIPEPROC + 10787 00000319 E9502E jmp PIPEPROCSTRT ; Fire up the pipe + 10788 + 10789 ; 07/06/2023 + 10790 ;NULLCOMJ: + 10791 ;jmp NULLCOM + 10792 + 10793 NOPIPEPROC: + 10794 0000031C E85831 call PARSELINE + 10795 0000031F 730B jnb short OKPARSE ; user error? or maybe we goofed? + 10796 BADPARSE: + 10797 00000321 0E push cs + 10798 00000322 1F pop ds + 10799 00000323 BA[FA8F] mov dx,BADNAM_PTR ; 31/01/2023 + 10800 00000326 E8F750 call std_eprintf + 10801 00000329 E9D8FD jmp TCOMMAND + 10802 + 10803 OKPARSE: + 10804 ;test byte [ARGV0_ARG_FLAGS],2 + 10805 ;test byte [ARG+ARGV_ELE.argflags],2 ; wildcard + 10806 ; 01/02/2023 + 10807 0000032C F606[529F]02 test byte [ARG+ARGV_ELE.argflags],2 + 10808 00000331 75EE jnz short BADPARSE ; ambiguous commands not allowed + 10809 ;cmp word [ARG_ARGVCNT],0 ; there WAS a command, wasn't there? + 10810 00000333 833E[10A2]00 cmp word [ARG+ARG_UNIT.argvcnt],0 + 10811 00000338 74D7 jz short NULLCOMJ + 10812 ;cmp word [ARGV0_ARGLEN],0 ; probably an unnecessary check... + 10813 0000033A 833E[559F]00 cmp word [ARG+ARGV_ELE.arglen],0 + 10814 0000033F 74D0 jz short NULLCOMJ ; guarantees argv[0] at least x + 10815 + 10816 00000341 BE[569A] mov si,COMBUF+2 + 10817 00000344 BF[BA9C] mov di,IDLEN + 10818 ;;mov ax,(Parse_File_Descriptor shl 8) or 01h + 10819 ; Make FCB with blank scan-off + 10820 ;mov ax,(Parse_File_Descriptor<<8)|01h + 10821 00000347 B80129 mov ax,2901h + 10822 0000034A CD21 int 21h ; DOS - PARSE FILENAME + 10823 ; DS:SI -> string to parse + 10824 ; ES:DI -> buffer to fill with unopened FCB + 10825 ; AL = bit mask to control parsing + 10826 ;mov bx,[ARG_ARGV] + 10827 0000034C 8B1E[509F] mov bx,[ARG+ARG_UNIT.argv] ; mov bx,[ARG] + 10828 00000350 807F013A cmp byte [bx+1],':' ; was a drive specified? + 10829 00000354 751B jne short DRVGD ; no, use default of zero... + 10830 00000356 8A17 mov dl,[bx] ; pick-up drive letter + 10831 ;mov dl,[bx+ARGV_ELE.argpointer] ; mov dl,[bx+0] + 10832 ;and dl,~20h + 10833 00000358 80E2DF and dl,0DFh ; uppercase the sucker + 10834 ;sub dl,[CAPITAL_A] ; convert it to a drive number, A=0 + 10835 ; 31/01/2023 + 10836 0000035B 80EA41 sub dl,'A' + 10837 0000035E 3CFF cmp al,-1 ; See what PARSE said about our drive letter. + 10838 00000360 740C je short DRVBADJ ; It was invalid. + 10839 ;mov di,[ARGV0_ARGSTARTEL] + 10840 00000362 8B3E[539F] mov di,[ARG+ARGV_ELE.argstartel] + 10841 00000366 803D00 cmp byte [di],0 ; is there actually a command there? + 10842 00000369 7506 jne short DRVGD ; if not, we have: "d:", "d:\", "d:/" + 10843 0000036B E992FD jmp SETDRV ; and set drive to new drive spec + 10844 DRVBADJ: + 10845 0000036E E9B128 jmp DRVBAD + 10846 DRVGD: + 10847 00000371 8A05 mov al,[di] + 10848 00000373 A2[149C] mov [SPECDRV],al + 10849 00000376 B020 mov al,' ' + 10850 00000378 B90900 mov cx,9 + 10851 0000037B 47 inc di + 10852 0000037C F2AE repne scasb ; Count number of letters in command name + 10853 0000037E B008 mov al,8 + 10854 00000380 28C8 sub al,cl + 10855 00000382 A2[BA9C] mov [IDLEN],al ; IDLEN is truly the length + 10856 00000385 BF8100 mov di,81h + 10857 00000388 56 push si + 10858 00000389 BE[569A] mov si,COMBUF+2 ; Skip over all leading delims + 10859 0000038C E8F725 call scanoff 10860 - 10861 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10862 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0391h + 10861 ; 01/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 10862 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0356h 10863 - 10864 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 10865 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0393h + 10864 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10865 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0391h 10866 - 10867 ; MSDOS 6.0 - 10868 ;SR; - 10869 ; We are going to skip over the first char always. The logic is that the - 10870 ;command tail can never start from the first character. The code below is - 10871 ;trying to figure out the command tail and copy it to the command line - 10872 ;buffer in the PSP. However, if the first character happens to be a switch - 10873 ;character and the user given command line is a full 128 bytes, we try to - 10874 ;copy 128 bytes to the PSP while it can take only 127 chars. This extra - 10875 ;char overwrites the code and leads to a crash on future commands. - 10876 - 10877 0000038F 46 inc si ; MSDOS 6.0 - 10878 - 10879 DO_SKIPCOM: - 10880 00000390 AC lodsb ; move command line pointer over - 10881 00000391 E8FA25 call DELIM ; pathname -- have to do it ourselves - 10882 00000394 740A jz short DO_SKIPPED ; 'cause parse_file_descriptor is dumb - 10883 00000396 3C0D cmp al,0Dh ; can't always depend on argv[0].arglen - 10884 00000398 7406 jz short DO_SKIPPED ; to be the same length as the user- - 10885 0000039A 3A06[F99B] cmp al,[SWITCHAR] ; specified command string - 10886 0000039E 75F0 jnz short DO_SKIPCOM - 10887 DO_SKIPPED: - 10888 000003A0 4E dec si - 10889 000003A1 31C9 xor cx,cx - 10890 COMTAIL: - 10891 000003A3 AC lodsb - 10892 000003A4 AA stosb ; Move command tail to 80h - 10893 000003A5 3C0D cmp al,0Dh - 10894 000003A7 E0FA loopne COMTAIL - 10895 000003A9 4F dec di - 10896 000003AA 89FD mov bp,di - 10897 000003AC F6D1 not cl - 10898 000003AE 880E8000 mov [80h],cl - 10899 000003B2 5E pop si - 10900 ;----- - 10901 ; Some of these comments are sadly at odds with this brave new code. - 10902 ;----- - 10903 ; If the command has 0 parameters must check here for - 10904 ; any switches that might be present. - 10905 ; SI -> first character after the command. - 10906 - 10907 ;mov di,arg.argv[0].argsw_word - 10908 ;mov di,[ARGV0_ARGSW_WORD] - 10909 000003B3 8B3E[579F] mov di,[ARG+ARGV_ELE.argsw_word] - 10910 000003B7 893E[0B9C] mov [COMSW],di ; ah yes, the old addressing mode problem... - 10911 ;mov SI,arg.argv[1 * SIZE argv_ele].argpointer - 10912 ; s = argv[1]; - 10913 ;mov si,[ARGV1_ARGPOINTER] - 10914 000003BB 8B36[5B9F] mov si,[ARG+ARGV_ELE.SIZE+ARGV_ELE.argpointer] - 10915 000003BF 09F6 or si,si ; if (s == NULL) - 10916 000003C1 7502 jnz short DOPARSE ; s = bp; (buffer end) - 10917 000003C3 89EE mov si,bp - 10918 DOPARSE: - 10919 000003C5 BF5C00 mov di,FCB ; 5Ch - 10920 ;mov ax,(Parse_File_Descriptor shl 8) or 01h - 10921 ; 01/02/2023 - 10922 000003C8 B80129 mov ax,2901h - 10923 ;mov ax,(Parse_File_Descriptor<<8)|01h - 10924 000003CB CD21 int 21h ; DOS - PARSE FILENAME - 10925 ; DS:SI -> string to parse - 10926 ; ES:DI -> buffer to fill with unopened FCB - 10927 ; AL = bit mask to control parsing - 10928 000003CD A2[089C] mov [PARM1],al ; Save result of parse - 10929 ;mov di,arg.argv[1*SIZE argv_ele].argsw_word - 10930 ;mov di,[ARGV1_ARGSW_WORD] - 10931 000003D0 8B3E[629F] mov di,[ARG+ARGV_ELE.SIZE+ARGV_ELE.argsw_word] - 10932 000003D4 893E[0D9C] mov [ARG1S],di - 10933 ;mov si,arg.argv[2*SIZE argv_ele].argpointer - 10934 ; s = argv[2]; - 10935 ;mov si,[ARGV2_ARGPOINTER] - 10936 000003D8 8B36[669F] mov si,[ARG+(2*ARGV_ELE.SIZE)+ARGV_ELE.argpointer] - 10937 000003DC 09F6 or si,si ; if (s == NULL) - 10938 000003DE 7502 jnz short DOPARSE2 - 10939 000003E0 89EE mov si,bp ; s = bp; (buffer end) - 10940 DOPARSE2: - 10941 000003E2 BF6C00 mov di,FCB+10h ; 6Ch - 10942 ;;mov ax,(Parse_File_Descriptor shl 8) or 01h - 10943 000003E5 B80129 mov ax,2901h - 10944 ;mov ax,(Parse_File_Descriptor<<8)|01h - 10945 000003E8 CD21 int 21h ; DOS - PARSE FILENAME - 10946 ; DS:SI -> string to parse - 10947 ; ES:DI -> buffer to fill with unopened FCB - 10948 ; AL = bit mask to control parsing - 10949 000003EA A2[0A9C] mov [PARM2],al ; Save result - 10950 ;mov di,[ARGV2_ARGSW_WORD] - 10951 ;mov di,arg.argv[2*SIZE argv_ele].argsw_word - 10952 000003ED 8B3E[6D9F] mov di,[ARG+(2*ARGV_ELE.SIZE)+ARGV_ELE.argsw_word] - 10953 000003F1 893E[0F9C] mov [ARG2S],di - 10954 ;mov di,[ARGV0_ARGSW_WORD] - 10955 ;mov di,arg.argv[0].argsw_word - 10956 000003F5 8B3E[579F] mov di,[ARG+ARGV_ELE.argsw_word] - 10957 000003F9 F7D7 not di ; ARGTS doesn't include the flags - 10958 ;and di,[ARG_ARGSWINFO] ; from COMSW... - 10959 ;and di,arg.argswinfo - 10960 000003FB 233E[12A2] and di,[ARG+ARG_UNIT.argswinfo] - 10961 000003FF 893E[119C] mov [ARGTS],di - 10962 - 10963 00000403 A0[BA9C] mov al,[IDLEN] - 10964 00000406 8A16[149C] mov dl,[SPECDRV] - 10965 0000040A 08D2 or dl,dl ; if a drive was specified... - 10966 0000040C 7505 jnz short EXTERNALJ1 ; it MUST be external, by this time - 10967 0000040E FEC8 dec al ; (I don't know why -- old code did it) - 10968 00000410 E96227 jmp FNDCOM ; otherwise, check internal com table - 10969 EXTERNALJ1: - 10970 00000413 E96428 jmp EXTERNAL - 10971 NULLCOM: - 10972 00000416 8E1E[F59B] mov ds,[RESSEG] - 10973 0000041A F706[4902]FFFF test word [Batch],0FFFFh ; -1 ;G Are we in a batch file? - 10974 00000420 7405 jz short NOSETFLAG ;G only set flag if in batch - 10975 00000422 C606[B402]01 mov byte [NullFlag],1 ;G set flag to indicate no command - 10976 ;mov byte [NullFlag],nullcommand ; 1 - 10977 NOSETFLAG: - 10978 00000427 833E[A502]FF cmp word [SingleCom],0FFFFh ; -1 - 10979 0000042C 7403 je short EXITJ - 10980 0000042E E9B1FD jmp GETCOM - 10981 EXITJ: - 10982 00000431 E9F5FC jmp _$EXITPREP - 10983 - 10984 ; 07/06/2023 - 10985 ; --------------------------------------------------------------------------- - 10986 ; MSDOS 6.2(2) COMMAND.COM procedure only ! - 10987 ; ----------------------------------------- - 10988 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan - 10989 ; --------------------------------------------------------------------------- - 10990 - 10991 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 10992 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0436h + 10867 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 10868 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0393h + 10869 + 10870 ; MSDOS 6.0 + 10871 ;SR; + 10872 ; We are going to skip over the first char always. The logic is that the + 10873 ;command tail can never start from the first character. The code below is + 10874 ;trying to figure out the command tail and copy it to the command line + 10875 ;buffer in the PSP. However, if the first character happens to be a switch + 10876 ;character and the user given command line is a full 128 bytes, we try to + 10877 ;copy 128 bytes to the PSP while it can take only 127 chars. This extra + 10878 ;char overwrites the code and leads to a crash on future commands. + 10879 + 10880 0000038F 46 inc si ; MSDOS 6.0 + 10881 + 10882 DO_SKIPCOM: + 10883 00000390 AC lodsb ; move command line pointer over + 10884 00000391 E8FA25 call DELIM ; pathname -- have to do it ourselves + 10885 00000394 740A jz short DO_SKIPPED ; 'cause parse_file_descriptor is dumb + 10886 00000396 3C0D cmp al,0Dh ; can't always depend on argv[0].arglen + 10887 00000398 7406 jz short DO_SKIPPED ; to be the same length as the user- + 10888 0000039A 3A06[F99B] cmp al,[SWITCHAR] ; specified command string + 10889 0000039E 75F0 jnz short DO_SKIPCOM + 10890 DO_SKIPPED: + 10891 000003A0 4E dec si + 10892 000003A1 31C9 xor cx,cx + 10893 COMTAIL: + 10894 000003A3 AC lodsb + 10895 000003A4 AA stosb ; Move command tail to 80h + 10896 000003A5 3C0D cmp al,0Dh + 10897 000003A7 E0FA loopne COMTAIL + 10898 000003A9 4F dec di + 10899 000003AA 89FD mov bp,di + 10900 000003AC F6D1 not cl + 10901 000003AE 880E8000 mov [80h],cl + 10902 000003B2 5E pop si + 10903 ;----- + 10904 ; Some of these comments are sadly at odds with this brave new code. + 10905 ;----- + 10906 ; If the command has 0 parameters must check here for + 10907 ; any switches that might be present. + 10908 ; SI -> first character after the command. + 10909 + 10910 ;mov di,arg.argv[0].argsw_word + 10911 ;mov di,[ARGV0_ARGSW_WORD] + 10912 000003B3 8B3E[579F] mov di,[ARG+ARGV_ELE.argsw_word] + 10913 000003B7 893E[0B9C] mov [COMSW],di ; ah yes, the old addressing mode problem... + 10914 ;mov SI,arg.argv[1 * SIZE argv_ele].argpointer + 10915 ; s = argv[1]; + 10916 ;mov si,[ARGV1_ARGPOINTER] + 10917 000003BB 8B36[5B9F] mov si,[ARG+ARGV_ELE.SIZE+ARGV_ELE.argpointer] + 10918 000003BF 09F6 or si,si ; if (s == NULL) + 10919 000003C1 7502 jnz short DOPARSE ; s = bp; (buffer end) + 10920 000003C3 89EE mov si,bp + 10921 DOPARSE: + 10922 000003C5 BF5C00 mov di,FCB ; 5Ch + 10923 ;mov ax,(Parse_File_Descriptor shl 8) or 01h + 10924 ; 01/02/2023 + 10925 000003C8 B80129 mov ax,2901h + 10926 ;mov ax,(Parse_File_Descriptor<<8)|01h + 10927 000003CB CD21 int 21h ; DOS - PARSE FILENAME + 10928 ; DS:SI -> string to parse + 10929 ; ES:DI -> buffer to fill with unopened FCB + 10930 ; AL = bit mask to control parsing + 10931 000003CD A2[089C] mov [PARM1],al ; Save result of parse + 10932 ;mov di,arg.argv[1*SIZE argv_ele].argsw_word + 10933 ;mov di,[ARGV1_ARGSW_WORD] + 10934 000003D0 8B3E[629F] mov di,[ARG+ARGV_ELE.SIZE+ARGV_ELE.argsw_word] + 10935 000003D4 893E[0D9C] mov [ARG1S],di + 10936 ;mov si,arg.argv[2*SIZE argv_ele].argpointer + 10937 ; s = argv[2]; + 10938 ;mov si,[ARGV2_ARGPOINTER] + 10939 000003D8 8B36[669F] mov si,[ARG+(2*ARGV_ELE.SIZE)+ARGV_ELE.argpointer] + 10940 000003DC 09F6 or si,si ; if (s == NULL) + 10941 000003DE 7502 jnz short DOPARSE2 + 10942 000003E0 89EE mov si,bp ; s = bp; (buffer end) + 10943 DOPARSE2: + 10944 000003E2 BF6C00 mov di,FCB+10h ; 6Ch + 10945 ;;mov ax,(Parse_File_Descriptor shl 8) or 01h + 10946 000003E5 B80129 mov ax,2901h + 10947 ;mov ax,(Parse_File_Descriptor<<8)|01h + 10948 000003E8 CD21 int 21h ; DOS - PARSE FILENAME + 10949 ; DS:SI -> string to parse + 10950 ; ES:DI -> buffer to fill with unopened FCB + 10951 ; AL = bit mask to control parsing + 10952 000003EA A2[0A9C] mov [PARM2],al ; Save result + 10953 ;mov di,[ARGV2_ARGSW_WORD] + 10954 ;mov di,arg.argv[2*SIZE argv_ele].argsw_word + 10955 000003ED 8B3E[6D9F] mov di,[ARG+(2*ARGV_ELE.SIZE)+ARGV_ELE.argsw_word] + 10956 000003F1 893E[0F9C] mov [ARG2S],di + 10957 ;mov di,[ARGV0_ARGSW_WORD] + 10958 ;mov di,arg.argv[0].argsw_word + 10959 000003F5 8B3E[579F] mov di,[ARG+ARGV_ELE.argsw_word] + 10960 000003F9 F7D7 not di ; ARGTS doesn't include the flags + 10961 ;and di,[ARG_ARGSWINFO] ; from COMSW... + 10962 ;and di,arg.argswinfo + 10963 000003FB 233E[12A2] and di,[ARG+ARG_UNIT.argswinfo] + 10964 000003FF 893E[119C] mov [ARGTS],di + 10965 + 10966 00000403 A0[BA9C] mov al,[IDLEN] + 10967 00000406 8A16[149C] mov dl,[SPECDRV] + 10968 0000040A 08D2 or dl,dl ; if a drive was specified... + 10969 0000040C 7505 jnz short EXTERNALJ1 ; it MUST be external, by this time + 10970 0000040E FEC8 dec al ; (I don't know why -- old code did it) + 10971 00000410 E96227 jmp FNDCOM ; otherwise, check internal com table + 10972 EXTERNALJ1: + 10973 00000413 E96428 jmp EXTERNAL + 10974 NULLCOM: + 10975 00000416 8E1E[F59B] mov ds,[RESSEG] + 10976 0000041A F706[4902]FFFF test word [Batch],0FFFFh ; -1 ;G Are we in a batch file? + 10977 00000420 7405 jz short NOSETFLAG ;G only set flag if in batch + 10978 00000422 C606[B402]01 mov byte [NullFlag],1 ;G set flag to indicate no command + 10979 ;mov byte [NullFlag],nullcommand ; 1 + 10980 NOSETFLAG: + 10981 00000427 833E[A502]FF cmp word [SingleCom],0FFFFh ; -1 + 10982 0000042C 7403 je short EXITJ + 10983 0000042E E9B1FD jmp GETCOM + 10984 EXITJ: + 10985 00000431 E9F5FC jmp _$EXITPREP + 10986 + 10987 ; 07/06/2023 + 10988 ; --------------------------------------------------------------------------- + 10989 ; MSDOS 6.2(2) COMMAND.COM procedure only ! + 10990 ; ----------------------------------------- + 10991 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan + 10992 ; --------------------------------------------------------------------------- 10993 - 10994 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 10995 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0438h - 10996 get_cox_y_n_opt: - 10997 00000434 E339 jcxz ccydp4 ; empty input buffer - 10998 ccydp0: - 10999 00000436 803C0D cmp byte [si],0Dh - 11000 00000439 7434 je short ccydp4 - 11001 0000043B 803C0A cmp byte [si],0Ah - 11002 0000043E 742F je short ccydp4 - 11003 00000440 06 push es - 11004 00000441 8E06[F59B] mov es,[RESSEG] - 11005 00000445 26A0[5A04] mov al,[es:Y_Flag] - 11006 00000449 A810 test al,10h ; bit 1 = 1 -> Y/N answer is needed - 11007 0000044B 7421 jz short ccydp3 ; cf=0 ; 07/06/2023 - 11008 0000044D 26803E[B102]01 cmp byte [es:Call_Batch_Flag],1 ; (in) Batch file ? - 11009 00000453 7419 je short ccydp3 ; yes, don't check for ESCAPE - 11010 00000455 A840 test al,40h ; ESCAPE status - 11011 ; (bit 4 is zero if Y/N is escaped) - 11012 00000457 7417 jz short ccydp5 - 11013 ccydp1: - 11014 00000459 26F706[4902]FFFF test word [es:Batch],0FFFFh - 11015 00000460 740B jz short ccydp2 - 11016 00000462 268E06[4902] mov es,[es:Batch] - 11017 ;mov byte [es:2],1 ; [es:BATCHSEGMENT.BatchEOF] - 11018 00000467 26C606020001 mov byte [es:BATCHSEGMENT.BatchEOF],1 - 11019 ccydp2: - 11020 0000046D F9 stc - 11021 ccydp3: ; 07/06/2023 ; cf = 0 - 11022 0000046E 07 pop es - 11023 ccydp4: ; 07/06/2023 ; cf = 0 - 11024 0000046F C3 retn - 11025 - 11026 ;ccydp3: - 11027 ; pop es - 11028 ;ccydp4: - 11029 ; clc - 11030 ; retn - 11031 - 11032 ccydp5: - 11033 00000470 89F2 mov dx,si - 11034 00000472 BB0200 mov bx,2 - 11035 00000475 B440 mov ah,40h - 11036 00000477 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 11037 ; BX = file handle, CX = number of bytes to write - 11038 ; DS:DX -> buffer - 11039 00000479 BA[9592] mov dx,cox_Y_quest_ptr ; msg number pointer of ' [Y/N]?' - 11040 ; (is 1082) - 11041 0000047C E8A14F call std_eprintf - 11042 0000047F 1E push ds - 11043 00000480 B83B04 mov ax,1083 ; cox_Y_answer number (overwrite Y/N answer letter) - 11044 00000483 B6FF mov dh,0FFh ; utility_msg_class - 11045 00000485 E88350 call TSYSGETMSG - 11046 ;mov cx,'NY' ; MASM word format - 11047 ; NASM word format - 11048 00000488 B9594E mov cx,'YN' ; 'YN' Yes/No (CL=Y) - 11049 0000048B 7202 jc short ccydp6 - 11050 0000048D 8B0C mov cx,[si] - 11051 ccydp6: - 11052 0000048F 1F pop ds - 11053 ccydp7: - 11054 00000490 B408 mov ah,8 - 11055 00000492 CD21 int 21h ; DOS - KEYBOARD INPUT, NO ECHO - 11056 ; Return: AL = character - 11057 00000494 84C0 test al,al - 11058 00000496 7510 jnz short ccydp8 - 11059 00000498 B408 mov ah,8 - 11060 0000049A CD21 int 21h ; DOS - KEYBOARD INPUT, NO ECHO - 11061 ; Return: AL = character - 11062 0000049C 3C3F cmp al,'?' - 11063 0000049E 75F0 jne short ccydp7 - 11064 000004A0 26800E[5A04]40 or byte [es:Y_Flag],40h ; bit 4, question flag - 11065 000004A6 EBB1 jmp short ccydp1 - 11066 ccydp8: - 11067 000004A8 3C1B cmp al,1Bh ; ESCAPE ? - 11068 000004AA 7509 jne short ccydp9 - 11069 000004AC 268026[5A04]EF and byte [es:Y_Flag],0EFh ; (ESCAPE) Clear bit 4 ; ~10h - 11070 ;jmp short ccydp12 - 11071 ; 07/06/2023 - 11072 000004B2 9C pushf - 11073 000004B3 EB18 jmp short ccydp12 - 11074 ccydp9: - 11075 ; 25/07/2024 - PCDOS 7.1 COMMAND.COM - 11076 000004B5 3C41 cmp al,41h ; 'A' - 11077 000004B7 7202 jb short ccydp13 - 11078 ; - 11079 000004B9 24DF and al,0DFh ; uppercase - 11080 ccydp13: ; 25/07/2024 - 11081 000004BB 38E8 cmp al,ch ; NO character (N) - 11082 000004BD 7503 jne short ccydp10 - 11083 000004BF F9 stc - 11084 000004C0 EB04 jmp short ccydp11 ; cf = 1 -> overwrite NO answer - 11085 ccydp10: - 11086 000004C2 38C8 cmp al,cl ; YES character (Y) - 11087 000004C4 75CA jne short ccydp7 - 11088 ccydp11: - 11089 000004C6 9C pushf ; cf = 0 -> overwrite YES answer - 11090 000004C7 88C2 mov dl,al - 11091 000004C9 B402 mov ah,2 - 11092 000004CB CD21 int 21h ; DOS - DISPLAY OUTPUT - 11093 ; DL = character to send to standard output - 11094 ; 07/06/2023 - 11095 ;popf - 11096 ccydp12: - 11097 ;pushf - 11098 000004CD E8A924 call CRLF2 - 11099 000004D0 9D popf - 11100 000004D1 07 pop es - 11101 000004D2 C3 retn - 11102 - 11103 ;============================================================================ - 11104 ; MSHALO.ASM, MSDOS 6.0, 1991 - 11105 ;============================================================================ - 11106 ; 12/10/2018 - Retro DOS v3.0 - 11107 - 11108 ; 05/02/2023 - Retro DOS v5.0 (& v4.1) COMMAND.COM - 11109 - 11110 ; SCCSID = @(#)ibmhalo.asm 1.1 85/04/10 - 11111 ; On 2K (800h) boundaries beginning at address C0000h and ending at EF800h - 11112 ; there is a header that describes a block of rom program. This header - 11113 ; contains information needed to initialize a module and to provide PCDOS - 11114 ; with a set of reserved names for execution. - 11115 ; - 11116 ; This header has the following format: - 11117 ; - 11118 ; rom_header STRUC - 11119 ; Signature1 DB 55h - 11120 ; Signature2 DB AAh - 11121 ; rom_length DB ? ; number of 512 byte pieces - 11122 ; init_jmp DB 3 dup (?) - 11123 ; name_list name_struc <> - 11124 ; rom_header ENDS - 11125 ; - 11126 ; name_struc STRUC - 11127 ; name_len DB ? - 11128 ; name_text DB ? DUP (?) - 11129 ; name_jmp DB 3 DUP (?) - 11130 ; name_struc ENDS - 11131 ; - 11132 ; The name list is a list of names that are reserved by a particular section - 11133 ; of a module. This list of names is terminated by a null name (length - 11134 ; is zero). - 11135 ; - 11136 ; Consider now, the PCDOS action when a user enters a command: - 11137 ; - 11138 ; COMMAND.COM has control. - 11139 ; o If location FFFFEh has FDh then - 11140 ; o Start scanning at C0000h, every 800h for a byte 55h followed - 11141 ; by AAh, stop scan if we get above or = F0000H - 11142 ; o When we've found one, compare the name entered by the user - 11143 ; with the one found in the rom. If we have a match, then - 11144 ; set up the environment for execution and do a long jump - 11145 ; to the near jump after the found name. - 11146 ; o If no more names in the list, then continue scanning the module - 11147 ; for more 55h followed by AAh. - 11148 ; o We get to this point only if there is no matching name in the - 11149 ; rom. We now look on disk for the command. - 11150 ; - 11151 ; This gives us the flexibility to execute any rom cartridge without having - 11152 ; to 'hard-code' the name of the cartridge into PCDOS. Rom modules that - 11153 ; want to be invisible to the DOS should not have any names in their lists - 11154 ; (i.e. they have a single null name). - 11155 ; - 11156 ; Consider a new release of BASIC, say, that patches bugs in the ROM version. - 11157 ; Clearly this version will be available on disk. How does a user actually - 11158 ; invoke this new BASIC?? He cannot call it BASIC on the disk because the - 11159 ; EXEC loader will execute the ROM before it even looks at the disk! Only - 11160 ; solution: - 11161 ; - 11162 ; o Keep things consistent and force the user to have his software named - 11163 ; differently from the ROM names (BASIC1, BASIC2, etc). - 11164 - 11165 struc ROM_HEADER - 11166 00000000 ?? .signature1: resb 1 - 11167 00000001 ?? .signature2: resb 1 - 11168 00000002 ?? .rom_length: resb 1 - 11169 00000003 ?????? .init_jmp: resb 3 - 11170 00000006 ?? .name_list: resb 1 - 11171 .size: - 11172 endstruc - 11173 - 11174 struc NAME_STRUC - 11175 00000000 ?? .name_len: resb 1 - 11176 00000001 ?? .name_text: resb 1 - 11177 00000002 ?????? .name_jmp: resb 3 - 11178 .size: - 11179 endstruc - 11180 - 11181 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 03D1h - 11182 - 11183 ; =============== S U B R O U T I N E ======================================= - 11184 - 11185 ;ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING - 11186 - 11187 ; 05/02/2023 - 11188 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:03FBh + 10994 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 10995 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0436h + 10996 + 10997 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 10998 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0438h + 10999 get_cox_y_n_opt: + 11000 00000434 E339 jcxz ccydp4 ; empty input buffer + 11001 ccydp0: + 11002 00000436 803C0D cmp byte [si],0Dh + 11003 00000439 7434 je short ccydp4 + 11004 0000043B 803C0A cmp byte [si],0Ah + 11005 0000043E 742F je short ccydp4 + 11006 00000440 06 push es + 11007 00000441 8E06[F59B] mov es,[RESSEG] + 11008 00000445 26A0[5A04] mov al,[es:Y_Flag] + 11009 00000449 A810 test al,10h ; bit 1 = 1 -> Y/N answer is needed + 11010 0000044B 7421 jz short ccydp3 ; cf=0 ; 07/06/2023 + 11011 0000044D 26803E[B102]01 cmp byte [es:Call_Batch_Flag],1 ; (in) Batch file ? + 11012 00000453 7419 je short ccydp3 ; yes, don't check for ESCAPE + 11013 00000455 A840 test al,40h ; ESCAPE status + 11014 ; (bit 4 is zero if Y/N is escaped) + 11015 00000457 7417 jz short ccydp5 + 11016 ccydp1: + 11017 00000459 26F706[4902]FFFF test word [es:Batch],0FFFFh + 11018 00000460 740B jz short ccydp2 + 11019 00000462 268E06[4902] mov es,[es:Batch] + 11020 ;mov byte [es:2],1 ; [es:BATCHSEGMENT.BatchEOF] + 11021 00000467 26C606020001 mov byte [es:BATCHSEGMENT.BatchEOF],1 + 11022 ccydp2: + 11023 0000046D F9 stc + 11024 ccydp3: ; 07/06/2023 ; cf = 0 + 11025 0000046E 07 pop es + 11026 ccydp4: ; 07/06/2023 ; cf = 0 + 11027 0000046F C3 retn + 11028 + 11029 ;ccydp3: + 11030 ; pop es + 11031 ;ccydp4: + 11032 ; clc + 11033 ; retn + 11034 + 11035 ccydp5: + 11036 00000470 89F2 mov dx,si + 11037 00000472 BB0200 mov bx,2 + 11038 00000475 B440 mov ah,40h + 11039 00000477 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 11040 ; BX = file handle, CX = number of bytes to write + 11041 ; DS:DX -> buffer + 11042 00000479 BA[9592] mov dx,cox_Y_quest_ptr ; msg number pointer of ' [Y/N]?' + 11043 ; (is 1082) + 11044 0000047C E8A14F call std_eprintf + 11045 0000047F 1E push ds + 11046 00000480 B83B04 mov ax,1083 ; cox_Y_answer number (overwrite Y/N answer letter) + 11047 00000483 B6FF mov dh,0FFh ; utility_msg_class + 11048 00000485 E88350 call TSYSGETMSG + 11049 ;mov cx,'NY' ; MASM word format + 11050 ; NASM word format + 11051 00000488 B9594E mov cx,'YN' ; 'YN' Yes/No (CL=Y) + 11052 0000048B 7202 jc short ccydp6 + 11053 0000048D 8B0C mov cx,[si] + 11054 ccydp6: + 11055 0000048F 1F pop ds + 11056 ccydp7: + 11057 00000490 B408 mov ah,8 + 11058 00000492 CD21 int 21h ; DOS - KEYBOARD INPUT, NO ECHO + 11059 ; Return: AL = character + 11060 00000494 84C0 test al,al + 11061 00000496 7510 jnz short ccydp8 + 11062 00000498 B408 mov ah,8 + 11063 0000049A CD21 int 21h ; DOS - KEYBOARD INPUT, NO ECHO + 11064 ; Return: AL = character + 11065 0000049C 3C3F cmp al,'?' + 11066 0000049E 75F0 jne short ccydp7 + 11067 000004A0 26800E[5A04]40 or byte [es:Y_Flag],40h ; bit 4, question flag + 11068 000004A6 EBB1 jmp short ccydp1 + 11069 ccydp8: + 11070 000004A8 3C1B cmp al,1Bh ; ESCAPE ? + 11071 000004AA 7509 jne short ccydp9 + 11072 000004AC 268026[5A04]EF and byte [es:Y_Flag],0EFh ; (ESCAPE) Clear bit 4 ; ~10h + 11073 ;jmp short ccydp12 + 11074 ; 07/06/2023 + 11075 000004B2 9C pushf + 11076 000004B3 EB18 jmp short ccydp12 + 11077 ccydp9: + 11078 ; 25/07/2024 - PCDOS 7.1 COMMAND.COM + 11079 000004B5 3C41 cmp al,41h ; 'A' + 11080 000004B7 7202 jb short ccydp13 + 11081 ; + 11082 000004B9 24DF and al,0DFh ; uppercase + 11083 ccydp13: ; 25/07/2024 + 11084 000004BB 38E8 cmp al,ch ; NO character (N) + 11085 000004BD 7503 jne short ccydp10 + 11086 000004BF F9 stc + 11087 000004C0 EB04 jmp short ccydp11 ; cf = 1 -> overwrite NO answer + 11088 ccydp10: + 11089 000004C2 38C8 cmp al,cl ; YES character (Y) + 11090 000004C4 75CA jne short ccydp7 + 11091 ccydp11: + 11092 000004C6 9C pushf ; cf = 0 -> overwrite YES answer + 11093 000004C7 88C2 mov dl,al + 11094 000004C9 B402 mov ah,2 + 11095 000004CB CD21 int 21h ; DOS - DISPLAY OUTPUT + 11096 ; DL = character to send to standard output + 11097 ; 07/06/2023 + 11098 ;popf + 11099 ccydp12: + 11100 ;pushf + 11101 000004CD E8A924 call CRLF2 + 11102 000004D0 9D popf + 11103 000004D1 07 pop es + 11104 000004D2 C3 retn + 11105 + 11106 ;============================================================================ + 11107 ; MSHALO.ASM, MSDOS 6.0, 1991 + 11108 ;============================================================================ + 11109 ; 12/10/2018 - Retro DOS v3.0 + 11110 + 11111 ; 05/02/2023 - Retro DOS v5.0 (& v4.1) COMMAND.COM + 11112 + 11113 ; SCCSID = @(#)ibmhalo.asm 1.1 85/04/10 + 11114 ; On 2K (800h) boundaries beginning at address C0000h and ending at EF800h + 11115 ; there is a header that describes a block of rom program. This header + 11116 ; contains information needed to initialize a module and to provide PCDOS + 11117 ; with a set of reserved names for execution. + 11118 ; + 11119 ; This header has the following format: + 11120 ; + 11121 ; rom_header STRUC + 11122 ; Signature1 DB 55h + 11123 ; Signature2 DB AAh + 11124 ; rom_length DB ? ; number of 512 byte pieces + 11125 ; init_jmp DB 3 dup (?) + 11126 ; name_list name_struc <> + 11127 ; rom_header ENDS + 11128 ; + 11129 ; name_struc STRUC + 11130 ; name_len DB ? + 11131 ; name_text DB ? DUP (?) + 11132 ; name_jmp DB 3 DUP (?) + 11133 ; name_struc ENDS + 11134 ; + 11135 ; The name list is a list of names that are reserved by a particular section + 11136 ; of a module. This list of names is terminated by a null name (length + 11137 ; is zero). + 11138 ; + 11139 ; Consider now, the PCDOS action when a user enters a command: + 11140 ; + 11141 ; COMMAND.COM has control. + 11142 ; o If location FFFFEh has FDh then + 11143 ; o Start scanning at C0000h, every 800h for a byte 55h followed + 11144 ; by AAh, stop scan if we get above or = F0000H + 11145 ; o When we've found one, compare the name entered by the user + 11146 ; with the one found in the rom. If we have a match, then + 11147 ; set up the environment for execution and do a long jump + 11148 ; to the near jump after the found name. + 11149 ; o If no more names in the list, then continue scanning the module + 11150 ; for more 55h followed by AAh. + 11151 ; o We get to this point only if there is no matching name in the + 11152 ; rom. We now look on disk for the command. + 11153 ; + 11154 ; This gives us the flexibility to execute any rom cartridge without having + 11155 ; to 'hard-code' the name of the cartridge into PCDOS. Rom modules that + 11156 ; want to be invisible to the DOS should not have any names in their lists + 11157 ; (i.e. they have a single null name). + 11158 ; + 11159 ; Consider a new release of BASIC, say, that patches bugs in the ROM version. + 11160 ; Clearly this version will be available on disk. How does a user actually + 11161 ; invoke this new BASIC?? He cannot call it BASIC on the disk because the + 11162 ; EXEC loader will execute the ROM before it even looks at the disk! Only + 11163 ; solution: + 11164 ; + 11165 ; o Keep things consistent and force the user to have his software named + 11166 ; differently from the ROM names (BASIC1, BASIC2, etc). + 11167 + 11168 struc ROM_HEADER + 11169 00000000 ?? .signature1: resb 1 + 11170 00000001 ?? .signature2: resb 1 + 11171 00000002 ?? .rom_length: resb 1 + 11172 00000003 ?????? .init_jmp: resb 3 + 11173 00000006 ?? .name_list: resb 1 + 11174 .size: + 11175 endstruc + 11176 + 11177 struc NAME_STRUC + 11178 00000000 ?? .name_len: resb 1 + 11179 00000001 ?? .name_text: resb 1 + 11180 00000002 ?????? .name_jmp: resb 3 + 11181 .size: + 11182 endstruc + 11183 + 11184 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 03D1h + 11185 + 11186 ; =============== S U B R O U T I N E ======================================= + 11187 + 11188 ;ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING 11189 - 11190 ; 07/06/2023 - 11191 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:04D5h + 11190 ; 05/02/2023 + 11191 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:03FBh 11192 - 11193 ; 25/07/2024 - 11194 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:04DBh + 11193 ; 07/06/2023 + 11194 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:04D5h 11195 - 11196 ; Check for IBM PC Jr rom cartrides. DS:DX is a pointer to name - 11197 - 11198 ROM_SCAN: - 11199 000004D3 06 push es - 11200 000004D4 56 push si - 11201 000004D5 57 push di - 11202 000004D6 51 push cx - 11203 000004D7 50 push ax - 11204 000004D8 53 push bx - 11205 - 11206 ; check for PC Jr signature in rom - 11207 - 11208 000004D9 B800F0 mov ax,0F000h - 11209 000004DC 8EC0 mov es,ax - 11210 000004DE 26803EFEFFFD cmp byte [es:0FFFEh],0FDh - 11211 000004E4 7408 je short SCAN_IT - 11212 NO_ROM: - 11213 000004E6 F8 clc - 11214 ROM_RET: - 11215 000004E7 5B pop bx - 11216 000004E8 58 pop ax - 11217 000004E9 59 pop cx - 11218 000004EA 5F pop di - 11219 000004EB 5E pop si - 11220 000004EC 07 pop es - 11221 000004ED C3 retn - 11222 - 11223 ; start scanning at C000h - 11224 SCAN_IT: - 11225 000004EE B800C0 mov ax,0C000h - 11226 SCAN_ONE: - 11227 000004F1 8EC0 mov es,ax - 11228 000004F3 31FF xor di,di - 11229 - 11230 ; check for a valid header - 11231 SCAN_MODULE: - 11232 000004F5 26813D55AA cmp word [es:di],0AA55h - 11233 000004FA 740A je short SCAN_LIST - 11234 000004FC 058000 add ax,80h - 11235 SCAN_END: - 11236 000004FF 3D00F0 cmp ax,0F000h - 11237 00000502 72ED jb short SCAN_ONE - 11238 00000504 EBE0 jmp short NO_ROM - 11239 - 11240 ; trundle down list of names - 11241 SCAN_LIST: - 11242 ;mov bl,[es:di+2] ; number of 512-byte jobbers - 11243 00000506 268A5D02 mov bl,[es:di+ROM_HEADER.rom_length] - 11244 0000050A 30FF xor bh,bh ; nothing in the high byte - 11245 0000050C D1E3 shl bx,1 - 11246 0000050E D1E3 shl bx,1 ; number of paragraphs - 11247 00000510 83C37F add bx,7Fh - 11248 00000513 83E380 and bx,0FF80h ; round to 2k - 11249 ;mov di,6 - 11250 ; 05/05/2023 - 11251 00000516 BF0600 mov di,ROM_HEADER.name_list - 11252 ;nop - 11253 SCAN_NAME: - 11254 00000519 268A0D mov cl,[es:di] ; length of name - 11255 0000051C 47 inc di ; point to name - 11256 0000051D 30ED xor ch,ch - 11257 0000051F 09C9 or cx,cx ; zero length name - 11258 00000521 7504 jnz short SCAN_TEST ; nope... compare - 11259 00000523 01D8 add ax,bx ; yep, skip to next block - 11260 00000525 EBD8 jmp short SCAN_END - 11261 - 11262 ; compare a single name - 11263 SCAN_TEST: - 11264 00000527 89D6 mov si,dx - 11265 00000529 46 inc si - 11266 0000052A F3A6 repe cmpsb ; compare name - 11267 0000052C 7407 jz short SCAN_FOUND ; success! - 11268 SCAN_NEXT: - 11269 0000052E 01CF add di,cx ; failure, next name piece - 11270 00000530 83C703 add di,3 - 11271 00000533 EBE4 jmp short SCAN_NAME - 11272 - 11273 ; found a name. save entry location - 11274 SCAN_FOUND: - 11275 00000535 803C3F cmp byte [si],'?' - 11276 00000538 7405 je short SCAN_SAVE - 11277 0000053A 803C20 cmp byte [si],' ' - 11278 0000053D 75EF jne short SCAN_NEXT - 11279 SCAN_SAVE: - 11280 0000053F 2E8C06[B79D] mov [cs:ROM_CS],es - 11281 00000544 2E893E[B59D] mov [cs:ROM_IP],di - 11282 00000549 F9 stc - 11283 0000054A EB9B jmp short ROM_RET - 11284 - 11285 ; --------------------------------------------------------------------------- - 11286 - 11287 ; execute a rom-placed body of code. allocate largest block - 11288 - 11289 ROM_EXEC: - 11290 0000054C BBFFFF mov bx,0FFFFh - 11291 ; 05/02/2023 - 11292 0000054F B448 mov ah,48h - 11293 ;mov ah,ALLOC ; 48h - 11294 00000551 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 11295 ; BX = number of 16-byte paragraphs desired - 11296 00000553 B448 mov ah,48h - 11297 ;mov ah,ALLOC ; 48h - 11298 00000555 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 11299 ; BX = number of 16-byte paragraphs desired - 11300 00000557 53 push bx - 11301 00000558 50 push ax - 11302 - 11303 ; set terminate addresses - 11304 - 11305 00000559 B82225 mov ax,2522h - 11306 ;;mov ax,(set_interrupt_vector SHL 8) + int_terminate - 11307 ;mov ax,(SET_INTERRUPT_VECTOR<<8)+INT_TERMINATE - 11308 0000055C 1E push ds - 11309 0000055D 2E8E1E[F59B] mov ds,[cs:RESSEG] - 11310 ;mov dx,offset RESGROUP:EXEC_WAIT - 11311 ;mov dx,131h ; MSDOS 3.3 - 11312 ; 05/02/2023 - 11313 ;mov dx,0D6Bh ; MSDOS 5.0 - 11314 00000562 BA[390D] mov dx,Exec_Wait - 11315 00000565 CD21 int 21h ; DOS - SET INTERRUPT VECTOR - 11316 ; AL = interrupt number - 11317 ; DS:DX = new vector to be used for specified interrupt - 11318 00000567 8CDA mov dx,ds - 11319 00000569 8EC2 mov es,dx - 11320 0000056B 1F pop ds - 11321 - 11322 ; and create program header and dup all jfn's - 11323 - 11324 0000056C 5A pop dx - 11325 0000056D B455 mov ah,55h - 11326 ;mov ah,DUP_PDB ; 55h - 11327 0000056F CD21 int 21h ; DOS - 2+ internal - CREATE PSP - 11328 ; DX = segment number at which to set up PSP - 11329 ; SI = (DOS 3+) value to place in memory size field at DX:[0002h] - 11330 - 11331 ; set up dma address - 11332 - 11333 00000571 8EDA mov ds,dx - 11334 00000573 BA8000 mov dx,80h - 11335 00000576 B41A mov ah,1Ah - 11336 ;mov ah,Set_DMA ; 1Ah - 11337 00000578 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 11338 ; DS:DX -> disk transfer buffer - 11339 - 11340 ; copy in environment info - 11341 - 11342 0000057A 26A1[3A04] mov ax,[es:EnvirSeg] - 11343 ;mov [2Ch],ax - 11344 0000057E A32C00 mov [PDB.ENVIRON],ax - 11345 - 11346 ; set up correct size of block - 11347 - 11348 00000581 5B pop bx ; BX has size, DS has segment - 11349 00000582 8CDA mov dx,ds - 11350 00000584 01DA add dx,bx - 11351 ;mov [2],dx - 11352 00000586 89160200 mov [PDB.BLOCK_LEN],dx - 11353 - 11354 ; change ownership of block - 11355 - 11356 0000058A 8CDA mov dx,ds - 11357 0000058C 4A dec dx - 11358 0000058D 8EDA mov ds,dx - 11359 0000058F 42 inc dx - 11360 ;mov [1],dx - 11361 00000590 89160100 mov [ARENA.owner],dx - 11362 00000594 8EDA mov ds,dx - 11363 - 11364 ; set up correct stack - 11365 - 11366 00000596 81FB0010 cmp bx,1000h - 11367 0000059A 7202 jb short GOT_STACK - 11368 0000059C 31DB xor bx,bx - 11369 GOT_STACK: - 11370 0000059E B104 mov cl,4 - 11371 000005A0 D3E3 shl bx,cl - 11372 000005A2 8CDA mov dx,ds - 11373 000005A4 8ED2 mov ss,dx - 11374 000005A6 89DC mov sp,bx - 11375 000005A8 31C0 xor ax,ax - 11376 000005AA 50 push ax - 11377 - 11378 ; set up initial registers and go to the guy - 11379 - 11380 000005AB F7D0 not ax - 11381 000005AD 2EFF36[B79D] push word [cs:ROM_CS] - 11382 000005B2 2EFF36[B59D] push word [cs:ROM_IP] - 11383 000005B7 8EC2 mov es,dx - 11384 000005B9 CB retf ; far return - 11385 - 11386 ; 25/07/2024 - Retro DOS v5.0 - 11387 ; --------------------------------------------------------------------------- - 11388 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:05C2h - 11389 - 11390 ; =============== S U B R O U T I N E ======================================= - 11391 - 11392 int_21h_indirect: - 11393 000005BA 1E push ds ; (*) - 11394 000005BB 9C pushf ; (**) - 11395 000005BC 53 push bx - 11396 000005BD 31DB xor bx, bx - 11397 000005BF 8EDB mov ds, bx ; 0 - 11398 000005C1 5B pop bx - 11399 000005C2 0E push cs ; simulate INT 21h - 11400 ; stack: ip, cs, flags (**) - 11401 000005C3 E80300 call INT21h_fcall - 11402 000005C6 C20200 retn 2 ; discard ds (*) on top of stack - 11403 - 11404 ; =============== S U B R O U T I N E ======================================= - 11405 - 11406 INT21h_fcall: - 11407 ;push word ptr ds:86h - 11408 000005C9 FF368600 push word [(4*21h)+2] ; INT 21h segment - 11409 ;push word ptr ds:84h - 11410 000005CD FF368400 push word [4*21h] ; INT 21h offset - 11411 000005D1 55 push bp - 11412 000005D2 89E5 mov bp,sp - 11413 000005D4 8E5E0C mov ds,[bp+12] ; DS (*) in stack - 11414 000005D7 FF760E push word [bp+14] ; return addr of the caller of INT21h_fcall - 11415 000005DA 8F460C pop word [bp+12] ; return address from INT 21h - 11416 000005DD 5D pop bp - 11417 000005DE FA cli - 11418 000005DF CB retf - 11419 - 11420 ; =============== S U B R O U T I N E ======================================= - 11421 - 11422 int_2Fh_indirect: - 11423 000005E0 1E push ds - 11424 000005E1 53 push bx - 11425 000005E2 31DB xor bx,bx - 11426 000005E4 8EDB mov ds,bx - 11427 000005E6 5B pop bx - 11428 000005E7 9C pushf - 11429 000005E8 FA cli - 11430 ;call dword ptr ds:0BCh - 11431 000005E9 FF1EBC00 call far [4*2Fh] ; INT 2Fh handler - 11432 000005ED 1F pop ds - 11433 000005EE C3 retn - 11434 - 11435 ; --------------------------------------------------------------------------- - 11436 - 11437 ;============================================================================ - 11438 ; TBATCH.ASM, MSDOS 6.0, 1991 - 11439 ;============================================================================ - 11440 ; 12/10/2018 - Retro DOS v3.0 - 11441 - 11442 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 04B9h - 11443 - 11444 ; =============== S U B R O U T I N E ======================================= - 11445 - 11446 ;Break - 11447 - 11448 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11449 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:04E2h + 11196 ; 25/07/2024 + 11197 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:04DBh + 11198 + 11199 ; Check for IBM PC Jr rom cartrides. DS:DX is a pointer to name + 11200 + 11201 ROM_SCAN: + 11202 000004D3 06 push es + 11203 000004D4 56 push si + 11204 000004D5 57 push di + 11205 000004D6 51 push cx + 11206 000004D7 50 push ax + 11207 000004D8 53 push bx + 11208 + 11209 ; check for PC Jr signature in rom + 11210 + 11211 000004D9 B800F0 mov ax,0F000h + 11212 000004DC 8EC0 mov es,ax + 11213 000004DE 26803EFEFFFD cmp byte [es:0FFFEh],0FDh + 11214 000004E4 7408 je short SCAN_IT + 11215 NO_ROM: + 11216 000004E6 F8 clc + 11217 ROM_RET: + 11218 000004E7 5B pop bx + 11219 000004E8 58 pop ax + 11220 000004E9 59 pop cx + 11221 000004EA 5F pop di + 11222 000004EB 5E pop si + 11223 000004EC 07 pop es + 11224 000004ED C3 retn + 11225 + 11226 ; start scanning at C000h + 11227 SCAN_IT: + 11228 000004EE B800C0 mov ax,0C000h + 11229 SCAN_ONE: + 11230 000004F1 8EC0 mov es,ax + 11231 000004F3 31FF xor di,di + 11232 + 11233 ; check for a valid header + 11234 SCAN_MODULE: + 11235 000004F5 26813D55AA cmp word [es:di],0AA55h + 11236 000004FA 740A je short SCAN_LIST + 11237 000004FC 058000 add ax,80h + 11238 SCAN_END: + 11239 000004FF 3D00F0 cmp ax,0F000h + 11240 00000502 72ED jb short SCAN_ONE + 11241 00000504 EBE0 jmp short NO_ROM + 11242 + 11243 ; trundle down list of names + 11244 SCAN_LIST: + 11245 ;mov bl,[es:di+2] ; number of 512-byte jobbers + 11246 00000506 268A5D02 mov bl,[es:di+ROM_HEADER.rom_length] + 11247 0000050A 30FF xor bh,bh ; nothing in the high byte + 11248 0000050C D1E3 shl bx,1 + 11249 0000050E D1E3 shl bx,1 ; number of paragraphs + 11250 00000510 83C37F add bx,7Fh + 11251 00000513 83E380 and bx,0FF80h ; round to 2k + 11252 ;mov di,6 + 11253 ; 05/05/2023 + 11254 00000516 BF0600 mov di,ROM_HEADER.name_list + 11255 ;nop + 11256 SCAN_NAME: + 11257 00000519 268A0D mov cl,[es:di] ; length of name + 11258 0000051C 47 inc di ; point to name + 11259 0000051D 30ED xor ch,ch + 11260 0000051F 09C9 or cx,cx ; zero length name + 11261 00000521 7504 jnz short SCAN_TEST ; nope... compare + 11262 00000523 01D8 add ax,bx ; yep, skip to next block + 11263 00000525 EBD8 jmp short SCAN_END + 11264 + 11265 ; compare a single name + 11266 SCAN_TEST: + 11267 00000527 89D6 mov si,dx + 11268 00000529 46 inc si + 11269 0000052A F3A6 repe cmpsb ; compare name + 11270 0000052C 7407 jz short SCAN_FOUND ; success! + 11271 SCAN_NEXT: + 11272 0000052E 01CF add di,cx ; failure, next name piece + 11273 00000530 83C703 add di,3 + 11274 00000533 EBE4 jmp short SCAN_NAME + 11275 + 11276 ; found a name. save entry location + 11277 SCAN_FOUND: + 11278 00000535 803C3F cmp byte [si],'?' + 11279 00000538 7405 je short SCAN_SAVE + 11280 0000053A 803C20 cmp byte [si],' ' + 11281 0000053D 75EF jne short SCAN_NEXT + 11282 SCAN_SAVE: + 11283 0000053F 2E8C06[B79D] mov [cs:ROM_CS],es + 11284 00000544 2E893E[B59D] mov [cs:ROM_IP],di + 11285 00000549 F9 stc + 11286 0000054A EB9B jmp short ROM_RET + 11287 + 11288 ; --------------------------------------------------------------------------- + 11289 + 11290 ; execute a rom-placed body of code. allocate largest block + 11291 + 11292 ROM_EXEC: + 11293 0000054C BBFFFF mov bx,0FFFFh + 11294 ; 05/02/2023 + 11295 0000054F B448 mov ah,48h + 11296 ;mov ah,ALLOC ; 48h + 11297 00000551 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 11298 ; BX = number of 16-byte paragraphs desired + 11299 00000553 B448 mov ah,48h + 11300 ;mov ah,ALLOC ; 48h + 11301 00000555 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 11302 ; BX = number of 16-byte paragraphs desired + 11303 00000557 53 push bx + 11304 00000558 50 push ax + 11305 + 11306 ; set terminate addresses + 11307 + 11308 00000559 B82225 mov ax,2522h + 11309 ;;mov ax,(set_interrupt_vector SHL 8) + int_terminate + 11310 ;mov ax,(SET_INTERRUPT_VECTOR<<8)+INT_TERMINATE + 11311 0000055C 1E push ds + 11312 0000055D 2E8E1E[F59B] mov ds,[cs:RESSEG] + 11313 ;mov dx,offset RESGROUP:EXEC_WAIT + 11314 ;mov dx,131h ; MSDOS 3.3 + 11315 ; 05/02/2023 + 11316 ;mov dx,0D6Bh ; MSDOS 5.0 + 11317 00000562 BA[390D] mov dx,Exec_Wait + 11318 00000565 CD21 int 21h ; DOS - SET INTERRUPT VECTOR + 11319 ; AL = interrupt number + 11320 ; DS:DX = new vector to be used for specified interrupt + 11321 00000567 8CDA mov dx,ds + 11322 00000569 8EC2 mov es,dx + 11323 0000056B 1F pop ds + 11324 + 11325 ; and create program header and dup all jfn's + 11326 + 11327 0000056C 5A pop dx + 11328 0000056D B455 mov ah,55h + 11329 ;mov ah,DUP_PDB ; 55h + 11330 0000056F CD21 int 21h ; DOS - 2+ internal - CREATE PSP + 11331 ; DX = segment number at which to set up PSP + 11332 ; SI = (DOS 3+) value to place in memory size field at DX:[0002h] + 11333 + 11334 ; set up dma address + 11335 + 11336 00000571 8EDA mov ds,dx + 11337 00000573 BA8000 mov dx,80h + 11338 00000576 B41A mov ah,1Ah + 11339 ;mov ah,Set_DMA ; 1Ah + 11340 00000578 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 11341 ; DS:DX -> disk transfer buffer + 11342 + 11343 ; copy in environment info + 11344 + 11345 0000057A 26A1[3A04] mov ax,[es:EnvirSeg] + 11346 ;mov [2Ch],ax + 11347 0000057E A32C00 mov [PDB.ENVIRON],ax + 11348 + 11349 ; set up correct size of block + 11350 + 11351 00000581 5B pop bx ; BX has size, DS has segment + 11352 00000582 8CDA mov dx,ds + 11353 00000584 01DA add dx,bx + 11354 ;mov [2],dx + 11355 00000586 89160200 mov [PDB.BLOCK_LEN],dx + 11356 + 11357 ; change ownership of block + 11358 + 11359 0000058A 8CDA mov dx,ds + 11360 0000058C 4A dec dx + 11361 0000058D 8EDA mov ds,dx + 11362 0000058F 42 inc dx + 11363 ;mov [1],dx + 11364 00000590 89160100 mov [ARENA.owner],dx + 11365 00000594 8EDA mov ds,dx + 11366 + 11367 ; set up correct stack + 11368 + 11369 00000596 81FB0010 cmp bx,1000h + 11370 0000059A 7202 jb short GOT_STACK + 11371 0000059C 31DB xor bx,bx + 11372 GOT_STACK: + 11373 0000059E B104 mov cl,4 + 11374 000005A0 D3E3 shl bx,cl + 11375 000005A2 8CDA mov dx,ds + 11376 000005A4 8ED2 mov ss,dx + 11377 000005A6 89DC mov sp,bx + 11378 000005A8 31C0 xor ax,ax + 11379 000005AA 50 push ax + 11380 + 11381 ; set up initial registers and go to the guy + 11382 + 11383 000005AB F7D0 not ax + 11384 000005AD 2EFF36[B79D] push word [cs:ROM_CS] + 11385 000005B2 2EFF36[B59D] push word [cs:ROM_IP] + 11386 000005B7 8EC2 mov es,dx + 11387 000005B9 CB retf ; far return + 11388 + 11389 ; 25/07/2024 - Retro DOS v5.0 + 11390 ; --------------------------------------------------------------------------- + 11391 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:05C2h + 11392 + 11393 ; =============== S U B R O U T I N E ======================================= + 11394 + 11395 int_21h_indirect: + 11396 000005BA 1E push ds ; (*) + 11397 000005BB 9C pushf ; (**) + 11398 000005BC 53 push bx + 11399 000005BD 31DB xor bx, bx + 11400 000005BF 8EDB mov ds, bx ; 0 + 11401 000005C1 5B pop bx + 11402 000005C2 0E push cs ; simulate INT 21h + 11403 ; stack: ip, cs, flags (**) + 11404 000005C3 E80300 call INT21h_fcall + 11405 000005C6 C20200 retn 2 ; discard ds (*) on top of stack + 11406 + 11407 ; =============== S U B R O U T I N E ======================================= + 11408 + 11409 INT21h_fcall: + 11410 ;push word ptr ds:86h + 11411 000005C9 FF368600 push word [(4*21h)+2] ; INT 21h segment + 11412 ;push word ptr ds:84h + 11413 000005CD FF368400 push word [4*21h] ; INT 21h offset + 11414 000005D1 55 push bp + 11415 000005D2 89E5 mov bp,sp + 11416 000005D4 8E5E0C mov ds,[bp+12] ; DS (*) in stack + 11417 000005D7 FF760E push word [bp+14] ; return addr of the caller of INT21h_fcall + 11418 000005DA 8F460C pop word [bp+12] ; return address from INT 21h + 11419 000005DD 5D pop bp + 11420 000005DE FA cli + 11421 000005DF CB retf + 11422 + 11423 ; =============== S U B R O U T I N E ======================================= + 11424 + 11425 int_2Fh_indirect: + 11426 000005E0 1E push ds + 11427 000005E1 53 push bx + 11428 000005E2 31DB xor bx,bx + 11429 000005E4 8EDB mov ds,bx + 11430 000005E6 5B pop bx + 11431 000005E7 9C pushf + 11432 000005E8 FA cli + 11433 ;call dword ptr ds:0BCh + 11434 000005E9 FF1EBC00 call far [4*2Fh] ; INT 2Fh handler + 11435 000005ED 1F pop ds + 11436 000005EE C3 retn + 11437 + 11438 ; --------------------------------------------------------------------------- + 11439 + 11440 ;============================================================================ + 11441 ; TBATCH.ASM, MSDOS 6.0, 1991 + 11442 ;============================================================================ + 11443 ; 12/10/2018 - Retro DOS v3.0 + 11444 + 11445 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 04B9h + 11446 + 11447 ; =============== S U B R O U T I N E ======================================= + 11448 + 11449 ;Break 11450 - 11451 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 11452 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:05BCh + 11451 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11452 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:04E2h 11453 - 11454 ; Open the batch file. If we cannot find the batch file. If the media is - 11455 ; changeable, we prompt for the change. Otherwise, we terminate the batch - 11456 ; file. Leave segment registers alone. - 11457 - 11458 PROMPTBAT: - 11459 000005EF E85308 call BATOPEN - 11460 000005F2 7201 jc short PROMPTBAT1 - 11461 000005F4 C3 retn - 11462 PROMPTBAT1: - 11463 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11464 ; MSDOS 6.0 COMMAND.COM - 11465 000005F5 83FA02 cmp dx,ERROR_FILE_NOT_FOUND ;AN022; Ask for diskette if file not found - 11466 000005F8 740A je short BAT_REMCHECK ;AN022; - 11467 000005FA 83FA03 cmp dx,ERROR_PATH_NOT_FOUND ;AN022; Ask for diskette if path not found - 11468 000005FD 7405 je short BAT_REMCHECK ;AN022; Otherwise, issue message and exit - 11469 ;invoke output_batch_name ;AN022; set up batch name in bwdbuf - 11470 000005FF E83500 call output_batch_name - 11471 00000602 EB13 jmp short BATDIE ;AN022; - 11472 - 11473 ; 05/02/2023 - 11474 ; MSDOS 3.3 COMMAND.COM - 11475 ;cmp dx,ACCDENPTR - 11476 ;jz short BATDIE - 11477 - 11478 ; MSDOS 3.3 (& MSDOS 6.0) - 11479 BAT_REMCHECK: ;AN022; Go see if media is removable - 11480 00000604 2EFF1E[FF9B] call far [cs:RCH_ADDR] ; DX has error number - 11481 00000609 7417 jz short ASKFORBAT ; Media is removable - 11482 - 11483 ; The media is not changeable. Turn everything off. - 11484 - 11485 0000060B E84B0B call FOROFF - 11486 0000060E E8962D call PipeOff - 11487 00000611 A2[AA02] mov [IfFlag],al ; No If in progress. - 11488 00000614 BA[F48F] mov dx,BADBAT_PTR - 11489 BATDIE: - 11490 00000617 E8F803 call BATCHOFF - 11491 0000061A 0E push cs - 11492 0000061B 1F pop ds - 11493 ;invoke std_eprintf ;AC022; display message ; MSDOS 6.0 - 11494 ; 05/02/2023 - 11495 0000061C E8014E call std_eprintf ; MSDOS 6.0 - 11496 ;call STD_PRINTF ; MSDOS 3.3 - 11497 - 11498 ; TCOMMAND resets the stack. This is the equivalent of a non-local goto. - 11499 - 11500 0000061F E9E2FA jmp TCOMMAND - 11501 - 11502 ; Ask the user to reinsert the batch file - 11503 - 11504 ASKFORBAT: - 11505 00000622 1E push ds - 11506 00000623 0E push cs - 11507 00000624 1F pop ds - 11508 - 11509 ; MSDOS 6.0 - 11510 ;mov dx,offset TRANGROUP:NEEDBAT_ptr ;AN022; - 11511 00000625 BA[F78F] mov dx,NEEDBAT_PTR - 11512 ;invoke std_eprintf ;Prompt for batch file on stderr - 11513 ; 05/02/2023 - 11514 00000628 E8F54D call std_eprintf - 11515 ;mov dx,offset trangroup:pausemes_ptr - 11516 0000062B BA[A490] mov dx,PAUSEMES_PTR - 11517 ;invoke std_eprintf ;AN000; get second part of message - 11518 0000062E E8EF4D call std_eprintf - 11519 ;AN000; print it to stderr - 11520 ; MSDOS 3.3 (& MSDOS 6.0) - 11521 ;call STD_EPRINTF - 11522 00000631 E82E00 call GETKEYSTROKE - 11523 00000634 1F pop ds - 11524 00000635 EBB8 jmp short PROMPTBAT - 11525 - 11526 - 11527 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11528 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:052Ah + 11454 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 11455 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:05BCh + 11456 + 11457 ; Open the batch file. If we cannot find the batch file. If the media is + 11458 ; changeable, we prompt for the change. Otherwise, we terminate the batch + 11459 ; file. Leave segment registers alone. + 11460 + 11461 PROMPTBAT: + 11462 000005EF E85308 call BATOPEN + 11463 000005F2 7201 jc short PROMPTBAT1 + 11464 000005F4 C3 retn + 11465 PROMPTBAT1: + 11466 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11467 ; MSDOS 6.0 COMMAND.COM + 11468 000005F5 83FA02 cmp dx,ERROR_FILE_NOT_FOUND ;AN022; Ask for diskette if file not found + 11469 000005F8 740A je short BAT_REMCHECK ;AN022; + 11470 000005FA 83FA03 cmp dx,ERROR_PATH_NOT_FOUND ;AN022; Ask for diskette if path not found + 11471 000005FD 7405 je short BAT_REMCHECK ;AN022; Otherwise, issue message and exit + 11472 ;invoke output_batch_name ;AN022; set up batch name in bwdbuf + 11473 000005FF E83500 call output_batch_name + 11474 00000602 EB13 jmp short BATDIE ;AN022; + 11475 + 11476 ; 05/02/2023 + 11477 ; MSDOS 3.3 COMMAND.COM + 11478 ;cmp dx,ACCDENPTR + 11479 ;jz short BATDIE + 11480 + 11481 ; MSDOS 3.3 (& MSDOS 6.0) + 11482 BAT_REMCHECK: ;AN022; Go see if media is removable + 11483 00000604 2EFF1E[FF9B] call far [cs:RCH_ADDR] ; DX has error number + 11484 00000609 7417 jz short ASKFORBAT ; Media is removable + 11485 + 11486 ; The media is not changeable. Turn everything off. + 11487 + 11488 0000060B E84B0B call FOROFF + 11489 0000060E E8962D call PipeOff + 11490 00000611 A2[AA02] mov [IfFlag],al ; No If in progress. + 11491 00000614 BA[F48F] mov dx,BADBAT_PTR + 11492 BATDIE: + 11493 00000617 E8F803 call BATCHOFF + 11494 0000061A 0E push cs + 11495 0000061B 1F pop ds + 11496 ;invoke std_eprintf ;AC022; display message ; MSDOS 6.0 + 11497 ; 05/02/2023 + 11498 0000061C E8014E call std_eprintf ; MSDOS 6.0 + 11499 ;call STD_PRINTF ; MSDOS 3.3 + 11500 + 11501 ; TCOMMAND resets the stack. This is the equivalent of a non-local goto. + 11502 + 11503 0000061F E9E2FA jmp TCOMMAND + 11504 + 11505 ; Ask the user to reinsert the batch file + 11506 + 11507 ASKFORBAT: + 11508 00000622 1E push ds + 11509 00000623 0E push cs + 11510 00000624 1F pop ds + 11511 + 11512 ; MSDOS 6.0 + 11513 ;mov dx,offset TRANGROUP:NEEDBAT_ptr ;AN022; + 11514 00000625 BA[F78F] mov dx,NEEDBAT_PTR + 11515 ;invoke std_eprintf ;Prompt for batch file on stderr + 11516 ; 05/02/2023 + 11517 00000628 E8F54D call std_eprintf + 11518 ;mov dx,offset trangroup:pausemes_ptr + 11519 0000062B BA[A490] mov dx,PAUSEMES_PTR + 11520 ;invoke std_eprintf ;AN000; get second part of message + 11521 0000062E E8EF4D call std_eprintf + 11522 ;AN000; print it to stderr + 11523 ; MSDOS 3.3 (& MSDOS 6.0) + 11524 ;call STD_EPRINTF + 11525 00000631 E82E00 call GETKEYSTROKE + 11526 00000634 1F pop ds + 11527 00000635 EBB8 jmp short PROMPTBAT + 11528 11529 - 11530 ; MSDOS 6.0 - 11531 ;**************************************************************** - 11532 ;* - 11533 ;* ROUTINE: Output_batch_name - 11534 ;* - 11535 ;* FUNCTION: Sets up batch name to be printed on extended error - 11536 ;* - 11537 ;* INPUT: DX - extended error number - 11538 ;* - 11539 ;* OUTPUT: Ready to call print routine - 11540 ;* - 11541 ;**************************************************************** - 11542 ; - 11543 ;public output_batch_name ;AN022; - 11544 - 11545 output_batch_name: ;proc near ;AN022; - 11546 - 11547 00000637 1E push ds ;AN022; save resident segment - 11548 00000638 8E1E[4902] mov ds,[Batch] ;AN022; get batch file segment - 11549 ;assume DS:nothing ;AN022; - 11550 ;;mov SI,BatFile ;AN022; get offset of batch file - 11551 ; 05/02/2023 - 11552 ;mov si,20h - 11553 ; 24/04/2023 - 11554 0000063C BE2000 mov si,BATCHSEGMENT.BatFile - 11555 ;invoke dstrlen ;AN022; get length of string - 11556 0000063F E85D2A call dstrlen - 11557 ;mov di,offset Trangroup:bwdbuf - 11558 ;AN022; target for batch name - 11559 00000642 BF[399D] mov di,BWDBUF - 11560 00000645 F3A4 rep movsb ;AN022; move the name - 11561 - 11562 00000647 0E push cs ;AN022; get local segment - 11563 00000648 1F pop ds ;AN022; - 11564 ;assume DS:trangroup ;AN022; - 11565 ; 05/02/2023 - 11566 00000649 8916[D78F] mov [extend_buf_ptr],dx ;AN022; put message number in block - 11567 ;mov byte [msg_disp_class],1 - 11568 0000064D C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 11569 ;AN022; set up extended error msg class - 11570 ;mov dx,offset TranGroup:Extend_Buf_ptr - 11571 00000652 BA[D78F] mov dx,extend_buf_ptr - 11572 ;AN022; get extended message pointer - 11573 ;mov string_ptr_2,offset trangroup:bwdbuf - 11574 00000655 C706[A09D][399D] mov word [string_ptr_2],BWDBUF - 11575 ;AN022; point to substitution - 11576 ;mov byte [extend_buf_sub],1 - 11577 0000065B C606[D98F]01 mov byte [extend_buf_sub],one_subst - 11578 ;AN022; set up for one subst - 11579 00000660 1F pop ds ;AN022; restore data segment - 11580 00000661 C3 retn ;AN022; return - 11581 - 11582 ;output_batch_name endp ;AN022; - 11583 + 11530 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11531 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:052Ah + 11532 + 11533 ; MSDOS 6.0 + 11534 ;**************************************************************** + 11535 ;* + 11536 ;* ROUTINE: Output_batch_name + 11537 ;* + 11538 ;* FUNCTION: Sets up batch name to be printed on extended error + 11539 ;* + 11540 ;* INPUT: DX - extended error number + 11541 ;* + 11542 ;* OUTPUT: Ready to call print routine + 11543 ;* + 11544 ;**************************************************************** + 11545 ; + 11546 ;public output_batch_name ;AN022; + 11547 + 11548 output_batch_name: ;proc near ;AN022; + 11549 + 11550 00000637 1E push ds ;AN022; save resident segment + 11551 00000638 8E1E[4902] mov ds,[Batch] ;AN022; get batch file segment + 11552 ;assume DS:nothing ;AN022; + 11553 ;;mov SI,BatFile ;AN022; get offset of batch file + 11554 ; 05/02/2023 + 11555 ;mov si,20h + 11556 ; 24/04/2023 + 11557 0000063C BE2000 mov si,BATCHSEGMENT.BatFile + 11558 ;invoke dstrlen ;AN022; get length of string + 11559 0000063F E85D2A call dstrlen + 11560 ;mov di,offset Trangroup:bwdbuf + 11561 ;AN022; target for batch name + 11562 00000642 BF[399D] mov di,BWDBUF + 11563 00000645 F3A4 rep movsb ;AN022; move the name + 11564 + 11565 00000647 0E push cs ;AN022; get local segment + 11566 00000648 1F pop ds ;AN022; + 11567 ;assume DS:trangroup ;AN022; + 11568 ; 05/02/2023 + 11569 00000649 8916[D78F] mov [extend_buf_ptr],dx ;AN022; put message number in block + 11570 ;mov byte [msg_disp_class],1 + 11571 0000064D C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 11572 ;AN022; set up extended error msg class + 11573 ;mov dx,offset TranGroup:Extend_Buf_ptr + 11574 00000652 BA[D78F] mov dx,extend_buf_ptr + 11575 ;AN022; get extended message pointer + 11576 ;mov string_ptr_2,offset trangroup:bwdbuf + 11577 00000655 C706[A09D][399D] mov word [string_ptr_2],BWDBUF + 11578 ;AN022; point to substitution + 11579 ;mov byte [extend_buf_sub],1 + 11580 0000065B C606[D98F]01 mov byte [extend_buf_sub],one_subst + 11581 ;AN022; set up for one subst + 11582 00000660 1F pop ds ;AN022; restore data segment + 11583 00000661 C3 retn ;AN022; return 11584 - 11585 ; =============== S U B R O U T I N E ======================================= + 11585 ;output_batch_name endp ;AN022; 11586 - 11587 ;Break - 11588 - 11589 ; Read the next keystroke. Since there may be several characters in the queue - 11590 ; after the one we ask for (function keys/Kanji), we need to flush the queue - 11591 ; AFTER waiting. - 11592 - 11593 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11594 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0555h + 11587 + 11588 ; =============== S U B R O U T I N E ======================================= + 11589 + 11590 ;Break + 11591 + 11592 ; Read the next keystroke. Since there may be several characters in the queue + 11593 ; after the one we ask for (function keys/Kanji), we need to flush the queue + 11594 ; AFTER waiting. 11595 - 11596 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 11597 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:062Fh + 11596 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11597 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0555h 11598 - 11599 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 11600 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:066Ah + 11599 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 11600 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:062Fh 11601 - 11602 GETKEYSTROKE: - 11603 ; 05/02/2023 - 11604 ; MSDOS 3.3 - 11605 ;;mov ax,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_NO_ECHO - 11606 ;;mov ax,0C08h - 11607 ;mov ax,(STD_CON_INPUT_FLUSH<<8)|STD_CON_INPUT_NO_ECHO - 11608 ;int 21h ; DOS - CLEAR KEYBOARD BUFFER - 11609 ; ; AL must be 01h,06h,07h,08h,or 0Ah. - 11610 ;;mov ax,(STD_CON_INPUT_FLUSH SHL 8) + 0 - 11611 ;;mov ax,0C00h - 11612 ;mov ax,(STD_CON_INPUT_FLUSH<<8)+0 - 11613 ;int 21h ; DOS - CLEAR KEYBOARD BUFFER - 11614 ; ; AL must be 01h,06h,07h,08h,or 0Ah. - 11615 ;retn - 11616 - 11617 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11618 ; MSDOS 6.0 - 11619 00000662 52 push dx ;AN000; 3/3/KK - 11620 ;mov ax,(ECS_call SHL 8) OR GetInterimMode - 11621 ;AN000; 3/3/KK - 11622 00000663 B80263 mov ax,6302h - 11623 00000666 CD21 int 21h ;AN000; 3/3/KK - 11624 ; DOS - 3.2+ only - GET KOREAN (HONGEUL) INPUT MODE - 11625 - 11626 00000668 52 push dx ;AN000; save interim state 3/3/KK - 11627 ;mov ax,(ECS_call SHL 8) OR SetInterimMode - 11628 ;AN000; 3/3/KK - 11629 00000669 B80163 mov ax,6301h - 11630 0000066C B201 mov dl,1 - 11631 ;mov dl,InterimMode ;AN000; 3/3/KK - 11632 0000066E CD21 int 21h ;AN000; 3/3/KK - 11633 ; DOS - 3.2+ only - SET KOREAN (HONGEUL) INPUT MODE - 11634 ; DL = new mode - 11635 ; 00h return only full characters on DOS keyboard input functions - 11636 ; 01h return partially-formed characters also - 11637 - 11638 ;mov ax,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_no_echo - 11639 00000670 B8080C mov ax,0C08h - 11640 00000673 CD21 int 21h ; Get character with KB buffer flush - 11641 ; DOS - CLEAR KEYBOARD BUFFER - 11642 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. - 11643 - 11644 ;mov ax,(STD_CON_INPUT_FLUSH SHL 8) + 0 - 11645 00000675 B8000C mov ax,0C00h - 11646 00000678 CD21 int 21h - 11647 ; DOS - CLEAR KEYBOARD BUFFER - 11648 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. - 11649 - 11650 ;mov ax,(ECS_call SHL 8) OR SetInterimMode - 11651 ;AN000; 3/3/KK - 11652 0000067A B80163 mov ax,6301h - 11653 0000067D 5A pop dx ;AN000; restore interim state 3/3/KK - 11654 0000067E CD21 int 21h ;AN000; 3/3/KK - 11655 00000680 5A pop dx ;AN000; 3/3/KK - 11656 - 11657 00000681 C3 retn - 11658 - 11659 ; =============== S U B R O U T I N E ======================================= - 11660 - 11661 ; Break - 11662 - 11663 ; ReadBat - read a single line from the batch file. - 11664 ; Perform all substitutions as appropriate. + 11602 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 11603 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:066Ah + 11604 + 11605 GETKEYSTROKE: + 11606 ; 05/02/2023 + 11607 ; MSDOS 3.3 + 11608 ;;mov ax,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_NO_ECHO + 11609 ;;mov ax,0C08h + 11610 ;mov ax,(STD_CON_INPUT_FLUSH<<8)|STD_CON_INPUT_NO_ECHO + 11611 ;int 21h ; DOS - CLEAR KEYBOARD BUFFER + 11612 ; ; AL must be 01h,06h,07h,08h,or 0Ah. + 11613 ;;mov ax,(STD_CON_INPUT_FLUSH SHL 8) + 0 + 11614 ;;mov ax,0C00h + 11615 ;mov ax,(STD_CON_INPUT_FLUSH<<8)+0 + 11616 ;int 21h ; DOS - CLEAR KEYBOARD BUFFER + 11617 ; ; AL must be 01h,06h,07h,08h,or 0Ah. + 11618 ;retn + 11619 + 11620 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11621 ; MSDOS 6.0 + 11622 00000662 52 push dx ;AN000; 3/3/KK + 11623 ;mov ax,(ECS_call SHL 8) OR GetInterimMode + 11624 ;AN000; 3/3/KK + 11625 00000663 B80263 mov ax,6302h + 11626 00000666 CD21 int 21h ;AN000; 3/3/KK + 11627 ; DOS - 3.2+ only - GET KOREAN (HONGEUL) INPUT MODE + 11628 + 11629 00000668 52 push dx ;AN000; save interim state 3/3/KK + 11630 ;mov ax,(ECS_call SHL 8) OR SetInterimMode + 11631 ;AN000; 3/3/KK + 11632 00000669 B80163 mov ax,6301h + 11633 0000066C B201 mov dl,1 + 11634 ;mov dl,InterimMode ;AN000; 3/3/KK + 11635 0000066E CD21 int 21h ;AN000; 3/3/KK + 11636 ; DOS - 3.2+ only - SET KOREAN (HONGEUL) INPUT MODE + 11637 ; DL = new mode + 11638 ; 00h return only full characters on DOS keyboard input functions + 11639 ; 01h return partially-formed characters also + 11640 + 11641 ;mov ax,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_no_echo + 11642 00000670 B8080C mov ax,0C08h + 11643 00000673 CD21 int 21h ; Get character with KB buffer flush + 11644 ; DOS - CLEAR KEYBOARD BUFFER + 11645 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. + 11646 + 11647 ;mov ax,(STD_CON_INPUT_FLUSH SHL 8) + 0 + 11648 00000675 B8000C mov ax,0C00h + 11649 00000678 CD21 int 21h + 11650 ; DOS - CLEAR KEYBOARD BUFFER + 11651 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. + 11652 + 11653 ;mov ax,(ECS_call SHL 8) OR SetInterimMode + 11654 ;AN000; 3/3/KK + 11655 0000067A B80163 mov ax,6301h + 11656 0000067D 5A pop dx ;AN000; restore interim state 3/3/KK + 11657 0000067E CD21 int 21h ;AN000; 3/3/KK + 11658 00000680 5A pop dx ;AN000; 3/3/KK + 11659 + 11660 00000681 C3 retn + 11661 + 11662 ; =============== S U B R O U T I N E ======================================= + 11663 + 11664 ; Break 11665 - 11666 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM - 11667 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0575h + 11666 ; ReadBat - read a single line from the batch file. + 11667 ; Perform all substitutions as appropriate. 11668 - 11669 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 11670 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:068Ah + 11669 ; 05/02/2023 - Retro DOS v4.0 COMMAND.COM + 11670 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0575h 11671 - 11672 READBAT: - 11673 ;ASSUME DS:ResGroup,ES:TranGroup - 11674 - 11675 ;mov byte [Suppress],1 - 11676 ; initialize line suppress status - 11677 00000682 C606[9E02]01 mov byte [Suppress],YES_ECHO - 11678 00000687 F606[9302]FF test byte [Batch_Abort],-1 ; 0FFh - 11679 0000068C 751F jnz short TRYING_TO_ABORT - 11680 0000068E C606[9202]01 mov byte [In_Batch],1 ; set flag to indicate batch job - 11681 - 11682 ; MSDOS 6.0 - 11683 - 11684 ;M037; Start of changes - 11685 ; We check here if we have set the flag indicating that the batchfile is at - 11686 ;EOF. In this case, we do not want to continue with the normal processing. - 11687 ;We call GetBatByt once more so that the batch segment gets freed up, the - 11688 ;batch file gets closed etc. and then return as if everything is done. - 11689 - 11690 ; 05/02/2023 - 11691 00000693 1E push ds - 11692 00000694 8E1E[4902] mov ds,[Batch] - 11693 ;cmp byte [2],0 - 11694 00000698 803E020000 cmp byte [BATCHSEGMENT.BatchEOF],0 - 11695 ; are we at EOF in batchfile - 11696 0000069D 1F pop ds - 11697 0000069E 740A jz short CONTBAT ; no, continue normal processing - 11698 ;invoke GetBatByt ; frees up batchseg - 11699 000006A0 E8DC03 call GETBATBYT - 11700 000006A3 26A2[569A] mov [es:COMBUF+2],al - 11701 ; stuff CR into command buffer - 11702 ; as a dummy command - 11703 ;;invoke CrLf2 ; print a CR-LF - 11704 ;call CRLF2 - 11705 ;;return ; done batch processing - 11706 ;retn - 11707 ; 24/04/2023 - 11708 000006A7 E9CF22 jmp CRLF2 - 11709 - 11710 ;M037; End of changes - 11711 - 11712 ; MSDOS 3.3 (& MSDOS 6.0) - 11713 CONTBAT: - 11714 000006AA E842FF call PROMPTBAT - 11715 - 11716 TRYING_TO_ABORT: - 11717 000006AD BF[569A] mov di,COMBUF+2 + 11672 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 11673 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:068Ah + 11674 + 11675 READBAT: + 11676 ;ASSUME DS:ResGroup,ES:TranGroup + 11677 + 11678 ;mov byte [Suppress],1 + 11679 ; initialize line suppress status + 11680 00000682 C606[9E02]01 mov byte [Suppress],YES_ECHO + 11681 00000687 F606[9302]FF test byte [Batch_Abort],-1 ; 0FFh + 11682 0000068C 751F jnz short TRYING_TO_ABORT + 11683 0000068E C606[9202]01 mov byte [In_Batch],1 ; set flag to indicate batch job + 11684 + 11685 ; MSDOS 6.0 + 11686 + 11687 ;M037; Start of changes + 11688 ; We check here if we have set the flag indicating that the batchfile is at + 11689 ;EOF. In this case, we do not want to continue with the normal processing. + 11690 ;We call GetBatByt once more so that the batch segment gets freed up, the + 11691 ;batch file gets closed etc. and then return as if everything is done. + 11692 + 11693 ; 05/02/2023 + 11694 00000693 1E push ds + 11695 00000694 8E1E[4902] mov ds,[Batch] + 11696 ;cmp byte [2],0 + 11697 00000698 803E020000 cmp byte [BATCHSEGMENT.BatchEOF],0 + 11698 ; are we at EOF in batchfile + 11699 0000069D 1F pop ds + 11700 0000069E 740A jz short CONTBAT ; no, continue normal processing + 11701 ;invoke GetBatByt ; frees up batchseg + 11702 000006A0 E8DC03 call GETBATBYT + 11703 000006A3 26A2[569A] mov [es:COMBUF+2],al + 11704 ; stuff CR into command buffer + 11705 ; as a dummy command + 11706 ;;invoke CrLf2 ; print a CR-LF + 11707 ;call CRLF2 + 11708 ;;return ; done batch processing + 11709 ;retn + 11710 ; 24/04/2023 + 11711 000006A7 E9CF22 jmp CRLF2 + 11712 + 11713 ;M037; End of changes + 11714 + 11715 ; MSDOS 3.3 (& MSDOS 6.0) + 11716 CONTBAT: + 11717 000006AA E842FF call PROMPTBAT 11718 - 11719 ; Save position and try to scan for first non delimiter. - 11720 - 11721 TESTNOP: - 11722 000006B0 8CD8 mov ax,ds - 11723 000006B2 8E1E[4902] mov ds,[Batch] - 11724 000006B6 FF360800 push word [BATCHSEGMENT.BatSeek] - 11725 000006BA FF360A00 push word [BATCHSEGMENT.BatSeek+2] - 11726 ; save current location. - 11727 000006BE 8ED8 mov ds,ax - 11728 000006C0 E85506 call SKIPDELIM ; skip to first non-delim - 11729 - 11730 ; If the first non-delimiter is not a : (label), we reseek back to the - 11731 ; beginning and read the line. + 11719 TRYING_TO_ABORT: + 11720 000006AD BF[569A] mov di,COMBUF+2 + 11721 + 11722 ; Save position and try to scan for first non delimiter. + 11723 + 11724 TESTNOP: + 11725 000006B0 8CD8 mov ax,ds + 11726 000006B2 8E1E[4902] mov ds,[Batch] + 11727 000006B6 FF360800 push word [BATCHSEGMENT.BatSeek] + 11728 000006BA FF360A00 push word [BATCHSEGMENT.BatSeek+2] + 11729 ; save current location. + 11730 000006BE 8ED8 mov ds,ax + 11731 000006C0 E85506 call SKIPDELIM ; skip to first non-delim 11732 - 11733 000006C3 3C3A cmp al,':' ; is it a label? - 11734 000006C5 59 pop cx - 11735 000006C6 5A pop dx ; restore position in bat file - 11736 000006C7 7432 jz short NOPLINE ; yes, resync everything. - 11737 000006C9 F706[4902]FFFF test word [Batch],-1 ; are we done with the batch file? - 11738 000006CF 7439 jz short RDBAT ; no, go read batch file - 11739 - 11740 ;cmp al,'@' - 11741 000006D1 3C40 cmp al,No_Echo_Char ; see if user wants to suppress line - 11742 000006D3 7507 jne short SET_BAT_POS ; no - go and set batch file position - 11743 ;mov byte [Suppress],0 - 11744 000006D5 C606[9E02]00 mov byte [Suppress],NO_ECHO ; yes set flag to indicate - 11745 000006DA EB2E jmp short RDBAT ; go read batch file - 11746 ;nop - 11747 SET_BAT_POS: - 11748 000006DC 1E push ds - 11749 000006DD 8E1E[4902] mov ds,[Batch] - 11750 ;mov [8],dx - 11751 000006E1 89160800 mov [BATCHSEGMENT.BatSeek],dx ; reseek back to beginning - 11752 ;mov [10],cx - 11753 000006E5 890E0A00 mov [BATCHSEGMENT.BatSeek+2],cx - 11754 000006E9 1F pop ds - 11755 ;;mov ax,(LSEEK SHL 8) + 0 - 11756 ; 05/02/2023 - 11757 000006EA B80042 mov ax,4200h - 11758 ;mov ax,(LSEEK*256) ; 4200h ; seek back - 11759 - 11760 ; 25/07/2024 - 11761 ; PCDOS 7.1 COMMAND.COM - 11762 %if 0 - 11763 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 11764 ; AL = method: offset from beginning of file - 11765 %else - 11766 000006ED E8CAFE call int_21h_indirect - 11767 %endif - 11768 ;mov word [cs:BATBUFPOS],0FFFFh - 11769 ; 24/04/2023 - 11770 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:05E3h - 11771 000006F0 26C706[C7A5]FFFF mov word [es:BATBUFPOS],-1; 0FFFFh - 11772 ;mov word [cs:BATBUFPOS],-1 ; nuke batch buffer position - 11773 000006F7 31C9 xor cx,cx ; Initialize line length to zero - 11774 000006F9 EB0F jmp short RDBAT - 11775 - 11776 ;nop - 11777 - 11778 ; The first non-delimiter is a :. This line is not echoed and is ignored. - 11779 ; We eat characters until a CR is seen. + 11733 ; If the first non-delimiter is not a : (label), we reseek back to the + 11734 ; beginning and read the line. + 11735 + 11736 000006C3 3C3A cmp al,':' ; is it a label? + 11737 000006C5 59 pop cx + 11738 000006C6 5A pop dx ; restore position in bat file + 11739 000006C7 7432 jz short NOPLINE ; yes, resync everything. + 11740 000006C9 F706[4902]FFFF test word [Batch],-1 ; are we done with the batch file? + 11741 000006CF 7439 jz short RDBAT ; no, go read batch file + 11742 + 11743 ;cmp al,'@' + 11744 000006D1 3C40 cmp al,No_Echo_Char ; see if user wants to suppress line + 11745 000006D3 7507 jne short SET_BAT_POS ; no - go and set batch file position + 11746 ;mov byte [Suppress],0 + 11747 000006D5 C606[9E02]00 mov byte [Suppress],NO_ECHO ; yes set flag to indicate + 11748 000006DA EB2E jmp short RDBAT ; go read batch file + 11749 ;nop + 11750 SET_BAT_POS: + 11751 000006DC 1E push ds + 11752 000006DD 8E1E[4902] mov ds,[Batch] + 11753 ;mov [8],dx + 11754 000006E1 89160800 mov [BATCHSEGMENT.BatSeek],dx ; reseek back to beginning + 11755 ;mov [10],cx + 11756 000006E5 890E0A00 mov [BATCHSEGMENT.BatSeek+2],cx + 11757 000006E9 1F pop ds + 11758 ;;mov ax,(LSEEK SHL 8) + 0 + 11759 ; 05/02/2023 + 11760 000006EA B80042 mov ax,4200h + 11761 ;mov ax,(LSEEK*256) ; 4200h ; seek back + 11762 + 11763 ; 25/07/2024 + 11764 ; PCDOS 7.1 COMMAND.COM + 11765 %if 0 + 11766 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 11767 ; AL = method: offset from beginning of file + 11768 %else + 11769 000006ED E8CAFE call int_21h_indirect + 11770 %endif + 11771 ;mov word [cs:BATBUFPOS],0FFFFh + 11772 ; 24/04/2023 + 11773 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:05E3h + 11774 000006F0 26C706[C7A5]FFFF mov word [es:BATBUFPOS],-1; 0FFFFh + 11775 ;mov word [cs:BATBUFPOS],-1 ; nuke batch buffer position + 11776 000006F7 31C9 xor cx,cx ; Initialize line length to zero + 11777 000006F9 EB0F jmp short RDBAT + 11778 + 11779 ;nop 11780 - 11781 NOPLINE: - 11782 000006FB E80501 call SKIPTOEOL - 11783 000006FE E87E03 call GETBATBYT ; eat trailing LF - 11784 ;test word [Batch],0FFFFh - 11785 00000701 F706[4902]FFFF test word [Batch],-1 ; are we done with the batch file? - 11786 00000707 75A7 jnz short TESTNOP ; no, go get another line - 11787 READBAT_RETN: ; Hit EOF - 11788 00000709 C3 retn - 11789 - 11790 ; --------------------------------------------------------------------------- - 11791 - 11792 ; Read a line into the buffer pointed to by ES:DI. If any %s are seen in the - 11793 ; input, we are to consider two special cases: - 11794 ; - 11795 ; %0 to %9 These represent replaceable parameters from the batch segment - 11796 ; %sym% This is a symbol from the environment - 11797 - 11798 RDBAT: - 11799 0000070A E87203 call GETBATBYT - 11800 0000070D 41 inc cx ; Inc the line length - 11801 - 11802 ; 05/02/2023 - 11803 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0601h - 11804 0000070E E85020 call testkanj - 11805 00000711 740C jz short RDBAT1 - 11806 ;cmp cx,127 - 11807 00000713 83F97F cmp cx,COMBUFLEN-1 - 11808 00000716 7350 jnb short TOOLONG - 11809 00000718 AA stosb - 11810 00000719 E86303 call GETBATBYT - 11811 0000071C 41 inc cx - 11812 0000071D EB0A jmp short SAVBATBYT - 11813 RDBAT1: - 11814 0000071F 81F98000 cmp cx,COMBUFLEN ; 128 ; Is it too long? - 11815 00000723 7343 jnb short TOOLONG ; Yes - handle it, handle it - 11816 - 11817 ; See if we have a parameter character. - 11818 - 11819 00000725 3C25 cmp al,'%' ; Check for parameter - 11820 00000727 7449 je short NEEDPARM + 11781 ; The first non-delimiter is a :. This line is not echoed and is ignored. + 11782 ; We eat characters until a CR is seen. + 11783 + 11784 NOPLINE: + 11785 000006FB E80501 call SKIPTOEOL + 11786 000006FE E87E03 call GETBATBYT ; eat trailing LF + 11787 ;test word [Batch],0FFFFh + 11788 00000701 F706[4902]FFFF test word [Batch],-1 ; are we done with the batch file? + 11789 00000707 75A7 jnz short TESTNOP ; no, go get another line + 11790 READBAT_RETN: ; Hit EOF + 11791 00000709 C3 retn + 11792 + 11793 ; --------------------------------------------------------------------------- + 11794 + 11795 ; Read a line into the buffer pointed to by ES:DI. If any %s are seen in the + 11796 ; input, we are to consider two special cases: + 11797 ; + 11798 ; %0 to %9 These represent replaceable parameters from the batch segment + 11799 ; %sym% This is a symbol from the environment + 11800 + 11801 RDBAT: + 11802 0000070A E87203 call GETBATBYT + 11803 0000070D 41 inc cx ; Inc the line length + 11804 + 11805 ; 05/02/2023 + 11806 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0601h + 11807 0000070E E85020 call testkanj + 11808 00000711 740C jz short RDBAT1 + 11809 ;cmp cx,127 + 11810 00000713 83F97F cmp cx,COMBUFLEN-1 + 11811 00000716 7350 jnb short TOOLONG + 11812 00000718 AA stosb + 11813 00000719 E86303 call GETBATBYT + 11814 0000071C 41 inc cx + 11815 0000071D EB0A jmp short SAVBATBYT + 11816 RDBAT1: + 11817 0000071F 81F98000 cmp cx,COMBUFLEN ; 128 ; Is it too long? + 11818 00000723 7343 jnb short TOOLONG ; Yes - handle it, handle it + 11819 + 11820 ; See if we have a parameter character. 11821 - 11822 ; no parameter character. Store it as usual and see if we are done. - 11823 - 11824 SAVBATBYT: - 11825 00000729 AA stosb ; End of line found? - 11826 0000072A 3C0D cmp al,0Dh - 11827 0000072C 75DC jne short RDBAT ; no, go for more - 11828 - 11829 ; We have read in an entire line. - 11830 ; Decide whether we should echo the command line or not. + 11822 00000725 3C25 cmp al,'%' ; Check for parameter + 11823 00000727 7449 je short NEEDPARM + 11824 + 11825 ; no parameter character. Store it as usual and see if we are done. + 11826 + 11827 SAVBATBYT: + 11828 00000729 AA stosb ; End of line found? + 11829 0000072A 3C0D cmp al,0Dh + 11830 0000072C 75DC jne short RDBAT ; no, go for more 11831 - 11832 FOUND_EOL: - 11833 0000072E 81EF[579A] sub di,COMBUF+3 - 11834 00000732 89F8 mov ax,di ; remember that we've not counted the CR - 11835 00000734 26A2[559A] mov [es:COMBUF+1],al - 11836 ; Set length of line - 11837 00000738 E84403 call GETBATBYT ; Eat linefeed - 11838 0000073B E8F206 call BATCLOSE - 11839 0000073E 803E[9E02]00 cmp byte [Suppress],NO_ECHO ; 0 - 11840 00000743 7407 jz short RESET - 11841 00000745 F606[9D02]01 test byte [EchoFlag],1 ; To echo or not to echo, that is the - 11842 0000074A 7504 jnz short TRY_NEXTFLAG ; question. (Profound, huh?) - 11843 RESET: - 11844 0000074C 0E push cs - 11845 0000074D 1F pop ds ; Go back to local segment - 11846 0000074E 74B9 jz short READBAT_RETN ; no echoing here... - 11847 TRY_NEXTFLAG: - 11848 00000750 803E[B402]01 cmp byte [NullFlag],nullcommand ; 1 - 11849 ;G was there a command last time? - 11850 00000755 7403 jz short NO_CRLF_PRINT - 11851 ;G no - don't print crlf - 11852 00000757 E81F22 call CRLF2 ;G Print out prompt - 11853 NO_CRLF_PRINT: - 11854 0000075A E89319 call PRINT_PROMPT - 11855 0000075D 0E push cs ;G change data segment - 11856 0000075E 1F pop ds - 11857 0000075F BA[569A] mov dx,COMBUF+2 ; get command line for echoing - 11858 00000762 E86D22 call CRPRINT - 11859 ;call CRLF2 - 11860 ;retn - 11861 ; 06/02/2023 - 11862 00000765 E91122 jmp CRLF2 - 11863 - 11864 ; The line was too long. Eat remainder of input text up until the CR - 11865 - 11866 TOOLONG: - 11867 00000768 3C0D cmp al,0Dh ; Has the end of the line been reached? - 11868 0000076A 7403 jz short LTLCONT ; Yes, continue - 11869 0000076C E89400 call SKIPTOEOL ; Eat remainder of line - 11870 LTLCONT: - 11871 0000076F AA stosb ; Terminate the command - 11872 00000770 EBBC jmp short FOUND_EOL ; Go process the valid part of the line - 11873 - 11874 ; We have found a parameter lead-in character. Check for the 0-9 case first - 11875 - 11876 NEEDPARM: - 11877 00000772 E80A03 call GETBATBYT ; get next character - 11878 00000775 3C25 cmp al,'%' ; Check for two consecutive % - 11879 00000777 74B0 je short SAVBATBYT ; if so, replace with a single % - 11880 00000779 3C0D cmp al,0Dh ; Check for end-of-line - 11881 0000077B 74AC je short SAVBATBYT ; yes, treat it normally - 11882 - 11883 ; We have found %. If the is in the range 0-9, we - 11884 ; retrieve the appropriate parameter from the batch segment. Otherwise we - 11885 ; see if the has a terminating % and then look up the contents - 11886 ; in the environment. - 11887 - 11888 PAROK: - 11889 0000077D 2C30 sub al,'0' - 11890 0000077F 7239 jb short NEEDENV ; look for parameter in the environment - 11891 00000781 3C09 cmp al,9 - 11892 00000783 7735 ja short NEEDENV - 11893 - 11894 ; We have found %. This is taken from the parameters in the - 11895 ; allocated batch area. + 11832 ; We have read in an entire line. + 11833 ; Decide whether we should echo the command line or not. + 11834 + 11835 FOUND_EOL: + 11836 0000072E 81EF[579A] sub di,COMBUF+3 + 11837 00000732 89F8 mov ax,di ; remember that we've not counted the CR + 11838 00000734 26A2[559A] mov [es:COMBUF+1],al + 11839 ; Set length of line + 11840 00000738 E84403 call GETBATBYT ; Eat linefeed + 11841 0000073B E8F206 call BATCLOSE + 11842 0000073E 803E[9E02]00 cmp byte [Suppress],NO_ECHO ; 0 + 11843 00000743 7407 jz short RESET + 11844 00000745 F606[9D02]01 test byte [EchoFlag],1 ; To echo or not to echo, that is the + 11845 0000074A 7504 jnz short TRY_NEXTFLAG ; question. (Profound, huh?) + 11846 RESET: + 11847 0000074C 0E push cs + 11848 0000074D 1F pop ds ; Go back to local segment + 11849 0000074E 74B9 jz short READBAT_RETN ; no echoing here... + 11850 TRY_NEXTFLAG: + 11851 00000750 803E[B402]01 cmp byte [NullFlag],nullcommand ; 1 + 11852 ;G was there a command last time? + 11853 00000755 7403 jz short NO_CRLF_PRINT + 11854 ;G no - don't print crlf + 11855 00000757 E81F22 call CRLF2 ;G Print out prompt + 11856 NO_CRLF_PRINT: + 11857 0000075A E89319 call PRINT_PROMPT + 11858 0000075D 0E push cs ;G change data segment + 11859 0000075E 1F pop ds + 11860 0000075F BA[569A] mov dx,COMBUF+2 ; get command line for echoing + 11861 00000762 E86D22 call CRPRINT + 11862 ;call CRLF2 + 11863 ;retn + 11864 ; 06/02/2023 + 11865 00000765 E91122 jmp CRLF2 + 11866 + 11867 ; The line was too long. Eat remainder of input text up until the CR + 11868 + 11869 TOOLONG: + 11870 00000768 3C0D cmp al,0Dh ; Has the end of the line been reached? + 11871 0000076A 7403 jz short LTLCONT ; Yes, continue + 11872 0000076C E89400 call SKIPTOEOL ; Eat remainder of line + 11873 LTLCONT: + 11874 0000076F AA stosb ; Terminate the command + 11875 00000770 EBBC jmp short FOUND_EOL ; Go process the valid part of the line + 11876 + 11877 ; We have found a parameter lead-in character. Check for the 0-9 case first + 11878 + 11879 NEEDPARM: + 11880 00000772 E80A03 call GETBATBYT ; get next character + 11881 00000775 3C25 cmp al,'%' ; Check for two consecutive % + 11882 00000777 74B0 je short SAVBATBYT ; if so, replace with a single % + 11883 00000779 3C0D cmp al,0Dh ; Check for end-of-line + 11884 0000077B 74AC je short SAVBATBYT ; yes, treat it normally + 11885 + 11886 ; We have found %. If the is in the range 0-9, we + 11887 ; retrieve the appropriate parameter from the batch segment. Otherwise we + 11888 ; see if the has a terminating % and then look up the contents + 11889 ; in the environment. + 11890 + 11891 PAROK: + 11892 0000077D 2C30 sub al,'0' + 11893 0000077F 7239 jb short NEEDENV ; look for parameter in the environment + 11894 00000781 3C09 cmp al,9 + 11895 00000783 7735 ja short NEEDENV 11896 - 11897 00000785 98 cbw - 11898 00000786 89C3 mov bx,ax ; move index into AX - 11899 00000788 D1E3 shl bx,1 ; convert word index into byte ptr - 11900 0000078A 06 push es - 11901 0000078B 8E06[4902] mov es,[Batch] - 11902 - 11903 ; The structure of the batch area is: - 11904 ; - 11905 ; BYTE type of segment - 11906 ; DWORD offset for next line - 11907 ; 10 WORD pointers to parameters. -1 is empty parameter - 11908 ; ASCIZ file name (with . and ..) - 11909 ; BYTES CR-terminated parameters - 11910 ; BYTE 0 flag to indicate end of parameters - 11911 ; - 11912 ; Get pointer to BX'th argument - 11913 - 11914 ;;mov si,[es:bx+0Bh] - 11915 ; 05/02/2023 - 11916 ;mov si,[es:bx+0Ch] ; MSDOS 5.0 COMMAND.COM - 11917 0000078F 268B770C mov si,[es:bx+BATCHSEGMENT.BatParm] - 11918 00000793 07 pop es - 11919 - 11920 ; Is there a parameter here? - 11921 - 11922 00000794 83FEFF cmp si,-1 ; Check if parameter exists - 11923 00000797 7503 jnz short YES_THERE_IS ; Yes go get it - 11924 00000799 E96EFF jmp RDBAT ; Ignore if it doesn't - 11925 - 11926 ; Copy in the found parameter from batch segment - 11927 - 11928 YES_THERE_IS: - 11929 0000079C 1E push ds - 11930 0000079D 8E1E[4902] mov ds,[Batch] - 11931 000007A1 49 dec cx ; Don't count '%' in line length - 11932 COPYPARM: - 11933 000007A2 AC lodsb ; From resident segment - 11934 000007A3 3C0D cmp al,0Dh ; Check for end of parameter - 11935 000007A5 740F je short ENDPARAM - 11936 000007A7 41 inc cx ; Inc the line length - 11937 000007A8 81F98000 cmp cx,COMBUFLEN ; 128 ; Is it too long? - 11938 000007AC 7303 jnb short LINETOOL ; Yes - handle it, handle it - 11939 000007AE AA stosb - 11940 000007AF EBF1 jmp short COPYPARM - 11941 - 11942 ; We have copied up to the limit. Stop copying and eat remainder of batch - 11943 ; line. We need to make sure that the tooLong code isn't fooled into - 11944 ; believing that we are at EOL. Clobber AL too. - 11945 - 11946 LINETOOL: - 11947 000007B1 30C0 xor al,al - 11948 000007B3 1F pop ds - 11949 000007B4 EBB2 jmp short TOOLONG - 11950 - 11951 ; We have copied in an entire parameter. Go back for more - 11952 - 11953 ENDPARAM: - 11954 000007B6 1F pop ds - 11955 000007B7 E950FF jmp RDBAT - 11956 - 11957 ; We have found % followed by something other than 0-9. We presume that there - 11958 ; will be a following % character. In between is an environment variable that - 11959 ; we will fetch and replace in the batch line with its value. - 11960 - 11961 NEEDENV: - 11962 ; MSDOS 6.0 COMMAND.COM - 11963 ; 05/02/2023 - 11964 000007BA 49 dec cx ;AN070; Don't count "%" - 11965 - 11966 ; MSDOS 3.3 (& MSDOS 6.0) - 11967 000007BB 1E push ds - 11968 000007BC 57 push di - 11969 ; temp spot for name - 11970 000007BD BF[BB9C] mov di,ID - 11971 000007C0 0430 add al,'0' ; reconvert character - 11972 000007C2 AA stosb ; store it in appropriate place - 11973 - 11974 ; loop getting characters until the next % is found or until EOL - 11975 - 11976 GETENV1: - 11977 000007C3 E8B902 call GETBATBYT ; get the byte - 11978 000007C6 AA stosb ; store it - 11979 000007C7 3C0D cmp al,0Dh ; EOL? - 11980 000007C9 7514 jne short GETENV15 ; no, see if it the term char - 11981 - 11982 ; The user entered a string with a % but no trailing %. We copy the string. - 11983 - 11984 000007CB 26C645FF00 mov byte [es:di-1],0 ; nul terminate the string - 11985 000007D0 BE[BB9C] mov si,ID ; point to buffer - 11986 000007D3 5F pop di ; point to line buffer - 11987 000007D4 0E push cs - 11988 000007D5 1F pop ds - 11989 000007D6 E89302 call STRCPY - 11990 ; 05/02/2023 - 11991 000007D9 72D6 jc short LINETOOL ; MSDOS 6.0 COMMAND.COM - 11992 ; 24/04/2023 - 11993 ;dec di ; MSDOS 3.3 COMMAND.COM - 11994 000007DB 1F pop ds - 11995 000007DC E94AFF jmp SAVBATBYT - 11996 GETENV15: - 11997 000007DF 3C25 cmp al,'%' ; terminating %? - 11998 000007E1 75E0 jne short GETENV1 ; no, go suck out more characters - 11999 - 12000 ; M017 - following DEC is wrong, because we replace the % with a = here. - 12001 ; This was the source of bug #1. - 12002 ; dec cx ;AN070; Don't count "%" - 12003 - 12004 000007E3 B03D mov al,'=' ; terminate with = - 12005 000007E5 268845FF mov [es:di-1],al + 11897 ; We have found %. This is taken from the parameters in the + 11898 ; allocated batch area. + 11899 + 11900 00000785 98 cbw + 11901 00000786 89C3 mov bx,ax ; move index into AX + 11902 00000788 D1E3 shl bx,1 ; convert word index into byte ptr + 11903 0000078A 06 push es + 11904 0000078B 8E06[4902] mov es,[Batch] + 11905 + 11906 ; The structure of the batch area is: + 11907 ; + 11908 ; BYTE type of segment + 11909 ; DWORD offset for next line + 11910 ; 10 WORD pointers to parameters. -1 is empty parameter + 11911 ; ASCIZ file name (with . and ..) + 11912 ; BYTES CR-terminated parameters + 11913 ; BYTE 0 flag to indicate end of parameters + 11914 ; + 11915 ; Get pointer to BX'th argument + 11916 + 11917 ;;mov si,[es:bx+0Bh] + 11918 ; 05/02/2023 + 11919 ;mov si,[es:bx+0Ch] ; MSDOS 5.0 COMMAND.COM + 11920 0000078F 268B770C mov si,[es:bx+BATCHSEGMENT.BatParm] + 11921 00000793 07 pop es + 11922 + 11923 ; Is there a parameter here? + 11924 + 11925 00000794 83FEFF cmp si,-1 ; Check if parameter exists + 11926 00000797 7503 jnz short YES_THERE_IS ; Yes go get it + 11927 00000799 E96EFF jmp RDBAT ; Ignore if it doesn't + 11928 + 11929 ; Copy in the found parameter from batch segment + 11930 + 11931 YES_THERE_IS: + 11932 0000079C 1E push ds + 11933 0000079D 8E1E[4902] mov ds,[Batch] + 11934 000007A1 49 dec cx ; Don't count '%' in line length + 11935 COPYPARM: + 11936 000007A2 AC lodsb ; From resident segment + 11937 000007A3 3C0D cmp al,0Dh ; Check for end of parameter + 11938 000007A5 740F je short ENDPARAM + 11939 000007A7 41 inc cx ; Inc the line length + 11940 000007A8 81F98000 cmp cx,COMBUFLEN ; 128 ; Is it too long? + 11941 000007AC 7303 jnb short LINETOOL ; Yes - handle it, handle it + 11942 000007AE AA stosb + 11943 000007AF EBF1 jmp short COPYPARM + 11944 + 11945 ; We have copied up to the limit. Stop copying and eat remainder of batch + 11946 ; line. We need to make sure that the tooLong code isn't fooled into + 11947 ; believing that we are at EOL. Clobber AL too. + 11948 + 11949 LINETOOL: + 11950 000007B1 30C0 xor al,al + 11951 000007B3 1F pop ds + 11952 000007B4 EBB2 jmp short TOOLONG + 11953 + 11954 ; We have copied in an entire parameter. Go back for more + 11955 + 11956 ENDPARAM: + 11957 000007B6 1F pop ds + 11958 000007B7 E950FF jmp RDBAT + 11959 + 11960 ; We have found % followed by something other than 0-9. We presume that there + 11961 ; will be a following % character. In between is an environment variable that + 11962 ; we will fetch and replace in the batch line with its value. + 11963 + 11964 NEEDENV: + 11965 ; MSDOS 6.0 COMMAND.COM + 11966 ; 05/02/2023 + 11967 000007BA 49 dec cx ;AN070; Don't count "%" + 11968 + 11969 ; MSDOS 3.3 (& MSDOS 6.0) + 11970 000007BB 1E push ds + 11971 000007BC 57 push di + 11972 ; temp spot for name + 11973 000007BD BF[BB9C] mov di,ID + 11974 000007C0 0430 add al,'0' ; reconvert character + 11975 000007C2 AA stosb ; store it in appropriate place + 11976 + 11977 ; loop getting characters until the next % is found or until EOL + 11978 + 11979 GETENV1: + 11980 000007C3 E8B902 call GETBATBYT ; get the byte + 11981 000007C6 AA stosb ; store it + 11982 000007C7 3C0D cmp al,0Dh ; EOL? + 11983 000007C9 7514 jne short GETENV15 ; no, see if it the term char + 11984 + 11985 ; The user entered a string with a % but no trailing %. We copy the string. + 11986 + 11987 000007CB 26C645FF00 mov byte [es:di-1],0 ; nul terminate the string + 11988 000007D0 BE[BB9C] mov si,ID ; point to buffer + 11989 000007D3 5F pop di ; point to line buffer + 11990 000007D4 0E push cs + 11991 000007D5 1F pop ds + 11992 000007D6 E89302 call STRCPY + 11993 ; 05/02/2023 + 11994 000007D9 72D6 jc short LINETOOL ; MSDOS 6.0 COMMAND.COM + 11995 ; 24/04/2023 + 11996 ;dec di ; MSDOS 3.3 COMMAND.COM + 11997 000007DB 1F pop ds + 11998 000007DC E94AFF jmp SAVBATBYT + 11999 GETENV15: + 12000 000007DF 3C25 cmp al,'%' ; terminating %? + 12001 000007E1 75E0 jne short GETENV1 ; no, go suck out more characters + 12002 + 12003 ; M017 - following DEC is wrong, because we replace the % with a = here. + 12004 ; This was the source of bug #1. + 12005 ; dec cx ;AN070; Don't count "%" 12006 - 12007 ; ID now either has a =-terminated string which we are to find in the - 12008 ; environment or a non =-terminated string which will not be found in the - 12009 ; environment. - 12010 - 12011 GETENV2: - 12012 000007E9 BE[BB9C] mov si,ID - 12013 000007EC 0E push cs - 12014 000007ED 1F pop ds ; DS:SI points to name - 12015 000007EE 51 push cx - 12016 000007EF E8C51E call find_name_in_environment - 12017 000007F2 59 pop cx - 12018 000007F3 06 push es - 12019 000007F4 1F pop ds - 12020 000007F5 0E push cs - 12021 000007F6 07 pop es - 12022 000007F7 89FE mov si,di - 12023 000007F9 5F pop di ; get back pointer to command line - 12024 - 12025 ; If the parameter was not found, there is no need to perform any replacement. - 12026 ; We merely pretend that we've copied the parameter. + 12007 000007E3 B03D mov al,'=' ; terminate with = + 12008 000007E5 268845FF mov [es:di-1],al + 12009 + 12010 ; ID now either has a =-terminated string which we are to find in the + 12011 ; environment or a non =-terminated string which will not be found in the + 12012 ; environment. + 12013 + 12014 GETENV2: + 12015 000007E9 BE[BB9C] mov si,ID + 12016 000007EC 0E push cs + 12017 000007ED 1F pop ds ; DS:SI points to name + 12018 000007EE 51 push cx + 12019 000007EF E8C51E call find_name_in_environment + 12020 000007F2 59 pop cx + 12021 000007F3 06 push es + 12022 000007F4 1F pop ds + 12023 000007F5 0E push cs + 12024 000007F6 07 pop es + 12025 000007F7 89FE mov si,di + 12026 000007F9 5F pop di ; get back pointer to command line 12027 - 12028 000007FA 7203 jc short GETENV6 - 12029 - 12030 ; ES:DI points to command line being built - 12031 ; DS:SI points either to nul-terminated environment object AFTER = + 12028 ; If the parameter was not found, there is no need to perform any replacement. + 12029 ; We merely pretend that we've copied the parameter. + 12030 + 12031 000007FA 7203 jc short GETENV6 12032 - 12033 000007FC E86D02 call STRCPY ; (let RdBat handle overflow) - 12034 ; 24/04/2022 - 12035 ;dec di ; MSDOS 3.3 COMMAND.COM - 12036 GETENV6: - 12037 000007FF 1F pop ds - 12038 00000800 E907FF jmp RDBAT ; go back to batch file - 12039 - 12040 ; =============== S U B R O U T I N E ======================================= - 12041 - 12042 ; SkipToEOL - read from batch file until end of line - 12043 - 12044 ; 06/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12045 SKIPTOEOL: - 12046 00000803 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh - 12047 ;jnz short SKIPTOEOL1 - 12048 ;retn ; no batch file in effect - 12049 - 12050 00000809 7407 jz short SKIPTOEOL2 ; Retro DOS v3.0 COMMAND.COM - 12051 SKIPTOEOL1: - 12052 0000080B E87102 call GETBATBYT - 12053 0000080E 3C0D cmp al,0Dh ; eol character? - 12054 00000810 75F1 jnz short SKIPTOEOL ; no, go eat another - 12055 SKIPTOEOL2: - 12056 00000812 C3 retn - 12057 - 12058 ; =============== S U B R O U T I N E ======================================= - 12059 - 12060 ;Break - 12061 - 12062 ; Free Transient. Modify ES,AX,flags - 12063 - 12064 ; 06/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12065 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0708h + 12033 ; ES:DI points to command line being built + 12034 ; DS:SI points either to nul-terminated environment object AFTER = + 12035 + 12036 000007FC E86D02 call STRCPY ; (let RdBat handle overflow) + 12037 ; 24/04/2022 + 12038 ;dec di ; MSDOS 3.3 COMMAND.COM + 12039 GETENV6: + 12040 000007FF 1F pop ds + 12041 00000800 E907FF jmp RDBAT ; go back to batch file + 12042 + 12043 ; =============== S U B R O U T I N E ======================================= + 12044 + 12045 ; SkipToEOL - read from batch file until end of line + 12046 + 12047 ; 06/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12048 SKIPTOEOL: + 12049 00000803 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh + 12050 ;jnz short SKIPTOEOL1 + 12051 ;retn ; no batch file in effect + 12052 + 12053 00000809 7407 jz short SKIPTOEOL2 ; Retro DOS v3.0 COMMAND.COM + 12054 SKIPTOEOL1: + 12055 0000080B E87102 call GETBATBYT + 12056 0000080E 3C0D cmp al,0Dh ; eol character? + 12057 00000810 75F1 jnz short SKIPTOEOL ; no, go eat another + 12058 SKIPTOEOL2: + 12059 00000812 C3 retn + 12060 + 12061 ; =============== S U B R O U T I N E ======================================= + 12062 + 12063 ;Break + 12064 + 12065 ; Free Transient. Modify ES,AX,flags 12066 - 12067 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 12068 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:081Eh - 12069 FREE_TPA: - 12070 00000813 06 push es - 12071 00000814 8E06[F59B] mov es,[RESSEG] - 12072 00000818 268E06[5804] mov es,[es:Res_Tpa] - 12073 0000081D B449 mov ah,49h - 12074 ;mov ah,DEALLOC ; 49h - 12075 - 12076 ; 25/07/2024 - 12077 ; PCDOS 7.1 COMMAND.COM - 12078 %if 0 - 12079 int 21h ; DOS - 2+ - FREE MEMORY - 12080 ; ES = segment address of area to be freed - 12081 %else - 12082 0000081F E898FD call int_21h_indirect - 12083 %endif - 12084 - 12085 00000822 07 pop es - 12086 00000823 C3 retn + 12067 ; 06/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12068 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0708h + 12069 + 12070 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 12071 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:081Eh + 12072 FREE_TPA: + 12073 00000813 06 push es + 12074 00000814 8E06[F59B] mov es,[RESSEG] + 12075 00000818 268E06[5804] mov es,[es:Res_Tpa] + 12076 0000081D B449 mov ah,49h + 12077 ;mov ah,DEALLOC ; 49h + 12078 + 12079 ; 25/07/2024 + 12080 ; PCDOS 7.1 COMMAND.COM + 12081 %if 0 + 12082 int 21h ; DOS - 2+ - FREE MEMORY + 12083 ; ES = segment address of area to be freed + 12084 %else + 12085 0000081F E898FD call int_21h_indirect + 12086 %endif 12087 - 12088 ; =============== S U B R O U T I N E ======================================= - 12089 - 12090 ; Allocate transient. Modify AX,BX,DX,flags - 12091 - 12092 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM - 12093 ; 06/02/2023 - 12094 ALLOC_TPA: - 12095 00000824 06 push es - 12096 00000825 8E06[F59B] mov es,[RESSEG] - 12097 00000829 BBFFFF mov bx,0FFFFh ; Re-allocate the transient - 12098 0000082C B448 mov ah,48h - 12099 ;mov ah,ALLOC ; 48h - 12100 - 12101 ; 25/07/2024 - 12102 ; PCDOS 7.1 COMMAND.COM - 12103 %if 0 - 12104 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 12105 ; BX = number of 16-byte paragraphs desired - 12106 %else - 12107 0000082E E889FD call int_21h_indirect - 12108 %endif - 12109 - 12110 00000831 53 push bx ; Save size of block - 12111 00000832 B448 mov ah,48h - 12112 ;mov ah,ALLOC ; 48h - 12113 - 12114 ; 25/07/2024 - 12115 ; PCDOS 7.1 COMMAND.COM - 12116 %if 0 - 12117 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 12118 ; BX = number of 16-byte paragraphs desired - 12119 %else - 12120 00000834 E883FD call int_21h_indirect - 12121 %endif - 12122 - 12123 ; Attempt to align TPA on 64K boundary - 12124 - 12125 00000837 5B pop bx ; Restore size of block - 12126 00000838 26A3[5804] mov [es:Res_Tpa],ax - 12127 ; Save segment to beginning of block - 12128 0000083C A3[039C] mov [TRAN_TPA],ax - 12129 - 12130 ; Is the segment already aligned on a 64K boundary - 12131 - 12132 0000083F 89C2 mov dx,ax ; Save segment - 12133 00000841 25FF0F and ax,0FFFh ; Test if above boundary - 12134 00000844 7507 jnz short CALC_TPA - 12135 00000846 89D0 mov ax,dx - 12136 00000848 2500F0 and ax,0F000h ; Test if multiple of 64K - 12137 0000084B 7523 jnz short NOROUND - 12138 CALC_TPA: - 12139 0000084D 89D0 mov ax,dx - 12140 0000084F 2500F0 and ax,0F000h - 12141 00000852 050010 add ax,1000h ; Round up to next 64K boundary - 12142 00000855 7219 jc short NOROUND ; Memory wrap if carry set - 12143 - 12144 ; Make sure that new boundary is within allocated range - 12145 - 12146 00000857 268B16[5804] mov dx,[es:Res_Tpa] - 12147 0000085C 01DA add dx,bx ; Compute maximum address - 12148 0000085E 39C2 cmp dx,ax ; Is 64K address out of range? - 12149 00000860 720E jb short NOROUND - 12150 - 12151 ; Make sure that we won't overwrite the transient - 12152 - 12153 00000862 8CCB mov bx,cs ; CS is beginning of transient - 12154 00000864 39C3 cmp bx,ax - 12155 00000866 7208 jb short NOROUND - 12156 - 12157 ; The area from the 64K boundary to the beginning of the transient must - 12158 ; be at least 64K. + 12088 00000822 07 pop es + 12089 00000823 C3 retn + 12090 + 12091 ; =============== S U B R O U T I N E ======================================= + 12092 + 12093 ; Allocate transient. Modify AX,BX,DX,flags + 12094 + 12095 ; 25/07/2024 - Retro DOS v5.0 COMMAND.COM + 12096 ; 06/02/2023 + 12097 ALLOC_TPA: + 12098 00000824 06 push es + 12099 00000825 8E06[F59B] mov es,[RESSEG] + 12100 00000829 BBFFFF mov bx,0FFFFh ; Re-allocate the transient + 12101 0000082C B448 mov ah,48h + 12102 ;mov ah,ALLOC ; 48h + 12103 + 12104 ; 25/07/2024 + 12105 ; PCDOS 7.1 COMMAND.COM + 12106 %if 0 + 12107 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 12108 ; BX = number of 16-byte paragraphs desired + 12109 %else + 12110 0000082E E889FD call int_21h_indirect + 12111 %endif + 12112 + 12113 00000831 53 push bx ; Save size of block + 12114 00000832 B448 mov ah,48h + 12115 ;mov ah,ALLOC ; 48h + 12116 + 12117 ; 25/07/2024 + 12118 ; PCDOS 7.1 COMMAND.COM + 12119 %if 0 + 12120 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 12121 ; BX = number of 16-byte paragraphs desired + 12122 %else + 12123 00000834 E883FD call int_21h_indirect + 12124 %endif + 12125 + 12126 ; Attempt to align TPA on 64K boundary + 12127 + 12128 00000837 5B pop bx ; Restore size of block + 12129 00000838 26A3[5804] mov [es:Res_Tpa],ax + 12130 ; Save segment to beginning of block + 12131 0000083C A3[039C] mov [TRAN_TPA],ax + 12132 + 12133 ; Is the segment already aligned on a 64K boundary + 12134 + 12135 0000083F 89C2 mov dx,ax ; Save segment + 12136 00000841 25FF0F and ax,0FFFh ; Test if above boundary + 12137 00000844 7507 jnz short CALC_TPA + 12138 00000846 89D0 mov ax,dx + 12139 00000848 2500F0 and ax,0F000h ; Test if multiple of 64K + 12140 0000084B 7523 jnz short NOROUND + 12141 CALC_TPA: + 12142 0000084D 89D0 mov ax,dx + 12143 0000084F 2500F0 and ax,0F000h + 12144 00000852 050010 add ax,1000h ; Round up to next 64K boundary + 12145 00000855 7219 jc short NOROUND ; Memory wrap if carry set + 12146 + 12147 ; Make sure that new boundary is within allocated range + 12148 + 12149 00000857 268B16[5804] mov dx,[es:Res_Tpa] + 12150 0000085C 01DA add dx,bx ; Compute maximum address + 12151 0000085E 39C2 cmp dx,ax ; Is 64K address out of range? + 12152 00000860 720E jb short NOROUND + 12153 + 12154 ; Make sure that we won't overwrite the transient + 12155 + 12156 00000862 8CCB mov bx,cs ; CS is beginning of transient + 12157 00000864 39C3 cmp bx,ax + 12158 00000866 7208 jb short NOROUND 12159 - 12160 00000868 29C3 sub bx,ax - 12161 ;cmp bx,4096 - 12162 0000086A 81FB0010 cmp bx,1000h ; Size greater than 64K? - 12163 0000086E 7304 jnb short ROUNDDONE - 12164 NOROUND: - 12165 00000870 26A1[5804] mov ax,[es:Res_Tpa] - 12166 ROUNDDONE: - 12167 00000874 26A3[4C04] mov [es:LTpa],ax ; Re-compute everything - 12168 00000878 A3[F79B] mov [TPA],ax - 12169 0000087B 89C3 mov bx,ax - 12170 0000087D 8CC8 mov ax,cs - 12171 0000087F 29D8 sub ax,bx - 12172 00000881 53 push bx - 12173 00000882 BB1000 mov bx,16 - 12174 00000885 F7E3 mul bx - 12175 00000887 5B pop bx - 12176 00000888 09D2 or dx,dx - 12177 0000088A 7403 jz short SAVSIZ2 - 12178 0000088C B8FFFF mov ax,-1 - 12179 SAVSIZ2: - 12180 - 12181 ; AX is the number of bytes free in the buffer between the resident and the - 12182 ; transient with a maximum of 64K-1. We round this down to a multiple of 512. + 12160 ; The area from the 64K boundary to the beginning of the transient must + 12161 ; be at least 64K. + 12162 + 12163 00000868 29C3 sub bx,ax + 12164 ;cmp bx,4096 + 12165 0000086A 81FB0010 cmp bx,1000h ; Size greater than 64K? + 12166 0000086E 7304 jnb short ROUNDDONE + 12167 NOROUND: + 12168 00000870 26A1[5804] mov ax,[es:Res_Tpa] + 12169 ROUNDDONE: + 12170 00000874 26A3[4C04] mov [es:LTpa],ax ; Re-compute everything + 12171 00000878 A3[F79B] mov [TPA],ax + 12172 0000087B 89C3 mov bx,ax + 12173 0000087D 8CC8 mov ax,cs + 12174 0000087F 29D8 sub ax,bx + 12175 00000881 53 push bx + 12176 00000882 BB1000 mov bx,16 + 12177 00000885 F7E3 mul bx + 12178 00000887 5B pop bx + 12179 00000888 09D2 or dx,dx + 12180 0000088A 7403 jz short SAVSIZ2 + 12181 0000088C B8FFFF mov ax,-1 + 12182 SAVSIZ2: 12183 - 12184 0000088F 3D0002 cmp ax,512 - 12185 00000892 7603 jbe short GOTSIZE2 - 12186 ;and ax,~1FFh - 12187 00000894 2500FE and ax,0FE00h ; NOT 511 = NOT 1FFh - 12188 GOTSIZE2: - 12189 00000897 A3[159C] mov [BYTCNT],ax - 12190 0000089A 07 pop es - 12191 0000089B C3 retn - 12192 - 12193 ; =============== S U B R O U T I N E ======================================= - 12194 - 12195 ;Break - 12196 - 12197 ; The exec search has determined that the user has requested a batch file for - 12198 ; execution. We parse the arguments, create the batch segment, and signal - 12199 ; batch processing. - 12200 - 12201 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12202 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:078Eh + 12184 ; AX is the number of bytes free in the buffer between the resident and the + 12185 ; transient with a maximum of 64K-1. We round this down to a multiple of 512. + 12186 + 12187 0000088F 3D0002 cmp ax,512 + 12188 00000892 7603 jbe short GOTSIZE2 + 12189 ;and ax,~1FFh + 12190 00000894 2500FE and ax,0FE00h ; NOT 511 = NOT 1FFh + 12191 GOTSIZE2: + 12192 00000897 A3[159C] mov [BYTCNT],ax + 12193 0000089A 07 pop es + 12194 0000089B C3 retn + 12195 + 12196 ; =============== S U B R O U T I N E ======================================= + 12197 + 12198 ;Break + 12199 + 12200 ; The exec search has determined that the user has requested a batch file for + 12201 ; execution. We parse the arguments, create the batch segment, and signal + 12202 ; batch processing. 12203 - 12204 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 12205 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0868h + 12204 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12205 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:078Eh 12206 - 12207 ; 18/07/2024 - Retro DOS 5.0 COMMAND.COM - 12208 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:08A7h + 12207 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 12208 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0868h 12209 - 12210 BATCOM: - 12211 - 12212 ;ASSUME DS:TRANGROUP, ES:NOTHING - 12213 - 12214 ; Batch parameters are read with ES set to segment of resident part - 12215 - 12216 ; MSDOS 6.0 - 12217 0000089C 8E06[F59B] mov es,[RESSEG] - 12218 ;ASSUME ES:RESGROUP - 12219 ;cmp byte [es:Call_Batch_Flag],1 - 12220 000008A0 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress - 12221 ;AN043; If in CALL, - 12222 000008A6 7403 jz short skip_ioset ;AN043; redirection was already set up - 12223 ;invoke IOSET ; Set up any redirection - 12224 000008A8 E80527 call IOSET - 12225 skip_ioset: ;AN043; - 12226 000008AB E865FF call FREE_TPA ; G - 12227 ;cmp byte [es:Call_Batch_Flag],1 - 12228 000008AE 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress - 12229 000008B4 7403 jz short GETECHO ; G if we're in a call, don't execute - 12230 - 12231 ; 12/02/2023 - 12232 ; MSDOS 3.3 - 12233 ;call IOSET - 12234 ;mov es,[RESSEG] - 12235 ;call FREE_TPA - 12236 ;;cmp byte [es:CALL_BATCH_FLAG],1 - 12237 ;cmp byte [es:CALL_BATCH_FLAG],call_in_progress - 12238 ;jz short GETECHO ; G if we're in a call, don't execute - 12239 - 12240 ; MSDOS 3.3 (& MSDOS 6.0) - 12241 - 12242 ; Since BATCH has lower precedence than PIPE or FOR. If a new BATCH file is - 12243 ; being started it MUST be true that no FOR or PIPE is currently in progress. - 12244 ; Don't execute if in call - 12245 - 12246 000008B6 E8A008 call FOROFF - 12247 GETECHO: - 12248 000008B9 E8EB2A call PipeOff - 12249 000008BC 26A0[9D02] mov al,[es:EchoFlag] ; preserve echo state for chaining - 12250 000008C0 2401 and al,1 ; Save current echo state - 12251 - 12252 000008C2 50 push ax - 12253 000008C3 31C0 xor ax,ax - 12254 000008C5 26F706[4902]FFFF test word [es:Batch],-1 ; Are we in a batch file? - 12255 000008CC 7414 jz short LEAVEBAT ; No, nothing to save - 12256 000008CE 26A1[4902] mov ax,[es:Batch] ; Get current batch segment - 12257 ;cmp byte [es:Call_Batch_Flag],1 - 12258 000008D2 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress - 12259 000008D8 7408 jz short LEAVEBAT - 12260 - 12261 ; We are in a chained batch file, save batlast from previous batch segment - 12262 ; so that if we're in a CALL, we will return to the correct batch file. + 12210 ; 18/07/2024 - Retro DOS 5.0 COMMAND.COM + 12211 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:08A7h + 12212 + 12213 BATCOM: + 12214 + 12215 ;ASSUME DS:TRANGROUP, ES:NOTHING + 12216 + 12217 ; Batch parameters are read with ES set to segment of resident part + 12218 + 12219 ; MSDOS 6.0 + 12220 0000089C 8E06[F59B] mov es,[RESSEG] + 12221 ;ASSUME ES:RESGROUP + 12222 ;cmp byte [es:Call_Batch_Flag],1 + 12223 000008A0 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress + 12224 ;AN043; If in CALL, + 12225 000008A6 7403 jz short skip_ioset ;AN043; redirection was already set up + 12226 ;invoke IOSET ; Set up any redirection + 12227 000008A8 E80527 call IOSET + 12228 skip_ioset: ;AN043; + 12229 000008AB E865FF call FREE_TPA ; G + 12230 ;cmp byte [es:Call_Batch_Flag],1 + 12231 000008AE 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress + 12232 000008B4 7403 jz short GETECHO ; G if we're in a call, don't execute + 12233 + 12234 ; 12/02/2023 + 12235 ; MSDOS 3.3 + 12236 ;call IOSET + 12237 ;mov es,[RESSEG] + 12238 ;call FREE_TPA + 12239 ;;cmp byte [es:CALL_BATCH_FLAG],1 + 12240 ;cmp byte [es:CALL_BATCH_FLAG],call_in_progress + 12241 ;jz short GETECHO ; G if we're in a call, don't execute + 12242 + 12243 ; MSDOS 3.3 (& MSDOS 6.0) + 12244 + 12245 ; Since BATCH has lower precedence than PIPE or FOR. If a new BATCH file is + 12246 ; being started it MUST be true that no FOR or PIPE is currently in progress. + 12247 ; Don't execute if in call + 12248 + 12249 000008B6 E8A008 call FOROFF + 12250 GETECHO: + 12251 000008B9 E8EB2A call PipeOff + 12252 000008BC 26A0[9D02] mov al,[es:EchoFlag] ; preserve echo state for chaining + 12253 000008C0 2401 and al,1 ; Save current echo state + 12254 + 12255 000008C2 50 push ax + 12256 000008C3 31C0 xor ax,ax + 12257 000008C5 26F706[4902]FFFF test word [es:Batch],-1 ; Are we in a batch file? + 12258 000008CC 7414 jz short LEAVEBAT ; No, nothing to save + 12259 000008CE 26A1[4902] mov ax,[es:Batch] ; Get current batch segment + 12260 ;cmp byte [es:Call_Batch_Flag],1 + 12261 000008D2 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress + 12262 000008D8 7408 jz short LEAVEBAT 12263 - 12264 000008DA 06 push es - 12265 000008DB 8EC0 mov es,ax ; Get current batch segment - 12266 ;mov ax,[es:02h] ; MSDOS 3.3 COMMAND.COM - 12267 ; Get previous batch segment - 12268 ; 12/02/2023 - 12269 ;mov ax,[es:03h] ; MSDOS 6.0 (&5.0) COMMAND.COM - 12270 000008DD 26A10300 mov ax,[es:BATCHSEGMENT.BatLast] - 12271 000008E1 07 pop es - 12272 LEAVEBAT: - 12273 000008E2 50 push ax ; Keep segment until new one created - 12274 ;cmp byte [es:Call_Batch_Flag],1 - 12275 000008E3 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress - 12276 000008E9 7403 jz short STARTBAT - 12277 000008EB E82401 call BATCHOFF - 12278 - 12279 ; Find length of batch file - 12280 - 12281 STARTBAT: - 12282 000008EE 26C606[B102]00 mov byte [es:Call_Batch_Flag],0 ; Reset call flag - 12283 000008F4 BE[1D9B] mov si,EXECPATH - 12284 - 12285 ; 12/02/2023 - 12286 ; MSDOS 6.0 - 12287 000008F7 B811B7 mov ax,0B711h - 12288 ;mov ax,AppendTruename - 12289 ;AN042; Get the real path where the batch file - 12290 000008FA CD2F int 2Fh ;AN042; was found with APPEND - 12291 000008FC B44E mov ah,4Eh - 12292 ;mov ah,Find_First ;AN042; The find_first will return it - 12293 000008FE 89F2 mov dx,si ;AN042; Get the string - 12294 00000900 B91300 mov cx,13h - 12295 ;mov cx,search_attr ;AN042; filetypes to search for - 12296 - 12297 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12298 %if 0 - 12299 int 21h ;AN042; - 12300 %else - 12301 00000903 E8B4FC call int_21h_indirect - 12302 %endif - 12303 - 12304 ; MSDOS 3.3 (& MSDOS 6.0) - 12305 00000906 E89627 call dstrlen - 12306 ; - 12307 ; Allocate batch area: - 12308 ; BYTE type of segment - 12309 ; WORD segment of last batch file - 12310 ; WORD segment for FOR command - 12311 ; BYTE FOR flag state on entry to batch file - 12312 ; DWORD offset for next line - 12313 ; 10 WORD pointers to parameters. -1 is empty parameter - 12314 ; ASCIZ file name (with . and ..) - 12315 ; BYTES CR-terminated parameters - 12316 ; BYTE 0 flag to indicate end of parameters - 12317 ; - 12318 ; We allocate the maximum size for the command line and use setblock to shrink - 12319 ; later when we've squeezed out the extra + 12264 ; We are in a chained batch file, save batlast from previous batch segment + 12265 ; so that if we're in a CALL, we will return to the correct batch file. + 12266 + 12267 000008DA 06 push es + 12268 000008DB 8EC0 mov es,ax ; Get current batch segment + 12269 ;mov ax,[es:02h] ; MSDOS 3.3 COMMAND.COM + 12270 ; Get previous batch segment + 12271 ; 12/02/2023 + 12272 ;mov ax,[es:03h] ; MSDOS 6.0 (&5.0) COMMAND.COM + 12273 000008DD 26A10300 mov ax,[es:BATCHSEGMENT.BatLast] + 12274 000008E1 07 pop es + 12275 LEAVEBAT: + 12276 000008E2 50 push ax ; Keep segment until new one created + 12277 ;cmp byte [es:Call_Batch_Flag],1 + 12278 000008E3 26803E[B102]01 cmp byte [es:Call_Batch_Flag],call_in_progress + 12279 000008E9 7403 jz short STARTBAT + 12280 000008EB E82401 call BATCHOFF + 12281 + 12282 ; Find length of batch file + 12283 + 12284 STARTBAT: + 12285 000008EE 26C606[B102]00 mov byte [es:Call_Batch_Flag],0 ; Reset call flag + 12286 000008F4 BE[1D9B] mov si,EXECPATH + 12287 + 12288 ; 12/02/2023 + 12289 ; MSDOS 6.0 + 12290 000008F7 B811B7 mov ax,0B711h + 12291 ;mov ax,AppendTruename + 12292 ;AN042; Get the real path where the batch file + 12293 000008FA CD2F int 2Fh ;AN042; was found with APPEND + 12294 000008FC B44E mov ah,4Eh + 12295 ;mov ah,Find_First ;AN042; The find_first will return it + 12296 000008FE 89F2 mov dx,si ;AN042; Get the string + 12297 00000900 B91300 mov cx,13h + 12298 ;mov cx,search_attr ;AN042; filetypes to search for + 12299 + 12300 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12301 %if 0 + 12302 int 21h ;AN042; + 12303 %else + 12304 00000903 E8B4FC call int_21h_indirect + 12305 %endif + 12306 + 12307 ; MSDOS 3.3 (& MSDOS 6.0) + 12308 00000906 E89627 call dstrlen + 12309 ; + 12310 ; Allocate batch area: + 12311 ; BYTE type of segment + 12312 ; WORD segment of last batch file + 12313 ; WORD segment for FOR command + 12314 ; BYTE FOR flag state on entry to batch file + 12315 ; DWORD offset for next line + 12316 ; 10 WORD pointers to parameters. -1 is empty parameter + 12317 ; ASCIZ file name (with . and ..) + 12318 ; BYTES CR-terminated parameters + 12319 ; BYTE 0 flag to indicate end of parameters 12320 ; - 12321 00000909 89CB mov bx,cx ; length of file name. - 12322 ;add bx,190 ; MSDOS 3.3 (BATCHSEGMENT struc size = 32) - 12323 ; 12/02/2023 - 12324 ;add bx,191 ; MSDOS 6.0 (BATCHSEGMENT struc size = 33) - 12325 ; PCDOS 7.1 ; 26/07/2024 - 12326 ; 25/04/2023 - 12327 0000090B 81C3BF00 add bx,15+BATCHSEGMENT.SIZE+COMBUFLEN+15 - 12328 ; structure + max len + round up - 12329 0000090F 51 push cx - 12330 00000910 B104 mov cl,4 - 12331 00000912 D3EB shr bx,cl ; convert to paragraphs - 12332 00000914 53 push bx ; Save size of batch segment - 12333 00000915 B448 mov ah,48h - 12334 ;mov ah,ALLOC ; 48h ; Allocate batch segment - 12335 - 12336 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12337 %if 0 - 12338 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 12339 ; BX = number of 16-byte paragraphs desired - 12340 %else - 12341 00000917 E8A0FC call int_21h_indirect - 12342 %endif - 12343 - 12344 0000091A 5B pop bx ; Get size of batch segment - 12345 - 12346 ; This should *NEVER* return an error. The transient is MUCH bigger than - 12347 ; the batch segment. This may not be true, however, in a multitasking system. - 12348 ; G This error will occur with nesting of batch files. We also need to - 12349 ; G make sure that we don't overlay the transient. - 12350 - 12351 0000091B 7222 jc short MEM_ERROR ;G not enough memory - exit - 12352 - 12353 0000091D 50 push ax ;G save batch segment - 12354 0000091E 01D8 add ax,bx ;G get end of batch segment - 12355 00000920 83C020 add ax,20h ;G add some tpa work area - 12356 00000923 8CCB mov bx,cs ;G get the transient segment - 12357 - 12358 ; MSDOS 6.0 - 12359 ; M006; We cant check just for above. If the batchseg goes into a UMB, the - 12360 ; M006; batchseg is always above the transient. We need to change this code - 12361 ; M006; to only check for an overlap - 12362 - 12363 ;;mov dx,offset TRANGROUP:TranSpaceEnd ; M006 - 12364 ; 12/02/2023 - 12365 ;;mov dx,98C5h ; MSDOS 5.0 COMMAND.COM - 12366 ; 18/07/2024 - 12367 ;mov dx,0AA9Ah ; PCDOS 7.1 COMMAND.COM - 12368 ;mov dx,TRANSPACEEND - 12369 ;add dx,15 ;round up para; M006 - 12370 00000925 BA1AA6 mov dx,TRANSPACEEND+15 - 12371 - 12372 00000928 D3EA shr dx,cl ;para size of transient; M006 - 12373 0000092A 01DA add dx,bx ;dx = top of transient; M006 + 12321 ; We allocate the maximum size for the command line and use setblock to shrink + 12322 ; later when we've squeezed out the extra + 12323 ; + 12324 00000909 89CB mov bx,cx ; length of file name. + 12325 ;add bx,190 ; MSDOS 3.3 (BATCHSEGMENT struc size = 32) + 12326 ; 12/02/2023 + 12327 ;add bx,191 ; MSDOS 6.0 (BATCHSEGMENT struc size = 33) + 12328 ; PCDOS 7.1 ; 26/07/2024 + 12329 ; 25/04/2023 + 12330 0000090B 81C3BF00 add bx,15+BATCHSEGMENT.SIZE+COMBUFLEN+15 + 12331 ; structure + max len + round up + 12332 0000090F 51 push cx + 12333 00000910 B104 mov cl,4 + 12334 00000912 D3EB shr bx,cl ; convert to paragraphs + 12335 00000914 53 push bx ; Save size of batch segment + 12336 00000915 B448 mov ah,48h + 12337 ;mov ah,ALLOC ; 48h ; Allocate batch segment + 12338 + 12339 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12340 %if 0 + 12341 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 12342 ; BX = number of 16-byte paragraphs desired + 12343 %else + 12344 00000917 E8A0FC call int_21h_indirect + 12345 %endif + 12346 + 12347 0000091A 5B pop bx ; Get size of batch segment + 12348 + 12349 ; This should *NEVER* return an error. The transient is MUCH bigger than + 12350 ; the batch segment. This may not be true, however, in a multitasking system. + 12351 ; G This error will occur with nesting of batch files. We also need to + 12352 ; G make sure that we don't overlay the transient. + 12353 + 12354 0000091B 7222 jc short MEM_ERROR ;G not enough memory - exit + 12355 + 12356 0000091D 50 push ax ;G save batch segment + 12357 0000091E 01D8 add ax,bx ;G get end of batch segment + 12358 00000920 83C020 add ax,20h ;G add some tpa work area + 12359 00000923 8CCB mov bx,cs ;G get the transient segment + 12360 + 12361 ; MSDOS 6.0 + 12362 ; M006; We cant check just for above. If the batchseg goes into a UMB, the + 12363 ; M006; batchseg is always above the transient. We need to change this code + 12364 ; M006; to only check for an overlap + 12365 + 12366 ;;mov dx,offset TRANGROUP:TranSpaceEnd ; M006 + 12367 ; 12/02/2023 + 12368 ;;mov dx,98C5h ; MSDOS 5.0 COMMAND.COM + 12369 ; 18/07/2024 + 12370 ;mov dx,0AA9Ah ; PCDOS 7.1 COMMAND.COM + 12371 ;mov dx,TRANSPACEEND + 12372 ;add dx,15 ;round up para; M006 + 12373 00000925 BA1AA6 mov dx,TRANSPACEEND+15 12374 - 12375 0000092C 39D8 cmp ax,bx ; M006 - 12376 0000092E 7212 jb short ENOUGH_MEM - 12377 ; Batchseg below transient - 12378 ; enough memory ; M006 - 12379 00000930 39D0 cmp ax,dx ; M006 - 12380 00000932 770E ja short ENOUGH_MEM - 12381 ; Batchseg above transient - 12382 ; enough memory ; M006 - 12383 - 12384 ; M006; Batchseg overlaps transient -- insufficient memory - 12385 - 12386 00000934 58 pop ax ; restore ax; M006 - 12387 - 12388 ; 12/02/2023 - 12389 ; MSDOS 3.3 - 12390 ; M006; cmp ax,bx ;G do we end before the transient - 12391 ; M006; pop ax ;G get batch segment back - 12392 ; M006; jb short ENOUGH_MEM ;G we have enough memory - continue - 12393 - 12394 ; MSDOS 3.3 (& MSDOS 6.0) - 12395 00000935 06 push es ;G no we're hitting the transient - 12396 00000936 8EC0 mov es,ax - 12397 00000938 B80049 mov ax,4900h - 12398 ;mov ax,DEALLOC*256 ; 4900h ;G deallocate the batch segment - 12399 - 12400 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12401 %if 0 - 12402 int 21h ; DOS - 2+ - FREE MEMORY - 12403 ; ES = segment address of area to be freed - 12404 %else - 12405 0000093B E87CFC call int_21h_indirect - 12406 %endif - 12407 - 12408 0000093E 07 pop es - 12409 MEM_ERROR: - 12410 0000093F E9B900 jmp NO_MEMORY ;G Set up for message and exit - 12411 - 12412 ENOUGH_MEM: - 12413 ; 12/02/2023 - Retro DOS v4.0 COMMAND.COM - 12414 ; MSDOS 6.0 - 12415 00000942 58 pop ax ; restore ax; M006 - 12416 - 12417 ; MSDOS 3.3 (& MSDOS 6.0) - 12418 00000943 26A3[4902] mov [es:Batch],ax - 12419 00000947 E8DAFE call ALLOC_TPA - 12420 - 12421 ; Initialize batch segment - 12422 - 12423 0000094A 5A pop dx ; length of name - 12424 0000094B 58 pop ax ;G get saved batch segment back - 12425 0000094C 26FF06[AE02] inc word [es:Nest] ;G increment # batch files in progress - 12426 00000951 06 push es - 12427 00000952 268E06[4902] mov es,[es:Batch] - 12428 ;mov byte [ES:0],0 - 12429 ; signal batch file type - 12430 00000957 26C606000000 mov byte [es:BATCHSEGMENT.BatType],BATCHTYPE ; 0 - 12431 ;;mov [es:2],ax ; MSDOS 3.3 - 12432 ;G save segment of last batch file - 12433 ;mov [es:3],ax ; MSDOS 6.0 - 12434 0000095D 26A30300 mov [es:BATCHSEGMENT.BatLast],ax - 12435 00000961 1E push ds - 12436 00000962 8E1E[F59B] mov ds,[RESSEG] ;G set to resident data - 12437 - 12438 00000966 31C0 xor ax,ax - 12439 00000968 8A1E[AB02] mov bl,[ForFlag] ;G get the current FOR state - 12440 ;;mov [es:6],bl ; MSDOS 3.3 - 12441 ;G save it in the batch segment - 12442 ;mov [es:7],bl ; MSDOS 6.0 - 12443 0000096C 26881E0700 mov [es:BATCHSEGMENT.BatForFlag],bl - 12444 00000971 F6C3FF test bl,-1 ; 0FFh ;G are we in a FOR? - 12445 00000974 7406 jz short FOR_NOT_ON ;G no, for segment set to 0 - 12446 ;mov ax,[ForPtr] ;G yes, get current FOR segment - 12447 ;mov byte [ForFlag],0 ;G reset forflag - 12448 ; 26/07/2024 - 12449 00000976 A2[AB02] mov [ForFlag],al ; 0 - 12450 00000979 A1[AC02] mov ax,[ForPtr] ;G yes, get current FOR segment - 12451 FOR_NOT_ON: - 12452 ;;mov [es:4],ax ; MSDOS 3.3 - 12453 ;G save FOR segment in batch segment - 12454 ;mov [es:5],ax ; MSDOS 6.0 - 12455 0000097C 26A30500 mov [es:BATCHSEGMENT.BatForPtr],ax - 12456 00000980 31C0 xor ax,ax - 12457 00000982 A3[AC02] mov [ForPtr],ax ;G make sure for segment is not active - 12458 00000985 8A1E[9D02] mov bl,[EchoFlag] - 12459 00000989 1F pop ds - 12460 ;mov [es:1],bl - 12461 ;G save echo state of parent - 12462 0000098A 26881E0100 mov [es:BATCHSEGMENT.BatEchoFlag],bl - 12463 ;SR; - 12464 ; Initialize the new BatchEOF flag we have added to 0 - 12465 - 12466 ; MSDOS 6.0 - 12467 ;mov byte [es:2],0 - 12468 0000098F 26C606020000 mov byte [es:BATCHSEGMENT.BatchEOF],0 - 12469 - 12470 ;mov [es:08h],ax ; MSDOS 6.0 - 12471 00000995 26A30800 mov [es:BATCHSEGMENT.BatSeek],ax ; point to beginning of file - 12472 ;mov [es:0Ah],ax ; MSDOS 6.0 - 12473 00000999 26A30A00 mov [es:BATCHSEGMENT.BatSeek+2],ax - 12474 - 12475 ; Initialize pointers - 12476 - 12477 0000099D 48 dec ax ; put -1 into AX - 12478 ;;mov di,0Bh ; MSDOS 3.3 - 12479 ; point to parm area - 12480 ;mov di,0Ch ; MSDOS 6.0 - 12481 0000099E BF0C00 mov di,BATCHSEGMENT.BatParm - 12482 000009A1 89FB mov bx,di - 12483 000009A3 B90A00 mov cx,10 - 12484 000009A6 F3AB rep stosw ; Init to no parms - 12485 - 12486 ; Move in batch file name - 12487 - 12488 000009A8 89D1 mov cx,dx - 12489 000009AA F3A4 rep movsb + 12375 00000928 D3EA shr dx,cl ;para size of transient; M006 + 12376 0000092A 01DA add dx,bx ;dx = top of transient; M006 + 12377 + 12378 0000092C 39D8 cmp ax,bx ; M006 + 12379 0000092E 7212 jb short ENOUGH_MEM + 12380 ; Batchseg below transient + 12381 ; enough memory ; M006 + 12382 00000930 39D0 cmp ax,dx ; M006 + 12383 00000932 770E ja short ENOUGH_MEM + 12384 ; Batchseg above transient + 12385 ; enough memory ; M006 + 12386 + 12387 ; M006; Batchseg overlaps transient -- insufficient memory + 12388 + 12389 00000934 58 pop ax ; restore ax; M006 + 12390 + 12391 ; 12/02/2023 + 12392 ; MSDOS 3.3 + 12393 ; M006; cmp ax,bx ;G do we end before the transient + 12394 ; M006; pop ax ;G get batch segment back + 12395 ; M006; jb short ENOUGH_MEM ;G we have enough memory - continue + 12396 + 12397 ; MSDOS 3.3 (& MSDOS 6.0) + 12398 00000935 06 push es ;G no we're hitting the transient + 12399 00000936 8EC0 mov es,ax + 12400 00000938 B80049 mov ax,4900h + 12401 ;mov ax,DEALLOC*256 ; 4900h ;G deallocate the batch segment + 12402 + 12403 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12404 %if 0 + 12405 int 21h ; DOS - 2+ - FREE MEMORY + 12406 ; ES = segment address of area to be freed + 12407 %else + 12408 0000093B E87CFC call int_21h_indirect + 12409 %endif + 12410 + 12411 0000093E 07 pop es + 12412 MEM_ERROR: + 12413 0000093F E9B900 jmp NO_MEMORY ;G Set up for message and exit + 12414 + 12415 ENOUGH_MEM: + 12416 ; 12/02/2023 - Retro DOS v4.0 COMMAND.COM + 12417 ; MSDOS 6.0 + 12418 00000942 58 pop ax ; restore ax; M006 + 12419 + 12420 ; MSDOS 3.3 (& MSDOS 6.0) + 12421 00000943 26A3[4902] mov [es:Batch],ax + 12422 00000947 E8DAFE call ALLOC_TPA + 12423 + 12424 ; Initialize batch segment + 12425 + 12426 0000094A 5A pop dx ; length of name + 12427 0000094B 58 pop ax ;G get saved batch segment back + 12428 0000094C 26FF06[AE02] inc word [es:Nest] ;G increment # batch files in progress + 12429 00000951 06 push es + 12430 00000952 268E06[4902] mov es,[es:Batch] + 12431 ;mov byte [ES:0],0 + 12432 ; signal batch file type + 12433 00000957 26C606000000 mov byte [es:BATCHSEGMENT.BatType],BATCHTYPE ; 0 + 12434 ;;mov [es:2],ax ; MSDOS 3.3 + 12435 ;G save segment of last batch file + 12436 ;mov [es:3],ax ; MSDOS 6.0 + 12437 0000095D 26A30300 mov [es:BATCHSEGMENT.BatLast],ax + 12438 00000961 1E push ds + 12439 00000962 8E1E[F59B] mov ds,[RESSEG] ;G set to resident data + 12440 + 12441 00000966 31C0 xor ax,ax + 12442 00000968 8A1E[AB02] mov bl,[ForFlag] ;G get the current FOR state + 12443 ;;mov [es:6],bl ; MSDOS 3.3 + 12444 ;G save it in the batch segment + 12445 ;mov [es:7],bl ; MSDOS 6.0 + 12446 0000096C 26881E0700 mov [es:BATCHSEGMENT.BatForFlag],bl + 12447 00000971 F6C3FF test bl,-1 ; 0FFh ;G are we in a FOR? + 12448 00000974 7406 jz short FOR_NOT_ON ;G no, for segment set to 0 + 12449 ;mov ax,[ForPtr] ;G yes, get current FOR segment + 12450 ;mov byte [ForFlag],0 ;G reset forflag + 12451 ; 26/07/2024 + 12452 00000976 A2[AB02] mov [ForFlag],al ; 0 + 12453 00000979 A1[AC02] mov ax,[ForPtr] ;G yes, get current FOR segment + 12454 FOR_NOT_ON: + 12455 ;;mov [es:4],ax ; MSDOS 3.3 + 12456 ;G save FOR segment in batch segment + 12457 ;mov [es:5],ax ; MSDOS 6.0 + 12458 0000097C 26A30500 mov [es:BATCHSEGMENT.BatForPtr],ax + 12459 00000980 31C0 xor ax,ax + 12460 00000982 A3[AC02] mov [ForPtr],ax ;G make sure for segment is not active + 12461 00000985 8A1E[9D02] mov bl,[EchoFlag] + 12462 00000989 1F pop ds + 12463 ;mov [es:1],bl + 12464 ;G save echo state of parent + 12465 0000098A 26881E0100 mov [es:BATCHSEGMENT.BatEchoFlag],bl + 12466 ;SR; + 12467 ; Initialize the new BatchEOF flag we have added to 0 + 12468 + 12469 ; MSDOS 6.0 + 12470 ;mov byte [es:2],0 + 12471 0000098F 26C606020000 mov byte [es:BATCHSEGMENT.BatchEOF],0 + 12472 + 12473 ;mov [es:08h],ax ; MSDOS 6.0 + 12474 00000995 26A30800 mov [es:BATCHSEGMENT.BatSeek],ax ; point to beginning of file + 12475 ;mov [es:0Ah],ax ; MSDOS 6.0 + 12476 00000999 26A30A00 mov [es:BATCHSEGMENT.BatSeek+2],ax + 12477 + 12478 ; Initialize pointers + 12479 + 12480 0000099D 48 dec ax ; put -1 into AX + 12481 ;;mov di,0Bh ; MSDOS 3.3 + 12482 ; point to parm area + 12483 ;mov di,0Ch ; MSDOS 6.0 + 12484 0000099E BF0C00 mov di,BATCHSEGMENT.BatParm + 12485 000009A1 89FB mov bx,di + 12486 000009A3 B90A00 mov cx,10 + 12487 000009A6 F3AB rep stosw ; Init to no parms + 12488 + 12489 ; Move in batch file name 12490 - 12491 ; Now copy the command line into batch segment, parsing the arguments along - 12492 ; the way. Segment will look like this: - 12493 ; - 12494 ; CRCR...CRCR...CR 0 - 12495 ; - 12496 ; or, in the case of fewer arguments: - 12497 ; - 12498 ; CRCR...CR CR CR ... CR 0 - 12499 - 12500 000009AC BE[569A] mov si,COMBUF+2 - 12501 ;mov cx,10 ; at most 10 arguments - 12502 ; 07/06/2023 - 12503 000009AF B10A mov cl,10 - 12504 EACHPARM: - 12505 000009B1 E8D21F call scanoff ; skip to argument - 12506 - 12507 ; AL is first non-delimiter. DS:SI points to char = AL - 12508 - 12509 000009B4 3C0D cmp al,0Dh ; end of road? - 12510 000009B6 741D jz short HAVPARM ; yes, no more arguments + 12491 000009A8 89D1 mov cx,dx + 12492 000009AA F3A4 rep movsb + 12493 + 12494 ; Now copy the command line into batch segment, parsing the arguments along + 12495 ; the way. Segment will look like this: + 12496 ; + 12497 ; CRCR...CRCR...CR 0 + 12498 ; + 12499 ; or, in the case of fewer arguments: + 12500 ; + 12501 ; CRCR...CR CR CR ... CR 0 + 12502 + 12503 000009AC BE[569A] mov si,COMBUF+2 + 12504 ;mov cx,10 ; at most 10 arguments + 12505 ; 07/06/2023 + 12506 000009AF B10A mov cl,10 + 12507 EACHPARM: + 12508 000009B1 E8D21F call scanoff ; skip to argument + 12509 + 12510 ; AL is first non-delimiter. DS:SI points to char = AL 12511 - 12512 ; If CX = 0 then we have stored the most parm we can. Skip store - 12513 - 12514 000009B8 E306 jcxz MOVPARM ; Only first 10 parms get pointers - 12515 - 12516 ; Go into allocated piece and stick in new argument pointer. - 12517 - 12518 000009BA 26893F mov [es:bx],di ; store batch pointer - 12519 000009BD 83C302 add bx,2 ; advance arg counter + 12512 000009B4 3C0D cmp al,0Dh ; end of road? + 12513 000009B6 741D jz short HAVPARM ; yes, no more arguments + 12514 + 12515 ; If CX = 0 then we have stored the most parm we can. Skip store + 12516 + 12517 000009B8 E306 jcxz MOVPARM ; Only first 10 parms get pointers + 12518 + 12519 ; Go into allocated piece and stick in new argument pointer. 12520 - 12521 ; Move the parameter into batch segment - 12522 - 12523 MOVPARM: - 12524 000009C0 AC lodsb ; get byte - 12525 000009C1 E8CA1F call DELIM ; if delimiter - 12526 000009C4 7407 jz short ENDPARM ; then done with parm - 12527 000009C6 AA stosb ; store byte - 12528 000009C7 3C0D cmp al,0Dh ; if CR then not delimiter - 12529 000009C9 740A jz short HAVPARM ; but end of parm list, finish - 12530 000009CB EBF3 jmp short MOVPARM - 12531 - 12532 ; We have copied a parameter up until the first separator. - 12533 ; Terminate it with CR. + 12521 000009BA 26893F mov [es:bx],di ; store batch pointer + 12522 000009BD 83C302 add bx,2 ; advance arg counter + 12523 + 12524 ; Move the parameter into batch segment + 12525 + 12526 MOVPARM: + 12527 000009C0 AC lodsb ; get byte + 12528 000009C1 E8CA1F call DELIM ; if delimiter + 12529 000009C4 7407 jz short ENDPARM ; then done with parm + 12530 000009C6 AA stosb ; store byte + 12531 000009C7 3C0D cmp al,0Dh ; if CR then not delimiter + 12532 000009C9 740A jz short HAVPARM ; but end of parm list, finish + 12533 000009CB EBF3 jmp short MOVPARM 12534 - 12535 ENDPARM: - 12536 000009CD B00D mov al,0Dh - 12537 000009CF AA stosb - 12538 000009D0 E3DF jcxz EACHPARM ; if no parameters, don't dec - 12539 000009D2 49 dec cx ; remember that we've seen one. - 12540 000009D3 EBDC jmp short EACHPARM - 12541 - 12542 ; We have parsed the entire line. Terminate the arg list - 12543 - 12544 HAVPARM: - 12545 000009D5 30C0 xor al,al ; Nul terminate the parms - 12546 000009D7 AA stosb - 12547 - 12548 ; Now we know EXACTLY how big the BATCH segment is. Round up size (from DI) - 12549 ; into paragraphs and setblock to the appropriate size + 12535 ; We have copied a parameter up until the first separator. + 12536 ; Terminate it with CR. + 12537 + 12538 ENDPARM: + 12539 000009CD B00D mov al,0Dh + 12540 000009CF AA stosb + 12541 000009D0 E3DF jcxz EACHPARM ; if no parameters, don't dec + 12542 000009D2 49 dec cx ; remember that we've seen one. + 12543 000009D3 EBDC jmp short EACHPARM + 12544 + 12545 ; We have parsed the entire line. Terminate the arg list + 12546 + 12547 HAVPARM: + 12548 000009D5 30C0 xor al,al ; Nul terminate the parms + 12549 000009D7 AA stosb 12550 - 12551 000009D8 8D5D0F lea bx,[di+15] - 12552 000009DB B104 mov cl,4 - 12553 000009DD D3EB shr bx,cl - 12554 000009DF B44A mov ah,4Ah - 12555 ;mov ah,SETBLOCK ; 4Ah - 12556 - 12557 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12558 %if 0 - 12559 int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK) - 12560 ; ES = segment address of block to change - 12561 ; BX = new size in paragraphs - 12562 %else - 12563 000009E1 E8D6FB call int_21h_indirect - 12564 %endif - 12565 - 12566 000009E4 07 pop es - 12567 000009E5 06 push es - 12568 000009E6 1F pop ds ; Simply batch FCB setup - 12569 000009E7 833E[A502]FF cmp word [SingleCom],-1 ; 0FFFFh - 12570 000009EC 7506 jne short NOBATSING - 12571 000009EE C706[A502]F0FF mov word [SingleCom],0FFF0h ; Flag single command BATCH job - 12572 - 12573 NOBATSING: - 12574 - 12575 ; Enter the batch file with the current echo state - 12576 - 12577 000009F4 58 pop ax ; Get original echo state - 12578 000009F5 A2[9D02] mov [EchoFlag],al ; restore it - 12579 000009F8 E909F7 jmp TCOMMAND - 12580 - 12581 ; The following is executed if there isn't enough memory for batch segment - 12582 - 12583 NO_MEMORY: - 12584 000009FB 5A pop dx ; even up our stack - 12585 000009FC 58 pop ax - 12586 000009FD 58 pop ax - 12587 000009FE E823FE call ALLOC_TPA ; reallocate memory - 12588 - 12589 ; 12/02/2023 - 12590 ; MSDOS 3.3 - 12591 ;mov dx,INSFMEMMESPTR - 12592 ;jmp CERROR - 12593 - 12594 ; MSDOS 6.0 - 12595 ;mov byte [msg_disp_class],1 - 12596 00000A01 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 12597 ;AN000; set up extended error msg class - 12598 ;mov dx,offset TranGroup:Extend_Buf_ptr - 12599 00000A06 BA[D78F] mov dx,extend_buf_ptr - 12600 ; ;AC000; get extended message pointer - 12601 ;mov word [extend_buf_ptr],8 - 12602 00000A09 C706[D78F]0800 mov word [extend_buf_ptr],ERROR_NOT_ENOUGH_MEMORY - 12603 ;AN000; get message number in control block - 12604 00000A0F E91423 jmp cerror ;g print error message and go... - 12605 - 12606 ; =============== S U B R O U T I N E ======================================= - 12607 - 12608 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12609 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 12610 BATCHOFF: - 12611 00000A12 50 push ax - 12612 00000A13 06 push es - 12613 00000A14 1E push ds - 12614 00000A15 53 push bx - 12615 - 12616 00000A16 2E8E06[F59B] mov es,[cs:RESSEG] - 12617 ;mov ds,[cs:RESSEG] - 12618 ; 26/07/2024 - 12619 00000A1B 06 push es - 12620 00000A1C 1F pop ds - 12621 - 12622 00000A1D A1[4902] mov ax,[Batch] ; Free the batch segment - 12623 00000A20 09C0 or ax,ax - 12624 00000A22 7443 jz short NOTFREE - 12625 - 12626 00000A24 06 push es - 12627 00000A25 8EC0 mov es,ax - 12628 00000A27 F606[9D02]01 test byte [EchoFlag],1 - 12629 ;G Is echo on? - 12630 00000A2C 7505 jnz short ECHO_LAST_LINE - 12631 ;G Yes - echo last line in file - 12632 ;mov byte [SUPPRESS],0 - 12633 00000A2E C606[9E02]00 mov byte [Suppress],NO_ECHO - 12634 ;G no - don't echo last line in file - 12635 ECHO_LAST_LINE: - 12636 ;mov bl,[es:1] - 12637 00000A33 268A1E0100 mov bl,[es:BATCHSEGMENT.BatEchoFlag] - 12638 ; G get echo state - 12639 00000A38 881E[9D02] mov [EchoFlag],bl - 12640 ; G and restore it - 12641 ;;mov bx,[es:4] ; MSDOS 3.3 - 12642 ;mov bx,[es:5] ; MSDOS 6.0 - 12643 00000A3C 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] - 12644 ;G Get FOR segment - 12645 00000A41 891E[AC02] mov [ForPtr],bx ;G and restore it - 12646 ;;mov bl,[es:6] ; MSDOS 3.3 - 12647 ;mov bl,[es:7] ; MSDOS 6.0 - 12648 00000A45 268A1E0700 mov bl,[es:BATCHSEGMENT.BatForFlag] - 12649 ;G Get FOR flag - 12650 00000A4A 881E[AB02] mov [ForFlag],bl - 12651 ;G and restore it - 12652 ;;mov bx,[es:2] ; MSDOS 3.3 - 12653 ;mov bx,[es:3] ; MSDOS 6.0 - 12654 00000A4E 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] - 12655 ;G Get old batch segment - 12656 00000A53 B449 mov ah,49h - 12657 ;mov ah,DEALLOC ; 49h - 12658 - 12659 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12660 %if 0 - 12661 int 21h ; DOS - 2+ - FREE MEMORY - 12662 ; ES = segment address of area to be freed - 12663 %else - 12664 00000A55 E862FB call int_21h_indirect - 12665 %endif - 12666 - 12667 00000A58 07 pop es - 12668 00000A59 891E[B202] mov [Next_Batch],bx ;G reset batch segment - 12669 00000A5D 26FF0E[AE02] dec word [es:Nest] - 12670 00000A62 31C0 xor ax,ax - 12671 00000A64 A3[4902] mov [Batch],ax ; No batch in progress - 12672 NOTFREE: - 12673 00000A67 5B pop bx - 12674 00000A68 1F pop ds - 12675 00000A69 07 pop es - 12676 00000A6A 58 pop ax - 12677 00000A6B C3 retn - 12678 - 12679 ; =============== S U B R O U T I N E ======================================= - 12680 - 12681 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12682 - 12683 ; StrCpy - copy string, checking count in CX against COMBUFLEN - 12684 ; Entry : DS:SI ==> source string - 12685 ; ES:DI ==> destination string - 12686 ; CX = current length of destination string - 12687 ; Exit : string copied, CX updated, Carry set if length limit exceeded - 12688 - 12689 ; 12/02/2023 - 12690 ; MSDOS 3.3 - 12691 ;STRCPY: - 12692 ;push ax - 12693 ;CCYCLE: - 12694 ;lodsb - 12695 ;stosb - 12696 ;or al,al - 12697 ;jnz short CCYCLE - 12698 ;pop ax - 12699 ;retn - 12700 - 12701 ;Procedure StrCpy,NEAR - 12702 - 12703 ; 12/02/2023 - 12704 ; MSDOS 6.0 - 12705 STRCPY: - 12706 00000A6C 50 push ax - 12707 ccycle: - 12708 00000A6D AC lodsb - 12709 00000A6E 41 inc cx - 12710 ;cmp cx,128 - 12711 00000A6F 81F98000 cmp cx,COMBUFLEN - 12712 ;jb short ccopy - 12713 ;stc ; set carry to signal error - 12714 ;jmp short ccend - 12715 ; 12/02/2023 - 12716 00000A73 F5 cmc - 12717 00000A74 7205 jc short ccend - 12718 ccopy: - 12719 00000A76 AA stosb - 12720 00000A77 08C0 or al,al - 12721 00000A79 75F2 jnz short ccycle - 12722 ccend: - 12723 00000A7B 49 dec cx ; discount extra byte - 12724 00000A7C 4F dec di ; back up pointer - 12725 00000A7D 58 pop ax - 12726 00000A7E C3 retn ; return carry clear - 12727 - 12728 ;EndProc StrCpy - 12729 - 12730 ;============================================================================ - 12731 ; TBATCH2.ASM, MSDOS 6.0, 1991 - 12732 ;============================================================================ - 12733 ; 12/10/2018 - Retro DOS v3.0 - 12734 - 12735 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0892h - 12736 - 12737 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 12738 - 12739 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 0977h - 12740 - 12741 ; =============== S U B R O U T I N E ======================================= - 12742 - 12743 ;Break - 12744 - 12745 ; Get one byte from the batch file and return it in AL. End-of-file returns - 12746 ; and ends batch mode. DS must be set to resident segment. - 12747 ; AH, DX destroyed. - 12748 - 12749 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 12750 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 0A95h + 12551 ; Now we know EXACTLY how big the BATCH segment is. Round up size (from DI) + 12552 ; into paragraphs and setblock to the appropriate size + 12553 + 12554 000009D8 8D5D0F lea bx,[di+15] + 12555 000009DB B104 mov cl,4 + 12556 000009DD D3EB shr bx,cl + 12557 000009DF B44A mov ah,4Ah + 12558 ;mov ah,SETBLOCK ; 4Ah + 12559 + 12560 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12561 %if 0 + 12562 int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK) + 12563 ; ES = segment address of block to change + 12564 ; BX = new size in paragraphs + 12565 %else + 12566 000009E1 E8D6FB call int_21h_indirect + 12567 %endif + 12568 + 12569 000009E4 07 pop es + 12570 000009E5 06 push es + 12571 000009E6 1F pop ds ; Simply batch FCB setup + 12572 000009E7 833E[A502]FF cmp word [SingleCom],-1 ; 0FFFFh + 12573 000009EC 7506 jne short NOBATSING + 12574 000009EE C706[A502]F0FF mov word [SingleCom],0FFF0h ; Flag single command BATCH job + 12575 + 12576 NOBATSING: + 12577 + 12578 ; Enter the batch file with the current echo state + 12579 + 12580 000009F4 58 pop ax ; Get original echo state + 12581 000009F5 A2[9D02] mov [EchoFlag],al ; restore it + 12582 000009F8 E909F7 jmp TCOMMAND + 12583 + 12584 ; The following is executed if there isn't enough memory for batch segment + 12585 + 12586 NO_MEMORY: + 12587 000009FB 5A pop dx ; even up our stack + 12588 000009FC 58 pop ax + 12589 000009FD 58 pop ax + 12590 000009FE E823FE call ALLOC_TPA ; reallocate memory + 12591 + 12592 ; 12/02/2023 + 12593 ; MSDOS 3.3 + 12594 ;mov dx,INSFMEMMESPTR + 12595 ;jmp CERROR + 12596 + 12597 ; MSDOS 6.0 + 12598 ;mov byte [msg_disp_class],1 + 12599 00000A01 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 12600 ;AN000; set up extended error msg class + 12601 ;mov dx,offset TranGroup:Extend_Buf_ptr + 12602 00000A06 BA[D78F] mov dx,extend_buf_ptr + 12603 ; ;AC000; get extended message pointer + 12604 ;mov word [extend_buf_ptr],8 + 12605 00000A09 C706[D78F]0800 mov word [extend_buf_ptr],ERROR_NOT_ENOUGH_MEMORY + 12606 ;AN000; get message number in control block + 12607 00000A0F E91423 jmp cerror ;g print error message and go... + 12608 + 12609 ; =============== S U B R O U T I N E ======================================= + 12610 + 12611 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12612 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 12613 BATCHOFF: + 12614 00000A12 50 push ax + 12615 00000A13 06 push es + 12616 00000A14 1E push ds + 12617 00000A15 53 push bx + 12618 + 12619 00000A16 2E8E06[F59B] mov es,[cs:RESSEG] + 12620 ;mov ds,[cs:RESSEG] + 12621 ; 26/07/2024 + 12622 00000A1B 06 push es + 12623 00000A1C 1F pop ds + 12624 + 12625 00000A1D A1[4902] mov ax,[Batch] ; Free the batch segment + 12626 00000A20 09C0 or ax,ax + 12627 00000A22 7443 jz short NOTFREE + 12628 + 12629 00000A24 06 push es + 12630 00000A25 8EC0 mov es,ax + 12631 00000A27 F606[9D02]01 test byte [EchoFlag],1 + 12632 ;G Is echo on? + 12633 00000A2C 7505 jnz short ECHO_LAST_LINE + 12634 ;G Yes - echo last line in file + 12635 ;mov byte [SUPPRESS],0 + 12636 00000A2E C606[9E02]00 mov byte [Suppress],NO_ECHO + 12637 ;G no - don't echo last line in file + 12638 ECHO_LAST_LINE: + 12639 ;mov bl,[es:1] + 12640 00000A33 268A1E0100 mov bl,[es:BATCHSEGMENT.BatEchoFlag] + 12641 ; G get echo state + 12642 00000A38 881E[9D02] mov [EchoFlag],bl + 12643 ; G and restore it + 12644 ;;mov bx,[es:4] ; MSDOS 3.3 + 12645 ;mov bx,[es:5] ; MSDOS 6.0 + 12646 00000A3C 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] + 12647 ;G Get FOR segment + 12648 00000A41 891E[AC02] mov [ForPtr],bx ;G and restore it + 12649 ;;mov bl,[es:6] ; MSDOS 3.3 + 12650 ;mov bl,[es:7] ; MSDOS 6.0 + 12651 00000A45 268A1E0700 mov bl,[es:BATCHSEGMENT.BatForFlag] + 12652 ;G Get FOR flag + 12653 00000A4A 881E[AB02] mov [ForFlag],bl + 12654 ;G and restore it + 12655 ;;mov bx,[es:2] ; MSDOS 3.3 + 12656 ;mov bx,[es:3] ; MSDOS 6.0 + 12657 00000A4E 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] + 12658 ;G Get old batch segment + 12659 00000A53 B449 mov ah,49h + 12660 ;mov ah,DEALLOC ; 49h + 12661 + 12662 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12663 %if 0 + 12664 int 21h ; DOS - 2+ - FREE MEMORY + 12665 ; ES = segment address of area to be freed + 12666 %else + 12667 00000A55 E862FB call int_21h_indirect + 12668 %endif + 12669 + 12670 00000A58 07 pop es + 12671 00000A59 891E[B202] mov [Next_Batch],bx ;G reset batch segment + 12672 00000A5D 26FF0E[AE02] dec word [es:Nest] + 12673 00000A62 31C0 xor ax,ax + 12674 00000A64 A3[4902] mov [Batch],ax ; No batch in progress + 12675 NOTFREE: + 12676 00000A67 5B pop bx + 12677 00000A68 1F pop ds + 12678 00000A69 07 pop es + 12679 00000A6A 58 pop ax + 12680 00000A6B C3 retn + 12681 + 12682 ; =============== S U B R O U T I N E ======================================= + 12683 + 12684 ; 12/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12685 + 12686 ; StrCpy - copy string, checking count in CX against COMBUFLEN + 12687 ; Entry : DS:SI ==> source string + 12688 ; ES:DI ==> destination string + 12689 ; CX = current length of destination string + 12690 ; Exit : string copied, CX updated, Carry set if length limit exceeded + 12691 + 12692 ; 12/02/2023 + 12693 ; MSDOS 3.3 + 12694 ;STRCPY: + 12695 ;push ax + 12696 ;CCYCLE: + 12697 ;lodsb + 12698 ;stosb + 12699 ;or al,al + 12700 ;jnz short CCYCLE + 12701 ;pop ax + 12702 ;retn + 12703 + 12704 ;Procedure StrCpy,NEAR + 12705 + 12706 ; 12/02/2023 + 12707 ; MSDOS 6.0 + 12708 STRCPY: + 12709 00000A6C 50 push ax + 12710 ccycle: + 12711 00000A6D AC lodsb + 12712 00000A6E 41 inc cx + 12713 ;cmp cx,128 + 12714 00000A6F 81F98000 cmp cx,COMBUFLEN + 12715 ;jb short ccopy + 12716 ;stc ; set carry to signal error + 12717 ;jmp short ccend + 12718 ; 12/02/2023 + 12719 00000A73 F5 cmc + 12720 00000A74 7205 jc short ccend + 12721 ccopy: + 12722 00000A76 AA stosb + 12723 00000A77 08C0 or al,al + 12724 00000A79 75F2 jnz short ccycle + 12725 ccend: + 12726 00000A7B 49 dec cx ; discount extra byte + 12727 00000A7C 4F dec di ; back up pointer + 12728 00000A7D 58 pop ax + 12729 00000A7E C3 retn ; return carry clear + 12730 + 12731 ;EndProc StrCpy + 12732 + 12733 ;============================================================================ + 12734 ; TBATCH2.ASM, MSDOS 6.0, 1991 + 12735 ;============================================================================ + 12736 ; 12/10/2018 - Retro DOS v3.0 + 12737 + 12738 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0892h + 12739 + 12740 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 12741 + 12742 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 0977h + 12743 + 12744 ; =============== S U B R O U T I N E ======================================= + 12745 + 12746 ;Break + 12747 + 12748 ; Get one byte from the batch file and return it in AL. End-of-file returns + 12749 ; and ends batch mode. DS must be set to resident segment. + 12750 ; AH, DX destroyed. 12751 - 12752 GETBATBYT: - 12753 00000A7F 53 push bx - 12754 00000A80 51 push cx - 12755 00000A81 1E push ds - 12756 00000A82 F606[9302]FF test byte [Batch_Abort],-1 - 12757 ;jnz short BATEOF - 12758 ; 14/02/2023 - 12759 00000A87 7403 jz short getbatbyt1 - 12760 00000A89 E9D200 jmp BATEOF - 12761 getbatbyt1: - 12762 00000A8C F706[4902]FFFF test word [Batch],-1 - 12763 ;jz short BATEOF - 12764 ; 14/02/2023 - 12765 00000A92 7503 jnz short getbatbyt2 - 12766 00000A94 E9C700 jmp BATEOF - 12767 getbatbyt2: - 12768 00000A97 06 push es - 12769 00000A98 8E06[4902] mov es,[Batch] - 12770 - 12771 ; MSDOS 6.0 - 12772 ;M020; - 12773 ;Check if we have already reached EOF (BatchEOF flag set. Then, we do not - 12774 ;try to read from the batchfile again. - 12775 - 12776 ;cmp byte [es:2],0 - 12777 00000A9C 26803E020000 cmp byte [es:BATCHSEGMENT.BatchEOF],0 - 12778 ;already reached EOF? ;M020 - 12779 00000AA2 7403 jz short not_eof ;no, read batch file ;M020 - 12780 00000AA4 E99D00 jmp At_EOF ;yes, no more reads ;M020 - 12781 not_eof: ;M020 - 12782 ; MSDOS 3.3 (& MSDOS 6.0) - 12783 ;add word [es:8],1 ; MSDOS 6.0 - 12784 00000AA7 268306080001 add word [es:BATCHSEGMENT.BatSeek],1 - 12785 ;adc word [es:10],0 ; MSDOS 6.0 - 12786 00000AAD 2683160A0000 adc word [es:BATCHSEGMENT.BatSeek+2],0 - 12787 00000AB3 07 pop es - 12788 - 12789 ; See if we have bytes buffered... - 12790 - 12791 00000AB4 8CC8 mov ax,cs - 12792 00000AB6 8ED8 mov ds,ax - 12793 00000AB8 8B1E[C7A5] mov bx,[BATBUFPOS] - 12794 00000ABC 83FBFF cmp bx,-1 - 12795 00000ABF 7541 jnz short UNBUF - 12796 - 12797 ; There are no bytes in the buffer. Let's try to fill it up. - 12798 - 12799 00000AC1 BA[C9A5] mov dx,BATBUF - 12800 00000AC4 8B0E[E495] mov cx,[BATBUFLEN] ; max to read. - 12801 00000AC8 8B1E[F49E] mov bx,[BATHAND] - 12802 ; 14/02/2023 - 12803 00000ACC B43F mov ah,3Fh - 12804 ;mov ah,READ ; 3Fh ; Get one more byte from batch file - 12805 - 12806 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM - 12807 %if 0 - 12808 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE - 12809 ; BX = file handle,CX = number of bytes to read - 12810 ; DS:DX -> buffer - 12811 %else - 12812 00000ACE E8E9FA call int_21h_indirect - 12813 %endif - 12814 - 12815 ; MSDOS 6.0 - 12816 00000AD1 7321 jnc short bat_read_ok ;AN022; if no error - continue - 12817 ;invoke get_ext_error_number ;AN022; get the error - 12818 00000AD3 E87515 call get_ext_error_number - 12819 00000AD6 1E push ds ;AN022; save local segment - 12820 00000AD7 8E1E[F59B] mov ds,[RESSEG] ;AN022; get resident segment - 12821 ;assume ds:resgroup ;AN022; - 12822 00000ADB 89C2 mov dx,ax ;AN022; put error in DX - 12823 ;invoke output_batch_name ;AN022; set up to print the error - 12824 00000ADD E857FB call output_batch_name - 12825 00000AE0 1F pop ds ;AN022; - 12826 ;assume ds:trangroup ;AN022; - 12827 ;invoke std_eprintf ;AN022; print out the error - 12828 00000AE1 E83C49 call std_eprintf - 12829 ;mov byte ptr combuf+2,end_of_line_in - 12830 00000AE4 C606[569A]0D mov byte [COMBUF+2],END_OF_LINE_IN ; 0Dh - 12831 ; ;AN022; terminate the batch line for parsing - 12832 ;mov byte ptr combuf+3,end_of_line_out - 12833 00000AE9 C606[579A]00 mov byte [COMBUF+3],END_OF_LINE_OUT ; 0 - 12834 ; ;AN022; terminate the batch line for output - 12835 ;M020; - 12836 ;Old bug! We jump to BatEof from here without ds=RESGROUP. Probably, this - 12837 ;error is never hit (and it shouldn't be) - 12838 - 12839 00000AEE 8E1E[F59B] mov ds,[RESSEG] ; ds = RESGROUP ; M020 - 12840 00000AF2 EB6A jmp short BATEOF ;AN022; terminate the batch file - 12841 bat_read_ok: ;AN022; - 12842 ; MSDOS 3.3 (& MSDOS 6.0) - 12843 00000AF4 89C1 mov cx,ax - 12844 ;jcxz TURN_OFF ; MSDOS 3.3 - 12845 ; 14/02/2023 - 12846 00000AF6 E320 jcxz BATEOFDS ; MSDOS 6.0 - 12847 00000AF8 890E[E9A5] mov [BATBUFEND],cx - 12848 00000AFC 31DB xor bx,bx - 12849 00000AFE 891E[C7A5] mov [BATBUFPOS],bx - 12850 - 12851 ; Buffered bytes! - 12852 UNBUF: - 12853 00000B02 8A87[C9A5] mov al,[BATBUF+bx] ; get next byte - 12854 00000B06 43 inc bx - 12855 00000B07 3B1E[E9A5] cmp bx,[BATBUFEND] ; beyond end of buffer? - 12856 00000B0B 7203 jb short SETBUFPOS - 12857 00000B0D BBFFFF mov bx,-1 - 12858 SETBUFPOS: - 12859 00000B10 891E[C7A5] mov [BATBUFPOS],bx - 12860 00000B14 3C1A cmp al,1Ah ; ^Z for termination? - 12861 00000B16 7575 jne short GETBYTEDONE - 12862 - 12863 ;We get here only when we hit an EOF - 12864 - 12865 ; MSDOS 6.0 - 12866 BATEOFDS: - 12867 ;SR; - 12868 ; HACK!!! A massive hack being put in here to get batch processing to work - 12869 ;properly on EOF. Previously, a CR was returned and batch processing turned - 12870 ;off the moment we hit an EOF. Unfortunately, if the last line had no CR-LF, - 12871 ;batch processing is turned off before the last line is processed and so - 12872 ;this line would never be executed. - 12873 ; To fix this, a new flag BatchEOF has been introduced. This flag is - 12874 ;set to 4 if there is no CR-LF before the EOF -- this is determined by looking - 12875 ;at the buffer contents. If there is no LF ( we assume that presence of LF - 12876 ;indicated a CR-LF combination), then we set BatchEOF to 4 and return a - 12877 ;fake CR to the caller. This decrements BatchEOF. On the next call to this - 12878 ;routine, BatchEOF is decremented to 2 and a fake lF is returned. On the - 12879 ;third call, BatchEOF becomes zero and batch processing is turned off, - 12880 ;now that the last line has been processed. If the EOF is the first char read into the buffer - 12881 ;during this call, and there was a CR-LF previously, we are going to fake - 12882 ;another redundant CR-LF. There is no work-around I can think of. - 12883 ; I would love to restructure this entire routine and its caller to - 12884 ;make the flow really easy to understand but I guess this will have to wait. - 12885 ; - 12886 00000B18 06 push es - 12887 00000B19 8E06[F59B] mov es,[RESSEG] - 12888 ;SR; - 12889 ; If we had already set the BatchEOF flag on a previous call (BatchEOF == 2 - 12890 ;or BatchEOF == 1 now), then do not do the LF check. - 12891 ; - 12892 00000B1D 268E06[4902] mov es,[es:Batch] - 12893 ;cmp byte [es:2],0 - 12894 00000B22 26803E020000 cmp byte [es:BATCHSEGMENT.BatchEOF],0 - 12895 00000B28 7516 jnz short crpresent - 12896 - 12897 ;inc byte [es:2] - 12898 00000B2A 26FE060200 inc byte [es:BATCHSEGMENT.BatchEOF] - 12899 ;match the dec following - 12900 00000B2F 8B1E[E9A5] mov bx,[BATBUFEND] - 12901 00000B33 80BF[C8A5]0A cmp byte [bx+BATBUF-1],0Ah ;was a LF present? - 12902 00000B38 7406 je short crpresent ;yes, no need to fake it - 12903 - 12904 ;add byte [es:2],3 - 12905 00000B3A 268006020003 add byte [es:BATCHSEGMENT.BatchEOF],3 - 12906 ;BatchEOF == 4 to fake CR-LF - 12907 crpresent: - 12908 ;; ;pop es - 12909 - 12910 ;ASSUME DS:TranGroup - 12911 ; 14/02/2023 - 12912 00000B40 8E1E[F59B] mov ds,[RESSEG] - 12913 ;ASSUME DS:ResGroup - 12914 ;SR; - 12915 ; The shift operation is done here to replace the decrement. This is because - 12916 ;we can jump to this label directly from above when bogus calls are made to - 12917 ;this routine even after batch processing is turned off. The shift ensures - 12918 ;maintains the following invariance : 4 -> 2; 2 -> 1 ; 1 -> 0; 0 -> 0. Thus, - 12919 ;it is used as a decrement and also as a NOP to just fall through on bogus - 12920 ;calls. - 12921 ; We turn batch processing off if BatchEOF == 1 or BatchEOF == 0. - 12922 ;BatchEOF == 1 when we fall through from BatEOFDS and BatchEOF == 0 on a - 12923 ;direct jump to BATEOF. If BatchEOF == 4, we return a fake CR-LF without - 12924 ;turning batch processing off. - 12925 - 12926 At_EOF: ;new label added ;M020 - 12927 ;shr byte [es:2],1 - 12928 00000B44 26D02E0200 shr byte [es:BATCHSEGMENT.BatchEOF],1 - 12929 ;decrement the flag - 12930 00000B49 7412 jz short turn_off ;zero,turn batch off - 12931 ;cmp byte [es:2],1 - 12932 00000B4B 26803E020001 cmp byte [es:BATCHSEGMENT.BatchEOF],1 - 12933 00000B51 7405 jz short ret_lf ;BatchEOF was 2, return LF - 12934 ; - 12935 ;BatchEOF == 4, indicates return fake CR now and fake LF next. - 12936 ; - 12937 00000B53 B00D mov al,0Dh ;return fake CR. - 12938 00000B55 07 pop es - 12939 00000B56 EB35 jmp short GETBYTEDONE - 12940 ret_lf: - 12941 00000B58 B00A mov al,0Ah ;return fake LF - 12942 00000B5A 07 pop es - 12943 00000B5B EB30 jmp short GETBYTEDONE - 12944 turn_off: - 12945 00000B5D 07 pop es - 12946 ;BATEOF: - 12947 ; MSDOS 3.3 - 12948 ;TURN_OFF: - 12949 ;mov ds,[RESSEG] - 12950 - 12951 ; MSDOS 3.3 (& MSDOS 6.0) - 12952 BATEOF: - 12953 00000B5E E8B1FE call BATCHOFF - 12954 00000B61 E8CC02 call BATCLOSE - 12955 - 12956 ;;; mov BatchEOF,0 ;make sure BatchEOF = 0 - 12957 - 12958 ;SR; BugBug - 12959 ; There is a good reason why this carriage return is being returned here. - 12960 ;This was part of the old code, thanks to some brain-damaged coding. Because, - 12961 ;of the way the caller is structured, a fake CR has to be returned again on - 12962 ;EOF to ensure the termination of the caller's loop. If echo is on, this - 12963 ;results in an extra linefeed after the batchfile is run if the last line of - 12964 ;the batchfile already had a CR-LF. - 12965 ;NB: Do not confuse this with the faked CR. The fake CR-LF was to mark - 12966 ;the end-of-line. This CR is to mark the end-of-file. - 12967 - 12968 00000B64 B00D mov al,0Dh ; If end-of-file, then end of line - 12969 00000B66 F606[9302]FF test byte [Batch_Abort],-1 - 12970 00000B6B C606[9302]00 mov byte [Batch_Abort],0 - 12971 00000B70 7407 jz short CONT_GET_BYT - 12972 00000B72 BF[569A] mov di,COMBUF+2 ; reset pointer to beginning of buffer - 12973 00000B75 31C9 xor cx,cx ; zero line length - 12974 00000B77 EB14 jmp short GETBYTEDONE - 12975 CONT_GET_BYT: - 12976 00000B79 833E[A502]F0 cmp word [SingleCom],0FFF0h ; See if we need to set SINGLECOM - 12977 00000B7E 750D jne short GETBYTEDONE - 12978 00000B80 833E[AE02]00 cmp word [Nest],0 ;G See if we have nested batch files - 12979 00000B85 7506 jnz short GETBYTEDONE ;G Yes - don't exit just yet - 12980 00000B87 C706[A502]FFFF mov word [SingleCom],0FFFFh ; -1 ; Cause termination - 12981 GETBYTEDONE: - 12982 00000B8D 1F pop ds - 12983 00000B8E 59 pop cx - 12984 00000B8F 5B pop bx - 12985 00000B90 C3 retn - 12986 - 12987 ; --------------------------------------------------------------------------- - 12988 - 12989 ;break <$If - conditional execution> - 12990 - 12991 ; 17/04/2023 - 12992 ;IFERRORP: - 12993 ; pop ax - 12994 ;IFERROR: - 12995 ; ; 14/02/2023 - Retro DOS v4.0 COMMAND.COM - 12996 ;FORERROR: - 12997 ; mov dx,SYNTMES_PTR - 12998 ; jmp cerror - 12999 - 13000 ; --------------------------------------------------------------------------- - 13001 - 13002 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13003 ; - 13004 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 13005 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0B69h - 13006 - 13007 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 13008 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0BAEh - 13009 _$IF: - 13010 ; MSDOS 6.0 - 13011 ; Turn off any pipes in progress. - 13012 00000B91 1E push ds ;AN004; save local DS - 13013 00000B92 8E1E[F59B] mov ds,[RESSEG] ;AN004; get resident segment - 13014 ;assume ds:resgroup ;AN004; - 13015 00000B96 803E[1403]00 cmp byte [PipeFiles],0 ;AN004; Only turn off if present. - 13016 00000B9B 7403 jz short IFNoPipe ;AN004; no pipe - continue - 13017 ;invoke PipeDel ;AN004; turn off piping - 13018 00000B9D E88025 call PIPEDEL - 13019 IFNoPipe: ;AN004; - 13020 00000BA0 1F pop ds ;AN004; get local DS back - 13021 ;assume ds:trangroup ;AN004; - 13022 - 13023 ; MSDOS 3.3 (&MSDOS 6.0) - 13024 00000BA1 C606[069C]00 mov byte [IFNOTFLAG],0 - 13025 00000BA6 C706[9CA4]0000 mov word [IF_NOT_COUNT],0 - 13026 00000BAC BE8100 mov si,81h - 13027 IFREENT: - 13028 00000BAF E8D41D call scanoff - 13029 00000BB2 3C0D cmp al,0Dh - 13030 00000BB4 743C je short IFERROR - 13031 00000BB6 89F5 mov bp,si - 13032 00000BB8 BF[3394] mov di,IFTAB ; Prepare to search if table - 13033 ;mov ch,0 - 13034 ; 17/04/2023 - 13035 00000BBB 30ED xor ch,ch - 13036 IFINDCOM: - 13037 00000BBD 89EE mov si,bp - 13038 00000BBF 8A0D mov cl,[di] - 13039 00000BC1 47 inc di - 13040 00000BC2 E33E jcxz IFSTRING - 13041 00000BC4 EB02 jmp short FIRSTCOMP - 13042 IFCOMP: - 13043 00000BC6 7510 jnz short IF_DIF - 13044 FIRSTCOMP: - 13045 00000BC8 AC lodsb - 13046 00000BC9 268A25 mov ah,[es:di] - 13047 00000BCC 47 inc di - 13048 00000BCD 38E0 cmp al,ah - 13049 00000BCF 7405 je short IFLP - 13050 00000BD1 80CC20 or ah,20h ; Try lower case - 13051 00000BD4 38E0 cmp al,ah - 13052 IFLP: - 13053 00000BD6 E2EE loop IFCOMP - 13054 IF_DIF: - 13055 00000BD8 9F lahf - 13056 00000BD9 01CF add di,cx ; Bump to next position without affecting flags - 13057 00000BDB 8B1D mov bx,[di] ; Get handler address - 13058 00000BDD 47 inc di - 13059 00000BDE 47 inc di - 13060 00000BDF 9E sahf - 13061 00000BE0 75DB jnz short IFINDCOM - 13062 00000BE2 AC lodsb - 13063 00000BE3 3C0D cmp al,0Dh - 13064 IFERRJ: - 13065 00000BE5 740B jz short IFERROR - 13066 00000BE7 E8A41D call DELIM - 13067 00000BEA 75D1 jnz short IFINDCOM - 13068 00000BEC E8971D call scanoff - 13069 00000BEF FFE3 jmp bx - 13070 - 13071 ; 17/04/2023 - 13072 IFERRORP: - 13073 00000BF1 58 pop ax - 13074 IFERROR: - 13075 ; 14/02/2023 - Retro DOS v4.0 COMMAND.COM - 13076 FORERROR: - 13077 00000BF2 BA[AA90] mov dx,SYNTMES_PTR - 13078 00000BF5 E92E21 jmp cerror - 13079 - 13080 IFNOT: - 13081 00000BF8 F616[069C] not byte [IFNOTFLAG] - 13082 00000BFC FF06[9CA4] inc word [IF_NOT_COUNT] - 13083 00000C00 EBAD jmp short IFREENT - 13084 - 13085 ; We are comparing two strings for equality. First, find the end of the - 13086 ; first string. + 12752 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 12753 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 0A95h + 12754 + 12755 GETBATBYT: + 12756 00000A7F 53 push bx + 12757 00000A80 51 push cx + 12758 00000A81 1E push ds + 12759 00000A82 F606[9302]FF test byte [Batch_Abort],-1 + 12760 ;jnz short BATEOF + 12761 ; 14/02/2023 + 12762 00000A87 7403 jz short getbatbyt1 + 12763 00000A89 E9D200 jmp BATEOF + 12764 getbatbyt1: + 12765 00000A8C F706[4902]FFFF test word [Batch],-1 + 12766 ;jz short BATEOF + 12767 ; 14/02/2023 + 12768 00000A92 7503 jnz short getbatbyt2 + 12769 00000A94 E9C700 jmp BATEOF + 12770 getbatbyt2: + 12771 00000A97 06 push es + 12772 00000A98 8E06[4902] mov es,[Batch] + 12773 + 12774 ; MSDOS 6.0 + 12775 ;M020; + 12776 ;Check if we have already reached EOF (BatchEOF flag set. Then, we do not + 12777 ;try to read from the batchfile again. + 12778 + 12779 ;cmp byte [es:2],0 + 12780 00000A9C 26803E020000 cmp byte [es:BATCHSEGMENT.BatchEOF],0 + 12781 ;already reached EOF? ;M020 + 12782 00000AA2 7403 jz short not_eof ;no, read batch file ;M020 + 12783 00000AA4 E99D00 jmp At_EOF ;yes, no more reads ;M020 + 12784 not_eof: ;M020 + 12785 ; MSDOS 3.3 (& MSDOS 6.0) + 12786 ;add word [es:8],1 ; MSDOS 6.0 + 12787 00000AA7 268306080001 add word [es:BATCHSEGMENT.BatSeek],1 + 12788 ;adc word [es:10],0 ; MSDOS 6.0 + 12789 00000AAD 2683160A0000 adc word [es:BATCHSEGMENT.BatSeek+2],0 + 12790 00000AB3 07 pop es + 12791 + 12792 ; See if we have bytes buffered... + 12793 + 12794 00000AB4 8CC8 mov ax,cs + 12795 00000AB6 8ED8 mov ds,ax + 12796 00000AB8 8B1E[C7A5] mov bx,[BATBUFPOS] + 12797 00000ABC 83FBFF cmp bx,-1 + 12798 00000ABF 7541 jnz short UNBUF + 12799 + 12800 ; There are no bytes in the buffer. Let's try to fill it up. + 12801 + 12802 00000AC1 BA[C9A5] mov dx,BATBUF + 12803 00000AC4 8B0E[E495] mov cx,[BATBUFLEN] ; max to read. + 12804 00000AC8 8B1E[F49E] mov bx,[BATHAND] + 12805 ; 14/02/2023 + 12806 00000ACC B43F mov ah,3Fh + 12807 ;mov ah,READ ; 3Fh ; Get one more byte from batch file + 12808 + 12809 ; 26/07/2024 - PCDOS 7.1 COMMAND.COM + 12810 %if 0 + 12811 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE + 12812 ; BX = file handle,CX = number of bytes to read + 12813 ; DS:DX -> buffer + 12814 %else + 12815 00000ACE E8E9FA call int_21h_indirect + 12816 %endif + 12817 + 12818 ; MSDOS 6.0 + 12819 00000AD1 7321 jnc short bat_read_ok ;AN022; if no error - continue + 12820 ;invoke get_ext_error_number ;AN022; get the error + 12821 00000AD3 E87515 call get_ext_error_number + 12822 00000AD6 1E push ds ;AN022; save local segment + 12823 00000AD7 8E1E[F59B] mov ds,[RESSEG] ;AN022; get resident segment + 12824 ;assume ds:resgroup ;AN022; + 12825 00000ADB 89C2 mov dx,ax ;AN022; put error in DX + 12826 ;invoke output_batch_name ;AN022; set up to print the error + 12827 00000ADD E857FB call output_batch_name + 12828 00000AE0 1F pop ds ;AN022; + 12829 ;assume ds:trangroup ;AN022; + 12830 ;invoke std_eprintf ;AN022; print out the error + 12831 00000AE1 E83C49 call std_eprintf + 12832 ;mov byte ptr combuf+2,end_of_line_in + 12833 00000AE4 C606[569A]0D mov byte [COMBUF+2],END_OF_LINE_IN ; 0Dh + 12834 ; ;AN022; terminate the batch line for parsing + 12835 ;mov byte ptr combuf+3,end_of_line_out + 12836 00000AE9 C606[579A]00 mov byte [COMBUF+3],END_OF_LINE_OUT ; 0 + 12837 ; ;AN022; terminate the batch line for output + 12838 ;M020; + 12839 ;Old bug! We jump to BatEof from here without ds=RESGROUP. Probably, this + 12840 ;error is never hit (and it shouldn't be) + 12841 + 12842 00000AEE 8E1E[F59B] mov ds,[RESSEG] ; ds = RESGROUP ; M020 + 12843 00000AF2 EB6A jmp short BATEOF ;AN022; terminate the batch file + 12844 bat_read_ok: ;AN022; + 12845 ; MSDOS 3.3 (& MSDOS 6.0) + 12846 00000AF4 89C1 mov cx,ax + 12847 ;jcxz TURN_OFF ; MSDOS 3.3 + 12848 ; 14/02/2023 + 12849 00000AF6 E320 jcxz BATEOFDS ; MSDOS 6.0 + 12850 00000AF8 890E[E9A5] mov [BATBUFEND],cx + 12851 00000AFC 31DB xor bx,bx + 12852 00000AFE 891E[C7A5] mov [BATBUFPOS],bx + 12853 + 12854 ; Buffered bytes! + 12855 UNBUF: + 12856 00000B02 8A87[C9A5] mov al,[BATBUF+bx] ; get next byte + 12857 00000B06 43 inc bx + 12858 00000B07 3B1E[E9A5] cmp bx,[BATBUFEND] ; beyond end of buffer? + 12859 00000B0B 7203 jb short SETBUFPOS + 12860 00000B0D BBFFFF mov bx,-1 + 12861 SETBUFPOS: + 12862 00000B10 891E[C7A5] mov [BATBUFPOS],bx + 12863 00000B14 3C1A cmp al,1Ah ; ^Z for termination? + 12864 00000B16 7575 jne short GETBYTEDONE + 12865 + 12866 ;We get here only when we hit an EOF + 12867 + 12868 ; MSDOS 6.0 + 12869 BATEOFDS: + 12870 ;SR; + 12871 ; HACK!!! A massive hack being put in here to get batch processing to work + 12872 ;properly on EOF. Previously, a CR was returned and batch processing turned + 12873 ;off the moment we hit an EOF. Unfortunately, if the last line had no CR-LF, + 12874 ;batch processing is turned off before the last line is processed and so + 12875 ;this line would never be executed. + 12876 ; To fix this, a new flag BatchEOF has been introduced. This flag is + 12877 ;set to 4 if there is no CR-LF before the EOF -- this is determined by looking + 12878 ;at the buffer contents. If there is no LF ( we assume that presence of LF + 12879 ;indicated a CR-LF combination), then we set BatchEOF to 4 and return a + 12880 ;fake CR to the caller. This decrements BatchEOF. On the next call to this + 12881 ;routine, BatchEOF is decremented to 2 and a fake lF is returned. On the + 12882 ;third call, BatchEOF becomes zero and batch processing is turned off, + 12883 ;now that the last line has been processed. If the EOF is the first char read into the buffer + 12884 ;during this call, and there was a CR-LF previously, we are going to fake + 12885 ;another redundant CR-LF. There is no work-around I can think of. + 12886 ; I would love to restructure this entire routine and its caller to + 12887 ;make the flow really easy to understand but I guess this will have to wait. + 12888 ; + 12889 00000B18 06 push es + 12890 00000B19 8E06[F59B] mov es,[RESSEG] + 12891 ;SR; + 12892 ; If we had already set the BatchEOF flag on a previous call (BatchEOF == 2 + 12893 ;or BatchEOF == 1 now), then do not do the LF check. + 12894 ; + 12895 00000B1D 268E06[4902] mov es,[es:Batch] + 12896 ;cmp byte [es:2],0 + 12897 00000B22 26803E020000 cmp byte [es:BATCHSEGMENT.BatchEOF],0 + 12898 00000B28 7516 jnz short crpresent + 12899 + 12900 ;inc byte [es:2] + 12901 00000B2A 26FE060200 inc byte [es:BATCHSEGMENT.BatchEOF] + 12902 ;match the dec following + 12903 00000B2F 8B1E[E9A5] mov bx,[BATBUFEND] + 12904 00000B33 80BF[C8A5]0A cmp byte [bx+BATBUF-1],0Ah ;was a LF present? + 12905 00000B38 7406 je short crpresent ;yes, no need to fake it + 12906 + 12907 ;add byte [es:2],3 + 12908 00000B3A 268006020003 add byte [es:BATCHSEGMENT.BatchEOF],3 + 12909 ;BatchEOF == 4 to fake CR-LF + 12910 crpresent: + 12911 ;; ;pop es + 12912 + 12913 ;ASSUME DS:TranGroup + 12914 ; 14/02/2023 + 12915 00000B40 8E1E[F59B] mov ds,[RESSEG] + 12916 ;ASSUME DS:ResGroup + 12917 ;SR; + 12918 ; The shift operation is done here to replace the decrement. This is because + 12919 ;we can jump to this label directly from above when bogus calls are made to + 12920 ;this routine even after batch processing is turned off. The shift ensures + 12921 ;maintains the following invariance : 4 -> 2; 2 -> 1 ; 1 -> 0; 0 -> 0. Thus, + 12922 ;it is used as a decrement and also as a NOP to just fall through on bogus + 12923 ;calls. + 12924 ; We turn batch processing off if BatchEOF == 1 or BatchEOF == 0. + 12925 ;BatchEOF == 1 when we fall through from BatEOFDS and BatchEOF == 0 on a + 12926 ;direct jump to BATEOF. If BatchEOF == 4, we return a fake CR-LF without + 12927 ;turning batch processing off. + 12928 + 12929 At_EOF: ;new label added ;M020 + 12930 ;shr byte [es:2],1 + 12931 00000B44 26D02E0200 shr byte [es:BATCHSEGMENT.BatchEOF],1 + 12932 ;decrement the flag + 12933 00000B49 7412 jz short turn_off ;zero,turn batch off + 12934 ;cmp byte [es:2],1 + 12935 00000B4B 26803E020001 cmp byte [es:BATCHSEGMENT.BatchEOF],1 + 12936 00000B51 7405 jz short ret_lf ;BatchEOF was 2, return LF + 12937 ; + 12938 ;BatchEOF == 4, indicates return fake CR now and fake LF next. + 12939 ; + 12940 00000B53 B00D mov al,0Dh ;return fake CR. + 12941 00000B55 07 pop es + 12942 00000B56 EB35 jmp short GETBYTEDONE + 12943 ret_lf: + 12944 00000B58 B00A mov al,0Ah ;return fake LF + 12945 00000B5A 07 pop es + 12946 00000B5B EB30 jmp short GETBYTEDONE + 12947 turn_off: + 12948 00000B5D 07 pop es + 12949 ;BATEOF: + 12950 ; MSDOS 3.3 + 12951 ;TURN_OFF: + 12952 ;mov ds,[RESSEG] + 12953 + 12954 ; MSDOS 3.3 (& MSDOS 6.0) + 12955 BATEOF: + 12956 00000B5E E8B1FE call BATCHOFF + 12957 00000B61 E8CC02 call BATCLOSE + 12958 + 12959 ;;; mov BatchEOF,0 ;make sure BatchEOF = 0 + 12960 + 12961 ;SR; BugBug + 12962 ; There is a good reason why this carriage return is being returned here. + 12963 ;This was part of the old code, thanks to some brain-damaged coding. Because, + 12964 ;of the way the caller is structured, a fake CR has to be returned again on + 12965 ;EOF to ensure the termination of the caller's loop. If echo is on, this + 12966 ;results in an extra linefeed after the batchfile is run if the last line of + 12967 ;the batchfile already had a CR-LF. + 12968 ;NB: Do not confuse this with the faked CR. The fake CR-LF was to mark + 12969 ;the end-of-line. This CR is to mark the end-of-file. + 12970 + 12971 00000B64 B00D mov al,0Dh ; If end-of-file, then end of line + 12972 00000B66 F606[9302]FF test byte [Batch_Abort],-1 + 12973 00000B6B C606[9302]00 mov byte [Batch_Abort],0 + 12974 00000B70 7407 jz short CONT_GET_BYT + 12975 00000B72 BF[569A] mov di,COMBUF+2 ; reset pointer to beginning of buffer + 12976 00000B75 31C9 xor cx,cx ; zero line length + 12977 00000B77 EB14 jmp short GETBYTEDONE + 12978 CONT_GET_BYT: + 12979 00000B79 833E[A502]F0 cmp word [SingleCom],0FFF0h ; See if we need to set SINGLECOM + 12980 00000B7E 750D jne short GETBYTEDONE + 12981 00000B80 833E[AE02]00 cmp word [Nest],0 ;G See if we have nested batch files + 12982 00000B85 7506 jnz short GETBYTEDONE ;G Yes - don't exit just yet + 12983 00000B87 C706[A502]FFFF mov word [SingleCom],0FFFFh ; -1 ; Cause termination + 12984 GETBYTEDONE: + 12985 00000B8D 1F pop ds + 12986 00000B8E 59 pop cx + 12987 00000B8F 5B pop bx + 12988 00000B90 C3 retn + 12989 + 12990 ; --------------------------------------------------------------------------- + 12991 + 12992 ;break <$If - conditional execution> + 12993 + 12994 ; 17/04/2023 + 12995 ;IFERRORP: + 12996 ; pop ax + 12997 ;IFERROR: + 12998 ; ; 14/02/2023 - Retro DOS v4.0 COMMAND.COM + 12999 ;FORERROR: + 13000 ; mov dx,SYNTMES_PTR + 13001 ; jmp cerror + 13002 + 13003 ; --------------------------------------------------------------------------- + 13004 + 13005 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13006 ; + 13007 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 13008 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0B69h + 13009 + 13010 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 13011 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0BAEh + 13012 _$IF: + 13013 ; MSDOS 6.0 + 13014 ; Turn off any pipes in progress. + 13015 00000B91 1E push ds ;AN004; save local DS + 13016 00000B92 8E1E[F59B] mov ds,[RESSEG] ;AN004; get resident segment + 13017 ;assume ds:resgroup ;AN004; + 13018 00000B96 803E[1403]00 cmp byte [PipeFiles],0 ;AN004; Only turn off if present. + 13019 00000B9B 7403 jz short IFNoPipe ;AN004; no pipe - continue + 13020 ;invoke PipeDel ;AN004; turn off piping + 13021 00000B9D E88025 call PIPEDEL + 13022 IFNoPipe: ;AN004; + 13023 00000BA0 1F pop ds ;AN004; get local DS back + 13024 ;assume ds:trangroup ;AN004; + 13025 + 13026 ; MSDOS 3.3 (&MSDOS 6.0) + 13027 00000BA1 C606[069C]00 mov byte [IFNOTFLAG],0 + 13028 00000BA6 C706[9CA4]0000 mov word [IF_NOT_COUNT],0 + 13029 00000BAC BE8100 mov si,81h + 13030 IFREENT: + 13031 00000BAF E8D41D call scanoff + 13032 00000BB2 3C0D cmp al,0Dh + 13033 00000BB4 743C je short IFERROR + 13034 00000BB6 89F5 mov bp,si + 13035 00000BB8 BF[3394] mov di,IFTAB ; Prepare to search if table + 13036 ;mov ch,0 + 13037 ; 17/04/2023 + 13038 00000BBB 30ED xor ch,ch + 13039 IFINDCOM: + 13040 00000BBD 89EE mov si,bp + 13041 00000BBF 8A0D mov cl,[di] + 13042 00000BC1 47 inc di + 13043 00000BC2 E33E jcxz IFSTRING + 13044 00000BC4 EB02 jmp short FIRSTCOMP + 13045 IFCOMP: + 13046 00000BC6 7510 jnz short IF_DIF + 13047 FIRSTCOMP: + 13048 00000BC8 AC lodsb + 13049 00000BC9 268A25 mov ah,[es:di] + 13050 00000BCC 47 inc di + 13051 00000BCD 38E0 cmp al,ah + 13052 00000BCF 7405 je short IFLP + 13053 00000BD1 80CC20 or ah,20h ; Try lower case + 13054 00000BD4 38E0 cmp al,ah + 13055 IFLP: + 13056 00000BD6 E2EE loop IFCOMP + 13057 IF_DIF: + 13058 00000BD8 9F lahf + 13059 00000BD9 01CF add di,cx ; Bump to next position without affecting flags + 13060 00000BDB 8B1D mov bx,[di] ; Get handler address + 13061 00000BDD 47 inc di + 13062 00000BDE 47 inc di + 13063 00000BDF 9E sahf + 13064 00000BE0 75DB jnz short IFINDCOM + 13065 00000BE2 AC lodsb + 13066 00000BE3 3C0D cmp al,0Dh + 13067 IFERRJ: + 13068 00000BE5 740B jz short IFERROR + 13069 00000BE7 E8A41D call DELIM + 13070 00000BEA 75D1 jnz short IFINDCOM + 13071 00000BEC E8971D call scanoff + 13072 00000BEF FFE3 jmp bx + 13073 + 13074 ; 17/04/2023 + 13075 IFERRORP: + 13076 00000BF1 58 pop ax + 13077 IFERROR: + 13078 ; 14/02/2023 - Retro DOS v4.0 COMMAND.COM + 13079 FORERROR: + 13080 00000BF2 BA[AA90] mov dx,SYNTMES_PTR + 13081 00000BF5 E92E21 jmp cerror + 13082 + 13083 IFNOT: + 13084 00000BF8 F616[069C] not byte [IFNOTFLAG] + 13085 00000BFC FF06[9CA4] inc word [IF_NOT_COUNT] + 13086 00000C00 EBAD jmp short IFREENT 13087 - 13088 IFSTRING: - 13089 00000C02 56 push si ; save away pointer for later compare - 13090 00000C03 31C9 xor cx,cx ; count of chars in first string - 13091 FIRST_STRING: - 13092 00000C05 AC lodsb ; get character - 13093 00000C06 3C0D cmp al,0Dh ; end of line? - 13094 00000C08 74E7 jz short IFERRORP ; yes => error - 13095 00000C0A E8811D call DELIM ; is it a delimiter? - 13096 00000C0D 7403 jz short EQUAL_CHECK ; yes, go find equal sign - 13097 00000C0F 41 inc cx ; remember 1 byte for the length - 13098 00000C10 EBF3 jmp short FIRST_STRING ; go back for more - 13099 EQUAL_CHECK: - 13100 00000C12 3C3D cmp al,'=' ; is char we have an = sign? - 13101 00000C14 7407 je short EQUAL_CHECK2 ; yes, go find second one. - 13102 00000C16 3C0D cmp al,0Dh ; end of line? - 13103 00000C18 74D7 je short IFERRORP ; yes, syntax error - 13104 00000C1A AC lodsb ; get next char - 13105 00000C1B EBF5 jmp short EQUAL_CHECK - 13106 - 13107 ; The first = has been found. The next char had better be an = too. - 13108 - 13109 EQUAL_CHECK2: - 13110 00000C1D AC lodsb ; get potential = char - 13111 00000C1E 3C3D cmp al,'=' ; is it good? - 13112 ;jnz short IFERRPJ ; no, error - 13113 ; 17/04/2023 - 13114 00000C20 75CF jne short IFERRORP - 13115 - 13116 ; Find beginning of second string. - 13117 - 13118 00000C22 E8611D call scanoff - 13119 00000C25 3C0D cmp al,0Dh - 13120 ;jz short IFERRPJ - 13121 ; 17/04/2023 - 13122 00000C27 74C8 je short IFERRORP - 13123 00000C29 5F pop di - 13124 - 13125 ; DS:SI points to second string - 13126 ; CX has number of chars in first string - 13127 ; ES:DI points to first string - 13128 - 13129 00000C2A F3A6 repe cmpsb - 13130 00000C2C 7414 jz short MATCH ; match found! + 13088 ; We are comparing two strings for equality. First, find the end of the + 13089 ; first string. + 13090 + 13091 IFSTRING: + 13092 00000C02 56 push si ; save away pointer for later compare + 13093 00000C03 31C9 xor cx,cx ; count of chars in first string + 13094 FIRST_STRING: + 13095 00000C05 AC lodsb ; get character + 13096 00000C06 3C0D cmp al,0Dh ; end of line? + 13097 00000C08 74E7 jz short IFERRORP ; yes => error + 13098 00000C0A E8811D call DELIM ; is it a delimiter? + 13099 00000C0D 7403 jz short EQUAL_CHECK ; yes, go find equal sign + 13100 00000C0F 41 inc cx ; remember 1 byte for the length + 13101 00000C10 EBF3 jmp short FIRST_STRING ; go back for more + 13102 EQUAL_CHECK: + 13103 00000C12 3C3D cmp al,'=' ; is char we have an = sign? + 13104 00000C14 7407 je short EQUAL_CHECK2 ; yes, go find second one. + 13105 00000C16 3C0D cmp al,0Dh ; end of line? + 13106 00000C18 74D7 je short IFERRORP ; yes, syntax error + 13107 00000C1A AC lodsb ; get next char + 13108 00000C1B EBF5 jmp short EQUAL_CHECK + 13109 + 13110 ; The first = has been found. The next char had better be an = too. + 13111 + 13112 EQUAL_CHECK2: + 13113 00000C1D AC lodsb ; get potential = char + 13114 00000C1E 3C3D cmp al,'=' ; is it good? + 13115 ;jnz short IFERRPJ ; no, error + 13116 ; 17/04/2023 + 13117 00000C20 75CF jne short IFERRORP + 13118 + 13119 ; Find beginning of second string. + 13120 + 13121 00000C22 E8611D call scanoff + 13122 00000C25 3C0D cmp al,0Dh + 13123 ;jz short IFERRPJ + 13124 ; 17/04/2023 + 13125 00000C27 74C8 je short IFERRORP + 13126 00000C29 5F pop di + 13127 + 13128 ; DS:SI points to second string + 13129 ; CX has number of chars in first string + 13130 ; ES:DI points to first string 13131 - 13132 ; No match. Let's find out what was wrong. The character that did not match - 13133 ; has been advanced over. Let's back up to it. + 13132 00000C2A F3A6 repe cmpsb + 13133 00000C2C 7414 jz short MATCH ; match found! 13134 - 13135 00000C2E 4E dec si - 13136 - 13137 ; If it is EOL, then syntax error - 13138 - 13139 00000C2F 803C0D cmp byte [si],0Dh - 13140 ;jz short IFERRJ - 13141 ; 17/04/2023 - 13142 00000C32 74BE je short IFERROR - 13143 - 13144 ; Advance pointer over remainder of unmatched text to next delimiter - 13145 - 13146 SKIPSTRINGEND: - 13147 00000C34 AC lodsb - 13148 NOTMATCH: - 13149 00000C35 3C0D cmp al,0Dh - 13150 IFERRORJ2: - 13151 ;jz short IFERRJ - 13152 ; 17/04/2023 - 13153 00000C37 74B9 jz short IFERROR - 13154 00000C39 E8521D call DELIM - 13155 00000C3C 75F6 jnz short SKIPSTRINGEND - 13156 - 13157 ; Signal that we did NOT have a match - 13158 - 13159 00000C3E B0FF mov al,-1 ; 0FFh - 13160 00000C40 EB37 jmp short IFRET + 13135 ; No match. Let's find out what was wrong. The character that did not match + 13136 ; has been advanced over. Let's back up to it. + 13137 + 13138 00000C2E 4E dec si + 13139 + 13140 ; If it is EOL, then syntax error + 13141 + 13142 00000C2F 803C0D cmp byte [si],0Dh + 13143 ;jz short IFERRJ + 13144 ; 17/04/2023 + 13145 00000C32 74BE je short IFERROR + 13146 + 13147 ; Advance pointer over remainder of unmatched text to next delimiter + 13148 + 13149 SKIPSTRINGEND: + 13150 00000C34 AC lodsb + 13151 NOTMATCH: + 13152 00000C35 3C0D cmp al,0Dh + 13153 IFERRORJ2: + 13154 ;jz short IFERRJ + 13155 ; 17/04/2023 + 13156 00000C37 74B9 jz short IFERROR + 13157 00000C39 E8521D call DELIM + 13158 00000C3C 75F6 jnz short SKIPSTRINGEND + 13159 + 13160 ; Signal that we did NOT have a match 13161 - 13162 ; 17/04/2023 - 13163 ;IFERRPJ: - 13164 ;jmp IFERRORP - 13165 - 13166 ; The compare succeeded. Was the second string longer than the first? - 13167 ; We do this by seeing if the next char is a delimiter. + 13162 00000C3E B0FF mov al,-1 ; 0FFh + 13163 00000C40 EB37 jmp short IFRET + 13164 + 13165 ; 17/04/2023 + 13166 ;IFERRPJ: + 13167 ;jmp IFERRORP 13168 - 13169 MATCH: - 13170 00000C42 AC lodsb - 13171 00000C43 E8481D call DELIM - 13172 00000C46 75ED jnz short NOTMATCH ; not same. - 13173 00000C48 30C0 xor al,al - 13174 00000C4A EB2D jmp short IFRET - 13175 - 13176 ; --------------------------------------------------------------------------- - 13177 - 13178 IFEXISTS: - 13179 - 13180 IFEXIST_ATTR EQU ATTR_HIDDEN+ATTR_SYSTEM ; 2+4 = 6 - 13181 - 13182 ;MOREDELIM: - 13183 00000C4C AC lodsb - 13184 00000C4D E83E1D call DELIM - 13185 00000C50 75FA jnz short IFEXISTS - 13186 ;jnz short MOREDELIM - 13187 - 13188 00000C52 BA[399D] mov dx,DIRBUF - 13189 00000C55 B8001A mov ax,1A00h - 13190 ;mov ax,Set_DMA*256 ; 1A00h - 13191 00000C58 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 13192 ; DS:DX -> disk transfer buffer - 13193 00000C5A BB0200 mov bx,2 ; if(0) [|not](|1) exist[1|2] file(2|3) - 13194 00000C5D 031E[9CA4] add bx,[IF_NOT_COUNT] - 13195 ;mov ax,ARG_ARGV - 13196 ;mov ax,ARG+ARG_UNIT.argv - 13197 00000C61 B8[509F] mov ax,ARG - 13198 00000C64 E82929 call argv_calc ; convert arg index to pointer - 13199 00000C67 8B17 mov dx,[bx] - 13200 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] - 13201 ;mov cx,6 - 13202 00000C69 B90600 mov cx,IFEXIST_ATTR ; filetypes to search for - 13203 00000C6C B8004E mov ax,4E00h - 13204 ;mov ax,Find_First*256 ; 4E00h ; request first match, if any - 13205 00000C6F CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) - 13206 ; CX = search attributes - 13207 ; DS:DX -> ASCIZ filespec - 13208 ; (drive,path, and wildcards allowed) - 13209 00000C71 7204 jc short IF_EX_C ; carry is how to determine error - 13210 00000C73 30C0 xor al,al - 13211 00000C75 EB02 jmp short IFRET - 13212 - 13213 ;nop - 13214 IF_EX_C: - 13215 00000C77 B0FF mov al,-1 ; 0FFh ; false 'n' fall through... - 13216 IFRET: - 13217 00000C79 F606[069C]FF test byte [IFNOTFLAG],-1 ; 0FFh - 13218 00000C7E 7402 jz short REALTEST - 13219 00000C80 F6D0 not al - 13220 REALTEST: - 13221 00000C82 08C0 or al,al - 13222 00000C84 7403 jz short IFTRUE - 13223 00000C86 E97BF4 jmp TCOMMAND - 13224 - 13225 IFTRUE: - 13226 00000C89 E8FA1C call scanoff - 13227 00000C8C 89F1 mov cx,si - 13228 00000C8E 81E98100 sub cx,81h - 13229 00000C92 280E8000 sub [80h],cl - 13230 00000C96 8A0E8000 mov cl,[80h] - 13231 00000C9A 880E[559A] mov [COMBUF+1],cl - 13232 00000C9E BF[569A] mov di,COMBUF+2 - 13233 00000CA1 FC cld - 13234 00000CA2 F3A4 rep movsb - 13235 00000CA4 B00D mov al,0Dh - 13236 00000CA6 AA stosb - 13237 - 13238 ; Signal that an IF was done. - 13239 ; This prevents the redirections from getting lost. + 13169 ; The compare succeeded. Was the second string longer than the first? + 13170 ; We do this by seeing if the next char is a delimiter. + 13171 + 13172 MATCH: + 13173 00000C42 AC lodsb + 13174 00000C43 E8481D call DELIM + 13175 00000C46 75ED jnz short NOTMATCH ; not same. + 13176 00000C48 30C0 xor al,al + 13177 00000C4A EB2D jmp short IFRET + 13178 + 13179 ; --------------------------------------------------------------------------- + 13180 + 13181 IFEXISTS: + 13182 + 13183 IFEXIST_ATTR EQU ATTR_HIDDEN+ATTR_SYSTEM ; 2+4 = 6 + 13184 + 13185 ;MOREDELIM: + 13186 00000C4C AC lodsb + 13187 00000C4D E83E1D call DELIM + 13188 00000C50 75FA jnz short IFEXISTS + 13189 ;jnz short MOREDELIM + 13190 + 13191 00000C52 BA[399D] mov dx,DIRBUF + 13192 00000C55 B8001A mov ax,1A00h + 13193 ;mov ax,Set_DMA*256 ; 1A00h + 13194 00000C58 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 13195 ; DS:DX -> disk transfer buffer + 13196 00000C5A BB0200 mov bx,2 ; if(0) [|not](|1) exist[1|2] file(2|3) + 13197 00000C5D 031E[9CA4] add bx,[IF_NOT_COUNT] + 13198 ;mov ax,ARG_ARGV + 13199 ;mov ax,ARG+ARG_UNIT.argv + 13200 00000C61 B8[509F] mov ax,ARG + 13201 00000C64 E82929 call argv_calc ; convert arg index to pointer + 13202 00000C67 8B17 mov dx,[bx] + 13203 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] + 13204 ;mov cx,6 + 13205 00000C69 B90600 mov cx,IFEXIST_ATTR ; filetypes to search for + 13206 00000C6C B8004E mov ax,4E00h + 13207 ;mov ax,Find_First*256 ; 4E00h ; request first match, if any + 13208 00000C6F CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) + 13209 ; CX = search attributes + 13210 ; DS:DX -> ASCIZ filespec + 13211 ; (drive,path, and wildcards allowed) + 13212 00000C71 7204 jc short IF_EX_C ; carry is how to determine error + 13213 00000C73 30C0 xor al,al + 13214 00000C75 EB02 jmp short IFRET + 13215 + 13216 ;nop + 13217 IF_EX_C: + 13218 00000C77 B0FF mov al,-1 ; 0FFh ; false 'n' fall through... + 13219 IFRET: + 13220 00000C79 F606[069C]FF test byte [IFNOTFLAG],-1 ; 0FFh + 13221 00000C7E 7402 jz short REALTEST + 13222 00000C80 F6D0 not al + 13223 REALTEST: + 13224 00000C82 08C0 or al,al + 13225 00000C84 7403 jz short IFTRUE + 13226 00000C86 E97BF4 jmp TCOMMAND + 13227 + 13228 IFTRUE: + 13229 00000C89 E8FA1C call scanoff + 13230 00000C8C 89F1 mov cx,si + 13231 00000C8E 81E98100 sub cx,81h + 13232 00000C92 280E8000 sub [80h],cl + 13233 00000C96 8A0E8000 mov cl,[80h] + 13234 00000C9A 880E[559A] mov [COMBUF+1],cl + 13235 00000C9E BF[569A] mov di,COMBUF+2 + 13236 00000CA1 FC cld + 13237 00000CA2 F3A4 rep movsb + 13238 00000CA4 B00D mov al,0Dh + 13239 00000CA6 AA stosb 13240 - 13241 00000CA7 1E push ds - 13242 00000CA8 8E1E[F59B] mov ds,[RESSEG] - 13243 00000CAC C606[AA02]FF mov byte [IfFlag],-1 - 13244 00000CB1 1F pop ds - 13245 - 13246 ; Go do the command - 13247 - 13248 ;jmp DOCOM1 ; MSDOS 5.0 COMMAND.COM - 13249 ; 07/06/2023 - 13250 ; Retro DOS v4.2 COMMAND.COM - 13251 00000CB2 E940F6 jmp DOCOM0 ; MSDOS 6.22 COMMAND.COM - 13252 - 13253 ; --------------------------------------------------------------------------- - 13254 - 13255 IFERRORJ3: - 13256 00000CB5 EB80 jmp IFERRORJ2 + 13241 ; Signal that an IF was done. + 13242 ; This prevents the redirections from getting lost. + 13243 + 13244 00000CA7 1E push ds + 13245 00000CA8 8E1E[F59B] mov ds,[RESSEG] + 13246 00000CAC C606[AA02]FF mov byte [IfFlag],-1 + 13247 00000CB1 1F pop ds + 13248 + 13249 ; Go do the command + 13250 + 13251 ;jmp DOCOM1 ; MSDOS 5.0 COMMAND.COM + 13252 ; 07/06/2023 + 13253 ; Retro DOS v4.2 COMMAND.COM + 13254 00000CB2 E940F6 jmp DOCOM0 ; MSDOS 6.22 COMMAND.COM + 13255 + 13256 ; --------------------------------------------------------------------------- 13257 - 13258 IFERLEV: - 13259 - 13260 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 13261 ; PCDOS 7.1 COMMAND.COM - 13262 ;%if 1 - 13263 ; cmp byte [si],0F2h ; CODE PAGE 437 - 13264 ; jne short IFERLEV_@ - 13265 ; inc si - 13266 ;IFERLEV_@: - 13267 ;%endif - 13268 00000CB7 B70A mov bh,10 - 13269 00000CB9 30DB xor bl,bl - 13270 GETNUMLP: - 13271 00000CBB AC lodsb - 13272 00000CBC 3C0D cmp al,0Dh - 13273 00000CBE 74F5 je short IFERRORJ3 - 13274 00000CC0 E8CB1C call DELIM - 13275 00000CC3 740C jz short GOTNUM - 13276 00000CC5 2C30 sub al,'0' - 13277 00000CC7 86C3 xchg al,bl - 13278 00000CC9 F6E7 mul bh - 13279 00000CCB 00D8 add al,bl - 13280 00000CCD 86C3 xchg al,bl - 13281 00000CCF EBEA jmp short GETNUMLP - 13282 GOTNUM: - 13283 00000CD1 1E push ds - 13284 00000CD2 8E1E[F59B] mov ds,[RESSEG] - 13285 00000CD6 8A26[9A02] mov ah,[RetCode] - 13286 00000CDA 1F pop ds - 13287 00000CDB 30C0 xor al,al - 13288 00000CDD 38DC cmp ah,bl - 13289 00000CDF 7398 jnb short IFRET - 13290 00000CE1 FEC8 dec al - 13291 00000CE3 EB94 jmp short IFRET - 13292 - 13293 ; --------------------------------------------------------------------------- - 13294 - 13295 ; Shift the parameters in the batch structure by 1 and set up the new argument. - 13296 ; This is a NOP if no batch in progress. + 13258 IFERRORJ3: + 13259 00000CB5 EB80 jmp IFERRORJ2 + 13260 + 13261 IFERLEV: + 13262 + 13263 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 13264 ; PCDOS 7.1 COMMAND.COM + 13265 ;%if 1 + 13266 ; cmp byte [si],0F2h ; CODE PAGE 437 + 13267 ; jne short IFERLEV_@ + 13268 ; inc si + 13269 ;IFERLEV_@: + 13270 ;%endif + 13271 00000CB7 B70A mov bh,10 + 13272 00000CB9 30DB xor bl,bl + 13273 GETNUMLP: + 13274 00000CBB AC lodsb + 13275 00000CBC 3C0D cmp al,0Dh + 13276 00000CBE 74F5 je short IFERRORJ3 + 13277 00000CC0 E8CB1C call DELIM + 13278 00000CC3 740C jz short GOTNUM + 13279 00000CC5 2C30 sub al,'0' + 13280 00000CC7 86C3 xchg al,bl + 13281 00000CC9 F6E7 mul bh + 13282 00000CCB 00D8 add al,bl + 13283 00000CCD 86C3 xchg al,bl + 13284 00000CCF EBEA jmp short GETNUMLP + 13285 GOTNUM: + 13286 00000CD1 1E push ds + 13287 00000CD2 8E1E[F59B] mov ds,[RESSEG] + 13288 00000CD6 8A26[9A02] mov ah,[RetCode] + 13289 00000CDA 1F pop ds + 13290 00000CDB 30C0 xor al,al + 13291 00000CDD 38DC cmp ah,bl + 13292 00000CDF 7398 jnb short IFRET + 13293 00000CE1 FEC8 dec al + 13294 00000CE3 EB94 jmp short IFRET + 13295 + 13296 ; --------------------------------------------------------------------------- 13297 - 13298 _SHIFT: - 13299 00000CE5 8E1E[F59B] mov ds,[RESSEG] - 13300 00000CE9 A1[4902] mov ax,[Batch] ; get batch pointer - 13301 00000CEC 09C0 or ax,ax ; in batch mode? - 13302 00000CEE 7501 jnz short SHIFT1 ; yes, operate in batch segment - 13303 SHIFT_RETN: ; no, done. - 13304 00000CF0 C3 retn - 13305 SHIFT1: - 13306 00000CF1 8EC0 mov es,ax - 13307 00000CF3 8ED8 mov ds,ax - 13308 - 13309 ; Now move the batch args down by 1 word - 13310 - 13311 ;;mov di,0Bh ; MSDOS 3.3 COMMAND.COM - 13312 ;mov di,0Ch ; MSDOS 5.0 COMMAND.COM - 13313 00000CF5 BF0C00 mov di,BATCHSEGMENT.BatParm ; point to parm table - 13314 00000CF8 8D7502 lea si,[di+2] ; make source = dest + 2 - 13315 00000CFB B90900 mov cx,9 ; move 9 parameters - 13316 00000CFE F3A5 rep movsw ; SHIFT down - 13317 - 13318 ; If the last parameter (the one not moved) is empty (= -1) then we are done. - 13319 ; We have copied it into the previous position. + 13298 ; Shift the parameters in the batch structure by 1 and set up the new argument. + 13299 ; This is a NOP if no batch in progress. + 13300 + 13301 _SHIFT: + 13302 00000CE5 8E1E[F59B] mov ds,[RESSEG] + 13303 00000CE9 A1[4902] mov ax,[Batch] ; get batch pointer + 13304 00000CEC 09C0 or ax,ax ; in batch mode? + 13305 00000CEE 7501 jnz short SHIFT1 ; yes, operate in batch segment + 13306 SHIFT_RETN: ; no, done. + 13307 00000CF0 C3 retn + 13308 SHIFT1: + 13309 00000CF1 8EC0 mov es,ax + 13310 00000CF3 8ED8 mov ds,ax + 13311 + 13312 ; Now move the batch args down by 1 word + 13313 + 13314 ;;mov di,0Bh ; MSDOS 3.3 COMMAND.COM + 13315 ;mov di,0Ch ; MSDOS 5.0 COMMAND.COM + 13316 00000CF5 BF0C00 mov di,BATCHSEGMENT.BatParm ; point to parm table + 13317 00000CF8 8D7502 lea si,[di+2] ; make source = dest + 2 + 13318 00000CFB B90900 mov cx,9 ; move 9 parameters + 13319 00000CFE F3A5 rep movsw ; SHIFT down 13320 - 13321 00000D00 833DFF cmp word [di],-1 ; if last one was not in use then - 13322 00000D03 74EB je short SHIFT_RETN ; No new parm + 13321 ; If the last parameter (the one not moved) is empty (= -1) then we are done. + 13322 ; We have copied it into the previous position. 13323 - 13324 ; This last pointer is NOT nul. Get it and scan to find the next argument. - 13325 ; Assume, first, that there is no next argument. - 13326 - 13327 00000D05 8B35 mov si,[di] - 13328 00000D07 C705FFFF mov word [di],-1 ; Assume no parm - 13329 - 13330 ; The parameters are CR separated. Scan for end of this parm. - 13331 - 13332 SKIPCRLP: - 13333 00000D0B AC lodsb - 13334 00000D0C 3C0D cmp al,0Dh - 13335 00000D0E 75FB jne short SKIPCRLP - 13336 - 13337 ; We are now pointing at next arg. If it is 0 (end of original line) then we - 13338 ; are finished. There are no more parms and the pointer has been previously - 13339 ; initialized to indicate it. - 13340 - 13341 00000D10 803C00 cmp byte [si],0 - 13342 00000D13 74DB jz short SHIFT_RETN ; End of parms - 13343 00000D15 8935 mov [di],si ; Pointer to next parm as %9 - 13344 00000D17 C3 retn - 13345 - 13346 ; =============== S U B R O U T I N E ======================================= - 13347 - 13348 ; Skip delim reads bytes from the batch file until a non-delimiter is seen. - 13349 ; returns char in AL, carry set -> eof + 13324 00000D00 833DFF cmp word [di],-1 ; if last one was not in use then + 13325 00000D03 74EB je short SHIFT_RETN ; No new parm + 13326 + 13327 ; This last pointer is NOT nul. Get it and scan to find the next argument. + 13328 ; Assume, first, that there is no next argument. + 13329 + 13330 00000D05 8B35 mov si,[di] + 13331 00000D07 C705FFFF mov word [di],-1 ; Assume no parm + 13332 + 13333 ; The parameters are CR separated. Scan for end of this parm. + 13334 + 13335 SKIPCRLP: + 13336 00000D0B AC lodsb + 13337 00000D0C 3C0D cmp al,0Dh + 13338 00000D0E 75FB jne short SKIPCRLP + 13339 + 13340 ; We are now pointing at next arg. If it is 0 (end of original line) then we + 13341 ; are finished. There are no more parms and the pointer has been previously + 13342 ; initialized to indicate it. + 13343 + 13344 00000D10 803C00 cmp byte [si],0 + 13345 00000D13 74DB jz short SHIFT_RETN ; End of parms + 13346 00000D15 8935 mov [di],si ; Pointer to next parm as %9 + 13347 00000D17 C3 retn + 13348 + 13349 ; =============== S U B R O U T I N E ======================================= 13350 - 13351 SKIPDELIM: - 13352 00000D18 F706[4902]FFFF test word [Batch],-1 ; batch file empty. OOPS! - 13353 00000D1E 740A jz short SKIPERR - 13354 00000D20 E85CFD call GETBATBYT ; get a char - 13355 00000D23 E8681C call DELIM ; check for ignoreable chars - 13356 00000D26 74F0 jz short SKIPDELIM ; ignore this char. - 13357 00000D28 F8 clc - 13358 00000D29 C3 retn - 13359 SKIPERR: - 13360 00000D2A F9 stc - 13361 GOTO_RETN: - 13362 00000D2B C3 retn - 13363 - 13364 ; --------------------------------------------------------------------------- - 13365 - 13366 ; CALL is an internal command that transfers control to a .bat, .exe, or - 13367 ; .com file. This routine strips the CALL off the command line, sets - 13368 ; the CALL_FLAG to indicate a call in progress, and returns control to - 13369 ; DOCOM1 in TCODE to reprocess the command line and execute the file - 13370 ; being CALLed. - 13371 - 13372 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13373 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0C27h + 13351 ; Skip delim reads bytes from the batch file until a non-delimiter is seen. + 13352 ; returns char in AL, carry set -> eof + 13353 + 13354 SKIPDELIM: + 13355 00000D18 F706[4902]FFFF test word [Batch],-1 ; batch file empty. OOPS! + 13356 00000D1E 740A jz short SKIPERR + 13357 00000D20 E85CFD call GETBATBYT ; get a char + 13358 00000D23 E8681C call DELIM ; check for ignoreable chars + 13359 00000D26 74F0 jz short SKIPDELIM ; ignore this char. + 13360 00000D28 F8 clc + 13361 00000D29 C3 retn + 13362 SKIPERR: + 13363 00000D2A F9 stc + 13364 GOTO_RETN: + 13365 00000D2B C3 retn + 13366 + 13367 ; --------------------------------------------------------------------------- + 13368 + 13369 ; CALL is an internal command that transfers control to a .bat, .exe, or + 13370 ; .com file. This routine strips the CALL off the command line, sets + 13371 ; the CALL_FLAG to indicate a call in progress, and returns control to + 13372 ; DOCOM1 in TCODE to reprocess the command line and execute the file + 13373 ; being CALLed. 13374 - 13375 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 13376 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0D01h + 13375 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13376 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0C27h 13377 - 13378 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 13379 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0D4Ch - 13380 _$CALL: - 13381 - 13382 ; strip off CALL from command line - 13383 - 13384 ;ASSUME DS:trangroup,ES:trangroup - 13385 - 13386 00000D2C 56 push si - 13387 00000D2D 57 push di - 13388 00000D2E 50 push ax - 13389 00000D2F 51 push cx - 13390 00000D30 BE[569A] mov si,COMBUF+2 - 13391 00000D33 E8501C call scanoff ;get to first non-delimeter - 13392 ;add si,4 - 13393 00000D36 83C604 add si,length_call ;point to char past CALL - 13394 00000D39 BF[569A] mov di,COMBUF+2 - 13395 ;mov cx,124 - 13396 00000D3C B97C00 mov cx,COMBUFLEN-length_call - 13397 ;get length of buffer - 13398 00000D3F F3A4 rep movsb ;move it - 13399 00000D41 59 pop cx - 13400 00000D42 58 pop ax - 13401 00000D43 5F pop di - 13402 00000D44 5E pop si - 13403 - 13404 ; set call flag to indicate call in progress - 13405 - 13406 00000D45 1E push ds - 13407 00000D46 8E1E[F59B] mov ds,[RESSEG] - 13408 00000D4A C606[B002]01 mov byte [Call_Flag],call_in_progress ; 1 - 13409 00000D4F C606[B102]01 mov byte [Call_Batch_Flag],call_in_progress ; 1 - 13410 - 13411 ; Turn off any pipes in progress. - 13412 - 13413 00000D54 803E[1403]00 cmp byte [PipeFiles],0 ; Only turn off if present. - 13414 00000D59 7403 jz short _NOPIPE - 13415 00000D5B E8C223 call PIPEDEL - 13416 _NOPIPE: - 13417 00000D5E 1F pop ds - 13418 00000D5F C3 retn - 13419 - 13420 ; --------------------------------------------------------------------------- - 13421 - 13422 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13423 _GOTO: - 13424 00000D60 8E1E[F59B] mov ds,[RESSEG] - 13425 00000D64 F706[4902]FFFF test word [Batch],-1 ; If not in batch mode, a nop - 13426 00000D6A 74BF jz short GOTO_RETN - 13427 00000D6C 31D2 xor dx,dx - 13428 00000D6E 1E push ds - 13429 00000D6F 8E1E[4902] mov ds,[Batch] - 13430 ;mov [8],dx ; MSDOS 5.0 COMMAND.COM - 13431 00000D73 89160800 mov [BATCHSEGMENT.BatSeek],dx ; Back to start - 13432 ;mov [10],dx ; MSDOS 5.0 COMMAND.COM - 13433 00000D77 89160A00 mov [BATCHSEGMENT.BatSeek+2],dx ; Back to start - 13434 - 13435 ; MSDOS 6.0 - 13436 ;M037 - 13437 ; Clear EOF indicator because we have reseeked to the beginning of the file. - 13438 ; - 13439 00000D7B C606020000 mov byte [BATCHSEGMENT.BatchEOF],0 - 13440 ; clear eof indicator ;M037 - 13441 ; MSDOS 3.3 (& MSDOS 6.0) - 13442 00000D80 1F pop ds - 13443 GOTOOPEN: - 13444 00000D81 E86BF8 call PROMPTBAT - 13445 ;mov di,5Dh - 13446 00000D84 BF5D00 mov di,FCB+1 ; Get the label - 13447 00000D87 B90B00 mov cx,11 - 13448 00000D8A B020 mov al,' ' - 13449 00000D8C F2AE repne scasb - 13450 00000D8E 7501 jnz short NOINC - 13451 00000D90 41 inc cx - 13452 NOINC: - 13453 00000D91 83E90B sub cx,11 - 13454 00000D94 F7D9 neg cx - 13455 ;mov [cs:GOTOLEN],cx - 13456 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13457 00000D96 26890E[399D] mov [es:GOTOLEN],cx ; MSDOS 5.0 (& 6.0) - 13458 - 13459 ; At beginning of file. Skip to first non-delimiter char - 13460 - 13461 00000D9B E87AFF call SKIPDELIM - 13462 00000D9E 721C jb short BADGOTO - 13463 00000DA0 3C3A cmp al,':' - 13464 00000DA2 7426 jz short CHKLABEL - 13465 LABLKLP: ; Look for the label - 13466 00000DA4 E8D8FC call GETBATBYT - 13467 00000DA7 3C0A cmp al,0Ah - 13468 00000DA9 7509 jne short LABLKTST - 13469 - 13470 ; At beginning of line. Skip to first non-delimiter char - 13471 - 13472 00000DAB E86AFF call SKIPDELIM - 13473 00000DAE 720C jb short BADGOTO - 13474 00000DB0 3C3A cmp al,':' - 13475 00000DB2 7416 je short CHKLABEL - 13476 LABLKTST: - 13477 00000DB4 F706[4902]FFFF test word [Batch],0FFFFh ; -1 - 13478 00000DBA 75E8 jnz short LABLKLP - 13479 BADGOTO: - 13480 00000DBC E87100 call BATCLOSE - 13481 - 13482 ; MSDOS 6.0 - 13483 ;SR; - 13484 ; At this point we are terminating without freeing up any nested batch - 13485 ;segments i.e if the error occurred within a called batch file. This routine - 13486 ;will traverse the linked list of batch segments and free all of them. - 13487 ; - 13488 00000DBF E8BD00 call free_batch ; free up nested batch segments - 13489 - 13490 ; MSDOS 3.3 (& MSDOS 6.0) - 13491 00000DC2 0E push cs - 13492 00000DC3 1F pop ds - 13493 00000DC4 BA[A790] mov dx,BADLAB_PTR - 13494 00000DC7 E95C1F jmp cerror - 13495 - 13496 ; Found the :. Skip to first non-delimiter char - 13497 - 13498 CHKLABEL: - 13499 00000DCA E84BFF call SKIPDELIM - 13500 00000DCD 72ED jb short BADGOTO - 13501 00000DCF BF5D00 mov di,FCB+1 ; 5Dh - 13502 ;mov cx,[cs:GOTOLEN] - 13503 ; 14/02/2023 - 13504 00000DD2 268B0E[399D] mov cx,[es:GOTOLEN] ; MSDOS 5.0 (& 6.0) COMMAND.COM - 13505 00000DD7 EB05 jmp short GOTBYTE - 13506 - 13507 NEXTCHRLP: - 13508 00000DD9 51 push cx - 13509 00000DDA E8A2FC call GETBATBYT - 13510 00000DDD 59 pop cx - 13511 GOTBYTE: - 13512 ; 18/03/2023 - 13513 ; 14/02/2023 - 13514 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0CD9h - 13515 00000DDE E88019 call testkanj - 13516 00000DE1 7413 jz short NOTKANJ1 - 13517 00000DE3 263A05 cmp al,[es:di] - 13518 00000DE6 75CC jne short LABLKTST - 13519 00000DE8 47 inc di - 13520 00000DE9 49 dec cx - 13521 00000DEA E3C8 jcxz LABLKTST - 13522 00000DEC 51 push cx - 13523 00000DED E88FFC call GETBATBYT - 13524 00000DF0 59 pop cx - 13525 00000DF1 263A05 cmp al,[es:di] - 13526 00000DF4 EB0C jmp short KNEXTLABCHR - 13527 NOTKANJ1: - 13528 ; 14/02/2023 - 13529 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0CF1h - 13530 00000DF6 0C20 or al,20h - 13531 00000DF8 263A05 cmp al,[es:di] - 13532 ;jne short TRYUPPER - 13533 ;jmp short NEXTLABCHR - 13534 ; 25/04/2023 - 13535 00000DFB 7407 je short NEXTLABCHR - 13536 TRYUPPER: - 13537 00000DFD 2C20 sub al,20h - 13538 00000DFF 263A05 cmp al,[es:di] - 13539 KNEXTLABCHR: - 13540 00000E02 75B0 jnz short LABLKTST - 13541 NEXTLABCHR: - 13542 00000E04 47 inc di - 13543 00000E05 E2D2 loop NEXTCHRLP - 13544 00000E07 E875FC call GETBATBYT - 13545 ; 14/02/2023 - 13546 00000E0A 26833E[399D]08 cmp word [es:GOTOLEN],8 ; MSDOS 5.0 (& 6.0) COMMAND.COM - 13547 ;cmp word [cs:GOTOLEN],8 ; Is the label at least 8 chars long? - 13548 00000E10 7D04 jge short GOTOCONT ; Yes, then the next char doesn't matter - 13549 00000E12 3C20 cmp al,' ' - 13550 00000E14 779E ja short LABLKTST - 13551 GOTOCONT: - 13552 00000E16 3C0D cmp al,0Dh - 13553 00000E18 7407 je short SKIPLFEED - 13554 TONEXTBATLIN: - 13555 00000E1A E862FC call GETBATBYT - 13556 00000E1D 3C0D cmp al,0Dh - 13557 00000E1F 75F9 jne short TONEXTBATLIN - 13558 SKIPLFEED: - 13559 00000E21 E85BFC call GETBATBYT - 13560 - 13561 ; MSDOS 6.0 - 13562 ;SR; - 13563 ; The BatchEOF flag is set in GetBatByt to indicate that we are faking a - 13564 ;CR-LF for the last line. On a goto, this flag has to be cleared, because - 13565 ;BatchEOF == 1 now, after returning a CR-LF. The next call to GetBatByt - 13566 ;to get the EOF has not been made yet because we encountered the Goto. On - 13567 ;all other cases, EOF will be hit while trying to read the next line and - 13568 ;we are fine. I know, I know, what a massive hack from hell!! God help us!! - 13569 ; - 13570 00000E24 06 push es - 13571 00000E25 8E06[4902] mov es,[Batch] - 13572 00000E29 26C606020000 mov byte [es:BATCHSEGMENT.BatchEOF],0 - 13573 ;invalidate fake CR-LF flag - 13574 00000E2F 07 pop es - 13575 - 13576 ; MSDOS 3.3 (& MSDOS 6.0) - 13577 ;call BATCLOSE - 13578 ;retn - 13579 ; 14/02/2023 - 13580 ;jmp short BATCLOSE - 13581 - 13582 ; =============== S U B R O U T I N E ======================================= - 13583 - 13584 ; 27/07/2024 - 13585 BATCLOSE: - 13586 00000E30 2E8B1E[F49E] mov bx,[cs:BATHAND] - 13587 00000E35 83FB05 cmp bx,5 - 13588 00000E38 7205 jb short CLOSERETURN - 13589 ; 14/02/2023 - 13590 00000E3A B43E mov ah,3Eh - 13591 ;mov ah,CLOSE ; 3Eh - 13592 - 13593 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM - 13594 %if 0 - 13595 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 13596 ; BX = file handle - 13597 %else - 13598 00000E3C E87BF7 call int_21h_indirect - 13599 %endif - 13600 - 13601 CLOSERETURN: - 13602 00000E3F C606[9202]00 mov byte [In_Batch],0 ; reset flag - 13603 00000E44 C3 retn - 13604 - 13605 ; =============== S U B R O U T I N E ======================================= - 13606 - 13607 ; Open the BATCH file, If open fails, AL is drive of batch file (A=1) - 13608 ; Also, fills internal batch buffer. If access denied, then AX = -1 - 13609 - 13610 ; 27/07/2024 - 13611 ; 14/02/2023 - 13612 BATOPEN: - 13613 00000E45 1E push ds - 13614 00000E46 8E1E[4902] mov ds,[Batch] - 13615 ;;mov dx,1Fh ; MSDOS 3.3 COMMAND.COM - 13616 ;mov dx,20h ; MSDOS 5.0 COMMAND.COM - 13617 00000E4A BA2000 mov dx,BATCHSEGMENT.BatFile - 13618 - 13619 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM - 13620 %if 0 - 13621 mov ax,3D00h - 13622 ;mov ax,(OPEN<<8) ; 3D00h ; Open the batch file - 13623 - 13624 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 13625 ; DS:DX -> ASCIZ filename - 13626 ; AL = access mode - 13627 ; 0 - read - 13628 %else - 13629 00000E4D B8203D mov ax,3D20h - 13630 ;mov ax,(OPEN<<8)|20h ; 3D20h ; Open the batch file - 13631 ; 00-100-000b (00-DENYNONE-READONLY) - 13632 00000E50 E867F7 call int_21h_indirect - 13633 %endif - 13634 - 13635 00000E53 721C jc short SETERRDL - 13636 ;mov dx,[8] - 13637 00000E55 8B160800 mov dx,[BATCHSEGMENT.BatSeek] - 13638 ;mov cx,[10] - 13639 00000E59 8B0E0A00 mov cx,[BATCHSEGMENT.BatSeek+2] - 13640 00000E5D 1F pop ds - 13641 ;mov [cs:BATHAND],ax - 13642 00000E5E 26A3[F49E] mov [es:BATHAND],ax ; MSDOS 5.0 (& 6.0) COMMAND.COM - 13643 00000E62 89C3 mov bx,ax - 13644 00000E64 B80042 mov ax,4200h - 13645 ;mov ax,(LSEEK<<8) ; 4200h ; Go to the right spot - 13646 00000E67 CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 13647 ; AL = method: offset from beginning of file - 13648 - 13649 ;mov word [cs:BATBUFPOS],-1 ; 0FFFFh - 13650 ; nuke batch buffer position - 13651 00000E69 26C706[C7A5]FFFF mov word [es:BATBUFPOS],-1 ; MSDOS 5.0 (& 6.0) COMMAND.COM - 13652 BATOPEN_RETN: - 13653 00000E70 C3 retn - 13654 - 13655 SETERRDL: - 13656 00000E71 89D3 mov bx,dx - 13657 ; MSDOS 6.0 - 13658 ;invoke get_ext_error_number ;AN022; get the extended error - 13659 ; 14/02/2023 - 13660 00000E73 E8D511 call get_ext_error_number - 13661 00000E76 89C2 mov dx,ax ;AN022; save extended error in DX - 13662 - 13663 ; MSDOS 3.3 - 13664 ;mov dx,INSERTDSKPTR - 13665 ;call GET_EXT_ERR_NUMBER - 13666 - 13667 ; MSDOS 3.3 (& MSDOS 6.0) - 13668 00000E78 8A07 mov al,[bx] ; Get drive spec - 13669 00000E7A 2C40 sub al,'@' ; sub al,40h ; A = 1, B = 2 .. - 13670 00000E7C 1F pop ds - 13671 00000E7D F9 stc ; SUB mucked over carry - 13672 00000E7E C3 retn - 13673 - 13674 ; =============== S U B R O U T I N E ======================================= - 13675 - 13676 ;Free_batch : This routine traverses the linked batch segments freeing all - 13677 ;the batch and FOR segments until all of them are freed. It also restores - 13678 ;the old state of the EchoFlag. - 13679 ; - 13680 ; ENTRY: ds = RESGROUP - 13681 ; - 13682 ; EXIT: All batch & FOR segments freed. - 13683 ; EchoFlag restored to old state before batch process. + 13378 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 13379 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0D01h + 13380 + 13381 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 13382 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:0D4Ch + 13383 _$CALL: + 13384 + 13385 ; strip off CALL from command line + 13386 + 13387 ;ASSUME DS:trangroup,ES:trangroup + 13388 + 13389 00000D2C 56 push si + 13390 00000D2D 57 push di + 13391 00000D2E 50 push ax + 13392 00000D2F 51 push cx + 13393 00000D30 BE[569A] mov si,COMBUF+2 + 13394 00000D33 E8501C call scanoff ;get to first non-delimeter + 13395 ;add si,4 + 13396 00000D36 83C604 add si,length_call ;point to char past CALL + 13397 00000D39 BF[569A] mov di,COMBUF+2 + 13398 ;mov cx,124 + 13399 00000D3C B97C00 mov cx,COMBUFLEN-length_call + 13400 ;get length of buffer + 13401 00000D3F F3A4 rep movsb ;move it + 13402 00000D41 59 pop cx + 13403 00000D42 58 pop ax + 13404 00000D43 5F pop di + 13405 00000D44 5E pop si + 13406 + 13407 ; set call flag to indicate call in progress + 13408 + 13409 00000D45 1E push ds + 13410 00000D46 8E1E[F59B] mov ds,[RESSEG] + 13411 00000D4A C606[B002]01 mov byte [Call_Flag],call_in_progress ; 1 + 13412 00000D4F C606[B102]01 mov byte [Call_Batch_Flag],call_in_progress ; 1 + 13413 + 13414 ; Turn off any pipes in progress. + 13415 + 13416 00000D54 803E[1403]00 cmp byte [PipeFiles],0 ; Only turn off if present. + 13417 00000D59 7403 jz short _NOPIPE + 13418 00000D5B E8C223 call PIPEDEL + 13419 _NOPIPE: + 13420 00000D5E 1F pop ds + 13421 00000D5F C3 retn + 13422 + 13423 ; --------------------------------------------------------------------------- + 13424 + 13425 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13426 _GOTO: + 13427 00000D60 8E1E[F59B] mov ds,[RESSEG] + 13428 00000D64 F706[4902]FFFF test word [Batch],-1 ; If not in batch mode, a nop + 13429 00000D6A 74BF jz short GOTO_RETN + 13430 00000D6C 31D2 xor dx,dx + 13431 00000D6E 1E push ds + 13432 00000D6F 8E1E[4902] mov ds,[Batch] + 13433 ;mov [8],dx ; MSDOS 5.0 COMMAND.COM + 13434 00000D73 89160800 mov [BATCHSEGMENT.BatSeek],dx ; Back to start + 13435 ;mov [10],dx ; MSDOS 5.0 COMMAND.COM + 13436 00000D77 89160A00 mov [BATCHSEGMENT.BatSeek+2],dx ; Back to start + 13437 + 13438 ; MSDOS 6.0 + 13439 ;M037 + 13440 ; Clear EOF indicator because we have reseeked to the beginning of the file. + 13441 ; + 13442 00000D7B C606020000 mov byte [BATCHSEGMENT.BatchEOF],0 + 13443 ; clear eof indicator ;M037 + 13444 ; MSDOS 3.3 (& MSDOS 6.0) + 13445 00000D80 1F pop ds + 13446 GOTOOPEN: + 13447 00000D81 E86BF8 call PROMPTBAT + 13448 ;mov di,5Dh + 13449 00000D84 BF5D00 mov di,FCB+1 ; Get the label + 13450 00000D87 B90B00 mov cx,11 + 13451 00000D8A B020 mov al,' ' + 13452 00000D8C F2AE repne scasb + 13453 00000D8E 7501 jnz short NOINC + 13454 00000D90 41 inc cx + 13455 NOINC: + 13456 00000D91 83E90B sub cx,11 + 13457 00000D94 F7D9 neg cx + 13458 ;mov [cs:GOTOLEN],cx + 13459 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13460 00000D96 26890E[399D] mov [es:GOTOLEN],cx ; MSDOS 5.0 (& 6.0) + 13461 + 13462 ; At beginning of file. Skip to first non-delimiter char + 13463 + 13464 00000D9B E87AFF call SKIPDELIM + 13465 00000D9E 721C jb short BADGOTO + 13466 00000DA0 3C3A cmp al,':' + 13467 00000DA2 7426 jz short CHKLABEL + 13468 LABLKLP: ; Look for the label + 13469 00000DA4 E8D8FC call GETBATBYT + 13470 00000DA7 3C0A cmp al,0Ah + 13471 00000DA9 7509 jne short LABLKTST + 13472 + 13473 ; At beginning of line. Skip to first non-delimiter char + 13474 + 13475 00000DAB E86AFF call SKIPDELIM + 13476 00000DAE 720C jb short BADGOTO + 13477 00000DB0 3C3A cmp al,':' + 13478 00000DB2 7416 je short CHKLABEL + 13479 LABLKTST: + 13480 00000DB4 F706[4902]FFFF test word [Batch],0FFFFh ; -1 + 13481 00000DBA 75E8 jnz short LABLKLP + 13482 BADGOTO: + 13483 00000DBC E87100 call BATCLOSE + 13484 + 13485 ; MSDOS 6.0 + 13486 ;SR; + 13487 ; At this point we are terminating without freeing up any nested batch + 13488 ;segments i.e if the error occurred within a called batch file. This routine + 13489 ;will traverse the linked list of batch segments and free all of them. + 13490 ; + 13491 00000DBF E8BD00 call free_batch ; free up nested batch segments + 13492 + 13493 ; MSDOS 3.3 (& MSDOS 6.0) + 13494 00000DC2 0E push cs + 13495 00000DC3 1F pop ds + 13496 00000DC4 BA[A790] mov dx,BADLAB_PTR + 13497 00000DC7 E95C1F jmp cerror + 13498 + 13499 ; Found the :. Skip to first non-delimiter char + 13500 + 13501 CHKLABEL: + 13502 00000DCA E84BFF call SKIPDELIM + 13503 00000DCD 72ED jb short BADGOTO + 13504 00000DCF BF5D00 mov di,FCB+1 ; 5Dh + 13505 ;mov cx,[cs:GOTOLEN] + 13506 ; 14/02/2023 + 13507 00000DD2 268B0E[399D] mov cx,[es:GOTOLEN] ; MSDOS 5.0 (& 6.0) COMMAND.COM + 13508 00000DD7 EB05 jmp short GOTBYTE + 13509 + 13510 NEXTCHRLP: + 13511 00000DD9 51 push cx + 13512 00000DDA E8A2FC call GETBATBYT + 13513 00000DDD 59 pop cx + 13514 GOTBYTE: + 13515 ; 18/03/2023 + 13516 ; 14/02/2023 + 13517 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0CD9h + 13518 00000DDE E88019 call testkanj + 13519 00000DE1 7413 jz short NOTKANJ1 + 13520 00000DE3 263A05 cmp al,[es:di] + 13521 00000DE6 75CC jne short LABLKTST + 13522 00000DE8 47 inc di + 13523 00000DE9 49 dec cx + 13524 00000DEA E3C8 jcxz LABLKTST + 13525 00000DEC 51 push cx + 13526 00000DED E88FFC call GETBATBYT + 13527 00000DF0 59 pop cx + 13528 00000DF1 263A05 cmp al,[es:di] + 13529 00000DF4 EB0C jmp short KNEXTLABCHR + 13530 NOTKANJ1: + 13531 ; 14/02/2023 + 13532 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0CF1h + 13533 00000DF6 0C20 or al,20h + 13534 00000DF8 263A05 cmp al,[es:di] + 13535 ;jne short TRYUPPER + 13536 ;jmp short NEXTLABCHR + 13537 ; 25/04/2023 + 13538 00000DFB 7407 je short NEXTLABCHR + 13539 TRYUPPER: + 13540 00000DFD 2C20 sub al,20h + 13541 00000DFF 263A05 cmp al,[es:di] + 13542 KNEXTLABCHR: + 13543 00000E02 75B0 jnz short LABLKTST + 13544 NEXTLABCHR: + 13545 00000E04 47 inc di + 13546 00000E05 E2D2 loop NEXTCHRLP + 13547 00000E07 E875FC call GETBATBYT + 13548 ; 14/02/2023 + 13549 00000E0A 26833E[399D]08 cmp word [es:GOTOLEN],8 ; MSDOS 5.0 (& 6.0) COMMAND.COM + 13550 ;cmp word [cs:GOTOLEN],8 ; Is the label at least 8 chars long? + 13551 00000E10 7D04 jge short GOTOCONT ; Yes, then the next char doesn't matter + 13552 00000E12 3C20 cmp al,' ' + 13553 00000E14 779E ja short LABLKTST + 13554 GOTOCONT: + 13555 00000E16 3C0D cmp al,0Dh + 13556 00000E18 7407 je short SKIPLFEED + 13557 TONEXTBATLIN: + 13558 00000E1A E862FC call GETBATBYT + 13559 00000E1D 3C0D cmp al,0Dh + 13560 00000E1F 75F9 jne short TONEXTBATLIN + 13561 SKIPLFEED: + 13562 00000E21 E85BFC call GETBATBYT + 13563 + 13564 ; MSDOS 6.0 + 13565 ;SR; + 13566 ; The BatchEOF flag is set in GetBatByt to indicate that we are faking a + 13567 ;CR-LF for the last line. On a goto, this flag has to be cleared, because + 13568 ;BatchEOF == 1 now, after returning a CR-LF. The next call to GetBatByt + 13569 ;to get the EOF has not been made yet because we encountered the Goto. On + 13570 ;all other cases, EOF will be hit while trying to read the next line and + 13571 ;we are fine. I know, I know, what a massive hack from hell!! God help us!! + 13572 ; + 13573 00000E24 06 push es + 13574 00000E25 8E06[4902] mov es,[Batch] + 13575 00000E29 26C606020000 mov byte [es:BATCHSEGMENT.BatchEOF],0 + 13576 ;invalidate fake CR-LF flag + 13577 00000E2F 07 pop es + 13578 + 13579 ; MSDOS 3.3 (& MSDOS 6.0) + 13580 ;call BATCLOSE + 13581 ;retn + 13582 ; 14/02/2023 + 13583 ;jmp short BATCLOSE + 13584 + 13585 ; =============== S U B R O U T I N E ======================================= + 13586 + 13587 ; 27/07/2024 + 13588 BATCLOSE: + 13589 00000E30 2E8B1E[F49E] mov bx,[cs:BATHAND] + 13590 00000E35 83FB05 cmp bx,5 + 13591 00000E38 7205 jb short CLOSERETURN + 13592 ; 14/02/2023 + 13593 00000E3A B43E mov ah,3Eh + 13594 ;mov ah,CLOSE ; 3Eh + 13595 + 13596 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM + 13597 %if 0 + 13598 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 13599 ; BX = file handle + 13600 %else + 13601 00000E3C E87BF7 call int_21h_indirect + 13602 %endif + 13603 + 13604 CLOSERETURN: + 13605 00000E3F C606[9202]00 mov byte [In_Batch],0 ; reset flag + 13606 00000E44 C3 retn + 13607 + 13608 ; =============== S U B R O U T I N E ======================================= + 13609 + 13610 ; Open the BATCH file, If open fails, AL is drive of batch file (A=1) + 13611 ; Also, fills internal batch buffer. If access denied, then AX = -1 + 13612 + 13613 ; 27/07/2024 + 13614 ; 14/02/2023 + 13615 BATOPEN: + 13616 00000E45 1E push ds + 13617 00000E46 8E1E[4902] mov ds,[Batch] + 13618 ;;mov dx,1Fh ; MSDOS 3.3 COMMAND.COM + 13619 ;mov dx,20h ; MSDOS 5.0 COMMAND.COM + 13620 00000E4A BA2000 mov dx,BATCHSEGMENT.BatFile + 13621 + 13622 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM + 13623 %if 0 + 13624 mov ax,3D00h + 13625 ;mov ax,(OPEN<<8) ; 3D00h ; Open the batch file + 13626 + 13627 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 13628 ; DS:DX -> ASCIZ filename + 13629 ; AL = access mode + 13630 ; 0 - read + 13631 %else + 13632 00000E4D B8203D mov ax,3D20h + 13633 ;mov ax,(OPEN<<8)|20h ; 3D20h ; Open the batch file + 13634 ; 00-100-000b (00-DENYNONE-READONLY) + 13635 00000E50 E867F7 call int_21h_indirect + 13636 %endif + 13637 + 13638 00000E53 721C jc short SETERRDL + 13639 ;mov dx,[8] + 13640 00000E55 8B160800 mov dx,[BATCHSEGMENT.BatSeek] + 13641 ;mov cx,[10] + 13642 00000E59 8B0E0A00 mov cx,[BATCHSEGMENT.BatSeek+2] + 13643 00000E5D 1F pop ds + 13644 ;mov [cs:BATHAND],ax + 13645 00000E5E 26A3[F49E] mov [es:BATHAND],ax ; MSDOS 5.0 (& 6.0) COMMAND.COM + 13646 00000E62 89C3 mov bx,ax + 13647 00000E64 B80042 mov ax,4200h + 13648 ;mov ax,(LSEEK<<8) ; 4200h ; Go to the right spot + 13649 00000E67 CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 13650 ; AL = method: offset from beginning of file + 13651 + 13652 ;mov word [cs:BATBUFPOS],-1 ; 0FFFFh + 13653 ; nuke batch buffer position + 13654 00000E69 26C706[C7A5]FFFF mov word [es:BATBUFPOS],-1 ; MSDOS 5.0 (& 6.0) COMMAND.COM + 13655 BATOPEN_RETN: + 13656 00000E70 C3 retn + 13657 + 13658 SETERRDL: + 13659 00000E71 89D3 mov bx,dx + 13660 ; MSDOS 6.0 + 13661 ;invoke get_ext_error_number ;AN022; get the extended error + 13662 ; 14/02/2023 + 13663 00000E73 E8D511 call get_ext_error_number + 13664 00000E76 89C2 mov dx,ax ;AN022; save extended error in DX + 13665 + 13666 ; MSDOS 3.3 + 13667 ;mov dx,INSERTDSKPTR + 13668 ;call GET_EXT_ERR_NUMBER + 13669 + 13670 ; MSDOS 3.3 (& MSDOS 6.0) + 13671 00000E78 8A07 mov al,[bx] ; Get drive spec + 13672 00000E7A 2C40 sub al,'@' ; sub al,40h ; A = 1, B = 2 .. + 13673 00000E7C 1F pop ds + 13674 00000E7D F9 stc ; SUB mucked over carry + 13675 00000E7E C3 retn + 13676 + 13677 ; =============== S U B R O U T I N E ======================================= + 13678 + 13679 ;Free_batch : This routine traverses the linked batch segments freeing all + 13680 ;the batch and FOR segments until all of them are freed. It also restores + 13681 ;the old state of the EchoFlag. + 13682 ; + 13683 ; ENTRY: ds = RESGROUP 13684 ; - 13685 ; REGISTERS AFFECTED: bx, cx - 13686 - 13687 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13688 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0D7Eh + 13685 ; EXIT: All batch & FOR segments freed. + 13686 ; EchoFlag restored to old state before batch process. + 13687 ; + 13688 ; REGISTERS AFFECTED: bx, cx 13689 - 13690 free_batch: ;proc near - 13691 ;assume ds:RESGROUP,es:nothing + 13690 ; 14/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13691 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0D7Eh 13692 - 13693 00000E7F 06 push es - 13694 00000E80 8B1E[B202] mov bx,[Next_Batch] - 13695 00000E84 09DB or bx,bx - 13696 00000E86 7433 jz short fb_ret - 13697 _ClearBatch: - 13698 00000E88 8EC3 mov es,bx ; get batch segment - 13699 ;mov bx,es:BatForPtr ; get old FOR segment - 13700 00000E8A 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:5] - 13701 ;cmp bx,0 ; is a FOR in progress - 13702 ; 27/07/2024 - 13703 00000E8F 21DB and bx,bx - 13704 00000E91 7409 jz short no_bat_for ; no - don't deallocate - 13705 00000E93 06 push es ; - 13706 00000E94 8EC3 mov es,bx ; yes - free it up... - 13707 00000E96 B449 mov ah,49h - 13708 ;mov ah,DEALLOC ; - 13709 - 13710 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM - 13711 %if 0 - 13712 int 21h ; - 13713 %else - 13714 00000E98 E81FF7 call int_21h_indirect - 13715 %endif - 13716 00000E9B 07 pop es ; restore to batch segment - 13717 no_bat_for: - 13718 ;mov cl,[es:1] - 13719 00000E9C 268A0E0100 mov cl,[es:BATCHSEGMENT.BatEchoFlag] - 13720 ; get old echo flag - 13721 ;mov bx,[es:3] - 13722 00000EA1 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] - 13723 ; get old batch segment - 13724 00000EA6 B449 mov ah,49h - 13725 ;mov ah,DEALLOC ; free it up... - 13726 - 13727 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM - 13728 %if 0 - 13729 int 21h ; - 13730 %else - 13731 00000EA8 E80FF7 call int_21h_indirect - 13732 %endif - 13733 ; 14/02/2023 - 13734 ;mov [Batch],bx ; get ready to deallocate next batch - 13735 00000EAB FF0E[AE02] dec word [Nest] ; is there another batch file? - 13736 00000EAF 75D7 jnz short _ClearBatch ; keep going until no batch file - 13737 - 13738 00000EB1 880E[9D02] mov [EchoFlag],cl ;restore echo status - 13739 00000EB5 C706[4902]0000 mov word [Batch],0 ;no batch process in progress - 13740 fb_ret: - 13741 00000EBB 07 pop es - 13742 00000EBC C3 ret - 13743 - 13744 ;free_batch endp - 13745 - 13746 ;============================================================================ - 13747 ; TFOR.ASM, MSDOS 6.0, 1991 - 13748 ;============================================================================ - 13749 ; 10/10/2018 - Retro DOS v3.0 - 13750 - 13751 ; All batch proccessing has DS set to segment of resident portion - 13752 - 13753 ;ASSUME DS:RESGROUP,ES:TRANGROUP - 13754 - 13755 ; MSDOS 3.3 COMMAND.COM, transient portion/segment offset 0BE9h - 13756 - 13757 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13758 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0DBFh + 13693 free_batch: ;proc near + 13694 ;assume ds:RESGROUP,es:nothing + 13695 + 13696 00000E7F 06 push es + 13697 00000E80 8B1E[B202] mov bx,[Next_Batch] + 13698 00000E84 09DB or bx,bx + 13699 00000E86 7433 jz short fb_ret + 13700 _ClearBatch: + 13701 00000E88 8EC3 mov es,bx ; get batch segment + 13702 ;mov bx,es:BatForPtr ; get old FOR segment + 13703 00000E8A 268B1E0500 mov bx,[es:BATCHSEGMENT.BatForPtr] ; [es:5] + 13704 ;cmp bx,0 ; is a FOR in progress + 13705 ; 27/07/2024 + 13706 00000E8F 21DB and bx,bx + 13707 00000E91 7409 jz short no_bat_for ; no - don't deallocate + 13708 00000E93 06 push es ; + 13709 00000E94 8EC3 mov es,bx ; yes - free it up... + 13710 00000E96 B449 mov ah,49h + 13711 ;mov ah,DEALLOC ; + 13712 + 13713 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM + 13714 %if 0 + 13715 int 21h ; + 13716 %else + 13717 00000E98 E81FF7 call int_21h_indirect + 13718 %endif + 13719 00000E9B 07 pop es ; restore to batch segment + 13720 no_bat_for: + 13721 ;mov cl,[es:1] + 13722 00000E9C 268A0E0100 mov cl,[es:BATCHSEGMENT.BatEchoFlag] + 13723 ; get old echo flag + 13724 ;mov bx,[es:3] + 13725 00000EA1 268B1E0300 mov bx,[es:BATCHSEGMENT.BatLast] + 13726 ; get old batch segment + 13727 00000EA6 B449 mov ah,49h + 13728 ;mov ah,DEALLOC ; free it up... + 13729 + 13730 ; 27/07/2024 - PCDOS 7.1 COMMAND.COM + 13731 %if 0 + 13732 int 21h ; + 13733 %else + 13734 00000EA8 E80FF7 call int_21h_indirect + 13735 %endif + 13736 ; 14/02/2023 + 13737 ;mov [Batch],bx ; get ready to deallocate next batch + 13738 00000EAB FF0E[AE02] dec word [Nest] ; is there another batch file? + 13739 00000EAF 75D7 jnz short _ClearBatch ; keep going until no batch file + 13740 + 13741 00000EB1 880E[9D02] mov [EchoFlag],cl ;restore echo status + 13742 00000EB5 C706[4902]0000 mov word [Batch],0 ;no batch process in progress + 13743 fb_ret: + 13744 00000EBB 07 pop es + 13745 00000EBC C3 ret + 13746 + 13747 ;free_batch endp + 13748 + 13749 ;============================================================================ + 13750 ; TFOR.ASM, MSDOS 6.0, 1991 + 13751 ;============================================================================ + 13752 ; 10/10/2018 - Retro DOS v3.0 + 13753 + 13754 ; All batch proccessing has DS set to segment of resident portion + 13755 + 13756 ;ASSUME DS:RESGROUP,ES:TRANGROUP + 13757 + 13758 ; MSDOS 3.3 COMMAND.COM, transient portion/segment offset 0BE9h 13759 - 13760 ; --------------------------------------------------------------------------- - 13761 - 13762 ; 15/02/2023 - 13763 FORTERM: - 13764 ; MSDOS 6.0 - 13765 00000EBD 0E push cs ;AN037; Get local segment into - 13766 00000EBE 1F pop ds ;AN037; DS, ES - 13767 00000EBF 0E push cs ;AN037; - 13768 00000EC0 07 pop es ;AN037; - 13769 - 13770 ; MSDOS 3.3 (& MSDOS 6.0) - 13771 00000EC1 E89502 call FOROFF - 13772 ;mov ds,[cs:RESSEG] - 13773 00000EC4 268E1E[F59B] mov ds,[es:RESSEG] ; 15/02/2023 - MSDOS 5.0 - 13774 00000EC9 813E[A502]00FF cmp word [SingleCom],0FF00h - 13775 00000ECF 750F jne short BAT_CRLF - 13776 00000ED1 833E[AE02]00 cmp word [Nest],0 ;See if we have nested batch files - 13777 00000ED6 7508 jne short BAT_CRLF ;Yes - don't exit just yet - 13778 00000ED8 C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Cause a terminate - 13779 00000EDE EB12 jmp short NOFORP2 - 13780 BAT_CRLF: - 13781 00000EE0 F606[9D02]01 test byte [EchoFlag],1 ; Is echo on? - 13782 00000EE5 740B jz short NOFORP2 ; no - exit - 13783 00000EE7 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh - 13784 ; print CRLF if in batch - 13785 00000EED 7403 jz short NOFORP2 - 13786 00000EEF E8871A call CRLF2 - 13787 NOFORP2: - 13788 00000EF2 E90FF2 jmp TCOMMAND - 13789 - 13790 ; --------------------------------------------------------------------------- - 13791 - 13792 ;------ - 13793 ; For-loop processing. For loops are of the form: - 13794 ; for % in () do - 13795 ; where may contain references of the form %, which are - 13796 ; later substituted with the items in . The for-loop structure is - 13797 ; set-up by the procedure '$for'; successive calls to 'forproc' execute - 13798 ; once for each item in . All of the information needed for - 13799 ; loop processing is stored on a piece of memory gotten from 'alloc'. This - 13800 ; structure is actually fairly large, on the order of 700 bytes, and includes - 13801 ; a complete copy of the original command-line structure as parsed by - 13802 ; 'parseline', loop control variables, and a dma buffer for the - 13803 ; 'FindFirst/FindNext' expansion of wildcard filenames in . When loop - 13804 ; processing has completed, this chunk of memory is returned to the system. - 13805 ; - 13806 ; All of the previously defined variables, in 'datares', used for loop - 13807 ; processing may be erased. Only one, (DW) ForPtr, need be allocated. + 13760 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13761 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0DBFh + 13762 + 13763 ; --------------------------------------------------------------------------- + 13764 + 13765 ; 15/02/2023 + 13766 FORTERM: + 13767 ; MSDOS 6.0 + 13768 00000EBD 0E push cs ;AN037; Get local segment into + 13769 00000EBE 1F pop ds ;AN037; DS, ES + 13770 00000EBF 0E push cs ;AN037; + 13771 00000EC0 07 pop es ;AN037; + 13772 + 13773 ; MSDOS 3.3 (& MSDOS 6.0) + 13774 00000EC1 E89502 call FOROFF + 13775 ;mov ds,[cs:RESSEG] + 13776 00000EC4 268E1E[F59B] mov ds,[es:RESSEG] ; 15/02/2023 - MSDOS 5.0 + 13777 00000EC9 813E[A502]00FF cmp word [SingleCom],0FF00h + 13778 00000ECF 750F jne short BAT_CRLF + 13779 00000ED1 833E[AE02]00 cmp word [Nest],0 ;See if we have nested batch files + 13780 00000ED6 7508 jne short BAT_CRLF ;Yes - don't exit just yet + 13781 00000ED8 C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Cause a terminate + 13782 00000EDE EB12 jmp short NOFORP2 + 13783 BAT_CRLF: + 13784 00000EE0 F606[9D02]01 test byte [EchoFlag],1 ; Is echo on? + 13785 00000EE5 740B jz short NOFORP2 ; no - exit + 13786 00000EE7 F706[4902]FFFF test word [Batch],-1 ; 0FFFFh + 13787 ; print CRLF if in batch + 13788 00000EED 7403 jz short NOFORP2 + 13789 00000EEF E8871A call CRLF2 + 13790 NOFORP2: + 13791 00000EF2 E90FF2 jmp TCOMMAND + 13792 + 13793 ; --------------------------------------------------------------------------- + 13794 + 13795 ;------ + 13796 ; For-loop processing. For loops are of the form: + 13797 ; for % in () do + 13798 ; where may contain references of the form %, which are + 13799 ; later substituted with the items in . The for-loop structure is + 13800 ; set-up by the procedure '$for'; successive calls to 'forproc' execute + 13801 ; once for each item in . All of the information needed for + 13802 ; loop processing is stored on a piece of memory gotten from 'alloc'. This + 13803 ; structure is actually fairly large, on the order of 700 bytes, and includes + 13804 ; a complete copy of the original command-line structure as parsed by + 13805 ; 'parseline', loop control variables, and a dma buffer for the + 13806 ; 'FindFirst/FindNext' expansion of wildcard filenames in . When loop + 13807 ; processing has completed, this chunk of memory is returned to the system. 13808 ; - 13809 ; The error message, 'for_alloc_mes', should be moved into the file - 13810 ; containing all of the other error messages. + 13809 ; All of the previously defined variables, in 'datares', used for loop + 13810 ; processing may be erased. Only one, (DW) ForPtr, need be allocated. 13811 ; - 13812 ; Referencing the allocated for-loop structure is a little tricky. - 13813 ; At the moment, a byte is defined as part of a new segment, 'for_segment'. - 13814 ; When 'forproc' actually runs, ES and DS are set to point to the base of the - 13815 ; new chunk of memory. References to this byte, 'f', thus assemble correctly - 13816 ; as offsets of ES or DS. 'f' would not be necessary, except that the - 13817 ; assembler translates an instruction such as 'mov AX, [for_minarg]' as an - 13818 ; immediate move of the offset of 'for_minarg' into AX. In other words, in - 13819 ; terms of PDP-11 mnemonics, the assembler ACTUALLY assembles - 13820 ; mov AX, #for_minarg ; AX := 02CA (for example) - 13821 ; instead of - 13822 ; mov AX, for_minarg ; AX := [02CA] (contents of 02CA) - 13823 ; By using 'f', we pretend that we are actually referencing an allocated - 13824 ; structure, and the assembler coughs up the code we want. Notice that it - 13825 ; doesn't matter whether we put brackets around the location or not -- the - 13826 ; assembler is "smart" enough to know that we want an address instead of the - 13827 ; contents of that location. - 13828 ; - 13829 ; Finally, there now exists the potential to easily implement nested loops. - 13830 ; One method would be to have a link field in each for-structure pointing to - 13831 ; its parent. Variable references that couldn't be resolved in the local - 13832 ; frame would cause a search of prior frames. For-structures would still be - 13833 ; allocated and released in exactly the same fashion. The only limit on the - 13834 ; number of nested loops would be memory size (although at 700 bytes a pop, - 13835 ; memory wouldn't last THAT long). Alternately, a small structure could be - 13836 ; maintained in the resident data area. This structure would be an array of - 13837 ; control-variable names and pointers to for-structure blocks. This would - 13838 ; greatly speed up the resolution of non-local variable references. However, - 13839 ; since space in the resident is precious, we would have to compromise on a - 13840 ; "reasonable" level of nesting -- 10, 16, 32 levels, whatever. For-structure - 13841 ; allocation and de-allocation would have to be modified slightly to take this - 13842 ; new structure into account. - 13843 ; - 13844 ; Oops, just one more thing. Forbuf need not be a part of the for-structure. - 13845 ; It could just as well be one structure allocated in 'transpace'. Actually, - 13846 ; it may be easier to allocate it as part of 'for_segment'. - 13847 ;------ - 13848 ; include fordata.asm - 13849 - 13850 ; Data structure definitions included by tfor.asm - 13851 - 13852 struc FOR_INFO - 13853 00000000 .FOR_ARGS: resb ARG_UNIT.SIZE ; argv[] structure - 13854 00000444 ?? .FOR_COM_START: resb 1 ; beginning of - 13855 00000445 ???? .FOR_EXPAND: resw 1 ; * or ? item in ? - 13856 00000447 ???? .FOR_MINARG: resw 1 ; beginning of - 13857 00000449 ???? .FOR_MAXARG: resw 1 ; end of - 13858 0000044B .FORBUF: resw 64 ; temporary buffer - 13859 000004CB .FORDMA: resw 64 ; FindFirst/Next buffer - 13860 0000054B ?? .FOR_VAR: resb 1 ; loop control variable - 13861 .size: - 13862 endstruc - 13863 ; ARG_UNIT.SIZE = 1348 (544h) - 13864 ; ARG_UNIT.SIZE = 1092 ; 27/07/2024 - 13865 _$FOR_EXIT: - 13866 00000EF5 EBC6 jmp short FORTERM ; exceeding maxarg means all done - 13867 - 13868 ; --------------------------------------------------------------------------- - 13869 - 13870 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 13871 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 13872 FORPROC: - 13873 00000EF7 A1[AC02] mov ax,[ForPtr] - 13874 00000EFA 8ED8 mov ds,ax - 13875 00000EFC 8EC0 mov es,ax ; operate in for-info area - 13876 ;;mov dx,5CBh ; MSDOS 5.0 & 6.22 - 13877 ;mov dx,4CBh ; PCDOS 7.1 ; 27/07/2024 - 13878 00000EFE BACB04 mov dx,FOR_INFO.FORDMA ; 1348+1+2+2+2+128 = 1483 = 5CBh - 13879 ; PCDOS 7.1 COMMAND.COM ; 1092+1+2+2+2+128 = 1227 = 4CBh - 13880 00000F01 B8001A mov ax,1A00h - 13881 ;mov ax,Set_DMA*256 ; 1A00h - 13882 00000F04 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 13883 ; DS:DX -> disk transfer buffer - 13884 FOR_BEGIN: - 13885 ;;cmp word [545h],0 - 13886 ;cmp word [445h] ; 27/07/2024 - 13887 00000F06 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 - 13888 00000F0B 7404 jz short FOR_BEGIN1 - 13889 ; non-zero for_expand equals FALSE - 13890 ;;inc word [547h] - 13891 ;inc word [447h] ; 27/07/2024 - 13892 00000F0D FF064704 inc word [FOR_INFO.FOR_MINARG] - 13893 FOR_BEGIN1: - 13894 ;mov bx,[447h] ; 27/07/2024 - 13895 00000F11 8B1E4704 mov bx,[FOR_INFO.FOR_MINARG] ; current item in to examine - 13896 ;cmp bx,[449h] ; 27/07/2024 - 13897 00000F15 3B1E4904 cmp bx,[FOR_INFO.FOR_MAXARG] - 13898 00000F19 7FDA jg short _$FOR_EXIT ; exceeding maxarg means all done - 13899 ;mov ax,0 - 13900 00000F1B B80000 mov ax,FOR_INFO.FOR_ARGS ; 0 - 13901 00000F1E E86F26 call argv_calc ; compute argv[x] address - 13902 ;mov cx,[bx+3] - 13903 00000F21 8B4F03 mov cx,[bx+ARGV_ELE.argstartel] - 13904 00000F24 8B17 mov dx,[bx] - 13905 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] - 13906 ;test byte [bx+2],4 ; Is there a path separator in this arg? - 13907 00000F26 F6470204 test byte [bx+ARGV_ELE.argflags],4 ; path_sep - 13908 00000F2A 7512 jnz short FORSUB ; Yes, argstartel should be correct - 13909 00000F2C 8B37 mov si,[bx] - 13910 ;mov si,[bx+ARGV_ELE.argpointer] - 13911 - 13912 ;mov al,[cs:LPAREN] - 13913 ; 15/02/2023 - 13914 ; MSDOS 6.0 (& 5.0) COMMAND.com - 13915 ;mov al,'(' ; mov al,lparen - 13916 ;cmp [si-1], al ; If the current token is the first - 13917 ; 27/07/2024 - 13918 00000F2E 807CFF28 cmp byte [si-1],'(' - 13919 00000F32 750A jne short FORSUB ; one in the list and originally had - 13920 00000F34 41 inc cx ; the opening paren as its first char, - 13921 ; the argstartel ptr needs to be - 13922 ; advanced passed it before the prefix - 13923 ; length is computed. - 13924 ;mov al,':' - 13925 ;cmp [si+1], al ; If the token begins with "(d:", - 13926 ; 27/07/2024 - 13927 00000F35 807C013A cmp byte [si+1],':' - 13928 00000F39 7503 jne short FORSUB ; argstartel has to be moved over the - 13929 00000F3B 83C102 add cx,2 ; rest of the prefix as well. - 13930 FORSUB: - 13931 00000F3E 29D1 sub cx,dx ; compute length of pathname prefix - 13932 ;;cmp word [545h],0 - 13933 ;cmp word [445h],0 ; 27/07/2024 - 13934 00000F40 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 - 13935 ; are we still expanding a name? - 13936 00000F45 7416 jz short FOR_FIND_NEXT - 13937 ; if so, get next matching filename - 13938 ;test byte [bx+2],2 - 13939 00000F47 F6470202 test byte [bx+ARGV_ELE.argflags],2 ; wildcard - 13940 00000F4B 7505 jnz short FOR_FIND_FIRST - 13941 ; should we expand THIS (new) arg? - 13942 ;mov cx,[bx+5] - 13943 ; else, just copy all of it directly - 13944 00000F4D 8B4F05 mov cx,[bx+ARGV_ELE.arglen] - 13945 00000F50 EB1D jmp short FOR_SMOOSH - 13946 - 13947 ;nop - 13948 ; 15/02/2023 - 13949 FOR_FIND_FIRST: - 13950 00000F52 51 push cx - 13951 00000F53 31C9 xor cx,cx - 13952 00000F55 B8004E mov ax,4E00h - 13953 ;mov ax,Find_First*256 ; 4E00h - 13954 00000F58 CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) - 13955 ; CX = search attributes - 13956 ; DS:DX -> ASCIZ filespec - 13957 ; (drive,path, and wildcards allowed) - 13958 00000F5A 59 pop cx - 13959 00000F5B EB05 jmp short FOR_RESULT - 13960 - 13961 ;nop - 13962 FOR_FIND_NEXT: - 13963 00000F5D B8004F mov ax,4F00h - 13964 ;mov ax,Find_Next*256 ;4F00h - 13965 00000F60 CD21 int 21h ; DOS - 2+ - FIND NEXT ASCIZ (FINDNEXT) - 13966 ; [DTA] = data block from - 13967 ; last AH = 4Eh/4Fh call - 13968 FOR_RESULT: - 13969 00000F62 B8FFFF mov ax,-1 ; 0FFFFh ; assume worst case - 13970 00000F65 7201 jc short FOR_CHECK - 13971 ; 15/02/2023 - 13972 00000F67 40 inc ax ; ax = 0 - 13973 ;mov ax,0 ; Find* returns 0 for SUCCESS - 13974 FOR_CHECK: ; record success of findfirst/next - 13975 ;;mov [545h],ax - 13976 ;mov [445h],ax ; 27/07/2024 - 13977 00000F68 A34504 mov [FOR_INFO.FOR_EXPAND],ax - 13978 00000F6B 09C0 or ax,ax ; anything out there? - 13979 00000F6D 7597 jnz short FOR_BEGIN ; if not, try next arg - 13980 FOR_SMOOSH: - 13981 ;mov si,[bx+ARGV_ELE.argpointer] ; mov si,[bx+0] - 13982 00000F6F 8B37 mov si,[bx] ; copy argv[arg][0,CX] into destbuf - 13983 ;;mov di,54Bh ; MSDOS 5.0 & 6.22 COMMAND.COM - 13984 ;mov di,44Bh ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM - 13985 00000F71 BF4B04 mov di,FOR_INFO.FORBUF ; some days this will be the entire - 13986 00000F74 F3A4 rep movsb ; arg, some days just the path prefix - 13987 - 13988 00000F76 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 - 13989 ; if we're not expanding, we can - 13990 00000F7B 7509 jnz short FOR_MAKE_COM ; skip the following - 13991 ; 15/02/2023 - 13992 ;;mov si,05E9h ; MSDOS 3.3 & 5.0 & 6.22 COMMAND.COM ; 27/07/2024 - 13993 ; 27/07/2024 - 13994 ;mov si,04E9h ; PCDOS 7.1 COMMAND.COM - 13995 00000F7D BEE904 mov si,FOR_INFO.FORDMA+FIND_BUF.PNAME ; 14/10/2018 - 13996 FOR_MORE: - 13997 ;cmp byte [si],0 ; tack on matching filename - 13998 ;jz short FOR_MAKE_COM - 13999 ;movsb - 14000 ;jnz short FOR_MORE - 14001 ; 25/04/2023 - 14002 00000F80 AC lodsb - 14003 00000F81 AA stosb - 14004 00000F82 08C0 or al,al - 14005 00000F84 75FA jnz short FOR_MORE - 14006 FOR_MAKE_COM: - 14007 ; 25/04/2023 - 14008 ;xor al,al ; tack a null byte onto the end - 14009 ;stosb ; of the substitute string - 14010 00000F86 31C9 xor cx,cx ; character count for command line - 14011 00000F88 F7D1 not cx ; negate it -- take advantage of loopnz - 14012 00000F8A 31DB xor bx,bx ; argpointer - 14013 00000F8C BF[569A] mov di,COMBUF+2 - 14014 ; 15/02/2023 - 14015 ;;mov bl,[544h] ; MSDOS 5.0-6.22 ; 27/07/2024 - 14016 ; 27/07/2024 - 14017 ;mov bl,[444h] ; PCDOS 7.1 COMMAND.COM - 14018 00000F8F 8A1E4404 mov bl,[FOR_INFO.FOR_COM_START] ; argindex - 14019 ;;mov dh,[64Bh] - 14020 ;mov dh,[54Bh] ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM - 14021 00000F93 8A364B05 mov dh,[FOR_INFO.FOR_VAR] - 14022 ; % is replaced by [forbuf] - 14023 00000F97 0E push cs ; time to form the string - 14024 00000F98 07 pop es - 14025 ;assume ES:trangroup - 14026 ;mov ax,FOR_INFO.FOR_ARGS - 14027 00000F99 B80000 mov ax,0 ; translate offset to pointer - 14028 00000F9C E8F125 call argv_calc - 14029 ;mov si,[bx+9] - 14030 00000F9F 8B7709 mov si,[bx+ARGV_ELE.arg_ocomptr] - 14031 ; mov ptr passed beginning space - 14032 00000FA2 46 inc si - 14033 FOR_MAKE_LOOP: - 14034 00000FA3 8A04 mov al,[si] ; the arg, byte by byte - 14035 00000FA5 46 inc si - 14036 00000FA6 3C25 cmp al,'%' ; looking for % - 14037 00000FA8 7514 jne short FOR_STOSB ; no % ... add byte to string - 14038 00000FAA 3834 cmp [si],dh ; got the right ? - 14039 00000FAC 7510 jnz short FOR_STOSB ; got a %, but wrong - 14040 00000FAE 46 inc si ; skip over - 14041 - 14042 00000FAF 56 push si - 14043 ; 15/02/2023 - 14044 ;;mov si,54Bh ; MSDOS 5.0-6.22 ; 27/07/2024 - 14045 ; 27/07/2024 - 14046 ;mov si,44Bh ; PCDOS 7.1 COMMAND.COM - 14047 00000FB0 BE4B04 mov si,FOR_INFO.FORBUF - 14048 ; substitute the for - 14049 ; to make a final to execute - 14050 SLOOP: - 14051 00000FB3 AC lodsb ; grab all those bytes, and - 14052 00000FB4 AA stosb ; add 'em to the string, - 14053 00000FB5 08C0 or al,al ; until we run into a null - 14054 00000FB7 E0FA loopne SLOOP - 14055 00000FB9 4F dec di ; adjust length and pointer - 14056 00000FBA 41 inc cx ; so we can overwrite the null - 14057 00000FBB 5E pop si - 14058 00000FBC EBE5 jmp short FOR_MAKE_LOOP - 14059 ; got back for more bytes - 14060 FOR_STOSB: - 14061 00000FBE AA stosb ; take a byte from the arg - 14062 00000FBF 49 dec cx ; and put it into the to be - 14063 ; executed (and note length, too) - 14064 00000FC0 3C0D cmp al,0Dh - 14065 00000FC2 75DF jne short FOR_MAKE_LOOP ; If not done, loop. - 14066 FOR_MADE_COM: - 14067 00000FC4 F6D1 not cl - 14068 ;mov [cs:COMBUF+1],cl - 14069 ;mov ds,[cs:RESSEG] - 14070 ; 15/02/2023 - Retro DOS v4.0 COMMAND.COM - 14071 ; MSDOS 5.0 COMMAND.COM - 14072 00000FC6 26880E[559A] mov [es:COMBUF+1],cl - 14073 00000FCB 268E1E[F59B] mov ds,[es:RESSEG] - 14074 ;assume DS:resgroup - 14075 00000FD0 F606[9D02]01 test byte [EchoFlag],1 ; shall we echo this , dearie? - 14076 00000FD5 742F jz short NOECHO3 - 14077 ;cmp byte [NullFlag],nullcommand - 14078 00000FD7 803E[B402]01 cmp byte [NullFlag],1 ;G was there a command last time? - 14079 00000FDC 7403 jz short NO_CRLF_PR ;G no - don't print crlf - 14080 - 14081 00000FDE E89819 call CRLF2 ;G Print out prompt - 14082 NO_CRLF_PR: - 14083 00000FE1 C606[B402]00 mov byte [NullFlag],0 ;G reset no command flag - 14084 00000FE6 0E push cs - 14085 00000FE7 1F pop ds - 14086 00000FE8 57 push di - 14087 00000FE9 E80411 call PRINT_PROMPT ;G Prompt the user - 14088 00000FEC 5F pop di - 14089 - 14090 00000FED 26C645FF00 mov byte [es:di-1],0 ; yeah, PRINT it out... - 14091 00000FF2 C706[A09D][569A] mov word [string_ptr_2],COMBUF+2 - 14092 ; 17/04/2023 - 14093 00000FF8 BA[DF91] mov dx,string_buf_ptr - 14094 00000FFB E82A44 call std_printf - 14095 00000FFE 26C645FF0D mov byte [es:di-1],0Dh - 14096 00001003 E9ECF2 jmp DOCOM ; run silent, run deep... - 14097 NOECHO3: - 14098 00001006 C606[B402]00 mov byte [NullFlag],0 - 14099 0000100B 0E push cs - 14100 0000100C 1F pop ds - 14101 ;jmp DOCOM1 - 14102 ; 07/06/2023 - 14103 ; Retro DOS v4.2 COMMAND.COM - 14104 0000100D E9E5F2 jmp DOCOM0 ; MSDOS 6.22 COMMAND.COM - 14105 - 14106 FORNESTERRJ: ; no multi-loop processing... yet! - 14107 00001010 E84601 call FOROFF - 14108 00001013 E92901 jmp FORNESTERR - 14109 - 14110 ; --------------------------------------------------------------------------- - 14111 - 14112 FORERRORJ: - 14113 00001016 E9D9FB jmp FORERROR + 13812 ; The error message, 'for_alloc_mes', should be moved into the file + 13813 ; containing all of the other error messages. + 13814 ; + 13815 ; Referencing the allocated for-loop structure is a little tricky. + 13816 ; At the moment, a byte is defined as part of a new segment, 'for_segment'. + 13817 ; When 'forproc' actually runs, ES and DS are set to point to the base of the + 13818 ; new chunk of memory. References to this byte, 'f', thus assemble correctly + 13819 ; as offsets of ES or DS. 'f' would not be necessary, except that the + 13820 ; assembler translates an instruction such as 'mov AX, [for_minarg]' as an + 13821 ; immediate move of the offset of 'for_minarg' into AX. In other words, in + 13822 ; terms of PDP-11 mnemonics, the assembler ACTUALLY assembles + 13823 ; mov AX, #for_minarg ; AX := 02CA (for example) + 13824 ; instead of + 13825 ; mov AX, for_minarg ; AX := [02CA] (contents of 02CA) + 13826 ; By using 'f', we pretend that we are actually referencing an allocated + 13827 ; structure, and the assembler coughs up the code we want. Notice that it + 13828 ; doesn't matter whether we put brackets around the location or not -- the + 13829 ; assembler is "smart" enough to know that we want an address instead of the + 13830 ; contents of that location. + 13831 ; + 13832 ; Finally, there now exists the potential to easily implement nested loops. + 13833 ; One method would be to have a link field in each for-structure pointing to + 13834 ; its parent. Variable references that couldn't be resolved in the local + 13835 ; frame would cause a search of prior frames. For-structures would still be + 13836 ; allocated and released in exactly the same fashion. The only limit on the + 13837 ; number of nested loops would be memory size (although at 700 bytes a pop, + 13838 ; memory wouldn't last THAT long). Alternately, a small structure could be + 13839 ; maintained in the resident data area. This structure would be an array of + 13840 ; control-variable names and pointers to for-structure blocks. This would + 13841 ; greatly speed up the resolution of non-local variable references. However, + 13842 ; since space in the resident is precious, we would have to compromise on a + 13843 ; "reasonable" level of nesting -- 10, 16, 32 levels, whatever. For-structure + 13844 ; allocation and de-allocation would have to be modified slightly to take this + 13845 ; new structure into account. + 13846 ; + 13847 ; Oops, just one more thing. Forbuf need not be a part of the for-structure. + 13848 ; It could just as well be one structure allocated in 'transpace'. Actually, + 13849 ; it may be easier to allocate it as part of 'for_segment'. + 13850 ;------ + 13851 ; include fordata.asm + 13852 + 13853 ; Data structure definitions included by tfor.asm + 13854 + 13855 struc FOR_INFO + 13856 00000000 .FOR_ARGS: resb ARG_UNIT.SIZE ; argv[] structure + 13857 00000444 ?? .FOR_COM_START: resb 1 ; beginning of + 13858 00000445 ???? .FOR_EXPAND: resw 1 ; * or ? item in ? + 13859 00000447 ???? .FOR_MINARG: resw 1 ; beginning of + 13860 00000449 ???? .FOR_MAXARG: resw 1 ; end of + 13861 0000044B .FORBUF: resw 64 ; temporary buffer + 13862 000004CB .FORDMA: resw 64 ; FindFirst/Next buffer + 13863 0000054B ?? .FOR_VAR: resb 1 ; loop control variable + 13864 .size: + 13865 endstruc + 13866 ; ARG_UNIT.SIZE = 1348 (544h) + 13867 ; ARG_UNIT.SIZE = 1092 ; 27/07/2024 + 13868 _$FOR_EXIT: + 13869 00000EF5 EBC6 jmp short FORTERM ; exceeding maxarg means all done + 13870 + 13871 ; --------------------------------------------------------------------------- + 13872 + 13873 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 13874 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 13875 FORPROC: + 13876 00000EF7 A1[AC02] mov ax,[ForPtr] + 13877 00000EFA 8ED8 mov ds,ax + 13878 00000EFC 8EC0 mov es,ax ; operate in for-info area + 13879 ;;mov dx,5CBh ; MSDOS 5.0 & 6.22 + 13880 ;mov dx,4CBh ; PCDOS 7.1 ; 27/07/2024 + 13881 00000EFE BACB04 mov dx,FOR_INFO.FORDMA ; 1348+1+2+2+2+128 = 1483 = 5CBh + 13882 ; PCDOS 7.1 COMMAND.COM ; 1092+1+2+2+2+128 = 1227 = 4CBh + 13883 00000F01 B8001A mov ax,1A00h + 13884 ;mov ax,Set_DMA*256 ; 1A00h + 13885 00000F04 CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 13886 ; DS:DX -> disk transfer buffer + 13887 FOR_BEGIN: + 13888 ;;cmp word [545h],0 + 13889 ;cmp word [445h] ; 27/07/2024 + 13890 00000F06 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 + 13891 00000F0B 7404 jz short FOR_BEGIN1 + 13892 ; non-zero for_expand equals FALSE + 13893 ;;inc word [547h] + 13894 ;inc word [447h] ; 27/07/2024 + 13895 00000F0D FF064704 inc word [FOR_INFO.FOR_MINARG] + 13896 FOR_BEGIN1: + 13897 ;mov bx,[447h] ; 27/07/2024 + 13898 00000F11 8B1E4704 mov bx,[FOR_INFO.FOR_MINARG] ; current item in to examine + 13899 ;cmp bx,[449h] ; 27/07/2024 + 13900 00000F15 3B1E4904 cmp bx,[FOR_INFO.FOR_MAXARG] + 13901 00000F19 7FDA jg short _$FOR_EXIT ; exceeding maxarg means all done + 13902 ;mov ax,0 + 13903 00000F1B B80000 mov ax,FOR_INFO.FOR_ARGS ; 0 + 13904 00000F1E E86F26 call argv_calc ; compute argv[x] address + 13905 ;mov cx,[bx+3] + 13906 00000F21 8B4F03 mov cx,[bx+ARGV_ELE.argstartel] + 13907 00000F24 8B17 mov dx,[bx] + 13908 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] + 13909 ;test byte [bx+2],4 ; Is there a path separator in this arg? + 13910 00000F26 F6470204 test byte [bx+ARGV_ELE.argflags],4 ; path_sep + 13911 00000F2A 7512 jnz short FORSUB ; Yes, argstartel should be correct + 13912 00000F2C 8B37 mov si,[bx] + 13913 ;mov si,[bx+ARGV_ELE.argpointer] + 13914 + 13915 ;mov al,[cs:LPAREN] + 13916 ; 15/02/2023 + 13917 ; MSDOS 6.0 (& 5.0) COMMAND.com + 13918 ;mov al,'(' ; mov al,lparen + 13919 ;cmp [si-1], al ; If the current token is the first + 13920 ; 27/07/2024 + 13921 00000F2E 807CFF28 cmp byte [si-1],'(' + 13922 00000F32 750A jne short FORSUB ; one in the list and originally had + 13923 00000F34 41 inc cx ; the opening paren as its first char, + 13924 ; the argstartel ptr needs to be + 13925 ; advanced passed it before the prefix + 13926 ; length is computed. + 13927 ;mov al,':' + 13928 ;cmp [si+1], al ; If the token begins with "(d:", + 13929 ; 27/07/2024 + 13930 00000F35 807C013A cmp byte [si+1],':' + 13931 00000F39 7503 jne short FORSUB ; argstartel has to be moved over the + 13932 00000F3B 83C102 add cx,2 ; rest of the prefix as well. + 13933 FORSUB: + 13934 00000F3E 29D1 sub cx,dx ; compute length of pathname prefix + 13935 ;;cmp word [545h],0 + 13936 ;cmp word [445h],0 ; 27/07/2024 + 13937 00000F40 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 + 13938 ; are we still expanding a name? + 13939 00000F45 7416 jz short FOR_FIND_NEXT + 13940 ; if so, get next matching filename + 13941 ;test byte [bx+2],2 + 13942 00000F47 F6470202 test byte [bx+ARGV_ELE.argflags],2 ; wildcard + 13943 00000F4B 7505 jnz short FOR_FIND_FIRST + 13944 ; should we expand THIS (new) arg? + 13945 ;mov cx,[bx+5] + 13946 ; else, just copy all of it directly + 13947 00000F4D 8B4F05 mov cx,[bx+ARGV_ELE.arglen] + 13948 00000F50 EB1D jmp short FOR_SMOOSH + 13949 + 13950 ;nop + 13951 ; 15/02/2023 + 13952 FOR_FIND_FIRST: + 13953 00000F52 51 push cx + 13954 00000F53 31C9 xor cx,cx + 13955 00000F55 B8004E mov ax,4E00h + 13956 ;mov ax,Find_First*256 ; 4E00h + 13957 00000F58 CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) + 13958 ; CX = search attributes + 13959 ; DS:DX -> ASCIZ filespec + 13960 ; (drive,path, and wildcards allowed) + 13961 00000F5A 59 pop cx + 13962 00000F5B EB05 jmp short FOR_RESULT + 13963 + 13964 ;nop + 13965 FOR_FIND_NEXT: + 13966 00000F5D B8004F mov ax,4F00h + 13967 ;mov ax,Find_Next*256 ;4F00h + 13968 00000F60 CD21 int 21h ; DOS - 2+ - FIND NEXT ASCIZ (FINDNEXT) + 13969 ; [DTA] = data block from + 13970 ; last AH = 4Eh/4Fh call + 13971 FOR_RESULT: + 13972 00000F62 B8FFFF mov ax,-1 ; 0FFFFh ; assume worst case + 13973 00000F65 7201 jc short FOR_CHECK + 13974 ; 15/02/2023 + 13975 00000F67 40 inc ax ; ax = 0 + 13976 ;mov ax,0 ; Find* returns 0 for SUCCESS + 13977 FOR_CHECK: ; record success of findfirst/next + 13978 ;;mov [545h],ax + 13979 ;mov [445h],ax ; 27/07/2024 + 13980 00000F68 A34504 mov [FOR_INFO.FOR_EXPAND],ax + 13981 00000F6B 09C0 or ax,ax ; anything out there? + 13982 00000F6D 7597 jnz short FOR_BEGIN ; if not, try next arg + 13983 FOR_SMOOSH: + 13984 ;mov si,[bx+ARGV_ELE.argpointer] ; mov si,[bx+0] + 13985 00000F6F 8B37 mov si,[bx] ; copy argv[arg][0,CX] into destbuf + 13986 ;;mov di,54Bh ; MSDOS 5.0 & 6.22 COMMAND.COM + 13987 ;mov di,44Bh ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM + 13988 00000F71 BF4B04 mov di,FOR_INFO.FORBUF ; some days this will be the entire + 13989 00000F74 F3A4 rep movsb ; arg, some days just the path prefix + 13990 + 13991 00000F76 833E450400 cmp word [FOR_INFO.FOR_EXPAND],0 + 13992 ; if we're not expanding, we can + 13993 00000F7B 7509 jnz short FOR_MAKE_COM ; skip the following + 13994 ; 15/02/2023 + 13995 ;;mov si,05E9h ; MSDOS 3.3 & 5.0 & 6.22 COMMAND.COM ; 27/07/2024 + 13996 ; 27/07/2024 + 13997 ;mov si,04E9h ; PCDOS 7.1 COMMAND.COM + 13998 00000F7D BEE904 mov si,FOR_INFO.FORDMA+FIND_BUF.PNAME ; 14/10/2018 + 13999 FOR_MORE: + 14000 ;cmp byte [si],0 ; tack on matching filename + 14001 ;jz short FOR_MAKE_COM + 14002 ;movsb + 14003 ;jnz short FOR_MORE + 14004 ; 25/04/2023 + 14005 00000F80 AC lodsb + 14006 00000F81 AA stosb + 14007 00000F82 08C0 or al,al + 14008 00000F84 75FA jnz short FOR_MORE + 14009 FOR_MAKE_COM: + 14010 ; 25/04/2023 + 14011 ;xor al,al ; tack a null byte onto the end + 14012 ;stosb ; of the substitute string + 14013 00000F86 31C9 xor cx,cx ; character count for command line + 14014 00000F88 F7D1 not cx ; negate it -- take advantage of loopnz + 14015 00000F8A 31DB xor bx,bx ; argpointer + 14016 00000F8C BF[569A] mov di,COMBUF+2 + 14017 ; 15/02/2023 + 14018 ;;mov bl,[544h] ; MSDOS 5.0-6.22 ; 27/07/2024 + 14019 ; 27/07/2024 + 14020 ;mov bl,[444h] ; PCDOS 7.1 COMMAND.COM + 14021 00000F8F 8A1E4404 mov bl,[FOR_INFO.FOR_COM_START] ; argindex + 14022 ;;mov dh,[64Bh] + 14023 ;mov dh,[54Bh] ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM + 14024 00000F93 8A364B05 mov dh,[FOR_INFO.FOR_VAR] + 14025 ; % is replaced by [forbuf] + 14026 00000F97 0E push cs ; time to form the string + 14027 00000F98 07 pop es + 14028 ;assume ES:trangroup + 14029 ;mov ax,FOR_INFO.FOR_ARGS + 14030 00000F99 B80000 mov ax,0 ; translate offset to pointer + 14031 00000F9C E8F125 call argv_calc + 14032 ;mov si,[bx+9] + 14033 00000F9F 8B7709 mov si,[bx+ARGV_ELE.arg_ocomptr] + 14034 ; mov ptr passed beginning space + 14035 00000FA2 46 inc si + 14036 FOR_MAKE_LOOP: + 14037 00000FA3 8A04 mov al,[si] ; the arg, byte by byte + 14038 00000FA5 46 inc si + 14039 00000FA6 3C25 cmp al,'%' ; looking for % + 14040 00000FA8 7514 jne short FOR_STOSB ; no % ... add byte to string + 14041 00000FAA 3834 cmp [si],dh ; got the right ? + 14042 00000FAC 7510 jnz short FOR_STOSB ; got a %, but wrong + 14043 00000FAE 46 inc si ; skip over + 14044 + 14045 00000FAF 56 push si + 14046 ; 15/02/2023 + 14047 ;;mov si,54Bh ; MSDOS 5.0-6.22 ; 27/07/2024 + 14048 ; 27/07/2024 + 14049 ;mov si,44Bh ; PCDOS 7.1 COMMAND.COM + 14050 00000FB0 BE4B04 mov si,FOR_INFO.FORBUF + 14051 ; substitute the for + 14052 ; to make a final to execute + 14053 SLOOP: + 14054 00000FB3 AC lodsb ; grab all those bytes, and + 14055 00000FB4 AA stosb ; add 'em to the string, + 14056 00000FB5 08C0 or al,al ; until we run into a null + 14057 00000FB7 E0FA loopne SLOOP + 14058 00000FB9 4F dec di ; adjust length and pointer + 14059 00000FBA 41 inc cx ; so we can overwrite the null + 14060 00000FBB 5E pop si + 14061 00000FBC EBE5 jmp short FOR_MAKE_LOOP + 14062 ; got back for more bytes + 14063 FOR_STOSB: + 14064 00000FBE AA stosb ; take a byte from the arg + 14065 00000FBF 49 dec cx ; and put it into the to be + 14066 ; executed (and note length, too) + 14067 00000FC0 3C0D cmp al,0Dh + 14068 00000FC2 75DF jne short FOR_MAKE_LOOP ; If not done, loop. + 14069 FOR_MADE_COM: + 14070 00000FC4 F6D1 not cl + 14071 ;mov [cs:COMBUF+1],cl + 14072 ;mov ds,[cs:RESSEG] + 14073 ; 15/02/2023 - Retro DOS v4.0 COMMAND.COM + 14074 ; MSDOS 5.0 COMMAND.COM + 14075 00000FC6 26880E[559A] mov [es:COMBUF+1],cl + 14076 00000FCB 268E1E[F59B] mov ds,[es:RESSEG] + 14077 ;assume DS:resgroup + 14078 00000FD0 F606[9D02]01 test byte [EchoFlag],1 ; shall we echo this , dearie? + 14079 00000FD5 742F jz short NOECHO3 + 14080 ;cmp byte [NullFlag],nullcommand + 14081 00000FD7 803E[B402]01 cmp byte [NullFlag],1 ;G was there a command last time? + 14082 00000FDC 7403 jz short NO_CRLF_PR ;G no - don't print crlf + 14083 + 14084 00000FDE E89819 call CRLF2 ;G Print out prompt + 14085 NO_CRLF_PR: + 14086 00000FE1 C606[B402]00 mov byte [NullFlag],0 ;G reset no command flag + 14087 00000FE6 0E push cs + 14088 00000FE7 1F pop ds + 14089 00000FE8 57 push di + 14090 00000FE9 E80411 call PRINT_PROMPT ;G Prompt the user + 14091 00000FEC 5F pop di + 14092 + 14093 00000FED 26C645FF00 mov byte [es:di-1],0 ; yeah, PRINT it out... + 14094 00000FF2 C706[A09D][569A] mov word [string_ptr_2],COMBUF+2 + 14095 ; 17/04/2023 + 14096 00000FF8 BA[DF91] mov dx,string_buf_ptr + 14097 00000FFB E82A44 call std_printf + 14098 00000FFE 26C645FF0D mov byte [es:di-1],0Dh + 14099 00001003 E9ECF2 jmp DOCOM ; run silent, run deep... + 14100 NOECHO3: + 14101 00001006 C606[B402]00 mov byte [NullFlag],0 + 14102 0000100B 0E push cs + 14103 0000100C 1F pop ds + 14104 ;jmp DOCOM1 + 14105 ; 07/06/2023 + 14106 ; Retro DOS v4.2 COMMAND.COM + 14107 0000100D E9E5F2 jmp DOCOM0 ; MSDOS 6.22 COMMAND.COM + 14108 + 14109 FORNESTERRJ: ; no multi-loop processing... yet! + 14110 00001010 E84601 call FOROFF + 14111 00001013 E92901 jmp FORNESTERR + 14112 + 14113 ; --------------------------------------------------------------------------- 14114 - 14115 ; --------------------------------------------------------------------------- - 14116 - 14117 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F24h - 14118 - 14119 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 14120 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0FFEh + 14115 FORERRORJ: + 14116 00001016 E9D9FB jmp FORERROR + 14117 + 14118 ; --------------------------------------------------------------------------- + 14119 + 14120 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F24h 14121 - 14122 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 14123 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1040h - 14124 _$FOR: - 14125 00001019 8E06[F59B] mov es,[RESSEG] - 14126 0000101D 26803E[AB02]00 cmp byte [es:ForFlag],0 ; is another one already running? - 14127 00001023 75EB jnz short FORNESTERRJ ; if flag is set.... boom! - 14128 - 14129 ; Turn off any pipes in progress. - 14130 - 14131 00001025 26803E[1403]00 cmp byte [es:PipeFiles],0 ; Only turn off if present. - 14132 0000102B 7403 jz short NO_PIPE - 14133 0000102D E8F020 call PIPEDEL - 14134 NO_PIPE: - 14135 00001030 31D2 xor dx,dx ; counter (0 <= DX < argvcnt) - 14136 00001032 E8F400 call NEXTARG ; move to next argv[n] - 14137 00001035 72DF jc short FORERRORJ ; no more args -- bad forloop - 14138 00001037 3C25 cmp al,'%' ; next arg MUST start with '%'... - 14139 00001039 75DB jne short FORERRORJ - 14140 0000103B 89C5 mov bp,ax ; save forloop variable - 14141 0000103D AC lodsb - 14142 0000103E 08C0 or al,al ; and MUST end immediately... - 14143 00001040 75D4 jnz short FORERRORJ - 14144 00001042 E8E400 call NEXTARG ; let's make sure the next arg is 'in' - 14145 00001045 72CF jb short FORERRORJ - 14146 ;and ax,0DFDFh - 14147 00001047 25DFDF and ax,~2020h ; uppercase the letters - 14148 ; 15/02/2023 - 14149 ;cmp ax,4E49h ; MSDOS 5.0 - 14150 ;cmp ax,[IN_WORD] ; MSDOS 3.3 - 14151 ;cmp ax,in_word ; MSDOS 5.0 - 14152 0000104A 3D494E cmp ax,'IN' - 14153 0000104D 75C7 jnz short FORERRORJ - 14154 0000104F AC lodsb - 14155 - 14156 ; 15/02/2023 - 14157 ; MSDOS 3.3 - 14158 ;or al,al ; it, too, must end right away - 14159 ;jz short CHECKLPAREN - 14160 ;cmp al,[LPAREN] - 14161 ;jnz short FORERRORJ - 14162 ;;add word [bx+ARGV_ELE.argpointer],2 ; add word [bx+0],2 - 14163 ;add word [bx],2 - 14164 ;;add word [bx+9],2 - 14165 ;add word [bx+ARGV_ELE.arg_ocomptr],2 - 14166 ;;sub word [bx+5],2 - 14167 ;sub word [bx+ARGV_ELE.arglen],2 - 14168 ;mov ax,[si-1] - 14169 ;jmp short LPCHECK - 14170 - 14171 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 14172 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F5Bh + 14122 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 14123 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0FFEh + 14124 + 14125 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 14126 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1040h + 14127 _$FOR: + 14128 00001019 8E06[F59B] mov es,[RESSEG] + 14129 0000101D 26803E[AB02]00 cmp byte [es:ForFlag],0 ; is another one already running? + 14130 00001023 75EB jnz short FORNESTERRJ ; if flag is set.... boom! + 14131 + 14132 ; Turn off any pipes in progress. + 14133 + 14134 00001025 26803E[1403]00 cmp byte [es:PipeFiles],0 ; Only turn off if present. + 14135 0000102B 7403 jz short NO_PIPE + 14136 0000102D E8F020 call PIPEDEL + 14137 NO_PIPE: + 14138 00001030 31D2 xor dx,dx ; counter (0 <= DX < argvcnt) + 14139 00001032 E8F400 call NEXTARG ; move to next argv[n] + 14140 00001035 72DF jc short FORERRORJ ; no more args -- bad forloop + 14141 00001037 3C25 cmp al,'%' ; next arg MUST start with '%'... + 14142 00001039 75DB jne short FORERRORJ + 14143 0000103B 89C5 mov bp,ax ; save forloop variable + 14144 0000103D AC lodsb + 14145 0000103E 08C0 or al,al ; and MUST end immediately... + 14146 00001040 75D4 jnz short FORERRORJ + 14147 00001042 E8E400 call NEXTARG ; let's make sure the next arg is 'in' + 14148 00001045 72CF jb short FORERRORJ + 14149 ;and ax,0DFDFh + 14150 00001047 25DFDF and ax,~2020h ; uppercase the letters + 14151 ; 15/02/2023 + 14152 ;cmp ax,4E49h ; MSDOS 5.0 + 14153 ;cmp ax,[IN_WORD] ; MSDOS 3.3 + 14154 ;cmp ax,in_word ; MSDOS 5.0 + 14155 0000104A 3D494E cmp ax,'IN' + 14156 0000104D 75C7 jnz short FORERRORJ + 14157 0000104F AC lodsb + 14158 + 14159 ; 15/02/2023 + 14160 ; MSDOS 3.3 + 14161 ;or al,al ; it, too, must end right away + 14162 ;jz short CHECKLPAREN + 14163 ;cmp al,[LPAREN] + 14164 ;jnz short FORERRORJ + 14165 ;;add word [bx+ARGV_ELE.argpointer],2 ; add word [bx+0],2 + 14166 ;add word [bx],2 + 14167 ;;add word [bx+9],2 + 14168 ;add word [bx+ARGV_ELE.arg_ocomptr],2 + 14169 ;;sub word [bx+5],2 + 14170 ;sub word [bx+ARGV_ELE.arglen],2 + 14171 ;mov ax,[si-1] + 14172 ;jmp short LPCHECK 14173 - 14174 ; MSDOS 6.0 - 14175 ; Compaq bug fix -- exit from this loop on error + 14174 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 14175 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F5Bh 14176 - 14177 00001050 08C0 or al,al - 14178 00001052 75C2 jne short FORERRORJ ; jump on error + 14177 ; MSDOS 6.0 + 14178 ; Compaq bug fix -- exit from this loop on error 14179 - 14180 ; je short CHECKLPAREN - 14181 ; - 14182 ; Not null. Perhaps there are no spaces between this and the (: - 14183 ; FOR %i in(foo bar... - 14184 ; Check for the Lparen here - 14185 ; - 14186 ;; cmp al,lparen - 14187 ;; jnz short FORERRORJ + 14180 00001050 08C0 or al,al + 14181 00001052 75C2 jne short FORERRORJ ; jump on error + 14182 + 14183 ; je short CHECKLPAREN + 14184 ; + 14185 ; Not null. Perhaps there are no spaces between this and the (: + 14186 ; FOR %i in(foo bar... + 14187 ; Check for the Lparen here 14188 ; - 14189 ; The token was in(... We strip off the "in" part to simulate a separator - 14190 ; being there in the first place. + 14189 ;; cmp al,lparen + 14190 ;; jnz short FORERRORJ 14191 ; - 14192 ;; add word [bx+ARGV_ELE.argpointer],2 ; advance source pointer - 14193 ;; add word [bx+ARGV_ELE.arg_ocomptr],2 - 14194 ;; ; advance original string - 14195 ;; sub word [bx+ARGV_ELE.arglen],2 ; decrement the appropriate length - 14196 ; - 14197 ; SI now points past the in(. Simulate a nextarg call that results in the - 14198 ; current value. + 14192 ; The token was in(... We strip off the "in" part to simulate a separator + 14193 ; being there in the first place. + 14194 ; + 14195 ;; add word [bx+ARGV_ELE.argpointer],2 ; advance source pointer + 14196 ;; add word [bx+ARGV_ELE.arg_ocomptr],2 + 14197 ;; ; advance original string + 14198 ;; sub word [bx+ARGV_ELE.arglen],2 ; decrement the appropriate length 14199 ; - 14200 ;; mov ax,[si-1] ; get lparen and next char - 14201 ;; jmp short LPCHECK + 14200 ; SI now points past the in(. Simulate a nextarg call that results in the + 14201 ; current value. 14202 ; - 14203 ; end of Compaq bug fix - 14204 - 14205 ; --------------------------------------------------------------------------- - 14206 - 14207 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 14208 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F5Fh + 14203 ;; mov ax,[si-1] ; get lparen and next char + 14204 ;; jmp short LPCHECK + 14205 ; + 14206 ; end of Compaq bug fix + 14207 + 14208 ; --------------------------------------------------------------------------- 14209 - 14210 ; MSDOS 3.3 (& MSDOS 6.0) - 14211 CHECKLPAREN: - 14212 00001054 E8D200 call NEXTARG ; lparen delimits beginning of - 14213 00001057 72BD jc short FORERRORJ - 14214 LPCHECK: - 14215 ; 15/02/2023 - 14216 ; MSDOS 5.0 (% MSDOS 6.0) - 14217 ;;cmp al,[LPAREN] - 14218 ;cmp al,lparen - 14219 00001059 3C28 cmp al,'(' - 14220 0000105B 75B9 jne short FORERRORJ - 14221 0000105D 80FC00 cmp ah,0 - 14222 00001060 7410 je short FOR_PAREN_TOKEN - 14223 ;;cmp ah,[RPAREN] ; special case: null list - 14224 ;cmp ah,rparen - 14225 00001062 80FC29 cmp ah,')' - 14226 00001065 7503 jne short FOR_LIST_NOT_EMPTY - 14227 00001067 E953FE jmp FORTERM - 14228 FOR_LIST_NOT_EMPTY: - 14229 ;inc word [bx+ARGV_ELE.argpointer] ; inc word [bx+0] - 14230 0000106A FF07 inc word [bx] ; Advance ptr past "(" - 14231 ;dec word [bx+5] ; Adjust the rest of this argv entry - 14232 0000106C FF4F05 dec word [bx+ARGV_ELE.arglen] ; to agree. - 14233 0000106F 46 inc si ; Inc si so check for ")" works - 14234 00001070 EB0D jmp short FOR_LIST - 14235 - 14236 ;nop - 14237 FOR_PAREN_TOKEN: - 14238 00001072 E8B400 call NEXTARG ; what have we in our ? - 14239 00001075 729F jc short FORERRORJ - 14240 ; 15/02/2023 - 14241 ;;;cmp ax,[RPAREN+1] - 14242 ;;cmp ax,[NULLRPAREN] ; special case: null list - 14243 ;cmp ax,nullrparen - 14244 00001077 83F829 cmp ax,29h ; db 29h,0 ; db ')',0 - 14245 0000107A 7503 jne short FOR_LIST - 14246 0000107C E93EFE jmp FORTERM - 14247 - 14248 ;FORERORJJ: - 14249 ;jmp FORERROR + 14210 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 14211 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:0F5Fh + 14212 + 14213 ; MSDOS 3.3 (& MSDOS 6.0) + 14214 CHECKLPAREN: + 14215 00001054 E8D200 call NEXTARG ; lparen delimits beginning of + 14216 00001057 72BD jc short FORERRORJ + 14217 LPCHECK: + 14218 ; 15/02/2023 + 14219 ; MSDOS 5.0 (% MSDOS 6.0) + 14220 ;;cmp al,[LPAREN] + 14221 ;cmp al,lparen + 14222 00001059 3C28 cmp al,'(' + 14223 0000105B 75B9 jne short FORERRORJ + 14224 0000105D 80FC00 cmp ah,0 + 14225 00001060 7410 je short FOR_PAREN_TOKEN + 14226 ;;cmp ah,[RPAREN] ; special case: null list + 14227 ;cmp ah,rparen + 14228 00001062 80FC29 cmp ah,')' + 14229 00001065 7503 jne short FOR_LIST_NOT_EMPTY + 14230 00001067 E953FE jmp FORTERM + 14231 FOR_LIST_NOT_EMPTY: + 14232 ;inc word [bx+ARGV_ELE.argpointer] ; inc word [bx+0] + 14233 0000106A FF07 inc word [bx] ; Advance ptr past "(" + 14234 ;dec word [bx+5] ; Adjust the rest of this argv entry + 14235 0000106C FF4F05 dec word [bx+ARGV_ELE.arglen] ; to agree. + 14236 0000106F 46 inc si ; Inc si so check for ")" works + 14237 00001070 EB0D jmp short FOR_LIST + 14238 + 14239 ;nop + 14240 FOR_PAREN_TOKEN: + 14241 00001072 E8B400 call NEXTARG ; what have we in our ? + 14242 00001075 729F jc short FORERRORJ + 14243 ; 15/02/2023 + 14244 ;;;cmp ax,[RPAREN+1] + 14245 ;;cmp ax,[NULLRPAREN] ; special case: null list + 14246 ;cmp ax,nullrparen + 14247 00001077 83F829 cmp ax,29h ; db 29h,0 ; db ')',0 + 14248 0000107A 7503 jne short FOR_LIST + 14249 0000107C E93EFE jmp FORTERM 14250 - 14251 FOR_LIST: ; skip over rest of - 14252 0000107F 89D1 mov cx,dx ; first arg of + 14251 ;FORERORJJ: + 14252 ;jmp FORERROR 14253 - 14254 SKIP_LIST: - 14255 ;add si,[bx+5] - 14256 00001081 037705 add si,[bx+ARGV_ELE.arglen] - 14257 00001084 83EE03 sub si,3 ; si = ptr to last char of token - 14258 ; 15/02/2023 - 14259 ;;mov al,[RPAREN] - 14260 ;mov al,rparen - 14261 00001087 B029 mov al,')' - 14262 00001089 3804 cmp [si],al ; Is this the last element in - 14263 0000108B 7408 je short FOR_END_LIST ; Yes, exit loop. - 14264 0000108D E89900 call NEXTARG ; No, get next arg - 14265 ;jc short FORERORJJ ; If no more and no rparen, error. - 14266 ;jmp short SKIP_LIST - 14267 ; 15/02/2023 - 14268 00001090 73EF jnc short SKIP_LIST - 14269 + 14254 FOR_LIST: ; skip over rest of + 14255 0000107F 89D1 mov cx,dx ; first arg of + 14256 + 14257 SKIP_LIST: + 14258 ;add si,[bx+5] + 14259 00001081 037705 add si,[bx+ARGV_ELE.arglen] + 14260 00001084 83EE03 sub si,3 ; si = ptr to last char of token + 14261 ; 15/02/2023 + 14262 ;;mov al,[RPAREN] + 14263 ;mov al,rparen + 14264 00001087 B029 mov al,')' + 14265 00001089 3804 cmp [si],al ; Is this the last element in + 14266 0000108B 7408 je short FOR_END_LIST ; Yes, exit loop. + 14267 0000108D E89900 call NEXTARG ; No, get next arg + 14268 ;jc short FORERORJJ ; If no more and no rparen, error. + 14269 ;jmp short SKIP_LIST 14270 ; 15/02/2023 - 14271 FORERORJJ: - 14272 00001092 E95DFB jmp FORERROR - 14273 - 14274 FOR_END_LIST: - 14275 00001095 89D7 mov di,dx ; record position of last arg in - 14276 00001097 C60400 mov byte [si],0 ; Zap the rparen - 14277 ; 15/02/2023 - 14278 ;;;cmp ax,[RPAREN+1] - 14279 ;;cmp ax,[NULLRPAREN] ; Was this token only a rparen - 14280 ;cmp ax,nullparen - 14281 0000109A 83F829 cmp ax,29h ; db 29h,0 ; db ')',0 - 14282 0000109D 7401 je short FOR_DO ; Yes, continue - 14283 0000109F 47 inc di ; No, inc position of last arg - 14284 FOR_DO: - 14285 000010A0 E88600 call NEXTARG ; now we had BETTER find a 'do'... - 14286 000010A3 72ED jc short FORERORJJ - 14287 ;and ax,0DFDFh - 14288 000010A5 25DFDF and ax,~2020h ; uppercase the letters - 14289 ; 15/02/2023 - 14290 ;;cmp ax,[DO_WORD] - 14291 ;cmp ax,do_word ; 4F44h - 14292 000010A8 3D444F cmp ax,'DO' ; 4F44h - 14293 000010AB 75E5 jne short FORERORJJ - 14294 000010AD AC lodsb - 14295 000010AE 08C0 or al,al ; and it had BETTER be ONLY a 'do'... - 14296 000010B0 75E0 jnz short FORERORJJ - 14297 - 14298 000010B2 E87400 call NEXTARG ; on to the beginning of - 14299 000010B5 72DB jc short FORERORJJ ; null not legal - 14300 - 14301 000010B7 50 push ax - 14302 000010B8 53 push bx - 14303 000010B9 51 push cx - 14304 000010BA 52 push dx ; preserve registers against disaster - 14305 000010BB 57 push di - 14306 000010BC 56 push si - 14307 000010BD 55 push bp - 14308 000010BE E852F7 call FREE_TPA ; need to make free memory, first - 14309 000010C1 E89500 call FOROFF - 14310 ;mov bx,264 ; 27/07/2024 ; MSDOS 5.0-6.22 & PCDOS 7.1 - 14311 000010C4 BB0801 mov bx,FOR_INFO.size-ARG_UNIT.SIZE - 14312 000010C7 E8E927 call SAVE_ARGS ; extra bytes needed for for-info - 14313 000010CA 9C pushf - 14314 000010CB 26A3[AC02] mov [es:ForPtr],ax - 14315 000010CF E852F7 call ALLOC_TPA ; ALLOC_TPA clobbers registers... - 14316 000010D2 9D popf - 14317 000010D3 5D pop bp - 14318 000010D4 5E pop si - 14319 000010D5 5F pop di - 14320 000010D6 5A pop dx - 14321 000010D7 59 pop cx - 14322 000010D8 5B pop bx - 14323 000010D9 58 pop ax - 14324 000010DA 723C jc short FOR_ALLOC_ERR - 14325 - 14326 000010DC 06 push es ; save resgroup seg... - 14327 000010DD 26FF36[AC02] push word [es:ForPtr] - 14328 000010E2 07 pop es - 14329 ;assume es:for_segment - 14330 000010E3 49 dec cx ; forproc wants min pointing before - 14331 000010E4 4F dec di ; first arg, max right at last one - 14332 ; 15/02/2023 - 14333 ;;mov [547h],cx - 14334 ; 27/07/2024 - 14335 ;mov [447h],cx ; PCDOS 7.1 COMMAND.COM - 14336 000010E5 26890E4704 mov [es:FOR_INFO.FOR_MINARG],cx - 14337 ;;mov [549h],di - 14338 ;mov [449h],di ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 - 14339 000010EA 26893E4904 mov [es:FOR_INFO.FOR_MAXARG],di - 14340 ;;mov [544h],dl - 14341 ;mov [444h],dl ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 - 14342 000010EF 2688164404 mov [es:FOR_INFO.FOR_COM_START],dl - 14343 ;;mov word [545h],0FFFFh ; -1 - 14344 ;mov [445h],0FFFFh ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 - 14345 000010F4 26C7064504FFFF mov word [es:FOR_INFO.FOR_EXPAND],-1 - 14346 ; non-zero means FALSE - 14347 000010FB 89E8 mov ax,bp - 14348 ;;mov [64Bh],ah - 14349 ;mov [54Bh],ah ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM - 14350 000010FD 2688264B05 mov [es:FOR_INFO.FOR_VAR],ah - 14351 00001102 07 pop es - 14352 ;assume es:resgroup - 14353 00001103 26FE06[AB02] inc byte [es:ForFlag] - 14354 00001108 26833E[A502]FF cmp word [es:SingleCom],-1 - 14355 0000110E 7507 jne short FOR_RET - 14356 00001110 26C706[A502]00FF mov word [es:SingleCom],0FF00h - 14357 FOR_RET: - 14358 00001117 C3 retn - 14359 - 14360 FOR_ALLOC_ERR: - 14361 ; 15/02/2023 - 14362 ; MSDOS 3.3 - 14363 ;mov dx,INSFMEMMESPTR - 14364 ;jmp CERROR - 14365 - 14366 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 14367 ; MSDOS 6.0 - 14368 ;mov byte [msg_disp_class],1 - 14369 00001118 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 14370 ;AN000; set up extended error msg class - 14371 ;mov dx,offset TranGroup:Extend_Buf_ptr - 14372 0000111D BA[D78F] mov dx,extend_buf_ptr - 14373 ;AC000; get extended message pointer - 14374 ;mov word [extend_buf_ptr],8 - 14375 00001120 C706[D78F]0800 mov word [extend_buf_ptr],ERROR_NOT_ENOUGH_MEMORY - 14376 ;AN000; get message number in control block - 14377 00001126 E9FD1B jmp cerror - 14378 - 14379 - 14380 ; =============== S U B R O U T I N E ======================================= + 14271 00001090 73EF jnc short SKIP_LIST + 14272 + 14273 ; 15/02/2023 + 14274 FORERORJJ: + 14275 00001092 E95DFB jmp FORERROR + 14276 + 14277 FOR_END_LIST: + 14278 00001095 89D7 mov di,dx ; record position of last arg in + 14279 00001097 C60400 mov byte [si],0 ; Zap the rparen + 14280 ; 15/02/2023 + 14281 ;;;cmp ax,[RPAREN+1] + 14282 ;;cmp ax,[NULLRPAREN] ; Was this token only a rparen + 14283 ;cmp ax,nullparen + 14284 0000109A 83F829 cmp ax,29h ; db 29h,0 ; db ')',0 + 14285 0000109D 7401 je short FOR_DO ; Yes, continue + 14286 0000109F 47 inc di ; No, inc position of last arg + 14287 FOR_DO: + 14288 000010A0 E88600 call NEXTARG ; now we had BETTER find a 'do'... + 14289 000010A3 72ED jc short FORERORJJ + 14290 ;and ax,0DFDFh + 14291 000010A5 25DFDF and ax,~2020h ; uppercase the letters + 14292 ; 15/02/2023 + 14293 ;;cmp ax,[DO_WORD] + 14294 ;cmp ax,do_word ; 4F44h + 14295 000010A8 3D444F cmp ax,'DO' ; 4F44h + 14296 000010AB 75E5 jne short FORERORJJ + 14297 000010AD AC lodsb + 14298 000010AE 08C0 or al,al ; and it had BETTER be ONLY a 'do'... + 14299 000010B0 75E0 jnz short FORERORJJ + 14300 + 14301 000010B2 E87400 call NEXTARG ; on to the beginning of + 14302 000010B5 72DB jc short FORERORJJ ; null not legal + 14303 + 14304 000010B7 50 push ax + 14305 000010B8 53 push bx + 14306 000010B9 51 push cx + 14307 000010BA 52 push dx ; preserve registers against disaster + 14308 000010BB 57 push di + 14309 000010BC 56 push si + 14310 000010BD 55 push bp + 14311 000010BE E852F7 call FREE_TPA ; need to make free memory, first + 14312 000010C1 E89500 call FOROFF + 14313 ;mov bx,264 ; 27/07/2024 ; MSDOS 5.0-6.22 & PCDOS 7.1 + 14314 000010C4 BB0801 mov bx,FOR_INFO.size-ARG_UNIT.SIZE + 14315 000010C7 E8E927 call SAVE_ARGS ; extra bytes needed for for-info + 14316 000010CA 9C pushf + 14317 000010CB 26A3[AC02] mov [es:ForPtr],ax + 14318 000010CF E852F7 call ALLOC_TPA ; ALLOC_TPA clobbers registers... + 14319 000010D2 9D popf + 14320 000010D3 5D pop bp + 14321 000010D4 5E pop si + 14322 000010D5 5F pop di + 14323 000010D6 5A pop dx + 14324 000010D7 59 pop cx + 14325 000010D8 5B pop bx + 14326 000010D9 58 pop ax + 14327 000010DA 723C jc short FOR_ALLOC_ERR + 14328 + 14329 000010DC 06 push es ; save resgroup seg... + 14330 000010DD 26FF36[AC02] push word [es:ForPtr] + 14331 000010E2 07 pop es + 14332 ;assume es:for_segment + 14333 000010E3 49 dec cx ; forproc wants min pointing before + 14334 000010E4 4F dec di ; first arg, max right at last one + 14335 ; 15/02/2023 + 14336 ;;mov [547h],cx + 14337 ; 27/07/2024 + 14338 ;mov [447h],cx ; PCDOS 7.1 COMMAND.COM + 14339 000010E5 26890E4704 mov [es:FOR_INFO.FOR_MINARG],cx + 14340 ;;mov [549h],di + 14341 ;mov [449h],di ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 + 14342 000010EA 26893E4904 mov [es:FOR_INFO.FOR_MAXARG],di + 14343 ;;mov [544h],dl + 14344 ;mov [444h],dl ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 + 14345 000010EF 2688164404 mov [es:FOR_INFO.FOR_COM_START],dl + 14346 ;;mov word [545h],0FFFFh ; -1 + 14347 ;mov [445h],0FFFFh ; PCDOS 7.1 COMMAND.COM ; 27/07/2024 + 14348 000010F4 26C7064504FFFF mov word [es:FOR_INFO.FOR_EXPAND],-1 + 14349 ; non-zero means FALSE + 14350 000010FB 89E8 mov ax,bp + 14351 ;;mov [64Bh],ah + 14352 ;mov [54Bh],ah ; 27/07/2024 ; PCDOS 7.1 COMMAND.COM + 14353 000010FD 2688264B05 mov [es:FOR_INFO.FOR_VAR],ah + 14354 00001102 07 pop es + 14355 ;assume es:resgroup + 14356 00001103 26FE06[AB02] inc byte [es:ForFlag] + 14357 00001108 26833E[A502]FF cmp word [es:SingleCom],-1 + 14358 0000110E 7507 jne short FOR_RET + 14359 00001110 26C706[A502]00FF mov word [es:SingleCom],0FF00h + 14360 FOR_RET: + 14361 00001117 C3 retn + 14362 + 14363 FOR_ALLOC_ERR: + 14364 ; 15/02/2023 + 14365 ; MSDOS 3.3 + 14366 ;mov dx,INSFMEMMESPTR + 14367 ;jmp CERROR + 14368 + 14369 ; 15/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 14370 ; MSDOS 6.0 + 14371 ;mov byte [msg_disp_class],1 + 14372 00001118 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 14373 ;AN000; set up extended error msg class + 14374 ;mov dx,offset TranGroup:Extend_Buf_ptr + 14375 0000111D BA[D78F] mov dx,extend_buf_ptr + 14376 ;AC000; get extended message pointer + 14377 ;mov word [extend_buf_ptr],8 + 14378 00001120 C706[D78F]0800 mov word [extend_buf_ptr],ERROR_NOT_ENOUGH_MEMORY + 14379 ;AN000; get message number in control block + 14380 00001126 E9FD1B jmp cerror 14381 - 14382 NEXTARG: - 14383 00001129 42 inc dx ; next argv[n] - 14384 ;cmp dx,[ARG_ARGVCNT] - 14385 0000112A 3B16[10A2] cmp dx,[ARG+ARG_UNIT.argvcnt] - 14386 ; make sure we don't run off end - 14387 0000112E 7D0D jge short NEXTARG_ERR ; of argv[]... - 14388 00001130 89D3 mov bx,dx - 14389 ;mov ax,ARG_ARGV - 14390 ;mov ax,ARG+ARG_UNIT.argv - 14391 00001132 B8[509F] mov ax,ARG - 14392 00001135 E85824 call argv_calc ; convert array index to pointer - 14393 00001138 8B37 mov si,[bx] ; load pointer to argstring - 14394 ;mov si,[bx+ARGV_ELE.argpointer] ; mov si,[bx+0] - 14395 0000113A AD lodsw ; and load first two chars - 14396 0000113B F8 clc - 14397 0000113C C3 retn - 14398 NEXTARG_ERR: - 14399 0000113D F9 stc - 14400 0000113E C3 retn - 14401 - 14402 ; --------------------------------------------------------------------------- - 14403 - 14404 FORNESTERR: - 14405 0000113F 1E push ds - 14406 00001140 8E1E[F59B] mov ds,[RESSEG] - 14407 ;ASSUME DS:RESGROUP - 14408 00001144 BA[5A91] mov dx,FORNESTMES_PTR - 14409 00001147 813E[A502]00FF cmp word [SingleCom],0FF00h - 14410 0000114D 7506 jne short NOFORP3 - 14411 0000114F C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Cause termination - 14412 NOFORP3: - 14413 00001155 1F pop ds - 14414 00001156 E9CD1B jmp cerror - 14415 - 14416 ; =============== S U B R O U T I N E ======================================= - 14417 - 14418 ; General routine called to free the for segment. We also clear the forflag - 14419 ; too. Change no registers. + 14382 + 14383 ; =============== S U B R O U T I N E ======================================= + 14384 + 14385 NEXTARG: + 14386 00001129 42 inc dx ; next argv[n] + 14387 ;cmp dx,[ARG_ARGVCNT] + 14388 0000112A 3B16[10A2] cmp dx,[ARG+ARG_UNIT.argvcnt] + 14389 ; make sure we don't run off end + 14390 0000112E 7D0D jge short NEXTARG_ERR ; of argv[]... + 14391 00001130 89D3 mov bx,dx + 14392 ;mov ax,ARG_ARGV + 14393 ;mov ax,ARG+ARG_UNIT.argv + 14394 00001132 B8[509F] mov ax,ARG + 14395 00001135 E85824 call argv_calc ; convert array index to pointer + 14396 00001138 8B37 mov si,[bx] ; load pointer to argstring + 14397 ;mov si,[bx+ARGV_ELE.argpointer] ; mov si,[bx+0] + 14398 0000113A AD lodsw ; and load first two chars + 14399 0000113B F8 clc + 14400 0000113C C3 retn + 14401 NEXTARG_ERR: + 14402 0000113D F9 stc + 14403 0000113E C3 retn + 14404 + 14405 ; --------------------------------------------------------------------------- + 14406 + 14407 FORNESTERR: + 14408 0000113F 1E push ds + 14409 00001140 8E1E[F59B] mov ds,[RESSEG] + 14410 ;ASSUME DS:RESGROUP + 14411 00001144 BA[5A91] mov dx,FORNESTMES_PTR + 14412 00001147 813E[A502]00FF cmp word [SingleCom],0FF00h + 14413 0000114D 7506 jne short NOFORP3 + 14414 0000114F C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Cause termination + 14415 NOFORP3: + 14416 00001155 1F pop ds + 14417 00001156 E9CD1B jmp cerror + 14418 + 14419 ; =============== S U B R O U T I N E ======================================= 14420 - 14421 FOROFF: - 14422 00001159 50 push ax - 14423 0000115A 06 push es - 14424 0000115B 2E8E06[F59B] mov es,[cs:RESSEG] - 14425 00001160 26A1[AC02] mov ax,[es:ForPtr] - 14426 00001164 09C0 or ax,ax - 14427 00001166 7408 jz short FREEDONE - 14428 00001168 06 push es - 14429 00001169 8EC0 mov es,ax - 14430 ; 15/02/2023 - 14431 0000116B B449 mov ah,49h - 14432 ;mov ah,DEALLOC ; 49h - 14433 0000116D CD21 int 21h ; DOS - 2+ - FREE MEMORY - 14434 ; ES = segment address of area to be freed - 14435 0000116F 07 pop es - 14436 FREEDONE: - 14437 00001170 26C706[AC02]0000 mov word [es:ForPtr],0 - 14438 00001177 26C606[AB02]00 mov byte [es:ForFlag],0 - 14439 0000117D 07 pop es - 14440 0000117E 58 pop ax - 14441 0000117F C3 retn - 14442 - 14443 ;============================================================================ - 14444 ; TCMD1A.ASM, MSDOS 6.0, 1991 - 14445 ;============================================================================ - 14446 ; 09/10/2018 - Retro DOS v3.0 - 14447 - 14448 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0ECBh - 14449 - 14450 ; --------------------------------------------------------------------------- - 14451 - 14452 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 14453 - 14454 %if 0 - 14455 - 14456 ; The DIR command displays the contents of a directory. - 14457 ; - 14458 ; **************************************************************** - 14459 ; * - 14460 ; * ROUTINE: CATALOG - display file(s) in directory - 14461 ; * - 14462 ; * FUNCTION: PARSE command line for drive, file, or path name. - 14463 ; * DIR allows two switches, /P (pause) and /W (wide). - 14464 ; * If an error occurs issue and error message and - 14465 ; * transfer control to CERROR. - 14466 ; * - 14467 ; * INPUT: command line at offset 81H - 14468 ; * - 14469 ; * OUTPUT: none - 14470 ; * - 14471 ; **************************************************************** - 14472 - 14473 CATALOG: - 14474 ; MSDOS 3.3 + 14421 ; General routine called to free the for segment. We also clear the forflag + 14422 ; too. Change no registers. + 14423 + 14424 FOROFF: + 14425 00001159 50 push ax + 14426 0000115A 06 push es + 14427 0000115B 2E8E06[F59B] mov es,[cs:RESSEG] + 14428 00001160 26A1[AC02] mov ax,[es:ForPtr] + 14429 00001164 09C0 or ax,ax + 14430 00001166 7408 jz short FREEDONE + 14431 00001168 06 push es + 14432 00001169 8EC0 mov es,ax + 14433 ; 15/02/2023 + 14434 0000116B B449 mov ah,49h + 14435 ;mov ah,DEALLOC ; 49h + 14436 0000116D CD21 int 21h ; DOS - 2+ - FREE MEMORY + 14437 ; ES = segment address of area to be freed + 14438 0000116F 07 pop es + 14439 FREEDONE: + 14440 00001170 26C706[AC02]0000 mov word [es:ForPtr],0 + 14441 00001177 26C606[AB02]00 mov byte [es:ForFlag],0 + 14442 0000117D 07 pop es + 14443 0000117E 58 pop ax + 14444 0000117F C3 retn + 14445 + 14446 ;============================================================================ + 14447 ; TCMD1A.ASM, MSDOS 6.0, 1991 + 14448 ;============================================================================ + 14449 ; 09/10/2018 - Retro DOS v3.0 + 14450 + 14451 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 0ECBh + 14452 + 14453 ; --------------------------------------------------------------------------- + 14454 + 14455 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 14456 + 14457 %if 0 + 14458 + 14459 ; The DIR command displays the contents of a directory. + 14460 ; + 14461 ; **************************************************************** + 14462 ; * + 14463 ; * ROUTINE: CATALOG - display file(s) in directory + 14464 ; * + 14465 ; * FUNCTION: PARSE command line for drive, file, or path name. + 14466 ; * DIR allows two switches, /P (pause) and /W (wide). + 14467 ; * If an error occurs issue and error message and + 14468 ; * transfer control to CERROR. + 14469 ; * + 14470 ; * INPUT: command line at offset 81H + 14471 ; * + 14472 ; * OUTPUT: none + 14473 ; * + 14474 ; **************************************************************** 14475 - 14476 ;mov ax,ARG_ARGV - 14477 ;mov ax,ARG+ARG_UNIT.argv - 14478 mov ax,ARG - 14479 mov dx,0FFFFh - 14480 xor cx,cx - 14481 xor si,si - 14482 DIR1: - 14483 ;cmp cx,[ARG_ARGVCNT] - 14484 cmp cx,[ARG+ARG_UNIT.argvcnt] - 14485 jnb short DIR6 ; No more arguments - 14486 mov bx,cx - 14487 call ARGV_CALC - 14488 ;or si,[bx+7] - 14489 or si,[bx+ARGV_ELE.argsw_word] - 14490 test si,7FFCh ; test si,~8003 - 14491 jnz short DIR2 ; /A,/B,/V switches (are invalid) - 14492 ;test byte [bx+2],1 - 14493 test byte [bx+ARGV_ELE.argflags],sw_flag ; 1 - 14494 jz short DIR3 - 14495 jmp short DIR5 - 14496 DIR2: - 14497 mov dx,BADPARMPTR - 14498 jmp CERROR - 14499 DIR3: - 14500 or cx,cx - 14501 jnz short DIR4 - 14502 ;cmp word [bx+5],3 - 14503 cmp word [bx+ARGV_ELE.arglen],3 - 14504 jz short DIR5 - 14505 ;add word [bx+ARGV_ELE.argpointer],3 ; add word [bx+0],3 - 14506 add word [bx],3 - 14507 ;add word [bx+9],3 - 14508 add word [bx+ARGV_ELE.arg_ocomptr],3 - 14509 ;add word [bx+3],3 - 14510 add word [bx+ARGV_ELE.argstartel],3 - 14511 ;sub word [bx+5],3 - 14512 sub word [bx+ARGV_ELE.arglen],3 - 14513 DIR4: - 14514 cmp dx,0FFFFh - 14515 jnz short DIR2 - 14516 mov dx,bx - 14517 DIR5: - 14518 inc cx - 14519 jmp short DIR1 - 14520 DIR6: - 14521 mov [COMSW],si - 14522 push dx - 14523 xor al,al - 14524 cmp dx,0FFFFh - 14525 jz short DIR7 - 14526 mov bx,dx - 14527 ;mov di,[bx+ARGV_ELE.argpointer] ;mov di,[bx+0] - 14528 mov di,[bx] - 14529 cmp byte [di+1],':' - 14530 jnz short DIR7 - 14531 mov al,[di] - 14532 or al,20h ; Lowercase drive name - 14533 sub al,'a'-1 ; 60h ; Convert to drive number (0,1..) - 14534 DIR7: - 14535 ;mov [5CH],al - 14536 mov [FCB],al - 14537 call OKVOLARG - 14538 mov al,'?' ; *.* is default file spec. - 14539 ;mov di,5Dh - 14540 mov di,FCB+1 - 14541 mov cx,11 - 14542 rep stosb - 14543 - 14544 ; Begin by processing any switches that may have been specified. - 14545 ; BITS will contain any information about switches that was - 14546 ; found when the command line was parsed. - 14547 - 14548 mov ax,[COMSW] ; Get switches from command - 14549 mov [_BITS],ax ; initialize switches - 14550 mov word [COMSW],0 ; initialize flags - 14551 mov byte [LINPERPAG],23 ; Set default for lines per page - 14552 ;test al,1 - 14553 test al,SWITCHW ; /W ? - 14554 ;mov al,1 - 14555 mov al,NORMPERLIN - 14556 jz short DIR8 - 14557 ;mov al,5 - 14558 mov al,WIDEPERLIN - 14559 DIR8: - 14560 mov [LINLEN],al ; Set number of entries per line - 14561 mov [LINCNT],al - 14562 mov word [FILECNT],0 ; Keep track of how many files found - 14563 mov dx,DIRBUF - 14564 mov ah,Set_DMA ; 1Ah - 14565 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 14566 ; DS:DX -> disk transfer buffer - 14567 ;mov dl,[5Ch] - 14568 mov dl,[FCB] - 14569 call SAVUDIR - 14570 pop bx - 14571 cmp bx,0FFFFh - 14572 jz short DIR9 - 14573 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] - 14574 mov dx,[bx] - 14575 - 14576 ; The user may have specified a device. Search for the path and see if the - 14577 ; attributes indicate a device. + 14476 CATALOG: + 14477 ; MSDOS 3.3 + 14478 + 14479 ;mov ax,ARG_ARGV + 14480 ;mov ax,ARG+ARG_UNIT.argv + 14481 mov ax,ARG + 14482 mov dx,0FFFFh + 14483 xor cx,cx + 14484 xor si,si + 14485 DIR1: + 14486 ;cmp cx,[ARG_ARGVCNT] + 14487 cmp cx,[ARG+ARG_UNIT.argvcnt] + 14488 jnb short DIR6 ; No more arguments + 14489 mov bx,cx + 14490 call ARGV_CALC + 14491 ;or si,[bx+7] + 14492 or si,[bx+ARGV_ELE.argsw_word] + 14493 test si,7FFCh ; test si,~8003 + 14494 jnz short DIR2 ; /A,/B,/V switches (are invalid) + 14495 ;test byte [bx+2],1 + 14496 test byte [bx+ARGV_ELE.argflags],sw_flag ; 1 + 14497 jz short DIR3 + 14498 jmp short DIR5 + 14499 DIR2: + 14500 mov dx,BADPARMPTR + 14501 jmp CERROR + 14502 DIR3: + 14503 or cx,cx + 14504 jnz short DIR4 + 14505 ;cmp word [bx+5],3 + 14506 cmp word [bx+ARGV_ELE.arglen],3 + 14507 jz short DIR5 + 14508 ;add word [bx+ARGV_ELE.argpointer],3 ; add word [bx+0],3 + 14509 add word [bx],3 + 14510 ;add word [bx+9],3 + 14511 add word [bx+ARGV_ELE.arg_ocomptr],3 + 14512 ;add word [bx+3],3 + 14513 add word [bx+ARGV_ELE.argstartel],3 + 14514 ;sub word [bx+5],3 + 14515 sub word [bx+ARGV_ELE.arglen],3 + 14516 DIR4: + 14517 cmp dx,0FFFFh + 14518 jnz short DIR2 + 14519 mov dx,bx + 14520 DIR5: + 14521 inc cx + 14522 jmp short DIR1 + 14523 DIR6: + 14524 mov [COMSW],si + 14525 push dx + 14526 xor al,al + 14527 cmp dx,0FFFFh + 14528 jz short DIR7 + 14529 mov bx,dx + 14530 ;mov di,[bx+ARGV_ELE.argpointer] ;mov di,[bx+0] + 14531 mov di,[bx] + 14532 cmp byte [di+1],':' + 14533 jnz short DIR7 + 14534 mov al,[di] + 14535 or al,20h ; Lowercase drive name + 14536 sub al,'a'-1 ; 60h ; Convert to drive number (0,1..) + 14537 DIR7: + 14538 ;mov [5CH],al + 14539 mov [FCB],al + 14540 call OKVOLARG + 14541 mov al,'?' ; *.* is default file spec. + 14542 ;mov di,5Dh + 14543 mov di,FCB+1 + 14544 mov cx,11 + 14545 rep stosb + 14546 + 14547 ; Begin by processing any switches that may have been specified. + 14548 ; BITS will contain any information about switches that was + 14549 ; found when the command line was parsed. + 14550 + 14551 mov ax,[COMSW] ; Get switches from command + 14552 mov [_BITS],ax ; initialize switches + 14553 mov word [COMSW],0 ; initialize flags + 14554 mov byte [LINPERPAG],23 ; Set default for lines per page + 14555 ;test al,1 + 14556 test al,SWITCHW ; /W ? + 14557 ;mov al,1 + 14558 mov al,NORMPERLIN + 14559 jz short DIR8 + 14560 ;mov al,5 + 14561 mov al,WIDEPERLIN + 14562 DIR8: + 14563 mov [LINLEN],al ; Set number of entries per line + 14564 mov [LINCNT],al + 14565 mov word [FILECNT],0 ; Keep track of how many files found + 14566 mov dx,DIRBUF + 14567 mov ah,Set_DMA ; 1Ah + 14568 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 14569 ; DS:DX -> disk transfer buffer + 14570 ;mov dl,[5Ch] + 14571 mov dl,[FCB] + 14572 call SAVUDIR + 14573 pop bx + 14574 cmp bx,0FFFFh + 14575 jz short DIR9 + 14576 ;mov dx,[bx+ARGV_ELE.argpointer] ; mov dx,[bx+0] + 14577 mov dx,[bx] 14578 - 14579 mov ah,Find_First ; 4Eh - 14580 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) - 14581 ; CX = search attributes - 14582 ; DS:DX -> ASCIZ filespec - 14583 ; (drive,path, and wildcards allowed) - 14584 jc short DIR10 - 14585 ; Check device atrribute.. - 14586 ;test byte [DIRBUF_ATTRIB2],40h - 14587 ;test byte [DIRBUF_ATTRIB2],ATTR_DEVICE - 14588 ; 14/10/2018 - 14589 ;test byte [DIRBUF+21],40h - 14590 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DEVICE - 14591 jz short DIR10 ; no, go do normal operation - 14592 mov word [COMSW],-2 ; 0FFFEh ; Signal device - 14593 DIR9: - 14594 jmp short DOHEADER - 14595 DIR10: - 14596 ;mov dx,[bx+ARGV_ELE.argpointer] - 14597 mov dx,[bx] - 14598 mov ah,CHDir ; 3Bh - 14599 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 14600 ; DS:DX -> ASCIZ directory name (may include drive) - 14601 jnc short DOHEADER - 14602 ;mov si,[bx+3] - 14603 mov si,[bx+ARGV_ELE.argstartel] - 14604 cmp dx,si - 14605 jz short DIR_NO_DRIVE - 14606 xor cl,cl - 14607 xchg cl,[si] - 14608 mov ah,CHDir ; 3Bh - 14609 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 14610 ; DS:DX -> ASCIZ directory name (may include drive) - 14611 xchg cl,[si] - 14612 jnc short DIR_NO_DRIVE - 14613 mov al,[si-1] - 14614 call PATHCHRCMP - 14615 jnz short DIR11 - 14616 mov al,[si-2] + 14579 ; The user may have specified a device. Search for the path and see if the + 14580 ; attributes indicate a device. + 14581 + 14582 mov ah,Find_First ; 4Eh + 14583 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) + 14584 ; CX = search attributes + 14585 ; DS:DX -> ASCIZ filespec + 14586 ; (drive,path, and wildcards allowed) + 14587 jc short DIR10 + 14588 ; Check device atrribute.. + 14589 ;test byte [DIRBUF_ATTRIB2],40h + 14590 ;test byte [DIRBUF_ATTRIB2],ATTR_DEVICE + 14591 ; 14/10/2018 + 14592 ;test byte [DIRBUF+21],40h + 14593 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DEVICE + 14594 jz short DIR10 ; no, go do normal operation + 14595 mov word [COMSW],-2 ; 0FFFEh ; Signal device + 14596 DIR9: + 14597 jmp short DOHEADER + 14598 DIR10: + 14599 ;mov dx,[bx+ARGV_ELE.argpointer] + 14600 mov dx,[bx] + 14601 mov ah,CHDir ; 3Bh + 14602 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 14603 ; DS:DX -> ASCIZ directory name (may include drive) + 14604 jnc short DOHEADER + 14605 ;mov si,[bx+3] + 14606 mov si,[bx+ARGV_ELE.argstartel] + 14607 cmp dx,si + 14608 jz short DIR_NO_DRIVE + 14609 xor cl,cl + 14610 xchg cl,[si] + 14611 mov ah,CHDir ; 3Bh + 14612 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 14613 ; DS:DX -> ASCIZ directory name (may include drive) + 14614 xchg cl,[si] + 14615 jnc short DIR_NO_DRIVE + 14616 mov al,[si-1] 14617 call PATHCHRCMP - 14618 jz short DIR12 - 14619 xchg cl,[si-1] - 14620 mov ah,CHDir ; 3Bh - 14621 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 14622 ; DS:DX -> ASCIZ directory name (may include drive) - 14623 xchg cl,[si-1] - 14624 jnc short DIR_NO_DRIVE - 14625 DIR11: - 14626 mov ch,':' - 14627 cmp ch,[si-1] - 14628 jnz short DIR12 - 14629 ;mov cx,[bx+ARGV_ELE.argpointer] ; mov cx,[bx+0] - 14630 mov cx,[bx] - 14631 xchg cx,si - 14632 sub cx,si - 14633 cmp cx,2 - 14634 jz short DIR_NO_DRIVE - 14635 DIR12: - 14636 mov dx,BADCDPTR - 14637 ;test byte [bx+2],4 - 14638 test byte [bx+ARGV_ELE.argflags],4 ; path_sep - 14639 jnz short DIRERROR - 14640 DIRNF: - 14641 mov dx,FNOTFOUNDPTR - 14642 DIRERROR: - 14643 jmp CERROR - 14644 DIR_NO_DRIVE: - 14645 cmp word [si],'..' - 14646 jnz short DOREALPARSE - 14647 cmp byte [si+2],0 - 14648 jnz short DOREALPARSE - 14649 inc word [COMSW] - 14650 jmp short DOHEADER - 14651 DOREALPARSE: - 14652 mov di,FCB ; 5Ch - 14653 ;mov ax,290Eh - 14654 mov ax,(Parse_File_Descriptor<<8)|0Eh - 14655 int 21h ; DOS - PARSE FILENAME - 14656 ; DS:SI -> string to parse - 14657 ; ES:DI -> buffer to fill with unopened FCB - 14658 ; AL = bit mask to control parsing - 14659 cmp byte [si],0 - 14660 jz short DOHEADER - 14661 dec word [COMSW] - 14662 DOHEADER: - 14663 - 14664 ; Display the header - 14665 - 14666 push bx - 14667 call BUILD_DIR_STRING - 14668 mov dx,DIRBUF - 14669 mov [VOL_DIR],dx - 14670 mov dx,DIRHEADPTR - 14671 call PRINTF_CRLF - 14672 pop bx - 14673 cmp bx,0FFFFh - 14674 jz short DOSEARCH - 14675 - 14676 ; If there were chars left after parse or device, then invalid file name - 14677 - 14678 cmp word [COMSW],0 - 14679 jz short DOSEARCH ; nothing left; good parse - 14680 jl short DIRNFFIX ; not .. => error file not found - 14681 call RESTUDIR - 14682 mov dx,BADCDPTR - 14683 jmp CERROR ; was .. => error directory not found - 14684 DIRNFFIX: - 14685 call RESTUDIR - 14686 jmp short DIRNF - 14687 - 14688 ; We are assured that everything is correct. Let's go and search. Use - 14689 ; attributes that will include finding directories. Perform the first search - 14690 ; and reset our directory afterward. - 14691 - 14692 DOSEARCH: - 14693 ;mov byte [55h],0FFh - 14694 mov byte [FCB-7],0FFh - 14695 ;mov byte [5Bh],10h - 14696 mov byte [FCB-1],10h - 14697 - 14698 ; Caution! Since we are using an extended FCB, we will *also* be returning - 14699 ; the directory information as an extended FCB. We must bias all fetches into - 14700 ; DIRBUF by 8 (Extended FCB part + drive) - 14701 - 14702 mov ah,Dir_Search_First ; 11h - 14703 mov dx,FCB-7 ; 55h - 14704 int 21h ; DOS - SEARCH FIRST USING FCB - 14705 ; DS:DX -> FCB - 14706 - 14707 ; Restore the user's directory. We preserve, though, the return from the - 14708 ; previous system call for later checking. + 14618 jnz short DIR11 + 14619 mov al,[si-2] + 14620 call PATHCHRCMP + 14621 jz short DIR12 + 14622 xchg cl,[si-1] + 14623 mov ah,CHDir ; 3Bh + 14624 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 14625 ; DS:DX -> ASCIZ directory name (may include drive) + 14626 xchg cl,[si-1] + 14627 jnc short DIR_NO_DRIVE + 14628 DIR11: + 14629 mov ch,':' + 14630 cmp ch,[si-1] + 14631 jnz short DIR12 + 14632 ;mov cx,[bx+ARGV_ELE.argpointer] ; mov cx,[bx+0] + 14633 mov cx,[bx] + 14634 xchg cx,si + 14635 sub cx,si + 14636 cmp cx,2 + 14637 jz short DIR_NO_DRIVE + 14638 DIR12: + 14639 mov dx,BADCDPTR + 14640 ;test byte [bx+2],4 + 14641 test byte [bx+ARGV_ELE.argflags],4 ; path_sep + 14642 jnz short DIRERROR + 14643 DIRNF: + 14644 mov dx,FNOTFOUNDPTR + 14645 DIRERROR: + 14646 jmp CERROR + 14647 DIR_NO_DRIVE: + 14648 cmp word [si],'..' + 14649 jnz short DOREALPARSE + 14650 cmp byte [si+2],0 + 14651 jnz short DOREALPARSE + 14652 inc word [COMSW] + 14653 jmp short DOHEADER + 14654 DOREALPARSE: + 14655 mov di,FCB ; 5Ch + 14656 ;mov ax,290Eh + 14657 mov ax,(Parse_File_Descriptor<<8)|0Eh + 14658 int 21h ; DOS - PARSE FILENAME + 14659 ; DS:SI -> string to parse + 14660 ; ES:DI -> buffer to fill with unopened FCB + 14661 ; AL = bit mask to control parsing + 14662 cmp byte [si],0 + 14663 jz short DOHEADER + 14664 dec word [COMSW] + 14665 DOHEADER: + 14666 + 14667 ; Display the header + 14668 + 14669 push bx + 14670 call BUILD_DIR_STRING + 14671 mov dx,DIRBUF + 14672 mov [VOL_DIR],dx + 14673 mov dx,DIRHEADPTR + 14674 call PRINTF_CRLF + 14675 pop bx + 14676 cmp bx,0FFFFh + 14677 jz short DOSEARCH + 14678 + 14679 ; If there were chars left after parse or device, then invalid file name + 14680 + 14681 cmp word [COMSW],0 + 14682 jz short DOSEARCH ; nothing left; good parse + 14683 jl short DIRNFFIX ; not .. => error file not found + 14684 call RESTUDIR + 14685 mov dx,BADCDPTR + 14686 jmp CERROR ; was .. => error directory not found + 14687 DIRNFFIX: + 14688 call RESTUDIR + 14689 jmp short DIRNF + 14690 + 14691 ; We are assured that everything is correct. Let's go and search. Use + 14692 ; attributes that will include finding directories. Perform the first search + 14693 ; and reset our directory afterward. + 14694 + 14695 DOSEARCH: + 14696 ;mov byte [55h],0FFh + 14697 mov byte [FCB-7],0FFh + 14698 ;mov byte [5Bh],10h + 14699 mov byte [FCB-1],10h + 14700 + 14701 ; Caution! Since we are using an extended FCB, we will *also* be returning + 14702 ; the directory information as an extended FCB. We must bias all fetches into + 14703 ; DIRBUF by 8 (Extended FCB part + drive) + 14704 + 14705 mov ah,Dir_Search_First ; 11h + 14706 mov dx,FCB-7 ; 55h + 14707 int 21h ; DOS - SEARCH FIRST USING FCB + 14708 ; DS:DX -> FCB 14709 - 14710 FOUND_FIRST_FILE: - 14711 push ax ; save return state - 14712 call RESTUDIR ; restore user's dir - 14713 pop ax ; get return state back - 14714 - 14715 ; Main scanning loop. Entry has AL = Search first/next error code. Test for - 14716 ; no more. + 14710 ; Restore the user's directory. We preserve, though, the return from the + 14711 ; previous system call for later checking. + 14712 + 14713 FOUND_FIRST_FILE: + 14714 push ax ; save return state + 14715 call RESTUDIR ; restore user's dir + 14716 pop ax ; get return state back 14717 - 14718 DIRSTART: - 14719 inc al ; 0FFh = file not found - 14720 jnz short DISPLAY ; Either an error or we are finished - 14721 jmp CHKCNT - 14722 DISPLAY: - 14723 inc word [FILECNT] ; Keep track of how many we find - 14724 mov si,DIRBUF+8 ; SI -> information returned by sys call - 14725 ;call SHONAME - 14726 call DISPLAYNAME - 14727 ;test byte [_BITS],1 - 14728 test byte [_BITS],SWITCHW ; W switch set? - 14729 jz short DIRTEST ; If so, no size, date, or time - 14730 jmp NEXENT - 14731 DIRTEST: - 14732 ;test byte [DIRBUF_ATTRIB1],10h - 14733 ; 14/10/2018 - 14734 ;test byte [DIRBUF_ATTRIB1],ATTR_DIRECTORY - 14735 ;test byte [DIRBUF+19],10h - 14736 test byte [DIRBUF+8+DIR_ENTRY.DIR_ATTR],ATTR_DIRECTORY - 14737 jz short FILEENT - 14738 mov dx,DMESPTR - 14739 call STD_PRINTF - 14740 jmp short NOFSIZ - 14741 FILEENT: - 14742 ;mov dx,[DIRBUF_FSIZ_L] - 14743 ;mov dx,[DIRBUF+36] - 14744 mov dx,[DIRBUF+8+DIR_ENTRY.DIR_SIZE_L] - 14745 mov [FILESIZE_L],dx - 14746 ;mov dx,[DIRBUF_FSIZ_H] - 14747 ;mov dx,[DIRBUF+38] - 14748 mov dx,[DIRBUF+8+DIR_ENTRY.DIR_SIZE_H] - 14749 mov [FILESIZE_H],dx - 14750 mov dx,FSIZEMESPTR - 14751 call STD_PRINTF ; Print size of file - 14752 NOFSIZ: - 14753 ;mov ax,[DIRBUF_FDATE] ; Get date - 14754 ;mov ax,[DIRBUF+32] - 14755 mov ax,[DIRBUF+8+DIR_ENTRY.DIR_DATE] - 14756 or ax,ax - 14757 jz short NEXENT ; Skip if no date - 14758 mov di,CHARBUF - 14759 push ax - 14760 mov ax,' ' - 14761 stosw - 14762 pop ax - 14763 mov bx,ax - 14764 and ax,1Fh ; Get day - 14765 mov dl,al - 14766 mov ax,bx - 14767 mov cl,5 - 14768 shr ax,cl ; Align month - 14769 and al,0Fh ; Get month - 14770 mov dh,al - 14771 mov cl,bh - 14772 shr cl,1 ; Align year - 14773 xor ch,ch - 14774 add cx,80 ; Relative 1980 - 14775 cmp cl,100 - 14776 jb short MILLENIUM - 14777 sub cl,100 - 14778 MILLENIUM: - 14779 call DATE_CXDX - 14780 ;mov cx,[DIRBUF_FTIME] - 14781 ;mov cx,[DIRBUF+30] - 14782 mov cx,[DIRBUF+8+DIR_ENTRY.DIR_TIME] - 14783 jcxz PRBUF ; Time field present? - 14784 mov ax,2020h - 14785 stosw - 14786 shr cx,1 - 14787 shr cx,1 - 14788 shr cx,1 - 14789 shr cl,1 - 14790 shr cl,1 ; Hours in CH, minutes in CL - 14791 mov bl,[TIME_24] - 14792 or bl,80h ; Tell P_TIME called from DIR - 14793 call P_TIME ; Don't care about DX, never used with DIR - 14794 PRBUF: - 14795 xor ax,ax - 14796 stosb - 14797 mov dx,CHARBUF - 14798 mov [STRING_PTR_2],dx - 14799 mov dx,STRINGBUF2PTR - 14800 call STD_PRINTF - 14801 NEXENT: - 14802 dec byte [LINCNT] - 14803 jnz short SAMLIN - 14804 NEXLIN: - 14805 mov al,[LINLEN] - 14806 mov [LINCNT],al - 14807 call CRLF2 - 14808 dec byte [LINPERPAG] - 14809 jnz short SCROLL - 14810 ;test byte [_BITS],2 - 14811 test byte [_BITS],SWITCHP ; P switch present? - 14812 jz short SCROLL ; If not, just continue - 14813 mov byte [LINPERPAG],23 - 14814 call PAUSE - 14815 jmp short SCROLL - 14816 SAMLIN: - 14817 mov dx,TABPTR ; Output a tab - 14818 call STD_PRINTF - 14819 SCROLL: - 14820 mov ah,Dir_Search_Next ; 12h - 14821 ;mov dx,55h - 14822 mov dx,FCB-7 ; DX -> Unopened FCB - 14823 int 21h ; DOS - SEARCH NEXT USING FCB - 14824 ; DS:DX -> FCB - 14825 ; Return: AL = status - 14826 jmp DIRSTART - 14827 CHKCNT: - 14828 test word [FILECNT],0FFFFh ; -1 - 14829 jnz short TRAILER - 14830 jmp DIRNF - 14831 TRAILER: - 14832 mov al,[LINLEN] - 14833 cmp al,[LINCNT] - 14834 jz short MMESSAGE - 14835 call CRLF2 - 14836 MMESSAGE: - 14837 mov dx,DIRMESPTR - 14838 mov si,[FILECNT] - 14839 mov [DIR_NUM],si - 14840 call STD_PRINTF - 14841 DTFREE: - 14842 mov ah,GET_DRIVE_FREESPACE ; 36h - 14843 ;mov dl,[5Ch] - 14844 mov dl,[FCB] - 14845 int 21h ; DOS - 2+ - GET DISK SPACE - 14846 ; DL = drive code (0 = default, 1 = A,2 = B,etc.) - 14847 cmp ax,-1 - 14848 jnz short DTFREE1 - 14849 DTRET: - 14850 retn - 14851 DTFREE1: - 14852 mul cx - 14853 mul bx - 14854 mov [BYTES_FREE],ax - 14855 mov [BYTES_FREE+2],dx - 14856 mov dx,BYTEMESPTR - 14857 jmp STD_PRINTF - 14858 - 14859 ; =============== S U B R O U T I N E ======================================= - 14860 - 14861 SHONAME: - 14862 DISPLAYNAME: - 14863 ; MSDOS 3.3 - 14864 mov di,CHARBUF - 14865 mov cx,8 - 14866 rep movsb - 14867 mov al,' ' - 14868 stosb - 14869 mov cx,3 - 14870 rep movsb - 14871 xor ax,ax - 14872 stosb - 14873 push dx - 14874 mov dx,CHARBUF - 14875 mov [STRING_PTR_2],dx - 14876 mov dx,STRINGBUF2PTR - 14877 call STD_PRINTF - 14878 pop dx - 14879 retn - 14880 - 14881 %endif - 14882 - 14883 ;============================================================================ - 14884 ; DIR.ASM, MSDOS 6.0, 1991 - 14885 ;============================================================================ - 14886 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 14887 - 14888 ; MSDOS 6.0 - 14889 %if 0 + 14718 ; Main scanning loop. Entry has AL = Search first/next error code. Test for + 14719 ; no more. + 14720 + 14721 DIRSTART: + 14722 inc al ; 0FFh = file not found + 14723 jnz short DISPLAY ; Either an error or we are finished + 14724 jmp CHKCNT + 14725 DISPLAY: + 14726 inc word [FILECNT] ; Keep track of how many we find + 14727 mov si,DIRBUF+8 ; SI -> information returned by sys call + 14728 ;call SHONAME + 14729 call DISPLAYNAME + 14730 ;test byte [_BITS],1 + 14731 test byte [_BITS],SWITCHW ; W switch set? + 14732 jz short DIRTEST ; If so, no size, date, or time + 14733 jmp NEXENT + 14734 DIRTEST: + 14735 ;test byte [DIRBUF_ATTRIB1],10h + 14736 ; 14/10/2018 + 14737 ;test byte [DIRBUF_ATTRIB1],ATTR_DIRECTORY + 14738 ;test byte [DIRBUF+19],10h + 14739 test byte [DIRBUF+8+DIR_ENTRY.DIR_ATTR],ATTR_DIRECTORY + 14740 jz short FILEENT + 14741 mov dx,DMESPTR + 14742 call STD_PRINTF + 14743 jmp short NOFSIZ + 14744 FILEENT: + 14745 ;mov dx,[DIRBUF_FSIZ_L] + 14746 ;mov dx,[DIRBUF+36] + 14747 mov dx,[DIRBUF+8+DIR_ENTRY.DIR_SIZE_L] + 14748 mov [FILESIZE_L],dx + 14749 ;mov dx,[DIRBUF_FSIZ_H] + 14750 ;mov dx,[DIRBUF+38] + 14751 mov dx,[DIRBUF+8+DIR_ENTRY.DIR_SIZE_H] + 14752 mov [FILESIZE_H],dx + 14753 mov dx,FSIZEMESPTR + 14754 call STD_PRINTF ; Print size of file + 14755 NOFSIZ: + 14756 ;mov ax,[DIRBUF_FDATE] ; Get date + 14757 ;mov ax,[DIRBUF+32] + 14758 mov ax,[DIRBUF+8+DIR_ENTRY.DIR_DATE] + 14759 or ax,ax + 14760 jz short NEXENT ; Skip if no date + 14761 mov di,CHARBUF + 14762 push ax + 14763 mov ax,' ' + 14764 stosw + 14765 pop ax + 14766 mov bx,ax + 14767 and ax,1Fh ; Get day + 14768 mov dl,al + 14769 mov ax,bx + 14770 mov cl,5 + 14771 shr ax,cl ; Align month + 14772 and al,0Fh ; Get month + 14773 mov dh,al + 14774 mov cl,bh + 14775 shr cl,1 ; Align year + 14776 xor ch,ch + 14777 add cx,80 ; Relative 1980 + 14778 cmp cl,100 + 14779 jb short MILLENIUM + 14780 sub cl,100 + 14781 MILLENIUM: + 14782 call DATE_CXDX + 14783 ;mov cx,[DIRBUF_FTIME] + 14784 ;mov cx,[DIRBUF+30] + 14785 mov cx,[DIRBUF+8+DIR_ENTRY.DIR_TIME] + 14786 jcxz PRBUF ; Time field present? + 14787 mov ax,2020h + 14788 stosw + 14789 shr cx,1 + 14790 shr cx,1 + 14791 shr cx,1 + 14792 shr cl,1 + 14793 shr cl,1 ; Hours in CH, minutes in CL + 14794 mov bl,[TIME_24] + 14795 or bl,80h ; Tell P_TIME called from DIR + 14796 call P_TIME ; Don't care about DX, never used with DIR + 14797 PRBUF: + 14798 xor ax,ax + 14799 stosb + 14800 mov dx,CHARBUF + 14801 mov [STRING_PTR_2],dx + 14802 mov dx,STRINGBUF2PTR + 14803 call STD_PRINTF + 14804 NEXENT: + 14805 dec byte [LINCNT] + 14806 jnz short SAMLIN + 14807 NEXLIN: + 14808 mov al,[LINLEN] + 14809 mov [LINCNT],al + 14810 call CRLF2 + 14811 dec byte [LINPERPAG] + 14812 jnz short SCROLL + 14813 ;test byte [_BITS],2 + 14814 test byte [_BITS],SWITCHP ; P switch present? + 14815 jz short SCROLL ; If not, just continue + 14816 mov byte [LINPERPAG],23 + 14817 call PAUSE + 14818 jmp short SCROLL + 14819 SAMLIN: + 14820 mov dx,TABPTR ; Output a tab + 14821 call STD_PRINTF + 14822 SCROLL: + 14823 mov ah,Dir_Search_Next ; 12h + 14824 ;mov dx,55h + 14825 mov dx,FCB-7 ; DX -> Unopened FCB + 14826 int 21h ; DOS - SEARCH NEXT USING FCB + 14827 ; DS:DX -> FCB + 14828 ; Return: AL = status + 14829 jmp DIRSTART + 14830 CHKCNT: + 14831 test word [FILECNT],0FFFFh ; -1 + 14832 jnz short TRAILER + 14833 jmp DIRNF + 14834 TRAILER: + 14835 mov al,[LINLEN] + 14836 cmp al,[LINCNT] + 14837 jz short MMESSAGE + 14838 call CRLF2 + 14839 MMESSAGE: + 14840 mov dx,DIRMESPTR + 14841 mov si,[FILECNT] + 14842 mov [DIR_NUM],si + 14843 call STD_PRINTF + 14844 DTFREE: + 14845 mov ah,GET_DRIVE_FREESPACE ; 36h + 14846 ;mov dl,[5Ch] + 14847 mov dl,[FCB] + 14848 int 21h ; DOS - 2+ - GET DISK SPACE + 14849 ; DL = drive code (0 = default, 1 = A,2 = B,etc.) + 14850 cmp ax,-1 + 14851 jnz short DTFREE1 + 14852 DTRET: + 14853 retn + 14854 DTFREE1: + 14855 mul cx + 14856 mul bx + 14857 mov [BYTES_FREE],ax + 14858 mov [BYTES_FREE+2],dx + 14859 mov dx,BYTEMESPTR + 14860 jmp STD_PRINTF + 14861 + 14862 ; =============== S U B R O U T I N E ======================================= + 14863 + 14864 SHONAME: + 14865 DISPLAYNAME: + 14866 ; MSDOS 3.3 + 14867 mov di,CHARBUF + 14868 mov cx,8 + 14869 rep movsb + 14870 mov al,' ' + 14871 stosb + 14872 mov cx,3 + 14873 rep movsb + 14874 xor ax,ax + 14875 stosb + 14876 push dx + 14877 mov dx,CHARBUF + 14878 mov [STRING_PTR_2],dx + 14879 mov dx,STRINGBUF2PTR + 14880 call STD_PRINTF + 14881 pop dx + 14882 retn + 14883 + 14884 %endif + 14885 + 14886 ;============================================================================ + 14887 ; DIR.ASM, MSDOS 6.0, 1991 + 14888 ;============================================================================ + 14889 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 14890 - 14891 ;*** DIR.ASM - DIR internal command - 14892 - 14893 comment % ================================================================= - 14894 - 14895 This module replaces TCMD1A.ASM. The old module was titled - 14896 "PART4 COMMAND Transient routines". + 14891 ; MSDOS 6.0 + 14892 %if 0 + 14893 + 14894 ;*** DIR.ASM - DIR internal command + 14895 + 14896 comment % ================================================================= 14897 - 14898 From residual documentation, I surmise that TCMD.ASM originally - 14899 contained the internal commands DIR, PAUSE, ERASE, TYPE, VOL, and - 14900 VER. The file seems to have been successively split: - 14901 - 14902 TCMD -> TCMD1,TCMD2 -> TCMD1A,TCMD1B,TCMD2A,TCMD2B - 14903 - 14904 TCMD1A.ASM contained only the DIR command. - 14905 - 14906 Usage: - 14907 ------ + 14898 This module replaces TCMD1A.ASM. The old module was titled + 14899 "PART4 COMMAND Transient routines". + 14900 + 14901 From residual documentation, I surmise that TCMD.ASM originally + 14902 contained the internal commands DIR, PAUSE, ERASE, TYPE, VOL, and + 14903 VER. The file seems to have been successively split: + 14904 + 14905 TCMD -> TCMD1,TCMD2 -> TCMD1A,TCMD1B,TCMD2A,TCMD2B + 14906 + 14907 TCMD1A.ASM contained only the DIR command. 14908 - 14909 DIR /w /p /b /s /l /c /o /a - 14910 - 14911 DIR /? - 14912 + 14909 Usage: + 14910 ------ + 14911 + 14912 DIR /w /p /b /s /l /c /o /a 14913 - 14914 may include any or none of: drive; directory path; - 14915 wildcarded filename. If drive or directory path are - 14916 omitted, the current defaults are used. If the - 14917 file name or extension is omitted, wildcards are - 14918 assumed. - 14919 - 14920 /w Wide listing format. Files are displayed in compressed - 14921 'name.ext' format. Subdirectory files are enclosed in - 14922 brackets, '[dirname]'. - 14923 - 14924 /p Paged, or prompted listing. A screenful is displayed - 14925 at a time. The name of the directory being listed appears - 14926 at the top of each page. - 14927 - 14928 Bugbug: pages nead to be uniform length..? - 14929 - 14930 /b Bare listing format. Turns off /w or /p. Files are - 14931 listed in compressed 'name.ext' format, one per line, - 14932 without additional information. Good for making batch - 14933 files or for piping. When used with /s, complete - 14934 pathnames are listed. - 14935 - 14936 /s Descend subdirectory tree. Performs command on current - 14937 or specified directory, then for each subdirectory below - 14938 that directory. Directory header and footer is displayed - 14939 for each directory where matching files are found, unless - 14940 used with /b. /b suppresses headers and footers. - 14941 - 14942 Tree is explored depth first, alphabetically within the - 14943 same level. + 14914 DIR /? + 14915 + 14916 + 14917 may include any or none of: drive; directory path; + 14918 wildcarded filename. If drive or directory path are + 14919 omitted, the current defaults are used. If the + 14920 file name or extension is omitted, wildcards are + 14921 assumed. + 14922 + 14923 /w Wide listing format. Files are displayed in compressed + 14924 'name.ext' format. Subdirectory files are enclosed in + 14925 brackets, '[dirname]'. + 14926 + 14927 /p Paged, or prompted listing. A screenful is displayed + 14928 at a time. The name of the directory being listed appears + 14929 at the top of each page. + 14930 + 14931 Bugbug: pages nead to be uniform length..? + 14932 + 14933 /b Bare listing format. Turns off /w or /p. Files are + 14934 listed in compressed 'name.ext' format, one per line, + 14935 without additional information. Good for making batch + 14936 files or for piping. When used with /s, complete + 14937 pathnames are listed. + 14938 + 14939 /s Descend subdirectory tree. Performs command on current + 14940 or specified directory, then for each subdirectory below + 14941 that directory. Directory header and footer is displayed + 14942 for each directory where matching files are found, unless + 14943 used with /b. /b suppresses headers and footers. 14944 - 14945 Bugbug: hidden directories aren't searched. - 14946 - 14947 /l Display file names, extensions and paths in lowercase. ;M010 - 14948 - 14949 /c Display file compression ratio, if the file is on a MagicDrv - 14950 compressed volume. + 14945 Tree is explored depth first, alphabetically within the + 14946 same level. + 14947 + 14948 Bugbug: hidden directories aren't searched. + 14949 + 14950 /l Display file names, extensions and paths in lowercase. ;M010 14951 - 14952 /o Sort order. /o alone sorts by default order (dirs-first, name, - 14953 extension). A sort order may be specified after /o. Any of - 14954 the following characters may be used: nedsgc (name, extension, - 14955 date/time, size, group-dirs-first, compression ratio). Placing - 14956 a '-' before any letter causes a downward sort on that field. - 14957 E.g., /oe-d means sort first by extension in alphabetical order, - 14958 then within each extension sort by date and time in reverse - 14959 chronological order. - 14960 - 14961 /a Attribute selection. Without /a, hidden and system files - 14962 are suppressed from the listing. With /a alone, all files - 14963 are listed. An attribute list may follow /a, consisting of - 14964 any of the following characters: hsdar (hidden, system, - 14965 directory, archive, read-only). A '-' before any letter - 14966 means 'not' that attribute. E.g., /ar-d means files that - 14967 are marked read-only and are not directory files. Note - 14968 that hidden or system files may be included in the listing. - 14969 They are suppressed without /a but are treated like any other - 14970 attribute with /a. - 14971 - 14972 /? Help listing. Display DIR useage information. ;M008;Handled externally - 14973 - 14974 /h has been removed. ;M008 - 14975 - 14976 DIRCMD An environment variable named DIRCMD is parsed before the - 14977 DIR command line. Any command line options may be specified - 14978 in DIRCMD, and become defaults. /? will be ignored in DIRCMD. - 14979 A filespec may be specified in DIRCMD and will be used unless - 14980 a filespec is specified on the command line. Any switch - 14981 specified in DIRCMD may be overridden on the command line. - 14982 If the original DIR default action is desired for a particular - 14983 switch, the switch letter may be preceded by a '-' on the - 14984 command line. E.g., - 14985 - 14986 /-w use long listing format - 14987 /-p don't page the listing - 14988 /-b don't use bare format - 14989 /-s don't descend subdirectory tree - 14990 /-o display files in disk order - 14991 /-a suppress hidden and system files - 14992 - 14993 Notes: - 14994 ------ + 14952 /c Display file compression ratio, if the file is on a MagicDrv + 14953 compressed volume. + 14954 + 14955 /o Sort order. /o alone sorts by default order (dirs-first, name, + 14956 extension). A sort order may be specified after /o. Any of + 14957 the following characters may be used: nedsgc (name, extension, + 14958 date/time, size, group-dirs-first, compression ratio). Placing + 14959 a '-' before any letter causes a downward sort on that field. + 14960 E.g., /oe-d means sort first by extension in alphabetical order, + 14961 then within each extension sort by date and time in reverse + 14962 chronological order. + 14963 + 14964 /a Attribute selection. Without /a, hidden and system files + 14965 are suppressed from the listing. With /a alone, all files + 14966 are listed. An attribute list may follow /a, consisting of + 14967 any of the following characters: hsdar (hidden, system, + 14968 directory, archive, read-only). A '-' before any letter + 14969 means 'not' that attribute. E.g., /ar-d means files that + 14970 are marked read-only and are not directory files. Note + 14971 that hidden or system files may be included in the listing. + 14972 They are suppressed without /a but are treated like any other + 14973 attribute with /a. + 14974 + 14975 /? Help listing. Display DIR useage information. ;M008;Handled externally + 14976 + 14977 /h has been removed. ;M008 + 14978 + 14979 DIRCMD An environment variable named DIRCMD is parsed before the + 14980 DIR command line. Any command line options may be specified + 14981 in DIRCMD, and become defaults. /? will be ignored in DIRCMD. + 14982 A filespec may be specified in DIRCMD and will be used unless + 14983 a filespec is specified on the command line. Any switch + 14984 specified in DIRCMD may be overridden on the command line. + 14985 If the original DIR default action is desired for a particular + 14986 switch, the switch letter may be preceded by a '-' on the + 14987 command line. E.g., + 14988 + 14989 /-w use long listing format + 14990 /-p don't page the listing + 14991 /-b don't use bare format + 14992 /-s don't descend subdirectory tree + 14993 /-o display files in disk order + 14994 /-a suppress hidden and system files 14995 - 14996 For sorted listings, file entries are loaded into the TPA buffer, which - 14997 is usually about 64K in size. This allows sorts of up to 3000 files at - 14998 a time. Each entry takes up 21 bytes in the buffer (see EntryStruc below). - 14999 The byte after the last entry is 0FFh. The first byte of each entry is - 15000 a flag byte which is made zero when the entry is loaded, and made one - 15001 when the entry is used. - 15002 - 15003 Revision History - 15004 ================ - 15005 M01 md 7/13/90 Use ROM BIOS data area to obtain screen height - 15006 in the absence of ANSI.SYS - 15007 - 15008 M007 sa 8/1/90 Allow /p/b combination - 15009 - 15010 M008 sa 8/1/90 Remove /h parameter. Eliminate code used - 15011 to internally handle /? message. + 14996 Notes: + 14997 ------ + 14998 + 14999 For sorted listings, file entries are loaded into the TPA buffer, which + 15000 is usually about 64K in size. This allows sorts of up to 3000 files at + 15001 a time. Each entry takes up 21 bytes in the buffer (see EntryStruc below). + 15002 The byte after the last entry is 0FFh. The first byte of each entry is + 15003 a flag byte which is made zero when the entry is loaded, and made one + 15004 when the entry is used. + 15005 + 15006 Revision History + 15007 ================ + 15008 M01 md 7/13/90 Use ROM BIOS data area to obtain screen height + 15009 in the absence of ANSI.SYS + 15010 + 15011 M007 sa 8/1/90 Allow /p/b combination 15012 - 15013 M010 sa 8/5/90 Add support for /l (lowercase) option. - 15014 - 15015 M011 sa 8/5/90 Patch up bug where MS-DOS does not load the - 15016 first FCB with the drive number when the drive - 15017 letter in the command line is preceded by a - 15018 switch. Now dir manually loads the drive - 15019 number after parsing. - 15020 - 15021 M018 md 8/12/90 Increment the screen height by 1 when obtained - 15022 from the ROM BIOS. + 15013 M008 sa 8/1/90 Remove /h parameter. Eliminate code used + 15014 to internally handle /? message. + 15015 + 15016 M010 sa 8/5/90 Add support for /l (lowercase) option. + 15017 + 15018 M011 sa 8/5/90 Patch up bug where MS-DOS does not load the + 15019 first FCB with the drive number when the drive + 15020 letter in the command line is preceded by a + 15021 switch. Now dir manually loads the drive + 15022 number after parsing. 15023 - 15024 M023 sa 8/31/90 Prevent DIR from failing if it encounters - 15025 a subdirectory having len(pathname)>MAXPATH. - 15026 Just skip over that subdirectory. - 15027 - 15028 M028 dbo 9/24/90 When country=US, sort by strict character - 15029 byte value, rather than collating table. - 15030 This to match MS-DOS Shell's sort order. - 15031 - 15032 ========================================================================= % - 15033 - 15034 %endif - 15035 - 15036 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM (PCDOS 7.1) - 15037 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM (MSDOS 6.22) - 15038 ;ifdef DBLSPACE_HOOKS - 15039 ;NUM_DIR_SWS equ 16 ; # of dir switch synonyms in Dir_Sw_Ptrs list - 15040 ; 28/07/2024 - PCDOS 7.1 COMMAND.COM - 15041 NUM_DIR_SWS equ 18 - 15042 ;else - 15043 ; 16/02/2023 - Retro DOS v4.0 (v4.1) COMMAND.COM (MSDOS 5.0) - 15044 ;NUM_DIR_SWS equ 14 ; # of dir switch synonyms in Dir_Sw_Ptrs list - 15045 ;endif - 15046 - 15047 ;OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1 - 15048 ; - 15049 ; on/off bit record for /l, /b, /s, /p, /w, /c options - 15050 ; (order is hard-coded; see OnOffSw) - 15051 ; Inmem is set when entries are loaded in memory. - 15052 - 15053 ; 28/07/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM - 15054 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM (MSDOS 5.0) - 15055 mask.wide equ 1 ; dir /W switch - 15056 mask.pagd equ 2 ; dir /P switch - 15057 mask.subd equ 4 ; dir /S switch - 15058 mask.bare equ 8 ; dir /B switch - 15059 mask.lcase equ 16 ; dir /L switch - 15060 ;mask.inmem equ 32 ; - 15061 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 15062 mask.narrow equ 32 ; dir /Z switch - 15063 mask.year4 equ 64 ; dir /4 switch - 15064 mask.inmem equ 128 ; - 15065 - 15066 ; 28/07/2024 - 15067 ; 05/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 15068 ;ifdef DBLSPACE_HOOKS - 15069 ; OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1,cratio:1 - 15070 ;else - 15071 ; OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1 - 15072 ;endif - 15073 ;mask.cratio equ 1 - 15074 ;mask.wide equ 2 - 15075 ;mask.pagd equ 4 - 15076 ;mask.subd equ 8 - 15077 ;mask.bare equ 16 - 15078 ;mask.lcase equ 32 - 15079 ;mask.inmem equ 64 - 15080 ; - 15081 mask.dev equ 1 - 15082 mask.baddir equ 2 - 15083 - 15084 NUM_ATTR_LTRS equ 6 ; length of attribute letter list - 15085 - 15086 ; 05/06/2023 - 15087 ;ifdef DBLSPACE_HOOKS - 15088 NUM_ORDER_LTRS equ 6 ; length of sort order letter list - 15089 CRATIO_ORDER equ 6 ; position of 'C' in ORDER_LTRS - 15090 ;else - 15091 ;NUM_ORDER_LTRS equ 5 ; length of sort order letter list - 15092 ;endif - 15093 - 15094 ;ResultBuffer struc ; structure of parse result buffer - 15095 ;ValueType db ? - 15096 ;ValueTag db ? - 15097 ;SynPtr dw ? - 15098 ;ValuePtr dd ? - 15099 ;ResultBuffer ends - 15100 - 15101 ;ErrorRec record baddir:1,dev:1 - 15102 ; - 15103 ; Error bits are: - 15104 ; Invalid directory format - 15105 ; File is device - 15106 - 15107 ;EntryStruc struc ; our private directory entry structure - 15108 ;used db ? ; =0 until entry used, then =1 - 15109 ;filename db 8 dup (?) ; filename - 15110 ;fileext db 3 dup (?) ; extension - 15111 ;fileattr db ? ; file attributes - 15112 ;filetime dw ? ; file time - 15113 ;filedate dw ? ; file date - 15114 ;filesize dd ? ; file size - 15115 ; 05/06/2023 - 15116 ;;ifdef DBLSPACE_HOOKS - 15117 ;compratio db ? ; compression ratio - 15118 ;;endif - 15119 ;EntryStruc ends - 15120 - 15121 ;shove macro val ; hose-bag 8086 doesn't push immediate - 15122 ; mov ax,val ; invisible, dangerous use of AX! - 15123 ; push ax - 15124 ; endm - 15125 - 15126 ; public Catalog ; our entry point - 15127 ; - 15128 ; break - 15129 ; - 15130 ; assume cs:TRANGROUP,ds:TRANGROUP,es:nothing,ss:TRANGROUP - 15131 ; --------------------------------------------------------------------------- - 15132 ; Bugbug: Each routine should start with it's own ASSUME. - 15133 - 15134 ;---------------------------------------------------------------------------- - 15135 ;---------------------------------------------------------------------------- + 15024 M018 md 8/12/90 Increment the screen height by 1 when obtained + 15025 from the ROM BIOS. + 15026 + 15027 M023 sa 8/31/90 Prevent DIR from failing if it encounters + 15028 a subdirectory having len(pathname)>MAXPATH. + 15029 Just skip over that subdirectory. + 15030 + 15031 M028 dbo 9/24/90 When country=US, sort by strict character + 15032 byte value, rather than collating table. + 15033 This to match MS-DOS Shell's sort order. + 15034 + 15035 ========================================================================= % + 15036 + 15037 %endif + 15038 + 15039 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM (PCDOS 7.1) + 15040 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM (MSDOS 6.22) + 15041 ;ifdef DBLSPACE_HOOKS + 15042 ;NUM_DIR_SWS equ 16 ; # of dir switch synonyms in Dir_Sw_Ptrs list + 15043 ; 28/07/2024 - PCDOS 7.1 COMMAND.COM + 15044 NUM_DIR_SWS equ 18 + 15045 ;else + 15046 ; 16/02/2023 - Retro DOS v4.0 (v4.1) COMMAND.COM (MSDOS 5.0) + 15047 ;NUM_DIR_SWS equ 14 ; # of dir switch synonyms in Dir_Sw_Ptrs list + 15048 ;endif + 15049 + 15050 ;OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1 + 15051 ; + 15052 ; on/off bit record for /l, /b, /s, /p, /w, /c options + 15053 ; (order is hard-coded; see OnOffSw) + 15054 ; Inmem is set when entries are loaded in memory. + 15055 + 15056 ; 28/07/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM + 15057 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM (MSDOS 5.0) + 15058 mask.wide equ 1 ; dir /W switch + 15059 mask.pagd equ 2 ; dir /P switch + 15060 mask.subd equ 4 ; dir /S switch + 15061 mask.bare equ 8 ; dir /B switch + 15062 mask.lcase equ 16 ; dir /L switch + 15063 ;mask.inmem equ 32 ; + 15064 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 15065 mask.narrow equ 32 ; dir /Z switch + 15066 mask.year4 equ 64 ; dir /4 switch + 15067 mask.inmem equ 128 ; + 15068 + 15069 ; 28/07/2024 + 15070 ; 05/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 15071 ;ifdef DBLSPACE_HOOKS + 15072 ; OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1,cratio:1 + 15073 ;else + 15074 ; OptionRec record inmem:1,lcase:1,bare:1,subd:1,pagd:1,wide:1 + 15075 ;endif + 15076 ;mask.cratio equ 1 + 15077 ;mask.wide equ 2 + 15078 ;mask.pagd equ 4 + 15079 ;mask.subd equ 8 + 15080 ;mask.bare equ 16 + 15081 ;mask.lcase equ 32 + 15082 ;mask.inmem equ 64 + 15083 ; + 15084 mask.dev equ 1 + 15085 mask.baddir equ 2 + 15086 + 15087 NUM_ATTR_LTRS equ 6 ; length of attribute letter list + 15088 + 15089 ; 05/06/2023 + 15090 ;ifdef DBLSPACE_HOOKS + 15091 NUM_ORDER_LTRS equ 6 ; length of sort order letter list + 15092 CRATIO_ORDER equ 6 ; position of 'C' in ORDER_LTRS + 15093 ;else + 15094 ;NUM_ORDER_LTRS equ 5 ; length of sort order letter list + 15095 ;endif + 15096 + 15097 ;ResultBuffer struc ; structure of parse result buffer + 15098 ;ValueType db ? + 15099 ;ValueTag db ? + 15100 ;SynPtr dw ? + 15101 ;ValuePtr dd ? + 15102 ;ResultBuffer ends + 15103 + 15104 ;ErrorRec record baddir:1,dev:1 + 15105 ; + 15106 ; Error bits are: + 15107 ; Invalid directory format + 15108 ; File is device + 15109 + 15110 ;EntryStruc struc ; our private directory entry structure + 15111 ;used db ? ; =0 until entry used, then =1 + 15112 ;filename db 8 dup (?) ; filename + 15113 ;fileext db 3 dup (?) ; extension + 15114 ;fileattr db ? ; file attributes + 15115 ;filetime dw ? ; file time + 15116 ;filedate dw ? ; file date + 15117 ;filesize dd ? ; file size + 15118 ; 05/06/2023 + 15119 ;;ifdef DBLSPACE_HOOKS + 15120 ;compratio db ? ; compression ratio + 15121 ;;endif + 15122 ;EntryStruc ends + 15123 + 15124 ;shove macro val ; hose-bag 8086 doesn't push immediate + 15125 ; mov ax,val ; invisible, dangerous use of AX! + 15126 ; push ax + 15127 ; endm + 15128 + 15129 ; public Catalog ; our entry point + 15130 ; + 15131 ; break + 15132 ; + 15133 ; assume cs:TRANGROUP,ds:TRANGROUP,es:nothing,ss:TRANGROUP + 15134 ; --------------------------------------------------------------------------- + 15135 ; Bugbug: Each routine should start with it's own ASSUME. 15136 - 15137 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 15138 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:108Dh + 15137 ;---------------------------------------------------------------------------- + 15138 ;---------------------------------------------------------------------------- 15139 - 15140 ;*** Catalog - DIR command main routine - 15141 ; - 15142 ; ENTRY FCB #1 in PSP has drive# from cmd-line or default - 15143 ; Cmd-line tail text is at 81h, terminated by 0Dh - 15144 ; CS, DS, ES, SS = TRANGROUP seg addr - 15145 ; Tpa = TPA buffer seg addr - 15146 ; BytCnt = # bytes in TPA buffer - 15147 ; - 15148 ; EXIT nothing - 15149 ; - 15150 ; USED AX,BX,CX,DX,SI,DI,BP - 15151 ; - 15152 ; ERROR EXITS - 15153 ; - 15154 ; Errors are handled by setting up error message pointers - 15155 ; for Std_EPrintf and jumping to CError. Syntax errors in - 15156 ; the environment variable, however, are handled by printing - 15157 ; an error message and continuing. - 15158 ; - 15159 ; EFFECTS - 15160 ; - 15161 ; Directory listing is displayed (on standard output). - 15162 ; APPEND is disabled. HeadFix routine is expected to - 15163 ; restore APPEND state. - 15164 ; Working directory may be changed. The user's default - 15165 ; directory is saved and flagged for restoration by RestUDir - 15166 ; during COMMAND cycle. - 15167 ; Lots of variables may be changed in TRANSPACE segment. - 15168 ; - 15169 ; NOTES - 15170 ; - 15171 ; ES = TRANGROUP seg addr except when used to address the - 15172 ; the TPA buffer, where directory entries are loaded from disk. - 15173 - 15174 ; 16/02/2023 - 15175 - 15176 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 15177 ; ---------------------------------------- - 15178 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1167h - 15179 - 15180 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 15181 ;---------------------------------------------------------------------------- - 15182 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:11B7h - 15183 - 15184 CATALOG: - 15185 - 15186 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 15187 %if 0 - 15188 ; 07/06/2023 - 15189 ; MSDOS 6.22 COMMAND COM feature only ! - 15190 call screen_f_set ; set display parameters for video/text mode - 15191 ; ; (different depending on scr width/columns) - 15192 call SetDefaults - 15193 call ParseEnvironment - 15194 call ParseCmdLine - 15195 jnc short catalog1 ; no parse error - 15196 ;jmp catErr ; error msg is set up - 15197 ; 07/06/2023 - 15198 ; Retro DOS v4.2 - MSDOS 6.22 COMMANBD.COM - 15199 jmp catExtErr2 - 15200 %else - 15201 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 15202 ; PCDOS 7.1 COMMAND.COM - 15203 00001180 C606[2B9C]00 mov byte [nocommas],0 - 15204 00001185 C606[2D9C]00 mov byte [bfree_not_kilo],0 - 15205 ; use kilobyte if number of bytes is very big - 15206 0000118A 50 push ax - 15207 0000118B 51 push cx - 15208 0000118C 57 push di - 15209 0000118D 56 push si - 15210 0000118E 06 push es - 15211 0000118F BE[0C93] mov si,no_sep_text ; NO_SEP=1 ; Removes the commas from numbers - 15212 00001192 E82215 call find_name_in_environment - 15213 00001195 720A jb short catalog0 - 15214 00001197 C606[2D9C]FF mov byte [bfree_not_kilo],0FFh - 15215 ; no need to kilobyte (short) display - 15216 0000119C C606[2B9C]FF mov byte [nocommas],0FFh - 15217 ; do not use commas for displaying numbers - 15218 catalog0: - 15219 000011A1 07 pop es - 15220 000011A2 5E pop si - 15221 000011A3 5F pop di - 15222 000011A4 59 pop cx - 15223 000011A5 58 pop ax - 15224 000011A6 E8D000 call SetDefaults - 15225 000011A9 E8F400 call ParseEnvironment - 15226 000011AC E80C01 call ParseCmdLine - 15227 000011AF 7303 jnc short catalog1 ; no parse error - 15228 ;jmp catErr - 15229 ; 31/07/2024 - 15230 000011B1 E9C200 jmp catExtErr2 - 15231 %endif - 15232 - 15233 catalog1: - 15234 000011B4 E83501 call SetOptions - 15235 000011B7 E80B01 call SetCollatingTable - 15236 - 15237 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 15238 %if 1 - 15239 000011BA C606[2A9C]00 mov byte [narrow],0 - 15240 ;test byte [_Bits],20h ; /Z switch (narrow) - 15241 000011BF F606[8B9D]20 test byte [_Bits],mask.narrow ; 20h - 15242 000011C4 740A jz short catalog1_1 - 15243 000011C6 C606[2A9C]FF mov byte [narrow],0FFh - 15244 000011CB C606[2B9C]FF mov byte [nocommas],0FFh - 15245 catalog1_1: - 15246 ;test byte [_Bits],40h ; /4 switch - 15247 000011D0 F606[8B9D]40 test byte [_Bits],mask.year4 ; 40h - 15248 000011D5 7407 jz short catalog1_2 - 15249 ;mov byte [cs:yeardigit4],0FFh ; 4 digits year - 15250 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 15251 000011D7 C606[2C9C]FF mov byte [yeardigit4],0FFh - 15252 000011DC EB05 jmp short catalog1_3 - 15253 catalog1_2: - 15254 ;mov byte [cs:yeardigit4],0 ; 2 digits year - 15255 000011DE C606[2C9C]00 mov byte [yeardigit4],0 - 15256 catalog1_3: - 15257 %endif - 15258 - 15259 ; Drive # to operate on has already been placed in FCB by - 15260 ; COMMAND preprocessing. OkVolArg & PathCrunch depend on that. + 15140 ; 16/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 15141 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:108Dh + 15142 + 15143 ;*** Catalog - DIR command main routine + 15144 ; + 15145 ; ENTRY FCB #1 in PSP has drive# from cmd-line or default + 15146 ; Cmd-line tail text is at 81h, terminated by 0Dh + 15147 ; CS, DS, ES, SS = TRANGROUP seg addr + 15148 ; Tpa = TPA buffer seg addr + 15149 ; BytCnt = # bytes in TPA buffer + 15150 ; + 15151 ; EXIT nothing + 15152 ; + 15153 ; USED AX,BX,CX,DX,SI,DI,BP + 15154 ; + 15155 ; ERROR EXITS + 15156 ; + 15157 ; Errors are handled by setting up error message pointers + 15158 ; for Std_EPrintf and jumping to CError. Syntax errors in + 15159 ; the environment variable, however, are handled by printing + 15160 ; an error message and continuing. + 15161 ; + 15162 ; EFFECTS + 15163 ; + 15164 ; Directory listing is displayed (on standard output). + 15165 ; APPEND is disabled. HeadFix routine is expected to + 15166 ; restore APPEND state. + 15167 ; Working directory may be changed. The user's default + 15168 ; directory is saved and flagged for restoration by RestUDir + 15169 ; during COMMAND cycle. + 15170 ; Lots of variables may be changed in TRANSPACE segment. + 15171 ; + 15172 ; NOTES + 15173 ; + 15174 ; ES = TRANGROUP seg addr except when used to address the + 15175 ; the TPA buffer, where directory entries are loaded from disk. + 15176 + 15177 ; 16/02/2023 + 15178 + 15179 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 15180 ; ---------------------------------------- + 15181 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1167h + 15182 + 15183 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 15184 ;---------------------------------------------------------------------------- + 15185 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:11B7h + 15186 + 15187 CATALOG: + 15188 + 15189 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 15190 %if 0 + 15191 ; 07/06/2023 + 15192 ; MSDOS 6.22 COMMAND COM feature only ! + 15193 call screen_f_set ; set display parameters for video/text mode + 15194 ; ; (different depending on scr width/columns) + 15195 call SetDefaults + 15196 call ParseEnvironment + 15197 call ParseCmdLine + 15198 jnc short catalog1 ; no parse error + 15199 ;jmp catErr ; error msg is set up + 15200 ; 07/06/2023 + 15201 ; Retro DOS v4.2 - MSDOS 6.22 COMMANBD.COM + 15202 jmp catExtErr2 + 15203 %else + 15204 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 15205 ; PCDOS 7.1 COMMAND.COM + 15206 00001180 C606[2B9C]00 mov byte [nocommas],0 + 15207 00001185 C606[2D9C]00 mov byte [bfree_not_kilo],0 + 15208 ; use kilobyte if number of bytes is very big + 15209 0000118A 50 push ax + 15210 0000118B 51 push cx + 15211 0000118C 57 push di + 15212 0000118D 56 push si + 15213 0000118E 06 push es + 15214 0000118F BE[0C93] mov si,no_sep_text ; NO_SEP=1 ; Removes the commas from numbers + 15215 00001192 E82215 call find_name_in_environment + 15216 00001195 720A jb short catalog0 + 15217 00001197 C606[2D9C]FF mov byte [bfree_not_kilo],0FFh + 15218 ; no need to kilobyte (short) display + 15219 0000119C C606[2B9C]FF mov byte [nocommas],0FFh + 15220 ; do not use commas for displaying numbers + 15221 catalog0: + 15222 000011A1 07 pop es + 15223 000011A2 5E pop si + 15224 000011A3 5F pop di + 15225 000011A4 59 pop cx + 15226 000011A5 58 pop ax + 15227 000011A6 E8D000 call SetDefaults + 15228 000011A9 E8F400 call ParseEnvironment + 15229 000011AC E80C01 call ParseCmdLine + 15230 000011AF 7303 jnc short catalog1 ; no parse error + 15231 ;jmp catErr + 15232 ; 31/07/2024 + 15233 000011B1 E9C200 jmp catExtErr2 + 15234 %endif + 15235 + 15236 catalog1: + 15237 000011B4 E83501 call SetOptions + 15238 000011B7 E80B01 call SetCollatingTable + 15239 + 15240 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 15241 %if 1 + 15242 000011BA C606[2A9C]00 mov byte [narrow],0 + 15243 ;test byte [_Bits],20h ; /Z switch (narrow) + 15244 000011BF F606[8B9D]20 test byte [_Bits],mask.narrow ; 20h + 15245 000011C4 740A jz short catalog1_1 + 15246 000011C6 C606[2A9C]FF mov byte [narrow],0FFh + 15247 000011CB C606[2B9C]FF mov byte [nocommas],0FFh + 15248 catalog1_1: + 15249 ;test byte [_Bits],40h ; /4 switch + 15250 000011D0 F606[8B9D]40 test byte [_Bits],mask.year4 ; 40h + 15251 000011D5 7407 jz short catalog1_2 + 15252 ;mov byte [cs:yeardigit4],0FFh ; 4 digits year + 15253 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 15254 000011D7 C606[2C9C]FF mov byte [yeardigit4],0FFh + 15255 000011DC EB05 jmp short catalog1_3 + 15256 catalog1_2: + 15257 ;mov byte [cs:yeardigit4],0 ; 2 digits year + 15258 000011DE C606[2C9C]00 mov byte [yeardigit4],0 + 15259 catalog1_3: + 15260 %endif 15261 - 15262 ;;;test Bits,mask bare - 15263 ;;test word [_Bits],8 - 15264 ;test byte [_Bits],8 - 15265 ; 07/06/2023 - 15266 000011E3 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 (6.22) - 15267 ; 31/07/2024 ; mask.bare = 8 ; PCDOS 7.1 - 15268 000011E8 750A jnz short catalog2 ; don't display volume info for /b - 15269 ;invoke OkVolArg ; find & display volume info - 15270 000011EA E8CD0D call OkVolArg - 15271 ;sub byte [LeftOnpage],2 - 15272 000011ED 832E[1E9C]02 sub word [LeftOnPage],2 - 15273 ; record display lines used by volume info - 15274 000011F2 EB14 jmp short catCrunch - 15275 - 15276 ; OkVolArg side effects: - 15277 ; APPEND is disabled; - 15278 ; DTA established at DirBuf; - 15279 ; Filename fields in FCB are wildcarded. - 15280 - 15281 catalog2: - 15282 ; OkVolArg wasn't executed, so we have to do these ourselves. + 15262 ; Drive # to operate on has already been placed in FCB by + 15263 ; COMMAND preprocessing. OkVolArg & PathCrunch depend on that. + 15264 + 15265 ;;;test Bits,mask bare + 15266 ;;test word [_Bits],8 + 15267 ;test byte [_Bits],8 + 15268 ; 07/06/2023 + 15269 000011E3 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 (6.22) + 15270 ; 31/07/2024 ; mask.bare = 8 ; PCDOS 7.1 + 15271 000011E8 750A jnz short catalog2 ; don't display volume info for /b + 15272 ;invoke OkVolArg ; find & display volume info + 15273 000011EA E8CD0D call OkVolArg + 15274 ;sub byte [LeftOnpage],2 + 15275 000011ED 832E[1E9C]02 sub word [LeftOnPage],2 + 15276 ; record display lines used by volume info + 15277 000011F2 EB14 jmp short catCrunch + 15278 + 15279 ; OkVolArg side effects: + 15280 ; APPEND is disabled; + 15281 ; DTA established at DirBuf; + 15282 ; Filename fields in FCB are wildcarded. 15283 - 15284 ;invoke DisAppend ; disable APPEND - 15285 000011F4 E88C0D call DisAppend + 15284 catalog2: + 15285 ; OkVolArg wasn't executed, so we have to do these ourselves. 15286 - 15287 ;mov dx,offset TRANGROUP:DirBuf - 15288 000011F7 BA[399D] mov dx,DIRBUF - 15289 000011FA B41A mov ah,1Ah - 15290 ;mov ah,Set_DMA - 15291 000011FC CD21 int 21h ; set DTA - 15292 - 15293 ;mov di,FCB ; 5Ch ; ES:DI = ptr to FCB - 15294 ;inc di ; ES:DI = ptr to filename field of FCB - 15295 ; 28/07/2024 - 15296 000011FE BF5D00 mov di, FCB+1 ; 5Dh - 15297 00001201 B03F mov al,'?' ; AL = wildcard character - 15298 00001203 B90B00 mov cx,11 - 15299 00001206 F3AA rep stosb ; wildcard filename field - 15300 - 15301 catCrunch: - 15302 00001208 E83C01 call CrunchPath ; crunch pathname to get directory and filename - 15303 0000120B 7233 jc short catRecErr ; handle recorded or extended error - 15304 - 15305 ; User's directory has been saved, we've changed to specified directory. - 15306 ; ComSw = error bits for later use - 15307 ; FCB contains parsed filename - 15308 - 15309 ;cmp byte [COMSW],0 - 15310 0000120D 833E[0B9C]00 cmp word [COMSW],0 - 15311 00001212 752C jne short catRecErr ; handle recorded error - 15312 - 15313 00001214 E88A01 call InstallCtrlC ; install control-C handler - 15314 - 15315 ; 31/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 15316 %if 0 - 15317 ; 07/06/2023 - 15318 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 15319 ; MSDOS 6.0 (DBLSPACE/DRVSPACE) - 15320 - 15321 ;test word [_Bits],1 ; mask.cratio - 15322 test byte [_Bits],mask.cratio ; compression ratio wanted? - 15323 jz short catalog4 - 15324 call OpenCVF ; yes, try to open CVF file - 15325 jnc short catalog4 - 15326 - 15327 ;and word [_Bits],0FFFEh ; not (mask cratio) - 15328 and byte [_Bits],~mask.cratio ; 0FEh - 15329 %endif - 15330 - 15331 catalog4: ; 07/06/2023 - 15332 00001217 E8A10A call ZeroTotals ; zero grand totals - 15333 0000121A E8DD04 call ListDir ; list main directory - 15334 ;jc short catExtErr - 15335 ; 07/06/2023 - 15336 ; MSDOS 6.22 COMMAND.COM - 15337 0000121D 7247 jc short catExtErr1 - 15338 - 15339 ;;;test Bits,mask subd - 15340 ;;test word [_Bits],4 - 15341 ;test byte [_Bits],4 - 15342 ; 07/06/2023 - 15343 0000121F F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 (6.22) - 15344 ; 31/07/2024 ; 4 ; PCDOS 7.1 - 15345 00001224 7405 jz short catalog3 ; subdirectories option not set - 15346 00001226 E89001 call ListSubds ; list subdirectories - 15347 ;jc short catExtErr - 15348 ; 07/06/2023 - 15349 ; MSDOS 6.22 COMMAND.COM - 15350 00001229 723B jc short catExtErr1 - 15351 - 15352 catalog3: - 15353 ; Check if any files were found. + 15287 ;invoke DisAppend ; disable APPEND + 15288 000011F4 E88C0D call DisAppend + 15289 + 15290 ;mov dx,offset TRANGROUP:DirBuf + 15291 000011F7 BA[399D] mov dx,DIRBUF + 15292 000011FA B41A mov ah,1Ah + 15293 ;mov ah,Set_DMA + 15294 000011FC CD21 int 21h ; set DTA + 15295 + 15296 ;mov di,FCB ; 5Ch ; ES:DI = ptr to FCB + 15297 ;inc di ; ES:DI = ptr to filename field of FCB + 15298 ; 28/07/2024 + 15299 000011FE BF5D00 mov di, FCB+1 ; 5Dh + 15300 00001201 B03F mov al,'?' ; AL = wildcard character + 15301 00001203 B90B00 mov cx,11 + 15302 00001206 F3AA rep stosb ; wildcard filename field + 15303 + 15304 catCrunch: + 15305 00001208 E83C01 call CrunchPath ; crunch pathname to get directory and filename + 15306 0000120B 7233 jc short catRecErr ; handle recorded or extended error + 15307 + 15308 ; User's directory has been saved, we've changed to specified directory. + 15309 ; ComSw = error bits for later use + 15310 ; FCB contains parsed filename + 15311 + 15312 ;cmp byte [COMSW],0 + 15313 0000120D 833E[0B9C]00 cmp word [COMSW],0 + 15314 00001212 752C jne short catRecErr ; handle recorded error + 15315 + 15316 00001214 E88A01 call InstallCtrlC ; install control-C handler + 15317 + 15318 ; 31/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 15319 %if 0 + 15320 ; 07/06/2023 + 15321 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 15322 ; MSDOS 6.0 (DBLSPACE/DRVSPACE) + 15323 + 15324 ;test word [_Bits],1 ; mask.cratio + 15325 test byte [_Bits],mask.cratio ; compression ratio wanted? + 15326 jz short catalog4 + 15327 call OpenCVF ; yes, try to open CVF file + 15328 jnc short catalog4 + 15329 + 15330 ;and word [_Bits],0FFFEh ; not (mask cratio) + 15331 and byte [_Bits],~mask.cratio ; 0FEh + 15332 %endif + 15333 + 15334 catalog4: ; 07/06/2023 + 15335 00001217 E8A10A call ZeroTotals ; zero grand totals + 15336 0000121A E8DD04 call ListDir ; list main directory + 15337 ;jc short catExtErr + 15338 ; 07/06/2023 + 15339 ; MSDOS 6.22 COMMAND.COM + 15340 0000121D 7247 jc short catExtErr1 + 15341 + 15342 ;;;test Bits,mask subd + 15343 ;;test word [_Bits],4 + 15344 ;test byte [_Bits],4 + 15345 ; 07/06/2023 + 15346 0000121F F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 (6.22) + 15347 ; 31/07/2024 ; 4 ; PCDOS 7.1 + 15348 00001224 7405 jz short catalog3 ; subdirectories option not set + 15349 00001226 E89001 call ListSubds ; list subdirectories + 15350 ;jc short catExtErr + 15351 ; 07/06/2023 + 15352 ; MSDOS 6.22 COMMAND.COM + 15353 00001229 723B jc short catExtErr1 15354 - 15355 ;;;test Bits,mask bare - 15356 ;;test word [_Bits],8 - 15357 ;test byte [_Bits],8 - 15358 ; 07/06/2023 - 15359 0000122B F606[8B9D]08 test byte [_Bits],mask.bare ; 16 ; MSDOS 6.0 (6.22) - 15360 ; 31/07/2024 ; 8 ; PCDOS 7.1 - 15361 00001230 750D jnz short catRet ; don't bother for bare format - 15362 - 15363 ; 31/07/2024 - 15364 ; PCDOS 7.1 COMMAND.COM - 15365 %if 0 - 15366 mov ax,[FileCntTotal] - 15367 or ax,ax - 15368 jz short catNoFiles ; no files found - 15369 %else - 15370 00001232 8B0E[5E9C] mov cx,[FileCntTotal] - 15371 00001236 0B0E[609C] or cx,[FileCntTotal+2] - 15372 0000123A E317 jcxz catNoFiles ; no files found - 15373 %endif - 15374 - 15375 0000123C E8BA02 call DisplayTotals ; display trailing grand totals - 15376 ;jmp short catRet ; all done - 15377 ; 25/04/2023 - 15378 ; 07/06/2023 - 15379 catRet: - 15380 ;retn ; MSDOS 5.0 COMMAND.COM - 15381 - 15382 ; 31/07/2024 - 15383 ; PCDOS 7.1 COMMAND.COM - 15384 %if 0 - 15385 ; 07/06/2023 - 15386 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 15387 - 15388 ;test word [_Bits],1 ; mask.cratio - 15389 test byte [_Bits],mask.cratio - 15390 jz short catRetn - 15391 call CloseCVF - 15392 %endif - 15393 - 15394 catRetn: - 15395 0000123F C3 retn + 15355 catalog3: + 15356 ; Check if any files were found. + 15357 + 15358 ;;;test Bits,mask bare + 15359 ;;test word [_Bits],8 + 15360 ;test byte [_Bits],8 + 15361 ; 07/06/2023 + 15362 0000122B F606[8B9D]08 test byte [_Bits],mask.bare ; 16 ; MSDOS 6.0 (6.22) + 15363 ; 31/07/2024 ; 8 ; PCDOS 7.1 + 15364 00001230 750D jnz short catRet ; don't bother for bare format + 15365 + 15366 ; 31/07/2024 + 15367 ; PCDOS 7.1 COMMAND.COM + 15368 %if 0 + 15369 mov ax,[FileCntTotal] + 15370 or ax,ax + 15371 jz short catNoFiles ; no files found + 15372 %else + 15373 00001232 8B0E[5E9C] mov cx,[FileCntTotal] + 15374 00001236 0B0E[609C] or cx,[FileCntTotal+2] + 15375 0000123A E317 jcxz catNoFiles ; no files found + 15376 %endif + 15377 + 15378 0000123C E8BA02 call DisplayTotals ; display trailing grand totals + 15379 ;jmp short catRet ; all done + 15380 ; 25/04/2023 + 15381 ; 07/06/2023 + 15382 catRet: + 15383 ;retn ; MSDOS 5.0 COMMAND.COM + 15384 + 15385 ; 31/07/2024 + 15386 ; PCDOS 7.1 COMMAND.COM + 15387 %if 0 + 15388 ; 07/06/2023 + 15389 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 15390 + 15391 ;test word [_Bits],1 ; mask.cratio + 15392 test byte [_Bits],mask.cratio + 15393 jz short catRetn + 15394 call CloseCVF + 15395 %endif 15396 - 15397 catRecErr: - 15398 - 15399 ; ComSw may have error bit set. If not, do extended error. - 15400 - 15401 ;;;test ComSw,mask dev - 15402 ;;test word [COMSW],1 - 15403 ;test byte [COMSW],1 - 15404 00001240 F606[0B9C]01 test byte [COMSW],mask.dev - 15405 00001245 750C jnz short catNoFiles - 15406 ; filename is device, respond 'file not found' - 15407 ;;test ComSw,mask baddir - 15408 ;;test word [COMSW],2 - 15409 ;test byte [COMSW],2 - 15410 00001247 F606[0B9C]02 test byte [COMSW],mask.baddir - 15411 ;jz short catExtErr ; no ComSw error bits, must be extended error - 15412 ; 07/06/2023 - 15413 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 15414 0000124C 7418 jz short catExtErr1 - 15415 - 15416 ;mov dx,offset TRANGROUP:BadCd_Ptr - 15417 ; invalid directory - 15418 0000124E BA[3791] mov dx,badcd_ptr - 15419 ;jmp short catErr - 15420 ; 07/06/2023 - 15421 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 15422 00001251 EB23 jmp short catExtErr2 - 15423 - 15424 catNoFiles: - 15425 - 15426 ; Display header and force 'file not found' message. - 15427 - 15428 00001253 E8EF07 call DisplayHeader - 15429 00001256 B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 - 15430 00001259 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 - 15431 0000125E BA[D78F] mov dx,extend_buf_ptr - 15432 00001261 A3[D78F] mov [extend_buf_ptr],ax - 15433 ;jmp short catErr - 15434 ; 07/06/2023 - 15435 ; MSDOS 6.22 COMMAND.COM - 15436 00001264 EB10 jmp short catExtErr2 - 15437 - 15438 catExtErr: ; Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM - 15439 ; 07/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 15440 catExtErr1: - 15441 - 15442 ; DOS has returned an error status. Get the extended error#, and - 15443 ; set up an error message, changing 'No more files' error - 15444 ; to 'File not found' error. - 15445 - 15446 00001266 E8D20D call Set_Ext_Error_Msg - 15447 00001269 833E[D78F]12 cmp word [extend_buf_ptr],ERROR_NO_MORE_FILES ; 18 - 15448 ;jne short catalog4 ; catErr ; MSDOS 5.0 COMMAND.COM - 15449 ; 07/06/2023 - 15450 ; MSDOS 6.22 COMMAND.COM - 15451 0000126E 7506 jne short catExtErr2 - 15452 - 15453 00001270 C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 - 15454 - 15455 ;catalog4: ; Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM - 15456 ; 07/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 15457 catExtErr2: - 15458 - 15459 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 15460 %if 0 - 15461 ;test word [_Bits],1 ; mask.cratio - 15462 test byte [_Bits],mask.cratio - 15463 ; close Compressed Volume File if cratio - 15464 jz short catErr - 15465 call CloseCVF - 15466 %endif - 15467 - 15468 ; Error exit. Error message information has been set up - 15469 ; for Std_EPrintf. + 15397 catRetn: + 15398 0000123F C3 retn + 15399 + 15400 catRecErr: + 15401 + 15402 ; ComSw may have error bit set. If not, do extended error. + 15403 + 15404 ;;;test ComSw,mask dev + 15405 ;;test word [COMSW],1 + 15406 ;test byte [COMSW],1 + 15407 00001240 F606[0B9C]01 test byte [COMSW],mask.dev + 15408 00001245 750C jnz short catNoFiles + 15409 ; filename is device, respond 'file not found' + 15410 ;;test ComSw,mask baddir + 15411 ;;test word [COMSW],2 + 15412 ;test byte [COMSW],2 + 15413 00001247 F606[0B9C]02 test byte [COMSW],mask.baddir + 15414 ;jz short catExtErr ; no ComSw error bits, must be extended error + 15415 ; 07/06/2023 + 15416 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 15417 0000124C 7418 jz short catExtErr1 + 15418 + 15419 ;mov dx,offset TRANGROUP:BadCd_Ptr + 15420 ; invalid directory + 15421 0000124E BA[3791] mov dx,badcd_ptr + 15422 ;jmp short catErr + 15423 ; 07/06/2023 + 15424 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 15425 00001251 EB23 jmp short catExtErr2 + 15426 + 15427 catNoFiles: + 15428 + 15429 ; Display header and force 'file not found' message. + 15430 + 15431 00001253 E8EF07 call DisplayHeader + 15432 00001256 B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 + 15433 00001259 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 + 15434 0000125E BA[D78F] mov dx,extend_buf_ptr + 15435 00001261 A3[D78F] mov [extend_buf_ptr],ax + 15436 ;jmp short catErr + 15437 ; 07/06/2023 + 15438 ; MSDOS 6.22 COMMAND.COM + 15439 00001264 EB10 jmp short catExtErr2 + 15440 + 15441 catExtErr: ; Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM + 15442 ; 07/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 15443 catExtErr1: + 15444 + 15445 ; DOS has returned an error status. Get the extended error#, and + 15446 ; set up an error message, changing 'No more files' error + 15447 ; to 'File not found' error. + 15448 + 15449 00001266 E8D20D call Set_Ext_Error_Msg + 15450 00001269 833E[D78F]12 cmp word [extend_buf_ptr],ERROR_NO_MORE_FILES ; 18 + 15451 ;jne short catalog4 ; catErr ; MSDOS 5.0 COMMAND.COM + 15452 ; 07/06/2023 + 15453 ; MSDOS 6.22 COMMAND.COM + 15454 0000126E 7506 jne short catExtErr2 + 15455 + 15456 00001270 C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 + 15457 + 15458 ;catalog4: ; Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM + 15459 ; 07/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 15460 catExtErr2: + 15461 + 15462 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 15463 %if 0 + 15464 ;test word [_Bits],1 ; mask.cratio + 15465 test byte [_Bits],mask.cratio + 15466 ; close Compressed Volume File if cratio + 15467 jz short catErr + 15468 call CloseCVF + 15469 %endif 15470 - 15471 catErr: - 15472 00001276 E9AD1A jmp cerror ; go to COMMAND error recycle point + 15471 ; Error exit. Error message information has been set up + 15472 ; for Std_EPrintf. 15473 - 15474 ; 25/04/2023 - 15475 ;catRet: - 15476 ;retn - 15477 - 15478 ; --------------------------------------------------------------------------- - 15479 - 15480 ;*** SetDefaults - set default pathname, options - 15481 ; - 15482 ; ENTRY DS = TRANGROUP seg addr - 15483 ; - 15484 ; EXIT nothing - 15485 ; - 15486 ; USED AX,DI - 15487 ; - 15488 ; EFFECTS - 15489 ; SrcBuf = '*',EOL - default pathname - 15490 ; PathPos = ptr to pathname - 15491 ; PathCnt = length of pathname - 15492 - 15493 ; 16/02/2023 - 15494 SetDefaults: - 15495 00001279 BF[219E] mov di,SrcBuf ; DI = ptr to pathname buffer - 15496 0000127C 893E[8F9D] mov [PathPos],di ; PathPos = ptr to pathname - 15497 ;mov al,STAR - 15498 00001280 B02A mov al,'*' - 15499 00001282 AA stosb - 15500 ;mov al,END_OF_LINE_IN - 15501 00001283 B00D mov al,0Dh ; cr - 15502 00001285 AA stosb ; SrcBuf = '*',0Dh - 15503 00001286 C706[8D9D]0100 mov word [PathCnt],1 ; PathCnt = pathname length - 15504 - 15505 0000128C 31C0 xor ax,ax ; AX = 0 - 15506 0000128E A3[0B9C] mov [COMSW],ax ; = no error - 15507 00001291 A3[8B9D] mov [_Bits],ax ; = options off - 15508 00001294 A2[BE9D] mov [DestBuf],al ; = no sort - 15509 00001297 C606[939D]06 mov byte [AttrSpecified],ATTR_HIDDEN+ATTR_SYSTEM ; 6 - 15510 0000129C A2[949D] mov [AttrSelect],al ; exclude hidden, system files - 15511 peRet: ; 25/04/2023 - 15512 0000129F C3 retn - 15513 - 15514 ; --------------------------------------------------------------------------- - 15515 - 15516 ;*** ParseEnvironment - find and parse our environment variable - 15517 ; - 15518 ; Find our environment variable and parse it. If a parse - 15519 ; error occurs, issue an error message. The parse results - 15520 ; up to the error will still have effect. Always leave - 15521 ; the option variables in a useable state. - 15522 ; - 15523 ; ENTRY DS = TRANGROUP seg addr - 15524 ; - 15525 ; EXIT nothing - 15526 ; - 15527 ; USED AX,BX,CX,DX,SI,DI - 15528 ; - 15529 ; EFFECTS - 15530 ; - 15531 ; Bits may contain new option settings. - 15532 ; DestBuf may contain new series of sort codes. - 15533 ; AttrSpecified, AttrSelect may contain new attribute conditions. - 15534 ; SrcBuf may contain a new default pathname/filespec. - 15535 ; PathPos, PathCnt updated for new pathname. - 15536 ; - 15537 ; If a parse error occurred, an error message will be issued. - 15538 - 15539 ; 16/02/2023 - 15540 ParseEnvironment: - 15541 000012A0 E80D04 call GetEnvValue ; get environment variable value - 15542 000012A3 72FA jc short peRet ; name not found in environment - 15543 - 15544 ; SI = ptr to value of environment variable, in TRANGROUP seg - 15545 - 15546 000012A5 E85E05 call Parse_Line ; parse environment value - 15547 000012A8 83F8FF cmp ax,-1 ; 0FFFFh - 15548 ;cmp ax,END_OF_LINE - 15549 000012AB 74F2 je short peRet ; successful completion - 15550 - 15551 ; Some kind of parse error occurred. - 15552 ; We're set up for a Std_EPrintf call. + 15474 catErr: + 15475 00001276 E9AD1A jmp cerror ; go to COMMAND error recycle point + 15476 + 15477 ; 25/04/2023 + 15478 ;catRet: + 15479 ;retn + 15480 + 15481 ; --------------------------------------------------------------------------- + 15482 + 15483 ;*** SetDefaults - set default pathname, options + 15484 ; + 15485 ; ENTRY DS = TRANGROUP seg addr + 15486 ; + 15487 ; EXIT nothing + 15488 ; + 15489 ; USED AX,DI + 15490 ; + 15491 ; EFFECTS + 15492 ; SrcBuf = '*',EOL - default pathname + 15493 ; PathPos = ptr to pathname + 15494 ; PathCnt = length of pathname + 15495 + 15496 ; 16/02/2023 + 15497 SetDefaults: + 15498 00001279 BF[219E] mov di,SrcBuf ; DI = ptr to pathname buffer + 15499 0000127C 893E[8F9D] mov [PathPos],di ; PathPos = ptr to pathname + 15500 ;mov al,STAR + 15501 00001280 B02A mov al,'*' + 15502 00001282 AA stosb + 15503 ;mov al,END_OF_LINE_IN + 15504 00001283 B00D mov al,0Dh ; cr + 15505 00001285 AA stosb ; SrcBuf = '*',0Dh + 15506 00001286 C706[8D9D]0100 mov word [PathCnt],1 ; PathCnt = pathname length + 15507 + 15508 0000128C 31C0 xor ax,ax ; AX = 0 + 15509 0000128E A3[0B9C] mov [COMSW],ax ; = no error + 15510 00001291 A3[8B9D] mov [_Bits],ax ; = options off + 15511 00001294 A2[BE9D] mov [DestBuf],al ; = no sort + 15512 00001297 C606[939D]06 mov byte [AttrSpecified],ATTR_HIDDEN+ATTR_SYSTEM ; 6 + 15513 0000129C A2[949D] mov [AttrSelect],al ; exclude hidden, system files + 15514 peRet: ; 25/04/2023 + 15515 0000129F C3 retn + 15516 + 15517 ; --------------------------------------------------------------------------- + 15518 + 15519 ;*** ParseEnvironment - find and parse our environment variable + 15520 ; + 15521 ; Find our environment variable and parse it. If a parse + 15522 ; error occurs, issue an error message. The parse results + 15523 ; up to the error will still have effect. Always leave + 15524 ; the option variables in a useable state. + 15525 ; + 15526 ; ENTRY DS = TRANGROUP seg addr + 15527 ; + 15528 ; EXIT nothing + 15529 ; + 15530 ; USED AX,BX,CX,DX,SI,DI + 15531 ; + 15532 ; EFFECTS + 15533 ; + 15534 ; Bits may contain new option settings. + 15535 ; DestBuf may contain new series of sort codes. + 15536 ; AttrSpecified, AttrSelect may contain new attribute conditions. + 15537 ; SrcBuf may contain a new default pathname/filespec. + 15538 ; PathPos, PathCnt updated for new pathname. + 15539 ; + 15540 ; If a parse error occurred, an error message will be issued. + 15541 + 15542 ; 16/02/2023 + 15543 ParseEnvironment: + 15544 000012A0 E80D04 call GetEnvValue ; get environment variable value + 15545 000012A3 72FA jc short peRet ; name not found in environment + 15546 + 15547 ; SI = ptr to value of environment variable, in TRANGROUP seg + 15548 + 15549 000012A5 E85E05 call Parse_Line ; parse environment value + 15550 000012A8 83F8FF cmp ax,-1 ; 0FFFFh + 15551 ;cmp ax,END_OF_LINE + 15552 000012AB 74F2 je short peRet ; successful completion 15553 - 15554 000012AD E87041 call std_eprintf ; display the parse error - 15555 ;mov byte [Msg_Disp_Class],util_msg_class ; -1 - 15556 ; restore default msg class - 15557 000012B0 C606[D58F]FF mov byte [msg_disp_class],0FFh ; -1 - 15558 ;mov dx,offset TRANGROUP:ErrParsEnv_Ptr - 15559 000012B5 BA[9292] mov dx,errparsenv_ptr - 15560 ;;invoke Printf_Crlf ; "(Error occurred in environment.." - 15561 ;call Printf_Crlf - 15562 ; 25/04/2023 - 15563 ;retn - 15564 000012B8 E95F41 jmp Printf_Crlf - 15565 ;M008;Internal handling of /? removed - 15566 ;peOk: and Bits,not mask help ; disallow /h in environment variable - 15567 ; 25/04/2023 - 15568 ;peRet: - 15569 ;retn - 15570 - 15571 ; --------------------------------------------------------------------------- - 15572 - 15573 ;*** ParseCmdLine - parse and record command line parameters - 15574 ; - 15575 ; ENTRY PSP offset 81h is beginning of cmd line buffer - 15576 ; DS, ES, CS = TRANGROUP seg addr + 15554 ; Some kind of parse error occurred. + 15555 ; We're set up for a Std_EPrintf call. + 15556 + 15557 000012AD E87041 call std_eprintf ; display the parse error + 15558 ;mov byte [Msg_Disp_Class],util_msg_class ; -1 + 15559 ; restore default msg class + 15560 000012B0 C606[D58F]FF mov byte [msg_disp_class],0FFh ; -1 + 15561 ;mov dx,offset TRANGROUP:ErrParsEnv_Ptr + 15562 000012B5 BA[9292] mov dx,errparsenv_ptr + 15563 ;;invoke Printf_Crlf ; "(Error occurred in environment.." + 15564 ;call Printf_Crlf + 15565 ; 25/04/2023 + 15566 ;retn + 15567 000012B8 E95F41 jmp Printf_Crlf + 15568 ;M008;Internal handling of /? removed + 15569 ;peOk: and Bits,not mask help ; disallow /h in environment variable + 15570 ; 25/04/2023 + 15571 ;peRet: + 15572 ;retn + 15573 + 15574 ; --------------------------------------------------------------------------- + 15575 + 15576 ;*** ParseCmdLine - parse and record command line parameters 15577 ; - 15578 ; EXIT CY = set if parse error occurred - 15579 ; - 15580 ; If parse error occurred, we're set up for Std_EPrintf call: - 15581 ; AX = system parser error code - 15582 ; DX = ptr to message block - 15583 ; - 15584 ; USED AX,BX,CX,DX,SI,DI - 15585 ; - 15586 ; EFFECTS - 15587 ; - 15588 ; Bits may contain new option settings. - 15589 ; DestBuf may contain new series of sort codes. - 15590 ; AttrSpecified, AttrSelect may contain new attribute conditions. - 15591 ; SrcBuf may contain a new default pathname/filespec. - 15592 ; PathPos, PathCnt updated for new pathname. - 15593 ; - 15594 ; If parse error occurred, we're set up for Std_EPrintf call: - 15595 ; Msg_Disp_Class = parse error class - 15596 ; Byte after last parameter in text is zeroed to make ASCIIZ string - 15597 ; Message block (see DX) is set up for parse error message - 15598 - 15599 ; 16/02/2023 - 15600 ParseCmdLine: - 15601 000012BB BE8100 mov si,81h ; SI = ptr to cmd-line tail text - 15602 000012BE E84505 call Parse_Line ; parse cmd line tail - 15603 000012C1 83F8FF cmp ax,-1 ; 0FFFFh - 15604 ;;cmp ax,END_OF_LINE - 15605 ; 25/04/2023 - 15606 ;je short pcOk ; parse completed successfully - 15607 - 15608 ; A parse error occurred. We're all set up for message output. - 15609 - 15610 ; 25/04/2023 - 15611 ; cf = 1 (ax < 0FFFFh) - 15612 ;stc ; return failure - 15613 ;jmp short pcRet - 15614 ; 25/04/2023 - 15615 ;retn - 15616 pcOk: + 15578 ; ENTRY PSP offset 81h is beginning of cmd line buffer + 15579 ; DS, ES, CS = TRANGROUP seg addr + 15580 ; + 15581 ; EXIT CY = set if parse error occurred + 15582 ; + 15583 ; If parse error occurred, we're set up for Std_EPrintf call: + 15584 ; AX = system parser error code + 15585 ; DX = ptr to message block + 15586 ; + 15587 ; USED AX,BX,CX,DX,SI,DI + 15588 ; + 15589 ; EFFECTS + 15590 ; + 15591 ; Bits may contain new option settings. + 15592 ; DestBuf may contain new series of sort codes. + 15593 ; AttrSpecified, AttrSelect may contain new attribute conditions. + 15594 ; SrcBuf may contain a new default pathname/filespec. + 15595 ; PathPos, PathCnt updated for new pathname. + 15596 ; + 15597 ; If parse error occurred, we're set up for Std_EPrintf call: + 15598 ; Msg_Disp_Class = parse error class + 15599 ; Byte after last parameter in text is zeroed to make ASCIIZ string + 15600 ; Message block (see DX) is set up for parse error message + 15601 + 15602 ; 16/02/2023 + 15603 ParseCmdLine: + 15604 000012BB BE8100 mov si,81h ; SI = ptr to cmd-line tail text + 15605 000012BE E84505 call Parse_Line ; parse cmd line tail + 15606 000012C1 83F8FF cmp ax,-1 ; 0FFFFh + 15607 ;;cmp ax,END_OF_LINE + 15608 ; 25/04/2023 + 15609 ;je short pcOk ; parse completed successfully + 15610 + 15611 ; A parse error occurred. We're all set up for message output. + 15612 + 15613 ; 25/04/2023 + 15614 ; cf = 1 (ax < 0FFFFh) + 15615 ;stc ; return failure + 15616 ;jmp short pcRet 15617 ; 25/04/2023 - 15618 ;cf = 0 (ax = 0FFFFh) - 15619 ;clc ; return success - 15620 pcRet: - 15621 000012C4 C3 retn - 15622 - 15623 ; --------------------------------------------------------------------------- - 15624 - 15625 ;*** SetCollatingTable - set up character collating table for sorting - 15626 ; - 15627 ; If country is other than USA, try to get a collating table - 15628 ; for character sorting. For USA, use straight byte values. - 15629 ; This is so DIR behaves like the MS-DOS Shell, which sorts - 15630 ; by straight byte values in the USA for better performance. - 15631 ; - 15632 ; ENTRY ES = TRANGROUP seg addr - 15633 ; - 15634 ; EXIT nothing - 15635 ; - 15636 ; USED AX,BX,CX,DX,DI - 15637 ; - 15638 ; EFFECTS - 15639 ; - 15640 ; If collating table is set - - 15641 ; CountryPtrId = 6. - 15642 ; CountryPtr points to collating table. - 15643 ; - 15644 ; Otherwise - - 15645 ; CountryPtrId = 0. - 15646 - 15647 SetCollatingTable: - 15648 - 15649 ; Begin modification M028 - 15650 - 15651 ;mov dx,offset TRANGROUP:InternatVars - 15652 ; ; DS:DX = ptr to international info buffer - 15653 000012C5 BA[9EA5] mov dx,INTERNATVARS - 15654 000012C8 B80038 mov ax,3800h - 15655 ;mov ax,INTERNATIONAL << 8 - 15656 ;;mov ax,INTERNATIONAL shl 8 - 15657 ; AX = 'Get current country info' - 15658 000012CB CD21 int 21h ; call DOS - 15659 000012CD 7217 jc short scNoTable ; error - so don't collate - 15660 - 15661 ; BX = country code - 15662 - 15663 000012CF 83FB01 cmp bx,1 - 15664 000012D2 7412 je short scNoTable ; we're in USA, don't collate + 15618 ;retn + 15619 pcOk: + 15620 ; 25/04/2023 + 15621 ;cf = 0 (ax = 0FFFFh) + 15622 ;clc ; return success + 15623 pcRet: + 15624 000012C4 C3 retn + 15625 + 15626 ; --------------------------------------------------------------------------- + 15627 + 15628 ;*** SetCollatingTable - set up character collating table for sorting + 15629 ; + 15630 ; If country is other than USA, try to get a collating table + 15631 ; for character sorting. For USA, use straight byte values. + 15632 ; This is so DIR behaves like the MS-DOS Shell, which sorts + 15633 ; by straight byte values in the USA for better performance. + 15634 ; + 15635 ; ENTRY ES = TRANGROUP seg addr + 15636 ; + 15637 ; EXIT nothing + 15638 ; + 15639 ; USED AX,BX,CX,DX,DI + 15640 ; + 15641 ; EFFECTS + 15642 ; + 15643 ; If collating table is set - + 15644 ; CountryPtrId = 6. + 15645 ; CountryPtr points to collating table. + 15646 ; + 15647 ; Otherwise - + 15648 ; CountryPtrId = 0. + 15649 + 15650 SetCollatingTable: + 15651 + 15652 ; Begin modification M028 + 15653 + 15654 ;mov dx,offset TRANGROUP:InternatVars + 15655 ; ; DS:DX = ptr to international info buffer + 15656 000012C5 BA[9EA5] mov dx,INTERNATVARS + 15657 000012C8 B80038 mov ax,3800h + 15658 ;mov ax,INTERNATIONAL << 8 + 15659 ;;mov ax,INTERNATIONAL shl 8 + 15660 ; AX = 'Get current country info' + 15661 000012CB CD21 int 21h ; call DOS + 15662 000012CD 7217 jc short scNoTable ; error - so don't collate + 15663 + 15664 ; BX = country code 15665 - 15666 ; End modification M028 - 15667 - 15668 ;* Country code is other than USA. Try to get a collating table. - 15669 - 15670 000012D4 B80665 mov ax,6506h - 15671 ;mov ax,(GETEXTCNTRY << 8) + SETCOLLATE - 15672 ;;mov ax,(GETEXTCNTRY shl 8) + SETCOLLATE - 15673 ; AH = 'Get Extended Country Info' - 15674 ; AL = 'Get Pointer to Collating Table' - 15675 000012D7 BBFFFF mov bx,-1 ; BX = code page of interest = CON - 15676 000012DA B90500 mov cx,5 ; CX = length of info buffer - 15677 000012DD 89DA mov dx,bx ; DX = country ID = default - 15678 ;mov di,offset TRANGROUP:CountryPtrInfo - 15679 000012DF BF[BEA5] mov di,CountryPtrInfo - 15680 ; ES:DI = ptr to info buffer - 15681 000012E2 CD21 int 21h ; call DOS - 15682 000012E4 7305 jnc short scRet ; success - 15683 - 15684 ;* Set CountryPtrId = 0 to signal no collating table. - 15685 - 15686 scNoTable: ;M028 - 15687 000012E6 C606[BEA5]00 mov byte [CountryPtrId],0 - 15688 scRet: - 15689 000012EB C3 retn - 15690 - 15691 ; --------------------------------------------------------------------------- - 15692 - 15693 ;*** SetOptions - check and set options - 15694 ; - 15695 ; ENTRY nothing - 15696 ; - 15697 ; EXIT nothing - 15698 ; - 15699 ; USED AX,BX,CX,DX - 15700 ; - 15701 ; EFFECTS - 15702 ; - 15703 ; Bits may contain modified option settings. - 15704 ; Display_Ioctl table, including LinPerPag variable, is filled in. - 15705 ; LeftOnPage is initialized to # lines till end of page is handled. - 15706 ; PerLine is set according to /w presence. - 15707 - 15708 ; 16/02/2023 - 15709 - 15710 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 15711 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:12BEh + 15666 000012CF 83FB01 cmp bx,1 + 15667 000012D2 7412 je short scNoTable ; we're in USA, don't collate + 15668 + 15669 ; End modification M028 + 15670 + 15671 ;* Country code is other than USA. Try to get a collating table. + 15672 + 15673 000012D4 B80665 mov ax,6506h + 15674 ;mov ax,(GETEXTCNTRY << 8) + SETCOLLATE + 15675 ;;mov ax,(GETEXTCNTRY shl 8) + SETCOLLATE + 15676 ; AH = 'Get Extended Country Info' + 15677 ; AL = 'Get Pointer to Collating Table' + 15678 000012D7 BBFFFF mov bx,-1 ; BX = code page of interest = CON + 15679 000012DA B90500 mov cx,5 ; CX = length of info buffer + 15680 000012DD 89DA mov dx,bx ; DX = country ID = default + 15681 ;mov di,offset TRANGROUP:CountryPtrInfo + 15682 000012DF BF[BEA5] mov di,CountryPtrInfo + 15683 ; ES:DI = ptr to info buffer + 15684 000012E2 CD21 int 21h ; call DOS + 15685 000012E4 7305 jnc short scRet ; success + 15686 + 15687 ;* Set CountryPtrId = 0 to signal no collating table. + 15688 + 15689 scNoTable: ;M028 + 15690 000012E6 C606[BEA5]00 mov byte [CountryPtrId],0 + 15691 scRet: + 15692 000012EB C3 retn + 15693 + 15694 ; --------------------------------------------------------------------------- + 15695 + 15696 ;*** SetOptions - check and set options + 15697 ; + 15698 ; ENTRY nothing + 15699 ; + 15700 ; EXIT nothing + 15701 ; + 15702 ; USED AX,BX,CX,DX + 15703 ; + 15704 ; EFFECTS + 15705 ; + 15706 ; Bits may contain modified option settings. + 15707 ; Display_Ioctl table, including LinPerPag variable, is filled in. + 15708 ; LeftOnPage is initialized to # lines till end of page is handled. + 15709 ; PerLine is set according to /w presence. + 15710 + 15711 ; 16/02/2023 15712 - 15713 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 15714 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1335h + 15713 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 15714 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:12BEh 15715 - 15716 SetOptions: - 15717 - 15718 ; If bare listing requested, cancel wide listings. - 15719 - 15720 ;;;test Bits,mask bare - 15721 ;;test word [_Bits],8 - 15722 ;test byte [_Bits],8 - 15723 ; 07/06/2023 - 15724 000012EC F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 - 15725 ; 31/07/2024 ; mask.bare = 8 ; PCDOS 7.1 - 15726 000012F1 7405 jz short setopts1 - 15727 ;;;and Bits,not mask wide ;M007;Allow /p with /b - 15728 ;;and word [_Bits],0FFFEh - 15729 ;;and byte [_Bits],0FEh - 15730 ; 31/07/2024 - 15731 ;and word [_Bits],0FFFEh ; PCDOS 7.1 COMMAND.COM - 15732 ; 07/06/2023 - 15733 000012F3 8026[8B9D]FE and byte [_Bits],~mask.wide ; 0FDh ; MSDOS 6.0 - 15734 ; 31/07/2024 ; 0FEh ; PCDOS 7.1 - 15735 - 15736 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 15737 %if 0 - 15738 ;setopts1: ; MSDOS 5.0 COMMAND.COM - 15739 ; 07/06/2023 - 15740 ; MSDOS 6.22 COMMAND.COM - 15741 setopts0: - 15742 ;test word [_Bits],12h ; (mask bare) or (mask wide) - 15743 test byte [_Bits],(mask.bare|mask.wide) - 15744 jz short setopts1 - 15745 ;and word [_Bits],0FFFEh ; not mask cratio - 15746 and byte [_Bits],~mask.cratio - 15747 %endif - 15748 - 15749 setopts1: - 15750 ; Set # lines per display page. + 15716 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 15717 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1335h + 15718 + 15719 SetOptions: + 15720 + 15721 ; If bare listing requested, cancel wide listings. + 15722 + 15723 ;;;test Bits,mask bare + 15724 ;;test word [_Bits],8 + 15725 ;test byte [_Bits],8 + 15726 ; 07/06/2023 + 15727 000012EC F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 + 15728 ; 31/07/2024 ; mask.bare = 8 ; PCDOS 7.1 + 15729 000012F1 7405 jz short setopts1 + 15730 ;;;and Bits,not mask wide ;M007;Allow /p with /b + 15731 ;;and word [_Bits],0FFFEh + 15732 ;;and byte [_Bits],0FEh + 15733 ; 31/07/2024 + 15734 ;and word [_Bits],0FFFEh ; PCDOS 7.1 COMMAND.COM + 15735 ; 07/06/2023 + 15736 000012F3 8026[8B9D]FE and byte [_Bits],~mask.wide ; 0FDh ; MSDOS 6.0 + 15737 ; 31/07/2024 ; 0FEh ; PCDOS 7.1 + 15738 + 15739 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 15740 %if 0 + 15741 ;setopts1: ; MSDOS 5.0 COMMAND.COM + 15742 ; 07/06/2023 + 15743 ; MSDOS 6.22 COMMAND.COM + 15744 setopts0: + 15745 ;test word [_Bits],12h ; (mask bare) or (mask wide) + 15746 test byte [_Bits],(mask.bare|mask.wide) + 15747 jz short setopts1 + 15748 ;and word [_Bits],0FFFEh ; not mask cratio + 15749 and byte [_Bits],~mask.cratio + 15750 %endif 15751 - 15752 ;M01 Obtain screen height from ROM BIOS data area - 15753 ; - 15754 ;M01 mov LinPerPag,LINESPERPAGE ; default value - 15755 - 15756 000012F8 1E push ds - 15757 ;mov ax,ROMBIOS_DATA ; Get ROM Data segment - 15758 000012F9 B84000 mov ax,40h - 15759 000012FC 8ED8 mov ds,ax ; - 15760 ;Assume DS:ROMBIOS_DATA - 15761 - 15762 ;mov al,[CRT_Rows] ; [84h] ; Get max rows - 15763 000012FE A08400 mov al,[84h] - 15764 00001301 1F pop ds ; - 15765 ;Assume DS:Trangroup - 15766 - 15767 00001302 08C0 or al,al ; If zero specified - 15768 00001304 7502 jnz short setopts2 ; + 15752 setopts1: + 15753 ; Set # lines per display page. + 15754 + 15755 ;M01 Obtain screen height from ROM BIOS data area + 15756 ; + 15757 ;M01 mov LinPerPag,LINESPERPAGE ; default value + 15758 + 15759 000012F8 1E push ds + 15760 ;mov ax,ROMBIOS_DATA ; Get ROM Data segment + 15761 000012F9 B84000 mov ax,40h + 15762 000012FC 8ED8 mov ds,ax ; + 15763 ;Assume DS:ROMBIOS_DATA + 15764 + 15765 ;mov al,[CRT_Rows] ; [84h] ; Get max rows + 15766 000012FE A08400 mov al,[84h] + 15767 00001301 1F pop ds ; + 15768 ;Assume DS:Trangroup 15769 - 15770 ;mov al,LINESPERPAGE ; assume 24 rows - 15771 00001306 B019 mov al,25 ; MSDOS 5.0 COMMAND.COM (TRANGROUP:11D1h) - 15772 setopts2: - 15773 00001308 30E4 xor ah,ah - 15774 setopts3: - 15775 0000130A FEC0 inc al ; height + 1 ;M018 - 15776 - 15777 0000130C A3[179F] mov [LinPerPag],ax ; set the rows now - 15778 - 15779 ; Now the console driver can change the rows if it knows better (M01 end) - 15780 - 15781 ;mov ax,(IOCTL shl 8)+GENERIC_IOCTL_HANDLE - 15782 ; IOCTL for handles - 15783 0000130F B80C44 mov ax,440Ch - 15784 ;mov bx,STDOUT ; handle # - 15785 00001312 BB0100 mov bx,1 - 15786 ;mov ch,IOC_SC ; screen - 15787 00001315 B503 mov ch,3 - 15788 ;mov cl,get_generic ; get display info - 15789 00001317 B17F mov cl,7Fh - 15790 00001319 BA[079F] mov dx,Display_Ioctl ; info block - 15791 0000131C CD21 int 21h ; call DOS - 15792 - 15793 0000131E A1[179F] mov ax,[LinPerPag] ; AX = # lines per page - 15794 00001321 A3[1E9C] mov [LeftOnPage],ax ; initialize # lines left on page + 15770 00001302 08C0 or al,al ; If zero specified + 15771 00001304 7502 jnz short setopts2 ; + 15772 + 15773 ;mov al,LINESPERPAGE ; assume 24 rows + 15774 00001306 B019 mov al,25 ; MSDOS 5.0 COMMAND.COM (TRANGROUP:11D1h) + 15775 setopts2: + 15776 00001308 30E4 xor ah,ah + 15777 setopts3: + 15778 0000130A FEC0 inc al ; height + 1 ;M018 + 15779 + 15780 0000130C A3[179F] mov [LinPerPag],ax ; set the rows now + 15781 + 15782 ; Now the console driver can change the rows if it knows better (M01 end) + 15783 + 15784 ;mov ax,(IOCTL shl 8)+GENERIC_IOCTL_HANDLE + 15785 ; IOCTL for handles + 15786 0000130F B80C44 mov ax,440Ch + 15787 ;mov bx,STDOUT ; handle # + 15788 00001312 BB0100 mov bx,1 + 15789 ;mov ch,IOC_SC ; screen + 15790 00001315 B503 mov ch,3 + 15791 ;mov cl,get_generic ; get display info + 15792 00001317 B17F mov cl,7Fh + 15793 00001319 BA[079F] mov dx,Display_Ioctl ; info block + 15794 0000131C CD21 int 21h ; call DOS 15795 - 15796 ; Set # entries per line. - 15797 - 15798 ;mov byte [PerLine],NORMPERLIN - 15799 ; # entries per line without /w - 15800 00001324 C606[1D9C]01 mov byte [PerLine],1 - 15801 ;;;test Bits,mask wide - 15802 ;;test word [_Bits],1 - 15803 ;test byte [_Bits],1 - 15804 ; 07/06/2023 - 15805 00001329 F606[8B9D]01 test byte [_Bits],mask.wide ; 2 ; MSDOS 6.0 - 15806 ; 31/07/2024 ; 1 ; PCDOS 7.1 - 15807 0000132E 7405 jz short setopts4 - 15808 ;mov byte [PerLine],WIDEPERLIN - 15809 ; # entries per line with /w - 15810 00001330 C606[1D9C]05 mov byte [PerLine],5 - 15811 setopts4: - 15812 ;M011;start;The following code checks if a drive - 15813 ;letter has been parsed into SrcBuf, and if - 15814 ;so, the correct drive number is loaded into - 15815 ;the first FCB, at offset 5C. - 15816 - 15817 ;cmp TRANGROUP:[SrcBuf+1],COLON_CHAR ; is this a drive letter? - 15818 00001335 803E[229E]3A cmp byte [SrcBuf+1],':' - 15819 0000133A 750A jne short soRet - 15820 ;mov al,TRANGROUP:[SrcBuf] ; load drive letter into al - 15821 0000133C A0[219E] mov al,[SrcBuf] - 15822 ;and al,not 20h ; capitalize ASCII drive letter (LowerCase-32)-->UpperCase - 15823 0000133F 24DF and al,0DFh ; ~20h ; not 20h - 15824 00001341 2C40 sub al,'@' ; 40h ; convert to 1-based number (1=A) - 15825 00001343 A25C00 mov [FCB],al ; [5Ch] ; store in first FCB - 15826 ;M011;end - 15827 soRet: - 15828 00001346 C3 retn - 15829 - 15830 ; --------------------------------------------------------------------------- - 15831 - 15832 ;*** CrunchPath - analyze supplied or default pathname - 15833 ; - 15834 ; ENTRY PathPos = ptr to pathname buffer - 15835 ; PathCnt = length of pathname, not incl trailing delimiter - 15836 ; Pathname in buffer must end in delimiter (like CR) and - 15837 ; must have space for another char after the delimiter. - 15838 ; - 15839 ; EXIT CY = clear if no error - 15840 ; We are changed to directory found in pathname - 15841 ; Previous directory ready to be restored via RestUDir - 15842 ; FCB filename fields contain filename (possibly w/ wildcards) - 15843 ; - 15844 ; If error occurred, - 15845 ; CY = set - 15846 ; ComSw = error bits (see ErrorRec) - 15847 ; If ComSw not set, - 15848 ; Ready for DOS Get Extended Error call - 15849 - 15850 ; 16/02/2023 - 15851 CrunchPath: - 15852 00001347 E87802 call FileIsDevice - 15853 0000134A 7507 jne short crpath1 ; not a device, skip ahead - 15854 ;;;or ComSw,mask dev ; signal file is device - 15855 ;;or word [COMSW],1 - 15856 ;or byte [COMSW],1 - 15857 0000134C 800E[0B9C]01 or byte [COMSW],mask.dev - 15858 00001351 EB2F jmp short cpErr ; return error - 15859 crpath1: - 15860 00001353 FF36[8F9D] push word [PathPos] ; save ptr to pathname - 15861 00001357 C606[979D]FF mov byte [DirFlag],-1 - 15862 ; tell PathCrunch not to parse file into FCB - 15863 0000135C E8C316 call PathCrunch ; change to directory in pathname - 15864 0000135F C606[979D]00 mov byte [DirFlag],0 - 15865 ; reset our little flag - 15866 00001364 5E pop si ; SI = ptr to pathname - 15867 00001365 7208 jc short cpNoDir ; didn't find directory path - 15868 00001367 741A jz short cpRet ; found directory path w/ no filename - 15869 ; - leave wildcard default in FCB and return - 15870 - 15871 ;* We found a directory, and there was a filename attached. - 15872 ; DestTail = ptr to ASCIIZ filename + 15796 0000131E A1[179F] mov ax,[LinPerPag] ; AX = # lines per page + 15797 00001321 A3[1E9C] mov [LeftOnPage],ax ; initialize # lines left on page + 15798 + 15799 ; Set # entries per line. + 15800 + 15801 ;mov byte [PerLine],NORMPERLIN + 15802 ; # entries per line without /w + 15803 00001324 C606[1D9C]01 mov byte [PerLine],1 + 15804 ;;;test Bits,mask wide + 15805 ;;test word [_Bits],1 + 15806 ;test byte [_Bits],1 + 15807 ; 07/06/2023 + 15808 00001329 F606[8B9D]01 test byte [_Bits],mask.wide ; 2 ; MSDOS 6.0 + 15809 ; 31/07/2024 ; 1 ; PCDOS 7.1 + 15810 0000132E 7405 jz short setopts4 + 15811 ;mov byte [PerLine],WIDEPERLIN + 15812 ; # entries per line with /w + 15813 00001330 C606[1D9C]05 mov byte [PerLine],5 + 15814 setopts4: + 15815 ;M011;start;The following code checks if a drive + 15816 ;letter has been parsed into SrcBuf, and if + 15817 ;so, the correct drive number is loaded into + 15818 ;the first FCB, at offset 5C. + 15819 + 15820 ;cmp TRANGROUP:[SrcBuf+1],COLON_CHAR ; is this a drive letter? + 15821 00001335 803E[229E]3A cmp byte [SrcBuf+1],':' + 15822 0000133A 750A jne short soRet + 15823 ;mov al,TRANGROUP:[SrcBuf] ; load drive letter into al + 15824 0000133C A0[219E] mov al,[SrcBuf] + 15825 ;and al,not 20h ; capitalize ASCII drive letter (LowerCase-32)-->UpperCase + 15826 0000133F 24DF and al,0DFh ; ~20h ; not 20h + 15827 00001341 2C40 sub al,'@' ; 40h ; convert to 1-based number (1=A) + 15828 00001343 A25C00 mov [FCB],al ; [5Ch] ; store in first FCB + 15829 ;M011;end + 15830 soRet: + 15831 00001346 C3 retn + 15832 + 15833 ; --------------------------------------------------------------------------- + 15834 + 15835 ;*** CrunchPath - analyze supplied or default pathname + 15836 ; + 15837 ; ENTRY PathPos = ptr to pathname buffer + 15838 ; PathCnt = length of pathname, not incl trailing delimiter + 15839 ; Pathname in buffer must end in delimiter (like CR) and + 15840 ; must have space for another char after the delimiter. + 15841 ; + 15842 ; EXIT CY = clear if no error + 15843 ; We are changed to directory found in pathname + 15844 ; Previous directory ready to be restored via RestUDir + 15845 ; FCB filename fields contain filename (possibly w/ wildcards) + 15846 ; + 15847 ; If error occurred, + 15848 ; CY = set + 15849 ; ComSw = error bits (see ErrorRec) + 15850 ; If ComSw not set, + 15851 ; Ready for DOS Get Extended Error call + 15852 + 15853 ; 16/02/2023 + 15854 CrunchPath: + 15855 00001347 E87802 call FileIsDevice + 15856 0000134A 7507 jne short crpath1 ; not a device, skip ahead + 15857 ;;;or ComSw,mask dev ; signal file is device + 15858 ;;or word [COMSW],1 + 15859 ;or byte [COMSW],1 + 15860 0000134C 800E[0B9C]01 or byte [COMSW],mask.dev + 15861 00001351 EB2F jmp short cpErr ; return error + 15862 crpath1: + 15863 00001353 FF36[8F9D] push word [PathPos] ; save ptr to pathname + 15864 00001357 C606[979D]FF mov byte [DirFlag],-1 + 15865 ; tell PathCrunch not to parse file into FCB + 15866 0000135C E8C316 call PathCrunch ; change to directory in pathname + 15867 0000135F C606[979D]00 mov byte [DirFlag],0 + 15868 ; reset our little flag + 15869 00001364 5E pop si ; SI = ptr to pathname + 15870 00001365 7208 jc short cpNoDir ; didn't find directory path + 15871 00001367 741A jz short cpRet ; found directory path w/ no filename + 15872 ; - leave wildcard default in FCB and return 15873 - 15874 00001369 8B36[BB9D] mov si,[DestTail] ; SI = ptr to filename - 15875 0000136D EB28 jmp short cpFile ; go parse the file into FCB + 15874 ;* We found a directory, and there was a filename attached. + 15875 ; DestTail = ptr to ASCIIZ filename 15876 - 15877 ;* PathCrunch failed to find a directory in the pathname. - 15878 ; - 15879 ; Msg_Numb = error code - 15880 ; DestIsDir = nonzero if path delimiter char's occur in pathname - 15881 ; SI = ptr to pathname (now an ASCIIZ string) - 15882 - 15883 cpNoDir: - 15884 0000136F A1[349F] mov ax,[Msg_Numb] ; AX = error code from PathCrunch - 15885 00001372 09C0 or ax,ax - 15886 00001374 750C jnz short cpErr ; error occurred - return it - 15887 00001376 803E[B99D]00 cmp byte [DestIsDir],0 - 15888 0000137B 7407 je short cpMaybe ; no path delimiters seen, maybe it's a file - 15889 crpath3: - 15890 ;;;or ComSw,mask baddir ; signal invalid directory name - 15891 ;;or word [COMSW],2 - 15892 ;or byte [COMSW],2 - 15893 0000137D 800E[0B9C]02 or byte [COMSW],mask.baddir - 15894 ;jmp short cpErr ; return error - 15895 ; 16/02/2023 - 15896 cpErr: - 15897 00001382 F9 stc ; return error - 15898 cpRet: - 15899 00001383 C3 retn - 15900 - 15901 cpMaybe: - 15902 ; SI = ptr to pathname + 15877 00001369 8B36[BB9D] mov si,[DestTail] ; SI = ptr to filename + 15878 0000136D EB28 jmp short cpFile ; go parse the file into FCB + 15879 + 15880 ;* PathCrunch failed to find a directory in the pathname. + 15881 ; + 15882 ; Msg_Numb = error code + 15883 ; DestIsDir = nonzero if path delimiter char's occur in pathname + 15884 ; SI = ptr to pathname (now an ASCIIZ string) + 15885 + 15886 cpNoDir: + 15887 0000136F A1[349F] mov ax,[Msg_Numb] ; AX = error code from PathCrunch + 15888 00001372 09C0 or ax,ax + 15889 00001374 750C jnz short cpErr ; error occurred - return it + 15890 00001376 803E[B99D]00 cmp byte [DestIsDir],0 + 15891 0000137B 7407 je short cpMaybe ; no path delimiters seen, maybe it's a file + 15892 crpath3: + 15893 ;;;or ComSw,mask baddir ; signal invalid directory name + 15894 ;;or word [COMSW],2 + 15895 ;or byte [COMSW],2 + 15896 0000137D 800E[0B9C]02 or byte [COMSW],mask.baddir + 15897 ;jmp short cpErr ; return error + 15898 ; 16/02/2023 + 15899 cpErr: + 15900 00001382 F9 stc ; return error + 15901 cpRet: + 15902 00001383 C3 retn 15903 - 15904 ;cmp byte [si+1],COLON_CHAR - 15905 00001384 807C013A cmp byte [si+1],':' - 15906 00001388 7501 jne short crpath2 ; no drive specifier, skip ahead - 15907 0000138A AD lodsw ; SI = ptr past drive specifier "d:" - 15908 crpath2: - 15909 0000138B 813C2E2E cmp word [si],".." ; 2E2Eh - 15910 0000138F 7506 jne short cpFile ; if not "..", treat as a file - 15911 00001391 807C0200 cmp byte [si+2],0 - 15912 ;jne short cpFile ; or if there's more after "..", treat as file - 15913 ;;;;or ComSw,mask baddir ; signal invalid directory - 15914 ;;;or word [COMSW],2 - 15915 ;;or byte [COMSW],2 - 15916 ;or byte [COMSW],mask.baddir - 15917 ;jmp short cpErr ; return error - 15918 ; 16/02/2023 - 15919 00001395 74E6 je short crpath3 - 15920 - 15921 ; The preceding code was taken from the old DIR routine. - 15922 ; It's garbage, I'm afraid. It's meant to check for ".." - 15923 ; occurring when we're at the root directory. Too bad it - 15924 ; doesn't handle problems with "..\..", etc. - 15925 - 15926 ; We're ready to parse a filename into the FCB. - 15927 ; SI = ptr to ASCIIZ filename + 15904 cpMaybe: + 15905 ; SI = ptr to pathname + 15906 + 15907 ;cmp byte [si+1],COLON_CHAR + 15908 00001384 807C013A cmp byte [si+1],':' + 15909 00001388 7501 jne short crpath2 ; no drive specifier, skip ahead + 15910 0000138A AD lodsw ; SI = ptr past drive specifier "d:" + 15911 crpath2: + 15912 0000138B 813C2E2E cmp word [si],".." ; 2E2Eh + 15913 0000138F 7506 jne short cpFile ; if not "..", treat as a file + 15914 00001391 807C0200 cmp byte [si+2],0 + 15915 ;jne short cpFile ; or if there's more after "..", treat as file + 15916 ;;;;or ComSw,mask baddir ; signal invalid directory + 15917 ;;;or word [COMSW],2 + 15918 ;;or byte [COMSW],2 + 15919 ;or byte [COMSW],mask.baddir + 15920 ;jmp short cpErr ; return error + 15921 ; 16/02/2023 + 15922 00001395 74E6 je short crpath3 + 15923 + 15924 ; The preceding code was taken from the old DIR routine. + 15925 ; It's garbage, I'm afraid. It's meant to check for ".." + 15926 ; occurring when we're at the root directory. Too bad it + 15927 ; doesn't handle problems with "..\..", etc. 15928 - 15929 cpFile: - 15930 00001397 BF5C00 mov di,FCB ; 5Ch ; DI = ptr to FCB - 15931 0000139A B80E29 mov ax,290Eh - 15932 ;mov ax,(Parse_File_Descriptor<<8)|0Eh - 15933 ;;mov ax,(Parse_File_Descriptor shl 8) or 0Eh - 15934 ; wildcards already in FCB used as defaults - 15935 0000139D CD21 int 21h - 15936 0000139F F8 clc ; return success - 15937 ;jmp short cpRet - 15938 ; 16/02/2023 - 15939 000013A0 C3 retn - 15940 - 15941 ;cpErr: - 15942 ; stc ; return error - 15943 ;cpRet: - 15944 ; retn - 15945 - 15946 ; --------------------------------------------------------------------------- - 15947 - 15948 ;*** InstallCtrlC - install our private control-C handler - 15949 ; - 15950 ; Put our control-c handler in front of command.com's default - 15951 ; handler, to make sure the user's default directory gets restored. - 15952 ; This shouldn't be necessary, but, for now, there are situations - 15953 ; where the TDATA segment is left in a modified state when a - 15954 ; control-c occurs. This means that the transient will be - 15955 ; reloaded, and the user's directory cannot be restored. - 15956 ; - 15957 ; Bugbug: fix the wider problem? Involves message services. Ugly. - 15958 ; - 15959 ; ENTRY nothing - 15960 ; - 15961 ; EXIT nothing - 15962 ; - 15963 ; USED AX,BX,DX - 15964 ; - 15965 ; EFFECTS - 15966 ; - 15967 ; CtrlCHandler address placed in int 23 vector. - 15968 ; - 15969 ; NOTE - 15970 ; - 15971 ; Command.com's basic control-c handler will be restored - 15972 ; to the int 23 vector by the HeadFix routine, after DIR finishes. - 15973 - 15974 ; 16/02/2023 - 15975 InstallCtrlC: - 15976 000013A1 06 push es ; preserve ES - 15977 000013A2 B82335 mov ax,3523h - 15978 ;mov ax,(GET_INTERRUPT_VECTOR<<8)+23h - 15979 ;;mov ax,(GET_INTERRUPT_VECTOR shl 8) + 23h - 15980 000013A5 CD21 int 21h - 15981 000013A7 891E[C3A5] mov [OldCtrlCHandler],bx ; save old int 23 vector - 15982 000013AB 8C06[C5A5] mov [OldCtrlCHandler+2],es - 15983 000013AF 07 pop es ; restore ES - 15984 - 15985 000013B0 BA[C61C] mov dx,CtrlCHandler ; DS:DX = ptr to CtrlCHandler - 15986 000013B3 B82325 mov ax,2523h - 15987 ;mov ax,(SET_INTERRUPT_VECTOR<<8)+23h - 15988 ;;mov ax,(SET_INTERRUPT_VECTOR shl 8) + 23h - 15989 000013B6 CD21 int 21h - 15990 000013B8 C3 retn - 15991 - 15992 ; --------------------------------------------------------------------------- - 15993 - 15994 ;*** ListSubds - search and list files in subdirectories - 15995 ; - 15996 ; ENTRY Current directory (on selected drive) is top of subdir tree - 15997 ; FCB is still set up for file searches - 15998 ; Bits, AttrSpecified, AttrSelect, DestBuf all still set up - 15999 ; - 16000 ; EXIT CY = clear if no error - 16001 ; FileCnt = # files found & displayed - 16002 ; FileSiz = total size of files found - 16003 ; - 16004 ; If error, - 16005 ; CY = set - 16006 ; Ready for DOS Get Extended Error call - 16007 ; - 16008 ; USED AX,BX,CX,DX,SI,DI,BP - 16009 ; - 16010 ; EFFECTS - 16011 ; - 16012 ; FileCntTotal, FileSizTotal are updated. - 16013 ; Subdirectories may be listed on standard output device. + 15929 ; We're ready to parse a filename into the FCB. + 15930 ; SI = ptr to ASCIIZ filename + 15931 + 15932 cpFile: + 15933 00001397 BF5C00 mov di,FCB ; 5Ch ; DI = ptr to FCB + 15934 0000139A B80E29 mov ax,290Eh + 15935 ;mov ax,(Parse_File_Descriptor<<8)|0Eh + 15936 ;;mov ax,(Parse_File_Descriptor shl 8) or 0Eh + 15937 ; wildcards already in FCB used as defaults + 15938 0000139D CD21 int 21h + 15939 0000139F F8 clc ; return success + 15940 ;jmp short cpRet + 15941 ; 16/02/2023 + 15942 000013A0 C3 retn + 15943 + 15944 ;cpErr: + 15945 ; stc ; return error + 15946 ;cpRet: + 15947 ; retn + 15948 + 15949 ; --------------------------------------------------------------------------- + 15950 + 15951 ;*** InstallCtrlC - install our private control-C handler + 15952 ; + 15953 ; Put our control-c handler in front of command.com's default + 15954 ; handler, to make sure the user's default directory gets restored. + 15955 ; This shouldn't be necessary, but, for now, there are situations + 15956 ; where the TDATA segment is left in a modified state when a + 15957 ; control-c occurs. This means that the transient will be + 15958 ; reloaded, and the user's directory cannot be restored. + 15959 ; + 15960 ; Bugbug: fix the wider problem? Involves message services. Ugly. + 15961 ; + 15962 ; ENTRY nothing + 15963 ; + 15964 ; EXIT nothing + 15965 ; + 15966 ; USED AX,BX,DX + 15967 ; + 15968 ; EFFECTS + 15969 ; + 15970 ; CtrlCHandler address placed in int 23 vector. + 15971 ; + 15972 ; NOTE + 15973 ; + 15974 ; Command.com's basic control-c handler will be restored + 15975 ; to the int 23 vector by the HeadFix routine, after DIR finishes. + 15976 + 15977 ; 16/02/2023 + 15978 InstallCtrlC: + 15979 000013A1 06 push es ; preserve ES + 15980 000013A2 B82335 mov ax,3523h + 15981 ;mov ax,(GET_INTERRUPT_VECTOR<<8)+23h + 15982 ;;mov ax,(GET_INTERRUPT_VECTOR shl 8) + 23h + 15983 000013A5 CD21 int 21h + 15984 000013A7 891E[C3A5] mov [OldCtrlCHandler],bx ; save old int 23 vector + 15985 000013AB 8C06[C5A5] mov [OldCtrlCHandler+2],es + 15986 000013AF 07 pop es ; restore ES + 15987 + 15988 000013B0 BA[C61C] mov dx,CtrlCHandler ; DS:DX = ptr to CtrlCHandler + 15989 000013B3 B82325 mov ax,2523h + 15990 ;mov ax,(SET_INTERRUPT_VECTOR<<8)+23h + 15991 ;;mov ax,(SET_INTERRUPT_VECTOR shl 8) + 23h + 15992 000013B6 CD21 int 21h + 15993 000013B8 C3 retn + 15994 + 15995 ; --------------------------------------------------------------------------- + 15996 + 15997 ;*** ListSubds - search and list files in subdirectories + 15998 ; + 15999 ; ENTRY Current directory (on selected drive) is top of subdir tree + 16000 ; FCB is still set up for file searches + 16001 ; Bits, AttrSpecified, AttrSelect, DestBuf all still set up + 16002 ; + 16003 ; EXIT CY = clear if no error + 16004 ; FileCnt = # files found & displayed + 16005 ; FileSiz = total size of files found + 16006 ; + 16007 ; If error, + 16008 ; CY = set + 16009 ; Ready for DOS Get Extended Error call + 16010 ; + 16011 ; USED AX,BX,CX,DX,SI,DI,BP + 16012 ; + 16013 ; EFFECTS 16014 ; - 16015 ; NOTES - 16016 ; - 16017 ; ListSubds seeds the recursive entry point lsNode with a ptr - 16018 ; to a buffer where we'll stack up subdirectory filenames. - 16019 ; Each name is stored ASCIIZ. - 16020 - 16021 ; 16/02/2023 - 16022 ListSubds: - 16023 ;invoke SetRest1 ; make sure user's dir gets restored - 16024 000013B9 E8581D call SetRest1 - 16025 - 16026 000013BC BB[7B9E] mov bx,ScanBuf ; BX = ptr to child name buffer - 16027 lsNode: - 16028 000013BF C60700 mov byte [bx],0 ; start with null child name - 16029 lsLoop: - 16030 000013C2 E88702 call FindNextChild ; search for next subdirectory - 16031 000013C5 7235 jc short lsErr ; search failed - examine error - 16032 - 16033 000013C7 89DA mov dx,bx ; DX = ptr to child's name - 16034 000013C9 E8ED04 call ChangeDir ; enter child directory + 16015 ; FileCntTotal, FileSizTotal are updated. + 16016 ; Subdirectories may be listed on standard output device. + 16017 ; + 16018 ; NOTES + 16019 ; + 16020 ; ListSubds seeds the recursive entry point lsNode with a ptr + 16021 ; to a buffer where we'll stack up subdirectory filenames. + 16022 ; Each name is stored ASCIIZ. + 16023 + 16024 ; 16/02/2023 + 16025 ListSubds: + 16026 ;invoke SetRest1 ; make sure user's dir gets restored + 16027 000013B9 E8581D call SetRest1 + 16028 + 16029 000013BC BB[7B9E] mov bx,ScanBuf ; BX = ptr to child name buffer + 16030 lsNode: + 16031 000013BF C60700 mov byte [bx],0 ; start with null child name + 16032 lsLoop: + 16033 000013C2 E88702 call FindNextChild ; search for next subdirectory + 16034 000013C5 7235 jc short lsErr ; search failed - examine error 16035 - 16036 ; M023;start - 16037 000013CC 7306 jnc short lstsd1 ; check for error - 16038 ;cmp ax,3 - 16039 000013CE 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; error due to len(pathname)>MAXPATH? - 16040 000013D1 74EF je short lsLoop ; yes, skip over this subdirectory - 16041 ;jmp short lsRet ; no, other error: DIR must fail - 16042 ; 16/02/2023 ; M023;end - 16043 000013D3 C3 retn - 16044 lstsd1: - 16045 000013D4 53 push bx - 16046 000013D5 E82203 call ListDir ; list the directory - 16047 000013D8 5B pop bx - 16048 - 16049 ; Note we're ignoring errors returned here. - 16050 - 16051 000013D9 89DF mov di,bx ; DI = ptr to child's name - 16052 000013DB B90D00 mov cx,13 ; CX = max name length w/ null - 16053 000013DE 30C0 xor al,al ; AL = zero byte to look for - 16054 000013E0 F2AE repne scasb ; DI = ptr to next name pos'n in buf - 16055 000013E2 53 push bx ; save ptr to child's name - 16056 000013E3 89FB mov bx,di ; BX = ptr to next name pos'n in buf - 16057 000013E5 E8D7FF call lsNode ; recurse from new node - 16058 000013E8 5B pop bx ; BX = ptr to child's name - 16059 000013E9 9C pushf ; save error condition - 16060 - 16061 ;;shove 0 - 16062 ;mov ax,0 - 16063 000013EA 29C0 sub ax,ax ; 0 - 16064 000013EC 50 push ax - 16065 ;shove ".." - 16066 000013ED B82E2E mov ax,'..' ; 2E2Eh - 16067 000013F0 50 push ax - 16068 000013F1 89E2 mov dx,sp ; DX = ptr to "..",0 on stack - 16069 000013F3 E8C304 call ChangeDir ; return to parent directory - 16070 000013F6 58 pop ax ; restore stack - 16071 000013F7 58 pop ax - 16072 - 16073 000013F8 9D popf ; restore error condition from child - 16074 ;jc short lsRet ; return error - 16075 ;jmp short lsLoop ; look for more children - 16076 ; 16/02/2023 - 16077 000013F9 73C7 jnc short lsLoop - 16078 000013FB C3 retn - 16079 lsErr: - 16080 000013FC E84C0C call get_ext_error_number ; AX = extended error code - 16081 ;cmp ax,2 - 16082 000013FF 83F802 cmp ax,ERROR_FILE_NOT_FOUND - 16083 00001402 7406 je short lsRet ; file not found, we're ok - 16084 ;cmp ax,18 - 16085 00001404 83F812 cmp ax,ERROR_NO_MORE_FILES - 16086 00001407 7401 je short lsRet ; no more files, we're ok - 16087 00001409 F9 stc ; return other errors - 16088 lsRet: - 16089 0000140A C3 retn - 16090 - 16091 ; --------------------------------------------------------------------------- - 16092 - 16093 ;break - 16094 - 16095 ;*** SUPPORT ROUTINES - 16096 - 16097 ; ---------------------- - 16098 - 16099 ;*** CheckChild - check potential subdirectory name for FindNextChild - 16100 ; - 16101 ; ENTRY DirBuf contains DOS Find-buffer with potential child - 16102 ; BX = ptr to last child's name - 16103 ; BP = ptr to temp child's name - 16104 ; - 16105 ; EXIT nothing - 16106 ; - 16107 ; USED AX,CX,SI,DI - 16108 ; - 16109 ; EFFECTS - 16110 ; - 16111 ; Filename pointed to by BP may be changed. - 16112 ; - 16113 ; NOTES - 16114 ; - 16115 ; Potential filename replaces temp filename if: - 16116 ; it's a subdirectory file; - 16117 ; it doesn't start with a '.'; - 16118 ; it's alphanumerically greater than last child's name; - 16119 ; and it's alphanumerically less than temp name. - 16120 - 16121 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16122 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 16123 CheckChild: - 16124 ;test DirBuf.find_buf_attr,ATTR_DIRECTORY - 16125 0000140B F606[4E9D]10 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DIRECTORY ; 10h - 16126 00001410 741D jz short ccRet ; not a subdirectory file- return - 16127 - 16128 ; 16/02/2023 - 16129 00001412 BE[579D] mov si,DIRBUF+FIND_BUF.PNAME - 16130 00001415 803C2E cmp byte [si],'.' - 16131 ;;cmp DirBuf.find_buf_pname,'.' - 16132 ;cmp byte [DIRBUF+FIND_BUF.PNAME],'.' - 16133 00001418 7415 je short ccRet ; starts with a dot- return - 16134 - 16135 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname - 16136 ;mov si,DIRBUF+FIND_BUF.PNAME - 16137 0000141A 89DF mov di,bx - 16138 0000141C E8B104 call CmpAscz ; compare candidate to last child's name - 16139 0000141F 760E jna short ccRet ; it's not above it- return - 16140 - 16141 ; 07/06/2023 - 16142 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname - 16143 ;mov si,DIRBUF+FIND_BUF.PNAME - 16144 ; si = DIRBUF+FIND_BUF.PNAME - 16145 00001421 89EF mov di,bp - 16146 00001423 E8AA04 call CmpAscz ; compare candidate to temp name - 16147 00001426 7307 jnb short ccRet ; it's not below it- return - 16148 - 16149 ; New kid is alright. Copy to temp. - 16150 - 16151 ; 07/06/2023 - 16152 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname - 16153 ;mov si,DIRBUF+FIND_BUF.PNAME - 16154 ; si = DIRBUF+FIND_BUF.PNAME - 16155 00001428 89EF mov di,bp - 16156 0000142A B90D00 mov cx,13 - 16157 0000142D F3A4 rep movsb - 16158 ccRet: - 16159 0000142F C3 retn - 16160 - 16161 ; --------------------------------------------------------------------------- - 16162 - 16163 ;*** CmpEntry - compare one directory entry to another in sort order - 16164 ; - 16165 ; Compare one directory entry against another according to - 16166 ; the sort codes in DestBuf. One or more comparisons - 16167 ; may be made of file name, extension, time/date, and - 16168 ; size. Comparisons may be made for upward or downward - 16169 ; sort order. - 16170 ; - 16171 ; ENTRY ES:BX = ptr to entry to compare - 16172 ; ES:BP = ptr to entry to be compared against - 16173 ; DestBuf contains sort codes (see DestBuf) - 16174 ; DS = TRANGROUP seg addr - 16175 ; - 16176 ; EXIT BX = unchanged - 16177 ; BP = unchanged - 16178 ; Condition flags set for same, above, or below - 16179 ; comparing BX entry against BP entry. - 16180 ; 'Same, above, below' translate to 'same, after, before'. - 16181 ; - 16182 ; USED: AX,CX,DX,SI,DI - 16183 - 16184 ; 16/02/2023 - 16185 CmpEntry: - 16186 00001430 BE[BE9D] mov si,DestBuf ; (DS:SI) = ptr to sort codes - 16187 ceLoop: - 16188 00001433 31C0 xor ax,ax ; AX = 0 - 16189 00001435 8A04 mov al,[si] ; AL = sort code - 16190 00001437 08C0 or al,al - 16191 00001439 741C jz short ceDone ; sort code is zero, we're done - 16192 0000143B 46 inc si ; DS:SI = ptr to next sort code - 16193 0000143C 56 push si ; save ptr to next sort code - 16194 0000143D FEC8 dec al - 16195 0000143F D0E0 shl al,1 - 16196 ;sal al,1 ; AX = index into cmp call table - 16197 ; CY set for downward sort order - 16198 00001441 89C6 mov si,ax ; SI = index into cmp call table - 16199 00001443 2E8B84[5814] mov ax,[cs:si+FieldCmps] - 16200 ; AX = addr of compare routine - 16201 00001448 7204 jc short ceDn ; downwards sort - go swap entries - 16202 0000144A FFD0 call ax ; do upwards sort - 16203 0000144C EB06 jmp short ceNs - 16204 ceDn: - 16205 0000144E 87DD xchg bx,bp ; swap entry ptrs for downward sort order - 16206 00001450 FFD0 call ax ; do sort - 16207 00001452 87DD xchg bx,bp ; swap ptrs back - 16208 ceNs: - 16209 00001454 5E pop si ; SI = ptr to next sort code - 16210 00001455 74DC je short ceLoop ; compare showed no difference, keep trying - 16211 ceDone: - 16212 - 16213 ; Get here either from unequal compare or sort code = 0. - 16214 ; In the latter case, condition codes indicate equality, - 16215 ; which is correct. - 16216 - 16217 00001457 C3 retn - 16218 - 16219 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16220 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:1339h) + 16036 000013C7 89DA mov dx,bx ; DX = ptr to child's name + 16037 000013C9 E8ED04 call ChangeDir ; enter child directory + 16038 + 16039 ; M023;start + 16040 000013CC 7306 jnc short lstsd1 ; check for error + 16041 ;cmp ax,3 + 16042 000013CE 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; error due to len(pathname)>MAXPATH? + 16043 000013D1 74EF je short lsLoop ; yes, skip over this subdirectory + 16044 ;jmp short lsRet ; no, other error: DIR must fail + 16045 ; 16/02/2023 ; M023;end + 16046 000013D3 C3 retn + 16047 lstsd1: + 16048 000013D4 53 push bx + 16049 000013D5 E82203 call ListDir ; list the directory + 16050 000013D8 5B pop bx + 16051 + 16052 ; Note we're ignoring errors returned here. + 16053 + 16054 000013D9 89DF mov di,bx ; DI = ptr to child's name + 16055 000013DB B90D00 mov cx,13 ; CX = max name length w/ null + 16056 000013DE 30C0 xor al,al ; AL = zero byte to look for + 16057 000013E0 F2AE repne scasb ; DI = ptr to next name pos'n in buf + 16058 000013E2 53 push bx ; save ptr to child's name + 16059 000013E3 89FB mov bx,di ; BX = ptr to next name pos'n in buf + 16060 000013E5 E8D7FF call lsNode ; recurse from new node + 16061 000013E8 5B pop bx ; BX = ptr to child's name + 16062 000013E9 9C pushf ; save error condition + 16063 + 16064 ;;shove 0 + 16065 ;mov ax,0 + 16066 000013EA 29C0 sub ax,ax ; 0 + 16067 000013EC 50 push ax + 16068 ;shove ".." + 16069 000013ED B82E2E mov ax,'..' ; 2E2Eh + 16070 000013F0 50 push ax + 16071 000013F1 89E2 mov dx,sp ; DX = ptr to "..",0 on stack + 16072 000013F3 E8C304 call ChangeDir ; return to parent directory + 16073 000013F6 58 pop ax ; restore stack + 16074 000013F7 58 pop ax + 16075 + 16076 000013F8 9D popf ; restore error condition from child + 16077 ;jc short lsRet ; return error + 16078 ;jmp short lsLoop ; look for more children + 16079 ; 16/02/2023 + 16080 000013F9 73C7 jnc short lsLoop + 16081 000013FB C3 retn + 16082 lsErr: + 16083 000013FC E84C0C call get_ext_error_number ; AX = extended error code + 16084 ;cmp ax,2 + 16085 000013FF 83F802 cmp ax,ERROR_FILE_NOT_FOUND + 16086 00001402 7406 je short lsRet ; file not found, we're ok + 16087 ;cmp ax,18 + 16088 00001404 83F812 cmp ax,ERROR_NO_MORE_FILES + 16089 00001407 7401 je short lsRet ; no more files, we're ok + 16090 00001409 F9 stc ; return other errors + 16091 lsRet: + 16092 0000140A C3 retn + 16093 + 16094 ; --------------------------------------------------------------------------- + 16095 + 16096 ;break + 16097 + 16098 ;*** SUPPORT ROUTINES + 16099 + 16100 ; ---------------------- + 16101 + 16102 ;*** CheckChild - check potential subdirectory name for FindNextChild + 16103 ; + 16104 ; ENTRY DirBuf contains DOS Find-buffer with potential child + 16105 ; BX = ptr to last child's name + 16106 ; BP = ptr to temp child's name + 16107 ; + 16108 ; EXIT nothing + 16109 ; + 16110 ; USED AX,CX,SI,DI + 16111 ; + 16112 ; EFFECTS + 16113 ; + 16114 ; Filename pointed to by BP may be changed. + 16115 ; + 16116 ; NOTES + 16117 ; + 16118 ; Potential filename replaces temp filename if: + 16119 ; it's a subdirectory file; + 16120 ; it doesn't start with a '.'; + 16121 ; it's alphanumerically greater than last child's name; + 16122 ; and it's alphanumerically less than temp name. + 16123 + 16124 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16125 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 16126 CheckChild: + 16127 ;test DirBuf.find_buf_attr,ATTR_DIRECTORY + 16128 0000140B F606[4E9D]10 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DIRECTORY ; 10h + 16129 00001410 741D jz short ccRet ; not a subdirectory file- return + 16130 + 16131 ; 16/02/2023 + 16132 00001412 BE[579D] mov si,DIRBUF+FIND_BUF.PNAME + 16133 00001415 803C2E cmp byte [si],'.' + 16134 ;;cmp DirBuf.find_buf_pname,'.' + 16135 ;cmp byte [DIRBUF+FIND_BUF.PNAME],'.' + 16136 00001418 7415 je short ccRet ; starts with a dot- return + 16137 + 16138 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname + 16139 ;mov si,DIRBUF+FIND_BUF.PNAME + 16140 0000141A 89DF mov di,bx + 16141 0000141C E8B104 call CmpAscz ; compare candidate to last child's name + 16142 0000141F 760E jna short ccRet ; it's not above it- return + 16143 + 16144 ; 07/06/2023 + 16145 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname + 16146 ;mov si,DIRBUF+FIND_BUF.PNAME + 16147 ; si = DIRBUF+FIND_BUF.PNAME + 16148 00001421 89EF mov di,bp + 16149 00001423 E8AA04 call CmpAscz ; compare candidate to temp name + 16150 00001426 7307 jnb short ccRet ; it's not below it- return + 16151 + 16152 ; New kid is alright. Copy to temp. + 16153 + 16154 ; 07/06/2023 + 16155 ;;mov si,offset TRANGROUP:DirBuf+find_buf_pname + 16156 ;mov si,DIRBUF+FIND_BUF.PNAME + 16157 ; si = DIRBUF+FIND_BUF.PNAME + 16158 00001428 89EF mov di,bp + 16159 0000142A B90D00 mov cx,13 + 16160 0000142D F3A4 rep movsb + 16161 ccRet: + 16162 0000142F C3 retn + 16163 + 16164 ; --------------------------------------------------------------------------- + 16165 + 16166 ;*** CmpEntry - compare one directory entry to another in sort order + 16167 ; + 16168 ; Compare one directory entry against another according to + 16169 ; the sort codes in DestBuf. One or more comparisons + 16170 ; may be made of file name, extension, time/date, and + 16171 ; size. Comparisons may be made for upward or downward + 16172 ; sort order. + 16173 ; + 16174 ; ENTRY ES:BX = ptr to entry to compare + 16175 ; ES:BP = ptr to entry to be compared against + 16176 ; DestBuf contains sort codes (see DestBuf) + 16177 ; DS = TRANGROUP seg addr + 16178 ; + 16179 ; EXIT BX = unchanged + 16180 ; BP = unchanged + 16181 ; Condition flags set for same, above, or below + 16182 ; comparing BX entry against BP entry. + 16183 ; 'Same, above, below' translate to 'same, after, before'. + 16184 ; + 16185 ; USED: AX,CX,DX,SI,DI + 16186 + 16187 ; 16/02/2023 + 16188 CmpEntry: + 16189 00001430 BE[BE9D] mov si,DestBuf ; (DS:SI) = ptr to sort codes + 16190 ceLoop: + 16191 00001433 31C0 xor ax,ax ; AX = 0 + 16192 00001435 8A04 mov al,[si] ; AL = sort code + 16193 00001437 08C0 or al,al + 16194 00001439 741C jz short ceDone ; sort code is zero, we're done + 16195 0000143B 46 inc si ; DS:SI = ptr to next sort code + 16196 0000143C 56 push si ; save ptr to next sort code + 16197 0000143D FEC8 dec al + 16198 0000143F D0E0 shl al,1 + 16199 ;sal al,1 ; AX = index into cmp call table + 16200 ; CY set for downward sort order + 16201 00001441 89C6 mov si,ax ; SI = index into cmp call table + 16202 00001443 2E8B84[5814] mov ax,[cs:si+FieldCmps] + 16203 ; AX = addr of compare routine + 16204 00001448 7204 jc short ceDn ; downwards sort - go swap entries + 16205 0000144A FFD0 call ax ; do upwards sort + 16206 0000144C EB06 jmp short ceNs + 16207 ceDn: + 16208 0000144E 87DD xchg bx,bp ; swap entry ptrs for downward sort order + 16209 00001450 FFD0 call ax ; do sort + 16210 00001452 87DD xchg bx,bp ; swap ptrs back + 16211 ceNs: + 16212 00001454 5E pop si ; SI = ptr to next sort code + 16213 00001455 74DC je short ceLoop ; compare showed no difference, keep trying + 16214 ceDone: + 16215 + 16216 ; Get here either from unequal compare or sort code = 0. + 16217 ; In the latter case, condition codes indicate equality, + 16218 ; which is correct. + 16219 + 16220 00001457 C3 retn 16221 - 16222 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 16223 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:144Eh) + 16222 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16223 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:1339h) 16224 - 16225 FieldCmps: ; call table of entry comparisons - 16226 00001458 [6214] dw CmpName - 16227 0000145A [6D14] dw CmpExt - 16228 0000145C [BE14] dw CmpTime - 16229 0000145E [DA14] dw CmpSize - 16230 00001460 [DF14] dw CmpType - 16231 - 16232 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 16233 %if 0 - 16234 ; 05/06/2023 - Retro DOS 4.2 COMMAND.COM - 16235 dw CmpCratio - 16236 %endif - 16237 - 16238 ; --------------------------------------------------------------------------- - 16239 - 16240 ;*** CmpName - compare file name of two entries - 16241 ;*** CmpExt - compare extension of two entries - 16242 ; - 16243 ; ENTRY ES:BX = ptr to one entry - 16244 ; ES:BP = ptr to another entry + 16225 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 16226 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:144Eh) + 16227 + 16228 FieldCmps: ; call table of entry comparisons + 16229 00001458 [6214] dw CmpName + 16230 0000145A [6D14] dw CmpExt + 16231 0000145C [BE14] dw CmpTime + 16232 0000145E [DA14] dw CmpSize + 16233 00001460 [DF14] dw CmpType + 16234 + 16235 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 16236 %if 0 + 16237 ; 05/06/2023 - Retro DOS 4.2 COMMAND.COM + 16238 dw CmpCratio + 16239 %endif + 16240 + 16241 ; --------------------------------------------------------------------------- + 16242 + 16243 ;*** CmpName - compare file name of two entries + 16244 ;*** CmpExt - compare extension of two entries 16245 ; - 16246 ; EXIT BX = unchanged - 16247 ; BP = unchanged - 16248 ; Condition flags set for same, above, or below - 16249 ; comparing BX entry to BP entry. - 16250 ; - 16251 ; USED: AX,CX,DX,SI,DI - 16252 - 16253 ; 16/02/2023 - 16254 CmpName: - 16255 00001462 89DE mov si,bx ; ES:SI = ptr to BX entry - 16256 00001464 89EF mov di,bp ; ES:DI = ptr to BP entry - 16257 ;;add si,filename ; ES:SI = ptr to BX name - 16258 ;add si,1 - 16259 ; 25/04/2023 - 16260 00001466 46 inc si - 16261 ;;add di,filename ; ES:DI = ptr to BP name - 16262 ;add di,1 - 16263 ; 25/04/2023 - 16264 00001467 47 inc di - 16265 ;mov cx,size filename - 16266 ; CX = length of name - 16267 00001468 B90800 mov cx,8 - 16268 0000146B EB0C jmp short CmpStr - 16269 - 16270 CmpExt: - 16271 ; 07/06/2023 - 16272 ;mov si,bx ; ES:SI = ptr to BX entry - 16273 ;mov di,bp ; ES:DI = ptr to BP entry - 16274 ;;add si,fileext ; ES:SI = ptr to BX extension - 16275 ;add si,9 - 16276 ;;add di,fileext ; ES:DI = ptr to BP extension - 16277 ;add di,9 - 16278 ; - 16279 0000146D BE0900 mov si,9 - 16280 00001470 89F7 mov di,si ; mov di,9 - 16281 00001472 01DE add si,bx - 16282 00001474 01EF add di,bp - 16283 ; - 16284 ;mov cx,size fileext ; CX = length of extension field - 16285 00001476 B90300 mov cx,3 - 16286 - 16287 ; Bugbug: use symbol for subfunction code. - 16288 - 16289 CmpStr: - 16290 00001479 803E[BEA5]06 cmp byte [CountryPtrId],6 - 16291 0000147E 753A jne short cnNoCollTable - 16292 ; no collating table available - 16293 - 16294 ;* Compare strings using collating table. - 16295 ; - 16296 ; ES:SI = ptr to 1st string - 16297 ; ES:DI = ptr to 2nd string - 16298 ; CX = length - 16299 - 16300 00001480 55 push bp ; preserve BP - 16301 00001481 53 push bx ; preserve BX - 16302 00001482 1E push ds ; preserve DS - 16303 00001483 C51E[BFA5] lds bx,[CountryPtr] ; DS:BX = ptr to collating table - 16304 ;assume ds:NOTHING - 16305 00001487 8B2F mov bp,[bx] ; BP = size of collating table - 16306 00001489 43 inc bx - 16307 0000148A 43 inc bx ; DS:BX = ptr to collating values - 16308 ; DS:[BX]-2 = size of table - 16309 0000148B 31C0 xor ax,ax ; AX = 0 for starters - 16310 - 16311 ; Bugbug: Investigate removing collating table length checks. - 16312 - 16313 cnNextChar: - 16314 0000148D 268A05 mov al,[es:di] ; AL = AX = char from 2nd string - 16315 00001490 47 inc di ; ES:DI = ptr to next char 2nd string - 16316 - 16317 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 16318 %if 0 - 16319 cmp ax,bp ; compare to collating table length - 16320 jae short cn1 ; char not in table - 16321 xlat - 16322 cn1: ; AL = AX = collating value - 16323 mov dx,ax ; DX = collating value from 2nd string - 16324 ;lods byte ptr es:[si] - 16325 es lodsb ; AL = AX = char from 1st string - 16326 ; ES:SI = ptr to next char 1st string - 16327 cmp ax,bp ; compare to collating table length - 16328 jae short cn2 ; char not in table - 16329 xlat - 16330 cn2: ; AL = AX = collating value - 16331 cmp ax,dx ; compare collating values - 16332 loope cnNextChar ; until unequal or no more left - 16333 - 16334 pop ds ; restore DS - 16335 ;assume ds:TRANGROUP - 16336 pop bx ; restore BX - 16337 pop bp ; restore BP - 16338 retn - 16339 - 16340 ;* If no collating table is available, simply compare raw ASCII values. - 16341 ; Don't we wish we could just do this all the time? Sigh. + 16246 ; ENTRY ES:BX = ptr to one entry + 16247 ; ES:BP = ptr to another entry + 16248 ; + 16249 ; EXIT BX = unchanged + 16250 ; BP = unchanged + 16251 ; Condition flags set for same, above, or below + 16252 ; comparing BX entry to BP entry. + 16253 ; + 16254 ; USED: AX,CX,DX,SI,DI + 16255 + 16256 ; 16/02/2023 + 16257 CmpName: + 16258 00001462 89DE mov si,bx ; ES:SI = ptr to BX entry + 16259 00001464 89EF mov di,bp ; ES:DI = ptr to BP entry + 16260 ;;add si,filename ; ES:SI = ptr to BX name + 16261 ;add si,1 + 16262 ; 25/04/2023 + 16263 00001466 46 inc si + 16264 ;;add di,filename ; ES:DI = ptr to BP name + 16265 ;add di,1 + 16266 ; 25/04/2023 + 16267 00001467 47 inc di + 16268 ;mov cx,size filename + 16269 ; CX = length of name + 16270 00001468 B90800 mov cx,8 + 16271 0000146B EB0C jmp short CmpStr + 16272 + 16273 CmpExt: + 16274 ; 07/06/2023 + 16275 ;mov si,bx ; ES:SI = ptr to BX entry + 16276 ;mov di,bp ; ES:DI = ptr to BP entry + 16277 ;;add si,fileext ; ES:SI = ptr to BX extension + 16278 ;add si,9 + 16279 ;;add di,fileext ; ES:DI = ptr to BP extension + 16280 ;add di,9 + 16281 ; + 16282 0000146D BE0900 mov si,9 + 16283 00001470 89F7 mov di,si ; mov di,9 + 16284 00001472 01DE add si,bx + 16285 00001474 01EF add di,bp + 16286 ; + 16287 ;mov cx,size fileext ; CX = length of extension field + 16288 00001476 B90300 mov cx,3 + 16289 + 16290 ; Bugbug: use symbol for subfunction code. + 16291 + 16292 CmpStr: + 16293 00001479 803E[BEA5]06 cmp byte [CountryPtrId],6 + 16294 0000147E 753A jne short cnNoCollTable + 16295 ; no collating table available + 16296 + 16297 ;* Compare strings using collating table. + 16298 ; + 16299 ; ES:SI = ptr to 1st string + 16300 ; ES:DI = ptr to 2nd string + 16301 ; CX = length + 16302 + 16303 00001480 55 push bp ; preserve BP + 16304 00001481 53 push bx ; preserve BX + 16305 00001482 1E push ds ; preserve DS + 16306 00001483 C51E[BFA5] lds bx,[CountryPtr] ; DS:BX = ptr to collating table + 16307 ;assume ds:NOTHING + 16308 00001487 8B2F mov bp,[bx] ; BP = size of collating table + 16309 00001489 43 inc bx + 16310 0000148A 43 inc bx ; DS:BX = ptr to collating values + 16311 ; DS:[BX]-2 = size of table + 16312 0000148B 31C0 xor ax,ax ; AX = 0 for starters + 16313 + 16314 ; Bugbug: Investigate removing collating table length checks. + 16315 + 16316 cnNextChar: + 16317 0000148D 268A05 mov al,[es:di] ; AL = AX = char from 2nd string + 16318 00001490 47 inc di ; ES:DI = ptr to next char 2nd string + 16319 + 16320 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 16321 %if 0 + 16322 cmp ax,bp ; compare to collating table length + 16323 jae short cn1 ; char not in table + 16324 xlat + 16325 cn1: ; AL = AX = collating value + 16326 mov dx,ax ; DX = collating value from 2nd string + 16327 ;lods byte ptr es:[si] + 16328 es lodsb ; AL = AX = char from 1st string + 16329 ; ES:SI = ptr to next char 1st string + 16330 cmp ax,bp ; compare to collating table length + 16331 jae short cn2 ; char not in table + 16332 xlat + 16333 cn2: ; AL = AX = collating value + 16334 cmp ax,dx ; compare collating values + 16335 loope cnNextChar ; until unequal or no more left + 16336 + 16337 pop ds ; restore DS + 16338 ;assume ds:TRANGROUP + 16339 pop bx ; restore BX + 16340 pop bp ; restore BP + 16341 retn 16342 - 16343 %else - 16344 ; 31/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 16345 00001491 84F6 test dh,dh - 16346 00001493 7408 jz short cn1 - 16347 00001495 30F6 xor dh,dh - 16348 00001497 88C2 mov dl,al - 16349 ;lods byte ptr es:[si] - 16350 00001499 26AC es lodsb - 16351 0000149B EB15 jmp short cn4 - 16352 cn1: - 16353 0000149D E8C112 call testkanj - 16354 000014A0 7402 jz short cn2 - 16355 000014A2 B601 mov dh,1 - 16356 cn2: - 16357 000014A4 39E8 cmp ax,bp - 16358 000014A6 7301 jnb short cn3 - 16359 000014A8 D7 xlat - 16360 cn3: - 16361 000014A9 88C2 mov dl,al - 16362 ;lods byte ptr es:[si] - 16363 000014AB 26AC es lodsb - 16364 000014AD 39E8 cmp ax,bp - 16365 000014AF 7301 jnb short cn4 - 16366 000014B1 D7 xlat - 16367 cn4: - 16368 000014B2 38D0 cmp al,dl - 16369 000014B4 E1D7 loope cnNextChar - 16370 000014B6 1F pop ds - 16371 000014B7 5B pop bx - 16372 000014B8 5D pop bp - 16373 000014B9 C3 retn - 16374 %endif - 16375 - 16376 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16377 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:138Dh) - 16378 cnNoCollTable: - 16379 ;repe cmps byte ptr es:[si], byte ptr es:[di] ; 31/07/2024 - 16380 ;db 0F3h,26h,0A6h,0C3h - 16381 000014BA F3 repe ; 0F3h - 16382 000014BB 26 es ; 26h - 16383 000014BC A6 cmpsb ; 0A6h - 16384 000014BD C3 retn ; 0C3h - 16385 - 16386 ; --------------------------------------------------------------------------- - 16387 - 16388 ;*** CmpTime - compare entries by date/time - 16389 ; - 16390 ; ENTRY ES:BX = ptr to one entry - 16391 ; ES:BP = ptr to another entry + 16343 ;* If no collating table is available, simply compare raw ASCII values. + 16344 ; Don't we wish we could just do this all the time? Sigh. + 16345 + 16346 %else + 16347 ; 31/07/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 16348 00001491 84F6 test dh,dh + 16349 00001493 7408 jz short cn1 + 16350 00001495 30F6 xor dh,dh + 16351 00001497 88C2 mov dl,al + 16352 ;lods byte ptr es:[si] + 16353 00001499 26AC es lodsb + 16354 0000149B EB15 jmp short cn4 + 16355 cn1: + 16356 0000149D E8C112 call testkanj + 16357 000014A0 7402 jz short cn2 + 16358 000014A2 B601 mov dh,1 + 16359 cn2: + 16360 000014A4 39E8 cmp ax,bp + 16361 000014A6 7301 jnb short cn3 + 16362 000014A8 D7 xlat + 16363 cn3: + 16364 000014A9 88C2 mov dl,al + 16365 ;lods byte ptr es:[si] + 16366 000014AB 26AC es lodsb + 16367 000014AD 39E8 cmp ax,bp + 16368 000014AF 7301 jnb short cn4 + 16369 000014B1 D7 xlat + 16370 cn4: + 16371 000014B2 38D0 cmp al,dl + 16372 000014B4 E1D7 loope cnNextChar + 16373 000014B6 1F pop ds + 16374 000014B7 5B pop bx + 16375 000014B8 5D pop bp + 16376 000014B9 C3 retn + 16377 %endif + 16378 + 16379 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16380 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:138Dh) + 16381 cnNoCollTable: + 16382 ;repe cmps byte ptr es:[si], byte ptr es:[di] ; 31/07/2024 + 16383 ;db 0F3h,26h,0A6h,0C3h + 16384 000014BA F3 repe ; 0F3h + 16385 000014BB 26 es ; 26h + 16386 000014BC A6 cmpsb ; 0A6h + 16387 000014BD C3 retn ; 0C3h + 16388 + 16389 ; --------------------------------------------------------------------------- + 16390 + 16391 ;*** CmpTime - compare entries by date/time 16392 ; - 16393 ; EXIT BX = unchanged - 16394 ; BP = unchanged - 16395 ; Condition flags set for same, above, or below - 16396 ; comparing BX entry to BP entry. - 16397 ; - 16398 ; USED: CX,SI,DI - 16399 ; - 16400 ; NOTE Filetime and filedate fields in our private entry - 16401 ; structure must be adjacent and in that order. - 16402 - 16403 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16404 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 16405 CmpTime: - 16406 000014BE 89DE mov si,bx - 16407 000014C0 89EF mov di,bp - 16408 ;add si,filedate + size filedate - 1 - 16409 000014C2 83C610 add si,16 ; 15+2-1 - 16410 ;add di,filedate + size filedate - 1 - 16411 000014C5 83C710 add di,16 ; 15+2-1 - 16412 ; 07/06/2023 - 16413 000014C8 BE1000 mov si,16 - 16414 CmpST2: ; 07/06/2023 - 16415 000014CB 89F7 mov di,si ; mov di,16 - 16416 000014CD 01DE add si,bx - 16417 000014CF 01EF add di,bp - 16418 - 16419 ;mov cx,size filetime + size filedate - 16420 000014D1 B90400 mov cx,4 ; 2+2 - 16421 000014D4 FD std - 16422 ;repe cmps byte ptr es:[si],[di] - 16423 ;db 0F3h,26h,0A6h, 0FCh,0C3h - 16424 000014D5 F3 repe ; 0F3h - 16425 000014D6 26 es ; 26h - 16426 000014D7 A6 cmpsb ; 0A6h - 16427 - 16428 000014D8 FC cld ; 0FCh - 16429 000014D9 C3 retn ; 0C3h - 16430 - 16431 ; --------------------------------------------------------------------------- - 16432 - 16433 ;*** CmpSize - compare entries by size - 16434 ; - 16435 ; ENTRY ES:BX = ptr to one entry - 16436 ; ES:BP = ptr to another entry + 16393 ; ENTRY ES:BX = ptr to one entry + 16394 ; ES:BP = ptr to another entry + 16395 ; + 16396 ; EXIT BX = unchanged + 16397 ; BP = unchanged + 16398 ; Condition flags set for same, above, or below + 16399 ; comparing BX entry to BP entry. + 16400 ; + 16401 ; USED: CX,SI,DI + 16402 ; + 16403 ; NOTE Filetime and filedate fields in our private entry + 16404 ; structure must be adjacent and in that order. + 16405 + 16406 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16407 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 16408 CmpTime: + 16409 000014BE 89DE mov si,bx + 16410 000014C0 89EF mov di,bp + 16411 ;add si,filedate + size filedate - 1 + 16412 000014C2 83C610 add si,16 ; 15+2-1 + 16413 ;add di,filedate + size filedate - 1 + 16414 000014C5 83C710 add di,16 ; 15+2-1 + 16415 ; 07/06/2023 + 16416 000014C8 BE1000 mov si,16 + 16417 CmpST2: ; 07/06/2023 + 16418 000014CB 89F7 mov di,si ; mov di,16 + 16419 000014CD 01DE add si,bx + 16420 000014CF 01EF add di,bp + 16421 + 16422 ;mov cx,size filetime + size filedate + 16423 000014D1 B90400 mov cx,4 ; 2+2 + 16424 000014D4 FD std + 16425 ;repe cmps byte ptr es:[si],[di] + 16426 ;db 0F3h,26h,0A6h, 0FCh,0C3h + 16427 000014D5 F3 repe ; 0F3h + 16428 000014D6 26 es ; 26h + 16429 000014D7 A6 cmpsb ; 0A6h + 16430 + 16431 000014D8 FC cld ; 0FCh + 16432 000014D9 C3 retn ; 0C3h + 16433 + 16434 ; --------------------------------------------------------------------------- + 16435 + 16436 ;*** CmpSize - compare entries by size 16437 ; - 16438 ; EXIT BX = unchanged - 16439 ; BP = unchanged - 16440 ; Condition flags set for same, above, or below - 16441 ; comparing BX entry to BP entry. - 16442 ; - 16443 ; USED: CX,SI,DI - 16444 - 16445 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16446 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 16447 CmpSize: - 16448 ;mov si,bx - 16449 ;mov di,bp - 16450 ;;add si,filesize + size filesize - 1 - 16451 ;add si,20 ; 17+4-1 - 16452 ;;add di,filesize + size filesize - 1 - 16453 ;add di,20 ; 17+4-1 - 16454 ; 07/06/2023 - 16455 000014DA BE1400 mov si,20 - 16456 ;;; - 16457 000014DD EBEC jmp short CmpST2 ; 07/06/2023 - 16458 ;;; - 16459 ;CmpST2: - 16460 ; mov di,si ; mov di,20 - 16461 ; add si,bx - 16462 ; add di,bp - 16463 ; - 16464 ; ;mov cx,size filesize - 16465 ; mov cx,4 - 16466 ; std - 16467 ; ;repe cmps byte ptr es:[si],[di] - 16468 ; ;db 0F3h,26h,0A6h - 16469 ; repe ; 0F3h - 16470 ; es ; 26h - 16471 ; cmpsb ; 0A6h - 16472 ; - 16473 ; cld - 16474 ; retn - 16475 - 16476 ; --------------------------------------------------------------------------- - 16477 - 16478 ;*** CmpType - compare entries by file type (subdirectory or not) - 16479 ; - 16480 ; ENTRY ES:BX = ptr to one entry - 16481 ; ES:BP = ptr to another entry + 16438 ; ENTRY ES:BX = ptr to one entry + 16439 ; ES:BP = ptr to another entry + 16440 ; + 16441 ; EXIT BX = unchanged + 16442 ; BP = unchanged + 16443 ; Condition flags set for same, above, or below + 16444 ; comparing BX entry to BP entry. + 16445 ; + 16446 ; USED: CX,SI,DI + 16447 + 16448 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16449 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 16450 CmpSize: + 16451 ;mov si,bx + 16452 ;mov di,bp + 16453 ;;add si,filesize + size filesize - 1 + 16454 ;add si,20 ; 17+4-1 + 16455 ;;add di,filesize + size filesize - 1 + 16456 ;add di,20 ; 17+4-1 + 16457 ; 07/06/2023 + 16458 000014DA BE1400 mov si,20 + 16459 ;;; + 16460 000014DD EBEC jmp short CmpST2 ; 07/06/2023 + 16461 ;;; + 16462 ;CmpST2: + 16463 ; mov di,si ; mov di,20 + 16464 ; add si,bx + 16465 ; add di,bp + 16466 ; + 16467 ; ;mov cx,size filesize + 16468 ; mov cx,4 + 16469 ; std + 16470 ; ;repe cmps byte ptr es:[si],[di] + 16471 ; ;db 0F3h,26h,0A6h + 16472 ; repe ; 0F3h + 16473 ; es ; 26h + 16474 ; cmpsb ; 0A6h + 16475 ; + 16476 ; cld + 16477 ; retn + 16478 + 16479 ; --------------------------------------------------------------------------- + 16480 + 16481 ;*** CmpType - compare entries by file type (subdirectory or not) 16482 ; - 16483 ; EXIT BX = unchanged - 16484 ; BP = unchanged - 16485 ; Condition flags set for same, above, or below - 16486 ; comparing BX entry to BP entry. - 16487 ; - 16488 ; USED: AX - 16489 - 16490 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM - 16491 CmpType: - 16492 ;mov al,es:[bx].fileattr - 16493 000014DF 268A470C mov al,[es:bx+12] - 16494 ;mov ah,es:[bp].fileattr - 16495 000014E3 268A660C mov ah,[es:bp+12] - 16496 ;and ax,(ATTR_DIRECTORY shl 8) + ATTR_DIRECTORY - 16497 ;and ax,1010h - 16498 000014E7 251010 and ax,(ATTR_DIRECTORY<<8)+ATTR_DIRECTORY - 16499 000014EA 38C4 cmp ah,al - 16500 000014EC C3 retn - 16501 - 16502 ; --------------------------------------------------------------------------- - 16503 - 16504 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 16505 %if 0 + 16483 ; ENTRY ES:BX = ptr to one entry + 16484 ; ES:BP = ptr to another entry + 16485 ; + 16486 ; EXIT BX = unchanged + 16487 ; BP = unchanged + 16488 ; Condition flags set for same, above, or below + 16489 ; comparing BX entry to BP entry. + 16490 ; + 16491 ; USED: AX + 16492 + 16493 ; 16/02/2023 - Retro DOS v4.0 COMMAND.COM + 16494 CmpType: + 16495 ;mov al,es:[bx].fileattr + 16496 000014DF 268A470C mov al,[es:bx+12] + 16497 ;mov ah,es:[bp].fileattr + 16498 000014E3 268A660C mov ah,[es:bp+12] + 16499 ;and ax,(ATTR_DIRECTORY shl 8) + ATTR_DIRECTORY + 16500 ;and ax,1010h + 16501 000014E7 251010 and ax,(ATTR_DIRECTORY<<8)+ATTR_DIRECTORY + 16502 000014EA 38C4 cmp ah,al + 16503 000014EC C3 retn + 16504 + 16505 ; --------------------------------------------------------------------------- 16506 - 16507 ;*** CmpCratio - compare entries by compression ratio - 16508 ; - 16509 ; ENTRY ES:BX = ptr to one entry - 16510 ; ES:BP = ptr to another entry + 16507 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 16508 %if 0 + 16509 + 16510 ;*** CmpCratio - compare entries by compression ratio 16511 ; - 16512 ; EXIT BX = unchanged - 16513 ; BP = unchanged - 16514 ; Condition flags set for same, above, or below - 16515 ; comparing BX entry to BP entry. - 16516 ; - 16517 ; USED: AX - 16518 - 16519 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 16520 CmpCratio: - 16521 ;mov al,es:[bx].compratio - 16522 mov al,[es:bx+21] - 16523 ;cmp al,es:[bp].compratio - 16524 cmp al,[es:bp+21] - 16525 retn - 16526 - 16527 %endif - 16528 - 16529 ; --------------------------------------------------------------------------- - 16530 - 16531 ;*** DefaultAttr - set default attribute conditions - 16532 ; - 16533 ; ENTRY nothing - 16534 ; - 16535 ; EXIT CY clear - 16536 ; - 16537 ; USED - 16538 ; - 16539 ; EFFECTS - 16540 ; - 16541 ; AttrSpecified, AttrSelect are updated with new attribute conditions. - 16542 - 16543 ; 16/02/2023 - 16544 DefaultAttr: - 16545 ;mov byte [AttrSpecified],6 - 16546 000014ED C606[939D]06 mov byte [AttrSpecified],ATTR_HIDDEN+ATTR_SYSTEM - 16547 ; specify H and S - 16548 000014F2 C606[949D]00 mov byte [AttrSelect],0 ; H and S must be off - 16549 000014F7 F8 clc ; return success - 16550 dtRet: ; 18/02/2023 - 16551 000014F8 C3 retn - 16552 - 16553 ; --------------------------------------------------------------------------- - 16554 - 16555 ;*** DisplayTotals - display grand total stats - 16556 ; - 16557 ; If we searched subdirectories, display the total # files found - 16558 ; and total size of files found. - 16559 ; Display disk space remaining. - 16560 ; - 16561 ; ENTRY FileCntTotal, FileSizTotal contain correct values - 16562 ; Bits contains setting of /s - 16563 ; FCB contains drive # - 16564 ; - 16565 ; EXIT nothing - 16566 ; - 16567 ; USES AX,DX - 16568 ; FileSiz - 16569 - 16570 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 16571 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:13D1h + 16512 ; ENTRY ES:BX = ptr to one entry + 16513 ; ES:BP = ptr to another entry + 16514 ; + 16515 ; EXIT BX = unchanged + 16516 ; BP = unchanged + 16517 ; Condition flags set for same, above, or below + 16518 ; comparing BX entry to BP entry. + 16519 ; + 16520 ; USED: AX + 16521 + 16522 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 16523 CmpCratio: + 16524 ;mov al,es:[bx].compratio + 16525 mov al,[es:bx+21] + 16526 ;cmp al,es:[bp].compratio + 16527 cmp al,[es:bp+21] + 16528 retn + 16529 + 16530 %endif + 16531 + 16532 ; --------------------------------------------------------------------------- + 16533 + 16534 ;*** DefaultAttr - set default attribute conditions + 16535 ; + 16536 ; ENTRY nothing + 16537 ; + 16538 ; EXIT CY clear + 16539 ; + 16540 ; USED + 16541 ; + 16542 ; EFFECTS + 16543 ; + 16544 ; AttrSpecified, AttrSelect are updated with new attribute conditions. + 16545 + 16546 ; 16/02/2023 + 16547 DefaultAttr: + 16548 ;mov byte [AttrSpecified],6 + 16549 000014ED C606[939D]06 mov byte [AttrSpecified],ATTR_HIDDEN+ATTR_SYSTEM + 16550 ; specify H and S + 16551 000014F2 C606[949D]00 mov byte [AttrSelect],0 ; H and S must be off + 16552 000014F7 F8 clc ; return success + 16553 dtRet: ; 18/02/2023 + 16554 000014F8 C3 retn + 16555 + 16556 ; --------------------------------------------------------------------------- + 16557 + 16558 ;*** DisplayTotals - display grand total stats + 16559 ; + 16560 ; If we searched subdirectories, display the total # files found + 16561 ; and total size of files found. + 16562 ; Display disk space remaining. + 16563 ; + 16564 ; ENTRY FileCntTotal, FileSizTotal contain correct values + 16565 ; Bits contains setting of /s + 16566 ; FCB contains drive # + 16567 ; + 16568 ; EXIT nothing + 16569 ; + 16570 ; USES AX,DX + 16571 ; FileSiz 16572 - 16573 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 16574 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:14F1h + 16573 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 16574 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:13D1h 16575 - 16576 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 16577 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1565h + 16576 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 16577 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:14F1h 16578 - 16579 DisplayTotals: - 16580 ;;;test Bits,mask subd - 16581 ;;test word [_Bits],4 - 16582 ;test byte [_Bits],4 - 16583 ; 07/06/2023 - 16584 000014F9 F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 - 16585 ; 31/07/2024 ; 4 ; PCDOS 7.1 - 16586 000014FE 7423 jz short dtFree ; no subdirectories- do bytes free - 16587 - 16588 00001500 E87614 call CRLF2 ; start on new line - 16589 00001503 E87304 call UseLine + 16579 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 16580 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1565h + 16581 + 16582 DisplayTotals: + 16583 ;;;test Bits,mask subd + 16584 ;;test word [_Bits],4 + 16585 ;test byte [_Bits],4 + 16586 ; 07/06/2023 + 16587 000014F9 F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 + 16588 ; 31/07/2024 ; 4 ; PCDOS 7.1 + 16589 000014FE 7423 jz short dtFree ; no subdirectories- do bytes free 16590 - 16591 00001506 BA[8F92] mov dx,total_ptr - 16592 00001509 E81C3F call std_printf ; "Total:",cr,lf - 16593 0000150C E86A04 call UseLine - 16594 - 16595 ; 31/07/2024 - 16596 ; PCDOS 7.1 COMMAND.COM - 16597 ;;; - 16598 %if 0 - 16599 ; 07/06/2023 - 16600 ; MSDOS 6.22 COMMAND.COM - 16601 ;test word [_Bits],1 ; mask.cratio - 16602 test byte [_Bits],mask.cratio - 16603 jz short dtCntSize - 16604 mov ax,[ccluUsedTotal] - 16605 mov [ccluUsedDir],ax - 16606 mov si,csecUsedTotal - 16607 mov di,csecUsedDir - 16608 movsw - 16609 movsw - 16610 dtCntSize: - 16611 %endif - 16612 ;;; - 16613 0000150F A1[5E9C] mov ax,[FileCntTotal] ; AX = # files found mod 64K - 16614 00001512 BE[629C] mov si,FileSizTotal - 16615 00001515 BF[229C] mov di,FileSiz - 16616 00001518 A5 movsw ; move total size to size variable - 16617 00001519 A5 movsw - 16618 - 16619 ; 31/07/2024 - 16620 ; PCDOS 7.1 COMMAND.COM - 16621 %if 1 - 16622 0000151A A5 movsw - 16623 0000151B A5 movsw - 16624 0000151C 8B16[609C] mov dx,[FileCntTotal+2] - 16625 %endif - 16626 00001520 E8D306 call DisplayCntSiz ; display file count & size - 16627 dtFree: - 16628 - 16629 ; 31/07/2024 - 16630 ; PCDOS 7.1 COMMAND.COM - 16631 %if 0 - 16632 mov ah,36h - 16633 ;mov ah,GET_DRIVE_FREESPACE ; AH = DOS Get Free Space function - 16634 mov dl,[FCB] ; [5Ch] ; DL = drive# - 16635 int 21h ; call DOS - 16636 cmp ax,-1 ; check 'invalid drive' return code - 16637 jz short dtRet ; can't get drive space - return - 16638 mul cx - 16639 mul bx - 16640 mov [Bytes_Free],ax - 16641 mov [Bytes_Free+2],dx - 16642 mov dx,bytmes_ptr - 16643 %else - 16644 ; 31/07/2024 - Retro DOS v5.0 - 16645 ; PCDOS 7.1 COMMAND.COM - 16646 00001523 E86907 call GetDriveLtr - 16647 00001526 A2[5A9C] mov byte [efs_drive],al ; "C:\" - 16648 00001529 BA[5A9C] mov dx,efs_drive ; "C:\" - 16649 0000152C BF[2E9C] mov di,efs_buffer - 16650 0000152F B92C00 mov cx,44 - 16651 00001532 26890D mov [es:di],cx - 16652 00001535 26C745020000 mov word [es:di+2],0 - 16653 0000153B B80373 mov ax,7303h ; GET EXTENDED FREE SPACE ON DRIVE (Windows95, FAT32) - 16654 ; DS:DX -> ASCIZ string for drive ("C:\" or "\\SERVER\Share") - 16655 ; ES:DI -> buffer for extended free space structure - 16656 ; CX = length of buffer for extended free space - 16657 0000153E CD21 int 21h ; DOS - - 16658 ; - 16659 ; Return: - 16660 ; CF clear if successful - 16661 ; ES:DI buffer filled - 16662 ; CF set on error - 16663 ; AX = error code - 16664 ; - 16665 ; Format of extended free space structure: - 16666 ; - 16667 ; Offset Size Description - 16668 ; 00h WORD (ret) size of returned structure - 16669 ; 02h WORD (call) structure version (0000h) - 16670 ; (ret) actual structure version (0000h) - 16671 ; 04h DWORD number of sectors per cluster - 16672 ; (with adjustment for compression) - 16673 ; 08h DWORD number of bytes per sector - 16674 ; 0Ch DWORD number of available clusters - 16675 ; 10h DWORD total number of clusters on the drive - 16676 ; 14h DWORD number of physical sectors available on the drive, - 16677 ; without adjustment for compression - 16678 ; 18h DWORD total number of physical sectors on the drive, - 16679 ; without adjustment for compression - 16680 ; 1Ch DWORD number of available allocation units, - 16681 ; without adjustment for compression - 16682 ; 20h DWORD total allocation units, - 16683 ; without adjustment for compression - 16684 ; 24h 8 BYTEs reserved - 16685 00001540 89C1 mov cx,ax ; error code (cf=1) or (cf=0) efs structure size (44) - 16686 00001542 268B5D08 mov bx,[es:di+8] ; bytes per sector - 16687 00001546 268B4514 mov ax,[es:di+14h] ; number of sectors available - 16688 0000154A 268B5516 mov dx,[es:di+16h] - 16689 0000154E 7204 jc short get_efs_err - 16690 00001550 08C9 or cl,cl - 16691 00001552 750F jnz short dtFree_1 ; cl = 44 (IBMDOS 7.1 Kernel, INT 21h, AX=7303h return value) - 16692 get_efs_err: - 16693 00001554 B436 mov ah,36h - 16694 ;mov ah,GET_DRIVE_FREESPACE ; AH = DOS Get Free Space function - 16695 00001556 8A165C00 mov dl,[FCB] ; DL = drive# - 16696 ;mov dl,[5Ch] - 16697 0000155A CD21 int 21h ; DOS - 2+ - GET DISK SPACE - 16698 ; DL = drive code (0 = default, 1 = A, 2 = B, etc.) - 16699 0000155C 83F8FF cmp ax,0FFFFh ; ax = sectors per cluster - 16700 0000155F 7497 je short dtRet ; ! invalid drive ! return - 16701 00001561 F7E1 mul cx ; * bytes per sectors - 16702 ; dx:ax = bytes per cluster - 16703 ; bx = free clusters - 16704 dtFree_1: - 16705 00001563 89D1 mov cx,dx ; hw of free sectors - 16706 00001565 F7E3 mul bx ; lw of free sectors * bytes per sector - 16707 00001567 91 xchg ax,cx - 16708 00001568 87D3 xchg dx,bx - 16709 0000156A F7E2 mul dx - 16710 0000156C 01D8 add ax,bx - 16711 0000156E 83D200 adc dx,0 ; dx:ax:cx = free bytes - 16712 00001571 09D2 or dx,dx - 16713 00001573 7416 jz short dtFree_2 - 16714 00001575 88E9 mov cl,ch ; prints free space as kilobytes - 16715 00001577 88C5 mov ch,al ; save al - 16716 00001579 88E0 mov al,ah ; / 256 - 16717 0000157B 88D4 mov ah,dl - 16718 0000157D D0CE ror dh,1 ; / 2 (= free bytes / 512) - 16719 0000157F D1D8 rcr ax,1 - 16720 00001581 D1D9 rcr cx,1 - 16721 00001583 D0CE ror dh,1 ; / 2 (= free bytes / 1024) - 16722 00001585 D1D8 rcr ax,1 - 16723 00001587 D1D9 rcr cx,1 - 16724 00001589 B2FF mov dl,0FFh ; dx > 0 - 16725 dtFree_2: - 16726 0000158B 890E[A99D] mov [Bytes_Free],cx - 16727 0000158F A3[AB9D] mov [Bytes_Free+2],ax - 16728 00001592 09D2 or dx,dx ; is dx > 0 ? - 16729 00001594 740F jz short dtFree_3 ; no - 16730 00001596 BA[D592] mov dx,kbytesf_ptr ; MSG_1106 (".. K bytes free" msg) - 16731 ; 30 digits, long binary do decimal - 16732 00001599 803E[2D9C]00 cmp byte [bfree_not_kilo],0 - 16733 0000159E 741C jz short dtFree_5 - 16734 000015A0 BA[D592] mov dx,kbytesf_ptr ; MSG_1106 - 16735 ; ".. K bytes free" msg, 28 digits - 16736 000015A3 EB17 jmp short dtFree_5 - 16737 dtFree_3: - 16738 000015A5 BA[4490] mov dx,bytmes1_ptr ; MSG_1020 (".. bytes free" msg) - 16739 ; 30 digits, long binary do decimal - 16740 000015A8 803E[2A9C]00 cmp byte [narrow],0 ; narrow display area ? - 16741 000015AD 7503 jnz short dtFree_4 ; yes - 16742 000015AF BA[5290] mov dx,bytmes2_ptr ; MSG_1020, 33 digits - 16743 dtFree_4: - 16744 000015B2 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; not kilobyte option - 16745 000015B7 7403 jz short dtFree_5 ; use kilo bytes (if number of free bytes is big) - 16746 000015B9 BA[6090] mov dx,bytmes_n_ptr ; narrow (28 digits), MSG_1020 - 16747 dtFree_5: - 16748 %endif - 16749 000015BC E8693E call std_printf ; "nnn bytes free",cr,lf - 16750 ;call UseLine - 16751 ;dtRet: - 16752 ;retn - 16753 ; 18/02/2023 - 16754 000015BF E9B703 jmp UseLine - 16755 - 16756 ; --------------------------------------------------------------------------- - 16757 - 16758 ;*** FileIsDevice - see if file looks like a device - 16759 ; - 16760 ; ENTRY PathPos = ptr to pathname - 16761 ; PathCnt = length of pathname w/o terminating char - 16762 ; DirBuf is DOS DTA - 16763 ; - 16764 ; EXIT ZR = set if file looks like a device - 16765 ; - 16766 ; USED AX,BX,CX,DX,DI - 16767 ; - 16768 ; EFFECTS - 16769 ; - 16770 ; DTA buffer holds results of Find First function - 16771 ; - 16772 ; NOTES - 16773 ; - 16774 ; We try to flag devices in two ways. First, we try - 16775 ; the DOS Find First function. It returns attribute bit 6 - 16776 ; set on a successful find if it identifies a device name. - 16777 ; Unfortunately, it returns 'path not found' for a device - 16778 ; name terminated with colon, such as "CON:". So, we look - 16779 ; for any colon in the pathname after the 2nd character, - 16780 ; and flag the pathname as a device if we find one. - 16781 - 16782 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 16783 FileIsDevice: - 16784 000015C2 8B16[8F9D] mov dx,[PathPos] ; DX = ptr to pathname - 16785 - 16786 000015C6 89D7 mov di,dx - 16787 000015C8 033E[8D9D] add di,[PathCnt] ; DI = ptr to byte after pathname - 16788 000015CC 30DB xor bl,bl ; BL = NUL to terminate pathname with - 16789 000015CE 861D xchg bl,[di] ; BL = saved pathname terminating char - 16790 - 16791 000015D0 31C9 xor cx,cx ; CX = attribute mask (normal search) - 16792 000015D2 B44E mov ah,4Eh - 16793 ;mov ah,Find_First ; AH = DOS Find First function code - 16794 000015D4 CD21 int 21h ; call DOS - 16795 000015D6 861D xchg bl,[di] ; restore pathname terminating char - 16796 000015D8 720A jc short piCol ; didn't find a dir entry, check for colon - 16797 - 16798 ; Found a dir entry, see if Find First thinks it's a device. - 16799 - 16800 ;test byte [DIRBUF+21],40h - 16801 000015DA F606[4E9D]40 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DEVICE - 16802 000015DF 7403 jz short piCol ; device attribute not set, look for colon - 16803 000015E1 31C9 xor cx,cx ; it's a device, return ZR flag - 16804 ;jmp short piRet - 16805 ; 25/04/2023 - 16806 piRet: - 16807 000015E3 C3 retn - 16808 - 16809 ; Device attribute not returned by Find First function. But - 16810 ; let's check for a colon anywhere in the pathname after the - 16811 ; second byte. - 16812 ; - 16813 ; DI = ptr to byte after pathname - 16814 - 16815 piCol: - 16816 000015E4 4F dec di ; DI = ptr to last char in pathname - 16817 000015E5 B03A mov al,':' - 16818 ;mov al,COLON_CHAR ; AL = colon char to search for - 16819 000015E7 8B0E[8D9D] mov cx,[PathCnt] ; CX = # chars to scan - 16820 000015EB 49 dec cx - 16821 000015EC 49 dec cx ; ignore 1st two chars of pathname - 16822 000015ED 09C9 or cx,cx - 16823 000015EF 78F2 js short piRet ; if < 2 chars in pathname, just return - 16824 000015F1 09FF or di,di ; clear ZR in case CX = 0 - 16825 000015F3 FD std ; scan downward - 16826 000015F4 F2AE repne scasb - 16827 000015F6 FC cld ; restore default upward direction - 16828 - 16829 ; After scanning, the ZR flag is set to indicate presence of a colon. - 16830 ;piRet: - 16831 000015F7 C3 retn - 16832 - 16833 ;FileIsDevice endp - 16834 - 16835 ; --------------------------------------------------------------------------- - 16836 - 16837 ;*** FindFirst - find first directory entry to display - 16838 ;*** FindNext - find next directory entry to display - 16839 ; - 16840 ; ENTRY Bits = set if entries are loaded in TPA - 16841 ; AttrSpecified, AttrSelect are set + 16591 00001500 E87614 call CRLF2 ; start on new line + 16592 00001503 E87304 call UseLine + 16593 + 16594 00001506 BA[8F92] mov dx,total_ptr + 16595 00001509 E81C3F call std_printf ; "Total:",cr,lf + 16596 0000150C E86A04 call UseLine + 16597 + 16598 ; 31/07/2024 + 16599 ; PCDOS 7.1 COMMAND.COM + 16600 ;;; + 16601 %if 0 + 16602 ; 07/06/2023 + 16603 ; MSDOS 6.22 COMMAND.COM + 16604 ;test word [_Bits],1 ; mask.cratio + 16605 test byte [_Bits],mask.cratio + 16606 jz short dtCntSize + 16607 mov ax,[ccluUsedTotal] + 16608 mov [ccluUsedDir],ax + 16609 mov si,csecUsedTotal + 16610 mov di,csecUsedDir + 16611 movsw + 16612 movsw + 16613 dtCntSize: + 16614 %endif + 16615 ;;; + 16616 0000150F A1[5E9C] mov ax,[FileCntTotal] ; AX = # files found mod 64K + 16617 00001512 BE[629C] mov si,FileSizTotal + 16618 00001515 BF[229C] mov di,FileSiz + 16619 00001518 A5 movsw ; move total size to size variable + 16620 00001519 A5 movsw + 16621 + 16622 ; 31/07/2024 + 16623 ; PCDOS 7.1 COMMAND.COM + 16624 %if 1 + 16625 0000151A A5 movsw + 16626 0000151B A5 movsw + 16627 0000151C 8B16[609C] mov dx,[FileCntTotal+2] + 16628 %endif + 16629 00001520 E8D306 call DisplayCntSiz ; display file count & size + 16630 dtFree: + 16631 + 16632 ; 31/07/2024 + 16633 ; PCDOS 7.1 COMMAND.COM + 16634 %if 0 + 16635 mov ah,36h + 16636 ;mov ah,GET_DRIVE_FREESPACE ; AH = DOS Get Free Space function + 16637 mov dl,[FCB] ; [5Ch] ; DL = drive# + 16638 int 21h ; call DOS + 16639 cmp ax,-1 ; check 'invalid drive' return code + 16640 jz short dtRet ; can't get drive space - return + 16641 mul cx + 16642 mul bx + 16643 mov [Bytes_Free],ax + 16644 mov [Bytes_Free+2],dx + 16645 mov dx,bytmes_ptr + 16646 %else + 16647 ; 31/07/2024 - Retro DOS v5.0 + 16648 ; PCDOS 7.1 COMMAND.COM + 16649 00001523 E86907 call GetDriveLtr + 16650 00001526 A2[5A9C] mov byte [efs_drive],al ; "C:\" + 16651 00001529 BA[5A9C] mov dx,efs_drive ; "C:\" + 16652 0000152C BF[2E9C] mov di,efs_buffer + 16653 0000152F B92C00 mov cx,44 + 16654 00001532 26890D mov [es:di],cx + 16655 00001535 26C745020000 mov word [es:di+2],0 + 16656 0000153B B80373 mov ax,7303h ; GET EXTENDED FREE SPACE ON DRIVE (Windows95, FAT32) + 16657 ; DS:DX -> ASCIZ string for drive ("C:\" or "\\SERVER\Share") + 16658 ; ES:DI -> buffer for extended free space structure + 16659 ; CX = length of buffer for extended free space + 16660 0000153E CD21 int 21h ; DOS - + 16661 ; + 16662 ; Return: + 16663 ; CF clear if successful + 16664 ; ES:DI buffer filled + 16665 ; CF set on error + 16666 ; AX = error code + 16667 ; + 16668 ; Format of extended free space structure: + 16669 ; + 16670 ; Offset Size Description + 16671 ; 00h WORD (ret) size of returned structure + 16672 ; 02h WORD (call) structure version (0000h) + 16673 ; (ret) actual structure version (0000h) + 16674 ; 04h DWORD number of sectors per cluster + 16675 ; (with adjustment for compression) + 16676 ; 08h DWORD number of bytes per sector + 16677 ; 0Ch DWORD number of available clusters + 16678 ; 10h DWORD total number of clusters on the drive + 16679 ; 14h DWORD number of physical sectors available on the drive, + 16680 ; without adjustment for compression + 16681 ; 18h DWORD total number of physical sectors on the drive, + 16682 ; without adjustment for compression + 16683 ; 1Ch DWORD number of available allocation units, + 16684 ; without adjustment for compression + 16685 ; 20h DWORD total allocation units, + 16686 ; without adjustment for compression + 16687 ; 24h 8 BYTEs reserved + 16688 00001540 89C1 mov cx,ax ; error code (cf=1) or (cf=0) efs structure size (44) + 16689 00001542 268B5D08 mov bx,[es:di+8] ; bytes per sector + 16690 00001546 268B4514 mov ax,[es:di+14h] ; number of sectors available + 16691 0000154A 268B5516 mov dx,[es:di+16h] + 16692 0000154E 7204 jc short get_efs_err + 16693 00001550 08C9 or cl,cl + 16694 00001552 750F jnz short dtFree_1 ; cl = 44 (IBMDOS 7.1 Kernel, INT 21h, AX=7303h return value) + 16695 get_efs_err: + 16696 00001554 B436 mov ah,36h + 16697 ;mov ah,GET_DRIVE_FREESPACE ; AH = DOS Get Free Space function + 16698 00001556 8A165C00 mov dl,[FCB] ; DL = drive# + 16699 ;mov dl,[5Ch] + 16700 0000155A CD21 int 21h ; DOS - 2+ - GET DISK SPACE + 16701 ; DL = drive code (0 = default, 1 = A, 2 = B, etc.) + 16702 0000155C 83F8FF cmp ax,0FFFFh ; ax = sectors per cluster + 16703 0000155F 7497 je short dtRet ; ! invalid drive ! return + 16704 00001561 F7E1 mul cx ; * bytes per sectors + 16705 ; dx:ax = bytes per cluster + 16706 ; bx = free clusters + 16707 dtFree_1: + 16708 00001563 89D1 mov cx,dx ; hw of free sectors + 16709 00001565 F7E3 mul bx ; lw of free sectors * bytes per sector + 16710 00001567 91 xchg ax,cx + 16711 00001568 87D3 xchg dx,bx + 16712 0000156A F7E2 mul dx + 16713 0000156C 01D8 add ax,bx + 16714 0000156E 83D200 adc dx,0 ; dx:ax:cx = free bytes + 16715 00001571 09D2 or dx,dx + 16716 00001573 7416 jz short dtFree_2 + 16717 00001575 88E9 mov cl,ch ; prints free space as kilobytes + 16718 00001577 88C5 mov ch,al ; save al + 16719 00001579 88E0 mov al,ah ; / 256 + 16720 0000157B 88D4 mov ah,dl + 16721 0000157D D0CE ror dh,1 ; / 2 (= free bytes / 512) + 16722 0000157F D1D8 rcr ax,1 + 16723 00001581 D1D9 rcr cx,1 + 16724 00001583 D0CE ror dh,1 ; / 2 (= free bytes / 1024) + 16725 00001585 D1D8 rcr ax,1 + 16726 00001587 D1D9 rcr cx,1 + 16727 00001589 B2FF mov dl,0FFh ; dx > 0 + 16728 dtFree_2: + 16729 0000158B 890E[A99D] mov [Bytes_Free],cx + 16730 0000158F A3[AB9D] mov [Bytes_Free+2],ax + 16731 00001592 09D2 or dx,dx ; is dx > 0 ? + 16732 00001594 740F jz short dtFree_3 ; no + 16733 00001596 BA[D592] mov dx,kbytesf_ptr ; MSG_1106 (".. K bytes free" msg) + 16734 ; 30 digits, long binary do decimal + 16735 00001599 803E[2D9C]00 cmp byte [bfree_not_kilo],0 + 16736 0000159E 741C jz short dtFree_5 + 16737 000015A0 BA[D592] mov dx,kbytesf_ptr ; MSG_1106 + 16738 ; ".. K bytes free" msg, 28 digits + 16739 000015A3 EB17 jmp short dtFree_5 + 16740 dtFree_3: + 16741 000015A5 BA[4490] mov dx,bytmes1_ptr ; MSG_1020 (".. bytes free" msg) + 16742 ; 30 digits, long binary do decimal + 16743 000015A8 803E[2A9C]00 cmp byte [narrow],0 ; narrow display area ? + 16744 000015AD 7503 jnz short dtFree_4 ; yes + 16745 000015AF BA[5290] mov dx,bytmes2_ptr ; MSG_1020, 33 digits + 16746 dtFree_4: + 16747 000015B2 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; not kilobyte option + 16748 000015B7 7403 jz short dtFree_5 ; use kilo bytes (if number of free bytes is big) + 16749 000015B9 BA[6090] mov dx,bytmes_n_ptr ; narrow (28 digits), MSG_1020 + 16750 dtFree_5: + 16751 %endif + 16752 000015BC E8693E call std_printf ; "nnn bytes free",cr,lf + 16753 ;call UseLine + 16754 ;dtRet: + 16755 ;retn + 16756 ; 18/02/2023 + 16757 000015BF E9B703 jmp UseLine + 16758 + 16759 ; --------------------------------------------------------------------------- + 16760 + 16761 ;*** FileIsDevice - see if file looks like a device + 16762 ; + 16763 ; ENTRY PathPos = ptr to pathname + 16764 ; PathCnt = length of pathname w/o terminating char + 16765 ; DirBuf is DOS DTA + 16766 ; + 16767 ; EXIT ZR = set if file looks like a device + 16768 ; + 16769 ; USED AX,BX,CX,DX,DI + 16770 ; + 16771 ; EFFECTS + 16772 ; + 16773 ; DTA buffer holds results of Find First function + 16774 ; + 16775 ; NOTES + 16776 ; + 16777 ; We try to flag devices in two ways. First, we try + 16778 ; the DOS Find First function. It returns attribute bit 6 + 16779 ; set on a successful find if it identifies a device name. + 16780 ; Unfortunately, it returns 'path not found' for a device + 16781 ; name terminated with colon, such as "CON:". So, we look + 16782 ; for any colon in the pathname after the 2nd character, + 16783 ; and flag the pathname as a device if we find one. + 16784 + 16785 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 16786 FileIsDevice: + 16787 000015C2 8B16[8F9D] mov dx,[PathPos] ; DX = ptr to pathname + 16788 + 16789 000015C6 89D7 mov di,dx + 16790 000015C8 033E[8D9D] add di,[PathCnt] ; DI = ptr to byte after pathname + 16791 000015CC 30DB xor bl,bl ; BL = NUL to terminate pathname with + 16792 000015CE 861D xchg bl,[di] ; BL = saved pathname terminating char + 16793 + 16794 000015D0 31C9 xor cx,cx ; CX = attribute mask (normal search) + 16795 000015D2 B44E mov ah,4Eh + 16796 ;mov ah,Find_First ; AH = DOS Find First function code + 16797 000015D4 CD21 int 21h ; call DOS + 16798 000015D6 861D xchg bl,[di] ; restore pathname terminating char + 16799 000015D8 720A jc short piCol ; didn't find a dir entry, check for colon + 16800 + 16801 ; Found a dir entry, see if Find First thinks it's a device. + 16802 + 16803 ;test byte [DIRBUF+21],40h + 16804 000015DA F606[4E9D]40 test byte [DIRBUF+FIND_BUF.ATTR],ATTR_DEVICE + 16805 000015DF 7403 jz short piCol ; device attribute not set, look for colon + 16806 000015E1 31C9 xor cx,cx ; it's a device, return ZR flag + 16807 ;jmp short piRet + 16808 ; 25/04/2023 + 16809 piRet: + 16810 000015E3 C3 retn + 16811 + 16812 ; Device attribute not returned by Find First function. But + 16813 ; let's check for a colon anywhere in the pathname after the + 16814 ; second byte. + 16815 ; + 16816 ; DI = ptr to byte after pathname + 16817 + 16818 piCol: + 16819 000015E4 4F dec di ; DI = ptr to last char in pathname + 16820 000015E5 B03A mov al,':' + 16821 ;mov al,COLON_CHAR ; AL = colon char to search for + 16822 000015E7 8B0E[8D9D] mov cx,[PathCnt] ; CX = # chars to scan + 16823 000015EB 49 dec cx + 16824 000015EC 49 dec cx ; ignore 1st two chars of pathname + 16825 000015ED 09C9 or cx,cx + 16826 000015EF 78F2 js short piRet ; if < 2 chars in pathname, just return + 16827 000015F1 09FF or di,di ; clear ZR in case CX = 0 + 16828 000015F3 FD std ; scan downward + 16829 000015F4 F2AE repne scasb + 16830 000015F6 FC cld ; restore default upward direction + 16831 + 16832 ; After scanning, the ZR flag is set to indicate presence of a colon. + 16833 ;piRet: + 16834 000015F7 C3 retn + 16835 + 16836 ;FileIsDevice endp + 16837 + 16838 ; --------------------------------------------------------------------------- + 16839 + 16840 ;*** FindFirst - find first directory entry to display + 16841 ;*** FindNext - find next directory entry to display 16842 ; - 16843 ; EXIT CY = clear if successful - 16844 ; BX = offset in TPA buffer of directory entry found + 16843 ; ENTRY Bits = set if entries are loaded in TPA + 16844 ; AttrSpecified, AttrSelect are set 16845 ; - 16846 ; If unsuccessful, - 16847 ; CY = set - 16848 ; AX = DOS error code - 16849 ; DOS Get Extended Error call will get error code - 16850 ; - 16851 ; NOTE: if entries were loaded into TPA, AX contains - 16852 ; ERROR_NO_MORE_FILES when no more entries are available, - 16853 ; but DOS Get Extended Error call WON'T return the correct - 16854 ; error. That's ok, because we'll see the value in AX - 16855 ; and recognize it as a non-error condition. - 16856 ; - 16857 ; USED AX,CX,DX,SI,DI - 16858 ; - 16859 ; EFFECTS - 16860 ; - 16861 ; Entries in memory may be marked as output. - 16862 ; If not sorted, entry is loaded at TPA. + 16846 ; EXIT CY = clear if successful + 16847 ; BX = offset in TPA buffer of directory entry found + 16848 ; + 16849 ; If unsuccessful, + 16850 ; CY = set + 16851 ; AX = DOS error code + 16852 ; DOS Get Extended Error call will get error code + 16853 ; + 16854 ; NOTE: if entries were loaded into TPA, AX contains + 16855 ; ERROR_NO_MORE_FILES when no more entries are available, + 16856 ; but DOS Get Extended Error call WON'T return the correct + 16857 ; error. That's ok, because we'll see the value in AX + 16858 ; and recognize it as a non-error condition. + 16859 ; + 16860 ; USED AX,CX,DX,SI,DI + 16861 ; + 16862 ; EFFECTS 16863 ; - 16864 ; NOTES - 16865 ; - 16866 ; If we don't find a qualifying file, we return after the final - 16867 ; DOS Find File call. A DOS Get Extended Error call will then - 16868 ; indicate an appropriate condition. - 16869 - 16870 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 16871 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:144Fh + 16864 ; Entries in memory may be marked as output. + 16865 ; If not sorted, entry is loaded at TPA. + 16866 ; + 16867 ; NOTES + 16868 ; + 16869 ; If we don't find a qualifying file, we return after the final + 16870 ; DOS Find File call. A DOS Get Extended Error call will then + 16871 ; indicate an appropriate condition. 16872 - 16873 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 16874 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1585h + 16873 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 16874 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:144Fh 16875 - 16876 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 16877 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1667h - 16878 - 16879 FindFirst: - 16880 ;mov ax,offset TRANGROUP:GetFirst - 16881 000015F8 B8[CF16] mov ax,GetFirst - 16882 000015FB EB03 jmp short ffFindEntry - 16883 - 16884 ; 18/02/2023 - 16885 FindNext: - 16886 ;mov ax,offset TRANGROUP:GetNext - 16887 000015FD B8[DD16] mov ax,GetNext - 16888 - 16889 ; AX = address of correct disk get routine to use. - 16890 - 16891 ffFindEntry: - 16892 00001600 06 push es ; save TRANGROUP seg addr - 16893 ;;;test Bits,mask inmem - 16894 ;;test word [_Bits],20h - 16895 ;test byte [_Bits],20h - 16896 ; 07/06/2023 - 16897 00001601 F606[8B9D]80 test byte [_Bits],mask.inmem ; 40h ; MSDOS 6.0 - 16898 ; 31/07/2024 ; 80h ; PCDOS 7.1 - 16899 00001606 7405 jz short ffDisk ; entries not in memory, search disk - 16900 - 16901 ; Entries are loaded in memory to sort out. Find the first one. - 16902 ; There will always be one, or LoadEntries would've failed. + 16876 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 16877 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1585h + 16878 + 16879 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 16880 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1667h + 16881 + 16882 FindFirst: + 16883 ;mov ax,offset TRANGROUP:GetFirst + 16884 000015F8 B8[CF16] mov ax,GetFirst + 16885 000015FB EB03 jmp short ffFindEntry + 16886 + 16887 ; 18/02/2023 + 16888 FindNext: + 16889 ;mov ax,offset TRANGROUP:GetNext + 16890 000015FD B8[DD16] mov ax,GetNext + 16891 + 16892 ; AX = address of correct disk get routine to use. + 16893 + 16894 ffFindEntry: + 16895 00001600 06 push es ; save TRANGROUP seg addr + 16896 ;;;test Bits,mask inmem + 16897 ;;test word [_Bits],20h + 16898 ;test byte [_Bits],20h + 16899 ; 07/06/2023 + 16900 00001601 F606[8B9D]80 test byte [_Bits],mask.inmem ; 40h ; MSDOS 6.0 + 16901 ; 31/07/2024 ; 80h ; PCDOS 7.1 + 16902 00001606 7405 jz short ffDisk ; entries not in memory, search disk 16903 - 16904 00001608 E81A00 call FindInMem ; find first entry in TPA - 16905 0000160B EB16 jmp short ffRet ; return what TPA search returns + 16904 ; Entries are loaded in memory to sort out. Find the first one. + 16905 ; There will always be one, or LoadEntries would've failed. 16906 - 16907 ; Get entry from disk. - 16908 - 16909 ffDisk: - 16910 0000160D FFD0 call ax ; get entry from disk - 16911 0000160F 720E jc short ffGetErr ; get & return error - 16912 00001611 8E06[F79B] mov es,[TPA] ; ES = seg addr of TPA - 16913 00001615 31FF xor di,di ; ES:DI = ptr to TPA - 16914 00001617 89FB mov bx,di ; BX = offset of entry in TPA - 16915 00001619 E85C01 call LoadEntry ; load entry to TPA - 16916 0000161C F8 clc ; return success - 16917 0000161D EB04 jmp short ffRet - 16918 - 16919 ffGetErr: - 16920 0000161F E8290A call get_ext_error_number ; AX = DOS error code - 16921 00001622 F9 stc - 16922 ffRet: - 16923 00001623 07 pop es ; ES = TRANGROUP seg addr again - 16924 00001624 C3 retn - 16925 - 16926 ; --------------------------------------------------------------------------- - 16927 - 16928 ;*** FindInMem - find next directory entry in TPA buffer - 16929 ; - 16930 ; ENTRY TPA is loaded (see LoadEntries) - 16931 ; - 16932 ; EXIT BX = offset in TPA of entry found - 16933 ; - 16934 ; If no more files, - 16935 ; CY = set - 16936 ; AX = DOS 'no more files' error code - 16937 ; - 16938 ; USED AX,BX,CX,DX,SI,DI,BP,ES - 16939 ; - 16940 ; EFFECTS - 16941 ; - 16942 ; Entry found is flagged as 'used' (see EntryStruc). - 16943 - 16944 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 16945 FindInMem: - 16946 00001625 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr - 16947 00001629 31DB xor bx,bx ; ES:BX = ptr to 1st entry in TPA - 16948 0000162B FC cld ; make sure default string direction is up - 16949 - 16950 0000162C E86D00 call FindOneInMem ; locate an entry - 16951 0000162F 720E jc short fiNoMore ; none left, set up 'no more files' error - 16952 - 16953 ; BX = ptr to entry in TPA - 16954 - 16955 fiBest: - 16956 00001631 89DD mov bp,bx ; BP = ptr to best entry so far - 16957 fiNext: - 16958 00001633 E87300 call FindNextInMem ; locate next entry - 16959 00001636 720C jc short fiFound ; no more, best entry so far wins - 16960 - 16961 ; BX = ptr to next entry - 16962 - 16963 00001638 E8F5FD call CmpEntry ; compare it to best found so far (BP) - 16964 0000163B 73F6 jnb short fiNext ; it's not better, go look at next one - 16965 0000163D EBF2 jmp short fiBest ; it's better, go mark it as best so far - 16966 - 16967 fiNoMore: - 16968 - 16969 ; No more entries available in TPA. Set up 'no more files' error. - 16970 - 16971 ;mov ax,18 - 16972 0000163F B81200 mov ax,ERROR_NO_MORE_FILES ; AX = 'no more files' error code - 16973 00001642 F9 stc ; return error - 16974 ;jmp short fiRet - 16975 ; 18/02/2023 - 16976 00001643 C3 retn - 16977 - 16978 fiFound: - 16979 00001644 89EB mov bx,bp ; BX = ptr to best entry found - 16980 00001646 26C60701 mov byte [es:bx],1 ; mark entry 'used' - 16981 0000164A F8 clc ; return success - 16982 fiRet: - 16983 0000164B C3 retn - 16984 - 16985 ; --------------------------------------------------------------------------- - 16986 - 16987 ;*** FindNextChild - find next subdirectory in current directory - 16988 ; - 16989 ; ENTRY BX = ptr to last child found, ASCIIZ filename - 16990 ; DirBuf is established DTA + 16907 00001608 E81A00 call FindInMem ; find first entry in TPA + 16908 0000160B EB16 jmp short ffRet ; return what TPA search returns + 16909 + 16910 ; Get entry from disk. + 16911 + 16912 ffDisk: + 16913 0000160D FFD0 call ax ; get entry from disk + 16914 0000160F 720E jc short ffGetErr ; get & return error + 16915 00001611 8E06[F79B] mov es,[TPA] ; ES = seg addr of TPA + 16916 00001615 31FF xor di,di ; ES:DI = ptr to TPA + 16917 00001617 89FB mov bx,di ; BX = offset of entry in TPA + 16918 00001619 E85C01 call LoadEntry ; load entry to TPA + 16919 0000161C F8 clc ; return success + 16920 0000161D EB04 jmp short ffRet + 16921 + 16922 ffGetErr: + 16923 0000161F E8290A call get_ext_error_number ; AX = DOS error code + 16924 00001622 F9 stc + 16925 ffRet: + 16926 00001623 07 pop es ; ES = TRANGROUP seg addr again + 16927 00001624 C3 retn + 16928 + 16929 ; --------------------------------------------------------------------------- + 16930 + 16931 ;*** FindInMem - find next directory entry in TPA buffer + 16932 ; + 16933 ; ENTRY TPA is loaded (see LoadEntries) + 16934 ; + 16935 ; EXIT BX = offset in TPA of entry found + 16936 ; + 16937 ; If no more files, + 16938 ; CY = set + 16939 ; AX = DOS 'no more files' error code + 16940 ; + 16941 ; USED AX,BX,CX,DX,SI,DI,BP,ES + 16942 ; + 16943 ; EFFECTS + 16944 ; + 16945 ; Entry found is flagged as 'used' (see EntryStruc). + 16946 + 16947 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 16948 FindInMem: + 16949 00001625 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr + 16950 00001629 31DB xor bx,bx ; ES:BX = ptr to 1st entry in TPA + 16951 0000162B FC cld ; make sure default string direction is up + 16952 + 16953 0000162C E86D00 call FindOneInMem ; locate an entry + 16954 0000162F 720E jc short fiNoMore ; none left, set up 'no more files' error + 16955 + 16956 ; BX = ptr to entry in TPA + 16957 + 16958 fiBest: + 16959 00001631 89DD mov bp,bx ; BP = ptr to best entry so far + 16960 fiNext: + 16961 00001633 E87300 call FindNextInMem ; locate next entry + 16962 00001636 720C jc short fiFound ; no more, best entry so far wins + 16963 + 16964 ; BX = ptr to next entry + 16965 + 16966 00001638 E8F5FD call CmpEntry ; compare it to best found so far (BP) + 16967 0000163B 73F6 jnb short fiNext ; it's not better, go look at next one + 16968 0000163D EBF2 jmp short fiBest ; it's better, go mark it as best so far + 16969 + 16970 fiNoMore: + 16971 + 16972 ; No more entries available in TPA. Set up 'no more files' error. + 16973 + 16974 ;mov ax,18 + 16975 0000163F B81200 mov ax,ERROR_NO_MORE_FILES ; AX = 'no more files' error code + 16976 00001642 F9 stc ; return error + 16977 ;jmp short fiRet + 16978 ; 18/02/2023 + 16979 00001643 C3 retn + 16980 + 16981 fiFound: + 16982 00001644 89EB mov bx,bp ; BX = ptr to best entry found + 16983 00001646 26C60701 mov byte [es:bx],1 ; mark entry 'used' + 16984 0000164A F8 clc ; return success + 16985 fiRet: + 16986 0000164B C3 retn + 16987 + 16988 ; --------------------------------------------------------------------------- + 16989 + 16990 ;*** FindNextChild - find next subdirectory in current directory 16991 ; - 16992 ; EXIT BX = ptr (same addr) to next child found, ASCIIZ filename - 16993 ; - 16994 ; If failure, - 16995 ; CY = set - 16996 ; DOS Get Extended Error call will get error - 16997 ; - 16998 ; USED AX,CX,DX,SI,DI,BP - 16999 ; - 17000 ; EFFECTS - 17001 ; - 17002 ; DirBuf is used for find first/next calls. - 17003 ; - 17004 ; NOTES - 17005 ; - 17006 ; We keep on checking files until DOS returns an error. If - 17007 ; the error is 'no more files' and the temp filename is not - 17008 ; the initial high tag, copy the temp to the child's name spot - 17009 ; and return success. Otherwise, send the error back to caller. - 17010 ; - 17011 ; This routine depends on DS,ES,CS, & SS all being equal. - 17012 - 17013 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17014 FindNextChild: - 17015 0000164C 83EC0C sub sp,12 ; make temp filename buf on stack - 17016 ;shove 00FFh ; temp filename = high tag - 17017 0000164F B8FF00 mov ax,0FFh - 17018 00001652 50 push ax - 17019 00001653 89E5 mov bp,sp ; BP = ptr to temp filename buf - 17020 ;shove "*" - 17021 00001655 B02A mov al,'*' ; ax = 002Ah - 17022 00001657 50 push ax - 17023 ;;shove ".*" - 17024 ;mov ax,"*." - 17025 ;mov ax,2E2Ah - 17026 00001658 B42E mov ah,'.' - 17027 0000165A 50 push ax - 17028 0000165B E83106 call GetDriveLtr ; AX = "d:" - 17029 0000165E 50 push ax - 17030 0000165F 89E2 mov dx,sp ; DX = ptr to "d:*.*",0 on stack - 17031 - 17032 ; See that the stack is restored properly at the end of this proc. - 17033 - 17034 ;mov cx,10h - 17035 00001661 B91000 mov cx,ATTR_DIRECTORY ; CX = attributes for file search - 17036 00001664 B44E mov ah,4Eh - 17037 ;mov ah,Find_First - 17038 00001666 CD21 int 21h ; DOS- Find First matching file - 17039 00001668 722C jc short fcRet ; return error - 17040 - 17041 0000166A E89EFD call CheckChild ; check child against last, temp - 17042 fcNext: - 17043 ;mov cx,10h - 17044 0000166D B91000 mov cx,ATTR_DIRECTORY ; CX = attributes for file search - 17045 00001670 B44F mov ah,4Fh - 17046 ;mov ah,Find_Next - 17047 00001672 CD21 int 21h ; DOS- Find Next matching file - 17048 00001674 7205 jc short fcErr ; examine error - 17049 - 17050 00001676 E892FD call CheckChild ; check child against last, temp - 17051 00001679 EBF2 jmp short fcNext ; go find another child + 16992 ; ENTRY BX = ptr to last child found, ASCIIZ filename + 16993 ; DirBuf is established DTA + 16994 ; + 16995 ; EXIT BX = ptr (same addr) to next child found, ASCIIZ filename + 16996 ; + 16997 ; If failure, + 16998 ; CY = set + 16999 ; DOS Get Extended Error call will get error + 17000 ; + 17001 ; USED AX,CX,DX,SI,DI,BP + 17002 ; + 17003 ; EFFECTS + 17004 ; + 17005 ; DirBuf is used for find first/next calls. + 17006 ; + 17007 ; NOTES + 17008 ; + 17009 ; We keep on checking files until DOS returns an error. If + 17010 ; the error is 'no more files' and the temp filename is not + 17011 ; the initial high tag, copy the temp to the child's name spot + 17012 ; and return success. Otherwise, send the error back to caller. + 17013 ; + 17014 ; This routine depends on DS,ES,CS, & SS all being equal. + 17015 + 17016 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17017 FindNextChild: + 17018 0000164C 83EC0C sub sp,12 ; make temp filename buf on stack + 17019 ;shove 00FFh ; temp filename = high tag + 17020 0000164F B8FF00 mov ax,0FFh + 17021 00001652 50 push ax + 17022 00001653 89E5 mov bp,sp ; BP = ptr to temp filename buf + 17023 ;shove "*" + 17024 00001655 B02A mov al,'*' ; ax = 002Ah + 17025 00001657 50 push ax + 17026 ;;shove ".*" + 17027 ;mov ax,"*." + 17028 ;mov ax,2E2Ah + 17029 00001658 B42E mov ah,'.' + 17030 0000165A 50 push ax + 17031 0000165B E83106 call GetDriveLtr ; AX = "d:" + 17032 0000165E 50 push ax + 17033 0000165F 89E2 mov dx,sp ; DX = ptr to "d:*.*",0 on stack + 17034 + 17035 ; See that the stack is restored properly at the end of this proc. + 17036 + 17037 ;mov cx,10h + 17038 00001661 B91000 mov cx,ATTR_DIRECTORY ; CX = attributes for file search + 17039 00001664 B44E mov ah,4Eh + 17040 ;mov ah,Find_First + 17041 00001666 CD21 int 21h ; DOS- Find First matching file + 17042 00001668 722C jc short fcRet ; return error + 17043 + 17044 0000166A E89EFD call CheckChild ; check child against last, temp + 17045 fcNext: + 17046 ;mov cx,10h + 17047 0000166D B91000 mov cx,ATTR_DIRECTORY ; CX = attributes for file search + 17048 00001670 B44F mov ah,4Fh + 17049 ;mov ah,Find_Next + 17050 00001672 CD21 int 21h ; DOS- Find Next matching file + 17051 00001674 7205 jc short fcErr ; examine error 17052 - 17053 fcErr: - 17054 0000167B E8CD09 call get_ext_error_number ; AX = extended error code - 17055 ;cmp ax,18 - 17056 0000167E 83F812 cmp ax,ERROR_NO_MORE_FILES ; no more files? - 17057 00001681 7512 jne short fcNope ; some other error- return it - 17058 - 17059 ; We ran out of files. See if we qualified at least one. - 17060 - 17061 00001683 807E00FF cmp byte [bp],0FFh - 17062 00001687 740C je short fcNope ; temp filename is unused- no child + 17053 00001676 E892FD call CheckChild ; check child against last, temp + 17054 00001679 EBF2 jmp short fcNext ; go find another child + 17055 + 17056 fcErr: + 17057 0000167B E8CD09 call get_ext_error_number ; AX = extended error code + 17058 ;cmp ax,18 + 17059 0000167E 83F812 cmp ax,ERROR_NO_MORE_FILES ; no more files? + 17060 00001681 7512 jne short fcNope ; some other error- return it + 17061 + 17062 ; We ran out of files. See if we qualified at least one. 17063 - 17064 ; Move temp filename to child name position. - 17065 - 17066 00001689 89EE mov si,bp ; SI = ptr to temp filename - 17067 0000168B 89DF mov di,bx ; DI = ptr to child name pos'n - 17068 fcMove: - 17069 0000168D AC lodsb ; AL = next byte of filename - 17070 0000168E AA stosb ; store byte - 17071 0000168F 08C0 or al,al - 17072 00001691 7403 jz short fcRet ; byte was zero, return success (CY clear) - 17073 00001693 EBF8 jmp short fcMove ; go move another byte - 17074 fcNope: - 17075 00001695 F9 stc ; return error - 17076 fcRet: - 17077 00001696 9F lahf - 17078 00001697 83C414 add sp,20 ; restore stack - 17079 0000169A 9E sahf - 17080 0000169B C3 retn - 17081 - 17082 ; --------------------------------------------------------------------------- - 17083 - 17084 ;*** FindOneInMem - find the first available entry in TPA - 17085 ;*** FindNextInMem - find the next available entry in TPA - 17086 ; - 17087 ; ENTRY ES = TPA seg addr - 17088 ; BX = ptr to entry in TPA + 17064 00001683 807E00FF cmp byte [bp],0FFh + 17065 00001687 740C je short fcNope ; temp filename is unused- no child + 17066 + 17067 ; Move temp filename to child name position. + 17068 + 17069 00001689 89EE mov si,bp ; SI = ptr to temp filename + 17070 0000168B 89DF mov di,bx ; DI = ptr to child name pos'n + 17071 fcMove: + 17072 0000168D AC lodsb ; AL = next byte of filename + 17073 0000168E AA stosb ; store byte + 17074 0000168F 08C0 or al,al + 17075 00001691 7403 jz short fcRet ; byte was zero, return success (CY clear) + 17076 00001693 EBF8 jmp short fcMove ; go move another byte + 17077 fcNope: + 17078 00001695 F9 stc ; return error + 17079 fcRet: + 17080 00001696 9F lahf + 17081 00001697 83C414 add sp,20 ; restore stack + 17082 0000169A 9E sahf + 17083 0000169B C3 retn + 17084 + 17085 ; --------------------------------------------------------------------------- + 17086 + 17087 ;*** FindOneInMem - find the first available entry in TPA + 17088 ;*** FindNextInMem - find the next available entry in TPA 17089 ; - 17090 ; EXIT BX = ptr to entry found - 17091 ; CY = set if no more entries available in TPA + 17090 ; ENTRY ES = TPA seg addr + 17091 ; BX = ptr to entry in TPA 17092 ; - 17093 ; USED AL - 17094 - 17095 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17096 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 17097 FindOneInMem: - 17098 0000169C 268A07 mov al,[es:bx] ; examine 'used' byte of starting entry - 17099 0000169F 3C01 cmp al,1 - 17100 000016A1 7406 je short FindNextInMem ; entry has already been used - 17101 000016A3 3CFF cmp al,0FFh - 17102 000016A5 7407 je short foNoMore ; 0FFh, we're at the end of the list - 17103 - 17104 ; BX = ptr to entry that hasn't been output yet. - 17105 - 17106 000016A7 F8 clc ; return success - 17107 000016A8 C3 retn + 17093 ; EXIT BX = ptr to entry found + 17094 ; CY = set if no more entries available in TPA + 17095 ; + 17096 ; USED AL + 17097 + 17098 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17099 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 17100 FindOneInMem: + 17101 0000169C 268A07 mov al,[es:bx] ; examine 'used' byte of starting entry + 17102 0000169F 3C01 cmp al,1 + 17103 000016A1 7406 je short FindNextInMem ; entry has already been used + 17104 000016A3 3CFF cmp al,0FFh + 17105 000016A5 7407 je short foNoMore ; 0FFh, we're at the end of the list + 17106 + 17107 ; BX = ptr to entry that hasn't been output yet. 17108 - 17109 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 17110 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:163Ah - 17111 FindNextInMem: - 17112 ; 07/06/2023 - 17113 ;add bx,21 ; MSDOS 5.0 - 17114 ; 07/06/2023 - 17115 000016A9 83C316 add bx,22 ; MSDOS 6.0 ; size EntryStruc (22 = 21 + compratio) - 17116 ;add bx,size EntryStruc ; BX = ptr to next entry - 17117 000016AC EBEE jmp short FindOneInMem ; go look at it - 17118 foNoMore: - 17119 000016AE F9 stc ; ran out of entries, return failure - 17120 000016AF C3 retn - 17121 - 17122 ; --------------------------------------------------------------------------- - 17123 - 17124 ;*** GetEnvValue - get value of our environment variable - 17125 ; - 17126 ; ENTRY DS, ES = TRANGROUP seg addr - 17127 ; - 17128 ; EXIT CY = set if environment variable not in environment - 17129 ; - 17130 ; Otherwise: - 17131 ; SI = ptr to environment variable asciiz value in TRANGROUP + 17109 000016A7 F8 clc ; return success + 17110 000016A8 C3 retn + 17111 + 17112 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 17113 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:163Ah + 17114 FindNextInMem: + 17115 ; 07/06/2023 + 17116 ;add bx,21 ; MSDOS 5.0 + 17117 ; 07/06/2023 + 17118 000016A9 83C316 add bx,22 ; MSDOS 6.0 ; size EntryStruc (22 = 21 + compratio) + 17119 ;add bx,size EntryStruc ; BX = ptr to next entry + 17120 000016AC EBEE jmp short FindOneInMem ; go look at it + 17121 foNoMore: + 17122 000016AE F9 stc ; ran out of entries, return failure + 17123 000016AF C3 retn + 17124 + 17125 ; --------------------------------------------------------------------------- + 17126 + 17127 ;*** GetEnvValue - get value of our environment variable + 17128 ; + 17129 ; ENTRY DS, ES = TRANGROUP seg addr + 17130 ; + 17131 ; EXIT CY = set if environment variable not in environment 17132 ; - 17133 ; USED AX,BX,CX,DX,DI - 17134 ; (We assume the (almost) worst, since we don't know about - 17135 ; Find_Name_In_Environment.) - 17136 ; - 17137 ; EFFECTS - 17138 ; - 17139 ; ScanBuf is loaded with value text - 17140 - 17141 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17142 GetEnvValue: - 17143 000016B0 06 push es ; save ES - 17144 ;mov si,offset TRANGROUP:DirEnvVar ; DS:SI = ptr to variable name - 17145 000016B1 BE[0593] mov si,DirEnvVar ; "DIRCMD=" - 17146 ;invoke Find_Name_In_Environment - 17147 000016B4 E80010 call find_name_in_environment - 17148 000016B7 7214 jc short geRet ; name not found in environment - 17149 - 17150 ; ES:DI = ptr to value of environment variable - 17151 ; We're assuming DS, CS, and SS are unchanged. + 17133 ; Otherwise: + 17134 ; SI = ptr to environment variable asciiz value in TRANGROUP + 17135 ; + 17136 ; USED AX,BX,CX,DX,DI + 17137 ; (We assume the (almost) worst, since we don't know about + 17138 ; Find_Name_In_Environment.) + 17139 ; + 17140 ; EFFECTS + 17141 ; + 17142 ; ScanBuf is loaded with value text + 17143 + 17144 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17145 GetEnvValue: + 17146 000016B0 06 push es ; save ES + 17147 ;mov si,offset TRANGROUP:DirEnvVar ; DS:SI = ptr to variable name + 17148 000016B1 BE[0593] mov si,DirEnvVar ; "DIRCMD=" + 17149 ;invoke Find_Name_In_Environment + 17150 000016B4 E80010 call find_name_in_environment + 17151 000016B7 7214 jc short geRet ; name not found in environment 17152 - 17153 000016B9 1E push ds - 17154 000016BA 06 push es - 17155 000016BB 1F pop ds - 17156 000016BC 07 pop es - 17157 - 17158 ;assume ds:nothing - 17159 - 17160 ; DS = seg addr of environment variable value (in environment segment) - 17161 ; ES = TRANGROUP seg addr + 17153 ; ES:DI = ptr to value of environment variable + 17154 ; We're assuming DS, CS, and SS are unchanged. + 17155 + 17156 000016B9 1E push ds + 17157 000016BA 06 push es + 17158 000016BB 1F pop ds + 17159 000016BC 07 pop es + 17160 + 17161 ;assume ds:nothing 17162 - 17163 000016BD 89FE mov si,di ; DS:SI = ptr to value string - 17164 ;mov di,offset TRANGROUP:ScanBuf ; ES:DI = ptr to dest buffer - 17165 000016BF BF[7B9E] mov di,ScanBuf - 17166 geLoop: - 17167 ;@@: - 17168 000016C2 AC lodsb - 17169 000016C3 08C0 or al,al - 17170 000016C5 AA stosb - 17171 ;loopnz @B ; move the string, including trailing null - 17172 000016C6 E0FA loopnz geLoop - 17173 - 17174 000016C8 06 push es - 17175 000016C9 1F pop ds ; DS = TRANGROUP seg addr again - 17176 ;assume ds:TRANGROUP - 17177 - 17178 ;mov si,offset TRANGROUP:ScanBuf ; SI = ptr to var value - 17179 000016CA BE[7B9E] mov si,ScanBuf - 17180 geRet: - 17181 000016CD 07 pop es ; restore ES - 17182 000016CE C3 retn - 17183 - 17184 ; --------------------------------------------------------------------------- - 17185 - 17186 ;*** GetFirst - get first directory entry from disk - 17187 ; - 17188 ; ENTRY DOS DTA established at DirBuf - 17189 ; FCB contains drive # and filename - 17190 ; Current directory (on selected drive) is the one to search - 17191 ; AttrSpecified & AttrSelect masks set - 17192 ; - 17193 ; EXIT CY = clear if success - 17194 ; DirBuf contains extended FCB for file found + 17163 ; DS = seg addr of environment variable value (in environment segment) + 17164 ; ES = TRANGROUP seg addr + 17165 + 17166 000016BD 89FE mov si,di ; DS:SI = ptr to value string + 17167 ;mov di,offset TRANGROUP:ScanBuf ; ES:DI = ptr to dest buffer + 17168 000016BF BF[7B9E] mov di,ScanBuf + 17169 geLoop: + 17170 ;@@: + 17171 000016C2 AC lodsb + 17172 000016C3 08C0 or al,al + 17173 000016C5 AA stosb + 17174 ;loopnz @B ; move the string, including trailing null + 17175 000016C6 E0FA loopnz geLoop + 17176 + 17177 000016C8 06 push es + 17178 000016C9 1F pop ds ; DS = TRANGROUP seg addr again + 17179 ;assume ds:TRANGROUP + 17180 + 17181 ;mov si,offset TRANGROUP:ScanBuf ; SI = ptr to var value + 17182 000016CA BE[7B9E] mov si,ScanBuf + 17183 geRet: + 17184 000016CD 07 pop es ; restore ES + 17185 000016CE C3 retn + 17186 + 17187 ; --------------------------------------------------------------------------- + 17188 + 17189 ;*** GetFirst - get first directory entry from disk + 17190 ; + 17191 ; ENTRY DOS DTA established at DirBuf + 17192 ; FCB contains drive # and filename + 17193 ; Current directory (on selected drive) is the one to search + 17194 ; AttrSpecified & AttrSelect masks set 17195 ; - 17196 ; If unsuccessful, - 17197 ; CY = set - 17198 ; Ready for DOS Get Extended Error call - 17199 ; - 17200 ; USED AX,DX - 17201 ; - 17202 ; EFFECTS - 17203 ; - 17204 ; FCB-7 = 0FFh to mark extended FCB - 17205 ; FCB-1 = attribute mask to find all files - 17206 ; These fields should remain unmodified for GetNext calls. - 17207 ; - 17208 ;*** GetNext - get next directory entry from disk - 17209 ; - 17210 ; ENTRY As for GetFirst, plus - 17211 ; FCB-7 set up as extended FCB w/ find-all attribute byte + 17196 ; EXIT CY = clear if success + 17197 ; DirBuf contains extended FCB for file found + 17198 ; + 17199 ; If unsuccessful, + 17200 ; CY = set + 17201 ; Ready for DOS Get Extended Error call + 17202 ; + 17203 ; USED AX,DX + 17204 ; + 17205 ; EFFECTS + 17206 ; + 17207 ; FCB-7 = 0FFh to mark extended FCB + 17208 ; FCB-1 = attribute mask to find all files + 17209 ; These fields should remain unmodified for GetNext calls. + 17210 ; + 17211 ;*** GetNext - get next directory entry from disk 17212 ; - 17213 ; EXIT As for GetFirst - 17214 ; - 17215 ; USED AX,DX - 17216 - 17217 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17218 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:144Fh + 17213 ; ENTRY As for GetFirst, plus + 17214 ; FCB-7 set up as extended FCB w/ find-all attribute byte + 17215 ; + 17216 ; EXIT As for GetFirst + 17217 ; + 17218 ; USED AX,DX 17219 - 17220 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 17221 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1660h - 17222 GetFirst: - 17223 ;mov byte [55h],0FFh ; -1 - 17224 000016CF C6065500FF mov byte [FCB-7],0FFh ; signal extended FCB - 17225 ;mov byte [5Bh],16h - 17226 000016D4 C6065B0016 mov byte [FCB-1],ATTR_ALL ; 16h - 17227 ; find any file - 17228 ; 07/06/2023 - 17229 ;mov dx,FCB-7 ; 55h ; DX = ptr to extended FCB - 17230 000016D9 B411 mov ah,11h - 17231 ;mov ah,Dir_Search_First ; AH = DOS Find First function code - 17232 ; 07/06/2023 - 17233 ;int 21h ; call DOS - 17234 ;shl al,1 ; CY = set if error - 17235 ;jc short gfRet ; return error - 17236 ;jmp short gfFound ; go look at attr's - 17237 ; 07/06/2023 - 17238 000016DB EB02 jmp short GetFrstNxt - 17239 GetNext: + 17220 ; 18/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17221 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:144Fh + 17222 + 17223 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 17224 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1660h + 17225 GetFirst: + 17226 ;mov byte [55h],0FFh ; -1 + 17227 000016CF C6065500FF mov byte [FCB-7],0FFh ; signal extended FCB + 17228 ;mov byte [5Bh],16h + 17229 000016D4 C6065B0016 mov byte [FCB-1],ATTR_ALL ; 16h + 17230 ; find any file + 17231 ; 07/06/2023 + 17232 ;mov dx,FCB-7 ; 55h ; DX = ptr to extended FCB + 17233 000016D9 B411 mov ah,11h + 17234 ;mov ah,Dir_Search_First ; AH = DOS Find First function code + 17235 ; 07/06/2023 + 17236 ;int 21h ; call DOS + 17237 ;shl al,1 ; CY = set if error + 17238 ;jc short gfRet ; return error + 17239 ;jmp short gfFound ; go look at attr's 17240 ; 07/06/2023 - 17241 ;;mov dx,55h - 17242 ;mov dx,FCB-7 ; DX = ptr to extended FCB - 17243 000016DD B412 mov ah,12h - 17244 ;mov ah,Dir_Search_Next ; AH = DOS Find Next function code - 17245 GetFrstNxt: - 17246 ; 07/06/2023 - 17247 000016DF BA5500 mov dx,FCB-7 ; mov dx,55h - 17248 ; - 17249 000016E2 CD21 int 21h ; call DOS - 17250 000016E4 D0E0 shl al,1 ; CY = set if error - 17251 000016E6 7211 jc short gfRet ; return error - 17252 - 17253 ;* Found an entry. Check attributes. - 17254 gfFound: - 17255 ;;mov al,[DirBuf+8].dir_attr ; AL = file attributes - 17256 ;mov al,[DIRBUF+19] - 17257 000016E8 A0[4C9D] mov al,[DIRBUF+8+DIR_ENTRY.DIR_ATTR] - 17258 000016EB 8A26[939D] mov ah,[AttrSpecified] ; AH = mask of pertinent attr's - 17259 000016EF 20E0 and al,ah ; AL = pertinent attr's of file - 17260 000016F1 2226[949D] and ah,[AttrSelect] ; AH = attr settings to match - 17261 000016F5 38E0 cmp al,ah - 17262 000016F7 75E4 jne short GetNext ; attr's don't match, look for another - 17263 gfRet: - 17264 000016F9 C3 retn - 17265 - 17266 ; --------------------------------------------------------------------------- - 17267 - 17268 ;*** ListDir - search for and list files in the current directory - 17269 ; - 17270 ; List header, files, and trailer for current directory on selected - 17271 ; drive. Header & trailer are listed if at least one file is found. - 17272 ; If no qualifying files are found, no display output occurs. - 17273 ; - 17274 ; ENTRY Current directory (on selected drive) is the one to be listed - 17275 ; FCB contains selected drive # and filename spec - 17276 ; Option bits, attribute masks, and sort codes set up - 17277 ; - 17278 ; EXIT CY = clear if no error - 17279 ; FileCnt = # files found & displayed + 17241 000016DB EB02 jmp short GetFrstNxt + 17242 GetNext: + 17243 ; 07/06/2023 + 17244 ;;mov dx,55h + 17245 ;mov dx,FCB-7 ; DX = ptr to extended FCB + 17246 000016DD B412 mov ah,12h + 17247 ;mov ah,Dir_Search_Next ; AH = DOS Find Next function code + 17248 GetFrstNxt: + 17249 ; 07/06/2023 + 17250 000016DF BA5500 mov dx,FCB-7 ; mov dx,55h + 17251 ; + 17252 000016E2 CD21 int 21h ; call DOS + 17253 000016E4 D0E0 shl al,1 ; CY = set if error + 17254 000016E6 7211 jc short gfRet ; return error + 17255 + 17256 ;* Found an entry. Check attributes. + 17257 gfFound: + 17258 ;;mov al,[DirBuf+8].dir_attr ; AL = file attributes + 17259 ;mov al,[DIRBUF+19] + 17260 000016E8 A0[4C9D] mov al,[DIRBUF+8+DIR_ENTRY.DIR_ATTR] + 17261 000016EB 8A26[939D] mov ah,[AttrSpecified] ; AH = mask of pertinent attr's + 17262 000016EF 20E0 and al,ah ; AL = pertinent attr's of file + 17263 000016F1 2226[949D] and ah,[AttrSelect] ; AH = attr settings to match + 17264 000016F5 38E0 cmp al,ah + 17265 000016F7 75E4 jne short GetNext ; attr's don't match, look for another + 17266 gfRet: + 17267 000016F9 C3 retn + 17268 + 17269 ; --------------------------------------------------------------------------- + 17270 + 17271 ;*** ListDir - search for and list files in the current directory + 17272 ; + 17273 ; List header, files, and trailer for current directory on selected + 17274 ; drive. Header & trailer are listed if at least one file is found. + 17275 ; If no qualifying files are found, no display output occurs. + 17276 ; + 17277 ; ENTRY Current directory (on selected drive) is the one to be listed + 17278 ; FCB contains selected drive # and filename spec + 17279 ; Option bits, attribute masks, and sort codes set up 17280 ; - 17281 ; If error, - 17282 ; CY = set - 17283 ; Ready for DOS Get Extended Error call - 17284 ; - 17285 ; USED AX,BX,CX,DX,SI,DI,BP - 17286 ; FileSiz + 17281 ; EXIT CY = clear if no error + 17282 ; FileCnt = # files found & displayed + 17283 ; + 17284 ; If error, + 17285 ; CY = set + 17286 ; Ready for DOS Get Extended Error call 17287 ; - 17288 ; EFFECTS - 17289 ; - 17290 ; FileCntTotal, FileSizTotal are updated. - 17291 ; Files found are listed. A directory header and trailer are - 17292 ; displayed only if files are found. - 17293 - 17294 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17295 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:155Eh + 17288 ; USED AX,BX,CX,DX,SI,DI,BP + 17289 ; FileSiz + 17290 ; + 17291 ; EFFECTS + 17292 ; + 17293 ; FileCntTotal, FileSizTotal are updated. + 17294 ; Files found are listed. A directory header and trailer are + 17295 ; displayed only if files are found. 17296 - 17297 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 17298 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1694h + 17297 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17298 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:155Eh 17299 - 17300 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 17301 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1776h - 17302 ListDir: - 17303 000016FA 31C0 xor ax,ax ; 0 - 17304 000016FC A3[209C] mov [FileCnt],ax ; zero file count - 17305 000016FF A3[229C] mov [FileSiz],ax ; zero file size accumulator - 17306 00001702 A3[249C] mov [FileSiz+2],ax - 17307 - 17308 ; 31/07/2024 - 17309 ; PCDOS 7.1 COMMAND.COM - 17310 %if 1 - 17311 00001705 A3[269C] mov [FileSiz+4],ax - 17312 00001708 A3[289C] mov [FileSiz+6],ax - 17313 %else - 17314 ; 08/06/2023 - 17315 ; MSDOS 6.0 - 17316 ;ifdef DBLSPACE_HOOKS - 17317 mov [ccluUsedDir],ax ; zero count clusters used - 17318 mov [csecUsedDir],ax ; zero count compressed sectors used - 17319 mov [csecUsedDir+2],ax - 17320 ;endif - 17321 %endif - 17322 ;cmp byte [DestBuf],0 ; check for sort code - 17323 ; 31/07/2024 - 17324 0000170B 3806[BE9D] cmp [DestBuf],al ; 0 - 17325 0000170F 740A je short ld1 ; no sort - 17326 00001711 E83000 call LoadEntries ; load entries for sorted listing - 17327 00001714 7305 jnc short ld1 ; no error - continue - 17328 00001716 E83209 call get_ext_error_number ; AX = DOS error code - 17329 ; 19/02/2023 - 17330 ;stc - 17331 00001719 EB12 jmp short ldErr ; return error - 17332 ld1: - 17333 0000171B E8DAFE call FindFirst ; find first file - 17334 0000171E 720D jc short ldErr ; not found, return error - 17335 - 17336 ; BX = offset in TPA buffer of entry found - 17337 - 17338 00001720 E82203 call DisplayHeader ; if at least one file, display header - 17339 ldNext: - 17340 00001723 E8FA02 call DisplayFile ; display the file entry - 17341 ;ldNext: - 17342 00001726 E8D4FE call FindNext ; find another file - 17343 00001729 7202 jc short ldErr ; not found - 17344 ;call DisplayFile ; display entry - 17345 ;jmp short ldNext ; go find another one - 17346 ; 19/02/2023 - 17347 0000172B EBF6 jmp short ldNext - 17348 ldErr: - 17349 ;cmp ax,2 - 17350 0000172D 83F802 cmp ax,ERROR_FILE_NOT_FOUND - 17351 00001730 7407 je short ldDone ; file not found, we're done - 17352 ;cmp ax,18 - 17353 00001732 83F812 cmp ax,ERROR_NO_MORE_FILES - 17354 00001735 7402 je short ldDone ; no more files, we're done - 17355 00001737 F9 stc - 17356 ;jmp short ldRet - 17357 ; 19/02/2023 - 17358 00001738 C3 retn - 17359 ldDone: - 17360 00001739 833E[209C]00 cmp word [FileCnt],0 - 17361 ;je short ld2 ; no files found, just return - 17362 ; 25/04/2023 - 17363 0000173E 7403 jz short ldRet - 17364 00001740 E8A104 call DisplayTrailer ; display trailing info - 17365 ; 08/06/2023 - 17366 ; cf=0 - 17367 ;ld2: - 17368 ;clc ; return success - 17369 ldRet: - 17370 00001743 C3 retn - 17371 - 17372 ; --------------------------------------------------------------------------- - 17373 - 17374 ;*** LoadEntries - attempt to load entries from current directory - 17375 ; - 17376 ; Load all qualifying directory entries from the current directory - 17377 ; into the TPA. If an error is returned by FindFirst/FindNext calls - 17378 ; other than 'no more files', return to caller with carry flag set. - 17379 ; If we run out of buffer space, display a message that we haven't - 17380 ; enough memory to sort this directory, but return without error. - 17381 ; Other routines know whether or not entries have been loaded by - 17382 ; the 'inmem' flag bit, which we set here. - 17383 ; - 17384 ; The TPA is usually 64K - 512 bytes long. At 20 bytes per entry, - 17385 ; this allows sorting over 3000 entries in a directory. + 17300 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 17301 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1694h + 17302 + 17303 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 17304 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1776h + 17305 ListDir: + 17306 000016FA 31C0 xor ax,ax ; 0 + 17307 000016FC A3[209C] mov [FileCnt],ax ; zero file count + 17308 000016FF A3[229C] mov [FileSiz],ax ; zero file size accumulator + 17309 00001702 A3[249C] mov [FileSiz+2],ax + 17310 + 17311 ; 31/07/2024 + 17312 ; PCDOS 7.1 COMMAND.COM + 17313 %if 1 + 17314 00001705 A3[269C] mov [FileSiz+4],ax + 17315 00001708 A3[289C] mov [FileSiz+6],ax + 17316 %else + 17317 ; 08/06/2023 + 17318 ; MSDOS 6.0 + 17319 ;ifdef DBLSPACE_HOOKS + 17320 mov [ccluUsedDir],ax ; zero count clusters used + 17321 mov [csecUsedDir],ax ; zero count compressed sectors used + 17322 mov [csecUsedDir+2],ax + 17323 ;endif + 17324 %endif + 17325 ;cmp byte [DestBuf],0 ; check for sort code + 17326 ; 31/07/2024 + 17327 0000170B 3806[BE9D] cmp [DestBuf],al ; 0 + 17328 0000170F 740A je short ld1 ; no sort + 17329 00001711 E83000 call LoadEntries ; load entries for sorted listing + 17330 00001714 7305 jnc short ld1 ; no error - continue + 17331 00001716 E83209 call get_ext_error_number ; AX = DOS error code + 17332 ; 19/02/2023 + 17333 ;stc + 17334 00001719 EB12 jmp short ldErr ; return error + 17335 ld1: + 17336 0000171B E8DAFE call FindFirst ; find first file + 17337 0000171E 720D jc short ldErr ; not found, return error + 17338 + 17339 ; BX = offset in TPA buffer of entry found + 17340 + 17341 00001720 E82203 call DisplayHeader ; if at least one file, display header + 17342 ldNext: + 17343 00001723 E8FA02 call DisplayFile ; display the file entry + 17344 ;ldNext: + 17345 00001726 E8D4FE call FindNext ; find another file + 17346 00001729 7202 jc short ldErr ; not found + 17347 ;call DisplayFile ; display entry + 17348 ;jmp short ldNext ; go find another one + 17349 ; 19/02/2023 + 17350 0000172B EBF6 jmp short ldNext + 17351 ldErr: + 17352 ;cmp ax,2 + 17353 0000172D 83F802 cmp ax,ERROR_FILE_NOT_FOUND + 17354 00001730 7407 je short ldDone ; file not found, we're done + 17355 ;cmp ax,18 + 17356 00001732 83F812 cmp ax,ERROR_NO_MORE_FILES + 17357 00001735 7402 je short ldDone ; no more files, we're done + 17358 00001737 F9 stc + 17359 ;jmp short ldRet + 17360 ; 19/02/2023 + 17361 00001738 C3 retn + 17362 ldDone: + 17363 00001739 833E[209C]00 cmp word [FileCnt],0 + 17364 ;je short ld2 ; no files found, just return + 17365 ; 25/04/2023 + 17366 0000173E 7403 jz short ldRet + 17367 00001740 E8A104 call DisplayTrailer ; display trailing info + 17368 ; 08/06/2023 + 17369 ; cf=0 + 17370 ;ld2: + 17371 ;clc ; return success + 17372 ldRet: + 17373 00001743 C3 retn + 17374 + 17375 ; --------------------------------------------------------------------------- + 17376 + 17377 ;*** LoadEntries - attempt to load entries from current directory + 17378 ; + 17379 ; Load all qualifying directory entries from the current directory + 17380 ; into the TPA. If an error is returned by FindFirst/FindNext calls + 17381 ; other than 'no more files', return to caller with carry flag set. + 17382 ; If we run out of buffer space, display a message that we haven't + 17383 ; enough memory to sort this directory, but return without error. + 17384 ; Other routines know whether or not entries have been loaded by + 17385 ; the 'inmem' flag bit, which we set here. 17386 ; - 17387 ; ENTRY Tpa = buffer seg addr - 17388 ; BytCnt = buffer length, in bytes - 17389 ; Current directory (on selected drive) is the one to load - 17390 ; FCB contains drive # and filespec - 17391 ; Bits, AttrSpecified, AttrSelect, & DestBuf (sort codes) are set - 17392 ; - 17393 ; EXIT CY = set if error - 17394 ; If error, DOS Get Extended Error will get error info + 17387 ; The TPA is usually 64K - 512 bytes long. At 20 bytes per entry, + 17388 ; this allows sorting over 3000 entries in a directory. + 17389 ; + 17390 ; ENTRY Tpa = buffer seg addr + 17391 ; BytCnt = buffer length, in bytes + 17392 ; Current directory (on selected drive) is the one to load + 17393 ; FCB contains drive # and filespec + 17394 ; Bits, AttrSpecified, AttrSelect, & DestBuf (sort codes) are set 17395 ; - 17396 ; USED AX,CX,DX,SI,DI - 17397 ; - 17398 ; EFFECTS - 17399 ; - 17400 ; Inmem bit of Bits = set if load succeeded. - 17401 ; Tpa buffer contains directory entries. - 17402 ; Byte after last entry = 0FFh. - 17403 - 17404 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17405 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 17406 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 17407 LoadEntries: - 17408 00001744 06 push es ; save TRANGROUP seg addr - 17409 00001745 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr - 17410 00001749 31FF xor di,di ; ES:DI = destination ptr - 17411 ;;;and Bits,not mask inmem ; signal entries not loaded - 17412 ; MSDOS 5.0 - 17413 ;;;and word [_Bits],0FFDFh - 17414 ;;and byte [_Bits],0DFh ; not 20h - 17415 ; 31/07/2024 - 17416 ;and word [_Bits],0FF7Fh ; PCDOS 7.1 COMMAND.COM - 17417 ; 08/06/2023 - 17418 ;and byte [_Bits],0BFh ; ~20h ; MSDOS 6.0 - 17419 0000174B 8026[8B9D]7F and byte [_Bits],~mask.inmem ; 0BFh ; MSDOS 6.0 - 17420 ; 31/07/2024 ; 07Fh ; PCDOS 7.1 - 17421 - 17422 00001750 E87CFF call GetFirst ; look for first file - 17423 00001753 7221 jc short leRet ; return any error - 17424 00001755 E82000 call LoadEntry ; load entry into TPA - 17425 leNext: - 17426 00001758 E882FF call GetNext ; get another file - 17427 0000175B 720F jc short leLoaded ; assume any error is no more files - 17428 0000175D A1[159C] mov ax,[BYTCNT] ; AX = size of TPA - 17429 00001760 29F8 sub ax,di ; AX = bytes left in TPA - 17430 ; 08/06/2023 - 17431 ;;cmp ax,size EntryStruc+2 ; insist on entry size + 2 bytes - 17432 ;cmp ax,23 ; 21+2 ; MSDOS 5.0 - 17433 00001762 83F818 cmp ax,24 ; 22+2 ; MSDOS 6.0 - 17434 00001765 720E jb short leOk ; not enough memory left, give up - 17435 00001767 E80E00 call LoadEntry ; load entry into TPA - 17436 0000176A EBEC jmp short leNext ; go get another file - 17437 - 17438 leLoaded: - 17439 0000176C 26C605FF mov byte [es:di],0FFh ; mark end of entry list - 17440 ;;;or Bits,mask inmem ; signal entries loaded in memory - 17441 ; MSDOS 5.0 - 17442 ;;or word [_Bits],20h - 17443 ;or byte [_Bits],20h - 17444 ; 08/06/2023 - 17445 ;or byte [_Bits],40h ; MSDOS 6.0 - 17446 00001770 800E[8B9D]80 or byte [_Bits],mask.inmem ; 40h ; MSDOS 6.0 - 17447 ; 31/07/2024 ; 80h ; PCDOS 7.1 - 17448 ; 25/04/2023 - 17449 ; cf = 0 - 17450 leOk: - 17451 00001775 F8 clc ; return no error - 17452 leRet: - 17453 00001776 07 pop es ; ES = TRANGROUP seg addr again - 17454 00001777 C3 retn - 17455 - 17456 ; --------------------------------------------------------------------------- - 17457 - 17458 ;*** LoadEntry - load directory entry from DirBuf ext'd FCB - 17459 ; - 17460 ; ENTRY ES:DI = ptr to load point in TPA - 17461 ; DirBuf contains extended FCB of entry to load + 17396 ; EXIT CY = set if error + 17397 ; If error, DOS Get Extended Error will get error info + 17398 ; + 17399 ; USED AX,CX,DX,SI,DI + 17400 ; + 17401 ; EFFECTS + 17402 ; + 17403 ; Inmem bit of Bits = set if load succeeded. + 17404 ; Tpa buffer contains directory entries. + 17405 ; Byte after last entry = 0FFh. + 17406 + 17407 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17408 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 17409 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 17410 LoadEntries: + 17411 00001744 06 push es ; save TRANGROUP seg addr + 17412 00001745 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr + 17413 00001749 31FF xor di,di ; ES:DI = destination ptr + 17414 ;;;and Bits,not mask inmem ; signal entries not loaded + 17415 ; MSDOS 5.0 + 17416 ;;;and word [_Bits],0FFDFh + 17417 ;;and byte [_Bits],0DFh ; not 20h + 17418 ; 31/07/2024 + 17419 ;and word [_Bits],0FF7Fh ; PCDOS 7.1 COMMAND.COM + 17420 ; 08/06/2023 + 17421 ;and byte [_Bits],0BFh ; ~20h ; MSDOS 6.0 + 17422 0000174B 8026[8B9D]7F and byte [_Bits],~mask.inmem ; 0BFh ; MSDOS 6.0 + 17423 ; 31/07/2024 ; 07Fh ; PCDOS 7.1 + 17424 + 17425 00001750 E87CFF call GetFirst ; look for first file + 17426 00001753 7221 jc short leRet ; return any error + 17427 00001755 E82000 call LoadEntry ; load entry into TPA + 17428 leNext: + 17429 00001758 E882FF call GetNext ; get another file + 17430 0000175B 720F jc short leLoaded ; assume any error is no more files + 17431 0000175D A1[159C] mov ax,[BYTCNT] ; AX = size of TPA + 17432 00001760 29F8 sub ax,di ; AX = bytes left in TPA + 17433 ; 08/06/2023 + 17434 ;;cmp ax,size EntryStruc+2 ; insist on entry size + 2 bytes + 17435 ;cmp ax,23 ; 21+2 ; MSDOS 5.0 + 17436 00001762 83F818 cmp ax,24 ; 22+2 ; MSDOS 6.0 + 17437 00001765 720E jb short leOk ; not enough memory left, give up + 17438 00001767 E80E00 call LoadEntry ; load entry into TPA + 17439 0000176A EBEC jmp short leNext ; go get another file + 17440 + 17441 leLoaded: + 17442 0000176C 26C605FF mov byte [es:di],0FFh ; mark end of entry list + 17443 ;;;or Bits,mask inmem ; signal entries loaded in memory + 17444 ; MSDOS 5.0 + 17445 ;;or word [_Bits],20h + 17446 ;or byte [_Bits],20h + 17447 ; 08/06/2023 + 17448 ;or byte [_Bits],40h ; MSDOS 6.0 + 17449 00001770 800E[8B9D]80 or byte [_Bits],mask.inmem ; 40h ; MSDOS 6.0 + 17450 ; 31/07/2024 ; 80h ; PCDOS 7.1 + 17451 ; 25/04/2023 + 17452 ; cf = 0 + 17453 leOk: + 17454 00001775 F8 clc ; return no error + 17455 leRet: + 17456 00001776 07 pop es ; ES = TRANGROUP seg addr again + 17457 00001777 C3 retn + 17458 + 17459 ; --------------------------------------------------------------------------- + 17460 + 17461 ;*** LoadEntry - load directory entry from DirBuf ext'd FCB 17462 ; - 17463 ; EXIT ES:DI = ptr to next byte available in TPA - 17464 ; - 17465 ; USED AX,CX,SI - 17466 ; - 17467 ; NOTES - 17468 ; - 17469 ; I could've used symbolic offsets and sizes of fields from - 17470 ; the dir_entry struc to do this, but this is time-critical, - 17471 ; so I hard-wired the structure of the DOS 4.x returned FCB, - 17472 ; as well as our private directory entry structure. - 17473 ; - 17474 ; We force a zero size for subdirectory files. A zero size is - 17475 ; ordinarily returned for subdirectories, but with Novell - 17476 ; Netware 286 or 386 loaded, we can't depend on it. Bug #1594. - 17477 - 17478 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17479 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:15DDh - 17480 - 17481 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM - 17482 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:171Ch - 17483 - 17484 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 17485 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:17FDh - 17486 LoadEntry: - 17487 ;mov si,offset TRANGROUP:Dirbuf+8 ; DS:SI = ptr to filename - 17488 00001778 BE[419D] mov si,DIRBUF+8 - 17489 0000177B 30C0 xor al,al ; AL = 0 - 17490 0000177D AA stosb ; 'used' byte = false - 17491 0000177E B90B00 mov cx,11 - 17492 00001781 F3A4 rep movsb ; transfer filename & extension - 17493 00001783 AC lodsb ; AL = attrib byte - 17494 00001784 AA stosb ; store attrib byte - 17495 ;add si,10 ; 22-11-1 - 17496 ;add si,dir_time-dir_attr-1 ; skip to time field - 17497 00001785 83C60A add si,(DIR_ENTRY.DIR_TIME-DIR_ENTRY.DIR_ATTR)-1 - 17498 00001788 A5 movsw ; transfer time - 17499 00001789 A5 movsw ; transfer date - 17500 - 17501 ; 08/06/2023 - 17502 ; MSDOS 5.0 - 17503 %if 0 - 17504 inc si ; skip alloc unit - 17505 inc si - 17506 ;and al,10h - 17507 and al,ATTR_DIRECTORY - 17508 jnz short leSetDirSize ; force zero size for subdir - 17509 movsw - 17510 movsw ; transfer size - 17511 retn - 17512 leSetDirSize: - 17513 xor ax,ax ; 0 - 17514 stosw - 17515 stosw ; store zero size - 17516 retn - 17517 %endif - 17518 - 17519 ; 08/06/2023 - 17520 ; MSDOS 6.0 - 17521 ;%if 1 - 17522 ;ifdef DBLSPACE_HOOKS - 17523 0000178A 88C1 mov cl,al ; attrib to cl - 17524 0000178C AD lodsw ; allocation unit (cluster - 17525 ;and cl,10h - 17526 0000178D 80E110 and cl,ATTR_DIRECTORY - 17527 00001790 7506 jnz short leSetDirSize ; force zero size for subdir - 17528 00001792 A5 movsw - 17529 00001793 A5 movsw ; transfer size - 17530 - 17531 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM - 17532 %if 0 - 17533 ;;test word [_Bits],1 - 17534 ;test word [_Bits],mask.cratio ; compression ratio report? - 17535 test byte [_Bits],mask.cratio - 17536 jnz short leCalcRatio ; yup - 17537 %endif - 17538 - 17539 00001794 31C0 xor ax,ax - 17540 00001796 AA stosb ; dummy compression ratio - 17541 00001797 C3 retn - 17542 - 17543 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM - 17544 %if 0 - 17545 leCalcRatio: - 17546 call CalcCompRatio ; takes cluster in AX - 17547 or ax,ax ; returns ratio in AX - 17548 jz short leNoRatio ; 0 means couldn't calculate - 17549 dec ah ; pack 1.0 - 16.0 comp ratio - 17550 mov cl,4 ; into 2 nibbles. Store - 17551 shl ah,cl ; 1-16 as 0-15 in hi nibble, - 17552 or al,ah ; tenths (0-9) in low nibble - 17553 stosb - 17554 retn - 17555 %endif - 17556 - 17557 leSetDirSize: - 17558 00001798 31C0 xor ax,ax ; 0 - 17559 0000179A AB stosw - 17560 0000179B AB stosw ; store zero size - 17561 leNoRatio: - 17562 0000179C FEC8 dec al ; al = FFh = special invalid - 17563 0000179E AA stosb ; compression ratio - 17564 0000179F C3 retn - 17565 ;endif - 17566 ;%endif - 17567 - 17568 ; --------------------------------------------------------------------------- - 17569 - 17570 ;*** NoOrder - turn sorting off - 17571 ; - 17572 ; ENTRY nothing - 17573 ; - 17574 ; EXIT CY clear - 17575 ; - 17576 ; USED AX - 17577 ; - 17578 ; EFFECTS - 17579 ; - 17580 ; DestBuf is updated with sort code bytes. See DestBuf description. - 17581 - 17582 ; 19/02/2023 - 17583 NoOrder: - 17584 000017A0 C606[BE9D]00 mov byte [DestBuf],0 - 17585 ; no sort - 17586 000017A5 F8 clc ; no error - 17587 000017A6 C3 retn - 17588 - 17589 ; --------------------------------------------------------------------------- - 17590 - 17591 ;*** OnOffSw - record occurence of on/off option switch - 17592 ; - 17593 ; ENTRY DI = index into word list of switches - 17594 ; - 17595 ; EXIT CY clear - 17596 ; - 17597 ; USED AX,CX - 17598 ; - 17599 ; EFFECTS - 17600 ; - 17601 ; Bits modified to indicate option state. - 17602 - 17603 ; 19/02/2023 - 17604 OnOffSw: - 17605 000017A7 89F9 mov cx,di ; CX = index into word list of options - 17606 000017A9 D1E9 shr cx,1 - 17607 000017AB D1E9 shr cx,1 ; CX = bit position of option - 17608 000017AD B80100 mov ax,1 - 17609 000017B0 D3E0 shl ax,cl ; AX = bit mask of option - 17610 000017B2 F7C70200 test di,2 ; check if it is a negated option - 17611 000017B6 7405 jz short oo1 ; it's negated - 17612 ;or Bits,ax ; turn option on - 17613 000017B8 0906[8B9D] or [_Bits],ax - 17614 ;jmp short ooRet - 17615 ; 19/02/2023 - 17616 ;cf=0 - 17617 000017BC C3 retn - 17618 oo1: - 17619 000017BD F7D0 not ax ; AX = complemented bit mask of option - 17620 ;and Bits,ax ; turn option off - 17621 000017BF 2106[8B9D] and [_Bits],ax - 17622 ooRet: - 17623 ; 19/02/2023 - 17624 ;cf=0 - 17625 ;clc ; always return success - 17626 000017C3 C3 retn - 17627 - 17628 ; --------------------------------------------------------------------------- - 17629 - 17630 ;*** ParseAttr - parse and record /A option - 17631 ; - 17632 ; ENTRY BX = ptr to system parser result buffer for /A occurence - 17633 ; - 17634 ; EXIT CY = set if error occurs parsing attribute conditions - 17635 ; - 17636 ; For parse error, we set up for Std_EPrintf call: - 17637 ; AX = parse error code, like system parser - 17638 ; DX = ptr to message block - 17639 ; - 17640 ; USED AX,CX,DX,DI - 17641 ; - 17642 ; EFFECTS - 17643 ; - 17644 ; AttrSpecified, AttrSelect are updated with new attribute conditions. - 17645 ; If parse error occurs, attribute conditions parsed so far hold. + 17463 ; ENTRY ES:DI = ptr to load point in TPA + 17464 ; DirBuf contains extended FCB of entry to load + 17465 ; + 17466 ; EXIT ES:DI = ptr to next byte available in TPA + 17467 ; + 17468 ; USED AX,CX,SI + 17469 ; + 17470 ; NOTES + 17471 ; + 17472 ; I could've used symbolic offsets and sizes of fields from + 17473 ; the dir_entry struc to do this, but this is time-critical, + 17474 ; so I hard-wired the structure of the DOS 4.x returned FCB, + 17475 ; as well as our private directory entry structure. + 17476 ; + 17477 ; We force a zero size for subdirectory files. A zero size is + 17478 ; ordinarily returned for subdirectories, but with Novell + 17479 ; Netware 286 or 386 loaded, we can't depend on it. Bug #1594. + 17480 + 17481 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17482 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:15DDh + 17483 + 17484 ; 07/06/2023 - Retro DOS v4.2 COMMAND.COM + 17485 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:171Ch + 17486 + 17487 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 17488 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:17FDh + 17489 LoadEntry: + 17490 ;mov si,offset TRANGROUP:Dirbuf+8 ; DS:SI = ptr to filename + 17491 00001778 BE[419D] mov si,DIRBUF+8 + 17492 0000177B 30C0 xor al,al ; AL = 0 + 17493 0000177D AA stosb ; 'used' byte = false + 17494 0000177E B90B00 mov cx,11 + 17495 00001781 F3A4 rep movsb ; transfer filename & extension + 17496 00001783 AC lodsb ; AL = attrib byte + 17497 00001784 AA stosb ; store attrib byte + 17498 ;add si,10 ; 22-11-1 + 17499 ;add si,dir_time-dir_attr-1 ; skip to time field + 17500 00001785 83C60A add si,(DIR_ENTRY.DIR_TIME-DIR_ENTRY.DIR_ATTR)-1 + 17501 00001788 A5 movsw ; transfer time + 17502 00001789 A5 movsw ; transfer date + 17503 + 17504 ; 08/06/2023 + 17505 ; MSDOS 5.0 + 17506 %if 0 + 17507 inc si ; skip alloc unit + 17508 inc si + 17509 ;and al,10h + 17510 and al,ATTR_DIRECTORY + 17511 jnz short leSetDirSize ; force zero size for subdir + 17512 movsw + 17513 movsw ; transfer size + 17514 retn + 17515 leSetDirSize: + 17516 xor ax,ax ; 0 + 17517 stosw + 17518 stosw ; store zero size + 17519 retn + 17520 %endif + 17521 + 17522 ; 08/06/2023 + 17523 ; MSDOS 6.0 + 17524 ;%if 1 + 17525 ;ifdef DBLSPACE_HOOKS + 17526 0000178A 88C1 mov cl,al ; attrib to cl + 17527 0000178C AD lodsw ; allocation unit (cluster + 17528 ;and cl,10h + 17529 0000178D 80E110 and cl,ATTR_DIRECTORY + 17530 00001790 7506 jnz short leSetDirSize ; force zero size for subdir + 17531 00001792 A5 movsw + 17532 00001793 A5 movsw ; transfer size + 17533 + 17534 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM + 17535 %if 0 + 17536 ;;test word [_Bits],1 + 17537 ;test word [_Bits],mask.cratio ; compression ratio report? + 17538 test byte [_Bits],mask.cratio + 17539 jnz short leCalcRatio ; yup + 17540 %endif + 17541 + 17542 00001794 31C0 xor ax,ax + 17543 00001796 AA stosb ; dummy compression ratio + 17544 00001797 C3 retn + 17545 + 17546 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM + 17547 %if 0 + 17548 leCalcRatio: + 17549 call CalcCompRatio ; takes cluster in AX + 17550 or ax,ax ; returns ratio in AX + 17551 jz short leNoRatio ; 0 means couldn't calculate + 17552 dec ah ; pack 1.0 - 16.0 comp ratio + 17553 mov cl,4 ; into 2 nibbles. Store + 17554 shl ah,cl ; 1-16 as 0-15 in hi nibble, + 17555 or al,ah ; tenths (0-9) in low nibble + 17556 stosb + 17557 retn + 17558 %endif + 17559 + 17560 leSetDirSize: + 17561 00001798 31C0 xor ax,ax ; 0 + 17562 0000179A AB stosw + 17563 0000179B AB stosw ; store zero size + 17564 leNoRatio: + 17565 0000179C FEC8 dec al ; al = FFh = special invalid + 17566 0000179E AA stosb ; compression ratio + 17567 0000179F C3 retn + 17568 ;endif + 17569 ;%endif + 17570 + 17571 ; --------------------------------------------------------------------------- + 17572 + 17573 ;*** NoOrder - turn sorting off + 17574 ; + 17575 ; ENTRY nothing + 17576 ; + 17577 ; EXIT CY clear + 17578 ; + 17579 ; USED AX + 17580 ; + 17581 ; EFFECTS + 17582 ; + 17583 ; DestBuf is updated with sort code bytes. See DestBuf description. + 17584 + 17585 ; 19/02/2023 + 17586 NoOrder: + 17587 000017A0 C606[BE9D]00 mov byte [DestBuf],0 + 17588 ; no sort + 17589 000017A5 F8 clc ; no error + 17590 000017A6 C3 retn + 17591 + 17592 ; --------------------------------------------------------------------------- + 17593 + 17594 ;*** OnOffSw - record occurence of on/off option switch + 17595 ; + 17596 ; ENTRY DI = index into word list of switches + 17597 ; + 17598 ; EXIT CY clear + 17599 ; + 17600 ; USED AX,CX + 17601 ; + 17602 ; EFFECTS + 17603 ; + 17604 ; Bits modified to indicate option state. + 17605 + 17606 ; 19/02/2023 + 17607 OnOffSw: + 17608 000017A7 89F9 mov cx,di ; CX = index into word list of options + 17609 000017A9 D1E9 shr cx,1 + 17610 000017AB D1E9 shr cx,1 ; CX = bit position of option + 17611 000017AD B80100 mov ax,1 + 17612 000017B0 D3E0 shl ax,cl ; AX = bit mask of option + 17613 000017B2 F7C70200 test di,2 ; check if it is a negated option + 17614 000017B6 7405 jz short oo1 ; it's negated + 17615 ;or Bits,ax ; turn option on + 17616 000017B8 0906[8B9D] or [_Bits],ax + 17617 ;jmp short ooRet + 17618 ; 19/02/2023 + 17619 ;cf=0 + 17620 000017BC C3 retn + 17621 oo1: + 17622 000017BD F7D0 not ax ; AX = complemented bit mask of option + 17623 ;and Bits,ax ; turn option off + 17624 000017BF 2106[8B9D] and [_Bits],ax + 17625 ooRet: + 17626 ; 19/02/2023 + 17627 ;cf=0 + 17628 ;clc ; always return success + 17629 000017C3 C3 retn + 17630 + 17631 ; --------------------------------------------------------------------------- + 17632 + 17633 ;*** ParseAttr - parse and record /A option + 17634 ; + 17635 ; ENTRY BX = ptr to system parser result buffer for /A occurence + 17636 ; + 17637 ; EXIT CY = set if error occurs parsing attribute conditions + 17638 ; + 17639 ; For parse error, we set up for Std_EPrintf call: + 17640 ; AX = parse error code, like system parser + 17641 ; DX = ptr to message block + 17642 ; + 17643 ; USED AX,CX,DX,DI + 17644 ; + 17645 ; EFFECTS 17646 ; - 17647 ; For parse error, we set up for Std_EPrintf call: - 17648 ; Msg_Disp_Class = parse error message class - 17649 ; Message block (see DX) is set up for parse error message - 17650 - 17651 ; 19/02/2023 - 17652 ParseAttr: - 17653 000017C4 56 push si ; save SI - 17654 000017C5 C606[939D]00 mov byte [AttrSpecified],0 ; cancel all attribute conditions - 17655 - 17656 ; Each /A invocation starts by assuming all files are to be listed. - 17657 - 17658 ;;mov si,word ptr [bx].ValuePtr - 17659 ; SI = ptr to string after /A - 17660 ;mov si,[bx+ResultBuffer.ValuePtr] - 17661 000017CA 8B7704 mov si,[bx+4] - 17662 paLoop: - 17663 000017CD BA0100 mov dx,1 ; DX = 1 (for un-negated attribute) - 17664 000017D0 AC lodsb ; AL = next char in string - 17665 000017D1 08C0 or al,al - 17666 ;jz short paOk ; it's terminating null, we're done - 17667 ; 19/02/2023 - 17668 000017D3 742F jz short paRet ; cf=0 - 17669 000017D5 3C2D cmp al,'-' - 17670 000017D7 7502 jne short pa1 ; not '-', go look for letter - 17671 000017D9 4A dec dx ; DX = 0 (for negated attribute) - 17672 000017DA AC lodsb ; AL = next char - 17673 pa1: - 17674 ;mov di,offset TRANGROUP:AttrLtrs - 17675 ; DI = ptr to attrib letter list - 17676 000017DB BF[D895] mov di,AttrLtrs ; "RHSvDA" - 17677 ;mov cx,6 - 17678 000017DE B90600 mov cx,NUM_ATTR_LTRS ; 6 ; CX = length of attrib letter list - 17679 000017E1 F2AE repne scasb ; look for our letter in the list - 17680 000017E3 751B jne short paErr ; not found, return error - 17681 - 17682 000017E5 F7D1 not cx - 17683 ;add cx,6 - 17684 000017E7 83C106 add cx,NUM_ATTR_LTRS ; CX = attrib bit #, 0-5 - 17685 - 17686 ; Note that we rely on AttrLtrs to be in the attribute bit order, - 17687 ; starting from bit 0. + 17647 ; AttrSpecified, AttrSelect are updated with new attribute conditions. + 17648 ; If parse error occurs, attribute conditions parsed so far hold. + 17649 ; + 17650 ; For parse error, we set up for Std_EPrintf call: + 17651 ; Msg_Disp_Class = parse error message class + 17652 ; Message block (see DX) is set up for parse error message + 17653 + 17654 ; 19/02/2023 + 17655 ParseAttr: + 17656 000017C4 56 push si ; save SI + 17657 000017C5 C606[939D]00 mov byte [AttrSpecified],0 ; cancel all attribute conditions + 17658 + 17659 ; Each /A invocation starts by assuming all files are to be listed. + 17660 + 17661 ;;mov si,word ptr [bx].ValuePtr + 17662 ; SI = ptr to string after /A + 17663 ;mov si,[bx+ResultBuffer.ValuePtr] + 17664 000017CA 8B7704 mov si,[bx+4] + 17665 paLoop: + 17666 000017CD BA0100 mov dx,1 ; DX = 1 (for un-negated attribute) + 17667 000017D0 AC lodsb ; AL = next char in string + 17668 000017D1 08C0 or al,al + 17669 ;jz short paOk ; it's terminating null, we're done + 17670 ; 19/02/2023 + 17671 000017D3 742F jz short paRet ; cf=0 + 17672 000017D5 3C2D cmp al,'-' + 17673 000017D7 7502 jne short pa1 ; not '-', go look for letter + 17674 000017D9 4A dec dx ; DX = 0 (for negated attribute) + 17675 000017DA AC lodsb ; AL = next char + 17676 pa1: + 17677 ;mov di,offset TRANGROUP:AttrLtrs + 17678 ; DI = ptr to attrib letter list + 17679 000017DB BF[D895] mov di,AttrLtrs ; "RHSvDA" + 17680 ;mov cx,6 + 17681 000017DE B90600 mov cx,NUM_ATTR_LTRS ; 6 ; CX = length of attrib letter list + 17682 000017E1 F2AE repne scasb ; look for our letter in the list + 17683 000017E3 751B jne short paErr ; not found, return error + 17684 + 17685 000017E5 F7D1 not cx + 17686 ;add cx,6 + 17687 000017E7 83C106 add cx,NUM_ATTR_LTRS ; CX = attrib bit #, 0-5 17688 - 17689 ; Record this attribute bit in AttrSpecified. - 17690 - 17691 000017EA B001 mov al,1 - 17692 000017EC D2E0 shl al,cl ; AL = mask for our bit - 17693 000017EE 0806[939D] or [AttrSpecified],al ; set it in the 'specified' mask - 17694 - 17695 ; Record the selected state for this attribute in AttrSelect. - 17696 ; DX = 0 or 1, the selected state for this attribute. + 17689 ; Note that we rely on AttrLtrs to be in the attribute bit order, + 17690 ; starting from bit 0. + 17691 + 17692 ; Record this attribute bit in AttrSpecified. + 17693 + 17694 000017EA B001 mov al,1 + 17695 000017EC D2E0 shl al,cl ; AL = mask for our bit + 17696 000017EE 0806[939D] or [AttrSpecified],al ; set it in the 'specified' mask 17697 - 17698 000017F2 F6D0 not al ; AL = mask for all other bits - 17699 000017F4 2006[949D] and [AttrSelect],al ; clear our bit - 17700 000017F8 D2E2 shl dl,cl ; DL = our bit state in position - 17701 000017FA 0816[949D] or [AttrSelect],dl ; set selected attr state - 17702 000017FE EBCD jmp short paLoop ; go look at next char - 17703 - 17704 ; The attribute letter string is invalid. - 17705 - 17706 paErr: - 17707 00001800 E89D04 call SetupParamError ; set message up for Std_EPrintf - 17708 00001803 F9 stc ; return error - 17709 ; 19/02/2023 - 17710 ;jmp short paRet - 17711 ;paOk: - 17712 ;clc ; return success - 17713 paRet: - 17714 00001804 5E pop si ; restore SI - 17715 00001805 C3 retn - 17716 - 17717 ; --------------------------------------------------------------------------- - 17718 - 17719 ;*** ParseLine - parse a line of text - 17720 ; - 17721 ; Parse text until an EOL (CR or NUL) is found, or until a parse - 17722 ; error occurs. + 17698 ; Record the selected state for this attribute in AttrSelect. + 17699 ; DX = 0 or 1, the selected state for this attribute. + 17700 + 17701 000017F2 F6D0 not al ; AL = mask for all other bits + 17702 000017F4 2006[949D] and [AttrSelect],al ; clear our bit + 17703 000017F8 D2E2 shl dl,cl ; DL = our bit state in position + 17704 000017FA 0816[949D] or [AttrSelect],dl ; set selected attr state + 17705 000017FE EBCD jmp short paLoop ; go look at next char + 17706 + 17707 ; The attribute letter string is invalid. + 17708 + 17709 paErr: + 17710 00001800 E89D04 call SetupParamError ; set message up for Std_EPrintf + 17711 00001803 F9 stc ; return error + 17712 ; 19/02/2023 + 17713 ;jmp short paRet + 17714 ;paOk: + 17715 ;clc ; return success + 17716 paRet: + 17717 00001804 5E pop si ; restore SI + 17718 00001805 C3 retn + 17719 + 17720 ; --------------------------------------------------------------------------- + 17721 + 17722 ;*** ParseLine - parse a line of text 17723 ; - 17724 ; ENTRY DS:SI = ptr to text - 17725 ; CS, DS, ES = TRANGROUP seg addr + 17724 ; Parse text until an EOL (CR or NUL) is found, or until a parse + 17725 ; error occurs. 17726 ; - 17727 ; EXIT AX = last return code from system parser - 17728 ; CX = # positional parameters (pathnames) found - 0 or 1 + 17727 ; ENTRY DS:SI = ptr to text + 17728 ; CS, DS, ES = TRANGROUP seg addr 17729 ; - 17730 ; If parse error occurred, we're set up for Std_EPrintf call: - 17731 ; DX = ptr to message block + 17730 ; EXIT AX = last return code from system parser + 17731 ; CX = # positional parameters (pathnames) found - 0 or 1 17732 ; - 17733 ; USED BX,CX,DX,SI,DI - 17734 ; - 17735 ; EFFECTS - 17736 ; - 17737 ; Bits may contain new option settings. - 17738 ; DestBuf may contain new series of sort codes. - 17739 ; AttrSpecified, AttrSelect may contain new attribute conditions. - 17740 ; SrcBuf may contain a new default pathname/filespec. - 17741 ; PathPos, PathCnt updated for new pathname. - 17742 ; - 17743 ; If parse error occurred, we're set up for Std_EPrintf call: - 17744 ; Msg_Disp_Class = parse error class - 17745 ; Byte after last parameter in text is zeroed to make ASCIIZ string - 17746 ; Message block (see DX) is set up for parse error message - 17747 - 17748 ; 19/02/2023 - 17749 Parse_Line: - 17750 ; 04/05/2023 - 17751 00001806 BF[A596] mov di,PARSE_DIR ; ES:DI = ptr to parse block - 17752 00001809 31C9 xor cx,cx ; CX = # positionals found - 17753 plPars: - 17754 0000180B E84D0D call Parse_With_Msg ; call parser - 17755 0000180E 83F8FF cmp ax,-1 - 17756 ;cmp ax,END_OF_LINE ; 0FFFFh ; -1 - 17757 00001811 7411 je short plRet ; EOL encountered, return - 17758 00001813 83F800 cmp ax,RESULT_NO_ERROR ; 0 - 17759 00001816 750C jne short plRet ; parse error occurred, return - 17760 - 17761 ; Parse call succeeded. We have a filespec or a switch. - 17762 ; DX = ptr to result buffer + 17733 ; If parse error occurred, we're set up for Std_EPrintf call: + 17734 ; DX = ptr to message block + 17735 ; + 17736 ; USED BX,CX,DX,SI,DI + 17737 ; + 17738 ; EFFECTS + 17739 ; + 17740 ; Bits may contain new option settings. + 17741 ; DestBuf may contain new series of sort codes. + 17742 ; AttrSpecified, AttrSelect may contain new attribute conditions. + 17743 ; SrcBuf may contain a new default pathname/filespec. + 17744 ; PathPos, PathCnt updated for new pathname. + 17745 ; + 17746 ; If parse error occurred, we're set up for Std_EPrintf call: + 17747 ; Msg_Disp_Class = parse error class + 17748 ; Byte after last parameter in text is zeroed to make ASCIIZ string + 17749 ; Message block (see DX) is set up for parse error message + 17750 + 17751 ; 19/02/2023 + 17752 Parse_Line: + 17753 ; 04/05/2023 + 17754 00001806 BF[A596] mov di,PARSE_DIR ; ES:DI = ptr to parse block + 17755 00001809 31C9 xor cx,cx ; CX = # positionals found + 17756 plPars: + 17757 0000180B E84D0D call Parse_With_Msg ; call parser + 17758 0000180E 83F8FF cmp ax,-1 + 17759 ;cmp ax,END_OF_LINE ; 0FFFFh ; -1 + 17760 00001811 7411 je short plRet ; EOL encountered, return + 17761 00001813 83F800 cmp ax,RESULT_NO_ERROR ; 0 + 17762 00001816 750C jne short plRet ; parse error occurred, return 17763 - 17764 00001818 89D3 mov bx,dx ; BX = ptr to parse result buffer - 17765 0000181A 803F05 cmp byte [bx],RESULT_FILESPEC ; 5 - 17766 0000181D 7406 je short plFil ; we have a filespec - 17767 - 17768 0000181F E85900 call ParseSwitch ; else we have a switch - 17769 ;jc short plRet ; error parsing switch, return - 17770 ;jmp short plPars ; parse more - 17771 ; 19/02/2023 - 17772 00001822 73E7 jnc short plPars - 17773 plRet: - 17774 00001824 C3 retn - 17775 plFil: - 17776 00001825 E8BA00 call CopyPathname ; copy pathname into our buffer - 17777 00001828 EBE1 jmp short plPars ; parse more - 17778 ;plRet: - 17779 ; retn - 17780 - 17781 ; --------------------------------------------------------------------------- - 17782 - 17783 ;*** ParseOrder - parse and record /O option - 17784 ; - 17785 ; ENTRY BX = ptr to system parser result buffer for /O occurence - 17786 ; - 17787 ; EXIT CY = set if error occurs parsing order - 17788 ; - 17789 ; For parse error, we set up for Std_EPrintf call: - 17790 ; AX = parse error code, like system parser - 17791 ; DX = ptr to message block - 17792 ; - 17793 ; USED AX,CX,DX,DI - 17794 ; - 17795 ; EFFECTS - 17796 ; - 17797 ; DestBuf is updated with sort code bytes. See DestBuf description. - 17798 ; - 17799 ; For parse error, we set up for Std_EPrintf call: - 17800 ; Msg_Disp_Class = parse error message class - 17801 ; Message block (see DX) is set up for parse error message - 17802 - 17803 ; 19/02/2023 - Retro DOS v4.0 COMMAND.COM - 17804 ; - 17805 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 17806 ; MSDOS 6.22 COMMAND.COM - 17807 ParseOrder: - 17808 0000182A 56 push si ; save SI - 17809 0000182B 53 push bx ; save ptr to result buffer - 17810 - 17811 ;;mov si,word ptr [bx].ValuePtr - 17812 ;mov si,[bx+ResultBuffer.ValuePtr] - 17813 0000182C 8B7704 mov si,[bx+4] ; SI = ptr to order letters - 17814 ;mov bx,offset TRANGROUP:DestBuf - 17815 ; 08/06/2023 - 17816 0000182F BB[BE9D] mov bx,DestBuf ; BX = ptr to sort code buffer - 17817 00001832 8A04 mov al,[si] ; AL = 1st char of order string - 17818 00001834 08C0 or al,al - 17819 00001836 750E jnz short poLtr ; not NUL, go parse letters - 17820 - 17821 ; We have /O alone. Set standard sort order. - 17822 ; Note hardwired dependency on character order in OrderLtrs. + 17764 ; Parse call succeeded. We have a filespec or a switch. + 17765 ; DX = ptr to result buffer + 17766 + 17767 00001818 89D3 mov bx,dx ; BX = ptr to parse result buffer + 17768 0000181A 803F05 cmp byte [bx],RESULT_FILESPEC ; 5 + 17769 0000181D 7406 je short plFil ; we have a filespec + 17770 + 17771 0000181F E85900 call ParseSwitch ; else we have a switch + 17772 ;jc short plRet ; error parsing switch, return + 17773 ;jmp short plPars ; parse more + 17774 ; 19/02/2023 + 17775 00001822 73E7 jnc short plPars + 17776 plRet: + 17777 00001824 C3 retn + 17778 plFil: + 17779 00001825 E8BA00 call CopyPathname ; copy pathname into our buffer + 17780 00001828 EBE1 jmp short plPars ; parse more + 17781 ;plRet: + 17782 ; retn + 17783 + 17784 ; --------------------------------------------------------------------------- + 17785 + 17786 ;*** ParseOrder - parse and record /O option + 17787 ; + 17788 ; ENTRY BX = ptr to system parser result buffer for /O occurence + 17789 ; + 17790 ; EXIT CY = set if error occurs parsing order + 17791 ; + 17792 ; For parse error, we set up for Std_EPrintf call: + 17793 ; AX = parse error code, like system parser + 17794 ; DX = ptr to message block + 17795 ; + 17796 ; USED AX,CX,DX,DI + 17797 ; + 17798 ; EFFECTS + 17799 ; + 17800 ; DestBuf is updated with sort code bytes. See DestBuf description. + 17801 ; + 17802 ; For parse error, we set up for Std_EPrintf call: + 17803 ; Msg_Disp_Class = parse error message class + 17804 ; Message block (see DX) is set up for parse error message + 17805 + 17806 ; 19/02/2023 - Retro DOS v4.0 COMMAND.COM + 17807 ; + 17808 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 17809 ; MSDOS 6.22 COMMAND.COM + 17810 ParseOrder: + 17811 0000182A 56 push si ; save SI + 17812 0000182B 53 push bx ; save ptr to result buffer + 17813 + 17814 ;;mov si,word ptr [bx].ValuePtr + 17815 ;mov si,[bx+ResultBuffer.ValuePtr] + 17816 0000182C 8B7704 mov si,[bx+4] ; SI = ptr to order letters + 17817 ;mov bx,offset TRANGROUP:DestBuf + 17818 ; 08/06/2023 + 17819 0000182F BB[BE9D] mov bx,DestBuf ; BX = ptr to sort code buffer + 17820 00001832 8A04 mov al,[si] ; AL = 1st char of order string + 17821 00001834 08C0 or al,al + 17822 00001836 750E jnz short poLtr ; not NUL, go parse letters 17823 - 17824 00001838 C60705 mov byte [bx],5 ; sort 1st by group (subdirs 1st) - 17825 0000183B 43 inc bx - 17826 0000183C C60701 mov byte [bx],1 ; then by name - 17827 0000183F 43 inc bx - 17828 00001840 C60702 mov byte [bx],2 ; then by extension - 17829 00001843 43 inc bx - 17830 00001844 EB2F jmp short poOk ; return success - 17831 - 17832 ; We have /O. Parse sort order letters. - 17833 - 17834 poLtr: - 17835 00001846 30D2 xor dl,dl ; DL = 0 (upward sort) - 17836 00001848 AC lodsb ; AL = next sort order letter - 17837 00001849 08C0 or al,al - 17838 0000184B 7428 jz short poOk ; NUL found, return success - 17839 - 17840 0000184D 3C2D cmp al,'-' - 17841 0000184F 7503 jne short po1 ; not '-', go look for letter - 17842 00001851 B280 mov dl,80h ; DL = downward sort mask - 17843 00001853 AC lodsb ; AL = next char - 17844 po1: - 17845 ;mov di,offset TRANGROUP:OrderLtrs - 17846 ; 08/06/2023 - 17847 00001854 BF[DE95] mov di,OrderLtrs ;"NEDSGC" ; DI = ptr to list of letters - 17848 ; (NUM_ORDER_LTRS = 6 for MSDOS 6.22 COMMAND.COM) - 17849 ; ((N,E,D,S,G for MSDOS 5.0 and N,E,D,S,G,C for MSDOS 6.22)) - 17850 ;mov cx,6 ; 08/06/2023 - 17851 00001857 B90600 mov cx,NUM_ORDER_LTRS ; 5 ; CX = length of list - 17852 0000185A F2AE repne scasb ; look for our letter in the list - 17853 0000185C 7510 jne short poErr ; not found, return error - 17854 - 17855 0000185E F7D9 neg cx - 17856 ;add cx,6 ; 08/06/2023 - 17857 00001860 83C106 add cx,NUM_ORDER_LTRS ; 5 ; CL = sort order code, 1-6 - 17858 - 17859 00001863 08D1 or cl,dl ; CL = sort code with up/dn bit - 17860 00001865 880F mov [bx],cl ; store sort order code in buffer - 17861 00001867 43 inc bx ; BX = ptr to next spot in buffer - 17862 ;cmp bx,offset TRANGROUP:EndDestBuf - 17863 00001868 81FB[159E] cmp bx,EndDestBuf - 17864 ;jae short poErr ; too many letters - 17865 ; - 17866 ;jmp short poLtr ; go look at next char - 17867 ; 19/02/2023 - 17868 0000186C 72D8 jb short poLtr - 17869 - 17870 ; The sort order string is invalid. - 17871 - 17872 poErr: - 17873 0000186E 5B pop bx ; BX = ptr to result buffer - 17874 0000186F E82E04 call SetupParamError ; set message up for Std_EPrintf - 17875 00001872 F9 stc ; return failure - 17876 00001873 EB04 jmp short poRet - 17877 poOk: - 17878 00001875 C60700 mov byte [bx],0 ; mark end of sort code list - 17879 00001878 5B pop bx ; BX = ptr to result buffer - 17880 ; 19/02/2023 - 17881 ;cf=0 - 17882 ;clc ; return success - 17883 poRet: - 17884 00001879 5E pop si ; restore SI - 17885 0000187A C3 retn - 17886 - 17887 ; --------------------------------------------------------------------------- - 17888 ; MSDOS 6.0 - 17889 ; 08/06/2023 - 17890 - 17891 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM - 17892 %if 0 + 17824 ; We have /O alone. Set standard sort order. + 17825 ; Note hardwired dependency on character order in OrderLtrs. + 17826 + 17827 00001838 C60705 mov byte [bx],5 ; sort 1st by group (subdirs 1st) + 17828 0000183B 43 inc bx + 17829 0000183C C60701 mov byte [bx],1 ; then by name + 17830 0000183F 43 inc bx + 17831 00001840 C60702 mov byte [bx],2 ; then by extension + 17832 00001843 43 inc bx + 17833 00001844 EB2F jmp short poOk ; return success + 17834 + 17835 ; We have /O. Parse sort order letters. + 17836 + 17837 poLtr: + 17838 00001846 30D2 xor dl,dl ; DL = 0 (upward sort) + 17839 00001848 AC lodsb ; AL = next sort order letter + 17840 00001849 08C0 or al,al + 17841 0000184B 7428 jz short poOk ; NUL found, return success + 17842 + 17843 0000184D 3C2D cmp al,'-' + 17844 0000184F 7503 jne short po1 ; not '-', go look for letter + 17845 00001851 B280 mov dl,80h ; DL = downward sort mask + 17846 00001853 AC lodsb ; AL = next char + 17847 po1: + 17848 ;mov di,offset TRANGROUP:OrderLtrs + 17849 ; 08/06/2023 + 17850 00001854 BF[DE95] mov di,OrderLtrs ;"NEDSGC" ; DI = ptr to list of letters + 17851 ; (NUM_ORDER_LTRS = 6 for MSDOS 6.22 COMMAND.COM) + 17852 ; ((N,E,D,S,G for MSDOS 5.0 and N,E,D,S,G,C for MSDOS 6.22)) + 17853 ;mov cx,6 ; 08/06/2023 + 17854 00001857 B90600 mov cx,NUM_ORDER_LTRS ; 5 ; CX = length of list + 17855 0000185A F2AE repne scasb ; look for our letter in the list + 17856 0000185C 7510 jne short poErr ; not found, return error + 17857 + 17858 0000185E F7D9 neg cx + 17859 ;add cx,6 ; 08/06/2023 + 17860 00001860 83C106 add cx,NUM_ORDER_LTRS ; 5 ; CL = sort order code, 1-6 + 17861 + 17862 00001863 08D1 or cl,dl ; CL = sort code with up/dn bit + 17863 00001865 880F mov [bx],cl ; store sort order code in buffer + 17864 00001867 43 inc bx ; BX = ptr to next spot in buffer + 17865 ;cmp bx,offset TRANGROUP:EndDestBuf + 17866 00001868 81FB[159E] cmp bx,EndDestBuf + 17867 ;jae short poErr ; too many letters + 17868 ; + 17869 ;jmp short poLtr ; go look at next char + 17870 ; 19/02/2023 + 17871 0000186C 72D8 jb short poLtr + 17872 + 17873 ; The sort order string is invalid. + 17874 + 17875 poErr: + 17876 0000186E 5B pop bx ; BX = ptr to result buffer + 17877 0000186F E82E04 call SetupParamError ; set message up for Std_EPrintf + 17878 00001872 F9 stc ; return failure + 17879 00001873 EB04 jmp short poRet + 17880 poOk: + 17881 00001875 C60700 mov byte [bx],0 ; mark end of sort code list + 17882 00001878 5B pop bx ; BX = ptr to result buffer + 17883 ; 19/02/2023 + 17884 ;cf=0 + 17885 ;clc ; return success + 17886 poRet: + 17887 00001879 5E pop si ; restore SI + 17888 0000187A C3 retn + 17889 + 17890 ; --------------------------------------------------------------------------- + 17891 ; MSDOS 6.0 + 17892 ; 08/06/2023 17893 - 17894 ;ifdef DBLSPACE_HOOKS - 17895 - 17896 ;*** ParseRatio - parse and record /C[H] option - 17897 ; - 17898 ; ENTRY BX = ptr to system parser result buffer for /C occurence - 17899 ; DI = index into word list of switches + 17894 ; 31/07/2024 - Retro DOS 5.0 - PCDOS 7.1 COMMAND.COM + 17895 %if 0 + 17896 + 17897 ;ifdef DBLSPACE_HOOKS + 17898 + 17899 ;*** ParseRatio - parse and record /C[H] option 17900 ; - 17901 ; EXIT CY = set if error occurs parsing order - 17902 ; - 17903 ; For parse error, we set up for Std_EPrintf call: - 17904 ; AX = parse error code, like system parser - 17905 ; DX = ptr to message block - 17906 ; - 17907 ; USED AX,CX,DX,DI - 17908 ; - 17909 ; EFFECTS - 17910 ; - 17911 ; Bits modified to indicate option state. - 17912 ; fUseHostSize is set to zero for /C, non-zero for /CH. + 17901 ; ENTRY BX = ptr to system parser result buffer for /C occurence + 17902 ; DI = index into word list of switches + 17903 ; + 17904 ; EXIT CY = set if error occurs parsing order + 17905 ; + 17906 ; For parse error, we set up for Std_EPrintf call: + 17907 ; AX = parse error code, like system parser + 17908 ; DX = ptr to message block + 17909 ; + 17910 ; USED AX,CX,DX,DI + 17911 ; + 17912 ; EFFECTS 17913 ; - 17914 ; For parse error, we set up for Std_EPrintf call: - 17915 ; Msg_Disp_Class = parse error message class - 17916 ; Message block (see DX) is set up for parse error message - 17917 - 17918 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 17919 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:184Ch + 17914 ; Bits modified to indicate option state. + 17915 ; fUseHostSize is set to zero for /C, non-zero for /CH. + 17916 ; + 17917 ; For parse error, we set up for Std_EPrintf call: + 17918 ; Msg_Disp_Class = parse error message class + 17919 ; Message block (see DX) is set up for parse error message 17920 - 17921 ParseRatio: ;proc - 17922 call OnOffSw ; turn on option bit - 17923 push si ; save SI - 17924 ;;mov si,word ptr [bx].ValuePtr - 17925 ;mov si,[bx+ResultBuffer.ValuePtr] - 17926 mov si,[bx+4] ; SI = ptr to possible H option - 17927 mov al,[si] ; AL = null or 'H' - 17928 or al,al - 17929 jz short prDone ; if null, no H option to check - 17930 cmp al,'H' ; only H is allowed, make sure that's - 17931 je short prDone ; what it is - 17932 call SetupParamError ; set message up for Std_EPrintf - 17933 stc ; return failure - 17934 jmp short prRet - 17935 prDone: - 17936 mov [fUseHostSize],al ; set Host cluster size flag - 17937 ; 08/06/2023 - 17938 ;clc - 17939 ;;cf = 0 - 17940 prRet: - 17941 pop si - 17942 retn - 17943 - 17944 ;ParseRatio ;endp - 17945 ;endif + 17921 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 17922 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:184Ch + 17923 + 17924 ParseRatio: ;proc + 17925 call OnOffSw ; turn on option bit + 17926 push si ; save SI + 17927 ;;mov si,word ptr [bx].ValuePtr + 17928 ;mov si,[bx+ResultBuffer.ValuePtr] + 17929 mov si,[bx+4] ; SI = ptr to possible H option + 17930 mov al,[si] ; AL = null or 'H' + 17931 or al,al + 17932 jz short prDone ; if null, no H option to check + 17933 cmp al,'H' ; only H is allowed, make sure that's + 17934 je short prDone ; what it is + 17935 call SetupParamError ; set message up for Std_EPrintf + 17936 stc ; return failure + 17937 jmp short prRet + 17938 prDone: + 17939 mov [fUseHostSize],al ; set Host cluster size flag + 17940 ; 08/06/2023 + 17941 ;clc + 17942 ;;cf = 0 + 17943 prRet: + 17944 pop si + 17945 retn 17946 - 17947 %endif - 17948 - 17949 ; --------------------------------------------------------------------------- - 17950 - 17951 ;*** ParseSwitch - parse a switch - 17952 ; - 17953 ; ENTRY BX = ptr to parse result buffer after system parser processed - 17954 ; a switch + 17947 ;ParseRatio ;endp + 17948 ;endif + 17949 + 17950 %endif + 17951 + 17952 ; --------------------------------------------------------------------------- + 17953 + 17954 ;*** ParseSwitch - parse a switch 17955 ; - 17956 ; EXIT CY = set if parse error occurred - 17957 ; - 17958 ; If parse error occurred, we're set up for Std_EPrintf call: - 17959 ; AX = parse error code, like system parser - 17960 ; DX = ptr to message block - 17961 ; - 17962 ; USED AX,BX,DX - 17963 ; - 17964 ; EFFECTS - 17965 ; - 17966 ; Bits may contain new option settings. - 17967 ; DestBuf may contain new series of sort codes. - 17968 ; AttrSpecified, AttrSelect may contain new attribute conditions. - 17969 ; - 17970 ; If parse error occurred, we're set up for Std_EPrintf call: - 17971 ; Msg_Disp_Class = parse error class - 17972 ; Byte after last parameter in text is zeroed to make ASCIIZ string - 17973 ; Message block (see DX) is set up for parse error message - 17974 - 17975 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 17976 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:16E2h + 17956 ; ENTRY BX = ptr to parse result buffer after system parser processed + 17957 ; a switch + 17958 ; + 17959 ; EXIT CY = set if parse error occurred + 17960 ; + 17961 ; If parse error occurred, we're set up for Std_EPrintf call: + 17962 ; AX = parse error code, like system parser + 17963 ; DX = ptr to message block + 17964 ; + 17965 ; USED AX,BX,DX + 17966 ; + 17967 ; EFFECTS + 17968 ; + 17969 ; Bits may contain new option settings. + 17970 ; DestBuf may contain new series of sort codes. + 17971 ; AttrSpecified, AttrSelect may contain new attribute conditions. + 17972 ; + 17973 ; If parse error occurred, we're set up for Std_EPrintf call: + 17974 ; Msg_Disp_Class = parse error class + 17975 ; Byte after last parameter in text is zeroed to make ASCIIZ string + 17976 ; Message block (see DX) is set up for parse error message 17977 - 17978 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 17979 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1869h - 17980 ParseSwitch: - 17981 0000187B 51 push cx ; save CX - 17982 0000187C 57 push di ; save DI - 17983 - 17984 ;;mov ax,[bx].SynPtr ; AX = synonym ptr - 17985 ;mov ax,[bx+ResultBuffer.SynPtr] - 17986 0000187D 8B4702 mov ax,[bx+2] - 17987 ;mov di,offset TRANGROUP:Dir_Sw_Ptrs - 17988 00001880 BF[0397] mov di,Dir_Sw_Ptrs ; ES:DI = ptr to list of synonym ptrs - 17989 ; 08/06/2023 - 17990 ; (NUM_DIR_SWS = 16 for MSDOS 6.0) - 17991 ;mov cx,16 - 17992 ; 31/07/2024 - 17993 ;mov cx,18 ; PCDOS 7.1 COMMAND.COM - 17994 00001883 B91200 mov cx,NUM_DIR_SWS ; 14 ; CX = # of dir switches in list - 17995 00001886 FC cld ; scan direction = upward - 17996 00001887 F2AF repne scasw ; locate synonym ptr in list - 17997 ;sub di,offset TRANGROUP:Dir_Sw_Ptrs + 2 - 17998 00001889 81EF[0597] sub di,Dir_Sw_Ptrs+2 - 17999 - 18000 ; DI = index into word list of synonym ptrs - 18001 - 18002 0000188D 2EFF95[9518] call word [cs:di+SwHandler] ; use same index into call table - 18003 - 18004 00001892 5F pop di ; restore DI - 18005 00001893 59 pop cx ; restore CX + 17978 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 17979 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:16E2h + 17980 + 17981 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 17982 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1869h + 17983 ParseSwitch: + 17984 0000187B 51 push cx ; save CX + 17985 0000187C 57 push di ; save DI + 17986 + 17987 ;;mov ax,[bx].SynPtr ; AX = synonym ptr + 17988 ;mov ax,[bx+ResultBuffer.SynPtr] + 17989 0000187D 8B4702 mov ax,[bx+2] + 17990 ;mov di,offset TRANGROUP:Dir_Sw_Ptrs + 17991 00001880 BF[0397] mov di,Dir_Sw_Ptrs ; ES:DI = ptr to list of synonym ptrs + 17992 ; 08/06/2023 + 17993 ; (NUM_DIR_SWS = 16 for MSDOS 6.0) + 17994 ;mov cx,16 + 17995 ; 31/07/2024 + 17996 ;mov cx,18 ; PCDOS 7.1 COMMAND.COM + 17997 00001883 B91200 mov cx,NUM_DIR_SWS ; 14 ; CX = # of dir switches in list + 17998 00001886 FC cld ; scan direction = upward + 17999 00001887 F2AF repne scasw ; locate synonym ptr in list + 18000 ;sub di,offset TRANGROUP:Dir_Sw_Ptrs + 2 + 18001 00001889 81EF[0597] sub di,Dir_Sw_Ptrs+2 + 18002 + 18003 ; DI = index into word list of synonym ptrs + 18004 + 18005 0000188D 2EFF95[9518] call word [cs:di+SwHandler] ; use same index into call table 18006 - 18007 00001894 C3 retn - 18008 - 18009 ; --------------------------------------------------------------------------- - 18010 - 18011 ; Order in this table must correspond to order in Dir_Sw_Ptrs list. - 18012 ; Simple on/off switches must occur first in both lists, and must be - 18013 ; in order of option bits in Bits, starting with bit 0. - 18014 - 18015 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18016 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:16FCh + 18007 00001892 5F pop di ; restore DI + 18008 00001893 59 pop cx ; restore CX + 18009 + 18010 00001894 C3 retn + 18011 + 18012 ; --------------------------------------------------------------------------- + 18013 + 18014 ; Order in this table must correspond to order in Dir_Sw_Ptrs list. + 18015 ; Simple on/off switches must occur first in both lists, and must be + 18016 ; in order of option bits in Bits, starting with bit 0. 18017 - 18018 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18019 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1883h - 18020 SwHandler: - 18021 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 18022 - 18023 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 18024 %if 0 - 18025 ; ifdef DBLSPACE_HOOKS - 18026 dw OnOffSw ; /-C - 18027 dw ParseRatio ; /C[H] - 18028 ; ; endif - 18029 %endif - 18030 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 18031 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1922h - 18032 - 18033 00001895 [A717] dw OnOffSw ; /-W - 18034 00001897 [A717] dw OnOffSw ; /W - 18035 00001899 [A717] dw OnOffSw ; /-P - 18036 0000189B [A717] dw OnOffSw ; /P - 18037 0000189D [A717] dw OnOffSw ; /-S - 18038 0000189F [A717] dw OnOffSw ; /S - 18039 000018A1 [A717] dw OnOffSw ; /-B - 18040 000018A3 [A717] dw OnOffSw ; /B - 18041 000018A5 [A717] dw OnOffSw ; /-L ;M010 - 18042 000018A7 [A717] dw OnOffSw ; /L ;M010 - 18043 - 18044 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 18045 %if 1 - 18046 000018A9 [A717] dw OnOffSw ; /-Z - 18047 000018AB [A717] dw OnOffSw ; /Z - 18048 000018AD [A717] dw OnOffSw ; /-4 - 18049 000018AF [A717] dw OnOffSw ; /4 - 18050 %endif - 18051 000018B1 [A017] dw NoOrder ; /-O - 18052 000018B3 [2A18] dw ParseOrder ; /O - 18053 000018B5 [ED14] dw DefaultAttr ; /-A - 18054 000018B7 [C417] dw ParseAttr ; /A - 18055 - 18056 ; --------------------------------------------------------------------------- - 18057 - 18058 ;break - 18059 - 18060 ;*** UTILITY ROUTINES - 18061 ; ---------------------- + 18018 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18019 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:16FCh + 18020 + 18021 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18022 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1883h + 18023 SwHandler: + 18024 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 18025 + 18026 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 18027 %if 0 + 18028 ; ifdef DBLSPACE_HOOKS + 18029 dw OnOffSw ; /-C + 18030 dw ParseRatio ; /C[H] + 18031 ; ; endif + 18032 %endif + 18033 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 18034 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1922h + 18035 + 18036 00001895 [A717] dw OnOffSw ; /-W + 18037 00001897 [A717] dw OnOffSw ; /W + 18038 00001899 [A717] dw OnOffSw ; /-P + 18039 0000189B [A717] dw OnOffSw ; /P + 18040 0000189D [A717] dw OnOffSw ; /-S + 18041 0000189F [A717] dw OnOffSw ; /S + 18042 000018A1 [A717] dw OnOffSw ; /-B + 18043 000018A3 [A717] dw OnOffSw ; /B + 18044 000018A5 [A717] dw OnOffSw ; /-L ;M010 + 18045 000018A7 [A717] dw OnOffSw ; /L ;M010 + 18046 + 18047 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 18048 %if 1 + 18049 000018A9 [A717] dw OnOffSw ; /-Z + 18050 000018AB [A717] dw OnOffSw ; /Z + 18051 000018AD [A717] dw OnOffSw ; /-4 + 18052 000018AF [A717] dw OnOffSw ; /4 + 18053 %endif + 18054 000018B1 [A017] dw NoOrder ; /-O + 18055 000018B3 [2A18] dw ParseOrder ; /O + 18056 000018B5 [ED14] dw DefaultAttr ; /-A + 18057 000018B7 [C417] dw ParseAttr ; /A + 18058 + 18059 ; --------------------------------------------------------------------------- + 18060 + 18061 ;break 18062 - 18063 ; --------------------------------------------------------------------------- - 18064 - 18065 ;*** ChangeDir - change directory on target drive - 18066 ; - 18067 ; ENTRY FCB contains drive # - 18068 ; DS:DX = ptr to ASCIIZ string w/o drive specifier + 18063 ;*** UTILITY ROUTINES + 18064 ; ---------------------- + 18065 + 18066 ; --------------------------------------------------------------------------- + 18067 + 18068 ;*** ChangeDir - change directory on target drive 18069 ; - 18070 ; EXIT Changed current directory on drive - 18071 ; - 18072 ; If error, - 18073 ; CY = set - 18074 ; DOS Get Extended Error call will get error - 18075 ; - 18076 ; USED AX,DX,SI,DI - 18077 ; - 18078 ; EFFECTS - 18079 ; - 18080 ; DirBuf is used to build "d:string". - 18081 - 18082 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18083 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1718h + 18070 ; ENTRY FCB contains drive # + 18071 ; DS:DX = ptr to ASCIIZ string w/o drive specifier + 18072 ; + 18073 ; EXIT Changed current directory on drive + 18074 ; + 18075 ; If error, + 18076 ; CY = set + 18077 ; DOS Get Extended Error call will get error + 18078 ; + 18079 ; USED AX,DX,SI,DI + 18080 ; + 18081 ; EFFECTS + 18082 ; + 18083 ; DirBuf is used to build "d:string". 18084 - 18085 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18086 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:18A3h + 18085 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18086 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1718h 18087 - 18088 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 18089 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1946h - 18090 ChangeDir: - 18091 ;mov di,offset TRANGROUP:DirBuf - 18092 000018B9 BF[399D] mov di,DIRBUF - 18093 000018BC E8D003 call GetDriveLtr ; AX = "d:" - 18094 000018BF AB stosw ; put drive specifier in buffer - 18095 000018C0 89D6 mov si,dx ; SI = ptr to argument string - 18096 cdLoop: - 18097 000018C2 AC lodsb - 18098 000018C3 AA stosb ; move byte to buffer - 18099 000018C4 08C0 or al,al - 18100 000018C6 75FA jne short cdLoop ; continue until null transferred - 18101 - 18102 ;mov dx,offset TRANGROUP:DirBuf - 18103 000018C8 BA[399D] mov dx,DIRBUF ; DX = ptr to "d:string" - 18104 ;mov ah,CHDir - 18105 000018CB B43B mov ah,3Bh - 18106 000018CD CD21 int 21h ; change directory - 18107 000018CF C3 retn ; return what CHDIR returns - 18108 - 18109 ; --------------------------------------------------------------------------- - 18110 - 18111 ;*** CmpAscz - compare two ASCIIZ strings alphanumerically - 18112 ; - 18113 ; ENTRY DS:SI = ptr to one ASCIIZ string - 18114 ; ES:DI = ptr to another ASCIIZ string + 18088 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18089 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:18A3h + 18090 + 18091 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 18092 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1946h + 18093 ChangeDir: + 18094 ;mov di,offset TRANGROUP:DirBuf + 18095 000018B9 BF[399D] mov di,DIRBUF + 18096 000018BC E8D003 call GetDriveLtr ; AX = "d:" + 18097 000018BF AB stosw ; put drive specifier in buffer + 18098 000018C0 89D6 mov si,dx ; SI = ptr to argument string + 18099 cdLoop: + 18100 000018C2 AC lodsb + 18101 000018C3 AA stosb ; move byte to buffer + 18102 000018C4 08C0 or al,al + 18103 000018C6 75FA jne short cdLoop ; continue until null transferred + 18104 + 18105 ;mov dx,offset TRANGROUP:DirBuf + 18106 000018C8 BA[399D] mov dx,DIRBUF ; DX = ptr to "d:string" + 18107 ;mov ah,CHDir + 18108 000018CB B43B mov ah,3Bh + 18109 000018CD CD21 int 21h ; change directory + 18110 000018CF C3 retn ; return what CHDIR returns + 18111 + 18112 ; --------------------------------------------------------------------------- + 18113 + 18114 ;*** CmpAscz - compare two ASCIIZ strings alphanumerically 18115 ; - 18116 ; EXIT flags set after REPE CMPSB - 18117 ; - 18118 ; USED AL,CX,SI,DI - 18119 ; - 18120 ; NOTES - 18121 ; - 18122 ; Maximum run of comparison is length of DS:SI string. - 18123 ; This ensures that two identical strings followed by - 18124 ; random characters will compare correctly. - 18125 - 18126 ; 19/02/2023 - 18127 CmpAscz: - 18128 ; 07/06/2023 - 18129 000018D0 56 push si ; * - 18130 ; - 18131 000018D1 57 push di - 18132 - 18133 000018D2 89F7 mov di,si - 18134 000018D4 30C0 xor al,al - 18135 000018D6 B9FFFF mov cx,0FFFFh - 18136 000018D9 F2AE repne scasb - 18137 000018DB F7D1 not cx - 18138 - 18139 000018DD 5F pop di - 18140 000018DE F3A6 repe cmpsb + 18116 ; ENTRY DS:SI = ptr to one ASCIIZ string + 18117 ; ES:DI = ptr to another ASCIIZ string + 18118 ; + 18119 ; EXIT flags set after REPE CMPSB + 18120 ; + 18121 ; USED AL,CX,SI,DI + 18122 ; + 18123 ; NOTES + 18124 ; + 18125 ; Maximum run of comparison is length of DS:SI string. + 18126 ; This ensures that two identical strings followed by + 18127 ; random characters will compare correctly. + 18128 + 18129 ; 19/02/2023 + 18130 CmpAscz: + 18131 ; 07/06/2023 + 18132 000018D0 56 push si ; * + 18133 ; + 18134 000018D1 57 push di + 18135 + 18136 000018D2 89F7 mov di,si + 18137 000018D4 30C0 xor al,al + 18138 000018D6 B9FFFF mov cx,0FFFFh + 18139 000018D9 F2AE repne scasb + 18140 000018DB F7D1 not cx 18141 - 18142 ; 07/06/2023 - 18143 000018E0 5E pop si ; * - 18144 ; - 18145 000018E1 C3 retn - 18146 - 18147 ; --------------------------------------------------------------------------- - 18148 - 18149 ;*** CopyPathname - copy pathname to our buffer - 18150 ; - 18151 ; ENTRY BX = ptr to parse result buffer after system parser processed - 18152 ; a filespec + 18142 000018DD 5F pop di + 18143 000018DE F3A6 repe cmpsb + 18144 + 18145 ; 07/06/2023 + 18146 000018E0 5E pop si ; * + 18147 ; + 18148 000018E1 C3 retn + 18149 + 18150 ; --------------------------------------------------------------------------- + 18151 + 18152 ;*** CopyPathname - copy pathname to our buffer 18153 ; - 18154 ; EXIT nothing - 18155 ; - 18156 ; USED AX - 18157 ; - 18158 ; EFFECTS - 18159 ; - 18160 ; SrcBuf may contain a new pathname/filespec. - 18161 ; PathPos, PathCnt updated for new pathname. - 18162 - 18163 ; 19/02/2023 - 18164 CopyPathname: - 18165 000018E2 56 push si - 18166 ;;lds si,dword ptr [bx].ValuePtr ; load far ptr from result buffer - 18167 ;lds si,[bx+ResultBuffer.ValuePtr] - 18168 000018E3 C57704 lds si,[bx+4] - 18169 ;invoke Move_To_SrcBuf ; copy pathname to SrcBuf - 18170 000018E6 E8EF17 call Move_To_SrcBuf - 18171 000018E9 5E pop si - 18172 000018EA C3 retn - 18173 - 18174 ; --------------------------------------------------------------------------- - 18175 - 18176 ;*** CountFile - update counters with current file - 18177 ; - 18178 ; ENTRY BX = offset of entry in TPA buffer - 18179 ; - 18180 ; EXIT nothing - 18181 ; - 18182 ; USED AX,DX - 18183 ; - 18184 ; EFFECTS - 18185 ; - 18186 ; FileCnt, FileCntTotal, FileSiz, FileSizTotal are updated. - 18187 - 18188 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18189 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 18190 CountFile: - 18191 000018EB 06 push es ; save TRANGROUP seg addr - 18192 000018EC 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr - 18193 - 18194 000018F0 FF06[209C] inc word [FileCnt] ; # files this directory - 18195 000018F4 FF06[5E9C] inc word [FileCntTotal] ; # files total - 18196 000018F8 7504 jnz short cntf1 - 18197 000018FA FF06[609C] inc word [FileCntTotal+2] - 18198 cntf1: - 18199 ;mov ax,word ptr es:[bx].filesize - 18200 ; AX = low word of file size - 18201 ;mov dx,word ptr es:[bx].filesize+2 - 18202 ; DX = high word of file size - 18203 000018FE 268B4711 mov ax,[es:bx+17] ; [es:bx+EntryStruc.filesize] - 18204 00001902 268B5713 mov dx,[es:bx+19] ; [es:bx+EntryStruc.filesize+2] - 18205 00001906 0106[229C] add [FileSiz],ax - 18206 0000190A 1116[249C] adc [FileSiz+2],dx ; size of this directory - 18207 - 18208 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 18209 %if 1 - 18210 0000190E 8316[269C]00 adc word [FileSiz+4],0 - 18211 %endif - 18212 00001913 0106[629C] add [FileSizTotal],ax - 18213 00001917 1116[649C] adc [FileSizTotal+2],dx ; total size of files listed - 18214 - 18215 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - 18216 %if 1 - 18217 0000191B 8316[669C]00 adc word [FileSizTotal+4],0 - 18218 %endif - 18219 00001920 07 pop es ; ES = TRANGROUP seg addr again - 18220 dbRet: ; 19/02/2023 - 18221 00001921 C3 retn - 18222 - 18223 ; --------------------------------------------------------------------------- - 18224 - 18225 ;*** DisplayBare - display filename in bare format - 18226 ; - 18227 ; ENTRY BX = offset of entry in TPA buffer - 18228 ; - 18229 ; EXIT DX = # char's displayed, including dot - 18230 ; - 18231 ; USED AX,CX,SI,DI - 18232 ; - 18233 ; EFFECTS - 18234 ; - 18235 ; Filename is displayed in name.ext format, followed by cr/lf. - 18236 ; If /s is on, complete pathname is displayed. + 18154 ; ENTRY BX = ptr to parse result buffer after system parser processed + 18155 ; a filespec + 18156 ; + 18157 ; EXIT nothing + 18158 ; + 18159 ; USED AX + 18160 ; + 18161 ; EFFECTS + 18162 ; + 18163 ; SrcBuf may contain a new pathname/filespec. + 18164 ; PathPos, PathCnt updated for new pathname. + 18165 + 18166 ; 19/02/2023 + 18167 CopyPathname: + 18168 000018E2 56 push si + 18169 ;;lds si,dword ptr [bx].ValuePtr ; load far ptr from result buffer + 18170 ;lds si,[bx+ResultBuffer.ValuePtr] + 18171 000018E3 C57704 lds si,[bx+4] + 18172 ;invoke Move_To_SrcBuf ; copy pathname to SrcBuf + 18173 000018E6 E8EF17 call Move_To_SrcBuf + 18174 000018E9 5E pop si + 18175 000018EA C3 retn + 18176 + 18177 ; --------------------------------------------------------------------------- + 18178 + 18179 ;*** CountFile - update counters with current file + 18180 ; + 18181 ; ENTRY BX = offset of entry in TPA buffer + 18182 ; + 18183 ; EXIT nothing + 18184 ; + 18185 ; USED AX,DX + 18186 ; + 18187 ; EFFECTS + 18188 ; + 18189 ; FileCnt, FileCntTotal, FileSiz, FileSizTotal are updated. + 18190 + 18191 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18192 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 18193 CountFile: + 18194 000018EB 06 push es ; save TRANGROUP seg addr + 18195 000018EC 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr + 18196 + 18197 000018F0 FF06[209C] inc word [FileCnt] ; # files this directory + 18198 000018F4 FF06[5E9C] inc word [FileCntTotal] ; # files total + 18199 000018F8 7504 jnz short cntf1 + 18200 000018FA FF06[609C] inc word [FileCntTotal+2] + 18201 cntf1: + 18202 ;mov ax,word ptr es:[bx].filesize + 18203 ; AX = low word of file size + 18204 ;mov dx,word ptr es:[bx].filesize+2 + 18205 ; DX = high word of file size + 18206 000018FE 268B4711 mov ax,[es:bx+17] ; [es:bx+EntryStruc.filesize] + 18207 00001902 268B5713 mov dx,[es:bx+19] ; [es:bx+EntryStruc.filesize+2] + 18208 00001906 0106[229C] add [FileSiz],ax + 18209 0000190A 1116[249C] adc [FileSiz+2],dx ; size of this directory + 18210 + 18211 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 18212 %if 1 + 18213 0000190E 8316[269C]00 adc word [FileSiz+4],0 + 18214 %endif + 18215 00001913 0106[629C] add [FileSizTotal],ax + 18216 00001917 1116[649C] adc [FileSizTotal+2],dx ; total size of files listed + 18217 + 18218 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM + 18219 %if 1 + 18220 0000191B 8316[669C]00 adc word [FileSizTotal+4],0 + 18221 %endif + 18222 00001920 07 pop es ; ES = TRANGROUP seg addr again + 18223 dbRet: ; 19/02/2023 + 18224 00001921 C3 retn + 18225 + 18226 ; --------------------------------------------------------------------------- + 18227 + 18228 ;*** DisplayBare - display filename in bare format + 18229 ; + 18230 ; ENTRY BX = offset of entry in TPA buffer + 18231 ; + 18232 ; EXIT DX = # char's displayed, including dot + 18233 ; + 18234 ; USED AX,CX,SI,DI + 18235 ; + 18236 ; EFFECTS 18237 ; - 18238 ; NOTE - 18239 ; - 18240 ; Directory pseudofiles . and .. and suppressed in bare listing. - 18241 - 18242 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18243 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1775h + 18238 ; Filename is displayed in name.ext format, followed by cr/lf. + 18239 ; If /s is on, complete pathname is displayed. + 18240 ; + 18241 ; NOTE + 18242 ; + 18243 ; Directory pseudofiles . and .. and suppressed in bare listing. 18244 - 18245 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18246 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1900h + 18245 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18246 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1775h 18247 - 18248 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18249 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:19ADh + 18248 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18249 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1900h 18250 - 18251 DisplayBare: - 18252 ; Suppress . and .. files from bare listing. + 18251 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18252 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:19ADh 18253 - 18254 00001922 8CD9 mov cx,ds ; CX = saved TRANGROUP seg addr - 18255 00001924 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to file entry - 18256 ;assume ds:NOTHING - 18257 ;cmp ds:[bx].filename,'.' ; check 1st char of filename - 18258 00001928 807F012E cmp byte [bx+1],'.' ; [bx+EntrStruc.filename] - 18259 0000192C 8ED9 mov ds,cx ; DS = TRANGROUP seg addr again - 18260 ;assume ds:TRANGROUP - 18261 0000192E 74F1 je short dbRet ; it's . or .. - don't display - 18262 - 18263 ;;;test Bits,mask subd - 18264 ;;test word [_Bits],4 - 18265 ;test byte [_Bits],4 - 18266 ; 08/06/2023 - 18267 00001930 F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 - 18268 ; 01/08/2024 ; 4 ; PCDOS 7.1 - 18269 00001935 743C jz short dbNameExt ; not /s - display filename only - 18270 - 18271 ;invoke Build_Dir_String - 18272 00001937 E8C308 call build_dir_string - 18273 ;mov di,offset TRANGROUP:BwdBuf - 18274 0000193A BF[399D] mov di,BWDBUF ; ES:DI = ptr to dir string - 18275 - 18276 ;;;test Bits,mask lcase ;M010;check for lowercase option - 18277 ;;test word [_Bits],10h - 18278 ;test byte [_Bits],10h - 18279 ; 08/06/2023 - 18280 0000193D F606[8B9D]10 test byte [_Bits],mask.lcase ; 20h ; MSDOS 6.0 - 18281 ; 01/08/2024 ; 10h ; PCDOS 7.1 - 18282 ;jz @F ;M010;lowercase not needed - 18283 00001942 7405 jz short dbare1 - 18284 00001944 89FE mov si,di ;M010;DS:SI --> ASCIIZ string in BwdBuf - 18285 00001946 E89803 call LowercaseString ;M010;path string is in BwdBuf - 18286 dbare1: - 18287 ;@@: - 18288 ;xor al,al ; AL = 0 - 18289 ; 19/02/2023 - 18290 00001949 31C0 xor ax,ax - 18291 0000194B B9FFFF mov cx,0FFFFh - 18292 0000194E FC cld - 18293 0000194F F2AE repne scasb ; ES:DI = ptr to byte after null - 18294 00001951 4F dec di ; ES:DI = ptr to null byte - 18295 - 18296 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18297 %if 1 ; *! - 18298 ;ifdef DBCS - 18299 00001952 56 push si ; *! - 18300 00001953 57 push di - 18301 ;mov si,offset TRANGROUP:BwdBuf - 18302 00001954 BE[399D] mov si,BWDBUF - 18303 00001957 4F dec di - 18304 00001958 E8C911 call CheckDBCSTailByte - 18305 0000195B 5F pop di - 18306 ; 01/08/2024 - 18307 ;pop si ; *! - 18308 0000195C 7407 jz short dbTailByte ; if last char is double byte - 18309 ;endif - 18310 %endif - 18311 0000195E 26807DFF5C cmp byte [es:di-1],'\' - 18312 ;je @F - 18313 00001963 7403 je short dbare2 ; already terminated w/ '\' - 18314 - 18315 dbTailByte: ; 01/08/2024 - 18316 ;mov ax,'\' ; AX = '\',0 - 18317 00001965 B05C mov al,'\' - 18318 00001967 AB stosw ; add to dir string - 18319 ;@@: - 18320 dbare2: - 18321 ;;mov String_Ptr_2,offset TRANGROUP:BwdBuf - 18322 ;mov word [string_ptr_2],BWDBUF ; *! - 18323 ; 01/08/2024 - 18324 00001968 8936[A09D] mov [string_ptr_2],si ; BWDBUF ; *! - 18325 0000196C 5E pop si ; *! - 18326 ;mov dx,offset TRANGROUP:String_Buf_Ptr - 18327 0000196D BA[DF91] mov dx,string_buf_ptr - 18328 ;invoke Std_Printf ; display device & directory path - 18329 00001970 E8B53A call std_printf - 18330 dbNameExt: - 18331 00001973 E82D00 call DisplayDotForm ; display name.ext - 18332 ;invoke CrLf2 ; display cr/lf - 18333 00001976 E80010 call CRLF2 - 18334 ; 19/02/2023 - 18335 ;call UseLine ;M007;Allow /p with /b - 18336 ;dbRet: - 18337 ;retn - 18338 - 18339 ; 19/02/2023 - 18340 ;jmp short UseLine + 18254 DisplayBare: + 18255 ; Suppress . and .. files from bare listing. + 18256 + 18257 00001922 8CD9 mov cx,ds ; CX = saved TRANGROUP seg addr + 18258 00001924 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to file entry + 18259 ;assume ds:NOTHING + 18260 ;cmp ds:[bx].filename,'.' ; check 1st char of filename + 18261 00001928 807F012E cmp byte [bx+1],'.' ; [bx+EntrStruc.filename] + 18262 0000192C 8ED9 mov ds,cx ; DS = TRANGROUP seg addr again + 18263 ;assume ds:TRANGROUP + 18264 0000192E 74F1 je short dbRet ; it's . or .. - don't display + 18265 + 18266 ;;;test Bits,mask subd + 18267 ;;test word [_Bits],4 + 18268 ;test byte [_Bits],4 + 18269 ; 08/06/2023 + 18270 00001930 F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 + 18271 ; 01/08/2024 ; 4 ; PCDOS 7.1 + 18272 00001935 743C jz short dbNameExt ; not /s - display filename only + 18273 + 18274 ;invoke Build_Dir_String + 18275 00001937 E8C308 call build_dir_string + 18276 ;mov di,offset TRANGROUP:BwdBuf + 18277 0000193A BF[399D] mov di,BWDBUF ; ES:DI = ptr to dir string + 18278 + 18279 ;;;test Bits,mask lcase ;M010;check for lowercase option + 18280 ;;test word [_Bits],10h + 18281 ;test byte [_Bits],10h + 18282 ; 08/06/2023 + 18283 0000193D F606[8B9D]10 test byte [_Bits],mask.lcase ; 20h ; MSDOS 6.0 + 18284 ; 01/08/2024 ; 10h ; PCDOS 7.1 + 18285 ;jz @F ;M010;lowercase not needed + 18286 00001942 7405 jz short dbare1 + 18287 00001944 89FE mov si,di ;M010;DS:SI --> ASCIIZ string in BwdBuf + 18288 00001946 E89803 call LowercaseString ;M010;path string is in BwdBuf + 18289 dbare1: + 18290 ;@@: + 18291 ;xor al,al ; AL = 0 + 18292 ; 19/02/2023 + 18293 00001949 31C0 xor ax,ax + 18294 0000194B B9FFFF mov cx,0FFFFh + 18295 0000194E FC cld + 18296 0000194F F2AE repne scasb ; ES:DI = ptr to byte after null + 18297 00001951 4F dec di ; ES:DI = ptr to null byte + 18298 + 18299 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18300 %if 1 ; *! + 18301 ;ifdef DBCS + 18302 00001952 56 push si ; *! + 18303 00001953 57 push di + 18304 ;mov si,offset TRANGROUP:BwdBuf + 18305 00001954 BE[399D] mov si,BWDBUF + 18306 00001957 4F dec di + 18307 00001958 E8C911 call CheckDBCSTailByte + 18308 0000195B 5F pop di + 18309 ; 01/08/2024 + 18310 ;pop si ; *! + 18311 0000195C 7407 jz short dbTailByte ; if last char is double byte + 18312 ;endif + 18313 %endif + 18314 0000195E 26807DFF5C cmp byte [es:di-1],'\' + 18315 ;je @F + 18316 00001963 7403 je short dbare2 ; already terminated w/ '\' + 18317 + 18318 dbTailByte: ; 01/08/2024 + 18319 ;mov ax,'\' ; AX = '\',0 + 18320 00001965 B05C mov al,'\' + 18321 00001967 AB stosw ; add to dir string + 18322 ;@@: + 18323 dbare2: + 18324 ;;mov String_Ptr_2,offset TRANGROUP:BwdBuf + 18325 ;mov word [string_ptr_2],BWDBUF ; *! + 18326 ; 01/08/2024 + 18327 00001968 8936[A09D] mov [string_ptr_2],si ; BWDBUF ; *! + 18328 0000196C 5E pop si ; *! + 18329 ;mov dx,offset TRANGROUP:String_Buf_Ptr + 18330 0000196D BA[DF91] mov dx,string_buf_ptr + 18331 ;invoke Std_Printf ; display device & directory path + 18332 00001970 E8B53A call std_printf + 18333 dbNameExt: + 18334 00001973 E82D00 call DisplayDotForm ; display name.ext + 18335 ;invoke CrLf2 ; display cr/lf + 18336 00001976 E80010 call CRLF2 + 18337 ; 19/02/2023 + 18338 ;call UseLine ;M007;Allow /p with /b + 18339 ;dbRet: + 18340 ;retn 18341 - 18342 ; --------------------------------------------------------------------------- - 18343 - 18344 ;*** UseLine - use a display line, start a new page if none left - 18345 ; - 18346 ; ENTRY nothing - 18347 ; - 18348 ; EXIT nothing - 18349 ; - 18350 ; USED flags - 18351 - 18352 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18353 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A04h + 18342 ; 19/02/2023 + 18343 ;jmp short UseLine + 18344 + 18345 ; --------------------------------------------------------------------------- + 18346 + 18347 ;*** UseLine - use a display line, start a new page if none left + 18348 ; + 18349 ; ENTRY nothing + 18350 ; + 18351 ; EXIT nothing + 18352 ; + 18353 ; USED flags 18354 - 18355 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18356 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D58h - 18357 UseLine: - 18358 00001979 FF0E[1E9C] dec word [LeftOnPage] - 18359 0000197D 833E[1E9C]02 cmp word [LeftOnPage],2 - 18360 00001982 771E ja short ulRet - 18361 ; 19/02/2023 - 18362 ;call EndPage - 18363 ;ulRet: - 18364 ;retn - 18365 - 18366 ; 19/02/2023 - 18367 ;jmp short EndPage + 18355 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18356 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A04h + 18357 + 18358 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18359 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D58h + 18360 UseLine: + 18361 00001979 FF0E[1E9C] dec word [LeftOnPage] + 18362 0000197D 833E[1E9C]02 cmp word [LeftOnPage],2 + 18363 00001982 771E ja short ulRet + 18364 ; 19/02/2023 + 18365 ;call EndPage + 18366 ;ulRet: + 18367 ;retn 18368 - 18369 ; --------------------------------------------------------------------------- - 18370 - 18371 ;*** EndPage - end the current display page - 18372 ; - 18373 ; ENTRY LeftOnPage = # lines left on display page - 18374 ; Current directory (on selected drive) is the one being listed - 18375 ; Bits contains /p setting - 18376 ; - 18377 ; EXIT LeftOnPage = # lines left for next page - 18378 ; - 18379 ; USED AX,DX - 18380 ; - 18381 ; EFFECTS - 18382 ; - 18383 ; Pause is invoked to display a message and wait for a keystroke. - 18384 ; BwdBuf (same as DirBuf) used to build directory string. - 18385 - 18386 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18387 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19B8h + 18369 ; 19/02/2023 + 18370 ;jmp short EndPage + 18371 + 18372 ; --------------------------------------------------------------------------- + 18373 + 18374 ;*** EndPage - end the current display page + 18375 ; + 18376 ; ENTRY LeftOnPage = # lines left on display page + 18377 ; Current directory (on selected drive) is the one being listed + 18378 ; Bits contains /p setting + 18379 ; + 18380 ; EXIT LeftOnPage = # lines left for next page + 18381 ; + 18382 ; USED AX,DX + 18383 ; + 18384 ; EFFECTS + 18385 ; + 18386 ; Pause is invoked to display a message and wait for a keystroke. + 18387 ; BwdBuf (same as DirBuf) used to build directory string. 18388 - 18389 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18390 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1BADh + 18389 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18390 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19B8h 18391 - 18392 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18393 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D0Ch - 18394 EndPage: - 18395 ;;;test Bits,mask pagd - 18396 ;;test word [_Bits],2 - 18397 ;test byte [_Bits],2 - 18398 ; 08/06/2023 - 18399 00001984 F606[8B9D]02 test byte [_Bits],mask.pagd ; 4 ; MSDOS 6.0 - 18400 ; 01/08/2024 ; 2 ; PCDOS 7.1 - 18401 00001989 7410 jz short epNew ; paged display isn't enabled - 18402 - 18403 0000198B 53 push bx ; save BX - 18404 0000198C 51 push cx ; save CX + 18392 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18393 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1BADh + 18394 + 18395 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18396 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D0Ch + 18397 EndPage: + 18398 ;;;test Bits,mask pagd + 18399 ;;test word [_Bits],2 + 18400 ;test byte [_Bits],2 + 18401 ; 08/06/2023 + 18402 00001984 F606[8B9D]02 test byte [_Bits],mask.pagd ; 4 ; MSDOS 6.0 + 18403 ; 01/08/2024 ; 2 ; PCDOS 7.1 + 18404 00001989 7410 jz short epNew ; paged display isn't enabled 18405 - 18406 ;invoke Pause ; "Press any key to continue..." - 18407 0000198D E87003 call PAUSE + 18406 0000198B 53 push bx ; save BX + 18407 0000198C 51 push cx ; save CX 18408 - 18409 ;invoke Build_Dir_String - 18410 00001990 E86A08 call build_dir_string - 18411 ;mov dx,offset TRANGROUP:DirCont_Ptr - 18412 00001993 BA[9B92] mov dx,dircont_ptr - 18413 ;invoke Printf_Crlf ; "(continuing )", cr/lf - 18414 00001996 E8813A call Printf_Crlf - 18415 - 18416 00001999 59 pop cx ; restore CX - 18417 0000199A 5B pop bx ; restore BX - 18418 epNew: - 18419 0000199B A1[179F] mov ax,[LinPerPag] ; AX = # lines per page - 18420 0000199E 48 dec ax ; AX = # lines till next EndPage - 18421 0000199F A3[1E9C] mov [LeftOnPage],ax ; LeftOnPage = countdown variable - 18422 ulRet: - 18423 ; 19/02/2023 - 18424 000019A2 C3 retn - 18425 - 18426 ; --------------------------------------------------------------------------- - 18427 - 18428 ;*** DisplayDotForm - display filename in compressed dot format - 18429 ; - 18430 ; Display name.ext, with no cr/lf's. Dot is displayed only - 18431 ; if the filename has a nonblank extension. + 18409 ;invoke Pause ; "Press any key to continue..." + 18410 0000198D E87003 call PAUSE + 18411 + 18412 ;invoke Build_Dir_String + 18413 00001990 E86A08 call build_dir_string + 18414 ;mov dx,offset TRANGROUP:DirCont_Ptr + 18415 00001993 BA[9B92] mov dx,dircont_ptr + 18416 ;invoke Printf_Crlf ; "(continuing )", cr/lf + 18417 00001996 E8813A call Printf_Crlf + 18418 + 18419 00001999 59 pop cx ; restore CX + 18420 0000199A 5B pop bx ; restore BX + 18421 epNew: + 18422 0000199B A1[179F] mov ax,[LinPerPag] ; AX = # lines per page + 18423 0000199E 48 dec ax ; AX = # lines till next EndPage + 18424 0000199F A3[1E9C] mov [LeftOnPage],ax ; LeftOnPage = countdown variable + 18425 ulRet: + 18426 ; 19/02/2023 + 18427 000019A2 C3 retn + 18428 + 18429 ; --------------------------------------------------------------------------- + 18430 + 18431 ;*** DisplayDotForm - display filename in compressed dot format 18432 ; - 18433 ; ENTRY BX = offset of entry in TPA buffer - 18434 ; - 18435 ; EXIT DX = # char's displayed, including dot - 18436 ; - 18437 ; USED AX,CX,SI,DI - 18438 ; - 18439 ; EFFECTS - 18440 ; - 18441 ; Filename is displayed in name.ext format. - 18442 ; - 18443 ; NOTE - 18444 ; - 18445 ; We allow for bogus filenames that have blanks embedded - 18446 ; in the name or extension. - 18447 - 18448 ; Bugbug: might be a good performance gain if we buffered - 18449 ; up the output and used DOS function 9. + 18433 ; Display name.ext, with no cr/lf's. Dot is displayed only + 18434 ; if the filename has a nonblank extension. + 18435 ; + 18436 ; ENTRY BX = offset of entry in TPA buffer + 18437 ; + 18438 ; EXIT DX = # char's displayed, including dot + 18439 ; + 18440 ; USED AX,CX,SI,DI + 18441 ; + 18442 ; EFFECTS + 18443 ; + 18444 ; Filename is displayed in name.ext format. + 18445 ; + 18446 ; NOTE + 18447 ; + 18448 ; We allow for bogus filenames that have blanks embedded + 18449 ; in the name or extension. 18450 - 18451 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18452 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:17C8h + 18451 ; Bugbug: might be a good performance gain if we buffered + 18452 ; up the output and used DOS function 9. 18453 - 18454 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18455 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1953h + 18454 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18455 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:17C8h 18456 - 18457 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18458 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1A0Dh - 18459 DisplayDotForm: - 18460 000019A3 1E push ds ; save TRANGROUP seg addr - 18461 000019A4 06 push es ; save ES - 18462 000019A5 2EA1[F79B] mov ax,[cs:TPA] ; AX = TPA seg addr - 18463 000019A9 8ED8 mov ds,ax ; DS:BX = ptr to entry - 18464 ;assume ds:nothing - 18465 000019AB 8EC0 mov es,ax ; ES:BX = ptr to entry - 18466 - 18467 ; 08/06/2023 - 18468 ;mov di,bx ; ES:DI = ptr to entry - 18469 ;;;add di,filename + size filename - 1 - 18470 ;add di,8 ; 1+8-1 ; ES:DI = ptr to last char in name field - 18471 ;;mov cx,size filename ; CX = length of name field - 18472 ;mov cx,8 - 18473 ; 08/06/2023 - 18474 000019AD B90800 mov cx,8 - 18475 000019B0 89CF mov di,cx - 18476 000019B2 01DF add di,bx - 18477 - 18478 000019B4 B020 mov al,' ' - 18479 000019B6 FD std ; scan down - 18480 000019B7 F3AE repe scasb ; scan for nonblank - 18481 - 18482 ; Assume file name has at least one character. - 18483 - 18484 000019B9 41 inc cx ; CX = # chars in name - 18485 000019BA 89CA mov dx,cx ; DX = # chars to be displayed + 18457 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18458 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1953h + 18459 + 18460 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18461 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1A0Dh + 18462 DisplayDotForm: + 18463 000019A3 1E push ds ; save TRANGROUP seg addr + 18464 000019A4 06 push es ; save ES + 18465 000019A5 2EA1[F79B] mov ax,[cs:TPA] ; AX = TPA seg addr + 18466 000019A9 8ED8 mov ds,ax ; DS:BX = ptr to entry + 18467 ;assume ds:nothing + 18468 000019AB 8EC0 mov es,ax ; ES:BX = ptr to entry + 18469 + 18470 ; 08/06/2023 + 18471 ;mov di,bx ; ES:DI = ptr to entry + 18472 ;;;add di,filename + size filename - 1 + 18473 ;add di,8 ; 1+8-1 ; ES:DI = ptr to last char in name field + 18474 ;;mov cx,size filename ; CX = length of name field + 18475 ;mov cx,8 + 18476 ; 08/06/2023 + 18477 000019AD B90800 mov cx,8 + 18478 000019B0 89CF mov di,cx + 18479 000019B2 01DF add di,bx + 18480 + 18481 000019B4 B020 mov al,' ' + 18482 000019B6 FD std ; scan down + 18483 000019B7 F3AE repe scasb ; scan for nonblank + 18484 + 18485 ; Assume file name has at least one character. 18486 - 18487 000019BC 89DE mov si,bx ; DS:SI = ptr to entry - 18488 ;;add si,filename ; DS:SI = ptr to name - 18489 ;add si,1 - 18490 ; ; add si,EntryStruc.filename - 18491 ; 25/04/2023 - 18492 000019BE 46 inc si - 18493 NextNameChar: - 18494 000019BF FC cld - 18495 000019C0 AC lodsb ; AL = next char - 18496 - 18497 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18498 %if 1 - 18499 ;ifdef DBCS - 18500 ;invoke testkanj - 18501 ;jz @f ; if this is not lead byte - 18502 000019C1 E89D0D call testkanj - 18503 000019C4 7409 jz short ddf3 - 18504 ;invoke Print_Char ; display lead byte - 18505 000019C6 E8E507 call PRINT_CHAR - 18506 000019C9 49 dec cx - 18507 000019CA 7413 jz short ExtChar ; if this is end - 18508 000019CC AC lodsb ; get tail byte - 18509 ;jmp short NameChar10 ; display tail byte - 18510 000019CD EB0B jmp short ddf1 - 18511 ;@@: - 18512 ddf3: - 18513 ;endif - 18514 %endif - 18515 ;;;test Bits,mask lcase ;M010;check for lowercase option - 18516 ;;test word [ss:_Bits],10h - 18517 ;test byte [ss:_Bits],10h - 18518 ; 08/06/2023 - 18519 000019CF 36F606[8B9D]10 test byte [ss:_Bits],mask.lcase ; 20h ; MSDOS 6.0 - 18520 ; 01/08/2024 ; 10h ; PCDOS 7.1 - 18521 ;jz short @F ;M010;lowercase not required - 18522 000019D5 7403 jz short ddf1 - 18523 000019D7 E8FC02 call LowerCase ;M010;filename char is in AL - 18524 - 18525 ;NameChar10: - 18526 ddf1: - 18527 ;@@: - 18528 ;invoke Print_Char ; display it - 18529 000019DA E8D107 call PRINT_CHAR - 18530 000019DD E2E0 loop NextNameChar - 18531 - 18532 ExtChar: ; 01/08/2024 - 18533 - 18534 ; Now do extension. - 18535 - 18536 000019DF 89DF mov di,bx ; ES:DI = ptr to entry - 18537 ;add di,fileext + size fileext - 1 - 18538 000019E1 83C70B add di,11 ; 9+3-1 ; ES:DI = ptr to last char in ext field - 18539 ;mov cx,size fileext ; CX = length of ext field - 18540 000019E4 B90300 mov cx,3 - 18541 000019E7 B020 mov al,' ' - 18542 000019E9 FD std ; scan down - 18543 000019EA F3AE repe scasb ; scan for nonblank - 18544 000019EC 742E je short ddDone ; no nonblank chars in ext - 18545 - 18546 000019EE 41 inc cx ; CX = # chars in ext - 18547 000019EF 01CA add dx,cx ; DX = total # chars to be displayed - 18548 000019F1 42 inc dx ; including dot - 18549 - 18550 000019F2 B02E mov al,'.' - 18551 000019F4 E8B707 call PRINT_CHAR - 18552 000019F7 89DE mov si,bx ; DS:SI = ptr to entry - 18553 ;add si,fileext ; DS:SI = ptr to ext - 18554 000019F9 83C609 add si,9 - 18555 - 18556 NextExtChar: - 18557 000019FC FC cld - 18558 000019FD AC lodsb ; AL = next char - 18559 - 18560 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18561 %if 1 - 18562 ;ifdef DBCS - 18563 ;invoke testkanj - 18564 ;jz @f ; if this is not lead byte - 18565 000019FE E8600D call testkanj - 18566 00001A01 7409 jz short ddf4 - 18567 ;invoke Print_Char ; display lead byte - 18568 00001A03 E8A807 call PRINT_CHAR - 18569 00001A06 49 dec cx - 18570 00001A07 7413 jz short ddDone ; if this is end - 18571 00001A09 AC lodsb ; get tail byte - 18572 ;jmp short ExtChar10 ; display tail byte - 18573 00001A0A EB0B jmp short ddf2 - 18574 ;@@: - 18575 ddf4: - 18576 ;endif - 18577 %endif - 18578 ;;;test CS:Bits,mask lcase ;M010;check for lowercase option - 18579 ;;test word [cs:_Bits],10h - 18580 ;test byte [cs:_Bits],10h - 18581 ; 08/06/2023 - 18582 00001A0C 2EF606[8B9D]10 test byte [cs:_Bits],mask.lcase ; 20h ; MSDOS 6.0 - 18583 ; 01/08/2024 ; 10h ; PCDOS 7.1 - 18584 ;jz short @F ;M010;lowercase not required - 18585 00001A12 7403 jz short ddf2 - 18586 00001A14 E8BF02 call LowerCase ;M010;fileext char is in AL - 18587 ;@@: - 18588 ddf2: - 18589 ;invoke Print_Char ; display it - 18590 00001A17 E89407 call PRINT_CHAR - 18591 00001A1A E2E0 loop NextExtChar - 18592 ddDone: - 18593 00001A1C 07 pop es ; restore ES - 18594 00001A1D 1F pop ds ; DS = TRANGROUP seg addr again - 18595 ;assume ds:TRANGROUP - 18596 00001A1E FC cld ; leave direction flag = up - 18597 00001A1F C3 retn - 18598 - 18599 ; --------------------------------------------------------------------------- - 18600 - 18601 ;*** DisplayFile - display file entry, update counters - 18602 ; - 18603 ; ENTRY BX = offset of entry in TPA buffer - 18604 ; Bits contains /w, /p settings + 18487 000019B9 41 inc cx ; CX = # chars in name + 18488 000019BA 89CA mov dx,cx ; DX = # chars to be displayed + 18489 + 18490 000019BC 89DE mov si,bx ; DS:SI = ptr to entry + 18491 ;;add si,filename ; DS:SI = ptr to name + 18492 ;add si,1 + 18493 ; ; add si,EntryStruc.filename + 18494 ; 25/04/2023 + 18495 000019BE 46 inc si + 18496 NextNameChar: + 18497 000019BF FC cld + 18498 000019C0 AC lodsb ; AL = next char + 18499 + 18500 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18501 %if 1 + 18502 ;ifdef DBCS + 18503 ;invoke testkanj + 18504 ;jz @f ; if this is not lead byte + 18505 000019C1 E89D0D call testkanj + 18506 000019C4 7409 jz short ddf3 + 18507 ;invoke Print_Char ; display lead byte + 18508 000019C6 E8E507 call PRINT_CHAR + 18509 000019C9 49 dec cx + 18510 000019CA 7413 jz short ExtChar ; if this is end + 18511 000019CC AC lodsb ; get tail byte + 18512 ;jmp short NameChar10 ; display tail byte + 18513 000019CD EB0B jmp short ddf1 + 18514 ;@@: + 18515 ddf3: + 18516 ;endif + 18517 %endif + 18518 ;;;test Bits,mask lcase ;M010;check for lowercase option + 18519 ;;test word [ss:_Bits],10h + 18520 ;test byte [ss:_Bits],10h + 18521 ; 08/06/2023 + 18522 000019CF 36F606[8B9D]10 test byte [ss:_Bits],mask.lcase ; 20h ; MSDOS 6.0 + 18523 ; 01/08/2024 ; 10h ; PCDOS 7.1 + 18524 ;jz short @F ;M010;lowercase not required + 18525 000019D5 7403 jz short ddf1 + 18526 000019D7 E8FC02 call LowerCase ;M010;filename char is in AL + 18527 + 18528 ;NameChar10: + 18529 ddf1: + 18530 ;@@: + 18531 ;invoke Print_Char ; display it + 18532 000019DA E8D107 call PRINT_CHAR + 18533 000019DD E2E0 loop NextNameChar + 18534 + 18535 ExtChar: ; 01/08/2024 + 18536 + 18537 ; Now do extension. + 18538 + 18539 000019DF 89DF mov di,bx ; ES:DI = ptr to entry + 18540 ;add di,fileext + size fileext - 1 + 18541 000019E1 83C70B add di,11 ; 9+3-1 ; ES:DI = ptr to last char in ext field + 18542 ;mov cx,size fileext ; CX = length of ext field + 18543 000019E4 B90300 mov cx,3 + 18544 000019E7 B020 mov al,' ' + 18545 000019E9 FD std ; scan down + 18546 000019EA F3AE repe scasb ; scan for nonblank + 18547 000019EC 742E je short ddDone ; no nonblank chars in ext + 18548 + 18549 000019EE 41 inc cx ; CX = # chars in ext + 18550 000019EF 01CA add dx,cx ; DX = total # chars to be displayed + 18551 000019F1 42 inc dx ; including dot + 18552 + 18553 000019F2 B02E mov al,'.' + 18554 000019F4 E8B707 call PRINT_CHAR + 18555 000019F7 89DE mov si,bx ; DS:SI = ptr to entry + 18556 ;add si,fileext ; DS:SI = ptr to ext + 18557 000019F9 83C609 add si,9 + 18558 + 18559 NextExtChar: + 18560 000019FC FC cld + 18561 000019FD AC lodsb ; AL = next char + 18562 + 18563 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18564 %if 1 + 18565 ;ifdef DBCS + 18566 ;invoke testkanj + 18567 ;jz @f ; if this is not lead byte + 18568 000019FE E8600D call testkanj + 18569 00001A01 7409 jz short ddf4 + 18570 ;invoke Print_Char ; display lead byte + 18571 00001A03 E8A807 call PRINT_CHAR + 18572 00001A06 49 dec cx + 18573 00001A07 7413 jz short ddDone ; if this is end + 18574 00001A09 AC lodsb ; get tail byte + 18575 ;jmp short ExtChar10 ; display tail byte + 18576 00001A0A EB0B jmp short ddf2 + 18577 ;@@: + 18578 ddf4: + 18579 ;endif + 18580 %endif + 18581 ;;;test CS:Bits,mask lcase ;M010;check for lowercase option + 18582 ;;test word [cs:_Bits],10h + 18583 ;test byte [cs:_Bits],10h + 18584 ; 08/06/2023 + 18585 00001A0C 2EF606[8B9D]10 test byte [cs:_Bits],mask.lcase ; 20h ; MSDOS 6.0 + 18586 ; 01/08/2024 ; 10h ; PCDOS 7.1 + 18587 ;jz short @F ;M010;lowercase not required + 18588 00001A12 7403 jz short ddf2 + 18589 00001A14 E8BF02 call LowerCase ;M010;fileext char is in AL + 18590 ;@@: + 18591 ddf2: + 18592 ;invoke Print_Char ; display it + 18593 00001A17 E89407 call PRINT_CHAR + 18594 00001A1A E2E0 loop NextExtChar + 18595 ddDone: + 18596 00001A1C 07 pop es ; restore ES + 18597 00001A1D 1F pop ds ; DS = TRANGROUP seg addr again + 18598 ;assume ds:TRANGROUP + 18599 00001A1E FC cld ; leave direction flag = up + 18600 00001A1F C3 retn + 18601 + 18602 ; --------------------------------------------------------------------------- + 18603 + 18604 ;*** DisplayFile - display file entry, update counters 18605 ; - 18606 ; EXIT nothing - 18607 ; - 18608 ; USED AX,CX,DX,SI,DI,BP - 18609 ; - 18610 ; EFFECTS - 18611 ; - 18612 ; Entry is displayed. - 18613 ; If not /b, - 18614 ; Cursor is left at end of entry on screen. - 18615 ; FileCnt, FileCntTotal, FileSiz, FileSizTotal are updated. - 18616 ; If /b, - 18617 ; Cursor is left at beginning of next line. - 18618 ; Cnt's and Siz's aren't updated. - 18619 - 18620 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18621 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:182Eh - 18622 - 18623 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18624 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:19B9h - 18625 - 18626 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18627 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1A8Fh + 18606 ; ENTRY BX = offset of entry in TPA buffer + 18607 ; Bits contains /w, /p settings + 18608 ; + 18609 ; EXIT nothing + 18610 ; + 18611 ; USED AX,CX,DX,SI,DI,BP + 18612 ; + 18613 ; EFFECTS + 18614 ; + 18615 ; Entry is displayed. + 18616 ; If not /b, + 18617 ; Cursor is left at end of entry on screen. + 18618 ; FileCnt, FileCntTotal, FileSiz, FileSizTotal are updated. + 18619 ; If /b, + 18620 ; Cursor is left at beginning of next line. + 18621 ; Cnt's and Siz's aren't updated. + 18622 + 18623 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18624 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:182Eh + 18625 + 18626 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18627 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:19B9h 18628 - 18629 DisplayFile: - 18630 ;;;test Bits,mask bare - 18631 ;;test word [_Bits],8 - 18632 ;test byte [_Bits],8 - 18633 ; 08/06/2023 - 18634 00001A20 F606[8B9D]08 test byte [_Bits],mask.bare ; 16 ; MSDOS 6.0 - 18635 ; 01/08/2024 ; 8 ; PCDOS 7.1 - 18636 00001A25 7405 jz short dfNorm ; not /b - do normal display - 18637 - 18638 00001A27 E8F8FE call DisplayBare ; display file in bare format - 18639 00001A2A EB18 jmp short dfRet - 18640 dfNorm: - 18641 00001A2C E87800 call DisplayNext ; pos'n cursor for next entry - 18642 ;;;test Bits,mask wide - 18643 ;;test word [_Bits],1 - 18644 ;test byte [_Bits],1 - 18645 ; 08/06/2023 - 18646 00001A2F F606[8B9D]01 test byte [_Bits],mask.wide ; 2 ; MSDOS 6.0 - 18647 ; 01/08/2024 ; 1 ; PCDOS 7.1 - 18648 00001A34 7405 jz short dfFull ; full format - 18649 00001A36 E82A02 call DisplayWide ; wide format - 18650 00001A39 EB06 jmp short dfCnt - 18651 dfFull: - 18652 00001A3B E83400 call DisplayName ; display filename & extension - 18653 00001A3E E88D00 call DisplayTheRest ; display size, date, time - 18654 - 18655 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18656 %if 0 - 18657 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 18658 ; MSDOS 6.0 - 18659 ;ifdef DBLSPACE_HOOKS - 18660 ;;test Bits,mask cratio - 18661 ;test word [_Bits],1 - 18662 test byte [_Bits],mask.cratio - 18663 ; display compression ratio - 18664 jz short dfCnt - 18665 call DisplayCompRatio - 18666 ;endif - 18667 %endif - 18668 - 18669 dfCnt: - 18670 00001A41 E8A7FE call CountFile ; update file counters - 18671 dfRet: - 18672 dhRet: ; 19/02/2023 - 18673 00001A44 C3 retn - 18674 - 18675 ; --------------------------------------------------------------------------- - 18676 - 18677 ;*** DisplayHeader - display directory header of working directory - 18678 ; - 18679 ; ENTRY Current directory (on selected drive) is the one to display - 18680 ; LeftOnPage = # lines left on display page + 18629 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18630 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1A8Fh + 18631 + 18632 DisplayFile: + 18633 ;;;test Bits,mask bare + 18634 ;;test word [_Bits],8 + 18635 ;test byte [_Bits],8 + 18636 ; 08/06/2023 + 18637 00001A20 F606[8B9D]08 test byte [_Bits],mask.bare ; 16 ; MSDOS 6.0 + 18638 ; 01/08/2024 ; 8 ; PCDOS 7.1 + 18639 00001A25 7405 jz short dfNorm ; not /b - do normal display + 18640 + 18641 00001A27 E8F8FE call DisplayBare ; display file in bare format + 18642 00001A2A EB18 jmp short dfRet + 18643 dfNorm: + 18644 00001A2C E87800 call DisplayNext ; pos'n cursor for next entry + 18645 ;;;test Bits,mask wide + 18646 ;;test word [_Bits],1 + 18647 ;test byte [_Bits],1 + 18648 ; 08/06/2023 + 18649 00001A2F F606[8B9D]01 test byte [_Bits],mask.wide ; 2 ; MSDOS 6.0 + 18650 ; 01/08/2024 ; 1 ; PCDOS 7.1 + 18651 00001A34 7405 jz short dfFull ; full format + 18652 00001A36 E82A02 call DisplayWide ; wide format + 18653 00001A39 EB06 jmp short dfCnt + 18654 dfFull: + 18655 00001A3B E83400 call DisplayName ; display filename & extension + 18656 00001A3E E88D00 call DisplayTheRest ; display size, date, time + 18657 + 18658 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18659 %if 0 + 18660 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 18661 ; MSDOS 6.0 + 18662 ;ifdef DBLSPACE_HOOKS + 18663 ;;test Bits,mask cratio + 18664 ;test word [_Bits],1 + 18665 test byte [_Bits],mask.cratio + 18666 ; display compression ratio + 18667 jz short dfCnt + 18668 call DisplayCompRatio + 18669 ;endif + 18670 %endif + 18671 + 18672 dfCnt: + 18673 00001A41 E8A7FE call CountFile ; update file counters + 18674 dfRet: + 18675 dhRet: ; 19/02/2023 + 18676 00001A44 C3 retn + 18677 + 18678 ; --------------------------------------------------------------------------- + 18679 + 18680 ;*** DisplayHeader - display directory header of working directory 18681 ; - 18682 ; EXIT nothing - 18683 ; - 18684 ; ERROR EXIT - 18685 ; - 18686 ; Build_Dir_String will exit through CError with "Invalid drive - 18687 ; specification" if there's a problem obtaining the current - 18688 ; directory pathname. - 18689 ; - 18690 ; USED AX,DX,SI,DI - 18691 ; - 18692 ; EFFECTS - 18693 ; - 18694 ; BwdBuf (which is really the same buffer as DirBuf, which - 18695 ; we are using for the DTA) contains the directory string. - 18696 ; LeftOnPage is adjusted. - 18697 - 18698 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18699 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18682 ; ENTRY Current directory (on selected drive) is the one to display + 18683 ; LeftOnPage = # lines left on display page + 18684 ; + 18685 ; EXIT nothing + 18686 ; + 18687 ; ERROR EXIT + 18688 ; + 18689 ; Build_Dir_String will exit through CError with "Invalid drive + 18690 ; specification" if there's a problem obtaining the current + 18691 ; directory pathname. + 18692 ; + 18693 ; USED AX,DX,SI,DI + 18694 ; + 18695 ; EFFECTS + 18696 ; + 18697 ; BwdBuf (which is really the same buffer as DirBuf, which + 18698 ; we are using for the DTA) contains the directory string. + 18699 ; LeftOnPage is adjusted. 18700 - 18701 DisplayHeader: - 18702 ;;;test Bits,mask bare - 18703 ;;test word [_Bits],8 - 18704 ;test byte [_Bits],8 - 18705 ; 08/06/2023 - 18706 00001A45 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 - 18707 ; 01/08/2024 ; 8 ; PCDOS 7.1 - 18708 00001A4A 75F8 jnz short dhRet ; /b - don't display header - 18709 - 18710 ;;;test Bits,mask subd - 18711 ;;test word [_Bits],4 - 18712 ;test byte [_Bits],4 - 18713 ; 08/06/2023 - 18714 00001A4C F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 - 18715 ; 01/08/2024 ; 4 ; PCDOS 7.1 - 18716 00001A51 7408 jz short dhNorm ; not /s - 18717 - 18718 ; For subdirectory listings, put a blank line before the header. - 18719 - 18720 ;invoke Crlf2 ; start with a blank line - 18721 00001A53 E8230F call CRLF2 - 18722 00001A56 E820FF call UseLine - 18723 00001A59 EB05 jmp short dhCom - 18724 dhNorm: - 18725 00001A5B B020 mov al,' ' ; 20h - 18726 ;mov al,BLANK ; if not /s, precede by a blank - 18727 00001A5D E84E07 call PRINT_CHAR ; print a leading blank - 18728 dhCom: - 18729 00001A60 E89A07 call build_dir_string - 18730 00001A63 BA[4391] mov dx,dirhead_ptr - 18731 00001A66 E8BF39 call std_printf ; print header & cr/lf - 18732 00001A69 E80DFF call UseLine - 18733 00001A6C E80A0F call CRLF2 ; another cr/lf - 18734 ;call UseLine - 18735 ;dhRet: - 18736 ;retn - 18737 - 18738 ; 19/02/2023 - 18739 00001A6F E907FF jmp UseLine + 18701 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18702 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18703 + 18704 DisplayHeader: + 18705 ;;;test Bits,mask bare + 18706 ;;test word [_Bits],8 + 18707 ;test byte [_Bits],8 + 18708 ; 08/06/2023 + 18709 00001A45 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 + 18710 ; 01/08/2024 ; 8 ; PCDOS 7.1 + 18711 00001A4A 75F8 jnz short dhRet ; /b - don't display header + 18712 + 18713 ;;;test Bits,mask subd + 18714 ;;test word [_Bits],4 + 18715 ;test byte [_Bits],4 + 18716 ; 08/06/2023 + 18717 00001A4C F606[8B9D]04 test byte [_Bits],mask.subd ; 8 ; MSDOS 6.0 + 18718 ; 01/08/2024 ; 4 ; PCDOS 7.1 + 18719 00001A51 7408 jz short dhNorm ; not /s + 18720 + 18721 ; For subdirectory listings, put a blank line before the header. + 18722 + 18723 ;invoke Crlf2 ; start with a blank line + 18724 00001A53 E8230F call CRLF2 + 18725 00001A56 E820FF call UseLine + 18726 00001A59 EB05 jmp short dhCom + 18727 dhNorm: + 18728 00001A5B B020 mov al,' ' ; 20h + 18729 ;mov al,BLANK ; if not /s, precede by a blank + 18730 00001A5D E84E07 call PRINT_CHAR ; print a leading blank + 18731 dhCom: + 18732 00001A60 E89A07 call build_dir_string + 18733 00001A63 BA[4391] mov dx,dirhead_ptr + 18734 00001A66 E8BF39 call std_printf ; print header & cr/lf + 18735 00001A69 E80DFF call UseLine + 18736 00001A6C E80A0F call CRLF2 ; another cr/lf + 18737 ;call UseLine + 18738 ;dhRet: + 18739 ;retn 18740 - 18741 ; --------------------------------------------------------------------------- - 18742 - 18743 ;*** DisplayName - display file name & extension - 18744 ; - 18745 ; ENTRY BX = offset of entry in TPA buffer - 18746 ; - 18747 ; EXIT nothing - 18748 ; - 18749 ; USED AX,CX,DX,SI,DI - 18750 ; - 18751 ; EFFECTS - 18752 ; - 18753 ; Filename & extension are displayed in spread format. - 18754 ; Cursor is left at end of extension. - 18755 - 18756 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18757 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18758 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18759 - 18760 DisplayName: - 18761 00001A72 1E push ds ; save TRANGROUP seg addr - 18762 00001A73 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to entry - 18763 ;assume ds:nothing - 18764 00001A77 89DE mov si,bx ; DS:SI = ptr to entry - 18765 ;;add si,filename ; DS:SI = ptr to filename - 18766 ;add si,1 ; EntryStruc.filename - 18767 ; 08/06/2023 - 18768 00001A79 46 inc si - 18769 00001A7A BF[6A9C] mov di,CHARBUF ; ES:DI = ptr to CharBuf - 18770 - 18771 00001A7D B90800 mov cx,8 - 18772 00001A80 FC cld - 18773 00001A81 F3A4 rep movsb ; move filename to CharBuf - 18774 00001A83 B020 mov al,' ' - 18775 00001A85 AA stosb ; add a blank - 18776 ;mov cx,3 - 18777 ; 08/06/2023 - 18778 00001A86 B103 mov cl,3 - 18779 00001A88 F3A4 rep movsb ; add extension - 18780 00001A8A 30C0 xor al,al - 18781 00001A8C AA stosb ; add a NULL - 18782 - 18783 00001A8D 1F pop ds ; DS = TRANGROUP seg addr again - 18784 ;assume ds:TRANGROUP + 18741 ; 19/02/2023 + 18742 00001A6F E907FF jmp UseLine + 18743 + 18744 ; --------------------------------------------------------------------------- + 18745 + 18746 ;*** DisplayName - display file name & extension + 18747 ; + 18748 ; ENTRY BX = offset of entry in TPA buffer + 18749 ; + 18750 ; EXIT nothing + 18751 ; + 18752 ; USED AX,CX,DX,SI,DI + 18753 ; + 18754 ; EFFECTS + 18755 ; + 18756 ; Filename & extension are displayed in spread format. + 18757 ; Cursor is left at end of extension. + 18758 + 18759 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18760 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18761 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18762 + 18763 DisplayName: + 18764 00001A72 1E push ds ; save TRANGROUP seg addr + 18765 00001A73 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to entry + 18766 ;assume ds:nothing + 18767 00001A77 89DE mov si,bx ; DS:SI = ptr to entry + 18768 ;;add si,filename ; DS:SI = ptr to filename + 18769 ;add si,1 ; EntryStruc.filename + 18770 ; 08/06/2023 + 18771 00001A79 46 inc si + 18772 00001A7A BF[6A9C] mov di,CHARBUF ; ES:DI = ptr to CharBuf + 18773 + 18774 00001A7D B90800 mov cx,8 + 18775 00001A80 FC cld + 18776 00001A81 F3A4 rep movsb ; move filename to CharBuf + 18777 00001A83 B020 mov al,' ' + 18778 00001A85 AA stosb ; add a blank + 18779 ;mov cx,3 + 18780 ; 08/06/2023 + 18781 00001A86 B103 mov cl,3 + 18782 00001A88 F3A4 rep movsb ; add extension + 18783 00001A8A 30C0 xor al,al + 18784 00001A8C AA stosb ; add a NULL 18785 - 18786 ;;;test Bits,mask lcase ;M010;check for lowercase option - 18787 ;;test word [_Bits],10h - 18788 ;test byte [_Bits],10h - 18789 ; 08/06/2023 - 18790 00001A8E F606[8B9D]10 test byte [_Bits],mask.lcase ; 20h ; MSDOS 6.0 - 18791 ; 01/08/2024 ; 10h ; PCDOS 7.1 - 18792 00001A93 7406 jz short dn1 ;M010;lowercase not required - 18793 00001A95 BE[6A9C] mov si,CHARBUF ;M010;DS:SI --> ASCIIZ string - 18794 00001A98 E84602 call LowercaseString ;M010;filename.ext string is in CharBuf - 18795 dn1: - 18796 00001A9B C706[A09D][6A9C] mov word [string_ptr_2],CHARBUF - 18797 00001AA1 BA[DF91] mov dx,string_buf_ptr - 18798 ;call std_printf ; print filename & extension - 18799 ;retn - 18800 ; 19/02/2023 - 18801 00001AA4 E98139 jmp std_printf - 18802 - 18803 ; --------------------------------------------------------------------------- - 18804 - 18805 ;*** DisplayNext - move display cursor to next entry position - 18806 ; - 18807 ; ENTRY LeftOnLine = # entries can still be printed on this line - 18808 ; LeftOnPage = # lines can still be printed for this page - 18809 ; FileCnt = # files in this dir displayed before this one - 18810 ; Bits contains /w setting - 18811 ; - 18812 ; EXIT nothing - 18813 ; - 18814 ; USED AX,DX - 18815 ; - 18816 ; EFFECTS - 18817 ; - 18818 ; LeftOnLine will be updated to reflect the entry about to be - 18819 ; displayed. - 18820 ; LeftOnPage may be updated. - 18821 - 18822 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18823 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18824 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18825 - 18826 DisplayNext: - 18827 00001AA7 833E[209C]00 cmp word [FileCnt],0 - 18828 00001AAC 7415 je short dn1st ; 1st file in directory - 18829 00001AAE 803E[1C9C]00 cmp byte [LeftOnLine],0 - 18830 00001AB3 7E08 jng short dnEol ; jle ; no more room on this line - 18831 - 18832 ; We are in wide mode (LeftOnLine is always 0 otherwise) and - 18833 ; we still have room for more on this line. - 18834 ; Tab to next position. - 18835 - 18836 00001AB5 BA[EE91] mov dx,tab_ptr - 18837 00001AB8 E86D39 call std_printf - 18838 00001ABB EB0C jmp short dnDone - 18839 dnEol: - 18840 ; Start this entry on a new line. - 18841 - 18842 00001ABD E8B90E call CRLF2 ; start on new line - 18843 00001AC0 E8B6FE call UseLine - 18844 dn1st: - 18845 00001AC3 A0[1D9C] mov al,[PerLine] - 18846 00001AC6 A2[1C9C] mov [LeftOnLine],al ; reset # entries left on line - 18847 - 18848 dnDone: - 18849 00001AC9 FE0E[1C9C] dec byte [LeftOnLine] - 18850 ; reflect the entry about to be displayed - 18851 00001ACD C3 retn - 18852 - 18853 ; --------------------------------------------------------------------------- - 18854 - 18855 ;*** DisplayTheRest - display file size/dir, date, time - 18856 ; - 18857 ; ENTRY BX = offset of entry in TPA buffer - 18858 ; Display cursor is at end of file extension + 18786 00001A8D 1F pop ds ; DS = TRANGROUP seg addr again + 18787 ;assume ds:TRANGROUP + 18788 + 18789 ;;;test Bits,mask lcase ;M010;check for lowercase option + 18790 ;;test word [_Bits],10h + 18791 ;test byte [_Bits],10h + 18792 ; 08/06/2023 + 18793 00001A8E F606[8B9D]10 test byte [_Bits],mask.lcase ; 20h ; MSDOS 6.0 + 18794 ; 01/08/2024 ; 10h ; PCDOS 7.1 + 18795 00001A93 7406 jz short dn1 ;M010;lowercase not required + 18796 00001A95 BE[6A9C] mov si,CHARBUF ;M010;DS:SI --> ASCIIZ string + 18797 00001A98 E84602 call LowercaseString ;M010;filename.ext string is in CharBuf + 18798 dn1: + 18799 00001A9B C706[A09D][6A9C] mov word [string_ptr_2],CHARBUF + 18800 00001AA1 BA[DF91] mov dx,string_buf_ptr + 18801 ;call std_printf ; print filename & extension + 18802 ;retn + 18803 ; 19/02/2023 + 18804 00001AA4 E98139 jmp std_printf + 18805 + 18806 ; --------------------------------------------------------------------------- + 18807 + 18808 ;*** DisplayNext - move display cursor to next entry position + 18809 ; + 18810 ; ENTRY LeftOnLine = # entries can still be printed on this line + 18811 ; LeftOnPage = # lines can still be printed for this page + 18812 ; FileCnt = # files in this dir displayed before this one + 18813 ; Bits contains /w setting + 18814 ; + 18815 ; EXIT nothing + 18816 ; + 18817 ; USED AX,DX + 18818 ; + 18819 ; EFFECTS + 18820 ; + 18821 ; LeftOnLine will be updated to reflect the entry about to be + 18822 ; displayed. + 18823 ; LeftOnPage may be updated. + 18824 + 18825 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 18826 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18827 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18828 + 18829 DisplayNext: + 18830 00001AA7 833E[209C]00 cmp word [FileCnt],0 + 18831 00001AAC 7415 je short dn1st ; 1st file in directory + 18832 00001AAE 803E[1C9C]00 cmp byte [LeftOnLine],0 + 18833 00001AB3 7E08 jng short dnEol ; jle ; no more room on this line + 18834 + 18835 ; We are in wide mode (LeftOnLine is always 0 otherwise) and + 18836 ; we still have room for more on this line. + 18837 ; Tab to next position. + 18838 + 18839 00001AB5 BA[EE91] mov dx,tab_ptr + 18840 00001AB8 E86D39 call std_printf + 18841 00001ABB EB0C jmp short dnDone + 18842 dnEol: + 18843 ; Start this entry on a new line. + 18844 + 18845 00001ABD E8B90E call CRLF2 ; start on new line + 18846 00001AC0 E8B6FE call UseLine + 18847 dn1st: + 18848 00001AC3 A0[1D9C] mov al,[PerLine] + 18849 00001AC6 A2[1C9C] mov [LeftOnLine],al ; reset # entries left on line + 18850 + 18851 dnDone: + 18852 00001AC9 FE0E[1C9C] dec byte [LeftOnLine] + 18853 ; reflect the entry about to be displayed + 18854 00001ACD C3 retn + 18855 + 18856 ; --------------------------------------------------------------------------- + 18857 + 18858 ;*** DisplayTheRest - display file size/dir, date, time 18859 ; - 18860 ; EXIT nothing - 18861 ; - 18862 ; USED AX,CX,DX,SI,DI,BP - 18863 ; - 18864 ; EFFECTS - 18865 ; - 18866 ; File size, date, & time are displayed. - 18867 - 18868 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 18869 - 18870 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 18871 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1A7Ch + 18860 ; ENTRY BX = offset of entry in TPA buffer + 18861 ; Display cursor is at end of file extension + 18862 ; + 18863 ; EXIT nothing + 18864 ; + 18865 ; USED AX,CX,DX,SI,DI,BP + 18866 ; + 18867 ; EFFECTS + 18868 ; + 18869 ; File size, date, & time are displayed. + 18870 + 18871 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 18872 - 18873 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 18874 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1B47h + 18873 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 18874 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1A7Ch 18875 - 18876 DisplayTheRest: - 18877 00001ACE 06 push es ; save TRANGROUP seg addr - 18878 00001ACF 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr - 18879 00001AD3 89DD mov bp,bx ; BP = offset of entry in TPA - 18880 ;;test es:[bp].fileattr,ATTR_DIRECTORY - 18881 ;test byte [es:bp+EntryStruc.fileattr],10h - 18882 00001AD5 26F6460C10 test byte [es:bp+12],ATTR_DIRECTORY - 18883 00001ADA 7425 jz short drNonDir ; not a directory file - 18884 - 18885 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18886 %if 1 - 18887 00001ADC 803E[2B9C]00 cmp byte [nocommas],0 ; no commas ? - 18888 00001AE1 750C jnz short dr_2 ; yes - 18889 00001AE3 C706[A09D][0094] mov word [string_ptr_2],twospacechars ; db " ",0 - 18890 00001AE9 BA[DF91] mov dx,string_buf_ptr - 18891 00001AEC E83939 call std_printf - 18892 dr_2: - 18893 %endif - 18894 - 18895 ; For a directory file, display instead of size. - 18896 - 18897 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18898 %if 0 - 18899 mov dx,dmes_ptr - 18900 call std_printf - 18901 ; 08/06/2023 - 18902 ;jmp short drCom - 18903 + 18876 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 18877 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1B47h + 18878 + 18879 DisplayTheRest: + 18880 00001ACE 06 push es ; save TRANGROUP seg addr + 18881 00001ACF 8E06[F79B] mov es,[TPA] ; ES = TPA seg addr + 18882 00001AD3 89DD mov bp,bx ; BP = offset of entry in TPA + 18883 ;;test es:[bp].fileattr,ATTR_DIRECTORY + 18884 ;test byte [es:bp+EntryStruc.fileattr],10h + 18885 00001AD5 26F6460C10 test byte [es:bp+12],ATTR_DIRECTORY + 18886 00001ADA 7425 jz short drNonDir ; not a directory file + 18887 + 18888 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18889 %if 1 + 18890 00001ADC 803E[2B9C]00 cmp byte [nocommas],0 ; no commas ? + 18891 00001AE1 750C jnz short dr_2 ; yes + 18892 00001AE3 C706[A09D][0094] mov word [string_ptr_2],twospacechars ; db " ",0 + 18893 00001AE9 BA[DF91] mov dx,string_buf_ptr + 18894 00001AEC E83939 call std_printf + 18895 dr_2: + 18896 %endif + 18897 + 18898 ; For a directory file, display instead of size. + 18899 + 18900 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18901 %if 0 + 18902 mov dx,dmes_ptr + 18903 call std_printf 18904 ; 08/06/2023 - 18905 ; MSDOS 6.22 COMMAND.COM (disassembled source code) - 18906 test byte [screen_f_1],40h ; 80 columns ? - 18907 jz short dr_0 ; no - 18908 mov dx,space_4_ptr ; 4 space chars - 18909 call std_printf - 18910 dr_0: - 18911 jmp short drCom ; skip to common fields - 18912 %else - 18913 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18914 00001AEF BA[F191] mov dx,dmes_ptr ; MSG_1068 - 18915 00001AF2 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; size will be displayed as kilobyte ? - 18916 00001AF7 7403 jz short dr_3 ; yes - 18917 00001AF9 BA[F491] mov dx,space_4_ptr ; 4 space chars - 18918 dr_3: - 18919 00001AFC E82939 call std_printf - 18920 00001AFF EB2A jmp short drCom - 18921 %endif - 18922 - 18923 drNonDir: - 18924 ; For a non-directory file, display file size. + 18905 ;jmp short drCom + 18906 + 18907 ; 08/06/2023 + 18908 ; MSDOS 6.22 COMMAND.COM (disassembled source code) + 18909 test byte [screen_f_1],40h ; 80 columns ? + 18910 jz short dr_0 ; no + 18911 mov dx,space_4_ptr ; 4 space chars + 18912 call std_printf + 18913 dr_0: + 18914 jmp short drCom ; skip to common fields + 18915 %else + 18916 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18917 00001AEF BA[F191] mov dx,dmes_ptr ; MSG_1068 + 18918 00001AF2 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; size will be displayed as kilobyte ? + 18919 00001AF7 7403 jz short dr_3 ; yes + 18920 00001AF9 BA[F491] mov dx,space_4_ptr ; 4 space chars + 18921 dr_3: + 18922 00001AFC E82939 call std_printf + 18923 00001AFF EB2A jmp short drCom + 18924 %endif 18925 - 18926 ;;mov dx,word ptr es:[bp].filesize - 18927 ;mov dx,[es:bp+EntryStruc.filesize] - 18928 00001B01 268B5611 mov dx,[es:bp+17] - 18929 00001B05 8916[9C9D] mov [File_Size_Low],dx - 18930 ;;mov dx,word ptr es:[bp].filesize+2 - 18931 ;mov dx,[es:bp+EntryStruc.filesize+2] - 18932 00001B09 268B5613 mov dx,[es:bp+19] - 18933 00001B0D 8916[9E9D] mov [File_Size_High],dx - 18934 00001B11 BA[B591] mov dx,disp_file_size_ptr - 18935 - 18936 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18937 %if 1 - 18938 00001B14 803E[2A9C]00 cmp byte [narrow],0 - 18939 00001B19 7503 jnz short dr_4 ; narrow display - 18940 00001B1B BA[C391] mov dx,disp_file_size_w_ptr ; big file (wide) - 18941 dr_4: - 18942 00001B1E 803E[2D9C]00 cmp byte [bfree_not_kilo],0 - 18943 00001B23 7403 jz short dr_5 ; big file - 18944 00001B25 BA[D191] mov dx,disp_file_size_n_ptr ; not big file - 18945 dr_5: - 18946 %endif - 18947 - 18948 00001B28 E8FD38 call std_printf - 18949 drCom: - 18950 ; For all files, display date & time. - 18951 - 18952 ;;mov ax,es:[bp].filedate ; AX = date word - 18953 ;mov ax,[es:bp+EntryStruc.filedate] - 18954 00001B2B 268B460F mov ax,[es:bp+15] - 18955 - 18956 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18957 %if 0 - 18958 or ax,ax ; test for null date (DOS 1.x) - 18959 jz short drDone ; no date, skip date/time display - 18960 %else - 18961 00001B2F 09C0 or ax,ax - 18962 00001B31 7503 jnz short dr_6 - 18963 00001B33 E9AA00 jmp drDone - 18964 dr_6: - 18965 %endif - 18966 - 18967 00001B36 89C3 mov bx,ax ; BX = date word - 18968 00001B38 83E01F and ax,1Fh ; AX = day of month - 18969 00001B3B 88C2 mov dl,al ; DL = day of month - 18970 00001B3D 89D8 mov ax,bx ; AX = date word - 18971 00001B3F B105 mov cl,5 - 18972 00001B41 D3E8 shr ax,cl ; shift day out - 18973 00001B43 240F and al,0Fh ; AL = month - 18974 00001B45 88C6 mov dh,al ; DH = month - 18975 00001B47 88F9 mov cl,bh - 18976 00001B49 D0E9 shr cl,1 ; CL = year - 1980 - 18977 00001B4B 30ED xor ch,ch ; CX = year - 1980 - 18978 - 18979 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 18980 %if 0 - 18981 ; MSDOS 5.0-6.22 - 18982 add cx,80 ; CX = 2-digit year - 18983 cmp cl,100 - 18984 jb short dr_1 ; not year 2000 yet, skip ahead - 18985 sub cl,100 ; adjust for 21st century - 18986 %else - 18987 ; PCDOS 7.1 - 18988 00001B4D 81C1BC07 add cx,1980 ; CX = 4-digit year - 18989 00001B51 803E[2C9C]00 cmp byte [yeardigit4],0 ; 4 digits year display ? - 18990 00001B56 7509 jnz short dr_1 ; yes - 18991 00001B58 81E9D007 sub cx,2000 ; after year 2000 (21st century) - 18992 00001B5C 7903 jns short dr_1 - 18993 00001B5E 83C164 add cx,100 ; before year 2000 (20th century) - 18994 %endif - 18995 - 18996 dr_1: - 18997 00001B61 86F2 xchg dh,dl ; DX = month/day - 18998 00001B63 890E[3292] mov [DirDat_Yr],cx ; move year to msg block - 18999 00001B67 8916[3492] mov [DirDat_Mo_Day],dx ; move month/day to msg block - 19000 ;;mov cx,es:[bp].filetime ; CX = file time - 19001 ;mov cx,[es:bp+EntryStruc.filetime] - 19002 00001B6B 268B4E0D mov cx,[es:bp+13] - 19003 00001B6F E310 jcxz drPrint ; no time field - go print - 19004 00001B71 D1E9 shr cx,1 - 19005 00001B73 D1E9 shr cx,1 - 19006 00001B75 D1E9 shr cx,1 ; CH = hours - 19007 00001B77 D0E9 shr cl,1 - 19008 00001B79 D0E9 shr cl,1 ; CL = minutes - 19009 00001B7B 86E9 xchg ch,cl ; CX = hr/min - 19010 00001B7D 890E[3D92] mov [DirTim_Hr_Min],cx ; move time to msg block - 19011 drPrint: - 19012 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 19013 %if 1 - 19014 00001B81 C706[2D92]3504 mov word [dirdattim_ptr],1077 ; MSG_1077 (normal) - 19015 00001B87 C606[3792]A4 mov byte [DirDat_form],0A4h ; Right_Align+DATE_MDY_2 - 19016 00001B8C C706[3892]0A08 mov word [DirDat_width],80Ah ; 10 (max), 8 (min) - 19017 00001B92 803E[2A9C]00 cmp byte [narrow],0 - 19018 00001B97 750C jnz short dr_narrow - 19019 00001B99 C706[2D92]3304 mov word [dirdattim_ptr],1075 ; MSG_1075 (narrow) - 19020 00001B9F 8106[3892]0202 add word [DirDat_width],202h ; 12 (max), 10 (min) - 19021 dr_narrow: - 19022 00001BA5 803E[2C9C]00 cmp byte [yeardigit4],0 - 19023 00001BAA 740B jz short dr_7 ; 2 digits year display - 19024 ; 4 digits year display - 19025 00001BAC C606[3792]B4 mov byte [DirDat_form],0B4h ; Right_Align+DATE_MDY_4 - 19026 00001BB1 8106[3892]0202 add word [DirDat_width],202h ; 12 (max), 10 (min) - 19027 dr_7: - 19028 %endif - 19029 00001BB7 BA[2D92] mov dx,dirdattim_ptr - 19030 00001BBA E86B38 call std_printf ; print date & time - 19031 - 19032 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM - 19033 %if 1 - 19034 ; restore message data format fields (to the default values) - 19035 00001BBD C706[2D92]3504 mov word [dirdattim_ptr],1077 ; MSG_1077 - 19036 00001BC3 C606[3792]A4 mov byte [DirDat_form],0A4h ; Right_Align+DATE_MDY_2 - 19037 00001BC8 C706[3892]0A08 mov word [DirDat_width],80Ah ; 10 (max), 8 (min) - 19038 00001BCE C706[3292]0000 mov word [DirDat_Yr],0 - 19039 00001BD4 C706[3492]0000 mov word [DirDat_Mo_Day],0 - 19040 00001BDA C706[3D92]0000 mov word [DirTim_Hr_Min],0 - 19041 %endif - 19042 - 19043 drDone: - 19044 00001BE0 07 pop es ; ES = TRANGROUP seg addr again - 19045 00001BE1 89EB mov bx,bp ; BX = offset of entry in TPA again - 19046 dtrRet: ; 03/08/2024 - 19047 ; 19/02/2023 - 19048 00001BE3 C3 retn - 19049 - 19050 ; --------------------------------------------------------------------------- - 19051 ; MSDOS 6.0 + 18926 drNonDir: + 18927 ; For a non-directory file, display file size. + 18928 + 18929 ;;mov dx,word ptr es:[bp].filesize + 18930 ;mov dx,[es:bp+EntryStruc.filesize] + 18931 00001B01 268B5611 mov dx,[es:bp+17] + 18932 00001B05 8916[9C9D] mov [File_Size_Low],dx + 18933 ;;mov dx,word ptr es:[bp].filesize+2 + 18934 ;mov dx,[es:bp+EntryStruc.filesize+2] + 18935 00001B09 268B5613 mov dx,[es:bp+19] + 18936 00001B0D 8916[9E9D] mov [File_Size_High],dx + 18937 00001B11 BA[B591] mov dx,disp_file_size_ptr + 18938 + 18939 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18940 %if 1 + 18941 00001B14 803E[2A9C]00 cmp byte [narrow],0 + 18942 00001B19 7503 jnz short dr_4 ; narrow display + 18943 00001B1B BA[C391] mov dx,disp_file_size_w_ptr ; big file (wide) + 18944 dr_4: + 18945 00001B1E 803E[2D9C]00 cmp byte [bfree_not_kilo],0 + 18946 00001B23 7403 jz short dr_5 ; big file + 18947 00001B25 BA[D191] mov dx,disp_file_size_n_ptr ; not big file + 18948 dr_5: + 18949 %endif + 18950 + 18951 00001B28 E8FD38 call std_printf + 18952 drCom: + 18953 ; For all files, display date & time. + 18954 + 18955 ;;mov ax,es:[bp].filedate ; AX = date word + 18956 ;mov ax,[es:bp+EntryStruc.filedate] + 18957 00001B2B 268B460F mov ax,[es:bp+15] + 18958 + 18959 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18960 %if 0 + 18961 or ax,ax ; test for null date (DOS 1.x) + 18962 jz short drDone ; no date, skip date/time display + 18963 %else + 18964 00001B2F 09C0 or ax,ax + 18965 00001B31 7503 jnz short dr_6 + 18966 00001B33 E9AA00 jmp drDone + 18967 dr_6: + 18968 %endif + 18969 + 18970 00001B36 89C3 mov bx,ax ; BX = date word + 18971 00001B38 83E01F and ax,1Fh ; AX = day of month + 18972 00001B3B 88C2 mov dl,al ; DL = day of month + 18973 00001B3D 89D8 mov ax,bx ; AX = date word + 18974 00001B3F B105 mov cl,5 + 18975 00001B41 D3E8 shr ax,cl ; shift day out + 18976 00001B43 240F and al,0Fh ; AL = month + 18977 00001B45 88C6 mov dh,al ; DH = month + 18978 00001B47 88F9 mov cl,bh + 18979 00001B49 D0E9 shr cl,1 ; CL = year - 1980 + 18980 00001B4B 30ED xor ch,ch ; CX = year - 1980 + 18981 + 18982 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 18983 %if 0 + 18984 ; MSDOS 5.0-6.22 + 18985 add cx,80 ; CX = 2-digit year + 18986 cmp cl,100 + 18987 jb short dr_1 ; not year 2000 yet, skip ahead + 18988 sub cl,100 ; adjust for 21st century + 18989 %else + 18990 ; PCDOS 7.1 + 18991 00001B4D 81C1BC07 add cx,1980 ; CX = 4-digit year + 18992 00001B51 803E[2C9C]00 cmp byte [yeardigit4],0 ; 4 digits year display ? + 18993 00001B56 7509 jnz short dr_1 ; yes + 18994 00001B58 81E9D007 sub cx,2000 ; after year 2000 (21st century) + 18995 00001B5C 7903 jns short dr_1 + 18996 00001B5E 83C164 add cx,100 ; before year 2000 (20th century) + 18997 %endif + 18998 + 18999 dr_1: + 19000 00001B61 86F2 xchg dh,dl ; DX = month/day + 19001 00001B63 890E[3292] mov [DirDat_Yr],cx ; move year to msg block + 19002 00001B67 8916[3492] mov [DirDat_Mo_Day],dx ; move month/day to msg block + 19003 ;;mov cx,es:[bp].filetime ; CX = file time + 19004 ;mov cx,[es:bp+EntryStruc.filetime] + 19005 00001B6B 268B4E0D mov cx,[es:bp+13] + 19006 00001B6F E310 jcxz drPrint ; no time field - go print + 19007 00001B71 D1E9 shr cx,1 + 19008 00001B73 D1E9 shr cx,1 + 19009 00001B75 D1E9 shr cx,1 ; CH = hours + 19010 00001B77 D0E9 shr cl,1 + 19011 00001B79 D0E9 shr cl,1 ; CL = minutes + 19012 00001B7B 86E9 xchg ch,cl ; CX = hr/min + 19013 00001B7D 890E[3D92] mov [DirTim_Hr_Min],cx ; move time to msg block + 19014 drPrint: + 19015 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 19016 %if 1 + 19017 00001B81 C706[2D92]3504 mov word [dirdattim_ptr],1077 ; MSG_1077 (normal) + 19018 00001B87 C606[3792]A4 mov byte [DirDat_form],0A4h ; Right_Align+DATE_MDY_2 + 19019 00001B8C C706[3892]0A08 mov word [DirDat_width],80Ah ; 10 (max), 8 (min) + 19020 00001B92 803E[2A9C]00 cmp byte [narrow],0 + 19021 00001B97 750C jnz short dr_narrow + 19022 00001B99 C706[2D92]3304 mov word [dirdattim_ptr],1075 ; MSG_1075 (narrow) + 19023 00001B9F 8106[3892]0202 add word [DirDat_width],202h ; 12 (max), 10 (min) + 19024 dr_narrow: + 19025 00001BA5 803E[2C9C]00 cmp byte [yeardigit4],0 + 19026 00001BAA 740B jz short dr_7 ; 2 digits year display + 19027 ; 4 digits year display + 19028 00001BAC C606[3792]B4 mov byte [DirDat_form],0B4h ; Right_Align+DATE_MDY_4 + 19029 00001BB1 8106[3892]0202 add word [DirDat_width],202h ; 12 (max), 10 (min) + 19030 dr_7: + 19031 %endif + 19032 00001BB7 BA[2D92] mov dx,dirdattim_ptr + 19033 00001BBA E86B38 call std_printf ; print date & time + 19034 + 19035 ; 01/08/2024 - PCDOS 7.1 COMMAND.COM + 19036 %if 1 + 19037 ; restore message data format fields (to the default values) + 19038 00001BBD C706[2D92]3504 mov word [dirdattim_ptr],1077 ; MSG_1077 + 19039 00001BC3 C606[3792]A4 mov byte [DirDat_form],0A4h ; Right_Align+DATE_MDY_2 + 19040 00001BC8 C706[3892]0A08 mov word [DirDat_width],80Ah ; 10 (max), 8 (min) + 19041 00001BCE C706[3292]0000 mov word [DirDat_Yr],0 + 19042 00001BD4 C706[3492]0000 mov word [DirDat_Mo_Day],0 + 19043 00001BDA C706[3D92]0000 mov word [DirTim_Hr_Min],0 + 19044 %endif + 19045 + 19046 drDone: + 19047 00001BE0 07 pop es ; ES = TRANGROUP seg addr again + 19048 00001BE1 89EB mov bx,bp ; BX = offset of entry in TPA again + 19049 dtrRet: ; 03/08/2024 + 19050 ; 19/02/2023 + 19051 00001BE3 C3 retn 19052 - 19053 ; 01/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 19054 %if 0 - 19055 ;ifdef DBLSPACE_HOOKS - 19056 - 19057 ;*** DisplayCompRatio - display compression ratio - 19058 ; - 19059 ; ENTRY BX = offset of entry in TPA buffer - 19060 ; - 19061 ; EXIT nothing - 19062 ; - 19063 ; USED AX,CX,DX - 19064 ; - 19065 ; EFFECTS - 19066 ; - 19067 ; File compression ratio is displayed. - 19068 - 19069 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 19070 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1B09h + 19053 ; --------------------------------------------------------------------------- + 19054 ; MSDOS 6.0 + 19055 + 19056 ; 01/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 19057 %if 0 + 19058 ;ifdef DBLSPACE_HOOKS + 19059 + 19060 ;*** DisplayCompRatio - display compression ratio + 19061 ; + 19062 ; ENTRY BX = offset of entry in TPA buffer + 19063 ; + 19064 ; EXIT nothing + 19065 ; + 19066 ; USED AX,CX,DX + 19067 ; + 19068 ; EFFECTS + 19069 ; + 19070 ; File compression ratio is displayed. 19071 - 19072 DisplayCompRatio: ;proc - 19073 push es ; save TRANGROUP seg addr - 19074 mov es,[TPA] ; ES = TPA seg addr - 19075 ;;mov al,es:[bx].compratio - 19076 ;mov al,[es:bx+EntryStruc.compratio] - 19077 mov al,[es:bx+15h] - 19078 cmp al,0FFh ; invalid/no compression ratio? - 19079 je short dcrRet - 19080 - 19081 mov ah,al ; unpack compression ratio - 19082 mov cl,4 - 19083 shr ah,cl ; isolate whole number portion - 19084 inc ah ; 0-15 = 1-16 - 19085 and al,0Fh ; isolate tenths - 19086 - 19087 mov [Dir_CRatio_1],ah - 19088 mov [Dir_CRatio_2],al - 19089 ;mov dx,offset TRANGROUP:DirCompRatio_Ptr - 19090 ;invoke Std_Printf - 19091 mov dx,DirCompRatio_Ptr - 19092 call std_printf - 19093 dcrRet: - 19094 pop es - 19095 dtrRet: ; 08/06/2023 - 19096 retn - 19097 - 19098 ;DisplayCompRatio ;endp - 19099 - 19100 ;endif - 19101 %endif + 19072 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 19073 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1B09h + 19074 + 19075 DisplayCompRatio: ;proc + 19076 push es ; save TRANGROUP seg addr + 19077 mov es,[TPA] ; ES = TPA seg addr + 19078 ;;mov al,es:[bx].compratio + 19079 ;mov al,[es:bx+EntryStruc.compratio] + 19080 mov al,[es:bx+15h] + 19081 cmp al,0FFh ; invalid/no compression ratio? + 19082 je short dcrRet + 19083 + 19084 mov ah,al ; unpack compression ratio + 19085 mov cl,4 + 19086 shr ah,cl ; isolate whole number portion + 19087 inc ah ; 0-15 = 1-16 + 19088 and al,0Fh ; isolate tenths + 19089 + 19090 mov [Dir_CRatio_1],ah + 19091 mov [Dir_CRatio_2],al + 19092 ;mov dx,offset TRANGROUP:DirCompRatio_Ptr + 19093 ;invoke Std_Printf + 19094 mov dx,DirCompRatio_Ptr + 19095 call std_printf + 19096 dcrRet: + 19097 pop es + 19098 dtrRet: ; 08/06/2023 + 19099 retn + 19100 + 19101 ;DisplayCompRatio ;endp 19102 - 19103 ; --------------------------------------------------------------------------- - 19104 - 19105 ;*** DisplayTrailer - display trailing lines for directory listing - 19106 ; - 19107 ; ENTRY LeftOnPage = # lines left on display page - 19108 ; FileCnt = # files listed - 19109 ; FileSiz = total size of files listed - 19110 ; - 19111 ; EXIT nothing - 19112 ; - 19113 ; USED - 19114 ; - 19115 ; EFFECTS - 19116 ; - 19117 ; Trailing info lines are displayed - 19118 - 19119 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19120 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 19121 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM - 19122 ; 14/08/2024 - 19123 DisplayTrailer: - 19124 ;;;test Bits,mask bare - 19125 ;;test word [_Bits],8 - 19126 ;test byte [_Bits],8 - 19127 ; 08/06/2023 - 19128 00001BE4 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 - 19129 ; 02/08/2024 ; 8 ; PCDOS 7.1 - 19130 00001BE9 75F8 jnz short dtrRet ; /b - don't display trailer - 19131 - 19132 00001BEB E88B0D call CRLF2 ; start on new line - 19133 00001BEE E888FD call UseLine - 19134 00001BF1 A1[209C] mov ax,[FileCnt] ; AX = # files found - 19135 ; 14/08/2024 - 19136 00001BF4 31D2 xor dx,dx - 19137 - 19138 ; DisplayTotals uses this entry point. - 19139 ; - 19140 DisplayCntSiz: - 19141 ; AX = # files - 19142 ; FileSiz = dword total size of files - 19143 - 19144 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM - 19145 ; PCDOS 7.1 COMMAND.COM - 19146 %if 0 - 19147 mov [Dir_Num],ax ; load # files - 19148 mov dx,dirmes_ptr ; DX = ptr to message block - 19149 call std_printf ; "nnn File(s)" - 19150 - 19151 mov dx,bytes_ptr - 19152 call std_printf ; "nnn bytes",cr,lf - 19153 ; 19/02/2023 - 19154 ;call UseLine - 19155 ;dtrRet: - 19156 ;retn - 19157 - 19158 ; 19/02/2023 - 19159 jmp UseLine - 19160 %else - 19161 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 19162 00001BF6 A3[A59D] mov [Dir_Num],ax ; number of files - 19163 00001BF9 8916[A79D] mov [Dir_Num+2],dx - 19164 00001BFD BA[1A90] mov dx,dirmes_ptr ; MSG_1019, 9 bytes, word - 19165 00001C00 803E[2A9C]00 cmp byte [narrow],0 ; narrow display ? - 19166 00001C05 7503 jnz short dcs_1 ; yes - 19167 00001C07 BA[2890] mov dx,dirmes_w_ptr ; MSG_1019, 10 bytes - 19168 dcs_1: - 19169 00001C0A 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; is kilobyte display usable? - 19170 00001C0F 7403 jz short dcs_2 ; yes (big files) - 19171 00001C11 BA[3690] mov dx,dirmes2_ptr ; MSG_1019, 9 bytes, dword - 19172 dcs_2: - 19173 00001C14 E81138 call std_printf ; "nnn File(s)" - 19174 00001C17 8B0E[269C] mov cx,[FileSiz+4] ; 5th and 6th byte of the file size - 19175 ; (6th byte=0) - 19176 00001C1B E329 jcxz dcs_3 ; file size is (in) 4 bytes - 19177 00001C1D 8B16[259C] mov dx,[FileSiz+3] ; convert to kilobytes - 19178 00001C21 A1[239C] mov ax,[FileSiz+1] - 19179 00001C24 D0CD ror ch,1 ; ch = 5th byte of file size - 19180 00001C26 D1DA rcr dx,1 - 19181 00001C28 D1D8 rcr ax,1 - 19182 00001C2A D0CD ror ch,1 - 19183 00001C2C D1DA rcr dx,1 - 19184 00001C2E D1D8 rcr ax,1 ; dx:ax = (ch:dx:ax) / 1024 - 19185 00001C30 8916[249C] mov [FileSiz+2],dx - 19186 00001C34 A3[229C] mov [FileSiz],ax - 19187 00001C37 BA[7392] mov dx,kbytes_ptr ; MSG_1107 normal, 14 bytes - 19188 00001C3A 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; is kilobyte display usable? - 19189 00001C3F 741C jz short dcs_5 ; yes (big files) - 19190 ; no (not big files) - 19191 00001C41 BA[8192] mov dx,kybytes_n_ptr ; MSG_1107 narrow, 10 bytes - 19192 00001C44 EB17 jmp short dcs_5 - 19193 dcs_3: - 19194 00001C46 BA[4992] mov dx,bytes_ptr ; MSG_1079 normal, 12 bytes - 19195 00001C49 803E[2A9C]00 cmp byte [narrow],0 ; narrow display option - 19196 00001C4E 7503 jnz short dcs_4 - 19197 00001C50 BA[5792] mov dx,bytes_w_tr ; MSG_1079 wide, 14 bytes - 19198 dcs_4: - 19199 00001C53 803E[2D9C]00 cmp byte [bfree_not_kilo],0 - 19200 00001C58 7403 jz short dcs_5 - 19201 00001C5A BA[6592] mov dx,bytes_n_ptr ; MSG_1079 narrow, 10 bytes - 19202 dcs_5: - 19203 00001C5D E8C837 call std_printf ; "nnn bytes",cr,lf - 19204 ;call UseLine - 19205 ;dtrRet: - 19206 ;retn - 19207 ; 02/08/2024 - 19208 00001C60 E916FD jmp UseLine - 19209 %endif - 19210 - 19211 ; --------------------------------------------------------------------------- - 19212 - 19213 ;*** DisplayWide - display filename in wide format - 19214 ; - 19215 ; ENTRY BX = offset of entry in TPA buffer - 19216 ; - 19217 ; EXIT nothing - 19218 ; - 19219 ; USED AX,CX,DX,SI,DI - 19220 ; - 19221 ; EFFECTS - 19222 ; - 19223 ; Name.ext is displayed. Cursor left at end of field (padded - 19224 ; with blanks). Subdirectory files are displayed as [name.ext]. - 19225 - 19226 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19227 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:198Ah + 19103 ;endif + 19104 %endif + 19105 + 19106 ; --------------------------------------------------------------------------- + 19107 + 19108 ;*** DisplayTrailer - display trailing lines for directory listing + 19109 ; + 19110 ; ENTRY LeftOnPage = # lines left on display page + 19111 ; FileCnt = # files listed + 19112 ; FileSiz = total size of files listed + 19113 ; + 19114 ; EXIT nothing + 19115 ; + 19116 ; USED + 19117 ; + 19118 ; EFFECTS + 19119 ; + 19120 ; Trailing info lines are displayed + 19121 + 19122 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19123 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 19124 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM + 19125 ; 14/08/2024 + 19126 DisplayTrailer: + 19127 ;;;test Bits,mask bare + 19128 ;;test word [_Bits],8 + 19129 ;test byte [_Bits],8 + 19130 ; 08/06/2023 + 19131 00001BE4 F606[8B9D]08 test byte [_Bits],mask.bare ; 10h ; MSDOS 6.0 + 19132 ; 02/08/2024 ; 8 ; PCDOS 7.1 + 19133 00001BE9 75F8 jnz short dtrRet ; /b - don't display trailer + 19134 + 19135 00001BEB E88B0D call CRLF2 ; start on new line + 19136 00001BEE E888FD call UseLine + 19137 00001BF1 A1[209C] mov ax,[FileCnt] ; AX = # files found + 19138 ; 14/08/2024 + 19139 00001BF4 31D2 xor dx,dx + 19140 + 19141 ; DisplayTotals uses this entry point. + 19142 ; + 19143 DisplayCntSiz: + 19144 ; AX = # files + 19145 ; FileSiz = dword total size of files + 19146 + 19147 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM + 19148 ; PCDOS 7.1 COMMAND.COM + 19149 %if 0 + 19150 mov [Dir_Num],ax ; load # files + 19151 mov dx,dirmes_ptr ; DX = ptr to message block + 19152 call std_printf ; "nnn File(s)" + 19153 + 19154 mov dx,bytes_ptr + 19155 call std_printf ; "nnn bytes",cr,lf + 19156 ; 19/02/2023 + 19157 ;call UseLine + 19158 ;dtrRet: + 19159 ;retn + 19160 + 19161 ; 19/02/2023 + 19162 jmp UseLine + 19163 %else + 19164 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 19165 00001BF6 A3[A59D] mov [Dir_Num],ax ; number of files + 19166 00001BF9 8916[A79D] mov [Dir_Num+2],dx + 19167 00001BFD BA[1A90] mov dx,dirmes_ptr ; MSG_1019, 9 bytes, word + 19168 00001C00 803E[2A9C]00 cmp byte [narrow],0 ; narrow display ? + 19169 00001C05 7503 jnz short dcs_1 ; yes + 19170 00001C07 BA[2890] mov dx,dirmes_w_ptr ; MSG_1019, 10 bytes + 19171 dcs_1: + 19172 00001C0A 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; is kilobyte display usable? + 19173 00001C0F 7403 jz short dcs_2 ; yes (big files) + 19174 00001C11 BA[3690] mov dx,dirmes2_ptr ; MSG_1019, 9 bytes, dword + 19175 dcs_2: + 19176 00001C14 E81138 call std_printf ; "nnn File(s)" + 19177 00001C17 8B0E[269C] mov cx,[FileSiz+4] ; 5th and 6th byte of the file size + 19178 ; (6th byte=0) + 19179 00001C1B E329 jcxz dcs_3 ; file size is (in) 4 bytes + 19180 00001C1D 8B16[259C] mov dx,[FileSiz+3] ; convert to kilobytes + 19181 00001C21 A1[239C] mov ax,[FileSiz+1] + 19182 00001C24 D0CD ror ch,1 ; ch = 5th byte of file size + 19183 00001C26 D1DA rcr dx,1 + 19184 00001C28 D1D8 rcr ax,1 + 19185 00001C2A D0CD ror ch,1 + 19186 00001C2C D1DA rcr dx,1 + 19187 00001C2E D1D8 rcr ax,1 ; dx:ax = (ch:dx:ax) / 1024 + 19188 00001C30 8916[249C] mov [FileSiz+2],dx + 19189 00001C34 A3[229C] mov [FileSiz],ax + 19190 00001C37 BA[7392] mov dx,kbytes_ptr ; MSG_1107 normal, 14 bytes + 19191 00001C3A 803E[2D9C]00 cmp byte [bfree_not_kilo],0 ; is kilobyte display usable? + 19192 00001C3F 741C jz short dcs_5 ; yes (big files) + 19193 ; no (not big files) + 19194 00001C41 BA[8192] mov dx,kybytes_n_ptr ; MSG_1107 narrow, 10 bytes + 19195 00001C44 EB17 jmp short dcs_5 + 19196 dcs_3: + 19197 00001C46 BA[4992] mov dx,bytes_ptr ; MSG_1079 normal, 12 bytes + 19198 00001C49 803E[2A9C]00 cmp byte [narrow],0 ; narrow display option + 19199 00001C4E 7503 jnz short dcs_4 + 19200 00001C50 BA[5792] mov dx,bytes_w_tr ; MSG_1079 wide, 14 bytes + 19201 dcs_4: + 19202 00001C53 803E[2D9C]00 cmp byte [bfree_not_kilo],0 + 19203 00001C58 7403 jz short dcs_5 + 19204 00001C5A BA[6592] mov dx,bytes_n_ptr ; MSG_1079 narrow, 10 bytes + 19205 dcs_5: + 19206 00001C5D E8C837 call std_printf ; "nnn bytes",cr,lf + 19207 ;call UseLine + 19208 ;dtrRet: + 19209 ;retn + 19210 ; 02/08/2024 + 19211 00001C60 E916FD jmp UseLine + 19212 %endif + 19213 + 19214 ; --------------------------------------------------------------------------- + 19215 + 19216 ;*** DisplayWide - display filename in wide format + 19217 ; + 19218 ; ENTRY BX = offset of entry in TPA buffer + 19219 ; + 19220 ; EXIT nothing + 19221 ; + 19222 ; USED AX,CX,DX,SI,DI + 19223 ; + 19224 ; EFFECTS + 19225 ; + 19226 ; Name.ext is displayed. Cursor left at end of field (padded + 19227 ; with blanks). Subdirectory files are displayed as [name.ext]. 19228 - 19229 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19230 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1CDEh + 19229 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19230 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:198Ah 19231 - 19232 DisplayWide: - 19233 00001C63 1E push ds ; save TRANGROUP seg addr - 19234 00001C64 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to entry - 19235 ;assume ds:nothing - 19236 - 19237 ;;test ds:[bx].fileattr,ATTR_DIRECTORY - 19238 ;test byte [bx+EntryStruc.fileattr],10h - 19239 00001C68 F6470C10 test byte [bx+12],ATTR_DIRECTORY - 19240 00001C6C 9C pushf ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19241 00001C6D 7405 jz short dw1 ; not a subdirectory file - 19242 00001C6F B05B mov al,'[' - 19243 00001C71 E83A05 call PRINT_CHAR ; prefix subdirectory - 19244 dw1: - 19245 00001C74 E82CFD call DisplayDotForm ; display name.ext - 19246 - 19247 ; DX = # chars displayed in name.ext - 19248 - 19249 ;;test ds:[bx].fileattr,ATTR_DIRECTORY - 19250 ;test byte [bx+EntryStruc.fileattr],10h - 19251 ; 03/08/2024 - 19252 ;test byte [bx+12],ATTR_DIRECTORY - 19253 00001C77 9D popf ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19254 00001C78 7405 jz short dw2 ; not a subdirectory file - 19255 00001C7A B05D mov al,']' - 19256 00001C7C E82F05 call PRINT_CHAR ; postfix subdirectory - 19257 dw2: - 19258 ; Pad field with blanks. - 19259 - 19260 ;mov cx,size filename + size fileext + 1 - 19261 00001C7F B90C00 mov cx,12 ; 8+3+1 - 19262 ; CX = field size - 19263 00001C82 29D1 sub cx,dx ; CX = # pad char's - 19264 00001C84 E307 jcxz dwDone - 19265 00001C86 B020 mov al,' ' - 19266 dw3: - 19267 00001C88 E82305 call PRINT_CHAR - 19268 00001C8B E2FB loop dw3 - 19269 dwDone: - 19270 00001C8D 1F pop ds ; DS = TRANGROUP seg addr again - 19271 ;assume ds:TRANGROUP - 19272 00001C8E C3 retn - 19273 - 19274 ; --------------------------------------------------------------------------- - 19275 - 19276 ;*** GetDriveLtr - get target drive letter - 19277 ; - 19278 ; ENTRY FCB contains drive # - 19279 ; - 19280 ; EXIT AX = "d:" - 19281 ; - 19282 ; USED nothing - 19283 - 19284 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19285 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19D8h - 19286 GetDriveLtr: - 19287 00001C8F A05C00 mov al,[FCB] ; 5Ch ; AL = target drive # - 19288 00001C92 08C0 or al,al - 19289 00001C94 7505 jnz short gdl1 ; not current drive default, skip ahead - 19290 00001C96 A0[079C] mov al,[CURDRV] ; AL = current drive # - 19291 00001C99 FEC0 inc al ; AL = 1-based drive # - 19292 gdl1: - 19293 00001C9B 0440 add al,'A'-1 ; 40h ; AL = target drive letter - 19294 00001C9D B43A mov ah,':' ; AX = "d:" - 19295 00001C9F C3 retn - 19296 - 19297 ; --------------------------------------------------------------------------- - 19298 - 19299 ;*** SetupParamError - set up for Std_EPrintf parameter parse error message - 19300 ; - 19301 ; Do for our /O and /A string parsers what Parse_With_Msg does - 19302 ; for system parser calls. Set up a message substitution block, - 19303 ; etc. for invalid value strings. I copied the procedure from - 19304 ; Setup_Parse_Error_Msg. - 19305 ; - 19306 ; ENTRY BX = ptr to system parser result buffer (contains ptr to str) - 19307 ; + 19232 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19233 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1CDEh + 19234 + 19235 DisplayWide: + 19236 00001C63 1E push ds ; save TRANGROUP seg addr + 19237 00001C64 8E1E[F79B] mov ds,[TPA] ; DS:BX = ptr to entry + 19238 ;assume ds:nothing + 19239 + 19240 ;;test ds:[bx].fileattr,ATTR_DIRECTORY + 19241 ;test byte [bx+EntryStruc.fileattr],10h + 19242 00001C68 F6470C10 test byte [bx+12],ATTR_DIRECTORY + 19243 00001C6C 9C pushf ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19244 00001C6D 7405 jz short dw1 ; not a subdirectory file + 19245 00001C6F B05B mov al,'[' + 19246 00001C71 E83A05 call PRINT_CHAR ; prefix subdirectory + 19247 dw1: + 19248 00001C74 E82CFD call DisplayDotForm ; display name.ext + 19249 + 19250 ; DX = # chars displayed in name.ext + 19251 + 19252 ;;test ds:[bx].fileattr,ATTR_DIRECTORY + 19253 ;test byte [bx+EntryStruc.fileattr],10h + 19254 ; 03/08/2024 + 19255 ;test byte [bx+12],ATTR_DIRECTORY + 19256 00001C77 9D popf ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19257 00001C78 7405 jz short dw2 ; not a subdirectory file + 19258 00001C7A B05D mov al,']' + 19259 00001C7C E82F05 call PRINT_CHAR ; postfix subdirectory + 19260 dw2: + 19261 ; Pad field with blanks. + 19262 + 19263 ;mov cx,size filename + size fileext + 1 + 19264 00001C7F B90C00 mov cx,12 ; 8+3+1 + 19265 ; CX = field size + 19266 00001C82 29D1 sub cx,dx ; CX = # pad char's + 19267 00001C84 E307 jcxz dwDone + 19268 00001C86 B020 mov al,' ' + 19269 dw3: + 19270 00001C88 E82305 call PRINT_CHAR + 19271 00001C8B E2FB loop dw3 + 19272 dwDone: + 19273 00001C8D 1F pop ds ; DS = TRANGROUP seg addr again + 19274 ;assume ds:TRANGROUP + 19275 00001C8E C3 retn + 19276 + 19277 ; --------------------------------------------------------------------------- + 19278 + 19279 ;*** GetDriveLtr - get target drive letter + 19280 ; + 19281 ; ENTRY FCB contains drive # + 19282 ; + 19283 ; EXIT AX = "d:" + 19284 ; + 19285 ; USED nothing + 19286 + 19287 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19288 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19D8h + 19289 GetDriveLtr: + 19290 00001C8F A05C00 mov al,[FCB] ; 5Ch ; AL = target drive # + 19291 00001C92 08C0 or al,al + 19292 00001C94 7505 jnz short gdl1 ; not current drive default, skip ahead + 19293 00001C96 A0[079C] mov al,[CURDRV] ; AL = current drive # + 19294 00001C99 FEC0 inc al ; AL = 1-based drive # + 19295 gdl1: + 19296 00001C9B 0440 add al,'A'-1 ; 40h ; AL = target drive letter + 19297 00001C9D B43A mov ah,':' ; AX = "d:" + 19298 00001C9F C3 retn + 19299 + 19300 ; --------------------------------------------------------------------------- + 19301 + 19302 ;*** SetupParamError - set up for Std_EPrintf parameter parse error message + 19303 ; + 19304 ; Do for our /O and /A string parsers what Parse_With_Msg does + 19305 ; for system parser calls. Set up a message substitution block, + 19306 ; etc. for invalid value strings. I copied the procedure from + 19307 ; Setup_Parse_Error_Msg. 19308 ; - 19309 ; EXIT AX = system parser error return code for bad param format - 19310 ; DX = ptr to message description block for Std_EPrintf + 19309 ; ENTRY BX = ptr to system parser result buffer (contains ptr to str) + 19310 ; 19311 ; - 19312 ; USED SI - 19313 ; - 19314 ; EFFECTS - 19315 ; - 19316 ; Msg_Disp_Class = parse error message class - 19317 ; Message block (see DX) is set up for parse error message - 19318 - 19319 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19320 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19E9h - 19321 SetupParamError: - 19322 00001CA0 B80900 mov ax,9 ; parse error # - 19323 00001CA3 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class - 19324 ;mov byte [msg_disp_class],2 - 19325 00001CA8 A3[D78F] mov [extend_buf_ptr],ax - 19326 ;mov si,[bx+ResultBuffer.ValuePtr] - 19327 00001CAB 8B7704 mov si,[bx+4] - 19328 00001CAE 8936[A09D] mov [string_ptr_2],si - 19329 00001CB2 C606[D98F]01 mov byte [extend_buf_sub],one_subst - 19330 ;mov byte [extend_buf_sub],1 - 19331 00001CB7 BA[D78F] mov dx,extend_buf_ptr - 19332 00001CBA C3 retn - 19333 - 19334 ; --------------------------------------------------------------------------- - 19335 - 19336 ;*** ZeroTotals - zero grand total file count, size - 19337 ; - 19338 ; ENTRY nothing - 19339 ; - 19340 ; EXIT nothing - 19341 ; - 19342 ; USED AX - 19343 ; - 19344 ; EFFECTS - 19345 ; - 19346 ; FileCntTotal & FileSizTotal are zeroed. - 19347 ; - 19348 ; NOTES - 19349 ; - 19350 ; FileCntTotal throuth csecUsedTotal must be together! - 19351 - 19352 ; 05/06/2023 - 19353 ;ifdef DBLSPACE_HOOKS - 19354 ;csecSIZE EQU size csecUsed + size csecUsedDir + size csecUsedTotal - 19355 ;ccluSIZE EQU size ccluUsed + size ccluUsedDir + size ccluUsedTotal - 19356 ;endif - 19357 - 19358 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19359 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A13h + 19312 ; EXIT AX = system parser error return code for bad param format + 19313 ; DX = ptr to message description block for Std_EPrintf + 19314 ; + 19315 ; USED SI + 19316 ; + 19317 ; EFFECTS + 19318 ; + 19319 ; Msg_Disp_Class = parse error message class + 19320 ; Message block (see DX) is set up for parse error message + 19321 + 19322 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19323 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:19E9h + 19324 SetupParamError: + 19325 00001CA0 B80900 mov ax,9 ; parse error # + 19326 00001CA3 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class + 19327 ;mov byte [msg_disp_class],2 + 19328 00001CA8 A3[D78F] mov [extend_buf_ptr],ax + 19329 ;mov si,[bx+ResultBuffer.ValuePtr] + 19330 00001CAB 8B7704 mov si,[bx+4] + 19331 00001CAE 8936[A09D] mov [string_ptr_2],si + 19332 00001CB2 C606[D98F]01 mov byte [extend_buf_sub],one_subst + 19333 ;mov byte [extend_buf_sub],1 + 19334 00001CB7 BA[D78F] mov dx,extend_buf_ptr + 19335 00001CBA C3 retn + 19336 + 19337 ; --------------------------------------------------------------------------- + 19338 + 19339 ;*** ZeroTotals - zero grand total file count, size + 19340 ; + 19341 ; ENTRY nothing + 19342 ; + 19343 ; EXIT nothing + 19344 ; + 19345 ; USED AX + 19346 ; + 19347 ; EFFECTS + 19348 ; + 19349 ; FileCntTotal & FileSizTotal are zeroed. + 19350 ; + 19351 ; NOTES + 19352 ; + 19353 ; FileCntTotal throuth csecUsedTotal must be together! + 19354 + 19355 ; 05/06/2023 + 19356 ;ifdef DBLSPACE_HOOKS + 19357 ;csecSIZE EQU size csecUsed + size csecUsedDir + size csecUsedTotal + 19358 ;ccluSIZE EQU size ccluUsed + size ccluUsedDir + size ccluUsedTotal + 19359 ;endif 19360 - 19361 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 19362 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C08h + 19361 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19362 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A13h 19363 - 19364 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19365 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D67h - 19366 ZeroTotals: - 19367 00001CBB BF[5E9C] mov di,FileCntTotal - 19368 - 19369 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 19370 ;;mov cx,size FileCntTotal+size FileSizTotal - 19371 ;mov cx,8 - 19372 ;ifdef DBLSPACE_HOOKS - 19373 ;mov cx,size FileCntTotal+size FileSizTotal+csecSIZE+ccluSIZE - 19374 ;endif - 19375 ;mov cx,26 - 19376 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 19377 00001CBE B90C00 mov cx,12 - 19378 - 19379 00001CC1 30C0 xor al,al - 19380 00001CC3 F3AA rep stosb - 19381 00001CC5 C3 retn - 19382 - 19383 ; --------------------------------------------------------------------------- - 19384 - 19385 ;*** CtrlCHandler - our own control-c handler - 19386 ; - 19387 ; Make sure user's default directory gets restored. See notes - 19388 ; at InstallCtrlCHandler. + 19364 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 19365 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C08h + 19366 + 19367 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19368 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D67h + 19369 ZeroTotals: + 19370 00001CBB BF[5E9C] mov di,FileCntTotal + 19371 + 19372 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 19373 ;;mov cx,size FileCntTotal+size FileSizTotal + 19374 ;mov cx,8 + 19375 ;ifdef DBLSPACE_HOOKS + 19376 ;mov cx,size FileCntTotal+size FileSizTotal+csecSIZE+ccluSIZE + 19377 ;endif + 19378 ;mov cx,26 + 19379 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 19380 00001CBE B90C00 mov cx,12 + 19381 + 19382 00001CC1 30C0 xor al,al + 19383 00001CC3 F3AA rep stosb + 19384 00001CC5 C3 retn + 19385 + 19386 ; --------------------------------------------------------------------------- + 19387 + 19388 ;*** CtrlCHandler - our own control-c handler 19389 ; - 19390 ; ENTRY control-c - 19391 ; - 19392 ; EXIT to OldCtrlCHandler - 19393 ; - 19394 ; USED DS,flags - 19395 ; - 19396 ; EFFECTS - 19397 ; - 19398 ; Restore user's default directory. - 19399 ; - 19400 ; NOTES - 19401 ; - 19402 ; This handler is only installed after calling PathCrunch, - 19403 ; which sets UserDir1, so the restoration will work. + 19390 ; Make sure user's default directory gets restored. See notes + 19391 ; at InstallCtrlCHandler. + 19392 ; + 19393 ; ENTRY control-c + 19394 ; + 19395 ; EXIT to OldCtrlCHandler + 19396 ; + 19397 ; USED DS,flags + 19398 ; + 19399 ; EFFECTS + 19400 ; + 19401 ; Restore user's default directory. + 19402 ; + 19403 ; NOTES 19404 ; - 19405 ; The original control-c vector will be restored, whether - 19406 ; or not this one is invoked, in the HeadFix routine. - 19407 - 19408 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19409 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A1Eh + 19405 ; This handler is only installed after calling PathCrunch, + 19406 ; which sets UserDir1, so the restoration will work. + 19407 ; + 19408 ; The original control-c vector will be restored, whether + 19409 ; or not this one is invoked, in the HeadFix routine. 19410 - 19411 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM - 19412 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C13h ; * + 19411 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19412 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A1Eh 19413 - 19414 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19415 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D72h + 19414 ; 05/06/2023 - Retro DOS v4.2 COMMAND.COM + 19415 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C13h ; * 19416 - 19417 CtrlCHandler: ;proc far - 19418 - 19419 ;SR; - 19420 ; Save all registers used: ds, dx, ax. I know ax is being used by the - 19421 ;CtrlC handler, am not sure about ds & dx. Save them to be safe - 19422 ; - 19423 00001CC6 1E push ds - 19424 00001CC7 0E push cs - 19425 00001CC8 1F pop ds ; DS = TRANGROUP seg addr - 19426 00001CC9 50 push ax - 19427 - 19428 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 19429 %if 0 - 19430 push bx ; * - 19431 push dx - 19432 call CloseCVF ; * ; close CVF file if open - 19433 call RestUDir ; restore user's default directory - 19434 pop dx - 19435 pop bx ; * - 19436 %else - 19437 00001CCA 52 push dx - 19438 00001CCB E8620B call RestUDir ; restore user's default directory - 19439 00001CCE 5A pop dx - 19440 %endif - 19441 00001CCF 58 pop ax - 19442 00001CD0 1F pop ds - 19443 00001CD1 2EFF2E[C3A5] jmp far [cs:OldCtrlCHandler] - 19444 ; go to previous int 23 handler - 19445 - 19446 ; --------------------------------------------------------------------------- - 19447 - 19448 ;M010;start - 19449 ;*** LowerCase - convert ASCII character in AL to lowercase - 19450 ; - 19451 ; ENTRY AL = character to be displayed - 19452 ; - 19453 ; EXIT AL is lowercase - 19454 ; - 19455 ; USED nothing - 19456 - 19457 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19458 LowerCase: - 19459 00001CD6 3C41 cmp al,'A' ; ensure AL is in range 'A'-'Z' - 19460 00001CD8 7206 jb short lcRet - 19461 00001CDA 3C5A cmp al,'Z' - 19462 00001CDC 7702 ja short lcRet - 19463 - 19464 00001CDE 0C20 or al,20h ; convert to ASCII lowercase (UpperCase+32)-->LowerCase - 19465 lcRet: - 19466 00001CE0 C3 retn - 19467 - 19468 ; --------------------------------------------------------------------------- - 19469 - 19470 ;*** LowercaseString - convert ASCIIZ string at DS:SI to lowercase - 19471 ; - 19472 ; ENTRY DS:SI points to start of ASCIIZ string - 19473 ; ES = DS + 19417 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19418 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1D72h + 19419 + 19420 CtrlCHandler: ;proc far + 19421 + 19422 ;SR; + 19423 ; Save all registers used: ds, dx, ax. I know ax is being used by the + 19424 ;CtrlC handler, am not sure about ds & dx. Save them to be safe + 19425 ; + 19426 00001CC6 1E push ds + 19427 00001CC7 0E push cs + 19428 00001CC8 1F pop ds ; DS = TRANGROUP seg addr + 19429 00001CC9 50 push ax + 19430 + 19431 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 19432 %if 0 + 19433 push bx ; * + 19434 push dx + 19435 call CloseCVF ; * ; close CVF file if open + 19436 call RestUDir ; restore user's default directory + 19437 pop dx + 19438 pop bx ; * + 19439 %else + 19440 00001CCA 52 push dx + 19441 00001CCB E8620B call RestUDir ; restore user's default directory + 19442 00001CCE 5A pop dx + 19443 %endif + 19444 00001CCF 58 pop ax + 19445 00001CD0 1F pop ds + 19446 00001CD1 2EFF2E[C3A5] jmp far [cs:OldCtrlCHandler] + 19447 ; go to previous int 23 handler + 19448 + 19449 ; --------------------------------------------------------------------------- + 19450 + 19451 ;M010;start + 19452 ;*** LowerCase - convert ASCII character in AL to lowercase + 19453 ; + 19454 ; ENTRY AL = character to be displayed + 19455 ; + 19456 ; EXIT AL is lowercase + 19457 ; + 19458 ; USED nothing + 19459 + 19460 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19461 LowerCase: + 19462 00001CD6 3C41 cmp al,'A' ; ensure AL is in range 'A'-'Z' + 19463 00001CD8 7206 jb short lcRet + 19464 00001CDA 3C5A cmp al,'Z' + 19465 00001CDC 7702 ja short lcRet + 19466 + 19467 00001CDE 0C20 or al,20h ; convert to ASCII lowercase (UpperCase+32)-->LowerCase + 19468 lcRet: + 19469 00001CE0 C3 retn + 19470 + 19471 ; --------------------------------------------------------------------------- + 19472 + 19473 ;*** LowercaseString - convert ASCIIZ string at DS:SI to lowercase 19474 ; - 19475 ; EXIT nothing - 19476 ; - 19477 ; USED AL,SI - 19478 - 19479 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 19480 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 19481 LowercaseString: - 19482 00001CE1 57 push di ; save di - 19483 00001CE2 89F7 mov di,si ; ES:DI --> ASCIIZ string - 19484 00001CE4 FC cld - 19485 NextChar: - 19486 00001CE5 AC lodsb ; get character from string into al - 19487 00001CE6 08C0 or al,al ; are we at end of string? - 19488 00001CE8 7414 jz short EndOfString - 19489 - 19490 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 19491 %if 1 - 19492 ;ifdef DBCS - 19493 ;invoke testkanj - 19494 ;jz @f ; if this is not lead byte - 19495 00001CEA E8740A call testkanj - 19496 00001CED 7409 jz short NextChar_@ - 19497 00001CEF AA stosb ; store lead byte - 19498 00001CF0 AC lodsb ; get tail byte - 19499 00001CF1 08C0 or al,al - 19500 00001CF3 7409 jz short EndOfString ; if end - 19501 00001CF5 AA stosb ; store tail byte - 19502 00001CF6 EBED jmp short NextChar - 19503 ;@@: - 19504 NextChar_@: - 19505 ;endif - 19506 %endif - 19507 00001CF8 E8DBFF call LowerCase ; convert character to lowercase - 19508 00001CFB AA stosb ; store character back into buffer - 19509 00001CFC EBE7 jmp short NextChar ; repeat until end of string - 19510 - 19511 EndOfString: - 19512 00001CFE 5F pop di ; restore di - 19513 00001CFF C3 retn - 19514 - 19515 ;M010;end - 19516 - 19517 ; 08/06/2023 - 19518 ; --------------------------------------------------------------------------- - 19519 ; MSDOS 6.2(2) COMMAND.COM procedure only ! - 19520 ; ----------------------------------------- - 19521 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan - 19522 ; --------------------------------------------------------------------------- - 19523 - 19524 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 19525 %if 0 - 19526 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 19527 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C44h - 19528 screen_f_set: - 19529 ; set dir display parameters depending on screen width (# of columns) - 19530 push ds - 19531 mov ax,40h - 19532 mov ds,ax - 19533 cmp word [4Ah],40 ; Check ROMBIOS DATA colums per row - 19534 ; value (80 or 40) - 19535 pop ds - 19536 jnz short columns_80 ; 80 columns per line (video mode 3) - 19537 and byte [screen_f_1],0BFh ; ~40h - 19538 mov word [screen_f_2],0A0Ah ; 10 bytes (file size field) - 19539 and byte [screen_f_3],0BFh - 19540 and byte [screen_f_4],0BFh - 19541 mov word [screen_f_5],0A0Ah ; 10 bytes (file size field) - 19542 and byte [screen_f_6],0BFh - 19543 mov word [screen_f_7],1C1Ch ; 28 bytes (free bytes field) - 19544 ;jmp short screen_f_set_retn - 19545 retn - 19546 columns_80: - 19547 or byte [screen_f_1],40h - 19548 mov word [screen_f_2],0E0Eh ; 14 bytes (file size field) - 19549 or byte [screen_f_3],40h - 19550 or byte [screen_f_4],40h - 19551 mov word [screen_f_5],0E0Eh ; 14 bytes (file size field) - 19552 or byte [screen_f_6],40h - 19553 mov word [screen_f_7],2020h ; 32 bytes (free bytes field) - 19554 screen_f_set_retn: - 19555 retn - 19556 %endif - 19557 - 19558 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 19559 %if 0 + 19475 ; ENTRY DS:SI points to start of ASCIIZ string + 19476 ; ES = DS + 19477 ; + 19478 ; EXIT nothing + 19479 ; + 19480 ; USED AL,SI + 19481 + 19482 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 19483 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 19484 LowercaseString: + 19485 00001CE1 57 push di ; save di + 19486 00001CE2 89F7 mov di,si ; ES:DI --> ASCIIZ string + 19487 00001CE4 FC cld + 19488 NextChar: + 19489 00001CE5 AC lodsb ; get character from string into al + 19490 00001CE6 08C0 or al,al ; are we at end of string? + 19491 00001CE8 7414 jz short EndOfString + 19492 + 19493 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 19494 %if 1 + 19495 ;ifdef DBCS + 19496 ;invoke testkanj + 19497 ;jz @f ; if this is not lead byte + 19498 00001CEA E8740A call testkanj + 19499 00001CED 7409 jz short NextChar_@ + 19500 00001CEF AA stosb ; store lead byte + 19501 00001CF0 AC lodsb ; get tail byte + 19502 00001CF1 08C0 or al,al + 19503 00001CF3 7409 jz short EndOfString ; if end + 19504 00001CF5 AA stosb ; store tail byte + 19505 00001CF6 EBED jmp short NextChar + 19506 ;@@: + 19507 NextChar_@: + 19508 ;endif + 19509 %endif + 19510 00001CF8 E8DBFF call LowerCase ; convert character to lowercase + 19511 00001CFB AA stosb ; store character back into buffer + 19512 00001CFC EBE7 jmp short NextChar ; repeat until end of string + 19513 + 19514 EndOfString: + 19515 00001CFE 5F pop di ; restore di + 19516 00001CFF C3 retn + 19517 + 19518 ;M010;end + 19519 + 19520 ; 08/06/2023 + 19521 ; --------------------------------------------------------------------------- + 19522 ; MSDOS 6.2(2) COMMAND.COM procedure only ! + 19523 ; ----------------------------------------- + 19524 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan + 19525 ; --------------------------------------------------------------------------- + 19526 + 19527 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 19528 %if 0 + 19529 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 19530 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1C44h + 19531 screen_f_set: + 19532 ; set dir display parameters depending on screen width (# of columns) + 19533 push ds + 19534 mov ax,40h + 19535 mov ds,ax + 19536 cmp word [4Ah],40 ; Check ROMBIOS DATA colums per row + 19537 ; value (80 or 40) + 19538 pop ds + 19539 jnz short columns_80 ; 80 columns per line (video mode 3) + 19540 and byte [screen_f_1],0BFh ; ~40h + 19541 mov word [screen_f_2],0A0Ah ; 10 bytes (file size field) + 19542 and byte [screen_f_3],0BFh + 19543 and byte [screen_f_4],0BFh + 19544 mov word [screen_f_5],0A0Ah ; 10 bytes (file size field) + 19545 and byte [screen_f_6],0BFh + 19546 mov word [screen_f_7],1C1Ch ; 28 bytes (free bytes field) + 19547 ;jmp short screen_f_set_retn + 19548 retn + 19549 columns_80: + 19550 or byte [screen_f_1],40h + 19551 mov word [screen_f_2],0E0Eh ; 14 bytes (file size field) + 19552 or byte [screen_f_3],40h + 19553 or byte [screen_f_4],40h + 19554 mov word [screen_f_5],0E0Eh ; 14 bytes (file size field) + 19555 or byte [screen_f_6],40h + 19556 mov word [screen_f_7],2020h ; 32 bytes (free bytes field) + 19557 screen_f_set_retn: + 19558 retn + 19559 %endif 19560 - 19561 ;============================================================================ - 19562 ; CRATIO.ASM, MSDOS 6.0, 1992 - 19563 ;============================================================================ - 19564 ; 08/06/2023 - Retro DOS v4.2 - 19565 - 19566 ; The code to calculate compression ratios requires access to the drive's - 19567 ; (DOS) FAT and MagicDrv FAT regions. Two buffers are used (one for each - 19568 ; FAT type). pbufDOSFAT and pbufMDFAT contain the offset to the buffers, - 19569 ; segFATBuf contains the segment (both buffers are in the same segment). - 19570 ; The buffers are of variable size: cFATEntries contains the size of the - 19571 ; buffers in terms of the number of FAT entries they can contain. - 19572 - 19573 ; --------------------------------------------------------------------------- - 19574 - 19575 ;*** OpenCVF - open Compressed Volume File for compression ratio report - 19576 ; - 19577 ; ENTRY - 19578 ; FCB setup with drive for DIR + 19561 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 19562 %if 0 + 19563 + 19564 ;============================================================================ + 19565 ; CRATIO.ASM, MSDOS 6.0, 1992 + 19566 ;============================================================================ + 19567 ; 08/06/2023 - Retro DOS v4.2 + 19568 + 19569 ; The code to calculate compression ratios requires access to the drive's + 19570 ; (DOS) FAT and MagicDrv FAT regions. Two buffers are used (one for each + 19571 ; FAT type). pbufDOSFAT and pbufMDFAT contain the offset to the buffers, + 19572 ; segFATBuf contains the segment (both buffers are in the same segment). + 19573 ; The buffers are of variable size: cFATEntries contains the size of the + 19574 ; buffers in terms of the number of FAT entries they can contain. + 19575 + 19576 ; --------------------------------------------------------------------------- + 19577 + 19578 ;*** OpenCVF - open Compressed Volume File for compression ratio report 19579 ; - 19580 ; EXIT If successful, CY clear, CVF file open, fhCVF has file handle, - 19581 ; szCVF has \0 terminated CVF file name, MDBPB loaded. + 19580 ; ENTRY + 19581 ; FCB setup with drive for DIR 19582 ; - 19583 ; If unsuccessful, CY set - 19584 ; - 19585 ; USED AX, BX, CX, DX, SI, DI - 19586 - 19587 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 19588 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1CA1h - 19589 OpenCVF: - 19590 mov ax,-1 - 19591 mov [fhCVF],ax ;indicate CVF not open - 19592 mov [entInBuf],ax ; and no FAT entries in buffers - 19593 - 19594 mov dl,[FCB] ; mov dl,5Ch ;target drive of DIR cmd - 19595 or dl,dl ;default drive? - 19596 jz short ocvf_default - 19597 dec dl ;no, from 1=A to 0=A - 19598 jmp short ocvf_swap_info - 19599 - 19600 ocvf_default: - 19601 mov dl,[CURDRV] ;0=A, 1=B, ... + 19583 ; EXIT If successful, CY clear, CVF file open, fhCVF has file handle, + 19584 ; szCVF has \0 terminated CVF file name, MDBPB loaded. + 19585 ; + 19586 ; If unsuccessful, CY set + 19587 ; + 19588 ; USED AX, BX, CX, DX, SI, DI + 19589 + 19590 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 19591 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1CA1h + 19592 OpenCVF: + 19593 mov ax,-1 + 19594 mov [fhCVF],ax ;indicate CVF not open + 19595 mov [entInBuf],ax ; and no FAT entries in buffers + 19596 + 19597 mov dl,[FCB] ; mov dl,5Ch ;target drive of DIR cmd + 19598 or dl,dl ;default drive? + 19599 jz short ocvf_default + 19600 dec dl ;no, from 1=A to 0=A + 19601 jmp short ocvf_swap_info 19602 - 19603 ocvf_swap_info: - 19604 mov ax,4A11h ; multMagicDrv ;magicdrv Int 2Fh multiplex ID - 19605 mov bx,1 ; MD_DRIVE_MAP ;get drive swap info - 19606 int 2fh - 19607 - 19608 or ax,ax ;0 if okay - 19609 jnz short ocvf_error + 19603 ocvf_default: + 19604 mov dl,[CURDRV] ;0=A, 1=B, ... + 19605 + 19606 ocvf_swap_info: + 19607 mov ax,4A11h ; multMagicDrv ;magicdrv Int 2Fh multiplex ID + 19608 mov bx,1 ; MD_DRIVE_MAP ;get drive swap info + 19609 int 2fh 19610 - 19611 test bl,80h ;80h set if compressed volume - 19612 jz short ocvf_error + 19611 or ax,ax ;0 if okay + 19612 jnz short ocvf_error 19613 - 19614 and bl,7Fh ;bl = host drive, bh = seq # - 19615 - 19616 ; The CVF may have been mounted from a swapped host drive, in which - 19617 ; case the host drive returned in BL is the original host (now - 19618 ; swapped with a CVF). Make a second drive swap info call on the - 19619 ; returned host to see if it must be accessed by a different drive - 19620 ; letter. - 19621 - 19622 push bx - 19623 push dx ;save dl, orig drive letter + 19614 test bl,80h ;80h set if compressed volume + 19615 jz short ocvf_error + 19616 + 19617 and bl,7Fh ;bl = host drive, bh = seq # + 19618 + 19619 ; The CVF may have been mounted from a swapped host drive, in which + 19620 ; case the host drive returned in BL is the original host (now + 19621 ; swapped with a CVF). Make a second drive swap info call on the + 19622 ; returned host to see if it must be accessed by a different drive + 19623 ; letter. 19624 - 19625 mov ax,4A11h ; mov ax,multMagicDrv - 19626 mov dl,bl - 19627 mov bx,1 ; mov bx,MD_DRIVE_MAP - 19628 int 2fh - 19629 - 19630 pop dx - 19631 pop cx ;bx from 1st drive swap info call + 19625 push bx + 19626 push dx ;save dl, orig drive letter + 19627 + 19628 mov ax,4A11h ; mov ax,multMagicDrv + 19629 mov dl,bl + 19630 mov bx,1 ; mov bx,MD_DRIVE_MAP + 19631 int 2fh 19632 - 19633 or ax,ax ;0 if okay - 19634 jnz short ocvf_error + 19633 pop dx + 19634 pop cx ;bx from 1st drive swap info call 19635 - 19636 and bl,7Fh - 19637 xchg bx,cx ;bx = 1st, cx = 2nd swap results + 19636 or ax,ax ;0 if okay + 19637 jnz short ocvf_error 19638 - 19639 cmp dl,cl ;2nd swap info call return orig drive? - 19640 je short ocvf_got_host ;yes, 1st swap info call returned host + 19639 and bl,7Fh + 19640 xchg bx,cx ;bx = 1st, cx = 2nd swap results 19641 - 19642 mov bl,cl ;no, use swapped host, orig seq # - 19643 ocvf_got_host: - 19644 ; Build the filename of the Compressed Volume File - 19645 - 19646 ;mov di,offset TRANGROUP:szCVF - 19647 ;CVF name buffer - 19648 mov di,szCVF - 19649 - 19650 mov al,bl - 19651 add al,'A' - 19652 mov ah,':' - 19653 cld - 19654 stosw ; drive: - 19655 - 19656 ;mov si,offset TRANGROUP:sCVFRoot - 19657 ; \name. - 19658 mov si,sCVFRoot ; "\DBLSPACE" - 19659 ;mov cx,cbCVFRoot - 19660 mov cx,10 - 19661 rep movsb - 19662 - 19663 add di,3 ; point past extension - 19664 xor al,al - 19665 std - 19666 stosb ; null terminate - 19667 - 19668 mov al,bh ; seq # - 19669 mov bl,10 - 19670 ;mov cx,3 ; 3 digit ext/seq # - 19671 mov cl,3 - 19672 ;@@: - 19673 ocvf_1: xor ah,ah ; convert seq # to ascii - 19674 div bl ; and store as CVF extension - 19675 add ah,'0' - 19676 xchg ah,al - 19677 stosb - 19678 mov al,ah - 19679 ;loop @b - 19680 loop ocvf_1 - 19681 - 19682 cld - 19683 - 19684 ; Now open the Compressed Volume File - 19685 - 19686 ; 08/06/2023 - 19687 ; MSDOS 6.22 COMMAND.COM code only ! - 19688 ;;; - 19689 mov di,szCVF ; * - 19690 mov word [di+4],5652h ; 'RV' (DRVSPACE) - 19691 mov ax,3D00h - 19692 ;mov dx,szCVF - 19693 mov dx,di ; * - 19694 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 19695 ; DS:DX -> ASCIZ filename - 19696 ; AL = access mode - 19697 ; 0 - read - 19698 jnb short ocvf_2 - 19699 mov word [di+4],4C42h ; 'BL' (DBLSPACE) - 19700 ;;; - 19701 - 19702 ;mov ax,(OPEN shl 8) or 00h ;compatibility mode/read access - 19703 mov ax,3D00h - 19704 ;;mov dx,offset TRANGROUP:szCVF - 19705 ;mov dx,szCVF - 19706 mov dx,di ; * - 19707 int 21h - 19708 ;jc short ocvf_error - 19709 ; 18/06/2023 - 19710 jnc short ocvf_2 - 19711 ocvf_error: ; 18/06/2023 - 19712 stc ;indicate failure - 19713 retn - 19714 ocvf_2: - 19715 mov [fhCVF],ax ; success, save CVF file handle - 19716 - 19717 ; Read the extended MagicDrv BPB - 19718 - 19719 mov bx,ax - 19720 ;mov ah,READ - 19721 mov ah,3Fh - 19722 ;mov cx,size MD_BPB - 19723 mov cx,64 - 19724 ;mov dx,offset TRANGROUP:MDBPB - 19725 mov dx,MDBPB - 19726 int 21h - 19727 jc short ocvf_error1 - 19728 - 19729 cmp ax,cx ; get it all? - 19730 je short ocvf_pick_cluster_size - 19731 ; yes... - 19732 ocvf_error1: - 19733 call CloseCVF - 19734 ; 18/06/2023 - 19735 ;ocvf_error: - 19736 stc ;indicate failure - 19737 ;jmp short ocvf_ret - 19738 retn - 19739 - 19740 ; Determine the cluster size to use for ratio calculation - 19741 - 19742 ocvf_pick_cluster_size: - 19743 cmp byte [fUseHostSize],0 ; user want Host drive cluster size? - 19744 je short ovcf_use_CVF_size ; no, use CVF cluster size - 19745 - 19746 ;mov ah,Get_Drive_Data ; get the host drive cluster size - 19747 mov ah,1Ch - 19748 mov dl,[szCVF] - 19749 ;sub dl,40h - 19750 sub dl,'A'-1 ; 1 = A, 2 = B, ... - 19751 push ds - 19752 int 21h - 19753 pop ds - 19754 - 19755 cmp al,0FFh ; host drive cluster size in AL if okay, - 19756 jne short ovcf_set_size ; failed = 0FFh + 19642 cmp dl,cl ;2nd swap info call return orig drive? + 19643 je short ocvf_got_host ;yes, 1st swap info call returned host + 19644 + 19645 mov bl,cl ;no, use swapped host, orig seq # + 19646 ocvf_got_host: + 19647 ; Build the filename of the Compressed Volume File + 19648 + 19649 ;mov di,offset TRANGROUP:szCVF + 19650 ;CVF name buffer + 19651 mov di,szCVF + 19652 + 19653 mov al,bl + 19654 add al,'A' + 19655 mov ah,':' + 19656 cld + 19657 stosw ; drive: + 19658 + 19659 ;mov si,offset TRANGROUP:sCVFRoot + 19660 ; \name. + 19661 mov si,sCVFRoot ; "\DBLSPACE" + 19662 ;mov cx,cbCVFRoot + 19663 mov cx,10 + 19664 rep movsb + 19665 + 19666 add di,3 ; point past extension + 19667 xor al,al + 19668 std + 19669 stosb ; null terminate + 19670 + 19671 mov al,bh ; seq # + 19672 mov bl,10 + 19673 ;mov cx,3 ; 3 digit ext/seq # + 19674 mov cl,3 + 19675 ;@@: + 19676 ocvf_1: xor ah,ah ; convert seq # to ascii + 19677 div bl ; and store as CVF extension + 19678 add ah,'0' + 19679 xchg ah,al + 19680 stosb + 19681 mov al,ah + 19682 ;loop @b + 19683 loop ocvf_1 + 19684 + 19685 cld + 19686 + 19687 ; Now open the Compressed Volume File + 19688 + 19689 ; 08/06/2023 + 19690 ; MSDOS 6.22 COMMAND.COM code only ! + 19691 ;;; + 19692 mov di,szCVF ; * + 19693 mov word [di+4],5652h ; 'RV' (DRVSPACE) + 19694 mov ax,3D00h + 19695 ;mov dx,szCVF + 19696 mov dx,di ; * + 19697 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 19698 ; DS:DX -> ASCIZ filename + 19699 ; AL = access mode + 19700 ; 0 - read + 19701 jnb short ocvf_2 + 19702 mov word [di+4],4C42h ; 'BL' (DBLSPACE) + 19703 ;;; + 19704 + 19705 ;mov ax,(OPEN shl 8) or 00h ;compatibility mode/read access + 19706 mov ax,3D00h + 19707 ;;mov dx,offset TRANGROUP:szCVF + 19708 ;mov dx,szCVF + 19709 mov dx,di ; * + 19710 int 21h + 19711 ;jc short ocvf_error + 19712 ; 18/06/2023 + 19713 jnc short ocvf_2 + 19714 ocvf_error: ; 18/06/2023 + 19715 stc ;indicate failure + 19716 retn + 19717 ocvf_2: + 19718 mov [fhCVF],ax ; success, save CVF file handle + 19719 + 19720 ; Read the extended MagicDrv BPB + 19721 + 19722 mov bx,ax + 19723 ;mov ah,READ + 19724 mov ah,3Fh + 19725 ;mov cx,size MD_BPB + 19726 mov cx,64 + 19727 ;mov dx,offset TRANGROUP:MDBPB + 19728 mov dx,MDBPB + 19729 int 21h + 19730 jc short ocvf_error1 + 19731 + 19732 cmp ax,cx ; get it all? + 19733 je short ocvf_pick_cluster_size + 19734 ; yes... + 19735 ocvf_error1: + 19736 call CloseCVF + 19737 ; 18/06/2023 + 19738 ;ocvf_error: + 19739 stc ;indicate failure + 19740 ;jmp short ocvf_ret + 19741 retn + 19742 + 19743 ; Determine the cluster size to use for ratio calculation + 19744 + 19745 ocvf_pick_cluster_size: + 19746 cmp byte [fUseHostSize],0 ; user want Host drive cluster size? + 19747 je short ovcf_use_CVF_size ; no, use CVF cluster size + 19748 + 19749 ;mov ah,Get_Drive_Data ; get the host drive cluster size + 19750 mov ah,1Ch + 19751 mov dl,[szCVF] + 19752 ;sub dl,40h + 19753 sub dl,'A'-1 ; 1 = A, 2 = B, ... + 19754 push ds + 19755 int 21h + 19756 pop ds 19757 - 19758 ovcf_use_CVF_size: - 19759 ;mov al,[MDBPB.dos_bpb.csecPerClu] - 19760 mov al,[MDBPB+0Dh] ; using CVF cluster size - 19761 - 19762 ovcf_set_size: - 19763 mov [csecPerCluster],al + 19758 cmp al,0FFh ; host drive cluster size in AL if okay, + 19759 jne short ovcf_set_size ; failed = 0FFh + 19760 + 19761 ovcf_use_CVF_size: + 19762 ;mov al,[MDBPB.dos_bpb.csecPerClu] + 19763 mov al,[MDBPB+0Dh] ; using CVF cluster size 19764 - 19765 ; Lastly, setup the FAT buffers - 19766 ocvf_set_buf: - 19767 mov ax,[BYTCNT] ; if >= 32k TPA space available, - 19768 mov [savBytCnt],ax ; setup larger FAT buffers - 19769 cmp ax,32*1024 ; 8000h - 19770 jae short ocvf_big_buf - 19771 - 19772 ; small TPA, use small resident buffers - 19773 - 19774 ;mov word ptr [cFATEntries],cRES_FAT_ENTRIES - 19775 mov word [cFATEntries],32 ; cRES_FAT_ENTRIES - 19776 mov [segFATBuf],ds - 19777 ;mov word ptr [pbufDOSFAT],offset TRANGROUP:bufDOSFAT - 19778 ;mov word ptr [pbufMDFAT],offset TRANGROUP:bufMDFAT - 19779 mov word [pbufDOSFAT],bufDOSFAT - 19780 mov word [pbufMDFAT],bufMDFAT - 19781 ;jmp short ocvf_success - 19782 ; 08/06/2023 - 19783 ; cf = 1 - 19784 clc - 19785 retn - 19786 - 19787 ocvf_big_buf: - 19788 ;mov bx,cBIG_FAT_ENTRIES - 19789 mov bx,256 - 19790 mov [cFATEntries],bx - 19791 - 19792 shl bx,1 ; 6 bytes per entry (2 for DOS FAT, 4 MD FAT) - 19793 mov cx,bx ; entries * 2 - 19794 shl bx,1 - 19795 add bx,cx ; bx = # entries * 6 - 19796 - 19797 sub ax,bx ; reduce TPA size by size of FAT buffers - 19798 and ax,0FE00h ; init code rounds BytCnt down to multiple of - 19799 mov [BYTCNT],ax ; 512 bytes -- a no-op with some buf sizes. - 19800 - 19801 mov bx,[TPA] ; buffers in the TPA - 19802 mov [segFATBuf],bx - 19803 mov [pbufDOSFAT],ax ; DOS FAT buffer offset - 19804 add ax,cx ; + DOS FAT buffer size - 19805 mov [pbufMDFAT],ax ; = MD FAT buffer offset - 19806 ; 08/06/2023 - 19807 ; cf = 0 - 19808 ;ocvf_success: - 19809 ;clc ;indicate success - 19810 ocvf_ret: - 19811 retn - 19812 - 19813 ; --------------------------------------------------------------------------- - 19814 - 19815 ;*** CloseCVF - close Compressed Volume File - 19816 ; - 19817 ; ENTRY fhCVF has file handle - 19818 ; - 19819 ; EXIT - 19820 ; - 19821 ; USED AX, BX, CX, DX - 19822 - 19823 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 19824 CloseCVF: - 19825 mov bx,[fhCVF] ; -1 unless file is open - 19826 cmp bx,-1 ; 0FFFFh - 19827 je short ccvf_ret - 19828 - 19829 ;mov ah,CLOSE - 19830 mov ah,3Eh - 19831 int 21h - 19832 - 19833 mov word [fhCVF],-1 ; 0FFFFh ; don't try to close again - 19834 - 19835 mov ax,[savBytCnt] ; 'deallocate' DOS & MD FAT buffers - 19836 mov [BYTCNT],ax ; by restoring old TPA byte count - 19837 ccvf_ret: - 19838 retn - 19839 - 19840 ; --------------------------------------------------------------------------- - 19841 - 19842 ;*** CalcCompRatio - calculate file compression ratio - 19843 ; - 19844 ; ENTRY AX = starting cluster of file to get compression ratio of - 19845 ; - 19846 ; EXIT AX = compression ratio. Example: a ratio of 2.7 to 1.0 - 19847 ; will return AH = 02h & AL = 07h - 19848 ; ccluUsed set to # DOS clusters used by file - 19849 ; csecUsed set to # compressed sectors used by file - 19850 ; ccluUsedDir, ccluUsedTotal, csecUsedDir, csecUsedTotal updated - 19851 ; USED none - 19852 - 19853 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 19854 CalcCompRatio: - 19855 push bx - 19856 push cx - 19857 push dx - 19858 push es - 19859 mov es,[segFATBuf] ; es is pointer to FAT buffers - 19860 ;assume es:nothing - 19861 - 19862 xor bx,bx ; zero count of sectors & clusters used - 19863 mov [ccluUsed],bx - 19864 mov [csecUsed],bx - 19865 mov [csecUsed+2],bx - 19866 ccr_next: - 19867 cmp ax,2 ; sanity check the DOS FAT value - 19868 jb short ccr_screwy - 19869 - 19870 cmp ax,0FFF0h ; end of file? - 19871 jae short ccr_eof + 19765 ovcf_set_size: + 19766 mov [csecPerCluster],al + 19767 + 19768 ; Lastly, setup the FAT buffers + 19769 ocvf_set_buf: + 19770 mov ax,[BYTCNT] ; if >= 32k TPA space available, + 19771 mov [savBytCnt],ax ; setup larger FAT buffers + 19772 cmp ax,32*1024 ; 8000h + 19773 jae short ocvf_big_buf + 19774 + 19775 ; small TPA, use small resident buffers + 19776 + 19777 ;mov word ptr [cFATEntries],cRES_FAT_ENTRIES + 19778 mov word [cFATEntries],32 ; cRES_FAT_ENTRIES + 19779 mov [segFATBuf],ds + 19780 ;mov word ptr [pbufDOSFAT],offset TRANGROUP:bufDOSFAT + 19781 ;mov word ptr [pbufMDFAT],offset TRANGROUP:bufMDFAT + 19782 mov word [pbufDOSFAT],bufDOSFAT + 19783 mov word [pbufMDFAT],bufMDFAT + 19784 ;jmp short ocvf_success + 19785 ; 08/06/2023 + 19786 ; cf = 1 + 19787 clc + 19788 retn + 19789 + 19790 ocvf_big_buf: + 19791 ;mov bx,cBIG_FAT_ENTRIES + 19792 mov bx,256 + 19793 mov [cFATEntries],bx + 19794 + 19795 shl bx,1 ; 6 bytes per entry (2 for DOS FAT, 4 MD FAT) + 19796 mov cx,bx ; entries * 2 + 19797 shl bx,1 + 19798 add bx,cx ; bx = # entries * 6 + 19799 + 19800 sub ax,bx ; reduce TPA size by size of FAT buffers + 19801 and ax,0FE00h ; init code rounds BytCnt down to multiple of + 19802 mov [BYTCNT],ax ; 512 bytes -- a no-op with some buf sizes. + 19803 + 19804 mov bx,[TPA] ; buffers in the TPA + 19805 mov [segFATBuf],bx + 19806 mov [pbufDOSFAT],ax ; DOS FAT buffer offset + 19807 add ax,cx ; + DOS FAT buffer size + 19808 mov [pbufMDFAT],ax ; = MD FAT buffer offset + 19809 ; 08/06/2023 + 19810 ; cf = 0 + 19811 ;ocvf_success: + 19812 ;clc ;indicate success + 19813 ocvf_ret: + 19814 retn + 19815 + 19816 ; --------------------------------------------------------------------------- + 19817 + 19818 ;*** CloseCVF - close Compressed Volume File + 19819 ; + 19820 ; ENTRY fhCVF has file handle + 19821 ; + 19822 ; EXIT + 19823 ; + 19824 ; USED AX, BX, CX, DX + 19825 + 19826 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 19827 CloseCVF: + 19828 mov bx,[fhCVF] ; -1 unless file is open + 19829 cmp bx,-1 ; 0FFFFh + 19830 je short ccvf_ret + 19831 + 19832 ;mov ah,CLOSE + 19833 mov ah,3Eh + 19834 int 21h + 19835 + 19836 mov word [fhCVF],-1 ; 0FFFFh ; don't try to close again + 19837 + 19838 mov ax,[savBytCnt] ; 'deallocate' DOS & MD FAT buffers + 19839 mov [BYTCNT],ax ; by restoring old TPA byte count + 19840 ccvf_ret: + 19841 retn + 19842 + 19843 ; --------------------------------------------------------------------------- + 19844 + 19845 ;*** CalcCompRatio - calculate file compression ratio + 19846 ; + 19847 ; ENTRY AX = starting cluster of file to get compression ratio of + 19848 ; + 19849 ; EXIT AX = compression ratio. Example: a ratio of 2.7 to 1.0 + 19850 ; will return AH = 02h & AL = 07h + 19851 ; ccluUsed set to # DOS clusters used by file + 19852 ; csecUsed set to # compressed sectors used by file + 19853 ; ccluUsedDir, ccluUsedTotal, csecUsedDir, csecUsedTotal updated + 19854 ; USED none + 19855 + 19856 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 19857 CalcCompRatio: + 19858 push bx + 19859 push cx + 19860 push dx + 19861 push es + 19862 mov es,[segFATBuf] ; es is pointer to FAT buffers + 19863 ;assume es:nothing + 19864 + 19865 xor bx,bx ; zero count of sectors & clusters used + 19866 mov [ccluUsed],bx + 19867 mov [csecUsed],bx + 19868 mov [csecUsed+2],bx + 19869 ccr_next: + 19870 cmp ax,2 ; sanity check the DOS FAT value + 19871 jb short ccr_screwy 19872 - 19873 call CheckFATBuffers ; make sure buffers contain target - 19874 jc short ccr_screwy ; FAT entries + 19873 cmp ax,0FFF0h ; end of file? + 19874 jae short ccr_eof 19875 - 19876 call GetMDFATEntry ; returns corresponding entry in BX:CX - 19877 jc short ccr_screwy + 19876 call CheckFATBuffers ; make sure buffers contain target + 19877 jc short ccr_screwy ; FAT entries 19878 - 19879 shl bx,1 ; used bit to CY - 19880 jnc short ccr_screwy ; better be used! + 19879 call GetMDFATEntry ; returns corresponding entry in BX:CX + 19880 jc short ccr_screwy 19881 - 19882 mov ch,bh ; save uncompressed count - 19883 - 19884 shl bx,1 ; get count into position - 19885 and bx,0F00h ; bh = count of compressed sectors used - 19886 xchg bh,bl ; bx = count - 19887 inc bx ; 0 - 15 means 1 - 16 used - 19888 - 19889 add [csecUsed],bx - 19890 adc word [csecUsed+2],0 + 19882 shl bx,1 ; used bit to CY + 19883 jnc short ccr_screwy ; better be used! + 19884 + 19885 mov ch,bh ; save uncompressed count + 19886 + 19887 shl bx,1 ; get count into position + 19888 and bx,0F00h ; bh = count of compressed sectors used + 19889 xchg bh,bl ; bx = count + 19890 inc bx ; 0 - 15 means 1 - 16 used 19891 - 19892 mov dx,ax ; save cluster # in dx - 19893 - 19894 mov al,ch ; uncompressed count to al - 19895 mov cl,3 - 19896 shr al,cl ; get uncompressed count into position - 19897 and ax,000Fh ; ax = uncompressed count (0 - 15) - 19898 dec bx ; bx = compressed count (0 - 15) - 19899 cmp ax,bx ; if the compressed cnt > uncompressed - 19900 ;jae @f ; fudge a little and use the larger - 19901 jae short ccr_1 ; jnb - 19902 mov ax,bx - 19903 ;@@: - 19904 ccr_1: - 19905 mov cl,[csecPerCluster] ; round up to the number of clusters - 19906 xor ch,ch ; required for uncompressed - 19907 add ax,cx ; sectors - 19908 div cl - 19909 xor ah,ah - 19910 add [ccluUsed],ax - 19911 - 19912 mov ax,dx ; restore cluster # - 19913 call GetDOSFATEntry ; retuns next DOS FAT entry in AX - 19914 ;jc short ccr_screwy - 19915 ;jmp short ccr_next - 19916 ; 08/06/2023 - 19917 jnc short ccr_next - 19918 ccr_screwy: - 19919 xor ax,ax ; something screwy happened, set - 19920 ; ratio to 0.0 and exit - 19921 ccr_ret: - 19922 pop es - 19923 pop dx - 19924 pop cx - 19925 pop bx - 19926 retn - 19927 - 19928 ; Reached the end-of-file, now calculate the ratio as the - 19929 ; number of DOS sectors used / number of compressed sectors used. + 19892 add [csecUsed],bx + 19893 adc word [csecUsed+2],0 + 19894 + 19895 mov dx,ax ; save cluster # in dx + 19896 + 19897 mov al,ch ; uncompressed count to al + 19898 mov cl,3 + 19899 shr al,cl ; get uncompressed count into position + 19900 and ax,000Fh ; ax = uncompressed count (0 - 15) + 19901 dec bx ; bx = compressed count (0 - 15) + 19902 cmp ax,bx ; if the compressed cnt > uncompressed + 19903 ;jae @f ; fudge a little and use the larger + 19904 jae short ccr_1 ; jnb + 19905 mov ax,bx + 19906 ;@@: + 19907 ccr_1: + 19908 mov cl,[csecPerCluster] ; round up to the number of clusters + 19909 xor ch,ch ; required for uncompressed + 19910 add ax,cx ; sectors + 19911 div cl + 19912 xor ah,ah + 19913 add [ccluUsed],ax + 19914 + 19915 mov ax,dx ; restore cluster # + 19916 call GetDOSFATEntry ; retuns next DOS FAT entry in AX + 19917 ;jc short ccr_screwy + 19918 ;jmp short ccr_next + 19919 ; 08/06/2023 + 19920 jnc short ccr_next + 19921 ccr_screwy: + 19922 xor ax,ax ; something screwy happened, set + 19923 ; ratio to 0.0 and exit + 19924 ccr_ret: + 19925 pop es + 19926 pop dx + 19927 pop cx + 19928 pop bx + 19929 retn 19930 - 19931 ccr_eof: - 19932 mov ax,[ccluUsed] - 19933 add [ccluUsedDir],ax ; update cluster used totals - 19934 add [ccluUsedTotal],ax - 19935 - 19936 mov cx,[csecUsed+2] - 19937 mov bx,[csecUsed] ; cx:bx = # compressed sectors used + 19931 ; Reached the end-of-file, now calculate the ratio as the + 19932 ; number of DOS sectors used / number of compressed sectors used. + 19933 + 19934 ccr_eof: + 19935 mov ax,[ccluUsed] + 19936 add [ccluUsedDir],ax ; update cluster used totals + 19937 add [ccluUsedTotal],ax 19938 - 19939 add [csecUsedDir],bx ; update sector used totals - 19940 adc [csecUsedDir+2],cx - 19941 add [csecUsedTotal],bx - 19942 adc [csecUsedTotal+2],cx - 19943 - 19944 call ComputeRatio ; ax=clusters used, cx:bx=sectors used - 19945 - 19946 jmp short ccr_ret - 19947 - 19948 ; 08/06/2023 - 19949 ;ccr_screwy: - 19950 ; xor ax,ax ; something screwy happened, set - 19951 ; ; ratio to 0.0 and exit - 19952 ;ccr_ret: - 19953 ; pop es - 19954 ; pop dx - 19955 ; pop cx - 19956 ; pop bx - 19957 ; retn - 19958 - 19959 ; --------------------------------------------------------------------------- - 19960 - 19961 ;*** ComputeRatio - calculate ratio of compressed sectors used to - 19962 ; (would be) DOS sectors used - 19963 ; - 19964 ; Entry - 19965 ; AX = DOS clusters used, cx:bx = compressed sectors used - 19966 ; Exit - 19967 ; ah = whole portion, al = tenths - 19968 ; - 19969 ; Used BX, CX, DX - 19970 - 19971 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 19972 ComputeRatio: - 19973 push si - 19974 push di - 19975 - 19976 mov si,bx - 19977 mov di,cx ; save cx:bx in di:si + 19939 mov cx,[csecUsed+2] + 19940 mov bx,[csecUsed] ; cx:bx = # compressed sectors used + 19941 + 19942 add [csecUsedDir],bx ; update sector used totals + 19943 adc [csecUsedDir+2],cx + 19944 add [csecUsedTotal],bx + 19945 adc [csecUsedTotal+2],cx + 19946 + 19947 call ComputeRatio ; ax=clusters used, cx:bx=sectors used + 19948 + 19949 jmp short ccr_ret + 19950 + 19951 ; 08/06/2023 + 19952 ;ccr_screwy: + 19953 ; xor ax,ax ; something screwy happened, set + 19954 ; ; ratio to 0.0 and exit + 19955 ;ccr_ret: + 19956 ; pop es + 19957 ; pop dx + 19958 ; pop cx + 19959 ; pop bx + 19960 ; retn + 19961 + 19962 ; --------------------------------------------------------------------------- + 19963 + 19964 ;*** ComputeRatio - calculate ratio of compressed sectors used to + 19965 ; (would be) DOS sectors used + 19966 ; + 19967 ; Entry + 19968 ; AX = DOS clusters used, cx:bx = compressed sectors used + 19969 ; Exit + 19970 ; ah = whole portion, al = tenths + 19971 ; + 19972 ; Used BX, CX, DX + 19973 + 19974 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 19975 ComputeRatio: + 19976 push si + 19977 push di 19978 - 19979 mov bl,[csecPerCluster] - 19980 xor bh,bh - 19981 mul bx ; dx:ax = # DOS sectors used - 19982 mov bx,si ; restore bx - 19983 - 19984 call Div32 ; dx:ax = quotient, cx:bx = remainder - 19985 - 19986 push ax ; save quotient - 19987 - 19988 mov ax,bx ; if no remainder, tenths will be 0 - 19989 or ax,cx ; which is in AX so skip following - 19990 jz short cr_got_tenths ; (happens frequently) - 19991 - 19992 ; Multiply the reminder by 10, add half the divisor so result is - 19993 ; rounded up, and divide again to get tenths digit + 19979 mov si,bx + 19980 mov di,cx ; save cx:bx in di:si + 19981 + 19982 mov bl,[csecPerCluster] + 19983 xor bh,bh + 19984 mul bx ; dx:ax = # DOS sectors used + 19985 mov bx,si ; restore bx + 19986 + 19987 call Div32 ; dx:ax = quotient, cx:bx = remainder + 19988 + 19989 push ax ; save quotient + 19990 + 19991 mov ax,bx ; if no remainder, tenths will be 0 + 19992 or ax,cx ; which is in AX so skip following + 19993 jz short cr_got_tenths ; (happens frequently) 19994 - 19995 mov ax,cx - 19996 xor dx,dx - 19997 mov cx,bx - 19998 mov bx,10 - 19999 mul bx - 20000 xchg ax,cx - 20001 mul bx - 20002 add dx,cx ; dx:ax = remainder * 10 - 20003 - 20004 mov cx,di - 20005 mov bx,si - 20006 shr cx,1 - 20007 rcr bx,1 ; cx:bx = 1/2 divisor - 20008 add ax,bx - 20009 adc dx,cx ; dx:ax = remainder * 10 + 1/2 divisor - 20010 - 20011 mov cx,di - 20012 mov bx,si + 19995 ; Multiply the reminder by 10, add half the divisor so result is + 19996 ; rounded up, and divide again to get tenths digit + 19997 + 19998 mov ax,cx + 19999 xor dx,dx + 20000 mov cx,bx + 20001 mov bx,10 + 20002 mul bx + 20003 xchg ax,cx + 20004 mul bx + 20005 add dx,cx ; dx:ax = remainder * 10 + 20006 + 20007 mov cx,di + 20008 mov bx,si + 20009 shr cx,1 + 20010 rcr bx,1 ; cx:bx = 1/2 divisor + 20011 add ax,bx + 20012 adc dx,cx ; dx:ax = remainder * 10 + 1/2 divisor 20013 - 20014 call Div32 - 20015 - 20016 cr_got_tenths: - 20017 pop bx ; original quotient - 20018 mov ah,bl - 20019 - 20020 cmp al,10 ; if the tenths rounded up to the - 20021 jb short cr_exit ; next whole number, adjust the - 20022 ; whole number part and 0 the - 20023 inc ah ; tenths (i.e. round 1.97 to 2.0) - 20024 xor al,al - 20025 cr_exit: - 20026 pop di - 20027 pop si - 20028 - 20029 retn - 20030 - 20031 ; --------------------------------------------------------------------------- - 20032 - 20033 ;*** Div32 - 32 bit divide for computing ratios - 20034 ; - 20035 ; Entry DX:AX = dividend, CX:BX = divisor - 20036 ; - 20037 ; Exit DX:AX = quotient, CX:BX = reminder - 20038 - 20039 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 20040 Div32: - 20041 jcxz d32_16bit ; differently if 16bit divisor - 20042 - 20043 push si - 20044 push di + 20014 mov cx,di + 20015 mov bx,si + 20016 + 20017 call Div32 + 20018 + 20019 cr_got_tenths: + 20020 pop bx ; original quotient + 20021 mov ah,bl + 20022 + 20023 cmp al,10 ; if the tenths rounded up to the + 20024 jb short cr_exit ; next whole number, adjust the + 20025 ; whole number part and 0 the + 20026 inc ah ; tenths (i.e. round 1.97 to 2.0) + 20027 xor al,al + 20028 cr_exit: + 20029 pop di + 20030 pop si + 20031 + 20032 retn + 20033 + 20034 ; --------------------------------------------------------------------------- + 20035 + 20036 ;*** Div32 - 32 bit divide for computing ratios + 20037 ; + 20038 ; Entry DX:AX = dividend, CX:BX = divisor + 20039 ; + 20040 ; Exit DX:AX = quotient, CX:BX = reminder + 20041 + 20042 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 20043 Div32: + 20044 jcxz d32_16bit ; differently if 16bit divisor 20045 - 20046 ; Brute force divide by subtraction. This is okay because worse case - 20047 ; the dividend will only be 16 times greater, and typically about 2 - 20048 ; times - 20049 - 20050 xor si,si - 20051 mov di,si ; di:si is quotient - 20052 ;@@: - 20053 div32_1: - 20054 sub ax,bx ; subtract divisor - 20055 sbb dx,cx - 20056 jc short d32_too_far - 20057 - 20058 add si, 1 ; accumulate quotient - 20059 adc di, 0 - 20060 ;jmp short @b - 20061 jmp short div32_1 - 20062 - 20063 d32_too_far: - 20064 add ax,bx ; fix the last subtraction - 20065 adc dx,cx - 20066 - 20067 mov cx,di - 20068 mov bx,si ; dx:ax = remainder, cx:bx = quoient + 20046 push si + 20047 push di + 20048 + 20049 ; Brute force divide by subtraction. This is okay because worse case + 20050 ; the dividend will only be 16 times greater, and typically about 2 + 20051 ; times + 20052 + 20053 xor si,si + 20054 mov di,si ; di:si is quotient + 20055 ;@@: + 20056 div32_1: + 20057 sub ax,bx ; subtract divisor + 20058 sbb dx,cx + 20059 jc short d32_too_far + 20060 + 20061 add si, 1 ; accumulate quotient + 20062 adc di, 0 + 20063 ;jmp short @b + 20064 jmp short div32_1 + 20065 + 20066 d32_too_far: + 20067 add ax,bx ; fix the last subtraction + 20068 adc dx,cx 20069 - 20070 xchg ax,bx - 20071 xchg dx,cx ; dx:ax = quoient, cx:bx = remainder + 20070 mov cx,di + 20071 mov bx,si ; dx:ax = remainder, cx:bx = quoient 20072 - 20073 pop di - 20074 pop si + 20073 xchg ax,bx + 20074 xchg dx,cx ; dx:ax = quoient, cx:bx = remainder 20075 - 20076 retn - 20077 - 20078 d32_16bit: - 20079 div bx ; divide dx:ax by bx + 20076 pop di + 20077 pop si + 20078 + 20079 retn 20080 - 20081 mov bx,dx ; remainder to cx:bx - 20082 xor dx,dx ; quotient to dx:ax - 20083 mov cx,dx - 20084 retn - 20085 - 20086 ; --------------------------------------------------------------------------- - 20087 - 20088 ;*** GetDOSFATEntry - returns next cluster in file's FAT chain - 20089 ; - 20090 ; Entry AX = current cluster number - 20091 ; ES = segment of FAT buffer - 20092 ; Entry should be in FAT buffer - 20093 ; - 20094 ; Exit AX = next cluster number - 20095 ; CY set if error + 20081 d32_16bit: + 20082 div bx ; divide dx:ax by bx + 20083 + 20084 mov bx,dx ; remainder to cx:bx + 20085 xor dx,dx ; quotient to dx:ax + 20086 mov cx,dx + 20087 retn + 20088 + 20089 ; --------------------------------------------------------------------------- + 20090 + 20091 ;*** GetDOSFATEntry - returns next cluster in file's FAT chain + 20092 ; + 20093 ; Entry AX = current cluster number + 20094 ; ES = segment of FAT buffer + 20095 ; Entry should be in FAT buffer 20096 ; - 20097 ; Uses BX - 20098 - 20099 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20100 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1EF2h - 20101 GetDOSFATEntry: - 20102 sub ax,[entInBuf] ; calc entry # in buffer - 20103 jc short gdf_ret ; CY already set for error - 20104 - 20105 mov bx,ax - 20106 - 20107 ;cmp MDBPB.f12BitFAT, 0 ; 12 or 16 bit FAT? - 20108 cmp byte [MDBPB+3Dh],0 - 20109 jnz short gdf_12 ; go do 12 - 20110 - 20111 shl bx,1 ; offset = entry * 2 - 20112 add bx,[pbufDOSFAT] - 20113 mov ax,[es:bx] - 20114 ; 08/06/2023 - 20115 ; cf = 0 - 20116 ;gdf_success: - 20117 ;clc ; success - 20118 gdf_ret: - 20119 retn - 20120 - 20121 gdf_12: - 20122 shr bx,1 - 20123 add bx,ax ; offset to entry = entry * 1.5 - 20124 add bx,[pbufDOSFAT] - 20125 - 20126 ; ES:BX points to the word containing the desired 12 bit FAT entry. - 20127 ; For odd entries, the upper 12 bits are valid, for even entries - 20128 ; the low 12 bits are valid. odd: OOOx even: xEEE - 20129 - 20130 test al,1 ; is current entry odd? - 20131 - 20132 mov ax,[es:bx] ; word with FAT entry - 20133 jnz short gdf_odd + 20097 ; Exit AX = next cluster number + 20098 ; CY set if error + 20099 ; + 20100 ; Uses BX + 20101 + 20102 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20103 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1EF2h + 20104 GetDOSFATEntry: + 20105 sub ax,[entInBuf] ; calc entry # in buffer + 20106 jc short gdf_ret ; CY already set for error + 20107 + 20108 mov bx,ax + 20109 + 20110 ;cmp MDBPB.f12BitFAT, 0 ; 12 or 16 bit FAT? + 20111 cmp byte [MDBPB+3Dh],0 + 20112 jnz short gdf_12 ; go do 12 + 20113 + 20114 shl bx,1 ; offset = entry * 2 + 20115 add bx,[pbufDOSFAT] + 20116 mov ax,[es:bx] + 20117 ; 08/06/2023 + 20118 ; cf = 0 + 20119 ;gdf_success: + 20120 ;clc ; success + 20121 gdf_ret: + 20122 retn + 20123 + 20124 gdf_12: + 20125 shr bx,1 + 20126 add bx,ax ; offset to entry = entry * 1.5 + 20127 add bx,[pbufDOSFAT] + 20128 + 20129 ; ES:BX points to the word containing the desired 12 bit FAT entry. + 20130 ; For odd entries, the upper 12 bits are valid, for even entries + 20131 ; the low 12 bits are valid. odd: OOOx even: xEEE + 20132 + 20133 test al,1 ; is current entry odd? 20134 - 20135 and ax,0FFFh ; keep low 12 bits for even - 20136 jmp short gdf_testEOF + 20135 mov ax,[es:bx] ; word with FAT entry + 20136 jnz short gdf_odd 20137 - 20138 gdf_odd: - 20139 mov bx,cx ; (save cx in bx) - 20140 mov cl,4 - 20141 shr ax,cl ; upper 12 bits for odd - 20142 mov cx,bx ; (restore cx) - 20143 - 20144 gdf_testEOF: - 20145 cmp ax,0FF0h ; valid entry? - 20146 ;jb short gdf_success - 20147 cmc ; cf = 1 <--> cf = 0 - 20148 jnc short gdf_ret - 20149 - 20150 or ah,0F0h ; caller expects 16 bit special values - 20151 ;jmp short gdf_success - 20152 ; cf = 0 - 20153 retn - 20154 - 20155 ; --------------------------------------------------------------------------- - 20156 - 20157 ;*** GetMDFATEntry - returns requested MD FAT entry - 20158 ; - 20159 ; Entry AX = current DOS cluster number - 20160 ; ES = segment of FAT buffer - 20161 ; Entry should be in FAT buffer - 20162 ; - 20163 ; Exit BX:CX = corresponding MD FAT entry - 20164 ; CY set if error + 20138 and ax,0FFFh ; keep low 12 bits for even + 20139 jmp short gdf_testEOF + 20140 + 20141 gdf_odd: + 20142 mov bx,cx ; (save cx in bx) + 20143 mov cl,4 + 20144 shr ax,cl ; upper 12 bits for odd + 20145 mov cx,bx ; (restore cx) + 20146 + 20147 gdf_testEOF: + 20148 cmp ax,0FF0h ; valid entry? + 20149 ;jb short gdf_success + 20150 cmc ; cf = 1 <--> cf = 0 + 20151 jnc short gdf_ret + 20152 + 20153 or ah,0F0h ; caller expects 16 bit special values + 20154 ;jmp short gdf_success + 20155 ; cf = 0 + 20156 retn + 20157 + 20158 ; --------------------------------------------------------------------------- + 20159 + 20160 ;*** GetMDFATEntry - returns requested MD FAT entry + 20161 ; + 20162 ; Entry AX = current DOS cluster number + 20163 ; ES = segment of FAT buffer + 20164 ; Entry should be in FAT buffer 20165 ; - 20166 ; Uses None - 20167 - 20168 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 20169 GetMDFATEntry: - 20170 mov bx,ax - 20171 sub bx,[entInBuf] ; calc entry # in buffer - 20172 jc short gmf_ret ; CY already set for error return - 20173 - 20174 shl bx,1 - 20175 shl bx,1 ; * 4 bytes per MDFAT entry + 20166 ; Exit BX:CX = corresponding MD FAT entry + 20167 ; CY set if error + 20168 ; + 20169 ; Uses None + 20170 + 20171 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 20172 GetMDFATEntry: + 20173 mov bx,ax + 20174 sub bx,[entInBuf] ; calc entry # in buffer + 20175 jc short gmf_ret ; CY already set for error return 20176 - 20177 add bx,[pbufMDFAT] - 20178 mov cx,[es:bx] - 20179 mov bx,[es:bx+2] - 20180 - 20181 clc - 20182 gmf_ret: - 20183 retn - 20184 - 20185 ; --------------------------------------------------------------------------- - 20186 - 20187 ;*** CheckFATBuffers - check that target FAT entry is in FAT buffers. If - 20188 ; not, fill the buffers starting with the requested - 20189 ; entry. - 20190 ; - 20191 ; ENTRY AX = FAT entry # - 20192 ; ES = segment of FAT buffers + 20177 shl bx,1 + 20178 shl bx,1 ; * 4 bytes per MDFAT entry + 20179 + 20180 add bx,[pbufMDFAT] + 20181 mov cx,[es:bx] + 20182 mov bx,[es:bx+2] + 20183 + 20184 clc + 20185 gmf_ret: + 20186 retn + 20187 + 20188 ; --------------------------------------------------------------------------- + 20189 + 20190 ;*** CheckFATBuffers - check that target FAT entry is in FAT buffers. If + 20191 ; not, fill the buffers starting with the requested + 20192 ; entry. 20193 ; - 20194 ; EXIT FAT buffers contain target entry, or CY set if error - 20195 ; entInBuf updated + 20194 ; ENTRY AX = FAT entry # + 20195 ; ES = segment of FAT buffers 20196 ; - 20197 ; USED BX - 20198 - 20199 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20200 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1F4Bh + 20197 ; EXIT FAT buffers contain target entry, or CY set if error + 20198 ; entInBuf updated + 20199 ; + 20200 ; USED BX 20201 - 20202 CheckFATBuffers: - 20203 mov bx,ax - 20204 sub bx,[entInBuf] - 20205 jb short cfb_load_fat - 20206 - 20207 sub bx,[cFATEntries] - 20208 jae short cfb_load_fat ; jnb + 20202 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20203 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1F4Bh + 20204 + 20205 CheckFATBuffers: + 20206 mov bx,ax + 20207 sub bx,[entInBuf] + 20208 jb short cfb_load_fat 20209 - 20210 clc - 20211 retn + 20210 sub bx,[cFATEntries] + 20211 jae short cfb_load_fat ; jnb 20212 - 20213 ; Desired entry isn't in the FAT buffers, reload the buffers to - 20214 ; include it + 20213 clc + 20214 retn 20215 - 20216 cfb_load_fat: - 20217 push ax - 20218 push cx - 20219 push dx - 20220 - 20221 ; Start with the DOS FAT buffer - 20222 - 20223 xor cx,cx ; zero high offset to FAT file position - 20224 - 20225 ;cmp MDBPB.f12BitFAT, 0 ; 12 or 16 bit FAT? - 20226 cmp byte [MDBPB+3Dh],0 - 20227 jnz short cfb_12 ; go do 12 - 20228 - 20229 mov [entInBuf],ax ; this entry is first - 20230 - 20231 shl ax,1 ; 2 bytes per cluster # - 20232 rcl cx,1 ; cx:ax = offset to FAT entry + 20216 ; Desired entry isn't in the FAT buffers, reload the buffers to + 20217 ; include it + 20218 + 20219 cfb_load_fat: + 20220 push ax + 20221 push cx + 20222 push dx + 20223 + 20224 ; Start with the DOS FAT buffer + 20225 + 20226 xor cx,cx ; zero high offset to FAT file position + 20227 + 20228 ;cmp MDBPB.f12BitFAT, 0 ; 12 or 16 bit FAT? + 20229 cmp byte [MDBPB+3Dh],0 + 20230 jnz short cfb_12 ; go do 12 + 20231 + 20232 mov [entInBuf],ax ; this entry is first 20233 - 20234 jmp short cfb_common - 20235 - 20236 cfb_12: - 20237 ;and al,not 1 ; 0FEh ; start with even # entry - 20238 and al,~1 - 20239 mov [entInBuf],ax - 20240 - 20241 mov bx,ax - 20242 shr bx,1 - 20243 add ax,bx ; ax = offset to FAT entry - 20244 ; (entry # * 1.5) - 20245 cfb_common: - 20246 mov bx,ax ; cx:bx = offset to FAT entry - 20247 - 20248 ;mov ax,[MDBPB.csecMDReserved] ; # magicDrv reserved sectors - 20249 mov ax,[MDBPB+27h] - 20250 ;add ax,[MDBPB.dos_bpb.csecReserved] - 20251 add ax,[MDBPB+0Eh] - 20252 - 20253 ;mul word [MDBPB.dos_bpb.cbPerSec] - 20254 mul word [MDBPB+0Bh] ; DX:AX = DOS FAT file origin - 20255 add ax,bx - 20256 adc dx,cx ; DX:AX = file offset to read from - 20257 - 20258 mov cx,[cFATEntries] ; size to read - 20259 shl cx,1 - 20260 mov bx,[pbufDOSFAT] ; es:bx = location to read - 20261 - 20262 call ReadCVFile - 20263 jc short cfb_error + 20234 shl ax,1 ; 2 bytes per cluster # + 20235 rcl cx,1 ; cx:ax = offset to FAT entry + 20236 + 20237 jmp short cfb_common + 20238 + 20239 cfb_12: + 20240 ;and al,not 1 ; 0FEh ; start with even # entry + 20241 and al,~1 + 20242 mov [entInBuf],ax + 20243 + 20244 mov bx,ax + 20245 shr bx,1 + 20246 add ax,bx ; ax = offset to FAT entry + 20247 ; (entry # * 1.5) + 20248 cfb_common: + 20249 mov bx,ax ; cx:bx = offset to FAT entry + 20250 + 20251 ;mov ax,[MDBPB.csecMDReserved] ; # magicDrv reserved sectors + 20252 mov ax,[MDBPB+27h] + 20253 ;add ax,[MDBPB.dos_bpb.csecReserved] + 20254 add ax,[MDBPB+0Eh] + 20255 + 20256 ;mul word [MDBPB.dos_bpb.cbPerSec] + 20257 mul word [MDBPB+0Bh] ; DX:AX = DOS FAT file origin + 20258 add ax,bx + 20259 adc dx,cx ; DX:AX = file offset to read from + 20260 + 20261 mov cx,[cFATEntries] ; size to read + 20262 shl cx,1 + 20263 mov bx,[pbufDOSFAT] ; es:bx = location to read 20264 - 20265 ; Now read the corresponding MagicDrv FAT entries - 20266 - 20267 ;mov ax,[MDBPB.secMDFATStart] - 20268 mov ax,[MDBPB+24h] - 20269 inc ax - 20270 ;mul word [MDBPB.dos_bpb.cbPerSec] - 20271 mul word [MDBPB+0Bh] ; DX:AX = MDFAT file offset - 20272 - 20273 mov bx,[entInBuf] - 20274 xor cx,cx ; CX:BX = 32 bit cluster # - 20275 ;add bx,[MDBPB.cluFirstData] - 20276 add bx,[MDBPB+2Dh] - 20277 adc cx,cx ; CX:BX = MDFAT entry # - 20278 - 20279 shl bx,1 - 20280 rcl cx,1 - 20281 shl bx,1 - 20282 rcl cx,1 ; * 4 bytes per MDFAT entry - 20283 - 20284 add ax,bx - 20285 adc dx,cx ; DX:AX = file offset of MDFAT entry + 20265 call ReadCVFile + 20266 jc short cfb_error + 20267 + 20268 ; Now read the corresponding MagicDrv FAT entries + 20269 + 20270 ;mov ax,[MDBPB.secMDFATStart] + 20271 mov ax,[MDBPB+24h] + 20272 inc ax + 20273 ;mul word [MDBPB.dos_bpb.cbPerSec] + 20274 mul word [MDBPB+0Bh] ; DX:AX = MDFAT file offset + 20275 + 20276 mov bx,[entInBuf] + 20277 xor cx,cx ; CX:BX = 32 bit cluster # + 20278 ;add bx,[MDBPB.cluFirstData] + 20279 add bx,[MDBPB+2Dh] + 20280 adc cx,cx ; CX:BX = MDFAT entry # + 20281 + 20282 shl bx,1 + 20283 rcl cx,1 + 20284 shl bx,1 + 20285 rcl cx,1 ; * 4 bytes per MDFAT entry 20286 - 20287 mov cx,[cFATEntries] - 20288 shl cx,1 - 20289 shl cx,1 ; size to read - 20290 mov bx,[pbufMDFAT] ; es:bx = location to read into - 20291 - 20292 call ReadCVFile - 20293 ;jnc short cfb_ret ; cf = 0 ; 08/06/2023 - 20294 ; 08/06/2023 - 20295 ; cf = 1 - 20296 cfb_error: - 20297 ;stc - 20298 cfb_ret: - 20299 pop dx - 20300 pop cx - 20301 pop ax - 20302 retn - 20303 - 20304 ; --------------------------------------------------------------------------- - 20305 - 20306 ;*** ReadCVFile - read from the Compressed Volume File - 20307 ; - 20308 ; Entry DX:AX file offset, ES:BX buffer location, CX length in bytes - 20309 ; - 20310 ; Exit CY set if error, else data read - 20311 ; - 20312 ; Uses AX, BX, CX, DX - 20313 - 20314 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 20315 ReadCVFile: - 20316 push bx ; save buffer loc - 20317 push cx ; save read length - 20318 - 20319 mov cx,dx - 20320 mov dx,ax ; cx:dx = file offset of fat entry - 20321 ;mov ax,(LSEEK shl 8) or 0 - 20322 mov ax,4200h - 20323 mov bx,[fhCVF] - 20324 int 21h - 20325 jc short rcf_ret ; CY set for error return - 20326 - 20327 ;mov ah,READ - 20328 mov ah,3Fh - 20329 pop cx ; read length - 20330 pop dx ; buffer loc offset - 20331 push ds - 20332 push es - 20333 pop ds ; buffer loc segment - 20334 int 21h - 20335 pop ds - 20336 jc short rcf_ret ; CY set for error return - 20337 - 20338 cmp ax,cx ; read it all? - 20339 ;je short rcf_ret ; yes, CY clear - 20340 ; 08/06/2023 - 20341 ; ax < cx - 20342 ;stc ; end-of-file? - 20343 rcf_ret: - 20344 retn - 20345 - 20346 %endif - 20347 - 20348 ;============================================================================ - 20349 ; TCMD1B.ASM, MSDOS 6.0, 1991 - 20350 ;============================================================================ - 20351 ; 09/10/2018 - Retro DOS v3.0 - 20352 - 20353 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1195h - 20354 - 20355 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20356 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 1A4Ah + 20287 add ax,bx + 20288 adc dx,cx ; DX:AX = file offset of MDFAT entry + 20289 + 20290 mov cx,[cFATEntries] + 20291 shl cx,1 + 20292 shl cx,1 ; size to read + 20293 mov bx,[pbufMDFAT] ; es:bx = location to read into + 20294 + 20295 call ReadCVFile + 20296 ;jnc short cfb_ret ; cf = 0 ; 08/06/2023 + 20297 ; 08/06/2023 + 20298 ; cf = 1 + 20299 cfb_error: + 20300 ;stc + 20301 cfb_ret: + 20302 pop dx + 20303 pop cx + 20304 pop ax + 20305 retn + 20306 + 20307 ; --------------------------------------------------------------------------- + 20308 + 20309 ;*** ReadCVFile - read from the Compressed Volume File + 20310 ; + 20311 ; Entry DX:AX file offset, ES:BX buffer location, CX length in bytes + 20312 ; + 20313 ; Exit CY set if error, else data read + 20314 ; + 20315 ; Uses AX, BX, CX, DX + 20316 + 20317 ; 08/06/2023 - Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 20318 ReadCVFile: + 20319 push bx ; save buffer loc + 20320 push cx ; save read length + 20321 + 20322 mov cx,dx + 20323 mov dx,ax ; cx:dx = file offset of fat entry + 20324 ;mov ax,(LSEEK shl 8) or 0 + 20325 mov ax,4200h + 20326 mov bx,[fhCVF] + 20327 int 21h + 20328 jc short rcf_ret ; CY set for error return + 20329 + 20330 ;mov ah,READ + 20331 mov ah,3Fh + 20332 pop cx ; read length + 20333 pop dx ; buffer loc offset + 20334 push ds + 20335 push es + 20336 pop ds ; buffer loc segment + 20337 int 21h + 20338 pop ds + 20339 jc short rcf_ret ; CY set for error return + 20340 + 20341 cmp ax,cx ; read it all? + 20342 ;je short rcf_ret ; yes, CY clear + 20343 ; 08/06/2023 + 20344 ; ax < cx + 20345 ;stc ; end-of-file? + 20346 rcf_ret: + 20347 retn + 20348 + 20349 %endif + 20350 + 20351 ;============================================================================ + 20352 ; TCMD1B.ASM, MSDOS 6.0, 1991 + 20353 ;============================================================================ + 20354 ; 09/10/2018 - Retro DOS v3.0 + 20355 + 20356 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1195h 20357 - 20358 ; =============== S U B R O U T I N E ======================================= - 20359 - 20360 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20361 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1FF4h + 20358 ; 19/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20359 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 1A4Ah + 20360 + 20361 ; =============== S U B R O U T I N E ======================================= 20362 - 20363 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20364 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1DCCh - 20365 PAUSE: - 20366 00001D00 BA[A490] mov dx,PAUSEMES_PTR ; 19/02/2023 - 20367 00001D03 E82237 call std_printf - 20368 00001D06 E859E9 call GETKEYSTROKE - 20369 ;call CRLF2 - 20370 ;retn - 20371 ; 19/02/2023 - 20372 00001D09 E96D0C jmp CRLF2 - 20373 - 20374 ; --------------------------------------------------------------------------- - 20375 - 20376 ;**************************************************************** - 20377 ;* - 20378 ;* ROUTINE: DEL/ERASE - erase file(s) - 20379 ;* - 20380 ;* FUNCTION: PARSE command line for file or path name and /P - 20381 ;* and invoke PATHCRUNCH. If an error occurs, set - 20382 ;* up an error message and transfer control to CERROR. - 20383 ;* Otherwise, transfer control to NOTEST2 if /P not - 20384 ;* entered or SLASHP_ERASE if /P entered. - 20385 ;* - 20386 ;* INPUT: command line at offset 81H - 20387 ;* - 20388 ;* OUTPUT: if no error: - 20389 ;* FCB at 5ch set up with filename(s) entered - 20390 ;* Current directory set to entered directory - 20391 ;* - 20392 ;**************************************************************** - 20393 - 20394 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20395 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A57h + 20363 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20364 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:1FF4h + 20365 + 20366 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 20367 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1DCCh + 20368 PAUSE: + 20369 00001D00 BA[A490] mov dx,PAUSEMES_PTR ; 19/02/2023 + 20370 00001D03 E82237 call std_printf + 20371 00001D06 E859E9 call GETKEYSTROKE + 20372 ;call CRLF2 + 20373 ;retn + 20374 ; 19/02/2023 + 20375 00001D09 E96D0C jmp CRLF2 + 20376 + 20377 ; --------------------------------------------------------------------------- + 20378 + 20379 ;**************************************************************** + 20380 ;* + 20381 ;* ROUTINE: DEL/ERASE - erase file(s) + 20382 ;* + 20383 ;* FUNCTION: PARSE command line for file or path name and /P + 20384 ;* and invoke PATHCRUNCH. If an error occurs, set + 20385 ;* up an error message and transfer control to CERROR. + 20386 ;* Otherwise, transfer control to NOTEST2 if /P not + 20387 ;* entered or SLASHP_ERASE if /P entered. + 20388 ;* + 20389 ;* INPUT: command line at offset 81H + 20390 ;* + 20391 ;* OUTPUT: if no error: + 20392 ;* FCB at 5ch set up with filename(s) entered + 20393 ;* Current directory set to entered directory + 20394 ;* + 20395 ;**************************************************************** 20396 - 20397 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20398 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2001h + 20397 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20398 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1A57h 20399 - 20400 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20401 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1DD9h - 20402 ERASE: - 20403 ; MSDOS 6.0 - 20404 - 20405 ;assume ds:trangroup,es:trangroup - 20406 - 20407 00001D0C BE8100 mov si,81h ;AC000; get command line - 20408 00001D0F C706[0B9C]0000 mov word [COMSW],0 ;AN000; clear switch indicator - 20409 00001D15 BF[9A96] mov di,PARSE_ERASE - 20410 ;AN000; Get address of PARSE_ERASE - 20411 00001D18 31C9 xor cx,cx ;AN000; clear cx,dx - 20412 erase_scan: - 20413 00001D1A 31D2 xor dx,dx ;AN000; - 20414 00001D1C E83C08 call Parse_With_Msg ;AC018; call parser - 20415 - 20416 ;cmp ax,-1 ; 0FFFFh - 20417 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? - 20418 ;je short good_line ;AN000; yes - done parsing - 20419 ;;cmp ax,0 - 20420 ;;cmp ax,RESULT_NO_ERROR ; 0 - 20421 ;and ax,ax ;AC000; did we have an error? - 20422 ;jnz short errj2 ;AC000; yes exit - 20423 ; 10/06/2023 - 20424 00001D1F 40 inc ax ; cmp ax,-1 - 20425 00001D20 743C jz short good_line ; 0FFFFh -> 0 - 20426 00001D22 48 dec ax ; cmp ax,0 - 20427 00001D23 7566 jnz short errj2 ; 1 -> 0 - 20428 ; ax = 0 - 20429 - 20430 00001D25 813E[EDA5][0D96] cmp word [PARSE1_SYN],SLASH_P_SYN ; "/P" - 20431 ;AN000; was /P entered? - 20432 00001D2B 741C je short set_erase_prompt - 20433 ;AN000; yes - go set prompt - 20434 ; - 20435 ; Must be filespec since no other matches occurred. move filename to srcbuf - 20436 ; - 20437 00001D2D 56 push si ;AC000; save position in line - 20438 00001D2E C536[EFA5] lds si,[PARSE1_ADDR] - 20439 ;AC000; get address of filespec - 20440 ;cmp byte [si+1],colon_char - 20441 00001D32 807C013A cmp byte [si+1],':' ;AC000; drive specified? - 20442 00001D36 750B jne short erase_drive_ok - 20443 ;AC000; no - continue - 20444 ;cmp byte [si+2],END_OF_LINE_OUT - 20445 00001D38 807C0200 cmp byte [si+2],0 ;AC000; was only drive entered? - 20446 00001D3C 7505 jne short erase_drive_ok - 20447 ;AC000; no - continue - 20448 00001D3E B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 - 20449 ;AN022; get message number in control block - 20450 00001D41 EB3D jmp short extend_setup - 20451 ;AC000; exit - 20452 erase_drive_ok: - 20453 00001D43 E89213 call Move_To_SrcBuf ;AC000; move to srcbuf - 20454 00001D46 5E pop si ;AC000; get position back - 20455 00001D47 EBD1 jmp short erase_scan - 20456 ;AN000; continue parsing - 20457 set_erase_prompt: - 20458 00001D49 833E[0B9C]00 cmp word [COMSW],0 ;AN018; was /P already entered? - 20459 00001D4E 7408 jz short ok_to_set_erase_prompt - 20460 ;AN018; no go set switch - 20461 ;mov ax,1 - 20462 00001D50 B80100 mov ax,MoreArgs_Ptr - 20463 ;AN018; set up too many arguments - 20464 00001D53 E81408 call setup_parse_error_msg - 20465 ;AN018; set up an error message - 20466 00001D56 EB33 jmp short errj2 ;AN018; exit - 20467 - 20468 ok_to_set_erase_prompt: ;AN018; - 20469 00001D58 FF06[0B9C] inc word [COMSW] ;AN000; indicate /p specified - 20470 00001D5C EBBC jmp short erase_scan - 20471 ;AN000; continue parsing - 20472 good_line: ;G We know line is good - 20473 00001D5E E8C10C call PathCrunch - 20474 00001D61 730D jnc short checkdr - 20475 00001D63 A1[349F] mov ax,[Msg_Numb] ;AN022; get message number - 20476 ;cmp ax,0 ;AN022; was message flag set? - 20477 00001D66 09C0 or ax,ax - 20478 00001D68 7516 jnz short extend_setup - 20479 ;AN022; yes - print out message - 20480 ;cmp byte [DestIsDir],0 - 20481 00001D6A 3806[B99D] cmp [DestIsDir],al ; No CHDIRs worked - 20482 00001D6E 750D jnz short badpath_err - 20483 ;AC022; see if they should have - 20484 checkdr: - 20485 00001D70 833E[0B9C]00 cmp word [COMSW],0 ;AN000; was /p specified - 20486 00001D75 7403 jz short notest2j ;AN000; no - go to notest2 - 20487 00001D77 E9FB1B jmp slashp_erase ;AN000; yes - go to slashp_erase - 20488 notest2j: - 20489 00001D7A E9931B jmp notest2 - 20490 - 20491 badpath_err: ;AN022; "Path not found" message - 20492 00001D7D B80300 mov ax,ERROR_PATH_NOT_FOUND ; 3 - 20493 ;AN022; set up error number - 20494 extend_setup: ;AN022; - 20495 ;mov byte [msg_disp_class],1 - 20496 00001D80 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 20497 ;AN022; set up extended error msg class - 20498 00001D85 BA[D78F] mov dx,extend_buf_ptr - 20499 ;AC022; get extended message pointer - 20500 00001D88 A3[D78F] mov [extend_buf_ptr],ax - 20501 ;AN022; get message number in control block - 20502 errj2: ;AC022; exit jump - 20503 00001D8B E9980F jmp cerror ;AN022; - 20504 - 20505 ; --------------------------------------------------------------------------- - 20506 - 20507 ; **************************************************************** - 20508 ; * - 20509 ; * ROUTINE: CRENAME - rename file(s) - 20510 ; * - 20511 ; * FUNCTION: PARSE command line for one full filespec and one - 20512 ; * filename. Invoke PATHCRUNCH on the full filespec. - 20513 ; * Make sure the second filespec only contains a - 20514 ; * filename. If both openands are valid, attempt - 20515 ; * to rename the file. - 20516 ; * - 20517 ; * INPUT: command line at offset 81H - 20518 ; * - 20519 ; * OUTPUT: none - 20520 ; * - 20521 ; **************************************************************** - 20522 - 20523 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20524 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20525 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20526 CRENAME: - 20527 ; MSDOS 6.0 - 20528 ;assume ds:trangroup,es:trangroup - 20529 - 20530 00001D8E BE8100 mov si,81h ;AC000; Point to command line - 20531 00001D91 BF[2797] mov di,PARSE_RENAME - 20532 ;AN000; Get address of PARSE_RENAME - 20533 00001D94 31C9 xor cx,cx ;AN000; clear cx,dx - 20534 00001D96 31D2 xor dx,dx ;AN000; - 20535 00001D98 E8C007 call Parse_With_Msg ;AC018; call parser - 20536 ;cmp ax,RESULT_NO_ERROR ; 0 - 20537 00001D9B 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? - 20538 ; jz short crename_no_parse_error - 20539 ;AC000; no - continue - 20540 00001D9D 752C jnz short crename_parse_error - 20541 ;AC000; Yes, fail. (need long jump) - 20542 ; - 20543 ; Get first file name returned from parse into our buffer - 20544 ; - 20545 crename_no_parse_error: - 20546 00001D9F 56 push si ;AN000; save position in line - 20547 00001DA0 C536[EFA5] lds si,[PARSE1_ADDR] - 20548 ;AN000; get address of filespec - 20549 00001DA4 E83113 call Move_To_SrcBuf ;AN000; move to srcbuf - 20550 00001DA7 5E pop si ;AN000; restore position in line - 20551 - 20552 00001DA8 31D2 xor dx,dx ;AN000; clear dx - 20553 00001DAA E8AE07 call Parse_With_Msg ;AC018; call parser - 20554 ;cmp ax,RESULT_NO_ERROR - 20555 00001DAD 21C0 and ax,ax ; 0 ? ;AN000; did we have an error? - 20556 00001DAF 751A jnz short crename_parse_error - 20557 ;AN000; Yes, fail. - 20558 ; - 20559 ; Check the second file name for drive letter colon - 20560 ; - 20561 00001DB1 56 push si ;AN000; save position in line - 20562 00001DB2 C536[EFA5] lds si,[PARSE1_ADDR] - 20563 ;AC000; get address of path - 20564 ;mov al,':' ;AC000; - 20565 ;cmp [si+1],al ;AC000; Does the 2nd parm have a drive spec? - 20566 00001DB6 807C013A cmp byte [si+1],':' - 20567 00001DBA 7511 jnz short ren_no_drive - 20568 ;AN000; Yes, error - 20569 ;mov byte [msg_disp_class],2 - 20570 00001DBC C606[D58F]02 mov byte [msg_disp_class],parse_msg_class - 20571 ;AN000; set up parse error msg class - 20572 00001DC1 BA[D78F] mov dx,extend_buf_ptr - 20573 ;AC000; get extended message pointer - 20574 ;mov word [extend_buf_ptr],0Ah - 20575 00001DC4 C706[D78F]0A00 mov word [extend_buf_ptr],BadParm_Ptr - 20576 ;AN000; get "Invalid parameter" message number - 20577 00001DCA 5E pop si ;AN000; - 20578 crename_parse_error: ;AC022; - 20579 00001DCB EB64 jmp short errj ;AC000; - 20580 - 20581 ; Get second file name returned from parse into the fCB. Save - 20582 ; character after file name so we can later check to make sure it - 20583 ; isn't a path character. - 20584 - 20585 ren_no_drive: - 20586 00001DCD BF6C00 mov di,FCB+10h ; 6Ch - 20587 ;AC000; set up to parse second file name - 20588 ;mov ax,(Parse_File_Descriptor SHL 8) OR 01H ;AC000; - 20589 00001DD0 B80129 mov ax,2901h - 20590 00001DD3 CD21 int 21h ;AC000; do the function - 20591 00001DD5 AC lodsb ;AC000; Load char after filename - 20592 00001DD6 A2[B19D] mov [One_Char_Val],al - 20593 ;AN000; save char after filename - 20594 00001DD9 5E pop si ;AN000; get line position back - 20595 ; - 20596 ; We have source and target. See if any args beyond. - 20597 ; - 20598 00001DDA BF[2797] mov di,PARSE_RENAME - 20599 ;AC000; get address of parse_rename - 20600 00001DDD E86507 call parse_check_eol ;AC000; are we at end of line? - 20601 00001DE0 75E9 jnz short crename_parse_error - 20602 ;AN000; no, fail. - 20603 00001DE2 E83D0C call PathCrunch - 20604 00001DE5 BA[E88F] mov dx,BADCPMES_PTR - 20605 00001DE8 74A1 jz short errj2 ; If 1st parm a dir, print error msg - 20606 00001DEA 730F jnc short notest3 - 20607 00001DEC A1[349F] mov ax,[Msg_Numb] ;AN022; get message number - 20608 ;cmp ax,0 ;AN022; was message flag set? - 20609 00001DEF 21C0 and ax,ax ; 0 ? - 20610 00001DF1 758D jnz short extend_setup - 20611 ;AN022; yes - print out message - 20612 ;cmp byte [DestIsDir],0 - 20613 00001DF3 3806[B99D] cmp [DestIsDir],al ; No CHDIRs worked - 20614 00001DF7 7402 jz short notest3 ; see if they should have - 20615 00001DF9 EB82 Jmp badpath_err ;AC022; set up error - 20616 notest3: - 20617 00001DFB A0[B19D] mov al,[One_Char_Val] - 20618 ;AN000; move char into AX - 20619 00001DFE BA[0990] mov dx,INORNOT_PTR - 20620 ; Load invalid fname error ptr - 20621 00001E01 E8100C call pathchrcmp ; Is the char in al a path sep? - 20622 00001E04 742B jz short errj ; Yes, error - 2nd arg must be - 20623 ; filename only. - 20624 ;mov ah,FCB_Rename - 20625 00001E06 B417 mov ah,17h - 20626 00001E08 BA5C00 mov dx,FCB ; 5Ch - 20627 00001E0B CD21 int 21h - 20628 00001E0D 3CFF cmp al,0FFh ; Did an error occur?? - 20629 00001E0F 7506 jne short renameok - 20630 - 20631 00001E11 E83702 call get_ext_error_number - 20632 ;AN022; get extended error - 20633 00001E14 50 push ax ;AC022; Save results - 20634 00001E15 B0FF mov al,0FFh ; Restore original error state - 20635 renameok: - 20636 00001E17 50 push ax - 20637 00001E18 E8150A call RestUDir - 20638 00001E1B 58 pop ax - 20639 00001E1C FEC0 inc al - 20640 ;;retnz - 20641 ;jz short rn1 - 20642 ;retn - 20643 00001E1E 7514 jnz short ret56 - 20644 rn1: - 20645 00001E20 58 pop ax ;AC022; get the error number back - 20646 00001E21 83F802 cmp ax,ERROR_FILE_NOT_FOUND ; 2 - 20647 ;AN022; error file not found? - 20648 00001E24 7408 je short use_renerr - 20649 ;AN022; yes - use generic error message - 20650 00001E26 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 - 20651 ;AN022; error file not found? - 20652 00001E29 7403 je short use_renerr - 20653 ;AN022; yes - use generic error message - 20654 00001E2B E952FF jmp extend_setup ;AN022; need long jump - use extended error - 20655 - 20656 use_renerr: - 20657 00001E2E BA[E58F] mov dx,RENERR_PTR ;AC022; - 20658 errj: - 20659 00001E31 E9F20E jmp cerror - 20660 ret56: - 20661 ;typefil_ret: ; 20/02/2023 ; 17/04/2023 - 20662 00001E34 C3 retn - 20663 - 20664 ; --------------------------------------------------------------------------- - 20665 - 20666 ;**************************************************************** - 20667 ;* - 20668 ;* ROUTINE: TYPEFIL - Display the contents of a file to the - 20669 ;* standard output device + 20400 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20401 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2001h + 20402 + 20403 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 20404 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:1DD9h + 20405 ERASE: + 20406 ; MSDOS 6.0 + 20407 + 20408 ;assume ds:trangroup,es:trangroup + 20409 + 20410 00001D0C BE8100 mov si,81h ;AC000; get command line + 20411 00001D0F C706[0B9C]0000 mov word [COMSW],0 ;AN000; clear switch indicator + 20412 00001D15 BF[9A96] mov di,PARSE_ERASE + 20413 ;AN000; Get address of PARSE_ERASE + 20414 00001D18 31C9 xor cx,cx ;AN000; clear cx,dx + 20415 erase_scan: + 20416 00001D1A 31D2 xor dx,dx ;AN000; + 20417 00001D1C E83C08 call Parse_With_Msg ;AC018; call parser + 20418 + 20419 ;cmp ax,-1 ; 0FFFFh + 20420 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? + 20421 ;je short good_line ;AN000; yes - done parsing + 20422 ;;cmp ax,0 + 20423 ;;cmp ax,RESULT_NO_ERROR ; 0 + 20424 ;and ax,ax ;AC000; did we have an error? + 20425 ;jnz short errj2 ;AC000; yes exit + 20426 ; 10/06/2023 + 20427 00001D1F 40 inc ax ; cmp ax,-1 + 20428 00001D20 743C jz short good_line ; 0FFFFh -> 0 + 20429 00001D22 48 dec ax ; cmp ax,0 + 20430 00001D23 7566 jnz short errj2 ; 1 -> 0 + 20431 ; ax = 0 + 20432 + 20433 00001D25 813E[EDA5][0D96] cmp word [PARSE1_SYN],SLASH_P_SYN ; "/P" + 20434 ;AN000; was /P entered? + 20435 00001D2B 741C je short set_erase_prompt + 20436 ;AN000; yes - go set prompt + 20437 ; + 20438 ; Must be filespec since no other matches occurred. move filename to srcbuf + 20439 ; + 20440 00001D2D 56 push si ;AC000; save position in line + 20441 00001D2E C536[EFA5] lds si,[PARSE1_ADDR] + 20442 ;AC000; get address of filespec + 20443 ;cmp byte [si+1],colon_char + 20444 00001D32 807C013A cmp byte [si+1],':' ;AC000; drive specified? + 20445 00001D36 750B jne short erase_drive_ok + 20446 ;AC000; no - continue + 20447 ;cmp byte [si+2],END_OF_LINE_OUT + 20448 00001D38 807C0200 cmp byte [si+2],0 ;AC000; was only drive entered? + 20449 00001D3C 7505 jne short erase_drive_ok + 20450 ;AC000; no - continue + 20451 00001D3E B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 + 20452 ;AN022; get message number in control block + 20453 00001D41 EB3D jmp short extend_setup + 20454 ;AC000; exit + 20455 erase_drive_ok: + 20456 00001D43 E89213 call Move_To_SrcBuf ;AC000; move to srcbuf + 20457 00001D46 5E pop si ;AC000; get position back + 20458 00001D47 EBD1 jmp short erase_scan + 20459 ;AN000; continue parsing + 20460 set_erase_prompt: + 20461 00001D49 833E[0B9C]00 cmp word [COMSW],0 ;AN018; was /P already entered? + 20462 00001D4E 7408 jz short ok_to_set_erase_prompt + 20463 ;AN018; no go set switch + 20464 ;mov ax,1 + 20465 00001D50 B80100 mov ax,MoreArgs_Ptr + 20466 ;AN018; set up too many arguments + 20467 00001D53 E81408 call setup_parse_error_msg + 20468 ;AN018; set up an error message + 20469 00001D56 EB33 jmp short errj2 ;AN018; exit + 20470 + 20471 ok_to_set_erase_prompt: ;AN018; + 20472 00001D58 FF06[0B9C] inc word [COMSW] ;AN000; indicate /p specified + 20473 00001D5C EBBC jmp short erase_scan + 20474 ;AN000; continue parsing + 20475 good_line: ;G We know line is good + 20476 00001D5E E8C10C call PathCrunch + 20477 00001D61 730D jnc short checkdr + 20478 00001D63 A1[349F] mov ax,[Msg_Numb] ;AN022; get message number + 20479 ;cmp ax,0 ;AN022; was message flag set? + 20480 00001D66 09C0 or ax,ax + 20481 00001D68 7516 jnz short extend_setup + 20482 ;AN022; yes - print out message + 20483 ;cmp byte [DestIsDir],0 + 20484 00001D6A 3806[B99D] cmp [DestIsDir],al ; No CHDIRs worked + 20485 00001D6E 750D jnz short badpath_err + 20486 ;AC022; see if they should have + 20487 checkdr: + 20488 00001D70 833E[0B9C]00 cmp word [COMSW],0 ;AN000; was /p specified + 20489 00001D75 7403 jz short notest2j ;AN000; no - go to notest2 + 20490 00001D77 E9FB1B jmp slashp_erase ;AN000; yes - go to slashp_erase + 20491 notest2j: + 20492 00001D7A E9931B jmp notest2 + 20493 + 20494 badpath_err: ;AN022; "Path not found" message + 20495 00001D7D B80300 mov ax,ERROR_PATH_NOT_FOUND ; 3 + 20496 ;AN022; set up error number + 20497 extend_setup: ;AN022; + 20498 ;mov byte [msg_disp_class],1 + 20499 00001D80 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 20500 ;AN022; set up extended error msg class + 20501 00001D85 BA[D78F] mov dx,extend_buf_ptr + 20502 ;AC022; get extended message pointer + 20503 00001D88 A3[D78F] mov [extend_buf_ptr],ax + 20504 ;AN022; get message number in control block + 20505 errj2: ;AC022; exit jump + 20506 00001D8B E9980F jmp cerror ;AN022; + 20507 + 20508 ; --------------------------------------------------------------------------- + 20509 + 20510 ; **************************************************************** + 20511 ; * + 20512 ; * ROUTINE: CRENAME - rename file(s) + 20513 ; * + 20514 ; * FUNCTION: PARSE command line for one full filespec and one + 20515 ; * filename. Invoke PATHCRUNCH on the full filespec. + 20516 ; * Make sure the second filespec only contains a + 20517 ; * filename. If both openands are valid, attempt + 20518 ; * to rename the file. + 20519 ; * + 20520 ; * INPUT: command line at offset 81H + 20521 ; * + 20522 ; * OUTPUT: none + 20523 ; * + 20524 ; **************************************************************** + 20525 + 20526 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20527 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20528 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 20529 CRENAME: + 20530 ; MSDOS 6.0 + 20531 ;assume ds:trangroup,es:trangroup + 20532 + 20533 00001D8E BE8100 mov si,81h ;AC000; Point to command line + 20534 00001D91 BF[2797] mov di,PARSE_RENAME + 20535 ;AN000; Get address of PARSE_RENAME + 20536 00001D94 31C9 xor cx,cx ;AN000; clear cx,dx + 20537 00001D96 31D2 xor dx,dx ;AN000; + 20538 00001D98 E8C007 call Parse_With_Msg ;AC018; call parser + 20539 ;cmp ax,RESULT_NO_ERROR ; 0 + 20540 00001D9B 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? + 20541 ; jz short crename_no_parse_error + 20542 ;AC000; no - continue + 20543 00001D9D 752C jnz short crename_parse_error + 20544 ;AC000; Yes, fail. (need long jump) + 20545 ; + 20546 ; Get first file name returned from parse into our buffer + 20547 ; + 20548 crename_no_parse_error: + 20549 00001D9F 56 push si ;AN000; save position in line + 20550 00001DA0 C536[EFA5] lds si,[PARSE1_ADDR] + 20551 ;AN000; get address of filespec + 20552 00001DA4 E83113 call Move_To_SrcBuf ;AN000; move to srcbuf + 20553 00001DA7 5E pop si ;AN000; restore position in line + 20554 + 20555 00001DA8 31D2 xor dx,dx ;AN000; clear dx + 20556 00001DAA E8AE07 call Parse_With_Msg ;AC018; call parser + 20557 ;cmp ax,RESULT_NO_ERROR + 20558 00001DAD 21C0 and ax,ax ; 0 ? ;AN000; did we have an error? + 20559 00001DAF 751A jnz short crename_parse_error + 20560 ;AN000; Yes, fail. + 20561 ; + 20562 ; Check the second file name for drive letter colon + 20563 ; + 20564 00001DB1 56 push si ;AN000; save position in line + 20565 00001DB2 C536[EFA5] lds si,[PARSE1_ADDR] + 20566 ;AC000; get address of path + 20567 ;mov al,':' ;AC000; + 20568 ;cmp [si+1],al ;AC000; Does the 2nd parm have a drive spec? + 20569 00001DB6 807C013A cmp byte [si+1],':' + 20570 00001DBA 7511 jnz short ren_no_drive + 20571 ;AN000; Yes, error + 20572 ;mov byte [msg_disp_class],2 + 20573 00001DBC C606[D58F]02 mov byte [msg_disp_class],parse_msg_class + 20574 ;AN000; set up parse error msg class + 20575 00001DC1 BA[D78F] mov dx,extend_buf_ptr + 20576 ;AC000; get extended message pointer + 20577 ;mov word [extend_buf_ptr],0Ah + 20578 00001DC4 C706[D78F]0A00 mov word [extend_buf_ptr],BadParm_Ptr + 20579 ;AN000; get "Invalid parameter" message number + 20580 00001DCA 5E pop si ;AN000; + 20581 crename_parse_error: ;AC022; + 20582 00001DCB EB64 jmp short errj ;AC000; + 20583 + 20584 ; Get second file name returned from parse into the fCB. Save + 20585 ; character after file name so we can later check to make sure it + 20586 ; isn't a path character. + 20587 + 20588 ren_no_drive: + 20589 00001DCD BF6C00 mov di,FCB+10h ; 6Ch + 20590 ;AC000; set up to parse second file name + 20591 ;mov ax,(Parse_File_Descriptor SHL 8) OR 01H ;AC000; + 20592 00001DD0 B80129 mov ax,2901h + 20593 00001DD3 CD21 int 21h ;AC000; do the function + 20594 00001DD5 AC lodsb ;AC000; Load char after filename + 20595 00001DD6 A2[B19D] mov [One_Char_Val],al + 20596 ;AN000; save char after filename + 20597 00001DD9 5E pop si ;AN000; get line position back + 20598 ; + 20599 ; We have source and target. See if any args beyond. + 20600 ; + 20601 00001DDA BF[2797] mov di,PARSE_RENAME + 20602 ;AC000; get address of parse_rename + 20603 00001DDD E86507 call parse_check_eol ;AC000; are we at end of line? + 20604 00001DE0 75E9 jnz short crename_parse_error + 20605 ;AN000; no, fail. + 20606 00001DE2 E83D0C call PathCrunch + 20607 00001DE5 BA[E88F] mov dx,BADCPMES_PTR + 20608 00001DE8 74A1 jz short errj2 ; If 1st parm a dir, print error msg + 20609 00001DEA 730F jnc short notest3 + 20610 00001DEC A1[349F] mov ax,[Msg_Numb] ;AN022; get message number + 20611 ;cmp ax,0 ;AN022; was message flag set? + 20612 00001DEF 21C0 and ax,ax ; 0 ? + 20613 00001DF1 758D jnz short extend_setup + 20614 ;AN022; yes - print out message + 20615 ;cmp byte [DestIsDir],0 + 20616 00001DF3 3806[B99D] cmp [DestIsDir],al ; No CHDIRs worked + 20617 00001DF7 7402 jz short notest3 ; see if they should have + 20618 00001DF9 EB82 Jmp badpath_err ;AC022; set up error + 20619 notest3: + 20620 00001DFB A0[B19D] mov al,[One_Char_Val] + 20621 ;AN000; move char into AX + 20622 00001DFE BA[0990] mov dx,INORNOT_PTR + 20623 ; Load invalid fname error ptr + 20624 00001E01 E8100C call pathchrcmp ; Is the char in al a path sep? + 20625 00001E04 742B jz short errj ; Yes, error - 2nd arg must be + 20626 ; filename only. + 20627 ;mov ah,FCB_Rename + 20628 00001E06 B417 mov ah,17h + 20629 00001E08 BA5C00 mov dx,FCB ; 5Ch + 20630 00001E0B CD21 int 21h + 20631 00001E0D 3CFF cmp al,0FFh ; Did an error occur?? + 20632 00001E0F 7506 jne short renameok + 20633 + 20634 00001E11 E83702 call get_ext_error_number + 20635 ;AN022; get extended error + 20636 00001E14 50 push ax ;AC022; Save results + 20637 00001E15 B0FF mov al,0FFh ; Restore original error state + 20638 renameok: + 20639 00001E17 50 push ax + 20640 00001E18 E8150A call RestUDir + 20641 00001E1B 58 pop ax + 20642 00001E1C FEC0 inc al + 20643 ;;retnz + 20644 ;jz short rn1 + 20645 ;retn + 20646 00001E1E 7514 jnz short ret56 + 20647 rn1: + 20648 00001E20 58 pop ax ;AC022; get the error number back + 20649 00001E21 83F802 cmp ax,ERROR_FILE_NOT_FOUND ; 2 + 20650 ;AN022; error file not found? + 20651 00001E24 7408 je short use_renerr + 20652 ;AN022; yes - use generic error message + 20653 00001E26 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 + 20654 ;AN022; error file not found? + 20655 00001E29 7403 je short use_renerr + 20656 ;AN022; yes - use generic error message + 20657 00001E2B E952FF jmp extend_setup ;AN022; need long jump - use extended error + 20658 + 20659 use_renerr: + 20660 00001E2E BA[E58F] mov dx,RENERR_PTR ;AC022; + 20661 errj: + 20662 00001E31 E9F20E jmp cerror + 20663 ret56: + 20664 ;typefil_ret: ; 20/02/2023 ; 17/04/2023 + 20665 00001E34 C3 retn + 20666 + 20667 ; --------------------------------------------------------------------------- + 20668 + 20669 ;**************************************************************** 20670 ;* - 20671 ;* SYNTAX: TYPE filespec - 20672 ;* - 20673 ;* FUNCTION: If a valid filespec is found, read the file until - 20674 ;* 1Ah and display the contents to STDOUT. + 20671 ;* ROUTINE: TYPEFIL - Display the contents of a file to the + 20672 ;* standard output device + 20673 ;* + 20674 ;* SYNTAX: TYPE filespec 20675 ;* - 20676 ;* INPUT: command line at offset 81H - 20677 ;* - 20678 ;* OUTPUT: none - 20679 ;* - 20680 ;**************************************************************** - 20681 - 20682 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20683 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20684 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20685 TYPEFIL: - 20686 ; MSDOS 6.0 - 20687 ;assume ds:trangroup,es:trangroup - 20688 - 20689 00001E35 BE8100 mov si,81h - 20690 00001E38 BF[8896] mov di,PARSE_MRDIR - 20691 ;AN000; Get address of PARSE_MRDIR - 20692 00001E3B 31C9 xor cx,cx ;AN000; clear cx,dx - 20693 00001E3D 31D2 xor dx,dx ;AN000; - 20694 00001E3F E81907 call Parse_With_Msg ;AC018; call parser - 20695 ;cmp ax,RESULT_NO_ERROR - 20696 00001E42 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? - 20697 00001E44 751E jnz short typefil_parse_error - 20698 ;AN000; yes - issue error message - 20699 - 20700 00001E46 56 push si ;AC000; save position in line - 20701 00001E47 C536[EFA5] lds si,[PARSE1_ADDR] - 20702 ;AC000; get address of filespec - 20703 00001E4B E88A12 call Move_To_SrcBuf ;AC000; move to srcbuf - 20704 00001E4E 5E pop si ;AC000; get position back - 20705 00001E4F BF[8896] mov di,PARSE_MRDIR - 20706 ;AC000; get address of parse_mrdir - 20707 00001E52 E8F006 call parse_check_eol ;AC000; are we at end of line? - 20708 ;jz short gottarg ;AC000; yes - continue - 20709 ; 20/02/2023 - 20710 ;typefil_parse_error: ;AN000; no - set up error message and exit - 20711 ;jmp cerror - 20712 00001E55 750D jnz short typefil_parse_error - 20713 gottarg: - 20714 00001E57 E8C510 call SETPATH - 20715 00001E5A F606[BD9D]02 test byte [DestInfo],00000010b ; 2 - 20716 ; Does the filespec contain wildcards - 20717 00001E5F 7406 jz short nowilds ; No, continue processing - 20718 00001E61 BA[0990] mov dx,INORNOT_PTR ; Yes, report error - 20719 ; 20/02/2023 - 20720 typefil_parse_error: - 20721 00001E64 E9BF0E jmp cerror - 20722 nowilds: - 20723 ;mov ax,ExtOpen SHL 8 ;AC000; open the file - 20724 00001E67 B8006C mov ax,6C00h - 20725 ;mov bx,read_open_mode ; 0 - 20726 ;AN000; get open mode for TYPE - 20727 00001E6A 31C9 xor cx,cx ;AN000; no special files - 20728 00001E6C 89CB mov bx,cx ; 20/02/2023 - 20729 00001E6E BA0101 mov dx,101h - 20730 ;mov dx,read_open_flag ; 101h - 20731 ;AN000; set up open flags - 20732 00001E71 BE[219E] mov si,SrcBuf ;AN030; get file name - 20733 ;int 21h - 20734 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20735 00001E74 E843E7 call int_21h_indirect - 20736 00001E77 7313 jnc short typecont ; If open worked, continue. Otherwise load - 20737 - 20738 typerr: ;AN022; - 20739 00001E79 0E push cs ;AN022; make sure we have local segment - 20740 00001E7A 1F pop ds ;AN022; - 20741 00001E7B E8BD01 call Set_Ext_Error_Msg ;AN022; - 20742 00001E7E C706[A09D][219E] mov word [string_ptr_2],SrcBuf - 20743 ;AC022; get address of failed string - 20744 ;mov byte [extend_buf_sub],1 - 20745 00001E84 C606[D98F]01 mov byte [extend_buf_sub],one_subst - 20746 ;AC022; put number of subst in control block - 20747 00001E89 E99A0E jmp cerror ;AC022; exit - 20748 - 20749 typecont: - 20750 00001E8C 89C3 mov bx,ax ;AC000; get Handle - 20751 ;M043 - 20752 ; We should do the LSEEK for filesize only if this handle belongs to a file - 20753 ;and not if it belongs to a device. If device, set TypeFilSiz+2 to -1 to - 20754 ;indicate it is a device. - 20755 ; - 20756 ;mov ax,(IOCTL shl 8) or 0 - 20757 00001E8E B80044 mov ax,4400h - 20758 ;int 21h - 20759 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20760 00001E91 E826E7 call int_21h_indirect - 20761 - 20762 00001E94 F6C280 test dl,80h ;is it a device? - 20763 00001E97 7408 jz short not_device - 20764 ;no, a file - 20765 - 20766 ;mov word [TypeFilSiz+2],-1 ; 0FFFFh - 20767 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20768 00001E99 C706[9E9D]FFFF mov word [File_Size_High],-1 ; 0FFFFh - 20769 ;indicate it is a device - 20770 00001E9F EB19 jmp short dotype - 20771 not_device: - 20772 ;SR; - 20773 ; Find the filesize by seeking to the end and then reset file pointer to - 20774 ;start of file - 20775 - 20776 ;mov ax,(LSEEK shl 8) or 2 - 20777 00001EA1 B80242 mov ax,4202h - 20778 00001EA4 31D2 xor dx,dx - 20779 00001EA6 89D1 mov cx,dx ;seek to end of file - 20780 ;int 21h - 20781 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20782 00001EA8 E80FE7 call int_21h_indirect - 20783 - 20784 ;mov [TypeFilSiz],ax - 20785 ;mov [TypeFilSiz+2],dx ;store filesize - 20786 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20787 00001EAB A3[9C9D] mov [File_Size_Low],ax - 20788 00001EAE 8916[9E9D] mov [File_Size_High],dx - 20789 - 20790 ;mov ax,(LSEEK shl 8) or 0 - 20791 00001EB2 B80042 mov ax,4200h - 20792 00001EB5 31D2 xor dx,dx - 20793 ;int 21h ;reset file pointer to start - 20794 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20795 00001EB7 E800E7 call int_21h_indirect - 20796 dotype: ;M043 - 20797 00001EBA C606[E59E]00 mov byte [zflag],0 ; Reset ^Z flag - 20798 00001EBF 8E1E[F79B] mov ds,[TPA] - 20799 00001EC3 31D2 xor dx,dx - 20800 ;ASSUME DS:NOTHING - 20801 typelp: - 20802 00001EC5 2E803E[E59E]00 cmp byte [cs:zflag],0 - 20803 ;AC050; Is the ^Z flag set? - 20804 ;retnz ; Yes, return - 20805 ; 17/04/2023 - 20806 00001ECB 7401 jz short tf1 - 20807 00001ECD C3 retn - 20808 tf1: - 20809 00001ECE 2E8B0E[159C] mov cx,[cs:BYTCNT] ;AC056; No, continue - 20810 - 20811 ;Update the filesize left to read - 20812 - 20813 ;cmp word [cs:TypeFilSiz+2],-1 - 20814 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20815 00001ED3 2E833E[9E9D]FF cmp word [cs:File_Size_High],-1 ; 0FFFFh - 20816 ;is it a device? M043 - 20817 00001ED9 7431 je short typ_read ;yes, just read from it; M043 - 20818 - 20819 ;cmp word [cs:TypeFilSiz+2],0 - 20820 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20821 00001EDB 2E833E[9E9D]00 cmp word [cs:File_Size_High],0 - 20822 ;more than 64K left? - 20823 00001EE1 740D jz short lt64k ;no, do word subtraction - 20824 ;sub [cs:TypeFilSiz],cx - 20825 ;sbb word [cs:TypeFilSiz+2],0 - 20826 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20827 00001EE3 2E290E[9C9D] sub [cs:File_Size_Low],cx - 20828 00001EE8 2E831E[9E9D]00 sbb word [cs:File_Size_High],0 - 20829 ;update filesize - 20830 00001EEE EB1C jmp short typ_read ;do the read - 20831 lt64k: - 20832 ;cmp cx,[cs:TypeFilSiz] - 20833 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20834 00001EF0 2E3B0E[9C9D] cmp cx,[cs:File_Size_Low] - 20835 ;readsize <= buffer? - 20836 00001EF5 7610 jbe short gtbuf ; yes, just update readsize - 20837 - 20838 ;Buffer size is larger than bytes to read - 20839 - 20840 ;mov cx,[cs:TypeFilSiz] - 20841 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20842 00001EF7 2E8B0E[9C9D] mov cx,[cs:File_Size_Low] - 20843 00001EFC E364 jcxz typelp_ret - 20844 ;mov word [cs:TypeFilSiz],0 - 20845 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20846 00001EFE 2EC706[9C9D]0000 mov word [cs:File_Size_Low],0 - 20847 00001F05 EB05 jmp short typ_read - 20848 gtbuf: - 20849 ;sub [cs:TypeFilSiz],cx - 20850 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20851 00001F07 2E290E[9C9D] sub [cs:File_Size_Low],cx - 20852 ;update filesize remaining - 20853 typ_read: - 20854 ;mov ah,read - 20855 00001F0C B43F mov ah,3Fh - 20856 ;int 21h - 20857 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20858 00001F0E E8A9E6 call int_21h_indirect - 20859 00001F11 7303 jnc short tf2 ;M043 - 20860 00001F13 E963FF jmp typerr ;M043 - 20861 tf2: ;M043 - 20862 ;M043; jc typerr ;AN022; Exit if error - 20863 - 20864 00001F16 89C1 mov cx,ax - 20865 00001F18 E348 jcxz typelp_ret ;AC000; exit if nothing read - 20866 00001F1A 1E push ds - 20867 00001F1B 07 pop es ; Check to see if a ^Z was read. - 20868 ;assume es:nothing - 20869 00001F1C 31FF xor di,di - 20870 00001F1E 50 push ax - 20871 00001F1F B01A mov al,1Ah - 20872 00001F21 F2AE repnz scasb - 20873 00001F23 58 pop ax - 20874 00001F24 91 xchg ax,cx - 20875 ;cmp ax,0 - 20876 00001F25 21C0 and ax,ax - 20877 00001F27 7506 jnz short foundz ; Yes, handle it - 20878 00001F29 807DFF1A cmp byte [di-1],1Ah ; No, double check - 20879 00001F2D 750A jnz short typecont2 ; No ^Z, continue - 20880 foundz: - 20881 00001F2F 29C1 sub cx,ax ; Otherwise change cx so that only those - 20882 00001F31 49 dec cx ; bytes up to but NOT including the ^Z - 20883 00001F32 0E push cs ; will be typed. - 20884 00001F33 07 pop es - 20885 ;assume es:trangroup - 20886 00001F34 26F616[E59E] not byte [es:zflag] ; Turn on ^Z flag so that the routine - 20887 typecont2: ; will quit after this write. - 20888 00001F39 53 push bx - 20889 00001F3A BB0100 mov bx,1 - 20890 ;mov ah,Write - 20891 00001F3D B440 mov ah,40h - 20892 ;int 21h - 20893 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20894 00001F3F E878E6 call int_21h_indirect - 20895 00001F42 5B pop bx - 20896 00001F43 720C jc short Error_outputj - 20897 00001F45 39C8 cmp ax,cx - 20898 00001F47 7503 jnz short tf3 ;M043 - 20899 00001F49 E979FF jmp typelp ;M043 - 20900 tf3: ;M043 - 20901 ;M043; jz short typelp - 20902 00001F4C 49 dec cx - 20903 00001F4D 39C8 cmp ax,cx - 20904 ;;retz ; One less byte OK (^Z) - 20905 ;jnz short Error_outputj - 20906 ;tf4: - 20907 ;retn - 20908 00001F4F 7411 jz short typelp_ret ; 20/02/2023 - 20909 - 20910 Error_outputj: - 20911 00001F51 BB0100 mov bx,1 - 20912 ;mov ax,IOCTL SHL 8 - 20913 00001F54 B80044 mov ax,4400h - 20914 ;int 21h - 20915 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 20916 00001F57 E860E6 call int_21h_indirect - 20917 00001F5A F6C280 test dl,80h - 20918 ;test dl,devid_ISDEV - 20919 ;;retnz ; If device, no error message - 20920 ;jnz short tf4 - 20921 00001F5D 7503 jnz short typelp_ret - 20922 00001F5F E9980A jmp error_output - 20923 typelp_ret: - 20924 00001F62 C3 retn - 20925 - 20926 ; --------------------------------------------------------------------------- - 20927 - 20928 ; VOLUME command displays the volume ID on the specified drive - 20929 - 20930 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20931 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20932 ; 10/06/2023 - 20933 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20934 VOLUME: - 20935 ; MSDOS 6.0 - 20936 00001F63 BE8100 mov si,81h - 20937 00001F66 BF[7696] mov di,PARSE_VOL - 20938 ;AN000; Get address of PARSE_VOL - 20939 00001F69 31C9 xor cx,cx ;AN000; clear cx,dx - 20940 00001F6B 31D2 xor dx,dx ;AN000; - 20941 00001F6D E8EB05 call Parse_With_Msg ;AC018; call parser - 20942 - 20943 ;cmp ax,-1 ; 0FFFFh - 20944 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 20945 ;je short OkVolArg ;AC000; Yes, display default volume ID - 20946 ;;cmp ax,RESULT_NO_ERROR - 20947 ;;cmp ax,0 ;AC000; did we have an error? - 20948 ;or ax,ax ; 0? - 20949 ;jnz short badvolarg ;AC000; Yes, fail. - 20950 ; 10/06/2023 - 20951 00001F70 40 inc ax ; cmp ax,-1 - 20952 00001F71 7447 jz short OkVolArg ; 0FFFFh -> 0 - 20953 00001F73 48 dec ax ; cmp ax,0 - 20954 00001F74 750A jnz short badvolarg ; 1 -> 0 - 20955 ; ax = 0 - 20956 - 20957 ; We have parsed off the drive. See if there are any more chars left - 20958 - 20959 00001F76 BF[7696] mov di,PARSE_VOL - 20960 ;AC000; get address of parse_vol - 20961 00001F79 31D2 xor dx,dx ;AC000; - 20962 00001F7B E8C705 call parse_check_eol ;AC000; call parser - 20963 00001F7E 743A jz short OkVolArg ;AC000; yes, end of road - 20964 - 20965 ; The line was not interpretable. Report an error. - 20966 - 20967 badvolarg: - 20968 00001F80 E9A30D jmp cerror + 20676 ;* FUNCTION: If a valid filespec is found, read the file until + 20677 ;* 1Ah and display the contents to STDOUT. + 20678 ;* + 20679 ;* INPUT: command line at offset 81H + 20680 ;* + 20681 ;* OUTPUT: none + 20682 ;* + 20683 ;**************************************************************** + 20684 + 20685 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20686 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20687 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 20688 TYPEFIL: + 20689 ; MSDOS 6.0 + 20690 ;assume ds:trangroup,es:trangroup + 20691 + 20692 00001E35 BE8100 mov si,81h + 20693 00001E38 BF[8896] mov di,PARSE_MRDIR + 20694 ;AN000; Get address of PARSE_MRDIR + 20695 00001E3B 31C9 xor cx,cx ;AN000; clear cx,dx + 20696 00001E3D 31D2 xor dx,dx ;AN000; + 20697 00001E3F E81907 call Parse_With_Msg ;AC018; call parser + 20698 ;cmp ax,RESULT_NO_ERROR + 20699 00001E42 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? + 20700 00001E44 751E jnz short typefil_parse_error + 20701 ;AN000; yes - issue error message + 20702 + 20703 00001E46 56 push si ;AC000; save position in line + 20704 00001E47 C536[EFA5] lds si,[PARSE1_ADDR] + 20705 ;AC000; get address of filespec + 20706 00001E4B E88A12 call Move_To_SrcBuf ;AC000; move to srcbuf + 20707 00001E4E 5E pop si ;AC000; get position back + 20708 00001E4F BF[8896] mov di,PARSE_MRDIR + 20709 ;AC000; get address of parse_mrdir + 20710 00001E52 E8F006 call parse_check_eol ;AC000; are we at end of line? + 20711 ;jz short gottarg ;AC000; yes - continue + 20712 ; 20/02/2023 + 20713 ;typefil_parse_error: ;AN000; no - set up error message and exit + 20714 ;jmp cerror + 20715 00001E55 750D jnz short typefil_parse_error + 20716 gottarg: + 20717 00001E57 E8C510 call SETPATH + 20718 00001E5A F606[BD9D]02 test byte [DestInfo],00000010b ; 2 + 20719 ; Does the filespec contain wildcards + 20720 00001E5F 7406 jz short nowilds ; No, continue processing + 20721 00001E61 BA[0990] mov dx,INORNOT_PTR ; Yes, report error + 20722 ; 20/02/2023 + 20723 typefil_parse_error: + 20724 00001E64 E9BF0E jmp cerror + 20725 nowilds: + 20726 ;mov ax,ExtOpen SHL 8 ;AC000; open the file + 20727 00001E67 B8006C mov ax,6C00h + 20728 ;mov bx,read_open_mode ; 0 + 20729 ;AN000; get open mode for TYPE + 20730 00001E6A 31C9 xor cx,cx ;AN000; no special files + 20731 00001E6C 89CB mov bx,cx ; 20/02/2023 + 20732 00001E6E BA0101 mov dx,101h + 20733 ;mov dx,read_open_flag ; 101h + 20734 ;AN000; set up open flags + 20735 00001E71 BE[219E] mov si,SrcBuf ;AN030; get file name + 20736 ;int 21h + 20737 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20738 00001E74 E843E7 call int_21h_indirect + 20739 00001E77 7313 jnc short typecont ; If open worked, continue. Otherwise load + 20740 + 20741 typerr: ;AN022; + 20742 00001E79 0E push cs ;AN022; make sure we have local segment + 20743 00001E7A 1F pop ds ;AN022; + 20744 00001E7B E8BD01 call Set_Ext_Error_Msg ;AN022; + 20745 00001E7E C706[A09D][219E] mov word [string_ptr_2],SrcBuf + 20746 ;AC022; get address of failed string + 20747 ;mov byte [extend_buf_sub],1 + 20748 00001E84 C606[D98F]01 mov byte [extend_buf_sub],one_subst + 20749 ;AC022; put number of subst in control block + 20750 00001E89 E99A0E jmp cerror ;AC022; exit + 20751 + 20752 typecont: + 20753 00001E8C 89C3 mov bx,ax ;AC000; get Handle + 20754 ;M043 + 20755 ; We should do the LSEEK for filesize only if this handle belongs to a file + 20756 ;and not if it belongs to a device. If device, set TypeFilSiz+2 to -1 to + 20757 ;indicate it is a device. + 20758 ; + 20759 ;mov ax,(IOCTL shl 8) or 0 + 20760 00001E8E B80044 mov ax,4400h + 20761 ;int 21h + 20762 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20763 00001E91 E826E7 call int_21h_indirect + 20764 + 20765 00001E94 F6C280 test dl,80h ;is it a device? + 20766 00001E97 7408 jz short not_device + 20767 ;no, a file + 20768 + 20769 ;mov word [TypeFilSiz+2],-1 ; 0FFFFh + 20770 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20771 00001E99 C706[9E9D]FFFF mov word [File_Size_High],-1 ; 0FFFFh + 20772 ;indicate it is a device + 20773 00001E9F EB19 jmp short dotype + 20774 not_device: + 20775 ;SR; + 20776 ; Find the filesize by seeking to the end and then reset file pointer to + 20777 ;start of file + 20778 + 20779 ;mov ax,(LSEEK shl 8) or 2 + 20780 00001EA1 B80242 mov ax,4202h + 20781 00001EA4 31D2 xor dx,dx + 20782 00001EA6 89D1 mov cx,dx ;seek to end of file + 20783 ;int 21h + 20784 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20785 00001EA8 E80FE7 call int_21h_indirect + 20786 + 20787 ;mov [TypeFilSiz],ax + 20788 ;mov [TypeFilSiz+2],dx ;store filesize + 20789 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20790 00001EAB A3[9C9D] mov [File_Size_Low],ax + 20791 00001EAE 8916[9E9D] mov [File_Size_High],dx + 20792 + 20793 ;mov ax,(LSEEK shl 8) or 0 + 20794 00001EB2 B80042 mov ax,4200h + 20795 00001EB5 31D2 xor dx,dx + 20796 ;int 21h ;reset file pointer to start + 20797 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20798 00001EB7 E800E7 call int_21h_indirect + 20799 dotype: ;M043 + 20800 00001EBA C606[E59E]00 mov byte [zflag],0 ; Reset ^Z flag + 20801 00001EBF 8E1E[F79B] mov ds,[TPA] + 20802 00001EC3 31D2 xor dx,dx + 20803 ;ASSUME DS:NOTHING + 20804 typelp: + 20805 00001EC5 2E803E[E59E]00 cmp byte [cs:zflag],0 + 20806 ;AC050; Is the ^Z flag set? + 20807 ;retnz ; Yes, return + 20808 ; 17/04/2023 + 20809 00001ECB 7401 jz short tf1 + 20810 00001ECD C3 retn + 20811 tf1: + 20812 00001ECE 2E8B0E[159C] mov cx,[cs:BYTCNT] ;AC056; No, continue + 20813 + 20814 ;Update the filesize left to read + 20815 + 20816 ;cmp word [cs:TypeFilSiz+2],-1 + 20817 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20818 00001ED3 2E833E[9E9D]FF cmp word [cs:File_Size_High],-1 ; 0FFFFh + 20819 ;is it a device? M043 + 20820 00001ED9 7431 je short typ_read ;yes, just read from it; M043 + 20821 + 20822 ;cmp word [cs:TypeFilSiz+2],0 + 20823 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20824 00001EDB 2E833E[9E9D]00 cmp word [cs:File_Size_High],0 + 20825 ;more than 64K left? + 20826 00001EE1 740D jz short lt64k ;no, do word subtraction + 20827 ;sub [cs:TypeFilSiz],cx + 20828 ;sbb word [cs:TypeFilSiz+2],0 + 20829 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20830 00001EE3 2E290E[9C9D] sub [cs:File_Size_Low],cx + 20831 00001EE8 2E831E[9E9D]00 sbb word [cs:File_Size_High],0 + 20832 ;update filesize + 20833 00001EEE EB1C jmp short typ_read ;do the read + 20834 lt64k: + 20835 ;cmp cx,[cs:TypeFilSiz] + 20836 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20837 00001EF0 2E3B0E[9C9D] cmp cx,[cs:File_Size_Low] + 20838 ;readsize <= buffer? + 20839 00001EF5 7610 jbe short gtbuf ; yes, just update readsize + 20840 + 20841 ;Buffer size is larger than bytes to read + 20842 + 20843 ;mov cx,[cs:TypeFilSiz] + 20844 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20845 00001EF7 2E8B0E[9C9D] mov cx,[cs:File_Size_Low] + 20846 00001EFC E364 jcxz typelp_ret + 20847 ;mov word [cs:TypeFilSiz],0 + 20848 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20849 00001EFE 2EC706[9C9D]0000 mov word [cs:File_Size_Low],0 + 20850 00001F05 EB05 jmp short typ_read + 20851 gtbuf: + 20852 ;sub [cs:TypeFilSiz],cx + 20853 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20854 00001F07 2E290E[9C9D] sub [cs:File_Size_Low],cx + 20855 ;update filesize remaining + 20856 typ_read: + 20857 ;mov ah,read + 20858 00001F0C B43F mov ah,3Fh + 20859 ;int 21h + 20860 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20861 00001F0E E8A9E6 call int_21h_indirect + 20862 00001F11 7303 jnc short tf2 ;M043 + 20863 00001F13 E963FF jmp typerr ;M043 + 20864 tf2: ;M043 + 20865 ;M043; jc typerr ;AN022; Exit if error + 20866 + 20867 00001F16 89C1 mov cx,ax + 20868 00001F18 E348 jcxz typelp_ret ;AC000; exit if nothing read + 20869 00001F1A 1E push ds + 20870 00001F1B 07 pop es ; Check to see if a ^Z was read. + 20871 ;assume es:nothing + 20872 00001F1C 31FF xor di,di + 20873 00001F1E 50 push ax + 20874 00001F1F B01A mov al,1Ah + 20875 00001F21 F2AE repnz scasb + 20876 00001F23 58 pop ax + 20877 00001F24 91 xchg ax,cx + 20878 ;cmp ax,0 + 20879 00001F25 21C0 and ax,ax + 20880 00001F27 7506 jnz short foundz ; Yes, handle it + 20881 00001F29 807DFF1A cmp byte [di-1],1Ah ; No, double check + 20882 00001F2D 750A jnz short typecont2 ; No ^Z, continue + 20883 foundz: + 20884 00001F2F 29C1 sub cx,ax ; Otherwise change cx so that only those + 20885 00001F31 49 dec cx ; bytes up to but NOT including the ^Z + 20886 00001F32 0E push cs ; will be typed. + 20887 00001F33 07 pop es + 20888 ;assume es:trangroup + 20889 00001F34 26F616[E59E] not byte [es:zflag] ; Turn on ^Z flag so that the routine + 20890 typecont2: ; will quit after this write. + 20891 00001F39 53 push bx + 20892 00001F3A BB0100 mov bx,1 + 20893 ;mov ah,Write + 20894 00001F3D B440 mov ah,40h + 20895 ;int 21h + 20896 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20897 00001F3F E878E6 call int_21h_indirect + 20898 00001F42 5B pop bx + 20899 00001F43 720C jc short Error_outputj + 20900 00001F45 39C8 cmp ax,cx + 20901 00001F47 7503 jnz short tf3 ;M043 + 20902 00001F49 E979FF jmp typelp ;M043 + 20903 tf3: ;M043 + 20904 ;M043; jz short typelp + 20905 00001F4C 49 dec cx + 20906 00001F4D 39C8 cmp ax,cx + 20907 ;;retz ; One less byte OK (^Z) + 20908 ;jnz short Error_outputj + 20909 ;tf4: + 20910 ;retn + 20911 00001F4F 7411 jz short typelp_ret ; 20/02/2023 + 20912 + 20913 Error_outputj: + 20914 00001F51 BB0100 mov bx,1 + 20915 ;mov ax,IOCTL SHL 8 + 20916 00001F54 B80044 mov ax,4400h + 20917 ;int 21h + 20918 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 20919 00001F57 E860E6 call int_21h_indirect + 20920 00001F5A F6C280 test dl,80h + 20921 ;test dl,devid_ISDEV + 20922 ;;retnz ; If device, no error message + 20923 ;jnz short tf4 + 20924 00001F5D 7503 jnz short typelp_ret + 20925 00001F5F E9980A jmp error_output + 20926 typelp_ret: + 20927 00001F62 C3 retn + 20928 + 20929 ; --------------------------------------------------------------------------- + 20930 + 20931 ; VOLUME command displays the volume ID on the specified drive + 20932 + 20933 ; 20/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20934 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20935 ; 10/06/2023 + 20936 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 20937 VOLUME: + 20938 ; MSDOS 6.0 + 20939 00001F63 BE8100 mov si,81h + 20940 00001F66 BF[7696] mov di,PARSE_VOL + 20941 ;AN000; Get address of PARSE_VOL + 20942 00001F69 31C9 xor cx,cx ;AN000; clear cx,dx + 20943 00001F6B 31D2 xor dx,dx ;AN000; + 20944 00001F6D E8EB05 call Parse_With_Msg ;AC018; call parser + 20945 + 20946 ;cmp ax,-1 ; 0FFFFh + 20947 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 20948 ;je short OkVolArg ;AC000; Yes, display default volume ID + 20949 ;;cmp ax,RESULT_NO_ERROR + 20950 ;;cmp ax,0 ;AC000; did we have an error? + 20951 ;or ax,ax ; 0? + 20952 ;jnz short badvolarg ;AC000; Yes, fail. + 20953 ; 10/06/2023 + 20954 00001F70 40 inc ax ; cmp ax,-1 + 20955 00001F71 7447 jz short OkVolArg ; 0FFFFh -> 0 + 20956 00001F73 48 dec ax ; cmp ax,0 + 20957 00001F74 750A jnz short badvolarg ; 1 -> 0 + 20958 ; ax = 0 + 20959 + 20960 ; We have parsed off the drive. See if there are any more chars left + 20961 + 20962 00001F76 BF[7696] mov di,PARSE_VOL + 20963 ;AC000; get address of parse_vol + 20964 00001F79 31D2 xor dx,dx ;AC000; + 20965 00001F7B E8C705 call parse_check_eol ;AC000; call parser + 20966 00001F7E 743A jz short OkVolArg ;AC000; yes, end of road + 20967 + 20968 ; The line was not interpretable. Report an error. 20969 - 20970 ; --------------------------------------------------------------------------- - 20971 - 20972 ;*** DisAppend - disable APPEND - 20973 ; - 20974 ; ENTRY nothing - 20975 ; - 20976 ; EXIT nothing - 20977 ; - 20978 ; USED AX,BX - 20979 ; - 20980 ; EFFECTS - 20981 ; - 20982 ; APPEND is disabled. If it was active, it will be re-enabled - 20983 ; after the command finishes, by the HeadFix routine. + 20970 badvolarg: + 20971 00001F80 E9A30D jmp cerror + 20972 + 20973 ; --------------------------------------------------------------------------- + 20974 + 20975 ;*** DisAppend - disable APPEND + 20976 ; + 20977 ; ENTRY nothing + 20978 ; + 20979 ; EXIT nothing + 20980 ; + 20981 ; USED AX,BX + 20982 ; + 20983 ; EFFECTS 20984 ; - 20985 ; NOTE - 20986 ; - 20987 ; This routine must not be called more than once during a single - 20988 ; command cycle. The second call would permanently disable APPEND. - 20989 - 20990 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 20991 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1CDFh - 20992 - 20993 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 20994 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2289h - 20995 - 20996 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 20997 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2069h + 20985 ; APPEND is disabled. If it was active, it will be re-enabled + 20986 ; after the command finishes, by the HeadFix routine. + 20987 ; + 20988 ; NOTE + 20989 ; + 20990 ; This routine must not be called more than once during a single + 20991 ; command cycle. The second call would permanently disable APPEND. + 20992 + 20993 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 20994 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1CDFh + 20995 + 20996 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 20997 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2289h 20998 - 20999 ; MSDOS 6.0 - 21000 DisAppend: - 21001 00001F83 1E push ds ; save DS - 21002 00001F84 06 push es ; save ES - 21003 00001F85 57 push di - 21004 - 21005 ;mov ax,APPENDINSTALL ; AX = Append Installed Check code - 21006 00001F86 B800B7 mov ax,0B700h - 21007 ;int 2Fh ; talk to APPEND via multiplex - 21008 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21009 00001F89 E854E6 call int_2Fh_indirect - 21010 00001F8C 08C0 or al,al - 21011 00001F8E 7426 jz short daRet ; APPEND not installed, return - 21012 - 21013 ;mov ax,APPENDDOS ; AX = Get Append Version code - 21014 00001F90 B802B7 mov ax,0B702h - 21015 ;int 2Fh ; talk to APPEND via multiplex - 21016 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21017 00001F93 E84AE6 call int_2Fh_indirect - 21018 00001F96 83F8FF cmp ax,0FFFFh - 21019 00001F99 751B jne short daRet ; it's not a local version, return - 21020 - 21021 ;mov ax,APPENDGETSTATE ; AX = Get Function State code - 21022 00001F9B B806B7 mov ax,0B706h - 21023 ;int 2Fh ; talk to APPEND via multiplex - 21024 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21025 00001F9E E83FE6 call int_2Fh_indirect - 21026 - 21027 00001FA1 8E1E[F59B] mov ds,[RESSEG] ; DS = resident seg addr - 21028 - 21029 00001FA5 891E[BE02] mov [Append_State],bx ; Append_State = saved APPEND state - 21030 00001FA9 C606[C002]FF mov byte [Append_Flag],-1 ; Append_Flag = true, restore state + 20999 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21000 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2069h + 21001 + 21002 ; MSDOS 6.0 + 21003 DisAppend: + 21004 00001F83 1E push ds ; save DS + 21005 00001F84 06 push es ; save ES + 21006 00001F85 57 push di + 21007 + 21008 ;mov ax,APPENDINSTALL ; AX = Append Installed Check code + 21009 00001F86 B800B7 mov ax,0B700h + 21010 ;int 2Fh ; talk to APPEND via multiplex + 21011 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21012 00001F89 E854E6 call int_2Fh_indirect + 21013 00001F8C 08C0 or al,al + 21014 00001F8E 7426 jz short daRet ; APPEND not installed, return + 21015 + 21016 ;mov ax,APPENDDOS ; AX = Get Append Version code + 21017 00001F90 B802B7 mov ax,0B702h + 21018 ;int 2Fh ; talk to APPEND via multiplex + 21019 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21020 00001F93 E84AE6 call int_2Fh_indirect + 21021 00001F96 83F8FF cmp ax,0FFFFh + 21022 00001F99 751B jne short daRet ; it's not a local version, return + 21023 + 21024 ;mov ax,APPENDGETSTATE ; AX = Get Function State code + 21025 00001F9B B806B7 mov ax,0B706h + 21026 ;int 2Fh ; talk to APPEND via multiplex + 21027 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21028 00001F9E E83FE6 call int_2Fh_indirect + 21029 + 21030 00001FA1 8E1E[F59B] mov ds,[RESSEG] ; DS = resident seg addr 21031 - 21032 00001FAE 31DB xor bx,bx ; BX = APPEND state = off - 21033 ;mov ax,APPENDSETSTATE ; AX = Set Append State code - 21034 00001FB0 B807B7 mov ax,0B707h - 21035 ;int 2Fh ; talk to APPEND via multiplex - 21036 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21037 00001FB3 E82AE6 call int_2Fh_indirect - 21038 daRet: - 21039 00001FB6 5F pop di - 21040 00001FB7 07 pop es ; restore ES - 21041 00001FB8 1F pop ds ; restore DS - 21042 - 21043 00001FB9 C3 retn - 21044 - 21045 ; --------------------------------------------------------------------------- - 21046 - 21047 ; Find the Volume ID on the disk. - 21048 - 21049 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21050 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21051 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 21052 - 21053 ; MSDOS 6.0 - 21054 OkVolArg: - 21055 00001FBA E8C6FF call DisAppend ; disable APPEND - 21056 00001FBD E8B909 call CRLF2 - 21057 ;mov al,blank - 21058 00001FC0 B020 mov al,' ' ; 20h ;AN051; Print out a blank - 21059 00001FC2 E8E901 call PRINT_CHAR ;AN051; before volume message - 21060 00001FC5 1E push ds - 21061 00001FC6 07 pop es - 21062 - 21063 ; Volume IDs are only findable via extended FCBs or find_first with attributes - 21064 ; of volume_id ONLY. + 21032 00001FA5 891E[BE02] mov [Append_State],bx ; Append_State = saved APPEND state + 21033 00001FA9 C606[C002]FF mov byte [Append_Flag],-1 ; Append_Flag = true, restore state + 21034 + 21035 00001FAE 31DB xor bx,bx ; BX = APPEND state = off + 21036 ;mov ax,APPENDSETSTATE ; AX = Set Append State code + 21037 00001FB0 B807B7 mov ax,0B707h + 21038 ;int 2Fh ; talk to APPEND via multiplex + 21039 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21040 00001FB3 E82AE6 call int_2Fh_indirect + 21041 daRet: + 21042 00001FB6 5F pop di + 21043 00001FB7 07 pop es ; restore ES + 21044 00001FB8 1F pop ds ; restore DS + 21045 + 21046 00001FB9 C3 retn + 21047 + 21048 ; --------------------------------------------------------------------------- + 21049 + 21050 ; Find the Volume ID on the disk. + 21051 + 21052 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21053 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21054 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21055 + 21056 ; MSDOS 6.0 + 21057 OkVolArg: + 21058 00001FBA E8C6FF call DisAppend ; disable APPEND + 21059 00001FBD E8B909 call CRLF2 + 21060 ;mov al,blank + 21061 00001FC0 B020 mov al,' ' ; 20h ;AN051; Print out a blank + 21062 00001FC2 E8E901 call PRINT_CHAR ;AN051; before volume message + 21063 00001FC5 1E push ds + 21064 00001FC6 07 pop es 21065 - 21066 00001FC7 BF5500 mov di,FCB-7 ; 55h ; Point to extended FCB beginning - 21067 00001FCA B0FF mov al,-1 ; 0FFh ; Tag to indicate Extention - 21068 00001FCC AA stosb - 21069 00001FCD 31C0 xor ax,ax ; Zero padding to volume label - 21070 00001FCF AB stosw - 21071 00001FD0 AB stosw - 21072 00001FD1 AA stosb - 21073 00001FD2 B008 mov al,ATTR_VOLUME_ID ; 8 ; Look for volume label - 21074 00001FD4 AA stosb - 21075 00001FD5 47 inc di ; Skip drive byte; it is already set - 21076 00001FD6 B90B00 mov cx,11 ; fill in remainder of file - 21077 00001FD9 B03F mov al,'?' - 21078 00001FDB F3AA rep stosb - 21079 - 21080 ; Set up transfer address (destination of search first information) - 21081 - 21082 00001FDD BA[399D] mov dx,DIRBUF - 21083 ;mov ah,Set_DMA - 21084 00001FE0 B41A mov ah,1Ah - 21085 ;int 21h - 21086 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21087 00001FE2 E8D5E5 call int_21h_indirect - 21088 - 21089 ; Do the search - 21090 - 21091 00001FE5 BA5500 mov dx,FCB-7 ; 55h - 21092 ;mov ah,Dir_Search_First - 21093 00001FE8 B411 mov ah,11h - 21094 ;int 21h - 21095 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21096 00001FEA E8CDE5 call int_21h_indirect - 21097 - 21098 - 21099 ;******************************** - 21100 ; Print volume ID info + 21066 ; Volume IDs are only findable via extended FCBs or find_first with attributes + 21067 ; of volume_id ONLY. + 21068 + 21069 00001FC7 BF5500 mov di,FCB-7 ; 55h ; Point to extended FCB beginning + 21070 00001FCA B0FF mov al,-1 ; 0FFh ; Tag to indicate Extention + 21071 00001FCC AA stosb + 21072 00001FCD 31C0 xor ax,ax ; Zero padding to volume label + 21073 00001FCF AB stosw + 21074 00001FD0 AB stosw + 21075 00001FD1 AA stosb + 21076 00001FD2 B008 mov al,ATTR_VOLUME_ID ; 8 ; Look for volume label + 21077 00001FD4 AA stosb + 21078 00001FD5 47 inc di ; Skip drive byte; it is already set + 21079 00001FD6 B90B00 mov cx,11 ; fill in remainder of file + 21080 00001FD9 B03F mov al,'?' + 21081 00001FDB F3AA rep stosb + 21082 + 21083 ; Set up transfer address (destination of search first information) + 21084 + 21085 00001FDD BA[399D] mov dx,DIRBUF + 21086 ;mov ah,Set_DMA + 21087 00001FE0 B41A mov ah,1Ah + 21088 ;int 21h + 21089 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21090 00001FE2 E8D5E5 call int_21h_indirect + 21091 + 21092 ; Do the search + 21093 + 21094 00001FE5 BA5500 mov dx,FCB-7 ; 55h + 21095 ;mov ah,Dir_Search_First + 21096 00001FE8 B411 mov ah,11h + 21097 ;int 21h + 21098 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21099 00001FEA E8CDE5 call int_21h_indirect + 21100 21101 - 21102 00001FED 50 push ax ;AC000; AX return from SEARCH_FIRST for VOL ID - 21103 00001FEE A05C00 mov al,[FCB] ; [5Ch] ;AC000; get drive letter - 21104 00001FF1 0440 add al,'@' ; add al,40h - 21105 00001FF3 3C40 cmp al,'@' - 21106 00001FF5 7505 jne short drvok - 21107 00001FF7 A0[079C] mov al,[CURDRV] - 21108 ;add al,capital_A - 21109 00001FFA 0441 add al,'A' - 21110 drvok: - 21111 00001FFC A2[B39D] mov [vol_drv],al ;AC000; get drive letter into argument - 21112 00001FFF 58 pop ax ;AC000; get return code back - 21113 00002000 08C0 or al,al ;AC000; volume label found? - 21114 00002002 7405 jz short Get_vol_name ;AC000; volume label exists - go get it - 21115 00002004 BA[F790] mov dx,VolMes_Ptr_2 ;AC000; set up no volume message - 21116 00002007 EB13 jmp short print_serial ;AC000; go print it - 21117 - 21118 Get_vol_name: - 21119 00002009 BF[6A9C] mov di,CHARBUF - 21120 0000200C 89FA mov dx,di - 21121 0000200E BE[419D] mov si,DIRBUF+8 ;AN000; 3/3/KK - 21122 00002011 B90B00 mov cx,11 ;AN000; 3/3/KK - 21123 00002014 F3A4 rep movsb ;AN000; 3/3/KK - 21124 - 21125 00002016 30C0 xor al,al ;AC000; store a zero to terminate the string - 21126 00002018 AA stosb - 21127 00002019 BA[0591] mov dx,VolMes_Ptr ;AC000; set up message - 21128 - 21129 print_serial: - 21130 - 21131 ; Attempt to get the volume serial number from the disk. If an error - 21132 ; occurs, do not print volume serial number. + 21102 ;******************************** + 21103 ; Print volume ID info + 21104 + 21105 00001FED 50 push ax ;AC000; AX return from SEARCH_FIRST for VOL ID + 21106 00001FEE A05C00 mov al,[FCB] ; [5Ch] ;AC000; get drive letter + 21107 00001FF1 0440 add al,'@' ; add al,40h + 21108 00001FF3 3C40 cmp al,'@' + 21109 00001FF5 7505 jne short drvok + 21110 00001FF7 A0[079C] mov al,[CURDRV] + 21111 ;add al,capital_A + 21112 00001FFA 0441 add al,'A' + 21113 drvok: + 21114 00001FFC A2[B39D] mov [vol_drv],al ;AC000; get drive letter into argument + 21115 00001FFF 58 pop ax ;AC000; get return code back + 21116 00002000 08C0 or al,al ;AC000; volume label found? + 21117 00002002 7405 jz short Get_vol_name ;AC000; volume label exists - go get it + 21118 00002004 BA[F790] mov dx,VolMes_Ptr_2 ;AC000; set up no volume message + 21119 00002007 EB13 jmp short print_serial ;AC000; go print it + 21120 + 21121 Get_vol_name: + 21122 00002009 BF[6A9C] mov di,CHARBUF + 21123 0000200C 89FA mov dx,di + 21124 0000200E BE[419D] mov si,DIRBUF+8 ;AN000; 3/3/KK + 21125 00002011 B90B00 mov cx,11 ;AN000; 3/3/KK + 21126 00002014 F3A4 rep movsb ;AN000; 3/3/KK + 21127 + 21128 00002016 30C0 xor al,al ;AC000; store a zero to terminate the string + 21129 00002018 AA stosb + 21130 00002019 BA[0591] mov dx,VolMes_Ptr ;AC000; set up message + 21131 + 21132 print_serial: 21133 - 21134 0000201C 52 push dx ;AN000; save message offset - 21135 ;mov ax,(GetSetMediaID SHL 8) - 21136 0000201D B80069 mov ax,6900h ;AC036; Get the volume serial info - 21137 00002020 8A1E5C00 mov bl,[FCB] ; [5Ch] ;AN000; get drive number from FCB - 21138 00002024 BA[199F] mov dx,vol_ioctl_buf ;AN000; target buffer - 21139 ;int 21h ;AN000; do the call - 21140 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21141 00002027 E890E5 call int_21h_indirect - 21142 ; DOS - 4.0 internal - GET/SET DISK SERIAL NUMBER - 21143 ; AL = 00h get serial number / 01h set serial number - 21144 ; BL = drive (0=default, 1=A, 2=B, etc) - 21145 ; DS:DX -> disk info - 21146 0000202A 5A pop dx ;AN000; get message offset back - 21147 0000202B 720B jc short printvol_end ;AN000; if error, just go print label - 21148 0000202D E8F833 call std_printf ;AC000; go print volume message - 21149 ;mov al,blank - 21150 00002030 B020 mov al,' ' ; 20h ;AN051; Print out a blank - 21151 00002032 E87901 call PRINT_CHAR ;AN051; before volume message - 21152 00002035 BA[1E91] mov dx,VolSerMes_Ptr ;AN000; get serial number message - 21153 printvol_end: - 21154 00002038 E9ED33 jmp std_printf ;AC000; go print and exit - 21155 - 21156 ; --------------------------------------------------------------------------- - 21157 - 21158 ;**************************************************************** - 21159 ;* - 21160 ;* ROUTINE: Set_ext_error_msg - 21161 ;* - 21162 ;* FUNCTION: Sets up extended error message for printing - 21163 ;* - 21164 ;* INPUT: return from INT 21 - 21165 ;* - 21166 ;* OUTPUT: extended error message set up in extended error - 21167 ;* buffer. + 21134 ; Attempt to get the volume serial number from the disk. If an error + 21135 ; occurs, do not print volume serial number. + 21136 + 21137 0000201C 52 push dx ;AN000; save message offset + 21138 ;mov ax,(GetSetMediaID SHL 8) + 21139 0000201D B80069 mov ax,6900h ;AC036; Get the volume serial info + 21140 00002020 8A1E5C00 mov bl,[FCB] ; [5Ch] ;AN000; get drive number from FCB + 21141 00002024 BA[199F] mov dx,vol_ioctl_buf ;AN000; target buffer + 21142 ;int 21h ;AN000; do the call + 21143 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21144 00002027 E890E5 call int_21h_indirect + 21145 ; DOS - 4.0 internal - GET/SET DISK SERIAL NUMBER + 21146 ; AL = 00h get serial number / 01h set serial number + 21147 ; BL = drive (0=default, 1=A, 2=B, etc) + 21148 ; DS:DX -> disk info + 21149 0000202A 5A pop dx ;AN000; get message offset back + 21150 0000202B 720B jc short printvol_end ;AN000; if error, just go print label + 21151 0000202D E8F833 call std_printf ;AC000; go print volume message + 21152 ;mov al,blank + 21153 00002030 B020 mov al,' ' ; 20h ;AN051; Print out a blank + 21154 00002032 E87901 call PRINT_CHAR ;AN051; before volume message + 21155 00002035 BA[1E91] mov dx,VolSerMes_Ptr ;AN000; get serial number message + 21156 printvol_end: + 21157 00002038 E9ED33 jmp std_printf ;AC000; go print and exit + 21158 + 21159 ; --------------------------------------------------------------------------- + 21160 + 21161 ;**************************************************************** + 21162 ;* + 21163 ;* ROUTINE: Set_ext_error_msg + 21164 ;* + 21165 ;* FUNCTION: Sets up extended error message for printing + 21166 ;* + 21167 ;* INPUT: return from INT 21 21168 ;* - 21169 ;**************************************************************** - 21170 - 21171 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21172 - 21173 ; MSDOS 6.0 - 21174 Set_Ext_Error_Msg: ;AN000; - 21175 0000203B E80D00 call get_ext_error_number ;AC022; get the extended error - 21176 0000203E C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 21177 ;mov byte [msg_disp_class],1 ;AN000; set up extended error msg class - 21178 00002043 BA[D78F] mov dx,extend_buf_ptr ;AC000; get extended message pointer - 21179 00002046 A3[D78F] mov [extend_buf_ptr],ax ;AN000; get message number in control block - 21180 00002049 F9 stc ;AN000; make sure carry is set - 21181 0000204A C3 retn ;AN000; return - 21182 - 21183 ; --------------------------------------------------------------------------- - 21184 - 21185 ;**************************************************************** - 21186 ;* - 21187 ;* ROUTINE: Get_ext_error_number - 21188 ;* - 21189 ;* FUNCTION: Does get extended error function call - 21190 ;* - 21191 ;* INPUT: return from INT 21 - 21192 ;* - 21193 ;* OUTPUT: AX - extended error number - 21194 ;* - 21195 ;**************************************************************** - 21196 - 21197 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21198 - 21199 ; MSDOS 6.0 - 21200 get_ext_error_number: ;AN022; + 21169 ;* OUTPUT: extended error message set up in extended error + 21170 ;* buffer. + 21171 ;* + 21172 ;**************************************************************** + 21173 + 21174 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21175 + 21176 ; MSDOS 6.0 + 21177 Set_Ext_Error_Msg: ;AN000; + 21178 0000203B E80D00 call get_ext_error_number ;AC022; get the extended error + 21179 0000203E C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 21180 ;mov byte [msg_disp_class],1 ;AN000; set up extended error msg class + 21181 00002043 BA[D78F] mov dx,extend_buf_ptr ;AC000; get extended message pointer + 21182 00002046 A3[D78F] mov [extend_buf_ptr],ax ;AN000; get message number in control block + 21183 00002049 F9 stc ;AN000; make sure carry is set + 21184 0000204A C3 retn ;AN000; return + 21185 + 21186 ; --------------------------------------------------------------------------- + 21187 + 21188 ;**************************************************************** + 21189 ;* + 21190 ;* ROUTINE: Get_ext_error_number + 21191 ;* + 21192 ;* FUNCTION: Does get extended error function call + 21193 ;* + 21194 ;* INPUT: return from INT 21 + 21195 ;* + 21196 ;* OUTPUT: AX - extended error number + 21197 ;* + 21198 ;**************************************************************** + 21199 + 21200 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 21201 - 21202 ;SaveReg - 21203 ;AN022; save registers - 21204 0000204B 53 push bx - 21205 0000204C 51 push cx - 21206 0000204D 52 push dx - 21207 0000204E 56 push si - 21208 0000204F 57 push di - 21209 00002050 55 push bp - 21210 00002051 06 push es - 21211 00002052 1E push ds - 21212 ;mov ah,GetExtendedError ;AN022; get extended error - 21213 00002053 B459 mov ah,59h - 21214 00002055 31DB xor bx,bx ;AN022; clear BX - 21215 00002057 CD21 int 21h ;AN022; - 21216 ; DOS - 3+ - GET EXTENDED ERROR CODE - 21217 ; BX = version code (0000h for DOS 3.x) - 21218 - 21219 ;RestoreReg - 21220 ;AN022; restore registers - 21221 00002059 1F pop ds - 21222 0000205A 07 pop es - 21223 0000205B 5D pop bp - 21224 0000205C 5F pop di - 21225 0000205D 5E pop si - 21226 0000205E 5A pop dx - 21227 0000205F 59 pop cx - 21228 00002060 5B pop bx - 21229 - 21230 00002061 C3 retn ;AN022; return - 21231 - 21232 ;============================================================================ - 21233 ; TCMD2A.ASM, MSDOS 6.0, 1991 - 21234 ;============================================================================ - 21235 ; 08/10/2018 - Retro DOS v3.0 - 21236 - 21237 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1379h - 21238 - 21239 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) - 21240 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 1DB7h + 21202 ; MSDOS 6.0 + 21203 get_ext_error_number: ;AN022; + 21204 + 21205 ;SaveReg + 21206 ;AN022; save registers + 21207 0000204B 53 push bx + 21208 0000204C 51 push cx + 21209 0000204D 52 push dx + 21210 0000204E 56 push si + 21211 0000204F 57 push di + 21212 00002050 55 push bp + 21213 00002051 06 push es + 21214 00002052 1E push ds + 21215 ;mov ah,GetExtendedError ;AN022; get extended error + 21216 00002053 B459 mov ah,59h + 21217 00002055 31DB xor bx,bx ;AN022; clear BX + 21218 00002057 CD21 int 21h ;AN022; + 21219 ; DOS - 3+ - GET EXTENDED ERROR CODE + 21220 ; BX = version code (0000h for DOS 3.x) + 21221 + 21222 ;RestoreReg + 21223 ;AN022; restore registers + 21224 00002059 1F pop ds + 21225 0000205A 07 pop es + 21226 0000205B 5D pop bp + 21227 0000205C 5F pop di + 21228 0000205D 5E pop si + 21229 0000205E 5A pop dx + 21230 0000205F 59 pop cx + 21231 00002060 5B pop bx + 21232 + 21233 00002061 C3 retn ;AN022; return + 21234 + 21235 ;============================================================================ + 21236 ; TCMD2A.ASM, MSDOS 6.0, 1991 + 21237 ;============================================================================ + 21238 ; 08/10/2018 - Retro DOS v3.0 + 21239 + 21240 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1379h 21241 - 21242 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21243 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 2361h + 21242 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) + 21243 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 1DB7h 21244 - 21245 ; --------------------------------------------------------------------------- - 21246 - 21247 ; MSDOS 6.0 - 21248 ;*** Version - display DOS version - 21249 ; - 21250 ; SYNTAX ver [/debug] - 21251 ; - 21252 ; /debug - display additional DOS configuration info - 21253 ; - 21254 ; ENTRY command-line tail is in PSP - 21255 ; - 21256 ; EXIT if successful, nothing - 21257 ; if parse fails, - 21258 ; parse error message is set up (for Std_EPrintf) - 21259 ; AX = system parser error code - 21260 ; DX = ptr to message block - 21261 ; we jump to CError - 21262 ; - 21263 ; EFFECTS - 21264 ; If parse fails, a parse error message is displayed. - 21265 ; Otherwise, version message is displayed. - 21266 ; If /debug is specified, additional DOS info is displayed. - 21267 - 21268 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21269 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21270 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM - 21271 VERSION: - 21272 ;assume ds:TRANGROUP,es:TRANGROUP - 21273 - 21274 ; Parse command line for /debug switch. - 21275 - 21276 00002062 BE8100 mov si,81h ; DS:SI = ptr to command tail - 21277 00002065 BF[4497] mov di,PARSE_VER ; ES:DI = ptr to parse block - 21278 00002068 31C9 xor cx,cx ; CX = # positional param's found - 21279 0000206A E8EE04 call Parse_With_Msg - 21280 - 21281 0000206D B301 mov bl,1 ; BL = flag = /debug present - 21282 ;cmp ax,RESULT_NO_ERROR - 21283 ;cmp ax,0 - 21284 ;je short verPrintVer ; something parsed - must be /debug - 21285 0000206F 09C0 or ax,ax - 21286 00002071 740A jz short verPrintVer - 21287 00002073 FECB dec bl ; BL = flag = no /debug present - 21288 ;cmp ax,END_OF_LINE ; -1 - 21289 00002075 83F8FF cmp ax,-1 ; 0FFFFh - 21290 - 21291 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM - 21292 %if 0 - 21293 je short verPrintVer ; reached end of line - ok - 21294 %else - 21295 00002078 7414 je short not_truever_sw - 21296 %endif - 21297 - 21298 ; The parse failed. Error message has been set up. - 21299 - 21300 0000207A E9A90C jmp cerror - 21301 - 21302 verPrintVer: - 21303 - 21304 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM - 21305 %if 1 - 21306 check_t_switch: - 21307 0000207D 813E[EDA5][6497] cmp word [PARSE1_SYN],SLASH_T_SYN ; "/T" ; /t switch - 21308 00002083 7509 jne short not_truever_sw - 21309 00002085 BA[8797] mov dx,RD5CMD_VER_MSG - 21310 00002088 B409 mov ah,STD_CON_STRING_OUTPUT ; 9 ; print the message - 21311 0000208A CD21 int 21h - 21312 0000208C EB47 jmp short verDone - 21313 not_truever_sw: - 21314 %endif - 21315 0000208E 53 push bx ; save /debug flag - 21316 0000208F E8E708 call CRLF2 - 21317 00002092 E84300 call PRINT_VERSION - 21318 00002095 E8E108 call CRLF2 - 21319 00002098 5B pop bx ; BL = /debug flag - 21320 00002099 08DB or bl,bl - 21321 0000209B 7438 jz short verDone ; /debug is false - we're done - 21322 - 21323 ;* For /debug, display DOS internal revision and DOS location - 21324 ; (low memory, HMA, or ROM). + 21245 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21246 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 2361h + 21247 + 21248 ; --------------------------------------------------------------------------- + 21249 + 21250 ; MSDOS 6.0 + 21251 ;*** Version - display DOS version + 21252 ; + 21253 ; SYNTAX ver [/debug] + 21254 ; + 21255 ; /debug - display additional DOS configuration info + 21256 ; + 21257 ; ENTRY command-line tail is in PSP + 21258 ; + 21259 ; EXIT if successful, nothing + 21260 ; if parse fails, + 21261 ; parse error message is set up (for Std_EPrintf) + 21262 ; AX = system parser error code + 21263 ; DX = ptr to message block + 21264 ; we jump to CError + 21265 ; + 21266 ; EFFECTS + 21267 ; If parse fails, a parse error message is displayed. + 21268 ; Otherwise, version message is displayed. + 21269 ; If /debug is specified, additional DOS info is displayed. + 21270 + 21271 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21272 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21273 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM + 21274 VERSION: + 21275 ;assume ds:TRANGROUP,es:TRANGROUP + 21276 + 21277 ; Parse command line for /debug switch. + 21278 + 21279 00002062 BE8100 mov si,81h ; DS:SI = ptr to command tail + 21280 00002065 BF[4497] mov di,PARSE_VER ; ES:DI = ptr to parse block + 21281 00002068 31C9 xor cx,cx ; CX = # positional param's found + 21282 0000206A E8EE04 call Parse_With_Msg + 21283 + 21284 0000206D B301 mov bl,1 ; BL = flag = /debug present + 21285 ;cmp ax,RESULT_NO_ERROR + 21286 ;cmp ax,0 + 21287 ;je short verPrintVer ; something parsed - must be /debug + 21288 0000206F 09C0 or ax,ax + 21289 00002071 740A jz short verPrintVer + 21290 00002073 FECB dec bl ; BL = flag = no /debug present + 21291 ;cmp ax,END_OF_LINE ; -1 + 21292 00002075 83F8FF cmp ax,-1 ; 0FFFFh + 21293 + 21294 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM + 21295 %if 0 + 21296 je short verPrintVer ; reached end of line - ok + 21297 %else + 21298 00002078 7414 je short not_truever_sw + 21299 %endif + 21300 + 21301 ; The parse failed. Error message has been set up. + 21302 + 21303 0000207A E9A90C jmp cerror + 21304 + 21305 verPrintVer: + 21306 + 21307 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM + 21308 %if 1 + 21309 check_t_switch: + 21310 0000207D 813E[EDA5][6497] cmp word [PARSE1_SYN],SLASH_T_SYN ; "/T" ; /t switch + 21311 00002083 7509 jne short not_truever_sw + 21312 00002085 BA[8797] mov dx,RD5CMD_VER_MSG + 21313 00002088 B409 mov ah,STD_CON_STRING_OUTPUT ; 9 ; print the message + 21314 0000208A CD21 int 21h + 21315 0000208C EB47 jmp short verDone + 21316 not_truever_sw: + 21317 %endif + 21318 0000208E 53 push bx ; save /debug flag + 21319 0000208F E8E708 call CRLF2 + 21320 00002092 E84300 call PRINT_VERSION + 21321 00002095 E8E108 call CRLF2 + 21322 00002098 5B pop bx ; BL = /debug flag + 21323 00002099 08DB or bl,bl + 21324 0000209B 7438 jz short verDone ; /debug is false - we're done 21325 - 21326 ; Bugbug: use symbols for bitmasks below. - 21327 - 21328 ;mov ax,(Set_CTRL_C_Trapping shl 8) + 6 ; M013 - 21329 0000209D B80633 mov ax,3306h - 21330 000020A0 CD21 int 21h - 21331 ; DOS - 5+ Get TRUE Version Number - 21332 ; (BL major, BH minor, DL revision, DH flags) - 21333 000020A2 88D0 mov al,dl ;revision number in dl; M013 - 21334 000020A4 88F7 mov bh,dh ;flags in dh now; M013 - 21335 ;M032 and al,7 ; AL = DOS internal revision - 21336 000020A6 3C19 cmp al,'Z'-'A' ; 25 ;M032 ; revision in A-to-Z range? - 21337 ;jbe short @f ;M032 ; A-to-Z revision ok - 21338 000020A8 7602 jbe short ver1 - 21339 ;mov al,0E9h - 21340 000020AA B0E9 mov al,'*'-'A' ; -23 ;M032 ; beyond Z, just say revision * - 21341 ;@@: - 21342 ver1: - 21343 - 21344 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 21345 %if 0 - 21346 add al,'A' ; 41h ; AL = DOS internal rev letter - 21347 %else - 21348 ; PCDOS 7.1 COMMAND.COM - 21349 000020AC 0430 add al,'0' ; 30h - 21350 %endif - 21351 - 21352 000020AE A2[B19D] mov [One_Char_Val],al - 21353 000020B1 BA[A992] mov dx,dosrev_ptr ; MSG_1090 - 21354 000020B4 E87133 call std_printf ; print DOS internal revision - 21355 - 21356 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 21357 %if 1 - 21358 000020B7 08D2 or dl,dl - 21359 000020B9 741A jz short verDone ; Revision 0 - 21360 %endif - 21361 - 21362 000020BB B104 mov cl,4 - 21363 000020BD D2EF shr bh,cl ; CY = DOS in ROM - 21364 000020BF 7209 jc short verRom - 21365 000020C1 D0EF shr bh,1 ; CY = DOS in HMA - 21366 000020C3 720A jc short verHma - 21367 - 21368 ; DOS isn't in ROM or HMA, so it must be in lower memory. - 21369 - 21370 ;mov dx,offset TRANGROUP:DosLow_Ptr - 21371 000020C5 BA[BD92] mov dx,DosLow_Ptr ; MSG_1093 - 21372 000020C8 EB08 jmp short verPrintLoc - 21373 verRom: - 21374 ;mov dx,offset TRANGROUP:DosRom_Ptr - 21375 000020CA BA[B792] mov dx,DosRom_Ptr ; MSG_1091 - 21376 000020CD EB03 jmp short verPrintLoc - 21377 verHma: - 21378 ;mov dx,offset TRANGROUP:DosHma_Ptr - 21379 000020CF BA[BA92] mov dx,DosHma_Ptr ; MSG_1092 - 21380 verPrintLoc: - 21381 000020D2 E85333 call std_printf - 21382 verDone: - 21383 000020D5 E9A108 jmp CRLF2 - 21384 - 21385 ; 21/02/2023 - 21386 ; ; MSDOS 3.3 - 21387 ;VERSION: - 21388 ; call CRLF2 - 21389 ; call PRINT_VERSION - 21390 ; jmp CRLF2 - 21391 - 21392 ; =============== S U B R O U T I N E ======================================= - 21393 - 21394 ; 21/02/2023 - Retro DOS v4.0 - 21395 PRINT_VERSION: - 21396 ;mov ah,GET_VERSION ; 30h - 21397 000020D8 B430 mov ah,30h - 21398 000020DA CD21 int 21h ; DOS - GET DOS VERSION - 21399 ; Return: AL = major version number (00h for DOS 1.x) - 21400 000020DC 50 push ax - 21401 000020DD 30E4 xor ah,ah - 21402 000020DF A3[AD9D] mov [Major_Ver_Num],ax - 21403 000020E2 58 pop ax - 21404 000020E3 86E0 xchg ah,al - 21405 000020E5 30E4 xor ah,ah - 21406 000020E7 A3[AF9D] mov [Minor_Ver_Num],ax - 21407 000020EA BA[F490] mov dx,VerMes_Ptr ; MSG_1040 - 21408 000020ED E93833 jmp std_printf - 21409 - 21410 ; =============== S U B R O U T I N E ======================================= - 21411 - 21412 ; 21/02/2023 - Retro DOS v4.0 - 21413 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21414 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 21415 - 21416 PRINT_PROMPT: - 21417 - 21418 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 21419 %if 0 - 21420 push ds - 21421 push cs - 21422 pop ds ; Make sure DS is in TRANGROUP - 21423 push es - 21424 call find_prompt ; Look for prompt string - 21425 jc short PP0 ; Can't find one - 21426 cmp byte [es:di],0 - 21427 jnz short PP1 - 21428 PP0: ; Use default prompt - 21429 call PRINT_DRIVE - 21430 mov al,'>' - 21431 ;mov al,SYM - 21432 call PRINT_CHAR - 21433 jmp short PP5 - 21434 ;PP1: - 21435 ; mov al,[es:di] ; Get a char - 21436 ; inc di - 21437 ; or al,al - 21438 ; jz short PP5 ; Nul terminated - 21439 ; ; 21/02/2023 - 21440 ; cmp al,'$' ; 24h - 21441 ; ;cmp al,[DOLLAR] ; Meta character - 21442 ; jz short PP2 ; Nope - 21443 ; call PRINT_CHAR - 21444 ; jmp short PP1 - 21445 PP2: - 21446 mov al,[es:di] - 21447 inc di - 21448 ;mov bx,CLSSTRING+2 ; "[2J" - 21449 mov bx,PROMPT_TABLE-3 - 21450 or al,al - 21451 jz short PP5 - 21452 PP3: - 21453 add bx,3 - 21454 ; 21/02/2023 - 21455 call UPCONV ; MSDOS 5.0 (& 6.0) - 21456 ;call UPCONV_MAPCALL ; MSDOS 3.3 - 21457 cmp al,[bx] - 21458 jz short PP4 - 21459 cmp byte [bx],0 - 21460 jnz short PP3 - 21461 ;jmp short PP1 - 21462 ; 21/02/2023 - 21463 PP1: - 21464 mov al,[es:di] ; Get a char - 21465 inc di - 21466 or al,al - 21467 jz short PP5 ; Nul terminated - 21468 ; 21/02/2023 - 21469 cmp al,'$' ; 24h - 21470 ;cmp al,[DOLLAR] ; Meta character - 21471 jz short PP2 ; Nope - 21472 call PRINT_CHAR - 21473 jmp short PP1 - 21474 PP4: - 21475 push es - 21476 push di - 21477 push cs - 21478 pop es - 21479 call word [bx+1] - 21480 pop di + 21326 ;* For /debug, display DOS internal revision and DOS location + 21327 ; (low memory, HMA, or ROM). + 21328 + 21329 ; Bugbug: use symbols for bitmasks below. + 21330 + 21331 ;mov ax,(Set_CTRL_C_Trapping shl 8) + 6 ; M013 + 21332 0000209D B80633 mov ax,3306h + 21333 000020A0 CD21 int 21h + 21334 ; DOS - 5+ Get TRUE Version Number + 21335 ; (BL major, BH minor, DL revision, DH flags) + 21336 000020A2 88D0 mov al,dl ;revision number in dl; M013 + 21337 000020A4 88F7 mov bh,dh ;flags in dh now; M013 + 21338 ;M032 and al,7 ; AL = DOS internal revision + 21339 000020A6 3C19 cmp al,'Z'-'A' ; 25 ;M032 ; revision in A-to-Z range? + 21340 ;jbe short @f ;M032 ; A-to-Z revision ok + 21341 000020A8 7602 jbe short ver1 + 21342 ;mov al,0E9h + 21343 000020AA B0E9 mov al,'*'-'A' ; -23 ;M032 ; beyond Z, just say revision * + 21344 ;@@: + 21345 ver1: + 21346 + 21347 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 21348 %if 0 + 21349 add al,'A' ; 41h ; AL = DOS internal rev letter + 21350 %else + 21351 ; PCDOS 7.1 COMMAND.COM + 21352 000020AC 0430 add al,'0' ; 30h + 21353 %endif + 21354 + 21355 000020AE A2[B19D] mov [One_Char_Val],al + 21356 000020B1 BA[A992] mov dx,dosrev_ptr ; MSG_1090 + 21357 000020B4 E87133 call std_printf ; print DOS internal revision + 21358 + 21359 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 21360 %if 1 + 21361 000020B7 08D2 or dl,dl + 21362 000020B9 741A jz short verDone ; Revision 0 + 21363 %endif + 21364 + 21365 000020BB B104 mov cl,4 + 21366 000020BD D2EF shr bh,cl ; CY = DOS in ROM + 21367 000020BF 7209 jc short verRom + 21368 000020C1 D0EF shr bh,1 ; CY = DOS in HMA + 21369 000020C3 720A jc short verHma + 21370 + 21371 ; DOS isn't in ROM or HMA, so it must be in lower memory. + 21372 + 21373 ;mov dx,offset TRANGROUP:DosLow_Ptr + 21374 000020C5 BA[BD92] mov dx,DosLow_Ptr ; MSG_1093 + 21375 000020C8 EB08 jmp short verPrintLoc + 21376 verRom: + 21377 ;mov dx,offset TRANGROUP:DosRom_Ptr + 21378 000020CA BA[B792] mov dx,DosRom_Ptr ; MSG_1091 + 21379 000020CD EB03 jmp short verPrintLoc + 21380 verHma: + 21381 ;mov dx,offset TRANGROUP:DosHma_Ptr + 21382 000020CF BA[BA92] mov dx,DosHma_Ptr ; MSG_1092 + 21383 verPrintLoc: + 21384 000020D2 E85333 call std_printf + 21385 verDone: + 21386 000020D5 E9A108 jmp CRLF2 + 21387 + 21388 ; 21/02/2023 + 21389 ; ; MSDOS 3.3 + 21390 ;VERSION: + 21391 ; call CRLF2 + 21392 ; call PRINT_VERSION + 21393 ; jmp CRLF2 + 21394 + 21395 ; =============== S U B R O U T I N E ======================================= + 21396 + 21397 ; 21/02/2023 - Retro DOS v4.0 + 21398 PRINT_VERSION: + 21399 ;mov ah,GET_VERSION ; 30h + 21400 000020D8 B430 mov ah,30h + 21401 000020DA CD21 int 21h ; DOS - GET DOS VERSION + 21402 ; Return: AL = major version number (00h for DOS 1.x) + 21403 000020DC 50 push ax + 21404 000020DD 30E4 xor ah,ah + 21405 000020DF A3[AD9D] mov [Major_Ver_Num],ax + 21406 000020E2 58 pop ax + 21407 000020E3 86E0 xchg ah,al + 21408 000020E5 30E4 xor ah,ah + 21409 000020E7 A3[AF9D] mov [Minor_Ver_Num],ax + 21410 000020EA BA[F490] mov dx,VerMes_Ptr ; MSG_1040 + 21411 000020ED E93833 jmp std_printf + 21412 + 21413 ; =============== S U B R O U T I N E ======================================= + 21414 + 21415 ; 21/02/2023 - Retro DOS v4.0 + 21416 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21417 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21418 + 21419 PRINT_PROMPT: + 21420 + 21421 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 21422 %if 0 + 21423 push ds + 21424 push cs + 21425 pop ds ; Make sure DS is in TRANGROUP + 21426 push es + 21427 call find_prompt ; Look for prompt string + 21428 jc short PP0 ; Can't find one + 21429 cmp byte [es:di],0 + 21430 jnz short PP1 + 21431 PP0: ; Use default prompt + 21432 call PRINT_DRIVE + 21433 mov al,'>' + 21434 ;mov al,SYM + 21435 call PRINT_CHAR + 21436 jmp short PP5 + 21437 ;PP1: + 21438 ; mov al,[es:di] ; Get a char + 21439 ; inc di + 21440 ; or al,al + 21441 ; jz short PP5 ; Nul terminated + 21442 ; ; 21/02/2023 + 21443 ; cmp al,'$' ; 24h + 21444 ; ;cmp al,[DOLLAR] ; Meta character + 21445 ; jz short PP2 ; Nope + 21446 ; call PRINT_CHAR + 21447 ; jmp short PP1 + 21448 PP2: + 21449 mov al,[es:di] + 21450 inc di + 21451 ;mov bx,CLSSTRING+2 ; "[2J" + 21452 mov bx,PROMPT_TABLE-3 + 21453 or al,al + 21454 jz short PP5 + 21455 PP3: + 21456 add bx,3 + 21457 ; 21/02/2023 + 21458 call UPCONV ; MSDOS 5.0 (& 6.0) + 21459 ;call UPCONV_MAPCALL ; MSDOS 3.3 + 21460 cmp al,[bx] + 21461 jz short PP4 + 21462 cmp byte [bx],0 + 21463 jnz short PP3 + 21464 ;jmp short PP1 + 21465 ; 21/02/2023 + 21466 PP1: + 21467 mov al,[es:di] ; Get a char + 21468 inc di + 21469 or al,al + 21470 jz short PP5 ; Nul terminated + 21471 ; 21/02/2023 + 21472 cmp al,'$' ; 24h + 21473 ;cmp al,[DOLLAR] ; Meta character + 21474 jz short PP2 ; Nope + 21475 call PRINT_CHAR + 21476 jmp short PP1 + 21477 PP4: + 21478 push es + 21479 push di + 21480 push cs 21481 pop es - 21482 jmp short PP1 - 21483 PP5: - 21484 pop es ; Restore segments - 21485 pop ds - 21486 retn - 21487 %else - 21488 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 21489 ; PCDOS 7.1 COMMAND.COM - 21490 000020F0 1E push ds - 21491 000020F1 0E push cs - 21492 000020F2 1F pop ds ; Make sure DS is in TRANGROUP - 21493 000020F3 06 push es - 21494 000020F4 9C pushf - 21495 PP0: - 21496 000020F5 B8104A mov ax,4A10h ; SMARTDRV INSTALLATION CHECK (*) - 21497 000020F8 BB0000 mov bx,0 ; (*) - 21498 000020FB CD2F int 2Fh - 21499 000020FD 3DBEBA cmp ax,0BABEh ; 0BABEh if installed - 21500 00002100 7504 jnz short PP1 - 21501 ;cmp cx,0 ; number of dirty cache elements - 21502 00002102 21C9 and cx,cx ; 03/08/2024 - 21503 00002104 7516 jnz short PP3 - 21504 PP1: - 21505 00002106 9D popf - 21506 00002107 E8AA05 call find_prompt ; Look for prompt string - 21507 0000210A 7206 jc short PP2 ; Can't find one - 21508 0000210C 26803D00 cmp byte [es:di],0 - 21509 00002110 752E jnz short PP4 - 21510 PP2: ; Use default prompt - 21511 00002112 1E push ds - 21512 00002113 07 pop es - 21513 00002114 E8AE00 call build_dir_for_prompt - 21514 00002117 E88A00 call PRINT_G - 21515 0000211A EB40 jmp short PP8 - 21516 PP3: - 21517 0000211C B8104A mov ax,4A10h ; SMARTDRV - FLUSH BUFFERS (**) - 21518 0000211F BB0100 mov bx,1 ; (**) - 21519 00002122 CD2F int 2Fh - 21520 00002124 EBCF jmp short PP0 - 21521 PP5: - 21522 00002126 268A05 mov al,[es:di] - 21523 00002129 47 inc di - 21524 ;mov bx,CLSSTRING+2 ; "[2J" - 21525 0000212A BB[0594] mov bx,PROMPT_TABLE-3 - 21526 0000212D 08C0 or al,al - 21527 0000212F 742B jz short PP8 - 21528 PP6: - 21529 00002131 83C303 add bx,3 - 21530 00002134 E85406 call UPCONV - 21531 00002137 3A07 cmp al,[bx] - 21532 00002139 7416 je short PP7 - 21533 0000213B 803F00 cmp byte [bx],0 - 21534 0000213E 75F1 jnz short PP6 - 21535 ;jmp short PP4 - 21536 PP4: - 21537 00002140 268A05 mov al,[es:di] ; Get a char - 21538 00002143 47 inc di - 21539 00002144 08C0 or al,al - 21540 00002146 74DE jz short PP5 ; Nul terminated - 21541 00002148 3C24 cmp al,'$' ; 24h ; Meta character - 21542 0000214A 74DA je short PP5 ; Nope - 21543 0000214C E85F00 call PRINT_CHAR - 21544 0000214F EBEF jmp short PP4 - 21545 PP7: - 21546 00002151 06 push es - 21547 00002152 57 push di - 21548 00002153 0E push cs - 21549 00002154 07 pop es - 21550 00002155 FF5701 call word [bx+1] - 21551 00002158 5F pop di - 21552 00002159 07 pop es - 21553 0000215A EBE4 jmp short PP4 - 21554 PP8: - 21555 0000215C 07 pop es ; Restore segments - 21556 0000215D 1F pop ds - 21557 0000215E C3 retn - 21558 - 21559 %endif - 21560 - 21561 ; --------------------------------------------------------------------------- - 21562 - 21563 PRINT_BACK: - 21564 ; 21/02/2023 - 21565 0000215F BA[F791] mov dx,dback_ptr - 21566 00002162 E9C332 jmp std_printf - 21567 - 21568 ; --------------------------------------------------------------------------- - 21569 - 21570 PRINT_EQ: - 21571 00002165 B03D mov al,'=' - 21572 00002167 EB45 jmp short PRINT_CHAR - 21573 - 21574 ; --------------------------------------------------------------------------- - 21575 - 21576 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 21577 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:223Eh - 21578 %if 1 - 21579 PRINT_R: ; Print [RetCode] as PROMPT - 21580 00002169 1E push ds - 21581 0000216A 8E1E[F59B] mov ds,[RESSEG] - 21582 0000216E A0[9A02] mov al,[RetCode] - 21583 00002171 1F pop ds - 21584 00002172 30E4 xor ah,ah - 21585 00002174 B20A mov dl,10 - 21586 00002176 BE[9C21] mov si,RetCode_str ; "000" - 21587 00002179 F6F2 div dl - 21588 0000217B 80C430 add ah,30h ; '0' - 21589 0000217E 886402 mov [si+2],ah - 21590 00002181 30E4 xor ah,ah - 21591 00002183 F6F2 div dl - 21592 00002185 053030 add ax,3030h - 21593 00002188 8904 mov [si],ax - 21594 0000218A 3C30 cmp al,30h ; '0' - 21595 0000218C 7507 jnz short Print_R_@ - 21596 0000218E 46 inc si - 21597 0000218F 80FC30 cmp ah,30h ; '0' - 21598 00002192 7501 jnz short Print_R_@ - 21599 00002194 46 inc si - 21600 Print_R_@: - 21601 00002195 8936[A09D] mov [string_ptr_2],si - 21602 00002199 F8 clc - 21603 0000219A EB46 jmp short Print_R_@@ - 21604 - 21605 ; --------------------------------------------------------------------------- - 21606 RetCode_str: - 21607 0000219C 30303000 db '000',0 + 21482 call word [bx+1] + 21483 pop di + 21484 pop es + 21485 jmp short PP1 + 21486 PP5: + 21487 pop es ; Restore segments + 21488 pop ds + 21489 retn + 21490 %else + 21491 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21492 ; PCDOS 7.1 COMMAND.COM + 21493 000020F0 1E push ds + 21494 000020F1 0E push cs + 21495 000020F2 1F pop ds ; Make sure DS is in TRANGROUP + 21496 000020F3 06 push es + 21497 000020F4 9C pushf + 21498 PP0: + 21499 000020F5 B8104A mov ax,4A10h ; SMARTDRV INSTALLATION CHECK (*) + 21500 000020F8 BB0000 mov bx,0 ; (*) + 21501 000020FB CD2F int 2Fh + 21502 000020FD 3DBEBA cmp ax,0BABEh ; 0BABEh if installed + 21503 00002100 7504 jnz short PP1 + 21504 ;cmp cx,0 ; number of dirty cache elements + 21505 00002102 21C9 and cx,cx ; 03/08/2024 + 21506 00002104 7516 jnz short PP3 + 21507 PP1: + 21508 00002106 9D popf + 21509 00002107 E8AA05 call find_prompt ; Look for prompt string + 21510 0000210A 7206 jc short PP2 ; Can't find one + 21511 0000210C 26803D00 cmp byte [es:di],0 + 21512 00002110 752E jnz short PP4 + 21513 PP2: ; Use default prompt + 21514 00002112 1E push ds + 21515 00002113 07 pop es + 21516 00002114 E8AE00 call build_dir_for_prompt + 21517 00002117 E88A00 call PRINT_G + 21518 0000211A EB40 jmp short PP8 + 21519 PP3: + 21520 0000211C B8104A mov ax,4A10h ; SMARTDRV - FLUSH BUFFERS (**) + 21521 0000211F BB0100 mov bx,1 ; (**) + 21522 00002122 CD2F int 2Fh + 21523 00002124 EBCF jmp short PP0 + 21524 PP5: + 21525 00002126 268A05 mov al,[es:di] + 21526 00002129 47 inc di + 21527 ;mov bx,CLSSTRING+2 ; "[2J" + 21528 0000212A BB[0594] mov bx,PROMPT_TABLE-3 + 21529 0000212D 08C0 or al,al + 21530 0000212F 742B jz short PP8 + 21531 PP6: + 21532 00002131 83C303 add bx,3 + 21533 00002134 E85406 call UPCONV + 21534 00002137 3A07 cmp al,[bx] + 21535 00002139 7416 je short PP7 + 21536 0000213B 803F00 cmp byte [bx],0 + 21537 0000213E 75F1 jnz short PP6 + 21538 ;jmp short PP4 + 21539 PP4: + 21540 00002140 268A05 mov al,[es:di] ; Get a char + 21541 00002143 47 inc di + 21542 00002144 08C0 or al,al + 21543 00002146 74DE jz short PP5 ; Nul terminated + 21544 00002148 3C24 cmp al,'$' ; 24h ; Meta character + 21545 0000214A 74DA je short PP5 ; Nope + 21546 0000214C E85F00 call PRINT_CHAR + 21547 0000214F EBEF jmp short PP4 + 21548 PP7: + 21549 00002151 06 push es + 21550 00002152 57 push di + 21551 00002153 0E push cs + 21552 00002154 07 pop es + 21553 00002155 FF5701 call word [bx+1] + 21554 00002158 5F pop di + 21555 00002159 07 pop es + 21556 0000215A EBE4 jmp short PP4 + 21557 PP8: + 21558 0000215C 07 pop es ; Restore segments + 21559 0000215D 1F pop ds + 21560 0000215E C3 retn + 21561 + 21562 %endif + 21563 + 21564 ; --------------------------------------------------------------------------- + 21565 + 21566 PRINT_BACK: + 21567 ; 21/02/2023 + 21568 0000215F BA[F791] mov dx,dback_ptr + 21569 00002162 E9C332 jmp std_printf + 21570 + 21571 ; --------------------------------------------------------------------------- + 21572 + 21573 PRINT_EQ: + 21574 00002165 B03D mov al,'=' + 21575 00002167 EB45 jmp short PRINT_CHAR + 21576 + 21577 ; --------------------------------------------------------------------------- + 21578 + 21579 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 21580 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:223Eh + 21581 %if 1 + 21582 PRINT_R: ; Print [RetCode] as PROMPT + 21583 00002169 1E push ds + 21584 0000216A 8E1E[F59B] mov ds,[RESSEG] + 21585 0000216E A0[9A02] mov al,[RetCode] + 21586 00002171 1F pop ds + 21587 00002172 30E4 xor ah,ah + 21588 00002174 B20A mov dl,10 + 21589 00002176 BE[9C21] mov si,RetCode_str ; "000" + 21590 00002179 F6F2 div dl + 21591 0000217B 80C430 add ah,30h ; '0' + 21592 0000217E 886402 mov [si+2],ah + 21593 00002181 30E4 xor ah,ah + 21594 00002183 F6F2 div dl + 21595 00002185 053030 add ax,3030h + 21596 00002188 8904 mov [si],ax + 21597 0000218A 3C30 cmp al,30h ; '0' + 21598 0000218C 7507 jnz short Print_R_@ + 21599 0000218E 46 inc si + 21600 0000218F 80FC30 cmp ah,30h ; '0' + 21601 00002192 7501 jnz short Print_R_@ + 21602 00002194 46 inc si + 21603 Print_R_@: + 21604 00002195 8936[A09D] mov [string_ptr_2],si + 21605 00002199 F8 clc + 21606 0000219A EB46 jmp short Print_R_@@ + 21607 21608 ; --------------------------------------------------------------------------- - 21609 ;; 'PROMPT $R' test for PCDOS 7.1 COMMAND.COM - Erdogan Tan - August 6, 2024 - 21610 ; - 21611 ; [org 100h] - 21612 ; - 21613 ; ;mov ah,09h - 21614 ; ;mov dx,program_name - 21615 ; ;int 21h - 21616 ; call print_msg - 21617 ; - 21618 ; mov al,255 ; Return Code - 21619 ; mov ah,4Ch - 21620 ; int 21h - 21621 ;hang: - 21622 ; ;sti - 21623 ; jmp short hang - 21624 ; - 21625 ;print_msg: - 21626 ; mov ah,0Eh - 21627 ; mov bx,7 - 21628 ; mov si,program_name - 21629 ;nextchr: - 21630 ; lodsb - 21631 ; or al,al - 21632 ; jz short pmsg_end - 21633 ; int 10h - 21634 ; jmp short nextchr - 21635 ;pmsg_end: - 21636 ; retn - 21637 ; - 21638 ;program_name: - 21639 ; db 0Dh,0Ah - 21640 ; db "IBM PCDOS 7.1 COMMAND.COM (Prompt " - 21641 ; db 24h,"R) Return Code Test Program" + 21609 RetCode_str: + 21610 0000219C 30303000 db '000',0 + 21611 ; --------------------------------------------------------------------------- + 21612 ;; 'PROMPT $R' test for PCDOS 7.1 COMMAND.COM - Erdogan Tan - August 6, 2024 + 21613 ; + 21614 ; [org 100h] + 21615 ; + 21616 ; ;mov ah,09h + 21617 ; ;mov dx,program_name + 21618 ; ;int 21h + 21619 ; call print_msg + 21620 ; + 21621 ; mov al,255 ; Return Code + 21622 ; mov ah,4Ch + 21623 ; int 21h + 21624 ;hang: + 21625 ; ;sti + 21626 ; jmp short hang + 21627 ; + 21628 ;print_msg: + 21629 ; mov ah,0Eh + 21630 ; mov bx,7 + 21631 ; mov si,program_name + 21632 ;nextchr: + 21633 ; lodsb + 21634 ; or al,al + 21635 ; jz short pmsg_end + 21636 ; int 10h + 21637 ; jmp short nextchr + 21638 ;pmsg_end: + 21639 ; retn + 21640 ; + 21641 ;program_name: 21642 ; db 0Dh,0Ah - 21643 ; db "(Erdogan Tan - 06/08/2024)" - 21644 ; ;db 0Dh,0Ah,"$" - 21645 ; db 0Dh,0Ah,0 - 21646 - 21647 %endif - 21648 - 21649 ; --------------------------------------------------------------------------- - 21650 - 21651 PRINT_ESC: - 21652 000021A0 B01B mov al,1Bh - 21653 000021A2 EB0A jmp short PRINT_CHAR - 21654 - 21655 ; --------------------------------------------------------------------------- - 21656 - 21657 ; 21/02/2023 - 21658 PRINT_G: - 21659 ;mov al,[RABRACKET] - 21660 000021A4 B03E mov al,'>' ; 3Eh - 21661 000021A6 EB06 jmp short PRINT_CHAR - 21662 - 21663 ; --------------------------------------------------------------------------- - 21664 - 21665 ; 21/02/2023 - 21666 PRINT_L: - 21667 ;mov al,[LABRACKET] - 21668 000021A8 B03C mov al,'<' ; 3Ch - 21669 000021AA EB02 jmp short PRINT_CHAR - 21670 - 21671 ; --------------------------------------------------------------------------- - 21672 - 21673 ; 21/02/2023 - 21674 Print_B: - 21675 ;mov al,[VBAR] - 21676 000021AC B07C mov al,'|' ; 7Ch - 21677 - 21678 ; =============== S U B R O U T I N E ======================================= - 21679 - 21680 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21681 PRINT_CHAR: - 21682 ; MSDOS 6.0 - 21683 - 21684 ; Bugbug: Why bother with ds,es here? - 21685 - 21686 000021AE 06 push es - 21687 000021AF 1E push ds - 21688 000021B0 07 pop es - 21689 000021B1 57 push di - 21690 000021B2 52 push dx - 21691 000021B3 88C2 mov dl,al ;AC000; Get char into al - 21692 ;mov ah,STD_CON_OUTPUT - 21693 ;AC000; print the char to stdout - 21694 000021B5 B402 mov ah,2 - 21695 000021B7 CD21 int 21h ;AC000; - 21696 000021B9 5A pop dx - 21697 000021BA 5F pop di - 21698 000021BB 07 pop es - 21699 000021BC C3 retn - 21700 - 21701 ; --------------------------------------------------------------------------- - 21702 - 21703 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21704 PRINT_DRIVE: - 21705 ;mov ah,GET_DEFAULT_DRIVE ; 19h - 21706 000021BD B419 mov ah,19h - 21707 000021BF CD21 int 21h ; DOS - GET DEFAULT DISK NUMBER - 21708 000021C1 0441 add al,'A' - 21709 ;add al,[CAPITAL_A] - 21710 ;call PRINT_CHAR - 21711 ;retn - 21712 ; 21/02/2023 - 21713 000021C3 EBE9 jmp short PRINT_CHAR - 21714 - 21715 ; --------------------------------------------------------------------------- - 21716 - 21717 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21718 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1EB6h + 21643 ; db "IBM PCDOS 7.1 COMMAND.COM (Prompt " + 21644 ; db 24h,"R) Return Code Test Program" + 21645 ; db 0Dh,0Ah + 21646 ; db "(Erdogan Tan - 06/08/2024)" + 21647 ; ;db 0Dh,0Ah,"$" + 21648 ; db 0Dh,0Ah,0 + 21649 + 21650 %endif + 21651 + 21652 ; --------------------------------------------------------------------------- + 21653 + 21654 PRINT_ESC: + 21655 000021A0 B01B mov al,1Bh + 21656 000021A2 EB0A jmp short PRINT_CHAR + 21657 + 21658 ; --------------------------------------------------------------------------- + 21659 + 21660 ; 21/02/2023 + 21661 PRINT_G: + 21662 ;mov al,[RABRACKET] + 21663 000021A4 B03E mov al,'>' ; 3Eh + 21664 000021A6 EB06 jmp short PRINT_CHAR + 21665 + 21666 ; --------------------------------------------------------------------------- + 21667 + 21668 ; 21/02/2023 + 21669 PRINT_L: + 21670 ;mov al,[LABRACKET] + 21671 000021A8 B03C mov al,'<' ; 3Ch + 21672 000021AA EB02 jmp short PRINT_CHAR + 21673 + 21674 ; --------------------------------------------------------------------------- + 21675 + 21676 ; 21/02/2023 + 21677 Print_B: + 21678 ;mov al,[VBAR] + 21679 000021AC B07C mov al,'|' ; 7Ch + 21680 + 21681 ; =============== S U B R O U T I N E ======================================= + 21682 + 21683 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21684 PRINT_CHAR: + 21685 ; MSDOS 6.0 + 21686 + 21687 ; Bugbug: Why bother with ds,es here? + 21688 + 21689 000021AE 06 push es + 21690 000021AF 1E push ds + 21691 000021B0 07 pop es + 21692 000021B1 57 push di + 21693 000021B2 52 push dx + 21694 000021B3 88C2 mov dl,al ;AC000; Get char into al + 21695 ;mov ah,STD_CON_OUTPUT + 21696 ;AC000; print the char to stdout + 21697 000021B5 B402 mov ah,2 + 21698 000021B7 CD21 int 21h ;AC000; + 21699 000021B9 5A pop dx + 21700 000021BA 5F pop di + 21701 000021BB 07 pop es + 21702 000021BC C3 retn + 21703 + 21704 ; --------------------------------------------------------------------------- + 21705 + 21706 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21707 PRINT_DRIVE: + 21708 ;mov ah,GET_DEFAULT_DRIVE ; 19h + 21709 000021BD B419 mov ah,19h + 21710 000021BF CD21 int 21h ; DOS - GET DEFAULT DISK NUMBER + 21711 000021C1 0441 add al,'A' + 21712 ;add al,[CAPITAL_A] + 21713 ;call PRINT_CHAR + 21714 ;retn + 21715 ; 21/02/2023 + 21716 000021C3 EBE9 jmp short PRINT_CHAR + 21717 + 21718 ; --------------------------------------------------------------------------- 21719 - 21720 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21721 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2460h + 21720 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21721 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1EB6h 21722 - 21723 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 21724 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:229Ch + 21723 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21724 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2460h 21725 - 21726 build_dir_for_prompt: - 21727 000021C5 30D2 xor dl,dl - 21728 000021C7 BE[399D] mov si,BWDBUF - 21729 000021CA 89F7 mov di,si - 21730 000021CC A0[079C] mov al,[CURDRV] - 21731 000021CF 0441 add al,'A' - 21732 000021D1 B43A mov ah,':' - 21733 000021D3 AB stosw - 21734 000021D4 A0[FA9B] mov al,[DIRCHAR] - 21735 000021D7 AA stosb - 21736 000021D8 87F7 xchg si,di - 21737 000021DA 893E[A09D] mov [string_ptr_2],di - 21738 ;mov ah,CURRENT_DIR ; 47h - 21739 000021DE B447 mov ah,47h - 21740 000021E0 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 21741 ; DL = drive (0=default,1=A,etc.) - 21742 ; DS:SI points to 64-byte buffer area - 21743 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 - 21744 Print_R_@@: ; 06/08/2024 - 21745 000021E2 BA[DF91] mov dx,string_buf_ptr - 21746 000021E5 7303 jnc short doprint - 21747 ;mov dx,BADCURDRVPTR ; MSDOS 3.3 - 21748 000021E7 BA[A190] mov dx,BADCURDRV - 21749 doprint: - 21750 ;call std_printf - 21751 ;retn - 21752 000021EA E93B32 jmp std_printf - 21753 - 21754 ; =============== S U B R O U T I N E ======================================= - 21755 - 21756 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21757 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1EDFh + 21726 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 21727 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:229Ch + 21728 + 21729 build_dir_for_prompt: + 21730 000021C5 30D2 xor dl,dl + 21731 000021C7 BE[399D] mov si,BWDBUF + 21732 000021CA 89F7 mov di,si + 21733 000021CC A0[079C] mov al,[CURDRV] + 21734 000021CF 0441 add al,'A' + 21735 000021D1 B43A mov ah,':' + 21736 000021D3 AB stosw + 21737 000021D4 A0[FA9B] mov al,[DIRCHAR] + 21738 000021D7 AA stosb + 21739 000021D8 87F7 xchg si,di + 21740 000021DA 893E[A09D] mov [string_ptr_2],di + 21741 ;mov ah,CURRENT_DIR ; 47h + 21742 000021DE B447 mov ah,47h + 21743 000021E0 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 21744 ; DL = drive (0=default,1=A,etc.) + 21745 ; DS:SI points to 64-byte buffer area + 21746 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 + 21747 Print_R_@@: ; 06/08/2024 + 21748 000021E2 BA[DF91] mov dx,string_buf_ptr + 21749 000021E5 7303 jnc short doprint + 21750 ;mov dx,BADCURDRVPTR ; MSDOS 3.3 + 21751 000021E7 BA[A190] mov dx,BADCURDRV + 21752 doprint: + 21753 ;call std_printf + 21754 ;retn + 21755 000021EA E93B32 jmp std_printf + 21756 + 21757 ; =============== S U B R O U T I N E ======================================= 21758 - 21759 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 21760 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:22C5h + 21759 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21760 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1EDFh 21761 - 21762 build_dir_for_chdir: - 21763 000021ED E80D00 call build_dir_string - 21764 000021F0 BA[399D] mov dx,DIRBUF - 21765 000021F3 8916[A09D] mov [string_ptr_2],dx - 21766 ;mov dx,offset trangroup:string_buf_ptr ; MSDOS 6.0 - 21767 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 - 21768 000021F7 BA[DF91] mov dx,string_buf_ptr - 21769 ;call std_printf - 21770 ;retn - 21771 ; 21/02/2023 - 21772 ;jmp short doprint - 21773 000021FA E92B32 jmp std_printf - 21774 - 21775 ; =============== S U B R O U T I N E ======================================= - 21776 - 21777 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21778 build_dir_string: - 21779 000021FD 8A165C00 mov dl,[FCB] ; mov dl,[5Ch] - 21780 00002201 88D0 mov al,dl - 21781 00002203 0440 add al,'@' ; 40h - 21782 00002205 3C40 cmp al,'@' - 21783 00002207 7506 jne short gotdrive - 21784 00002209 0206[079C] add al,[CURDRV] - 21785 0000220D FEC0 inc al - 21786 gotdrive: - 21787 0000220F 50 push ax - 21788 00002210 BE[3C9D] mov si,BWDBUF+3 - 21789 ;mov ah,CURRENT_DIR ; 47h - 21790 00002213 B447 mov ah,47h - 21791 00002215 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 21792 ; DL = drive (0=default,1=A,etc.) - 21793 ; DS:SI points to 64-byte buffer area - 21794 00002217 7305 jnc short dpbisok - 21795 00002219 0E push cs - 21796 0000221A 1F pop ds - 21797 0000221B E9040A jmp DRVBAD - 21798 dpbisok: - 21799 0000221E BF[399D] mov di,BWDBUF - 21800 00002221 89FA mov dx,di - 21801 00002223 58 pop ax - 21802 00002224 B43A mov ah,':' - 21803 00002226 AB stosw - 21804 00002227 A0[FA9B] mov al,[DIRCHAR] - 21805 0000222A AA stosb - 21806 0000222B C3 retn - 21807 - 21808 ; --------------------------------------------------------------------------- - 21809 - 21810 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21811 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1F1Fh + 21762 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21763 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:22C5h + 21764 + 21765 build_dir_for_chdir: + 21766 000021ED E80D00 call build_dir_string + 21767 000021F0 BA[399D] mov dx,DIRBUF + 21768 000021F3 8916[A09D] mov [string_ptr_2],dx + 21769 ;mov dx,offset trangroup:string_buf_ptr ; MSDOS 6.0 + 21770 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 + 21771 000021F7 BA[DF91] mov dx,string_buf_ptr + 21772 ;call std_printf + 21773 ;retn + 21774 ; 21/02/2023 + 21775 ;jmp short doprint + 21776 000021FA E92B32 jmp std_printf + 21777 + 21778 ; =============== S U B R O U T I N E ======================================= + 21779 + 21780 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21781 build_dir_string: + 21782 000021FD 8A165C00 mov dl,[FCB] ; mov dl,[5Ch] + 21783 00002201 88D0 mov al,dl + 21784 00002203 0440 add al,'@' ; 40h + 21785 00002205 3C40 cmp al,'@' + 21786 00002207 7506 jne short gotdrive + 21787 00002209 0206[079C] add al,[CURDRV] + 21788 0000220D FEC0 inc al + 21789 gotdrive: + 21790 0000220F 50 push ax + 21791 00002210 BE[3C9D] mov si,BWDBUF+3 + 21792 ;mov ah,CURRENT_DIR ; 47h + 21793 00002213 B447 mov ah,47h + 21794 00002215 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 21795 ; DL = drive (0=default,1=A,etc.) + 21796 ; DS:SI points to 64-byte buffer area + 21797 00002217 7305 jnc short dpbisok + 21798 00002219 0E push cs + 21799 0000221A 1F pop ds + 21800 0000221B E9040A jmp DRVBAD + 21801 dpbisok: + 21802 0000221E BF[399D] mov di,BWDBUF + 21803 00002221 89FA mov dx,di + 21804 00002223 58 pop ax + 21805 00002224 B43A mov ah,':' + 21806 00002226 AB stosw + 21807 00002227 A0[FA9B] mov al,[DIRCHAR] + 21808 0000222A AA stosb + 21809 0000222B C3 retn + 21810 + 21811 ; --------------------------------------------------------------------------- 21812 - 21813 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21814 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:24C9h + 21813 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21814 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:1F1Fh 21815 - 21816 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 21817 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2305h - 21818 PATH: - 21819 ; MSDOS 6.0 - 21820 0000222C 30C0 xor al,al ;AN049; Set up holding buffer - 21821 0000222E BF[2399] mov di,SRCXNAME ;AN049; for PATH while parsing - 21822 00002231 AA stosb ;AN049; Initialize PATH to null - 21823 00002232 4F dec di ;AN049; point to the start of buffer - 21824 00002233 E8600D call PGETARG ; Pre scan for arguments - 21825 00002236 7460 jz short disppath ; Print the current path - 21826 ;cmp al,semicolon ;AC049; NUL path argument? - 21827 00002238 3C3B cmp al,';' ; 3Bh - 21828 0000223A 7503 jne short pathslp ;AC049; - 21829 0000223C 46 inc si ;AN049; point past semicolon - 21830 0000223D EB1B jmp short scan_white ;AC049; Yes - make sure nothing else on line - 21831 pathslp: ; Get the user specified path - 21832 0000223F AC lodsb ; Get a character - 21833 00002240 3C0D cmp al,0Dh - 21834 ;cmp al,END_OF_LINE_IN ;AC049; Is it end of line? - 21835 00002242 7434 je short path_eol ;AC049; yes - end of command - 21836 00002244 E81A05 call testkanj ;See if DBCS - 21837 00002247 7405 jz short notkanj2 ;No - continue - 21838 00002249 AA stosb ;AC049; Yes - store the first byte - 21839 0000224A AC lodsb ;skip second byte of DBCS - 21840 path_hold: ;AN049; - 21841 0000224B AA stosb ;AC049; Store a byte in the PATH buffer - 21842 0000224C EBF1 jmp short pathslp ;continue parsing - 21843 notkanj2: - 21844 0000224E E83A05 call UPCONV ;upper case the character - 21845 - 21846 00002251 3C3B cmp al,';' ; 3Bh - 21847 ;cmp al,semicolon ;AC049; ';' not a delimiter on PATH - 21848 00002253 74F6 je short path_hold ;AC049; go store it - 21849 00002255 E83607 call DELIM ;delimiter? - 21850 00002258 75F1 jnz short path_hold ;AC049; no - go store character - 21851 scan_white: ;AN049; make sure were at EOL - 21852 0000225A AC lodsb ;AN049; get a character - 21853 0000225B 3C0D cmp al,0Dh - 21854 ;cmp al,END_OF_LINE_IN ;AN049; end of line? - 21855 0000225D 7419 je short path_eol ;AN049; yes - go set path - 21856 0000225F 3C20 cmp al,' ' ; 20h - 21857 ;cmp al,blank ;AN049; whitespace? - 21858 00002261 74F7 je short scan_white ;AN049; yes - continue scanning - 21859 ;cmp al,9 - 21860 00002263 3C09 cmp al,tab_chr ; 9 ;AN049; whitespace? - 21861 00002265 74F3 je short scan_white ;AN049; yes - continue scanning - 21862 - 21863 00002267 BA[D78F] mov dx,extend_buf_ptr ;AN049; no - set up error message - 21864 ;mov word [extend_buf_ptr],1 ;AN049; get "Too many parameters" message number - 21865 0000226A C706[D78F]0100 mov word [extend_buf_ptr],MoreArgs_Ptr - 21866 ;mov byte [msg_disp_class],2 - 21867 ;AN049; set up parse error msg class - 21868 00002270 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class - 21869 00002275 E9AE0A jmp cerror ;AN049; - 21870 path_eol: ;AN049; Parsing was clean - 21871 00002278 30C0 xor al,al ;AN049; null terminate the PATH - 21872 0000227A AA stosb ;AN049; buffer - 21873 0000227B E83104 call find_path ;AN049; Find PATH in environment - 21874 0000227E E80504 call delete_path ;AC049; Delete any offending name - 21875 00002281 E8BB04 call scan_double_null ;AC049; Scan to end of environment - 21876 00002284 E88B04 call move_name ;AC049; move in PATH= - 21877 00002287 BE[2399] mov si,SRCXNAME ;AN049; Set up source as PATH buffer - 21878 store_path: ;AN049; Store the PATH in the environment - 21879 0000228A AC lodsb ;AN049; Get a character - 21880 ;cmp al,END_OF_LINE_OUT ; 0 ;AN049; null character? - 21881 0000228B 20C0 and al,al ; al=0 ? - 21882 0000228D 7405 jz short got_paths ;AN049; yes - exit - 21883 0000228F E81B05 call store_char ;AN049; no - store character - 21884 00002292 EBF6 jmp short store_path ;AN049; continue - 21885 got_paths: ;AN049; we're finished - 21886 00002294 31C0 xor ax,ax ; null terminate the PATH in - 21887 00002296 AB stosw ; the environment - 21888 00002297 C3 retn - 21889 disppath: - 21890 00002298 E81404 call find_path ;AN049; - 21891 0000229B E80300 call print_path - 21892 ;call CRLF2 - 21893 ;retn - 21894 ; 21/02/2023 - 21895 0000229E E9D806 jmp CRLF2 - 21896 - 21897 ; =============== S U B R O U T I N E ======================================= - 21898 - 21899 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21900 print_path: - 21901 000022A1 26803D00 cmp byte [es:di],0 - 21902 000022A5 750A jnz short path1 - 21903 path0: - 21904 000022A7 BA[5191] mov dx,NULLPATH_PTR - 21905 000022AA 0E push cs - 21906 000022AB 07 pop es - 21907 000022AC 0E push cs - 21908 000022AD 1F pop ds - 21909 000022AE E97731 jmp std_printf - 21910 path1: - 21911 000022B1 06 push es - 21912 000022B2 1F pop ds - 21913 000022B3 83EF05 sub di,5 - 21914 000022B6 89FE mov si,di - 21915 000022B8 E89E04 call SCASB2 ; Look for null - 21916 ;cmp cx,0FFh ; 255 - 21917 ; 21/02/2023 - 21918 ;ch = 0 - 21919 000022BB 80F9FF cmp cl,255 - 21920 000022BE 74E7 je short path0 - 21921 000022C0 0E push cs - 21922 000022C1 07 pop es - 21923 000022C2 BF[96A3] mov di,Arg_Buf - 21924 ;mov dx,100h ; 256 - 21925 ;sub dx,cx - 21926 ;xchg dx,cx - 21927 ; 21/02/2023 - 21928 000022C5 F6D9 neg cl ; 256-cl - 21929 000022C7 F3A4 rep movsb - 21930 000022C9 BA[9991] mov dx,arg_buf_ptr - 21931 000022CC 0E push cs - 21932 000022CD 1F pop ds - 21933 000022CE E95731 jmp std_printf - 21934 - 21935 ; --------------------------------------------------------------------------- - 21936 - 21937 ; **************************************************************** - 21938 ; * - 21939 ; * ROUTINE: CLS - 21940 ; * - 21941 ; * FUNCTION: Clear the screen using INT 10h. If ANSI.SYS is - 21942 ; * installed, send a control string to clear the - 21943 ; * screen. - 21944 ; * - 21945 ; * INPUT: command line at offset 81H - 21946 ; * - 21947 ; * OUTPUT: none - 21948 ; * - 21949 ; **************************************************************** - 21950 - 21951 ; MSDOS 6.0 - 21952 - 21953 ANSI_installed equ 0FFh - 21954 - 21955 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 21956 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM - 21957 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 21958 CLS: - 21959 ;;mov ah,Mult_ANSI ;AN000; see if ANSI.SYS installed - 21960 ;mov ah,1Ah - 21961 ;mov al,0 ;AN000; - 21962 000022D1 B8001A mov ax,1A00h - 21963 000022D4 CD2F int 2Fh ;AN000; - 21964 ; - Multiplex - DOS 4+ ANSI.SYS internal - INSTALLATION CHECK - 21965 ; Return: AL = FFh if installed - 21966 000022D6 3CFF cmp al,ANSI_installed ;AN000; - 21967 000022D8 7429 je short ansicls ;AN000; installed - go do ANSI CLS - 21968 - 21969 check_lines: - 21970 ;mov ax,(IOCTL SHL 8) + generic_ioctl_handle ; 440Ch - 21971 000022DA B80C44 mov ax,440Ch ;AN000; get lines per page on display - 21972 ;mov bx,stdout ;AN000; lines for stdout - 21973 000022DD BB0100 mov bx,1 ; handle - 21974 ;;mov ch,ioc_sc ;AN000; type is display - 21975 ;mov ch,3 ; CON device - 21976 ;;mov cl,get_generic ;AN000; get information - 21977 ;mov cl,7Fh ; minor function, get display info - 21978 ; 25/04/2023 - 21979 000022E0 B97F03 mov cx,037Fh - 21980 000022E3 BA[079F] mov dx,Display_Ioctl ;AN000; - 21981 000022E6 CD21 int 21h ;AN000; - 21982 000022E8 720A jc short no_variable ;AN000; function had error, use default - 21983 ; 21/02/2023 - 21984 ; ds:dx = parameter block - 21985 ; --- https://stanislavs.org/helppc/int_21-44-c.html --- - 21986 ; offset 00h byte level (0 for DOS 4.0) - 21987 ; 01h byte reserved - 21988 ; 02h word length of following data - 21989 ; 04h word control flags - 21990 ; bit 0 set for blink, clear for intensity - 21991 ; bits 1 to 15 reserved - 21992 ; 06h byte mode type (1=text, 2=graphics) - 21993 ; 07h byte reserved - 21994 ; 08h word colors; 0=monochrome, n=bits per pixel - 21995 ; 0Ah word pixel columns - 21996 ; 0Ch word pixel rows - 21997 ; 0Eh word character columns - 21998 ; 10h word character rows - 21999 - 22000 ;mov ax,[LinPerPag] ; [Display_Ioctl+10h] - 22001 ; ;AN000; get number of rows returned - 22002 ;mov dh,al ;AN000; set number of rows - 22003 ;mov ax,[display_width] ; [Display_Ioctl+0Eh] - 22004 ; ;AN000; get number of columns returned - 22005 ;mov dl,al ;AN000; set number of columns - 22006 ; 21/02/2023 - 22007 000022EA 8A16[159F] mov dl,[display_width] - 22008 000022EE 8A36[179F] mov dh,[LinPerPag] - 22009 000022F2 EB3B jmp short regcls ;AN000; go do cls - 22010 - 22011 no_variable: - 22012 ;;mov bx,stdout ;AC000; set handle as stdout - 22013 ;mov bx,1 - 22014 ; bx = 1 - 22015 ;mov ax,IOCTL SHL 8 ;AC000; do ioctl - get device info - 22016 000022F4 B80044 mov ax,4400h - 22017 000022F7 CD21 int 21h ;AC000; - 22018 000022F9 F6C280 test dl,80h - 22019 ;test dl,devid_ISDEV ;AC000; is handle a device - 22020 000022FC 7405 jz short ansicls ;AC000; If a file put out ANSI - 22021 000022FE F6C210 test dl,10h - 22022 ;test dl,devid_SPECIAL ;AC000; - 22023 00002301 7505 jnz short cls_normal ;AC000; If not special CON, do ANSI - 22024 - 22025 ansicls: - 22026 00002303 E85200 call ansi_cls ;AN000; clear the screen - 22027 00002306 EB2C jmp short cls_ret ;AN000; exit - 22028 - 22029 ; Get video mode - 22030 - 22031 cls_normal: ;AC000; - 22032 ;mov ah,get_video_state ;AC000; set up to get video state - 22033 00002308 B40F mov ah,0Fh - 22034 ;int video_io_int ;AC000; do int 10h - BIOS video IO - 22035 0000230A CD10 int 10h - 22036 0000230C 3C03 cmp al,3 - 22037 ;cmp al,video_alpha ;AC000; see if in text mode - 22038 0000230E 760A jbe short DoAlpha - 22039 00002310 3C07 cmp al,7 - 22040 ;cmp al,video_bw ;AC000; see if black & white card - 22041 00002312 7406 je short DoAlpha - 22042 - 22043 ; We are in graphics mode. Bogus IBM ROM does not scroll correctly. We will - 22044 ; be just as bogus and set the mode that we just got. This will blank the - 22045 ; screen too. - 22046 - 22047 ;mov ah,set_video_mode ;AC000; set video mode call - 22048 00002314 B400 mov ah,0 - 22049 ;int video_io_int ;AC000; do int 10h - BIOS video IO - 22050 00002316 CD10 int 10h - 22051 00002318 EB1A jmp short cls_ret ;AC000; exit - 22052 - 22053 DoAlpha: - 22054 - 22055 ; Get video mode and number of columns to scroll - 22056 - 22057 ;M01 - INT 10 Function 0F doesn't reliably return the number of rows on some - 22058 ;M01 adaptors. We circumvent this by reaching directly into the BIOS data - 22059 ;M01 area - 22060 ;M01 Commented out code here is the original - 22061 ;M01 mov ah,get_video_state ;AC000; set up to get current video state - 22062 ;M01 int video_io_int ;AC000; do int 10h - BIOS video IO - 22063 ;M01 mov dl,ah - 22064 ;M01 mov dh,linesperpage ;AC000; have 25 rows on the screen - 22065 - 22066 ;M01 Following code lifted from a fix Compaq applied to ANSI - 22067 - 22068 0000231A 1E push ds - 22069 ;mov ax,ROMBIOS_DATA ; GET ROM Data segment M01 - 22070 0000231B B84000 mov ax,40h - 22071 0000231E 8ED8 mov ds,ax ; * M01 - 22072 - 22073 ;mov dx,[CRT_Cols] ; Get Columns - assume < 256 M01 - 22074 00002320 8A164A00 mov dl,[4Ah] - 22075 ;mov dh,[CRT_Rows] ; GET MAX NUM OF ROWS M01 - 22076 00002324 8A368400 mov dh,[84h] - 22077 00002328 1F pop ds ; M01 - 22078 - 22079 00002329 08F6 or dh,dh ; Q:ZERO M01 - 22080 0000232B 7502 jnz short regcls ; *JMP IF NO M01 + 21816 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21817 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:24C9h + 21818 + 21819 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 21820 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2305h + 21821 PATH: + 21822 ; MSDOS 6.0 + 21823 0000222C 30C0 xor al,al ;AN049; Set up holding buffer + 21824 0000222E BF[2399] mov di,SRCXNAME ;AN049; for PATH while parsing + 21825 00002231 AA stosb ;AN049; Initialize PATH to null + 21826 00002232 4F dec di ;AN049; point to the start of buffer + 21827 00002233 E8600D call PGETARG ; Pre scan for arguments + 21828 00002236 7460 jz short disppath ; Print the current path + 21829 ;cmp al,semicolon ;AC049; NUL path argument? + 21830 00002238 3C3B cmp al,';' ; 3Bh + 21831 0000223A 7503 jne short pathslp ;AC049; + 21832 0000223C 46 inc si ;AN049; point past semicolon + 21833 0000223D EB1B jmp short scan_white ;AC049; Yes - make sure nothing else on line + 21834 pathslp: ; Get the user specified path + 21835 0000223F AC lodsb ; Get a character + 21836 00002240 3C0D cmp al,0Dh + 21837 ;cmp al,END_OF_LINE_IN ;AC049; Is it end of line? + 21838 00002242 7434 je short path_eol ;AC049; yes - end of command + 21839 00002244 E81A05 call testkanj ;See if DBCS + 21840 00002247 7405 jz short notkanj2 ;No - continue + 21841 00002249 AA stosb ;AC049; Yes - store the first byte + 21842 0000224A AC lodsb ;skip second byte of DBCS + 21843 path_hold: ;AN049; + 21844 0000224B AA stosb ;AC049; Store a byte in the PATH buffer + 21845 0000224C EBF1 jmp short pathslp ;continue parsing + 21846 notkanj2: + 21847 0000224E E83A05 call UPCONV ;upper case the character + 21848 + 21849 00002251 3C3B cmp al,';' ; 3Bh + 21850 ;cmp al,semicolon ;AC049; ';' not a delimiter on PATH + 21851 00002253 74F6 je short path_hold ;AC049; go store it + 21852 00002255 E83607 call DELIM ;delimiter? + 21853 00002258 75F1 jnz short path_hold ;AC049; no - go store character + 21854 scan_white: ;AN049; make sure were at EOL + 21855 0000225A AC lodsb ;AN049; get a character + 21856 0000225B 3C0D cmp al,0Dh + 21857 ;cmp al,END_OF_LINE_IN ;AN049; end of line? + 21858 0000225D 7419 je short path_eol ;AN049; yes - go set path + 21859 0000225F 3C20 cmp al,' ' ; 20h + 21860 ;cmp al,blank ;AN049; whitespace? + 21861 00002261 74F7 je short scan_white ;AN049; yes - continue scanning + 21862 ;cmp al,9 + 21863 00002263 3C09 cmp al,tab_chr ; 9 ;AN049; whitespace? + 21864 00002265 74F3 je short scan_white ;AN049; yes - continue scanning + 21865 + 21866 00002267 BA[D78F] mov dx,extend_buf_ptr ;AN049; no - set up error message + 21867 ;mov word [extend_buf_ptr],1 ;AN049; get "Too many parameters" message number + 21868 0000226A C706[D78F]0100 mov word [extend_buf_ptr],MoreArgs_Ptr + 21869 ;mov byte [msg_disp_class],2 + 21870 ;AN049; set up parse error msg class + 21871 00002270 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class + 21872 00002275 E9AE0A jmp cerror ;AN049; + 21873 path_eol: ;AN049; Parsing was clean + 21874 00002278 30C0 xor al,al ;AN049; null terminate the PATH + 21875 0000227A AA stosb ;AN049; buffer + 21876 0000227B E83104 call find_path ;AN049; Find PATH in environment + 21877 0000227E E80504 call delete_path ;AC049; Delete any offending name + 21878 00002281 E8BB04 call scan_double_null ;AC049; Scan to end of environment + 21879 00002284 E88B04 call move_name ;AC049; move in PATH= + 21880 00002287 BE[2399] mov si,SRCXNAME ;AN049; Set up source as PATH buffer + 21881 store_path: ;AN049; Store the PATH in the environment + 21882 0000228A AC lodsb ;AN049; Get a character + 21883 ;cmp al,END_OF_LINE_OUT ; 0 ;AN049; null character? + 21884 0000228B 20C0 and al,al ; al=0 ? + 21885 0000228D 7405 jz short got_paths ;AN049; yes - exit + 21886 0000228F E81B05 call store_char ;AN049; no - store character + 21887 00002292 EBF6 jmp short store_path ;AN049; continue + 21888 got_paths: ;AN049; we're finished + 21889 00002294 31C0 xor ax,ax ; null terminate the PATH in + 21890 00002296 AB stosw ; the environment + 21891 00002297 C3 retn + 21892 disppath: + 21893 00002298 E81404 call find_path ;AN049; + 21894 0000229B E80300 call print_path + 21895 ;call CRLF2 + 21896 ;retn + 21897 ; 21/02/2023 + 21898 0000229E E9D806 jmp CRLF2 + 21899 + 21900 ; =============== S U B R O U T I N E ======================================= + 21901 + 21902 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21903 print_path: + 21904 000022A1 26803D00 cmp byte [es:di],0 + 21905 000022A5 750A jnz short path1 + 21906 path0: + 21907 000022A7 BA[5191] mov dx,NULLPATH_PTR + 21908 000022AA 0E push cs + 21909 000022AB 07 pop es + 21910 000022AC 0E push cs + 21911 000022AD 1F pop ds + 21912 000022AE E97731 jmp std_printf + 21913 path1: + 21914 000022B1 06 push es + 21915 000022B2 1F pop ds + 21916 000022B3 83EF05 sub di,5 + 21917 000022B6 89FE mov si,di + 21918 000022B8 E89E04 call SCASB2 ; Look for null + 21919 ;cmp cx,0FFh ; 255 + 21920 ; 21/02/2023 + 21921 ;ch = 0 + 21922 000022BB 80F9FF cmp cl,255 + 21923 000022BE 74E7 je short path0 + 21924 000022C0 0E push cs + 21925 000022C1 07 pop es + 21926 000022C2 BF[96A3] mov di,Arg_Buf + 21927 ;mov dx,100h ; 256 + 21928 ;sub dx,cx + 21929 ;xchg dx,cx + 21930 ; 21/02/2023 + 21931 000022C5 F6D9 neg cl ; 256-cl + 21932 000022C7 F3A4 rep movsb + 21933 000022C9 BA[9991] mov dx,arg_buf_ptr + 21934 000022CC 0E push cs + 21935 000022CD 1F pop ds + 21936 000022CE E95731 jmp std_printf + 21937 + 21938 ; --------------------------------------------------------------------------- + 21939 + 21940 ; **************************************************************** + 21941 ; * + 21942 ; * ROUTINE: CLS + 21943 ; * + 21944 ; * FUNCTION: Clear the screen using INT 10h. If ANSI.SYS is + 21945 ; * installed, send a control string to clear the + 21946 ; * screen. + 21947 ; * + 21948 ; * INPUT: command line at offset 81H + 21949 ; * + 21950 ; * OUTPUT: none + 21951 ; * + 21952 ; **************************************************************** + 21953 + 21954 ; MSDOS 6.0 + 21955 + 21956 ANSI_installed equ 0FFh + 21957 + 21958 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 21959 ; 08/06/2023 - Retro DOS v4.2 COMMAND.COM + 21960 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 21961 CLS: + 21962 ;;mov ah,Mult_ANSI ;AN000; see if ANSI.SYS installed + 21963 ;mov ah,1Ah + 21964 ;mov al,0 ;AN000; + 21965 000022D1 B8001A mov ax,1A00h + 21966 000022D4 CD2F int 2Fh ;AN000; + 21967 ; - Multiplex - DOS 4+ ANSI.SYS internal - INSTALLATION CHECK + 21968 ; Return: AL = FFh if installed + 21969 000022D6 3CFF cmp al,ANSI_installed ;AN000; + 21970 000022D8 7429 je short ansicls ;AN000; installed - go do ANSI CLS + 21971 + 21972 check_lines: + 21973 ;mov ax,(IOCTL SHL 8) + generic_ioctl_handle ; 440Ch + 21974 000022DA B80C44 mov ax,440Ch ;AN000; get lines per page on display + 21975 ;mov bx,stdout ;AN000; lines for stdout + 21976 000022DD BB0100 mov bx,1 ; handle + 21977 ;;mov ch,ioc_sc ;AN000; type is display + 21978 ;mov ch,3 ; CON device + 21979 ;;mov cl,get_generic ;AN000; get information + 21980 ;mov cl,7Fh ; minor function, get display info + 21981 ; 25/04/2023 + 21982 000022E0 B97F03 mov cx,037Fh + 21983 000022E3 BA[079F] mov dx,Display_Ioctl ;AN000; + 21984 000022E6 CD21 int 21h ;AN000; + 21985 000022E8 720A jc short no_variable ;AN000; function had error, use default + 21986 ; 21/02/2023 + 21987 ; ds:dx = parameter block + 21988 ; --- https://stanislavs.org/helppc/int_21-44-c.html --- + 21989 ; offset 00h byte level (0 for DOS 4.0) + 21990 ; 01h byte reserved + 21991 ; 02h word length of following data + 21992 ; 04h word control flags + 21993 ; bit 0 set for blink, clear for intensity + 21994 ; bits 1 to 15 reserved + 21995 ; 06h byte mode type (1=text, 2=graphics) + 21996 ; 07h byte reserved + 21997 ; 08h word colors; 0=monochrome, n=bits per pixel + 21998 ; 0Ah word pixel columns + 21999 ; 0Ch word pixel rows + 22000 ; 0Eh word character columns + 22001 ; 10h word character rows + 22002 + 22003 ;mov ax,[LinPerPag] ; [Display_Ioctl+10h] + 22004 ; ;AN000; get number of rows returned + 22005 ;mov dh,al ;AN000; set number of rows + 22006 ;mov ax,[display_width] ; [Display_Ioctl+0Eh] + 22007 ; ;AN000; get number of columns returned + 22008 ;mov dl,al ;AN000; set number of columns + 22009 ; 21/02/2023 + 22010 000022EA 8A16[159F] mov dl,[display_width] + 22011 000022EE 8A36[179F] mov dh,[LinPerPag] + 22012 000022F2 EB3B jmp short regcls ;AN000; go do cls + 22013 + 22014 no_variable: + 22015 ;;mov bx,stdout ;AC000; set handle as stdout + 22016 ;mov bx,1 + 22017 ; bx = 1 + 22018 ;mov ax,IOCTL SHL 8 ;AC000; do ioctl - get device info + 22019 000022F4 B80044 mov ax,4400h + 22020 000022F7 CD21 int 21h ;AC000; + 22021 000022F9 F6C280 test dl,80h + 22022 ;test dl,devid_ISDEV ;AC000; is handle a device + 22023 000022FC 7405 jz short ansicls ;AC000; If a file put out ANSI + 22024 000022FE F6C210 test dl,10h + 22025 ;test dl,devid_SPECIAL ;AC000; + 22026 00002301 7505 jnz short cls_normal ;AC000; If not special CON, do ANSI + 22027 + 22028 ansicls: + 22029 00002303 E85200 call ansi_cls ;AN000; clear the screen + 22030 00002306 EB2C jmp short cls_ret ;AN000; exit + 22031 + 22032 ; Get video mode + 22033 + 22034 cls_normal: ;AC000; + 22035 ;mov ah,get_video_state ;AC000; set up to get video state + 22036 00002308 B40F mov ah,0Fh + 22037 ;int video_io_int ;AC000; do int 10h - BIOS video IO + 22038 0000230A CD10 int 10h + 22039 0000230C 3C03 cmp al,3 + 22040 ;cmp al,video_alpha ;AC000; see if in text mode + 22041 0000230E 760A jbe short DoAlpha + 22042 00002310 3C07 cmp al,7 + 22043 ;cmp al,video_bw ;AC000; see if black & white card + 22044 00002312 7406 je short DoAlpha + 22045 + 22046 ; We are in graphics mode. Bogus IBM ROM does not scroll correctly. We will + 22047 ; be just as bogus and set the mode that we just got. This will blank the + 22048 ; screen too. + 22049 + 22050 ;mov ah,set_video_mode ;AC000; set video mode call + 22051 00002314 B400 mov ah,0 + 22052 ;int video_io_int ;AC000; do int 10h - BIOS video IO + 22053 00002316 CD10 int 10h + 22054 00002318 EB1A jmp short cls_ret ;AC000; exit + 22055 + 22056 DoAlpha: + 22057 + 22058 ; Get video mode and number of columns to scroll + 22059 + 22060 ;M01 - INT 10 Function 0F doesn't reliably return the number of rows on some + 22061 ;M01 adaptors. We circumvent this by reaching directly into the BIOS data + 22062 ;M01 area + 22063 ;M01 Commented out code here is the original + 22064 ;M01 mov ah,get_video_state ;AC000; set up to get current video state + 22065 ;M01 int video_io_int ;AC000; do int 10h - BIOS video IO + 22066 ;M01 mov dl,ah + 22067 ;M01 mov dh,linesperpage ;AC000; have 25 rows on the screen + 22068 + 22069 ;M01 Following code lifted from a fix Compaq applied to ANSI + 22070 + 22071 0000231A 1E push ds + 22072 ;mov ax,ROMBIOS_DATA ; GET ROM Data segment M01 + 22073 0000231B B84000 mov ax,40h + 22074 0000231E 8ED8 mov ds,ax ; * M01 + 22075 + 22076 ;mov dx,[CRT_Cols] ; Get Columns - assume < 256 M01 + 22077 00002320 8A164A00 mov dl,[4Ah] + 22078 ;mov dh,[CRT_Rows] ; GET MAX NUM OF ROWS M01 + 22079 00002324 8A368400 mov dh,[84h] + 22080 00002328 1F pop ds ; M01 22081 - 22082 ;mov dh,LINESPERPAGE ; SET TO 24 ROWS M01 - 22083 ; 25/04/2023 - 22084 0000232D B619 mov dh,25 - 22085 regcls: - 22086 0000232F FEC6 inc dh ; height+1 M018 - 22087 00002331 E80100 call reg_cls ; go clear the screen - 22088 cls_ret: - 22089 00002334 C3 retn ; exit - 22090 - 22091 ; --------------------------------------------------------------------------- - 22092 - 22093 ; MSDOS 6.0 - 22094 - 22095 ; **************************************************************** - 22096 ; * - 22097 ; * ROUTINE: REG_CLS - 22098 ; * - 22099 ; * FUNCTION: Clear the screen using INT 10H. - 22100 ; * - 22101 ; * INPUT: DL = NUMBER OF COLUMNS - 22102 ; * DH = NUMBER OF ROWS + 22082 00002329 08F6 or dh,dh ; Q:ZERO M01 + 22083 0000232B 7502 jnz short regcls ; *JMP IF NO M01 + 22084 + 22085 ;mov dh,LINESPERPAGE ; SET TO 24 ROWS M01 + 22086 ; 25/04/2023 + 22087 0000232D B619 mov dh,25 + 22088 regcls: + 22089 0000232F FEC6 inc dh ; height+1 M018 + 22090 00002331 E80100 call reg_cls ; go clear the screen + 22091 cls_ret: + 22092 00002334 C3 retn ; exit + 22093 + 22094 ; --------------------------------------------------------------------------- + 22095 + 22096 ; MSDOS 6.0 + 22097 + 22098 ; **************************************************************** + 22099 ; * + 22100 ; * ROUTINE: REG_CLS + 22101 ; * + 22102 ; * FUNCTION: Clear the screen using INT 10H. 22103 ; * - 22104 ; * OUTPUT: none - 22105 ; * - 22106 ; **************************************************************** - 22107 - 22108 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22109 reg_cls: - 22110 ; Set overscan to black. - 22111 - 22112 00002335 FECE dec dh ; decrement rows and columns - 22113 00002337 FECA dec dl ; to zero base - 22114 00002339 52 push dx ; save rows,columns - 22115 ;mov ah,set_color_palette ; set up to set the color to blank - 22116 0000233A B40B mov ah,0Bh - 22117 0000233C 31DB xor bx,bx - 22118 ;int video_io_int ; do int 10h - BIOS video IO - 22119 0000233E CD10 int 10h - 22120 00002340 5A pop dx ; restore rows,colums - 22121 - 22122 00002341 31C0 xor ax,ax ; zero out ax - 22123 00002343 89C1 mov cx,ax ; and cx + 22104 ; * INPUT: DL = NUMBER OF COLUMNS + 22105 ; * DH = NUMBER OF ROWS + 22106 ; * + 22107 ; * OUTPUT: none + 22108 ; * + 22109 ; **************************************************************** + 22110 + 22111 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22112 reg_cls: + 22113 ; Set overscan to black. + 22114 + 22115 00002335 FECE dec dh ; decrement rows and columns + 22116 00002337 FECA dec dl ; to zero base + 22117 00002339 52 push dx ; save rows,columns + 22118 ;mov ah,set_color_palette ; set up to set the color to blank + 22119 0000233A B40B mov ah,0Bh + 22120 0000233C 31DB xor bx,bx + 22121 ;int video_io_int ; do int 10h - BIOS video IO + 22122 0000233E CD10 int 10h + 22123 00002340 5A pop dx ; restore rows,colums 22124 - 22125 ; Scroll active page - 22126 - 22127 ;mov ah,scroll_video_page ; set up to scroll page up - 22128 00002345 B406 mov ah,6 - 22129 ;mov bh,video_attribute ; attribute for blank line - 22130 00002347 B707 mov bh,7 - 22131 00002349 30DB xor bl,bl ; set BL to 0 - 22132 ;int video_io_int ; do int 10h - BIOS video IO - 22133 0000234B CD10 int 10h - 22134 - 22135 ; Seek to cursor to 0,0 - 22136 - 22137 ;M022 following two lines added - 22138 ;mov ah,get_video_state ; get current video page in BH - 22139 0000234D B40F mov ah,0Fh - 22140 ;int video_io_int - 22141 0000234F CD10 int 10h - 22142 ;mov ah,set_cursor_position ; set up to set cursor position - 22143 00002351 B402 mov ah,2 - 22144 00002353 31D2 xor dx,dx ; row and column 0 - 22145 ;M022 mov bh,0 - 22146 ;int video_io_int ; do into 10h - BIOS video IO - 22147 00002355 CD10 int 10h - 22148 - 22149 00002357 C3 retn - 22150 - 22151 ; --------------------------------------------------------------------------- - 22152 - 22153 ; MSDOS 6.0 - 22154 - 22155 ; **************************************************************** - 22156 ; * - 22157 ; * ROUTINE: ANSI_CLS - 22158 ; * - 22159 ; * FUNCTION: Clear the screen using by writing a control code - 22160 ; * to STDOUT. + 22125 00002341 31C0 xor ax,ax ; zero out ax + 22126 00002343 89C1 mov cx,ax ; and cx + 22127 + 22128 ; Scroll active page + 22129 + 22130 ;mov ah,scroll_video_page ; set up to scroll page up + 22131 00002345 B406 mov ah,6 + 22132 ;mov bh,video_attribute ; attribute for blank line + 22133 00002347 B707 mov bh,7 + 22134 00002349 30DB xor bl,bl ; set BL to 0 + 22135 ;int video_io_int ; do int 10h - BIOS video IO + 22136 0000234B CD10 int 10h + 22137 + 22138 ; Seek to cursor to 0,0 + 22139 + 22140 ;M022 following two lines added + 22141 ;mov ah,get_video_state ; get current video page in BH + 22142 0000234D B40F mov ah,0Fh + 22143 ;int video_io_int + 22144 0000234F CD10 int 10h + 22145 ;mov ah,set_cursor_position ; set up to set cursor position + 22146 00002351 B402 mov ah,2 + 22147 00002353 31D2 xor dx,dx ; row and column 0 + 22148 ;M022 mov bh,0 + 22149 ;int video_io_int ; do into 10h - BIOS video IO + 22150 00002355 CD10 int 10h + 22151 + 22152 00002357 C3 retn + 22153 + 22154 ; --------------------------------------------------------------------------- + 22155 + 22156 ; MSDOS 6.0 + 22157 + 22158 ; **************************************************************** + 22159 ; * + 22160 ; * ROUTINE: ANSI_CLS 22161 ; * - 22162 ; * INPUT: none - 22163 ; * - 22164 ; * OUTPUT: none - 22165 ; * - 22166 ; **************************************************************** - 22167 - 22168 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22169 ansi_cls: ;AC000; - 22170 00002358 BE[0394] mov si,CLSSTRING - 22171 ; db 4,1Bh,'[2J' - 22172 0000235B AC lodsb - 22173 0000235C 88C1 mov cl,al ; al = 4 - 22174 0000235E 30ED xor ch,ch - 22175 ;mov ah,Raw_CON_IO - 22176 00002360 B406 mov ah,6 - 22177 clrloop: - 22178 00002362 AC lodsb - 22179 00002363 88C2 mov dl,al - 22180 00002365 CD21 int 21h - 22181 ; DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT - 22182 00002367 E2F9 loop clrloop - 22183 00002369 C3 retn - 22184 - 22185 ;============================================================================ - 22186 ; TCMD2B.ASM, MSDOS 6.0, 1991 - 22187 ;============================================================================ - 22188 ; 08/10/2018 - Retro DOS v3.0 - 22189 - 22190 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 156Dh - 22191 - 22192 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) - 22193 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 206Bh + 22162 ; * FUNCTION: Clear the screen using by writing a control code + 22163 ; * to STDOUT. + 22164 ; * + 22165 ; * INPUT: none + 22166 ; * + 22167 ; * OUTPUT: none + 22168 ; * + 22169 ; **************************************************************** + 22170 + 22171 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22172 ansi_cls: ;AC000; + 22173 00002358 BE[0394] mov si,CLSSTRING + 22174 ; db 4,1Bh,'[2J' + 22175 0000235B AC lodsb + 22176 0000235C 88C1 mov cl,al ; al = 4 + 22177 0000235E 30ED xor ch,ch + 22178 ;mov ah,Raw_CON_IO + 22179 00002360 B406 mov ah,6 + 22180 clrloop: + 22181 00002362 AC lodsb + 22182 00002363 88C2 mov dl,al + 22183 00002365 CD21 int 21h + 22184 ; DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT + 22185 00002367 E2F9 loop clrloop + 22186 00002369 C3 retn + 22187 + 22188 ;============================================================================ + 22189 ; TCMD2B.ASM, MSDOS 6.0, 1991 + 22190 ;============================================================================ + 22191 ; 08/10/2018 - Retro DOS v3.0 + 22192 + 22193 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 156Dh 22194 - 22195 ; --------------------------------------------------------------------------- - 22196 - 22197 ; **************************************************************** - 22198 ; * - 22199 ; * ROUTINE: CTTY - Change console - 22200 ; * - 22201 ; * SYNTAX: CTTY device - 22202 ; * - 22203 ; * FUNCTION: If a valid console device is specified, CTTY will - 22204 ; * duplicate the device handle to STDIN, STDOUT and - 22205 ; * STDERR. This routine returns to LODCOM1. - 22206 ; * - 22207 ; * INPUT: command line at offset 81H - 22208 ; * - 22209 ; * OUTPUT: none - 22210 ; * - 22211 ; **************************************************************** - 22212 - 22213 ; 21/02/2023 - Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM - 22214 ; 08/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 22215 ; 10/06/2023 - 22216 ; 03/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM - 22217 CTTY: - 22218 ; MSDOS 6.0 - 22219 0000236A 1E push ds ;AN000; Get local ES - 22220 0000236B 07 pop es ;AN000; - 22221 0000236C BE8100 mov si,81h ;AC000; Get command argument for CTTY - 22222 0000236F BF[3297] mov di,PARSE_CTTY - 22223 ;AC000; Get address of PARSE_CTTY - 22224 00002372 31C9 xor cx,cx ;AC000; clear cx,dx - 22225 00002374 31D2 xor dx,dx ;AC000; - 22226 00002376 E8F325 call cmd_parse ;AC000; call parser - 22227 - 22228 ;cmp ax,-1 ; 0FFFFh - 22229 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? - 22230 ;je short ctty_error ;AN000; yes - error - 22231 ;;cmp ax,RESULT_NO_ERROR ; 0 ;AN000; did an error occur - 22232 ;and ax,ax ; ax > 0 ? - 22233 ;jnz short ctty_error ;AN000; YES -ERROR - 22234 ; 10/06/2023 - 22235 00002379 40 inc ax ; cmp ax,-1 - 22236 0000237A 7434 jz short ctty_error ; 0FFFFh -> 0 - 22237 0000237C 48 dec ax ; cmp ax,0 - 22238 0000237D 7531 jnz short ctty_error ; 1 -> 0 - 22239 ; ax = 0 - 22240 - 22241 0000237F 56 push si ;AN000; save position in line - 22242 00002380 C536[EFA5] lds si,[PARSE1_ADDR] ;AN000; get address of filespec - 22243 00002384 BF[219E] mov di,SrcBuf ;AN000; get address of srcbuf - 22244 ctty_move_filename: ;AN000; put filespec in srcbuf - 22245 00002387 AC lodsb ;AN000; get a char from buffer - 22246 00002388 AA stosb ;AN000; store in srcbuf - 22247 ;cmp al,END_OF_LINE_OUT ; 0 ;AN000; it char a terminator? - 22248 00002389 08C0 or al,al ; al = 0 ? - 22249 0000238B 75FA jnz short ctty_move_filename ; 26/04/2023 - 22250 ;AN000; no - keep moving - 22251 0000238D 5E pop si ;AN000; get line position back - 22252 0000238E BF[3297] mov di,PARSE_CTTY ;AC000; Get address of PARSE_CTTY - 22253 00002391 E8B101 call parse_check_eol ;AN000; are we at end of line? - 22254 ;jz short nocolon ;AN000; yes - continue - 22255 ; 21/02/2023 - 22256 00002394 751A jnz short ctty_error - 22257 ;ctty_error: - 22258 ;jmp short isbaddev ;AC000; yes - exit - 22259 - 22260 ; 21/02/2023 - 22261 ; MSDOS 3.3 - 22262 ;call SETPATH - 22263 ;dec si - 22264 ;dec si - 22265 ;cmp byte [si],':' - 22266 ;jnz short NOCOLON - 22267 ;mov byte [si],0 - 22268 nocolon: - 22269 ; 21/02/2023 - 22270 ; MSDOS 6.0 - 22271 00002396 BA[219E] mov dx,SrcBuf - 22272 ;NOCOLON: - 22273 ; MSDOS 3.3 & MSDOS 6.0 - 22274 ;;mov ax,(OPEN SHL 8) OR 2 ; Read and write - 22275 ;mov ax,(OPEN<<8)|2 ; 3D02h - 22276 00002399 B8023D mov ax,3D02h ; 21/02/2023 - 22277 0000239C CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 22278 ; DS:DX -> ASCIZ filename - 22279 ; AL = access mode - 22280 ; 2 - read & write - 22281 0000239E 7210 jc short isbaddev - 22282 000023A0 89C3 mov bx,ax - 22283 ;mov ax,IOCTL*256 ; 4400h - 22284 000023A2 B80044 mov ax,4400h - 22285 000023A5 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 22286 ; BX = file or device handle - 22287 000023A7 F6C280 test dl,80h - 22288 000023AA 750C jnz short devisok - 22289 closedev: - 22290 ;mov ah,CLOSE ; 3Eh ; Close initial handle - 22291 000023AC B43E mov ah,3Eh - 22292 000023AE CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 22293 ; BX = file handle - 22294 ctty_error: - 22295 isbaddev: - 22296 000023B0 BA[5791] mov dx,BADDEV_PTR - 22297 000023B3 E87230 call std_printf - 22298 000023B6 EB40 jmp short resret - 22299 - 22300 ;nop - 22301 devisok: - 22302 ; 21/02/2023 - 22303 ; MSDOS 6.0 - 22304 000023B8 52 push dx ;AN007; save device info - 22305 ; 08/06/2023 - 22306 000023B9 A1[FA91] mov ax,[acrlf_ptr] ;AN021; get message number for 0d, 0a - 22307 ;mov dh,util_msg_class - 22308 000023BC B6FF mov dh,-1 ; 0FFh ;AN021; this is a utility message - 22309 000023BE 53 push bx ;AN021; save handle - 22310 000023BF E84931 call TSYSGETMSG ;AN021; get the address of the message - 22311 000023C2 89F2 mov dx,si ;AN021; get address into dx - 22312 ;mov ax,(Write shl 8) - 22313 000023C4 B80040 mov ax,4000h ;AN007; write to device - 22314 000023C7 B90200 mov cx,2 ;AN007; write two bytes - 22315 000023CA CD21 int 21h ;AN007; - 22316 000023CC 5B pop bx ;AN021; get back handle - 22317 000023CD 5A pop dx ;AN007; get back device info - 22318 000023CE 72DC jc short closedev ;AN007; if error, quit - 22319 - 22320 ; MSDOS 3.3 & MSDOS 6.0 - 22321 000023D0 30F6 xor dh,dh - 22322 000023D2 80CA03 or dl,3 - 22323 ;;mov ax,(IOCTL SHL 8) OR 1 - 22324 ;mov ax,(IOCTL<<8)|1 ; 4401h - 22325 000023D5 B80144 mov ax,4401h - 22326 000023D8 CD21 int 21h ; DOS - 2+ - IOCTL - SET DEVICE INFORMATION - 22327 ; BX = device handle,DH = 0 - 22328 ; DL = device information to set - 22329 ; (bits 0-7 from function 0) - 22330 000023DA 53 push bx - 22331 000023DB B90300 mov cx,3 - 22332 000023DE 31DB xor bx,bx - 22333 iclloop: ; Close basic handles - 22334 ;mov ah,CLOSE ; 3Eh - 22335 000023E0 B43E mov ah,3Eh - 22336 000023E2 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 22337 ; BX = file handle - 22338 000023E4 43 inc bx - 22339 000023E5 E2F9 loop iclloop - 22340 000023E7 5B pop bx ; Get handle - 22341 ;mov ah,XDUP ; 45h - 22342 000023E8 B445 mov ah,45h - 22343 000023EA CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) - 22344 ; BX = file handle to duplicate - 22345 ;mov ah,XDUP ; 45h - 22346 000023EC B445 mov ah,45h - 22347 000023EE CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) - 22348 ; BX = file handle to duplicate - 22349 ;mov ah,XDUP ; 45h - 22350 000023F0 B445 mov ah,45h - 22351 000023F2 CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) - 22352 ; BX = file handle to duplicate - 22353 ;mov ah,CLOSE ; 3Eh - 22354 000023F4 B43E mov ah,3Eh - 22355 000023F6 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 22356 ; BX = file handle - 22357 resret: - 22358 000023F8 8E1E[F59B] mov ds,[RESSEG] - 22359 000023FC 1E push ds - 22360 ;mov ax,[18h] - 22361 000023FD A11800 mov ax,[PDB.JFN_TABLE] ; Get new 0 and 1 - 22362 00002400 A3[9F02] mov [Io_Save],ax - 22363 ;;;mov ax,31Eh ; MSDOS 3.3 - 22364 ;;mov ax,LODCOM1 - 22365 ;;mov ax,offset DATARES:TrnLodCom1_Trap ; MSDOS 6.0 - 22366 ;mov ax,175h ; MSDOS 6.0 - 22367 00002403 B8[D600] mov ax,TrnLodCom1_Trap - 22368 00002406 50 push ax - 22369 - 22370 00002407 CB retf ; Far return - 22371 - 22372 ; --------------------------------------------------------------------------- - 22373 - 22374 ;**************************************************************** - 22375 ;* - 22376 ;* ROUTINE: CHCP - Change code page internal command - 22377 ;* (added DOS 3.30 07/21/86) + 22195 ; 21/02/2023 - Retro DOS v4.0 (& v4.1) + 22196 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 206Bh + 22197 + 22198 ; --------------------------------------------------------------------------- + 22199 + 22200 ; **************************************************************** + 22201 ; * + 22202 ; * ROUTINE: CTTY - Change console + 22203 ; * + 22204 ; * SYNTAX: CTTY device + 22205 ; * + 22206 ; * FUNCTION: If a valid console device is specified, CTTY will + 22207 ; * duplicate the device handle to STDIN, STDOUT and + 22208 ; * STDERR. This routine returns to LODCOM1. + 22209 ; * + 22210 ; * INPUT: command line at offset 81H + 22211 ; * + 22212 ; * OUTPUT: none + 22213 ; * + 22214 ; **************************************************************** + 22215 + 22216 ; 21/02/2023 - Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM + 22217 ; 08/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 22218 ; 10/06/2023 + 22219 ; 03/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM + 22220 CTTY: + 22221 ; MSDOS 6.0 + 22222 0000236A 1E push ds ;AN000; Get local ES + 22223 0000236B 07 pop es ;AN000; + 22224 0000236C BE8100 mov si,81h ;AC000; Get command argument for CTTY + 22225 0000236F BF[3297] mov di,PARSE_CTTY + 22226 ;AC000; Get address of PARSE_CTTY + 22227 00002372 31C9 xor cx,cx ;AC000; clear cx,dx + 22228 00002374 31D2 xor dx,dx ;AC000; + 22229 00002376 E8F325 call cmd_parse ;AC000; call parser + 22230 + 22231 ;cmp ax,-1 ; 0FFFFh + 22232 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? + 22233 ;je short ctty_error ;AN000; yes - error + 22234 ;;cmp ax,RESULT_NO_ERROR ; 0 ;AN000; did an error occur + 22235 ;and ax,ax ; ax > 0 ? + 22236 ;jnz short ctty_error ;AN000; YES -ERROR + 22237 ; 10/06/2023 + 22238 00002379 40 inc ax ; cmp ax,-1 + 22239 0000237A 7434 jz short ctty_error ; 0FFFFh -> 0 + 22240 0000237C 48 dec ax ; cmp ax,0 + 22241 0000237D 7531 jnz short ctty_error ; 1 -> 0 + 22242 ; ax = 0 + 22243 + 22244 0000237F 56 push si ;AN000; save position in line + 22245 00002380 C536[EFA5] lds si,[PARSE1_ADDR] ;AN000; get address of filespec + 22246 00002384 BF[219E] mov di,SrcBuf ;AN000; get address of srcbuf + 22247 ctty_move_filename: ;AN000; put filespec in srcbuf + 22248 00002387 AC lodsb ;AN000; get a char from buffer + 22249 00002388 AA stosb ;AN000; store in srcbuf + 22250 ;cmp al,END_OF_LINE_OUT ; 0 ;AN000; it char a terminator? + 22251 00002389 08C0 or al,al ; al = 0 ? + 22252 0000238B 75FA jnz short ctty_move_filename ; 26/04/2023 + 22253 ;AN000; no - keep moving + 22254 0000238D 5E pop si ;AN000; get line position back + 22255 0000238E BF[3297] mov di,PARSE_CTTY ;AC000; Get address of PARSE_CTTY + 22256 00002391 E8B101 call parse_check_eol ;AN000; are we at end of line? + 22257 ;jz short nocolon ;AN000; yes - continue + 22258 ; 21/02/2023 + 22259 00002394 751A jnz short ctty_error + 22260 ;ctty_error: + 22261 ;jmp short isbaddev ;AC000; yes - exit + 22262 + 22263 ; 21/02/2023 + 22264 ; MSDOS 3.3 + 22265 ;call SETPATH + 22266 ;dec si + 22267 ;dec si + 22268 ;cmp byte [si],':' + 22269 ;jnz short NOCOLON + 22270 ;mov byte [si],0 + 22271 nocolon: + 22272 ; 21/02/2023 + 22273 ; MSDOS 6.0 + 22274 00002396 BA[219E] mov dx,SrcBuf + 22275 ;NOCOLON: + 22276 ; MSDOS 3.3 & MSDOS 6.0 + 22277 ;;mov ax,(OPEN SHL 8) OR 2 ; Read and write + 22278 ;mov ax,(OPEN<<8)|2 ; 3D02h + 22279 00002399 B8023D mov ax,3D02h ; 21/02/2023 + 22280 0000239C CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 22281 ; DS:DX -> ASCIZ filename + 22282 ; AL = access mode + 22283 ; 2 - read & write + 22284 0000239E 7210 jc short isbaddev + 22285 000023A0 89C3 mov bx,ax + 22286 ;mov ax,IOCTL*256 ; 4400h + 22287 000023A2 B80044 mov ax,4400h + 22288 000023A5 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 22289 ; BX = file or device handle + 22290 000023A7 F6C280 test dl,80h + 22291 000023AA 750C jnz short devisok + 22292 closedev: + 22293 ;mov ah,CLOSE ; 3Eh ; Close initial handle + 22294 000023AC B43E mov ah,3Eh + 22295 000023AE CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 22296 ; BX = file handle + 22297 ctty_error: + 22298 isbaddev: + 22299 000023B0 BA[5791] mov dx,BADDEV_PTR + 22300 000023B3 E87230 call std_printf + 22301 000023B6 EB40 jmp short resret + 22302 + 22303 ;nop + 22304 devisok: + 22305 ; 21/02/2023 + 22306 ; MSDOS 6.0 + 22307 000023B8 52 push dx ;AN007; save device info + 22308 ; 08/06/2023 + 22309 000023B9 A1[FA91] mov ax,[acrlf_ptr] ;AN021; get message number for 0d, 0a + 22310 ;mov dh,util_msg_class + 22311 000023BC B6FF mov dh,-1 ; 0FFh ;AN021; this is a utility message + 22312 000023BE 53 push bx ;AN021; save handle + 22313 000023BF E84931 call TSYSGETMSG ;AN021; get the address of the message + 22314 000023C2 89F2 mov dx,si ;AN021; get address into dx + 22315 ;mov ax,(Write shl 8) + 22316 000023C4 B80040 mov ax,4000h ;AN007; write to device + 22317 000023C7 B90200 mov cx,2 ;AN007; write two bytes + 22318 000023CA CD21 int 21h ;AN007; + 22319 000023CC 5B pop bx ;AN021; get back handle + 22320 000023CD 5A pop dx ;AN007; get back device info + 22321 000023CE 72DC jc short closedev ;AN007; if error, quit + 22322 + 22323 ; MSDOS 3.3 & MSDOS 6.0 + 22324 000023D0 30F6 xor dh,dh + 22325 000023D2 80CA03 or dl,3 + 22326 ;;mov ax,(IOCTL SHL 8) OR 1 + 22327 ;mov ax,(IOCTL<<8)|1 ; 4401h + 22328 000023D5 B80144 mov ax,4401h + 22329 000023D8 CD21 int 21h ; DOS - 2+ - IOCTL - SET DEVICE INFORMATION + 22330 ; BX = device handle,DH = 0 + 22331 ; DL = device information to set + 22332 ; (bits 0-7 from function 0) + 22333 000023DA 53 push bx + 22334 000023DB B90300 mov cx,3 + 22335 000023DE 31DB xor bx,bx + 22336 iclloop: ; Close basic handles + 22337 ;mov ah,CLOSE ; 3Eh + 22338 000023E0 B43E mov ah,3Eh + 22339 000023E2 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 22340 ; BX = file handle + 22341 000023E4 43 inc bx + 22342 000023E5 E2F9 loop iclloop + 22343 000023E7 5B pop bx ; Get handle + 22344 ;mov ah,XDUP ; 45h + 22345 000023E8 B445 mov ah,45h + 22346 000023EA CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) + 22347 ; BX = file handle to duplicate + 22348 ;mov ah,XDUP ; 45h + 22349 000023EC B445 mov ah,45h + 22350 000023EE CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) + 22351 ; BX = file handle to duplicate + 22352 ;mov ah,XDUP ; 45h + 22353 000023F0 B445 mov ah,45h + 22354 000023F2 CD21 int 21h ; DOS - 2+ - CREATE DUPLICATE HANDLE (DUP) + 22355 ; BX = file handle to duplicate + 22356 ;mov ah,CLOSE ; 3Eh + 22357 000023F4 B43E mov ah,3Eh + 22358 000023F6 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 22359 ; BX = file handle + 22360 resret: + 22361 000023F8 8E1E[F59B] mov ds,[RESSEG] + 22362 000023FC 1E push ds + 22363 ;mov ax,[18h] + 22364 000023FD A11800 mov ax,[PDB.JFN_TABLE] ; Get new 0 and 1 + 22365 00002400 A3[9F02] mov [Io_Save],ax + 22366 ;;;mov ax,31Eh ; MSDOS 3.3 + 22367 ;;mov ax,LODCOM1 + 22368 ;;mov ax,offset DATARES:TrnLodCom1_Trap ; MSDOS 6.0 + 22369 ;mov ax,175h ; MSDOS 6.0 + 22370 00002403 B8[D600] mov ax,TrnLodCom1_Trap + 22371 00002406 50 push ax + 22372 + 22373 00002407 CB retf ; Far return + 22374 + 22375 ; --------------------------------------------------------------------------- + 22376 + 22377 ;**************************************************************** 22378 ;* - 22379 ;* SYNTAX: CHCP [xxx] - 22380 ;* where xxx is a valid code page + 22379 ;* ROUTINE: CHCP - Change code page internal command + 22380 ;* (added DOS 3.30 07/21/86) 22381 ;* - 22382 ;* FUNCTION: If xxx is specified, CHCP will use INT 21H function - 22383 ;* 6402H to set the code page to xxxx. If no parameters - 22384 ;* are specified, CHCP will use INT 21H function 6401H - 22385 ;* to get global code page and display it to the user. - 22386 ;* - 22387 ;* INPUT: command line at offset 81H - 22388 ;* - 22389 ;* OUTPUT: none - 22390 ;* - 22391 ;**************************************************************** - 22392 - 22393 NLSFUNC_installed equ 0FFh - 22394 set_global_cp equ 2 - 22395 get_global_cp equ 1 - 22396 - 22397 ; 21/02/2023 - Retro DOS v4.0 - 22398 ; 09/06/2023 - Retro DOS v4.2 COMMAND.COM - 22399 ; 10/06/2023 - 22400 ; 03/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM - 22401 CHCP: - 22402 ; MSDOS 6.0 - 22403 00002408 1E push ds ;AN000; Get local ES - 22404 00002409 07 pop es ;AN000; - 22405 0000240A BE8100 mov si,81h ;AC000; Get command argument for CHCP - 22406 0000240D BF[3396] mov di,PARSE_CHCP - 22407 ;AN000; Get address of PARSE_CHCP - 22408 00002410 31C9 xor cx,cx ;AC000; clear cx,dx - 22409 00002412 31D2 xor dx,dx ;AC000; - 22410 00002414 E84401 call Parse_With_Msg ;AC018; call parser - 22411 - 22412 ;cmp ax,-1 - 22413 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? - 22414 ;;jne short setcp ;AC000; no go get number & set code page - 22415 ;je short getcp ;AC000; yes - no parm - get code page - 22416 ;setcp: - 22417 ;;cmp ax,0 - 22418 ;;cmp ax,RESULT_NO_ERROR - 22419 ; ;AN000; did we have an error? - 22420 ;;jne short cp_error ;AC018; yes - go issue message - 22421 ;and ax,ax ; ax > 0 ? - 22422 ;jnz short cp_error - 22423 ; 10/06/2023 - 22424 00002417 40 inc ax ; cmp ax,-1 - 22425 00002418 745C jz short getcp ; 0FFFFh -> 0 - 22426 0000241A 48 dec ax ; cmp ax,0 - 22427 0000241B 7556 jnz short cp_error ; 1 -> 0 - 22428 ; ax = 0 - 22429 - 22430 ;;push cx ;AN000; save positional count - 22431 ;mov bx,PARSE1_ADDR ;AN000; get number returned - 22432 ;;mov cx,[bx] ;AN000; into cx - 22433 ;;mov [system_cpage],cx - 22434 ; ;AN000; save user input number - 22435 ;;pop cx ;AC000; restore positional count - 22436 ;; 21/02/2023 - 22437 ;mov di,[bx] - 22438 ;mov [system_cpage],di - 22439 ; 09/06/2023 - 22440 0000241D 8B1E[EFA5] mov bx,[PARSE1_ADDR] - 22441 00002421 891E[9A9D] mov [system_cpage],bx - 22442 ; - 22443 00002425 BF[3396] mov di,PARSE_CHCP ;AN000; Get address of PARSE_CHCP - 22444 00002428 E81A01 call parse_check_eol ;AN000; are we at end of line? - 22445 0000242B 7546 jnz short cp_error ;AC000; no - exit - 22446 okset: - 22447 ;;mov ah,NLSFUNC ;AN000; see if NLSFUNC installed - 22448 ;mov ah,14h - 22449 ;mov al,0 ;AN000; - 22450 0000242D B80014 mov ax,1400h - 22451 00002430 CD2F int 2Fh ;AN000; - 22452 ;cmp al,0FFh - 22453 00002432 3CFF cmp al,NLSFUNC_installed - 22454 ;AN000; - 22455 00002434 7405 je short got_NLS ;AN000; Yes - continue - 22456 00002436 BA[9B90] mov dx,NLSFUNC_PTR - 22457 ;AN000; no - set up error message - 22458 00002439 EB38 jmp short cp_error ;AN000; error exit - 22459 - 22460 ; 21/02/2023 - 22461 got_NLS: - 22462 ; MSDOS 6.0 - 22463 0000243B 8B1E[9A9D] mov bx,[system_cpage] - 22464 ;AN000; get user input code page - 22465 ;SET_CP_TBL_NUM: - 22466 ;mov [SYSTEM_CPAGE],bx ; MSDOS 3.3 - 22467 ; - 22468 ; MSDOS 3.3 & MSDOS 6.0 - 22469 ;;mov ah,GETSETCDPG ;get/set global code page function - 22470 ;mov ah,66h - 22471 ;;mov al,set_global_cp - 22472 ;mov al,2 ;minor - set - 22473 ; 26/04/2023 - 22474 0000243F B80266 mov ax,6602h - 22475 00002442 CD21 int 21h - 22476 ; DOS - 3.3+ - SET GLOBAL CODE PAGE TABLE - 22477 ; BX = active code page - 22478 ; DX = system code page (active page at boot time) - 22479 - 22480 00002444 733F jnc short chcp_return - 22481 ;no error - exit + 22382 ;* SYNTAX: CHCP [xxx] + 22383 ;* where xxx is a valid code page + 22384 ;* + 22385 ;* FUNCTION: If xxx is specified, CHCP will use INT 21H function + 22386 ;* 6402H to set the code page to xxxx. If no parameters + 22387 ;* are specified, CHCP will use INT 21H function 6401H + 22388 ;* to get global code page and display it to the user. + 22389 ;* + 22390 ;* INPUT: command line at offset 81H + 22391 ;* + 22392 ;* OUTPUT: none + 22393 ;* + 22394 ;**************************************************************** + 22395 + 22396 NLSFUNC_installed equ 0FFh + 22397 set_global_cp equ 2 + 22398 get_global_cp equ 1 + 22399 + 22400 ; 21/02/2023 - Retro DOS v4.0 + 22401 ; 09/06/2023 - Retro DOS v4.2 COMMAND.COM + 22402 ; 10/06/2023 + 22403 ; 03/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM + 22404 CHCP: + 22405 ; MSDOS 6.0 + 22406 00002408 1E push ds ;AN000; Get local ES + 22407 00002409 07 pop es ;AN000; + 22408 0000240A BE8100 mov si,81h ;AC000; Get command argument for CHCP + 22409 0000240D BF[3396] mov di,PARSE_CHCP + 22410 ;AN000; Get address of PARSE_CHCP + 22411 00002410 31C9 xor cx,cx ;AC000; clear cx,dx + 22412 00002412 31D2 xor dx,dx ;AC000; + 22413 00002414 E84401 call Parse_With_Msg ;AC018; call parser + 22414 + 22415 ;cmp ax,-1 + 22416 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? + 22417 ;;jne short setcp ;AC000; no go get number & set code page + 22418 ;je short getcp ;AC000; yes - no parm - get code page + 22419 ;setcp: + 22420 ;;cmp ax,0 + 22421 ;;cmp ax,RESULT_NO_ERROR + 22422 ; ;AN000; did we have an error? + 22423 ;;jne short cp_error ;AC018; yes - go issue message + 22424 ;and ax,ax ; ax > 0 ? + 22425 ;jnz short cp_error + 22426 ; 10/06/2023 + 22427 00002417 40 inc ax ; cmp ax,-1 + 22428 00002418 745C jz short getcp ; 0FFFFh -> 0 + 22429 0000241A 48 dec ax ; cmp ax,0 + 22430 0000241B 7556 jnz short cp_error ; 1 -> 0 + 22431 ; ax = 0 + 22432 + 22433 ;;push cx ;AN000; save positional count + 22434 ;mov bx,PARSE1_ADDR ;AN000; get number returned + 22435 ;;mov cx,[bx] ;AN000; into cx + 22436 ;;mov [system_cpage],cx + 22437 ; ;AN000; save user input number + 22438 ;;pop cx ;AC000; restore positional count + 22439 ;; 21/02/2023 + 22440 ;mov di,[bx] + 22441 ;mov [system_cpage],di + 22442 ; 09/06/2023 + 22443 0000241D 8B1E[EFA5] mov bx,[PARSE1_ADDR] + 22444 00002421 891E[9A9D] mov [system_cpage],bx + 22445 ; + 22446 00002425 BF[3396] mov di,PARSE_CHCP ;AN000; Get address of PARSE_CHCP + 22447 00002428 E81A01 call parse_check_eol ;AN000; are we at end of line? + 22448 0000242B 7546 jnz short cp_error ;AC000; no - exit + 22449 okset: + 22450 ;;mov ah,NLSFUNC ;AN000; see if NLSFUNC installed + 22451 ;mov ah,14h + 22452 ;mov al,0 ;AN000; + 22453 0000242D B80014 mov ax,1400h + 22454 00002430 CD2F int 2Fh ;AN000; + 22455 ;cmp al,0FFh + 22456 00002432 3CFF cmp al,NLSFUNC_installed + 22457 ;AN000; + 22458 00002434 7405 je short got_NLS ;AN000; Yes - continue + 22459 00002436 BA[9B90] mov dx,NLSFUNC_PTR + 22460 ;AN000; no - set up error message + 22461 00002439 EB38 jmp short cp_error ;AN000; error exit + 22462 + 22463 ; 21/02/2023 + 22464 got_NLS: + 22465 ; MSDOS 6.0 + 22466 0000243B 8B1E[9A9D] mov bx,[system_cpage] + 22467 ;AN000; get user input code page + 22468 ;SET_CP_TBL_NUM: + 22469 ;mov [SYSTEM_CPAGE],bx ; MSDOS 3.3 + 22470 ; + 22471 ; MSDOS 3.3 & MSDOS 6.0 + 22472 ;;mov ah,GETSETCDPG ;get/set global code page function + 22473 ;mov ah,66h + 22474 ;;mov al,set_global_cp + 22475 ;mov al,2 ;minor - set + 22476 ; 26/04/2023 + 22477 0000243F B80266 mov ax,6602h + 22478 00002442 CD21 int 21h + 22479 ; DOS - 3.3+ - SET GLOBAL CODE PAGE TABLE + 22480 ; BX = active code page + 22481 ; DX = system code page (active page at boot time) 22482 - 22483 00002446 83F802 cmp ax,ERROR_FILE_NOT_FOUND ; 2 - 22484 00002449 7515 jnz short chcp_other_error + 22483 00002444 733F jnc short chcp_return + 22484 ;no error - exit 22485 - 22486 ;mov ah,GETEXTENDEDERROR ; 59h - 22487 0000244B B459 mov ah,59h - 22488 0000244D 31DB xor bx,bx - 22489 0000244F CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE - 22490 ; BX = version code (0000h for DOS 3.x) - 22491 - 22492 00002451 83F80D cmp ax,ERROR_INVALID_DATA ; 0Dh ; invalid code page - 22493 00002454 7505 jne short no_countrysys ; 26/04/2023 - 22494 ;mov dx,FNOTFOUNDPTR ; MSDOS 3.3 - 22495 00002456 BA[9E90] mov dx,INV_CODE_PAGE - 22496 ;jmp cerror - 22497 00002459 EB18 jmp short cp_error - 22498 - 22499 ; 21/02/2023 - 22500 ; MSDOS 6.0 (& 5.0) COMMAND.COM - 22501 no_countrysys: - 22502 ;M045; mov byte [msg_disp_class],ext_msg_class - 22503 ; ;AN000; set up extended error msg class - 22504 ;M045; mov dx,extend_buf_ptr ;AC000; get extended message pointer - 22505 ;M045; mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND - 22506 ;AN000; get message number in control block - 22507 0000245B BA[C692] mov dx,NoCntry_Ptr - 22508 0000245E EB13 jmp short cp_error - 22509 - 22510 chcp_other_error: ; end of p716 - 22511 ;mov ah,GETEXTENDEDERROR ; 59h ;error - see what it is - 22512 00002460 B459 mov ah,59h - 22513 00002462 31DB xor bx,bx - 22514 00002464 CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE - 22515 ; BX = version code (0000h for DOS 3.x) - 22516 00002466 83F841 cmp ax,65 ;was it access denied? - 22517 00002469 7505 jne short none_set ;no - assume all failed - 22518 0000246B BA[7F90] mov dx,cp_not_all_ptr - 22519 ;set up message - 22520 ;jmp cerror ;AC000; error exit - 22521 0000246E EB03 jmp short cp_error - 22522 none_set: - 22523 00002470 BA[7190] mov dx,cp_not_set_ptr - 22524 ;set up message - 22525 cp_error: - 22526 00002473 E9B008 jmp cerror ;exit - 22527 getcp: - 22528 ;;mov ah,GETSETCDPG ; 66h - 22529 ;mov ah,66h ;get/set global code page function - 22530 ;;mov al,get_global_cp ; 1 - 22531 ;mov al,1 ;minor - get - 22532 ; 26/04/2023 - 22533 00002476 B80166 mov ax,6601h - 22534 00002479 CD21 int 21h ; DOS - 3.3+ - GET GLOBAL CODE PAGE TABLE - 22535 0000247B 891E[9A9D] mov [system_cpage],bx - 22536 ;get active cp for output - 22537 0000247F BA[8D90] mov dx,cp_active_ptr - 22538 00002482 E8A32F call std_printf ;print it out - 22539 chcp_return: - 22540 00002485 C3 retn - 22541 - 22542 ; --------------------------------------------------------------------------- - 22543 - 22544 ; **************************************************************** - 22545 ; * - 22546 ; * ROUTINE: TRUENAME - 22547 ; * - 22548 ; * FUNCTION: Entry point for the internal TRUENAME command. - 22549 ; * Parses the command line. If a path is found, set - 22550 ; * SRCXNAME to path. If only a drive letter is found, - 22551 ; * set SRCXNAME to the drive letter. If no path - 22552 ; * is found, set the path of SRCXNAME to dot (.) for - 22553 ; * current directory. Use the NAME TRANSLATE system - 22554 ; * call to get the real name and then display the - 22555 ; * real name. If an error occurs issue an error - 22556 ; * message and transfer control to CERROR. - 22557 ; * - 22558 ; * INPUT: command line at offset 81H - 22559 ; * - 22560 ; * OUTPUT: none - 22561 ; * - 22562 ; **************************************************************** - 22563 - 22564 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22565 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2197h + 22486 00002446 83F802 cmp ax,ERROR_FILE_NOT_FOUND ; 2 + 22487 00002449 7515 jnz short chcp_other_error + 22488 + 22489 ;mov ah,GETEXTENDEDERROR ; 59h + 22490 0000244B B459 mov ah,59h + 22491 0000244D 31DB xor bx,bx + 22492 0000244F CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE + 22493 ; BX = version code (0000h for DOS 3.x) + 22494 + 22495 00002451 83F80D cmp ax,ERROR_INVALID_DATA ; 0Dh ; invalid code page + 22496 00002454 7505 jne short no_countrysys ; 26/04/2023 + 22497 ;mov dx,FNOTFOUNDPTR ; MSDOS 3.3 + 22498 00002456 BA[9E90] mov dx,INV_CODE_PAGE + 22499 ;jmp cerror + 22500 00002459 EB18 jmp short cp_error + 22501 + 22502 ; 21/02/2023 + 22503 ; MSDOS 6.0 (& 5.0) COMMAND.COM + 22504 no_countrysys: + 22505 ;M045; mov byte [msg_disp_class],ext_msg_class + 22506 ; ;AN000; set up extended error msg class + 22507 ;M045; mov dx,extend_buf_ptr ;AC000; get extended message pointer + 22508 ;M045; mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND + 22509 ;AN000; get message number in control block + 22510 0000245B BA[C692] mov dx,NoCntry_Ptr + 22511 0000245E EB13 jmp short cp_error + 22512 + 22513 chcp_other_error: ; end of p716 + 22514 ;mov ah,GETEXTENDEDERROR ; 59h ;error - see what it is + 22515 00002460 B459 mov ah,59h + 22516 00002462 31DB xor bx,bx + 22517 00002464 CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE + 22518 ; BX = version code (0000h for DOS 3.x) + 22519 00002466 83F841 cmp ax,65 ;was it access denied? + 22520 00002469 7505 jne short none_set ;no - assume all failed + 22521 0000246B BA[7F90] mov dx,cp_not_all_ptr + 22522 ;set up message + 22523 ;jmp cerror ;AC000; error exit + 22524 0000246E EB03 jmp short cp_error + 22525 none_set: + 22526 00002470 BA[7190] mov dx,cp_not_set_ptr + 22527 ;set up message + 22528 cp_error: + 22529 00002473 E9B008 jmp cerror ;exit + 22530 getcp: + 22531 ;;mov ah,GETSETCDPG ; 66h + 22532 ;mov ah,66h ;get/set global code page function + 22533 ;;mov al,get_global_cp ; 1 + 22534 ;mov al,1 ;minor - get + 22535 ; 26/04/2023 + 22536 00002476 B80166 mov ax,6601h + 22537 00002479 CD21 int 21h ; DOS - 3.3+ - GET GLOBAL CODE PAGE TABLE + 22538 0000247B 891E[9A9D] mov [system_cpage],bx + 22539 ;get active cp for output + 22540 0000247F BA[8D90] mov dx,cp_active_ptr + 22541 00002482 E8A32F call std_printf ;print it out + 22542 chcp_return: + 22543 00002485 C3 retn + 22544 + 22545 ; --------------------------------------------------------------------------- + 22546 + 22547 ; **************************************************************** + 22548 ; * + 22549 ; * ROUTINE: TRUENAME + 22550 ; * + 22551 ; * FUNCTION: Entry point for the internal TRUENAME command. + 22552 ; * Parses the command line. If a path is found, set + 22553 ; * SRCXNAME to path. If only a drive letter is found, + 22554 ; * set SRCXNAME to the drive letter. If no path + 22555 ; * is found, set the path of SRCXNAME to dot (.) for + 22556 ; * current directory. Use the NAME TRANSLATE system + 22557 ; * call to get the real name and then display the + 22558 ; * real name. If an error occurs issue an error + 22559 ; * message and transfer control to CERROR. + 22560 ; * + 22561 ; * INPUT: command line at offset 81H + 22562 ; * + 22563 ; * OUTPUT: none + 22564 ; * + 22565 ; **************************************************************** 22566 - 22567 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 22568 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2741h + 22567 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22568 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2197h 22569 - 22570 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 22571 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:257Dh + 22570 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 22571 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2741h 22572 - 22573 TRUENAME: ;AN000; TRUENAME entry point - 22574 00002486 1E push ds ;AN000; Get local ES - 22575 00002487 07 pop es ;AN000; - 22576 00002488 BE8100 mov si,81h ;AN000; Get command line - 22577 0000248B BF[9196] mov di,PARSE_CHDIR ;AN000; Get address of PARSE_CHDIR - 22578 0000248E 31C9 xor cx,cx ;AN000; clear cx,dx - 22579 00002490 31D2 xor dx,dx ;AN000; - 22580 00002492 E8C600 call Parse_With_Msg ;AC018; call parser - 22581 - 22582 00002495 BF[2399] mov di,SRCXNAME ;AN000; get address of srcxname - 22583 ;cmp ax,0FFFFh - 22584 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? - 22585 ;je short tn_eol ;AN000; yes - go process - 22586 ;; 22/02/2023 - 22587 ;;cmp ax,0 - 22588 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? - 22589 ;;jne short tn_parse_error ;AN000; yes - go issue message - 22590 ;and ax,ax ; ax = 0 ? - 22591 ;jnz short tn_parse_error ; no, parse error - 22592 ; 10/06/2023 - 22593 00002498 40 inc ax ; 0FFFFh -> 0 ; cmp ax,0FFFFh - 22594 00002499 7433 jz short tn_eol ; ah = 0 ; * - 22595 0000249B 48 dec ax ; 1 -> 0 ; cmp ax, 0 - 22596 0000249C 752D jnz short tn_parse_error - 22597 - 22598 ;cmp byte [PARSE1_TYPE],6 - 22599 0000249E 803E[EBA5]06 cmp byte [PARSE1_TYPE],result_drive - 22600 ;AN000; was a drive entered? - 22601 ;je short tn_drive ;AN000; yes - go process - 22602 ;jmp short tn_filespec ;AN000; nothing else - must be filespec - 22603 ; 23/02/2023 - 22604 000024A3 7512 jne short tn_filespec - 22605 - 22606 ;tn_eol: - 22607 ; ;mov ah,0 ;AN000; no parameters on line - 22608 ; mov ah,END_OF_LINE_OUT ;AN000; set buffer to . - 22609 ; ;mov al,dot_chr ;AN000; for current dir - 22610 ; mov al,'.' - 22611 ; stosw ;AN000; store in srcxname - 22612 ; jmp short tn_doit ;AN000; go do command - 22613 - 22614 tn_drive: ;AN000; a drive was entered - 22615 000024A5 56 push si ;AN000; save position in line - 22616 000024A6 BE[EFA5] mov si,PARSE1_ADDR ;AN000; get address of drive - 22617 000024A9 AC lodsb ;AN000; get the drive number - 22618 000024AA 0440 add al,"A"-1 ; 40h ;AN000; convert it to char - 22619 000024AC AA stosb ;AN000; store it in srcxname - 22620 ;mov ax,dot_colon ;AN000; get colon and . and - 22621 000024AD B83A2E mov ax,':.' ; 2E3Ah ; ah=".", al=":" - 22622 000024B0 AB stosw ;AN000; store in srcxname - 22623 ;mov al,0 - 22624 000024B1 B000 mov al,END_OF_LINE_OUT ;AN000; put a terminator char - 22625 000024B3 AA stosb ;AN000; - 22626 000024B4 5E pop si ;AN000; get line position back - 22627 000024B5 EB0C jmp short tn_check_eol ;AN000; check to make sure eol - 22628 - 22629 tn_filespec: ;AN000; a filespec was entered - 22630 000024B7 56 push si ;AN000; save position in line - 22631 000024B8 C536[EFA5] lds si,[PARSE1_ADDR] ;AN000; get address of filespec - 22632 - 22633 tn_move_filename: ;AN000; put filespec in srcxname - 22634 000024BC AC lodsb ;AN000; get a char from buffer - 22635 000024BD AA stosb ;AN000; store in srcxname - 22636 ;;cmp al,0 - 22637 ;cmp al,END_OF_LINE_OUT ;AN000; it char a terminator? - 22638 000024BE 08C0 or al,al ; al = 0 ? - 22639 000024C0 75FA jnz short tn_move_filename ;AN000; no - keep moving - 22640 000024C2 5E pop si ;AN000; get line position back - 22641 - 22642 tn_check_eol: ;AN000; make sure no extra parms - 22643 000024C3 BF[9196] mov di,PARSE_CHDIR ;AN000; get address of parse_chdir - 22644 000024C6 E87C00 call parse_check_eol ;AN000; are we at end of line? - 22645 000024C9 7406 jz short tn_doit ;AN000; Yes - do the command - 22646 tn_parse_error: ;AN000; A parse error occurred - 22647 000024CB E95808 jmp cerror ;AN000; Go to error routine - 22648 - 22649 tn_eol: - 22650 ;23/02/2023 - 22651 ;;mov ah,0 ;AN000; no parameters on line - 22652 ;mov ah,END_OF_LINE_OUT ;AN000; set buffer to . - 22653 ;;mov al,dot_chr ;AN000; for current dir - 22654 ;mov al,'.' - 22655 ; 10/06/2023 - 22656 ;mov ax,002Eh - 22657 ; ah = 0 ; * - 22658 000024CE B02E mov al,'.' ;dot_chr ; 2Eh - 22659 ; - 22660 000024D0 AB stosw ;AN000; store in srcxname - 22661 ; 23/02/2023 - 22662 ;jmp short tn_doit ;AN000; go do command - 22663 - 22664 tn_doit: ;AN000; - 22665 000024D1 BE[2399] mov si,SRCXNAME ;AN000; set up srcxname as source - 22666 000024D4 BF[549A] mov di,COMBUF ;AN000; set up combuf as target (need big target) - 22667 000024D7 B460 mov ah,xNameTrans ;AN000; do name translate call - 22668 ;mov ah,60h - 22669 000024D9 CD21 int 21h ;AN000; - 22670 000024DB 7311 jnc short tn_print_xname ;AN000; If no error - print result - 22671 - 22672 000024DD E85BFB call Set_Ext_Error_Msg ;AN000; get extended message - 22673 000024E0 C706[A09D][2399] mov word [string_ptr_2],SRCXNAME - 22674 ;AN000; get address of failed string - 22675 ;mov byte [extend_buf_sub],1 - 22676 000024E6 C606[D98F]01 mov byte [extend_buf_sub],one_subst - 22677 ;AN000; put number of subst in control block - 22678 000024EB E93808 jmp cerror ;AN000; Go to error routine - 22679 - 22680 tn_print_xname: ;AN000; - 22681 000024EE C706[A09D][549A] mov word [string_ptr_2],COMBUF - 22682 ;AN000; Set up address of combuf - 22683 000024F4 BA[DF91] mov dx,string_buf_ptr ;AN000; Set up address of print control block - 22684 000024F7 E87F04 call CRLF2 ;AN000; print a crlf - 22685 ;call Printf_Crlf ;AN000; print it out - 22686 ;retn ;AN000; - 22687 ; 23/02/2023 - 22688 000024FA E91D2F jmp Printf_Crlf - 22689 - 22690 ; --------------------------------------------------------------------------- - 22691 - 22692 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22693 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2219h + 22573 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 22574 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:257Dh + 22575 + 22576 TRUENAME: ;AN000; TRUENAME entry point + 22577 00002486 1E push ds ;AN000; Get local ES + 22578 00002487 07 pop es ;AN000; + 22579 00002488 BE8100 mov si,81h ;AN000; Get command line + 22580 0000248B BF[9196] mov di,PARSE_CHDIR ;AN000; Get address of PARSE_CHDIR + 22581 0000248E 31C9 xor cx,cx ;AN000; clear cx,dx + 22582 00002490 31D2 xor dx,dx ;AN000; + 22583 00002492 E8C600 call Parse_With_Msg ;AC018; call parser + 22584 + 22585 00002495 BF[2399] mov di,SRCXNAME ;AN000; get address of srcxname + 22586 ;cmp ax,0FFFFh + 22587 ;;cmp ax,END_OF_LINE ;AN000; are we at end of line? + 22588 ;je short tn_eol ;AN000; yes - go process + 22589 ;; 22/02/2023 + 22590 ;;cmp ax,0 + 22591 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? + 22592 ;;jne short tn_parse_error ;AN000; yes - go issue message + 22593 ;and ax,ax ; ax = 0 ? + 22594 ;jnz short tn_parse_error ; no, parse error + 22595 ; 10/06/2023 + 22596 00002498 40 inc ax ; 0FFFFh -> 0 ; cmp ax,0FFFFh + 22597 00002499 7433 jz short tn_eol ; ah = 0 ; * + 22598 0000249B 48 dec ax ; 1 -> 0 ; cmp ax, 0 + 22599 0000249C 752D jnz short tn_parse_error + 22600 + 22601 ;cmp byte [PARSE1_TYPE],6 + 22602 0000249E 803E[EBA5]06 cmp byte [PARSE1_TYPE],result_drive + 22603 ;AN000; was a drive entered? + 22604 ;je short tn_drive ;AN000; yes - go process + 22605 ;jmp short tn_filespec ;AN000; nothing else - must be filespec + 22606 ; 23/02/2023 + 22607 000024A3 7512 jne short tn_filespec + 22608 + 22609 ;tn_eol: + 22610 ; ;mov ah,0 ;AN000; no parameters on line + 22611 ; mov ah,END_OF_LINE_OUT ;AN000; set buffer to . + 22612 ; ;mov al,dot_chr ;AN000; for current dir + 22613 ; mov al,'.' + 22614 ; stosw ;AN000; store in srcxname + 22615 ; jmp short tn_doit ;AN000; go do command + 22616 + 22617 tn_drive: ;AN000; a drive was entered + 22618 000024A5 56 push si ;AN000; save position in line + 22619 000024A6 BE[EFA5] mov si,PARSE1_ADDR ;AN000; get address of drive + 22620 000024A9 AC lodsb ;AN000; get the drive number + 22621 000024AA 0440 add al,"A"-1 ; 40h ;AN000; convert it to char + 22622 000024AC AA stosb ;AN000; store it in srcxname + 22623 ;mov ax,dot_colon ;AN000; get colon and . and + 22624 000024AD B83A2E mov ax,':.' ; 2E3Ah ; ah=".", al=":" + 22625 000024B0 AB stosw ;AN000; store in srcxname + 22626 ;mov al,0 + 22627 000024B1 B000 mov al,END_OF_LINE_OUT ;AN000; put a terminator char + 22628 000024B3 AA stosb ;AN000; + 22629 000024B4 5E pop si ;AN000; get line position back + 22630 000024B5 EB0C jmp short tn_check_eol ;AN000; check to make sure eol + 22631 + 22632 tn_filespec: ;AN000; a filespec was entered + 22633 000024B7 56 push si ;AN000; save position in line + 22634 000024B8 C536[EFA5] lds si,[PARSE1_ADDR] ;AN000; get address of filespec + 22635 + 22636 tn_move_filename: ;AN000; put filespec in srcxname + 22637 000024BC AC lodsb ;AN000; get a char from buffer + 22638 000024BD AA stosb ;AN000; store in srcxname + 22639 ;;cmp al,0 + 22640 ;cmp al,END_OF_LINE_OUT ;AN000; it char a terminator? + 22641 000024BE 08C0 or al,al ; al = 0 ? + 22642 000024C0 75FA jnz short tn_move_filename ;AN000; no - keep moving + 22643 000024C2 5E pop si ;AN000; get line position back + 22644 + 22645 tn_check_eol: ;AN000; make sure no extra parms + 22646 000024C3 BF[9196] mov di,PARSE_CHDIR ;AN000; get address of parse_chdir + 22647 000024C6 E87C00 call parse_check_eol ;AN000; are we at end of line? + 22648 000024C9 7406 jz short tn_doit ;AN000; Yes - do the command + 22649 tn_parse_error: ;AN000; A parse error occurred + 22650 000024CB E95808 jmp cerror ;AN000; Go to error routine + 22651 + 22652 tn_eol: + 22653 ;23/02/2023 + 22654 ;;mov ah,0 ;AN000; no parameters on line + 22655 ;mov ah,END_OF_LINE_OUT ;AN000; set buffer to . + 22656 ;;mov al,dot_chr ;AN000; for current dir + 22657 ;mov al,'.' + 22658 ; 10/06/2023 + 22659 ;mov ax,002Eh + 22660 ; ah = 0 ; * + 22661 000024CE B02E mov al,'.' ;dot_chr ; 2Eh + 22662 ; + 22663 000024D0 AB stosw ;AN000; store in srcxname + 22664 ; 23/02/2023 + 22665 ;jmp short tn_doit ;AN000; go do command + 22666 + 22667 tn_doit: ;AN000; + 22668 000024D1 BE[2399] mov si,SRCXNAME ;AN000; set up srcxname as source + 22669 000024D4 BF[549A] mov di,COMBUF ;AN000; set up combuf as target (need big target) + 22670 000024D7 B460 mov ah,xNameTrans ;AN000; do name translate call + 22671 ;mov ah,60h + 22672 000024D9 CD21 int 21h ;AN000; + 22673 000024DB 7311 jnc short tn_print_xname ;AN000; If no error - print result + 22674 + 22675 000024DD E85BFB call Set_Ext_Error_Msg ;AN000; get extended message + 22676 000024E0 C706[A09D][2399] mov word [string_ptr_2],SRCXNAME + 22677 ;AN000; get address of failed string + 22678 ;mov byte [extend_buf_sub],1 + 22679 000024E6 C606[D98F]01 mov byte [extend_buf_sub],one_subst + 22680 ;AN000; put number of subst in control block + 22681 000024EB E93808 jmp cerror ;AN000; Go to error routine + 22682 + 22683 tn_print_xname: ;AN000; + 22684 000024EE C706[A09D][549A] mov word [string_ptr_2],COMBUF + 22685 ;AN000; Set up address of combuf + 22686 000024F4 BA[DF91] mov dx,string_buf_ptr ;AN000; Set up address of print control block + 22687 000024F7 E87F04 call CRLF2 ;AN000; print a crlf + 22688 ;call Printf_Crlf ;AN000; print it out + 22689 ;retn ;AN000; + 22690 ; 23/02/2023 + 22691 000024FA E91D2F jmp Printf_Crlf + 22692 + 22693 ; --------------------------------------------------------------------------- 22694 - 22695 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 22696 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:27C3h + 22695 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22696 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2219h 22697 - 22698 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 22699 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2600h - 22700 _$EXIT: - 22701 ; MSDOS 6.0 - 22702 000024FD 1E push ds ;AN000; save data segment - 22703 000024FE 8E1E[F59B] mov ds,[RESSEG] ;AN000; get resident data segment - 22704 ;assume ds:resgroup ;AN000; - 22705 - 22706 00002502 803E[A202]00 cmp byte [PermCom],0 ;AN045; is this a permanent COMMAND? - 22707 00002507 740A jz short free_com ;AN045; no - free everything + 22698 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 22699 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:27C3h + 22700 + 22701 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 22702 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2600h + 22703 _$EXIT: + 22704 ; MSDOS 6.0 + 22705 000024FD 1E push ds ;AN000; save data segment + 22706 000024FE 8E1E[F59B] mov ds,[RESSEG] ;AN000; get resident data segment + 22707 ;assume ds:resgroup ;AN000; 22708 - 22709 ; We're a permanent command. - 22710 ; Unless this is a singlecom (int 2Eh), don't deallocate transient. + 22709 00002502 803E[A202]00 cmp byte [PermCom],0 ;AN045; is this a permanent COMMAND? + 22710 00002507 740A jz short free_com ;AN045; no - free everything 22711 - 22712 00002509 833E[A502]FF cmp word [SingleCom],-1 ;M034 - 22713 0000250E 7403 je short no_reset ;M034 ; exit singlecom - 22714 00002510 E9F1DB jmp TCOMMAND ;permanent command, recycle - 22715 - 22716 free_com: - 22717 - 22718 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 22719 %if 0 - 22720 ;mov ax,(multdos shl 8 or message_2f) - 22721 mov ax,122Eh ;AN060; reset parse message pointers - 22722 ;mov dl,SET_CRITICAL_MSG ;AN000; set up critical error message address - 22723 mov dl,5 - 22724 mov di,[Crit_Msg_Off] ;AN000; old offset of critical messages - 22725 mov es,[Crit_Msg_Seg] ;AN000; old segment of critical messages - 22726 int 2Fh ;AN000; go set it - 22727 %endif - 22728 - 22729 no_reset: ;AN045; - 22730 00002513 1F pop ds ;AN000; restore local data segment - 22731 ;assume ds:trangroup ;AN000; - 22732 ;M040 - 22733 ; Restore user directory if the restore flag is set. RestUDir1 checks for - 22734 ;this, restores user dir if flag is set and resets the flag. - 22735 - 22736 ;invoke RestUDir1 ;restore user dir if needed ;M040 - 22737 00002514 E80C03 call RestUDir1 - 22738 00002517 8E06[F59B] mov es,[RESSEG] - 22739 ;assume es:resgroup - 22740 - 22741 0000251B 26A1[3E02] mov ax,[es:Parent] - 22742 ;mov [es:16h],ax - 22743 ;mov [es:PDB_Parent_PID],ax - 22744 0000251F 26A31600 mov [es:PDB.PARENT_PID],ax - 22745 00002523 26A1[4002] mov ax,[es:OldTerm] - 22746 ;mov [es:0Ah],ax - 22747 ;mov [es:PDB_Exit],ax - 22748 00002527 26A30A00 mov [es:PDB.EXIT],ax - 22749 0000252B 26A1[4202] mov ax,[es:OldTerm+2] - 22750 ;mov [es:0Ch],ax - 22751 ;mov [es:PDB_Exit+2],ax - 22752 0000252F 26A30C00 mov [es:PDB.EXIT+2],ax - 22753 - 22754 00002533 06 push es - 22755 00002534 8E06[039C] mov es,[TRAN_TPA] - 22756 ;mov ah,DEALLOC - 22757 00002538 B449 mov ah,49h - 22758 0000253A CD21 int 21h ; Now running in "free" space - 22759 0000253C 07 pop es - 22760 - 22761 ;mov ah,Exit - 22762 0000253D B44C mov ah,4Ch - 22763 ;mov al,byte ptr RetCode - 22764 0000253F 26A0[9A02] mov al,[es:RetCode] - 22765 00002543 CD21 int 21h - 22766 - 22767 ; --------------------------------------------------------------------------- - 22768 - 22769 ; MSDOS 6.0 - 22770 ; **************************************************************** - 22771 ; * - 22772 ; * ROUTINE: PARSE_CHECK_EOL - 22773 ; * - 22774 ; * FUNCTION: Calls parser to see if end of line occurred. - 22775 ; * If not end of line, set up to print parse - 22776 ; * error message. ASSUMES NO MORE PARAMETERS ARE - 22777 ; * EXPECTED! - 22778 ; * - 22779 ; * INPUT: DS:SI last output from parser - 22780 ; * ES:DI points to parse block - 22781 ; * CX last output from parser - 22782 ; * - 22783 ; * OUTPUT: AX parser return code - 22784 ; * - 22785 ; * if end of line found - 22786 ; * zero flag set - 22787 ; * else - 22788 ; * MSG_DISPLAY_CLASS set to parse error - 22789 ; * - 22790 ; **************************************************************** - 22791 - 22792 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22793 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2270h + 22712 ; We're a permanent command. + 22713 ; Unless this is a singlecom (int 2Eh), don't deallocate transient. + 22714 + 22715 00002509 833E[A502]FF cmp word [SingleCom],-1 ;M034 + 22716 0000250E 7403 je short no_reset ;M034 ; exit singlecom + 22717 00002510 E9F1DB jmp TCOMMAND ;permanent command, recycle + 22718 + 22719 free_com: + 22720 + 22721 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 22722 %if 0 + 22723 ;mov ax,(multdos shl 8 or message_2f) + 22724 mov ax,122Eh ;AN060; reset parse message pointers + 22725 ;mov dl,SET_CRITICAL_MSG ;AN000; set up critical error message address + 22726 mov dl,5 + 22727 mov di,[Crit_Msg_Off] ;AN000; old offset of critical messages + 22728 mov es,[Crit_Msg_Seg] ;AN000; old segment of critical messages + 22729 int 2Fh ;AN000; go set it + 22730 %endif + 22731 + 22732 no_reset: ;AN045; + 22733 00002513 1F pop ds ;AN000; restore local data segment + 22734 ;assume ds:trangroup ;AN000; + 22735 ;M040 + 22736 ; Restore user directory if the restore flag is set. RestUDir1 checks for + 22737 ;this, restores user dir if flag is set and resets the flag. + 22738 + 22739 ;invoke RestUDir1 ;restore user dir if needed ;M040 + 22740 00002514 E80C03 call RestUDir1 + 22741 00002517 8E06[F59B] mov es,[RESSEG] + 22742 ;assume es:resgroup + 22743 + 22744 0000251B 26A1[3E02] mov ax,[es:Parent] + 22745 ;mov [es:16h],ax + 22746 ;mov [es:PDB_Parent_PID],ax + 22747 0000251F 26A31600 mov [es:PDB.PARENT_PID],ax + 22748 00002523 26A1[4002] mov ax,[es:OldTerm] + 22749 ;mov [es:0Ah],ax + 22750 ;mov [es:PDB_Exit],ax + 22751 00002527 26A30A00 mov [es:PDB.EXIT],ax + 22752 0000252B 26A1[4202] mov ax,[es:OldTerm+2] + 22753 ;mov [es:0Ch],ax + 22754 ;mov [es:PDB_Exit+2],ax + 22755 0000252F 26A30C00 mov [es:PDB.EXIT+2],ax + 22756 + 22757 00002533 06 push es + 22758 00002534 8E06[039C] mov es,[TRAN_TPA] + 22759 ;mov ah,DEALLOC + 22760 00002538 B449 mov ah,49h + 22761 0000253A CD21 int 21h ; Now running in "free" space + 22762 0000253C 07 pop es + 22763 + 22764 ;mov ah,Exit + 22765 0000253D B44C mov ah,4Ch + 22766 ;mov al,byte ptr RetCode + 22767 0000253F 26A0[9A02] mov al,[es:RetCode] + 22768 00002543 CD21 int 21h + 22769 + 22770 ; --------------------------------------------------------------------------- + 22771 + 22772 ; MSDOS 6.0 + 22773 ; **************************************************************** + 22774 ; * + 22775 ; * ROUTINE: PARSE_CHECK_EOL + 22776 ; * + 22777 ; * FUNCTION: Calls parser to see if end of line occurred. + 22778 ; * If not end of line, set up to print parse + 22779 ; * error message. ASSUMES NO MORE PARAMETERS ARE + 22780 ; * EXPECTED! + 22781 ; * + 22782 ; * INPUT: DS:SI last output from parser + 22783 ; * ES:DI points to parse block + 22784 ; * CX last output from parser + 22785 ; * + 22786 ; * OUTPUT: AX parser return code + 22787 ; * + 22788 ; * if end of line found + 22789 ; * zero flag set + 22790 ; * else + 22791 ; * MSG_DISPLAY_CLASS set to parse error + 22792 ; * + 22793 ; **************************************************************** 22794 - 22795 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 22796 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2648h - 22797 parse_check_eol: - 22798 00002545 31D2 xor dx,dx ;AN000; - 22799 00002547 8936[989D] mov [parse_last],si ;AN018; save start of parameter - 22800 0000254B E81E24 call cmd_parse ;AN000; call parser - 22801 0000254E 3CFF cmp al,-1 ; 0FFh - 22802 ;cmp al,END_OF_LINE ; 0FFh ;AN000; Are we at end of line? - 22803 00002550 7408 je short parse_good_eol ;AN000; yes - no problem - 22804 ;cmp ax,0 - 22805 ;cmp ax,RESULT_NO_ERROR ;AN018; was any error found? - 22806 00002552 21C0 and ax,ax ; ax = 0 ? - 22807 00002554 7501 jnz short ok_to_setup_pmsg ;AN018; yes - continue - 22808 00002556 40 inc ax ;AN018; set AX to 1 and turn off zero flag - 22809 ok_to_setup_pmsg: - 22810 00002557 E81000 call setup_parse_error_msg ;AN018; go set up error message - 22811 parse_good_eol: - 22812 parse_msg_good: ; 23/02/2023 - 22813 0000255A C3 retn ;AN000; - 22814 - 22815 ; --------------------------------------------------------------------------- - 22816 - 22817 ; MSDOS 6.0 - 22818 ; **************************************************************** - 22819 ; * - 22820 ; * ROUTINE: PARSE_WITH_MSG - 22821 ; * - 22822 ; * FUNCTION: Calls parser. If an error occurred, the error - 22823 ; * message is set up. + 22795 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22796 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2270h + 22797 + 22798 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 22799 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2648h + 22800 parse_check_eol: + 22801 00002545 31D2 xor dx,dx ;AN000; + 22802 00002547 8936[989D] mov [parse_last],si ;AN018; save start of parameter + 22803 0000254B E81E24 call cmd_parse ;AN000; call parser + 22804 0000254E 3CFF cmp al,-1 ; 0FFh + 22805 ;cmp al,END_OF_LINE ; 0FFh ;AN000; Are we at end of line? + 22806 00002550 7408 je short parse_good_eol ;AN000; yes - no problem + 22807 ;cmp ax,0 + 22808 ;cmp ax,RESULT_NO_ERROR ;AN018; was any error found? + 22809 00002552 21C0 and ax,ax ; ax = 0 ? + 22810 00002554 7501 jnz short ok_to_setup_pmsg ;AN018; yes - continue + 22811 00002556 40 inc ax ;AN018; set AX to 1 and turn off zero flag + 22812 ok_to_setup_pmsg: + 22813 00002557 E81000 call setup_parse_error_msg ;AN018; go set up error message + 22814 parse_good_eol: + 22815 parse_msg_good: ; 23/02/2023 + 22816 0000255A C3 retn ;AN000; + 22817 + 22818 ; --------------------------------------------------------------------------- + 22819 + 22820 ; MSDOS 6.0 + 22821 ; **************************************************************** + 22822 ; * + 22823 ; * ROUTINE: PARSE_WITH_MSG 22824 ; * - 22825 ; * INPUT: DS:SI last output from parser - 22826 ; * ES:DI points to parse block - 22827 ; * CX last output from parser - 22828 ; * - 22829 ; * OUTPUT: AX parser return code - 22830 ; * - 22831 ; * if no error - 22832 ; * outputs from parser - 22833 ; * else - 22834 ; * MSG_DISPLAY_CLASS set to parse error - 22835 ; * error message set up for STD_PRINTF - 22836 ; * - 22837 ; **************************************************************** - 22838 - 22839 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22840 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 22841 Parse_With_Msg: - 22842 0000255B 8936[989D] mov [parse_last],si ;AN018; save start of parameter - 22843 0000255F E80A24 call cmd_parse ;AN018; call parser - 22844 00002562 3CFF cmp al,-1 ; 0FFh - 22845 ;cmp al,END_OF_LINE ; 0FFh ;AN018; Are we at end of line? - 22846 00002564 74F4 je short parse_msg_good ;AN018; yes - no problem - 22847 ;cmp ax,0 - 22848 ;cmp ax,RESULT_NO_ERROR ;AN018; did an error occur - 22849 00002566 09C0 or ax,ax ; ax = 0 ? - 22850 00002568 74F0 jz short parse_msg_good ;AN018; yes - no problem - 22851 ; 23/02/2023 - 22852 ;call setup_parse_error_msg ;AN018; go set up error message - 22853 ;parse_msg_good: - 22854 ;retn ;AN018; - 22855 ; 23/02/2023 - 22856 ;jmp short setup_parse_error_msg - 22857 - 22858 ; --------------------------------------------------------------------------- - 22859 - 22860 ; MSDOS 6.0 - 22861 ; **************************************************************** - 22862 ; * - 22863 ; * ROUTINE: SETUP_PARSE_ERROR_MSG - 22864 ; * - 22865 ; * FUNCTION: Calls parser. If an error occurred, the error - 22866 ; * message is set up. + 22825 ; * FUNCTION: Calls parser. If an error occurred, the error + 22826 ; * message is set up. + 22827 ; * + 22828 ; * INPUT: DS:SI last output from parser + 22829 ; * ES:DI points to parse block + 22830 ; * CX last output from parser + 22831 ; * + 22832 ; * OUTPUT: AX parser return code + 22833 ; * + 22834 ; * if no error + 22835 ; * outputs from parser + 22836 ; * else + 22837 ; * MSG_DISPLAY_CLASS set to parse error + 22838 ; * error message set up for STD_PRINTF + 22839 ; * + 22840 ; **************************************************************** + 22841 + 22842 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22843 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 22844 Parse_With_Msg: + 22845 0000255B 8936[989D] mov [parse_last],si ;AN018; save start of parameter + 22846 0000255F E80A24 call cmd_parse ;AN018; call parser + 22847 00002562 3CFF cmp al,-1 ; 0FFh + 22848 ;cmp al,END_OF_LINE ; 0FFh ;AN018; Are we at end of line? + 22849 00002564 74F4 je short parse_msg_good ;AN018; yes - no problem + 22850 ;cmp ax,0 + 22851 ;cmp ax,RESULT_NO_ERROR ;AN018; did an error occur + 22852 00002566 09C0 or ax,ax ; ax = 0 ? + 22853 00002568 74F0 jz short parse_msg_good ;AN018; yes - no problem + 22854 ; 23/02/2023 + 22855 ;call setup_parse_error_msg ;AN018; go set up error message + 22856 ;parse_msg_good: + 22857 ;retn ;AN018; + 22858 ; 23/02/2023 + 22859 ;jmp short setup_parse_error_msg + 22860 + 22861 ; --------------------------------------------------------------------------- + 22862 + 22863 ; MSDOS 6.0 + 22864 ; **************************************************************** + 22865 ; * + 22866 ; * ROUTINE: SETUP_PARSE_ERROR_MSG 22867 ; * - 22868 ; * INPUT: AX Parse error number - 22869 ; * SI Set to past last parameter - 22870 ; * Parse_last Set to start of last parameter - 22871 ; * - 22872 ; * OUTPUT: MSG_DISPLAY_CLASS set to parse error - 22873 ; * error message set up for STD_PRINTF + 22868 ; * FUNCTION: Calls parser. If an error occurred, the error + 22869 ; * message is set up. + 22870 ; * + 22871 ; * INPUT: AX Parse error number + 22872 ; * SI Set to past last parameter + 22873 ; * Parse_last Set to start of last parameter 22874 ; * - 22875 ; **************************************************************** - 22876 - 22877 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 22878 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 22879 setup_parse_error_msg: - 22880 0000256A C606[D58F]02 mov byte [msg_disp_class],parse_msg_class - 22881 ;mov byte [msg_disp_class],2 ;AC018; Set up parse message class - 22882 0000256F BA[D78F] mov dx,extend_buf_ptr ;AC018; get extended message pointer - 22883 00002572 C60400 mov byte [si],END_OF_LINE_OUT ; 0 - 22884 ;AC018; terminate the parameter string - 22885 00002575 A3[D78F] mov [extend_buf_ptr],ax ;AC018; get message number in control block - 22886 00002578 83F802 cmp ax,2 - 22887 ;cmp ax,LessArgs_Ptr ;AC018; if required parameter missing - 22888 0000257B 740D je short setup_parse_msg_ret - 22889 ;AN018; no subst - 22890 0000257D 8B36[989D] mov si,[parse_last] ;AC018; get start of parameter - 22891 00002581 8936[A09D] mov [string_ptr_2],si ;AC018; get address of failed string - 22892 00002585 C606[D98F]01 mov byte [extend_buf_sub],one_subst - 22893 ;AC018; put number of subst in control block - 22894 ;mov byte [extend_buf_sub],1 - 22895 setup_parse_msg_ret: - 22896 0000258A 46 inc si ;AN018; make sure zero flag not set - 22897 0000258B C3 retn ;AC018; - 22898 - 22899 ;============================================================================ - 22900 ; TENV.ASM, MSDOS 6.0, 1991 - 22901 ;============================================================================ - 22902 ; 08/10/2018 - Retro DOS v3.0 - 22903 - 22904 ; TITLE Part6 COMMAND Transient routines. - 22905 - 22906 ; Environment utilities and misc. routines - 22907 - 22908 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1690h - 22909 - 22910 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) - 22911 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 22BDh + 22875 ; * OUTPUT: MSG_DISPLAY_CLASS set to parse error + 22876 ; * error message set up for STD_PRINTF + 22877 ; * + 22878 ; **************************************************************** + 22879 + 22880 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 22881 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 22882 setup_parse_error_msg: + 22883 0000256A C606[D58F]02 mov byte [msg_disp_class],parse_msg_class + 22884 ;mov byte [msg_disp_class],2 ;AC018; Set up parse message class + 22885 0000256F BA[D78F] mov dx,extend_buf_ptr ;AC018; get extended message pointer + 22886 00002572 C60400 mov byte [si],END_OF_LINE_OUT ; 0 + 22887 ;AC018; terminate the parameter string + 22888 00002575 A3[D78F] mov [extend_buf_ptr],ax ;AC018; get message number in control block + 22889 00002578 83F802 cmp ax,2 + 22890 ;cmp ax,LessArgs_Ptr ;AC018; if required parameter missing + 22891 0000257B 740D je short setup_parse_msg_ret + 22892 ;AN018; no subst + 22893 0000257D 8B36[989D] mov si,[parse_last] ;AC018; get start of parameter + 22894 00002581 8936[A09D] mov [string_ptr_2],si ;AC018; get address of failed string + 22895 00002585 C606[D98F]01 mov byte [extend_buf_sub],one_subst + 22896 ;AC018; put number of subst in control block + 22897 ;mov byte [extend_buf_sub],1 + 22898 setup_parse_msg_ret: + 22899 0000258A 46 inc si ;AN018; make sure zero flag not set + 22900 0000258B C3 retn ;AC018; + 22901 + 22902 ;============================================================================ + 22903 ; TENV.ASM, MSDOS 6.0, 1991 + 22904 ;============================================================================ + 22905 ; 08/10/2018 - Retro DOS v3.0 + 22906 + 22907 ; TITLE Part6 COMMAND Transient routines. + 22908 + 22909 ; Environment utilities and misc. routines + 22910 + 22911 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1690h 22912 - 22913 ; --------------------------------------------------------------------------- - 22914 - 22915 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 22916 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 22917 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 22918 ADD_PROMPT: - 22919 0000258C E8FC00 call delete_prompt ; Delete any existing prompt - 22920 0000258F E8AD01 call scan_double_null - 22921 - 22922 ADD_PROMPT2: - 22923 00002592 56 push si - 22924 00002593 E89B01 call GETARG - 22925 00002596 5E pop si - 22926 00002597 7501 jnz short ADD_PROMPT3 - 22927 ADD_PROMPT_RETN: - 22928 00002599 C3 retn - 22929 ADD_PROMPT3: ; Pre scan for arguments - 22930 0000259A E87501 call move_name ; Move in name - 22931 0000259D E89101 call GETARG - 22932 000025A0 56 push si - 22933 000025A1 EB53 jmp short ADD_NAME - 22934 - 22935 ;break The SET command - 22936 - 22937 ; Input: DS:SI points to a CR terminated string - 22938 ; Output: carry flag is set if no room - 22939 ; otherwise name is added to environment - 22940 - 22941 DISP_ENVJ: - 22942 000025A3 E9BC00 jmp DISP_ENV + 22913 ; 23/02/2023 - Retro DOS v4.0 (& v4.1) + 22914 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 22BDh + 22915 + 22916 ; --------------------------------------------------------------------------- + 22917 + 22918 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 22919 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 22920 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 22921 ADD_PROMPT: + 22922 0000258C E8FC00 call delete_prompt ; Delete any existing prompt + 22923 0000258F E8AD01 call scan_double_null + 22924 + 22925 ADD_PROMPT2: + 22926 00002592 56 push si + 22927 00002593 E89B01 call GETARG + 22928 00002596 5E pop si + 22929 00002597 7501 jnz short ADD_PROMPT3 + 22930 ADD_PROMPT_RETN: + 22931 00002599 C3 retn + 22932 ADD_PROMPT3: ; Pre scan for arguments + 22933 0000259A E87501 call move_name ; Move in name + 22934 0000259D E89101 call GETARG + 22935 000025A0 56 push si + 22936 000025A1 EB53 jmp short ADD_NAME + 22937 + 22938 ;break The SET command + 22939 + 22940 ; Input: DS:SI points to a CR terminated string + 22941 ; Output: carry flag is set if no room + 22942 ; otherwise name is added to environment 22943 - 22944 ADD_NAME_TO_ENVIRONMENT: - 22945 000025A6 E88801 call GETARG - 22946 000025A9 74F8 jz short DISP_ENVJ - 22947 - 22948 ; check if line contains exactly one equals sign - 22949 - 22950 000025AB 31DB xor bx,bx ; = count is 0 - 22951 000025AD 56 push si ; Save pointer to beginning of line - 22952 EQLP: - 22953 000025AE AC lodsb ; Get a char - 22954 000025AF 3C0D cmp al,13 ; 0Dh ; IF CR we're all done - 22955 000025B1 740F je short QUEQ - 22956 000025B3 3C3D cmp al,'=' ; Look for = sign - 22957 000025B5 75F7 jne short EQLP ; not there, get next char - 22958 000025B7 FEC3 inc bl ; Otherwise increment EQ count - 22959 000025B9 803C0D cmp byte [si],13 ; Look for CR following = sign - 22960 000025BC 75F0 jne short EQLP - 22961 000025BE FEC7 inc bh ; Set BH=1 means no parameters - 22962 000025C0 EBEC jmp short EQLP ; And look for more - 22963 QUEQ: - 22964 000025C2 5E pop si ; Restore beginning of line - 22965 000025C3 FECB dec bl ; Zero flag means only one EQ - 22966 000025C5 7406 jz short ONEQ ; Good line - 22967 000025C7 BA[AA90] mov dx,SYNTMES_PTR - 22968 000025CA E95907 jmp cerror - 22969 ONEQ: - 22970 000025CD 53 push bx - 22971 000025CE E8BD00 call delete_name_in_environment - 22972 000025D1 5B pop bx - 22973 000025D2 FECF dec bh - 22974 000025D4 74C3 jz short ADD_PROMPT_RETN - 22975 000025D6 E86601 call scan_double_null - 22976 000025D9 89FB mov bx,di ; Save ptr to beginning of env var name - 22977 000025DB E83401 call move_name - 22978 000025DE 56 push si - 22979 000025DF 87DF xchg bx,di ; Switch ptrs to beginning and end of - 22980 ; env var name - 22981 - 22982 ; We want to special-case COMSPEC. This is to reduce the amount of code - 22983 ; necessary in the resident for re-reading the transient. Let's look for - 22984 ; COMSPEC= - 22985 - 22986 000025E1 C606[E395]00 mov byte [comspec_flag],0 ; MSDOS 6.0 ; clear flag ; M024 - 22987 000025E6 BE[FD92] mov si,COMSPECSTR ; "COMSPEC=" - 22988 000025E9 B90400 mov cx,4 - 22989 000025EC F3A7 repe cmpsw - 22990 000025EE 7504 jnz short NOT_COMSPEC - 22991 ; Zero set => exact match - 22992 000025F0 FE06[E395] inc byte [comspec_flag] ; MSDOS 6.0 ; comspec is changing ; M024 - 22993 ;mov byte [COMSPEC_FLAG],1 - 22994 NOT_COMSPEC: - 22995 000025F4 89DF mov di,bx ; Load ptr to end of env var name - 22996 ADD_NAME: - 22997 000025F6 5E pop si ; Add the value of the new env var - 22998 000025F7 56 push si ; to the environment. - 22999 ADD_NAME1: - 23000 000025F8 AC lodsb - 23001 000025F9 3C0D cmp al,13 ; 0Dh - 23002 000025FB 7405 je short ADD_NAME_RET - 23003 000025FD E8AD01 call store_char - 23004 00002600 EBF6 jmp short ADD_NAME1 - 23005 ADD_NAME_RET: - 23006 00002602 5E pop si - 23007 00002603 803E[E395]00 cmp byte [comspec_flag],0 - 23008 ; If the new env var is comspec, - 23009 ADD_NAME_JZ_RET: - 23010 00002608 748F jz short ADD_PROMPT_RETN - 23011 ; copy the value into the - 23012 ; comspec var in the resident - 23013 - 23014 ; We have changed the COMSPEC variable. We need to update the resident - 23015 ; pieces necessary to reread in the info. First, skip all delimiters + 22944 DISP_ENVJ: + 22945 000025A3 E9BC00 jmp DISP_ENV + 22946 + 22947 ADD_NAME_TO_ENVIRONMENT: + 22948 000025A6 E88801 call GETARG + 22949 000025A9 74F8 jz short DISP_ENVJ + 22950 + 22951 ; check if line contains exactly one equals sign + 22952 + 22953 000025AB 31DB xor bx,bx ; = count is 0 + 22954 000025AD 56 push si ; Save pointer to beginning of line + 22955 EQLP: + 22956 000025AE AC lodsb ; Get a char + 22957 000025AF 3C0D cmp al,13 ; 0Dh ; IF CR we're all done + 22958 000025B1 740F je short QUEQ + 22959 000025B3 3C3D cmp al,'=' ; Look for = sign + 22960 000025B5 75F7 jne short EQLP ; not there, get next char + 22961 000025B7 FEC3 inc bl ; Otherwise increment EQ count + 22962 000025B9 803C0D cmp byte [si],13 ; Look for CR following = sign + 22963 000025BC 75F0 jne short EQLP + 22964 000025BE FEC7 inc bh ; Set BH=1 means no parameters + 22965 000025C0 EBEC jmp short EQLP ; And look for more + 22966 QUEQ: + 22967 000025C2 5E pop si ; Restore beginning of line + 22968 000025C3 FECB dec bl ; Zero flag means only one EQ + 22969 000025C5 7406 jz short ONEQ ; Good line + 22970 000025C7 BA[AA90] mov dx,SYNTMES_PTR + 22971 000025CA E95907 jmp cerror + 22972 ONEQ: + 22973 000025CD 53 push bx + 22974 000025CE E8BD00 call delete_name_in_environment + 22975 000025D1 5B pop bx + 22976 000025D2 FECF dec bh + 22977 000025D4 74C3 jz short ADD_PROMPT_RETN + 22978 000025D6 E86601 call scan_double_null + 22979 000025D9 89FB mov bx,di ; Save ptr to beginning of env var name + 22980 000025DB E83401 call move_name + 22981 000025DE 56 push si + 22982 000025DF 87DF xchg bx,di ; Switch ptrs to beginning and end of + 22983 ; env var name + 22984 + 22985 ; We want to special-case COMSPEC. This is to reduce the amount of code + 22986 ; necessary in the resident for re-reading the transient. Let's look for + 22987 ; COMSPEC= + 22988 + 22989 000025E1 C606[E395]00 mov byte [comspec_flag],0 ; MSDOS 6.0 ; clear flag ; M024 + 22990 000025E6 BE[FD92] mov si,COMSPECSTR ; "COMSPEC=" + 22991 000025E9 B90400 mov cx,4 + 22992 000025EC F3A7 repe cmpsw + 22993 000025EE 7504 jnz short NOT_COMSPEC + 22994 ; Zero set => exact match + 22995 000025F0 FE06[E395] inc byte [comspec_flag] ; MSDOS 6.0 ; comspec is changing ; M024 + 22996 ;mov byte [COMSPEC_FLAG],1 + 22997 NOT_COMSPEC: + 22998 000025F4 89DF mov di,bx ; Load ptr to end of env var name + 22999 ADD_NAME: + 23000 000025F6 5E pop si ; Add the value of the new env var + 23001 000025F7 56 push si ; to the environment. + 23002 ADD_NAME1: + 23003 000025F8 AC lodsb + 23004 000025F9 3C0D cmp al,13 ; 0Dh + 23005 000025FB 7405 je short ADD_NAME_RET + 23006 000025FD E8AD01 call store_char + 23007 00002600 EBF6 jmp short ADD_NAME1 + 23008 ADD_NAME_RET: + 23009 00002602 5E pop si + 23010 00002603 803E[E395]00 cmp byte [comspec_flag],0 + 23011 ; If the new env var is comspec, + 23012 ADD_NAME_JZ_RET: + 23013 00002608 748F jz short ADD_PROMPT_RETN + 23014 ; copy the value into the + 23015 ; comspec var in the resident 23016 - 23017 0000260A E87903 call scanoff - 23018 0000260D 8E06[F59B] mov es,[RESSEG] ; comspec var in the resident + 23017 ; We have changed the COMSPEC variable. We need to update the resident + 23018 ; pieces necessary to reread in the info. First, skip all delimiters 23019 - 23020 ; Make sure that the printer knows where the beginning of the string is - 23021 - 23022 00002611 BF[4B02] mov di,ComSpec - 23023 00002614 89FB mov bx,di + 23020 0000260A E87903 call scanoff + 23021 0000260D 8E06[F59B] mov es,[RESSEG] ; comspec var in the resident + 23022 + 23023 ; Make sure that the printer knows where the beginning of the string is 23024 - 23025 ; Generate drive letter for display - 23026 - 23027 00002616 31C0 xor ax,ax ;g assume no drive first - 23028 00002618 26A2[9402] mov [es:ComDrv],al - 23029 ; 23/02/2023 - 23030 ; MSDOS 6.0 (& 5.0) - 23031 0000261C 50 push ax ;AN000; 3/3/KK - 23032 0000261D 8A04 mov al,[si] ;AN000; 3/3/KK - 23033 0000261F E83F01 call testkanj ;AN000; 3/3/KK - 23034 00002622 58 pop ax ;AN000; 3/3/KK - 23035 00002623 7518 jnz short _GOTDRIVE - 23036 ; - 23037 00002625 807C013A cmp byte [si+1],':' ; drive specified? - 23038 00002629 7512 jne short _GOTDRIVE - 23039 0000262B 8A04 mov al,[si] ; get his specified drive - 23040 ; 23/02/2023 - 23041 0000262D E85B01 call UPCONV - 23042 ;call UPCONV_MAPCALL ; convert to uppercase - 23043 00002630 2C41 sub al,'A' ; convert to 0-based - 23044 00002632 83C702 add di,2 - 23045 00002635 FEC0 inc al ; convert to 1-based number - 23046 00002637 26A2[9402] mov [es:ComDrv],al - 23047 - 23048 ; Stick the drive letter in the prompt message. Nothing special needs to be - 23049 ; done here.. - 23050 ;add al,40h - 23051 0000263B 0440 add al,'A'-1 - 23052 _GOTDRIVE: - 23053 ; 23/02/2023 - 23054 ;;mov [es:0BD9h],di ; MSDOS 3.3 COMMAND.COM offset 1734h - 23055 ;mov [es:PUTBACKSUBSTPTR],di - 23056 ;mov [es:0233h],di ; MSDOS 5.0 COMMAND.COM offset 236Eh - 23057 0000263D 26893E[2A02] mov [es:PutBackComSpec],di - 23058 ;g point to beginning of name after drive - 23059 ;;mov [es:0A21h],al ; MSDOS 3.3 COMMAND.COM offset 1739h - 23060 ;mov [es:PUTBACKDRV],al - 23061 ;mov [es:0238h],al ; MSDOS 5.0 COMMAND.COM offset 2373h - 23062 00002642 26A2[2F02] mov [es:PutBackDrv],al - 23063 - 23064 ; Copy chars until delim - 23065 - 23066 00002646 89DF mov di,bx - 23067 COPY_COMSPEC: - 23068 00002648 AC lodsb - 23069 00002649 E84203 call DELIM - 23070 0000264C 7407 jz short COPYDONE - 23071 0000264E 3C0D cmp al,13 ; 0Dh - 23072 00002650 7403 je short COPYDONE - 23073 00002652 AA stosb - 23074 00002653 EBF3 jmp short COPY_COMSPEC - 23075 COPYDONE: - 23076 00002655 30C0 xor al,al ; Null terminate the string and quit - 23077 00002657 AA stosb - 23078 ;mov byte [comspec_flag],0 - 23079 00002658 A2[E395] mov [comspec_flag],al ; 0 ; 23/02/2023 - 23080 0000265B 4F dec di - 23081 0000265C 26893E[8B02] mov [es:ComSpec_End],di - 23082 00002661 C3 retn - 23083 - 23084 DISP_ENV: - 23085 00002662 8E1E[F59B] mov ds,[RESSEG] - 23086 00002666 8E1E[3A04] mov ds,[EnvirSeg] - 23087 ; assume ds:nothing - 23088 0000266A 31F6 xor si,si - 23089 PENVLP: - 23090 0000266C 803C00 cmp byte [si],0 - 23091 0000266F 7497 jz short ADD_NAME_JZ_RET - 23092 00002671 BF[96A3] mov di,Arg_Buf - 23093 PENVLP2: - 23094 00002674 AC lodsb - 23095 00002675 AA stosb - 23096 00002676 08C0 or al,al - 23097 00002678 75FA jnz short PENVLP2 - 23098 0000267A BA[9991] mov dx,arg_buf_ptr - 23099 0000267D 1E push ds - 23100 0000267E 06 push es - 23101 0000267F 1F pop ds - 23102 ; assume ds:nothing - 23103 00002680 E8972D call Printf_Crlf - 23104 00002683 1F pop ds - 23105 00002684 EBE6 jmp short PENVLP - 23106 - 23107 ; =============== S U B R O U T I N E ======================================= - 23108 - 23109 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23110 delete_path: - 23111 00002686 BE[F192] mov si,PATH_TEXT ; "PATH=" - 23112 00002689 EB03 jmp short delete_name_in_environment - 23113 - 23114 ; =============== S U B R O U T I N E ======================================= - 23115 - 23116 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23117 delete_prompt: - 23118 0000268B BE[F692] mov si,PROMPT_TEXT ; "PROMPT=" - 23119 - 23120 ; --------------------------------------------------------------------------- - 23121 - 23122 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23123 delete_name_in_environment: + 23025 00002611 BF[4B02] mov di,ComSpec + 23026 00002614 89FB mov bx,di + 23027 + 23028 ; Generate drive letter for display + 23029 + 23030 00002616 31C0 xor ax,ax ;g assume no drive first + 23031 00002618 26A2[9402] mov [es:ComDrv],al + 23032 ; 23/02/2023 + 23033 ; MSDOS 6.0 (& 5.0) + 23034 0000261C 50 push ax ;AN000; 3/3/KK + 23035 0000261D 8A04 mov al,[si] ;AN000; 3/3/KK + 23036 0000261F E83F01 call testkanj ;AN000; 3/3/KK + 23037 00002622 58 pop ax ;AN000; 3/3/KK + 23038 00002623 7518 jnz short _GOTDRIVE + 23039 ; + 23040 00002625 807C013A cmp byte [si+1],':' ; drive specified? + 23041 00002629 7512 jne short _GOTDRIVE + 23042 0000262B 8A04 mov al,[si] ; get his specified drive + 23043 ; 23/02/2023 + 23044 0000262D E85B01 call UPCONV + 23045 ;call UPCONV_MAPCALL ; convert to uppercase + 23046 00002630 2C41 sub al,'A' ; convert to 0-based + 23047 00002632 83C702 add di,2 + 23048 00002635 FEC0 inc al ; convert to 1-based number + 23049 00002637 26A2[9402] mov [es:ComDrv],al + 23050 + 23051 ; Stick the drive letter in the prompt message. Nothing special needs to be + 23052 ; done here.. + 23053 ;add al,40h + 23054 0000263B 0440 add al,'A'-1 + 23055 _GOTDRIVE: + 23056 ; 23/02/2023 + 23057 ;;mov [es:0BD9h],di ; MSDOS 3.3 COMMAND.COM offset 1734h + 23058 ;mov [es:PUTBACKSUBSTPTR],di + 23059 ;mov [es:0233h],di ; MSDOS 5.0 COMMAND.COM offset 236Eh + 23060 0000263D 26893E[2A02] mov [es:PutBackComSpec],di + 23061 ;g point to beginning of name after drive + 23062 ;;mov [es:0A21h],al ; MSDOS 3.3 COMMAND.COM offset 1739h + 23063 ;mov [es:PUTBACKDRV],al + 23064 ;mov [es:0238h],al ; MSDOS 5.0 COMMAND.COM offset 2373h + 23065 00002642 26A2[2F02] mov [es:PutBackDrv],al + 23066 + 23067 ; Copy chars until delim + 23068 + 23069 00002646 89DF mov di,bx + 23070 COPY_COMSPEC: + 23071 00002648 AC lodsb + 23072 00002649 E84203 call DELIM + 23073 0000264C 7407 jz short COPYDONE + 23074 0000264E 3C0D cmp al,13 ; 0Dh + 23075 00002650 7403 je short COPYDONE + 23076 00002652 AA stosb + 23077 00002653 EBF3 jmp short COPY_COMSPEC + 23078 COPYDONE: + 23079 00002655 30C0 xor al,al ; Null terminate the string and quit + 23080 00002657 AA stosb + 23081 ;mov byte [comspec_flag],0 + 23082 00002658 A2[E395] mov [comspec_flag],al ; 0 ; 23/02/2023 + 23083 0000265B 4F dec di + 23084 0000265C 26893E[8B02] mov [es:ComSpec_End],di + 23085 00002661 C3 retn + 23086 + 23087 DISP_ENV: + 23088 00002662 8E1E[F59B] mov ds,[RESSEG] + 23089 00002666 8E1E[3A04] mov ds,[EnvirSeg] + 23090 ; assume ds:nothing + 23091 0000266A 31F6 xor si,si + 23092 PENVLP: + 23093 0000266C 803C00 cmp byte [si],0 + 23094 0000266F 7497 jz short ADD_NAME_JZ_RET + 23095 00002671 BF[96A3] mov di,Arg_Buf + 23096 PENVLP2: + 23097 00002674 AC lodsb + 23098 00002675 AA stosb + 23099 00002676 08C0 or al,al + 23100 00002678 75FA jnz short PENVLP2 + 23101 0000267A BA[9991] mov dx,arg_buf_ptr + 23102 0000267D 1E push ds + 23103 0000267E 06 push es + 23104 0000267F 1F pop ds + 23105 ; assume ds:nothing + 23106 00002680 E8972D call Printf_Crlf + 23107 00002683 1F pop ds + 23108 00002684 EBE6 jmp short PENVLP + 23109 + 23110 ; =============== S U B R O U T I N E ======================================= + 23111 + 23112 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23113 delete_path: + 23114 00002686 BE[F192] mov si,PATH_TEXT ; "PATH=" + 23115 00002689 EB03 jmp short delete_name_in_environment + 23116 + 23117 ; =============== S U B R O U T I N E ======================================= + 23118 + 23119 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23120 delete_prompt: + 23121 0000268B BE[F692] mov si,PROMPT_TEXT ; "PROMPT=" + 23122 + 23123 ; --------------------------------------------------------------------------- 23124 - 23125 ; Input: DS:SI points to a "=" terminated string - 23126 ; Output: carry flag is set if name not found - 23127 ; otherwise name is deleted - 23128 - 23129 0000268E 56 push si - 23130 0000268F 1E push ds - 23131 00002690 E82C00 call FIND ; ES:DI points to name - 23132 00002693 7217 jc short del1 - 23133 00002695 89FE mov si,di ; Save it - 23134 00002697 E8BF00 call SCASB2 ; Scan for the nul - 23135 0000269A 87F7 xchg si,di - 23136 ;SR; - 23137 ; If we have only one env string, then the double null is lost when the last - 23138 ;string is deleted and we have an invalid empty environment with only a - 23139 ;single null. To avoid this, we will look for the double null case and then - 23140 ;move an extra null char. - 23141 ; Bugbug: The only possible problem is that the last pathstring - 23142 ;will be followed by a triple null. Is this really a problem? - 23143 - 23144 ; MSDOS 6.0 - 23145 0000269C 26803C00 cmp byte [es:si],0 ;null char? - 23146 000026A0 7501 jnz short not_dnull ;no, we are at a double null - 23147 000026A2 4E dec si ;point at the double null - 23148 not_dnull: - 23149 ; MSDOS 3.3 (& MSDOS 6.0) - 23150 000026A3 E86901 call GETENVSIZ - 23151 000026A6 29F1 sub cx,si - 23152 000026A8 06 push es - 23153 000026A9 1F pop ds ; ES:DI points to name - 23154 ; DS:SI points to next name - 23155 000026AA F3A4 rep movsb - 23156 del1: - 23157 000026AC 1F pop ds - 23158 000026AD 5E pop si - 23159 find_retn: - 23160 000026AE C3 retn - 23161 - 23162 ; =============== S U B R O U T I N E ======================================= - 23163 - 23164 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23165 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:23E2h - 23166 find_path: - 23167 000026AF BE[F192] mov si,PATH_TEXT ; "PATH=" - 23168 000026B2 EB03 jmp short find_name_in_environment - 23169 - 23170 ; =============== S U B R O U T I N E ======================================= - 23171 - 23172 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23173 find_prompt: - 23174 000026B4 BE[F692] mov si,PROMPT_TEXT ; "PROMPT=" - 23175 - 23176 ; --------------------------------------------------------------------------- - 23177 - 23178 find_name_in_environment: - 23179 - 23180 ; Input: DS:SI points to a "=" terminated string - 23181 ; Output: ES:DI points to the arguments in the environment - 23182 ; zero is set if name not found - 23183 ; carry flag is set if name not valid format - 23184 - 23185 000026B7 E80500 call FIND ; Find the name - 23186 000026BA 72F2 jc short find_retn ; Carry means not found - 23187 000026BC E99600 jmp SCASB1 ; Scan for = sign - 23188 - 23189 ; --------------------------------------------------------------------------- - 23190 ;nop + 23125 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23126 delete_name_in_environment: + 23127 + 23128 ; Input: DS:SI points to a "=" terminated string + 23129 ; Output: carry flag is set if name not found + 23130 ; otherwise name is deleted + 23131 + 23132 0000268E 56 push si + 23133 0000268F 1E push ds + 23134 00002690 E82C00 call FIND ; ES:DI points to name + 23135 00002693 7217 jc short del1 + 23136 00002695 89FE mov si,di ; Save it + 23137 00002697 E8BF00 call SCASB2 ; Scan for the nul + 23138 0000269A 87F7 xchg si,di + 23139 ;SR; + 23140 ; If we have only one env string, then the double null is lost when the last + 23141 ;string is deleted and we have an invalid empty environment with only a + 23142 ;single null. To avoid this, we will look for the double null case and then + 23143 ;move an extra null char. + 23144 ; Bugbug: The only possible problem is that the last pathstring + 23145 ;will be followed by a triple null. Is this really a problem? + 23146 + 23147 ; MSDOS 6.0 + 23148 0000269C 26803C00 cmp byte [es:si],0 ;null char? + 23149 000026A0 7501 jnz short not_dnull ;no, we are at a double null + 23150 000026A2 4E dec si ;point at the double null + 23151 not_dnull: + 23152 ; MSDOS 3.3 (& MSDOS 6.0) + 23153 000026A3 E86901 call GETENVSIZ + 23154 000026A6 29F1 sub cx,si + 23155 000026A8 06 push es + 23156 000026A9 1F pop ds ; ES:DI points to name + 23157 ; DS:SI points to next name + 23158 000026AA F3A4 rep movsb + 23159 del1: + 23160 000026AC 1F pop ds + 23161 000026AD 5E pop si + 23162 find_retn: + 23163 000026AE C3 retn + 23164 + 23165 ; =============== S U B R O U T I N E ======================================= + 23166 + 23167 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23168 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:23E2h + 23169 find_path: + 23170 000026AF BE[F192] mov si,PATH_TEXT ; "PATH=" + 23171 000026B2 EB03 jmp short find_name_in_environment + 23172 + 23173 ; =============== S U B R O U T I N E ======================================= + 23174 + 23175 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23176 find_prompt: + 23177 000026B4 BE[F692] mov si,PROMPT_TEXT ; "PROMPT=" + 23178 + 23179 ; --------------------------------------------------------------------------- + 23180 + 23181 find_name_in_environment: + 23182 + 23183 ; Input: DS:SI points to a "=" terminated string + 23184 ; Output: ES:DI points to the arguments in the environment + 23185 ; zero is set if name not found + 23186 ; carry flag is set if name not valid format + 23187 + 23188 000026B7 E80500 call FIND ; Find the name + 23189 000026BA 72F2 jc short find_retn ; Carry means not found + 23190 000026BC E99600 jmp SCASB1 ; Scan for = sign 23191 - 23192 ; =============== S U B R O U T I N E ======================================= - 23193 - 23194 ; On return of FIND1, ES:DI points to beginning of name - 23195 - 23196 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 23197 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 23198 FIND: - 23199 000026BF FC cld - 23200 000026C0 E84100 call COUNT0 ; CX = Length of name - 23201 000026C3 8E06[F59B] mov es,[RESSEG] - 23202 ;assume es:RESGROUP - 23203 000026C7 268E06[3A04] mov es,[es:EnvirSeg] - 23204 ;assume es:NOTHING - 23205 000026CC 31FF xor di,di - 23206 find1: - 23207 000026CE 51 push cx - 23208 000026CF 56 push si - 23209 000026D0 57 push di - 23210 find11: - 23211 000026D1 AC lodsb - 23212 ; 23/02/2023 - 23213 ; MSDOS 6.0 (& 5.0) - 23214 000026D2 E88C00 call testkanj - 23215 000026D5 740F jz short notkanj3 - 23216 000026D7 4E dec si - 23217 000026D8 AD lodsw - 23218 000026D9 47 inc di - 23219 000026DA 47 inc di - 23220 000026DB 263B45FE cmp ax,[es:di-2] - 23221 000026DF 7511 jne short find12 - 23222 000026E1 49 dec cx - 23223 000026E2 E2ED loop find11 - 23224 000026E4 EB0C jmp short find12 - 23225 notkanj3: - 23226 000026E6 E8A200 call UPCONV ; MSDOS 5.0 (& 6.0) - 23227 ;call UPCONV_MAPCALL ; MSDOS 3.3 - 23228 000026E9 47 inc di - 23229 000026EA 263A45FF cmp al,[es:di-1] - 23230 000026EE 7502 jne short find12 - 23231 000026F0 E2DF loop find11 - 23232 find12: - 23233 000026F2 5F pop di - 23234 000026F3 5E pop si - 23235 000026F4 59 pop cx - 23236 000026F5 74B7 jz short find_retn - 23237 000026F7 51 push cx - 23238 000026F8 E85E00 call SCASB2 ; Scan for a nul - 23239 000026FB 59 pop cx - 23240 000026FC 26803D00 cmp byte [es:di],0 - 23241 00002700 75CC jnz short find1 - 23242 00002702 F9 stc ; Indicate not found - 23243 00002703 C3 retn - 23244 - 23245 ; =============== S U B R O U T I N E ======================================= - 23246 - 23247 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23248 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2437h - 23249 COUNT0: - 23250 00002704 1E push ds - 23251 00002705 07 pop es - 23252 ;assume es:nothing - 23253 00002706 89F7 mov di,si - 23254 ;COUNT1: - 23255 00002708 57 push di ; Count number of chars until "=" - 23256 00002709 E84900 call SCASB1 - 23257 ; 23/02/2023 - 23258 ; jmp short COUNTX - 23259 ;COUNT2: - 23260 ; push di ; Count number of chars until nul - 23261 ; call SCASB2 - 23262 ;COUNTX: - 23263 0000270C 59 pop cx - 23264 0000270D 29CF sub di,cx - 23265 0000270F 87F9 xchg di,cx - 23266 move_name_retn: - 23267 00002711 C3 retn - 23268 - 23269 ; =============== S U B R O U T I N E ======================================= - 23270 - 23271 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23272 move_name: - 23273 00002712 803C0D cmp byte [si],13 ; 0Dh - 23274 00002715 74FA je short move_name_retn - 23275 00002717 AC lodsb - 23276 ; 23/02/2023 - 23277 ; MSDOS 6.0 (& 5.0) - 23278 00002718 E84600 call testkanj - 23279 0000271B 7409 jz short notkanj1 - 23280 0000271D E88D00 call store_char - 23281 00002720 AC lodsb - 23282 00002721 E88900 call store_char - 23283 00002724 EBEC jmp short move_name - 23284 notkanj1: - 23285 00002726 E86200 call UPCONV - 23286 ;call UPCONV_MAPCALL ; MSDOS 3.3 - 23287 00002729 E88100 call store_char - 23288 0000272C 3C3D cmp al,'=' - 23289 0000272E 75E2 jne short move_name - 23290 getarg_retn: - 23291 00002730 C3 retn - 23292 - 23293 ; =============== S U B R O U T I N E ======================================= - 23294 - 23295 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23296 GETARG: - 23297 00002731 BE8000 mov si,80h - 23298 00002734 AC lodsb - 23299 00002735 08C0 or al,al - 23300 00002737 74F7 jz short getarg_retn - 23301 00002739 E84A02 call scanoff - 23302 0000273C 3C0D cmp al,13 ; 0Dh - 23303 sdn_retn: - 23304 0000273E C3 retn - 23305 - 23306 ; =============== S U B R O U T I N E ======================================= - 23307 - 23308 ; Point ES:DI to the final NULL string. Note that in an empty environment, - 23309 ; there is NO double NULL, merely a string that is empty. + 23192 ; --------------------------------------------------------------------------- + 23193 ;nop + 23194 + 23195 ; =============== S U B R O U T I N E ======================================= + 23196 + 23197 ; On return of FIND1, ES:DI points to beginning of name + 23198 + 23199 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 23200 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 23201 FIND: + 23202 000026BF FC cld + 23203 000026C0 E84100 call COUNT0 ; CX = Length of name + 23204 000026C3 8E06[F59B] mov es,[RESSEG] + 23205 ;assume es:RESGROUP + 23206 000026C7 268E06[3A04] mov es,[es:EnvirSeg] + 23207 ;assume es:NOTHING + 23208 000026CC 31FF xor di,di + 23209 find1: + 23210 000026CE 51 push cx + 23211 000026CF 56 push si + 23212 000026D0 57 push di + 23213 find11: + 23214 000026D1 AC lodsb + 23215 ; 23/02/2023 + 23216 ; MSDOS 6.0 (& 5.0) + 23217 000026D2 E88C00 call testkanj + 23218 000026D5 740F jz short notkanj3 + 23219 000026D7 4E dec si + 23220 000026D8 AD lodsw + 23221 000026D9 47 inc di + 23222 000026DA 47 inc di + 23223 000026DB 263B45FE cmp ax,[es:di-2] + 23224 000026DF 7511 jne short find12 + 23225 000026E1 49 dec cx + 23226 000026E2 E2ED loop find11 + 23227 000026E4 EB0C jmp short find12 + 23228 notkanj3: + 23229 000026E6 E8A200 call UPCONV ; MSDOS 5.0 (& 6.0) + 23230 ;call UPCONV_MAPCALL ; MSDOS 3.3 + 23231 000026E9 47 inc di + 23232 000026EA 263A45FF cmp al,[es:di-1] + 23233 000026EE 7502 jne short find12 + 23234 000026F0 E2DF loop find11 + 23235 find12: + 23236 000026F2 5F pop di + 23237 000026F3 5E pop si + 23238 000026F4 59 pop cx + 23239 000026F5 74B7 jz short find_retn + 23240 000026F7 51 push cx + 23241 000026F8 E85E00 call SCASB2 ; Scan for a nul + 23242 000026FB 59 pop cx + 23243 000026FC 26803D00 cmp byte [es:di],0 + 23244 00002700 75CC jnz short find1 + 23245 00002702 F9 stc ; Indicate not found + 23246 00002703 C3 retn + 23247 + 23248 ; =============== S U B R O U T I N E ======================================= + 23249 + 23250 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23251 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2437h + 23252 COUNT0: + 23253 00002704 1E push ds + 23254 00002705 07 pop es + 23255 ;assume es:nothing + 23256 00002706 89F7 mov di,si + 23257 ;COUNT1: + 23258 00002708 57 push di ; Count number of chars until "=" + 23259 00002709 E84900 call SCASB1 + 23260 ; 23/02/2023 + 23261 ; jmp short COUNTX + 23262 ;COUNT2: + 23263 ; push di ; Count number of chars until nul + 23264 ; call SCASB2 + 23265 ;COUNTX: + 23266 0000270C 59 pop cx + 23267 0000270D 29CF sub di,cx + 23268 0000270F 87F9 xchg di,cx + 23269 move_name_retn: + 23270 00002711 C3 retn + 23271 + 23272 ; =============== S U B R O U T I N E ======================================= + 23273 + 23274 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23275 move_name: + 23276 00002712 803C0D cmp byte [si],13 ; 0Dh + 23277 00002715 74FA je short move_name_retn + 23278 00002717 AC lodsb + 23279 ; 23/02/2023 + 23280 ; MSDOS 6.0 (& 5.0) + 23281 00002718 E84600 call testkanj + 23282 0000271B 7409 jz short notkanj1 + 23283 0000271D E88D00 call store_char + 23284 00002720 AC lodsb + 23285 00002721 E88900 call store_char + 23286 00002724 EBEC jmp short move_name + 23287 notkanj1: + 23288 00002726 E86200 call UPCONV + 23289 ;call UPCONV_MAPCALL ; MSDOS 3.3 + 23290 00002729 E88100 call store_char + 23291 0000272C 3C3D cmp al,'=' + 23292 0000272E 75E2 jne short move_name + 23293 getarg_retn: + 23294 00002730 C3 retn + 23295 + 23296 ; =============== S U B R O U T I N E ======================================= + 23297 + 23298 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23299 GETARG: + 23300 00002731 BE8000 mov si,80h + 23301 00002734 AC lodsb + 23302 00002735 08C0 or al,al + 23303 00002737 74F7 jz short getarg_retn + 23304 00002739 E84A02 call scanoff + 23305 0000273C 3C0D cmp al,13 ; 0Dh + 23306 sdn_retn: + 23307 0000273E C3 retn + 23308 + 23309 ; =============== S U B R O U T I N E ======================================= 23310 - 23311 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23312 scan_double_null: - 23313 0000273F 8E06[F59B] mov es,[RESSEG] - 23314 00002743 268E06[3A04] mov es,[es:EnvirSeg] - 23315 00002748 31FF xor di,di - 23316 - 23317 ; Top cycle-point. If the string here is empty, then we are done - 23318 - 23319 sdn1: - 23320 0000274A 26803D00 cmp byte [es:di],0 ; nul string? - 23321 0000274E 74EE jz short sdn_retn ; yep, all done - 23322 00002750 E80600 call SCASB2 - 23323 00002753 EBF5 jmp short sdn1 - 23324 - 23325 ; =============== S U B R O U T I N E ======================================= - 23326 - 23327 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23328 SCASB1: - 23329 00002755 B03D mov al,'=' ; Scan for an = - 23330 00002757 EB02 jmp short SCASBX - 23331 - 23332 ; =============== S U B R O U T I N E ======================================= - 23333 - 23334 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23335 SCASB2: - 23336 00002759 30C0 xor al,al ; Scan for a nul - 23337 - 23338 ; --------------------------------------------------------------------------- - 23339 - 23340 ; 23/02/2023 - 23341 SCASBX: - 23342 0000275B B90001 mov cx,256 - 23343 0000275E F2AE repne scasb - 23344 00002760 C3 retn - 23345 - 23346 ; =============== S U B R O U T I N E ======================================= - 23347 - 23348 ; MSDOS 6.0 - 23349 - 23350 ;Bugbug: This is Kanji stuff - put it in conditionals - 23351 - 23352 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM - 23353 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:249Ah + 23311 ; Point ES:DI to the final NULL string. Note that in an empty environment, + 23312 ; there is NO double NULL, merely a string that is empty. + 23313 + 23314 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23315 scan_double_null: + 23316 0000273F 8E06[F59B] mov es,[RESSEG] + 23317 00002743 268E06[3A04] mov es,[es:EnvirSeg] + 23318 00002748 31FF xor di,di + 23319 + 23320 ; Top cycle-point. If the string here is empty, then we are done + 23321 + 23322 sdn1: + 23323 0000274A 26803D00 cmp byte [es:di],0 ; nul string? + 23324 0000274E 74EE jz short sdn_retn ; yep, all done + 23325 00002750 E80600 call SCASB2 + 23326 00002753 EBF5 jmp short sdn1 + 23327 + 23328 ; =============== S U B R O U T I N E ======================================= + 23329 + 23330 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23331 SCASB1: + 23332 00002755 B03D mov al,'=' ; Scan for an = + 23333 00002757 EB02 jmp short SCASBX + 23334 + 23335 ; =============== S U B R O U T I N E ======================================= + 23336 + 23337 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23338 SCASB2: + 23339 00002759 30C0 xor al,al ; Scan for a nul + 23340 + 23341 ; --------------------------------------------------------------------------- + 23342 + 23343 ; 23/02/2023 + 23344 SCASBX: + 23345 0000275B B90001 mov cx,256 + 23346 0000275E F2AE repne scasb + 23347 00002760 C3 retn + 23348 + 23349 ; =============== S U B R O U T I N E ======================================= + 23350 + 23351 ; MSDOS 6.0 + 23352 + 23353 ;Bugbug: This is Kanji stuff - put it in conditionals 23354 - 23355 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM - 23356 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2872h - 23357 testkanj: - 23358 00002761 1E push ds ;AN000; 3/3/KK - 23359 00002762 56 push si ;AN000; 3/3/KK - 23360 00002763 50 push ax ;AN000; 3/3/KK - 23361 00002764 2E8E1E[F59B] mov ds,[cs:RESSEG] ;AN000; Get resident segment - 23362 00002769 C536[BA02] lds si,[Dbcs_Vector_Addr] ;AN000; get DBCS vector - 23363 ktlop: ;AN000; 3/3/KK - 23364 0000276D 833C00 cmp word [si],0 ;AN000; end of Table 3/3/KK - 23365 00002770 740E je short notlead ;AN000; 3/3/KK - 23366 00002772 58 pop ax ;AN000; 3/3/KK - 23367 00002773 50 push ax ;AN000; 3/3/KK - 23368 00002774 3A04 cmp al,[si] ;AN000; 3/3/KK - 23369 00002776 7208 jb short notlead ;AN000; 3/3/KK - 23370 00002778 46 inc si ;AN000; 3/3/KK - 23371 00002779 3A04 cmp al,[si] ;AN000; 3/3/KK - 23372 0000277B 7607 jbe short islead ;AN000; 3/3/KK - 23373 0000277D 46 inc si ;AN000; 3/3/KK - 23374 0000277E EBED jmp short ktlop ;AN000; try another range ; 3/3/KK - 23375 notlead: ;AN000; 3/3/KK - 23376 00002780 31C0 xor ax,ax ;AN000; set zero 3/3/KK - 23377 00002782 EB03 jmp short ktret ;AN000; 3/3/KK - 23378 islead: ;AN000; 3/3/KK - 23379 00002784 31C0 xor ax,ax ;AN000; reset zero 3/3/KK - 23380 00002786 40 inc ax ;AN000; 3/3/KK - 23381 ktret: ;AN000; 3/3/KK - 23382 00002787 58 pop ax ;AN000; 3/3/KK - 23383 00002788 5E pop si ;AN000; 3/3/KK - 23384 00002789 1F pop ds ;AN000; 3/3/KK - 23385 0000278A C3 retn ;AN000; 3/3/KK - 23386 - 23387 ; =============== S U B R O U T I N E ======================================= - 23388 - 23389 ; MSDOS 6.0 - 23390 - 23391 ; **************************************************************** - 23392 ; * - 23393 ; * ROUTINE: UPCONV (ADDED BY EMG 4.00) - 23394 ; * - 23395 ; * FUNCTION: This routine returns the upper case equivalent of - 23396 ; * the character in AL from the file upper case table - 23397 ; * in DOS if character if above ascii 128, else - 23398 ; * subtracts 20H if between "a" and "z". - 23399 ; * - 23400 ; * INPUT: AL char to be upper cased - 23401 ; * FUCASE_ADDR set to the file upper case table + 23355 ; 23/02/2023 - Retro DOS v4.0 COMMAND.COM + 23356 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:249Ah + 23357 + 23358 ; 26/07/2024 - Retro DOS v5.0 COMMAND.COM + 23359 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2872h + 23360 testkanj: + 23361 00002761 1E push ds ;AN000; 3/3/KK + 23362 00002762 56 push si ;AN000; 3/3/KK + 23363 00002763 50 push ax ;AN000; 3/3/KK + 23364 00002764 2E8E1E[F59B] mov ds,[cs:RESSEG] ;AN000; Get resident segment + 23365 00002769 C536[BA02] lds si,[Dbcs_Vector_Addr] ;AN000; get DBCS vector + 23366 ktlop: ;AN000; 3/3/KK + 23367 0000276D 833C00 cmp word [si],0 ;AN000; end of Table 3/3/KK + 23368 00002770 740E je short notlead ;AN000; 3/3/KK + 23369 00002772 58 pop ax ;AN000; 3/3/KK + 23370 00002773 50 push ax ;AN000; 3/3/KK + 23371 00002774 3A04 cmp al,[si] ;AN000; 3/3/KK + 23372 00002776 7208 jb short notlead ;AN000; 3/3/KK + 23373 00002778 46 inc si ;AN000; 3/3/KK + 23374 00002779 3A04 cmp al,[si] ;AN000; 3/3/KK + 23375 0000277B 7607 jbe short islead ;AN000; 3/3/KK + 23376 0000277D 46 inc si ;AN000; 3/3/KK + 23377 0000277E EBED jmp short ktlop ;AN000; try another range ; 3/3/KK + 23378 notlead: ;AN000; 3/3/KK + 23379 00002780 31C0 xor ax,ax ;AN000; set zero 3/3/KK + 23380 00002782 EB03 jmp short ktret ;AN000; 3/3/KK + 23381 islead: ;AN000; 3/3/KK + 23382 00002784 31C0 xor ax,ax ;AN000; reset zero 3/3/KK + 23383 00002786 40 inc ax ;AN000; 3/3/KK + 23384 ktret: ;AN000; 3/3/KK + 23385 00002787 58 pop ax ;AN000; 3/3/KK + 23386 00002788 5E pop si ;AN000; 3/3/KK + 23387 00002789 1F pop ds ;AN000; 3/3/KK + 23388 0000278A C3 retn ;AN000; 3/3/KK + 23389 + 23390 ; =============== S U B R O U T I N E ======================================= + 23391 + 23392 ; MSDOS 6.0 + 23393 + 23394 ; **************************************************************** + 23395 ; * + 23396 ; * ROUTINE: UPCONV (ADDED BY EMG 4.00) + 23397 ; * + 23398 ; * FUNCTION: This routine returns the upper case equivalent of + 23399 ; * the character in AL from the file upper case table + 23400 ; * in DOS if character if above ascii 128, else + 23401 ; * subtracts 20H if between "a" and "z". 23402 ; * - 23403 ; * OUTPUT: AL upper cased character - 23404 ; * - 23405 ; **************************************************************** - 23406 - 23407 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 23408 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:24C4h + 23403 ; * INPUT: AL char to be upper cased + 23404 ; * FUCASE_ADDR set to the file upper case table + 23405 ; * + 23406 ; * OUTPUT: AL upper cased character + 23407 ; * + 23408 ; **************************************************************** 23409 - 23410 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 23411 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2A6Eh + 23410 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 23411 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:24C4h 23412 - 23413 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 23414 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:289Ch - 23415 UPCONV: - 23416 0000278B 3C80 cmp al,80h ;AN000; see if char is > ascii 128 - 23417 0000278D 7213 jb short oth_fucase ;AN000; no - upper case math - 23418 0000278F 2C80 sub al,80h ;AN000; only upper 128 chars in table - 23419 00002791 1E push ds ;AN000; - 23420 00002792 53 push bx ;AN000; - 23421 00002793 8E1E[F59B] mov ds,[RESSEG] ;AN000; get resident data segment - 23422 ;lds bx,dword ptr FUCase_Addr+1 - 23423 00002797 C51E[B602] lds bx,[FUCase_Addr+1] ;AN000; get table address - 23424 0000279B 83C302 add bx,2 ;AN000; skip over first word - 23425 ;xlat ds:byte ptr [bx] ;AN000; convert to upper case - 23426 0000279E D7 xlat - 23427 0000279F 5B pop bx ;AN000; - 23428 000027A0 1F pop ds ;AN000; - 23429 ;jmp short upconv_end ;AN000; we finished - exit - 23430 ; 10/06/2023 - 23431 upconv_end: - 23432 ; 24/02/2023 - 23433 000027A1 C3 retn - 23434 oth_fucase: ;AN000; - 23435 000027A2 3C61 cmp al,'a' ; small_a ;AC000; if between "a" and "z", - 23436 000027A4 72FB jb short upconv_end ;AC000; subtract 20h to get - 23437 000027A6 3C7A cmp al,'z' ; small_z ;AC000; upper case equivalent. - 23438 000027A8 77F7 ja short upconv_end ;AC000; - 23439 000027AA 2C20 sub al,20h ;AC000; Change lower-case to upper - 23440 ;upconv_end: ; 10/06/2023 ;AN000; - 23441 000027AC C3 retn - 23442 - 23443 ; --------------------------------------------------------------------------- - 23444 - 23445 ; MSDOS 3.3 - 23446 - 23447 ; 24/02/2023 - 23448 ;UPCONV_MAPCALL: - 23449 ; ; If between "a" and "z" - 23450 ;cmp al,[small_a] - 23451 ;jb short UPCONV_END - 23452 ;cmp al,[small_z] - 23453 ;ja short UPCONV_END - 23454 ;sub al,20h ; Change lower-case to upper - 23455 ;UPCONV_END: - 23456 ;call far [cs:MAP_CALL] ; (far) call to char mapping routine - 23457 ; ; for (current) country - 23458 ;retn - 23459 - 23460 ; =============== S U B R O U T I N E ======================================= - 23461 - 23462 ; STORE A CHAR IN environment, GROWING IT IF NECESSARY - 23463 - 23464 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 23465 store_char: - 23466 000027AD 51 push cx - 23467 000027AE 53 push bx - 23468 - 23469 ; 24/02/2023 - 23470 ;;16/10/2018 - 23471 ; MSDOS 6.0 - 23472 000027AF 06 push es ;AN056;* - 23473 000027B0 1E push ds ;AN056; Save local DS - 23474 000027B1 8E1E[F59B] mov ds,[RESSEG] ;AN056; Get resident segment - 23475 000027B5 8E06[3A04] mov es,[EnvirSeg] ;AN056; Get environment segment - 23476 000027B9 1F pop ds ;AN056; Get local segment back - 23477 - 23478 ; MSDOS 3.3 (& MSDOS 6.0) - 23479 000027BA E85200 call GETENVSIZ - 23480 000027BD 89CB mov bx,cx ; Save room for double nul - 23481 000027BF 83EB02 sub bx,2 - 23482 000027C2 39DF cmp di,bx - 23483 000027C4 723F jb short store1 - 23484 000027C6 50 push ax - 23485 000027C7 51 push cx - 23486 000027C8 53 push bx ; Save Size of environment - 23487 000027C9 E847E0 call FREE_TPA - 23488 000027CC 5B pop bx - 23489 000027CD 83C302 add bx,2 ; Recover true environment size - 23490 - 23491 000027D0 81FB0080 cmp bx,8000h ; Don't let environment grow > 32K - 23492 000027D4 7203 jb short envsiz_ok - 23493 bad_env_size: ;AN056; - 23494 000027D6 F9 stc - 23495 000027D7 EB16 jmp short envnoset - 23496 ;nop - 23497 envsiz_ok: - 23498 000027D9 B104 mov cl,4 - 23499 000027DB D3EB shr bx,cl ; Convert back to paragraphs - 23500 000027DD 43 inc bx - 23501 ; 24/02/2023 - 23502 ; MSDOS 6.0 - 23503 000027DE 8CC1 mov cx,es ;AN056; Get environment segment - 23504 000027E0 01D9 add cx,bx ;AN056; Add in size of environment - 23505 000027E2 83C120 add cx,20h ;AN056; Add in some TPA - 23506 000027E5 8CC8 mov ax,cs ;AN056; Get the transient segment - 23507 000027E7 39C1 cmp cx,ax ;AN056; Are we hitting the transient? - 23508 000027E9 73EB jnb short bad_env_size - 23509 ;AN056; Yes - don't do it!!! - 23510 ; MSDOS 3.3 (& MSDOS 6.0) - 23511 000027EB B44A mov ah,4Ah - 23512 ;mov ah,SETBLOCK ; 4Ah - 23513 000027ED CD21 int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK) - 23514 ; ES = segment address of block to change - 23515 ; BX = new size in paragraphs - 23516 envnoset: - 23517 000027EF 9C pushf - 23518 000027F0 06 push es - 23519 000027F1 8E06[F59B] mov es,[RESSEG] - 23520 000027F5 E82CE0 call ALLOC_TPA - 23521 000027F8 07 pop es - 23522 000027F9 9D popf - 23523 000027FA 59 pop cx - 23524 000027FB 58 pop ax - 23525 ; 10/06/2023 - 23526 000027FC 7307 jnc short store1 - 23527 ; 24/02/2023 - 23528 000027FE 07 pop es ; MSDOS 6.0 ;AN056;* - 23529 ;jnc short store1 - 23530 000027FF BA[EE8F] mov dx,ENVERR_PTR - 23531 00002802 E92105 jmp cerror - 23532 store1: - 23533 00002805 AA stosb - 23534 00002806 26C7050000 mov word [es:di],0 ; NULL IS AT END - 23535 ; 24/02/2023 - 23536 0000280B 07 pop es ; MSDOS 6.0 ;AN056;* - 23537 0000280C 5B pop bx - 23538 0000280D 59 pop cx - 23539 0000280E C3 retn - 23540 - 23541 ; =============== S U B R O U T I N E ======================================= - 23542 - 23543 ; 24/02/2023 - 23544 GETENVSIZ: + 23413 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 23414 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2A6Eh + 23415 + 23416 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 23417 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:289Ch + 23418 UPCONV: + 23419 0000278B 3C80 cmp al,80h ;AN000; see if char is > ascii 128 + 23420 0000278D 7213 jb short oth_fucase ;AN000; no - upper case math + 23421 0000278F 2C80 sub al,80h ;AN000; only upper 128 chars in table + 23422 00002791 1E push ds ;AN000; + 23423 00002792 53 push bx ;AN000; + 23424 00002793 8E1E[F59B] mov ds,[RESSEG] ;AN000; get resident data segment + 23425 ;lds bx,dword ptr FUCase_Addr+1 + 23426 00002797 C51E[B602] lds bx,[FUCase_Addr+1] ;AN000; get table address + 23427 0000279B 83C302 add bx,2 ;AN000; skip over first word + 23428 ;xlat ds:byte ptr [bx] ;AN000; convert to upper case + 23429 0000279E D7 xlat + 23430 0000279F 5B pop bx ;AN000; + 23431 000027A0 1F pop ds ;AN000; + 23432 ;jmp short upconv_end ;AN000; we finished - exit + 23433 ; 10/06/2023 + 23434 upconv_end: + 23435 ; 24/02/2023 + 23436 000027A1 C3 retn + 23437 oth_fucase: ;AN000; + 23438 000027A2 3C61 cmp al,'a' ; small_a ;AC000; if between "a" and "z", + 23439 000027A4 72FB jb short upconv_end ;AC000; subtract 20h to get + 23440 000027A6 3C7A cmp al,'z' ; small_z ;AC000; upper case equivalent. + 23441 000027A8 77F7 ja short upconv_end ;AC000; + 23442 000027AA 2C20 sub al,20h ;AC000; Change lower-case to upper + 23443 ;upconv_end: ; 10/06/2023 ;AN000; + 23444 000027AC C3 retn + 23445 + 23446 ; --------------------------------------------------------------------------- + 23447 + 23448 ; MSDOS 3.3 + 23449 + 23450 ; 24/02/2023 + 23451 ;UPCONV_MAPCALL: + 23452 ; ; If between "a" and "z" + 23453 ;cmp al,[small_a] + 23454 ;jb short UPCONV_END + 23455 ;cmp al,[small_z] + 23456 ;ja short UPCONV_END + 23457 ;sub al,20h ; Change lower-case to upper + 23458 ;UPCONV_END: + 23459 ;call far [cs:MAP_CALL] ; (far) call to char mapping routine + 23460 ; ; for (current) country + 23461 ;retn + 23462 + 23463 ; =============== S U B R O U T I N E ======================================= + 23464 + 23465 ; STORE A CHAR IN environment, GROWING IT IF NECESSARY + 23466 + 23467 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 23468 store_char: + 23469 000027AD 51 push cx + 23470 000027AE 53 push bx + 23471 + 23472 ; 24/02/2023 + 23473 ;;16/10/2018 + 23474 ; MSDOS 6.0 + 23475 000027AF 06 push es ;AN056;* + 23476 000027B0 1E push ds ;AN056; Save local DS + 23477 000027B1 8E1E[F59B] mov ds,[RESSEG] ;AN056; Get resident segment + 23478 000027B5 8E06[3A04] mov es,[EnvirSeg] ;AN056; Get environment segment + 23479 000027B9 1F pop ds ;AN056; Get local segment back + 23480 + 23481 ; MSDOS 3.3 (& MSDOS 6.0) + 23482 000027BA E85200 call GETENVSIZ + 23483 000027BD 89CB mov bx,cx ; Save room for double nul + 23484 000027BF 83EB02 sub bx,2 + 23485 000027C2 39DF cmp di,bx + 23486 000027C4 723F jb short store1 + 23487 000027C6 50 push ax + 23488 000027C7 51 push cx + 23489 000027C8 53 push bx ; Save Size of environment + 23490 000027C9 E847E0 call FREE_TPA + 23491 000027CC 5B pop bx + 23492 000027CD 83C302 add bx,2 ; Recover true environment size + 23493 + 23494 000027D0 81FB0080 cmp bx,8000h ; Don't let environment grow > 32K + 23495 000027D4 7203 jb short envsiz_ok + 23496 bad_env_size: ;AN056; + 23497 000027D6 F9 stc + 23498 000027D7 EB16 jmp short envnoset + 23499 ;nop + 23500 envsiz_ok: + 23501 000027D9 B104 mov cl,4 + 23502 000027DB D3EB shr bx,cl ; Convert back to paragraphs + 23503 000027DD 43 inc bx + 23504 ; 24/02/2023 + 23505 ; MSDOS 6.0 + 23506 000027DE 8CC1 mov cx,es ;AN056; Get environment segment + 23507 000027E0 01D9 add cx,bx ;AN056; Add in size of environment + 23508 000027E2 83C120 add cx,20h ;AN056; Add in some TPA + 23509 000027E5 8CC8 mov ax,cs ;AN056; Get the transient segment + 23510 000027E7 39C1 cmp cx,ax ;AN056; Are we hitting the transient? + 23511 000027E9 73EB jnb short bad_env_size + 23512 ;AN056; Yes - don't do it!!! + 23513 ; MSDOS 3.3 (& MSDOS 6.0) + 23514 000027EB B44A mov ah,4Ah + 23515 ;mov ah,SETBLOCK ; 4Ah + 23516 000027ED CD21 int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK) + 23517 ; ES = segment address of block to change + 23518 ; BX = new size in paragraphs + 23519 envnoset: + 23520 000027EF 9C pushf + 23521 000027F0 06 push es + 23522 000027F1 8E06[F59B] mov es,[RESSEG] + 23523 000027F5 E82CE0 call ALLOC_TPA + 23524 000027F8 07 pop es + 23525 000027F9 9D popf + 23526 000027FA 59 pop cx + 23527 000027FB 58 pop ax + 23528 ; 10/06/2023 + 23529 000027FC 7307 jnc short store1 + 23530 ; 24/02/2023 + 23531 000027FE 07 pop es ; MSDOS 6.0 ;AN056;* + 23532 ;jnc short store1 + 23533 000027FF BA[EE8F] mov dx,ENVERR_PTR + 23534 00002802 E92105 jmp cerror + 23535 store1: + 23536 00002805 AA stosb + 23537 00002806 26C7050000 mov word [es:di],0 ; NULL IS AT END + 23538 ; 24/02/2023 + 23539 0000280B 07 pop es ; MSDOS 6.0 ;AN056;* + 23540 0000280C 5B pop bx + 23541 0000280D 59 pop cx + 23542 0000280E C3 retn + 23543 + 23544 ; =============== S U B R O U T I N E ======================================= 23545 - 23546 ;Get size of environment in bytes, rounded up to paragraph boundry - 23547 ;ES has environment segment - 23548 ;Size returned in CX, all other registers preserved - 23549 - 23550 0000280F 06 push es - 23551 00002810 50 push ax - 23552 00002811 8CC0 mov ax,es - 23553 00002813 48 dec ax ;Point at arena - 23554 00002814 8EC0 mov es,ax - 23555 ;mov ax,[es:3] - 23556 00002816 26A10300 mov ax,[es:ARENA.size] - 23557 0000281A B104 mov cl,4 - 23558 0000281C D3E0 shl ax,cl ;Convert to bytes - 23559 0000281E 89C1 mov cx,ax - 23560 00002820 58 pop ax - 23561 00002821 07 pop es - 23562 getenvsiz_retn: - 23563 00002822 C3 retn - 23564 - 23565 ; =============== S U B R O U T I N E ======================================= - 23566 - 23567 ; 24/02/2023 - 23568 RestUDir1: - 23569 00002823 1E push ds - 23570 00002824 8E1E[F59B] mov ds,[RESSEG] - 23571 00002828 803E[A102]00 cmp byte [RestDir],0 - 23572 0000282D 1F pop ds - 23573 0000282E 74F2 jz short getenvsiz_retn - 23574 - 23575 ; =============== S U B R O U T I N E ======================================= - 23576 - 23577 ; 24/02/2023 - 23578 RestUDir: - 23579 00002830 BA[D79A] mov dx,USERDIR1 - 23580 00002833 B43B mov ah,3Bh - 23581 ;mov ah,CHDir ; 3Bh - 23582 00002835 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 23583 ; DS:DX -> ASCIZ directory name (may include drive) - 23584 00002837 30C0 xor al,al - 23585 ;call SETREST - 23586 ;retn - 23587 ; 24/02/2023 - 23588 00002839 E9DA08 jmp SETREST - 23589 - 23590 ;============================================================================ - 23591 ; TENV2.ASM, MSDOS 6.0, 1991 - 23592 ;============================================================================ - 23593 ; 07/10/2018 - Retro DOS v3.0 - 23594 - 23595 ; TITLE Part6 COMMAND Transient routines. - 23596 - 23597 ; Environment utilities and misc. routines - 23598 - 23599 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 18C2h - 23600 - 23601 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 23602 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2577h + 23546 ; 24/02/2023 + 23547 GETENVSIZ: + 23548 + 23549 ;Get size of environment in bytes, rounded up to paragraph boundry + 23550 ;ES has environment segment + 23551 ;Size returned in CX, all other registers preserved + 23552 + 23553 0000280F 06 push es + 23554 00002810 50 push ax + 23555 00002811 8CC0 mov ax,es + 23556 00002813 48 dec ax ;Point at arena + 23557 00002814 8EC0 mov es,ax + 23558 ;mov ax,[es:3] + 23559 00002816 26A10300 mov ax,[es:ARENA.size] + 23560 0000281A B104 mov cl,4 + 23561 0000281C D3E0 shl ax,cl ;Convert to bytes + 23562 0000281E 89C1 mov cx,ax + 23563 00002820 58 pop ax + 23564 00002821 07 pop es + 23565 getenvsiz_retn: + 23566 00002822 C3 retn + 23567 + 23568 ; =============== S U B R O U T I N E ======================================= + 23569 + 23570 ; 24/02/2023 + 23571 RestUDir1: + 23572 00002823 1E push ds + 23573 00002824 8E1E[F59B] mov ds,[RESSEG] + 23574 00002828 803E[A102]00 cmp byte [RestDir],0 + 23575 0000282D 1F pop ds + 23576 0000282E 74F2 jz short getenvsiz_retn + 23577 + 23578 ; =============== S U B R O U T I N E ======================================= + 23579 + 23580 ; 24/02/2023 + 23581 RestUDir: + 23582 00002830 BA[D79A] mov dx,USERDIR1 + 23583 00002833 B43B mov ah,3Bh + 23584 ;mov ah,CHDir ; 3Bh + 23585 00002835 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 23586 ; DS:DX -> ASCIZ directory name (may include drive) + 23587 00002837 30C0 xor al,al + 23588 ;call SETREST + 23589 ;retn + 23590 ; 24/02/2023 + 23591 00002839 E9DA08 jmp SETREST + 23592 + 23593 ;============================================================================ + 23594 ; TENV2.ASM, MSDOS 6.0, 1991 + 23595 ;============================================================================ + 23596 ; 07/10/2018 - Retro DOS v3.0 + 23597 + 23598 ; TITLE Part6 COMMAND Transient routines. + 23599 + 23600 ; Environment utilities and misc. routines + 23601 + 23602 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 18C2h 23603 - 23604 ; --------------------------------------------------------------------------- - 23605 - 23606 ; **************************************************************** - 23607 ; * - 23608 ; * ROUTINE: $CHDIR - 23609 ; * - 23610 ; * FUNCTION: Entry point for CHDIR command. Parse the command - 23611 ; * line. If path is found, CHDIR to path. If a drive - 23612 ; * letter is found, get and display the current dir - 23613 ; * of the specified drive. If nothing is found, get - 23614 ; * and display the current dir of the default drive. - 23615 ; * - 23616 ; * INPUT: command line at offset 81H - 23617 ; * - 23618 ; * OUTPUT: none - 23619 ; * - 23620 ; **************************************************************** - 23621 - 23622 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 23623 - 23624 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM - 23625 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2B21h + 23604 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 23605 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2577h + 23606 + 23607 ; --------------------------------------------------------------------------- + 23608 + 23609 ; **************************************************************** + 23610 ; * + 23611 ; * ROUTINE: $CHDIR + 23612 ; * + 23613 ; * FUNCTION: Entry point for CHDIR command. Parse the command + 23614 ; * line. If path is found, CHDIR to path. If a drive + 23615 ; * letter is found, get and display the current dir + 23616 ; * of the specified drive. If nothing is found, get + 23617 ; * and display the current dir of the default drive. + 23618 ; * + 23619 ; * INPUT: command line at offset 81H + 23620 ; * + 23621 ; * OUTPUT: none + 23622 ; * + 23623 ; **************************************************************** + 23624 + 23625 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) 23626 - 23627 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 23628 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:294Fh + 23627 ; 10/06/2023 - Retro DOS v4.2 COMMAND.COM + 23628 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2B21h 23629 - 23630 _$CHDIR: - 23631 ; MSDOS 6.0 - 23632 0000283C BE8100 mov si,81h - 23633 0000283F BF[9196] mov di,PARSE_CHDIR - 23634 ;AN000; Get address of PARSE_CHDIR - 23635 00002842 31C9 xor cx,cx ;AN000; clear cx,dx - 23636 00002844 31D2 xor dx,dx ;AN000; - 23637 00002846 E812FD call Parse_With_Msg ;AC018; call parser - 23638 - 23639 ;cmp ax,-1 - 23640 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 23641 ;je short bwdj ; No args - 23642 ;;cmp ax,0 - 23643 ;;cmp ax,RESULT_NO_ERROR - 23644 ; ;AC000; did we have an error? - 23645 ;or ax,ax ; ax = 0 ? - 23646 ;jnz short ChDirErr ;AC018; yes - exit - 23647 - 23648 ; 10/06/2023 - 23649 00002849 40 inc ax ; cmp ax,-1 - 23650 0000284A 7414 jz short bwdj ; 0FFFFh -> 0 - 23651 0000284C 48 dec ax ; cmp ax,0 - 23652 0000284D 756F jnz short ChDirErr ; 1 -> 0 - 23653 ; ax = 0 - 23654 - 23655 ;cmp byte [PARSE1_TYPE],6 - 23656 0000284F 803E[EBA5]06 cmp byte [PARSE1_TYPE],result_drive - 23657 ;AC000; was a drive entered? - 23658 00002854 7511 jne short REALCD ; no - 23659 - 23660 ; D: was found. See if there is anything more. - 23661 - 23662 00002856 BF[9196] mov di,PARSE_CHDIR - 23663 ;AC000; get address of parse_chdir - 23664 00002859 31D2 xor dx,dx ;AC000; - 23665 0000285B E8E7FC call parse_check_eol ;AC000; call parser - 23666 0000285E 755E jnz short ChDirErr ;AC000; - 23667 bwdj: - 23668 00002860 E88AF9 call build_dir_for_chdir - 23669 ; Drive only specified - 23670 00002863 E81301 call CRLF2 - 23671 chdir_retn: - 23672 00002866 C3 retn - 23673 - 23674 ; 24/02/2023 - 23675 ; MSDOS 3.3 - 23676 ;mov ax,[COMSW] - 23677 ;or ax,[ALLSWITCH] - 23678 ;mov dx,BADPARMPTR - 23679 ;jnz short CHDIR_ERR - 23680 ;mov si,81h - 23681 ;call SCANOFF - 23682 ;cmp al,0Dh ; are we at end of line? - 23683 ;je short BWDJ ; No args - 23684 ;inc si - 23685 ;lodsb - 23686 ;cmp al,':' - 23687 ;jne short REALCD - 23688 ;push si - 23689 ;call SCANOFF - 23690 ;pop si - 23691 ;cmp al,0Dh ; was a drive entered? - 23692 ;jne short REALCD ; no - 23693 ;BWDJ: - 23694 ;call BUILD_DIR_FOR_CHDIR ; Drive only specified - 23695 ;call CRLF2 - 23696 ;CHDIR_RETN: - 23697 ;retn - 23698 - 23699 ; 24/02/2023 - 23700 ; MSDOS 6.0 - 23701 REALCD: - 23702 00002867 56 push si ;AN000; save position in line - 23703 00002868 C536[EFA5] lds si,[PARSE1_ADDR] - 23704 ;AN000; get address of filespec - 23705 0000286C E86908 call Move_To_SrcBuf ;AN000; move to srcbuf - 23706 0000286F 5E pop si ;AN000; restore position in line - 23707 00002870 BF[9196] mov di,PARSE_CHDIR ;AC000; get address of parse_chdir - 23708 00002873 31D2 xor dx,dx ;AC000; - 23709 00002875 E8CDFC call parse_check_eol ;AC000; call parser - 23710 00002878 7544 jnz short ChDirErr ;AC000; - 23711 - 23712 0000287A E8A206 call SETPATH - 23713 0000287D F606[BD9D]02 test byte [DestInfo],2 - 23714 00002882 7519 jnz short BadChDir - 23715 - 23716 ; 26/04/2023 - 23717 00002884 B43B mov ah,3Bh - 23718 ;mov ah,CHDir - 23719 ;int 21h - 23720 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 23721 00002886 E831DD call int_21h_indirect - 23722 00002889 73DB jnc short chdir_retn - 23723 - 23724 0000288B E8BDF7 call get_ext_error_number - 23725 ;AN022; get the extended error - 23726 0000288E 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 - 23727 ;AN022; see if path not found - 23728 00002891 740A je short BadChDir ;AN022; yes - issue old message - 23729 ;SR; - 23730 ; We want to issue "Invalid Directory" message even if the path is valid - 23731 ;but is not a directory. The extended error returns "Access denied" which - 23732 ;is kind of confusing. Issue the old message if access denied error is - 23733 ;returned - 23734 - 23735 00002893 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 - 23736 00002896 7405 je short BadChDir - 23737 - 23738 00002898 E8A200 call set_ext_error_subst ;AN022; - 23739 0000289B EB21 jmp short ChDirErr ;AN022; - 23740 - 23741 BadChDir: - 23742 0000289D BA[3791] mov dx,badcd_ptr - 23743 ;ChDirErr: - 23744 ; call std_eprintf - 23745 ;mkdir_retn: - 23746 ;retn - 23747 ; 24/02/2023 - 23748 000028A0 EB1C jmp short ChDirErr ;AN022; - 23749 + 23630 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 23631 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:294Fh + 23632 + 23633 _$CHDIR: + 23634 ; MSDOS 6.0 + 23635 0000283C BE8100 mov si,81h + 23636 0000283F BF[9196] mov di,PARSE_CHDIR + 23637 ;AN000; Get address of PARSE_CHDIR + 23638 00002842 31C9 xor cx,cx ;AN000; clear cx,dx + 23639 00002844 31D2 xor dx,dx ;AN000; + 23640 00002846 E812FD call Parse_With_Msg ;AC018; call parser + 23641 + 23642 ;cmp ax,-1 + 23643 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 23644 ;je short bwdj ; No args + 23645 ;;cmp ax,0 + 23646 ;;cmp ax,RESULT_NO_ERROR + 23647 ; ;AC000; did we have an error? + 23648 ;or ax,ax ; ax = 0 ? + 23649 ;jnz short ChDirErr ;AC018; yes - exit + 23650 + 23651 ; 10/06/2023 + 23652 00002849 40 inc ax ; cmp ax,-1 + 23653 0000284A 7414 jz short bwdj ; 0FFFFh -> 0 + 23654 0000284C 48 dec ax ; cmp ax,0 + 23655 0000284D 756F jnz short ChDirErr ; 1 -> 0 + 23656 ; ax = 0 + 23657 + 23658 ;cmp byte [PARSE1_TYPE],6 + 23659 0000284F 803E[EBA5]06 cmp byte [PARSE1_TYPE],result_drive + 23660 ;AC000; was a drive entered? + 23661 00002854 7511 jne short REALCD ; no + 23662 + 23663 ; D: was found. See if there is anything more. + 23664 + 23665 00002856 BF[9196] mov di,PARSE_CHDIR + 23666 ;AC000; get address of parse_chdir + 23667 00002859 31D2 xor dx,dx ;AC000; + 23668 0000285B E8E7FC call parse_check_eol ;AC000; call parser + 23669 0000285E 755E jnz short ChDirErr ;AC000; + 23670 bwdj: + 23671 00002860 E88AF9 call build_dir_for_chdir + 23672 ; Drive only specified + 23673 00002863 E81301 call CRLF2 + 23674 chdir_retn: + 23675 00002866 C3 retn + 23676 + 23677 ; 24/02/2023 + 23678 ; MSDOS 3.3 + 23679 ;mov ax,[COMSW] + 23680 ;or ax,[ALLSWITCH] + 23681 ;mov dx,BADPARMPTR + 23682 ;jnz short CHDIR_ERR + 23683 ;mov si,81h + 23684 ;call SCANOFF + 23685 ;cmp al,0Dh ; are we at end of line? + 23686 ;je short BWDJ ; No args + 23687 ;inc si + 23688 ;lodsb + 23689 ;cmp al,':' + 23690 ;jne short REALCD + 23691 ;push si + 23692 ;call SCANOFF + 23693 ;pop si + 23694 ;cmp al,0Dh ; was a drive entered? + 23695 ;jne short REALCD ; no + 23696 ;BWDJ: + 23697 ;call BUILD_DIR_FOR_CHDIR ; Drive only specified + 23698 ;call CRLF2 + 23699 ;CHDIR_RETN: + 23700 ;retn + 23701 + 23702 ; 24/02/2023 + 23703 ; MSDOS 6.0 + 23704 REALCD: + 23705 00002867 56 push si ;AN000; save position in line + 23706 00002868 C536[EFA5] lds si,[PARSE1_ADDR] + 23707 ;AN000; get address of filespec + 23708 0000286C E86908 call Move_To_SrcBuf ;AN000; move to srcbuf + 23709 0000286F 5E pop si ;AN000; restore position in line + 23710 00002870 BF[9196] mov di,PARSE_CHDIR ;AC000; get address of parse_chdir + 23711 00002873 31D2 xor dx,dx ;AC000; + 23712 00002875 E8CDFC call parse_check_eol ;AC000; call parser + 23713 00002878 7544 jnz short ChDirErr ;AC000; + 23714 + 23715 0000287A E8A206 call SETPATH + 23716 0000287D F606[BD9D]02 test byte [DestInfo],2 + 23717 00002882 7519 jnz short BadChDir + 23718 + 23719 ; 26/04/2023 + 23720 00002884 B43B mov ah,3Bh + 23721 ;mov ah,CHDir + 23722 ;int 21h + 23723 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 23724 00002886 E831DD call int_21h_indirect + 23725 00002889 73DB jnc short chdir_retn + 23726 + 23727 0000288B E8BDF7 call get_ext_error_number + 23728 ;AN022; get the extended error + 23729 0000288E 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 + 23730 ;AN022; see if path not found + 23731 00002891 740A je short BadChDir ;AN022; yes - issue old message + 23732 ;SR; + 23733 ; We want to issue "Invalid Directory" message even if the path is valid + 23734 ;but is not a directory. The extended error returns "Access denied" which + 23735 ;is kind of confusing. Issue the old message if access denied error is + 23736 ;returned + 23737 + 23738 00002893 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 + 23739 00002896 7405 je short BadChDir + 23740 + 23741 00002898 E8A200 call set_ext_error_subst ;AN022; + 23742 0000289B EB21 jmp short ChDirErr ;AN022; + 23743 + 23744 BadChDir: + 23745 0000289D BA[3791] mov dx,badcd_ptr + 23746 ;ChDirErr: + 23747 ; call std_eprintf + 23748 ;mkdir_retn: + 23749 ;retn 23750 ; 24/02/2023 - 23751 ; MSDOS 3.3 - 23752 ;REALCD: - 23753 ;call SETPATH - 23754 ;test byte [DESTINFO],2 - 23755 ;jnz short BADCHDIR - 23756 ;mov ah,CHDir ; 3Bh - 23757 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 23758 ; ; DS:DX -> ASCIZ directory name (may include drive) - 23759 ;jnc short CHDIR_RETN - 23760 ;BADCHDIR: - 23761 ;mov dx,BADCDPTR - 23762 ;CHDIR_ERR: - 23763 ;call STD_EPRINTF - 23764 ;MKDIR_RETN: - 23765 ;retn - 23766 - 23767 ; =============== S U B R O U T I N E ======================================= - 23768 - 23769 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 23770 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:25E2h + 23751 000028A0 EB1C jmp short ChDirErr ;AN022; + 23752 + 23753 ; 24/02/2023 + 23754 ; MSDOS 3.3 + 23755 ;REALCD: + 23756 ;call SETPATH + 23757 ;test byte [DESTINFO],2 + 23758 ;jnz short BADCHDIR + 23759 ;mov ah,CHDir ; 3Bh + 23760 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 23761 ; ; DS:DX -> ASCIZ directory name (may include drive) + 23762 ;jnc short CHDIR_RETN + 23763 ;BADCHDIR: + 23764 ;mov dx,BADCDPTR + 23765 ;CHDIR_ERR: + 23766 ;call STD_EPRINTF + 23767 ;MKDIR_RETN: + 23768 ;retn + 23769 + 23770 ; =============== S U B R O U T I N E ======================================= 23771 - 23772 ; 11/06/2023 - Retro DOS v4.2 - 23773 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2B8Ch + 23772 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 23773 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:25E2h 23774 - 23775 ; 04/08/2024 - Retro DOS v5.0 - 23776 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:29BBh + 23775 ; 11/06/2023 - Retro DOS v4.2 + 23776 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2B8Ch 23777 - 23778 _$MKDIR: - 23779 ; MSDOS 6.0 - 23780 000028A2 E86700 call SETRMMK - 23781 000028A5 7217 jc short MkDirErr - 23782 - 23783 000028A7 B439 mov ah,39h - 23784 ;mov ah,MKDIR - 23785 ;int 21h - 23786 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 23787 000028A9 E80EDD call int_21h_indirect - 23788 000028AC 7313 jnc short mkdir_retn - 23789 - 23790 000028AE E89AF7 call get_ext_error_number - 23791 ;AN022; get the extended error - 23792 000028B1 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 - 23793 ;AN022; see if path not found - 23794 000028B4 742C je short MD_other_err - 23795 ;AN022; yes - issue old message - 23796 000028B6 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 - 23797 ;AN022; access denied? - 23798 000028B9 7407 je short badmderr ;AN022; yes - see if file exists - 23799 - 23800 000028BB E87F00 call set_ext_error_subst - 23801 ;AN022; - 23802 ;jmp short MkDirerr ;AC022; yes - go print it - 23803 ; 24/02/2023 - 23804 ChDirErr: - 23805 MkDirErr: - 23806 RmDirErr: - 23807 000028BE E85F2B call std_eprintf - 23808 mkdir_retn: - 23809 rmdir_retn: - 23810 000028C1 C3 retn - 23811 - 23812 badmderr: - 23813 000028C2 BA[2399] mov dx,SRCXNAME ;AN006; Set Disk transfer address - 23814 000028C5 B41A mov ah,1Ah - 23815 ;mov ah,Set_DMA ;AN006; - 23816 ;int 21h ;AN006; - 23817 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 23818 000028C7 E8F0DC call int_21h_indirect - 23819 - 23820 000028CA B44E mov ah,4Eh - 23821 ;mov ah,Find_First ;AN006; see if file/dir exists - 23822 ;mov cx,10h - 23823 000028CC B91000 mov cx,ATTR_DIRECTORY - 23824 ;AN006; search for directory - 23825 ;int 21h ;AN006; - 23826 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 23827 000028CF E8E8DC call int_21h_indirect - 23828 000028D2 720E jc short MD_other_err - 23829 ;AN006; doesn't exist - must be something else - 23830 ;;mov dl,SRCXNAME.find_buf_attr - 23831 ;AN006; we found a file/dir - 23832 ;mov dl,[SRCXNAME+21] - 23833 000028D4 8A16[3899] mov dl,[SRCXNAME+FIND_BUF.ATTR] - 23834 000028D8 F6C210 test dl,ATTR_DIRECTORY - 23835 ;AN006; was it a directory? - 23836 000028DB 7405 jz short MD_other_err - 23837 ;AN006; no - must have been a file - 23838 000028DD BA[4692] mov dx,MD_EXISTS_PTR - 23839 ;AN006; set up already exists error - 23840 000028E0 EBDC jmp short MkDirErr ;AN006; make sure we didn't have network error - 23841 MD_other_err: ;AN006; - 23842 000028E2 BA[3A91] mov dx,badmkd_ptr - 23843 ;MkDirErr: - 23844 ;call std_eprintf - 23845 ;retn - 23846 ; 24/02/2023 - 23847 000028E5 EBD7 jmp short MkDirErr - 23848 + 23778 ; 04/08/2024 - Retro DOS v5.0 + 23779 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:29BBh + 23780 + 23781 _$MKDIR: + 23782 ; MSDOS 6.0 + 23783 000028A2 E86700 call SETRMMK + 23784 000028A5 7217 jc short MkDirErr + 23785 + 23786 000028A7 B439 mov ah,39h + 23787 ;mov ah,MKDIR + 23788 ;int 21h + 23789 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 23790 000028A9 E80EDD call int_21h_indirect + 23791 000028AC 7313 jnc short mkdir_retn + 23792 + 23793 000028AE E89AF7 call get_ext_error_number + 23794 ;AN022; get the extended error + 23795 000028B1 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 + 23796 ;AN022; see if path not found + 23797 000028B4 742C je short MD_other_err + 23798 ;AN022; yes - issue old message + 23799 000028B6 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 + 23800 ;AN022; access denied? + 23801 000028B9 7407 je short badmderr ;AN022; yes - see if file exists + 23802 + 23803 000028BB E87F00 call set_ext_error_subst + 23804 ;AN022; + 23805 ;jmp short MkDirerr ;AC022; yes - go print it + 23806 ; 24/02/2023 + 23807 ChDirErr: + 23808 MkDirErr: + 23809 RmDirErr: + 23810 000028BE E85F2B call std_eprintf + 23811 mkdir_retn: + 23812 rmdir_retn: + 23813 000028C1 C3 retn + 23814 + 23815 badmderr: + 23816 000028C2 BA[2399] mov dx,SRCXNAME ;AN006; Set Disk transfer address + 23817 000028C5 B41A mov ah,1Ah + 23818 ;mov ah,Set_DMA ;AN006; + 23819 ;int 21h ;AN006; + 23820 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 23821 000028C7 E8F0DC call int_21h_indirect + 23822 + 23823 000028CA B44E mov ah,4Eh + 23824 ;mov ah,Find_First ;AN006; see if file/dir exists + 23825 ;mov cx,10h + 23826 000028CC B91000 mov cx,ATTR_DIRECTORY + 23827 ;AN006; search for directory + 23828 ;int 21h ;AN006; + 23829 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 23830 000028CF E8E8DC call int_21h_indirect + 23831 000028D2 720E jc short MD_other_err + 23832 ;AN006; doesn't exist - must be something else + 23833 ;;mov dl,SRCXNAME.find_buf_attr + 23834 ;AN006; we found a file/dir + 23835 ;mov dl,[SRCXNAME+21] + 23836 000028D4 8A16[3899] mov dl,[SRCXNAME+FIND_BUF.ATTR] + 23837 000028D8 F6C210 test dl,ATTR_DIRECTORY + 23838 ;AN006; was it a directory? + 23839 000028DB 7405 jz short MD_other_err + 23840 ;AN006; no - must have been a file + 23841 000028DD BA[4692] mov dx,MD_EXISTS_PTR + 23842 ;AN006; set up already exists error + 23843 000028E0 EBDC jmp short MkDirErr ;AN006; make sure we didn't have network error + 23844 MD_other_err: ;AN006; + 23845 000028E2 BA[3A91] mov dx,badmkd_ptr + 23846 ;MkDirErr: + 23847 ;call std_eprintf + 23848 ;retn 23849 ; 24/02/2023 - 23850 ; MSDOS 3.3 - 23851 ;call SETRMMK - 23852 ;jb short MKDIRERR - 23853 ;mov ah,MKDIR ; 39h - 23854 ;int 21h ; DOS - 2+ - CREATE A SUBDIRECTORY (MKDIR) - 23855 ; ; DS:DX -> ASCIZ pathname (may include drive) - 23856 ;jnc short MKDIR_RETN - 23857 ;mov dx,BADMKDPTR - 23858 ;call GET_EXT_ERR_NUMBER - 23859 ;MKDIRERR: - 23860 ;call STD_EPRINTF - 23861 ;retn - 23862 - 23863 ; =============== S U B R O U T I N E ======================================= - 23864 - 23865 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 23866 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2656h - 23867 - 23868 ; 11/06/2023 - Retro DOS v4.2 - 23869 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2C00h + 23850 000028E5 EBD7 jmp short MkDirErr + 23851 + 23852 ; 24/02/2023 + 23853 ; MSDOS 3.3 + 23854 ;call SETRMMK + 23855 ;jb short MKDIRERR + 23856 ;mov ah,MKDIR ; 39h + 23857 ;int 21h ; DOS - 2+ - CREATE A SUBDIRECTORY (MKDIR) + 23858 ; ; DS:DX -> ASCIZ pathname (may include drive) + 23859 ;jnc short MKDIR_RETN + 23860 ;mov dx,BADMKDPTR + 23861 ;call GET_EXT_ERR_NUMBER + 23862 ;MKDIRERR: + 23863 ;call STD_EPRINTF + 23864 ;retn + 23865 + 23866 ; =============== S U B R O U T I N E ======================================= + 23867 + 23868 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 23869 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2656h 23870 - 23871 ; 04/08/2024 - Retro DOS v5.0 - 23872 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2A32h - 23873 - 23874 _$RMDIR: - 23875 000028E7 E82200 call SETRMMK - 23876 000028EA 72D2 jb short RmDirErr - 23877 000028EC 7519 jnz short badrderr - 23878 - 23879 000028EE B43A mov ah,3Ah - 23880 ;mov ah,RMDIR ; 3Ah - 23881 ;int 21h ; DOS - 2+ - REMOVE A DIRECTORY ENTRY (RMDIR) - 23882 ; DS:DX -> ASCIZ pathname (may include drive) - 23883 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 23884 000028F0 E8C7DC call int_21h_indirect - 23885 000028F3 73CC jnc short rmdir_retn ; 24/02/2023 - 23886 - 23887 ; 24/02/2023 - 23888 ; MSDOS 6.0 - 23889 000028F5 E853F7 call get_ext_error_number - 23890 ;AN022; get the extended error - 23891 000028F8 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 - 23892 ;AN022; see if path not found - 23893 000028FB 740A je short badrderr ;AN022; yes - issue old message - 23894 000028FD 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 - 23895 ;AN022; access denied? - 23896 00002900 7405 je short badrderr ;AN022; yes - issue old message - 23897 - 23898 00002902 E83800 call set_ext_error_subst - 23899 ;AN022; - 23900 00002905 EBB7 jmp short RmDirErr ;AC022; yes - go print it - 23901 - 23902 ; MSDOS 6.0 - 23903 badrderr: - 23904 ; 24/02/2023 - 23905 00002907 BA[3D91] mov dx,badrmd_ptr - 23906 0000290A EBB2 jmp short RmDirErr - 23907 ;RmDirErr: - 23908 ;call std_eprintf - 23909 ;;rmdir_retn - 23910 ;retn - 23911 - 23912 ; 24/02/2023 - 23913 ; MSDOS 3.3 - 23914 ;mov dx,BADRMDPTR - 23915 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 - 23916 ;RMDIRERR: - 23917 ;call STD_EPRINTF - 23918 ;RMDIR_RETN: - 23919 ;retn - 23920 - 23921 ; =============== S U B R O U T I N E ======================================= - 23922 - 23923 ; - 23924 ;**************************************************************** - 23925 ;* - 23926 ;* ROUTINE: SETRMMK - 23927 ;* - 23928 ;* FUNCTION: Parse routine for the internal MKDIR and RMDIR - 23929 ;* commands. Parses the command line for a required - 23930 ;* filespec. - 23931 ;* - 23932 ;* INPUT: command line at offset 81H - 23933 ;* - 23934 ;* OUTPUT: carry clear - 23935 ;* DS:DX points to ASCIIZ argument - 23936 ;* carry set - 23937 ;* DS:DX has error message pointer - 23938 ;* - 23939 ;**************************************************************** - 23940 - 23941 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 23942 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2624h - 23943 - 23944 ; 11/06/2023 - Retro DOS v4.2 - 23945 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2BCEh - 23946 - 23947 ; 04/08/2024 - Retro DOS v5.0 - 23948 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2A00h + 23871 ; 11/06/2023 - Retro DOS v4.2 + 23872 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2C00h + 23873 + 23874 ; 04/08/2024 - Retro DOS v5.0 + 23875 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2A32h + 23876 + 23877 _$RMDIR: + 23878 000028E7 E82200 call SETRMMK + 23879 000028EA 72D2 jb short RmDirErr + 23880 000028EC 7519 jnz short badrderr + 23881 + 23882 000028EE B43A mov ah,3Ah + 23883 ;mov ah,RMDIR ; 3Ah + 23884 ;int 21h ; DOS - 2+ - REMOVE A DIRECTORY ENTRY (RMDIR) + 23885 ; DS:DX -> ASCIZ pathname (may include drive) + 23886 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 23887 000028F0 E8C7DC call int_21h_indirect + 23888 000028F3 73CC jnc short rmdir_retn ; 24/02/2023 + 23889 + 23890 ; 24/02/2023 + 23891 ; MSDOS 6.0 + 23892 000028F5 E853F7 call get_ext_error_number + 23893 ;AN022; get the extended error + 23894 000028F8 83F803 cmp ax,ERROR_PATH_NOT_FOUND ; 3 + 23895 ;AN022; see if path not found + 23896 000028FB 740A je short badrderr ;AN022; yes - issue old message + 23897 000028FD 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 + 23898 ;AN022; access denied? + 23899 00002900 7405 je short badrderr ;AN022; yes - issue old message + 23900 + 23901 00002902 E83800 call set_ext_error_subst + 23902 ;AN022; + 23903 00002905 EBB7 jmp short RmDirErr ;AC022; yes - go print it + 23904 + 23905 ; MSDOS 6.0 + 23906 badrderr: + 23907 ; 24/02/2023 + 23908 00002907 BA[3D91] mov dx,badrmd_ptr + 23909 0000290A EBB2 jmp short RmDirErr + 23910 ;RmDirErr: + 23911 ;call std_eprintf + 23912 ;;rmdir_retn + 23913 ;retn + 23914 + 23915 ; 24/02/2023 + 23916 ; MSDOS 3.3 + 23917 ;mov dx,BADRMDPTR + 23918 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 + 23919 ;RMDIRERR: + 23920 ;call STD_EPRINTF + 23921 ;RMDIR_RETN: + 23922 ;retn + 23923 + 23924 ; =============== S U B R O U T I N E ======================================= + 23925 + 23926 ; + 23927 ;**************************************************************** + 23928 ;* + 23929 ;* ROUTINE: SETRMMK + 23930 ;* + 23931 ;* FUNCTION: Parse routine for the internal MKDIR and RMDIR + 23932 ;* commands. Parses the command line for a required + 23933 ;* filespec. + 23934 ;* + 23935 ;* INPUT: command line at offset 81H + 23936 ;* + 23937 ;* OUTPUT: carry clear + 23938 ;* DS:DX points to ASCIIZ argument + 23939 ;* carry set + 23940 ;* DS:DX has error message pointer + 23941 ;* + 23942 ;**************************************************************** + 23943 + 23944 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 23945 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2624h + 23946 + 23947 ; 11/06/2023 - Retro DOS v4.2 + 23948 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2BCEh 23949 - 23950 SETRMMK: - 23951 ; MSDOS 6.0 - 23952 0000290C BE8100 mov si,81h - 23953 0000290F BF[8896] mov di,PARSE_MRDIR ;AN000; Get address of PARSE_MRDIR - 23954 00002912 31C9 xor cx,cx ;AN000; clear cx,dx - 23955 00002914 31D2 xor dx,dx ;AN000; - 23956 ;invoke Parse_With_Msg ;AC000; call parser - 23957 00002916 E842FC call Parse_With_Msg - 23958 ;cmp ax,0 - 23959 ;cmp ax,RESULT_NO_ERROR - 23960 00002919 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? - 23961 0000291B 7519 jnz short noargerr ;AC000; yes - exit - 23962 - 23963 0000291D BF[2399] mov di,SRCXNAME - 23964 ;AN000; get address of srcxname - 23965 00002920 57 push di ;AN000; save address - 23966 00002921 56 push si ;AN000; save position in line - 23967 00002922 C536[EFA5] lds si,[PARSE1_ADDR] - 23968 ;AN000; get address of path - 23969 mrdir_move_filename: ;AN000; put filespec in srcxname - 23970 00002926 AC lodsb ;get a char from buffer - 23971 00002927 AA stosb ;AN000; store in srcxname - 23972 ;cmp al,0 - 23973 ;cmp al,END_OF_LINE_OUT - 23974 00002928 20C0 and al,al ; 0 ? ;AC000; it char a terminator? - 23975 0000292A 75FA jnz short mrdir_move_filename - 23976 ;AC000; no - keep moving - 23977 0000292C 5E pop si ;AN000; get line position back - 23978 - 23979 ; we have scanned an argument. See if any args beyond. - 23980 - 23981 0000292D BF[8896] mov di,PARSE_MRDIR - 23982 00002930 E812FC call parse_check_eol ;AC000; are we at end of line? - 23983 00002933 5A pop dx ;AC000; get address of SRCXNAME - 23984 ;retz ;yes - return no error - 23985 00002934 7406 jz short setrmmk_retn - 23986 noargerr: - 23987 00002936 BA[D78F] mov dx,extend_buf_ptr - 23988 ;AC000; get extended message pointer - 23989 00002939 31C0 xor ax,ax - 23990 0000293B F9 stc - 23991 setrmmk_retn: - 23992 0000293C C3 retn - 23993 - 23994 ; 24/02/2023 - 23995 ; MSDOS 3.3 - 23996 ;SETRMMK: - 23997 ;mov si,81h - 23998 ;call SCANOFF - 23999 ;cmp al,0Dh - 24000 ;je short NOARGERR - 24001 ;mov dx,si - 24002 ;SETRMMK1: - 24003 ;lodsb - 24004 ;call DELIM - 24005 ;jz short SETRMMK3 - 24006 ;cmp al,0Dh - 24007 ;jne short SETRMMK1 - 24008 ;mov byte [si-1],0 - 24009 ;SETRMMK2: - 24010 ;retn - 24011 ;SETRMMK3: - 24012 ;mov byte [si-1],0 - 24013 ;push si - 24014 ;call SCANOFF - 24015 ;pop si - 24016 ;cmp al,0Dh - 24017 ;je short SETRMMK2 - 24018 ;NOARGERR: - 24019 ;mov dx,BADARGSPTR - 24020 ;xor ax,ax - 24021 ;stc - 24022 ;SETRMMK_RETN: - 24023 ;retn - 24024 - 24025 ; =============== S U B R O U T I N E ======================================= - 24026 - 24027 ; MSDOS 6.0 - 24028 - 24029 ;**************************************************************** - 24030 ;* - 24031 ;* ROUTINE: Set_ext_error_subst - 24032 ;* - 24033 ;* FUNCTION: Sets up substitution for extended error - 24034 ;* - 24035 ;* INPUT: AX - extended error number - 24036 ;* DX - offset of string + 23950 ; 04/08/2024 - Retro DOS v5.0 + 23951 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2A00h + 23952 + 23953 SETRMMK: + 23954 ; MSDOS 6.0 + 23955 0000290C BE8100 mov si,81h + 23956 0000290F BF[8896] mov di,PARSE_MRDIR ;AN000; Get address of PARSE_MRDIR + 23957 00002912 31C9 xor cx,cx ;AN000; clear cx,dx + 23958 00002914 31D2 xor dx,dx ;AN000; + 23959 ;invoke Parse_With_Msg ;AC000; call parser + 23960 00002916 E842FC call Parse_With_Msg + 23961 ;cmp ax,0 + 23962 ;cmp ax,RESULT_NO_ERROR + 23963 00002919 09C0 or ax,ax ; 0 ? ;AC000; did we have an error? + 23964 0000291B 7519 jnz short noargerr ;AC000; yes - exit + 23965 + 23966 0000291D BF[2399] mov di,SRCXNAME + 23967 ;AN000; get address of srcxname + 23968 00002920 57 push di ;AN000; save address + 23969 00002921 56 push si ;AN000; save position in line + 23970 00002922 C536[EFA5] lds si,[PARSE1_ADDR] + 23971 ;AN000; get address of path + 23972 mrdir_move_filename: ;AN000; put filespec in srcxname + 23973 00002926 AC lodsb ;get a char from buffer + 23974 00002927 AA stosb ;AN000; store in srcxname + 23975 ;cmp al,0 + 23976 ;cmp al,END_OF_LINE_OUT + 23977 00002928 20C0 and al,al ; 0 ? ;AC000; it char a terminator? + 23978 0000292A 75FA jnz short mrdir_move_filename + 23979 ;AC000; no - keep moving + 23980 0000292C 5E pop si ;AN000; get line position back + 23981 + 23982 ; we have scanned an argument. See if any args beyond. + 23983 + 23984 0000292D BF[8896] mov di,PARSE_MRDIR + 23985 00002930 E812FC call parse_check_eol ;AC000; are we at end of line? + 23986 00002933 5A pop dx ;AC000; get address of SRCXNAME + 23987 ;retz ;yes - return no error + 23988 00002934 7406 jz short setrmmk_retn + 23989 noargerr: + 23990 00002936 BA[D78F] mov dx,extend_buf_ptr + 23991 ;AC000; get extended message pointer + 23992 00002939 31C0 xor ax,ax + 23993 0000293B F9 stc + 23994 setrmmk_retn: + 23995 0000293C C3 retn + 23996 + 23997 ; 24/02/2023 + 23998 ; MSDOS 3.3 + 23999 ;SETRMMK: + 24000 ;mov si,81h + 24001 ;call SCANOFF + 24002 ;cmp al,0Dh + 24003 ;je short NOARGERR + 24004 ;mov dx,si + 24005 ;SETRMMK1: + 24006 ;lodsb + 24007 ;call DELIM + 24008 ;jz short SETRMMK3 + 24009 ;cmp al,0Dh + 24010 ;jne short SETRMMK1 + 24011 ;mov byte [si-1],0 + 24012 ;SETRMMK2: + 24013 ;retn + 24014 ;SETRMMK3: + 24015 ;mov byte [si-1],0 + 24016 ;push si + 24017 ;call SCANOFF + 24018 ;pop si + 24019 ;cmp al,0Dh + 24020 ;je short SETRMMK2 + 24021 ;NOARGERR: + 24022 ;mov dx,BADARGSPTR + 24023 ;xor ax,ax + 24024 ;stc + 24025 ;SETRMMK_RETN: + 24026 ;retn + 24027 + 24028 ; =============== S U B R O U T I N E ======================================= + 24029 + 24030 ; MSDOS 6.0 + 24031 + 24032 ;**************************************************************** + 24033 ;* + 24034 ;* ROUTINE: Set_ext_error_subst + 24035 ;* + 24036 ;* FUNCTION: Sets up substitution for extended error 24037 ;* - 24038 ;* OUTPUT: Extend_Buf_Ptr set up for STD_EPRINTF - 24039 ;* - 24040 ;**************************************************************** - 24041 - 24042 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24043 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:267Ch - 24044 set_ext_error_subst: - 24045 ;mov byte [msg_disp_class],1 - 24046 0000293D C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 24047 ;AN022; set up extended error msg class - 24048 00002942 8916[A09D] mov [string_ptr_2],dx ;AN022; get address of failed string - 24049 ;mov byte [extend_buf_sub],1 - 24050 00002946 C606[D98F]01 mov byte [extend_buf_sub],one_subst - 24051 ;AN022; put number of subst in control block - 24052 0000294B BA[D78F] mov dx,extend_buf_ptr ;AN022; get extended message pointer - 24053 0000294E A3[D78F] mov [extend_buf_ptr],ax ;AN022; get message number in control block - 24054 savudir_err_retn: ; 24/02/2023 - 24055 00002951 C3 retn ;AN022; return - 24056 - 24057 ; =============== S U B R O U T I N E ======================================= - 24058 - 24059 ; - 24060 - 24061 ; SavUDir - move the user's current directory on a drive into UserDir1 - 24062 ; SavUDir1 - move the user's current directory on a drive into a specified - 24063 ; buffer - 24064 ; - 24065 ; Inputs: DL has 1-based drive number - 24066 ; ES:DI has destination buffer (SavUDir1 only) - 24067 ; Outputs: Carry Clear - 24068 ; DS = TranGroup - 24069 ; Carry Set - 24070 ; AX has error code - 24071 ; Registers Modified: AX, SI - 24072 - 24073 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24074 SAVUDIR: - 24075 00002952 BF[D79A] mov di,USERDIR1 - 24076 ; -------------- - 24077 SAVUDIR1: - 24078 00002955 88D0 mov al,dl - 24079 00002957 0440 add al,'@' ; 40h - 24080 00002959 3C40 cmp al,'@' ; 40h - 24081 0000295B 7506 jne short GOTUDRV - 24082 0000295D 0206[079C] add al,[CURDRV] - 24083 00002961 FEC0 inc al ; A = 1 - 24084 GOTUDRV: - 24085 00002963 AA stosb - 24086 00002964 8A26[FA9B] mov ah,[DIRCHAR] - 24087 00002968 B03A mov al,':' ; 3Ah - 24088 0000296A AB stosw - 24089 0000296B 06 push es - 24090 0000296C 1F pop ds - 24091 0000296D 89FE mov si,di - 24092 0000296F B447 mov ah,47h ; 24/02/2023 - 24093 ;mov ah,CURRENT_DIR ; 47h - 24094 ;int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 24095 ; DL = drive (0=default,1=A,etc.) - 24096 ; DS:SI points to 64-byte buffer area - 24097 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 24098 00002971 E846DC call int_21h_indirect - 24099 00002974 72DB jc short savudir_err_retn ; 24/02/2023 - 24100 00002976 0E push cs - 24101 00002977 1F pop ds - 24102 00002978 C3 retn - 24103 - 24104 ; =============== S U B R O U T I N E ======================================= - 24105 - 24106 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24107 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:26B7h - 24108 CRLF2: - 24109 00002979 52 push dx - 24110 0000297A BA[FA91] mov dx,acrlf_ptr - 24111 0000297D 1E push ds - 24112 0000297E 0E push cs - 24113 0000297F 1F pop ds - 24114 00002980 E8A52A call std_printf - 24115 00002983 1F pop ds - 24116 00002984 5A pop dx - 24117 00002985 C3 retn - 24118 - 24119 ; =============== S U B R O U T I N E ======================================= - 24120 - 24121 ; These routines (SCANOFF, DELIM) are called in batch processing when DS - 24122 ; may NOT be TRANGROUP + 24038 ;* INPUT: AX - extended error number + 24039 ;* DX - offset of string + 24040 ;* + 24041 ;* OUTPUT: Extend_Buf_Ptr set up for STD_EPRINTF + 24042 ;* + 24043 ;**************************************************************** + 24044 + 24045 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24046 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:267Ch + 24047 set_ext_error_subst: + 24048 ;mov byte [msg_disp_class],1 + 24049 0000293D C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 24050 ;AN022; set up extended error msg class + 24051 00002942 8916[A09D] mov [string_ptr_2],dx ;AN022; get address of failed string + 24052 ;mov byte [extend_buf_sub],1 + 24053 00002946 C606[D98F]01 mov byte [extend_buf_sub],one_subst + 24054 ;AN022; put number of subst in control block + 24055 0000294B BA[D78F] mov dx,extend_buf_ptr ;AN022; get extended message pointer + 24056 0000294E A3[D78F] mov [extend_buf_ptr],ax ;AN022; get message number in control block + 24057 savudir_err_retn: ; 24/02/2023 + 24058 00002951 C3 retn ;AN022; return + 24059 + 24060 ; =============== S U B R O U T I N E ======================================= + 24061 + 24062 ; + 24063 + 24064 ; SavUDir - move the user's current directory on a drive into UserDir1 + 24065 ; SavUDir1 - move the user's current directory on a drive into a specified + 24066 ; buffer + 24067 ; + 24068 ; Inputs: DL has 1-based drive number + 24069 ; ES:DI has destination buffer (SavUDir1 only) + 24070 ; Outputs: Carry Clear + 24071 ; DS = TranGroup + 24072 ; Carry Set + 24073 ; AX has error code + 24074 ; Registers Modified: AX, SI + 24075 + 24076 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24077 SAVUDIR: + 24078 00002952 BF[D79A] mov di,USERDIR1 + 24079 ; -------------- + 24080 SAVUDIR1: + 24081 00002955 88D0 mov al,dl + 24082 00002957 0440 add al,'@' ; 40h + 24083 00002959 3C40 cmp al,'@' ; 40h + 24084 0000295B 7506 jne short GOTUDRV + 24085 0000295D 0206[079C] add al,[CURDRV] + 24086 00002961 FEC0 inc al ; A = 1 + 24087 GOTUDRV: + 24088 00002963 AA stosb + 24089 00002964 8A26[FA9B] mov ah,[DIRCHAR] + 24090 00002968 B03A mov al,':' ; 3Ah + 24091 0000296A AB stosw + 24092 0000296B 06 push es + 24093 0000296C 1F pop ds + 24094 0000296D 89FE mov si,di + 24095 0000296F B447 mov ah,47h ; 24/02/2023 + 24096 ;mov ah,CURRENT_DIR ; 47h + 24097 ;int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 24098 ; DL = drive (0=default,1=A,etc.) + 24099 ; DS:SI points to 64-byte buffer area + 24100 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 24101 00002971 E846DC call int_21h_indirect + 24102 00002974 72DB jc short savudir_err_retn ; 24/02/2023 + 24103 00002976 0E push cs + 24104 00002977 1F pop ds + 24105 00002978 C3 retn + 24106 + 24107 ; =============== S U B R O U T I N E ======================================= + 24108 + 24109 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24110 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:26B7h + 24111 CRLF2: + 24112 00002979 52 push dx + 24113 0000297A BA[FA91] mov dx,acrlf_ptr + 24114 0000297D 1E push ds + 24115 0000297E 0E push cs + 24116 0000297F 1F pop ds + 24117 00002980 E8A52A call std_printf + 24118 00002983 1F pop ds + 24119 00002984 5A pop dx + 24120 00002985 C3 retn + 24121 + 24122 ; =============== S U B R O U T I N E ======================================= 24123 - 24124 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24125 scanoff: - 24126 00002986 AC lodsb - 24127 00002987 E80400 call DELIM - 24128 0000298A 74FA jz short scanoff - 24129 0000298C 4E dec si ; Point to first non-delimiter - 24130 scanoff_retn: - 24131 0000298D C3 retn - 24132 - 24133 ; =============== S U B R O U T I N E ======================================= - 24134 - 24135 ; Input: AL is character to classify - 24136 ; Output: Z set if delimiter - 24137 ; NZ set otherwise - 24138 ; Registers modified: none - 24139 - 24140 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24141 DELIM: - 24142 0000298E 3C20 cmp al,' ' ;20h - 24143 00002990 74FB je short scanoff_retn - 24144 00002992 3C3D cmp al,'=' ; 3Dh - 24145 00002994 74F7 je short scanoff_retn - 24146 00002996 3C2C cmp al,',' ; 2Ch - 24147 00002998 74F3 je short scanoff_retn - 24148 0000299A 3C3B cmp al,';' ;3Bh - 24149 0000299C 74EF je short scanoff_retn - 24150 0000299E 3C09 cmp al,9 ; Check for TAB character - 24151 000029A0 74EB je short scanoff_retn - 24152 000029A2 3C0A cmp al,0Ah ; Check for line feed character - BAS - 24153 000029A4 C3 retn - 24154 - 24155 - 24156 ; =============== S U B R O U T I N E ======================================= + 24124 ; These routines (SCANOFF, DELIM) are called in batch processing when DS + 24125 ; may NOT be TRANGROUP + 24126 + 24127 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24128 scanoff: + 24129 00002986 AC lodsb + 24130 00002987 E80400 call DELIM + 24131 0000298A 74FA jz short scanoff + 24132 0000298C 4E dec si ; Point to first non-delimiter + 24133 scanoff_retn: + 24134 0000298D C3 retn + 24135 + 24136 ; =============== S U B R O U T I N E ======================================= + 24137 + 24138 ; Input: AL is character to classify + 24139 ; Output: Z set if delimiter + 24140 ; NZ set otherwise + 24141 ; Registers modified: none + 24142 + 24143 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24144 DELIM: + 24145 0000298E 3C20 cmp al,' ' ;20h + 24146 00002990 74FB je short scanoff_retn + 24147 00002992 3C3D cmp al,'=' ; 3Dh + 24148 00002994 74F7 je short scanoff_retn + 24149 00002996 3C2C cmp al,',' ; 2Ch + 24150 00002998 74F3 je short scanoff_retn + 24151 0000299A 3C3B cmp al,';' ;3Bh + 24152 0000299C 74EF je short scanoff_retn + 24153 0000299E 3C09 cmp al,9 ; Check for TAB character + 24154 000029A0 74EB je short scanoff_retn + 24155 000029A2 3C0A cmp al,0Ah ; Check for line feed character - BAS + 24156 000029A4 C3 retn 24157 - 24158 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24159 FCB_TO_ASCZ: - 24160 ; Convert DS:SI to ASCIZ ES:DI - 24161 000029A5 B90800 mov cx,8 - 24162 MAINNAME: - 24163 000029A8 AC lodsb - 24164 000029A9 3C20 cmp al,' ' ; 20h - 24165 000029AB 7401 jz short SKIPSPC - 24166 000029AD AA stosb - 24167 SKIPSPC: - 24168 000029AE E2F8 loop MAINNAME - 24169 000029B0 AC lodsb - 24170 000029B1 3C20 cmp al,' ' - 24171 000029B3 740F je short GOTNAME - 24172 000029B5 88C4 mov ah,al - 24173 ; 24/02/2023 - 24174 000029B7 B02E mov al,'.' ; 2Eh ; MSDOS 5.0 (& 6.0) - 24175 ;mov al,[DOT_CHR] ; MSDOS 3.3 - 24176 ;stosb - 24177 ;xchg al,ah - 24178 ;stosb - 24179 ; 24/02/2023 - 24180 000029B9 AB stosw - 24181 000029BA B102 mov cl,2 - 24182 EXTNAME: - 24183 000029BC AC lodsb - 24184 000029BD 3C20 cmp al,' ' - 24185 000029BF 7403 je short GOTNAME - 24186 000029C1 AA stosb - 24187 000029C2 E2F8 loop EXTNAME - 24188 GOTNAME: - 24189 000029C4 30C0 xor al,al - 24190 000029C6 AA stosb - 24191 STRCOMP_RETN: - 24192 000029C7 C3 retn - 24193 - 24194 ; =============== S U B R O U T I N E ======================================= - 24195 - 24196 ; Compare ASCIZ DS:SI with ES:DI. - 24197 ; SI,DI destroyed. + 24158 + 24159 ; =============== S U B R O U T I N E ======================================= + 24160 + 24161 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24162 FCB_TO_ASCZ: + 24163 ; Convert DS:SI to ASCIZ ES:DI + 24164 000029A5 B90800 mov cx,8 + 24165 MAINNAME: + 24166 000029A8 AC lodsb + 24167 000029A9 3C20 cmp al,' ' ; 20h + 24168 000029AB 7401 jz short SKIPSPC + 24169 000029AD AA stosb + 24170 SKIPSPC: + 24171 000029AE E2F8 loop MAINNAME + 24172 000029B0 AC lodsb + 24173 000029B1 3C20 cmp al,' ' + 24174 000029B3 740F je short GOTNAME + 24175 000029B5 88C4 mov ah,al + 24176 ; 24/02/2023 + 24177 000029B7 B02E mov al,'.' ; 2Eh ; MSDOS 5.0 (& 6.0) + 24178 ;mov al,[DOT_CHR] ; MSDOS 3.3 + 24179 ;stosb + 24180 ;xchg al,ah + 24181 ;stosb + 24182 ; 24/02/2023 + 24183 000029B9 AB stosw + 24184 000029BA B102 mov cl,2 + 24185 EXTNAME: + 24186 000029BC AC lodsb + 24187 000029BD 3C20 cmp al,' ' + 24188 000029BF 7403 je short GOTNAME + 24189 000029C1 AA stosb + 24190 000029C2 E2F8 loop EXTNAME + 24191 GOTNAME: + 24192 000029C4 30C0 xor al,al + 24193 000029C6 AA stosb + 24194 STRCOMP_RETN: + 24195 000029C7 C3 retn + 24196 + 24197 ; =============== S U B R O U T I N E ======================================= 24198 - 24199 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24200 STRCOMP: - 24201 000029C8 A6 cmpsb - 24202 000029C9 75FC jnz short STRCOMP_RETN ; Strings not equal - 24203 000029CB 807CFF00 cmp byte [si-1],0 ; Hit NUL terminator? - 24204 ;jz short STRCOMP_RETN ; Yes, strings equal - 24205 ;jmp short STRCOMP ; Equal so far, keep going - 24206 ; 24/02/2023 - 24207 000029CF 75F7 jnz short STRCOMP - 24208 000029D1 C3 retn - 24209 - 24210 ; =============== S U B R O U T I N E ======================================= - 24211 - 24212 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 24213 CRPRINT: - 24214 000029D2 50 push ax - 24215 ;mov al,13 ; 0Dh - 24216 000029D3 B00D mov al,0Dh - 24217 000029D5 51 push cx - 24218 000029D6 57 push di - 24219 000029D7 89D7 mov di,dx - 24220 000029D9 B9FFFF mov cx,65535 ; 0FFFFh - 24221 000029DC 06 push es - 24222 000029DD 1E push ds - 24223 000029DE 07 pop es - 24224 000029DF F2AE repne scasb ; LOOK FOR TERMINATOR - 24225 000029E1 C645FF00 mov byte [di-1],0 ; nul terminate the string - 24226 000029E5 07 pop es - 24227 000029E6 8916[A09D] mov [string_ptr_2],dx - 24228 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 (Retro DOS v3.0 COMMAND.COM) - 24229 000029EA BA[DF91] mov dx,string_buf_ptr ; MSDOS 5.0 (& 6.0) - 24230 000029ED E8382A call std_printf - 24231 ;mov byte [di-1],13 - 24232 000029F0 C645FF0D mov byte [di-1],0Dh ; now put the CR back - 24233 000029F4 7204 jb short error_output - 24234 000029F6 5F pop di - 24235 000029F7 59 pop cx - 24236 000029F8 58 pop ax - 24237 000029F9 C3 retn - 24238 - 24239 ; --------------------------------------------------------------------------- - 24240 - 24241 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24242 error_output: - 24243 000029FA 0E push cs - 24244 000029FB 1F pop ds - 24245 000029FC 8E06[F59B] mov es,[RESSEG] - 24246 00002A00 BA[EB8F] mov dx,NOSPACE_PTR - 24247 00002A03 26803E[1303]00 cmp byte [es:PipeFlag],0 - 24248 00002A09 7406 jz short go_to_error - 24249 00002A0B E89909 call PipeOff - 24250 00002A0E BA[5D91] mov dx,PIPEEMES_PTR - 24251 go_to_error: - 24252 00002A11 E91203 jmp cerror - 24253 - 24254 ; =============== S U B R O U T I N E ======================================= - 24255 - 24256 ;---- Mod for path invocation ---- - 24257 - 24258 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) - 24259 pathchrcmp: - 24260 ; 18/03/2023 - 24261 ;push ax - 24262 ;mov ah,'/' ; 2Fh - 24263 ;cmp [SWITCHAR],ah - 24264 00002A14 803E[F99B]2F cmp byte [SWITCHAR],'/' ; 2Fh - 24265 00002A19 7404 je short noslasht - 24266 00002A1B 3C2F cmp al,'/' - 24267 00002A1D 7402 je short pccont - 24268 noslasht: - 24269 00002A1F 3C5C cmp al,'\' ; 5Ch - 24270 pccont: - 24271 ;pop ax - 24272 00002A21 C3 retn - 24273 - 24274 ; =============== S U B R O U T I N E ======================================= - 24275 - 24276 ; PATHCRUNCH - - 24277 ; - 24278 ; ENTRY FCB (in PSP) contains drive # to crunch on - 24279 ; PathPos = ptr to string with pathname in it - 24280 ; PathCnt = length of string - 24281 ; - 24282 ; EXIT PathPos = ptr after pathname (w/ NULL) in string - 24283 ; PathCnt = length left in string - 24284 ; DestIsDir = nonzero if pathname delimiter char's found in pathname - 24285 ; DestInfo = set if wildcard char's found in pathname - 24286 ; If path crunched successfully, - 24287 ; CY = clear - 24288 ; Current directory is changed to directory in pathname - 24289 ; UserDir1 contains previous directory for use by RestUDir - 24290 ; RestDir = nonzero to flag later restoration of user's dir - 24291 ; DestTail = ptr to beginning of filename - 24292 ; If filename found in pathname, - 24293 ; ZR = clear - 24294 ; FCB filename fields contain filename - 24295 ; If filename not found (pure directory path), - 24296 ; ZR = set - 24297 ; FCB filename fields are wildcarded with ?'s - 24298 ; If pathcrunch failed (no ChDir's worked), - 24299 ; CY = set - 24300 ; Msg_Numb = extended error code - 24301 ; - 24302 ; NOTE DIR asks PathCrunch to forego parsing the filename into the - 24303 ; FCB by setting DirFlag. In this case, the FCB is returned - 24304 ; with the filename wildcarded. - 24305 - 24306 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) - 24307 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2767h + 24199 ; Compare ASCIZ DS:SI with ES:DI. + 24200 ; SI,DI destroyed. + 24201 + 24202 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24203 STRCOMP: + 24204 000029C8 A6 cmpsb + 24205 000029C9 75FC jnz short STRCOMP_RETN ; Strings not equal + 24206 000029CB 807CFF00 cmp byte [si-1],0 ; Hit NUL terminator? + 24207 ;jz short STRCOMP_RETN ; Yes, strings equal + 24208 ;jmp short STRCOMP ; Equal so far, keep going + 24209 ; 24/02/2023 + 24210 000029CF 75F7 jnz short STRCOMP + 24211 000029D1 C3 retn + 24212 + 24213 ; =============== S U B R O U T I N E ======================================= + 24214 + 24215 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 24216 CRPRINT: + 24217 000029D2 50 push ax + 24218 ;mov al,13 ; 0Dh + 24219 000029D3 B00D mov al,0Dh + 24220 000029D5 51 push cx + 24221 000029D6 57 push di + 24222 000029D7 89D7 mov di,dx + 24223 000029D9 B9FFFF mov cx,65535 ; 0FFFFh + 24224 000029DC 06 push es + 24225 000029DD 1E push ds + 24226 000029DE 07 pop es + 24227 000029DF F2AE repne scasb ; LOOK FOR TERMINATOR + 24228 000029E1 C645FF00 mov byte [di-1],0 ; nul terminate the string + 24229 000029E5 07 pop es + 24230 000029E6 8916[A09D] mov [string_ptr_2],dx + 24231 ;mov dx,STRINGBUF2PTR ; MSDOS 3.3 (Retro DOS v3.0 COMMAND.COM) + 24232 000029EA BA[DF91] mov dx,string_buf_ptr ; MSDOS 5.0 (& 6.0) + 24233 000029ED E8382A call std_printf + 24234 ;mov byte [di-1],13 + 24235 000029F0 C645FF0D mov byte [di-1],0Dh ; now put the CR back + 24236 000029F4 7204 jb short error_output + 24237 000029F6 5F pop di + 24238 000029F7 59 pop cx + 24239 000029F8 58 pop ax + 24240 000029F9 C3 retn + 24241 + 24242 ; --------------------------------------------------------------------------- + 24243 + 24244 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24245 error_output: + 24246 000029FA 0E push cs + 24247 000029FB 1F pop ds + 24248 000029FC 8E06[F59B] mov es,[RESSEG] + 24249 00002A00 BA[EB8F] mov dx,NOSPACE_PTR + 24250 00002A03 26803E[1303]00 cmp byte [es:PipeFlag],0 + 24251 00002A09 7406 jz short go_to_error + 24252 00002A0B E89909 call PipeOff + 24253 00002A0E BA[5D91] mov dx,PIPEEMES_PTR + 24254 go_to_error: + 24255 00002A11 E91203 jmp cerror + 24256 + 24257 ; =============== S U B R O U T I N E ======================================= + 24258 + 24259 ;---- Mod for path invocation ---- + 24260 + 24261 ; 24/02/2023 - Retro DOS v4.0 (& v4.1) + 24262 pathchrcmp: + 24263 ; 18/03/2023 + 24264 ;push ax + 24265 ;mov ah,'/' ; 2Fh + 24266 ;cmp [SWITCHAR],ah + 24267 00002A14 803E[F99B]2F cmp byte [SWITCHAR],'/' ; 2Fh + 24268 00002A19 7404 je short noslasht + 24269 00002A1B 3C2F cmp al,'/' + 24270 00002A1D 7402 je short pccont + 24271 noslasht: + 24272 00002A1F 3C5C cmp al,'\' ; 5Ch + 24273 pccont: + 24274 ;pop ax + 24275 00002A21 C3 retn + 24276 + 24277 ; =============== S U B R O U T I N E ======================================= + 24278 + 24279 ; PATHCRUNCH - + 24280 ; + 24281 ; ENTRY FCB (in PSP) contains drive # to crunch on + 24282 ; PathPos = ptr to string with pathname in it + 24283 ; PathCnt = length of string + 24284 ; + 24285 ; EXIT PathPos = ptr after pathname (w/ NULL) in string + 24286 ; PathCnt = length left in string + 24287 ; DestIsDir = nonzero if pathname delimiter char's found in pathname + 24288 ; DestInfo = set if wildcard char's found in pathname + 24289 ; If path crunched successfully, + 24290 ; CY = clear + 24291 ; Current directory is changed to directory in pathname + 24292 ; UserDir1 contains previous directory for use by RestUDir + 24293 ; RestDir = nonzero to flag later restoration of user's dir + 24294 ; DestTail = ptr to beginning of filename + 24295 ; If filename found in pathname, + 24296 ; ZR = clear + 24297 ; FCB filename fields contain filename + 24298 ; If filename not found (pure directory path), + 24299 ; ZR = set + 24300 ; FCB filename fields are wildcarded with ?'s + 24301 ; If pathcrunch failed (no ChDir's worked), + 24302 ; CY = set + 24303 ; Msg_Numb = extended error code + 24304 ; + 24305 ; NOTE DIR asks PathCrunch to forego parsing the filename into the + 24306 ; FCB by setting DirFlag. In this case, the FCB is returned + 24307 ; with the filename wildcarded. 24308 - 24309 ; 11/06/2023 - Retro DOS v4.2 - 24310 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2D11h + 24309 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) + 24310 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2767h 24311 - 24312 ; 04/08/2024 - Retro DOS v5.0 - 24313 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2B45h - 24314 PathCrunch: - 24315 ; MSDOS 6.0 - 24316 00002A22 C706[349F]0000 mov word [Msg_Numb],0 - 24317 ;AN022; Set up message flag - 24318 ; MSDOS 3.3 (& MSDOS 6.0) - 24319 ;mov dl,[5Ch] - 24320 00002A28 8A165C00 mov dl,[FCB] ; DL = drive # (1 = A) - 24321 00002A2C E823FF call SAVUDIR ; save current directory in UserDir1 - 24322 ; MSDOS 6.0 - 24323 00002A2F 7233 jc short pcrunch_cderrj - 24324 ;AN022; if error on current dir - report - 24325 00002A31 E8EB04 call SETPATH ; scan past switches, whitespace - 24326 - 24327 ; DX = ptr to pathname, NULL-terminated - 24328 ; PathPos = ptr to byte after NULL at end of pathname + 24312 ; 11/06/2023 - Retro DOS v4.2 + 24313 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2D11h + 24314 + 24315 ; 04/08/2024 - Retro DOS v5.0 + 24316 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2B45h + 24317 PathCrunch: + 24318 ; MSDOS 6.0 + 24319 00002A22 C706[349F]0000 mov word [Msg_Numb],0 + 24320 ;AN022; Set up message flag + 24321 ; MSDOS 3.3 (& MSDOS 6.0) + 24322 ;mov dl,[5Ch] + 24323 00002A28 8A165C00 mov dl,[FCB] ; DL = drive # (1 = A) + 24324 00002A2C E823FF call SAVUDIR ; save current directory in UserDir1 + 24325 ; MSDOS 6.0 + 24326 00002A2F 7233 jc short pcrunch_cderrj + 24327 ;AN022; if error on current dir - report + 24328 00002A31 E8EB04 call SETPATH ; scan past switches, whitespace 24329 - 24330 ; MSDOS 3.3 (& MSDOS 6.0) - 24331 00002A34 F606[BD9D]02 test byte [DestInfo],2 ; test if wildcards (? or *) seen - 24332 00002A39 752C jnz short trypeel ; wildcard seen, peel filename - 24333 - 24334 ;mov ah,CHDir ; 3Bh - 24335 00002A3B B43B mov ah,3Bh - 24336 00002A3D CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 24337 ; DS:DX -> ASCIZ directory name (may include drive) - 24338 ; MSDOS 6.0 - 24339 00002A3F 7313 jnc short chdir_worked ;AN022; no error - continue - 24340 - 24341 00002A41 E807F6 call get_ext_error_number ;AN022; get the extended error - 24342 00002A44 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found - 24343 00002A47 741E je short trypeel ;AC022; keep trying - 24344 00002A49 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied - 24345 00002A4C 7419 je short trypeel ;AC022; keep trying - 24346 00002A4E A3[349F] mov [Msg_Numb],ax ;AN022; set up message flag - 24347 00002A51 E99D00 jmp peelfail ;AN022; exit with other error - 24348 - 24349 ; MSDOS 3.3 - 24350 ;jc short trypeel - 24351 chdir_worked: - 24352 ; MSDOS 3.3 (& MSDOS 6.0) - 24353 00002A54 E8BD06 call SetRest1 ; set 'Restore Directory' flag true - 24354 00002A57 B03F mov al,'?' ; if pure dir, wildcard filename in FCB - 24355 00002A59 BF5D00 mov di,5Dh ; FCB+1 - 24356 00002A5C B90B00 mov cx,11 - 24357 00002A5F F3AA rep stosb - 24358 00002A61 30C0 xor al,al ; return carry clear, zero set - 24359 00002A63 C3 retn - 24360 - 24361 pcrunch_cderrj: ;AN022; need this for long jmp - 24362 00002A64 E98200 jmp pcrunch_cderr ;AN022; + 24330 ; DX = ptr to pathname, NULL-terminated + 24331 ; PathPos = ptr to byte after NULL at end of pathname + 24332 + 24333 ; MSDOS 3.3 (& MSDOS 6.0) + 24334 00002A34 F606[BD9D]02 test byte [DestInfo],2 ; test if wildcards (? or *) seen + 24335 00002A39 752C jnz short trypeel ; wildcard seen, peel filename + 24336 + 24337 ;mov ah,CHDir ; 3Bh + 24338 00002A3B B43B mov ah,3Bh + 24339 00002A3D CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 24340 ; DS:DX -> ASCIZ directory name (may include drive) + 24341 ; MSDOS 6.0 + 24342 00002A3F 7313 jnc short chdir_worked ;AN022; no error - continue + 24343 + 24344 00002A41 E807F6 call get_ext_error_number ;AN022; get the extended error + 24345 00002A44 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found + 24346 00002A47 741E je short trypeel ;AC022; keep trying + 24347 00002A49 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied + 24348 00002A4C 7419 je short trypeel ;AC022; keep trying + 24349 00002A4E A3[349F] mov [Msg_Numb],ax ;AN022; set up message flag + 24350 00002A51 E99D00 jmp peelfail ;AN022; exit with other error + 24351 + 24352 ; MSDOS 3.3 + 24353 ;jc short trypeel + 24354 chdir_worked: + 24355 ; MSDOS 3.3 (& MSDOS 6.0) + 24356 00002A54 E8BD06 call SetRest1 ; set 'Restore Directory' flag true + 24357 00002A57 B03F mov al,'?' ; if pure dir, wildcard filename in FCB + 24358 00002A59 BF5D00 mov di,5Dh ; FCB+1 + 24359 00002A5C B90B00 mov cx,11 + 24360 00002A5F F3AA rep stosb + 24361 00002A61 30C0 xor al,al ; return carry clear, zero set + 24362 00002A63 C3 retn 24363 - 24364 trypeel: - 24365 00002A67 8B36[8F9D] mov si,[PathPos] - 24366 00002A6B 4E dec si ; SI = ptr to NULL at end of pathname - 24367 00002A6C 8A44FF mov al,[si-1] ; AL = last char of pathname - 24368 ; 25/02/2023 - 24369 ; MSDOS 5.0 (& 6.0) - 24370 00002A6F 803E[4F9F]00 cmp byte [KPARSE],0 - 24371 00002A74 7505 jnz short delstrt ; Last char is 2nd KANJI byte, might be '\' - 24372 - 24373 00002A76 E89BFF call pathchrcmp - 24374 00002A79 7476 jz short peelfail ; Trailing '/' - 24375 delstrt: - 24376 00002A7B 89F1 mov cx,si ; CX = ptr to NULL at end of pathname - 24377 00002A7D 89D6 mov si,dx ; SI = ptr to start of pathname - 24378 00002A7F 52 push dx ; save ptr to pathname - 24379 delloop: - 24380 00002A80 39CE cmp si,cx - 24381 ;jz short BADRET - 24382 ; 25/02/2023 - 24383 00002A82 7413 je short gotdele ; no char's left, we have what we have - 24384 00002A84 AC lodsb ; AL = next char of pathname - 24385 00002A85 E8D9FC call testkanj - 24386 00002A88 7403 jz short notkanj8 ; not Kanji, move along - 24387 00002A8A 46 inc si - 24388 00002A8B EBF3 jmp short delloop - 24389 - 24390 ; 25/02/2023 - 24391 ; MSDOS 3.3 - 24392 ;mov al,[si] - 24393 ;call PATHCHRCMP - 24394 ;jz short TRYCD - 24395 ;dec si - 24396 ;jmp short delloop - 24397 - 24398 notkanj8: - 24399 00002A8D E884FF call pathchrcmp - 24400 00002A90 75EE jnz short delloop ; not a path delimiter, keep looking - 24401 00002A92 89F2 mov dx,si - 24402 00002A94 4A dec dx ; DX = ptr to last delimiter found - 24403 00002A95 EBE9 jmp short delloop ; go look for more - 24404 - 24405 ; 25/02/2023 - 24406 ; MSDOS 5.0 (& 6.0) - 24407 gotdele: - 24408 00002A97 89D6 mov si,dx ; SI = ptr to pathname or last delim - 24409 00002A99 5A pop dx ; DX = ptr to pathname - 24410 00002A9A 39D6 cmp si,dx - 24411 00002A9C 7455 je short badret ; didn't find path delim - 24412 00002A9E 89F1 mov cx,si ; CX = ptr to last path delimiter - 24413 00002AA0 89D6 mov si,dx ; SI = ptr to pathname - 24414 delloop2: ; Set value of KPARSE - 24415 00002AA2 39CE cmp si,cx - 24416 00002AA4 7412 je short trycd ; roll up till SI meets CX - 24417 00002AA6 C606[4F9F]00 mov byte [KPARSE],0 - 24418 00002AAB AC lodsb - 24419 00002AAC E8B2FC call testkanj - 24420 00002AAF 74F1 jz short delloop2 - 24421 00002AB1 46 inc si - 24422 00002AB2 FE06[4F9F] inc byte [KPARSE] - 24423 00002AB6 EBEA jmp short delloop2 - 24424 - 24425 trycd: - 24426 00002AB8 50 push ax - 24427 ; 25/02/2023 - 24428 00002AB9 B02E mov al,'.' - 24429 ;mov al,[DOT_CHR] ; AL = '.' - 24430 ; MSDOS 6.0 - 24431 00002ABB 384401 cmp [si+1],al ; check for '.' after path delim - 24432 ;M019; allow continuation if '. ' or - 24433 ;M019; '..' is not found. - 24434 00002ABE 7509 jne short trycd1 ;M019; '.' not found - 24435 00002AC0 384402 cmp [si+2],al ;M019; check for '..' - 24436 00002AC3 7404 je short trycd1 ;M019; found '..' - 24437 00002AC5 807C0200 cmp byte [si+2],0 ;M019; check for '. ' (null terminated) - 24438 trycd1: - 24439 00002AC9 58 pop ax - 24440 00002ACA 7425 jz short peelfail ; if . or .., pure cd should have worked - 24441 - 24442 ; 25/02/2023 - 24443 ; MSDOS 3.3 - 24444 ;cmp [si+1], al ; check for '.' after path delim - 24445 ;pop ax - 24446 ;jz short PEELFAIL ; if . or .., pure cd should have worked - 24447 - 24448 ; MSDOS 3.3 (& MSDOS 6.0) - 24449 00002ACC 8A44FF mov al,[si-1] - 24450 00002ACF 3C3A cmp al,':' ; Special case d:\file - 24451 00002AD1 7420 je short badret - 24452 ; 25/02/2023 - 24453 ; MSDOS 6.0 - 24454 00002AD3 803E[4F9F]00 cmp byte [KPARSE],0 - 24455 00002AD8 7505 jnz short notdoublesl - 24456 00002ADA E837FF call pathchrcmp - 24457 ;jnz short notdoublesl - 24458 ; Last char is 2nd KANJI byte, might be '\' - 24459 ; 25/02/2023 - 24460 00002ADD 7412 jz short peelfail - 24461 ;peelfail: - 24462 ;stc - 24463 ;retn - 24464 - 24465 notdoublesl: - 24466 00002ADF C60400 mov byte [si],0 - 24467 ;mov ah,CHDir ; 3Bh - 24468 00002AE2 B43B mov ah,3Bh - 24469 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 24470 ; DS:DX -> ASCIZ directory name (may include drive) - 24471 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 24472 00002AE4 E8D3DA call int_21h_indirect - 24473 00002AE7 7321 jnc short cdsucc - 24474 - 24475 ; 25/02/2023 - 24476 ; MSDOS 6.0 - 24477 pcrunch_cderr: - 24478 00002AE9 E85FF5 call get_ext_error_number - 24479 ;AN022; get the extended error - 24480 00002AEC A3[349F] mov [Msg_Numb],ax ;AN022; set up message flag - 24481 00002AEF 09F6 or si,si ;AN022; set up zero flag to not zero - 24482 peelfail: ; 25/02/2023 - 24483 00002AF1 F9 stc ;AN022; set up carry flag - 24484 pcrunch_retn: - 24485 00002AF2 C3 retn - 24486 - 24487 badret: - 24488 ; MSDOS 3.3 & MSDOS 6.0 - 24489 00002AF3 8A04 mov al,[si] - 24490 00002AF5 E81CFF call pathchrcmp ; Special case 'DIRCHAR'file - 24491 00002AF8 F9 stc - 24492 00002AF9 75F7 jnz short pcrunch_retn - 24493 00002AFB 30DB xor bl,bl - 24494 00002AFD 865C01 xchg bl,[si+1] - 24495 ;mov ah,CHDir ; 3Bh - 24496 00002B00 B43B mov ah,3Bh - 24497 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 24498 ; DS:DX -> ASCIZ directory name (may include drive) - 24499 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 24500 00002B02 E8B5DA call int_21h_indirect - 24501 ;jc short pcrunch_retn ; MSDOS 3.3 - 24502 ; 25/02/2023 - 24503 00002B05 72E2 jc short pcrunch_cderr - 24504 ;AN022; go to error exit - 24505 00002B07 885C01 mov [si+1],bl - 24506 cdsucc: - 24507 00002B0A E80706 call SetRest1 - 24508 00002B0D 46 inc si ; Reset zero - 24509 00002B0E 8936[BB9D] mov [DestTail],si - 24510 ; 25/02/2023 - 24511 ; MSDOS 6.0 - 24512 00002B12 9C pushf ;AN015; save flags - 24513 00002B13 803E[979D]FF cmp byte [DirFlag],-1 - 24514 ;AN015; don't do parse if in DIR - 24515 00002B18 7408 je short pcrunch_end - 24516 ;AN015; - 24517 ; MSDOS 3.3 & MSDOS 6.0 - 24518 00002B1A BF5C00 mov di,FCB ; 5Ch - 24519 ;mov ax,(Parse_File_Descriptor<<8)|2 ; 2902h - 24520 00002B1D B80229 mov ax,2902h - 24521 00002B20 CD21 int 21h ; Parse with default drive - 24522 ; DOS - PARSE FILENAME - 24523 ; DS:SI -> string to parse - 24524 ; ES:DI -> buffer to fill with unopened FCB - 24525 ; AL = bit mask to control parsing - 24526 ; MSDOS 3.3 - 24527 ;retn - 24528 - 24529 pcrunch_end: - 24530 00002B22 9D popf ;AN015; get flags back - 24531 00002B23 C3 retn - 24532 - 24533 ; =============== S U B R O U T I N E ======================================= - 24534 - 24535 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM - 24536 ; PCDOS 7.1 COMMAND.COM - 24537 %if 1 - 24538 ;ifdef DBCS - 24539 ; - 24540 ; Check if the character position is at Tail Byte of DBCS - 24541 ; - 24542 ; input: ds:si = start address of the string - 24543 ; ds:di = character position to check - 24544 ; output: ZF = 1 if at Tail Byte - 24545 ; - 24546 ;CheckDBCSTailByte proc near - 24547 CheckDBCSTailByte: - 24548 00002B24 50 push ax - 24549 00002B25 51 push cx - 24550 00002B26 57 push di - 24551 00002B27 89F9 mov cx,di ; save character position - 24552 cdtb_check: - 24553 00002B29 39F7 cmp di,si - 24554 00002B2B 7409 jz short cdtb_next ; if at the top - 24555 00002B2D 4F dec di ; go back - 24556 00002B2E 8A05 mov al,[di] ; get character - 24557 ;invoke testkanj - 24558 00002B30 E82EFC call testkanj - 24559 00002B33 75F4 jnz short cdtb_check ; if DBCS lead byte do next - 24560 00002B35 47 inc di ; adjust - 24561 cdtb_next: - 24562 00002B36 29F9 sub cx,di ; if the length is odd then - 24563 00002B38 80F101 xor cl,1 ; the character position is - 24564 00002B3B F6C101 test cl,1 ; at the tail byte - 24565 00002B3E 5F pop di - 24566 00002B3F 59 pop cx - 24567 00002B40 58 pop ax - 24568 00002B41 C3 retn - 24569 ;CheckDBCSTailByte endp - 24570 ;endif - 24571 %endif - 24572 - 24573 ;============================================================================ - 24574 ; TMISC1.ASM, MSDOS 6.0, 1991 - 24575 ;============================================================================ - 24576 ; 05/10/2018 - Retro DOS v3.0 - 24577 - 24578 ;TITLE Part7 COMMAND Transient Routines - 24579 - 24580 ; More misc routines - 24581 - 24582 ;--------------------------- - 24583 ; We can get rid of this switch processing code if we can take - 24584 ; care of the remaining two calls to switch, later in the file. - 24585 ; However, I have not checked whether or not any other files use - 24586 ; switch -- after all, it IS public! - 24587 ;--------------------------- - 24588 - 24589 ; 14/06/2023 - 24590 SWCOUNT EQU 8 ; MSDOS 6.22 ; Length of switch_list - 24591 ; 28/03/2023 - 24592 ;SWCOUNT EQU 6 ; MSDOS 6.0 (& MSDOS 5.0) - 24593 ;;SWCOUNT EQU 5 ; MSDOS 3.3 - 24594 - 24595 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1AC2h - 24596 - 24597 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) - 24598 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2869h + 24364 pcrunch_cderrj: ;AN022; need this for long jmp + 24365 00002A64 E98200 jmp pcrunch_cderr ;AN022; + 24366 + 24367 trypeel: + 24368 00002A67 8B36[8F9D] mov si,[PathPos] + 24369 00002A6B 4E dec si ; SI = ptr to NULL at end of pathname + 24370 00002A6C 8A44FF mov al,[si-1] ; AL = last char of pathname + 24371 ; 25/02/2023 + 24372 ; MSDOS 5.0 (& 6.0) + 24373 00002A6F 803E[4F9F]00 cmp byte [KPARSE],0 + 24374 00002A74 7505 jnz short delstrt ; Last char is 2nd KANJI byte, might be '\' + 24375 + 24376 00002A76 E89BFF call pathchrcmp + 24377 00002A79 7476 jz short peelfail ; Trailing '/' + 24378 delstrt: + 24379 00002A7B 89F1 mov cx,si ; CX = ptr to NULL at end of pathname + 24380 00002A7D 89D6 mov si,dx ; SI = ptr to start of pathname + 24381 00002A7F 52 push dx ; save ptr to pathname + 24382 delloop: + 24383 00002A80 39CE cmp si,cx + 24384 ;jz short BADRET + 24385 ; 25/02/2023 + 24386 00002A82 7413 je short gotdele ; no char's left, we have what we have + 24387 00002A84 AC lodsb ; AL = next char of pathname + 24388 00002A85 E8D9FC call testkanj + 24389 00002A88 7403 jz short notkanj8 ; not Kanji, move along + 24390 00002A8A 46 inc si + 24391 00002A8B EBF3 jmp short delloop + 24392 + 24393 ; 25/02/2023 + 24394 ; MSDOS 3.3 + 24395 ;mov al,[si] + 24396 ;call PATHCHRCMP + 24397 ;jz short TRYCD + 24398 ;dec si + 24399 ;jmp short delloop + 24400 + 24401 notkanj8: + 24402 00002A8D E884FF call pathchrcmp + 24403 00002A90 75EE jnz short delloop ; not a path delimiter, keep looking + 24404 00002A92 89F2 mov dx,si + 24405 00002A94 4A dec dx ; DX = ptr to last delimiter found + 24406 00002A95 EBE9 jmp short delloop ; go look for more + 24407 + 24408 ; 25/02/2023 + 24409 ; MSDOS 5.0 (& 6.0) + 24410 gotdele: + 24411 00002A97 89D6 mov si,dx ; SI = ptr to pathname or last delim + 24412 00002A99 5A pop dx ; DX = ptr to pathname + 24413 00002A9A 39D6 cmp si,dx + 24414 00002A9C 7455 je short badret ; didn't find path delim + 24415 00002A9E 89F1 mov cx,si ; CX = ptr to last path delimiter + 24416 00002AA0 89D6 mov si,dx ; SI = ptr to pathname + 24417 delloop2: ; Set value of KPARSE + 24418 00002AA2 39CE cmp si,cx + 24419 00002AA4 7412 je short trycd ; roll up till SI meets CX + 24420 00002AA6 C606[4F9F]00 mov byte [KPARSE],0 + 24421 00002AAB AC lodsb + 24422 00002AAC E8B2FC call testkanj + 24423 00002AAF 74F1 jz short delloop2 + 24424 00002AB1 46 inc si + 24425 00002AB2 FE06[4F9F] inc byte [KPARSE] + 24426 00002AB6 EBEA jmp short delloop2 + 24427 + 24428 trycd: + 24429 00002AB8 50 push ax + 24430 ; 25/02/2023 + 24431 00002AB9 B02E mov al,'.' + 24432 ;mov al,[DOT_CHR] ; AL = '.' + 24433 ; MSDOS 6.0 + 24434 00002ABB 384401 cmp [si+1],al ; check for '.' after path delim + 24435 ;M019; allow continuation if '. ' or + 24436 ;M019; '..' is not found. + 24437 00002ABE 7509 jne short trycd1 ;M019; '.' not found + 24438 00002AC0 384402 cmp [si+2],al ;M019; check for '..' + 24439 00002AC3 7404 je short trycd1 ;M019; found '..' + 24440 00002AC5 807C0200 cmp byte [si+2],0 ;M019; check for '. ' (null terminated) + 24441 trycd1: + 24442 00002AC9 58 pop ax + 24443 00002ACA 7425 jz short peelfail ; if . or .., pure cd should have worked + 24444 + 24445 ; 25/02/2023 + 24446 ; MSDOS 3.3 + 24447 ;cmp [si+1], al ; check for '.' after path delim + 24448 ;pop ax + 24449 ;jz short PEELFAIL ; if . or .., pure cd should have worked + 24450 + 24451 ; MSDOS 3.3 (& MSDOS 6.0) + 24452 00002ACC 8A44FF mov al,[si-1] + 24453 00002ACF 3C3A cmp al,':' ; Special case d:\file + 24454 00002AD1 7420 je short badret + 24455 ; 25/02/2023 + 24456 ; MSDOS 6.0 + 24457 00002AD3 803E[4F9F]00 cmp byte [KPARSE],0 + 24458 00002AD8 7505 jnz short notdoublesl + 24459 00002ADA E837FF call pathchrcmp + 24460 ;jnz short notdoublesl + 24461 ; Last char is 2nd KANJI byte, might be '\' + 24462 ; 25/02/2023 + 24463 00002ADD 7412 jz short peelfail + 24464 ;peelfail: + 24465 ;stc + 24466 ;retn + 24467 + 24468 notdoublesl: + 24469 00002ADF C60400 mov byte [si],0 + 24470 ;mov ah,CHDir ; 3Bh + 24471 00002AE2 B43B mov ah,3Bh + 24472 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 24473 ; DS:DX -> ASCIZ directory name (may include drive) + 24474 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 24475 00002AE4 E8D3DA call int_21h_indirect + 24476 00002AE7 7321 jnc short cdsucc + 24477 + 24478 ; 25/02/2023 + 24479 ; MSDOS 6.0 + 24480 pcrunch_cderr: + 24481 00002AE9 E85FF5 call get_ext_error_number + 24482 ;AN022; get the extended error + 24483 00002AEC A3[349F] mov [Msg_Numb],ax ;AN022; set up message flag + 24484 00002AEF 09F6 or si,si ;AN022; set up zero flag to not zero + 24485 peelfail: ; 25/02/2023 + 24486 00002AF1 F9 stc ;AN022; set up carry flag + 24487 pcrunch_retn: + 24488 00002AF2 C3 retn + 24489 + 24490 badret: + 24491 ; MSDOS 3.3 & MSDOS 6.0 + 24492 00002AF3 8A04 mov al,[si] + 24493 00002AF5 E81CFF call pathchrcmp ; Special case 'DIRCHAR'file + 24494 00002AF8 F9 stc + 24495 00002AF9 75F7 jnz short pcrunch_retn + 24496 00002AFB 30DB xor bl,bl + 24497 00002AFD 865C01 xchg bl,[si+1] + 24498 ;mov ah,CHDir ; 3Bh + 24499 00002B00 B43B mov ah,3Bh + 24500 ;int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 24501 ; DS:DX -> ASCIZ directory name (may include drive) + 24502 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 24503 00002B02 E8B5DA call int_21h_indirect + 24504 ;jc short pcrunch_retn ; MSDOS 3.3 + 24505 ; 25/02/2023 + 24506 00002B05 72E2 jc short pcrunch_cderr + 24507 ;AN022; go to error exit + 24508 00002B07 885C01 mov [si+1],bl + 24509 cdsucc: + 24510 00002B0A E80706 call SetRest1 + 24511 00002B0D 46 inc si ; Reset zero + 24512 00002B0E 8936[BB9D] mov [DestTail],si + 24513 ; 25/02/2023 + 24514 ; MSDOS 6.0 + 24515 00002B12 9C pushf ;AN015; save flags + 24516 00002B13 803E[979D]FF cmp byte [DirFlag],-1 + 24517 ;AN015; don't do parse if in DIR + 24518 00002B18 7408 je short pcrunch_end + 24519 ;AN015; + 24520 ; MSDOS 3.3 & MSDOS 6.0 + 24521 00002B1A BF5C00 mov di,FCB ; 5Ch + 24522 ;mov ax,(Parse_File_Descriptor<<8)|2 ; 2902h + 24523 00002B1D B80229 mov ax,2902h + 24524 00002B20 CD21 int 21h ; Parse with default drive + 24525 ; DOS - PARSE FILENAME + 24526 ; DS:SI -> string to parse + 24527 ; ES:DI -> buffer to fill with unopened FCB + 24528 ; AL = bit mask to control parsing + 24529 ; MSDOS 3.3 + 24530 ;retn + 24531 + 24532 pcrunch_end: + 24533 00002B22 9D popf ;AN015; get flags back + 24534 00002B23 C3 retn + 24535 + 24536 ; =============== S U B R O U T I N E ======================================= + 24537 + 24538 ; 01/08/2024 - Retro DOS v5.0 COMMAND.COM + 24539 ; PCDOS 7.1 COMMAND.COM + 24540 %if 1 + 24541 ;ifdef DBCS + 24542 ; + 24543 ; Check if the character position is at Tail Byte of DBCS + 24544 ; + 24545 ; input: ds:si = start address of the string + 24546 ; ds:di = character position to check + 24547 ; output: ZF = 1 if at Tail Byte + 24548 ; + 24549 ;CheckDBCSTailByte proc near + 24550 CheckDBCSTailByte: + 24551 00002B24 50 push ax + 24552 00002B25 51 push cx + 24553 00002B26 57 push di + 24554 00002B27 89F9 mov cx,di ; save character position + 24555 cdtb_check: + 24556 00002B29 39F7 cmp di,si + 24557 00002B2B 7409 jz short cdtb_next ; if at the top + 24558 00002B2D 4F dec di ; go back + 24559 00002B2E 8A05 mov al,[di] ; get character + 24560 ;invoke testkanj + 24561 00002B30 E82EFC call testkanj + 24562 00002B33 75F4 jnz short cdtb_check ; if DBCS lead byte do next + 24563 00002B35 47 inc di ; adjust + 24564 cdtb_next: + 24565 00002B36 29F9 sub cx,di ; if the length is odd then + 24566 00002B38 80F101 xor cl,1 ; the character position is + 24567 00002B3B F6C101 test cl,1 ; at the tail byte + 24568 00002B3E 5F pop di + 24569 00002B3F 59 pop cx + 24570 00002B40 58 pop ax + 24571 00002B41 C3 retn + 24572 ;CheckDBCSTailByte endp + 24573 ;endif + 24574 %endif + 24575 + 24576 ;============================================================================ + 24577 ; TMISC1.ASM, MSDOS 6.0, 1991 + 24578 ;============================================================================ + 24579 ; 05/10/2018 - Retro DOS v3.0 + 24580 + 24581 ;TITLE Part7 COMMAND Transient Routines + 24582 + 24583 ; More misc routines + 24584 + 24585 ;--------------------------- + 24586 ; We can get rid of this switch processing code if we can take + 24587 ; care of the remaining two calls to switch, later in the file. + 24588 ; However, I have not checked whether or not any other files use + 24589 ; switch -- after all, it IS public! + 24590 ;--------------------------- + 24591 + 24592 ; 14/06/2023 + 24593 SWCOUNT EQU 8 ; MSDOS 6.22 ; Length of switch_list + 24594 ; 28/03/2023 + 24595 ;SWCOUNT EQU 6 ; MSDOS 6.0 (& MSDOS 5.0) + 24596 ;;SWCOUNT EQU 5 ; MSDOS 3.3 + 24597 + 24598 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1AC2h 24599 - 24600 ; --------------------------------------------------------------------------- - 24601 - 24602 ; 25/02/2023 - 24603 RETSW: - 24604 00002B42 93 xchg ax,bx ; Put switches in AX - 24605 00002B43 C3 retn - 24606 - 24607 ; =============== S U B R O U T I N E ======================================= - 24608 - 24609 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM - 24610 ; 11/06/2023 - Retro DOS 4.2 COMMAND.COM - 24611 ; 04/08/2024 - Retro DOS 5.0 COMMAND.COM - 24612 SWITCH: - 24613 00002B44 31DB xor bx,bx ; Initialize - no switches set - 24614 SWLOOP: - 24615 00002B46 E83DFE call scanoff ; Skip any delimiters - 24616 00002B49 3A06[F99B] cmp al,[SWITCHAR] ; Is it a switch specifier? - 24617 00002B4D 75F3 jnz short RETSW ; No -- we're finished - 24618 00002B4F 81CB0080 or bx,8000h - 24619 ;or bx,FSWITCH ; Indicate there is a switch specified - 24620 00002B53 46 inc si ; Skip over the switch character - 24621 00002B54 E82FFE call scanoff - 24622 00002B57 3C0D cmp al,0Dh - 24623 00002B59 74E7 je short RETSW ; Oops - 24624 00002B5B 46 inc si - 24625 - 24626 ; Convert lower case input to upper case - 24627 - 24628 00002B5C E82CFC call UPCONV - 24629 ;call UPCONV_MAPCALL ; MSDOS 3.3 + 24600 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) + 24601 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2869h + 24602 + 24603 ; --------------------------------------------------------------------------- + 24604 + 24605 ; 25/02/2023 + 24606 RETSW: + 24607 00002B42 93 xchg ax,bx ; Put switches in AX + 24608 00002B43 C3 retn + 24609 + 24610 ; =============== S U B R O U T I N E ======================================= + 24611 + 24612 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM + 24613 ; 11/06/2023 - Retro DOS 4.2 COMMAND.COM + 24614 ; 04/08/2024 - Retro DOS 5.0 COMMAND.COM + 24615 SWITCH: + 24616 00002B44 31DB xor bx,bx ; Initialize - no switches set + 24617 SWLOOP: + 24618 00002B46 E83DFE call scanoff ; Skip any delimiters + 24619 00002B49 3A06[F99B] cmp al,[SWITCHAR] ; Is it a switch specifier? + 24620 00002B4D 75F3 jnz short RETSW ; No -- we're finished + 24621 00002B4F 81CB0080 or bx,8000h + 24622 ;or bx,FSWITCH ; Indicate there is a switch specified + 24623 00002B53 46 inc si ; Skip over the switch character + 24624 00002B54 E82FFE call scanoff + 24625 00002B57 3C0D cmp al,0Dh + 24626 00002B59 74E7 je short RETSW ; Oops + 24627 00002B5B 46 inc si + 24628 + 24629 ; Convert lower case input to upper case 24630 - 24631 00002B5F BF[D095] mov di,switch_list ; "-Y?VBAPW" (for PCDOS 7.1) ; 04/08/2024 - 24632 ; "-Y?VBAPW" (for MSDOS 6.22) ; 11/06/2023 - 24633 ; "?VBAPW" (for MSDOS 6.0) - 24634 ; ("VBAPW" (for MSDOS 3.3)) - 24635 ; 11/06/2023 - 24636 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2E33h - 24637 00002B62 B90800 mov cx,8 ; MSDOS 6.22 - 24638 ;mov cx,6 ; MSDOS 6.0 (& MSDOS 5.0) - 24639 ;;mov cx,5 ; MSDOS 3.3 - 24640 ;;mov cx,SWCOUNT ; 5 (for MSDOS 3.3), (6 (for MSDOS 6.0)) - 24641 - 24642 ;nop - 24643 - 24644 00002B65 F2AE repne scasb ; Look for matching switch - 24645 00002B67 7507 jnz short BADSW - 24646 00002B69 B80100 mov ax,1 - 24647 00002B6C D3E0 shl ax,cl ; Set a bit for the switch - 24648 00002B6E 09C3 or bx,ax - 24649 BADSW: ; Retro DOS v3.0 COMMAND.COM modificiation - 24650 00002B70 EBD4 jmp short SWLOOP - 24651 ;BADSW: - 24652 ;jmp short SWLOOP - 24653 ;DRVBAD: - 24654 ; mov dx,baddrv_ptr - 24655 ; jmp cerror - 24656 EXTERNALJ: - 24657 00002B72 E90501 jmp EXTERNAL - 24658 FNDCOM: ; search the internal command table - 24659 00002B75 08C0 or al,al ; Get real length of first arg - 24660 00002B77 74F9 jz short EXTERNALJ ; If 0, it must begin with "\" so has - 24661 ; to be external. - 24662 ; barryf code starts here - 24663 - 24664 00002B79 E89203 call test_append ; see if APPEND installed - 24665 00002B7C 7429 jz short CONTCOM ; not loaded + 24631 00002B5C E82CFC call UPCONV + 24632 ;call UPCONV_MAPCALL ; MSDOS 3.3 + 24633 + 24634 00002B5F BF[D095] mov di,switch_list ; "-Y?VBAPW" (for PCDOS 7.1) ; 04/08/2024 + 24635 ; "-Y?VBAPW" (for MSDOS 6.22) ; 11/06/2023 + 24636 ; "?VBAPW" (for MSDOS 6.0) + 24637 ; ("VBAPW" (for MSDOS 3.3)) + 24638 ; 11/06/2023 + 24639 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2E33h + 24640 00002B62 B90800 mov cx,8 ; MSDOS 6.22 + 24641 ;mov cx,6 ; MSDOS 6.0 (& MSDOS 5.0) + 24642 ;;mov cx,5 ; MSDOS 3.3 + 24643 ;;mov cx,SWCOUNT ; 5 (for MSDOS 3.3), (6 (for MSDOS 6.0)) + 24644 + 24645 ;nop + 24646 + 24647 00002B65 F2AE repne scasb ; Look for matching switch + 24648 00002B67 7507 jnz short BADSW + 24649 00002B69 B80100 mov ax,1 + 24650 00002B6C D3E0 shl ax,cl ; Set a bit for the switch + 24651 00002B6E 09C3 or bx,ax + 24652 BADSW: ; Retro DOS v3.0 COMMAND.COM modificiation + 24653 00002B70 EBD4 jmp short SWLOOP + 24654 ;BADSW: + 24655 ;jmp short SWLOOP + 24656 ;DRVBAD: + 24657 ; mov dx,baddrv_ptr + 24658 ; jmp cerror + 24659 EXTERNALJ: + 24660 00002B72 E90501 jmp EXTERNAL + 24661 FNDCOM: ; search the internal command table + 24662 00002B75 08C0 or al,al ; Get real length of first arg + 24663 00002B77 74F9 jz short EXTERNALJ ; If 0, it must begin with "\" so has + 24664 ; to be external. + 24665 ; barryf code starts here 24666 - 24667 APPEND_INTERNAL: - 24668 00002B7E 8A0E[BA9C] mov cl,[IDLEN] - 24669 00002B82 B500 mov ch,0 - 24670 00002B84 890E[8F9D] mov [PathPos],cx - 24671 - 24672 ; 25/02/2023 - 24673 ; MSDOS 6.0 - 24674 00002B88 FE06[369F] inc byte [append_exec] - 24675 ;AN041; set APPEND to ON - 24676 00002B8C E82104 call IOSET ; re-direct the o'l io - 24677 - 24678 00002B8F BE[BA9C] mov si,IDLEN ; address command name, DS already set - 24679 00002B92 BAFFFF mov dx,-1 ; 0FFFFh ; set invoke function - 24680 - 24681 ; MSDOS 6.0 - 24682 00002B95 BF[1254] mov di,append_parse - 24683 ;AN010; Get the entry point for PARSE for APPEND - 24684 ; MSDOS 3.3 (& MSDOS 6.0) - 24685 00002B98 B801AE mov ax,0AE01h - 24686 00002B9B CD2F int 2Fh ; - Multiplex - DOS 3.3+ internal - 24687 ; - INSTALLABLE COMMAND - EXECUTE - 24688 ; DX = FFFFh, DS:SI -> buffer - 24689 ; Return: buffer at DS:SI filled with a length byte - 24690 ; followed by the uppercase internal command - 24691 ; to execute (if length not 0) - 24692 ; 25/02/2023 - 24693 ; INT 2Fh - 24694 ; AX = AE01h - 24695 ; entry: - 24696 ; DX = magic value FFFFh - 24697 ; CH = 00h - 24698 ; CL = length of command name - 24699 ; DS:BX -> command line buffer -- (offset COMBUF) - 24700 ; DS:SI -> command name buffer -- (offset IDLEN) - 24701 ; return: - 24702 ; DS:SI buffer updated - 24703 ; if length byte is nonzero, the following bytes contain - 24704 ; the uppercase internal command to execute and the command line - 24705 ; buffer contains the command's parameters - 24706 ; (the first DS:[SI] bytes are ignored) - 24707 ; - 24708 ; Format of COMMAND.COM command line buffer: - 24709 ; Offset Size Description - 24710 ; 00h BYTE max length of command line, as in INT 21/AH=0Ah - 24711 ; 01h BYTE count of bytes to follow, excluding terminating 0Dh - 24712 ; N BYTEs command line text, terminated by 0Dh - 24713 ; - 24714 ; Format of command name buffer: - 24715 ; Offset Size Description - 24716 ; 00h BYTE length of command name - 24717 ; 01h N BYTEs uppercased command name (blank-padded to 11 chars) - 24718 - 24719 00002B9D 803E[BA9C]00 cmp byte [IDLEN],0 ; execute requested - 24720 00002BA2 7503 jne short CONTCOM - 24721 00002BA4 E9A300 jmp CMD_DONE - 24722 - 24723 ;nop - 24724 CONTCOM: ; continue with internal scan - 24725 00002BA7 BF[4F94] mov di,COMTAB - 24726 00002BAA 31C9 xor cx,cx - 24727 FINDCOM: - 24728 00002BAC BE[BB9C] mov si,ID ; pointer to command argument - 24729 00002BAF 8A0D mov cl,[di] ; load length of internal command - 24730 00002BB1 47 inc di ; advance past length - 24731 00002BB2 E3BE jcxz EXTERNALJ ; if it's zero, we're out of internals - 24732 00002BB4 3A0E[BA9C] cmp cl,[IDLEN] ; that of the command argument - 24733 00002BB8 7506 jne short ABCD ; lengths not equal ==> strings not eq - 24734 00002BBA 890E[8F9D] mov [PathPos],cx ; store length of command - 24735 00002BBE F3A6 repe cmpsb - 24736 ABCD: - 24737 00002BC0 9F lahf ; save the good ol' flags - 24738 00002BC1 01CF add di,cx ; skip over remaining internal, if any - 24739 00002BC3 8A05 mov al,[di] ; load drive-check indicator byte (DCIB) - 24740 00002BC5 A2[059C] mov [CHKDRV],al ; save command flag byte in chkdrv - 24741 00002BC8 47 inc di ; increment DI (OK, OK, I'll stop) - 24742 00002BC9 8B1D mov bx,[di] ; load internal command address - 24743 00002BCB 47 inc di ; skip over the puppy - 24744 00002BCC 47 inc di - 24745 - 24746 ; MSDOS 6.0 - 24747 00002BCD 8B15 mov dx,[di] ; load ptr to help msg #s - 24748 00002BCF 47 inc di - 24749 00002BD0 47 inc di - 24750 00002BD1 9E sahf ; remember those flags? - 24751 00002BD2 75D8 jnz short FINDCOM ; well, if all the cmps worked... - 24752 - 24753 ; All messages get redirected. - 24754 - 24755 00002BD4 803E[369F]00 cmp byte [append_exec],0 - 24756 ;AN041; APPEND just executed? - 24757 00002BD9 7503 jnz short DONT_SET_IO - 24758 ;AN041; Yes - this junk is already set - 24759 00002BDB E8D203 call IOSET ; re-direct the ol' i/o - 24760 - 24761 DONT_SET_IO: ;AN041; - 24762 - 24763 ; Check for /?. Certain commands, flagged fLimitHelp, - 24764 ; respond to /? only if it is the only command-line argument. + 24667 00002B79 E89203 call test_append ; see if APPEND installed + 24668 00002B7C 7429 jz short CONTCOM ; not loaded + 24669 + 24670 APPEND_INTERNAL: + 24671 00002B7E 8A0E[BA9C] mov cl,[IDLEN] + 24672 00002B82 B500 mov ch,0 + 24673 00002B84 890E[8F9D] mov [PathPos],cx + 24674 + 24675 ; 25/02/2023 + 24676 ; MSDOS 6.0 + 24677 00002B88 FE06[369F] inc byte [append_exec] + 24678 ;AN041; set APPEND to ON + 24679 00002B8C E82104 call IOSET ; re-direct the o'l io + 24680 + 24681 00002B8F BE[BA9C] mov si,IDLEN ; address command name, DS already set + 24682 00002B92 BAFFFF mov dx,-1 ; 0FFFFh ; set invoke function + 24683 + 24684 ; MSDOS 6.0 + 24685 00002B95 BF[1254] mov di,append_parse + 24686 ;AN010; Get the entry point for PARSE for APPEND + 24687 ; MSDOS 3.3 (& MSDOS 6.0) + 24688 00002B98 B801AE mov ax,0AE01h + 24689 00002B9B CD2F int 2Fh ; - Multiplex - DOS 3.3+ internal + 24690 ; - INSTALLABLE COMMAND - EXECUTE + 24691 ; DX = FFFFh, DS:SI -> buffer + 24692 ; Return: buffer at DS:SI filled with a length byte + 24693 ; followed by the uppercase internal command + 24694 ; to execute (if length not 0) + 24695 ; 25/02/2023 + 24696 ; INT 2Fh + 24697 ; AX = AE01h + 24698 ; entry: + 24699 ; DX = magic value FFFFh + 24700 ; CH = 00h + 24701 ; CL = length of command name + 24702 ; DS:BX -> command line buffer -- (offset COMBUF) + 24703 ; DS:SI -> command name buffer -- (offset IDLEN) + 24704 ; return: + 24705 ; DS:SI buffer updated + 24706 ; if length byte is nonzero, the following bytes contain + 24707 ; the uppercase internal command to execute and the command line + 24708 ; buffer contains the command's parameters + 24709 ; (the first DS:[SI] bytes are ignored) + 24710 ; + 24711 ; Format of COMMAND.COM command line buffer: + 24712 ; Offset Size Description + 24713 ; 00h BYTE max length of command line, as in INT 21/AH=0Ah + 24714 ; 01h BYTE count of bytes to follow, excluding terminating 0Dh + 24715 ; N BYTEs command line text, terminated by 0Dh + 24716 ; + 24717 ; Format of command name buffer: + 24718 ; Offset Size Description + 24719 ; 00h BYTE length of command name + 24720 ; 01h N BYTEs uppercased command name (blank-padded to 11 chars) + 24721 + 24722 00002B9D 803E[BA9C]00 cmp byte [IDLEN],0 ; execute requested + 24723 00002BA2 7503 jne short CONTCOM + 24724 00002BA4 E9A300 jmp CMD_DONE + 24725 + 24726 ;nop + 24727 CONTCOM: ; continue with internal scan + 24728 00002BA7 BF[4F94] mov di,COMTAB + 24729 00002BAA 31C9 xor cx,cx + 24730 FINDCOM: + 24731 00002BAC BE[BB9C] mov si,ID ; pointer to command argument + 24732 00002BAF 8A0D mov cl,[di] ; load length of internal command + 24733 00002BB1 47 inc di ; advance past length + 24734 00002BB2 E3BE jcxz EXTERNALJ ; if it's zero, we're out of internals + 24735 00002BB4 3A0E[BA9C] cmp cl,[IDLEN] ; that of the command argument + 24736 00002BB8 7506 jne short ABCD ; lengths not equal ==> strings not eq + 24737 00002BBA 890E[8F9D] mov [PathPos],cx ; store length of command + 24738 00002BBE F3A6 repe cmpsb + 24739 ABCD: + 24740 00002BC0 9F lahf ; save the good ol' flags + 24741 00002BC1 01CF add di,cx ; skip over remaining internal, if any + 24742 00002BC3 8A05 mov al,[di] ; load drive-check indicator byte (DCIB) + 24743 00002BC5 A2[059C] mov [CHKDRV],al ; save command flag byte in chkdrv + 24744 00002BC8 47 inc di ; increment DI (OK, OK, I'll stop) + 24745 00002BC9 8B1D mov bx,[di] ; load internal command address + 24746 00002BCB 47 inc di ; skip over the puppy + 24747 00002BCC 47 inc di + 24748 + 24749 ; MSDOS 6.0 + 24750 00002BCD 8B15 mov dx,[di] ; load ptr to help msg #s + 24751 00002BCF 47 inc di + 24752 00002BD0 47 inc di + 24753 00002BD1 9E sahf ; remember those flags? + 24754 00002BD2 75D8 jnz short FINDCOM ; well, if all the cmps worked... + 24755 + 24756 ; All messages get redirected. + 24757 + 24758 00002BD4 803E[369F]00 cmp byte [append_exec],0 + 24759 ;AN041; APPEND just executed? + 24760 00002BD9 7503 jnz short DONT_SET_IO + 24761 ;AN041; Yes - this junk is already set + 24762 00002BDB E8D203 call IOSET ; re-direct the ol' i/o + 24763 + 24764 DONT_SET_IO: ;AN041; 24765 - 24766 00002BDE A1[0B9C] mov ax,[COMSW] ; AX = switches after command - 24767 00002BE1 0B06[119C] or ax,[AllSwitch] ; AX = all switches - 24768 ;and ax,SwitchQues - 24769 00002BE5 83E020 and ax,20h - 24770 00002BE8 7426 jz short DRIVE_CHECK - 24771 ; /? not in command line - 24772 00002BEA F606[059C]04 test byte [CHKDRV],4 - 24773 ;test byte [CHKDRV],fLimitHelp - 24774 00002BEF 7407 jz short DO_HELP ; /? allowed in combination - 24775 - 24776 ; Make sure /? is the only argument on the command line. - 24777 - 24778 00002BF1 833E[10A2]02 cmp word [ARG+ARG_UNIT.argvcnt],2 - 24779 00002BF6 7518 jne short DRIVE_CHECK - 24780 ; /? not only arg - ignore - 24781 - 24782 ; Note: this is all the check we need, even against things like /??. - 24783 ; Our argv parser breaks /?? into two args, /? and ?. + 24766 ; Check for /?. Certain commands, flagged fLimitHelp, + 24767 ; respond to /? only if it is the only command-line argument. + 24768 + 24769 00002BDE A1[0B9C] mov ax,[COMSW] ; AX = switches after command + 24770 00002BE1 0B06[119C] or ax,[AllSwitch] ; AX = all switches + 24771 ;and ax,SwitchQues + 24772 00002BE5 83E020 and ax,20h + 24773 00002BE8 7426 jz short DRIVE_CHECK + 24774 ; /? not in command line + 24775 00002BEA F606[059C]04 test byte [CHKDRV],4 + 24776 ;test byte [CHKDRV],fLimitHelp + 24777 00002BEF 7407 jz short DO_HELP ; /? allowed in combination + 24778 + 24779 ; Make sure /? is the only argument on the command line. + 24780 + 24781 00002BF1 833E[10A2]02 cmp word [ARG+ARG_UNIT.argvcnt],2 + 24782 00002BF6 7518 jne short DRIVE_CHECK + 24783 ; /? not only arg - ignore 24784 - 24785 DO_HELP: - 24786 ; DX = ptr to word list of msg #s, terminated by zero word + 24785 ; Note: this is all the check we need, even against things like /??. + 24786 ; Our argv parser breaks /?? into two args, /? and ?. 24787 - 24788 00002BF8 89D6 mov si,dx ; SI = ptr to list of msg #s - 24789 ;mov ax,no_subst ; AL = no subst's code - 24790 00002BFA B80000 mov ax,0 - 24791 00002BFD 50 push ax ; build subst block on stack - 24792 - 24793 NEXT_HELP_MSG: - 24794 00002BFE AD lodsw ; AX = help msg # or zero - 24795 00002BFF 09C0 or ax,ax - 24796 00002C01 7409 jz short HELP_DONE - 24797 00002C03 50 push ax ; SS:SP = ptr to subst block - 24798 ; (msg # and no_subst byte) - 24799 ;; We assume DS = SS. - 24800 - 24801 00002C04 89E2 mov dx,sp ; DS:DX = ptr to subst block - 24802 00002C06 E81F28 call std_printf ; display help message - 24803 00002C09 58 pop ax ; remove msg # from stack - 24804 00002C0A EBF2 jmp short NEXT_HELP_MSG - 24805 - 24806 HELP_DONE: - 24807 00002C0C 58 pop ax ; clean up stack - 24808 00002C0D E9F4D4 jmp TCOMMAND - 24809 - 24810 ; 25/02/2023 - 24811 ; MSDOS 3.3 - 24812 ;sahf ; remember those flags? - 24813 ;jnz short FINDCOM ; well, if all the cmps worked... - 24814 ;call IOSET ; re-direct the ol' i/o - 24815 - 24816 DRIVE_CHECK: - 24817 00002C10 F606[059C]01 test byte [CHKDRV],1 - 24818 ;test byte [CHKDRV],FCHECKDRIVE - 24819 ; did we wanna check those drives? - 24820 00002C15 7411 jz short NOCHECK - 24821 00002C17 A0[089C] mov al,[PARM1] ; parse_file_descriptor results tell - 24822 00002C1A 0A06[0A9C] or al,[PARM2] ; us whether those drives were OK - 24823 00002C1E 3CFF cmp al,-1 - 24824 00002C20 7506 jne short NOCHECK - 24825 ;jmp DRVBAD - 24826 ; 25/02/2023 - 24827 DRVBAD: - 24828 00002C22 BA[6E90] mov dx,baddrv_ptr - 24829 00002C25 E9FE00 jmp cerror - 24830 - 24831 ; The user may have omitted the space between the command and its arguments. - 24832 ; We need to copy the remainder of the user's command line into the buffer. - 24833 ; Note that thisdoes not screw up the arg structure; it points into COMBUF not - 24834 ; into the command line at 80. - 24835 - 24836 NOCHECK: - 24837 00002C28 E8C602 call cmd_copy - 24838 SWITCHECK: - 24839 ;test byte [CHKDRV],2 - 24840 00002C2B F606[059C]02 test byte [CHKDRV],fSwitchAllowed - 24841 ; Does the command take switches - 24842 00002C30 7516 jnz short REALWORK ; Yes, process the command - 24843 00002C32 E82F00 call noswit ; No, check to see if any switches - 24844 00002C35 7511 jnz short REALWORK ; None, process the command - 24845 - 24846 ; MSDOS 6.0 - 24847 ;mov byte [msg_disp_class],2 - 24848 00002C37 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class - 24849 ;AN000; set up parse error msg class - 24850 00002C3C BA[D78F] mov dx,extend_buf_ptr - 24851 ;AC000; get extended message pointer - 24852 ;mov word [extend_buf_ptr],3 - 24853 00002C3F C706[D78F]0300 mov word [extend_buf_ptr],BadSwt_Ptr - 24854 ;AN000; get "Invalid switch" message number - 24855 00002C45 E9DE00 jmp cerror ; Print error and chill out... - 24856 - 24857 ; 25/02/2023 - 24858 ; MSDOS 3.3 - 24859 ;mov dx,BADPARMPTR - 24860 ;jmp CERROR - 24861 - 24862 REALWORK: - 24863 00002C48 FFD3 call bx ; do some real work, at last + 24788 DO_HELP: + 24789 ; DX = ptr to word list of msg #s, terminated by zero word + 24790 + 24791 00002BF8 89D6 mov si,dx ; SI = ptr to list of msg #s + 24792 ;mov ax,no_subst ; AL = no subst's code + 24793 00002BFA B80000 mov ax,0 + 24794 00002BFD 50 push ax ; build subst block on stack + 24795 + 24796 NEXT_HELP_MSG: + 24797 00002BFE AD lodsw ; AX = help msg # or zero + 24798 00002BFF 09C0 or ax,ax + 24799 00002C01 7409 jz short HELP_DONE + 24800 00002C03 50 push ax ; SS:SP = ptr to subst block + 24801 ; (msg # and no_subst byte) + 24802 ;; We assume DS = SS. + 24803 + 24804 00002C04 89E2 mov dx,sp ; DS:DX = ptr to subst block + 24805 00002C06 E81F28 call std_printf ; display help message + 24806 00002C09 58 pop ax ; remove msg # from stack + 24807 00002C0A EBF2 jmp short NEXT_HELP_MSG + 24808 + 24809 HELP_DONE: + 24810 00002C0C 58 pop ax ; clean up stack + 24811 00002C0D E9F4D4 jmp TCOMMAND + 24812 + 24813 ; 25/02/2023 + 24814 ; MSDOS 3.3 + 24815 ;sahf ; remember those flags? + 24816 ;jnz short FINDCOM ; well, if all the cmps worked... + 24817 ;call IOSET ; re-direct the ol' i/o + 24818 + 24819 DRIVE_CHECK: + 24820 00002C10 F606[059C]01 test byte [CHKDRV],1 + 24821 ;test byte [CHKDRV],FCHECKDRIVE + 24822 ; did we wanna check those drives? + 24823 00002C15 7411 jz short NOCHECK + 24824 00002C17 A0[089C] mov al,[PARM1] ; parse_file_descriptor results tell + 24825 00002C1A 0A06[0A9C] or al,[PARM2] ; us whether those drives were OK + 24826 00002C1E 3CFF cmp al,-1 + 24827 00002C20 7506 jne short NOCHECK + 24828 ;jmp DRVBAD + 24829 ; 25/02/2023 + 24830 DRVBAD: + 24831 00002C22 BA[6E90] mov dx,baddrv_ptr + 24832 00002C25 E9FE00 jmp cerror + 24833 + 24834 ; The user may have omitted the space between the command and its arguments. + 24835 ; We need to copy the remainder of the user's command line into the buffer. + 24836 ; Note that thisdoes not screw up the arg structure; it points into COMBUF not + 24837 ; into the command line at 80. + 24838 + 24839 NOCHECK: + 24840 00002C28 E8C602 call cmd_copy + 24841 SWITCHECK: + 24842 ;test byte [CHKDRV],2 + 24843 00002C2B F606[059C]02 test byte [CHKDRV],fSwitchAllowed + 24844 ; Does the command take switches + 24845 00002C30 7516 jnz short REALWORK ; Yes, process the command + 24846 00002C32 E82F00 call noswit ; No, check to see if any switches + 24847 00002C35 7511 jnz short REALWORK ; None, process the command + 24848 + 24849 ; MSDOS 6.0 + 24850 ;mov byte [msg_disp_class],2 + 24851 00002C37 C606[D58F]02 mov byte [msg_disp_class],parse_msg_class + 24852 ;AN000; set up parse error msg class + 24853 00002C3C BA[D78F] mov dx,extend_buf_ptr + 24854 ;AC000; get extended message pointer + 24855 ;mov word [extend_buf_ptr],3 + 24856 00002C3F C706[D78F]0300 mov word [extend_buf_ptr],BadSwt_Ptr + 24857 ;AN000; get "Invalid switch" message number + 24858 00002C45 E9DE00 jmp cerror ; Print error and chill out... + 24859 + 24860 ; 25/02/2023 + 24861 ; MSDOS 3.3 + 24862 ;mov dx,BADPARMPTR + 24863 ;jmp CERROR 24864 - 24865 ; See if we're in a batch CALL command. If we are, reprocess the command line, - 24866 ; otherwise, go get another command. + 24865 REALWORK: + 24866 00002C48 FFD3 call bx ; do some real work, at last 24867 - 24868 CMD_DONE: - 24869 00002C4A 0E push cs ; g restore data segment - 24870 00002C4B 1F pop ds ; g - 24871 00002C4C 1E push ds - 24872 00002C4D 8E1E[F59B] mov ds,[RESSEG] ; g save data segment - 24873 ;cmp byte [Call_Flag],1 - 24874 ; G Is a call in progress? - 24875 00002C51 803E[B002]01 cmp byte [Call_Flag],call_in_progress - 24876 00002C56 C606[B002]00 mov byte [Call_Flag],0 - 24877 ; G Either way, reset flag - 24878 00002C5B 1F pop ds ; g get data segment back - 24879 00002C5C 7403 jz short INCALL ; G - 24880 00002C5E E9A3D4 jmp TCOMMAND ; chill out... - 24881 INCALL: - 24882 ;jmp DOCOM1 - 24883 ; 11/06/2023 - 24884 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM - 24885 00002C61 E991D6 jmp DOCOM0 - 24886 - 24887 ; =============== S U B R O U T I N E ======================================= - 24888 - 24889 ; 25/02/2023 - 24890 noswit: - 24891 00002C64 57 push di ; Save di - 24892 00002C65 BF8100 mov di,81h ; di = ptr to command args - 24893 00002C68 BE8000 mov si,80h ; Get address of length of command args - 24894 00002C6B AC lodsb ; Load length - 24895 00002C6C 88C1 mov cl,al ; Move length to cl - 24896 00002C6E 30ED xor ch,ch ; Zero ch - 24897 00002C70 2EA0[F99B] mov al,[cs:SWITCHAR] ; al = switch character - 24898 ;cmp al,0 ; Turn off ZF - 24899 ; 25/02/2023 - 24900 00002C74 20C0 and al,al - 24901 00002C76 F2AE repne scasb ; Scan for a switch character and return - 24902 00002C78 5F pop di ; with ZF set if one was found - 24903 00002C79 C3 retn - 24904 - 24905 ; --------------------------------------------------------------------------- - 24906 - 24907 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM - 24908 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:29A6h + 24868 ; See if we're in a batch CALL command. If we are, reprocess the command line, + 24869 ; otherwise, go get another command. + 24870 + 24871 CMD_DONE: + 24872 00002C4A 0E push cs ; g restore data segment + 24873 00002C4B 1F pop ds ; g + 24874 00002C4C 1E push ds + 24875 00002C4D 8E1E[F59B] mov ds,[RESSEG] ; g save data segment + 24876 ;cmp byte [Call_Flag],1 + 24877 ; G Is a call in progress? + 24878 00002C51 803E[B002]01 cmp byte [Call_Flag],call_in_progress + 24879 00002C56 C606[B002]00 mov byte [Call_Flag],0 + 24880 ; G Either way, reset flag + 24881 00002C5B 1F pop ds ; g get data segment back + 24882 00002C5C 7403 jz short INCALL ; G + 24883 00002C5E E9A3D4 jmp TCOMMAND ; chill out... + 24884 INCALL: + 24885 ;jmp DOCOM1 + 24886 ; 11/06/2023 + 24887 ; Retro DOS v4.2 - MSDOS 6.22 COMMAND.COM + 24888 00002C61 E991D6 jmp DOCOM0 + 24889 + 24890 ; =============== S U B R O U T I N E ======================================= + 24891 + 24892 ; 25/02/2023 + 24893 noswit: + 24894 00002C64 57 push di ; Save di + 24895 00002C65 BF8100 mov di,81h ; di = ptr to command args + 24896 00002C68 BE8000 mov si,80h ; Get address of length of command args + 24897 00002C6B AC lodsb ; Load length + 24898 00002C6C 88C1 mov cl,al ; Move length to cl + 24899 00002C6E 30ED xor ch,ch ; Zero ch + 24900 00002C70 2EA0[F99B] mov al,[cs:SWITCHAR] ; al = switch character + 24901 ;cmp al,0 ; Turn off ZF + 24902 ; 25/02/2023 + 24903 00002C74 20C0 and al,al + 24904 00002C76 F2AE repne scasb ; Scan for a switch character and return + 24905 00002C78 5F pop di ; with ZF set if one was found + 24906 00002C79 C3 retn + 24907 + 24908 ; --------------------------------------------------------------------------- 24909 - 24910 EXTERNAL: - 24911 00002C7A E89102 call test_append ; check to see if append installed - 24912 00002C7D 7403 jz short NOT_BARRYF - 24913 ; no - truly external command - 24914 00002C7F E9FCFE jmp APPEND_INTERNAL ; yes - go to Barryf code - 24915 - 24916 NOT_BARRYF: - 24917 00002C82 2EC606[069C]00 mov byte [cs:FILTYP],0 - 24918 00002C88 2E8A16[149C] mov dl,[cs:SPECDRV] - 24919 00002C8D 2E8816[BA9C] mov [cs:IDLEN],dl - 24920 00002C92 2EC606[B49D]00 mov byte [cs:ROM_CALL],0 - 24921 00002C98 52 push dx - 24922 00002C99 BA[BA9C] mov dx,IDLEN - 24923 00002C9C E834D8 call ROM_SCAN - 24924 00002C9F 5A pop dx - 24925 ;jnc short POSTSAVE - 24926 00002CA0 7305 jnc short DO_SCAN - 24927 00002CA2 2EFE06[B49D] inc byte [cs:ROM_CALL] - 24928 ;jmp short POSTSAVE - 24929 - 24930 ;nop - 24931 DO_SCAN: - 24932 POSTSAVE: - 24933 00002CA7 BF[1D9B] mov di,EXECPATH - 24934 00002CAA C60500 mov byte [di],0 ; Initialize to current directory - 24935 - 24936 00002CAD 2E803E[B49D]00 cmp byte [cs:ROM_CALL],0 - 24937 ;jz short RESEARCH - 24938 ; 25/02/2023 - 24939 ;jmp short NEOEXECUTE - 24940 00002CB3 7577 jnz short NEOEXECUTE - 24941 - 24942 ;nop - 24943 RESEARCH: - 24944 00002CB5 E8E808 call path_search ; find the mother (result in execpath) - 24945 00002CB8 09C0 or ax,ax ; did we find anything? - 24946 ;jz short BADCOMJ45 ; null means no (sob) - 24947 ; 25/02/2023 - 24948 00002CBA 7465 jz short BADCOM - 24949 00002CBC 83F804 cmp ax,4 ; 04H and 08H are .exe and .com - 24950 ; fuckin' sixteen-bit machine ought - 24951 ;jl short BATCOMJ ; to be able to handle a SIXTEEN-BIT - 24952 ; DISPLACEMENT!! - 24953 ;;jmp short NEOEXECUTE - 24954 ;jmp short EXECUTE - 24955 ; 25/02/2023 - 24956 00002CBF 7D6B jnl short EXECUTE ; jge - 24957 - 24958 ; 02H is .bat - 24959 - 24960 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 24961 ; PCDOS 7.1 COMMAND.COM - 24962 %if 1 - 24963 ; ... .BAT file ... - 24964 00002CC1 BA[1D9B] mov dx,EXECPATH - 24965 00002CC4 B8003D mov ax,3D00h - 24966 00002CC7 CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 24967 ; DS:DX -> ASCIZ filename - 24968 ; AL = access mode - 24969 ; 0 - read - 24970 00002CC9 7253 jb short BATCOMJ - 24971 00002CCB 8326[96A3]00 and word [TPBUF],0 ; clear 1st two bytes of the buffer - 24972 00002CD0 BA[96A3] mov dx,TPBUF - 24973 00002CD3 B90200 mov cx,2 - 24974 00002CD6 89C3 mov bx,ax - 24975 00002CD8 B43F mov ah,3Fh - 24976 00002CDA CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE - 24977 ; BX = file handle, CX = number of bytes to read - 24978 ; DS:DX -> buffer - 24979 00002CDC B43E mov ah,3Eh - 24980 00002CDE CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 24981 ; BX = file handle - 24982 00002CE0 813E[96A3]2F2A cmp word [TPBUF],2A2Fh ; '/*' (NASM syntax) - 24983 00002CE6 7536 jnz short BATCOMJ - 24984 00002CE8 B8[7E97] mov ax,REXX_EXE ; "REXX.EXE" - 24985 ;mov [ARG_ARGV],ax - 24986 00002CEB A3[509F] mov [ARG+ARGV_ELE.argpointer],ax - 24987 ;mov word [ARGV0_ARG_FLAGS],0 - 24988 00002CEE C706[529F]0000 mov word [ARG+ARGV_ELE.argflags],0 - 24989 ;mov [ARGV0_ARGSTARTEL],ax - 24990 00002CF4 A3[539F] mov [ARG+ARGV_ELE.argstartel],ax - 24991 ;mov word [ARGV0_ARGLEN],8 - 24992 00002CF7 C706[559F]0800 mov word [ARG+ARGV_ELE.arglen],8 - 24993 ;mov word [ARGV0_ARGSW_WORD],0 - 24994 00002CFD C706[579F]0000 mov word [ARG+ARGV_ELE.argsw_word],0 - 24995 ;mov [ARGV0_ARG_OCOMPTR],ax - 24996 00002D03 A3[599F] mov [ARG+ARGV_ELE.arg_ocomptr],ax - 24997 ; pointer into original command string - 24998 00002D06 E89708 call path_search - 24999 00002D09 85C0 test ax,ax - 25000 00002D0B 740C jz short rexx_nf_err - 25001 00002D0D BE[559A] mov si,COMBUF+1 - 25002 00002D10 BF8000 mov di,80h ; PSP command tail (arguments) - 25003 00002D13 89F9 mov cx,di ; 128 - 25004 00002D15 F3A4 rep movsb - 25005 00002D17 EB13 jmp short NEOEXECUTE - 25006 rexx_nf_err: - 25007 00002D19 BA[FD8F] mov dx,REXXNOTF_PTR ; MSG_1012 ; REXX.EXE not found - 25008 00002D1C EB08 jmp short cerror - 25009 %endif - 25010 - 25011 ;nop - 25012 BATCOMJ: - 25013 00002D1E E97BDB jmp BATCOM - 25014 - 25015 ; 25/02/2023 - 25016 ;BADCOMJ45: - 25017 ;jmp short BADCOM - 25018 - 25019 ; 06/08/2024 - 25020 ; --------------------------------------------------------------------------- + 24910 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM + 24911 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:29A6h + 24912 + 24913 EXTERNAL: + 24914 00002C7A E89102 call test_append ; check to see if append installed + 24915 00002C7D 7403 jz short NOT_BARRYF + 24916 ; no - truly external command + 24917 00002C7F E9FCFE jmp APPEND_INTERNAL ; yes - go to Barryf code + 24918 + 24919 NOT_BARRYF: + 24920 00002C82 2EC606[069C]00 mov byte [cs:FILTYP],0 + 24921 00002C88 2E8A16[149C] mov dl,[cs:SPECDRV] + 24922 00002C8D 2E8816[BA9C] mov [cs:IDLEN],dl + 24923 00002C92 2EC606[B49D]00 mov byte [cs:ROM_CALL],0 + 24924 00002C98 52 push dx + 24925 00002C99 BA[BA9C] mov dx,IDLEN + 24926 00002C9C E834D8 call ROM_SCAN + 24927 00002C9F 5A pop dx + 24928 ;jnc short POSTSAVE + 24929 00002CA0 7305 jnc short DO_SCAN + 24930 00002CA2 2EFE06[B49D] inc byte [cs:ROM_CALL] + 24931 ;jmp short POSTSAVE + 24932 + 24933 ;nop + 24934 DO_SCAN: + 24935 POSTSAVE: + 24936 00002CA7 BF[1D9B] mov di,EXECPATH + 24937 00002CAA C60500 mov byte [di],0 ; Initialize to current directory + 24938 + 24939 00002CAD 2E803E[B49D]00 cmp byte [cs:ROM_CALL],0 + 24940 ;jz short RESEARCH + 24941 ; 25/02/2023 + 24942 ;jmp short NEOEXECUTE + 24943 00002CB3 7577 jnz short NEOEXECUTE + 24944 + 24945 ;nop + 24946 RESEARCH: + 24947 00002CB5 E8E808 call path_search ; find the mother (result in execpath) + 24948 00002CB8 09C0 or ax,ax ; did we find anything? + 24949 ;jz short BADCOMJ45 ; null means no (sob) + 24950 ; 25/02/2023 + 24951 00002CBA 7465 jz short BADCOM + 24952 00002CBC 83F804 cmp ax,4 ; 04H and 08H are .exe and .com + 24953 ; fuckin' sixteen-bit machine ought + 24954 ;jl short BATCOMJ ; to be able to handle a SIXTEEN-BIT + 24955 ; DISPLACEMENT!! + 24956 ;;jmp short NEOEXECUTE + 24957 ;jmp short EXECUTE + 24958 ; 25/02/2023 + 24959 00002CBF 7D6B jnl short EXECUTE ; jge + 24960 + 24961 ; 02H is .bat + 24962 + 24963 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 24964 ; PCDOS 7.1 COMMAND.COM + 24965 %if 1 + 24966 ; ... .BAT file ... + 24967 00002CC1 BA[1D9B] mov dx,EXECPATH + 24968 00002CC4 B8003D mov ax,3D00h + 24969 00002CC7 CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 24970 ; DS:DX -> ASCIZ filename + 24971 ; AL = access mode + 24972 ; 0 - read + 24973 00002CC9 7253 jb short BATCOMJ + 24974 00002CCB 8326[96A3]00 and word [TPBUF],0 ; clear 1st two bytes of the buffer + 24975 00002CD0 BA[96A3] mov dx,TPBUF + 24976 00002CD3 B90200 mov cx,2 + 24977 00002CD6 89C3 mov bx,ax + 24978 00002CD8 B43F mov ah,3Fh + 24979 00002CDA CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE + 24980 ; BX = file handle, CX = number of bytes to read + 24981 ; DS:DX -> buffer + 24982 00002CDC B43E mov ah,3Eh + 24983 00002CDE CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 24984 ; BX = file handle + 24985 00002CE0 813E[96A3]2F2A cmp word [TPBUF],2A2Fh ; '/*' (NASM syntax) + 24986 00002CE6 7536 jnz short BATCOMJ + 24987 00002CE8 B8[7E97] mov ax,REXX_EXE ; "REXX.EXE" + 24988 ;mov [ARG_ARGV],ax + 24989 00002CEB A3[509F] mov [ARG+ARGV_ELE.argpointer],ax + 24990 ;mov word [ARGV0_ARG_FLAGS],0 + 24991 00002CEE C706[529F]0000 mov word [ARG+ARGV_ELE.argflags],0 + 24992 ;mov [ARGV0_ARGSTARTEL],ax + 24993 00002CF4 A3[539F] mov [ARG+ARGV_ELE.argstartel],ax + 24994 ;mov word [ARGV0_ARGLEN],8 + 24995 00002CF7 C706[559F]0800 mov word [ARG+ARGV_ELE.arglen],8 + 24996 ;mov word [ARGV0_ARGSW_WORD],0 + 24997 00002CFD C706[579F]0000 mov word [ARG+ARGV_ELE.argsw_word],0 + 24998 ;mov [ARGV0_ARG_OCOMPTR],ax + 24999 00002D03 A3[599F] mov [ARG+ARGV_ELE.arg_ocomptr],ax + 25000 ; pointer into original command string + 25001 00002D06 E89708 call path_search + 25002 00002D09 85C0 test ax,ax + 25003 00002D0B 740C jz short rexx_nf_err + 25004 00002D0D BE[559A] mov si,COMBUF+1 + 25005 00002D10 BF8000 mov di,80h ; PSP command tail (arguments) + 25006 00002D13 89F9 mov cx,di ; 128 + 25007 00002D15 F3A4 rep movsb + 25008 00002D17 EB13 jmp short NEOEXECUTE + 25009 rexx_nf_err: + 25010 00002D19 BA[FD8F] mov dx,REXXNOTF_PTR ; MSG_1012 ; REXX.EXE not found + 25011 00002D1C EB08 jmp short cerror + 25012 %endif + 25013 + 25014 ;nop + 25015 BATCOMJ: + 25016 00002D1E E97BDB jmp BATCOM + 25017 + 25018 ; 25/02/2023 + 25019 ;BADCOMJ45: + 25020 ;jmp short BADCOM 25021 - 25022 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM - 25023 BADCOM: - 25024 00002D21 0E push cs - 25025 00002D22 1F pop ds - 25026 00002D23 BA[FA8F] mov dx,BADNAM_PTR - 25027 cerror: - 25028 00002D26 E8F726 call std_eprintf - 25029 00002D29 E9D8D3 jmp TCOMMAND - 25030 - 25031 ; --------------------------------------------------------------------------- - 25032 - 25033 ;nop - 25034 EXECUTE: - 25035 NEOEXECUTE: - 25036 00002D2C E88102 call IOSET - 25037 - 25038 ; MSDOS 6.0 - 25039 ;M051 - 25040 ; Previously LoadHigh was jumping to the execute label above. This was wrong - 25041 ;because IOSET was getting invoked twice resulting in 2 sets of redirections. - 25042 ;After a close, this would still leave one open active resulting in sharing - 25043 ;errors on subsequent opens of the redirected file. - 25044 - 25045 LH_EXECUTE: ;M051 - 25046 00002D2F 8E06[039C] mov es,[TRAN_TPA] - 25047 ;mov ah,DEALLOC ; 49h - 25048 00002D33 B449 mov ah,49h - 25049 00002D35 CD21 int 21h ; DOS - 2+ - FREE MEMORY - 25050 ; ES = segment address of area to be freed - 25051 ; Now running in "free" space - 25052 00002D37 8E06[F59B] mov es,[RESSEG] - 25053 00002D3B 26FE06[9902] inc byte [es:ExtCom] ; Indicate external command - 25054 00002D40 26C606[A102]00 mov byte [es:RestDir],0 - 25055 ; Since USERDIR1 is in transient, insure - 25056 ; this flag value for re-entry to COMMAND - 25057 ; MSDOS 6.0 - 25058 00002D46 BE[1D9B] mov si,EXECPATH ; offset TRANGROUP:EXECPATH - 25059 00002D49 BF[5E04] mov di,SafePathBuffer ; offset RESGROUP:SAFEPATHBUFFER - 25060 ;mov cx,LENMSGORPATHBUF - 25061 00002D4C B95000 mov cx,80 - 25062 00002D4F FC cld - 25063 00002D50 F3A4 rep movsb ; copy program pathname to resident - 25064 - 25065 ; MSDOS 3.3 (& MSDOS 6.0) - 25066 00002D52 BF5C00 mov di,FCB ; 5Ch - 25067 00002D55 89FE mov si,di - 25068 ;mov cx,82 ; 52h ; moving (100h-5Ch)/2 = 80h-2Eh - 25069 00002D57 B152 mov cl,82 ; 25/02/2023 - 25070 00002D59 F3A5 rep movsw ; Transfer parameters to resident header - 25071 - 25072 ; 25/02/2023 - 25073 ;mov dx,EXECPATH ; MSDOS 3.3 - 25074 ; MSDOS 6.0 (& 5.0) - 25075 ;mov dx,offset RESGROUP:SAFEPATHBUFFER - 25076 00002D5B BA[5E04] mov dx,SafePathBuffer - 25077 00002D5E 06 push es - 25078 00002D5F 1F pop ds - 25079 - 25080 ;mov bx,offset RESGROUP:EXEC_BLOCK - 25081 00002D60 BB[3A04] mov bx,Exec_Block ; = offset EnvirSeg - 25082 ;mov ax,EXEC*256 ; 4B00h - 25083 00002D63 B8004B mov ax,4B00h - 25084 ;test byte [ROM_CALL],-1 ; 0FFh ; MSDOS 3.3 - 25085 00002D66 2EF606[B49D]FF test byte [cs:ROM_CALL],-1 ; MSDOS 6.0 (& 5.0) - 25086 00002D6C 7403 jz short OK_EXEC - 25087 00002D6E E9DBD7 jmp ROM_EXEC - 25088 - 25089 OK_EXEC: - 25090 - 25091 ; we are now running in free space. Anything we do from here on may get - 25092 ; trashed. Move the stack (also in free space) to allocated space because - 25093 ; since EXEC restores the stack, somebody may trash what is on the stack. - 25094 - 25095 00002D71 8CC1 mov cx,es - 25096 00002D73 8ED1 mov ss,cx - 25097 00002D75 BC[2E05] mov sp,RStack - 25098 ; MSDOS 3.3 - 25099 ;jmp far [EXEC_ADDR] ; Jmp to the EXEC in the resident - 25100 ; 25/02/2023 - 25101 ; MSDOS 6.0 - 25102 00002D78 2EFF2E[FB9B] jmp far [cs:EXEC_ADDR] ; Jmp to the EXEC in the resident - 25103 - 25104 ; =============== S U B R O U T I N E ======================================= - 25105 - 25106 ; Prescan converts the input buffer into a canonicalized form. - 25107 ; All redirections and pipes are removed. + 25022 ; 06/08/2024 + 25023 ; --------------------------------------------------------------------------- + 25024 + 25025 ; 25/02/2023 - Retro DOS v4.0 COMMAND.COM + 25026 BADCOM: + 25027 00002D21 0E push cs + 25028 00002D22 1F pop ds + 25029 00002D23 BA[FA8F] mov dx,BADNAM_PTR + 25030 cerror: + 25031 00002D26 E8F726 call std_eprintf + 25032 00002D29 E9D8D3 jmp TCOMMAND + 25033 + 25034 ; --------------------------------------------------------------------------- + 25035 + 25036 ;nop + 25037 EXECUTE: + 25038 NEOEXECUTE: + 25039 00002D2C E88102 call IOSET + 25040 + 25041 ; MSDOS 6.0 + 25042 ;M051 + 25043 ; Previously LoadHigh was jumping to the execute label above. This was wrong + 25044 ;because IOSET was getting invoked twice resulting in 2 sets of redirections. + 25045 ;After a close, this would still leave one open active resulting in sharing + 25046 ;errors on subsequent opens of the redirected file. + 25047 + 25048 LH_EXECUTE: ;M051 + 25049 00002D2F 8E06[039C] mov es,[TRAN_TPA] + 25050 ;mov ah,DEALLOC ; 49h + 25051 00002D33 B449 mov ah,49h + 25052 00002D35 CD21 int 21h ; DOS - 2+ - FREE MEMORY + 25053 ; ES = segment address of area to be freed + 25054 ; Now running in "free" space + 25055 00002D37 8E06[F59B] mov es,[RESSEG] + 25056 00002D3B 26FE06[9902] inc byte [es:ExtCom] ; Indicate external command + 25057 00002D40 26C606[A102]00 mov byte [es:RestDir],0 + 25058 ; Since USERDIR1 is in transient, insure + 25059 ; this flag value for re-entry to COMMAND + 25060 ; MSDOS 6.0 + 25061 00002D46 BE[1D9B] mov si,EXECPATH ; offset TRANGROUP:EXECPATH + 25062 00002D49 BF[5E04] mov di,SafePathBuffer ; offset RESGROUP:SAFEPATHBUFFER + 25063 ;mov cx,LENMSGORPATHBUF + 25064 00002D4C B95000 mov cx,80 + 25065 00002D4F FC cld + 25066 00002D50 F3A4 rep movsb ; copy program pathname to resident + 25067 + 25068 ; MSDOS 3.3 (& MSDOS 6.0) + 25069 00002D52 BF5C00 mov di,FCB ; 5Ch + 25070 00002D55 89FE mov si,di + 25071 ;mov cx,82 ; 52h ; moving (100h-5Ch)/2 = 80h-2Eh + 25072 00002D57 B152 mov cl,82 ; 25/02/2023 + 25073 00002D59 F3A5 rep movsw ; Transfer parameters to resident header + 25074 + 25075 ; 25/02/2023 + 25076 ;mov dx,EXECPATH ; MSDOS 3.3 + 25077 ; MSDOS 6.0 (& 5.0) + 25078 ;mov dx,offset RESGROUP:SAFEPATHBUFFER + 25079 00002D5B BA[5E04] mov dx,SafePathBuffer + 25080 00002D5E 06 push es + 25081 00002D5F 1F pop ds + 25082 + 25083 ;mov bx,offset RESGROUP:EXEC_BLOCK + 25084 00002D60 BB[3A04] mov bx,Exec_Block ; = offset EnvirSeg + 25085 ;mov ax,EXEC*256 ; 4B00h + 25086 00002D63 B8004B mov ax,4B00h + 25087 ;test byte [ROM_CALL],-1 ; 0FFh ; MSDOS 3.3 + 25088 00002D66 2EF606[B49D]FF test byte [cs:ROM_CALL],-1 ; MSDOS 6.0 (& 5.0) + 25089 00002D6C 7403 jz short OK_EXEC + 25090 00002D6E E9DBD7 jmp ROM_EXEC + 25091 + 25092 OK_EXEC: + 25093 + 25094 ; we are now running in free space. Anything we do from here on may get + 25095 ; trashed. Move the stack (also in free space) to allocated space because + 25096 ; since EXEC restores the stack, somebody may trash what is on the stack. + 25097 + 25098 00002D71 8CC1 mov cx,es + 25099 00002D73 8ED1 mov ss,cx + 25100 00002D75 BC[2E05] mov sp,RStack + 25101 ; MSDOS 3.3 + 25102 ;jmp far [EXEC_ADDR] ; Jmp to the EXEC in the resident + 25103 ; 25/02/2023 + 25104 ; MSDOS 6.0 + 25105 00002D78 2EFF2E[FB9B] jmp far [cs:EXEC_ADDR] ; Jmp to the EXEC in the resident + 25106 + 25107 ; =============== S U B R O U T I N E ======================================= 25108 - 25109 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25110 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2A51h + 25109 ; Prescan converts the input buffer into a canonicalized form. + 25110 ; All redirections and pipes are removed. 25111 - 25112 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 25113 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2FFBh + 25112 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25113 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2A51h 25114 - 25115 ; 05/08/2024 - Retro DOS v5.0 COMMAND.COM - 25116 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2E8Dh - 25117 PRESCAN: - 25118 00002D7D 31C9 xor cx,cx - 25119 00002D7F 8E06[F59B] mov es,[RESSEG] - 25120 00002D83 BE[569A] mov si,COMBUF+2 - 25121 00002D86 89F7 mov di,si - 25122 COUNTQUOTES: - 25123 00002D88 AC lodsb ; get a byte - 25124 00002D89 3C22 cmp al,22h ; '"' ; is it a quote? - 25125 00002D8B 7504 jne short COUNTEND ; no, try for end of road - 25126 00002D8D FEC5 inc ch ; bump count - 25127 00002D8F EBF7 jmp short COUNTQUOTES - 25128 ; go get next char - 25129 COUNTEND: - 25130 00002D91 3C0D cmp al,0Dh ; 13 ; end of road? - 25131 00002D93 75F3 jne short COUNTQUOTES - 25132 ; no, go back for next char - 25133 ; 26/02/2023 - 25134 ; MSDOS 5.0 (& 6.0) - 25135 00002D95 51 push cx ; save count - 25136 00002D96 89FE mov si,di ; restore pointer to begining - 25137 KanjiScan: - 25138 00002D98 AC lodsb ; get a byte - 25139 00002D99 E8C5F9 call testkanj ; is it a leadin byte - 25140 00002D9C 740F jz short KanjiQuote - 25141 ; no, check for quotes - 25142 00002D9E 88C4 mov ah,al ; save leadin - 25143 00002DA0 AC lodsb ; get trailing byte - 25144 00002DA1 3D2020 cmp ax,2020h - 25145 ;cmp ax,DB_SPACE ; is it Kanji space - 25146 00002DA4 75F2 jne short KanjiScan ; no, go get next - 25147 00002DA6 C744FE2020 mov word [si-2],2020h - 25148 ; replace with spaces - 25149 00002DAB EBEB jmp short KanjiScan ; go get next char - 25150 - 25151 KanjiQuote: - 25152 00002DAD 3C22 cmp al,22h ; '"' ; beginning of quoted string - 25153 00002DAF 750D jne short KanjiEnd ; no, check for end - 25154 00002DB1 FECD dec ch ; drop count - 25155 00002DB3 74E3 jz short KanjiScan ; if count is zero, no quoting - 25156 KanjiQuoteLoop: - 25157 00002DB5 AC lodsb ; get next byte - 25158 00002DB6 3C22 cmp al,22h ; '"' ; is it another quote - 25159 00002DB8 75FB jne short KanjiQuoteLoop - 25160 ; no, get another - 25161 00002DBA FECD dec ch ; yes, drop count - 25162 00002DBC EBDA jmp short KanjiScan ; go get next char - 25163 KanjiEnd: - 25164 00002DBE 3C0D cmp al,13 ; 0Dh ; end of line character? - 25165 00002DC0 75D6 jne short KanjiScan ; go back to beginning - 25166 00002DC2 59 pop cx ; get back original count - 25167 ; 26/04/2023 - 25168 00002DC3 89FE mov si,di ; restore pointer to beginning - 25169 - 25170 ; MSDOS 3.3 (& MSDOS 6.0) - 25171 PRESCANLP: - 25172 00002DC5 AC lodsb - 25173 ; 26/02/2023 - 25174 00002DC6 E898F9 call testkanj - 25175 00002DC9 740C jz short NOTKANJ6 - 25176 ; MSDOS 6.0 - 25177 00002DCB 8805 mov [di],al - 25178 00002DCD 47 inc di ; fake STOSB into DS - 25179 00002DCE AC lodsb ; grab second byte - 25180 00002DCF 8805 mov [di],al ; fake stosb into DS - 25181 00002DD1 FEC1 inc cl - 25182 00002DD3 FEC1 inc cl - 25183 00002DD5 EBEE jmp short PRESCANLP - 25184 - 25185 NOTKANJ6: - 25186 ; MSDOS 3.3 (& MSDOS 6.0) - 25187 00002DD7 3C22 cmp al,'"' ; 22h ; " character - 25188 00002DD9 7510 jne short TRYGREATER - 25189 00002DDB FECD dec ch - 25190 00002DDD 740C jz short TRYGREATER - 25191 QLOOP: - 25192 00002DDF 8805 mov [di],al - 25193 00002DE1 47 inc di - 25194 00002DE2 FEC1 inc cl - 25195 00002DE4 AC lodsb - 25196 00002DE5 3C22 cmp al,'"' ; " character - 25197 00002DE7 75F6 jne short QLOOP - 25198 00002DE9 FECD dec ch - 25199 TRYGREATER: - 25200 00002DEB 3C3E cmp al,'>' ; 3Eh - 25201 ;cmp al,rabracket ; MSDOS 6.0 (& 5.0) - 25202 ;;cmp al,[RABRACKET] ; MSDOS 3.3 - 25203 00002DED 7565 jne short NOOUT - 25204 - 25205 ; We have found a ">" char. We need to see if there is another ">" - 25206 ; following it. + 25115 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 25116 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:2FFBh + 25117 + 25118 ; 05/08/2024 - Retro DOS v5.0 COMMAND.COM + 25119 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2E8Dh + 25120 PRESCAN: + 25121 00002D7D 31C9 xor cx,cx + 25122 00002D7F 8E06[F59B] mov es,[RESSEG] + 25123 00002D83 BE[569A] mov si,COMBUF+2 + 25124 00002D86 89F7 mov di,si + 25125 COUNTQUOTES: + 25126 00002D88 AC lodsb ; get a byte + 25127 00002D89 3C22 cmp al,22h ; '"' ; is it a quote? + 25128 00002D8B 7504 jne short COUNTEND ; no, try for end of road + 25129 00002D8D FEC5 inc ch ; bump count + 25130 00002D8F EBF7 jmp short COUNTQUOTES + 25131 ; go get next char + 25132 COUNTEND: + 25133 00002D91 3C0D cmp al,0Dh ; 13 ; end of road? + 25134 00002D93 75F3 jne short COUNTQUOTES + 25135 ; no, go back for next char + 25136 ; 26/02/2023 + 25137 ; MSDOS 5.0 (& 6.0) + 25138 00002D95 51 push cx ; save count + 25139 00002D96 89FE mov si,di ; restore pointer to begining + 25140 KanjiScan: + 25141 00002D98 AC lodsb ; get a byte + 25142 00002D99 E8C5F9 call testkanj ; is it a leadin byte + 25143 00002D9C 740F jz short KanjiQuote + 25144 ; no, check for quotes + 25145 00002D9E 88C4 mov ah,al ; save leadin + 25146 00002DA0 AC lodsb ; get trailing byte + 25147 00002DA1 3D2020 cmp ax,2020h + 25148 ;cmp ax,DB_SPACE ; is it Kanji space + 25149 00002DA4 75F2 jne short KanjiScan ; no, go get next + 25150 00002DA6 C744FE2020 mov word [si-2],2020h + 25151 ; replace with spaces + 25152 00002DAB EBEB jmp short KanjiScan ; go get next char + 25153 + 25154 KanjiQuote: + 25155 00002DAD 3C22 cmp al,22h ; '"' ; beginning of quoted string + 25156 00002DAF 750D jne short KanjiEnd ; no, check for end + 25157 00002DB1 FECD dec ch ; drop count + 25158 00002DB3 74E3 jz short KanjiScan ; if count is zero, no quoting + 25159 KanjiQuoteLoop: + 25160 00002DB5 AC lodsb ; get next byte + 25161 00002DB6 3C22 cmp al,22h ; '"' ; is it another quote + 25162 00002DB8 75FB jne short KanjiQuoteLoop + 25163 ; no, get another + 25164 00002DBA FECD dec ch ; yes, drop count + 25165 00002DBC EBDA jmp short KanjiScan ; go get next char + 25166 KanjiEnd: + 25167 00002DBE 3C0D cmp al,13 ; 0Dh ; end of line character? + 25168 00002DC0 75D6 jne short KanjiScan ; go back to beginning + 25169 00002DC2 59 pop cx ; get back original count + 25170 ; 26/04/2023 + 25171 00002DC3 89FE mov si,di ; restore pointer to beginning + 25172 + 25173 ; MSDOS 3.3 (& MSDOS 6.0) + 25174 PRESCANLP: + 25175 00002DC5 AC lodsb + 25176 ; 26/02/2023 + 25177 00002DC6 E898F9 call testkanj + 25178 00002DC9 740C jz short NOTKANJ6 + 25179 ; MSDOS 6.0 + 25180 00002DCB 8805 mov [di],al + 25181 00002DCD 47 inc di ; fake STOSB into DS + 25182 00002DCE AC lodsb ; grab second byte + 25183 00002DCF 8805 mov [di],al ; fake stosb into DS + 25184 00002DD1 FEC1 inc cl + 25185 00002DD3 FEC1 inc cl + 25186 00002DD5 EBEE jmp short PRESCANLP + 25187 + 25188 NOTKANJ6: + 25189 ; MSDOS 3.3 (& MSDOS 6.0) + 25190 00002DD7 3C22 cmp al,'"' ; 22h ; " character + 25191 00002DD9 7510 jne short TRYGREATER + 25192 00002DDB FECD dec ch + 25193 00002DDD 740C jz short TRYGREATER + 25194 QLOOP: + 25195 00002DDF 8805 mov [di],al + 25196 00002DE1 47 inc di + 25197 00002DE2 FEC1 inc cl + 25198 00002DE4 AC lodsb + 25199 00002DE5 3C22 cmp al,'"' ; " character + 25200 00002DE7 75F6 jne short QLOOP + 25201 00002DE9 FECD dec ch + 25202 TRYGREATER: + 25203 00002DEB 3C3E cmp al,'>' ; 3Eh + 25204 ;cmp al,rabracket ; MSDOS 6.0 (& 5.0) + 25205 ;;cmp al,[RABRACKET] ; MSDOS 3.3 + 25206 00002DED 7565 jne short NOOUT 25207 - 25208 00002DEF 3804 cmp [si],al - 25209 00002DF1 7506 jne short NOAPPND - 25210 00002DF3 AC lodsb - 25211 00002DF4 26FE06[C102] inc byte [es:Re_Out_App] ; Flag >> - 25212 NOAPPND: - 25213 ; Now we attempt to find the file name. First, scan off all whitespace - 25214 - 25215 00002DF9 E88AFB call scanoff - 25216 - 25217 ; 26/02/2023 - 25218 ; MSDOS 6.0 - 25219 00002DFC 3C3C cmp al,'<' ; 3Ch - 25220 ;cmp al,labracket ;AN040; was there no filename? - 25221 00002DFE 7404 je short REOUT_ERRSET - 25222 ;AN040; yes - set up error - 25223 ; MSDOS 3.3 (& MSDOS 6.0) - 25224 00002E00 3C0D cmp al,0Dh - 25225 00002E02 750D jnz short GOTREOFIL - 25226 - 25227 ; There was no file present. Set us up at end-of-line. - 25228 - 25229 REOUT_ERRSET: ;AN040; set up for an error - 25230 00002E04 C6050D mov byte [di],0Dh ; Clobber first ">" - 25231 00002E07 26C706[C202]0900 mov word [es:Re_OutStr],9 - 25232 ; Cause an error later - 25233 00002E0E E9B700 jmp PRESCANEND - 25234 - 25235 GOTREOFIL: - 25236 00002E11 57 push di - 25237 ;mov di,offset RESGROUP:RE_OUTSTR - 25238 00002E12 BF[C202] mov di,Re_OutStr - 25239 00002E15 89FB mov bx,di - 25240 00002E17 06 push es - 25241 - 25242 ; 26/02/2023 - 25243 ; MSDOS 6.0 - 25244 SETREOUTSTR: ; Get the output redirection name - 25245 ; MSKK06 07/14/89 - 25246 00002E18 51 push cx ; save cx - 25247 00002E19 B94D00 mov cx,64+13 ; CX = max string length - 25248 SETREOUTSTR_LOOP: - 25249 00002E1C AC lodsb - 25250 00002E1D 3C0D cmp al,0Dh - 25251 00002E1F 741A je short GOTRESTR_J - 25252 00002E21 E86AFB call DELIM - 25253 00002E24 7415 jz short GOTRESTR_J - 25254 00002E26 3A06[F99B] cmp al,[SWITCHAR] - 25255 00002E2A 740F je short GOTRESTR_J - 25256 00002E2C 3C22 cmp al,'"' ; 22h ;AN033; Is the character a quote? - 25257 00002E2E 7421 je short PIPEERRSYNJ5_J - 25258 ;AN033; Yes - get out quick - or system crashes - 25259 00002E30 3C3C cmp al,'<' ; 3Ch - 25260 ;cmp al,labracket ;AN002; Is char for input redirection - 25261 00002E32 7404 je short ABRACKET_TERM - 25262 ;AN002; yes - end of string - 25263 00002E34 3C3E cmp al,'>' ; 3Eh - 25264 ;cmp al,rabracket ;AN002; Is char for output redirection - 25265 00002E36 7506 jne short NO_ABRACKET - 25266 ;AN002; no - not end of string - 25267 ABRACKET_TERM: ;AN002; have end of string by < or > - 25268 00002E38 4E dec si ;AN002; back up over symbol - 25269 00002E39 B020 mov al,20h ; BLANK ;AN002; show delimiter as char - 25270 GOTRESTR_J: - 25271 00002E3B 59 pop cx ; MSKK06 07/14/89 - 25272 00002E3C EB66 jmp short GOTRESTR ;AN002; go process it - 25273 NO_ABRACKET: ;AN002; NOT AT END OF STRING - 25274 00002E3E AA stosb ; store it into resgroup - 25275 - 25276 ; 05/08/2024 - PCDOS 7.1 COMMAND.COM - 25277 %if 1 - 25278 ;ifdef DBCS - 25279 ;invoke testkanj - 25280 ;jz short @f ; if not lead byte of DBCS - 25281 00002E3F E81FF9 call testkanj - 25282 00002E42 7409 jz short NO_ABRACKET_@ - 25283 00002E44 E3F5 jcxz GOTRESTR_J ; if no tail byte - 25284 00002E46 AC lodsb - 25285 00002E47 3C0D cmp al,0Dh - 25286 00002E49 74F0 jz short GOTRESTR_J ; if tail byte does't come and ends - 25287 00002E4B AA stosb ; copy tail byte - 25288 00002E4C 49 dec cx - 25289 ;@@: - 25290 NO_ABRACKET_@: ; 05/08/2024 - 25291 ;endif - 25292 %endif - 25293 - 25294 00002E4D E2CD loop SETREOUTSTR_LOOP - 25295 ; MSKK06 07/14/89 - 25296 00002E4F EBEA jmp short GOTRESTR_J - 25297 PIPEERRSYNJ5_J: - 25298 00002E51 59 pop cx ; recover CX - 25299 00002E52 EB4B jmp short PIPEERRSYNJ5 - 25300 - 25301 ; 26/02/2023 - 25302 ; ; MSDOS 3.3 - 25303 ;SETREOUTSTR_LOOP: ; Get the output redirection name - 25304 ; lodsb - 25305 ; cmp al,0Dh - 25306 ; jz short GOTRESTR - 25307 ; call DELIM - 25308 ; jz short GOTRESTR - 25309 ; cmp al,[SWITCHAR] - 25310 ; je short GOTRESTR - 25311 ; cmp al,'"' - 25312 ; jne short NO_ABRACKET - 25313 ; dec ch - 25314 ;NO_ABRACKET: - 25315 ; stosb - 25316 ; jmp short SETREOUTSTR_LOOP - 25317 - 25318 NOOUT: - 25319 ; 26/02/2023 - 25320 ; MSDOS 3.3 (& MSDOS 6.0) - 25321 00002E54 3C3C cmp al, '<' ; 3Ch - 25322 ;cmp al,labracket ; MSDOS 6.0 - 25323 ;;cmp al,[LABRACKET] ; MSDOS 3.3 - 25324 00002E56 7523 jne short CHKPIPE - 25325 00002E58 89F3 mov bx,si ; Save loc of "<" - 25326 00002E5A E829FB call scanoff - 25327 ; MSDOS 6.0 - 25328 00002E5D 3C3E cmp al,'>' ; 3Eh - 25329 ;cmp al,rabracket ;AN040; was there no filename? - 25330 00002E5F 7404 je short REIN_ERRSET ;AN040; yes - set up error - 25331 ; MSDOS 3.3 (& MSDOS 6.0) - 25332 00002E61 3C0D cmp al,0Dh - 25333 00002E63 750B jne short GOTREIFIL - 25334 REIN_ERRSET: ;AN040; set up for error - 25335 00002E65 C6050D mov byte [di],0Dh ; Clobber "<" - 25336 00002E68 C706[A09B]0900 mov word [RE_INSTR],9 - 25337 ; Cause an error later - 25338 00002E6E EB58 jmp short PRESCANEND - 25339 GOTREIFIL: - 25340 00002E70 57 push di - 25341 00002E71 BF[A09B] mov di,RE_INSTR - 25342 00002E74 89FB mov bx,di - 25343 00002E76 06 push es - 25344 00002E77 0E push cs - 25345 00002E78 07 pop es ; store in TRANGROUP - 25346 ; 26/04/2023 - 25347 ;jmp short SETREOUTSTR_LOOP ; MSDOS 3.3 COMMAND.COM - 25348 00002E79 EB9D jmp short SETREOUTSTR ; MSDOS 5.0 (& 6.0) COMMAND.COM - 25349 ; Get the input redirection name - 25350 CHKPIPE: - 25351 00002E7B 88C4 mov ah,al - 25352 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25353 00002E7D 80FC7C cmp ah,'|' ; 7Ch - 25354 ;cmp ah,ALTPIPECHR ; 7Ch - 25355 ;je short ISPIPE3 - 25356 ;; MSDOS 6.0 - 25357 ;cmp ah,'|' ; 7Ch - 25358 ;;cmp al,vbar ; 7Ch - 25359 ;;;cmp ah,[VBAR] ; MSDOS 3.3 - 25360 00002E80 7539 jne short CONTPRESCAN - 25361 ISPIPE3: - 25362 ; Only push the echo flag if we are entering the pipe for the first time. - 25363 - 25364 00002E82 26803E[1303]00 cmp byte [es:PipeFlag],0 - 25365 00002E88 7505 jne short NOECHOPUSH - 25366 00002E8A 26D026[9D02] shl byte [es:EchoFlag],1 ; push echo state and turn it off - 25367 NOECHOPUSH: - 25368 00002E8F 26FE06[1303] inc byte [es:PipeFlag] - 25369 00002E94 E8EFFA call scanoff - 25370 00002E97 3C0D cmp al,0Dh - 25371 00002E99 7404 je short PIPEERRSYNJ5 - 25372 ; 26/02/2023 - 25373 00002E9B 3C7C cmp al,'|' ; 7Ch - 25374 ;cmp al,ALTPIPECHR ; 7Ch - 25375 ;je short PIPEERRSYNJ5 - 25376 ;; MSDOS 6.0 - 25377 ;cmp al,'|' ; 7Ch - 25378 ;;cmp al,vbar ; 7Ch - 25379 ;;;cmp al,[VBAR] ; MSDOS 3.3 - 25380 00002E9D 751C jne short CONTPRESCAN - 25381 - 25382 PIPEERRSYNJ5: - 25383 00002E9F 06 push es - 25384 00002EA0 1F pop ds - 25385 00002EA1 E99E02 jmp PIPEERRSYN - 25386 - 25387 ; Trailing :s are allowed on devices. Check to be sure that there is more - 25388 ; than just a : in the redir string. + 25208 ; We have found a ">" char. We need to see if there is another ">" + 25209 ; following it. + 25210 + 25211 00002DEF 3804 cmp [si],al + 25212 00002DF1 7506 jne short NOAPPND + 25213 00002DF3 AC lodsb + 25214 00002DF4 26FE06[C102] inc byte [es:Re_Out_App] ; Flag >> + 25215 NOAPPND: + 25216 ; Now we attempt to find the file name. First, scan off all whitespace + 25217 + 25218 00002DF9 E88AFB call scanoff + 25219 + 25220 ; 26/02/2023 + 25221 ; MSDOS 6.0 + 25222 00002DFC 3C3C cmp al,'<' ; 3Ch + 25223 ;cmp al,labracket ;AN040; was there no filename? + 25224 00002DFE 7404 je short REOUT_ERRSET + 25225 ;AN040; yes - set up error + 25226 ; MSDOS 3.3 (& MSDOS 6.0) + 25227 00002E00 3C0D cmp al,0Dh + 25228 00002E02 750D jnz short GOTREOFIL + 25229 + 25230 ; There was no file present. Set us up at end-of-line. + 25231 + 25232 REOUT_ERRSET: ;AN040; set up for an error + 25233 00002E04 C6050D mov byte [di],0Dh ; Clobber first ">" + 25234 00002E07 26C706[C202]0900 mov word [es:Re_OutStr],9 + 25235 ; Cause an error later + 25236 00002E0E E9B700 jmp PRESCANEND + 25237 + 25238 GOTREOFIL: + 25239 00002E11 57 push di + 25240 ;mov di,offset RESGROUP:RE_OUTSTR + 25241 00002E12 BF[C202] mov di,Re_OutStr + 25242 00002E15 89FB mov bx,di + 25243 00002E17 06 push es + 25244 + 25245 ; 26/02/2023 + 25246 ; MSDOS 6.0 + 25247 SETREOUTSTR: ; Get the output redirection name + 25248 ; MSKK06 07/14/89 + 25249 00002E18 51 push cx ; save cx + 25250 00002E19 B94D00 mov cx,64+13 ; CX = max string length + 25251 SETREOUTSTR_LOOP: + 25252 00002E1C AC lodsb + 25253 00002E1D 3C0D cmp al,0Dh + 25254 00002E1F 741A je short GOTRESTR_J + 25255 00002E21 E86AFB call DELIM + 25256 00002E24 7415 jz short GOTRESTR_J + 25257 00002E26 3A06[F99B] cmp al,[SWITCHAR] + 25258 00002E2A 740F je short GOTRESTR_J + 25259 00002E2C 3C22 cmp al,'"' ; 22h ;AN033; Is the character a quote? + 25260 00002E2E 7421 je short PIPEERRSYNJ5_J + 25261 ;AN033; Yes - get out quick - or system crashes + 25262 00002E30 3C3C cmp al,'<' ; 3Ch + 25263 ;cmp al,labracket ;AN002; Is char for input redirection + 25264 00002E32 7404 je short ABRACKET_TERM + 25265 ;AN002; yes - end of string + 25266 00002E34 3C3E cmp al,'>' ; 3Eh + 25267 ;cmp al,rabracket ;AN002; Is char for output redirection + 25268 00002E36 7506 jne short NO_ABRACKET + 25269 ;AN002; no - not end of string + 25270 ABRACKET_TERM: ;AN002; have end of string by < or > + 25271 00002E38 4E dec si ;AN002; back up over symbol + 25272 00002E39 B020 mov al,20h ; BLANK ;AN002; show delimiter as char + 25273 GOTRESTR_J: + 25274 00002E3B 59 pop cx ; MSKK06 07/14/89 + 25275 00002E3C EB66 jmp short GOTRESTR ;AN002; go process it + 25276 NO_ABRACKET: ;AN002; NOT AT END OF STRING + 25277 00002E3E AA stosb ; store it into resgroup + 25278 + 25279 ; 05/08/2024 - PCDOS 7.1 COMMAND.COM + 25280 %if 1 + 25281 ;ifdef DBCS + 25282 ;invoke testkanj + 25283 ;jz short @f ; if not lead byte of DBCS + 25284 00002E3F E81FF9 call testkanj + 25285 00002E42 7409 jz short NO_ABRACKET_@ + 25286 00002E44 E3F5 jcxz GOTRESTR_J ; if no tail byte + 25287 00002E46 AC lodsb + 25288 00002E47 3C0D cmp al,0Dh + 25289 00002E49 74F0 jz short GOTRESTR_J ; if tail byte does't come and ends + 25290 00002E4B AA stosb ; copy tail byte + 25291 00002E4C 49 dec cx + 25292 ;@@: + 25293 NO_ABRACKET_@: ; 05/08/2024 + 25294 ;endif + 25295 %endif + 25296 + 25297 00002E4D E2CD loop SETREOUTSTR_LOOP + 25298 ; MSKK06 07/14/89 + 25299 00002E4F EBEA jmp short GOTRESTR_J + 25300 PIPEERRSYNJ5_J: + 25301 00002E51 59 pop cx ; recover CX + 25302 00002E52 EB4B jmp short PIPEERRSYNJ5 + 25303 + 25304 ; 26/02/2023 + 25305 ; ; MSDOS 3.3 + 25306 ;SETREOUTSTR_LOOP: ; Get the output redirection name + 25307 ; lodsb + 25308 ; cmp al,0Dh + 25309 ; jz short GOTRESTR + 25310 ; call DELIM + 25311 ; jz short GOTRESTR + 25312 ; cmp al,[SWITCHAR] + 25313 ; je short GOTRESTR + 25314 ; cmp al,'"' + 25315 ; jne short NO_ABRACKET + 25316 ; dec ch + 25317 ;NO_ABRACKET: + 25318 ; stosb + 25319 ; jmp short SETREOUTSTR_LOOP + 25320 + 25321 NOOUT: + 25322 ; 26/02/2023 + 25323 ; MSDOS 3.3 (& MSDOS 6.0) + 25324 00002E54 3C3C cmp al, '<' ; 3Ch + 25325 ;cmp al,labracket ; MSDOS 6.0 + 25326 ;;cmp al,[LABRACKET] ; MSDOS 3.3 + 25327 00002E56 7523 jne short CHKPIPE + 25328 00002E58 89F3 mov bx,si ; Save loc of "<" + 25329 00002E5A E829FB call scanoff + 25330 ; MSDOS 6.0 + 25331 00002E5D 3C3E cmp al,'>' ; 3Eh + 25332 ;cmp al,rabracket ;AN040; was there no filename? + 25333 00002E5F 7404 je short REIN_ERRSET ;AN040; yes - set up error + 25334 ; MSDOS 3.3 (& MSDOS 6.0) + 25335 00002E61 3C0D cmp al,0Dh + 25336 00002E63 750B jne short GOTREIFIL + 25337 REIN_ERRSET: ;AN040; set up for error + 25338 00002E65 C6050D mov byte [di],0Dh ; Clobber "<" + 25339 00002E68 C706[A09B]0900 mov word [RE_INSTR],9 + 25340 ; Cause an error later + 25341 00002E6E EB58 jmp short PRESCANEND + 25342 GOTREIFIL: + 25343 00002E70 57 push di + 25344 00002E71 BF[A09B] mov di,RE_INSTR + 25345 00002E74 89FB mov bx,di + 25346 00002E76 06 push es + 25347 00002E77 0E push cs + 25348 00002E78 07 pop es ; store in TRANGROUP + 25349 ; 26/04/2023 + 25350 ;jmp short SETREOUTSTR_LOOP ; MSDOS 3.3 COMMAND.COM + 25351 00002E79 EB9D jmp short SETREOUTSTR ; MSDOS 5.0 (& 6.0) COMMAND.COM + 25352 ; Get the input redirection name + 25353 CHKPIPE: + 25354 00002E7B 88C4 mov ah,al + 25355 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25356 00002E7D 80FC7C cmp ah,'|' ; 7Ch + 25357 ;cmp ah,ALTPIPECHR ; 7Ch + 25358 ;je short ISPIPE3 + 25359 ;; MSDOS 6.0 + 25360 ;cmp ah,'|' ; 7Ch + 25361 ;;cmp al,vbar ; 7Ch + 25362 ;;;cmp ah,[VBAR] ; MSDOS 3.3 + 25363 00002E80 7539 jne short CONTPRESCAN + 25364 ISPIPE3: + 25365 ; Only push the echo flag if we are entering the pipe for the first time. + 25366 + 25367 00002E82 26803E[1303]00 cmp byte [es:PipeFlag],0 + 25368 00002E88 7505 jne short NOECHOPUSH + 25369 00002E8A 26D026[9D02] shl byte [es:EchoFlag],1 ; push echo state and turn it off + 25370 NOECHOPUSH: + 25371 00002E8F 26FE06[1303] inc byte [es:PipeFlag] + 25372 00002E94 E8EFFA call scanoff + 25373 00002E97 3C0D cmp al,0Dh + 25374 00002E99 7404 je short PIPEERRSYNJ5 + 25375 ; 26/02/2023 + 25376 00002E9B 3C7C cmp al,'|' ; 7Ch + 25377 ;cmp al,ALTPIPECHR ; 7Ch + 25378 ;je short PIPEERRSYNJ5 + 25379 ;; MSDOS 6.0 + 25380 ;cmp al,'|' ; 7Ch + 25381 ;;cmp al,vbar ; 7Ch + 25382 ;;;cmp al,[VBAR] ; MSDOS 3.3 + 25383 00002E9D 751C jne short CONTPRESCAN + 25384 + 25385 PIPEERRSYNJ5: + 25386 00002E9F 06 push es + 25387 00002EA0 1F pop ds + 25388 00002EA1 E99E02 jmp PIPEERRSYN 25389 - 25390 GOTRESTR: - 25391 00002EA4 86E0 xchg ah,al - 25392 00002EA6 B03A mov al,':' ; 3Ah - 25393 00002EA8 29FB sub bx,di ; compute negative of number of chars - 25394 00002EAA 83FBFF cmp bx,-1 ; is there just a :? - 25395 00002EAD 7407 je short NOTRAILCOL ; yep, don't change - 25396 00002EAF 263845FF cmp [es:di-1],al ; Trailing ':' OK on devices - 25397 00002EB3 7501 jne short NOTRAILCOL - 25398 00002EB5 4F dec di ; Back up over trailing ':' - 25399 NOTRAILCOL: - 25400 00002EB6 30C0 xor al,al - 25401 00002EB8 AA stosb ; NUL terminate the string - 25402 00002EB9 07 pop es - 25403 00002EBA 5F pop di ; Remember the start - 25404 CONTPRESCAN: - 25405 00002EBB 8825 mov [di],ah ; "delete" the redirection string - 25406 00002EBD 47 inc di - 25407 00002EBE 80FC0D cmp ah,0Dh - 25408 00002EC1 7405 je short PRESCANEND - 25409 00002EC3 FEC1 inc cl - 25410 00002EC5 E9FDFE jmp PRESCANLP - 25411 PRESCANEND: - 25412 00002EC8 26803E[1303]00 cmp byte [es:PipeFlag],0 - 25413 00002ECE 7414 jz short ISNOPIPE - 25414 - 25415 ; 11/06/2023 - 25416 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:314Ah - 25417 ;mov di,48Ah ; PipeStr ; RESGROUP:EndInit+160 - 25418 ;mov [es:488h],di ; [es:PipePtr],di - 25419 ; (RESGROUP:EndInit+158) - 25420 ; 26/02/2023 - 25421 ;;MSDOS 5.0 COMMAND.COM - TRANGROUP:2BA0h - 25422 ;;mov di,3C0h ; offset RESGROUP:PIPESTR - 25423 ;; ; (EndInit+160] - 25424 - 25425 ; 05/08/2024 - 25426 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2FEAh - 25427 ;mov di,4BEh ; PipeStr ; RESGROUP:EndInit+160 - 25428 ;mov [es:4BCh],di ; (RESGROUP:EndInit+158) - 25429 - 25430 ;mov di,offset RESGROUP:PIPESTR - 25431 00002ED0 BF[B503] mov di,PipeStr ; RESGROUP:EndInit+160 + 25390 ; Trailing :s are allowed on devices. Check to be sure that there is more + 25391 ; than just a : in the redir string. + 25392 + 25393 GOTRESTR: + 25394 00002EA4 86E0 xchg ah,al + 25395 00002EA6 B03A mov al,':' ; 3Ah + 25396 00002EA8 29FB sub bx,di ; compute negative of number of chars + 25397 00002EAA 83FBFF cmp bx,-1 ; is there just a :? + 25398 00002EAD 7407 je short NOTRAILCOL ; yep, don't change + 25399 00002EAF 263845FF cmp [es:di-1],al ; Trailing ':' OK on devices + 25400 00002EB3 7501 jne short NOTRAILCOL + 25401 00002EB5 4F dec di ; Back up over trailing ':' + 25402 NOTRAILCOL: + 25403 00002EB6 30C0 xor al,al + 25404 00002EB8 AA stosb ; NUL terminate the string + 25405 00002EB9 07 pop es + 25406 00002EBA 5F pop di ; Remember the start + 25407 CONTPRESCAN: + 25408 00002EBB 8825 mov [di],ah ; "delete" the redirection string + 25409 00002EBD 47 inc di + 25410 00002EBE 80FC0D cmp ah,0Dh + 25411 00002EC1 7405 je short PRESCANEND + 25412 00002EC3 FEC1 inc cl + 25413 00002EC5 E9FDFE jmp PRESCANLP + 25414 PRESCANEND: + 25415 00002EC8 26803E[1303]00 cmp byte [es:PipeFlag],0 + 25416 00002ECE 7414 jz short ISNOPIPE + 25417 + 25418 ; 11/06/2023 + 25419 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:314Ah + 25420 ;mov di,48Ah ; PipeStr ; RESGROUP:EndInit+160 + 25421 ;mov [es:488h],di ; [es:PipePtr],di + 25422 ; (RESGROUP:EndInit+158) + 25423 ; 26/02/2023 + 25424 ;;MSDOS 5.0 COMMAND.COM - TRANGROUP:2BA0h + 25425 ;;mov di,3C0h ; offset RESGROUP:PIPESTR + 25426 ;; ; (EndInit+160] + 25427 + 25428 ; 05/08/2024 + 25429 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:2FEAh + 25430 ;mov di,4BEh ; PipeStr ; RESGROUP:EndInit+160 + 25431 ;mov [es:4BCh],di ; (RESGROUP:EndInit+158) 25432 - 25433 ;;MSDOS 5.0 COMMAND.COM - TRANGROUP:2BA3h - 25434 ;;mov [es:3BEh],di ; [es:EndInit+158] - 25435 00002ED3 26893E[B303] mov [es:PipePtr],di ; RESGROUP:EndInit+158 - 25436 - 25437 00002ED8 BE[569A] mov si,COMBUF+2 - 25438 00002EDB E8A8FA call scanoff - 25439 PIPESETLP: ; Transfer the pipe into the resident - 25440 00002EDE AC lodsb ; pipe buffer - 25441 00002EDF AA stosb - 25442 00002EE0 3C0D cmp al,0Dh - 25443 00002EE2 75FA jnz short PIPESETLP - 25444 ISNOPIPE: - 25445 00002EE4 880E[559A] mov [COMBUF+1],cl - 25446 00002EE8 26803E[1303]00 cmp byte [es:PipeFlag],0 ; [es:41Ch] ; PCDOS 7.1 COMMAND.COM - 25447 00002EEE 0E push cs - 25448 00002EEF 07 pop es - 25449 00002EF0 C3 retn - 25450 - 25451 ; =============== S U B R O U T I N E ======================================= - 25452 - 25453 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25454 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2BC1h - 25455 cmd_copy: - 25456 00002EF1 BE[569A] mov si,COMBUF+2 - 25457 00002EF4 E88FFA call scanoff ; advance past separators... - 25458 00002EF7 0336[8F9D] add si,[PathPos] - 25459 00002EFB BF8100 mov di,81h - 25460 00002EFE 31C9 xor cx,cx - 25461 cmdcopy: - 25462 00002F00 AC lodsb - 25463 00002F01 AA stosb - 25464 00002F02 3C0D cmp al,0Dh - 25465 00002F04 7403 je short copy_done - 25466 00002F06 41 inc cx - 25467 00002F07 EBF7 jmp short cmdcopy - 25468 copy_done: - 25469 00002F09 880E8000 mov [80h],cl - 25470 00002F0D C3 retn - 25471 - 25472 ; =============== S U B R O U T I N E ======================================= - 25473 - 25474 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25475 test_append: - 25476 00002F0E BB[549A] mov bx,COMBUF ; barry can address - 25477 00002F11 BE[BA9C] mov si,IDLEN ; address command name, DS already set - 25478 00002F14 BAFFFF mov dx,-1 - 25479 00002F17 B800AE mov ax,0AE00h - 25480 00002F1A CD2F int 2Fh ; - Multiplex - DOS 3.3+ internal - 25481 ; - INSTALLABLE COMMAND - INSTALL CHECK - 25482 ; DX = FFFFh,[BX -> command line - 25483 ; Return: AL = FFh if this command is a TSR extension - 25484 ; to COMMAND.COM - 25485 ; AL = 00h if the command should be executed as usual - 25486 ;cmp al,0 - 25487 00002F1C 08C0 or al,al ; 25/02/2023 - 25488 00002F1E C3 retn - 25489 - 25490 ; 25/02/2023 - 25491 ; INT 2Fh - 25492 ; AX = AE00h - 25493 ; entry: - 25494 ; DX = magic value FFFFh - 25495 ; CH = FFh - 25496 ; CL = length of command line tail - 25497 ; DS:BX -> command line buffer -- (offset COMBUF) - 25498 ; DS:SI -> command name buffer -- (offset IDLEN) - 25499 ; return: - 25500 ; AL = FFh if this command is a TSR extension to COMMAND.COM - 25501 ; AL = 00h if the command should be executed as usual - 25502 ; - 25503 ; Format of COMMAND.COM command line buffer: - 25504 ; Offset Size Description - 25505 ; 00h BYTE max length of command line, as in INT 21/AH=0Ah - 25506 ; 01h BYTE count of bytes to follow, excluding terminating 0Dh - 25507 ; N BYTEs command line text, terminated by 0Dh - 25508 ; - 25509 ; Format of command name buffer: - 25510 ; Offset Size Description - 25511 ; 00h BYTE length of command name - 25512 ; 01h N BYTEs uppercased command name (blank-padded to 11 chars) - 25513 - 25514 ;============================================================================ - 25515 ; TMISC2.ASM, MSDOS 6.0, 1991 - 25516 ;============================================================================ - 25517 ; 05/10/2018 - Retro DOS v3.0 - 25518 - 25519 ; More misc routines - 25520 - 25521 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1D9Bh - 25522 - 25523 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25524 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2BEFh + 25433 ;mov di,offset RESGROUP:PIPESTR + 25434 00002ED0 BF[B503] mov di,PipeStr ; RESGROUP:EndInit+160 + 25435 + 25436 ;;MSDOS 5.0 COMMAND.COM - TRANGROUP:2BA3h + 25437 ;;mov [es:3BEh],di ; [es:EndInit+158] + 25438 00002ED3 26893E[B303] mov [es:PipePtr],di ; RESGROUP:EndInit+158 + 25439 + 25440 00002ED8 BE[569A] mov si,COMBUF+2 + 25441 00002EDB E8A8FA call scanoff + 25442 PIPESETLP: ; Transfer the pipe into the resident + 25443 00002EDE AC lodsb ; pipe buffer + 25444 00002EDF AA stosb + 25445 00002EE0 3C0D cmp al,0Dh + 25446 00002EE2 75FA jnz short PIPESETLP + 25447 ISNOPIPE: + 25448 00002EE4 880E[559A] mov [COMBUF+1],cl + 25449 00002EE8 26803E[1303]00 cmp byte [es:PipeFlag],0 ; [es:41Ch] ; PCDOS 7.1 COMMAND.COM + 25450 00002EEE 0E push cs + 25451 00002EEF 07 pop es + 25452 00002EF0 C3 retn + 25453 + 25454 ; =============== S U B R O U T I N E ======================================= + 25455 + 25456 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25457 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2BC1h + 25458 cmd_copy: + 25459 00002EF1 BE[569A] mov si,COMBUF+2 + 25460 00002EF4 E88FFA call scanoff ; advance past separators... + 25461 00002EF7 0336[8F9D] add si,[PathPos] + 25462 00002EFB BF8100 mov di,81h + 25463 00002EFE 31C9 xor cx,cx + 25464 cmdcopy: + 25465 00002F00 AC lodsb + 25466 00002F01 AA stosb + 25467 00002F02 3C0D cmp al,0Dh + 25468 00002F04 7403 je short copy_done + 25469 00002F06 41 inc cx + 25470 00002F07 EBF7 jmp short cmdcopy + 25471 copy_done: + 25472 00002F09 880E8000 mov [80h],cl + 25473 00002F0D C3 retn + 25474 + 25475 ; =============== S U B R O U T I N E ======================================= + 25476 + 25477 ; 25/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25478 test_append: + 25479 00002F0E BB[549A] mov bx,COMBUF ; barry can address + 25480 00002F11 BE[BA9C] mov si,IDLEN ; address command name, DS already set + 25481 00002F14 BAFFFF mov dx,-1 + 25482 00002F17 B800AE mov ax,0AE00h + 25483 00002F1A CD2F int 2Fh ; - Multiplex - DOS 3.3+ internal + 25484 ; - INSTALLABLE COMMAND - INSTALL CHECK + 25485 ; DX = FFFFh,[BX -> command line + 25486 ; Return: AL = FFh if this command is a TSR extension + 25487 ; to COMMAND.COM + 25488 ; AL = 00h if the command should be executed as usual + 25489 ;cmp al,0 + 25490 00002F1C 08C0 or al,al ; 25/02/2023 + 25491 00002F1E C3 retn + 25492 + 25493 ; 25/02/2023 + 25494 ; INT 2Fh + 25495 ; AX = AE00h + 25496 ; entry: + 25497 ; DX = magic value FFFFh + 25498 ; CH = FFh + 25499 ; CL = length of command line tail + 25500 ; DS:BX -> command line buffer -- (offset COMBUF) + 25501 ; DS:SI -> command name buffer -- (offset IDLEN) + 25502 ; return: + 25503 ; AL = FFh if this command is a TSR extension to COMMAND.COM + 25504 ; AL = 00h if the command should be executed as usual + 25505 ; + 25506 ; Format of COMMAND.COM command line buffer: + 25507 ; Offset Size Description + 25508 ; 00h BYTE max length of command line, as in INT 21/AH=0Ah + 25509 ; 01h BYTE count of bytes to follow, excluding terminating 0Dh + 25510 ; N BYTEs command line text, terminated by 0Dh + 25511 ; + 25512 ; Format of command name buffer: + 25513 ; Offset Size Description + 25514 ; 00h BYTE length of command name + 25515 ; 01h N BYTEs uppercased command name (blank-padded to 11 chars) + 25516 + 25517 ;============================================================================ + 25518 ; TMISC2.ASM, MSDOS 6.0, 1991 + 25519 ;============================================================================ + 25520 ; 05/10/2018 - Retro DOS v3.0 + 25521 + 25522 ; More misc routines + 25523 + 25524 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1D9Bh 25525 - 25526 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 25527 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3199h + 25526 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25527 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2BEFh 25528 - 25529 ; 05/08/2024 - Retro DOS v5.0 COMMAND.COM - 25530 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 3039h + 25529 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 25530 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3199h 25531 - 25532 ; =============== S U B R O U T I N E ======================================= - 25533 - 25534 SETPATH: - 25535 - 25536 ; ENTRY PathPos = ptr to string - 25537 ; PathCnt = length of string - 25538 ; - 25539 ; EXIT PathPos = ptr to string after pathname - 25540 ; PathCnt = length of rest of string - 25541 ; DX = ptr to pathname in string, made ASCIIZ - 25542 ; DestIsDir = 1 if pathname delimiters appeared in pathname, 0 otherwise - 25543 ; DestInfo = 2 if wildcards (?, *) appeared in pathname, 0 otherwise - 25544 ; - 25545 ; A null character is dropped at the end of the pathname. If the - 25546 ; character in that spot previously was CR, it is copied into the - 25547 ; following byte. So there must be at least two two character - 25548 ; positions in the buffer following the pathname. - 25549 - 25550 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25551 - 25552 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 25553 ; MSDOS 6.0 - 25554 ;mov ax,[PathCnt] ;AC000; get length of string - 25555 ;mov si,[PathPos] ;AC000; get start of source buffer - 25556 - 25557 ; 26/02/2023 - 25558 ; MSDOS 3.3 - 25559 ;mov si,80h - 25560 ;lodsb - 25561 ;xor ah,ah - 25562 ;mov [PATCNT],ax - 25563 ;mov [PATHPOS],si - 25564 GETPATH: - 25565 ; MSDOS 3.3 (& MSDOS 6.0) - 25566 00002F1F C606[BD9D]00 mov byte [DestInfo],0 - 25567 00002F24 C606[B99D]00 mov byte [DestIsDir],0 - 25568 00002F29 8B36[8F9D] mov si,[PathPos] ; SI = ptr to string - 25569 00002F2D 8B0E[8D9D] mov cx,[PathCnt] ; CX = string length - 25570 00002F31 89F2 mov dx,si ; DX = ptr to string - 25571 00002F33 E34D jcxz PATHDONE ; string length is zero, we're done - 25572 00002F35 51 push cx ; save string length - 25573 00002F36 56 push si ; save ptr to string - 25574 00002F37 E80AFC call SWITCH - 25575 - 25576 ; After Switch, SI has been scanned past any switches, and - 25577 ; switches that COMMAND intrinsically recognizes are recorded in AX. + 25532 ; 05/08/2024 - Retro DOS v5.0 COMMAND.COM + 25533 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 3039h + 25534 + 25535 ; =============== S U B R O U T I N E ======================================= + 25536 + 25537 SETPATH: + 25538 + 25539 ; ENTRY PathPos = ptr to string + 25540 ; PathCnt = length of string + 25541 ; + 25542 ; EXIT PathPos = ptr to string after pathname + 25543 ; PathCnt = length of rest of string + 25544 ; DX = ptr to pathname in string, made ASCIIZ + 25545 ; DestIsDir = 1 if pathname delimiters appeared in pathname, 0 otherwise + 25546 ; DestInfo = 2 if wildcards (?, *) appeared in pathname, 0 otherwise + 25547 ; + 25548 ; A null character is dropped at the end of the pathname. If the + 25549 ; character in that spot previously was CR, it is copied into the + 25550 ; following byte. So there must be at least two two character + 25551 ; positions in the buffer following the pathname. + 25552 + 25553 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25554 + 25555 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 25556 ; MSDOS 6.0 + 25557 ;mov ax,[PathCnt] ;AC000; get length of string + 25558 ;mov si,[PathPos] ;AC000; get start of source buffer + 25559 + 25560 ; 26/02/2023 + 25561 ; MSDOS 3.3 + 25562 ;mov si,80h + 25563 ;lodsb + 25564 ;xor ah,ah + 25565 ;mov [PATCNT],ax + 25566 ;mov [PATHPOS],si + 25567 GETPATH: + 25568 ; MSDOS 3.3 (& MSDOS 6.0) + 25569 00002F1F C606[BD9D]00 mov byte [DestInfo],0 + 25570 00002F24 C606[B99D]00 mov byte [DestIsDir],0 + 25571 00002F29 8B36[8F9D] mov si,[PathPos] ; SI = ptr to string + 25572 00002F2D 8B0E[8D9D] mov cx,[PathCnt] ; CX = string length + 25573 00002F31 89F2 mov dx,si ; DX = ptr to string + 25574 00002F33 E34D jcxz PATHDONE ; string length is zero, we're done + 25575 00002F35 51 push cx ; save string length + 25576 00002F36 56 push si ; save ptr to string + 25577 00002F37 E80AFC call SWITCH 25578 - 25579 00002F3A A3[919D] mov [PathSw],ax ; PathSw = switch occurrence mask - 25580 00002F3D 5B pop bx ; BX = ptr to original string - 25581 00002F3E 29F3 sub bx,si ; BX = -(# chars scanned by Switch) - 25582 00002F40 59 pop cx ; CX = string length - 25583 00002F41 01D9 add cx,bx ; CX = string length from current SI - 25584 00002F43 89F2 mov dx,si ; DX = ptr to current string - 25585 SKIPPATH: - 25586 ; 26/02/2023 - 25587 ; MSDOS 6.0 - 25588 00002F45 C606[4F9F]00 mov byte [KPARSE],0 - 25589 SKIPPATH2: - 25590 00002F4A E336 jcxz PATHDONE ; string length is zero, we're done - 25591 00002F4C 49 dec cx ; CX = length left after next char - 25592 00002F4D AC lodsb ; AL = next char of string - 25593 ; SI = ptr to char after this one - 25594 ; 26/02/2023 - 25595 00002F4E E810F8 call testkanj - 25596 00002F51 7408 jz short TESTPPSEP - 25597 00002F53 49 dec cx - 25598 00002F54 46 inc si - 25599 00002F55 FE06[4F9F] inc byte [KPARSE] - 25600 00002F59 EBEF jmp short SKIPPATH2 - 25601 TESTPPSEP: - 25602 00002F5B E8B6FA call pathchrcmp ; compare AL to path delimiter char - 25603 00002F5E 7504 jnz short TESTPMETA ; it's not a path delim - 25604 00002F60 FE06[B99D] inc byte [DestIsDir] - 25605 ; DestIsDir = 1, signalling path char - 25606 TESTPMETA: - 25607 00002F64 3C3F cmp al,'?' - 25608 00002F66 7505 jne short TESTPSTAR ; char is not '?' - 25609 00002F68 800E[BD9D]02 or byte [DestInfo],2 ; DestInfo = 2, signalling wildcard - 25610 TESTPSTAR: - 25611 00002F6D 3C2A cmp al,'*' - 25612 ;cmp al,[STAR] ; MSDOS 3.3 - 25613 00002F6F 7505 jne short TESTPDELIM ; char is not '*' - 25614 00002F71 800E[BD9D]02 or byte [DestInfo],2 ; DestInfo = 2, signalling wildcard - 25615 TESTPDELIM: - 25616 00002F76 E815FA call DELIM ; compare AL to all delimiters - 25617 00002F79 7406 jz short PATHDONEDEC ; delimiter found, back up & leave - 25618 00002F7B 3A06[F99B] cmp al,[SWITCHAR] - 25619 00002F7F 75C4 jne short SKIPPATH ; char isn't switch, go get next char - 25620 PATHDONEDEC: - 25621 00002F81 4E dec si ; SI = ptr to char after pathname - 25622 PATHDONE: - 25623 00002F82 30C0 xor al,al ; AL = NULL - 25624 00002F84 8604 xchg al,[si] ; place NULL after pathname - 25625 00002F86 46 inc si ; SI = ptr to byte after NULL - 25626 00002F87 3C0D cmp al,0Dh ; were we at end of line? - 25627 00002F89 7502 jne short NOPSTORE ; not EOL, finish up - 25628 00002F8B 8804 mov [si],al ; save EOL after NULL - 25629 NOPSTORE: - 25630 00002F8D 8936[8F9D] mov [PathPos],si ; PathPos = ptr to char after NULL - 25631 00002F91 890E[8D9D] mov [PathCnt],cx ; PathCnt = length of string left - 25632 SETPATH_RETN: - 25633 00002F95 C3 retn - 25634 - 25635 ; --------------------------------------------------------------------------- - 25636 - 25637 PGETARG: - 25638 00002F96 BE8000 mov si,80h - 25639 00002F99 AC lodsb - 25640 00002F9A 08C0 or al,al - 25641 00002F9C 74F7 jz short SETPATH_RETN - 25642 00002F9E E80300 call PSCANOFF - 25643 00002FA1 3C0D cmp al,0Dh - 25644 00002FA3 C3 retn - 25645 - 25646 ; --------------------------------------------------------------------------- - 25647 - 25648 PSCANOFF: - 25649 00002FA4 AC lodsb - 25650 00002FA5 E8E6F9 call DELIM - 25651 00002FA8 7504 jnz short PSCANOFFD - 25652 00002FAA 3C3B cmp al,';' ; 3Bh - 25653 00002FAC 75F6 jne short PSCANOFF ; ';' is not a delimiter - 25654 PSCANOFFD: - 25655 00002FAE 4E dec si ; Point to first non-delimiter - 25656 00002FAF C3 retn - 25657 - 25658 ; =============== S U B R O U T I N E ======================================= - 25659 - 25660 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25661 IOSET: - 25662 ; ALL REGISTERS PRESERVED - 25663 00002FB0 1E push ds - 25664 00002FB1 52 push dx - 25665 00002FB2 50 push ax - 25666 00002FB3 53 push bx - 25667 00002FB4 51 push cx - 25668 00002FB5 2E8E1E[F59B] mov ds,[cs:RESSEG] - 25669 00002FBA 803E[1303]00 cmp byte [PipeFlag],0 - 25670 00002FBF 750D jne short NOREDIR - 25671 00002FC1 F606[AA02]FF test byte [IfFlag],0FFh - 25672 00002FC6 7506 jnz short NOREDIR - 25673 00002FC8 E88C00 call TESTDOREIN - 25674 00002FCB E80600 call TESTDOREOUT - 25675 NOREDIR: - 25676 00002FCE 59 pop cx - 25677 00002FCF 5B pop bx - 25678 00002FD0 58 pop ax - 25679 00002FD1 5A pop dx - 25680 00002FD2 1F pop ds - 25681 IOSET_RETN: ; 06/08/2024 - 25682 00002FD3 C3 retn - 25683 - 25684 ; =============== S U B R O U T I N E ======================================= - 25685 - 25686 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25687 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CF3h + 25579 ; After Switch, SI has been scanned past any switches, and + 25580 ; switches that COMMAND intrinsically recognizes are recorded in AX. + 25581 + 25582 00002F3A A3[919D] mov [PathSw],ax ; PathSw = switch occurrence mask + 25583 00002F3D 5B pop bx ; BX = ptr to original string + 25584 00002F3E 29F3 sub bx,si ; BX = -(# chars scanned by Switch) + 25585 00002F40 59 pop cx ; CX = string length + 25586 00002F41 01D9 add cx,bx ; CX = string length from current SI + 25587 00002F43 89F2 mov dx,si ; DX = ptr to current string + 25588 SKIPPATH: + 25589 ; 26/02/2023 + 25590 ; MSDOS 6.0 + 25591 00002F45 C606[4F9F]00 mov byte [KPARSE],0 + 25592 SKIPPATH2: + 25593 00002F4A E336 jcxz PATHDONE ; string length is zero, we're done + 25594 00002F4C 49 dec cx ; CX = length left after next char + 25595 00002F4D AC lodsb ; AL = next char of string + 25596 ; SI = ptr to char after this one + 25597 ; 26/02/2023 + 25598 00002F4E E810F8 call testkanj + 25599 00002F51 7408 jz short TESTPPSEP + 25600 00002F53 49 dec cx + 25601 00002F54 46 inc si + 25602 00002F55 FE06[4F9F] inc byte [KPARSE] + 25603 00002F59 EBEF jmp short SKIPPATH2 + 25604 TESTPPSEP: + 25605 00002F5B E8B6FA call pathchrcmp ; compare AL to path delimiter char + 25606 00002F5E 7504 jnz short TESTPMETA ; it's not a path delim + 25607 00002F60 FE06[B99D] inc byte [DestIsDir] + 25608 ; DestIsDir = 1, signalling path char + 25609 TESTPMETA: + 25610 00002F64 3C3F cmp al,'?' + 25611 00002F66 7505 jne short TESTPSTAR ; char is not '?' + 25612 00002F68 800E[BD9D]02 or byte [DestInfo],2 ; DestInfo = 2, signalling wildcard + 25613 TESTPSTAR: + 25614 00002F6D 3C2A cmp al,'*' + 25615 ;cmp al,[STAR] ; MSDOS 3.3 + 25616 00002F6F 7505 jne short TESTPDELIM ; char is not '*' + 25617 00002F71 800E[BD9D]02 or byte [DestInfo],2 ; DestInfo = 2, signalling wildcard + 25618 TESTPDELIM: + 25619 00002F76 E815FA call DELIM ; compare AL to all delimiters + 25620 00002F79 7406 jz short PATHDONEDEC ; delimiter found, back up & leave + 25621 00002F7B 3A06[F99B] cmp al,[SWITCHAR] + 25622 00002F7F 75C4 jne short SKIPPATH ; char isn't switch, go get next char + 25623 PATHDONEDEC: + 25624 00002F81 4E dec si ; SI = ptr to char after pathname + 25625 PATHDONE: + 25626 00002F82 30C0 xor al,al ; AL = NULL + 25627 00002F84 8604 xchg al,[si] ; place NULL after pathname + 25628 00002F86 46 inc si ; SI = ptr to byte after NULL + 25629 00002F87 3C0D cmp al,0Dh ; were we at end of line? + 25630 00002F89 7502 jne short NOPSTORE ; not EOL, finish up + 25631 00002F8B 8804 mov [si],al ; save EOL after NULL + 25632 NOPSTORE: + 25633 00002F8D 8936[8F9D] mov [PathPos],si ; PathPos = ptr to char after NULL + 25634 00002F91 890E[8D9D] mov [PathCnt],cx ; PathCnt = length of string left + 25635 SETPATH_RETN: + 25636 00002F95 C3 retn + 25637 + 25638 ; --------------------------------------------------------------------------- + 25639 + 25640 PGETARG: + 25641 00002F96 BE8000 mov si,80h + 25642 00002F99 AC lodsb + 25643 00002F9A 08C0 or al,al + 25644 00002F9C 74F7 jz short SETPATH_RETN + 25645 00002F9E E80300 call PSCANOFF + 25646 00002FA1 3C0D cmp al,0Dh + 25647 00002FA3 C3 retn + 25648 + 25649 ; --------------------------------------------------------------------------- + 25650 + 25651 PSCANOFF: + 25652 00002FA4 AC lodsb + 25653 00002FA5 E8E6F9 call DELIM + 25654 00002FA8 7504 jnz short PSCANOFFD + 25655 00002FAA 3C3B cmp al,';' ; 3Bh + 25656 00002FAC 75F6 jne short PSCANOFF ; ';' is not a delimiter + 25657 PSCANOFFD: + 25658 00002FAE 4E dec si ; Point to first non-delimiter + 25659 00002FAF C3 retn + 25660 + 25661 ; =============== S U B R O U T I N E ======================================= + 25662 + 25663 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25664 IOSET: + 25665 ; ALL REGISTERS PRESERVED + 25666 00002FB0 1E push ds + 25667 00002FB1 52 push dx + 25668 00002FB2 50 push ax + 25669 00002FB3 53 push bx + 25670 00002FB4 51 push cx + 25671 00002FB5 2E8E1E[F59B] mov ds,[cs:RESSEG] + 25672 00002FBA 803E[1303]00 cmp byte [PipeFlag],0 + 25673 00002FBF 750D jne short NOREDIR + 25674 00002FC1 F606[AA02]FF test byte [IfFlag],0FFh + 25675 00002FC6 7506 jnz short NOREDIR + 25676 00002FC8 E88C00 call TESTDOREIN + 25677 00002FCB E80600 call TESTDOREOUT + 25678 NOREDIR: + 25679 00002FCE 59 pop cx + 25680 00002FCF 5B pop bx + 25681 00002FD0 58 pop ax + 25682 00002FD1 5A pop dx + 25683 00002FD2 1F pop ds + 25684 IOSET_RETN: ; 06/08/2024 + 25685 00002FD3 C3 retn + 25686 + 25687 ; =============== S U B R O U T I N E ======================================= 25688 - 25689 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 25690 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:313Dh - 25691 TESTDOREOUT: - 25692 00002FD4 803E[C202]00 cmp byte [Re_OutStr],0 - 25693 ;je short NOREOUT ; MSDOS 3.3 - 25694 ; 26/02/2023 - 25695 ;jne short REOUTEXISTS - 25696 ;jmp NOREOUT - 25697 ; 06/08/2024 - 25698 00002FD9 74F8 jz short IOSET_RETN - 25699 REOUTEXISTS: - 25700 00002FDB 803E[C102]00 cmp byte [Re_Out_App],0 - 25701 00002FE0 745D je short REOUTCRT - 25702 - 25703 00002FE2 BA[C202] mov dx,Re_OutStr - 25704 - 25705 ; 26/02/2023 - 25706 ; MSDOS 6.0 - 25707 ;mov ax,(OPEN SHL 8) OR 2 ;AC011; Open for read/write - 25708 00002FE5 B8023D mov ax,3D02h - 25709 ; MSDOS 3.3 - 25710 ;mov ax,(OPEN<<8)|1 ; 3D01h ; Open for write - 25711 - 25712 ; MSDOS 3.3 (& MSDOS 6.0) - 25713 00002FE8 50 push ax - 25714 00002FE9 CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 25715 ; DS:DX -> ASCIZ filename - 25716 ; AL = access mode - 25717 ; 1 - write - 25718 00002FEB 5B pop bx - 25719 00002FEC 724B jc short OpenWriteError - 25720 - 25721 ; 26/02/2023 - 25722 ; MSDOS 6.0 - 25723 00002FEE 89C3 mov bx,ax - 25724 ;mov ax,IOCTL<<8 ;AN035; Get attributes of handle - 25725 00002FF0 B80044 mov ax,4400h - 25726 00002FF3 CD21 int 21h ;AN035; - 25727 ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 25728 ; BX = file or device handle - 25729 00002FF5 F6C280 test dl,80h - 25730 ;test dl,devid_ISDEV ;AN035; Is it a device? - 25731 00002FF8 7554 jnz short SET_REOUT ;AN035; Yes, don't read from it - 25732 - 25733 ;mov ax,(LSEEK SHL 8) OR 2 - 25734 00002FFA B80242 mov ax,4202h - 25735 00002FFD B9FFFF mov cx,-1 ;AC011; MOVE TO EOF -1 - 25736 00003000 89CA mov dx,cx ;AC011; - 25737 00003002 CD21 int 21h - 25738 ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 25739 ; AL = method: offset from end of file - 25740 00003004 0E push cs ;AN011; Get transient seg to DS - 25741 00003005 1F pop ds ;AN011; - 25742 - 25743 ;mov ax,(READ SHL 8) ;AN011; Read one byte from the - 25744 00003006 B8003F mov ax,3F00h - 25745 00003009 B90100 mov cx,1 ;AN011; file into one_char_val - 25746 0000300C BA[B19D] mov dx,One_Char_Val ;AN011; - 25747 0000300F CD21 int 21h ;AN011; - 25748 ; DOS - 2+ - READ FROM FILE WITH HANDLE - 25749 ; BX = file handle, CX = number of bytes to read - 25750 ; DS:DX -> buffer - 25751 00003011 7226 jc short OpenWriteError ;AN011; If error, exit - 25752 00003013 39C8 cmp ax,cx ;AN017; Did we read 1 byte? - 25753 00003015 7517 jnz short reout_0_length ;AN017; No - file must be 0 length - 25754 - 25755 00003017 803E[B19D]1A cmp byte [One_Char_Val],1Ah ;AN011; Was char an eof mark? - 25756 0000301C 8E1E[F59B] mov ds,[RESSEG] ;AN011; Get resident segment back - 25757 00003020 752C jne short SET_REOUT ;AN011; No, just continue - 25758 - 25759 ;mov ax,(LSEEK<<8)|1 ;AN011; EOF mark found - 25760 00003022 B80142 mov ax,4201h - 25761 00003025 B9FFFF mov cx,-1 ;AN011; LSEEK back one byte - 25762 setreout_p: ; 26/02/2023 - 25763 00003028 89CA mov dx,cx ;AN011; - 25764 0000302A CD21 int 21h ;AN011; - 25765 0000302C EB20 jmp short SET_REOUT - 25766 reout_0_length: ;AN017; We have a 0 length file - 25767 ; ds = cs ; 26/02/2023 - 25768 ;mov ds,[cs:RESSEG] ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2D50h - 25769 ;AN017; Get resident segment back - 25770 ; 26/02/2023 - 25771 0000302E 8E1E[F59B] mov ds,[RESSEG] - 25772 ;mov ax,(LSEEK SHL 8) ;AN017; Move to beginning of file - 25773 00003032 B80042 mov ax,4200h - 25774 00003035 31C9 xor cx,cx ;AN017; Offset is 0 - 25775 ;mov dx,cx ;AN017; - 25776 ;int 21h ;AN017; - 25777 ;jmp short SET_REOUT ;AN017; now finish setting up redirection - 25778 ; 26/02/2023 - 25779 00003037 EBEF jmp short setreout_p - 25780 + 25689 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25690 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CF3h + 25691 + 25692 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 25693 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:313Dh + 25694 TESTDOREOUT: + 25695 00002FD4 803E[C202]00 cmp byte [Re_OutStr],0 + 25696 ;je short NOREOUT ; MSDOS 3.3 + 25697 ; 26/02/2023 + 25698 ;jne short REOUTEXISTS + 25699 ;jmp NOREOUT + 25700 ; 06/08/2024 + 25701 00002FD9 74F8 jz short IOSET_RETN + 25702 REOUTEXISTS: + 25703 00002FDB 803E[C102]00 cmp byte [Re_Out_App],0 + 25704 00002FE0 745D je short REOUTCRT + 25705 + 25706 00002FE2 BA[C202] mov dx,Re_OutStr + 25707 + 25708 ; 26/02/2023 + 25709 ; MSDOS 6.0 + 25710 ;mov ax,(OPEN SHL 8) OR 2 ;AC011; Open for read/write + 25711 00002FE5 B8023D mov ax,3D02h + 25712 ; MSDOS 3.3 + 25713 ;mov ax,(OPEN<<8)|1 ; 3D01h ; Open for write + 25714 + 25715 ; MSDOS 3.3 (& MSDOS 6.0) + 25716 00002FE8 50 push ax + 25717 00002FE9 CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 25718 ; DS:DX -> ASCIZ filename + 25719 ; AL = access mode + 25720 ; 1 - write + 25721 00002FEB 5B pop bx + 25722 00002FEC 724B jc short OpenWriteError + 25723 + 25724 ; 26/02/2023 + 25725 ; MSDOS 6.0 + 25726 00002FEE 89C3 mov bx,ax + 25727 ;mov ax,IOCTL<<8 ;AN035; Get attributes of handle + 25728 00002FF0 B80044 mov ax,4400h + 25729 00002FF3 CD21 int 21h ;AN035; + 25730 ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 25731 ; BX = file or device handle + 25732 00002FF5 F6C280 test dl,80h + 25733 ;test dl,devid_ISDEV ;AN035; Is it a device? + 25734 00002FF8 7554 jnz short SET_REOUT ;AN035; Yes, don't read from it + 25735 + 25736 ;mov ax,(LSEEK SHL 8) OR 2 + 25737 00002FFA B80242 mov ax,4202h + 25738 00002FFD B9FFFF mov cx,-1 ;AC011; MOVE TO EOF -1 + 25739 00003000 89CA mov dx,cx ;AC011; + 25740 00003002 CD21 int 21h + 25741 ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 25742 ; AL = method: offset from end of file + 25743 00003004 0E push cs ;AN011; Get transient seg to DS + 25744 00003005 1F pop ds ;AN011; + 25745 + 25746 ;mov ax,(READ SHL 8) ;AN011; Read one byte from the + 25747 00003006 B8003F mov ax,3F00h + 25748 00003009 B90100 mov cx,1 ;AN011; file into one_char_val + 25749 0000300C BA[B19D] mov dx,One_Char_Val ;AN011; + 25750 0000300F CD21 int 21h ;AN011; + 25751 ; DOS - 2+ - READ FROM FILE WITH HANDLE + 25752 ; BX = file handle, CX = number of bytes to read + 25753 ; DS:DX -> buffer + 25754 00003011 7226 jc short OpenWriteError ;AN011; If error, exit + 25755 00003013 39C8 cmp ax,cx ;AN017; Did we read 1 byte? + 25756 00003015 7517 jnz short reout_0_length ;AN017; No - file must be 0 length + 25757 + 25758 00003017 803E[B19D]1A cmp byte [One_Char_Val],1Ah ;AN011; Was char an eof mark? + 25759 0000301C 8E1E[F59B] mov ds,[RESSEG] ;AN011; Get resident segment back + 25760 00003020 752C jne short SET_REOUT ;AN011; No, just continue + 25761 + 25762 ;mov ax,(LSEEK<<8)|1 ;AN011; EOF mark found + 25763 00003022 B80142 mov ax,4201h + 25764 00003025 B9FFFF mov cx,-1 ;AN011; LSEEK back one byte + 25765 setreout_p: ; 26/02/2023 + 25766 00003028 89CA mov dx,cx ;AN011; + 25767 0000302A CD21 int 21h ;AN011; + 25768 0000302C EB20 jmp short SET_REOUT + 25769 reout_0_length: ;AN017; We have a 0 length file + 25770 ; ds = cs ; 26/02/2023 + 25771 ;mov ds,[cs:RESSEG] ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2D50h + 25772 ;AN017; Get resident segment back + 25773 ; 26/02/2023 + 25774 0000302E 8E1E[F59B] mov ds,[RESSEG] + 25775 ;mov ax,(LSEEK SHL 8) ;AN017; Move to beginning of file + 25776 00003032 B80042 mov ax,4200h + 25777 00003035 31C9 xor cx,cx ;AN017; Offset is 0 + 25778 ;mov dx,cx ;AN017; + 25779 ;int 21h ;AN017; + 25780 ;jmp short SET_REOUT ;AN017; now finish setting up redirection 25781 ; 26/02/2023 - 25782 ; MSDOS 3.3 - 25783 ;xor dx,dx - 25784 ;xor cx,cx - 25785 ;mov bx,ax - 25786 ;mov ax,(LSEEK<<8)|2 ; 4202h - 25787 ;int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 25788 ; ; AL = method: offset from end of file - 25789 ;jmp short SET_REOUT - 25790 - 25791 ; MSDOS 3.3 (& MSDOS 6.0) - 25792 OpenWriteError: - 25793 ;cmp ax,5 - 25794 00003039 83F805 cmp ax,ERROR_ACCESS_DENIED - 25795 0000303C F9 stc - 25796 ;;je short REDIRERR ; MSDOS 3.3 - 25797 ; 26/02/2023 - 25798 ;jnz short REOUTCRT - 25799 ;jmp REDIRERR - 25800 0000303D 743B je short REDIRERR - 25801 - 25802 REOUTCRT: - 25803 0000303F BA[C202] mov dx,Re_OutStr - 25804 00003042 31C9 xor cx,cx - 25805 ;mov ah,CREAT ; 3Ch - 25806 00003044 B43C mov ah,3Ch - 25807 00003046 50 push ax - 25808 00003047 CD21 int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) - 25809 ; CX = attributes for file - 25810 ; DS:DX -> ASCIZ filename (may include drive and path) - 25811 00003049 5B pop bx - 25812 ;jc short REDIRERR ; MSDOS 3.3 - 25813 ; 26/02/2023 - 25814 ;jnc short NOREDIRERR - 25815 ;jmp REDIRERR - 25816 0000304A 722E jc short REDIRERR - 25817 - 25818 NOREDIRERR: - 25819 0000304C 89C3 mov bx,ax - 25820 SET_REOUT: - 25821 - 25822 ; Mega sleaze!! We move the SFN from the new handle spot into the old stdout - 25823 ; spot. We invalidate the new JFN we got. + 25782 00003037 EBEF jmp short setreout_p + 25783 + 25784 ; 26/02/2023 + 25785 ; MSDOS 3.3 + 25786 ;xor dx,dx + 25787 ;xor cx,cx + 25788 ;mov bx,ax + 25789 ;mov ax,(LSEEK<<8)|2 ; 4202h + 25790 ;int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 25791 ; ; AL = method: offset from end of file + 25792 ;jmp short SET_REOUT + 25793 + 25794 ; MSDOS 3.3 (& MSDOS 6.0) + 25795 OpenWriteError: + 25796 ;cmp ax,5 + 25797 00003039 83F805 cmp ax,ERROR_ACCESS_DENIED + 25798 0000303C F9 stc + 25799 ;;je short REDIRERR ; MSDOS 3.3 + 25800 ; 26/02/2023 + 25801 ;jnz short REOUTCRT + 25802 ;jmp REDIRERR + 25803 0000303D 743B je short REDIRERR + 25804 + 25805 REOUTCRT: + 25806 0000303F BA[C202] mov dx,Re_OutStr + 25807 00003042 31C9 xor cx,cx + 25808 ;mov ah,CREAT ; 3Ch + 25809 00003044 B43C mov ah,3Ch + 25810 00003046 50 push ax + 25811 00003047 CD21 int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) + 25812 ; CX = attributes for file + 25813 ; DS:DX -> ASCIZ filename (may include drive and path) + 25814 00003049 5B pop bx + 25815 ;jc short REDIRERR ; MSDOS 3.3 + 25816 ; 26/02/2023 + 25817 ;jnc short NOREDIRERR + 25818 ;jmp REDIRERR + 25819 0000304A 722E jc short REDIRERR + 25820 + 25821 NOREDIRERR: + 25822 0000304C 89C3 mov bx,ax + 25823 SET_REOUT: 25824 - 25825 0000304E B0FF mov al,0FFh - 25826 ;xchg al,[bx+18h] - 25827 00003050 864718 xchg al,[bx+PDB.JFN_TABLE] - 25828 00003053 A21900 mov [PDB.JFN_TABLE+1],al - 25829 NOREOUT: ; 06/08/2024 - 25830 00003056 C3 retn - 25831 - 25832 ; =============== S U B R O U T I N E ======================================= - 25833 - 25834 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25835 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CABh + 25825 ; Mega sleaze!! We move the SFN from the new handle spot into the old stdout + 25826 ; spot. We invalidate the new JFN we got. + 25827 + 25828 0000304E B0FF mov al,0FFh + 25829 ;xchg al,[bx+18h] + 25830 00003050 864718 xchg al,[bx+PDB.JFN_TABLE] + 25831 00003053 A21900 mov [PDB.JFN_TABLE+1],al + 25832 NOREOUT: ; 06/08/2024 + 25833 00003056 C3 retn + 25834 + 25835 ; =============== S U B R O U T I N E ======================================= 25836 - 25837 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 25838 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:30F5h - 25839 TESTDOREIN: - 25840 00003057 2E803E[A09B]00 cmp byte [cs:RE_INSTR],0 - 25841 ;jz short IOSET_RETN - 25842 ; 06/08/2024 - 25843 0000305D 74F7 jz short NOREOUT - 25844 0000305F 1E push ds - 25845 00003060 0E push cs - 25846 00003061 1F pop ds - 25847 00003062 BA[A09B] mov dx,RE_INSTR - 25848 ;;mov ax,OPEN*256 ; 3D00h - 25849 ;mov ax,3D00h - 25850 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 25851 ;mov ax,(OPEN*256)+SHARING_DENY_NONE - 25852 00003065 B8403D mov ax,3D40h - 25853 00003068 89C3 mov bx,ax - 25854 0000306A CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 25855 ; DS:DX -> ASCIZ filename - 25856 ; AL = access mode - 25857 ; 0 - read - 25858 0000306C 1F pop ds - 25859 - 25860 0000306D 720B jc short REDIRERR - 25861 - 25862 0000306F 89C3 mov bx,ax - 25863 00003071 B0FF mov al,0FFh + 25837 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25838 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CABh + 25839 + 25840 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 25841 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:30F5h + 25842 TESTDOREIN: + 25843 00003057 2E803E[A09B]00 cmp byte [cs:RE_INSTR],0 + 25844 ;jz short IOSET_RETN + 25845 ; 06/08/2024 + 25846 0000305D 74F7 jz short NOREOUT + 25847 0000305F 1E push ds + 25848 00003060 0E push cs + 25849 00003061 1F pop ds + 25850 00003062 BA[A09B] mov dx,RE_INSTR + 25851 ;;mov ax,OPEN*256 ; 3D00h + 25852 ;mov ax,3D00h + 25853 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 25854 ;mov ax,(OPEN*256)+SHARING_DENY_NONE + 25855 00003065 B8403D mov ax,3D40h + 25856 00003068 89C3 mov bx,ax + 25857 0000306A CD21 int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 25858 ; DS:DX -> ASCIZ filename + 25859 ; AL = access mode + 25860 ; 0 - read + 25861 0000306C 1F pop ds + 25862 + 25863 0000306D 720B jc short REDIRERR 25864 - 25865 ; Mega sleaze!! We move the SFN from the new handle spot into the old stdin - 25866 ; spot. We invalidate the new JFN we got. + 25865 0000306F 89C3 mov bx,ax + 25866 00003071 B0FF mov al,0FFh 25867 - 25868 ;xchg al,[bx+18h] - 25869 00003073 864718 xchg al,[bx+PDB.JFN_TABLE] - 25870 00003076 A21800 mov [PDB.JFN_TABLE],al - 25871 00003079 C3 retn - 25872 - 25873 ; --------------------------------------------------------------------------- - 25874 - 25875 ; We had some kind of error on the redirection. Figure out what the - 25876 ; appropriate message should be; BX has the system call that failed + 25868 ; Mega sleaze!! We move the SFN from the new handle spot into the old stdin + 25869 ; spot. We invalidate the new JFN we got. + 25870 + 25871 ;xchg al,[bx+18h] + 25872 00003073 864718 xchg al,[bx+PDB.JFN_TABLE] + 25873 00003076 A21800 mov [PDB.JFN_TABLE],al + 25874 00003079 C3 retn + 25875 + 25876 ; --------------------------------------------------------------------------- 25877 - 25878 REDIRERR: - 25879 0000307A 0E push cs - 25880 0000307B 1F pop ds - 25881 0000307C E82E00 call TriageError ; MSDOS 6.0 - 25882 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 - 25883 - 25884 ; At this point, we have recognized the network-generated access denied error. - 25885 ; The correct message is in DX + 25878 ; We had some kind of error on the redirection. Figure out what the + 25879 ; appropriate message should be; BX has the system call that failed + 25880 + 25881 REDIRERR: + 25882 0000307A 0E push cs + 25883 0000307B 1F pop ds + 25884 0000307C E82E00 call TriageError ; MSDOS 6.0 + 25885 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 25886 - 25887 0000307F 83F841 cmp ax,65 - 25888 00003082 7408 je short _CERRORJ ;AC000; just issue message returned - 25889 00003084 80FF3D cmp bh,OPEN ; 3Dh - 25890 00003087 7406 je short OpenError - 25891 00003089 BA[F18F] mov dx,FULLDIR_PTR - 25892 _CERRORJ: - 25893 0000308C E997FC jmp cerror - 25894 - 25895 OpenError: - 25896 ; The system call was an OPEN. Report either file not found or path not found. + 25887 ; At this point, we have recognized the network-generated access denied error. + 25888 ; The correct message is in DX + 25889 + 25890 0000307F 83F841 cmp ax,65 + 25891 00003082 7408 je short _CERRORJ ;AC000; just issue message returned + 25892 00003084 80FF3D cmp bh,OPEN ; 3Dh + 25893 00003087 7406 je short OpenError + 25894 00003089 BA[F18F] mov dx,FULLDIR_PTR + 25895 _CERRORJ: + 25896 0000308C E997FC jmp cerror 25897 - 25898 ; 26/02/2023 - 25899 ; MSDOS 6.0 - 25900 ;mov byte [cs:msg_disp_class],1 - 25901 0000308F 2EC606[D58F]01 mov byte [cs:msg_disp_class],ext_msg_class - 25902 ;AN000; set up extended error msg class - 25903 00003095 BA[D78F] mov dx,extend_buf_ptr - 25904 ;AC000; get extended message pointer - 25905 00003098 2EA3[D78F] mov [cs:extend_buf_ptr],ax - 25906 ;AN000; get message number in control block - 25907 0000309C E987FC jmp cerror - 25908 - 25909 ; 26/02/2023 - 25910 ; MSDOS 3.3 - 25911 ;mov dx,FNOTFOUNDPTR - 25912 ;;cmp ax,2 - 25913 ;cmp ax,ERROR_FILE_NOT_FOUND - 25914 ;je short _CERRORJ - 25915 ;mov dx,ACCDENPTR - 25916 ;;cmp ax,5 ; Access denied error - 25917 ;cmp ax,ERROR_ACCESS_DENIED - 25918 ;je short _CERRORJ - 25919 ; ; ERROR_PATH_NOT_FOUND - 25920 ;mov dx,PNOTFOUNDPTR - 25921 ;jmp CERROR - 25922 - 25923 ; =============== S U B R O U T I N E ======================================= - 25924 - 25925 ; Compute length of string (including NUL) in DS:SI into CX. Change no other - 25926 ; registers + 25898 OpenError: + 25899 ; The system call was an OPEN. Report either file not found or path not found. + 25900 + 25901 ; 26/02/2023 + 25902 ; MSDOS 6.0 + 25903 ;mov byte [cs:msg_disp_class],1 + 25904 0000308F 2EC606[D58F]01 mov byte [cs:msg_disp_class],ext_msg_class + 25905 ;AN000; set up extended error msg class + 25906 00003095 BA[D78F] mov dx,extend_buf_ptr + 25907 ;AC000; get extended message pointer + 25908 00003098 2EA3[D78F] mov [cs:extend_buf_ptr],ax + 25909 ;AN000; get message number in control block + 25910 0000309C E987FC jmp cerror + 25911 + 25912 ; 26/02/2023 + 25913 ; MSDOS 3.3 + 25914 ;mov dx,FNOTFOUNDPTR + 25915 ;;cmp ax,2 + 25916 ;cmp ax,ERROR_FILE_NOT_FOUND + 25917 ;je short _CERRORJ + 25918 ;mov dx,ACCDENPTR + 25919 ;;cmp ax,5 ; Access denied error + 25920 ;cmp ax,ERROR_ACCESS_DENIED + 25921 ;je short _CERRORJ + 25922 ; ; ERROR_PATH_NOT_FOUND + 25923 ;mov dx,PNOTFOUNDPTR + 25924 ;jmp CERROR + 25925 + 25926 ; =============== S U B R O U T I N E ======================================= 25927 - 25928 ; 26/02/2023 - Retro DOS v4.0 COMMAND.COM - 25929 dstrlen: - 25930 0000309F 50 push ax - 25931 000030A0 31C9 xor cx,cx - 25932 000030A2 FC cld - 25933 dloop: - 25934 000030A3 AC lodsb - 25935 000030A4 41 inc cx - 25936 000030A5 08C0 or al,al - 25937 000030A7 75FA jnz short dloop - 25938 000030A9 29CE sub si,cx - 25939 000030AB 58 pop ax - 25940 TRIAGEERR_RETN: - 25941 000030AC C3 retn - 25942 - 25943 ; =============== S U B R O U T I N E ======================================= - 25944 - 25945 ;Break - 25946 - 25947 TriageError: ; MSDOS 6.0 - 25948 - 25949 ; TriageError will examine the return from a carry-set system call and - 25950 ; return the correct error if applicable. - 25951 ; - 25952 ; Inputs: outputs from a carry-settable system call - 25953 ; No system calls may be done in the interrim - 25954 ; Outputs: If carry was set on input - 25955 ; carry set on output - 25956 ; DX contains trangroup offset to printf message - 25957 ; else - 25958 ; No registers changed - 25959 - 25960 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1EEEh - 25961 - 25962 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 25963 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2D92h + 25928 ; Compute length of string (including NUL) in DS:SI into CX. Change no other + 25929 ; registers + 25930 + 25931 ; 26/02/2023 - Retro DOS v4.0 COMMAND.COM + 25932 dstrlen: + 25933 0000309F 50 push ax + 25934 000030A0 31C9 xor cx,cx + 25935 000030A2 FC cld + 25936 dloop: + 25937 000030A3 AC lodsb + 25938 000030A4 41 inc cx + 25939 000030A5 08C0 or al,al + 25940 000030A7 75FA jnz short dloop + 25941 000030A9 29CE sub si,cx + 25942 000030AB 58 pop ax + 25943 TRIAGEERR_RETN: + 25944 000030AC C3 retn + 25945 + 25946 ; =============== S U B R O U T I N E ======================================= + 25947 + 25948 ;Break + 25949 + 25950 TriageError: ; MSDOS 6.0 + 25951 + 25952 ; TriageError will examine the return from a carry-set system call and + 25953 ; return the correct error if applicable. + 25954 ; + 25955 ; Inputs: outputs from a carry-settable system call + 25956 ; No system calls may be done in the interrim + 25957 ; Outputs: If carry was set on input + 25958 ; carry set on output + 25959 ; DX contains trangroup offset to printf message + 25960 ; else + 25961 ; No registers changed + 25962 + 25963 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1EEEh 25964 - 25965 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 25966 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 333Ch + 25965 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 25966 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2D92h 25967 - 25968 GET_EXT_ERR_NUMBER: ; MSDOS 3.3 - 25969 000030AD 73FD jnc short TRIAGEERR_RETN ; no carry => do nothing... - 25970 000030AF 9C pushf - 25971 000030B0 53 push bx - 25972 000030B1 51 push cx - 25973 000030B2 56 push si - 25974 000030B3 57 push di - 25975 000030B4 55 push bp - 25976 000030B5 06 push es - 25977 000030B6 1E push ds - 25978 000030B7 50 push ax - 25979 000030B8 52 push dx - 25980 000030B9 B459 mov ah,59h - 25981 ;mov ah,GETEXTENDEDERROR - 25982 000030BB CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE - 25983 ; BX = version code (0000h for DOS 3.x) - 25984 000030BD 59 pop cx - 25985 000030BE 5B pop bx ; restore original AX - 25986 000030BF BA[0090] mov dx,ACCDEN_PTR - 25987 000030C2 83F841 cmp ax,65 ; network access denied? - 25988 000030C5 7404 je short NoMove ; Yes, return it. - 25989 000030C7 89D8 mov ax,bx - 25990 000030C9 89CA mov dx,cx - 25991 NoMove: - 25992 000030CB 1F pop ds - 25993 000030CC 07 pop es - 25994 000030CD 5D pop bp - 25995 000030CE 5F pop di - 25996 000030CF 5E pop si - 25997 000030D0 59 pop cx - 25998 000030D1 5B pop bx - 25999 000030D2 9D popf - 26000 000030D3 C3 retn - 26001 - 26002 ; =============== S U B R O U T I N E ======================================= - 26003 - 26004 ; Far call from resident portion/segment of COMMAND.COM - 26005 - 26006 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1F15h - 26007 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2DB9h - 26008 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3363h - 26009 - 26010 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26011 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26012 Triage_Init: - 26013 000030D4 E8D6FF call TriageError ; MSDOS 6.0 - 26014 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 - 26015 000030D7 CB retf - 26016 - 26017 ; =============== S U B R O U T I N E ======================================= - 26018 - 26019 ; MSDOS 6.0 - 26020 - 26021 ; **************************************************************** - 26022 ; * - 26023 ; * ROUTINE: MOVE_TO_SRCBUF - 26024 ; * - 26025 ; * FUNCTION: Move ASCIIZ string from DS:SI to SRCBUF. Change - 26026 ; * terminating 0 to 0dH. Set PATHCNT to length of - 26027 ; * string. Set PATHPOS to start of SRCBUF. - 26028 ; * - 26029 ; * INPUT: DS:SI points to ASCIIZ string - 26030 ; * ES points to TRANGROUP + 25968 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 25969 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 333Ch + 25970 + 25971 GET_EXT_ERR_NUMBER: ; MSDOS 3.3 + 25972 000030AD 73FD jnc short TRIAGEERR_RETN ; no carry => do nothing... + 25973 000030AF 9C pushf + 25974 000030B0 53 push bx + 25975 000030B1 51 push cx + 25976 000030B2 56 push si + 25977 000030B3 57 push di + 25978 000030B4 55 push bp + 25979 000030B5 06 push es + 25980 000030B6 1E push ds + 25981 000030B7 50 push ax + 25982 000030B8 52 push dx + 25983 000030B9 B459 mov ah,59h + 25984 ;mov ah,GETEXTENDEDERROR + 25985 000030BB CD21 int 21h ; DOS - 3+ - GET EXTENDED ERROR CODE + 25986 ; BX = version code (0000h for DOS 3.x) + 25987 000030BD 59 pop cx + 25988 000030BE 5B pop bx ; restore original AX + 25989 000030BF BA[0090] mov dx,ACCDEN_PTR + 25990 000030C2 83F841 cmp ax,65 ; network access denied? + 25991 000030C5 7404 je short NoMove ; Yes, return it. + 25992 000030C7 89D8 mov ax,bx + 25993 000030C9 89CA mov dx,cx + 25994 NoMove: + 25995 000030CB 1F pop ds + 25996 000030CC 07 pop es + 25997 000030CD 5D pop bp + 25998 000030CE 5F pop di + 25999 000030CF 5E pop si + 26000 000030D0 59 pop cx + 26001 000030D1 5B pop bx + 26002 000030D2 9D popf + 26003 000030D3 C3 retn + 26004 + 26005 ; =============== S U B R O U T I N E ======================================= + 26006 + 26007 ; Far call from resident portion/segment of COMMAND.COM + 26008 + 26009 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1F15h + 26010 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2DB9h + 26011 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3363h + 26012 + 26013 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26014 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26015 Triage_Init: + 26016 000030D4 E8D6FF call TriageError ; MSDOS 6.0 + 26017 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 + 26018 000030D7 CB retf + 26019 + 26020 ; =============== S U B R O U T I N E ======================================= + 26021 + 26022 ; MSDOS 6.0 + 26023 + 26024 ; **************************************************************** + 26025 ; * + 26026 ; * ROUTINE: MOVE_TO_SRCBUF + 26027 ; * + 26028 ; * FUNCTION: Move ASCIIZ string from DS:SI to SRCBUF. Change + 26029 ; * terminating 0 to 0dH. Set PATHCNT to length of + 26030 ; * string. Set PATHPOS to start of SRCBUF. 26031 ; * - 26032 ; * OUTPUT: SRCBUF filled in with string terminated by 0dH - 26033 ; * PATHCNT set to length of string - 26034 ; * PATHPOS set to start of SRCBUF - 26035 ; * CX,AX changed - 26036 ; * - 26037 ; **************************************************************** - 26038 - 26039 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26040 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CABh - 26041 Move_To_SrcBuf: - 26042 000030D8 56 push si ;AN000; save si,di - 26043 000030D9 57 push di ;AN000; - 26044 000030DA 51 push cx ;AN000; - 26045 000030DB BF[219E] mov di,SrcBuf ;AN000; set ES:DI to srcbuf - 26046 000030DE 31C9 xor cx,cx ;AN000; clear cx for counint - 26047 000030E0 89C8 mov ax,cx ;AN000; clear ax - 26048 000030E2 57 push di ;AN000; save start of srcbuf - 26049 000030E3 AC lodsb ;AN000; get a character from DS:SI - 26050 mts_get_chars: ;AN000; - 26051 ;cmp al,0 ;AN000; was it a null char? - 26052 000030E4 20C0 and al,al ; al = 0 ? - 26053 000030E6 7405 jz short mts_end_string ;AN000; yes - exit - 26054 000030E8 AA stosb ;AN000; no - store it in srcbuf - 26055 000030E9 41 inc cx ;AN000; increment length count - 26056 000030EA AC lodsb ;AN000; get a character from DS:SI - 26057 000030EB EBF7 jmp short mts_get_chars ;AN000; go check it - 26058 mts_end_string: ;AN000; we've reached the end of line - 26059 ;mov al,END_OF_LINE_IN ;AN000; store 0Dh in srcbuf - 26060 000030ED B00D mov al,0Dh - 26061 000030EF AA stosb ;AN000; - 26062 000030F0 5F pop di ;AN000; restore start of srcbuf - 26063 000030F1 0E push cs ;AN000; set DS to local segment - 26064 000030F2 1F pop ds ;AN000; - 26065 000030F3 890E[8D9D] mov [PathCnt],cx ;AN000; set patchcnt to length count - 26066 000030F7 893E[8F9D] mov [PathPos],di ;AN000; set pathpos to start of srcbuf - 26067 000030FB 59 pop cx ;AN000; restore cx,di,si - 26068 000030FC 5F pop di ;AN000; - 26069 000030FD 5E pop si ;AN000; - 26070 000030FE C3 retn ;AN000; exit - 26071 - 26072 ;============================================================================ - 26073 ; TPIPE.ASM, MSDOS 6.0, 1991 - 26074 ;============================================================================ - 26075 ; 03/10/2018 - Retro DOS v3.0 - 26076 - 26077 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1F19h - 26078 - 26079 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26080 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2DE4h + 26032 ; * INPUT: DS:SI points to ASCIIZ string + 26033 ; * ES points to TRANGROUP + 26034 ; * + 26035 ; * OUTPUT: SRCBUF filled in with string terminated by 0dH + 26036 ; * PATHCNT set to length of string + 26037 ; * PATHPOS set to start of SRCBUF + 26038 ; * CX,AX changed + 26039 ; * + 26040 ; **************************************************************** + 26041 + 26042 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26043 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2CABh + 26044 Move_To_SrcBuf: + 26045 000030D8 56 push si ;AN000; save si,di + 26046 000030D9 57 push di ;AN000; + 26047 000030DA 51 push cx ;AN000; + 26048 000030DB BF[219E] mov di,SrcBuf ;AN000; set ES:DI to srcbuf + 26049 000030DE 31C9 xor cx,cx ;AN000; clear cx for counint + 26050 000030E0 89C8 mov ax,cx ;AN000; clear ax + 26051 000030E2 57 push di ;AN000; save start of srcbuf + 26052 000030E3 AC lodsb ;AN000; get a character from DS:SI + 26053 mts_get_chars: ;AN000; + 26054 ;cmp al,0 ;AN000; was it a null char? + 26055 000030E4 20C0 and al,al ; al = 0 ? + 26056 000030E6 7405 jz short mts_end_string ;AN000; yes - exit + 26057 000030E8 AA stosb ;AN000; no - store it in srcbuf + 26058 000030E9 41 inc cx ;AN000; increment length count + 26059 000030EA AC lodsb ;AN000; get a character from DS:SI + 26060 000030EB EBF7 jmp short mts_get_chars ;AN000; go check it + 26061 mts_end_string: ;AN000; we've reached the end of line + 26062 ;mov al,END_OF_LINE_IN ;AN000; store 0Dh in srcbuf + 26063 000030ED B00D mov al,0Dh + 26064 000030EF AA stosb ;AN000; + 26065 000030F0 5F pop di ;AN000; restore start of srcbuf + 26066 000030F1 0E push cs ;AN000; set DS to local segment + 26067 000030F2 1F pop ds ;AN000; + 26068 000030F3 890E[8D9D] mov [PathCnt],cx ;AN000; set patchcnt to length count + 26069 000030F7 893E[8F9D] mov [PathPos],di ;AN000; set pathpos to start of srcbuf + 26070 000030FB 59 pop cx ;AN000; restore cx,di,si + 26071 000030FC 5F pop di ;AN000; + 26072 000030FD 5E pop si ;AN000; + 26073 000030FE C3 retn ;AN000; exit + 26074 + 26075 ;============================================================================ + 26076 ; TPIPE.ASM, MSDOS 6.0, 1991 + 26077 ;============================================================================ + 26078 ; 03/10/2018 - Retro DOS v3.0 + 26079 + 26080 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 1F19h 26081 - 26082 ; =============== S U B R O U T I N E ======================================= - 26083 - 26084 ; 26/02/2023 - 26085 SINGLETEST: - 26086 000030FF 1E push ds - 26087 00003100 2E8E1E[F59B] mov ds,[cs:RESSEG] - 26088 00003105 833E[A502]00 cmp word [SingleCom],0 - 26089 0000310A 7406 jz short TESTDONE - 26090 0000310C 813E[A502]FFEF cmp word [SingleCom],0EFFFh - 26091 TESTDONE: - 26092 00003112 1F pop ds - 26093 00003113 C3 retn - 26094 - 26095 ; =============== S U B R O U T I N E ======================================= - 26096 - 26097 ; 26/02/2023 - 26098 SetRest1: - 26099 00003114 B001 mov al,1 - 26100 - 26101 ; --------------------------------------------------------------------------- - 26102 - 26103 SETREST: - 26104 00003116 1E push ds - 26105 00003117 8E1E[F59B] mov ds,[RESSEG] - 26106 0000311B A2[A102] mov [RestDir],al - 26107 0000311E 1F pop ds - 26108 0000311F C3 retn - 26109 - 26110 ; =============== S U B R O U T I N E ======================================= - 26111 - 26112 ; Note that we need to handle the same thing that RestDir handles: the - 26113 ; requirement that we try only once to restore the user's environment after - 26114 ; and INT 24 or the like. If the condition that causes the INT 24 does not - 26115 ; disappear, we just give up. - 26116 - 26117 ; 26/02/2023 - Retro DOS v4.0 COMMAND.COM - 26118 ; - 26119 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26120 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33AFh + 26082 ; 26/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26083 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 2DE4h + 26084 + 26085 ; =============== S U B R O U T I N E ======================================= + 26086 + 26087 ; 26/02/2023 + 26088 SINGLETEST: + 26089 000030FF 1E push ds + 26090 00003100 2E8E1E[F59B] mov ds,[cs:RESSEG] + 26091 00003105 833E[A502]00 cmp word [SingleCom],0 + 26092 0000310A 7406 jz short TESTDONE + 26093 0000310C 813E[A502]FFEF cmp word [SingleCom],0EFFFh + 26094 TESTDONE: + 26095 00003112 1F pop ds + 26096 00003113 C3 retn + 26097 + 26098 ; =============== S U B R O U T I N E ======================================= + 26099 + 26100 ; 26/02/2023 + 26101 SetRest1: + 26102 00003114 B001 mov al,1 + 26103 + 26104 ; --------------------------------------------------------------------------- + 26105 + 26106 SETREST: + 26107 00003116 1E push ds + 26108 00003117 8E1E[F59B] mov ds,[RESSEG] + 26109 0000311B A2[A102] mov [RestDir],al + 26110 0000311E 1F pop ds + 26111 0000311F C3 retn + 26112 + 26113 ; =============== S U B R O U T I N E ======================================= + 26114 + 26115 ; Note that we need to handle the same thing that RestDir handles: the + 26116 ; requirement that we try only once to restore the user's environment after + 26117 ; and INT 24 or the like. If the condition that causes the INT 24 does not + 26118 ; disappear, we just give up. + 26119 + 26120 ; 26/02/2023 - Retro DOS v4.0 COMMAND.COM 26121 ; - 26122 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 26123 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:324Fh - 26124 PIPEDEL: - 26125 00003120 1E push ds - 26126 00003121 52 push dx - 26127 00003122 2E8E1E[F59B] mov ds,[cs:RESSEG] - 26128 ;;;mov dx,320h ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2E0Ch - 26129 ;;mov dx,3EAh ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33B1h - 26130 ;mov dx,41Eh ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3256h - 26131 ; Pipe1 = offset RESGROUP:EndInit - 26132 00003127 BA[1503] mov dx,Pipe1 ; Clean up in case ^C - 26133 ;mov ah,Unlink ; 41h - 26134 0000312A B441 mov ah,41h - 26135 ;int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) - 26136 ; DS:DX -> ASCIZ pathname of file to delete - 26137 ; (no wildcards allowed) - 26138 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26139 0000312C E88BD4 call int_21h_indirect - 26140 - 26141 ;;;mov dx,36Fh ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2E13h - 26142 ;;mov dx,439h ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33BDh - 26143 ;mov dx,46Dh ; PCDOS 7.1 COMMAND.COM - TRANGROUP:325Eh - 26144 ; Pipe2 = offset RESGROUP:EndInit+79 - 26145 0000312F BA[6403] mov dx,Pipe2 - 26146 ;mov ah,Unlink ; 41h - 26147 00003132 B441 mov ah,41h - 26148 ;int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) - 26149 ; DS:DX -> ASCIZ pathname of file to delete - 26150 ; (no wildcards allowed) - 26151 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26152 00003134 E883D4 call int_21h_indirect - 26153 00003137 5A pop dx - 26154 00003138 E86C02 call PipeOff - 26155 0000313B C606[1403]00 mov byte [PipeFiles],0 - 26156 00003140 1F pop ds - 26157 00003141 C3 retn - 26158 - 26159 ; --------------------------------------------------------------------------- - 26160 - 26161 ; 26/02/2023 - 26162 PIPEERRSYN: - 26163 00003142 BA[AA90] mov dx,SYNTMES_PTR ; MSG_1030 ; 06/08/2024 - 26164 00003145 E8D8FF call PIPEDEL - 26165 00003148 0E push cs - 26166 00003149 1F pop ds - 26167 0000314A E9D9FB jmp cerror - 26168 - 26169 ; --------------------------------------------------------------------------- - 26170 - 26171 ; 26/02/2023 - 26172 PIPERR: - 26173 0000314D 9C pushf - 26174 0000314E E85CFF call TriageError - 26175 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 - 26176 00003151 50 push ax ; Save results from TriageError - 26177 00003152 52 push dx - 26178 00003153 BA[5D91] mov dx,PIPEEMES_PTR - 26179 00003156 E8C7FF call PIPEDEL - 26180 00003159 0E push cs - 26181 0000315A 1F pop ds - 26182 0000315B E8C222 call std_eprintf - 26183 0000315E 5A pop dx ; Restore results from TriageError - 26184 0000315F 58 pop ax - 26185 00003160 9D popf - 26186 00003161 83F841 cmp ax,65 ; network access denied - 26187 00003164 7503 jne short TCOMMANDJ - 26188 00003166 E9BDFB jmp cerror - 26189 - 26190 TCOMMANDJ: - 26191 00003169 E998CF jmp TCOMMAND + 26122 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26123 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33AFh + 26124 ; + 26125 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 26126 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:324Fh + 26127 PIPEDEL: + 26128 00003120 1E push ds + 26129 00003121 52 push dx + 26130 00003122 2E8E1E[F59B] mov ds,[cs:RESSEG] + 26131 ;;;mov dx,320h ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2E0Ch + 26132 ;;mov dx,3EAh ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33B1h + 26133 ;mov dx,41Eh ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3256h + 26134 ; Pipe1 = offset RESGROUP:EndInit + 26135 00003127 BA[1503] mov dx,Pipe1 ; Clean up in case ^C + 26136 ;mov ah,Unlink ; 41h + 26137 0000312A B441 mov ah,41h + 26138 ;int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) + 26139 ; DS:DX -> ASCIZ pathname of file to delete + 26140 ; (no wildcards allowed) + 26141 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26142 0000312C E88BD4 call int_21h_indirect + 26143 + 26144 ;;;mov dx,36Fh ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2E13h + 26145 ;;mov dx,439h ; MSDOS 6.22 COMMAND.COM - TRANGROUP:33BDh + 26146 ;mov dx,46Dh ; PCDOS 7.1 COMMAND.COM - TRANGROUP:325Eh + 26147 ; Pipe2 = offset RESGROUP:EndInit+79 + 26148 0000312F BA[6403] mov dx,Pipe2 + 26149 ;mov ah,Unlink ; 41h + 26150 00003132 B441 mov ah,41h + 26151 ;int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) + 26152 ; DS:DX -> ASCIZ pathname of file to delete + 26153 ; (no wildcards allowed) + 26154 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26155 00003134 E883D4 call int_21h_indirect + 26156 00003137 5A pop dx + 26157 00003138 E86C02 call PipeOff + 26158 0000313B C606[1403]00 mov byte [PipeFiles],0 + 26159 00003140 1F pop ds + 26160 00003141 C3 retn + 26161 + 26162 ; --------------------------------------------------------------------------- + 26163 + 26164 ; 26/02/2023 + 26165 PIPEERRSYN: + 26166 00003142 BA[AA90] mov dx,SYNTMES_PTR ; MSG_1030 ; 06/08/2024 + 26167 00003145 E8D8FF call PIPEDEL + 26168 00003148 0E push cs + 26169 00003149 1F pop ds + 26170 0000314A E9D9FB jmp cerror + 26171 + 26172 ; --------------------------------------------------------------------------- + 26173 + 26174 ; 26/02/2023 + 26175 PIPERR: + 26176 0000314D 9C pushf + 26177 0000314E E85CFF call TriageError + 26178 ;call GET_EXT_ERR_NUMBER ; MSDOS 3.3 + 26179 00003151 50 push ax ; Save results from TriageError + 26180 00003152 52 push dx + 26181 00003153 BA[5D91] mov dx,PIPEEMES_PTR + 26182 00003156 E8C7FF call PIPEDEL + 26183 00003159 0E push cs + 26184 0000315A 1F pop ds + 26185 0000315B E8C222 call std_eprintf + 26186 0000315E 5A pop dx ; Restore results from TriageError + 26187 0000315F 58 pop ax + 26188 00003160 9D popf + 26189 00003161 83F841 cmp ax,65 ; network access denied + 26190 00003164 7503 jne short TCOMMANDJ + 26191 00003166 E9BDFB jmp cerror 26192 - 26193 ; --------------------------------------------------------------------------- - 26194 - 26195 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM - 26196 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26197 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 26198 PIPEPROCSTRT: - 26199 0000316C 8E1E[F59B] mov ds,[RESSEG] - 26200 00003170 FE06[1403] inc byte [PipeFiles] ; Flag that the pipe files exist - 26201 - 26202 ; MSDOS 6.0 - 26203 00003174 06 push es - 26204 00003175 57 push di - 26205 00003176 1E push ds - 26206 00003177 56 push si - 26207 - 26208 00003178 1E push ds - 26209 00003179 06 push es - 26210 0000317A 1F pop ds ;ds = TRANGROUP - 26211 0000317B BE[7097] mov si,TempVarName ;ds:si = "TEMP=" - 26212 - 26213 ;Some hideous code in Find_Name_In_Environment. Expects ds = TRANGROUP and - 26214 ;so the routine is not really general + 26193 TCOMMANDJ: + 26194 00003169 E998CF jmp TCOMMAND + 26195 + 26196 ; --------------------------------------------------------------------------- + 26197 + 26198 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM + 26199 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26200 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 26201 PIPEPROCSTRT: + 26202 0000316C 8E1E[F59B] mov ds,[RESSEG] + 26203 00003170 FE06[1403] inc byte [PipeFiles] ; Flag that the pipe files exist + 26204 + 26205 ; MSDOS 6.0 + 26206 00003174 06 push es + 26207 00003175 57 push di + 26208 00003176 1E push ds + 26209 00003177 56 push si + 26210 + 26211 00003178 1E push ds + 26212 00003179 06 push es + 26213 0000317A 1F pop ds ;ds = TRANGROUP + 26214 0000317B BE[7097] mov si,TempVarName ;ds:si = "TEMP=" 26215 - 26216 0000317E E836F5 call find_name_in_environment - 26217 ;es:di points at path - 26218 00003181 1F pop ds ;ds = DATARES again - 26219 00003182 7220 jc short no_temp_path - 26220 - 26221 00003184 1E push ds - 26222 00003185 06 push es - 26223 00003186 1F pop ds - 26224 00003187 07 pop es ;swap ds and es - 26225 00003188 89FE mov si,di ;ds:si points at path - 26226 - 26227 0000318A E8B702 call skip_white ;skip white space chars - 26228 - 26229 ;This copies the path into both buffers -- Pipe1 & Pipe2 - 26230 - 26231 0000318D E8C002 call copy_pipe_path ;copy the pipe path - 26232 - 26233 ;Check if the TEMP path is valid - 26234 - 26235 00003190 06 push es - 26236 00003191 1F pop ds ;ds = DATARES - 26237 ;mov dx,offset DATARES:Pipe1 ;ds:dx = path to look for - 26238 ;;;mov dx,320h ; MSDOS 5.0 - offset EndInit - 26239 ;;mov dx,3EAh ; MSDOS 6.22 - offset EndInit - 26240 ;mov dx,41Eh ; PCDOS 7.1 COMMAND.COM - offset EndInit - 26241 00003192 BA[1503] mov dx,Pipe1 - 26242 ;mov ax,(CHMOD shl 8) or 0 - 26243 00003195 B80043 mov ax,4300h - 26244 ;int 21h - 26245 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26246 00003198 E81FD4 call int_21h_indirect - 26247 0000319B 7207 jc short no_temp_path - 26248 - 26249 0000319D F7C11000 test cx,10h ;is it a directory? - 26250 000031A1 7501 jnz short no_temp_path ;yes, continue (carry clear) + 26216 ;Some hideous code in Find_Name_In_Environment. Expects ds = TRANGROUP and + 26217 ;so the routine is not really general + 26218 + 26219 0000317E E836F5 call find_name_in_environment + 26220 ;es:di points at path + 26221 00003181 1F pop ds ;ds = DATARES again + 26222 00003182 7220 jc short no_temp_path + 26223 + 26224 00003184 1E push ds + 26225 00003185 06 push es + 26226 00003186 1F pop ds + 26227 00003187 07 pop es ;swap ds and es + 26228 00003188 89FE mov si,di ;ds:si points at path + 26229 + 26230 0000318A E8B702 call skip_white ;skip white space chars + 26231 + 26232 ;This copies the path into both buffers -- Pipe1 & Pipe2 + 26233 + 26234 0000318D E8C002 call copy_pipe_path ;copy the pipe path + 26235 + 26236 ;Check if the TEMP path is valid + 26237 + 26238 00003190 06 push es + 26239 00003191 1F pop ds ;ds = DATARES + 26240 ;mov dx,offset DATARES:Pipe1 ;ds:dx = path to look for + 26241 ;;;mov dx,320h ; MSDOS 5.0 - offset EndInit + 26242 ;;mov dx,3EAh ; MSDOS 6.22 - offset EndInit + 26243 ;mov dx,41Eh ; PCDOS 7.1 COMMAND.COM - offset EndInit + 26244 00003192 BA[1503] mov dx,Pipe1 + 26245 ;mov ax,(CHMOD shl 8) or 0 + 26246 00003195 B80043 mov ax,4300h + 26247 ;int 21h + 26248 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26249 00003198 E81FD4 call int_21h_indirect + 26250 0000319B 7207 jc short no_temp_path 26251 - 26252 000031A3 F9 stc ;no, indicate fail - 26253 no_temp_path: - 26254 000031A4 5E pop si - 26255 000031A5 1F pop ds - 26256 000031A6 5F pop di - 26257 000031A7 07 pop es - 26258 000031A8 730B jnc short crt_temp ;path found, create tempfiles - 26259 - 26260 ; 27/02/2023 - 26261 ; MSDOS 3.3 - 26262 ;mov ah,GET_DEFAULT_DRIVE ; 19h - 26263 ; ; Get current drive - 26264 ;int 21h ; DOS - GET DEFAULT DISK NUMBER - 26265 ;add al,[cs:CAPITAL_A] - 26266 ;mov byte [PIPE2],al ; Make pipe files in root of def drv - 26267 ;mov bx,PIPE1 - 26268 ;mov [bx],al - 26269 ;xor ah,ah ; nul terminate path names - 26270 ;mov byte [PIPE1+3],ah - 26271 ;mov byte [PIPE2+3],ah - 26272 - 26273 ; MSDOS 6.0 - 26274 ;SR; - 26275 ; We want to create temp files in the current directory rather than in the - 26276 ;root of the drive. This is because the number of files that can be present - 26277 ;in the root directory is fixed, whereas it is not so in subdirectories. - 26278 - 26279 ;mov ah,'.' - 26280 ;mov [Pipe1],ah ; = RESGROUP:EndInit - 26281 ;mov [Pipe2],ah ; = RESGROUP:EndInit+79 - 26282 ;xor ah,ah - 26283 ;mov [Pipe1+1],ah ; = RESGROUP:EndInit+1 - 26284 ;mov [Pipe2+1],ah ;create files in current dir - 26285 ; 27/02/2023 - 26286 000031AA B92E00 mov cx,002Eh - 26287 000031AD 890E[1503] mov [Pipe1],cx - 26288 000031B1 890E[6403] mov [Pipe2],cx - 26289 crt_temp: - 26290 ; MSDOS 6.0 - 26291 ;mov dx,offset DATARES:Pipe1 ; = RESGROUP:EndInit - 26292 ;;mov dx,320h ; MSDOS 5.0 COMMAND.COM - 26293 ;mov dx,3EAh ; MSDOS 6.22 COMMAND.COM - 26294 000031B5 BA[1503] mov dx,Pipe1 - 26295 ; MSDOS 3.3 - 26296 ;mov dx,bx - 26297 - 26298 ; MSDOS 3.3 (& MSDOS 6.0) - 26299 000031B8 31C9 xor cx,cx - 26300 ;mov ah,CREATETEMPFILE ; 5Ah ; the CreateTemp call - 26301 000031BA B45A mov ah,5Ah - 26302 ;int 21h - 26303 ; DOS - 3+ - CREATE UNIQUE FILE - 26304 ; DS:DX -> ASCIZ directory path name ending with a '' + 13 bytes - 26305 ; to receive generated filename - 26306 ; CX = file attributes (only bits 0,1,2,5 may be set) - 26307 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26308 000031BC E8FBD3 call int_21h_indirect - 26309 000031BF 728C jc short PIPERR ; Couldn't create - 26310 - 26311 000031C1 89C3 mov bx,ax - 26312 ;mov ah,CLOSE ; 3Eh ; Don't proliferate handles - 26313 000031C3 B43E mov ah,3Eh - 26314 000031C5 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 26315 ; BX = file handle - 26316 ;;;mov dx,PIPE2 - 26317 ;;;mov dx,36Fh ; MSDOS 5.0 COMMAND.COM - 26318 ;;mov dx,439h ; MSDOS 6.22 COMMAND.COM - 26319 ;mov dx,46Dh ; PCDOS 7.1 COMMAND.COM - 26320 000031C7 BA[6403] mov dx,Pipe2 - 26321 ;mov ah,CREATETEMPFILE ; 5Ah ; the CreateTemp call - 26322 000031CA B45A mov ah,5Ah - 26323 ;int 21h - 26324 ; DOS - 3+ - CREATE UNIQUE FILE - 26325 ; DS:DX -> ASCIZ directory path name ending with a '' + 13 bytes to - 26326 ; receive generated filename - 26327 ; CX = file attributes (only bits 0,1,2,5 may be set) - 26328 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26329 000031CC E8EBD3 call int_21h_indirect - 26330 ; 17/04/2023 - 26331 ;jc short PIPERR - 26332 ; 27/02/2023 - 26333 000031CF 7303 jnc short pps1 - 26334 000031D1 E979FF jmp PIPERR - 26335 pps1: - 26336 000031D4 89C3 mov bx,ax - 26337 000031D6 B43E mov ah,CLOSE ; 3Eh ; Don't proliferate handles - 26338 ;int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 26339 ; BX = file handle - 26340 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26341 000031D8 E8DFD3 call int_21h_indirect - 26342 ; - 26343 ;call near ptr TESTDOREIN ; Set up a redirection if specified - 26344 000031DB E879FE call TESTDOREIN - 26345 ;;mov si,[488h] ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 - 26346 ;mov si,[4BCh] ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 - 26347 000031DE 8B36[B303] mov si,[PipePtr] ; offset RESGROUP:EndInit+158 - 26348 000031E2 833E[A502]FF cmp word [SingleCom],-1 ; 0FFFFh - 26349 000031E7 7506 jne short NOSINGP - 26350 000031E9 C706[A502]00F0 mov word [SingleCom],0F000h ; Flag single command pipe - 26351 NOSINGP: - 26352 000031EF EB2A jmp short FIRSTPIPE - 26353 - 26354 ; --------------------------------------------------------------------------- - 26355 - 26356 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM - 26357 ; 11/06/2026 - Retro DOS v4.2 COMMAND.COM - 26358 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 26359 PIPEPROC: - 26360 000031F1 8026[9D02]FE and byte [EchoFlag],0FEh ; force current echo to be off - 26361 ;;mov si,[488h] ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 - 26362 000031F6 8B36[B303] mov si,[PipePtr] ; offset RESGROUP:EndInit+158 - 26363 000031FA AC lodsb - 26364 ; 27/02/2023 - 26365 000031FB 3C7C cmp al,'|' - 26366 ;;cmp al,ALTPIPECHR ; Alternate pipe char? - 26367 ;je short ISPIPE1 ; Yes - 26368 ;cmp al,'|' - 26369 ;;cmp al,[cs:VBAR] - 26370 000031FD 7403 je short ISPIPE1 - 26371 000031FF E98600 jmp PIPEEND ; Pipe done - 26372 ISPIPE1: - 26373 00003202 8B16[3604] mov dx,[InPipePtr] ; Get the input file name - 26374 ;mov ax,OPEN*256 ; 3D00h - 26375 00003206 B8003D mov ax,3D00h - 26376 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 26377 ; DS:DX -> ASCIZ filename - 26378 ; AL = access mode - 26379 ; 0 - read - 26380 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26381 00003209 E8AED3 call int_21h_indirect - 26382 PIPEERRJ: - 26383 0000320C 7303 jnc short NO_PIPEERR - 26384 0000320E E93CFF jmp PIPERR ; Lost the pipe file - 26385 NO_PIPEERR: - 26386 00003211 89C3 mov bx,ax - 26387 00003213 B0FF mov al,0FFh - 26388 ;xchg al,[bx+18h] - 26389 00003215 864718 xchg al,[bx+PDB.JFN_TABLE] - 26390 00003218 A21800 mov [PDB.JFN_TABLE],al ; Redirect - 26391 FIRSTPIPE: - 26392 0000321B BF[569A] mov di,COMBUF+2 - 26393 0000321E 31C9 xor cx,cx - 26394 00003220 803C0D cmp byte [si],0Dh ; '|' - 26395 00003223 7503 jne short PIPEOK1 - 26396 PIPEERRSYNJ: - 26397 00003225 E91AFF jmp PIPEERRSYN - 26398 PIPEOK1: - 26399 ;;;mov al,[cs:VBAR] - 26400 ; 27/02/2023 - 26401 ;;mov al,vbar - 26402 ;mov al,'|' - 26403 ;cmp [si],al ; '||' - 26404 ;je short PIPEERRSYNJ - 26405 00003228 803C7C cmp byte [si],'|' - 26406 ;cmp byte [si],ALTPIPECHR ; '##' or '|#'? - 26407 0000322B 74F8 je short PIPEERRSYNJ - 26408 PIPECOMLP: - 26409 0000322D AC lodsb - 26410 0000322E AA stosb - 26411 ; 27/02/2023 - 26412 0000322F E82FF5 call testkanj - 26413 00003232 7405 jz short NOTKANJ5 - 26414 00003234 A4 movsb - 26415 ; Added following 2 commands to the fix pipe bug. - 26416 00003235 41 inc cx ;AN000; 3/3/KK - 26417 00003236 41 inc cx ;AN000; 3/3/KK - 26418 00003237 EBF4 jmp short PIPECOMLP - 26419 NOTKANJ5: - 26420 00003239 3C0D cmp al,0Dh - 26421 0000323B 7439 je short LASTPIPE - 26422 0000323D 41 inc cx - 26423 ; 27/02/2023 - 26424 0000323E 3C7C cmp al,'|' - 26425 ;cmp al,ALTPIPECHR - 26426 ;je short ISPIPE2 - 26427 ;;cmp al,[cs:VBAR] - 26428 ;cmp al,vbar - 26429 00003240 75EB jne short PIPECOMLP - 26430 ISPIPE2: - 26431 00003242 26C645FF0D mov byte [es:di-1],0Dh - 26432 00003247 49 dec cx - 26433 ;mov [cs:COMBUF+1],cl - 26434 ; 27/02/2023 - 26435 00003248 26880E[559A] mov [es:COMBUF+1],cl - 26436 0000324D 4E dec si - 26437 ;;mov [3BEh],si ; MSDOS 5.0 COMMAND.COM - 26438 ; 11/06/2023 - MSDOS 6.22 COMMAND.COM - 26439 ;mov [488h],si ; [PipePtr] = [EndInit+158] - 26440 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26441 ;mov [4BCh],si ; [PipePtr] = [EndInit+158] - 26442 0000324E 8936[B303] mov [PipePtr],si ; On to next pipe element - 26443 ; mov [EndInit+158],si - 26444 00003252 8B16[3804] mov dx,[OutPipePtr] - 26445 00003256 51 push cx - 26446 00003257 31C9 xor cx,cx - 26447 ;mov ax,CREAT*256 ; 3C00h - 26448 00003259 B8003C mov ax,3C00h - 26449 ;int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) - 26450 ; CX = attributes for file - 26451 ; DS:DX -> ASCIZ filename (may include drive and path) - 26452 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26453 0000325C E85BD3 call int_21h_indirect - 26454 0000325F 59 pop cx - 26455 00003260 72AA jc short PIPEERRJ ; Lost the file - 26456 00003262 89C3 mov bx,ax - 26457 00003264 B0FF mov al,0FFh - 26458 ;xchg al,[bx+18h] - 26459 00003266 864718 xchg al,[bx+PDB.JFN_TABLE] - 26460 00003269 A21900 mov [PDB.JFN_TABLE+1],al - 26461 0000326C 8716[3604] xchg dx,[InPipePtr] ; Swap for next element of pipe - 26462 00003270 8916[3804] mov [OutPipePtr],dx - 26463 00003274 EB0D jmp short PIPECOM - 26464 LASTPIPE: - 26465 ;mov [cs:COMBUF+1],cl - 26466 ; 27/02/2023 - 26467 00003276 26880E[559A] mov [es:COMBUF+1],cl - 26468 0000327B 4E dec si - 26469 ;;;mov [3BEh],si ; MSDOS 5.0 COMMAND.COM - 26470 ;;mov [488h],si ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 - 26471 ;mov [4BCh],si ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 - 26472 0000327C 8936[B303] mov [PipePtr],si ; Point at the CR (anything not '|' will do) - 26473 ; mov [EndInit+158],si - 26474 00003280 E851FD call TESTDOREOUT ; Set up the redirection if specified - 26475 PIPECOM: - 26476 00003283 0E push cs - 26477 00003284 1F pop ds - 26478 00003285 E994D0 jmp NOPIPEPROC ; Process the pipe element - 26479 PIPEEND: - 26480 00003288 E895FE call PIPEDEL - 26481 0000328B 813E[A502]00F0 cmp word [SingleCom],0F000h - 26482 00003291 7506 jnz short NOSINGP2 - 26483 00003293 C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Make it return - 26484 NOSINGP2: - 26485 00003299 E968CE jmp TCOMMAND - 26486 - 26487 ; =============== S U B R O U T I N E ======================================= - 26488 - 26489 ; Date and time are set during initialization and use - 26490 ; this routines since they need to do a long return + 26252 0000319D F7C11000 test cx,10h ;is it a directory? + 26253 000031A1 7501 jnz short no_temp_path ;yes, continue (carry clear) + 26254 + 26255 000031A3 F9 stc ;no, indicate fail + 26256 no_temp_path: + 26257 000031A4 5E pop si + 26258 000031A5 1F pop ds + 26259 000031A6 5F pop di + 26260 000031A7 07 pop es + 26261 000031A8 730B jnc short crt_temp ;path found, create tempfiles + 26262 + 26263 ; 27/02/2023 + 26264 ; MSDOS 3.3 + 26265 ;mov ah,GET_DEFAULT_DRIVE ; 19h + 26266 ; ; Get current drive + 26267 ;int 21h ; DOS - GET DEFAULT DISK NUMBER + 26268 ;add al,[cs:CAPITAL_A] + 26269 ;mov byte [PIPE2],al ; Make pipe files in root of def drv + 26270 ;mov bx,PIPE1 + 26271 ;mov [bx],al + 26272 ;xor ah,ah ; nul terminate path names + 26273 ;mov byte [PIPE1+3],ah + 26274 ;mov byte [PIPE2+3],ah + 26275 + 26276 ; MSDOS 6.0 + 26277 ;SR; + 26278 ; We want to create temp files in the current directory rather than in the + 26279 ;root of the drive. This is because the number of files that can be present + 26280 ;in the root directory is fixed, whereas it is not so in subdirectories. + 26281 + 26282 ;mov ah,'.' + 26283 ;mov [Pipe1],ah ; = RESGROUP:EndInit + 26284 ;mov [Pipe2],ah ; = RESGROUP:EndInit+79 + 26285 ;xor ah,ah + 26286 ;mov [Pipe1+1],ah ; = RESGROUP:EndInit+1 + 26287 ;mov [Pipe2+1],ah ;create files in current dir + 26288 ; 27/02/2023 + 26289 000031AA B92E00 mov cx,002Eh + 26290 000031AD 890E[1503] mov [Pipe1],cx + 26291 000031B1 890E[6403] mov [Pipe2],cx + 26292 crt_temp: + 26293 ; MSDOS 6.0 + 26294 ;mov dx,offset DATARES:Pipe1 ; = RESGROUP:EndInit + 26295 ;;mov dx,320h ; MSDOS 5.0 COMMAND.COM + 26296 ;mov dx,3EAh ; MSDOS 6.22 COMMAND.COM + 26297 000031B5 BA[1503] mov dx,Pipe1 + 26298 ; MSDOS 3.3 + 26299 ;mov dx,bx + 26300 + 26301 ; MSDOS 3.3 (& MSDOS 6.0) + 26302 000031B8 31C9 xor cx,cx + 26303 ;mov ah,CREATETEMPFILE ; 5Ah ; the CreateTemp call + 26304 000031BA B45A mov ah,5Ah + 26305 ;int 21h + 26306 ; DOS - 3+ - CREATE UNIQUE FILE + 26307 ; DS:DX -> ASCIZ directory path name ending with a '' + 13 bytes + 26308 ; to receive generated filename + 26309 ; CX = file attributes (only bits 0,1,2,5 may be set) + 26310 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26311 000031BC E8FBD3 call int_21h_indirect + 26312 000031BF 728C jc short PIPERR ; Couldn't create + 26313 + 26314 000031C1 89C3 mov bx,ax + 26315 ;mov ah,CLOSE ; 3Eh ; Don't proliferate handles + 26316 000031C3 B43E mov ah,3Eh + 26317 000031C5 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 26318 ; BX = file handle + 26319 ;;;mov dx,PIPE2 + 26320 ;;;mov dx,36Fh ; MSDOS 5.0 COMMAND.COM + 26321 ;;mov dx,439h ; MSDOS 6.22 COMMAND.COM + 26322 ;mov dx,46Dh ; PCDOS 7.1 COMMAND.COM + 26323 000031C7 BA[6403] mov dx,Pipe2 + 26324 ;mov ah,CREATETEMPFILE ; 5Ah ; the CreateTemp call + 26325 000031CA B45A mov ah,5Ah + 26326 ;int 21h + 26327 ; DOS - 3+ - CREATE UNIQUE FILE + 26328 ; DS:DX -> ASCIZ directory path name ending with a '' + 13 bytes to + 26329 ; receive generated filename + 26330 ; CX = file attributes (only bits 0,1,2,5 may be set) + 26331 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26332 000031CC E8EBD3 call int_21h_indirect + 26333 ; 17/04/2023 + 26334 ;jc short PIPERR + 26335 ; 27/02/2023 + 26336 000031CF 7303 jnc short pps1 + 26337 000031D1 E979FF jmp PIPERR + 26338 pps1: + 26339 000031D4 89C3 mov bx,ax + 26340 000031D6 B43E mov ah,CLOSE ; 3Eh ; Don't proliferate handles + 26341 ;int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 26342 ; BX = file handle + 26343 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26344 000031D8 E8DFD3 call int_21h_indirect + 26345 ; + 26346 ;call near ptr TESTDOREIN ; Set up a redirection if specified + 26347 000031DB E879FE call TESTDOREIN + 26348 ;;mov si,[488h] ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 + 26349 ;mov si,[4BCh] ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 + 26350 000031DE 8B36[B303] mov si,[PipePtr] ; offset RESGROUP:EndInit+158 + 26351 000031E2 833E[A502]FF cmp word [SingleCom],-1 ; 0FFFFh + 26352 000031E7 7506 jne short NOSINGP + 26353 000031E9 C706[A502]00F0 mov word [SingleCom],0F000h ; Flag single command pipe + 26354 NOSINGP: + 26355 000031EF EB2A jmp short FIRSTPIPE + 26356 + 26357 ; --------------------------------------------------------------------------- + 26358 + 26359 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM + 26360 ; 11/06/2026 - Retro DOS v4.2 COMMAND.COM + 26361 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 26362 PIPEPROC: + 26363 000031F1 8026[9D02]FE and byte [EchoFlag],0FEh ; force current echo to be off + 26364 ;;mov si,[488h] ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 + 26365 000031F6 8B36[B303] mov si,[PipePtr] ; offset RESGROUP:EndInit+158 + 26366 000031FA AC lodsb + 26367 ; 27/02/2023 + 26368 000031FB 3C7C cmp al,'|' + 26369 ;;cmp al,ALTPIPECHR ; Alternate pipe char? + 26370 ;je short ISPIPE1 ; Yes + 26371 ;cmp al,'|' + 26372 ;;cmp al,[cs:VBAR] + 26373 000031FD 7403 je short ISPIPE1 + 26374 000031FF E98600 jmp PIPEEND ; Pipe done + 26375 ISPIPE1: + 26376 00003202 8B16[3604] mov dx,[InPipePtr] ; Get the input file name + 26377 ;mov ax,OPEN*256 ; 3D00h + 26378 00003206 B8003D mov ax,3D00h + 26379 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 26380 ; DS:DX -> ASCIZ filename + 26381 ; AL = access mode + 26382 ; 0 - read + 26383 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26384 00003209 E8AED3 call int_21h_indirect + 26385 PIPEERRJ: + 26386 0000320C 7303 jnc short NO_PIPEERR + 26387 0000320E E93CFF jmp PIPERR ; Lost the pipe file + 26388 NO_PIPEERR: + 26389 00003211 89C3 mov bx,ax + 26390 00003213 B0FF mov al,0FFh + 26391 ;xchg al,[bx+18h] + 26392 00003215 864718 xchg al,[bx+PDB.JFN_TABLE] + 26393 00003218 A21800 mov [PDB.JFN_TABLE],al ; Redirect + 26394 FIRSTPIPE: + 26395 0000321B BF[569A] mov di,COMBUF+2 + 26396 0000321E 31C9 xor cx,cx + 26397 00003220 803C0D cmp byte [si],0Dh ; '|' + 26398 00003223 7503 jne short PIPEOK1 + 26399 PIPEERRSYNJ: + 26400 00003225 E91AFF jmp PIPEERRSYN + 26401 PIPEOK1: + 26402 ;;;mov al,[cs:VBAR] + 26403 ; 27/02/2023 + 26404 ;;mov al,vbar + 26405 ;mov al,'|' + 26406 ;cmp [si],al ; '||' + 26407 ;je short PIPEERRSYNJ + 26408 00003228 803C7C cmp byte [si],'|' + 26409 ;cmp byte [si],ALTPIPECHR ; '##' or '|#'? + 26410 0000322B 74F8 je short PIPEERRSYNJ + 26411 PIPECOMLP: + 26412 0000322D AC lodsb + 26413 0000322E AA stosb + 26414 ; 27/02/2023 + 26415 0000322F E82FF5 call testkanj + 26416 00003232 7405 jz short NOTKANJ5 + 26417 00003234 A4 movsb + 26418 ; Added following 2 commands to the fix pipe bug. + 26419 00003235 41 inc cx ;AN000; 3/3/KK + 26420 00003236 41 inc cx ;AN000; 3/3/KK + 26421 00003237 EBF4 jmp short PIPECOMLP + 26422 NOTKANJ5: + 26423 00003239 3C0D cmp al,0Dh + 26424 0000323B 7439 je short LASTPIPE + 26425 0000323D 41 inc cx + 26426 ; 27/02/2023 + 26427 0000323E 3C7C cmp al,'|' + 26428 ;cmp al,ALTPIPECHR + 26429 ;je short ISPIPE2 + 26430 ;;cmp al,[cs:VBAR] + 26431 ;cmp al,vbar + 26432 00003240 75EB jne short PIPECOMLP + 26433 ISPIPE2: + 26434 00003242 26C645FF0D mov byte [es:di-1],0Dh + 26435 00003247 49 dec cx + 26436 ;mov [cs:COMBUF+1],cl + 26437 ; 27/02/2023 + 26438 00003248 26880E[559A] mov [es:COMBUF+1],cl + 26439 0000324D 4E dec si + 26440 ;;mov [3BEh],si ; MSDOS 5.0 COMMAND.COM + 26441 ; 11/06/2023 - MSDOS 6.22 COMMAND.COM + 26442 ;mov [488h],si ; [PipePtr] = [EndInit+158] + 26443 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26444 ;mov [4BCh],si ; [PipePtr] = [EndInit+158] + 26445 0000324E 8936[B303] mov [PipePtr],si ; On to next pipe element + 26446 ; mov [EndInit+158],si + 26447 00003252 8B16[3804] mov dx,[OutPipePtr] + 26448 00003256 51 push cx + 26449 00003257 31C9 xor cx,cx + 26450 ;mov ax,CREAT*256 ; 3C00h + 26451 00003259 B8003C mov ax,3C00h + 26452 ;int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) + 26453 ; CX = attributes for file + 26454 ; DS:DX -> ASCIZ filename (may include drive and path) + 26455 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26456 0000325C E85BD3 call int_21h_indirect + 26457 0000325F 59 pop cx + 26458 00003260 72AA jc short PIPEERRJ ; Lost the file + 26459 00003262 89C3 mov bx,ax + 26460 00003264 B0FF mov al,0FFh + 26461 ;xchg al,[bx+18h] + 26462 00003266 864718 xchg al,[bx+PDB.JFN_TABLE] + 26463 00003269 A21900 mov [PDB.JFN_TABLE+1],al + 26464 0000326C 8716[3604] xchg dx,[InPipePtr] ; Swap for next element of pipe + 26465 00003270 8916[3804] mov [OutPipePtr],dx + 26466 00003274 EB0D jmp short PIPECOM + 26467 LASTPIPE: + 26468 ;mov [cs:COMBUF+1],cl + 26469 ; 27/02/2023 + 26470 00003276 26880E[559A] mov [es:COMBUF+1],cl + 26471 0000327B 4E dec si + 26472 ;;;mov [3BEh],si ; MSDOS 5.0 COMMAND.COM + 26473 ;;mov [488h],si ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 + 26474 ;mov [4BCh],si ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 + 26475 0000327C 8936[B303] mov [PipePtr],si ; Point at the CR (anything not '|' will do) + 26476 ; mov [EndInit+158],si + 26477 00003280 E851FD call TESTDOREOUT ; Set up the redirection if specified + 26478 PIPECOM: + 26479 00003283 0E push cs + 26480 00003284 1F pop ds + 26481 00003285 E994D0 jmp NOPIPEPROC ; Process the pipe element + 26482 PIPEEND: + 26483 00003288 E895FE call PIPEDEL + 26484 0000328B 813E[A502]00F0 cmp word [SingleCom],0F000h + 26485 00003291 7506 jnz short NOSINGP2 + 26486 00003293 C706[A502]FFFF mov word [SingleCom],-1 ; 0FFFFh ; Make it return + 26487 NOSINGP2: + 26488 00003299 E968CE jmp TCOMMAND + 26489 + 26490 ; =============== S U B R O U T I N E ======================================= 26491 - 26492 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM - 26493 - 26494 DATINIT: - 26495 0000329C 2E8C1E[F59B] mov [cs:RESSEG],ds ; SetInitFlag needs resseg initialized - 26496 000032A1 06 push es - 26497 000032A2 1E push ds ; Going to use the previous stack - 26498 000032A3 8CC8 mov ax,cs ; Set up the appropriate segment registers - 26499 000032A5 8EC0 mov es,ax - 26500 000032A7 8ED8 mov ds,ax - 26501 000032A9 E85922 call TSYSLOADMSG ; MSDOS 6.0 ; AN000; preload messages - 26502 000032AC BA[9EA5] mov dx,INTERNATVARS - 26503 000032AF B80038 mov ax,3800h - 26504 ;mov ax,INTERNATIONAL*256 ; 3800h - 26505 ;int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION - 26506 ; get current-country info - 26507 ; DS:DX -> buffer for returned info - 26508 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26509 000032B2 E805D3 call int_21h_indirect - 26510 ; 20/10/2018 - 26511 000032B5 C70681000D00 mov word [81h],0Dh ; Want to prompt for date during initialization - 26512 000032BB C606[549A]80 mov byte [COMBUF],128 ; Init COMBUF - 26513 000032C0 C706[559A]010D mov word [COMBUF+1],0D01h - 26514 000032C6 E80600 call DATE - 26515 000032C9 E86300 call CTIME - 26516 000032CC 1F pop ds - 26517 000032CD 07 pop es - 26518 000032CE CB retf ; far return - 26519 - 26520 ; =============== S U B R O U T I N E ======================================= - 26521 - 26522 ; MSDOS 6.0 - 26523 - 26524 ; **************************************************************** - 26525 ; * - 26526 ; * ROUTINE: DATE - Set system date - 26527 ; * - 26528 ; * FUNCTION: If a date is specified, set the system date, - 26529 ; * otherwise display the current system date and - 26530 ; * prompt the user for a new date. If an invalid - 26531 ; * date is specified, issue an error message and - 26532 ; * prompt for a new date. If the user enters - 26533 ; * nothing when prompted for a date, terminate. - 26534 ; * - 26535 ; * INPUT: command line at offset 81H - 26536 ; * - 26537 ; * OUTPUT: none - 26538 ; * - 26539 ; **************************************************************** - 26540 - 26541 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26542 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2FC4h + 26492 ; Date and time are set during initialization and use + 26493 ; this routines since they need to do a long return + 26494 + 26495 ; 27/02/2023 - Retro DOS v4.0 COMMAND.COM + 26496 + 26497 DATINIT: + 26498 0000329C 2E8C1E[F59B] mov [cs:RESSEG],ds ; SetInitFlag needs resseg initialized + 26499 000032A1 06 push es + 26500 000032A2 1E push ds ; Going to use the previous stack + 26501 000032A3 8CC8 mov ax,cs ; Set up the appropriate segment registers + 26502 000032A5 8EC0 mov es,ax + 26503 000032A7 8ED8 mov ds,ax + 26504 000032A9 E85922 call TSYSLOADMSG ; MSDOS 6.0 ; AN000; preload messages + 26505 000032AC BA[9EA5] mov dx,INTERNATVARS + 26506 000032AF B80038 mov ax,3800h + 26507 ;mov ax,INTERNATIONAL*256 ; 3800h + 26508 ;int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION + 26509 ; get current-country info + 26510 ; DS:DX -> buffer for returned info + 26511 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26512 000032B2 E805D3 call int_21h_indirect + 26513 ; 20/10/2018 + 26514 000032B5 C70681000D00 mov word [81h],0Dh ; Want to prompt for date during initialization + 26515 000032BB C606[549A]80 mov byte [COMBUF],128 ; Init COMBUF + 26516 000032C0 C706[559A]010D mov word [COMBUF+1],0D01h + 26517 000032C6 E80600 call DATE + 26518 000032C9 E86300 call CTIME + 26519 000032CC 1F pop ds + 26520 000032CD 07 pop es + 26521 000032CE CB retf ; far return + 26522 + 26523 ; =============== S U B R O U T I N E ======================================= + 26524 + 26525 ; MSDOS 6.0 + 26526 + 26527 ; **************************************************************** + 26528 ; * + 26529 ; * ROUTINE: DATE - Set system date + 26530 ; * + 26531 ; * FUNCTION: If a date is specified, set the system date, + 26532 ; * otherwise display the current system date and + 26533 ; * prompt the user for a new date. If an invalid + 26534 ; * date is specified, issue an error message and + 26535 ; * prompt for a new date. If the user enters + 26536 ; * nothing when prompted for a date, terminate. + 26537 ; * + 26538 ; * INPUT: command line at offset 81H + 26539 ; * + 26540 ; * OUTPUT: none + 26541 ; * + 26542 ; **************************************************************** 26543 - 26544 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26545 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:356Eh + 26544 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26545 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:2FC4h 26546 - 26547 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 26548 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3417h - 26549 DATE: - 26550 000032CF BE8100 mov si,81h ; Accepting argument for date inline - 26551 000032D2 BF[5296] mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE - 26552 000032D5 31C9 xor cx,cx ;AN000; clear counter for positionals - 26553 000032D7 31D2 xor dx,dx ;AN000; - 26554 000032D9 E89016 call cmd_parse ;AC000; call parser - 26555 - 26556 ; 27/02/2023 - 26557 ;cmp ax,-1 - 26558 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 26559 ;je short PRMTDAT ;AC000; yes - go ask for date - 26560 ;;cmp ax,0 - 26561 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? - 26562 ;;jne short DATERR ;AN000; yes - go issue message - 26563 ; 26/04/2023 - 26564 ;or ax,ax ; ax = 0 ? - 26565 ;jnz short DATERR - 26566 ;;jmp short COMDAT ;AC000; we have a date - 26567 ; 11/06/2023 - 26568 000032DC 40 inc ax ; cmp ax,-1 - 26569 000032DD 7429 jz short PRMTDAT ; 0FFFFh -> 0 - 26570 000032DF 48 dec ax ; cmp ax,0 - 26571 000032E0 7542 jnz short DATERR ; 1 -> 0 - 26572 ; ax = 0 - 26573 - 26574 ; 27/02/2023 - 26575 COMDAT: - 26576 000032E2 8B0E[F7A5] mov cx,[DATE_YEAR] ;AC000; get parts of date in - 26577 000032E6 8A36[F9A5] mov dh,[DATE_MONTH] ;AC000; cx and dx for set - 26578 000032EA 8A16[FAA5] mov dl,[DATE_DAY] ;AC000; date function call. - 26579 000032EE 51 push cx ;AC000; save date - 26580 000032EF 52 push dx ;AC000; - 26581 000032F0 B90100 mov cx,1 ;AC000; set 1 positional entered - 26582 000032F3 31D2 xor dx,dx ;AN029; - 26583 000032F5 E87416 call cmd_parse ;AN029; call parser - 26584 000032F8 3CFF cmp al,0FFh ; -1 - 26585 ;cmp al,END_OF_LINE ;AN029; Are we at end of line? - 26586 000032FA 5A pop dx ;AC000; retrieve date - 26587 000032FB 59 pop cx ;AC000; - 26588 000032FC 7526 jnz short DATERR ;AC000; extra stuff on line - try again - 26589 ; 26/04/2023 - 26590 ;mov ah,SET_DATE ;yes - set date - 26591 000032FE B42B mov ah,2Bh - 26592 ;int 21h - 26593 ; DOS - SET CURRENT DATE - 26594 ; DL = day, DH = month, CX = year - 26595 ; Return: AL = 00h if no error /= FFh if bad value sent to routine - 26596 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26597 00003300 E8B7D2 call int_21h_indirect - 26598 00003303 08C0 or al,al - 26599 00003305 751D jnz short DATERR - 26600 date_end: - 26601 00003307 C3 retn - 26602 - 26603 PRMTDAT: - 26604 ; Print "Current date is - 26605 00003308 E81808 call GetDate ;AN000; get date for output - 26606 - 26607 0000330B 86F2 xchg dh,dl ;AN000; switch month & day - 26608 0000330D 890E[C090] mov [CurDat_yr],cx ;AC000; put year into message control block - 26609 00003311 8916[C290] mov [CurDat_mo_day],dx ;AC000; put month and day into message control block - 26610 00003315 BA[B090] mov dx,CurDat_Ptr ;AC000; set up message for output - 26611 00003318 E80D21 call std_printf - 26612 - 26613 ;AD061; mov word [CurDat_yr],0 ;AC000; reset year, month and day - 26614 ;AD061; mov word [CurDat_mo_day],0 ;AC000; pointers in control block + 26547 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26548 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:356Eh + 26549 + 26550 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 26551 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3417h + 26552 DATE: + 26553 000032CF BE8100 mov si,81h ; Accepting argument for date inline + 26554 000032D2 BF[5296] mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE + 26555 000032D5 31C9 xor cx,cx ;AN000; clear counter for positionals + 26556 000032D7 31D2 xor dx,dx ;AN000; + 26557 000032D9 E89016 call cmd_parse ;AC000; call parser + 26558 + 26559 ; 27/02/2023 + 26560 ;cmp ax,-1 + 26561 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 26562 ;je short PRMTDAT ;AC000; yes - go ask for date + 26563 ;;cmp ax,0 + 26564 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? + 26565 ;;jne short DATERR ;AN000; yes - go issue message + 26566 ; 26/04/2023 + 26567 ;or ax,ax ; ax = 0 ? + 26568 ;jnz short DATERR + 26569 ;;jmp short COMDAT ;AC000; we have a date + 26570 ; 11/06/2023 + 26571 000032DC 40 inc ax ; cmp ax,-1 + 26572 000032DD 7429 jz short PRMTDAT ; 0FFFFh -> 0 + 26573 000032DF 48 dec ax ; cmp ax,0 + 26574 000032E0 7542 jnz short DATERR ; 1 -> 0 + 26575 ; ax = 0 + 26576 + 26577 ; 27/02/2023 + 26578 COMDAT: + 26579 000032E2 8B0E[F7A5] mov cx,[DATE_YEAR] ;AC000; get parts of date in + 26580 000032E6 8A36[F9A5] mov dh,[DATE_MONTH] ;AC000; cx and dx for set + 26581 000032EA 8A16[FAA5] mov dl,[DATE_DAY] ;AC000; date function call. + 26582 000032EE 51 push cx ;AC000; save date + 26583 000032EF 52 push dx ;AC000; + 26584 000032F0 B90100 mov cx,1 ;AC000; set 1 positional entered + 26585 000032F3 31D2 xor dx,dx ;AN029; + 26586 000032F5 E87416 call cmd_parse ;AN029; call parser + 26587 000032F8 3CFF cmp al,0FFh ; -1 + 26588 ;cmp al,END_OF_LINE ;AN029; Are we at end of line? + 26589 000032FA 5A pop dx ;AC000; retrieve date + 26590 000032FB 59 pop cx ;AC000; + 26591 000032FC 7526 jnz short DATERR ;AC000; extra stuff on line - try again + 26592 ; 26/04/2023 + 26593 ;mov ah,SET_DATE ;yes - set date + 26594 000032FE B42B mov ah,2Bh + 26595 ;int 21h + 26596 ; DOS - SET CURRENT DATE + 26597 ; DL = day, DH = month, CX = year + 26598 ; Return: AL = 00h if no error /= FFh if bad value sent to routine + 26599 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26600 00003300 E8B7D2 call int_21h_indirect + 26601 00003303 08C0 or al,al + 26602 00003305 751D jnz short DATERR + 26603 date_end: + 26604 00003307 C3 retn + 26605 + 26606 PRMTDAT: + 26607 ; Print "Current date is + 26608 00003308 E81808 call GetDate ;AN000; get date for output + 26609 + 26610 0000330B 86F2 xchg dh,dl ;AN000; switch month & day + 26611 0000330D 890E[C090] mov [CurDat_yr],cx ;AC000; put year into message control block + 26612 00003311 8916[C290] mov [CurDat_mo_day],dx ;AC000; put month and day into message control block + 26613 00003315 BA[B090] mov dx,CurDat_Ptr ;AC000; set up message for output + 26614 00003318 E80D21 call std_printf 26615 - 26616 GET_NEW_DATE: ;AN000; - 26617 0000331B E8BF00 call GETDAT ;AC000; prompt user for date - 26618 - 26619 ; 11/06/2023 - 26620 ;cmp ax,0FFFFh ; -1 - 26621 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 26622 ;je short date_end ;AC000; yes - exit - 26623 ; 26/04/2023 - 26624 ;;cmp ax,0 - 26625 ;;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? - 26626 ;;;jnz short DATERR ;AN000; yes - go issue message - 26627 ;; 27/02/2023 - 26628 ;;jz short COMDAT - 26629 ; 26/04/2023 - 26630 ;and ax,ax ; 0 ? - 26631 ;jz short COMDAT - 26632 - 26633 ; 11/06/2023 - 26634 0000331E 40 inc ax ; cmp ax,-1 - 26635 0000331F 74E6 jz short date_end ; 0FFFFh -> 0 - 26636 00003321 48 dec ax ; cmp ax,0 - 26637 00003322 74BE jz short COMDAT ; 1 -> 0 - 26638 ; ax > 0 - 26639 - 26640 ;COMDAT: - 26641 ; .... - 26642 DATERR: - 26643 00003324 E852F6 call CRLF2 ;AN028; print out a blank line - 26644 00003327 BA[AD90] mov dx,BADDAT_PTR - 26645 0000332A E8FB20 call std_printf - 26646 0000332D EBEC jmp short GET_NEW_DATE ;AC000; get date again - 26647 - 26648 ; =============== S U B R O U T I N E ======================================= - 26649 - 26650 ; MSDOS 6.0 - 26651 - 26652 ; TIME gets and sets the time - 26653 - 26654 ; **************************************************************** - 26655 ; * - 26656 ; * ROUTINE: TIME - Set system time - 26657 ; * - 26658 ; * FUNCTION: If a time is specified, set the system time, - 26659 ; * otherwise display the current system time and - 26660 ; * prompt the user for a new time. If an invalid - 26661 ; * time is specified, issue an error message and - 26662 ; * prompt for a new time. If the user enters - 26663 ; * nothing when prompted for a time, terminate. - 26664 ; * - 26665 ; * INPUT: command line at offset 81H - 26666 ; * - 26667 ; * OUTPUT: none - 26668 ; * - 26669 ; **************************************************************** - 26670 - 26671 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26672 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:302Dh + 26616 ;AD061; mov word [CurDat_yr],0 ;AC000; reset year, month and day + 26617 ;AD061; mov word [CurDat_mo_day],0 ;AC000; pointers in control block + 26618 + 26619 GET_NEW_DATE: ;AN000; + 26620 0000331B E8BF00 call GETDAT ;AC000; prompt user for date + 26621 + 26622 ; 11/06/2023 + 26623 ;cmp ax,0FFFFh ; -1 + 26624 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 26625 ;je short date_end ;AC000; yes - exit + 26626 ; 26/04/2023 + 26627 ;;cmp ax,0 + 26628 ;;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? + 26629 ;;;jnz short DATERR ;AN000; yes - go issue message + 26630 ;; 27/02/2023 + 26631 ;;jz short COMDAT + 26632 ; 26/04/2023 + 26633 ;and ax,ax ; 0 ? + 26634 ;jz short COMDAT + 26635 + 26636 ; 11/06/2023 + 26637 0000331E 40 inc ax ; cmp ax,-1 + 26638 0000331F 74E6 jz short date_end ; 0FFFFh -> 0 + 26639 00003321 48 dec ax ; cmp ax,0 + 26640 00003322 74BE jz short COMDAT ; 1 -> 0 + 26641 ; ax > 0 + 26642 + 26643 ;COMDAT: + 26644 ; .... + 26645 DATERR: + 26646 00003324 E852F6 call CRLF2 ;AN028; print out a blank line + 26647 00003327 BA[AD90] mov dx,BADDAT_PTR + 26648 0000332A E8FB20 call std_printf + 26649 0000332D EBEC jmp short GET_NEW_DATE ;AC000; get date again + 26650 + 26651 ; =============== S U B R O U T I N E ======================================= + 26652 + 26653 ; MSDOS 6.0 + 26654 + 26655 ; TIME gets and sets the time + 26656 + 26657 ; **************************************************************** + 26658 ; * + 26659 ; * ROUTINE: TIME - Set system time + 26660 ; * + 26661 ; * FUNCTION: If a time is specified, set the system time, + 26662 ; * otherwise display the current system time and + 26663 ; * prompt the user for a new time. If an invalid + 26664 ; * time is specified, issue an error message and + 26665 ; * prompt for a new time. If the user enters + 26666 ; * nothing when prompted for a time, terminate. + 26667 ; * + 26668 ; * INPUT: command line at offset 81H + 26669 ; * + 26670 ; * OUTPUT: none + 26671 ; * + 26672 ; **************************************************************** 26673 - 26674 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26675 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:35D7h + 26674 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26675 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:302Dh 26676 - 26677 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 26678 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3481h - 26679 CTIME: - 26680 0000332F BE8100 mov si,81h ; Accepting argument for time inline - 26681 00003332 BF[6496] mov di,PARSE_TIME ;AN000; Get address of PARSE_time - 26682 00003335 31C9 xor cx,cx ;AN000; clear counter for positionals - 26683 00003337 31D2 xor dx,dx ;AN000; - 26684 00003339 E83016 call cmd_parse ;AC000; call parser - 26685 - 26686 ; 27/02/2023 - 26687 ;cmp ax,-1 - 26688 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 26689 ;je short PRMTTIM ;AC000; yes - prompt for time - 26690 ;;cmp ax,0 - 26691 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? - 26692 ;;jne short TIMERR ;AN000; yes - go issue message - 26693 ;and ax,ax ; ax = 0 ? - 26694 ;jnz short TIMERR - 26695 ;;jmp short COMTIM ;AC000; we have a time - 26696 ; 11/06/2023 - 26697 0000333C 40 inc ax ; cmp ax,-1 - 26698 0000333D 742D jz short PRMTTIM ; 0FFFFh -> 0 - 26699 0000333F 48 dec ax ; cmp ax,0 - 26700 00003340 754A jnz short TIMERR ; 1 -> 0 - 26701 ; ax = 0 - 26702 - 26703 ; 27/02/2023 - 26704 COMTIM: - 26705 00003342 8A2E[FFA5] mov ch,[TIME_HOUR] ;AC000; get parts of time in - 26706 00003346 8A0E[00A6] mov cl,[TIME_MINUTES] ;AC000; cx and dx for set - 26707 0000334A 8A36[01A6] mov dh,[TIME_SECONDS] ;AC000; time function call - 26708 0000334E 8A16[02A6] mov dl,[TIME_FRACTION] ;AC000; - 26709 00003352 51 push cx ;AC000; save time - 26710 00003353 52 push dx ;AC000; - 26711 00003354 B90100 mov cx,1 ;AC000; set 1 positional parm entered - 26712 00003357 31D2 xor dx,dx ;AN029; - 26713 00003359 E81016 call cmd_parse ;AN029; call parser - 26714 0000335C 3CFF cmp al, -1 - 26715 ;cmp al,END_OF_LINE ;AN029; Are we at end of line? - 26716 0000335E 5A pop dx ;AC000; retieve time - 26717 0000335F 59 pop cx ;AC000; - 26718 00003360 752A jnz short TIMERR ;AC000; extra stuff on line - try again - 26719 SAVTIM: - 26720 ;mov ah,SET_TIME - 26721 00003362 B42D mov ah,2Dh - 26722 ;int 21h - 26723 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26724 00003364 E853D2 call int_21h_indirect - 26725 00003367 08C0 or al,al - 26726 00003369 7521 jnz short TIMERR ;AC000; if an error occured, try again - 26727 time_end: - 26728 0000336B C3 retn - 26729 - 26730 PRMTTIM: - 26731 ;Printf "Current time is ... " + 26677 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26678 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:35D7h + 26679 + 26680 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 26681 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3481h + 26682 CTIME: + 26683 0000332F BE8100 mov si,81h ; Accepting argument for time inline + 26684 00003332 BF[6496] mov di,PARSE_TIME ;AN000; Get address of PARSE_time + 26685 00003335 31C9 xor cx,cx ;AN000; clear counter for positionals + 26686 00003337 31D2 xor dx,dx ;AN000; + 26687 00003339 E83016 call cmd_parse ;AC000; call parser + 26688 + 26689 ; 27/02/2023 + 26690 ;cmp ax,-1 + 26691 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 26692 ;je short PRMTTIM ;AC000; yes - prompt for time + 26693 ;;cmp ax,0 + 26694 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? + 26695 ;;jne short TIMERR ;AN000; yes - go issue message + 26696 ;and ax,ax ; ax = 0 ? + 26697 ;jnz short TIMERR + 26698 ;;jmp short COMTIM ;AC000; we have a time + 26699 ; 11/06/2023 + 26700 0000333C 40 inc ax ; cmp ax,-1 + 26701 0000333D 742D jz short PRMTTIM ; 0FFFFh -> 0 + 26702 0000333F 48 dec ax ; cmp ax,0 + 26703 00003340 754A jnz short TIMERR ; 1 -> 0 + 26704 ; ax = 0 + 26705 + 26706 ; 27/02/2023 + 26707 COMTIM: + 26708 00003342 8A2E[FFA5] mov ch,[TIME_HOUR] ;AC000; get parts of time in + 26709 00003346 8A0E[00A6] mov cl,[TIME_MINUTES] ;AC000; cx and dx for set + 26710 0000334A 8A36[01A6] mov dh,[TIME_SECONDS] ;AC000; time function call + 26711 0000334E 8A16[02A6] mov dl,[TIME_FRACTION] ;AC000; + 26712 00003352 51 push cx ;AC000; save time + 26713 00003353 52 push dx ;AC000; + 26714 00003354 B90100 mov cx,1 ;AC000; set 1 positional parm entered + 26715 00003357 31D2 xor dx,dx ;AN029; + 26716 00003359 E81016 call cmd_parse ;AN029; call parser + 26717 0000335C 3CFF cmp al, -1 + 26718 ;cmp al,END_OF_LINE ;AN029; Are we at end of line? + 26719 0000335E 5A pop dx ;AC000; retieve time + 26720 0000335F 59 pop cx ;AC000; + 26721 00003360 752A jnz short TIMERR ;AC000; extra stuff on line - try again + 26722 SAVTIM: + 26723 ;mov ah,SET_TIME + 26724 00003362 B42D mov ah,2Dh + 26725 ;int 21h + 26726 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26727 00003364 E853D2 call int_21h_indirect + 26728 00003367 08C0 or al,al + 26729 00003369 7521 jnz short TIMERR ;AC000; if an error occured, try again + 26730 time_end: + 26731 0000336B C3 retn 26732 - 26733 ;mov ah,Get_Time ;AC000; get the current time - 26734 0000336C B42C mov ah,2Ch - 26735 ;int 21h ;AC000; Get time in CX:DX - 26736 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 26737 0000336E E849D2 call int_21h_indirect - 26738 00003371 86E9 xchg ch,cl ;AN000; switch hours & minutes - 26739 00003373 86F2 xchg dh,dl ;AN000; switch seconds & hundredths - 26740 00003375 890E[E290] mov [CurTim_hr_min],cx ;AC000; put hours and minutes into message subst block - 26741 00003379 8916[E490] mov [CurTim_Sec_hn],dx ;AC000; put seconds and hundredths into message subst block - 26742 0000337D BA[DD90] mov dx,CurTim_Ptr ;AC000; set up message for output - 26743 00003380 E8A520 call std_printf - 26744 - 26745 ;AD061; mov word [CurTim_hr_min],0 ;AC000; reset hour, minutes, seconds, and hundredths - 26746 ;AD061; mov word [CurTim_Sec_hn],0 ;AC000; pointers in control block + 26733 PRMTTIM: + 26734 ;Printf "Current time is ... " + 26735 + 26736 ;mov ah,Get_Time ;AC000; get the current time + 26737 0000336C B42C mov ah,2Ch + 26738 ;int 21h ;AC000; Get time in CX:DX + 26739 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 26740 0000336E E849D2 call int_21h_indirect + 26741 00003371 86E9 xchg ch,cl ;AN000; switch hours & minutes + 26742 00003373 86F2 xchg dh,dl ;AN000; switch seconds & hundredths + 26743 00003375 890E[E290] mov [CurTim_hr_min],cx ;AC000; put hours and minutes into message subst block + 26744 00003379 8916[E490] mov [CurTim_Sec_hn],dx ;AC000; put seconds and hundredths into message subst block + 26745 0000337D BA[DD90] mov dx,CurTim_Ptr ;AC000; set up message for output + 26746 00003380 E8A520 call std_printf 26747 - 26748 GET_NEW_TIME: - 26749 00003383 E8B100 call GETTIM ;AC000; - 26750 - 26751 ; 11/06/2023 - 26752 ;cmp ax,-1 - 26753 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? - 26754 ;je short time_end ;AC000; - 26755 ;;cmp ax,0 - 26756 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? - 26757 ;;jne short TIMERR ;AN000; yes - go issue message - 26758 ;or ax,ax ; ax = 0 ? - 26759 ;;jnz short TIMERR - 26760 ; 27/02/2023 - 26761 ;jz short COMTIM - 26762 - 26763 ; 11/06/2023 - 26764 00003386 40 inc ax ; cmp ax,-1 - 26765 00003387 74E2 jz short time_end ; 0FFFFh -> 0 - 26766 00003389 48 dec ax ; cmp ax,0 - 26767 0000338A 74B6 jz short COMTIM ; 1 -> 0 - 26768 ; ax > 0 - 26769 - 26770 ;COMTIM: - 26771 ; .... - 26772 TIMERR: - 26773 0000338C E8EAF5 call CRLF2 ;AN028; print out a blank line - 26774 0000338F BA[DA90] mov dx,BadTim_Ptr - 26775 00003392 E89320 call std_printf ; Print error message - 26776 00003395 EBEC jmp short GET_NEW_TIME ;AC000; Try again - 26777 - 26778 ; =============== S U B R O U T I N E ======================================= - 26779 - 26780 ; MSDOS 6.0 - 26781 - 26782 ; Set the special flag in the INIT flag to the value in CX. - 26783 - 26784 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26785 SetInitFlag: - 26786 00003397 8E1E[F59B] mov ds,[RESSEG] - 26787 - 26788 0000339B 8026[1203]FD and byte [InitFlag],~INITSPECIAL ; 0FDh ; not initspecial - 26789 ;and byte [InitFlag],0FDh - 26790 000033A0 080E[1203] or byte [InitFlag],cl - 26791 000033A4 0E push cs - 26792 000033A5 1F pop ds - 26793 000033A6 C3 retn - 26794 - 26795 ; =============== S U B R O U T I N E ======================================= - 26796 - 26797 ; MSDOS 6.0 - 26798 - 26799 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26800 PipeOff: - 26801 000033A7 1E push ds - 26802 000033A8 50 push ax - 26803 000033A9 2E8E1E[F59B] mov ds,[cs:RESSEG] - 26804 000033AE 30C0 xor al,al - 26805 000033B0 8606[1303] xchg [PipeFlag],al - 26806 000033B4 08C0 or al,al - 26807 000033B6 7404 jz short PipeOffDone - 26808 000033B8 D02E[9D02] shr byte [EchoFlag],1 - 26809 PipeOffDone: - 26810 000033BC 58 pop ax - 26811 000033BD 1F pop ds - 26812 000033BE C3 retn - 26813 - 26814 ; =============== S U B R O U T I N E ======================================= - 26815 - 26816 ; MSDOS 6.0 - 26817 - 26818 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26819 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26820 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 26821 PRINT_TIME: - 26822 ;mov ah,Get_Time - 26823 000033BF B42C mov ah,2Ch - 26824 ;int 21h ; Get time in CX:DX - 26825 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM - 26826 000033C1 E8F6D1 call int_21h_indirect - 26827 - 26828 000033C4 06 push es - 26829 000033C5 0E push cs - 26830 000033C6 07 pop es - 26831 000033C7 86E9 xchg ch,cl ;AN000; switch hours & minutes - 26832 000033C9 86F2 xchg dh,dl ;AN000; switch seconds & hundredths - 26833 000033CB 2E890E[2492] mov [cs:PromTim_hr_min],cx ;AC000; put hours and minutes into message subst block - 26834 000033D0 2E8916[2692] mov [cs:PromTim_Sec_hn],dx ;AC000; put seconds and hundredths into message subst block - 26835 000033D5 BA[1F92] mov dx,promtim_ptr ;AC000; set up message for output - 26836 000033D8 E84D20 call std_printf - 26837 - 26838 ;AD061; mov word [cs:PromTim_hr_min],0 - 26839 ;AC000; reset hour, minutes, seconds, and hundredths - 26840 ;AD061; mov word [cs:PromTim_Sec_hn],0 - 26841 ;AC000; pointers in control block - 26842 000033DB 07 pop es - 26843 000033DC C3 retn - 26844 - 26845 ; =============== S U B R O U T I N E ======================================= - 26846 - 26847 ; MSDOS 6.0 - 26848 - 26849 ; **************************************************************** - 26850 ; * - 26851 ; * ROUTINE: GETDAT - Prompt user for date - 26852 ; * - 26853 ; * FUNCTION: Gets the date format from the COUNTRY DEPENDENT - 26854 ; * INFORMATION and issues the "Enter new date" - 26855 ; * message with the proper date format. COMBUF - 26856 ; * is reset to get a date from the command line. - 26857 ; * The PARSE_DATE blocks are then reset and the - 26858 ; * PARSE function call is issued. - 26859 ; * - 26860 ; * INPUT: NONE - 26861 ; * - 26862 ; * OUTPUT: COMBUF - 26863 ; * PARSER RETURN CODES + 26748 ;AD061; mov word [CurTim_hr_min],0 ;AC000; reset hour, minutes, seconds, and hundredths + 26749 ;AD061; mov word [CurTim_Sec_hn],0 ;AC000; pointers in control block + 26750 + 26751 GET_NEW_TIME: + 26752 00003383 E8B100 call GETTIM ;AC000; + 26753 + 26754 ; 11/06/2023 + 26755 ;cmp ax,-1 + 26756 ;;cmp ax,END_OF_LINE ;AC000; are we at end of line? + 26757 ;je short time_end ;AC000; + 26758 ;;cmp ax,0 + 26759 ;;cmp ax,RESULT_NO_ERROR ;AN000; did we have an error? + 26760 ;;jne short TIMERR ;AN000; yes - go issue message + 26761 ;or ax,ax ; ax = 0 ? + 26762 ;;jnz short TIMERR + 26763 ; 27/02/2023 + 26764 ;jz short COMTIM + 26765 + 26766 ; 11/06/2023 + 26767 00003386 40 inc ax ; cmp ax,-1 + 26768 00003387 74E2 jz short time_end ; 0FFFFh -> 0 + 26769 00003389 48 dec ax ; cmp ax,0 + 26770 0000338A 74B6 jz short COMTIM ; 1 -> 0 + 26771 ; ax > 0 + 26772 + 26773 ;COMTIM: + 26774 ; .... + 26775 TIMERR: + 26776 0000338C E8EAF5 call CRLF2 ;AN028; print out a blank line + 26777 0000338F BA[DA90] mov dx,BadTim_Ptr + 26778 00003392 E89320 call std_printf ; Print error message + 26779 00003395 EBEC jmp short GET_NEW_TIME ;AC000; Try again + 26780 + 26781 ; =============== S U B R O U T I N E ======================================= + 26782 + 26783 ; MSDOS 6.0 + 26784 + 26785 ; Set the special flag in the INIT flag to the value in CX. + 26786 + 26787 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26788 SetInitFlag: + 26789 00003397 8E1E[F59B] mov ds,[RESSEG] + 26790 + 26791 0000339B 8026[1203]FD and byte [InitFlag],~INITSPECIAL ; 0FDh ; not initspecial + 26792 ;and byte [InitFlag],0FDh + 26793 000033A0 080E[1203] or byte [InitFlag],cl + 26794 000033A4 0E push cs + 26795 000033A5 1F pop ds + 26796 000033A6 C3 retn + 26797 + 26798 ; =============== S U B R O U T I N E ======================================= + 26799 + 26800 ; MSDOS 6.0 + 26801 + 26802 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26803 PipeOff: + 26804 000033A7 1E push ds + 26805 000033A8 50 push ax + 26806 000033A9 2E8E1E[F59B] mov ds,[cs:RESSEG] + 26807 000033AE 30C0 xor al,al + 26808 000033B0 8606[1303] xchg [PipeFlag],al + 26809 000033B4 08C0 or al,al + 26810 000033B6 7404 jz short PipeOffDone + 26811 000033B8 D02E[9D02] shr byte [EchoFlag],1 + 26812 PipeOffDone: + 26813 000033BC 58 pop ax + 26814 000033BD 1F pop ds + 26815 000033BE C3 retn + 26816 + 26817 ; =============== S U B R O U T I N E ======================================= + 26818 + 26819 ; MSDOS 6.0 + 26820 + 26821 ; 27/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26822 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26823 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 26824 PRINT_TIME: + 26825 ;mov ah,Get_Time + 26826 000033BF B42C mov ah,2Ch + 26827 ;int 21h ; Get time in CX:DX + 26828 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM + 26829 000033C1 E8F6D1 call int_21h_indirect + 26830 + 26831 000033C4 06 push es + 26832 000033C5 0E push cs + 26833 000033C6 07 pop es + 26834 000033C7 86E9 xchg ch,cl ;AN000; switch hours & minutes + 26835 000033C9 86F2 xchg dh,dl ;AN000; switch seconds & hundredths + 26836 000033CB 2E890E[2492] mov [cs:PromTim_hr_min],cx ;AC000; put hours and minutes into message subst block + 26837 000033D0 2E8916[2692] mov [cs:PromTim_Sec_hn],dx ;AC000; put seconds and hundredths into message subst block + 26838 000033D5 BA[1F92] mov dx,promtim_ptr ;AC000; set up message for output + 26839 000033D8 E84D20 call std_printf + 26840 + 26841 ;AD061; mov word [cs:PromTim_hr_min],0 + 26842 ;AC000; reset hour, minutes, seconds, and hundredths + 26843 ;AD061; mov word [cs:PromTim_Sec_hn],0 + 26844 ;AC000; pointers in control block + 26845 000033DB 07 pop es + 26846 000033DC C3 retn + 26847 + 26848 ; =============== S U B R O U T I N E ======================================= + 26849 + 26850 ; MSDOS 6.0 + 26851 + 26852 ; **************************************************************** + 26853 ; * + 26854 ; * ROUTINE: GETDAT - Prompt user for date + 26855 ; * + 26856 ; * FUNCTION: Gets the date format from the COUNTRY DEPENDENT + 26857 ; * INFORMATION and issues the "Enter new date" + 26858 ; * message with the proper date format. COMBUF + 26859 ; * is reset to get a date from the command line. + 26860 ; * The PARSE_DATE blocks are then reset and the + 26861 ; * PARSE function call is issued. + 26862 ; * + 26863 ; * INPUT: NONE 26864 ; * - 26865 ; **************************************************************** - 26866 - 26867 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26868 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:30E2h + 26865 ; * OUTPUT: COMBUF + 26866 ; * PARSER RETURN CODES + 26867 ; * + 26868 ; **************************************************************** 26869 - 26870 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26871 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:368Ch + 26870 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26871 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:30E2h 26872 - 26873 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 26874 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3539h - 26875 GETDAT: - 26876 ;mov ax,(International SHL 8) - 26877 000033DD B80038 mov ax,3800h - 26878 ; Determine what format the date - 26879 000033E0 BA5C00 mov dx,5Ch ; should be entered in and - 26880 ;int 21h ; print a message describing it - 26881 ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION - 26882 ; get current-country info - 26883 ; DS:DX -> buffer for returned info - 26884 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM - 26885 000033E3 E8D4D1 call int_21h_indirect - 26886 000033E6 89D6 mov si,dx - 26887 000033E8 AD lodsw - 26888 000033E9 2E8B16[FD91] mov dx,[cs:usadat_ptr] ;AC000; get mm-dd-yy - 26889 000033EE 48 dec ax - 26890 000033EF 780C js short printformat - 26891 000033F1 2E8B16[0092] mov dx,[cs:eurdat_ptr] ;AC000; get dd-mm-yy - 26892 000033F6 7405 jz short printformat - 26893 000033F8 2E8B16[0392] mov dx,[cs:japdat_ptr] ;AC000; get yy-mm-dd - 26894 printformat: - 26895 000033FD 89D0 mov ax,dx ;AN000; get message number of format - 26896 ;mov dh,util_msg_class ;AN000; this is a utility message - 26897 000033FF B6FF mov dh,-1 ; 0FFh - 26898 00003401 E80721 call TSYSGETMSG ;AN000; get the address of the message - 26899 00003404 2E8936[D190] mov [cs:NewDat_Format],si ;AN000; put the address in subst block - 26900 00003409 BA[CC90] mov dx,NewDat_Ptr ;AC000; get address of message to print - 26901 0000340C E81920 call std_printf - 26902 ;mov word [cs:NewDat_Format],no_subst - 26903 ;AN000; reset subst block - 26904 0000340F 2EC706[D190]0000 mov word [cs:NewDat_Format],0 - 26905 - 26906 ; 28/02/2023 - 26907 00003416 BF[5296] mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE - 26908 ; 28/02/2023 - 26909 gettim_p: - 26910 ;mov ah,Std_Con_String_Input - 26911 00003419 B40A mov ah,0Ah - 26912 0000341B BA[549A] mov dx,COMBUF - 26913 0000341E B90200 mov cx,INITSPECIAL ; 2 ; Set bit in InitFlag that indicates - 26914 00003421 E873FF call SetInitFlag ; prompting for date. - 26915 ;int 21h ; Get input line - 26916 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM - 26917 00003424 E893D1 call int_21h_indirect - 26918 00003427 31C9 xor cx,cx ; Reset bit in InitFlag that indicates - 26919 00003429 E86BFF call SetInitFlag ; prompting for date. - 26920 0000342C E84AF5 call CRLF2 - 26921 ; 28/02/2023 - 26922 ;mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE - 26923 ;gettim_p: ; 28/02/2023 - 26924 0000342F BE[569A] mov si,COMBUF+2 - 26925 ;xor cx,cx ; cx = 0 ;AN000; clear counter for positionals - 26926 00003432 31D2 xor dx,dx ;AN000; - 26927 ;call cmd_parse ;AC000; call parser - 26928 ;retn - 26929 ; 28/02/2023 - 26930 00003434 E93515 jmp cmd_parse - 26931 - 26932 ; =============== S U B R O U T I N E ======================================= - 26933 - 26934 ; MSDOS 6.0 - 26935 - 26936 ; **************************************************************** - 26937 ; * - 26938 ; * ROUTINE: GETTIME - Prompt user for time - 26939 ; * - 26940 ; * FUNCTION: Gets the time format from the COUNTRY DEPENDENT - 26941 ; * INFORMATION and issues the "Enter new time" - 26942 ; * message. COMBUF is reset to get a time from the - 26943 ; * command line. The PARSE_TIME blocks are then - 26944 ; * reset and the PARSE function call is issued. - 26945 ; * - 26946 ; * INPUT: NONE - 26947 ; * - 26948 ; * OUTPUT: COMBUF - 26949 ; * PARSER RETURN CODES + 26873 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26874 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:368Ch + 26875 + 26876 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 26877 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3539h + 26878 GETDAT: + 26879 ;mov ax,(International SHL 8) + 26880 000033DD B80038 mov ax,3800h + 26881 ; Determine what format the date + 26882 000033E0 BA5C00 mov dx,5Ch ; should be entered in and + 26883 ;int 21h ; print a message describing it + 26884 ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION + 26885 ; get current-country info + 26886 ; DS:DX -> buffer for returned info + 26887 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM + 26888 000033E3 E8D4D1 call int_21h_indirect + 26889 000033E6 89D6 mov si,dx + 26890 000033E8 AD lodsw + 26891 000033E9 2E8B16[FD91] mov dx,[cs:usadat_ptr] ;AC000; get mm-dd-yy + 26892 000033EE 48 dec ax + 26893 000033EF 780C js short printformat + 26894 000033F1 2E8B16[0092] mov dx,[cs:eurdat_ptr] ;AC000; get dd-mm-yy + 26895 000033F6 7405 jz short printformat + 26896 000033F8 2E8B16[0392] mov dx,[cs:japdat_ptr] ;AC000; get yy-mm-dd + 26897 printformat: + 26898 000033FD 89D0 mov ax,dx ;AN000; get message number of format + 26899 ;mov dh,util_msg_class ;AN000; this is a utility message + 26900 000033FF B6FF mov dh,-1 ; 0FFh + 26901 00003401 E80721 call TSYSGETMSG ;AN000; get the address of the message + 26902 00003404 2E8936[D190] mov [cs:NewDat_Format],si ;AN000; put the address in subst block + 26903 00003409 BA[CC90] mov dx,NewDat_Ptr ;AC000; get address of message to print + 26904 0000340C E81920 call std_printf + 26905 ;mov word [cs:NewDat_Format],no_subst + 26906 ;AN000; reset subst block + 26907 0000340F 2EC706[D190]0000 mov word [cs:NewDat_Format],0 + 26908 + 26909 ; 28/02/2023 + 26910 00003416 BF[5296] mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE + 26911 ; 28/02/2023 + 26912 gettim_p: + 26913 ;mov ah,Std_Con_String_Input + 26914 00003419 B40A mov ah,0Ah + 26915 0000341B BA[549A] mov dx,COMBUF + 26916 0000341E B90200 mov cx,INITSPECIAL ; 2 ; Set bit in InitFlag that indicates + 26917 00003421 E873FF call SetInitFlag ; prompting for date. + 26918 ;int 21h ; Get input line + 26919 ; 08/08/2024 - PCDOS 7.1 COMMAND.COM + 26920 00003424 E893D1 call int_21h_indirect + 26921 00003427 31C9 xor cx,cx ; Reset bit in InitFlag that indicates + 26922 00003429 E86BFF call SetInitFlag ; prompting for date. + 26923 0000342C E84AF5 call CRLF2 + 26924 ; 28/02/2023 + 26925 ;mov di,PARSE_DATE ;AN000; Get address of PARSE_DATE + 26926 ;gettim_p: ; 28/02/2023 + 26927 0000342F BE[569A] mov si,COMBUF+2 + 26928 ;xor cx,cx ; cx = 0 ;AN000; clear counter for positionals + 26929 00003432 31D2 xor dx,dx ;AN000; + 26930 ;call cmd_parse ;AC000; call parser + 26931 ;retn + 26932 ; 28/02/2023 + 26933 00003434 E93515 jmp cmd_parse + 26934 + 26935 ; =============== S U B R O U T I N E ======================================= + 26936 + 26937 ; MSDOS 6.0 + 26938 + 26939 ; **************************************************************** + 26940 ; * + 26941 ; * ROUTINE: GETTIME - Prompt user for time + 26942 ; * + 26943 ; * FUNCTION: Gets the time format from the COUNTRY DEPENDENT + 26944 ; * INFORMATION and issues the "Enter new time" + 26945 ; * message. COMBUF is reset to get a time from the + 26946 ; * command line. The PARSE_TIME blocks are then + 26947 ; * reset and the PARSE function call is issued. + 26948 ; * + 26949 ; * INPUT: NONE 26950 ; * - 26951 ; **************************************************************** - 26952 - 26953 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 26954 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:313Dh + 26951 ; * OUTPUT: COMBUF + 26952 ; * PARSER RETURN CODES + 26953 ; * + 26954 ; **************************************************************** 26955 - 26956 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 26957 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:36E7h + 26956 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 26957 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:313Dh 26958 - 26959 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 26960 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3596h - 26961 GETTIM: - 26962 00003437 31C9 xor cx,cx ; Initialize hours and minutes to zero - 26963 00003439 BA[EB90] mov dx,NewTim_Ptr - 26964 0000343C E8E91F call std_printf - 26965 - 26966 ; 28/02/2023 - 26967 0000343F BF[6496] mov di,PARSE_TIME - 26968 00003442 EBD5 jmp short gettim_p - 26969 - 26970 ; 28/02/2023 - 26971 ; ;mov ah,Std_Con_String_Input - 26972 ; mov ah,0Ah - 26973 ; mov dx,COMBUF - 26974 ; mov cx,INITSPECIAL ; 2 ; Set bit in InitFlag that indicates - 26975 ; call SetInitFlag ; prompting for time. - 26976 ; int 21h ; Get input line - 26977 ; ; 28/02/2023 - 26978 ; xor cx,cx ; Reset bit in InitFlag that indicates - 26979 ; call SetInitFlag ; prompting for time. - 26980 ; call CRLF2 - 26981 ; ; 28/02/2023 - 26982 ; ;mov si,COMBUF+2 - 26983 ; ; 28/02/2023 - 26984 ; mov di,PARSE_TIME ;AN000; Get address of PARSE_TIME - 26985 ; ; 28/02/2023 - 26986 ; jmp short gettim_p - 26987 ; ; 28/02/2023 - 26988 ; ;;xor cx,cx ;AN000; clear counter for positionals - 26989 ; ;xor dx,dx ;AN000; - 26990 ; ;call cmd_parse ;AC000; call parser - 26991 ; ;retn - 26992 - 26993 - 26994 ; =============== S U B R O U T I N E ======================================= + 26959 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 26960 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:36E7h + 26961 + 26962 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 26963 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3596h + 26964 GETTIM: + 26965 00003437 31C9 xor cx,cx ; Initialize hours and minutes to zero + 26966 00003439 BA[EB90] mov dx,NewTim_Ptr + 26967 0000343C E8E91F call std_printf + 26968 + 26969 ; 28/02/2023 + 26970 0000343F BF[6496] mov di,PARSE_TIME + 26971 00003442 EBD5 jmp short gettim_p + 26972 + 26973 ; 28/02/2023 + 26974 ; ;mov ah,Std_Con_String_Input + 26975 ; mov ah,0Ah + 26976 ; mov dx,COMBUF + 26977 ; mov cx,INITSPECIAL ; 2 ; Set bit in InitFlag that indicates + 26978 ; call SetInitFlag ; prompting for time. + 26979 ; int 21h ; Get input line + 26980 ; ; 28/02/2023 + 26981 ; xor cx,cx ; Reset bit in InitFlag that indicates + 26982 ; call SetInitFlag ; prompting for time. + 26983 ; call CRLF2 + 26984 ; ; 28/02/2023 + 26985 ; ;mov si,COMBUF+2 + 26986 ; ; 28/02/2023 + 26987 ; mov di,PARSE_TIME ;AN000; Get address of PARSE_TIME + 26988 ; ; 28/02/2023 + 26989 ; jmp short gettim_p + 26990 ; ; 28/02/2023 + 26991 ; ;;xor cx,cx ;AN000; clear counter for positionals + 26992 ; ;xor dx,dx ;AN000; + 26993 ; ;call cmd_parse ;AC000; call parser + 26994 ; ;retn 26995 - 26996 ; MSDOS 6.0 - 26997 - 26998 ;Skip_white: Skips over the whitespace chars that could be present after - 26999 ;the '=' sign in the environment variable before the actual path. - 27000 ; - 27001 ; ENTRY: ds:si = arguments of the environment variable - 27002 ; - 27003 ; EXIT: ds:si = start of the path - 27004 ; - 27005 ; REGISTERS AFFECTED: ax - 27006 - 27007 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27008 skip_white: - 27009 00003444 FC cld - 27010 skw_lp: - 27011 00003445 AC lodsb - 27012 00003446 3C20 cmp al,' ' ;blank char? - 27013 00003448 74FB jz short skw_lp ;yes, skip it - 27014 0000344A 3C09 cmp al,9 ;tab char? - 27015 0000344C 74F7 jz short skw_lp ;yes, skip it - 27016 0000344E 4E dec si ;point at first non-white - 27017 0000344F C3 retn - 27018 - 27019 ; =============== S U B R O U T I N E ======================================= - 27020 - 27021 ; MSDOS 6.0 - 27022 - 27023 ;Copy_pipe_path: This routine copies the path from the TEMP environment - 27024 ;variable into the path buffers Pipe1 & Pipe2. - 27025 ; - 27026 ; ENTRY: ds:si = path to be copied - 27027 ; es = RESGROUP + 26996 + 26997 ; =============== S U B R O U T I N E ======================================= + 26998 + 26999 ; MSDOS 6.0 + 27000 + 27001 ;Skip_white: Skips over the whitespace chars that could be present after + 27002 ;the '=' sign in the environment variable before the actual path. + 27003 ; + 27004 ; ENTRY: ds:si = arguments of the environment variable + 27005 ; + 27006 ; EXIT: ds:si = start of the path + 27007 ; + 27008 ; REGISTERS AFFECTED: ax + 27009 + 27010 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27011 skip_white: + 27012 00003444 FC cld + 27013 skw_lp: + 27014 00003445 AC lodsb + 27015 00003446 3C20 cmp al,' ' ;blank char? + 27016 00003448 74FB jz short skw_lp ;yes, skip it + 27017 0000344A 3C09 cmp al,9 ;tab char? + 27018 0000344C 74F7 jz short skw_lp ;yes, skip it + 27019 0000344E 4E dec si ;point at first non-white + 27020 0000344F C3 retn + 27021 + 27022 ; =============== S U B R O U T I N E ======================================= + 27023 + 27024 ; MSDOS 6.0 + 27025 + 27026 ;Copy_pipe_path: This routine copies the path from the TEMP environment + 27027 ;variable into the path buffers Pipe1 & Pipe2. 27028 ; - 27029 ; EXIT: Path copied into Pipe1 and Pipe2. - 27030 ; - 27031 ; REGISTERS AFFECTED: si, di, cx, ax - 27032 - 27033 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27034 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3174h + 27029 ; ENTRY: ds:si = path to be copied + 27030 ; es = RESGROUP + 27031 ; + 27032 ; EXIT: Path copied into Pipe1 and Pipe2. + 27033 ; + 27034 ; REGISTERS AFFECTED: si, di, cx, ax 27035 - 27036 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM - 27037 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:371Eh + 27036 ; 28/02/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27037 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3174h 27038 - 27039 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 27040 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:35CEh - 27041 copy_pipe_path: - 27042 00003450 B9FFFF mov cx,0FFFFh ; 65535 - 27043 00003453 30C0 xor al,al - 27044 - 27045 00003455 89F7 mov di,si - 27046 00003457 06 push es ;save es - 27047 00003458 1E push ds - 27048 00003459 07 pop es ;es:di = path to be copied - 27049 - 27050 0000345A FC cld - 27051 0000345B 57 push di - 27052 0000345C F2AE repnz scasb ;look for the null char - 27053 0000345E 5F pop di - 27054 - 27055 0000345F 07 pop es ;es = RESGROUP again - 27056 - 27057 00003460 F7D1 not cx ;length including the null - 27058 - 27059 ;;;;mov di,320h ; MSDOS 5.0 COMMAND.COM ; (RESGROUP:EndInit) - 27060 ;;;mov di,3EAh ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 - 27061 ;;mov di,41Eh ; PCDOS 7.1 COMMAND.COM ; 08/08/2024 - 27062 ;mov di,offset DATARES:Pipe1 - 27063 00003462 BF[1503] mov di,Pipe1 ; (offset RESGROUP:EndInit) - 27064 00003465 57 push di - 27065 00003466 51 push cx - 27066 00003467 F3A4 rep movsb ;copy path into Pipe1 - 27067 00003469 59 pop cx - 27068 0000346A 5F pop di - 27069 - 27070 0000346B 1E push ds - 27071 0000346C 06 push es - 27072 0000346D 1F pop ds ;ds:si = Pipe1 - 27073 0000346E 89FE mov si,di - 27074 ;;;;mov di,36Fh ; MSDOS 5.0 COMMAND.COM ; (RESGROUP:EndInit+79) - 27075 ;;;mov di,439h ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 - 27076 ;;mov di,46Dh ; PCDOS 7.1 COMMAND.COM ; 08/08/2024 - 27077 ;mov di,offset DATARES:Pipe2 ;es:di = Pipe2 - 27078 00003470 BF[6403] mov di,Pipe2 ; (offset RESGROUP:EndInit+79) - 27079 00003473 F3A4 rep movsb ;copy path into Pipe2 - 27080 00003475 1F pop ds - 27081 00003476 C3 retn - 27082 - 27083 ;============================================================================ - 27084 ; PARSE2.ASM, MSDOS 6.0, 1991 - 27085 ;============================================================================ - 27086 ; 03/10/2018 - Retro DOS v3.0 - 27087 - 27088 ;---------------------------------------------------------------------------- - 27089 ; PARSELINE takes an MSDOS command line and maps it into a UNIX-style - 27090 ; argv[argvcnt] array. The most important difference between this array and - 27091 ; the tradition UNIX format is the extra cparse information included with - 27092 ; each argument element. - 27093 ;--------------- - 27094 ; ENTRY: - 27095 ; BL special delimiter for cparse -- not implemented) + 27039 ; 11/06/2023 - Retro DOS v4.2 COMMAND.COM + 27040 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:371Eh + 27041 + 27042 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 27043 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:35CEh + 27044 copy_pipe_path: + 27045 00003450 B9FFFF mov cx,0FFFFh ; 65535 + 27046 00003453 30C0 xor al,al + 27047 + 27048 00003455 89F7 mov di,si + 27049 00003457 06 push es ;save es + 27050 00003458 1E push ds + 27051 00003459 07 pop es ;es:di = path to be copied + 27052 + 27053 0000345A FC cld + 27054 0000345B 57 push di + 27055 0000345C F2AE repnz scasb ;look for the null char + 27056 0000345E 5F pop di + 27057 + 27058 0000345F 07 pop es ;es = RESGROUP again + 27059 + 27060 00003460 F7D1 not cx ;length including the null + 27061 + 27062 ;;;;mov di,320h ; MSDOS 5.0 COMMAND.COM ; (RESGROUP:EndInit) + 27063 ;;;mov di,3EAh ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 + 27064 ;;mov di,41Eh ; PCDOS 7.1 COMMAND.COM ; 08/08/2024 + 27065 ;mov di,offset DATARES:Pipe1 + 27066 00003462 BF[1503] mov di,Pipe1 ; (offset RESGROUP:EndInit) + 27067 00003465 57 push di + 27068 00003466 51 push cx + 27069 00003467 F3A4 rep movsb ;copy path into Pipe1 + 27070 00003469 59 pop cx + 27071 0000346A 5F pop di + 27072 + 27073 0000346B 1E push ds + 27074 0000346C 06 push es + 27075 0000346D 1F pop ds ;ds:si = Pipe1 + 27076 0000346E 89FE mov si,di + 27077 ;;;;mov di,36Fh ; MSDOS 5.0 COMMAND.COM ; (RESGROUP:EndInit+79) + 27078 ;;;mov di,439h ; MSDOS 6.22 COMMAND.COM ; 11/06/2023 + 27079 ;;mov di,46Dh ; PCDOS 7.1 COMMAND.COM ; 08/08/2024 + 27080 ;mov di,offset DATARES:Pipe2 ;es:di = Pipe2 + 27081 00003470 BF[6403] mov di,Pipe2 ; (offset RESGROUP:EndInit+79) + 27082 00003473 F3A4 rep movsb ;copy path into Pipe2 + 27083 00003475 1F pop ds + 27084 00003476 C3 retn + 27085 + 27086 ;============================================================================ + 27087 ; PARSE2.ASM, MSDOS 6.0, 1991 + 27088 ;============================================================================ + 27089 ; 03/10/2018 - Retro DOS v3.0 + 27090 + 27091 ;---------------------------------------------------------------------------- + 27092 ; PARSELINE takes an MSDOS command line and maps it into a UNIX-style + 27093 ; argv[argvcnt] array. The most important difference between this array and + 27094 ; the tradition UNIX format is the extra cparse information included with + 27095 ; each argument element. 27096 ;--------------- - 27097 ; EXIT: - 27098 ; CF set if error - 27099 ; AL error code (carry set). Note AH clobbered in any event. - 27100 ; argv[] array of cparse flags and pointers to arguments - 27101 ; argvcnt argument count - 27102 ;--------------- - 27103 ; NOTE(S): - 27104 ; * BL (special delimiter) is ignored, for now (set to space). - 27105 ; * Parseflags record contains cparse flags, as follows: - 27106 ; sw_flag -- was this arg a switch? - 27107 ; wildcard -- whether or not it contained a * or ? - 27108 ; path_sep -- maybe it was a pathname - 27109 ; unused -- for future expansion - 27110 ; special_delim -- was there an initial special delimiter? - 27111 ; * argv[] and argvcnt are undefined if CF/AL indicates an error. - 27112 ; * Relationship between input, cparse output, and comtail can be - 27113 ; found in the following chart. Despite the claim of the cparse - 27114 ; documentation that, "Token buffer always starts d: for non switch - 27115 ; tokens", such is not the case (see column two, row two). - 27116 ; Similarly, [STARTEL] is not null when the command line is one of - 27117 ; the forms, "d:", "d:\", or "d:/". In fact, *STARTEL (i.e., what - 27118 ; STARTEL addresses) will be null. This is clearly just a - 27119 ; documentation error. - 27120 ; * cparse also returns a switch code in BP for each switch it - 27121 ; recognizes on the command line. - 27122 ; * arglen for each token does NOT include the terminating null. - 27123 ; * Finally, note that interesting constructions like 'foodir/*.exe' - 27124 ; parse as three separate tokens, and the asterisk is NOT a wildcard. - 27125 ; For example, 'for %i in (foodir/*.exe) do echo %i' will first - 27126 ; echo 'foodir', then '*', then '.exe'. Using cparse for command- - 27127 ; line parsing may result in slightly different behavior than - 27128 ; previously observed with the old COMMAND.COM command-line parser. - 27129 ; - 27130 ; Input Cparse Command Line (80H) - 27131 ; \alan\foo.bat c:\alan\foo.bat \alan\foo.bat - 27132 ; alan\foo.bat alan\foo.bat alan\foo.bat - 27133 ; foo.bat foo.bat foo.bat - 27134 ; c:\alan\foo.bat c:\alan\foo.bat c:\alan\foo.bat - 27135 ; c:alan\foo.bat c:alan\foo.bat c:alan\foo.bat - 27136 ; c:foo.bat c:foo.bat c:foo.bat - 27137 - 27138 ; =============== S U B R O U T I N E ======================================= - 27139 - 27140 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 23D0h - 27141 - 27142 ; 01/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27143 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 319Bh + 27097 ; ENTRY: + 27098 ; BL special delimiter for cparse -- not implemented) + 27099 ;--------------- + 27100 ; EXIT: + 27101 ; CF set if error + 27102 ; AL error code (carry set). Note AH clobbered in any event. + 27103 ; argv[] array of cparse flags and pointers to arguments + 27104 ; argvcnt argument count + 27105 ;--------------- + 27106 ; NOTE(S): + 27107 ; * BL (special delimiter) is ignored, for now (set to space). + 27108 ; * Parseflags record contains cparse flags, as follows: + 27109 ; sw_flag -- was this arg a switch? + 27110 ; wildcard -- whether or not it contained a * or ? + 27111 ; path_sep -- maybe it was a pathname + 27112 ; unused -- for future expansion + 27113 ; special_delim -- was there an initial special delimiter? + 27114 ; * argv[] and argvcnt are undefined if CF/AL indicates an error. + 27115 ; * Relationship between input, cparse output, and comtail can be + 27116 ; found in the following chart. Despite the claim of the cparse + 27117 ; documentation that, "Token buffer always starts d: for non switch + 27118 ; tokens", such is not the case (see column two, row two). + 27119 ; Similarly, [STARTEL] is not null when the command line is one of + 27120 ; the forms, "d:", "d:\", or "d:/". In fact, *STARTEL (i.e., what + 27121 ; STARTEL addresses) will be null. This is clearly just a + 27122 ; documentation error. + 27123 ; * cparse also returns a switch code in BP for each switch it + 27124 ; recognizes on the command line. + 27125 ; * arglen for each token does NOT include the terminating null. + 27126 ; * Finally, note that interesting constructions like 'foodir/*.exe' + 27127 ; parse as three separate tokens, and the asterisk is NOT a wildcard. + 27128 ; For example, 'for %i in (foodir/*.exe) do echo %i' will first + 27129 ; echo 'foodir', then '*', then '.exe'. Using cparse for command- + 27130 ; line parsing may result in slightly different behavior than + 27131 ; previously observed with the old COMMAND.COM command-line parser. + 27132 ; + 27133 ; Input Cparse Command Line (80H) + 27134 ; \alan\foo.bat c:\alan\foo.bat \alan\foo.bat + 27135 ; alan\foo.bat alan\foo.bat alan\foo.bat + 27136 ; foo.bat foo.bat foo.bat + 27137 ; c:\alan\foo.bat c:\alan\foo.bat c:\alan\foo.bat + 27138 ; c:alan\foo.bat c:alan\foo.bat c:alan\foo.bat + 27139 ; c:foo.bat c:foo.bat c:foo.bat + 27140 + 27141 ; =============== S U B R O U T I N E ======================================= + 27142 + 27143 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 23D0h 27144 - 27145 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 27146 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3745h + 27145 ; 01/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27146 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 319Bh 27147 - 27148 ; 27/07/2024 - Retro DOS v4.0-v4.1-v4.2-v5.0 COMMAND.COM (PARSELINE) - 27149 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 35F5h + 27148 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 27149 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3745h 27150 - 27151 PARSELINE: - 27152 00003477 50 push ax ; most of these are clobbered - 27153 00003478 53 push bx ; by cparse... - 27154 00003479 51 push cx - 27155 0000347A 52 push dx - 27156 0000347B 57 push di - 27157 0000347C 56 push si - 27158 0000347D 9C pushf - 27159 ;mov byte [cpyflag],0 ; Turn "CPARSE called from COPY flag" off - 27160 0000347E C706[16A4]FFFF mov word [LASTARG],-1 ; last argument at which to accumulate - 27161 00003484 31C0 xor ax,ax - 27162 ;;mov cx,1348 - 27163 ; 27/07/2024 - 27164 ;mov cx,1092 ; PCDOS 7.1 COMMAND.COM - 27165 00003486 B94404 mov cx,ARG_UNIT.SIZE ; 1092 - 27166 00003489 A2[A49D] mov [cpyflag],al ; 0 ; 27/07/2024 - 27167 0000348C BF[509F] mov di,ARG - 27168 0000348F F3AA rep stosb - 27169 ;mov word [ARGBUF_PTR],ARG_ARGBUF - 27170 00003491 C706[94A3][14A2] mov word [ARGBUF_PTR],ARG+ARG_UNIT.argbuf - 27171 ;mov word [ARG_ARGSWINFO],0 ; switch information, and info to date - 27172 ;mov word [ARG+ARG_UNIT.argswinfo],0 - 27173 00003497 A3[12A2] mov [ARG+ARG_UNIT.argswinfo],ax ; 0 ; 27/07/2024 - 27174 ;mov word [ARG_ARGVCNT],0 ; initialize argvcnt/argv[] - 27175 ;mov word [ARG+ARG_UNIT.argvcnt],0 - 27176 0000349A A3[10A2] mov [ARG+ARG_UNIT.argvcnt],ax ; 0 ; 27/07/2024 - 27177 0000349D BE[569A] mov si,COMBUF+2 ; prescan leaves cooked input in combuf - 27178 - 27179 ; This next section of code (up to pcont:) makes sure that si is set up for - 27180 ; parsing. It should point at COMBUF if FORFLAG is set and arg.argforcombuf - 27181 ; otherwise. This is done so that commands can get arg pointers into their - 27182 ; original command line (or an exact copy of it) in arg_ocomptr. - 27183 ; Arg.argforcombuf is used so that the for loop processor will always be able - 27184 ; to get a hold of its original command line; even after COMBUF is blasted by - 27185 ; the command to be repeated or the transient part of command has been - 27186 ; reloaded. - 27187 - 27188 000034A0 1E push ds - 27189 000034A1 8E1E[F59B] mov ds,[RESSEG] - 27190 ;cmp byte [ForFlag],0 - 27191 000034A5 3806[AB02] cmp [ForFlag],al ; 0 ; 27/07/2024 - 27192 000034A9 1F pop ds - 27193 000034AA 7510 jnz short PCONT - 27194 ;mov di,ARG_ARGFORCOMBUF - 27195 000034AC BF[14A3] mov di,ARG+ARG_UNIT.argforcombuf - 27196 000034AF 30ED xor ch,ch - 27197 000034B1 8A0E[559A] mov cl,[COMBUF+1] - 27198 000034B5 FEC1 inc cl - 27199 000034B7 F3A4 rep movsb - 27200 ;mov si,ARG_ARGFORCOMBUF - 27201 000034B9 BE[14A3] mov si,ARG+ARG_UNIT.argforcombuf - 27202 PCONT: - 27203 000034BC BF[96A3] mov di,TPBUF ; destination is temporary token buffer - 27204 000034BF B320 mov bl,' ' ; no special delimiter, for now - 27205 PARSELOOP: - 27206 000034C1 8936[18A4] mov [COMPTR],si ; save ptr into original command buffer - 27207 000034C5 31ED xor bp,bp ; switch information put here by cparse - 27208 000034C7 C606[329F]00 mov byte [expand_star],0 ; don't expand *'s to ?'s - 27209 000034CC E8B7F4 call scanoff ; skip leading blanks... - 27210 000034CF E8D512 call cparse ; byte off a token (args in SI, DI, BL) - 27211 000034D2 730B jnb short MORE_PRSE - 27212 000034D4 09ED or bp,bp ; Check for trailing switch character - 27213 000034D6 7403 jz short PARSEDONE - 27214 000034D8 E81700 call newarg ; We hit CR but BP is non-zero. The - 27215 ; typical cause of this is that a - 27216 ; switch char IMMEDIATELY preceeds - 27217 ; the CR. We have an argument, but it - 27218 ; is sort of an error. - 27219 ;jmp short PARSEDONE ; We're done (found the CR). - 27220 ; 01/03/2023 - 27221 PARSEDONE: - 27222 000034DB 9D popf - 27223 000034DC F8 clc - 27224 000034DD EB0C jmp short PARSE_EXIT - 27225 - 27226 MORE_PRSE: - 27227 000034DF C606[A49D]02 mov byte [cpyflag],2 - 27228 ; tell CPARSE that 1st token is done - 27229 000034E4 E80B00 call newarg ; add to argv array (CX has char count) - 27230 000034E7 73D8 jnb short PARSELOOP ; was everything OK? - 27231 ;jmp short PARSE_ERROR ; NO, it wasn't -- bug out (CF set) - 27232 ; 01/03/2023 - 27233 ;PARSEDONE: - 27234 ;popf - 27235 ;clc - 27236 ;jmp short PARSE_EXIT - 27237 - 27238 PARSE_ERROR: ; error entry (er, exit) point - 27239 000034E9 9D popf - 27240 000034EA F9 stc - 27241 PARSE_EXIT: ; depend on not changing CF - 27242 000034EB 5E pop si - 27243 000034EC 5F pop di - 27244 000034ED 5A pop dx - 27245 000034EE 59 pop cx - 27246 000034EF 5B pop bx - 27247 000034F0 58 pop ax - 27248 000034F1 C3 retn - 27249 - 27250 ; =============== S U B R O U T I N E ======================================= - 27251 - 27252 ; NEWARG adds the supplied argstring and cparse data to arg.argv[]. - 27253 ; - 27254 ; ENTRY: - 27255 ; BH argflags - 27256 ; CX character count in argstring - 27257 ; DI pointer to argstring - 27258 ; comptr ptr to starting loc of current token in original command - 27259 ; [STARTEL] cparse's answer to where the last element starts - 27260 ; EXIT: - 27261 ; argbufptr points to next free section of argbuffer - 27262 ; arg.argbuf contains null-terminated argument strings - 27263 ; arg.argvcnt argument count - 27264 ; arg.argv[] array of flags and pointers - 27265 ; arg.arg_ocomptr ptr to starting loc of current token in original command - 27266 ; CF set if error - 27267 ; AL carry set: error code; otherwise, zero - 27268 - 27269 ; 01/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27270 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 27271 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 27272 newarg: - 27273 000034F2 53 push bx - 27274 000034F3 51 push cx - 27275 000034F4 52 push dx - 27276 000034F5 57 push di - 27277 000034F6 56 push si - 27278 000034F7 9C pushf - 27279 000034F8 E86200 call arg_switch ; if it's a switch, record switch info - 27280 ; LEAVE SWITCH ON COMMAND LINE!! - 27281 ;;;jc short newarg_done ; previous arg's switches -- and leave - 27282 - 27283 ;cmp word [ARG_ARGVCNT],64 ; check to ensure we've not - 27284 000034FB 833E[10A2]40 cmp word [ARG+ARG_UNIT.argvcnt],ARGMAX ; 64 - 27285 00003500 7D50 jge short to_many_args ; exceeded array limits - 27286 00003502 88FE mov dh,bh - 27287 ;mov bx,[ARG_ARGVCNT] ; save argflags - 27288 00003504 8B1E[10A2] mov bx,[ARG+ARG_UNIT.argvcnt] ; argv[argvcnt++] = arg data - 27289 ;inc word [ARG_ARGVCNT] - 27290 00003508 FF06[10A2] inc word [ARG+ARG_UNIT.argvcnt] - 27291 ;mov ax,ARG_ARGV - 27292 0000350C B8[509F] mov ax,ARG+ARG_UNIT.argv - 27293 0000350F E87E00 call argv_calc ; convert offset to pointer - 27294 ;mov [BX].argsw_word,0 ; no switch information, yet... - 27295 ;mov word [bx+7],0 - 27296 00003512 C747070000 mov word [bx+ARGV_ELE.argsw_word],0 - 27297 ;mov [BX].arglen,CX ; argv[argvcnt].arglen = arg length - 27298 ;mov [bx+5],cx - 27299 00003517 894F05 mov [bx+ARGV_ELE.arglen],cx - 27300 ;mov [BX].argflags,DH ; argv[argvcnt].argflags = cparse flags - 27301 ;mov [bx+2],dh - 27302 0000351A 887702 mov [bx+ARGV_ELE.argflags],dh - 27303 0000351D 8B36[94A3] mov si,[ARGBUF_PTR] - 27304 ;mov [BX].argpointer,SI ; argv[argvcnt].argpointer = [argbufptr] - 27305 ;mov [bx+ARGV_ELE.argpointer],si - 27306 00003521 8937 mov [bx],si - 27307 00003523 0336[F69E] add si,[STARTEL] ; save startel from new location - 27308 00003527 29FE sub si,di ; form pointer into argbuf - 27309 ;mov [BX].argstartel,SI ; argv[argvcnt].argstartel = new [STARTEL] - 27310 ;mov [bx+3],si - 27311 00003529 897703 mov [bx+ARGV_ELE.argstartel],si - 27312 0000352C 8B36[18A4] mov si,[COMPTR] - 27313 ;mov [BX].arg_ocomptr,si ; arg_ocomptr = ptr into original com line - 27314 ;mov [bx+9],si - 27315 00003530 897709 mov [bx+ARGV_ELE.arg_ocomptr],si - 27316 00003533 89FE mov si,di ; now save argstring in argbuffer - 27317 00003535 8B3E[94A3] mov di,[ARGBUF_PTR] ; load the argbuf pointer and make - 27318 - 27319 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 27320 ; PCDOS 7.1 COMMAND.COM - 27321 %if 0 - 27322 add di,cx ; sure we're not about to run off - 27323 ;cmp DI,OFFSET TRANGROUP:arg.argbuf+ARGBLEN-1 - 27324 ;;cmp di,ARG_ARGBUF+255 - 27325 ;cmp di,ARG+ARG_UNIT.argbuf+127 - 27326 cmp di,ARG+ARG_UNIT.argbuf+ARGBLEN-1 - 27327 jge short buf_oflow ; the end of the buffer (plus null byte) - 27328 sub di,cx - 27329 %else - 27330 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 27331 ;mov bx,ARG_ARGBUF+127 - 27332 00003539 BB[93A2] mov bx,ARG+ARG_UNIT.argbuf+ARGBLEN-1 - 27333 0000353C 29FB sub bx,di ; sure we're not about to run off - 27334 0000353E 39CB cmp bx,cx - 27335 00003540 7302 jnb short newarg_@ - 27336 00003542 89D9 mov cx,bx - 27337 %endif - 27338 - 27339 newarg_@: ; 27/07/2024 - 27340 00003544 FC cld - 27341 00003545 F3A4 rep movsb - 27342 00003547 B000 mov al,ANULL ; 0 ; tack a null byte on the end - 27343 00003549 AA stosb - 27344 0000354A 893E[94A3] mov [ARGBUF_PTR],di ; update argbufptr after copy - 27345 newarg_done: - 27346 0000354E 9D popf - 27347 0000354F F8 clc - 27348 00003550 EB05 jmp short newarg_exit - 27349 - 27350 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 27351 ; PCDOS 7.1 COMMAND.COM - 27352 %if 0 - 27353 to_many_args: - 27354 mov ax,1 - 27355 jmp short newarg_error - 27356 buf_oflow: - 27357 mov ax,2 - 27358 %else - 27359 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM - 27360 ;buf_oflow: - 27361 ; ; 27/07/2024 - 27362 ; ; PCDOS 7.1 COMMAND.COM - 27363 ; sub di,cx - 27364 ; ;mov cx,ARG_ARGBUF+7Fh - 27365 ; mov cx,ARG+ARG_UNIT.argbuf+ARGBLEN-1 - 27366 ; sub cx,di - 27367 ; jmp short newarg_@ - 27368 to_many_args: - 27369 00003552 B80100 mov ax,1 - 27370 %endif - 27371 - 27372 newarg_error: - 27373 00003555 9D popf - 27374 00003556 F9 stc - 27375 newarg_exit: - 27376 00003557 5E pop si - 27377 00003558 5F pop di - 27378 00003559 5A pop dx - 27379 0000355A 59 pop cx - 27380 0000355B 5B pop bx - 27381 0000355C C3 retn - 27382 - 27383 ; =============== S U B R O U T I N E ======================================= - 27384 - 27385 ; ARG_SWITCH decides if an argument might really be a switch. In the - 27386 ; event that it is, and we can recognize - 27387 ; - 27388 ; ENTRY: - 27389 ; As in . - 27390 ; EXIT: - 27391 ; CF -- clear (wasn't a switch); set (was a switch) - 27392 ; NOTE(S): - 27393 ; * The mechanism mapping a switch into a bit-value depends entirely - 27394 ; on the order of definition in the variable and the - 27395 ; values chosen to define the bits in CMDT:COMEQU.ASM. Change either - 27396 ; or the definitions in CMDT:COMEQU.ASM -- and rewrite - 27397 ; this mechanism. This code taken from CMDT:TCODE.ASM. - 27398 ; * The declared below is redundant to one declared in - 27399 ; TDATA.ASM, and used in TCODE.ASM. - 27400 ; * An ugly routine. - 27401 - 27402 ; 01/03/2023 - Retro DOS v4.0 COMMAND.COM - 27403 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 27404 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 27405 arg_switch: - 27406 0000355D 50 push ax - 27407 0000355E 53 push bx - 27408 0000355F 51 push cx - 27409 00003560 57 push di - 27410 00003561 9C pushf - 27411 00003562 F6C701 test bh,1 ; sw_flag ; is it a switch? (preserve flag word) - 27412 00003565 741C jz short arg_no_switch0 - 27413 00003567 833E[16A4]FF cmp word [LASTARG],-1 ; have we encountered any REAL args yet? - 27414 0000356C 741B je short arg_no_switch1 ; no, so leading switches don't matter - 27415 0000356E 8B1E[16A4] mov bx,[LASTARG] ; yes, add switch info to last REAL arg - 27416 ;mov ax,offset TRANGROUP:arg.argv - 27417 ;mov ax,ARG_ARGV - 27418 00003572 B8[509F] mov ax,ARG+ARG_UNIT.argv ; ARG+0 - 27419 00003575 E81800 call argv_calc - 27420 ;or [BX].argsw_word,BP - 27421 ;or [bx+7],bp - 27422 00003578 096F07 or [bx+ARGV_ELE.argsw_word],bp - 27423 ;or arg.argswinfo,BP - 27424 ;or [ARG_ARGSWINFO],bp - 27425 0000357B 092E[12A2] or [ARG+ARG_UNIT.argswinfo],bp - 27426 arg_yes_switch: - 27427 0000357F 9D popf - 27428 00003580 F9 stc - 27429 00003581 EB08 jmp short arg_switch_exit - 27430 - 27431 arg_no_switch0: - 27432 ;mov ax,[ARG_ARGVCNT] - 27433 00003583 A1[10A2] mov ax,[ARG+ARG_UNIT.argvcnt] - 27434 00003586 A3[16A4] mov [LASTARG],ax - 27435 arg_no_switch1: - 27436 00003589 9D popf - 27437 0000358A F8 clc - 27438 arg_switch_exit: - 27439 0000358B 5F pop di - 27440 0000358C 59 pop cx - 27441 0000358D 5B pop bx - 27442 0000358E 58 pop ax - 27443 0000358F C3 retn - 27444 - 27445 ; =============== S U B R O U T I N E ======================================= - 27446 - 27447 ; ARGV_CALC maps an array index into a byte-offset from the base of - 27448 ; the supplied array. Method used for computing the address is: - 27449 ; Array Index * Array Elt Size + Base Addr = Elt Addr - 27450 ; ENTRY: - 27451 ; AX -- base of array - 27452 ; BX -- array index - 27453 ; EXIT: - 27454 ; BX -- byte offset - 27455 - 27456 ; 01/03/2023 - Retro DOS v4.0 COMMAND.COM - 27457 argv_calc: - 27458 00003590 50 push ax ; Save base - 27459 00003591 88D8 mov al,bl ; al = array index - 27460 ;mov bl,11 - 27461 00003593 B30B mov bl,ARGV_ELE.SIZE ; bl = size of an argv element - 27462 00003595 F6E3 mul bl ; ax = base offset - 27463 00003597 5B pop bx ; Get base - 27464 00003598 01D8 add ax,bx ; Add in base offset - 27465 0000359A 93 xchg ax,bx ; Restore ax and put byte offset in bx - 27466 0000359B C3 retn - 27467 - 27468 ; --------------------------------------------------------------------------- - 27469 - 27470 ;db 0Ah dup(0) - 27471 ;times 10 db 0 - 27472 - 27473 0000359C 90 align 16 - 27474 - 27475 ;============================================================================ - 27476 ; PATH1.ASM, MSDOS 6.0, 1991 - 27477 ;============================================================================ - 27478 ; 03/10/2018 - Retro DOS v3.0 - 27479 - 27480 ;---------------------------------------------------------------------------- - 27481 ; PATH.ASM contains the routines to perform pathname incovation. Path and - 27482 ; Parse share a temporary buffer and argv[] definitions. , - 27483 ; given a pathname, attempts to find a corresponding executable or batch - 27484 ; file on disk. Directories specified in the user's search path will be - 27485 ; searched for a matching file, if a match is not found in the current - 27486 ; directory and if the pathname is actually only an MSDOS filename. - 27487 ; assumes that the parsed command name can be found in - 27488 ; argv[0] -- in other words, should be executed prior to - 27489 ; . Alternatively, the command name and appropriate - 27490 ; information could be placed in argv[0], or could be - 27491 ; (easily) modified to make no assumptions about where its input is found. - 27492 ; Please find enclosed yet another important routine, , which - 27493 ; places the entire arg/argv[]/argbuf structure on a piece of newly - 27494 ; allocated memory. This is handy for for-loop processing, and anything - 27495 ; else that wants to save the whole shebang and then process other command - 27496 ; lines. - 27497 ; - 27498 ; Alan L, OS/MSDOS August 15, 1983 - 27499 ; - 27500 ; ENTRY: - 27501 ; : argv[0]. - 27502 ; : bytes to allocate in addition to arg structure - 27503 ; EXIT: - 27504 ; : success flag, best pathname match in EXECPATH. - 27505 ; : success flag, segment address of new memory - 27506 ; NOTE(S): - 27507 ; * handily turns an array index into an absolute pointer. - 27508 ; The computation depends on the size of an argv[] element (arg_ele). - 27509 ; * calls for chunks of the command line. - 27510 ; does not function as specified; see for more details. - 27511 ; * now knows about the flags the internals of COMMAND.COM - 27512 ; need to know about. This extra information is stored in a switch_flag - 27513 ; word with each command-line argument; the switches themselves will not - 27514 ; appear in the resulting arg structure. - 27515 ; * With the exception of CARRY, flags are generally preserved across calls. - 27516 ;---------------------------------------------------------------------------- - 27517 - 27518 ; =============== S U B R O U T I N E ======================================= - 27519 - 27520 ; PATH_SEARCH tries to find the file it's given, somewhere. An initial value - 27521 ; of *argv[0].argstartel == 0 implies that there is no command (empty line - 27522 ; or 'd:' or 'd:/'). This check is done in strip; otherwise, strip formats - 27523 ; the filename/pathname into tpbuf. Search(tpbuf) is executed to see if we - 27524 ; have a match, either in the current working directory if we were handed - 27525 ; a filename, or in the specified directory, given a pathname. If this call - 27526 ; fails, and we were given a pathname, then Path_Search fails. Otherwise, - 27527 ; Path_Crunch is repeatedly invoked on tpbuf[STARTEL] (if there's a drive - 27528 ; prefix, we want to skip it) for each pathstring in userpath. Success on - 27529 ; either the first invocation of search or on one of the succeeding calls - 27530 ; sets up the appropriate information for copying the successful pathname - 27531 ; prefix (if any) into the result buffer, followed by the successful filename - 27532 ; match (from [search_best_buf]). The result is returned in in EXECPATH. - 27533 ; - 27534 ; ENTRY: - 27535 ; argv[0] -- command name and associated information - 27536 ; EXIT: - 27537 ; AX -- non-zero indicates type of file found - 27538 ; EXECPATH -- successful pathname (AX non-zero) - 27539 ; NOTE(S): - 27540 ; 1) Uses the temporary buffer, tpbuf, from the parse routines. - 27541 ; 2) Some files are more equal than others. See search: for rankings. - 27542 ; 3) Path_Search terminates as soon as a call to search succeeds, even - 27543 ; if search returns an .exe or .bat. - 27544 ; 5) Clobbers dma address. - 27545 - 27546 ;PBUFLEN EQU 128 ; length of EXECPATH - 27547 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 27548 PBUFLEN EQU 256 - 27549 PATH_SEP_CHAR EQU ';' - 27550 - 27551 ;parseflags RECORD special_delim:1, unused:4, path_sep:1, wildcard:1, sw_flag:1 - 27552 - 27553 ;special_delim equ 128 - 27554 ;path_sep equ 4 - 27555 ;wildcard equ 2 - 27556 ;sw_flag equ 1 - 27557 - 27558 ;---------------------------------------------------------------------------- - 27559 - 27560 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2510h - 27561 - 27562 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27563 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 32D1h + 27151 ; 27/07/2024 - Retro DOS v4.0-v4.1-v4.2-v5.0 COMMAND.COM (PARSELINE) + 27152 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 35F5h + 27153 + 27154 PARSELINE: + 27155 00003477 50 push ax ; most of these are clobbered + 27156 00003478 53 push bx ; by cparse... + 27157 00003479 51 push cx + 27158 0000347A 52 push dx + 27159 0000347B 57 push di + 27160 0000347C 56 push si + 27161 0000347D 9C pushf + 27162 ;mov byte [cpyflag],0 ; Turn "CPARSE called from COPY flag" off + 27163 0000347E C706[16A4]FFFF mov word [LASTARG],-1 ; last argument at which to accumulate + 27164 00003484 31C0 xor ax,ax + 27165 ;;mov cx,1348 + 27166 ; 27/07/2024 + 27167 ;mov cx,1092 ; PCDOS 7.1 COMMAND.COM + 27168 00003486 B94404 mov cx,ARG_UNIT.SIZE ; 1092 + 27169 00003489 A2[A49D] mov [cpyflag],al ; 0 ; 27/07/2024 + 27170 0000348C BF[509F] mov di,ARG + 27171 0000348F F3AA rep stosb + 27172 ;mov word [ARGBUF_PTR],ARG_ARGBUF + 27173 00003491 C706[94A3][14A2] mov word [ARGBUF_PTR],ARG+ARG_UNIT.argbuf + 27174 ;mov word [ARG_ARGSWINFO],0 ; switch information, and info to date + 27175 ;mov word [ARG+ARG_UNIT.argswinfo],0 + 27176 00003497 A3[12A2] mov [ARG+ARG_UNIT.argswinfo],ax ; 0 ; 27/07/2024 + 27177 ;mov word [ARG_ARGVCNT],0 ; initialize argvcnt/argv[] + 27178 ;mov word [ARG+ARG_UNIT.argvcnt],0 + 27179 0000349A A3[10A2] mov [ARG+ARG_UNIT.argvcnt],ax ; 0 ; 27/07/2024 + 27180 0000349D BE[569A] mov si,COMBUF+2 ; prescan leaves cooked input in combuf + 27181 + 27182 ; This next section of code (up to pcont:) makes sure that si is set up for + 27183 ; parsing. It should point at COMBUF if FORFLAG is set and arg.argforcombuf + 27184 ; otherwise. This is done so that commands can get arg pointers into their + 27185 ; original command line (or an exact copy of it) in arg_ocomptr. + 27186 ; Arg.argforcombuf is used so that the for loop processor will always be able + 27187 ; to get a hold of its original command line; even after COMBUF is blasted by + 27188 ; the command to be repeated or the transient part of command has been + 27189 ; reloaded. + 27190 + 27191 000034A0 1E push ds + 27192 000034A1 8E1E[F59B] mov ds,[RESSEG] + 27193 ;cmp byte [ForFlag],0 + 27194 000034A5 3806[AB02] cmp [ForFlag],al ; 0 ; 27/07/2024 + 27195 000034A9 1F pop ds + 27196 000034AA 7510 jnz short PCONT + 27197 ;mov di,ARG_ARGFORCOMBUF + 27198 000034AC BF[14A3] mov di,ARG+ARG_UNIT.argforcombuf + 27199 000034AF 30ED xor ch,ch + 27200 000034B1 8A0E[559A] mov cl,[COMBUF+1] + 27201 000034B5 FEC1 inc cl + 27202 000034B7 F3A4 rep movsb + 27203 ;mov si,ARG_ARGFORCOMBUF + 27204 000034B9 BE[14A3] mov si,ARG+ARG_UNIT.argforcombuf + 27205 PCONT: + 27206 000034BC BF[96A3] mov di,TPBUF ; destination is temporary token buffer + 27207 000034BF B320 mov bl,' ' ; no special delimiter, for now + 27208 PARSELOOP: + 27209 000034C1 8936[18A4] mov [COMPTR],si ; save ptr into original command buffer + 27210 000034C5 31ED xor bp,bp ; switch information put here by cparse + 27211 000034C7 C606[329F]00 mov byte [expand_star],0 ; don't expand *'s to ?'s + 27212 000034CC E8B7F4 call scanoff ; skip leading blanks... + 27213 000034CF E8D512 call cparse ; byte off a token (args in SI, DI, BL) + 27214 000034D2 730B jnb short MORE_PRSE + 27215 000034D4 09ED or bp,bp ; Check for trailing switch character + 27216 000034D6 7403 jz short PARSEDONE + 27217 000034D8 E81700 call newarg ; We hit CR but BP is non-zero. The + 27218 ; typical cause of this is that a + 27219 ; switch char IMMEDIATELY preceeds + 27220 ; the CR. We have an argument, but it + 27221 ; is sort of an error. + 27222 ;jmp short PARSEDONE ; We're done (found the CR). + 27223 ; 01/03/2023 + 27224 PARSEDONE: + 27225 000034DB 9D popf + 27226 000034DC F8 clc + 27227 000034DD EB0C jmp short PARSE_EXIT + 27228 + 27229 MORE_PRSE: + 27230 000034DF C606[A49D]02 mov byte [cpyflag],2 + 27231 ; tell CPARSE that 1st token is done + 27232 000034E4 E80B00 call newarg ; add to argv array (CX has char count) + 27233 000034E7 73D8 jnb short PARSELOOP ; was everything OK? + 27234 ;jmp short PARSE_ERROR ; NO, it wasn't -- bug out (CF set) + 27235 ; 01/03/2023 + 27236 ;PARSEDONE: + 27237 ;popf + 27238 ;clc + 27239 ;jmp short PARSE_EXIT + 27240 + 27241 PARSE_ERROR: ; error entry (er, exit) point + 27242 000034E9 9D popf + 27243 000034EA F9 stc + 27244 PARSE_EXIT: ; depend on not changing CF + 27245 000034EB 5E pop si + 27246 000034EC 5F pop di + 27247 000034ED 5A pop dx + 27248 000034EE 59 pop cx + 27249 000034EF 5B pop bx + 27250 000034F0 58 pop ax + 27251 000034F1 C3 retn + 27252 + 27253 ; =============== S U B R O U T I N E ======================================= + 27254 + 27255 ; NEWARG adds the supplied argstring and cparse data to arg.argv[]. + 27256 ; + 27257 ; ENTRY: + 27258 ; BH argflags + 27259 ; CX character count in argstring + 27260 ; DI pointer to argstring + 27261 ; comptr ptr to starting loc of current token in original command + 27262 ; [STARTEL] cparse's answer to where the last element starts + 27263 ; EXIT: + 27264 ; argbufptr points to next free section of argbuffer + 27265 ; arg.argbuf contains null-terminated argument strings + 27266 ; arg.argvcnt argument count + 27267 ; arg.argv[] array of flags and pointers + 27268 ; arg.arg_ocomptr ptr to starting loc of current token in original command + 27269 ; CF set if error + 27270 ; AL carry set: error code; otherwise, zero + 27271 + 27272 ; 01/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27273 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 27274 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 27275 newarg: + 27276 000034F2 53 push bx + 27277 000034F3 51 push cx + 27278 000034F4 52 push dx + 27279 000034F5 57 push di + 27280 000034F6 56 push si + 27281 000034F7 9C pushf + 27282 000034F8 E86200 call arg_switch ; if it's a switch, record switch info + 27283 ; LEAVE SWITCH ON COMMAND LINE!! + 27284 ;;;jc short newarg_done ; previous arg's switches -- and leave + 27285 + 27286 ;cmp word [ARG_ARGVCNT],64 ; check to ensure we've not + 27287 000034FB 833E[10A2]40 cmp word [ARG+ARG_UNIT.argvcnt],ARGMAX ; 64 + 27288 00003500 7D50 jge short to_many_args ; exceeded array limits + 27289 00003502 88FE mov dh,bh + 27290 ;mov bx,[ARG_ARGVCNT] ; save argflags + 27291 00003504 8B1E[10A2] mov bx,[ARG+ARG_UNIT.argvcnt] ; argv[argvcnt++] = arg data + 27292 ;inc word [ARG_ARGVCNT] + 27293 00003508 FF06[10A2] inc word [ARG+ARG_UNIT.argvcnt] + 27294 ;mov ax,ARG_ARGV + 27295 0000350C B8[509F] mov ax,ARG+ARG_UNIT.argv + 27296 0000350F E87E00 call argv_calc ; convert offset to pointer + 27297 ;mov [BX].argsw_word,0 ; no switch information, yet... + 27298 ;mov word [bx+7],0 + 27299 00003512 C747070000 mov word [bx+ARGV_ELE.argsw_word],0 + 27300 ;mov [BX].arglen,CX ; argv[argvcnt].arglen = arg length + 27301 ;mov [bx+5],cx + 27302 00003517 894F05 mov [bx+ARGV_ELE.arglen],cx + 27303 ;mov [BX].argflags,DH ; argv[argvcnt].argflags = cparse flags + 27304 ;mov [bx+2],dh + 27305 0000351A 887702 mov [bx+ARGV_ELE.argflags],dh + 27306 0000351D 8B36[94A3] mov si,[ARGBUF_PTR] + 27307 ;mov [BX].argpointer,SI ; argv[argvcnt].argpointer = [argbufptr] + 27308 ;mov [bx+ARGV_ELE.argpointer],si + 27309 00003521 8937 mov [bx],si + 27310 00003523 0336[F69E] add si,[STARTEL] ; save startel from new location + 27311 00003527 29FE sub si,di ; form pointer into argbuf + 27312 ;mov [BX].argstartel,SI ; argv[argvcnt].argstartel = new [STARTEL] + 27313 ;mov [bx+3],si + 27314 00003529 897703 mov [bx+ARGV_ELE.argstartel],si + 27315 0000352C 8B36[18A4] mov si,[COMPTR] + 27316 ;mov [BX].arg_ocomptr,si ; arg_ocomptr = ptr into original com line + 27317 ;mov [bx+9],si + 27318 00003530 897709 mov [bx+ARGV_ELE.arg_ocomptr],si + 27319 00003533 89FE mov si,di ; now save argstring in argbuffer + 27320 00003535 8B3E[94A3] mov di,[ARGBUF_PTR] ; load the argbuf pointer and make + 27321 + 27322 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 27323 ; PCDOS 7.1 COMMAND.COM + 27324 %if 0 + 27325 add di,cx ; sure we're not about to run off + 27326 ;cmp DI,OFFSET TRANGROUP:arg.argbuf+ARGBLEN-1 + 27327 ;;cmp di,ARG_ARGBUF+255 + 27328 ;cmp di,ARG+ARG_UNIT.argbuf+127 + 27329 cmp di,ARG+ARG_UNIT.argbuf+ARGBLEN-1 + 27330 jge short buf_oflow ; the end of the buffer (plus null byte) + 27331 sub di,cx + 27332 %else + 27333 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 27334 ;mov bx,ARG_ARGBUF+127 + 27335 00003539 BB[93A2] mov bx,ARG+ARG_UNIT.argbuf+ARGBLEN-1 + 27336 0000353C 29FB sub bx,di ; sure we're not about to run off + 27337 0000353E 39CB cmp bx,cx + 27338 00003540 7302 jnb short newarg_@ + 27339 00003542 89D9 mov cx,bx + 27340 %endif + 27341 + 27342 newarg_@: ; 27/07/2024 + 27343 00003544 FC cld + 27344 00003545 F3A4 rep movsb + 27345 00003547 B000 mov al,ANULL ; 0 ; tack a null byte on the end + 27346 00003549 AA stosb + 27347 0000354A 893E[94A3] mov [ARGBUF_PTR],di ; update argbufptr after copy + 27348 newarg_done: + 27349 0000354E 9D popf + 27350 0000354F F8 clc + 27351 00003550 EB05 jmp short newarg_exit + 27352 + 27353 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 27354 ; PCDOS 7.1 COMMAND.COM + 27355 %if 0 + 27356 to_many_args: + 27357 mov ax,1 + 27358 jmp short newarg_error + 27359 buf_oflow: + 27360 mov ax,2 + 27361 %else + 27362 ; 27/07/2024 - Retro DOS v5.0 COMMAND.COM + 27363 ;buf_oflow: + 27364 ; ; 27/07/2024 + 27365 ; ; PCDOS 7.1 COMMAND.COM + 27366 ; sub di,cx + 27367 ; ;mov cx,ARG_ARGBUF+7Fh + 27368 ; mov cx,ARG+ARG_UNIT.argbuf+ARGBLEN-1 + 27369 ; sub cx,di + 27370 ; jmp short newarg_@ + 27371 to_many_args: + 27372 00003552 B80100 mov ax,1 + 27373 %endif + 27374 + 27375 newarg_error: + 27376 00003555 9D popf + 27377 00003556 F9 stc + 27378 newarg_exit: + 27379 00003557 5E pop si + 27380 00003558 5F pop di + 27381 00003559 5A pop dx + 27382 0000355A 59 pop cx + 27383 0000355B 5B pop bx + 27384 0000355C C3 retn + 27385 + 27386 ; =============== S U B R O U T I N E ======================================= + 27387 + 27388 ; ARG_SWITCH decides if an argument might really be a switch. In the + 27389 ; event that it is, and we can recognize + 27390 ; + 27391 ; ENTRY: + 27392 ; As in . + 27393 ; EXIT: + 27394 ; CF -- clear (wasn't a switch); set (was a switch) + 27395 ; NOTE(S): + 27396 ; * The mechanism mapping a switch into a bit-value depends entirely + 27397 ; on the order of definition in the variable and the + 27398 ; values chosen to define the bits in CMDT:COMEQU.ASM. Change either + 27399 ; or the definitions in CMDT:COMEQU.ASM -- and rewrite + 27400 ; this mechanism. This code taken from CMDT:TCODE.ASM. + 27401 ; * The declared below is redundant to one declared in + 27402 ; TDATA.ASM, and used in TCODE.ASM. + 27403 ; * An ugly routine. + 27404 + 27405 ; 01/03/2023 - Retro DOS v4.0 COMMAND.COM + 27406 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 27407 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 27408 arg_switch: + 27409 0000355D 50 push ax + 27410 0000355E 53 push bx + 27411 0000355F 51 push cx + 27412 00003560 57 push di + 27413 00003561 9C pushf + 27414 00003562 F6C701 test bh,1 ; sw_flag ; is it a switch? (preserve flag word) + 27415 00003565 741C jz short arg_no_switch0 + 27416 00003567 833E[16A4]FF cmp word [LASTARG],-1 ; have we encountered any REAL args yet? + 27417 0000356C 741B je short arg_no_switch1 ; no, so leading switches don't matter + 27418 0000356E 8B1E[16A4] mov bx,[LASTARG] ; yes, add switch info to last REAL arg + 27419 ;mov ax,offset TRANGROUP:arg.argv + 27420 ;mov ax,ARG_ARGV + 27421 00003572 B8[509F] mov ax,ARG+ARG_UNIT.argv ; ARG+0 + 27422 00003575 E81800 call argv_calc + 27423 ;or [BX].argsw_word,BP + 27424 ;or [bx+7],bp + 27425 00003578 096F07 or [bx+ARGV_ELE.argsw_word],bp + 27426 ;or arg.argswinfo,BP + 27427 ;or [ARG_ARGSWINFO],bp + 27428 0000357B 092E[12A2] or [ARG+ARG_UNIT.argswinfo],bp + 27429 arg_yes_switch: + 27430 0000357F 9D popf + 27431 00003580 F9 stc + 27432 00003581 EB08 jmp short arg_switch_exit + 27433 + 27434 arg_no_switch0: + 27435 ;mov ax,[ARG_ARGVCNT] + 27436 00003583 A1[10A2] mov ax,[ARG+ARG_UNIT.argvcnt] + 27437 00003586 A3[16A4] mov [LASTARG],ax + 27438 arg_no_switch1: + 27439 00003589 9D popf + 27440 0000358A F8 clc + 27441 arg_switch_exit: + 27442 0000358B 5F pop di + 27443 0000358C 59 pop cx + 27444 0000358D 5B pop bx + 27445 0000358E 58 pop ax + 27446 0000358F C3 retn + 27447 + 27448 ; =============== S U B R O U T I N E ======================================= + 27449 + 27450 ; ARGV_CALC maps an array index into a byte-offset from the base of + 27451 ; the supplied array. Method used for computing the address is: + 27452 ; Array Index * Array Elt Size + Base Addr = Elt Addr + 27453 ; ENTRY: + 27454 ; AX -- base of array + 27455 ; BX -- array index + 27456 ; EXIT: + 27457 ; BX -- byte offset + 27458 + 27459 ; 01/03/2023 - Retro DOS v4.0 COMMAND.COM + 27460 argv_calc: + 27461 00003590 50 push ax ; Save base + 27462 00003591 88D8 mov al,bl ; al = array index + 27463 ;mov bl,11 + 27464 00003593 B30B mov bl,ARGV_ELE.SIZE ; bl = size of an argv element + 27465 00003595 F6E3 mul bl ; ax = base offset + 27466 00003597 5B pop bx ; Get base + 27467 00003598 01D8 add ax,bx ; Add in base offset + 27468 0000359A 93 xchg ax,bx ; Restore ax and put byte offset in bx + 27469 0000359B C3 retn + 27470 + 27471 ; --------------------------------------------------------------------------- + 27472 + 27473 ;db 0Ah dup(0) + 27474 ;times 10 db 0 + 27475 + 27476 0000359C 90 align 16 + 27477 + 27478 ;============================================================================ + 27479 ; PATH1.ASM, MSDOS 6.0, 1991 + 27480 ;============================================================================ + 27481 ; 03/10/2018 - Retro DOS v3.0 + 27482 + 27483 ;---------------------------------------------------------------------------- + 27484 ; PATH.ASM contains the routines to perform pathname incovation. Path and + 27485 ; Parse share a temporary buffer and argv[] definitions. , + 27486 ; given a pathname, attempts to find a corresponding executable or batch + 27487 ; file on disk. Directories specified in the user's search path will be + 27488 ; searched for a matching file, if a match is not found in the current + 27489 ; directory and if the pathname is actually only an MSDOS filename. + 27490 ; assumes that the parsed command name can be found in + 27491 ; argv[0] -- in other words, should be executed prior to + 27492 ; . Alternatively, the command name and appropriate + 27493 ; information could be placed in argv[0], or could be + 27494 ; (easily) modified to make no assumptions about where its input is found. + 27495 ; Please find enclosed yet another important routine, , which + 27496 ; places the entire arg/argv[]/argbuf structure on a piece of newly + 27497 ; allocated memory. This is handy for for-loop processing, and anything + 27498 ; else that wants to save the whole shebang and then process other command + 27499 ; lines. + 27500 ; + 27501 ; Alan L, OS/MSDOS August 15, 1983 + 27502 ; + 27503 ; ENTRY: + 27504 ; : argv[0]. + 27505 ; : bytes to allocate in addition to arg structure + 27506 ; EXIT: + 27507 ; : success flag, best pathname match in EXECPATH. + 27508 ; : success flag, segment address of new memory + 27509 ; NOTE(S): + 27510 ; * handily turns an array index into an absolute pointer. + 27511 ; The computation depends on the size of an argv[] element (arg_ele). + 27512 ; * calls for chunks of the command line. + 27513 ; does not function as specified; see for more details. + 27514 ; * now knows about the flags the internals of COMMAND.COM + 27515 ; need to know about. This extra information is stored in a switch_flag + 27516 ; word with each command-line argument; the switches themselves will not + 27517 ; appear in the resulting arg structure. + 27518 ; * With the exception of CARRY, flags are generally preserved across calls. + 27519 ;---------------------------------------------------------------------------- + 27520 + 27521 ; =============== S U B R O U T I N E ======================================= + 27522 + 27523 ; PATH_SEARCH tries to find the file it's given, somewhere. An initial value + 27524 ; of *argv[0].argstartel == 0 implies that there is no command (empty line + 27525 ; or 'd:' or 'd:/'). This check is done in strip; otherwise, strip formats + 27526 ; the filename/pathname into tpbuf. Search(tpbuf) is executed to see if we + 27527 ; have a match, either in the current working directory if we were handed + 27528 ; a filename, or in the specified directory, given a pathname. If this call + 27529 ; fails, and we were given a pathname, then Path_Search fails. Otherwise, + 27530 ; Path_Crunch is repeatedly invoked on tpbuf[STARTEL] (if there's a drive + 27531 ; prefix, we want to skip it) for each pathstring in userpath. Success on + 27532 ; either the first invocation of search or on one of the succeeding calls + 27533 ; sets up the appropriate information for copying the successful pathname + 27534 ; prefix (if any) into the result buffer, followed by the successful filename + 27535 ; match (from [search_best_buf]). The result is returned in in EXECPATH. + 27536 ; + 27537 ; ENTRY: + 27538 ; argv[0] -- command name and associated information + 27539 ; EXIT: + 27540 ; AX -- non-zero indicates type of file found + 27541 ; EXECPATH -- successful pathname (AX non-zero) + 27542 ; NOTE(S): + 27543 ; 1) Uses the temporary buffer, tpbuf, from the parse routines. + 27544 ; 2) Some files are more equal than others. See search: for rankings. + 27545 ; 3) Path_Search terminates as soon as a call to search succeeds, even + 27546 ; if search returns an .exe or .bat. + 27547 ; 5) Clobbers dma address. + 27548 + 27549 ;PBUFLEN EQU 128 ; length of EXECPATH + 27550 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 27551 PBUFLEN EQU 256 + 27552 PATH_SEP_CHAR EQU ';' + 27553 + 27554 ;parseflags RECORD special_delim:1, unused:4, path_sep:1, wildcard:1, sw_flag:1 + 27555 + 27556 ;special_delim equ 128 + 27557 ;path_sep equ 4 + 27558 ;wildcard equ 2 + 27559 ;sw_flag equ 1 + 27560 + 27561 ;---------------------------------------------------------------------------- + 27562 + 27563 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2510h 27564 - 27565 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 27566 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 387Bh + 27565 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27566 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 32D1h 27567 - 27568 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 27569 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 372Fh + 27568 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 27569 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 387Bh 27570 - 27571 path_search: - 27572 000035A0 53 push bx - 27573 000035A1 51 push cx - 27574 000035A2 52 push dx ; could use a "stack 'em" instruction - 27575 000035A3 56 push si - 27576 000035A4 57 push di - 27577 000035A5 55 push bp - 27578 000035A6 9C pushf - 27579 - 27580 ;test ds:arg.argv[0].argflags, (MASK wildcard) + (MASK sw_flag) - 27581 ;test byte [ARGV0_ARG_FLAGS],3 - 27582 000035A7 F606[529F]03 test byte [ARG+ARGV_ELE.argflags],3 ; wildcard+sw_flag - 27583 000035AC 7403 jz short path_search_ok - 27584 path_failure_jmp: - 27585 000035AE E9C100 jmp path_failure ; ambiguous commands not allowed - 27586 - 27587 path_search_ok: - 27588 000035B1 E85201 call STORE_PCHAR ; figure out the pathname separator - 27589 000035B4 BA[1AA4] mov dx,FBUF ; clobber old dma value with - 27590 000035B7 B8001A mov ax,Set_DMA*256 ; 1A00h ; a pointer to our dma buffer - 27591 000035BA CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 27592 ; DS:DX -> disk transfer buffer - 27593 000035BC 06 push es - 27594 000035BD E8EFF0 call find_path ; get a handle (ES:DI) on user path - 27595 000035C0 8C06[45A4] mov [pathinfo+0],es ; and squirrel it away - 27596 000035C4 893E[47A4] mov [pathinfo+2],di ; "old" pathstring pointer - 27597 000035C8 893E[49A4] mov [pathinfo+4],di ; "new" pathstring pointer - 27598 000035CC 07 pop es - 27599 - 27600 ;mov bx,PBUFLEN ; 128 ; copy/format argv[0] into temp buffer - 27601 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 27602 ;mov bx,256 - 27603 000035CD BB0001 mov bx,PBUFLEN ; 256 ; copy/format argv[0] into temp buffer - 27604 000035D0 BE[1D9B] mov si,EXECPATH - 27605 000035D3 E88002 call STRIP - 27606 000035D6 72D6 jc short path_failure_jmp ; if possible, of course - 27607 - 27608 000035D8 89F2 mov dx,si ; search (EXECPATH, error_message) - 27609 000035DA C706[9AA4][6E90] mov word [search_error],baddrv_ptr - 27610 000035E0 E89F01 call PSEARCH ; must do at least one search - 27611 000035E3 09C0 or ax,ax ; find anything? - 27612 000035E5 7469 jz short path_noinit - 27613 ; failure ... search farther - 27614 000035E7 89C5 mov bp,ax ; success... save filetype code - 27615 000035E9 BF[1D9B] mov di,EXECPATH - 27616 ;mov si,ds:arg.argv[0].argpointer - 27617 ;mov si,[ARG_ARGV] - 27618 000035EC 8B36[509F] mov si,[ARG+ARGV_ELE.argpointer] - 27619 ;mov cx,ds:arg.argv[0].argstartel - 27620 ;mov cx,[ARGV0_ARGSTARTEL] - 27621 000035F0 8B0E[539F] mov cx,[ARG+ARGV_ELE.argstartel] - 27622 000035F4 29F1 sub cx,si ; compute prefix bytes to copy - 27623 - 27624 ; We have the number of bytes in the prefix (up to the final component). - 27625 ; We need to form the complete pathname including leading drive and current - 27626 ; directory. - 27627 ; - 27628 ; Is there a drive letter present? - 27629 - 27630 000035F6 B43A mov ah,':' - 27631 000035F8 83F902 cmp cx,2 ; room for drive letter? - 27632 000035FB 7205 jb short adddrive ; no, stick it in - 27633 000035FD 386401 cmp [si+1], ah ; colon present? - 27634 00003600 7408 je short movedrive ; yes, just move it - 27635 adddrive: - 27636 00003602 A0[079C] mov al,[CURDRV] ; get current drive - 27637 00003605 0441 add al,'A' ; convert to uppercase letter - 27638 00003607 AB stosw ; store d: - 27639 00003608 EB05 jmp short checkpath - 27640 - 27641 movedrive: - 27642 0000360A AD lodsw ; move d: - 27643 0000360B AB stosw - 27644 0000360C 83E902 sub cx,2 ; 2 bytes less to move - 27645 checkpath: - 27646 0000360F 0C20 or al,20h - 27647 00003611 88C2 mov dl,al - 27648 ;sub dl,60h - 27649 00003613 80EA60 sub dl,'a'-1 ; convert to 1-based for current dir - 27650 - 27651 ; Stick in beginning path char - 27652 - 27653 00003616 A0[4BA4] mov al,[psep_char] - 27654 00003619 AA stosb + 27571 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 27572 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 372Fh + 27573 + 27574 path_search: + 27575 000035A0 53 push bx + 27576 000035A1 51 push cx + 27577 000035A2 52 push dx ; could use a "stack 'em" instruction + 27578 000035A3 56 push si + 27579 000035A4 57 push di + 27580 000035A5 55 push bp + 27581 000035A6 9C pushf + 27582 + 27583 ;test ds:arg.argv[0].argflags, (MASK wildcard) + (MASK sw_flag) + 27584 ;test byte [ARGV0_ARG_FLAGS],3 + 27585 000035A7 F606[529F]03 test byte [ARG+ARGV_ELE.argflags],3 ; wildcard+sw_flag + 27586 000035AC 7403 jz short path_search_ok + 27587 path_failure_jmp: + 27588 000035AE E9C100 jmp path_failure ; ambiguous commands not allowed + 27589 + 27590 path_search_ok: + 27591 000035B1 E85201 call STORE_PCHAR ; figure out the pathname separator + 27592 000035B4 BA[1AA4] mov dx,FBUF ; clobber old dma value with + 27593 000035B7 B8001A mov ax,Set_DMA*256 ; 1A00h ; a pointer to our dma buffer + 27594 000035BA CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 27595 ; DS:DX -> disk transfer buffer + 27596 000035BC 06 push es + 27597 000035BD E8EFF0 call find_path ; get a handle (ES:DI) on user path + 27598 000035C0 8C06[45A4] mov [pathinfo+0],es ; and squirrel it away + 27599 000035C4 893E[47A4] mov [pathinfo+2],di ; "old" pathstring pointer + 27600 000035C8 893E[49A4] mov [pathinfo+4],di ; "new" pathstring pointer + 27601 000035CC 07 pop es + 27602 + 27603 ;mov bx,PBUFLEN ; 128 ; copy/format argv[0] into temp buffer + 27604 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 27605 ;mov bx,256 + 27606 000035CD BB0001 mov bx,PBUFLEN ; 256 ; copy/format argv[0] into temp buffer + 27607 000035D0 BE[1D9B] mov si,EXECPATH + 27608 000035D3 E88002 call STRIP + 27609 000035D6 72D6 jc short path_failure_jmp ; if possible, of course + 27610 + 27611 000035D8 89F2 mov dx,si ; search (EXECPATH, error_message) + 27612 000035DA C706[9AA4][6E90] mov word [search_error],baddrv_ptr + 27613 000035E0 E89F01 call PSEARCH ; must do at least one search + 27614 000035E3 09C0 or ax,ax ; find anything? + 27615 000035E5 7469 jz short path_noinit + 27616 ; failure ... search farther + 27617 000035E7 89C5 mov bp,ax ; success... save filetype code + 27618 000035E9 BF[1D9B] mov di,EXECPATH + 27619 ;mov si,ds:arg.argv[0].argpointer + 27620 ;mov si,[ARG_ARGV] + 27621 000035EC 8B36[509F] mov si,[ARG+ARGV_ELE.argpointer] + 27622 ;mov cx,ds:arg.argv[0].argstartel + 27623 ;mov cx,[ARGV0_ARGSTARTEL] + 27624 000035F0 8B0E[539F] mov cx,[ARG+ARGV_ELE.argstartel] + 27625 000035F4 29F1 sub cx,si ; compute prefix bytes to copy + 27626 + 27627 ; We have the number of bytes in the prefix (up to the final component). + 27628 ; We need to form the complete pathname including leading drive and current + 27629 ; directory. + 27630 ; + 27631 ; Is there a drive letter present? + 27632 + 27633 000035F6 B43A mov ah,':' + 27634 000035F8 83F902 cmp cx,2 ; room for drive letter? + 27635 000035FB 7205 jb short adddrive ; no, stick it in + 27636 000035FD 386401 cmp [si+1], ah ; colon present? + 27637 00003600 7408 je short movedrive ; yes, just move it + 27638 adddrive: + 27639 00003602 A0[079C] mov al,[CURDRV] ; get current drive + 27640 00003605 0441 add al,'A' ; convert to uppercase letter + 27641 00003607 AB stosw ; store d: + 27642 00003608 EB05 jmp short checkpath + 27643 + 27644 movedrive: + 27645 0000360A AD lodsw ; move d: + 27646 0000360B AB stosw + 27647 0000360C 83E902 sub cx,2 ; 2 bytes less to move + 27648 checkpath: + 27649 0000360F 0C20 or al,20h + 27650 00003611 88C2 mov dl,al + 27651 ;sub dl,60h + 27652 00003613 80EA60 sub dl,'a'-1 ; convert to 1-based for current dir + 27653 + 27654 ; Stick in beginning path char 27655 - 27656 ; Is there a leading /? If so, then no current dir copy is necessary. - 27657 ; Otherwise, get current dir for DL. + 27656 00003616 A0[4BA4] mov al,[psep_char] + 27657 00003619 AA stosb 27658 - 27659 0000361A 83F901 cmp cx,1 ; is there room for path char? - 27660 0000361D 720A jb short addpath ; no, go add path - 27661 0000361F AC lodsb - 27662 00003620 49 dec cx - 27663 00003621 3A06[4BA4] cmp al,[psep_char] ; is there a path separator? - 27664 00003625 741C je short movepath ; yes, go move remainder of path - 27665 00003627 41 inc cx - 27666 00003628 4E dec si ; undo the lodsb - 27667 addpath: - 27668 00003629 56 push si - 27669 0000362A 89FE mov si,di ; remainder of buffer - 27670 0000362C B80047 mov ax,Current_Dir*256 ; 4700h - 27671 0000362F CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 27672 ; DL = drive (0=default,1=A,etc.) - 27673 ; DS:SI points to 64-byte buffer area - 27674 - 27675 ; The previous current dir will succeed a previous find_first already worked. - 27676 ; - 27677 ; Find end of string. - 27678 - 27679 00003631 89F7 mov di,si - 27680 00003633 5E pop si - 27681 00003634 A0[4BA4] mov al,[psep_char] - 27682 00003637 803D00 cmp byte [di],0 ; root (empty dir string)? - 27683 0000363A 7407 jz short movepath ; yes, no need for path char - 27684 scanend: - 27685 ;cmp byte [di],0 ; end of string? - 27686 ;jz short foundend - 27687 ;inc di - 27688 ;jmp short scanend - 27689 ; 18/03/2023 - Retro DOS v4.0 COMMAND.COM - 27690 0000363C 47 inc di - 27691 0000363D 803D00 cmp byte [di],0 - 27692 00003640 75FA jnz short scanend - 27693 - 27694 ; Stick in a trailing path char. - 27695 - 27696 foundend: - 27697 00003642 AA stosb + 27659 ; Is there a leading /? If so, then no current dir copy is necessary. + 27660 ; Otherwise, get current dir for DL. + 27661 + 27662 0000361A 83F901 cmp cx,1 ; is there room for path char? + 27663 0000361D 720A jb short addpath ; no, go add path + 27664 0000361F AC lodsb + 27665 00003620 49 dec cx + 27666 00003621 3A06[4BA4] cmp al,[psep_char] ; is there a path separator? + 27667 00003625 741C je short movepath ; yes, go move remainder of path + 27668 00003627 41 inc cx + 27669 00003628 4E dec si ; undo the lodsb + 27670 addpath: + 27671 00003629 56 push si + 27672 0000362A 89FE mov si,di ; remainder of buffer + 27673 0000362C B80047 mov ax,Current_Dir*256 ; 4700h + 27674 0000362F CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 27675 ; DL = drive (0=default,1=A,etc.) + 27676 ; DS:SI points to 64-byte buffer area + 27677 + 27678 ; The previous current dir will succeed a previous find_first already worked. + 27679 ; + 27680 ; Find end of string. + 27681 + 27682 00003631 89F7 mov di,si + 27683 00003633 5E pop si + 27684 00003634 A0[4BA4] mov al,[psep_char] + 27685 00003637 803D00 cmp byte [di],0 ; root (empty dir string)? + 27686 0000363A 7407 jz short movepath ; yes, no need for path char + 27687 scanend: + 27688 ;cmp byte [di],0 ; end of string? + 27689 ;jz short foundend + 27690 ;inc di + 27691 ;jmp short scanend + 27692 ; 18/03/2023 - Retro DOS v4.0 COMMAND.COM + 27693 0000363C 47 inc di + 27694 0000363D 803D00 cmp byte [di],0 + 27695 00003640 75FA jnz short scanend + 27696 + 27697 ; Stick in a trailing path char. 27698 - 27699 ; Move remaining part of path. Skip leading path char if present. - 27700 - 27701 movepath: - 27702 00003643 3804 cmp [si],al ; first char a path char? - 27703 00003645 7502 jne short copypath - 27704 ; 26/04/2023 - 27705 00003647 46 inc si ; move past leading char - 27706 00003648 49 dec cx ; drop from count - 27707 copypath: - 27708 00003649 E302 jcxz _copydone ; no chars to move! - 27709 0000364B F3A4 rep movsb - 27710 _copydone: - 27711 0000364D E9A100 jmp path_success - 27712 ; run off and form complete pathname - 27713 path_noinit: - 27714 ;test ds:arg.argv[0].argflags, MASK path_sep - 27715 ;test byte [ARGV0_ARG_FLAGS],4 - 27716 00003650 F606[529F]04 test byte [ARG+ARGV_ELE.argflags],4 ; path_sep - 27717 00003655 751B jnz short path_failure - 27718 ; complete pathname specified ==> fail - 27719 ;mov bh,';' - 27720 00003657 B73B mov bh,PATH_SEP_CHAR - 27721 ; semicolon terminates pathstring - 27722 ;mov dx,ds:arg.argv[0].argstartel - 27723 ; this is where the last element starts - 27724 ;mov dx,[ARGV0_ARGSTARTEL] - 27725 00003659 8B16[539F] mov dx,[ARG+ARGV_ELE.argstartel] - 27726 ;sub dx,ds:arg.argv[0].argpointer - 27727 ; form pointer into EXECPATH, - 27728 ;sub dx,[ARG_ARGV] - 27729 0000365D 2B16[509F] sub dx,[ARG+ARGV_ELE.argpointer] - 27730 00003661 81C2[1D9B] add dx,EXECPATH ; skipping over drive spec, if any - 27731 path_loop: - 27732 00003665 E8AD00 call path_crunch ; pcrunch (EXECPATH, pathinfo) - 27733 00003668 89C5 mov bp,ax ; save filetype code - 27734 0000366A 9F lahf ; save flags, just in case - 27735 0000366B 09ED or bp,bp ; did path_crunch find anything? - 27736 0000366D 7508 jnz short path_found - 27737 0000366F 9E sahf ; see? needed those flags, after all! - 27738 00003670 73F3 jnc short path_loop ; is there anything left to the path? - 27739 path_failure: - 27740 00003672 31C0 xor ax,ax - 27741 00003674 E98700 jmp path_exit - 27742 - 27743 path_found: ; pathinfo[] points to winner - 27744 00003677 BF[1D9B] mov di,EXECPATH - 27745 ;mov cx,pathinfo[4] - 27746 0000367A 8B0E[49A4] mov cx,[pathinfo+4] ; "new" pointer -- end of string - 27747 ;mov si,pathinfo[2] - 27748 0000367E 8B36[47A4] mov si,[pathinfo+2] ; "old" pointer -- beginning of string - 27749 - 27750 ; BAS Nov 20/84 - 27751 ; Look at the pathname and expand . and .. if they are the first element - 27752 ; in the pathname (after the drive letter) - 27753 - 27754 00003682 06 push es - 27755 ;push pathinfo[0] - 27756 00003683 FF36[45A4] push word [pathinfo+0] - 27757 00003687 07 pop es - 27758 ;SR; - 27759 ; Oops! Gets fooled if path= \;.. - 27760 ; We should also check if a drive letter is really present - 27761 ; - 27762 00003688 26807C022E cmp byte [es:si+2],'.' - 27763 ; Look for Current dir at start of path - 27764 0000368D 7534 jne short path_cpy - 27765 - 27766 ; 18/03/2023 - 27767 ; MSDOS 6.0 - 27768 0000368F 26807C013A cmp byte [es:si+1],':' - 27769 ; does path have drive letter? - 27770 00003694 752D jne short path_cpy ; no, copy the path string - 27771 - 27772 00003696 51 push cx ; Save pointer to end of string - 27773 ;mov al,[es:si] - 27774 ;mov [di],al ; Copy drive letter, :, and root char - 27775 ;mov al,[es:si+1] ; to EXECPATH - 27776 ;mov [di+1],al - 27777 ; 05/05/2023 - 27778 00003697 268B04 mov ax,[es:si] - 27779 0000369A 8905 mov [di],ax - 27780 0000369C A0[4BA4] mov al,[psep_char] - 27781 0000369F 884502 mov [di+2], al - 27782 000036A2 56 push si ; Save pointer to begining of string - 27783 000036A3 268A14 mov dl,[es:si] ; Convert device letter for cur dir - 27784 000036A6 80CA20 or dl,20h - 27785 ;sub dl,60h - 27786 000036A9 80EA60 sub dl,'a'-1 - 27787 000036AC 89FE mov si,di ; pointer to EXECPATH - 27788 000036AE 83C603 add si,3 ; Don't wipe out drive and root info - 27789 000036B1 B80047 mov ax,Current_Dir*256 ; 4700h - 27790 000036B4 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 27791 ; DL = drive (0=default,1=A,etc.) - 27792 ; DS:SI points to 64-byte buffer area - 27793 000036B6 E8E6F9 call dstrlen ; Determine length of present info - 27794 000036B9 01CE add si,cx ; Don't copy over drive and root info - 27795 000036BB 4E dec si - 27796 000036BC 89F7 mov di,si ; Point to end of target string - 27797 000036BE 5E pop si ; Restore pointer to begining of string - 27798 000036BF 83C603 add si,3 ; Point past drive letter, :, . - 27799 000036C2 59 pop cx ; Restore pointer to end of string - 27800 path_cpy: - 27801 000036C3 07 pop es - 27802 000036C4 29F1 sub cx,si ; yields character count - 27803 000036C6 1E push ds ; time to switch segments - 27804 000036C7 FF36[45A4] push word [pathinfo+0] - 27805 ; string lives in this segment - 27806 000036CB 1F pop ds - 27807 000036CC FC cld - 27808 - 27809 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27810 ; MSDOS 5.0 (& MSDOS 5.0) - 27811 ;;rep movsb ; 3/3/KK ; copy the prefix path into EXECPATH - 27812 kloop: - 27813 000036CD AC lodsb ;AN000; 3/3/KK - 27814 000036CE AA stosb ;AN000; 3/3/KK - 27815 000036CF E88FF0 call testkanj ;AN000; 3/3/KK - 27816 000036D2 7410 jz short _notkanj1 ;AN000; 3/3/KK - 27817 000036D4 49 dec cx ;AN000; 3/3/KK - 27818 000036D5 E307 jcxz popdone ;AN000; Ignore boundary error 3/3/KK - 27819 000036D7 A4 movsb ;AN000; 3/3/KK - 27820 000036D8 49 dec cx ;AN000; 3/3/KK - 27821 000036D9 83F901 cmp cx,1 ;AN000; One char (the terminator) left ? 3/3/KK - 27822 000036DC 77EF ja short kloop ;AN000; no. 3/3/KK - 27823 popdone: ;AN000; 3/3/KK - 27824 000036DE 1F pop ds ;AN000; Yes ES:DI->terminator, last char is 3/3/KK - 27825 000036DF A0[4BA4] mov al,[psep_char] ;AN000; KANJI 3/3/KK - 27826 000036E2 EB0C jmp short path_store - 27827 ;AN000; 3/3/KK - 27828 _notkanj1: - 27829 ; 26/04/2023 - 27830 000036E4 E2E7 loop kloop - 27831 000036E6 1F pop ds ; return to our segment - 27832 000036E7 4F dec di ; overwrite terminator - 27833 000036E8 A0[4BA4] mov al,[psep_char] ; with a pathname separator - 27834 000036EB 3A45FF cmp al,[di-1] - 27835 000036EE 7401 je short path_success - 27836 path_store: - 27837 000036F0 AA stosb - 27838 path_success: - 27839 000036F1 BE[4DA4] mov si,search_best_buf - 27840 000036F4 31C9 xor cx,cx - 27841 path_succ_loop: - 27842 000036F6 AC lodsb ; append winning filename to path - 27843 000036F7 AA stosb ; (including terminating null) - 27844 000036F8 08C0 or al,al - 27845 000036FA 75FA jnz short path_succ_loop - 27846 000036FC 89E8 mov ax,bp ; retrieve filetype code - 27847 path_exit: - 27848 000036FE 9D popf - 27849 000036FF 5D pop bp - 27850 00003700 5F pop di - 27851 00003701 5E pop si ; chill out... - 27852 00003702 5A pop dx - 27853 00003703 59 pop cx - 27854 00003704 5B pop bx - 27855 00003705 C3 retn - 27856 - 27857 ; =============== S U B R O U T I N E ======================================= - 27858 - 27859 ; STORE_PCHAR determines the pathname-element separator and squirrels - 27860 ; it away. In other words, must we say '/bin/ls' or '\bin\ls'? - 27861 ; - 27862 ; ENTRY: - 27863 ; EXIT: - 27864 ; NOTE(S): - 27865 ; * Uses , defined in . - 27866 - 27867 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27868 STORE_PCHAR: - 27869 00003706 50 push ax - 27870 00003707 B02F mov al,'/' ; is the pathname-element separator - 27871 00003709 E808F3 call pathchrcmp ; a regular slash? - 27872 0000370C 7402 jz short STORE_SLASH - 27873 ; if yes, remember slash - 27874 0000370E B05C mov al,'\' - 27875 ; 18/03/2023 - 27876 ;mov [psep_char],al ; otherwise, remember back-slash - 27877 ;pop ax - 27878 ;retn - 27879 STORE_SLASH: - 27880 00003710 A2[4BA4] mov [psep_char],al - 27881 00003713 58 pop ax - 27882 00003714 C3 retn - 27883 - 27884 ; =============== S U B R O U T I N E ======================================= - 27885 - 27886 ; PATH_CRUNCH takes a prefix from a prefix string, and a suffix from - 27887 ; EXECPATH, and smooshes them into tpbuf. The caller may supply an - 27888 ; additional separator to use for breaking up the path-string. Null is the - 27889 ; default. Once the user-string has been formed, search is invoked to see - 27890 ; what's out there. - 27891 ; - 27892 ; ENTRY: - 27893 ; BH -- additional terminator character - 27894 ; SI -- pointer into pathstring to be dissected - 27895 ; DX -- pointer to stripped filename - 27896 ; EXIT: - 27897 ; AX -- non-zero (file type), zero (nothing found) - 27898 ; SI -- moves along pathstring from call to call - 27899 ; [search_best_buf] -- name of best file (AX non-zero) - 27900 ; [tpbuf] -- clobbered - 27901 ; NOTE(S): - 27902 ; * Implicit in this code is the ability to specify when to search - 27903 ; the current directory (if at all) through the PATH defined by - 27904 ; the user, a la UNIX (e.g., PATH=;c:\bin;c:\etc searches the - 27905 ; current directory before the bin and etc directories of drive c). - 27906 - 27907 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 27908 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3454h + 27699 foundend: + 27700 00003642 AA stosb + 27701 + 27702 ; Move remaining part of path. Skip leading path char if present. + 27703 + 27704 movepath: + 27705 00003643 3804 cmp [si],al ; first char a path char? + 27706 00003645 7502 jne short copypath + 27707 ; 26/04/2023 + 27708 00003647 46 inc si ; move past leading char + 27709 00003648 49 dec cx ; drop from count + 27710 copypath: + 27711 00003649 E302 jcxz _copydone ; no chars to move! + 27712 0000364B F3A4 rep movsb + 27713 _copydone: + 27714 0000364D E9A100 jmp path_success + 27715 ; run off and form complete pathname + 27716 path_noinit: + 27717 ;test ds:arg.argv[0].argflags, MASK path_sep + 27718 ;test byte [ARGV0_ARG_FLAGS],4 + 27719 00003650 F606[529F]04 test byte [ARG+ARGV_ELE.argflags],4 ; path_sep + 27720 00003655 751B jnz short path_failure + 27721 ; complete pathname specified ==> fail + 27722 ;mov bh,';' + 27723 00003657 B73B mov bh,PATH_SEP_CHAR + 27724 ; semicolon terminates pathstring + 27725 ;mov dx,ds:arg.argv[0].argstartel + 27726 ; this is where the last element starts + 27727 ;mov dx,[ARGV0_ARGSTARTEL] + 27728 00003659 8B16[539F] mov dx,[ARG+ARGV_ELE.argstartel] + 27729 ;sub dx,ds:arg.argv[0].argpointer + 27730 ; form pointer into EXECPATH, + 27731 ;sub dx,[ARG_ARGV] + 27732 0000365D 2B16[509F] sub dx,[ARG+ARGV_ELE.argpointer] + 27733 00003661 81C2[1D9B] add dx,EXECPATH ; skipping over drive spec, if any + 27734 path_loop: + 27735 00003665 E8AD00 call path_crunch ; pcrunch (EXECPATH, pathinfo) + 27736 00003668 89C5 mov bp,ax ; save filetype code + 27737 0000366A 9F lahf ; save flags, just in case + 27738 0000366B 09ED or bp,bp ; did path_crunch find anything? + 27739 0000366D 7508 jnz short path_found + 27740 0000366F 9E sahf ; see? needed those flags, after all! + 27741 00003670 73F3 jnc short path_loop ; is there anything left to the path? + 27742 path_failure: + 27743 00003672 31C0 xor ax,ax + 27744 00003674 E98700 jmp path_exit + 27745 + 27746 path_found: ; pathinfo[] points to winner + 27747 00003677 BF[1D9B] mov di,EXECPATH + 27748 ;mov cx,pathinfo[4] + 27749 0000367A 8B0E[49A4] mov cx,[pathinfo+4] ; "new" pointer -- end of string + 27750 ;mov si,pathinfo[2] + 27751 0000367E 8B36[47A4] mov si,[pathinfo+2] ; "old" pointer -- beginning of string + 27752 + 27753 ; BAS Nov 20/84 + 27754 ; Look at the pathname and expand . and .. if they are the first element + 27755 ; in the pathname (after the drive letter) + 27756 + 27757 00003682 06 push es + 27758 ;push pathinfo[0] + 27759 00003683 FF36[45A4] push word [pathinfo+0] + 27760 00003687 07 pop es + 27761 ;SR; + 27762 ; Oops! Gets fooled if path= \;.. + 27763 ; We should also check if a drive letter is really present + 27764 ; + 27765 00003688 26807C022E cmp byte [es:si+2],'.' + 27766 ; Look for Current dir at start of path + 27767 0000368D 7534 jne short path_cpy + 27768 + 27769 ; 18/03/2023 + 27770 ; MSDOS 6.0 + 27771 0000368F 26807C013A cmp byte [es:si+1],':' + 27772 ; does path have drive letter? + 27773 00003694 752D jne short path_cpy ; no, copy the path string + 27774 + 27775 00003696 51 push cx ; Save pointer to end of string + 27776 ;mov al,[es:si] + 27777 ;mov [di],al ; Copy drive letter, :, and root char + 27778 ;mov al,[es:si+1] ; to EXECPATH + 27779 ;mov [di+1],al + 27780 ; 05/05/2023 + 27781 00003697 268B04 mov ax,[es:si] + 27782 0000369A 8905 mov [di],ax + 27783 0000369C A0[4BA4] mov al,[psep_char] + 27784 0000369F 884502 mov [di+2], al + 27785 000036A2 56 push si ; Save pointer to begining of string + 27786 000036A3 268A14 mov dl,[es:si] ; Convert device letter for cur dir + 27787 000036A6 80CA20 or dl,20h + 27788 ;sub dl,60h + 27789 000036A9 80EA60 sub dl,'a'-1 + 27790 000036AC 89FE mov si,di ; pointer to EXECPATH + 27791 000036AE 83C603 add si,3 ; Don't wipe out drive and root info + 27792 000036B1 B80047 mov ax,Current_Dir*256 ; 4700h + 27793 000036B4 CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 27794 ; DL = drive (0=default,1=A,etc.) + 27795 ; DS:SI points to 64-byte buffer area + 27796 000036B6 E8E6F9 call dstrlen ; Determine length of present info + 27797 000036B9 01CE add si,cx ; Don't copy over drive and root info + 27798 000036BB 4E dec si + 27799 000036BC 89F7 mov di,si ; Point to end of target string + 27800 000036BE 5E pop si ; Restore pointer to begining of string + 27801 000036BF 83C603 add si,3 ; Point past drive letter, :, . + 27802 000036C2 59 pop cx ; Restore pointer to end of string + 27803 path_cpy: + 27804 000036C3 07 pop es + 27805 000036C4 29F1 sub cx,si ; yields character count + 27806 000036C6 1E push ds ; time to switch segments + 27807 000036C7 FF36[45A4] push word [pathinfo+0] + 27808 ; string lives in this segment + 27809 000036CB 1F pop ds + 27810 000036CC FC cld + 27811 + 27812 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27813 ; MSDOS 5.0 (& MSDOS 5.0) + 27814 ;;rep movsb ; 3/3/KK ; copy the prefix path into EXECPATH + 27815 kloop: + 27816 000036CD AC lodsb ;AN000; 3/3/KK + 27817 000036CE AA stosb ;AN000; 3/3/KK + 27818 000036CF E88FF0 call testkanj ;AN000; 3/3/KK + 27819 000036D2 7410 jz short _notkanj1 ;AN000; 3/3/KK + 27820 000036D4 49 dec cx ;AN000; 3/3/KK + 27821 000036D5 E307 jcxz popdone ;AN000; Ignore boundary error 3/3/KK + 27822 000036D7 A4 movsb ;AN000; 3/3/KK + 27823 000036D8 49 dec cx ;AN000; 3/3/KK + 27824 000036D9 83F901 cmp cx,1 ;AN000; One char (the terminator) left ? 3/3/KK + 27825 000036DC 77EF ja short kloop ;AN000; no. 3/3/KK + 27826 popdone: ;AN000; 3/3/KK + 27827 000036DE 1F pop ds ;AN000; Yes ES:DI->terminator, last char is 3/3/KK + 27828 000036DF A0[4BA4] mov al,[psep_char] ;AN000; KANJI 3/3/KK + 27829 000036E2 EB0C jmp short path_store + 27830 ;AN000; 3/3/KK + 27831 _notkanj1: + 27832 ; 26/04/2023 + 27833 000036E4 E2E7 loop kloop + 27834 000036E6 1F pop ds ; return to our segment + 27835 000036E7 4F dec di ; overwrite terminator + 27836 000036E8 A0[4BA4] mov al,[psep_char] ; with a pathname separator + 27837 000036EB 3A45FF cmp al,[di-1] + 27838 000036EE 7401 je short path_success + 27839 path_store: + 27840 000036F0 AA stosb + 27841 path_success: + 27842 000036F1 BE[4DA4] mov si,search_best_buf + 27843 000036F4 31C9 xor cx,cx + 27844 path_succ_loop: + 27845 000036F6 AC lodsb ; append winning filename to path + 27846 000036F7 AA stosb ; (including terminating null) + 27847 000036F8 08C0 or al,al + 27848 000036FA 75FA jnz short path_succ_loop + 27849 000036FC 89E8 mov ax,bp ; retrieve filetype code + 27850 path_exit: + 27851 000036FE 9D popf + 27852 000036FF 5D pop bp + 27853 00003700 5F pop di + 27854 00003701 5E pop si ; chill out... + 27855 00003702 5A pop dx + 27856 00003703 59 pop cx + 27857 00003704 5B pop bx + 27858 00003705 C3 retn + 27859 + 27860 ; =============== S U B R O U T I N E ======================================= + 27861 + 27862 ; STORE_PCHAR determines the pathname-element separator and squirrels + 27863 ; it away. In other words, must we say '/bin/ls' or '\bin\ls'? + 27864 ; + 27865 ; ENTRY: + 27866 ; EXIT: + 27867 ; NOTE(S): + 27868 ; * Uses , defined in . + 27869 + 27870 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27871 STORE_PCHAR: + 27872 00003706 50 push ax + 27873 00003707 B02F mov al,'/' ; is the pathname-element separator + 27874 00003709 E808F3 call pathchrcmp ; a regular slash? + 27875 0000370C 7402 jz short STORE_SLASH + 27876 ; if yes, remember slash + 27877 0000370E B05C mov al,'\' + 27878 ; 18/03/2023 + 27879 ;mov [psep_char],al ; otherwise, remember back-slash + 27880 ;pop ax + 27881 ;retn + 27882 STORE_SLASH: + 27883 00003710 A2[4BA4] mov [psep_char],al + 27884 00003713 58 pop ax + 27885 00003714 C3 retn + 27886 + 27887 ; =============== S U B R O U T I N E ======================================= + 27888 + 27889 ; PATH_CRUNCH takes a prefix from a prefix string, and a suffix from + 27890 ; EXECPATH, and smooshes them into tpbuf. The caller may supply an + 27891 ; additional separator to use for breaking up the path-string. Null is the + 27892 ; default. Once the user-string has been formed, search is invoked to see + 27893 ; what's out there. + 27894 ; + 27895 ; ENTRY: + 27896 ; BH -- additional terminator character + 27897 ; SI -- pointer into pathstring to be dissected + 27898 ; DX -- pointer to stripped filename + 27899 ; EXIT: + 27900 ; AX -- non-zero (file type), zero (nothing found) + 27901 ; SI -- moves along pathstring from call to call + 27902 ; [search_best_buf] -- name of best file (AX non-zero) + 27903 ; [tpbuf] -- clobbered + 27904 ; NOTE(S): + 27905 ; * Implicit in this code is the ability to specify when to search + 27906 ; the current directory (if at all) through the PATH defined by + 27907 ; the user, a la UNIX (e.g., PATH=;c:\bin;c:\etc searches the + 27908 ; current directory before the bin and etc directories of drive c). 27909 - 27910 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 27911 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:39FEh + 27910 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 27911 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3454h 27912 - 27913 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 27914 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:38B2h - 27915 path_crunch: - 27916 00003715 53 push bx - 27917 00003716 51 push cx - 27918 00003717 52 push dx - 27919 00003718 57 push di - 27920 00003719 56 push si - 27921 ;pushf ; ** ; 18/03/2023 - 27922 0000371A E8E9FF call STORE_PCHAR ; figure out pathname separator - 27923 0000371D BF[96A3] mov di,TPBUF ; destination of concatenated string - 27924 00003720 8B36[49A4] mov si,[pathinfo+4] ; "new" pointer to start with - 27925 00003724 8936[47A4] mov [pathinfo+2],si ; becomes "old" pointer - 27926 00003728 1E push ds ; save old segment pointer - 27927 00003729 FF36[45A4] push word [pathinfo+0] - 27928 ; replace with pointer to userpath's - 27929 0000372D 1F pop ds ; segment - 27930 ; 26/04/2023 - 27931 0000372E 30C9 xor cl,cl ;AN000; clear flag for later use 3/3/KK - 27932 path_cr_copy: - 27933 00003730 AC lodsb ; get a pathname byte - 27934 00003731 08C0 or al,al ; check for terminator(s) - 27935 00003733 7414 jz short path_seg ; null terminates segment & pathstring - 27936 00003735 38F8 cmp al,bh - 27937 00003737 7410 je short path_seg ; BH terminates a pathstring segment - 27938 ; - 27939 ; 18/03/2023 - 27940 ; MSDOS 6.0 (& 5.0) COMMAND.COM - 27941 00003739 E825F0 call testkanj ;AN000; 3/3/KK - 27942 0000373C 7406 jz short _notkanj2 ;AN000; 3/3/KK - 27943 0000373E AA stosb ;AN000; 3/3/KK - 27944 0000373F A4 movsb ;AN000; 3/3/KK - 27945 00003740 B101 mov cl,1 ; * ;AN000; CL=1 means latest stored char is DBCS 3/3/KK - 27946 00003742 EBEC jmp short path_cr_copy - 27947 _notkanj2: - 27948 00003744 30C9 xor cl,cl ; * ;AN000; CL=0 means latest stored char is SBCS 3/3/KK - 27949 ; - 27950 00003746 AA stosb - 27951 00003747 EBE7 jmp short path_cr_copy - 27952 - 27953 path_seg: - 27954 00003749 1F pop ds ; restore old data segment - 27955 0000374A 8936[49A4] mov [pathinfo+4],si ; save "new" pointer for next time - 27956 0000374E 88C3 mov bl,al ; remember if we saw null or not... - 27957 ;;; REMOVE NEXT 3 LINES FOR CURDIR SPEC - 27958 00003750 31C0 xor ax,ax ; in case nothing in pathstr... - 27959 00003752 81FF[96A3] cmp di,TPBUF ; was there really anything in pathstr? - 27960 00003756 7421 je short path_cr_leave - 27961 ; if nothing was copied, pathstr empty - 27962 path_cr_look: - 27963 00003758 A0[4BA4] mov al,[psep_char] ; form complete pathname - 27964 ; - 27965 ; 18/03/2023 - 27966 ; MSDOS 6.0 - 27967 0000375B 08C9 or cl,cl ; * ;AN000; 3/3/KK - 27968 0000375D 7505 jnz short path_cr_store - 27969 ;AN000; this is a trailing byte of ECS code 3/3/KK - 27970 ; - 27971 0000375F 3A45FF cmp al,[di-1] ; add pathname separator for suffix - 27972 00003762 7401 je short path_cr_l1 - 27973 path_cr_store: - 27974 00003764 AA stosb - 27975 path_cr_l1: - 27976 00003765 89D6 mov si,dx - 27977 path_cr_l2: - 27978 00003767 AC lodsb ; tack the stripped filename onto - 27979 00003768 AA stosb ; the end of the path, up to and - 27980 00003769 08C0 or al,al ; including the terminating null - 27981 0000376B 75FA jnz short path_cr_l2 - 27982 0000376D BA[96A3] mov dx,TPBUF ; and look for an appropriate file... - 27983 00003770 C706[9AA4][5491] mov word [search_error],BADPMES_PTR - 27984 ;invoke search - 27985 00003776 E80900 call PSEARCH ; results are in AX & search_best_buf - 27986 - 27987 ; 18/03/2023 - 27988 ;path_cr_leave: - 27989 ;or bl,bl ; did we finish off the pathstring? - 27990 ;jz short path_cr_empty - 27991 ; ; null in BL means all gone... - 27992 ;popf ; ** ; otherwise, plenty left - 27993 ;clc - 27994 ;jmp short path_cr_exit - 27995 ;path_cr_empty: - 27996 ;popf ; ** - 27997 ;stc - 27998 ;path_cr_exit: - 27999 - 28000 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28001 path_cr_leave: - 28002 ;popf ; ** ; 18/03/2023 - 28003 00003779 80FB01 cmp bl,1 ; if bl = 0 -> cf = 1 (path_cr_empty:) - 28004 - 28005 path_cr_exit: - 28006 0000377C 5E pop si - 28007 0000377D 5F pop di - 28008 0000377E 5A pop dx - 28009 0000377F 59 pop cx - 28010 00003780 5B pop bx - 28011 00003781 C3 retn - 28012 - 28013 ;============================================================================ - 28014 ; PATH2.ASM, MSDOS 6.0, 1991 - 28015 ;============================================================================ - 28016 ; 02/10/2018 - Retro DOS v3.0 - 28017 - 28018 ;---------------------------------------------------------------------------- - 28019 ; SEARCH, when given a pathname, attempts to find a file with - 28020 ; one of the following extensions: .com, .exe, .bat (highest to - 28021 ; lowest priority). Where conflicts arise, the extension with - 28022 ; the highest priority is favored. - 28023 ; ENTRY: - 28024 ; DX -- pointer to null-terminated pathname - 28025 ; fbuf -- dma buffer for findfirst/next - 28026 ; EXIT: - 28027 ; AX -- 8) file found with .com extension - 28028 ; 4) file found with .exe extension - 28029 ; 2) file found with .bat extension - 28030 ; 0) no such file to be found - 28031 ; (if AX is non-zero:) - 28032 ; [search_best] identical to AX - 28033 ; [search_best_buf] null-terminated filename - 28034 ; NOTES: - 28035 ; 1) Requires caller to have allocated a dma buffer and executed a setdma. - 28036 ;--------------- - 28037 ; CONSTANTS: - 28038 ;--------------- - 28039 SEARCH_FILE_NOT_FOUND EQU 0 - 28040 SEARCH_COM EQU 8 - 28041 SEARCH_EXE EQU 4 - 28042 SEARCH_BAT EQU 2 - 28043 FNAME_LEN EQU 8 - 28044 FNAME_MAX_LEN EQU 13 - 28045 DOT EQU '.' - 28046 WILDCHAR EQU '?' - 28047 - 28048 - 28049 ; =============== S U B R O U T I N E ======================================= + 27913 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 27914 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:39FEh + 27915 + 27916 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 27917 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:38B2h + 27918 path_crunch: + 27919 00003715 53 push bx + 27920 00003716 51 push cx + 27921 00003717 52 push dx + 27922 00003718 57 push di + 27923 00003719 56 push si + 27924 ;pushf ; ** ; 18/03/2023 + 27925 0000371A E8E9FF call STORE_PCHAR ; figure out pathname separator + 27926 0000371D BF[96A3] mov di,TPBUF ; destination of concatenated string + 27927 00003720 8B36[49A4] mov si,[pathinfo+4] ; "new" pointer to start with + 27928 00003724 8936[47A4] mov [pathinfo+2],si ; becomes "old" pointer + 27929 00003728 1E push ds ; save old segment pointer + 27930 00003729 FF36[45A4] push word [pathinfo+0] + 27931 ; replace with pointer to userpath's + 27932 0000372D 1F pop ds ; segment + 27933 ; 26/04/2023 + 27934 0000372E 30C9 xor cl,cl ;AN000; clear flag for later use 3/3/KK + 27935 path_cr_copy: + 27936 00003730 AC lodsb ; get a pathname byte + 27937 00003731 08C0 or al,al ; check for terminator(s) + 27938 00003733 7414 jz short path_seg ; null terminates segment & pathstring + 27939 00003735 38F8 cmp al,bh + 27940 00003737 7410 je short path_seg ; BH terminates a pathstring segment + 27941 ; + 27942 ; 18/03/2023 + 27943 ; MSDOS 6.0 (& 5.0) COMMAND.COM + 27944 00003739 E825F0 call testkanj ;AN000; 3/3/KK + 27945 0000373C 7406 jz short _notkanj2 ;AN000; 3/3/KK + 27946 0000373E AA stosb ;AN000; 3/3/KK + 27947 0000373F A4 movsb ;AN000; 3/3/KK + 27948 00003740 B101 mov cl,1 ; * ;AN000; CL=1 means latest stored char is DBCS 3/3/KK + 27949 00003742 EBEC jmp short path_cr_copy + 27950 _notkanj2: + 27951 00003744 30C9 xor cl,cl ; * ;AN000; CL=0 means latest stored char is SBCS 3/3/KK + 27952 ; + 27953 00003746 AA stosb + 27954 00003747 EBE7 jmp short path_cr_copy + 27955 + 27956 path_seg: + 27957 00003749 1F pop ds ; restore old data segment + 27958 0000374A 8936[49A4] mov [pathinfo+4],si ; save "new" pointer for next time + 27959 0000374E 88C3 mov bl,al ; remember if we saw null or not... + 27960 ;;; REMOVE NEXT 3 LINES FOR CURDIR SPEC + 27961 00003750 31C0 xor ax,ax ; in case nothing in pathstr... + 27962 00003752 81FF[96A3] cmp di,TPBUF ; was there really anything in pathstr? + 27963 00003756 7421 je short path_cr_leave + 27964 ; if nothing was copied, pathstr empty + 27965 path_cr_look: + 27966 00003758 A0[4BA4] mov al,[psep_char] ; form complete pathname + 27967 ; + 27968 ; 18/03/2023 + 27969 ; MSDOS 6.0 + 27970 0000375B 08C9 or cl,cl ; * ;AN000; 3/3/KK + 27971 0000375D 7505 jnz short path_cr_store + 27972 ;AN000; this is a trailing byte of ECS code 3/3/KK + 27973 ; + 27974 0000375F 3A45FF cmp al,[di-1] ; add pathname separator for suffix + 27975 00003762 7401 je short path_cr_l1 + 27976 path_cr_store: + 27977 00003764 AA stosb + 27978 path_cr_l1: + 27979 00003765 89D6 mov si,dx + 27980 path_cr_l2: + 27981 00003767 AC lodsb ; tack the stripped filename onto + 27982 00003768 AA stosb ; the end of the path, up to and + 27983 00003769 08C0 or al,al ; including the terminating null + 27984 0000376B 75FA jnz short path_cr_l2 + 27985 0000376D BA[96A3] mov dx,TPBUF ; and look for an appropriate file... + 27986 00003770 C706[9AA4][5491] mov word [search_error],BADPMES_PTR + 27987 ;invoke search + 27988 00003776 E80900 call PSEARCH ; results are in AX & search_best_buf + 27989 + 27990 ; 18/03/2023 + 27991 ;path_cr_leave: + 27992 ;or bl,bl ; did we finish off the pathstring? + 27993 ;jz short path_cr_empty + 27994 ; ; null in BL means all gone... + 27995 ;popf ; ** ; otherwise, plenty left + 27996 ;clc + 27997 ;jmp short path_cr_exit + 27998 ;path_cr_empty: + 27999 ;popf ; ** + 28000 ;stc + 28001 ;path_cr_exit: + 28002 + 28003 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28004 path_cr_leave: + 28005 ;popf ; ** ; 18/03/2023 + 28006 00003779 80FB01 cmp bl,1 ; if bl = 0 -> cf = 1 (path_cr_empty:) + 28007 + 28008 path_cr_exit: + 28009 0000377C 5E pop si + 28010 0000377D 5F pop di + 28011 0000377E 5A pop dx + 28012 0000377F 59 pop cx + 28013 00003780 5B pop bx + 28014 00003781 C3 retn + 28015 + 28016 ;============================================================================ + 28017 ; PATH2.ASM, MSDOS 6.0, 1991 + 28018 ;============================================================================ + 28019 ; 02/10/2018 - Retro DOS v3.0 + 28020 + 28021 ;---------------------------------------------------------------------------- + 28022 ; SEARCH, when given a pathname, attempts to find a file with + 28023 ; one of the following extensions: .com, .exe, .bat (highest to + 28024 ; lowest priority). Where conflicts arise, the extension with + 28025 ; the highest priority is favored. + 28026 ; ENTRY: + 28027 ; DX -- pointer to null-terminated pathname + 28028 ; fbuf -- dma buffer for findfirst/next + 28029 ; EXIT: + 28030 ; AX -- 8) file found with .com extension + 28031 ; 4) file found with .exe extension + 28032 ; 2) file found with .bat extension + 28033 ; 0) no such file to be found + 28034 ; (if AX is non-zero:) + 28035 ; [search_best] identical to AX + 28036 ; [search_best_buf] null-terminated filename + 28037 ; NOTES: + 28038 ; 1) Requires caller to have allocated a dma buffer and executed a setdma. + 28039 ;--------------- + 28040 ; CONSTANTS: + 28041 ;--------------- + 28042 SEARCH_FILE_NOT_FOUND EQU 0 + 28043 SEARCH_COM EQU 8 + 28044 SEARCH_EXE EQU 4 + 28045 SEARCH_BAT EQU 2 + 28046 FNAME_LEN EQU 8 + 28047 FNAME_MAX_LEN EQU 13 + 28048 DOT EQU '.' + 28049 WILDCHAR EQU '?' 28050 - 28051 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 26D6h - 28052 - 28053 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28054 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:34C9h + 28051 + 28052 ; =============== S U B R O U T I N E ======================================= + 28053 + 28054 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 26D6h 28055 - 28056 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 28057 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3A73h + 28056 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28057 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:34C9h 28058 - 28059 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 28060 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3927h - 28061 PSEARCH: - 28062 00003782 51 push cx - 28063 00003783 52 push dx - 28064 00003784 57 push di - 28065 00003785 56 push si - 28066 ;pushf ; ** ; 18/03/2023 - 28067 00003786 52 push dx ; check drivespec (save pname ptr) - 28068 00003787 89D7 mov di,dx ; working copy of pathname - 28069 00003789 BE[5AA4] mov si,search_curdir_buf - 28070 0000378C 31D2 xor dx,dx ; zero means current drive - 28071 0000378E 807D013A cmp byte [di+1],':' ; is there a drive spec? - 28072 00003792 7508 jne short SEARCH_DIR_CHECK - 28073 00003794 8A15 mov dl,[di] ; get the drive byte - 28074 00003796 80E2DF and dl,0DFh ; ~20h ; uppercase the sucker - 28075 00003799 80EA40 sub dl,'@' ; 40h ; and convert to drive number - 28076 SEARCH_DIR_CHECK: - 28077 0000379C B80047 mov ax,Current_Dir*256 ; 4700h - 28078 0000379F CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY - 28079 ; DL = drive (0=default,1=A,etc.) - 28080 ; DS:SI points to 64-byte buffer area - 28081 000037A1 5A pop dx ; directory? If we can't we'll - 28082 000037A2 724C jc short SEARCH_INVALID_DRIVE - 28083 ; assume it's a bad drive... - 28084 000037A4 B91300 mov cx,search_attr ; 13h - 28085 ; filetypes to search for - 28086 000037A7 B8004E mov ax,Find_First*256 ; 4E00h ; request first match, if any - 28087 000037AA CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) - 28088 ; CX = search attributes - 28089 ; DS:DX -> ASCIZ filespec - 28090 ; (drive,path, and wildcards allowed) - 28091 000037AC 7249 jc short SEARCH_NO_FILE - 28092 000037AE C606[4CA4]00 mov byte [search_best],SEARCH_FILE_NOT_FOUND ; 0 - 28093 000037B3 C606[4DA4]00 mov byte [search_best_buf],ANULL - 28094 ; 0 ; nothing's been found, yet - 28095 SEARCH_LOOP: - 28096 000037B8 E84300 call SEARCH_FTYPE ; determine if .com, &c... - 28097 000037BB 3A06[4CA4] cmp al,[search_best] - 28098 ; better than what we've found so far? - 28099 000037BF 7E13 jle short SEARCH_NEXT - 28100 ; no, look for another - 28101 000037C1 A2[4CA4] mov [search_best],al - 28102 ; found something... save its code - 28103 ;mov si,offset TRANGROUP:fbuf.find_buf_pname - 28104 ;mov si,FBUF_PNAME - 28105 000037C4 BE[38A4] mov si,FBUF+FIND_BUF.PNAME ; FBUF+30 - 28106 000037C7 BF[4DA4] mov di,search_best_buf - 28107 000037CA B90D00 mov cx,FNAME_MAX_LEN ; 13 - 28108 000037CD FC cld - 28109 000037CE F3A4 rep movsb ; save complete pathname representation - 28110 000037D0 3C08 cmp al,SEARCH_COM ; 8 - 28111 ; have we found the best of all? - 28112 000037D2 740A je short SEARCH_DONE - 28113 SEARCH_NEXT: ; keep on looking - 28114 000037D4 B91300 mov cx,search_attr ; 13h - 28115 000037D7 B8004F mov ax,Find_Next*256 ; 4F00h ; next match - 28116 000037DA CD21 int 21h ; DOS - 2+ - FIND NEXT ASCIZ (FINDNEXT) - 28117 ; [DTA] = data block from - 28118 ; last AH = 4Eh/4Fh call - 28119 000037DC 73DA jnc short SEARCH_LOOP - 28120 SEARCH_DONE: ; it's all over with... - 28121 000037DE A0[4CA4] mov al,[search_best] - 28122 ; pick best to return with - 28123 ; 18/03/2023 - 28124 ; MSDOS 6.0 - 28125 000037E1 803E[069F]01 cmp byte [ext_entered],1 - 28126 ;AN005; Did user request a specific ext? - 28127 000037E6 7411 je short SEARCH_EXIT - 28128 ;AN005; no - exit - 28129 000037E8 A0[069F] mov al,[ext_entered] - 28130 ;AN005; yes - get the real file type back - 28131 000037EB A2[4CA4] mov [search_best],al - 28132 ;AN005; save the real file type - 28133 ; - 28134 000037EE EB09 jmp short SEARCH_EXIT - 28135 - 28136 SEARCH_INVALID_DRIVE: ; Tell the user path/drive - 28137 000037F0 8B16[9AA4] mov dx,[search_error] - 28138 ; appropriate error message - 28139 000037F4 E8311C call std_printf ; and pretend no file found - 28140 - 28141 SEARCH_NO_FILE: ; couldn't find a match - 28142 ;mov ax,SEARCH_FILE_NOT_FOUND ; 0 - 28143 ; 18/03/2023 - 28144 000037F7 31C0 xor ax,ax - 28145 SEARCH_EXIT: - 28146 ;popf ; ** ; 18/03/2023 - 28147 000037F9 5E pop si - 28148 000037FA 5F pop di - 28149 000037FB 5A pop dx - 28150 000037FC 59 pop cx - 28151 000037FD C3 retn - 28152 - 28153 ; =============== S U B R O U T I N E ======================================= - 28154 - 28155 ; SEARCH_FTYPE determines the type of a file by examining its extension. - 28156 ; - 28157 ; ENTRY: - 28158 ; fbuf -- dma buffer containing filename - 28159 ; EXIT: - 28160 ; AX -- file code, as given in search header - 28161 ; NOTE(S): - 28162 ; * Implicit assumption that NULL == search_file_not_found - 28163 - 28164 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28165 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28059 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28060 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3A73h + 28061 + 28062 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 28063 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3927h + 28064 PSEARCH: + 28065 00003782 51 push cx + 28066 00003783 52 push dx + 28067 00003784 57 push di + 28068 00003785 56 push si + 28069 ;pushf ; ** ; 18/03/2023 + 28070 00003786 52 push dx ; check drivespec (save pname ptr) + 28071 00003787 89D7 mov di,dx ; working copy of pathname + 28072 00003789 BE[5AA4] mov si,search_curdir_buf + 28073 0000378C 31D2 xor dx,dx ; zero means current drive + 28074 0000378E 807D013A cmp byte [di+1],':' ; is there a drive spec? + 28075 00003792 7508 jne short SEARCH_DIR_CHECK + 28076 00003794 8A15 mov dl,[di] ; get the drive byte + 28077 00003796 80E2DF and dl,0DFh ; ~20h ; uppercase the sucker + 28078 00003799 80EA40 sub dl,'@' ; 40h ; and convert to drive number + 28079 SEARCH_DIR_CHECK: + 28080 0000379C B80047 mov ax,Current_Dir*256 ; 4700h + 28081 0000379F CD21 int 21h ; DOS - 2+ - GET CURRENT DIRECTORY + 28082 ; DL = drive (0=default,1=A,etc.) + 28083 ; DS:SI points to 64-byte buffer area + 28084 000037A1 5A pop dx ; directory? If we can't we'll + 28085 000037A2 724C jc short SEARCH_INVALID_DRIVE + 28086 ; assume it's a bad drive... + 28087 000037A4 B91300 mov cx,search_attr ; 13h + 28088 ; filetypes to search for + 28089 000037A7 B8004E mov ax,Find_First*256 ; 4E00h ; request first match, if any + 28090 000037AA CD21 int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) + 28091 ; CX = search attributes + 28092 ; DS:DX -> ASCIZ filespec + 28093 ; (drive,path, and wildcards allowed) + 28094 000037AC 7249 jc short SEARCH_NO_FILE + 28095 000037AE C606[4CA4]00 mov byte [search_best],SEARCH_FILE_NOT_FOUND ; 0 + 28096 000037B3 C606[4DA4]00 mov byte [search_best_buf],ANULL + 28097 ; 0 ; nothing's been found, yet + 28098 SEARCH_LOOP: + 28099 000037B8 E84300 call SEARCH_FTYPE ; determine if .com, &c... + 28100 000037BB 3A06[4CA4] cmp al,[search_best] + 28101 ; better than what we've found so far? + 28102 000037BF 7E13 jle short SEARCH_NEXT + 28103 ; no, look for another + 28104 000037C1 A2[4CA4] mov [search_best],al + 28105 ; found something... save its code + 28106 ;mov si,offset TRANGROUP:fbuf.find_buf_pname + 28107 ;mov si,FBUF_PNAME + 28108 000037C4 BE[38A4] mov si,FBUF+FIND_BUF.PNAME ; FBUF+30 + 28109 000037C7 BF[4DA4] mov di,search_best_buf + 28110 000037CA B90D00 mov cx,FNAME_MAX_LEN ; 13 + 28111 000037CD FC cld + 28112 000037CE F3A4 rep movsb ; save complete pathname representation + 28113 000037D0 3C08 cmp al,SEARCH_COM ; 8 + 28114 ; have we found the best of all? + 28115 000037D2 740A je short SEARCH_DONE + 28116 SEARCH_NEXT: ; keep on looking + 28117 000037D4 B91300 mov cx,search_attr ; 13h + 28118 000037D7 B8004F mov ax,Find_Next*256 ; 4F00h ; next match + 28119 000037DA CD21 int 21h ; DOS - 2+ - FIND NEXT ASCIZ (FINDNEXT) + 28120 ; [DTA] = data block from + 28121 ; last AH = 4Eh/4Fh call + 28122 000037DC 73DA jnc short SEARCH_LOOP + 28123 SEARCH_DONE: ; it's all over with... + 28124 000037DE A0[4CA4] mov al,[search_best] + 28125 ; pick best to return with + 28126 ; 18/03/2023 + 28127 ; MSDOS 6.0 + 28128 000037E1 803E[069F]01 cmp byte [ext_entered],1 + 28129 ;AN005; Did user request a specific ext? + 28130 000037E6 7411 je short SEARCH_EXIT + 28131 ;AN005; no - exit + 28132 000037E8 A0[069F] mov al,[ext_entered] + 28133 ;AN005; yes - get the real file type back + 28134 000037EB A2[4CA4] mov [search_best],al + 28135 ;AN005; save the real file type + 28136 ; + 28137 000037EE EB09 jmp short SEARCH_EXIT + 28138 + 28139 SEARCH_INVALID_DRIVE: ; Tell the user path/drive + 28140 000037F0 8B16[9AA4] mov dx,[search_error] + 28141 ; appropriate error message + 28142 000037F4 E8311C call std_printf ; and pretend no file found + 28143 + 28144 SEARCH_NO_FILE: ; couldn't find a match + 28145 ;mov ax,SEARCH_FILE_NOT_FOUND ; 0 + 28146 ; 18/03/2023 + 28147 000037F7 31C0 xor ax,ax + 28148 SEARCH_EXIT: + 28149 ;popf ; ** ; 18/03/2023 + 28150 000037F9 5E pop si + 28151 000037FA 5F pop di + 28152 000037FB 5A pop dx + 28153 000037FC 59 pop cx + 28154 000037FD C3 retn + 28155 + 28156 ; =============== S U B R O U T I N E ======================================= + 28157 + 28158 ; SEARCH_FTYPE determines the type of a file by examining its extension. + 28159 ; + 28160 ; ENTRY: + 28161 ; fbuf -- dma buffer containing filename + 28162 ; EXIT: + 28163 ; AX -- file code, as given in search header + 28164 ; NOTE(S): + 28165 ; * Implicit assumption that NULL == search_file_not_found 28166 - 28167 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM - 28168 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3927h - 28169 SEARCH_FTYPE: - 28170 000037FE 57 push di - 28171 000037FF 56 push si - 28172 ;mov ax,ANULL ; 0 ; find the end of the filename - 28173 ; 18/02/2023 - 28174 00003800 31C0 xor ax,ax ; ax = 0 - 28175 ;mov di,offset TRANGROUP:fbuf.find_buf_pname - 28176 ;mov di,FBUF_PNAME - 28177 00003802 BF[38A4] mov di,FBUF+FIND_BUF.PNAME ; FBUF+1Eh - 28178 00003805 B90D00 mov cx,FNAME_MAX_LEN ; 13 - 28179 00003808 FC cld - 28180 00003809 F2AE repnz scasb ; search for the terminating null - 28181 0000380B 7535 jnz short FTYPE_EXIT - 28182 ; weird... no null byte at end - 28183 0000380D 83EF05 sub di,5 ; . + E + X + T + NULL - 28184 - 28185 ; Compare .COM - 28186 - 28187 00003810 BE[C495] mov si,comext ; ".COM" - 28188 00003813 89F8 mov ax,di - 28189 00003815 A7 cmpsw - 28190 00003816 7508 jnz short FTYPE_EXE - 28191 00003818 A7 cmpsw - 28192 00003819 7505 jnz short FTYPE_EXE - 28193 ;mov ax,8 - 28194 0000381B B80800 mov ax,SEARCH_COM ; success! - 28195 0000381E EB22 jmp short FTYPE_EXIT - 28196 - 28197 ; Compare .EXE - 28198 FTYPE_EXE: ; still looking... now for '.exe' - 28199 00003820 89C7 mov di,ax - 28200 00003822 BE[C895] mov si,exeext ; ".EXE" - 28201 00003825 A7 cmpsw - 28202 00003826 7508 jnz short FTYPE_BAT - 28203 00003828 A7 cmpsw - 28204 00003829 7505 jnz short FTYPE_BAT - 28205 ;mov ax,4 - 28206 0000382B B80400 mov ax,SEARCH_EXE ; success! - 28207 0000382E EB12 jmp short FTYPE_EXIT - 28208 - 28209 ; Compare .BAT - 28210 FTYPE_BAT: ; still looking... now for '.bat' - 28211 00003830 89C7 mov di,ax - 28212 00003832 BE[CC95] mov si,batext ; ".BAT" - 28213 00003835 A7 cmpsw - 28214 00003836 7508 jnz short FTYPE_FAIL - 28215 00003838 A7 cmpsw - 28216 00003839 7505 jnz short FTYPE_FAIL - 28217 ;mov ax,2 - 28218 0000383B B80200 mov ax,SEARCH_BAT ; success! - 28219 0000383E EB02 jmp short FTYPE_EXIT - 28220 - 28221 FTYPE_FAIL: ; file doesn't match what we need - 28222 ;mov ax,ANULL ; 0 - 28223 ; 18/03/2023 - 28224 00003840 29C0 sub ax,ax ; ax = 0 - 28225 FTYPE_EXIT: + 28167 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28168 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28169 + 28170 ; 04/08/2024 - Retro DOS v5.0 COMMAND.COM + 28171 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3927h + 28172 SEARCH_FTYPE: + 28173 000037FE 57 push di + 28174 000037FF 56 push si + 28175 ;mov ax,ANULL ; 0 ; find the end of the filename + 28176 ; 18/02/2023 + 28177 00003800 31C0 xor ax,ax ; ax = 0 + 28178 ;mov di,offset TRANGROUP:fbuf.find_buf_pname + 28179 ;mov di,FBUF_PNAME + 28180 00003802 BF[38A4] mov di,FBUF+FIND_BUF.PNAME ; FBUF+1Eh + 28181 00003805 B90D00 mov cx,FNAME_MAX_LEN ; 13 + 28182 00003808 FC cld + 28183 00003809 F2AE repnz scasb ; search for the terminating null + 28184 0000380B 7535 jnz short FTYPE_EXIT + 28185 ; weird... no null byte at end + 28186 0000380D 83EF05 sub di,5 ; . + E + X + T + NULL + 28187 + 28188 ; Compare .COM + 28189 + 28190 00003810 BE[C495] mov si,comext ; ".COM" + 28191 00003813 89F8 mov ax,di + 28192 00003815 A7 cmpsw + 28193 00003816 7508 jnz short FTYPE_EXE + 28194 00003818 A7 cmpsw + 28195 00003819 7505 jnz short FTYPE_EXE + 28196 ;mov ax,8 + 28197 0000381B B80800 mov ax,SEARCH_COM ; success! + 28198 0000381E EB22 jmp short FTYPE_EXIT + 28199 + 28200 ; Compare .EXE + 28201 FTYPE_EXE: ; still looking... now for '.exe' + 28202 00003820 89C7 mov di,ax + 28203 00003822 BE[C895] mov si,exeext ; ".EXE" + 28204 00003825 A7 cmpsw + 28205 00003826 7508 jnz short FTYPE_BAT + 28206 00003828 A7 cmpsw + 28207 00003829 7505 jnz short FTYPE_BAT + 28208 ;mov ax,4 + 28209 0000382B B80400 mov ax,SEARCH_EXE ; success! + 28210 0000382E EB12 jmp short FTYPE_EXIT + 28211 + 28212 ; Compare .BAT + 28213 FTYPE_BAT: ; still looking... now for '.bat' + 28214 00003830 89C7 mov di,ax + 28215 00003832 BE[CC95] mov si,batext ; ".BAT" + 28216 00003835 A7 cmpsw + 28217 00003836 7508 jnz short FTYPE_FAIL + 28218 00003838 A7 cmpsw + 28219 00003839 7505 jnz short FTYPE_FAIL + 28220 ;mov ax,2 + 28221 0000383B B80200 mov ax,SEARCH_BAT ; success! + 28222 0000383E EB02 jmp short FTYPE_EXIT + 28223 + 28224 FTYPE_FAIL: ; file doesn't match what we need + 28225 ;mov ax,ANULL ; 0 28226 ; 18/03/2023 - 28227 ; MSDOS 6.0 - 28228 00003842 803E[069F]01 cmp byte [ext_entered],1 - 28229 ;AN005; was an extension entered? - 28230 00003847 740A jz short FTYPE_DONE - 28231 ;AN005; no - exit - 28232 ;cmp ax,ANULL ;AN005; was any match found - 28233 00003849 21C0 and ax,ax ; ax = 0 ? - 28234 0000384B 7406 jz short FTYPE_DONE - 28235 ;AN005; no - exit - 28236 0000384D A2[069F] mov [ext_entered],al - 28237 ;AN005; save the match type found - 28238 00003850 B80800 mov ax,SEARCH_COM ;AN005; send back best was found to stop search - 28239 FTYPE_DONE: - 28240 00003853 5E pop si - 28241 00003854 5F pop di - 28242 00003855 C3 retn - 28243 - 28244 ; =============== S U B R O U T I N E ======================================= - 28245 - 28246 ; STRIP copies the source string (argv[0]) into the destination buffer, - 28247 ; replacing any extension with wildcards. - 28248 ; - 28249 ; ENTRY: - 28250 ; BX -- maximum length of destination buffer - 28251 ; DS:SI -- address of destination buffer - 28252 ; argv[0] -- command name to be stripped - 28253 ; EXIT: - 28254 ; CF -- set if failure, clear if successful - 28255 ; NOTE(S): - 28256 - 28257 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28258 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 28259 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM - 28260 STRIP: - 28261 00003856 50 push ax - 28262 00003857 53 push bx - 28263 00003858 51 push cx - 28264 00003859 52 push dx - 28265 0000385A 57 push di - 28266 0000385B 56 push si - 28267 ;pushf ; ** ; 18/03/2023 - 28268 - 28269 ; 05/05/2023 - 28270 ; MSDOS 6.0 - 28271 0000385C C606[069F]01 mov byte [ext_entered],1 - 28272 ;AN005; assume no extension on file name - 28273 ; MSDOS 3.3 (& MSDOS 6.0) - 28274 ;mov dx,[ARG_ARGV] - 28275 ;mov dx,ds:arg.argv[0].argpointer - 28276 ; save pointer to beginning of argstring - 28277 ;mov dx,[ARGV0_ARGPOINTER] - 28278 00003861 8B16[509F] mov dx,[ARG+ARGV_ELE.argpointer] - 28279 ;mov di,ds:arg.argv[0].argstartel - 28280 ; beginning of last pathname element - 28281 ;mov di,[ARGV0_ARGSTARTEL] ; beginning of last pathname element - 28282 00003865 8B3E[539F] mov di,[ARG+ARGV_ELE.argstartel] - 28283 00003869 803D00 cmp byte [di],0 ; *STARTEL == NULL means no command - 28284 0000386C 743D je short STRIP_ERROR - 28285 0000386E 89D1 mov cx,dx ; compute where end of argstring lies - 28286 ;add cx,ds:arg.argv[0].arglen - 28287 ;add cx,[ARGV0_ARGLEN] - 28288 00003870 030E[559F] add cx,[ARG+ARGV_ELE.arglen] - 28289 00003874 29F9 sub cx,di ; and then find length of last element - 28290 00003876 41 inc cx ; include null as well - 28291 00003877 B02E mov al,'.' - 28292 ;mov al,DOT ; let's find the filetype extension - 28293 00003879 FC cld - 28294 0000387A F2AE repnz scasb ; wind up pointing to either null or dot - 28295 - 28296 ; 18/03/2023 - 28297 ; MSDOS 6.0 - 28298 0000387C E307 jcxz PROCESS_EXT ;AN005; if no extension found, just continue - 28299 0000387E B000 mov al,0 ; 18/03/2023 - 28300 ;mov byte [ext_entered],0 - 28301 00003880 A2[069F] mov [ext_entered],al - 28302 ;AN005; we found an extension - 28303 ;;mov al,ANULL ;AN005; continue scanning until the - 28304 ;mov al,0 - 28305 00003883 F2AE repnz scasb ;AN005; end of line is reached. - 28306 PROCESS_EXT: - 28307 ; MSDOS 3.3 (& MSDOS 6.0) - 28308 00003885 89F9 mov cx,di ; pointer to end of argstring yields - 28309 00003887 29D1 sub cx,dx ; number of bytes to be copied - 28310 00003889 83EB04 sub bx,4 ; can argstring fit into dest. buffer? - 28311 0000388C 39D9 cmp cx,bx - 28312 0000388E 7F1B jg short STRIP_ERROR - 28313 ; if not, we must have a bad pathname - 28314 00003890 89F7 mov di,si ; destination buffer - 28315 00003892 89D6 mov si,dx ; source is beginning of pathname - 28316 00003894 FC cld - 28317 00003895 F3A4 rep movsb ; SI=arg,DI=buffer,CX=argend-argbeg - 28318 - 28319 ; 18/03/2023 - 28320 ; MSDOS 6.0 - 28321 00003897 803E[069F]01 cmp byte [ext_entered],1 - 28322 ;AN005; if an extension was entered - 28323 0000389C 750A jne short SKIP_WILDS ; cf = 1 ; 12/06/2023 - 28324 ;AN005; don't set up wildcard ext. - 28325 - 28326 ; MSDOS 3.3 (& MSDOS 6.0) - 28327 0000389E 4F dec di ; overwrite null or dot - 28328 0000389F AA stosb ; with a dot - 28329 000038A0 B03F mov al,'?' - 28330 ;mov al,WILDCHAR ; now add wildcards - 28331 000038A2 AA stosb - 28332 000038A3 AA stosb - 28333 000038A4 AA stosb - 28334 000038A5 B000 mov al,0 - 28335 ;mov al,ANULL ; and a terminating null - 28336 000038A7 AA stosb - 28337 SKIP_WILDS: - 28338 ;popf ; ** ; 18/03/2023 - 28339 000038A8 F8 clc - 28340 000038A9 EB01 jmp short STRIP_EXIT ; chill out... - 28341 - 28342 STRIP_ERROR: - 28343 ;popf ; ** ; 18/03/2023 - 28344 000038AB F9 stc - 28345 STRIP_EXIT: - 28346 000038AC 5E pop si - 28347 000038AD 5F pop di - 28348 000038AE 5A pop dx - 28349 000038AF 59 pop cx - 28350 000038B0 5B pop bx - 28351 000038B1 58 pop ax - 28352 000038B2 C3 retn - 28353 - 28354 ; =============== S U B R O U T I N E ======================================= - 28355 - 28356 ; SAVE_ARGS attempts to preserve the existing argv[]/argvcnt/argbuffer - 28357 ; - 28358 ; structure in newly allocated memory. The argv[] structure is found at the - 28359 ; beginning of this area. The caller indicates how much extra space is - 28360 ; needed in the resulting structure; Save_Args returns a segment number and - 28361 ; an offset into that area, indicating where the caller may preserve its own - 28362 ; data. Note that can be found at . - 28363 ; ENTRY: - 28364 ; BX -- size (in bytes) of extra area to allocate - 28365 ; EXIT: - 28366 ; AX -- segment of new area. - 28367 ; CF -- set if unable to save a copy. - 28368 ; NOTE(S): - 28369 ; 1) The allocated area will be AT LEAST the size requested -- since - 28370 ; the underlying MSDOS call, returns an integral number of - 28371 ; paragraphs. - 28372 ; 2) It is an error if MSDOS can't allocate AT LEAST as much memory - 28373 ; as the caller of Save_Args requests. - 28374 ; 3) AX is undefined if CF indicates an error. - 28375 - 28376 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28377 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 28378 ; 09/08/2024 - Retro DOS v5.0 COMMAND.COM - 28379 SAVE_ARGS: - 28380 000038B3 53 push bx - 28381 000038B4 51 push cx - 28382 000038B5 52 push dx - 28383 000038B6 57 push di - 28384 000038B7 56 push si - 28385 000038B8 55 push bp - 28386 ; 01/05/2023 - 28387 ; 26/04/2023 - 28388 ;pushf ; ** - 28389 ;;add bx,1363 ; space for arg structure, round up - 28390 ; 09/08/2024 - PCDOS 7.1 COMMAND.COM - 28391 ;add bx,1107 ; 1092+15 - 28392 000038B9 81C35304 add bx,ARG_UNIT.SIZE+15 ; 1348+15 - 28393 000038BD B104 mov cl,4 ; to paragraph size and convert - 28394 000038BF D3EB shr bx,cl ; size in bytes to size in paragraphs - 28395 000038C1 B80048 mov ax,ALLOC*256 ; 4800h - 28396 000038C4 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY - 28397 ; BX = number of 16-byte paragraphs desired - 28398 000038C6 7241 jc short SAVE_ERROR ; *** - 28399 000038C8 89C5 mov bp,ax ; save segment id - 28400 000038CA 06 push es ; save TRANGROUP address - 28401 000038CB 8EC0 mov es,ax ; switch to new memory segment - 28402 ; assume es:nothing - 28403 ;mov cx,1348 ; get back structure size - 28404 000038CD B94404 mov cx,ARG_UNIT.SIZE ; 1092 ; 09/08/2024 - 28405 000038D0 31FF xor di,di ; destination is new memory area - 28406 ;mov si,ARG_ARGV - 28407 000038D2 BE[509F] mov si,ARG ; source is arg structure - 28408 ; 09/08/2024 - 28409 000038D5 56 push si - 28410 000038D6 F3A4 rep movsb ; move that sucker! - 28411 ;mov cx,arg.argvcnt ; adjust argv pointers - 28412 ;mov cx,[ARG_ARGVCNT] - 28413 000038D8 8B0E[10A2] mov cx,[ARG+ARG_UNIT.argvcnt] - 28414 000038DC 31C0 xor ax,ax ; base address for argv_calc - 28415 - 28416 ; Bugbug: What did they mean by this? - 28417 ; Note that the replacement line produces exactly the same code. - 28418 ;; mov SI, OFFSET TRANGROUP:arg.argbuf - OFFSET arg_unit.argbuf - 28419 ; mov SI, OFFSET TRANGROUP:arg - 28420 - 28421 ;;mov si,ARG_ARGV - 28422 ;mov si,ARG - 28423 ; 09/08/2024 - 28424 000038DE 5E pop si - 28425 SAVE_PTR_LOOP: - 28426 000038DF 49 dec cx ; exhausted all args? - 28427 000038E0 7C24 jl short SAVE_DONE - 28428 000038E2 89CB mov bx,cx ; get arg index and - 28429 000038E4 E8A9FC call argv_calc ; convert to a pointer - 28430 ;mov dx,ds:arg.argv[bx].argpointer - 28431 ;mov dx,[ARG_ARGV+bx] - 28432 000038E7 8B97[509F] mov dx,[ARG+ARGV_ELE.argpointer+bx] - 28433 000038EB 29F2 sub dx,si ; adjust argpointer - 28434 ;mov es:argv[BX].argpointer,dx - 28435 ;mov [es:bx+ARGV_ELE.argpointer],dx ; mov [es:bx+0],dx - 28436 000038ED 268917 mov [es:bx],dx - 28437 ;mov dx,ds:arg.argv[bx].argstartel - 28438 ;mov dx,[ARGV0_ARGSTARTEL+bx] - 28439 000038F0 8B97[539F] mov dx,[ARG+ARGV_ELE.argstartel+bx] - 28440 000038F4 29F2 sub dx,si ; and adjust argstartel - 28441 ;mov es:argv[bx].argstartel,dx - 28442 ;mov [es:bx+3],dx - 28443 000038F6 26895703 mov [es:bx+ARGV_ELE.argstartel],dx - 28444 ;mov dx,ds:arg.argv[bx].arg_ocomptr - 28445 ;mov dx,[ARGV0_OCOMPTR+bx] - 28446 000038FA 8B97[599F] mov dx,[ARG+ARGV_ELE.arg_ocomptr+bx] - 28447 000038FE 29F2 sub dx,si ; and adjust arg_ocomptr - 28448 ;mov es:argv[bx].arg_ocomptr,dx - 28449 ;mov [es:bx+9],dx - 28450 00003900 26895709 mov [es:bx+ARGV_ELE.arg_ocomptr],dx - 28451 00003904 EBD9 jmp short SAVE_PTR_LOOP - 28452 SAVE_DONE: - 28453 00003906 07 pop es ; back we go to TRANGROUP - 28454 ; assume es:nothing - 28455 00003907 89E8 mov ax,bp ; restore segment id - 28456 ; 26/04/2023 - 28457 ; cf = 0 ; * - 28458 ;jmp short SAVE_OK - 28459 - 28460 ; 26/04/2023 - 28461 ;SAVE_ERROR: - 28462 ; ; 26/04/2023 - 28463 ; ;popf ; ** - 28464 ; stc - 28465 ; jmp short SAVE_EXIT - 28466 - 28467 SAVE_OK: - 28468 ; 26/04/2023 - 28469 ;popf ; ** - 28470 ; 26/04/2023 - 28471 ; cf = 0 ; * - 28472 ;clc - 28473 SAVE_EXIT: - 28474 SAVE_ERROR: ; 26/04/2023 (cf=1) ; *** - 28475 00003909 5D pop bp - 28476 0000390A 5E pop si - 28477 0000390B 5F pop di - 28478 0000390C 5A pop dx - 28479 0000390D 59 pop cx - 28480 0000390E 5B pop bx - 28481 answ_no: ; 26/04/2023 - 28482 0000390F C3 retn - 28483 - 28484 ;============================================================================ - 28485 ; TUCODE.ASM, MSDOS 6.0, 1991 (1) - 28486 ;============================================================================ - 28487 ; 02/10/2018 - Retro DOS v3.0 - 28488 - 28489 ; Title COMMAND Language midifiable Code Transient - 28490 - 28491 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2843h - 28492 - 28493 ; =============== S U B R O U T I N E ======================================= - 28494 - 28495 ; **************************************************************** - 28496 ; * - 28497 ; * ROUTINE: NOTEST2 - execution of DEL/ERASE command - 28498 ; * - 28499 ; * FUNCTION: Delete files based on user parsed input. Prompt - 28500 ; * user for Y/N if necessary. If an error occurs, - 28501 ; * set up an error message and go to CERROR. - 28502 ; * - 28503 ; * INPUT: FCB at 5ch set up with filename(s) entered - 28504 ; * Current directory set to entered directory + 28227 00003840 29C0 sub ax,ax ; ax = 0 + 28228 FTYPE_EXIT: + 28229 ; 18/03/2023 + 28230 ; MSDOS 6.0 + 28231 00003842 803E[069F]01 cmp byte [ext_entered],1 + 28232 ;AN005; was an extension entered? + 28233 00003847 740A jz short FTYPE_DONE + 28234 ;AN005; no - exit + 28235 ;cmp ax,ANULL ;AN005; was any match found + 28236 00003849 21C0 and ax,ax ; ax = 0 ? + 28237 0000384B 7406 jz short FTYPE_DONE + 28238 ;AN005; no - exit + 28239 0000384D A2[069F] mov [ext_entered],al + 28240 ;AN005; save the match type found + 28241 00003850 B80800 mov ax,SEARCH_COM ;AN005; send back best was found to stop search + 28242 FTYPE_DONE: + 28243 00003853 5E pop si + 28244 00003854 5F pop di + 28245 00003855 C3 retn + 28246 + 28247 ; =============== S U B R O U T I N E ======================================= + 28248 + 28249 ; STRIP copies the source string (argv[0]) into the destination buffer, + 28250 ; replacing any extension with wildcards. + 28251 ; + 28252 ; ENTRY: + 28253 ; BX -- maximum length of destination buffer + 28254 ; DS:SI -- address of destination buffer + 28255 ; argv[0] -- command name to be stripped + 28256 ; EXIT: + 28257 ; CF -- set if failure, clear if successful + 28258 ; NOTE(S): + 28259 + 28260 ; 18/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28261 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28262 ; 08/08/2024 - Retro DOS v5.0 COMMAND.COM + 28263 STRIP: + 28264 00003856 50 push ax + 28265 00003857 53 push bx + 28266 00003858 51 push cx + 28267 00003859 52 push dx + 28268 0000385A 57 push di + 28269 0000385B 56 push si + 28270 ;pushf ; ** ; 18/03/2023 + 28271 + 28272 ; 05/05/2023 + 28273 ; MSDOS 6.0 + 28274 0000385C C606[069F]01 mov byte [ext_entered],1 + 28275 ;AN005; assume no extension on file name + 28276 ; MSDOS 3.3 (& MSDOS 6.0) + 28277 ;mov dx,[ARG_ARGV] + 28278 ;mov dx,ds:arg.argv[0].argpointer + 28279 ; save pointer to beginning of argstring + 28280 ;mov dx,[ARGV0_ARGPOINTER] + 28281 00003861 8B16[509F] mov dx,[ARG+ARGV_ELE.argpointer] + 28282 ;mov di,ds:arg.argv[0].argstartel + 28283 ; beginning of last pathname element + 28284 ;mov di,[ARGV0_ARGSTARTEL] ; beginning of last pathname element + 28285 00003865 8B3E[539F] mov di,[ARG+ARGV_ELE.argstartel] + 28286 00003869 803D00 cmp byte [di],0 ; *STARTEL == NULL means no command + 28287 0000386C 743D je short STRIP_ERROR + 28288 0000386E 89D1 mov cx,dx ; compute where end of argstring lies + 28289 ;add cx,ds:arg.argv[0].arglen + 28290 ;add cx,[ARGV0_ARGLEN] + 28291 00003870 030E[559F] add cx,[ARG+ARGV_ELE.arglen] + 28292 00003874 29F9 sub cx,di ; and then find length of last element + 28293 00003876 41 inc cx ; include null as well + 28294 00003877 B02E mov al,'.' + 28295 ;mov al,DOT ; let's find the filetype extension + 28296 00003879 FC cld + 28297 0000387A F2AE repnz scasb ; wind up pointing to either null or dot + 28298 + 28299 ; 18/03/2023 + 28300 ; MSDOS 6.0 + 28301 0000387C E307 jcxz PROCESS_EXT ;AN005; if no extension found, just continue + 28302 0000387E B000 mov al,0 ; 18/03/2023 + 28303 ;mov byte [ext_entered],0 + 28304 00003880 A2[069F] mov [ext_entered],al + 28305 ;AN005; we found an extension + 28306 ;;mov al,ANULL ;AN005; continue scanning until the + 28307 ;mov al,0 + 28308 00003883 F2AE repnz scasb ;AN005; end of line is reached. + 28309 PROCESS_EXT: + 28310 ; MSDOS 3.3 (& MSDOS 6.0) + 28311 00003885 89F9 mov cx,di ; pointer to end of argstring yields + 28312 00003887 29D1 sub cx,dx ; number of bytes to be copied + 28313 00003889 83EB04 sub bx,4 ; can argstring fit into dest. buffer? + 28314 0000388C 39D9 cmp cx,bx + 28315 0000388E 7F1B jg short STRIP_ERROR + 28316 ; if not, we must have a bad pathname + 28317 00003890 89F7 mov di,si ; destination buffer + 28318 00003892 89D6 mov si,dx ; source is beginning of pathname + 28319 00003894 FC cld + 28320 00003895 F3A4 rep movsb ; SI=arg,DI=buffer,CX=argend-argbeg + 28321 + 28322 ; 18/03/2023 + 28323 ; MSDOS 6.0 + 28324 00003897 803E[069F]01 cmp byte [ext_entered],1 + 28325 ;AN005; if an extension was entered + 28326 0000389C 750A jne short SKIP_WILDS ; cf = 1 ; 12/06/2023 + 28327 ;AN005; don't set up wildcard ext. + 28328 + 28329 ; MSDOS 3.3 (& MSDOS 6.0) + 28330 0000389E 4F dec di ; overwrite null or dot + 28331 0000389F AA stosb ; with a dot + 28332 000038A0 B03F mov al,'?' + 28333 ;mov al,WILDCHAR ; now add wildcards + 28334 000038A2 AA stosb + 28335 000038A3 AA stosb + 28336 000038A4 AA stosb + 28337 000038A5 B000 mov al,0 + 28338 ;mov al,ANULL ; and a terminating null + 28339 000038A7 AA stosb + 28340 SKIP_WILDS: + 28341 ;popf ; ** ; 18/03/2023 + 28342 000038A8 F8 clc + 28343 000038A9 EB01 jmp short STRIP_EXIT ; chill out... + 28344 + 28345 STRIP_ERROR: + 28346 ;popf ; ** ; 18/03/2023 + 28347 000038AB F9 stc + 28348 STRIP_EXIT: + 28349 000038AC 5E pop si + 28350 000038AD 5F pop di + 28351 000038AE 5A pop dx + 28352 000038AF 59 pop cx + 28353 000038B0 5B pop bx + 28354 000038B1 58 pop ax + 28355 000038B2 C3 retn + 28356 + 28357 ; =============== S U B R O U T I N E ======================================= + 28358 + 28359 ; SAVE_ARGS attempts to preserve the existing argv[]/argvcnt/argbuffer + 28360 ; + 28361 ; structure in newly allocated memory. The argv[] structure is found at the + 28362 ; beginning of this area. The caller indicates how much extra space is + 28363 ; needed in the resulting structure; Save_Args returns a segment number and + 28364 ; an offset into that area, indicating where the caller may preserve its own + 28365 ; data. Note that can be found at . + 28366 ; ENTRY: + 28367 ; BX -- size (in bytes) of extra area to allocate + 28368 ; EXIT: + 28369 ; AX -- segment of new area. + 28370 ; CF -- set if unable to save a copy. + 28371 ; NOTE(S): + 28372 ; 1) The allocated area will be AT LEAST the size requested -- since + 28373 ; the underlying MSDOS call, returns an integral number of + 28374 ; paragraphs. + 28375 ; 2) It is an error if MSDOS can't allocate AT LEAST as much memory + 28376 ; as the caller of Save_Args requests. + 28377 ; 3) AX is undefined if CF indicates an error. + 28378 + 28379 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28380 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28381 ; 09/08/2024 - Retro DOS v5.0 COMMAND.COM + 28382 SAVE_ARGS: + 28383 000038B3 53 push bx + 28384 000038B4 51 push cx + 28385 000038B5 52 push dx + 28386 000038B6 57 push di + 28387 000038B7 56 push si + 28388 000038B8 55 push bp + 28389 ; 01/05/2023 + 28390 ; 26/04/2023 + 28391 ;pushf ; ** + 28392 ;;add bx,1363 ; space for arg structure, round up + 28393 ; 09/08/2024 - PCDOS 7.1 COMMAND.COM + 28394 ;add bx,1107 ; 1092+15 + 28395 000038B9 81C35304 add bx,ARG_UNIT.SIZE+15 ; 1348+15 + 28396 000038BD B104 mov cl,4 ; to paragraph size and convert + 28397 000038BF D3EB shr bx,cl ; size in bytes to size in paragraphs + 28398 000038C1 B80048 mov ax,ALLOC*256 ; 4800h + 28399 000038C4 CD21 int 21h ; DOS - 2+ - ALLOCATE MEMORY + 28400 ; BX = number of 16-byte paragraphs desired + 28401 000038C6 7241 jc short SAVE_ERROR ; *** + 28402 000038C8 89C5 mov bp,ax ; save segment id + 28403 000038CA 06 push es ; save TRANGROUP address + 28404 000038CB 8EC0 mov es,ax ; switch to new memory segment + 28405 ; assume es:nothing + 28406 ;mov cx,1348 ; get back structure size + 28407 000038CD B94404 mov cx,ARG_UNIT.SIZE ; 1092 ; 09/08/2024 + 28408 000038D0 31FF xor di,di ; destination is new memory area + 28409 ;mov si,ARG_ARGV + 28410 000038D2 BE[509F] mov si,ARG ; source is arg structure + 28411 ; 09/08/2024 + 28412 000038D5 56 push si + 28413 000038D6 F3A4 rep movsb ; move that sucker! + 28414 ;mov cx,arg.argvcnt ; adjust argv pointers + 28415 ;mov cx,[ARG_ARGVCNT] + 28416 000038D8 8B0E[10A2] mov cx,[ARG+ARG_UNIT.argvcnt] + 28417 000038DC 31C0 xor ax,ax ; base address for argv_calc + 28418 + 28419 ; Bugbug: What did they mean by this? + 28420 ; Note that the replacement line produces exactly the same code. + 28421 ;; mov SI, OFFSET TRANGROUP:arg.argbuf - OFFSET arg_unit.argbuf + 28422 ; mov SI, OFFSET TRANGROUP:arg + 28423 + 28424 ;;mov si,ARG_ARGV + 28425 ;mov si,ARG + 28426 ; 09/08/2024 + 28427 000038DE 5E pop si + 28428 SAVE_PTR_LOOP: + 28429 000038DF 49 dec cx ; exhausted all args? + 28430 000038E0 7C24 jl short SAVE_DONE + 28431 000038E2 89CB mov bx,cx ; get arg index and + 28432 000038E4 E8A9FC call argv_calc ; convert to a pointer + 28433 ;mov dx,ds:arg.argv[bx].argpointer + 28434 ;mov dx,[ARG_ARGV+bx] + 28435 000038E7 8B97[509F] mov dx,[ARG+ARGV_ELE.argpointer+bx] + 28436 000038EB 29F2 sub dx,si ; adjust argpointer + 28437 ;mov es:argv[BX].argpointer,dx + 28438 ;mov [es:bx+ARGV_ELE.argpointer],dx ; mov [es:bx+0],dx + 28439 000038ED 268917 mov [es:bx],dx + 28440 ;mov dx,ds:arg.argv[bx].argstartel + 28441 ;mov dx,[ARGV0_ARGSTARTEL+bx] + 28442 000038F0 8B97[539F] mov dx,[ARG+ARGV_ELE.argstartel+bx] + 28443 000038F4 29F2 sub dx,si ; and adjust argstartel + 28444 ;mov es:argv[bx].argstartel,dx + 28445 ;mov [es:bx+3],dx + 28446 000038F6 26895703 mov [es:bx+ARGV_ELE.argstartel],dx + 28447 ;mov dx,ds:arg.argv[bx].arg_ocomptr + 28448 ;mov dx,[ARGV0_OCOMPTR+bx] + 28449 000038FA 8B97[599F] mov dx,[ARG+ARGV_ELE.arg_ocomptr+bx] + 28450 000038FE 29F2 sub dx,si ; and adjust arg_ocomptr + 28451 ;mov es:argv[bx].arg_ocomptr,dx + 28452 ;mov [es:bx+9],dx + 28453 00003900 26895709 mov [es:bx+ARGV_ELE.arg_ocomptr],dx + 28454 00003904 EBD9 jmp short SAVE_PTR_LOOP + 28455 SAVE_DONE: + 28456 00003906 07 pop es ; back we go to TRANGROUP + 28457 ; assume es:nothing + 28458 00003907 89E8 mov ax,bp ; restore segment id + 28459 ; 26/04/2023 + 28460 ; cf = 0 ; * + 28461 ;jmp short SAVE_OK + 28462 + 28463 ; 26/04/2023 + 28464 ;SAVE_ERROR: + 28465 ; ; 26/04/2023 + 28466 ; ;popf ; ** + 28467 ; stc + 28468 ; jmp short SAVE_EXIT + 28469 + 28470 SAVE_OK: + 28471 ; 26/04/2023 + 28472 ;popf ; ** + 28473 ; 26/04/2023 + 28474 ; cf = 0 ; * + 28475 ;clc + 28476 SAVE_EXIT: + 28477 SAVE_ERROR: ; 26/04/2023 (cf=1) ; *** + 28478 00003909 5D pop bp + 28479 0000390A 5E pop si + 28480 0000390B 5F pop di + 28481 0000390C 5A pop dx + 28482 0000390D 59 pop cx + 28483 0000390E 5B pop bx + 28484 answ_no: ; 26/04/2023 + 28485 0000390F C3 retn + 28486 + 28487 ;============================================================================ + 28488 ; TUCODE.ASM, MSDOS 6.0, 1991 (1) + 28489 ;============================================================================ + 28490 ; 02/10/2018 - Retro DOS v3.0 + 28491 + 28492 ; Title COMMAND Language midifiable Code Transient + 28493 + 28494 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2843h + 28495 + 28496 ; =============== S U B R O U T I N E ======================================= + 28497 + 28498 ; **************************************************************** + 28499 ; * + 28500 ; * ROUTINE: NOTEST2 - execution of DEL/ERASE command + 28501 ; * + 28502 ; * FUNCTION: Delete files based on user parsed input. Prompt + 28503 ; * user for Y/N if necessary. If an error occurs, + 28504 ; * set up an error message and go to CERROR. 28505 ; * - 28506 ; * OUTPUT: none - 28507 ; * - 28508 ; **************************************************************** - 28509 ; - 28510 ; ARE YOU SURE prompt when deleting *.* - 28511 - 28512 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28513 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 28514 notest2: - 28515 00003910 B90B00 mov cx,11 - 28516 00003913 BE5D00 mov si,FCB+1 ; 5Dh - 28517 ambspec: - 28518 00003916 AC lodsb - 28519 00003917 3C3F cmp al,'?' - 28520 00003919 7502 jne short allfil - 28521 0000391B E2F9 loop ambspec - 28522 allfil: - 28523 ; 19/03/2023 - 28524 ;cmp cx,0 - 28525 0000391D 09C9 or cx,cx - 28526 0000391F 752E jnz short noprmpt - 28527 askagn: - 28528 00003921 BA[F190] mov dx,SureMes_Ptr ; "Are you sure (Y/N)?" - 28529 00003924 E8011B call std_printf - 28530 00003927 BE8000 mov si,80h - 28531 0000392A 89F2 mov dx,si - 28532 0000392C C7047800 mov word [si],120 ; zero length - 28533 ;mov ax,0C0Ah - 28534 00003930 B80A0C mov ax,(STD_CON_INPUT_FLUSH<<8)|Std_Con_String_Input - 28535 00003933 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER - 28536 ; AL must be 01h,06h,07h,08h or 0Ah. - 28537 00003935 AD lodsw - 28538 00003936 08E4 or ah,ah - 28539 00003938 74E7 jz short askagn - 28540 0000393A E849F0 call scanoff - 28541 ; 19/03/2023 - 28542 ; MSDOS 6.0 - 28543 0000393D E80C02 call char_in_xlat ; Convert to upper case - 28544 ;retc ; return if function not supported - 28545 ; 19/03/2023 - 28546 ;jnc short check_yn - 28547 ;answ_no: - 28548 ;retn - 28549 00003940 72CD jc short answ_no - 28550 - 28551 ; 19/03/2023 - 28552 ; AL = 0 if it was (country depended) NO character - 28553 ; AL = 1 if it was (country depenced) YES character - 28554 - 28555 ; MSDOS 3.3 - 28556 ;call UPCONV + 28506 ; * INPUT: FCB at 5ch set up with filename(s) entered + 28507 ; * Current directory set to entered directory + 28508 ; * + 28509 ; * OUTPUT: none + 28510 ; * + 28511 ; **************************************************************** + 28512 ; + 28513 ; ARE YOU SURE prompt when deleting *.* + 28514 + 28515 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28516 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28517 notest2: + 28518 00003910 B90B00 mov cx,11 + 28519 00003913 BE5D00 mov si,FCB+1 ; 5Dh + 28520 ambspec: + 28521 00003916 AC lodsb + 28522 00003917 3C3F cmp al,'?' + 28523 00003919 7502 jne short allfil + 28524 0000391B E2F9 loop ambspec + 28525 allfil: + 28526 ; 19/03/2023 + 28527 ;cmp cx,0 + 28528 0000391D 09C9 or cx,cx + 28529 0000391F 752E jnz short noprmpt + 28530 askagn: + 28531 00003921 BA[F190] mov dx,SureMes_Ptr ; "Are you sure (Y/N)?" + 28532 00003924 E8011B call std_printf + 28533 00003927 BE8000 mov si,80h + 28534 0000392A 89F2 mov dx,si + 28535 0000392C C7047800 mov word [si],120 ; zero length + 28536 ;mov ax,0C0Ah + 28537 00003930 B80A0C mov ax,(STD_CON_INPUT_FLUSH<<8)|Std_Con_String_Input + 28538 00003933 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER + 28539 ; AL must be 01h,06h,07h,08h or 0Ah. + 28540 00003935 AD lodsw + 28541 00003936 08E4 or ah,ah + 28542 00003938 74E7 jz short askagn + 28543 0000393A E849F0 call scanoff + 28544 ; 19/03/2023 + 28545 ; MSDOS 6.0 + 28546 0000393D E80C02 call char_in_xlat ; Convert to upper case + 28547 ;retc ; return if function not supported + 28548 ; 19/03/2023 + 28549 ;jnc short check_yn + 28550 ;answ_no: + 28551 ;retn + 28552 00003940 72CD jc short answ_no + 28553 + 28554 ; 19/03/2023 + 28555 ; AL = 0 if it was (country depended) NO character + 28556 ; AL = 1 if it was (country depenced) YES character 28557 - 28558 ; 19/03/2023 - 28559 ; MSDOS 3.3 (& MSDOS 6.0) - 28560 ;cmp al,[CAPITAL_N] - 28561 ;jne short CHECK_Y - 28562 ;retn - 28563 ;CHECK_Y: - 28564 ;cmp al,[CAPITAL_Y] - 28565 ;pushf - 28566 ;call CRLF2 - 28567 ;popf - 28568 ;jne short ASKAGN - 28569 - 28570 check_yn: - 28571 ; 19/03/2023 - 28572 ;cmp al,0 ; NO character - 28573 00003942 08C0 or al,al - 28574 00003944 74C9 jz short answ_no - 28575 ;cmp al,1 ;YES character - 28576 00003946 FEC8 dec al ; 1 -> 0 --> zf = 1 - 28577 00003948 9C pushf - 28578 00003949 E82DF0 call CRLF2 - 28579 0000394C 9D popf - 28580 0000394D 75D2 jnz short askagn - 28581 noprmpt: - 28582 0000394F B413 mov ah,FCB_Delete ; 13h - 28583 00003951 BA5C00 mov dx,FCB ; 5Ch - 28584 00003954 CD21 int 21h ; DOS - DELETE FILE via FCB - 28585 ; DS:DX -> FCB with filename field filled with - 28586 ; template for deletion ('?' wildcard allowed,but not '*') - 28587 ; Return: AL = 00h file found,FFh file not found - 28588 00003956 FEC0 inc al - 28589 00003958 7403 jz short eraerr - 28590 ; 26/04/2023 - 28591 ;call RestUDir - 28592 ;answ_no: - 28593 ;retn - 28594 0000395A E9D3EE jmp RestUDir ; 26/04/2023 - 28595 - 28596 ; 19/03/2023 - 28597 ; MSDOS 6.0 - 28598 eraerr: - 28599 ;invoke set_ext_error_msg - 28600 ;AN022; set up the extended error - 28601 0000395D E8DBE6 call Set_Ext_Error_Msg - 28602 00003960 52 push dx ;AN022; save message - 28603 ;invoke RESTUDIR - 28604 00003961 E8CCEE call RestUDir - 28605 00003964 5A pop dx ;AN022; restore message - 28606 - 28607 00003965 833E[D78F]12 cmp word [extend_buf_ptr],ERROR_NO_MORE_FILES ; 18 - 28608 ;AN022; convert no more files to - 28609 0000396A 7506 jne short cerrorj2 ;AN022; file not found - 28610 0000396C C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 - 28611 ;AN000; get message number in control block - 28612 cerrorj2: - 28613 00003972 E9B1F3 jmp cerror - 28614 - 28615 ; 19/03/2023 - 28616 ; MSDOS 3.3 - 28617 ;ERAERR: - 28618 ;mov ah,Set_DMA ; 1Ah - 28619 ;mov dx,FCB ; 5Ch - 28620 ;int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 28621 ; ; DS:DX -> disk transfer buffer - 28622 ;mov ah,Dir_Search_First ; 11h - 28623 ;int 21h ; DOS - SEARCH FIRST USING FCB - 28624 ; ; DS:DX -> FCB - 28625 ;push ax - 28626 ;call RESTUDIR - 28627 ;pop ax - 28628 ;mov dx,FNOTFOUNDPTR - 28629 ;inc al - 28630 ;jz short CERRORJ - 28631 ;mov dx,ACCDENPTR - 28632 ;jmp CERROR - 28633 - 28634 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28635 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:36D4h + 28558 ; MSDOS 3.3 + 28559 ;call UPCONV + 28560 + 28561 ; 19/03/2023 + 28562 ; MSDOS 3.3 (& MSDOS 6.0) + 28563 ;cmp al,[CAPITAL_N] + 28564 ;jne short CHECK_Y + 28565 ;retn + 28566 ;CHECK_Y: + 28567 ;cmp al,[CAPITAL_Y] + 28568 ;pushf + 28569 ;call CRLF2 + 28570 ;popf + 28571 ;jne short ASKAGN + 28572 + 28573 check_yn: + 28574 ; 19/03/2023 + 28575 ;cmp al,0 ; NO character + 28576 00003942 08C0 or al,al + 28577 00003944 74C9 jz short answ_no + 28578 ;cmp al,1 ;YES character + 28579 00003946 FEC8 dec al ; 1 -> 0 --> zf = 1 + 28580 00003948 9C pushf + 28581 00003949 E82DF0 call CRLF2 + 28582 0000394C 9D popf + 28583 0000394D 75D2 jnz short askagn + 28584 noprmpt: + 28585 0000394F B413 mov ah,FCB_Delete ; 13h + 28586 00003951 BA5C00 mov dx,FCB ; 5Ch + 28587 00003954 CD21 int 21h ; DOS - DELETE FILE via FCB + 28588 ; DS:DX -> FCB with filename field filled with + 28589 ; template for deletion ('?' wildcard allowed,but not '*') + 28590 ; Return: AL = 00h file found,FFh file not found + 28591 00003956 FEC0 inc al + 28592 00003958 7403 jz short eraerr + 28593 ; 26/04/2023 + 28594 ;call RestUDir + 28595 ;answ_no: + 28596 ;retn + 28597 0000395A E9D3EE jmp RestUDir ; 26/04/2023 + 28598 + 28599 ; 19/03/2023 + 28600 ; MSDOS 6.0 + 28601 eraerr: + 28602 ;invoke set_ext_error_msg + 28603 ;AN022; set up the extended error + 28604 0000395D E8DBE6 call Set_Ext_Error_Msg + 28605 00003960 52 push dx ;AN022; save message + 28606 ;invoke RESTUDIR + 28607 00003961 E8CCEE call RestUDir + 28608 00003964 5A pop dx ;AN022; restore message + 28609 + 28610 00003965 833E[D78F]12 cmp word [extend_buf_ptr],ERROR_NO_MORE_FILES ; 18 + 28611 ;AN022; convert no more files to + 28612 0000396A 7506 jne short cerrorj2 ;AN022; file not found + 28613 0000396C C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 + 28614 ;AN000; get message number in control block + 28615 cerrorj2: + 28616 00003972 E9B1F3 jmp cerror + 28617 + 28618 ; 19/03/2023 + 28619 ; MSDOS 3.3 + 28620 ;ERAERR: + 28621 ;mov ah,Set_DMA ; 1Ah + 28622 ;mov dx,FCB ; 5Ch + 28623 ;int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 28624 ; ; DS:DX -> disk transfer buffer + 28625 ;mov ah,Dir_Search_First ; 11h + 28626 ;int 21h ; DOS - SEARCH FIRST USING FCB + 28627 ; ; DS:DX -> FCB + 28628 ;push ax + 28629 ;call RESTUDIR + 28630 ;pop ax + 28631 ;mov dx,FNOTFOUNDPTR + 28632 ;inc al + 28633 ;jz short CERRORJ + 28634 ;mov dx,ACCDENPTR + 28635 ;jmp CERROR 28636 - 28637 ; **************************************************************** - 28638 ; * - 28639 ; * ROUTINE: SLASHP_ERASE - execution of DEL/ERASE /P - 28640 ; * - 28641 ; * FUNCTION: Delete files based on user parsed input. Prompt - 28642 ; * user for Y/N where necessary. If an error occurs - 28643 ; * set up and error message and transfer control - 28644 ; * to CERROR. - 28645 ; * - 28646 ; * INPUT: FCB at 5Ch set up with filename(s) entered - 28647 ; * Current directory set to entered directory + 28637 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28638 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:36D4h + 28639 + 28640 ; **************************************************************** + 28641 ; * + 28642 ; * ROUTINE: SLASHP_ERASE - execution of DEL/ERASE /P + 28643 ; * + 28644 ; * FUNCTION: Delete files based on user parsed input. Prompt + 28645 ; * user for Y/N where necessary. If an error occurs + 28646 ; * set up and error message and transfer control + 28647 ; * to CERROR. 28648 ; * - 28649 ; * OUTPUT: none - 28650 ; * - 28651 ; **************************************************************** - 28652 - 28653 ; 19/03/2023 - 28654 slashp_erase: ;AN000; entry point - 28655 ;invoke build_dir_string ;AN000; set up current directory string for output - 28656 00003975 E885E8 call build_dir_string - 28657 - 28658 00003978 B41A mov ah,Set_DMA ; 1Ah ;AN000; issue set dta int 21h - 28659 ;mov dx,offset trangroup:destdir - 28660 0000397A BA[F69C] mov dx,DESTDIR ;AN000; use Destdir for target - 28661 0000397D CD21 int 21h ;AN000; - 28662 - 28663 ;mov ah,11h - 28664 0000397F B411 mov ah,Dir_Search_First ;AN000; do dir search first int 21h - 28665 00003981 BA5C00 mov dx,FCB ; 5Ch ;AN000; use FCB at 5Ch for target - 28666 00003984 CD21 int 21h ;AN000; - 28667 00003986 FEC0 inc al ;AN000; did an error occur - 28668 ;jz short eraerr ;AN022; go to error exit - 28669 ; 26/04/2023 - 28670 00003988 7502 jnz short delete_prompt_loop - 28671 + 28649 ; * INPUT: FCB at 5Ch set up with filename(s) entered + 28650 ; * Current directory set to entered directory + 28651 ; * + 28652 ; * OUTPUT: none + 28653 ; * + 28654 ; **************************************************************** + 28655 + 28656 ; 19/03/2023 + 28657 slashp_erase: ;AN000; entry point + 28658 ;invoke build_dir_string ;AN000; set up current directory string for output + 28659 00003975 E885E8 call build_dir_string + 28660 + 28661 00003978 B41A mov ah,Set_DMA ; 1Ah ;AN000; issue set dta int 21h + 28662 ;mov dx,offset trangroup:destdir + 28663 0000397A BA[F69C] mov dx,DESTDIR ;AN000; use Destdir for target + 28664 0000397D CD21 int 21h ;AN000; + 28665 + 28666 ;mov ah,11h + 28667 0000397F B411 mov ah,Dir_Search_First ;AN000; do dir search first int 21h + 28668 00003981 BA5C00 mov dx,FCB ; 5Ch ;AN000; use FCB at 5Ch for target + 28669 00003984 CD21 int 21h ;AN000; + 28670 00003986 FEC0 inc al ;AN000; did an error occur + 28671 ;jz short eraerr ;AN022; go to error exit 28672 ; 26/04/2023 - 28673 stop_del: - 28674 0000398A EBD1 jmp short eraerr ;AN022; go to error exit - need long jmp - 28675 - 28676 delete_prompt_loop: ;AN000; - 28677 ;mov si,offset trangroup:destdir+1 - 28678 0000398C BE[F79C] mov si,DESTDIR+1 ;AN000; set up FCB as source - 28679 ;mov di,offset trangroup:dest - 28680 0000398F BF[C69C] mov di,DEST ;AN000; set up dest as target - 28681 00003992 A0[FA9B] mov al,[DIRCHAR] ;AN000; store a "\" in the first char - 28682 00003995 AA stosb ;AN000; of DEST - 28683 ;invoke FCB_TO_ASCZ ;AN000; convert filename from FCB to ASCIIZ string - 28684 00003996 E80CF0 call FCB_TO_ASCZ - 28685 - 28686 slashp_askagn: ;AN000; - 28687 00003999 E8DDEF call CRLF2 ;AN000; print out carriage return, line feed - 28688 ;mov dx,offset trangroup:bwdbuf - 28689 0000399C BA[399D] mov dx,BWDBUF ;AN000; print out current directory string - 28690 0000399F 89D3 mov bx,dx ;AN000; get string pointer in bx - 28691 000039A1 807F0300 cmp byte [bx+3],END_OF_LINE_OUT ; 0 - 28692 ;AN000; see if only D:\,0 - 28693 000039A5 7504 jnz short not_del_root ;AN000; no continue - 28694 000039A7 C6470200 mov byte [bx+2],END_OF_LINE_OUT ; 0 - 28695 ;AN000; yes, get rid of \ ; - 28696 not_del_root: ;AN000; - 28697 000039AB 8916[A09D] mov [string_ptr_2],dx ;AN000; - 28698 ;mov dx,offset trangroup:string_buf_ptr - 28699 000039AF BA[DF91] mov dx,string_buf_ptr ;AN000; - 28700 ;invoke std_printf ;AN000; - 28701 000039B2 E8731A call std_printf - 28702 ;mov dx,offset trangroup:dest - 28703 000039B5 BA[C69C] mov dx,DEST ;AN000; print out file name string - 28704 000039B8 8916[A09D] mov [string_ptr_2],dx ;AN000; - 28705 ;mov dx,offset trangroup:string_buf_ptr - 28706 000039BC BA[DF91] mov dx,string_buf_ptr ;AN000; - 28707 ;invoke std_printf ;AN000; - 28708 000039BF E8661A call std_printf - 28709 ;mov dx,offset trangroup:Del_Y_N_Ptr - 28710 000039C2 BA[EE90] mov dx,Del_Y_N_Ptr ;AN000; issue ", Delete (Y/N)?" message - 28711 ;invoke std_printf ;AN000; - 28712 000039C5 E8601A call std_printf - 28713 - 28714 ;;M029 mov si,80H ;AN000; set up buffer for input - 28715 ;;M029 mov dx,si ;AN000; - 28716 ;;M029 mov word ptr [si],combuflen ;AN000; - 28717 ;;M029 mov ax,(std_con_input_flush shl 8) or std_con_string_input ;AN000; - 28718 ;;M029 int 21h ;AN000; get input from the user - 28719 ;;M029 lodsw ;AN000; - 28720 ;;M029 or ah,ah ;AN000; was a character entered? - 28721 ;;M029 jz short slashp_askagn ;AN000; no - ask again - 28722 ;;M029 invoke scanoff ;AN000; scan off leading delimiters - 28723 - 28724 ; Get a single character input. - 28725 - 28726 ;;mov ax,(STD_CON_INPUT_FLUSH shl 8) or STD_CON_INPUT ;M029 - 28727 ;mov ax,(STD_CON_INPUT_FLUSH<<8)|STD_CON_INPUT - 28728 000039C8 B8010C mov ax,0C01h - 28729 000039CB CD21 int 21h ;M029 - 28730 - 28731 000039CD E87C01 call char_in_xlat ;AN000; yes - upper case it - 28732 ;retc ;AN000; return if function not supported - 28733 ; 19/03/2023 - 28734 000039D0 7301 jnc short slashp_check_yn - 28735 slashp_ans_no: - 28736 000039D2 C3 retn - 28737 - 28738 slashp_check_yn: - 28739 ; 19/03/2023 - 28740 ; AL = 0 if it was (country depended) NO character - 28741 ; AL = 1 if it was (country depenced) YES character - 28742 - 28743 ;cmp al,capital_n ;AN000; was it no? - 28744 ;cmp al,0 - 28745 000039D3 20C0 and al,al ; 0 - 28746 000039D5 7420 jz short next_del_file ;AN000; yes - don't delete file - 28747 ;cmp al,capital_y ;AN000; was it yes? - 28748 ;cmp al,1 - 28749 000039D7 FEC8 dec al ; 1-> 0 --> zf = 1 - 28750 ;jz short delete_this_file ;AN000; yes - delete the file - 28751 ;jmp short slashp_askagn ;AN000; it was neither - ask again - 28752 ; 19/03/2023 - 28753 000039D9 75BE jnz short slashp_askagn - 28754 - 28755 delete_this_file: ;AN000; - 28756 000039DB B413 mov ah,FCB_Delete ; 13h ;AN000; delete the file - 28757 ;mov dx,offset trangroup:destdir - 28758 000039DD BA[F69C] mov dx,DESTDIR ;AN000; use Destdir for target - 28759 000039E0 CD21 int 21h ;AN000; - 28760 000039E2 FEC0 inc al ;AN000; did an error occur? - 28761 000039E4 7511 jnz short next_del_file ;AN000; no - get next file - 28762 ; - 28763 ;M041; Begin changes - 28764 ; We got an error deleting the file. If this is access denied, we can go on - 28765 ;to the next file after printing an error message. - 28766 ; - 28767 ;invoke Get_ext_error_number ;see what error we got - 28768 000039E6 E862E6 call get_ext_error_number - 28769 000039E9 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 - 28770 ;is it access denied? - 28771 000039EC 759C jne short stop_del ;no, some other error - 28772 ;invoke CrLf2 ;print a CR-LF - 28773 000039EE E888EF call CRLF2 - 28774 ;invoke set_ext_error_msg ;error message - 28775 000039F1 E847E6 call Set_Ext_Error_Msg - 28776 ;invoke std_eprintf ;"Access denied" - 28777 000039F4 E8291A call std_eprintf - 28778 ; 26/04/2023 - 28779 ;jmp short next_del_file ;try next file - 28780 ; 26/04/2023 - 28781 ;stop_del: - 28782 ;; - 28783 ;;M041; End changes - 28784 ;; - 28785 ; jmp eraerr ;AN022; go to error exit - need long jmp - 28786 - 28787 next_del_file: ;AN000; - 28788 ; - 28789 ; M050 - begin - 28790 ; Norton Utilities 5.0 has a bug. DiskMon when invoked - 28791 ; with /protect+ and /light+ makes it intercept all - 28792 ; deletes. This hook does not save and restore the DTA correctly. - 28793 ; They save the DWORD in a WORD by mistake! They save both the - 28794 ; segment and the offset in the SAME variable (WORD)!!! - 28795 ; - 28796 000039F7 B41A mov ah,Set_DMA ; 1Ah - 28797 ;mov dx,offset trangroup:destdir - 28798 000039F9 BA[F69C] mov dx,DESTDIR - 28799 000039FC CD21 int 21h - 28800 ; - 28801 ; M050 - end - 28802 - 28803 000039FE B412 mov ah,Dir_Search_Next ; 12h - 28804 ;AN000; search for another file - 28805 00003A00 BA5C00 mov dx,FCB ; 5Ch ;AN000; - 28806 00003A03 CD21 int 21h ;AN000; - 28807 00003A05 FEC0 inc al ;AN000; was a file found? - 28808 ;jz short slash_p_exit ;AN000; no - exit - 28809 ;jmp delete_prompt_loop ;AN000; yes - continue (need long jump) - 28810 ; 26/04/2023 - 28811 00003A07 7583 jnz short delete_prompt_loop - 28812 - 28813 slash_p_exit: - 28814 ;invoke get_ext_error_number ;AN022; get the extended error number - 28815 00003A09 E83FE6 call get_ext_error_number - 28816 00003A0C 83F812 cmp ax,ERROR_NO_MORE_FILES ;AN022; was error file not found? - 28817 00003A0F 7403 jz short good_erase_exit ;AN022; yes - clean exit - 28818 00003A11 E96CE3 jmp extend_setup ;AN022; go issue error message - 28819 - 28820 good_erase_exit: - 28821 ;invoke restudir ;AN000; we're finished - restore user's dir - 28822 00003A14 E819EE call RestUDir - 28823 ;call CRLF2 ;AN000; print out carriage return, line feed - 28824 ;retn ;AN000; exit - 28825 ; 19/03/2023 - 28826 00003A17 E95FEF jmp CRLF2 - 28827 - 28828 ; =============== S U B R O U T I N E ======================================= - 28829 - 28830 ; ECHO, BREAK, and VERIFY commands. Check for "ON" and "OFF" - 28831 - 28832 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 28833 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 28834 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM - 28835 _ECHO: - 28836 00003A1A E89900 call ON_OFF - 28837 00003A1D 7212 jb short DOEMES - 28838 00003A1F 8E1E[F59B] mov ds,[RESSEG] - 28839 00003A23 7506 jnz short ECH_OFF - 28840 00003A25 800E[9D02]01 or byte [EchoFlag],1 - 28841 00003A2A C3 retn - 28842 - 28843 ECH_OFF: - 28844 00003A2B 8026[9D02]FE and byte [EchoFlag],0FEh - 28845 00003A30 C3 retn - 28846 - 28847 ; 19/03/2023 - 28848 ; MSDOS 6.0 (& MSDOS 5.0) - 28849 ;CERRORJ: - 28850 ;jmp cerror - 28851 - 28852 ; There was no discrenable ON or OFF after the ECHO. If there is nothing but - 28853 ; delimiters on the command line, we issue the ECHO is ON/OFF message. + 28673 00003988 7502 jnz short delete_prompt_loop + 28674 + 28675 ; 26/04/2023 + 28676 stop_del: + 28677 0000398A EBD1 jmp short eraerr ;AN022; go to error exit - need long jmp + 28678 + 28679 delete_prompt_loop: ;AN000; + 28680 ;mov si,offset trangroup:destdir+1 + 28681 0000398C BE[F79C] mov si,DESTDIR+1 ;AN000; set up FCB as source + 28682 ;mov di,offset trangroup:dest + 28683 0000398F BF[C69C] mov di,DEST ;AN000; set up dest as target + 28684 00003992 A0[FA9B] mov al,[DIRCHAR] ;AN000; store a "\" in the first char + 28685 00003995 AA stosb ;AN000; of DEST + 28686 ;invoke FCB_TO_ASCZ ;AN000; convert filename from FCB to ASCIIZ string + 28687 00003996 E80CF0 call FCB_TO_ASCZ + 28688 + 28689 slashp_askagn: ;AN000; + 28690 00003999 E8DDEF call CRLF2 ;AN000; print out carriage return, line feed + 28691 ;mov dx,offset trangroup:bwdbuf + 28692 0000399C BA[399D] mov dx,BWDBUF ;AN000; print out current directory string + 28693 0000399F 89D3 mov bx,dx ;AN000; get string pointer in bx + 28694 000039A1 807F0300 cmp byte [bx+3],END_OF_LINE_OUT ; 0 + 28695 ;AN000; see if only D:\,0 + 28696 000039A5 7504 jnz short not_del_root ;AN000; no continue + 28697 000039A7 C6470200 mov byte [bx+2],END_OF_LINE_OUT ; 0 + 28698 ;AN000; yes, get rid of \ ; + 28699 not_del_root: ;AN000; + 28700 000039AB 8916[A09D] mov [string_ptr_2],dx ;AN000; + 28701 ;mov dx,offset trangroup:string_buf_ptr + 28702 000039AF BA[DF91] mov dx,string_buf_ptr ;AN000; + 28703 ;invoke std_printf ;AN000; + 28704 000039B2 E8731A call std_printf + 28705 ;mov dx,offset trangroup:dest + 28706 000039B5 BA[C69C] mov dx,DEST ;AN000; print out file name string + 28707 000039B8 8916[A09D] mov [string_ptr_2],dx ;AN000; + 28708 ;mov dx,offset trangroup:string_buf_ptr + 28709 000039BC BA[DF91] mov dx,string_buf_ptr ;AN000; + 28710 ;invoke std_printf ;AN000; + 28711 000039BF E8661A call std_printf + 28712 ;mov dx,offset trangroup:Del_Y_N_Ptr + 28713 000039C2 BA[EE90] mov dx,Del_Y_N_Ptr ;AN000; issue ", Delete (Y/N)?" message + 28714 ;invoke std_printf ;AN000; + 28715 000039C5 E8601A call std_printf + 28716 + 28717 ;;M029 mov si,80H ;AN000; set up buffer for input + 28718 ;;M029 mov dx,si ;AN000; + 28719 ;;M029 mov word ptr [si],combuflen ;AN000; + 28720 ;;M029 mov ax,(std_con_input_flush shl 8) or std_con_string_input ;AN000; + 28721 ;;M029 int 21h ;AN000; get input from the user + 28722 ;;M029 lodsw ;AN000; + 28723 ;;M029 or ah,ah ;AN000; was a character entered? + 28724 ;;M029 jz short slashp_askagn ;AN000; no - ask again + 28725 ;;M029 invoke scanoff ;AN000; scan off leading delimiters + 28726 + 28727 ; Get a single character input. + 28728 + 28729 ;;mov ax,(STD_CON_INPUT_FLUSH shl 8) or STD_CON_INPUT ;M029 + 28730 ;mov ax,(STD_CON_INPUT_FLUSH<<8)|STD_CON_INPUT + 28731 000039C8 B8010C mov ax,0C01h + 28732 000039CB CD21 int 21h ;M029 + 28733 + 28734 000039CD E87C01 call char_in_xlat ;AN000; yes - upper case it + 28735 ;retc ;AN000; return if function not supported + 28736 ; 19/03/2023 + 28737 000039D0 7301 jnc short slashp_check_yn + 28738 slashp_ans_no: + 28739 000039D2 C3 retn + 28740 + 28741 slashp_check_yn: + 28742 ; 19/03/2023 + 28743 ; AL = 0 if it was (country depended) NO character + 28744 ; AL = 1 if it was (country depenced) YES character + 28745 + 28746 ;cmp al,capital_n ;AN000; was it no? + 28747 ;cmp al,0 + 28748 000039D3 20C0 and al,al ; 0 + 28749 000039D5 7420 jz short next_del_file ;AN000; yes - don't delete file + 28750 ;cmp al,capital_y ;AN000; was it yes? + 28751 ;cmp al,1 + 28752 000039D7 FEC8 dec al ; 1-> 0 --> zf = 1 + 28753 ;jz short delete_this_file ;AN000; yes - delete the file + 28754 ;jmp short slashp_askagn ;AN000; it was neither - ask again + 28755 ; 19/03/2023 + 28756 000039D9 75BE jnz short slashp_askagn + 28757 + 28758 delete_this_file: ;AN000; + 28759 000039DB B413 mov ah,FCB_Delete ; 13h ;AN000; delete the file + 28760 ;mov dx,offset trangroup:destdir + 28761 000039DD BA[F69C] mov dx,DESTDIR ;AN000; use Destdir for target + 28762 000039E0 CD21 int 21h ;AN000; + 28763 000039E2 FEC0 inc al ;AN000; did an error occur? + 28764 000039E4 7511 jnz short next_del_file ;AN000; no - get next file + 28765 ; + 28766 ;M041; Begin changes + 28767 ; We got an error deleting the file. If this is access denied, we can go on + 28768 ;to the next file after printing an error message. + 28769 ; + 28770 ;invoke Get_ext_error_number ;see what error we got + 28771 000039E6 E862E6 call get_ext_error_number + 28772 000039E9 83F805 cmp ax,ERROR_ACCESS_DENIED ; 5 + 28773 ;is it access denied? + 28774 000039EC 759C jne short stop_del ;no, some other error + 28775 ;invoke CrLf2 ;print a CR-LF + 28776 000039EE E888EF call CRLF2 + 28777 ;invoke set_ext_error_msg ;error message + 28778 000039F1 E847E6 call Set_Ext_Error_Msg + 28779 ;invoke std_eprintf ;"Access denied" + 28780 000039F4 E8291A call std_eprintf + 28781 ; 26/04/2023 + 28782 ;jmp short next_del_file ;try next file + 28783 ; 26/04/2023 + 28784 ;stop_del: + 28785 ;; + 28786 ;;M041; End changes + 28787 ;; + 28788 ; jmp eraerr ;AN022; go to error exit - need long jmp + 28789 + 28790 next_del_file: ;AN000; + 28791 ; + 28792 ; M050 - begin + 28793 ; Norton Utilities 5.0 has a bug. DiskMon when invoked + 28794 ; with /protect+ and /light+ makes it intercept all + 28795 ; deletes. This hook does not save and restore the DTA correctly. + 28796 ; They save the DWORD in a WORD by mistake! They save both the + 28797 ; segment and the offset in the SAME variable (WORD)!!! + 28798 ; + 28799 000039F7 B41A mov ah,Set_DMA ; 1Ah + 28800 ;mov dx,offset trangroup:destdir + 28801 000039F9 BA[F69C] mov dx,DESTDIR + 28802 000039FC CD21 int 21h + 28803 ; + 28804 ; M050 - end + 28805 + 28806 000039FE B412 mov ah,Dir_Search_Next ; 12h + 28807 ;AN000; search for another file + 28808 00003A00 BA5C00 mov dx,FCB ; 5Ch ;AN000; + 28809 00003A03 CD21 int 21h ;AN000; + 28810 00003A05 FEC0 inc al ;AN000; was a file found? + 28811 ;jz short slash_p_exit ;AN000; no - exit + 28812 ;jmp delete_prompt_loop ;AN000; yes - continue (need long jump) + 28813 ; 26/04/2023 + 28814 00003A07 7583 jnz short delete_prompt_loop + 28815 + 28816 slash_p_exit: + 28817 ;invoke get_ext_error_number ;AN022; get the extended error number + 28818 00003A09 E83FE6 call get_ext_error_number + 28819 00003A0C 83F812 cmp ax,ERROR_NO_MORE_FILES ;AN022; was error file not found? + 28820 00003A0F 7403 jz short good_erase_exit ;AN022; yes - clean exit + 28821 00003A11 E96CE3 jmp extend_setup ;AN022; go issue error message + 28822 + 28823 good_erase_exit: + 28824 ;invoke restudir ;AN000; we're finished - restore user's dir + 28825 00003A14 E819EE call RestUDir + 28826 ;call CRLF2 ;AN000; print out carriage return, line feed + 28827 ;retn ;AN000; exit + 28828 ; 19/03/2023 + 28829 00003A17 E95FEF jmp CRLF2 + 28830 + 28831 ; =============== S U B R O U T I N E ======================================= + 28832 + 28833 ; ECHO, BREAK, and VERIFY commands. Check for "ON" and "OFF" + 28834 + 28835 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 28836 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 28837 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM + 28838 _ECHO: + 28839 00003A1A E89900 call ON_OFF + 28840 00003A1D 7212 jb short DOEMES + 28841 00003A1F 8E1E[F59B] mov ds,[RESSEG] + 28842 00003A23 7506 jnz short ECH_OFF + 28843 00003A25 800E[9D02]01 or byte [EchoFlag],1 + 28844 00003A2A C3 retn + 28845 + 28846 ECH_OFF: + 28847 00003A2B 8026[9D02]FE and byte [EchoFlag],0FEh + 28848 00003A30 C3 retn + 28849 + 28850 ; 19/03/2023 + 28851 ; MSDOS 6.0 (& MSDOS 5.0) + 28852 ;CERRORJ: + 28853 ;jmp cerror 28854 - 28855 DOEMES: - 28856 ; 19/03/2023 - 28857 ; MSDOS 6.0 - 28858 ;cmp cl,0 ;AC000; was anything on the line? - 28859 00003A31 20C9 and cl,cl - 28860 00003A33 7409 jz short PECHO ; just display current state. - 28861 00003A35 BA8200 mov dx,82h ; Skip one char after "ECHO" - 28862 00003A38 E897EF call CRPRINT - 28863 00003A3B E93BEF jmp CRLF2 - 28864 - 28865 ; 19/03/2023 - 28866 ; MSDOS 3.3 - 28867 ;call MOVE_TO_FIRST_ARG - 28868 ;jz short PECHO - 28869 ;mov dx,82h - 28870 ;call CRPRINT - 28871 ;jmp CRLF2 - 28872 - 28873 PECHO: - 28874 ; MSDOS 3.3 (& MSDOS 6.0) - 28875 00003A3E 8E1E[F59B] mov ds,[RESSEG] - 28876 00003A42 8A1E[9D02] mov bl,[EchoFlag] - 28877 00003A46 0E push cs - 28878 00003A47 1F pop ds - 28879 00003A48 80E301 and bl,1 - 28880 00003A4B BA[7F91] mov dx,EchoMes_Ptr - 28881 00003A4E EB24 jmp short PYN - 28882 - 28883 ; --------------------------------------------------------------------------- - 28884 - 28885 ; 19/03/2023 - 28886 ; MSDOS 3.3 - 28887 CERRORJ: - 28888 00003A50 E9D3F2 jmp cerror - 28889 - 28890 ; =============== S U B R O U T I N E ======================================= - 28891 - 28892 ; 19/03/2023 - 28893 ; MSDOS 3.3 - 28894 ;MOVE_TO_FIRST_ARG: - 28895 ;mov si,81h - 28896 ;call SCANOFF - 28897 ;cmp al,0Dh - 28898 ;retn - 28899 - 28900 ; =============== S U B R O U T I N E ======================================= - 28901 - 28902 CNTRLC: - 28903 00003A53 E86000 call ON_OFF - 28904 00003A56 B80133 mov ax,(Set_CTRL_C_Trapping<<8)|1 ; 3301h - 28905 00003A59 720C jc short PCNTRLC - 28906 00003A5B 7505 jnz short CNTRLC_OFF - 28907 00003A5D B201 mov dl,1 - 28908 00003A5F CD21 int 21h ; DOS - EXTENDED CONTROL-BREAK CHECKING - 28909 ; AL = 00h get state / 01h set state / 02h set AND get - 28910 ; DL = 00h for OFF or 01h for ON - 28911 00003A61 C3 retn - 28912 - 28913 ; --------------------------------------------------------------------------- - 28914 - 28915 CNTRLC_OFF: - 28916 00003A62 30D2 xor dl,dl - 28917 00003A64 CD21 int 21h ; Turn off ^C check - 28918 00003A66 C3 retn - 28919 - 28920 ; --------------------------------------------------------------------------- - 28921 - 28922 PCNTRLC: - 28923 ; 19/03/2023 - 28924 ; MSDOS 6.0 - 28925 ;cmp cl,0 ;AC000; rest of line blank? - 28926 00003A67 08C9 or cl,cl - 28927 00003A69 75E5 jnz short CERRORJ ; no, oops! - 28928 - 28929 ; 19/03/2023 - 28930 ; MSDOS 3.3 - 28931 ;call MOVE_TO_FIRST_ARG - 28932 ;jnz short CERRORJ - 28933 ;pccont: - 28934 ; MSDOS 3.3 (& MSDOS 6.0) - 28935 00003A6B 30C0 xor al,al - 28936 00003A6D CD21 int 21h ; get Ctrl-Break state (ah=33h) - 28937 00003A6F 88D3 mov bl,dl - 28938 00003A71 BA[6391] mov dx,CtrlcMes_Ptr - 28939 - 28940 ; --------------------------------------------------------------------------- - 28941 - 28942 PYN: ; write "ON" or "OFF" state - 28943 - 28944 ; 26/04/2023 - 28945 ; 19/03/2023 - 28946 ; MSDOS 3.3 - 28947 ;call STD_PRINTF - 28948 ;mov dx,ONMES_PTR ;AC000; get ON pointer - 28949 ;or bl,bl - 28950 ;jnz short PRINTVAL - 28951 ;mov dx,OFFMES_PTR ;AC000; get OFF pointer - 28952 - 28953 ; 26/04/2023 - 28954 ; 19/03/2023 - 28955 ; MSDOS 6.0 - 28956 00003A74 BE[9091] mov si,ONMES_PTR - 28957 00003A77 08DB or bl,bl - 28958 00003A79 7503 jnz short PRINTVAL - 28959 00003A7B BE[8D91] mov si,OFFMES_PTR - 28960 PRINTVAL: - 28961 ; 19/03/2023 - 28962 ; MSDOS 3.3 - 28963 ;jmp STD_PRINTF - 28964 - 28965 ; 19/03/2023 - 28966 ; MSDOS 6.0 - 28967 00003A7E 52 push dx ;AN000; save offset of message block - 28968 00003A7F 89D3 mov bx,dx ;AN000; save offset value - 28969 00003A81 AD lodsw ;AN000; get message number of on or off - 28970 00003A82 B6FF mov dh,util_msg_class ; -1 ; 0FFh - 28971 ;AN000; this is a utility message - 28972 00003A84 E8841A call TSYSGETMSG ;AN000; get the address of the message - 28973 ;add bx,5 - 28974 00003A87 83C305 add bx,Ptr_off_pos ;AN000; point to offset of ON/OFF - 28975 - 28976 00003A8A 8937 mov [bx],si ;AN000; put the offset in the message block - 28977 00003A8C 5A pop dx ;AN000; get message back - 28978 00003A8D E89819 call std_printf ;AC000; go print message - 28979 00003A90 C7070000 mov word [bx],0 ;AN000; zero out message pointer - 28980 00003A94 C3 retn ;AN000; exit - 28981 - 28982 ; =============== S U B R O U T I N E ======================================= - 28983 - 28984 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.CO - 28985 VERIFY: - 28986 00003A95 E81E00 call ON_OFF - 28987 00003A98 B8012E mov ax,(SET_VERIFY_ON_WRITE<<8)|1 ; 2E01h - 28988 00003A9B 720A jc short PVERIFY - 28989 00003A9D 7503 jnz short VER_OFF - 28990 00003A9F CD21 int 21h ; DOS - SET VERIFY FLAG - 28991 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off - 28992 00003AA1 C3 retn - 28993 - 28994 ; --------------------------------------------------------------------------- - 28995 - 28996 VER_OFF: - 28997 00003AA2 FEC8 dec al - 28998 00003AA4 CD21 int 21h ; Turn off verify after write - 28999 00003AA6 C3 retn - 29000 - 29001 ; --------------------------------------------------------------------------- - 29002 - 29003 PVERIFY: - 29004 ; 19/03/2023 - 29005 ; MSDOS 6.0 - 29006 ;cmp cl,0 ;AC000; is rest of line blank? - 29007 00003AA7 20C9 and cl,cl - 29008 00003AA9 75A5 jnz short CERRORJ ; nope... - 29009 - 29010 ;19/03/2023 - 29011 ; MSDOS 3.3 - 29012 ;call MOVE_TO_FIRST_ARG - 29013 ;jnz short CERRORJ - 29014 - 29015 00003AAB B454 mov ah,Get_Verify_On_Write ; 54h - 29016 00003AAD CD21 int 21h ; DOS - 2+ - GET VERIFY FLAG - 29017 ; Return: AL = 00h if flag OFF - 29018 ; AL = 01h if flag ON - 29019 00003AAF 88C3 mov bl,al - 29020 00003AB1 BA[7191] mov dx,VeriMes_Ptr - 29021 00003AB4 EBBE jmp short PYN - 29022 - 29023 ; =============== S U B R O U T I N E ======================================= - 29024 - 29025 ; **************************************************************** - 29026 ; * - 29027 ; * ROUTINE: ON_OFF - 29028 ; * - 29029 ; * FUNCTION: Parse the command line for an optional ON or - 29030 ; * OFF string for the BREAK, VERIFY, and ECHO - 29031 ; * routines. - 29032 ; * - 29033 ; * INPUT: command line at offset 81H - 29034 ; * PARSE_BREAK control block + 28855 ; There was no discrenable ON or OFF after the ECHO. If there is nothing but + 28856 ; delimiters on the command line, we issue the ECHO is ON/OFF message. + 28857 + 28858 DOEMES: + 28859 ; 19/03/2023 + 28860 ; MSDOS 6.0 + 28861 ;cmp cl,0 ;AC000; was anything on the line? + 28862 00003A31 20C9 and cl,cl + 28863 00003A33 7409 jz short PECHO ; just display current state. + 28864 00003A35 BA8200 mov dx,82h ; Skip one char after "ECHO" + 28865 00003A38 E897EF call CRPRINT + 28866 00003A3B E93BEF jmp CRLF2 + 28867 + 28868 ; 19/03/2023 + 28869 ; MSDOS 3.3 + 28870 ;call MOVE_TO_FIRST_ARG + 28871 ;jz short PECHO + 28872 ;mov dx,82h + 28873 ;call CRPRINT + 28874 ;jmp CRLF2 + 28875 + 28876 PECHO: + 28877 ; MSDOS 3.3 (& MSDOS 6.0) + 28878 00003A3E 8E1E[F59B] mov ds,[RESSEG] + 28879 00003A42 8A1E[9D02] mov bl,[EchoFlag] + 28880 00003A46 0E push cs + 28881 00003A47 1F pop ds + 28882 00003A48 80E301 and bl,1 + 28883 00003A4B BA[7F91] mov dx,EchoMes_Ptr + 28884 00003A4E EB24 jmp short PYN + 28885 + 28886 ; --------------------------------------------------------------------------- + 28887 + 28888 ; 19/03/2023 + 28889 ; MSDOS 3.3 + 28890 CERRORJ: + 28891 00003A50 E9D3F2 jmp cerror + 28892 + 28893 ; =============== S U B R O U T I N E ======================================= + 28894 + 28895 ; 19/03/2023 + 28896 ; MSDOS 3.3 + 28897 ;MOVE_TO_FIRST_ARG: + 28898 ;mov si,81h + 28899 ;call SCANOFF + 28900 ;cmp al,0Dh + 28901 ;retn + 28902 + 28903 ; =============== S U B R O U T I N E ======================================= + 28904 + 28905 CNTRLC: + 28906 00003A53 E86000 call ON_OFF + 28907 00003A56 B80133 mov ax,(Set_CTRL_C_Trapping<<8)|1 ; 3301h + 28908 00003A59 720C jc short PCNTRLC + 28909 00003A5B 7505 jnz short CNTRLC_OFF + 28910 00003A5D B201 mov dl,1 + 28911 00003A5F CD21 int 21h ; DOS - EXTENDED CONTROL-BREAK CHECKING + 28912 ; AL = 00h get state / 01h set state / 02h set AND get + 28913 ; DL = 00h for OFF or 01h for ON + 28914 00003A61 C3 retn + 28915 + 28916 ; --------------------------------------------------------------------------- + 28917 + 28918 CNTRLC_OFF: + 28919 00003A62 30D2 xor dl,dl + 28920 00003A64 CD21 int 21h ; Turn off ^C check + 28921 00003A66 C3 retn + 28922 + 28923 ; --------------------------------------------------------------------------- + 28924 + 28925 PCNTRLC: + 28926 ; 19/03/2023 + 28927 ; MSDOS 6.0 + 28928 ;cmp cl,0 ;AC000; rest of line blank? + 28929 00003A67 08C9 or cl,cl + 28930 00003A69 75E5 jnz short CERRORJ ; no, oops! + 28931 + 28932 ; 19/03/2023 + 28933 ; MSDOS 3.3 + 28934 ;call MOVE_TO_FIRST_ARG + 28935 ;jnz short CERRORJ + 28936 ;pccont: + 28937 ; MSDOS 3.3 (& MSDOS 6.0) + 28938 00003A6B 30C0 xor al,al + 28939 00003A6D CD21 int 21h ; get Ctrl-Break state (ah=33h) + 28940 00003A6F 88D3 mov bl,dl + 28941 00003A71 BA[6391] mov dx,CtrlcMes_Ptr + 28942 + 28943 ; --------------------------------------------------------------------------- + 28944 + 28945 PYN: ; write "ON" or "OFF" state + 28946 + 28947 ; 26/04/2023 + 28948 ; 19/03/2023 + 28949 ; MSDOS 3.3 + 28950 ;call STD_PRINTF + 28951 ;mov dx,ONMES_PTR ;AC000; get ON pointer + 28952 ;or bl,bl + 28953 ;jnz short PRINTVAL + 28954 ;mov dx,OFFMES_PTR ;AC000; get OFF pointer + 28955 + 28956 ; 26/04/2023 + 28957 ; 19/03/2023 + 28958 ; MSDOS 6.0 + 28959 00003A74 BE[9091] mov si,ONMES_PTR + 28960 00003A77 08DB or bl,bl + 28961 00003A79 7503 jnz short PRINTVAL + 28962 00003A7B BE[8D91] mov si,OFFMES_PTR + 28963 PRINTVAL: + 28964 ; 19/03/2023 + 28965 ; MSDOS 3.3 + 28966 ;jmp STD_PRINTF + 28967 + 28968 ; 19/03/2023 + 28969 ; MSDOS 6.0 + 28970 00003A7E 52 push dx ;AN000; save offset of message block + 28971 00003A7F 89D3 mov bx,dx ;AN000; save offset value + 28972 00003A81 AD lodsw ;AN000; get message number of on or off + 28973 00003A82 B6FF mov dh,util_msg_class ; -1 ; 0FFh + 28974 ;AN000; this is a utility message + 28975 00003A84 E8841A call TSYSGETMSG ;AN000; get the address of the message + 28976 ;add bx,5 + 28977 00003A87 83C305 add bx,Ptr_off_pos ;AN000; point to offset of ON/OFF + 28978 + 28979 00003A8A 8937 mov [bx],si ;AN000; put the offset in the message block + 28980 00003A8C 5A pop dx ;AN000; get message back + 28981 00003A8D E89819 call std_printf ;AC000; go print message + 28982 00003A90 C7070000 mov word [bx],0 ;AN000; zero out message pointer + 28983 00003A94 C3 retn ;AN000; exit + 28984 + 28985 ; =============== S U B R O U T I N E ======================================= + 28986 + 28987 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.CO + 28988 VERIFY: + 28989 00003A95 E81E00 call ON_OFF + 28990 00003A98 B8012E mov ax,(SET_VERIFY_ON_WRITE<<8)|1 ; 2E01h + 28991 00003A9B 720A jc short PVERIFY + 28992 00003A9D 7503 jnz short VER_OFF + 28993 00003A9F CD21 int 21h ; DOS - SET VERIFY FLAG + 28994 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off + 28995 00003AA1 C3 retn + 28996 + 28997 ; --------------------------------------------------------------------------- + 28998 + 28999 VER_OFF: + 29000 00003AA2 FEC8 dec al + 29001 00003AA4 CD21 int 21h ; Turn off verify after write + 29002 00003AA6 C3 retn + 29003 + 29004 ; --------------------------------------------------------------------------- + 29005 + 29006 PVERIFY: + 29007 ; 19/03/2023 + 29008 ; MSDOS 6.0 + 29009 ;cmp cl,0 ;AC000; is rest of line blank? + 29010 00003AA7 20C9 and cl,cl + 29011 00003AA9 75A5 jnz short CERRORJ ; nope... + 29012 + 29013 ;19/03/2023 + 29014 ; MSDOS 3.3 + 29015 ;call MOVE_TO_FIRST_ARG + 29016 ;jnz short CERRORJ + 29017 + 29018 00003AAB B454 mov ah,Get_Verify_On_Write ; 54h + 29019 00003AAD CD21 int 21h ; DOS - 2+ - GET VERIFY FLAG + 29020 ; Return: AL = 00h if flag OFF + 29021 ; AL = 01h if flag ON + 29022 00003AAF 88C3 mov bl,al + 29023 00003AB1 BA[7191] mov dx,VeriMes_Ptr + 29024 00003AB4 EBBE jmp short PYN + 29025 + 29026 ; =============== S U B R O U T I N E ======================================= + 29027 + 29028 ; **************************************************************** + 29029 ; * + 29030 ; * ROUTINE: ON_OFF + 29031 ; * + 29032 ; * FUNCTION: Parse the command line for an optional ON or + 29033 ; * OFF string for the BREAK, VERIFY, and ECHO + 29034 ; * routines. 29035 ; * - 29036 ; * OUTPUT: If carry is clear - 29037 ; * If ON is found - 29038 ; * Zero flag set - 29039 ; * If OFF is found - 29040 ; * Zero flag clear - 29041 ; * If carry set - 29042 ; * If nothing on command line - 29043 ; * CL set to zero - 29044 ; * If error - 29045 ; * CL contains error value from parse - 29046 ; * - 29047 ; **************************************************************** - 29048 - 29049 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29050 ON_OFF: - 29051 00003AB6 BE8100 mov si,81h - 29052 - 29053 ; 19/03/2023 - 29054 ; MSDOS 3.3 - 29055 ;call SCANOFF ; scan off leading blanks & equal - 29056 ;cmp al,0Dh ; are we at end of line? - 29057 ;je short BAD_ONF ; yes, return error - 29058 ;lodsw - 29059 ;or ax,2020h ; convert to lowercase - 29060 ;cmp ax,6E6Fh ;'on' - 29061 ;je short ON_CHECK - 29062 ;cmp ax,666Fh ;'of' - 29063 ;jne short BAD_ONF - 29064 ;lodsb - 29065 ;or al,20h ; convert to lowercase - 29066 ;cmp al,66h ; 'f' - 29067 ;jne short BAD_ONF - 29068 ;or al,66h ; or al,'f' - 29069 ;jmp short OFF_CHECK - 29070 ;ON_CHECK: - 29071 ;xor al,al - 29072 ;OFF_CHECK: - 29073 ;lahf - 29074 ;mov bx,ax - 29075 ;call SCANOFF ; scan off leading blanks & equal - 29076 ;cmp al,0Dh ; are we at end of line? - 29077 ;jne short BAD_ONF ; no, return error - 29078 ;mov ax,bx - 29079 ;sahf - 29080 ;clc - 29081 ;retn - 29082 - 29083 ; 19/03/2023 - 29084 ; MSDOS 6.0 - 29085 scan_on_off: ;AN032; scan off leading blanks & equal - 29086 00003AB9 AC lodsb ;AN032; get a char - 29087 ;cmp al,blank ;AN032; if whitespace - 29088 00003ABA 3C20 cmp al,20h - 29089 00003ABC 74FB je short scan_on_off - 29090 ;AN032; keep scanning - 29091 00003ABE 3C09 cmp al,tab_chr ;AN032; if tab - 29092 ;cmp al,09h - 29093 00003AC0 74F7 je short scan_on_off - 29094 ;AN032; keep scanning - 29095 ;cmp al,equal_chr ;AN032; if equal char - 29096 00003AC2 3C3D cmp al,'=' ; 3Dh - 29097 00003AC4 7401 je short parse_on_off - 29098 ;AN032; start parsing - 29099 00003AC6 4E dec si ;AN032; if none of above - back up - 29100 - 29101 parse_on_off: ;AN032; and start parsing - 29102 00003AC7 BF[1096] mov di,PARSE_BREAK ;AN000; Get address of PARSE_BREAK - 29103 00003ACA 31C9 xor cx,cx ;AN000; clear cx,dx - 29104 00003ACC 31D2 xor dx,dx ;AN000; - 29105 00003ACE E89B0E call cmd_parse ;AC000; call parser - 29106 ;cmp ax,-1 ; 0FFFFh - 29107 00003AD1 83F8FF cmp ax,END_OF_LINE ;AC000; are we at end of line? - 29108 00003AD4 742E je short BADONF ;AC000; yes, return error - 29109 ;cmp ax,RESULT_NO_ERROR ;AN000; did an error occur - 29110 ;cmp ax,0 - 29111 00003AD6 21C0 and ax,ax ; ax = 0 ? - 29112 00003AD8 7404 jz short on_off_there - 29113 ;AN000; no - continue - 29114 00003ADA 89C1 mov cx,ax ;AN000; yes - set cl to error code - 29115 00003ADC EB26 jmp short BADONF ;AN000; return error - 29116 - 29117 on_off_there: - 29118 00003ADE 803E[ECA5]FF cmp byte [PARSE1_CODE],-1 ; 0FFh - 29119 ;AN014; was a valid positional present? - 29120 00003AE3 7505 jnz short good_on_off - 29121 ;AN014; yes - continue - 29122 00003AE5 B90A00 mov cx,BadParm_Ptr ;AN014; something other than ON/OFF - 29123 ;mov cx,10 ; 0Ah - 29124 00003AE8 EB1A jmp short BADONF ;AN014; return error - 29125 - 29126 good_on_off: ;AN014; - 29127 00003AEA 31C0 xor ax,ax ;AC000; set up return code for - 29128 00003AEC 0A06[ECA5] or al,[PARSE1_CODE] - 29129 ;AC000; ON or OFF in AX - 29130 00003AF0 9C pushf ;AN000; save flags - 29131 00003AF1 BF[1096] mov di,PARSE_BREAK ;AN000; Get address of PARSE_BREAK - 29132 00003AF4 31D2 xor dx,dx ;AN000; - 29133 00003AF6 E8730E call cmd_parse ;AN000; call parser - 29134 00003AF9 83F8FF cmp ax,END_OF_LINE ;AN000; are we at end of line? - 29135 ;cmp ax,-1 ; 0FFFFh - 29136 00003AFC 7503 jne short BADONF_flags - 29137 ;AN000; NO, return error - 29138 00003AFE 9D popf ;AN000; restore flags - 29139 00003AFF F8 clc ;AC000; no error - 29140 ;jmp short on_off_end - 29141 ;AN000; return to caller - 29142 ; 26/04/2023 - 29143 00003B00 C3 retn - 29144 - 29145 BADONF_flags: - 29146 00003B01 89C1 mov cx,ax - 29147 00003B03 9D popf - 29148 - 29149 ; --------------------------------------------------------------------------- - 29150 - 29151 ; No discernable ON or OFF has been found. Put an error message pointer in DX - 29152 ; and return the error + 29036 ; * INPUT: command line at offset 81H + 29037 ; * PARSE_BREAK control block + 29038 ; * + 29039 ; * OUTPUT: If carry is clear + 29040 ; * If ON is found + 29041 ; * Zero flag set + 29042 ; * If OFF is found + 29043 ; * Zero flag clear + 29044 ; * If carry set + 29045 ; * If nothing on command line + 29046 ; * CL set to zero + 29047 ; * If error + 29048 ; * CL contains error value from parse + 29049 ; * + 29050 ; **************************************************************** + 29051 + 29052 ; 19/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29053 ON_OFF: + 29054 00003AB6 BE8100 mov si,81h + 29055 + 29056 ; 19/03/2023 + 29057 ; MSDOS 3.3 + 29058 ;call SCANOFF ; scan off leading blanks & equal + 29059 ;cmp al,0Dh ; are we at end of line? + 29060 ;je short BAD_ONF ; yes, return error + 29061 ;lodsw + 29062 ;or ax,2020h ; convert to lowercase + 29063 ;cmp ax,6E6Fh ;'on' + 29064 ;je short ON_CHECK + 29065 ;cmp ax,666Fh ;'of' + 29066 ;jne short BAD_ONF + 29067 ;lodsb + 29068 ;or al,20h ; convert to lowercase + 29069 ;cmp al,66h ; 'f' + 29070 ;jne short BAD_ONF + 29071 ;or al,66h ; or al,'f' + 29072 ;jmp short OFF_CHECK + 29073 ;ON_CHECK: + 29074 ;xor al,al + 29075 ;OFF_CHECK: + 29076 ;lahf + 29077 ;mov bx,ax + 29078 ;call SCANOFF ; scan off leading blanks & equal + 29079 ;cmp al,0Dh ; are we at end of line? + 29080 ;jne short BAD_ONF ; no, return error + 29081 ;mov ax,bx + 29082 ;sahf + 29083 ;clc + 29084 ;retn + 29085 + 29086 ; 19/03/2023 + 29087 ; MSDOS 6.0 + 29088 scan_on_off: ;AN032; scan off leading blanks & equal + 29089 00003AB9 AC lodsb ;AN032; get a char + 29090 ;cmp al,blank ;AN032; if whitespace + 29091 00003ABA 3C20 cmp al,20h + 29092 00003ABC 74FB je short scan_on_off + 29093 ;AN032; keep scanning + 29094 00003ABE 3C09 cmp al,tab_chr ;AN032; if tab + 29095 ;cmp al,09h + 29096 00003AC0 74F7 je short scan_on_off + 29097 ;AN032; keep scanning + 29098 ;cmp al,equal_chr ;AN032; if equal char + 29099 00003AC2 3C3D cmp al,'=' ; 3Dh + 29100 00003AC4 7401 je short parse_on_off + 29101 ;AN032; start parsing + 29102 00003AC6 4E dec si ;AN032; if none of above - back up + 29103 + 29104 parse_on_off: ;AN032; and start parsing + 29105 00003AC7 BF[1096] mov di,PARSE_BREAK ;AN000; Get address of PARSE_BREAK + 29106 00003ACA 31C9 xor cx,cx ;AN000; clear cx,dx + 29107 00003ACC 31D2 xor dx,dx ;AN000; + 29108 00003ACE E89B0E call cmd_parse ;AC000; call parser + 29109 ;cmp ax,-1 ; 0FFFFh + 29110 00003AD1 83F8FF cmp ax,END_OF_LINE ;AC000; are we at end of line? + 29111 00003AD4 742E je short BADONF ;AC000; yes, return error + 29112 ;cmp ax,RESULT_NO_ERROR ;AN000; did an error occur + 29113 ;cmp ax,0 + 29114 00003AD6 21C0 and ax,ax ; ax = 0 ? + 29115 00003AD8 7404 jz short on_off_there + 29116 ;AN000; no - continue + 29117 00003ADA 89C1 mov cx,ax ;AN000; yes - set cl to error code + 29118 00003ADC EB26 jmp short BADONF ;AN000; return error + 29119 + 29120 on_off_there: + 29121 00003ADE 803E[ECA5]FF cmp byte [PARSE1_CODE],-1 ; 0FFh + 29122 ;AN014; was a valid positional present? + 29123 00003AE3 7505 jnz short good_on_off + 29124 ;AN014; yes - continue + 29125 00003AE5 B90A00 mov cx,BadParm_Ptr ;AN014; something other than ON/OFF + 29126 ;mov cx,10 ; 0Ah + 29127 00003AE8 EB1A jmp short BADONF ;AN014; return error + 29128 + 29129 good_on_off: ;AN014; + 29130 00003AEA 31C0 xor ax,ax ;AC000; set up return code for + 29131 00003AEC 0A06[ECA5] or al,[PARSE1_CODE] + 29132 ;AC000; ON or OFF in AX + 29133 00003AF0 9C pushf ;AN000; save flags + 29134 00003AF1 BF[1096] mov di,PARSE_BREAK ;AN000; Get address of PARSE_BREAK + 29135 00003AF4 31D2 xor dx,dx ;AN000; + 29136 00003AF6 E8730E call cmd_parse ;AN000; call parser + 29137 00003AF9 83F8FF cmp ax,END_OF_LINE ;AN000; are we at end of line? + 29138 ;cmp ax,-1 ; 0FFFFh + 29139 00003AFC 7503 jne short BADONF_flags + 29140 ;AN000; NO, return error + 29141 00003AFE 9D popf ;AN000; restore flags + 29142 00003AFF F8 clc ;AC000; no error + 29143 ;jmp short on_off_end + 29144 ;AN000; return to caller + 29145 ; 26/04/2023 + 29146 00003B00 C3 retn + 29147 + 29148 BADONF_flags: + 29149 00003B01 89C1 mov cx,ax + 29150 00003B03 9D popf + 29151 + 29152 ; --------------------------------------------------------------------------- 29153 - 29154 BADONF: - 29155 00003B04 BA[4091] mov dx,bad_on_off_ptr - 29156 00003B07 F9 stc - 29157 on_off_end: - 29158 00003B08 C3 retn - 29159 - 29160 ;============================================================================ - 29161 ; TUCODE.ASM, MSDOS 6.0, 1991 (2) - 29162 ;============================================================================ - 29163 ; 02/10/2018 - Retro DOS v3.0 - 29164 - 29165 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 29BFh - 29166 - 29167 ; =============== S U B R O U T I N E ======================================= - 29168 - 29169 ; 20/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29170 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3876h - 29171 - 29172 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 29173 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3E20h - 29174 - 29175 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM - 29176 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3CD4h - 29177 PRINT_DATE: - 29178 ; 20/03/2023 - 29179 ; MSDOS 3.3 - 29180 ;push es - 29181 ;push di - 29182 ;push cs - 29183 ;pop es - 29184 ;mov di,ARG_BUF - 29185 ;mov ah,Get_Date ; 2Ah - 29186 ;int 21h ; DOS - GET CURRENT DATE - 29187 ; ; Return: DL = day,DH = month, CX = year - 29188 ; ; AL = day of the week (0=Sunday,1=Monday,etc.) - 29189 ;cbw - 29190 ;call GETDATE - 29191 ;call P_DATE - 29192 ;xor al,al - 29193 ;stosb - 29194 ;mov dx,ARG_BUF_PTR - 29195 ;call STD_PRINTF - 29196 ; 20/03/2023 (MSDOS 3.3 COMMAND.COM - TRANGROUP:29DAh) - 29197 ;pop es ; !!??!! - 29198 ;pop di - 29199 ;retn - 29200 - 29201 ; 20/03/2023 - 29202 ; MSDOS 6.0 - 29203 00003B09 06 push es - 29204 00003B0A 57 push di - 29205 00003B0B 0E push cs - 29206 00003B0C 07 pop es - 29207 00003B0D E81300 call GetDate ; get date - 29208 00003B10 86F2 xchg dh,dl ;AN000; switch month & day - 29209 00003B12 890E[1692] mov [promptDat_yr],cx ;AC000; put year into message control block - 29210 00003B16 8916[1892] mov [promptDat_moday],dx ;AC000; put month and day into message control block - 29211 00003B1A BA[0692] mov dx,promptdat_ptr ;AC000; set up message for output - 29212 00003B1D E80819 call std_printf - 29213 ;AD061; mov word [promptDat_yr],0 ;AC000; reset year, month and day - 29214 ;AD061; mov word [promptDat_moday],0 ;AC000; pointers in control block - 29215 00003B20 5F pop di ;AC000; restore di,es - 29216 00003B21 07 pop es ;AC000; - 29217 00003B22 C3 retn - 29218 - 29219 ; --------------------------------------------------------------------------- - 29220 - 29221 ; 21/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29222 - 29223 ;GETDATE: - 29224 ; 21/03/2023 - 29225 ; MSDOS 3.3 - 29226 ;mov si,ax - 29227 ;shl si,1 - 29228 ;add si,ax - 29229 ;add si,WEEKTAB ; "SunMonTueWedThuFriSat" - 29230 ;mov bx,cx - 29231 ;mov cx,3 - 29232 ;rep movsb - 29233 ;mov al,' ' - 29234 ;stosb - 29235 ;retn - 29236 - 29237 ; 21/03/2023 - 29238 ; MSDOS 6.0 + 29154 ; No discernable ON or OFF has been found. Put an error message pointer in DX + 29155 ; and return the error + 29156 + 29157 BADONF: + 29158 00003B04 BA[4091] mov dx,bad_on_off_ptr + 29159 00003B07 F9 stc + 29160 on_off_end: + 29161 00003B08 C3 retn + 29162 + 29163 ;============================================================================ + 29164 ; TUCODE.ASM, MSDOS 6.0, 1991 (2) + 29165 ;============================================================================ + 29166 ; 02/10/2018 - Retro DOS v3.0 + 29167 + 29168 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 29BFh + 29169 + 29170 ; =============== S U B R O U T I N E ======================================= + 29171 + 29172 ; 20/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29173 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3876h + 29174 + 29175 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 29176 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3E20h + 29177 + 29178 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM + 29179 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:3CD4h + 29180 PRINT_DATE: + 29181 ; 20/03/2023 + 29182 ; MSDOS 3.3 + 29183 ;push es + 29184 ;push di + 29185 ;push cs + 29186 ;pop es + 29187 ;mov di,ARG_BUF + 29188 ;mov ah,Get_Date ; 2Ah + 29189 ;int 21h ; DOS - GET CURRENT DATE + 29190 ; ; Return: DL = day,DH = month, CX = year + 29191 ; ; AL = day of the week (0=Sunday,1=Monday,etc.) + 29192 ;cbw + 29193 ;call GETDATE + 29194 ;call P_DATE + 29195 ;xor al,al + 29196 ;stosb + 29197 ;mov dx,ARG_BUF_PTR + 29198 ;call STD_PRINTF + 29199 ; 20/03/2023 (MSDOS 3.3 COMMAND.COM - TRANGROUP:29DAh) + 29200 ;pop es ; !!??!! + 29201 ;pop di + 29202 ;retn + 29203 + 29204 ; 20/03/2023 + 29205 ; MSDOS 6.0 + 29206 00003B09 06 push es + 29207 00003B0A 57 push di + 29208 00003B0B 0E push cs + 29209 00003B0C 07 pop es + 29210 00003B0D E81300 call GetDate ; get date + 29211 00003B10 86F2 xchg dh,dl ;AN000; switch month & day + 29212 00003B12 890E[1692] mov [promptDat_yr],cx ;AC000; put year into message control block + 29213 00003B16 8916[1892] mov [promptDat_moday],dx ;AC000; put month and day into message control block + 29214 00003B1A BA[0692] mov dx,promptdat_ptr ;AC000; set up message for output + 29215 00003B1D E80819 call std_printf + 29216 ;AD061; mov word [promptDat_yr],0 ;AC000; reset year, month and day + 29217 ;AD061; mov word [promptDat_moday],0 ;AC000; pointers in control block + 29218 00003B20 5F pop di ;AC000; restore di,es + 29219 00003B21 07 pop es ;AC000; + 29220 00003B22 C3 retn + 29221 + 29222 ; --------------------------------------------------------------------------- + 29223 + 29224 ; 21/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29225 + 29226 ;GETDATE: + 29227 ; 21/03/2023 + 29228 ; MSDOS 3.3 + 29229 ;mov si,ax + 29230 ;shl si,1 + 29231 ;add si,ax + 29232 ;add si,WEEKTAB ; "SunMonTueWedThuFriSat" + 29233 ;mov bx,cx + 29234 ;mov cx,3 + 29235 ;rep movsb + 29236 ;mov al,' ' + 29237 ;stosb + 29238 ;retn 29239 - 29240 ; Do GET DATE system call and set up 3 character day of week in ARG_BUF - 29241 ; for output. Date will be returned in CX,DX. + 29240 ; 21/03/2023 + 29241 ; MSDOS 6.0 29242 - 29243 GetDate: - 29244 00003B23 BF[96A3] mov di,Arg_Buf ;AC000; target for day of week - 29245 00003B26 B42A mov ah,Get_Date ;2Ah ;AC000; get current date - 29246 00003B28 CD21 int 21h ;AC000; Get date in CX:DX - 29247 00003B2A 98 cbw ;AC000; - 29248 00003B2B 51 push cx ;AN000; save date returned in - 29249 00003B2C 52 push dx ;AN000; CX:DX - 29250 00003B2D 89C6 mov si,ax - 29251 00003B2F D1E6 shl si,1 - 29252 00003B31 01C6 add si,ax ; SI=AX*3 - 29253 00003B33 89F1 mov cx,si ;AN000; save si - 29254 00003B35 A1[C990] mov ax,[WeekTab] ;AN000; get message number of weektab - 29255 00003B38 B6FF mov dh,util_msg_class ;0FFh ;AN000; this is a utility message - 29256 00003B3A 57 push di ;AN000; save argument buffer - 29257 00003B3B E8CD19 call TSYSGETMSG ;AN000; get the address of the message - 29258 00003B3E 5F pop di ;AN000; retrieve argument buffer - 29259 00003B3F 01CE add si,cx ;AC000; get day of week - 29260 00003B41 B90300 mov cx,3 - 29261 00003B44 F3A4 rep movsb - 29262 00003B46 B000 mov al,END_OF_LINE_OUT ; 0 ;AC000; terminate the string - 29263 00003B48 AA stosb - 29264 00003B49 5A pop dx ;AN000; get back date - 29265 00003B4A 59 pop cx ;AN000; - 29266 00003B4B C3 retn - 29267 - 29268 ; =============== S U B R O U T I N E ======================================= - 29269 - 29270 ; 21/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29271 - 29272 ; MSDOS 6.0 - 29273 - 29274 ; This routine determines whether the character in AL is a - 29275 ; Yes or No character. On return, if AL=0, the character is - 29276 ; No, if AL=1, the character is Yes. - 29277 - 29278 ; assume ds:trangroup - 29279 - 29280 char_in_xlat: ; proc near - 29281 ; 21/03/2023 - 29282 00003B4C 88C2 mov dl,al ;AC000; get character into DX - 29283 00003B4E 30F6 xor dh,dh ;AC000; - 29284 ;mov ax,(GetExtCntry<<8)+35 ;AC000; Yes/No char call - 29285 00003B50 B82365 mov ax,6523h - 29286 00003B53 CD21 int 21h ;AC000; - 29287 00003B55 C3 retn - 29288 - 29289 ;char_in_xlat endp - 29290 - 29291 ;============================================================================ - 29292 ; TENV.ASM, MSDOS 6.0, 1991 - 29293 ;============================================================================ - 29294 ; 02/10/2018 - Retro DOS v3.0 - 29295 - 29296 ; Environment utilities and misc. routines - 29297 - 29298 ; MSDOS 6.0 - 29299 ; **************************************************************** - 29300 ; * - 29301 ; * ROUTINE: UPCONV (ADDED BY EMG 4.00) - 29302 ; * - 29303 ; * FUNCTION: This routine returns the upper case equivalent of - 29304 ; * the character in AL from the file upper case table - 29305 ; * in DOS if character if above ascii 128, else - 29306 ; * subtracts 20H if between "a" and "z". - 29307 ; * - 29308 ; * INPUT: AL char to be upper cased - 29309 ; * FUCASE_ADDR set to the file upper case table + 29243 ; Do GET DATE system call and set up 3 character day of week in ARG_BUF + 29244 ; for output. Date will be returned in CX,DX. + 29245 + 29246 GetDate: + 29247 00003B23 BF[96A3] mov di,Arg_Buf ;AC000; target for day of week + 29248 00003B26 B42A mov ah,Get_Date ;2Ah ;AC000; get current date + 29249 00003B28 CD21 int 21h ;AC000; Get date in CX:DX + 29250 00003B2A 98 cbw ;AC000; + 29251 00003B2B 51 push cx ;AN000; save date returned in + 29252 00003B2C 52 push dx ;AN000; CX:DX + 29253 00003B2D 89C6 mov si,ax + 29254 00003B2F D1E6 shl si,1 + 29255 00003B31 01C6 add si,ax ; SI=AX*3 + 29256 00003B33 89F1 mov cx,si ;AN000; save si + 29257 00003B35 A1[C990] mov ax,[WeekTab] ;AN000; get message number of weektab + 29258 00003B38 B6FF mov dh,util_msg_class ;0FFh ;AN000; this is a utility message + 29259 00003B3A 57 push di ;AN000; save argument buffer + 29260 00003B3B E8CD19 call TSYSGETMSG ;AN000; get the address of the message + 29261 00003B3E 5F pop di ;AN000; retrieve argument buffer + 29262 00003B3F 01CE add si,cx ;AC000; get day of week + 29263 00003B41 B90300 mov cx,3 + 29264 00003B44 F3A4 rep movsb + 29265 00003B46 B000 mov al,END_OF_LINE_OUT ; 0 ;AC000; terminate the string + 29266 00003B48 AA stosb + 29267 00003B49 5A pop dx ;AN000; get back date + 29268 00003B4A 59 pop cx ;AN000; + 29269 00003B4B C3 retn + 29270 + 29271 ; =============== S U B R O U T I N E ======================================= + 29272 + 29273 ; 21/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29274 + 29275 ; MSDOS 6.0 + 29276 + 29277 ; This routine determines whether the character in AL is a + 29278 ; Yes or No character. On return, if AL=0, the character is + 29279 ; No, if AL=1, the character is Yes. + 29280 + 29281 ; assume ds:trangroup + 29282 + 29283 char_in_xlat: ; proc near + 29284 ; 21/03/2023 + 29285 00003B4C 88C2 mov dl,al ;AC000; get character into DX + 29286 00003B4E 30F6 xor dh,dh ;AC000; + 29287 ;mov ax,(GetExtCntry<<8)+35 ;AC000; Yes/No char call + 29288 00003B50 B82365 mov ax,6523h + 29289 00003B53 CD21 int 21h ;AC000; + 29290 00003B55 C3 retn + 29291 + 29292 ;char_in_xlat endp + 29293 + 29294 ;============================================================================ + 29295 ; TENV.ASM, MSDOS 6.0, 1991 + 29296 ;============================================================================ + 29297 ; 02/10/2018 - Retro DOS v3.0 + 29298 + 29299 ; Environment utilities and misc. routines + 29300 + 29301 ; MSDOS 6.0 + 29302 ; **************************************************************** + 29303 ; * + 29304 ; * ROUTINE: UPCONV (ADDED BY EMG 4.00) + 29305 ; * + 29306 ; * FUNCTION: This routine returns the upper case equivalent of + 29307 ; * the character in AL from the file upper case table + 29308 ; * in DOS if character if above ascii 128, else + 29309 ; * subtracts 20H if between "a" and "z". 29310 ; * - 29311 ; * OUTPUT: AL upper cased character - 29312 ; * - 29313 ; **************************************************************** - 29314 ; - 29315 ;assume ds:trangroup ;AN000; - 29316 ; - 29317 ;upconv proc near ;AN000; - 29318 ; - 29319 ; cmp al,80h ;AN000; see if char is > ascii 128 - 29320 ; jb oth_fucase ;AN000; no - upper case math - 29321 ; sub al,80h ;AN000; only upper 128 chars in table - 29322 ; push ds ;AN000; - 29323 ; push bx ;AN000; - 29324 ; mov ds,[resseg] ;AN000; get resident data segment - 29325 ;assume ds:resgroup ;AN000; - 29326 ; lds bx,dword ptr FUCase_Addr+1 ;AN000; get table address - 29327 ; add bx,2 ;AN000; skip over first word - 29328 ; xlat ds:byte ptr [bx] ;AN000; convert to upper case - 29329 ; pop bx ;AN000; - 29330 ; pop ds ;AN000; - 29331 ;assume ds:trangroup ;AN000; - 29332 ; jmp short upconv_end ;AN000; we finished - exit - 29333 ; - 29334 ;oth_fucase: ;AN000; - 29335 ; cmp al,small_a ;AC000; if between "a" and "z", - 29336 ; jb upconv_end ;AC000; subtract 20h to get - 29337 ; cmp al,small_z ;AC000; upper case equivalent. - 29338 ; ja upconv_end ;AC000; - 29339 ; sub al,20h ;AC000; Change lower-case to upper - 29340 ; - 29341 ;upconv_end: ;AN000; - 29342 ; ret + 29311 ; * INPUT: AL char to be upper cased + 29312 ; * FUCASE_ADDR set to the file upper case table + 29313 ; * + 29314 ; * OUTPUT: AL upper cased character + 29315 ; * + 29316 ; **************************************************************** + 29317 ; + 29318 ;assume ds:trangroup ;AN000; + 29319 ; + 29320 ;upconv proc near ;AN000; + 29321 ; + 29322 ; cmp al,80h ;AN000; see if char is > ascii 128 + 29323 ; jb oth_fucase ;AN000; no - upper case math + 29324 ; sub al,80h ;AN000; only upper 128 chars in table + 29325 ; push ds ;AN000; + 29326 ; push bx ;AN000; + 29327 ; mov ds,[resseg] ;AN000; get resident data segment + 29328 ;assume ds:resgroup ;AN000; + 29329 ; lds bx,dword ptr FUCase_Addr+1 ;AN000; get table address + 29330 ; add bx,2 ;AN000; skip over first word + 29331 ; xlat ds:byte ptr [bx] ;AN000; convert to upper case + 29332 ; pop bx ;AN000; + 29333 ; pop ds ;AN000; + 29334 ;assume ds:trangroup ;AN000; + 29335 ; jmp short upconv_end ;AN000; we finished - exit + 29336 ; + 29337 ;oth_fucase: ;AN000; + 29338 ; cmp al,small_a ;AC000; if between "a" and "z", + 29339 ; jb upconv_end ;AC000; subtract 20h to get + 29340 ; cmp al,small_z ;AC000; upper case equivalent. + 29341 ; ja upconv_end ;AC000; + 29342 ; sub al,20h ;AC000; Change lower-case to upper 29343 ; - 29344 ;upconv endp ;AN000; - 29345 - 29346 ;============================================================================ - 29347 ; COPY.ASM, MSDOS 6.0, 1991 - 29348 ;============================================================================ - 29349 ; 01/10/2018 - Retro DOS v3.0 - 29350 - 29351 ; title COMMAND COPY routines. - 29352 - 29353 ;/* - 29354 ; * Microsoft Confidential - 29355 ; * Copyright (C) Microsoft Corporation 1991 - 29356 ; * All Rights Reserved. - 29357 ; */ - 29358 - 29359 ;*** COPY.ASM - 29360 - 29361 ;Source files: copy.asm, copypr1.asm, copypr2.asm - 29362 + 29344 ;upconv_end: ;AN000; + 29345 ; ret + 29346 ; + 29347 ;upconv endp ;AN000; + 29348 + 29349 ;============================================================================ + 29350 ; COPY.ASM, MSDOS 6.0, 1991 + 29351 ;============================================================================ + 29352 ; 01/10/2018 - Retro DOS v3.0 + 29353 + 29354 ; title COMMAND COPY routines. + 29355 + 29356 ;/* + 29357 ; * Microsoft Confidential + 29358 ; * Copyright (C) Microsoft Corporation 1991 + 29359 ; * All Rights Reserved. + 29360 ; */ + 29361 + 29362 ;*** COPY.ASM 29363 - 29364 ;*** MODIFICATION HISTORY + 29364 ;Source files: copy.asm, copypr1.asm, copypr2.asm 29365 - 29366 ;11/01/83 EE Added a few lines at the end of SCANSRC2 to get multiple - 29367 ; file concatenations (eg copy a.*+b.*+c.*) to work properly. - 29368 ;11/02/83 EE Commented out the code in CPARSE which added drive designators - 29369 ; to tokens which begin with path characters so that PARSELINE - 29370 ; will work correctly. - 29371 ;11/04/83 EE Commented out the code in CPARSE that considered paren's to be - 29372 ; individual tokens. That distinction is no longer needed for - 29373 ; FOR loop processing. - 29374 ;11/17/83 EE CPARSE upper case conversion is now flag dependent. Flag is - 29375 ; 1 when Cparse is called from COPY. - 29376 ;11/17/83 EE Took out the comment chars around code described in 11/04/83 - 29377 ; mod. It now is conditional on flag like previous mod. - 29378 ;11/21/83 NP Added printf - 29379 ;12/09/83 EE CPARSE changed to use CPYFLAG to determine when a colon should - 29380 ; be added to a token. - 29381 ;05/30/84 MZ Initialize all copy variables. Fix confusion with destclosed - 29382 ; NOTE: DestHand is the destination handle. There are two - 29383 ; special values: -1 meaning destination was never opened and - 29384 ; 0 which means that the destination has been openned and - 29385 ; closed. - 29386 ;06/01/84 MZ Above reasoning totally specious. Returned things to normal - 29387 ;06/06/86 EG Change to fix problem of source switches /a and /b getting - 29388 ; lost on large and multiple file (wildcard) copies. - 29389 ;06/09/86 EG Change to use xnametrans call to verify that source and - 29390 ; destination are not equal. - 29391 ; - 29392 ;06/24/90 DO If the destination of a file concatenation is the same as - 29393 ; first source file AND we run out of disk space before - 29394 ; completing the concatenation, restore the first source - 29395 ; file as best we can. See SeekEnd and CopErr. Bug #859. - 29396 ; - 29397 ;M031 SR 10/11/90 Bug #3069. Use deny write sharing mode to open files - 29398 ; instead of compatibility mode. This gives lesser sharing - 29399 ; violations when files are opened for read on a copy. - 29400 - 29401 ; --------------------------------------------------------------------------- - 29402 ;*** COPY CODE - 29403 ; --------------------------------------------------------------------------- - 29404 - 29405 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2A15h - 29406 - 29407 ; 23/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29408 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 38C3h + 29366 + 29367 ;*** MODIFICATION HISTORY + 29368 + 29369 ;11/01/83 EE Added a few lines at the end of SCANSRC2 to get multiple + 29370 ; file concatenations (eg copy a.*+b.*+c.*) to work properly. + 29371 ;11/02/83 EE Commented out the code in CPARSE which added drive designators + 29372 ; to tokens which begin with path characters so that PARSELINE + 29373 ; will work correctly. + 29374 ;11/04/83 EE Commented out the code in CPARSE that considered paren's to be + 29375 ; individual tokens. That distinction is no longer needed for + 29376 ; FOR loop processing. + 29377 ;11/17/83 EE CPARSE upper case conversion is now flag dependent. Flag is + 29378 ; 1 when Cparse is called from COPY. + 29379 ;11/17/83 EE Took out the comment chars around code described in 11/04/83 + 29380 ; mod. It now is conditional on flag like previous mod. + 29381 ;11/21/83 NP Added printf + 29382 ;12/09/83 EE CPARSE changed to use CPYFLAG to determine when a colon should + 29383 ; be added to a token. + 29384 ;05/30/84 MZ Initialize all copy variables. Fix confusion with destclosed + 29385 ; NOTE: DestHand is the destination handle. There are two + 29386 ; special values: -1 meaning destination was never opened and + 29387 ; 0 which means that the destination has been openned and + 29388 ; closed. + 29389 ;06/01/84 MZ Above reasoning totally specious. Returned things to normal + 29390 ;06/06/86 EG Change to fix problem of source switches /a and /b getting + 29391 ; lost on large and multiple file (wildcard) copies. + 29392 ;06/09/86 EG Change to use xnametrans call to verify that source and + 29393 ; destination are not equal. + 29394 ; + 29395 ;06/24/90 DO If the destination of a file concatenation is the same as + 29396 ; first source file AND we run out of disk space before + 29397 ; completing the concatenation, restore the first source + 29398 ; file as best we can. See SeekEnd and CopErr. Bug #859. + 29399 ; + 29400 ;M031 SR 10/11/90 Bug #3069. Use deny write sharing mode to open files + 29401 ; instead of compatibility mode. This gives lesser sharing + 29402 ; violations when files are opened for read on a copy. + 29403 + 29404 ; --------------------------------------------------------------------------- + 29405 ;*** COPY CODE + 29406 ; --------------------------------------------------------------------------- + 29407 + 29408 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2A15h 29409 - 29410 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 29411 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3E6Dh + 29410 ; 23/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29411 ; MSDOS 5.0 - COMMAND.COM, transient portion/segment offset 38C3h 29412 - 29413 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM - 29414 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 3D1Eh + 29413 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 29414 ; MSDOS 6.22 - COMMAND.COM, transient portion/segment offset 3E6Dh 29415 - 29416 COPY: - 29417 ; Initialize internal variables. + 29416 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM + 29417 ; PCDOS 7.1 - COMMAND.COM, transient portion/segment offset 3D1Eh 29418 - 29419 00003B56 31C0 xor ax,ax ; AX = 0 - 29420 00003B58 A3[A29D] mov [Copy_num],ax ; # files copied (destinations) = 0 - 29421 00003B5B A3[D29E] mov [SRCPT],ax ; cmd line ptr for source scan = 0 - 29422 00003B5E A3[1E9E] mov [SrcTail],ax ; ptr to last element of source pathname = 0 - 29423 00003B61 A2[139C] mov [CFLAG],al ; 'destination file created' = false - 29424 00003B64 A3[199C] mov [NXTADD],ax ; ptr into TPA buffer = 0 - 29425 00003B67 A3[0F9C] mov [DestSwitch],ax ; destination switches = none - 29426 00003B6A A3[F69E] mov [STARTEL],ax ; CParse ptr to last pathname element = 0 - 29427 00003B6D A3[BB9D] mov [DestTail],ax ; ptr to last element of dest pathname = 0 - 29428 00003B70 A2[149C] mov [DestClosed],al ; 'destination file closed' = false - 29429 00003B73 A2[BA9D] mov [DestSiz],al ; length of destination pathname = 0 - 29430 00003B76 A2[1D9E] mov [SrcSiz],al ; length of source pathname = 0 - 29431 00003B79 A2[BD9D] mov [DestInfo],al ; destination pathname flags = none - 29432 00003B7C A2[209E] mov [SrcInfo],al ; source pathname flags = none - 29433 00003B7F A2[D49E] mov [INEXACT],al ; 'inexact copy' = false - 29434 00003B82 A2[B99D] mov [DestVars],al ; 'dest pathname is directory' = false ;*!* - 29435 00003B85 A2[1C9E] mov [SrcVars],al ; 'source pathname is directory' = false - 29436 00003B88 A2[D79A] mov [USERDIR1],al ; saved working directory = null - 29437 00003B8B A2[D59E] mov [NOWRITE],al ; 'no write' (source = dest) = false - 29438 00003B8E A2[069C] mov [RDEOF],al ; 'read end of file' = false - 29439 00003B91 A3[789E] mov [SRCHAND],ax ; source handle = 0 - 29440 00003B94 A3[DD9E] mov [CPDATE],ax ; copy date = 0 - 29441 00003B97 A3[DF9E] mov [CPTIME],ax ; copy time = 0 - 29442 00003B9A A2[7A9E] mov [SRCISDEV],al ; 'source is device' = false - 29443 ; 23/03/2023 - 29444 ; MSDOS 6.0 (& MSDOS 5.0) COMMAND.COM - 29445 00003B9D A2[E59E] mov [OCtrlZ],al ; 'Ctrl+Z removed from original' = false - 29446 ; mov [zflag],al ; PCDOS 7.1 ; 10/08/2024 - 29447 00003BA0 A3[E19E] mov [OFilePtr_Lo],ax - 29448 00003BA3 A3[E39E] mov [OFilePtr_Hi],ax ; original destination file ptr = null - 29449 00003BA6 A2[D99E] mov [TERMREAD],al ; 'terminate read' = false - 29450 00003BA9 A2[959D] mov [comma],al ; '"+,," found' = false - 29451 00003BAC A2[969D] mov [plus_comma],al ; '"+,," found last time' = false (?) - 29452 00003BAF A2[339F] mov [msg_flag],al ;AN022; 'non-utility msg issued' = false - 29453 00003BB2 A3[119C] mov [AllSwitch],ax ; all switches = none - 29454 00003BB5 A2[0A9C] mov [ArgC],al ; source/dest argument count = 0 - 29455 00003BB8 A2[DB9E] mov [PLUS],al ; '"+" in command line' = false - 29456 00003BBB A2[D69E] mov [BINARY],al ; 'binary copy' = false - 29457 00003BBE A2[DA9E] mov [ASCII],al ; 'ascii copy' = false - 29458 00003BC1 A3[209C] mov [FileCnt],ax ; # files copied (destinations) = 0 - 29459 00003BC4 A3[D79E] mov [WRITTEN],ax ; 'destination written to' = false - 29460 00003BC7 A2[089C] mov [Concat],al ; 'concatenating' = false - 29461 00003BCA A2[199E] mov [MELCOPY],al ; 'Mel Hallerman copy' = false - 29462 00003BCD A3[1A9E] mov [MELSTART],ax ; Mel Hallerman cmd line ptr = 0 - 29463 - 29464 ; 12/06/2023 - 29465 ; MSDOS 6.22 COMMAND.COM - 29466 ; (Disassembled source code by using Hex-Rays IDA disassembler) - 29467 00003BD0 A2[F29E] mov [cox_dest_file], al ; MSDOS 6.22 - 29468 00003BD3 A2[F39E] mov [cox_src_file], al ; MSDOS 6.22 - 29469 - 29470 ; Initialize buffers with double-nulls. - 29471 - 29472 00003BD6 A3[7B9E] mov [ScanBuf],ax - 29473 00003BD9 A3[BE9D] mov [DestBuf],ax - 29474 00003BDC A3[219E] mov [SrcBuf],ax - 29475 00003BDF A3[7F9D] mov [SDIRBUF],ax - 29476 00003BE2 A3[399D] mov [DIRBUF],ax - 29477 00003BE5 A3[F69C] mov [DestFcb],ax - 29478 - 29479 00003BE8 A2[DC9E] mov [objcnt],al ; # CParse cmd-line objects found = 0 - 29480 - 29481 00003BEB 48 dec ax ; -1 ; AX = 0FFFFh - 29482 00003BEC A3[159E] mov [DESTHAND],ax ; destination handle = 'never opened' - 29483 00003BEF A2[1B9C] mov [FRSTSRCH],al ; 'first search for source' = true - 29484 00003BF2 A2[189E] mov [FIRSTDEST],al ; 'first time for dest' = true - 29485 00003BF5 A2[B99D] mov [DestIsDir],al ; 'haven't analyzed destination' ; *!* - 29486 - 29487 ; 12/06/2023 - 29488 ; Retro DOS v4.2 COMMAND.COM - 29489 ; MSDOS 6.22 COMMAND.COM code only ! - 29490 ; (Disassembled source code by using Hex-Rays IDA disassembler) - 29491 ; - 29492 00003BF8 E8FB06 call init_copycmd_option ; MSDOS 6.22 - 29493 - 29494 00003BFB BE8100 mov si,81h ; SI = ptr to command line - 29495 ;mov bl,[PLUS_CHR] ; BL = special delimiter = "+" - 29496 ; 23/03/2023 - 29497 00003BFE B32B mov bl,'+' - 29498 00003C00 FE06[329F] inc byte [expand_star] ; CParse 'expand * to ?s' = true - 29499 00003C04 C606[A49D]01 mov byte [cpyflag],1 ; CParse 'called from COPY' = true - 29500 - 29501 ;* Scan the command line for destination information. - 29502 - 29503 DESTSCAN: - 29504 00003C09 31ED xor bp,bp ; BP = switch flag accumulator - 29505 00003C0B BF[7B9E] mov di,ScanBuf ; ES:DI = ptr to pathname buf - 29506 ; 23/03/2023 - 29507 00003C0E 8936[989D] mov [parse_last],si ;AN018; save cmd line ptr - 29508 00003C12 E8920B call cparse ; parse next object - 29509 00003C15 9C pushf ; (*) ; save CParse flags - 29510 00003C16 FE06[DC9E] inc byte [objcnt] ; count object - 29511 00003C1A F6C780 test bh,80h - 29512 00003C1D 7405 jz short NOCOPY ; no "+" delimiter - 29513 00003C1F C606[DB9E]01 mov byte [PLUS],1 ; "+" delimiter occurred - 29514 NOCOPY: - 29515 00003C24 F6C701 test bh,1 - 29516 00003C27 747D jz short TESTP2 ; not a switch - 29517 - 29518 ; Found a switch. - 29519 - 29520 ; 23/03/2023 - Retro DOS v4.0 COMMAND.COM - 29521 ; - 29522 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 29523 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3F43h - 29524 CHK_CP_SWITCH: - 29525 ; MSDOS 6.0 - 29526 00003C29 F7C51000 test bp,10h - 29527 ;test bp,SwitchV ; 10h ;AN038; Verify requested? - 29528 00003C2D 740B jz short NOT_SLASHV ;AN038; No - set the switch - 29529 ;test word [AllSwitch],10h - 29530 00003C2F F606[119C]10 test byte [AllSwitch],10h - 29531 ;test byte [AllSwitch],SwitchV ;AN038; Verify already entered? - 29532 00003C34 7404 jz short NOT_SLASHV ;AN038; No - set the switch - 29533 ;AD018; ;or word [AllSwitch],FBadSwitch ;AN038; Set up bad switch - 29534 ;or bp,FBadSwitch ;AN018; Set up bad switch - 29535 00003C36 81CD0040 or bp,4000h - 29536 NOT_SLASHV: - 29537 ; **************************************** - 29538 ; 12/06/2023 - 29539 ; Retro DOS v4.2 COMMAND.COM - 29540 ; MSDOS 6.22 COMMAND.COM code only ! - 29541 ; (Disassembled source code by using Hex-Rays IDA disassembler) - 29542 ; **************************************** - 29543 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3F55h - 29544 ; - 29545 00003C3A F7C54000 test bp,40h ; negative Y (-Y) switch flag - 29546 00003C3E 7417 jz short CHK_SLASHY0 + 29419 COPY: + 29420 ; Initialize internal variables. + 29421 + 29422 00003B56 31C0 xor ax,ax ; AX = 0 + 29423 00003B58 A3[A29D] mov [Copy_num],ax ; # files copied (destinations) = 0 + 29424 00003B5B A3[D29E] mov [SRCPT],ax ; cmd line ptr for source scan = 0 + 29425 00003B5E A3[1E9E] mov [SrcTail],ax ; ptr to last element of source pathname = 0 + 29426 00003B61 A2[139C] mov [CFLAG],al ; 'destination file created' = false + 29427 00003B64 A3[199C] mov [NXTADD],ax ; ptr into TPA buffer = 0 + 29428 00003B67 A3[0F9C] mov [DestSwitch],ax ; destination switches = none + 29429 00003B6A A3[F69E] mov [STARTEL],ax ; CParse ptr to last pathname element = 0 + 29430 00003B6D A3[BB9D] mov [DestTail],ax ; ptr to last element of dest pathname = 0 + 29431 00003B70 A2[149C] mov [DestClosed],al ; 'destination file closed' = false + 29432 00003B73 A2[BA9D] mov [DestSiz],al ; length of destination pathname = 0 + 29433 00003B76 A2[1D9E] mov [SrcSiz],al ; length of source pathname = 0 + 29434 00003B79 A2[BD9D] mov [DestInfo],al ; destination pathname flags = none + 29435 00003B7C A2[209E] mov [SrcInfo],al ; source pathname flags = none + 29436 00003B7F A2[D49E] mov [INEXACT],al ; 'inexact copy' = false + 29437 00003B82 A2[B99D] mov [DestVars],al ; 'dest pathname is directory' = false ;*!* + 29438 00003B85 A2[1C9E] mov [SrcVars],al ; 'source pathname is directory' = false + 29439 00003B88 A2[D79A] mov [USERDIR1],al ; saved working directory = null + 29440 00003B8B A2[D59E] mov [NOWRITE],al ; 'no write' (source = dest) = false + 29441 00003B8E A2[069C] mov [RDEOF],al ; 'read end of file' = false + 29442 00003B91 A3[789E] mov [SRCHAND],ax ; source handle = 0 + 29443 00003B94 A3[DD9E] mov [CPDATE],ax ; copy date = 0 + 29444 00003B97 A3[DF9E] mov [CPTIME],ax ; copy time = 0 + 29445 00003B9A A2[7A9E] mov [SRCISDEV],al ; 'source is device' = false + 29446 ; 23/03/2023 + 29447 ; MSDOS 6.0 (& MSDOS 5.0) COMMAND.COM + 29448 00003B9D A2[E59E] mov [OCtrlZ],al ; 'Ctrl+Z removed from original' = false + 29449 ; mov [zflag],al ; PCDOS 7.1 ; 10/08/2024 + 29450 00003BA0 A3[E19E] mov [OFilePtr_Lo],ax + 29451 00003BA3 A3[E39E] mov [OFilePtr_Hi],ax ; original destination file ptr = null + 29452 00003BA6 A2[D99E] mov [TERMREAD],al ; 'terminate read' = false + 29453 00003BA9 A2[959D] mov [comma],al ; '"+,," found' = false + 29454 00003BAC A2[969D] mov [plus_comma],al ; '"+,," found last time' = false (?) + 29455 00003BAF A2[339F] mov [msg_flag],al ;AN022; 'non-utility msg issued' = false + 29456 00003BB2 A3[119C] mov [AllSwitch],ax ; all switches = none + 29457 00003BB5 A2[0A9C] mov [ArgC],al ; source/dest argument count = 0 + 29458 00003BB8 A2[DB9E] mov [PLUS],al ; '"+" in command line' = false + 29459 00003BBB A2[D69E] mov [BINARY],al ; 'binary copy' = false + 29460 00003BBE A2[DA9E] mov [ASCII],al ; 'ascii copy' = false + 29461 00003BC1 A3[209C] mov [FileCnt],ax ; # files copied (destinations) = 0 + 29462 00003BC4 A3[D79E] mov [WRITTEN],ax ; 'destination written to' = false + 29463 00003BC7 A2[089C] mov [Concat],al ; 'concatenating' = false + 29464 00003BCA A2[199E] mov [MELCOPY],al ; 'Mel Hallerman copy' = false + 29465 00003BCD A3[1A9E] mov [MELSTART],ax ; Mel Hallerman cmd line ptr = 0 + 29466 + 29467 ; 12/06/2023 + 29468 ; MSDOS 6.22 COMMAND.COM + 29469 ; (Disassembled source code by using Hex-Rays IDA disassembler) + 29470 00003BD0 A2[F29E] mov [cox_dest_file], al ; MSDOS 6.22 + 29471 00003BD3 A2[F39E] mov [cox_src_file], al ; MSDOS 6.22 + 29472 + 29473 ; Initialize buffers with double-nulls. + 29474 + 29475 00003BD6 A3[7B9E] mov [ScanBuf],ax + 29476 00003BD9 A3[BE9D] mov [DestBuf],ax + 29477 00003BDC A3[219E] mov [SrcBuf],ax + 29478 00003BDF A3[7F9D] mov [SDIRBUF],ax + 29479 00003BE2 A3[399D] mov [DIRBUF],ax + 29480 00003BE5 A3[F69C] mov [DestFcb],ax + 29481 + 29482 00003BE8 A2[DC9E] mov [objcnt],al ; # CParse cmd-line objects found = 0 + 29483 + 29484 00003BEB 48 dec ax ; -1 ; AX = 0FFFFh + 29485 00003BEC A3[159E] mov [DESTHAND],ax ; destination handle = 'never opened' + 29486 00003BEF A2[1B9C] mov [FRSTSRCH],al ; 'first search for source' = true + 29487 00003BF2 A2[189E] mov [FIRSTDEST],al ; 'first time for dest' = true + 29488 00003BF5 A2[B99D] mov [DestIsDir],al ; 'haven't analyzed destination' ; *!* + 29489 + 29490 ; 12/06/2023 + 29491 ; Retro DOS v4.2 COMMAND.COM + 29492 ; MSDOS 6.22 COMMAND.COM code only ! + 29493 ; (Disassembled source code by using Hex-Rays IDA disassembler) + 29494 ; + 29495 00003BF8 E8FB06 call init_copycmd_option ; MSDOS 6.22 + 29496 + 29497 00003BFB BE8100 mov si,81h ; SI = ptr to command line + 29498 ;mov bl,[PLUS_CHR] ; BL = special delimiter = "+" + 29499 ; 23/03/2023 + 29500 00003BFE B32B mov bl,'+' + 29501 00003C00 FE06[329F] inc byte [expand_star] ; CParse 'expand * to ?s' = true + 29502 00003C04 C606[A49D]01 mov byte [cpyflag],1 ; CParse 'called from COPY' = true + 29503 + 29504 ;* Scan the command line for destination information. + 29505 + 29506 DESTSCAN: + 29507 00003C09 31ED xor bp,bp ; BP = switch flag accumulator + 29508 00003C0B BF[7B9E] mov di,ScanBuf ; ES:DI = ptr to pathname buf + 29509 ; 23/03/2023 + 29510 00003C0E 8936[989D] mov [parse_last],si ;AN018; save cmd line ptr + 29511 00003C12 E8920B call cparse ; parse next object + 29512 00003C15 9C pushf ; (*) ; save CParse flags + 29513 00003C16 FE06[DC9E] inc byte [objcnt] ; count object + 29514 00003C1A F6C780 test bh,80h + 29515 00003C1D 7405 jz short NOCOPY ; no "+" delimiter + 29516 00003C1F C606[DB9E]01 mov byte [PLUS],1 ; "+" delimiter occurred + 29517 NOCOPY: + 29518 00003C24 F6C701 test bh,1 + 29519 00003C27 747D jz short TESTP2 ; not a switch + 29520 + 29521 ; Found a switch. + 29522 + 29523 ; 23/03/2023 - Retro DOS v4.0 COMMAND.COM + 29524 ; + 29525 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 29526 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3F43h + 29527 CHK_CP_SWITCH: + 29528 ; MSDOS 6.0 + 29529 00003C29 F7C51000 test bp,10h + 29530 ;test bp,SwitchV ; 10h ;AN038; Verify requested? + 29531 00003C2D 740B jz short NOT_SLASHV ;AN038; No - set the switch + 29532 ;test word [AllSwitch],10h + 29533 00003C2F F606[119C]10 test byte [AllSwitch],10h + 29534 ;test byte [AllSwitch],SwitchV ;AN038; Verify already entered? + 29535 00003C34 7404 jz short NOT_SLASHV ;AN038; No - set the switch + 29536 ;AD018; ;or word [AllSwitch],FBadSwitch ;AN038; Set up bad switch + 29537 ;or bp,FBadSwitch ;AN018; Set up bad switch + 29538 00003C36 81CD0040 or bp,4000h + 29539 NOT_SLASHV: + 29540 ; **************************************** + 29541 ; 12/06/2023 + 29542 ; Retro DOS v4.2 COMMAND.COM + 29543 ; MSDOS 6.22 COMMAND.COM code only ! + 29544 ; (Disassembled source code by using Hex-Rays IDA disassembler) + 29545 ; **************************************** + 29546 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:3F55h 29547 ; - 29548 ;test word [AllSwitch],40h - 29549 00003C40 F606[119C]40 test byte [AllSwitch],40h ; [AllSwitch] negative (-Y) flag - 29550 00003C45 7507 jnz short NOT_SLASHY1 ; N flag - 29551 ;test word [AllSwitch],80h - 29552 00003C47 F606[119C]80 test byte [AllSwitch],80h ; [AllSwitch] SwitchY (Y) flag - 29553 00003C4C 7404 jz short NOT_SLASHY2 - 29554 NOT_SLASHY1: - 29555 00003C4E 81CD0040 or bp,4000h ; FBadSwitch (Repetitive) - 29556 NOT_SLASHY2: ; Set up bad switch - 29557 00003C52 C606[F19E]00 mov byte [cox_y_override],0 ; cox_y setting will be used - 29558 CHK_SLASHY0: - 29559 00003C57 F7C58000 test bp,80h - 29560 00003C5B 742B jz short CHK_SLASHY4 ; not a /Y switch - 29561 ; - 29562 00003C5D 8A04 mov al,[si] - 29563 00003C5F 3C79 cmp al,'y' - 29564 00003C61 740A je short CHK_SLASHY1 - 29565 00003C63 3C59 cmp al,'Y' - 29566 00003C65 7406 je short CHK_SLASHY1 - 29567 00003C67 81CD0040 or bp,4000h ; FBadSwitch - 29568 ; ; Set up bad switch - 29569 00003C6B EB1B jmp short CHK_SLASHY4 - 29570 CHK_SLASHY1: - 29571 00003C6D C60420 mov byte [si],20h ; ' ' - 29572 00003C70 46 inc si - 29573 ;test word [AllSwitch],40h - 29574 00003C71 F606[119C]40 test byte [AllSwitch],40h ; [AllSwitch] negative (-Y) flag - 29575 00003C76 7507 jnz short CHK_SLASHY2 ; N flag - 29576 ;test word [AllSwitch],80h - 29577 00003C78 F606[119C]80 test byte [AllSwitch],80h ; [AllSwitch] SwitchY (Y) flag - 29578 00003C7D 7404 jz short CHK_SLASHY3 - 29579 CHK_SLASHY2: - 29580 00003C7F 81CD0040 or bp,4000h ; FBadSwitch (Repetitive) - 29581 ; ; Set up bad switch - 29582 CHK_SLASHY3: - 29583 00003C83 C606[F19E]01 mov byte [cox_y_override],1 - 29584 CHK_SLASHY4: - 29585 ; **************************************** - 29586 ; 12/06/2023 - 29587 ;NOT_SLASHV: - 29588 ;or [DestSwitch],bp ; assume destination - 29589 ;or [AllSwitch],bp ; keep tabs on all switches - 29590 - 29591 ; 12/06/2023 - 29592 ; Retro DOS v4.2 COMMAND.COM - 29593 ; MSDOS 6.22 COMMAND.COM -TRANGROUP:3FA7h - 29594 00003C88 092E[0F9C] or [DestSwitch],bp ; set [DestSwitch] SwitchY flag to 1 - 29595 00003C8C 092E[119C] or [AllSwitch],bp ; set [AllSwitch] SwitchY flag to 1 - 29596 ;test bp,~SwitchCopy ; Bad switch? - 29597 00003C90 F7C5237F test bp,7F23h ; MSDOS 6.22 ; ~SwitchCopy ; not SwitchCopy - 29598 00003C94 740A jz short NOT_BAD_SWITCH ; Switches are okay - 29599 - 29600 ; 12/06/2023 - 29601 ; 23/03/2023 - 29602 ; MSDOS 6.0 - 29603 ;;test bp,not SwitchCopy ;AN018; Bad switch? - 29604 ;test bp,7FE3h ; test bp,~SwitchCopy - 29605 ;jz short NOT_BAD_SWITCH ;AN018; Switches are okay - 29606 - 29607 00003C96 9D popf ; (*) ;AN018; fix up stack - 29608 00003C97 B80300 mov ax,BadSwt_Ptr ; 3 ;AN018; get "Invalid switch" message number - 29609 00003C9A E8CDE8 call setup_parse_error_msg ;AN018; setup to print the message - 29610 00003C9D E986F0 jmp cerror ;AC018; exit - 29611 NOT_BAD_SWITCH: - 29612 00003CA0 9D popf ; restore CParse flags - 29613 00003CA1 7233 jc short CHECKDONE ; found CR - 29614 00003CA3 E963FF jmp DESTSCAN ; continue scanning for destination - 29615 TESTP2: - 29616 00003CA6 9D popf ; (*) ; restore CParse flags - 29617 00003CA7 722D jc short CHECKDONE ; found CR - 29618 00003CA9 F6C780 test bh,80h - 29619 00003CAC 7504 jnz short GOTPLUS ; found a "+pathname" argument - 29620 00003CAE FE06[0A9C] inc byte [ArgC] ; count independent pathname args - 29621 GOTPLUS: - 29622 00003CB2 56 push si ; save cmd line ptr - 29623 00003CB3 A1[F69E] mov ax,[STARTEL] ; AX = ptr to last path element - 29624 00003CB6 BE[7B9E] mov si,ScanBuf ; SI = ptr to path string - 29625 00003CB9 29F0 sub ax,si ; AX = offset of last element - 29626 00003CBB BF[BE9D] mov di,DestBuf ; DI = ptr to destination buf - 29627 00003CBE 01F8 add ax,di ; AX = ptr to last element in - 29628 ; destination path buffer - 29629 00003CC0 A3[BB9D] mov [DestTail],ax ; save ptr to last element - 29630 00003CC3 880E[BA9D] mov [DestSiz],cl ; save path string length - 29631 00003CC7 41 inc cx ; CX = mov length (incl null) - 29632 00003CC8 F3A4 rep movsb ; DestBuf = possible destination path - 29633 00003CCA 883E[BD9D] mov [DestInfo],bh ; save CParse info flags - 29634 ;mov word [DestSwitch],0 ; clear destination switches - 29635 ; 10/08/2024 - 29636 00003CCE 890E[0F9C] mov [DestSwitch],cx ; 0 - 29637 00003CD2 5E pop si ; SI = ptr into cmd line again - 29638 00003CD3 E933FF jmp DESTSCAN ;AC018; continue scanning for dest - 29639 - 29640 CHECKDONE: - 29641 ; We reached the CR. The destination scan is finished. + 29548 00003C3A F7C54000 test bp,40h ; negative Y (-Y) switch flag + 29549 00003C3E 7417 jz short CHK_SLASHY0 + 29550 ; + 29551 ;test word [AllSwitch],40h + 29552 00003C40 F606[119C]40 test byte [AllSwitch],40h ; [AllSwitch] negative (-Y) flag + 29553 00003C45 7507 jnz short NOT_SLASHY1 ; N flag + 29554 ;test word [AllSwitch],80h + 29555 00003C47 F606[119C]80 test byte [AllSwitch],80h ; [AllSwitch] SwitchY (Y) flag + 29556 00003C4C 7404 jz short NOT_SLASHY2 + 29557 NOT_SLASHY1: + 29558 00003C4E 81CD0040 or bp,4000h ; FBadSwitch (Repetitive) + 29559 NOT_SLASHY2: ; Set up bad switch + 29560 00003C52 C606[F19E]00 mov byte [cox_y_override],0 ; cox_y setting will be used + 29561 CHK_SLASHY0: + 29562 00003C57 F7C58000 test bp,80h + 29563 00003C5B 742B jz short CHK_SLASHY4 ; not a /Y switch + 29564 ; + 29565 00003C5D 8A04 mov al,[si] + 29566 00003C5F 3C79 cmp al,'y' + 29567 00003C61 740A je short CHK_SLASHY1 + 29568 00003C63 3C59 cmp al,'Y' + 29569 00003C65 7406 je short CHK_SLASHY1 + 29570 00003C67 81CD0040 or bp,4000h ; FBadSwitch + 29571 ; ; Set up bad switch + 29572 00003C6B EB1B jmp short CHK_SLASHY4 + 29573 CHK_SLASHY1: + 29574 00003C6D C60420 mov byte [si],20h ; ' ' + 29575 00003C70 46 inc si + 29576 ;test word [AllSwitch],40h + 29577 00003C71 F606[119C]40 test byte [AllSwitch],40h ; [AllSwitch] negative (-Y) flag + 29578 00003C76 7507 jnz short CHK_SLASHY2 ; N flag + 29579 ;test word [AllSwitch],80h + 29580 00003C78 F606[119C]80 test byte [AllSwitch],80h ; [AllSwitch] SwitchY (Y) flag + 29581 00003C7D 7404 jz short CHK_SLASHY3 + 29582 CHK_SLASHY2: + 29583 00003C7F 81CD0040 or bp,4000h ; FBadSwitch (Repetitive) + 29584 ; ; Set up bad switch + 29585 CHK_SLASHY3: + 29586 00003C83 C606[F19E]01 mov byte [cox_y_override],1 + 29587 CHK_SLASHY4: + 29588 ; **************************************** + 29589 ; 12/06/2023 + 29590 ;NOT_SLASHV: + 29591 ;or [DestSwitch],bp ; assume destination + 29592 ;or [AllSwitch],bp ; keep tabs on all switches + 29593 + 29594 ; 12/06/2023 + 29595 ; Retro DOS v4.2 COMMAND.COM + 29596 ; MSDOS 6.22 COMMAND.COM -TRANGROUP:3FA7h + 29597 00003C88 092E[0F9C] or [DestSwitch],bp ; set [DestSwitch] SwitchY flag to 1 + 29598 00003C8C 092E[119C] or [AllSwitch],bp ; set [AllSwitch] SwitchY flag to 1 + 29599 ;test bp,~SwitchCopy ; Bad switch? + 29600 00003C90 F7C5237F test bp,7F23h ; MSDOS 6.22 ; ~SwitchCopy ; not SwitchCopy + 29601 00003C94 740A jz short NOT_BAD_SWITCH ; Switches are okay + 29602 + 29603 ; 12/06/2023 + 29604 ; 23/03/2023 + 29605 ; MSDOS 6.0 + 29606 ;;test bp,not SwitchCopy ;AN018; Bad switch? + 29607 ;test bp,7FE3h ; test bp,~SwitchCopy + 29608 ;jz short NOT_BAD_SWITCH ;AN018; Switches are okay + 29609 + 29610 00003C96 9D popf ; (*) ;AN018; fix up stack + 29611 00003C97 B80300 mov ax,BadSwt_Ptr ; 3 ;AN018; get "Invalid switch" message number + 29612 00003C9A E8CDE8 call setup_parse_error_msg ;AN018; setup to print the message + 29613 00003C9D E986F0 jmp cerror ;AC018; exit + 29614 NOT_BAD_SWITCH: + 29615 00003CA0 9D popf ; restore CParse flags + 29616 00003CA1 7233 jc short CHECKDONE ; found CR + 29617 00003CA3 E963FF jmp DESTSCAN ; continue scanning for destination + 29618 TESTP2: + 29619 00003CA6 9D popf ; (*) ; restore CParse flags + 29620 00003CA7 722D jc short CHECKDONE ; found CR + 29621 00003CA9 F6C780 test bh,80h + 29622 00003CAC 7504 jnz short GOTPLUS ; found a "+pathname" argument + 29623 00003CAE FE06[0A9C] inc byte [ArgC] ; count independent pathname args + 29624 GOTPLUS: + 29625 00003CB2 56 push si ; save cmd line ptr + 29626 00003CB3 A1[F69E] mov ax,[STARTEL] ; AX = ptr to last path element + 29627 00003CB6 BE[7B9E] mov si,ScanBuf ; SI = ptr to path string + 29628 00003CB9 29F0 sub ax,si ; AX = offset of last element + 29629 00003CBB BF[BE9D] mov di,DestBuf ; DI = ptr to destination buf + 29630 00003CBE 01F8 add ax,di ; AX = ptr to last element in + 29631 ; destination path buffer + 29632 00003CC0 A3[BB9D] mov [DestTail],ax ; save ptr to last element + 29633 00003CC3 880E[BA9D] mov [DestSiz],cl ; save path string length + 29634 00003CC7 41 inc cx ; CX = mov length (incl null) + 29635 00003CC8 F3A4 rep movsb ; DestBuf = possible destination path + 29636 00003CCA 883E[BD9D] mov [DestInfo],bh ; save CParse info flags + 29637 ;mov word [DestSwitch],0 ; clear destination switches + 29638 ; 10/08/2024 + 29639 00003CCE 890E[0F9C] mov [DestSwitch],cx ; 0 + 29640 00003CD2 5E pop si ; SI = ptr into cmd line again + 29641 00003CD3 E933FF jmp DESTSCAN ;AC018; continue scanning for dest 29642 - 29643 ; Disallow "copy file1+" as file overwriting itself. - 29644 ; - 29645 ; (Note that "copy file1+file2+" will be accepted, and - 29646 ; equivalent to "copy file1+file2".) - 29647 - 29648 ; Bugbug: it looks like "copy /x file1+" would slip - 29649 ; through this check, since the switch would count - 29650 ; as another object in ObjCnt. - 29651 - 29652 00003CD6 803E[DB9E]01 cmp byte [PLUS],1 ; "+" with - 29653 00003CDB 7514 jnz short CDCONT - 29654 00003CDD 803E[0A9C]01 cmp byte [ArgC],1 ; one arg, - 29655 00003CE2 750D jnz short CDCONT - 29656 00003CE4 803E[DC9E]02 cmp byte [objcnt],2 ; two objects.. - 29657 00003CE9 7506 jnz short CDCONT - 29658 00003CEB BA[0390] mov dx,OVERWR_PTR - 29659 00003CEE E9D207 jmp COPYERR ; is file overwrite - 29660 - 29661 CDCONT: - 29662 00003CF1 A0[DB9E] mov al,[PLUS] ; AL = '"+" occurred' - 29663 00003CF4 A2[089C] mov [Concat],al ; if "+" occurred, we're concatenating - 29664 00003CF7 D0E0 shl al,1 - 29665 00003CF9 D0E0 shl al,1 - 29666 00003CFB A2[D49E] mov [INEXACT],al ; therefore making an inexact copy - 29667 ;mov dx,BADARGSPTR ; MSDOS 3.3 ; 18/04/2023 - 29668 00003CFE A0[0A9C] mov al,[ArgC] ; AL = # independent arguments - 29669 - 29670 ; 23/03/2023 - 29671 ; MSDOS 3.3 - 29672 ;or al,al - 29673 ;jz short CERROR4J - 29674 ; MSDOS 6.0 - 29675 00003D01 08C0 or al,al - 29676 00003D03 750B jnz short TRY_TOO_MANY ; more than 0 args; check if too many - 29677 - 29678 00003D05 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block - 29679 00003D08 C706[D78F]0200 mov word [extend_buf_ptr],LessArgs_Ptr ; 2 - 29680 ;mov word [extend_buf_ptr],2 ; set msg # "param missing" - 29681 00003D0E EB0D jmp short CERROR_PARSEJ ; take parse error exit - 29682 - 29683 ; more than 0 args; check if too many - 29684 TRY_TOO_MANY: - 29685 00003D10 3C02 cmp al,2 - 29686 00003D12 7611 jbe short ACOUNTOK ; <= 2 arguments - ok - 29687 - 29688 ; 23/03/2023 - 29689 ; MSDOS 6.0 - 29690 00003D14 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block - 29691 00003D17 C706[D78F]0100 mov word [extend_buf_ptr],MoreArgs_Ptr - 29692 ;mov word [extend_buf_ptr],1 ; set msg # "too many params" - 29693 CERROR_PARSEJ: - 29694 00003D1D C606[D58F]02 mov byte [msg_disp_class],parse_msg_class ; 2 - 29695 ; parse error message - 29696 CERROR4J: - 29697 00003D22 E901F0 jmp cerror - 29698 - 29699 ACOUNTOK: - 29700 00003D25 BD[B99D] mov bp,DestVars ; BP = base of dest variables + 29643 CHECKDONE: + 29644 ; We reached the CR. The destination scan is finished. + 29645 + 29646 ; Disallow "copy file1+" as file overwriting itself. + 29647 ; + 29648 ; (Note that "copy file1+file2+" will be accepted, and + 29649 ; equivalent to "copy file1+file2".) + 29650 + 29651 ; Bugbug: it looks like "copy /x file1+" would slip + 29652 ; through this check, since the switch would count + 29653 ; as another object in ObjCnt. + 29654 + 29655 00003CD6 803E[DB9E]01 cmp byte [PLUS],1 ; "+" with + 29656 00003CDB 7514 jnz short CDCONT + 29657 00003CDD 803E[0A9C]01 cmp byte [ArgC],1 ; one arg, + 29658 00003CE2 750D jnz short CDCONT + 29659 00003CE4 803E[DC9E]02 cmp byte [objcnt],2 ; two objects.. + 29660 00003CE9 7506 jnz short CDCONT + 29661 00003CEB BA[0390] mov dx,OVERWR_PTR + 29662 00003CEE E9D207 jmp COPYERR ; is file overwrite + 29663 + 29664 CDCONT: + 29665 00003CF1 A0[DB9E] mov al,[PLUS] ; AL = '"+" occurred' + 29666 00003CF4 A2[089C] mov [Concat],al ; if "+" occurred, we're concatenating + 29667 00003CF7 D0E0 shl al,1 + 29668 00003CF9 D0E0 shl al,1 + 29669 00003CFB A2[D49E] mov [INEXACT],al ; therefore making an inexact copy + 29670 ;mov dx,BADARGSPTR ; MSDOS 3.3 ; 18/04/2023 + 29671 00003CFE A0[0A9C] mov al,[ArgC] ; AL = # independent arguments + 29672 + 29673 ; 23/03/2023 + 29674 ; MSDOS 3.3 + 29675 ;or al,al + 29676 ;jz short CERROR4J + 29677 ; MSDOS 6.0 + 29678 00003D01 08C0 or al,al + 29679 00003D03 750B jnz short TRY_TOO_MANY ; more than 0 args; check if too many + 29680 + 29681 00003D05 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block + 29682 00003D08 C706[D78F]0200 mov word [extend_buf_ptr],LessArgs_Ptr ; 2 + 29683 ;mov word [extend_buf_ptr],2 ; set msg # "param missing" + 29684 00003D0E EB0D jmp short CERROR_PARSEJ ; take parse error exit + 29685 + 29686 ; more than 0 args; check if too many + 29687 TRY_TOO_MANY: + 29688 00003D10 3C02 cmp al,2 + 29689 00003D12 7611 jbe short ACOUNTOK ; <= 2 arguments - ok + 29690 + 29691 ; 23/03/2023 + 29692 ; MSDOS 6.0 + 29693 00003D14 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block + 29694 00003D17 C706[D78F]0100 mov word [extend_buf_ptr],MoreArgs_Ptr + 29695 ;mov word [extend_buf_ptr],1 ; set msg # "too many params" + 29696 CERROR_PARSEJ: + 29697 00003D1D C606[D58F]02 mov byte [msg_disp_class],parse_msg_class ; 2 + 29698 ; parse error message + 29699 CERROR4J: + 29700 00003D22 E901F0 jmp cerror 29701 - 29702 00003D28 3C01 cmp al,1 - 29703 00003D2A 7520 jnz short GOT2ARGS + 29702 ACOUNTOK: + 29703 00003D25 BD[B99D] mov bp,DestVars ; BP = base of dest variables 29704 - 29705 ; Only one independent pathname argument on command line. - 29706 ; Set destination to d:*.*, where d: is current drive. + 29705 00003D28 3C01 cmp al,1 + 29706 00003D2A 7520 jnz short GOT2ARGS 29707 - 29708 ; Bugbug: but is this appropriate for "copy x:file1+x:file2"? - 29709 ; The two files would be appended as d:file1, rather than x:file1. + 29708 ; Only one independent pathname argument on command line. + 29709 ; Set destination to d:*.*, where d: is current drive. 29710 - 29711 00003D2C A0[079C] mov al,[CURDRV] ; AL = current drive (0 = A) - 29712 ;add al,[CAPITAL_A] ; AL = current drive letter - 29713 ; 23/03/2023 - 29714 00003D2F 0441 add al,'A' - 29715 00003D31 B43A mov ah,':' ; AX = "d:" - 29716 ;mov byte [bp+1],2 - 29717 00003D33 C6460102 mov byte [bp+VARSTRUC.SIZ],2 ; pathname length = 2 - 29718 - 29719 00003D37 BF[BE9D] mov di,DestBuf ; ES:DI = ptr to dest path buf - 29720 00003D3A AB stosw ; store "d:" - 29721 - 29722 00003D3B C706[0F9C]0000 mov word [DestSwitch],0 ; clear destination switches - 29723 ;mov byte [bp+4],2 - 29724 00003D41 C6460402 mov byte [bp+VARSTRUC.INFO],2 ; mark destination 'wildcard present' - 29725 ;mov byte [bp+VARSTRUC.ISDIR],0 ; mark destination 'not a directory' - 29726 ;mov byte [bp+0],0 - 29727 00003D45 C6460000 mov byte [bp],0 - 29728 00003D49 E82C0A call SETSTARS ; add wildcards - 29729 GOT2ARGS: - 29730 ; If destination pathname is "d:", add full wildcard filename - 29731 - 29732 ;cmp byte [bp+1],2 - 29733 00003D4C 807E0102 cmp byte [bp+VARSTRUC.SIZ],2 - 29734 00003D50 7516 jnz short NOTSHORTDEST ; not two chars, can't be "d:" - 29735 00003D52 B03A mov al,':' ; 3Ah - 29736 00003D54 3806[BF9D] cmp byte [DestBuf+1],al - 29737 00003D58 750E jnz short NOTSHORTDEST ; it's just a 2-character filename - 29738 ;or byte [bp+4],2 - 29739 00003D5A 804E0402 or byte [bp+VARSTRUC.INFO],2 ; mark destination 'wildcard present' - 29740 00003D5E BF[C09D] mov di,DestBuf+2 ; ES:DI = ptr after "d:" - 29741 ;mov byte [bp+VARSTRUC.ISDIR],0 ; mark destination 'not a directory' - 29742 ;mov byte [bp+0],0 - 29743 00003D61 C6460000 mov byte [bp],0 - 29744 00003D65 E8100A call SETSTARS ; add wildcards - 29745 NOTSHORTDEST: - 29746 ; If destination pathname ends with "\", try to make - 29747 ; sure it's "d:\". - 29748 - 29749 ;mov di,[bp+2] - 29750 00003D68 8B7E02 mov di,[bp+VARSTRUC.TTAIL] ; DI = ptr to last path element - 29751 00003D6B 803D00 cmp byte [di],0 - 29752 00003D6E 7515 jnz short CHKSWTCHES ; not a null, so last char not "\" - 29753 - 29754 00003D70 BA[3791] mov dx,badcd_ptr - 29755 00003D73 B03A mov al,':' - 29756 00003D75 3845FE cmp [di-2],al - 29757 00003D78 75A8 jne short CERROR4J ; it's not "d:\", exit with error msg - 29758 ;mov byte [bp+0],2 - 29759 ;mov byte [bp+VARSTRUC.ISDIR],2 ; destination 'is a directory' - 29760 00003D7A C6460002 mov byte [bp],2 - 29761 ;or byte [bp+4],6 - 29762 00003D7E 804E0406 or byte [bp+VARSTRUC.INFO],6 ; destination wildcarded and contains - 29763 ; path character - 29764 00003D82 E8F309 call SETSTARS ; add wildcards - 29765 CHKSWTCHES: - 29766 ; We have enough information about the destination for now. - 29767 - 29768 ; Turn on verify if requested. Save the current verify flag. - 29769 - 29770 ; 23/03/2023 - 29771 ; MSDOS 6.0 (& MSDOS 5.0) COMMAND.COM - 29772 ;mov dx,BADPARMPTR - 29773 - 29774 00003D85 A1[119C] mov ax,[AllSwitch] ; AX = all switch flags - 29775 - 29776 ; 23/03/2023 - 29777 ; MSDOS 3.3 - 29778 ;;test ax,~SWITCHCOPY ; 7FE3h - 29779 ;test ax,NOT_SWITCHCOPY ; 7FE3h ; 13/10/2018 - 29780 ;jnz short CERROR4J - 29781 - 29782 ; 23/03/2023 - 29783 ; MSDOS 3.3 (& MSDOS 6.0) - 29784 ;test ax,SwitchV ; 10h - 29785 ; 18/04/2023 - 29786 ;test ax,10h - 29787 00003D88 A810 test al,10h ; test al,SwitchV - 29788 00003D8A 7414 jz short NOVERIF ; no /v, no verify - 29789 - 29790 00003D8C B454 mov ah,Get_Verify_On_Write ; 54h - 29791 00003D8E CD21 int 21h ; DOS - 2+ - GET VERIFY FLAG - 29792 ; Return: AL = 00h if flag OFF - 29793 ; AL = 01h if flag ON - 29794 00003D90 1E push ds - 29795 00003D91 8E1E[F59B] mov ds,[RESSEG] - 29796 00003D95 30E4 xor ah,ah - 29797 00003D97 A3[A702] mov [VerVal],ax ; save current verify flag - 29798 00003D9A 1F pop ds - 29799 00003D9B B8012E mov ax,(SET_VERIFY_ON_WRITE<<8)|1 ; 2E01h - 29800 00003D9E CD21 int 21h ; DOS - SET VERIFY FLAG - 29801 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off - 29802 NOVERIF: - 29803 ;* Scan for first source. - 29804 - 29805 00003DA0 31ED xor bp,bp ; BP = switch flags accumulator - 29806 00003DA2 BE8100 mov si,81h ; SI = ptr into command line - 29807 ;mov bl,[PLUS_CHR] ; BL = special CParse delimiter = "+" - 29808 ; 23/03/2023 - 29809 00003DA5 B32B mov bl,'+' ; 2Bh - 29810 SCANFSRC: - 29811 00003DA7 BF[7B9E] mov di,ScanBuf ; DI = ptr to pathname buf - 29812 00003DAA E8FA09 call cparse ; parse first source pathname - 29813 00003DAD F6C701 test bh,1 ; switch? - 29814 00003DB0 75F5 jnz short SCANFSRC ; yes, try again - 29815 00003DB2 092E[0F9C] or [DestSwitch],bp ; include copy-wide switches on dest - 29816 - 29817 ; Set ascii copying mode if concatenating, unless /b is specified. - 29818 - 29819 ; 23/03/2023 - 29820 00003DB6 F7C50800 test bp,8 - 29821 ;test bp,SWITCHB - 29822 00003DBA 750C jnz short NOSETCASC ; /b - explicit binary copy - 29823 00003DBC 803E[089C]00 cmp byte [Concat],0 - 29824 00003DC1 7405 jz short NOSETCASC ; we're not concatenating - 29825 00003DC3 C606[DA9E]04 mov byte [ASCII],4 - 29826 ;mov byte [ASCII],SWITCHA ; set ascii copy - 29827 NOSETCASC: - 29828 00003DC8 E83004 call SOURCE_SET ; set source variables - 29829 00003DCB E84400 call FRSTSRC ; set up first source copy - 29830 00003DCE E99800 jmp FIRSTENT ; jump into the copy loop - 29831 - 29832 ; --------------------------------------------------------------------------- - 29833 - 29834 ; 24/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29835 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3AE9h - 29836 ENDCOPY: - 29837 ;* End of the road. Close destination, display # files - 29838 ; copied (meaning # destinations), and go back to main - 29839 ; transient COMMAND code. - 29840 - 29841 00003DD1 E83503 call CLOSEDEST - 29842 ENDCOPY2: - 29843 00003DD4 BA[0C90] mov dx,copied_ptr - 29844 00003DD7 8B36[209C] mov si,[FileCnt] - 29845 00003DDB 8936[A29D] mov [Copy_num],si - 29846 00003DDF E84616 call std_printf - 29847 00003DE2 E91FC3 jmp TCOMMAND ; stack could be messed up - 29848 - 29849 ; --------------------------------------------------------------------------- - 29850 - 29851 SRCNONEXIST: - 29852 ;* Source doesn't exist. If concatenating, ignore and continue. - 29853 ; Otherwise, say 'file not found' and quit. - 29854 - 29855 00003DE5 803E[089C]00 cmp byte [Concat],0 - 29856 00003DEA 7546 jne short NEXTSRC ; concatenating - go on to next source + 29711 ; Bugbug: but is this appropriate for "copy x:file1+x:file2"? + 29712 ; The two files would be appended as d:file1, rather than x:file1. + 29713 + 29714 00003D2C A0[079C] mov al,[CURDRV] ; AL = current drive (0 = A) + 29715 ;add al,[CAPITAL_A] ; AL = current drive letter + 29716 ; 23/03/2023 + 29717 00003D2F 0441 add al,'A' + 29718 00003D31 B43A mov ah,':' ; AX = "d:" + 29719 ;mov byte [bp+1],2 + 29720 00003D33 C6460102 mov byte [bp+VARSTRUC.SIZ],2 ; pathname length = 2 + 29721 + 29722 00003D37 BF[BE9D] mov di,DestBuf ; ES:DI = ptr to dest path buf + 29723 00003D3A AB stosw ; store "d:" + 29724 + 29725 00003D3B C706[0F9C]0000 mov word [DestSwitch],0 ; clear destination switches + 29726 ;mov byte [bp+4],2 + 29727 00003D41 C6460402 mov byte [bp+VARSTRUC.INFO],2 ; mark destination 'wildcard present' + 29728 ;mov byte [bp+VARSTRUC.ISDIR],0 ; mark destination 'not a directory' + 29729 ;mov byte [bp+0],0 + 29730 00003D45 C6460000 mov byte [bp],0 + 29731 00003D49 E82C0A call SETSTARS ; add wildcards + 29732 GOT2ARGS: + 29733 ; If destination pathname is "d:", add full wildcard filename + 29734 + 29735 ;cmp byte [bp+1],2 + 29736 00003D4C 807E0102 cmp byte [bp+VARSTRUC.SIZ],2 + 29737 00003D50 7516 jnz short NOTSHORTDEST ; not two chars, can't be "d:" + 29738 00003D52 B03A mov al,':' ; 3Ah + 29739 00003D54 3806[BF9D] cmp byte [DestBuf+1],al + 29740 00003D58 750E jnz short NOTSHORTDEST ; it's just a 2-character filename + 29741 ;or byte [bp+4],2 + 29742 00003D5A 804E0402 or byte [bp+VARSTRUC.INFO],2 ; mark destination 'wildcard present' + 29743 00003D5E BF[C09D] mov di,DestBuf+2 ; ES:DI = ptr after "d:" + 29744 ;mov byte [bp+VARSTRUC.ISDIR],0 ; mark destination 'not a directory' + 29745 ;mov byte [bp+0],0 + 29746 00003D61 C6460000 mov byte [bp],0 + 29747 00003D65 E8100A call SETSTARS ; add wildcards + 29748 NOTSHORTDEST: + 29749 ; If destination pathname ends with "\", try to make + 29750 ; sure it's "d:\". + 29751 + 29752 ;mov di,[bp+2] + 29753 00003D68 8B7E02 mov di,[bp+VARSTRUC.TTAIL] ; DI = ptr to last path element + 29754 00003D6B 803D00 cmp byte [di],0 + 29755 00003D6E 7515 jnz short CHKSWTCHES ; not a null, so last char not "\" + 29756 + 29757 00003D70 BA[3791] mov dx,badcd_ptr + 29758 00003D73 B03A mov al,':' + 29759 00003D75 3845FE cmp [di-2],al + 29760 00003D78 75A8 jne short CERROR4J ; it's not "d:\", exit with error msg + 29761 ;mov byte [bp+0],2 + 29762 ;mov byte [bp+VARSTRUC.ISDIR],2 ; destination 'is a directory' + 29763 00003D7A C6460002 mov byte [bp],2 + 29764 ;or byte [bp+4],6 + 29765 00003D7E 804E0406 or byte [bp+VARSTRUC.INFO],6 ; destination wildcarded and contains + 29766 ; path character + 29767 00003D82 E8F309 call SETSTARS ; add wildcards + 29768 CHKSWTCHES: + 29769 ; We have enough information about the destination for now. + 29770 + 29771 ; Turn on verify if requested. Save the current verify flag. + 29772 + 29773 ; 23/03/2023 + 29774 ; MSDOS 6.0 (& MSDOS 5.0) COMMAND.COM + 29775 ;mov dx,BADPARMPTR + 29776 + 29777 00003D85 A1[119C] mov ax,[AllSwitch] ; AX = all switch flags + 29778 + 29779 ; 23/03/2023 + 29780 ; MSDOS 3.3 + 29781 ;;test ax,~SWITCHCOPY ; 7FE3h + 29782 ;test ax,NOT_SWITCHCOPY ; 7FE3h ; 13/10/2018 + 29783 ;jnz short CERROR4J + 29784 + 29785 ; 23/03/2023 + 29786 ; MSDOS 3.3 (& MSDOS 6.0) + 29787 ;test ax,SwitchV ; 10h + 29788 ; 18/04/2023 + 29789 ;test ax,10h + 29790 00003D88 A810 test al,10h ; test al,SwitchV + 29791 00003D8A 7414 jz short NOVERIF ; no /v, no verify + 29792 + 29793 00003D8C B454 mov ah,Get_Verify_On_Write ; 54h + 29794 00003D8E CD21 int 21h ; DOS - 2+ - GET VERIFY FLAG + 29795 ; Return: AL = 00h if flag OFF + 29796 ; AL = 01h if flag ON + 29797 00003D90 1E push ds + 29798 00003D91 8E1E[F59B] mov ds,[RESSEG] + 29799 00003D95 30E4 xor ah,ah + 29800 00003D97 A3[A702] mov [VerVal],ax ; save current verify flag + 29801 00003D9A 1F pop ds + 29802 00003D9B B8012E mov ax,(SET_VERIFY_ON_WRITE<<8)|1 ; 2E01h + 29803 00003D9E CD21 int 21h ; DOS - SET VERIFY FLAG + 29804 ; DL = 00h,AL = 01h VERIFY on / 00h VERIFY off + 29805 NOVERIF: + 29806 ;* Scan for first source. + 29807 + 29808 00003DA0 31ED xor bp,bp ; BP = switch flags accumulator + 29809 00003DA2 BE8100 mov si,81h ; SI = ptr into command line + 29810 ;mov bl,[PLUS_CHR] ; BL = special CParse delimiter = "+" + 29811 ; 23/03/2023 + 29812 00003DA5 B32B mov bl,'+' ; 2Bh + 29813 SCANFSRC: + 29814 00003DA7 BF[7B9E] mov di,ScanBuf ; DI = ptr to pathname buf + 29815 00003DAA E8FA09 call cparse ; parse first source pathname + 29816 00003DAD F6C701 test bh,1 ; switch? + 29817 00003DB0 75F5 jnz short SCANFSRC ; yes, try again + 29818 00003DB2 092E[0F9C] or [DestSwitch],bp ; include copy-wide switches on dest + 29819 + 29820 ; Set ascii copying mode if concatenating, unless /b is specified. + 29821 + 29822 ; 23/03/2023 + 29823 00003DB6 F7C50800 test bp,8 + 29824 ;test bp,SWITCHB + 29825 00003DBA 750C jnz short NOSETCASC ; /b - explicit binary copy + 29826 00003DBC 803E[089C]00 cmp byte [Concat],0 + 29827 00003DC1 7405 jz short NOSETCASC ; we're not concatenating + 29828 00003DC3 C606[DA9E]04 mov byte [ASCII],4 + 29829 ;mov byte [ASCII],SWITCHA ; set ascii copy + 29830 NOSETCASC: + 29831 00003DC8 E83004 call SOURCE_SET ; set source variables + 29832 00003DCB E84400 call FRSTSRC ; set up first source copy + 29833 00003DCE E99800 jmp FIRSTENT ; jump into the copy loop + 29834 + 29835 ; --------------------------------------------------------------------------- + 29836 + 29837 ; 24/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29838 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3AE9h + 29839 ENDCOPY: + 29840 ;* End of the road. Close destination, display # files + 29841 ; copied (meaning # destinations), and go back to main + 29842 ; transient COMMAND code. + 29843 + 29844 00003DD1 E83503 call CLOSEDEST + 29845 ENDCOPY2: + 29846 00003DD4 BA[0C90] mov dx,copied_ptr + 29847 00003DD7 8B36[209C] mov si,[FileCnt] + 29848 00003DDB 8936[A29D] mov [Copy_num],si + 29849 00003DDF E84616 call std_printf + 29850 00003DE2 E91FC3 jmp TCOMMAND ; stack could be messed up + 29851 + 29852 ; --------------------------------------------------------------------------- + 29853 + 29854 SRCNONEXIST: + 29855 ;* Source doesn't exist. If concatenating, ignore and continue. + 29856 ; Otherwise, say 'file not found' and quit. 29857 - 29858 ; 24/03/2023 - 29859 ; MSDOS 3.3 - 29860 ;mov dx,SRCBUF - 29861 ;mov [STRING_PTR_1],dx - 29862 ;mov dx,STRINGBUF1PTR - 29863 ;call STD_PRINTF - 29864 ;mov dx,FNOTFOUNDPTR - 29865 ;jmp COPYERR - 29866 - 29867 ; 24/*03/2023 - 29868 ; MSDOS 6.0 - 29869 ; Set up error message. - 29870 00003DEC C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 - 29871 ; extended error msg - 29872 00003DF1 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block - 29873 00003DF4 C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 - 29874 ; 'file not found' msg# - 29875 00003DFA C706[A09D][219E] mov word [string_ptr_2],SrcBuf - 29876 ; point at bad pathname - 29877 00003E00 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 - 29878 ; 1 substitution - 29879 00003E05 E9BB06 jmp COPYERR ; print msg and clean up - 29880 - 29881 ; --------------------------------------------------------------------------- - 29882 - 29883 SOURCEPROC: - 29884 - 29885 ;* Preparatory processing for each source file. - 29886 ; Called at FrstSrc for first source file. + 29858 00003DE5 803E[089C]00 cmp byte [Concat],0 + 29859 00003DEA 7546 jne short NEXTSRC ; concatenating - go on to next source + 29860 + 29861 ; 24/03/2023 + 29862 ; MSDOS 3.3 + 29863 ;mov dx,SRCBUF + 29864 ;mov [STRING_PTR_1],dx + 29865 ;mov dx,STRINGBUF1PTR + 29866 ;call STD_PRINTF + 29867 ;mov dx,FNOTFOUNDPTR + 29868 ;jmp COPYERR + 29869 + 29870 ; 24/*03/2023 + 29871 ; MSDOS 6.0 + 29872 ; Set up error message. + 29873 00003DEC C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 + 29874 ; extended error msg + 29875 00003DF1 BA[D78F] mov dx,extend_buf_ptr ; DX = ptr to msg block + 29876 00003DF4 C706[D78F]0200 mov word [extend_buf_ptr],ERROR_FILE_NOT_FOUND ; 2 + 29877 ; 'file not found' msg# + 29878 00003DFA C706[A09D][219E] mov word [string_ptr_2],SrcBuf + 29879 ; point at bad pathname + 29880 00003E00 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 + 29881 ; 1 substitution + 29882 00003E05 E9BB06 jmp COPYERR ; print msg and clean up + 29883 + 29884 ; --------------------------------------------------------------------------- + 29885 + 29886 SOURCEPROC: 29887 - 29888 00003E08 E8F003 call SOURCE_SET ; set source variables & ascii/binary - 29889 00003E0B 803E[089C]00 cmp byte [Concat],0 - 29890 00003E10 750B jne short LEAVECFLAG ; concatenating - leave CFlag alone - 29891 - 29892 ; --------------------------------------------------------------------------- - 29893 - 29894 FRSTSRC: - 29895 00003E12 31C0 xor ax,ax - 29896 00003E14 A2[139C] mov [CFLAG],al ; 'destination not created' - 29897 00003E17 A3[199C] mov [NXTADD],ax ; copy buffer ptr = 0 - 29898 00003E1A A2[149C] mov [DestClosed],al ; 'destination not closed' - 29899 - 29900 LEAVECFLAG: - 29901 00003E1D 8936[D29E] mov [SRCPT],si ; save cmd-line ptr - 29902 00003E21 BF[D79A] mov di,USERDIR1 ; DI = ptr to buf for user's - 29903 ; current dir - 29904 00003E24 BD[1C9E] mov bp,SrcVars ; BP = base of source variables - 29905 - 29906 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM - 29907 %if 1 - 29908 ;mov bx,deny_none|read_open_mode - 29909 00003E27 BB4000 mov bx,40h ; open mode for COPY ;M046 - 29910 %endif - 29911 00003E2A E8FE07 call BUILDPATH ; cd to source dir, figure - 29912 ; out stuff about source - 29913 00003E2D 8B36[1E9E] mov si,[SrcTail] ; SI = ptr to source filename - 29914 00003E31 C3 retn - 29915 - 29916 ; --------------------------------------------------------------------------- - 29917 - 29918 ; 25/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 29919 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 29920 NEXTSRC: - 29921 ;* Next source. Come here after handling each pathname. - 29922 ; We're done unless there are additional source pathnames - 29923 ; to be appended. - 29924 ; - 29925 ; Note that all files matching an ambiguous pathname - 29926 ; are processed before coming here. - 29927 - 29928 00003E32 803E[DB9E]00 cmp byte [PLUS],0 - 29929 ;jne short MORECP ; copying "+" sources - keep going - 29930 ; 26/04/2023 - 29931 ;ENDCOPYJ2: - 29932 ;jmp short ENDCOPY - 29933 00003E37 7498 je short ENDCOPY - 29934 MORECP: - 29935 00003E39 31ED xor bp,bp ; BP = switch flags accumulator - 29936 00003E3B 8B36[D29E] mov si,[SRCPT] ; SI = ptr to current pos'n in cmd line - 29937 ;mov bl,[PLUS_CHR] ; BL = special delimiter = "+" - 29938 00003E3F B32B mov bl,'+' ; 2Bh - 29939 SCANSRC: - 29940 00003E41 BF[7B9E] mov di,ScanBuf ; DI = ptr to pathname buf - 29941 00003E44 E86009 call cparse ; parse first source name - 29942 ;jb short ENDCOPYJ2 ; CR found - we're done - 29943 ; 26/04/2023 - 29944 00003E47 7288 jb short ENDCOPY - 29945 - 29946 00003E49 F6C780 test bh,80h - 29947 ;jz short ENDCOPYJ2 ; no "+" delimiter - we're done - 29948 ; 26/04/2023 - 29949 00003E4C 7483 jz short ENDCOPY - 29950 - 29951 00003E4E F6C701 test bh,1 - 29952 00003E51 75EE jnz short SCANSRC ; switch found - keep looking + 29888 ;* Preparatory processing for each source file. + 29889 ; Called at FrstSrc for first source file. + 29890 + 29891 00003E08 E8F003 call SOURCE_SET ; set source variables & ascii/binary + 29892 00003E0B 803E[089C]00 cmp byte [Concat],0 + 29893 00003E10 750B jne short LEAVECFLAG ; concatenating - leave CFlag alone + 29894 + 29895 ; --------------------------------------------------------------------------- + 29896 + 29897 FRSTSRC: + 29898 00003E12 31C0 xor ax,ax + 29899 00003E14 A2[139C] mov [CFLAG],al ; 'destination not created' + 29900 00003E17 A3[199C] mov [NXTADD],ax ; copy buffer ptr = 0 + 29901 00003E1A A2[149C] mov [DestClosed],al ; 'destination not closed' + 29902 + 29903 LEAVECFLAG: + 29904 00003E1D 8936[D29E] mov [SRCPT],si ; save cmd-line ptr + 29905 00003E21 BF[D79A] mov di,USERDIR1 ; DI = ptr to buf for user's + 29906 ; current dir + 29907 00003E24 BD[1C9E] mov bp,SrcVars ; BP = base of source variables + 29908 + 29909 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM + 29910 %if 1 + 29911 ;mov bx,deny_none|read_open_mode + 29912 00003E27 BB4000 mov bx,40h ; open mode for COPY ;M046 + 29913 %endif + 29914 00003E2A E8FE07 call BUILDPATH ; cd to source dir, figure + 29915 ; out stuff about source + 29916 00003E2D 8B36[1E9E] mov si,[SrcTail] ; SI = ptr to source filename + 29917 00003E31 C3 retn + 29918 + 29919 ; --------------------------------------------------------------------------- + 29920 + 29921 ; 25/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 29922 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 29923 NEXTSRC: + 29924 ;* Next source. Come here after handling each pathname. + 29925 ; We're done unless there are additional source pathnames + 29926 ; to be appended. + 29927 ; + 29928 ; Note that all files matching an ambiguous pathname + 29929 ; are processed before coming here. + 29930 + 29931 00003E32 803E[DB9E]00 cmp byte [PLUS],0 + 29932 ;jne short MORECP ; copying "+" sources - keep going + 29933 ; 26/04/2023 + 29934 ;ENDCOPYJ2: + 29935 ;jmp short ENDCOPY + 29936 00003E37 7498 je short ENDCOPY + 29937 MORECP: + 29938 00003E39 31ED xor bp,bp ; BP = switch flags accumulator + 29939 00003E3B 8B36[D29E] mov si,[SRCPT] ; SI = ptr to current pos'n in cmd line + 29940 ;mov bl,[PLUS_CHR] ; BL = special delimiter = "+" + 29941 00003E3F B32B mov bl,'+' ; 2Bh + 29942 SCANSRC: + 29943 00003E41 BF[7B9E] mov di,ScanBuf ; DI = ptr to pathname buf + 29944 00003E44 E86009 call cparse ; parse first source name + 29945 ;jb short ENDCOPYJ2 ; CR found - we're done + 29946 ; 26/04/2023 + 29947 00003E47 7288 jb short ENDCOPY + 29948 + 29949 00003E49 F6C780 test bh,80h + 29950 ;jz short ENDCOPYJ2 ; no "+" delimiter - we're done + 29951 ; 26/04/2023 + 29952 00003E4C 7483 jz short ENDCOPY 29953 - 29954 ; ScanBuf contains the next source pathname. - 29955 - 29956 00003E53 E8B2FF call SOURCEPROC ; prepare this source - 29957 00003E56 803E[959D]01 cmp byte [comma],1 ; was +,, found last time? - 29958 00003E5B 7507 jnz short NOSTAMP ; no - try for a file - 29959 00003E5D C606[969D]01 mov byte [plus_comma],1 ; yes - set flag - 29960 00003E62 EB81 jmp short SRCNONEXIST ; we know we won't find it - 29961 - 29962 NOSTAMP: - 29963 00003E64 C606[969D]00 mov byte [plus_comma],0 ; reset +,, flag + 29954 00003E4E F6C701 test bh,1 + 29955 00003E51 75EE jnz short SCANSRC ; switch found - keep looking + 29956 + 29957 ; ScanBuf contains the next source pathname. + 29958 + 29959 00003E53 E8B2FF call SOURCEPROC ; prepare this source + 29960 00003E56 803E[959D]01 cmp byte [comma],1 ; was +,, found last time? + 29961 00003E5B 7507 jnz short NOSTAMP ; no - try for a file + 29962 00003E5D C606[969D]01 mov byte [plus_comma],1 ; yes - set flag + 29963 00003E62 EB81 jmp short SRCNONEXIST ; we know we won't find it 29964 - 29965 ; --------------------------------------------------------------------------- - 29966 - 29967 FIRSTENT: - 29968 - 29969 ;M047 - 29970 ; The only case we need to worry about is when the source is wildcarded and - 29971 ;the destination is not. For this case, ConCat is not yet set to indicate - 29972 ;concatenation. We check for this case. - 29973 ; - 29974 ;NB: This change has been backed out and replaced by M048. This is not the - 29975 ;right place to do this check. - 29976 - 29977 ; This is where we enter the loop with the first source. - 29978 - 29979 00003E69 BF5C00 mov di,FCB ; 5Ch ; DI = ptr to FCB - 29980 00003E6C B80029 mov ax,Parse_File_Descriptor*256 ; 2900h - 29981 00003E6F CD21 int 21h ; DOS - PARSE FILENAME - 29982 ; DS:SI -> string to parse - 29983 ; ES:DI -> buffer to fill with unopened FCB - 29984 ; AL = bit mask to control parsing - 29985 00003E71 803C00 cmp byte [si],0 ; did we parse the whole thing? - 29986 00003E74 7516 jne short SRCHDONE ; no, error, simulate 'not found' - 29987 00003E76 A1[219E] mov ax,[SrcBuf] ; AX = possible "d:" - 29988 00003E79 80FC3A cmp ah,':' - 29989 00003E7C 7402 je short DRVSPEC1 ; AX = definite "d:" - 29990 00003E7E B040 mov al,'@' ; 40h ; AL = drive 'letter' for current drive - 29991 DRVSPEC1: - 29992 00003E80 0C20 or al,20h ; AL = lowercase drive letter - 29993 00003E82 2C60 sub al,60h ; AL = drive id (0=current,1=A,..) - 29994 ;mov [5Ch],al - 29995 00003E84 A25C00 mov [FCB],al ; put drive id in FCB - 29996 - 29997 ; FCB contains drive and filename to search. - 29998 - 29999 00003E87 B411 mov ah,Dir_Search_First ; 11h ; AH = 'Find First File' - 30000 00003E89 E86D01 call SEARCH - 30001 SRCHDONE: - 30002 00003E8C 9C pushf ; save flags from Search - 30003 00003E8D E893E9 call RestUDir1 ; restore users current directory - 30004 00003E90 9D popf ; restore flags from search - 30005 00003E91 7403 jz short NEXTAMBIG0 ; found the source - continue - 30006 00003E93 E94FFF jmp SRCNONEXIST ; didn't find the source - 30007 - 30008 NEXTAMBIG0: - 30009 00003E96 30C0 xor al,al - 30010 00003E98 8606[1B9C] xchg al,[FRSTSRCH] - 30011 00003E9C 08C0 or al,al - 30012 00003E9E 740B jz short NEXTAMBIG - 30013 SETNMEL: - 30014 00003EA0 B90C00 mov cx,12 - 30015 00003EA3 BF[7F9D] mov di,SDIRBUF - 30016 00003EA6 BE[399D] mov si,DIRBUF - 30017 00003EA9 F3A4 rep movsb ; save very first source name - 30018 NEXTAMBIG: - 30019 00003EAB 30C0 xor al,al - 30020 00003EAD A2[D59E] mov [NOWRITE],al ; turn off nowrite - 30021 00003EB0 8B3E[1E9E] mov di,[SrcTail] - 30022 00003EB4 BE[3A9D] mov si,DIRBUF+1 - 30023 00003EB7 E8EBEA call FCB_TO_ASCZ ; SrcBuf has complete name - 30024 ;MELDO: - 30025 ; **************************************** - 30026 ; 12/06/2023 - 30027 ; Retro DOS v4.2 COMMAND.COM - 30028 ; MSDOS 6.22 COMMAND.COM code only ! - 30029 ; (Disassembled source code by using Hex-Rays IDA disassembler) - 30030 ; **************************************** - 30031 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:41DBh - 30032 MELDO0: - 30033 00003EBA 803E[F19E]00 cmp byte [cox_y_override],0 ; /Y switch override (question) enabled ? - 30034 00003EBF 746C jz short MELDO ; no - 30035 ; ---------------------- - 30036 ; yes - 30037 00003EC1 E87506 call BUILDDEST - 30038 00003EC4 BE[219E] mov si,SrcBuf - 30039 00003EC7 BF[2399] mov di,SRCXNAME - 30040 ;mov ah,60h - 30041 00003ECA B460 mov ah,xNameTrans ; 60h - 30042 00003ECC CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING - 30043 ; DS:SI -> ASCIZ relative path string or directory name - 30044 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name - 30045 00003ECE E8C308 call COMPNAME - 30046 00003ED1 7540 jnz short MELDO1 ; different file names - 30047 00003ED3 803E[089C]00 cmp byte [Concat],0 - 30048 00003ED8 7539 jnz short MELDO1 ; concatenating - 30049 ; "File cannot be copied onto itself" - 30050 00003EDA BA[A791] mov dx,file_name_ptr - 30051 00003EDD E84815 call std_printf - 30052 00003EE0 E896EA call CRLF2 - 30053 00003EE3 BA[0390] mov dx,OVERWR_PTR - 30054 00003EE6 E9DA05 jmp COPYERR - 30055 ;MELDO1: - 30056 ;cmp byte [CFLAG],0 ; destination file created flag - 30057 ;jnz short MELDO ; yes, new (created) file - 30058 ; ; no, overwrite question (must be confirmed) - 30059 ;call get_answer_YNA - 30060 ;jb short MELDO2 ; answer is no - 30061 ;cmp byte [Concat],0 - 30062 ;jnz short MELDO - 30063 ;cmp byte [cox_dest_file],0 ; is there a (valid) target file ? - 30064 ;jnz short DOREAD ; yes - 30065 ;jmp short MELDO ; no, destination/target file does not exist - 30066 MELDO2: - 30067 00003EE9 803E[199E]00 cmp byte [MELCOPY],0 ; is 'Mel Hallerman copy' false ? - 30068 00003EEE 7507 jnz short MELDO3 ; no (, it is true) - 30069 00003EF0 803E[089C]00 cmp byte [Concat],0 - 30070 00003EF5 7408 jz short MELDO4 - 30071 MELDO3: - 30072 00003EF7 C606[149C]01 mov byte [DestClosed],1 - 30073 00003EFC E9D2FE jmp ENDCOPY - 30074 MELDO4: - 30075 00003EFF E8EB00 call SEARCHNEXT - 30076 00003F02 74A7 jz short NEXTAMBIG - 30077 00003F04 803E[F39E]00 cmp byte [cox_src_file],0 - 30078 ;jz short MELDO5 - 30079 ;jmp NEXTSRC - 30080 ; 18/06/2023 - 30081 00003F09 7505 jnz short NEXTSRCJ - 30082 MELDO5: - 30083 00003F0B C606[149C]01 mov byte [DestClosed],1 - 30084 NEXTSRCJ: ; 18/06/2023 - 30085 00003F10 E91FFF jmp NEXTSRC - 30086 - 30087 ; 12/06/2023 - 30088 MELDO1: - 30089 00003F13 803E[139C]00 cmp byte [CFLAG],0 ; destination file created flag - 30090 00003F18 7513 jnz short MELDO ; yes, new (created) file - 30091 ; no, overwrite question (must be confirmed) - 30092 00003F1A E81F03 call get_answer_YNA - 30093 00003F1D 72CA jb short MELDO2 ; answer is no - 30094 00003F1F 803E[089C]00 cmp byte [Concat],0 - 30095 00003F24 7507 jnz short MELDO - 30096 00003F26 803E[F29E]00 cmp byte [cox_dest_file],0 ; is there a (valid) target file ? - 30097 00003F2B 7517 jnz short DOREAD ; yes - 30098 ; 12/06/2023 - 30099 ;jmp short MELDO ; no, destination/target file does not exist - 30100 - 30101 ; **************************************** - 30102 ; 12/06/2023 - 30103 MELDO: - 30104 00003F2D 803E[089C]00 cmp byte [Concat],0 - 30105 00003F32 7507 jnz short SHOWCPNAM ; concatenating - show name - 30106 00003F34 F606[209E]02 test byte [SrcInfo],2 ; wildcard - show name - 30107 00003F39 7409 jz short DOREAD - 30108 SHOWCPNAM: - 30109 ; 25/03/2023 - 30110 ; MSDOS 3.3 - 30111 ;mov dx,SRCBUF - 30112 ;mov [STRING_PTR_2],dx - 30113 ;mov dx,STRINGBUF2PTR - 30114 ;call STD_PRINTF - 30115 ;call CRLF2 - 30116 ; 25/03/2023 - Retro DOS 4.0 COMMAND.COM - 30117 ; MSDOS 6.0 (& MSDOS 5.0 - 30118 00003F3B BA[A791] mov dx,file_name_ptr - 30119 00003F3E E8E714 call std_printf - 30120 00003F41 E835EA call CRLF2 - 30121 DOREAD: - 30122 00003F44 E8C300 call DOCOPY - 30123 00003F47 803E[089C]00 cmp byte [Concat],0 - 30124 00003F4C 750A jnz short NODCLOSE ; concatenating - don't close dest - 30125 - 30126 00003F4E E8B801 call CLOSEDEST ; close current destination - 30127 00003F51 7205 jc short NODCLOSE ; concatenating - dest not closed + 29965 NOSTAMP: + 29966 00003E64 C606[969D]00 mov byte [plus_comma],0 ; reset +,, flag + 29967 + 29968 ; --------------------------------------------------------------------------- + 29969 + 29970 FIRSTENT: + 29971 + 29972 ;M047 + 29973 ; The only case we need to worry about is when the source is wildcarded and + 29974 ;the destination is not. For this case, ConCat is not yet set to indicate + 29975 ;concatenation. We check for this case. + 29976 ; + 29977 ;NB: This change has been backed out and replaced by M048. This is not the + 29978 ;right place to do this check. + 29979 + 29980 ; This is where we enter the loop with the first source. + 29981 + 29982 00003E69 BF5C00 mov di,FCB ; 5Ch ; DI = ptr to FCB + 29983 00003E6C B80029 mov ax,Parse_File_Descriptor*256 ; 2900h + 29984 00003E6F CD21 int 21h ; DOS - PARSE FILENAME + 29985 ; DS:SI -> string to parse + 29986 ; ES:DI -> buffer to fill with unopened FCB + 29987 ; AL = bit mask to control parsing + 29988 00003E71 803C00 cmp byte [si],0 ; did we parse the whole thing? + 29989 00003E74 7516 jne short SRCHDONE ; no, error, simulate 'not found' + 29990 00003E76 A1[219E] mov ax,[SrcBuf] ; AX = possible "d:" + 29991 00003E79 80FC3A cmp ah,':' + 29992 00003E7C 7402 je short DRVSPEC1 ; AX = definite "d:" + 29993 00003E7E B040 mov al,'@' ; 40h ; AL = drive 'letter' for current drive + 29994 DRVSPEC1: + 29995 00003E80 0C20 or al,20h ; AL = lowercase drive letter + 29996 00003E82 2C60 sub al,60h ; AL = drive id (0=current,1=A,..) + 29997 ;mov [5Ch],al + 29998 00003E84 A25C00 mov [FCB],al ; put drive id in FCB + 29999 + 30000 ; FCB contains drive and filename to search. + 30001 + 30002 00003E87 B411 mov ah,Dir_Search_First ; 11h ; AH = 'Find First File' + 30003 00003E89 E86D01 call SEARCH + 30004 SRCHDONE: + 30005 00003E8C 9C pushf ; save flags from Search + 30006 00003E8D E893E9 call RestUDir1 ; restore users current directory + 30007 00003E90 9D popf ; restore flags from search + 30008 00003E91 7403 jz short NEXTAMBIG0 ; found the source - continue + 30009 00003E93 E94FFF jmp SRCNONEXIST ; didn't find the source + 30010 + 30011 NEXTAMBIG0: + 30012 00003E96 30C0 xor al,al + 30013 00003E98 8606[1B9C] xchg al,[FRSTSRCH] + 30014 00003E9C 08C0 or al,al + 30015 00003E9E 740B jz short NEXTAMBIG + 30016 SETNMEL: + 30017 00003EA0 B90C00 mov cx,12 + 30018 00003EA3 BF[7F9D] mov di,SDIRBUF + 30019 00003EA6 BE[399D] mov si,DIRBUF + 30020 00003EA9 F3A4 rep movsb ; save very first source name + 30021 NEXTAMBIG: + 30022 00003EAB 30C0 xor al,al + 30023 00003EAD A2[D59E] mov [NOWRITE],al ; turn off nowrite + 30024 00003EB0 8B3E[1E9E] mov di,[SrcTail] + 30025 00003EB4 BE[3A9D] mov si,DIRBUF+1 + 30026 00003EB7 E8EBEA call FCB_TO_ASCZ ; SrcBuf has complete name + 30027 ;MELDO: + 30028 ; **************************************** + 30029 ; 12/06/2023 + 30030 ; Retro DOS v4.2 COMMAND.COM + 30031 ; MSDOS 6.22 COMMAND.COM code only ! + 30032 ; (Disassembled source code by using Hex-Rays IDA disassembler) + 30033 ; **************************************** + 30034 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:41DBh + 30035 MELDO0: + 30036 00003EBA 803E[F19E]00 cmp byte [cox_y_override],0 ; /Y switch override (question) enabled ? + 30037 00003EBF 746C jz short MELDO ; no + 30038 ; ---------------------- + 30039 ; yes + 30040 00003EC1 E87506 call BUILDDEST + 30041 00003EC4 BE[219E] mov si,SrcBuf + 30042 00003EC7 BF[2399] mov di,SRCXNAME + 30043 ;mov ah,60h + 30044 00003ECA B460 mov ah,xNameTrans ; 60h + 30045 00003ECC CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING + 30046 ; DS:SI -> ASCIZ relative path string or directory name + 30047 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name + 30048 00003ECE E8C308 call COMPNAME + 30049 00003ED1 7540 jnz short MELDO1 ; different file names + 30050 00003ED3 803E[089C]00 cmp byte [Concat],0 + 30051 00003ED8 7539 jnz short MELDO1 ; concatenating + 30052 ; "File cannot be copied onto itself" + 30053 00003EDA BA[A791] mov dx,file_name_ptr + 30054 00003EDD E84815 call std_printf + 30055 00003EE0 E896EA call CRLF2 + 30056 00003EE3 BA[0390] mov dx,OVERWR_PTR + 30057 00003EE6 E9DA05 jmp COPYERR + 30058 ;MELDO1: + 30059 ;cmp byte [CFLAG],0 ; destination file created flag + 30060 ;jnz short MELDO ; yes, new (created) file + 30061 ; ; no, overwrite question (must be confirmed) + 30062 ;call get_answer_YNA + 30063 ;jb short MELDO2 ; answer is no + 30064 ;cmp byte [Concat],0 + 30065 ;jnz short MELDO + 30066 ;cmp byte [cox_dest_file],0 ; is there a (valid) target file ? + 30067 ;jnz short DOREAD ; yes + 30068 ;jmp short MELDO ; no, destination/target file does not exist + 30069 MELDO2: + 30070 00003EE9 803E[199E]00 cmp byte [MELCOPY],0 ; is 'Mel Hallerman copy' false ? + 30071 00003EEE 7507 jnz short MELDO3 ; no (, it is true) + 30072 00003EF0 803E[089C]00 cmp byte [Concat],0 + 30073 00003EF5 7408 jz short MELDO4 + 30074 MELDO3: + 30075 00003EF7 C606[149C]01 mov byte [DestClosed],1 + 30076 00003EFC E9D2FE jmp ENDCOPY + 30077 MELDO4: + 30078 00003EFF E8EB00 call SEARCHNEXT + 30079 00003F02 74A7 jz short NEXTAMBIG + 30080 00003F04 803E[F39E]00 cmp byte [cox_src_file],0 + 30081 ;jz short MELDO5 + 30082 ;jmp NEXTSRC + 30083 ; 18/06/2023 + 30084 00003F09 7505 jnz short NEXTSRCJ + 30085 MELDO5: + 30086 00003F0B C606[149C]01 mov byte [DestClosed],1 + 30087 NEXTSRCJ: ; 18/06/2023 + 30088 00003F10 E91FFF jmp NEXTSRC + 30089 + 30090 ; 12/06/2023 + 30091 MELDO1: + 30092 00003F13 803E[139C]00 cmp byte [CFLAG],0 ; destination file created flag + 30093 00003F18 7513 jnz short MELDO ; yes, new (created) file + 30094 ; no, overwrite question (must be confirmed) + 30095 00003F1A E81F03 call get_answer_YNA + 30096 00003F1D 72CA jb short MELDO2 ; answer is no + 30097 00003F1F 803E[089C]00 cmp byte [Concat],0 + 30098 00003F24 7507 jnz short MELDO + 30099 00003F26 803E[F29E]00 cmp byte [cox_dest_file],0 ; is there a (valid) target file ? + 30100 00003F2B 7517 jnz short DOREAD ; yes + 30101 ; 12/06/2023 + 30102 ;jmp short MELDO ; no, destination/target file does not exist + 30103 + 30104 ; **************************************** + 30105 ; 12/06/2023 + 30106 MELDO: + 30107 00003F2D 803E[089C]00 cmp byte [Concat],0 + 30108 00003F32 7507 jnz short SHOWCPNAM ; concatenating - show name + 30109 00003F34 F606[209E]02 test byte [SrcInfo],2 ; wildcard - show name + 30110 00003F39 7409 jz short DOREAD + 30111 SHOWCPNAM: + 30112 ; 25/03/2023 + 30113 ; MSDOS 3.3 + 30114 ;mov dx,SRCBUF + 30115 ;mov [STRING_PTR_2],dx + 30116 ;mov dx,STRINGBUF2PTR + 30117 ;call STD_PRINTF + 30118 ;call CRLF2 + 30119 ; 25/03/2023 - Retro DOS 4.0 COMMAND.COM + 30120 ; MSDOS 6.0 (& MSDOS 5.0 + 30121 00003F3B BA[A791] mov dx,file_name_ptr + 30122 00003F3E E8E714 call std_printf + 30123 00003F41 E835EA call CRLF2 + 30124 DOREAD: + 30125 00003F44 E8C300 call DOCOPY + 30126 00003F47 803E[089C]00 cmp byte [Concat],0 + 30127 00003F4C 750A jnz short NODCLOSE ; concatenating - don't close dest 30128 - 30129 00003F53 C606[139C]00 mov byte [CFLAG],0 ; 'destination not created' - 30130 NODCLOSE: - 30131 00003F58 803E[089C]00 cmp byte [Concat],0 - 30132 00003F5D 740A jz short NOFLUSH - 30133 - 30134 ; Concatenating - flush output between source files so LostErr - 30135 ; stuff works correctly. + 30129 00003F4E E8B801 call CLOSEDEST ; close current destination + 30130 00003F51 7205 jc short NODCLOSE ; concatenating - dest not closed + 30131 + 30132 00003F53 C606[139C]00 mov byte [CFLAG],0 ; 'destination not created' + 30133 NODCLOSE: + 30134 00003F58 803E[089C]00 cmp byte [Concat],0 + 30135 00003F5D 740A jz short NOFLUSH 30136 - 30137 ;invoke FlshFil ; MSDOS 6.0 - 30138 ; 25/03/2023 - 30139 00003F5F E81204 call FlshFil - 30140 ;call FLUSHFIL ; MSDOS 3.3 - 30141 - 30142 00003F62 F606[199E]FF test byte [MELCOPY],0FFh - 30143 ;jz short NOFLUSH - 30144 ;jmp short DOMELCOPY - 30145 ; 25/03/2023 - 30146 00003F67 750D jnz short DOMELCOPY - 30147 NOFLUSH: - 30148 00003F69 E88100 call SEARCHNEXT ; try next match - 30149 00003F6C 75A2 jnz short NEXTSRCJ ; not found - finished with - 30150 ; this source spec - 30151 00003F6E C606[149C]00 mov byte [DestClosed],0 ; 'destination not closed' - 30152 00003F73 E935FF jmp NEXTAMBIG ; do next ambig match - 30153 - 30154 DOMELCOPY: - 30155 00003F76 803E[199E]FF cmp byte [MELCOPY],0FFh - 30156 00003F7B 740D je short CONTMEL - 30157 00003F7D 8B36[D29E] mov si,[SRCPT] - 30158 00003F81 8936[1A9E] mov [MELSTART],si - 30159 00003F85 C606[199E]FF mov byte [MELCOPY],0FFh - 30160 - 30161 CONTMEL: - 30162 00003F8A 31ED xor bp,bp - 30163 00003F8C 8B36[D29E] mov si,[SRCPT] - 30164 ;mov bl,[PLUS_CHR] - 30165 ; 25/03/2023 - 30166 00003F90 B32B mov bl,'+' - 30167 SCANSRC2: - 30168 00003F92 BF[7B9E] mov di,ScanBuf - 30169 00003F95 E80F08 call cparse - 30170 00003F98 F6C780 test bh,80h - 30171 00003F9B 742F jz short NEXTMEL ; no "+" - go back to start - 30172 00003F9D F6C701 test bh,1 - 30173 00003FA0 75F0 jnz short SCANSRC2 ; switch - keep scanning - 30174 00003FA2 E863FE call SOURCEPROC - 30175 00003FA5 E87BE8 call RestUDir1 - 30176 00003FA8 BF[BA9C] mov di,DESTFCB2 - 30177 00003FAB B80029 mov ax,Parse_File_Descriptor*256 ; 2900h - 30178 00003FAE CD21 int 21h ; DOS - PARSE FILENAME - 30179 ; DS:SI -> string to parse - 30180 ; ES:DI -> buffer to fill with unopened FCB - 30181 ; AL = bit mask to control parsing - 30182 00003FB0 BB[809D] mov bx,SDIRBUF+1 - 30183 00003FB3 BE[BB9C] mov si,DESTFCB2+1 - 30184 00003FB6 8B3E[1E9E] mov di,[SrcTail] - 30185 - 30186 00003FBA E83F06 call BUILDNAME - 30187 - 30188 00003FBD 803E[089C]00 cmp byte [Concat],0 - 30189 00003FC2 7405 je short MELDOJ ; not concatenating - continue + 30137 ; Concatenating - flush output between source files so LostErr + 30138 ; stuff works correctly. + 30139 + 30140 ;invoke FlshFil ; MSDOS 6.0 + 30141 ; 25/03/2023 + 30142 00003F5F E81204 call FlshFil + 30143 ;call FLUSHFIL ; MSDOS 3.3 + 30144 + 30145 00003F62 F606[199E]FF test byte [MELCOPY],0FFh + 30146 ;jz short NOFLUSH + 30147 ;jmp short DOMELCOPY + 30148 ; 25/03/2023 + 30149 00003F67 750D jnz short DOMELCOPY + 30150 NOFLUSH: + 30151 00003F69 E88100 call SEARCHNEXT ; try next match + 30152 00003F6C 75A2 jnz short NEXTSRCJ ; not found - finished with + 30153 ; this source spec + 30154 00003F6E C606[149C]00 mov byte [DestClosed],0 ; 'destination not closed' + 30155 00003F73 E935FF jmp NEXTAMBIG ; do next ambig match + 30156 + 30157 DOMELCOPY: + 30158 00003F76 803E[199E]FF cmp byte [MELCOPY],0FFh + 30159 00003F7B 740D je short CONTMEL + 30160 00003F7D 8B36[D29E] mov si,[SRCPT] + 30161 00003F81 8936[1A9E] mov [MELSTART],si + 30162 00003F85 C606[199E]FF mov byte [MELCOPY],0FFh + 30163 + 30164 CONTMEL: + 30165 00003F8A 31ED xor bp,bp + 30166 00003F8C 8B36[D29E] mov si,[SRCPT] + 30167 ;mov bl,[PLUS_CHR] + 30168 ; 25/03/2023 + 30169 00003F90 B32B mov bl,'+' + 30170 SCANSRC2: + 30171 00003F92 BF[7B9E] mov di,ScanBuf + 30172 00003F95 E80F08 call cparse + 30173 00003F98 F6C780 test bh,80h + 30174 00003F9B 742F jz short NEXTMEL ; no "+" - go back to start + 30175 00003F9D F6C701 test bh,1 + 30176 00003FA0 75F0 jnz short SCANSRC2 ; switch - keep scanning + 30177 00003FA2 E863FE call SOURCEPROC + 30178 00003FA5 E87BE8 call RestUDir1 + 30179 00003FA8 BF[BA9C] mov di,DESTFCB2 + 30180 00003FAB B80029 mov ax,Parse_File_Descriptor*256 ; 2900h + 30181 00003FAE CD21 int 21h ; DOS - PARSE FILENAME + 30182 ; DS:SI -> string to parse + 30183 ; ES:DI -> buffer to fill with unopened FCB + 30184 ; AL = bit mask to control parsing + 30185 00003FB0 BB[809D] mov bx,SDIRBUF+1 + 30186 00003FB3 BE[BB9C] mov si,DESTFCB2+1 + 30187 00003FB6 8B3E[1E9E] mov di,[SrcTail] + 30188 + 30189 00003FBA E83F06 call BUILDNAME 30190 - 30191 ; Yes, turn off nowrite because this part of the code - 30192 ; is only reached after the first file has been dealt with. + 30191 00003FBD 803E[089C]00 cmp byte [Concat],0 + 30192 00003FC2 7405 je short MELDOJ ; not concatenating - continue 30193 - 30194 00003FC4 C606[D59E]00 mov byte [NOWRITE],0 - 30195 MELDOJ: - 30196 00003FC9 E961FF jmp MELDO - 30197 ; 18/06/2023 - 30198 ;NEXTSRCJ: - 30199 ;jmp NEXTSRC - 30200 - 30201 NEXTMEL: - 30202 00003FCC E83A01 call CLOSEDEST - 30203 00003FCF 31C0 xor ax,ax - 30204 00003FD1 A2[139C] mov [CFLAG],al - 30205 00003FD4 A3[199C] mov [NXTADD],ax - 30206 00003FD7 A2[149C] mov [SPECDRV],al - 30207 00003FDA 8B36[1A9E] mov si,[MELSTART] - 30208 00003FDE 8936[D29E] mov [SRCPT],si - 30209 00003FE2 E80800 call SEARCHNEXT - 30210 00003FE5 7403 jz short SETNMELJ - 30211 00003FE7 E9EAFD jmp ENDCOPY2 - 30212 SETNMELJ: - 30213 00003FEA E9B3FE jmp SETNMEL - 30214 - 30215 ; --------------------------------------------------------------------------- - 30216 - 30217 SEARCHNEXT: - 30218 00003FED B412 mov ah,Dir_Search_Next ; 12h - 30219 00003FEF F606[209E]02 test byte [SrcInfo],2 - 30220 00003FF4 7503 jnz short SEARCH ; do search-next if ambig - 30221 00003FF6 08E4 or ah,ah ; reset zero flag - 30222 00003FF8 C3 retn - 30223 - 30224 ; --------------------------------------------------------------------------- - 30225 - 30226 SEARCH: - 30227 00003FF9 50 push ax - 30228 00003FFA B41A mov ah,Set_DMA ; 1Ah - 30229 00003FFC BA[399D] mov dx,DIRBUF ; put result of search in dirbuf - 30230 00003FFF CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS - 30231 ; DS:DX -> disk transfer buffer - 30232 00004001 58 pop ax ; restore search first/next command - 30233 00004002 BA5C00 mov dx,FCB ; 5Ch - 30234 00004005 CD21 int 21h ; Do the search - 30235 00004007 08C0 or al,al - 30236 00004009 C3 retn - 30237 - 30238 ; --------------------------------------------------------------------------- - 30239 - 30240 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30241 - 30242 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30243 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4335h + 30194 ; Yes, turn off nowrite because this part of the code + 30195 ; is only reached after the first file has been dealt with. + 30196 + 30197 00003FC4 C606[D59E]00 mov byte [NOWRITE],0 + 30198 MELDOJ: + 30199 00003FC9 E961FF jmp MELDO + 30200 ; 18/06/2023 + 30201 ;NEXTSRCJ: + 30202 ;jmp NEXTSRC + 30203 + 30204 NEXTMEL: + 30205 00003FCC E83A01 call CLOSEDEST + 30206 00003FCF 31C0 xor ax,ax + 30207 00003FD1 A2[139C] mov [CFLAG],al + 30208 00003FD4 A3[199C] mov [NXTADD],ax + 30209 00003FD7 A2[149C] mov [SPECDRV],al + 30210 00003FDA 8B36[1A9E] mov si,[MELSTART] + 30211 00003FDE 8936[D29E] mov [SRCPT],si + 30212 00003FE2 E80800 call SEARCHNEXT + 30213 00003FE5 7403 jz short SETNMELJ + 30214 00003FE7 E9EAFD jmp ENDCOPY2 + 30215 SETNMELJ: + 30216 00003FEA E9B3FE jmp SETNMEL + 30217 + 30218 ; --------------------------------------------------------------------------- + 30219 + 30220 SEARCHNEXT: + 30221 00003FED B412 mov ah,Dir_Search_Next ; 12h + 30222 00003FEF F606[209E]02 test byte [SrcInfo],2 + 30223 00003FF4 7503 jnz short SEARCH ; do search-next if ambig + 30224 00003FF6 08E4 or ah,ah ; reset zero flag + 30225 00003FF8 C3 retn + 30226 + 30227 ; --------------------------------------------------------------------------- + 30228 + 30229 SEARCH: + 30230 00003FF9 50 push ax + 30231 00003FFA B41A mov ah,Set_DMA ; 1Ah + 30232 00003FFC BA[399D] mov dx,DIRBUF ; put result of search in dirbuf + 30233 00003FFF CD21 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS + 30234 ; DS:DX -> disk transfer buffer + 30235 00004001 58 pop ax ; restore search first/next command + 30236 00004002 BA5C00 mov dx,FCB ; 5Ch + 30237 00004005 CD21 int 21h ; Do the search + 30238 00004007 08C0 or al,al + 30239 00004009 C3 retn + 30240 + 30241 ; --------------------------------------------------------------------------- + 30242 + 30243 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 30244 - 30245 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30246 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:41E9h - 30247 DOCOPY: - 30248 0000400A BE[219E] mov si,SrcBuf ; do name translate of source - 30249 0000400D BF[2399] mov di,SRCXNAME ; save for name comparison - 30250 00004010 B460 mov ah,xNameTrans ; 60h - 30251 ;mov ah,60h - 30252 00004012 CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING - 30253 ; DS:SI -> ASCIZ relative path string or directory name - 30254 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name - 30255 00004014 C606[069C]00 mov byte [RDEOF],0 ; no EOF yet - 30256 - 30257 ; MSDOS 6.0 - 30258 ;mov ax,ExtOpen shl 8 ; open the file - 30259 ; 26/03/2023 - 30260 00004019 B8006C mov ax,6C00h - 30261 ;M046 - 30262 ; For reads, the sharing mode should be deny none so that any process can - 30263 ;open this file again in any other sharing mode. This is mainly to allow - 30264 ;multiple command.com's to access the same file without getting sharing - 30265 ;violations - 30266 ; - 30267 ;mov bx,deny_none|read_open_mode - 30268 0000401C BB4000 mov bx,40h ; open mode for COPY ;M046 - 30269 0000401F 31C9 xor cx,cx ; no special files - 30270 ;mov dx,read_open_flag ; set up open flags - 30271 00004021 BA0101 mov dx,101h - 30272 00004024 CD21 int 21h - 30273 ; 26/03/2023 - 30274 00004026 7230 jc short Error_On_Source - 30275 ;jnc short OPENOK - 30276 - 30277 ; Bogosity: IBM wants us to issue Access Denied in this case. - 30278 ; They asked for it... + 30245 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30246 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4335h + 30247 + 30248 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30249 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:41E9h + 30250 DOCOPY: + 30251 0000400A BE[219E] mov si,SrcBuf ; do name translate of source + 30252 0000400D BF[2399] mov di,SRCXNAME ; save for name comparison + 30253 00004010 B460 mov ah,xNameTrans ; 60h + 30254 ;mov ah,60h + 30255 00004012 CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING + 30256 ; DS:SI -> ASCIZ relative path string or directory name + 30257 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name + 30258 00004014 C606[069C]00 mov byte [RDEOF],0 ; no EOF yet + 30259 + 30260 ; MSDOS 6.0 + 30261 ;mov ax,ExtOpen shl 8 ; open the file + 30262 ; 26/03/2023 + 30263 00004019 B8006C mov ax,6C00h + 30264 ;M046 + 30265 ; For reads, the sharing mode should be deny none so that any process can + 30266 ;open this file again in any other sharing mode. This is mainly to allow + 30267 ;multiple command.com's to access the same file without getting sharing + 30268 ;violations + 30269 ; + 30270 ;mov bx,deny_none|read_open_mode + 30271 0000401C BB4000 mov bx,40h ; open mode for COPY ;M046 + 30272 0000401F 31C9 xor cx,cx ; no special files + 30273 ;mov dx,read_open_flag ; set up open flags + 30274 00004021 BA0101 mov dx,101h + 30275 00004024 CD21 int 21h + 30276 ; 26/03/2023 + 30277 00004026 7230 jc short Error_On_Source + 30278 ;jnc short OPENOK 30279 - 30280 ;jmp short Error_On_Source ;AC022; clean up and exit - 30281 - 30282 ; 26/03/2023 - 30283 ; MSDOS 3.3 - 30284 ;mov dx,SRCBUF - 30285 ;mov ax,OPEN*256 ; 3D00h - 30286 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 30287 ; ; DS:DX -> ASCIZ filename - 30288 ; ; AL = access mode - 30289 ; ; 0 - read - 30290 ;jnc short OPENOK - 30291 ;call GET_EXT_ERR_NUMBER - 30292 ;pushf - 30293 ;cmp ax,65 - 30294 ;jnz short DOCOPY_ERR - 30295 ;mov dx,ACCDENPTR - 30296 ;call STD_PRINTF - 30297 ;DOCOPY_ERR: - 30298 ;popf - 30299 ;retn - 30300 - 30301 ; 26/03/2023 - 30302 ; MSDOS 3.3 (& MSDOS 6.0) - 30303 OPENOK: - 30304 00004028 89C3 mov bx,ax - 30305 0000402A 891E[789E] mov [SRCHAND],bx ; save handle - 30306 0000402E B80057 mov ax,File_Times*256 ; 5700h - 30307 00004031 CD21 int 21h ; DOS - 2+ - GET FILE'S DATE/TIME - 30308 ; BX = file handle - 30309 - 30310 00004033 7223 jc short Error_On_Source ; MSDOS 6.0 - 30311 - 30312 00004035 8916[DD9E] mov [CPDATE],dx ; save date - 30313 00004039 890E[DF9E] mov [CPTIME],cx ; save time + 30280 ; Bogosity: IBM wants us to issue Access Denied in this case. + 30281 ; They asked for it... + 30282 + 30283 ;jmp short Error_On_Source ;AC022; clean up and exit + 30284 + 30285 ; 26/03/2023 + 30286 ; MSDOS 3.3 + 30287 ;mov dx,SRCBUF + 30288 ;mov ax,OPEN*256 ; 3D00h + 30289 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 30290 ; ; DS:DX -> ASCIZ filename + 30291 ; ; AL = access mode + 30292 ; ; 0 - read + 30293 ;jnc short OPENOK + 30294 ;call GET_EXT_ERR_NUMBER + 30295 ;pushf + 30296 ;cmp ax,65 + 30297 ;jnz short DOCOPY_ERR + 30298 ;mov dx,ACCDENPTR + 30299 ;call STD_PRINTF + 30300 ;DOCOPY_ERR: + 30301 ;popf + 30302 ;retn + 30303 + 30304 ; 26/03/2023 + 30305 ; MSDOS 3.3 (& MSDOS 6.0) + 30306 OPENOK: + 30307 00004028 89C3 mov bx,ax + 30308 0000402A 891E[789E] mov [SRCHAND],bx ; save handle + 30309 0000402E B80057 mov ax,File_Times*256 ; 5700h + 30310 00004031 CD21 int 21h ; DOS - 2+ - GET FILE'S DATE/TIME + 30311 ; BX = file handle + 30312 + 30313 00004033 7223 jc short Error_On_Source ; MSDOS 6.0 30314 - 30315 ; MSDOS 6.0 - 30316 ;jmp short No_Copy_Xa ; (xa copy code removed) - 30317 ; 26/04/2023 - 30318 No_Copy_Xa: - 30319 ; 26/03/2023 - 30320 ;mov bx,[SRCHAND] ;AN022; get handle back - 30321 - 30322 ; MSDOS 3.3 (& MSDOS 6.0) - 30323 0000403D B80044 mov ax,(IOCTL<<8) ; 4400h - 30324 00004040 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 30325 ; BX = file or device handle - 30326 ;and dl,devid_ISDEV ; 80h - 30327 ; 18/04/2023 - 30328 00004042 80E280 and dl,80h ; devid_ISDEV - 30329 00004045 8816[7A9E] mov [SRCISDEV],dl ; set source info - 30330 00004049 7436 jz short COPYLP ; source not a device - 30331 0000404B 803E[D69E]00 cmp byte [BINARY],0 - 30332 00004050 742F je short COPYLP ; ascii device ok - 30333 00004052 BA[6091] mov dx,INBDEV_PTR ; cannot do binary input - 30334 00004055 E96B04 jmp COPYERR - 30335 - 30336 Error_On_Source: ;AN022; we have a BAD error - 30337 00004058 E8E0DF call Set_Ext_Error_Msg ;AN022; set up the error message - 30338 0000405B C706[A09D][219E] mov word [string_ptr_2],SrcBuf - 30339 ;AN022; get address of failed string - 30340 00004061 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 - 30341 ;AN022; put number of subst in control block - 30342 00004066 E8B713 call std_eprintf ;AN022; print it - 30343 ; 26/03/2023 - Retro DOS v4.0 COMMAND.COM - 30344 00004069 8B1E[789E] mov bx,[SRCHAND] - 30345 ;cmp word [SRCHAND],0 ;AN022; did we open the file? - 30346 ;je short No_Close_Src ;AN022; no - don't close - 30347 0000406D 09DB or bx,bx - 30348 0000406F 7403 jz short No_Close_Src - 30349 ;call CLOSESRC ;AN022; clean up - 30350 ; 26/03/2023 - 30351 00004071 E89000 call CLOSESRC2 ; bx = [SRCHAND] - 30352 No_Close_Src: ;AN022; - 30353 00004074 803E[139C]00 cmp byte [CFLAG],0 ;AN022; was destination created? - 30354 00004079 7403 je short EndCopyJ3 ;AN022; no - just cleanup and exit - 30355 0000407B E953FD jmp ENDCOPY ;AN022; clean up concatenation and exit - 30356 EndCopyJ3: ;AN022; - 30357 0000407E E953FD jmp ENDCOPY2 ;AN022; - 30358 - 30359 ; 26/04/2023 - 30360 ;No_Copy_Xa: - 30361 ; ; 26/03/2023 - 30362 ; ;mov bx,[SRCHAND] ;AN022; get handle back - 30363 ; - 30364 ; ; MSDOS 3.3 (& MSDOS 6.0) - 30365 ; mov ax,(IOCTL<<8) ; 4400h - 30366 ; int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 30367 ; ; BX = file or device handle - 30368 ; ;and dl,devid_ISDEV ; 80h - 30369 ; ; 18/04/2023 - 30370 ; and dl,80h ; devid_ISDEV - 30371 ; mov [SRCISDEV],dl ; set source info - 30372 ; jz short COPYLP ; source not a device - 30373 ; cmp byte [BINARY],0 - 30374 ; je short COPYLP ; ascii device ok - 30375 ; mov dx,INBDEV_PTR ; cannot do binary input - 30376 ; jmp COPYERR - 30377 - 30378 COPYLP: - 30379 ; 26/03/2023 - 30380 00004081 8B1E[789E] mov bx,[SRCHAND] ; ? ; 26/03/2023 - 30381 00004085 8B0E[159C] mov cx,[BYTCNT] - 30382 00004089 8B16[199C] mov dx,[NXTADD] - 30383 0000408D 29D1 sub cx,dx ; compute available space - 30384 0000408F 750E jnz short GOTROOM - 30385 00004091 E8E002 call FlshFil ; MSDOS 6.0 - 30386 ;call FLUSHFIL ; MSDOS 3.3 - 30387 00004094 803E[D99E]00 cmp byte [TERMREAD],0 - 30388 00004099 7565 jne short CLOSESRC ; give up - 30389 0000409B 8B0E[159C] mov cx,[BYTCNT] - 30390 GOTROOM: - 30391 0000409F 1E push ds - 30392 000040A0 8E1E[F79B] mov ds,[TPA] - 30393 000040A4 B43F mov ah,READ ; 3Fh - 30394 000040A6 CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE - 30395 ; BX = file handle,CX = number of bytes to read - 30396 ; DS:DX -> buffer - 30397 000040A8 1F pop ds - 30398 ;jc short CLOSESRC ; MSDOS 3.3 - 30399 ; 26/03/2023 - 30400 000040A9 72AD jc short Error_On_Source ; MSDOS 6.0 - 30401 000040AB 89C1 mov cx,ax ; get count - 30402 000040AD E351 jcxz CLOSESRC ; no more to read - 30403 000040AF 803E[7A9E]00 cmp byte [SRCISDEV],0 - 30404 000040B4 7507 jne short NOTESTA ; is a device, ascii mode - 30405 000040B6 803E[DA9E]00 cmp byte [ASCII],0 - 30406 000040BB 741B je short BINREAD - 30407 NOTESTA: - 30408 000040BD 89CA mov dx,cx - 30409 000040BF 8B3E[199C] mov di,[NXTADD] - 30410 000040C3 B01A mov al,1Ah - 30411 000040C5 06 push es - 30412 000040C6 8E06[F79B] mov es,[TPA] ; scan for EOF - 30413 000040CA F2AE repne scasb - 30414 000040CC 07 pop es - 30415 000040CD 7505 jnz short USEALL - 30416 000040CF FE06[069C] inc byte [RDEOF] - 30417 000040D3 41 inc cx - 30418 USEALL: - 30419 000040D4 29CA sub dx,cx - 30420 000040D6 89D1 mov cx,dx - 30421 BINREAD: - 30422 000040D8 030E[199C] add cx,[NXTADD] - 30423 000040DC 890E[199C] mov [NXTADD],cx - 30424 000040E0 3B0E[159C] cmp cx,[BYTCNT] ; is buffer full? - 30425 000040E4 720C jb short TESTDEV ; if not, we may have found eof - 30426 ; 26/03/2023 - 30427 000040E6 E88B02 call FlshFil - 30428 ;call FLUSHFIL - 30429 000040E9 803E[D99E]00 cmp byte [TERMREAD],0 - 30430 000040EE 7510 jne short CLOSESRC ; give up - 30431 000040F0 EB8F jmp short COPYLP - 30432 TESTDEV: - 30433 000040F2 803E[7A9E]00 cmp byte [SRCISDEV],0 ; if file then EOF - 30434 000040F7 7407 je short CLOSESRC - 30435 000040F9 803E[069C]00 cmp byte [RDEOF],0 - 30436 000040FE 7481 je short COPYLP ; on device, go till ^Z - 30437 CLOSESRC: - 30438 00004100 8B1E[789E] mov bx,[SRCHAND] - 30439 CLOSESRC2: - 30440 00004104 B43E mov ah,CLOSE ; 3Eh - 30441 00004106 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 30442 ; BX = file handle - 30443 CLOSESRCDEST_RETN: - 30444 00004108 C3 retn - 30445 - 30446 ; --------------------------------------------------------------------------- - 30447 - 30448 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30449 CLOSEDEST: + 30315 00004035 8916[DD9E] mov [CPDATE],dx ; save date + 30316 00004039 890E[DF9E] mov [CPTIME],cx ; save time + 30317 + 30318 ; MSDOS 6.0 + 30319 ;jmp short No_Copy_Xa ; (xa copy code removed) + 30320 ; 26/04/2023 + 30321 No_Copy_Xa: + 30322 ; 26/03/2023 + 30323 ;mov bx,[SRCHAND] ;AN022; get handle back + 30324 + 30325 ; MSDOS 3.3 (& MSDOS 6.0) + 30326 0000403D B80044 mov ax,(IOCTL<<8) ; 4400h + 30327 00004040 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 30328 ; BX = file or device handle + 30329 ;and dl,devid_ISDEV ; 80h + 30330 ; 18/04/2023 + 30331 00004042 80E280 and dl,80h ; devid_ISDEV + 30332 00004045 8816[7A9E] mov [SRCISDEV],dl ; set source info + 30333 00004049 7436 jz short COPYLP ; source not a device + 30334 0000404B 803E[D69E]00 cmp byte [BINARY],0 + 30335 00004050 742F je short COPYLP ; ascii device ok + 30336 00004052 BA[6091] mov dx,INBDEV_PTR ; cannot do binary input + 30337 00004055 E96B04 jmp COPYERR + 30338 + 30339 Error_On_Source: ;AN022; we have a BAD error + 30340 00004058 E8E0DF call Set_Ext_Error_Msg ;AN022; set up the error message + 30341 0000405B C706[A09D][219E] mov word [string_ptr_2],SrcBuf + 30342 ;AN022; get address of failed string + 30343 00004061 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 + 30344 ;AN022; put number of subst in control block + 30345 00004066 E8B713 call std_eprintf ;AN022; print it + 30346 ; 26/03/2023 - Retro DOS v4.0 COMMAND.COM + 30347 00004069 8B1E[789E] mov bx,[SRCHAND] + 30348 ;cmp word [SRCHAND],0 ;AN022; did we open the file? + 30349 ;je short No_Close_Src ;AN022; no - don't close + 30350 0000406D 09DB or bx,bx + 30351 0000406F 7403 jz short No_Close_Src + 30352 ;call CLOSESRC ;AN022; clean up + 30353 ; 26/03/2023 + 30354 00004071 E89000 call CLOSESRC2 ; bx = [SRCHAND] + 30355 No_Close_Src: ;AN022; + 30356 00004074 803E[139C]00 cmp byte [CFLAG],0 ;AN022; was destination created? + 30357 00004079 7403 je short EndCopyJ3 ;AN022; no - just cleanup and exit + 30358 0000407B E953FD jmp ENDCOPY ;AN022; clean up concatenation and exit + 30359 EndCopyJ3: ;AN022; + 30360 0000407E E953FD jmp ENDCOPY2 ;AN022; + 30361 + 30362 ; 26/04/2023 + 30363 ;No_Copy_Xa: + 30364 ; ; 26/03/2023 + 30365 ; ;mov bx,[SRCHAND] ;AN022; get handle back + 30366 ; + 30367 ; ; MSDOS 3.3 (& MSDOS 6.0) + 30368 ; mov ax,(IOCTL<<8) ; 4400h + 30369 ; int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 30370 ; ; BX = file or device handle + 30371 ; ;and dl,devid_ISDEV ; 80h + 30372 ; ; 18/04/2023 + 30373 ; and dl,80h ; devid_ISDEV + 30374 ; mov [SRCISDEV],dl ; set source info + 30375 ; jz short COPYLP ; source not a device + 30376 ; cmp byte [BINARY],0 + 30377 ; je short COPYLP ; ascii device ok + 30378 ; mov dx,INBDEV_PTR ; cannot do binary input + 30379 ; jmp COPYERR + 30380 + 30381 COPYLP: + 30382 ; 26/03/2023 + 30383 00004081 8B1E[789E] mov bx,[SRCHAND] ; ? ; 26/03/2023 + 30384 00004085 8B0E[159C] mov cx,[BYTCNT] + 30385 00004089 8B16[199C] mov dx,[NXTADD] + 30386 0000408D 29D1 sub cx,dx ; compute available space + 30387 0000408F 750E jnz short GOTROOM + 30388 00004091 E8E002 call FlshFil ; MSDOS 6.0 + 30389 ;call FLUSHFIL ; MSDOS 3.3 + 30390 00004094 803E[D99E]00 cmp byte [TERMREAD],0 + 30391 00004099 7565 jne short CLOSESRC ; give up + 30392 0000409B 8B0E[159C] mov cx,[BYTCNT] + 30393 GOTROOM: + 30394 0000409F 1E push ds + 30395 000040A0 8E1E[F79B] mov ds,[TPA] + 30396 000040A4 B43F mov ah,READ ; 3Fh + 30397 000040A6 CD21 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE + 30398 ; BX = file handle,CX = number of bytes to read + 30399 ; DS:DX -> buffer + 30400 000040A8 1F pop ds + 30401 ;jc short CLOSESRC ; MSDOS 3.3 + 30402 ; 26/03/2023 + 30403 000040A9 72AD jc short Error_On_Source ; MSDOS 6.0 + 30404 000040AB 89C1 mov cx,ax ; get count + 30405 000040AD E351 jcxz CLOSESRC ; no more to read + 30406 000040AF 803E[7A9E]00 cmp byte [SRCISDEV],0 + 30407 000040B4 7507 jne short NOTESTA ; is a device, ascii mode + 30408 000040B6 803E[DA9E]00 cmp byte [ASCII],0 + 30409 000040BB 741B je short BINREAD + 30410 NOTESTA: + 30411 000040BD 89CA mov dx,cx + 30412 000040BF 8B3E[199C] mov di,[NXTADD] + 30413 000040C3 B01A mov al,1Ah + 30414 000040C5 06 push es + 30415 000040C6 8E06[F79B] mov es,[TPA] ; scan for EOF + 30416 000040CA F2AE repne scasb + 30417 000040CC 07 pop es + 30418 000040CD 7505 jnz short USEALL + 30419 000040CF FE06[069C] inc byte [RDEOF] + 30420 000040D3 41 inc cx + 30421 USEALL: + 30422 000040D4 29CA sub dx,cx + 30423 000040D6 89D1 mov cx,dx + 30424 BINREAD: + 30425 000040D8 030E[199C] add cx,[NXTADD] + 30426 000040DC 890E[199C] mov [NXTADD],cx + 30427 000040E0 3B0E[159C] cmp cx,[BYTCNT] ; is buffer full? + 30428 000040E4 720C jb short TESTDEV ; if not, we may have found eof + 30429 ; 26/03/2023 + 30430 000040E6 E88B02 call FlshFil + 30431 ;call FLUSHFIL + 30432 000040E9 803E[D99E]00 cmp byte [TERMREAD],0 + 30433 000040EE 7510 jne short CLOSESRC ; give up + 30434 000040F0 EB8F jmp short COPYLP + 30435 TESTDEV: + 30436 000040F2 803E[7A9E]00 cmp byte [SRCISDEV],0 ; if file then EOF + 30437 000040F7 7407 je short CLOSESRC + 30438 000040F9 803E[069C]00 cmp byte [RDEOF],0 + 30439 000040FE 7481 je short COPYLP ; on device, go till ^Z + 30440 CLOSESRC: + 30441 00004100 8B1E[789E] mov bx,[SRCHAND] + 30442 CLOSESRC2: + 30443 00004104 B43E mov ah,CLOSE ; 3Eh + 30444 00004106 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 30445 ; BX = file handle + 30446 CLOSESRCDEST_RETN: + 30447 00004108 C3 retn + 30448 + 30449 ; --------------------------------------------------------------------------- 30450 - 30451 ; We are called to close the destination. - 30452 ; We need to note whether or not there is any internal data left - 30453 ; to be flushed out. - 30454 - 30455 00004109 803E[149C]00 cmp byte [DestClosed],0 - 30456 0000410E 75F8 jne short CLOSESRCDEST_RETN ; don't double close - 30457 00004110 A0[0F9C] mov al,[DestSwitch] - 30458 00004113 E80904 call SETASC ; check for b or a switch - 30459 00004116 742E jz short BINCLOS ; on destination - 30460 00004118 8B1E[199C] mov bx,[NXTADD] - 30461 ; - 30462 ;M048 -- TryFlush changes the state of ConCat flag. So, before we append a - 30463 ;^Z, let's always flush out. This way if the ConCat flag changes, we will - 30464 ;just return without appending a ^Z incorrectly for the first file (since we - 30465 ;are concatenating now). Also, in case it is a single file copy, we will - 30466 ;anyway write the ^Z out separately. The only drawback is that there is a - 30467 ;performance overhead on single ASCII file copies which now always involve - 30468 ;2 writes instead of 1 before. Is this really that important? - 30469 ; - 30470 ;M048; cmp bx,[BYTCNT] ; is memory full? - 30471 ;M048; jne short PutZ - 30472 - 30473 ; 26/03/2023 - 30474 ; MSDOS 3.3 - 30475 ;cmp bx,[BYTCNT] ; is memory full? - 30476 ;jne short PUTZ - 30477 - 30478 ; 26/03/2023 - 30479 0000411C E84802 call TRYFLUSH ; flush (and double-check for concat) - 30480 0000411F 7402 jz short NOCONC - 30481 CONCHNG: - 30482 00004121 F9 stc - 30483 00004122 C3 retn - 30484 - 30485 NOCONC: - 30486 00004123 31DB xor bx,bx - 30487 PUTZ: - 30488 00004125 1E push ds - 30489 00004126 8E1E[F79B] mov ds,[TPA] - 30490 0000412A C7071A00 mov word [bx],1Ah ; add EOF mark (ctrl-Z) - 30491 0000412E 1F pop ds - 30492 0000412F FF06[199C] inc word [NXTADD] ; make sure our ^z gets written - 30493 00004133 C606[D59E]00 mov byte [NOWRITE],0 - 30494 00004138 A1[D79E] mov ax,[WRITTEN] - 30495 0000413B 0306[199C] add ax,[NXTADD] - 30496 0000413F 7205 jc short BINCLOS ; > 1 - 30497 00004141 83F801 cmp ax,1 - 30498 00004144 740C je short FORGETITJ ; Written = 0 NxtAdd = 1 (the ^Z) - 30499 BINCLOS: - 30500 00004146 E81E02 call TRYFLUSH - 30501 00004149 75D6 jnz short CONCHNG - 30502 - 30503 ; 26/04/2023 - 30504 0000414B 833E[D79E]00 cmp word [WRITTEN],0 - 30505 ; 26/03/2023 - 30506 00004150 7503 jnz short NO_FORGET - 30507 FORGETITJ: - 30508 ;jz short FORGETIT ; never wrote nothing - 30509 ; 26/03/2023 - 30510 00004152 E98500 jmp FORGETIT ; 18/04/2023 - 30511 NO_FORGET: ; wrote something - 30512 00004155 8B1E[159E] mov bx,[DESTHAND] - 30513 00004159 8B0E[DF9E] mov cx,[CPTIME] - 30514 0000415D 8B16[DD9E] mov dx,[CPDATE] - 30515 00004161 803E[D49E]00 cmp byte [INEXACT],0 ; copy not exact? - 30516 00004166 7431 je short DODCLOSE ; if no, copy date & time - 30517 00004168 B42C mov ah,Get_Time ; 2Ch - 30518 0000416A CD21 int 21h ; DOS - GET CURRENT TIME - 30519 ; Return: CH = hours,CL = minutes,DH = seconds - 30520 ; DL = hundredths of seconds - 30521 0000416C D0E1 shl cl,1 - 30522 0000416E D0E1 shl cl,1 ; left justify min in cl - 30523 00004170 D1E1 shl cx,1 - 30524 00004172 D1E1 shl cx,1 - 30525 00004174 D1E1 shl cx,1 ; hours to high 5 bits, min to 5-10 - 30526 00004176 D0EE shr dh,1 ; divide seconds by 2 (now 5 bits) - 30527 00004178 08F1 or cl,dh ; and stick into low 5 bits of cx - 30528 0000417A 51 push cx ; save packed time - 30529 0000417B B42A mov ah,Get_Date ; 2Ah - 30530 0000417D CD21 int 21h ; DOS - GET CURRENT DATE - 30531 ; Return: DL = day,DH = month, CX = year - 30532 ; AL = day of the week (0=Sunday,1=Monday,etc.) - 30533 0000417F 81E9BC07 sub cx,1980 - 30534 00004183 86E9 xchg ch,cl - 30535 00004185 D1E1 shl cx,1 ; year to high 7 bits - 30536 00004187 D0E6 shl dh,1 ; month to high 3 bits - 30537 00004189 D0E6 shl dh,1 - 30538 0000418B D0E6 shl dh,1 - 30539 0000418D D0E6 shl dh,1 - 30540 0000418F D0E6 shl dh,1 ; most sig bit of month in carry - 30541 00004191 80D500 adc ch,0 ; put that bit next to year - 30542 00004194 08F2 or dl,dh ; or low three of month into day - 30543 00004196 88EE mov dh,ch ; get year and high bit of month - 30544 00004198 59 pop cx - 30545 DODCLOSE: - 30546 00004199 83FB00 cmp bx,0 - 30547 0000419C 7E36 jle short CLOSEDONE - 30548 0000419E B80157 mov ax,(File_Times<<8)|1 ; 5701h - 30549 000041A1 CD21 int 21h ; DOS - 2+ - SET FILE'S DATE/TIME - 30550 ; BX = file handle,CX = time to be set - 30551 ; DX = date to be set - 30552 ; 26/03/2023 - 30553 ; MSDOS 6.0 - 30554 000041A3 721A jc short Cleanup_Err ;AN022; handle error - 30555 - 30556 ; See if the destination has *anything* in it. - 30557 ; If not, just close and delete it. + 30451 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 30452 CLOSEDEST: + 30453 + 30454 ; We are called to close the destination. + 30455 ; We need to note whether or not there is any internal data left + 30456 ; to be flushed out. + 30457 + 30458 00004109 803E[149C]00 cmp byte [DestClosed],0 + 30459 0000410E 75F8 jne short CLOSESRCDEST_RETN ; don't double close + 30460 00004110 A0[0F9C] mov al,[DestSwitch] + 30461 00004113 E80904 call SETASC ; check for b or a switch + 30462 00004116 742E jz short BINCLOS ; on destination + 30463 00004118 8B1E[199C] mov bx,[NXTADD] + 30464 ; + 30465 ;M048 -- TryFlush changes the state of ConCat flag. So, before we append a + 30466 ;^Z, let's always flush out. This way if the ConCat flag changes, we will + 30467 ;just return without appending a ^Z incorrectly for the first file (since we + 30468 ;are concatenating now). Also, in case it is a single file copy, we will + 30469 ;anyway write the ^Z out separately. The only drawback is that there is a + 30470 ;performance overhead on single ASCII file copies which now always involve + 30471 ;2 writes instead of 1 before. Is this really that important? + 30472 ; + 30473 ;M048; cmp bx,[BYTCNT] ; is memory full? + 30474 ;M048; jne short PutZ + 30475 + 30476 ; 26/03/2023 + 30477 ; MSDOS 3.3 + 30478 ;cmp bx,[BYTCNT] ; is memory full? + 30479 ;jne short PUTZ + 30480 + 30481 ; 26/03/2023 + 30482 0000411C E84802 call TRYFLUSH ; flush (and double-check for concat) + 30483 0000411F 7402 jz short NOCONC + 30484 CONCHNG: + 30485 00004121 F9 stc + 30486 00004122 C3 retn + 30487 + 30488 NOCONC: + 30489 00004123 31DB xor bx,bx + 30490 PUTZ: + 30491 00004125 1E push ds + 30492 00004126 8E1E[F79B] mov ds,[TPA] + 30493 0000412A C7071A00 mov word [bx],1Ah ; add EOF mark (ctrl-Z) + 30494 0000412E 1F pop ds + 30495 0000412F FF06[199C] inc word [NXTADD] ; make sure our ^z gets written + 30496 00004133 C606[D59E]00 mov byte [NOWRITE],0 + 30497 00004138 A1[D79E] mov ax,[WRITTEN] + 30498 0000413B 0306[199C] add ax,[NXTADD] + 30499 0000413F 7205 jc short BINCLOS ; > 1 + 30500 00004141 83F801 cmp ax,1 + 30501 00004144 740C je short FORGETITJ ; Written = 0 NxtAdd = 1 (the ^Z) + 30502 BINCLOS: + 30503 00004146 E81E02 call TRYFLUSH + 30504 00004149 75D6 jnz short CONCHNG + 30505 + 30506 ; 26/04/2023 + 30507 0000414B 833E[D79E]00 cmp word [WRITTEN],0 + 30508 ; 26/03/2023 + 30509 00004150 7503 jnz short NO_FORGET + 30510 FORGETITJ: + 30511 ;jz short FORGETIT ; never wrote nothing + 30512 ; 26/03/2023 + 30513 00004152 E98500 jmp FORGETIT ; 18/04/2023 + 30514 NO_FORGET: ; wrote something + 30515 00004155 8B1E[159E] mov bx,[DESTHAND] + 30516 00004159 8B0E[DF9E] mov cx,[CPTIME] + 30517 0000415D 8B16[DD9E] mov dx,[CPDATE] + 30518 00004161 803E[D49E]00 cmp byte [INEXACT],0 ; copy not exact? + 30519 00004166 7431 je short DODCLOSE ; if no, copy date & time + 30520 00004168 B42C mov ah,Get_Time ; 2Ch + 30521 0000416A CD21 int 21h ; DOS - GET CURRENT TIME + 30522 ; Return: CH = hours,CL = minutes,DH = seconds + 30523 ; DL = hundredths of seconds + 30524 0000416C D0E1 shl cl,1 + 30525 0000416E D0E1 shl cl,1 ; left justify min in cl + 30526 00004170 D1E1 shl cx,1 + 30527 00004172 D1E1 shl cx,1 + 30528 00004174 D1E1 shl cx,1 ; hours to high 5 bits, min to 5-10 + 30529 00004176 D0EE shr dh,1 ; divide seconds by 2 (now 5 bits) + 30530 00004178 08F1 or cl,dh ; and stick into low 5 bits of cx + 30531 0000417A 51 push cx ; save packed time + 30532 0000417B B42A mov ah,Get_Date ; 2Ah + 30533 0000417D CD21 int 21h ; DOS - GET CURRENT DATE + 30534 ; Return: DL = day,DH = month, CX = year + 30535 ; AL = day of the week (0=Sunday,1=Monday,etc.) + 30536 0000417F 81E9BC07 sub cx,1980 + 30537 00004183 86E9 xchg ch,cl + 30538 00004185 D1E1 shl cx,1 ; year to high 7 bits + 30539 00004187 D0E6 shl dh,1 ; month to high 3 bits + 30540 00004189 D0E6 shl dh,1 + 30541 0000418B D0E6 shl dh,1 + 30542 0000418D D0E6 shl dh,1 + 30543 0000418F D0E6 shl dh,1 ; most sig bit of month in carry + 30544 00004191 80D500 adc ch,0 ; put that bit next to year + 30545 00004194 08F2 or dl,dh ; or low three of month into day + 30546 00004196 88EE mov dh,ch ; get year and high bit of month + 30547 00004198 59 pop cx + 30548 DODCLOSE: + 30549 00004199 83FB00 cmp bx,0 + 30550 0000419C 7E36 jle short CLOSEDONE + 30551 0000419E B80157 mov ax,(File_Times<<8)|1 ; 5701h + 30552 000041A1 CD21 int 21h ; DOS - 2+ - SET FILE'S DATE/TIME + 30553 ; BX = file handle,CX = time to be set + 30554 ; DX = date to be set + 30555 ; 26/03/2023 + 30556 ; MSDOS 6.0 + 30557 000041A3 721A jc short Cleanup_Err ;AN022; handle error 30558 - 30559 000041A5 B80242 mov ax,(LSEEK<<8)+2 ; 4202h ; seek to EOF - 30560 000041A8 31D2 xor dx,dx - 30561 000041AA 89D1 mov cx,dx - 30562 000041AC CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 30563 ; AL = method: offset from end of file - 30564 ; DX:AX is file size - 30565 - 30566 000041AE 09C2 or dx,ax - 30567 000041B0 9C pushf - 30568 000041B1 B80044 mov ax,(IOCTL<<8)+0 ; 4400h ; get the destination attributes - 30569 000041B4 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 30570 ; BX = file or device handle - 30571 000041B6 52 push dx ; save them away - 30572 000041B7 B43E mov ah,CLOSE ; 3Eh - 30573 000041B9 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 30574 ; BX = file handle - 30575 000041BB 5A pop dx - 30576 - 30577 ; 26/03/2023 - Retro DOS v4.0 COMMAND.COM - 30578 ; MSDOS 6.0 - 30579 000041BC 730D jnc short Close_Cont ;AN022; handle error on close - 30580 000041BE 9D popf ;AN022; get the flags back - 30581 Cleanup_Err: ;AN022; - 30582 000041BF E86100 call CleanUpErr ;AN022; attempt to delete the target - 30583 ; 26/03/2023 - 30584 ;call DestDelete ;AN022; attempt to delete the target - 30585 ;jmp short FILECLOSED - 30586 ; ;AN022; close the file - 30587 ; 26/03/2023 - 30588 DestDel_fclosed: - 30589 000041C2 E82700 call DestDelete - 30590 FILECLOSED: - 30591 000041C5 FE06[149C] inc byte [DestClosed] - 30592 RET50: - 30593 000041C9 F8 clc - 30594 000041CA C3 retn - 30595 - 30596 Close_Cont: ;AN022; no error - co - 30597 ; MSDOS 3.3 (& MSDOS 6.0) - 30598 000041CB 9D popf - 30599 000041CC 7506 jnz short CLOSEDONE - 30600 000041CE F7C28000 test dx,80h ; is the destination a device? - 30601 ;jnz short CLOSEDONE ; yes, copy succeeded - 30602 ;call DestDelete - 30603 ;jmp short FILECLOSED - 30604 ; 26/03/2023 - 30605 000041D2 74EE jz short DestDel_fclosed - 30606 CLOSEDONE: - 30607 000041D4 FF06[209C] inc word [FileCnt] - 30608 ; 26/03/2023 - 30609 000041D8 EBEB jmp short FILECLOSED - 30610 - 30611 ;FILECLOSED: - 30612 ; inc byte [DestClosed] - 30613 ;RET50: - 30614 ;clc - 30615 ;retn - 30616 - 30617 FORGETIT: - 30618 000041DA 8B1E[159E] mov bx,[DESTHAND] - 30619 000041DE E8B8FF call DODCLOSE ; close the dest - 30620 000041E1 E80800 call DestDelete - 30621 000041E4 C706[209C]0000 mov word [FileCnt],0 ; no files transferred - 30622 000041EA EBDD jmp short RET50 - 30623 - 30624 ; --------------------------------------------------------------------------- - 30625 - 30626 ; 26/03/2023 - 30627 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30628 DestDelete: - 30629 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 30630 %if 1 - 30631 000041EC 803E[099C]01 cmp byte [notzerofile],1 ; destination file size > 0 - 30632 000041F1 74D6 je short RET50 ; yes, do not delete - 30633 %endif - 30634 000041F3 BA[BE9D] mov dx,DestBuf - 30635 000041F6 B441 mov ah,Unlink ; 41h - 30636 000041F8 CD21 int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) - 30637 ; DS:DX -> ASCIZ pathname of file to delete - 30638 ; (no wildcards allowed) - 30639 000041FA C3 retn - 30640 - 30641 ; --------------------------------------------------------------------------- - 30642 - 30643 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30644 SOURCE_SET: - 30645 000041FB 56 push si - 30646 000041FC A1[F69E] mov ax,[STARTEL] - 30647 000041FF BE[7B9E] mov si,ScanBuf ; adjust to copy - 30648 00004202 29F0 sub ax,si - 30649 00004204 BF[219E] mov di,SrcBuf - 30650 00004207 01F8 add ax,di - 30651 00004209 A3[1E9E] mov [SrcTail],ax - 30652 0000420C 880E[1D9E] mov [SrcSiz],cl ; save its size - 30653 00004210 41 inc cx ; include the nul - 30654 00004211 F3A4 rep movsb ; save this source - 30655 00004213 883E[209E] mov [SrcInfo],bh ; save info about it - 30656 00004217 5E pop si - 30657 00004218 89E8 mov ax,bp ; switches so far - 30658 0000421A E80203 call SETASC ; set a,b switches accordingly - 30659 0000421D E824E9 call SWITCH ; get any more switches on this arg - 30660 ;call SETASC ; set - 30661 ;retn - 30662 ; 26/03/2023 - 30663 00004220 E9FC02 jmp SETASC - 30664 - 30665 ; =============== S U B R O U T I N E ======================================= - 30666 - 30667 ; MSDOS 6.0 - 30668 - 30669 ;**************************************************************** - 30670 ;* - 30671 ;* ROUTINE: CleanupErr - 30672 ;* - 30673 ;* FUNCTION: Issues extended error message for destination - 30674 ;* if not alreay issued + 30559 ; See if the destination has *anything* in it. + 30560 ; If not, just close and delete it. + 30561 + 30562 000041A5 B80242 mov ax,(LSEEK<<8)+2 ; 4202h ; seek to EOF + 30563 000041A8 31D2 xor dx,dx + 30564 000041AA 89D1 mov cx,dx + 30565 000041AC CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 30566 ; AL = method: offset from end of file + 30567 ; DX:AX is file size + 30568 + 30569 000041AE 09C2 or dx,ax + 30570 000041B0 9C pushf + 30571 000041B1 B80044 mov ax,(IOCTL<<8)+0 ; 4400h ; get the destination attributes + 30572 000041B4 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 30573 ; BX = file or device handle + 30574 000041B6 52 push dx ; save them away + 30575 000041B7 B43E mov ah,CLOSE ; 3Eh + 30576 000041B9 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 30577 ; BX = file handle + 30578 000041BB 5A pop dx + 30579 + 30580 ; 26/03/2023 - Retro DOS v4.0 COMMAND.COM + 30581 ; MSDOS 6.0 + 30582 000041BC 730D jnc short Close_Cont ;AN022; handle error on close + 30583 000041BE 9D popf ;AN022; get the flags back + 30584 Cleanup_Err: ;AN022; + 30585 000041BF E86100 call CleanUpErr ;AN022; attempt to delete the target + 30586 ; 26/03/2023 + 30587 ;call DestDelete ;AN022; attempt to delete the target + 30588 ;jmp short FILECLOSED + 30589 ; ;AN022; close the file + 30590 ; 26/03/2023 + 30591 DestDel_fclosed: + 30592 000041C2 E82700 call DestDelete + 30593 FILECLOSED: + 30594 000041C5 FE06[149C] inc byte [DestClosed] + 30595 RET50: + 30596 000041C9 F8 clc + 30597 000041CA C3 retn + 30598 + 30599 Close_Cont: ;AN022; no error - co + 30600 ; MSDOS 3.3 (& MSDOS 6.0) + 30601 000041CB 9D popf + 30602 000041CC 7506 jnz short CLOSEDONE + 30603 000041CE F7C28000 test dx,80h ; is the destination a device? + 30604 ;jnz short CLOSEDONE ; yes, copy succeeded + 30605 ;call DestDelete + 30606 ;jmp short FILECLOSED + 30607 ; 26/03/2023 + 30608 000041D2 74EE jz short DestDel_fclosed + 30609 CLOSEDONE: + 30610 000041D4 FF06[209C] inc word [FileCnt] + 30611 ; 26/03/2023 + 30612 000041D8 EBEB jmp short FILECLOSED + 30613 + 30614 ;FILECLOSED: + 30615 ; inc byte [DestClosed] + 30616 ;RET50: + 30617 ;clc + 30618 ;retn + 30619 + 30620 FORGETIT: + 30621 000041DA 8B1E[159E] mov bx,[DESTHAND] + 30622 000041DE E8B8FF call DODCLOSE ; close the dest + 30623 000041E1 E80800 call DestDelete + 30624 000041E4 C706[209C]0000 mov word [FileCnt],0 ; no files transferred + 30625 000041EA EBDD jmp short RET50 + 30626 + 30627 ; --------------------------------------------------------------------------- + 30628 + 30629 ; 26/03/2023 + 30630 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30631 DestDelete: + 30632 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 30633 %if 1 + 30634 000041EC 803E[099C]01 cmp byte [notzerofile],1 ; destination file size > 0 + 30635 000041F1 74D6 je short RET50 ; yes, do not delete + 30636 %endif + 30637 000041F3 BA[BE9D] mov dx,DestBuf + 30638 000041F6 B441 mov ah,Unlink ; 41h + 30639 000041F8 CD21 int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) + 30640 ; DS:DX -> ASCIZ pathname of file to delete + 30641 ; (no wildcards allowed) + 30642 000041FA C3 retn + 30643 + 30644 ; --------------------------------------------------------------------------- + 30645 + 30646 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 30647 SOURCE_SET: + 30648 000041FB 56 push si + 30649 000041FC A1[F69E] mov ax,[STARTEL] + 30650 000041FF BE[7B9E] mov si,ScanBuf ; adjust to copy + 30651 00004202 29F0 sub ax,si + 30652 00004204 BF[219E] mov di,SrcBuf + 30653 00004207 01F8 add ax,di + 30654 00004209 A3[1E9E] mov [SrcTail],ax + 30655 0000420C 880E[1D9E] mov [SrcSiz],cl ; save its size + 30656 00004210 41 inc cx ; include the nul + 30657 00004211 F3A4 rep movsb ; save this source + 30658 00004213 883E[209E] mov [SrcInfo],bh ; save info about it + 30659 00004217 5E pop si + 30660 00004218 89E8 mov ax,bp ; switches so far + 30661 0000421A E80203 call SETASC ; set a,b switches accordingly + 30662 0000421D E824E9 call SWITCH ; get any more switches on this arg + 30663 ;call SETASC ; set + 30664 ;retn + 30665 ; 26/03/2023 + 30666 00004220 E9FC02 jmp SETASC + 30667 + 30668 ; =============== S U B R O U T I N E ======================================= + 30669 + 30670 ; MSDOS 6.0 + 30671 + 30672 ;**************************************************************** + 30673 ;* + 30674 ;* ROUTINE: CleanupErr 30675 ;* - 30676 ;* INPUT: return from INT 21 - 30677 ;* - 30678 ;* OUTPUT: none - 30679 ;* - 30680 ;**************************************************************** - 30681 - 30682 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30683 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30684 ; MSDOS 6.0 (MSDOS 5.0) COMMAND.COM - 30685 CleanUpErr: ;proc near ;AN022; - 30686 - 30687 00004223 803E[339F]00 cmp byte [msg_flag],0 ;AN022; have we already issued a message? - 30688 00004228 7511 jnz short CleanupErr_Cont ;AN022; yes - don't issue duplicate error - 30689 0000422A E80EDE call Set_Ext_Error_Msg ;AN022; set up error message - 30690 0000422D C706[A09D][BE9D] mov word [string_ptr_2],DestBuf - 30691 ;AN022; get address of failed string - 30692 00004233 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 - 30693 ;AN022; put number of subst in control block - 30694 00004238 E8E511 call std_eprintf ;AN022; issue the error message - 30695 CleanupErr_Cont: ;AN022; - 30696 getansw_8: ; 12/06/2023 - 30697 0000423B C3 retn ;AN022; return to caller - 30698 - 30699 ;CleanUpErr endp ;AN022; - 30700 + 30676 ;* FUNCTION: Issues extended error message for destination + 30677 ;* if not alreay issued + 30678 ;* + 30679 ;* INPUT: return from INT 21 + 30680 ;* + 30681 ;* OUTPUT: none + 30682 ;* + 30683 ;**************************************************************** + 30684 + 30685 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 30686 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30687 ; MSDOS 6.0 (MSDOS 5.0) COMMAND.COM + 30688 CleanUpErr: ;proc near ;AN022; + 30689 + 30690 00004223 803E[339F]00 cmp byte [msg_flag],0 ;AN022; have we already issued a message? + 30691 00004228 7511 jnz short CleanupErr_Cont ;AN022; yes - don't issue duplicate error + 30692 0000422A E80EDE call Set_Ext_Error_Msg ;AN022; set up error message + 30693 0000422D C706[A09D][BE9D] mov word [string_ptr_2],DestBuf + 30694 ;AN022; get address of failed string + 30695 00004233 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 + 30696 ;AN022; put number of subst in control block + 30697 00004238 E8E511 call std_eprintf ;AN022; issue the error message + 30698 CleanupErr_Cont: ;AN022; + 30699 getansw_8: ; 12/06/2023 + 30700 0000423B C3 retn ;AN022; return to caller 30701 - 30702 ; 12/06/2023 - 30703 ; --------------------------------------------------------------------------- - 30704 ; MSDOS 6.2(2) COMMAND.COM procedure only ! - 30705 ; ----------------------------------------- - 30706 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan - 30707 ; --------------------------------------------------------------------------- - 30708 - 30709 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30710 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:456Dh + 30702 ;CleanUpErr endp ;AN022; + 30703 + 30704 + 30705 ; 12/06/2023 + 30706 ; --------------------------------------------------------------------------- + 30707 ; MSDOS 6.2(2) COMMAND.COM procedure only ! + 30708 ; ----------------------------------------- + 30709 ; Hex-Rays IDA / disassembled source code ! modified for NASM by Erdogan Tan + 30710 ; --------------------------------------------------------------------------- 30711 - 30712 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30713 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4427h + 30712 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30713 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:456Dh 30714 - 30715 get_answer_YNA: - 30716 0000423C C606[F29E]00 mov byte [cox_dest_file],0 ; clear validation flag - 30717 00004241 B80043 mov ax,4300h - 30718 00004244 BA[BE9D] mov dx,DestBuf - 30719 00004247 CD21 int 21h ; DOS - 2+ - GET FILE ATTRIBUTES - 30720 ; DS:DX -> ASCIZ file name or directory - 30721 ; name without trailing slash - 30722 ;jnc short getansw_1 - 30723 ;jmp getansw_5 - 30724 ; 12/06/2023 - 30725 00004249 F5 cmc - 30726 0000424A 73EF jnc short getansw_8 - 30727 getansw_1: - 30728 0000424C FE06[F29E] inc byte [cox_dest_file] ; valid destination file - 30729 00004250 8D36[E69E] lea si,cox_sublist_buff - 30730 00004254 C7040B00 mov word [si],11 ; sublist size, 11 bytes - 30731 00004258 C74402[BE9D] mov word [si+2],DestBuf ; sublist value (pointer) - 30732 0000425D 8C5C04 mov [si+4],ds ; sublist segment - 30733 ;mov byte [si+6],1 ; sub id (N of %N) - 30734 00004260 C6440710 mov byte [si+7],10h ; data type flags - 30735 ;mov byte [si+8],0 ; maximum length (chars) - 30736 ;mov byte [si+9],0 ; minimum length (chars) - 30737 ;mov byte [si+10],0 ; pad field character (0) - 30738 ; 12/06/2023 - 30739 00004264 31C9 xor cx,cx - 30740 00004266 894C08 mov [si+8],cx ; 0 - 30741 00004269 884C0A mov [si+10],cl ; 0 - 30742 0000426C FEC1 inc cl - 30743 0000426E 884C06 mov [si+6],cl ; 1 - 30744 - 30745 ; 12/06/2023 - 30746 ;lea si,cox_sublist_buff - 30747 00004271 B84F04 mov ax,1103 ; message number - 30748 ; 'Overwrite %1 (Yes/No/All)?' - 30749 00004274 BB0200 mov bx,2 ; std error (file handle = 2) - 30750 ; 12/06/2023 - 30751 ;mov cx,1 ; byte count - 30752 ; cx = 1 - 30753 ;mov dh,0FFh ; message class (utility) - 30754 ;xor dl,dl ; control flag = 0 - 30755 00004277 31D2 xor dx,dx - 30756 00004279 FECE dec dh ; dh = 0FFh - 30757 0000427B E87514 call SYSDISPMSG - 30758 ; 12/06/2023 - 30759 ;xor bx,bx - 30760 ; bh = 0 - 30761 getansw_2: - 30762 0000427E B8080C mov ax,0C08h - 30763 00004281 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER - 30764 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. - 30765 ;cmp al,0 - 30766 ;jz short getansw_2 - 30767 ; 12/06/2023 - 30768 00004283 20C0 and al,al - 30769 00004285 74F7 jz short getansw_2 - 30770 00004287 3C0D cmp al,0Dh - 30771 00004289 743B je short getansw_4 - 30772 0000428B 88C3 mov bl,al - 30773 0000428D 88C2 mov dl,al - 30774 0000428F B82065 mov ax,6520h - 30775 00004292 CD21 int 21h ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION - 30776 ; AL = function - - 30777 00004294 3A16[8D6D] cmp dl,[_Y_es] ; 'Y' ? - 30778 00004298 740C je short getansw_3 - 30779 0000429A 3A16[8E6D] cmp dl,[_N_o] ; 'N' ? - 30780 0000429E 7406 je short getansw_3 - 30781 000042A0 3A16[8F6D] cmp dl,[_A_ll] ; 'A' ? - 30782 000042A4 75D8 jne short getansw_2 - 30783 getansw_3: - 30784 000042A6 88DF mov bh,bl - 30785 000042A8 53 push bx - 30786 000042A9 881E[8C6D] mov [MSG_1104],bl - 30787 000042AD B440 mov ah,40h - 30788 000042AF BB0200 mov bx,2 ; std error (file handle = 2) - 30789 000042B2 B90100 mov cx,1 ; byte count - 30790 000042B5 BA[8C6D] mov dx,MSG_1104 - 30791 000042B8 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 30792 ; BX = file handle, CX = number of bytes to write, DS:DX -> buffer - 30793 000042BA B440 mov ah,40h - 30794 000042BC C606[8C6D]08 mov byte [MSG_1104],8 ; backspace (move cursor to back) - 30795 000042C1 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 30796 ; BX = file handle, CX = number of bytes to write, DS:DX -> buffer - 30797 000042C3 5B pop bx - 30798 000042C4 EBB8 jmp short getansw_2 - 30799 getansw_4: - 30800 ;cmp bh,0 - 30801 ;jz short getansw_2 - 30802 ; 12/06/2023 - 30803 000042C6 08FF or bh,bh - 30804 000042C8 74B4 jz short getansw_2 - 30805 000042CA 88FA mov dl,bh - 30806 000042CC B82065 mov ax,6520h - 30807 000042CF CD21 int 21h ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION - 30808 ; AL = function - - 30809 000042D1 52 push dx - 30810 000042D2 B82E04 mov ax,1070 ; message number - 30811 000042D5 BB0200 mov bx,2 ; std error (file handle = 2) - 30812 000042D8 31C9 xor cx,cx - 30813 ;mov dh,0FFh ; message class (utility) - 30814 ;xor dl,dl - 30815 ; 12/06/2023 - 30816 000042DA 31D2 xor dx,dx - 30817 000042DC FECE dec dh ; dh = 0FFh - 30818 000042DE E81214 call SYSDISPMSG - 30819 000042E1 5A pop dx - 30820 000042E2 3A16[8D6D] cmp dl,[_Y_es] - 30821 000042E6 740B jz short getansw_5 - 30822 000042E8 3A16[8E6D] cmp dl,[_N_o] - 30823 000042EC 7406 jz short getansw_6 - 30824 000042EE C606[F19E]00 mov byte [cox_y_override],0 - 30825 ; 12/06/2023 - 30826 ;jmp short $+2 - 30827 getansw_5: + 30715 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30716 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4427h + 30717 + 30718 get_answer_YNA: + 30719 0000423C C606[F29E]00 mov byte [cox_dest_file],0 ; clear validation flag + 30720 00004241 B80043 mov ax,4300h + 30721 00004244 BA[BE9D] mov dx,DestBuf + 30722 00004247 CD21 int 21h ; DOS - 2+ - GET FILE ATTRIBUTES + 30723 ; DS:DX -> ASCIZ file name or directory + 30724 ; name without trailing slash + 30725 ;jnc short getansw_1 + 30726 ;jmp getansw_5 + 30727 ; 12/06/2023 + 30728 00004249 F5 cmc + 30729 0000424A 73EF jnc short getansw_8 + 30730 getansw_1: + 30731 0000424C FE06[F29E] inc byte [cox_dest_file] ; valid destination file + 30732 00004250 8D36[E69E] lea si,cox_sublist_buff + 30733 00004254 C7040B00 mov word [si],11 ; sublist size, 11 bytes + 30734 00004258 C74402[BE9D] mov word [si+2],DestBuf ; sublist value (pointer) + 30735 0000425D 8C5C04 mov [si+4],ds ; sublist segment + 30736 ;mov byte [si+6],1 ; sub id (N of %N) + 30737 00004260 C6440710 mov byte [si+7],10h ; data type flags + 30738 ;mov byte [si+8],0 ; maximum length (chars) + 30739 ;mov byte [si+9],0 ; minimum length (chars) + 30740 ;mov byte [si+10],0 ; pad field character (0) + 30741 ; 12/06/2023 + 30742 00004264 31C9 xor cx,cx + 30743 00004266 894C08 mov [si+8],cx ; 0 + 30744 00004269 884C0A mov [si+10],cl ; 0 + 30745 0000426C FEC1 inc cl + 30746 0000426E 884C06 mov [si+6],cl ; 1 + 30747 + 30748 ; 12/06/2023 + 30749 ;lea si,cox_sublist_buff + 30750 00004271 B84F04 mov ax,1103 ; message number + 30751 ; 'Overwrite %1 (Yes/No/All)?' + 30752 00004274 BB0200 mov bx,2 ; std error (file handle = 2) + 30753 ; 12/06/2023 + 30754 ;mov cx,1 ; byte count + 30755 ; cx = 1 + 30756 ;mov dh,0FFh ; message class (utility) + 30757 ;xor dl,dl ; control flag = 0 + 30758 00004277 31D2 xor dx,dx + 30759 00004279 FECE dec dh ; dh = 0FFh + 30760 0000427B E87514 call SYSDISPMSG + 30761 ; 12/06/2023 + 30762 ;xor bx,bx + 30763 ; bh = 0 + 30764 getansw_2: + 30765 0000427E B8080C mov ax,0C08h + 30766 00004281 CD21 int 21h ; DOS - CLEAR KEYBOARD BUFFER + 30767 ; AL must be 01h, 06h, 07h, 08h, or 0Ah. + 30768 ;cmp al,0 + 30769 ;jz short getansw_2 + 30770 ; 12/06/2023 + 30771 00004283 20C0 and al,al + 30772 00004285 74F7 jz short getansw_2 + 30773 00004287 3C0D cmp al,0Dh + 30774 00004289 743B je short getansw_4 + 30775 0000428B 88C3 mov bl,al + 30776 0000428D 88C2 mov dl,al + 30777 0000428F B82065 mov ax,6520h + 30778 00004292 CD21 int 21h ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION + 30779 ; AL = function - + 30780 00004294 3A16[8D6D] cmp dl,[_Y_es] ; 'Y' ? + 30781 00004298 740C je short getansw_3 + 30782 0000429A 3A16[8E6D] cmp dl,[_N_o] ; 'N' ? + 30783 0000429E 7406 je short getansw_3 + 30784 000042A0 3A16[8F6D] cmp dl,[_A_ll] ; 'A' ? + 30785 000042A4 75D8 jne short getansw_2 + 30786 getansw_3: + 30787 000042A6 88DF mov bh,bl + 30788 000042A8 53 push bx + 30789 000042A9 881E[8C6D] mov [MSG_1104],bl + 30790 000042AD B440 mov ah,40h + 30791 000042AF BB0200 mov bx,2 ; std error (file handle = 2) + 30792 000042B2 B90100 mov cx,1 ; byte count + 30793 000042B5 BA[8C6D] mov dx,MSG_1104 + 30794 000042B8 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 30795 ; BX = file handle, CX = number of bytes to write, DS:DX -> buffer + 30796 000042BA B440 mov ah,40h + 30797 000042BC C606[8C6D]08 mov byte [MSG_1104],8 ; backspace (move cursor to back) + 30798 000042C1 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 30799 ; BX = file handle, CX = number of bytes to write, DS:DX -> buffer + 30800 000042C3 5B pop bx + 30801 000042C4 EBB8 jmp short getansw_2 + 30802 getansw_4: + 30803 ;cmp bh,0 + 30804 ;jz short getansw_2 + 30805 ; 12/06/2023 + 30806 000042C6 08FF or bh,bh + 30807 000042C8 74B4 jz short getansw_2 + 30808 000042CA 88FA mov dl,bh + 30809 000042CC B82065 mov ax,6520h + 30810 000042CF CD21 int 21h ; DOS - 4.x internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION + 30811 ; AL = function - + 30812 000042D1 52 push dx + 30813 000042D2 B82E04 mov ax,1070 ; message number + 30814 000042D5 BB0200 mov bx,2 ; std error (file handle = 2) + 30815 000042D8 31C9 xor cx,cx + 30816 ;mov dh,0FFh ; message class (utility) + 30817 ;xor dl,dl + 30818 ; 12/06/2023 + 30819 000042DA 31D2 xor dx,dx + 30820 000042DC FECE dec dh ; dh = 0FFh + 30821 000042DE E81214 call SYSDISPMSG + 30822 000042E1 5A pop dx + 30823 000042E2 3A16[8D6D] cmp dl,[_Y_es] + 30824 000042E6 740B jz short getansw_5 + 30825 000042E8 3A16[8E6D] cmp dl,[_N_o] + 30826 000042EC 7406 jz short getansw_6 + 30827 000042EE C606[F19E]00 mov byte [cox_y_override],0 30828 ; 12/06/2023 - 30829 ;clc - 30830 ; cf = 0 - 30831 ;jmp short getansw_7 - 30832 ; 12/06/2023 - 30833 000042F3 C3 retn - 30834 getansw_6: - 30835 gcpcmdo_2: ; 12/06/2023 - 30836 gecpcmd_3: ; 12/06/2023 - 30837 000042F4 F9 stc - 30838 getansw_7: - 30839 000042F5 C3 retn - 30840 - 30841 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30842 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:463Ah + 30829 ;jmp short $+2 + 30830 getansw_5: + 30831 ; 12/06/2023 + 30832 ;clc + 30833 ; cf = 0 + 30834 ;jmp short getansw_7 + 30835 ; 12/06/2023 + 30836 000042F3 C3 retn + 30837 getansw_6: + 30838 gcpcmdo_2: ; 12/06/2023 + 30839 gecpcmd_3: ; 12/06/2023 + 30840 000042F4 F9 stc + 30841 getansw_7: + 30842 000042F5 C3 retn 30843 - 30844 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30845 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:44F1h - 30846 init_copycmd_option: - 30847 000042F6 C606[F19E]01 mov byte [cox_y_override],1 ; suppress copy overwrite confirmation - 30848 000042FB 06 push es - 30849 000042FC 8E06[F59B] mov es,[RESSEG] - 30850 - 30851 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 30852 %if 1 - 30853 00004300 26803E[FA01]63 cmp byte [es:cox_location],'c' ; "cox" - 30854 00004306 7520 jne short icpcmd_1 - 30855 %endif - 30856 00004308 268E06[3A04] mov es,[es:EnvirSeg] - 30857 0000430D 8D36[7697] lea si,copycmd ; "COPYCMD=" - 30858 00004311 B90800 mov cx,8 - 30859 00004314 E83500 call getenv_copycmd - 30860 00004317 7216 jc short icpcmd_3 - 30861 00004319 E82000 call get_copycmd_option ; copycmd=/Y or copycmd=/-Y - 30862 0000431C 720F jc short icpcmd_2 - 30863 0000431E 47 inc di ; skip '/' - 30864 0000431F 268A05 mov al,[es:di] - 30865 00004322 24DF and al,0DFh ; convert to uppercase - 30866 00004324 3C59 cmp al,'Y' - 30867 00004326 7505 jnz short icpcmd_2 - 30868 icpcmd_1: - 30869 00004328 C606[F19E]00 mov byte [cox_y_override],0 ; clear copy overwrite question/confirmation - 30870 ; (don't suppress) - 30871 icpcmd_2: - 30872 0000432D 07 pop es - 30873 0000432E C3 retn - 30874 icpcmd_3: ; ... - 30875 0000432F 8E06[F59B] mov es,[RESSEG] - 30876 00004333 803E[FD01]00 cmp byte [cox_Y_option],0 ; default (/Y) switch option (1 = enabled) - 30877 00004338 74F3 jz short icpcmd_2 - 30878 0000433A EBEC jmp short icpcmd_1 - 30879 - 30880 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30881 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4679h + 30844 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30845 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:463Ah + 30846 + 30847 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30848 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:44F1h + 30849 init_copycmd_option: + 30850 000042F6 C606[F19E]01 mov byte [cox_y_override],1 ; suppress copy overwrite confirmation + 30851 000042FB 06 push es + 30852 000042FC 8E06[F59B] mov es,[RESSEG] + 30853 + 30854 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 30855 %if 1 + 30856 00004300 26803E[FA01]63 cmp byte [es:cox_location],'c' ; "cox" + 30857 00004306 7520 jne short icpcmd_1 + 30858 %endif + 30859 00004308 268E06[3A04] mov es,[es:EnvirSeg] + 30860 0000430D 8D36[7697] lea si,copycmd ; "COPYCMD=" + 30861 00004311 B90800 mov cx,8 + 30862 00004314 E83500 call getenv_copycmd + 30863 00004317 7216 jc short icpcmd_3 + 30864 00004319 E82000 call get_copycmd_option ; copycmd=/Y or copycmd=/-Y + 30865 0000431C 720F jc short icpcmd_2 + 30866 0000431E 47 inc di ; skip '/' + 30867 0000431F 268A05 mov al,[es:di] + 30868 00004322 24DF and al,0DFh ; convert to uppercase + 30869 00004324 3C59 cmp al,'Y' + 30870 00004326 7505 jnz short icpcmd_2 + 30871 icpcmd_1: + 30872 00004328 C606[F19E]00 mov byte [cox_y_override],0 ; clear copy overwrite question/confirmation + 30873 ; (don't suppress) + 30874 icpcmd_2: + 30875 0000432D 07 pop es + 30876 0000432E C3 retn + 30877 icpcmd_3: ; ... + 30878 0000432F 8E06[F59B] mov es,[RESSEG] + 30879 00004333 803E[FD01]00 cmp byte [cox_Y_option],0 ; default (/Y) switch option (1 = enabled) + 30880 00004338 74F3 jz short icpcmd_2 + 30881 0000433A EBEC jmp short icpcmd_1 30882 - 30883 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30884 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4538h - 30885 get_copycmd_option: - 30886 0000433C 26803D00 cmp byte [es:di],0 - 30887 00004340 74B2 jz short gcpcmdo_2 - 30888 00004342 26803D2F cmp byte [es:di],'/' - 30889 00004346 7403 jz short gcpcmdo_1 - 30890 00004348 47 inc di - 30891 00004349 EBF1 jmp short get_copycmd_option - 30892 gcpcmdo_1: - 30893 ; 12/06/2023 - 30894 ;clc - 30895 ; cf = 0 - 30896 ;jmp short gcpcmdo_3 - 30897 ; 12/06/2023 - 30898 0000434B C3 retn - 30899 ; 12/06/2023 - 30900 ;gcpcmdo_2: - 30901 ; stc - 30902 ;gcpcmdo_3: - 30903 ; retn - 30904 - 30905 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30906 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:468Dh + 30883 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30884 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4679h + 30885 + 30886 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30887 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4538h + 30888 get_copycmd_option: + 30889 0000433C 26803D00 cmp byte [es:di],0 + 30890 00004340 74B2 jz short gcpcmdo_2 + 30891 00004342 26803D2F cmp byte [es:di],'/' + 30892 00004346 7403 jz short gcpcmdo_1 + 30893 00004348 47 inc di + 30894 00004349 EBF1 jmp short get_copycmd_option + 30895 gcpcmdo_1: + 30896 ; 12/06/2023 + 30897 ;clc + 30898 ; cf = 0 + 30899 ;jmp short gcpcmdo_3 + 30900 ; 12/06/2023 + 30901 0000434B C3 retn + 30902 ; 12/06/2023 + 30903 ;gcpcmdo_2: + 30904 ; stc + 30905 ;gcpcmdo_3: + 30906 ; retn 30907 - 30908 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30909 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:454Bh - 30910 getenv_copycmd: - 30911 0000434C 31FF xor di,di - 30912 0000434E 30C0 xor al,al - 30913 gecpcmd_1: - 30914 ;cmp byte [es:di],0 - 30915 ; 12/06/2023 - 30916 00004350 263805 cmp [es:di],al ; 0 - 30917 00004353 749F jz short gecpcmd_3 - 30918 00004355 51 push cx - 30919 00004356 56 push si - 30920 00004357 F3A6 repe cmpsb - 30921 00004359 5E pop si - 30922 0000435A 59 pop cx - 30923 0000435B 7409 jz short gecpcmd_2 ; cf = 0 - 30924 0000435D 51 push cx - 30925 0000435E B90080 mov cx,32768 - 30926 00004361 F2AE repne scasb ; al = 0 - 30927 00004363 59 pop cx - 30928 00004364 EBEA jmp short gecpcmd_1 - 30929 gecpcmd_2: - 30930 ;clc - 30931 ; 12/06/2023 - 30932 ; cf = 0 - 30933 ;jmp short gecpcmd_4 + 30908 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30909 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:468Dh + 30910 + 30911 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30912 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:454Bh + 30913 getenv_copycmd: + 30914 0000434C 31FF xor di,di + 30915 0000434E 30C0 xor al,al + 30916 gecpcmd_1: + 30917 ;cmp byte [es:di],0 + 30918 ; 12/06/2023 + 30919 00004350 263805 cmp [es:di],al ; 0 + 30920 00004353 749F jz short gecpcmd_3 + 30921 00004355 51 push cx + 30922 00004356 56 push si + 30923 00004357 F3A6 repe cmpsb + 30924 00004359 5E pop si + 30925 0000435A 59 pop cx + 30926 0000435B 7409 jz short gecpcmd_2 ; cf = 0 + 30927 0000435D 51 push cx + 30928 0000435E B90080 mov cx,32768 + 30929 00004361 F2AE repne scasb ; al = 0 + 30930 00004363 59 pop cx + 30931 00004364 EBEA jmp short gecpcmd_1 + 30932 gecpcmd_2: + 30933 ;clc 30934 ; 12/06/2023 - 30935 00004366 C3 retn - 30936 ; 12/06/2023 - 30937 ;gecpcmd_3: - 30938 ; stc - 30939 ;gecpcmd_4: - 30940 ; retn - 30941 - 30942 ;============================================================================ - 30943 ; COPYPR1.ASM, MSDOS 6.0, 1991 - 30944 ;============================================================================ - 30945 ; 01/10/2018 - Retro DOS v3.0 - 30946 - 30947 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2FBBh - 30948 - 30949 ; =============== S U B R O U T I N E ======================================= - 30950 - 30951 ;*** TryFlush - flush copy buffer, double-check for concatenation - 30952 ; - 30953 ; EXIT ZR set if concatenate flag unchanged - 30954 - 30955 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30956 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3EEAh + 30935 ; cf = 0 + 30936 ;jmp short gecpcmd_4 + 30937 ; 12/06/2023 + 30938 00004366 C3 retn + 30939 ; 12/06/2023 + 30940 ;gecpcmd_3: + 30941 ; stc + 30942 ;gecpcmd_4: + 30943 ; retn + 30944 + 30945 ;============================================================================ + 30946 ; COPYPR1.ASM, MSDOS 6.0, 1991 + 30947 ;============================================================================ + 30948 ; 01/10/2018 - Retro DOS v3.0 + 30949 + 30950 ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 2FBBh + 30951 + 30952 ; =============== S U B R O U T I N E ======================================= + 30953 + 30954 ;*** TryFlush - flush copy buffer, double-check for concatenation + 30955 ; + 30956 ; EXIT ZR set if concatenate flag unchanged 30957 - 30958 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 30959 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:46ADh + 30958 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 30959 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3EEAh 30960 - 30961 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 30962 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:456Ah - 30963 TRYFLUSH: - 30964 00004367 A0[089C] mov al,[Concat] - 30965 0000436A 50 push ax - 30966 ;call FLUSHFIL - 30967 0000436B E80600 call FlshFil - 30968 0000436E 58 pop ax - 30969 0000436F 3A06[089C] cmp al,[Concat] - 30970 00004373 C3 retn - 30971 - 30972 ; =============== S U B R O U T I N E ======================================= - 30973 - 30974 ; 26/03/2023 - 30975 ; MSDOS 3.3 - 30976 ;FLUSHFIL: - 30977 ;mov al,[BINARY] - 30978 ;mov ah,[ASCII] - 30979 ;push ax - 30980 ;call FLSHFIL - 30981 ;pop ax - 30982 ;mov [ASCII],ah - 30983 ;mov [BINARY],al - 30984 ;retn - 30985 - 30986 ; =============== S U B R O U T I N E ======================================= - 30987 - 30988 ;*** Flshfil - write out any data remaining in copy buffer. - 30989 ; - 30990 ; Inputs: - 30991 ; [NXTADD] = No. of bytes to write - 30992 ; [CFLAG] <> 0 if file has been created - 30993 ; Outputs: - 30994 ; [NXTADD] = 0 - 30995 - 30996 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 30997 ; - 30998 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM - 30999 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:46BAh + 30961 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 30962 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:46ADh + 30963 + 30964 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 30965 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:456Ah + 30966 TRYFLUSH: + 30967 00004367 A0[089C] mov al,[Concat] + 30968 0000436A 50 push ax + 30969 ;call FLUSHFIL + 30970 0000436B E80600 call FlshFil + 30971 0000436E 58 pop ax + 30972 0000436F 3A06[089C] cmp al,[Concat] + 30973 00004373 C3 retn + 30974 + 30975 ; =============== S U B R O U T I N E ======================================= + 30976 + 30977 ; 26/03/2023 + 30978 ; MSDOS 3.3 + 30979 ;FLUSHFIL: + 30980 ;mov al,[BINARY] + 30981 ;mov ah,[ASCII] + 30982 ;push ax + 30983 ;call FLSHFIL + 30984 ;pop ax + 30985 ;mov [ASCII],ah + 30986 ;mov [BINARY],al + 30987 ;retn + 30988 + 30989 ; =============== S U B R O U T I N E ======================================= + 30990 + 30991 ;*** Flshfil - write out any data remaining in copy buffer. + 30992 ; + 30993 ; Inputs: + 30994 ; [NXTADD] = No. of bytes to write + 30995 ; [CFLAG] <> 0 if file has been created + 30996 ; Outputs: + 30997 ; [NXTADD] = 0 + 30998 + 30999 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM 31000 ; - 31001 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 31002 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4577h - 31003 FlshFil: - 31004 00004374 C606[D99E]00 mov byte [TERMREAD],0 - 31005 00004379 803E[139C]00 cmp byte [CFLAG],0 - 31006 0000437E 7403 jz short NotExists - 31007 00004380 E99600 jmp Exists - 31008 NotExists: - 31009 00004383 E8B301 call BUILDDEST ; find out all about the destination - 31010 00004386 E80B04 call COMPNAME ; source and dest. the same? - 31011 00004389 7519 jnz short ProcDest ; if not, go ahead - 31012 0000438B 803E[7A9E]00 cmp byte [SRCISDEV],0 - 31013 00004390 7512 jnz short ProcDest ; same name on device ok - 31014 00004392 803E[089C]00 cmp byte [Concat],0 ; concatenation? - 31015 00004397 BA[0390] mov dx,OVERWR_PTR - 31016 ;je short COPERR ; not concatenating - overwrite error - 31017 ; 26/03/2023 - 31018 0000439A 7503 jne short No_Concat_Err - 31019 0000439C E92401 jmp COPYERR - 31020 - 31021 No_Concat_Err: ; concatenating - 31022 0000439F C606[D59E]01 mov byte [NOWRITE],1 ; flag not writing (just seeking) - 31023 ProcDest: - 31024 ; MSDOS 6.0 - 31025 ;mov ax,(ExtOpen<<8) ; open the file - 31026 ; 26/03/2023 - 31027 000043A4 B8006C mov ax,6C00h - 31028 000043A7 BE[BE9D] mov si,DestBuf ; get file name - 31029 ;M046 - 31030 ; For writes, we want to deny writes by anyone else at the same time that we - 31031 ;are writing to it. For instance, on a network, 2 workstations could try - 31032 ;writing to the same file. Also, because we opened the source file with - 31033 ;DENY NONE, it is fine if the source and destination files are the same as - 31034 ;would happen when we append to an existing file. - 31035 - 31036 ; 26/03/2023 - 31037 ;mov bx,deny_write|write_open_mode - 31038 000043AA BB2100 mov bx,21h ; get open mode for copy; M046 - 31039 000043AD 31C9 xor cx,cx ; no special files - 31040 ;mov dx,write_open_flag ; set up open flags - 31041 000043AF BA0101 mov dx,101h - 31042 - 31043 000043B2 803E[D59E]00 cmp byte [NOWRITE],0 - 31044 000043B7 7503 jne short DoDestOpen ; don't actually create if nowrite set - 31045 ;mov dx,creat_open_flag ; set up create flags - 31046 000043B9 BA1201 mov dx,112h - 31047 - 31048 ; 26/03/2023 - 31049 ; MSDOS 3.3 - 31050 ;mov ax,(OPEN*256)+1 ; 3D01h ; open file, write access - 31051 ;cmp byte [NOWRITE],0 - 31052 ;jne short DODESTOPEN - 31053 ;mov ah,CREAT ; 3Ch - 31054 ;xor cx,cx - 31055 ;DODESTOPEN: - 31056 ;mov dx,DESTBUF - 31057 ;int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) - 31058 ; ; CX = attributes for file - 31059 ; ; DS:DX -> ASCIZ filename (may include drive and path) - 31060 - 31061 ; 26/03/2023 - 31062 ; ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 301Ch - 31063 ; ;mov dx,FULDIRPTR - 31064 ; ;call GET_EXT_ERR_NUMBER - 31065 ; ;jc short COPERR - 31066 ; - 31067 ; ; 01/10/2018 - 31068 ; ;jnc short DEST_OPEN_OKAY - 31069 ; - 31070 ; ;mov dx,FULDIRPTR - 31071 ; ;call GET_EXT_ERR_NUMBER - 31072 ; ;jmp short COPERR - 31073 ; - 31074 ; jc short DEST_OPEN_ERROR - 31075 - 31076 ; 26/03/2023 - 31077 DoDestOpen: - 31078 000043BC CD21 int 21h ; DOS - 4.0 - EXTENDED OPEN/CREATE - 31079 ; BL = open mode as in AL for normal open (INT 21h/AH=3Dh) - 31080 ; BH = flags - 31081 ; CX = create attribute - 31082 ; DL = action if file exists/does not exists - 31083 ; DH = 00h (reserved), DS:SI -> ASCIZ file name - 31084 - 31085 ; We assume that the error is normal. - 31086 ; TriageError will correct the DX value appropriately. - 31087 - 31088 000043BE 7311 jnc short Dest_Open_Okay - 31089 Xa_Set_Error: ;AN030; error occurred on XA - 31090 000043C0 E878DC call Set_Ext_Error_Msg ;AN030; get extended error - 31091 - 31092 ; 26/04/2023 - Retro DOS v4.0 ( 4.1) COMMAND.COM - 31093 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3F46h - 31094 Ext_Err_Set: ;AN030; - 31095 000043C3 C706[A09D][BE9D] mov word [string_ptr_2],DestBuf - 31096 ;AN000; get address of failed string - 31097 000043C9 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 - 31098 ;AN030; put number of subst in control block - 31099 CopErrJ2: ;AN030; - 31100 000043CE E9F200 jmp COPYERR ;AN030; go issue message - 31101 - 31102 ;DEST_OPEN_OKAY: - 31103 ; 26/03/2023 - 31104 Dest_Open_Okay: - 31105 000043D1 A3[159E] mov [DESTHAND],ax ; save handle - 31106 000043D4 C606[139C]01 mov byte [CFLAG],1 ; destination now exists - 31107 000043D9 89C3 mov bx,ax - 31108 000043DB B80044 mov ax,IOCTL*256 ; 4400h ; get device stuff - 31109 000043DE CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 31110 ; BX = file or device handle - 31111 - 31112 000043E0 8816[179E] mov [DESTISDEV],dl ; set dest info - 31113 ; 18/04/2023 - 31114 000043E4 F6C280 test dl,80h - 31115 ;test dl,devid_ISDEV - 31116 000043E7 7430 jz short Exists ; Dest not a device - 31117 - 31118 ; Destination is device. - 31119 - 31120 000043E9 A0[0F9C] mov al,[DestSwitch] - 31121 ; 26/03/2023 - 31122 000043EC 240C and al,0Ch - 31123 ;and al,SWITCHA+SWITCHB ; 4+8 - 31124 000043EE 7509 jnz short TestBoth - 31125 000043F0 A0[DA9E] mov al,[ASCII] ; neither set, use current setting - 31126 000043F3 0A06[D69E] or al,[BINARY] - 31127 000043F7 7416 jz short ExSetA ; neither set, default to ascii - 31128 TestBoth: - 31129 000043F9 7A1E jpe short Exists ; both are set, ignore - 31130 000043FB A808 test al,8 - 31131 ;test al,SWITCHB - 31132 000043FD 741A jz short Exists - 31133 ;mov ax,(IOCTL shl 8) or 1 - 31134 000043FF B80144 mov ax,(IOCTL<<8)|1 ; 4401h - 31135 00004402 30F6 xor dh,dh - 31136 ; 18/04/2023 - 31137 00004404 80CA20 or dl,20h - 31138 ;or dl,devid_RAW - 31139 00004407 8816[179E] mov [DESTISDEV],dl - 31140 0000440B CD21 int 21h ; DOS - 2+ - IOCTL - SET DEVICE INFORMATION - 31141 ; BX = device handle,DH = 0 - 31142 ; DL = device information to set (bits 0-7 from function 0) - 31143 0000440D EB0A jmp short Exists - 31144 - 31145 ; 26/03/2023 - 31146 ; 01/10/2018 - Retro DOS v3.0 modification - 31147 ;DEST_OPEN_ERROR: - 31148 ;mov dx,FULDIRPTR - 31149 ;call GET_EXT_ERR_NUMBER - 31150 ;COPERR: - 31151 ; 26/03/2023 - 31152 ;CopyErrj: - 31153 ;jmp short COPYERR - 31154 - 31155 ExSetA: - 31156 ; What we read in may have been in binary mode, flag zapped write OK + 31001 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM + 31002 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:46BAh + 31003 ; + 31004 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 31005 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4577h + 31006 FlshFil: + 31007 00004374 C606[D99E]00 mov byte [TERMREAD],0 + 31008 00004379 803E[139C]00 cmp byte [CFLAG],0 + 31009 0000437E 7403 jz short NotExists + 31010 00004380 E99600 jmp Exists + 31011 NotExists: + 31012 00004383 E8B301 call BUILDDEST ; find out all about the destination + 31013 00004386 E80B04 call COMPNAME ; source and dest. the same? + 31014 00004389 7519 jnz short ProcDest ; if not, go ahead + 31015 0000438B 803E[7A9E]00 cmp byte [SRCISDEV],0 + 31016 00004390 7512 jnz short ProcDest ; same name on device ok + 31017 00004392 803E[089C]00 cmp byte [Concat],0 ; concatenation? + 31018 00004397 BA[0390] mov dx,OVERWR_PTR + 31019 ;je short COPERR ; not concatenating - overwrite error + 31020 ; 26/03/2023 + 31021 0000439A 7503 jne short No_Concat_Err + 31022 0000439C E92401 jmp COPYERR + 31023 + 31024 No_Concat_Err: ; concatenating + 31025 0000439F C606[D59E]01 mov byte [NOWRITE],1 ; flag not writing (just seeking) + 31026 ProcDest: + 31027 ; MSDOS 6.0 + 31028 ;mov ax,(ExtOpen<<8) ; open the file + 31029 ; 26/03/2023 + 31030 000043A4 B8006C mov ax,6C00h + 31031 000043A7 BE[BE9D] mov si,DestBuf ; get file name + 31032 ;M046 + 31033 ; For writes, we want to deny writes by anyone else at the same time that we + 31034 ;are writing to it. For instance, on a network, 2 workstations could try + 31035 ;writing to the same file. Also, because we opened the source file with + 31036 ;DENY NONE, it is fine if the source and destination files are the same as + 31037 ;would happen when we append to an existing file. + 31038 + 31039 ; 26/03/2023 + 31040 ;mov bx,deny_write|write_open_mode + 31041 000043AA BB2100 mov bx,21h ; get open mode for copy; M046 + 31042 000043AD 31C9 xor cx,cx ; no special files + 31043 ;mov dx,write_open_flag ; set up open flags + 31044 000043AF BA0101 mov dx,101h + 31045 + 31046 000043B2 803E[D59E]00 cmp byte [NOWRITE],0 + 31047 000043B7 7503 jne short DoDestOpen ; don't actually create if nowrite set + 31048 ;mov dx,creat_open_flag ; set up create flags + 31049 000043B9 BA1201 mov dx,112h + 31050 + 31051 ; 26/03/2023 + 31052 ; MSDOS 3.3 + 31053 ;mov ax,(OPEN*256)+1 ; 3D01h ; open file, write access + 31054 ;cmp byte [NOWRITE],0 + 31055 ;jne short DODESTOPEN + 31056 ;mov ah,CREAT ; 3Ch + 31057 ;xor cx,cx + 31058 ;DODESTOPEN: + 31059 ;mov dx,DESTBUF + 31060 ;int 21h ; DOS - 2+ - CREATE A FILE WITH HANDLE (CREAT) + 31061 ; ; CX = attributes for file + 31062 ; ; DS:DX -> ASCIZ filename (may include drive and path) + 31063 + 31064 ; 26/03/2023 + 31065 ; ; MSDOS 3.3 - COMMAND.COM, transient portion/segment offset 301Ch + 31066 ; ;mov dx,FULDIRPTR + 31067 ; ;call GET_EXT_ERR_NUMBER + 31068 ; ;jc short COPERR + 31069 ; + 31070 ; ; 01/10/2018 + 31071 ; ;jnc short DEST_OPEN_OKAY + 31072 ; + 31073 ; ;mov dx,FULDIRPTR + 31074 ; ;call GET_EXT_ERR_NUMBER + 31075 ; ;jmp short COPERR + 31076 ; + 31077 ; jc short DEST_OPEN_ERROR + 31078 + 31079 ; 26/03/2023 + 31080 DoDestOpen: + 31081 000043BC CD21 int 21h ; DOS - 4.0 - EXTENDED OPEN/CREATE + 31082 ; BL = open mode as in AL for normal open (INT 21h/AH=3Dh) + 31083 ; BH = flags + 31084 ; CX = create attribute + 31085 ; DL = action if file exists/does not exists + 31086 ; DH = 00h (reserved), DS:SI -> ASCIZ file name + 31087 + 31088 ; We assume that the error is normal. + 31089 ; TriageError will correct the DX value appropriately. + 31090 + 31091 000043BE 7311 jnc short Dest_Open_Okay + 31092 Xa_Set_Error: ;AN030; error occurred on XA + 31093 000043C0 E878DC call Set_Ext_Error_Msg ;AN030; get extended error + 31094 + 31095 ; 26/04/2023 - Retro DOS v4.0 ( 4.1) COMMAND.COM + 31096 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:3F46h + 31097 Ext_Err_Set: ;AN030; + 31098 000043C3 C706[A09D][BE9D] mov word [string_ptr_2],DestBuf + 31099 ;AN000; get address of failed string + 31100 000043C9 C606[D98F]01 mov byte [extend_buf_sub],one_subst ; 1 + 31101 ;AN030; put number of subst in control block + 31102 CopErrJ2: ;AN030; + 31103 000043CE E9F200 jmp COPYERR ;AN030; go issue message + 31104 + 31105 ;DEST_OPEN_OKAY: + 31106 ; 26/03/2023 + 31107 Dest_Open_Okay: + 31108 000043D1 A3[159E] mov [DESTHAND],ax ; save handle + 31109 000043D4 C606[139C]01 mov byte [CFLAG],1 ; destination now exists + 31110 000043D9 89C3 mov bx,ax + 31111 000043DB B80044 mov ax,IOCTL*256 ; 4400h ; get device stuff + 31112 000043DE CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 31113 ; BX = file or device handle + 31114 + 31115 000043E0 8816[179E] mov [DESTISDEV],dl ; set dest info + 31116 ; 18/04/2023 + 31117 000043E4 F6C280 test dl,80h + 31118 ;test dl,devid_ISDEV + 31119 000043E7 7430 jz short Exists ; Dest not a device + 31120 + 31121 ; Destination is device. + 31122 + 31123 000043E9 A0[0F9C] mov al,[DestSwitch] + 31124 ; 26/03/2023 + 31125 000043EC 240C and al,0Ch + 31126 ;and al,SWITCHA+SWITCHB ; 4+8 + 31127 000043EE 7509 jnz short TestBoth + 31128 000043F0 A0[DA9E] mov al,[ASCII] ; neither set, use current setting + 31129 000043F3 0A06[D69E] or al,[BINARY] + 31130 000043F7 7416 jz short ExSetA ; neither set, default to ascii + 31131 TestBoth: + 31132 000043F9 7A1E jpe short Exists ; both are set, ignore + 31133 000043FB A808 test al,8 + 31134 ;test al,SWITCHB + 31135 000043FD 741A jz short Exists + 31136 ;mov ax,(IOCTL shl 8) or 1 + 31137 000043FF B80144 mov ax,(IOCTL<<8)|1 ; 4401h + 31138 00004402 30F6 xor dh,dh + 31139 ; 18/04/2023 + 31140 00004404 80CA20 or dl,20h + 31141 ;or dl,devid_RAW + 31142 00004407 8816[179E] mov [DESTISDEV],dl + 31143 0000440B CD21 int 21h ; DOS - 2+ - IOCTL - SET DEVICE INFORMATION + 31144 ; BX = device handle,DH = 0 + 31145 ; DL = device information to set (bits 0-7 from function 0) + 31146 0000440D EB0A jmp short Exists + 31147 + 31148 ; 26/03/2023 + 31149 ; 01/10/2018 - Retro DOS v3.0 modification + 31150 ;DEST_OPEN_ERROR: + 31151 ;mov dx,FULDIRPTR + 31152 ;call GET_EXT_ERR_NUMBER + 31153 ;COPERR: + 31154 ; 26/03/2023 + 31155 ;CopyErrj: + 31156 ;jmp short COPYERR 31157 - 31158 0000440F C606[DA9E]04 mov byte [ASCII],4 - 31159 ;mov byte [ASCII],SWITCHA ; set ascii mode - 31160 00004414 800E[D49E]04 or byte [INEXACT],4 - 31161 ;or byte [INEXACT],SWITCHA ; ascii -> inexact - 31162 Exists: - 31163 00004419 803E[D59E]00 cmp byte [NOWRITE],0 - 31164 0000441E 7524 jnz short NoChecking ; if nowrite don't bother with name check - 31165 00004420 803E[969D]01 cmp byte [plus_comma],1 ; don't check if just doing +,, - 31166 00004425 741D jz short NoChecking - 31167 00004427 E86A03 call COMPNAME ; source and dest. the same? - 31168 0000442A 7518 jnz short NoChecking ; if not, go ahead - 31169 0000442C 803E[7A9E]00 cmp byte [SRCISDEV],0 - 31170 00004431 7511 jne short NoChecking ; same name on device ok - 31171 - 31172 ; At this point we know in append (would have gotten overwrite error - 31173 ; on first destination create otherwise), and user trying to specify - 31174 ; destination which has been scribbled already (if dest had been named - 31175 ; first, NoWrite would be set). - 31176 - 31177 00004433 BA[0690] mov dx,LOSTERR_PTR ; tell him he's not going to get it - 31178 ;invoke Std_EprintF ;ac022; - 31179 ; 26/03/2023 - 31180 00004436 E8E70F call std_eprintf ; MSDOS 6.0 (& 5.0) - 31181 ;call STD_PRINTF ; MSDOS 3.3 - 31182 00004439 C706[199C]0000 mov word [NXTADD],0 ; set return - 31183 0000443F FE06[D99E] inc byte [TERMREAD] ; tell read to give up - 31184 Ret60: - 31185 00004443 C3 retn - 31186 - 31187 NoChecking: - 31188 00004444 8B1E[159E] mov bx,[DESTHAND] ; get handle - 31189 00004448 31C9 xor cx,cx - 31190 0000444A 870E[199C] xchg cx,[NXTADD] - 31191 0000444E E3F3 jcxz Ret60 ; if nothing to write, forget it - 31192 00004450 FF06[D79E] inc word [WRITTEN] ; flag that we wrote something - 31193 00004454 803E[D59E]00 cmp byte [NOWRITE],0 ; if nowrite set, just seek cx bytes - 31194 00004459 7514 jnz short SeekEnd - 31195 0000445B 31D2 xor dx,dx - 31196 0000445D 1E push ds - 31197 0000445E 8E1E[F79B] mov ds,[TPA] - 31198 00004462 B440 mov ah,Write ; 40h - 31199 00004464 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 31200 ; BX = file handle,CX = number of bytes to write,DS:DX -> buffer - 31201 00004466 1F pop ds - 31202 00004467 BA[EB8F] mov dx,NOSPACE_PTR - 31203 ;jc short COPERRP ; failure - 31204 ; 26/03/2023 - 31205 ; MSDOS 6.0 - 31206 0000446A 7338 jnc short NoChecking2 - 31207 0000446C E951FF jmp Xa_Set_Error - 31208 - 31209 ; 18/04/2023 - 31210 ; 26/03/2023 - 31211 SeekEnd: - 31212 0000446F 31D2 xor dx,dx - 31213 00004471 87D1 xchg dx,cx - 31214 ;mov ax,(LSEEK shl 8) or 1 - 31215 00004473 B80142 mov ax,(LSEEK<<8)|1 ; 4201h - 31216 00004476 CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) - 31217 ; AL = method: offset from present location - 31218 - 31219 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 31220 %if 1 - 31221 00004478 C606[099C]01 mov byte [notzerofile],1 ; (existing) destination file size is not zero - 31222 0000447D 85C0 test ax,ax - 31223 0000447F 7509 jnz short SeekEnd_@ - 31224 00004481 85D2 test dx,dx - 31225 00004483 7505 jnz short SeekEnd_@ - 31226 00004485 C606[099C]00 mov byte [notzerofile],0 ; (existing) destination file size is zero - 31227 SeekEnd_@: - 31228 %endif - 31229 ; 26/03/2023 - 31230 ; MSDOS 6.0 - 31231 - 31232 ; Save the file pointer in DX:AX to restore the file - 31233 ; with in case the copy should fail. + 31158 ExSetA: + 31159 ; What we read in may have been in binary mode, flag zapped write OK + 31160 + 31161 0000440F C606[DA9E]04 mov byte [ASCII],4 + 31162 ;mov byte [ASCII],SWITCHA ; set ascii mode + 31163 00004414 800E[D49E]04 or byte [INEXACT],4 + 31164 ;or byte [INEXACT],SWITCHA ; ascii -> inexact + 31165 Exists: + 31166 00004419 803E[D59E]00 cmp byte [NOWRITE],0 + 31167 0000441E 7524 jnz short NoChecking ; if nowrite don't bother with name check + 31168 00004420 803E[969D]01 cmp byte [plus_comma],1 ; don't check if just doing +,, + 31169 00004425 741D jz short NoChecking + 31170 00004427 E86A03 call COMPNAME ; source and dest. the same? + 31171 0000442A 7518 jnz short NoChecking ; if not, go ahead + 31172 0000442C 803E[7A9E]00 cmp byte [SRCISDEV],0 + 31173 00004431 7511 jne short NoChecking ; same name on device ok + 31174 + 31175 ; At this point we know in append (would have gotten overwrite error + 31176 ; on first destination create otherwise), and user trying to specify + 31177 ; destination which has been scribbled already (if dest had been named + 31178 ; first, NoWrite would be set). + 31179 + 31180 00004433 BA[0690] mov dx,LOSTERR_PTR ; tell him he's not going to get it + 31181 ;invoke Std_EprintF ;ac022; + 31182 ; 26/03/2023 + 31183 00004436 E8E70F call std_eprintf ; MSDOS 6.0 (& 5.0) + 31184 ;call STD_PRINTF ; MSDOS 3.3 + 31185 00004439 C706[199C]0000 mov word [NXTADD],0 ; set return + 31186 0000443F FE06[D99E] inc byte [TERMREAD] ; tell read to give up + 31187 Ret60: + 31188 00004443 C3 retn + 31189 + 31190 NoChecking: + 31191 00004444 8B1E[159E] mov bx,[DESTHAND] ; get handle + 31192 00004448 31C9 xor cx,cx + 31193 0000444A 870E[199C] xchg cx,[NXTADD] + 31194 0000444E E3F3 jcxz Ret60 ; if nothing to write, forget it + 31195 00004450 FF06[D79E] inc word [WRITTEN] ; flag that we wrote something + 31196 00004454 803E[D59E]00 cmp byte [NOWRITE],0 ; if nowrite set, just seek cx bytes + 31197 00004459 7514 jnz short SeekEnd + 31198 0000445B 31D2 xor dx,dx + 31199 0000445D 1E push ds + 31200 0000445E 8E1E[F79B] mov ds,[TPA] + 31201 00004462 B440 mov ah,Write ; 40h + 31202 00004464 CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 31203 ; BX = file handle,CX = number of bytes to write,DS:DX -> buffer + 31204 00004466 1F pop ds + 31205 00004467 BA[EB8F] mov dx,NOSPACE_PTR + 31206 ;jc short COPERRP ; failure + 31207 ; 26/03/2023 + 31208 ; MSDOS 6.0 + 31209 0000446A 7338 jnc short NoChecking2 + 31210 0000446C E951FF jmp Xa_Set_Error + 31211 + 31212 ; 18/04/2023 + 31213 ; 26/03/2023 + 31214 SeekEnd: + 31215 0000446F 31D2 xor dx,dx + 31216 00004471 87D1 xchg dx,cx + 31217 ;mov ax,(LSEEK shl 8) or 1 + 31218 00004473 B80142 mov ax,(LSEEK<<8)|1 ; 4201h + 31219 00004476 CD21 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) + 31220 ; AL = method: offset from present location + 31221 + 31222 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 31223 %if 1 + 31224 00004478 C606[099C]01 mov byte [notzerofile],1 ; (existing) destination file size is not zero + 31225 0000447D 85C0 test ax,ax + 31226 0000447F 7509 jnz short SeekEnd_@ + 31227 00004481 85D2 test dx,dx + 31228 00004483 7505 jnz short SeekEnd_@ + 31229 00004485 C606[099C]00 mov byte [notzerofile],0 ; (existing) destination file size is zero + 31230 SeekEnd_@: + 31231 %endif + 31232 ; 26/03/2023 + 31233 ; MSDOS 6.0 31234 - 31235 0000448A A3[E19E] mov [OFilePtr_Lo],ax - 31236 0000448D 8916[E39E] mov [OFilePtr_Hi],dx + 31235 ; Save the file pointer in DX:AX to restore the file + 31236 ; with in case the copy should fail. 31237 - 31238 ; 26/03/2023 - 31239 ; MSDOS 3.3 MSDOS 6.0 + 31238 0000448A A3[E19E] mov [OFilePtr_Lo],ax + 31239 0000448D 8916[E39E] mov [OFilePtr_Hi],dx 31240 - 31241 00004491 803E[069C]00 cmp byte [RDEOF],0 - 31242 00004496 740B jz short Retz60 + 31241 ; 26/03/2023 + 31242 ; MSDOS 3.3 MSDOS 6.0 31243 - 31244 ; ^Z has been read - we must set the file size to the current - 31245 ; file pointer location + 31244 00004491 803E[069C]00 cmp byte [RDEOF],0 + 31245 00004496 740B jz short Retz60 31246 - 31247 00004498 B440 mov ah,Write ; 40h - 31248 0000449A CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 31249 ; BX = file handle,CX = number of bytes to write,DS:DX -> buffer - 31250 - 31251 ; 26/03/2023 - 31252 ; MSDOS 6.0 - 31253 0000449C 727E jc short Xa_Set_Error_Jmp ;AC022; failure - 31254 - 31255 ; Make note that ^Z was removed, in case the - 31256 ; copy should fail and we need to restore the file. + 31247 ; ^Z has been read - we must set the file size to the current + 31248 ; file pointer location + 31249 + 31250 00004498 B440 mov ah,Write ; 40h + 31251 0000449A CD21 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 31252 ; BX = file handle,CX = number of bytes to write,DS:DX -> buffer + 31253 + 31254 ; 26/03/2023 + 31255 ; MSDOS 6.0 + 31256 0000449C 727E jc short Xa_Set_Error_Jmp ;AC022; failure 31257 - 31258 0000449E C606[E59E]1A mov byte [OCtrlZ],1Ah - 31259 Retz60: - 31260 000044A3 C3 retn - 31261 - 31262 NoChecking2: - 31263 000044A4 29C1 sub cx,ax - 31264 000044A6 749B jz short Ret60 ; wrote all supposed to - 31265 ; 18/04/2023 - 31266 000044A8 F606[179E]80 test byte [DESTISDEV],80h ; devid_ISDEV - 31267 ;test byte [DESTISDEV],devid_ISDEV ;80h - 31268 000044AD 7414 jz short COPYERR ; is a file, error - 31269 000044AF F606[179E]20 test byte [DESTISDEV],20h ; devid_RAW - 31270 ;test byte [DESTISDEV],devid_RAW ; 20h - 31271 000044B4 750A jnz short DevWrtErr ; is a raw device, error - 31272 000044B6 803E[D49E]00 cmp byte [INEXACT],0 - 31273 000044BB 7586 jnz short Ret60 ; inexact so ok - 31274 000044BD 49 dec cx - 31275 ;Retz60: - 31276 000044BE 7483 jz short Ret60 ; wrote one byte less (the ^z) - 31277 - 31278 DevWrtErr: - 31279 000044C0 BA[9391] mov dx,DEVWMES_PTR - 31280 ; 26/03/2023 - 31281 COPYERR: - 31282 ;invoke Std_EPrintF ;AC022; - 31283 000044C3 E85A0F call std_eprintf ; MSDOS 6.0 - 31284 ;call STD_PRINTF ; MSDOS 3.3 - 31285 CopErrP: - 31286 000044C6 FE06[149C] inc byte [DestClosed] - 31287 000044CA 803E[139C]00 cmp byte [CFLAG],0 - 31288 000044CF 7448 jz short EndCopyJ ; never actually got it open - 31289 000044D1 8B1E[159E] mov bx,[DESTHAND] - 31290 000044D5 83FB00 cmp bx,0 - 31291 000044D8 7E33 jle short NoClose - 31292 - 31293 ; Check to see if we should save part of the destination file. - 31294 - 31295 ; 26/03/2023 - 31296 ; MSDOS 6.0 - 31297 000044DA 8B0E[E39E] mov cx,[OFilePtr_Hi] ; CX = hi word of original file ptr - 31298 000044DE 8B16[E19E] mov dx,[OFilePtr_Lo] ; DX = lo word of original file ptr - 31299 - 31300 000044E2 89C8 mov ax,cx - 31301 000044E4 09D0 or ax,dx - 31302 000044E6 7421 jz short ceClose ; null file ptr means nothing to save - 31303 - 31304 ; Destination was also the first source. Do the best we can to - 31305 ; restore it. Truncate it back to the size we took from it (which - 31306 ; may have been due to a Ctrl-Z, so may not have included the whole - 31307 ; file). If a Ctrl-Z was originally read, put it back. - 31308 - 31309 000044E8 B80042 mov ax,(LSEEK<<8) ; 4200h - 31310 000044EB CD21 int 21h + 31258 ; Make note that ^Z was removed, in case the + 31259 ; copy should fail and we need to restore the file. + 31260 + 31261 0000449E C606[E59E]1A mov byte [OCtrlZ],1Ah + 31262 Retz60: + 31263 000044A3 C3 retn + 31264 + 31265 NoChecking2: + 31266 000044A4 29C1 sub cx,ax + 31267 000044A6 749B jz short Ret60 ; wrote all supposed to + 31268 ; 18/04/2023 + 31269 000044A8 F606[179E]80 test byte [DESTISDEV],80h ; devid_ISDEV + 31270 ;test byte [DESTISDEV],devid_ISDEV ;80h + 31271 000044AD 7414 jz short COPYERR ; is a file, error + 31272 000044AF F606[179E]20 test byte [DESTISDEV],20h ; devid_RAW + 31273 ;test byte [DESTISDEV],devid_RAW ; 20h + 31274 000044B4 750A jnz short DevWrtErr ; is a raw device, error + 31275 000044B6 803E[D49E]00 cmp byte [INEXACT],0 + 31276 000044BB 7586 jnz short Ret60 ; inexact so ok + 31277 000044BD 49 dec cx + 31278 ;Retz60: + 31279 000044BE 7483 jz short Ret60 ; wrote one byte less (the ^z) + 31280 + 31281 DevWrtErr: + 31282 000044C0 BA[9391] mov dx,DEVWMES_PTR + 31283 ; 26/03/2023 + 31284 COPYERR: + 31285 ;invoke Std_EPrintF ;AC022; + 31286 000044C3 E85A0F call std_eprintf ; MSDOS 6.0 + 31287 ;call STD_PRINTF ; MSDOS 3.3 + 31288 CopErrP: + 31289 000044C6 FE06[149C] inc byte [DestClosed] + 31290 000044CA 803E[139C]00 cmp byte [CFLAG],0 + 31291 000044CF 7448 jz short EndCopyJ ; never actually got it open + 31292 000044D1 8B1E[159E] mov bx,[DESTHAND] + 31293 000044D5 83FB00 cmp bx,0 + 31294 000044D8 7E33 jle short NoClose + 31295 + 31296 ; Check to see if we should save part of the destination file. + 31297 + 31298 ; 26/03/2023 + 31299 ; MSDOS 6.0 + 31300 000044DA 8B0E[E39E] mov cx,[OFilePtr_Hi] ; CX = hi word of original file ptr + 31301 000044DE 8B16[E19E] mov dx,[OFilePtr_Lo] ; DX = lo word of original file ptr + 31302 + 31303 000044E2 89C8 mov ax,cx + 31304 000044E4 09D0 or ax,dx + 31305 000044E6 7421 jz short ceClose ; null file ptr means nothing to save + 31306 + 31307 ; Destination was also the first source. Do the best we can to + 31308 ; restore it. Truncate it back to the size we took from it (which + 31309 ; may have been due to a Ctrl-Z, so may not have included the whole + 31310 ; file). If a Ctrl-Z was originally read, put it back. 31311 - 31312 000044ED 31C9 xor cx,cx ; CX = # bytes to write = 0 - 31313 000044EF B440 mov ah,Write ; 40h - 31314 000044F1 CD21 int 21h ; truncate file - 31315 - 31316 000044F3 803E[E59E]00 cmp byte [OCtrlZ],0 - 31317 000044F8 7408 je short ceClose0 ; no ctrl-z removed from original - 31318 000044FA 41 inc cx ; CX = # bytes to write = 1 - 31319 000044FB BA[E59E] mov dx,OCtrlZ ; DS:DX = ptr to original ctrl-z - 31320 000044FE B440 mov ah,Write ; 40h - 31321 00004500 CD21 int 21h ; write ctrl-z - 31322 ceClose0: - 31323 00004502 B43E mov ah,CLOSE ; 3Eh - 31324 00004504 CD21 int 21h ; close it - 31325 ;; ;mov byte [CFLAG],0 - 31326 00004506 E9C8F8 jmp ENDCOPY ; and go home - 31327 - 31328 ; MSDOS 3.3 (& MSDOS 6.0) - 31329 ceClose: - 31330 00004509 B43E mov ah,CLOSE ; 3Eh ; close the file - 31331 0000450B CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 31332 ; BX = file handle - 31333 NoClose: - 31334 0000450D BA[BE9D] mov dx,DestBuf - 31335 00004510 B441 mov ah,Unlink ; 41h ; and delete it - 31336 00004512 CD21 int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) - 31337 ; DS:DX -> ASCIZ pathname of file to delete (no wildcards allowed) - 31338 00004514 C606[139C]00 mov byte [CFLAG],0 - 31339 EndCopyJ: - 31340 00004519 E9B5F8 jmp ENDCOPY - 31341 - 31342 Xa_Set_Error_Jmp: ;AN022; go set up error message - 31343 0000451C E9A1FE jmp Xa_Set_Error + 31312 000044E8 B80042 mov ax,(LSEEK<<8) ; 4200h + 31313 000044EB CD21 int 21h + 31314 + 31315 000044ED 31C9 xor cx,cx ; CX = # bytes to write = 0 + 31316 000044EF B440 mov ah,Write ; 40h + 31317 000044F1 CD21 int 21h ; truncate file + 31318 + 31319 000044F3 803E[E59E]00 cmp byte [OCtrlZ],0 + 31320 000044F8 7408 je short ceClose0 ; no ctrl-z removed from original + 31321 000044FA 41 inc cx ; CX = # bytes to write = 1 + 31322 000044FB BA[E59E] mov dx,OCtrlZ ; DS:DX = ptr to original ctrl-z + 31323 000044FE B440 mov ah,Write ; 40h + 31324 00004500 CD21 int 21h ; write ctrl-z + 31325 ceClose0: + 31326 00004502 B43E mov ah,CLOSE ; 3Eh + 31327 00004504 CD21 int 21h ; close it + 31328 ;; ;mov byte [CFLAG],0 + 31329 00004506 E9C8F8 jmp ENDCOPY ; and go home + 31330 + 31331 ; MSDOS 3.3 (& MSDOS 6.0) + 31332 ceClose: + 31333 00004509 B43E mov ah,CLOSE ; 3Eh ; close the file + 31334 0000450B CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 31335 ; BX = file handle + 31336 NoClose: + 31337 0000450D BA[BE9D] mov dx,DestBuf + 31338 00004510 B441 mov ah,Unlink ; 41h ; and delete it + 31339 00004512 CD21 int 21h ; DOS - 2+ - DELETE A FILE (UNLINK) + 31340 ; DS:DX -> ASCIZ pathname of file to delete (no wildcards allowed) + 31341 00004514 C606[139C]00 mov byte [CFLAG],0 + 31342 EndCopyJ: + 31343 00004519 E9B5F8 jmp ENDCOPY 31344 - 31345 ;============================================================================ - 31346 ; COPYPR2.ASM, MSDOS 6.0, 1991 - 31347 ;============================================================================ - 31348 ; 01/10/2018 - Retro DOS v3.0 - 31349 - 31350 ; MSDOS 3.3 COMMAND.COM (1987) Transient portion offset 311Fh - 31351 - 31352 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31353 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4095h + 31345 Xa_Set_Error_Jmp: ;AN022; go set up error message + 31346 0000451C E9A1FE jmp Xa_Set_Error + 31347 + 31348 ;============================================================================ + 31349 ; COPYPR2.ASM, MSDOS 6.0, 1991 + 31350 ;============================================================================ + 31351 ; 01/10/2018 - Retro DOS v3.0 + 31352 + 31353 ; MSDOS 3.3 COMMAND.COM (1987) Transient portion offset 311Fh 31354 - 31355 ; =============== S U B R O U T I N E ======================================= - 31356 - 31357 ;*** SetAsc - set Ascii, Binary, Inexact flags based on switches - 31358 ; - 31359 ; Given switch vector in AX, - 31360 ; Set Ascii flag if /a is set - 31361 ; Clear Ascii flag if /b is set - 31362 ; Binary set if /b specified - 31363 ; Leave Ascii unchanged if neither or both are set - 31364 ; Also sets Inexact if Ascii is ever set. - 31365 ; AL = Ascii on exit, flags set - 31366 - 31367 ; 26/03/2023 - 31368 SETASC: - 31369 ;and al,SWITCHA+SWITCHB ; 0Ch ; AL = /a, /b flags - 31370 0000451F 240C and al,0Ch ; 4+8 - 31371 00004521 7A10 jpe short LOADSW ; even parity - both or neither - 31372 00004523 50 push ax - 31373 ;and al,SWITCHB ; 8 - 31374 00004524 2408 and al,8 - 31375 00004526 A2[D69E] mov [BINARY],al - 31376 00004529 58 pop ax - 31377 ;and al,SWITCHA - 31378 0000452A 2404 and al,4 - 31379 0000452C A2[DA9E] mov [ASCII],al - 31380 0000452F 0806[D49E] or [INEXACT],al - 31381 LOADSW: - 31382 00004533 A0[DA9E] mov al,[ASCII] - 31383 00004536 08C0 or al,al - 31384 00004538 C3 retn - 31385 - 31386 ; =============== S U B R O U T I N E ======================================= - 31387 - 31388 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31389 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM - 31390 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM - 31391 BUILDDEST: - 31392 00004539 803E[B99D]FF cmp byte [DestIsDir],-1 ; 0FFh - 31393 0000453E 750F jnz short KNOWABOUTDEST ; figuring already done - 31394 00004540 BF[D79A] mov di,USERDIR1 - 31395 00004543 BD[B99D] mov bp,DestVars - 31396 - 31397 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM - 31398 %if 1 - 31399 ;mov bx,deny_none|write_open_mode - 31400 00004546 BB4100 mov bx,41h ; open mode for COPY ;M046 - 31401 %endif - 31402 - 31403 00004549 E8DF00 call BUILDPATH - 31404 0000454C E8D4E2 call RestUDir1 + 31355 ; 26/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31356 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4095h + 31357 + 31358 ; =============== S U B R O U T I N E ======================================= + 31359 + 31360 ;*** SetAsc - set Ascii, Binary, Inexact flags based on switches + 31361 ; + 31362 ; Given switch vector in AX, + 31363 ; Set Ascii flag if /a is set + 31364 ; Clear Ascii flag if /b is set + 31365 ; Binary set if /b specified + 31366 ; Leave Ascii unchanged if neither or both are set + 31367 ; Also sets Inexact if Ascii is ever set. + 31368 ; AL = Ascii on exit, flags set + 31369 + 31370 ; 26/03/2023 + 31371 SETASC: + 31372 ;and al,SWITCHA+SWITCHB ; 0Ch ; AL = /a, /b flags + 31373 0000451F 240C and al,0Ch ; 4+8 + 31374 00004521 7A10 jpe short LOADSW ; even parity - both or neither + 31375 00004523 50 push ax + 31376 ;and al,SWITCHB ; 8 + 31377 00004524 2408 and al,8 + 31378 00004526 A2[D69E] mov [BINARY],al + 31379 00004529 58 pop ax + 31380 ;and al,SWITCHA + 31381 0000452A 2404 and al,4 + 31382 0000452C A2[DA9E] mov [ASCII],al + 31383 0000452F 0806[D49E] or [INEXACT],al + 31384 LOADSW: + 31385 00004533 A0[DA9E] mov al,[ASCII] + 31386 00004536 08C0 or al,al + 31387 00004538 C3 retn + 31388 + 31389 ; =============== S U B R O U T I N E ======================================= + 31390 + 31391 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31392 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM + 31393 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM + 31394 BUILDDEST: + 31395 00004539 803E[B99D]FF cmp byte [DestIsDir],-1 ; 0FFh + 31396 0000453E 750F jnz short KNOWABOUTDEST ; figuring already done + 31397 00004540 BF[D79A] mov di,USERDIR1 + 31398 00004543 BD[B99D] mov bp,DestVars + 31399 + 31400 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM + 31401 %if 1 + 31402 ;mov bx,deny_none|write_open_mode + 31403 00004546 BB4100 mov bx,41h ; open mode for COPY ;M046 + 31404 %endif 31405 - 31406 ; We now know all about the destination - 31407 - 31408 KNOWABOUTDEST: - 31409 0000454F 30C0 xor al,al - 31410 00004551 8606[189E] xchg al,[FIRSTDEST] - 31411 00004555 08C0 or al,al - 31412 00004557 7503 jnz short FIRSTDST - 31413 00004559 E98C00 jmp NOFIRSTDEST - 31414 - 31415 FIRSTDST: - 31416 ; Create an fcb of the original dest. + 31406 00004549 E8DF00 call BUILDPATH + 31407 0000454C E8D4E2 call RestUDir1 + 31408 + 31409 ; We now know all about the destination + 31410 + 31411 KNOWABOUTDEST: + 31412 0000454F 30C0 xor al,al + 31413 00004551 8606[189E] xchg al,[FIRSTDEST] + 31414 00004555 08C0 or al,al + 31415 00004557 7503 jnz short FIRSTDST + 31416 00004559 E98C00 jmp NOFIRSTDEST 31417 - 31418 0000455C 8B36[BB9D] mov si,[DestTail] - 31419 00004560 BF[F69C] mov di,DestFcb - 31420 00004563 B80029 mov ax,Parse_File_Descriptor*256 ; 2900h - 31421 00004566 CD21 int 21h ; DOS - PARSE FILENAME - 31422 ; DS:SI -> string to parse - 31423 ; ES:DI -> buffer to fill with unopened FCB - 31424 ; AL = bit mask to control parsing - 31425 00004568 803C00 cmp byte [si],0 - 31426 0000456B 7406 jz short GOODPARSE - 31427 - 31428 ; 27/03/2023 - 31429 ; MSDOS 6.0 - 31430 ;mov byte [di+1],"|" ;AD052; must be illegal file name character - 31431 - 31432 0000456D BA[F18F] mov dx,FULLDIR_PTR ;AN052; issue "file creation error" - 31433 00004570 E950FF jmp COPYERR ;AN052; - 31434 GOODPARSE: - 31435 00004573 A1[BE9D] mov ax,[DestBuf] ; AX = possible "d:" - 31436 00004576 80FC3A cmp ah,':' - 31437 00004579 7402 jz short DRVSPEC4 - 31438 0000457B B040 mov al,'@' ; 40h - 31439 DRVSPEC4: - 31440 ; AX = "d:" for following FCB drive computation - 31441 - 31442 0000457D 8A0E[DA9E] mov cl,[ASCII] ; CL = saved Ascii flag - 31443 00004581 0C20 or al,20h - 31444 00004583 2C60 sub al,60h - 31445 00004585 A2[F69C] mov [DestFcb],al ; store drive # in FCB - 31446 - 31447 ;* Figure out what copy mode we're in. - 31448 ; Letters stand for unambiguous, * for ambiguous pathnames. - 31449 ; +n stands for additional sources delimited by +'s. - 31450 ; - 31451 ; copy a b not concatenating - 31452 ; copy a * not concatenating - 31453 ; copy * a concatenating - 31454 ; copy * * not concatenating - 31455 ; copy a+n b concatenating - 31456 ; copy *+n a concatenating - 31457 ; copy *+n * concatenating, Mel Hallerman style - 31458 - 31459 ; Bugbug: copy *.a+a.b *.t picks up only 1st *.a file.. Why? - 31460 ; copy a.b+*.a *.t picks up all *.a files. + 31418 FIRSTDST: + 31419 ; Create an fcb of the original dest. + 31420 + 31421 0000455C 8B36[BB9D] mov si,[DestTail] + 31422 00004560 BF[F69C] mov di,DestFcb + 31423 00004563 B80029 mov ax,Parse_File_Descriptor*256 ; 2900h + 31424 00004566 CD21 int 21h ; DOS - PARSE FILENAME + 31425 ; DS:SI -> string to parse + 31426 ; ES:DI -> buffer to fill with unopened FCB + 31427 ; AL = bit mask to control parsing + 31428 00004568 803C00 cmp byte [si],0 + 31429 0000456B 7406 jz short GOODPARSE + 31430 + 31431 ; 27/03/2023 + 31432 ; MSDOS 6.0 + 31433 ;mov byte [di+1],"|" ;AD052; must be illegal file name character + 31434 + 31435 0000456D BA[F18F] mov dx,FULLDIR_PTR ;AN052; issue "file creation error" + 31436 00004570 E950FF jmp COPYERR ;AN052; + 31437 GOODPARSE: + 31438 00004573 A1[BE9D] mov ax,[DestBuf] ; AX = possible "d:" + 31439 00004576 80FC3A cmp ah,':' + 31440 00004579 7402 jz short DRVSPEC4 + 31441 0000457B B040 mov al,'@' ; 40h + 31442 DRVSPEC4: + 31443 ; AX = "d:" for following FCB drive computation + 31444 + 31445 0000457D 8A0E[DA9E] mov cl,[ASCII] ; CL = saved Ascii flag + 31446 00004581 0C20 or al,20h + 31447 00004583 2C60 sub al,60h + 31448 00004585 A2[F69C] mov [DestFcb],al ; store drive # in FCB + 31449 + 31450 ;* Figure out what copy mode we're in. + 31451 ; Letters stand for unambiguous, * for ambiguous pathnames. + 31452 ; +n stands for additional sources delimited by +'s. + 31453 ; + 31454 ; copy a b not concatenating + 31455 ; copy a * not concatenating + 31456 ; copy * a concatenating + 31457 ; copy * * not concatenating + 31458 ; copy a+n b concatenating + 31459 ; copy *+n a concatenating + 31460 ; copy *+n * concatenating, Mel Hallerman style 31461 - 31462 00004588 A0[BD9D] mov al,[DestInfo] ; AL = destination CParse flags - 31463 0000458B 8A26[209E] mov ah,[SrcInfo] ; AH = source CParse flags - 31464 0000458F 250202 and ax,202h ; AH,AL = source,dest wildcard flags - 31465 00004592 08C0 or al,al - 31466 00004594 7413 jz short NOTMELCOPY ; no destination wildcard - 31467 - 31468 ; Destination is wildcarded. - 31469 - 31470 00004596 38E0 cmp al,ah - 31471 00004598 750F jnz short NOTMELCOPY ; no source wildcard - 31472 - 31473 ; Source and destination are both wildcarded. - 31474 - 31475 0000459A 803E[DB9E]00 cmp byte [PLUS],0 - 31476 0000459F 7408 jz short NOTMELCOPY ; no +'s in source + 31462 ; Bugbug: copy *.a+a.b *.t picks up only 1st *.a file.. Why? + 31463 ; copy a.b+*.a *.t picks up all *.a files. + 31464 + 31465 00004588 A0[BD9D] mov al,[DestInfo] ; AL = destination CParse flags + 31466 0000458B 8A26[209E] mov ah,[SrcInfo] ; AH = source CParse flags + 31467 0000458F 250202 and ax,202h ; AH,AL = source,dest wildcard flags + 31468 00004592 08C0 or al,al + 31469 00004594 7413 jz short NOTMELCOPY ; no destination wildcard + 31470 + 31471 ; Destination is wildcarded. + 31472 + 31473 00004596 38E0 cmp al,ah + 31474 00004598 750F jnz short NOTMELCOPY ; no source wildcard + 31475 + 31476 ; Source and destination are both wildcarded. 31477 - 31478 ; Source and destination are wildcarded, and source includes +'s. - 31479 ; It's Mel Hallorman copy time. + 31478 0000459A 803E[DB9E]00 cmp byte [PLUS],0 + 31479 0000459F 7408 jz short NOTMELCOPY ; no +'s in source 31480 - 31481 000045A1 FE06[199E] inc byte [MELCOPY] ; 'Mel copy' = true - 31482 000045A5 30C0 xor al,al - 31483 000045A7 EB06 jmp short SETCONC - 31484 - 31485 NOTMELCOPY: - 31486 000045A9 3402 xor al,2 ; AL=0 -> ambiguous destination, 2 otherwise - 31487 000045AB 20E0 and al,ah - 31488 000045AD D0E8 shr al,1 ; AL=1 -> ambiguous source, unambiguous dest - 31489 ; (implies concatenation) - 31490 SETCONC: - 31491 000045AF 0A06[DB9E] or al,[PLUS] ; "+" always infers concatenation - 31492 - 31493 ; Whew. AL = 1 if concatenating, 0 if not. - 31494 - 31495 000045B3 A2[089C] mov [Concat],al - 31496 000045B6 D0E0 shl al,1 - 31497 000045B8 D0E0 shl al,1 - 31498 000045BA A2[D49E] mov [INEXACT],al ; concatenation -> inexact copy - 31499 000045BD 803E[D69E]00 cmp byte [BINARY],0 - 31500 000045C2 7524 jne short NOFIRSTDEST ; explicit binary copy - 31501 - 31502 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM - 31503 ; MSDOS 6.0 (MSDOS 5.0) - 31504 ;mov [ASCII],al ; otherwise, concatenate in ascii mode - 31505 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:48FAh - 31506 ;or [ASCII],al - 31507 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 31508 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:47C5h - 31509 000045C4 A2[DA9E] mov [ASCII],al - 31510 - 31511 000045C7 08C9 or cl,cl - 31512 000045C9 751D jnz short NOFIRSTDEST ; Ascii flag set before, data read correctly - 31513 000045CB 08C0 or al,al - 31514 000045CD 7419 jz short NOFIRSTDEST ; Ascii flag did not change state - 31515 - 31516 ; At this point there may already be binary read data in the read - 31517 ; buffer. We need to find the first ^Z (if there is one) and trim the - 31518 ; amount of data in the buffer correctly. - 31519 - 31520 000045CF 8B0E[199C] mov cx,[NXTADD] - 31521 000045D3 E313 jcxz NOFIRSTDEST ; no data, everything ok - 31522 000045D5 B01A mov al,1Ah - 31523 000045D7 06 push es - 31524 000045D8 31FF xor di,di - 31525 000045DA 8E06[F79B] mov es,[TPA] - 31526 000045DE F2AE repne scasb ; scan for EOF - 31527 000045E0 07 pop es - 31528 000045E1 7505 jnz short NOFIRSTDEST ; no ^z in buffer, everything ok - 31529 000045E3 4F dec di ; point at ^z - 31530 000045E4 893E[199C] mov [NXTADD],di ; new buffer length - 31531 - 31532 NOFIRSTDEST: - 31533 000045E8 BB[3A9D] mov bx,DIRBUF+1 ; Source of replacement chars - 31534 000045EB 803E[089C]00 cmp byte [Concat],0 - 31535 000045F0 7403 jz short GOTCHRSRC ; Not a concat - 31536 000045F2 BB[809D] mov bx,SDIRBUF+1 ; Source of replacement chars - 31537 GOTCHRSRC: - 31538 000045F5 BE[F79C] mov si,DestFcb+1 ; Original dest name - 31539 000045F8 8B3E[BB9D] mov di,[DestTail] ; Where to put result - 31540 - 31541 ; --------------- S U B R O U T I N E --------------------------------------- - 31542 - 31543 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31544 BUILDNAME: - 31545 000045FC B90800 mov cx,8 - 31546 BUILDMAIN: - 31547 000045FF AC lodsb - 31548 00004600 3C3F cmp al,'?' - 31549 00004602 7502 jne short NOTAMBIG - 31550 00004604 8A07 mov al,[bx] - 31551 NOTAMBIG: - 31552 00004606 3C20 cmp al,' ' - 31553 00004608 7401 je short NOSTORE - 31554 0000460A AA stosb - 31555 NOSTORE: - 31556 0000460B 43 inc bx - 31557 0000460C E2F1 loop BUILDMAIN - 31558 0000460E B103 mov cl,3 - 31559 ;mov al,' ' ; 20h - 31560 ;cmp [si],al - 31561 ; 27/03/2023 - 31562 00004610 803C20 cmp byte [si],20h ; ' ' - 31563 00004613 7412 je short ENDDEST ; No extension - 31564 ;mov al,[DOT_CHR] - 31565 ; 27/03/2023 - 31566 00004615 B02E mov al,'.' ; 2Eh ; dot_chr - 31567 00004617 AA stosb - 31568 BUILDEXT: - 31569 00004618 AC lodsb - 31570 00004619 3C3F cmp al,'?' - 31571 0000461B 7502 jne short NOTAMBIGE - 31572 0000461D 8A07 mov al,[bx] - 31573 NOTAMBIGE: - 31574 0000461F 3C20 cmp al,' ' - 31575 00004621 7401 je short NOSTOREE - 31576 00004623 AA stosb - 31577 NOSTOREE: - 31578 00004624 43 inc bx - 31579 00004625 E2F1 loop BUILDEXT - 31580 ENDDEST: - 31581 00004627 30C0 xor al,al - 31582 00004629 AA stosb ; NUL terminate - 31583 0000462A C3 retn - 31584 - 31585 ; =============== S U B R O U T I N E ======================================= - 31586 - 31587 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31588 ; 28/03/2023 - 31589 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 31590 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM - 31591 BUILDPATH: - 31592 0000462B F6460402 test byte [bp+VARSTRUC.INFO],2 ; test byte [bp+4],2 - 31593 0000462F 7540 jnz short NOTPFILE ; If ambig don't bother with open - 31594 00004631 89EA mov dx,bp ; Set DX to spec - 31595 00004633 83C205 add dx,VARSTRUC.BUF ; add dx,5 - 31596 - 31597 ; 27/03/2023 - 31598 ; MSDOS 6.0 - 31599 00004636 57 push di ;AN000; - 31600 00004637 B8006C mov ax,(ExtOpen<<8) ; 6C00h ;AC000; open the file - 31601 - 31602 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM - 31603 %if 0 - 31604 ;mov bx,deny_none|read_open_mode - 31605 mov bx,40h ; open mode for COPY ;M046 - 31606 %endif - 31607 0000463A 31C9 xor cx,cx ;AN000; no special files - 31608 0000463C 89D6 mov si,dx ;AN030; get file name offset - 31609 ;mov dx,read_open_flag ;AN000; set up open flags - 31610 0000463E BA0101 mov dx,101h - 31611 00004641 CD21 INT 21h - 31612 00004643 5F pop di ;AN000; - 31613 00004644 7315 jnc short PURE_FILE ;AN022; is pure file - 31614 00004646 E802DA call get_ext_error_number ;AN022; get the extended error - 31615 ;cmp ax,2 - 31616 00004649 83F802 cmp ax,ERROR_FILE_NOT_FOUND ;AN022; if file not found - okay - 31617 0000464C 7423 jz short NOTPFILE ;AN022; - 31618 ;cmp ax,3 - 31619 0000464E 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found - okay - 31620 00004651 741E jz short NOTPFILE ;AN022; - 31621 ;cmp ax,5 - 31622 00004653 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied - okay - 31623 00004656 7419 jz short NOTPFILE ;AN022; - 31624 00004658 E925D7 jmp extend_setup ;AN022; exit with error - 31625 - 31626 ; 27/03/2023 - 31627 ; MSDOS 3.3 - 31628 ;mov ax,OPEN*256 ; 3D00h - 31629 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE - 31630 ; ; DS:DX -> ASCIZ filename - 31631 ; ; AL = access mode - 31632 ; ; 0 - read - 31633 ;jc short NOTPFILE - 31634 - 31635 PURE_FILE: - 31636 0000465B 89C3 mov bx,ax - 31637 0000465D B80044 mov ax,IOCTL*256 ; 4400h - 31638 00004660 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION - 31639 ; BX = file or device handle - 31640 00004662 B43E mov ah,CLOSE ;3Eh - 31641 00004664 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE - 31642 ; BX = file handle - 31643 ; 18/04/2023 - 31644 00004666 F6C280 test dl,80h - 31645 ;test dl,devid_ISDEV ; test dl,80h - 31646 00004669 7553 jnz short ISADEV - 31647 0000466B F6460404 test byte [bp+VARSTRUC.INFO],4 ; test byte [bp+4],4 - 31648 0000466F 744D jz short ISADEV - 31649 NOTPFILE: - 31650 00004671 8B5605 mov dx,[bp+VARSTRUC.BUF] ; mov dx,[bp+5] - 31651 - 31652 ; 27/03/2023 - 31653 ; MSDOS 6.0 - 31654 00004674 80FA00 cmp dl,0 ;AN034; If no drive specified, get - 31655 00004677 7405 je short SET_DRIVE_SPEC ;AN034; default drive dir - 31656 - 31657 00004679 80FE3A cmp dh,':' - 31658 0000467C 7402 je short DRVSPEC5 - 31659 SET_DRIVE_SPEC: - 31660 0000467E B240 mov dl,'@' ; 40h - 31661 DRVSPEC5: - 31662 00004680 80CA20 or dl,20h - 31663 00004683 80EA60 sub dl,60h ; A = 1 - 31664 00004686 E8CCE2 call SAVUDIR1 - 31665 - 31666 ; 27/03/2023 - 31667 ; MSDOS 6.0 - 31668 00004689 7306 jnc short CURDIR_OK ;AN022; if error - exit - 31669 0000468B E8BDD9 call get_ext_error_number ;AN022; get the extended error - 31670 0000468E E9EFD6 jmp extend_setup ;AN022; exit with error - 31671 - 31672 CURDIR_OK: - 31673 00004691 89EA mov dx,bp - 31674 ;add dx,5 - 31675 00004693 83C205 add dx,VARSTRUC.BUF ; Set DX for upcomming CHDIRs - 31676 ;mov bh,[bp+4] - 31677 00004696 8A7E04 mov bh,[bp+VARSTRUC.INFO] - 31678 00004699 80E706 and bh,6 - 31679 0000469C 80FF06 cmp bh,6 ; Ambig and path ? - 31680 0000469F 7518 jne short CHECKAMB ; jmp if no - 31681 ;mov si,[bp+2] - 31682 000046A1 8B7602 mov si,[bp+VARSTRUC.TTAIL] - 31683 000046A4 B33A mov bl,':' - 31684 000046A6 385CFE cmp [si-2],bl - 31685 000046A9 7506 jne short KNOWNOTSPEC - 31686 ;mov byte [bp+VARSTRUC.ISDIR],2 - 31687 ; Know is d:/file - 31688 ;mov byte [bp+0],2 - 31689 000046AB C6460002 mov byte [bp],2 - 31690 000046AF EB05 jmp short DOPCDJ - 31691 KNOWNOTSPEC: - 31692 ;mov byte [bp+VARSTRUC.ISDIR],1 - 31693 ; Know is path/file - 31694 ;mov byte [bp+0],1 - 31695 000046B1 C6460001 mov byte [bp],1 - 31696 000046B5 4E dec si - 31697 DOPCDJ: - 31698 000046B6 E98300 jmp DOPCD - 31699 CHECKAMB: - 31700 000046B9 80FF02 cmp bh,2 - 31701 000046BC 7505 jnz short CHECKCD - 31702 ISSIMPFILE: - 31703 ISADEV: - 31704 ;mov byte [bp+VARSTRUC.ISDIR],0 - 31705 ;mov byte [bp+0],0 - 31706 000046BE C6460000 mov byte [bp],0 - 31707 000046C2 C3 retn - 31708 CHECKCD: - 31709 000046C3 E84EEA call SetRest1 - 31710 000046C6 B43B mov ah,CHDir ; 3Bh - 31711 000046C8 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 31712 ; DS:DX -> ASCIZ directory name (may include drive) - 31713 000046CA 7239 jb short NOTPDIR - 31714 000046CC 89D7 mov di,dx - 31715 000046CE 31C0 xor ax,ax - 31716 000046D0 89C1 mov cx,ax - 31717 000046D2 49 dec cx - 31718 ; 14/06/2023 - 31719 ;repne scasb ; MSDOS 3.3 - 31720 - 31721 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31722 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:424Ah) - 31723 ; MSDOS 6.0 - 31724 Kloop: ;AN000; 3/3/KK - 31725 000046D3 268A05 mov al,[es:di] ;AN000; 3/3/KK - 31726 000046D6 47 inc di ;AN000; 3/3/KK - 31727 000046D7 08C0 or al,al ;AN000; 3/3/KK - 31728 000046D9 740C jz short DONE ;AN000; 3/3/KK - 31729 000046DB 30E4 xor ah,ah ;AN000; 3/3/KK - 31730 000046DD E881E0 call testkanj ;AN000; 3/3/KK - 31731 000046E0 74F1 jz short Kloop ;AN000; 3/3/KK - 31732 000046E2 47 inc di ;AN000; 3/3/KK - 31733 000046E3 FEC4 inc ah ;AN000; 3/3/KK - 31734 000046E5 EBEC jmp short Kloop ;AN000; 3/3/KK - 31735 DONE: - 31736 000046E7 4F dec di - 31737 000046E8 A0[FA9B] mov al,[DIRCHAR] - 31738 ;mov byte [bp+VARSTRUC.ISDIR],2 ; assume d:/file - 31739 ;mov byte [bp+0],2 - 31740 000046EB C6460002 mov byte [bp],2 - 31741 ; 27/03/2023 - 31742 ; MSDOS 6.0 - 31743 000046EF 08E4 or ah,ah ;AN000; 3/3/KK - 31744 000046F1 7505 jnz short _STORE_PCHAR ;AN000; 3/3/KK - 31745 ;this is the trailing byte of ECS code - 31746 ; - 31747 000046F3 3A45FF cmp al,[di-1] - 31748 000046F6 7405 jz short GOTSRCSLSH - 31749 _STORE_PCHAR: - 31750 000046F8 AA stosb - 31751 ;mov byte [bp+VARSTRUC.ISDIR],1 ; know path/file - 31752 ;mov byte [bp+0],1 - 31753 000046F9 C6460001 mov byte [bp],1 - 31754 GOTSRCSLSH: - 31755 ;or byte [bp+4],6 - 31756 000046FD 804E0406 or byte [bp+VARSTRUC.INFO],6 - 31757 00004701 E87400 call SETSTARS - 31758 NOTPDIR_RETN: - 31759 00004704 C3 retn - 31760 - 31761 ; 28/03/2023 - 31762 NOTPDIR: - 31763 ; MSDOS 6.0 - 31764 00004705 E843D9 call get_ext_error_number ;AN022; get the extended error - 31765 ;cmp ax,3 - 31766 00004708 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found - okay - 31767 0000470B 7405 je short NOTPDIR_TRY ;AN022; - 31768 ;cmp ax,5 - 31769 0000470D 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied - okay - 31770 00004710 7560 jne short EXTEND_SETUPJ ;AN022; otherwise - exit error - 31771 NOTPDIR_TRY: - 31772 ; MSDOS 3.3 (& MSDOS 6.0) - 31773 ;mov byte [bp+VARSTRUC.ISDIR],0 - 31774 ;mov byte [bp+0],0 - 31775 00004712 C6460000 mov byte [bp],0 - 31776 ;mov bh,[bp+4] - 31777 00004716 8A7E04 mov bh,[bp+VARSTRUC.INFO] - 31778 00004719 F6C704 test bh,4 - 31779 0000471C 74E6 jz short NOTPDIR_RETN ; Know pure file, no path seps - 31780 ;mov byte [bp+VARSTRUC.ISDIR],2 ; assume d:/file - 31781 ;mov byte [bp+0],2 - 31782 0000471E C6460002 mov byte [bp],2 - 31783 ;mov si,[bp+2] - 31784 00004722 8B7602 mov si,[bp+VARSTRUC.TTAIL] - 31785 00004725 803C00 cmp byte [si],0 - 31786 00004728 744B je short BADCDERRJ2 ; Trailing '/' - 31787 ;mov bl,[DOT_CHR] - 31788 ; 28/03/2023 - Retro DOS v4.0 COMMAND.COM - 31789 ; MSDOS 6.0 (& 5.0) COMMAND.COM - 31790 0000472A B32E mov bl,'.' ; 2Eh ; dot_chr - 31791 0000472C 381C cmp [si],bl - 31792 0000472E 7445 je short BADCDERRJ2 ; If . or .. pure cd should have worked - 31793 00004730 B33A mov bl,':' ; 3Ah - 31794 00004732 385CFE cmp [si-2],bl - 31795 00004735 7405 je short DOPCD ; Know d:/file - 31796 ;mov byte [bp+VARSTRUC.ISDIR],1 - 31797 ; Know path/file - 31798 ;mov byte [bp+0],1 - 31799 00004737 C6460001 mov byte [bp],1 - 31800 0000473B 4E dec si ; Point at last '/' - 31801 DOPCD: - 31802 0000473C 30DB xor bl,bl - 31803 0000473E 861C xchg bl,[si] ; Stick in a NUL - 31804 00004740 E8D1E9 call SetRest1 - 31805 - 31806 ; 28/03/2023 - 31807 ; MSDOS 6.0 (& MSDOS 5.0) - 31808 00004743 39F2 cmp dx,si ;AN000; 3/3/KK - 31809 00004745 771B ja short LookBack ;AN000; 3/3/KK - 31810 00004747 56 push si ;AN000; 3/3/KK - 31811 00004748 51 push cx ;AN000; 3/3/KK - 31812 00004749 89F1 mov cx,si ;AN000; 3/3/KK - 31813 0000474B 89D6 mov si,dx ;AN000; 3/3/KK - 31814 Kloop2: ;AN000; 3/3/KK - 31815 0000474D AC lodsb ;AN000; 3/3/KK - 31816 0000474E E810E0 call testkanj ;AN000; 3/3/KK - 31817 00004751 7409 jz short NotKanj4 ;AN000; 3/3/KK - 31818 00004753 AC lodsb ;AN000; 3/3/KK - 31819 00004754 39CE cmp si,cx ;AN000; 3/3/KK - 31820 00004756 72F5 jb short Kloop2 ;AN000; 3/3/KK - 31821 00004758 59 pop cx ;AN000; 3/3/KK - 31822 00004759 5E pop si ;AN000; 3/3/KK - 31823 0000475A EB0B jmp short DoCdr ;AN000; 3/3/KK Last char is ECS code, don't check for - 31824 ; trailing path sep - 31825 NotKanj4: ;AN000; 3/3/KK - 31826 0000475C 39CE cmp si,cx ;AN000; 3/3/KK - 31827 0000475E 72ED jb short Kloop2 ;AN000; 3/3/KK - 31828 00004760 59 pop cx ;AN000; 3/3/KK - 31829 00004761 5E pop si ;AN000; 3/3/KK - 31830 LookBack: ;AN000; 3/3/KK - 31831 ; 28/03/2023 - 31832 ; MSDOS 3.3 & MSDOS 6.0 - 31833 00004762 3A5CFF cmp bl,[si-1] ; if double slash, then complain. - 31834 00004765 740E je short BADCDERRJ2 - 31835 DoCdr: - 31836 00004767 B43B mov ah,CHDir ; 3Bh - 31837 00004769 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) - 31838 ; DS:DX -> ASCIZ directory name (may include drive) - 31839 0000476B 861C xchg bl,[si] - 31840 0000476D 7395 jnc short NOTPDIR_RETN - 31841 - 31842 ; 28/03/2023 - 31843 ; MSDOS 3.3 - 31844 ;BADCDERRJ2: - 31845 ;stc - 31846 ;jmp BADCDERR - 31847 - 31848 ; 28/03/2023 - 31849 ; MSDOS 6.0 (& MSDOS 5.0) - 31850 0000476F E8D9D8 call get_ext_error_number ;AN022; get the extended error - 31851 EXTEND_SETUPJ: ;AN022; - 31852 00004772 E90BD6 jmp extend_setup ;AN022; go issue the error message - 31853 BADCDERRJ2: - 31854 00004775 E905D6 jmp badpath_err ;AC022; go issue path not found message - 31855 - 31856 ; =============== S U B R O U T I N E ======================================= - 31857 - 31858 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31859 SETSTARS: - 31860 ;mov [bp+2],di - 31861 00004778 897E02 mov [bp+VARSTRUC.TTAIL],di - 31862 ;add byte [bp+1],12 - 31863 0000477B 8046010C add byte [bp+VARSTRUC.SIZ],12 - 31864 ;;mov ax,[DOT_QMARK] ; '?.' (2E3Fh) - 31865 ; 28/03/2023 - 31866 ; MSDOS 6.0 - 31867 0000477F B83F2E mov ax,dot_qmark ; 2E3Fh - 31868 ;mov ax,'?.' ; dot_qmark - 31869 - 31870 00004782 B90800 mov cx,8 - 31871 00004785 F3AA rep stosb - 31872 00004787 86C4 xchg al,ah - 31873 00004789 AA stosb - 31874 0000478A 86C4 xchg al,ah - 31875 0000478C B103 mov cl,3 - 31876 0000478E F3AA rep stosb - 31877 00004790 30C0 xor al,al - 31878 00004792 AA stosb - 31879 00004793 C3 retn - 31880 - 31881 ; =============== S U B R O U T I N E ======================================= - 31882 - 31883 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31884 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM - 31885 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 31886 COMPNAME: - 31887 00004794 BE[BE9D] mov si,DestBuf ; do name translate of target - 31888 00004797 BF[7A99] mov di,TRGXNAME ; save for name comparison - 31889 0000479A B460 mov ah,xNameTrans ; 60h - 31890 ;mov ah,60h - 31891 0000479C CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING - 31892 ; DS:SI -> ASCIZ relative path string or directory name - 31893 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name - 31894 0000479E BE[2399] mov si,SRCXNAME ; get name translate of source - 31895 000047A1 BF[7A99] mov di,TRGXNAME ; get name translate of target - 31896 ;call STRCOMP - 31897 ;retn - 31898 ; 28/03/2023 - 31899 000047A4 E921E2 jmp STRCOMP - 31900 - 31901 ;============================================================================ - 31902 ; CPARSE.ASM, MSDOS 6.0, 1991 - 31903 ;============================================================================ - 31904 ; 30/09/2018 - Retro DOS v3.0 - 31905 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31906 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 31907 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 31908 - 31909 ;-----------------------------------------------------------------------; - 31910 ; ENTRY: ; - 31911 ; DS:SI Points input buffer ; - 31912 ; ES:DI Points to the token buffer ; - 31913 ; BL Special delimiter for this call ; - 31914 ; Always checked last ; - 31915 ; set it to space if there is no special delimiter ; - 31916 ; EXIT: ; - 31917 ; DS:SI Points to next char in the input buffer ; - 31918 ; ES:DI Points to the token buffer ; - 31919 ; [STARTEL] Points to start of last element of path in token ; - 31920 ; points to a NUL for no element strings 'd:' 'd:/' ; - 31921 ; CX Character count ; - 31922 ; BH Condition Code ; - 31923 ; Bit 1H of BH set if switch character ; - 31924 ; Token buffer contains char after ; - 31925 ; switch character ; - 31926 ; BP has switch bits set (ORing only) ; - 31927 ; Bit 2H of BH set if ? or * in token ; - 31928 ; if * found element ? filled ; - 31929 ; Bit 4H of BH set if path sep in token ; - 31930 ; Bit 80H of BH set if the special delimiter ; - 31931 ; was skipped at the start of this token ; - 31932 ; Token buffer always starts d: for non switch tokens ; - 31933 ; CARRY SET ; - 31934 ; if CR on input ; - 31935 ; token buffer not altered ; - 31936 ; ; - 31937 ; DOES NOT RETURN ON BAD PATH, OR TRAILING SWITCH CHAR ERROR ; - 31938 ; MODIFIES: ; - 31939 ; CX, SI, AX, BH, DX and the Carry Flag ; - 31940 ; ; - 31941 ;-----------------------------------------------------------------------; - 31942 - 31943 ; Modifications to cparse: recognition of right and left parentheses - 31944 ; as integral tokens, and removal of automatic upper-case conversion code. - 31945 ; - 31946 ; Both modifications were installed in the course of adding a coherent - 31947 ; command-line parser to COMMAND.COM which builds a UNIX-style argv[]/argc - 31948 ; structure for command-line arguments. This parser relies on cparse to - 31949 ; recognize individual tokens. - 31950 ; - 31951 ; To process for-loops correctly, parentheses must therefore be - 31952 ; recognized as tokens. The upper-case conversion code was removed so - 31953 ; that commands (such as for and echo) would be able to use the "original" - 31954 ; text of the command line. - 31955 ; - 31956 ; Note also the modification to prevent the automatic conversion of colons - 31957 ; into spaces WITHIN THE SOURCE TEXT! + 31481 ; Source and destination are wildcarded, and source includes +'s. + 31482 ; It's Mel Hallorman copy time. + 31483 + 31484 000045A1 FE06[199E] inc byte [MELCOPY] ; 'Mel copy' = true + 31485 000045A5 30C0 xor al,al + 31486 000045A7 EB06 jmp short SETCONC + 31487 + 31488 NOTMELCOPY: + 31489 000045A9 3402 xor al,2 ; AL=0 -> ambiguous destination, 2 otherwise + 31490 000045AB 20E0 and al,ah + 31491 000045AD D0E8 shr al,1 ; AL=1 -> ambiguous source, unambiguous dest + 31492 ; (implies concatenation) + 31493 SETCONC: + 31494 000045AF 0A06[DB9E] or al,[PLUS] ; "+" always infers concatenation + 31495 + 31496 ; Whew. AL = 1 if concatenating, 0 if not. + 31497 + 31498 000045B3 A2[089C] mov [Concat],al + 31499 000045B6 D0E0 shl al,1 + 31500 000045B8 D0E0 shl al,1 + 31501 000045BA A2[D49E] mov [INEXACT],al ; concatenation -> inexact copy + 31502 000045BD 803E[D69E]00 cmp byte [BINARY],0 + 31503 000045C2 7524 jne short NOFIRSTDEST ; explicit binary copy + 31504 + 31505 ; 13/06/2023 - Retro DOS v4.2 COMMAND.COM + 31506 ; MSDOS 6.0 (MSDOS 5.0) + 31507 ;mov [ASCII],al ; otherwise, concatenate in ascii mode + 31508 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:48FAh + 31509 ;or [ASCII],al + 31510 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 31511 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:47C5h + 31512 000045C4 A2[DA9E] mov [ASCII],al + 31513 + 31514 000045C7 08C9 or cl,cl + 31515 000045C9 751D jnz short NOFIRSTDEST ; Ascii flag set before, data read correctly + 31516 000045CB 08C0 or al,al + 31517 000045CD 7419 jz short NOFIRSTDEST ; Ascii flag did not change state + 31518 + 31519 ; At this point there may already be binary read data in the read + 31520 ; buffer. We need to find the first ^Z (if there is one) and trim the + 31521 ; amount of data in the buffer correctly. + 31522 + 31523 000045CF 8B0E[199C] mov cx,[NXTADD] + 31524 000045D3 E313 jcxz NOFIRSTDEST ; no data, everything ok + 31525 000045D5 B01A mov al,1Ah + 31526 000045D7 06 push es + 31527 000045D8 31FF xor di,di + 31528 000045DA 8E06[F79B] mov es,[TPA] + 31529 000045DE F2AE repne scasb ; scan for EOF + 31530 000045E0 07 pop es + 31531 000045E1 7505 jnz short NOFIRSTDEST ; no ^z in buffer, everything ok + 31532 000045E3 4F dec di ; point at ^z + 31533 000045E4 893E[199C] mov [NXTADD],di ; new buffer length + 31534 + 31535 NOFIRSTDEST: + 31536 000045E8 BB[3A9D] mov bx,DIRBUF+1 ; Source of replacement chars + 31537 000045EB 803E[089C]00 cmp byte [Concat],0 + 31538 000045F0 7403 jz short GOTCHRSRC ; Not a concat + 31539 000045F2 BB[809D] mov bx,SDIRBUF+1 ; Source of replacement chars + 31540 GOTCHRSRC: + 31541 000045F5 BE[F79C] mov si,DestFcb+1 ; Original dest name + 31542 000045F8 8B3E[BB9D] mov di,[DestTail] ; Where to put result + 31543 + 31544 ; --------------- S U B R O U T I N E --------------------------------------- + 31545 + 31546 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31547 BUILDNAME: + 31548 000045FC B90800 mov cx,8 + 31549 BUILDMAIN: + 31550 000045FF AC lodsb + 31551 00004600 3C3F cmp al,'?' + 31552 00004602 7502 jne short NOTAMBIG + 31553 00004604 8A07 mov al,[bx] + 31554 NOTAMBIG: + 31555 00004606 3C20 cmp al,' ' + 31556 00004608 7401 je short NOSTORE + 31557 0000460A AA stosb + 31558 NOSTORE: + 31559 0000460B 43 inc bx + 31560 0000460C E2F1 loop BUILDMAIN + 31561 0000460E B103 mov cl,3 + 31562 ;mov al,' ' ; 20h + 31563 ;cmp [si],al + 31564 ; 27/03/2023 + 31565 00004610 803C20 cmp byte [si],20h ; ' ' + 31566 00004613 7412 je short ENDDEST ; No extension + 31567 ;mov al,[DOT_CHR] + 31568 ; 27/03/2023 + 31569 00004615 B02E mov al,'.' ; 2Eh ; dot_chr + 31570 00004617 AA stosb + 31571 BUILDEXT: + 31572 00004618 AC lodsb + 31573 00004619 3C3F cmp al,'?' + 31574 0000461B 7502 jne short NOTAMBIGE + 31575 0000461D 8A07 mov al,[bx] + 31576 NOTAMBIGE: + 31577 0000461F 3C20 cmp al,' ' + 31578 00004621 7401 je short NOSTOREE + 31579 00004623 AA stosb + 31580 NOSTOREE: + 31581 00004624 43 inc bx + 31582 00004625 E2F1 loop BUILDEXT + 31583 ENDDEST: + 31584 00004627 30C0 xor al,al + 31585 00004629 AA stosb ; NUL terminate + 31586 0000462A C3 retn + 31587 + 31588 ; =============== S U B R O U T I N E ======================================= + 31589 + 31590 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31591 ; 28/03/2023 + 31592 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 31593 ; 10/08/2024 - Retro DOS v5.0 COMMAND.COM + 31594 BUILDPATH: + 31595 0000462B F6460402 test byte [bp+VARSTRUC.INFO],2 ; test byte [bp+4],2 + 31596 0000462F 7540 jnz short NOTPFILE ; If ambig don't bother with open + 31597 00004631 89EA mov dx,bp ; Set DX to spec + 31598 00004633 83C205 add dx,VARSTRUC.BUF ; add dx,5 + 31599 + 31600 ; 27/03/2023 + 31601 ; MSDOS 6.0 + 31602 00004636 57 push di ;AN000; + 31603 00004637 B8006C mov ax,(ExtOpen<<8) ; 6C00h ;AC000; open the file + 31604 + 31605 ; 10/08/2024 - PCDOS 7.1 COMMAND.COM + 31606 %if 0 + 31607 ;mov bx,deny_none|read_open_mode + 31608 mov bx,40h ; open mode for COPY ;M046 + 31609 %endif + 31610 0000463A 31C9 xor cx,cx ;AN000; no special files + 31611 0000463C 89D6 mov si,dx ;AN030; get file name offset + 31612 ;mov dx,read_open_flag ;AN000; set up open flags + 31613 0000463E BA0101 mov dx,101h + 31614 00004641 CD21 INT 21h + 31615 00004643 5F pop di ;AN000; + 31616 00004644 7315 jnc short PURE_FILE ;AN022; is pure file + 31617 00004646 E802DA call get_ext_error_number ;AN022; get the extended error + 31618 ;cmp ax,2 + 31619 00004649 83F802 cmp ax,ERROR_FILE_NOT_FOUND ;AN022; if file not found - okay + 31620 0000464C 7423 jz short NOTPFILE ;AN022; + 31621 ;cmp ax,3 + 31622 0000464E 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found - okay + 31623 00004651 741E jz short NOTPFILE ;AN022; + 31624 ;cmp ax,5 + 31625 00004653 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied - okay + 31626 00004656 7419 jz short NOTPFILE ;AN022; + 31627 00004658 E925D7 jmp extend_setup ;AN022; exit with error + 31628 + 31629 ; 27/03/2023 + 31630 ; MSDOS 3.3 + 31631 ;mov ax,OPEN*256 ; 3D00h + 31632 ;int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE + 31633 ; ; DS:DX -> ASCIZ filename + 31634 ; ; AL = access mode + 31635 ; ; 0 - read + 31636 ;jc short NOTPFILE + 31637 + 31638 PURE_FILE: + 31639 0000465B 89C3 mov bx,ax + 31640 0000465D B80044 mov ax,IOCTL*256 ; 4400h + 31641 00004660 CD21 int 21h ; DOS - 2+ - IOCTL - GET DEVICE INFORMATION + 31642 ; BX = file or device handle + 31643 00004662 B43E mov ah,CLOSE ;3Eh + 31644 00004664 CD21 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE + 31645 ; BX = file handle + 31646 ; 18/04/2023 + 31647 00004666 F6C280 test dl,80h + 31648 ;test dl,devid_ISDEV ; test dl,80h + 31649 00004669 7553 jnz short ISADEV + 31650 0000466B F6460404 test byte [bp+VARSTRUC.INFO],4 ; test byte [bp+4],4 + 31651 0000466F 744D jz short ISADEV + 31652 NOTPFILE: + 31653 00004671 8B5605 mov dx,[bp+VARSTRUC.BUF] ; mov dx,[bp+5] + 31654 + 31655 ; 27/03/2023 + 31656 ; MSDOS 6.0 + 31657 00004674 80FA00 cmp dl,0 ;AN034; If no drive specified, get + 31658 00004677 7405 je short SET_DRIVE_SPEC ;AN034; default drive dir + 31659 + 31660 00004679 80FE3A cmp dh,':' + 31661 0000467C 7402 je short DRVSPEC5 + 31662 SET_DRIVE_SPEC: + 31663 0000467E B240 mov dl,'@' ; 40h + 31664 DRVSPEC5: + 31665 00004680 80CA20 or dl,20h + 31666 00004683 80EA60 sub dl,60h ; A = 1 + 31667 00004686 E8CCE2 call SAVUDIR1 + 31668 + 31669 ; 27/03/2023 + 31670 ; MSDOS 6.0 + 31671 00004689 7306 jnc short CURDIR_OK ;AN022; if error - exit + 31672 0000468B E8BDD9 call get_ext_error_number ;AN022; get the extended error + 31673 0000468E E9EFD6 jmp extend_setup ;AN022; exit with error + 31674 + 31675 CURDIR_OK: + 31676 00004691 89EA mov dx,bp + 31677 ;add dx,5 + 31678 00004693 83C205 add dx,VARSTRUC.BUF ; Set DX for upcomming CHDIRs + 31679 ;mov bh,[bp+4] + 31680 00004696 8A7E04 mov bh,[bp+VARSTRUC.INFO] + 31681 00004699 80E706 and bh,6 + 31682 0000469C 80FF06 cmp bh,6 ; Ambig and path ? + 31683 0000469F 7518 jne short CHECKAMB ; jmp if no + 31684 ;mov si,[bp+2] + 31685 000046A1 8B7602 mov si,[bp+VARSTRUC.TTAIL] + 31686 000046A4 B33A mov bl,':' + 31687 000046A6 385CFE cmp [si-2],bl + 31688 000046A9 7506 jne short KNOWNOTSPEC + 31689 ;mov byte [bp+VARSTRUC.ISDIR],2 + 31690 ; Know is d:/file + 31691 ;mov byte [bp+0],2 + 31692 000046AB C6460002 mov byte [bp],2 + 31693 000046AF EB05 jmp short DOPCDJ + 31694 KNOWNOTSPEC: + 31695 ;mov byte [bp+VARSTRUC.ISDIR],1 + 31696 ; Know is path/file + 31697 ;mov byte [bp+0],1 + 31698 000046B1 C6460001 mov byte [bp],1 + 31699 000046B5 4E dec si + 31700 DOPCDJ: + 31701 000046B6 E98300 jmp DOPCD + 31702 CHECKAMB: + 31703 000046B9 80FF02 cmp bh,2 + 31704 000046BC 7505 jnz short CHECKCD + 31705 ISSIMPFILE: + 31706 ISADEV: + 31707 ;mov byte [bp+VARSTRUC.ISDIR],0 + 31708 ;mov byte [bp+0],0 + 31709 000046BE C6460000 mov byte [bp],0 + 31710 000046C2 C3 retn + 31711 CHECKCD: + 31712 000046C3 E84EEA call SetRest1 + 31713 000046C6 B43B mov ah,CHDir ; 3Bh + 31714 000046C8 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 31715 ; DS:DX -> ASCIZ directory name (may include drive) + 31716 000046CA 7239 jb short NOTPDIR + 31717 000046CC 89D7 mov di,dx + 31718 000046CE 31C0 xor ax,ax + 31719 000046D0 89C1 mov cx,ax + 31720 000046D2 49 dec cx + 31721 ; 14/06/2023 + 31722 ;repne scasb ; MSDOS 3.3 + 31723 + 31724 ; 27/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31725 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:424Ah) + 31726 ; MSDOS 6.0 + 31727 Kloop: ;AN000; 3/3/KK + 31728 000046D3 268A05 mov al,[es:di] ;AN000; 3/3/KK + 31729 000046D6 47 inc di ;AN000; 3/3/KK + 31730 000046D7 08C0 or al,al ;AN000; 3/3/KK + 31731 000046D9 740C jz short DONE ;AN000; 3/3/KK + 31732 000046DB 30E4 xor ah,ah ;AN000; 3/3/KK + 31733 000046DD E881E0 call testkanj ;AN000; 3/3/KK + 31734 000046E0 74F1 jz short Kloop ;AN000; 3/3/KK + 31735 000046E2 47 inc di ;AN000; 3/3/KK + 31736 000046E3 FEC4 inc ah ;AN000; 3/3/KK + 31737 000046E5 EBEC jmp short Kloop ;AN000; 3/3/KK + 31738 DONE: + 31739 000046E7 4F dec di + 31740 000046E8 A0[FA9B] mov al,[DIRCHAR] + 31741 ;mov byte [bp+VARSTRUC.ISDIR],2 ; assume d:/file + 31742 ;mov byte [bp+0],2 + 31743 000046EB C6460002 mov byte [bp],2 + 31744 ; 27/03/2023 + 31745 ; MSDOS 6.0 + 31746 000046EF 08E4 or ah,ah ;AN000; 3/3/KK + 31747 000046F1 7505 jnz short _STORE_PCHAR ;AN000; 3/3/KK + 31748 ;this is the trailing byte of ECS code + 31749 ; + 31750 000046F3 3A45FF cmp al,[di-1] + 31751 000046F6 7405 jz short GOTSRCSLSH + 31752 _STORE_PCHAR: + 31753 000046F8 AA stosb + 31754 ;mov byte [bp+VARSTRUC.ISDIR],1 ; know path/file + 31755 ;mov byte [bp+0],1 + 31756 000046F9 C6460001 mov byte [bp],1 + 31757 GOTSRCSLSH: + 31758 ;or byte [bp+4],6 + 31759 000046FD 804E0406 or byte [bp+VARSTRUC.INFO],6 + 31760 00004701 E87400 call SETSTARS + 31761 NOTPDIR_RETN: + 31762 00004704 C3 retn + 31763 + 31764 ; 28/03/2023 + 31765 NOTPDIR: + 31766 ; MSDOS 6.0 + 31767 00004705 E843D9 call get_ext_error_number ;AN022; get the extended error + 31768 ;cmp ax,3 + 31769 00004708 83F803 cmp ax,ERROR_PATH_NOT_FOUND ;AN022; if path not found - okay + 31770 0000470B 7405 je short NOTPDIR_TRY ;AN022; + 31771 ;cmp ax,5 + 31772 0000470D 83F805 cmp ax,ERROR_ACCESS_DENIED ;AN022; if access denied - okay + 31773 00004710 7560 jne short EXTEND_SETUPJ ;AN022; otherwise - exit error + 31774 NOTPDIR_TRY: + 31775 ; MSDOS 3.3 (& MSDOS 6.0) + 31776 ;mov byte [bp+VARSTRUC.ISDIR],0 + 31777 ;mov byte [bp+0],0 + 31778 00004712 C6460000 mov byte [bp],0 + 31779 ;mov bh,[bp+4] + 31780 00004716 8A7E04 mov bh,[bp+VARSTRUC.INFO] + 31781 00004719 F6C704 test bh,4 + 31782 0000471C 74E6 jz short NOTPDIR_RETN ; Know pure file, no path seps + 31783 ;mov byte [bp+VARSTRUC.ISDIR],2 ; assume d:/file + 31784 ;mov byte [bp+0],2 + 31785 0000471E C6460002 mov byte [bp],2 + 31786 ;mov si,[bp+2] + 31787 00004722 8B7602 mov si,[bp+VARSTRUC.TTAIL] + 31788 00004725 803C00 cmp byte [si],0 + 31789 00004728 744B je short BADCDERRJ2 ; Trailing '/' + 31790 ;mov bl,[DOT_CHR] + 31791 ; 28/03/2023 - Retro DOS v4.0 COMMAND.COM + 31792 ; MSDOS 6.0 (& 5.0) COMMAND.COM + 31793 0000472A B32E mov bl,'.' ; 2Eh ; dot_chr + 31794 0000472C 381C cmp [si],bl + 31795 0000472E 7445 je short BADCDERRJ2 ; If . or .. pure cd should have worked + 31796 00004730 B33A mov bl,':' ; 3Ah + 31797 00004732 385CFE cmp [si-2],bl + 31798 00004735 7405 je short DOPCD ; Know d:/file + 31799 ;mov byte [bp+VARSTRUC.ISDIR],1 + 31800 ; Know path/file + 31801 ;mov byte [bp+0],1 + 31802 00004737 C6460001 mov byte [bp],1 + 31803 0000473B 4E dec si ; Point at last '/' + 31804 DOPCD: + 31805 0000473C 30DB xor bl,bl + 31806 0000473E 861C xchg bl,[si] ; Stick in a NUL + 31807 00004740 E8D1E9 call SetRest1 + 31808 + 31809 ; 28/03/2023 + 31810 ; MSDOS 6.0 (& MSDOS 5.0) + 31811 00004743 39F2 cmp dx,si ;AN000; 3/3/KK + 31812 00004745 771B ja short LookBack ;AN000; 3/3/KK + 31813 00004747 56 push si ;AN000; 3/3/KK + 31814 00004748 51 push cx ;AN000; 3/3/KK + 31815 00004749 89F1 mov cx,si ;AN000; 3/3/KK + 31816 0000474B 89D6 mov si,dx ;AN000; 3/3/KK + 31817 Kloop2: ;AN000; 3/3/KK + 31818 0000474D AC lodsb ;AN000; 3/3/KK + 31819 0000474E E810E0 call testkanj ;AN000; 3/3/KK + 31820 00004751 7409 jz short NotKanj4 ;AN000; 3/3/KK + 31821 00004753 AC lodsb ;AN000; 3/3/KK + 31822 00004754 39CE cmp si,cx ;AN000; 3/3/KK + 31823 00004756 72F5 jb short Kloop2 ;AN000; 3/3/KK + 31824 00004758 59 pop cx ;AN000; 3/3/KK + 31825 00004759 5E pop si ;AN000; 3/3/KK + 31826 0000475A EB0B jmp short DoCdr ;AN000; 3/3/KK Last char is ECS code, don't check for + 31827 ; trailing path sep + 31828 NotKanj4: ;AN000; 3/3/KK + 31829 0000475C 39CE cmp si,cx ;AN000; 3/3/KK + 31830 0000475E 72ED jb short Kloop2 ;AN000; 3/3/KK + 31831 00004760 59 pop cx ;AN000; 3/3/KK + 31832 00004761 5E pop si ;AN000; 3/3/KK + 31833 LookBack: ;AN000; 3/3/KK + 31834 ; 28/03/2023 + 31835 ; MSDOS 3.3 & MSDOS 6.0 + 31836 00004762 3A5CFF cmp bl,[si-1] ; if double slash, then complain. + 31837 00004765 740E je short BADCDERRJ2 + 31838 DoCdr: + 31839 00004767 B43B mov ah,CHDir ; 3Bh + 31840 00004769 CD21 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) + 31841 ; DS:DX -> ASCIZ directory name (may include drive) + 31842 0000476B 861C xchg bl,[si] + 31843 0000476D 7395 jnc short NOTPDIR_RETN + 31844 + 31845 ; 28/03/2023 + 31846 ; MSDOS 3.3 + 31847 ;BADCDERRJ2: + 31848 ;stc + 31849 ;jmp BADCDERR + 31850 + 31851 ; 28/03/2023 + 31852 ; MSDOS 6.0 (& MSDOS 5.0) + 31853 0000476F E8D9D8 call get_ext_error_number ;AN022; get the extended error + 31854 EXTEND_SETUPJ: ;AN022; + 31855 00004772 E90BD6 jmp extend_setup ;AN022; go issue the error message + 31856 BADCDERRJ2: + 31857 00004775 E905D6 jmp badpath_err ;AC022; go issue path not found message + 31858 + 31859 ; =============== S U B R O U T I N E ======================================= + 31860 + 31861 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31862 SETSTARS: + 31863 ;mov [bp+2],di + 31864 00004778 897E02 mov [bp+VARSTRUC.TTAIL],di + 31865 ;add byte [bp+1],12 + 31866 0000477B 8046010C add byte [bp+VARSTRUC.SIZ],12 + 31867 ;;mov ax,[DOT_QMARK] ; '?.' (2E3Fh) + 31868 ; 28/03/2023 + 31869 ; MSDOS 6.0 + 31870 0000477F B83F2E mov ax,dot_qmark ; 2E3Fh + 31871 ;mov ax,'?.' ; dot_qmark + 31872 + 31873 00004782 B90800 mov cx,8 + 31874 00004785 F3AA rep stosb + 31875 00004787 86C4 xchg al,ah + 31876 00004789 AA stosb + 31877 0000478A 86C4 xchg al,ah + 31878 0000478C B103 mov cl,3 + 31879 0000478E F3AA rep stosb + 31880 00004790 30C0 xor al,al + 31881 00004792 AA stosb + 31882 00004793 C3 retn + 31883 + 31884 ; =============== S U B R O U T I N E ======================================= + 31885 + 31886 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31887 ; 12/06/2023 - Retro DOS v4.2 COMMAND.COM + 31888 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 31889 COMPNAME: + 31890 00004794 BE[BE9D] mov si,DestBuf ; do name translate of target + 31891 00004797 BF[7A99] mov di,TRGXNAME ; save for name comparison + 31892 0000479A B460 mov ah,xNameTrans ; 60h + 31893 ;mov ah,60h + 31894 0000479C CD21 int 21h ; DOS - RESOLVE PATH STRING TO CANONICAL PATH STRING + 31895 ; DS:SI -> ASCIZ relative path string or directory name + 31896 ; ES:DI -> 128-byte buffer for ASCIZ canonical fully qualified name + 31897 0000479E BE[2399] mov si,SRCXNAME ; get name translate of source + 31898 000047A1 BF[7A99] mov di,TRGXNAME ; get name translate of target + 31899 ;call STRCOMP + 31900 ;retn + 31901 ; 28/03/2023 + 31902 000047A4 E921E2 jmp STRCOMP + 31903 + 31904 ;============================================================================ + 31905 ; CPARSE.ASM, MSDOS 6.0, 1991 + 31906 ;============================================================================ + 31907 ; 30/09/2018 - Retro DOS v3.0 + 31908 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31909 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 31910 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 31911 + 31912 ;-----------------------------------------------------------------------; + 31913 ; ENTRY: ; + 31914 ; DS:SI Points input buffer ; + 31915 ; ES:DI Points to the token buffer ; + 31916 ; BL Special delimiter for this call ; + 31917 ; Always checked last ; + 31918 ; set it to space if there is no special delimiter ; + 31919 ; EXIT: ; + 31920 ; DS:SI Points to next char in the input buffer ; + 31921 ; ES:DI Points to the token buffer ; + 31922 ; [STARTEL] Points to start of last element of path in token ; + 31923 ; points to a NUL for no element strings 'd:' 'd:/' ; + 31924 ; CX Character count ; + 31925 ; BH Condition Code ; + 31926 ; Bit 1H of BH set if switch character ; + 31927 ; Token buffer contains char after ; + 31928 ; switch character ; + 31929 ; BP has switch bits set (ORing only) ; + 31930 ; Bit 2H of BH set if ? or * in token ; + 31931 ; if * found element ? filled ; + 31932 ; Bit 4H of BH set if path sep in token ; + 31933 ; Bit 80H of BH set if the special delimiter ; + 31934 ; was skipped at the start of this token ; + 31935 ; Token buffer always starts d: for non switch tokens ; + 31936 ; CARRY SET ; + 31937 ; if CR on input ; + 31938 ; token buffer not altered ; + 31939 ; ; + 31940 ; DOES NOT RETURN ON BAD PATH, OR TRAILING SWITCH CHAR ERROR ; + 31941 ; MODIFIES: ; + 31942 ; CX, SI, AX, BH, DX and the Carry Flag ; + 31943 ; ; + 31944 ;-----------------------------------------------------------------------; + 31945 + 31946 ; Modifications to cparse: recognition of right and left parentheses + 31947 ; as integral tokens, and removal of automatic upper-case conversion code. + 31948 ; + 31949 ; Both modifications were installed in the course of adding a coherent + 31950 ; command-line parser to COMMAND.COM which builds a UNIX-style argv[]/argc + 31951 ; structure for command-line arguments. This parser relies on cparse to + 31952 ; recognize individual tokens. + 31953 ; + 31954 ; To process for-loops correctly, parentheses must therefore be + 31955 ; recognized as tokens. The upper-case conversion code was removed so + 31956 ; that commands (such as for and echo) would be able to use the "original" + 31957 ; text of the command line. 31958 ; - 31959 ; Also note that BP is also clobbered if cparse recognizes any switches - 31960 ; on the command line. + 31959 ; Note also the modification to prevent the automatic conversion of colons + 31960 ; into spaces WITHIN THE SOURCE TEXT! 31961 ; - 31962 ; Alan L, OS/MSDOS 14 August 1983 - 31963 - 31964 ; --------------------------------------------------------------------------- - 31965 - 31966 ; COMEQU.ASM (MSDOS 6.0, 1991) - 31967 - 31968 ;FSWITCH EQU 8000h - 31969 ;FBADSWITCH EQU 4000h + 31962 ; Also note that BP is also clobbered if cparse recognizes any switches + 31963 ; on the command line. + 31964 ; + 31965 ; Alan L, OS/MSDOS 14 August 1983 + 31966 + 31967 ; --------------------------------------------------------------------------- + 31968 + 31969 ; COMEQU.ASM (MSDOS 6.0, 1991) 31970 - 31971 ; MSDOS 3.3 COMMAND.COM (1987) Transient portion offset 3334h - 31972 - 31973 ; =============== S U B R O U T I N E ======================================= - 31974 - 31975 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 31976 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 431Fh - 31977 - 31978 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 31979 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 4AE3h + 31971 ;FSWITCH EQU 8000h + 31972 ;FBADSWITCH EQU 4000h + 31973 + 31974 ; MSDOS 3.3 COMMAND.COM (1987) Transient portion offset 3334h + 31975 + 31976 ; =============== S U B R O U T I N E ======================================= + 31977 + 31978 ; 28/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 31979 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 431Fh 31980 - 31981 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 31982 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 49ABh - 31983 cparse: - 31984 000047A7 31C0 xor ax,ax - 31985 000047A9 893E[F69E] mov [STARTEL],di ; No path element (Is DI correct?) - 31986 000047AD A2[F99E] mov [ELPOS],al ; Start in 8 char prefix - 31987 ; MSDOS 3.3 - 31988 ;mov [SOURCE],al - 31989 ; MSDOS 6.0 - 31990 000047B0 A2[FA9E] mov [SKPDEL], al ; No skip delimiter yet - 31991 000047B3 88C7 mov bh,al ; Init nothing - 31992 000047B5 9C pushf ; save flags - 31993 000047B6 57 push di ; save the token buffer addrss - 31994 000047B7 31C9 xor cx,cx ; no chars in token buffer - 31995 000047B9 880E[959D] mov [comma],cl ; reset comma flag - 31996 moredelim: - 31997 000047BD AC lodsb - 31998 000047BE E8CDE1 call DELIM - 31999 000047C1 751D jnz short SCANCDONE - 32000 000047C3 3C20 cmp al,' ' - 32001 000047C5 74F6 jz short moredelim - 32002 000047C7 3C09 cmp al,9 - 32003 000047C9 74F2 jz short moredelim - 32004 ;xchg al,[SOURCE] - 32005 ; 28/03/2023 - 32006 000047CB 8606[FA9E] xchg al,[SKPDEL] - 32007 000047CF 08C0 or al,al - 32008 000047D1 74EA jz short moredelim ; One non space/tab delimiter allowed - 32009 000047D3 F6C780 test bh,80h ; has a special char been found? - 32010 000047D6 7405 jz short no_comma ; no - just exit - 32011 000047D8 C606[959D]01 mov byte [comma],1 ; set comma flag - 32012 no_comma: - 32013 000047DD E92A01 jmp x_done ; Nul argument - 32014 - 32015 SCANCDONE: - 32016 ; 28/03/2023 - 32017 ; MSDOS 6.0 - 32018 ; ----------------------------------- - 32019 ; Mod to avoid upper-case conversion. - 32020 ; ----------------------------------- - 32021 ; MSDOS 3.3 - 32022 ;cmp byte [CPYFLAG],1 ; 3/3/KK - 32023 ;jnz short cpcont1 ; 3/3/KK - 32024 ;call UPCONV_MAPCALL ; 3/3/KK - 32025 cpcont1: - 32026 ; ----------------------------------- - 32027 ; 28/03/2023 - 32028 000047E0 38D8 cmp al,bl ; Special delimiter? - 32029 000047E2 7505 jne short nospec - 32030 000047E4 80CF80 or bh,80h - 32031 000047E7 EBD4 jmp short moredelim - 32032 nospec: - 32033 000047E9 3C0D cmp al,0Dh ; a CR? - 32034 000047EB 7503 jne short ncperror - 32035 000047ED E91501 jmp cperror - 32036 ncperror: - 32037 000047F0 3A06[F99B] cmp al,[SWITCHAR] ; is the char the switch char? - 32038 000047F4 7503 jne short na_switch ; yes, process... - 32039 000047F6 E91401 jmp a_switch - 32040 na_switch: - 32041 000047F9 B23A mov dl,':' - 32042 000047FB 3814 cmp [si],dl - 32043 000047FD 751D jne short anum_chard ; Drive not specified - 32044 ; 28/03/2023 - 32045 ; MSDOS 6.0 - 32046 000047FF 803E[A49D]01 cmp byte [cpyflag],1 ; 3/3/KK - 32047 00004804 7503 jne short cpcont2 ; 3/3/KK - 32048 00004806 E882DF call UPCONV ; 3/3/KK - 32049 cpcont2: - 32050 00004809 E85901 call move_char - 32051 0000480C AC lodsb ; Get the ':' - 32052 0000480D E85501 call move_char - 32053 00004810 893E[F69E] mov [STARTEL],di - 32054 00004814 C606[F89E]00 mov byte [ELCNT],0 - 32055 00004819 E9B300 jmp anum_test - 32056 anum_chard: - 32057 0000481C 893E[F69E] mov [STARTEL],di - 32058 00004820 C606[F89E]00 mov byte [ELCNT],0 ; Store of this char sets it to one - 32059 00004825 803E[A49D]01 cmp byte [cpyflag],1 ; Was CPARSE called from COPY? - 32060 0000482A 751D jnz short anum_char ; No, don't add drive spec. - 32061 0000482C E8E5E1 call pathchrcmp ; Starts with a pathchar? - 32062 0000482F 7518 jnz short anum_char ; no - 32063 00004831 50 push ax - 32064 00004832 A0[079C] mov al,[CURDRV] ; Insert drive spec - 32065 ;add al,[CAPITAL_A] - 32066 ; 28/03/2023 - 32067 ; MSDOS 6.0 - 32068 00004835 0441 add al,'A' ; 41h - 32069 00004837 E82B01 call move_char - 32070 0000483A B03A mov al,':' ; 3Ah - 32071 0000483C E82601 call move_char - 32072 0000483F 58 pop ax - 32073 00004840 893E[F69E] mov [STARTEL],di - 32074 00004844 C606[F89E]00 mov byte [ELCNT],0 - 32075 anum_char: - 32076 ; 28/03/2023 - 32077 ; MSDOS 6.0 - 32078 00004849 E815DF call testkanj ;AC048 - 32079 0000484C 7406 jz short NOTKANJ ;AC048; - 32080 0000484E E81401 call move_char - 32081 00004851 AC lodsb - 32082 00004852 EB78 jmp short notspecial - 32083 - 32084 NOTKANJ: ;AN048; If not kanji - 32085 00004854 803E[A49D]01 cmp byte [cpyflag],1 ;AN048; and if we're in COPY - 32086 00004859 7503 jne short TESTDOT ;AN048; - 32087 0000485B E82DDF call UPCONV ;AN048; upper case the char - 32088 TESTDOT: - 32089 ; 28/03/2023 - 32090 ;cmp al,dot_chr ; 2Eh - 32091 0000485E 3C2E cmp al,'.' - 32092 00004860 7509 jne short testquest - 32093 00004862 FE06[F99E] inc byte [ELPOS] ; flag in extension - 32094 00004866 C606[F89E]FF mov byte [ELCNT],0FFh ; Store of the '.' resets it to 0 - 32095 testquest: - 32096 0000486B 3C3F cmp al,'?' ; 3Fh - 32097 0000486D 7503 jnz short testsplat - 32098 0000486F 80CF02 or bh,2 - 32099 testsplat: - 32100 ;cmp al,[STAR] - 32101 00004872 3C2A cmp al,star ; 2Ah - 32102 ; 27/04/2023 - 32103 ;cmp al,'*' - 32104 00004874 7530 jne short testpath - 32105 00004876 80CF02 or bh,2 - 32106 00004879 803E[329F]00 cmp byte [expand_star],0 - 32107 0000487E 7504 jne short expand_filename - 32108 00004880 EB24 jmp short testpath - 32109 - 32110 BADPERR2J: - 32111 ;jmp BADPERR2 - 32112 ; 28/03/2023 - 32113 ; MSDOS 6.0 - 32114 00004882 EB75 jmp short BADPERR2 - 32115 - 32116 expand_filename: - 32117 00004884 B407 mov ah,7 - 32118 00004886 803E[F99E]00 cmp byte [ELPOS],0 - 32119 0000488B 7402 jz short gotelcnt - 32120 0000488D B402 mov ah,2 - 32121 gotelcnt: - 32122 0000488F B03F mov al,'?' - 32123 00004891 2A26[F89E] sub ah,[ELCNT] - 32124 00004895 72EB jb short BADPERR2J - 32125 00004897 86E1 xchg ah,cl - 32126 00004899 E309 jcxz testpathx - 32127 qmove: - 32128 0000489B 86E1 xchg ah,cl - 32129 0000489D E8C500 call move_char - 32130 000048A0 86E1 xchg ah,cl - 32131 000048A2 E2F7 loop qmove - 32132 testpathx: - 32133 000048A4 86E1 xchg ah,cl - 32134 testpath: - 32135 000048A6 E86BE1 call pathchrcmp - 32136 000048A9 7521 jnz short notspecial - 32137 000048AB 80CF04 or bh,4 - 32138 000048AE 803E[329F]00 cmp byte [expand_star],0 - 32139 000048B3 7405 jz short no_err_check - 32140 000048B5 F6C702 test bh,2 ; If just hit a '/', cannot have ? or * yet - 32141 000048B8 7545 jnz short BADPERR - 32142 no_err_check: - 32143 000048BA 893E[F69E] mov [STARTEL],di ; New element - 32144 000048BE FF06[F69E] inc word [STARTEL] ; Point to char after / - 32145 000048C2 C606[F89E]FF mov byte [ELCNT],0FFh ; Store of '/' sets it to 0 - 32146 000048C7 C606[F99E]00 mov byte [ELPOS],0 - 32147 notspecial: - 32148 000048CC E89600 call move_char ; just an alphanum string - 32149 anum_test: - 32150 000048CF AC lodsb - 32151 - 32152 ; 28/03/2023 - 32153 ; MSDOS 6.0 - 32154 ; ----------------------------------- - 32155 ; Mod to avoid upper-case conversion. - 32156 ; ----------------------------------- - 32157 ; MSDOS 3.3 - 32158 ;cmp byte [CPYFLAG],1 ; 3/3/KK - 32159 ;jnz short cpcont3 ; 3/3/KK - 32160 ;call UPCONV_MAPCALL ; 3/3/KK - 32161 cpcont3: - 32162 ; ----------------------------------- - 32163 - 32164 000048D0 E8BBE0 call DELIM - 32165 000048D3 7435 jz short x_done - 32166 000048D5 3C0D cmp al,0Dh - 32167 000048D7 7431 je short x_done - 32168 000048D9 3A06[F99B] cmp al,[SWITCHAR] - 32169 000048DD 742B je short x_done - 32170 000048DF 38D8 cmp al,bl - 32171 000048E1 7427 je short x_done - 32172 000048E3 3C3A cmp al,':' ; ':' allowed as trailer because of devices - 32173 ; 28/03/2023 - 32174 ; MSDOS 3.3 - 32175 ;jnz short ANUM_CHARJ - 32176 ; MSDOS 6.0 - 32177 000048E5 7403 je short FOO15 - 32178 000048E7 E95FFF jmp anum_char - 32179 - 32180 ; Modification made for parseline. - 32181 ; Why would it be necessary to change colons to spaces? In this - 32182 ; case, EVERY colon is changed to a space; e.g., 'f:' yields 'f ', - 32183 ; but so does 'echo foo:bar' yield 'echo foo bar'. - 32184 - 32185 FOO15: - 32186 000048EA 803E[A49D]02 cmp byte [cpyflag],2 - 32187 000048EF 7505 jnz short cpcont4 - 32188 000048F1 E87100 call move_char - 32189 000048F4 EBD9 jmp short anum_test - 32190 cpcont4: - 32191 000048F6 46 inc si ; Skip the ':' - 32192 000048F7 EB11 jmp short x_done - 32193 - 32194 ; 28/03/2023 - 32195 ;ANUM_CHARJ: - 32196 ;jmp anum_char - 32197 - 32198 BADPERR2: - 32199 000048F9 BA[E88F] mov dx,BADCPMES_PTR - 32200 000048FC E927E4 jmp cerror - 32201 - 32202 BADPERR: - 32203 ; 28/03/2023 - 32204 ;jmp BADCDERR ; MSDOS 3.3 - 32205 BADCDERR: - 32206 ; MSDOS 6.0 - 32207 000048FF BA[3791] mov dx,badcd_ptr ;AC022; Issue "Invalid Directory" - 32208 00004902 E921E4 jmp cerror ;AC022; message - 32209 - 32210 cperror: - 32211 00004905 4E dec si ; adjust the pointer - 32212 00004906 5F pop di ; retrieve token buffer address - 32213 00004907 9D popf ; restore flags - 32214 00004908 F9 stc ; set the carry bit - 32215 00004909 C3 retn - 32216 - 32217 x_done: - 32218 0000490A 4E dec si ; adjust for next round + 31981 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 31982 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 4AE3h + 31983 + 31984 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 31985 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 49ABh + 31986 cparse: + 31987 000047A7 31C0 xor ax,ax + 31988 000047A9 893E[F69E] mov [STARTEL],di ; No path element (Is DI correct?) + 31989 000047AD A2[F99E] mov [ELPOS],al ; Start in 8 char prefix + 31990 ; MSDOS 3.3 + 31991 ;mov [SOURCE],al + 31992 ; MSDOS 6.0 + 31993 000047B0 A2[FA9E] mov [SKPDEL], al ; No skip delimiter yet + 31994 000047B3 88C7 mov bh,al ; Init nothing + 31995 000047B5 9C pushf ; save flags + 31996 000047B6 57 push di ; save the token buffer addrss + 31997 000047B7 31C9 xor cx,cx ; no chars in token buffer + 31998 000047B9 880E[959D] mov [comma],cl ; reset comma flag + 31999 moredelim: + 32000 000047BD AC lodsb + 32001 000047BE E8CDE1 call DELIM + 32002 000047C1 751D jnz short SCANCDONE + 32003 000047C3 3C20 cmp al,' ' + 32004 000047C5 74F6 jz short moredelim + 32005 000047C7 3C09 cmp al,9 + 32006 000047C9 74F2 jz short moredelim + 32007 ;xchg al,[SOURCE] + 32008 ; 28/03/2023 + 32009 000047CB 8606[FA9E] xchg al,[SKPDEL] + 32010 000047CF 08C0 or al,al + 32011 000047D1 74EA jz short moredelim ; One non space/tab delimiter allowed + 32012 000047D3 F6C780 test bh,80h ; has a special char been found? + 32013 000047D6 7405 jz short no_comma ; no - just exit + 32014 000047D8 C606[959D]01 mov byte [comma],1 ; set comma flag + 32015 no_comma: + 32016 000047DD E92A01 jmp x_done ; Nul argument + 32017 + 32018 SCANCDONE: + 32019 ; 28/03/2023 + 32020 ; MSDOS 6.0 + 32021 ; ----------------------------------- + 32022 ; Mod to avoid upper-case conversion. + 32023 ; ----------------------------------- + 32024 ; MSDOS 3.3 + 32025 ;cmp byte [CPYFLAG],1 ; 3/3/KK + 32026 ;jnz short cpcont1 ; 3/3/KK + 32027 ;call UPCONV_MAPCALL ; 3/3/KK + 32028 cpcont1: + 32029 ; ----------------------------------- + 32030 ; 28/03/2023 + 32031 000047E0 38D8 cmp al,bl ; Special delimiter? + 32032 000047E2 7505 jne short nospec + 32033 000047E4 80CF80 or bh,80h + 32034 000047E7 EBD4 jmp short moredelim + 32035 nospec: + 32036 000047E9 3C0D cmp al,0Dh ; a CR? + 32037 000047EB 7503 jne short ncperror + 32038 000047ED E91501 jmp cperror + 32039 ncperror: + 32040 000047F0 3A06[F99B] cmp al,[SWITCHAR] ; is the char the switch char? + 32041 000047F4 7503 jne short na_switch ; yes, process... + 32042 000047F6 E91401 jmp a_switch + 32043 na_switch: + 32044 000047F9 B23A mov dl,':' + 32045 000047FB 3814 cmp [si],dl + 32046 000047FD 751D jne short anum_chard ; Drive not specified + 32047 ; 28/03/2023 + 32048 ; MSDOS 6.0 + 32049 000047FF 803E[A49D]01 cmp byte [cpyflag],1 ; 3/3/KK + 32050 00004804 7503 jne short cpcont2 ; 3/3/KK + 32051 00004806 E882DF call UPCONV ; 3/3/KK + 32052 cpcont2: + 32053 00004809 E85901 call move_char + 32054 0000480C AC lodsb ; Get the ':' + 32055 0000480D E85501 call move_char + 32056 00004810 893E[F69E] mov [STARTEL],di + 32057 00004814 C606[F89E]00 mov byte [ELCNT],0 + 32058 00004819 E9B300 jmp anum_test + 32059 anum_chard: + 32060 0000481C 893E[F69E] mov [STARTEL],di + 32061 00004820 C606[F89E]00 mov byte [ELCNT],0 ; Store of this char sets it to one + 32062 00004825 803E[A49D]01 cmp byte [cpyflag],1 ; Was CPARSE called from COPY? + 32063 0000482A 751D jnz short anum_char ; No, don't add drive spec. + 32064 0000482C E8E5E1 call pathchrcmp ; Starts with a pathchar? + 32065 0000482F 7518 jnz short anum_char ; no + 32066 00004831 50 push ax + 32067 00004832 A0[079C] mov al,[CURDRV] ; Insert drive spec + 32068 ;add al,[CAPITAL_A] + 32069 ; 28/03/2023 + 32070 ; MSDOS 6.0 + 32071 00004835 0441 add al,'A' ; 41h + 32072 00004837 E82B01 call move_char + 32073 0000483A B03A mov al,':' ; 3Ah + 32074 0000483C E82601 call move_char + 32075 0000483F 58 pop ax + 32076 00004840 893E[F69E] mov [STARTEL],di + 32077 00004844 C606[F89E]00 mov byte [ELCNT],0 + 32078 anum_char: + 32079 ; 28/03/2023 + 32080 ; MSDOS 6.0 + 32081 00004849 E815DF call testkanj ;AC048 + 32082 0000484C 7406 jz short NOTKANJ ;AC048; + 32083 0000484E E81401 call move_char + 32084 00004851 AC lodsb + 32085 00004852 EB78 jmp short notspecial + 32086 + 32087 NOTKANJ: ;AN048; If not kanji + 32088 00004854 803E[A49D]01 cmp byte [cpyflag],1 ;AN048; and if we're in COPY + 32089 00004859 7503 jne short TESTDOT ;AN048; + 32090 0000485B E82DDF call UPCONV ;AN048; upper case the char + 32091 TESTDOT: + 32092 ; 28/03/2023 + 32093 ;cmp al,dot_chr ; 2Eh + 32094 0000485E 3C2E cmp al,'.' + 32095 00004860 7509 jne short testquest + 32096 00004862 FE06[F99E] inc byte [ELPOS] ; flag in extension + 32097 00004866 C606[F89E]FF mov byte [ELCNT],0FFh ; Store of the '.' resets it to 0 + 32098 testquest: + 32099 0000486B 3C3F cmp al,'?' ; 3Fh + 32100 0000486D 7503 jnz short testsplat + 32101 0000486F 80CF02 or bh,2 + 32102 testsplat: + 32103 ;cmp al,[STAR] + 32104 00004872 3C2A cmp al,star ; 2Ah + 32105 ; 27/04/2023 + 32106 ;cmp al,'*' + 32107 00004874 7530 jne short testpath + 32108 00004876 80CF02 or bh,2 + 32109 00004879 803E[329F]00 cmp byte [expand_star],0 + 32110 0000487E 7504 jne short expand_filename + 32111 00004880 EB24 jmp short testpath + 32112 + 32113 BADPERR2J: + 32114 ;jmp BADPERR2 + 32115 ; 28/03/2023 + 32116 ; MSDOS 6.0 + 32117 00004882 EB75 jmp short BADPERR2 + 32118 + 32119 expand_filename: + 32120 00004884 B407 mov ah,7 + 32121 00004886 803E[F99E]00 cmp byte [ELPOS],0 + 32122 0000488B 7402 jz short gotelcnt + 32123 0000488D B402 mov ah,2 + 32124 gotelcnt: + 32125 0000488F B03F mov al,'?' + 32126 00004891 2A26[F89E] sub ah,[ELCNT] + 32127 00004895 72EB jb short BADPERR2J + 32128 00004897 86E1 xchg ah,cl + 32129 00004899 E309 jcxz testpathx + 32130 qmove: + 32131 0000489B 86E1 xchg ah,cl + 32132 0000489D E8C500 call move_char + 32133 000048A0 86E1 xchg ah,cl + 32134 000048A2 E2F7 loop qmove + 32135 testpathx: + 32136 000048A4 86E1 xchg ah,cl + 32137 testpath: + 32138 000048A6 E86BE1 call pathchrcmp + 32139 000048A9 7521 jnz short notspecial + 32140 000048AB 80CF04 or bh,4 + 32141 000048AE 803E[329F]00 cmp byte [expand_star],0 + 32142 000048B3 7405 jz short no_err_check + 32143 000048B5 F6C702 test bh,2 ; If just hit a '/', cannot have ? or * yet + 32144 000048B8 7545 jnz short BADPERR + 32145 no_err_check: + 32146 000048BA 893E[F69E] mov [STARTEL],di ; New element + 32147 000048BE FF06[F69E] inc word [STARTEL] ; Point to char after / + 32148 000048C2 C606[F89E]FF mov byte [ELCNT],0FFh ; Store of '/' sets it to 0 + 32149 000048C7 C606[F99E]00 mov byte [ELPOS],0 + 32150 notspecial: + 32151 000048CC E89600 call move_char ; just an alphanum string + 32152 anum_test: + 32153 000048CF AC lodsb + 32154 + 32155 ; 28/03/2023 + 32156 ; MSDOS 6.0 + 32157 ; ----------------------------------- + 32158 ; Mod to avoid upper-case conversion. + 32159 ; ----------------------------------- + 32160 ; MSDOS 3.3 + 32161 ;cmp byte [CPYFLAG],1 ; 3/3/KK + 32162 ;jnz short cpcont3 ; 3/3/KK + 32163 ;call UPCONV_MAPCALL ; 3/3/KK + 32164 cpcont3: + 32165 ; ----------------------------------- + 32166 + 32167 000048D0 E8BBE0 call DELIM + 32168 000048D3 7435 jz short x_done + 32169 000048D5 3C0D cmp al,0Dh + 32170 000048D7 7431 je short x_done + 32171 000048D9 3A06[F99B] cmp al,[SWITCHAR] + 32172 000048DD 742B je short x_done + 32173 000048DF 38D8 cmp al,bl + 32174 000048E1 7427 je short x_done + 32175 000048E3 3C3A cmp al,':' ; ':' allowed as trailer because of devices + 32176 ; 28/03/2023 + 32177 ; MSDOS 3.3 + 32178 ;jnz short ANUM_CHARJ + 32179 ; MSDOS 6.0 + 32180 000048E5 7403 je short FOO15 + 32181 000048E7 E95FFF jmp anum_char + 32182 + 32183 ; Modification made for parseline. + 32184 ; Why would it be necessary to change colons to spaces? In this + 32185 ; case, EVERY colon is changed to a space; e.g., 'f:' yields 'f ', + 32186 ; but so does 'echo foo:bar' yield 'echo foo bar'. + 32187 + 32188 FOO15: + 32189 000048EA 803E[A49D]02 cmp byte [cpyflag],2 + 32190 000048EF 7505 jnz short cpcont4 + 32191 000048F1 E87100 call move_char + 32192 000048F4 EBD9 jmp short anum_test + 32193 cpcont4: + 32194 000048F6 46 inc si ; Skip the ':' + 32195 000048F7 EB11 jmp short x_done + 32196 + 32197 ; 28/03/2023 + 32198 ;ANUM_CHARJ: + 32199 ;jmp anum_char + 32200 + 32201 BADPERR2: + 32202 000048F9 BA[E88F] mov dx,BADCPMES_PTR + 32203 000048FC E927E4 jmp cerror + 32204 + 32205 BADPERR: + 32206 ; 28/03/2023 + 32207 ;jmp BADCDERR ; MSDOS 3.3 + 32208 BADCDERR: + 32209 ; MSDOS 6.0 + 32210 000048FF BA[3791] mov dx,badcd_ptr ;AC022; Issue "Invalid Directory" + 32211 00004902 E921E4 jmp cerror ;AC022; message + 32212 + 32213 cperror: + 32214 00004905 4E dec si ; adjust the pointer + 32215 00004906 5F pop di ; retrieve token buffer address + 32216 00004907 9D popf ; restore flags + 32217 00004908 F9 stc ; set the carry bit + 32218 00004909 C3 retn 32219 - 32220 ; Mod to recognize right and left parens as integral tokens. - 32221 ;x_done2: - 32222 0000490B EB51 jmp short out_token - 32223 - 32224 a_switch: - 32225 0000490D 80CF01 or bh,1 ; Indicate switch - 32226 ;or bp,FSWITCH ; 8000h - 32227 ; 28/03/2023 - 32228 00004910 81CD0080 or bp,8000h - 32229 00004914 E86FE0 call scanoff - 32230 00004917 46 inc si - 32231 ; 28/03/2023 - 32232 ; MSDOS 6.0 - 32233 00004918 E846DE call testkanj ;AN057; See if DBCS lead byte - 32234 0000491B 740D jz short a_switch_notkanj ;AN057; no - continue processing - 32235 0000491D E84500 call move_char ;AN057; DBCS - store first byte - 32236 00004920 AC lodsb ;AN057; get second byte - 32237 00004921 E84100 call move_char ;AN057; store second byte - 32238 ;or bp,FBADSWITCH ; 4000h ;AN057; DBCS switch is invalid - 32239 00004924 81CD0040 or bp,4000h - 32240 00004928 EB34 jmp short out_token ;AN057; don't bother checking switch - 32241 a_switch_notkanj: ;AN057; - 32242 0000492A 3C0D cmp al,0Dh - 32243 0000492C 7509 jne short Store_swt - 32244 0000492E B000 mov al,0 - 32245 00004930 AA stosb - 32246 ;or bp,FBADSWITCH ; 4000h - 32247 00004931 81CD0040 or bp,4000h - 32248 00004935 EBCE jmp short cperror ; Trailing switch character error - 32249 ; BP = fSwitch but no switch - 32250 ; bit is set (unknown switch) - 32251 Store_swt: - 32252 00004937 E82B00 call move_char ; store the character - 32253 - 32254 ; This upconv call must stay. It is used to identify copy-switches - 32255 ; on the command line, and won't store anything into the output buffer. + 32220 x_done: + 32221 0000490A 4E dec si ; adjust for next round + 32222 + 32223 ; Mod to recognize right and left parens as integral tokens. + 32224 ;x_done2: + 32225 0000490B EB51 jmp short out_token + 32226 + 32227 a_switch: + 32228 0000490D 80CF01 or bh,1 ; Indicate switch + 32229 ;or bp,FSWITCH ; 8000h + 32230 ; 28/03/2023 + 32231 00004910 81CD0080 or bp,8000h + 32232 00004914 E86FE0 call scanoff + 32233 00004917 46 inc si + 32234 ; 28/03/2023 + 32235 ; MSDOS 6.0 + 32236 00004918 E846DE call testkanj ;AN057; See if DBCS lead byte + 32237 0000491B 740D jz short a_switch_notkanj ;AN057; no - continue processing + 32238 0000491D E84500 call move_char ;AN057; DBCS - store first byte + 32239 00004920 AC lodsb ;AN057; get second byte + 32240 00004921 E84100 call move_char ;AN057; store second byte + 32241 ;or bp,FBADSWITCH ; 4000h ;AN057; DBCS switch is invalid + 32242 00004924 81CD0040 or bp,4000h + 32243 00004928 EB34 jmp short out_token ;AN057; don't bother checking switch + 32244 a_switch_notkanj: ;AN057; + 32245 0000492A 3C0D cmp al,0Dh + 32246 0000492C 7509 jne short Store_swt + 32247 0000492E B000 mov al,0 + 32248 00004930 AA stosb + 32249 ;or bp,FBADSWITCH ; 4000h + 32250 00004931 81CD0040 or bp,4000h + 32251 00004935 EBCE jmp short cperror ; Trailing switch character error + 32252 ; BP = fSwitch but no switch + 32253 ; bit is set (unknown switch) + 32254 Store_swt: + 32255 00004937 E82B00 call move_char ; store the character 32256 - 32257 ;call UPCONV_MAPCALL ; MSDOS 3.3 (Retro DOS 3.0) - 32258 ; 28/03/2023 - 32259 0000493A E84EDE call UPCONV ; MSDOS 6.0 & MSDOS 5.0 (Retro DOS 4.0) - 32260 - 32261 0000493D 06 push es - 32262 0000493E 57 push di - 32263 0000493F 51 push cx - 32264 00004940 0E push cs - 32265 00004941 07 pop es - 32266 ; 28/03/2023 - 32267 ; MSDOS 3.3 - 32268 ;;mov di,SWITCH_LIST ; "VBAPW" - 32269 ; MSDOS 6.0 - 32270 ;mov di,switch_list ; "?VBAPW" - 32271 ; 14/06/*2023 - 32272 ; MSDOS 6.22 - 32273 00004942 BF[D095] mov di,switch_list ; "-Y?VBAPW" - 32274 - 32275 ; MSDOS 3.3 - 32276 ;mov cx,SWCOUNT ; 5 - 32277 ; MSDOS 6.0 - 32278 ;mov cx,6 ; SWCOUNT = 6 - 32279 ; 14/06/2023 - 32280 ; MSDOS 6.22 - 32281 00004945 B90800 mov cx,8 ; SWCOUNT = 8 - 32282 - 32283 ;or bp,FBADSWITCH ; 4000h - 32284 00004948 81CD0040 or bp,4000h - 32285 0000494C F2AE repne scasb - 32286 0000494E 750B jnz short out_tokenp - 32287 ;and bp,~FBADSWITCH ; 0BFFFh - 32288 00004950 81E5FFBF and bp,0BFFFh - 32289 00004954 B80100 mov ax,1 - 32290 00004957 D3E0 shl ax,cl - 32291 00004959 09C5 or bp,ax - 32292 out_tokenp: - 32293 0000495B 59 pop cx - 32294 0000495C 5F pop di - 32295 0000495D 07 pop es - 32296 out_token: - 32297 0000495E B000 mov al,0 ; null at the end - 32298 00004960 AA stosb - 32299 00004961 5F pop di ; restore token buffer pointer - 32300 00004962 9D popf - 32301 00004963 F8 clc ; clear carry flag - 32302 00004964 C3 retn - 32303 - 32304 ; =============== S U B R O U T I N E ======================================= - 32305 - 32306 ; 28/03/2023 - 32307 move_char: - 32308 00004965 AA stosb ; store char in token buffer - 32309 00004966 41 inc cx ; increment char count - 32310 00004967 FE06[F89E] inc byte [ELCNT] ; increment element count for * substi - 32311 0000496B C3 retn - 32312 - 32313 ;============================================================================ - 32314 ; PARSE.ASM, MSDOS 6.0, 1991 - 32315 ;============================================================================ - 32316 ; 29/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 32317 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 32318 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 32319 - 32320 ; ----------------------------- - 32321 ; (PSDATA.INC, MSDOS 6.0, 1991) - 32322 ; ----------------------------- - 32323 - 32324 ;**** Equation field - 32325 ;-------- Character code definition + 32257 ; This upconv call must stay. It is used to identify copy-switches + 32258 ; on the command line, and won't store anything into the output buffer. + 32259 + 32260 ;call UPCONV_MAPCALL ; MSDOS 3.3 (Retro DOS 3.0) + 32261 ; 28/03/2023 + 32262 0000493A E84EDE call UPCONV ; MSDOS 6.0 & MSDOS 5.0 (Retro DOS 4.0) + 32263 + 32264 0000493D 06 push es + 32265 0000493E 57 push di + 32266 0000493F 51 push cx + 32267 00004940 0E push cs + 32268 00004941 07 pop es + 32269 ; 28/03/2023 + 32270 ; MSDOS 3.3 + 32271 ;;mov di,SWITCH_LIST ; "VBAPW" + 32272 ; MSDOS 6.0 + 32273 ;mov di,switch_list ; "?VBAPW" + 32274 ; 14/06/*2023 + 32275 ; MSDOS 6.22 + 32276 00004942 BF[D095] mov di,switch_list ; "-Y?VBAPW" + 32277 + 32278 ; MSDOS 3.3 + 32279 ;mov cx,SWCOUNT ; 5 + 32280 ; MSDOS 6.0 + 32281 ;mov cx,6 ; SWCOUNT = 6 + 32282 ; 14/06/2023 + 32283 ; MSDOS 6.22 + 32284 00004945 B90800 mov cx,8 ; SWCOUNT = 8 + 32285 + 32286 ;or bp,FBADSWITCH ; 4000h + 32287 00004948 81CD0040 or bp,4000h + 32288 0000494C F2AE repne scasb + 32289 0000494E 750B jnz short out_tokenp + 32290 ;and bp,~FBADSWITCH ; 0BFFFh + 32291 00004950 81E5FFBF and bp,0BFFFh + 32292 00004954 B80100 mov ax,1 + 32293 00004957 D3E0 shl ax,cl + 32294 00004959 09C5 or bp,ax + 32295 out_tokenp: + 32296 0000495B 59 pop cx + 32297 0000495C 5F pop di + 32298 0000495D 07 pop es + 32299 out_token: + 32300 0000495E B000 mov al,0 ; null at the end + 32301 00004960 AA stosb + 32302 00004961 5F pop di ; restore token buffer pointer + 32303 00004962 9D popf + 32304 00004963 F8 clc ; clear carry flag + 32305 00004964 C3 retn + 32306 + 32307 ; =============== S U B R O U T I N E ======================================= + 32308 + 32309 ; 28/03/2023 + 32310 move_char: + 32311 00004965 AA stosb ; store char in token buffer + 32312 00004966 41 inc cx ; increment char count + 32313 00004967 FE06[F89E] inc byte [ELCNT] ; increment element count for * substi + 32314 0000496B C3 retn + 32315 + 32316 ;============================================================================ + 32317 ; PARSE.ASM, MSDOS 6.0, 1991 + 32318 ;============================================================================ + 32319 ; 29/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 32320 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 32321 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 32322 + 32323 ; ----------------------------- + 32324 ; (PSDATA.INC, MSDOS 6.0, 1991) + 32325 ; ----------------------------- 32326 - 32327 $P_DBSP1 equ 20h ; DB_SP_HI ;AN000; 1st byte of DBCS blank - 32328 $P_DBSP2 equ 20h ; DB_SP_LO ;AN000; 2nd byte of DBCS blank - 32329 $P_Period equ "." ;AN020; - 32330 $P_Slash equ "/" ;AN020; - 32331 $P_Space equ " " ;AN000; SBCS blank - 32332 $P_Comma equ "," ;AN000; - 32333 $P_Switch equ "/" ;AN000; - 32334 $P_Keyword equ "=" ;AN000; - 32335 $P_Colon equ ":" ;AN000; - 32336 $P_Plus equ "+" ;AN000; - 32337 $P_Minus equ "-" ;AN000; - 32338 $P_Rparen equ ")" ;AN000; - 32339 $P_Lparen equ "(" ;AN000; - 32340 ;(deleted ;AN025;) $P_SQuote equ "'" - 32341 $P_DQuote equ '"' ;AN000; - 32342 $P_NULL equ 0 ;AN000; - 32343 $P_TAB equ 9 ;AN000; - 32344 $P_CR equ 0Dh ;AN000; - 32345 $P_LF equ 0Ah ;AN000; - 32346 $P_ASCII80 equ 80h ;AN000; ASCII 80h character code - 32347 - 32348 $P_DOSTBL_File equ 4 ;AN000; get file uppercase table - 32349 $P_DOSTBL_Char equ 2 ;AN000; get character uppercase table + 32327 ;**** Equation field + 32328 ;-------- Character code definition + 32329 + 32330 $P_DBSP1 equ 20h ; DB_SP_HI ;AN000; 1st byte of DBCS blank + 32331 $P_DBSP2 equ 20h ; DB_SP_LO ;AN000; 2nd byte of DBCS blank + 32332 $P_Period equ "." ;AN020; + 32333 $P_Slash equ "/" ;AN020; + 32334 $P_Space equ " " ;AN000; SBCS blank + 32335 $P_Comma equ "," ;AN000; + 32336 $P_Switch equ "/" ;AN000; + 32337 $P_Keyword equ "=" ;AN000; + 32338 $P_Colon equ ":" ;AN000; + 32339 $P_Plus equ "+" ;AN000; + 32340 $P_Minus equ "-" ;AN000; + 32341 $P_Rparen equ ")" ;AN000; + 32342 $P_Lparen equ "(" ;AN000; + 32343 ;(deleted ;AN025;) $P_SQuote equ "'" + 32344 $P_DQuote equ '"' ;AN000; + 32345 $P_NULL equ 0 ;AN000; + 32346 $P_TAB equ 9 ;AN000; + 32347 $P_CR equ 0Dh ;AN000; + 32348 $P_LF equ 0Ah ;AN000; + 32349 $P_ASCII80 equ 80h ;AN000; ASCII 80h character code 32350 - 32351 $P_error_filespec equ 1 - 32352 - 32353 ;---------------------------------------------------------------------------- - 32354 ; PARMS LABEL BYTE - 32355 ; DW PARMSX - 32356 ; DB 2 ; NUMBER OF STRINGS (0, 1, 2) - 32357 ; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE - 32358 ; DB " .. " ; EXTRA DELIMITER LIST, - 32359 ; ; TYPICAL ARE ";", "=" - 32360 ; ; "," & WHITESPACE ALWAYS - 32361 ; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE - 32362 ; DB " .. " ; EXTRA END OF LINE LIST, CR, LF OR 0 ALWAYS - 32363 ;---------------------------------------------------------------------------- - 32364 - 32365 struc $P_PARMS_BLK ;AN000; - 32366 00000000 ???? .$P_PARMSX_Address: resw 1 ;AN000; Address of PARMSX - 32367 00000002 ?? .$P_Num_Extra: resb 1 ;AN000; Number of extra stuff - 32368 00000003 ?? .$P_Len_Extra_Delim: resb 1 ;AN000; Length of extra delimiter - 32369 endstruc ;AN000; - 32370 - 32371 $P_Len_PARMS equ 4 ;AN000; - 32372 $P_I_Use_Default equ 0 ;AN000; no extra stuff specified - 32373 $P_I_Have_Delim equ 1 ;AN000; extra delimiter specified - 32374 $P_I_Have_EOL equ 2 ;AN000; extra EOL specified - 32375 - 32376 ;---------------------------------------------------------------------------- - 32377 ; PARMSX LABEL BYTE - 32378 ; DB minp,maxp ; MIN, MAX POSITIONAL OPERANDS ALLOWED - 32379 ; DW CONTROL ; DESCRIPTION OF POSITIONAL 1 - 32380 ; : ; REPEATS maxp-1 TIMES - 32381 ; DB maxs ; # OF SWITCHES - 32382 ; DW CONTROL ; DESCRIPTION OF SWITCH 1 - 32383 ; : ; REPEATS maxs-1 TIMES - 32384 ; DB maxk ; # OF KEYWORD - 32385 ; DW CONTROL ; DESCRIPTION OF KEYWORD 1 - 32386 ; : ; REPEATS maxk-1 TIMES - 32387 ;---------------------------------------------------------------------------- - 32388 - 32389 struc $P_PARMSX_BLK ;AN000; - 32390 00000000 ?? .$P_MinP: resb 1 ; 27/04/2023 ;AN000; Minimum positional number - 32391 00000001 ?? .$P_MaxP: resb 1 ;AN000; Maximum positional number - 32392 00000002 ?? .$P_1st_Control: resb 1 ;AN000; Address of the 1st CONTROL block - 32393 endstruc ;AN000; - 32394 - 32395 ; 31/03/2023 - 32396 ;---------------------------------------------------------------------------- - 32397 ; << Control field definition >> - 32398 ; - 32399 ;CONTROL LABEL BYTE - 32400 ; DW MATCH_FLAGS ; CONTROLS TYPE MATCHED - 32401 ; ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) - 32402 ; ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE CHECKED) - 32403 ; ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) - 32404 ; ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) - 32405 ; ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) - 32406 ; ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) - 32407 ; ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) - 32408 ; ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) - 32409 ; ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) - 32410 ; ; 0010H=IGNORE ":" AT END IN MATCH - 32411 ; ; 0002H=REPEATS ALLOWED - 32412 ; ; 0001H=OPTIONAL - 32413 ; DW FUNCTION_FLAGS - 32414 ; ; 0001H=CAP RESULT BY FILE TABLE - 32415 ; ; 0002H=CAP RESULT BY CHAR TABLE - 32416 ; ; 0010H=REMOVE ":" AT END - 32417 ; (tm10) ; 0020H=colon is not necessary for switch - 32418 ; - 32419 ; DW RESULT ; RESULT BUFFER - 32420 ; DW VALUES ; VALUE LISTS - 32421 ; DB nid ; NUMBER OF KEYWORD/SWITCH SYNONYMS IN FOLLOWING LIST - 32422 ; DB "...",0 ; IF n >0, KEYWORD 1 - 32423 ; : - 32424 ; - 32425 ;Note: - 32426 ; - The MATCH_FLAG is bit significant. You can set, for example, TIME bit and - 32427 ; DATE bit simalteniously. - 32428 ; - 32429 ; The parser examins each bit along with the following priority. - 32430 ; - 32431 ; COMPLEX -> DATE -> TIME -> NUMERIC VAL -> SIGNED NUMERIC VAL -> DRIVE -> - 32432 ; FILE SPEC -> SIMPLE STRING. + 32351 $P_DOSTBL_File equ 4 ;AN000; get file uppercase table + 32352 $P_DOSTBL_Char equ 2 ;AN000; get character uppercase table + 32353 + 32354 $P_error_filespec equ 1 + 32355 + 32356 ;---------------------------------------------------------------------------- + 32357 ; PARMS LABEL BYTE + 32358 ; DW PARMSX + 32359 ; DB 2 ; NUMBER OF STRINGS (0, 1, 2) + 32360 ; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE + 32361 ; DB " .. " ; EXTRA DELIMITER LIST, + 32362 ; ; TYPICAL ARE ";", "=" + 32363 ; ; "," & WHITESPACE ALWAYS + 32364 ; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE + 32365 ; DB " .. " ; EXTRA END OF LINE LIST, CR, LF OR 0 ALWAYS + 32366 ;---------------------------------------------------------------------------- + 32367 + 32368 struc $P_PARMS_BLK ;AN000; + 32369 00000000 ???? .$P_PARMSX_Address: resw 1 ;AN000; Address of PARMSX + 32370 00000002 ?? .$P_Num_Extra: resb 1 ;AN000; Number of extra stuff + 32371 00000003 ?? .$P_Len_Extra_Delim: resb 1 ;AN000; Length of extra delimiter + 32372 endstruc ;AN000; + 32373 + 32374 $P_Len_PARMS equ 4 ;AN000; + 32375 $P_I_Use_Default equ 0 ;AN000; no extra stuff specified + 32376 $P_I_Have_Delim equ 1 ;AN000; extra delimiter specified + 32377 $P_I_Have_EOL equ 2 ;AN000; extra EOL specified + 32378 + 32379 ;---------------------------------------------------------------------------- + 32380 ; PARMSX LABEL BYTE + 32381 ; DB minp,maxp ; MIN, MAX POSITIONAL OPERANDS ALLOWED + 32382 ; DW CONTROL ; DESCRIPTION OF POSITIONAL 1 + 32383 ; : ; REPEATS maxp-1 TIMES + 32384 ; DB maxs ; # OF SWITCHES + 32385 ; DW CONTROL ; DESCRIPTION OF SWITCH 1 + 32386 ; : ; REPEATS maxs-1 TIMES + 32387 ; DB maxk ; # OF KEYWORD + 32388 ; DW CONTROL ; DESCRIPTION OF KEYWORD 1 + 32389 ; : ; REPEATS maxk-1 TIMES + 32390 ;---------------------------------------------------------------------------- + 32391 + 32392 struc $P_PARMSX_BLK ;AN000; + 32393 00000000 ?? .$P_MinP: resb 1 ; 27/04/2023 ;AN000; Minimum positional number + 32394 00000001 ?? .$P_MaxP: resb 1 ;AN000; Maximum positional number + 32395 00000002 ?? .$P_1st_Control: resb 1 ;AN000; Address of the 1st CONTROL block + 32396 endstruc ;AN000; + 32397 + 32398 ; 31/03/2023 + 32399 ;---------------------------------------------------------------------------- + 32400 ; << Control field definition >> + 32401 ; + 32402 ;CONTROL LABEL BYTE + 32403 ; DW MATCH_FLAGS ; CONTROLS TYPE MATCHED + 32404 ; ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) + 32405 ; ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE CHECKED) + 32406 ; ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) + 32407 ; ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) + 32408 ; ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) + 32409 ; ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) + 32410 ; ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) + 32411 ; ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) + 32412 ; ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) + 32413 ; ; 0010H=IGNORE ":" AT END IN MATCH + 32414 ; ; 0002H=REPEATS ALLOWED + 32415 ; ; 0001H=OPTIONAL + 32416 ; DW FUNCTION_FLAGS + 32417 ; ; 0001H=CAP RESULT BY FILE TABLE + 32418 ; ; 0002H=CAP RESULT BY CHAR TABLE + 32419 ; ; 0010H=REMOVE ":" AT END + 32420 ; (tm10) ; 0020H=colon is not necessary for switch + 32421 ; + 32422 ; DW RESULT ; RESULT BUFFER + 32423 ; DW VALUES ; VALUE LISTS + 32424 ; DB nid ; NUMBER OF KEYWORD/SWITCH SYNONYMS IN FOLLOWING LIST + 32425 ; DB "...",0 ; IF n >0, KEYWORD 1 + 32426 ; : + 32427 ; + 32428 ;Note: + 32429 ; - The MATCH_FLAG is bit significant. You can set, for example, TIME bit and + 32430 ; DATE bit simalteniously. + 32431 ; + 32432 ; The parser examins each bit along with the following priority. 32433 ; - 32434 ; - 32435 ; - When the FUNCTION_FLAG is 0001 or 0002, the STRING pointed to by a pointer - 32436 ; in the result buffer is capitalized. + 32434 ; COMPLEX -> DATE -> TIME -> NUMERIC VAL -> SIGNED NUMERIC VAL -> DRIVE -> + 32435 ; FILE SPEC -> SIMPLE STRING. + 32436 ; 32437 ; - 32438 ; - Match_Flags 0001H and 0002H have meaning only for the positional. - 32439 ; + 32438 ; - When the FUNCTION_FLAG is 0001 or 0002, the STRING pointed to by a pointer + 32439 ; in the result buffer is capitalized. 32440 ; - 32441 ; - The "...",0 (bottom most line) does require '=' or '/'. When you need a - 32442 ; switch, for example, '/A', then STRING points to; + 32441 ; - Match_Flags 0001H and 0002H have meaning only for the positional. + 32442 ; 32443 ; - 32444 ; DB 1 ; number of following synonyms - 32445 ; DB '/A',0 + 32444 ; - The "...",0 (bottom most line) does require '=' or '/'. When you need a + 32445 ; switch, for example, '/A', then STRING points to; 32446 ; - 32447 ; When you need a keyword, for example, 'CODEPAGE=', then "...",0 will be; - 32448 ; - 32449 ; DB 1 ; number of following synonyms - 32450 ; DB 'CODEPAGE=',0 + 32447 ; DB 1 ; number of following synonyms + 32448 ; DB '/A',0 + 32449 ; + 32450 ; When you need a keyword, for example, 'CODEPAGE=', then "...",0 will be; 32451 ; - 32452 ; - 32453 ; - "..." must consist of upper case characters only because the parser - 32454 ; performs pattern matching after converting input to upper case (by - 32455 ; using the current country upper case table) - 32456 ; - 32457 ; - 32458 ; - One "..." can contain only one switch or keyword. If you need, for - 32459 ; example /A and /B, the format will be; + 32452 ; DB 1 ; number of following synonyms + 32453 ; DB 'CODEPAGE=',0 + 32454 ; + 32455 ; + 32456 ; - "..." must consist of upper case characters only because the parser + 32457 ; performs pattern matching after converting input to upper case (by + 32458 ; using the current country upper case table) + 32459 ; 32460 ; - 32461 ; DB 2 ; number of following synonyms - 32462 ; DB '/A',0 - 32463 ; DB '/B',0 - 32464 ;---------------------------------------------------------------------------- - 32465 - 32466 ;**** Match_Flags - 32467 - 32468 $P_Num_Val equ 8000h ;AN000; Numeric Value - 32469 $P_SNum_Val equ 4000h ;AN000; Signed numeric value - 32470 $P_Simple_S equ 2000h ;AN000; Simple string - 32471 $P_Date_S equ 1000h ;AN000; Date string - 32472 $P_Time_S equ 0800h ;AN000; Time string - 32473 $P_Cmpx_S equ 0400h ;AN000; Complex string - 32474 $P_File_Spc equ 0200h ;AN000; File Spec - 32475 $P_Drv_Only equ 0100h ;AN000; Drive Only - 32476 $P_Qu_String equ 0080h ;AN000; Quoted string - 32477 $P_Ig_Colon equ 0010h ;AN000; Ignore colon at end in match - 32478 $P_Repeat equ 0002h ;AN000; Repeat allowed - 32479 $P_Optional equ 0001h ;AN000; Optional - 32480 - 32481 ;**** Function flags - 32482 - 32483 $P_CAP_File equ 0001h ;AN000; CAP result by file table - 32484 $P_CAP_Char equ 0002h ;AN000; CAP result by character table - 32485 $P_Rm_Colon equ 0010h ;AN000; Remove ":" at the end - 32486 $P_colon_is_not_necessary equ 0020h ;AN000;(tm10) /+10 and /+:10 - 32487 - 32488 ;-------------------------------- Control block structure - 32489 struc $P_CONTROL_BLK - 32490 00000000 ???? .$P_Match_Flag: resw 1 ;AN000; Controls type matched - 32491 00000002 ???? .$P_Function_Flag: resw 1 ;AN000; Function should be taken - 32492 00000004 ???? .$P_Result_Buf: resw 1 ;AN000; Result buffer address - 32493 00000006 ???? .$P_Value_List: resw 1 ;AN000; Value list address - 32494 00000008 ?? .$P_nid: resb 1 ;AN000; # of keyword/SW synonyms - 32495 00000009 ?? .$P_KEYorSW: resb 1 ;AN000; keyword or sw - 32496 endstruc - 32497 - 32498 ; 31/03/2023 - 32499 ;---------------------------------------------------------------------------- - 32500 ; - 32501 ;VALUES LABEL BYTE - 32502 ; DB nval ; NUMBER OF VALUE DEFINITIONS (0 - 3) - 32503 ; +- - 32504 ; | DB nrng ; NUMBER OF RANGES - 32505 ; | +DB ITEM_TAG ; RETURN VALUE IF RANGE MATCHED - 32506 ; | +DD X,Y ; RANGE OF VALUES - 32507 ; | : - 32508 ; | DB nnval ; NUMBER OF CHOICES - 32509 ; | +DB ITEM_TAG ; RETURN VALUE IF NUMBER CHOICE MATCHED - 32510 ; | +DD VALUE ; SPECIFIC CHOICE IF NUMBER - 32511 ; | : - 32512 ; | DB nstrval ; NUMBER OF CHOICES - 32513 ; | +DB ITEM_TAG ; RETURN VALUE IF STRING CHOICE MATCHED - 32514 ; | +DW STRING ; SPECIFIC CHOICE IF STING - 32515 ; +- : - 32516 ; - 32517 ;STRING DB "...",0 ; ASCIIZ STRING IMAGE - 32518 ; - 32519 ;Note: - 32520 ; - ITEM_TAG must not be 0FFH, which will be used in the result buffer - 32521 ; when no choice lists are provided. - 32522 ; - 32523 ; - STRING must consist of upper case characters only because the parser - 32524 ; performs pattern matching after converting input to upper case (by - 32525 ; using the current country upper case table) - 32526 ;---------------------------------------------------------------------------- - 32527 - 32528 $P_nval_None equ 0 ;AN000; no value list ID - 32529 $P_nval_Range equ 1 ;AN000; range list ID - 32530 $P_nval_Value equ 2 ;AN000; value list ID - 32531 $P_nval_String equ 3 ;AN000; string list ID - 32532 $P_Len_Range equ 9 ;AN000; Length of a range choice(two DD plus one DB) - 32533 $P_Len_Value equ 5 ;AN000; Length of a value choice(one DD plus one DB) - 32534 $P_Len_String equ 3 ;AN000; Length of a string choice(one DW plus one DB) - 32535 $P_No_nrng equ 0 ;AN000; (tm07) no nrng. nnval must not be 0. - 32536 - 32537 struc $P_VAL_LIST - 32538 00000000 ?? .$P_NumofList: resb 1 ;AN000; number of following choice - 32539 00000001 ???? .$P_Val_XL: resw 1 ;AN000; lower word of value - 32540 00000003 ???? .$P_Val_XH: resw 1 ;AN000; higher word of value - 32541 00000005 ???? .$P_Val_YL: resw 1 ;AN000; lower word of another value - 32542 00000007 ???? .$P_Val_YH: resw 1 ;AN000; higher word of another value - 32543 endstruc - 32544 - 32545 ; 31/03/2023 - 32546 ;---------------------------------------------------------------------------- - 32547 ; - 32548 ;RESULT LABEL BYTE ; BELOW FILLED IN FOR DEFAULTS - 32549 ; DB type ; TYPE RETURNED: 0=RESERVED, - 32550 ; ; 1=NUMBER, 2=LIST INDEX, - 32551 ; ; 3=STRING, 4=COMPLEX, - 32552 ; ; 5=FILESPEC, 6=DRIVE - 32553 ; ; 7=DATE, 8=TIME - 32554 ; ; 9=QUOTED STRING - 32555 ; DB ITEM_TAG ; MATCHED ITEM TAG - 32556 ; - 32557 ; dw synonym@ ; es:@ points to found SYNONYM if provided. - 32558 ; - 32559 ; +- - 32560 ; | DD n ; VALUE IF NUMBER - 32561 ; | or - 32562 ; | DW i ; INDEX (OFFSET) INTO VALUE LIST - 32563 ; | ; (ES presents Segment address) + 32461 ; - One "..." can contain only one switch or keyword. If you need, for + 32462 ; example /A and /B, the format will be; + 32463 ; + 32464 ; DB 2 ; number of following synonyms + 32465 ; DB '/A',0 + 32466 ; DB '/B',0 + 32467 ;---------------------------------------------------------------------------- + 32468 + 32469 ;**** Match_Flags + 32470 + 32471 $P_Num_Val equ 8000h ;AN000; Numeric Value + 32472 $P_SNum_Val equ 4000h ;AN000; Signed numeric value + 32473 $P_Simple_S equ 2000h ;AN000; Simple string + 32474 $P_Date_S equ 1000h ;AN000; Date string + 32475 $P_Time_S equ 0800h ;AN000; Time string + 32476 $P_Cmpx_S equ 0400h ;AN000; Complex string + 32477 $P_File_Spc equ 0200h ;AN000; File Spec + 32478 $P_Drv_Only equ 0100h ;AN000; Drive Only + 32479 $P_Qu_String equ 0080h ;AN000; Quoted string + 32480 $P_Ig_Colon equ 0010h ;AN000; Ignore colon at end in match + 32481 $P_Repeat equ 0002h ;AN000; Repeat allowed + 32482 $P_Optional equ 0001h ;AN000; Optional + 32483 + 32484 ;**** Function flags + 32485 + 32486 $P_CAP_File equ 0001h ;AN000; CAP result by file table + 32487 $P_CAP_Char equ 0002h ;AN000; CAP result by character table + 32488 $P_Rm_Colon equ 0010h ;AN000; Remove ":" at the end + 32489 $P_colon_is_not_necessary equ 0020h ;AN000;(tm10) /+10 and /+:10 + 32490 + 32491 ;-------------------------------- Control block structure + 32492 struc $P_CONTROL_BLK + 32493 00000000 ???? .$P_Match_Flag: resw 1 ;AN000; Controls type matched + 32494 00000002 ???? .$P_Function_Flag: resw 1 ;AN000; Function should be taken + 32495 00000004 ???? .$P_Result_Buf: resw 1 ;AN000; Result buffer address + 32496 00000006 ???? .$P_Value_List: resw 1 ;AN000; Value list address + 32497 00000008 ?? .$P_nid: resb 1 ;AN000; # of keyword/SW synonyms + 32498 00000009 ?? .$P_KEYorSW: resb 1 ;AN000; keyword or sw + 32499 endstruc + 32500 + 32501 ; 31/03/2023 + 32502 ;---------------------------------------------------------------------------- + 32503 ; + 32504 ;VALUES LABEL BYTE + 32505 ; DB nval ; NUMBER OF VALUE DEFINITIONS (0 - 3) + 32506 ; +- + 32507 ; | DB nrng ; NUMBER OF RANGES + 32508 ; | +DB ITEM_TAG ; RETURN VALUE IF RANGE MATCHED + 32509 ; | +DD X,Y ; RANGE OF VALUES + 32510 ; | : + 32511 ; | DB nnval ; NUMBER OF CHOICES + 32512 ; | +DB ITEM_TAG ; RETURN VALUE IF NUMBER CHOICE MATCHED + 32513 ; | +DD VALUE ; SPECIFIC CHOICE IF NUMBER + 32514 ; | : + 32515 ; | DB nstrval ; NUMBER OF CHOICES + 32516 ; | +DB ITEM_TAG ; RETURN VALUE IF STRING CHOICE MATCHED + 32517 ; | +DW STRING ; SPECIFIC CHOICE IF STING + 32518 ; +- : + 32519 ; + 32520 ;STRING DB "...",0 ; ASCIIZ STRING IMAGE + 32521 ; + 32522 ;Note: + 32523 ; - ITEM_TAG must not be 0FFH, which will be used in the result buffer + 32524 ; when no choice lists are provided. + 32525 ; + 32526 ; - STRING must consist of upper case characters only because the parser + 32527 ; performs pattern matching after converting input to upper case (by + 32528 ; using the current country upper case table) + 32529 ;---------------------------------------------------------------------------- + 32530 + 32531 $P_nval_None equ 0 ;AN000; no value list ID + 32532 $P_nval_Range equ 1 ;AN000; range list ID + 32533 $P_nval_Value equ 2 ;AN000; value list ID + 32534 $P_nval_String equ 3 ;AN000; string list ID + 32535 $P_Len_Range equ 9 ;AN000; Length of a range choice(two DD plus one DB) + 32536 $P_Len_Value equ 5 ;AN000; Length of a value choice(one DD plus one DB) + 32537 $P_Len_String equ 3 ;AN000; Length of a string choice(one DW plus one DB) + 32538 $P_No_nrng equ 0 ;AN000; (tm07) no nrng. nnval must not be 0. + 32539 + 32540 struc $P_VAL_LIST + 32541 00000000 ?? .$P_NumofList: resb 1 ;AN000; number of following choice + 32542 00000001 ???? .$P_Val_XL: resw 1 ;AN000; lower word of value + 32543 00000003 ???? .$P_Val_XH: resw 1 ;AN000; higher word of value + 32544 00000005 ???? .$P_Val_YL: resw 1 ;AN000; lower word of another value + 32545 00000007 ???? .$P_Val_YH: resw 1 ;AN000; higher word of another value + 32546 endstruc + 32547 + 32548 ; 31/03/2023 + 32549 ;---------------------------------------------------------------------------- + 32550 ; + 32551 ;RESULT LABEL BYTE ; BELOW FILLED IN FOR DEFAULTS + 32552 ; DB type ; TYPE RETURNED: 0=RESERVED, + 32553 ; ; 1=NUMBER, 2=LIST INDEX, + 32554 ; ; 3=STRING, 4=COMPLEX, + 32555 ; ; 5=FILESPEC, 6=DRIVE + 32556 ; ; 7=DATE, 8=TIME + 32557 ; ; 9=QUOTED STRING + 32558 ; DB ITEM_TAG ; MATCHED ITEM TAG + 32559 ; + 32560 ; dw synonym@ ; es:@ points to found SYNONYM if provided. + 32561 ; + 32562 ; +- + 32563 ; | DD n ; VALUE IF NUMBER 32564 ; | or - 32565 ; | DD STRING ; OFFSET OF STRING VALUE - 32566 ; | or - 32567 ; | DB drv ; DRIVE NUMBER (1-A, 2-B,..., 26-Z) - 32568 ; | or - 32569 ; | DW YEAR ;(1980-2099) IN CASE OF DATE - 32570 ; | DB MONTH ;(1-12) Note: Range check is not performed. - 32571 ; | DB DATE ;(1-31) 0 is filled when the corresponding field was not specified. - 32572 ; | or - 32573 ; | DB HOUR ;(0-23) IN CASE OF TIME - 32574 ; | DB MINUTES ;(0-59) Note: Range check is not performed . - 32575 ; | DB SECONDS ;(0-59) 0 is filled when the corresponding field was not specified . - 32576 ; | DB HUNDREDTHS ;(0-99) - 32577 ; +- - 32578 ; - 32579 ;Note: ITEM_TAG is 0FFH when the caller does not specify the choice - 32580 ; list. + 32565 ; | DW i ; INDEX (OFFSET) INTO VALUE LIST + 32566 ; | ; (ES presents Segment address) + 32567 ; | or + 32568 ; | DD STRING ; OFFSET OF STRING VALUE + 32569 ; | or + 32570 ; | DB drv ; DRIVE NUMBER (1-A, 2-B,..., 26-Z) + 32571 ; | or + 32572 ; | DW YEAR ;(1980-2099) IN CASE OF DATE + 32573 ; | DB MONTH ;(1-12) Note: Range check is not performed. + 32574 ; | DB DATE ;(1-31) 0 is filled when the corresponding field was not specified. + 32575 ; | or + 32576 ; | DB HOUR ;(0-23) IN CASE OF TIME + 32577 ; | DB MINUTES ;(0-59) Note: Range check is not performed . + 32578 ; | DB SECONDS ;(0-59) 0 is filled when the corresponding field was not specified . + 32579 ; | DB HUNDREDTHS ;(0-99) + 32580 ; +- 32581 ; - 32582 ; YEAR: If the input value for the year is less than 100, parser - 32583 ; adds 1900 to it. For example, when 87 is input to parser for - 32584 ; the year value, he returns 1987. - 32585 ;---------------------------------------------------------------------------- - 32586 - 32587 ;-------------------------------- Result block structure - 32588 struc $P_RESULT_BLK; - 32589 00000000 ?? .$P_Type: resb 1 ;AN000; Type returned - 32590 00000001 ?? .$P_Item_Tag: resb 1 ;AN000; Matched item tag - 32591 00000002 ???? .$P_SYNONYM_Ptr: resw 1 ;AN000; pointer to Synonym list returned - 32592 00000004 ???????? .$P_Picked_Val: resb 4 ;AN000; value - 32593 endstruc - 32594 - 32595 ;**** values for the type field in the result block - 32596 - 32597 $P_EOL equ 0 ;AN000; End of line - 32598 $P_Number equ 1 ;AN000; Number - 32599 $P_List_Idx equ 2 ;AN000; List Index - 32600 $P_String equ 3 ;AN000; String - 32601 $P_Complex equ 4 ;AN000; Complex - 32602 $P_File_Spec equ 5 ;AN000; File Spec - 32603 $P_Drive equ 6 ;AN000; Drive - 32604 $P_Date_F equ 7 ;AN000; Date - 32605 $P_Time_F equ 8 ;AN000; Time - 32606 $P_Quoted_String equ 9 ;AN000; Quoted String - 32607 - 32608 $P_No_Tag equ 0FFh ;AN000; No ITEM_TAG found - 32609 - 32610 ;**** Return code - 32611 ; - 32612 ; following return code will be returned in the AX register. - 32613 - 32614 $P_No_Error equ 0 ;AN000; No error - 32615 $P_Too_Many equ 1 ;AN000; Too many operands - 32616 $P_Op_Missing equ 2 ;AN000; Required operand missing - 32617 $P_Not_In_SW equ 3 ;AN000; Not in switch list provided - 32618 $P_Not_In_Key equ 4 ;AN000; Not in keyword list provided - 32619 $P_Out_Of_Range equ 6 ;AN000; Out of range specified - 32620 $P_Not_In_Val equ 7 ;AN000; Not in value list provided - 32621 $P_Not_In_Str equ 8 ;AN000; Not in string list provided - 32622 $P_Syntax equ 9 ;AN000; Syntax error - 32623 $P_RC_EOL equ -1 ;AN000; End of command line - 32624 - 32625 ;in second byte of $P_Flags, referenced as $P_Flags2: - 32626 $P_equ equ 01h ;AN000; "=" packed in string buffet - 32627 $P_Neg equ 02h ;AN000; Negative value - 32628 $P_Time12 equ 04h ;AN000; set when PM is specified - 32629 $P_Key_Cmp equ 08h ;AN000; set when keyword compare - 32630 $P_SW_Cmp equ 10h ;AN000; set when switch compare - 32631 $P_Extra equ 20h ;AN000; set when extra delimiter found - 32632 $P_SW equ 40h ;AN000; set when switch found (tm08) - 32633 $P_Signed equ 80h ;AN000; signed numeric specified - 32634 - 32635 ;-------- Masks - 32636 $P_Make_Lower equ 20h ;AN000; make lower case character - 32637 $P_Make_Upper equ 0FFh-$P_Make_Lower ;AN000; make upper case character - 32638 - 32639 ;------------- - 32640 - 32641 struc $P_DOS_TBL - 32642 00000000 ?? .$P_DOS_InfoID: resb 1 ;AN000; information id for the table - 32643 00000001 ???? .$P_DOS_TBL_Off: resw 1 ;AN000; offset address of the table - 32644 00000003 ???? .$P_DOS_TBL_Seg: resw 1 ;AN000; segment address of the table - 32645 endstruc - 32646 - 32647 $P_DOS_Get_TBL equ 65h ;AN000; get uppercase table call - 32648 ;AN000; following parameters are set - 32649 ;AN000; to get casemap table. - 32650 $P_DOSTBL_Def equ -1 ;AN000; get default - 32651 $P_DOSTBL_BL equ 5 ;AN000; buffer length for Tbl pointer - 32652 $P_DOSTBL_File equ 4 ;AN000; get file uppercase table - 32653 $P_DOSTBL_Char equ 2 ;AN000; get character uppercase table - 32654 ; By this call following information - 32655 ; is returned. - 32656 - 32657 ; 03/04/2023 - 32658 ;-------------------------------- country dependent information + 32582 ;Note: ITEM_TAG is 0FFH when the caller does not specify the choice + 32583 ; list. + 32584 ; + 32585 ; YEAR: If the input value for the year is less than 100, parser + 32586 ; adds 1900 to it. For example, when 87 is input to parser for + 32587 ; the year value, he returns 1987. + 32588 ;---------------------------------------------------------------------------- + 32589 + 32590 ;-------------------------------- Result block structure + 32591 struc $P_RESULT_BLK; + 32592 00000000 ?? .$P_Type: resb 1 ;AN000; Type returned + 32593 00000001 ?? .$P_Item_Tag: resb 1 ;AN000; Matched item tag + 32594 00000002 ???? .$P_SYNONYM_Ptr: resw 1 ;AN000; pointer to Synonym list returned + 32595 00000004 ???????? .$P_Picked_Val: resb 4 ;AN000; value + 32596 endstruc + 32597 + 32598 ;**** values for the type field in the result block + 32599 + 32600 $P_EOL equ 0 ;AN000; End of line + 32601 $P_Number equ 1 ;AN000; Number + 32602 $P_List_Idx equ 2 ;AN000; List Index + 32603 $P_String equ 3 ;AN000; String + 32604 $P_Complex equ 4 ;AN000; Complex + 32605 $P_File_Spec equ 5 ;AN000; File Spec + 32606 $P_Drive equ 6 ;AN000; Drive + 32607 $P_Date_F equ 7 ;AN000; Date + 32608 $P_Time_F equ 8 ;AN000; Time + 32609 $P_Quoted_String equ 9 ;AN000; Quoted String + 32610 + 32611 $P_No_Tag equ 0FFh ;AN000; No ITEM_TAG found + 32612 + 32613 ;**** Return code + 32614 ; + 32615 ; following return code will be returned in the AX register. + 32616 + 32617 $P_No_Error equ 0 ;AN000; No error + 32618 $P_Too_Many equ 1 ;AN000; Too many operands + 32619 $P_Op_Missing equ 2 ;AN000; Required operand missing + 32620 $P_Not_In_SW equ 3 ;AN000; Not in switch list provided + 32621 $P_Not_In_Key equ 4 ;AN000; Not in keyword list provided + 32622 $P_Out_Of_Range equ 6 ;AN000; Out of range specified + 32623 $P_Not_In_Val equ 7 ;AN000; Not in value list provided + 32624 $P_Not_In_Str equ 8 ;AN000; Not in string list provided + 32625 $P_Syntax equ 9 ;AN000; Syntax error + 32626 $P_RC_EOL equ -1 ;AN000; End of command line + 32627 + 32628 ;in second byte of $P_Flags, referenced as $P_Flags2: + 32629 $P_equ equ 01h ;AN000; "=" packed in string buffet + 32630 $P_Neg equ 02h ;AN000; Negative value + 32631 $P_Time12 equ 04h ;AN000; set when PM is specified + 32632 $P_Key_Cmp equ 08h ;AN000; set when keyword compare + 32633 $P_SW_Cmp equ 10h ;AN000; set when switch compare + 32634 $P_Extra equ 20h ;AN000; set when extra delimiter found + 32635 $P_SW equ 40h ;AN000; set when switch found (tm08) + 32636 $P_Signed equ 80h ;AN000; signed numeric specified + 32637 + 32638 ;-------- Masks + 32639 $P_Make_Lower equ 20h ;AN000; make lower case character + 32640 $P_Make_Upper equ 0FFh-$P_Make_Lower ;AN000; make upper case character + 32641 + 32642 ;------------- + 32643 + 32644 struc $P_DOS_TBL + 32645 00000000 ?? .$P_DOS_InfoID: resb 1 ;AN000; information id for the table + 32646 00000001 ???? .$P_DOS_TBL_Off: resw 1 ;AN000; offset address of the table + 32647 00000003 ???? .$P_DOS_TBL_Seg: resw 1 ;AN000; segment address of the table + 32648 endstruc + 32649 + 32650 $P_DOS_Get_TBL equ 65h ;AN000; get uppercase table call + 32651 ;AN000; following parameters are set + 32652 ;AN000; to get casemap table. + 32653 $P_DOSTBL_Def equ -1 ;AN000; get default + 32654 $P_DOSTBL_BL equ 5 ;AN000; buffer length for Tbl pointer + 32655 $P_DOSTBL_File equ 4 ;AN000; get file uppercase table + 32656 $P_DOSTBL_Char equ 2 ;AN000; get character uppercase table + 32657 ; By this call following information + 32658 ; is returned. 32659 - 32660 $P_DOS_Get_CDI equ 3800h - 32661 - 32662 struc $P_CDI - 32663 00000000 ???? .$P_CDI_DateF: resw 1 ;AN000; - 32664 00000002 ???????? .$P_CDI_Money: resb 4 ;AN000; - 32665 00000006 ???? .$P_CDI_1000: resb 2 ;AN000; - 32666 00000008 ???? .$P_CDI_Dec: resb 2 ;AN000; - 32667 0000000A ???? .$P_CDI_DateS: resb 2 ;AN000; - 32668 0000000C ???? .$P_CDI_TimeS: resb 2 ;AN000; - 32669 0000000E ?? resb 1 ;AN000; - 32670 0000000F ?? resb 1 ;AN000; - 32671 00000010 ?? .$P_CDI_TimeF: resb 1 ;AN000; - 32672 00000011 ???????? resw 2 ;AN000; - 32673 00000015 ???? resb 2 ;AN000; - 32674 00000017 resw 5 ;AN000; - 32675 endstruc - 32676 - 32677 $P_Date_MDY equ 0 ;AN000; - 32678 $P_Date_DMY equ 1 ;AN000; - 32679 $P_Date_YMD equ 2 ;AN000; - 32680 - 32681 ; ---------------------------- - 32682 ; (PARSE.ASM, MSDOS 6.0, 1991) - 32683 ; ---------------------------- - 32684 - 32685 ;*********************************************************************** - 32686 ; SysParse; - 32687 ; - 32688 ; Function : Parser Entry - 32689 ; - 32690 ; Input: DS:SI -> command line - 32691 ; ES:DI -> parameter block - 32692 ; psdata_seg -> psdata.inc - 32693 ; CX = operand ordinal - 32694 ; - 32695 ; Note: ES is the segment containing all the control blocks defined - 32696 ; by the caller, except for the DOS COMMAND line parms, which - 32697 ; is in DS. - 32698 ; - 32699 ; Output: CY = 1 error of caller, means invalid parameter block or - 32700 ; invalid value list. But this parser does NOT implement - 32701 ; this feature. Therefore CY always zero. - 32702 ; - 32703 ; CY = 0 AX = return code - 32704 ; BL = terminated delimiter code - 32705 ; CX = new operand ordinal - 32706 ; SI = set past scaned operand - 32707 ; DX = selected result buffer - 32708 ; - 32709 ; Use: $P_Skip_Delim, $P_Chk_EOL, $P_Chk_Delim, $P_Chk_DBCS - 32710 ; $P_Chk_Swtch, $P_Chk_Pos_Control, $P_Chk_Key_Control - 32711 ; $P_Chk_Sw_Control, $P_Fill_Result - 32712 ; - 32713 ; Vars: $P_Ordinal(RW), $P_RC(RW), $P_SI_Save(RW), $P_DX(R), $P_Terminator(R) - 32714 ; $P_SaveSI_Cmpx(W), $P_Flags(RW), $P_Found_SYNONYM(R), $P_Save_EOB(W) + 32660 ; 03/04/2023 + 32661 ;-------------------------------- country dependent information + 32662 + 32663 $P_DOS_Get_CDI equ 3800h + 32664 + 32665 struc $P_CDI + 32666 00000000 ???? .$P_CDI_DateF: resw 1 ;AN000; + 32667 00000002 ???????? .$P_CDI_Money: resb 4 ;AN000; + 32668 00000006 ???? .$P_CDI_1000: resb 2 ;AN000; + 32669 00000008 ???? .$P_CDI_Dec: resb 2 ;AN000; + 32670 0000000A ???? .$P_CDI_DateS: resb 2 ;AN000; + 32671 0000000C ???? .$P_CDI_TimeS: resb 2 ;AN000; + 32672 0000000E ?? resb 1 ;AN000; + 32673 0000000F ?? resb 1 ;AN000; + 32674 00000010 ?? .$P_CDI_TimeF: resb 1 ;AN000; + 32675 00000011 ???????? resw 2 ;AN000; + 32676 00000015 ???? resb 2 ;AN000; + 32677 00000017 resw 5 ;AN000; + 32678 endstruc + 32679 + 32680 $P_Date_MDY equ 0 ;AN000; + 32681 $P_Date_DMY equ 1 ;AN000; + 32682 $P_Date_YMD equ 2 ;AN000; + 32683 + 32684 ; ---------------------------- + 32685 ; (PARSE.ASM, MSDOS 6.0, 1991) + 32686 ; ---------------------------- + 32687 + 32688 ;*********************************************************************** + 32689 ; SysParse; + 32690 ; + 32691 ; Function : Parser Entry + 32692 ; + 32693 ; Input: DS:SI -> command line + 32694 ; ES:DI -> parameter block + 32695 ; psdata_seg -> psdata.inc + 32696 ; CX = operand ordinal + 32697 ; + 32698 ; Note: ES is the segment containing all the control blocks defined + 32699 ; by the caller, except for the DOS COMMAND line parms, which + 32700 ; is in DS. + 32701 ; + 32702 ; Output: CY = 1 error of caller, means invalid parameter block or + 32703 ; invalid value list. But this parser does NOT implement + 32704 ; this feature. Therefore CY always zero. + 32705 ; + 32706 ; CY = 0 AX = return code + 32707 ; BL = terminated delimiter code + 32708 ; CX = new operand ordinal + 32709 ; SI = set past scaned operand + 32710 ; DX = selected result buffer + 32711 ; + 32712 ; Use: $P_Skip_Delim, $P_Chk_EOL, $P_Chk_Delim, $P_Chk_DBCS + 32713 ; $P_Chk_Swtch, $P_Chk_Pos_Control, $P_Chk_Key_Control + 32714 ; $P_Chk_Sw_Control, $P_Fill_Result 32715 ; - 32716 ;-------- Modification History ----------------------------------------- - 32717 ; - 32718 ; 4/04/87 : Created by K. K, - 32719 ; 4/28/87 : $P_Val_YH assemble error (tm01) - 32720 ; : JMP SHORT assemble error (tm02) - 32721 ; 5/14/87 : Someone doesn't want to include psdata (tm03) - 32722 ; 6/12/87 : $P_Bridge is missing when TimeSw equ 0 and (CmpxSw equ 1 or - 32723 ; DateSW equ 1) (tm04) - 32724 ; 6/12/87 : $P_SorD_Quote is missing when QusSw equ 0 and CmpxSW equ 1 - 32725 ; (tm05) in PSDATA.INC - 32726 ; 6/12/87 : $P_FileSp_Char and $P_FileSP_Len are missing - 32727 ; when FileSW equ 0 and DrvSW equ 1 (tm06) in PSDATA.INC - 32728 ; 6/18/87 : $VAL1 and $VAL3, $VAL2 and $VAL3 can be used in the same - 32729 ; value-list block (tm07) - 32730 ; 6/20/87 : Add $P_SW to check if there's an omiting parameter after - 32731 ; switch (keyword) or not. If there is, backup si for next call - 32732 ; (tm08) - 32733 ; 6/24/87 : Complex Item checking does not work correctly when CmpSW equ 1 - 32734 ; and DateSW equ 0 and TimeSW equ 0 (tm09) - 32735 ; 6/24/87 : New function flag $P_colon_is_not_necessary for switch - 32736 ; /+15 and /+:15 are allowed for user (tm10) - 32737 ; 6/29/87 : ECS call changes DS register but it causes the address problem - 32738 ; in user's routines. $P_Chk_DBCS (tm11) - 32739 ; 7/10/87 : Switch with no_match flag (0x0000H) does not work correctly - 32740 ; (tm12) - 32741 ; 7/10/87 : Invalid switch/keyword does not work correctly - 32742 ; (tm13) - 32743 ; 7/10/87 : Drive_only breaks 3 bytes after the result buffer - 32744 ; (tm14) - 32745 ; 7/12/87 : Too_Many_Operands sets DX=0 as the PARSE result - 32746 ; (tm15) - 32747 ; 7/24/87 : Negative lower bound on numeric ranges cause trouble - 32748 ; - 32749 ; 7/24/87 : Quoted strings being returned with quotes. - 32750 ; - 32751 ; 7/28/87 : Kerry S (;AN018;) - 32752 ; Non optional value on switch (match flags<>0 and <>1) not flagged - 32753 ; as an error when missing. Solution: return error 2. Modules - 32754 ; affected: $P_Chk_SW_Control. - 32755 ; - 32756 ; 7/29/87 : Kerry S (;AN019;) - 32757 ; Now allow the optional bit in match flags for switches. This - 32758 ; allows the switch to be encountered with a value or without a - 32759 ; value and no error is returned. - 32760 ; - 32761 ; - 32762 ; 8/28/87 : Ed K, Kerry S (;AN020;) - 32763 ; 9/14/87 In PROC $P_Get_DecNum, when checking for field separators - 32764 ; within a date response, instead of checking just for the one - 32765 ; character defined by the COUNTRY DEPENDENT INFO, check for - 32766 ; all three chars, "-", "/", and ".". Change $P_Chk_Switch to allow - 32767 ; slashes in date strings when DateSw (assembler switch) is set. - 32768 ; - 32769 ; 9/1/87 : Kerry S (;AN021) - 32770 ; In PROC $P_String_Comp, when comparing the switch or keyword on - 32771 ; the command line with the string in the control block the - 32772 ; comparing was stopping at a colon (switch) or equal (keyword) - 32773 ; on the command line and assuming a match. This allowed a shorter - 32774 ; string on the command line than in the synonym list in the control - 32775 ; block. I put in a test for a null in the control block so the - 32776 ; string in the control block must be the same length as the string - 32777 ; preceeding the colon or equal on the command line. - 32778 ; - 32779 ; 8/28/87 : Kerry S (;AN022;) - 32780 ; All references to data in PSDATA.INC had CS overrides. This caused - 32781 ; problems for people who included it themselves in a segment other - 32782 ; than CS. Added switch to allow including PSDATA.INC in any - 32783 ; segment. - 32784 ; - 32785 ; 9/16/87 : Ed K (;AN023;) PTM1040 - 32786 ; in $p_set_cdi PROC, it assumes CS points to psdata. Change Push CS - 32787 ; into PUSH PSDATA_SEG. In $P_Get_DecNum PROC, fix AN020 - 32788 ; forced both TIME and DATE to use the delims, "-","/",".". - 32789 ; Created FLag, in $P_time_Format PROC, to request the delim in - 32790 ; BL be used if TIME is being parsed. - 32791 ; - 32792 ; 9/24/87 : Ed K - 32793 ; Removed the include to STRUC.INC. Replaced the STRUC macro - 32794 ; invocations with their normally expanded code; made comments - 32795 ; out of the STRUC macro invocation statements to maintain readability. - 32796 ; - 32797 ; 9/24/87 : Ed K (;AN024;) PTM1222 - 32798 ; When no CONTROL for a keyword found, tried to fill in RESULT - 32799 ; pointed to by non-existant CONTROL. - 32800 ; - 32801 ; 10/15/87 : Ed K (;AN025;) PTM1672 - 32802 ; A quoted text string can be framed only by double quote. Remove - 32803 ; support to frame quoted text string with single quote. - 32804 ; (apostrophe) $P_SorD_Quote is removed from PSDATA.INC. - 32805 ; $P_SQuote EQU also removed from PSDATA.INC. Any references to - 32806 ; single quote in PROC prologues are left as is for history reasons. - 32807 ; - 32808 ; This fixes another bug, not mentioned in p1672, in that two - 32809 ; quote chars within a quoted string is supposed to be reported as - 32810 ; one quote character, but is reported as two quotes. This changed - 32811 ; two instructions in PROC $P_Quoted_Str. - 32812 ; - 32813 ; Also fixed are several JMP that caused a NOP, these changed to - 32814 ; have the SHORT operator to avoid the unneeded NOP. + 32716 ; Vars: $P_Ordinal(RW), $P_RC(RW), $P_SI_Save(RW), $P_DX(R), $P_Terminator(R) + 32717 ; $P_SaveSI_Cmpx(W), $P_Flags(RW), $P_Found_SYNONYM(R), $P_Save_EOB(W) + 32718 ; + 32719 ;-------- Modification History ----------------------------------------- + 32720 ; + 32721 ; 4/04/87 : Created by K. K, + 32722 ; 4/28/87 : $P_Val_YH assemble error (tm01) + 32723 ; : JMP SHORT assemble error (tm02) + 32724 ; 5/14/87 : Someone doesn't want to include psdata (tm03) + 32725 ; 6/12/87 : $P_Bridge is missing when TimeSw equ 0 and (CmpxSw equ 1 or + 32726 ; DateSW equ 1) (tm04) + 32727 ; 6/12/87 : $P_SorD_Quote is missing when QusSw equ 0 and CmpxSW equ 1 + 32728 ; (tm05) in PSDATA.INC + 32729 ; 6/12/87 : $P_FileSp_Char and $P_FileSP_Len are missing + 32730 ; when FileSW equ 0 and DrvSW equ 1 (tm06) in PSDATA.INC + 32731 ; 6/18/87 : $VAL1 and $VAL3, $VAL2 and $VAL3 can be used in the same + 32732 ; value-list block (tm07) + 32733 ; 6/20/87 : Add $P_SW to check if there's an omiting parameter after + 32734 ; switch (keyword) or not. If there is, backup si for next call + 32735 ; (tm08) + 32736 ; 6/24/87 : Complex Item checking does not work correctly when CmpSW equ 1 + 32737 ; and DateSW equ 0 and TimeSW equ 0 (tm09) + 32738 ; 6/24/87 : New function flag $P_colon_is_not_necessary for switch + 32739 ; /+15 and /+:15 are allowed for user (tm10) + 32740 ; 6/29/87 : ECS call changes DS register but it causes the address problem + 32741 ; in user's routines. $P_Chk_DBCS (tm11) + 32742 ; 7/10/87 : Switch with no_match flag (0x0000H) does not work correctly + 32743 ; (tm12) + 32744 ; 7/10/87 : Invalid switch/keyword does not work correctly + 32745 ; (tm13) + 32746 ; 7/10/87 : Drive_only breaks 3 bytes after the result buffer + 32747 ; (tm14) + 32748 ; 7/12/87 : Too_Many_Operands sets DX=0 as the PARSE result + 32749 ; (tm15) + 32750 ; 7/24/87 : Negative lower bound on numeric ranges cause trouble + 32751 ; + 32752 ; 7/24/87 : Quoted strings being returned with quotes. + 32753 ; + 32754 ; 7/28/87 : Kerry S (;AN018;) + 32755 ; Non optional value on switch (match flags<>0 and <>1) not flagged + 32756 ; as an error when missing. Solution: return error 2. Modules + 32757 ; affected: $P_Chk_SW_Control. + 32758 ; + 32759 ; 7/29/87 : Kerry S (;AN019;) + 32760 ; Now allow the optional bit in match flags for switches. This + 32761 ; allows the switch to be encountered with a value or without a + 32762 ; value and no error is returned. + 32763 ; + 32764 ; + 32765 ; 8/28/87 : Ed K, Kerry S (;AN020;) + 32766 ; 9/14/87 In PROC $P_Get_DecNum, when checking for field separators + 32767 ; within a date response, instead of checking just for the one + 32768 ; character defined by the COUNTRY DEPENDENT INFO, check for + 32769 ; all three chars, "-", "/", and ".". Change $P_Chk_Switch to allow + 32770 ; slashes in date strings when DateSw (assembler switch) is set. + 32771 ; + 32772 ; 9/1/87 : Kerry S (;AN021) + 32773 ; In PROC $P_String_Comp, when comparing the switch or keyword on + 32774 ; the command line with the string in the control block the + 32775 ; comparing was stopping at a colon (switch) or equal (keyword) + 32776 ; on the command line and assuming a match. This allowed a shorter + 32777 ; string on the command line than in the synonym list in the control + 32778 ; block. I put in a test for a null in the control block so the + 32779 ; string in the control block must be the same length as the string + 32780 ; preceeding the colon or equal on the command line. + 32781 ; + 32782 ; 8/28/87 : Kerry S (;AN022;) + 32783 ; All references to data in PSDATA.INC had CS overrides. This caused + 32784 ; problems for people who included it themselves in a segment other + 32785 ; than CS. Added switch to allow including PSDATA.INC in any + 32786 ; segment. + 32787 ; + 32788 ; 9/16/87 : Ed K (;AN023;) PTM1040 + 32789 ; in $p_set_cdi PROC, it assumes CS points to psdata. Change Push CS + 32790 ; into PUSH PSDATA_SEG. In $P_Get_DecNum PROC, fix AN020 + 32791 ; forced both TIME and DATE to use the delims, "-","/",".". + 32792 ; Created FLag, in $P_time_Format PROC, to request the delim in + 32793 ; BL be used if TIME is being parsed. + 32794 ; + 32795 ; 9/24/87 : Ed K + 32796 ; Removed the include to STRUC.INC. Replaced the STRUC macro + 32797 ; invocations with their normally expanded code; made comments + 32798 ; out of the STRUC macro invocation statements to maintain readability. + 32799 ; + 32800 ; 9/24/87 : Ed K (;AN024;) PTM1222 + 32801 ; When no CONTROL for a keyword found, tried to fill in RESULT + 32802 ; pointed to by non-existant CONTROL. + 32803 ; + 32804 ; 10/15/87 : Ed K (;AN025;) PTM1672 + 32805 ; A quoted text string can be framed only by double quote. Remove + 32806 ; support to frame quoted text string with single quote. + 32807 ; (apostrophe) $P_SorD_Quote is removed from PSDATA.INC. + 32808 ; $P_SQuote EQU also removed from PSDATA.INC. Any references to + 32809 ; single quote in PROC prologues are left as is for history reasons. + 32810 ; + 32811 ; This fixes another bug, not mentioned in p1672, in that two + 32812 ; quote chars within a quoted string is supposed to be reported as + 32813 ; one quote character, but is reported as two quotes. This changed + 32814 ; two instructions in PROC $P_Quoted_Str. 32815 ; - 32816 ; The code and PSDATA.INC have been aligned for ease of reading. - 32817 ; - 32818 ; 10/26/87 : Ed K (;AN026;) PTM2041, DATE within SWITCH, BX reference to - 32819 ; psdata buffer should have psdata_seg. + 32816 ; Also fixed are several JMP that caused a NOP, these changed to + 32817 ; have the SHORT operator to avoid the unneeded NOP. + 32818 ; + 32819 ; The code and PSDATA.INC have been aligned for ease of reading. 32820 ; - 32821 ; 10/27/87 : Ed K (;AN027;) PTM2042 comma between keywords implies - 32822 ; positional missing. + 32821 ; 10/26/87 : Ed K (;AN026;) PTM2041, DATE within SWITCH, BX reference to + 32822 ; psdata buffer should have psdata_seg. 32823 ; - 32824 ; 11/06/87 : Ed K (;AN028;) PTM 2315 Parser should not use line feed - 32825 ; as a line delimiter, should use carriage return. - 32826 ; Define switch: LFEOLSW, if on, accept LF as end of line char. - 32827 ; - 32828 ; 11/11/87 : Ed K (;AN029;) PTM 1651 GET RID OF WHITESPACE AROUND "=". - 32829 ; - 32830 ; 11/18/87 : Ed K (;AN030;) PTM 2551 If filename is just "", then - 32831 ; endless loop since SI is returned still pointing to start - 32832 ; of that parm. - 32833 ; - 32834 ; 11/19/87 : Ed K (;AN031;) PTM 2585 date & time getting bad values. - 32835 ; Vector to returned string has CS instead of Psdata_Seg, but - 32836 ; when tried to fix it on previous version, changed similar - 32837 ; but wrong place. - 32838 ; - 32839 ; 12/09/87 : Bill L (;AN032;) PTM 2772 colon and period are now valid - 32840 ; delimiters between hours, minutes, seconds for time. And period - 32841 ; and comma are valid delimiters between seconds and 100th second. - 32842 ; - 32843 ; 12/14/87 : Bill L (;AN033;) PTM 2722 if illegal delimiter characters - 32844 ; in a filespec, then flag an error. + 32824 ; 10/27/87 : Ed K (;AN027;) PTM2042 comma between keywords implies + 32825 ; positional missing. + 32826 ; + 32827 ; 11/06/87 : Ed K (;AN028;) PTM 2315 Parser should not use line feed + 32828 ; as a line delimiter, should use carriage return. + 32829 ; Define switch: LFEOLSW, if on, accept LF as end of line char. + 32830 ; + 32831 ; 11/11/87 : Ed K (;AN029;) PTM 1651 GET RID OF WHITESPACE AROUND "=". + 32832 ; + 32833 ; 11/18/87 : Ed K (;AN030;) PTM 2551 If filename is just "", then + 32834 ; endless loop since SI is returned still pointing to start + 32835 ; of that parm. + 32836 ; + 32837 ; 11/19/87 : Ed K (;AN031;) PTM 2585 date & time getting bad values. + 32838 ; Vector to returned string has CS instead of Psdata_Seg, but + 32839 ; when tried to fix it on previous version, changed similar + 32840 ; but wrong place. + 32841 ; + 32842 ; 12/09/87 : Bill L (;AN032;) PTM 2772 colon and period are now valid + 32843 ; delimiters between hours, minutes, seconds for time. And period + 32844 ; and comma are valid delimiters between seconds and 100th second. 32845 ; - 32846 ; 12/22/87 : Bill L (;AN034;) All local data to parser is now - 32847 ; indexed off of the psdata_seg equate instead of the DS register. - 32848 ; Using this method, DS can point to the segment of PSP or to psdata - 32849 ; --> local parser data. Why were some references to local data changed - 32850 ; to do this before, but not all ????? - 32851 ; - 32852 ; 02/02/88 : Ed K (;AC035;) INSPECT utility, suggests optimizations. - 32853 ; - 32854 ; 02/05/88 : Ed K (;AN036;) P3372-UPPERCASE TRANSLATION, PSDATA_SEG HOSED. - 32855 ; - 32856 ; 02/08/88 : Ed K (;AN037;) P3410-AVOID POP OF CS, CHECK BASESW FIRST. - 32857 ; - 32858 ; 02/19/88 : Ed K (;AN038;) p3524 above noon and "am" should be error - 32859 ; - 32860 ; 02/23/88 : Ed K (;AN039;) p3518 accept "comma" and "period" as decimal - 32861 ; separator in TIME before hundredths field. + 32846 ; 12/14/87 : Bill L (;AN033;) PTM 2722 if illegal delimiter characters + 32847 ; in a filespec, then flag an error. + 32848 ; + 32849 ; 12/22/87 : Bill L (;AN034;) All local data to parser is now + 32850 ; indexed off of the psdata_seg equate instead of the DS register. + 32851 ; Using this method, DS can point to the segment of PSP or to psdata + 32852 ; --> local parser data. Why were some references to local data changed + 32853 ; to do this before, but not all ????? + 32854 ; + 32855 ; 02/02/88 : Ed K (;AC035;) INSPECT utility, suggests optimizations. + 32856 ; + 32857 ; 02/05/88 : Ed K (;AN036;) P3372-UPPERCASE TRANSLATION, PSDATA_SEG HOSED. + 32858 ; + 32859 ; 02/08/88 : Ed K (;AN037;) P3410-AVOID POP OF CS, CHECK BASESW FIRST. + 32860 ; + 32861 ; 02/19/88 : Ed K (;AN038;) p3524 above noon and "am" should be error 32862 ; - 32863 ; 08/09/90 : SA M005 Prevented parser from recognizing '=' signs within - 32864 ; strings as keywords. + 32863 ; 02/23/88 : Ed K (;AN039;) p3518 accept "comma" and "period" as decimal + 32864 ; separator in TIME before hundredths field. 32865 ; - 32866 ;*********************************************************************** - 32867 - 32868 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 32869 cmd_parse: - 32870 ;call sysparse - 32871 ;retn - 32872 - 32873 ; ----------------------------------- - 32874 - 32875 ; 29/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 32876 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:44E7h + 32866 ; 08/09/90 : SA M005 Prevented parser from recognizing '=' signs within + 32867 ; strings as keywords. + 32868 ; + 32869 ;*********************************************************************** + 32870 + 32871 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 32872 cmd_parse: + 32873 ;call sysparse + 32874 ;retn + 32875 + 32876 ; ----------------------------------- 32877 - 32878 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 32879 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4CABh + 32878 ; 29/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 32879 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:44E7h 32880 - 32881 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 32882 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4B73h - 32883 sysparse: - 32884 0000496C 2EC706[C597]0000 mov word [cs:$P_Flags],0 ;AC034; Clear all internal flags - 32885 00004973 2E890E[4F98] mov [cs:$P_ORIG_ORD],cx ;AN039; ORIGINAL ORDINAL FROM CX - 32886 00004978 2E8926[5198] mov [cs:$P_ORIG_STACK],sp ;AN039; ORIGINAL VALUE OF STACK FROM SP - 32887 0000497D 2E8936[5398] mov [cs:$P_ORIG_SI],si ;AN039; ORIGINAL START PARSE POINTER FROM SI - 32888 $P_Redo_Time: ;AN039; try to parse time again - 32889 00004982 FC cld ;AN000; confirm forward direction - 32890 00004983 2E890E[B897] mov [cs:$P_ORDINAL],cx ;AC034; save operand ordinal - 32891 ;mov word [cs:$P_RC],$P_No_Error - 32892 00004988 2EC706[BA97]0000 mov word [cs:$P_RC],0 ;AC034; Assume no error - 32893 0000498F 2EC706[CD97]0000 mov word [cs:$P_Found_SYNONYM],0 - 32894 ;AC034; initalize synonym pointer - 32895 00004996 2EC706[BE97]0000 mov word [cs:$P_DX],0 ;AC034; (tm15) - 32896 - 32897 ;M029 -- Begin changes - 32898 ; The table of special chars $P_FileSp_Char should be initialized on every - 32899 ;entry to SysParse. This is in the non-checksum region and any program that - 32900 ;corrupts this table but does not corrupt the checksum region will leave - 32901 ;command.com parsing in an inconsistent state. - 32902 ; NB: The special characters string has been hardcoded here. If any change - 32903 ;is made to it in psdata.inc, a corresponding change needs to be made here. - 32904 - 32905 0000499D 2EC706[8A98]5B5D mov word [cs:$P_FileSp_Char], '[]' ; "[]|<>+=;\"" - 32906 000049A4 2EC706[8C98]7C3C mov word [cs:$P_FileSp_Char+2], '|<' - 32907 000049AB 2EC706[8E98]3E2B mov word [cs:$P_FileSp_Char+4], '>+' - 32908 000049B2 2EC706[9098]3D3B mov word [cs:$P_FileSp_Char+6], '=;' - 32909 - 32910 ;M029 -- End of changes - 32911 - 32912 000049B9 E82809 call $P_Skip_Delim ;AN000; Move si to 1st non white space - 32913 000049BC 7312 jnc short $P_Start ;AN000; If EOL is not encountered, do parse + 32881 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 32882 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4CABh + 32883 + 32884 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 32885 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4B73h + 32886 sysparse: + 32887 0000496C 2EC706[C597]0000 mov word [cs:$P_Flags],0 ;AC034; Clear all internal flags + 32888 00004973 2E890E[4F98] mov [cs:$P_ORIG_ORD],cx ;AN039; ORIGINAL ORDINAL FROM CX + 32889 00004978 2E8926[5198] mov [cs:$P_ORIG_STACK],sp ;AN039; ORIGINAL VALUE OF STACK FROM SP + 32890 0000497D 2E8936[5398] mov [cs:$P_ORIG_SI],si ;AN039; ORIGINAL START PARSE POINTER FROM SI + 32891 $P_Redo_Time: ;AN039; try to parse time again + 32892 00004982 FC cld ;AN000; confirm forward direction + 32893 00004983 2E890E[B897] mov [cs:$P_ORDINAL],cx ;AC034; save operand ordinal + 32894 ;mov word [cs:$P_RC],$P_No_Error + 32895 00004988 2EC706[BA97]0000 mov word [cs:$P_RC],0 ;AC034; Assume no error + 32896 0000498F 2EC706[CD97]0000 mov word [cs:$P_Found_SYNONYM],0 + 32897 ;AC034; initalize synonym pointer + 32898 00004996 2EC706[BE97]0000 mov word [cs:$P_DX],0 ;AC034; (tm15) + 32899 + 32900 ;M029 -- Begin changes + 32901 ; The table of special chars $P_FileSp_Char should be initialized on every + 32902 ;entry to SysParse. This is in the non-checksum region and any program that + 32903 ;corrupts this table but does not corrupt the checksum region will leave + 32904 ;command.com parsing in an inconsistent state. + 32905 ; NB: The special characters string has been hardcoded here. If any change + 32906 ;is made to it in psdata.inc, a corresponding change needs to be made here. + 32907 + 32908 0000499D 2EC706[8A98]5B5D mov word [cs:$P_FileSp_Char], '[]' ; "[]|<>+=;\"" + 32909 000049A4 2EC706[8C98]7C3C mov word [cs:$P_FileSp_Char+2], '|<' + 32910 000049AB 2EC706[8E98]3E2B mov word [cs:$P_FileSp_Char+4], '>+' + 32911 000049B2 2EC706[9098]3D3B mov word [cs:$P_FileSp_Char+6], '=;' + 32912 + 32913 ;M029 -- End of changes 32914 - 32915 ;--------------------------- End of Line - 32916 ;mov ax,$P_RC_EOL ;AN000; set exit code to -1 - 32917 000049BE B8FFFF mov ax,0FFFFh - 32918 000049C1 53 push bx ;AN000; - 32919 ;mov bx,[es:di+$P_PARMS_BLK.$P_PARMSX_Address] - 32920 000049C2 268B1D mov bx,[es:di] ;AN000; Get the PARMSX address to - 32921 - 32922 ;cmp cl,[es:bx+$P_PARMSX_BLK.$P_MinP] - 32923 000049C5 263A0F cmp cl,[es:bx] ;AN000; check ORDINAL to see if the minimum - 32924 000049C8 7304 jae short $P_Fin ;AN000; positional found. - 32925 - 32926 ;mov ax,2 - 32927 000049CA B80200 mov ax,$P_Op_Missing ; 2 ;AN000; If no, set exit code to missing operand - 32928 ; 27/04/2023 - 32929 000049CD F8 clc - 32930 $P_Fin: ;AN000; - 32931 000049CE 5B pop bx ;AN000; - 32932 ;jmp $P_Single_Exit ;AN000; return to the caller - 32933 ; 27/04/2023 - 32934 ; cf = 0 - 32935 ;clc - 32936 000049CF C3 retn - 32937 - 32938 ;--------------------------- - 32939 $P_Start: ;AN000; - 32940 000049D0 2E8936[C797] mov [cs:$P_SaveSI_Cmpx],si ;AN000;AC034; save ptr to command line for later use by complex, - 32941 000049D5 53 push bx ;AN000; quoted string or file spec. - 32942 000049D6 57 push di ;AN000; - 32943 000049D7 55 push bp ;AN000; - 32944 000049D8 8D1E[CF97] lea bx,$P_STRING_BUF ;AC034; set buffer to copy from command string - 32945 000049DC 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra ; 20h - 32946 ;test byte [cs:$P_Flags2],20h ;AC034; 3/9 extra delimiter encountered ? - 32947 000049E2 7543 jnz short $P_Pack_End ;AN000; 3/9 if yes, no need to copy - 32948 $P_Pack_Loop: ;AN000; - 32949 000049E4 AC lodsb ;AN000; Pick a operand from buffer - 32950 000049E5 E8AF09 call $P_Chk_Switch ;AN000; Check switch character - 32951 000049E8 723C jc short $P_Pack_End_BY_EOL ;AN020; if carry set found delimiter type slash, need backup si, else continue - 32952 - 32953 000049EA E81909 call $P_Chk_EOL ;AN000; Check EOL character - 32954 000049ED 7437 je short $P_Pack_End_BY_EOL ;AN000; need backup si + 32915 000049B9 E82809 call $P_Skip_Delim ;AN000; Move si to 1st non white space + 32916 000049BC 7312 jnc short $P_Start ;AN000; If EOL is not encountered, do parse + 32917 + 32918 ;--------------------------- End of Line + 32919 ;mov ax,$P_RC_EOL ;AN000; set exit code to -1 + 32920 000049BE B8FFFF mov ax,0FFFFh + 32921 000049C1 53 push bx ;AN000; + 32922 ;mov bx,[es:di+$P_PARMS_BLK.$P_PARMSX_Address] + 32923 000049C2 268B1D mov bx,[es:di] ;AN000; Get the PARMSX address to + 32924 + 32925 ;cmp cl,[es:bx+$P_PARMSX_BLK.$P_MinP] + 32926 000049C5 263A0F cmp cl,[es:bx] ;AN000; check ORDINAL to see if the minimum + 32927 000049C8 7304 jae short $P_Fin ;AN000; positional found. + 32928 + 32929 ;mov ax,2 + 32930 000049CA B80200 mov ax,$P_Op_Missing ; 2 ;AN000; If no, set exit code to missing operand + 32931 ; 27/04/2023 + 32932 000049CD F8 clc + 32933 $P_Fin: ;AN000; + 32934 000049CE 5B pop bx ;AN000; + 32935 ;jmp $P_Single_Exit ;AN000; return to the caller + 32936 ; 27/04/2023 + 32937 ; cf = 0 + 32938 ;clc + 32939 000049CF C3 retn + 32940 + 32941 ;--------------------------- + 32942 $P_Start: ;AN000; + 32943 000049D0 2E8936[C797] mov [cs:$P_SaveSI_Cmpx],si ;AN000;AC034; save ptr to command line for later use by complex, + 32944 000049D5 53 push bx ;AN000; quoted string or file spec. + 32945 000049D6 57 push di ;AN000; + 32946 000049D7 55 push bp ;AN000; + 32947 000049D8 8D1E[CF97] lea bx,$P_STRING_BUF ;AC034; set buffer to copy from command string + 32948 000049DC 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra ; 20h + 32949 ;test byte [cs:$P_Flags2],20h ;AC034; 3/9 extra delimiter encountered ? + 32950 000049E2 7543 jnz short $P_Pack_End ;AN000; 3/9 if yes, no need to copy + 32951 $P_Pack_Loop: ;AN000; + 32952 000049E4 AC lodsb ;AN000; Pick a operand from buffer + 32953 000049E5 E8AF09 call $P_Chk_Switch ;AN000; Check switch character + 32954 000049E8 723C jc short $P_Pack_End_BY_EOL ;AN020; if carry set found delimiter type slash, need backup si, else continue 32955 - 32956 000049EF E84609 call $P_Chk_Delim ;AN000; Check delimiter - 32957 000049F2 7518 jne short $P_PL01 ;AN000; If no, process next byte + 32956 000049EA E81909 call $P_Chk_EOL ;AN000; Check EOL character + 32957 000049ED 7437 je short $P_Pack_End_BY_EOL ;AN000; need backup si 32958 - 32959 000049F4 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra ; 20h - 32960 ;test byte [cs:$P_Flags2],20h ;AC034; 3/9 If yes and white spec, - 32961 000049FA 7505 jnz short $P_Pack_End_backup_si - 32962 ;AN000; (tm08) - 32963 000049FC E8E508 call $P_Skip_Delim ;AN000; skip subsequent white space,too - 32964 000049FF EB26 jmp short $P_Pack_End ;AN000; finish copy by placing NUL at end - 32965 - 32966 $P_Pack_End_backup_si: ;AN000; (tm08) - 32967 00004A01 2EF606[C697]41 test byte [cs:$P_Flags2],$P_SW+$P_equ ; 41h - 32968 ;test byte [cs:$P_Flags2],41h ;AN000;AC034; (tm08) - 32969 00004A07 741E jz short $P_Pack_End ;AN000; (tm08) - 32970 - 32971 00004A09 4E dec si ;AN000; (tm08) - 32972 00004A0A EB1B jmp short $P_Pack_End ;AN025; (tm08) - 32973 $P_PL01: ;AN000; - 32974 00004A0C 2E8807 mov [cs:bx],al ;AN000; move byte to STRING_BUF - 32975 ;cmp al,'=' - 32976 00004A0F 3C3D cmp al,$P_Keyword ; '=' ;AN000; if it is equal character, - 32977 00004A11 7506 jne short $P_PL00 ;AN000; then - 32978 - 32979 00004A13 2E800E[C697]01 or byte [cs:$P_Flags2],$P_equ - 32980 ;or byte [cs:$P_Flags_2],1 ;AC034; remember it in flag - 32981 $P_PL00: ;AN000; - 32982 00004A19 43 inc bx ;AN000; ready to see next byte - 32983 00004A1A E8A509 call $P_Chk_DBCS ;AN000; was it 1st byte of DBCS ? - 32984 00004A1D 73C5 jnc short $P_Pack_Loop ;AN000; if no, process to next byte - 32985 - 32986 00004A1F AC lodsb ;AN000; if yes, store - 32987 00004A20 2E8807 mov [cs:bx],al ;AN000; 2nd byte of DBCS - 32988 00004A23 43 inc bx ;AN000; update pointer - 32989 00004A24 EBBE jmp short $P_Pack_Loop ;AN000; process to next byte - 32990 - 32991 $P_Pack_End_BY_EOL: ;AN000; - 32992 00004A26 4E dec si ;AN000; backup si pointer - 32993 $P_Pack_End: ;AN000; - 32994 00004A27 2E8936[BC97] mov [cs:$P_SI_Save],si ;AC034; save next pointer, SI - 32995 ;mov byte [cs:bx],0 - 32996 00004A2C 2EC60700 mov byte [cs:bx],$P_NULL ;AN000; put NULL at the end - 32997 00004A30 2E891E[CB97] mov [cs:$P_Save_EOB],bx - 32998 ;AC034; 3/17/87 keep the address for later use of complex - 32999 ;mov bx,[es:di+$P_PARMS_BLK.$P_PARMSX_Address] - 33000 00004A35 268B1D mov bx,[es:di] ;AN000; get PARMSX address - 33001 00004A38 8D36[CF97] lea si,$P_STRING_BUF ;AC034; - 33002 ;cmp byte [cs:si],'/' - 33003 00004A3C 2E803C2F cmp byte [cs:si],$P_Switch ;AN000; the operand begins w/ switch char ? - 33004 00004A40 7442 je short $P_SW_Manager ;AN000; if yes, process as switch - 33005 - 33006 00004A42 2E803C22 cmp byte [cs:si],$P_DQuote ;M005;is it a string? - 33007 00004A46 7408 je short $P_Positional_Manager - 33008 ;M005;if so, process as one! - 33009 00004A48 2EF606[C697]01 test byte [cs:$P_Flags2],$P_equ - 33010 ;test byte [cs:$P_Flags2],1 ;AC034; the operand includes equal char ? - 33011 00004A4E 7556 jnz short $P_Key_Manager ;AN000; if yes, process as keyword - 33012 - 33013 $P_Positional_Manager: ;AN000; else process as positional - 33014 ;mov al,[es:bx+1] ;AN000; get maxp - 33015 00004A50 268A4701 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] - 33016 00004A54 30E4 xor ah,ah ;AN000; ax = maxp - 33017 00004A56 2E3906[B897] cmp [cs:$P_ORDINAL],ax ;AC034; too many positional ? - 33018 00004A5B 7312 jae short $P_Too_Many_Error ;AN000; if yes, set exit code to too many - 33019 - 33020 00004A5D 2EA1[B897] mov ax,[cs:$P_ORDINAL] ;AC034; see what the current ordinal - 33021 00004A61 D1E0 shl ax,1 ;AN000; ax = ax*2 - 33022 00004A63 43 inc bx ;AC035; add '2' to - 33023 00004A64 43 inc bx ;AC035; BX reg - 33024 ;AN000; now bx points to 1st CONTROL - 33025 00004A65 01C3 add bx,ax ;AN000; now bx points to specified CONTROL address - 33026 00004A67 268B1F mov bx,[es:bx] ;AN000; now bx points to specified CONTROL itself - 33027 00004A6A E88000 call $P_Chk_Pos_Control ;AN000; Do process for positional - 33028 00004A6D EB61 jmp short $P_Return_to_Caller - 33029 ;AN000; and return to the caller - 33030 $P_Too_Many_Error: ;AN000; - 33031 ;mov word [cs:$P_RC],1 - 33032 00004A6F 2EC706[BA97]0100 mov word [cs:$P_RC],$P_Too_Many - 33033 ;AC034; set exit code - 33034 00004A76 EB58 jmp short $P_Return_to_Caller - 33035 ;AN000; and return to the caller - 33036 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 33037 %if 0 - 33038 $P_SW_Manager: ;AN000; - 33039 ;mov al,[es:bx+1] ;AN000; get maxp - 33040 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] - 33041 xor ah,ah ;AN000; ax = maxp - 33042 inc ax ;AN000; - 33043 shl ax,1 ;AN000; ax = (ax+1)*2 - 33044 add bx,ax ;AN000; now bx points to maxs - 33045 mov cl,[es:bx] ;AN000; - 33046 xor ch,ch ;AN000; cx = maxs - 33047 or cx,cx ;AN000; at least one switch ? - 33048 jz short $P_SW_Not_Found ;AN000; - 33049 inc bx ;AN000; now bx points to 1st CONTROL address - 33050 %else - 33051 $P_get_max_ptr: - 33052 ;mov al,[es:bx+1] ; get maxp - 33053 00004A78 268A4701 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] - 33054 00004A7C 30E4 xor ah,ah ; ax = maxp - 33055 00004A7E 40 inc ax - 33056 00004A7F D1E0 shl ax,1 ; ax = (ax+1)*2 - 33057 00004A81 01C3 add bx,ax ; now bx points to maxs - 33058 00004A83 C3 retn - 33059 - 33060 $P_SW_Manager: - 33061 00004A84 E8F1FF call $P_get_max_ptr - 33062 00004A87 268A0F mov cl,[es:bx] - 33063 00004A8A 30ED xor ch,ch ; cx = maxs - 33064 ; at least one switch ? - 33065 00004A8C E30F jcxz $P_SW_Not_Found ; no - 33066 00004A8E 43 inc bx ; now bx points to 1st CONTROL address - 33067 %endif - 33068 - 33069 $P_SW_Mgr_Loop: ;AN000; - 33070 00004A8F 53 push bx ;AN000; - 33071 00004A90 268B1F mov bx,[es:bx] ;AN000; bx points to Switch CONTROL itself - 33072 00004A93 E8B700 call $P_Chk_SW_Control ;AN000; do process for switch - 33073 00004A96 5B pop bx ;AN000; - 33074 00004A97 7337 jnc short $P_Return_to_Caller - 33075 ;AN000; if the CONTROL is for the switch, exit - 33076 00004A99 43 inc bx ;AC035; add '2' to - 33077 00004A9A 43 inc bx ;AC035; BX reg - 33078 ;AN000; else bx points to the next CONTROL - 33079 00004A9B E2F2 loop $P_SW_Mgr_Loop ;AN000; and loop - 33080 $P_SW_Not_Found: ;AN000; - 33081 ;mov word [cs:$P_RC],3 - 33082 00004A9D 2EC706[BA97]0300 mov word [cs:$P_RC],$P_Not_In_SW - 33083 ;AC034; here no CONTROL for the switch has - 33084 00004AA4 EB2A jmp short $P_Return_to_Caller0 - 33085 ;AN000; not been found, means error. - 33086 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 33087 %if 0 - 33088 $P_Key_Manager: ;AN000; - 33089 ;mov al,[es:bx+1] ;AN000; get maxp - 33090 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] - 33091 xor ah,ah ;AN000; ax = maxp - 33092 inc ax ;AN000; - 33093 shl ax,1 ;AN000; ax = (ax+1)*2 - 33094 add bx,ax ;AN000; now bx points to maxs - 33095 mov al,[es:bx] ;AN000; - 33096 xor ah,ah ;AN000; ax = maxs - 33097 shl ax,1 ;AN000; - 33098 inc ax ;AN000; ax = ax*2+1 - 33099 add bx,ax ;AN000; now bx points to maxk - 33100 mov cl,[es:bx] ;AN000; - 33101 xor ch,ch ;AN000; cx = maxk - 33102 or cx,cx ;AN000; at least one keyword ? - 33103 jz short $P_Key_Not_Found ;AN000; - 33104 inc bx ;AN000; now bx points to 1st CONTROL - 33105 %else - 33106 $P_Key_Manager: - 33107 00004AA6 E8CFFF call $P_get_max_ptr - 33108 00004AA9 268A07 mov al,[es:bx] - 33109 00004AAC 30E4 xor ah,ah ; ax = maxs - 33110 00004AAE D1E0 shl ax,1 - 33111 00004AB0 40 inc ax ; ax = ax*2+1 - 33112 00004AB1 01C3 add bx,ax ; now bx points to maxk - 33113 00004AB3 268A0F mov cl,[es:bx] - 33114 00004AB6 30ED xor ch,ch ; cx = maxk - 33115 ; at least one keyword ? - 33116 00004AB8 E30F jcxz $P_Key_Not_Found - 33117 00004ABA 43 inc bx ; now bx points to 1st CONTROL - 33118 %endif - 33119 - 33120 $P_Key_Mgr_Loop: ;AN000; - 33121 00004ABB 53 push bx ;AN000; - 33122 00004ABC 268B1F mov bx,[es:bx] ;AN000; bx points to keyword CONTROL itself - 33123 00004ABF E85A00 call $P_Chk_Key_Control ;AN000; do process for keyword - 33124 00004AC2 5B pop bx ;AN000; - 33125 00004AC3 730B jnc short $P_Return_to_Caller - 33126 ;AN000; if the CONTROL is for the keyword, exit - 33127 00004AC5 43 inc bx ;AC035; add '2' to - 33128 00004AC6 43 inc bx ;AC035; BX reg - 33129 ;AN000; else bx points to the next CONTROL - 33130 00004AC7 E2F2 loop $P_Key_Mgr_Loop ;AN000; and loop - 33131 $P_Key_Not_Found: ;AN000; - 33132 ;mov word [cs:$P_RC],4 - 33133 00004AC9 2EC706[BA97]0400 mov word [cs:$P_RC],$P_Not_In_Key - 33134 ;AC034; here no CONTROL for the keyword has - 33135 $P_Return_to_Caller0: - 33136 $P_Return_to_Caller: ;AN000; not been found, means error. - 33137 00004AD0 5D pop bp ;AN000; - 33138 00004AD1 5F pop di ;AN000; - 33139 00004AD2 5B pop bx ;AN000; - 33140 00004AD3 2E8B0E[B897] mov cx,[cs:$P_ORDINAL] ;AC034; return next ordinal - 33141 00004AD8 2EA1[BA97] mov ax,[cs:$P_RC] ;AC034; return exit code - 33142 00004ADC 2E8B36[BC97] mov si,[cs:$P_SI_Save] ;AC034; return next operand pointer - 33143 00004AE1 2E8B16[BE97] mov dx,[cs:$P_DX] ;AC034; return result buffer address - 33144 00004AE6 2E8A1E[C097] mov bl,[cs:$P_Terminator] ;AC034; return delimiter code found - 33145 $P_Single_Exit: ;AN000; - 33146 00004AEB F8 clc ;AN000; - 33147 00004AEC C3 retn ;AN000; - 33148 - 33149 ;*********************************************************************** - 33150 ; $P_Chk_Pos_Control - 33151 ; - 33152 ; Function: Parse CONTROL block for a positional - 33153 ; - 33154 ; Input: ES:BX -> CONTROL block - 33155 ; psdata_seg:SI -> $P_STRING_BUF + 32959 000049EF E84609 call $P_Chk_Delim ;AN000; Check delimiter + 32960 000049F2 7518 jne short $P_PL01 ;AN000; If no, process next byte + 32961 + 32962 000049F4 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra ; 20h + 32963 ;test byte [cs:$P_Flags2],20h ;AC034; 3/9 If yes and white spec, + 32964 000049FA 7505 jnz short $P_Pack_End_backup_si + 32965 ;AN000; (tm08) + 32966 000049FC E8E508 call $P_Skip_Delim ;AN000; skip subsequent white space,too + 32967 000049FF EB26 jmp short $P_Pack_End ;AN000; finish copy by placing NUL at end + 32968 + 32969 $P_Pack_End_backup_si: ;AN000; (tm08) + 32970 00004A01 2EF606[C697]41 test byte [cs:$P_Flags2],$P_SW+$P_equ ; 41h + 32971 ;test byte [cs:$P_Flags2],41h ;AN000;AC034; (tm08) + 32972 00004A07 741E jz short $P_Pack_End ;AN000; (tm08) + 32973 + 32974 00004A09 4E dec si ;AN000; (tm08) + 32975 00004A0A EB1B jmp short $P_Pack_End ;AN025; (tm08) + 32976 $P_PL01: ;AN000; + 32977 00004A0C 2E8807 mov [cs:bx],al ;AN000; move byte to STRING_BUF + 32978 ;cmp al,'=' + 32979 00004A0F 3C3D cmp al,$P_Keyword ; '=' ;AN000; if it is equal character, + 32980 00004A11 7506 jne short $P_PL00 ;AN000; then + 32981 + 32982 00004A13 2E800E[C697]01 or byte [cs:$P_Flags2],$P_equ + 32983 ;or byte [cs:$P_Flags_2],1 ;AC034; remember it in flag + 32984 $P_PL00: ;AN000; + 32985 00004A19 43 inc bx ;AN000; ready to see next byte + 32986 00004A1A E8A509 call $P_Chk_DBCS ;AN000; was it 1st byte of DBCS ? + 32987 00004A1D 73C5 jnc short $P_Pack_Loop ;AN000; if no, process to next byte + 32988 + 32989 00004A1F AC lodsb ;AN000; if yes, store + 32990 00004A20 2E8807 mov [cs:bx],al ;AN000; 2nd byte of DBCS + 32991 00004A23 43 inc bx ;AN000; update pointer + 32992 00004A24 EBBE jmp short $P_Pack_Loop ;AN000; process to next byte + 32993 + 32994 $P_Pack_End_BY_EOL: ;AN000; + 32995 00004A26 4E dec si ;AN000; backup si pointer + 32996 $P_Pack_End: ;AN000; + 32997 00004A27 2E8936[BC97] mov [cs:$P_SI_Save],si ;AC034; save next pointer, SI + 32998 ;mov byte [cs:bx],0 + 32999 00004A2C 2EC60700 mov byte [cs:bx],$P_NULL ;AN000; put NULL at the end + 33000 00004A30 2E891E[CB97] mov [cs:$P_Save_EOB],bx + 33001 ;AC034; 3/17/87 keep the address for later use of complex + 33002 ;mov bx,[es:di+$P_PARMS_BLK.$P_PARMSX_Address] + 33003 00004A35 268B1D mov bx,[es:di] ;AN000; get PARMSX address + 33004 00004A38 8D36[CF97] lea si,$P_STRING_BUF ;AC034; + 33005 ;cmp byte [cs:si],'/' + 33006 00004A3C 2E803C2F cmp byte [cs:si],$P_Switch ;AN000; the operand begins w/ switch char ? + 33007 00004A40 7442 je short $P_SW_Manager ;AN000; if yes, process as switch + 33008 + 33009 00004A42 2E803C22 cmp byte [cs:si],$P_DQuote ;M005;is it a string? + 33010 00004A46 7408 je short $P_Positional_Manager + 33011 ;M005;if so, process as one! + 33012 00004A48 2EF606[C697]01 test byte [cs:$P_Flags2],$P_equ + 33013 ;test byte [cs:$P_Flags2],1 ;AC034; the operand includes equal char ? + 33014 00004A4E 7556 jnz short $P_Key_Manager ;AN000; if yes, process as keyword + 33015 + 33016 $P_Positional_Manager: ;AN000; else process as positional + 33017 ;mov al,[es:bx+1] ;AN000; get maxp + 33018 00004A50 268A4701 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] + 33019 00004A54 30E4 xor ah,ah ;AN000; ax = maxp + 33020 00004A56 2E3906[B897] cmp [cs:$P_ORDINAL],ax ;AC034; too many positional ? + 33021 00004A5B 7312 jae short $P_Too_Many_Error ;AN000; if yes, set exit code to too many + 33022 + 33023 00004A5D 2EA1[B897] mov ax,[cs:$P_ORDINAL] ;AC034; see what the current ordinal + 33024 00004A61 D1E0 shl ax,1 ;AN000; ax = ax*2 + 33025 00004A63 43 inc bx ;AC035; add '2' to + 33026 00004A64 43 inc bx ;AC035; BX reg + 33027 ;AN000; now bx points to 1st CONTROL + 33028 00004A65 01C3 add bx,ax ;AN000; now bx points to specified CONTROL address + 33029 00004A67 268B1F mov bx,[es:bx] ;AN000; now bx points to specified CONTROL itself + 33030 00004A6A E88000 call $P_Chk_Pos_Control ;AN000; Do process for positional + 33031 00004A6D EB61 jmp short $P_Return_to_Caller + 33032 ;AN000; and return to the caller + 33033 $P_Too_Many_Error: ;AN000; + 33034 ;mov word [cs:$P_RC],1 + 33035 00004A6F 2EC706[BA97]0100 mov word [cs:$P_RC],$P_Too_Many + 33036 ;AC034; set exit code + 33037 00004A76 EB58 jmp short $P_Return_to_Caller + 33038 ;AN000; and return to the caller + 33039 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 33040 %if 0 + 33041 $P_SW_Manager: ;AN000; + 33042 ;mov al,[es:bx+1] ;AN000; get maxp + 33043 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] + 33044 xor ah,ah ;AN000; ax = maxp + 33045 inc ax ;AN000; + 33046 shl ax,1 ;AN000; ax = (ax+1)*2 + 33047 add bx,ax ;AN000; now bx points to maxs + 33048 mov cl,[es:bx] ;AN000; + 33049 xor ch,ch ;AN000; cx = maxs + 33050 or cx,cx ;AN000; at least one switch ? + 33051 jz short $P_SW_Not_Found ;AN000; + 33052 inc bx ;AN000; now bx points to 1st CONTROL address + 33053 %else + 33054 $P_get_max_ptr: + 33055 ;mov al,[es:bx+1] ; get maxp + 33056 00004A78 268A4701 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] + 33057 00004A7C 30E4 xor ah,ah ; ax = maxp + 33058 00004A7E 40 inc ax + 33059 00004A7F D1E0 shl ax,1 ; ax = (ax+1)*2 + 33060 00004A81 01C3 add bx,ax ; now bx points to maxs + 33061 00004A83 C3 retn + 33062 + 33063 $P_SW_Manager: + 33064 00004A84 E8F1FF call $P_get_max_ptr + 33065 00004A87 268A0F mov cl,[es:bx] + 33066 00004A8A 30ED xor ch,ch ; cx = maxs + 33067 ; at least one switch ? + 33068 00004A8C E30F jcxz $P_SW_Not_Found ; no + 33069 00004A8E 43 inc bx ; now bx points to 1st CONTROL address + 33070 %endif + 33071 + 33072 $P_SW_Mgr_Loop: ;AN000; + 33073 00004A8F 53 push bx ;AN000; + 33074 00004A90 268B1F mov bx,[es:bx] ;AN000; bx points to Switch CONTROL itself + 33075 00004A93 E8B700 call $P_Chk_SW_Control ;AN000; do process for switch + 33076 00004A96 5B pop bx ;AN000; + 33077 00004A97 7337 jnc short $P_Return_to_Caller + 33078 ;AN000; if the CONTROL is for the switch, exit + 33079 00004A99 43 inc bx ;AC035; add '2' to + 33080 00004A9A 43 inc bx ;AC035; BX reg + 33081 ;AN000; else bx points to the next CONTROL + 33082 00004A9B E2F2 loop $P_SW_Mgr_Loop ;AN000; and loop + 33083 $P_SW_Not_Found: ;AN000; + 33084 ;mov word [cs:$P_RC],3 + 33085 00004A9D 2EC706[BA97]0300 mov word [cs:$P_RC],$P_Not_In_SW + 33086 ;AC034; here no CONTROL for the switch has + 33087 00004AA4 EB2A jmp short $P_Return_to_Caller0 + 33088 ;AN000; not been found, means error. + 33089 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 33090 %if 0 + 33091 $P_Key_Manager: ;AN000; + 33092 ;mov al,[es:bx+1] ;AN000; get maxp + 33093 mov al,[es:bx+$P_PARMSX_BLK.$P_MaxP] + 33094 xor ah,ah ;AN000; ax = maxp + 33095 inc ax ;AN000; + 33096 shl ax,1 ;AN000; ax = (ax+1)*2 + 33097 add bx,ax ;AN000; now bx points to maxs + 33098 mov al,[es:bx] ;AN000; + 33099 xor ah,ah ;AN000; ax = maxs + 33100 shl ax,1 ;AN000; + 33101 inc ax ;AN000; ax = ax*2+1 + 33102 add bx,ax ;AN000; now bx points to maxk + 33103 mov cl,[es:bx] ;AN000; + 33104 xor ch,ch ;AN000; cx = maxk + 33105 or cx,cx ;AN000; at least one keyword ? + 33106 jz short $P_Key_Not_Found ;AN000; + 33107 inc bx ;AN000; now bx points to 1st CONTROL + 33108 %else + 33109 $P_Key_Manager: + 33110 00004AA6 E8CFFF call $P_get_max_ptr + 33111 00004AA9 268A07 mov al,[es:bx] + 33112 00004AAC 30E4 xor ah,ah ; ax = maxs + 33113 00004AAE D1E0 shl ax,1 + 33114 00004AB0 40 inc ax ; ax = ax*2+1 + 33115 00004AB1 01C3 add bx,ax ; now bx points to maxk + 33116 00004AB3 268A0F mov cl,[es:bx] + 33117 00004AB6 30ED xor ch,ch ; cx = maxk + 33118 ; at least one keyword ? + 33119 00004AB8 E30F jcxz $P_Key_Not_Found + 33120 00004ABA 43 inc bx ; now bx points to 1st CONTROL + 33121 %endif + 33122 + 33123 $P_Key_Mgr_Loop: ;AN000; + 33124 00004ABB 53 push bx ;AN000; + 33125 00004ABC 268B1F mov bx,[es:bx] ;AN000; bx points to keyword CONTROL itself + 33126 00004ABF E85A00 call $P_Chk_Key_Control ;AN000; do process for keyword + 33127 00004AC2 5B pop bx ;AN000; + 33128 00004AC3 730B jnc short $P_Return_to_Caller + 33129 ;AN000; if the CONTROL is for the keyword, exit + 33130 00004AC5 43 inc bx ;AC035; add '2' to + 33131 00004AC6 43 inc bx ;AC035; BX reg + 33132 ;AN000; else bx points to the next CONTROL + 33133 00004AC7 E2F2 loop $P_Key_Mgr_Loop ;AN000; and loop + 33134 $P_Key_Not_Found: ;AN000; + 33135 ;mov word [cs:$P_RC],4 + 33136 00004AC9 2EC706[BA97]0400 mov word [cs:$P_RC],$P_Not_In_Key + 33137 ;AC034; here no CONTROL for the keyword has + 33138 $P_Return_to_Caller0: + 33139 $P_Return_to_Caller: ;AN000; not been found, means error. + 33140 00004AD0 5D pop bp ;AN000; + 33141 00004AD1 5F pop di ;AN000; + 33142 00004AD2 5B pop bx ;AN000; + 33143 00004AD3 2E8B0E[B897] mov cx,[cs:$P_ORDINAL] ;AC034; return next ordinal + 33144 00004AD8 2EA1[BA97] mov ax,[cs:$P_RC] ;AC034; return exit code + 33145 00004ADC 2E8B36[BC97] mov si,[cs:$P_SI_Save] ;AC034; return next operand pointer + 33146 00004AE1 2E8B16[BE97] mov dx,[cs:$P_DX] ;AC034; return result buffer address + 33147 00004AE6 2E8A1E[C097] mov bl,[cs:$P_Terminator] ;AC034; return delimiter code found + 33148 $P_Single_Exit: ;AN000; + 33149 00004AEB F8 clc ;AN000; + 33150 00004AEC C3 retn ;AN000; + 33151 + 33152 ;*********************************************************************** + 33153 ; $P_Chk_Pos_Control + 33154 ; + 33155 ; Function: Parse CONTROL block for a positional 33156 ; - 33157 ; Output: None - 33158 ; - 33159 ; Use: $P_Fill_Result, $P_Check_Match_Flags - 33160 ; - 33161 ; Vars: $P_Ordinal(W), $P_RC(W) - 33162 ;*********************************************************************** - 33163 - 33164 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33165 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4671h + 33157 ; Input: ES:BX -> CONTROL block + 33158 ; psdata_seg:SI -> $P_STRING_BUF + 33159 ; + 33160 ; Output: None + 33161 ; + 33162 ; Use: $P_Fill_Result, $P_Check_Match_Flags + 33163 ; + 33164 ; Vars: $P_Ordinal(W), $P_RC(W) + 33165 ;*********************************************************************** 33166 - 33167 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33168 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4E35h + 33167 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33168 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4671h 33169 - 33170 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33171 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4CF5h - 33172 $P_Chk_Pos_Control: - 33173 00004AED 50 push ax ;AN000; - 33174 ;mov ax,[es:bx+$P_CONTROL_BLK.$P_Match_Flag] - 33175 00004AEE 268B07 mov ax,[es:bx] ;AN000; - 33176 ;test ax,2 - 33177 00004AF1 A90200 test ax,$P_Repeat ;AN000; repeat allowed ? - 33178 00004AF4 7505 jnz short $P_CPC00 ;AN000; then do not increment ORDINAL - 33179 - 33180 00004AF6 2EFF06[B897] inc word [cs:$P_ORDINAL] ;AC034; update the ordinal - 33181 $P_CPC00: ;AN000; - 33182 ;cmp byte [cs:si],0 - 33183 00004AFB 2E803C00 cmp byte [cs:si],$P_NULL ;AN000; no data ? - 33184 00004AFF 7516 jne short $P_CPC01 ;AN000; - 33185 - 33186 ;test ax,1 - 33187 00004B01 A90100 test ax,$P_Optional ;AN000; yes, then is it optional ? - 33188 00004B04 7509 jnz short $P_CPC02 ;AN000; - 33189 - 33190 00004B06 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing ; 2 - 33191 ;AC034; no, then error 3/17/87 - 33192 00004B0D EB0B jmp short $P_CPC_Exit ;AN000; - 33193 $P_CPC02: ;AN000; - 33194 ; 27/04/2023 - 33195 ;push ax ; * ;AN000; - 33196 ; - 33197 ;;mov al,3 - 33198 ;mov al,$P_String ;AN000; if it is optional return NULL - 33199 ;;mov ah,0FFh - 33200 ;mov ah,$P_No_Tag ;AN000; no item tag indication - 33201 ; 31/03/2023 - 33202 00004B0F B803FF mov ax,($P_No_Tag<<8)+$P_String - 33203 00004B12 E89500 call $P_Fill_Result ;AN000; - 33204 ; 27/04/2023 - 33205 ;pop ax ; * ;AN000; - 33206 00004B15 EB03 jmp short $P_CPC_Exit ;AN000; - 33207 $P_CPC01: ;AN000; - 33208 00004B17 E81101 call $P_Check_Match_Flags ;AN000; - 33209 $P_CPC_Exit: ;AN000; - 33210 00004B1A 58 pop ax ;AN000; - 33211 00004B1B C3 retn ;AN000; - 33212 - 33213 ;*********************************************************************** - 33214 ; $P_Chk_Key_Control - 33215 ; - 33216 ; Function: Parse CONTROL block for a keyword - 33217 ; - 33218 ; Input: ES:BX -> CONTROL block - 33219 ; psdata_seg:SI -> $P_STRING_BUF + 33170 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33171 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4E35h + 33172 + 33173 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33174 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4CF5h + 33175 $P_Chk_Pos_Control: + 33176 00004AED 50 push ax ;AN000; + 33177 ;mov ax,[es:bx+$P_CONTROL_BLK.$P_Match_Flag] + 33178 00004AEE 268B07 mov ax,[es:bx] ;AN000; + 33179 ;test ax,2 + 33180 00004AF1 A90200 test ax,$P_Repeat ;AN000; repeat allowed ? + 33181 00004AF4 7505 jnz short $P_CPC00 ;AN000; then do not increment ORDINAL + 33182 + 33183 00004AF6 2EFF06[B897] inc word [cs:$P_ORDINAL] ;AC034; update the ordinal + 33184 $P_CPC00: ;AN000; + 33185 ;cmp byte [cs:si],0 + 33186 00004AFB 2E803C00 cmp byte [cs:si],$P_NULL ;AN000; no data ? + 33187 00004AFF 7516 jne short $P_CPC01 ;AN000; + 33188 + 33189 ;test ax,1 + 33190 00004B01 A90100 test ax,$P_Optional ;AN000; yes, then is it optional ? + 33191 00004B04 7509 jnz short $P_CPC02 ;AN000; + 33192 + 33193 00004B06 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing ; 2 + 33194 ;AC034; no, then error 3/17/87 + 33195 00004B0D EB0B jmp short $P_CPC_Exit ;AN000; + 33196 $P_CPC02: ;AN000; + 33197 ; 27/04/2023 + 33198 ;push ax ; * ;AN000; + 33199 ; + 33200 ;;mov al,3 + 33201 ;mov al,$P_String ;AN000; if it is optional return NULL + 33202 ;;mov ah,0FFh + 33203 ;mov ah,$P_No_Tag ;AN000; no item tag indication + 33204 ; 31/03/2023 + 33205 00004B0F B803FF mov ax,($P_No_Tag<<8)+$P_String + 33206 00004B12 E89500 call $P_Fill_Result ;AN000; + 33207 ; 27/04/2023 + 33208 ;pop ax ; * ;AN000; + 33209 00004B15 EB03 jmp short $P_CPC_Exit ;AN000; + 33210 $P_CPC01: ;AN000; + 33211 00004B17 E81101 call $P_Check_Match_Flags ;AN000; + 33212 $P_CPC_Exit: ;AN000; + 33213 00004B1A 58 pop ax ;AN000; + 33214 00004B1B C3 retn ;AN000; + 33215 + 33216 ;*********************************************************************** + 33217 ; $P_Chk_Key_Control + 33218 ; + 33219 ; Function: Parse CONTROL block for a keyword 33220 ; - 33221 ; Output: CY = 1 : not match - 33222 ; - 33223 ; Use: $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags - 33224 ; - 33225 ; Vars: $P_RC(W), $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W) - 33226 ;*********************************************************************** - 33227 - 33228 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33229 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33230 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33231 $P_Chk_Key_Control: ;AN000; - 33232 00004B1C F9 stc ;AN000;this logic works when the KeySW - 33233 00004B1D C3 retn ;AN000;is reset. - 33234 - 33235 ;*********************************************************************** - 33236 ; $P_Search_KEYorSW: - 33237 ; - 33238 ; Function: Seach specified keyword or switch from CONTROL - 33239 ; - 33240 ; Input: ES:BX -> CONTROL block - 33241 ; psdata_seg:SI -> $P_STRING_BUF + 33221 ; Input: ES:BX -> CONTROL block + 33222 ; psdata_seg:SI -> $P_STRING_BUF + 33223 ; + 33224 ; Output: CY = 1 : not match + 33225 ; + 33226 ; Use: $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags + 33227 ; + 33228 ; Vars: $P_RC(W), $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W) + 33229 ;*********************************************************************** + 33230 + 33231 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33232 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33233 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33234 $P_Chk_Key_Control: ;AN000; + 33235 00004B1C F9 stc ;AN000;this logic works when the KeySW + 33236 00004B1D C3 retn ;AN000;is reset. + 33237 + 33238 ;*********************************************************************** + 33239 ; $P_Search_KEYorSW: + 33240 ; + 33241 ; Function: Seach specified keyword or switch from CONTROL 33242 ; - 33243 ; Output: CY = 1 : not match - 33244 ; - 33245 ; Use: $P_String_Comp, $P_MoveBP_NUL, $P_Found_SYNONYM - 33246 ;*********************************************************************** - 33247 - 33248 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33249 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33250 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33251 $P_Search_KEYorSW: - 33252 00004B1E 55 push bp ;AN000; - 33253 00004B1F 51 push cx ;AN000; - 33254 00004B20 268A4F08 mov cl,[es:bx+$P_CONTROL_BLK.$P_nid] - 33255 ;mov cl,[es:bx+8] ;AN000; Get synonym count - 33256 ; 14/06/2023 - 33257 ;xor ch,ch ;AN000; and set it to cx - 33258 ;or cx,cx ;AN000; No synonyms specified ? - 33259 00004B24 08C9 or cl,cl - 33260 00004B26 740E jz short $P_KEYorSW_Not_Found - 33261 ;AN000; then indicate not found by CY - 33262 00004B28 268D6F09 lea bp,[es:bx+$P_CONTROL_BLK.$P_KEYorSW] - 33263 ;lea bp,[es:bx+9] ;AN000; BP points to the 1st synonym - 33264 $P_KEYorSW_Loop: ;AN000; - 33265 00004B2C E8E703 call $P_String_Comp ;AN000; compare string in buffer w/ the synonym - 33266 00004B2F 7308 jnc short $P_KEYorSW_Found ;AN000; If match, set it to synonym pointer - 33267 00004B31 E80D00 call $P_MoveBP_NUL ;AN000; else, bp points to the next string - 33268 00004B34 E2F6 loop $P_KEYorSW_Loop ;AN000; loop nid times - 33269 $P_KEYorSW_Not_Found: ;AN000; - 33270 00004B36 F9 stc ;AN000; indicate not found in synonym list - 33271 00004B37 EB05 jmp short $P_KEYorSW_Exit ;AN000; and exit - 33272 $P_KEYorSW_Found: ;AN000; - 33273 00004B39 2E892E[CD97] mov [cs:$P_Found_SYNONYM],bp - 33274 ;AC034; set synonym pointer - 33275 ; 27/04/2023 - 33276 ; cf = 0 - 33277 ;clc ;AN000; indicate found - 33278 $P_KEYorSW_Exit: ;AN000; - 33279 00004B3E 59 pop cx ;AN000; - 33280 00004B3F 5D pop bp ;AN000; - 33281 00004B40 C3 retn ;AN000; - 33282 - 33283 ;*********************************************************************** - 33284 ; $P_MoveBP_NUL - 33285 ;*********************************************************************** - 33286 - 33287 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33288 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33289 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33290 $P_MoveBP_NUL: - 33291 $P_MBP_Loop: ;AN000; - 33292 ;cmp byte [es:bp+0],0 - 33293 00004B41 26807E0000 cmp byte [es:bp],$P_NULL ;AN000; Increment BP that points - 33294 00004B46 7403 je short $P_MBP_Exit ;AN000; to the synomym list - 33295 00004B48 45 inc bp ;AN000; until - 33296 00004B49 EBF6 jmp short $P_MBP_Loop ;AN000; NULL encountered. - 33297 $P_MBP_Exit: ;AN000; - 33298 00004B4B 45 inc bp ;AN000; bp points to next to NULL - 33299 00004B4C C3 retn ;AN000; - 33300 - 33301 ;*********************************************************************** - 33302 ; $P_Chk_SW_Control - 33303 ; - 33304 ; Function: Parse CONTROL block for a switch - 33305 ; - 33306 ; Input: ES:BX -> CONTROL block - 33307 ; psdata_seg:SI -> $P_STRING_BUF + 33243 ; Input: ES:BX -> CONTROL block + 33244 ; psdata_seg:SI -> $P_STRING_BUF + 33245 ; + 33246 ; Output: CY = 1 : not match + 33247 ; + 33248 ; Use: $P_String_Comp, $P_MoveBP_NUL, $P_Found_SYNONYM + 33249 ;*********************************************************************** + 33250 + 33251 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33252 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33253 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33254 $P_Search_KEYorSW: + 33255 00004B1E 55 push bp ;AN000; + 33256 00004B1F 51 push cx ;AN000; + 33257 00004B20 268A4F08 mov cl,[es:bx+$P_CONTROL_BLK.$P_nid] + 33258 ;mov cl,[es:bx+8] ;AN000; Get synonym count + 33259 ; 14/06/2023 + 33260 ;xor ch,ch ;AN000; and set it to cx + 33261 ;or cx,cx ;AN000; No synonyms specified ? + 33262 00004B24 08C9 or cl,cl + 33263 00004B26 740E jz short $P_KEYorSW_Not_Found + 33264 ;AN000; then indicate not found by CY + 33265 00004B28 268D6F09 lea bp,[es:bx+$P_CONTROL_BLK.$P_KEYorSW] + 33266 ;lea bp,[es:bx+9] ;AN000; BP points to the 1st synonym + 33267 $P_KEYorSW_Loop: ;AN000; + 33268 00004B2C E8E703 call $P_String_Comp ;AN000; compare string in buffer w/ the synonym + 33269 00004B2F 7308 jnc short $P_KEYorSW_Found ;AN000; If match, set it to synonym pointer + 33270 00004B31 E80D00 call $P_MoveBP_NUL ;AN000; else, bp points to the next string + 33271 00004B34 E2F6 loop $P_KEYorSW_Loop ;AN000; loop nid times + 33272 $P_KEYorSW_Not_Found: ;AN000; + 33273 00004B36 F9 stc ;AN000; indicate not found in synonym list + 33274 00004B37 EB05 jmp short $P_KEYorSW_Exit ;AN000; and exit + 33275 $P_KEYorSW_Found: ;AN000; + 33276 00004B39 2E892E[CD97] mov [cs:$P_Found_SYNONYM],bp + 33277 ;AC034; set synonym pointer + 33278 ; 27/04/2023 + 33279 ; cf = 0 + 33280 ;clc ;AN000; indicate found + 33281 $P_KEYorSW_Exit: ;AN000; + 33282 00004B3E 59 pop cx ;AN000; + 33283 00004B3F 5D pop bp ;AN000; + 33284 00004B40 C3 retn ;AN000; + 33285 + 33286 ;*********************************************************************** + 33287 ; $P_MoveBP_NUL + 33288 ;*********************************************************************** + 33289 + 33290 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33291 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33292 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33293 $P_MoveBP_NUL: + 33294 $P_MBP_Loop: ;AN000; + 33295 ;cmp byte [es:bp+0],0 + 33296 00004B41 26807E0000 cmp byte [es:bp],$P_NULL ;AN000; Increment BP that points + 33297 00004B46 7403 je short $P_MBP_Exit ;AN000; to the synomym list + 33298 00004B48 45 inc bp ;AN000; until + 33299 00004B49 EBF6 jmp short $P_MBP_Loop ;AN000; NULL encountered. + 33300 $P_MBP_Exit: ;AN000; + 33301 00004B4B 45 inc bp ;AN000; bp points to next to NULL + 33302 00004B4C C3 retn ;AN000; + 33303 + 33304 ;*********************************************************************** + 33305 ; $P_Chk_SW_Control + 33306 ; + 33307 ; Function: Parse CONTROL block for a switch 33308 ; - 33309 ; Output: CY = 1 : not match - 33310 ; - 33311 ; Use: $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags - 33312 ; - 33313 ; Vars: $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W) - 33314 ;*********************************************************************** - 33315 - 33316 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33317 ; - 33318 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33319 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4E9Ah - 33320 - 33321 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33322 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4D57h - 33323 $P_Chk_SW_Control: - 33324 00004B4D 2E800E[C697]10 or byte [cs:$P_Flags2],$P_SW_Cmp - 33325 ;or byte [cs:$P_Flags2],10h ;AC034; Indicate switch for later string comparison - 33326 00004B53 E8C8FF call $P_Search_KEYorSW ;AN000; Search the switch in the CONTROL block - 33327 00004B56 7251 jc short $P_Chk_SW_Err0 ;AN000; not found, then try next CONTROL - 33328 - 33329 00004B58 2E8026[C697]EF and byte [cs:$P_Flags2],0FFh-$P_SW_Cmp - 33330 ;and byte [cs:$P_Flags2],0EFh - 33331 ;AC034; reset the indicator previously set - 33332 00004B5E 50 push ax ;AN000; /switch: - 33333 00004B5F 2EA1[C997] mov ax,[cs:$P_KEYorSW_Ptr] ;AC034; ^ ^ - 33334 00004B63 29F0 sub ax,si ;AN000; SI KEYorSW - 33335 00004B65 2E0106[C797] add [cs:$P_SaveSI_Cmpx],ax ;AC034; update for complex list - 33336 00004B6A 58 pop ax ;AN000; - 33337 - 33338 00004B6B 2E8B36[C997] mov si,[cs:$P_KEYorSW_Ptr] ;AC034; set si at the end or colon - 33339 ;cmp byte [cs:si],0 - 33340 00004B70 2E803C00 cmp byte [cs:si],$P_NULL ;AN000; any data after colon - 33341 00004B74 7525 jne short $P_CSW00 ;AN000; if yes, process match flags - 33342 - 33343 ;cmp byte [cs:si],':' - 33344 00004B76 2E807CFF3A cmp byte [cs:si-1],$P_Colon - 33345 ;AN000; if no, the switch terminated by colon ? - 33346 00004B7B 7509 jne short $P_Chk_if_data_required - 33347 ;AN000; if yes, - 33348 - 33349 00004B7D 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax - 33350 ;mov word [cs:$P_RC],9 ;AC034; return syntax error - 33351 00004B84 EB1A jmp short $P_Chk_SW_Exit ;AN000; - 33352 - 33353 $P_Chk_if_data_required: ;AN018; no data, no colon - 33354 ;cmp word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],0 - 33355 ; 27/04/2023 - 33356 00004B86 26833F00 cmp word [es:bx],0 ;AN018; should have data? zero match flag means switch followed by nothing is OK - 33357 00004B8A 7414 je short $P_Chk_SW_Exit ;AN018; match flags not zero so should have something if optional bit is not on - 33358 - 33359 ;;test word [es:bx],1 ; $P_Optional - 33360 ;test byte [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Optional - 33361 00004B8C 26F60701 test byte [es:bx],$P_Optional - 33362 ;AN019; see if no value is valid - 33363 00004B90 750E jnz short $P_Chk_SW_Exit ;AN019; if so, then leave, else yell - 33364 - 33365 00004B92 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing - 33366 ;mov word [cs:$P_RC],2 ;AC034; return required operand missing - 33367 00004B99 EB05 jmp short $P_Chk_SW_Exit ;AN018; - 33368 - 33369 $P_CSW00: ;AN000; - 33370 00004B9B E88D00 call $P_Check_Match_Flags ;AN000; process match flag - 33371 00004B9E F8 clc ;AN000; indicate match - 33372 ;jmp short $P_Chk_SW_Single_Exit - 33373 00004B9F C3 retn ; 31/03/2023 ;AN000; - 33374 ; 31/03/2023 - 33375 ;$P_Chk_SW_Err0: ;AN000; - 33376 ; stc ;AN000; not found in switch synonym list - 33377 ; ;jmp short $P_Chk_SW_Single_Exit - 33378 ; retn ; 31/03/2023 ;AN000; - 33379 - 33380 $P_Chk_SW_Exit: ;AN000; - 33381 00004BA0 50 push ax ;AN000; - 33382 ; 31/03/2023 - 33383 00004BA1 B803FF mov ax,($P_No_Tag<<8)+$P_String - 33384 ;;mov al,3 - 33385 ;;mov ah,0FFh - 33386 ;mov al,$P_String ;AN000; set - 33387 ;mov ah,$P_No_Tag ;AN000; result - 33388 00004BA4 E80300 call $P_Fill_Result ;AN000; buffer - 33389 00004BA7 58 pop ax ;AN000; - 33390 00004BA8 F8 clc ;AN000; - 33391 ; 31/03/2023 - 33392 $P_Chk_SW_Err0: - 33393 $P_Chk_SW_Single_Exit: ;AN000; - 33394 00004BA9 C3 retn ;AN000; - 33395 - 33396 ;*********************************************************************** - 33397 ; $P_Fill_Result - 33398 ; - 33399 ; Function: Fill the result buffer - 33400 ; - 33401 ; Input: AH = Item tag - 33402 ; AL = type - 33403 ; AL = 1: CX,DX has 32bit number (CX = high) - 33404 ; AL = 2: DX has index(offset) into value list - 33405 ; AL = 6: DL has driver # (1-A, 2-B, ... , 26 - Z) - 33406 ; AL = 7: DX has year, CL has month and CH has date - 33407 ; AL = 8: DL has hours, DH has minutes, CL has secondsn, - 33408 ; amd CH has hundredths - 33409 ; AL = else: psdata_seg:SI points to returned string buffer - 33410 ; ES:BX -> CONTROL block - 33411 ; - 33412 ; Output: None - 33413 ; - 33414 ; Use: $P_Do_CAPS_String, $P_Remove_Colon, $P_Found_SYNONYM - 33415 ; - 33416 ; Vars: $P_DX(W) - 33417 ;*********************************************************************** - 33418 - 33419 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33420 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33421 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33422 $P_Fill_Result: - 33423 00004BAA 57 push di ;AN000; - 33424 00004BAB 268B7F04 mov di,[es:bx+$P_CONTROL_BLK.$P_Result_Buf] - 33425 ;mov di,[es:bx+4] ;AN000; di points to result buffer - 33426 00004BAF 2E893E[BE97] mov [cs:$P_DX],di ;AC034; set returned result address - 33427 ;mov [es:di+$P_RESULT_BLK.$P_Type],al - 33428 ;;mov [es:di],al ;AN000; store type - 33429 ;mov [es:di+$P_RESULT_BLK.$P_Item_Tag],ah - 33430 ;;mov [es:di+1],ah ;AN000; store item tag - 33431 ; 31/03/2023 - 33432 00004BB4 268905 mov [es:di],ax - 33433 00004BB7 50 push ax ;AN000; - 33434 00004BB8 2EA1[CD97] mov ax,[cs:$P_Found_SYNONYM] - 33435 ;AC034; if yes, - 33436 00004BBC 26894502 mov [es:di+$P_RESULT_BLK.$P_SYNONYM_Ptr],ax - 33437 ;mov [es:di+2],ax ;AN000; then set it to the result - 33438 00004BC0 58 pop ax ;AN000; - 33439 $P_RLT04: ;AN000; - 33440 ;cmp al,1 - 33441 00004BC1 3C01 cmp al,$P_Number ;AN000; if number - 33442 00004BC3 750A jne short $P_RLT00 ;AN000; - 33443 $P_RLT02: ;AN000; - 33444 00004BC5 26895504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dx - 33445 ;mov [es:di+4],dx ;AN000; then store 32bit - 33446 00004BC9 26894D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],cx - 33447 ;mov [es:di+6],cx ;AN000; number - 33448 00004BCD EB5A jmp short $P_RLT_Exit ;AN000; - 33449 $P_RLT00: ;AN000; - 33450 ;cmp al,2 - 33451 00004BCF 3C02 cmp al,$P_List_Idx ;AN000; if list index - 33452 00004BD1 7506 jne short $P_RLT01 ;AN000; - 33453 00004BD3 26895504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dx - 33454 ;mov [es:di+4],dx ;AN000; then store list index - 33455 00004BD7 EB50 jmp short $P_RLT_Exit ;AN000; - 33456 $P_RLT01: ;AN000; - 33457 ;cmp al,7 - 33458 00004BD9 3C07 cmp al,$P_Date_F ; 7 ;AN000; Date format ? - 33459 00004BDB 74E8 je short $P_RLT02 ;AN000; - 33460 ;cmp al,8 - 33461 00004BDD 3C08 cmp al,$P_Time_F ; 8 ;AN000; Time format ? - 33462 00004BDF 74E4 je short $P_RLT02 ;AN000; - 33463 ;cmp al,6 - 33464 00004BE1 3C06 cmp al,$P_Drive ; 6 ;AN000; drive format ? - 33465 00004BE3 7506 jne short $P_RLT03 ;AN000; - 33466 - 33467 00004BE5 26885504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dl - 33468 ;mov [es:di+4],dl ;AN000; store drive number - 33469 00004BE9 EB3E jmp short $P_RLT_Exit ;AN000; - 33470 - 33471 $P_RLT03: ;AN000; - 33472 ;cmp al,4 - 33473 00004BEB 3C04 cmp al,$P_Complex ;AN000; complex format ? - 33474 00004BED 750F jne short $P_RLT05 ;AN000; - 33475 - 33476 00004BEF 2EA1[C797] mov ax,[cs:$P_SaveSI_Cmpx] ;AC034; then get pointer in command buffer - 33477 00004BF3 40 inc ax ;AN000; skip left Parentheses - 33478 00004BF4 26894504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],ax - 33479 ;mov [es:di+4],ax ;AN000; store offset - 33480 00004BF8 268C5D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],ds - 33481 ;mov [es:di+6],ds ;AN000; store segment - 33482 00004BFC EB2B jmp short $P_RLT_Exit ;AN000; - 33483 - 33484 $P_RLT05: ;AN000; - 33485 ;------------------------ AL = 3, 5, or 9 - 33486 00004BFE 26897504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],si - 33487 ;mov [es:di+4],si ;AN000; store offset of STRING_BUF - 33488 00004C02 268C4D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],cs - 33489 ;mov [es:di+6],cs ;AN031; store segment of STRING_BUF - 33490 - 33491 00004C06 50 push ax ;AN000; - 33492 00004C07 26F6470201 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_CAP_File - 33493 ;test byte [es:bx+2],1 ;AN000; need CAPS by file table? - 33494 00004C0C 7404 jz short $P_RLT_CAP00 ;AN000; - 33495 - 33496 ;mov al,4 - 33497 00004C0E B004 mov al,$P_DOSTBL_File ; 4 ;AN000; use file upper case table - 33498 00004C10 EB09 jmp short $P_RLT_CAP02 ;AN000; - 33499 - 33500 $P_RLT_CAP00: ;AN000; - 33501 00004C12 26F6470202 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_CAP_Char - 33502 ;test byte [es:bx+2],2 ;AN000; need CAPS by char table ? - 33503 00004C17 7405 jz short $P_RLT_CAP01 ;AN000; - 33504 - 33505 ;mov al,2 - 33506 00004C19 B002 mov al,$P_DOSTBL_Char ; 2 ;AN000; use character upper case table - 33507 $P_RLT_CAP02: ;AN000; - 33508 00004C1B E80C01 call $P_Do_CAPS_String ;AN000; process CAPS along the table - 33509 $P_RLT_CAP01: ;AN000; - 33510 00004C1E 58 pop ax ;AN000; - 33511 00004C1F 26F6470210 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_Rm_Colon - 33512 ;test byte [es:bx+2],10h ;AN000; removing colon at end ? - 33513 00004C24 7403 jz short $P_RLT_Exit ;AN000; - 33514 - 33515 00004C26 E8DD00 call $P_Remove_Colon ;AN000; then process it. - 33516 $P_RLT_Exit: ;AN000; - 33517 00004C29 5F pop di ;AN000; - 33518 00004C2A C3 retn ;AN000; - 33519 - 33520 ;*********************************************************************** - 33521 ; $P_Check_Match_Flags - 33522 ; - 33523 ; Function: Check the mutch_flags and make the exit code and set the - 33524 ; result buffer + 33309 ; Input: ES:BX -> CONTROL block + 33310 ; psdata_seg:SI -> $P_STRING_BUF + 33311 ; + 33312 ; Output: CY = 1 : not match + 33313 ; + 33314 ; Use: $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags + 33315 ; + 33316 ; Vars: $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W) + 33317 ;*********************************************************************** + 33318 + 33319 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33320 ; + 33321 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33322 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:4E9Ah + 33323 + 33324 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33325 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4D57h + 33326 $P_Chk_SW_Control: + 33327 00004B4D 2E800E[C697]10 or byte [cs:$P_Flags2],$P_SW_Cmp + 33328 ;or byte [cs:$P_Flags2],10h ;AC034; Indicate switch for later string comparison + 33329 00004B53 E8C8FF call $P_Search_KEYorSW ;AN000; Search the switch in the CONTROL block + 33330 00004B56 7251 jc short $P_Chk_SW_Err0 ;AN000; not found, then try next CONTROL + 33331 + 33332 00004B58 2E8026[C697]EF and byte [cs:$P_Flags2],0FFh-$P_SW_Cmp + 33333 ;and byte [cs:$P_Flags2],0EFh + 33334 ;AC034; reset the indicator previously set + 33335 00004B5E 50 push ax ;AN000; /switch: + 33336 00004B5F 2EA1[C997] mov ax,[cs:$P_KEYorSW_Ptr] ;AC034; ^ ^ + 33337 00004B63 29F0 sub ax,si ;AN000; SI KEYorSW + 33338 00004B65 2E0106[C797] add [cs:$P_SaveSI_Cmpx],ax ;AC034; update for complex list + 33339 00004B6A 58 pop ax ;AN000; + 33340 + 33341 00004B6B 2E8B36[C997] mov si,[cs:$P_KEYorSW_Ptr] ;AC034; set si at the end or colon + 33342 ;cmp byte [cs:si],0 + 33343 00004B70 2E803C00 cmp byte [cs:si],$P_NULL ;AN000; any data after colon + 33344 00004B74 7525 jne short $P_CSW00 ;AN000; if yes, process match flags + 33345 + 33346 ;cmp byte [cs:si],':' + 33347 00004B76 2E807CFF3A cmp byte [cs:si-1],$P_Colon + 33348 ;AN000; if no, the switch terminated by colon ? + 33349 00004B7B 7509 jne short $P_Chk_if_data_required + 33350 ;AN000; if yes, + 33351 + 33352 00004B7D 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax + 33353 ;mov word [cs:$P_RC],9 ;AC034; return syntax error + 33354 00004B84 EB1A jmp short $P_Chk_SW_Exit ;AN000; + 33355 + 33356 $P_Chk_if_data_required: ;AN018; no data, no colon + 33357 ;cmp word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],0 + 33358 ; 27/04/2023 + 33359 00004B86 26833F00 cmp word [es:bx],0 ;AN018; should have data? zero match flag means switch followed by nothing is OK + 33360 00004B8A 7414 je short $P_Chk_SW_Exit ;AN018; match flags not zero so should have something if optional bit is not on + 33361 + 33362 ;;test word [es:bx],1 ; $P_Optional + 33363 ;test byte [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Optional + 33364 00004B8C 26F60701 test byte [es:bx],$P_Optional + 33365 ;AN019; see if no value is valid + 33366 00004B90 750E jnz short $P_Chk_SW_Exit ;AN019; if so, then leave, else yell + 33367 + 33368 00004B92 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing + 33369 ;mov word [cs:$P_RC],2 ;AC034; return required operand missing + 33370 00004B99 EB05 jmp short $P_Chk_SW_Exit ;AN018; + 33371 + 33372 $P_CSW00: ;AN000; + 33373 00004B9B E88D00 call $P_Check_Match_Flags ;AN000; process match flag + 33374 00004B9E F8 clc ;AN000; indicate match + 33375 ;jmp short $P_Chk_SW_Single_Exit + 33376 00004B9F C3 retn ; 31/03/2023 ;AN000; + 33377 ; 31/03/2023 + 33378 ;$P_Chk_SW_Err0: ;AN000; + 33379 ; stc ;AN000; not found in switch synonym list + 33380 ; ;jmp short $P_Chk_SW_Single_Exit + 33381 ; retn ; 31/03/2023 ;AN000; + 33382 + 33383 $P_Chk_SW_Exit: ;AN000; + 33384 00004BA0 50 push ax ;AN000; + 33385 ; 31/03/2023 + 33386 00004BA1 B803FF mov ax,($P_No_Tag<<8)+$P_String + 33387 ;;mov al,3 + 33388 ;;mov ah,0FFh + 33389 ;mov al,$P_String ;AN000; set + 33390 ;mov ah,$P_No_Tag ;AN000; result + 33391 00004BA4 E80300 call $P_Fill_Result ;AN000; buffer + 33392 00004BA7 58 pop ax ;AN000; + 33393 00004BA8 F8 clc ;AN000; + 33394 ; 31/03/2023 + 33395 $P_Chk_SW_Err0: + 33396 $P_Chk_SW_Single_Exit: ;AN000; + 33397 00004BA9 C3 retn ;AN000; + 33398 + 33399 ;*********************************************************************** + 33400 ; $P_Fill_Result + 33401 ; + 33402 ; Function: Fill the result buffer + 33403 ; + 33404 ; Input: AH = Item tag + 33405 ; AL = type + 33406 ; AL = 1: CX,DX has 32bit number (CX = high) + 33407 ; AL = 2: DX has index(offset) into value list + 33408 ; AL = 6: DL has driver # (1-A, 2-B, ... , 26 - Z) + 33409 ; AL = 7: DX has year, CL has month and CH has date + 33410 ; AL = 8: DL has hours, DH has minutes, CL has secondsn, + 33411 ; amd CH has hundredths + 33412 ; AL = else: psdata_seg:SI points to returned string buffer + 33413 ; ES:BX -> CONTROL block + 33414 ; + 33415 ; Output: None + 33416 ; + 33417 ; Use: $P_Do_CAPS_String, $P_Remove_Colon, $P_Found_SYNONYM + 33418 ; + 33419 ; Vars: $P_DX(W) + 33420 ;*********************************************************************** + 33421 + 33422 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33423 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33424 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33425 $P_Fill_Result: + 33426 00004BAA 57 push di ;AN000; + 33427 00004BAB 268B7F04 mov di,[es:bx+$P_CONTROL_BLK.$P_Result_Buf] + 33428 ;mov di,[es:bx+4] ;AN000; di points to result buffer + 33429 00004BAF 2E893E[BE97] mov [cs:$P_DX],di ;AC034; set returned result address + 33430 ;mov [es:di+$P_RESULT_BLK.$P_Type],al + 33431 ;;mov [es:di],al ;AN000; store type + 33432 ;mov [es:di+$P_RESULT_BLK.$P_Item_Tag],ah + 33433 ;;mov [es:di+1],ah ;AN000; store item tag + 33434 ; 31/03/2023 + 33435 00004BB4 268905 mov [es:di],ax + 33436 00004BB7 50 push ax ;AN000; + 33437 00004BB8 2EA1[CD97] mov ax,[cs:$P_Found_SYNONYM] + 33438 ;AC034; if yes, + 33439 00004BBC 26894502 mov [es:di+$P_RESULT_BLK.$P_SYNONYM_Ptr],ax + 33440 ;mov [es:di+2],ax ;AN000; then set it to the result + 33441 00004BC0 58 pop ax ;AN000; + 33442 $P_RLT04: ;AN000; + 33443 ;cmp al,1 + 33444 00004BC1 3C01 cmp al,$P_Number ;AN000; if number + 33445 00004BC3 750A jne short $P_RLT00 ;AN000; + 33446 $P_RLT02: ;AN000; + 33447 00004BC5 26895504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dx + 33448 ;mov [es:di+4],dx ;AN000; then store 32bit + 33449 00004BC9 26894D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],cx + 33450 ;mov [es:di+6],cx ;AN000; number + 33451 00004BCD EB5A jmp short $P_RLT_Exit ;AN000; + 33452 $P_RLT00: ;AN000; + 33453 ;cmp al,2 + 33454 00004BCF 3C02 cmp al,$P_List_Idx ;AN000; if list index + 33455 00004BD1 7506 jne short $P_RLT01 ;AN000; + 33456 00004BD3 26895504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dx + 33457 ;mov [es:di+4],dx ;AN000; then store list index + 33458 00004BD7 EB50 jmp short $P_RLT_Exit ;AN000; + 33459 $P_RLT01: ;AN000; + 33460 ;cmp al,7 + 33461 00004BD9 3C07 cmp al,$P_Date_F ; 7 ;AN000; Date format ? + 33462 00004BDB 74E8 je short $P_RLT02 ;AN000; + 33463 ;cmp al,8 + 33464 00004BDD 3C08 cmp al,$P_Time_F ; 8 ;AN000; Time format ? + 33465 00004BDF 74E4 je short $P_RLT02 ;AN000; + 33466 ;cmp al,6 + 33467 00004BE1 3C06 cmp al,$P_Drive ; 6 ;AN000; drive format ? + 33468 00004BE3 7506 jne short $P_RLT03 ;AN000; + 33469 + 33470 00004BE5 26885504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],dl + 33471 ;mov [es:di+4],dl ;AN000; store drive number + 33472 00004BE9 EB3E jmp short $P_RLT_Exit ;AN000; + 33473 + 33474 $P_RLT03: ;AN000; + 33475 ;cmp al,4 + 33476 00004BEB 3C04 cmp al,$P_Complex ;AN000; complex format ? + 33477 00004BED 750F jne short $P_RLT05 ;AN000; + 33478 + 33479 00004BEF 2EA1[C797] mov ax,[cs:$P_SaveSI_Cmpx] ;AC034; then get pointer in command buffer + 33480 00004BF3 40 inc ax ;AN000; skip left Parentheses + 33481 00004BF4 26894504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],ax + 33482 ;mov [es:di+4],ax ;AN000; store offset + 33483 00004BF8 268C5D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],ds + 33484 ;mov [es:di+6],ds ;AN000; store segment + 33485 00004BFC EB2B jmp short $P_RLT_Exit ;AN000; + 33486 + 33487 $P_RLT05: ;AN000; + 33488 ;------------------------ AL = 3, 5, or 9 + 33489 00004BFE 26897504 mov [es:di+$P_RESULT_BLK.$P_Picked_Val],si + 33490 ;mov [es:di+4],si ;AN000; store offset of STRING_BUF + 33491 00004C02 268C4D06 mov [es:di+2+$P_RESULT_BLK.$P_Picked_Val],cs + 33492 ;mov [es:di+6],cs ;AN031; store segment of STRING_BUF + 33493 + 33494 00004C06 50 push ax ;AN000; + 33495 00004C07 26F6470201 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_CAP_File + 33496 ;test byte [es:bx+2],1 ;AN000; need CAPS by file table? + 33497 00004C0C 7404 jz short $P_RLT_CAP00 ;AN000; + 33498 + 33499 ;mov al,4 + 33500 00004C0E B004 mov al,$P_DOSTBL_File ; 4 ;AN000; use file upper case table + 33501 00004C10 EB09 jmp short $P_RLT_CAP02 ;AN000; + 33502 + 33503 $P_RLT_CAP00: ;AN000; + 33504 00004C12 26F6470202 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_CAP_Char + 33505 ;test byte [es:bx+2],2 ;AN000; need CAPS by char table ? + 33506 00004C17 7405 jz short $P_RLT_CAP01 ;AN000; + 33507 + 33508 ;mov al,2 + 33509 00004C19 B002 mov al,$P_DOSTBL_Char ; 2 ;AN000; use character upper case table + 33510 $P_RLT_CAP02: ;AN000; + 33511 00004C1B E80C01 call $P_Do_CAPS_String ;AN000; process CAPS along the table + 33512 $P_RLT_CAP01: ;AN000; + 33513 00004C1E 58 pop ax ;AN000; + 33514 00004C1F 26F6470210 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_Rm_Colon + 33515 ;test byte [es:bx+2],10h ;AN000; removing colon at end ? + 33516 00004C24 7403 jz short $P_RLT_Exit ;AN000; + 33517 + 33518 00004C26 E8DD00 call $P_Remove_Colon ;AN000; then process it. + 33519 $P_RLT_Exit: ;AN000; + 33520 00004C29 5F pop di ;AN000; + 33521 00004C2A C3 retn ;AN000; + 33522 + 33523 ;*********************************************************************** + 33524 ; $P_Check_Match_Flags 33525 ; - 33526 ; Check for types in this order: - 33527 ; Complex - 33528 ; Date - 33529 ; Time - 33530 ; Drive - 33531 ; Filespec - 33532 ; Quoted String - 33533 ; Simple String - 33534 ; - 33535 ; Input: psdata_seg:SI -> $P_STRING_BUF - 33536 ; ES:BX -> CONTROL block + 33526 ; Function: Check the mutch_flags and make the exit code and set the + 33527 ; result buffer + 33528 ; + 33529 ; Check for types in this order: + 33530 ; Complex + 33531 ; Date + 33532 ; Time + 33533 ; Drive + 33534 ; Filespec + 33535 ; Quoted String + 33536 ; Simple String 33537 ; - 33538 ; Output: None - 33539 ; - 33540 ; Use: $P_Value, P$_SValue, $P_Simple_String, $P_Date_Format - 33541 ; $P_Time_Format, $P_Complex_Format, $P_File_Foemat - 33542 ; $P_Drive_Format - 33543 ;*********************************************************************** - 33544 - 33545 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33546 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33547 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33548 $P_Check_Match_Flags: - 33549 00004C2B 2EC606[9398]00 mov byte [cs:$P_err_flag],$P_NULL ; 0 - 33550 ;AN033;AC034;; clear filespec error flag. - 33551 00004C31 50 push ax ;AN000; - 33552 ;mov ax,[es:bx+$P_CONTROL_BLK.$P_Match_Flag] - 33553 00004C32 268B07 mov ax,[es:bx] ;AN000; load match flag(16bit) to ax - 33554 00004C35 09C0 or ax,ax ;AC035; test ax for zero - 33555 00004C37 7518 jnz short $P_Mat ;AN000; (tm12) - 33556 00004C39 50 push ax ;AN000; (tm12) - 33557 00004C3A 53 push bx ;AN000; (tm12) - 33558 00004C3B 52 push dx ;AN000; (tm12) - 33559 00004C3C 57 push di ;AN000; (tm12) - 33560 00004C3D 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax - 33561 ;mov word [cs:$P_RC],9 ;AC034; (tm12) - 33562 ; 31/03/2023 - 33563 00004C44 B803FF mov ax,($P_No_Tag<<8)+$P_String - 33564 ;mov ah,$P_No_Tag ; 0FFh ;AN000; (tm12) - 33565 ;mov al,$P_String ; 3 ;AN000; (tm12) - 33566 00004C47 E860FF call $P_Fill_Result ;AN000; (tm12) - 33567 00004C4A 5F pop di ;AN000; (tm12) - 33568 00004C4B 5A pop dx ;AN000; (tm12) - 33569 00004C4C 5B pop bx ;AN000; (tm12) - 33570 00004C4D 58 pop ax ;AN000; (tm12) - 33571 ;jmp short $P_Bridge ;AC035; (tm12) - 33572 ; 31/03/2023 - 33573 $P_Bridge: ; 18/04/2023 ;AN000; - 33574 00004C4E E99C00 jmp $P_Match_Exit ;AN000; (tm02) - 33575 $P_Mat: ;AN000; (tm12) - 33576 $P_Match01: ;AN000; - 33577 ;test ax,1000h - 33578 00004C51 A90010 test ax,$P_Date_S ;AN000; Date string - 33579 00004C54 7412 jz short $P_Match02 ;AN000; - 33580 00004C56 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33581 ;mov word [cs:$P_RC],0 ;AC034; assume no error - 33582 00004C5D E85403 call $P_Date_Format ;AN000; do process - 33583 00004C60 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33584 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type - 33585 ; 18/04/2023 - 33586 00004C66 75E6 jne short $P_Bridge ;AN000; - 33587 $P_Match02: ;AN000; - 33588 ;test ax,800h - 33589 00004C68 A90008 test ax,$P_Time_S ;AN000; Time string - 33590 00004C6B 7412 jz short $P_Match03 ;AN000; - 33591 00004C6D 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33592 ;mov word [cs:$P_RC],0 ;AC034; assume no error - 33593 00004C74 E85A04 call $P_Time_Format ;AN000; do process - 33594 00004C77 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33595 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type - 33596 ;jne short $P_Bridge ;AN000; (tm09) - 33597 ;jmp short $P_Match03 ;AN025; (tm09) - 33598 ; 31/03/2023 - 33599 00004C7D 756E jne short $P_Match_Exit - 33600 ;$P_Bridge: ;AN000; - 33601 ;jmp short $P_Match_Exit ;AN000; (tm02) - 33602 $P_Match03: ;AN000; - 33603 ;test ax,8000h - 33604 00004C7F A90080 test ax,$P_Num_Val ;AN000; Numeric value - 33605 00004C82 7412 jz short $P_Match04 ;AN000; - 33606 00004C84 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33607 ;mov word [cs:$P_RC],0 ;AC034; assume no error - 33608 00004C8B E82701 call $P_Value ;AN000; do process - 33609 00004C8E 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33610 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type - 33611 00004C94 7557 jne short $P_Match_Exit ;AN000; - 33612 $P_Match04: ;AN000; - 33613 ;test ax,4000h - 33614 00004C96 A90040 test ax,$P_SNum_Val ;AN000; Signed numeric value - 33615 00004C99 7412 jz short $P_Match05 ;AN000; - 33616 00004C9B 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33617 ;AC034; assume no error - 33618 00004CA2 E8EC00 call $P_SValue ;AN000; do process - 33619 00004CA5 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33620 ;AC034; if error, examine the next type - 33621 00004CAB 7540 jne short $P_Match_Exit ;AN000; - 33622 $P_Match05: ;AN000; - 33623 ;test ax,100h - 33624 00004CAD A90001 test ax,$P_Drv_Only ;AN000; Drive only - 33625 00004CB0 7415 jz short $P_Match06 ;AN000; - 33626 00004CB2 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33627 ;AC034; assume no error - 33628 00004CB9 E86205 call $P_File_Format ;AN000; 1st, call file format - 33629 00004CBC E8E305 call $P_Drive_Format ;AN000; check drive format, next - 33630 00004CBF 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33631 ;AC034; if error, examinee the next type - 33632 00004CC5 7526 jne short $P_Match_Exit ;AN000; - 33633 $P_Match06: ;AN000; - 33634 ;test ax,200h - 33635 00004CC7 A90002 test ax,$P_File_Spc ;AN000; File spec - 33636 00004CCA 7412 jz short $P_Match07 ;AN000; - 33637 00004CCC 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33638 ;AC034; assume no error - 33639 00004CD3 E84805 call $P_File_Format ;AN000; do process - 33640 00004CD6 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax - 33641 ;AC034; if error, examine the next type - 33642 00004CDC 750F jne short $P_Match_Exit ;AN000; - 33643 $P_Match07: ;AN000; - 33644 $P_Match08: ;AN000; - 33645 ;test ax,2000h - 33646 00004CDE A90020 test ax,$P_Simple_S ;AN000; Simple string - 33647 00004CE1 740A jz short $P_Match09 ;AN000; - 33648 00004CE3 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error - 33649 ;AC034; assume no error - 33650 00004CEA E8C501 call $P_Simple_String ;AN000; do process - 33651 $P_Match09: ;AN000; - 33652 $P_Match_Exit: ;AN000; - 33653 00004CED 2E833E[9398]01 cmp word [cs:$P_err_flag],$P_error_filespec - 33654 ;cmp word [cs:$P_err_flag],1 ;AC034; bad filespec ? - 33655 00004CF3 750F jne short $P_Match2_Exit ;AN033; no, continue - 33656 00004CF5 2E833E[BA97]00 cmp word [cs:$P_RC],$P_No_Error - 33657 ;cmp word [cs:$P_RC],0 ;AN033;AC034;; check for other errors ? - 33658 00004CFB 7507 jne short $P_Match2_Exit ;AN033; no, continue - 33659 00004CFD 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax - 33660 ;mov word [cs:$P_RC],9 ;AN033;AC034;; set error flag - 33661 $P_Match2_Exit: ;AN033; - 33662 00004D04 58 pop ax ;AN000; - 33663 00004D05 C3 retn - 33664 - 33665 ;*********************************************************************** - 33666 ; $P_Remove_Colon; - 33667 ; - 33668 ; Function: Remove colon at end - 33669 ; - 33670 ; Input: psdata_seg:SI points to string buffer to be examineed - 33671 ; - 33672 ; Output: None - 33673 ; - 33674 ; Use: $P_Chk_DBCS - 33675 ;*********************************************************************** - 33676 - 33677 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33678 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33679 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33680 $P_Remove_Colon: - 33681 00004D06 50 push ax ;AN000; - 33682 00004D07 56 push si ;AN000; - 33683 $P_RCOL_Loop: ;AN000; - 33684 00004D08 2E8A04 mov al,[cs:si] ;AN000; get character - 33685 00004D0B 08C0 or al,al ;AN000; end of string ? - 33686 00004D0D 740F jz short $P_RCOL_Exit ;AN000; if yes, just exit - 33687 - 33688 00004D0F 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; is it colon ? - 33689 00004D11 750E jne short $P_RCOL00 ;AN000; + 33538 ; Input: psdata_seg:SI -> $P_STRING_BUF + 33539 ; ES:BX -> CONTROL block + 33540 ; + 33541 ; Output: None + 33542 ; + 33543 ; Use: $P_Value, P$_SValue, $P_Simple_String, $P_Date_Format + 33544 ; $P_Time_Format, $P_Complex_Format, $P_File_Foemat + 33545 ; $P_Drive_Format + 33546 ;*********************************************************************** + 33547 + 33548 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33549 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33550 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33551 $P_Check_Match_Flags: + 33552 00004C2B 2EC606[9398]00 mov byte [cs:$P_err_flag],$P_NULL ; 0 + 33553 ;AN033;AC034;; clear filespec error flag. + 33554 00004C31 50 push ax ;AN000; + 33555 ;mov ax,[es:bx+$P_CONTROL_BLK.$P_Match_Flag] + 33556 00004C32 268B07 mov ax,[es:bx] ;AN000; load match flag(16bit) to ax + 33557 00004C35 09C0 or ax,ax ;AC035; test ax for zero + 33558 00004C37 7518 jnz short $P_Mat ;AN000; (tm12) + 33559 00004C39 50 push ax ;AN000; (tm12) + 33560 00004C3A 53 push bx ;AN000; (tm12) + 33561 00004C3B 52 push dx ;AN000; (tm12) + 33562 00004C3C 57 push di ;AN000; (tm12) + 33563 00004C3D 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax + 33564 ;mov word [cs:$P_RC],9 ;AC034; (tm12) + 33565 ; 31/03/2023 + 33566 00004C44 B803FF mov ax,($P_No_Tag<<8)+$P_String + 33567 ;mov ah,$P_No_Tag ; 0FFh ;AN000; (tm12) + 33568 ;mov al,$P_String ; 3 ;AN000; (tm12) + 33569 00004C47 E860FF call $P_Fill_Result ;AN000; (tm12) + 33570 00004C4A 5F pop di ;AN000; (tm12) + 33571 00004C4B 5A pop dx ;AN000; (tm12) + 33572 00004C4C 5B pop bx ;AN000; (tm12) + 33573 00004C4D 58 pop ax ;AN000; (tm12) + 33574 ;jmp short $P_Bridge ;AC035; (tm12) + 33575 ; 31/03/2023 + 33576 $P_Bridge: ; 18/04/2023 ;AN000; + 33577 00004C4E E99C00 jmp $P_Match_Exit ;AN000; (tm02) + 33578 $P_Mat: ;AN000; (tm12) + 33579 $P_Match01: ;AN000; + 33580 ;test ax,1000h + 33581 00004C51 A90010 test ax,$P_Date_S ;AN000; Date string + 33582 00004C54 7412 jz short $P_Match02 ;AN000; + 33583 00004C56 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33584 ;mov word [cs:$P_RC],0 ;AC034; assume no error + 33585 00004C5D E85403 call $P_Date_Format ;AN000; do process + 33586 00004C60 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33587 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type + 33588 ; 18/04/2023 + 33589 00004C66 75E6 jne short $P_Bridge ;AN000; + 33590 $P_Match02: ;AN000; + 33591 ;test ax,800h + 33592 00004C68 A90008 test ax,$P_Time_S ;AN000; Time string + 33593 00004C6B 7412 jz short $P_Match03 ;AN000; + 33594 00004C6D 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33595 ;mov word [cs:$P_RC],0 ;AC034; assume no error + 33596 00004C74 E85A04 call $P_Time_Format ;AN000; do process + 33597 00004C77 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33598 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type + 33599 ;jne short $P_Bridge ;AN000; (tm09) + 33600 ;jmp short $P_Match03 ;AN025; (tm09) + 33601 ; 31/03/2023 + 33602 00004C7D 756E jne short $P_Match_Exit + 33603 ;$P_Bridge: ;AN000; + 33604 ;jmp short $P_Match_Exit ;AN000; (tm02) + 33605 $P_Match03: ;AN000; + 33606 ;test ax,8000h + 33607 00004C7F A90080 test ax,$P_Num_Val ;AN000; Numeric value + 33608 00004C82 7412 jz short $P_Match04 ;AN000; + 33609 00004C84 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33610 ;mov word [cs:$P_RC],0 ;AC034; assume no error + 33611 00004C8B E82701 call $P_Value ;AN000; do process + 33612 00004C8E 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33613 ;cmp word [cs:$P_RC],9 ;AC034; if error, examine the next type + 33614 00004C94 7557 jne short $P_Match_Exit ;AN000; + 33615 $P_Match04: ;AN000; + 33616 ;test ax,4000h + 33617 00004C96 A90040 test ax,$P_SNum_Val ;AN000; Signed numeric value + 33618 00004C99 7412 jz short $P_Match05 ;AN000; + 33619 00004C9B 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33620 ;AC034; assume no error + 33621 00004CA2 E8EC00 call $P_SValue ;AN000; do process + 33622 00004CA5 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33623 ;AC034; if error, examine the next type + 33624 00004CAB 7540 jne short $P_Match_Exit ;AN000; + 33625 $P_Match05: ;AN000; + 33626 ;test ax,100h + 33627 00004CAD A90001 test ax,$P_Drv_Only ;AN000; Drive only + 33628 00004CB0 7415 jz short $P_Match06 ;AN000; + 33629 00004CB2 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33630 ;AC034; assume no error + 33631 00004CB9 E86205 call $P_File_Format ;AN000; 1st, call file format + 33632 00004CBC E8E305 call $P_Drive_Format ;AN000; check drive format, next + 33633 00004CBF 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33634 ;AC034; if error, examinee the next type + 33635 00004CC5 7526 jne short $P_Match_Exit ;AN000; + 33636 $P_Match06: ;AN000; + 33637 ;test ax,200h + 33638 00004CC7 A90002 test ax,$P_File_Spc ;AN000; File spec + 33639 00004CCA 7412 jz short $P_Match07 ;AN000; + 33640 00004CCC 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33641 ;AC034; assume no error + 33642 00004CD3 E84805 call $P_File_Format ;AN000; do process + 33643 00004CD6 2E833E[BA97]09 cmp word [cs:$P_RC],$P_Syntax + 33644 ;AC034; if error, examine the next type + 33645 00004CDC 750F jne short $P_Match_Exit ;AN000; + 33646 $P_Match07: ;AN000; + 33647 $P_Match08: ;AN000; + 33648 ;test ax,2000h + 33649 00004CDE A90020 test ax,$P_Simple_S ;AN000; Simple string + 33650 00004CE1 740A jz short $P_Match09 ;AN000; + 33651 00004CE3 2EC706[BA97]0000 mov word [cs:$P_RC],$P_No_Error + 33652 ;AC034; assume no error + 33653 00004CEA E8C501 call $P_Simple_String ;AN000; do process + 33654 $P_Match09: ;AN000; + 33655 $P_Match_Exit: ;AN000; + 33656 00004CED 2E833E[9398]01 cmp word [cs:$P_err_flag],$P_error_filespec + 33657 ;cmp word [cs:$P_err_flag],1 ;AC034; bad filespec ? + 33658 00004CF3 750F jne short $P_Match2_Exit ;AN033; no, continue + 33659 00004CF5 2E833E[BA97]00 cmp word [cs:$P_RC],$P_No_Error + 33660 ;cmp word [cs:$P_RC],0 ;AN033;AC034;; check for other errors ? + 33661 00004CFB 7507 jne short $P_Match2_Exit ;AN033; no, continue + 33662 00004CFD 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax + 33663 ;mov word [cs:$P_RC],9 ;AN033;AC034;; set error flag + 33664 $P_Match2_Exit: ;AN033; + 33665 00004D04 58 pop ax ;AN000; + 33666 00004D05 C3 retn + 33667 + 33668 ;*********************************************************************** + 33669 ; $P_Remove_Colon; + 33670 ; + 33671 ; Function: Remove colon at end + 33672 ; + 33673 ; Input: psdata_seg:SI points to string buffer to be examineed + 33674 ; + 33675 ; Output: None + 33676 ; + 33677 ; Use: $P_Chk_DBCS + 33678 ;*********************************************************************** + 33679 + 33680 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33681 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33682 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33683 $P_Remove_Colon: + 33684 00004D06 50 push ax ;AN000; + 33685 00004D07 56 push si ;AN000; + 33686 $P_RCOL_Loop: ;AN000; + 33687 00004D08 2E8A04 mov al,[cs:si] ;AN000; get character + 33688 00004D0B 08C0 or al,al ;AN000; end of string ? + 33689 00004D0D 740F jz short $P_RCOL_Exit ;AN000; if yes, just exit 33690 - 33691 ;cmp byte [cs:si+1],0 - 33692 00004D13 2E807C0100 cmp byte [cs:si+1],$P_NULL ;AN000; if so, next is NULL ? - 33693 00004D18 7507 jne short $P_RCOL00 ;AN000; no, then next char - 33694 - 33695 00004D1A 2EC60400 mov byte [cs:si],$P_NULL ;AN000; yes, remove colon - 33696 ; 31/03/2023 - 33697 ;jmp short $P_RCOL_Exit ;AN000; and exit. - 33698 $P_RCOL_Exit: - 33699 00004D1E 5E pop si - 33700 00004D1F 58 pop ax - 33701 00004D20 C3 retn - 33702 - 33703 $P_RCOL00: ;AN000; - 33704 00004D21 E89E06 call $P_Chk_DBCS ;AN000; if not colon, then check if - 33705 00004D24 7301 jnc short $P_RCOL01 ;AN000; DBCS leading byte. - 33706 - 33707 00004D26 46 inc si ;AN000; if yes, skip trailing byte - 33708 $P_RCOL01: ;AN000; - 33709 00004D27 46 inc si ;AN000; si points to next byte - 33710 00004D28 EBDE jmp short $P_RCOL_Loop ;AN000; loop until NULL encountered - 33711 - 33712 ; 31/03/2023 - 33713 ;$P_RCOL_Exit: ;AN000; - 33714 ;pop si ;AN000; - 33715 ;pop ax ;AN000; - 33716 ;retn - 33717 - 33718 ;*********************************************************************** - 33719 ; $P_Do_CAPS_String; - 33720 ; - 33721 ; Function: Perform capitalization along with the file case map table - 33722 ; or character case map table. + 33691 00004D0F 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; is it colon ? + 33692 00004D11 750E jne short $P_RCOL00 ;AN000; + 33693 + 33694 ;cmp byte [cs:si+1],0 + 33695 00004D13 2E807C0100 cmp byte [cs:si+1],$P_NULL ;AN000; if so, next is NULL ? + 33696 00004D18 7507 jne short $P_RCOL00 ;AN000; no, then next char + 33697 + 33698 00004D1A 2EC60400 mov byte [cs:si],$P_NULL ;AN000; yes, remove colon + 33699 ; 31/03/2023 + 33700 ;jmp short $P_RCOL_Exit ;AN000; and exit. + 33701 $P_RCOL_Exit: + 33702 00004D1E 5E pop si + 33703 00004D1F 58 pop ax + 33704 00004D20 C3 retn + 33705 + 33706 $P_RCOL00: ;AN000; + 33707 00004D21 E89E06 call $P_Chk_DBCS ;AN000; if not colon, then check if + 33708 00004D24 7301 jnc short $P_RCOL01 ;AN000; DBCS leading byte. + 33709 + 33710 00004D26 46 inc si ;AN000; if yes, skip trailing byte + 33711 $P_RCOL01: ;AN000; + 33712 00004D27 46 inc si ;AN000; si points to next byte + 33713 00004D28 EBDE jmp short $P_RCOL_Loop ;AN000; loop until NULL encountered + 33714 + 33715 ; 31/03/2023 + 33716 ;$P_RCOL_Exit: ;AN000; + 33717 ;pop si ;AN000; + 33718 ;pop ax ;AN000; + 33719 ;retn + 33720 + 33721 ;*********************************************************************** + 33722 ; $P_Do_CAPS_String; 33723 ; - 33724 ; Input: AL = 2 : Use character table - 33725 ; AL = 4 : Use file table - 33726 ; psdata_seg:SI points to string buffer to be capitalized - 33727 ; - 33728 ; Output: None - 33729 ; - 33730 ; Use: $P_Do_CAPS_Char, $P_Chk_DBCS - 33731 ;*********************************************************************** - 33732 - 33733 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33734 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33735 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33736 $P_Do_CAPS_String: - 33737 00004D2A 56 push si ;AN000; - 33738 00004D2B 52 push dx ;AN000; - 33739 00004D2C 88C2 mov dl,al ;AN000; save info id - 33740 $P_DCS_Loop: ;AN000; - 33741 00004D2E 2E8A04 mov al,[cs:si] ;AN000; load character and - 33742 00004D31 E88E06 call $P_Chk_DBCS ;AN000; check if DBCS leading byte - 33743 00004D34 720C jc short $P_DCS00 ;AN000; if yes, do not need CAPS - 33744 - 33745 00004D36 08C0 or al,al ;AN000; end of string ? - 33746 00004D38 740C jz short $P_DCS_Exit ;AN000; then exit. + 33724 ; Function: Perform capitalization along with the file case map table + 33725 ; or character case map table. + 33726 ; + 33727 ; Input: AL = 2 : Use character table + 33728 ; AL = 4 : Use file table + 33729 ; psdata_seg:SI points to string buffer to be capitalized + 33730 ; + 33731 ; Output: None + 33732 ; + 33733 ; Use: $P_Do_CAPS_Char, $P_Chk_DBCS + 33734 ;*********************************************************************** + 33735 + 33736 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33737 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33738 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33739 $P_Do_CAPS_String: + 33740 00004D2A 56 push si ;AN000; + 33741 00004D2B 52 push dx ;AN000; + 33742 00004D2C 88C2 mov dl,al ;AN000; save info id + 33743 $P_DCS_Loop: ;AN000; + 33744 00004D2E 2E8A04 mov al,[cs:si] ;AN000; load character and + 33745 00004D31 E88E06 call $P_Chk_DBCS ;AN000; check if DBCS leading byte + 33746 00004D34 720C jc short $P_DCS00 ;AN000; if yes, do not need CAPS 33747 - 33748 00004D3A E80C00 call $P_Do_CAPS_Char ;AN000; Here a SBCS char need to be CAPS - 33749 00004D3D 2E8804 mov [cs:si],al ;AN000; stored upper case char to buffer - 33750 00004D40 EB01 jmp short $P_DCS01 ;AN000; process nexit - 33751 $P_DCS00: ;AN000; - 33752 00004D42 46 inc si ;AN000; skip DBCS leading and trailing byte - 33753 $P_DCS01: ;AN000; - 33754 00004D43 46 inc si ;AN000; si point to next byte - 33755 00004D44 EBE8 jmp short $P_DCS_Loop ;AN000; loop until NULL encountered - 33756 $P_DCS_Exit: ;AN000; - 33757 00004D46 5A pop dx ;AN000; - 33758 00004D47 5E pop si ;AN000; - 33759 00004D48 C3 retn - 33760 - 33761 ;*********************************************************************** - 33762 ; $P_Do_CAPS_Char; - 33763 ; - 33764 ; Function: Perform capitalization along with the file case map table - 33765 ; or character case map table. + 33748 00004D36 08C0 or al,al ;AN000; end of string ? + 33749 00004D38 740C jz short $P_DCS_Exit ;AN000; then exit. + 33750 + 33751 00004D3A E80C00 call $P_Do_CAPS_Char ;AN000; Here a SBCS char need to be CAPS + 33752 00004D3D 2E8804 mov [cs:si],al ;AN000; stored upper case char to buffer + 33753 00004D40 EB01 jmp short $P_DCS01 ;AN000; process nexit + 33754 $P_DCS00: ;AN000; + 33755 00004D42 46 inc si ;AN000; skip DBCS leading and trailing byte + 33756 $P_DCS01: ;AN000; + 33757 00004D43 46 inc si ;AN000; si point to next byte + 33758 00004D44 EBE8 jmp short $P_DCS_Loop ;AN000; loop until NULL encountered + 33759 $P_DCS_Exit: ;AN000; + 33760 00004D46 5A pop dx ;AN000; + 33761 00004D47 5E pop si ;AN000; + 33762 00004D48 C3 retn + 33763 + 33764 ;*********************************************************************** + 33765 ; $P_Do_CAPS_Char; 33766 ; - 33767 ; Input: DL = 2 : Use character table - 33768 ; DL = 4 : Use file table - 33769 ; AL = character to be capitalized - 33770 ; - 33771 ; Output: None - 33772 ; - 33773 ; Use: INT 21h /w AH=65h - 33774 ;*********************************************************************** - 33775 - 33776 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33777 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33778 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33779 $P_Do_CAPS_Char: - 33780 00004D49 3C80 cmp al,$P_ASCII80 ; 80h ;AN000; need upper case table ? - 33781 00004D4B 730B jae short $P_DCC_Go ;AN000; - 33782 - 33783 00004D4D 3C61 cmp al,"a" ; 61h ;AN000; if no, - 33784 00004D4F 723F jb short $P_CAPS_Ret ;AN000; check if "a" <= AL <= "z" + 33767 ; Function: Perform capitalization along with the file case map table + 33768 ; or character case map table. + 33769 ; + 33770 ; Input: DL = 2 : Use character table + 33771 ; DL = 4 : Use file table + 33772 ; AL = character to be capitalized + 33773 ; + 33774 ; Output: None + 33775 ; + 33776 ; Use: INT 21h /w AH=65h + 33777 ;*********************************************************************** + 33778 + 33779 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33780 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33781 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33782 $P_Do_CAPS_Char: + 33783 00004D49 3C80 cmp al,$P_ASCII80 ; 80h ;AN000; need upper case table ? + 33784 00004D4B 730B jae short $P_DCC_Go ;AN000; 33785 - 33786 00004D51 3C7A cmp al,"z" ; 7Ah ;AN000; - 33787 00004D53 773B ja short $P_CAPS_Ret ;AN000; if yes, make CAPS + 33786 00004D4D 3C61 cmp al,"a" ; 61h ;AN000; if no, + 33787 00004D4F 723F jb short $P_CAPS_Ret ;AN000; check if "a" <= AL <= "z" 33788 - 33789 00004D55 24DF and al,$P_Make_Upper ; 0DFh ;AN000; else do nothing. - 33790 ;jmp short $P_CAPS_Ret ;AN000; - 33791 ; 18/04/2023 - 33792 00004D57 C3 retn - 33793 - 33794 $P_DCC_Go: ;AN000; - 33795 00004D58 53 push bx ;AN000; - 33796 00004D59 06 push es ;AN000; - 33797 00004D5A 57 push di ;AN000; - 33798 ; 18/04/2023 - 33799 00004D5B 8D3E[8598] lea di,$P_File_CAP_Ptr ;AC034; - 33800 00004D5F 80FA04 cmp dl,$P_DOSTBL_File ; 4 ;AN000; Use file CAPS table ? - 33801 00004D62 7404 je short $P_DCC00 ;AN000; - 33802 ; 27/04/2023 - 33803 00004D64 8D3E[8098] lea di,$P_Char_CAP_Ptr ;AC034; or use char CAPS table ? - 33804 $P_DCC00: ;AN000; - 33805 00004D68 2E3815 cmp [cs:di],dl ;AN000; already got table address ? - 33806 00004D6B 7416 je short $P_DCC01 ;AN000; if no, - 33807 - 33808 ;In this next section, ES will be used to pass a 5 byte workarea to INT 21h, - 33809 ; the GET COUNTYRY INFO call. This usage of ES is required by the function - 33810 ; call, regardless of what base register is currently be defined as PSDATA_SEG. - 33811 - 33812 00004D6D 50 push ax ;AN000; get CAPS table thru DOS call - 33813 00004D6E 51 push cx ;AN000; - 33814 00004D6F 52 push dx ;AN000; - 33815 00004D70 0E push cs ;AC036; pass current base seg into - 33816 ;(Note: this used to push CS. BUG... - 33817 00004D71 07 pop es ;AN000; ES reg, required for - 33818 ;get extended country information - 33819 ; 31/03/2023 - 33820 00004D72 B465 mov ah,$P_DOS_Get_TBL ; 65h ;AN000; get extended CDI - 33821 ;mov ah,65h - 33822 00004D74 88D0 mov al,dl ;AN000; upper case table - 33823 ;mov bx,-1 ; 0FFFFh - 33824 ;mov cx,5 - 33825 ;mov dx,-1 - 33826 00004D76 BBFFFF mov bx,$P_DOSTBL_Def ; -1 ;AN000; get active CON - 33827 00004D79 B90500 mov cx,$P_DOSTBL_BL ; 5 ;AN000; buffer length - 33828 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 33829 00004D7C 89DA mov dx,bx - 33830 ;mov dx,$P_DOSTBL_Def ; -1 ;AN000; get for default code page - 33831 ;DI already set to point to buffer - 33832 00004D7E CD21 int 21h ;AN000; es:di point to buffer that - 33833 ;now has been filled in with info - 33834 00004D80 5A pop dx ;AN000; - 33835 00004D81 59 pop cx ;AN000; - 33836 00004D82 58 pop ax ;AN000; - 33837 - 33838 $P_DCC01: ;AN000; - 33839 - 33840 ;In this next section, ES will be used as the base of the XLAT table, provided - 33841 ; by the previous GET COUNTRY INFO DOS call. This usage of ES is made - 33842 ; regardless of which base reg is currently the PSDATA_SEG reg. - 33843 - 33844 ;mov bx,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Off] - 33845 ;;mov bx,[cs:di+1] ;AN000; get offset of table - 33846 ;mov es,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Seg] - 33847 ;;mov es,[cs:di+3] ;AN000; get segment of table - 33848 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 33849 ;les bx,[cs:di+1] - 33850 00004D83 2EC45D01 les bx,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Off] - 33851 ; - 33852 00004D87 43 inc bx ;AC035; add '2' to - 33853 00004D88 43 inc bx ;AC035; BX reg - 33854 ;AN000; skip length field - 33855 00004D89 2C80 sub al,$P_ASCII80 ; 80h ;AN000; make char to index - 33856 ;xlat es:[bx] ;AN000; perform case map - 33857 ; 31/03/2023 - 33858 00004D8B 26D7 es xlat - 33859 - 33860 00004D8D 5F pop di ;AN000; - 33861 00004D8E 07 pop es ;AN000; - 33862 00004D8F 5B pop bx ;AN000; - 33863 $P_CAPS_Ret: ;AN000; - 33864 00004D90 C3 retn - 33865 - 33866 ;*********************************************************************** - 33867 ; $P_Value / $P_SValue - 33868 ; - 33869 ; Function: Make 32bit value from psdata_seg:SI and see value list - 33870 ; and make result buffer. - 33871 ; $P_SValue is an entry point for the signed value - 33872 ; and this will simply call $P_Value after the handling - 33873 ; of the sign character, "+" or "-" - 33874 ; - 33875 ; Input: psdata_seg:SI -> $P_STRING_BUF - 33876 ; ES:BX -> CONTROL block + 33789 00004D51 3C7A cmp al,"z" ; 7Ah ;AN000; + 33790 00004D53 773B ja short $P_CAPS_Ret ;AN000; if yes, make CAPS + 33791 + 33792 00004D55 24DF and al,$P_Make_Upper ; 0DFh ;AN000; else do nothing. + 33793 ;jmp short $P_CAPS_Ret ;AN000; + 33794 ; 18/04/2023 + 33795 00004D57 C3 retn + 33796 + 33797 $P_DCC_Go: ;AN000; + 33798 00004D58 53 push bx ;AN000; + 33799 00004D59 06 push es ;AN000; + 33800 00004D5A 57 push di ;AN000; + 33801 ; 18/04/2023 + 33802 00004D5B 8D3E[8598] lea di,$P_File_CAP_Ptr ;AC034; + 33803 00004D5F 80FA04 cmp dl,$P_DOSTBL_File ; 4 ;AN000; Use file CAPS table ? + 33804 00004D62 7404 je short $P_DCC00 ;AN000; + 33805 ; 27/04/2023 + 33806 00004D64 8D3E[8098] lea di,$P_Char_CAP_Ptr ;AC034; or use char CAPS table ? + 33807 $P_DCC00: ;AN000; + 33808 00004D68 2E3815 cmp [cs:di],dl ;AN000; already got table address ? + 33809 00004D6B 7416 je short $P_DCC01 ;AN000; if no, + 33810 + 33811 ;In this next section, ES will be used to pass a 5 byte workarea to INT 21h, + 33812 ; the GET COUNTYRY INFO call. This usage of ES is required by the function + 33813 ; call, regardless of what base register is currently be defined as PSDATA_SEG. + 33814 + 33815 00004D6D 50 push ax ;AN000; get CAPS table thru DOS call + 33816 00004D6E 51 push cx ;AN000; + 33817 00004D6F 52 push dx ;AN000; + 33818 00004D70 0E push cs ;AC036; pass current base seg into + 33819 ;(Note: this used to push CS. BUG... + 33820 00004D71 07 pop es ;AN000; ES reg, required for + 33821 ;get extended country information + 33822 ; 31/03/2023 + 33823 00004D72 B465 mov ah,$P_DOS_Get_TBL ; 65h ;AN000; get extended CDI + 33824 ;mov ah,65h + 33825 00004D74 88D0 mov al,dl ;AN000; upper case table + 33826 ;mov bx,-1 ; 0FFFFh + 33827 ;mov cx,5 + 33828 ;mov dx,-1 + 33829 00004D76 BBFFFF mov bx,$P_DOSTBL_Def ; -1 ;AN000; get active CON + 33830 00004D79 B90500 mov cx,$P_DOSTBL_BL ; 5 ;AN000; buffer length + 33831 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 33832 00004D7C 89DA mov dx,bx + 33833 ;mov dx,$P_DOSTBL_Def ; -1 ;AN000; get for default code page + 33834 ;DI already set to point to buffer + 33835 00004D7E CD21 int 21h ;AN000; es:di point to buffer that + 33836 ;now has been filled in with info + 33837 00004D80 5A pop dx ;AN000; + 33838 00004D81 59 pop cx ;AN000; + 33839 00004D82 58 pop ax ;AN000; + 33840 + 33841 $P_DCC01: ;AN000; + 33842 + 33843 ;In this next section, ES will be used as the base of the XLAT table, provided + 33844 ; by the previous GET COUNTRY INFO DOS call. This usage of ES is made + 33845 ; regardless of which base reg is currently the PSDATA_SEG reg. + 33846 + 33847 ;mov bx,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Off] + 33848 ;;mov bx,[cs:di+1] ;AN000; get offset of table + 33849 ;mov es,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Seg] + 33850 ;;mov es,[cs:di+3] ;AN000; get segment of table + 33851 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 33852 ;les bx,[cs:di+1] + 33853 00004D83 2EC45D01 les bx,[cs:di+$P_DOS_TBL.$P_DOS_TBL_Off] + 33854 ; + 33855 00004D87 43 inc bx ;AC035; add '2' to + 33856 00004D88 43 inc bx ;AC035; BX reg + 33857 ;AN000; skip length field + 33858 00004D89 2C80 sub al,$P_ASCII80 ; 80h ;AN000; make char to index + 33859 ;xlat es:[bx] ;AN000; perform case map + 33860 ; 31/03/2023 + 33861 00004D8B 26D7 es xlat + 33862 + 33863 00004D8D 5F pop di ;AN000; + 33864 00004D8E 07 pop es ;AN000; + 33865 00004D8F 5B pop bx ;AN000; + 33866 $P_CAPS_Ret: ;AN000; + 33867 00004D90 C3 retn + 33868 + 33869 ;*********************************************************************** + 33870 ; $P_Value / $P_SValue + 33871 ; + 33872 ; Function: Make 32bit value from psdata_seg:SI and see value list + 33873 ; and make result buffer. + 33874 ; $P_SValue is an entry point for the signed value + 33875 ; and this will simply call $P_Value after the handling + 33876 ; of the sign character, "+" or "-" 33877 ; - 33878 ; Output: None - 33879 ; - 33880 ; Use: $P_Fill_Result, $P_Check_OVF - 33881 ; - 33882 ; Vars: $P_RC(W), $P_Flags(RW) - 33883 ;*********************************************************************** - 33884 - 33885 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33886 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33887 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33888 $P_SValue: - 33889 00004D91 50 push ax ;AN000; - 33890 ;or byte [cs:$P_Flags2],80h - 33891 00004D92 2E800E[C697]80 or byte [cs:$P_Flags2],$P_Signed - 33892 ;AC034; indicate a signed numeric - 33893 ;and byte [cs:$P_Flags2],0FDh - 33894 00004D98 2E8026[C697]FD and byte [cs:$P_Flags2],0FFh-$P_Neg - 33895 ;AC034; assume positive value - 33896 00004D9E 2E8A04 mov al,[cs:si] ;AN000; get sign - 33897 00004DA1 3C2B cmp al,'+' ; 2Bh - 33898 ;cmp al,$P_Plus ; '+' ;AN000; "+" ? - 33899 00004DA3 740A je short $P_SVal00 ;AN000; - 33900 - 33901 00004DA5 3C2D cmp al,'-' ; 2Dh - 33902 ;cmp al,$P_Minus ; '-' ;AN000; "-" ? - 33903 00004DA7 7507 jne short $P_Sval01 ;AN000; else - 33904 - 33905 00004DA9 2E800E[C697]02 or byte [cs:$P_Flags2],$P_Neg ; 2 - 33906 ;AC034; set this is negative value - 33907 $P_SVal00: ;AN000; - 33908 00004DAF 46 inc si ;AN000; skip sign char - 33909 $P_Sval01: ;AN000; - 33910 00004DB0 E80200 call $P_Value ;AN000; and process value - 33911 00004DB3 58 pop ax ;AN000; - 33912 $P_Check_OVF_ok: ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33913 00004DB4 C3 retn ;AN000; - 33914 - 33915 ;*********************************************************************** - 33916 - 33917 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 33918 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4955h + 33878 ; Input: psdata_seg:SI -> $P_STRING_BUF + 33879 ; ES:BX -> CONTROL block + 33880 ; + 33881 ; Output: None + 33882 ; + 33883 ; Use: $P_Fill_Result, $P_Check_OVF + 33884 ; + 33885 ; Vars: $P_RC(W), $P_Flags(RW) + 33886 ;*********************************************************************** + 33887 + 33888 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33889 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33890 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33891 $P_SValue: + 33892 00004D91 50 push ax ;AN000; + 33893 ;or byte [cs:$P_Flags2],80h + 33894 00004D92 2E800E[C697]80 or byte [cs:$P_Flags2],$P_Signed + 33895 ;AC034; indicate a signed numeric + 33896 ;and byte [cs:$P_Flags2],0FDh + 33897 00004D98 2E8026[C697]FD and byte [cs:$P_Flags2],0FFh-$P_Neg + 33898 ;AC034; assume positive value + 33899 00004D9E 2E8A04 mov al,[cs:si] ;AN000; get sign + 33900 00004DA1 3C2B cmp al,'+' ; 2Bh + 33901 ;cmp al,$P_Plus ; '+' ;AN000; "+" ? + 33902 00004DA3 740A je short $P_SVal00 ;AN000; + 33903 + 33904 00004DA5 3C2D cmp al,'-' ; 2Dh + 33905 ;cmp al,$P_Minus ; '-' ;AN000; "-" ? + 33906 00004DA7 7507 jne short $P_Sval01 ;AN000; else + 33907 + 33908 00004DA9 2E800E[C697]02 or byte [cs:$P_Flags2],$P_Neg ; 2 + 33909 ;AC034; set this is negative value + 33910 $P_SVal00: ;AN000; + 33911 00004DAF 46 inc si ;AN000; skip sign char + 33912 $P_Sval01: ;AN000; + 33913 00004DB0 E80200 call $P_Value ;AN000; and process value + 33914 00004DB3 58 pop ax ;AN000; + 33915 $P_Check_OVF_ok: ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33916 00004DB4 C3 retn ;AN000; + 33917 + 33918 ;*********************************************************************** 33919 - 33920 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 33921 ; MSDOS 6.2 COMMAND.COM - TRANGROUP:5119h + 33920 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 33921 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4955h 33922 - 33923 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 33924 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4FCCh - 33925 $P_Value: - 33926 00004DB5 50 push ax ;AN000; - 33927 00004DB6 51 push cx ;AN000; - 33928 00004DB7 52 push dx ;AN000; - 33929 00004DB8 56 push si ;AN000; - 33930 00004DB9 31C9 xor cx,cx ;AN000; cx = higher 16 bits - 33931 00004DBB 31D2 xor dx,dx ;AN000; dx = lower 16 bits - 33932 00004DBD 53 push bx ;AN000; save control pointer - 33933 - 33934 $P_Value_Loop: ;AN000; - 33935 00004DBE 2E8A04 mov al,[cs:si] ;AN000; get character - 33936 00004DC1 08C0 or al,al ;AN000; end of line ? - 33937 00004DC3 7436 jz short $P_Value00 ;AN000; - 33938 - 33939 00004DC5 E8DF00 call $P_0099 ;AN000; make asc(0..9) to bin(0..9) - 33940 00004DC8 722D jc short $P_Value_Err0 ;AN000; + 33923 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 33924 ; MSDOS 6.2 COMMAND.COM - TRANGROUP:5119h + 33925 + 33926 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 33927 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:4FCCh + 33928 $P_Value: + 33929 00004DB5 50 push ax ;AN000; + 33930 00004DB6 51 push cx ;AN000; + 33931 00004DB7 52 push dx ;AN000; + 33932 00004DB8 56 push si ;AN000; + 33933 00004DB9 31C9 xor cx,cx ;AN000; cx = higher 16 bits + 33934 00004DBB 31D2 xor dx,dx ;AN000; dx = lower 16 bits + 33935 00004DBD 53 push bx ;AN000; save control pointer + 33936 + 33937 $P_Value_Loop: ;AN000; + 33938 00004DBE 2E8A04 mov al,[cs:si] ;AN000; get character + 33939 00004DC1 08C0 or al,al ;AN000; end of line ? + 33940 00004DC3 7436 jz short $P_Value00 ;AN000; 33941 - 33942 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 33943 %if 0 - 33944 xor ah,ah ;AN000; - 33945 mov bp,ax ;AN000; save binary number - 33946 shl dx,1 ;AN000; to have 2*x - 33947 rcl cx,1 ;AN000; shift left w/ carry - 33948 call $P_Check_OVF ;AN000; Overflow occurred ? - 33949 jc short $P_Value_Err0 ;AN000; then error, exit - 33950 - 33951 mov bx,dx ;AN000; save low(2*x) - 33952 mov ax,cx ;AN000; save high(2*x) - 33953 shl dx,1 ;AN000; to have 4*x - 33954 rcl cx,1 ;AN000; shift left w/ carry - 33955 call $P_Check_OVF ;AN000; Overflow occurred ? - 33956 jc short $P_Value_Err0 ;AN000; then error, exit - 33957 - 33958 shl dx,1 ;AN000; to have 8*x - 33959 rcl cx,1 ;AN000; shift left w/ carry - 33960 call $P_Check_OVF ;AN000; Overflow occurred ? - 33961 jc short $P_Value_Err0 ;AN000; then error, exit - 33962 - 33963 add dx,bx ;AN000; now have 10*x - 33964 adc cx,ax ;AN000; 32bit ADD - 33965 call $P_Check_OVF ;AN000; Overflow occurred ? - 33966 jc short $P_Value_Err0 ;AN000; then error, exit - 33967 - 33968 add dx,bp ;AN000; Add the current one degree decimal - 33969 adc cx,0 ;AN000; if carry, add 1 to high 16bit - 33970 call $P_Check_OVF ;AN000; Overflow occurred ? - 33971 jc short $P_Value_Err0 ;AN000; then error, exit - 33972 - 33973 inc si ;AN000; update pointer - 33974 jmp short $P_Value_Loop ;AN000; loop until NULL encountered - 33975 %else - 33976 00004DCA 30E4 xor ah,ah - 33977 00004DCC 89C5 mov bp,ax ; save binary number - 33978 00004DCE E81C00 call $P_Check_OVF_shl32 ; check Overflow (after shl32) - 33979 00004DD1 89D3 mov bx,dx ; save low(2*x) - 33980 00004DD3 89C8 mov ax,cx ; save high(2*x) - 33981 00004DD5 E81500 call $P_Check_OVF_shl32 ; check OverFlow (after shl32) - 33982 00004DD8 E81200 call $P_Check_OVF_shl32 ; check OverFlow (after shl32) - 33983 00004DDB 01DA add dx,bx ; now have 10*x - 33984 00004DDD 11C1 adc cx,ax ; 32bit ADD - 33985 00004DDF E80F00 call $P_Check_OVF_@ ; check OverFlow - 33986 00004DE2 01EA add dx,bp ; Add the current one degree decimal - 33987 00004DE4 83D100 adc cx,0 ; if carry, add 1 to high 16bit - 33988 00004DE7 E80700 call $P_Check_OVF_@ ; check Overflow - 33989 00004DEA 46 inc si ; update pointer - 33990 00004DEB EBD1 jmp short $P_Value_Loop ; loop until NULL encountered - 33991 - 33992 $P_Check_OVF_shl32: - 33993 00004DED D1E2 shl dx,1 - 33994 00004DEF D1D1 rcl cx,1 - 33995 $P_Check_OVF_@: - 33996 00004DF1 E8A100 call $P_Check_OVF - 33997 ;jc short $P_Value_Err0_@ - 33998 ;retn - 33999 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34000 00004DF4 73BE jnc short $P_Check_OVF_ok - 34001 - 34002 $P_Value_Err0_@: - 34003 ;inc sp - 34004 ;inc sp - 34005 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34006 00004DF6 5B pop bx - 34007 %endif - 34008 - 34009 $P_Value_Err0: ;AN000; - 34010 00004DF7 5B pop bx ;AN000; - 34011 00004DF8 E98800 jmp $P_Value_Err ;AN000; Bridge - 34012 - 34013 $P_Value00: ;AN000; - 34014 00004DFB 5B pop bx ;AN000; restore control pointer - 34015 00004DFC 2EF606[C697]02 test byte [cs:$P_Flags2],$P_Neg ; 2 - 34016 ;AC034; here cx,dx = 32bit value - 34017 00004E02 740A jz short $P_Value01 ;AN000; was it negative ? - 34018 - 34019 00004E04 F7D1 not cx ;AN000; + - 34020 00004E06 F7D2 not dx ;AN000; |- Make 2's complement - 34021 00004E08 83C201 add dx,1 ;AN000; | - 34022 00004E0B 83D100 adc cx,0 ;AN000; + - 34023 $P_Value01: ;AN000; / nval =0 - 34024 00004E0E 268B7706 mov si,[es:bx+$P_CONTROL_BLK.$P_Value_List] - 34025 ;mov si,[es:bx+6] ;AN000; si points to value list - 34026 00004E12 268A04 mov al,[es:si] ;AN000; get nval - 34027 00004E15 3C00 cmp al,$P_nval_None ; 0 ;AN000; no value list ? - 34028 00004E17 7505 jne short $P_Value02 ;AN000; - 34029 - 34030 ;mov al,$P_Number ; 1 ;AN000; Set type - 34031 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set - 34032 ; 31/03/2023 - 34033 00004E19 B801FF mov ax,($P_No_Tag<<8)+$P_Number - 34034 00004E1C EB6F jmp short $P_Value_Exit ;AN000; - 34035 - 34036 $P_Value02: ;AN000; / nval = 1 - 34037 00004E1E 46 inc si ;AN000; - 34038 00004E1F 268A04 mov al,[es:si] ;AN000; al = number of range - 34039 00004E22 3C00 cmp al,$P_No_nrng ; 0 ;AN000; (tm07) - 34040 00004E24 745D je short $P_Value03 ;AN000; (tm07) - 34041 - 34042 00004E26 46 inc si ;AN000; si points to 1st item_tag - 34043 $P_Val02_Loop: ;AN000; - 34044 00004E27 2EF606[C697]80 test byte [cs:$P_Flags2],$P_Signed ; 80h - 34045 ;test byte [cs:$P_Flags2],80h ;AC034; - 34046 00004E2D 751E jnz short $P_Val02_Sign ;AN000; - 34047 - 34048 00004E2F 263B4C03 cmp cx,[es:si+$P_VAL_LIST.$P_Val_XH] - 34049 ;cmp cx,[es:si+3] ;AN000; comp cx with XH - 34050 00004E33 723B jb short $P_Val02_Next ;AN000; - 34051 00004E35 7706 ja short $P_Val_In ;AN000; - 34052 - 34053 00004E37 263B5401 cmp dx,[es:si+$P_VAL_LIST.$P_Val_XL] - 34054 ;cmp dx,[es:si+1] ;AN000; comp dx with XL - 34055 00004E3B 7233 jb short $P_Val02_Next ;AN000; - 34056 - 34057 $P_Val_In: ;AN000; - 34058 00004E3D 263B4C07 cmp cx,[es:si+$P_VAL_LIST.$P_Val_YH] - 34059 ;cmp cx,[es:si+7] ;AN000; comp cx with YH (tm01) - 34060 00004E41 772D ja short $P_Val02_Next ;AN000; - 34061 00004E43 7224 jb short $P_Val_Found ;AN000; - 34062 - 34063 00004E45 263B5405 cmp dx,[es:si+$P_VAL_LIST.$P_Val_YL] - 34064 ;cmp dx,[es:si+5] ;AN000; comp dx with YL - 34065 00004E49 7725 ja short $P_Val02_Next ;AN000; - 34066 - 34067 00004E4B EB1C jmp short $P_Val_Found ;AN000; - 34068 - 34069 $P_Val02_Sign: ;AN000; - 34070 00004E4D 263B4C03 cmp cx,[es:si+$P_VAL_LIST.$P_Val_XH] - 34071 ;cmp cx,[es:si+3] ;AN000; comp cx with XH - 34072 00004E51 7C1D jl short $P_Val02_Next ;AN000; - 34073 00004E53 7F06 jg short $P_SVal_In ;AN000; - 34074 - 34075 00004E55 263B5401 cmp dx,[es:si+$P_VAL_LIST.$P_Val_XL] - 34076 ;cmp dx,[es:si+1] ;AN000; comp dx with XL - 34077 00004E59 7C15 jl short $P_Val02_Next ;AN000; - 34078 - 34079 $P_SVal_In: ;AN000; - 34080 00004E5B 263B4C07 cmp cx,[es:si+$P_VAL_LIST.$P_Val_YH] - 34081 ;cmp cx,[es:si+7] ;AN000; comp cx with YH - 34082 00004E5F 7F0F jg short $P_Val02_Next ;AN000; - 34083 00004E61 7C06 jl short $P_Val_Found ;AN000; - 34084 - 34085 00004E63 263B5405 cmp dx,[es:si+$P_VAL_LIST.$P_Val_YL] - 34086 ;cmp dx,[es:si+5] ;AN000; comp dx with YL - 34087 00004E67 7F07 jg short $P_Val02_Next ;AN000; - 34088 - 34089 ;jmp short $P_Val_Found ;AN000; - 34090 ; 27/04/2023 - 34091 $P_Val_Found: ;AN000; - 34092 00004E69 B001 mov al,$P_Number ; 1 ;AN000; - 34093 00004E6B 268A24 mov ah,[es:si] ;AN000; found ITEM_TAG set - 34094 00004E6E EB1D jmp short $P_Value_Exit ;AN000; - 34095 - 34096 $P_Val02_Next: ;AN000; - 34097 00004E70 83C609 add si,$P_Len_Range ; 9 ;AN000; - 34098 00004E73 FEC8 dec al ;AN000; loop nrng times in AL - 34099 00004E75 75B0 jnz short $P_Val02_Loop ;AN000; - 34100 ; / Not found - 34101 00004E77 2EC706[BA97]0600 mov word [cs:$P_RC],$P_Out_Of_Range - 34102 ;mov word [cs:$P_RC],6 ;AC034; - 34103 - 34104 ;mov al,$P_Number ; 1 ;AN000; - 34105 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set - 34106 ; 31/03/2023 - 34107 00004E7E B801FF mov ax,($P_No_Tag<<8)+$P_Number - 34108 00004E81 EB0A jmp short $P_Value_Exit ;AN000; - 34109 - 34110 ; 27/04/2023 - 34111 ;$P_Val_Found: ;AN000; - 34112 ;mov al,$P_Number ; 1 ;AN000; - 34113 ;mov ah,[es:si] ;AN000; found ITEM_TAG set - 34114 ;jmp short $P_Value_Exit ;AN000; - 34115 - 34116 $P_Value03: ;AN000; / nval = 2 - 34117 $P_Value04: ;AN000; / nval = 3 or else - 34118 $P_Value_Err: ;AN000; - 34119 00004E83 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 - 34120 ;AC034; - 34121 ;mov al,$P_String ; 3 ;AN000; Set type - 34122 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set - 34123 ; 31/03/2023 - 34124 00004E8A B803FF mov ax,($P_No_Tag<<8)+$P_String - 34125 $P_Value_Exit: ;AN000; - 34126 00004E8D E81AFD call $P_Fill_Result ;AN000; - 34127 00004E90 5E pop si ;AN000; - 34128 00004E91 5A pop dx ;AN000; - 34129 00004E92 59 pop cx ;AN000; - 34130 00004E93 58 pop ax ;AN000; - 34131 00004E94 C3 retn ;AN000; - 34132 - 34133 ;*********************************************************************** - 34134 ; $P_Check_OVF - 34135 ; - 34136 ; Function: Check if overflow is occurred with consideration of - 34137 ; signed or un-signed numeric value + 33942 00004DC5 E8DF00 call $P_0099 ;AN000; make asc(0..9) to bin(0..9) + 33943 00004DC8 722D jc short $P_Value_Err0 ;AN000; + 33944 + 33945 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 33946 %if 0 + 33947 xor ah,ah ;AN000; + 33948 mov bp,ax ;AN000; save binary number + 33949 shl dx,1 ;AN000; to have 2*x + 33950 rcl cx,1 ;AN000; shift left w/ carry + 33951 call $P_Check_OVF ;AN000; Overflow occurred ? + 33952 jc short $P_Value_Err0 ;AN000; then error, exit + 33953 + 33954 mov bx,dx ;AN000; save low(2*x) + 33955 mov ax,cx ;AN000; save high(2*x) + 33956 shl dx,1 ;AN000; to have 4*x + 33957 rcl cx,1 ;AN000; shift left w/ carry + 33958 call $P_Check_OVF ;AN000; Overflow occurred ? + 33959 jc short $P_Value_Err0 ;AN000; then error, exit + 33960 + 33961 shl dx,1 ;AN000; to have 8*x + 33962 rcl cx,1 ;AN000; shift left w/ carry + 33963 call $P_Check_OVF ;AN000; Overflow occurred ? + 33964 jc short $P_Value_Err0 ;AN000; then error, exit + 33965 + 33966 add dx,bx ;AN000; now have 10*x + 33967 adc cx,ax ;AN000; 32bit ADD + 33968 call $P_Check_OVF ;AN000; Overflow occurred ? + 33969 jc short $P_Value_Err0 ;AN000; then error, exit + 33970 + 33971 add dx,bp ;AN000; Add the current one degree decimal + 33972 adc cx,0 ;AN000; if carry, add 1 to high 16bit + 33973 call $P_Check_OVF ;AN000; Overflow occurred ? + 33974 jc short $P_Value_Err0 ;AN000; then error, exit + 33975 + 33976 inc si ;AN000; update pointer + 33977 jmp short $P_Value_Loop ;AN000; loop until NULL encountered + 33978 %else + 33979 00004DCA 30E4 xor ah,ah + 33980 00004DCC 89C5 mov bp,ax ; save binary number + 33981 00004DCE E81C00 call $P_Check_OVF_shl32 ; check Overflow (after shl32) + 33982 00004DD1 89D3 mov bx,dx ; save low(2*x) + 33983 00004DD3 89C8 mov ax,cx ; save high(2*x) + 33984 00004DD5 E81500 call $P_Check_OVF_shl32 ; check OverFlow (after shl32) + 33985 00004DD8 E81200 call $P_Check_OVF_shl32 ; check OverFlow (after shl32) + 33986 00004DDB 01DA add dx,bx ; now have 10*x + 33987 00004DDD 11C1 adc cx,ax ; 32bit ADD + 33988 00004DDF E80F00 call $P_Check_OVF_@ ; check OverFlow + 33989 00004DE2 01EA add dx,bp ; Add the current one degree decimal + 33990 00004DE4 83D100 adc cx,0 ; if carry, add 1 to high 16bit + 33991 00004DE7 E80700 call $P_Check_OVF_@ ; check Overflow + 33992 00004DEA 46 inc si ; update pointer + 33993 00004DEB EBD1 jmp short $P_Value_Loop ; loop until NULL encountered + 33994 + 33995 $P_Check_OVF_shl32: + 33996 00004DED D1E2 shl dx,1 + 33997 00004DEF D1D1 rcl cx,1 + 33998 $P_Check_OVF_@: + 33999 00004DF1 E8A100 call $P_Check_OVF + 34000 ;jc short $P_Value_Err0_@ + 34001 ;retn + 34002 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34003 00004DF4 73BE jnc short $P_Check_OVF_ok + 34004 + 34005 $P_Value_Err0_@: + 34006 ;inc sp + 34007 ;inc sp + 34008 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34009 00004DF6 5B pop bx + 34010 %endif + 34011 + 34012 $P_Value_Err0: ;AN000; + 34013 00004DF7 5B pop bx ;AN000; + 34014 00004DF8 E98800 jmp $P_Value_Err ;AN000; Bridge + 34015 + 34016 $P_Value00: ;AN000; + 34017 00004DFB 5B pop bx ;AN000; restore control pointer + 34018 00004DFC 2EF606[C697]02 test byte [cs:$P_Flags2],$P_Neg ; 2 + 34019 ;AC034; here cx,dx = 32bit value + 34020 00004E02 740A jz short $P_Value01 ;AN000; was it negative ? + 34021 + 34022 00004E04 F7D1 not cx ;AN000; + + 34023 00004E06 F7D2 not dx ;AN000; |- Make 2's complement + 34024 00004E08 83C201 add dx,1 ;AN000; | + 34025 00004E0B 83D100 adc cx,0 ;AN000; + + 34026 $P_Value01: ;AN000; / nval =0 + 34027 00004E0E 268B7706 mov si,[es:bx+$P_CONTROL_BLK.$P_Value_List] + 34028 ;mov si,[es:bx+6] ;AN000; si points to value list + 34029 00004E12 268A04 mov al,[es:si] ;AN000; get nval + 34030 00004E15 3C00 cmp al,$P_nval_None ; 0 ;AN000; no value list ? + 34031 00004E17 7505 jne short $P_Value02 ;AN000; + 34032 + 34033 ;mov al,$P_Number ; 1 ;AN000; Set type + 34034 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set + 34035 ; 31/03/2023 + 34036 00004E19 B801FF mov ax,($P_No_Tag<<8)+$P_Number + 34037 00004E1C EB6F jmp short $P_Value_Exit ;AN000; + 34038 + 34039 $P_Value02: ;AN000; / nval = 1 + 34040 00004E1E 46 inc si ;AN000; + 34041 00004E1F 268A04 mov al,[es:si] ;AN000; al = number of range + 34042 00004E22 3C00 cmp al,$P_No_nrng ; 0 ;AN000; (tm07) + 34043 00004E24 745D je short $P_Value03 ;AN000; (tm07) + 34044 + 34045 00004E26 46 inc si ;AN000; si points to 1st item_tag + 34046 $P_Val02_Loop: ;AN000; + 34047 00004E27 2EF606[C697]80 test byte [cs:$P_Flags2],$P_Signed ; 80h + 34048 ;test byte [cs:$P_Flags2],80h ;AC034; + 34049 00004E2D 751E jnz short $P_Val02_Sign ;AN000; + 34050 + 34051 00004E2F 263B4C03 cmp cx,[es:si+$P_VAL_LIST.$P_Val_XH] + 34052 ;cmp cx,[es:si+3] ;AN000; comp cx with XH + 34053 00004E33 723B jb short $P_Val02_Next ;AN000; + 34054 00004E35 7706 ja short $P_Val_In ;AN000; + 34055 + 34056 00004E37 263B5401 cmp dx,[es:si+$P_VAL_LIST.$P_Val_XL] + 34057 ;cmp dx,[es:si+1] ;AN000; comp dx with XL + 34058 00004E3B 7233 jb short $P_Val02_Next ;AN000; + 34059 + 34060 $P_Val_In: ;AN000; + 34061 00004E3D 263B4C07 cmp cx,[es:si+$P_VAL_LIST.$P_Val_YH] + 34062 ;cmp cx,[es:si+7] ;AN000; comp cx with YH (tm01) + 34063 00004E41 772D ja short $P_Val02_Next ;AN000; + 34064 00004E43 7224 jb short $P_Val_Found ;AN000; + 34065 + 34066 00004E45 263B5405 cmp dx,[es:si+$P_VAL_LIST.$P_Val_YL] + 34067 ;cmp dx,[es:si+5] ;AN000; comp dx with YL + 34068 00004E49 7725 ja short $P_Val02_Next ;AN000; + 34069 + 34070 00004E4B EB1C jmp short $P_Val_Found ;AN000; + 34071 + 34072 $P_Val02_Sign: ;AN000; + 34073 00004E4D 263B4C03 cmp cx,[es:si+$P_VAL_LIST.$P_Val_XH] + 34074 ;cmp cx,[es:si+3] ;AN000; comp cx with XH + 34075 00004E51 7C1D jl short $P_Val02_Next ;AN000; + 34076 00004E53 7F06 jg short $P_SVal_In ;AN000; + 34077 + 34078 00004E55 263B5401 cmp dx,[es:si+$P_VAL_LIST.$P_Val_XL] + 34079 ;cmp dx,[es:si+1] ;AN000; comp dx with XL + 34080 00004E59 7C15 jl short $P_Val02_Next ;AN000; + 34081 + 34082 $P_SVal_In: ;AN000; + 34083 00004E5B 263B4C07 cmp cx,[es:si+$P_VAL_LIST.$P_Val_YH] + 34084 ;cmp cx,[es:si+7] ;AN000; comp cx with YH + 34085 00004E5F 7F0F jg short $P_Val02_Next ;AN000; + 34086 00004E61 7C06 jl short $P_Val_Found ;AN000; + 34087 + 34088 00004E63 263B5405 cmp dx,[es:si+$P_VAL_LIST.$P_Val_YL] + 34089 ;cmp dx,[es:si+5] ;AN000; comp dx with YL + 34090 00004E67 7F07 jg short $P_Val02_Next ;AN000; + 34091 + 34092 ;jmp short $P_Val_Found ;AN000; + 34093 ; 27/04/2023 + 34094 $P_Val_Found: ;AN000; + 34095 00004E69 B001 mov al,$P_Number ; 1 ;AN000; + 34096 00004E6B 268A24 mov ah,[es:si] ;AN000; found ITEM_TAG set + 34097 00004E6E EB1D jmp short $P_Value_Exit ;AN000; + 34098 + 34099 $P_Val02_Next: ;AN000; + 34100 00004E70 83C609 add si,$P_Len_Range ; 9 ;AN000; + 34101 00004E73 FEC8 dec al ;AN000; loop nrng times in AL + 34102 00004E75 75B0 jnz short $P_Val02_Loop ;AN000; + 34103 ; / Not found + 34104 00004E77 2EC706[BA97]0600 mov word [cs:$P_RC],$P_Out_Of_Range + 34105 ;mov word [cs:$P_RC],6 ;AC034; + 34106 + 34107 ;mov al,$P_Number ; 1 ;AN000; + 34108 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set + 34109 ; 31/03/2023 + 34110 00004E7E B801FF mov ax,($P_No_Tag<<8)+$P_Number + 34111 00004E81 EB0A jmp short $P_Value_Exit ;AN000; + 34112 + 34113 ; 27/04/2023 + 34114 ;$P_Val_Found: ;AN000; + 34115 ;mov al,$P_Number ; 1 ;AN000; + 34116 ;mov ah,[es:si] ;AN000; found ITEM_TAG set + 34117 ;jmp short $P_Value_Exit ;AN000; + 34118 + 34119 $P_Value03: ;AN000; / nval = 2 + 34120 $P_Value04: ;AN000; / nval = 3 or else + 34121 $P_Value_Err: ;AN000; + 34122 00004E83 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 + 34123 ;AC034; + 34124 ;mov al,$P_String ; 3 ;AN000; Set type + 34125 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set + 34126 ; 31/03/2023 + 34127 00004E8A B803FF mov ax,($P_No_Tag<<8)+$P_String + 34128 $P_Value_Exit: ;AN000; + 34129 00004E8D E81AFD call $P_Fill_Result ;AN000; + 34130 00004E90 5E pop si ;AN000; + 34131 00004E91 5A pop dx ;AN000; + 34132 00004E92 59 pop cx ;AN000; + 34133 00004E93 58 pop ax ;AN000; + 34134 00004E94 C3 retn ;AN000; + 34135 + 34136 ;*********************************************************************** + 34137 ; $P_Check_OVF 34138 ; - 34139 ; Input: Flag register - 34140 ; - 34141 ; Output: CY = 1 : Overflow - 34142 ; - 34143 ; Vars: $P_Flags(R) - 34144 ;*********************************************************************** - 34145 - 34146 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34147 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34148 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34149 $P_Check_OVF: - 34150 00004E95 9C pushf ;AN000; - 34151 00004E96 2EF606[C697]02 test byte [cs:$P_Flags2],$P_Neg ; 2 - 34152 ;AC034; is it negative value ? - 34153 00004E9C 7502 jnz short $P_COVF ;AN000; if no, check overflow - 34154 00004E9E 9D popf ;AN000; by the CY bit - 34155 00004E9F C3 retn ;AN000; - 34156 $P_COVF: ;AN000; - 34157 00004EA0 9D popf ;AN000; else, - 34158 00004EA1 7002 jo short $P_COVF00 ;AN000; check overflow by the OF - 34159 00004EA3 F8 clc ;AN000; indicate it with CY bit - 34160 00004EA4 C3 retn ;AN000; CY=0 means no overflow - 34161 $P_0099Err: ; 31/03/2023 - 34162 $P_COVF00: ;AN000; - 34163 00004EA5 F9 stc ;AN000; and CY=1 means overflow - 34164 $P_0099Err2: ; 31/03/2023 - 34165 00004EA6 C3 retn ;AN000; - 34166 - 34167 ;*********************************************************************** - 34168 ; $P_0099; - 34169 ; - 34170 ; Function: Make ASCII 0-9 to Binary 0-9 - 34171 ; - 34172 ; Input: AL = character code - 34173 ; - 34174 ; Output: CY = 1 : AL is not number - 34175 ; CY = 0 : AL contains binary value - 34176 ;*********************************************************************** - 34177 - 34178 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34179 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34180 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34181 $P_0099: - 34182 00004EA7 3C30 cmp al,"0" ;AN000; - 34183 ;jb short $P_0099Err ;AN000; must be 0 =< al =< 9 - 34184 ; 31/03/2023 - 34185 00004EA9 72FB jb short $P_0099Err2 - 34186 - 34187 00004EAB 3C39 cmp al,"9" ;AN000; - 34188 00004EAD 77F6 ja short $P_0099Err ;AN000; must be 0 =< al =< 9 + 34139 ; Function: Check if overflow is occurred with consideration of + 34140 ; signed or un-signed numeric value + 34141 ; + 34142 ; Input: Flag register + 34143 ; + 34144 ; Output: CY = 1 : Overflow + 34145 ; + 34146 ; Vars: $P_Flags(R) + 34147 ;*********************************************************************** + 34148 + 34149 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34150 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34151 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34152 $P_Check_OVF: + 34153 00004E95 9C pushf ;AN000; + 34154 00004E96 2EF606[C697]02 test byte [cs:$P_Flags2],$P_Neg ; 2 + 34155 ;AC034; is it negative value ? + 34156 00004E9C 7502 jnz short $P_COVF ;AN000; if no, check overflow + 34157 00004E9E 9D popf ;AN000; by the CY bit + 34158 00004E9F C3 retn ;AN000; + 34159 $P_COVF: ;AN000; + 34160 00004EA0 9D popf ;AN000; else, + 34161 00004EA1 7002 jo short $P_COVF00 ;AN000; check overflow by the OF + 34162 00004EA3 F8 clc ;AN000; indicate it with CY bit + 34163 00004EA4 C3 retn ;AN000; CY=0 means no overflow + 34164 $P_0099Err: ; 31/03/2023 + 34165 $P_COVF00: ;AN000; + 34166 00004EA5 F9 stc ;AN000; and CY=1 means overflow + 34167 $P_0099Err2: ; 31/03/2023 + 34168 00004EA6 C3 retn ;AN000; + 34169 + 34170 ;*********************************************************************** + 34171 ; $P_0099; + 34172 ; + 34173 ; Function: Make ASCII 0-9 to Binary 0-9 + 34174 ; + 34175 ; Input: AL = character code + 34176 ; + 34177 ; Output: CY = 1 : AL is not number + 34178 ; CY = 0 : AL contains binary value + 34179 ;*********************************************************************** + 34180 + 34181 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34182 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34183 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34184 $P_0099: + 34185 00004EA7 3C30 cmp al,"0" ;AN000; + 34186 ;jb short $P_0099Err ;AN000; must be 0 =< al =< 9 + 34187 ; 31/03/2023 + 34188 00004EA9 72FB jb short $P_0099Err2 34189 - 34190 00004EAF 2C30 sub al,"0" ;AN000; make char -> bin - 34191 ; 31/03/2023 - 34192 ;clc ;AN000; indicate no error - 34193 00004EB1 C3 retn ;AN000; - 34194 ;31/03/2023 - 34195 ;$P_0099Err: ;AN000; - 34196 ; stc ;AN000; indicate error - 34197 ; retn ;AN000; - 34198 - 34199 ;*********************************************************************** - 34200 ; $P_Simple_String - 34201 ; - 34202 ; Function: See value list for the simple string - 34203 ; and make result buffer. + 34190 00004EAB 3C39 cmp al,"9" ;AN000; + 34191 00004EAD 77F6 ja short $P_0099Err ;AN000; must be 0 =< al =< 9 + 34192 + 34193 00004EAF 2C30 sub al,"0" ;AN000; make char -> bin + 34194 ; 31/03/2023 + 34195 ;clc ;AN000; indicate no error + 34196 00004EB1 C3 retn ;AN000; + 34197 ;31/03/2023 + 34198 ;$P_0099Err: ;AN000; + 34199 ; stc ;AN000; indicate error + 34200 ; retn ;AN000; + 34201 + 34202 ;*********************************************************************** + 34203 ; $P_Simple_String 34204 ; - 34205 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34206 ; ES:BX -> CONTROL block + 34205 ; Function: See value list for the simple string + 34206 ; and make result buffer. 34207 ; - 34208 ; Output: None - 34209 ; - 34210 ; Use: $P_Fill_Result, $P_String_Comp - 34211 ; - 34212 ; Vars: $P_RC(W) - 34213 ;*********************************************************************** - 34214 - 34215 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34216 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34217 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34218 $P_Simple_String: - 34219 00004EB2 50 push ax ;AN000; - 34220 00004EB3 53 push bx ;AN000; - 34221 00004EB4 52 push dx ;AN000; - 34222 00004EB5 57 push di ;AN000; - 34223 00004EB6 268B7F06 mov di,[es:bx+$P_CONTROL_BLK.$P_Value_List] - 34224 ;mov di,[es:bx+6] ;AN000; di points to value list - 34225 00004EBA 268A05 mov al,[es:di] ;AN000; get nval - 34226 00004EBD 08C0 or al,al ;AN000; no value list ? - 34227 00004EBF 7502 jnz short $P_Sim00 ;AN000; then - 34228 ; 31/03/2023 - 34229 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set - 34230 00004EC1 EB48 jmp short $P_Sim_Exit ;AN000; and set result buffer - 34231 $P_Sim00: ;AN000; - 34232 00004EC3 3C03 cmp al,$P_nval_String ; 3 ;AN000; String choice list provided ? - 34233 00004EC5 753D jne short $P_Sim01 ;AN000; if no, syntax error - 34234 - 34235 00004EC7 47 inc di ;AN000; - 34236 00004EC8 268A05 mov al,[es:di] ;AN000; al = nrng - 34237 00004ECB B409 mov ah,$P_Len_Range ; 9 ;AN000; - 34238 00004ECD F6E4 mul ah ;AN000; Skip nrng field - 34239 00004ECF 40 inc ax ;AN000; ax = (nrng*9)+1 - 34240 00004ED0 01C7 add di,ax ;AN000; di points to nnval - 34241 00004ED2 268A05 mov al,[es:di] ;AN000; get nnval - 34242 00004ED5 B405 mov ah,$P_Len_Value ; 5 ;AN000; - 34243 00004ED7 F6E4 mul ah ;AN000; Skip nnval field - 34244 00004ED9 40 inc ax ;AN000; ax = (nnval*5)+1 - 34245 00004EDA 01C7 add di,ax ;AN000; di points to nstrval - 34246 00004EDC 268A05 mov al,[es:di] ;AN000; get nstrval - 34247 00004EDF 47 inc di ;AC035; add '2' to - 34248 00004EE0 47 inc di ;AC035; DI reg - 34249 ;AN000; di points to 1st string in list - 34250 $P_Sim_Loop: ;AN000; - 34251 00004EE1 268B2D mov bp,[es:di] ;AN000; get string pointer - 34252 00004EE4 E82F00 call $P_String_Comp ;AN000; compare it with operand - 34253 00004EE7 7310 jnc short $P_Sim_Found ;AN000; found on list ? - 34254 - 34255 00004EE9 83C703 add di,$P_Len_String ; 3 ;AN000; if no, point to next choice - 34256 00004EEC FEC8 dec al ;AN000; loop nstval times in AL - 34257 00004EEE 75F1 jnz short $P_Sim_Loop ;AN000; - 34258 ;AN000; / Not found - 34259 00004EF0 2EC706[BA97]0800 mov word [cs:$P_RC],$P_Not_In_Str - 34260 ;mov [cs:$P_RC],8 ;AC034; - 34261 ; 31/03/2023 - 34262 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set - 34263 00004EF7 EB12 jmp short $P_Sim_Exit ;AN000; - 34264 $P_Sim_Found: ;AN000; - 34265 00004EF9 268A65FF mov ah,[es:di-1] ;AN000; set item_tag - 34266 00004EFD B002 mov al,$P_List_Idx ; 2 ;AN000; - 34267 00004EFF 268B15 mov dx,[es:di] ;AN000; get address of STRING - 34268 00004F02 EB0A jmp short $P_Sim_Exit0 ;AN000; - 34269 $P_Sim01: ;AN000; - 34270 00004F04 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax - 34271 ;mov word [cs:$P_RC],9 ;AC034; - 34272 $P_Sim_Exit: - 34273 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set - 34274 ;$P_Sim_Exit: ;AN000; - 34275 ;mov al,$P_String ; 3 ;AN000; Set type - 34276 ; 31/03/2023 - 34277 00004F0B B803FF mov ax,($P_No_Tag<<8)+$P_String - 34278 $P_Sim_Exit0: ;AN000; - 34279 00004F0E E899FC call $P_Fill_Result ;AN000; - 34280 00004F11 5F pop di ;AN000; - 34281 00004F12 5A pop dx ;AN000; - 34282 00004F13 5B pop bx ;AN000; - 34283 00004F14 58 pop ax ;AN000; - 34284 00004F15 C3 retn ;AN000; - 34285 - 34286 ;*********************************************************************** - 34287 ; $P_String_Comp: - 34288 ; - 34289 ; Function: Compare two string - 34290 ; - 34291 ; Input: psdata_seg:SI -> 1st string - 34292 ; ES:BP -> 2nd string (Must be upper case) - 34293 ; ES:BX -> CONTROL block - 34294 ; - 34295 ; Output: CY = 1 if not match - 34296 ; - 34297 ; Use: $P_Chk_DBCS, $P_Do_CAPS_Char - 34298 ; - 34299 ; Vars: $P_KEYor_SW_Ptr(W), $P_Flags(R). $P_KEYorSW_Ptr - 34300 ;*********************************************************************** - 34301 - 34302 ; 01/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34303 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34304 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34305 $P_String_Comp: - 34306 00004F16 50 push ax ;AN000; - 34307 00004F17 55 push bp ;AN000; - 34308 00004F18 52 push dx ;AN000; - 34309 00004F19 56 push si ;AN000; - 34310 00004F1A B202 mov dl,$P_DOSTBL_Char ; 2 ;AN000; use character case map table - 34311 $P_SCOM_Loop: ;AN000; - 34312 00004F1C 2E8A04 mov al,[cs:si] ;AN000; get command character - 34313 00004F1F E8A004 call $P_Chk_DBCS ;AN000; DBCS ? - 34314 00004F22 723C jc short $P_SCOM00 ;AN000; yes,DBCS - 34315 - 34316 00004F24 E822FE call $P_Do_CAPS_Char ;AN000; else, upper case map before comparison - 34317 - 34318 00004F27 2EF606[C697]08 test byte [cs:$P_Flags2],$P_Key_Cmp ; 8 - 34319 ;AC034; keyword search ? - 34320 00004F2D 740D jz short $P_SCOM04 ;AN000; - 34321 - 34322 ;cmp al,'=' ; 3Dh - 34323 00004F2F 3C3D cmp al,$P_Keyword ;'=' ;AN000; "=" is delimiter - 34324 00004F31 751F jne short $P_SCOM03 ;AN000;IF "=" on command line AND (bp+1=> char after the "=" in synonym list) - 34325 - 34326 00004F33 26807E0100 cmp byte [es:bp+1],$P_NULL ;AN021; at end of keyword string in the control block THEN - 34327 00004F38 7562 jne short $P_SCOM_Differ ;AN021; + 34208 ; Input: psdata_seg:SI -> $P_STRING_BUF + 34209 ; ES:BX -> CONTROL block + 34210 ; + 34211 ; Output: None + 34212 ; + 34213 ; Use: $P_Fill_Result, $P_String_Comp + 34214 ; + 34215 ; Vars: $P_RC(W) + 34216 ;*********************************************************************** + 34217 + 34218 ; 31/03/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34219 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34220 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34221 $P_Simple_String: + 34222 00004EB2 50 push ax ;AN000; + 34223 00004EB3 53 push bx ;AN000; + 34224 00004EB4 52 push dx ;AN000; + 34225 00004EB5 57 push di ;AN000; + 34226 00004EB6 268B7F06 mov di,[es:bx+$P_CONTROL_BLK.$P_Value_List] + 34227 ;mov di,[es:bx+6] ;AN000; di points to value list + 34228 00004EBA 268A05 mov al,[es:di] ;AN000; get nval + 34229 00004EBD 08C0 or al,al ;AN000; no value list ? + 34230 00004EBF 7502 jnz short $P_Sim00 ;AN000; then + 34231 ; 31/03/2023 + 34232 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set + 34233 00004EC1 EB48 jmp short $P_Sim_Exit ;AN000; and set result buffer + 34234 $P_Sim00: ;AN000; + 34235 00004EC3 3C03 cmp al,$P_nval_String ; 3 ;AN000; String choice list provided ? + 34236 00004EC5 753D jne short $P_Sim01 ;AN000; if no, syntax error + 34237 + 34238 00004EC7 47 inc di ;AN000; + 34239 00004EC8 268A05 mov al,[es:di] ;AN000; al = nrng + 34240 00004ECB B409 mov ah,$P_Len_Range ; 9 ;AN000; + 34241 00004ECD F6E4 mul ah ;AN000; Skip nrng field + 34242 00004ECF 40 inc ax ;AN000; ax = (nrng*9)+1 + 34243 00004ED0 01C7 add di,ax ;AN000; di points to nnval + 34244 00004ED2 268A05 mov al,[es:di] ;AN000; get nnval + 34245 00004ED5 B405 mov ah,$P_Len_Value ; 5 ;AN000; + 34246 00004ED7 F6E4 mul ah ;AN000; Skip nnval field + 34247 00004ED9 40 inc ax ;AN000; ax = (nnval*5)+1 + 34248 00004EDA 01C7 add di,ax ;AN000; di points to nstrval + 34249 00004EDC 268A05 mov al,[es:di] ;AN000; get nstrval + 34250 00004EDF 47 inc di ;AC035; add '2' to + 34251 00004EE0 47 inc di ;AC035; DI reg + 34252 ;AN000; di points to 1st string in list + 34253 $P_Sim_Loop: ;AN000; + 34254 00004EE1 268B2D mov bp,[es:di] ;AN000; get string pointer + 34255 00004EE4 E82F00 call $P_String_Comp ;AN000; compare it with operand + 34256 00004EE7 7310 jnc short $P_Sim_Found ;AN000; found on list ? + 34257 + 34258 00004EE9 83C703 add di,$P_Len_String ; 3 ;AN000; if no, point to next choice + 34259 00004EEC FEC8 dec al ;AN000; loop nstval times in AL + 34260 00004EEE 75F1 jnz short $P_Sim_Loop ;AN000; + 34261 ;AN000; / Not found + 34262 00004EF0 2EC706[BA97]0800 mov word [cs:$P_RC],$P_Not_In_Str + 34263 ;mov [cs:$P_RC],8 ;AC034; + 34264 ; 31/03/2023 + 34265 ;mov ah,$P_No_Tag ;AN000; No ITEM_TAG set + 34266 00004EF7 EB12 jmp short $P_Sim_Exit ;AN000; + 34267 $P_Sim_Found: ;AN000; + 34268 00004EF9 268A65FF mov ah,[es:di-1] ;AN000; set item_tag + 34269 00004EFD B002 mov al,$P_List_Idx ; 2 ;AN000; + 34270 00004EFF 268B15 mov dx,[es:di] ;AN000; get address of STRING + 34271 00004F02 EB0A jmp short $P_Sim_Exit0 ;AN000; + 34272 $P_Sim01: ;AN000; + 34273 00004F04 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax + 34274 ;mov word [cs:$P_RC],9 ;AC034; + 34275 $P_Sim_Exit: + 34276 ;mov ah,$P_No_Tag ; 0FFh ;AN000; No ITEM_TAG set + 34277 ;$P_Sim_Exit: ;AN000; + 34278 ;mov al,$P_String ; 3 ;AN000; Set type + 34279 ; 31/03/2023 + 34280 00004F0B B803FF mov ax,($P_No_Tag<<8)+$P_String + 34281 $P_Sim_Exit0: ;AN000; + 34282 00004F0E E899FC call $P_Fill_Result ;AN000; + 34283 00004F11 5F pop di ;AN000; + 34284 00004F12 5A pop dx ;AN000; + 34285 00004F13 5B pop bx ;AN000; + 34286 00004F14 58 pop ax ;AN000; + 34287 00004F15 C3 retn ;AN000; + 34288 + 34289 ;*********************************************************************** + 34290 ; $P_String_Comp: + 34291 ; + 34292 ; Function: Compare two string + 34293 ; + 34294 ; Input: psdata_seg:SI -> 1st string + 34295 ; ES:BP -> 2nd string (Must be upper case) + 34296 ; ES:BX -> CONTROL block + 34297 ; + 34298 ; Output: CY = 1 if not match + 34299 ; + 34300 ; Use: $P_Chk_DBCS, $P_Do_CAPS_Char + 34301 ; + 34302 ; Vars: $P_KEYor_SW_Ptr(W), $P_Flags(R). $P_KEYorSW_Ptr + 34303 ;*********************************************************************** + 34304 + 34305 ; 01/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34306 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34307 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34308 $P_String_Comp: + 34309 00004F16 50 push ax ;AN000; + 34310 00004F17 55 push bp ;AN000; + 34311 00004F18 52 push dx ;AN000; + 34312 00004F19 56 push si ;AN000; + 34313 00004F1A B202 mov dl,$P_DOSTBL_Char ; 2 ;AN000; use character case map table + 34314 $P_SCOM_Loop: ;AN000; + 34315 00004F1C 2E8A04 mov al,[cs:si] ;AN000; get command character + 34316 00004F1F E8A004 call $P_Chk_DBCS ;AN000; DBCS ? + 34317 00004F22 723C jc short $P_SCOM00 ;AN000; yes,DBCS + 34318 + 34319 00004F24 E822FE call $P_Do_CAPS_Char ;AN000; else, upper case map before comparison + 34320 + 34321 00004F27 2EF606[C697]08 test byte [cs:$P_Flags2],$P_Key_Cmp ; 8 + 34322 ;AC034; keyword search ? + 34323 00004F2D 740D jz short $P_SCOM04 ;AN000; + 34324 + 34325 ;cmp al,'=' ; 3Dh + 34326 00004F2F 3C3D cmp al,$P_Keyword ;'=' ;AN000; "=" is delimiter + 34327 00004F31 751F jne short $P_SCOM03 ;AN000;IF "=" on command line AND (bp+1=> char after the "=" in synonym list) 34328 - 34329 00004F3A EB13 jmp short $P_SCOM05 ;AN000; keyword found in synonym list - 34330 - 34331 $P_SCOM04: ;AN000; - 34332 00004F3C 2EF606[C697]10 test byte [cs:$P_Flags2],$P_SW_Cmp ; 10h - 34333 ;AC034; switch search ? - 34334 00004F42 740E jz short $P_SCOM03 ;AN000; - 34335 - 34336 00004F44 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; ":" is delimiter, at end of switch on command line - 34337 00004F46 750A jne short $P_SCOM03 ;AN000; continue compares + 34329 00004F33 26807E0100 cmp byte [es:bp+1],$P_NULL ;AN021; at end of keyword string in the control block THEN + 34330 00004F38 7562 jne short $P_SCOM_Differ ;AN021; + 34331 + 34332 00004F3A EB13 jmp short $P_SCOM05 ;AN000; keyword found in synonym list + 34333 + 34334 $P_SCOM04: ;AN000; + 34335 00004F3C 2EF606[C697]10 test byte [cs:$P_Flags2],$P_SW_Cmp ; 10h + 34336 ;AC034; switch search ? + 34337 00004F42 740E jz short $P_SCOM03 ;AN000; 34338 - 34339 00004F48 26807E0000 cmp byte [es:bp],$P_NULL ;AN021; IF at end of switch on command AND - 34340 00004F4D 754D jne short $P_SCOM_Differ ;AN021; at end of switch string in the control block THEN + 34339 00004F44 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; ":" is delimiter, at end of switch on command line + 34340 00004F46 750A jne short $P_SCOM03 ;AN000; continue compares 34341 - 34342 $P_SCOM05: ;AN000; found a match - 34343 00004F4F 46 inc si ;AN000; si points to just after "=" or ":" - 34344 00004F50 EB58 jmp short $P_SCOM_Same ;AN000; exit - 34345 - 34346 $P_SCOM03: ;AN000; - 34347 00004F52 263A4600 cmp al,[es:bp] ;AN000; compare operand w/ a synonym - 34348 00004F56 751D jne short $P_SCOM_Differ0 ;AN000; if different, check ignore colon option - 34349 - 34350 00004F58 08C0 or al,al ;AN000; end of line - 34351 00004F5A 744E jz short $P_SCOM_Same ;AN000; if so, exit + 34342 00004F48 26807E0000 cmp byte [es:bp],$P_NULL ;AN021; IF at end of switch on command AND + 34343 00004F4D 754D jne short $P_SCOM_Differ ;AN021; at end of switch string in the control block THEN + 34344 + 34345 $P_SCOM05: ;AN000; found a match + 34346 00004F4F 46 inc si ;AN000; si points to just after "=" or ":" + 34347 00004F50 EB58 jmp short $P_SCOM_Same ;AN000; exit + 34348 + 34349 $P_SCOM03: ;AN000; + 34350 00004F52 263A4600 cmp al,[es:bp] ;AN000; compare operand w/ a synonym + 34351 00004F56 751D jne short $P_SCOM_Differ0 ;AN000; if different, check ignore colon option 34352 - 34353 00004F5C 46 inc si ;AN000; update operand pointer - 34354 00004F5D 45 inc bp ;AN000; and synonym pointer - 34355 00004F5E EB13 jmp short $P_SCOM01 ;AN000; loop until NULL or "=" or ":" found in case - 34356 - 34357 $P_SCOM00: ;AN000; Here al is DBCS leading byte - 34358 00004F60 263A4600 cmp al,[es:bp] ;AN000; compare leading byte - 34359 00004F64 7536 jne short $P_SCOM_Differ ;AN000; if not match, say different - 34360 - 34361 00004F66 46 inc si ;AN000; else, load next byte - 34362 00004F67 2E8A04 mov al,[cs:si] ;AN000; and - 34363 00004F6A 45 inc bp ;AN000; - 34364 00004F6B 263A4600 cmp al,[es:bp] ;AN000; compare 2nd byte - 34365 00004F6F 752B jne short $P_SCOM_Differ ;AN000; if not match, say different, too - 34366 - 34367 00004F71 46 inc si ;AN000; else update operand pointer - 34368 00004F72 45 inc bp ;AN000; and synonym pointer - 34369 $P_SCOM01: ;AN000; - 34370 00004F73 EBA7 jmp short $P_SCOM_Loop ;AN000; loop until NULL or "=" or "/" found in case - 34371 - 34372 $P_SCOM_Differ0: ;AN000; - 34373 00004F75 2EF606[C697]40 test byte [cs:$P_Flags2],$P_SW ; 40h - 34374 ;test byte [cs:$P_Flags2],40h ;AC034;(tm10) - 34375 00004F7B 740E jz short $P_not_applicable ;AN000;(tm10) - 34376 - 34377 ;test word [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_colon_is_not_necessary - 34378 ;;test word [es:bx+2],20h ;AN000;(tm10) - 34379 ; 03/04/2023 - 34380 00004F7D 26F6470220 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_colon_is_not_necessary - 34381 00004F82 7407 jz short $P_not_applicable ;AN000;(tm10) - 34382 - 34383 00004F84 26807E0000 cmp byte [es:bp],$P_NULL ;AN000;(tm10) - 34384 00004F89 741F je short $P_SCOM_Same ;AN025;(tm10) + 34353 00004F58 08C0 or al,al ;AN000; end of line + 34354 00004F5A 744E jz short $P_SCOM_Same ;AN000; if so, exit + 34355 + 34356 00004F5C 46 inc si ;AN000; update operand pointer + 34357 00004F5D 45 inc bp ;AN000; and synonym pointer + 34358 00004F5E EB13 jmp short $P_SCOM01 ;AN000; loop until NULL or "=" or ":" found in case + 34359 + 34360 $P_SCOM00: ;AN000; Here al is DBCS leading byte + 34361 00004F60 263A4600 cmp al,[es:bp] ;AN000; compare leading byte + 34362 00004F64 7536 jne short $P_SCOM_Differ ;AN000; if not match, say different + 34363 + 34364 00004F66 46 inc si ;AN000; else, load next byte + 34365 00004F67 2E8A04 mov al,[cs:si] ;AN000; and + 34366 00004F6A 45 inc bp ;AN000; + 34367 00004F6B 263A4600 cmp al,[es:bp] ;AN000; compare 2nd byte + 34368 00004F6F 752B jne short $P_SCOM_Differ ;AN000; if not match, say different, too + 34369 + 34370 00004F71 46 inc si ;AN000; else update operand pointer + 34371 00004F72 45 inc bp ;AN000; and synonym pointer + 34372 $P_SCOM01: ;AN000; + 34373 00004F73 EBA7 jmp short $P_SCOM_Loop ;AN000; loop until NULL or "=" or "/" found in case + 34374 + 34375 $P_SCOM_Differ0: ;AN000; + 34376 00004F75 2EF606[C697]40 test byte [cs:$P_Flags2],$P_SW ; 40h + 34377 ;test byte [cs:$P_Flags2],40h ;AC034;(tm10) + 34378 00004F7B 740E jz short $P_not_applicable ;AN000;(tm10) + 34379 + 34380 ;test word [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_colon_is_not_necessary + 34381 ;;test word [es:bx+2],20h ;AN000;(tm10) + 34382 ; 03/04/2023 + 34383 00004F7D 26F6470220 test byte [es:bx+$P_CONTROL_BLK.$P_Function_Flag],$P_colon_is_not_necessary + 34384 00004F82 7407 jz short $P_not_applicable ;AN000;(tm10) 34385 - 34386 $P_not_applicable: ;AN000;(tm10) - 34387 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon - 34388 ;;test word [es:bx],10h ;AN000; ignore colon option specified ? - 34389 ; 03/04/2023 - 34390 00004F8B 26F60710 test byte [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon - 34391 00004F8F 740B jz short $P_SCOM_Differ ;AN000; if no, say different. - 34392 - 34393 00004F91 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; End up with ":" and - 34394 00004F93 750A jne short $P_SCOM02 ;AN000; subseqently + 34386 00004F84 26807E0000 cmp byte [es:bp],$P_NULL ;AN000;(tm10) + 34387 00004F89 741F je short $P_SCOM_Same ;AN025;(tm10) + 34388 + 34389 $P_not_applicable: ;AN000;(tm10) + 34390 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon + 34391 ;;test word [es:bx],10h ;AN000; ignore colon option specified ? + 34392 ; 03/04/2023 + 34393 00004F8B 26F60710 test byte [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon + 34394 00004F8F 740B jz short $P_SCOM_Differ ;AN000; if no, say different. 34395 - 34396 00004F95 26807E0000 cmp byte [es:bp],$P_NULL ;AN000; NULL ? - 34397 ;jne short $P_SCOM_Differ ;AN000; if no, say different - 34398 ;jmp short $P_SCOM_Same ;AN000; else, say same - 34399 ; 01/04/2023 - 34400 00004F9A 740E je short $P_SCOM_Same - 34401 $P_SCOM_Differ: - 34402 00004F9C F9 stc - 34403 00004F9D EB10 jmp short $P_SCOM_Exit - 34404 - 34405 $P_SCOM02: ;AN000; - 34406 00004F9F 3C00 cmp al,$P_NULL ; 0 ;AN000; end up NULL and : - 34407 00004FA1 75F9 jne short $P_SCOM_Differ ;AN000; - 34408 - 34409 ;cmp byte [es:bp],':' - 34410 00004FA3 26807E003A cmp byte [es:bp],$P_Colon ;AN000; if no, say different - 34411 ;je short $p_SCOM_Same ;AN000; else, say same - 34412 ; 01/04/2023 - 34413 00004FA8 75F2 jne short $P_SCOM_Differ - 34414 ;$P_SCOM_Differ: ;AN000; - 34415 ;stc ;AN000; indicate not found - 34416 ;jmp short $P_SCOM_Exit ;AN000; - 34417 - 34418 $P_SCOM_Same: ;AN000; - 34419 00004FAA 2E8936[C997] mov [cs:$P_KEYorSW_Ptr],si ;AC034; for later use by keyword or switch - 34420 ; 01/04/2023 - 34421 ;clc - 34422 ; cf = 0 ;AN000; indicate found - 34423 $P_SCOM_Exit: ;AN000; - 34424 00004FAF 5E pop si ;AN000; - 34425 00004FB0 5A pop dx ;AN000; - 34426 00004FB1 5D pop bp ;AN000; - 34427 00004FB2 58 pop ax ;AN000; - 34428 00004FB3 C3 retn ;AN000; - 34429 - 34430 ;*********************************************************************** - 34431 ; $P_Date_Format - 34432 ; - 34433 ; Function: Convert a date string to DOS date format for int 21h - 34434 ; with format validation. + 34396 00004F91 3C3A cmp al,$P_Colon ; ':' ; 3Ah ;AN000; End up with ":" and + 34397 00004F93 750A jne short $P_SCOM02 ;AN000; subseqently + 34398 + 34399 00004F95 26807E0000 cmp byte [es:bp],$P_NULL ;AN000; NULL ? + 34400 ;jne short $P_SCOM_Differ ;AN000; if no, say different + 34401 ;jmp short $P_SCOM_Same ;AN000; else, say same + 34402 ; 01/04/2023 + 34403 00004F9A 740E je short $P_SCOM_Same + 34404 $P_SCOM_Differ: + 34405 00004F9C F9 stc + 34406 00004F9D EB10 jmp short $P_SCOM_Exit + 34407 + 34408 $P_SCOM02: ;AN000; + 34409 00004F9F 3C00 cmp al,$P_NULL ; 0 ;AN000; end up NULL and : + 34410 00004FA1 75F9 jne short $P_SCOM_Differ ;AN000; + 34411 + 34412 ;cmp byte [es:bp],':' + 34413 00004FA3 26807E003A cmp byte [es:bp],$P_Colon ;AN000; if no, say different + 34414 ;je short $p_SCOM_Same ;AN000; else, say same + 34415 ; 01/04/2023 + 34416 00004FA8 75F2 jne short $P_SCOM_Differ + 34417 ;$P_SCOM_Differ: ;AN000; + 34418 ;stc ;AN000; indicate not found + 34419 ;jmp short $P_SCOM_Exit ;AN000; + 34420 + 34421 $P_SCOM_Same: ;AN000; + 34422 00004FAA 2E8936[C997] mov [cs:$P_KEYorSW_Ptr],si ;AC034; for later use by keyword or switch + 34423 ; 01/04/2023 + 34424 ;clc + 34425 ; cf = 0 ;AN000; indicate found + 34426 $P_SCOM_Exit: ;AN000; + 34427 00004FAF 5E pop si ;AN000; + 34428 00004FB0 5A pop dx ;AN000; + 34429 00004FB1 5D pop bp ;AN000; + 34430 00004FB2 58 pop ax ;AN000; + 34431 00004FB3 C3 retn ;AN000; + 34432 + 34433 ;*********************************************************************** + 34434 ; $P_Date_Format 34435 ; - 34436 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34437 ; ES:BX -> CONTROL block + 34436 ; Function: Convert a date string to DOS date format for int 21h + 34437 ; with format validation. 34438 ; - 34439 ; Output: None - 34440 ; - 34441 ; Use: $P_Fill_Result, $P_Set_CDI, $P_Get_DecNum - 34442 ; - 34443 ; Vars: $P_RC(W), $P_1st_Val(RW), $P_2nd_Val(RW), $P_3rd_Val(RW) - 34444 ;*********************************************************************** - 34445 - 34446 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34447 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34448 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34449 $P_Date_Format: - 34450 00004FB4 50 push ax ;AN000; - 34451 00004FB5 51 push cx ;AN000; - 34452 00004FB6 52 push dx ;AN000; - 34453 00004FB7 56 push si ;AN000; - 34454 00004FB8 53 push bx ;AN000; - 34455 00004FB9 56 push si ;AN000; - 34456 00004FBA E8AA00 call $P_Set_CDI ;AN000; set country dependent information before process - 34457 - 34458 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 34459 %if 0 - 34460 ; 03/04/2023 - 34461 ;pop si ;AN000; - 34462 ;mov word [cs:$P_1st_Val],0 ;AC034; set initial value - 34463 ;mov word [cs:$P_2nd_Val],0 ;AC034; set initial value - 34464 ;mov word [cs:$P_3rd_Val],0 ;AC034; set initial value - 34465 xor si,si - 34466 mov [cs:$P_1st_Val],si ; 0 ;AC034; set initial value - 34467 mov [cs:$P_2nd_Val],si ; 0 ;AC034; set initial value - 34468 ; 11/08/2024 - 34469 mov [cs:$P_3rd_Val],si ; 0 ;AC034; set initial value - 34470 pop si - 34471 %else - 34472 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 34473 00004FBD 5E pop si - 34474 00004FBE B8FFFF mov ax,0FFFFh ; -1 - 34475 00004FC1 2EA3[7898] mov [cs:$P_1st_Val],ax ; -1 ; set initial value - 34476 00004FC5 2EA3[7A98] mov [cs:$P_2nd_Val],ax ; -1 ; set initial value - 34477 00004FC9 2EA3[7C98] mov [cs:$P_3rd_Val],ax ; -1 ; set initial value - 34478 %endif - 34479 00004FCD E8B100 call $P_Get_DecNum ;AN000; get 1st number - 34480 ;jc short $P_DateF_Err0 ;AN000;-----------------------+ - 34481 ; 11/08/2024 - 34482 00004FD0 724E jc short $P_DateF_Error ; ----------------------------+ - 34483 00004FD2 2EA3[7898] mov [cs:$P_1st_Val],ax ;AC034; | - 34484 00004FD6 08DB or bl,bl ;AN000; end of line ? | - 34485 00004FD8 741A jz short $P_DateF_YMD ;AN000; | - 34486 00004FDA E8A400 call $P_Get_DecNum ;AN000; get 2nd number | - 34487 00004FDD 7241 jc short $P_DateF_Error ;AN000; | - 34488 00004FDF 2EA3[7A98] mov [cs:$P_2nd_Val],ax ;AC034; | - 34489 00004FE3 08DB or bl,bl ;AN000; end of line ? | - 34490 00004FE5 740D jz short $P_DateF_YMD ;AN000; | - 34491 00004FE7 E89700 call $P_Get_DecNum ;AN000; get 3rd number | - 34492 $P_DateF_Err0: ;AN000; Bridge <-----------+ - 34493 00004FEA 7234 jc short $P_DateF_Error ;AN000; - 34494 00004FEC 2EA3[7C98] mov [cs:$P_3rd_Val],ax ;AC034; - 34495 00004FF0 08DB or bl,bl ;AN000; end of line ? - 34496 00004FF2 752C jnz short $P_DateF_Error ;AN000; - 34497 $P_DateF_YMD: ;AN000; - 34498 00004FF4 2E8B1E[5698] mov bx,[cs:$P_Country_Info+$P_CDI.$P_CDI_DateF] - 34499 ;mov bx,[cs:$P_Country_Info] ;AC034; get date format - 34500 00004FF9 83FB02 cmp bx,$P_Date_YMD ; 2 ;AN000; - 34501 00004FFC 7435 je short $P_DateF00 ;AN000; - 34502 00004FFE 2EA1[7898] mov ax,[cs:$P_1st_Val] ;AC034; - 34503 00005002 08E4 or ah,ah ;AN000; - 34504 00005004 751A jnz short $P_DateF_Error ;AN000; - 34505 00005006 88C1 mov cl,al ;AN000; set month - 34506 00005008 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; - 34507 0000500C 08E4 or ah,ah ;AN000; if overflow, error. - 34508 0000500E 7510 jnz short $P_DateF_Error ;AN000; - 34509 00005010 88C5 mov ch,al ;AN000; set date - 34510 00005012 2E8B16[7C98] mov dx,[cs:$P_3rd_Val] ;AC034; set year - 34511 00005017 83FB01 cmp bx,$P_Date_DMY ; 1 ;AN000; from here format = MDY - 34512 0000501A 7502 jne short $P_DateF01 ;AN000; if it is DMY - 34513 0000501C 86E9 xchg ch,cl ;AN000; then swap M <-> D - 34514 $P_DateF01: ;AN000; - 34515 0000501E EB2C jmp short $P_DateF02 ;AN000; - 34516 - 34517 $P_DateF_Error: ;AN000; - 34518 00005020 5B pop bx ;AN000; recover CONTROL block - 34519 00005021 5E pop si ;AN000; recover string pointer - 34520 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set - 34521 ;mov al,$P_String ; 3 ;AN000; result - 34522 ; 03/04/2023 - 34523 00005022 B803FF mov ax,($P_No_Tag<<8)+$P_String - 34524 00005025 E882FB call $P_Fill_Result ;AN000; buffer - 34525 ;AN000; to string - 34526 00005028 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 - 34527 ;AC034; indicate syntax error - 34528 $P_Date_Format_Exit: ;AN000; - 34529 0000502F 5A pop dx ;AN000; - 34530 00005030 59 pop cx ;AN000; - 34531 00005031 58 pop ax ;AN000; - 34532 00005032 C3 retn ;AN000; - 34533 - 34534 $P_DateF00: ;AN000; / here format = YMD - 34535 00005033 2E8B16[7898] mov dx,[cs:$P_1st_Val] ;AC034; set year - 34536 00005038 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; - 34537 0000503C 08E4 or ah,ah ;AN000; if overflow, error - 34538 0000503E 75E0 jnz short $P_DateF_Error ;AN000; - 34539 - 34540 00005040 88C1 mov cl,al ;AN000; set month - 34541 00005042 2EA1[7C98] mov ax,[cs:$P_3rd_Val] ;AC034; - 34542 00005046 08E4 or ah,ah ;AN000; if overflow, error - 34543 00005048 75D6 jnz short $P_DateF_Error ;AN000; - 34544 0000504A 88C5 mov ch,al ;AN000; set date - 34545 $P_DateF02: ;AN000; - 34546 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 34547 %if 0 - 34548 cmp dx,100 ;AN000; year is less that 100 ? - 34549 jae short $P_DateF03 ;AN000; - 34550 add dx,1900 ;AN000; set year 19xx - 34551 %else - 34552 0000504C 83FA64 cmp dx,100 - 34553 0000504F 730C jnb short $P_DateF03 - 34554 00005051 83FA50 cmp dx,80 - 34555 00005054 7303 jnb short $P_DateF02_@ - 34556 00005056 83C264 add dx,100 - 34557 $P_DateF02_@: - 34558 00005059 81C26C07 add dx,1900 - 34559 %endif - 34560 $P_DateF03: ;AN000; - 34561 0000505D 5B pop bx ;AN000; recover CONTROL block - 34562 0000505E 5E pop si ;AN000; recover string pointer - 34563 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set - 34564 ;mov al,$P_Date_F ; 7 ;AN000; result - 34565 ; 03/04/2023 - 34566 0000505F B807FF mov ax,($P_No_Tag<<8)+$P_Date_F - 34567 00005062 E845FB call $P_Fill_Result ;AN000; buffer - 34568 00005065 EBC8 jmp short $P_Date_Format_Exit - 34569 ;AN000; to Date - 34570 - 34571 ;*********************************************************************** - 34572 ; $P_Set_CDI: - 34573 ; - 34574 ; Function: Read CDI from DOS if it has not been read yet - 34575 ; - 34576 ; Input: None - 34577 ; - 34578 ; Output: psdata_seg:SI -> CDI - 34579 ; - 34580 ; Use: INT 21h w/ AH = 38h - 34581 ;*********************************************************************** - 34582 - 34583 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34584 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34585 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34586 $P_Set_CDI: - 34587 ; 18/04/2023 - 34588 00005067 8D36[5698] lea si,$P_Country_Info ;AC034; - 34589 ;cmp word [cs:si+$P_CDI.$P_CDI_DateF],-1 ; $P_NeedToBeRead - 34590 0000506B 2E833CFF cmp word [cs:si],-1 ; $P_NeedToBeRead ; 0FFFFh - 34591 ;AN000; already read ? - 34592 ;je short $P_Read_CDI ;AN000; - 34593 ;jmp short $P_Set_CDI_Exit ;AN000; then do nothing - 34594 ; 03/04/2023 - 34595 0000506F 750F jne short $P_Set_CDI_Exit - 34596 $P_Read_CDI: ;AN000; else read CDI thru DOS - 34597 00005071 1E push ds ;AN000; - 34598 00005072 52 push dx ;AN000; - 34599 00005073 50 push ax ;AN000; - 34600 00005074 0E push cs ;AC023; - 34601 00005075 1F pop ds ;AN000; set segment register - 34602 ;mov ax,3800h - 34603 00005076 B80038 mov ax,$P_DOS_Get_CDI ;AN000; get country information - 34604 00005079 89F2 mov dx,si ;AN000; set offset of CDI in local data area - 34605 0000507B CD21 int 21h ;AN000; - 34606 0000507D 58 pop ax ;AN000; - 34607 0000507E 5A pop dx ;AN000; - 34608 0000507F 1F pop ds ;AN000; - 34609 $P_Set_CDI_Exit: ;AN000; - 34610 00005080 C3 retn ;AN000; - 34611 - 34612 ;*********************************************************************** - 34613 ; $P_Get_DecNum: - 34614 ; - 34615 ; Function: Read a character code from psdata_seg:SI until specified delimiter - 34616 ; or NULL encountered. And make a decimal number. + 34439 ; Input: psdata_seg:SI -> $P_STRING_BUF + 34440 ; ES:BX -> CONTROL block + 34441 ; + 34442 ; Output: None + 34443 ; + 34444 ; Use: $P_Fill_Result, $P_Set_CDI, $P_Get_DecNum + 34445 ; + 34446 ; Vars: $P_RC(W), $P_1st_Val(RW), $P_2nd_Val(RW), $P_3rd_Val(RW) + 34447 ;*********************************************************************** + 34448 + 34449 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34450 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34451 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34452 $P_Date_Format: + 34453 00004FB4 50 push ax ;AN000; + 34454 00004FB5 51 push cx ;AN000; + 34455 00004FB6 52 push dx ;AN000; + 34456 00004FB7 56 push si ;AN000; + 34457 00004FB8 53 push bx ;AN000; + 34458 00004FB9 56 push si ;AN000; + 34459 00004FBA E8AA00 call $P_Set_CDI ;AN000; set country dependent information before process + 34460 + 34461 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 34462 %if 0 + 34463 ; 03/04/2023 + 34464 ;pop si ;AN000; + 34465 ;mov word [cs:$P_1st_Val],0 ;AC034; set initial value + 34466 ;mov word [cs:$P_2nd_Val],0 ;AC034; set initial value + 34467 ;mov word [cs:$P_3rd_Val],0 ;AC034; set initial value + 34468 xor si,si + 34469 mov [cs:$P_1st_Val],si ; 0 ;AC034; set initial value + 34470 mov [cs:$P_2nd_Val],si ; 0 ;AC034; set initial value + 34471 ; 11/08/2024 + 34472 mov [cs:$P_3rd_Val],si ; 0 ;AC034; set initial value + 34473 pop si + 34474 %else + 34475 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 34476 00004FBD 5E pop si + 34477 00004FBE B8FFFF mov ax,0FFFFh ; -1 + 34478 00004FC1 2EA3[7898] mov [cs:$P_1st_Val],ax ; -1 ; set initial value + 34479 00004FC5 2EA3[7A98] mov [cs:$P_2nd_Val],ax ; -1 ; set initial value + 34480 00004FC9 2EA3[7C98] mov [cs:$P_3rd_Val],ax ; -1 ; set initial value + 34481 %endif + 34482 00004FCD E8B100 call $P_Get_DecNum ;AN000; get 1st number + 34483 ;jc short $P_DateF_Err0 ;AN000;-----------------------+ + 34484 ; 11/08/2024 + 34485 00004FD0 724E jc short $P_DateF_Error ; ----------------------------+ + 34486 00004FD2 2EA3[7898] mov [cs:$P_1st_Val],ax ;AC034; | + 34487 00004FD6 08DB or bl,bl ;AN000; end of line ? | + 34488 00004FD8 741A jz short $P_DateF_YMD ;AN000; | + 34489 00004FDA E8A400 call $P_Get_DecNum ;AN000; get 2nd number | + 34490 00004FDD 7241 jc short $P_DateF_Error ;AN000; | + 34491 00004FDF 2EA3[7A98] mov [cs:$P_2nd_Val],ax ;AC034; | + 34492 00004FE3 08DB or bl,bl ;AN000; end of line ? | + 34493 00004FE5 740D jz short $P_DateF_YMD ;AN000; | + 34494 00004FE7 E89700 call $P_Get_DecNum ;AN000; get 3rd number | + 34495 $P_DateF_Err0: ;AN000; Bridge <-----------+ + 34496 00004FEA 7234 jc short $P_DateF_Error ;AN000; + 34497 00004FEC 2EA3[7C98] mov [cs:$P_3rd_Val],ax ;AC034; + 34498 00004FF0 08DB or bl,bl ;AN000; end of line ? + 34499 00004FF2 752C jnz short $P_DateF_Error ;AN000; + 34500 $P_DateF_YMD: ;AN000; + 34501 00004FF4 2E8B1E[5698] mov bx,[cs:$P_Country_Info+$P_CDI.$P_CDI_DateF] + 34502 ;mov bx,[cs:$P_Country_Info] ;AC034; get date format + 34503 00004FF9 83FB02 cmp bx,$P_Date_YMD ; 2 ;AN000; + 34504 00004FFC 7435 je short $P_DateF00 ;AN000; + 34505 00004FFE 2EA1[7898] mov ax,[cs:$P_1st_Val] ;AC034; + 34506 00005002 08E4 or ah,ah ;AN000; + 34507 00005004 751A jnz short $P_DateF_Error ;AN000; + 34508 00005006 88C1 mov cl,al ;AN000; set month + 34509 00005008 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; + 34510 0000500C 08E4 or ah,ah ;AN000; if overflow, error. + 34511 0000500E 7510 jnz short $P_DateF_Error ;AN000; + 34512 00005010 88C5 mov ch,al ;AN000; set date + 34513 00005012 2E8B16[7C98] mov dx,[cs:$P_3rd_Val] ;AC034; set year + 34514 00005017 83FB01 cmp bx,$P_Date_DMY ; 1 ;AN000; from here format = MDY + 34515 0000501A 7502 jne short $P_DateF01 ;AN000; if it is DMY + 34516 0000501C 86E9 xchg ch,cl ;AN000; then swap M <-> D + 34517 $P_DateF01: ;AN000; + 34518 0000501E EB2C jmp short $P_DateF02 ;AN000; + 34519 + 34520 $P_DateF_Error: ;AN000; + 34521 00005020 5B pop bx ;AN000; recover CONTROL block + 34522 00005021 5E pop si ;AN000; recover string pointer + 34523 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set + 34524 ;mov al,$P_String ; 3 ;AN000; result + 34525 ; 03/04/2023 + 34526 00005022 B803FF mov ax,($P_No_Tag<<8)+$P_String + 34527 00005025 E882FB call $P_Fill_Result ;AN000; buffer + 34528 ;AN000; to string + 34529 00005028 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 + 34530 ;AC034; indicate syntax error + 34531 $P_Date_Format_Exit: ;AN000; + 34532 0000502F 5A pop dx ;AN000; + 34533 00005030 59 pop cx ;AN000; + 34534 00005031 58 pop ax ;AN000; + 34535 00005032 C3 retn ;AN000; + 34536 + 34537 $P_DateF00: ;AN000; / here format = YMD + 34538 00005033 2E8B16[7898] mov dx,[cs:$P_1st_Val] ;AC034; set year + 34539 00005038 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; + 34540 0000503C 08E4 or ah,ah ;AN000; if overflow, error + 34541 0000503E 75E0 jnz short $P_DateF_Error ;AN000; + 34542 + 34543 00005040 88C1 mov cl,al ;AN000; set month + 34544 00005042 2EA1[7C98] mov ax,[cs:$P_3rd_Val] ;AC034; + 34545 00005046 08E4 or ah,ah ;AN000; if overflow, error + 34546 00005048 75D6 jnz short $P_DateF_Error ;AN000; + 34547 0000504A 88C5 mov ch,al ;AN000; set date + 34548 $P_DateF02: ;AN000; + 34549 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 34550 %if 0 + 34551 cmp dx,100 ;AN000; year is less that 100 ? + 34552 jae short $P_DateF03 ;AN000; + 34553 add dx,1900 ;AN000; set year 19xx + 34554 %else + 34555 0000504C 83FA64 cmp dx,100 + 34556 0000504F 730C jnb short $P_DateF03 + 34557 00005051 83FA50 cmp dx,80 + 34558 00005054 7303 jnb short $P_DateF02_@ + 34559 00005056 83C264 add dx,100 + 34560 $P_DateF02_@: + 34561 00005059 81C26C07 add dx,1900 + 34562 %endif + 34563 $P_DateF03: ;AN000; + 34564 0000505D 5B pop bx ;AN000; recover CONTROL block + 34565 0000505E 5E pop si ;AN000; recover string pointer + 34566 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set + 34567 ;mov al,$P_Date_F ; 7 ;AN000; result + 34568 ; 03/04/2023 + 34569 0000505F B807FF mov ax,($P_No_Tag<<8)+$P_Date_F + 34570 00005062 E845FB call $P_Fill_Result ;AN000; buffer + 34571 00005065 EBC8 jmp short $P_Date_Format_Exit + 34572 ;AN000; to Date + 34573 + 34574 ;*********************************************************************** + 34575 ; $P_Set_CDI: + 34576 ; + 34577 ; Function: Read CDI from DOS if it has not been read yet + 34578 ; + 34579 ; Input: None + 34580 ; + 34581 ; Output: psdata_seg:SI -> CDI + 34582 ; + 34583 ; Use: INT 21h w/ AH = 38h + 34584 ;*********************************************************************** + 34585 + 34586 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34587 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34588 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34589 $P_Set_CDI: + 34590 ; 18/04/2023 + 34591 00005067 8D36[5698] lea si,$P_Country_Info ;AC034; + 34592 ;cmp word [cs:si+$P_CDI.$P_CDI_DateF],-1 ; $P_NeedToBeRead + 34593 0000506B 2E833CFF cmp word [cs:si],-1 ; $P_NeedToBeRead ; 0FFFFh + 34594 ;AN000; already read ? + 34595 ;je short $P_Read_CDI ;AN000; + 34596 ;jmp short $P_Set_CDI_Exit ;AN000; then do nothing + 34597 ; 03/04/2023 + 34598 0000506F 750F jne short $P_Set_CDI_Exit + 34599 $P_Read_CDI: ;AN000; else read CDI thru DOS + 34600 00005071 1E push ds ;AN000; + 34601 00005072 52 push dx ;AN000; + 34602 00005073 50 push ax ;AN000; + 34603 00005074 0E push cs ;AC023; + 34604 00005075 1F pop ds ;AN000; set segment register + 34605 ;mov ax,3800h + 34606 00005076 B80038 mov ax,$P_DOS_Get_CDI ;AN000; get country information + 34607 00005079 89F2 mov dx,si ;AN000; set offset of CDI in local data area + 34608 0000507B CD21 int 21h ;AN000; + 34609 0000507D 58 pop ax ;AN000; + 34610 0000507E 5A pop dx ;AN000; + 34611 0000507F 1F pop ds ;AN000; + 34612 $P_Set_CDI_Exit: ;AN000; + 34613 00005080 C3 retn ;AN000; + 34614 + 34615 ;*********************************************************************** + 34616 ; $P_Get_DecNum: 34617 ; - 34618 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34619 ; - 34620 ; Output: BL = delimiter code or NULL - 34621 ; AX = Decimal number - 34622 ; SI advanced to the next number - 34623 ; CY = 1 : Syntax error, AL = Latest examineed number - 34624 ; - 34625 ; Use: $P_0099 - 34626 ;*********************************************************************** - 34627 - 34628 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34629 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34630 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM - 34631 $P_Get_DecNum: - 34632 00005081 51 push cx ;AN000; - 34633 00005082 52 push dx ;AN000; - 34634 00005083 31C9 xor cx,cx ;AN000; cx will have final value - 34635 $P_GetNum_Loop: ;AN000; - 34636 00005085 2E8A04 mov al,[cs:si] ;AN000; load character - 34637 00005088 08C0 or al,al ;AN000; end of line ? - 34638 0000508A 7438 jz short $P_GetNum00 ;AN000; if yes, exit - 34639 0000508C 2E803E[5598]00 cmp byte [cs:$P_Got_Time],0 ;AC034; is this numeric in a time field? ;AC023 - 34640 00005092 740B je short $P_Do_Date_Delims ;AN000; no, go check out Date delimiters ;AC023 - 34641 - 34642 ; Determine which delimiter(s) to check for. Colon & period or period only - 34643 ;cmp bl,$P_colon_period - 34644 00005094 80FB01 cmp bl,1 ; $P_colon_period ;AN032; ;Time - 34645 00005097 750E jne short $P_Do_Time_Delim1 ;AN032; ;only check for period - 34646 - 34647 00005099 3C3A cmp al,$P_Colon ; ':' ;AN032; ;Is this a valid delimiter ? - 34648 0000509B 742B je short $P_GetNum01 ;AN032; ;yes, exit + 34618 ; Function: Read a character code from psdata_seg:SI until specified delimiter + 34619 ; or NULL encountered. And make a decimal number. + 34620 ; + 34621 ; Input: psdata_seg:SI -> $P_STRING_BUF + 34622 ; + 34623 ; Output: BL = delimiter code or NULL + 34624 ; AX = Decimal number + 34625 ; SI advanced to the next number + 34626 ; CY = 1 : Syntax error, AL = Latest examineed number + 34627 ; + 34628 ; Use: $P_0099 + 34629 ;*********************************************************************** + 34630 + 34631 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34632 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34633 ; 11/08/2024 - Retro DOS v5.0 COMMAND.COM + 34634 $P_Get_DecNum: + 34635 00005081 51 push cx ;AN000; + 34636 00005082 52 push dx ;AN000; + 34637 00005083 31C9 xor cx,cx ;AN000; cx will have final value + 34638 $P_GetNum_Loop: ;AN000; + 34639 00005085 2E8A04 mov al,[cs:si] ;AN000; load character + 34640 00005088 08C0 or al,al ;AN000; end of line ? + 34641 0000508A 7438 jz short $P_GetNum00 ;AN000; if yes, exit + 34642 0000508C 2E803E[5598]00 cmp byte [cs:$P_Got_Time],0 ;AC034; is this numeric in a time field? ;AC023 + 34643 00005092 740B je short $P_Do_Date_Delims ;AN000; no, go check out Date delimiters ;AC023 + 34644 + 34645 ; Determine which delimiter(s) to check for. Colon & period or period only + 34646 ;cmp bl,$P_colon_period + 34647 00005094 80FB01 cmp bl,1 ; $P_colon_period ;AN032; ;Time + 34648 00005097 750E jne short $P_Do_Time_Delim1 ;AN032; ;only check for period 34649 - 34650 ; 03/04/2023 - 34651 0000509D EB08 jmp short $P_Do_Time_Delim1 - 34652 ;$P_Do_Time_Delim1: ;AN000; - 34653 ;cmp al,$P_Period ; '.' ;;AC032;;AC023;Is this a valid delimiter ? - 34654 ;je short $P_GetNum01 ;AC023; yes, exit - 34655 ; - 34656 ;jmp short $P_Neither_Delims ;AN023; - 34657 - 34658 $P_Do_Date_Delims: ;AN000; - 34659 ;Regardless of the date delimiter character specified in the country - 34660 ;dependent information, check for the presence of any one of these - 34661 ;three field delimiters: "-", "/", or ".". - 34662 0000509F 3C2D cmp al,$P_Minus ;'-' ;AN020;is this a date delimiter character? - 34663 000050A1 7425 je short $P_GetNum01 ;AN020;if yes, exit - 34664 - 34665 000050A3 3C2F cmp al,$P_Slash ; '/' ;AN020;is this a date delimiter character? - 34666 000050A5 7421 je short $P_GetNum01 ;AN020;if yes, exit + 34650 00005099 3C3A cmp al,$P_Colon ; ':' ;AN032; ;Is this a valid delimiter ? + 34651 0000509B 742B je short $P_GetNum01 ;AN032; ;yes, exit + 34652 + 34653 ; 03/04/2023 + 34654 0000509D EB08 jmp short $P_Do_Time_Delim1 + 34655 ;$P_Do_Time_Delim1: ;AN000; + 34656 ;cmp al,$P_Period ; '.' ;;AC032;;AC023;Is this a valid delimiter ? + 34657 ;je short $P_GetNum01 ;AC023; yes, exit + 34658 ; + 34659 ;jmp short $P_Neither_Delims ;AN023; + 34660 + 34661 $P_Do_Date_Delims: ;AN000; + 34662 ;Regardless of the date delimiter character specified in the country + 34663 ;dependent information, check for the presence of any one of these + 34664 ;three field delimiters: "-", "/", or ".". + 34665 0000509F 3C2D cmp al,$P_Minus ;'-' ;AN020;is this a date delimiter character? + 34666 000050A1 7425 je short $P_GetNum01 ;AN020;if yes, exit 34667 - 34668 $P_Do_Time_Delim1: ; 03/04/2023 - 34669 000050A7 3C2E cmp al,$P_Period ; '.' ;AN020;is this a date delimiter character? - 34670 000050A9 741D je short $P_GetNum01 ;AN000; if yes, exit - 34671 - 34672 $P_Neither_Delims: ;AN023; - 34673 000050AB E8F9FD call $P_0099 ;AN000; convert it to binary - 34674 000050AE 721C jc short $P_GetNum_Exit ;AN000; if error exit - 34675 - 34676 000050B0 B400 mov ah,0 ;AN000; - 34677 000050B2 91 xchg ax,cx ;AN000; - 34678 000050B3 BA0A00 mov dx,10 ;AN000; - 34679 000050B6 F7E2 mul dx ;AN000; ax = ax * 10 - 34680 000050B8 09D2 or dx,dx ;AN000; overflow - 34681 000050BA 750F jnz short $P_GetNum02 ;AN000; then exit - 34682 - 34683 000050BC 01C8 add ax,cx ;AN000; - 34684 000050BE 720C jc short $P_GetNum_Exit ;AN000; + 34668 000050A3 3C2F cmp al,$P_Slash ; '/' ;AN020;is this a date delimiter character? + 34669 000050A5 7421 je short $P_GetNum01 ;AN020;if yes, exit + 34670 + 34671 $P_Do_Time_Delim1: ; 03/04/2023 + 34672 000050A7 3C2E cmp al,$P_Period ; '.' ;AN020;is this a date delimiter character? + 34673 000050A9 741D je short $P_GetNum01 ;AN000; if yes, exit + 34674 + 34675 $P_Neither_Delims: ;AN023; + 34676 000050AB E8F9FD call $P_0099 ;AN000; convert it to binary + 34677 000050AE 721C jc short $P_GetNum_Exit ;AN000; if error exit + 34678 + 34679 000050B0 B400 mov ah,0 ;AN000; + 34680 000050B2 91 xchg ax,cx ;AN000; + 34681 000050B3 BA0A00 mov dx,10 ;AN000; + 34682 000050B6 F7E2 mul dx ;AN000; ax = ax * 10 + 34683 000050B8 09D2 or dx,dx ;AN000; overflow + 34684 000050BA 750F jnz short $P_GetNum02 ;AN000; then exit 34685 - 34686 000050C0 91 xchg ax,cx ;AN000; - 34687 000050C1 46 inc si ;AN000; - 34688 000050C2 EBC1 jmp short $P_GetNum_Loop ;AN000; - 34689 - 34690 $P_GetNum00: ;AN000; - 34691 000050C4 88C3 mov bl,al ;AN000; set bl to NULL - 34692 ;03/04/2023 - 34693 ; cf=0 - 34694 ;clc ;AN000; indicate no error - 34695 000050C6 EB04 jmp short $P_GetNum_Exit ;AN000; - 34696 - 34697 $P_GetNum01: ;AN000; - 34698 000050C8 46 inc si ;AN000; si points to next number - 34699 ;03/04/2023 - 34700 ; cf=0 - 34701 ;clc ;AN000; indicate no error - 34702 000050C9 EB01 jmp short $P_GetNum_Exit ;AN000; - 34703 - 34704 $P_GetNum02: ;AN000; - 34705 000050CB F9 stc ;AN000; indicate error - 34706 $P_GetNum_Exit: ;AN000; - 34707 000050CC 89C8 mov ax,cx ;AN000;return value - 34708 000050CE 5A pop dx ;AN000; - 34709 000050CF 59 pop cx ;AN000; - 34710 000050D0 C3 retn ;AN000; - 34711 - 34712 ;*********************************************************************** - 34713 ; $P_Time_Format - 34714 ; - 34715 ; Function: Convert a time string to DOS time format for int 21h - 34716 ; with format validation. + 34686 000050BC 01C8 add ax,cx ;AN000; + 34687 000050BE 720C jc short $P_GetNum_Exit ;AN000; + 34688 + 34689 000050C0 91 xchg ax,cx ;AN000; + 34690 000050C1 46 inc si ;AN000; + 34691 000050C2 EBC1 jmp short $P_GetNum_Loop ;AN000; + 34692 + 34693 $P_GetNum00: ;AN000; + 34694 000050C4 88C3 mov bl,al ;AN000; set bl to NULL + 34695 ;03/04/2023 + 34696 ; cf=0 + 34697 ;clc ;AN000; indicate no error + 34698 000050C6 EB04 jmp short $P_GetNum_Exit ;AN000; + 34699 + 34700 $P_GetNum01: ;AN000; + 34701 000050C8 46 inc si ;AN000; si points to next number + 34702 ;03/04/2023 + 34703 ; cf=0 + 34704 ;clc ;AN000; indicate no error + 34705 000050C9 EB01 jmp short $P_GetNum_Exit ;AN000; + 34706 + 34707 $P_GetNum02: ;AN000; + 34708 000050CB F9 stc ;AN000; indicate error + 34709 $P_GetNum_Exit: ;AN000; + 34710 000050CC 89C8 mov ax,cx ;AN000;return value + 34711 000050CE 5A pop dx ;AN000; + 34712 000050CF 59 pop cx ;AN000; + 34713 000050D0 C3 retn ;AN000; + 34714 + 34715 ;*********************************************************************** + 34716 ; $P_Time_Format 34717 ; - 34718 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34719 ; ES:BX -> CONTROL block + 34718 ; Function: Convert a time string to DOS time format for int 21h + 34719 ; with format validation. 34720 ; - 34721 ; Output: None - 34722 ; - 34723 ; Use: $P_Fill_Result, $P_Set_CDI, $P_Get_DecNum, $P_Time_2412 - 34724 ; - 34725 ; Vars: $P_RC(W), $P_Flags(R), $P_1st_Val(RW), $P_2nd_Val(RW) - 34726 ; $P_3rd_Val(RW), $P_4th_Val(RW) - 34727 ;*********************************************************************** - 34728 - 34729 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34730 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34731 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 34732 $P_Time_Format: ;AN000; - 34733 000050D1 50 push ax ;AN000; - 34734 000050D2 51 push cx ;AN000; - 34735 000050D3 52 push dx ;AN000; - 34736 000050D4 56 push si ;AN000; - 34737 000050D5 53 push bx ;AN000; - 34738 000050D6 56 push si ;AN000; - 34739 000050D7 E88DFF call $P_Set_CDI ;AN000; Set country independent - 34740 ; information before process - 34741 ;test byte [cs:si+11h], 1 - 34742 000050DA 2EF6441001 test byte [cs:si+$P_CDI.$P_CDI_TimeF],1 - 34743 ;AN000; 24 hour system - 34744 000050DF 5E pop si ;AN000; - 34745 000050E0 7503 jnz short $P_TimeF00 ;AN000; if no, means 12 hour system - 34746 000050E2 E8F800 call $P_Time_2412 ;AN000; this routine handle "am" "pm" - 34747 $P_TimeF00: ;AN000; - 34748 ;mov word [cs:$P_1st_Val],0 ;AC034; set initial value - 34749 ;mov word [cs:$P_2nd_Val],0 ;AC034; set initial value - 34750 ;mov word [cs:$P_3rd_Val],0 ;AC034; set initial value - 34751 ;mov word [cs:$P_4th_Val],0 ;AC034; set initial value - 34752 ;mov byte [cs:$P_Got_Time],1 ;AN023;AC034;; use time delimiter - 34753 ; 03/04/2023 - 34754 000050E5 31DB xor bx,bx - 34755 000050E7 2E891E[7898] mov [cs:$P_1st_Val],bx ; 0 - 34756 000050EC 2E891E[7A98] mov [cs:$P_2nd_Val],bx ; 0 - 34757 000050F1 2E891E[7C98] mov [cs:$P_3rd_Val],bx ; 0 - 34758 000050F6 2E891E[7E98] mov [cs:$P_4th_Val],bx ; 0 - 34759 ;inc bl - 34760 ;mov [cs:$P_Got_Time],bl ; 1 - 34761 - 34762 ;mov bl,$P_colon_period - 34763 ;mov bl,1 ; $P_colon_period ;AN032; flag, indicates use of - 34764 ; delimiters between hours, - 34765 ; minutes,seconds - 34766 ; 03/04/2023 - Retro DOS v4.0 COMMAND.COM - 34767 000050FB FEC3 inc bl ; bl = 1 - 34768 000050FD 2E881E[5598] mov [cs:$P_Got_Time],bl ; 1 - 34769 ; - 34770 00005102 E87CFF call $P_Get_DecNum ;AN000; get 1st number - 34771 ;jc short $P_TimeF_Err0 ;AN000; - 34772 ; 12/08/2024 - 34773 00005105 725A jc short $P_TimeF_Error - 34774 00005107 2EA3[7898] mov [cs:$P_1st_Val],ax ;AC034; - 34775 0000510B 08DB or bl,bl ;AN000; end of line ? - 34776 0000510D 7478 jz short $P_TimeF_Rlt ;AN000; - 34777 0000510F E86FFF call $P_Get_DecNum ;AN000; get 2nd number - 34778 ;jc short $P_TimeF_Err0 ;AC038; if OK - 34779 ; 12/08/2024 - 34780 00005112 724D jc short $P_TimeF_Error - 34781 00005114 2EA3[7A98] mov [cs:$P_2nd_Val],ax ;AC034; - 34782 00005118 08DB or bl,bl ;AN000; end of line ? - 34783 0000511A 746B jz short $P_TimeF_Rlt ;AN000; - 34784 0000511C B302 mov bl,2 ; $P_period_only ;AN032; flag, which to decimal separator - 34785 0000511E E860FF call $P_Get_DecNum ;AN000; get 3rd number - 34786 ;jc short $P_TimeF_Err0 ;AC039; if problem, bridge to error - 34787 ; 12/08/2024 - 34788 00005121 723E jc short $P_TimeF_Error - 34789 00005123 2EA3[7C98] mov [cs:$P_3rd_Val],ax ;AC034; - 34790 00005127 08DB or bl,bl ;AN000; end of line ? - 34791 00005129 754F jnz short $P_Time_4 ;AN039; NOT END OF LINE, - 34792 ;AN039; GO TO 4TH NUMBER - 34793 ;test byte [cs:$P_Flags1],$P_Time_Again ; 2 - 34794 0000512B 2EF606[C597]02 test byte [cs:$P_Flags1],2 ;AN039; HAS TIME PARSE - 34795 ;AN039; BEEN REPEATED? - 34796 00005131 7554 jnz short $P_TimeF_Rlt ;AN039; yes, this is really - 34797 ;AN039; the end of line - 34798 ;AN039; no, time has not been repeated - 34799 00005133 2E8B36[BC97] mov si,[cs:$P_SI_Save] ;AN039; get where parser quit - 34800 ;AN039; in command line - 34801 00005138 807CFF2C cmp byte [si-1],$P_Comma ; ',' - 34802 ;AN039; look at delimiter - 34803 ;AN039; from command line - 34804 0000513C 7549 jne short $P_TimeF_Rlt ;AN039; was not a comma, this is - 34805 ;AN039; really end of line - 34806 ;AN039; is comma before hundredths, - 34807 ;AN039; redo TIME - 34808 0000513E C644FF2E mov byte [si-1],$P_Period ; '.' - 34809 ;AN039; change that ambiguous - 34810 ;AN039; comma to a decimal point - 34811 ;AN039; parse can understand - 34812 00005142 2EC706[C597]0000 mov word [cs:$P_Flags],0 ;AN039; Clear all internal flags - 34813 ;or byte [cs:$P_Flags1],$P_Time_Again - 34814 00005149 2E800E[C597]02 or byte [cs:$P_Flags1],2 ;AN039; indicate TIME - 34815 ;AN039; is being repeated - 34816 0000514F 2E8B0E[4F98] mov cx,[cs:$P_ORIG_ORD] ;AN039; ORIGINAL ORDINAL FROM CX - 34817 00005154 2E8B26[5198] mov sp,[cs:$P_ORIG_STACK] ;AN039; ORIGINAL VALUE - 34818 ;AN039; OF STACK FROM SP - 34819 00005159 2E8B36[5398] mov si,[cs:$P_ORIG_SI] ;AN039; ORIGINAL START - 34820 ;AN039; PARSE POINTER FROM SI - 34821 0000515E E921F8 jmp $P_Redo_Time ;AN039; go try TIME again - 34822 - 34823 ; 12/08/2024 - 34824 $P_TimeF_Error: ;AN000; - 34825 $P_TimeF_Err: ;AN000; - 34826 00005161 5B pop bx ;AN000; recover CONTROL block - 34827 00005162 5E pop si ;AN000; recover string pointer - 34828 ;mov ah,$P_No_Tag ;AN000; set - 34829 ;mov al,$P_String ;AN000; result - 34830 ; 03/04/2023 - 34831 00005163 B803FF mov ax,($P_No_Tag<<8)+$P_String - 34832 00005166 E841FA call $P_Fill_Result ;AN000; buffer - 34833 ;AN000; to string - 34834 00005169 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 - 34835 ;AC034; return syntax error - 34836 $P_Time_Format_Exit: ;AN000; - 34837 00005170 2EC606[5598]00 mov byte [cs:$P_Got_Time],0 ;AN023;AC034; finished with this time field - 34838 00005176 5A pop dx ;AN000; - 34839 00005177 59 pop cx ;AN000; - 34840 00005178 58 pop ax ;AN000; - 34841 00005179 C3 retn - 34842 - 34843 $P_Time_4: ;AN039; READY FOR 4TH (HUNDREDTHS) NUMBER - 34844 0000517A E804FF call $P_Get_DecNum ;AN000; get 4th number - 34845 $P_TimeF_Err0: ;AN000; Bridge - 34846 0000517D 72E2 jc short $P_TimeF_Error ;AN000; - 34847 ; - 34848 0000517F 2EA3[7E98] mov [cs:$P_4th_Val],ax ;AC034; - 34849 00005183 08DB or bl,bl ;AN000; After hundredth, no data allowed - 34850 00005185 75DA jnz short $P_TimeF_Error ;AN000; if some, then error - 34851 $P_TimeF_Rlt: ;AN000; - 34852 00005187 2EA1[7898] mov ax,[cs:$P_1st_Val] ;AC034; - 34853 0000518B 08E4 or ah,ah ;AN000; if overflow then error - 34854 0000518D 75D2 jnz short $P_TimeF_Err ;AN000; - 34855 ;test byte [cs:$P_Flags1],$P_Time12am ; 1 - 34856 0000518F 2EF606[C597]01 test byte [cs:$P_Flags1],1 ;AN038;if "am" specified - 34857 00005195 7408 jz short $P_Time_notAM ;AN038;skip if no "AM" specified - 34858 ;since "AM" was specified, - 34859 00005197 3C0C cmp al,12 ;AN038: if hour specified as later than noon - 34860 00005199 77C6 ja short $P_TimeF_Err ;AN038; error if "AM" on more than noon - 34861 0000519B 7502 jne short $P_Time_notAM ;AN038; for noon exactly, - 34862 0000519D 30C0 xor al,al ;AN038; set hour = zero - 34863 $P_Time_notAM: ;AN038; - 34864 ;test byte [cs:$P_Flags2],$P_Time12 - 34865 0000519F 2EF606[C697]04 test byte [cs:$P_Flags2],4 ;AC034; if 12 hour system and pm is specified - 34866 000051A5 740C jz short $P_TimeSkip00 ;AN000; then - 34867 000051A7 3C0C cmp al,12 ;AN038; if 12:00 o'clock already - 34868 000051A9 7408 je short $P_TimeSkip00 ;AN038; it is PM already - 34869 000051AB 040C add al,12 ;AN000; add 12 hours to make it afternoon - 34870 000051AD 72B2 jc short $P_TimeF_Err ;AN000; if overflow then error - 34871 000051AF 3C18 cmp al,24 ;AN038; after adding 12, now cannot be >24 - 34872 000051B1 77AE ja short $P_TimeF_Err ;AN038; if too big, error - 34873 $P_TimeSkip00: ;AN000; - 34874 000051B3 88C2 mov dl,al ;AN000; set hour - 34875 000051B5 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; - 34876 000051B9 08E4 or ah,ah ;AN000; if overflow then error - 34877 000051BB 75A4 jnz short $P_TimeF_Err ;AN000; - 34878 000051BD 88C6 mov dh,al ;AN000; set minute - 34879 000051BF 2EA1[7C98] mov ax,[cs:$P_3rd_Val] ;AC034; - 34880 000051C3 08E4 or ah,ah ;AN000; if overflow then error - 34881 000051C5 759A jnz short $P_TimeF_Err ;AN000; - 34882 000051C7 88C1 mov cl,al ;AN000; set second - 34883 000051C9 2EA1[7E98] mov ax,[cs:$P_4th_Val] ;AC034; - 34884 000051CD 08E4 or ah,ah ;AN000; if overflow then error - 34885 000051CF 7590 jnz short $P_TimeF_Err ;AN000; - 34886 000051D1 88C5 mov ch,al ;AN000; set hundredth - 34887 000051D3 5B pop bx ;AN000; recover CONTROL block - 34888 000051D4 5E pop si ;AN000; recover string pointer - 34889 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set - 34890 ;mov al,$P_Time_F ; 8 ;AN000; result - 34891 ; 03/04/2023 - 34892 000051D5 B808FF mov ax,($P_No_Tag<<8)+$P_Time_F - 34893 000051D8 E8CFF9 call $P_Fill_Result ;AN000; buffer - 34894 000051DB EB93 jmp short $P_Time_Format_Exit - 34895 ;AN000; to time - 34896 - 34897 ;*********************************************************************** - 34898 ; $P_Time_2412: - 34899 ; - 34900 ; Function: Remove "a", "p", "am", or "pm" from the end of stinrg - 34901 ; - 34902 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34903 ; - 34904 ; Output: Set $P_Time12 flag when the string is terminated by "p" - 34905 ; or "pm" + 34721 ; Input: psdata_seg:SI -> $P_STRING_BUF + 34722 ; ES:BX -> CONTROL block + 34723 ; + 34724 ; Output: None + 34725 ; + 34726 ; Use: $P_Fill_Result, $P_Set_CDI, $P_Get_DecNum, $P_Time_2412 + 34727 ; + 34728 ; Vars: $P_RC(W), $P_Flags(R), $P_1st_Val(RW), $P_2nd_Val(RW) + 34729 ; $P_3rd_Val(RW), $P_4th_Val(RW) + 34730 ;*********************************************************************** + 34731 + 34732 ; 03/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34733 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34734 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 34735 $P_Time_Format: ;AN000; + 34736 000050D1 50 push ax ;AN000; + 34737 000050D2 51 push cx ;AN000; + 34738 000050D3 52 push dx ;AN000; + 34739 000050D4 56 push si ;AN000; + 34740 000050D5 53 push bx ;AN000; + 34741 000050D6 56 push si ;AN000; + 34742 000050D7 E88DFF call $P_Set_CDI ;AN000; Set country independent + 34743 ; information before process + 34744 ;test byte [cs:si+11h], 1 + 34745 000050DA 2EF6441001 test byte [cs:si+$P_CDI.$P_CDI_TimeF],1 + 34746 ;AN000; 24 hour system + 34747 000050DF 5E pop si ;AN000; + 34748 000050E0 7503 jnz short $P_TimeF00 ;AN000; if no, means 12 hour system + 34749 000050E2 E8F800 call $P_Time_2412 ;AN000; this routine handle "am" "pm" + 34750 $P_TimeF00: ;AN000; + 34751 ;mov word [cs:$P_1st_Val],0 ;AC034; set initial value + 34752 ;mov word [cs:$P_2nd_Val],0 ;AC034; set initial value + 34753 ;mov word [cs:$P_3rd_Val],0 ;AC034; set initial value + 34754 ;mov word [cs:$P_4th_Val],0 ;AC034; set initial value + 34755 ;mov byte [cs:$P_Got_Time],1 ;AN023;AC034;; use time delimiter + 34756 ; 03/04/2023 + 34757 000050E5 31DB xor bx,bx + 34758 000050E7 2E891E[7898] mov [cs:$P_1st_Val],bx ; 0 + 34759 000050EC 2E891E[7A98] mov [cs:$P_2nd_Val],bx ; 0 + 34760 000050F1 2E891E[7C98] mov [cs:$P_3rd_Val],bx ; 0 + 34761 000050F6 2E891E[7E98] mov [cs:$P_4th_Val],bx ; 0 + 34762 ;inc bl + 34763 ;mov [cs:$P_Got_Time],bl ; 1 + 34764 + 34765 ;mov bl,$P_colon_period + 34766 ;mov bl,1 ; $P_colon_period ;AN032; flag, indicates use of + 34767 ; delimiters between hours, + 34768 ; minutes,seconds + 34769 ; 03/04/2023 - Retro DOS v4.0 COMMAND.COM + 34770 000050FB FEC3 inc bl ; bl = 1 + 34771 000050FD 2E881E[5598] mov [cs:$P_Got_Time],bl ; 1 + 34772 ; + 34773 00005102 E87CFF call $P_Get_DecNum ;AN000; get 1st number + 34774 ;jc short $P_TimeF_Err0 ;AN000; + 34775 ; 12/08/2024 + 34776 00005105 725A jc short $P_TimeF_Error + 34777 00005107 2EA3[7898] mov [cs:$P_1st_Val],ax ;AC034; + 34778 0000510B 08DB or bl,bl ;AN000; end of line ? + 34779 0000510D 7478 jz short $P_TimeF_Rlt ;AN000; + 34780 0000510F E86FFF call $P_Get_DecNum ;AN000; get 2nd number + 34781 ;jc short $P_TimeF_Err0 ;AC038; if OK + 34782 ; 12/08/2024 + 34783 00005112 724D jc short $P_TimeF_Error + 34784 00005114 2EA3[7A98] mov [cs:$P_2nd_Val],ax ;AC034; + 34785 00005118 08DB or bl,bl ;AN000; end of line ? + 34786 0000511A 746B jz short $P_TimeF_Rlt ;AN000; + 34787 0000511C B302 mov bl,2 ; $P_period_only ;AN032; flag, which to decimal separator + 34788 0000511E E860FF call $P_Get_DecNum ;AN000; get 3rd number + 34789 ;jc short $P_TimeF_Err0 ;AC039; if problem, bridge to error + 34790 ; 12/08/2024 + 34791 00005121 723E jc short $P_TimeF_Error + 34792 00005123 2EA3[7C98] mov [cs:$P_3rd_Val],ax ;AC034; + 34793 00005127 08DB or bl,bl ;AN000; end of line ? + 34794 00005129 754F jnz short $P_Time_4 ;AN039; NOT END OF LINE, + 34795 ;AN039; GO TO 4TH NUMBER + 34796 ;test byte [cs:$P_Flags1],$P_Time_Again ; 2 + 34797 0000512B 2EF606[C597]02 test byte [cs:$P_Flags1],2 ;AN039; HAS TIME PARSE + 34798 ;AN039; BEEN REPEATED? + 34799 00005131 7554 jnz short $P_TimeF_Rlt ;AN039; yes, this is really + 34800 ;AN039; the end of line + 34801 ;AN039; no, time has not been repeated + 34802 00005133 2E8B36[BC97] mov si,[cs:$P_SI_Save] ;AN039; get where parser quit + 34803 ;AN039; in command line + 34804 00005138 807CFF2C cmp byte [si-1],$P_Comma ; ',' + 34805 ;AN039; look at delimiter + 34806 ;AN039; from command line + 34807 0000513C 7549 jne short $P_TimeF_Rlt ;AN039; was not a comma, this is + 34808 ;AN039; really end of line + 34809 ;AN039; is comma before hundredths, + 34810 ;AN039; redo TIME + 34811 0000513E C644FF2E mov byte [si-1],$P_Period ; '.' + 34812 ;AN039; change that ambiguous + 34813 ;AN039; comma to a decimal point + 34814 ;AN039; parse can understand + 34815 00005142 2EC706[C597]0000 mov word [cs:$P_Flags],0 ;AN039; Clear all internal flags + 34816 ;or byte [cs:$P_Flags1],$P_Time_Again + 34817 00005149 2E800E[C597]02 or byte [cs:$P_Flags1],2 ;AN039; indicate TIME + 34818 ;AN039; is being repeated + 34819 0000514F 2E8B0E[4F98] mov cx,[cs:$P_ORIG_ORD] ;AN039; ORIGINAL ORDINAL FROM CX + 34820 00005154 2E8B26[5198] mov sp,[cs:$P_ORIG_STACK] ;AN039; ORIGINAL VALUE + 34821 ;AN039; OF STACK FROM SP + 34822 00005159 2E8B36[5398] mov si,[cs:$P_ORIG_SI] ;AN039; ORIGINAL START + 34823 ;AN039; PARSE POINTER FROM SI + 34824 0000515E E921F8 jmp $P_Redo_Time ;AN039; go try TIME again + 34825 + 34826 ; 12/08/2024 + 34827 $P_TimeF_Error: ;AN000; + 34828 $P_TimeF_Err: ;AN000; + 34829 00005161 5B pop bx ;AN000; recover CONTROL block + 34830 00005162 5E pop si ;AN000; recover string pointer + 34831 ;mov ah,$P_No_Tag ;AN000; set + 34832 ;mov al,$P_String ;AN000; result + 34833 ; 03/04/2023 + 34834 00005163 B803FF mov ax,($P_No_Tag<<8)+$P_String + 34835 00005166 E841FA call $P_Fill_Result ;AN000; buffer + 34836 ;AN000; to string + 34837 00005169 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax ; 9 + 34838 ;AC034; return syntax error + 34839 $P_Time_Format_Exit: ;AN000; + 34840 00005170 2EC606[5598]00 mov byte [cs:$P_Got_Time],0 ;AN023;AC034; finished with this time field + 34841 00005176 5A pop dx ;AN000; + 34842 00005177 59 pop cx ;AN000; + 34843 00005178 58 pop ax ;AN000; + 34844 00005179 C3 retn + 34845 + 34846 $P_Time_4: ;AN039; READY FOR 4TH (HUNDREDTHS) NUMBER + 34847 0000517A E804FF call $P_Get_DecNum ;AN000; get 4th number + 34848 $P_TimeF_Err0: ;AN000; Bridge + 34849 0000517D 72E2 jc short $P_TimeF_Error ;AN000; + 34850 ; + 34851 0000517F 2EA3[7E98] mov [cs:$P_4th_Val],ax ;AC034; + 34852 00005183 08DB or bl,bl ;AN000; After hundredth, no data allowed + 34853 00005185 75DA jnz short $P_TimeF_Error ;AN000; if some, then error + 34854 $P_TimeF_Rlt: ;AN000; + 34855 00005187 2EA1[7898] mov ax,[cs:$P_1st_Val] ;AC034; + 34856 0000518B 08E4 or ah,ah ;AN000; if overflow then error + 34857 0000518D 75D2 jnz short $P_TimeF_Err ;AN000; + 34858 ;test byte [cs:$P_Flags1],$P_Time12am ; 1 + 34859 0000518F 2EF606[C597]01 test byte [cs:$P_Flags1],1 ;AN038;if "am" specified + 34860 00005195 7408 jz short $P_Time_notAM ;AN038;skip if no "AM" specified + 34861 ;since "AM" was specified, + 34862 00005197 3C0C cmp al,12 ;AN038: if hour specified as later than noon + 34863 00005199 77C6 ja short $P_TimeF_Err ;AN038; error if "AM" on more than noon + 34864 0000519B 7502 jne short $P_Time_notAM ;AN038; for noon exactly, + 34865 0000519D 30C0 xor al,al ;AN038; set hour = zero + 34866 $P_Time_notAM: ;AN038; + 34867 ;test byte [cs:$P_Flags2],$P_Time12 + 34868 0000519F 2EF606[C697]04 test byte [cs:$P_Flags2],4 ;AC034; if 12 hour system and pm is specified + 34869 000051A5 740C jz short $P_TimeSkip00 ;AN000; then + 34870 000051A7 3C0C cmp al,12 ;AN038; if 12:00 o'clock already + 34871 000051A9 7408 je short $P_TimeSkip00 ;AN038; it is PM already + 34872 000051AB 040C add al,12 ;AN000; add 12 hours to make it afternoon + 34873 000051AD 72B2 jc short $P_TimeF_Err ;AN000; if overflow then error + 34874 000051AF 3C18 cmp al,24 ;AN038; after adding 12, now cannot be >24 + 34875 000051B1 77AE ja short $P_TimeF_Err ;AN038; if too big, error + 34876 $P_TimeSkip00: ;AN000; + 34877 000051B3 88C2 mov dl,al ;AN000; set hour + 34878 000051B5 2EA1[7A98] mov ax,[cs:$P_2nd_Val] ;AC034; + 34879 000051B9 08E4 or ah,ah ;AN000; if overflow then error + 34880 000051BB 75A4 jnz short $P_TimeF_Err ;AN000; + 34881 000051BD 88C6 mov dh,al ;AN000; set minute + 34882 000051BF 2EA1[7C98] mov ax,[cs:$P_3rd_Val] ;AC034; + 34883 000051C3 08E4 or ah,ah ;AN000; if overflow then error + 34884 000051C5 759A jnz short $P_TimeF_Err ;AN000; + 34885 000051C7 88C1 mov cl,al ;AN000; set second + 34886 000051C9 2EA1[7E98] mov ax,[cs:$P_4th_Val] ;AC034; + 34887 000051CD 08E4 or ah,ah ;AN000; if overflow then error + 34888 000051CF 7590 jnz short $P_TimeF_Err ;AN000; + 34889 000051D1 88C5 mov ch,al ;AN000; set hundredth + 34890 000051D3 5B pop bx ;AN000; recover CONTROL block + 34891 000051D4 5E pop si ;AN000; recover string pointer + 34892 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set + 34893 ;mov al,$P_Time_F ; 8 ;AN000; result + 34894 ; 03/04/2023 + 34895 000051D5 B808FF mov ax,($P_No_Tag<<8)+$P_Time_F + 34896 000051D8 E8CFF9 call $P_Fill_Result ;AN000; buffer + 34897 000051DB EB93 jmp short $P_Time_Format_Exit + 34898 ;AN000; to time + 34899 + 34900 ;*********************************************************************** + 34901 ; $P_Time_2412: + 34902 ; + 34903 ; Function: Remove "a", "p", "am", or "pm" from the end of stinrg + 34904 ; + 34905 ; Input: psdata_seg:SI -> $P_STRING_BUF 34906 ; - 34907 ; Vars: $P_Flags(W) - 34908 ;*********************************************************************** - 34909 - 34910 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34911 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34912 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 34913 $P_Time_2412: ;AN000; - 34914 000051DD 50 push ax ;AN000; - 34915 000051DE 56 push si ;AN000; - 34916 $P_T12_Loop: ;AN000; - 34917 000051DF 2E8A04 mov al,[cs:si] ;AN000; Move - 34918 000051E2 46 inc si ;AN000; si - 34919 000051E3 08C0 or al,al ;AN000; to - 34920 000051E5 75F8 jnz short $P_T12_Loop ;AN000; end of string - 34921 - 34922 000051E7 2E8A44FE mov al,[cs:si-2] ;AN000; get char just before NULL - 34923 ;or al,20h - 34924 000051EB 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case map - 34925 000051ED 3C70 cmp al,"p" ;AN000; only "p" of "pm" ? - 34926 000051EF 7425 je short $P_T1200 ;AN000; - 34927 - 34928 000051F1 3C61 cmp al,"a" ;AN000; only "a" of "am" ? - 34929 000051F3 7413 je short $P_T1201 ;AN000; + 34907 ; Output: Set $P_Time12 flag when the string is terminated by "p" + 34908 ; or "pm" + 34909 ; + 34910 ; Vars: $P_Flags(W) + 34911 ;*********************************************************************** + 34912 + 34913 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34914 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34915 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 34916 $P_Time_2412: ;AN000; + 34917 000051DD 50 push ax ;AN000; + 34918 000051DE 56 push si ;AN000; + 34919 $P_T12_Loop: ;AN000; + 34920 000051DF 2E8A04 mov al,[cs:si] ;AN000; Move + 34921 000051E2 46 inc si ;AN000; si + 34922 000051E3 08C0 or al,al ;AN000; to + 34923 000051E5 75F8 jnz short $P_T12_Loop ;AN000; end of string + 34924 + 34925 000051E7 2E8A44FE mov al,[cs:si-2] ;AN000; get char just before NULL + 34926 ;or al,20h + 34927 000051EB 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case map + 34928 000051ED 3C70 cmp al,"p" ;AN000; only "p" of "pm" ? + 34929 000051EF 7425 je short $P_T1200 ;AN000; 34930 - 34931 000051F5 3C6D cmp al,"m" ;AN000; "m" of "am" or "pm" - 34932 000051F7 751A jne short $P_T12_Exit ;AN000; + 34931 000051F1 3C61 cmp al,"a" ;AN000; only "a" of "am" ? + 34932 000051F3 7413 je short $P_T1201 ;AN000; 34933 - 34934 000051F9 4E dec si ;AN000; - 34935 000051FA 2E8A44FE mov al,[cs:si-2] ;AN000; - 34936 ;or al,20h - 34937 000051FE 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case map - 34938 00005200 3C70 cmp al,"p" ;AN000; "p" of "pm" ? - 34939 00005202 7412 je short $P_T1200 ;AN000; - 34940 - 34941 00005204 3C61 cmp al,"a" ;AN000; "a" of "am" ? - 34942 ;je short $P_T1201 ;AN000; go process "a" - 34943 ;jmp short $P_T12_Exit ;AN000; no special chars found - 34944 ; 05/04/2023 - 34945 00005206 750B jne short $P_T12_Exit - 34946 - 34947 ;$P_T1200: ;AN000; "P" found - 34948 ;;or byte [cs:$P_Flags2],$P_Time12 - 34949 ;or byte [cs:$P_Flags2],4 ;AC034; flag "PM" found - 34950 ;jmp short $P_Tclr_chr ;AN038; go clear the special char - 34951 - 34952 $P_T1201: ;AN000; "A" found - 34953 ;or byte [cs:$P_Flags1],$P_Time12AM - 34954 00005208 2E800E[C597]01 or byte [cs:$P_Flags1],1 ;AN038; flag "AM" found - 34955 $P_Tclr_chr: ;AN038; - 34956 0000520E 2EC644FE00 mov byte [cs:si-2],$P_NULL ;AN000; null out special char - 34957 $P_T12_Exit: ;AN000; - 34958 00005213 5E pop si ;AN000; - 34959 00005214 58 pop ax ;AN000; - 34960 00005215 C3 retn ;AN000; - 34961 - 34962 ; 05/04/2023 - 34963 $P_T1200: ;AN000; "P" found - 34964 ;or byte [cs:$P_Flags2],$P_Time12 - 34965 00005216 2E800E[C697]04 or byte [cs:$P_Flags2],4 ;AC034; flag "PM" found - 34966 0000521C EBF0 jmp short $P_Tclr_chr ;AN038; go clear the special char - 34967 - 34968 ;*********************************************************************** - 34969 ; $P_File_Format; - 34970 ; - 34971 ; Function: Check if the input string is valid file spec format. - 34972 ; And set the result buffer. + 34934 000051F5 3C6D cmp al,"m" ;AN000; "m" of "am" or "pm" + 34935 000051F7 751A jne short $P_T12_Exit ;AN000; + 34936 + 34937 000051F9 4E dec si ;AN000; + 34938 000051FA 2E8A44FE mov al,[cs:si-2] ;AN000; + 34939 ;or al,20h + 34940 000051FE 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case map + 34941 00005200 3C70 cmp al,"p" ;AN000; "p" of "pm" ? + 34942 00005202 7412 je short $P_T1200 ;AN000; + 34943 + 34944 00005204 3C61 cmp al,"a" ;AN000; "a" of "am" ? + 34945 ;je short $P_T1201 ;AN000; go process "a" + 34946 ;jmp short $P_T12_Exit ;AN000; no special chars found + 34947 ; 05/04/2023 + 34948 00005206 750B jne short $P_T12_Exit + 34949 + 34950 ;$P_T1200: ;AN000; "P" found + 34951 ;;or byte [cs:$P_Flags2],$P_Time12 + 34952 ;or byte [cs:$P_Flags2],4 ;AC034; flag "PM" found + 34953 ;jmp short $P_Tclr_chr ;AN038; go clear the special char + 34954 + 34955 $P_T1201: ;AN000; "A" found + 34956 ;or byte [cs:$P_Flags1],$P_Time12AM + 34957 00005208 2E800E[C597]01 or byte [cs:$P_Flags1],1 ;AN038; flag "AM" found + 34958 $P_Tclr_chr: ;AN038; + 34959 0000520E 2EC644FE00 mov byte [cs:si-2],$P_NULL ;AN000; null out special char + 34960 $P_T12_Exit: ;AN000; + 34961 00005213 5E pop si ;AN000; + 34962 00005214 58 pop ax ;AN000; + 34963 00005215 C3 retn ;AN000; + 34964 + 34965 ; 05/04/2023 + 34966 $P_T1200: ;AN000; "P" found + 34967 ;or byte [cs:$P_Flags2],$P_Time12 + 34968 00005216 2E800E[C697]04 or byte [cs:$P_Flags2],4 ;AC034; flag "PM" found + 34969 0000521C EBF0 jmp short $P_Tclr_chr ;AN038; go clear the special char + 34970 + 34971 ;*********************************************************************** + 34972 ; $P_File_Format; 34973 ; - 34974 ; Input: psdata_seg:SI -> $P_STRING_BUF - 34975 ; ES:BX -> CONTROL block + 34974 ; Function: Check if the input string is valid file spec format. + 34975 ; And set the result buffer. 34976 ; - 34977 ; Output: None - 34978 ; - 34979 ; Use: $P_Fill_Result, $P_Chk_DBCS, $P_FileSp_Chk - 34980 ; - 34981 ; Vars: $P_RC(W), $P_SI_Save(W), $P_Terminator(W), $P_SaveSI_Cmpx(R) - 34982 ; $P_SaveSI_Cmpx(R) - 34983 ;*********************************************************************** - 34984 - 34985 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 34986 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4DF0h + 34977 ; Input: psdata_seg:SI -> $P_STRING_BUF + 34978 ; ES:BX -> CONTROL block + 34979 ; + 34980 ; Output: None + 34981 ; + 34982 ; Use: $P_Fill_Result, $P_Chk_DBCS, $P_FileSp_Chk + 34983 ; + 34984 ; Vars: $P_RC(W), $P_SI_Save(W), $P_Terminator(W), $P_SaveSI_Cmpx(R) + 34985 ; $P_SaveSI_Cmpx(R) + 34986 ;*********************************************************************** 34987 - 34988 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 34989 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:55B4h + 34988 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 34989 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4DF0h 34990 - 34991 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 34992 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:544Ah - 34993 $P_File_Format: - 34994 0000521E 50 push ax ;AN000; - 34995 0000521F 57 push di ;AN000; - 34996 00005220 56 push si ;AN000; - 34997 00005221 2E8B3E[C797] mov di,[cs:$P_SaveSI_Cmpx] ;AC034; get user buffer address - 34998 00005226 2E8A04 mov al,[cs:si] ;AN000; load character - 34999 00005229 08C0 or al,al ;AN000; end of line ? - 35000 0000522B 7413 je short $P_FileF_Err ;AN000; if yes, error exit - 35001 0000522D E85D00 call $P_FileSp_Chk ;AN000; else, check if file special character - 35002 00005230 7523 jne short $P_FileF03 ;AN000; if yes, - 35003 00005232 2EC606[9398]01 mov byte [cs:$P_err_flag],$P_error_filespec ; 1 - 35004 ;AN033;AC034;; set error flag- bad char. - 35005 00005238 5E pop si ;AN033; - 35006 00005239 2EC60400 mov byte [cs:si],$P_NULL ;AN033; - 35007 0000523D 5F pop di ;AN033; - 35008 0000523E EB3E jmp short $P_FileF02 ;AN033; - 35009 $P_FileF_Err: ;AN000; - 35010 00005240 5E pop si ;AN000; - 35011 00005241 2EC60400 mov byte [cs:si],$P_NULL ;AN000; - 35012 00005245 5F pop di ;AN000; - 35013 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Optional - 35014 ;test word [es:bx],1 ;AN000; is it optional ? - 35015 00005246 26F60701 test byte [es:bx],$P_Optional ; 1 - 35016 0000524A 7532 jnz short $P_FileF02 ;AN000; - 35017 0000524C 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing - 35018 ;mov word [cs:$P_RC],2 ;AC034; 3/17/87 - 35019 00005253 EB29 jmp short $P_FileF02 ;AN000; - 35020 $P_FileF03: ;AN000; - 35021 00005255 58 pop ax ;AN000; discard save si - 35022 00005256 56 push si ;AN000; save new si - 35023 $P_FileF_Loop1: ;AN000; - 35024 00005257 2E8A04 mov al,[cs:si] ;AN000; load character (not special char) - 35025 0000525A 08C0 or al,al ;AN000; end of line ? - 35026 0000525C 741E jz short $P_FileF_RLT ;AN000; - 35027 0000525E E82C00 call $P_FileSp_Chk ;AN000; File special character ? - 35028 00005261 740B jz short $P_FileF00 ;AN000; - 35029 00005263 E85C01 call $P_Chk_DBCS ;AN000; no, then DBCS ? - 35030 00005266 7302 jnc short $P_FileF01 ;AN000; - 35031 00005268 47 inc di ;AN000; if yes, skip next byte - 35032 00005269 46 inc si ;AN000; - 35033 $P_FileF01: ;AN000; - 35034 0000526A 47 inc di ;AN000; - 35035 0000526B 46 inc si ;AN000; - 35036 0000526C EBE9 jmp short $P_FileF_Loop1 ;AN000; - 35037 $P_FileF00: ;AN000; - 35038 0000526E 2EA2[C097] mov [cs:$P_Terminator],al ;AC034; - 35039 00005272 2EC60400 mov byte [cs:si],$P_NULL ;AN000; update end of string - 35040 00005276 47 inc di ;AN000; - 35041 00005277 2E893E[BC97] mov [cs:$P_SI_Save],di ;AC034; update next pointer in command line - 35042 $P_FileF_RLT: ;AN000; - 35043 0000527C 5E pop si ;AN000; - 35044 0000527D 5F pop di ;AN000; - 35045 $P_FileF02: ;AN000; - 35046 0000527E 58 pop ax ;AN000; (tm14) - 35047 ;;test ax,200h - 35048 ;test ax,$P_File_Spc ;AN000; (tm14) - 35049 ; 05/04/2023 - 35050 0000527F F6C402 test ah,($P_File_Spc>>8) - 35051 00005282 7408 jz short $P_Drv_Only_Exit ;AN000; (tm14) - 35052 00005284 50 push ax ;AN000; (tm14) - 35053 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set - 35054 ;mov al,$P_File_Spec ; 5 ;AN000; result - 35055 ; 05/04/2023 - 35056 00005285 B805FF mov ax,($P_No_Tag<<8)+$P_File_Spec - 35057 00005288 E81FF9 call $P_Fill_Result ;AN000; buffer to file spec - 35058 0000528B 58 pop ax ;AN000; - 35059 $P_Drv_Only_Exit: ;AN000; (tm14) - 35060 0000528C C3 retn ;AN000; - 35061 - 35062 ;*********************************************************************** - 35063 ; $P_FileSp_Chk - 35064 ; - 35065 ; Function: Check if the input byte is one of file special characters - 35066 ; - 35067 ; Input: psdata_seg:SI -> $P_STRING_BUF - 35068 ; AL = character code to be examineed + 34991 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 34992 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:55B4h + 34993 + 34994 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 34995 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:544Ah + 34996 $P_File_Format: + 34997 0000521E 50 push ax ;AN000; + 34998 0000521F 57 push di ;AN000; + 34999 00005220 56 push si ;AN000; + 35000 00005221 2E8B3E[C797] mov di,[cs:$P_SaveSI_Cmpx] ;AC034; get user buffer address + 35001 00005226 2E8A04 mov al,[cs:si] ;AN000; load character + 35002 00005229 08C0 or al,al ;AN000; end of line ? + 35003 0000522B 7413 je short $P_FileF_Err ;AN000; if yes, error exit + 35004 0000522D E85D00 call $P_FileSp_Chk ;AN000; else, check if file special character + 35005 00005230 7523 jne short $P_FileF03 ;AN000; if yes, + 35006 00005232 2EC606[9398]01 mov byte [cs:$P_err_flag],$P_error_filespec ; 1 + 35007 ;AN033;AC034;; set error flag- bad char. + 35008 00005238 5E pop si ;AN033; + 35009 00005239 2EC60400 mov byte [cs:si],$P_NULL ;AN033; + 35010 0000523D 5F pop di ;AN033; + 35011 0000523E EB3E jmp short $P_FileF02 ;AN033; + 35012 $P_FileF_Err: ;AN000; + 35013 00005240 5E pop si ;AN000; + 35014 00005241 2EC60400 mov byte [cs:si],$P_NULL ;AN000; + 35015 00005245 5F pop di ;AN000; + 35016 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Optional + 35017 ;test word [es:bx],1 ;AN000; is it optional ? + 35018 00005246 26F60701 test byte [es:bx],$P_Optional ; 1 + 35019 0000524A 7532 jnz short $P_FileF02 ;AN000; + 35020 0000524C 2EC706[BA97]0200 mov word [cs:$P_RC],$P_Op_Missing + 35021 ;mov word [cs:$P_RC],2 ;AC034; 3/17/87 + 35022 00005253 EB29 jmp short $P_FileF02 ;AN000; + 35023 $P_FileF03: ;AN000; + 35024 00005255 58 pop ax ;AN000; discard save si + 35025 00005256 56 push si ;AN000; save new si + 35026 $P_FileF_Loop1: ;AN000; + 35027 00005257 2E8A04 mov al,[cs:si] ;AN000; load character (not special char) + 35028 0000525A 08C0 or al,al ;AN000; end of line ? + 35029 0000525C 741E jz short $P_FileF_RLT ;AN000; + 35030 0000525E E82C00 call $P_FileSp_Chk ;AN000; File special character ? + 35031 00005261 740B jz short $P_FileF00 ;AN000; + 35032 00005263 E85C01 call $P_Chk_DBCS ;AN000; no, then DBCS ? + 35033 00005266 7302 jnc short $P_FileF01 ;AN000; + 35034 00005268 47 inc di ;AN000; if yes, skip next byte + 35035 00005269 46 inc si ;AN000; + 35036 $P_FileF01: ;AN000; + 35037 0000526A 47 inc di ;AN000; + 35038 0000526B 46 inc si ;AN000; + 35039 0000526C EBE9 jmp short $P_FileF_Loop1 ;AN000; + 35040 $P_FileF00: ;AN000; + 35041 0000526E 2EA2[C097] mov [cs:$P_Terminator],al ;AC034; + 35042 00005272 2EC60400 mov byte [cs:si],$P_NULL ;AN000; update end of string + 35043 00005276 47 inc di ;AN000; + 35044 00005277 2E893E[BC97] mov [cs:$P_SI_Save],di ;AC034; update next pointer in command line + 35045 $P_FileF_RLT: ;AN000; + 35046 0000527C 5E pop si ;AN000; + 35047 0000527D 5F pop di ;AN000; + 35048 $P_FileF02: ;AN000; + 35049 0000527E 58 pop ax ;AN000; (tm14) + 35050 ;;test ax,200h + 35051 ;test ax,$P_File_Spc ;AN000; (tm14) + 35052 ; 05/04/2023 + 35053 0000527F F6C402 test ah,($P_File_Spc>>8) + 35054 00005282 7408 jz short $P_Drv_Only_Exit ;AN000; (tm14) + 35055 00005284 50 push ax ;AN000; (tm14) + 35056 ;mov ah,$P_No_Tag ; 0FFh ;AN000; set + 35057 ;mov al,$P_File_Spec ; 5 ;AN000; result + 35058 ; 05/04/2023 + 35059 00005285 B805FF mov ax,($P_No_Tag<<8)+$P_File_Spec + 35060 00005288 E81FF9 call $P_Fill_Result ;AN000; buffer to file spec + 35061 0000528B 58 pop ax ;AN000; + 35062 $P_Drv_Only_Exit: ;AN000; (tm14) + 35063 0000528C C3 retn ;AN000; + 35064 + 35065 ;*********************************************************************** + 35066 ; $P_FileSp_Chk + 35067 ; + 35068 ; Function: Check if the input byte is one of file special characters 35069 ; - 35070 ; Output: ZF = 1 , AL is one of special characters - 35071 ;*********************************************************************** - 35072 - 35073 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35074 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35075 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35076 $P_FileSp_Chk: - 35077 0000528D 53 push bx ;AN000; - 35078 0000528E 51 push cx ;AN000; - 35079 ;lea bx,[cs:$P_FileSp_Char] ;AC034; special character table - 35080 0000528F 8D1E[8A98] lea bx,$P_FileSp_Char ; '[]|<>+=;"' - 35081 00005293 B90900 mov cx,$P_FileSp_Len ; 9 - 35082 ;mov cx,9 ;AN000; load length of it - 35083 $P_FileSp_Loop: ;AN000; - 35084 00005296 2E3A07 cmp al,[cs:bx] ;AN000; is it one of special character ? - 35085 00005299 7404 je short $P_FileSp_Exit ;AN000; - 35086 0000529B 43 inc bx ;AN000; - 35087 0000529C E2F8 loop $P_FileSp_Loop ;AN000; - 35088 0000529E 41 inc cx ;AN000; reset ZF - 35089 $P_FileSp_Exit: ;AN000; - 35090 0000529F 59 pop cx ;AN000; - 35091 000052A0 5B pop bx ;AN000; - 35092 000052A1 C3 retn ;AN000; - 35093 - 35094 ;*********************************************************************** - 35095 ; $P_Drive_Format; - 35096 ; - 35097 ; Function: Check if the input string is valid drive only format. - 35098 ; And set the result buffer. + 35070 ; Input: psdata_seg:SI -> $P_STRING_BUF + 35071 ; AL = character code to be examineed + 35072 ; + 35073 ; Output: ZF = 1 , AL is one of special characters + 35074 ;*********************************************************************** + 35075 + 35076 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35077 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35078 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35079 $P_FileSp_Chk: + 35080 0000528D 53 push bx ;AN000; + 35081 0000528E 51 push cx ;AN000; + 35082 ;lea bx,[cs:$P_FileSp_Char] ;AC034; special character table + 35083 0000528F 8D1E[8A98] lea bx,$P_FileSp_Char ; '[]|<>+=;"' + 35084 00005293 B90900 mov cx,$P_FileSp_Len ; 9 + 35085 ;mov cx,9 ;AN000; load length of it + 35086 $P_FileSp_Loop: ;AN000; + 35087 00005296 2E3A07 cmp al,[cs:bx] ;AN000; is it one of special character ? + 35088 00005299 7404 je short $P_FileSp_Exit ;AN000; + 35089 0000529B 43 inc bx ;AN000; + 35090 0000529C E2F8 loop $P_FileSp_Loop ;AN000; + 35091 0000529E 41 inc cx ;AN000; reset ZF + 35092 $P_FileSp_Exit: ;AN000; + 35093 0000529F 59 pop cx ;AN000; + 35094 000052A0 5B pop bx ;AN000; + 35095 000052A1 C3 retn ;AN000; + 35096 + 35097 ;*********************************************************************** + 35098 ; $P_Drive_Format; 35099 ; - 35100 ; Input: psdata_seg:SI -> $P_STRING_BUF - 35101 ; ES:BX -> CONTROL block + 35100 ; Function: Check if the input string is valid drive only format. + 35101 ; And set the result buffer. 35102 ; - 35103 ; Output: None - 35104 ; - 35105 ; Use: $P_Fill_Result, $P_Chk_DBCS - 35106 ; - 35107 ; Vars: $P_RC(W) - 35108 ;*********************************************************************** - 35109 - 35110 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35111 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35112 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35113 $P_Drive_Format: - 35114 000052A2 50 push ax ;AN000; - 35115 000052A3 52 push dx ;AN000; - 35116 000052A4 2E8A04 mov al,[cs:si] ;AN000; - 35117 000052A7 08C0 or al,al ;AN000; if null string - 35118 000052A9 7436 jz short $P_Drv_Exit ;AN000; do nothing - 35119 000052AB E81401 call $P_Chk_DBCS ;AN000; is it leading byte ? - 35120 000052AE 722A jc short $P_Drv_Err ;AN000; - 35121 ;cmp word [cs:si+1],3Ah ; $P_Colon ; ':' - 35122 000052B0 2E837C013A cmp word [cs:si+1],$P_Colon ;AN000; "d", ":", 0 ? - 35123 000052B5 740D je short $P_DrvF00 ;AN000; - 35124 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon - 35125 ;test word [es:bx],10h ;AN000; colon can be ignored? - 35126 000052B7 26F60710 test byte [es:bx],$P_Ig_Colon ; 10h - 35127 000052BB 741D jz short $P_Drv_Err ;AN000; - 35128 000052BD 2E807C0100 cmp byte [cs:si+1],$P_NULL ;AN000; "d", 0 ? - 35129 000052C2 7516 jne short $P_Drv_Err ;AN000; - 35130 $P_DrvF00: ;AN000; - 35131 000052C4 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case - 35132 000052C6 3C61 cmp al,"a" ; 61h ;AN000; drive letter must - 35133 000052C8 7210 jb short $P_Drv_Err ;AN000; in range of - 35134 000052CA 3C7A cmp al,"z" ; 7Ah ;AN000; "a" - "z" - 35135 000052CC 770C ja short $P_Drv_Err ;AN000; if no, error - 35136 000052CE 2C60 sub al,"a"-1 ; 60h ;AN000; make text drive to binary drive - 35137 000052D0 88C2 mov dl,al ;AN000; set - 35138 ;mov ah,$P_No_Tag ; 0FFh ;AN000; result - 35139 ;mov al,$P_Drive ; 6 ;AN000; buffer - 35140 ; 05/04/2023 - 35141 000052D2 B806FF mov ax,($P_No_Tag<<8)+$P_Drive ; 06FFh - 35142 000052D5 E8D2F8 call $P_Fill_Result ;AN000; to drive - 35143 000052D8 EB07 jmp short $P_Drv_Exit ;AN000; - 35144 $P_Drv_Err: ;AN000; - 35145 000052DA 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax - 35146 ;mov word [cs:$P_RC],9 ;AC034; - 35147 $P_Drv_Exit: ;AN000; - 35148 000052E1 5A pop dx ;AN000; - 35149 000052E2 58 pop ax ;AN000; - 35150 000052E3 C3 retn ;AN000; - 35151 - 35152 ;*********************************************************************** - 35153 ; $P_Skip_Delim; - 35154 ; - 35155 ; Function: Skip delimiters specified in the PARMS list, white space - 35156 ; and comma. + 35103 ; Input: psdata_seg:SI -> $P_STRING_BUF + 35104 ; ES:BX -> CONTROL block + 35105 ; + 35106 ; Output: None + 35107 ; + 35108 ; Use: $P_Fill_Result, $P_Chk_DBCS + 35109 ; + 35110 ; Vars: $P_RC(W) + 35111 ;*********************************************************************** + 35112 + 35113 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35114 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35115 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35116 $P_Drive_Format: + 35117 000052A2 50 push ax ;AN000; + 35118 000052A3 52 push dx ;AN000; + 35119 000052A4 2E8A04 mov al,[cs:si] ;AN000; + 35120 000052A7 08C0 or al,al ;AN000; if null string + 35121 000052A9 7436 jz short $P_Drv_Exit ;AN000; do nothing + 35122 000052AB E81401 call $P_Chk_DBCS ;AN000; is it leading byte ? + 35123 000052AE 722A jc short $P_Drv_Err ;AN000; + 35124 ;cmp word [cs:si+1],3Ah ; $P_Colon ; ':' + 35125 000052B0 2E837C013A cmp word [cs:si+1],$P_Colon ;AN000; "d", ":", 0 ? + 35126 000052B5 740D je short $P_DrvF00 ;AN000; + 35127 ;test word [es:bx+$P_CONTROL_BLK.$P_Match_Flag],$P_Ig_Colon + 35128 ;test word [es:bx],10h ;AN000; colon can be ignored? + 35129 000052B7 26F60710 test byte [es:bx],$P_Ig_Colon ; 10h + 35130 000052BB 741D jz short $P_Drv_Err ;AN000; + 35131 000052BD 2E807C0100 cmp byte [cs:si+1],$P_NULL ;AN000; "d", 0 ? + 35132 000052C2 7516 jne short $P_Drv_Err ;AN000; + 35133 $P_DrvF00: ;AN000; + 35134 000052C4 0C20 or al,$P_Make_Lower ; 20h ;AN000; lower case + 35135 000052C6 3C61 cmp al,"a" ; 61h ;AN000; drive letter must + 35136 000052C8 7210 jb short $P_Drv_Err ;AN000; in range of + 35137 000052CA 3C7A cmp al,"z" ; 7Ah ;AN000; "a" - "z" + 35138 000052CC 770C ja short $P_Drv_Err ;AN000; if no, error + 35139 000052CE 2C60 sub al,"a"-1 ; 60h ;AN000; make text drive to binary drive + 35140 000052D0 88C2 mov dl,al ;AN000; set + 35141 ;mov ah,$P_No_Tag ; 0FFh ;AN000; result + 35142 ;mov al,$P_Drive ; 6 ;AN000; buffer + 35143 ; 05/04/2023 + 35144 000052D2 B806FF mov ax,($P_No_Tag<<8)+$P_Drive ; 06FFh + 35145 000052D5 E8D2F8 call $P_Fill_Result ;AN000; to drive + 35146 000052D8 EB07 jmp short $P_Drv_Exit ;AN000; + 35147 $P_Drv_Err: ;AN000; + 35148 000052DA 2EC706[BA97]0900 mov word [cs:$P_RC],$P_Syntax + 35149 ;mov word [cs:$P_RC],9 ;AC034; + 35150 $P_Drv_Exit: ;AN000; + 35151 000052E1 5A pop dx ;AN000; + 35152 000052E2 58 pop ax ;AN000; + 35153 000052E3 C3 retn ;AN000; + 35154 + 35155 ;*********************************************************************** + 35156 ; $P_Skip_Delim; 35157 ; - 35158 ; Input: DS:SI -> Command String - 35159 ; ES:DI -> Parameter List + 35158 ; Function: Skip delimiters specified in the PARMS list, white space + 35159 ; and comma. 35160 ; - 35161 ; Output: CY = 1 if the end of line encounterd - 35162 ; CY = 0 then SI move to 1st non-delimiter character - 35163 ; AL = Last examineed character - 35164 ; - 35165 ; Use: $P_Chk_EOL, $P_Chk_Delim, - 35166 ; - 35167 ; Vars: $P_Flags(R) - 35168 ;*********************************************************************** - 35169 - 35170 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35171 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35172 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35173 $P_Skip_Delim: ;AN000; - 35174 $P_Skip_Delim_Loop: ;AN000; - 35175 000052E4 AC lodsb ;AN000; - 35176 000052E5 E81E00 call $P_Chk_EOL ;AN000; is it EOL character ? - 35177 000052E8 7416 je short $P_Skip_Delim_CY ;AN000; if yes, exit w/ CY on - 35178 - 35179 000052EA E84B00 call $P_Chk_Delim ;AN000; is it one of delimiters ? - 35180 000052ED 7514 jne short $P_Skip_Delim_NCY ;AN000; if no, exit w/ CY off + 35161 ; Input: DS:SI -> Command String + 35162 ; ES:DI -> Parameter List + 35163 ; + 35164 ; Output: CY = 1 if the end of line encounterd + 35165 ; CY = 0 then SI move to 1st non-delimiter character + 35166 ; AL = Last examineed character + 35167 ; + 35168 ; Use: $P_Chk_EOL, $P_Chk_Delim, + 35169 ; + 35170 ; Vars: $P_Flags(R) + 35171 ;*********************************************************************** + 35172 + 35173 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35174 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35175 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35176 $P_Skip_Delim: ;AN000; + 35177 $P_Skip_Delim_Loop: ;AN000; + 35178 000052E4 AC lodsb ;AN000; + 35179 000052E5 E81E00 call $P_Chk_EOL ;AN000; is it EOL character ? + 35180 000052E8 7416 je short $P_Skip_Delim_CY ;AN000; if yes, exit w/ CY on 35181 - 35182 000052EF 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra - 35183 ;test byte [cs:$P_Flags2],20h ;AC034; extra delim or comma found ? - 35184 000052F5 74ED jz short $P_Skip_Delim_Loop - 35185 ;AN000; if no, loop - 35186 000052F7 2EF606[C697]41 test byte [cs:$P_Flags2],$P_SW+$P_equ - 35187 ;;test byte [cs:$P_Flags2],41h ;AC034; /x , or xxx=zzz , (tm08) - 35188 ;jz short $P_Exit_At_Extra ;AN000; no switch, no keyword (tm08) - 35189 ;dec si ; * ;AN000; backup si for next call (tm08) - 35190 ;;jmp short $P_Exit_At_Extra ;AN000; else exit w/ CY off - 35191 ; 05/04/2023 - 35192 000052FD 7505 jnz short $P_Skip_Delim_Exit ; cf = 0 - 35193 $P_Exit_At_Extra: ;AN000; - 35194 ; cf = 0 - 35195 ;clc ;AN000; indicate extra delim - 35196 000052FF C3 retn ;AN000; - 35197 - 35198 $P_Skip_Delim_CY: ;AN000; - 35199 00005300 F9 stc ;AN000; indicate EOL - 35200 00005301 EB01 jmp short $P_Skip_Delim_Exit - 35201 ;AN000; - 35202 $P_Skip_Delim_NCY: ;AN000; - 35203 00005303 F8 clc ;AN000; indicate non delim - 35204 $P_Skip_Delim_Exit: ;AN000; in this case, need - 35205 00005304 4E dec si ; * ;AN000; backup index pointer - 35206 00005305 C3 retn ;AN000; - 35207 ; 05/04/2023 - 35208 ;$P_Exit_At_Extra: ;AN000; - 35209 ;clc ;AN000; indicate extra delim - 35210 ;retn ;AN000; - 35211 - 35212 ;*********************************************************************** - 35213 ; $P_Chk_EOL; - 35214 ; - 35215 ; Function: Check if AL is one of End of Line characters. - 35216 ; - 35217 ; Input: AL = character code - 35218 ; ES:DI -> Parameter List + 35182 000052EA E84B00 call $P_Chk_Delim ;AN000; is it one of delimiters ? + 35183 000052ED 7514 jne short $P_Skip_Delim_NCY ;AN000; if no, exit w/ CY off + 35184 + 35185 000052EF 2EF606[C697]20 test byte [cs:$P_Flags2],$P_Extra + 35186 ;test byte [cs:$P_Flags2],20h ;AC034; extra delim or comma found ? + 35187 000052F5 74ED jz short $P_Skip_Delim_Loop + 35188 ;AN000; if no, loop + 35189 000052F7 2EF606[C697]41 test byte [cs:$P_Flags2],$P_SW+$P_equ + 35190 ;;test byte [cs:$P_Flags2],41h ;AC034; /x , or xxx=zzz , (tm08) + 35191 ;jz short $P_Exit_At_Extra ;AN000; no switch, no keyword (tm08) + 35192 ;dec si ; * ;AN000; backup si for next call (tm08) + 35193 ;;jmp short $P_Exit_At_Extra ;AN000; else exit w/ CY off + 35194 ; 05/04/2023 + 35195 000052FD 7505 jnz short $P_Skip_Delim_Exit ; cf = 0 + 35196 $P_Exit_At_Extra: ;AN000; + 35197 ; cf = 0 + 35198 ;clc ;AN000; indicate extra delim + 35199 000052FF C3 retn ;AN000; + 35200 + 35201 $P_Skip_Delim_CY: ;AN000; + 35202 00005300 F9 stc ;AN000; indicate EOL + 35203 00005301 EB01 jmp short $P_Skip_Delim_Exit + 35204 ;AN000; + 35205 $P_Skip_Delim_NCY: ;AN000; + 35206 00005303 F8 clc ;AN000; indicate non delim + 35207 $P_Skip_Delim_Exit: ;AN000; in this case, need + 35208 00005304 4E dec si ; * ;AN000; backup index pointer + 35209 00005305 C3 retn ;AN000; + 35210 ; 05/04/2023 + 35211 ;$P_Exit_At_Extra: ;AN000; + 35212 ;clc ;AN000; indicate extra delim + 35213 ;retn ;AN000; + 35214 + 35215 ;*********************************************************************** + 35216 ; $P_Chk_EOL; + 35217 ; + 35218 ; Function: Check if AL is one of End of Line characters. 35219 ; - 35220 ; Output: ZF = 1 if one of End of Line characters - 35221 ;*********************************************************************** - 35222 - 35223 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35224 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35225 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35226 $P_Chk_EOL: - 35227 00005306 53 push bx ;AN000; - 35228 00005307 51 push cx ;AN000; - 35229 00005308 3C0D cmp al,$P_CR ; 0Dh ;AN000; Carriage return ? - 35230 0000530A 7429 je short $P_Chk_EOL_Exit ;AN000; - 35231 0000530C 3C00 cmp al,$P_NULL ; 0 ;AN000; zero ? - 35232 0000530E 7425 je short $P_Chk_EOL_Exit ;AN000; - 35233 00005310 26807D0202 cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],$P_I_Have_EOL - 35234 ;cmp byte [es:di+2],2 ;AN000; EOL character specified ? - 35235 00005315 721E jb short $P_Chk_EOL_Exit ;AN000; - 35236 00005317 31DB xor bx,bx ;AN000; - 35237 00005319 268A5D03 mov bl,[es:di+$P_PARMS_BLK.$P_Len_Extra_Delim] - 35238 ;mov bl,[es:di+3] ;AN000; get length of delimiter list - 35239 0000531D 83C304 add bx,$P_Len_PARMS; 4 ;AN000; skip it - 35240 00005320 26803900 cmp byte [es:bx+di],$P_I_Use_Default - 35241 ;cmp byte [es:bx+di],0 ;AN000; No extra EOL character ? - 35242 00005324 740D je short $P_Chk_EOL_NZ ;AN000; - 35243 00005326 31C9 xor cx,cx ;AN000; Get number of extra chcracter - 35244 00005328 268A09 mov cl,[es:bx+di] ;AN000; - 35245 $P_Chk_EOL_Loop: ;AN000; - 35246 0000532B 43 inc bx ;AN000; - 35247 0000532C 263A01 cmp al,[es:bx+di] ;AN000; Check extra EOL character - 35248 0000532F 7404 je short $P_Chk_EOL_Exit ;AN000; - 35249 00005331 E2F8 loop $P_Chk_EOL_Loop ;AN000; - 35250 $P_Chk_EOL_NZ: ;AN000; - 35251 00005333 3C0D cmp al,$P_CR ; 0Dh ;AN000; reset ZF - 35252 $P_Chk_EOL_Exit: ;AN000; - 35253 00005335 59 pop cx ;AN000; - 35254 00005336 5B pop bx ;AN000; - 35255 00005337 C3 retn ;AN000; - 35256 - 35257 ;*********************************************************************** - 35258 ; $P_Chk_Delim; - 35259 ; - 35260 ; Function: Check if AL is one of delimiter characters. - 35261 ; if AL+[si] is DBCS blank, it is replaced with two SBCS - 35262 ; blanks. - 35263 ; - 35264 ; Input: AL = character code - 35265 ; DS:SI -> Next Character - 35266 ; ES:DI -> Parameter List - 35267 ; - 35268 ; Output: ZF = 1 if one of delimiter characters - 35269 ; SI points to the next character - 35270 ; Vars: $P_Terminator(W), $P_Flags(W) - 35271 ;*********************************************************************** - 35272 - 35273 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35274 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35275 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35276 $P_Chk_Delim: - 35277 00005338 53 push bx ;AN000; - 35278 00005339 51 push cx ;AN000; - 35279 0000533A 2EC606[C097]20 mov byte [cs:$P_Terminator],$P_Space ; 20h - 35280 ;AC034; Assume terminated by space - 35281 00005340 2E8026[C697]DF and byte [cs:$P_Flags2],0FFh-$P_Extra ; 0DFh - 35282 ;AC034; - 35283 00005346 3C20 cmp al,$P_Space ; 20h ; ' ' ;AN000; Space ? - 35284 00005348 7434 je short $P_Chk_Delim_Exit ;AN000; - 35285 - 35286 0000534A 3C09 cmp al,$P_TAB ; 09h ;AN000; TAB ? - 35287 0000534C 7430 je short $P_Chk_Delim_Exit ;AN000; + 35220 ; Input: AL = character code + 35221 ; ES:DI -> Parameter List + 35222 ; + 35223 ; Output: ZF = 1 if one of End of Line characters + 35224 ;*********************************************************************** + 35225 + 35226 ; 05/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35227 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35228 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35229 $P_Chk_EOL: + 35230 00005306 53 push bx ;AN000; + 35231 00005307 51 push cx ;AN000; + 35232 00005308 3C0D cmp al,$P_CR ; 0Dh ;AN000; Carriage return ? + 35233 0000530A 7429 je short $P_Chk_EOL_Exit ;AN000; + 35234 0000530C 3C00 cmp al,$P_NULL ; 0 ;AN000; zero ? + 35235 0000530E 7425 je short $P_Chk_EOL_Exit ;AN000; + 35236 00005310 26807D0202 cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],$P_I_Have_EOL + 35237 ;cmp byte [es:di+2],2 ;AN000; EOL character specified ? + 35238 00005315 721E jb short $P_Chk_EOL_Exit ;AN000; + 35239 00005317 31DB xor bx,bx ;AN000; + 35240 00005319 268A5D03 mov bl,[es:di+$P_PARMS_BLK.$P_Len_Extra_Delim] + 35241 ;mov bl,[es:di+3] ;AN000; get length of delimiter list + 35242 0000531D 83C304 add bx,$P_Len_PARMS; 4 ;AN000; skip it + 35243 00005320 26803900 cmp byte [es:bx+di],$P_I_Use_Default + 35244 ;cmp byte [es:bx+di],0 ;AN000; No extra EOL character ? + 35245 00005324 740D je short $P_Chk_EOL_NZ ;AN000; + 35246 00005326 31C9 xor cx,cx ;AN000; Get number of extra chcracter + 35247 00005328 268A09 mov cl,[es:bx+di] ;AN000; + 35248 $P_Chk_EOL_Loop: ;AN000; + 35249 0000532B 43 inc bx ;AN000; + 35250 0000532C 263A01 cmp al,[es:bx+di] ;AN000; Check extra EOL character + 35251 0000532F 7404 je short $P_Chk_EOL_Exit ;AN000; + 35252 00005331 E2F8 loop $P_Chk_EOL_Loop ;AN000; + 35253 $P_Chk_EOL_NZ: ;AN000; + 35254 00005333 3C0D cmp al,$P_CR ; 0Dh ;AN000; reset ZF + 35255 $P_Chk_EOL_Exit: ;AN000; + 35256 00005335 59 pop cx ;AN000; + 35257 00005336 5B pop bx ;AN000; + 35258 00005337 C3 retn ;AN000; + 35259 + 35260 ;*********************************************************************** + 35261 ; $P_Chk_Delim; + 35262 ; + 35263 ; Function: Check if AL is one of delimiter characters. + 35264 ; if AL+[si] is DBCS blank, it is replaced with two SBCS + 35265 ; blanks. + 35266 ; + 35267 ; Input: AL = character code + 35268 ; DS:SI -> Next Character + 35269 ; ES:DI -> Parameter List + 35270 ; + 35271 ; Output: ZF = 1 if one of delimiter characters + 35272 ; SI points to the next character + 35273 ; Vars: $P_Terminator(W), $P_Flags(W) + 35274 ;*********************************************************************** + 35275 + 35276 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35277 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35278 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35279 $P_Chk_Delim: + 35280 00005338 53 push bx ;AN000; + 35281 00005339 51 push cx ;AN000; + 35282 0000533A 2EC606[C097]20 mov byte [cs:$P_Terminator],$P_Space ; 20h + 35283 ;AC034; Assume terminated by space + 35284 00005340 2E8026[C697]DF and byte [cs:$P_Flags2],0FFh-$P_Extra ; 0DFh + 35285 ;AC034; + 35286 00005346 3C20 cmp al,$P_Space ; 20h ; ' ' ;AN000; Space ? + 35287 00005348 7434 je short $P_Chk_Delim_Exit ;AN000; 35288 - 35289 0000534E 3C2C cmp al,$P_Comma ; ',' ;AN000; Comma ? - 35290 00005350 742F je short $P_Chk_Delim_Exit0 - 35291 ;AN000; - 35292 $P_Chk_Delim00: ;AN000; - 35293 00005352 3C20 cmp al,20h ; $P_DBSP1 ;AN000; 1st byte of DBCS Space ? - 35294 00005354 750C jne short $P_Chk_Delim01 ;AN000; - 35295 00005356 803C20 cmp byte [si],20h ; $P_DBSP2 - 35296 ;AN000; 2nd byte of DBCS Space ? - 35297 00005359 7507 jne short $P_Chk_Delim01 ;AN000; - 35298 0000535B B020 mov al,$P_Space ; 20h ;AN000; - 35299 0000535D 46 inc si ;AN000; make si point to next character - 35300 0000535E 38C0 cmp al,al ;AN000; Set ZF - 35301 00005360 EB1C jmp short $P_Chk_Delim_Exit ;AN000; - 35302 - 35303 $P_Chk_Delim01: ;AN000; - 35304 ;cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],$P_I_Have_Delim - 35305 00005362 26807D0201 cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],1 - 35306 ;cmp byte [es:di+2],1 ;AN000; delimiter character specified ? - 35307 00005367 7215 jb short $P_Chk_Delim_Exit ;AN000; - 35308 - 35309 00005369 31C9 xor cx,cx ;AN000; - 35310 0000536B 268A4D03 mov cl,[es:di+$P_PARMS_BLK.$P_Len_Extra_Delim] - 35311 ;mov cl,[esi:di+3] ;AN000; get length of delimiter list - 35312 ;or cx,cx ;AN000; No extra Delim character ? - 35313 ;jz short $P_Chk_Delim_NZ ;AN000; - 35314 ; 12/08/2024 - PCDOS 7.1 COMMAND.COM - 35315 0000536F E30B jcxz $P_Chk_Delim_NZ - 35316 - 35317 00005371 BB0300 mov bx,$P_Len_PARMS-1 ; 3 ;AN000; set bx to 1st extra delimiter - 35318 $P_Chk_Delim_Loop: ;AN000; - 35319 00005374 43 inc bx ;AN000; - 35320 00005375 263A01 cmp al,[es:bx+di] ;AN000; Check extra Delim character - 35321 00005378 7407 je short $P_Chk_Delim_Exit0 - 35322 ;AN000; - 35323 0000537A E2F8 loop $P_Chk_Delim_Loop ;AN000; examine all extra delimiter - 35324 - 35325 $P_Chk_Delim_NZ: ;AN000; - 35326 0000537C 3C20 cmp al,$P_Space ; 20h ;AN000; reset ZF - 35327 $P_Chk_Delim_Exit: ;AN000; - 35328 0000537E 59 pop cx ;AN000; - 35329 0000537F 5B pop bx ;AN000; - 35330 00005380 C3 retn ;AN000; - 35331 - 35332 $P_Chk_Delim_Exit0: ;AN000; - 35333 00005381 2EA2[C097] mov [cs:$P_Terminator],al ;AC034; keep terminated delimiter - 35334 00005385 2EF606[C697]01 test byte [cs:$P_Flags2],$P_equ - 35335 ;test byte [cs:$P_Flags2],1 ;AN027;AC034;; if terminating a key= - 35336 0000538B 7506 jnz short $P_No_Set_Extra ;AN027; then do not set the EXTRA bit - 35337 - 35338 0000538D 2E800E[C697]20 or byte [cs:$P_Flags2],$P_Extra ; 20h - 35339 ;or byte [cs:$P_Flags2],20h ;AC034; flag terminated extra delimiter or comma - 35340 $P_No_Set_Extra: ;AN027; - 35341 00005393 38C0 cmp al,al ;AN000; set ZF - 35342 00005395 EBE7 jmp short $P_Chk_Delim_Exit ;AN000; - 35343 - 35344 ;*********************************************************************** - 35345 ; $P_Chk_Switch; - 35346 ; - 35347 ; Function: Check if AL is the switch character not in first position of - 35348 ; $P_STRING_BUF + 35289 0000534A 3C09 cmp al,$P_TAB ; 09h ;AN000; TAB ? + 35290 0000534C 7430 je short $P_Chk_Delim_Exit ;AN000; + 35291 + 35292 0000534E 3C2C cmp al,$P_Comma ; ',' ;AN000; Comma ? + 35293 00005350 742F je short $P_Chk_Delim_Exit0 + 35294 ;AN000; + 35295 $P_Chk_Delim00: ;AN000; + 35296 00005352 3C20 cmp al,20h ; $P_DBSP1 ;AN000; 1st byte of DBCS Space ? + 35297 00005354 750C jne short $P_Chk_Delim01 ;AN000; + 35298 00005356 803C20 cmp byte [si],20h ; $P_DBSP2 + 35299 ;AN000; 2nd byte of DBCS Space ? + 35300 00005359 7507 jne short $P_Chk_Delim01 ;AN000; + 35301 0000535B B020 mov al,$P_Space ; 20h ;AN000; + 35302 0000535D 46 inc si ;AN000; make si point to next character + 35303 0000535E 38C0 cmp al,al ;AN000; Set ZF + 35304 00005360 EB1C jmp short $P_Chk_Delim_Exit ;AN000; + 35305 + 35306 $P_Chk_Delim01: ;AN000; + 35307 ;cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],$P_I_Have_Delim + 35308 00005362 26807D0201 cmp byte [es:di+$P_PARMS_BLK.$P_Num_Extra],1 + 35309 ;cmp byte [es:di+2],1 ;AN000; delimiter character specified ? + 35310 00005367 7215 jb short $P_Chk_Delim_Exit ;AN000; + 35311 + 35312 00005369 31C9 xor cx,cx ;AN000; + 35313 0000536B 268A4D03 mov cl,[es:di+$P_PARMS_BLK.$P_Len_Extra_Delim] + 35314 ;mov cl,[esi:di+3] ;AN000; get length of delimiter list + 35315 ;or cx,cx ;AN000; No extra Delim character ? + 35316 ;jz short $P_Chk_Delim_NZ ;AN000; + 35317 ; 12/08/2024 - PCDOS 7.1 COMMAND.COM + 35318 0000536F E30B jcxz $P_Chk_Delim_NZ + 35319 + 35320 00005371 BB0300 mov bx,$P_Len_PARMS-1 ; 3 ;AN000; set bx to 1st extra delimiter + 35321 $P_Chk_Delim_Loop: ;AN000; + 35322 00005374 43 inc bx ;AN000; + 35323 00005375 263A01 cmp al,[es:bx+di] ;AN000; Check extra Delim character + 35324 00005378 7407 je short $P_Chk_Delim_Exit0 + 35325 ;AN000; + 35326 0000537A E2F8 loop $P_Chk_Delim_Loop ;AN000; examine all extra delimiter + 35327 + 35328 $P_Chk_Delim_NZ: ;AN000; + 35329 0000537C 3C20 cmp al,$P_Space ; 20h ;AN000; reset ZF + 35330 $P_Chk_Delim_Exit: ;AN000; + 35331 0000537E 59 pop cx ;AN000; + 35332 0000537F 5B pop bx ;AN000; + 35333 00005380 C3 retn ;AN000; + 35334 + 35335 $P_Chk_Delim_Exit0: ;AN000; + 35336 00005381 2EA2[C097] mov [cs:$P_Terminator],al ;AC034; keep terminated delimiter + 35337 00005385 2EF606[C697]01 test byte [cs:$P_Flags2],$P_equ + 35338 ;test byte [cs:$P_Flags2],1 ;AN027;AC034;; if terminating a key= + 35339 0000538B 7506 jnz short $P_No_Set_Extra ;AN027; then do not set the EXTRA bit + 35340 + 35341 0000538D 2E800E[C697]20 or byte [cs:$P_Flags2],$P_Extra ; 20h + 35342 ;or byte [cs:$P_Flags2],20h ;AC034; flag terminated extra delimiter or comma + 35343 $P_No_Set_Extra: ;AN027; + 35344 00005393 38C0 cmp al,al ;AN000; set ZF + 35345 00005395 EBE7 jmp short $P_Chk_Delim_Exit ;AN000; + 35346 + 35347 ;*********************************************************************** + 35348 ; $P_Chk_Switch; 35349 ; - 35350 ; Input: AL = character code - 35351 ; BX = current pointer within $P_String_Buf - 35352 ; SI =>next char on command line (following the one in AL) - 35353 ; - 35354 ; Output: CF = 1 (set)if AL is switch character, and not in first - 35355 ; position, and has no chance of being part of a date string, - 35356 ; i.e. should be treated as a delimiter. - 35357 ; - 35358 ; CF = 0 (reset, cleared) if AL is not a switch char, is in the first - 35359 ; position, or is a slash but may be part of a date string, i.e. - 35360 ; should not be treated as a delimiter. - 35361 ; - 35362 ; Vars: $P_Terminator(W) - 35363 ; - 35364 ; Use: $P_0099 - 35365 ;*********************************************************************** - 35366 - 35367 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35368 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35369 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35370 $P_Chk_Switch: - 35371 ; 18/04/2023 - 35372 00005397 8D2E[CF97] lea bp,$P_STRING_BUF ;AN020;AC034; BP=OFFSET of $P_String_Buf even in group addressing - 35373 - 35374 0000539B 39EB cmp bx,bp ;AN000; - 35375 0000539D 7418 je short $P_STRUC_L2 ;AN000; + 35350 ; Function: Check if AL is the switch character not in first position of + 35351 ; $P_STRING_BUF + 35352 ; + 35353 ; Input: AL = character code + 35354 ; BX = current pointer within $P_String_Buf + 35355 ; SI =>next char on command line (following the one in AL) + 35356 ; + 35357 ; Output: CF = 1 (set)if AL is switch character, and not in first + 35358 ; position, and has no chance of being part of a date string, + 35359 ; i.e. should be treated as a delimiter. + 35360 ; + 35361 ; CF = 0 (reset, cleared) if AL is not a switch char, is in the first + 35362 ; position, or is a slash but may be part of a date string, i.e. + 35363 ; should not be treated as a delimiter. + 35364 ; + 35365 ; Vars: $P_Terminator(W) + 35366 ; + 35367 ; Use: $P_0099 + 35368 ;*********************************************************************** + 35369 + 35370 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35371 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35372 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35373 $P_Chk_Switch: + 35374 ; 18/04/2023 + 35375 00005397 8D2E[CF97] lea bp,$P_STRING_BUF ;AN020;AC034; BP=OFFSET of $P_String_Buf even in group addressing 35376 - 35377 0000539F 3C2F cmp al,$P_Switch ; '/' ;AN000; - 35378 000053A1 7512 jne short $P_STRUC_L5 ;AN000; + 35377 0000539B 39EB cmp bx,bp ;AN000; + 35378 0000539D 7418 je short $P_STRUC_L2 ;AN000; 35379 - 35380 000053A3 F9 stc ;AN020;not in first position and is slash, now see if might be in date string - 35381 000053A4 50 push ax ;AN020;save input char - 35382 000053A5 2E8A47FF mov al,[cs:bx-1] ;AN026;AL=char before the current char - 35383 000053A9 E8FBFA call $P_0099 ;AN020;return carry set if not numeric - 35384 000053AC 7205 jc short $P_STRUC_L7 ;AN000; - 35385 - 35386 000053AE 8A04 mov al,[si] ;AN020;AL=char after the current char - 35387 000053B0 E8F4FA call $P_0099 ;AN020;return carry set if not numeric - 35388 $P_STRUC_L7: ;AN000; - 35389 000053B3 58 pop ax ;AN020;restore AL to input char - 35390 ;jmp short $P_STRUC_L1 ;AN000; - 35391 ; 18/04/2023 - 35392 000053B4 C3 retn - 35393 - 35394 $P_STRUC_L5: ;AN000; - 35395 000053B5 F8 clc ;AN020;not a slash - 35396 ;jmp short $P_STRUC_L1 ;AN000; - 35397 ;18/04/2023 - 35398 000053B6 C3 retn - 35399 - 35400 $P_STRUC_L2: ;AN000; - 35401 000053B7 3C2F cmp al,$P_Switch ; '/' ;AN000; - 35402 ;jne short $P_STRUC_L12 ;AN000; - 35403 ; 18/04/2023 - 35404 000053B9 75FA jne short $P_STRUC_L5 - 35405 - 35406 000053BB 2E800E[C697]40 or byte [cs:$P_Flags2],$P_SW - 35407 ;or byte [cs:$P_Flags2],40h ;AN020;AC034;;could be valid switch, first char and is slash - 35408 ; 18/04/2023 - 35409 ;$P_STRUC_L12: ;AN000; - 35410 ;clc ;AN020;CF=0 indicating first char - 35411 $P_STRUC_L1: ;AN000; - 35412 000053C1 C3 retn ;AN000; - 35413 - 35414 ;************************************************************************** - 35415 ; $P_Chk_DBCS: - 35416 ; - 35417 ; Function: Check if a specified byte is in ranges of the DBCS lead bytes - 35418 ; - 35419 ; Input: - 35420 ; AL = Code to be examineed + 35380 0000539F 3C2F cmp al,$P_Switch ; '/' ;AN000; + 35381 000053A1 7512 jne short $P_STRUC_L5 ;AN000; + 35382 + 35383 000053A3 F9 stc ;AN020;not in first position and is slash, now see if might be in date string + 35384 000053A4 50 push ax ;AN020;save input char + 35385 000053A5 2E8A47FF mov al,[cs:bx-1] ;AN026;AL=char before the current char + 35386 000053A9 E8FBFA call $P_0099 ;AN020;return carry set if not numeric + 35387 000053AC 7205 jc short $P_STRUC_L7 ;AN000; + 35388 + 35389 000053AE 8A04 mov al,[si] ;AN020;AL=char after the current char + 35390 000053B0 E8F4FA call $P_0099 ;AN020;return carry set if not numeric + 35391 $P_STRUC_L7: ;AN000; + 35392 000053B3 58 pop ax ;AN020;restore AL to input char + 35393 ;jmp short $P_STRUC_L1 ;AN000; + 35394 ; 18/04/2023 + 35395 000053B4 C3 retn + 35396 + 35397 $P_STRUC_L5: ;AN000; + 35398 000053B5 F8 clc ;AN020;not a slash + 35399 ;jmp short $P_STRUC_L1 ;AN000; + 35400 ;18/04/2023 + 35401 000053B6 C3 retn + 35402 + 35403 $P_STRUC_L2: ;AN000; + 35404 000053B7 3C2F cmp al,$P_Switch ; '/' ;AN000; + 35405 ;jne short $P_STRUC_L12 ;AN000; + 35406 ; 18/04/2023 + 35407 000053B9 75FA jne short $P_STRUC_L5 + 35408 + 35409 000053BB 2E800E[C697]40 or byte [cs:$P_Flags2],$P_SW + 35410 ;or byte [cs:$P_Flags2],40h ;AN020;AC034;;could be valid switch, first char and is slash + 35411 ; 18/04/2023 + 35412 ;$P_STRUC_L12: ;AN000; + 35413 ;clc ;AN020;CF=0 indicating first char + 35414 $P_STRUC_L1: ;AN000; + 35415 000053C1 C3 retn ;AN000; + 35416 + 35417 ;************************************************************************** + 35418 ; $P_Chk_DBCS: + 35419 ; + 35420 ; Function: Check if a specified byte is in ranges of the DBCS lead bytes 35421 ; - 35422 ; Output: - 35423 ; If CF is on then a lead byte of DBCS + 35422 ; Input: + 35423 ; AL = Code to be examineed 35424 ; - 35425 ; Use: INT 21h w/AH=63 - 35426 ; - 35427 ; Vars: $P_DBCSEV_Seg(RW), $P_DBCSEV_Off(RW) - 35428 ;*************************************************************************** - 35429 - 35430 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35431 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35432 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35433 $P_Chk_DBCS: - 35434 000053C2 1E push ds ;AN000; - 35435 000053C3 56 push si ;AN000; - 35436 000053C4 53 push bx ;AN000; (tm11) - 35437 000053C5 2E833E[C397]00 cmp word [cs:$P_DBCSEV_SEG],0 - 35438 ;AC034; ALREADY SET ? - 35439 000053CB 7527 jne short $P_DBCS00 ;AN000; - 35440 000053CD 50 push ax ;AN000; - 35441 000053CE 1E push ds ;AN000; (tm11) - 35442 000053CF 51 push cx ;AN000; - 35443 000053D0 52 push dx ;AN000; - 35444 000053D1 57 push di ;AN000; - 35445 000053D2 55 push bp ;AN000; - 35446 000053D3 06 push es ;AN000; - 35447 000053D4 31F6 xor si,si ;AN000; - 35448 000053D6 8EDE mov ds,si ;AN000; - 35449 ;mov ax,$P_DOS_GetEV ;AN000; GET DBCS EV CALL - 35450 000053D8 B80063 mov ax,6300h - 35451 000053DB CD21 int 21h ;AN000; - 35452 000053DD 8CDB mov bx,ds ;AN000; (tm11) - 35453 000053DF 09DB or bx,bx ;AN000; (tm11) - 35454 000053E1 07 pop es ;AN000; - 35455 000053E2 5D pop bp ;AN000; - 35456 000053E3 5F pop di ;AN000; - 35457 000053E4 5A pop dx ;AN000; - 35458 000053E5 59 pop cx ;AN000; - 35459 000053E6 1F pop ds ;AN000; (tm11) - 35460 000053E7 58 pop ax ;AN000; - 35461 000053E8 7424 jz short $P_NON_DBCS ;AN000; - 35462 $P_DBCS02: ;AN000; - 35463 000053EA 2E8936[C197] mov [cs:$P_DBCSEV_OFF],si ;AC034; save EV offset - 35464 000053EF 2E891E[C397] mov [cs:$P_DBCSEV_SEG],bx ;AC034; save EV segment (tm11) - 35465 $P_DBCS00: ;AN000; - 35466 ;mov si,[cs:$P_DBCSEV_OFF] ;AC034; load EV offset - 35467 ;mov ds,[cs:$P_DBCSEV_SEG] ;AC034; and segment - 35468 ; 12/08/2024 - PCDOS 7.1 COMMAND.COM - 35469 000053F4 2EC536[C197] lds si,[cs:$P_DBCSEV_OFF] - 35470 $P_DBCS_LOOP: ;AN000; - 35471 000053F9 833C00 cmp word [si],0 ;AN000; zero vector ? - 35472 000053FC 7410 je short $P_NON_DBCS ;AN000; then exit - 35473 000053FE 3A04 cmp al,[si] ;AN000; - 35474 00005400 7208 jb short $P_DBCS01 ;AN000; Check if AL is in - 35475 00005402 3A4401 cmp al,[si+1] ;AN000; range of - 35476 00005405 7703 ja short $P_DBCS01 ;AN000; the vector - 35477 00005407 F9 stc ;AN000; if yes, indicate DBCS and exit - 35478 00005408 EB04 jmp short $P_DBCS_EXIT ;AN000; - 35479 $P_DBCS01: ;AN000; - 35480 0000540A 46 inc si ;AC035; add '2' to - 35481 0000540B 46 inc si ;AC035; SI reg - 35482 ;AN000; get next vector - 35483 0000540C EBEB jmp short $P_DBCS_LOOP ;AN000; loop until zero vector found - 35484 - 35485 $P_NON_DBCS: ;AN000; - 35486 ; 18/04/2023 - 35487 ; cf=0 - 35488 ;clc ;AN000; indicate SBCS - 35489 $P_DBCS_EXIT: ;AN000; - 35490 0000540E 5B pop bx ;AN000; (tm11) - 35491 0000540F 5E pop si ;AN000; - 35492 00005410 1F pop ds ;AN000; - 35493 00005411 C3 retn ;AN000; - 35494 - 35495 ;============================================================================ - 35496 ; TPARSE.ASM, MSDOS 6.0, 1991 - 35497 ;============================================================================ - 35498 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35499 - 35500 ; **************************************************************** - 35501 ; * - 35502 ; * ROUTINE: CMD_PARSE - 35503 ; * - 35504 ; * FUNCTION: Interface for transient COMMAND to invoke - 35505 ; * SYSPARSE. + 35425 ; Output: + 35426 ; If CF is on then a lead byte of DBCS + 35427 ; + 35428 ; Use: INT 21h w/AH=63 + 35429 ; + 35430 ; Vars: $P_DBCSEV_Seg(RW), $P_DBCSEV_Off(RW) + 35431 ;*************************************************************************** + 35432 + 35433 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35434 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35435 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35436 $P_Chk_DBCS: + 35437 000053C2 1E push ds ;AN000; + 35438 000053C3 56 push si ;AN000; + 35439 000053C4 53 push bx ;AN000; (tm11) + 35440 000053C5 2E833E[C397]00 cmp word [cs:$P_DBCSEV_SEG],0 + 35441 ;AC034; ALREADY SET ? + 35442 000053CB 7527 jne short $P_DBCS00 ;AN000; + 35443 000053CD 50 push ax ;AN000; + 35444 000053CE 1E push ds ;AN000; (tm11) + 35445 000053CF 51 push cx ;AN000; + 35446 000053D0 52 push dx ;AN000; + 35447 000053D1 57 push di ;AN000; + 35448 000053D2 55 push bp ;AN000; + 35449 000053D3 06 push es ;AN000; + 35450 000053D4 31F6 xor si,si ;AN000; + 35451 000053D6 8EDE mov ds,si ;AN000; + 35452 ;mov ax,$P_DOS_GetEV ;AN000; GET DBCS EV CALL + 35453 000053D8 B80063 mov ax,6300h + 35454 000053DB CD21 int 21h ;AN000; + 35455 000053DD 8CDB mov bx,ds ;AN000; (tm11) + 35456 000053DF 09DB or bx,bx ;AN000; (tm11) + 35457 000053E1 07 pop es ;AN000; + 35458 000053E2 5D pop bp ;AN000; + 35459 000053E3 5F pop di ;AN000; + 35460 000053E4 5A pop dx ;AN000; + 35461 000053E5 59 pop cx ;AN000; + 35462 000053E6 1F pop ds ;AN000; (tm11) + 35463 000053E7 58 pop ax ;AN000; + 35464 000053E8 7424 jz short $P_NON_DBCS ;AN000; + 35465 $P_DBCS02: ;AN000; + 35466 000053EA 2E8936[C197] mov [cs:$P_DBCSEV_OFF],si ;AC034; save EV offset + 35467 000053EF 2E891E[C397] mov [cs:$P_DBCSEV_SEG],bx ;AC034; save EV segment (tm11) + 35468 $P_DBCS00: ;AN000; + 35469 ;mov si,[cs:$P_DBCSEV_OFF] ;AC034; load EV offset + 35470 ;mov ds,[cs:$P_DBCSEV_SEG] ;AC034; and segment + 35471 ; 12/08/2024 - PCDOS 7.1 COMMAND.COM + 35472 000053F4 2EC536[C197] lds si,[cs:$P_DBCSEV_OFF] + 35473 $P_DBCS_LOOP: ;AN000; + 35474 000053F9 833C00 cmp word [si],0 ;AN000; zero vector ? + 35475 000053FC 7410 je short $P_NON_DBCS ;AN000; then exit + 35476 000053FE 3A04 cmp al,[si] ;AN000; + 35477 00005400 7208 jb short $P_DBCS01 ;AN000; Check if AL is in + 35478 00005402 3A4401 cmp al,[si+1] ;AN000; range of + 35479 00005405 7703 ja short $P_DBCS01 ;AN000; the vector + 35480 00005407 F9 stc ;AN000; if yes, indicate DBCS and exit + 35481 00005408 EB04 jmp short $P_DBCS_EXIT ;AN000; + 35482 $P_DBCS01: ;AN000; + 35483 0000540A 46 inc si ;AC035; add '2' to + 35484 0000540B 46 inc si ;AC035; SI reg + 35485 ;AN000; get next vector + 35486 0000540C EBEB jmp short $P_DBCS_LOOP ;AN000; loop until zero vector found + 35487 + 35488 $P_NON_DBCS: ;AN000; + 35489 ; 18/04/2023 + 35490 ; cf=0 + 35491 ;clc ;AN000; indicate SBCS + 35492 $P_DBCS_EXIT: ;AN000; + 35493 0000540E 5B pop bx ;AN000; (tm11) + 35494 0000540F 5E pop si ;AN000; + 35495 00005410 1F pop ds ;AN000; + 35496 00005411 C3 retn ;AN000; + 35497 + 35498 ;============================================================================ + 35499 ; TPARSE.ASM, MSDOS 6.0, 1991 + 35500 ;============================================================================ + 35501 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35502 + 35503 ; **************************************************************** + 35504 ; * + 35505 ; * ROUTINE: CMD_PARSE 35506 ; * - 35507 ; * INPUT: inputs to SYSPARSE - 35508 ; * - 35509 ; * OUTPUT: outputs from SYSPARSE - 35510 ; * - 35511 ; **************************************************************** - 35512 - 35513 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35514 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4FF7h - 35515 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM - 35516 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:57BBh - 35517 - 35518 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35519 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5647h - 35520 ;cmd_parse: - 35521 ;call sysparse ;AN000; - 35522 ;retn ;AN000; - 35523 ; 06/04/2023 - 35524 ;jmp sysparse - 35525 - 35526 append_parse: - 35527 00005412 E857F5 call sysparse ;AN010; - 35528 00005415 CB retf ;AN010; - 35529 - 35530 ;============================================================================ - 35531 ; TPRINTF.ASM, MSDOS 6.0, 1991 - 35532 ;============================================================================ - 35533 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35534 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35535 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35536 - 35537 ; ---------------------------- - 35538 ; MSDOS 6.0, MSGSERV.ASM, 1991 - 35539 ; ---------------------------- - 35540 - 35541 ;; Replacable parameters are described by a sublist structure - 35542 - 35543 struc $M_SUBLIST_STRUC ;;AN000;; - 35544 00000000 ?? .$M_S_SIZE: resb 1 ;;AN000;; SUBLIST size (PTR to next SUBLIST) - 35545 00000001 ?? .$M_S_RESV: resb 1 ;;AN000;; RESERVED - 35546 00000002 ???????? .$M_S_VALUE: resd 1 ;;AN000;; Time, Date or PTR to data item - 35547 00000006 ?? .$M_S_ID: resb 1 ;;AN000;; n of %n - 35548 00000007 ?? .$M_S_FLAG: resb 1 ;;AN000;; Data-type flags - 35549 00000008 ?? .$M_S_MAXW: resb 1 ;;AN000;; Maximum field width - 35550 00000009 ?? .$M_S_MINW: resb 1 ;;AN000;; Minimum field width - 35551 0000000A ?? .$M_S_PAD: resb 1 ;;AN000;; Character for Pad field - 35552 endstruc - 35553 - 35554 ; --------------------------------------------------------------------------- - 35555 ; --------------------------------------------------------------------------- + 35507 ; * FUNCTION: Interface for transient COMMAND to invoke + 35508 ; * SYSPARSE. + 35509 ; * + 35510 ; * INPUT: inputs to SYSPARSE + 35511 ; * + 35512 ; * OUTPUT: outputs from SYSPARSE + 35513 ; * + 35514 ; **************************************************************** + 35515 + 35516 ; 06/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35517 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:4FF7h + 35518 ; 14/06/2023 - Retro DOS v4.2 COMMAND.COM + 35519 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:57BBh + 35520 + 35521 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35522 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5647h + 35523 ;cmd_parse: + 35524 ;call sysparse ;AN000; + 35525 ;retn ;AN000; + 35526 ; 06/04/2023 + 35527 ;jmp sysparse + 35528 + 35529 append_parse: + 35530 00005412 E857F5 call sysparse ;AN010; + 35531 00005415 CB retf ;AN010; + 35532 + 35533 ;============================================================================ + 35534 ; TPRINTF.ASM, MSDOS 6.0, 1991 + 35535 ;============================================================================ + 35536 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35537 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35538 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35539 + 35540 ; ---------------------------- + 35541 ; MSDOS 6.0, MSGSERV.ASM, 1991 + 35542 ; ---------------------------- + 35543 + 35544 ;; Replacable parameters are described by a sublist structure + 35545 + 35546 struc $M_SUBLIST_STRUC ;;AN000;; + 35547 00000000 ?? .$M_S_SIZE: resb 1 ;;AN000;; SUBLIST size (PTR to next SUBLIST) + 35548 00000001 ?? .$M_S_RESV: resb 1 ;;AN000;; RESERVED + 35549 00000002 ???????? .$M_S_VALUE: resd 1 ;;AN000;; Time, Date or PTR to data item + 35550 00000006 ?? .$M_S_ID: resb 1 ;;AN000;; n of %n + 35551 00000007 ?? .$M_S_FLAG: resb 1 ;;AN000;; Data-type flags + 35552 00000008 ?? .$M_S_MAXW: resb 1 ;;AN000;; Maximum field width + 35553 00000009 ?? .$M_S_MINW: resb 1 ;;AN000;; Minimum field width + 35554 0000000A ?? .$M_S_PAD: resb 1 ;;AN000;; Character for Pad field + 35555 endstruc 35556 - 35557 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35558 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 4FFFh + 35557 ; --------------------------------------------------------------------------- + 35558 ; --------------------------------------------------------------------------- 35559 - 35560 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35561 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 57C3h + 35560 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35561 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 4FFFh 35562 - 35563 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35564 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 564Fh + 35563 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35564 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 57C3h 35565 - 35566 Printf_Init: - 35567 00005416 E80F00 call std_printf - 35568 00005419 CB retf - 35569 - 35570 Printf_Crlf: - 35571 0000541A E80B00 call std_printf - 35572 ;call CRLF2 - 35573 ;retn - 35574 ; 07/04/2023 - 35575 0000541D E959D5 jmp CRLF2 - 35576 - 35577 ;**************************************************************** - 35578 ;* - 35579 ;* ROUTINE: STD_PRINTF/STD_EPRINTF - 35580 ;* - 35581 ;* FUNCTION: Set up to print out a message using SYSDISPMSG. - 35582 ;* Set up substitutions if utility message. Make - 35583 ;* sure any changes to message variables in TDATA - 35584 ;* are reset to avoid reloading the transient. - 35585 ;* - 35586 ;* INPUT: Msg_Disp_Class - set to message class - 35587 ;* Msg_Cont_Flag - set to control flags - 35588 ;* DS points to transient segment - 35589 ;* - 35590 ;* if utility message: - 35591 ;* DX points to a block with message number - 35592 ;* (word), number of substitutions (byte), - 35593 ;* followed by substitution list if there - 35594 ;* are substitutions. If substitutions - 35595 ;* are not in transient segment they must - 35596 ;* be set. - 35597 ;* else - 35598 ;* AX set to message number - 35599 ;* - 35600 ;* OUTPUT: none - 35601 ;* - 35602 ;**************************************************************** - 35603 - 35604 std_eprintf: - 35605 00005420 C706[2199]0200 mov word [PRINTF_HANDLE],2 ;AC000;Print to STDERR - 35606 00005426 EB06 jmp short new_printf ;AC000; - 35607 - 35608 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35609 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 5012h + 35566 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35567 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 564Fh + 35568 + 35569 Printf_Init: + 35570 00005416 E80F00 call std_printf + 35571 00005419 CB retf + 35572 + 35573 Printf_Crlf: + 35574 0000541A E80B00 call std_printf + 35575 ;call CRLF2 + 35576 ;retn + 35577 ; 07/04/2023 + 35578 0000541D E959D5 jmp CRLF2 + 35579 + 35580 ;**************************************************************** + 35581 ;* + 35582 ;* ROUTINE: STD_PRINTF/STD_EPRINTF + 35583 ;* + 35584 ;* FUNCTION: Set up to print out a message using SYSDISPMSG. + 35585 ;* Set up substitutions if utility message. Make + 35586 ;* sure any changes to message variables in TDATA + 35587 ;* are reset to avoid reloading the transient. + 35588 ;* + 35589 ;* INPUT: Msg_Disp_Class - set to message class + 35590 ;* Msg_Cont_Flag - set to control flags + 35591 ;* DS points to transient segment + 35592 ;* + 35593 ;* if utility message: + 35594 ;* DX points to a block with message number + 35595 ;* (word), number of substitutions (byte), + 35596 ;* followed by substitution list if there + 35597 ;* are substitutions. If substitutions + 35598 ;* are not in transient segment they must + 35599 ;* be set. + 35600 ;* else + 35601 ;* AX set to message number + 35602 ;* + 35603 ;* OUTPUT: none + 35604 ;* + 35605 ;**************************************************************** + 35606 + 35607 std_eprintf: + 35608 00005420 C706[2199]0200 mov word [PRINTF_HANDLE],2 ;AC000;Print to STDERR + 35609 00005426 EB06 jmp short new_printf ;AC000; 35610 - 35611 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35612 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 57D6h + 35611 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35612 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 5012h 35613 - 35614 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35615 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 5662h + 35614 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35615 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 57D6h 35616 - 35617 std_printf: - 35618 00005428 C706[2199]0100 mov word [PRINTF_HANDLE],1 ;AC000;Print to STDOUT + 35617 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35618 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 5662h 35619 - 35620 new_printf: - 35621 0000542E 50 push ax ;AN000;save registers - 35622 0000542F 53 push bx ;AN000; - 35623 00005430 51 push cx ;AN000; - 35624 00005431 06 push es ;AN000;get local ES - 35625 00005432 1E push ds ;AN000; - 35626 00005433 07 pop es ;AN000; - 35627 00005434 57 push di ;AN000; - 35628 00005435 56 push si ;AN000; - 35629 00005436 52 push dx ;AN000; - 35630 - 35631 ; 07/04/2023 - 35632 ;mov word [print_err_flag],0 ;AN000; - 35633 00005437 31C9 xor cx,cx - 35634 00005439 890E[379F] mov [print_err_flag],cx ; 0 - 35635 - 35636 0000543D 89D6 mov si,dx ;AN000;Get offset of message number - 35637 0000543F AD lodsw ;AN000;load message number - 35638 ; 15/06/2023 - 35639 ;push ax ;AN000;save it - 35640 ;lodsb ;AN000;get number of substitutions - 35641 ;mov cl,al ;AN000;set up CX as # of subst - 35642 ;; 07/04/2023 - 35643 ;;xor ch,ch ;AN000;SI now points to subst list - 35644 ;pop ax ;AN000;get message number back - 35645 ; 15/06/2023 - 35646 00005440 8A0C mov cl,[si] - 35647 00005442 46 inc si - 35648 - 35649 ;cmp cx,0 ;AN000;Any substitutions? - 35650 ; 07/04/2023 - 35651 ;and cx,cx - 35652 ;jz short ready_to_print ;AN000;No - continue - 35653 ; 12/08/2024 - 35654 00005443 E35C jcxz ready_to_print - 35655 - 35656 00005445 BF[399F] mov di,subst_buffer ;AN061; Get address of message subst buffer - 35657 00005448 57 push di ;AN061; save it - 35658 00005449 51 push cx ;AN061; save number of subst - 35659 - 35660 move_subst: - 35661 0000544A 51 push cx ;AN061;save number of subst - 35662 0000544B 89F3 mov bx,si ;AN061;save start of sublist - 35663 ;mov cx,parm_block_size ; 11 ;AN061;get size of sublist - 35664 ; 07/04/2023 - 35665 0000544D B10B mov cl,parm_block_size ; 11 - 35666 0000544F F3A4 rep movsb ;AN061;move sublist - 35667 ;test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],date_type - 35668 00005451 F6470704 test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],4 - 35669 ;test byte [bx+7],4 ;AN061;are we doing date/time? - 35670 00005455 7406 jz short move_subst_cont ;AN061;no - no need to reset - 35671 ;mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE],0 - 35672 ;mov word [bx+2],0 ;AN061;reset original date or time to 0 - 35673 00005457 894F02 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE],cx ; 0 - 35674 ;mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],0 - 35675 ;mov word [bx+4],0 ;AN061; - 35676 0000545A 894F04 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],cx ; 0 - 35677 - 35678 move_subst_cont: ;AN061; - 35679 0000545D 59 pop cx ;AN061;get number of subst back - 35680 0000545E E2EA loop move_subst ;AN061;move cx sublists - 35681 - 35682 00005460 59 pop cx ;AN061;get number of subst - 35683 00005461 50 push ax ;AN061;save message number - 35684 00005462 803E[D58F]FF cmp byte [msg_disp_class],util_msg_class - 35685 ;cmp byte [msg_disp_class],0FFh ;AN061;Is this a utility message - 35686 00005467 740C je short check_fix ;AN061;YES - go see if substitutions - 35687 ;mov byte [msg_flag],1 ; ext_msg_class - 35688 00005469 C606[339F]01 mov byte [msg_flag],ext_msg_class ;AN061;set message flag - 35689 0000546E BF[D78F] mov di,extend_buf_ptr ;AN061; Get address of extended message block - 35690 00005471 31C0 xor ax,ax ;AN061;clear ax register - 35691 00005473 AB stosw ;AN061;clear out message number - 35692 00005474 AA stosb ;AN061;clear out subst count - 35693 - 35694 check_fix: ;AN061; - 35695 00005475 58 pop ax ;AN061;get message number back - 35696 00005476 5F pop di ;AN061;get start of sublists - 35697 00005477 89FE mov si,di ;AN061;get into SI for msgserv - 35698 00005479 89F3 mov bx,si ;AN061;get into BX for addressing - 35699 0000547B 51 push cx ;AN061;save number of subst - 35700 - 35701 set_subst: ;AN061;store the segment of the subst - 35702 0000547C 837F0400 cmp word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],0 - 35703 ;cmp word [bx+4],0 ;AN061;was it set already? - 35704 00005480 7509 jnz short subst_seg_set ;AN061;if not 0, don't replace it - 35705 00005482 F6470704 test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],4 - 35706 ;test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],date_type - 35707 ;test byte [bx+7],4 ;AN061;don't replace if date or time - 35708 00005486 7503 jnz short subst_seg_set ;AN061;yes - skip it - 35709 00005488 8C4F04 mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],cs - 35710 ;mov word [bx+4],cs ;AN061;set segment value - 35711 - 35712 subst_seg_set: ;AN061; - 35713 0000548B 83C30B add bx,parm_block_size ; add bx,11 ;AN061;go to next sublist - 35714 0000548E E2EC loop set_subst ;AN061;loop CX times - 35715 00005490 59 pop cx ;AN061;get number of subst back - 35716 - 35717 00005491 89F3 mov bx,si ;AN061;get start of sublist to BX - 35718 00005493 817F02[A09D] cmp word [bx+$M_SUBLIST_STRUC.$M_S_VALUE],string_ptr_2 - 35719 ;cmp word [bx+2],string_ptr_2 ;AN061;are we using double indirection? - 35720 00005498 7507 jne short ready_to_print ;AN061;no - we already have address - 35721 ; 01/05/2023 - 35722 0000549A 8B16[A09D] mov dx,[string_ptr_2] ;AN061;get address in string_ptr_2 - 35723 0000549E 895702 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE],dx - 35724 ;AN061;put it into the subst block - 35725 ;mov [bx+2],dx - 35726 - 35727 ready_to_print: - 35728 000054A1 8B1E[2199] mov bx,[PRINTF_HANDLE] ;AN000;get print handle - 35729 000054A5 8A16[D68F] mov dl,[msg_cont_flag] ;AN000;set up control flag - 35730 000054A9 8A36[D58F] mov dh,[msg_disp_class] ;AN000;set up display class - 35731 000054AD C606[D68F]00 mov byte [msg_cont_flag],0 ; no_cont_flag - 35732 ;AN061;reset flags to avoid - 35733 000054B2 C606[D58F]FF mov byte [msg_disp_class],util_msg_class - 35734 ;mov byte [msg_disp_class],0FFh ;AN061; transient reload - 35735 - 35736 000054B7 1E push ds ;AN026; - 35737 000054B8 06 push es ;AN026; + 35620 std_printf: + 35621 00005428 C706[2199]0100 mov word [PRINTF_HANDLE],1 ;AC000;Print to STDOUT + 35622 + 35623 new_printf: + 35624 0000542E 50 push ax ;AN000;save registers + 35625 0000542F 53 push bx ;AN000; + 35626 00005430 51 push cx ;AN000; + 35627 00005431 06 push es ;AN000;get local ES + 35628 00005432 1E push ds ;AN000; + 35629 00005433 07 pop es ;AN000; + 35630 00005434 57 push di ;AN000; + 35631 00005435 56 push si ;AN000; + 35632 00005436 52 push dx ;AN000; + 35633 + 35634 ; 07/04/2023 + 35635 ;mov word [print_err_flag],0 ;AN000; + 35636 00005437 31C9 xor cx,cx + 35637 00005439 890E[379F] mov [print_err_flag],cx ; 0 + 35638 + 35639 0000543D 89D6 mov si,dx ;AN000;Get offset of message number + 35640 0000543F AD lodsw ;AN000;load message number + 35641 ; 15/06/2023 + 35642 ;push ax ;AN000;save it + 35643 ;lodsb ;AN000;get number of substitutions + 35644 ;mov cl,al ;AN000;set up CX as # of subst + 35645 ;; 07/04/2023 + 35646 ;;xor ch,ch ;AN000;SI now points to subst list + 35647 ;pop ax ;AN000;get message number back + 35648 ; 15/06/2023 + 35649 00005440 8A0C mov cl,[si] + 35650 00005442 46 inc si + 35651 + 35652 ;cmp cx,0 ;AN000;Any substitutions? + 35653 ; 07/04/2023 + 35654 ;and cx,cx + 35655 ;jz short ready_to_print ;AN000;No - continue + 35656 ; 12/08/2024 + 35657 00005443 E35C jcxz ready_to_print + 35658 + 35659 00005445 BF[399F] mov di,subst_buffer ;AN061; Get address of message subst buffer + 35660 00005448 57 push di ;AN061; save it + 35661 00005449 51 push cx ;AN061; save number of subst + 35662 + 35663 move_subst: + 35664 0000544A 51 push cx ;AN061;save number of subst + 35665 0000544B 89F3 mov bx,si ;AN061;save start of sublist + 35666 ;mov cx,parm_block_size ; 11 ;AN061;get size of sublist + 35667 ; 07/04/2023 + 35668 0000544D B10B mov cl,parm_block_size ; 11 + 35669 0000544F F3A4 rep movsb ;AN061;move sublist + 35670 ;test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],date_type + 35671 00005451 F6470704 test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],4 + 35672 ;test byte [bx+7],4 ;AN061;are we doing date/time? + 35673 00005455 7406 jz short move_subst_cont ;AN061;no - no need to reset + 35674 ;mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE],0 + 35675 ;mov word [bx+2],0 ;AN061;reset original date or time to 0 + 35676 00005457 894F02 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE],cx ; 0 + 35677 ;mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],0 + 35678 ;mov word [bx+4],0 ;AN061; + 35679 0000545A 894F04 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],cx ; 0 + 35680 + 35681 move_subst_cont: ;AN061; + 35682 0000545D 59 pop cx ;AN061;get number of subst back + 35683 0000545E E2EA loop move_subst ;AN061;move cx sublists + 35684 + 35685 00005460 59 pop cx ;AN061;get number of subst + 35686 00005461 50 push ax ;AN061;save message number + 35687 00005462 803E[D58F]FF cmp byte [msg_disp_class],util_msg_class + 35688 ;cmp byte [msg_disp_class],0FFh ;AN061;Is this a utility message + 35689 00005467 740C je short check_fix ;AN061;YES - go see if substitutions + 35690 ;mov byte [msg_flag],1 ; ext_msg_class + 35691 00005469 C606[339F]01 mov byte [msg_flag],ext_msg_class ;AN061;set message flag + 35692 0000546E BF[D78F] mov di,extend_buf_ptr ;AN061; Get address of extended message block + 35693 00005471 31C0 xor ax,ax ;AN061;clear ax register + 35694 00005473 AB stosw ;AN061;clear out message number + 35695 00005474 AA stosb ;AN061;clear out subst count + 35696 + 35697 check_fix: ;AN061; + 35698 00005475 58 pop ax ;AN061;get message number back + 35699 00005476 5F pop di ;AN061;get start of sublists + 35700 00005477 89FE mov si,di ;AN061;get into SI for msgserv + 35701 00005479 89F3 mov bx,si ;AN061;get into BX for addressing + 35702 0000547B 51 push cx ;AN061;save number of subst + 35703 + 35704 set_subst: ;AN061;store the segment of the subst + 35705 0000547C 837F0400 cmp word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],0 + 35706 ;cmp word [bx+4],0 ;AN061;was it set already? + 35707 00005480 7509 jnz short subst_seg_set ;AN061;if not 0, don't replace it + 35708 00005482 F6470704 test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],4 + 35709 ;test byte [bx+$M_SUBLIST_STRUC.$M_S_FLAG],date_type + 35710 ;test byte [bx+7],4 ;AN061;don't replace if date or time + 35711 00005486 7503 jnz short subst_seg_set ;AN061;yes - skip it + 35712 00005488 8C4F04 mov word [bx+$M_SUBLIST_STRUC.$M_S_VALUE+2],cs + 35713 ;mov word [bx+4],cs ;AN061;set segment value + 35714 + 35715 subst_seg_set: ;AN061; + 35716 0000548B 83C30B add bx,parm_block_size ; add bx,11 ;AN061;go to next sublist + 35717 0000548E E2EC loop set_subst ;AN061;loop CX times + 35718 00005490 59 pop cx ;AN061;get number of subst back + 35719 + 35720 00005491 89F3 mov bx,si ;AN061;get start of sublist to BX + 35721 00005493 817F02[A09D] cmp word [bx+$M_SUBLIST_STRUC.$M_S_VALUE],string_ptr_2 + 35722 ;cmp word [bx+2],string_ptr_2 ;AN061;are we using double indirection? + 35723 00005498 7507 jne short ready_to_print ;AN061;no - we already have address + 35724 ; 01/05/2023 + 35725 0000549A 8B16[A09D] mov dx,[string_ptr_2] ;AN061;get address in string_ptr_2 + 35726 0000549E 895702 mov [bx+$M_SUBLIST_STRUC.$M_S_VALUE],dx + 35727 ;AN061;put it into the subst block + 35728 ;mov [bx+2],dx + 35729 + 35730 ready_to_print: + 35731 000054A1 8B1E[2199] mov bx,[PRINTF_HANDLE] ;AN000;get print handle + 35732 000054A5 8A16[D68F] mov dl,[msg_cont_flag] ;AN000;set up control flag + 35733 000054A9 8A36[D58F] mov dh,[msg_disp_class] ;AN000;set up display class + 35734 000054AD C606[D68F]00 mov byte [msg_cont_flag],0 ; no_cont_flag + 35735 ;AN061;reset flags to avoid + 35736 000054B2 C606[D58F]FF mov byte [msg_disp_class],util_msg_class + 35737 ;mov byte [msg_disp_class],0FFh ;AN061; transient reload 35738 - 35739 000054B9 E83702 call SYSDISPMSG ;AN000;call Rod - 35740 - 35741 000054BC 07 pop es ;AN026; restore registers - 35742 000054BD 1F pop ds ;AN026; + 35739 000054B7 1E push ds ;AN026; + 35740 000054B8 06 push es ;AN026; + 35741 + 35742 000054B9 E83702 call SYSDISPMSG ;AN000;call Rod 35743 - 35744 000054BE 7303 jnc short print_success ;AN000; everything went okay - 35745 000054C0 A3[379F] mov [print_err_flag],ax ;AN000; + 35744 000054BC 07 pop es ;AN026; restore registers + 35745 000054BD 1F pop ds ;AN026; 35746 - 35747 print_success: - 35748 000054C3 5A pop dx ;AN061;restore dx - 35749 000054C4 5E pop si ;AN000;restore registers - 35750 000054C5 5F pop di ;AN000; - 35751 000054C6 07 pop es ;AN000;restore registers - 35752 000054C7 59 pop cx ;AN000; - 35753 000054C8 5B pop bx ;AN000; - 35754 000054C9 58 pop ax ;AN000; - 35755 000054CA 833E[379F]00 cmp word [print_err_flag],0 ;AN000; if an error occurred - handle it - 35756 000054CF 7501 jnz short print_err ;AN000; - 35757 - 35758 000054D1 C3 retn ;AC000; - 35759 - 35760 print_err: - 35761 000054D2 0E push cs - 35762 000054D3 07 pop es - 35763 000054D4 833E[2199]02 cmp word [PRINTF_HANDLE],2 ;AN026;Print to STDERR? - 35764 000054D9 7503 jne short not_stderr ;AN026;no - continue - 35765 000054DB E926AC jmp TCOMMAND ;AN026;Yes - hopless - just exit - 35766 - 35767 not_stderr: - 35768 000054DE A1[379F] mov ax,[print_err_flag] ;AN026;get extended error number back - 35769 000054E1 8E06[F59B] mov es,[RESSEG] ; No, set up for error, load the - 35770 ; right error msg, and jmp to cerror. - 35771 000054E5 26F606[1303]FF test byte [es:PipeFlag],-1 ; 0FFh - 35772 000054EB 7408 jz short _go_to_error - 35773 000054ED E8B7DE call PipeOff - 35774 000054F0 BA[5D91] mov dx,PIPEEMES_PTR - 35775 000054F3 EB0B jmp short print_err_exit ;AC000; - 35776 - 35777 _go_to_error: - 35778 000054F5 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class - 35779 ;mov byte [msg_disp_class],1 ;AN000; set up extended error msg class - 35780 000054FA BA[D78F] mov dx,extend_buf_ptr ;AC000; get extended message pointer - 35781 000054FD A3[D78F] mov [extend_buf_ptr],ax ;AN000; get message number in control block - 35782 - 35783 print_err_exit: ;AC000; - 35784 00005500 0E push cs - 35785 00005501 07 pop es - 35786 00005502 E921D8 jmp cerror - 35787 - 35788 ;**************************************************************** - 35789 ;* - 35790 ;* ROUTINE: TSYSLOADMSG - 35791 ;* - 35792 ;* FUNCTION: Interface to call SYSLOADMSG to avoid duplicate - 35793 ;* names since these routines are also used in the - 35794 ;* resident. - 35795 ;* - 35796 ;* INPUT: Inputs to SYSLOADMSG - 35797 ;* - 35798 ;* OUTPUT: Outputs from SYSLOADMSG - 35799 ;* - 35800 ;**************************************************************** - 35801 - 35802 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35803 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35804 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35805 TSYSLOADMSG: - 35806 00005505 53 push bx ;AN000; - 35807 00005506 E80800 call SYSLOADMSG ;AN000; call routine - 35808 00005509 5B pop bx ;AN000; - 35809 0000550A C3 retn ;AN000; exit - 35810 - 35811 ;**************************************************************** - 35812 ;* - 35813 ;* ROUTINE: TSYSGETMSG - 35814 ;* - 35815 ;* FUNCTION: Interface to call SYSGETMSG to avoid duplicate - 35816 ;* names since these routines are also used in the - 35817 ;* resident. - 35818 ;* - 35819 ;* INPUT: Inputs to SYSGETMSG - 35820 ;* - 35821 ;* OUTPUT: Outputs from SYSGETMSG - 35822 ;* - 35823 ;**************************************************************** - 35824 - 35825 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35826 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35827 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 35828 TSYSGETMSG: - 35829 0000550B 51 push cx ;AN000; - 35830 0000550C E8B500 call SYSGETMSG ;AN000; call routine - 35831 0000550F 59 pop cx ;AN000; - 35832 00005510 C3 retn ;AN000; exit - 35833 - 35834 ;============================================================================ - 35835 ; MSGSERV.ASM, MSDOS 6.0, 1991 - 35836 ;============================================================================ - 35837 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35838 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 35839 - 35840 ; --------------------------------------------------------------------------- - 35841 ; MODULE NAME: MSGSERV.SAL - 35842 ; - 35843 ; DESCRIPTIVE NAME: Message Services SALUT file - 35844 ; - 35845 ; FUNCTION: This module incorporates all the messages services and - 35846 ; is called upon at build time to INCLUDE the code requested - 35847 ; by a utility. Code is requested using the macro MSG_SERVICES. - 35848 ; - 35849 ; ENTRY POINT: Since this a collection of subroutines, entry point is at - 35850 ; requested procedure. + 35747 000054BE 7303 jnc short print_success ;AN000; everything went okay + 35748 000054C0 A3[379F] mov [print_err_flag],ax ;AN000; + 35749 + 35750 print_success: + 35751 000054C3 5A pop dx ;AN061;restore dx + 35752 000054C4 5E pop si ;AN000;restore registers + 35753 000054C5 5F pop di ;AN000; + 35754 000054C6 07 pop es ;AN000;restore registers + 35755 000054C7 59 pop cx ;AN000; + 35756 000054C8 5B pop bx ;AN000; + 35757 000054C9 58 pop ax ;AN000; + 35758 000054CA 833E[379F]00 cmp word [print_err_flag],0 ;AN000; if an error occurred - handle it + 35759 000054CF 7501 jnz short print_err ;AN000; + 35760 + 35761 000054D1 C3 retn ;AC000; + 35762 + 35763 print_err: + 35764 000054D2 0E push cs + 35765 000054D3 07 pop es + 35766 000054D4 833E[2199]02 cmp word [PRINTF_HANDLE],2 ;AN026;Print to STDERR? + 35767 000054D9 7503 jne short not_stderr ;AN026;no - continue + 35768 000054DB E926AC jmp TCOMMAND ;AN026;Yes - hopless - just exit + 35769 + 35770 not_stderr: + 35771 000054DE A1[379F] mov ax,[print_err_flag] ;AN026;get extended error number back + 35772 000054E1 8E06[F59B] mov es,[RESSEG] ; No, set up for error, load the + 35773 ; right error msg, and jmp to cerror. + 35774 000054E5 26F606[1303]FF test byte [es:PipeFlag],-1 ; 0FFh + 35775 000054EB 7408 jz short _go_to_error + 35776 000054ED E8B7DE call PipeOff + 35777 000054F0 BA[5D91] mov dx,PIPEEMES_PTR + 35778 000054F3 EB0B jmp short print_err_exit ;AC000; + 35779 + 35780 _go_to_error: + 35781 000054F5 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class + 35782 ;mov byte [msg_disp_class],1 ;AN000; set up extended error msg class + 35783 000054FA BA[D78F] mov dx,extend_buf_ptr ;AC000; get extended message pointer + 35784 000054FD A3[D78F] mov [extend_buf_ptr],ax ;AN000; get message number in control block + 35785 + 35786 print_err_exit: ;AC000; + 35787 00005500 0E push cs + 35788 00005501 07 pop es + 35789 00005502 E921D8 jmp cerror + 35790 + 35791 ;**************************************************************** + 35792 ;* + 35793 ;* ROUTINE: TSYSLOADMSG + 35794 ;* + 35795 ;* FUNCTION: Interface to call SYSLOADMSG to avoid duplicate + 35796 ;* names since these routines are also used in the + 35797 ;* resident. + 35798 ;* + 35799 ;* INPUT: Inputs to SYSLOADMSG + 35800 ;* + 35801 ;* OUTPUT: Outputs from SYSLOADMSG + 35802 ;* + 35803 ;**************************************************************** + 35804 + 35805 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35806 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35807 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35808 TSYSLOADMSG: + 35809 00005505 53 push bx ;AN000; + 35810 00005506 E80800 call SYSLOADMSG ;AN000; call routine + 35811 00005509 5B pop bx ;AN000; + 35812 0000550A C3 retn ;AN000; exit + 35813 + 35814 ;**************************************************************** + 35815 ;* + 35816 ;* ROUTINE: TSYSGETMSG + 35817 ;* + 35818 ;* FUNCTION: Interface to call SYSGETMSG to avoid duplicate + 35819 ;* names since these routines are also used in the + 35820 ;* resident. + 35821 ;* + 35822 ;* INPUT: Inputs to SYSGETMSG + 35823 ;* + 35824 ;* OUTPUT: Outputs from SYSGETMSG + 35825 ;* + 35826 ;**************************************************************** + 35827 + 35828 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35829 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35830 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 35831 TSYSGETMSG: + 35832 0000550B 51 push cx ;AN000; + 35833 0000550C E8B500 call SYSGETMSG ;AN000; call routine + 35834 0000550F 59 pop cx ;AN000; + 35835 00005510 C3 retn ;AN000; exit + 35836 + 35837 ;============================================================================ + 35838 ; MSGSERV.ASM, MSDOS 6.0, 1991 + 35839 ;============================================================================ + 35840 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35841 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 35842 + 35843 ; --------------------------------------------------------------------------- + 35844 ; MODULE NAME: MSGSERV.SAL + 35845 ; + 35846 ; DESCRIPTIVE NAME: Message Services SALUT file + 35847 ; + 35848 ; FUNCTION: This module incorporates all the messages services and + 35849 ; is called upon at build time to INCLUDE the code requested + 35850 ; by a utility. Code is requested using the macro MSG_SERVICES. 35851 ; - 35852 ; INPUT: Since this a collection of subroutines, input is dependent on - 35853 ; function requested. + 35852 ; ENTRY POINT: Since this a collection of subroutines, entry point is at + 35853 ; requested procedure. 35854 ; - 35855 ; EXIT-NORMAL: In all cases, CARRY FLAG = 0 - 35856 ; - 35857 ; EXIT-ERROR: In all cases, CARRY FLAG = 1 - 35858 ; - 35859 ; INTERNAL REFERENCES: (list of included subroutines) - 35860 ; - 35861 ; - SYSLOADMSG - 35862 ; - SYSDISPMSG - 35863 ; - SYSGETMSG - 35864 ; - 35865 ; EXTERNAL REFERENCES: None - 35866 ; - 35867 ; NOTES: At build time, some modules must be included. These are only included - 35868 ; once using assembler switches. Other logic is included at the request - 35869 ; of the utility. - 35870 ; - 35871 ; COMR and COMT are assembler switches to conditionally assemble code - 35872 ; for RESIDENT COMMAND.COM and TRANSIENT COMMAND.COM to reduce resident - 35873 ; storage and multiple EQUates. - 35874 ; - 35875 ; REVISION HISTORY: Created MAY 1987 - 35876 ; - 35877 ; Label: DOS - - Message Retriever - 35878 ; (c) Copyright 1988 Microsoft - 35879 ; --------------------------------------------------------------------------- - 35880 - 35881 ; Revision History - 35882 ; ================ - 35883 ; - 35884 ; M007 SR 08/24/90 Fixed bug #1818 -- changed - 35885 ; $M_DISPLAY_H_STRING to properly - 35886 ; handle Ctrl-Z being passed - 35887 ; - 35888 ; M013 SR 9/12/90 Make SETSTDIO flag false so that all - 35889 ; these routines are no longer assembled. + 35855 ; INPUT: Since this a collection of subroutines, input is dependent on + 35856 ; function requested. + 35857 ; + 35858 ; EXIT-NORMAL: In all cases, CARRY FLAG = 0 + 35859 ; + 35860 ; EXIT-ERROR: In all cases, CARRY FLAG = 1 + 35861 ; + 35862 ; INTERNAL REFERENCES: (list of included subroutines) + 35863 ; + 35864 ; - SYSLOADMSG + 35865 ; - SYSDISPMSG + 35866 ; - SYSGETMSG + 35867 ; + 35868 ; EXTERNAL REFERENCES: None + 35869 ; + 35870 ; NOTES: At build time, some modules must be included. These are only included + 35871 ; once using assembler switches. Other logic is included at the request + 35872 ; of the utility. + 35873 ; + 35874 ; COMR and COMT are assembler switches to conditionally assemble code + 35875 ; for RESIDENT COMMAND.COM and TRANSIENT COMMAND.COM to reduce resident + 35876 ; storage and multiple EQUates. + 35877 ; + 35878 ; REVISION HISTORY: Created MAY 1987 + 35879 ; + 35880 ; Label: DOS - - Message Retriever + 35881 ; (c) Copyright 1988 Microsoft + 35882 ; --------------------------------------------------------------------------- + 35883 + 35884 ; Revision History + 35885 ; ================ + 35886 ; + 35887 ; M007 SR 08/24/90 Fixed bug #1818 -- changed + 35888 ; $M_DISPLAY_H_STRING to properly + 35889 ; handle Ctrl-Z being passed 35890 ; - 35891 ; M016 SR 10/14/90 Bug #3380. Changed SYSLOADMSG so that - 35892 ; CR-LF string also gets reinitialized - 35893 ; on every cycle. - 35894 ; - 35895 ; M020 SR 10/26/90 Bug #3380 again. Initialize $M_DIVISOR - 35896 ; & $_MSG_NUM also in SYSLOADMSG. - 35897 - 35898 ; --------------------------------------------------------------------------- - 35899 - 35900 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 35901 - 35902 ;;; Replacable parameters are described by a sublist structure - 35903 ; - 35904 ;struc $M_SUBLIST_STRUC ;;AN000;; - 35905 ; .$M_S_SIZE: resb 1 ;;AN000;; SUBLIST size (PTR to next SUBLIST) - 35906 ; .$M_S_RESV: resb 1 ;;AN000;; RESERVED - 35907 ; .$M_S_VALUE: resd 1 ;;AN000;; Time, Date or PTR to data item - 35908 ; .$M_S_ID: resb 1 ;;AN000;; n of %n - 35909 ; .$M_S_FLAG: resb 1 ;;AN000;; Data-type flags - 35910 ; .$M_S_MAXW: resb 1 ;;AN000;; Maximum field width - 35911 ; .$M_S_MINW: resb 1 ;;AN000;; Minimum field width - 35912 ; .$M_S_PAD: resb 1 ;;AN000;; Character for Pad field - 35913 ;endstruc - 35914 - 35915 ;; Each class will be defined by this structure. - 35916 - 35917 struc $M_CLASS_ID ;;AN000;; - 35918 00000000 ?? .$M_CLS_ID: resb 1 ;;AN000;; Class identifer - 35919 00000001 ???? .$M_COMMAND_VER: resw 1 ;;AN003;; COMMAND.COM version check - 35920 00000003 ?? .$M_NUM_CLS_MSG: resb 1 ;;AN000;; Total number of message in class - 35921 .size: - 35922 endstruc - 35923 - 35924 $M_CLASS_ID_SZ EQU $M_CLASS_ID.size ;;AN000;; - 35925 - 35926 ;; Each message will be defined by this structure. - 35927 - 35928 struc $M_ID ;;AN000;; - 35929 00000000 ???? .$M_NUM: resw 1 ;;AN000;; Message Number - 35930 00000002 ???? .$M_TXT_PTR: resw 1 ;;AN000;; Pointer to message text - 35931 .size: - 35932 endstruc - 35933 - 35934 $M_ID_SZ EQU $M_ID.size ;;AN000;; - 35935 - 35936 ; --------------------------- - 35937 ; MSDOS 6.0, SYSMSG.INC, 1991 - 35938 ; --------------------------- - 35939 $M_TEMP_BUF_SZ EQU 64 ;; Size of temporary buffer ;AN003; - 35940 - 35941 ; --------------------------- - 35942 - 35943 ; 07/04/2023 - 35944 $M_NUM_CLS equ 3 + 35891 ; M013 SR 9/12/90 Make SETSTDIO flag false so that all + 35892 ; these routines are no longer assembled. + 35893 ; + 35894 ; M016 SR 10/14/90 Bug #3380. Changed SYSLOADMSG so that + 35895 ; CR-LF string also gets reinitialized + 35896 ; on every cycle. + 35897 ; + 35898 ; M020 SR 10/26/90 Bug #3380 again. Initialize $M_DIVISOR + 35899 ; & $_MSG_NUM also in SYSLOADMSG. + 35900 + 35901 ; --------------------------------------------------------------------------- + 35902 + 35903 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 35904 + 35905 ;;; Replacable parameters are described by a sublist structure + 35906 ; + 35907 ;struc $M_SUBLIST_STRUC ;;AN000;; + 35908 ; .$M_S_SIZE: resb 1 ;;AN000;; SUBLIST size (PTR to next SUBLIST) + 35909 ; .$M_S_RESV: resb 1 ;;AN000;; RESERVED + 35910 ; .$M_S_VALUE: resd 1 ;;AN000;; Time, Date or PTR to data item + 35911 ; .$M_S_ID: resb 1 ;;AN000;; n of %n + 35912 ; .$M_S_FLAG: resb 1 ;;AN000;; Data-type flags + 35913 ; .$M_S_MAXW: resb 1 ;;AN000;; Maximum field width + 35914 ; .$M_S_MINW: resb 1 ;;AN000;; Minimum field width + 35915 ; .$M_S_PAD: resb 1 ;;AN000;; Character for Pad field + 35916 ;endstruc + 35917 + 35918 ;; Each class will be defined by this structure. + 35919 + 35920 struc $M_CLASS_ID ;;AN000;; + 35921 00000000 ?? .$M_CLS_ID: resb 1 ;;AN000;; Class identifer + 35922 00000001 ???? .$M_COMMAND_VER: resw 1 ;;AN003;; COMMAND.COM version check + 35923 00000003 ?? .$M_NUM_CLS_MSG: resb 1 ;;AN000;; Total number of message in class + 35924 .size: + 35925 endstruc + 35926 + 35927 $M_CLASS_ID_SZ EQU $M_CLASS_ID.size ;;AN000;; + 35928 + 35929 ;; Each message will be defined by this structure. + 35930 + 35931 struc $M_ID ;;AN000;; + 35932 00000000 ???? .$M_NUM: resw 1 ;;AN000;; Message Number + 35933 00000002 ???? .$M_TXT_PTR: resw 1 ;;AN000;; Pointer to message text + 35934 .size: + 35935 endstruc + 35936 + 35937 $M_ID_SZ EQU $M_ID.size ;;AN000;; + 35938 + 35939 ; --------------------------- + 35940 ; MSDOS 6.0, SYSMSG.INC, 1991 + 35941 ; --------------------------- + 35942 $M_TEMP_BUF_SZ EQU 64 ;; Size of temporary buffer ;AN003; + 35943 + 35944 ; --------------------------- 35945 - 35946 ;; Resident data area definition of variables - 35947 - 35948 struc $M_RES_ADDRS ;;AN000;; - 35949 00000000 ???????? .$M_EXT_ERR_ADDRS: resd 1 ;;AN000;; Allow pointers to THREE Extended error locations - 35950 00000004 ???????? .$M_EXT_FILE: resd 1 ;;AN001;; - 35951 00000008 ???????? .$M_EXT_COMMAND: resd 1 ;;AN000;; - 35952 0000000C ???????? .$M_EXT_TERM: resd 1 ;;AN000;; - 35953 00000010 ???????? .$M_PARSE_COMMAND: resd 1 ;;AN000;; - 35954 00000014 ???????? .$M_PARSE_ADDRS: resd 1 ;;AN000;; Allow pointers to TWO Parse error locations - 35955 00000018 ???????? .$M_PARSE_TERM: resd 1 ;;AN000;; - 35956 0000001C ???????? .$M_CRIT_ADDRS: resd 1 ;;AN000;; Allow pointers to TWO Critical error locations - 35957 00000020 ???????? .$M_CRIT_COMMAND: resd 1 ;;AN000;; - 35958 00000024 ???????? .$M_CRIT_TERM: resd 1 ;;AN000;; - 35959 00000028 ???????? .$M_DISK_PROC_ADDR: resd 1 ;;AN004;; Address of READ_DISK_PROC - 35960 0000002C .$M_CLASS_ADDRS: resd $M_NUM_CLS ; 3 ;;AN000;; Allow pointers to specified classes - 35961 00000038 ???????? .$M_CLS_TERM: resd 1 ;;AN000;; - 35962 0000003C ???????? .$M_DBCS_VEC: resd 1 ;;AN000;; Save DBCS vector - 35963 00000040 ???? .$M_HANDLE: resw 1 ;;AN000;; - 35964 00000042 ?? .$M_SIZE: resb 1 ;;AN000;; - 35965 00000043 ???? .$M_CRLF: resb 2 ;;AN004;; CR LF message - 35966 00000045 ?? .$M_CLASS: resb 1 ;;AN004;; Saved class - 35967 00000046 ???? .$M_RETURN_ADDR: resw 1 ;;AN000;; - 35968 00000048 ???? .$M_MSG_NUM: resw 1 ;;AN000;; - 35969 0000004A ???? .$M_DIVISOR: resw 1 ;;AN000;; Default = 10 (must be a WORD for division) - 35970 0000004C .$M_TEMP_BUF: resb $M_TEMP_BUF_SZ ;;AN000;; Temporary buffer - 35971 0000008C ?? .$M_BUF_TERM: resb 1 ;;AN000;; - 35972 .size: - 35973 endstruc ;;AN000;; - 35974 - 35975 $M_RES_ADDRS_SZ EQU $M_RES_ADDRS.size ;;AN000;; - 35976 - 35977 ;; Important fields of the Get Country Information call - 35978 - 35979 struc $M_COUNTRY_INFO ;;AN000;; Expected Country infomation - 35980 00000000 .$M_HEADER: resb $M_RES_ADDRS_SZ-$M_TEMP_BUF_SZ-1 - 35981 ;;AN000;; Go past first part of struc - 35982 0000004C ???? .$M_DATE_FORMAT: resw 1 ;;AN000;; <------- Date Format - 35983 0000004E ?????????? .$M_CURR_SEPARA: resb 5 ;;AN000;; - 35984 00000053 ???? .$M_THOU_SEPARA: resb 2 ;;AN000;; <------- Thou Separator - 35985 00000055 ???? .$M_DECI_SEPARA: resb 2 ;;AN000;; <------- Decimal Separator - 35986 00000057 ???? .$M_DATE_SEPARA: resb 2 ;;AN000;; <------- Date Separator - 35987 00000059 ???? .$M_TIME_SEPARA: resb 2 ;;AN000;; <------- Time Separator - 35988 0000005B ?? .$M_CURR_FORMAT: resb 1 ;;AN000;; - 35989 0000005C ?? .$M_SIG_DIGS_CU: resb 1 ;;AN000;; - 35990 0000005D ?? .$M_TIME_FORMAT: resb 1 ;;AN000;; <------- Time Format - 35991 endstruc ;;AN000;; - 35992 - 35993 ; --------------------------------------------------------------------------- - 35994 - 35995 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 35996 ;; - 35997 ;; PROC NAME: SYSLOADMSG - 35998 ;; - 35999 ;; FUNCTION: - 36000 ;; INPUTS: + 35946 ; 07/04/2023 + 35947 $M_NUM_CLS equ 3 + 35948 + 35949 ;; Resident data area definition of variables + 35950 + 35951 struc $M_RES_ADDRS ;;AN000;; + 35952 00000000 ???????? .$M_EXT_ERR_ADDRS: resd 1 ;;AN000;; Allow pointers to THREE Extended error locations + 35953 00000004 ???????? .$M_EXT_FILE: resd 1 ;;AN001;; + 35954 00000008 ???????? .$M_EXT_COMMAND: resd 1 ;;AN000;; + 35955 0000000C ???????? .$M_EXT_TERM: resd 1 ;;AN000;; + 35956 00000010 ???????? .$M_PARSE_COMMAND: resd 1 ;;AN000;; + 35957 00000014 ???????? .$M_PARSE_ADDRS: resd 1 ;;AN000;; Allow pointers to TWO Parse error locations + 35958 00000018 ???????? .$M_PARSE_TERM: resd 1 ;;AN000;; + 35959 0000001C ???????? .$M_CRIT_ADDRS: resd 1 ;;AN000;; Allow pointers to TWO Critical error locations + 35960 00000020 ???????? .$M_CRIT_COMMAND: resd 1 ;;AN000;; + 35961 00000024 ???????? .$M_CRIT_TERM: resd 1 ;;AN000;; + 35962 00000028 ???????? .$M_DISK_PROC_ADDR: resd 1 ;;AN004;; Address of READ_DISK_PROC + 35963 0000002C .$M_CLASS_ADDRS: resd $M_NUM_CLS ; 3 ;;AN000;; Allow pointers to specified classes + 35964 00000038 ???????? .$M_CLS_TERM: resd 1 ;;AN000;; + 35965 0000003C ???????? .$M_DBCS_VEC: resd 1 ;;AN000;; Save DBCS vector + 35966 00000040 ???? .$M_HANDLE: resw 1 ;;AN000;; + 35967 00000042 ?? .$M_SIZE: resb 1 ;;AN000;; + 35968 00000043 ???? .$M_CRLF: resb 2 ;;AN004;; CR LF message + 35969 00000045 ?? .$M_CLASS: resb 1 ;;AN004;; Saved class + 35970 00000046 ???? .$M_RETURN_ADDR: resw 1 ;;AN000;; + 35971 00000048 ???? .$M_MSG_NUM: resw 1 ;;AN000;; + 35972 0000004A ???? .$M_DIVISOR: resw 1 ;;AN000;; Default = 10 (must be a WORD for division) + 35973 0000004C .$M_TEMP_BUF: resb $M_TEMP_BUF_SZ ;;AN000;; Temporary buffer + 35974 0000008C ?? .$M_BUF_TERM: resb 1 ;;AN000;; + 35975 .size: + 35976 endstruc ;;AN000;; + 35977 + 35978 $M_RES_ADDRS_SZ EQU $M_RES_ADDRS.size ;;AN000;; + 35979 + 35980 ;; Important fields of the Get Country Information call + 35981 + 35982 struc $M_COUNTRY_INFO ;;AN000;; Expected Country infomation + 35983 00000000 .$M_HEADER: resb $M_RES_ADDRS_SZ-$M_TEMP_BUF_SZ-1 + 35984 ;;AN000;; Go past first part of struc + 35985 0000004C ???? .$M_DATE_FORMAT: resw 1 ;;AN000;; <------- Date Format + 35986 0000004E ?????????? .$M_CURR_SEPARA: resb 5 ;;AN000;; + 35987 00000053 ???? .$M_THOU_SEPARA: resb 2 ;;AN000;; <------- Thou Separator + 35988 00000055 ???? .$M_DECI_SEPARA: resb 2 ;;AN000;; <------- Decimal Separator + 35989 00000057 ???? .$M_DATE_SEPARA: resb 2 ;;AN000;; <------- Date Separator + 35990 00000059 ???? .$M_TIME_SEPARA: resb 2 ;;AN000;; <------- Time Separator + 35991 0000005B ?? .$M_CURR_FORMAT: resb 1 ;;AN000;; + 35992 0000005C ?? .$M_SIG_DIGS_CU: resb 1 ;;AN000;; + 35993 0000005D ?? .$M_TIME_FORMAT: resb 1 ;;AN000;; <------- Time Format + 35994 endstruc ;;AN000;; + 35995 + 35996 ; --------------------------------------------------------------------------- + 35997 + 35998 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 35999 ;; + 36000 ;; PROC NAME: SYSLOADMSG 36001 ;; - 36002 ;; OUTPUTS: - 36003 ;; - 36004 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36005 - 36006 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36007 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5107h + 36002 ;; FUNCTION: + 36003 ;; INPUTS: + 36004 ;; + 36005 ;; OUTPUTS: + 36006 ;; + 36007 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 36008 - 36009 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36010 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:58CBh + 36009 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36010 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5107h 36011 - 36012 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36013 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5757h - 36014 SYSLOADMSG: - 36015 00005511 50 push ax ;;AN000; - 36016 00005512 53 push bx ;;AN000; - 36017 00005513 52 push dx ;;AN000; - 36018 00005514 06 push es ;;AN000; - 36019 00005515 57 push di ;;AN000; - 36020 00005516 31C9 xor cx,cx ;;AN000; Reset to zero - 36021 00005518 8EC1 mov es,cx ;;AN000; - 36022 0000551A 31FF xor di,di ;;AN000; - 36023 0000551C B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface - 36024 0000551F B200 mov dl,0 ; DOS_GET_EXTENDED ;;AN000;; Where are the Extended errors in COMMAND.COM - 36025 00005521 CD2F int 2Fh ;;AN000;; Private interface - 36026 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES - 36027 ; DL = subfunction - get standard DOS error table (errors 00h-12h,50h-5Bh) - 36028 ; Return: ES:DI -> error table - 36029 - 36030 00005523 8C06[9E98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_COMMAND+2],es - 36031 ;mov [$M_RT+10],es ;;AN000;; Move into first avaliable table location - 36032 00005527 893E[9C98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_COMMAND],di - 36033 ;mov [$M_RT+8],di ;;AN000;; - 36034 - 36035 0000552B B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface - 36036 0000552E B202 mov dl,2 ; DOS_GET_PARSE ;;AN000;; Where are the Parse errors in COMMAND.COM - 36037 00005530 CD2F int 2Fh ;;AN000;; Private interface - 36038 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES - 36039 ; DL = subfunction - get critical/SHARE error table (errors 13h-2Bh) - 36040 ; ES:DI -> error table - 36041 - 36042 00005532 8C06[A698] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND+2],es - 36043 ;mov [$M_RT+18],es ;;AN000;; Move into first avaliable table location - 36044 00005536 893E[A498] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND],di - 36045 ;mov [$M_RT+16],di ;;AN000;; - 36046 - 36047 0000553A B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface - 36048 0000553D B204 mov dl,4 ; DOS_GET_CRITICAL ;;AN000;; Where are the Critical errors in COMMAND.COM - 36049 0000553F CD2F int 2Fh ;;AN000;; Private interface - 36050 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES - 36051 ; DL = subfunction - get ??? error table - 36052 ; ES:DI -> error table - 36053 - 36054 00005541 8C06[B698] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_COMMAND+2],es - 36055 ;mov [$M_RT+34],es ;;AN000;; Move into first avaliable table location - 36056 00005545 893E[B498] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_COMMAND],di - 36057 ;mov [$M_RT+32],di ;;AN000;; - 36058 - 36059 00005549 B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface - 36060 0000554C B206 mov dl,6 ; DOS_GET_FILE ;;AN001;; Where are the FILE dependant in IFSFUNC.EXE - 36061 0000554E CD2F int 2Fh ;;AN001;; Private interface - 36062 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES - 36063 ; DL = subfunction - get ??? error table - 36064 ; ES:DI -> error table - 36065 - 36066 00005550 8C06[9A98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_FILE+2],es - 36067 ;mov [$M_RT+6],es ;;AN001;; Move into first avaliable table location - 36068 00005554 893E[9898] mov [$M_RT+$M_RES_ADDRS.$M_EXT_FILE],di - 36069 ;mov [$M_RT+4],di ;;AN001;; - 36070 - 36071 00005558 E8553A call $M_MSGSERV_1 ;;AN000;; Get addressibility to MSGSERV CLASS 1 (EXTENDED Errors) - 36072 ;;AN000;; - 36073 0000555B 8C06[9698] mov [$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS+2],es - 36074 ;mov [$M_RT+2],es ;;AN000;; Move into first avaliable table location - 36075 0000555F 893E[9498] mov [$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS],di - 36076 ;mov [$M_RT+0],di ;;AN000;; - 36077 00005563 8C06[B298] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS+2],es - 36078 ;mov [$M_RT+30],es ;;AN000;; Move into first avaliable table location - 36079 00005567 893E[B098] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS],di - 36080 ;mov [$M_RT+28],di ;;AN000;; - 36081 - 36082 0000556B E8603A call $M_MSGSERV_2 ;;AN000;; Get addressibility to MSGSERV CLASS 2 (PARSE Errors) - 36083 - 36084 0000556E 8C06[AA98] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_ADDRS+2],es - 36085 ;mov [$M_RT+22],es ;;AN000;; Move into first avaliable table location - 36086 00005572 893E[A898] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_ADDRS],di - 36087 ;mov [$M_RT+20],di ;;AN000;; - 36088 - 36089 00005576 B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface - 36090 00005579 B208 mov dl,8 ; DOS_GET_ADDR ;;AN001;; Where is the READ_DISK_PROC in COMMAND.COM - 36091 0000557B CD2F int 2Fh ;;AN001;; Private interface - 36092 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES - 36093 ; DL = subfunction - get ??? error table - 36094 ; ES:DI -> error table - 36095 - 36096 0000557D 8C06[BE98] mov [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR+2],es - 36097 ;mov [$M_RT+42],es ;;AN001;; Move into first avaliable table location - 36098 00005581 893E[BC98] mov [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR],di - 36099 ;mov [$M_RT+40],di ;;AN001;; - 36100 - 36101 ;M016; M020 - 36102 ; Reinitialize the CR-LF string. Also, reinit the buffer terminator just to - 36103 ;be safe. Initialize $M_MSG_NUM and $M_DIVISOR also. - 36104 - 36105 00005585 C706[D798]0D0A mov word [$M_RT+$M_RES_ADDRS.$M_CRLF],0A0Dh - 36106 ;mov word [$M_RT+67],0A0Dh ; Reinit CR-LF ;M016 - 36107 0000558B C606[2099]24 mov byte [$M_RT+$M_RES_ADDRS.$M_BUF_TERM],'$' - 36108 ;mov word [$M_RT+140],'$' ; Reinit buffer end;M016 - 36109 00005590 C706[DC98]0000 mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL - 36110 ;mov word [$M_RT+72],0 ; M020 - 36111 00005596 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 36112 ;mov word [$M_RT+74],10 ; M020 - 36113 - 36114 ; 07/04/2023 - Retro DOS v4.0 COMMAND.COM - 36115 ; -------------------------- - 36116 ; MSDOS 6.0 SYSMSG.INC, 1991 - 36117 ; -------------------------- - 36118 ; MSDOS 5.0 COMMAND.COM - TRANGROUP5192h - 36119 - 36120 ;$M_BUILD_PTRS %$M_NUM_CLS ;;AN000;; Build all utility classes - 36121 0000559C E8AE39 call $M_CLS_3 ; Get addressibility to class F - 36122 0000559F 893E[C098] mov [$M_RT+$M_RES_ADDRS.$M_CLASS_ADDRS],di - 36123 ;mov [$M_RT+44],di - 36124 - 36125 000055A3 E80600 CALL $M_GET_DBCS_VEC ;;AN000;; Save the DBCS vector - 36126 - 36127 ; 15/04/2023 - 36128 ;clc ;;AN000;; Make sure carry is clear - 36129 ;jc short $MIF20 - 36130 - 36131 000055A6 5F pop di ;;AN000;; Restore REGS - 36132 000055A7 07 pop es ;;AN000;; - 36133 000055A8 5A pop dx ;;AN000;; - 36134 000055A9 5B pop bx ;;AN000;; - 36135 000055AA 58 pop ax ;;AN000;; - 36136 ;jmp short $MEN20 - 36137 ; 15/04/2023 - 36138 000055AB C3 retn - 36139 + 36012 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36013 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:58CBh + 36014 + 36015 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36016 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5757h + 36017 SYSLOADMSG: + 36018 00005511 50 push ax ;;AN000; + 36019 00005512 53 push bx ;;AN000; + 36020 00005513 52 push dx ;;AN000; + 36021 00005514 06 push es ;;AN000; + 36022 00005515 57 push di ;;AN000; + 36023 00005516 31C9 xor cx,cx ;;AN000; Reset to zero + 36024 00005518 8EC1 mov es,cx ;;AN000; + 36025 0000551A 31FF xor di,di ;;AN000; + 36026 0000551C B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface + 36027 0000551F B200 mov dl,0 ; DOS_GET_EXTENDED ;;AN000;; Where are the Extended errors in COMMAND.COM + 36028 00005521 CD2F int 2Fh ;;AN000;; Private interface + 36029 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES + 36030 ; DL = subfunction - get standard DOS error table (errors 00h-12h,50h-5Bh) + 36031 ; Return: ES:DI -> error table + 36032 + 36033 00005523 8C06[9E98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_COMMAND+2],es + 36034 ;mov [$M_RT+10],es ;;AN000;; Move into first avaliable table location + 36035 00005527 893E[9C98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_COMMAND],di + 36036 ;mov [$M_RT+8],di ;;AN000;; + 36037 + 36038 0000552B B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface + 36039 0000552E B202 mov dl,2 ; DOS_GET_PARSE ;;AN000;; Where are the Parse errors in COMMAND.COM + 36040 00005530 CD2F int 2Fh ;;AN000;; Private interface + 36041 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES + 36042 ; DL = subfunction - get critical/SHARE error table (errors 13h-2Bh) + 36043 ; ES:DI -> error table + 36044 + 36045 00005532 8C06[A698] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND+2],es + 36046 ;mov [$M_RT+18],es ;;AN000;; Move into first avaliable table location + 36047 00005536 893E[A498] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND],di + 36048 ;mov [$M_RT+16],di ;;AN000;; + 36049 + 36050 0000553A B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface + 36051 0000553D B204 mov dl,4 ; DOS_GET_CRITICAL ;;AN000;; Where are the Critical errors in COMMAND.COM + 36052 0000553F CD2F int 2Fh ;;AN000;; Private interface + 36053 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES + 36054 ; DL = subfunction - get ??? error table + 36055 ; ES:DI -> error table + 36056 + 36057 00005541 8C06[B698] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_COMMAND+2],es + 36058 ;mov [$M_RT+34],es ;;AN000;; Move into first avaliable table location + 36059 00005545 893E[B498] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_COMMAND],di + 36060 ;mov [$M_RT+32],di ;;AN000;; + 36061 + 36062 00005549 B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface + 36063 0000554C B206 mov dl,6 ; DOS_GET_FILE ;;AN001;; Where are the FILE dependant in IFSFUNC.EXE + 36064 0000554E CD2F int 2Fh ;;AN001;; Private interface + 36065 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES + 36066 ; DL = subfunction - get ??? error table + 36067 ; ES:DI -> error table + 36068 + 36069 00005550 8C06[9A98] mov [$M_RT+$M_RES_ADDRS.$M_EXT_FILE+2],es + 36070 ;mov [$M_RT+6],es ;;AN001;; Move into first avaliable table location + 36071 00005554 893E[9898] mov [$M_RT+$M_RES_ADDRS.$M_EXT_FILE],di + 36072 ;mov [$M_RT+4],di ;;AN001;; + 36073 + 36074 00005558 E8553A call $M_MSGSERV_1 ;;AN000;; Get addressibility to MSGSERV CLASS 1 (EXTENDED Errors) + 36075 ;;AN000;; + 36076 0000555B 8C06[9698] mov [$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS+2],es + 36077 ;mov [$M_RT+2],es ;;AN000;; Move into first avaliable table location + 36078 0000555F 893E[9498] mov [$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS],di + 36079 ;mov [$M_RT+0],di ;;AN000;; + 36080 00005563 8C06[B298] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS+2],es + 36081 ;mov [$M_RT+30],es ;;AN000;; Move into first avaliable table location + 36082 00005567 893E[B098] mov [$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS],di + 36083 ;mov [$M_RT+28],di ;;AN000;; + 36084 + 36085 0000556B E8603A call $M_MSGSERV_2 ;;AN000;; Get addressibility to MSGSERV CLASS 2 (PARSE Errors) + 36086 + 36087 0000556E 8C06[AA98] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_ADDRS+2],es + 36088 ;mov [$M_RT+22],es ;;AN000;; Move into first avaliable table location + 36089 00005572 893E[A898] mov [$M_RT+$M_RES_ADDRS.$M_PARSE_ADDRS],di + 36090 ;mov [$M_RT+20],di ;;AN000;; + 36091 + 36092 00005576 B82E12 mov ax,122Eh ; DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface + 36093 00005579 B208 mov dl,8 ; DOS_GET_ADDR ;;AN001;; Where is the READ_DISK_PROC in COMMAND.COM + 36094 0000557B CD2F int 2Fh ;;AN001;; Private interface + 36095 ; Multiplex - DOS 3+ internal - GET OR SET ERROR TABLE ADDRESSES + 36096 ; DL = subfunction - get ??? error table + 36097 ; ES:DI -> error table + 36098 + 36099 0000557D 8C06[BE98] mov [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR+2],es + 36100 ;mov [$M_RT+42],es ;;AN001;; Move into first avaliable table location + 36101 00005581 893E[BC98] mov [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR],di + 36102 ;mov [$M_RT+40],di ;;AN001;; + 36103 + 36104 ;M016; M020 + 36105 ; Reinitialize the CR-LF string. Also, reinit the buffer terminator just to + 36106 ;be safe. Initialize $M_MSG_NUM and $M_DIVISOR also. + 36107 + 36108 00005585 C706[D798]0D0A mov word [$M_RT+$M_RES_ADDRS.$M_CRLF],0A0Dh + 36109 ;mov word [$M_RT+67],0A0Dh ; Reinit CR-LF ;M016 + 36110 0000558B C606[2099]24 mov byte [$M_RT+$M_RES_ADDRS.$M_BUF_TERM],'$' + 36111 ;mov word [$M_RT+140],'$' ; Reinit buffer end;M016 + 36112 00005590 C706[DC98]0000 mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL + 36113 ;mov word [$M_RT+72],0 ; M020 + 36114 00005596 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 36115 ;mov word [$M_RT+74],10 ; M020 + 36116 + 36117 ; 07/04/2023 - Retro DOS v4.0 COMMAND.COM + 36118 ; -------------------------- + 36119 ; MSDOS 6.0 SYSMSG.INC, 1991 + 36120 ; -------------------------- + 36121 ; MSDOS 5.0 COMMAND.COM - TRANGROUP5192h + 36122 + 36123 ;$M_BUILD_PTRS %$M_NUM_CLS ;;AN000;; Build all utility classes + 36124 0000559C E8AE39 call $M_CLS_3 ; Get addressibility to class F + 36125 0000559F 893E[C098] mov [$M_RT+$M_RES_ADDRS.$M_CLASS_ADDRS],di + 36126 ;mov [$M_RT+44],di + 36127 + 36128 000055A3 E80600 CALL $M_GET_DBCS_VEC ;;AN000;; Save the DBCS vector + 36129 + 36130 ; 15/04/2023 + 36131 ;clc ;;AN000;; Make sure carry is clear + 36132 ;jc short $MIF20 + 36133 + 36134 000055A6 5F pop di ;;AN000;; Restore REGS + 36135 000055A7 07 pop es ;;AN000;; + 36136 000055A8 5A pop dx ;;AN000;; + 36137 000055A9 5B pop bx ;;AN000;; + 36138 000055AA 58 pop ax ;;AN000;; + 36139 ;jmp short $MEN20 36140 ; 15/04/2023 - 36141 ;$MIF20: - 36142 ;add sp,10 ;;AN000;; - 36143 ;stc ;;AN000;; Reset carry flag - 36144 ;$MEN20: - 36145 ;retn ;;AN000;; - 36146 - 36147 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36148 ;; - 36149 ;; Proc Name: $M_GET_DBCS_VEC - 36150 ;; - 36151 ;; Function: Get the DBCS vector and save it for later use - 36152 ;; - 36153 ;; Inputs: None - 36154 ;; - 36155 ;; Outputs: None - 36156 ;; - 36157 ;; Regs Changed: - 36158 ;; - 36159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36160 - 36161 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36162 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36163 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36164 $M_GET_DBCS_VEC: - 36165 000055AC 50 push ax ;;AN000;; Save character to check - 36166 000055AD 56 push si ;;AN000;; - 36167 000055AE 1E push ds ;;AN000;; - 36168 000055AF B80063 mov ax,6300h ;DOS_GET_DBCS_INFO ;;AN000;; DOS function to get DBSC environment - 36169 000055B2 CD21 int 21h ;;AN000;; Get environment pointer - 36170 000055B4 1E push ds ;;AN000;; Get environment pointer - 36171 000055B5 07 pop es ;;AN000;; Get environment pointer - 36172 000055B6 1F pop ds ;;AN000;; Get environment pointer - 36173 000055B7 7208 jc short $MIF23 - 36174 - 36175 000055B9 8936[D098] mov word [$M_RT+$M_RES_ADDRS.$M_DBCS_VEC],si - 36176 ;mov word [$M_RT+60],si ;;AN000;; Save DBCS Vector - 36177 000055BD 8C06[D298] mov word [$M_RT+$M_RES_ADDRS.$M_DBCS_VEC+2],es - 36178 ;mov word [$M_RT+62],es ;;AN000;; - 36179 $MIF23: - 36180 000055C1 5E pop si ;;AN000;; - 36181 000055C2 58 pop ax ;;AN000;; Retrieve character to check - 36182 000055C3 C3 retn ;;AN000;; Return - 36183 - 36184 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36185 ;; - 36186 ;; Proc Name: SYSGETMSG - 36187 ;; - 36188 ;; Function: The GET service returns the segment, offset and size of the - 36189 ;; message text to the caller based on a message number. - 36190 ;; The GET function will not display the message thus assumes - 36191 ;; caller will handle replaceable parameters. - 36192 ;; - 36193 ;; Inputs: - 36194 ;; - 36195 ;; Outputs: - 36196 ;; - 36197 ;; Psuedocode: - 36198 ;; Call $M_GET_MSG_ADDRESS - 36199 ;; IF MSG_NUM exists THEN - 36200 ;; Set DS:SI = MSG_TXT_PTR + 1 - 36201 ;; CARRY_FLAG = 0 - 36202 ;; ELSE - 36203 ;; CARRY_FLAG = 1 - 36204 ;; ENDIF - 36205 ;; - 36206 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36207 - 36208 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36209 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36210 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36211 - 36212 utility_msg_class equ 0FFh ; 18/04/2023 - 36213 - 36214 SYSGETMSG: - 36215 ;; Save registers needed later - 36216 000055C4 50 push ax ;;AN000;; Save changed regs - 36217 000055C5 06 push es ;;AN000;; - 36218 000055C6 57 push di ;;AN000;; - 36219 000055C7 55 push bp ;;AN000;; - 36220 - 36221 000055C8 E81400 call $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message - 36222 000055CB 720D jc short $MIF31 - 36223 - 36224 000055CD 80FEFF cmp dh,utility_msg_class ; 0FFh ;;AN000;; Were utility messages requested? - 36225 ;clc ;;AN000;; - 36226 000055D0 7404 je short $MIF32 ;;AN000;; - 36227 ; 15/06/2023 - 36228 000055D2 F8 clc - 36229 - 36230 000055D3 06 push es ;;AN000;; - 36231 ;pop ds ;;AN000;; - 36232 000055D4 EB01 jmp short $MEN32 - 36233 $MIF32: - 36234 000055D6 0E push cs ;;AN000;; - 36235 ;pop ds ;;AN000;; - 36236 $MEN32: - 36237 ; 07/04/2023 - 36238 000055D7 1F pop ds - 36239 000055D8 89FE mov si,di ;;AN000;; Return message in DS:SI - 36240 $MIF31: - 36241 000055DA 5D pop bp ;;AN000;; Restore changed regs - 36242 000055DB 5F pop di ;;AN000;; - 36243 000055DC 07 pop es ;;AN000;; - 36244 000055DD 58 pop ax ;;AN000;; - 36245 000055DE C3 retn ;;AN000;; Return - 36246 - 36247 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36248 ;; - 36249 ;; PROC NAME: $M_GET_MSG_ADDRESS - 36250 ;; - 36251 ;; FUNCTION: To scan thru classes to return pointer to the message header - 36252 ;; INPUTS: Access to $M_RES_ADDRESSES - 36253 ;; OUTPUTS: IF CX = 0 THEN Message was not found - 36254 ;; IF CX > 1 THEN ES:DI points to the specified message - 36255 ;; REGS CHANGED: ES,DI,CX - 36256 ;; - 36257 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36258 - 36259 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36260 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36261 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36262 $M_GET_MSG_ADDRESS: - 36263 000055DF 56 push si ;;AN000;; - 36264 000055E0 53 push bx ;;AN000;; - 36265 000055E1 31F6 xor si,si ;;AN000;; Use SI as an index - 36266 000055E3 31C9 xor cx,cx ;;AN000;; Use CX as an size - 36267 $MDO36: - 36268 000055E5 80FEFF cmp dh,utility_msg_class ; -1 ;;AN000;; Were utility messages requested? - 36269 000055E8 7508 jne short $MIF37 ;;AN000;; No - 36270 - 36271 ; 07/04/2023 - 36272 ;;mov di,[si+89CAh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) - 36273 000055EA 8BBC[C098] mov di,[si+$M_RT+$M_RES_ADDRS.$M_CLASS_ADDRS] - 36274 ;mov di,[si+$M_RT+44] ;;AN000;; Get address of class - 36275 000055EE 89FB mov bx,di ;;AN000;; - 36276 000055F0 EB21 jmp short $MEN37 - 36277 $MIF37: - 36278 000055F2 F6C602 test dh,2 ; parse_err_class ;;AN000;; Were parse errors requested? - 36279 000055F5 7406 jz short $MIF39 - 36280 - 36281 ; 07/04/2023 - 36282 ;;les di,[si+89AEh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) - 36283 000055F7 C4BC[A498] les di,[si+$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND] - 36284 ;les di,[si+$M_RT+16] ;;AN000;; Get address of class - 36285 - 36286 ; 07/04/2023 - 36287 ;mov bx,es ; * ;;AN000;; - 36288 000055FB EB14 jmp short $MEN39 - 36289 $MIF39: - 36290 000055FD 83F813 cmp ax,19 ; $M_CRIT_LO ;;AN000;; Is this a critical error? - 36291 00005600 720B jnae short $MIF41 ; jb short $MIF41 ;;AN000;; - 36292 - 36293 00005602 83F827 cmp ax,39 ; $M_CRIT_HI ;;AN000;; - 36294 00005605 7706 jnbe short $MIF41 ; ja short $MIF41 ;;AN000;; + 36141 000055AB C3 retn + 36142 + 36143 ; 15/04/2023 + 36144 ;$MIF20: + 36145 ;add sp,10 ;;AN000;; + 36146 ;stc ;;AN000;; Reset carry flag + 36147 ;$MEN20: + 36148 ;retn ;;AN000;; + 36149 + 36150 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36151 ;; + 36152 ;; Proc Name: $M_GET_DBCS_VEC + 36153 ;; + 36154 ;; Function: Get the DBCS vector and save it for later use + 36155 ;; + 36156 ;; Inputs: None + 36157 ;; + 36158 ;; Outputs: None + 36159 ;; + 36160 ;; Regs Changed: + 36161 ;; + 36162 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36163 + 36164 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36165 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36166 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36167 $M_GET_DBCS_VEC: + 36168 000055AC 50 push ax ;;AN000;; Save character to check + 36169 000055AD 56 push si ;;AN000;; + 36170 000055AE 1E push ds ;;AN000;; + 36171 000055AF B80063 mov ax,6300h ;DOS_GET_DBCS_INFO ;;AN000;; DOS function to get DBSC environment + 36172 000055B2 CD21 int 21h ;;AN000;; Get environment pointer + 36173 000055B4 1E push ds ;;AN000;; Get environment pointer + 36174 000055B5 07 pop es ;;AN000;; Get environment pointer + 36175 000055B6 1F pop ds ;;AN000;; Get environment pointer + 36176 000055B7 7208 jc short $MIF23 + 36177 + 36178 000055B9 8936[D098] mov word [$M_RT+$M_RES_ADDRS.$M_DBCS_VEC],si + 36179 ;mov word [$M_RT+60],si ;;AN000;; Save DBCS Vector + 36180 000055BD 8C06[D298] mov word [$M_RT+$M_RES_ADDRS.$M_DBCS_VEC+2],es + 36181 ;mov word [$M_RT+62],es ;;AN000;; + 36182 $MIF23: + 36183 000055C1 5E pop si ;;AN000;; + 36184 000055C2 58 pop ax ;;AN000;; Retrieve character to check + 36185 000055C3 C3 retn ;;AN000;; Return + 36186 + 36187 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36188 ;; + 36189 ;; Proc Name: SYSGETMSG + 36190 ;; + 36191 ;; Function: The GET service returns the segment, offset and size of the + 36192 ;; message text to the caller based on a message number. + 36193 ;; The GET function will not display the message thus assumes + 36194 ;; caller will handle replaceable parameters. + 36195 ;; + 36196 ;; Inputs: + 36197 ;; + 36198 ;; Outputs: + 36199 ;; + 36200 ;; Psuedocode: + 36201 ;; Call $M_GET_MSG_ADDRESS + 36202 ;; IF MSG_NUM exists THEN + 36203 ;; Set DS:SI = MSG_TXT_PTR + 1 + 36204 ;; CARRY_FLAG = 0 + 36205 ;; ELSE + 36206 ;; CARRY_FLAG = 1 + 36207 ;; ENDIF + 36208 ;; + 36209 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36210 + 36211 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36212 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36213 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36214 + 36215 utility_msg_class equ 0FFh ; 18/04/2023 + 36216 + 36217 SYSGETMSG: + 36218 ;; Save registers needed later + 36219 000055C4 50 push ax ;;AN000;; Save changed regs + 36220 000055C5 06 push es ;;AN000;; + 36221 000055C6 57 push di ;;AN000;; + 36222 000055C7 55 push bp ;;AN000;; + 36223 + 36224 000055C8 E81400 call $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message + 36225 000055CB 720D jc short $MIF31 + 36226 + 36227 000055CD 80FEFF cmp dh,utility_msg_class ; 0FFh ;;AN000;; Were utility messages requested? + 36228 ;clc ;;AN000;; + 36229 000055D0 7404 je short $MIF32 ;;AN000;; + 36230 ; 15/06/2023 + 36231 000055D2 F8 clc + 36232 + 36233 000055D3 06 push es ;;AN000;; + 36234 ;pop ds ;;AN000;; + 36235 000055D4 EB01 jmp short $MEN32 + 36236 $MIF32: + 36237 000055D6 0E push cs ;;AN000;; + 36238 ;pop ds ;;AN000;; + 36239 $MEN32: + 36240 ; 07/04/2023 + 36241 000055D7 1F pop ds + 36242 000055D8 89FE mov si,di ;;AN000;; Return message in DS:SI + 36243 $MIF31: + 36244 000055DA 5D pop bp ;;AN000;; Restore changed regs + 36245 000055DB 5F pop di ;;AN000;; + 36246 000055DC 07 pop es ;;AN000;; + 36247 000055DD 58 pop ax ;;AN000;; + 36248 000055DE C3 retn ;;AN000;; Return + 36249 + 36250 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36251 ;; + 36252 ;; PROC NAME: $M_GET_MSG_ADDRESS + 36253 ;; + 36254 ;; FUNCTION: To scan thru classes to return pointer to the message header + 36255 ;; INPUTS: Access to $M_RES_ADDRESSES + 36256 ;; OUTPUTS: IF CX = 0 THEN Message was not found + 36257 ;; IF CX > 1 THEN ES:DI points to the specified message + 36258 ;; REGS CHANGED: ES,DI,CX + 36259 ;; + 36260 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36261 + 36262 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36263 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36264 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36265 $M_GET_MSG_ADDRESS: + 36266 000055DF 56 push si ;;AN000;; + 36267 000055E0 53 push bx ;;AN000;; + 36268 000055E1 31F6 xor si,si ;;AN000;; Use SI as an index + 36269 000055E3 31C9 xor cx,cx ;;AN000;; Use CX as an size + 36270 $MDO36: + 36271 000055E5 80FEFF cmp dh,utility_msg_class ; -1 ;;AN000;; Were utility messages requested? + 36272 000055E8 7508 jne short $MIF37 ;;AN000;; No + 36273 + 36274 ; 07/04/2023 + 36275 ;;mov di,[si+89CAh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) + 36276 000055EA 8BBC[C098] mov di,[si+$M_RT+$M_RES_ADDRS.$M_CLASS_ADDRS] + 36277 ;mov di,[si+$M_RT+44] ;;AN000;; Get address of class + 36278 000055EE 89FB mov bx,di ;;AN000;; + 36279 000055F0 EB21 jmp short $MEN37 + 36280 $MIF37: + 36281 000055F2 F6C602 test dh,2 ; parse_err_class ;;AN000;; Were parse errors requested? + 36282 000055F5 7406 jz short $MIF39 + 36283 + 36284 ; 07/04/2023 + 36285 ;;les di,[si+89AEh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) + 36286 000055F7 C4BC[A498] les di,[si+$M_RT+$M_RES_ADDRS.$M_PARSE_COMMAND] + 36287 ;les di,[si+$M_RT+16] ;;AN000;; Get address of class + 36288 + 36289 ; 07/04/2023 + 36290 ;mov bx,es ; * ;;AN000;; + 36291 000055FB EB14 jmp short $MEN39 + 36292 $MIF39: + 36293 000055FD 83F813 cmp ax,19 ; $M_CRIT_LO ;;AN000;; Is this a critical error? + 36294 00005600 720B jnae short $MIF41 ; jb short $MIF41 ;;AN000;; 36295 - 36296 ; 07/04/2023 - 36297 ;;les di,[si+89BAh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) - 36298 00005607 C4BC[B098] les di,[si+$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS] - 36299 ;les di,[si+$M_RT+28] ;;AN000;; Get address of class - 36300 - 36301 ; 07/04/2023 - 36302 ;mov bx,es ; * ;;AN000;; - 36303 0000560B EB04 jmp short $MEN41 - 36304 $MIF41: - 36305 ; 07/04/2023 - 36306 ;;les di,[si+899Eh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) - 36307 0000560D C4BC[9498] les di,[si+$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS] - 36308 ;les di,[si+$M_RT+0] ;;AN000;; Get address of class - 36309 - 36310 ; 07/04/2023 - 36311 ;mov bx,es ; * ;;AN000;; - 36312 $MEN41: - 36313 $MEN39: - 36314 ; 07/04/2023 - 36315 00005611 8CC3 mov bx,es ; * - 36316 $MEN37: ;;AN000;; - 36317 00005613 83FBFF cmp bx,-1 ; $M_TERMINATING_FLAG ;;AN000;; Are we finished all classes? - 36318 00005616 7515 jne short $MIF46 ;;AN000;; No - 36319 - 36320 00005618 80FEFF cmp dh,utility_msg_class ; -1 ;;AN000;; Was it a UTILITY class? - 36321 0000561B 7503 jne short $MIF47 ;;AN000;; No - 36322 0000561D F9 stc ; **- ;;AN000;; Set the carry flag - 36323 ; 07/04/2023 - 36324 ;jmp short $MEN47 ; **- - 36325 0000561E EB1B jmp short $MEN36 ; **- - 36326 $MIF47: - 36327 00005620 A3[DC98] mov [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],ax - 36328 ;mov [$M_RT+72],ax ;;AN000;; Save message number - 36329 00005623 B8FFFF mov ax,0FFFFh ; $M_SPECIAL_MSG_NUM ;;AN000;; Set special message number - 36330 00005626 BD0100 mov bp,1 ; $M_ONE_REPLACE ;;AN000;; Set one replace in message - 36331 00005629 31F6 xor si,si ;;AN000;; Reset the SI index to start again - 36332 ; 28/04/2023 - 36333 ; 07/04/2023 - 36334 ;clc ; **+ ;;AN000;; - 36335 ;$MEN47: - 36336 ;jmp short $MEN46 ; *** - 36337 0000562B EB0A jmp short $MEN47 ; *** - 36338 $MIF46: - 36339 ;cmp bx,0 ; $M_CLASS_NOT_EXIST ;;AN000;; Does this class exist? - 36340 0000562D 21DB and bx,bx ; 0 ? - 36341 0000562F 7403 jz short $MIF51 ;;AN000;; No - 36342 - 36343 00005631 E84D00 call $M_FIND_SPECIFIED_MSG ;;AN000;; Try to find the message - 36344 $MIF51: - 36345 00005634 83C604 add si,4 ; $M_ADDR_SZ_FAR ;;AN000;; Get next class - 36346 ; 07/04/2023 - 36347 ;clc ;;AN000;; - 36348 ;$MEN46: - 36349 ;jc short $MEN36 ; **- ; **+ ;;AN000;; - 36350 $MEN47: ; 07/04/2023 ; **+ - 36351 00005637 09C9 or cx,cx ;;AN000;; Was the message found? - 36352 ;jnz short $MXL2 ;;AN000;; Yes - 36353 ;jmp short $MDO36 - 36354 ; 07/04/2023 - 36355 00005639 74AA jz short $MDO36 - 36356 $MXL2: - 36357 $MEN36: - 36358 0000563B 9C pushf ;;AN006;; Save the flag state - 36359 - 36360 0000563C 80FE01 cmp dh,1 ; EXT_ERR_CLASS ;;AN006;; Was an extended error requested? - 36361 ;jne short $MIF56 ;;AN006;; No - 36362 ; 28/04/2023 - 36363 0000563F 752A jne short $M_MYRET - 36364 - 36365 00005641 52 push dx ;;AN006;; Save all needed registers - 36366 00005642 55 push bp ;;AN006;; - 36367 00005643 51 push cx ;;AN006;; - 36368 00005644 06 push es ;;AN006;; - 36369 00005645 57 push di ;;AN006;; - 36370 00005646 50 push ax ;;AN006;; - 36371 - 36372 00005647 B80005 mov ax,500h ; IFSFUNC_INSTALL_CHECK ;;AN006;; Check if IFSFUNC is installed - 36373 0000564A CD2F int 2Fh ;;AN006;; - 36374 ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - INSTALLATION CHECK - 36375 ; Return: AL = 00h not installed, OK to install - 36376 ; 01h not installed, can't install - 36377 ; FFh installed - 36378 - 36379 0000564C 3CFF cmp al,0FFh ; IFSFUNC_INSTALLED ;;AN006;; Is it installed? - 36380 0000564E 58 pop ax ;;AN006;; Restore msg number - 36381 0000564F 7513 jne short $MIF57 ;;AN006;; No (not installed) - 36382 - 36383 00005651 89C3 mov bx,ax ;;AN006;; BX is the extended error number - 36384 00005653 B80205 mov ax,502h ; IFS_GET_ERR_TEXT ;;AN006;; AX is the muliplex number - 36385 00005656 CD2F int 2Fh ;;AN006;; Call IFSFUNC - 36386 ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - 36387 - 36388 ;jmp short $MEN57 ;;AN006;; - 36389 ; 28/04/2023 - 36390 00005658 720B jc short $MEN57 - 36391 $MIF60: - 36392 0000565A 83C406 add sp,6 ;;AN006;; Throw away old pointer - 36393 0000565D E81200 call $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string - 36394 $MEN60: - 36395 00005660 5D pop bp ;;AN006;; Restore other Regs - 36396 00005661 5A pop dx ;;AN006;; - 36397 $MIF56: - 36398 ; 07/04/2023 - 36399 ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) - 36400 00005662 EB07 jmp short $M_MYRET ;;AN006;; Restore the flag state - 36401 - 36402 $MIF57: - 36403 00005664 F9 stc ;;AN006;; Carry conditon - 36404 $MEN57: - 36405 ; 28/04/2023 - 36406 ;jnc short $MIF60 ;;AN006;; - 36407 - 36408 00005665 5F pop di ;;AN006;; - 36409 00005666 07 pop es ;;AN006;; Restore old pointer - 36410 00005667 59 pop cx ;;AN006;; - 36411 00005668 EBF6 jmp short $MEN60 - 36412 - 36413 ;$MIF60: - 36414 ; add sp,6 ;;AN006;; Throw away old pointer - 36415 ; call $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string - 36416 ;$MEN60: - 36417 ; pop bp ;;AN006;; Restore other Regs - 36418 ; pop dx ;;AN006;; - 36419 ;$MIF56: - 36420 ; ; 07/04/2023 - 36421 ; ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) - 36422 ; jmp short $M_MYRET ;;AN006;; Restore the flag state - 36423 - 36424 ; 07/04/2023 - 36425 ; --------------------------- - 36426 ; MSDOS 6.0, SYSMSG.INC, 1991 - 36427 ; --------------------------- - 36428 ; $M_POPF macro - 36429 ;jmp short $+3 - 36430 m_popf_iret: - 36431 0000566A CF iret - 36432 $M_MYRET: - 36433 0000566B 0E push cs - 36434 0000566C E8FBFF call m_popf_iret - 36435 ;;; end macro - 36436 ; --------------------------- - 36437 - 36438 0000566F 5B pop bx ;;AN000;; - 36439 00005670 5E pop si ;;AN000;; - 36440 00005671 C3 retn ;;AN000;; Return ES:DI pointing to the message - 36441 - 36442 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36443 - 36444 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36445 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36446 $M_SET_LEN_IN_CX: - 36447 00005672 57 push di ;;AN006;; Save position - 36448 00005673 50 push ax ;;AN006;; - 36449 00005674 B9FFFF mov cx,-1 ; 65535 ; 0FFFFh ;;AN006;; Set CX for decrements - 36450 00005677 30C0 xor al,al ;;AN006;; Prepare compare register - 36451 00005679 F2AE repne scasb ;;AN006;; Scan for zero - 36452 0000567B F7D1 not cx ;;AN006;; Change decrement into number - 36453 0000567D 49 dec cx ;;AN006;; Don't include the zero - 36454 0000567E 58 pop ax ;;AN006;; - 36455 0000567F 5F pop di ;;AN006;; Restore position - 36456 00005680 C3 retn ;;AN006;; - 36457 - 36458 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36459 ;; - 36460 ;; PROC NAME: $M_FIND_SPECIFIED_MSG - 36461 ;; - 36462 ;; FUNCTION: To scan thru message headers until message is found - 36463 ;; INPUTS: ES:DI points to beginning of msg headers - 36464 ;; CX contains the number of messages in class - 36465 ;; DH contains the message class - 36466 ;; OUPUTS: IF CX = 0 THEN Message was not found - 36467 ;; IF CX > 1 THEN ES:DI points to header of specified message - 36468 ;; - 36469 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36470 - 36471 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36472 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36473 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36474 $M_FIND_SPECIFIED_MSG: - 36475 00005681 83FB01 cmp bx,1 ;;AN004;; Do we have an address to CALL? - 36476 00005684 751F jne short $MIF64 - 36477 00005686 833E[BC98]FF cmp word [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR],-1 - 36478 ;cmp word [$M_RT+40],-1 ; 0FFFFh ;;AN004;; Do we have an address to CALL? - 36479 ; 15/06/2023 - 36480 0000568B 7418 je short $MIF64 - 36481 - 36482 0000568D 83F8FF cmp ax,0FFFFh ; $M_SPECIAL_MSG_NUM ;;AN004;; Are we displaying a default Ext Err? - 36483 00005690 750B jne short $MIF65 - 36484 - 36485 00005692 50 push ax ;;AN004;; Reset the special message number - 36486 00005693 A1[DC98] mov ax,[$M_RT+$M_RES_ADDRS.$M_MSG_NUM] - 36487 ;mov ax,[$M_RT+72] ;;AN004;; Get the old message number - 36488 00005696 FF1E[BC98] call far [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR] - 36489 ;;AN004;; Call the READ_DISK_PROC to get error text - 36490 0000569A 58 pop ax ;;AN004;; Reset the special message number - 36491 ; 28/04/2023 - 36492 0000569B EB04 jmp short $MEN65 - 36493 ; 18/04/2023 - 36494 ;jmp short $MEN64 - 36495 $MIF65: - 36496 0000569D FF1E[BC98] call far [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR] - 36497 ;;AN004;; Call the READ_DISK_PROC to get error text - 36498 $MEN65: - 36499 ; 28/04/2023 - 36500 000056A1 7344 jnc short $MIF75 - 36501 ; - 36502 000056A3 EB19 jmp short $MEN64 ; $MDO76 ;;AN004;; - 36503 $MIF64: - 36504 000056A5 31C9 xor cx,cx ;;AN002;; CX = 0 will allow us to - 36505 000056A7 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; - 36506 000056AA 7406 je short $MIF69 - 36507 - 36508 000056AC 268A4D03 mov cl,[es:di+$M_CLASS_ID.$M_NUM_CLS_MSG] - 36509 ;mov cl,[es:di+3] ;;AN001;; Get number of messages in class - 36510 000056B0 EB09 jmp short $MEN69 - 36511 $MIF69: - 36512 ;cmp [cs:di+$M_CLASS_ID.$M_CLS_ID],dh - 36513 ;cmp [cs:di+0],dh - 36514 000056B2 2E3835 cmp [cs:di],dh ;;AN002;; Check if class still exists at - 36515 000056B5 7504 jne short $MIF71 - 36516 - 36517 000056B7 2E8A4D03 mov cl,[cs:di+$M_CLASS_ID.$M_NUM_CLS_MSG] - 36518 ;mov cl,[cs:di+3] ;;AN000;; Get number of messages in class - 36519 $MIF71: ;;AN001;; - 36520 $MEN69: - 36521 000056BB 83C704 add di,$M_CLASS_ID_SZ ; add di,4 ;;AN000;; Point past the class header - 36522 ; 02/05/2023 - 36523 ;stc ;;AN004;; Flag that we haven't found anything yet - 36524 $MEN64: - 36525 ;jnc short $MIF75 - 36526 ; 28/04/2023 - 36527 ; (or instruction clears carry flag) - 36528 ;clc ;;AN004;; No, reset carry - 36529 $MDO76: - 36530 000056BE 09C9 or cx,cx ;;AN000;; Do we have any to check? - 36531 000056C0 7417 jz short $MEN76 - 36532 - 36533 000056C2 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; - 36534 000056C5 7405 je short $MIF78 + 36296 00005602 83F827 cmp ax,39 ; $M_CRIT_HI ;;AN000;; + 36297 00005605 7706 jnbe short $MIF41 ; ja short $MIF41 ;;AN000;; + 36298 + 36299 ; 07/04/2023 + 36300 ;;les di,[si+89BAh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) + 36301 00005607 C4BC[B098] les di,[si+$M_RT+$M_RES_ADDRS.$M_CRIT_ADDRS] + 36302 ;les di,[si+$M_RT+28] ;;AN000;; Get address of class + 36303 + 36304 ; 07/04/2023 + 36305 ;mov bx,es ; * ;;AN000;; + 36306 0000560B EB04 jmp short $MEN41 + 36307 $MIF41: + 36308 ; 07/04/2023 + 36309 ;;les di,[si+899Eh] ; MSDOS 5.0 COMMAND.COM ($M_RT at offset 899Eh) + 36310 0000560D C4BC[9498] les di,[si+$M_RT+$M_RES_ADDRS.$M_EXT_ERR_ADDRS] + 36311 ;les di,[si+$M_RT+0] ;;AN000;; Get address of class + 36312 + 36313 ; 07/04/2023 + 36314 ;mov bx,es ; * ;;AN000;; + 36315 $MEN41: + 36316 $MEN39: + 36317 ; 07/04/2023 + 36318 00005611 8CC3 mov bx,es ; * + 36319 $MEN37: ;;AN000;; + 36320 00005613 83FBFF cmp bx,-1 ; $M_TERMINATING_FLAG ;;AN000;; Are we finished all classes? + 36321 00005616 7515 jne short $MIF46 ;;AN000;; No + 36322 + 36323 00005618 80FEFF cmp dh,utility_msg_class ; -1 ;;AN000;; Was it a UTILITY class? + 36324 0000561B 7503 jne short $MIF47 ;;AN000;; No + 36325 0000561D F9 stc ; **- ;;AN000;; Set the carry flag + 36326 ; 07/04/2023 + 36327 ;jmp short $MEN47 ; **- + 36328 0000561E EB1B jmp short $MEN36 ; **- + 36329 $MIF47: + 36330 00005620 A3[DC98] mov [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],ax + 36331 ;mov [$M_RT+72],ax ;;AN000;; Save message number + 36332 00005623 B8FFFF mov ax,0FFFFh ; $M_SPECIAL_MSG_NUM ;;AN000;; Set special message number + 36333 00005626 BD0100 mov bp,1 ; $M_ONE_REPLACE ;;AN000;; Set one replace in message + 36334 00005629 31F6 xor si,si ;;AN000;; Reset the SI index to start again + 36335 ; 28/04/2023 + 36336 ; 07/04/2023 + 36337 ;clc ; **+ ;;AN000;; + 36338 ;$MEN47: + 36339 ;jmp short $MEN46 ; *** + 36340 0000562B EB0A jmp short $MEN47 ; *** + 36341 $MIF46: + 36342 ;cmp bx,0 ; $M_CLASS_NOT_EXIST ;;AN000;; Does this class exist? + 36343 0000562D 21DB and bx,bx ; 0 ? + 36344 0000562F 7403 jz short $MIF51 ;;AN000;; No + 36345 + 36346 00005631 E84D00 call $M_FIND_SPECIFIED_MSG ;;AN000;; Try to find the message + 36347 $MIF51: + 36348 00005634 83C604 add si,4 ; $M_ADDR_SZ_FAR ;;AN000;; Get next class + 36349 ; 07/04/2023 + 36350 ;clc ;;AN000;; + 36351 ;$MEN46: + 36352 ;jc short $MEN36 ; **- ; **+ ;;AN000;; + 36353 $MEN47: ; 07/04/2023 ; **+ + 36354 00005637 09C9 or cx,cx ;;AN000;; Was the message found? + 36355 ;jnz short $MXL2 ;;AN000;; Yes + 36356 ;jmp short $MDO36 + 36357 ; 07/04/2023 + 36358 00005639 74AA jz short $MDO36 + 36359 $MXL2: + 36360 $MEN36: + 36361 0000563B 9C pushf ;;AN006;; Save the flag state + 36362 + 36363 0000563C 80FE01 cmp dh,1 ; EXT_ERR_CLASS ;;AN006;; Was an extended error requested? + 36364 ;jne short $MIF56 ;;AN006;; No + 36365 ; 28/04/2023 + 36366 0000563F 752A jne short $M_MYRET + 36367 + 36368 00005641 52 push dx ;;AN006;; Save all needed registers + 36369 00005642 55 push bp ;;AN006;; + 36370 00005643 51 push cx ;;AN006;; + 36371 00005644 06 push es ;;AN006;; + 36372 00005645 57 push di ;;AN006;; + 36373 00005646 50 push ax ;;AN006;; + 36374 + 36375 00005647 B80005 mov ax,500h ; IFSFUNC_INSTALL_CHECK ;;AN006;; Check if IFSFUNC is installed + 36376 0000564A CD2F int 2Fh ;;AN006;; + 36377 ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER - INSTALLATION CHECK + 36378 ; Return: AL = 00h not installed, OK to install + 36379 ; 01h not installed, can't install + 36380 ; FFh installed + 36381 + 36382 0000564C 3CFF cmp al,0FFh ; IFSFUNC_INSTALLED ;;AN006;; Is it installed? + 36383 0000564E 58 pop ax ;;AN006;; Restore msg number + 36384 0000564F 7513 jne short $MIF57 ;;AN006;; No (not installed) + 36385 + 36386 00005651 89C3 mov bx,ax ;;AN006;; BX is the extended error number + 36387 00005653 B80205 mov ax,502h ; IFS_GET_ERR_TEXT ;;AN006;; AX is the muliplex number + 36388 00005656 CD2F int 2Fh ;;AN006;; Call IFSFUNC + 36389 ; Multiplex - DOS 3+ CRITICAL ERROR HANDLER + 36390 + 36391 ;jmp short $MEN57 ;;AN006;; + 36392 ; 28/04/2023 + 36393 00005658 720B jc short $MEN57 + 36394 $MIF60: + 36395 0000565A 83C406 add sp,6 ;;AN006;; Throw away old pointer + 36396 0000565D E81200 call $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string + 36397 $MEN60: + 36398 00005660 5D pop bp ;;AN006;; Restore other Regs + 36399 00005661 5A pop dx ;;AN006;; + 36400 $MIF56: + 36401 ; 07/04/2023 + 36402 ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) + 36403 00005662 EB07 jmp short $M_MYRET ;;AN006;; Restore the flag state + 36404 + 36405 $MIF57: + 36406 00005664 F9 stc ;;AN006;; Carry conditon + 36407 $MEN57: + 36408 ; 28/04/2023 + 36409 ;jnc short $MIF60 ;;AN006;; + 36410 + 36411 00005665 5F pop di ;;AN006;; + 36412 00005666 07 pop es ;;AN006;; Restore old pointer + 36413 00005667 59 pop cx ;;AN006;; + 36414 00005668 EBF6 jmp short $MEN60 + 36415 + 36416 ;$MIF60: + 36417 ; add sp,6 ;;AN006;; Throw away old pointer + 36418 ; call $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string + 36419 ;$MEN60: + 36420 ; pop bp ;;AN006;; Restore other Regs + 36421 ; pop dx ;;AN006;; + 36422 ;$MIF56: + 36423 ; ; 07/04/2023 + 36424 ; ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) + 36425 ; jmp short $M_MYRET ;;AN006;; Restore the flag state + 36426 + 36427 ; 07/04/2023 + 36428 ; --------------------------- + 36429 ; MSDOS 6.0, SYSMSG.INC, 1991 + 36430 ; --------------------------- + 36431 ; $M_POPF macro + 36432 ;jmp short $+3 + 36433 m_popf_iret: + 36434 0000566A CF iret + 36435 $M_MYRET: + 36436 0000566B 0E push cs + 36437 0000566C E8FBFF call m_popf_iret + 36438 ;;; end macro + 36439 ; --------------------------- + 36440 + 36441 0000566F 5B pop bx ;;AN000;; + 36442 00005670 5E pop si ;;AN000;; + 36443 00005671 C3 retn ;;AN000;; Return ES:DI pointing to the message + 36444 + 36445 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36446 + 36447 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36448 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36449 $M_SET_LEN_IN_CX: + 36450 00005672 57 push di ;;AN006;; Save position + 36451 00005673 50 push ax ;;AN006;; + 36452 00005674 B9FFFF mov cx,-1 ; 65535 ; 0FFFFh ;;AN006;; Set CX for decrements + 36453 00005677 30C0 xor al,al ;;AN006;; Prepare compare register + 36454 00005679 F2AE repne scasb ;;AN006;; Scan for zero + 36455 0000567B F7D1 not cx ;;AN006;; Change decrement into number + 36456 0000567D 49 dec cx ;;AN006;; Don't include the zero + 36457 0000567E 58 pop ax ;;AN006;; + 36458 0000567F 5F pop di ;;AN006;; Restore position + 36459 00005680 C3 retn ;;AN006;; + 36460 + 36461 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36462 ;; + 36463 ;; PROC NAME: $M_FIND_SPECIFIED_MSG + 36464 ;; + 36465 ;; FUNCTION: To scan thru message headers until message is found + 36466 ;; INPUTS: ES:DI points to beginning of msg headers + 36467 ;; CX contains the number of messages in class + 36468 ;; DH contains the message class + 36469 ;; OUPUTS: IF CX = 0 THEN Message was not found + 36470 ;; IF CX > 1 THEN ES:DI points to header of specified message + 36471 ;; + 36472 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36473 + 36474 ; 07/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36475 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36476 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36477 $M_FIND_SPECIFIED_MSG: + 36478 00005681 83FB01 cmp bx,1 ;;AN004;; Do we have an address to CALL? + 36479 00005684 751F jne short $MIF64 + 36480 00005686 833E[BC98]FF cmp word [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR],-1 + 36481 ;cmp word [$M_RT+40],-1 ; 0FFFFh ;;AN004;; Do we have an address to CALL? + 36482 ; 15/06/2023 + 36483 0000568B 7418 je short $MIF64 + 36484 + 36485 0000568D 83F8FF cmp ax,0FFFFh ; $M_SPECIAL_MSG_NUM ;;AN004;; Are we displaying a default Ext Err? + 36486 00005690 750B jne short $MIF65 + 36487 + 36488 00005692 50 push ax ;;AN004;; Reset the special message number + 36489 00005693 A1[DC98] mov ax,[$M_RT+$M_RES_ADDRS.$M_MSG_NUM] + 36490 ;mov ax,[$M_RT+72] ;;AN004;; Get the old message number + 36491 00005696 FF1E[BC98] call far [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR] + 36492 ;;AN004;; Call the READ_DISK_PROC to get error text + 36493 0000569A 58 pop ax ;;AN004;; Reset the special message number + 36494 ; 28/04/2023 + 36495 0000569B EB04 jmp short $MEN65 + 36496 ; 18/04/2023 + 36497 ;jmp short $MEN64 + 36498 $MIF65: + 36499 0000569D FF1E[BC98] call far [$M_RT+$M_RES_ADDRS.$M_DISK_PROC_ADDR] + 36500 ;;AN004;; Call the READ_DISK_PROC to get error text + 36501 $MEN65: + 36502 ; 28/04/2023 + 36503 000056A1 7344 jnc short $MIF75 + 36504 ; + 36505 000056A3 EB19 jmp short $MEN64 ; $MDO76 ;;AN004;; + 36506 $MIF64: + 36507 000056A5 31C9 xor cx,cx ;;AN002;; CX = 0 will allow us to + 36508 000056A7 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; + 36509 000056AA 7406 je short $MIF69 + 36510 + 36511 000056AC 268A4D03 mov cl,[es:di+$M_CLASS_ID.$M_NUM_CLS_MSG] + 36512 ;mov cl,[es:di+3] ;;AN001;; Get number of messages in class + 36513 000056B0 EB09 jmp short $MEN69 + 36514 $MIF69: + 36515 ;cmp [cs:di+$M_CLASS_ID.$M_CLS_ID],dh + 36516 ;cmp [cs:di+0],dh + 36517 000056B2 2E3835 cmp [cs:di],dh ;;AN002;; Check if class still exists at + 36518 000056B5 7504 jne short $MIF71 + 36519 + 36520 000056B7 2E8A4D03 mov cl,[cs:di+$M_CLASS_ID.$M_NUM_CLS_MSG] + 36521 ;mov cl,[cs:di+3] ;;AN000;; Get number of messages in class + 36522 $MIF71: ;;AN001;; + 36523 $MEN69: + 36524 000056BB 83C704 add di,$M_CLASS_ID_SZ ; add di,4 ;;AN000;; Point past the class header + 36525 ; 02/05/2023 + 36526 ;stc ;;AN004;; Flag that we haven't found anything yet + 36527 $MEN64: + 36528 ;jnc short $MIF75 + 36529 ; 28/04/2023 + 36530 ; (or instruction clears carry flag) + 36531 ;clc ;;AN004;; No, reset carry + 36532 $MDO76: + 36533 000056BE 09C9 or cx,cx ;;AN000;; Do we have any to check? + 36534 000056C0 7417 jz short $MEN76 36535 - 36536 ;cmp ax,[es:di+$M_ID.$M_NUM] ;;AN001;; Is this the message requested? - 36537 000056C7 263B05 cmp ax,[es:di] - 36538 000056CA EB03 jmp short $MEN78 - 36539 $MIF78: - 36540 ;cmp ax,[cs:di+$M_ID.$M_NUM] ;;AN000;; Is this the message requested? - 36541 000056CC 2E3B05 cmp ax,[cs:di] - 36542 $MEN78: - 36543 ;jne short $MIF76 - 36544 ;jmp short $MSR76 - 36545 ; 07/04/2023 - 36546 000056CF 740B je short $MSR76 ; * - 36547 $MIF76: - 36548 000056D1 49 dec cx ;;AN000;; No, well do we have more to check? - 36549 000056D2 7405 jz short $MEN76 - 36550 - 36551 000056D4 83C704 add di,$M_ID_SZ ; add di,4 ;;AN000;; Yes, skip past msg header - 36552 000056D7 EBE5 jmp short $MDO76 ;;AN000;; - 36553 $MEN76: - 36554 000056D9 F9 stc ;;AN000;; - 36555 ;$MSR76: ; 07/04/2023 - 36556 ;jc short $MIF86 ;;AN000;; - 36557 ; 07/04/2023 - 36558 ;jc short $MIF91 - 36559 000056DA EB11 jmp short $MIF91 ;* - 36560 $MSR76: ; 07/04/2023 ; * - 36561 000056DC 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; Yes, is it a utility message? - 36562 ; 07/04/2023 - 36563 ;clc ;;AN001;; - 36564 000056DF 7502 jne short $MIF87 - 36565 - 36566 000056E1 0E push cs ;;AN000;; - 36567 000056E2 07 pop es ;;AN000;; Return ES:DI pointing to the message - 36568 $MIF87: - 36569 ;add di,[es:di+2] - 36570 000056E3 26037D02 add di,[es:di+$M_ID.$M_TXT_PTR] ;;AN000;; Prepare ES:DI pointing to the message - 36571 $MIF86: - 36572 ;$MIF75: - 36573 ; 02/05/2023 - 36574 ;jc short $MIF91 - 36575 $MIF75: ; 28/04/2023 - 36576 000056E7 30ED xor ch,ch ;;AN000;; - 36577 000056E9 268A0D mov cl,[es:di] ;;AN000;; Move size into CX - 36578 000056EC 47 inc di ;;AN000;; Increment past length - 36579 $MIF91: - 36580 000056ED C606[D698]00 mov byte [$M_RT+$M_RES_ADDRS.$M_SIZE],0 ; $M_NULL - 36581 ;mov byte [$M_RT+66],0 ;;AN004;; Reset variable - 36582 000056F2 C3 retn ;;AN000;; Return - 36583 - 36584 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36585 ;; - 36586 ;; Proc Name: SYSDISPMSG - 36587 ;; - 36588 ;; Function: The DISPLAY service will output a defined message to a handle - 36589 ;; requested by the caller. It also provides function to display - 36590 ;; messages when handles are not applicable (ie. DOS function calls - 36591 ;; 00h to 0Ah) Replaceable parameters are allowed and are - 36592 ;; defined previous to entry. - 36593 ;; - 36594 ;; It is assumes that a PRELOAD function has already determined - 36595 ;; the addressibilty internally to the message retriever services. - 36596 ;; Inputs: - 36597 ;; - 36598 ;; Outputs: - 36599 ;; - 36600 ;; Psuedocode: - 36601 ;; Save registers needed later - 36602 ;; Get address of the message requested - 36603 ;; IF Message number exists THEN - 36604 ;; IF replacable parameters were specified THEN - 36605 ;; Display message with replacable parms - 36606 ;; ELSE - 36607 ;; Display string without replacable parms - 36608 ;; ENDIF - 36609 ;; IF character input was requested THEN - 36610 ;; Wait for character input + 36536 000056C2 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; + 36537 000056C5 7405 je short $MIF78 + 36538 + 36539 ;cmp ax,[es:di+$M_ID.$M_NUM] ;;AN001;; Is this the message requested? + 36540 000056C7 263B05 cmp ax,[es:di] + 36541 000056CA EB03 jmp short $MEN78 + 36542 $MIF78: + 36543 ;cmp ax,[cs:di+$M_ID.$M_NUM] ;;AN000;; Is this the message requested? + 36544 000056CC 2E3B05 cmp ax,[cs:di] + 36545 $MEN78: + 36546 ;jne short $MIF76 + 36547 ;jmp short $MSR76 + 36548 ; 07/04/2023 + 36549 000056CF 740B je short $MSR76 ; * + 36550 $MIF76: + 36551 000056D1 49 dec cx ;;AN000;; No, well do we have more to check? + 36552 000056D2 7405 jz short $MEN76 + 36553 + 36554 000056D4 83C704 add di,$M_ID_SZ ; add di,4 ;;AN000;; Yes, skip past msg header + 36555 000056D7 EBE5 jmp short $MDO76 ;;AN000;; + 36556 $MEN76: + 36557 000056D9 F9 stc ;;AN000;; + 36558 ;$MSR76: ; 07/04/2023 + 36559 ;jc short $MIF86 ;;AN000;; + 36560 ; 07/04/2023 + 36561 ;jc short $MIF91 + 36562 000056DA EB11 jmp short $MIF91 ;* + 36563 $MSR76: ; 07/04/2023 ; * + 36564 000056DC 80FEFF cmp dh,utility_msg_class ; -1 ;;AN001;; Yes, is it a utility message? + 36565 ; 07/04/2023 + 36566 ;clc ;;AN001;; + 36567 000056DF 7502 jne short $MIF87 + 36568 + 36569 000056E1 0E push cs ;;AN000;; + 36570 000056E2 07 pop es ;;AN000;; Return ES:DI pointing to the message + 36571 $MIF87: + 36572 ;add di,[es:di+2] + 36573 000056E3 26037D02 add di,[es:di+$M_ID.$M_TXT_PTR] ;;AN000;; Prepare ES:DI pointing to the message + 36574 $MIF86: + 36575 ;$MIF75: + 36576 ; 02/05/2023 + 36577 ;jc short $MIF91 + 36578 $MIF75: ; 28/04/2023 + 36579 000056E7 30ED xor ch,ch ;;AN000;; + 36580 000056E9 268A0D mov cl,[es:di] ;;AN000;; Move size into CX + 36581 000056EC 47 inc di ;;AN000;; Increment past length + 36582 $MIF91: + 36583 000056ED C606[D698]00 mov byte [$M_RT+$M_RES_ADDRS.$M_SIZE],0 ; $M_NULL + 36584 ;mov byte [$M_RT+66],0 ;;AN004;; Reset variable + 36585 000056F2 C3 retn ;;AN000;; Return + 36586 + 36587 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36588 ;; + 36589 ;; Proc Name: SYSDISPMSG + 36590 ;; + 36591 ;; Function: The DISPLAY service will output a defined message to a handle + 36592 ;; requested by the caller. It also provides function to display + 36593 ;; messages when handles are not applicable (ie. DOS function calls + 36594 ;; 00h to 0Ah) Replaceable parameters are allowed and are + 36595 ;; defined previous to entry. + 36596 ;; + 36597 ;; It is assumes that a PRELOAD function has already determined + 36598 ;; the addressibilty internally to the message retriever services. + 36599 ;; Inputs: + 36600 ;; + 36601 ;; Outputs: + 36602 ;; + 36603 ;; Psuedocode: + 36604 ;; Save registers needed later + 36605 ;; Get address of the message requested + 36606 ;; IF Message number exists THEN + 36607 ;; IF replacable parameters were specified THEN + 36608 ;; Display message with replacable parms + 36609 ;; ELSE + 36610 ;; Display string without replacable parms 36611 ;; ENDIF - 36612 ;; Clear CARRY FLAG - 36613 ;; ELSE - 36614 ;; Set CARRY FLAG - 36615 ;; ENDIF - 36616 ;; Return - 36617 ;; - 36618 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36619 - 36620 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36621 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5307h - 36622 ; - 36623 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36624 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5ACBh - 36625 - 36626 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36627 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5955h - 36628 SYSDISPMSG: - 36629 ;; Save registers and values needed later - 36630 000056F3 50 push ax ;;AN000;; Save changed REGs - 36631 000056F4 53 push bx ;;AN000;; - 36632 000056F5 51 push cx ;;AN000;; - 36633 000056F6 55 push bp ;;AN000;; - 36634 000056F7 57 push di ;;AN000;; Save pointer to input buffer (offset) - 36635 000056F8 06 push es ;;AN000;; Save pointer to input buffer (segment) - 36636 000056F9 52 push dx ;;AN000;; Save Input/Class request - 36637 - 36638 000056FA 89CD mov bp,cx ;;AN000;; Use BP to hold replace count - 36639 000056FC 891E[D498] mov [$M_RT+$M_RES_ADDRS.$M_HANDLE],bx - 36640 ;mov [$M_RT+64],bx ;;AN000;; Save handle - 36641 00005700 8836[D998] mov [$M_RT+$M_RES_ADDRS.$M_CLASS],dh - 36642 ;mov [$M_RT+69],dh ;;AN004;; Save class - 36643 - 36644 ;; Get address of the message requested - 36645 00005704 E8D8FE call $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message + 36612 ;; IF character input was requested THEN + 36613 ;; Wait for character input + 36614 ;; ENDIF + 36615 ;; Clear CARRY FLAG + 36616 ;; ELSE + 36617 ;; Set CARRY FLAG + 36618 ;; ENDIF + 36619 ;; Return + 36620 ;; + 36621 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36622 + 36623 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36624 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5307h + 36625 ; + 36626 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36627 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5ACBh + 36628 + 36629 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36630 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5955h + 36631 SYSDISPMSG: + 36632 ;; Save registers and values needed later + 36633 000056F3 50 push ax ;;AN000;; Save changed REGs + 36634 000056F4 53 push bx ;;AN000;; + 36635 000056F5 51 push cx ;;AN000;; + 36636 000056F6 55 push bp ;;AN000;; + 36637 000056F7 57 push di ;;AN000;; Save pointer to input buffer (offset) + 36638 000056F8 06 push es ;;AN000;; Save pointer to input buffer (segment) + 36639 000056F9 52 push dx ;;AN000;; Save Input/Class request + 36640 + 36641 000056FA 89CD mov bp,cx ;;AN000;; Use BP to hold replace count + 36642 000056FC 891E[D498] mov [$M_RT+$M_RES_ADDRS.$M_HANDLE],bx + 36643 ;mov [$M_RT+64],bx ;;AN000;; Save handle + 36644 00005700 8836[D998] mov [$M_RT+$M_RES_ADDRS.$M_CLASS],dh + 36645 ;mov [$M_RT+69],dh ;;AN004;; Save class 36646 - 36647 00005707 09C9 or cx,cx ;;AN000;; Was message found? - 36648 00005709 7427 jz short $MIF93 - 36649 ;;AN000;; Yes, Message address in ES:DI - 36650 - 36651 ;; Test if replacable parameters were specified - 36652 0000570B 09ED or bp,bp ;;AN000;; Were replacable parameters requested - 36653 0000570D 7505 jnz short $MIF94 - 36654 - 36655 ;; Display string without replacable parms - 36656 0000570F E82800 call $M_DISPLAY_STRING ;;AN000;; No, great . . . Display message - 36657 00005712 EB03 jmp short $MEN94 - 36658 $MIF94: - 36659 ;; Display message with replacable parms - 36660 00005714 E88B01 call $M_DISPLAY_MESSAGE ;;AN000;; Display the message with substitutions - 36661 $MEN94: - 36662 00005717 7214 jc short $MIF97 - 36663 00005719 5A pop dx ;;AN000;; Get Input/Class request - 36664 0000571A E8FC00 call $M_ADD_CRLF ;;AN004;; Check if we need to add the CR LF chars. - 36665 0000571D 07 pop es ;;AN000;; Get location of input buffer (if specified) - 36666 0000571E 5F pop di ;;AN000;; - 36667 - 36668 ; 15/06/2023 - MSDOS 5.0 - 36669 ; ;jmp short $MEN97 ; *** - 36670 ; ; 08/04/2023 - 36671 ; ;jmp short $MEN93 ; ** - 36672 ; + 36647 ;; Get address of the message requested + 36648 00005704 E8D8FE call $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message + 36649 + 36650 00005707 09C9 or cx,cx ;;AN000;; Was message found? + 36651 00005709 7427 jz short $MIF93 + 36652 ;;AN000;; Yes, Message address in ES:DI + 36653 + 36654 ;; Test if replacable parameters were specified + 36655 0000570B 09ED or bp,bp ;;AN000;; Were replacable parameters requested + 36656 0000570D 7505 jnz short $MIF94 + 36657 + 36658 ;; Display string without replacable parms + 36659 0000570F E82800 call $M_DISPLAY_STRING ;;AN000;; No, great . . . Display message + 36660 00005712 EB03 jmp short $MEN94 + 36661 $MIF94: + 36662 ;; Display message with replacable parms + 36663 00005714 E88B01 call $M_DISPLAY_MESSAGE ;;AN000;; Display the message with substitutions + 36664 $MEN94: + 36665 00005717 7214 jc short $MIF97 + 36666 00005719 5A pop dx ;;AN000;; Get Input/Class request + 36667 0000571A E8FC00 call $M_ADD_CRLF ;;AN004;; Check if we need to add the CR LF chars. + 36668 0000571D 07 pop es ;;AN000;; Get location of input buffer (if specified) + 36669 0000571E 5F pop di ;;AN000;; + 36670 + 36671 ; 15/06/2023 - MSDOS 5.0 + 36672 ; ;jmp short $MEN97 ; *** 36673 ; ; 08/04/2023 - 36674 ;;$MEN93: - 36675 ; jc short $MIF104 - 36676 - 36677 ; 15/06/2023 Retro DOS v4.2 COMMAND.COM - 36678 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5AF7h + 36674 ; ;jmp short $MEN93 ; ** + 36675 ; + 36676 ; ; 08/04/2023 + 36677 ;;$MEN93: + 36678 ; jc short $MIF104 36679 - 36680 ; MSDOS 6.0 (MSDOS 6.22) - 36681 ; Test if character input was requested ;;AN000;; - 36682 0000571F 08D2 or dl,dl - 36683 00005721 7403 jz short $MIF98 - 36684 ;jz short $MEN98 ; * - 36685 - 36686 00005723 E88B05 call $M_WAIT_FOR_INPUT ; MSDOS 6.0 (to 6.22) - 36687 ; cf = 0 ; * - 36688 $MIF98: - 36689 ;jmp short $MEN97 - 36690 ;;jc short $MIF104 ; * - 36691 $MEN98: - 36692 ;$MEN97: - 36693 00005726 5D pop bp ;;AN000;; - 36694 00005727 59 pop cx ;;AN000;; - 36695 00005728 5B pop bx ;;AN000;; - 36696 ; 15/06/2023 - 36697 ;pop ax ; MSDOS 5.0 ;;AN000;; - 36698 00005729 83C402 add sp,2 ; MSDOS 6.0 (to 6.22) - 36699 0000572C C3 retn - 36700 - 36701 $MIF97: - 36702 ; 08/04/2023 - 36703 ;add sp,6 ;;AN000;; - 36704 ;stc ;;AN000;; Reset carry flag - 36705 ;$MEN97: ; *** - 36706 ;jmp short $MEN93 - 36707 ; 08/04/2023 - 36708 ;jmp short $MIF104 - 36709 ; 08/04/2023 - 36710 0000572D 83C40E add sp,14 ; 6+8 - 36711 00005730 F9 stc - 36712 00005731 C3 retn - 36713 $MIF93: - 36714 ; 08/04/2023 - 15/06/2023 - 36715 ; (wrong pops ?) - correct order: pop dx, pop es, pop di - - 36716 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:533Bh - 36717 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5B06h - 36718 00005732 07 pop es ;;AN000;; Get pointer to input buffer (segment) - 36719 00005733 5F pop di ;;AN000;; Get base pointer to first sublist (offset) - 36720 00005734 5A pop dx ;;AN000;; Get base pointer to first sublist (segment) - 36721 ;stc ; * ;;AN000;; Set carry flag - 36722 ; 08/04/2023 - 36723 ;jmp short $MIF104 ; * - 36724 - 36725 ;$MEN93: ; ** - 36726 ; jc short $MIF104 - 36727 ;$MEN97: ; 08/04/2023 - 36728 ; pop bp ;;AN000;; - 36729 ; pop cx ;;AN000;; - 36730 ; pop bx ;;AN000;; - 36731 ; pop ax ;;AN000;; - 36732 ; ;jmp short $MEN104 - 36733 ; ; 08/04/2023 - 36734 ; retn - 36735 - 36736 $MIF104: ; * - 36737 00005735 83C408 add sp,8 ;;AN000;; Eliminate from stack - 36738 00005738 F9 stc ;;AN000;; - 36739 $MEN104: - 36740 00005739 C3 retn ;;AN000;; Return - 36741 - 36742 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36743 ;; - 36744 ;; PROC NAME: $M_DISPLAY_STRING - 36745 ;; - 36746 ;; FUNCTION: Will display or write string - 36747 ;; INPUTS: ES:DI points to beginning of message - 36748 ;; CX contains the length of string to write (if applicable) - 36749 ;; OUTPUTS: None - 36750 ;; REGS Revised: None - 36751 ;; - 36752 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36753 - 36754 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36755 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36756 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36757 $M_DISPLAY_STRING: - 36758 0000573A 50 push ax ;;AN000;; - 36759 0000573B 53 push bx ;;AN000;; - 36760 0000573C 52 push dx ;;AN000;; - 36761 0000573D 8B1E[D498] mov bx,[$M_RT+$M_RES_ADDRS.$M_HANDLE] - 36762 ;mov bx,[$M_RT+64] ;;AN000;; Retrieve handle - 36763 - 36764 00005741 83FBFF cmp bx,0FFFFh ; $M_NO_HANDLE ;;AN000;; Was there a handle specified? - 36765 00005744 7505 jne short $MIF107 - 36766 - 36767 00005746 E82600 call $M_DISPLAY_$_STRING ;;AN000;; No, display $ terminated string - 36768 00005749 EB03 jmp short $MEN107 - 36769 $MIF107: - 36770 0000574B E86E00 call $M_DISPLAY_H_STRING ;;AN000;; Yes, display string to handle - 36771 $MEN107: - 36772 0000574E 730D jnc short $MIF110 - 36773 - 36774 00005750 B459 mov ah,59h ; DOS_GET_EXT_ERROR ;;AN000;; - 36775 ;mov bx,0 ; DOS_GET_EXT_ERROR_BX ;;AN000;; Get extended error - 36776 ; 08/04/2023 - 36777 00005752 31DB xor bx,bx - 36778 00005754 CD21 int 21h ;;AN000;; - 36779 ; DOS - 3+ - GET EXTENDED ERROR CODE - 36780 ; BX = version code (0000h for DOS 3.x) - 36781 00005756 30E4 xor ah,ah ;;AN000;; Clear AH - 36782 $MEN110: ; 08/04/2023 ; *** - 36783 00005758 83C406 add sp,6 ;;AN000;; Clean up stack - 36784 0000575B F9 stc ;;AN000;; Flag that there was an error - 36785 ;jmp short $MEN110 ; **** - 36786 ; 08/04/2023 - 36787 0000575C C3 retn - 36788 $MIF110: - 36789 ;cmp bx,$M_NO_HANDLE - 36790 0000575D 83FBFF cmp bx,0FFFFh ; $M_NO_HANDLE ;;AN000;; Was there a handle specified? - 36791 00005760 7409 je short $MIF112 ; * ; cf = 0 - 36792 00005762 39C8 cmp ax,cx ;;AN001;; Was it ALL written? - 36793 00005764 7405 je short $MIF113 ; ** ; cf = 0 - 36794 00005766 E8A700 call $M_GET_EXT_ERR_39 ;;AN001;; Set Extended error - 36795 ;add sp,6 ;;AN001;; Clean up stack - 36796 ;stc ;;AN001;; Flag that there was an error - 36797 ; 08/04/2023 - 36798 00005769 EBED jmp short $MEN110 ; *** - 36799 ; 08/04/2023 - 36800 ;$MIF112: - 36801 ;$MEN110: ; **** - 36802 ;jc short $MIF117 - 36803 $MIF112: ; 08/04/2023 ; * - 36804 $MIF113: ; ** - 36805 0000576B 5A pop dx ;;AN000;; Restore regs - 36806 0000576C 5B pop bx ;;AN000;; - 36807 0000576D 58 pop ax ;;AN000;; - 36808 $MIF117: - 36809 0000576E C3 retn - 36810 - 36811 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36812 ;; - 36813 ;; PROC NAME: $M_DISPLAY_$_STRING - 36814 ;; - 36815 ;; FUNCTION: Will display a $ terminated string - 36816 ;; INPUTS: ES:DI points to beginning of message text (not the length) - 36817 ;; OUTPUTS: None - 36818 ;; REGS USED: AX,DX - 36819 ;; - 36820 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36821 - 36822 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36823 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36824 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36825 $M_DISPLAY_$_STRING: - 36826 0000576F 1E push ds ;;AN000;; - 36827 00005770 06 push es ;;AN000;; - 36828 00005771 1F pop ds ;;AN000;; Set DS to segment of message text - 36829 - 36830 ; 08/04/2023 - 36831 00005772 B402 mov ah,2 ; DOS_DISP_CHAR + 36680 ; 15/06/2023 Retro DOS v4.2 COMMAND.COM + 36681 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5AF7h + 36682 + 36683 ; MSDOS 6.0 (MSDOS 6.22) + 36684 ; Test if character input was requested ;;AN000;; + 36685 0000571F 08D2 or dl,dl + 36686 00005721 7403 jz short $MIF98 + 36687 ;jz short $MEN98 ; * + 36688 + 36689 00005723 E88B05 call $M_WAIT_FOR_INPUT ; MSDOS 6.0 (to 6.22) + 36690 ; cf = 0 ; * + 36691 $MIF98: + 36692 ;jmp short $MEN97 + 36693 ;;jc short $MIF104 ; * + 36694 $MEN98: + 36695 ;$MEN97: + 36696 00005726 5D pop bp ;;AN000;; + 36697 00005727 59 pop cx ;;AN000;; + 36698 00005728 5B pop bx ;;AN000;; + 36699 ; 15/06/2023 + 36700 ;pop ax ; MSDOS 5.0 ;;AN000;; + 36701 00005729 83C402 add sp,2 ; MSDOS 6.0 (to 6.22) + 36702 0000572C C3 retn + 36703 + 36704 $MIF97: + 36705 ; 08/04/2023 + 36706 ;add sp,6 ;;AN000;; + 36707 ;stc ;;AN000;; Reset carry flag + 36708 ;$MEN97: ; *** + 36709 ;jmp short $MEN93 + 36710 ; 08/04/2023 + 36711 ;jmp short $MIF104 + 36712 ; 08/04/2023 + 36713 0000572D 83C40E add sp,14 ; 6+8 + 36714 00005730 F9 stc + 36715 00005731 C3 retn + 36716 $MIF93: + 36717 ; 08/04/2023 - 15/06/2023 + 36718 ; (wrong pops ?) - correct order: pop dx, pop es, pop di - + 36719 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:533Bh + 36720 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5B06h + 36721 00005732 07 pop es ;;AN000;; Get pointer to input buffer (segment) + 36722 00005733 5F pop di ;;AN000;; Get base pointer to first sublist (offset) + 36723 00005734 5A pop dx ;;AN000;; Get base pointer to first sublist (segment) + 36724 ;stc ; * ;;AN000;; Set carry flag + 36725 ; 08/04/2023 + 36726 ;jmp short $MIF104 ; * + 36727 + 36728 ;$MEN93: ; ** + 36729 ; jc short $MIF104 + 36730 ;$MEN97: ; 08/04/2023 + 36731 ; pop bp ;;AN000;; + 36732 ; pop cx ;;AN000;; + 36733 ; pop bx ;;AN000;; + 36734 ; pop ax ;;AN000;; + 36735 ; ;jmp short $MEN104 + 36736 ; ; 08/04/2023 + 36737 ; retn + 36738 + 36739 $MIF104: ; * + 36740 00005735 83C408 add sp,8 ;;AN000;; Eliminate from stack + 36741 00005738 F9 stc ;;AN000;; + 36742 $MEN104: + 36743 00005739 C3 retn ;;AN000;; Return + 36744 + 36745 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36746 ;; + 36747 ;; PROC NAME: $M_DISPLAY_STRING + 36748 ;; + 36749 ;; FUNCTION: Will display or write string + 36750 ;; INPUTS: ES:DI points to beginning of message + 36751 ;; CX contains the length of string to write (if applicable) + 36752 ;; OUTPUTS: None + 36753 ;; REGS Revised: None + 36754 ;; + 36755 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36756 + 36757 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36758 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36759 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36760 $M_DISPLAY_STRING: + 36761 0000573A 50 push ax ;;AN000;; + 36762 0000573B 53 push bx ;;AN000;; + 36763 0000573C 52 push dx ;;AN000;; + 36764 0000573D 8B1E[D498] mov bx,[$M_RT+$M_RES_ADDRS.$M_HANDLE] + 36765 ;mov bx,[$M_RT+64] ;;AN000;; Retrieve handle + 36766 + 36767 00005741 83FBFF cmp bx,0FFFFh ; $M_NO_HANDLE ;;AN000;; Was there a handle specified? + 36768 00005744 7505 jne short $MIF107 + 36769 + 36770 00005746 E82600 call $M_DISPLAY_$_STRING ;;AN000;; No, display $ terminated string + 36771 00005749 EB03 jmp short $MEN107 + 36772 $MIF107: + 36773 0000574B E86E00 call $M_DISPLAY_H_STRING ;;AN000;; Yes, display string to handle + 36774 $MEN107: + 36775 0000574E 730D jnc short $MIF110 + 36776 + 36777 00005750 B459 mov ah,59h ; DOS_GET_EXT_ERROR ;;AN000;; + 36778 ;mov bx,0 ; DOS_GET_EXT_ERROR_BX ;;AN000;; Get extended error + 36779 ; 08/04/2023 + 36780 00005752 31DB xor bx,bx + 36781 00005754 CD21 int 21h ;;AN000;; + 36782 ; DOS - 3+ - GET EXTENDED ERROR CODE + 36783 ; BX = version code (0000h for DOS 3.x) + 36784 00005756 30E4 xor ah,ah ;;AN000;; Clear AH + 36785 $MEN110: ; 08/04/2023 ; *** + 36786 00005758 83C406 add sp,6 ;;AN000;; Clean up stack + 36787 0000575B F9 stc ;;AN000;; Flag that there was an error + 36788 ;jmp short $MEN110 ; **** + 36789 ; 08/04/2023 + 36790 0000575C C3 retn + 36791 $MIF110: + 36792 ;cmp bx,$M_NO_HANDLE + 36793 0000575D 83FBFF cmp bx,0FFFFh ; $M_NO_HANDLE ;;AN000;; Was there a handle specified? + 36794 00005760 7409 je short $MIF112 ; * ; cf = 0 + 36795 00005762 39C8 cmp ax,cx ;;AN001;; Was it ALL written? + 36796 00005764 7405 je short $MIF113 ; ** ; cf = 0 + 36797 00005766 E8A700 call $M_GET_EXT_ERR_39 ;;AN001;; Set Extended error + 36798 ;add sp,6 ;;AN001;; Clean up stack + 36799 ;stc ;;AN001;; Flag that there was an error + 36800 ; 08/04/2023 + 36801 00005769 EBED jmp short $MEN110 ; *** + 36802 ; 08/04/2023 + 36803 ;$MIF112: + 36804 ;$MEN110: ; **** + 36805 ;jc short $MIF117 + 36806 $MIF112: ; 08/04/2023 ; * + 36807 $MIF113: ; ** + 36808 0000576B 5A pop dx ;;AN000;; Restore regs + 36809 0000576C 5B pop bx ;;AN000;; + 36810 0000576D 58 pop ax ;;AN000;; + 36811 $MIF117: + 36812 0000576E C3 retn + 36813 + 36814 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36815 ;; + 36816 ;; PROC NAME: $M_DISPLAY_$_STRING + 36817 ;; + 36818 ;; FUNCTION: Will display a $ terminated string + 36819 ;; INPUTS: ES:DI points to beginning of message text (not the length) + 36820 ;; OUTPUTS: None + 36821 ;; REGS USED: AX,DX + 36822 ;; + 36823 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36824 + 36825 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36826 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36827 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36828 $M_DISPLAY_$_STRING: + 36829 0000576F 1E push ds ;;AN000;; + 36830 00005770 06 push es ;;AN000;; + 36831 00005771 1F pop ds ;;AN000;; Set DS to segment of message text 36832 - 36833 ;cmp cx,$M_SINGLE_CHAR ;;AN000;; Is this a single character? - 36834 00005774 83F901 cmp cx,1 ; $M_SINGLE_CHAR - 36835 00005777 7518 jne short $MIF119 ;;AN000;; No - 36836 - 36837 ;mov ah,2 ; DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER - 36838 00005779 268A15 mov dl,[es:di] ;;AN000;; Get the character - 36839 0000577C CD21 int 21h ;;AN000;; Write character - 36840 ; DOS - DISPLAY OUTPUT - 36841 ; DL = character to send to standard output - 36842 0000577E 1F pop ds ;;AN000;; - 36843 0000577F 88D0 mov al,dl ;;AN000;; Get the character in AL - 36844 00005781 E8AC00 call $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character - 36845 00005784 1E push ds ;;AN000;; - 36846 00005785 06 push es ;;AN000;; - 36847 00005786 1F pop ds ;;AN000;; Set DS to segment of message text - 36848 00005787 7316 jnc short $MIF120 ; * - 36849 - 36850 00005789 268A5501 mov dl,[es:di+1] ;;AN000;; Get the next character - 36851 0000578D CD21 int 21h ;;AN000;; Write character - 36852 ; DOS - DISPLAY OUTPUT - 36853 ; DL = character to send to standard output - 36854 ; 08/04/2023 - 36855 ;clc ;;AN000;; Clear the DBCS indicator - 36856 ;$MIF120: - 36857 0000578F EB0D jmp short $MEN119 - 36858 $MIF119: - 36859 ; 08/04/2023 - 36860 ;mov ah,2 ; DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER - 36861 ;$MDO123: - 36862 00005791 09C9 or cx,cx ;;AN002;; Are there any left to display? - 36863 ;jz short $MEN123 - 36864 ; 18/04/2023 - 36865 00005793 740A jz short $MIF120 ; cf = 0 - 36866 $MDO123: ; 08/04/2023 - 36867 00005795 268A15 mov dl,[es:di] ;;AN002;; Get the character - 36868 00005798 CD21 int 21h ;;AN002;; Display the character - 36869 ; DOS - DISPLAY OUTPUT - 36870 ; DL = character to send to standard output - 36871 0000579A 47 inc di ;;AN002;; Set pointer to next character - 36872 0000579B 49 dec cx ;;AN002;; Count this character - 36873 0000579C 75F7 jnz short $MDO123 - 36874 ;$MEN123: - 36875 $MEN119: - 36876 0000579E F8 clc ;;AN000;;Char functions used don't return carry as error - 36877 $MIF120: ; 08/04/2023 ; * - 36878 0000579F 1F pop ds ;;AN000;; - 36879 000057A0 C3 retn - 36880 - 36881 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36882 ;; - 36883 ;; Scan_ctrlZ: This routine looks through the string to be printed and - 36884 ;; truncates it at the Ctrl-Z if any present. + 36833 ; 08/04/2023 + 36834 00005772 B402 mov ah,2 ; DOS_DISP_CHAR + 36835 + 36836 ;cmp cx,$M_SINGLE_CHAR ;;AN000;; Is this a single character? + 36837 00005774 83F901 cmp cx,1 ; $M_SINGLE_CHAR + 36838 00005777 7518 jne short $MIF119 ;;AN000;; No + 36839 + 36840 ;mov ah,2 ; DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER + 36841 00005779 268A15 mov dl,[es:di] ;;AN000;; Get the character + 36842 0000577C CD21 int 21h ;;AN000;; Write character + 36843 ; DOS - DISPLAY OUTPUT + 36844 ; DL = character to send to standard output + 36845 0000577E 1F pop ds ;;AN000;; + 36846 0000577F 88D0 mov al,dl ;;AN000;; Get the character in AL + 36847 00005781 E8AC00 call $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character + 36848 00005784 1E push ds ;;AN000;; + 36849 00005785 06 push es ;;AN000;; + 36850 00005786 1F pop ds ;;AN000;; Set DS to segment of message text + 36851 00005787 7316 jnc short $MIF120 ; * + 36852 + 36853 00005789 268A5501 mov dl,[es:di+1] ;;AN000;; Get the next character + 36854 0000578D CD21 int 21h ;;AN000;; Write character + 36855 ; DOS - DISPLAY OUTPUT + 36856 ; DL = character to send to standard output + 36857 ; 08/04/2023 + 36858 ;clc ;;AN000;; Clear the DBCS indicator + 36859 ;$MIF120: + 36860 0000578F EB0D jmp short $MEN119 + 36861 $MIF119: + 36862 ; 08/04/2023 + 36863 ;mov ah,2 ; DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER + 36864 ;$MDO123: + 36865 00005791 09C9 or cx,cx ;;AN002;; Are there any left to display? + 36866 ;jz short $MEN123 + 36867 ; 18/04/2023 + 36868 00005793 740A jz short $MIF120 ; cf = 0 + 36869 $MDO123: ; 08/04/2023 + 36870 00005795 268A15 mov dl,[es:di] ;;AN002;; Get the character + 36871 00005798 CD21 int 21h ;;AN002;; Display the character + 36872 ; DOS - DISPLAY OUTPUT + 36873 ; DL = character to send to standard output + 36874 0000579A 47 inc di ;;AN002;; Set pointer to next character + 36875 0000579B 49 dec cx ;;AN002;; Count this character + 36876 0000579C 75F7 jnz short $MDO123 + 36877 ;$MEN123: + 36878 $MEN119: + 36879 0000579E F8 clc ;;AN000;;Char functions used don't return carry as error + 36880 $MIF120: ; 08/04/2023 ; * + 36881 0000579F 1F pop ds ;;AN000;; + 36882 000057A0 C3 retn + 36883 + 36884 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 36885 ;; - 36886 ;; ENTRY: ds:dx = String to be displayed - 36887 ;; cx = number of chars to be displayed + 36886 ;; Scan_ctrlZ: This routine looks through the string to be printed and + 36887 ;; truncates it at the Ctrl-Z if any present. 36888 ;; - 36889 ;; EXIT: cx = number of chars to be displayed - 36890 ;; - 36891 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36892 - 36893 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36894 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36895 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36896 scan_ctrlz: - 36897 000057A1 57 push di - 36898 000057A2 50 push ax - 36899 000057A3 06 push es - 36900 000057A4 53 push bx - 36901 - 36902 000057A5 89D7 mov di,dx - 36903 000057A7 1E push ds - 36904 000057A8 07 pop es ;es:di points at string - 36905 - 36906 000057A9 89CB mov bx,cx ;save current count - 36907 - 36908 000057AB B01A mov al,1Ah ; Ctrl-Z - 36909 000057AD FC cld - 36910 000057AE F2AE repne scasb ;find first Ctrl-Z - 36911 000057B0 7503 jnz short noCtrlZ ;no CtrlZ found in string - 36912 - 36913 000057B2 29CB sub bx,cx - 36914 000057B4 4B dec bx ;bx = new count to display - 36915 noCtrlZ: - 36916 000057B5 89D9 mov cx,bx ;cx = actual display count - 36917 - 36918 000057B7 5B pop bx - 36919 000057B8 07 pop es - 36920 000057B9 58 pop ax - 36921 000057BA 5F pop di - 36922 $MIF127: ; 08/04/2023 - 36923 000057BB C3 retn - 36924 - 36925 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36926 ;; - 36927 ;; PROC NAME: $M_DISPLAY_H_STRING - 36928 ;; - 36929 ;; FUNCTION: Will display a string to a specified handle - 36930 ;; INPUTS: ES:DI points to beginning of message - 36931 ;; CX contains the number of bytes to write - 36932 ;; BX contains the handle to write to - 36933 ;; OUPUTS: None - 36934 ;; REGS USED: AX,DX - 36935 ;; - 36936 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 36937 - 36938 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 36939 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 36940 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 36941 $M_DISPLAY_H_STRING: - 36942 000057BC 31C0 xor ax,ax ;;AN002;; Set number of bytes written to 0 - 36943 000057BE 09C9 or cx,cx ;;AN002;; For performance, don't write if not necessary - 36944 000057C0 74F9 jz short $MIF127 - 36945 - 36946 000057C2 1E push ds ;;AN000;; - 36947 000057C3 06 push es ;;AN000;; - 36948 000057C4 1F pop ds ;;AN000;; Set DS to segment of message text - 36949 - 36950 000057C5 B440 mov ah,40h ; DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle - 36951 000057C7 89FA mov dx,di ;;AN000;; Pointer to data to write - 36952 - 36953 000057C9 83F901 cmp cx,1 ; $M_SINGLE_CHAR ;;AN000;; Is this a single character? - 36954 000057CC 7528 jne short $MIF128 ;;AN000;; No + 36889 ;; ENTRY: ds:dx = String to be displayed + 36890 ;; cx = number of chars to be displayed + 36891 ;; + 36892 ;; EXIT: cx = number of chars to be displayed + 36893 ;; + 36894 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36895 + 36896 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36897 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36898 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36899 scan_ctrlz: + 36900 000057A1 57 push di + 36901 000057A2 50 push ax + 36902 000057A3 06 push es + 36903 000057A4 53 push bx + 36904 + 36905 000057A5 89D7 mov di,dx + 36906 000057A7 1E push ds + 36907 000057A8 07 pop es ;es:di points at string + 36908 + 36909 000057A9 89CB mov bx,cx ;save current count + 36910 + 36911 000057AB B01A mov al,1Ah ; Ctrl-Z + 36912 000057AD FC cld + 36913 000057AE F2AE repne scasb ;find first Ctrl-Z + 36914 000057B0 7503 jnz short noCtrlZ ;no CtrlZ found in string + 36915 + 36916 000057B2 29CB sub bx,cx + 36917 000057B4 4B dec bx ;bx = new count to display + 36918 noCtrlZ: + 36919 000057B5 89D9 mov cx,bx ;cx = actual display count + 36920 + 36921 000057B7 5B pop bx + 36922 000057B8 07 pop es + 36923 000057B9 58 pop ax + 36924 000057BA 5F pop di + 36925 $MIF127: ; 08/04/2023 + 36926 000057BB C3 retn + 36927 + 36928 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36929 ;; + 36930 ;; PROC NAME: $M_DISPLAY_H_STRING + 36931 ;; + 36932 ;; FUNCTION: Will display a string to a specified handle + 36933 ;; INPUTS: ES:DI points to beginning of message + 36934 ;; CX contains the number of bytes to write + 36935 ;; BX contains the handle to write to + 36936 ;; OUPUTS: None + 36937 ;; REGS USED: AX,DX + 36938 ;; + 36939 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 36940 + 36941 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 36942 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 36943 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 36944 $M_DISPLAY_H_STRING: + 36945 000057BC 31C0 xor ax,ax ;;AN002;; Set number of bytes written to 0 + 36946 000057BE 09C9 or cx,cx ;;AN002;; For performance, don't write if not necessary + 36947 000057C0 74F9 jz short $MIF127 + 36948 + 36949 000057C2 1E push ds ;;AN000;; + 36950 000057C3 06 push es ;;AN000;; + 36951 000057C4 1F pop ds ;;AN000;; Set DS to segment of message text + 36952 + 36953 000057C5 B440 mov ah,40h ; DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle + 36954 000057C7 89FA mov dx,di ;;AN000;; Pointer to data to write 36955 - 36956 000057CE CD21 int 21h ;;AN000;; Write character - 36957 ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 36958 ; BX = file handle, CX = number of bytes to writ - 36959 - 36960 000057D0 1F pop ds ;;AN000;; Set DS to segment of message text - 36961 000057D1 50 push ax ;;AN000;; - 36962 000057D2 268A05 mov al,[es:di] ;;AN000;; Get the character - 36963 000057D5 E85800 CALL $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character - 36964 000057D8 58 pop ax ;;AN000;; - 36965 000057D9 1E push ds ;;AN000;; - 36966 000057DA 06 push es ;;AN000;; - 36967 000057DB 1F pop ds ;;AN000;; Set DS to segment of message text - 36968 000057DC 7306 jnc short $MIF129 - 36969 - 36970 000057DE F8 clc ;;AN000;; Clear the DBCS indicator - 36971 000057DF B440 mov ah,40h ; DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle - 36972 000057E1 42 inc dx ;;AN000;; Point to next character - 36973 000057E2 CD21 int 21h ;;AN000;; Write character - 36974 ; DOS - 2+ - WRITE TO FILE WITH HANDLE - 36975 ; BX = file handle, CX = number of bytes to write, - 36976 $MIF129: - 36977 ;SR; - 36978 ; If the single char happened to be a Ctrl-Z, the dos write would return - 36979 ;0 chars written making the caller think there was an error writing. To - 36980 ;avoid this, we check if the single char was a Ctrl-Z and if so, return that - 36981 ;the char was written, thus fooling the caller. - 36982 - 36983 000057E4 9C pushf ;save flags - 36984 000057E5 26803D1A cmp byte [es:di],1Ah ;is char a Ctrl-Z? - 36985 000057E9 7502 jne short m_popf_j ;no, continue - 36986 - 36987 000057EB 89C8 mov ax,cx ;yes, fake as if it was written - 36988 m_popf_j: - 36989 ; 08/04/2023 - 36990 ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) - 36991 000057ED EB01 jmp short m_popf ;restore flags - 36992 - 36993 ; 07/04/2023 - 36994 ; --------------------------- - 36995 ; MSDOS 6.0, SYSMSG.INC, 1991 - 36996 ; --------------------------- - 36997 ; $M_POPF macro - 36998 ;jmp short $+3 - 36999 intret: - 37000 000057EF CF iret - 37001 m_popf: - 37002 000057F0 0E push cs - 37003 000057F1 E8FBFF call intret - 37004 ;;; end macro - 37005 ; --------------------------- - 37006 - 37007 000057F4 EB18 jmp short $MEN128 - 37008 - 37009 $MIF128: - 37010 ;SR; - 37011 ; Prescan the string looking for Ctrl-Z. We terminate the message the moment - 37012 ;we hit a Ctrl-Z. cx will contain the number of characters to be printed. - 37013 - 37014 000057F6 55 push bp ; M007 - 37015 000057F7 51 push cx - 37016 000057F8 E8A6FF call scan_ctrlz ;cx = count without Ctrl-Z - 37017 000057FB 89CD mov bp,cx ;store no ^Z count in bp ;M007 - 37018 000057FD 59 pop cx ;get old count back ;M007 - 37019 - 37020 000057FE CD21 int 21h ;;AN000;; Write String at DS:SI to handle - 37021 ;jnc short chk_count ;no error, adjust return count - 37022 ;jmp short m_cnt_ok ;error, return with carry set;M007 - 37023 ; 08/04/2023 - 37024 00005800 720B jc short m_cnt_ok - 37025 ;M007 - 37026 ; If we are writing to con and there is a Ctrl-Z in the string, the - 37027 ;return count will be much less and if this returns to the caller we can get - 37028 ;spurious error messages. We check here if the count returned is same as - 37029 ;original count or same as the count if we stop at Ctrl-Z. In the second - 37030 ;case, we fake it as if all bytes have been written. If the return count - 37031 ;does not match either count, then we had some other disk error (such as - 37032 ;insufficient disk space) and we pass it through - 37033 - 37034 chk_count: - 37035 00005802 39C1 cmp cx,ax ;have all bytes been written?;M007 - 37036 00005804 7407 je short m_cnt_ok ;there was an error writing ;M007 - 37037 00005806 39C5 cmp bp,ax ;count = Ctrl-Z count? ;M007 - 37038 00005808 F8 clc ;no error either way ;M007 - 37039 00005809 7502 jne short m_cnt_ok ;no, pass it through ;M007 - 37040 0000580B 89C8 mov ax,cx ;return old count ;M007 - 37041 m_cnt_ok: ; M007 - 37042 0000580D 5D pop bp ; M007 - 37043 $MEN128: - 37044 0000580E 1F pop ds ;;AN000;; - 37045 ;$MIF127: ; 08/04/2023 - 37046 0000580F C3 retn - 37047 - 37048 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37049 ;; - 37050 ;; PROC NAME: $M_GET_EXT_ERR_39 - 37051 ;; - 37052 ;; FUNCTION: Will set registers for extended error #39 - 37053 ;; INPUTS: None - 37054 ;; OUPUTS: AX,BX,CX set - 37055 ;; REGS USED: - 37056 ;; - 37057 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37058 - 37059 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37060 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:542Dh + 36956 000057C9 83F901 cmp cx,1 ; $M_SINGLE_CHAR ;;AN000;; Is this a single character? + 36957 000057CC 7528 jne short $MIF128 ;;AN000;; No + 36958 + 36959 000057CE CD21 int 21h ;;AN000;; Write character + 36960 ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 36961 ; BX = file handle, CX = number of bytes to writ + 36962 + 36963 000057D0 1F pop ds ;;AN000;; Set DS to segment of message text + 36964 000057D1 50 push ax ;;AN000;; + 36965 000057D2 268A05 mov al,[es:di] ;;AN000;; Get the character + 36966 000057D5 E85800 CALL $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character + 36967 000057D8 58 pop ax ;;AN000;; + 36968 000057D9 1E push ds ;;AN000;; + 36969 000057DA 06 push es ;;AN000;; + 36970 000057DB 1F pop ds ;;AN000;; Set DS to segment of message text + 36971 000057DC 7306 jnc short $MIF129 + 36972 + 36973 000057DE F8 clc ;;AN000;; Clear the DBCS indicator + 36974 000057DF B440 mov ah,40h ; DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle + 36975 000057E1 42 inc dx ;;AN000;; Point to next character + 36976 000057E2 CD21 int 21h ;;AN000;; Write character + 36977 ; DOS - 2+ - WRITE TO FILE WITH HANDLE + 36978 ; BX = file handle, CX = number of bytes to write, + 36979 $MIF129: + 36980 ;SR; + 36981 ; If the single char happened to be a Ctrl-Z, the dos write would return + 36982 ;0 chars written making the caller think there was an error writing. To + 36983 ;avoid this, we check if the single char was a Ctrl-Z and if so, return that + 36984 ;the char was written, thus fooling the caller. + 36985 + 36986 000057E4 9C pushf ;save flags + 36987 000057E5 26803D1A cmp byte [es:di],1Ah ;is char a Ctrl-Z? + 36988 000057E9 7502 jne short m_popf_j ;no, continue + 36989 + 36990 000057EB 89C8 mov ax,cx ;yes, fake as if it was written + 36991 m_popf_j: + 36992 ; 08/04/2023 + 36993 ;$M_POPF ; macro in 'sysmsg.inc' (MSDOS 6.0) + 36994 000057ED EB01 jmp short m_popf ;restore flags + 36995 + 36996 ; 07/04/2023 + 36997 ; --------------------------- + 36998 ; MSDOS 6.0, SYSMSG.INC, 1991 + 36999 ; --------------------------- + 37000 ; $M_POPF macro + 37001 ;jmp short $+3 + 37002 intret: + 37003 000057EF CF iret + 37004 m_popf: + 37005 000057F0 0E push cs + 37006 000057F1 E8FBFF call intret + 37007 ;;; end macro + 37008 ; --------------------------- + 37009 + 37010 000057F4 EB18 jmp short $MEN128 + 37011 + 37012 $MIF128: + 37013 ;SR; + 37014 ; Prescan the string looking for Ctrl-Z. We terminate the message the moment + 37015 ;we hit a Ctrl-Z. cx will contain the number of characters to be printed. + 37016 + 37017 000057F6 55 push bp ; M007 + 37018 000057F7 51 push cx + 37019 000057F8 E8A6FF call scan_ctrlz ;cx = count without Ctrl-Z + 37020 000057FB 89CD mov bp,cx ;store no ^Z count in bp ;M007 + 37021 000057FD 59 pop cx ;get old count back ;M007 + 37022 + 37023 000057FE CD21 int 21h ;;AN000;; Write String at DS:SI to handle + 37024 ;jnc short chk_count ;no error, adjust return count + 37025 ;jmp short m_cnt_ok ;error, return with carry set;M007 + 37026 ; 08/04/2023 + 37027 00005800 720B jc short m_cnt_ok + 37028 ;M007 + 37029 ; If we are writing to con and there is a Ctrl-Z in the string, the + 37030 ;return count will be much less and if this returns to the caller we can get + 37031 ;spurious error messages. We check here if the count returned is same as + 37032 ;original count or same as the count if we stop at Ctrl-Z. In the second + 37033 ;case, we fake it as if all bytes have been written. If the return count + 37034 ;does not match either count, then we had some other disk error (such as + 37035 ;insufficient disk space) and we pass it through + 37036 + 37037 chk_count: + 37038 00005802 39C1 cmp cx,ax ;have all bytes been written?;M007 + 37039 00005804 7407 je short m_cnt_ok ;there was an error writing ;M007 + 37040 00005806 39C5 cmp bp,ax ;count = Ctrl-Z count? ;M007 + 37041 00005808 F8 clc ;no error either way ;M007 + 37042 00005809 7502 jne short m_cnt_ok ;no, pass it through ;M007 + 37043 0000580B 89C8 mov ax,cx ;return old count ;M007 + 37044 m_cnt_ok: ; M007 + 37045 0000580D 5D pop bp ; M007 + 37046 $MEN128: + 37047 0000580E 1F pop ds ;;AN000;; + 37048 ;$MIF127: ; 08/04/2023 + 37049 0000580F C3 retn + 37050 + 37051 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37052 ;; + 37053 ;; PROC NAME: $M_GET_EXT_ERR_39 + 37054 ;; + 37055 ;; FUNCTION: Will set registers for extended error #39 + 37056 ;; INPUTS: None + 37057 ;; OUPUTS: AX,BX,CX set + 37058 ;; REGS USED: + 37059 ;; + 37060 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 37061 - 37062 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37063 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5BFAh + 37062 ; 08/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37063 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:542Dh 37064 - 37065 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37066 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5A81h - 37067 $M_GET_EXT_ERR_39: - 37068 00005810 B82700 mov ax,27h ; EXT_ERR_39 ;AN001; Set AX=39 - 37069 ;mov bx,(ERROR_CLASS_39 SHR 8) + ACTION_39 - 37070 00005813 BB0400 mov bx,4 ;AN001; Set BH=1 BL=4 - 37071 ;mov ch,LOCUS_39 ;AN001; Set CH=1 - 37072 00005816 B501 mov ch,1 ;AN001; - 37073 00005818 C3 retn ;AN001; - 37074 - 37075 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37076 ;; - 37077 ;; PROC NAME: $M_ADD_CRLF - 37078 ;; - 37079 ;; FUNCTION: Will decide whether to display a CRLF - 37080 ;; INPUTS: DX contains the Input/Class requested - 37081 ;; OUTPUTS: None - 37082 ;; REGS Revised: CX,ES,DI - 37083 ;; - 37084 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37085 - 37086 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37087 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37088 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37089 $M_ADD_CRLF: - 37090 ;cmp dh,0FFh - 37091 00005819 80FEFF cmp dh,utility_msg_class ;;AN004;; Is it a utility message? - 37092 0000581C 7411 je short $MIF134 ;;AN004;; Yes - 37093 0000581E F6C680 test dh,80h ; $M_NO_CRLF_MASK ;;AN004;; Are we to supress the CR LF? - 37094 00005821 750C jnz short $MIF135 - 37095 ;;AN004;; No - 37096 00005823 1E push ds ;;AN004;; - 37097 00005824 07 pop es ;;AN004;; Set ES to data segment - 37098 00005825 8D3E[D798] lea di,[$M_RT+$M_RES_ADDRS.$M_CRLF] - 37099 ;lea di,[$M_RT+67] ;;AN004;; Point at CRLF message - 37100 00005829 B90200 mov cx,2 ; $M_CRLF_SIZE ;;AN004;; Set the message size - 37101 0000582C E80BFF call $M_DISPLAY_STRING ;;AN004;; Display the CRLF - 37102 $MIF135: - 37103 $MIF134: - 37104 0000582F C3 retn ;;AN004;; Return - 37105 - 37106 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37107 ;; - 37108 ;; PROC NAME: $M_IS_IT_DBCS - 37109 ;; - 37110 ;; FUNCTION: Will decide whether character is Single or Double Byte - 37111 ;; INPUTS: AL contains the byte to be checked - 37112 ;; OUTPUTS: Carry flag = 0 if byte is NOT in DBCS range - 37113 ;; Carry flag = 1 if byte IS in DBCS range - 37114 ;; REGS USED: All restored - 37115 ;; - 37116 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37117 - 37118 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37119 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37120 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37121 $M_IS_IT_DBCS: - 37122 00005830 06 push es ;;AN000;; Save Extra Segment register - 37123 00005831 57 push di ;;AN000;; Save DI register - 37124 - 37125 00005832 C43E[D098] les di,[$M_RT+$M_RES_ADDRS.$M_DBCS_VEC] - 37126 ;les di,[$M_RT+60] ;;AN000;; - 37127 00005836 09FF or di,di ;;AN000;; Was the DBCS vector set? - 37128 00005838 7417 jz short $MIF138 ;;AN000;; No - 37129 $MDO139: - 37130 0000583A 26833D00 cmp word [es:di],0 ; $M_DBCS_TERM - 37131 ;;AN000;; Is this the terminating flag? - 37132 0000583E F8 clc ;;AN000;; - 37133 0000583F 7410 jz short $MEN139 - 37134 ;;AN000;; No - 37135 00005841 263A05 cmp al,[es:di] ;;AN000;; Does the character fall in the DBCS range? - 37136 00005844 7207 jnae short $MIF141 ; jb ;;AN000;; No - 37137 00005846 263A4501 cmp al,[es:di+1] ;;AN000;; Does the character fall in the DBCS range? - 37138 0000584A 7701 jnbe short $MIF141 ; ja ;;AN000;; No - 37139 ;;AN000;; Yes - 37140 0000584C F9 stc ;;AN000;; Set carry flag - 37141 $MIF141: - 37142 0000584D 47 inc di ;;AN000;; - 37143 0000584E 47 inc di ;;AN000;; - 37144 0000584F EBE9 jmp short $MDO139 ;;AN000;; Go to next vector - 37145 $MEN139: - 37146 $MIF138: - 37147 00005851 5F pop di ;;AN000;; Restore DI register - 37148 00005852 07 pop es ;;AN000;; Restore Extra Segment register - 37149 00005853 C3 retn ;;AN000;; Return - 37150 - 37151 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37152 ;; - 37153 ;; PROC NAME: $M_CONVERT2ASC - 37154 ;; - 37155 ;; FUNCTION: Convert a binary number to a ASCII string - 37156 ;; INPUTS: DX:AX contains the number to be converted - 37157 ;; $M_RT_DIVISOR contains the divisor - 37158 ;; OUTPUTS: CX contains the number of characters - 37159 ;; Top of stack --> Last character - 37160 ;; . . . - 37161 ;; Bot of stack --> First character - 37162 ;; REGS USED: - 37163 ;; - 37164 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37165 - 37166 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37167 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37168 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37169 $M_CONVERT2ASC: - 37170 00005854 8F06[DA98] pop word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] - 37171 ;pop word [$M_RT+70] ;;AN000;; Save Return Address - 37172 - 37173 00005858 31DB xor bx,bx ;;AN000;; Use BX as a swapping register - 37174 0000585A 93 xchg bx,ax ;;AN000;; Initialize - Low Word in BX - 37175 0000585B 92 xchg ax,dx ;;AN000;; - High Word in AX - 37176 $MDO145: ;;AN000;; DO UNTIL Low Word becomes zero - 37177 0000585C F736[DE98] div word [$M_RT+$M_RES_ADDRS.$M_DIVISOR] - 37178 ;div word [$M_RT+74] ;;AN000;; Divide High Word by divisor - 37179 00005860 93 xchg bx,ax ;;AN000;; Setup to divide Low Word using remainder - 37180 ;;AN000;; and save reduced High Word in BX - 37181 00005861 F736[DE98] div word [$M_RT+$M_RES_ADDRS.$M_DIVISOR] - 37182 ;div word [$M_RT+74] ;;AN000;; Divide Low Word by divisor - 37183 - 37184 00005865 83FA09 cmp dx,9 ;;AN000;; Make a digit of the remainder - 37185 00005868 7605 jna short $MIF146 ;;AN000;; 0-9 - 37186 0000586A 80C237 add dl,55 ; add dl,37h ;;AN000;; Make A to F ASCII - 37187 0000586D EB03 jmp short $MEN146 - 37188 $MIF146: - 37189 0000586F 80C230 add dl,'0' ;;AN000;; Make 0 to 9 ASCII - 37190 $MEN146: - 37191 00005872 52 push dx ;;AN000;; Save the digit on the stack - 37192 00005873 41 inc cx ;;AN000;; Count that digit - 37193 00005874 09C0 or ax,ax ;;AN000;; Are we done? - 37194 00005876 7504 jnz short $MLL149 ;;AN000;; No - 37195 00005878 09DB or bx,bx ;;AN000;; AX and BX must be ZERO!! - 37196 0000587A 741F jz short $MEN145 ; * ; ax = 0 ;;AN000;; Yes - 37197 $MLL149: - 37198 0000587C 83F903 cmp cx,3 ; $M_FIRST_THOU ;;AN000;; Are we at the first thousands mark - 37199 ; 28/04/2023 - 37200 0000587F 740A je short $MIF153 - 37201 ; jne short $MIF150 ;;AN000;; No - 37202 ; ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? - 37203 ; cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' - 37204 ; ;cmp byte [si+0Ah],',' ; $M_COMMA - 37205 ; ;jne short $MIF151 - 37206 ; ; 09/04/2023 - 37207 ; jne short $MEN150 - 37208 ; ;;AN000;; Yes - 37209 ; push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] - 37210 ; ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator - 37211 ; inc cx ;;AN000;; - 37212 ;$MIF151: - 37213 ; jmp short $MEN150 - 37214 - 37215 $MIF150: - 37216 ; 15/06/2023 (6) - 37217 ; MSDOS 6.0 - 37218 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54ABh - 37219 ;cmp cx,6 ; $M_SECOND_THOU ;;AN000;; Are we at the first thousands mark - 37220 ; 15/06/2023 (7) - 37221 ; MSDOS 6.22 - 37222 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5C78h - 37223 00005881 83F907 cmp cx,7 ; $M_SECOND_THOU ;;AN000;; Are we at the first thousands mark - 37224 - 37225 ; 28/04/2023 - 37226 00005884 7405 je short $MIF153 - 37227 ; jne short $MIF154 ;;AN000;; No - 37228 ; ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? - 37229 ; cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' - 37230 ; ;cmp byte [si+0Ah],',' ; $M_COMMA - 37231 ; ;jne short $MIF155 ;;AN000;; No - 37232 ; ; 09/04/2023 - 37233 ; jne short $MEN154 - 37234 ; ;;AN000;; Yes - 37235 ; push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] - 37236 ; ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator - 37237 ; inc cx ;;AN000;; - 37238 ;$MIF155: - 37239 ; jmp short $MEN154 - 37240 - 37241 $MIF154: - 37242 ; 15/06/2023 (9) - 37243 ; MSDOS 6.0 - 37244 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54BDh - 37245 ;cmp cx,9 ; $M_THIRD_THOU ;;AN000;; Are we at the first thousands mark - 37246 ; 15/06/2023 (11) - 37247 ; MSDOS 6.22 - 37248 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5C8Ah - 37249 00005886 83F90B cmp cx,11 ; $M_THIRD_THOU ;;AN000;; Are we at the first thousands mark - 37250 00005889 750B jne short $MIF158 ;;AN000;; No - 37251 ; 28/04/2023 - 37252 $MIF153: - 37253 ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? - 37254 0000588B 807C0A2C cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' - 37255 ;cmp byte [si+0Ah],',' ; $M_COMMA - 37256 0000588F 7505 jne short $MIF159 ;;AN000;; No - 37257 ;;AN000;; Yes - 37258 00005891 FF36[E798] push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] - 37259 ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator - 37260 00005895 41 inc cx ;;AN000;; - 37261 $MIF159: - 37262 $MIF158: - 37263 $MEN154: - 37264 $MEN150: ;;AN000;; - 37265 00005896 93 xchg ax,bx ;;AN000;; Setup to divide the reduced High Word - 37266 ;;AN000;; and Revised Low Word - 37267 00005897 31D2 xor dx,dx ;;AN000;; Reset remainder - 37268 ; 28/04/2023 - 37269 00005899 EBC1 jmp short $MDO145 - 37270 ;$MEN145: + 37065 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37066 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5BFAh + 37067 + 37068 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37069 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5A81h + 37070 $M_GET_EXT_ERR_39: + 37071 00005810 B82700 mov ax,27h ; EXT_ERR_39 ;AN001; Set AX=39 + 37072 ;mov bx,(ERROR_CLASS_39 SHR 8) + ACTION_39 + 37073 00005813 BB0400 mov bx,4 ;AN001; Set BH=1 BL=4 + 37074 ;mov ch,LOCUS_39 ;AN001; Set CH=1 + 37075 00005816 B501 mov ch,1 ;AN001; + 37076 00005818 C3 retn ;AN001; + 37077 + 37078 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37079 ;; + 37080 ;; PROC NAME: $M_ADD_CRLF + 37081 ;; + 37082 ;; FUNCTION: Will decide whether to display a CRLF + 37083 ;; INPUTS: DX contains the Input/Class requested + 37084 ;; OUTPUTS: None + 37085 ;; REGS Revised: CX,ES,DI + 37086 ;; + 37087 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37088 + 37089 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37090 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37091 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37092 $M_ADD_CRLF: + 37093 ;cmp dh,0FFh + 37094 00005819 80FEFF cmp dh,utility_msg_class ;;AN004;; Is it a utility message? + 37095 0000581C 7411 je short $MIF134 ;;AN004;; Yes + 37096 0000581E F6C680 test dh,80h ; $M_NO_CRLF_MASK ;;AN004;; Are we to supress the CR LF? + 37097 00005821 750C jnz short $MIF135 + 37098 ;;AN004;; No + 37099 00005823 1E push ds ;;AN004;; + 37100 00005824 07 pop es ;;AN004;; Set ES to data segment + 37101 00005825 8D3E[D798] lea di,[$M_RT+$M_RES_ADDRS.$M_CRLF] + 37102 ;lea di,[$M_RT+67] ;;AN004;; Point at CRLF message + 37103 00005829 B90200 mov cx,2 ; $M_CRLF_SIZE ;;AN004;; Set the message size + 37104 0000582C E80BFF call $M_DISPLAY_STRING ;;AN004;; Display the CRLF + 37105 $MIF135: + 37106 $MIF134: + 37107 0000582F C3 retn ;;AN004;; Return + 37108 + 37109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37110 ;; + 37111 ;; PROC NAME: $M_IS_IT_DBCS + 37112 ;; + 37113 ;; FUNCTION: Will decide whether character is Single or Double Byte + 37114 ;; INPUTS: AL contains the byte to be checked + 37115 ;; OUTPUTS: Carry flag = 0 if byte is NOT in DBCS range + 37116 ;; Carry flag = 1 if byte IS in DBCS range + 37117 ;; REGS USED: All restored + 37118 ;; + 37119 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37120 + 37121 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37122 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37123 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37124 $M_IS_IT_DBCS: + 37125 00005830 06 push es ;;AN000;; Save Extra Segment register + 37126 00005831 57 push di ;;AN000;; Save DI register + 37127 + 37128 00005832 C43E[D098] les di,[$M_RT+$M_RES_ADDRS.$M_DBCS_VEC] + 37129 ;les di,[$M_RT+60] ;;AN000;; + 37130 00005836 09FF or di,di ;;AN000;; Was the DBCS vector set? + 37131 00005838 7417 jz short $MIF138 ;;AN000;; No + 37132 $MDO139: + 37133 0000583A 26833D00 cmp word [es:di],0 ; $M_DBCS_TERM + 37134 ;;AN000;; Is this the terminating flag? + 37135 0000583E F8 clc ;;AN000;; + 37136 0000583F 7410 jz short $MEN139 + 37137 ;;AN000;; No + 37138 00005841 263A05 cmp al,[es:di] ;;AN000;; Does the character fall in the DBCS range? + 37139 00005844 7207 jnae short $MIF141 ; jb ;;AN000;; No + 37140 00005846 263A4501 cmp al,[es:di+1] ;;AN000;; Does the character fall in the DBCS range? + 37141 0000584A 7701 jnbe short $MIF141 ; ja ;;AN000;; No + 37142 ;;AN000;; Yes + 37143 0000584C F9 stc ;;AN000;; Set carry flag + 37144 $MIF141: + 37145 0000584D 47 inc di ;;AN000;; + 37146 0000584E 47 inc di ;;AN000;; + 37147 0000584F EBE9 jmp short $MDO139 ;;AN000;; Go to next vector + 37148 $MEN139: + 37149 $MIF138: + 37150 00005851 5F pop di ;;AN000;; Restore DI register + 37151 00005852 07 pop es ;;AN000;; Restore Extra Segment register + 37152 00005853 C3 retn ;;AN000;; Return + 37153 + 37154 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37155 ;; + 37156 ;; PROC NAME: $M_CONVERT2ASC + 37157 ;; + 37158 ;; FUNCTION: Convert a binary number to a ASCII string + 37159 ;; INPUTS: DX:AX contains the number to be converted + 37160 ;; $M_RT_DIVISOR contains the divisor + 37161 ;; OUTPUTS: CX contains the number of characters + 37162 ;; Top of stack --> Last character + 37163 ;; . . . + 37164 ;; Bot of stack --> First character + 37165 ;; REGS USED: + 37166 ;; + 37167 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37168 + 37169 ; 09/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37170 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37171 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37172 $M_CONVERT2ASC: + 37173 00005854 8F06[DA98] pop word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] + 37174 ;pop word [$M_RT+70] ;;AN000;; Save Return Address + 37175 + 37176 00005858 31DB xor bx,bx ;;AN000;; Use BX as a swapping register + 37177 0000585A 93 xchg bx,ax ;;AN000;; Initialize - Low Word in BX + 37178 0000585B 92 xchg ax,dx ;;AN000;; - High Word in AX + 37179 $MDO145: ;;AN000;; DO UNTIL Low Word becomes zero + 37180 0000585C F736[DE98] div word [$M_RT+$M_RES_ADDRS.$M_DIVISOR] + 37181 ;div word [$M_RT+74] ;;AN000;; Divide High Word by divisor + 37182 00005860 93 xchg bx,ax ;;AN000;; Setup to divide Low Word using remainder + 37183 ;;AN000;; and save reduced High Word in BX + 37184 00005861 F736[DE98] div word [$M_RT+$M_RES_ADDRS.$M_DIVISOR] + 37185 ;div word [$M_RT+74] ;;AN000;; Divide Low Word by divisor + 37186 + 37187 00005865 83FA09 cmp dx,9 ;;AN000;; Make a digit of the remainder + 37188 00005868 7605 jna short $MIF146 ;;AN000;; 0-9 + 37189 0000586A 80C237 add dl,55 ; add dl,37h ;;AN000;; Make A to F ASCII + 37190 0000586D EB03 jmp short $MEN146 + 37191 $MIF146: + 37192 0000586F 80C230 add dl,'0' ;;AN000;; Make 0 to 9 ASCII + 37193 $MEN146: + 37194 00005872 52 push dx ;;AN000;; Save the digit on the stack + 37195 00005873 41 inc cx ;;AN000;; Count that digit + 37196 00005874 09C0 or ax,ax ;;AN000;; Are we done? + 37197 00005876 7504 jnz short $MLL149 ;;AN000;; No + 37198 00005878 09DB or bx,bx ;;AN000;; AX and BX must be ZERO!! + 37199 0000587A 741F jz short $MEN145 ; * ; ax = 0 ;;AN000;; Yes + 37200 $MLL149: + 37201 0000587C 83F903 cmp cx,3 ; $M_FIRST_THOU ;;AN000;; Are we at the first thousands mark + 37202 ; 28/04/2023 + 37203 0000587F 740A je short $MIF153 + 37204 ; jne short $MIF150 ;;AN000;; No + 37205 ; ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? + 37206 ; cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' + 37207 ; ;cmp byte [si+0Ah],',' ; $M_COMMA + 37208 ; ;jne short $MIF151 + 37209 ; ; 09/04/2023 + 37210 ; jne short $MEN150 + 37211 ; ;;AN000;; Yes + 37212 ; push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] + 37213 ; ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator + 37214 ; inc cx ;;AN000;; + 37215 ;$MIF151: + 37216 ; jmp short $MEN150 + 37217 + 37218 $MIF150: + 37219 ; 15/06/2023 (6) + 37220 ; MSDOS 6.0 + 37221 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54ABh + 37222 ;cmp cx,6 ; $M_SECOND_THOU ;;AN000;; Are we at the first thousands mark + 37223 ; 15/06/2023 (7) + 37224 ; MSDOS 6.22 + 37225 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5C78h + 37226 00005881 83F907 cmp cx,7 ; $M_SECOND_THOU ;;AN000;; Are we at the first thousands mark + 37227 + 37228 ; 28/04/2023 + 37229 00005884 7405 je short $MIF153 + 37230 ; jne short $MIF154 ;;AN000;; No + 37231 ; ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? + 37232 ; cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' + 37233 ; ;cmp byte [si+0Ah],',' ; $M_COMMA + 37234 ; ;jne short $MIF155 ;;AN000;; No + 37235 ; ; 09/04/2023 + 37236 ; jne short $MEN154 + 37237 ; ;;AN000;; Yes + 37238 ; push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] + 37239 ; ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator + 37240 ; inc cx ;;AN000;; + 37241 ;$MIF155: + 37242 ; jmp short $MEN154 + 37243 + 37244 $MIF154: + 37245 ; 15/06/2023 (9) + 37246 ; MSDOS 6.0 + 37247 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54BDh + 37248 ;cmp cx,9 ; $M_THIRD_THOU ;;AN000;; Are we at the first thousands mark + 37249 ; 15/06/2023 (11) + 37250 ; MSDOS 6.22 + 37251 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5C8Ah + 37252 00005886 83F90B cmp cx,11 ; $M_THIRD_THOU ;;AN000;; Are we at the first thousands mark + 37253 00005889 750B jne short $MIF158 ;;AN000;; No + 37254 ; 28/04/2023 + 37255 $MIF153: + 37256 ;cmp $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma? + 37257 0000588B 807C0A2C cmp byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' + 37258 ;cmp byte [si+0Ah],',' ; $M_COMMA + 37259 0000588F 7505 jne short $MIF159 ;;AN000;; No + 37260 ;;AN000;; Yes + 37261 00005891 FF36[E798] push word [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA] + 37262 ;push word [$M_RT+83] ;;AN000;; Insert a thousand separator + 37263 00005895 41 inc cx ;;AN000;; + 37264 $MIF159: + 37265 $MIF158: + 37266 $MEN154: + 37267 $MEN150: ;;AN000;; + 37268 00005896 93 xchg ax,bx ;;AN000;; Setup to divide the reduced High Word + 37269 ;;AN000;; and Revised Low Word + 37270 00005897 31D2 xor dx,dx ;;AN000;; Reset remainder 37271 ; 28/04/2023 - 37272 ;xor ax,ax ;;AN000;; Reset remainder - 37273 $MEN145: ; 09/04/2023 ; * ; ax = 0 - 37274 0000589B 31D2 xor dx,dx ;;AN000;; Reset remainder - 37275 0000589D FF36[DA98] push word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] - 37276 ;push word [$M_RT+70] ;;AN000;; Restore Return Address - 37277 000058A1 C3 retn ;;AN000;; Return - 37278 - 37279 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37280 ;; - 37281 ;; PROC NAME: $M_DISPLAY_MESSAGE - 37282 ;; - 37283 ;; FUNCTION: Will display or write entire message (with replacable parameters) - 37284 ;; INPUTS: ES:DI points to beginning of message - 37285 ;; DS:SI points to first sublist structure in chain - 37286 ;; BX contains the handle to write to (if applicable) - 37287 ;; CX contains the length of string to write (before substitutions) - 37288 ;; BP contains the count of replacables - 37289 ;; - 37290 ;; OUTPUTS: - 37291 ;; REGS USED: All + 37272 00005899 EBC1 jmp short $MDO145 + 37273 ;$MEN145: + 37274 ; 28/04/2023 + 37275 ;xor ax,ax ;;AN000;; Reset remainder + 37276 $MEN145: ; 09/04/2023 ; * ; ax = 0 + 37277 0000589B 31D2 xor dx,dx ;;AN000;; Reset remainder + 37278 0000589D FF36[DA98] push word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] + 37279 ;push word [$M_RT+70] ;;AN000;; Restore Return Address + 37280 000058A1 C3 retn ;;AN000;; Return + 37281 + 37282 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37283 ;; + 37284 ;; PROC NAME: $M_DISPLAY_MESSAGE + 37285 ;; + 37286 ;; FUNCTION: Will display or write entire message (with replacable parameters) + 37287 ;; INPUTS: ES:DI points to beginning of message + 37288 ;; DS:SI points to first sublist structure in chain + 37289 ;; BX contains the handle to write to (if applicable) + 37290 ;; CX contains the length of string to write (before substitutions) + 37291 ;; BP contains the count of replacables 37292 ;; - 37293 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37294 - 37295 ; 10/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37296 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54DBh + 37293 ;; OUTPUTS: + 37294 ;; REGS USED: All + 37295 ;; + 37296 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 37297 - 37298 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37299 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:54DBh + 37298 ; 10/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37299 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:54DBh 37300 - 37301 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37302 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5B2Eh + 37301 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37302 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:54DBh 37303 - 37304 $M_DISPLAY_MESSAGE: - 37305 ; $DO ;;AN000;; Note: DS:SI -> message - 37306 $MDO165: - 37307 000058A2 31D2 xor dx,dx ;;AN000;; Set size = 0 - 37308 000058A4 09C9 or cx,cx ;;AN000;; Are we finished the message yet? - 37309 ;; $IF NZ ;;AN000;; No - 37310 000058A6 741F jz short $MIF166 ;;AN000;; Yes - 37311 ;mov ah,"%" ;;AN000;; Prepare to scan for % - 37312 ;mov al,0 ;;AN004;; - 37313 ; 12/08/2024 - 37314 000058A8 B80025 mov ax,2500h - 37315 ;; $DO ;;AN000;; Scan through string until % - 37316 $MDO167: - 37317 000058AB 263825 cmp byte [es:di],ah ;;AN000;; Is this character NOT a % - 37318 ;; $LEAVE E,AND ;;AN000;; No - 37319 000058AE 750A jne short $MLL168 - 37320 000058B0 26386501 cmp byte [es:di+1],ah ;;AN000;; Is the next character also a % - 37321 ;; $LEAVE NE,AND ;;AN000;; No - 37322 000058B4 7404 je short $MLL168 - 37323 - 37324 000058B6 38E0 cmp al,ah ;;AN000;; Was the character before a % - 37325 ;; $LEAVE NE ;;AN000;; No, GREAT found it - 37326 000058B8 750D jne short $MEN167 ; 12/08/2024 - 37327 $MLL168: - 37328 000058BA 268A05 mov al,[es:di] ;;AN004;; Yes, (to any of the above) - 37329 000058BD E870FF call $M_IS_IT_DBCS ;;AN004;; Is this character the first part of a DBCS? - 37330 ;;; $IF C ;;AN004;; Yes - 37331 000058C0 7301 jnc short $MIF169 - 37332 000058C2 47 inc di ;;AN004;; Increment past second part - 37333 ;;; $ENDIF ;;AN004;; - 37334 $MIF169: - 37335 000058C3 47 inc di ;;AN000;; Next character in string - 37336 000058C4 42 inc dx ;;AN000;; Size = Size + 1 - 37337 ;dec cx ;;AN000;; Decrement total size - 37338 ;; $ENDDO Z ;;AN000;; Exit scan if we're at the end of the line - 37339 ;jnz short $MDO167 - 37340 ; 12/08/2024 - 37341 000058C5 E2E4 loop $MDO167 - 37342 $MEN167: - 37343 ;; $ENDIF ;;AN000;; - 37344 $MIF166: - 37345 000058C7 56 push si ;;AN000;; Save beginning of sublists - 37346 000058C8 87CA xchg cx,dx ;;AN000;; Get size of message to display (tot sz in DX) - 37347 000058CA 09ED or bp,bp ;;AN000;; Do we have any replacables to do? - 37348 ;; $IF NZ ;;AN000;; Yes - 37349 000058CC 7431 jz short $MIF173 - 37350 000058CE 4D dec bp ;;AN000;; Decrement number of replacables - 37351 - 37352 ;; Search through sublists to find applicable one - 37353 - 37354 000058CF 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL - 37355 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case - 37356 ;;; $IF E ;;AN000;; No - 37357 000058D4 7529 jne short $MIF174 - 37358 ;;; $SEARCH ;;AN000;; - 37359 $MDO175: - 37360 ;mov al,$M_SL.$M_S_ID ;$M_SL=DS:[SI] ;;AN000;; Get ID byte - 37361 000058D6 8A4406 mov al,[si+$M_SUBLIST_STRUC.$M_S_ID] - 37362 ;mov al,[si+6] - 37363 000058D9 0430 add al,30h ;;AN000;; Convert to ASCII - 37364 ; 28/04/2023 - 37365 000058DB 263A4501 cmp al,[es:di+1] ;;AN000;; Is this the right sublist? - 37366 ;;; $EXITIF E ;;AN000;; - 37367 ;jne short $MIF175 - 37368 ;;; $ORELSE ;;AN000;; No - 37369 ;jmp short $MSR175 - 37370 ; 28/04/2023 - 37371 000058DF 741E je short $MSR175 - 37372 $MIF175: - 37373 000058E1 3C30 cmp al,30h ; $M_SPECIAL_CASE ;;AN000;; Does this sublist have ID = 0 - 37374 ;;; $LEAVE E,AND ;;AN000;; Yes - 37375 000058E3 7504 jne short $MLL178 - 37376 000058E5 09D2 or dx,dx ;;AN000;; Are we at the end of the message? - 37377 ;;; $LEAVE Z ;;AN000;; No - 37378 000058E7 7404 jz short $MEN175 - 37379 $MLL178: - 37380 ;add si,$M_SL.$M_S_SIZE ;;AN000;; Next SUBLIST - 37381 ;add si,[si+$M_SUBLIST_STRUC.$M_S_SIZE] ; [si+0] - 37382 ;;add si,[si+0] - 37383 000058E9 0334 add si,[si] - 37384 ;;; ENDLOOP ;;AN000;; Yes - 37385 000058EB EBE9 jmp short $MDO175 - 37386 $MEN175: - 37387 000058ED 803E[D998]FF cmp byte [$M_RT+$M_RES_ADDRS.$M_CLASS],utility_msg_class - 37388 ;cmp byte [$M_RT+69],0FFh ;;AN004;; Is it a utility message? - 37389 ;;;; $IF E ;;AN004;; Yes - 37390 000058F2 7508 jne short $MIF180 - 37391 000058F4 42 inc dx ;;AN000;; Remember to display CR,LF - 37392 000058F5 42 inc dx ;;AN000;; at the end of the message - 37393 000058F6 49 dec cx ;;AN000;; Adjust message length - 37394 000058F7 49 dec cx ;;AN000;; - 37395 000058F8 4F dec di ;;AN000;; Adjust ending address of message - 37396 000058F9 4F dec di ;;AN000;; - 37397 ;;;; $ELSE ;;AN004;; No - 37398 000058FA EB03 jmp short $MEN180 - 37399 $MIF180: - 37400 000058FC BAFFFF mov dx,-1 ;;AN004;; Set special case - 37401 ;;;; $ENDIF ;;AN004;; - 37402 $MEN180: - 37403 ;;; $ENDSRCH ;;AN000;; - 37404 $MSR175: - 37405 ;; $ENDIF ;;AN000;; - 37406 $MIF174: - 37407 ; $ENDIF ;;AN000;; - 37408 $MIF173: - 37409 ;; Prepare and display this part of message - 37410 - 37411 000058FF 57 push di ;;AN000;; Save pointer to replace number - 37412 00005900 29CF sub di,cx ;;AN000;; Determine beginning of string - 37413 00005902 E835FE call $M_DISPLAY_STRING ;;AN000;; Display string until % (or end) - 37414 00005905 5F pop di ;;AN000;; Get back pointer to replace number - 37415 00005906 59 pop cx ;;AN000;; Clean up stack in case error - 37416 ; $LEAVE C,LONG ;;AN000;; Fail if carry was set - 37417 ;jnc short $MXL3 - 37418 ;jmp $MEN165 - 37419 ; 02/05/2023 - 37420 00005907 7214 jc short $MEN165 - 37421 $MXL3: - 37422 00005909 51 push cx ;;AN000;; - 37423 - 37424 ;; Save and reset pointer registers - 37425 - 37426 0000590A 89D1 mov cx,dx ;;AN000;; Get the size of the rest of the message - 37427 ;cmp $M_SL.$M_S_ID,$M_SPECIAL_CASE-30h - 37428 0000590C 807C0600 cmp byte [si+$M_SUBLIST_STRUC.$M_S_ID],0 ; $M_SPECIAL_CASE-30h - 37429 ;cmp byte [si+6],0 ;;AN000;; Is this the %0 case? - 37430 ; $IF NE ;;AN000;; No - 37431 00005910 7412 je short $MIF187 ;;AN000;; Yes - 37432 00005912 09C9 or cx,cx ;;AN000;; Are we finished the whole message? - 37433 ;; $IF NZ ;;AN000;; No - 37434 00005914 7406 jz short $MIF188 ;;AN000;; Yes - 37435 00005916 49 dec cx ;;AN000;; Decrement total size (%) - 37436 00005917 49 dec cx ;;AN000;; Decrement total size (#) - 37437 00005918 47 inc di ;;AN000;; Go past % - 37438 00005919 47 inc di ;;AN000;; Go past replace number - 37439 ;; $ELSE ;;AN000;; Yes, (Note this will not leave because INC) - 37440 ;jmp short $MEN188 - 37441 ; 28/04/2023 - 37442 0000591A EB15 jmp short $MEN187 - 37443 $MIF188: - 37444 0000591C 5E pop si ;;AN000;; Get back pointer to beginning of SUBLISTs - 37445 ;; $ENDIF ;;AN000;; Yes, Note this will not leave because INC - 37446 $MEN188: - 37447 ; $ELSE ;;AN000;; - 37448 ;jmp short $MEN187 - 37449 ; 28/04/2023 - 37450 ; zf = 1 - 37451 ;jmp short $MEN165 - 37452 - 37453 ; 28/04/2023 - 37454 $MXL4: - 37455 $MLL214: - 37456 $MEN165: - 37457 0000591D C706[DC98]0000 mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 - 37458 ;mov word [$M_RT+72],0 ;;AN000;; IF there was an error displaying then EXIT - 37459 ;;AN000;; Reset message number to null - 37460 00005923 C3 retn ;;AN000;; Return - 37461 - 37462 $MIF187: - 37463 00005924 09C9 or cx,cx ;;AN000;; Are we finished the whole message? - 37464 ;; $IF Z ;;AN004;; No - 37465 ;jnz short $MIF192 - 37466 ;pop si ;;AN000;; Get back pointer to beginning of SUBLISTs - 37467 ;; $ELSE ;;AN000;; No - 37468 ;jmp short $MEN192 - 37469 ; 28/04/2023 - 37470 00005926 74F4 jz short $MIF188 - 37471 $MIF192: - 37472 00005928 83F9FF cmp cx,-1 ;;AN004;; Are we at the end of the message? - 37473 ;;; $IF Z ;;AN004;; No - 37474 0000592B 7502 jnz short $MIF194 - 37475 0000592D 31C9 xor cx,cx ;;AN004;; - 37476 ;;; $ENDIF ;;AN000;; - 37477 $MIF194: - 37478 0000592F 09FF or di,di ;;AN004;; Turn ZF off - 37479 ;; $ENDIF ;;AN000;; - 37480 $MEN192: - 37481 ; $ENDIF ;;AN000;; Note this will not leave because INC - 37482 $MEN187: - 37483 ; $LEAVE Z ;;AN000;; - 37484 00005931 74EA jz short $MEN165 - 37485 ; - 37486 00005933 55 push bp ;;AN000;; Save the replace count - 37487 00005934 57 push di ;;AN000;; Save location to complete message - 37488 00005935 06 push es ;;AN000;; - 37489 00005936 51 push cx ;;AN000;; Save size of the rest of the message - 37490 00005937 31C9 xor cx,cx ;;AN000;; Reset CX used for character count - 37491 - 37492 ;; Determine what action is required on parameter - 37493 - 37494 00005939 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL - 37495 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case - 37496 ; $IF E ;;AN000;; - 37497 0000593E 753B jne short $MIF199 - 37498 - 37499 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type and $M_TYPE_MASK - 37500 00005940 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh - 37501 ;test byte [si+7],0Fh ;;AN000;; - 37502 ;; $IF Z ;;AN000;; - 37503 00005944 7508 jnz short $MIF200 - 37504 - 37505 ;; Character type requested - 37506 - 37507 ;les di,dword ptr $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter - 37508 00005946 C47C02 les di,[si+$M_SUBLIST_STRUC.$M_S_VALUE] - 37509 ;les di,[si+2] - 37510 00005949 E84801 call $M_CHAR_REPLACE ;;AN000;; - 37511 ;; $ELSE ;;AN000;; Get the rest of the message to display - 37512 0000594C EB28 jmp short $MEN200 - 37513 $MIF200: - 37514 ;; ENDIF ;;AN000;; - 37515 ;test byte ptr $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK - 37516 0000594E F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh - 37517 ;test byte [si+7],0Dh ;;AN000;; - 37518 ;; $IF Z,OR ;;AN000;; - 37519 00005952 740C jz short $MLL202 - 37520 ;test byte ptr $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK - 37521 00005954 F644070E test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh - 37522 ;test byte [si+7],0Eh ;;AN000;; - 37523 ;;; $IF Z,OR ;;AN000;; - 37524 00005958 7406 jz short $MLL202 - 37525 ;test byte ptr $M_SL.$M_S_FLAG,not Bin_Hex_Type and $M_TYPE_MASK - 37526 0000595A F644070C test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Ch - 37527 ;test byte [si+7],0Ch ;;AN000;; - 37528 ;;;; $IF Z ;;AN000;; - 37529 0000595E 7508 jnz short $MIF202 - 37530 $MLL202: - 37531 - 37532 ;; Numeric type requested - 37533 - 37534 ;les di,dword ptr $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter - 37535 00005960 C47C02 les di,[si+$M_SUBLIST_STRUC.$M_S_VALUE] - 37536 ;les di,[si+2] - 37537 00005963 E85601 call $M_BIN2ASC_REPLACE ;;AN000;; - 37538 ;;;; $ELSE ;;AN000;; Get the rest of the message to display - 37539 00005966 EB0E jmp short $MEN202 - 37540 $MIF202: - 37541 ;;;; ENDIF ;;AN000;; - 37542 ;test byte ptr $M_SL.$M_S_FLAG,not Date_Type and $M_TYPE_MASK - 37543 00005968 F644070B test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Bh - 37544 ;test byte [si+7],0Bh ;;AN000;; - 37545 ;;;; $IF E ;;AN000;; - 37546 0000596C 7505 jnz short $MIF204 - 37547 - 37548 ;; Date type requested - 37549 - 37550 0000596E E8EC01 call $M_DATE_REPLACE ;;AN000;; - 37551 ;;;; $ELSE ;;AN000;; Get the rest of the message to display - 37552 00005971 EB03 jmp short $MEN204 - 37553 $MIF204: ;;AN000;; - 37554 - 37555 ;; Time type requested (Default if we have not matched until here) - 37556 - 37557 00005973 E89E02 call $M_TIME_REPLACE ;;AN000;; - 37558 - 37559 ;;;; $ENDIF ;;AN000;; - 37560 $MEN204: - 37561 ;;; $ENDIF ;;AN000;; - 37562 $MEN202: - 37563 ;; $ENDIF ;;AN000;; - 37564 $MEN200: - 37565 - 37566 ;; With the replace information of the Stack, display the replaceable field - 37567 - 37568 00005976 E85F00 call $M_DISPLAY_REPLACE ;;AN000;; Display the replace - 37569 - 37570 ;; None of the above - Extended/Parse replace - 37571 ; $ELSE ;;AN000;; - 37572 00005979 EB03 jmp short $MEN199 - 37573 $MIF199: - 37574 0000597B E81600 call $M_EXT_PAR_REPLACE ;;AN000;; - 37575 ; $ENDIF ;;AN000;; - 37576 $MEN199: - 37577 - 37578 ;; We must go back and complete the message after the replacable parameter if there is any left - 37579 - 37580 ; $IF NC ;;AN000;; IF there was an error displaying then EXIT - 37581 0000597E 7207 jc short $MIF211 - 37582 ; - 37583 00005980 59 pop cx ;;AN000;; Get size of the rest of the message - 37584 00005981 07 pop es ;;AN000;; Get address of the rest of the message - 37585 00005982 5F pop di ;;AN000;; - 37586 00005983 5D pop bp ;;AN000;; Get replacment count - 37587 00005984 5E pop si ;;AN000;; ELSE get address of first sublist structure - 37588 ; $ELSE ;;AN000;; - 37589 00005985 EB03 jmp short $MEN211 - 37590 $MIF211: - 37591 00005987 83C40A add sp,10 ;;AN000;; Clean up stack if error - 37592 ; 28/04/2023 - 37593 ;stc ;;AN000;; - 37594 ; $ENDIF ;;AN000;; - 37595 $MEN211: - 37596 0000598A 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL - 37597 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case - 37598 ; $ENDDO NE,OR ;;AN000;; - 37599 0000598F 758C jne short $MLL214 - 37600 ; $ENDDO C,LONG ;;AN000;; Go back and display the rest of the message - 37601 ; 10/04/2023 - 37602 ;jc short $MXL4 - 37603 00005991 E90EFF jmp $MDO165 - 37604 - 37605 ; 28/04/2023 - 37606 ;$MXL4: - 37607 ;$MLL214: - 37608 ;$MEN165: - 37609 ; mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 - 37610 ; ;mov word [$M_RT+72],0 ;;AN000;; IF there was an error displaying then EXIT - 37611 ; ;;AN000;; Reset message number to null - 37612 ; retn ;;AN000;; Return - 37613 - 37614 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37615 ;; - 37616 ;; PROC NAME: $M_EXT_PAR_REPLACE - 37617 ;; - 37618 ;; FUNCTION: - 37619 ;; INPUTS: - 37620 ;; OUPUTS: - 37621 ;; - 37622 ;; REGS USED: - 37623 ;; - 37624 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37625 - 37626 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37627 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37628 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37629 - 37630 $M_EXT_PAR_REPLACE: - 37631 00005994 31D2 xor dx,dx ;;AN000;; Prepare for get binary value (HIGH) - 37632 00005996 A1[DC98] mov ax,[$M_RT+$M_RES_ADDRS.$M_MSG_NUM] - 37633 ;mov ax,[$M_RT+72] ;;AN000;; Prepare for get binary value (LOW) - 37634 00005999 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 37635 ;mov word [$M_RT+74],10 ; $M_BASE10 ;;AN000;; Set default divisor - 37636 0000599F E8B2FE call $M_CONVERT2ASC ;;AN000;; - 37637 $MDO215: - 37638 000059A2 58 pop ax ;;AN000;; Get character in register - 37639 000059A3 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al - 37640 ;mov [bx+$M_RT+76],al ;;AN000;; Move char into the buffer - 37641 000059A7 43 inc bx ;;AN000;; Increase buffer count - 37642 000059A8 83FB40 cmp bx,$M_TEMP_BUF_SZ ; cmp bx,64 ;;AN000;; Is buffer full? - 37643 000059AB 7503 jne short $MIF216 ;;AN000;; No - 37644 000059AD E80D00 call $M_FLUSH_BUF ;;AN000;; Flush the buffer - 37645 $MIF216: - 37646 000059B0 FEC9 dec cl ;;AN000;; Have we completed replace? - 37647 000059B2 75EE jnz short $MDO215 - 37648 - 37649 000059B4 B80D0A mov ax,0A0Dh ; mov ax,$M_CR_LF ;;AN000;; Move char into the buffer - 37650 000059B7 8987[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],ax - 37651 ;;mov [bx+$M_RT+76],ax ;;AN000;; Move char into the buffer - 37652 000059BB 43 inc bx ;;AN000;; Increase buffer count - 37653 000059BC 43 inc bx ;;AN000;; Increase buffer count - 37654 ;call $M_FLUSH_BUF ;;AN000;; Flush the buffer - 37655 ;retn ;;AN000:: - 37656 ; 11/04/2023 - 37657 ;jmp $M_FLUSH_BUF - 37658 - 37659 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37660 ;; - 37661 ;; PROC NAME: $M_FLUSH_BUFFER - 37662 ;; - 37663 ;; FUNCTION: Display the contents of the temporary buffer - 37664 ;; INPUTS: DI contains the number of bytes to display - 37665 ;; OUTPUTS: BX reset to zero - 37666 ;; - 37667 ;; REGS USED: - 37668 ;; - 37669 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37670 - 37671 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37672 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:56C8h - 37673 - 37674 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37675 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5E95h + 37304 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37305 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5B2Eh + 37306 + 37307 $M_DISPLAY_MESSAGE: + 37308 ; $DO ;;AN000;; Note: DS:SI -> message + 37309 $MDO165: + 37310 000058A2 31D2 xor dx,dx ;;AN000;; Set size = 0 + 37311 000058A4 09C9 or cx,cx ;;AN000;; Are we finished the message yet? + 37312 ;; $IF NZ ;;AN000;; No + 37313 000058A6 741F jz short $MIF166 ;;AN000;; Yes + 37314 ;mov ah,"%" ;;AN000;; Prepare to scan for % + 37315 ;mov al,0 ;;AN004;; + 37316 ; 12/08/2024 + 37317 000058A8 B80025 mov ax,2500h + 37318 ;; $DO ;;AN000;; Scan through string until % + 37319 $MDO167: + 37320 000058AB 263825 cmp byte [es:di],ah ;;AN000;; Is this character NOT a % + 37321 ;; $LEAVE E,AND ;;AN000;; No + 37322 000058AE 750A jne short $MLL168 + 37323 000058B0 26386501 cmp byte [es:di+1],ah ;;AN000;; Is the next character also a % + 37324 ;; $LEAVE NE,AND ;;AN000;; No + 37325 000058B4 7404 je short $MLL168 + 37326 + 37327 000058B6 38E0 cmp al,ah ;;AN000;; Was the character before a % + 37328 ;; $LEAVE NE ;;AN000;; No, GREAT found it + 37329 000058B8 750D jne short $MEN167 ; 12/08/2024 + 37330 $MLL168: + 37331 000058BA 268A05 mov al,[es:di] ;;AN004;; Yes, (to any of the above) + 37332 000058BD E870FF call $M_IS_IT_DBCS ;;AN004;; Is this character the first part of a DBCS? + 37333 ;;; $IF C ;;AN004;; Yes + 37334 000058C0 7301 jnc short $MIF169 + 37335 000058C2 47 inc di ;;AN004;; Increment past second part + 37336 ;;; $ENDIF ;;AN004;; + 37337 $MIF169: + 37338 000058C3 47 inc di ;;AN000;; Next character in string + 37339 000058C4 42 inc dx ;;AN000;; Size = Size + 1 + 37340 ;dec cx ;;AN000;; Decrement total size + 37341 ;; $ENDDO Z ;;AN000;; Exit scan if we're at the end of the line + 37342 ;jnz short $MDO167 + 37343 ; 12/08/2024 + 37344 000058C5 E2E4 loop $MDO167 + 37345 $MEN167: + 37346 ;; $ENDIF ;;AN000;; + 37347 $MIF166: + 37348 000058C7 56 push si ;;AN000;; Save beginning of sublists + 37349 000058C8 87CA xchg cx,dx ;;AN000;; Get size of message to display (tot sz in DX) + 37350 000058CA 09ED or bp,bp ;;AN000;; Do we have any replacables to do? + 37351 ;; $IF NZ ;;AN000;; Yes + 37352 000058CC 7431 jz short $MIF173 + 37353 000058CE 4D dec bp ;;AN000;; Decrement number of replacables + 37354 + 37355 ;; Search through sublists to find applicable one + 37356 + 37357 000058CF 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL + 37358 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case + 37359 ;;; $IF E ;;AN000;; No + 37360 000058D4 7529 jne short $MIF174 + 37361 ;;; $SEARCH ;;AN000;; + 37362 $MDO175: + 37363 ;mov al,$M_SL.$M_S_ID ;$M_SL=DS:[SI] ;;AN000;; Get ID byte + 37364 000058D6 8A4406 mov al,[si+$M_SUBLIST_STRUC.$M_S_ID] + 37365 ;mov al,[si+6] + 37366 000058D9 0430 add al,30h ;;AN000;; Convert to ASCII + 37367 ; 28/04/2023 + 37368 000058DB 263A4501 cmp al,[es:di+1] ;;AN000;; Is this the right sublist? + 37369 ;;; $EXITIF E ;;AN000;; + 37370 ;jne short $MIF175 + 37371 ;;; $ORELSE ;;AN000;; No + 37372 ;jmp short $MSR175 + 37373 ; 28/04/2023 + 37374 000058DF 741E je short $MSR175 + 37375 $MIF175: + 37376 000058E1 3C30 cmp al,30h ; $M_SPECIAL_CASE ;;AN000;; Does this sublist have ID = 0 + 37377 ;;; $LEAVE E,AND ;;AN000;; Yes + 37378 000058E3 7504 jne short $MLL178 + 37379 000058E5 09D2 or dx,dx ;;AN000;; Are we at the end of the message? + 37380 ;;; $LEAVE Z ;;AN000;; No + 37381 000058E7 7404 jz short $MEN175 + 37382 $MLL178: + 37383 ;add si,$M_SL.$M_S_SIZE ;;AN000;; Next SUBLIST + 37384 ;add si,[si+$M_SUBLIST_STRUC.$M_S_SIZE] ; [si+0] + 37385 ;;add si,[si+0] + 37386 000058E9 0334 add si,[si] + 37387 ;;; ENDLOOP ;;AN000;; Yes + 37388 000058EB EBE9 jmp short $MDO175 + 37389 $MEN175: + 37390 000058ED 803E[D998]FF cmp byte [$M_RT+$M_RES_ADDRS.$M_CLASS],utility_msg_class + 37391 ;cmp byte [$M_RT+69],0FFh ;;AN004;; Is it a utility message? + 37392 ;;;; $IF E ;;AN004;; Yes + 37393 000058F2 7508 jne short $MIF180 + 37394 000058F4 42 inc dx ;;AN000;; Remember to display CR,LF + 37395 000058F5 42 inc dx ;;AN000;; at the end of the message + 37396 000058F6 49 dec cx ;;AN000;; Adjust message length + 37397 000058F7 49 dec cx ;;AN000;; + 37398 000058F8 4F dec di ;;AN000;; Adjust ending address of message + 37399 000058F9 4F dec di ;;AN000;; + 37400 ;;;; $ELSE ;;AN004;; No + 37401 000058FA EB03 jmp short $MEN180 + 37402 $MIF180: + 37403 000058FC BAFFFF mov dx,-1 ;;AN004;; Set special case + 37404 ;;;; $ENDIF ;;AN004;; + 37405 $MEN180: + 37406 ;;; $ENDSRCH ;;AN000;; + 37407 $MSR175: + 37408 ;; $ENDIF ;;AN000;; + 37409 $MIF174: + 37410 ; $ENDIF ;;AN000;; + 37411 $MIF173: + 37412 ;; Prepare and display this part of message + 37413 + 37414 000058FF 57 push di ;;AN000;; Save pointer to replace number + 37415 00005900 29CF sub di,cx ;;AN000;; Determine beginning of string + 37416 00005902 E835FE call $M_DISPLAY_STRING ;;AN000;; Display string until % (or end) + 37417 00005905 5F pop di ;;AN000;; Get back pointer to replace number + 37418 00005906 59 pop cx ;;AN000;; Clean up stack in case error + 37419 ; $LEAVE C,LONG ;;AN000;; Fail if carry was set + 37420 ;jnc short $MXL3 + 37421 ;jmp $MEN165 + 37422 ; 02/05/2023 + 37423 00005907 7214 jc short $MEN165 + 37424 $MXL3: + 37425 00005909 51 push cx ;;AN000;; + 37426 + 37427 ;; Save and reset pointer registers + 37428 + 37429 0000590A 89D1 mov cx,dx ;;AN000;; Get the size of the rest of the message + 37430 ;cmp $M_SL.$M_S_ID,$M_SPECIAL_CASE-30h + 37431 0000590C 807C0600 cmp byte [si+$M_SUBLIST_STRUC.$M_S_ID],0 ; $M_SPECIAL_CASE-30h + 37432 ;cmp byte [si+6],0 ;;AN000;; Is this the %0 case? + 37433 ; $IF NE ;;AN000;; No + 37434 00005910 7412 je short $MIF187 ;;AN000;; Yes + 37435 00005912 09C9 or cx,cx ;;AN000;; Are we finished the whole message? + 37436 ;; $IF NZ ;;AN000;; No + 37437 00005914 7406 jz short $MIF188 ;;AN000;; Yes + 37438 00005916 49 dec cx ;;AN000;; Decrement total size (%) + 37439 00005917 49 dec cx ;;AN000;; Decrement total size (#) + 37440 00005918 47 inc di ;;AN000;; Go past % + 37441 00005919 47 inc di ;;AN000;; Go past replace number + 37442 ;; $ELSE ;;AN000;; Yes, (Note this will not leave because INC) + 37443 ;jmp short $MEN188 + 37444 ; 28/04/2023 + 37445 0000591A EB15 jmp short $MEN187 + 37446 $MIF188: + 37447 0000591C 5E pop si ;;AN000;; Get back pointer to beginning of SUBLISTs + 37448 ;; $ENDIF ;;AN000;; Yes, Note this will not leave because INC + 37449 $MEN188: + 37450 ; $ELSE ;;AN000;; + 37451 ;jmp short $MEN187 + 37452 ; 28/04/2023 + 37453 ; zf = 1 + 37454 ;jmp short $MEN165 + 37455 + 37456 ; 28/04/2023 + 37457 $MXL4: + 37458 $MLL214: + 37459 $MEN165: + 37460 0000591D C706[DC98]0000 mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 + 37461 ;mov word [$M_RT+72],0 ;;AN000;; IF there was an error displaying then EXIT + 37462 ;;AN000;; Reset message number to null + 37463 00005923 C3 retn ;;AN000;; Return + 37464 + 37465 $MIF187: + 37466 00005924 09C9 or cx,cx ;;AN000;; Are we finished the whole message? + 37467 ;; $IF Z ;;AN004;; No + 37468 ;jnz short $MIF192 + 37469 ;pop si ;;AN000;; Get back pointer to beginning of SUBLISTs + 37470 ;; $ELSE ;;AN000;; No + 37471 ;jmp short $MEN192 + 37472 ; 28/04/2023 + 37473 00005926 74F4 jz short $MIF188 + 37474 $MIF192: + 37475 00005928 83F9FF cmp cx,-1 ;;AN004;; Are we at the end of the message? + 37476 ;;; $IF Z ;;AN004;; No + 37477 0000592B 7502 jnz short $MIF194 + 37478 0000592D 31C9 xor cx,cx ;;AN004;; + 37479 ;;; $ENDIF ;;AN000;; + 37480 $MIF194: + 37481 0000592F 09FF or di,di ;;AN004;; Turn ZF off + 37482 ;; $ENDIF ;;AN000;; + 37483 $MEN192: + 37484 ; $ENDIF ;;AN000;; Note this will not leave because INC + 37485 $MEN187: + 37486 ; $LEAVE Z ;;AN000;; + 37487 00005931 74EA jz short $MEN165 + 37488 ; + 37489 00005933 55 push bp ;;AN000;; Save the replace count + 37490 00005934 57 push di ;;AN000;; Save location to complete message + 37491 00005935 06 push es ;;AN000;; + 37492 00005936 51 push cx ;;AN000;; Save size of the rest of the message + 37493 00005937 31C9 xor cx,cx ;;AN000;; Reset CX used for character count + 37494 + 37495 ;; Determine what action is required on parameter + 37496 + 37497 00005939 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL + 37498 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case + 37499 ; $IF E ;;AN000;; + 37500 0000593E 753B jne short $MIF199 + 37501 + 37502 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type and $M_TYPE_MASK + 37503 00005940 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh + 37504 ;test byte [si+7],0Fh ;;AN000;; + 37505 ;; $IF Z ;;AN000;; + 37506 00005944 7508 jnz short $MIF200 + 37507 + 37508 ;; Character type requested + 37509 + 37510 ;les di,dword ptr $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter + 37511 00005946 C47C02 les di,[si+$M_SUBLIST_STRUC.$M_S_VALUE] + 37512 ;les di,[si+2] + 37513 00005949 E84801 call $M_CHAR_REPLACE ;;AN000;; + 37514 ;; $ELSE ;;AN000;; Get the rest of the message to display + 37515 0000594C EB28 jmp short $MEN200 + 37516 $MIF200: + 37517 ;; ENDIF ;;AN000;; + 37518 ;test byte ptr $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK + 37519 0000594E F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh + 37520 ;test byte [si+7],0Dh ;;AN000;; + 37521 ;; $IF Z,OR ;;AN000;; + 37522 00005952 740C jz short $MLL202 + 37523 ;test byte ptr $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK + 37524 00005954 F644070E test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh + 37525 ;test byte [si+7],0Eh ;;AN000;; + 37526 ;;; $IF Z,OR ;;AN000;; + 37527 00005958 7406 jz short $MLL202 + 37528 ;test byte ptr $M_SL.$M_S_FLAG,not Bin_Hex_Type and $M_TYPE_MASK + 37529 0000595A F644070C test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Ch + 37530 ;test byte [si+7],0Ch ;;AN000;; + 37531 ;;;; $IF Z ;;AN000;; + 37532 0000595E 7508 jnz short $MIF202 + 37533 $MLL202: + 37534 + 37535 ;; Numeric type requested + 37536 + 37537 ;les di,dword ptr $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter + 37538 00005960 C47C02 les di,[si+$M_SUBLIST_STRUC.$M_S_VALUE] + 37539 ;les di,[si+2] + 37540 00005963 E85601 call $M_BIN2ASC_REPLACE ;;AN000;; + 37541 ;;;; $ELSE ;;AN000;; Get the rest of the message to display + 37542 00005966 EB0E jmp short $MEN202 + 37543 $MIF202: + 37544 ;;;; ENDIF ;;AN000;; + 37545 ;test byte ptr $M_SL.$M_S_FLAG,not Date_Type and $M_TYPE_MASK + 37546 00005968 F644070B test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Bh + 37547 ;test byte [si+7],0Bh ;;AN000;; + 37548 ;;;; $IF E ;;AN000;; + 37549 0000596C 7505 jnz short $MIF204 + 37550 + 37551 ;; Date type requested + 37552 + 37553 0000596E E8EC01 call $M_DATE_REPLACE ;;AN000;; + 37554 ;;;; $ELSE ;;AN000;; Get the rest of the message to display + 37555 00005971 EB03 jmp short $MEN204 + 37556 $MIF204: ;;AN000;; + 37557 + 37558 ;; Time type requested (Default if we have not matched until here) + 37559 + 37560 00005973 E89E02 call $M_TIME_REPLACE ;;AN000;; + 37561 + 37562 ;;;; $ENDIF ;;AN000;; + 37563 $MEN204: + 37564 ;;; $ENDIF ;;AN000;; + 37565 $MEN202: + 37566 ;; $ENDIF ;;AN000;; + 37567 $MEN200: + 37568 + 37569 ;; With the replace information of the Stack, display the replaceable field + 37570 + 37571 00005976 E85F00 call $M_DISPLAY_REPLACE ;;AN000;; Display the replace + 37572 + 37573 ;; None of the above - Extended/Parse replace + 37574 ; $ELSE ;;AN000;; + 37575 00005979 EB03 jmp short $MEN199 + 37576 $MIF199: + 37577 0000597B E81600 call $M_EXT_PAR_REPLACE ;;AN000;; + 37578 ; $ENDIF ;;AN000;; + 37579 $MEN199: + 37580 + 37581 ;; We must go back and complete the message after the replacable parameter if there is any left + 37582 + 37583 ; $IF NC ;;AN000;; IF there was an error displaying then EXIT + 37584 0000597E 7207 jc short $MIF211 + 37585 ; + 37586 00005980 59 pop cx ;;AN000;; Get size of the rest of the message + 37587 00005981 07 pop es ;;AN000;; Get address of the rest of the message + 37588 00005982 5F pop di ;;AN000;; + 37589 00005983 5D pop bp ;;AN000;; Get replacment count + 37590 00005984 5E pop si ;;AN000;; ELSE get address of first sublist structure + 37591 ; $ELSE ;;AN000;; + 37592 00005985 EB03 jmp short $MEN211 + 37593 $MIF211: + 37594 00005987 83C40A add sp,10 ;;AN000;; Clean up stack if error + 37595 ; 28/04/2023 + 37596 ;stc ;;AN000;; + 37597 ; $ENDIF ;;AN000;; + 37598 $MEN211: + 37599 0000598A 833E[DC98]00 cmp word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 ; $M_NULL + 37600 ;cmp word [$M_RT+72],0 ;;AN000;; Is this an Extended/Parse case + 37601 ; $ENDDO NE,OR ;;AN000;; + 37602 0000598F 758C jne short $MLL214 + 37603 ; $ENDDO C,LONG ;;AN000;; Go back and display the rest of the message + 37604 ; 10/04/2023 + 37605 ;jc short $MXL4 + 37606 00005991 E90EFF jmp $MDO165 + 37607 + 37608 ; 28/04/2023 + 37609 ;$MXL4: + 37610 ;$MLL214: + 37611 ;$MEN165: + 37612 ; mov word [$M_RT+$M_RES_ADDRS.$M_MSG_NUM],0 + 37613 ; ;mov word [$M_RT+72],0 ;;AN000;; IF there was an error displaying then EXIT + 37614 ; ;;AN000;; Reset message number to null + 37615 ; retn ;;AN000;; Return + 37616 + 37617 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37618 ;; + 37619 ;; PROC NAME: $M_EXT_PAR_REPLACE + 37620 ;; + 37621 ;; FUNCTION: + 37622 ;; INPUTS: + 37623 ;; OUPUTS: + 37624 ;; + 37625 ;; REGS USED: + 37626 ;; + 37627 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37628 + 37629 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37630 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37631 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37632 + 37633 $M_EXT_PAR_REPLACE: + 37634 00005994 31D2 xor dx,dx ;;AN000;; Prepare for get binary value (HIGH) + 37635 00005996 A1[DC98] mov ax,[$M_RT+$M_RES_ADDRS.$M_MSG_NUM] + 37636 ;mov ax,[$M_RT+72] ;;AN000;; Prepare for get binary value (LOW) + 37637 00005999 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 37638 ;mov word [$M_RT+74],10 ; $M_BASE10 ;;AN000;; Set default divisor + 37639 0000599F E8B2FE call $M_CONVERT2ASC ;;AN000;; + 37640 $MDO215: + 37641 000059A2 58 pop ax ;;AN000;; Get character in register + 37642 000059A3 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al + 37643 ;mov [bx+$M_RT+76],al ;;AN000;; Move char into the buffer + 37644 000059A7 43 inc bx ;;AN000;; Increase buffer count + 37645 000059A8 83FB40 cmp bx,$M_TEMP_BUF_SZ ; cmp bx,64 ;;AN000;; Is buffer full? + 37646 000059AB 7503 jne short $MIF216 ;;AN000;; No + 37647 000059AD E80D00 call $M_FLUSH_BUF ;;AN000;; Flush the buffer + 37648 $MIF216: + 37649 000059B0 FEC9 dec cl ;;AN000;; Have we completed replace? + 37650 000059B2 75EE jnz short $MDO215 + 37651 + 37652 000059B4 B80D0A mov ax,0A0Dh ; mov ax,$M_CR_LF ;;AN000;; Move char into the buffer + 37653 000059B7 8987[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],ax + 37654 ;;mov [bx+$M_RT+76],ax ;;AN000;; Move char into the buffer + 37655 000059BB 43 inc bx ;;AN000;; Increase buffer count + 37656 000059BC 43 inc bx ;;AN000;; Increase buffer count + 37657 ;call $M_FLUSH_BUF ;;AN000;; Flush the buffer + 37658 ;retn ;;AN000:: + 37659 ; 11/04/2023 + 37660 ;jmp $M_FLUSH_BUF + 37661 + 37662 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37663 ;; + 37664 ;; PROC NAME: $M_FLUSH_BUFFER + 37665 ;; + 37666 ;; FUNCTION: Display the contents of the temporary buffer + 37667 ;; INPUTS: DI contains the number of bytes to display + 37668 ;; OUTPUTS: BX reset to zero + 37669 ;; + 37670 ;; REGS USED: + 37671 ;; + 37672 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37673 + 37674 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37675 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:56C8h 37676 - 37677 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37678 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5D1Bh - 37679 $M_FLUSH_BUF: - 37680 000059BD 51 push cx ;;AN000;; Save changed regs - 37681 000059BE 06 push es ;;AN000;; - 37682 000059BF 57 push di ;;AN000;; - 37683 000059C0 1E push ds ;;AN000;; Set ES pointing to buffer - 37684 000059C1 07 pop es ;;AN000;; - 37685 000059C2 89D9 mov cx,bx ;;AN000;; Set number of bytes to display - 37686 000059C4 31DB xor bx,bx ;;AN000;; Reset buffer counter - 37687 000059C6 8D3E[E098] lea di,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 37688 ;lea di,[$M_RT+76] ;;AN000;; Reset buffer location pointer - 37689 000059CA E86DFD call $M_DISPLAY_STRING ;;AN000;; Display the buffer - 37690 000059CD 7204 jc short $MIF314 - 37691 000059CF 5F pop di ;;AN000;; No, Restore changed regs - 37692 000059D0 07 pop es ;;AN000;; - 37693 000059D1 59 pop cx ;;AN000;; - 37694 ;jmp short $MEN314 - 37695 ; 11/04/2023 - 37696 000059D2 C3 retn - 37697 $MIF314: - 37698 000059D3 83C406 add sp,6 ;;AN000;; Fix stack - 37699 000059D6 F9 stc ;;AN000;; - 37700 $MEN314: - 37701 000059D7 C3 retn ;;AN000;; Return - 37702 - 37703 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37704 ;; - 37705 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37706 - 37707 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37708 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5609h + 37677 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37678 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5E95h + 37679 + 37680 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37681 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5D1Bh + 37682 $M_FLUSH_BUF: + 37683 000059BD 51 push cx ;;AN000;; Save changed regs + 37684 000059BE 06 push es ;;AN000;; + 37685 000059BF 57 push di ;;AN000;; + 37686 000059C0 1E push ds ;;AN000;; Set ES pointing to buffer + 37687 000059C1 07 pop es ;;AN000;; + 37688 000059C2 89D9 mov cx,bx ;;AN000;; Set number of bytes to display + 37689 000059C4 31DB xor bx,bx ;;AN000;; Reset buffer counter + 37690 000059C6 8D3E[E098] lea di,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 37691 ;lea di,[$M_RT+76] ;;AN000;; Reset buffer location pointer + 37692 000059CA E86DFD call $M_DISPLAY_STRING ;;AN000;; Display the buffer + 37693 000059CD 7204 jc short $MIF314 + 37694 000059CF 5F pop di ;;AN000;; No, Restore changed regs + 37695 000059D0 07 pop es ;;AN000;; + 37696 000059D1 59 pop cx ;;AN000;; + 37697 ;jmp short $MEN314 + 37698 ; 11/04/2023 + 37699 000059D2 C3 retn + 37700 $MIF314: + 37701 000059D3 83C406 add sp,6 ;;AN000;; Fix stack + 37702 000059D6 F9 stc ;;AN000;; + 37703 $MEN314: + 37704 000059D7 C3 retn ;;AN000;; Return + 37705 + 37706 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37707 ;; + 37708 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 37709 - 37710 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37711 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5DD6h + 37710 ; 11/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37711 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5609h 37712 - 37713 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37714 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5C5Ch - 37715 $M_DISPLAY_REPLACE: - 37716 000059D8 31DB xor bx,bx ;;AN000;; Use BX for buffer count - 37717 ;;cmp $M_SL.$M_S_ID,$M_SPECIAL_CASE-30h ; 0 - 37718 000059DA 807C0600 cmp byte [si+$M_SUBLIST_STRUC.$M_S_ID],0 - 37719 ;cmp byte [si+6],0 ;;AN000;; Is this the special case (convert to ASCII) - 37720 000059DE 7511 jne short $MIF276 - 37721 - 37722 000059E0 C787[E098]202D mov word [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],2D20h ; $M_SPACE_HYP - 37723 ;mov word [bx+$M_RT+76],2D20h ;;AN000;; Move in a " -" + 37713 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37714 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5DD6h + 37715 + 37716 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37717 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5C5Ch + 37718 $M_DISPLAY_REPLACE: + 37719 000059D8 31DB xor bx,bx ;;AN000;; Use BX for buffer count + 37720 ;;cmp $M_SL.$M_S_ID,$M_SPECIAL_CASE-30h ; 0 + 37721 000059DA 807C0600 cmp byte [si+$M_SUBLIST_STRUC.$M_S_ID],0 + 37722 ;cmp byte [si+6],0 ;;AN000;; Is this the special case (convert to ASCII) + 37723 000059DE 7511 jne short $MIF276 37724 - 37725 000059E6 43 inc bx ;;AN000;; Increment count - 37726 000059E7 43 inc bx ;;AN000;; Increment count + 37725 000059E0 C787[E098]202D mov word [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],2D20h ; $M_SPACE_HYP + 37726 ;mov word [bx+$M_RT+76],2D20h ;;AN000;; Move in a " -" 37727 - 37728 000059E8 C687[E098]20 mov byte [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],20h ; $M_SPACE - 37729 ;mov byte [bx+$M_RT+76],20h ;;AN000;; Move in a " " + 37728 000059E6 43 inc bx ;;AN000;; Increment count + 37729 000059E7 43 inc bx ;;AN000;; Increment count 37730 - 37731 000059ED 43 inc bx ;;AN000;; Increment count - 37732 000059EE E8CCFF call $M_FLUSH_BUF ;;AN000;; Write out " - " to prepare for special case - 37733 $MIF276: - 37734 000059F1 5D pop bp ;;AN000;; Remember the return address - 37735 000059F2 31DB xor bx,bx ;;AN000;; Use BX for buffer count - 37736 000059F4 31D2 xor dx,dx ;;AN000;; Use DX for count of parms taken off the stack - 37737 - 37738 000059F6 880E[D698] mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl ;;AN000;; Save size to later clear stack - 37739 ;mov [$M_RT+66],cl - 37740 - 37741 ;mov al,byte ptr $M_SL.$M_S_MINW ;;AN000;; Get the minimum width - 37742 000059FA 8A4409 mov al,[si+$M_SUBLIST_STRUC.$M_S_MINW] - 37743 ;mov al,[si+9] - 37744 - 37745 000059FD 38C8 cmp al,cl ;;AN000;; Do we need pad chars added? - 37746 000059FF 761E jna short $MIF278 - 37747 00005A01 28C8 sub al,cl ;;AN000;; Calculate how many pad chars are needed. - 37748 00005A03 88C6 mov dh,al ;;AN000;; Save the number of pad characters - 37749 - 37750 ;test byte ptr $M_SL.$M_S_FLAG,Right_Align - 37751 00005A05 F6440780 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],80h - 37752 ;test byte [si+7],80h ;;AN000;; Was replaceable parm to be right aligned? - 37753 00005A09 7414 jz short $MIF279 ;;AN000;; No - 37754 $MDO280: - 37755 ;mov al,byte ptr $M_SL.$M_S_PAD ;;AN000;; - 37756 00005A0B 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] - 37757 ;mov al,[si+0Ah] - 37758 00005A0E 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al - 37759 ;mov [bx+$M_RT+76],al ;;AN000;; Move in a pad char - 37760 - 37761 00005A12 43 inc bx ;;AN000;; - 37762 00005A13 83FB40 cmp bx,$M_TEMP_BUF_SZ ; 64 ;;AN000;; Is buffer full? - 37763 00005A16 7503 jne short $MIF281 - 37764 00005A18 E8A2FF call $M_FLUSH_BUF ;;AN000;; Flush the buffer - 37765 $MIF281: - 37766 00005A1B FECE dec dh ;;AN000;; Have we filled with enough pad chars? - 37767 00005A1D 75EC jnz short $MDO280 - 37768 $MIF279: - 37769 $MIF278: - 37770 ;cmp byte ptr $M_SL.$M_S_MAXW,$M_UNLIM_W - 37771 00005A1F 807C0800 cmp byte [si+$M_SUBLIST_STRUC.$M_S_MAXW],0 ; $M_UNLIM_W - 37772 ;cmp byte [si+8],0 ;;AN000;; Is maximum width unlimited - 37773 00005A23 740C je short $MIF286 - 37774 - 37775 ;cmp byte ptr $M_SL.$M_S_MAXW,CL ;;AN000;; Will we exceed maximum width? - 37776 00005A25 384C08 cmp byte [si+$M_SUBLIST_STRUC.$M_S_MAXW],cl - 37777 ;;cmp byte [si+8],cl - 37778 00005A28 7307 jnb short $MIF287 - 37779 - 37780 ; 03/05/2023 - 37781 ;;sub cl,byte ptr $M_SL.$M_S_MAXW ;;AN000;; Calculate how many extra chars - 37782 ;sub cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] - 37783 ;;sub cl,[si+8] - 37784 00005A2A 88CA mov dl,cl ;;AN000;; Remember how many chars to pop off - 37785 ;;mov cl,byte ptr $M_SL.$M_S_MAXW ;;AN000;; Set new string length - 37786 ;mov cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] - 37787 ;;mov cl,[si+8] - 37788 ; 03/05/2023 - 37789 00005A2C 8A4C08 mov cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] - 37790 00005A2F 28CA sub dl,cl - 37791 $MIF287: - 37792 $MIF286: - 37793 00005A31 09C9 or cx,cx ;;AN000;; - 37794 00005A33 7424 jz short $MIF290 ;;AN000;; - 37795 $MDO291: - 37796 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type not $M_TYPE_MASK - 37797 00005A35 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh - 37798 ;test byte [si+7],0Fh ;;AN000;; - 37799 00005A39 750C jnz short $MIF292 - 37800 - 37801 ;test $M_SL.$M_S_FLAG,Char_field_ASCIIZ and $M_SIZE_MASK - 37802 00005A3B F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h - 37803 ;test byte [si+7],10h ;;AN000;; Is this replace a ASCIIZ string? - 37804 00005A3F 7406 jz short $MIF292 ;;AN000;; No - 37805 - 37806 00005A41 268A05 mov al,[es:di] ;;AN000;; Get first character from string - 37807 00005A44 47 inc di ;;AN000;; Next character in string - 37808 00005A45 EB01 jmp short $MEN292 - 37809 $MIF292: - 37810 00005A47 58 pop ax ;;AN000;; Get character in register - 37811 $MEN292: - 37812 ;mov byte ptr $M_RT.$M_TEMP_BUF[bx],al - 37813 00005A48 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al - 37814 ;mov [bx+$M_RT+76],al ;;AN000;; Move char into the buffer - 37815 ; 03/05/2023 - 37816 00005A4C 43 inc bx ;;AN000;; Increase buffer count - 37817 00005A4D 83FB40 cmp bx,$M_TEMP_BUF_SZ ; cmp bx,64 ;;AN000;; Is buffer full? - 37818 00005A50 7503 jne short $MIF295 ;;AN000;; - 37819 00005A52 E868FF call $M_FLUSH_BUF ;;AN000;; Flush the buffer - 37820 $MIF295: - 37821 00005A55 FEC9 dec cl ;;AN000;; Have we completed replace? - 37822 00005A57 75DC jnz short $MDO291 - 37823 $MIF290: - 37824 ;test byte ptr $M_SL.$M_S_FLAG,Right_Align - 37825 00005A59 F6440780 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],80h - 37826 ;test byte [si+7],80h ;;AN000;; Was replaceable parm to be left aligned? - 37827 00005A5D 7518 jnz short $MIF299 ;;AN000;; Yes - 37828 00005A5F 08F6 or dh,dh ;;AN000;; Do we need pad chars added? - 37829 00005A61 7414 jz short $MIF300 - 37830 $MDO301: - 37831 ;mov al,byte ptr $M_SL.$M_S_PAD ;;AN000;; - 37832 00005A63 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] - 37833 ;mov al,[si+0Ah] - 37834 - 37835 ;mov byte ptr $M_RT.$M_TEMP_BUF[bx],al - 37836 00005A66 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al - 37837 ; 03/05/2023 - 37838 ;mov [bx+$M_RT+76],al ;;AN000;; Move in a pad char - 37839 - 37840 00005A6A 43 inc bx ;;AN000;; - 37841 00005A6B 83FB40 cmp bx,$M_TEMP_BUF_SZ ; 64 ;;AN000;; Is buffer full? - 37842 00005A6E 7503 jne short $MIF302 ;;AN000;; No - 37843 ;;AN000;; Yes - 37844 00005A70 E84AFF call $M_FLUSH_BUF ;;AN000;; Flush the buffer - 37845 $MIF302: - 37846 00005A73 FECE dec dh ;;AN000;; Have we filled with enough pad chars? - 37847 00005A75 75EC jnz short $MDO301 ;;AN000;; - 37848 $MIF300: - 37849 $MIF299: - 37850 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type and $M_TYPE_MASK - 37851 00005A77 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh - 37852 ;test byte [si+7],0Fh ;;AN000;; - 37853 00005A7B 7506 jnz short $MIF307 - 37854 - 37855 ;test $M_SL.$M_S_FLAG,Char_field_ASCIIZ and $M_SIZE_MASK - 37856 00005A7D F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h - 37857 ;test byte [si+7],10h ;;AN000;; Is this replace a ASCIIZ string? - 37858 ; 11/04/2023 - 37859 ;jz short $MIF307 ;;AN000;; - 37860 ;jmp short $MEN307 ;;AN000;; - 37861 00005A81 750C jnz short $MEN307 - 37862 $MIF307: - 37863 00005A83 08D2 or dl,dl ;;AN000;; - 37864 00005A85 7408 jz short $MIF309 ;;AN000;; - 37865 $MDO310: - 37866 00005A87 8F06[DA98] pop word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] - 37867 ;pop word [$M_RT+70] ;;AN000;; Clean Up stack using spare variable - 37868 00005A8B FECA dec dl ;;AN000;; Are we done? - 37869 00005A8D 75F8 jnz short $MDO310 - 37870 $MIF309: - 37871 $MEN307: - 37872 00005A8F E82BFF call $M_FLUSH_BUF ;;AN000;; Flush the buffer for the final time - 37873 00005A92 55 push bp ;;AN000;; Restore the return address - 37874 00005A93 C3 retn ;;AN000;; - 37875 - 37876 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37877 ;; - 37878 ;; PROC NAME: $M_CHAR_REPLACE - 37879 ;; - 37880 ;; FUNCTION: Will prepare a single char or ASCIIZ string for replace - 37881 ;; INPUTS: DS:SI points at corresponding SUBLIST - 37882 ;; ES:DI contains the VALUE from SUBLIST - 37883 ;; OUTPUTS: CX contains number of characters on stack - 37884 ;; Top of stack --> Last character - 37885 ;; . . . - 37886 ;; Bot of stack --> First character - 37887 ;; - 37888 ;; OTHER REGS Revised: AX - 37889 ;; - 37890 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37891 - 37892 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37893 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37894 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37895 $M_CHAR_REPLACE: - 37896 00005A94 5D pop bp ;;AN000;; Save return address - 37897 ;test $M_SL.$M_S_FLAG,not Char_Field_Char and $M_SIZE_MASK - 37898 00005A95 F6440730 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],30h - 37899 ;test byte [si+7],30h ;;AN000;; Was Character specified? - 37900 00005A99 7512 jnz short $MIF317 ;;AN000;; No - 37901 00005A9B 268A05 mov al,[es:di] ;;AN000;; Get the character - 37902 00005A9E 50 push ax ;;AN000;; Put it on the stack - 37903 00005A9F 41 inc cx ;;AN000;; Increase the count - 37904 00005AA0 E88DFD call $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character - 37905 00005AA3 7306 jnc short $MIF318 - 37906 00005AA5 268A4501 mov al,[es:di+1] ;;AN000;; Get the next character - 37907 00005AA9 50 push ax ;;AN000;; Put it on the stack - 37908 00005AAA F8 clc ;;AN000;; Clear the carry - 37909 $MIF318: - 37910 00005AAB EB0D jmp short $MEN317 - 37911 $MIF317: - 37912 $MDO321: - 37913 00005AAD 268A05 mov al,[es:di] ;;AN000;; Get the character - 37914 00005AB0 08C0 or al,al ;;AN000;; Is it the NULL? - 37915 00005AB2 7404 jz short $MEN321 ;;AN000;; Yes - 37916 00005AB4 47 inc di ;;AN000;; Next character - 37917 00005AB5 41 inc cx ;;AN000;; Increment the count - 37918 00005AB6 EBF5 jmp short $MDO321 - 37919 $MEN321: - 37920 00005AB8 29CF sub di,cx ;;AN000;; Set DI at the beginning of the string - 37921 $MEN317: - 37922 00005ABA 55 push bp ;;AN000;; Restore return address - 37923 00005ABB C3 retn ;;AN000;; - 37924 - 37925 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37926 ;; - 37927 ;; PROC NAME: $M_BIN2ASC_REPLACE - 37928 ;; - 37929 ;; FUNCTION: Convert a signed or unsigned binary number to an ASCII string - 37930 ;; and prepare to display - 37931 ;; INPUTS: DS:SI points at corresponding SUBLIST - 37932 ;; ES:DI contains the VALUE from SUBLIST - 37933 ;; OUTPUTS: CX contains number of characters on stack - 37934 ;; Top of stack --> Last character - 37935 ;; . . . - 37936 ;; Bot of stack --> First character - 37937 ;; OTHER REGS Revised: BX,DX,AX - 37938 ;; - 37939 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 37940 - 37941 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 37942 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 37943 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM - 37944 $M_BIN2ASC_REPLACE: - 37945 00005ABC 5D pop bp ;;AN000;; Save return address - 37946 00005ABD 31D2 xor dx,dx ;;AN000;; Prepare for get binary value (HIGH) - 37947 00005ABF 31C0 xor ax,ax ;;AN000;; Prepare for get binary value (LOW) - 37948 00005AC1 C706[DE98]1000 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],16 ; $M_BASE16 - 37949 ;mov word [$M_RT+74],16 ; $M_BASE16 ;;AN000;; Set default divisor - 37950 - 37951 00005AC7 31DB xor bx,bx ;;AN000;; Use BX as the NEG flag (if applicable) - 37952 - 37953 ;test $M_SL.$M_S_FLAG,not $M_BYTE and $M_SIZE_MASK - 37954 00005AC9 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h - 37955 ;test byte [si+7],20h ;;AN000;; Was BYTE specified? - 37956 00005ACD 7511 jnz short $MIF325 ;;AN000;; No - 37957 - 37958 00005ACF 268A05 mov al,[es:di] ;;AN000;; Setup byte in AL - 37959 - 37960 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK - 37961 00005AD2 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh - 37962 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? - 37963 00005AD6 753D jnz short $MIF326 ;;AN000;; No - 37964 - 37965 00005AD8 A880 test al,10000000b ; 80h ;;AN000;; Is this number negative? - 37966 00005ADA 7433 jz short $MIF327 ;;AN000;; No - 37967 ;;AN000;; Yes - 37968 ; 12/04/2023 - 37969 ;inc bx ;;AN000;; Remember that it was negative - 37970 00005ADC 247F and al,01111111b ;;AN000;; Make it positive - 37971 - 37972 ; 12/04/2023 - Retrop DOS v4.0 COMMAND.COM - 37973 ;jmp short $MIF327 - 37974 00005ADE EB2E jmp short $MIF350 ; inc bx - 37975 - 37976 ; 12/04/2023 - 37977 %if 0 - 37978 $MIF327: - 37979 $MIF335: ; 12/04/2023 - 37980 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 37981 ;mov word [$M_RT+74],10 ;;AN000;; - 37982 $MIF326: - 37983 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK - 37984 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh - 37985 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? - 37986 jnz short $MIF330 ;;AN000;; No - 37987 ;;AN000;; Yes - 37988 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 37989 ;mov word [$M_RT+74],10 ;;AN000;; - 37990 $MIF330: - 37991 jmp short $MEN325 - 37992 - 37993 %endif - 37994 - 37995 $MIF325: - 37996 ;test $M_SL.$M_S_FLAG,not $M_WORD and $M_SIZE_MASK - 37997 00005AE0 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h - 37998 ;test byte [si+7],10h ;;AN000;; Was WORD specified? - 37999 00005AE4 7513 jnz short $MIF333 ;;AN000;; No - 38000 ;;AN000;; Yes - 38001 00005AE6 268B05 mov ax,[es:di] ;;AN000;; Setup byte in AL - 38002 - 38003 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK - 38004 00005AE9 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh - 38005 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? - 38006 00005AED 7526 jnz short $MIF334 ;;AN000;; No - 38007 ;;AN000;; Yes - 38008 00005AEF F6C480 test ah,10000000b ; 80h ;;AN000;; Is this number negative? - 38009 00005AF2 741B jz short $MIF335 ;;AN000;; No + 37731 000059E8 C687[E098]20 mov byte [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],20h ; $M_SPACE + 37732 ;mov byte [bx+$M_RT+76],20h ;;AN000;; Move in a " " + 37733 + 37734 000059ED 43 inc bx ;;AN000;; Increment count + 37735 000059EE E8CCFF call $M_FLUSH_BUF ;;AN000;; Write out " - " to prepare for special case + 37736 $MIF276: + 37737 000059F1 5D pop bp ;;AN000;; Remember the return address + 37738 000059F2 31DB xor bx,bx ;;AN000;; Use BX for buffer count + 37739 000059F4 31D2 xor dx,dx ;;AN000;; Use DX for count of parms taken off the stack + 37740 + 37741 000059F6 880E[D698] mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl ;;AN000;; Save size to later clear stack + 37742 ;mov [$M_RT+66],cl + 37743 + 37744 ;mov al,byte ptr $M_SL.$M_S_MINW ;;AN000;; Get the minimum width + 37745 000059FA 8A4409 mov al,[si+$M_SUBLIST_STRUC.$M_S_MINW] + 37746 ;mov al,[si+9] + 37747 + 37748 000059FD 38C8 cmp al,cl ;;AN000;; Do we need pad chars added? + 37749 000059FF 761E jna short $MIF278 + 37750 00005A01 28C8 sub al,cl ;;AN000;; Calculate how many pad chars are needed. + 37751 00005A03 88C6 mov dh,al ;;AN000;; Save the number of pad characters + 37752 + 37753 ;test byte ptr $M_SL.$M_S_FLAG,Right_Align + 37754 00005A05 F6440780 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],80h + 37755 ;test byte [si+7],80h ;;AN000;; Was replaceable parm to be right aligned? + 37756 00005A09 7414 jz short $MIF279 ;;AN000;; No + 37757 $MDO280: + 37758 ;mov al,byte ptr $M_SL.$M_S_PAD ;;AN000;; + 37759 00005A0B 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] + 37760 ;mov al,[si+0Ah] + 37761 00005A0E 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al + 37762 ;mov [bx+$M_RT+76],al ;;AN000;; Move in a pad char + 37763 + 37764 00005A12 43 inc bx ;;AN000;; + 37765 00005A13 83FB40 cmp bx,$M_TEMP_BUF_SZ ; 64 ;;AN000;; Is buffer full? + 37766 00005A16 7503 jne short $MIF281 + 37767 00005A18 E8A2FF call $M_FLUSH_BUF ;;AN000;; Flush the buffer + 37768 $MIF281: + 37769 00005A1B FECE dec dh ;;AN000;; Have we filled with enough pad chars? + 37770 00005A1D 75EC jnz short $MDO280 + 37771 $MIF279: + 37772 $MIF278: + 37773 ;cmp byte ptr $M_SL.$M_S_MAXW,$M_UNLIM_W + 37774 00005A1F 807C0800 cmp byte [si+$M_SUBLIST_STRUC.$M_S_MAXW],0 ; $M_UNLIM_W + 37775 ;cmp byte [si+8],0 ;;AN000;; Is maximum width unlimited + 37776 00005A23 740C je short $MIF286 + 37777 + 37778 ;cmp byte ptr $M_SL.$M_S_MAXW,CL ;;AN000;; Will we exceed maximum width? + 37779 00005A25 384C08 cmp byte [si+$M_SUBLIST_STRUC.$M_S_MAXW],cl + 37780 ;;cmp byte [si+8],cl + 37781 00005A28 7307 jnb short $MIF287 + 37782 + 37783 ; 03/05/2023 + 37784 ;;sub cl,byte ptr $M_SL.$M_S_MAXW ;;AN000;; Calculate how many extra chars + 37785 ;sub cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] + 37786 ;;sub cl,[si+8] + 37787 00005A2A 88CA mov dl,cl ;;AN000;; Remember how many chars to pop off + 37788 ;;mov cl,byte ptr $M_SL.$M_S_MAXW ;;AN000;; Set new string length + 37789 ;mov cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] + 37790 ;;mov cl,[si+8] + 37791 ; 03/05/2023 + 37792 00005A2C 8A4C08 mov cl,[si+$M_SUBLIST_STRUC.$M_S_MAXW] + 37793 00005A2F 28CA sub dl,cl + 37794 $MIF287: + 37795 $MIF286: + 37796 00005A31 09C9 or cx,cx ;;AN000;; + 37797 00005A33 7424 jz short $MIF290 ;;AN000;; + 37798 $MDO291: + 37799 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type not $M_TYPE_MASK + 37800 00005A35 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh + 37801 ;test byte [si+7],0Fh ;;AN000;; + 37802 00005A39 750C jnz short $MIF292 + 37803 + 37804 ;test $M_SL.$M_S_FLAG,Char_field_ASCIIZ and $M_SIZE_MASK + 37805 00005A3B F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h + 37806 ;test byte [si+7],10h ;;AN000;; Is this replace a ASCIIZ string? + 37807 00005A3F 7406 jz short $MIF292 ;;AN000;; No + 37808 + 37809 00005A41 268A05 mov al,[es:di] ;;AN000;; Get first character from string + 37810 00005A44 47 inc di ;;AN000;; Next character in string + 37811 00005A45 EB01 jmp short $MEN292 + 37812 $MIF292: + 37813 00005A47 58 pop ax ;;AN000;; Get character in register + 37814 $MEN292: + 37815 ;mov byte ptr $M_RT.$M_TEMP_BUF[bx],al + 37816 00005A48 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al + 37817 ;mov [bx+$M_RT+76],al ;;AN000;; Move char into the buffer + 37818 ; 03/05/2023 + 37819 00005A4C 43 inc bx ;;AN000;; Increase buffer count + 37820 00005A4D 83FB40 cmp bx,$M_TEMP_BUF_SZ ; cmp bx,64 ;;AN000;; Is buffer full? + 37821 00005A50 7503 jne short $MIF295 ;;AN000;; + 37822 00005A52 E868FF call $M_FLUSH_BUF ;;AN000;; Flush the buffer + 37823 $MIF295: + 37824 00005A55 FEC9 dec cl ;;AN000;; Have we completed replace? + 37825 00005A57 75DC jnz short $MDO291 + 37826 $MIF290: + 37827 ;test byte ptr $M_SL.$M_S_FLAG,Right_Align + 37828 00005A59 F6440780 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],80h + 37829 ;test byte [si+7],80h ;;AN000;; Was replaceable parm to be left aligned? + 37830 00005A5D 7518 jnz short $MIF299 ;;AN000;; Yes + 37831 00005A5F 08F6 or dh,dh ;;AN000;; Do we need pad chars added? + 37832 00005A61 7414 jz short $MIF300 + 37833 $MDO301: + 37834 ;mov al,byte ptr $M_SL.$M_S_PAD ;;AN000;; + 37835 00005A63 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] + 37836 ;mov al,[si+0Ah] + 37837 + 37838 ;mov byte ptr $M_RT.$M_TEMP_BUF[bx],al + 37839 00005A66 8887[E098] mov [bx+$M_RT+$M_RES_ADDRS.$M_TEMP_BUF],al + 37840 ; 03/05/2023 + 37841 ;mov [bx+$M_RT+76],al ;;AN000;; Move in a pad char + 37842 + 37843 00005A6A 43 inc bx ;;AN000;; + 37844 00005A6B 83FB40 cmp bx,$M_TEMP_BUF_SZ ; 64 ;;AN000;; Is buffer full? + 37845 00005A6E 7503 jne short $MIF302 ;;AN000;; No + 37846 ;;AN000;; Yes + 37847 00005A70 E84AFF call $M_FLUSH_BUF ;;AN000;; Flush the buffer + 37848 $MIF302: + 37849 00005A73 FECE dec dh ;;AN000;; Have we filled with enough pad chars? + 37850 00005A75 75EC jnz short $MDO301 ;;AN000;; + 37851 $MIF300: + 37852 $MIF299: + 37853 ;test byte ptr $M_SL.$M_S_FLAG,not Char_Type and $M_TYPE_MASK + 37854 00005A77 F644070F test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Fh + 37855 ;test byte [si+7],0Fh ;;AN000;; + 37856 00005A7B 7506 jnz short $MIF307 + 37857 + 37858 ;test $M_SL.$M_S_FLAG,Char_field_ASCIIZ and $M_SIZE_MASK + 37859 00005A7D F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h + 37860 ;test byte [si+7],10h ;;AN000;; Is this replace a ASCIIZ string? + 37861 ; 11/04/2023 + 37862 ;jz short $MIF307 ;;AN000;; + 37863 ;jmp short $MEN307 ;;AN000;; + 37864 00005A81 750C jnz short $MEN307 + 37865 $MIF307: + 37866 00005A83 08D2 or dl,dl ;;AN000;; + 37867 00005A85 7408 jz short $MIF309 ;;AN000;; + 37868 $MDO310: + 37869 00005A87 8F06[DA98] pop word [$M_RT+$M_RES_ADDRS.$M_RETURN_ADDR] + 37870 ;pop word [$M_RT+70] ;;AN000;; Clean Up stack using spare variable + 37871 00005A8B FECA dec dl ;;AN000;; Are we done? + 37872 00005A8D 75F8 jnz short $MDO310 + 37873 $MIF309: + 37874 $MEN307: + 37875 00005A8F E82BFF call $M_FLUSH_BUF ;;AN000;; Flush the buffer for the final time + 37876 00005A92 55 push bp ;;AN000;; Restore the return address + 37877 00005A93 C3 retn ;;AN000;; + 37878 + 37879 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37880 ;; + 37881 ;; PROC NAME: $M_CHAR_REPLACE + 37882 ;; + 37883 ;; FUNCTION: Will prepare a single char or ASCIIZ string for replace + 37884 ;; INPUTS: DS:SI points at corresponding SUBLIST + 37885 ;; ES:DI contains the VALUE from SUBLIST + 37886 ;; OUTPUTS: CX contains number of characters on stack + 37887 ;; Top of stack --> Last character + 37888 ;; . . . + 37889 ;; Bot of stack --> First character + 37890 ;; + 37891 ;; OTHER REGS Revised: AX + 37892 ;; + 37893 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37894 + 37895 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37896 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37897 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37898 $M_CHAR_REPLACE: + 37899 00005A94 5D pop bp ;;AN000;; Save return address + 37900 ;test $M_SL.$M_S_FLAG,not Char_Field_Char and $M_SIZE_MASK + 37901 00005A95 F6440730 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],30h + 37902 ;test byte [si+7],30h ;;AN000;; Was Character specified? + 37903 00005A99 7512 jnz short $MIF317 ;;AN000;; No + 37904 00005A9B 268A05 mov al,[es:di] ;;AN000;; Get the character + 37905 00005A9E 50 push ax ;;AN000;; Put it on the stack + 37906 00005A9F 41 inc cx ;;AN000;; Increase the count + 37907 00005AA0 E88DFD call $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character + 37908 00005AA3 7306 jnc short $MIF318 + 37909 00005AA5 268A4501 mov al,[es:di+1] ;;AN000;; Get the next character + 37910 00005AA9 50 push ax ;;AN000;; Put it on the stack + 37911 00005AAA F8 clc ;;AN000;; Clear the carry + 37912 $MIF318: + 37913 00005AAB EB0D jmp short $MEN317 + 37914 $MIF317: + 37915 $MDO321: + 37916 00005AAD 268A05 mov al,[es:di] ;;AN000;; Get the character + 37917 00005AB0 08C0 or al,al ;;AN000;; Is it the NULL? + 37918 00005AB2 7404 jz short $MEN321 ;;AN000;; Yes + 37919 00005AB4 47 inc di ;;AN000;; Next character + 37920 00005AB5 41 inc cx ;;AN000;; Increment the count + 37921 00005AB6 EBF5 jmp short $MDO321 + 37922 $MEN321: + 37923 00005AB8 29CF sub di,cx ;;AN000;; Set DI at the beginning of the string + 37924 $MEN317: + 37925 00005ABA 55 push bp ;;AN000;; Restore return address + 37926 00005ABB C3 retn ;;AN000;; + 37927 + 37928 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37929 ;; + 37930 ;; PROC NAME: $M_BIN2ASC_REPLACE + 37931 ;; + 37932 ;; FUNCTION: Convert a signed or unsigned binary number to an ASCII string + 37933 ;; and prepare to display + 37934 ;; INPUTS: DS:SI points at corresponding SUBLIST + 37935 ;; ES:DI contains the VALUE from SUBLIST + 37936 ;; OUTPUTS: CX contains number of characters on stack + 37937 ;; Top of stack --> Last character + 37938 ;; . . . + 37939 ;; Bot of stack --> First character + 37940 ;; OTHER REGS Revised: BX,DX,AX + 37941 ;; + 37942 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 37943 + 37944 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 37945 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 37946 ; 12/08/2024 - Retro DOS v5.0 COMMAND.COM + 37947 $M_BIN2ASC_REPLACE: + 37948 00005ABC 5D pop bp ;;AN000;; Save return address + 37949 00005ABD 31D2 xor dx,dx ;;AN000;; Prepare for get binary value (HIGH) + 37950 00005ABF 31C0 xor ax,ax ;;AN000;; Prepare for get binary value (LOW) + 37951 00005AC1 C706[DE98]1000 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],16 ; $M_BASE16 + 37952 ;mov word [$M_RT+74],16 ; $M_BASE16 ;;AN000;; Set default divisor + 37953 + 37954 00005AC7 31DB xor bx,bx ;;AN000;; Use BX as the NEG flag (if applicable) + 37955 + 37956 ;test $M_SL.$M_S_FLAG,not $M_BYTE and $M_SIZE_MASK + 37957 00005AC9 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h + 37958 ;test byte [si+7],20h ;;AN000;; Was BYTE specified? + 37959 00005ACD 7511 jnz short $MIF325 ;;AN000;; No + 37960 + 37961 00005ACF 268A05 mov al,[es:di] ;;AN000;; Setup byte in AL + 37962 + 37963 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK + 37964 00005AD2 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh + 37965 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? + 37966 00005AD6 753D jnz short $MIF326 ;;AN000;; No + 37967 + 37968 00005AD8 A880 test al,10000000b ; 80h ;;AN000;; Is this number negative? + 37969 00005ADA 7433 jz short $MIF327 ;;AN000;; No + 37970 ;;AN000;; Yes + 37971 ; 12/04/2023 + 37972 ;inc bx ;;AN000;; Remember that it was negative + 37973 00005ADC 247F and al,01111111b ;;AN000;; Make it positive + 37974 + 37975 ; 12/04/2023 - Retrop DOS v4.0 COMMAND.COM + 37976 ;jmp short $MIF327 + 37977 00005ADE EB2E jmp short $MIF350 ; inc bx + 37978 + 37979 ; 12/04/2023 + 37980 %if 0 + 37981 $MIF327: + 37982 $MIF335: ; 12/04/2023 + 37983 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 37984 ;mov word [$M_RT+74],10 ;;AN000;; + 37985 $MIF326: + 37986 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK + 37987 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh + 37988 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? + 37989 jnz short $MIF330 ;;AN000;; No + 37990 ;;AN000;; Yes + 37991 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 37992 ;mov word [$M_RT+74],10 ;;AN000;; + 37993 $MIF330: + 37994 jmp short $MEN325 + 37995 + 37996 %endif + 37997 + 37998 $MIF325: + 37999 ;test $M_SL.$M_S_FLAG,not $M_WORD and $M_SIZE_MASK + 38000 00005AE0 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h + 38001 ;test byte [si+7],10h ;;AN000;; Was WORD specified? + 38002 00005AE4 7513 jnz short $MIF333 ;;AN000;; No + 38003 ;;AN000;; Yes + 38004 00005AE6 268B05 mov ax,[es:di] ;;AN000;; Setup byte in AL + 38005 + 38006 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK + 38007 00005AE9 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh + 38008 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? + 38009 00005AED 7526 jnz short $MIF334 ;;AN000;; No 38010 ;;AN000;; Yes - 38011 ; 12/04/2023 - 38012 ;inc bx ;;AN000;; Remember that it was negative - 38013 00005AF4 80E47F and ah,01111111b ;;AN000;; Make it positive - 38014 - 38015 ; 12/04/2023 - Retro DOS v4.0 COMMAND.COM - 38016 ;jmp short $MIF335 - 38017 00005AF7 EB15 jmp short $MIF350 ; inc bx - 38018 - 38019 ; 12/04/2023 - 38020 %if 0 - 38021 $MIF335: - 38022 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38023 ;mov word [$M_RT+74],10 ;;AN000;; - 38024 $MIF334: - 38025 test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK ;;AN000;; Was Signed binary specified? - 38026 jnz short $MIF338 - 38027 - 38028 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK - 38029 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh - 38030 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? - 38031 jnz short $MIF338 ;;AN000;; No - 38032 ;;AN000;; Yes - 38033 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38034 ;mov word [$M_RT+74],10 ;;AN000;; - 38035 $MIF338: - 38036 jmp short $MEN333 ;;AN000;; - 38037 %endif - 38038 - 38039 $MIF333: - 38040 00005AF9 268B05 mov ax,[es:di] ;;AN000;; Setup Double word in DX:AX - 38041 00005AFC 268B5502 mov dx,[es:di+2] ;;AN000;; - 38042 - 38043 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK - 38044 00005B00 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh - 38045 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? - 38046 00005B04 750F jnz short $MIF341 ;;AN000;; No - 38047 ;;AN000;; Yes - 38048 00005B06 F6C680 test dh,10000000b ; 80h ;;AN000;; Is this number negative? - 38049 00005B09 7404 jz short $MIF342 ;;AN000;; No + 38011 00005AEF F6C480 test ah,10000000b ; 80h ;;AN000;; Is this number negative? + 38012 00005AF2 741B jz short $MIF335 ;;AN000;; No + 38013 ;;AN000;; Yes + 38014 ; 12/04/2023 + 38015 ;inc bx ;;AN000;; Remember that it was negative + 38016 00005AF4 80E47F and ah,01111111b ;;AN000;; Make it positive + 38017 + 38018 ; 12/04/2023 - Retro DOS v4.0 COMMAND.COM + 38019 ;jmp short $MIF335 + 38020 00005AF7 EB15 jmp short $MIF350 ; inc bx + 38021 + 38022 ; 12/04/2023 + 38023 %if 0 + 38024 $MIF335: + 38025 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38026 ;mov word [$M_RT+74],10 ;;AN000;; + 38027 $MIF334: + 38028 test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK ;;AN000;; Was Signed binary specified? + 38029 jnz short $MIF338 + 38030 + 38031 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK + 38032 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh + 38033 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? + 38034 jnz short $MIF338 ;;AN000;; No + 38035 ;;AN000;; Yes + 38036 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38037 ;mov word [$M_RT+74],10 ;;AN000;; + 38038 $MIF338: + 38039 jmp short $MEN333 ;;AN000;; + 38040 %endif + 38041 + 38042 $MIF333: + 38043 00005AF9 268B05 mov ax,[es:di] ;;AN000;; Setup Double word in DX:AX + 38044 00005AFC 268B5502 mov dx,[es:di+2] ;;AN000;; + 38045 + 38046 ;test $M_SL.$M_S_FLAG,not Sgn_Bin_Type and $M_TYPE_MASK + 38047 00005B00 F644070D test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Dh + 38048 ;test byte [si+7],0Dh ;;AN000;; Was Signed binary specified? + 38049 00005B04 750F jnz short $MIF341 ;;AN000;; No 38050 ;;AN000;; Yes - 38051 ; 12/04/2023 - 38052 ;inc bx ;;AN000;; Remember that it was negative - 38053 00005B0B 80E67F and dh,01111111b ;;AN000;; Make it positive - 38054 - 38055 ; 12/04/2023 - Retro DOS v4.0 COMMAND.COM - 38056 $MIF350: - 38057 00005B0E 43 inc bx - 38058 $MIF342: - 38059 ; 12/04/2023 - 38060 $MIF327: - 38061 $MIF335: - 38062 00005B0F C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38063 ;mov word [$M_RT+74],10 ;;AN000;; - 38064 $MIF341: - 38065 $MIF326: - 38066 ; 18/04/2023 - 38067 $MIF334: - 38068 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK - 38069 00005B15 F644070E test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh - 38070 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? - 38071 00005B19 7506 jnz short $MIF345 ;;AN000;; No - 38072 ;;AN000;; Yes - 38073 00005B1B C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38074 ;mov word [$M_RT+74],10 ;;AN000;; - 38075 - 38076 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38077 ; **************************************** - 38078 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5F64h - 38079 $MIF345: - 38080 ; *** (Disassembled MSDOS 6.22 COMMAND.COM source code.) - 38081 $MEN333: - 38082 00005B21 F6440740 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],40h - 38083 ;test byte [si+7],40h ; MSDOS 6.22 - 38084 ; (Custom/International flag for thousand separator) - 38085 00005B25 7428 jz short $MEN325 - 38086 00005B27 50 push ax ; MSDOS 6.22 - 38087 00005B28 52 push dx - 38088 00005B29 B438 mov ah,38h ; International - 38089 00005B2B 30C0 xor al,al - 38090 00005B2D 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38091 00005B31 CD21 int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION - 38092 ; get current-country info - 38093 ; DS:DX -> buffer for returned info - 38094 00005B33 7305 jnb short $MEN341 ; (use country depended thousand separator) - 38095 00005B35 C606[E798]2C mov byte [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA],',' - 38096 $MEN341: - 38097 00005B3A 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] - 38098 ;mov al,[si+0Ah] ; (save pad character) - 38099 00005B3D 89C7 mov di,ax - 38100 00005B3F 5A pop dx - 38101 00005B40 58 pop ax - 38102 00005B41 C6440A2C mov byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' ; $M_COMMA - 38103 ;mov byte [si+0Ah],',' ; (comma is needed for converting procedure) - 38104 00005B45 E80CFD call $M_CONVERT2ASC - 38105 00005B48 89F8 mov ax,di - 38106 00005B4A 88440A mov [si+$M_SUBLIST_STRUC.$M_S_PAD],al - 38107 ;mov [si+0Ah],al ; (restore pad character) - 38108 00005B4D EB03 jmp short $MEN345 ; MSDOS 6.22 - 38109 ; *** (end of disassembled MSDOS 6.22 COMMAND.COM source code porehion) - 38110 ; **************************************** - 38111 ;$MIF345: - 38112 ;$MEN333: - 38113 $MEN325: - 38114 00005B4F E802FD call $M_CONVERT2ASC ;;AN000;; Convert to ASCII string - 38115 $MEN345: ; 15/06/2023 - MSDOS 6.22 - 38116 00005B52 09DB or bx,bx ;;AN000;; Was number negative? - 38117 00005B54 7405 jz short $MIF349 ;;AN000;; No - 38118 ;;AN000;; Yes - 38119 00005B56 31D2 xor dx,dx ;;AN000;; - 38120 00005B58 B22D mov dl,'-' ; $M_NEG_SIGN ;;AN000;; Put "-" on the stack with the number - 38121 00005B5A 52 push dx ;;AN000;; - 38122 $MIF349: - 38123 00005B5B 55 push bp ;;AN000;; Restore return address - 38124 00005B5C C3 retn ;;AN000;; Return - 38125 - 38126 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38127 ;; - 38128 ;; PROC NAME: $M_DATE_REPLACE - 38129 ;; - 38130 ;; FUNCTION: Convert a date to a decimal ASCII string using current - 38131 ;; country format and prepare to display - 38132 ;; INPUTS: DS:SI points at corresponding SUBLIST - 38133 ;; ES:DI points at VALUE from SUBLIST - 38134 ;; OUTPUTS: CX contains number of characters on stack - 38135 ;; Top of stack --> Last character - 38136 ;; . . . - 38137 ;; Bot of stack --> First character - 38138 ;; OTHER REGS Revised: DX,AX - 38139 ;; - 38140 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38141 - 38142 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38143 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38144 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38145 $M_DATE_REPLACE: - 38146 00005B5D 5D pop bp ;;AN000;; Save return address - 38147 - 38148 00005B5E C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38149 ;mov word [$M_RT+74],10 ;;AN000;; Set default divisor - 38150 - 38151 00005B64 E86700 call $M_GET_DATE ;;AN000;; Set date format/separator in $M_RT - 38152 ;;AN000;; All O.K.? - 38153 00005B67 31D2 xor dx,dx ;;AN000;; Reset DX value - 38154 ; 12/04/2023 - 38155 ;xor ax,ax ;;AN000;; Reset AX value - 38156 - 38157 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],0 - 38158 ;;cmp word [$M_RT+76],0 ;;AN000;; USA Date Format - 38159 ;jne short $MIF351 - 38160 ; 12/04/2023 - 38161 00005B69 A1[E098] mov ax,[$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] ; * - 38162 00005B6C 09C0 or ax,ax - 38163 00005B6E 751D jnz short $MIF351 - 38164 - 38165 00005B70 E87200 call $M_YEAR ;;AN000;; Get Year - 38166 00005B73 E88100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38051 00005B06 F6C680 test dh,10000000b ; 80h ;;AN000;; Is this number negative? + 38052 00005B09 7404 jz short $MIF342 ;;AN000;; No + 38053 ;;AN000;; Yes + 38054 ; 12/04/2023 + 38055 ;inc bx ;;AN000;; Remember that it was negative + 38056 00005B0B 80E67F and dh,01111111b ;;AN000;; Make it positive + 38057 + 38058 ; 12/04/2023 - Retro DOS v4.0 COMMAND.COM + 38059 $MIF350: + 38060 00005B0E 43 inc bx + 38061 $MIF342: + 38062 ; 12/04/2023 + 38063 $MIF327: + 38064 $MIF335: + 38065 00005B0F C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38066 ;mov word [$M_RT+74],10 ;;AN000;; + 38067 $MIF341: + 38068 $MIF326: + 38069 ; 18/04/2023 + 38070 $MIF334: + 38071 ;test $M_SL.$M_S_FLAG,not Unsgn_Bin_Type and $M_TYPE_MASK + 38072 00005B15 F644070E test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],0Eh + 38073 ;test byte [si+7],0Eh ;;AN000;; Was Signed binary specified? + 38074 00005B19 7506 jnz short $MIF345 ;;AN000;; No + 38075 ;;AN000;; Yes + 38076 00005B1B C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38077 ;mov word [$M_RT+74],10 ;;AN000;; + 38078 + 38079 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38080 ; **************************************** + 38081 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:5F64h + 38082 $MIF345: + 38083 ; *** (Disassembled MSDOS 6.22 COMMAND.COM source code.) + 38084 $MEN333: + 38085 00005B21 F6440740 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],40h + 38086 ;test byte [si+7],40h ; MSDOS 6.22 + 38087 ; (Custom/International flag for thousand separator) + 38088 00005B25 7428 jz short $MEN325 + 38089 00005B27 50 push ax ; MSDOS 6.22 + 38090 00005B28 52 push dx + 38091 00005B29 B438 mov ah,38h ; International + 38092 00005B2B 30C0 xor al,al + 38093 00005B2D 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38094 00005B31 CD21 int 21h ; DOS - 2+ - GET COUNTRY-DEPENDENT INFORMATION + 38095 ; get current-country info + 38096 ; DS:DX -> buffer for returned info + 38097 00005B33 7305 jnb short $MEN341 ; (use country depended thousand separator) + 38098 00005B35 C606[E798]2C mov byte [$M_RT+$M_COUNTRY_INFO.$M_THOU_SEPARA],',' + 38099 $MEN341: + 38100 00005B3A 8A440A mov al,[si+$M_SUBLIST_STRUC.$M_S_PAD] + 38101 ;mov al,[si+0Ah] ; (save pad character) + 38102 00005B3D 89C7 mov di,ax + 38103 00005B3F 5A pop dx + 38104 00005B40 58 pop ax + 38105 00005B41 C6440A2C mov byte [si+$M_SUBLIST_STRUC.$M_S_PAD],',' ; $M_COMMA + 38106 ;mov byte [si+0Ah],',' ; (comma is needed for converting procedure) + 38107 00005B45 E80CFD call $M_CONVERT2ASC + 38108 00005B48 89F8 mov ax,di + 38109 00005B4A 88440A mov [si+$M_SUBLIST_STRUC.$M_S_PAD],al + 38110 ;mov [si+0Ah],al ; (restore pad character) + 38111 00005B4D EB03 jmp short $MEN345 ; MSDOS 6.22 + 38112 ; *** (end of disassembled MSDOS 6.22 COMMAND.COM source code porehion) + 38113 ; **************************************** + 38114 ;$MIF345: + 38115 ;$MEN333: + 38116 $MEN325: + 38117 00005B4F E802FD call $M_CONVERT2ASC ;;AN000;; Convert to ASCII string + 38118 $MEN345: ; 15/06/2023 - MSDOS 6.22 + 38119 00005B52 09DB or bx,bx ;;AN000;; Was number negative? + 38120 00005B54 7405 jz short $MIF349 ;;AN000;; No + 38121 ;;AN000;; Yes + 38122 00005B56 31D2 xor dx,dx ;;AN000;; + 38123 00005B58 B22D mov dl,'-' ; $M_NEG_SIGN ;;AN000;; Put "-" on the stack with the number + 38124 00005B5A 52 push dx ;;AN000;; + 38125 $MIF349: + 38126 00005B5B 55 push bp ;;AN000;; Restore return address + 38127 00005B5C C3 retn ;;AN000;; Return + 38128 + 38129 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38130 ;; + 38131 ;; PROC NAME: $M_DATE_REPLACE + 38132 ;; + 38133 ;; FUNCTION: Convert a date to a decimal ASCII string using current + 38134 ;; country format and prepare to display + 38135 ;; INPUTS: DS:SI points at corresponding SUBLIST + 38136 ;; ES:DI points at VALUE from SUBLIST + 38137 ;; OUTPUTS: CX contains number of characters on stack + 38138 ;; Top of stack --> Last character + 38139 ;; . . . + 38140 ;; Bot of stack --> First character + 38141 ;; OTHER REGS Revised: DX,AX + 38142 ;; + 38143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38144 + 38145 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38146 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38147 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38148 $M_DATE_REPLACE: + 38149 00005B5D 5D pop bp ;;AN000;; Save return address + 38150 + 38151 00005B5E C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38152 ;mov word [$M_RT+74],10 ;;AN000;; Set default divisor + 38153 + 38154 00005B64 E86700 call $M_GET_DATE ;;AN000;; Set date format/separator in $M_RT + 38155 ;;AN000;; All O.K.? + 38156 00005B67 31D2 xor dx,dx ;;AN000;; Reset DX value + 38157 ; 12/04/2023 + 38158 ;xor ax,ax ;;AN000;; Reset AX value + 38159 + 38160 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],0 + 38161 ;;cmp word [$M_RT+76],0 ;;AN000;; USA Date Format + 38162 ;jne short $MIF351 + 38163 ; 12/04/2023 + 38164 00005B69 A1[E098] mov ax,[$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] ; * + 38165 00005B6C 09C0 or ax,ax + 38166 00005B6E 751D jnz short $MIF351 38167 - 38168 00005B76 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38169 ;push word [$M_RT+87] ;;AN000;; - 38170 - 38171 00005B7A 41 inc cx ;;AN000;; Increment count - 38172 00005B7B 31C0 xor ax,ax ;;AN000;; Reset AX value - 38173 - 38174 00005B7D 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] - 38175 ;mov al,[si+5] ;;AN000;; Get Day - 38176 00005B80 E87400 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38177 - 38178 00005B83 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38179 ;push word [$M_RT+87] ;;AN000;; - 38180 - 38181 00005B87 41 inc cx ;;AN000;; Increment count - 38182 00005B88 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] - 38183 ;mov al,[si+4] ;;AN000;; Get Month - 38184 ; 12/04/2023 - 38185 ;call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38186 00005B8B EB3C jmp short $MIF354 ; ** - 38187 $MIF351: - 38188 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],1 - 38189 ;;cmp word [$M_RT+76],1 ;;AN000;; EUROPE Date Format - 38190 ;jne short $MIF353 - 38191 ; 12/04/2023 - 38192 ; ax = [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] ; * - 38193 00005B8D 48 dec ax - 38194 00005B8E 751D jnz short $MIF352 ; word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] <> 1 - 38195 - 38196 00005B90 E85200 call $M_YEAR ;;AN000;; Get Year - 38197 00005B93 E86100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38168 00005B70 E87200 call $M_YEAR ;;AN000;; Get Year + 38169 00005B73 E88100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38170 + 38171 00005B76 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38172 ;push word [$M_RT+87] ;;AN000;; + 38173 + 38174 00005B7A 41 inc cx ;;AN000;; Increment count + 38175 00005B7B 31C0 xor ax,ax ;;AN000;; Reset AX value + 38176 + 38177 00005B7D 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] + 38178 ;mov al,[si+5] ;;AN000;; Get Day + 38179 00005B80 E87400 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38180 + 38181 00005B83 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38182 ;push word [$M_RT+87] ;;AN000;; + 38183 + 38184 00005B87 41 inc cx ;;AN000;; Increment count + 38185 00005B88 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] + 38186 ;mov al,[si+4] ;;AN000;; Get Month + 38187 ; 12/04/2023 + 38188 ;call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38189 00005B8B EB3C jmp short $MIF354 ; ** + 38190 $MIF351: + 38191 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],1 + 38192 ;;cmp word [$M_RT+76],1 ;;AN000;; EUROPE Date Format + 38193 ;jne short $MIF353 + 38194 ; 12/04/2023 + 38195 ; ax = [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] ; * + 38196 00005B8D 48 dec ax + 38197 00005B8E 751D jnz short $MIF352 ; word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] <> 1 38198 - 38199 00005B96 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38200 ;push word [$M_RT+87] ;;AN000;; - 38201 - 38202 00005B9A 41 inc cx ;;AN000;; Increment count - 38203 00005B9B 31C0 xor ax,ax ;;AN000;; Reset AX - 38204 - 38205 00005B9D 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] - 38206 ;mov al,[si+4] ;;AN000;; Get Month - 38207 00005BA0 E85400 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38208 - 38209 00005BA3 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38210 ;push word [$M_RT+87] ;;AN000;; + 38199 00005B90 E85200 call $M_YEAR ;;AN000;; Get Year + 38200 00005B93 E86100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38201 + 38202 00005B96 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38203 ;push word [$M_RT+87] ;;AN000;; + 38204 + 38205 00005B9A 41 inc cx ;;AN000;; Increment count + 38206 00005B9B 31C0 xor ax,ax ;;AN000;; Reset AX + 38207 + 38208 00005B9D 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] + 38209 ;mov al,[si+4] ;;AN000;; Get Month + 38210 00005BA0 E85400 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string 38211 - 38212 00005BA7 41 inc cx ;;AN000;; - 38213 - 38214 00005BA8 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] - 38215 ;mov al,[si+5] ;;AN000;; Get Day - 38216 - 38217 ; 12/04/2023 - 38218 ;call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38219 00005BAB EB1C jmp short $MIF354 ; ** + 38212 00005BA3 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38213 ;push word [$M_RT+87] ;;AN000;; + 38214 + 38215 00005BA7 41 inc cx ;;AN000;; + 38216 + 38217 00005BA8 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] + 38218 ;mov al,[si+5] ;;AN000;; Get Day + 38219 38220 ; 12/04/2023 - 38221 $MIF352: - 38222 ; ax = [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT]-1 ; * - 38223 00005BAD 48 dec ax - 38224 ;jz short $MIF353 ; word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] = 2 - 38225 ;xor ax,ax - 38226 ;jmp short $MIF355 - 38227 ; 12/04/2023 - 38228 00005BAE 751C jnz short $MIF355 - 38229 $MIF353: - 38230 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],2 - 38231 ;;cmp word [$M_RT+76],2 ;;AN000;; JAPAN Date Format - 38232 ;jne short $MIF355 - 38233 - 38234 00005BB0 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] - 38235 ;mov al,[si+5] ;;AN000;; Get Day - 38236 00005BB3 E84100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38237 - 38238 00005BB6 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38239 ;push word [$M_RT+87] ;;AN000;; - 38240 - 38241 00005BBA 41 inc cx ;;AN000;; - 38242 - 38243 00005BBB 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] - 38244 ;mov al,[si+4] ;;AN000;; Get Month - 38245 00005BBE E83600 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string - 38246 - 38247 00005BC1 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] - 38248 ;push word [$M_RT+87] ;;AN000;; + 38221 ;call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38222 00005BAB EB1C jmp short $MIF354 ; ** + 38223 ; 12/04/2023 + 38224 $MIF352: + 38225 ; ax = [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT]-1 ; * + 38226 00005BAD 48 dec ax + 38227 ;jz short $MIF353 ; word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT] = 2 + 38228 ;xor ax,ax + 38229 ;jmp short $MIF355 + 38230 ; 12/04/2023 + 38231 00005BAE 751C jnz short $MIF355 + 38232 $MIF353: + 38233 ;cmp word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],2 + 38234 ;;cmp word [$M_RT+76],2 ;;AN000;; JAPAN Date Format + 38235 ;jne short $MIF355 + 38236 + 38237 00005BB0 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] + 38238 ;mov al,[si+5] ;;AN000;; Get Day + 38239 00005BB3 E84100 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string + 38240 + 38241 00005BB6 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38242 ;push word [$M_RT+87] ;;AN000;; + 38243 + 38244 00005BBA 41 inc cx ;;AN000;; + 38245 + 38246 00005BBB 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] + 38247 ;mov al,[si+4] ;;AN000;; Get Month + 38248 00005BBE E83600 call $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string 38249 - 38250 00005BC5 41 inc cx ;;AN000;; - 38251 - 38252 00005BC6 E81C00 call $M_YEAR ;;AN000;; Get Year - 38253 ; 12/04/2023 - 38254 $MIF354: - 38255 00005BC9 E82B00 call $M_CONVERTDATE ; ** ;;AN000;; Convert it to an ASCII string - 38256 $MIF355: - 38257 00005BCC 55 push bp ;;AN000;; Restore return address - 38258 00005BCD C3 retn ;;AN000;; Return - 38259 - 38260 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38261 ;; - 38262 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38263 - 38264 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38265 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38266 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38267 $M_GET_DATE: - 38268 ;mov ah,38h ; DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info - 38269 ;mov al,0 ;;AN000;; Get current country info - 38270 ; 12/04/2023 - 38271 00005BCE B80038 mov ax,3800h - 38272 ; - 38273 00005BD1 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38274 ;lea dx,[$M_RT+76] ;;AN000;; Set up addressibility to buffer - 38275 00005BD5 CD21 int 21h ;;AN000;; - 38276 00005BD7 730B jnc short $MIF357 - 38277 ; - 38278 00005BD9 C706[E098]0000 mov word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],0 ; $M_DEF_DATE_FORM - 38279 ;mov word [$M_RT+76+0],0 ;;AN000;; Set default date format (BH) - 38280 00005BDF C606[EB98]2D mov byte [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA],'-' ; $M_DEF_DATE_SEP - 38281 ;mov byte [$M_RT+87],'-' ;;AN000;; Set default date separator (BL) - 38282 $MIF357: - 38283 00005BE4 C3 retn ;;AN000;; - 38284 - 38285 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38286 ;; - 38287 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38288 - 38289 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38290 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38291 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38292 $M_YEAR: - 38293 00005BE5 8B4402 mov ax,[si+$M_SUBLIST_STRUC.$M_S_VALUE] - 38294 ;mov ax,[si+2] ;;AN000;; Get Year - 38295 - 38296 ;test $M_SL.$M_S_FLAG,Date_MDY_4 and $M_DATE_MASK - 38297 00005BE8 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h - 38298 ;test byte [si+7],10h ;;AN000;; Was Month/Day/Year (2 Digits) specified? - 38299 00005BEC 7508 jnz short $MIF359 ;;AN000;; No - 38300 ;;AN000;; Yes - 38301 00005BEE 83F863 cmp ax,99 ; $M_MAX_2_YEAR ;;AN000;; - 38302 00005BF1 7603 jna short $MIF360 ;;AN000;; - 38303 00005BF3 B86300 mov ax,99 ; $M_MAX_2_YEAR ;;AN000;; - 38304 $MIF360: - 38305 $MIF359: - 38306 00005BF6 C3 retn ;;AN000;; - 38307 - 38308 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38309 ;; - 38310 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38311 - 38312 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38313 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38314 $M_CONVERTDATE: - 38315 $M_CONVERTTIME: ; *!*! ; 12/04/2023 - 38316 00005BF7 8F06[E098] pop word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38317 ;pop word [$M_RT+76] ;;AN000;; Save return address - 38318 00005BFB 880E[D698] mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl - 38319 ;mov [$M_RT+66],cl ;;AN000;; Save the size before conversion - 38320 00005BFF E852FC call $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string - 38321 00005C02 49 dec cx ;;AN000;; Test if size only grew by 1 - 38322 00005C03 3A0E[D698] cmp cl,[$M_RT+$M_RES_ADDRS.$M_SIZE] ;;AN000;; Did size only grow by one? - 38323 00005C07 7505 jne short $MIF363 ;;AN000;; No - 38324 00005C09 B83000 mov ax,'0' ; $M_TIMEDATE_PAD ; 30h ;;AN000;; Get a pad character (0) - 38325 00005C0C 50 push ax ;;AN000;; Save it - 38326 00005C0D 41 inc cx ;;AN000;; Count it - 38327 $MIF363: - 38328 00005C0E 41 inc cx ;;AN000;; Restore CX - 38329 00005C0F FF36[E098] push word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38330 ;push word [$M_RT+76] ;;AN000;; Restore return address - 38331 00005C13 C3 retn - 38332 - 38333 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38334 ;; - 38335 ;; PROC NAME: $M_TIME_REPLACE - 38336 ;; - 38337 ;; FUNCTION: Convert a time to a decimal ASCII string - 38338 ;; and prepare to display - 38339 ;; INPUTS: DS:SI points at corresponding SUBLIST - 38340 ;; ES:DI points at VALUE from SUBLIST - 38341 ;; OUTPUTS: CX contains number of characters on stack - 38342 ;; Top of stack --> Last character - 38343 ;; . . . - 38344 ;; Bot of stack --> First character - 38345 ;; REGS USED: BP,CX,AX - 38346 ;; - 38347 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38348 - 38349 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38350 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38351 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM ;; - 38352 $M_TIME_REPLACE: - 38353 00005C14 5D pop bp ;;AN000;; Save return address - 38354 - 38355 00005C15 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 - 38356 ;mov word [$M_RT+74],10 ;;AN000;; Set default divisor + 38250 00005BC1 FF36[EB98] push word [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA] + 38251 ;push word [$M_RT+87] ;;AN000;; + 38252 + 38253 00005BC5 41 inc cx ;;AN000;; + 38254 + 38255 00005BC6 E81C00 call $M_YEAR ;;AN000;; Get Year + 38256 ; 12/04/2023 + 38257 $MIF354: + 38258 00005BC9 E82B00 call $M_CONVERTDATE ; ** ;;AN000;; Convert it to an ASCII string + 38259 $MIF355: + 38260 00005BCC 55 push bp ;;AN000;; Restore return address + 38261 00005BCD C3 retn ;;AN000;; Return + 38262 + 38263 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38264 ;; + 38265 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38266 + 38267 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38268 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38269 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38270 $M_GET_DATE: + 38271 ;mov ah,38h ; DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info + 38272 ;mov al,0 ;;AN000;; Get current country info + 38273 ; 12/04/2023 + 38274 00005BCE B80038 mov ax,3800h + 38275 ; + 38276 00005BD1 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38277 ;lea dx,[$M_RT+76] ;;AN000;; Set up addressibility to buffer + 38278 00005BD5 CD21 int 21h ;;AN000;; + 38279 00005BD7 730B jnc short $MIF357 + 38280 ; + 38281 00005BD9 C706[E098]0000 mov word [$M_RT+$M_COUNTRY_INFO.$M_DATE_FORMAT],0 ; $M_DEF_DATE_FORM + 38282 ;mov word [$M_RT+76+0],0 ;;AN000;; Set default date format (BH) + 38283 00005BDF C606[EB98]2D mov byte [$M_RT+$M_COUNTRY_INFO.$M_DATE_SEPARA],'-' ; $M_DEF_DATE_SEP + 38284 ;mov byte [$M_RT+87],'-' ;;AN000;; Set default date separator (BL) + 38285 $MIF357: + 38286 00005BE4 C3 retn ;;AN000;; + 38287 + 38288 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38289 ;; + 38290 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38291 + 38292 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38293 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38294 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38295 $M_YEAR: + 38296 00005BE5 8B4402 mov ax,[si+$M_SUBLIST_STRUC.$M_S_VALUE] + 38297 ;mov ax,[si+2] ;;AN000;; Get Year + 38298 + 38299 ;test $M_SL.$M_S_FLAG,Date_MDY_4 and $M_DATE_MASK + 38300 00005BE8 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h + 38301 ;test byte [si+7],10h ;;AN000;; Was Month/Day/Year (2 Digits) specified? + 38302 00005BEC 7508 jnz short $MIF359 ;;AN000;; No + 38303 ;;AN000;; Yes + 38304 00005BEE 83F863 cmp ax,99 ; $M_MAX_2_YEAR ;;AN000;; + 38305 00005BF1 7603 jna short $MIF360 ;;AN000;; + 38306 00005BF3 B86300 mov ax,99 ; $M_MAX_2_YEAR ;;AN000;; + 38307 $MIF360: + 38308 $MIF359: + 38309 00005BF6 C3 retn ;;AN000;; + 38310 + 38311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38312 ;; + 38313 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38314 + 38315 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38316 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38317 $M_CONVERTDATE: + 38318 $M_CONVERTTIME: ; *!*! ; 12/04/2023 + 38319 00005BF7 8F06[E098] pop word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38320 ;pop word [$M_RT+76] ;;AN000;; Save return address + 38321 00005BFB 880E[D698] mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl + 38322 ;mov [$M_RT+66],cl ;;AN000;; Save the size before conversion + 38323 00005BFF E852FC call $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string + 38324 00005C02 49 dec cx ;;AN000;; Test if size only grew by 1 + 38325 00005C03 3A0E[D698] cmp cl,[$M_RT+$M_RES_ADDRS.$M_SIZE] ;;AN000;; Did size only grow by one? + 38326 00005C07 7505 jne short $MIF363 ;;AN000;; No + 38327 00005C09 B83000 mov ax,'0' ; $M_TIMEDATE_PAD ; 30h ;;AN000;; Get a pad character (0) + 38328 00005C0C 50 push ax ;;AN000;; Save it + 38329 00005C0D 41 inc cx ;;AN000;; Count it + 38330 $MIF363: + 38331 00005C0E 41 inc cx ;;AN000;; Restore CX + 38332 00005C0F FF36[E098] push word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38333 ;push word [$M_RT+76] ;;AN000;; Restore return address + 38334 00005C13 C3 retn + 38335 + 38336 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38337 ;; + 38338 ;; PROC NAME: $M_TIME_REPLACE + 38339 ;; + 38340 ;; FUNCTION: Convert a time to a decimal ASCII string + 38341 ;; and prepare to display + 38342 ;; INPUTS: DS:SI points at corresponding SUBLIST + 38343 ;; ES:DI points at VALUE from SUBLIST + 38344 ;; OUTPUTS: CX contains number of characters on stack + 38345 ;; Top of stack --> Last character + 38346 ;; . . . + 38347 ;; Bot of stack --> First character + 38348 ;; REGS USED: BP,CX,AX + 38349 ;; + 38350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38351 + 38352 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38353 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38354 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM ;; + 38355 $M_TIME_REPLACE: + 38356 00005C14 5D pop bp ;;AN000;; Save return address 38357 - 38358 00005C1B E87700 call $M_GET_TIME ;;AN000;; All O.K.? - 38359 - 38360 ;test $M_SL.$M_S_FLAG,Time_Cty_Type and $M_TIME_MASK - 38361 00005C1E F6440701 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],1 - 38362 ;test byte [si+7],1 ;;AN000;; Is this a request for current country info? - 38363 00005C22 741A jz short $MIF365 ;;AN000;; No - 38364 ;;AN000;; Yes - 38365 00005C24 803E[F198]00 cmp byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],0 - 38366 ;cmp byte [$M_RT+93],0 ;;AN000;; Is the current country format 12 Hour? - 38367 00005C29 7513 jne short $MIF366 ;;AN000;; No - 38368 ;;AN000;; Yes - 38369 00005C2B 8A4402 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE] - 38370 ;mov al,[si+2] ;;AN000;; Get Hours - 38371 00005C2E 3C0C cmp al,12 ;;AN000;; Is hour 12 or less? - 38372 00005C30 7C04 jl short $MLL367 ; jnge ;;AN000;; Yes - 38373 00005C32 3C17 cmp al,23 ;;AN000;; Is hour 24 or greater? - 38374 00005C34 7E04 jng short $MIF367 ; jle ;;AN000;; No - 38375 $MLL367: - 38376 00005C36 B061 mov al,'a' ; $M_AM ;;AN000;; - 38377 ;push ax ;;AN000;; Push an "a" to represent AM. - 38378 ;inc cx ;;AN000;; - 38379 ;jmp short $MEN367 ;;AN000;; - 38380 ; 12/04/2023 - 38381 00005C38 EB02 jmp short $MEN367 ; * - 38382 $MIF367: - 38383 00005C3A B070 mov al,'p' ; $M_PM ;;AN000;; - 38384 $MEN367: ; * ; 12/04/2023 - 38385 00005C3C 50 push ax ;;AN000;; Push an "p" to represent PM. - 38386 00005C3D 41 inc cx ;;AN000;; - 38387 ;$MEN367: - 38388 $MIF366: - 38389 $MIF365: ;;AN000;; - 38390 00005C3E 31C0 xor ax,ax ;;AN000;; - 38391 ;xor dx,dx ;;AN000;; - 38392 ; 13/08/2024 - 38393 00005C40 99 cwd ; PCDOS 7.1 COMMAND.COM - 38394 - 38395 ;test $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty and $M_SIZE_MASK - 38396 00005C41 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h - 38397 ;test byte [si+7],20h ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified? - 38398 00005C45 740B jz short $MIF372 ;;AN000;; - 38399 - 38400 00005C47 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] - 38401 ;mov al,[si+5] ;;AN000;; Get Hundreds - 38402 00005C4A E8AAFF call $M_CONVERTTIME ;;AN000;; - 38403 - 38404 00005C4D FF36[E998] push word [$M_RT+$M_COUNTRY_INFO.$M_DECI_SEPARA] - 38405 ;push word [$M_RT+85] ;;AN000;; - 38406 00005C51 41 inc cx ;;AN000;; - 38407 $MIF372: - 38408 ;test $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty and $M_SIZE_MASK - 38409 00005C52 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h - 38410 ;test byte [si+7],20h ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified? - 38411 00005C56 7506 jnz short $MLL374 ;;AN000;; No - 38412 - 38413 ;test $M_SL.$M_S_FLAG,Time_HHMMSS_Cty AND $M_SIZE_MASK - 38414 00005C58 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h - 38415 ;test byte [si+7],10h ;;AN000;; Was Hour/Min/Sec (12 Hour) specified? - 38416 00005C5C 740B jz short $MIF374 ;;AN000;; No - 38417 $MLL374: - 38418 00005C5E 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] - 38419 ;mov al,[si+4] ;;AN000;; Get Seconds - 38420 00005C61 E893FF call $M_CONVERTTIME ;;AN000;; - 38421 - 38422 00005C64 FF36[ED98] push word [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA] - 38423 ;push word [$M_RT+89] ;;AN000;; - 38424 00005C68 41 inc cx ;;AN000;; - 38425 $MIF374: ;; Do Hour/Min (12 Hour) - 38426 00005C69 8A4403 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+1] - 38427 ;mov al,[si+3] ;;AN000;; Get Minutes - 38428 00005C6C E888FF call $M_CONVERTTIME ;;AN000;; - 38429 - 38430 00005C6F FF36[ED98] push word [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA] - 38431 ;push word [$M_RT+89] ;;AN000;; - 38432 00005C73 41 inc cx ;;AN000;; - 38433 - 38434 00005C74 8A4402 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE] - 38435 ;mov al,[si+2] ;;AN000;; Get Hours + 38358 00005C15 C706[DE98]0A00 mov word [$M_RT+$M_RES_ADDRS.$M_DIVISOR],10 ; $M_BASE10 + 38359 ;mov word [$M_RT+74],10 ;;AN000;; Set default divisor + 38360 + 38361 00005C1B E87700 call $M_GET_TIME ;;AN000;; All O.K.? + 38362 + 38363 ;test $M_SL.$M_S_FLAG,Time_Cty_Type and $M_TIME_MASK + 38364 00005C1E F6440701 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],1 + 38365 ;test byte [si+7],1 ;;AN000;; Is this a request for current country info? + 38366 00005C22 741A jz short $MIF365 ;;AN000;; No + 38367 ;;AN000;; Yes + 38368 00005C24 803E[F198]00 cmp byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],0 + 38369 ;cmp byte [$M_RT+93],0 ;;AN000;; Is the current country format 12 Hour? + 38370 00005C29 7513 jne short $MIF366 ;;AN000;; No + 38371 ;;AN000;; Yes + 38372 00005C2B 8A4402 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE] + 38373 ;mov al,[si+2] ;;AN000;; Get Hours + 38374 00005C2E 3C0C cmp al,12 ;;AN000;; Is hour 12 or less? + 38375 00005C30 7C04 jl short $MLL367 ; jnge ;;AN000;; Yes + 38376 00005C32 3C17 cmp al,23 ;;AN000;; Is hour 24 or greater? + 38377 00005C34 7E04 jng short $MIF367 ; jle ;;AN000;; No + 38378 $MLL367: + 38379 00005C36 B061 mov al,'a' ; $M_AM ;;AN000;; + 38380 ;push ax ;;AN000;; Push an "a" to represent AM. + 38381 ;inc cx ;;AN000;; + 38382 ;jmp short $MEN367 ;;AN000;; + 38383 ; 12/04/2023 + 38384 00005C38 EB02 jmp short $MEN367 ; * + 38385 $MIF367: + 38386 00005C3A B070 mov al,'p' ; $M_PM ;;AN000;; + 38387 $MEN367: ; * ; 12/04/2023 + 38388 00005C3C 50 push ax ;;AN000;; Push an "p" to represent PM. + 38389 00005C3D 41 inc cx ;;AN000;; + 38390 ;$MEN367: + 38391 $MIF366: + 38392 $MIF365: ;;AN000;; + 38393 00005C3E 31C0 xor ax,ax ;;AN000;; + 38394 ;xor dx,dx ;;AN000;; + 38395 ; 13/08/2024 + 38396 00005C40 99 cwd ; PCDOS 7.1 COMMAND.COM + 38397 + 38398 ;test $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty and $M_SIZE_MASK + 38399 00005C41 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h + 38400 ;test byte [si+7],20h ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified? + 38401 00005C45 740B jz short $MIF372 ;;AN000;; + 38402 + 38403 00005C47 8A4405 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+3] + 38404 ;mov al,[si+5] ;;AN000;; Get Hundreds + 38405 00005C4A E8AAFF call $M_CONVERTTIME ;;AN000;; + 38406 + 38407 00005C4D FF36[E998] push word [$M_RT+$M_COUNTRY_INFO.$M_DECI_SEPARA] + 38408 ;push word [$M_RT+85] ;;AN000;; + 38409 00005C51 41 inc cx ;;AN000;; + 38410 $MIF372: + 38411 ;test $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty and $M_SIZE_MASK + 38412 00005C52 F6440720 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],20h + 38413 ;test byte [si+7],20h ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified? + 38414 00005C56 7506 jnz short $MLL374 ;;AN000;; No + 38415 + 38416 ;test $M_SL.$M_S_FLAG,Time_HHMMSS_Cty AND $M_SIZE_MASK + 38417 00005C58 F6440710 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],10h + 38418 ;test byte [si+7],10h ;;AN000;; Was Hour/Min/Sec (12 Hour) specified? + 38419 00005C5C 740B jz short $MIF374 ;;AN000;; No + 38420 $MLL374: + 38421 00005C5E 8A4404 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+2] + 38422 ;mov al,[si+4] ;;AN000;; Get Seconds + 38423 00005C61 E893FF call $M_CONVERTTIME ;;AN000;; + 38424 + 38425 00005C64 FF36[ED98] push word [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA] + 38426 ;push word [$M_RT+89] ;;AN000;; + 38427 00005C68 41 inc cx ;;AN000;; + 38428 $MIF374: ;; Do Hour/Min (12 Hour) + 38429 00005C69 8A4403 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE+1] + 38430 ;mov al,[si+3] ;;AN000;; Get Minutes + 38431 00005C6C E888FF call $M_CONVERTTIME ;;AN000;; + 38432 + 38433 00005C6F FF36[ED98] push word [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA] + 38434 ;push word [$M_RT+89] ;;AN000;; + 38435 00005C73 41 inc cx ;;AN000;; 38436 - 38437 ;test $M_SL.$M_S_FLAG,Time_Cty_Type and $M_TIME_MASK - 38438 00005C77 F6440701 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],1 - 38439 ;test byte [si+7],1 ;;AN000;; Is this a request for current country info? - 38440 00005C7B 7413 jz short $MIF376 ;;AN000;; No - 38441 - 38442 00005C7D 803E[F198]00 cmp byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],0 - 38443 ;cmp byte [$M_RT+93],0 ;;AN000;; Is the current country format 12 Hour? - 38444 00005C82 750C jne short $MIF377 ;;AN000;; No - 38445 - 38446 00005C84 3C0D cmp al,13 ;;AN000;; Is hour less than 12? - 38447 00005C86 7C02 jnge short $MIF378 ; jl - 38448 00005C88 2C0C sub al,12 ;;AN000;; Set to a 12 hour value - 38449 $MIF378: - 38450 ;cmp al,0 ;;AN000;; Is hour less than 12? - 38451 ;jne short $MIF380 ;;AN000;; No - 38452 ; 12/04/2023 - 38453 00005C8A 20C0 and al,al - 38454 00005C8C 7502 jnz short $MIF380 - 38455 00005C8E B00C mov al,12 ;;AN000;; Set to a 12 hour value - 38456 $MIF380: - 38457 $MIF377: - 38458 $MIF376: - 38459 00005C90 E8C1FB call $M_CONVERT2ASC ;;AN000;; Convert it to ASCII - 38460 00005C93 55 push bp ;;AN000;; Restore return address - 38461 00005C94 C3 retn ;;AN000;; Return - 38462 - 38463 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38464 ;; - 38465 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38466 - 38467 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38468 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38469 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38470 $M_GET_TIME: - 38471 ;mov ah,38h ; DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info - 38472 ;mov al,0 ;;AN000;; Get current country info - 38473 ; 12/04/2023 - 38474 00005C95 B80038 mov ax,3800h - 38475 ; - 38476 00005C98 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38477 ;lea dx,[$M_RT+76] ;;AN000;; Set up addressibility to buffer - 38478 00005C9C CD21 int 21h ;;AN000;; - 38479 00005C9E 7310 jnc short $MIF384 - 38480 - 38481 00005CA0 C706[F198]0100 mov word [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],1 ; $M_DEF_TIME_FORM - 38482 ;mov word [$M_RT+93],1 ;;AN000;; Set default time format (BH) - 38483 00005CA6 C606[ED98]3A mov byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA],':' ; $M_DEF_TIME_SEP - 38484 ;mov byte [$M_RT+89],':' ;;AN000;; Set default time separator (BL) - 38485 00005CAB C606[E998]2E mov byte [$M_RT+$M_COUNTRY_INFO.$M_DECI_SEPARA],'.' ; $M_DEF_DECI_SEP - 38486 ;mov byte [$M_RT+85],'.' ;;AN000;; Set default time separator (BL) - 38487 $MIF384: - 38488 00005CB0 C3 retn ;;AN000;; - 38489 - 38490 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38491 ;; - 38492 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38493 - 38494 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 38495 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38496 ; 12/04/2023 - 38497 ;; ($M_CONVERTTIME is same with $M_CONVERTDATE) - 38498 %if 0 - 38499 $M_CONVERTTIME: - 38500 $M_CONVERTDATE: ; *!*! ; 12/04/2023 - 38501 pop word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38502 ;pop word [$M_RT+76] ;;AN000;; Save return address - 38503 mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl - 38504 ;mov [$M_RT+66],cl ;;AN000;; Save the size before conversion - 38505 call $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string - 38506 dec cx ;;AN000;; Test if size only grew by 1 - 38507 cmp cl,[$M_RT+$M_RES_ADDRS.$M_SIZE] ;;AN000;; Did size only grow by one? - 38508 jne short $MIF386 ;;AN000;; No - 38509 mov ax,'0' ; $M_TIMEDATE_PAD ; 30h ;;AN000;; Get a pad character (0) - 38510 push ax ;;AN000;; Save it - 38511 inc cx ;;AN000;; Count itount it - 38512 $MIF386: - 38513 inc cx ;;AN000;; Restore CX - 38514 push word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] - 38515 ;push word [$M_RT+76] ;;AN000;; Restore return address - 38516 retn - 38517 %endif - 38518 - 38519 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38520 ;; - 38521 ;; PROC NAME: $M_WAIT_FOR_INPUT - 38522 ;; - 38523 ;; FUNCTION: To accept keyed input and return extended key value - 38524 ;; in AX register - 38525 ;; INPUTS: DL contains the DOS function requested for input - 38526 ;; OUTPUTS: AX contains the extended key value that was read - 38527 ;; REGS USED: - 38528 ;; - 38529 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 38530 - 38531 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38532 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6123h + 38437 00005C74 8A4402 mov al,[si+$M_SUBLIST_STRUC.$M_S_VALUE] + 38438 ;mov al,[si+2] ;;AN000;; Get Hours + 38439 + 38440 ;test $M_SL.$M_S_FLAG,Time_Cty_Type and $M_TIME_MASK + 38441 00005C77 F6440701 test byte [si+$M_SUBLIST_STRUC.$M_S_FLAG],1 + 38442 ;test byte [si+7],1 ;;AN000;; Is this a request for current country info? + 38443 00005C7B 7413 jz short $MIF376 ;;AN000;; No + 38444 + 38445 00005C7D 803E[F198]00 cmp byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],0 + 38446 ;cmp byte [$M_RT+93],0 ;;AN000;; Is the current country format 12 Hour? + 38447 00005C82 750C jne short $MIF377 ;;AN000;; No + 38448 + 38449 00005C84 3C0D cmp al,13 ;;AN000;; Is hour less than 12? + 38450 00005C86 7C02 jnge short $MIF378 ; jl + 38451 00005C88 2C0C sub al,12 ;;AN000;; Set to a 12 hour value + 38452 $MIF378: + 38453 ;cmp al,0 ;;AN000;; Is hour less than 12? + 38454 ;jne short $MIF380 ;;AN000;; No + 38455 ; 12/04/2023 + 38456 00005C8A 20C0 and al,al + 38457 00005C8C 7502 jnz short $MIF380 + 38458 00005C8E B00C mov al,12 ;;AN000;; Set to a 12 hour value + 38459 $MIF380: + 38460 $MIF377: + 38461 $MIF376: + 38462 00005C90 E8C1FB call $M_CONVERT2ASC ;;AN000;; Convert it to ASCII + 38463 00005C93 55 push bp ;;AN000;; Restore return address + 38464 00005C94 C3 retn ;;AN000;; Return + 38465 + 38466 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38467 ;; + 38468 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38469 + 38470 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38471 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38472 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38473 $M_GET_TIME: + 38474 ;mov ah,38h ; DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info + 38475 ;mov al,0 ;;AN000;; Get current country info + 38476 ; 12/04/2023 + 38477 00005C95 B80038 mov ax,3800h + 38478 ; + 38479 00005C98 8D16[E098] lea dx,[$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38480 ;lea dx,[$M_RT+76] ;;AN000;; Set up addressibility to buffer + 38481 00005C9C CD21 int 21h ;;AN000;; + 38482 00005C9E 7310 jnc short $MIF384 + 38483 + 38484 00005CA0 C706[F198]0100 mov word [$M_RT+$M_COUNTRY_INFO.$M_TIME_FORMAT],1 ; $M_DEF_TIME_FORM + 38485 ;mov word [$M_RT+93],1 ;;AN000;; Set default time format (BH) + 38486 00005CA6 C606[ED98]3A mov byte [$M_RT+$M_COUNTRY_INFO.$M_TIME_SEPARA],':' ; $M_DEF_TIME_SEP + 38487 ;mov byte [$M_RT+89],':' ;;AN000;; Set default time separator (BL) + 38488 00005CAB C606[E998]2E mov byte [$M_RT+$M_COUNTRY_INFO.$M_DECI_SEPARA],'.' ; $M_DEF_DECI_SEP + 38489 ;mov byte [$M_RT+85],'.' ;;AN000;; Set default time separator (BL) + 38490 $MIF384: + 38491 00005CB0 C3 retn ;;AN000;; + 38492 + 38493 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38494 ;; + 38495 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38496 + 38497 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 38498 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38499 ; 12/04/2023 + 38500 ;; ($M_CONVERTTIME is same with $M_CONVERTDATE) + 38501 %if 0 + 38502 $M_CONVERTTIME: + 38503 $M_CONVERTDATE: ; *!*! ; 12/04/2023 + 38504 pop word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38505 ;pop word [$M_RT+76] ;;AN000;; Save return address + 38506 mov [$M_RT+$M_RES_ADDRS.$M_SIZE],cl + 38507 ;mov [$M_RT+66],cl ;;AN000;; Save the size before conversion + 38508 call $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string + 38509 dec cx ;;AN000;; Test if size only grew by 1 + 38510 cmp cl,[$M_RT+$M_RES_ADDRS.$M_SIZE] ;;AN000;; Did size only grow by one? + 38511 jne short $MIF386 ;;AN000;; No + 38512 mov ax,'0' ; $M_TIMEDATE_PAD ; 30h ;;AN000;; Get a pad character (0) + 38513 push ax ;;AN000;; Save it + 38514 inc cx ;;AN000;; Count itount it + 38515 $MIF386: + 38516 inc cx ;;AN000;; Restore CX + 38517 push word [$M_RT+$M_RES_ADDRS.$M_TEMP_BUF] + 38518 ;push word [$M_RT+76] ;;AN000;; Restore return address + 38519 retn + 38520 %endif + 38521 + 38522 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 38523 ;; + 38524 ;; PROC NAME: $M_WAIT_FOR_INPUT + 38525 ;; + 38526 ;; FUNCTION: To accept keyed input and return extended key value + 38527 ;; in AX register + 38528 ;; INPUTS: DL contains the DOS function requested for input + 38529 ;; OUTPUTS: AX contains the extended key value that was read + 38530 ;; REGS USED: + 38531 ;; + 38532 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 38533 - 38534 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38535 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5FA1h - 38536 $M_WAIT_FOR_INPUT: - 38537 00005CB1 51 push cx ;;AN000;; Save CX - 38538 00005CB2 52 push dx ;;AN000;; Save DX - 38539 00005CB3 1E push ds ;;AN000;; Save Data segment - 38540 - 38541 00005CB4 80FAC0 cmp dl,0C0h ; DOS_CLR_KEYB_BUF_MASK ;;AN001;; Are we to clear the keyboard buffer? - 38542 00005CB7 7608 jna short $MIF388 ; jbe ;;AN001;; No, - 38543 ;;AN001;; Yes, - 38544 00005CB9 88D0 mov al,dl ;;AN001;; Mov function into AL - 38545 00005CBB 240F and al,0Fh ; LOW_NIB_MASK ;;AN001;; Mask out the C in high nibble - 38546 00005CBD B40C mov ah,0Ch ; DOS_CLR_KEYB_BUF ;;AN001;; Set input function - 38547 00005CBF EB02 jmp short $MEN388 - 38548 $MIF388: - 38549 00005CC1 88D4 mov ah,dl ;;AN000;; Put DOS function in AH - 38550 $MEN388: - 38551 00005CC3 06 push es ;;AN000;; Get output buffer segment - 38552 00005CC4 1F pop ds ;;AN000;; - 38553 00005CC5 89FA mov dx,di ;;AN000;; Get output buffer offset in case needed - 38554 00005CC7 CD21 int 21h ;;AN000;; Get keyboard input - 38555 00005CC9 1F pop ds ;;AN000;; - 38556 00005CCA 80FA0A cmp dl,0Ah ; DOS_BUF_KEYB_INP ;;AN000;; - 38557 ;clc ;;AN000;; - 38558 00005CCD 7412 je short $MIF391 - 38559 00005CCF E85EFB call $M_IS_IT_DBCS ;;AN000;; Is this character DBCS? - 38560 00005CD2 730B jnc short $MIF392 - 38561 00005CD4 88C1 mov cl,al ;;AN000;; Save first character - 38562 00005CD6 88D4 mov ah,dl ;;AN001;; Get back function - 38563 00005CD8 CD21 int 21h ;;AN000;; Get keyboard input - 38564 00005CDA 88CC mov ah,cl ;;AN000;; Retrieve first character AX = xxxx - 38565 00005CDC F8 clc ;;AN000;; Clear carry condition - 38566 00005CDD EB02 jmp short $MEN392 - 38567 $MIF392: - 38568 00005CDF B400 mov ah,0 ;;AN000;; AX = 00xx where xx is SBCS - 38569 $MEN392: - 38570 $MIF391: - 38571 ;jc short $MIF396 ; 15/06/2023 - 38572 00005CE1 5A pop dx ;;AN000;; - 38573 00005CE2 59 pop cx ;;AN000;; - 38574 ;jmp short $MEN396 - 38575 00005CE3 C3 retn - 38576 - 38577 ; 15/06/2023 - 38578 ;$MIF396: - 38579 ;add sp,4 ;;AN000;; - 38580 ;stc ;;AN000;; Reset carry flag - 38581 ;$MEN396: - 38582 ;retn ;;AN000;; Return - 38583 - 38584 ; ---------------------------- - 38585 ; MSDOS 6.0, TPRINTF.ASM, 1991 - 38586 ; ---------------------------- - 38587 ; include msgdcl.inc - 38588 ; ---------------------------- - 38589 - 38590 ;============================================================================ - 38591 ; HIGHLOAD.INC, MSDOS 6.0, 1992 - 38592 ;============================================================================ - 38593 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM - 38594 - 38595 ;**************************************************************************** - 38596 ; - 38597 ; This file contains routines needed to parse and implement user-given - 38598 ; command-line options of the form "/S/L:3,0x500;2;7,127;0x0BE4". InitVar() - 38599 ; and Parsevar() are used to parse this data and place it in encoded form into - 38600 ; the variables in highvar.inc, for use by the rest of the routines. - 38601 ; - 38602 ; DeviceHigh accepts this command-line (handled in sysconf.asm, not here): - 38603 ; DEVICEHIGH SIZE=hhhhhh module opts - 38604 ; Or, DeviceHigh and LoadHigh accept any of the following: - 38605 ; DH/LH module opts - 38606 ; DH/LH [/S][/L:umb[,size][;umb[,size]]*] module opts - 38607 ; DH/LH [/L:umb[,size][;umb[,size]]*][/S] module opts - 38608 ; The initial UMB,SIZE pair designates the module's load address; the remainder - 38609 ; of the UMB and SIZE pairs are used to indicate specific UMBs to be left - 38610 ; available during the load. - 38611 ; - 38612 ; When an actual load is ready to be performed, a call to HideUMBs() will - 38613 ; temporarily allocate (as owner 8+"HIDDEN ") all free elements in any - 38614 ; upper-memory block which was not specified by the user... in addition, if - 38615 ; UMBs were marked to shrink (/S option) to a certain size ("umb,size"), any - 38616 ; elements in that umb SAVE the lower-half of the newly-shrunken one are also - 38617 ; allocated. After the load, the function UnHideUMBs() (in highexit.inc) will - 38618 ; free any UMBs so allocated. - 38619 ; - 38620 ; When a device driver loads, there is the additional problem of allocating its - 38621 ; initial load site; this should be restricted to the first UMB specified on - 38622 ; the command-line. The function FreezeUM temporarily allocates all remaining - 38623 ; free upper-memory elements (as owner 8+"FROZEN "), except those in the load - 38624 ; UMB. Then the initial allocation may be made, and a call to UnFreeze will - 38625 ; return any so-allocated memory elements to FREE, for the true load. Note - 38626 ; that UnFreeze leaves HIDDEN elements allocated; it only frees FROZEN ones. - 38627 ; - 38628 ;**************************************************************************** - 38629 - 38630 ;___PROCEDURES_______________________________________________________________ - 38631 ; - 38632 ; AddrToUmb - converts a segment address in AX to its appropriate UMB # - 38633 ; BigFree - makes ES:0 point to the largest free MCB in UMB given as AL - 38634 ; FixMem - scans the UM chain and concatenates adjacent free MCBs - 38635 ; FreezeUM - Marks FROZEN all UM elements now FREE, save those in load UMB - 38636 ; GetLoadSize - Returns the load UMB minimum size (0 if not specified) - 38637 ; GetLoadUMB - Returns the load UMB number in AL (-1 if not specified) - 38638 ; GetSize - Returns the UMB in AL's minimum size (0 if not specified) - 38639 ; GetXNum - reads a 32-bit ASCII number at ES:SI and returns it in DX:AX - 38640 ; HideUMBs - links UMBs and hides upper-memory as appropriate - 38641 ; InitVar - initializes all the variables used in ParseVar and HideUMBs - 38642 ; NextMCB - moves an MCB pointer forward to the next MCB - 38643 ; ParseVar - parses [/S][/L:umb[,size][;umb[,size]]*] and builds the table - 38644 ; PrTable - produces a printout of the variables in highvar.inc - 38645 ; StoLoadSize - Overrides the load UMB minimum size with what's in AX - 38646 ; StoLoadUMB - Overrides the load UMB number with what's in AL - 38647 ; UmbHead - returns in AX the address of the first UMB block (0x9FFF) - 38648 ; UnFreeze - Marks FROZEN elements as FREE - 38649 ; - 38650 ;___VARIABLES________________________________________________________________ - 38651 ; - 38652 ; gnradix - After a call to GetXNum, is 16 or 10, depending on the # read - 38653 ; - 38654 ; Internal: - 38655 ;___PROCEDURES_______________________________________________________________ + 38534 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38535 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6123h + 38536 + 38537 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38538 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5FA1h + 38539 $M_WAIT_FOR_INPUT: + 38540 00005CB1 51 push cx ;;AN000;; Save CX + 38541 00005CB2 52 push dx ;;AN000;; Save DX + 38542 00005CB3 1E push ds ;;AN000;; Save Data segment + 38543 + 38544 00005CB4 80FAC0 cmp dl,0C0h ; DOS_CLR_KEYB_BUF_MASK ;;AN001;; Are we to clear the keyboard buffer? + 38545 00005CB7 7608 jna short $MIF388 ; jbe ;;AN001;; No, + 38546 ;;AN001;; Yes, + 38547 00005CB9 88D0 mov al,dl ;;AN001;; Mov function into AL + 38548 00005CBB 240F and al,0Fh ; LOW_NIB_MASK ;;AN001;; Mask out the C in high nibble + 38549 00005CBD B40C mov ah,0Ch ; DOS_CLR_KEYB_BUF ;;AN001;; Set input function + 38550 00005CBF EB02 jmp short $MEN388 + 38551 $MIF388: + 38552 00005CC1 88D4 mov ah,dl ;;AN000;; Put DOS function in AH + 38553 $MEN388: + 38554 00005CC3 06 push es ;;AN000;; Get output buffer segment + 38555 00005CC4 1F pop ds ;;AN000;; + 38556 00005CC5 89FA mov dx,di ;;AN000;; Get output buffer offset in case needed + 38557 00005CC7 CD21 int 21h ;;AN000;; Get keyboard input + 38558 00005CC9 1F pop ds ;;AN000;; + 38559 00005CCA 80FA0A cmp dl,0Ah ; DOS_BUF_KEYB_INP ;;AN000;; + 38560 ;clc ;;AN000;; + 38561 00005CCD 7412 je short $MIF391 + 38562 00005CCF E85EFB call $M_IS_IT_DBCS ;;AN000;; Is this character DBCS? + 38563 00005CD2 730B jnc short $MIF392 + 38564 00005CD4 88C1 mov cl,al ;;AN000;; Save first character + 38565 00005CD6 88D4 mov ah,dl ;;AN001;; Get back function + 38566 00005CD8 CD21 int 21h ;;AN000;; Get keyboard input + 38567 00005CDA 88CC mov ah,cl ;;AN000;; Retrieve first character AX = xxxx + 38568 00005CDC F8 clc ;;AN000;; Clear carry condition + 38569 00005CDD EB02 jmp short $MEN392 + 38570 $MIF392: + 38571 00005CDF B400 mov ah,0 ;;AN000;; AX = 00xx where xx is SBCS + 38572 $MEN392: + 38573 $MIF391: + 38574 ;jc short $MIF396 ; 15/06/2023 + 38575 00005CE1 5A pop dx ;;AN000;; + 38576 00005CE2 59 pop cx ;;AN000;; + 38577 ;jmp short $MEN396 + 38578 00005CE3 C3 retn + 38579 + 38580 ; 15/06/2023 + 38581 ;$MIF396: + 38582 ;add sp,4 ;;AN000;; + 38583 ;stc ;;AN000;; Reset carry flag + 38584 ;$MEN396: + 38585 ;retn ;;AN000;; Return + 38586 + 38587 ; ---------------------------- + 38588 ; MSDOS 6.0, TPRINTF.ASM, 1991 + 38589 ; ---------------------------- + 38590 ; include msgdcl.inc + 38591 ; ---------------------------- + 38592 + 38593 ;============================================================================ + 38594 ; HIGHLOAD.INC, MSDOS 6.0, 1992 + 38595 ;============================================================================ + 38596 ; 15/06/2023 - Retro DOS v4.2 COMMAND.COM + 38597 + 38598 ;**************************************************************************** + 38599 ; + 38600 ; This file contains routines needed to parse and implement user-given + 38601 ; command-line options of the form "/S/L:3,0x500;2;7,127;0x0BE4". InitVar() + 38602 ; and Parsevar() are used to parse this data and place it in encoded form into + 38603 ; the variables in highvar.inc, for use by the rest of the routines. + 38604 ; + 38605 ; DeviceHigh accepts this command-line (handled in sysconf.asm, not here): + 38606 ; DEVICEHIGH SIZE=hhhhhh module opts + 38607 ; Or, DeviceHigh and LoadHigh accept any of the following: + 38608 ; DH/LH module opts + 38609 ; DH/LH [/S][/L:umb[,size][;umb[,size]]*] module opts + 38610 ; DH/LH [/L:umb[,size][;umb[,size]]*][/S] module opts + 38611 ; The initial UMB,SIZE pair designates the module's load address; the remainder + 38612 ; of the UMB and SIZE pairs are used to indicate specific UMBs to be left + 38613 ; available during the load. + 38614 ; + 38615 ; When an actual load is ready to be performed, a call to HideUMBs() will + 38616 ; temporarily allocate (as owner 8+"HIDDEN ") all free elements in any + 38617 ; upper-memory block which was not specified by the user... in addition, if + 38618 ; UMBs were marked to shrink (/S option) to a certain size ("umb,size"), any + 38619 ; elements in that umb SAVE the lower-half of the newly-shrunken one are also + 38620 ; allocated. After the load, the function UnHideUMBs() (in highexit.inc) will + 38621 ; free any UMBs so allocated. + 38622 ; + 38623 ; When a device driver loads, there is the additional problem of allocating its + 38624 ; initial load site; this should be restricted to the first UMB specified on + 38625 ; the command-line. The function FreezeUM temporarily allocates all remaining + 38626 ; free upper-memory elements (as owner 8+"FROZEN "), except those in the load + 38627 ; UMB. Then the initial allocation may be made, and a call to UnFreeze will + 38628 ; return any so-allocated memory elements to FREE, for the true load. Note + 38629 ; that UnFreeze leaves HIDDEN elements allocated; it only frees FROZEN ones. + 38630 ; + 38631 ;**************************************************************************** + 38632 + 38633 ;___PROCEDURES_______________________________________________________________ + 38634 ; + 38635 ; AddrToUmb - converts a segment address in AX to its appropriate UMB # + 38636 ; BigFree - makes ES:0 point to the largest free MCB in UMB given as AL + 38637 ; FixMem - scans the UM chain and concatenates adjacent free MCBs + 38638 ; FreezeUM - Marks FROZEN all UM elements now FREE, save those in load UMB + 38639 ; GetLoadSize - Returns the load UMB minimum size (0 if not specified) + 38640 ; GetLoadUMB - Returns the load UMB number in AL (-1 if not specified) + 38641 ; GetSize - Returns the UMB in AL's minimum size (0 if not specified) + 38642 ; GetXNum - reads a 32-bit ASCII number at ES:SI and returns it in DX:AX + 38643 ; HideUMBs - links UMBs and hides upper-memory as appropriate + 38644 ; InitVar - initializes all the variables used in ParseVar and HideUMBs + 38645 ; NextMCB - moves an MCB pointer forward to the next MCB + 38646 ; ParseVar - parses [/S][/L:umb[,size][;umb[,size]]*] and builds the table + 38647 ; PrTable - produces a printout of the variables in highvar.inc + 38648 ; StoLoadSize - Overrides the load UMB minimum size with what's in AX + 38649 ; StoLoadUMB - Overrides the load UMB number with what's in AL + 38650 ; UmbHead - returns in AX the address of the first UMB block (0x9FFF) + 38651 ; UnFreeze - Marks FROZEN elements as FREE + 38652 ; + 38653 ;___VARIABLES________________________________________________________________ + 38654 ; + 38655 ; gnradix - After a call to GetXNum, is 16 or 10, depending on the # read 38656 ; - 38657 ; convUMB - checks after GetXNum to convert an address to a UMB number - 38658 ; findUMB - makes ES:0 point to the first MCB in UMB given as AL - 38659 ; fm_link - links UMBs not already linked in - 38660 ; fm_unlink - unlinks UMBs if fm_umb is set to 0 - 38661 ; frezMCB - marks as 8+FROZEN the MCB at ES:0 - 38662 ; hideMCB - marks as HIDDEN the MCB at ES:0 - 38663 ; hideUMB - marks as HIDDEN all FREE elements in UMB passed as AL - 38664 ; hideUMB? - hides as appropriate the UMB in CL - 38665 ; hl_unlink - unlinks UMBs if fm_umb is set to 0; restores strategy too - 38666 ; incArgc - increments fm_argc, for use with LH command-line parsing - 38667 ; isEOL - returns with ZF set iff AL contains CR or LF, or 0 - 38668 ; isFreeMCB - returns with ZF set if current MCB (ES:0) is FREE - 38669 ; isFrozMCB - returns with ZF set if current MCB (ES:0) is FROZEN - 38670 ; isSpecified - sets ZF if UMB in AL wasn't specified in DH/LH line. - 38671 ; isSysMCB - sets ZF iff ES points to an MCB owned by "SC" + (8 or 9) - 38672 ; isTiny - returns with ZF set if user didn't specify /S - 38673 ; isWhite - returns with ZF set iff AL contains whitespace (or "=") - 38674 ; loadLow - returns AL==0 if UMB0 == 0, else AL==1 - 38675 ; mul32 - multiplies the number in DX:AX by gnradix - 38676 ; parseL - parses ":nnnn[,nnnn][;nnnn[,nnnn]]*" for ParseVar - 38677 ; setUMBs - links umbs and sets allocation strategy for a load - 38678 ; shrinkMCB - breaks an MCB into two pieces, the lowest one's size==AX - 38679 ; stowSiz - marks a given UMB as having a given minimum size - 38680 ; stowUMB - marks a given UMB as used, if it hasn't been so marked before - 38681 ; toDigit - converts a character-digit to its binary counterpart - 38682 ; toPara - divides DX:AX by 16; result in AX only - 38683 ; toUpper - accepts one argument (probly a register), and upper-cases it. - 38684 ; unHideMCB - marks as FREE the MCB at ES:0 - 38685 ; unMarkUMB - marks a given UMB as unused, even if previously marked used - 38686 ; - 38687 ;**************************************************************************** - 38688 - 38689 ;DOS_CHECK_STRATEGY equ 5800h ; Int 21h, Func 58h, Svc 0 = check alloc strat - 38690 ;DOS_SET_STRATEGY equ 5801h ; Int 21h, Func 58h, Svc 1 = set alloc strategy - 38691 ;DOS_CHECK_UMBLINK equ 5802h ; Int 21h, Func 58h, Svc 2 = check link state - 38692 ;DOS_SET_UMBLINK equ 5803h ; Int 21h, Func 58h, Svc 3 = set link state - 38693 ;DOS_GET_DOS_LISTS equ 52h ; Int 21h, Func 52h = return list of lists - 38694 ;DOS_UMB_HEAD equ 8Ch ; Offset from ES (after func52h) to get UMBHead - 38695 - 38696 ; ----------------------------------------------------------------------------- - 38697 ;*** InitVar - initializes all the variables used in ParseVar and HideUMBs - 38698 ; ----------------------------------------------------------------------------- - 38699 ; ENTRY: None - 38700 ; EXIT: Variables listed in highvar.inc are initialized - 38701 ; ERROR EXIT: None - 38702 ; USES: Flags, variables in highvar.inc - 38703 ; ----------------------------------------------------------------------------- - 38704 ; Note that element 0 references UMB 0 (conventional), not UMB 1. Its contents - 38705 ; are largely ignored, but it is initialized nonetheless. + 38657 ; Internal: + 38658 ;___PROCEDURES_______________________________________________________________ + 38659 ; + 38660 ; convUMB - checks after GetXNum to convert an address to a UMB number + 38661 ; findUMB - makes ES:0 point to the first MCB in UMB given as AL + 38662 ; fm_link - links UMBs not already linked in + 38663 ; fm_unlink - unlinks UMBs if fm_umb is set to 0 + 38664 ; frezMCB - marks as 8+FROZEN the MCB at ES:0 + 38665 ; hideMCB - marks as HIDDEN the MCB at ES:0 + 38666 ; hideUMB - marks as HIDDEN all FREE elements in UMB passed as AL + 38667 ; hideUMB? - hides as appropriate the UMB in CL + 38668 ; hl_unlink - unlinks UMBs if fm_umb is set to 0; restores strategy too + 38669 ; incArgc - increments fm_argc, for use with LH command-line parsing + 38670 ; isEOL - returns with ZF set iff AL contains CR or LF, or 0 + 38671 ; isFreeMCB - returns with ZF set if current MCB (ES:0) is FREE + 38672 ; isFrozMCB - returns with ZF set if current MCB (ES:0) is FROZEN + 38673 ; isSpecified - sets ZF if UMB in AL wasn't specified in DH/LH line. + 38674 ; isSysMCB - sets ZF iff ES points to an MCB owned by "SC" + (8 or 9) + 38675 ; isTiny - returns with ZF set if user didn't specify /S + 38676 ; isWhite - returns with ZF set iff AL contains whitespace (or "=") + 38677 ; loadLow - returns AL==0 if UMB0 == 0, else AL==1 + 38678 ; mul32 - multiplies the number in DX:AX by gnradix + 38679 ; parseL - parses ":nnnn[,nnnn][;nnnn[,nnnn]]*" for ParseVar + 38680 ; setUMBs - links umbs and sets allocation strategy for a load + 38681 ; shrinkMCB - breaks an MCB into two pieces, the lowest one's size==AX + 38682 ; stowSiz - marks a given UMB as having a given minimum size + 38683 ; stowUMB - marks a given UMB as used, if it hasn't been so marked before + 38684 ; toDigit - converts a character-digit to its binary counterpart + 38685 ; toPara - divides DX:AX by 16; result in AX only + 38686 ; toUpper - accepts one argument (probly a register), and upper-cases it. + 38687 ; unHideMCB - marks as FREE the MCB at ES:0 + 38688 ; unMarkUMB - marks a given UMB as unused, even if previously marked used + 38689 ; + 38690 ;**************************************************************************** + 38691 + 38692 ;DOS_CHECK_STRATEGY equ 5800h ; Int 21h, Func 58h, Svc 0 = check alloc strat + 38693 ;DOS_SET_STRATEGY equ 5801h ; Int 21h, Func 58h, Svc 1 = set alloc strategy + 38694 ;DOS_CHECK_UMBLINK equ 5802h ; Int 21h, Func 58h, Svc 2 = check link state + 38695 ;DOS_SET_UMBLINK equ 5803h ; Int 21h, Func 58h, Svc 3 = set link state + 38696 ;DOS_GET_DOS_LISTS equ 52h ; Int 21h, Func 52h = return list of lists + 38697 ;DOS_UMB_HEAD equ 8Ch ; Offset from ES (after func52h) to get UMBHead + 38698 + 38699 ; ----------------------------------------------------------------------------- + 38700 ;*** InitVar - initializes all the variables used in ParseVar and HideUMBs + 38701 ; ----------------------------------------------------------------------------- + 38702 ; ENTRY: None + 38703 ; EXIT: Variables listed in highvar.inc are initialized + 38704 ; ERROR EXIT: None + 38705 ; USES: Flags, variables in highvar.inc 38706 ; ----------------------------------------------------------------------------- - 38707 - 38708 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 38709 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:615Fh + 38707 ; Note that element 0 references UMB 0 (conventional), not UMB 1. Its contents + 38708 ; are largely ignored, but it is initialized nonetheless. + 38709 ; ----------------------------------------------------------------------------- 38710 - 38711 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38712 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5FDCh - 38713 InitVar: ; proc near - 38714 ;push ax - 38715 ;push cx - 38716 ;push di - 38717 00005CE4 06 push es ; * es = ds - 38718 00005CE5 8E06[F59B] mov es,[RESSEG] ;Point ES into appropriate data segment - 38719 00005CE9 31C0 xor ax,ax - 38720 ;mov [es:fUmbTiny],al ;Shrink UMBs? (made 1 if /S given) - 38721 ;mov [es:fInHigh],al ;Set to 1 when DH/LH has been called - 38722 00005CEB 26A3[3005] mov [es:fInHigh],ax ; 16/06/2023 - 38723 00005CEF 26A3[3205] mov [es:SegLoad],ax ;Load Address (seg), used for DH only - 38724 00005CF3 26C606[3405]FF mov byte [es:UmbLoad],0FFh ;UNSPECIFIED - 38725 ;Later is the # of the 1st spec'd UMB - 38726 00005CF9 26A2[3705] mov [es:fm_argc],al ;Start with zero args having been read - 38727 - 38728 00005CFD FC cld - 38729 - 38730 00005CFE B91000 mov cx,16 ; MAXUMB ;For each entry - 38731 00005D01 BF[5E04] mov di,UmbUsed ;on the UmbUsed array, - 38732 00005D04 F3AA rep stosb ; Store 0 - 38733 - 38734 ;mov cx,16 ; MAXUMB ;Okay... for each entry - 38735 00005D06 B110 mov cl,16 - 38736 00005D08 BF[6E04] mov di,UmbSize ;on the UmbSize array, - 38737 00005D0B F3AB rep stosw ; Store 0 - 38738 - 38739 00005D0D 07 pop es ; * es = ds - 38740 ;pop di - 38741 ;pop cx - 38742 ;pop ax - 38743 00005D0E C3 retn - 38744 - 38745 ;InitVar endp - 38746 - 38747 ; ----------------------------------------------------------------------------- - 38748 ;*** FixMem - scans the upper memory chain and concatenates adjacent free MCBs - 38749 ; ----------------------------------------------------------------------------- - 38750 ; ENTRY : None - 38751 ; EXIT : None - 38752 ; ERROR : None - 38753 ; USES : Flags, fm_umb, fm_strat - 38754 ; ----------------------------------------------------------------------------- - 38755 - 38756 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 38757 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38758 FixMem: - 38759 ;push ax - 38760 ;push bx - 38761 ;push cx - 38762 ;push dx - 38763 00005D0F 06 push es - 38764 - 38765 00005D10 E84900 call fm_link ; Link in UMBs - 38766 - 38767 00005D13 E82302 call UmbHead ; Get first upper-memory MCB address (0x9FFF) - 38768 00005D16 723F jc short fmX ; (if couldn't get it, leave now). + 38711 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 38712 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:615Fh + 38713 + 38714 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38715 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:5FDCh + 38716 InitVar: ; proc near + 38717 ;push ax + 38718 ;push cx + 38719 ;push di + 38720 00005CE4 06 push es ; * es = ds + 38721 00005CE5 8E06[F59B] mov es,[RESSEG] ;Point ES into appropriate data segment + 38722 00005CE9 31C0 xor ax,ax + 38723 ;mov [es:fUmbTiny],al ;Shrink UMBs? (made 1 if /S given) + 38724 ;mov [es:fInHigh],al ;Set to 1 when DH/LH has been called + 38725 00005CEB 26A3[3005] mov [es:fInHigh],ax ; 16/06/2023 + 38726 00005CEF 26A3[3205] mov [es:SegLoad],ax ;Load Address (seg), used for DH only + 38727 00005CF3 26C606[3405]FF mov byte [es:UmbLoad],0FFh ;UNSPECIFIED + 38728 ;Later is the # of the 1st spec'd UMB + 38729 00005CF9 26A2[3705] mov [es:fm_argc],al ;Start with zero args having been read + 38730 + 38731 00005CFD FC cld + 38732 + 38733 00005CFE B91000 mov cx,16 ; MAXUMB ;For each entry + 38734 00005D01 BF[5E04] mov di,UmbUsed ;on the UmbUsed array, + 38735 00005D04 F3AA rep stosb ; Store 0 + 38736 + 38737 ;mov cx,16 ; MAXUMB ;Okay... for each entry + 38738 00005D06 B110 mov cl,16 + 38739 00005D08 BF[6E04] mov di,UmbSize ;on the UmbSize array, + 38740 00005D0B F3AB rep stosw ; Store 0 + 38741 + 38742 00005D0D 07 pop es ; * es = ds + 38743 ;pop di + 38744 ;pop cx + 38745 ;pop ax + 38746 00005D0E C3 retn + 38747 + 38748 ;InitVar endp + 38749 + 38750 ; ----------------------------------------------------------------------------- + 38751 ;*** FixMem - scans the upper memory chain and concatenates adjacent free MCBs + 38752 ; ----------------------------------------------------------------------------- + 38753 ; ENTRY : None + 38754 ; EXIT : None + 38755 ; ERROR : None + 38756 ; USES : Flags, fm_umb, fm_strat + 38757 ; ----------------------------------------------------------------------------- + 38758 + 38759 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 38760 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38761 FixMem: + 38762 ;push ax + 38763 ;push bx + 38764 ;push cx + 38765 ;push dx + 38766 00005D0F 06 push es + 38767 + 38768 00005D10 E84900 call fm_link ; Link in UMBs 38769 - 38770 00005D18 8EC0 mov es,ax ; It returns in AX, so move it to ES. - 38771 - 38772 ; - Walk MCB Chain ------------------------------------------------------------ - 38773 - 38774 00005D1A 31D2 xor dx,dx ; We're keeping the address of the last MCB - 38775 00005D1C 89D1 mov cx,dx ; in CX... and the last owner - 38776 00005D1E 42 inc dx ; in dx as we go through the loop: - 38777 - 38778 ; ------------------------------------------ - 38779 ; FM10--DX = last MCB's owner's PSP address - 38780 ; CX = last MCB's address (segment) + 38770 00005D13 E82302 call UmbHead ; Get first upper-memory MCB address (0x9FFF) + 38771 00005D16 723F jc short fmX ; (if couldn't get it, leave now). + 38772 + 38773 00005D18 8EC0 mov es,ax ; It returns in AX, so move it to ES. + 38774 + 38775 ; - Walk MCB Chain ------------------------------------------------------------ + 38776 + 38777 00005D1A 31D2 xor dx,dx ; We're keeping the address of the last MCB + 38778 00005D1C 89D1 mov cx,dx ; in CX... and the last owner + 38779 00005D1E 42 inc dx ; in dx as we go through the loop: + 38780 38781 ; ------------------------------------------ - 38782 - 38783 fm10: - 38784 00005D1F 26A00000 mov al,[es:arena_signature] ; if 'Z', don't repeat loop - 38785 ;mov al,[es:0] - 38786 00005D23 268B1E0100 mov bx,[es:arena_owner] ; if not zero, do nothing - 38787 ;mov bx,[es:1] - 38788 00005D28 09D3 or bx,dx ; dx was owner of previous MCB - 38789 00005D2A 7516 jnz short fm30 ; If not both zero, don't cat. - 38790 - 38791 ; - Coalesce memory blocks at ES:00 and CX:00 --------------------------------- - 38792 - 38793 fm20: - 38794 00005D2C 268B1E0300 mov bx,[es:arena_size] ; Grab this block's Size, - 38795 ;mov bx,[es:3] - 38796 00005D31 8EC1 mov es,cx ; Go back to prev MCB's address - 38797 00005D33 26A20000 mov [es:arena_signature], al ; & move the SECOND sig here - 38798 ;mov [es:0],al - 38799 - 38800 00005D37 26031E0300 add bx,[es:arena_size] ; Size += first MCB's size - 38801 ;add bx,1 ; And add one for the header - 38802 00005D3C 43 inc bx - 38803 00005D3D 26891E0300 mov [es:arena_size],bx ; Write the size - 38804 - 38805 ; --------------------------------------------------------------------- - 38806 fm30: - 38807 00005D42 8CC1 mov cx,es ; Put this address on the stack - 38808 00005D44 268B160100 mov dx,[es:arena_owner] ; And remember its owner - 38809 ;mov dx,[es:1] - 38810 - 38811 ;NextMCB es,bx ; Move to the next MCB - 38812 - 38813 00005D49 8CC3 mov bx,es - 38814 ;add bx,[es:3] - 38815 00005D4B 26031E0300 add bx,[es:arena_size] - 38816 00005D50 43 inc bx - 38817 00005D51 8EC3 mov es,bx - 38818 - 38819 ;cmp al,'Z' ; cmp al,5Ah - 38820 00005D53 3C5A cmp al,arena_signature_end - 38821 00005D55 75C8 jnz short fm10 ; If signature != 'Z', there are more. - 38822 fmX: - 38823 00005D57 E81900 call fm_unlink ; Unlink UMBs - 38824 - 38825 00005D5A 07 pop es - 38826 ;pop dx - 38827 ;pop cx - 38828 ;pop bx - 38829 ;pop ax - 38830 00005D5B C3 retn - 38831 - 38832 ; ----------------------------------------------------------------------------- - 38833 ; 16/06/2023 + 38782 ; FM10--DX = last MCB's owner's PSP address + 38783 ; CX = last MCB's address (segment) + 38784 ; ------------------------------------------ + 38785 + 38786 fm10: + 38787 00005D1F 26A00000 mov al,[es:arena_signature] ; if 'Z', don't repeat loop + 38788 ;mov al,[es:0] + 38789 00005D23 268B1E0100 mov bx,[es:arena_owner] ; if not zero, do nothing + 38790 ;mov bx,[es:1] + 38791 00005D28 09D3 or bx,dx ; dx was owner of previous MCB + 38792 00005D2A 7516 jnz short fm30 ; If not both zero, don't cat. + 38793 + 38794 ; - Coalesce memory blocks at ES:00 and CX:00 --------------------------------- + 38795 + 38796 fm20: + 38797 00005D2C 268B1E0300 mov bx,[es:arena_size] ; Grab this block's Size, + 38798 ;mov bx,[es:3] + 38799 00005D31 8EC1 mov es,cx ; Go back to prev MCB's address + 38800 00005D33 26A20000 mov [es:arena_signature], al ; & move the SECOND sig here + 38801 ;mov [es:0],al + 38802 + 38803 00005D37 26031E0300 add bx,[es:arena_size] ; Size += first MCB's size + 38804 ;add bx,1 ; And add one for the header + 38805 00005D3C 43 inc bx + 38806 00005D3D 26891E0300 mov [es:arena_size],bx ; Write the size + 38807 + 38808 ; --------------------------------------------------------------------- + 38809 fm30: + 38810 00005D42 8CC1 mov cx,es ; Put this address on the stack + 38811 00005D44 268B160100 mov dx,[es:arena_owner] ; And remember its owner + 38812 ;mov dx,[es:1] + 38813 + 38814 ;NextMCB es,bx ; Move to the next MCB + 38815 + 38816 00005D49 8CC3 mov bx,es + 38817 ;add bx,[es:3] + 38818 00005D4B 26031E0300 add bx,[es:arena_size] + 38819 00005D50 43 inc bx + 38820 00005D51 8EC3 mov es,bx + 38821 + 38822 ;cmp al,'Z' ; cmp al,5Ah + 38823 00005D53 3C5A cmp al,arena_signature_end + 38824 00005D55 75C8 jnz short fm10 ; If signature != 'Z', there are more. + 38825 fmX: + 38826 00005D57 E81900 call fm_unlink ; Unlink UMBs + 38827 + 38828 00005D5A 07 pop es + 38829 ;pop dx + 38830 ;pop cx + 38831 ;pop bx + 38832 ;pop ax + 38833 00005D5B C3 retn 38834 - 38835 ;INT 21h - DOS 5+ - GET OR SET UMB LINK STATE - 38836 ; ....................................................... - 38837 ; AH = 58h - 38838 ; AL = subfunction - 38839 ; 02h get UMB link state - 38840 ; Return: - 38841 ; AL = current link state - 38842 ; 00h - UMBs not part of DOS memory chain - 38843 ; 01h - UMBs in DOS memory chain - 38844 ; 03h set UMB link state - 38845 ; BX = new link state - 38846 ; 0000h - remove UMBs from DOS memory chain - 38847 ; 0001h - add UMBs to DOS memory chain - 38848 ; - 38849 ;Return: CF clear if successful - 38850 ; CF set on error - 38851 ; AX = error code (01h) (see #01680) - 38852 ; ....................................................... - 38853 - 38854 ; ----------------------------------------------------------------------------- - 38855 ;*** fm_link - links UMBs not already linked in - 38856 ; ----------------------------------------------------------------------------- - 38857 ; ENTRY: None - 38858 ; EXIT: fm_umb == 0 if not linked in previously, 1 if already linked in - 38859 ; ERROR: None - 38860 ; USES: AX, BX, fm_umb - 38861 ; ----------------------------------------------------------------------------- - 38862 - 38863 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 38864 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38865 fm_link: - 38866 00005D5C B80258 mov ax,5802h ; DOS_CHECK_UMBLINK - 38867 00005D5F CD21 int 21h ; Current link-state is now in al - 38868 - 38869 ;putdata fm_umb,al ; So store it in fm_umb for later - 38870 - 38871 ;push es - 38872 ;mov es,[RESSEG] - 38873 ;mov [es:fm_umb],al - 38874 ;pop es - 38875 00005D61 1E push ds - 38876 00005D62 8E1E[F59B] mov ds,[RESSEG] - 38877 00005D66 A2[3505] mov [fm_umb],al - 38878 00005D69 1F pop ds - 38879 - 38880 00005D6A B80358 mov ax,5803h ; DOS_SET_UMBLINK - 38881 00005D6D BB0100 mov bx,1 - 38882 00005D70 CD21 int 21h - 38883 00005D72 C3 retn - 38884 - 38885 ; ----------------------------------------------------------------------------- - 38886 ;*** fm_unlink - unlinks UMBs if fm_umb is set to 0 - 38887 ; ----------------------------------------------------------------------------- - 38888 ; ENTRY: fm_umb == 1 : leave linked, else unlink - 38889 ; EXIT: None - 38890 ; ERROR: None - 38891 ; USES: AX, BX - 38892 ; ----------------------------------------------------------------------------- - 38893 - 38894 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 38895 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38896 fm_unlink: - 38897 00005D73 31DB xor bx,bx - 38898 - 38899 ;getdata bl,fm_umb ; fm_umb already has the old link-state - 38900 - 38901 00005D75 1E push ds - 38902 00005D76 8E1E[F59B] mov ds,[RESSEG] - 38903 00005D7A 8A1E[3505] mov bl,[fm_umb] - 38904 00005D7E 1F pop ds - 38905 - 38906 00005D7F B80358 mov ax,5803h ; DOS_SET_UMBLINK - 38907 00005D82 CD21 int 21h ; so just use that, and call int 21h - 38908 00005D84 C3 retn - 38909 - 38910 ; ----------------------------------------------------------------------------- - 38911 ;*** ParseVar - parses [/S][/L:umb[,size][;umb[,size]]*] and builds the table - 38912 ; laid out in highvar.inc + 38835 ; ----------------------------------------------------------------------------- + 38836 ; 16/06/2023 + 38837 + 38838 ;INT 21h - DOS 5+ - GET OR SET UMB LINK STATE + 38839 ; ....................................................... + 38840 ; AH = 58h + 38841 ; AL = subfunction + 38842 ; 02h get UMB link state + 38843 ; Return: + 38844 ; AL = current link state + 38845 ; 00h - UMBs not part of DOS memory chain + 38846 ; 01h - UMBs in DOS memory chain + 38847 ; 03h set UMB link state + 38848 ; BX = new link state + 38849 ; 0000h - remove UMBs from DOS memory chain + 38850 ; 0001h - add UMBs to DOS memory chain + 38851 ; + 38852 ;Return: CF clear if successful + 38853 ; CF set on error + 38854 ; AX = error code (01h) (see #01680) + 38855 ; ....................................................... + 38856 + 38857 ; ----------------------------------------------------------------------------- + 38858 ;*** fm_link - links UMBs not already linked in + 38859 ; ----------------------------------------------------------------------------- + 38860 ; ENTRY: None + 38861 ; EXIT: fm_umb == 0 if not linked in previously, 1 if already linked in + 38862 ; ERROR: None + 38863 ; USES: AX, BX, fm_umb + 38864 ; ----------------------------------------------------------------------------- + 38865 + 38866 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 38867 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38868 fm_link: + 38869 00005D5C B80258 mov ax,5802h ; DOS_CHECK_UMBLINK + 38870 00005D5F CD21 int 21h ; Current link-state is now in al + 38871 + 38872 ;putdata fm_umb,al ; So store it in fm_umb for later + 38873 + 38874 ;push es + 38875 ;mov es,[RESSEG] + 38876 ;mov [es:fm_umb],al + 38877 ;pop es + 38878 00005D61 1E push ds + 38879 00005D62 8E1E[F59B] mov ds,[RESSEG] + 38880 00005D66 A2[3505] mov [fm_umb],al + 38881 00005D69 1F pop ds + 38882 + 38883 00005D6A B80358 mov ax,5803h ; DOS_SET_UMBLINK + 38884 00005D6D BB0100 mov bx,1 + 38885 00005D70 CD21 int 21h + 38886 00005D72 C3 retn + 38887 + 38888 ; ----------------------------------------------------------------------------- + 38889 ;*** fm_unlink - unlinks UMBs if fm_umb is set to 0 + 38890 ; ----------------------------------------------------------------------------- + 38891 ; ENTRY: fm_umb == 1 : leave linked, else unlink + 38892 ; EXIT: None + 38893 ; ERROR: None + 38894 ; USES: AX, BX + 38895 ; ----------------------------------------------------------------------------- + 38896 + 38897 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 38898 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38899 fm_unlink: + 38900 00005D73 31DB xor bx,bx + 38901 + 38902 ;getdata bl,fm_umb ; fm_umb already has the old link-state + 38903 + 38904 00005D75 1E push ds + 38905 00005D76 8E1E[F59B] mov ds,[RESSEG] + 38906 00005D7A 8A1E[3505] mov bl,[fm_umb] + 38907 00005D7E 1F pop ds + 38908 + 38909 00005D7F B80358 mov ax,5803h ; DOS_SET_UMBLINK + 38910 00005D82 CD21 int 21h ; so just use that, and call int 21h + 38911 00005D84 C3 retn + 38912 38913 ; ----------------------------------------------------------------------------- - 38914 ; ENTRY: ES:SI points to command tail of LoadHigh/DeviceHigh (whitespace ok) - 38915 ; EXIT: ES:SI points to first character in child program name - 38916 ; ERROR: ES:SI points to character which caused error, carry set, AX == code - 38917 ; USES: ES:SI, AX, flags, variables in highvar.inc - 38918 ; ----------------------------------------------------------------------------- - 38919 ; Error codes (in AX if carry set on return): - 38920 ; - 38921 - 38922 ;PV_InvArg equ 1 ; Invalid argument passed - 38923 ;PV_BadUMB equ 2 ; Bad UMB number passed (duplicate?) - 38924 ;PV_InvSwt equ 3 ; Unrecognized switch passed - 38925 - 38926 ; - 38927 ; This routine exects ES:SI to point to a string much like the following: - 38928 ; "/S/L:1,200;2 module options" - 38929 ; Optionally, the string can begin with whitespace; neither /S nor /L is - 38930 ; required, though that's what this routine is supposed to parse. - 38931 ; - 38932 - 38933 ;optS equ 'S' ; /S - 38934 ;optL equ 'L' ; /L:... + 38914 ;*** ParseVar - parses [/S][/L:umb[,size][;umb[,size]]*] and builds the table + 38915 ; laid out in highvar.inc + 38916 ; ----------------------------------------------------------------------------- + 38917 ; ENTRY: ES:SI points to command tail of LoadHigh/DeviceHigh (whitespace ok) + 38918 ; EXIT: ES:SI points to first character in child program name + 38919 ; ERROR: ES:SI points to character which caused error, carry set, AX == code + 38920 ; USES: ES:SI, AX, flags, variables in highvar.inc + 38921 ; ----------------------------------------------------------------------------- + 38922 ; Error codes (in AX if carry set on return): + 38923 ; + 38924 + 38925 ;PV_InvArg equ 1 ; Invalid argument passed + 38926 ;PV_BadUMB equ 2 ; Bad UMB number passed (duplicate?) + 38927 ;PV_InvSwt equ 3 ; Unrecognized switch passed + 38928 + 38929 ; + 38930 ; This routine exects ES:SI to point to a string much like the following: + 38931 ; "/S/L:1,200;2 module options" + 38932 ; Optionally, the string can begin with whitespace; neither /S nor /L is + 38933 ; required, though that's what this routine is supposed to parse. + 38934 ; 38935 - 38936 ; - 38937 ; ----------------------------------------------------------------------------- - 38938 ; LoadHigh has a list of arguments, returned by cparse, which is used to create - 38939 ; a command-line for spawning a child process. For a typical LH command, say, - 38940 ; lh /l:1,1000;2 print/d:lpt2 - 38941 ; the arguments would look like (one per line): - 38942 ; lh - 38943 ; /l - 38944 ; 1 - 38945 ; 1000 - 38946 ; 2 - 38947 ; print - 38948 ; /d - 38949 ; :lpt2 - 38950 ; In short, if "print" were, say, "43", there'd be no way to determine which - 38951 ; arg was the filename. So, inside this routine, we keep a running counter - 38952 ; of the number of arguments LH will need to skip in order to get to the - 38953 ; program name. The "lh" is implicit--it'll always have to skip that. So if - 38954 ; there's no "/l" or "/s", fm_argc will be 0 ... other than that, 1 is added - 38955 ; for: - 38956 ; Each /L - 38957 ; Each /S (there should be only one) - 38958 ; Each UMB number (they follow ":" or ";") - 38959 ; Each UMB size (they follow ",") - 38960 ; So, in the above example, fm_argc would be 4-- and LH would skip right to - 38961 ; "print". Note that InitVar initializes fm_argc to zero. - 38962 ; ----------------------------------------------------------------------------- - 38963 - 38964 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 38965 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6216h + 38936 ;optS equ 'S' ; /S + 38937 ;optL equ 'L' ; /L:... + 38938 + 38939 ; + 38940 ; ----------------------------------------------------------------------------- + 38941 ; LoadHigh has a list of arguments, returned by cparse, which is used to create + 38942 ; a command-line for spawning a child process. For a typical LH command, say, + 38943 ; lh /l:1,1000;2 print/d:lpt2 + 38944 ; the arguments would look like (one per line): + 38945 ; lh + 38946 ; /l + 38947 ; 1 + 38948 ; 1000 + 38949 ; 2 + 38950 ; print + 38951 ; /d + 38952 ; :lpt2 + 38953 ; In short, if "print" were, say, "43", there'd be no way to determine which + 38954 ; arg was the filename. So, inside this routine, we keep a running counter + 38955 ; of the number of arguments LH will need to skip in order to get to the + 38956 ; program name. The "lh" is implicit--it'll always have to skip that. So if + 38957 ; there's no "/l" or "/s", fm_argc will be 0 ... other than that, 1 is added + 38958 ; for: + 38959 ; Each /L + 38960 ; Each /S (there should be only one) + 38961 ; Each UMB number (they follow ":" or ";") + 38962 ; Each UMB size (they follow ",") + 38963 ; So, in the above example, fm_argc would be 4-- and LH would skip right to + 38964 ; "print". Note that InitVar initializes fm_argc to zero. + 38965 ; ----------------------------------------------------------------------------- 38966 - 38967 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 38968 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6093h + 38967 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 38968 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6216h 38969 - 38970 ParseVar: ; proc near - 38971 ;push di - 38972 ;push ds ; * - 38973 ;push es - 38974 ; - 38975 ; 16/06/2023 - 38976 ; es = ds (from 'ParseLhCmd') - 38977 ;push es ; Make DS:SI point to it, as well as ES:SI - 38978 ;pop ds ; (regardless if we're in devhigh or loadhigh) - 38979 - 38980 00005D85 FC cld - 38981 - 38982 ; ------------------------------------------------ - 38983 ; PV10--ES:SI = any whitespace on the command-line - 38984 ; ------------------------------------------------ - 38985 - 38986 pv10: - 38987 00005D86 AC lodsb ; here, ES:SI==" /L..."--must eat whitespace - 38988 00005D87 E8A800 call isWhite - 38989 00005D8A 74FA jz short pv10 ; ES:SI==" /L..."--keep eating. - 38990 00005D8C 3C2F cmp al,'/' ; SWTCH - 38991 00005D8E 7404 je short pv20 ; ES:SI=="/L..."--go process a switch - 38992 - 38993 00005D90 4E dec si ; Backup--it's now "odule options", and we need - 38994 00005D91 F8 clc ; that "m" we just read (or whatever it is). - 38995 00005D92 EB2C jmp short pvX ; Then return with carry clear == we're done. - 38996 pv20: - 38997 00005D94 AC lodsb ; Just read 'S' or 'L', hopefully - 38998 - 38999 ;toUpper al ; So we make it upper-case, and... - 39000 00005D95 24DF and al,0DFh + 38970 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 38971 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6093h + 38972 + 38973 ParseVar: ; proc near + 38974 ;push di + 38975 ;push ds ; * + 38976 ;push es + 38977 ; + 38978 ; 16/06/2023 + 38979 ; es = ds (from 'ParseLhCmd') + 38980 ;push es ; Make DS:SI point to it, as well as ES:SI + 38981 ;pop ds ; (regardless if we're in devhigh or loadhigh) + 38982 + 38983 00005D85 FC cld + 38984 + 38985 ; ------------------------------------------------ + 38986 ; PV10--ES:SI = any whitespace on the command-line + 38987 ; ------------------------------------------------ + 38988 + 38989 pv10: + 38990 00005D86 AC lodsb ; here, ES:SI==" /L..."--must eat whitespace + 38991 00005D87 E8A800 call isWhite + 38992 00005D8A 74FA jz short pv10 ; ES:SI==" /L..."--keep eating. + 38993 00005D8C 3C2F cmp al,'/' ; SWTCH + 38994 00005D8E 7404 je short pv20 ; ES:SI=="/L..."--go process a switch + 38995 + 38996 00005D90 4E dec si ; Backup--it's now "odule options", and we need + 38997 00005D91 F8 clc ; that "m" we just read (or whatever it is). + 38998 00005D92 EB2C jmp short pvX ; Then return with carry clear == we're done. + 38999 pv20: + 39000 00005D94 AC lodsb ; Just read 'S' or 'L', hopefully 39001 - 39002 00005D97 3C53 cmp al,'S' ; optS ; just read 'S'? - 39003 00005D99 7510 jne short pv30 + 39002 ;toUpper al ; So we make it upper-case, and... + 39003 00005D95 24DF and al,0DFh 39004 - 39005 00005D9B E87E00 call incArgc ; If it's /S, it's another arg for LH to skip. - 39006 - 39007 ;putdata fUmbTiny,1 ; /S, so ES:SI==" /L..." or " module opts", or - 39008 - 39009 ;push es - 39010 ;mov es,[RESSEG] - 39011 ;mov byte [es:fUmbTiny],1 - 39012 ;pop es - 39013 00005D9E 1E push ds - 39014 00005D9F 8E1E[F59B] mov ds,[RESSEG] - 39015 00005DA3 C606[3105]01 mov byte [fUmbTiny],1 - 39016 00005DA8 1F pop ds - 39017 - 39018 00005DA9 EBDB jmp short pv10 ; possibly even "/L...". - 39019 pv30: - 39020 00005DAB 3C4C cmp al,'L' ; optL ; If it's not 'L' either, then it's a bad - 39021 00005DAD 750B jne short pvE1 ; switch! - 39022 - 39023 00005DAF E86A00 call incArgc ; If it's /L, it's another arg for LH to skip. - 39024 - 39025 00005DB2 E80C00 call parseL - 39026 00005DB5 73CF jnc short pv10 ; If no carry, go back and look for more + 39005 00005D97 3C53 cmp al,'S' ; optS ; just read 'S'? + 39006 00005D99 7510 jne short pv30 + 39007 + 39008 00005D9B E87E00 call incArgc ; If it's /S, it's another arg for LH to skip. + 39009 + 39010 ;putdata fUmbTiny,1 ; /S, so ES:SI==" /L..." or " module opts", or + 39011 + 39012 ;push es + 39013 ;mov es,[RESSEG] + 39014 ;mov byte [es:fUmbTiny],1 + 39015 ;pop es + 39016 00005D9E 1E push ds + 39017 00005D9F 8E1E[F59B] mov ds,[RESSEG] + 39018 00005DA3 C606[3105]01 mov byte [fUmbTiny],1 + 39019 00005DA8 1F pop ds + 39020 + 39021 00005DA9 EBDB jmp short pv10 ; possibly even "/L...". + 39022 pv30: + 39023 00005DAB 3C4C cmp al,'L' ; optL ; If it's not 'L' either, then it's a bad + 39024 00005DAD 750B jne short pvE1 ; switch! + 39025 + 39026 00005DAF E86A00 call incArgc ; If it's /L, it's another arg for LH to skip. 39027 - 39028 00005DB7 4E dec si ; Else, back up and exit. - 39029 00005DB8 EB03 jmp short pvErr ; AX has already been set by parseL - 39030 pvE1: - 39031 00005DBA B80300 mov ax,3 ; PV_InvSwt - 39032 ; Unrecognized switch passed - 39033 pvErr: - 39034 00005DBD 4E dec si - 39035 00005DBE 4E dec si - 39036 00005DBF F9 stc - 39037 pvX: - 39038 ;pop es - 39039 ;pop ds ; * - 39040 ;pop di - 39041 00005DC0 C3 retn - 39042 - 39043 ;ParseVar endp - 39044 - 39045 ; ----------------------------------------------------------------------------- - 39046 ;*** parseL - parses ":nnnn[,nnnn][;nnnn[,nnnn]]*" for ParseVar - 39047 ; ----------------------------------------------------------------------------- - 39048 ; ENTRY: ES:SI points to colon - 39049 ; EXIT: ES:SI points to first character not parsed - 39050 ; ERROR: Carry set; rewind three characters and return (see ParseVar) - 39051 ; USES: ES:SI, flags, AX, CX, DX, variables in highvar.inc - 39052 ; ----------------------------------------------------------------------------- - 39053 ; If the string here is terminated with anything other than whitespace or a - 39054 ; switchchar (perhaps it's /S or another /L:... ), then we return with carry - 39055 ; set, indicating that they've screwed up the syntax. The 3-character rewind - 39056 ; makes sure the app /L: is reported as being the culprit. - 39057 ; ----------------------------------------------------------------------------- - 39058 - 39059 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39060 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39061 parseL: - 39062 00005DC1 AC lodsb - 39063 00005DC2 3C3A cmp al,':' ; Make sure they did /L: - 39064 00005DC4 754A jne short plE1 ; If they didn't, return with carry set. - 39065 - 39066 ; ------------------------------------------ - 39067 ; PL10--ES:SI = a UMB number, after /L: or ; - 39068 ; ------------------------------------------ - 39069 - 39070 pl10: - 39071 00005DC6 E8FD00 call GetXNum ; After this, 'tis ",size" or ";umb" or " mod" - 39072 00005DC9 724B jc short plE2 ; And error if it's a bad number. - 39073 00005DCB E8C801 call convUMB ; Convert any address to a UMB number - 39074 - 39075 00005DCE 88C1 mov cl,al ; !* ; Remember the UMB number - 39076 00005DD0 E88300 call stowUMB ; Mark this UMB # as used; - 39077 00005DD3 7241 jc short plE2 ; If it was already marked, it'll error - 39078 - 39079 00005DD5 E84400 call incArgc ; Each UMB number is another arg for LH to skip - 39080 - 39081 00005DD8 AC lodsb - 39082 00005DD9 3C3B cmp al,';' ; Did "umb;" ? - 39083 00005DDB 74E9 je short pl10 ; Yep: go back and get another UMB. - 39084 - 39085 00005DDD E85200 call isWhite ; Did "umb " ? - 39086 00005DE0 7439 jz short plX ; Yep: return (it'll go back to whitespace) + 39028 00005DB2 E80C00 call parseL + 39029 00005DB5 73CF jnc short pv10 ; If no carry, go back and look for more + 39030 + 39031 00005DB7 4E dec si ; Else, back up and exit. + 39032 00005DB8 EB03 jmp short pvErr ; AX has already been set by parseL + 39033 pvE1: + 39034 00005DBA B80300 mov ax,3 ; PV_InvSwt + 39035 ; Unrecognized switch passed + 39036 pvErr: + 39037 00005DBD 4E dec si + 39038 00005DBE 4E dec si + 39039 00005DBF F9 stc + 39040 pvX: + 39041 ;pop es + 39042 ;pop ds ; * + 39043 ;pop di + 39044 00005DC0 C3 retn + 39045 + 39046 ;ParseVar endp + 39047 + 39048 ; ----------------------------------------------------------------------------- + 39049 ;*** parseL - parses ":nnnn[,nnnn][;nnnn[,nnnn]]*" for ParseVar + 39050 ; ----------------------------------------------------------------------------- + 39051 ; ENTRY: ES:SI points to colon + 39052 ; EXIT: ES:SI points to first character not parsed + 39053 ; ERROR: Carry set; rewind three characters and return (see ParseVar) + 39054 ; USES: ES:SI, flags, AX, CX, DX, variables in highvar.inc + 39055 ; ----------------------------------------------------------------------------- + 39056 ; If the string here is terminated with anything other than whitespace or a + 39057 ; switchchar (perhaps it's /S or another /L:... ), then we return with carry + 39058 ; set, indicating that they've screwed up the syntax. The 3-character rewind + 39059 ; makes sure the app /L: is reported as being the culprit. + 39060 ; ----------------------------------------------------------------------------- + 39061 + 39062 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39063 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39064 parseL: + 39065 00005DC1 AC lodsb + 39066 00005DC2 3C3A cmp al,':' ; Make sure they did /L: + 39067 00005DC4 754A jne short plE1 ; If they didn't, return with carry set. + 39068 + 39069 ; ------------------------------------------ + 39070 ; PL10--ES:SI = a UMB number, after /L: or ; + 39071 ; ------------------------------------------ + 39072 + 39073 pl10: + 39074 00005DC6 E8FD00 call GetXNum ; After this, 'tis ",size" or ";umb" or " mod" + 39075 00005DC9 724B jc short plE2 ; And error if it's a bad number. + 39076 00005DCB E8C801 call convUMB ; Convert any address to a UMB number + 39077 + 39078 00005DCE 88C1 mov cl,al ; !* ; Remember the UMB number + 39079 00005DD0 E88300 call stowUMB ; Mark this UMB # as used; + 39080 00005DD3 7241 jc short plE2 ; If it was already marked, it'll error + 39081 + 39082 00005DD5 E84400 call incArgc ; Each UMB number is another arg for LH to skip + 39083 + 39084 00005DD8 AC lodsb + 39085 00005DD9 3C3B cmp al,';' ; Did "umb;" ? + 39086 00005DDB 74E9 je short pl10 ; Yep: go back and get another UMB. 39087 - 39088 00005DE2 E84200 call isEOL ; Did "umb" ? - 39089 00005DE5 7433 jz short plSwX ; If so, backup and exit like everything's ok + 39088 00005DDD E85200 call isWhite ; Did "umb " ? + 39089 00005DE0 7439 jz short plX ; Yep: return (it'll go back to whitespace) 39090 - 39091 00005DE7 3C2F cmp al,'/' ; SWTCH ; Did "umb/" ? (as in, "/L:1,100;2/S") - 39092 00005DE9 742F je short plSwX ; If so, back up ES:SI one character and return + 39091 00005DE2 E84200 call isEOL ; Did "umb" ? + 39092 00005DE5 7433 jz short plSwX ; If so, backup and exit like everything's ok 39093 - 39094 00005DEB 3C2C cmp al,',' ; Did "umb," ? - 39095 00005DED 7521 jne short plE1 ; Just what the heck DID they do? Return error. + 39094 00005DE7 3C2F cmp al,'/' ; SWTCH ; Did "umb/" ? (as in, "/L:1,100;2/S") + 39095 00005DE9 742F je short plSwX ; If so, back up ES:SI one character and return 39096 - 39097 ; --- Read a size ------------------------------------------------------------- - 39098 - 39099 00005DEF E8D400 call GetXNum ; Stop on "size;" or "size " or anything else - 39100 00005DF2 721C jc short plE1 ; And error if it's a bad size. + 39097 00005DEB 3C2C cmp al,',' ; Did "umb," ? + 39098 00005DED 7521 jne short plE1 ; Just what the heck DID they do? Return error. + 39099 + 39100 ; --- Read a size ------------------------------------------------------------- 39101 - 39102 00005DF4 E83401 call toPara ; Convert from bytes to paragraphs - 39103 - 39104 00005DF7 E88600 call stowSiz ; CL still has the UMB number for this routine - 39105 - 39106 00005DFA E81F00 call incArgc ; Each UMB size is another arg for LH to skip - 39107 - 39108 00005DFD AC lodsb - 39109 00005DFE 3C3B cmp al,';' ; They did "umb,size;", so get another UMB. - 39110 00005E00 74C4 je short pl10 ; - 39111 - 39112 00005E02 E82D00 call isWhite ; Did it end with whitespace? - 39113 00005E05 7414 jz short plX ; If so, we're done here--go back. + 39102 00005DEF E8D400 call GetXNum ; Stop on "size;" or "size " or anything else + 39103 00005DF2 721C jc short plE1 ; And error if it's a bad size. + 39104 + 39105 00005DF4 E83401 call toPara ; Convert from bytes to paragraphs + 39106 + 39107 00005DF7 E88600 call stowSiz ; CL still has the UMB number for this routine + 39108 + 39109 00005DFA E81F00 call incArgc ; Each UMB size is another arg for LH to skip + 39110 + 39111 00005DFD AC lodsb + 39112 00005DFE 3C3B cmp al,';' ; They did "umb,size;", so get another UMB. + 39113 00005E00 74C4 je short pl10 ; 39114 - 39115 00005E07 E81D00 call isEOL ; Did they do "umb,size" and end??? (stupid) - 39116 00005E0A 740E jz short plSwX ; If so, backup and exit like everything's ok + 39115 00005E02 E82D00 call isWhite ; Did it end with whitespace? + 39116 00005E05 7414 jz short plX ; If so, we're done here--go back. 39117 - 39118 00005E0C 3C2F cmp al,'/' ; SWTCH ; Did they do "umb,size/" ? - 39119 00005E0E 740A je short plSwX ; If so, again, we're done here. - 39120 plE1: - 39121 00005E10 B80100 mov ax,1 ; PV_InvArg - 39122 ; If not, we don't know WHAT they did... - 39123 00005E13 4E dec si - 39124 00005E14 F9 stc - 39125 00005E15 C3 retn - 39126 plE2: - 39127 ; cf = 1 - 39128 00005E16 B80200 mov ax,2 ; PV_BadUMB - 39129 ; In this case, they've specified a UMB twice - 39130 ;stc - 39131 00005E19 C3 retn - 39132 plSwX: - 39133 00005E1A 4E dec si ; If we hit a '/' character, back up one char - 39134 ; so the whitespace checker will see it too. - 39135 plX: - 39136 ; cf = 0 - 39137 ;clc ; Then just return with carry clear, so - 39138 00005E1B C3 retn ; ParseVar will go about its business. - 39139 - 39140 ; ----------------------------------------------------------------------------- - 39141 ;*** incArgc - increments fm_argc, for use with LoadHigh command-line parsing - 39142 ; ----------------------------------------------------------------------------- - 39143 ; ENTRY: None - 39144 ; EXIT: None - 39145 ; ERROR: None - 39146 ; USES: fm_argc, flags - 39147 ; ----------------------------------------------------------------------------- - 39148 - 39149 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39150 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39151 incArgc: - 39152 ;push ax - 39153 - 39154 ;;getdata al,fm_argc ; Obtain previous value of fm_argc, - 39155 ; - 39156 ;push ds ; getdata (macro) - 39157 ; ; getdata al, fm_argc - 39158 ;mov ds,[RESSEG] - 39159 ;mov al,[fm_argc] ; Obtain previous value of fm_argc, - 39160 ;pop ds - 39161 ; - 39162 ;inc al ; Increment it, - 39163 ; - 39164 ;;putdata fm_argc,al ; And store it right back. - 39165 ; - 39166 ;push es ; putdata (macro) - 39167 ; ; putdata fm_argc, al - 39168 ;mov es,[RESSEG] - 39169 ;mov [es:fm_argc],al ; and store it right back. - 39170 ;pop es - 39171 - 39172 ; 16/06/2023 - 39173 00005E1C 1E push ds - 39174 00005E1D 8E1E[F59B] mov ds,[RESSEG] - 39175 00005E21 FE06[3705] inc byte [fm_argc] ; increment fm_argc - 39176 00005E25 1F pop ds - 39177 - 39178 ;pop ax - 39179 00005E26 C3 retn + 39118 00005E07 E81D00 call isEOL ; Did they do "umb,size" and end??? (stupid) + 39119 00005E0A 740E jz short plSwX ; If so, backup and exit like everything's ok + 39120 + 39121 00005E0C 3C2F cmp al,'/' ; SWTCH ; Did they do "umb,size/" ? + 39122 00005E0E 740A je short plSwX ; If so, again, we're done here. + 39123 plE1: + 39124 00005E10 B80100 mov ax,1 ; PV_InvArg + 39125 ; If not, we don't know WHAT they did... + 39126 00005E13 4E dec si + 39127 00005E14 F9 stc + 39128 00005E15 C3 retn + 39129 plE2: + 39130 ; cf = 1 + 39131 00005E16 B80200 mov ax,2 ; PV_BadUMB + 39132 ; In this case, they've specified a UMB twice + 39133 ;stc + 39134 00005E19 C3 retn + 39135 plSwX: + 39136 00005E1A 4E dec si ; If we hit a '/' character, back up one char + 39137 ; so the whitespace checker will see it too. + 39138 plX: + 39139 ; cf = 0 + 39140 ;clc ; Then just return with carry clear, so + 39141 00005E1B C3 retn ; ParseVar will go about its business. + 39142 + 39143 ; ----------------------------------------------------------------------------- + 39144 ;*** incArgc - increments fm_argc, for use with LoadHigh command-line parsing + 39145 ; ----------------------------------------------------------------------------- + 39146 ; ENTRY: None + 39147 ; EXIT: None + 39148 ; ERROR: None + 39149 ; USES: fm_argc, flags + 39150 ; ----------------------------------------------------------------------------- + 39151 + 39152 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39153 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39154 incArgc: + 39155 ;push ax + 39156 + 39157 ;;getdata al,fm_argc ; Obtain previous value of fm_argc, + 39158 ; + 39159 ;push ds ; getdata (macro) + 39160 ; ; getdata al, fm_argc + 39161 ;mov ds,[RESSEG] + 39162 ;mov al,[fm_argc] ; Obtain previous value of fm_argc, + 39163 ;pop ds + 39164 ; + 39165 ;inc al ; Increment it, + 39166 ; + 39167 ;;putdata fm_argc,al ; And store it right back. + 39168 ; + 39169 ;push es ; putdata (macro) + 39170 ; ; putdata fm_argc, al + 39171 ;mov es,[RESSEG] + 39172 ;mov [es:fm_argc],al ; and store it right back. + 39173 ;pop es + 39174 + 39175 ; 16/06/2023 + 39176 00005E1C 1E push ds + 39177 00005E1D 8E1E[F59B] mov ds,[RESSEG] + 39178 00005E21 FE06[3705] inc byte [fm_argc] ; increment fm_argc + 39179 00005E25 1F pop ds 39180 - 39181 ; ----------------------------------------------------------------------------- - 39182 ;*** isEOL - returns with ZF set iff AL contains CR or LF, or 0 - 39183 ; ----------------------------------------------------------------------------- - 39184 ; ENTRY: AL contains character to test - 39185 ; EXIT: ZF set if AL contains CR or LF, or 0 - 39186 ; ERROR: None - 39187 ; USES: ZF - 39188 ; ----------------------------------------------------------------------------- - 39189 - 39190 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39191 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39192 isEOL: - 39193 ;cmp al,0 ; Null-terminator - 39194 00005E27 20C0 and al,al - 39195 00005E29 7406 jz short ieX - 39196 00005E2B 3C0D cmp al,0Dh ; CR ; Carriage Return - 39197 00005E2D 7402 je short ieX - 39198 00005E2F 3C0A cmp al,0Ah ; LF ; LineFeed - 39199 ieX: - 39200 00005E31 C3 retn - 39201 - 39202 - 39203 ; ----------------------------------------------------------------------------- - 39204 ;*** isWhite - returns with ZF set iff AL contains whitespace (or "=") - 39205 ; ----------------------------------------------------------------------------- - 39206 ; ENTRY: AL contains character to test - 39207 ; EXIT: ZF set if AL contains space, tab, or equals - 39208 ; ERROR: None - 39209 ; USES: ZF - 39210 ; ----------------------------------------------------------------------------- - 39211 - 39212 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39213 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39214 isWhite: - 39215 00005E32 3C20 cmp al,' ' ; Space - 39216 00005E34 7406 je short iwX - 39217 00005E36 3C3D cmp al,'=' ; Equals (treat as whitespace) - 39218 00005E38 7402 je short iwX - 39219 00005E3A 3C09 cmp al,09h ; TAB ; Tab - 39220 iwX: - 39221 00005E3C C3 retn - 39222 - 39223 ; ----------------------------------------------------------------------------- - 39224 ;*** unMarkUMB - marks a given UMB as unused, even if previously marked used - 39225 ; ----------------------------------------------------------------------------- - 39226 ; ENTRY: AL contains UMB number - 39227 ; EXIT: None - 39228 ; ERROR: None - 39229 ; USES: Flags, variables in highvar.inc - 39230 ; ----------------------------------------------------------------------------- - 39231 - 39232 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39233 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39234 unMarkUMB: - 39235 ;;pushreg - 39236 ;push ax ; *** - 39237 - 39238 ;push bx ; ** - 39239 - 39240 ;push di - 39241 ;push es - 39242 00005E3D 1E push ds ; * - 39243 - 39244 ;;dataseg es - 39245 ;mov es,[RESSEG] + 39181 ;pop ax + 39182 00005E26 C3 retn + 39183 + 39184 ; ----------------------------------------------------------------------------- + 39185 ;*** isEOL - returns with ZF set iff AL contains CR or LF, or 0 + 39186 ; ----------------------------------------------------------------------------- + 39187 ; ENTRY: AL contains character to test + 39188 ; EXIT: ZF set if AL contains CR or LF, or 0 + 39189 ; ERROR: None + 39190 ; USES: ZF + 39191 ; ----------------------------------------------------------------------------- + 39192 + 39193 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39194 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39195 isEOL: + 39196 ;cmp al,0 ; Null-terminator + 39197 00005E27 20C0 and al,al + 39198 00005E29 7406 jz short ieX + 39199 00005E2B 3C0D cmp al,0Dh ; CR ; Carriage Return + 39200 00005E2D 7402 je short ieX + 39201 00005E2F 3C0A cmp al,0Ah ; LF ; LineFeed + 39202 ieX: + 39203 00005E31 C3 retn + 39204 + 39205 + 39206 ; ----------------------------------------------------------------------------- + 39207 ;*** isWhite - returns with ZF set iff AL contains whitespace (or "=") + 39208 ; ----------------------------------------------------------------------------- + 39209 ; ENTRY: AL contains character to test + 39210 ; EXIT: ZF set if AL contains space, tab, or equals + 39211 ; ERROR: None + 39212 ; USES: ZF + 39213 ; ----------------------------------------------------------------------------- + 39214 + 39215 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39216 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39217 isWhite: + 39218 00005E32 3C20 cmp al,' ' ; Space + 39219 00005E34 7406 je short iwX + 39220 00005E36 3C3D cmp al,'=' ; Equals (treat as whitespace) + 39221 00005E38 7402 je short iwX + 39222 00005E3A 3C09 cmp al,09h ; TAB ; Tab + 39223 iwX: + 39224 00005E3C C3 retn + 39225 + 39226 ; ----------------------------------------------------------------------------- + 39227 ;*** unMarkUMB - marks a given UMB as unused, even if previously marked used + 39228 ; ----------------------------------------------------------------------------- + 39229 ; ENTRY: AL contains UMB number + 39230 ; EXIT: None + 39231 ; ERROR: None + 39232 ; USES: Flags, variables in highvar.inc + 39233 ; ----------------------------------------------------------------------------- + 39234 + 39235 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39236 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39237 unMarkUMB: + 39238 ;;pushreg + 39239 ;push ax ; *** + 39240 + 39241 ;push bx ; ** + 39242 + 39243 ;push di + 39244 ;push es + 39245 00005E3D 1E push ds ; * 39246 - 39247 00005E3E 8E1E[F59B] mov ds,[RESSEG] ; * - 39248 - 39249 ;xor ah,ah ; 0 - 39250 ;mov bx,ax - 39251 ;mov byte [es:bx+UmbUsed],0 - 39252 ;mov [bx+UmbUsed],ah ; marks the UMB as unused - 39253 00005E42 88C3 mov bl,al - 39254 00005E44 30FF xor bh,bh ; 0 - 39255 00005E46 88BF[5E04] mov [bx+UmbUsed],bh ; 0 ; ** - 39256 - 39257 ;cmp [es:UmbLoad],al - 39258 ;jnz short umu10 - 39259 00005E4A 3806[3405] cmp [UmbLoad],al - 39260 00005E4E 7504 jne short umu10 - 39261 - 39262 ;mov byte [es:UmbLoad],0 - 39263 ;mov [UmbLoad],ah ; If unmarked the load UMB, load into convent. - 39264 00005E50 883E[3405] mov [UmbLoad],bh ; 0 ; ** - 39265 umu10: - 39266 00005E54 1F pop ds ; * - 39267 ;;popreg - 39268 ;pop es - 39269 ;pop di - 39270 - 39271 ;pop bx ; ** - 39272 - 39273 ;pop ax ; *** - 39274 - 39275 ;;normseg es - 39276 - 39277 00005E55 C3 retn - 39278 - 39279 ; ----------------------------------------------------------------------------- - 39280 ;*** stowUMB - marks a given UMB as used, if it hasn't been so marked before - 39281 ; -- accepts a UMB # in AL, and makes sure it hasn't yet been - 39282 ; listed in the /L:... chain. If it's the first one specified, it sets UmbLoad - 39283 ; to that UMB #... and in any case, it marks the UMB as specified. - 39284 ; ----------------------------------------------------------------------------- - 39285 ; ENTRY: AL contains UMB number, as specified by the user - 39286 ; EXIT: None - 39287 ; ERROR: Carry set if UMB # is less than 0 or >= MAXUMB (see highvar.inc) - 39288 ; USES: AX, Flags, variables in highvar.inc - 39289 ; ----------------------------------------------------------------------------- - 39290 - 39291 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39292 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39293 stowUMB: - 39294 00005E56 3C10 cmp al,16 ; MAXUMB - 39295 00005E58 7202 jb short su10 - 39296 00005E5A F9 stc - 39297 00005E5B C3 retn ; Ooops-- UMB>=MAXUMB - 39298 su10: - 39299 ;pushreg - 39300 ;dataseg es ; Point ES into appropriate data segment - 39301 ;dataseg ds ; Point DS into appropriate data segment - 39302 - 39303 ;push bx ; ** - 39304 - 39305 ;push di - 39306 ;push si - 39307 - 39308 00005E5C 1E push ds ; * - 39309 - 39310 ;push es - 39311 ;mov es,[RESSEG] - 39312 00005E5D 8E1E[F59B] mov ds,[RESSEG] - 39313 - 39314 00005E61 803E[3405]FF cmp byte [UmbLoad],0FFh ; UNSPECIFIED - 39315 ; If this, we haven't been here before - 39316 00005E66 7503 jne short su20 - 39317 00005E68 A2[3405] mov [UmbLoad],al ; So remember this UMB as the load UMB slot. - 39318 su20: - 39319 00005E6B 08C0 or al,al ; If they gave UMB 0, there's really nothing - 39320 00005E6D 740F jz short su30 ; that we should do here. - 39321 - 39322 ;mov bl,al - 39323 ;xor bh,bh - 39324 ;mov ax,1 ; Now, AX = 1, and BX = UMB Number - 39325 00005E6F 30E4 xor ah,ah - 39326 00005E71 89C3 mov bx,ax - 39327 00005E73 B001 mov al,1 - 39328 - 39329 ;xchg [es:bx+UmbUsed],al - 39330 00005E75 8687[5E04] xchg [bx+UmbUsed],al + 39247 ;;dataseg es + 39248 ;mov es,[RESSEG] + 39249 + 39250 00005E3E 8E1E[F59B] mov ds,[RESSEG] ; * + 39251 + 39252 ;xor ah,ah ; 0 + 39253 ;mov bx,ax + 39254 ;mov byte [es:bx+UmbUsed],0 + 39255 ;mov [bx+UmbUsed],ah ; marks the UMB as unused + 39256 00005E42 88C3 mov bl,al + 39257 00005E44 30FF xor bh,bh ; 0 + 39258 00005E46 88BF[5E04] mov [bx+UmbUsed],bh ; 0 ; ** + 39259 + 39260 ;cmp [es:UmbLoad],al + 39261 ;jnz short umu10 + 39262 00005E4A 3806[3405] cmp [UmbLoad],al + 39263 00005E4E 7504 jne short umu10 + 39264 + 39265 ;mov byte [es:UmbLoad],0 + 39266 ;mov [UmbLoad],ah ; If unmarked the load UMB, load into convent. + 39267 00005E50 883E[3405] mov [UmbLoad],bh ; 0 ; ** + 39268 umu10: + 39269 00005E54 1F pop ds ; * + 39270 ;;popreg + 39271 ;pop es + 39272 ;pop di + 39273 + 39274 ;pop bx ; ** + 39275 + 39276 ;pop ax ; *** + 39277 + 39278 ;;normseg es + 39279 + 39280 00005E55 C3 retn + 39281 + 39282 ; ----------------------------------------------------------------------------- + 39283 ;*** stowUMB - marks a given UMB as used, if it hasn't been so marked before + 39284 ; -- accepts a UMB # in AL, and makes sure it hasn't yet been + 39285 ; listed in the /L:... chain. If it's the first one specified, it sets UmbLoad + 39286 ; to that UMB #... and in any case, it marks the UMB as specified. + 39287 ; ----------------------------------------------------------------------------- + 39288 ; ENTRY: AL contains UMB number, as specified by the user + 39289 ; EXIT: None + 39290 ; ERROR: Carry set if UMB # is less than 0 or >= MAXUMB (see highvar.inc) + 39291 ; USES: AX, Flags, variables in highvar.inc + 39292 ; ----------------------------------------------------------------------------- + 39293 + 39294 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39295 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39296 stowUMB: + 39297 00005E56 3C10 cmp al,16 ; MAXUMB + 39298 00005E58 7202 jb short su10 + 39299 00005E5A F9 stc + 39300 00005E5B C3 retn ; Ooops-- UMB>=MAXUMB + 39301 su10: + 39302 ;pushreg + 39303 ;dataseg es ; Point ES into appropriate data segment + 39304 ;dataseg ds ; Point DS into appropriate data segment + 39305 + 39306 ;push bx ; ** + 39307 + 39308 ;push di + 39309 ;push si + 39310 + 39311 00005E5C 1E push ds ; * + 39312 + 39313 ;push es + 39314 ;mov es,[RESSEG] + 39315 00005E5D 8E1E[F59B] mov ds,[RESSEG] + 39316 + 39317 00005E61 803E[3405]FF cmp byte [UmbLoad],0FFh ; UNSPECIFIED + 39318 ; If this, we haven't been here before + 39319 00005E66 7503 jne short su20 + 39320 00005E68 A2[3405] mov [UmbLoad],al ; So remember this UMB as the load UMB slot. + 39321 su20: + 39322 00005E6B 08C0 or al,al ; If they gave UMB 0, there's really nothing + 39323 00005E6D 740F jz short su30 ; that we should do here. + 39324 + 39325 ;mov bl,al + 39326 ;xor bh,bh + 39327 ;mov ax,1 ; Now, AX = 1, and BX = UMB Number + 39328 00005E6F 30E4 xor ah,ah + 39329 00005E71 89C3 mov bx,ax + 39330 00005E73 B001 mov al,1 39331 - 39332 00005E79 08C0 or al,al ; If it was already 1, then al==1... and that - 39333 00005E7B 7401 jz short su30 ; means an error. + 39332 ;xchg [es:bx+UmbUsed],al + 39333 00005E75 8687[5E04] xchg [bx+UmbUsed],al 39334 - 39335 00005E7D F9 stc ; OOOPS! This one's been used before. :( - 39336 su30: - 39337 ;popreg - 39338 ;normseg ds - 39339 ;normseg es - 39340 ;retn - 39341 - 39342 ;pop es - 39343 - 39344 00005E7E 1F pop ds ; * - 39345 - 39346 ;pop si - 39347 ;pop di + 39335 00005E79 08C0 or al,al ; If it was already 1, then al==1... and that + 39336 00005E7B 7401 jz short su30 ; means an error. + 39337 + 39338 00005E7D F9 stc ; OOOPS! This one's been used before. :( + 39339 su30: + 39340 ;popreg + 39341 ;normseg ds + 39342 ;normseg es + 39343 ;retn + 39344 + 39345 ;pop es + 39346 + 39347 00005E7E 1F pop ds ; * 39348 - 39349 ;pop bx ; ** - 39350 - 39351 00005E7F C3 retn - 39352 - 39353 ; ----------------------------------------------------------------------------- - 39354 ;*** stowSiz - marks a given UMB as having a given minimum size - 39355 ; ----------------------------------------------------------------------------- - 39356 ; ENTRY: CL contains UMB number, AX contains size - 39357 ; EXIT: None - 39358 ; ERROR: None - 39359 ; USES: AX, DX, Flags, variables in highvar.inc - 39360 ; ----------------------------------------------------------------------------- - 39361 - 39362 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39363 stowSiz: - 39364 ;pushreg - 39365 ;dataseg es ; Point ES into appropriate data seg - 39366 - 39367 ;push bx ; ** - 39368 - 39369 ;push di - 39370 ;push es - 39371 ;mov es,[RESSEG] - 39372 00005E80 1E push ds ; * - 39373 00005E81 8E1E[F59B] mov ds,[RESSEG] - 39374 - 39375 00005E85 88CB mov bl,cl ; Now bl==UMB number, AX==size - 39376 00005E87 B700 mov bh,0 ; bx==UMB number, AX==size - 39377 00005E89 D0E3 shl bl,1 ; bx==offset into array, AX=size - 39378 ;mov [es:bx+UmbSize],ax - 39379 00005E8B 8987[6E04] mov [bx+UmbSize],ax ; Store the size - 39380 - 39381 00005E8F 1F pop ds ; * - 39382 - 39383 ;popreg - 39384 ;normseg es ; Return ES to where it was + 39349 ;pop si + 39350 ;pop di + 39351 + 39352 ;pop bx ; ** + 39353 + 39354 00005E7F C3 retn + 39355 + 39356 ; ----------------------------------------------------------------------------- + 39357 ;*** stowSiz - marks a given UMB as having a given minimum size + 39358 ; ----------------------------------------------------------------------------- + 39359 ; ENTRY: CL contains UMB number, AX contains size + 39360 ; EXIT: None + 39361 ; ERROR: None + 39362 ; USES: AX, DX, Flags, variables in highvar.inc + 39363 ; ----------------------------------------------------------------------------- + 39364 + 39365 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39366 stowSiz: + 39367 ;pushreg + 39368 ;dataseg es ; Point ES into appropriate data seg + 39369 + 39370 ;push bx ; ** + 39371 + 39372 ;push di + 39373 ;push es + 39374 ;mov es,[RESSEG] + 39375 00005E80 1E push ds ; * + 39376 00005E81 8E1E[F59B] mov ds,[RESSEG] + 39377 + 39378 00005E85 88CB mov bl,cl ; Now bl==UMB number, AX==size + 39379 00005E87 B700 mov bh,0 ; bx==UMB number, AX==size + 39380 00005E89 D0E3 shl bl,1 ; bx==offset into array, AX=size + 39381 ;mov [es:bx+UmbSize],ax + 39382 00005E8B 8987[6E04] mov [bx+UmbSize],ax ; Store the size + 39383 + 39384 00005E8F 1F pop ds ; * 39385 - 39386 ;pop es - 39387 ;pop di - 39388 - 39389 ;pop bx ; ** - 39390 - 39391 00005E90 C3 retn - 39392 - 39393 ; ----------------------------------------------------------------------------- - 39394 ;*** toDigit - converts a character-digit to its binary counterpart - 39395 ; -- verifies that CL contains a valid character-digit; if so, it - 39396 ; changes CL to its counterpart binary digit ((CL-'0') or (CL-'A'+10)). A-F - 39397 ; are considered valid iff gnradix is 16. - 39398 ; ----------------------------------------------------------------------------- - 39399 ; ENTRY: CL contains a digit ('0' to '9' or, if gnradix==16, 'A' to 'F') - 39400 ; EXIT: CL contains digit in binary (0 to 9 or, if gnradix==16, 0 to 15) - 39401 ; ERROR: Carry set indicates invalid digit; carry clear indicates good digit - 39402 ; USES: CL, Flags - 39403 ; ----------------------------------------------------------------------------- - 39404 ; If the string is preceeded with "0x", the value is read as hexadecimal; else, - 39405 ; as decimal. After a read, you may check the radix by examining gnradix--it - 39406 ; will be 10 or 16. - 39407 ; ----------------------------------------------------------------------------- - 39408 - 39409 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39410 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6358h - 39411 gnradix: - 39412 00005E91 0000 dw 0 ; Must be a word--16x16 multiplication - 39413 - 39414 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39415 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:635Ah + 39386 ;popreg + 39387 ;normseg es ; Return ES to where it was + 39388 + 39389 ;pop es + 39390 ;pop di + 39391 + 39392 ;pop bx ; ** + 39393 + 39394 00005E90 C3 retn + 39395 + 39396 ; ----------------------------------------------------------------------------- + 39397 ;*** toDigit - converts a character-digit to its binary counterpart + 39398 ; -- verifies that CL contains a valid character-digit; if so, it + 39399 ; changes CL to its counterpart binary digit ((CL-'0') or (CL-'A'+10)). A-F + 39400 ; are considered valid iff gnradix is 16. + 39401 ; ----------------------------------------------------------------------------- + 39402 ; ENTRY: CL contains a digit ('0' to '9' or, if gnradix==16, 'A' to 'F') + 39403 ; EXIT: CL contains digit in binary (0 to 9 or, if gnradix==16, 0 to 15) + 39404 ; ERROR: Carry set indicates invalid digit; carry clear indicates good digit + 39405 ; USES: CL, Flags + 39406 ; ----------------------------------------------------------------------------- + 39407 ; If the string is preceeded with "0x", the value is read as hexadecimal; else, + 39408 ; as decimal. After a read, you may check the radix by examining gnradix--it + 39409 ; will be 10 or 16. + 39410 ; ----------------------------------------------------------------------------- + 39411 + 39412 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39413 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6358h + 39414 gnradix: + 39415 00005E91 0000 dw 0 ; Must be a word--16x16 multiplication 39416 - 39417 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39418 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:61D7h - 39419 toDigit: - 39420 ;cmp word [gnradix],16 - 39421 00005E93 803E[915E]10 cmp byte [gnradix],16 - 39422 00005E98 751C jne short td20 ; Don't check hex digits if radix isn't 16 - 39423 - 39424 00005E9A 80F961 cmp cl,'a' - 39425 00005E9D 7209 jb short td10 - 39426 00005E9F 80F966 cmp cl,'f' - 39427 00005EA2 7720 ja short tdE ; Nothing valid above 'z' at all... - 39428 00005EA4 80E957 sub cl,'a'-10 ; 57h ; Make 'a'==10 and return. - 39429 ; clc ; <- CLC is implicit from last SUB - 39430 00005EA7 C3 retn - 39431 td10: - 39432 00005EA8 80F941 cmp cl,'A' - 39433 00005EAB 7209 jb short td20 ; Below 'A'? Not a letter... - 39434 00005EAD 80F946 cmp cl,'F' - 39435 00005EB0 7712 ja short tdE ; Above 'F'? Not a digit. - 39436 00005EB2 80E937 sub cl,'A'-10 ; 37h ; Make 'A'==10 and return. - 39437 ; clc ; <- CLC is implicit from last SUB - 39438 tdErr: - 39439 00005EB5 C3 retn - 39440 td20: - 39441 00005EB6 80F930 cmp cl,'0' ; If less than zero, - 39442 ;jb short tdE ; Done. - 39443 00005EB9 72FA jb short tdErr ; cf = 1 - 39444 00005EBB 80F939 cmp cl,'9' ; Or, if greater than nine, - 39445 00005EBE 7704 ja short tdE ; Done. - 39446 00005EC0 80E930 sub cl,'0' ; 30h ; Okay--make '0'==0 and return. - 39447 ; clc ; <- CLC is implicit from last SUB - 39448 00005EC3 C3 retn - 39449 tdE: - 39450 00005EC4 F9 stc - 39451 00005EC5 C3 retn - 39452 - 39453 ; ----------------------------------------------------------------------------- - 39454 ;*** GetXNum - reads a 32-bit ASCII number at ES:SI and returns it in DX:AX - 39455 ; ----------------------------------------------------------------------------- - 39456 ; ENTRY: ES:SI points to an ascii string to scan - 39457 ; EXIT: ES:SI moved to first invalid digit, DX:AX contains value read - 39458 ; ERROR: Carry set if # is too big, or has no digits (EOL possibly) - 39459 ; USES: ES:SI, DX, AX, Flags, gnradix - 39460 ; ----------------------------------------------------------------------------- - 39461 ; If the string is preceeded with "0x", the value is read as hexadecimal; else, - 39462 ; as decimal. After a read, you may check the radix by examining gnradix--it - 39463 ; will be 10 or 16. - 39464 ; ----------------------------------------------------------------------------- - 39465 - 39466 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 39467 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39468 GetXNum: - 39469 ;pushreg - 39470 - 39471 ;push bx ; ** - 39472 00005EC6 51 push cx ; * + 39417 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39418 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:635Ah + 39419 + 39420 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39421 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:61D7h + 39422 toDigit: + 39423 ;cmp word [gnradix],16 + 39424 00005E93 803E[915E]10 cmp byte [gnradix],16 + 39425 00005E98 751C jne short td20 ; Don't check hex digits if radix isn't 16 + 39426 + 39427 00005E9A 80F961 cmp cl,'a' + 39428 00005E9D 7209 jb short td10 + 39429 00005E9F 80F966 cmp cl,'f' + 39430 00005EA2 7720 ja short tdE ; Nothing valid above 'z' at all... + 39431 00005EA4 80E957 sub cl,'a'-10 ; 57h ; Make 'a'==10 and return. + 39432 ; clc ; <- CLC is implicit from last SUB + 39433 00005EA7 C3 retn + 39434 td10: + 39435 00005EA8 80F941 cmp cl,'A' + 39436 00005EAB 7209 jb short td20 ; Below 'A'? Not a letter... + 39437 00005EAD 80F946 cmp cl,'F' + 39438 00005EB0 7712 ja short tdE ; Above 'F'? Not a digit. + 39439 00005EB2 80E937 sub cl,'A'-10 ; 37h ; Make 'A'==10 and return. + 39440 ; clc ; <- CLC is implicit from last SUB + 39441 tdErr: + 39442 00005EB5 C3 retn + 39443 td20: + 39444 00005EB6 80F930 cmp cl,'0' ; If less than zero, + 39445 ;jb short tdE ; Done. + 39446 00005EB9 72FA jb short tdErr ; cf = 1 + 39447 00005EBB 80F939 cmp cl,'9' ; Or, if greater than nine, + 39448 00005EBE 7704 ja short tdE ; Done. + 39449 00005EC0 80E930 sub cl,'0' ; 30h ; Okay--make '0'==0 and return. + 39450 ; clc ; <- CLC is implicit from last SUB + 39451 00005EC3 C3 retn + 39452 tdE: + 39453 00005EC4 F9 stc + 39454 00005EC5 C3 retn + 39455 + 39456 ; ----------------------------------------------------------------------------- + 39457 ;*** GetXNum - reads a 32-bit ASCII number at ES:SI and returns it in DX:AX + 39458 ; ----------------------------------------------------------------------------- + 39459 ; ENTRY: ES:SI points to an ascii string to scan + 39460 ; EXIT: ES:SI moved to first invalid digit, DX:AX contains value read + 39461 ; ERROR: Carry set if # is too big, or has no digits (EOL possibly) + 39462 ; USES: ES:SI, DX, AX, Flags, gnradix + 39463 ; ----------------------------------------------------------------------------- + 39464 ; If the string is preceeded with "0x", the value is read as hexadecimal; else, + 39465 ; as decimal. After a read, you may check the radix by examining gnradix--it + 39466 ; will be 10 or 16. + 39467 ; ----------------------------------------------------------------------------- + 39468 + 39469 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 39470 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39471 GetXNum: + 39472 ;pushreg 39473 - 39474 ;push ds - 39475 - 39476 00005EC7 FC cld - 39477 00005EC8 31C0 xor ax,ax - 39478 00005ECA 31DB xor bx,bx - 39479 00005ECC 31C9 xor cx,cx - 39480 00005ECE 31D2 xor dx,dx ; Start with 0 (makes sense) - 39481 - 39482 ;mov word [gnradix],10 ; And default to a radix of 10 (dec) - 39483 00005ED0 C606[915E]0A mov byte [gnradix],10 + 39474 ;push bx ; ** + 39475 00005EC6 51 push cx ; * + 39476 + 39477 ;push ds + 39478 + 39479 00005EC7 FC cld + 39480 00005EC8 31C0 xor ax,ax + 39481 00005ECA 31DB xor bx,bx + 39482 00005ECC 31C9 xor cx,cx + 39483 00005ECE 31D2 xor dx,dx ; Start with 0 (makes sense) 39484 - 39485 00005ED5 268A0C mov cl,[es:si] ; Now AX=0, BX=0, CH=0/CL=char, DX=0 - 39486 00005ED8 E8B8FF call toDigit - 39487 00005EDB 722D jc short gxnE ; If it's not a digit, leave now. - 39488 - 39489 00005EDD 08C9 or cl,cl - 39490 00005EDF 7515 jnz short gxn20 ; Doesn't have '0x' - 39491 00005EE1 268A4C01 mov cl,[es:si+1] - 39492 00005EE5 80F978 cmp cl,'x' ; Either 'x'... - 39493 00005EE8 7405 je short gxn10 - 39494 00005EEA 80F958 cmp cl,'X' ; ...or 'X' means it's hexadecimal - 39495 00005EED 7507 jne short gxn20 - 39496 - 39497 gxn10: - 39498 ;mov word [gnradix],16 - 39499 00005EEF C606[915E]10 mov byte [gnradix],16 - 39500 00005EF4 46 inc si ; Since we read "0x", march over it. - 39501 00005EF5 46 inc si - 39502 - 39503 ; ------------------------------------------------------ - 39504 ; GXN20--ES:SI = a digit in a number; if not, we're done - 39505 ; DX:AX = current total - 39506 ; BX = 0 - 39507 ; CH = 0 - 39508 ; ------------------------------------------------------ - 39509 - 39510 gxn20: - 39511 00005EF6 268A0C mov cl,[es:si] ; Now DX:AX=current total, CH=0/CL=char - 39512 00005EF9 46 inc si - 39513 - 39514 00005EFA E896FF call toDigit ; Accepts only valid digits, A-F -> 10-16 - 39515 00005EFD 720D jc short gxnQ ; <- Ah... wasn't a digit. Stop. + 39485 ;mov word [gnradix],10 ; And default to a radix of 10 (dec) + 39486 00005ED0 C606[915E]0A mov byte [gnradix],10 + 39487 + 39488 00005ED5 268A0C mov cl,[es:si] ; Now AX=0, BX=0, CH=0/CL=char, DX=0 + 39489 00005ED8 E8B8FF call toDigit + 39490 00005EDB 722D jc short gxnE ; If it's not a digit, leave now. + 39491 + 39492 00005EDD 08C9 or cl,cl + 39493 00005EDF 7515 jnz short gxn20 ; Doesn't have '0x' + 39494 00005EE1 268A4C01 mov cl,[es:si+1] + 39495 00005EE5 80F978 cmp cl,'x' ; Either 'x'... + 39496 00005EE8 7405 je short gxn10 + 39497 00005EEA 80F958 cmp cl,'X' ; ...or 'X' means it's hexadecimal + 39498 00005EED 7507 jne short gxn20 + 39499 + 39500 gxn10: + 39501 ;mov word [gnradix],16 + 39502 00005EEF C606[915E]10 mov byte [gnradix],16 + 39503 00005EF4 46 inc si ; Since we read "0x", march over it. + 39504 00005EF5 46 inc si + 39505 + 39506 ; ------------------------------------------------------ + 39507 ; GXN20--ES:SI = a digit in a number; if not, we're done + 39508 ; DX:AX = current total + 39509 ; BX = 0 + 39510 ; CH = 0 + 39511 ; ------------------------------------------------------ + 39512 + 39513 gxn20: + 39514 00005EF6 268A0C mov cl,[es:si] ; Now DX:AX=current total, CH=0/CL=char + 39515 00005EF9 46 inc si 39516 - 39517 00005EFF E80E00 call mul32 ; Multiply DX:AX by gnradix - 39518 00005F02 7206 jc short gxnX ; (if it's too big, error out) + 39517 00005EFA E896FF call toDigit ; Accepts only valid digits, A-F -> 10-16 + 39518 00005EFD 720D jc short gxnQ ; <- Ah... wasn't a digit. Stop. 39519 - 39520 00005F04 01C8 add ax,cx ; Add the digit - 39521 00005F06 11DA adc dx,bx ; (BX is 0!)--Adds 1 if last add wrapped - 39522 ;jc short gxnX ; If _that_ wrapped, it's too big. - 39523 ;jmp short gxn20 - 39524 00005F08 73EC jnc short gxn20 - 39525 gxnE: - 39526 ; cf = 1 - 39527 ;stc ; In this case, we need to set the carry - 39528 ;jmp short gxnX ; and leave--there were no digits given. - 39529 ;gxnQ: - 39530 ;dec si ; Don't read in the offensive character. - 39531 ;clc ; And clear carry, so they know it's okay. - 39532 gxnX: - 39533 ;popreg - 39534 - 39535 ;pop ds - 39536 - 39537 00005F0A 59 pop cx ; * - 39538 ;pop bx ; ** + 39520 00005EFF E80E00 call mul32 ; Multiply DX:AX by gnradix + 39521 00005F02 7206 jc short gxnX ; (if it's too big, error out) + 39522 + 39523 00005F04 01C8 add ax,cx ; Add the digit + 39524 00005F06 11DA adc dx,bx ; (BX is 0!)--Adds 1 if last add wrapped + 39525 ;jc short gxnX ; If _that_ wrapped, it's too big. + 39526 ;jmp short gxn20 + 39527 00005F08 73EC jnc short gxn20 + 39528 gxnE: + 39529 ; cf = 1 + 39530 ;stc ; In this case, we need to set the carry + 39531 ;jmp short gxnX ; and leave--there were no digits given. + 39532 ;gxnQ: + 39533 ;dec si ; Don't read in the offensive character. + 39534 ;clc ; And clear carry, so they know it's okay. + 39535 gxnX: + 39536 ;popreg + 39537 + 39538 ;pop ds 39539 - 39540 00005F0B C3 retn - 39541 gxnQ: - 39542 00005F0C 4E dec si - 39543 00005F0D F8 clc - 39544 00005F0E EBFA jmp short gxnX - 39545 - 39546 ; ----------------------------------------------------------------------------- - 39547 ;*** mul32 - multiplies the number in DX:AX by gnradix - 39548 ; ----------------------------------------------------------------------------- - 39549 ; ENTRY: DX:AX = the number to be multiplied, BX = 0, gnradix = multiplier - 39550 ; EXIT: DX:AX has been multiplied by gnradix if carry clear; BX still 0 - 39551 ; ERROR: Carry set if number was too large - 39552 ; USES: Flags, AX, DX - 39553 ; ----------------------------------------------------------------------------- - 39554 - 39555 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39556 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39557 mul32: - 39558 00005F10 50 push ax ; DX=old:hi, AX=old:lo, TOS=old:lo, BX=0 - 39559 00005F11 89D0 mov ax,dx ; DX=old:hi, AX=old:hi, TOS=old:lo, BX=0 - 39560 00005F13 F726[915E] mul word [gnradix] ; DX=?, AX=new:hi, TOS=old:lo, BX=0 - 39561 00005F17 7210 jc short m32E ; Too big? - 39562 - 39563 00005F19 89C2 mov dx,ax ; DX=new:hi, AX=new:hi, TOS=old:lo, BX=0 - 39564 00005F1B 58 pop ax ; DX=new:hi, AX=old:lo, TOS=orig, BX=0 + 39540 00005F0A 59 pop cx ; * + 39541 ;pop bx ; ** + 39542 + 39543 00005F0B C3 retn + 39544 gxnQ: + 39545 00005F0C 4E dec si + 39546 00005F0D F8 clc + 39547 00005F0E EBFA jmp short gxnX + 39548 + 39549 ; ----------------------------------------------------------------------------- + 39550 ;*** mul32 - multiplies the number in DX:AX by gnradix + 39551 ; ----------------------------------------------------------------------------- + 39552 ; ENTRY: DX:AX = the number to be multiplied, BX = 0, gnradix = multiplier + 39553 ; EXIT: DX:AX has been multiplied by gnradix if carry clear; BX still 0 + 39554 ; ERROR: Carry set if number was too large + 39555 ; USES: Flags, AX, DX + 39556 ; ----------------------------------------------------------------------------- + 39557 + 39558 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39559 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39560 mul32: + 39561 00005F10 50 push ax ; DX=old:hi, AX=old:lo, TOS=old:lo, BX=0 + 39562 00005F11 89D0 mov ax,dx ; DX=old:hi, AX=old:hi, TOS=old:lo, BX=0 + 39563 00005F13 F726[915E] mul word [gnradix] ; DX=?, AX=new:hi, TOS=old:lo, BX=0 + 39564 00005F17 7210 jc short m32E ; Too big? 39565 - 39566 00005F1C 87D3 xchg dx,bx ; DX=0, AX=old:lo, TOS=orig, BX=new:hi - 39567 00005F1E F726[915E] mul word [gnradix] ; DX=carry, AX=new:lo, TOS=orig, BX=new:hi - 39568 00005F22 87D3 xchg dx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=carry - 39569 00005F24 01DA add dx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=carry - 39570 00005F26 31DB xor bx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=0 - 39571 00005F28 C3 retn - 39572 m32E: - 39573 00005F29 58 pop ax - 39574 00005F2A C3 retn - 39575 - 39576 ; ----------------------------------------------------------------------------- - 39577 ;*** toPara - divides DX:AX by 16; result in AX only (discards extra DX data) - 39578 ; ----------------------------------------------------------------------------- - 39579 ; ENTRY: DX:AX = the number to be divided - 39580 ; EXIT: Interpereting DX:AX as bytes, AX=paragraph equivalent, 0xFFFF max - 39581 ; ERROR: None - 39582 ; USES: Flags, AX, DX - 39583 ; ----------------------------------------------------------------------------- - 39584 ; Note: The 386 has a 32-bit SHR, which would work perfectly for this... but we - 39585 ; can't ensure a 386 host machine. Sorry. + 39566 00005F19 89C2 mov dx,ax ; DX=new:hi, AX=new:hi, TOS=old:lo, BX=0 + 39567 00005F1B 58 pop ax ; DX=new:hi, AX=old:lo, TOS=orig, BX=0 + 39568 + 39569 00005F1C 87D3 xchg dx,bx ; DX=0, AX=old:lo, TOS=orig, BX=new:hi + 39570 00005F1E F726[915E] mul word [gnradix] ; DX=carry, AX=new:lo, TOS=orig, BX=new:hi + 39571 00005F22 87D3 xchg dx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=carry + 39572 00005F24 01DA add dx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=carry + 39573 00005F26 31DB xor bx,bx ; DX=new:hi, AX=new:lo, TOS=orig, BX=0 + 39574 00005F28 C3 retn + 39575 m32E: + 39576 00005F29 58 pop ax + 39577 00005F2A C3 retn + 39578 + 39579 ; ----------------------------------------------------------------------------- + 39580 ;*** toPara - divides DX:AX by 16; result in AX only (discards extra DX data) + 39581 ; ----------------------------------------------------------------------------- + 39582 ; ENTRY: DX:AX = the number to be divided + 39583 ; EXIT: Interpereting DX:AX as bytes, AX=paragraph equivalent, 0xFFFF max + 39584 ; ERROR: None + 39585 ; USES: Flags, AX, DX 39586 ; ----------------------------------------------------------------------------- - 39587 - 39588 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39589 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39590 toPara: - 39591 00005F2B 51 push cx ; DX:AX=HHHH hhhh hhhh hhhh:LLLL llll llll llll - 39592 - 39593 00005F2C B104 mov cl,4 ; - 39594 00005F2E D3E8 shr ax,cl ; DX:AX=HHHH hhhh hhhh hhhh:0000 LLLL llll llll - 39595 00005F30 92 xchg ax,dx ; DX:AX=0000 LLLL llll llll:HHHH hhhh hhhh hhhh - 39596 00005F31 B10C mov cl,12 - 39597 00005F33 D3E0 shl ax,cl ; DX:AX=0000 LLLL llll llll:hhhh 0000 0000 0000 - 39598 00005F35 09D0 or ax,dx ; AX=hhhh LLLL llll llll - 39599 - 39600 00005F37 59 pop cx - 39601 00005F38 C3 retn + 39587 ; Note: The 386 has a 32-bit SHR, which would work perfectly for this... but we + 39588 ; can't ensure a 386 host machine. Sorry. + 39589 ; ----------------------------------------------------------------------------- + 39590 + 39591 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39592 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39593 toPara: + 39594 00005F2B 51 push cx ; DX:AX=HHHH hhhh hhhh hhhh:LLLL llll llll llll + 39595 + 39596 00005F2C B104 mov cl,4 ; + 39597 00005F2E D3E8 shr ax,cl ; DX:AX=HHHH hhhh hhhh hhhh:0000 LLLL llll llll + 39598 00005F30 92 xchg ax,dx ; DX:AX=0000 LLLL llll llll:HHHH hhhh hhhh hhhh + 39599 00005F31 B10C mov cl,12 + 39600 00005F33 D3E0 shl ax,cl ; DX:AX=0000 LLLL llll llll:hhhh 0000 0000 0000 + 39601 00005F35 09D0 or ax,dx ; AX=hhhh LLLL llll llll 39602 - 39603 ; ----------------------------------------------------------------------------- - 39604 ;*** UmbHead - returns in AX the address of the first UMB block (0x9FFF) - 39605 ; ----------------------------------------------------------------------------- - 39606 ; ENTRY: Nothing - 39607 ; EXIT: AX contains 0x9FFF for most systems - 39608 ; ERROR: Carry set if pointer is 0xFFFF (if not set up yet--DH runs into this) - 39609 ; USES: Flags, AX - 39610 ; ----------------------------------------------------------------------------- - 39611 ; Early in the boot-cycle, the pointer used to obtain this value isn't set up; - 39612 ; to be precise, before a UMB provider is around. In this event, the pointer - 39613 ; is always set to 0xFFFF; it changes once a provider is around. On most - 39614 ; machines (all of 'em I've seen), it changes to 0x9FFF at that point. - 39615 ; ----------------------------------------------------------------------------- - 39616 - 39617 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39618 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39619 UmbHead: - 39620 ;pushreg - 39621 - 39622 ;push si - 39623 ;push ds - 39624 ;push es - 39625 - 39626 00005F39 B452 mov ah,52h ; DOS_GET_DOS_LISTS - 39627 ; Call int 21h, function 52h... - 39628 00005F3B CD21 int 21h - 39629 ; DOS - 2+ internal - GET LIST OF LISTS - 39630 ; Return: ES:BX -> DOS list of lists - 39631 - 39632 ;mov ax,[es:DOS_UMB_HEAD] ; And read what's in ES:[008C] - 39633 00005F3D 26A18C00 mov ax,[es:8Ch] - 39634 00005F41 83F8FF cmp ax,0FFFFh - 39635 ;je short uhE ; If it's 0xFFFF, it's an error... - 39636 - 39637 ;clc ; Else, it isn't (CLC done by prev cmp) - 39638 ;jmp short uhX - 39639 ; 17/06/2023 - 39640 00005F44 F5 cmc ; cf = 0 <--> cf = 1 - 39641 uhE: - 39642 ;stc - 39643 uhX: - 39644 ;popreg - 39645 - 39646 ;pop es - 39647 ;pop ds - 39648 ;pop si - 39649 - 39650 00005F45 C3 retn - 39651 - 39652 ; ----------------------------------------------------------------------------- - 39653 ;*** isSysMCB - sets ZF iff ES points to an MCB owned by "SC" + (8 or 9) - 39654 ; ----------------------------------------------------------------------------- - 39655 ; ENTRY: ES:0 should point to a valid MCB - 39656 ; EXIT: ZF set if owned by SC+8 or SC+9 (for japan) - 39657 ; USES: Flags - 39658 ; ----------------------------------------------------------------------------- - 39659 - 39660 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39661 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39662 isSysMCB: - 39663 ;push ax - 39664 - 39665 ;mov ax,[es:1] - 39666 00005F46 26A10100 mov ax,[es:arena_owner] ; Check the owner... - 39667 00005F4A 83F808 cmp ax,8 ; SystemPSPOwner ; 8 (for US OR Japan) is valid - 39668 00005F4D 7405 jz short ism10 - 39669 00005F4F 83F809 cmp ax,9 ; JapanPSPOwner ; 9 (for Japan) is valid - 39670 ;jz short ism10 - 39671 ;jmp short ismX ; Anything else isn't. - 39672 00005F52 7507 jnz short ismX - 39673 ism10: - 39674 ;mov ax,[es:8] - 39675 00005F54 26A10800 mov ax,[es:arena_name] ; Check the name... - 39676 00005F58 3D5343 cmp ax,'SC' ; cmp ax,4353h - 39677 ismX: - 39678 ;pop ax - 39679 00005F5B C3 retn - 39680 - 39681 ; ----------------------------------------------------------------------------- - 39682 ;*** AddrToUmb - converts a segment address in AX to its appropriate UMB number - 39683 ; ----------------------------------------------------------------------------- - 39684 ; ENTRY: AX contains a segment address - 39685 ; EXIT: AX will contain the UMB number which contains the address (0==conv) - 39686 ; ERROR: If the address is above UM Range, AX will return as FFFF. - 39687 ; USES: Flags, AX - 39688 ; ----------------------------------------------------------------------------- - 39689 ; An address in the following areas is treated as: - 39690 ; 0 <-> umbhead (0x9FFF) = Conventional memory - 39691 ; 0x9FFF <-> addr of first UM sys MCB = UMB #1 - 39692 ; ... - 39693 ; addr of last UM sys MCB <-> TOM = invalid; returns #0xFFFF - 39694 ; ----------------------------------------------------------------------------- - 39695 - 39696 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39697 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39698 AddrToUmb: - 39699 ;pushreg - 39700 - 39701 ;push cx - 39702 ;push dx - 39703 00005F5C 06 push es - 39704 - 39705 00005F5D 89C2 mov dx,ax ; DX = address to search for - 39706 - 39707 00005F5F E8D7FF call UmbHead ; AX = first segment - 39708 00005F62 722B jc short atuE ; If it couldn't get it, error out. + 39603 00005F37 59 pop cx + 39604 00005F38 C3 retn + 39605 + 39606 ; ----------------------------------------------------------------------------- + 39607 ;*** UmbHead - returns in AX the address of the first UMB block (0x9FFF) + 39608 ; ----------------------------------------------------------------------------- + 39609 ; ENTRY: Nothing + 39610 ; EXIT: AX contains 0x9FFF for most systems + 39611 ; ERROR: Carry set if pointer is 0xFFFF (if not set up yet--DH runs into this) + 39612 ; USES: Flags, AX + 39613 ; ----------------------------------------------------------------------------- + 39614 ; Early in the boot-cycle, the pointer used to obtain this value isn't set up; + 39615 ; to be precise, before a UMB provider is around. In this event, the pointer + 39616 ; is always set to 0xFFFF; it changes once a provider is around. On most + 39617 ; machines (all of 'em I've seen), it changes to 0x9FFF at that point. + 39618 ; ----------------------------------------------------------------------------- + 39619 + 39620 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39621 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39622 UmbHead: + 39623 ;pushreg + 39624 + 39625 ;push si + 39626 ;push ds + 39627 ;push es + 39628 + 39629 00005F39 B452 mov ah,52h ; DOS_GET_DOS_LISTS + 39630 ; Call int 21h, function 52h... + 39631 00005F3B CD21 int 21h + 39632 ; DOS - 2+ internal - GET LIST OF LISTS + 39633 ; Return: ES:BX -> DOS list of lists + 39634 + 39635 ;mov ax,[es:DOS_UMB_HEAD] ; And read what's in ES:[008C] + 39636 00005F3D 26A18C00 mov ax,[es:8Ch] + 39637 00005F41 83F8FF cmp ax,0FFFFh + 39638 ;je short uhE ; If it's 0xFFFF, it's an error... + 39639 + 39640 ;clc ; Else, it isn't (CLC done by prev cmp) + 39641 ;jmp short uhX + 39642 ; 17/06/2023 + 39643 00005F44 F5 cmc ; cf = 0 <--> cf = 1 + 39644 uhE: + 39645 ;stc + 39646 uhX: + 39647 ;popreg + 39648 + 39649 ;pop es + 39650 ;pop ds + 39651 ;pop si + 39652 + 39653 00005F45 C3 retn + 39654 + 39655 ; ----------------------------------------------------------------------------- + 39656 ;*** isSysMCB - sets ZF iff ES points to an MCB owned by "SC" + (8 or 9) + 39657 ; ----------------------------------------------------------------------------- + 39658 ; ENTRY: ES:0 should point to a valid MCB + 39659 ; EXIT: ZF set if owned by SC+8 or SC+9 (for japan) + 39660 ; USES: Flags + 39661 ; ----------------------------------------------------------------------------- + 39662 + 39663 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39664 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39665 isSysMCB: + 39666 ;push ax + 39667 + 39668 ;mov ax,[es:1] + 39669 00005F46 26A10100 mov ax,[es:arena_owner] ; Check the owner... + 39670 00005F4A 83F808 cmp ax,8 ; SystemPSPOwner ; 8 (for US OR Japan) is valid + 39671 00005F4D 7405 jz short ism10 + 39672 00005F4F 83F809 cmp ax,9 ; JapanPSPOwner ; 9 (for Japan) is valid + 39673 ;jz short ism10 + 39674 ;jmp short ismX ; Anything else isn't. + 39675 00005F52 7507 jnz short ismX + 39676 ism10: + 39677 ;mov ax,[es:8] + 39678 00005F54 26A10800 mov ax,[es:arena_name] ; Check the name... + 39679 00005F58 3D5343 cmp ax,'SC' ; cmp ax,4353h + 39680 ismX: + 39681 ;pop ax + 39682 00005F5B C3 retn + 39683 + 39684 ; ----------------------------------------------------------------------------- + 39685 ;*** AddrToUmb - converts a segment address in AX to its appropriate UMB number + 39686 ; ----------------------------------------------------------------------------- + 39687 ; ENTRY: AX contains a segment address + 39688 ; EXIT: AX will contain the UMB number which contains the address (0==conv) + 39689 ; ERROR: If the address is above UM Range, AX will return as FFFF. + 39690 ; USES: Flags, AX + 39691 ; ----------------------------------------------------------------------------- + 39692 ; An address in the following areas is treated as: + 39693 ; 0 <-> umbhead (0x9FFF) = Conventional memory + 39694 ; 0x9FFF <-> addr of first UM sys MCB = UMB #1 + 39695 ; ... + 39696 ; addr of last UM sys MCB <-> TOM = invalid; returns #0xFFFF + 39697 ; ----------------------------------------------------------------------------- + 39698 + 39699 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39700 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39701 AddrToUmb: + 39702 ;pushreg + 39703 + 39704 ;push cx + 39705 ;push dx + 39706 00005F5C 06 push es + 39707 + 39708 00005F5D 89C2 mov dx,ax ; DX = address to search for 39709 - 39710 ;mov es,ax ; * ; ES = first UMB segment - 39711 00005F64 31C9 xor cx,cx ; Pretend we're on UMB 0 for now... (cx = UMB#) + 39710 00005F5F E8D7FF call UmbHead ; AX = first segment + 39711 00005F62 722B jc short atuE ; If it couldn't get it, error out. 39712 - 39713 ; ---------------------------------------- - 39714 ; ATU10--ES - Current MCB address - 39715 ; DX - Address given for conversion - 39716 ; CX - Current UMB # - 39717 ; ---------------------------------------- - 39718 - 39719 ; 17/06/2023 - 39720 atu10: - 39721 00005F66 8EC0 mov es,ax ; * - 39722 ;atu10: - 39723 ;mov ax,es - 39724 00005F68 39D0 cmp ax,dx ; Present segment >= given segment? - 39725 00005F6A 7326 jae short atuX ; Yep--done. - 39726 - 39727 00005F6C E8D7FF call isSysMCB ; Returns with ZF set if this is a system MCB - 39728 00005F6F 7501 jnz short atu20 + 39713 ;mov es,ax ; * ; ES = first UMB segment + 39714 00005F64 31C9 xor cx,cx ; Pretend we're on UMB 0 for now... (cx = UMB#) + 39715 + 39716 ; ---------------------------------------- + 39717 ; ATU10--ES - Current MCB address + 39718 ; DX - Address given for conversion + 39719 ; CX - Current UMB # + 39720 ; ---------------------------------------- + 39721 + 39722 ; 17/06/2023 + 39723 atu10: + 39724 00005F66 8EC0 mov es,ax ; * + 39725 ;atu10: + 39726 ;mov ax,es + 39727 00005F68 39D0 cmp ax,dx ; Present segment >= given segment? + 39728 00005F6A 7326 jae short atuX ; Yep--done. 39729 - 39730 00005F71 41 inc cx ; If it _was_ a system MCB, we're in a new UMB. - 39731 atu20: - 39732 ;mov al,[es:0] - 39733 00005F72 26A00000 mov al,[es:arena_signature] - 39734 ;cmp al,'Z' ; 5Ah - 39735 00005F76 3C5A cmp al,arena_signature_end - 39736 00005F78 740A je short atu30 ; 'Z' means this was the last MCB... that's it. - 39737 - 39738 ;NextMCB es,ax - 39739 00005F7A 8CC0 mov ax,es - 39740 ;add ax,[es:3] ; NextMCB (macro) - 39741 00005F7C 2603060300 add ax,[es:arena_size] - 39742 00005F81 40 inc ax - 39743 ;mov es,ax ; * ; 17/06/2023 - 39744 00005F82 EBE2 jmp short atu10 - 39745 - 39746 ; ----------------------------------------------------------------------------- - 39747 ; if we get to atu30, they specified a number that was past the last MCB. - 39748 ; make sure it's not _inside_ that MCB before we return an error condition. + 39730 00005F6C E8D7FF call isSysMCB ; Returns with ZF set if this is a system MCB + 39731 00005F6F 7501 jnz short atu20 + 39732 + 39733 00005F71 41 inc cx ; If it _was_ a system MCB, we're in a new UMB. + 39734 atu20: + 39735 ;mov al,[es:0] + 39736 00005F72 26A00000 mov al,[es:arena_signature] + 39737 ;cmp al,'Z' ; 5Ah + 39738 00005F76 3C5A cmp al,arena_signature_end + 39739 00005F78 740A je short atu30 ; 'Z' means this was the last MCB... that's it. + 39740 + 39741 ;NextMCB es,ax + 39742 00005F7A 8CC0 mov ax,es + 39743 ;add ax,[es:3] ; NextMCB (macro) + 39744 00005F7C 2603060300 add ax,[es:arena_size] + 39745 00005F81 40 inc ax + 39746 ;mov es,ax ; * ; 17/06/2023 + 39747 00005F82 EBE2 jmp short atu10 + 39748 39749 ; ----------------------------------------------------------------------------- - 39750 - 39751 atu30: - 39752 00005F84 8CC0 mov ax,es - 39753 ;add ax,[es:3] - 39754 00005F86 2603060300 add ax,[es:arena_size] - 39755 00005F8B 39D0 cmp ax,dx ; Present >= given? - 39756 00005F8D 7303 jae short atuX ; Yep! It _was_ inside. - 39757 atuE: - 39758 00005F8F 31C9 xor cx,cx ; Else, fall through with UMB # == -1 - 39759 00005F91 49 dec cx ; (that makes it return 0xFFFF and sets CF) - 39760 atuX: - 39761 00005F92 89C8 mov ax,cx ; Return the UMB number in AX - 39762 - 39763 ;popreg - 39764 - 39765 00005F94 07 pop es - 39766 ;pop dx - 39767 ;pop cx - 39768 - 39769 00005F95 C3 retn - 39770 - 39771 ; ----------------------------------------------------------------------------- - 39772 ;*** convUMB - checks after GetXNum to convert an address to a UMB number - 39773 ; -- if GetXNum read a hex number, we interperete that as a segment - 39774 ; address rather than a UMB number... and use that address to look up a UMB. - 39775 ; This routine checks for that condition and calls AddrToUmb if necessary. - 39776 ; ----------------------------------------------------------------------------- - 39777 ; ENTRY: AX contains a UMB number or segment, gnradix has been set by GetXNum - 39778 ; EXIT: AX will contain a UMB number - 39779 ; ERROR: None - 39780 ; USES: Flags, AX - 39781 ; ----------------------------------------------------------------------------- - 39782 - 39783 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39784 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39785 convUMB: - 39786 ;cmp word [gnradix],16 - 39787 00005F96 803E[915E]10 cmp byte [gnradix],16 - 39788 00005F9B 7509 jne short cu10 ; If it didn't read in hex, it's not an address - 39789 00005F9D E8BCFF call AddrToUmb ; Else, convert the address to a UMB number - 39790 00005FA0 83F8FF cmp ax,0FFFFh - 39791 00005FA3 7501 jne short cu10 - 39792 00005FA5 40 inc ax ; ax = 0 ; If too high, ignore it (make it conventional) - 39793 cu10: - 39794 00005FA6 C3 retn - 39795 - 39796 ; ----------------------------------------------------------------------------- - 39797 ;*** setUMBs - links umbs and sets allocation strategy for a load - 39798 ; -- if LoadHigh, the allocation strategy MAY be LOW_FIRST instead - 39799 ; of the usual HIGH_FIRST. See the code. - 39800 ; ----------------------------------------------------------------------------- - 39801 ; ENTRY: None - 39802 ; EXIT: None - 39803 ; ERROR: None - 39804 ; USES: Flags, fm_umb, fm_strat - 39805 ; ----------------------------------------------------------------------------- - 39806 - 39807 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39808 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39809 setUMBs: - 39810 ;pushreg - 39811 - 39812 ;push ax - 39813 ;push bx - 39814 - 39815 00005FA7 E8B2FD call fm_link - 39816 - 39817 00005FAA B80058 mov ax,5800h ; DOS_CHECK_STRATEGY - 39818 00005FAD CD21 int 21h + 39750 ; if we get to atu30, they specified a number that was past the last MCB. + 39751 ; make sure it's not _inside_ that MCB before we return an error condition. + 39752 ; ----------------------------------------------------------------------------- + 39753 + 39754 atu30: + 39755 00005F84 8CC0 mov ax,es + 39756 ;add ax,[es:3] + 39757 00005F86 2603060300 add ax,[es:arena_size] + 39758 00005F8B 39D0 cmp ax,dx ; Present >= given? + 39759 00005F8D 7303 jae short atuX ; Yep! It _was_ inside. + 39760 atuE: + 39761 00005F8F 31C9 xor cx,cx ; Else, fall through with UMB # == -1 + 39762 00005F91 49 dec cx ; (that makes it return 0xFFFF and sets CF) + 39763 atuX: + 39764 00005F92 89C8 mov ax,cx ; Return the UMB number in AX + 39765 + 39766 ;popreg + 39767 + 39768 00005F94 07 pop es + 39769 ;pop dx + 39770 ;pop cx + 39771 + 39772 00005F95 C3 retn + 39773 + 39774 ; ----------------------------------------------------------------------------- + 39775 ;*** convUMB - checks after GetXNum to convert an address to a UMB number + 39776 ; -- if GetXNum read a hex number, we interperete that as a segment + 39777 ; address rather than a UMB number... and use that address to look up a UMB. + 39778 ; This routine checks for that condition and calls AddrToUmb if necessary. + 39779 ; ----------------------------------------------------------------------------- + 39780 ; ENTRY: AX contains a UMB number or segment, gnradix has been set by GetXNum + 39781 ; EXIT: AX will contain a UMB number + 39782 ; ERROR: None + 39783 ; USES: Flags, AX + 39784 ; ----------------------------------------------------------------------------- + 39785 + 39786 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39787 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39788 convUMB: + 39789 ;cmp word [gnradix],16 + 39790 00005F96 803E[915E]10 cmp byte [gnradix],16 + 39791 00005F9B 7509 jne short cu10 ; If it didn't read in hex, it's not an address + 39792 00005F9D E8BCFF call AddrToUmb ; Else, convert the address to a UMB number + 39793 00005FA0 83F8FF cmp ax,0FFFFh + 39794 00005FA3 7501 jne short cu10 + 39795 00005FA5 40 inc ax ; ax = 0 ; If too high, ignore it (make it conventional) + 39796 cu10: + 39797 00005FA6 C3 retn + 39798 + 39799 ; ----------------------------------------------------------------------------- + 39800 ;*** setUMBs - links umbs and sets allocation strategy for a load + 39801 ; -- if LoadHigh, the allocation strategy MAY be LOW_FIRST instead + 39802 ; of the usual HIGH_FIRST. See the code. + 39803 ; ----------------------------------------------------------------------------- + 39804 ; ENTRY: None + 39805 ; EXIT: None + 39806 ; ERROR: None + 39807 ; USES: Flags, fm_umb, fm_strat + 39808 ; ----------------------------------------------------------------------------- + 39809 + 39810 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39811 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39812 setUMBs: + 39813 ;pushreg + 39814 + 39815 ;push ax + 39816 ;push bx + 39817 + 39818 00005FA7 E8B2FD call fm_link 39819 - 39820 ;putdata fm_strat,al ; Store the current strategy for later restore - 39821 - 39822 ;push es - 39823 ;mov es,[RESSEG] - 39824 ;mov [es:fm_strat],al ; store the current strategy - 39825 ;pop es - 39826 00005FAF 1E push ds ; * - 39827 00005FB0 8E1E[F59B] mov ds,[RESSEG] - 39828 00005FB4 A2[3605] mov [fm_strat],al - 39829 ;pop ds ; * - 39830 - 39831 00005FB7 83E07F and ax,007Fh ; 0000.0000.0111.1111 == All that other stuff - 39832 00005FBA 50 push ax ; ** ; Watch this carefully... + 39820 00005FAA B80058 mov ax,5800h ; DOS_CHECK_STRATEGY + 39821 00005FAD CD21 int 21h + 39822 + 39823 ;putdata fm_strat,al ; Store the current strategy for later restore + 39824 + 39825 ;push es + 39826 ;mov es,[RESSEG] + 39827 ;mov [es:fm_strat],al ; store the current strategy + 39828 ;pop es + 39829 00005FAF 1E push ds ; * + 39830 00005FB0 8E1E[F59B] mov ds,[RESSEG] + 39831 00005FB4 A2[3605] mov [fm_strat],al + 39832 ;pop ds ; * 39833 - 39834 00005FBB E80C00 call loadLow ; returns al==0 if load low, al==1 if loadhigh - 39835 00005FBE D0C8 ror al,1 ; Shift that to al==0 or al==0x80 + 39834 00005FB7 83E07F and ax,007Fh ; 0000.0000.0111.1111 == All that other stuff + 39835 00005FBA 50 push ax ; ** ; Watch this carefully... 39836 - 39837 00005FC0 5B pop bx ; ** ; ...pushed as AX above - 39838 - 39839 00005FC1 1F pop ds ; * - 39840 - 39841 00005FC2 08C3 or bl,al ; Now we have 0000.0000.?111.1111 in BX; - 39842 - 39843 00005FC4 B80158 mov ax,5801h ; DOS_SET_STRATEGY - 39844 ; with ? ==1 if load highfirst. Perfect! - 39845 00005FC7 CD21 int 21h - 39846 - 39847 ;popreg - 39848 - 39849 ;pop bx - 39850 ;pop ax + 39837 00005FBB E80C00 call loadLow ; returns al==0 if load low, al==1 if loadhigh + 39838 00005FBE D0C8 ror al,1 ; Shift that to al==0 or al==0x80 + 39839 + 39840 00005FC0 5B pop bx ; ** ; ...pushed as AX above + 39841 + 39842 00005FC1 1F pop ds ; * + 39843 + 39844 00005FC2 08C3 or bl,al ; Now we have 0000.0000.?111.1111 in BX; + 39845 + 39846 00005FC4 B80158 mov ax,5801h ; DOS_SET_STRATEGY + 39847 ; with ? ==1 if load highfirst. Perfect! + 39848 00005FC7 CD21 int 21h + 39849 + 39850 ;popreg 39851 - 39852 00005FC9 C3 retn - 39853 - 39854 ; ----------------------------------------------------------------------------- - 39855 ;*** loadLow - returns AL==0 if UMB0 == 0, else AL==1 - 39856 ; ----------------------------------------------------------------------------- - 39857 ; ENTRY: None - 39858 ; EXIT: AL==0 if mem strategy should be set to LOW_FIRST, else AL==1 - 39859 ; Carry set if UMB0 not specified (_NOT_ an error) - 39860 ; ERROR: None - 39861 ; USES: Flags, fm_strat, fm_umb - 39862 ; ----------------------------------------------------------------------------- - 39863 ; We want to set the memory strategy to LOW_FIRST if the user specified a - 39864 ; load UMB, and it is 0. That 0 can be either from the user having _specified_ - 39865 ; zero (/L:0;...), or from having specified a too-big min size (/L:1,99999999) - 39866 ; such that the load UMB is too small, and shouldn't be used. - 39867 ; ----------------------------------------------------------------------------- - 39868 - 39869 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39870 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39871 loadLow: - 39872 ;push ds ; * - 39873 - 39874 ;dataseg ds ; Point DS into appropriate data segment - 39875 ;mov ds,[RESSEG] - 39876 - 39877 ; * ; ds = [RESSEG] from 'setUMBs') ; 17/06/2023 - 39878 - 39879 00005FCA A0[3405] mov al,[UmbLoad] - 39880 00005FCD 3CFF cmp al,0FFh ; UNSPECIFIED - 39881 00005FCF 7503 jne short ll10 - 39882 - 39883 ;mov al,1 ; Return with AL==1 && STC if no UMBs specified - 39884 00005FD1 F9 stc - 39885 ;jmp short llX - 39886 00005FD2 EB04 jmp short lly ; 17/06/2023 - 39887 ll10: - 39888 00005FD4 08C0 or al,al ; AL=the load UMB: Is it == 0? - 39889 00005FD6 7402 jz short llX ; Yep... CF==0 (from OR) && AL=0, so just exit - 39890 ; cf= 0 - 39891 - 39892 ;mov al,1 - 39893 ;clc - 39894 lly: ; 17/06/2023 - 39895 00005FD8 B001 mov al,1 - 39896 llX: - 39897 ;pop ds ; * ; Return DS to where it was - 39898 - 39899 ;normseg ds ; - 39900 - 39901 00005FDA C3 retn - 39902 - 39903 ; ----------------------------------------------------------------------------- - 39904 ;*** HideUMBs - links UMBs and hides upper-memory as appropriate - 39905 ; ----------------------------------------------------------------------------- - 39906 ; ENTRY: None - 39907 ; EXIT: None - 39908 ; ERROR: None - 39909 ; USES: Flags, fm_strat, fm_umb - 39910 ; ----------------------------------------------------------------------------- - 39911 - 39912 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39913 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:64D0h + 39852 ;pop bx + 39853 ;pop ax + 39854 + 39855 00005FC9 C3 retn + 39856 + 39857 ; ----------------------------------------------------------------------------- + 39858 ;*** loadLow - returns AL==0 if UMB0 == 0, else AL==1 + 39859 ; ----------------------------------------------------------------------------- + 39860 ; ENTRY: None + 39861 ; EXIT: AL==0 if mem strategy should be set to LOW_FIRST, else AL==1 + 39862 ; Carry set if UMB0 not specified (_NOT_ an error) + 39863 ; ERROR: None + 39864 ; USES: Flags, fm_strat, fm_umb + 39865 ; ----------------------------------------------------------------------------- + 39866 ; We want to set the memory strategy to LOW_FIRST if the user specified a + 39867 ; load UMB, and it is 0. That 0 can be either from the user having _specified_ + 39868 ; zero (/L:0;...), or from having specified a too-big min size (/L:1,99999999) + 39869 ; such that the load UMB is too small, and shouldn't be used. + 39870 ; ----------------------------------------------------------------------------- + 39871 + 39872 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39873 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39874 loadLow: + 39875 ;push ds ; * + 39876 + 39877 ;dataseg ds ; Point DS into appropriate data segment + 39878 ;mov ds,[RESSEG] + 39879 + 39880 ; * ; ds = [RESSEG] from 'setUMBs') ; 17/06/2023 + 39881 + 39882 00005FCA A0[3405] mov al,[UmbLoad] + 39883 00005FCD 3CFF cmp al,0FFh ; UNSPECIFIED + 39884 00005FCF 7503 jne short ll10 + 39885 + 39886 ;mov al,1 ; Return with AL==1 && STC if no UMBs specified + 39887 00005FD1 F9 stc + 39888 ;jmp short llX + 39889 00005FD2 EB04 jmp short lly ; 17/06/2023 + 39890 ll10: + 39891 00005FD4 08C0 or al,al ; AL=the load UMB: Is it == 0? + 39892 00005FD6 7402 jz short llX ; Yep... CF==0 (from OR) && AL=0, so just exit + 39893 ; cf= 0 + 39894 + 39895 ;mov al,1 + 39896 ;clc + 39897 lly: ; 17/06/2023 + 39898 00005FD8 B001 mov al,1 + 39899 llX: + 39900 ;pop ds ; * ; Return DS to where it was + 39901 + 39902 ;normseg ds ; + 39903 + 39904 00005FDA C3 retn + 39905 + 39906 ; ----------------------------------------------------------------------------- + 39907 ;*** HideUMBs - links UMBs and hides upper-memory as appropriate + 39908 ; ----------------------------------------------------------------------------- + 39909 ; ENTRY: None + 39910 ; EXIT: None + 39911 ; ERROR: None + 39912 ; USES: Flags, fm_strat, fm_umb + 39913 ; ----------------------------------------------------------------------------- 39914 - 39915 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39916 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:634Dh - 39917 HideUMBs: - 39918 ;pushreg - 39919 - 39920 ;push ax - 39921 ;push cx - 39922 ;push ds - 39923 ;push es - 39924 - 39925 00005FDB E8EF01 call UmbTest ; See if we REALLY linked in anything... - 39926 00005FDE 7236 jc short husX ; ...if not, there's nothing for us to do. + 39915 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39916 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:64D0h + 39917 + 39918 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39919 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:634Dh + 39920 HideUMBs: + 39921 ;pushreg + 39922 + 39923 ;push ax + 39924 ;push cx + 39925 ;push ds + 39926 ;push es 39927 - 39928 00005FE0 E82CFD call FixMem ; Concatenate adjacent free MCBs in upper mem - 39929 00005FE3 E8C1FF call setUMBs ; Link UMBs and set memory-allocation strategy + 39928 00005FDB E8EF01 call UmbTest ; See if we REALLY linked in anything... + 39929 00005FDE 7236 jc short husX ; ...if not, there's nothing for us to do. 39930 - 39931 ;putdata fInHigh,1 ; Remember that we're now running high - 39932 ;push es - 39933 ;mov es,[RESSEG] - 39934 ;mov byte [es:fInHigh], 1 - 39935 ; ; remember that we're now running high - 39936 ;pop es - 39937 00005FE6 1E push ds - 39938 00005FE7 8E1E[F59B] mov ds,[RESSEG] - 39939 00005FEB C606[3005]01 mov byte [fInHigh], 1 - 39940 00005FF0 1F pop ds - 39941 - 39942 00005FF1 E82300 call GetLoadUMB ; See if they gave us a list to leave free - 39943 00005FF4 3CFF cmp al,0FFh ; UNSPECIFIED - 39944 ; If they didn't, - 39945 00005FF6 741E je short husX ; then we shouldn't do this loop: - 39946 - 39947 00005FF8 31C9 xor cx,cx - 39948 - 39949 ; ----------------------------------------------- - 39950 ; HUS10-CX - UMB number (after inc, 1==first UMB) - 39951 ; ----------------------------------------------- - 39952 - 39953 hus10: - 39954 00005FFA 41 inc cx ; For each UMB: - 39955 00005FFB 83F910 cmp cx,16 ; MAXUMB - 39956 00005FFE 730C jae short hus20 - 39957 - 39958 00006000 88C8 mov al,cl ; (stopping as soon as we're outside of the - 39959 ; 17/06/2023 - 39960 ;push es - 39961 00006002 E8A900 call findumb ; valid range of UMBs) - 39962 ;pop es ; push/pop: trash what findumb finds. :-) - 39963 00006005 7205 jc short hus20 - 39964 - 39965 00006007 E87901 call hideUMB? ; hide what we need to hide. - 39966 - 39967 0000600A EBEE jmp short hus10 - 39968 hus20: - 39969 0000600C E80800 call GetLoadUMB ; Now check if they offered /L:0 - 39970 0000600F 08C0 or al,al ; --Is the load UMB 0? (-1==unspecified) - 39971 00006011 7503 jnz short husX ; If not, we're done. - 39972 - 39973 00006013 E8E701 call hl_unlink ; If so, however, fix UMBs and strategy. - 39974 husX: - 39975 ;popreg - 39976 - 39977 ;pop es - 39978 ;pop ds - 39979 ;pop cx - 39980 ;pop ax - 39981 - 39982 00006016 C3 retn - 39983 - 39984 ; ----------------------------------------------------------------------------- - 39985 ;*** GetLoadUMB - Returns the load UMB number in AL (-1 if not specified) - 39986 ; ----------------------------------------------------------------------------- - 39987 ; ENTRY: None - 39988 ; EXIT: AL == load UMB - 39989 ; ERROR: None - 39990 ; USES: Flags, AX - 39991 ; ----------------------------------------------------------------------------- - 39992 - 39993 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 39994 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 39995 GetLoadUMB: - 39996 ;getdata al,UmbLoad - 39997 - 39998 00006017 1E push ds - 39999 00006018 8E1E[F59B] mov ds,[RESSEG] ; getdata (macro) - 40000 0000601C A0[3405] mov al,[UmbLoad] - 40001 0000601F 1F pop ds - 40002 - 40003 00006020 C3 retn - 40004 - 40005 ; ----------------------------------------------------------------------------- - 40006 ;*** GetSize - Returns the UMB in AL's minimum size (0 if not specified) - 40007 ; ----------------------------------------------------------------------------- - 40008 ; ENTRY: AL == a UMB number - 40009 ; EXIT: AX == UMB minimum size, as specified by the user - 40010 ; ERROR: None - 40011 ; USES: Flags, AX - 40012 ; ----------------------------------------------------------------------------- - 40013 - 40014 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40015 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40016 GetSize: - 40017 ;pushreg - 40018 ;push bx - 40019 ;push si - 40020 00006021 1E push ds - 40021 - 40022 ;dataseg ds - 40023 00006022 8E1E[F59B] mov ds,[RESSEG] - 40024 - 40025 00006026 30E4 xor ah,ah ; ax==UMB - 40026 ;mov bx,offset UmbSize - 40027 00006028 BB[6E04] mov bx,UmbSize ; bx==array - 40028 0000602B D0E0 shl al,1 ; ax==offset - 40029 ;add ax,bx ; ax==element index - 40030 ;mov si,ax ; ds:si==element index - 40031 ;lodsw ; ax==size - 40032 0000602D 01C3 add bx,ax - 40033 0000602F 8B07 mov ax,[bx] - 40034 - 40035 ;popreg - 40036 00006031 1F pop ds - 40037 ;pop si - 40038 ;pop bx - 40039 - 40040 ;normseg ds - 40041 00006032 C3 retn + 39931 00005FE0 E82CFD call FixMem ; Concatenate adjacent free MCBs in upper mem + 39932 00005FE3 E8C1FF call setUMBs ; Link UMBs and set memory-allocation strategy + 39933 + 39934 ;putdata fInHigh,1 ; Remember that we're now running high + 39935 ;push es + 39936 ;mov es,[RESSEG] + 39937 ;mov byte [es:fInHigh], 1 + 39938 ; ; remember that we're now running high + 39939 ;pop es + 39940 00005FE6 1E push ds + 39941 00005FE7 8E1E[F59B] mov ds,[RESSEG] + 39942 00005FEB C606[3005]01 mov byte [fInHigh], 1 + 39943 00005FF0 1F pop ds + 39944 + 39945 00005FF1 E82300 call GetLoadUMB ; See if they gave us a list to leave free + 39946 00005FF4 3CFF cmp al,0FFh ; UNSPECIFIED + 39947 ; If they didn't, + 39948 00005FF6 741E je short husX ; then we shouldn't do this loop: + 39949 + 39950 00005FF8 31C9 xor cx,cx + 39951 + 39952 ; ----------------------------------------------- + 39953 ; HUS10-CX - UMB number (after inc, 1==first UMB) + 39954 ; ----------------------------------------------- + 39955 + 39956 hus10: + 39957 00005FFA 41 inc cx ; For each UMB: + 39958 00005FFB 83F910 cmp cx,16 ; MAXUMB + 39959 00005FFE 730C jae short hus20 + 39960 + 39961 00006000 88C8 mov al,cl ; (stopping as soon as we're outside of the + 39962 ; 17/06/2023 + 39963 ;push es + 39964 00006002 E8A900 call findumb ; valid range of UMBs) + 39965 ;pop es ; push/pop: trash what findumb finds. :-) + 39966 00006005 7205 jc short hus20 + 39967 + 39968 00006007 E87901 call hideUMB? ; hide what we need to hide. + 39969 + 39970 0000600A EBEE jmp short hus10 + 39971 hus20: + 39972 0000600C E80800 call GetLoadUMB ; Now check if they offered /L:0 + 39973 0000600F 08C0 or al,al ; --Is the load UMB 0? (-1==unspecified) + 39974 00006011 7503 jnz short husX ; If not, we're done. + 39975 + 39976 00006013 E8E701 call hl_unlink ; If so, however, fix UMBs and strategy. + 39977 husX: + 39978 ;popreg + 39979 + 39980 ;pop es + 39981 ;pop ds + 39982 ;pop cx + 39983 ;pop ax + 39984 + 39985 00006016 C3 retn + 39986 + 39987 ; ----------------------------------------------------------------------------- + 39988 ;*** GetLoadUMB - Returns the load UMB number in AL (-1 if not specified) + 39989 ; ----------------------------------------------------------------------------- + 39990 ; ENTRY: None + 39991 ; EXIT: AL == load UMB + 39992 ; ERROR: None + 39993 ; USES: Flags, AX + 39994 ; ----------------------------------------------------------------------------- + 39995 + 39996 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 39997 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 39998 GetLoadUMB: + 39999 ;getdata al,UmbLoad + 40000 + 40001 00006017 1E push ds + 40002 00006018 8E1E[F59B] mov ds,[RESSEG] ; getdata (macro) + 40003 0000601C A0[3405] mov al,[UmbLoad] + 40004 0000601F 1F pop ds + 40005 + 40006 00006020 C3 retn + 40007 + 40008 ; ----------------------------------------------------------------------------- + 40009 ;*** GetSize - Returns the UMB in AL's minimum size (0 if not specified) + 40010 ; ----------------------------------------------------------------------------- + 40011 ; ENTRY: AL == a UMB number + 40012 ; EXIT: AX == UMB minimum size, as specified by the user + 40013 ; ERROR: None + 40014 ; USES: Flags, AX + 40015 ; ----------------------------------------------------------------------------- + 40016 + 40017 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40018 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40019 GetSize: + 40020 ;pushreg + 40021 ;push bx + 40022 ;push si + 40023 00006021 1E push ds + 40024 + 40025 ;dataseg ds + 40026 00006022 8E1E[F59B] mov ds,[RESSEG] + 40027 + 40028 00006026 30E4 xor ah,ah ; ax==UMB + 40029 ;mov bx,offset UmbSize + 40030 00006028 BB[6E04] mov bx,UmbSize ; bx==array + 40031 0000602B D0E0 shl al,1 ; ax==offset + 40032 ;add ax,bx ; ax==element index + 40033 ;mov si,ax ; ds:si==element index + 40034 ;lodsw ; ax==size + 40035 0000602D 01C3 add bx,ax + 40036 0000602F 8B07 mov ax,[bx] + 40037 + 40038 ;popreg + 40039 00006031 1F pop ds + 40040 ;pop si + 40041 ;pop bx 40042 - 40043 ; ----------------------------------------------------------------------------- - 40044 ;*** hideUMB - marks as HIDDEN all FREE elements in UMB passed as AL - 40045 ; ----------------------------------------------------------------------------- - 40046 ; ENTRY: AL must indicate a valid UMB; 0==conv && is invalid. - 40047 ; EXIT: None; free elements in UMB marked as hidden - 40048 ; ERROR: None - 40049 ; USES: Flags - 40050 ; ----------------------------------------------------------------------------- - 40051 - 40052 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40053 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40054 hideUMB: - 40055 ;pushreg - 40056 - 40057 ;push ax - 40058 ;push es - 40059 - 40060 00006033 E87800 call findumb ; Returns with carry if err, else ES == MCB - 40061 00006036 7221 jc short huX + 40043 ;normseg ds + 40044 00006032 C3 retn + 40045 + 40046 ; ----------------------------------------------------------------------------- + 40047 ;*** hideUMB - marks as HIDDEN all FREE elements in UMB passed as AL + 40048 ; ----------------------------------------------------------------------------- + 40049 ; ENTRY: AL must indicate a valid UMB; 0==conv && is invalid. + 40050 ; EXIT: None; free elements in UMB marked as hidden + 40051 ; ERROR: None + 40052 ; USES: Flags + 40053 ; ----------------------------------------------------------------------------- + 40054 + 40055 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40056 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40057 hideUMB: + 40058 ;pushreg + 40059 + 40060 ;push ax + 40061 ;push es 40062 - 40063 ; ------------------------------------------------ - 40064 ; HU10--ES - MCB inside UMB; if it's a system MCB, - 40065 ; we're not in the same UMB, so exit. + 40063 00006033 E87800 call findumb ; Returns with carry if err, else ES == MCB + 40064 00006036 7221 jc short huX + 40065 40066 ; ------------------------------------------------ - 40067 - 40068 hu10: - 40069 00006038 E80BFF call isSysMCB ; Returns with ZF set if owner is SYSTEM - 40070 0000603B 741C jz short huX ; If it is, we've finished the UMB. - 40071 0000603D E82800 call isFreeMCB ; Returns with ZF set if owner is 0 - 40072 00006040 7503 jnz short hu20 - 40073 - 40074 00006042 E82A00 call hideMCB - 40075 hu20: - 40076 ;mov al,[es:0] - 40077 00006045 26A00000 mov al,[es:arena_signature] - 40078 ;cmp al,'Z' - 40079 00006049 3C5A cmp al,arena_signature_end - 40080 0000604B 740C je short huX ; 'Z' means this was the last MCB... that's it. - 40081 - 40082 ;NextMCB es,ax ; Go on forward. - 40083 - 40084 0000604D 8CC0 mov ax,es ; NextMCB (macro) - 40085 ;add ax,[es:3] - 40086 0000604F 2603060300 add ax,[es:arena_size] - 40087 00006054 40 inc ax - 40088 00006055 8EC0 mov es,ax - 40089 - 40090 00006057 EBDF jmp short hu10 - 40091 huX: - 40092 ;popreg - 40093 - 40094 ;pop es - 40095 ;pop ax - 40096 - 40097 00006059 C3 retn - 40098 - 40099 ; ----------------------------------------------------------------------------- - 40100 ;*** isTiny - returns with ZF set if user didn't specify /S - 40101 ; ----------------------------------------------------------------------------- - 40102 ; ENTRY: None - 40103 ; EXIT: ZF set if user DIDN'T specify /S - 40104 ; ERROR: None - 40105 ; USES: Flags - 40106 ; ----------------------------------------------------------------------------- - 40107 - 40108 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40109 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40110 isTiny: - 40111 0000605A 50 push ax - 40112 - 40113 ;getdata al,fUmbTiny - 40114 0000605B 1E push ds - 40115 0000605C 8E1E[F59B] mov ds,[RESSEG] ; getdata (macro) - 40116 00006060 A0[3105] mov al,[fUmbTiny] - 40117 00006063 1F pop ds - 40118 - 40119 00006064 08C0 or al,al - 40120 00006066 58 pop ax - 40121 00006067 C3 retn - 40122 - 40123 ; ----------------------------------------------------------------------------- - 40124 ;*** isFreeMCB - returns with ZF set if current MCB (ES:0) is FREE - 40125 ; ----------------------------------------------------------------------------- - 40126 ; ENTRY: ES:0 should point to an MCB - 40127 ; EXIT: ZF set if MCB is free, else !ZF - 40128 ; ERROR: None - 40129 ; USES: Flags - 40130 ; ----------------------------------------------------------------------------- - 40131 - 40132 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40133 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40134 isFreeMCB: - 40135 ;or word [es:1],0 - 40136 00006068 26830E010000 or word [es:arena_owner],0 - 40137 0000606E C3 retn - 40138 - 40139 ; ----------------------------------------------------------------------------- - 40140 ;*** hideMCB - marks as HIDDEN the MCB at ES:0 - 40141 ; ----------------------------------------------------------------------------- - 40142 ; ENTRY: ES:0 should point to an MCB - 40143 ; EXIT: None; MCB marked as HIDDEN - 40144 ; ERROR: None - 40145 ; USES: None - 40146 ; ----------------------------------------------------------------------------- - 40147 - 40148 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40149 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40150 hideMCB: - 40151 ;mov word [es:1],8 - 40152 0000606F 26C70601000800 mov word [es:arena_owner],8 ; SystemPSPOwner - 40153 ;mov word [es:8],4948h ; 'HIDDEN ' - 40154 00006076 26C70608004849 mov word [es:arena_name+0], 'HI' ; 4948h - 40155 0000607D 26C7060A004444 mov word [es:arena_name+2], 'DD' ; 4444h - 40156 00006084 26C7060C00454E mov word [es:arena_name+4], 'EN' ; 4E45h - 40157 ;mov word [es:14],2020h - 40158 0000608B 26C7060E002020 mov word [es:arena_name+6], ' ' ; 2020h - 40159 00006092 C3 retn - 40160 - 40161 ; ----------------------------------------------------------------------------- - 40162 ;*** unHideMCB - marks as FREE the MCB at ES:0 - 40163 ; ----------------------------------------------------------------------------- - 40164 ; ENTRY: ES:0 should point to an MCB - 40165 ; EXIT: None; MCB marked as FREE - 40166 ; ERROR: None - 40167 ; USES: None - 40168 ; ----------------------------------------------------------------------------- - 40169 - 40170 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40171 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40172 unHideMCB: - 40173 ;push ax - 40174 ;mov word [es:1],0 - 40175 00006093 26C70601000000 mov word [es:arena_owner],0 ; FreePSPOwner - 40176 0000609A B82020 mov ax, ' ' ; mov ax,2020h - 40177 ;mov [es:8],ax - 40178 0000609D 26A30800 mov [es:arena_name+0],ax - 40179 000060A1 26A30A00 mov [es:arena_name+2],ax - 40180 000060A5 26A30C00 mov [es:arena_name+4],ax - 40181 ;mov [es:14],ax - 40182 000060A9 26A30E00 mov [es:arena_name+6],ax - 40183 ;pop ax - 40184 000060AD C3 retn - 40185 - 40186 ; ----------------------------------------------------------------------------- - 40187 ;*** findUMB - makes ES:0 point to the first MCB in UMB given as AL - 40188 ; -- returns UmbHEAD pointer (0x9FFF) if passed AL==0 + 40067 ; HU10--ES - MCB inside UMB; if it's a system MCB, + 40068 ; we're not in the same UMB, so exit. + 40069 ; ------------------------------------------------ + 40070 + 40071 hu10: + 40072 00006038 E80BFF call isSysMCB ; Returns with ZF set if owner is SYSTEM + 40073 0000603B 741C jz short huX ; If it is, we've finished the UMB. + 40074 0000603D E82800 call isFreeMCB ; Returns with ZF set if owner is 0 + 40075 00006040 7503 jnz short hu20 + 40076 + 40077 00006042 E82A00 call hideMCB + 40078 hu20: + 40079 ;mov al,[es:0] + 40080 00006045 26A00000 mov al,[es:arena_signature] + 40081 ;cmp al,'Z' + 40082 00006049 3C5A cmp al,arena_signature_end + 40083 0000604B 740C je short huX ; 'Z' means this was the last MCB... that's it. + 40084 + 40085 ;NextMCB es,ax ; Go on forward. + 40086 + 40087 0000604D 8CC0 mov ax,es ; NextMCB (macro) + 40088 ;add ax,[es:3] + 40089 0000604F 2603060300 add ax,[es:arena_size] + 40090 00006054 40 inc ax + 40091 00006055 8EC0 mov es,ax + 40092 + 40093 00006057 EBDF jmp short hu10 + 40094 huX: + 40095 ;popreg + 40096 + 40097 ;pop es + 40098 ;pop ax + 40099 + 40100 00006059 C3 retn + 40101 + 40102 ; ----------------------------------------------------------------------------- + 40103 ;*** isTiny - returns with ZF set if user didn't specify /S + 40104 ; ----------------------------------------------------------------------------- + 40105 ; ENTRY: None + 40106 ; EXIT: ZF set if user DIDN'T specify /S + 40107 ; ERROR: None + 40108 ; USES: Flags + 40109 ; ----------------------------------------------------------------------------- + 40110 + 40111 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40112 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40113 isTiny: + 40114 0000605A 50 push ax + 40115 + 40116 ;getdata al,fUmbTiny + 40117 0000605B 1E push ds + 40118 0000605C 8E1E[F59B] mov ds,[RESSEG] ; getdata (macro) + 40119 00006060 A0[3105] mov al,[fUmbTiny] + 40120 00006063 1F pop ds + 40121 + 40122 00006064 08C0 or al,al + 40123 00006066 58 pop ax + 40124 00006067 C3 retn + 40125 + 40126 ; ----------------------------------------------------------------------------- + 40127 ;*** isFreeMCB - returns with ZF set if current MCB (ES:0) is FREE + 40128 ; ----------------------------------------------------------------------------- + 40129 ; ENTRY: ES:0 should point to an MCB + 40130 ; EXIT: ZF set if MCB is free, else !ZF + 40131 ; ERROR: None + 40132 ; USES: Flags + 40133 ; ----------------------------------------------------------------------------- + 40134 + 40135 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40136 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40137 isFreeMCB: + 40138 ;or word [es:1],0 + 40139 00006068 26830E010000 or word [es:arena_owner],0 + 40140 0000606E C3 retn + 40141 + 40142 ; ----------------------------------------------------------------------------- + 40143 ;*** hideMCB - marks as HIDDEN the MCB at ES:0 + 40144 ; ----------------------------------------------------------------------------- + 40145 ; ENTRY: ES:0 should point to an MCB + 40146 ; EXIT: None; MCB marked as HIDDEN + 40147 ; ERROR: None + 40148 ; USES: None + 40149 ; ----------------------------------------------------------------------------- + 40150 + 40151 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40152 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40153 hideMCB: + 40154 ;mov word [es:1],8 + 40155 0000606F 26C70601000800 mov word [es:arena_owner],8 ; SystemPSPOwner + 40156 ;mov word [es:8],4948h ; 'HIDDEN ' + 40157 00006076 26C70608004849 mov word [es:arena_name+0], 'HI' ; 4948h + 40158 0000607D 26C7060A004444 mov word [es:arena_name+2], 'DD' ; 4444h + 40159 00006084 26C7060C00454E mov word [es:arena_name+4], 'EN' ; 4E45h + 40160 ;mov word [es:14],2020h + 40161 0000608B 26C7060E002020 mov word [es:arena_name+6], ' ' ; 2020h + 40162 00006092 C3 retn + 40163 + 40164 ; ----------------------------------------------------------------------------- + 40165 ;*** unHideMCB - marks as FREE the MCB at ES:0 + 40166 ; ----------------------------------------------------------------------------- + 40167 ; ENTRY: ES:0 should point to an MCB + 40168 ; EXIT: None; MCB marked as FREE + 40169 ; ERROR: None + 40170 ; USES: None + 40171 ; ----------------------------------------------------------------------------- + 40172 + 40173 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40174 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40175 unHideMCB: + 40176 ;push ax + 40177 ;mov word [es:1],0 + 40178 00006093 26C70601000000 mov word [es:arena_owner],0 ; FreePSPOwner + 40179 0000609A B82020 mov ax, ' ' ; mov ax,2020h + 40180 ;mov [es:8],ax + 40181 0000609D 26A30800 mov [es:arena_name+0],ax + 40182 000060A1 26A30A00 mov [es:arena_name+2],ax + 40183 000060A5 26A30C00 mov [es:arena_name+4],ax + 40184 ;mov [es:14],ax + 40185 000060A9 26A30E00 mov [es:arena_name+6],ax + 40186 ;pop ax + 40187 000060AD C3 retn + 40188 40189 ; ----------------------------------------------------------------------------- - 40190 ; ENTRY: AL should be to a valid UMB number - 40191 ; EXIT: ES:0 points to first MCB in UMB (_not_ the 8+SC MCB that heads it) - 40192 ; ERROR: Carry set if couldn't reach UMB (too high) - 40193 ; USES: Flags, ES - 40194 ; ----------------------------------------------------------------------------- - 40195 - 40196 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40197 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40198 findumb: - 40199 ;pushreg - 40200 - 40201 ;push ax - 40202 000060AE 51 push cx - 40203 000060AF 52 push dx - 40204 - 40205 000060B0 30E4 xor ah,ah ; Zap ah, so al==ax - 40206 - 40207 000060B2 89C2 mov dx,ax ; Store the to-be-found UMB number in DX - 40208 - 40209 000060B4 E882FE call UmbHead ; Returns first UMB segment in AX - 40210 - 40211 000060B7 8EC0 mov es,ax - 40212 000060B9 31C9 xor cx,cx ; Pretend we're on UMB 0 for now... + 40190 ;*** findUMB - makes ES:0 point to the first MCB in UMB given as AL + 40191 ; -- returns UmbHEAD pointer (0x9FFF) if passed AL==0 + 40192 ; ----------------------------------------------------------------------------- + 40193 ; ENTRY: AL should be to a valid UMB number + 40194 ; EXIT: ES:0 points to first MCB in UMB (_not_ the 8+SC MCB that heads it) + 40195 ; ERROR: Carry set if couldn't reach UMB (too high) + 40196 ; USES: Flags, ES + 40197 ; ----------------------------------------------------------------------------- + 40198 + 40199 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40200 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40201 findumb: + 40202 ;pushreg + 40203 + 40204 ;push ax + 40205 000060AE 51 push cx + 40206 000060AF 52 push dx + 40207 + 40208 000060B0 30E4 xor ah,ah ; Zap ah, so al==ax + 40209 + 40210 000060B2 89C2 mov dx,ax ; Store the to-be-found UMB number in DX + 40211 + 40212 000060B4 E882FE call UmbHead ; Returns first UMB segment in AX 40213 - 40214 ; --------------------------------------------- - 40215 ; FU10--CX - This UMB number; 0 == conventional - 40216 ; DX - The UMB number they're looking for - 40217 ; ES - The current MCB address - 40218 ; --------------------------------------------- - 40219 - 40220 fu10: - 40221 000060BB 39D1 cmp cx,dx ; If CX==DX, we've found the UMB we're - 40222 000060BD 741B je short fuX ; searching for--so exit. - 40223 - 40224 000060BF E884FE call isSysMCB ; Returns with ZF set if owner is SYSTEM - 40225 000060C2 7501 jnz short fu20 + 40214 000060B7 8EC0 mov es,ax + 40215 000060B9 31C9 xor cx,cx ; Pretend we're on UMB 0 for now... + 40216 + 40217 ; --------------------------------------------- + 40218 ; FU10--CX - This UMB number; 0 == conventional + 40219 ; DX - The UMB number they're looking for + 40220 ; ES - The current MCB address + 40221 ; --------------------------------------------- + 40222 + 40223 fu10: + 40224 000060BB 39D1 cmp cx,dx ; If CX==DX, we've found the UMB we're + 40225 000060BD 741B je short fuX ; searching for--so exit. 40226 - 40227 000060C4 41 inc cx ; If it _was_ SYSTEM, we're in a new UMB. - 40228 fu20: - 40229 ;mov al,[es:0] - 40230 000060C5 26A00000 mov al,[es:arena_signature] - 40231 ;cmp al,'Z' - 40232 000060C9 3C5A cmp al,arena_signature_end - 40233 000060CB 740C je short fuE ; 'Z' means this was the last MCB... that's it. - 40234 - 40235 ;NextMCB es,ax ; Go on forward. - 40236 - 40237 000060CD 8CC0 mov ax,es ; NextMCB (macro) - 40238 ;add ax,[es:3] - 40239 000060CF 2603060300 add ax,[es:arena_size] - 40240 000060D4 40 inc ax - 40241 000060D5 8EC0 mov es,ax - 40242 - 40243 000060D7 EBE2 jmp short fu10 - 40244 fuE: - 40245 000060D9 F9 stc - 40246 fuX: - 40247 ;popreg ; The address is already in ES. - 40248 - 40249 000060DA 5A pop dx - 40250 000060DB 59 pop cx + 40227 000060BF E884FE call isSysMCB ; Returns with ZF set if owner is SYSTEM + 40228 000060C2 7501 jnz short fu20 + 40229 + 40230 000060C4 41 inc cx ; If it _was_ SYSTEM, we're in a new UMB. + 40231 fu20: + 40232 ;mov al,[es:0] + 40233 000060C5 26A00000 mov al,[es:arena_signature] + 40234 ;cmp al,'Z' + 40235 000060C9 3C5A cmp al,arena_signature_end + 40236 000060CB 740C je short fuE ; 'Z' means this was the last MCB... that's it. + 40237 + 40238 ;NextMCB es,ax ; Go on forward. + 40239 + 40240 000060CD 8CC0 mov ax,es ; NextMCB (macro) + 40241 ;add ax,[es:3] + 40242 000060CF 2603060300 add ax,[es:arena_size] + 40243 000060D4 40 inc ax + 40244 000060D5 8EC0 mov es,ax + 40245 + 40246 000060D7 EBE2 jmp short fu10 + 40247 fuE: + 40248 000060D9 F9 stc + 40249 fuX: + 40250 ;popreg ; The address is already in ES. 40251 - 40252 ;pop ax - 40253 000060DC C3 retn - 40254 - 40255 ; ----------------------------------------------------------------------------- - 40256 ;*** BigFree - makes ES:0 point to the largest free MCB in UMB given as AL - 40257 ; ----------------------------------------------------------------------------- - 40258 ; ENTRY: AL should be to a valid UMB number - 40259 ; EXIT: ES:0 points to largest free MCB in UMB, AX returns its size - 40260 ; ERROR: Carry set if couldn't reach UMB (0 or too high) - 40261 ; USES: Flags, ES - 40262 ; ----------------------------------------------------------------------------- - 40263 - 40264 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40265 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6624h + 40252 000060DA 5A pop dx + 40253 000060DB 59 pop cx + 40254 + 40255 ;pop ax + 40256 000060DC C3 retn + 40257 + 40258 ; ----------------------------------------------------------------------------- + 40259 ;*** BigFree - makes ES:0 point to the largest free MCB in UMB given as AL + 40260 ; ----------------------------------------------------------------------------- + 40261 ; ENTRY: AL should be to a valid UMB number + 40262 ; EXIT: ES:0 points to largest free MCB in UMB, AX returns its size + 40263 ; ERROR: Carry set if couldn't reach UMB (0 or too high) + 40264 ; USES: Flags, ES + 40265 ; ----------------------------------------------------------------------------- 40266 - 40267 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40268 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:64A1h - 40269 BigFree: - 40270 ;pushreg - 40271 - 40272 ;push bx - 40273 000060DD 51 push cx - 40274 - 40275 000060DE E8CDFF call findumb ; Returns with CF if err, else ES==MCB - 40276 000060E1 7239 jc short bfX ; (would be "jc bfE"; it just does stc) + 40267 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40268 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6624h + 40269 + 40270 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40271 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:64A1h + 40272 BigFree: + 40273 ;pushreg + 40274 + 40275 ;push bx + 40276 000060DD 51 push cx 40277 - 40278 000060E3 31DB xor bx,bx ; Segment address of largest free MCB - 40279 000060E5 31C9 xor cx,cx ; Size of largest free MCB + 40278 000060DE E8CDFF call findumb ; Returns with CF if err, else ES==MCB + 40279 000060E1 7239 jc short bfX ; (would be "jc bfE"; it just does stc) 40280 - 40281 ; --------------------------------------------- - 40282 ; BF10--ES - Current MCB address - 40283 ; BX - Address of largest free MCB so far - 40284 ; CX - Size of largest free MCB so far - 40285 ; --------------------------------------------- - 40286 - 40287 bf10: - 40288 000060E7 E85CFE call isSysMCB ; If we've left the MCB, we're done. - 40289 000060EA 7427 jz short bf30 - 40290 - 40291 000060EC E879FF call isFreeMCB ; Returns with ZF set if owner is 0 - 40292 000060EF 750E jnz short bf20 + 40281 000060E3 31DB xor bx,bx ; Segment address of largest free MCB + 40282 000060E5 31C9 xor cx,cx ; Size of largest free MCB + 40283 + 40284 ; --------------------------------------------- + 40285 ; BF10--ES - Current MCB address + 40286 ; BX - Address of largest free MCB so far + 40287 ; CX - Size of largest free MCB so far + 40288 ; --------------------------------------------- + 40289 + 40290 bf10: + 40291 000060E7 E85CFE call isSysMCB ; If we've left the MCB, we're done. + 40292 000060EA 7427 jz short bf30 40293 - 40294 ;cmp cx,[es:3] - 40295 000060F1 263B0E0300 cmp cx,[es:arena_size] ; Compare sizes... - 40296 000060F6 7F07 jg short bf20 ; Unless we're bigger, - 40297 - 40298 000060F8 8CC3 mov bx,es ; Store this new element's address, - 40299 ;mov cx,[es:3] - 40300 000060FA 268B0E0300 mov cx,[es:arena_size] ; and its size. - 40301 bf20: - 40302 ;mov al,[es:0] - 40303 000060FF 26A00000 mov al,[es:arena_signature] - 40304 ;cmp al,'Z' ; 5Ah - 40305 00006103 3C5A cmp al,arena_signature_end - 40306 00006105 740C je short bf30 ; 'Z' means this was the last MCB. - 40307 - 40308 ;NextMCB es,ax ; Go on forward. - 40309 - 40310 00006107 8CC0 mov ax,es - 40311 ;add ax,[es:3] - 40312 00006109 2603060300 add ax,[es:arena_size] - 40313 0000610E 40 inc ax - 40314 0000610F 8EC0 mov es,ax - 40315 - 40316 00006111 EBD4 jmp short bf10 - 40317 bf30: - 40318 00006113 8EC3 mov es,bx ; Return the address - 40319 00006115 89C8 mov ax,cx ; Return the size - 40320 00006117 09DB or bx,bx - 40321 00006119 7501 jnz short bfX ; (if size==0, there's nothing free) - 40322 bfE: - 40323 0000611B F9 stc - 40324 bfX: - 40325 ;popreg - 40326 - 40327 0000611C 59 pop cx - 40328 ;pop bx + 40294 000060EC E879FF call isFreeMCB ; Returns with ZF set if owner is 0 + 40295 000060EF 750E jnz short bf20 + 40296 + 40297 ;cmp cx,[es:3] + 40298 000060F1 263B0E0300 cmp cx,[es:arena_size] ; Compare sizes... + 40299 000060F6 7F07 jg short bf20 ; Unless we're bigger, + 40300 + 40301 000060F8 8CC3 mov bx,es ; Store this new element's address, + 40302 ;mov cx,[es:3] + 40303 000060FA 268B0E0300 mov cx,[es:arena_size] ; and its size. + 40304 bf20: + 40305 ;mov al,[es:0] + 40306 000060FF 26A00000 mov al,[es:arena_signature] + 40307 ;cmp al,'Z' ; 5Ah + 40308 00006103 3C5A cmp al,arena_signature_end + 40309 00006105 740C je short bf30 ; 'Z' means this was the last MCB. + 40310 + 40311 ;NextMCB es,ax ; Go on forward. + 40312 + 40313 00006107 8CC0 mov ax,es + 40314 ;add ax,[es:3] + 40315 00006109 2603060300 add ax,[es:arena_size] + 40316 0000610E 40 inc ax + 40317 0000610F 8EC0 mov es,ax + 40318 + 40319 00006111 EBD4 jmp short bf10 + 40320 bf30: + 40321 00006113 8EC3 mov es,bx ; Return the address + 40322 00006115 89C8 mov ax,cx ; Return the size + 40323 00006117 09DB or bx,bx + 40324 00006119 7501 jnz short bfX ; (if size==0, there's nothing free) + 40325 bfE: + 40326 0000611B F9 stc + 40327 bfX: + 40328 ;popreg 40329 - 40330 0000611D C3 retn - 40331 - 40332 ; ----------------------------------------------------------------------------- - 40333 ;*** isSpecified - sets ZF if UMB in AL wasn't specified in DH/LH line. - 40334 ; ----------------------------------------------------------------------------- - 40335 ; ENTRY: AL should be to a valid UMB number - 40336 ; EXIT: ZF set if UMB wasn't specified, ZF clear if it was - 40337 ; ERROR: None - 40338 ; USES: Flags - 40339 ; ----------------------------------------------------------------------------- - 40340 - 40341 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40342 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40343 isSpecified: - 40344 ;push ax - 40345 - 40346 0000611E 30FF xor bh,bh - 40347 00006120 88C3 mov bl,al + 40330 0000611C 59 pop cx + 40331 ;pop bx + 40332 + 40333 0000611D C3 retn + 40334 + 40335 ; ----------------------------------------------------------------------------- + 40336 ;*** isSpecified - sets ZF if UMB in AL wasn't specified in DH/LH line. + 40337 ; ----------------------------------------------------------------------------- + 40338 ; ENTRY: AL should be to a valid UMB number + 40339 ; EXIT: ZF set if UMB wasn't specified, ZF clear if it was + 40340 ; ERROR: None + 40341 ; USES: Flags + 40342 ; ----------------------------------------------------------------------------- + 40343 + 40344 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40345 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40346 isSpecified: + 40347 ;push ax 40348 - 40349 ;getdata al,DS:UmbUsed[bx] - 40350 - 40351 00006122 1E push ds - 40352 00006123 8E1E[F59B] mov ds,[RESSEG] - 40353 00006127 8A87[5E04] mov al,[bx+UmbUsed] - 40354 0000612B 1F pop ds - 40355 - 40356 0000612C 08C0 or al,al ; Sets ZF if al==0 (ie, if unspecified) - 40357 - 40358 ;pop ax - 40359 0000612E C3 retn + 40349 0000611E 30FF xor bh,bh + 40350 00006120 88C3 mov bl,al + 40351 + 40352 ;getdata al,DS:UmbUsed[bx] + 40353 + 40354 00006122 1E push ds + 40355 00006123 8E1E[F59B] mov ds,[RESSEG] + 40356 00006127 8A87[5E04] mov al,[bx+UmbUsed] + 40357 0000612B 1F pop ds + 40358 + 40359 0000612C 08C0 or al,al ; Sets ZF if al==0 (ie, if unspecified) 40360 - 40361 ; ----------------------------------------------------------------------------- - 40362 ;*** shrinkMCB - breaks an MCB into two pieces, the lowest one's size==AX - 40363 ; ----------------------------------------------------------------------------- - 40364 ; ENTRY: AX == new size, ES:0 == current MCB - 40365 ; EXIT: None; MCB broken if carry clear - 40366 ; ERROR: Carry set if MCB isn't as large as AX+0x20 (not a useful split) - 40367 ; USES: Flags - 40368 ; ----------------------------------------------------------------------------- - 40369 ; If the size of the to-be-split MCB isn't at least 0x20 bytes greater than - 40370 ; the specified new size, the split is useless; if it's onnly 0x10 bytes, that - 40371 ; 0x10 will be used to make a header that mentions a 0-byte free space, and - 40372 ; that just sucks up 0x10 bytes for nothing. So we make 0x20 bytes the - 40373 ; minimum for performing a split. - 40374 ; ----------------------------------------------------------------------------- - 40375 - 40376 ;MIN_SPLIT_SIZE equ 20h - 40377 - 40378 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40379 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:667Ah + 40361 ;pop ax + 40362 0000612E C3 retn + 40363 + 40364 ; ----------------------------------------------------------------------------- + 40365 ;*** shrinkMCB - breaks an MCB into two pieces, the lowest one's size==AX + 40366 ; ----------------------------------------------------------------------------- + 40367 ; ENTRY: AX == new size, ES:0 == current MCB + 40368 ; EXIT: None; MCB broken if carry clear + 40369 ; ERROR: Carry set if MCB isn't as large as AX+0x20 (not a useful split) + 40370 ; USES: Flags + 40371 ; ----------------------------------------------------------------------------- + 40372 ; If the size of the to-be-split MCB isn't at least 0x20 bytes greater than + 40373 ; the specified new size, the split is useless; if it's onnly 0x10 bytes, that + 40374 ; 0x10 will be used to make a header that mentions a 0-byte free space, and + 40375 ; that just sucks up 0x10 bytes for nothing. So we make 0x20 bytes the + 40376 ; minimum for performing a split. + 40377 ; ----------------------------------------------------------------------------- + 40378 + 40379 ;MIN_SPLIT_SIZE equ 20h 40380 - 40381 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40382 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:64F7h - 40383 shrinkMCB: - 40384 ;pushreg - 40385 - 40386 ;push bx - 40387 0000612F 51 push cx ; * - 40388 00006130 26 psuh es ; ** - 40389 - 40390 00006131 89C3 mov bx,ax ; Move things around... and - 40391 00006133 8CC0 mov ax,es ; save this one for later. + 40381 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40382 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:667Ah + 40383 + 40384 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40385 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:64F7h + 40386 shrinkMCB: + 40387 ;pushreg + 40388 + 40389 ;push bx + 40390 0000612F 51 push cx ; * + 40391 00006130 26 psuh es ; ** 40392 - 40393 00006135 268B0E0300 mov cx,[es:arena_size] - 40394 0000613A 83E920 sub cx,32 ; sub cx,MIN_SPLIT_SIZE - 40395 ;cmp bx,cx ; {New size} vs {Current Size-20h} - 40396 ;ja short smE ; if wanted_size > cur-20h, abort. - 40397 0000613D 39D9 cmp cx,bx - 40398 0000613F 723E jb short smE ; cf = 1 (***) - 40399 - 40400 ;mov dl,[es:0] - 40401 00006141 268A160000 mov dl,[es:arena_signature] + 40393 00006131 89C3 mov bx,ax ; Move things around... and + 40394 00006133 8CC0 mov ax,es ; save this one for later. + 40395 + 40396 00006135 268B0E0300 mov cx,[es:arena_size] + 40397 0000613A 83E920 sub cx,32 ; sub cx,MIN_SPLIT_SIZE + 40398 ;cmp bx,cx ; {New size} vs {Current Size-20h} + 40399 ;ja short smE ; if wanted_size > cur-20h, abort. + 40400 0000613D 39D9 cmp cx,bx + 40401 0000613F 723E jb short smE ; cf = 1 (***) 40402 - 40403 ;;mov cx,[es:3] - 40404 ;mov cx,[es:arena_size] ; *! + 40403 ;mov dl,[es:0] + 40404 00006141 268A160000 mov dl,[es:arena_signature] 40405 - 40406 00006146 26891E0300 mov [es:arena_size],bx - 40407 ;mov byte [es:0],'M' ; 4Dh - 40408 0000614B 26C60600004D mov byte [es:arena_signature],'M' - 40409 - 40410 00006151 01D8 add ax,bx - 40411 00006153 40 inc ax - 40412 00006154 8EC0 mov es,ax ; Move to new arena area - 40413 - 40414 ;mov ax,cx ; !* - 40415 00006156 26A10300 mov ax,[es:arena_size] ; *! - 40416 0000615A 29D8 sub ax,bx - 40417 0000615C 48 dec ax ; And prepare the new size - 40418 - 40419 ;mov [es:0],dl - 40420 0000615D 2688160000 mov [es:arena_signature],dl - 40421 ;;mov word [es:1],0 - 40422 ;mov word [es:arena_owner],0 - 40423 ;mov [es:3],ax - 40424 00006162 26A30300 mov [es:arena_size],ax - 40425 00006166 B82020 mov ax,' ' ; mov ax,2020h - 40426 ;mov [es:8],ax - 40427 00006169 26A30800 mov [es:arena_name+0],ax - 40428 0000616D 26A30A00 mov [es:arena_name+2],ax - 40429 00006171 26A30C00 mov [es:arena_name+4],ax - 40430 ;mov [es:14],ax - 40431 00006175 26A30E00 mov [es:arena_name+6],ax - 40432 - 40433 ;clc - 40434 00006179 31C0 xor ax,ax - 40435 0000617B 26A30100 mov [es:arena_owner],ax ; 0 - 40436 ; cf = 0 - 40437 ;jmp short smX - 40438 smE: - 40439 ;stc ; cf = 1 (***) - 40440 smX: - 40441 ;popreg - 40442 0000617F 07 pop es ; ** - 40443 00006180 59 pop cx ; * - 40444 00006181 5B pop bx - 40445 - 40446 00006182 C3 retn - 40447 - 40448 ; ----------------------------------------------------------------------------- - 40449 ;*** hideUMB? - hides as appropriate the UMB in CL - 40450 ; ----------------------------------------------------------------------------- - 40451 ; ENTRY: CL should be to a valid UMB number, and AX to its address (findUMB) - 40452 ; EXIT: None; UMB is hidden as necessary - 40453 ; ERROR: None - 40454 ; USES: Flags, AX, CX - 40455 ; ----------------------------------------------------------------------------- - 40456 ; PRIMARY LOGIC: - 40457 ; - 40458 ; If the UMB is specified in the DH/LH statement, then: - 40459 ; If the largest free segment is too small (check specified size), then: - 40460 ; Pretend it wasn't ever specified, and fall out of this IF. - 40461 ; Else, if largest free segment is LARGER than specified size, then: - 40462 ; If /S was given on the command-line, then: - 40463 ; Break that element into two pieces - 40464 ; Set a flag that we're shrinking - 40465 ; Endif - 40466 ; Endif - 40467 ; Endif - 40468 ; If the UMB is NOT specified (or was removed by the above): - 40469 ; Hide all free elements in the UMB - 40470 ; If the flag that we're shrinking was set, then: - 40471 ; UN-hide the lower portion of the shrunken UMB - 40472 ; ENDIF - 40473 ; ENDIF - 40474 ; ----------------------------------------------------------------------------- - 40475 - 40476 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40477 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:66D7h + 40406 ;;mov cx,[es:3] + 40407 ;mov cx,[es:arena_size] ; *! + 40408 + 40409 00006146 26891E0300 mov [es:arena_size],bx + 40410 ;mov byte [es:0],'M' ; 4Dh + 40411 0000614B 26C60600004D mov byte [es:arena_signature],'M' + 40412 + 40413 00006151 01D8 add ax,bx + 40414 00006153 40 inc ax + 40415 00006154 8EC0 mov es,ax ; Move to new arena area + 40416 + 40417 ;mov ax,cx ; !* + 40418 00006156 26A10300 mov ax,[es:arena_size] ; *! + 40419 0000615A 29D8 sub ax,bx + 40420 0000615C 48 dec ax ; And prepare the new size + 40421 + 40422 ;mov [es:0],dl + 40423 0000615D 2688160000 mov [es:arena_signature],dl + 40424 ;;mov word [es:1],0 + 40425 ;mov word [es:arena_owner],0 + 40426 ;mov [es:3],ax + 40427 00006162 26A30300 mov [es:arena_size],ax + 40428 00006166 B82020 mov ax,' ' ; mov ax,2020h + 40429 ;mov [es:8],ax + 40430 00006169 26A30800 mov [es:arena_name+0],ax + 40431 0000616D 26A30A00 mov [es:arena_name+2],ax + 40432 00006171 26A30C00 mov [es:arena_name+4],ax + 40433 ;mov [es:14],ax + 40434 00006175 26A30E00 mov [es:arena_name+6],ax + 40435 + 40436 ;clc + 40437 00006179 31C0 xor ax,ax + 40438 0000617B 26A30100 mov [es:arena_owner],ax ; 0 + 40439 ; cf = 0 + 40440 ;jmp short smX + 40441 smE: + 40442 ;stc ; cf = 1 (***) + 40443 smX: + 40444 ;popreg + 40445 0000617F 07 pop es ; ** + 40446 00006180 59 pop cx ; * + 40447 00006181 5B pop bx + 40448 + 40449 00006182 C3 retn + 40450 + 40451 ; ----------------------------------------------------------------------------- + 40452 ;*** hideUMB? - hides as appropriate the UMB in CL + 40453 ; ----------------------------------------------------------------------------- + 40454 ; ENTRY: CL should be to a valid UMB number, and AX to its address (findUMB) + 40455 ; EXIT: None; UMB is hidden as necessary + 40456 ; ERROR: None + 40457 ; USES: Flags, AX, CX + 40458 ; ----------------------------------------------------------------------------- + 40459 ; PRIMARY LOGIC: + 40460 ; + 40461 ; If the UMB is specified in the DH/LH statement, then: + 40462 ; If the largest free segment is too small (check specified size), then: + 40463 ; Pretend it wasn't ever specified, and fall out of this IF. + 40464 ; Else, if largest free segment is LARGER than specified size, then: + 40465 ; If /S was given on the command-line, then: + 40466 ; Break that element into two pieces + 40467 ; Set a flag that we're shrinking + 40468 ; Endif + 40469 ; Endif + 40470 ; Endif + 40471 ; If the UMB is NOT specified (or was removed by the above): + 40472 ; Hide all free elements in the UMB + 40473 ; If the flag that we're shrinking was set, then: + 40474 ; UN-hide the lower portion of the shrunken UMB + 40475 ; ENDIF + 40476 ; ENDIF + 40477 ; ----------------------------------------------------------------------------- 40478 - 40479 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40480 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6554h - 40481 hideUMB?: - 40482 ;pushreg - 40483 - 40484 ;push bx - 40485 ;push dx - 40486 ;push es - 40487 - 40488 00006183 88C8 mov al,cl - 40489 00006185 E896FF call isSpecified ; Returns ZF set if al's umb was NOT specified - 40490 ;jz short hu?20 - 40491 ; 17/06/2023 - 40492 00006188 7432 jz short hu?25 ; * - 40493 - 40494 0000618A 88C8 mov al,cl ; Retrieve the size of the largest - 40495 0000618C E84EFF call BigFree ; free element in AX; put its address in ES - 40496 ;jc short hu?20 ; Oops. Errors mean skip this part. - 40497 ; 17/06/2023 - 40498 0000618F 723B jc short hu?X ; ** - 40499 - 40500 00006191 50 push ax ; TOS==size of BigFree in UMB (popped as BX) - 40501 00006192 88C8 mov al,cl ; Retrieve the user's specified - 40502 00006194 E88AFE call GetSize ; minimum size for this umb (into AX) - 40503 00006197 5B pop bx ; Now BX==BigFree, AX==Specified Size - 40504 - 40505 00006198 09C0 or ax,ax ; If they didn't specify one, - 40506 ;jz short hu?20 ; Skip over all this. - 40507 ; 17/06/2023 - 40508 0000619A 7530 jnz short hu?X ; ** - 40509 - 40510 0000619C 39D8 cmp ax,bx ; Ah... if (specified > max free) - 40511 0000619E 7607 jbe short hu?10 + 40479 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40480 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:66D7h + 40481 + 40482 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40483 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6554h + 40484 hideUMB?: + 40485 ;pushreg + 40486 + 40487 ;push bx + 40488 ;push dx + 40489 ;push es + 40490 + 40491 00006183 88C8 mov al,cl + 40492 00006185 E896FF call isSpecified ; Returns ZF set if al's umb was NOT specified + 40493 ;jz short hu?20 + 40494 ; 17/06/2023 + 40495 00006188 7432 jz short hu?25 ; * + 40496 + 40497 0000618A 88C8 mov al,cl ; Retrieve the size of the largest + 40498 0000618C E84EFF call BigFree ; free element in AX; put its address in ES + 40499 ;jc short hu?20 ; Oops. Errors mean skip this part. + 40500 ; 17/06/2023 + 40501 0000618F 723B jc short hu?X ; ** + 40502 + 40503 00006191 50 push ax ; TOS==size of BigFree in UMB (popped as BX) + 40504 00006192 88C8 mov al,cl ; Retrieve the user's specified + 40505 00006194 E88AFE call GetSize ; minimum size for this umb (into AX) + 40506 00006197 5B pop bx ; Now BX==BigFree, AX==Specified Size + 40507 + 40508 00006198 09C0 or ax,ax ; If they didn't specify one, + 40509 ;jz short hu?20 ; Skip over all this. + 40510 ; 17/06/2023 + 40511 0000619A 7530 jnz short hu?X ; ** 40512 - 40513 000061A0 88C8 mov al,cl ; Then mark that UMB as unused. Nya nya. - 40514 000061A2 E898FC call unMarkUMB - 40515 ;jmp short hu?20 ; *** - 40516 ; 17/06/2023 - 40517 ; ('isSpecified' would return with ZF=1) ; *** - 40518 000061A5 EB15 jmp short hu?25 - 40519 hu?10: - 40520 000061A7 E8B0FE call isTiny ; Returns ZF clear if user specified /S - 40521 ;jz short hu?20 - 40522 ; 17/06/2023 - 40523 ; ('isSpecified' would return with ZF=0) ; ** - 40524 000061AA 7420 jz short hu?X - 40525 - 40526 000061AC E880FF call shrinkMCB ; They specified /S, so shrink the MCB to AX - 40527 ;jc short hu?20 ; Ah... if didn't shrink after all, skip this: - 40528 ; 17/06/2023 - 40529 ; ('isSpecified' would return with ZF=0) ; ** - 40530 000061AF 721B jc short hu?X - 40531 - 40532 000061B1 8CC2 mov dx,es - 40533 000061B3 EB09 jmp short hu?30 ; Skip the spec check.. we wanna hide this one. - 40534 hu?20: - 40535 ;mov al,cl - 40536 000061B5 89C8 mov ax,cx - 40537 000061B7 E864FF call isSpecified ; If they specified this UMB, we're done... - 40538 000061BA 7510 jnz short hu?X ; ** ; so leave. - 40539 hu?25: ; 17/06/2023 ; * - 40540 000061BC 31D2 xor dx,dx - 40541 hu?30: - 40542 000061BE 88C8 mov al,cl - 40543 - 40544 000061C0 E870FE call hideUMB ; Hides everything in UMB #al - 40545 - 40546 000061C3 09D2 or dx,dx ; Did we shrink a UMB? If not, DX==0, - 40547 000061C5 7405 jz short hu?X ; So we should leave. + 40513 0000619C 39D8 cmp ax,bx ; Ah... if (specified > max free) + 40514 0000619E 7607 jbe short hu?10 + 40515 + 40516 000061A0 88C8 mov al,cl ; Then mark that UMB as unused. Nya nya. + 40517 000061A2 E898FC call unMarkUMB + 40518 ;jmp short hu?20 ; *** + 40519 ; 17/06/2023 + 40520 ; ('isSpecified' would return with ZF=1) ; *** + 40521 000061A5 EB15 jmp short hu?25 + 40522 hu?10: + 40523 000061A7 E8B0FE call isTiny ; Returns ZF clear if user specified /S + 40524 ;jz short hu?20 + 40525 ; 17/06/2023 + 40526 ; ('isSpecified' would return with ZF=0) ; ** + 40527 000061AA 7420 jz short hu?X + 40528 + 40529 000061AC E880FF call shrinkMCB ; They specified /S, so shrink the MCB to AX + 40530 ;jc short hu?20 ; Ah... if didn't shrink after all, skip this: + 40531 ; 17/06/2023 + 40532 ; ('isSpecified' would return with ZF=0) ; ** + 40533 000061AF 721B jc short hu?X + 40534 + 40535 000061B1 8CC2 mov dx,es + 40536 000061B3 EB09 jmp short hu?30 ; Skip the spec check.. we wanna hide this one. + 40537 hu?20: + 40538 ;mov al,cl + 40539 000061B5 89C8 mov ax,cx + 40540 000061B7 E864FF call isSpecified ; If they specified this UMB, we're done... + 40541 000061BA 7510 jnz short hu?X ; ** ; so leave. + 40542 hu?25: ; 17/06/2023 ; * + 40543 000061BC 31D2 xor dx,dx + 40544 hu?30: + 40545 000061BE 88C8 mov al,cl + 40546 + 40547 000061C0 E870FE call hideUMB ; Hides everything in UMB #al 40548 - 40549 000061C7 8EC2 mov es,dx ; Ah, but if it isn't, DX==the MCB's address; - 40550 000061C9 E8C7FE call unHideMCB ; Un-hides the lower portion of that MCB. - 40551 hu?X: - 40552 ;popreg - 40553 - 40554 ;pop es - 40555 ;pop dx - 40556 ;pop bx - 40557 - 40558 000061CC C3 retn - 40559 - 40560 ; ----------------------------------------------------------------------------- - 40561 ;*** UmbTest - returns with carry set if UMBs are not available, else CF==false - 40562 ; ----------------------------------------------------------------------------- - 40563 ; ENTRY: None - 40564 ; EXIT: Carry is clear if UMBs are available, or set if they are not - 40565 ; ERROR: None - 40566 ; USES: CF (AX,BX,DS,ES pushed 'cause they're used by others) - 40567 ; ----------------------------------------------------------------------------- - 40568 - 40569 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40570 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40571 UmbTest: - 40572 ;pushreg - 40573 - 40574 ;push ax - 40575 ;push bx - 40576 ;push ds - 40577 ;push es - 40578 - 40579 000061CD E88CFB call fm_link ; Link in UMBs (if not already linked) - 40580 000061D0 E80600 call WalkMem ; Check to see if they're really linked - 40581 000061D3 9C pushf ; And remember what we found out - 40582 000061D4 E89CFB call fm_unlink ; Unlink UMBs (if WE have linked 'em) - 40583 000061D7 9D popf ; And restore what we found out. - 40584 - 40585 ;popreg - 40586 - 40587 ;pop es - 40588 ;pop ds - 40589 ;pop bx - 40590 ;pop ax - 40591 - 40592 000061D8 C3 retn - 40593 - 40594 ; ----------------------------------------------------------------------------- - 40595 ;*** WalkMem - travels memory chain and returns carry clear iff UMBs are linked - 40596 ; ----------------------------------------------------------------------------- - 40597 ; ENTRY: None - 40598 ; EXIT: Carry SET if MCB chain stops before 9FFF, CLEAR if stops >= 9FFF. - 40599 ; ERROR: None - 40600 ; USES: Flags - 40601 ; ----------------------------------------------------------------------------- - 40602 - 40603 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40604 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40605 WalkMem: - 40606 ;pushreg - 40607 - 40608 ;push ax - 40609 ;push bx - 40610 000061D9 06 push es - 40611 - 40612 000061DA B452 mov ah,52h ; DOS_GET_DOS_LISTS - 40613 ; Call int 21h, function 52h... - 40614 000061DC CD21 int 21h - 40615 - 40616 000061DE 268B47FE mov ax,[es:bx-2] - 40617 ;mov es,ax ; * + 40549 000061C3 09D2 or dx,dx ; Did we shrink a UMB? If not, DX==0, + 40550 000061C5 7405 jz short hu?X ; So we should leave. + 40551 + 40552 000061C7 8EC2 mov es,dx ; Ah, but if it isn't, DX==the MCB's address; + 40553 000061C9 E8C7FE call unHideMCB ; Un-hides the lower portion of that MCB. + 40554 hu?X: + 40555 ;popreg + 40556 + 40557 ;pop es + 40558 ;pop dx + 40559 ;pop bx + 40560 + 40561 000061CC C3 retn + 40562 + 40563 ; ----------------------------------------------------------------------------- + 40564 ;*** UmbTest - returns with carry set if UMBs are not available, else CF==false + 40565 ; ----------------------------------------------------------------------------- + 40566 ; ENTRY: None + 40567 ; EXIT: Carry is clear if UMBs are available, or set if they are not + 40568 ; ERROR: None + 40569 ; USES: CF (AX,BX,DS,ES pushed 'cause they're used by others) + 40570 ; ----------------------------------------------------------------------------- + 40571 + 40572 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40573 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40574 UmbTest: + 40575 ;pushreg + 40576 + 40577 ;push ax + 40578 ;push bx + 40579 ;push ds + 40580 ;push es + 40581 + 40582 000061CD E88CFB call fm_link ; Link in UMBs (if not already linked) + 40583 000061D0 E80600 call WalkMem ; Check to see if they're really linked + 40584 000061D3 9C pushf ; And remember what we found out + 40585 000061D4 E89CFB call fm_unlink ; Unlink UMBs (if WE have linked 'em) + 40586 000061D7 9D popf ; And restore what we found out. + 40587 + 40588 ;popreg + 40589 + 40590 ;pop es + 40591 ;pop ds + 40592 ;pop bx + 40593 ;pop ax + 40594 + 40595 000061D8 C3 retn + 40596 + 40597 ; ----------------------------------------------------------------------------- + 40598 ;*** WalkMem - travels memory chain and returns carry clear iff UMBs are linked + 40599 ; ----------------------------------------------------------------------------- + 40600 ; ENTRY: None + 40601 ; EXIT: Carry SET if MCB chain stops before 9FFF, CLEAR if stops >= 9FFF. + 40602 ; ERROR: None + 40603 ; USES: Flags + 40604 ; ----------------------------------------------------------------------------- + 40605 + 40606 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40607 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40608 WalkMem: + 40609 ;pushreg + 40610 + 40611 ;push ax + 40612 ;push bx + 40613 000061D9 06 push es + 40614 + 40615 000061DA B452 mov ah,52h ; DOS_GET_DOS_LISTS + 40616 ; Call int 21h, function 52h... + 40617 000061DC CD21 int 21h 40618 - 40619 ; ------------------------------ - 40620 ; UM10: ES = Current MCB pointer - 40621 ; ------------------------------ - 40622 - 40623 um10: - 40624 000061E2 8EC0 mov es,ax ; * + 40619 000061DE 268B47FE mov ax,[es:bx-2] + 40620 ;mov es,ax ; * + 40621 + 40622 ; ------------------------------ + 40623 ; UM10: ES = Current MCB pointer + 40624 ; ------------------------------ 40625 - 40626 ;mov al,[es:0] - 40627 000061E4 26A00000 mov al,[es:arena_signature] - 40628 ;cmp al,'Z' ; 5Ah - 40629 000061E8 3C5A cmp al,arena_signature_end - 40630 000061EA 740A je short um20 ; If signature == 'Z', hay no more. - 40631 - 40632 ;NextMCB es,bx ; Move to the next MCB - 40633 - 40634 ;mov bx,es - 40635 ;;add bx,[es:3] - 40636 ;add bx,[es:arena_size] - 40637 ;inc bx - 40638 ;mov es,bx - 40639 000061EC 8CC0 mov ax,es - 40640 000061EE 2603060300 add ax,[es:arena_size] - 40641 000061F3 40 inc ax - 40642 ;mov es,ax ; * - 40643 - 40644 000061F4 EBEC jmp short um10 ; And restart the loop. - 40645 um20: - 40646 000061F6 8CC0 mov ax,es - 40647 000061F8 3DFF9F cmp ax,9FFFh ; This sets CF if ax < 9FFF. - 40648 - 40649 ;popreg - 40650 000061FB 07 pop es - 40651 ;pop bx - 40652 ;pop ax - 40653 - 40654 000061FC C3 retn - 40655 - 40656 ; ----------------------------------------------------------------------------- - 40657 ;*** hl_unlink - unlinks UMBs if fm_umb is set to 0; restores strategy too - 40658 ; ----------------------------------------------------------------------------- - 40659 ; ENTRY: fm_umb == 1 : leave linked, else unlink - 40660 ; EXIT: None - 40661 ; ERROR: None - 40662 ; USES: AX, BX - 40663 ; ----------------------------------------------------------------------------- - 40664 - 40665 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 40666 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:681Ch + 40626 um10: + 40627 000061E2 8EC0 mov es,ax ; * + 40628 + 40629 ;mov al,[es:0] + 40630 000061E4 26A00000 mov al,[es:arena_signature] + 40631 ;cmp al,'Z' ; 5Ah + 40632 000061E8 3C5A cmp al,arena_signature_end + 40633 000061EA 740A je short um20 ; If signature == 'Z', hay no more. + 40634 + 40635 ;NextMCB es,bx ; Move to the next MCB + 40636 + 40637 ;mov bx,es + 40638 ;;add bx,[es:3] + 40639 ;add bx,[es:arena_size] + 40640 ;inc bx + 40641 ;mov es,bx + 40642 000061EC 8CC0 mov ax,es + 40643 000061EE 2603060300 add ax,[es:arena_size] + 40644 000061F3 40 inc ax + 40645 ;mov es,ax ; * + 40646 + 40647 000061F4 EBEC jmp short um10 ; And restart the loop. + 40648 um20: + 40649 000061F6 8CC0 mov ax,es + 40650 000061F8 3DFF9F cmp ax,9FFFh ; This sets CF if ax < 9FFF. + 40651 + 40652 ;popreg + 40653 000061FB 07 pop es + 40654 ;pop bx + 40655 ;pop ax + 40656 + 40657 000061FC C3 retn + 40658 + 40659 ; ----------------------------------------------------------------------------- + 40660 ;*** hl_unlink - unlinks UMBs if fm_umb is set to 0; restores strategy too + 40661 ; ----------------------------------------------------------------------------- + 40662 ; ENTRY: fm_umb == 1 : leave linked, else unlink + 40663 ; EXIT: None + 40664 ; ERROR: None + 40665 ; USES: AX, BX + 40666 ; ----------------------------------------------------------------------------- 40667 - 40668 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40669 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6699h - 40670 hl_unlink: - 40671 000061FD 1E push ds ; * - 40672 - 40673 000061FE 30FF xor bh,bh - 40674 ;getdata bl,fm_umb ; Restore original link-state + 40668 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 40669 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:681Ch + 40670 + 40671 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40672 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6699h + 40673 hl_unlink: + 40674 000061FD 1E push ds ; * 40675 - 40676 ;push ds - 40677 00006200 8E1E[F59B] mov ds,[RESSEG] - 40678 00006204 8A1E[3505] mov bl,[fm_umb] ; Restore original link-state - 40679 ;pop ds - 40680 - 40681 00006208 B80358 mov ax,5803h ; DOS_SET_UMBLINK - 40682 0000620B CD21 int 21h - 40683 - 40684 0000620D 30FF xor bh,bh - 40685 - 40686 ;getdata bl,fm_strat ; Restore original mem-alloc strategy - 40687 - 40688 ;push ds - 40689 ;mov ds,[RESSEG] - 40690 0000620F 8A1E[3605] mov bl,[fm_strat] ;Restore original mem-alloc strategy - 40691 ;pop ds - 40692 - 40693 00006213 B80158 mov ax,5801h ; DOS_SET_STRATEGY - 40694 00006216 CD21 int 21h + 40676 000061FE 30FF xor bh,bh + 40677 ;getdata bl,fm_umb ; Restore original link-state + 40678 + 40679 ;push ds + 40680 00006200 8E1E[F59B] mov ds,[RESSEG] + 40681 00006204 8A1E[3505] mov bl,[fm_umb] ; Restore original link-state + 40682 ;pop ds + 40683 + 40684 00006208 B80358 mov ax,5803h ; DOS_SET_UMBLINK + 40685 0000620B CD21 int 21h + 40686 + 40687 0000620D 30FF xor bh,bh + 40688 + 40689 ;getdata bl,fm_strat ; Restore original mem-alloc strategy + 40690 + 40691 ;push ds + 40692 ;mov ds,[RESSEG] + 40693 0000620F 8A1E[3605] mov bl,[fm_strat] ;Restore original mem-alloc strategy + 40694 ;pop ds 40695 - 40696 00006218 1F pop ds ; * - 40697 - 40698 00006219 C3 retn - 40699 - 40700 ;============================================================================ - 40701 ; LOADHIGH.ASM, MSDOS 6.0, 1991 - 40702 ;============================================================================ - 40703 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 40704 - 40705 ; This is a new module added to support loading programs into UMBs provided - 40706 ; by DOS 5.0. - 40707 ; --------------------------------------------------------------------------- - 40708 ; Usage: - 40709 ; - 40710 ; LOADHIGH [/L:umb[,size][;umb[,size]]*] - 40711 ; - 40712 ; has to be a filename that is not wildcarded. - 40713 - 40714 ; --------------------------------------------------------------------------- - 40715 ; - 40716 ; Revision History - 40717 ; ================ + 40696 00006213 B80158 mov ax,5801h ; DOS_SET_STRATEGY + 40697 00006216 CD21 int 21h + 40698 + 40699 00006218 1F pop ds ; * + 40700 + 40701 00006219 C3 retn + 40702 + 40703 ;============================================================================ + 40704 ; LOADHIGH.ASM, MSDOS 6.0, 1991 + 40705 ;============================================================================ + 40706 ; 12/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 40707 + 40708 ; This is a new module added to support loading programs into UMBs provided + 40709 ; by DOS 5.0. + 40710 ; --------------------------------------------------------------------------- + 40711 ; Usage: + 40712 ; + 40713 ; LOADHIGH [/L:umb[,size][;umb[,size]]*] + 40714 ; + 40715 ; has to be a filename that is not wildcarded. + 40716 + 40717 ; --------------------------------------------------------------------------- 40718 ; - 40719 ; M009 SR 08/01/90 Set flags to indicate that we are - 40720 ; loading and high and also remember - 40721 ; current UMB state. - 40722 ; - 40723 ; M016 SR 08/09/90 Give special error message on attempt - 40724 ; to loadhigh batch files and invalid - 40725 ; filename on Loadhigh command line. - 40726 ; - 40727 ; M039 SR 11/19/90 Bug #4270. Copy all the whitespaces - 40728 ; after the program name also as part - 40729 ; of the command line being passed to - 40730 ; the program to be invoked. - 40731 ; - 40732 ; --------------------------------------------------------------------------- - 40733 - 40734 ; --------------------------------------------------------------------------- - 40735 ; - 40736 ; include highload.inc ; Grab code for ParseVar and such - 40737 - 40738 iCmdLine equ 81h ; PSP:81h points to command-line - 40739 - 40740 ; - 40741 ; --------------------------------------------------------------------------- + 40719 ; Revision History + 40720 ; ================ + 40721 ; + 40722 ; M009 SR 08/01/90 Set flags to indicate that we are + 40723 ; loading and high and also remember + 40724 ; current UMB state. + 40725 ; + 40726 ; M016 SR 08/09/90 Give special error message on attempt + 40727 ; to loadhigh batch files and invalid + 40728 ; filename on Loadhigh command line. + 40729 ; + 40730 ; M039 SR 11/19/90 Bug #4270. Copy all the whitespaces + 40731 ; after the program name also as part + 40732 ; of the command line being passed to + 40733 ; the program to be invoked. + 40734 ; + 40735 ; --------------------------------------------------------------------------- + 40736 + 40737 ; --------------------------------------------------------------------------- + 40738 ; + 40739 ; include highload.inc ; Grab code for ParseVar and such + 40740 + 40741 iCmdLine equ 81h ; PSP:81h points to command-line 40742 - 40743 ;**** LoadHigh -- Main routine for Loadhigh command - 40744 ; - 40745 ; ENTRY Command line tail is at PSP:iCmdLine terminated by 0dh - 40746 ; CS = DS = SS = TRANGROUP + 40743 ; + 40744 ; --------------------------------------------------------------------------- + 40745 + 40746 ;**** LoadHigh -- Main routine for Loadhigh command 40747 ; - 40748 ; EXIT None - 40749 ; - 40750 ; USED ax, bx, cx, dx, si, di, es - 40751 ; - 40752 ; ERROR EXITS - 40753 ; Message pointers are setup at the error locations and then - 40754 ; we jump back to CERROR which is the transient error recycle point. - 40755 ; Apart from parse errors, the other errors handled are too many - 40756 ; switches anf invalid filenames. - 40757 ; - 40758 ; EFFECTS - 40759 ; The allocation strategy and the state of the arena chain are - 40760 ; put in the requested state according to the given options. If a - 40761 ; filename is also given, it is executed as well. - 40762 ; --------------------------------------------------------------------------- - 40763 - 40764 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 40765 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5927h + 40748 ; ENTRY Command line tail is at PSP:iCmdLine terminated by 0dh + 40749 ; CS = DS = SS = TRANGROUP + 40750 ; + 40751 ; EXIT None + 40752 ; + 40753 ; USED ax, bx, cx, dx, si, di, es + 40754 ; + 40755 ; ERROR EXITS + 40756 ; Message pointers are setup at the error locations and then + 40757 ; we jump back to CERROR which is the transient error recycle point. + 40758 ; Apart from parse errors, the other errors handled are too many + 40759 ; switches anf invalid filenames. + 40760 ; + 40761 ; EFFECTS + 40762 ; The allocation strategy and the state of the arena chain are + 40763 ; put in the requested state according to the given options. If a + 40764 ; filename is also given, it is executed as well. + 40765 ; --------------------------------------------------------------------------- 40766 - 40767 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 40768 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:683Fh + 40767 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 40768 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5927h 40769 - 40770 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40771 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66BCh - 40772 LoadHigh: - 40773 0000621A 1E push ds - 40774 0000621B 07 pop es - 40775 - 40776 ; 16/06/2023 - 40777 ;call SkipLhDelims ; MSDOS 5.0 ! - 40778 - 40779 ;Get command tail to be passed to the program. This includes any whitespace - 40780 ;chars between the program name and its parameters as well. - 40781 ;On return, ds:si points at the start of the command tail. - 40782 - 40783 ; 16/06/2023 - 40784 ;push si ; MSDOS 5.0 ! - 40785 0000621C E81300 call ParseLhCmd - 40786 ;pop si ; MSDOS 5.0 ! - 40787 0000621F 720E jc short LhErr - 40788 - 40789 00006221 E86500 call SetupCmdLine ;setup pgm's command line - 40790 - 40791 00006224 E88700 call SetupPath ;setup path for file - 40792 00006227 7206 jc short LhErr ;file not found + 40770 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 40771 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:683Fh + 40772 + 40773 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40774 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66BCh + 40775 LoadHigh: + 40776 0000621A 1E push ds + 40777 0000621B 07 pop es + 40778 + 40779 ; 16/06/2023 + 40780 ;call SkipLhDelims ; MSDOS 5.0 ! + 40781 + 40782 ;Get command tail to be passed to the program. This includes any whitespace + 40783 ;chars between the program name and its parameters as well. + 40784 ;On return, ds:si points at the start of the command tail. + 40785 + 40786 ; 16/06/2023 + 40787 ;push si ; MSDOS 5.0 ! + 40788 0000621C E81300 call ParseLhCmd + 40789 ;pop si ; MSDOS 5.0 ! + 40790 0000621F 720E jc short LhErr + 40791 + 40792 00006221 E86500 call SetupCmdLine ;setup pgm's command line 40793 - 40794 ;Set allocation strategy to HighFirst and link in UMBs for exec. This will - 40795 ;be reset after return from the Exec - 40796 ;We will also set a resident flag to indicate that UMBs were activated for - 40797 ;the Exec. On return from the Exec, this flag will be used to deactivate UMBs - 40798 - 40799 00006229 E8AFFD call HideUMBs ;prepare upper-memory for load - 40800 - 40801 0000622C E900CB jmp LH_EXECUTE ;go and exec file ;M051 - 40802 - 40803 LhErr: - 40804 ;The error message has been setup at this stage + 40794 00006224 E88700 call SetupPath ;setup path for file + 40795 00006227 7206 jc short LhErr ;file not found + 40796 + 40797 ;Set allocation strategy to HighFirst and link in UMBs for exec. This will + 40798 ;be reset after return from the Exec + 40799 ;We will also set a resident flag to indicate that UMBs were activated for + 40800 ;the Exec. On return from the Exec, this flag will be used to deactivate UMBs + 40801 + 40802 00006229 E8AFFD call HideUMBs ;prepare upper-memory for load + 40803 + 40804 0000622C E900CB jmp LH_EXECUTE ;go and exec file ;M051 40805 - 40806 0000622F E9F4CA jmp cerror ;print error message and recycle - 40807 - 40808 ; --------------------------------------------------------------------------- - 40809 - 40810 ;*** ParseLhCmd - parses any command-line options - 40811 ; - 40812 ; ENTRY None - 40813 ; - 40814 ; EXIT Carry clear -- command line parsed successfully - 40815 ; Carry set -- appropriate error message setup + 40806 LhErr: + 40807 ;The error message has been setup at this stage + 40808 + 40809 0000622F E9F4CA jmp cerror ;print error message and recycle + 40810 + 40811 ; --------------------------------------------------------------------------- + 40812 + 40813 ;*** ParseLhCmd - parses any command-line options + 40814 ; + 40815 ; ENTRY None 40816 ; - 40817 ; USED ax, si - 40818 ; - 40819 ; EFFECTS - 40820 ; Options set up (see highvar.inc) - 40821 ; Filename to be executed setup - 40822 ; - 40823 ; ParseLhCmd calls InitVar to initialize data filled in by ParseVar, - 40824 ; then calls ParseVar itself to actually parse the commmand-line. On - 40825 ; return from ParseVar, DS:SI will point to the beginning of the child - 40826 ; module's name on the command-line; thus it calls LhCopyFilename to - 40827 ; prepare the command-line for that program. - 40828 ; --------------------------------------------------------------------------- - 40829 - 40830 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 40831 %if 0 - 40832 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 40833 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5944h - 40834 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) - 40835 ; 11/06/2023 - 40836 ParseLhCmd: - 40837 ;mov si,81h - 40838 mov si,iCmdLine ;ds:si points at command line - 40839 - 40840 mov word [COMSW],0 - 40841 mov di,Parse_LoadHi - 40842 xor cx,cx - 40843 call Parse_With_Msg - 40844 - 40845 ; 11/06/2023 - 40846 ;cmp ax,0FFFFh ; -1 - 40847 ;jz short PLhCmd2 - 40848 ;cmp ax,0 - 40849 ;jnz short PLhCmd1 - 40850 ; 11/06/2023 - 40851 inc ax ; cmp ax,-1 - 40852 jz short PLhCmd2 ; 0FFFFh -> 0 - 40853 dec ax ; cmp ax,0 - 40854 jnz short PLhCmd1 ; 1 -> 0 - 40855 ; ax = 0 - 40856 - 40857 mov bx,dx - 40858 ; 14/04/2023 - 40859 ;call LhCopyFilename - 40860 ;; 13/04/2023 - 40861 ;;;jc short PLhCmd2 ; !!! jmp short PLhCmd2 !!! - 40862 ;;jmp short PLhCmd2 - 40863 ;retn - 40864 ; 14/04/2023 - 40865 jmp short LhCopyFilename - 40866 PLhCmd1: - 40867 stc - 40868 PLhCmd2: - 40869 retn - 40870 %endif - 40871 - 40872 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 40873 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6857h - 40874 ; MSDOS 6.0 - 40875 - 40876 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 40877 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66D4h - 40878 ParseLhCmd: - 40879 ;assume ds:TRANGROUP, es:TRANGROUP - 40880 - 40881 ;mov si,81h - 40882 00006232 BE8100 mov si,iCmdLine ;ds:si points at command line - 40883 - 40884 ; es = ds (from 'LoadHigh') - 40885 ;push es ;Store ES 'cause we're gonna change it: + 40817 ; EXIT Carry clear -- command line parsed successfully + 40818 ; Carry set -- appropriate error message setup + 40819 ; + 40820 ; USED ax, si + 40821 ; + 40822 ; EFFECTS + 40823 ; Options set up (see highvar.inc) + 40824 ; Filename to be executed setup + 40825 ; + 40826 ; ParseLhCmd calls InitVar to initialize data filled in by ParseVar, + 40827 ; then calls ParseVar itself to actually parse the commmand-line. On + 40828 ; return from ParseVar, DS:SI will point to the beginning of the child + 40829 ; module's name on the command-line; thus it calls LhCopyFilename to + 40830 ; prepare the command-line for that program. + 40831 ; --------------------------------------------------------------------------- + 40832 + 40833 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 40834 %if 0 + 40835 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 40836 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5944h + 40837 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) + 40838 ; 11/06/2023 + 40839 ParseLhCmd: + 40840 ;mov si,81h + 40841 mov si,iCmdLine ;ds:si points at command line + 40842 + 40843 mov word [COMSW],0 + 40844 mov di,Parse_LoadHi + 40845 xor cx,cx + 40846 call Parse_With_Msg + 40847 + 40848 ; 11/06/2023 + 40849 ;cmp ax,0FFFFh ; -1 + 40850 ;jz short PLhCmd2 + 40851 ;cmp ax,0 + 40852 ;jnz short PLhCmd1 + 40853 ; 11/06/2023 + 40854 inc ax ; cmp ax,-1 + 40855 jz short PLhCmd2 ; 0FFFFh -> 0 + 40856 dec ax ; cmp ax,0 + 40857 jnz short PLhCmd1 ; 1 -> 0 + 40858 ; ax = 0 + 40859 + 40860 mov bx,dx + 40861 ; 14/04/2023 + 40862 ;call LhCopyFilename + 40863 ;; 13/04/2023 + 40864 ;;;jc short PLhCmd2 ; !!! jmp short PLhCmd2 !!! + 40865 ;;jmp short PLhCmd2 + 40866 ;retn + 40867 ; 14/04/2023 + 40868 jmp short LhCopyFilename + 40869 PLhCmd1: + 40870 stc + 40871 PLhCmd2: + 40872 retn + 40873 %endif + 40874 + 40875 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 40876 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6857h + 40877 ; MSDOS 6.0 + 40878 + 40879 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 40880 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66D4h + 40881 ParseLhCmd: + 40882 ;assume ds:TRANGROUP, es:TRANGROUP + 40883 + 40884 ;mov si,81h + 40885 00006232 BE8100 mov si,iCmdLine ;ds:si points at command line 40886 - 40887 ;push ds - 40888 ;pop es ;Make sure es:si points to cmd line as well + 40887 ; es = ds (from 'LoadHigh') + 40888 ;push es ;Store ES 'cause we're gonna change it: 40889 - 40890 00006235 E8ACFA call InitVar ;Initialize data for ParseVar - 40891 - 40892 00006238 E84AFB call ParseVar ;And parse the command line - 40893 - 40894 ;pop es ;Restore ES now; we're done with it. - 40895 - 40896 0000623B 7317 jnc short plcC ;If no error, continue on our way. - 40897 - 40898 0000623D 83F802 cmp ax,2 ; PV_BadUMB - 40899 ;Bad UMB passed? - 40900 00006240 7505 jne short plc10 - 40901 ;mov dx,offset TRANGROUP:LhBadUMB_Ptr - 40902 00006242 BA[D292] mov dx,LhBadUMB_Ptr - 40903 00006245 F9 stc - 40904 00006246 C3 retn - 40905 plc10: - 40906 ;mov dx,offset TRANGROUP:LhInvSwt_Ptr - 40907 00006247 BA[CF92] mov dx,LhInvSwt_Ptr - 40908 0000624A 83F803 cmp ax,3 ; PV_InvSwt - 40909 ;Unrecognized switch passed? - 40910 0000624D 7403 je short plc20 - 40911 ;mov dx,offset TRANGROUP:LhInvArg_Ptr - 40912 0000624F BA[C992] mov dx,LhInvArg_Ptr - 40913 plc20: - 40914 00006252 F9 stc - 40915 00006253 C3 retn - 40916 plcC: - 40917 ;call LhCopyFilename ;copy filename into our buffer - 40918 ;retn ;Return-- carry=status - 40919 ; 16/06/2023 - 40920 ;jmp short LhCopyFilename - 40921 - 40922 ; --------------------------------------------------------------------------- - 40923 - 40924 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 40925 - 40926 ; --------------------------------------------------------------------------- - 40927 ; HIGHLOAD.INC, MSDOS 6.0, 1992 - 40928 ; --------------------------------------------------------------------------- - 40929 - 40930 ; 13/04/2023 - 40931 ; MSDOS 5.0 COMMAND.COM only ! - 40932 ; (Procedure names are not from original Microsoft source code!) - 40933 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:596Ah - 40934 ;set_strategy: - 40935 ;mov ax,5800h ; DOS_CHECK_STRATEGY - 40936 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 40937 ; ; AL = function code: get allocation strategy - 40938 ;mov bx,ax - 40939 ;or bx,80h - 40940 ;mov ax,5801h ; DOS_SET_STRATEGY - 40941 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 40942 ; ; AL = function code: set allocation strategy - 40943 ;retn - 40944 - 40945 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:597Bh - 40946 ;set_umblink: - 40947 ;mov ax,5803h ; DOS_SET_UMBLINK - 40948 ;mov bx,1 - 40949 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 40950 ; ; AL = function code: (DOS 5beta) set UMB link state - 40951 ;retn - 40952 - 40953 ; --------------------------------------------------------------------------- - 40954 - 40955 ;*** LhCopyFilename -- copy filename from command line to buffer - 40956 ; - 40957 ; ENTRY ds:si points at primary argument (filename) - 40958 ; - 40959 ; EXIT Carry set -- filename has wildcards. In this event, DX will - 40960 ; already contain an appropriate error number. - 40961 ; Carry clear -- filename has been copied as needed; DS:SI - 40962 ; points to first character (most likely space) - 40963 ; after filename. - 40964 ; - 40965 ; USED ax, si - 40966 ; - 40967 ; EFFECTS - 40968 ; ExecPath contains the filename + 40890 ;push ds + 40891 ;pop es ;Make sure es:si points to cmd line as well + 40892 + 40893 00006235 E8ACFA call InitVar ;Initialize data for ParseVar + 40894 + 40895 00006238 E84AFB call ParseVar ;And parse the command line + 40896 + 40897 ;pop es ;Restore ES now; we're done with it. + 40898 + 40899 0000623B 7317 jnc short plcC ;If no error, continue on our way. + 40900 + 40901 0000623D 83F802 cmp ax,2 ; PV_BadUMB + 40902 ;Bad UMB passed? + 40903 00006240 7505 jne short plc10 + 40904 ;mov dx,offset TRANGROUP:LhBadUMB_Ptr + 40905 00006242 BA[D292] mov dx,LhBadUMB_Ptr + 40906 00006245 F9 stc + 40907 00006246 C3 retn + 40908 plc10: + 40909 ;mov dx,offset TRANGROUP:LhInvSwt_Ptr + 40910 00006247 BA[CF92] mov dx,LhInvSwt_Ptr + 40911 0000624A 83F803 cmp ax,3 ; PV_InvSwt + 40912 ;Unrecognized switch passed? + 40913 0000624D 7403 je short plc20 + 40914 ;mov dx,offset TRANGROUP:LhInvArg_Ptr + 40915 0000624F BA[C992] mov dx,LhInvArg_Ptr + 40916 plc20: + 40917 00006252 F9 stc + 40918 00006253 C3 retn + 40919 plcC: + 40920 ;call LhCopyFilename ;copy filename into our buffer + 40921 ;retn ;Return-- carry=status + 40922 ; 16/06/2023 + 40923 ;jmp short LhCopyFilename + 40924 + 40925 ; --------------------------------------------------------------------------- + 40926 + 40927 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 40928 + 40929 ; --------------------------------------------------------------------------- + 40930 ; HIGHLOAD.INC, MSDOS 6.0, 1992 + 40931 ; --------------------------------------------------------------------------- + 40932 + 40933 ; 13/04/2023 + 40934 ; MSDOS 5.0 COMMAND.COM only ! + 40935 ; (Procedure names are not from original Microsoft source code!) + 40936 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:596Ah + 40937 ;set_strategy: + 40938 ;mov ax,5800h ; DOS_CHECK_STRATEGY + 40939 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 40940 ; ; AL = function code: get allocation strategy + 40941 ;mov bx,ax + 40942 ;or bx,80h + 40943 ;mov ax,5801h ; DOS_SET_STRATEGY + 40944 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 40945 ; ; AL = function code: set allocation strategy + 40946 ;retn + 40947 + 40948 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:597Bh + 40949 ;set_umblink: + 40950 ;mov ax,5803h ; DOS_SET_UMBLINK + 40951 ;mov bx,1 + 40952 ;int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 40953 ; ; AL = function code: (DOS 5beta) set UMB link state + 40954 ;retn + 40955 + 40956 ; --------------------------------------------------------------------------- + 40957 + 40958 ;*** LhCopyFilename -- copy filename from command line to buffer + 40959 ; + 40960 ; ENTRY ds:si points at primary argument (filename) + 40961 ; + 40962 ; EXIT Carry set -- filename has wildcards. In this event, DX will + 40963 ; already contain an appropriate error number. + 40964 ; Carry clear -- filename has been copied as needed; DS:SI + 40965 ; points to first character (most likely space) + 40966 ; after filename. + 40967 ; + 40968 ; USED ax, si 40969 ; - 40970 ; If there are any wildcards in the filename, then we have an error - 40971 ; --------------------------------------------------------------------------- - 40972 - 40973 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 40974 %if 0 - 40975 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 40976 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5984h - 40977 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) - 40978 LhCopyFilename: - 40979 push ds - 40980 push si - 40981 push di - 40982 lds si,[bx+4] - 40983 mov di,EXECPATH - 40984 lhcpfn1: - 40985 lodsb - 40986 cmp al,2Ah ; '*' - 40987 jz short lhfilerr - 40988 cmp al,3Fh ; '?' - 40989 jz short lhfilerr - 40990 stosb - 40991 or al,al - 40992 jnz short lhcpfn1 - 40993 ; 14/04/2023 - 40994 ; cf = 0 - 40995 ;clc - 40996 lhfilerr2: - 40997 pop di - 40998 pop si - 40999 pop ds - 41000 retn - 41001 lhfilerr: - 41002 mov dx,LhInvFil_Ptr - 41003 stc - 41004 jmp short lhfilerr2 - 41005 - 41006 %endif - 41007 - 41008 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM - 41009 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6881h - 41010 ; MSDOS 6.0 - 41011 - 41012 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 41013 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66FEh - 41014 LhCopyFilename: - 41015 ;assume ds:TRANGROUP, es:TRANGROUP - 41016 - 41017 ;mov di,offset TRANGROUP:ExecPath - 41018 00006254 BF[1D9B] mov di,EXECPATH + 40970 ; EFFECTS + 40971 ; ExecPath contains the filename + 40972 ; + 40973 ; If there are any wildcards in the filename, then we have an error + 40974 ; --------------------------------------------------------------------------- + 40975 + 40976 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 40977 %if 0 + 40978 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 40979 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5984h + 40980 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) + 40981 LhCopyFilename: + 40982 push ds + 40983 push si + 40984 push di + 40985 lds si,[bx+4] + 40986 mov di,EXECPATH + 40987 lhcpfn1: + 40988 lodsb + 40989 cmp al,2Ah ; '*' + 40990 jz short lhfilerr + 40991 cmp al,3Fh ; '?' + 40992 jz short lhfilerr + 40993 stosb + 40994 or al,al + 40995 jnz short lhcpfn1 + 40996 ; 14/04/2023 + 40997 ; cf = 0 + 40998 ;clc + 40999 lhfilerr2: + 41000 pop di + 41001 pop si + 41002 pop ds + 41003 retn + 41004 lhfilerr: + 41005 mov dx,LhInvFil_Ptr + 41006 stc + 41007 jmp short lhfilerr2 + 41008 + 41009 %endif + 41010 + 41011 ; 16/06/2023 - Retro DOS v4.2 COMMAND.COM + 41012 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6881h + 41013 ; MSDOS 6.0 + 41014 + 41015 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 41016 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:66FEh + 41017 LhCopyFilename: + 41018 ;assume ds:TRANGROUP, es:TRANGROUP 41019 - 41020 ;mov cx,0 ; Copied zero characters - 41021 00006257 29C9 sub cx,cx - 41022 ;@@: - 41023 lhcpfn1: - 41024 00006259 AC lodsb - 41025 0000625A 3C2A cmp al,'*' ;wildcard? - 41026 0000625C 7421 je short lhfilerr ;yes, error - 41027 0000625E 3C3F cmp al,'?' ;wildcard? - 41028 00006260 741D je short lhfilerr ;yes, error - 41029 - 41030 00006262 3C0D cmp al,0Dh ;carriage return? - 41031 ;jz @f - 41032 00006264 7410 je short lhcpfn2 - 41033 00006266 3C2F cmp al,'/' ; SwitChar ;'/'? + 41020 ;mov di,offset TRANGROUP:ExecPath + 41021 00006254 BF[1D9B] mov di,EXECPATH + 41022 + 41023 ;mov cx,0 ; Copied zero characters + 41024 00006257 29C9 sub cx,cx + 41025 ;@@: + 41026 lhcpfn1: + 41027 00006259 AC lodsb + 41028 0000625A 3C2A cmp al,'*' ;wildcard? + 41029 0000625C 7421 je short lhfilerr ;yes, error + 41030 0000625E 3C3F cmp al,'?' ;wildcard? + 41031 00006260 741D je short lhfilerr ;yes, error + 41032 + 41033 00006262 3C0D cmp al,0Dh ;carriage return? 41034 ;jz @f - 41035 00006268 740C je short lhcpfn2 - 41036 0000626A 08C0 or al,al ;EOS? + 41035 00006264 7410 je short lhcpfn2 + 41036 00006266 3C2F cmp al,'/' ; SwitChar ;'/'? 41037 ;jz @f - 41038 0000626C 7408 jz short lhcpfn2 - 41039 0000626E 3C20 cmp al,' ' ;Space? + 41038 00006268 740C je short lhcpfn2 + 41039 0000626A 08C0 or al,al ;EOS? 41040 ;jz @f - 41041 00006270 7404 je short lhcpfn2 - 41042 - 41043 ;or al,al - 41044 ;;jz @f - 41045 ;je short lhcpfn2 - 41046 - 41047 00006272 AA stosb ;store char - 41048 00006273 41 inc cx ;And remember that we did one more - 41049 ;jmp short @b - 41050 00006274 EBE3 jmp short lhcpfn1 - 41051 ;@@: - 41052 lhcpfn2: - 41053 00006276 30C0 xor al,al ;Indicate EOS reached - 41054 00006278 AA stosb ;store char - 41055 - 41056 00006279 09C9 or cx,cx ;If we didn't copy any characters, - 41057 0000627B 7407 jz short lhmissing ; they didn't give a filename. + 41041 0000626C 7408 jz short lhcpfn2 + 41042 0000626E 3C20 cmp al,' ' ;Space? + 41043 ;jz @f + 41044 00006270 7404 je short lhcpfn2 + 41045 + 41046 ;or al,al + 41047 ;;jz @f + 41048 ;je short lhcpfn2 + 41049 + 41050 00006272 AA stosb ;store char + 41051 00006273 41 inc cx ;And remember that we did one more + 41052 ;jmp short @b + 41053 00006274 EBE3 jmp short lhcpfn1 + 41054 ;@@: + 41055 lhcpfn2: + 41056 00006276 30C0 xor al,al ;Indicate EOS reached + 41057 00006278 AA stosb ;store char 41058 - 41059 0000627D 4E dec si ;Move back to the delimiting character - 41060 ; cf = 0 - 41061 ;clc ;And indicate no error occurred - 41062 0000627E C3 retn - 41063 lhfilerr: - 41064 ;mov dx,offset TRANGROUP:LhInvFil_Ptr - 41065 0000627F BA[C392] mov dx,LhInvFil_Ptr ;"Invalid Filename" ; M016 - 41066 00006282 F9 stc - 41067 00006283 C3 retn - 41068 lhmissing: - 41069 ;mov dx,offset TRANGROUP:ReqParmMiss - 41070 00006284 BA[CC92] mov dx,ReqParmMiss ;"Required parm missing" - 41071 00006287 F9 stc - 41072 00006288 C3 retn - 41073 - 41074 ; --------------------------------------------------------------------------- - 41075 - 41076 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41077 %if 0 - 41078 ; 14/04/2023 - 41079 ; 13/04/2023 - 41080 ; MSDOS 5.0 COMMAND.COM only ! - 41081 ; (Procedure name is not from original Microsoft source code!) - 41082 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:596Ah - 41083 set_strategy: - 41084 mov ax,5800h ; DOS_CHECK_STRATEGY - 41085 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 41086 ; AL = function code: get allocation strategy - 41087 mov bx,ax - 41088 or bx,80h - 41089 mov ax,5801h ; DOS_SET_STRATEGY - 41090 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 41091 ; AL = function code: set allocation strategy - 41092 retn - 41093 - 41094 ; --------------------------------------------------------------------------- - 41095 - 41096 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41097 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59A6h - 41098 ; MSDOS 5.0 COMMAND.COM only ! - 41099 ; (Procedure name is not from original Microsoft source code!) - 41100 SkipLhDelims: - 41101 mov si,81h - 41102 call scanoff - 41103 stfn1: - 41104 lodsb - 41105 call DELIM - 41106 jz short stfn2 - 41107 cmp al,0Dh - 41108 jz short stfn2 - 41109 cmp al,[SWITCHAR] - 41110 jnz short stfn1 - 41111 stfn2: - 41112 dec si - 41113 retn - 41114 - 41115 %endif - 41116 - 41117 ; --------------------------------------------------------------------------- - 41118 - 41119 ;*** SetupCmdLine -- prepare command line for the program - 41120 ; - 41121 ; ENTRY {es/ds}:si = points just after the end of the child program - 41122 ; - 41123 ; EXIT None - 41124 ; - 41125 ; USED - 41126 ; - 41127 ; EFFECTS - 41128 ; The rest of the command line following the pgm name is - 41129 ; moved to the top of the command line buffer (at TRANGROUP:81h) - 41130 ; and a new command line length is put in - 41131 ; --------------------------------------------------------------------------- - 41132 - 41133 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41134 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59BEh + 41059 00006279 09C9 or cx,cx ;If we didn't copy any characters, + 41060 0000627B 7407 jz short lhmissing ; they didn't give a filename. + 41061 + 41062 0000627D 4E dec si ;Move back to the delimiting character + 41063 ; cf = 0 + 41064 ;clc ;And indicate no error occurred + 41065 0000627E C3 retn + 41066 lhfilerr: + 41067 ;mov dx,offset TRANGROUP:LhInvFil_Ptr + 41068 0000627F BA[C392] mov dx,LhInvFil_Ptr ;"Invalid Filename" ; M016 + 41069 00006282 F9 stc + 41070 00006283 C3 retn + 41071 lhmissing: + 41072 ;mov dx,offset TRANGROUP:ReqParmMiss + 41073 00006284 BA[CC92] mov dx,ReqParmMiss ;"Required parm missing" + 41074 00006287 F9 stc + 41075 00006288 C3 retn + 41076 + 41077 ; --------------------------------------------------------------------------- + 41078 + 41079 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41080 %if 0 + 41081 ; 14/04/2023 + 41082 ; 13/04/2023 + 41083 ; MSDOS 5.0 COMMAND.COM only ! + 41084 ; (Procedure name is not from original Microsoft source code!) + 41085 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:596Ah + 41086 set_strategy: + 41087 mov ax,5800h ; DOS_CHECK_STRATEGY + 41088 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 41089 ; AL = function code: get allocation strategy + 41090 mov bx,ax + 41091 or bx,80h + 41092 mov ax,5801h ; DOS_SET_STRATEGY + 41093 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 41094 ; AL = function code: set allocation strategy + 41095 retn + 41096 + 41097 ; --------------------------------------------------------------------------- + 41098 + 41099 ; 13/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41100 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59A6h + 41101 ; MSDOS 5.0 COMMAND.COM only ! + 41102 ; (Procedure name is not from original Microsoft source code!) + 41103 SkipLhDelims: + 41104 mov si,81h + 41105 call scanoff + 41106 stfn1: + 41107 lodsb + 41108 call DELIM + 41109 jz short stfn2 + 41110 cmp al,0Dh + 41111 jz short stfn2 + 41112 cmp al,[SWITCHAR] + 41113 jnz short stfn1 + 41114 stfn2: + 41115 dec si + 41116 retn + 41117 + 41118 %endif + 41119 + 41120 ; --------------------------------------------------------------------------- + 41121 + 41122 ;*** SetupCmdLine -- prepare command line for the program + 41123 ; + 41124 ; ENTRY {es/ds}:si = points just after the end of the child program + 41125 ; + 41126 ; EXIT None + 41127 ; + 41128 ; USED + 41129 ; + 41130 ; EFFECTS + 41131 ; The rest of the command line following the pgm name is + 41132 ; moved to the top of the command line buffer (at TRANGROUP:81h) + 41133 ; and a new command line length is put in + 41134 ; --------------------------------------------------------------------------- 41135 - 41136 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41137 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:68BEh + 41136 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41137 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59BEh 41138 - 41139 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 41140 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:673Bh - 41141 SetupCmdLine: - 41142 ;mov di,81h - 41143 00006289 BF8100 mov di,iCmdLine - 41144 0000628C 30C9 xor cl,cl - 41145 0000628E FEC9 dec cl ;just CR means count = 0 - 41146 SetCmdL1: - 41147 00006290 AC lodsb - 41148 00006291 AA stosb - 41149 00006292 FEC1 inc cl ;update count - 41150 - 41151 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41152 ; MSDOS 6.0 - 41153 ; 14/04/2023 - 41154 ; * ; MSDOS 6.0 only ! - 41155 00006294 08C0 or al,al ; * - 41156 00006296 7404 jz short SetCmdL2 ; * - 41157 - 41158 00006298 3C0D cmp al,0Dh ;carriage return? - 41159 0000629A 75F4 jnz short SetCmdL1 ;no, continue storing - 41160 SetCmdL2: - 41161 0000629C 26880E8000 mov [es:80h],cl ;store new cmd line length - 41162 000062A1 C3 retn - 41163 - 41164 ; --------------------------------------------------------------------------- - 41165 - 41166 ;*** LhSetupErrMsg -- Sets up error messages - 41167 ; - 41168 ; ENTRY ax = error message number - 41169 ; - 41170 ; EXIT None - 41171 ; - 41172 ; USED dx - 41173 ; - 41174 ; EFFECTS - 41175 ; Everything setup to display error message - 41176 ; --------------------------------------------------------------------------- - 41177 - 41178 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41179 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41180 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 41181 LhSetupErrMsg: - 41182 000062A2 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 - 41183 000062A7 BA[D78F] mov dx,extend_buf_ptr - 41184 000062AA A3[D78F] mov [extend_buf_ptr],ax - 41185 000062AD C3 retn - 41186 - 41187 ; --------------------------------------------------------------------------- - 41188 - 41189 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41190 %if 0 - 41191 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41192 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59DFh - 41193 ; MSDOS 5.0 COMMAND.COM only ! - 41194 ; (Procedure name is not from original Microsoft source code!) - 41195 check_umblink: - 41196 mov ax,5800h ; DOS_CHECK_STRATEGY - 41197 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 41198 ; AL = function code: get allocation strategy - 41199 mov bl,al - 41200 mov ax,5802h ; DOS_CHECK_UMBLINK - 41201 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 41202 ; AL = function code: (DOS 5beta) get UMB link state - 41203 mov bh,al - 41204 xchg ax,bx - 41205 rol al,1 - 41206 and al,1 - 41207 shl ah,1 - 41208 or al,ah - 41209 retn - 41210 - 41211 ; --------------------------------------------------------------------------- - 41212 - 41213 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41214 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59F7h - 41215 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) - 41216 HideUMBs: - 41217 push ds - 41218 call check_umblink - 41219 mov ds,[RESSEG] - 41220 mov [fInHigh],al - 41221 or byte [fInHigh],80h - 41222 pop ds - 41223 call set_strategy - 41224 ;call set_umblink - 41225 ;retn - 41226 ; 14/04/023 - 41227 ;jmp short set_umblink - 41228 - 41229 ; --------------------------------------------------------------------------- - 41230 - 41231 ; 14/04/2023 - 41232 ; 13/04/2023 - 41233 ; MSDOS 5.0 COMMAND.COM only ! - 41234 ; (Procedure name is not from original Microsoft source code!) - 41235 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:597Bh - 41236 set_umblink: - 41237 mov ax,5803h ; DOS_SET_UMBLINK - 41238 mov bx,1 - 41239 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY - 41240 ; AL = function code: (DOS 5beta) set UMB link state - 41241 retn - 41242 %endif - 41243 - 41244 ; --------------------------------------------------------------------------- - 41245 - 41246 ;*** SetupPath -- Do path search for the file to be executed - 41247 ; - 41248 ; ENTRY None - 41249 ; - 41250 ; EXIT Carry set if file not found or not executable file - 41251 ; - 41252 ; EFFECTS - 41253 ; ExecPath contains the full path of the file to be executed - 41254 ; --------------------------------------------------------------------------- - 41255 - 41256 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41257 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5A0Fh + 41139 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41140 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:68BEh + 41141 + 41142 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 41143 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:673Bh + 41144 SetupCmdLine: + 41145 ;mov di,81h + 41146 00006289 BF8100 mov di,iCmdLine + 41147 0000628C 30C9 xor cl,cl + 41148 0000628E FEC9 dec cl ;just CR means count = 0 + 41149 SetCmdL1: + 41150 00006290 AC lodsb + 41151 00006291 AA stosb + 41152 00006292 FEC1 inc cl ;update count + 41153 + 41154 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41155 ; MSDOS 6.0 + 41156 ; 14/04/2023 + 41157 ; * ; MSDOS 6.0 only ! + 41158 00006294 08C0 or al,al ; * + 41159 00006296 7404 jz short SetCmdL2 ; * + 41160 + 41161 00006298 3C0D cmp al,0Dh ;carriage return? + 41162 0000629A 75F4 jnz short SetCmdL1 ;no, continue storing + 41163 SetCmdL2: + 41164 0000629C 26880E8000 mov [es:80h],cl ;store new cmd line length + 41165 000062A1 C3 retn + 41166 + 41167 ; --------------------------------------------------------------------------- + 41168 + 41169 ;*** LhSetupErrMsg -- Sets up error messages + 41170 ; + 41171 ; ENTRY ax = error message number + 41172 ; + 41173 ; EXIT None + 41174 ; + 41175 ; USED dx + 41176 ; + 41177 ; EFFECTS + 41178 ; Everything setup to display error message + 41179 ; --------------------------------------------------------------------------- + 41180 + 41181 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41182 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41183 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 41184 LhSetupErrMsg: + 41185 000062A2 C606[D58F]01 mov byte [msg_disp_class],ext_msg_class ; 1 + 41186 000062A7 BA[D78F] mov dx,extend_buf_ptr + 41187 000062AA A3[D78F] mov [extend_buf_ptr],ax + 41188 000062AD C3 retn + 41189 + 41190 ; --------------------------------------------------------------------------- + 41191 + 41192 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41193 %if 0 + 41194 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41195 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59DFh + 41196 ; MSDOS 5.0 COMMAND.COM only ! + 41197 ; (Procedure name is not from original Microsoft source code!) + 41198 check_umblink: + 41199 mov ax,5800h ; DOS_CHECK_STRATEGY + 41200 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 41201 ; AL = function code: get allocation strategy + 41202 mov bl,al + 41203 mov ax,5802h ; DOS_CHECK_UMBLINK + 41204 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 41205 ; AL = function code: (DOS 5beta) get UMB link state + 41206 mov bh,al + 41207 xchg ax,bx + 41208 rol al,1 + 41209 and al,1 + 41210 shl ah,1 + 41211 or al,ah + 41212 retn + 41213 + 41214 ; --------------------------------------------------------------------------- + 41215 + 41216 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41217 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:59F7h + 41218 ; MSDOS 5.0 COMMAND.COM only ! (MSDOS 6.0 code is different) + 41219 HideUMBs: + 41220 push ds + 41221 call check_umblink + 41222 mov ds,[RESSEG] + 41223 mov [fInHigh],al + 41224 or byte [fInHigh],80h + 41225 pop ds + 41226 call set_strategy + 41227 ;call set_umblink + 41228 ;retn + 41229 ; 14/04/023 + 41230 ;jmp short set_umblink + 41231 + 41232 ; --------------------------------------------------------------------------- + 41233 + 41234 ; 14/04/2023 + 41235 ; 13/04/2023 + 41236 ; MSDOS 5.0 COMMAND.COM only ! + 41237 ; (Procedure name is not from original Microsoft source code!) + 41238 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:597Bh + 41239 set_umblink: + 41240 mov ax,5803h ; DOS_SET_UMBLINK + 41241 mov bx,1 + 41242 int 21h ; DOS - 3+ - GET/SET MEMORY ALLOCATION STRATEGY + 41243 ; AL = function code: (DOS 5beta) set UMB link state + 41244 retn + 41245 %endif + 41246 + 41247 ; --------------------------------------------------------------------------- + 41248 + 41249 ;*** SetupPath -- Do path search for the file to be executed + 41250 ; + 41251 ; ENTRY None + 41252 ; + 41253 ; EXIT Carry set if file not found or not executable file + 41254 ; + 41255 ; EFFECTS + 41256 ; ExecPath contains the full path of the file to be executed + 41257 ; --------------------------------------------------------------------------- 41258 - 41259 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41260 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:68E3h + 41259 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41260 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5A0Fh 41261 - 41262 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 41263 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6760h - 41264 SetupPath: - 41265 - 41266 ;Juggle around the argv pointers to make argv[1] into argv[0]. This is - 41267 ;because the path search routine that we are about to invoke expects the - 41268 ;filename to search for to be argv[0]. - 41269 ; - 41270 ;If our new argv[0] starts with a switcharacter, it's an option... skip right - 41271 ;over it by doing the whole move again (smaller, of course, this time). - 41272 - 41273 ;mov ax,arg.argvcnt ;total number of arguments - 41274 ; 14/04/2023 - 41275 ;mov ax,[ARG_ARGVCNT] - 41276 000062AE A1[10A2] mov ax,[ARG+ARG_UNIT.argvcnt] - 41277 - 41278 000062B1 48 dec ax ;less one - skip "LoadHigh" - 41279 ;mov bx,SIZE Argv_ele - 41280 000062B2 BB0B00 mov bx,ARGV_ELE.SIZE ; 11 - 41281 ;mov bx,11 - 41282 000062B5 F7E3 mul bx ;dx:ax = size of argument lists - 41283 - 41284 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM - 41285 ; -------------------------------------- - 41286 ; MSDOS 6.0 - 41287 - 41288 ;getdata cl,fm_argc ;CL = number of arguments to skip - 41289 000062B7 1E push ds ; getdata (macro) - 41290 000062B8 8E1E[F59B] mov ds,[RESSEG] - 41291 000062BC 8A0E[3705] mov cl,[fm_argc] - 41292 000062C0 1F pop ds - 41293 - 41294 000062C1 FEC1 inc cl ;Skip one arg, to get over "lh" - 41295 - 41296 ;Move argv[1]..argv[n] to argv[0]..argv[n-1]. Here, AX == the overall size - 41297 ;of the argument lists. + 41262 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41263 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:68E3h + 41264 + 41265 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 41266 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6760h + 41267 SetupPath: + 41268 + 41269 ;Juggle around the argv pointers to make argv[1] into argv[0]. This is + 41270 ;because the path search routine that we are about to invoke expects the + 41271 ;filename to search for to be argv[0]. + 41272 ; + 41273 ;If our new argv[0] starts with a switcharacter, it's an option... skip right + 41274 ;over it by doing the whole move again (smaller, of course, this time). + 41275 + 41276 ;mov ax,arg.argvcnt ;total number of arguments + 41277 ; 14/04/2023 + 41278 ;mov ax,[ARG_ARGVCNT] + 41279 000062AE A1[10A2] mov ax,[ARG+ARG_UNIT.argvcnt] + 41280 + 41281 000062B1 48 dec ax ;less one - skip "LoadHigh" + 41282 ;mov bx,SIZE Argv_ele + 41283 000062B2 BB0B00 mov bx,ARGV_ELE.SIZE ; 11 + 41284 ;mov bx,11 + 41285 000062B5 F7E3 mul bx ;dx:ax = size of argument lists + 41286 + 41287 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM + 41288 ; -------------------------------------- + 41289 ; MSDOS 6.0 + 41290 + 41291 ;getdata cl,fm_argc ;CL = number of arguments to skip + 41292 000062B7 1E push ds ; getdata (macro) + 41293 000062B8 8E1E[F59B] mov ds,[RESSEG] + 41294 000062BC 8A0E[3705] mov cl,[fm_argc] + 41295 000062C0 1F pop ds + 41296 + 41297 000062C1 FEC1 inc cl ;Skip one arg, to get over "lh" 41298 - 41299 argloop: - 41300 000062C3 E31B jcxz argdone ;If we've finished copying args, leave. + 41299 ;Move argv[1]..argv[n] to argv[0]..argv[n-1]. Here, AX == the overall size + 41300 ;of the argument lists. 41301 - 41302 000062C5 49 dec cx ;One less time we'll go through this. - 41303 - 41304 000062C6 50 push ax ;Copy ( size of remaining list ) bytes - 41305 000062C7 51 push cx ;And remember how many args there were + 41302 argloop: + 41303 000062C3 E31B jcxz argdone ;If we've finished copying args, leave. + 41304 + 41305 000062C5 49 dec cx ;One less time we'll go through this. 41306 - 41307 ; -------------------------------------- - 41308 - 41309 ; 14/04/2023 - 41310 000062C8 89C1 mov cx,ax ;size to move + 41307 000062C6 50 push ax ;Copy ( size of remaining list ) bytes + 41308 000062C7 51 push cx ;And remember how many args there were + 41309 + 41310 ; -------------------------------------- 41311 - 41312 ;mov di,offset TRANGROUP:Arg ;Copy TO argv[0] - 41313 ;mov di,ARG_ARGV ;mov di,[ARG+ARG_UNIT.argv] ; mov di,[ARG] - 41314 000062CA BF[509F] mov di,ARG - 41315 000062CD 89FE mov si,di ; - 41316 ;add si,SIZE Argv_ele ;Copy FROM argv[1] - 41317 000062CF 83C60B add si,ARGV_ELE.SIZE ; 11 - 41318 - 41319 ; 14/04/2023 - 41320 ;mov cx,ax - 41321 - 41322 000062D2 FC cld - 41323 000062D3 F3A4 rep movsb ;Move the argument list - 41324 - 41325 ;dec arg.argvcnt ;Fake one less argument, and - 41326 ;dec word [ARG_ARGVCNT] - 41327 000062D5 FF0E[10A2] dec word [ARG+ARG_UNIT.argvcnt] - 41328 - 41329 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM - 41330 ; -------------------------------------- - 41331 ; MSDOS 6.0 - 41332 - 41333 ;sub ax,ARGV_ELE.SIZE ; 11 ;there's one argument we don't copy. - 41334 - 41335 000062D9 59 pop cx - 41336 000062DA 58 pop ax ;Restore the size of the arg list - 41337 ; 17/06/2023 - 41338 ;jmp short argloop - 41339 - 41340 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41341 000062DB 83E80B sub ax,ARGV_ELE.SIZE ; 11 - 41342 000062DE 77E3 ja short argloop - 41343 ; -------------------------------------- - 41344 - 41345 ; Done moving... argv[0] is now the child program's name, and [1] its first arg - 41346 - 41347 ; 17/06/2023 - 41348 argdone: - 41349 000062E0 E8BDD2 call path_search ;look in the path - 41350 - 41351 ;ax = 0, no file found - 41352 ;ax < 4, batch file found -- cant be executed - 41353 ;ax = 4,8 => .com or .exe file found - 41354 - 41355 000062E3 09C0 or ax,ax ;any file found? - 41356 000062E5 740B jz short no_exec_file ;no, error + 41312 ; 14/04/2023 + 41313 000062C8 89C1 mov cx,ax ;size to move + 41314 + 41315 ;mov di,offset TRANGROUP:Arg ;Copy TO argv[0] + 41316 ;mov di,ARG_ARGV ;mov di,[ARG+ARG_UNIT.argv] ; mov di,[ARG] + 41317 000062CA BF[509F] mov di,ARG + 41318 000062CD 89FE mov si,di ; + 41319 ;add si,SIZE Argv_ele ;Copy FROM argv[1] + 41320 000062CF 83C60B add si,ARGV_ELE.SIZE ; 11 + 41321 + 41322 ; 14/04/2023 + 41323 ;mov cx,ax + 41324 + 41325 000062D2 FC cld + 41326 000062D3 F3A4 rep movsb ;Move the argument list + 41327 + 41328 ;dec arg.argvcnt ;Fake one less argument, and + 41329 ;dec word [ARG_ARGVCNT] + 41330 000062D5 FF0E[10A2] dec word [ARG+ARG_UNIT.argvcnt] + 41331 + 41332 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM + 41333 ; -------------------------------------- + 41334 ; MSDOS 6.0 + 41335 + 41336 ;sub ax,ARGV_ELE.SIZE ; 11 ;there's one argument we don't copy. + 41337 + 41338 000062D9 59 pop cx + 41339 000062DA 58 pop ax ;Restore the size of the arg list + 41340 ; 17/06/2023 + 41341 ;jmp short argloop + 41342 + 41343 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41344 000062DB 83E80B sub ax,ARGV_ELE.SIZE ; 11 + 41345 000062DE 77E3 ja short argloop + 41346 ; -------------------------------------- + 41347 + 41348 ; Done moving... argv[0] is now the child program's name, and [1] its first arg + 41349 + 41350 ; 17/06/2023 + 41351 argdone: + 41352 000062E0 E8BDD2 call path_search ;look in the path + 41353 + 41354 ;ax = 0, no file found + 41355 ;ax < 4, batch file found -- cant be executed + 41356 ;ax = 4,8 => .com or .exe file found 41357 - 41358 000062E7 83F804 cmp ax,4 ;executable file? - 41359 ;jl short no_exec_bat ;no, indicate fail ; M016 - 41360 ;clc - 41361 ;retn - 41362 ; 14/04/2023 - 41363 000062EA 7201 jb short no_exec_bat - 41364 000062EC C3 retn - 41365 - 41366 no_exec_bat: - 41367 000062ED BA[C092] mov dx,NoExecBat_Ptr ;Setup message ptr ; M016 - 41368 000062F0 EB06 jmp short lhsp_errret ;return error; M016 - 41369 - 41370 no_exec_file: - 41371 000062F2 B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 - 41372 000062F5 E8AAFF call LhSetupErrMsg ;setup error message - 41373 lhsp_errret: ; M016 - 41374 000062F8 F9 stc - 41375 000062F9 C3 retn - 41376 - 41377 ;============================================================================ - 41378 ; COMMAND.SKL (MESSAGE.SKL), BUILDMSG.C, MSDOS 6.0, 1991 - 41379 ;============================================================================ - 41380 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41381 - 41382 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5A44h - 41383 - 41384 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41385 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6930h + 41358 000062E3 09C0 or ax,ax ;any file found? + 41359 000062E5 740B jz short no_exec_file ;no, error + 41360 + 41361 000062E7 83F804 cmp ax,4 ;executable file? + 41362 ;jl short no_exec_bat ;no, indicate fail ; M016 + 41363 ;clc + 41364 ;retn + 41365 ; 14/04/2023 + 41366 000062EA 7201 jb short no_exec_bat + 41367 000062EC C3 retn + 41368 + 41369 no_exec_bat: + 41370 000062ED BA[C092] mov dx,NoExecBat_Ptr ;Setup message ptr ; M016 + 41371 000062F0 EB06 jmp short lhsp_errret ;return error; M016 + 41372 + 41373 no_exec_file: + 41374 000062F2 B80200 mov ax,ERROR_FILE_NOT_FOUND ; 2 + 41375 000062F5 E8AAFF call LhSetupErrMsg ;setup error message + 41376 lhsp_errret: ; M016 + 41377 000062F8 F9 stc + 41378 000062F9 C3 retn + 41379 + 41380 ;============================================================================ + 41381 ; COMMAND.SKL (MESSAGE.SKL), BUILDMSG.C, MSDOS 6.0, 1991 + 41382 ;============================================================================ + 41383 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41384 + 41385 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5A44h 41386 - 41387 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM - 41388 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:67ADh + 41387 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41388 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6930h 41389 - 41390 ; --------------------------------------------------------------------------- - 41391 ; Class 3 message table/structure - 41392 ; --------------------------------------------------------------------------- - 41393 - 41394 $M_CLASS_3_STRUC: - 41395 000062FA FF db 0FFh ; $M_CLASS_ID (Class identifer) - 41396 ;dw 5 ; $M_COMMAND_VER (COMMAND.COM version) - 41397 ;db 162 ; Total number of messages - 41398 ; 17/06/2023 - 41399 ;dw 1606h ; MSDOS 6.22 COMMAND.COM (hb=22,lb=6) - 41400 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 41401 000062FB 070A dw 0A07h ; PCDOS 7.1 COMMAND.COM - 41402 ;db 187 ; Total number of messages - 41403 ; 02/08/2024 - 41404 000062FD B7 db 183 ; PCDOS 7.1 COMMAND.COM - 41405 $M_ID_3_1: - 41406 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:5A48h) - 41407 000062FE FC03 dw 1020 ; Message Number = 1020 - 41408 ;dw MSG_1020-$+2 ; 288h ; Message offset from message number (5A48h+0288h=5CD0h) - 41409 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41410 00006300 DC02 dw MSG_1020-$+2 ; 2ECh ; Message offset from message number (6934h+02ECh=6C20h) - 41411 ; 732 ; 67B1h+2DCh=6A8Dh ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 41412 $M_ID_3_2: - 41413 00006302 F703 dw 1015 ; Message Number = 1015 - 41414 ;dw MSG_1015-$+2 ; 294h ; Message offset from message number (5A4Ch+0294h=5CE0h) - 41415 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41416 00006304 E802 dw MSG_1015-$+2 ; 2F8h ; Message offset from message number (6938h+02F8h=6C30h) - 41417 ; 744 ; 67B5h+2E8h=6A9Dh ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 41418 $M_ID_3_3: ; 26/04/2023 - 41419 ; 17/06/2023 - 41420 ; 06/08/2024 - 41421 00006306 EC030803 dw 1004,MSG_1004-$ ; 776 - 41422 0000630A 02041E03 dw 1026,MSG_1026-$ ; 798 - 41423 0000630E 07042E03 dw 1031,MSG_1031-$ ; 814 - 41424 00006312 0B043903 dw 1035,MSG_1035-$ ; 825 - 41425 00006316 26044403 dw 1062,MSG_1062-$ ; 836 - 41426 0000631A 04044F03 dw 1028,MSG_1028-$ ; 847 - 41427 0000631E 15046D03 dw 1045,MSG_1045-$ ; 877 - 41428 00006322 11048603 dw 1041,MSG_1041-$ ; 902 - 41429 00006326 1204A403 dw 1042,MSG_1042-$ ; 932 - 41430 $M_ID_3_12: - 41431 0000632A 1304BB03 dw 1043,MSG_1043-$ ; 955 - 41432 0000632E EA03D703 dw 1002,MSG_1002-$ ; 983 - 41433 00006332 EB03FB03 dw 1003,MSG_1003-$ ; 1019 - 41434 00006336 EF031304 dw 1007,MSG_1007-$ ; 1043 - 41435 0000633A F0032A04 dw 1008,MSG_1008-$ ; 1066 - 41436 0000633E F1033C04 dw 1009,MSG_1009-$ ; 1084 - 41437 00006342 F2034D04 dw 1010,MSG_1010-$ ; 1101 - 41438 00006346 F3036904 dw 1011,MSG_1011-$ ; 1129 - 41439 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 41440 %if 1 - 41441 0000634A F4038004 dw 1012,MSG_1012-$ ; 1152 - 41442 %endif - 41443 0000634E F6039904 dw 1014,MSG_1014-$ ; 1177 - 41444 00006352 F803A604 dw 1016,MSG_1016-$ ; 1190 - 41445 00006356 F903CC04 dw 1017,MSG_1017-$ ; 1228 - 41446 0000635A FA03ED04 dw 1018,MSG_1018-$ ; 1261 - 41447 $M_ID_3_24: - 41448 0000635E FB03FD04 dw 1019,MSG_1019-$ ; 1277 - 41449 00006362 FD030505 dw 1021,MSG_1021-$ ; 1285 - 41450 00006366 FE031F05 dw 1022,MSG_1022-$ ; 1311 - 41451 0000636A FF034205 dw 1023,MSG_1023-$ ; 1346 - 41452 0000636E 00046A05 dw 1024,MSG_1024-$ ; 1386 - 41453 00006372 01047D05 dw 1025,MSG_1025-$ ; 1405 - 41454 00006376 03049105 dw 1027,MSG_1027-$ ; 1425 - 41455 0000637A 0504AE05 dw 1029,MSG_1029-$ ; 1454 - 41456 0000637E 0604BC05 dw 1030,MSG_1030-$ ; 1468 - 41457 00006382 0804C705 dw 1032,MSG_1032-$ ; 1479 - 41458 00006386 0904DB05 dw 1033,MSG_1033-$ ; 1499 - 41459 0000638A 0A04ED05 dw 1034,MSG_1034-$ ; 1517 - 41460 0000638E 0C04FF05 dw 1036,MSG_1036-$ ; 1535 - 41461 00006392 0D041006 dw 1037,MSG_1037-$ ; 1552 - 41462 00006396 0E041D06 dw 1038,MSG_1038-$ ; 1565 - 41463 0000639A 0F042C06 dw 1039,MSG_1039-$ ; 1580 - 41464 $M_ID_3_40: - 41465 0000639E 10046506 dw 1040,MSG_1040-$ ; 1637 - 41466 000063A2 14047406 dw 1044,MSG_1044-$ ; 1652 - 41467 000063A6 16048406 dw 1046,MSG_1046-$ ; 1668 - 41468 000063AA 1704B706 dw 1047,MSG_1047-$ ; 1719 - 41469 000063AE 1804CC06 dw 1048,MSG_1048-$ ; 1740 - 41470 000063B2 1904DA06 dw 1049,MSG_1049-$ ; 1754 - 41471 000063B6 1A04E006 dw 1050,MSG_1050-$ ; 1760 - 41472 000063BA 1B04FB06 dw 1051,MSG_1051-$ ; 1787 - 41473 000063BE 1C040807 dw 1052,MSG_1052-$ ; 1800 - 41474 000063C2 1D041B07 dw 1053,MSG_1053-$ ; 1819 - 41475 000063C6 1E043D07 dw 1054,MSG_1054-$ ; 1853 - 41476 $M_ID_3_51: - 41477 000063CA 1F046007 dw 1055,MSG_1055-$ ; 1888 - 41478 000063CE 20046A07 dw 1056,MSG_1056-$ ; 1898 - 41479 000063D2 21047507 dw 1057,MSG_1057-$ ; 1909 - 41480 000063D6 23047E07 dw 1059,MSG_1059-$ ; 1918 - 41481 000063DA 24047F07 dw 1060,MSG_1060-$ ; 1919 - 41482 000063DE 25047F07 dw 1061,MSG_1061-$ ; 1919 - 41483 000063E2 27049507 dw 1063,MSG_1063-$ ; 1941 - 41484 000063E6 28049407 dw 1064,MSG_1064-$ ; 1940 - 41485 000063EA 29049307 dw 1065,MSG_1065-$ ; 1939 - 41486 000063EE 2A049207 dw 1066,MSG_1066-$ ; 1938 - 41487 000063F2 2B049107 dw 1067,MSG_1067-$ ; 1937 - 41488 000063F6 2C048F07 dw 1068,MSG_1068-$ ; 1935 - 41489 000063FA 2D049807 dw 1069,MSG_1069-$ ; 1944 - 41490 000063FE 2E049807 dw 1070,MSG_1070-$ ; 1944 - 41491 00006402 2F049707 dw 1071,MSG_1071-$ ; 1943 - 41492 00006406 30049607 dw 1072,MSG_1072-$ ; 1942 - 41493 $M_ID_3_67: - 41494 0000640A 31049C07 dw 1073,MSG_1073-$ ; 1948 - 41495 0000640E 3204A207 dw 1074,MSG_1074-$ ; 1954 - 41496 00006412 3304A807 dw 1075,MSG_1075-$ ; 1960 - 41497 00006416 3404AA07 dw 1076,MSG_1076-$ ; 1962 - 41498 0000641A 3504A907 dw 1077,MSG_1077-$ ; 1961 - 41499 0000641E 3604AD07 dw 1078,MSG_1078-$ ; 1965 - 41500 00006422 3704C407 dw 1079,MSG_1079-$ ; 1988 - 41501 00006426 3804CB07 dw 1080,MSG_1080-$ ; 1995 - 41502 0000642A 3904DD07 dw 1081,MSG_1081-$ ; 2013 - 41503 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41504 0000642E 3A040408 dw 1082,MSG_1082-$ ; 2052 - 41505 00006432 3B040C08 dw 1083,MSG_1083-$ ; 2060 - 41506 ; - 41507 00006436 3C040B08 dw 1084,MSG_1084-$ ; 2059 - 41508 0000643A 42041708 dw 1090,MSG_1090-$ ; 2071 - 41509 0000643E 43042108 dw 1091,MSG_1091-$ ; 2081 - 41510 00006442 44042B08 dw 1092,MSG_1092-$ ; 2091 - 41511 00006446 45043508 dw 1093,MSG_1093-$ ; 2101 - 41512 0000644A 46044608 dw 1094,MSG_1094-$ ; 2118 - 41513 0000644E 47045F08 dw 1095,MSG_1095-$ ; 2143 - 41514 00006452 48047808 dw 1096,MSG_1096-$ ; 2168 - 41515 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41516 00006456 4904A508 dw 1097,MSG_1097-$ ; 2213 - 41517 0000645A 4A04BE08 dw 1098,MSG_1098-$ ; 2238 - 41518 0000645E 4B04D708 dw 1099,MSG_1099-$ ; 2263 - 41519 00006462 4C04E908 dw 1100,MSG_1100-$ ; 2281 - 41520 - 41521 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 41522 %if 0 - 41523 dw 1101,MSG_1101-$ ; 2302 - 41524 dw 1102,MSG_1102-$ ; 2313 - 41525 %endif - 41526 00006466 4F040B09 dw 1103,MSG_1103-$ ; 2315 - 41527 0000646A 50042209 dw 1104,MSG_1104-$ ; 2338 - 41528 - 41529 ; TRANGROUP:6AA8h ; MSDOS 6.22 - 41530 ; TRANGROUP:6921h ; PCDOS 7.1 + 41390 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM + 41391 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:67ADh + 41392 + 41393 ; --------------------------------------------------------------------------- + 41394 ; Class 3 message table/structure + 41395 ; --------------------------------------------------------------------------- + 41396 + 41397 $M_CLASS_3_STRUC: + 41398 000062FA FF db 0FFh ; $M_CLASS_ID (Class identifer) + 41399 ;dw 5 ; $M_COMMAND_VER (COMMAND.COM version) + 41400 ;db 162 ; Total number of messages + 41401 ; 17/06/2023 + 41402 ;dw 1606h ; MSDOS 6.22 COMMAND.COM (hb=22,lb=6) + 41403 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 41404 000062FB 070A dw 0A07h ; PCDOS 7.1 COMMAND.COM + 41405 ;db 187 ; Total number of messages + 41406 ; 02/08/2024 + 41407 000062FD B7 db 183 ; PCDOS 7.1 COMMAND.COM + 41408 $M_ID_3_1: + 41409 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:5A48h) + 41410 000062FE FC03 dw 1020 ; Message Number = 1020 + 41411 ;dw MSG_1020-$+2 ; 288h ; Message offset from message number (5A48h+0288h=5CD0h) + 41412 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41413 00006300 DC02 dw MSG_1020-$+2 ; 2ECh ; Message offset from message number (6934h+02ECh=6C20h) + 41414 ; 732 ; 67B1h+2DCh=6A8Dh ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 41415 $M_ID_3_2: + 41416 00006302 F703 dw 1015 ; Message Number = 1015 + 41417 ;dw MSG_1015-$+2 ; 294h ; Message offset from message number (5A4Ch+0294h=5CE0h) + 41418 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41419 00006304 E802 dw MSG_1015-$+2 ; 2F8h ; Message offset from message number (6938h+02F8h=6C30h) + 41420 ; 744 ; 67B5h+2E8h=6A9Dh ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 41421 $M_ID_3_3: ; 26/04/2023 + 41422 ; 17/06/2023 + 41423 ; 06/08/2024 + 41424 00006306 EC030803 dw 1004,MSG_1004-$ ; 776 + 41425 0000630A 02041E03 dw 1026,MSG_1026-$ ; 798 + 41426 0000630E 07042E03 dw 1031,MSG_1031-$ ; 814 + 41427 00006312 0B043903 dw 1035,MSG_1035-$ ; 825 + 41428 00006316 26044403 dw 1062,MSG_1062-$ ; 836 + 41429 0000631A 04044F03 dw 1028,MSG_1028-$ ; 847 + 41430 0000631E 15046D03 dw 1045,MSG_1045-$ ; 877 + 41431 00006322 11048603 dw 1041,MSG_1041-$ ; 902 + 41432 00006326 1204A403 dw 1042,MSG_1042-$ ; 932 + 41433 $M_ID_3_12: + 41434 0000632A 1304BB03 dw 1043,MSG_1043-$ ; 955 + 41435 0000632E EA03D703 dw 1002,MSG_1002-$ ; 983 + 41436 00006332 EB03FB03 dw 1003,MSG_1003-$ ; 1019 + 41437 00006336 EF031304 dw 1007,MSG_1007-$ ; 1043 + 41438 0000633A F0032A04 dw 1008,MSG_1008-$ ; 1066 + 41439 0000633E F1033C04 dw 1009,MSG_1009-$ ; 1084 + 41440 00006342 F2034D04 dw 1010,MSG_1010-$ ; 1101 + 41441 00006346 F3036904 dw 1011,MSG_1011-$ ; 1129 + 41442 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 41443 %if 1 + 41444 0000634A F4038004 dw 1012,MSG_1012-$ ; 1152 + 41445 %endif + 41446 0000634E F6039904 dw 1014,MSG_1014-$ ; 1177 + 41447 00006352 F803A604 dw 1016,MSG_1016-$ ; 1190 + 41448 00006356 F903CC04 dw 1017,MSG_1017-$ ; 1228 + 41449 0000635A FA03ED04 dw 1018,MSG_1018-$ ; 1261 + 41450 $M_ID_3_24: + 41451 0000635E FB03FD04 dw 1019,MSG_1019-$ ; 1277 + 41452 00006362 FD030505 dw 1021,MSG_1021-$ ; 1285 + 41453 00006366 FE031F05 dw 1022,MSG_1022-$ ; 1311 + 41454 0000636A FF034205 dw 1023,MSG_1023-$ ; 1346 + 41455 0000636E 00046A05 dw 1024,MSG_1024-$ ; 1386 + 41456 00006372 01047D05 dw 1025,MSG_1025-$ ; 1405 + 41457 00006376 03049105 dw 1027,MSG_1027-$ ; 1425 + 41458 0000637A 0504AE05 dw 1029,MSG_1029-$ ; 1454 + 41459 0000637E 0604BC05 dw 1030,MSG_1030-$ ; 1468 + 41460 00006382 0804C705 dw 1032,MSG_1032-$ ; 1479 + 41461 00006386 0904DB05 dw 1033,MSG_1033-$ ; 1499 + 41462 0000638A 0A04ED05 dw 1034,MSG_1034-$ ; 1517 + 41463 0000638E 0C04FF05 dw 1036,MSG_1036-$ ; 1535 + 41464 00006392 0D041006 dw 1037,MSG_1037-$ ; 1552 + 41465 00006396 0E041D06 dw 1038,MSG_1038-$ ; 1565 + 41466 0000639A 0F042C06 dw 1039,MSG_1039-$ ; 1580 + 41467 $M_ID_3_40: + 41468 0000639E 10046506 dw 1040,MSG_1040-$ ; 1637 + 41469 000063A2 14047406 dw 1044,MSG_1044-$ ; 1652 + 41470 000063A6 16048406 dw 1046,MSG_1046-$ ; 1668 + 41471 000063AA 1704B706 dw 1047,MSG_1047-$ ; 1719 + 41472 000063AE 1804CC06 dw 1048,MSG_1048-$ ; 1740 + 41473 000063B2 1904DA06 dw 1049,MSG_1049-$ ; 1754 + 41474 000063B6 1A04E006 dw 1050,MSG_1050-$ ; 1760 + 41475 000063BA 1B04FB06 dw 1051,MSG_1051-$ ; 1787 + 41476 000063BE 1C040807 dw 1052,MSG_1052-$ ; 1800 + 41477 000063C2 1D041B07 dw 1053,MSG_1053-$ ; 1819 + 41478 000063C6 1E043D07 dw 1054,MSG_1054-$ ; 1853 + 41479 $M_ID_3_51: + 41480 000063CA 1F046007 dw 1055,MSG_1055-$ ; 1888 + 41481 000063CE 20046A07 dw 1056,MSG_1056-$ ; 1898 + 41482 000063D2 21047507 dw 1057,MSG_1057-$ ; 1909 + 41483 000063D6 23047E07 dw 1059,MSG_1059-$ ; 1918 + 41484 000063DA 24047F07 dw 1060,MSG_1060-$ ; 1919 + 41485 000063DE 25047F07 dw 1061,MSG_1061-$ ; 1919 + 41486 000063E2 27049507 dw 1063,MSG_1063-$ ; 1941 + 41487 000063E6 28049407 dw 1064,MSG_1064-$ ; 1940 + 41488 000063EA 29049307 dw 1065,MSG_1065-$ ; 1939 + 41489 000063EE 2A049207 dw 1066,MSG_1066-$ ; 1938 + 41490 000063F2 2B049107 dw 1067,MSG_1067-$ ; 1937 + 41491 000063F6 2C048F07 dw 1068,MSG_1068-$ ; 1935 + 41492 000063FA 2D049807 dw 1069,MSG_1069-$ ; 1944 + 41493 000063FE 2E049807 dw 1070,MSG_1070-$ ; 1944 + 41494 00006402 2F049707 dw 1071,MSG_1071-$ ; 1943 + 41495 00006406 30049607 dw 1072,MSG_1072-$ ; 1942 + 41496 $M_ID_3_67: + 41497 0000640A 31049C07 dw 1073,MSG_1073-$ ; 1948 + 41498 0000640E 3204A207 dw 1074,MSG_1074-$ ; 1954 + 41499 00006412 3304A807 dw 1075,MSG_1075-$ ; 1960 + 41500 00006416 3404AA07 dw 1076,MSG_1076-$ ; 1962 + 41501 0000641A 3504A907 dw 1077,MSG_1077-$ ; 1961 + 41502 0000641E 3604AD07 dw 1078,MSG_1078-$ ; 1965 + 41503 00006422 3704C407 dw 1079,MSG_1079-$ ; 1988 + 41504 00006426 3804CB07 dw 1080,MSG_1080-$ ; 1995 + 41505 0000642A 3904DD07 dw 1081,MSG_1081-$ ; 2013 + 41506 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41507 0000642E 3A040408 dw 1082,MSG_1082-$ ; 2052 + 41508 00006432 3B040C08 dw 1083,MSG_1083-$ ; 2060 + 41509 ; + 41510 00006436 3C040B08 dw 1084,MSG_1084-$ ; 2059 + 41511 0000643A 42041708 dw 1090,MSG_1090-$ ; 2071 + 41512 0000643E 43042108 dw 1091,MSG_1091-$ ; 2081 + 41513 00006442 44042B08 dw 1092,MSG_1092-$ ; 2091 + 41514 00006446 45043508 dw 1093,MSG_1093-$ ; 2101 + 41515 0000644A 46044608 dw 1094,MSG_1094-$ ; 2118 + 41516 0000644E 47045F08 dw 1095,MSG_1095-$ ; 2143 + 41517 00006452 48047808 dw 1096,MSG_1096-$ ; 2168 + 41518 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41519 00006456 4904A508 dw 1097,MSG_1097-$ ; 2213 + 41520 0000645A 4A04BE08 dw 1098,MSG_1098-$ ; 2238 + 41521 0000645E 4B04D708 dw 1099,MSG_1099-$ ; 2263 + 41522 00006462 4C04E908 dw 1100,MSG_1100-$ ; 2281 + 41523 + 41524 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 41525 %if 0 + 41526 dw 1101,MSG_1101-$ ; 2302 + 41527 dw 1102,MSG_1102-$ ; 2313 + 41528 %endif + 41529 00006466 4F040B09 dw 1103,MSG_1103-$ ; 2315 + 41530 0000646A 50042209 dw 1104,MSG_1104-$ ; 2338 41531 - 41532 0000646E 51042209 dw 1105,MSG_1105-$ ; 2338 ; TRANGROUP:7243h ; PCDOS 7.1 - 41533 - 41534 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 41535 %if 1 - 41536 00006472 52042909 dw 1106,MSG_1106-$ ; 2345 - 41537 %endif - 41538 - 41539 ;$M_ID_3_84: - 41540 $M_ID_3_95: ; 17/06/2023 - 41541 00006476 B0043709 dw 1200,MSG_1200-$ ; 2359 - 41542 0000647A 14053409 dw 1300,MSG_1300-$ ; 2356 - 41543 0000647E 2805B709 dw 1320,MSG_1320-$ ; 2487 - 41544 00006482 2905F309 dw 1321,MSG_1321-$ ; 2547 - 41545 00006486 3C05600A dw 1340,MSG_1340-$ ; 2656 - 41546 0000648A 3D05B80A dw 1341,MSG_1341-$ ; 2744 - 41547 0000648E 3E05170B dw 1342,MSG_1342-$ ; 2839 - 41548 00006492 5005A50B dw 1360,MSG_1360-$ ; 2981 - 41549 00006496 7805BD0B dw 1400,MSG_1400-$ ; 3005 - 41550 0000649A 7905560C dw 1401,MSG_1401-$ ; 3158 - 41551 0000649E 7A05BB0C dw 1402,MSG_1402-$ ; 3259 - 41552 000064A2 7B052E0D dw 1403,MSG_1403-$ ; 3374 - 41553 000064A6 7C056A0D dw 1404,MSG_1404-$ ; 3434 ; TRANGROUP:6ADCh ; MSDOS 6.22 - 41554 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41555 000064AA 7D05DB0D dw 1405,MSG_1405-$ ; 3547 ; TRANGROUP:6AE0h ; MSDOS 6.22 - 41556 ; 06/08/2024 ; TRANGROUP:695Dh ; PCDOS 7.1 - 41557 000064AE 7E054A0E dw 1406,MSG_1406-$ ; 3658 - 41558 000064B2 7F05890E dw 1407,MSG_1407-$ ; 3721 ; (MSG_1404 for MSDOS 5.0 COMMAND.COM) - 41559 ; - 41560 000064B6 8C050D0F dw 1420,MSG_1420-$ ; 3853 - 41561 000064BA A005940F dw 1440,MSG_1440-$ ; 3988 - 41562 000064BE A105B70F dw 1441,MSG_1441-$ ; 4023 - 41563 ;$M_ID_3_100: - 41564 $M_ID_3_114: ; 17/06/2023 - 41565 000064C2 B4053710 dw 1460,MSG_1460-$ ; 4151 - 41566 000064C6 B5059810 dw 1461,MSG_1461-$ ; 4248 - 41567 000064CA B6051811 dw 1462,MSG_1462-$ ; 4376 - 41568 000064CE C8056411 dw 1480,MSG_1480-$ ; 4452 - 41569 000064D2 C9050012 dw 1481,MSG_1481-$ ; 4608 - 41570 000064D6 CA054A12 dw 1482,MSG_1482-$ ; 4682 - 41571 000064DA CB05A212 dw 1483,MSG_1483-$ ; 4770 - 41572 000064DE CC051D13 dw 1484,MSG_1484-$ ; 4893 - 41573 000064E2 CD059613 dw 1485,MSG_1485-$ ; 5014 - 41574 000064E6 CE052814 dw 1486,MSG_1486-$ ; 5160 - 41575 000064EA CF05B414 dw 1487,MSG_1487-$ ; 5300 - 41576 000064EE D0050F15 dw 1488,MSG_1488-$ ; 5391 - 41577 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41578 000064F2 D1059E15 dw 1489,MSG_1489-$ ; 5534 - 41579 - 41580 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 41581 %if 0 - 41582 dw 1490,MSG_1490-$ ; 5505 - 41583 dw 1491,MSG_1491-$ ; 5529 - 41584 dw 1492,MSG_1492-$ ; 5608 - 41585 dw 1493,MSG_1493-$ ; 5751 - 41586 dw 1494,MSG_1494-$ ; 5770 - 41587 %endif - 41588 - 41589 ;$M_ID_3_112: - 41590 $M_ID_3_132: ; 17/06/2023 - 41591 000064F6 DC05EB15 dw 1500,MSG_1500-$ ; 5611 - 41592 000064FA F0052616 dw 1520,MSG_1520-$ ; 5670 - 41593 000064FE 04066016 dw 1540,MSG_1540-$ ; 5728 - 41594 00006502 0506BA16 dw 1541,MSG_1541-$ ; 5818 - 41595 00006506 06062217 dw 1542,MSG_1542-$ ; 5922 - 41596 0000650A 18065A17 dw 1560,MSG_1560-$ ; 5978 - 41597 0000650E 19068E17 dw 1561,MSG_1561-$ ; 6030 - 41598 00006512 1A060718 dw 1562,MSG_1562-$ ; 6151 - 41599 00006516 1B063318 dw 1563,MSG_1563-$ ; 6195 - 41600 0000651A 1C065A18 dw 1564,MSG_1564-$ ; 6234 - 41601 0000651E 1D069418 dw 1565,MSG_1565-$ ; 6292 - 41602 00006522 1E06C518 dw 1566,MSG_1566-$ ; 6341 - 41603 00006526 1F06EE18 dw 1567,MSG_1567-$ ; 6382 - 41604 0000652A 20066419 dw 1568,MSG_1568-$ ; 6500 - 41605 0000652E 2C06AD19 dw 1580,MSG_1580-$ ; 6573 - 41606 ;$M_ID_3_127: - 41607 $M_ID_3_147: ; 17/06/2023 - 41608 00006532 4006F119 dw 1600,MSG_1600-$ ; 6641 - 41609 00006536 41060A1A dw 1601,MSG_1601-$ ; 6666 - 41610 0000653A 42065A1A dw 1602,MSG_1602-$ ; 6746 - 41611 0000653E 5406F71A dw 1620,MSG_1620-$ ; 6903 - 41612 00006542 55064B1B dw 1621,MSG_1621-$ ; 6987 - 41613 00006546 5606C91B dw 1622,MSG_1622-$ ; 7113 - 41614 0000654A 6806111C dw 1640,MSG_1640-$ ; 7185 - 41615 0000654E 6906421C dw 1641,MSG_1641-$ ; 7234 - 41616 00006552 7C06C21C dw 1660,MSG_1660-$ ; 7362 - 41617 00006556 9006051D dw 1680,MSG_1680-$ ; 7429 - 41618 0000655A A406271D dw 1700,MSG_1700-$ ; 7463 - 41619 0000655E B806D51D dw 1720,MSG_1720-$ ; 7637 - 41620 00006562 CC06241E dw 1740,MSG_1740-$ ; 7716 - 41621 00006566 CD067C1E dw 1741,MSG_1741-$ ; 7804 - 41622 0000656A E006EB1E dw 1760,MSG_1760-$ ; 7915 - 41623 0000656E F406341F dw 1780,MSG_1780-$ ; 7988 - 41624 ;$M_ID_3_143: - 41625 $M_ID_3_163: ; 17/06/2023 - 41626 00006572 08079C1F dw 1800,MSG_1800-$ ; 8092 - 41627 00006576 0907E61F dw 1801,MSG_1801-$ ; 8166 - 41628 0000657A 1C073A20 dw 1820,MSG_1820-$ ; 8250 - 41629 0000657E 1D077E20 dw 1821,MSG_1821-$ ; 8318 - 41630 00006582 30070521 dw 1840,MSG_1840-$ ; 8453 - 41631 00006586 44074C21 dw 1860,MSG_1860-$ ; 8524 - 41632 0000658A 4507A321 dw 1861,MSG_1861-$ ; 8611 - 41633 0000658E 4607E621 dw 1862,MSG_1862-$ ; 8678 - 41634 00006592 47076022 dw 1863,MSG_1863-$ ; 8800 - 41635 00006596 4807FF22 dw 1864,MSG_1864-$ ; 9959 - 41636 0000659A 49076223 dw 1865,MSG_1865-$ ; 9058 - 41637 0000659E 4A07C923 dw 1866,MSG_1866-$ ; 9161 - 41638 000065A2 58072D24 dw 1880,MSG_1880-$ ; 9261 - 41639 000065A6 5907A124 dw 1881,MSG_1881-$ ; 9377 - 41640 000065AA 5A071B25 dw 1882,MSG_1882-$ ; 9499 - 41641 000065AE 5B076E25 dw 1883,MSG_1883-$ ; 9582 - 41642 000065B2 6C070D26 dw 1900,MSG_1900-$ ; 9741 - 41643 000065B6 80075226 dw 1920,MSG_1920-$ ; 9810 - 41644 000065BA 81077E26 dw 1921,MSG_1921-$ ; 9854 - 41645 ;$M_ID_3_162: - 41646 $M_ID_3_182: ; 17/06/2023 - 41647 000065BE 82071327 dw 1922,MSG_1922-$ ; 10003 - 41648 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 41649 000065C2 8307C627 dw 1923,MSG_1923-$ ; 10182 - 41650 000065C6 84074828 dw 1924,MSG_1924-$ ; 10312 - 41651 000065CA 8507C028 dw 1925,MSG_1925-$ ; 10432 - 41652 000065CE 8607BF28 dw 1926,MSG_1926-$ ; 10431 - 41653 $M_ID_3_187: ; 17/06/2023 - 41654 000065D2 8707 dw 1927 ; 19/06/2023 ; Message Number = 1927 - 41655 000065D4 1329 dw MSG_1927-$+2 ; 10515 ; Message offset from message number - 41656 ; MSDOS 6.22 ; (Msg addr: 6C1Ch+2A1Eh = TRANGROUP:963Ah) - 41657 ; 06/08/2024 ; PCDOS 7.1 ; (Msg addr: 6A85h+2913h = TRANGROUP:9398h) - 41658 - 41659 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 41660 %if 1 - 41661 $M_ID_3_183: - 41662 000065D6 53046A29 dw 1107,MSG_1107-$ ; 10602 * - 41663 ; (Msg addr: 6A89h+296Ah = TRANGROUP:96F3h) - 41664 %endif - 41665 - 41666 ; --------------------------------------------------------------------------- - 41667 ; Class 3 messages - 41668 ; --------------------------------------------------------------------------- - 41669 - 41670 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 41671 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5CD0h - 41672 - 41673 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41674 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6C20h + 41532 ; TRANGROUP:6AA8h ; MSDOS 6.22 + 41533 ; TRANGROUP:6921h ; PCDOS 7.1 + 41534 + 41535 0000646E 51042209 dw 1105,MSG_1105-$ ; 2338 ; TRANGROUP:7243h ; PCDOS 7.1 + 41536 + 41537 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 41538 %if 1 + 41539 00006472 52042909 dw 1106,MSG_1106-$ ; 2345 + 41540 %endif + 41541 + 41542 ;$M_ID_3_84: + 41543 $M_ID_3_95: ; 17/06/2023 + 41544 00006476 B0043709 dw 1200,MSG_1200-$ ; 2359 + 41545 0000647A 14053409 dw 1300,MSG_1300-$ ; 2356 + 41546 0000647E 2805B709 dw 1320,MSG_1320-$ ; 2487 + 41547 00006482 2905F309 dw 1321,MSG_1321-$ ; 2547 + 41548 00006486 3C05600A dw 1340,MSG_1340-$ ; 2656 + 41549 0000648A 3D05B80A dw 1341,MSG_1341-$ ; 2744 + 41550 0000648E 3E05170B dw 1342,MSG_1342-$ ; 2839 + 41551 00006492 5005A50B dw 1360,MSG_1360-$ ; 2981 + 41552 00006496 7805BD0B dw 1400,MSG_1400-$ ; 3005 + 41553 0000649A 7905560C dw 1401,MSG_1401-$ ; 3158 + 41554 0000649E 7A05BB0C dw 1402,MSG_1402-$ ; 3259 + 41555 000064A2 7B052E0D dw 1403,MSG_1403-$ ; 3374 + 41556 000064A6 7C056A0D dw 1404,MSG_1404-$ ; 3434 ; TRANGROUP:6ADCh ; MSDOS 6.22 + 41557 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41558 000064AA 7D05DB0D dw 1405,MSG_1405-$ ; 3547 ; TRANGROUP:6AE0h ; MSDOS 6.22 + 41559 ; 06/08/2024 ; TRANGROUP:695Dh ; PCDOS 7.1 + 41560 000064AE 7E054A0E dw 1406,MSG_1406-$ ; 3658 + 41561 000064B2 7F05890E dw 1407,MSG_1407-$ ; 3721 ; (MSG_1404 for MSDOS 5.0 COMMAND.COM) + 41562 ; + 41563 000064B6 8C050D0F dw 1420,MSG_1420-$ ; 3853 + 41564 000064BA A005940F dw 1440,MSG_1440-$ ; 3988 + 41565 000064BE A105B70F dw 1441,MSG_1441-$ ; 4023 + 41566 ;$M_ID_3_100: + 41567 $M_ID_3_114: ; 17/06/2023 + 41568 000064C2 B4053710 dw 1460,MSG_1460-$ ; 4151 + 41569 000064C6 B5059810 dw 1461,MSG_1461-$ ; 4248 + 41570 000064CA B6051811 dw 1462,MSG_1462-$ ; 4376 + 41571 000064CE C8056411 dw 1480,MSG_1480-$ ; 4452 + 41572 000064D2 C9050012 dw 1481,MSG_1481-$ ; 4608 + 41573 000064D6 CA054A12 dw 1482,MSG_1482-$ ; 4682 + 41574 000064DA CB05A212 dw 1483,MSG_1483-$ ; 4770 + 41575 000064DE CC051D13 dw 1484,MSG_1484-$ ; 4893 + 41576 000064E2 CD059613 dw 1485,MSG_1485-$ ; 5014 + 41577 000064E6 CE052814 dw 1486,MSG_1486-$ ; 5160 + 41578 000064EA CF05B414 dw 1487,MSG_1487-$ ; 5300 + 41579 000064EE D0050F15 dw 1488,MSG_1488-$ ; 5391 + 41580 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41581 000064F2 D1059E15 dw 1489,MSG_1489-$ ; 5534 + 41582 + 41583 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 41584 %if 0 + 41585 dw 1490,MSG_1490-$ ; 5505 + 41586 dw 1491,MSG_1491-$ ; 5529 + 41587 dw 1492,MSG_1492-$ ; 5608 + 41588 dw 1493,MSG_1493-$ ; 5751 + 41589 dw 1494,MSG_1494-$ ; 5770 + 41590 %endif + 41591 + 41592 ;$M_ID_3_112: + 41593 $M_ID_3_132: ; 17/06/2023 + 41594 000064F6 DC05EB15 dw 1500,MSG_1500-$ ; 5611 + 41595 000064FA F0052616 dw 1520,MSG_1520-$ ; 5670 + 41596 000064FE 04066016 dw 1540,MSG_1540-$ ; 5728 + 41597 00006502 0506BA16 dw 1541,MSG_1541-$ ; 5818 + 41598 00006506 06062217 dw 1542,MSG_1542-$ ; 5922 + 41599 0000650A 18065A17 dw 1560,MSG_1560-$ ; 5978 + 41600 0000650E 19068E17 dw 1561,MSG_1561-$ ; 6030 + 41601 00006512 1A060718 dw 1562,MSG_1562-$ ; 6151 + 41602 00006516 1B063318 dw 1563,MSG_1563-$ ; 6195 + 41603 0000651A 1C065A18 dw 1564,MSG_1564-$ ; 6234 + 41604 0000651E 1D069418 dw 1565,MSG_1565-$ ; 6292 + 41605 00006522 1E06C518 dw 1566,MSG_1566-$ ; 6341 + 41606 00006526 1F06EE18 dw 1567,MSG_1567-$ ; 6382 + 41607 0000652A 20066419 dw 1568,MSG_1568-$ ; 6500 + 41608 0000652E 2C06AD19 dw 1580,MSG_1580-$ ; 6573 + 41609 ;$M_ID_3_127: + 41610 $M_ID_3_147: ; 17/06/2023 + 41611 00006532 4006F119 dw 1600,MSG_1600-$ ; 6641 + 41612 00006536 41060A1A dw 1601,MSG_1601-$ ; 6666 + 41613 0000653A 42065A1A dw 1602,MSG_1602-$ ; 6746 + 41614 0000653E 5406F71A dw 1620,MSG_1620-$ ; 6903 + 41615 00006542 55064B1B dw 1621,MSG_1621-$ ; 6987 + 41616 00006546 5606C91B dw 1622,MSG_1622-$ ; 7113 + 41617 0000654A 6806111C dw 1640,MSG_1640-$ ; 7185 + 41618 0000654E 6906421C dw 1641,MSG_1641-$ ; 7234 + 41619 00006552 7C06C21C dw 1660,MSG_1660-$ ; 7362 + 41620 00006556 9006051D dw 1680,MSG_1680-$ ; 7429 + 41621 0000655A A406271D dw 1700,MSG_1700-$ ; 7463 + 41622 0000655E B806D51D dw 1720,MSG_1720-$ ; 7637 + 41623 00006562 CC06241E dw 1740,MSG_1740-$ ; 7716 + 41624 00006566 CD067C1E dw 1741,MSG_1741-$ ; 7804 + 41625 0000656A E006EB1E dw 1760,MSG_1760-$ ; 7915 + 41626 0000656E F406341F dw 1780,MSG_1780-$ ; 7988 + 41627 ;$M_ID_3_143: + 41628 $M_ID_3_163: ; 17/06/2023 + 41629 00006572 08079C1F dw 1800,MSG_1800-$ ; 8092 + 41630 00006576 0907E61F dw 1801,MSG_1801-$ ; 8166 + 41631 0000657A 1C073A20 dw 1820,MSG_1820-$ ; 8250 + 41632 0000657E 1D077E20 dw 1821,MSG_1821-$ ; 8318 + 41633 00006582 30070521 dw 1840,MSG_1840-$ ; 8453 + 41634 00006586 44074C21 dw 1860,MSG_1860-$ ; 8524 + 41635 0000658A 4507A321 dw 1861,MSG_1861-$ ; 8611 + 41636 0000658E 4607E621 dw 1862,MSG_1862-$ ; 8678 + 41637 00006592 47076022 dw 1863,MSG_1863-$ ; 8800 + 41638 00006596 4807FF22 dw 1864,MSG_1864-$ ; 9959 + 41639 0000659A 49076223 dw 1865,MSG_1865-$ ; 9058 + 41640 0000659E 4A07C923 dw 1866,MSG_1866-$ ; 9161 + 41641 000065A2 58072D24 dw 1880,MSG_1880-$ ; 9261 + 41642 000065A6 5907A124 dw 1881,MSG_1881-$ ; 9377 + 41643 000065AA 5A071B25 dw 1882,MSG_1882-$ ; 9499 + 41644 000065AE 5B076E25 dw 1883,MSG_1883-$ ; 9582 + 41645 000065B2 6C070D26 dw 1900,MSG_1900-$ ; 9741 + 41646 000065B6 80075226 dw 1920,MSG_1920-$ ; 9810 + 41647 000065BA 81077E26 dw 1921,MSG_1921-$ ; 9854 + 41648 ;$M_ID_3_162: + 41649 $M_ID_3_182: ; 17/06/2023 + 41650 000065BE 82071327 dw 1922,MSG_1922-$ ; 10003 + 41651 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 41652 000065C2 8307C627 dw 1923,MSG_1923-$ ; 10182 + 41653 000065C6 84074828 dw 1924,MSG_1924-$ ; 10312 + 41654 000065CA 8507C028 dw 1925,MSG_1925-$ ; 10432 + 41655 000065CE 8607BF28 dw 1926,MSG_1926-$ ; 10431 + 41656 $M_ID_3_187: ; 17/06/2023 + 41657 000065D2 8707 dw 1927 ; 19/06/2023 ; Message Number = 1927 + 41658 000065D4 1329 dw MSG_1927-$+2 ; 10515 ; Message offset from message number + 41659 ; MSDOS 6.22 ; (Msg addr: 6C1Ch+2A1Eh = TRANGROUP:963Ah) + 41660 ; 06/08/2024 ; PCDOS 7.1 ; (Msg addr: 6A85h+2913h = TRANGROUP:9398h) + 41661 + 41662 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 41663 %if 1 + 41664 $M_ID_3_183: + 41665 000065D6 53046A29 dw 1107,MSG_1107-$ ; 10602 * + 41666 ; (Msg addr: 6A89h+296Ah = TRANGROUP:96F3h) + 41667 %endif + 41668 + 41669 ; --------------------------------------------------------------------------- + 41670 ; Class 3 messages + 41671 ; --------------------------------------------------------------------------- + 41672 + 41673 ; 14/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 41674 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:5CD0h 41675 - 41676 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM - 41677 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6A8Dh + 41676 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41677 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:6C20h 41678 - 41679 MSG_1020: ; COMMON4 - 41680 000065DA 0F db 15 ; (MSG_1015-MSG_1020)-1 - 41681 000065DB 253120627974657320- db '%1 bytes free',0Dh,0Ah - 41681 000065E4 667265650D0A - 41682 MSG_1015: ; COMMON18 - 41683 000065EA 23 db 35 - 41684 000065EB 46696C652063616E6E- db 'File cannot be copied onto itself',0Dh,0Ah - 41684 000065F4 6F7420626520636F70- - 41684 000065FD 696564206F6E746F20- - 41684 00006606 697473656C660D0A - 41685 MSG_1004: ; COMMON20 - 41686 0000660E 19 db 25 - 41687 0000660F 496E73756666696369- db 'Insufficient disk space',0Dh,0Ah - 41687 00006618 656E74206469736B20- - 41687 00006621 73706163650D0A - 41688 MSG_1026: ; COMMON22 - 41689 00006628 13 db 19 - 41690 00006629 496E76616C69642063- db 'Invalid code page',0Dh,0Ah - 41690 00006632 6F646520706167650D- - 41690 0000663B 0A - 41691 MSG_1031: ; COMMON23 - 41692 0000663C 0E db 14 - 41693 0000663D 496E76616C69642064- db 'Invalid date',0Dh,0Ah - 41693 00006646 6174650D0A - 41694 MSG_1035: ; COMMON24 - 41695 0000664B 0E db 14 - 41696 0000664C 496E76616C69642074- db 'Invalid time',0Dh,0Ah - 41696 00006655 696D650D0A - 41697 MSG_1062: ; COMMON25 - 41698 0000665A 0E db 14 - 41699 0000665B 496E76616C69642070- db 'Invalid path',0Dh,0Ah - 41699 00006664 6174680D0A - 41700 MSG_1028: ; COMMON28 - 41701 00006669 21 db 33 - 41702 0000666A 507265737320616E79- db 'Press any key to continue . . .',0Dh,0Ah - 41702 00006673 206B657920746F2063- - 41702 0000667C 6F6E74696E7565202E- - 41702 00006685 202E202E0D0A - 41703 MSG_1045: ; COMMON32 - 41704 0000668B 1C db 28 - 41705 0000668C 556E61626C6520746F- db 'Unable to create directory',0Dh,0Ah - 41705 00006695 206372656174652064- - 41705 0000669E 69726563746F72790D- - 41705 000066A7 0A - 41706 MSG_1041: ; COMMON33 - 41707 000066A8 21 db 33 - 41708 000066A9 566F6C756D6520696E- db 'Volume in drive %1 has no label',0Dh,0Ah - 41708 000066B2 206472697665202531- - 41708 000066BB 20686173206E6F206C- - 41708 000066C4 6162656C0D0A - 41709 MSG_1042: ; COMMON34 - 41710 000066CA 1A db 26 - 41711 000066CB 566F6C756D6520696E- db 'Volume in drive %1 is %2',0Dh,0Ah - 41711 000066D4 206472697665202531- - 41711 000066DD 2069732025320D0A - 41712 MSG_1043: ; COMMON36 - 41713 000066E5 1F db 31 ; (MSG_1002-MSG_1043)-1 - 41714 000066E6 566F6C756D65205365- db 'Volume Serial Number is %1-%2',0Dh,0Ah - 41714 000066EF 7269616C204E756D62- - 41714 000066F8 65722069732025312D- - 41714 00006701 25320D0A - 41715 MSG_1002: - 41716 00006705 27 db 39 - 41717 00006706 4475706C6963617465- db 'Duplicate file name or file not found',0Dh,0Ah - 41717 0000670F 2066696C65206E616D- - 41717 00006718 65206F722066696C65- - 41717 00006721 206E6F7420666F756E- - 41717 0000672A 640D0A - 41718 MSG_1003: - 41719 0000672D 1B db 27 - 41720 0000672E 496E76616C69642070- db 'Invalid path or file name',0Dh,0Ah - 41720 00006737 617468206F72206669- - 41720 00006740 6C65206E616D650D0A - 41721 MSG_1007: - 41722 00006749 1A db 26 - 41723 0000674A 4F7574206F6620656E- db 'Out of environment space',0Dh,0Ah - 41723 00006753 7669726F6E6D656E74- - 41723 0000675C 2073706163650D0A - 41724 MSG_1008: - 41725 00006764 15 db 21 - 41726 00006765 46696C652063726561- db 'File creation error',0Dh,0Ah - 41726 0000676E 74696F6E206572726F- - 41726 00006777 720D0A - 41727 MSG_1009: - 41728 0000677A 14 db 20 ; (MSG_1010-MSG_1009)-1 - 41729 0000677B 42617463682066696C- db 'Batch file missing',0Dh,0Ah - 41729 00006784 65206D697373696E67- - 41729 0000678D 0D0A - 41730 MSG_1010: - 41731 0000678F 1F db 31 - 41732 00006790 0D0A db 0Dh,0Ah - 41733 00006792 496E73657274206469- db 'Insert disk with batch file',0Dh,0Ah - 41733 0000679B 736B20776974682062- - 41733 000067A4 617463682066696C65- - 41733 000067AD 0D0A - 41734 MSG_1011: - 41735 000067AF 1A db 26 - 41736 000067B0 42616420636F6D6D61- db 'Bad command or file name',0Dh,0Ah - 41736 000067B9 6E64206F722066696C- - 41736 000067C2 65206E616D650D0A - 41737 - 41738 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 41739 %if 1 - 41740 MSG_1012: - 41741 000067CA 1C db 28 - 41742 000067CB 5245585820696E7465- db 'REXX interpreter not found',0Dh,0Ah - 41742 000067D4 72707265746572206E- - 41742 000067DD 6F7420666F756E640D- - 41742 000067E6 0A - 41743 %endif - 41744 - 41745 MSG_1014: ; EXTEND5 - 41746 000067E7 10 db 16 - 41747 000067E8 416363657373206465- db 'Access denied ',0Dh,0Ah - 41747 000067F1 6E696564200D0A - 41748 MSG_1016: - 41749 000067F8 29 db 41 - 41750 000067F9 436F6E74656E74206F- db 'Content of destination lost before copy',0Dh,0Ah - 41750 00006802 662064657374696E61- - 41750 0000680B 74696F6E206C6F7374- - 41750 00006814 206265666F72652063- - 41750 0000681D 6F70790D0A - 41751 MSG_1017: - 41752 00006822 24 db 36 - 41753 00006823 496E76616C69642066- db 'Invalid filename or file not found',0Dh,0Ah - 41753 0000682C 696C656E616D65206F- - 41753 00006835 722066696C65206E6F- - 41753 0000683E 7420666F756E640D0A - 41754 MSG_1018: - 41755 00006847 13 db 19 - 41756 00006848 25312066696C652873- db '%1 file(s) copied',0Dh,0Ah - 41756 00006851 2920636F706965640D- - 41756 0000685A 0A - 41757 MSG_1019: - 41758 0000685B 0B db 11 - 41759 0000685C 25312066696C652873- db '%1 file(s) ' - 41759 00006865 2920 - 41760 MSG_1021: ; EXTEND15 - 41761 00006867 1D db 29 - 41762 00006868 496E76616C69642064- db 'Invalid drive specification',0Dh,0Ah - 41762 00006871 726976652073706563- - 41762 0000687A 696669636174696F6E- - 41762 00006883 0D0A - 41763 MSG_1022: - 41764 00006885 26 db 38 - 41765 00006886 436F64652070616765- db 'Code page %1 not prepared for system',0Dh,0Ah - 41765 0000688F 202531206E6F742070- - 41765 00006898 726570617265642066- - 41765 000068A1 6F722073797374656D- - 41765 000068AA 0D0A - 41766 MSG_1023: - 41767 000068AC 2B db 43 - 41768 000068AD 436F64652070616765- db 'Code page %1 not prepared for all devices',0Dh,0Ah - 41768 000068B6 202531206E6F742070- - 41768 000068BF 726570617265642066- - 41768 000068C8 6F7220616C6C206465- - 41768 000068D1 76696365730D0A - 41769 MSG_1024: - 41770 000068D8 16 db 22 - 41771 000068D9 41637469766520636F- db 'Active code page: %1',0Dh,0Ah - 41771 000068E2 646520706167653A20- - 41771 000068EB 25310D0A - 41772 MSG_1025: - 41773 000068EF 17 db 23 - 41774 000068F0 4E4C5346554E43206E- db 'NLSFUNC not installed',0Dh,0Ah - 41774 000068F9 6F7420696E7374616C- - 41774 00006902 6C65640D0A - 41775 MSG_1027: - 41776 00006907 20 db 32 - 41777 00006908 43757272656E742064- db 'Current drive is no longer valid' - 41777 00006911 72697665206973206E- - 41777 0000691A 6F206C6F6E67657220- - 41777 00006923 76616C6964 - 41778 MSG_1029: - 41779 00006928 11 db 17 - 41780 00006929 4C6162656C206E6F74- db 'Label not found',0Dh,0Ah - 41780 00006932 20666F756E640D0A - 41781 MSG_1030: - 41782 0000693A 0E db 14 - 41783 0000693B 53796E746178206572- db 'Syntax error',0Dh,0Ah - 41783 00006944 726F720D0A - 41784 MSG_1032: - 41785 00006949 17 db 23 - 41786 0000694A 43757272656E742064- db 'Current date is %1 %2',0Dh,0Ah - 41786 00006953 617465206973202531- - 41786 0000695C 2025320D0A - 41787 MSG_1033: - 41788 00006961 15 db 21 - 41789 00006962 53756E4D6F6E547565- db 'SunMonTueWedThuFriSat' - 41789 0000696B 576564546875467269- - 41789 00006974 536174 - 41790 MSG_1034: - 41791 00006977 15 db 21 - 41792 00006978 456E746572206E6577- db 'Enter new date (%1): ' - 41792 00006981 206461746520282531- - 41792 0000698A 293A20 - 41793 MSG_1036: - 41794 0000698D 14 db 20 - 41795 0000698E 43757272656E742074- db 'Current time is %1',0Dh,0Ah - 41795 00006997 696D65206973202531- - 41795 000069A0 0D0A - 41796 MSG_1037: - 41797 000069A2 10 db 16 - 41798 000069A3 456E746572206E6577- db 'Enter new time: ' - 41798 000069AC 2074696D653A20 - 41799 MSG_1038: - 41800 000069B3 12 db 18 - 41801 000069B4 2C2020202044656C65- db ', Delete (Y/N)?' - 41801 000069BD 74652028592F4E293F - 41802 MSG_1039: - 41803 000069C6 3C db 60 - 41804 000069C7 416C6C2066696C6573- db 'All files in directory will be deleted!',0Dh,0Ah - 41804 000069D0 20696E206469726563- - 41804 000069D9 746F72792077696C6C- - 41804 000069E2 2062652064656C6574- - 41804 000069EB 6564210D0A - 41805 000069F0 41726520796F752073- db 'Are you sure (Y/N)?' - 41805 000069F9 7572652028592F4E29- - 41805 00006A02 3F - 41806 - 41807 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 41808 %if 0 - 41809 MSG_1040: - 41810 db 20 - 41811 db 'MS-DOS Version %1.%2' - 41812 %else - 41813 MSG_1040: - 41814 00006A03 12 db 18 - 41815 00006A04 504320444F53205665- db 'PC DOS Version 7.1' - 41815 00006A0D 7273696F6E20372E31 - 41816 %endif - 41817 - 41818 MSG_1044: - 41819 00006A16 13 db 19 - 41820 00006A17 496E76616C69642064- db 'Invalid directory',0Dh,0Ah - 41820 00006A20 69726563746F72790D- - 41820 00006A29 0A - 41821 MSG_1046: - 41822 00006A2A 36 db 54 - 41823 00006A2B 496E76616C69642070- db 'Invalid path, not directory,',0Dh,0Ah - 41823 00006A34 6174682C206E6F7420- - 41823 00006A3D 6469726563746F7279- - 41823 00006A46 2C0D0A - 41824 00006A49 6F7220646972656374- db 'or directory not empty',0Dh,0Ah - 41824 00006A52 6F7279206E6F742065- - 41824 00006A5B 6D7074790D0A - 41825 MSG_1047: - 41826 00006A61 18 db 24 - 41827 00006A62 4D7573742073706563- db 'Must specify ON or OFF',0Dh,0Ah - 41827 00006A6B 696679204F4E206F72- - 41827 00006A74 204F46460D0A - 41828 MSG_1048: - 41829 00006A7A 11 db 17 - 41830 00006A7B 4469726563746F7279- db 'Directory of %1',0Dh,0Ah - 41830 00006A84 206F662025310D0A - 41831 MSG_1049: - 41832 00006A8C 09 db 9 - 41833 00006A8D 4E6F20506174680D0A db 'No Path',0Dh,0Ah - 41834 MSG_1050: - 41835 00006A96 1E db 30 - 41836 00006A97 496E76616C69642064- db 'Invalid drive in search path',0Dh,0Ah - 41836 00006AA0 7269766520696E2073- - 41836 00006AA9 656172636820706174- - 41836 00006AB2 680D0A - 41837 MSG_1051: - 41838 00006AB5 10 db 16 - 41839 00006AB6 496E76616C69642064- db 'Invalid device',0Dh,0Ah - 41839 00006ABF 65766963650D0A - 41840 MSG_1052: - 41841 00006AC6 16 db 22 - 41842 00006AC7 464F522063616E6E6F- db 'FOR cannot be nested',0Dh,0Ah - 41842 00006AD0 74206265206E657374- - 41842 00006AD9 65640D0A - 41843 MSG_1053: - 41844 00006ADD 25 db 37 - 41845 00006ADE 496E7465726D656469- db 'Intermediate file error during pipe',0Dh,0Ah - 41845 00006AE7 6174652066696C6520- - 41845 00006AF0 6572726F7220647572- - 41845 00006AF9 696E6720706970650D- - 41845 00006B02 0A - 41846 MSG_1054: - 41847 00006B03 26 db 38 - 41848 00006B04 43616E6E6F7420646F- db 'Cannot do binary reads from a device',0Dh,0Ah - 41848 00006B0D 2062696E6172792072- - 41848 00006B16 656164732066726F6D- - 41848 00006B1F 206120646576696365- - 41848 00006B28 0D0A - 41849 - 41850 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:6205h) - 41851 ; 17/06/2023 - 41852 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7155h) - 41853 ; 06/08/2024 - 41854 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:6FDDh) - 41855 MSG_1055: - 41856 00006B2A 0D db 13 - 41857 00006B2B 425245414B20697320- db 'BREAK is %1',0Dh,0Ah - 41857 00006B34 25310D0A - 41858 MSG_1056: - 41859 00006B38 0E db 14 - 41860 00006B39 564552494659206973- db 'VERIFY is %1',0Dh,0Ah - 41860 00006B42 2025310D0A - 41861 MSG_1057: - 41862 00006B47 0C db 12 - 41863 00006B48 4543484F2069732025- db 'ECHO is %1',0Dh,0Ah - 41863 00006B51 310D0A - 41864 MSG_1059: - 41865 00006B54 04 db 4 - 41866 00006B55 6F666600 db 'off',0 - 41867 MSG_1060: - 41868 00006B59 03 db 3 - 41869 00006B5A 6F6E00 db 'on',0 - 41870 MSG_1061: - 41871 00006B5D 19 db 25 - 41872 00006B5E 4572726F7220777269- db 'Error writing to device',0Dh,0Ah - 41872 00006B67 74696E6720746F2064- - 41872 00006B70 65766963650D0A - 41873 MSG_1063: - 41874 00006B77 02 db 2 - 41875 00006B78 2531 db '%1' - 41876 MSG_1064: - 41877 00006B7A 02 db 2 - 41878 00006B7B 2531 db '%1' - 41879 MSG_1065: - 41880 00006B7D 02 db 2 - 41881 00006B7E 2531 db '%1' - 41882 MSG_1066: - 41883 00006B80 02 db 2 - 41884 00006B81 2531 db '%1' - 41885 MSG_1067: - 41886 00006B83 01 db 1 - 41887 00006B84 09 db 9 - 41888 MSG_1068: - 41889 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 41890 %if 0 - 41891 db 10 - 41892 db ' ' - 41893 %else - 41894 00006B85 0C db 12 - 41895 00006B86 203C4449523E202020- db ' ' - 41895 00006B8F 202020 - 41896 %endif - 41897 MSG_1069: - 41898 00006B92 03 db 3 - 41899 00006B93 082008 db 8, 20h, 8 - 41900 MSG_1070: ; CRLF - 41901 00006B96 02 db 2 - 41902 00006B97 0D db 0Dh - 41903 00006B98 0A db 0Ah - 41904 MSG_1071: - 41905 00006B99 02 db 2 - 41906 00006B9A 2531 db '%1' - 41907 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM - 41908 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:71C5h - 41909 MSG_1072: - 41910 ;db 8 - 41911 ;db 'mm-dd-yy' - 41912 00006B9C 09 db 9 - 41913 00006B9D 6D6D2D64642D797900 db 'mm-dd-yy',0 - 41914 MSG_1073: - 41915 ;db 8 - 41916 ;db 'dd-mm-yy' - 41917 00006BA6 09 db 9 - 41918 00006BA7 64642D6D6D2D797900 db 'dd-mm-yy',0 - 41919 MSG_1074: - 41920 ;db 8 - 41921 ;db 'yy-mm-dd' - 41922 00006BB0 09 db 9 - 41923 00006BB1 79792D6D6D2D646400 db 'yy-mm-dd',0 - 41924 MSG_1075: - 41925 00006BBA 05 db 5 - 41926 00006BBB 2531202532 db '%1 %2' - 41927 MSG_1076: - 41928 00006BC0 02 db 2 - 41929 00006BC1 2531 db '%1' - 41930 MSG_1077: - 41931 00006BC3 07 db 7 - 41932 00006BC4 20253120202532 db ' %1 %2' - 41933 MSG_1078: - 41934 00006BCB 1A db 26 - 41935 00006BCC 4469726563746F7279- db 'Directory already exists',0Dh,0Ah - 41935 00006BD5 20616C726561647920- - 41935 00006BDE 6578697374730D0A - 41936 MSG_1079: - 41937 00006BE6 0A db 10 - 41938 00006BE7 25312062797465730D- db '%1 bytes',0Dh,0Ah - 41938 00006BF0 0A - 41939 MSG_1080: - 41940 00006BF1 15 db 21 - 41941 00006BF2 546F74616C2066696C- db 'Total files listed:',0Dh,0Ah - 41941 00006BFB 6573206C6973746564- - 41941 00006C04 3A0D0A - 41942 MSG_1081: - 41943 00006C07 2A db 42 - 41944 00006C08 284572726F72206F63- db '(Error occurred in environment variable)',0Dh,0Ah - 41944 00006C11 63757272656420696E- - 41944 00006C1A 20656E7669726F6E6D- - 41944 00006C23 656E74207661726961- - 41944 00006C2C 626C65290D0A - 41945 ; - 41946 ; 06/08/2024 -Retro DOS 5.0 COMMAND.COM - 41947 %if 0 - 41948 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM - 41949 MSG_1082: - 41950 db 7 - 41951 db ' [Y/N]?' - 41952 %else - 41953 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 41954 MSG_1082: - 41955 00006C32 0B db 11 - 41956 00006C33 205B592C4E2C455343- db ' [Y,N,ESC]?' - 41956 00006C3C 5D3F - 41957 %endif - 41958 ; - 41959 MSG_1083: - 41960 00006C3E 02 db 2 - 41961 00006C3F 594E db 'YN' - 41962 ; - 41963 MSG_1084: - 41964 00006C41 0F db 15 - 41965 00006C42 28636F6E74696E7569- db '(continuing %1)' - 41965 00006C4B 6E6720253129 - 41966 MSG_1090: - 41967 00006C51 0D db 13 - 41968 00006C52 5265766973696F6E20- db 'Revision %1',0Dh,0Ah - 41968 00006C5B 25310D0A - 41969 MSG_1091: - 41970 00006C5F 0D db 13 - 41971 00006C60 444F5320697320696E- db 'DOS is in ROM' - 41971 00006C69 20524F4D - 41972 MSG_1092: - 41973 00006C6D 0D db 13 - 41974 00006C6E 444F5320697320696E- db 'DOS is in HMA' - 41974 00006C77 20484D41 - 41975 MSG_1093: - 41976 00006C7B 14 db 20 - 41977 00006C7C 444F5320697320696E- db 'DOS is in low memory' - 41977 00006C85 206C6F77206D656D6F- - 41977 00006C8E 7279 - 41978 MSG_1094: - 41979 00006C90 1C db 28 - 41980 00006C91 43616E6E6F74204C6F- db 'Cannot Loadhigh batch file',0Dh,0Ah - 41980 00006C9A 616468696768206261- - 41980 00006CA3 7463682066696C650D- - 41980 00006CAC 0A - 41981 MSG_1095: - 41982 00006CAD 1C db 28 - 41983 00006CAE 4C6F6164486967683A- db 'LoadHigh: Invalid filename',0Dh,0Ah - 41983 00006CB7 20496E76616C696420- - 41983 00006CC0 66696C656E616D650D- - 41983 00006CC9 0A - 41984 MSG_1096: - 41985 00006CCA 30 db 48 - 41986 00006CCB 43616E6E6F74206F70- db 'Cannot open specified country information file',0Dh,0Ah - 41986 00006CD4 656E20737065636966- - 41986 00006CDD 69656420636F756E74- - 41986 00006CE6 727920696E666F726D- - 41986 00006CEF 6174696F6E2066696C- - 41986 00006CF8 650D0A - 41987 - 41988 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 41989 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7320h - 41990 MSG_1097: - 41991 00006CFB 1C db 28 - 41992 00006CFC 4C6F6164486967683A- db 'LoadHigh: Invalid argument',0Dh,0Ah - 41992 00006D05 20496E76616C696420- - 41992 00006D0E 617267756D656E740D- - 41992 00006D17 0A - 41993 MSG_1098: - 41994 00006D18 1C db 28 - 41995 00006D19 526571756972656420- db 'Required parameter missing',0Dh,0Ah - 41995 00006D22 706172616D65746572- - 41995 00006D2B 206D697373696E670D- - 41995 00006D34 0A - 41996 MSG_1099: - 41997 00006D35 15 db 21 - 41998 00006D36 556E7265636F676E69- db 'Unrecognized switch',0Dh,0Ah - 41998 00006D3F 7A6564207377697463- - 41998 00006D48 680D0A - 41999 MSG_1100: - 42000 00006D4B 25 db 37 - 42001 00006D4C 412062616420554D42- db 'A bad UMB number has been specified',0Dh,0Ah - 42001 00006D55 206E756D6265722068- - 42001 00006D5E 6173206265656E2073- - 42001 00006D67 70656369666965640D- - 42001 00006D70 0A - 42002 - 42003 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM - 42004 %if 0 - 42005 MSG_1101: - 42006 db 14 - 42007 db ' %1.%2 to 1.0' - 42008 MSG_1102: - 42009 db 57 - 42010 db ' %1.%2 to 1.0 average compression ratio',0Dh,0Ah - 42011 %endif - 42012 - 42013 MSG_1103: - 42014 00006D71 1A db 26 - 42015 00006D72 4F7665727772697465- db 'Overwrite %1 (Yes/No/All)?' - 42015 00006D7B 20253120285965732F- - 42015 00006D84 4E6F2F416C6C293F - 42016 MSG_1104: - 42017 00006D8C 03 db 3 - 42018 00006D8D 59 _Y_es: db 'Y' - 42019 00006D8E 4E _N_o: db 'N' - 42020 00006D8F 41 _A_ll: db 'A' - 42021 - 42022 ; 02/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 42023 %if 0 - 42024 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:73FEh) - 42025 MSG_1105: - 42026 db 4 - 42027 db ' ' - 42028 %else - 42029 ; 03/08/2024 - 42030 MSG_1105: - 42031 00006D90 0A db 10 - 42032 00006D91 203C4449523E202020- db ' ' - 42032 00006D9A 20 - 42033 - 42034 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:724Eh) - 42035 MSG_1106: - 42036 00006D9B 11 db 17 - 42037 00006D9C 2531204B2062797465- db '%1 K bytes free',0Dh,0Ah - 42037 00006DA5 7320667265650D0A - 42038 %endif - 42039 - 42040 ; ((MSDOS 5.0 COMMAND.COM - TRANGROUP:63C2h)) - 42041 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7403h) - 42042 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:7260h - 42043 MSG_1200: - 42044 00006DAD 00 db 0 ; /? unimplemented - 42045 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7404h) - 42046 MSG_1300: - 42047 00006DAE 86 db 134 - 42048 00006DAF 53657473206F722063- db 'Sets or clears extended CTRL+C checking.',0Dh,0Ah - 42048 00006DB8 6C6561727320657874- - 42048 00006DC1 656E64656420435452- - 42048 00006DCA 4C2B4320636865636B- - 42048 00006DD3 696E672E0D0A - 42049 00006DD9 0D0A db 0Dh,0Ah - 42050 00006DDB 425245414B205B4F4E- db 'BREAK [ON | OFF]',0Dh,0Ah - 42050 00006DE4 207C204F46465D0D0A - 42051 00006DED 0D0A db 0Dh,0Ah - 42052 00006DEF 547970652042524541- db 'Type BREAK without a parameter to display the current BREAK setting.',0Dh,0Ah - 42052 00006DF8 4B20776974686F7574- - 42052 00006E01 206120706172616D65- - 42052 00006E0A 74657220746F206469- - 42052 00006E13 73706C617920746865- - 42052 00006E1C 2063757272656E7420- - 42052 00006E25 425245414B20736574- - 42052 00006E2E 74696E672E0D0A - 42053 MSG_1320: - 42054 00006E35 3F db 63 - 42055 00006E36 446973706C61797320- db 'Displays or sets the active code page number.',0Dh,0Ah - 42055 00006E3F 6F7220736574732074- - 42055 00006E48 686520616374697665- - 42055 00006E51 20636F646520706167- - 42055 00006E5A 65206E756D6265722E- - 42055 00006E63 0D0A - 42056 00006E65 0D0A db 0Dh,0Ah - 42057 00006E67 43484350205B6E6E6E- db 'CHCP [nnn]',0Dh,0Ah - 42057 00006E70 5D0D0A - 42058 00006E73 0D0A db 0Dh,0Ah - 42059 MSG_1321: - 42060 00006E75 70 db 112 - 42061 00006E76 20206E6E6E20202053- db ' nnn Specifies a code page number.',0Dh,0Ah - 42061 00006E7F 706563696669657320- - 42061 00006E88 6120636F6465207061- - 42061 00006E91 6765206E756D626572- - 42061 00006E9A 2E0D0A - 42062 00006E9D 0D0A db 0Dh,0Ah - 42063 00006E9F 547970652043484350- db 'Type CHCP without a parameter to display the active code page number.',0Dh,0Ah - 42063 00006EA8 20776974686F757420- - 42063 00006EB1 6120706172616D6574- - 42063 00006EBA 657220746F20646973- - 42063 00006EC3 706C61792074686520- - 42063 00006ECC 61637469766520636F- - 42063 00006ED5 64652070616765206E- - 42063 00006EDE 756D6265722E0D0A - 42064 MSG_1340: - 42065 00006EE6 5B db 91 - 42066 00006EE7 446973706C61797320- db 'Displays the name of or changes the current directory.',0Dh,0Ah - 42066 00006EF0 746865206E616D6520- - 42066 00006EF9 6F66206F7220636861- - 42066 00006F02 6E6765732074686520- - 42066 00006F0B 63757272656E742064- - 42066 00006F14 69726563746F72792E- - 42066 00006F1D 0D0A - 42067 00006F1F 0D0A db 0Dh,0Ah - 42068 00006F21 4348444952205B6472- db 'CHDIR [drive:][path]',0Dh,0Ah - 42068 00006F2A 6976653A5D5B706174- - 42068 00006F33 685D0D0A - 42069 00006F37 43484449525B2E2E5D- db 'CHDIR[..]',0Dh,0Ah - 42069 00006F40 0D0A - 42070 MSG_1341: - 42071 00006F42 62 db 98 - 42072 00006F43 4344205B6472697665- db 'CD [drive:][path]',0Dh,0Ah - 42072 00006F4C 3A5D5B706174685D0D- - 42072 00006F55 0A - 42073 00006F56 43445B2E2E5D0D0A db 'CD[..]',0Dh,0Ah - 42074 00006F5E 0D0A db 0Dh,0Ah - 42075 00006F60 20202E2E2020205370- db ' .. Specifies that you want to change to the parent directory.' - 42075 00006F69 656369666965732074- - 42075 00006F72 68617420796F752077- - 42075 00006F7B 616E7420746F206368- - 42075 00006F84 616E676520746F2074- - 42075 00006F8D 686520706172656E74- - 42075 00006F96 206469726563746F72- - 42075 00006F9F 792E - 42076 00006FA1 0D0A db 0Dh,0Ah - 42077 00006FA3 0D0A db 0Dh,0Ah - 42078 MSG_1342: - 42079 00006FA5 91 db 145 - 42080 00006FA6 547970652043442064- db 'Type CD drive: to display the current directory in the specified ' - 42080 00006FAF 726976653A20746F20- - 42080 00006FB8 646973706C61792074- - 42080 00006FC1 68652063757272656E- - 42080 00006FCA 74206469726563746F- - 42080 00006FD3 727920696E20746865- - 42080 00006FDC 207370656369666965- - 42080 00006FE5 6420 - 42081 00006FE7 64726976652E0D0A db 'drive.',0Dh,0Ah - 42082 00006FEF 547970652043442077- db 'Type CD without parameters to display the current drive and directory.',0Dh,0Ah - 42082 00006FF8 6974686F7574207061- - 42082 00007001 72616D657465727320- - 42082 0000700A 746F20646973706C61- - 42082 00007013 792074686520637572- - 42082 0000701C 72656E742064726976- - 42082 00007025 6520616E6420646972- - 42082 0000702E 6563746F72792E0D0A - 42083 MSG_1360: - 42084 00007037 1B db 27 - 42085 00007038 436C65617273207468- db 'Clears the screen.',0Dh,0Ah - 42085 00007041 652073637265656E2E- - 42085 0000704A 0D0A - 42086 0000704C 0D0A db 0Dh,0Ah - 42087 0000704E 434C530D0A db 'CLS',0Dh,0Ah - 42088 MSG_1400: - 42089 ;db 145 - 42090 ;db 'Copies one or more files to another location.',0Dh,0Ah - 42091 ;db 0Dh,0Ah - 42092 ;db 'COPY [/A | /B] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination',0Dh,0Ah - 42093 ;db ' [/A | /B]] [/V]',0Dh,0Ah + 41679 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM + 41680 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:6A8Dh + 41681 + 41682 MSG_1020: ; COMMON4 + 41683 000065DA 0F db 15 ; (MSG_1015-MSG_1020)-1 + 41684 000065DB 253120627974657320- db '%1 bytes free',0Dh,0Ah + 41684 000065E4 667265650D0A + 41685 MSG_1015: ; COMMON18 + 41686 000065EA 23 db 35 + 41687 000065EB 46696C652063616E6E- db 'File cannot be copied onto itself',0Dh,0Ah + 41687 000065F4 6F7420626520636F70- + 41687 000065FD 696564206F6E746F20- + 41687 00006606 697473656C660D0A + 41688 MSG_1004: ; COMMON20 + 41689 0000660E 19 db 25 + 41690 0000660F 496E73756666696369- db 'Insufficient disk space',0Dh,0Ah + 41690 00006618 656E74206469736B20- + 41690 00006621 73706163650D0A + 41691 MSG_1026: ; COMMON22 + 41692 00006628 13 db 19 + 41693 00006629 496E76616C69642063- db 'Invalid code page',0Dh,0Ah + 41693 00006632 6F646520706167650D- + 41693 0000663B 0A + 41694 MSG_1031: ; COMMON23 + 41695 0000663C 0E db 14 + 41696 0000663D 496E76616C69642064- db 'Invalid date',0Dh,0Ah + 41696 00006646 6174650D0A + 41697 MSG_1035: ; COMMON24 + 41698 0000664B 0E db 14 + 41699 0000664C 496E76616C69642074- db 'Invalid time',0Dh,0Ah + 41699 00006655 696D650D0A + 41700 MSG_1062: ; COMMON25 + 41701 0000665A 0E db 14 + 41702 0000665B 496E76616C69642070- db 'Invalid path',0Dh,0Ah + 41702 00006664 6174680D0A + 41703 MSG_1028: ; COMMON28 + 41704 00006669 21 db 33 + 41705 0000666A 507265737320616E79- db 'Press any key to continue . . .',0Dh,0Ah + 41705 00006673 206B657920746F2063- + 41705 0000667C 6F6E74696E7565202E- + 41705 00006685 202E202E0D0A + 41706 MSG_1045: ; COMMON32 + 41707 0000668B 1C db 28 + 41708 0000668C 556E61626C6520746F- db 'Unable to create directory',0Dh,0Ah + 41708 00006695 206372656174652064- + 41708 0000669E 69726563746F72790D- + 41708 000066A7 0A + 41709 MSG_1041: ; COMMON33 + 41710 000066A8 21 db 33 + 41711 000066A9 566F6C756D6520696E- db 'Volume in drive %1 has no label',0Dh,0Ah + 41711 000066B2 206472697665202531- + 41711 000066BB 20686173206E6F206C- + 41711 000066C4 6162656C0D0A + 41712 MSG_1042: ; COMMON34 + 41713 000066CA 1A db 26 + 41714 000066CB 566F6C756D6520696E- db 'Volume in drive %1 is %2',0Dh,0Ah + 41714 000066D4 206472697665202531- + 41714 000066DD 2069732025320D0A + 41715 MSG_1043: ; COMMON36 + 41716 000066E5 1F db 31 ; (MSG_1002-MSG_1043)-1 + 41717 000066E6 566F6C756D65205365- db 'Volume Serial Number is %1-%2',0Dh,0Ah + 41717 000066EF 7269616C204E756D62- + 41717 000066F8 65722069732025312D- + 41717 00006701 25320D0A + 41718 MSG_1002: + 41719 00006705 27 db 39 + 41720 00006706 4475706C6963617465- db 'Duplicate file name or file not found',0Dh,0Ah + 41720 0000670F 2066696C65206E616D- + 41720 00006718 65206F722066696C65- + 41720 00006721 206E6F7420666F756E- + 41720 0000672A 640D0A + 41721 MSG_1003: + 41722 0000672D 1B db 27 + 41723 0000672E 496E76616C69642070- db 'Invalid path or file name',0Dh,0Ah + 41723 00006737 617468206F72206669- + 41723 00006740 6C65206E616D650D0A + 41724 MSG_1007: + 41725 00006749 1A db 26 + 41726 0000674A 4F7574206F6620656E- db 'Out of environment space',0Dh,0Ah + 41726 00006753 7669726F6E6D656E74- + 41726 0000675C 2073706163650D0A + 41727 MSG_1008: + 41728 00006764 15 db 21 + 41729 00006765 46696C652063726561- db 'File creation error',0Dh,0Ah + 41729 0000676E 74696F6E206572726F- + 41729 00006777 720D0A + 41730 MSG_1009: + 41731 0000677A 14 db 20 ; (MSG_1010-MSG_1009)-1 + 41732 0000677B 42617463682066696C- db 'Batch file missing',0Dh,0Ah + 41732 00006784 65206D697373696E67- + 41732 0000678D 0D0A + 41733 MSG_1010: + 41734 0000678F 1F db 31 + 41735 00006790 0D0A db 0Dh,0Ah + 41736 00006792 496E73657274206469- db 'Insert disk with batch file',0Dh,0Ah + 41736 0000679B 736B20776974682062- + 41736 000067A4 617463682066696C65- + 41736 000067AD 0D0A + 41737 MSG_1011: + 41738 000067AF 1A db 26 + 41739 000067B0 42616420636F6D6D61- db 'Bad command or file name',0Dh,0Ah + 41739 000067B9 6E64206F722066696C- + 41739 000067C2 65206E616D650D0A + 41740 + 41741 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 41742 %if 1 + 41743 MSG_1012: + 41744 000067CA 1C db 28 + 41745 000067CB 5245585820696E7465- db 'REXX interpreter not found',0Dh,0Ah + 41745 000067D4 72707265746572206E- + 41745 000067DD 6F7420666F756E640D- + 41745 000067E6 0A + 41746 %endif + 41747 + 41748 MSG_1014: ; EXTEND5 + 41749 000067E7 10 db 16 + 41750 000067E8 416363657373206465- db 'Access denied ',0Dh,0Ah + 41750 000067F1 6E696564200D0A + 41751 MSG_1016: + 41752 000067F8 29 db 41 + 41753 000067F9 436F6E74656E74206F- db 'Content of destination lost before copy',0Dh,0Ah + 41753 00006802 662064657374696E61- + 41753 0000680B 74696F6E206C6F7374- + 41753 00006814 206265666F72652063- + 41753 0000681D 6F70790D0A + 41754 MSG_1017: + 41755 00006822 24 db 36 + 41756 00006823 496E76616C69642066- db 'Invalid filename or file not found',0Dh,0Ah + 41756 0000682C 696C656E616D65206F- + 41756 00006835 722066696C65206E6F- + 41756 0000683E 7420666F756E640D0A + 41757 MSG_1018: + 41758 00006847 13 db 19 + 41759 00006848 25312066696C652873- db '%1 file(s) copied',0Dh,0Ah + 41759 00006851 2920636F706965640D- + 41759 0000685A 0A + 41760 MSG_1019: + 41761 0000685B 0B db 11 + 41762 0000685C 25312066696C652873- db '%1 file(s) ' + 41762 00006865 2920 + 41763 MSG_1021: ; EXTEND15 + 41764 00006867 1D db 29 + 41765 00006868 496E76616C69642064- db 'Invalid drive specification',0Dh,0Ah + 41765 00006871 726976652073706563- + 41765 0000687A 696669636174696F6E- + 41765 00006883 0D0A + 41766 MSG_1022: + 41767 00006885 26 db 38 + 41768 00006886 436F64652070616765- db 'Code page %1 not prepared for system',0Dh,0Ah + 41768 0000688F 202531206E6F742070- + 41768 00006898 726570617265642066- + 41768 000068A1 6F722073797374656D- + 41768 000068AA 0D0A + 41769 MSG_1023: + 41770 000068AC 2B db 43 + 41771 000068AD 436F64652070616765- db 'Code page %1 not prepared for all devices',0Dh,0Ah + 41771 000068B6 202531206E6F742070- + 41771 000068BF 726570617265642066- + 41771 000068C8 6F7220616C6C206465- + 41771 000068D1 76696365730D0A + 41772 MSG_1024: + 41773 000068D8 16 db 22 + 41774 000068D9 41637469766520636F- db 'Active code page: %1',0Dh,0Ah + 41774 000068E2 646520706167653A20- + 41774 000068EB 25310D0A + 41775 MSG_1025: + 41776 000068EF 17 db 23 + 41777 000068F0 4E4C5346554E43206E- db 'NLSFUNC not installed',0Dh,0Ah + 41777 000068F9 6F7420696E7374616C- + 41777 00006902 6C65640D0A + 41778 MSG_1027: + 41779 00006907 20 db 32 + 41780 00006908 43757272656E742064- db 'Current drive is no longer valid' + 41780 00006911 72697665206973206E- + 41780 0000691A 6F206C6F6E67657220- + 41780 00006923 76616C6964 + 41781 MSG_1029: + 41782 00006928 11 db 17 + 41783 00006929 4C6162656C206E6F74- db 'Label not found',0Dh,0Ah + 41783 00006932 20666F756E640D0A + 41784 MSG_1030: + 41785 0000693A 0E db 14 + 41786 0000693B 53796E746178206572- db 'Syntax error',0Dh,0Ah + 41786 00006944 726F720D0A + 41787 MSG_1032: + 41788 00006949 17 db 23 + 41789 0000694A 43757272656E742064- db 'Current date is %1 %2',0Dh,0Ah + 41789 00006953 617465206973202531- + 41789 0000695C 2025320D0A + 41790 MSG_1033: + 41791 00006961 15 db 21 + 41792 00006962 53756E4D6F6E547565- db 'SunMonTueWedThuFriSat' + 41792 0000696B 576564546875467269- + 41792 00006974 536174 + 41793 MSG_1034: + 41794 00006977 15 db 21 + 41795 00006978 456E746572206E6577- db 'Enter new date (%1): ' + 41795 00006981 206461746520282531- + 41795 0000698A 293A20 + 41796 MSG_1036: + 41797 0000698D 14 db 20 + 41798 0000698E 43757272656E742074- db 'Current time is %1',0Dh,0Ah + 41798 00006997 696D65206973202531- + 41798 000069A0 0D0A + 41799 MSG_1037: + 41800 000069A2 10 db 16 + 41801 000069A3 456E746572206E6577- db 'Enter new time: ' + 41801 000069AC 2074696D653A20 + 41802 MSG_1038: + 41803 000069B3 12 db 18 + 41804 000069B4 2C2020202044656C65- db ', Delete (Y/N)?' + 41804 000069BD 74652028592F4E293F + 41805 MSG_1039: + 41806 000069C6 3C db 60 + 41807 000069C7 416C6C2066696C6573- db 'All files in directory will be deleted!',0Dh,0Ah + 41807 000069D0 20696E206469726563- + 41807 000069D9 746F72792077696C6C- + 41807 000069E2 2062652064656C6574- + 41807 000069EB 6564210D0A + 41808 000069F0 41726520796F752073- db 'Are you sure (Y/N)?' + 41808 000069F9 7572652028592F4E29- + 41808 00006A02 3F + 41809 + 41810 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 41811 %if 0 + 41812 MSG_1040: + 41813 db 20 + 41814 db 'MS-DOS Version %1.%2' + 41815 %else + 41816 MSG_1040: + 41817 00006A03 12 db 18 + 41818 00006A04 504320444F53205665- db 'PC DOS Version 7.1' + 41818 00006A0D 7273696F6E20372E31 + 41819 %endif + 41820 + 41821 MSG_1044: + 41822 00006A16 13 db 19 + 41823 00006A17 496E76616C69642064- db 'Invalid directory',0Dh,0Ah + 41823 00006A20 69726563746F72790D- + 41823 00006A29 0A + 41824 MSG_1046: + 41825 00006A2A 36 db 54 + 41826 00006A2B 496E76616C69642070- db 'Invalid path, not directory,',0Dh,0Ah + 41826 00006A34 6174682C206E6F7420- + 41826 00006A3D 6469726563746F7279- + 41826 00006A46 2C0D0A + 41827 00006A49 6F7220646972656374- db 'or directory not empty',0Dh,0Ah + 41827 00006A52 6F7279206E6F742065- + 41827 00006A5B 6D7074790D0A + 41828 MSG_1047: + 41829 00006A61 18 db 24 + 41830 00006A62 4D7573742073706563- db 'Must specify ON or OFF',0Dh,0Ah + 41830 00006A6B 696679204F4E206F72- + 41830 00006A74 204F46460D0A + 41831 MSG_1048: + 41832 00006A7A 11 db 17 + 41833 00006A7B 4469726563746F7279- db 'Directory of %1',0Dh,0Ah + 41833 00006A84 206F662025310D0A + 41834 MSG_1049: + 41835 00006A8C 09 db 9 + 41836 00006A8D 4E6F20506174680D0A db 'No Path',0Dh,0Ah + 41837 MSG_1050: + 41838 00006A96 1E db 30 + 41839 00006A97 496E76616C69642064- db 'Invalid drive in search path',0Dh,0Ah + 41839 00006AA0 7269766520696E2073- + 41839 00006AA9 656172636820706174- + 41839 00006AB2 680D0A + 41840 MSG_1051: + 41841 00006AB5 10 db 16 + 41842 00006AB6 496E76616C69642064- db 'Invalid device',0Dh,0Ah + 41842 00006ABF 65766963650D0A + 41843 MSG_1052: + 41844 00006AC6 16 db 22 + 41845 00006AC7 464F522063616E6E6F- db 'FOR cannot be nested',0Dh,0Ah + 41845 00006AD0 74206265206E657374- + 41845 00006AD9 65640D0A + 41846 MSG_1053: + 41847 00006ADD 25 db 37 + 41848 00006ADE 496E7465726D656469- db 'Intermediate file error during pipe',0Dh,0Ah + 41848 00006AE7 6174652066696C6520- + 41848 00006AF0 6572726F7220647572- + 41848 00006AF9 696E6720706970650D- + 41848 00006B02 0A + 41849 MSG_1054: + 41850 00006B03 26 db 38 + 41851 00006B04 43616E6E6F7420646F- db 'Cannot do binary reads from a device',0Dh,0Ah + 41851 00006B0D 2062696E6172792072- + 41851 00006B16 656164732066726F6D- + 41851 00006B1F 206120646576696365- + 41851 00006B28 0D0A + 41852 + 41853 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:6205h) + 41854 ; 17/06/2023 + 41855 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7155h) + 41856 ; 06/08/2024 + 41857 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:6FDDh) + 41858 MSG_1055: + 41859 00006B2A 0D db 13 + 41860 00006B2B 425245414B20697320- db 'BREAK is %1',0Dh,0Ah + 41860 00006B34 25310D0A + 41861 MSG_1056: + 41862 00006B38 0E db 14 + 41863 00006B39 564552494659206973- db 'VERIFY is %1',0Dh,0Ah + 41863 00006B42 2025310D0A + 41864 MSG_1057: + 41865 00006B47 0C db 12 + 41866 00006B48 4543484F2069732025- db 'ECHO is %1',0Dh,0Ah + 41866 00006B51 310D0A + 41867 MSG_1059: + 41868 00006B54 04 db 4 + 41869 00006B55 6F666600 db 'off',0 + 41870 MSG_1060: + 41871 00006B59 03 db 3 + 41872 00006B5A 6F6E00 db 'on',0 + 41873 MSG_1061: + 41874 00006B5D 19 db 25 + 41875 00006B5E 4572726F7220777269- db 'Error writing to device',0Dh,0Ah + 41875 00006B67 74696E6720746F2064- + 41875 00006B70 65766963650D0A + 41876 MSG_1063: + 41877 00006B77 02 db 2 + 41878 00006B78 2531 db '%1' + 41879 MSG_1064: + 41880 00006B7A 02 db 2 + 41881 00006B7B 2531 db '%1' + 41882 MSG_1065: + 41883 00006B7D 02 db 2 + 41884 00006B7E 2531 db '%1' + 41885 MSG_1066: + 41886 00006B80 02 db 2 + 41887 00006B81 2531 db '%1' + 41888 MSG_1067: + 41889 00006B83 01 db 1 + 41890 00006B84 09 db 9 + 41891 MSG_1068: + 41892 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 41893 %if 0 + 41894 db 10 + 41895 db ' ' + 41896 %else + 41897 00006B85 0C db 12 + 41898 00006B86 203C4449523E202020- db ' ' + 41898 00006B8F 202020 + 41899 %endif + 41900 MSG_1069: + 41901 00006B92 03 db 3 + 41902 00006B93 082008 db 8, 20h, 8 + 41903 MSG_1070: ; CRLF + 41904 00006B96 02 db 2 + 41905 00006B97 0D db 0Dh + 41906 00006B98 0A db 0Ah + 41907 MSG_1071: + 41908 00006B99 02 db 2 + 41909 00006B9A 2531 db '%1' + 41910 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM + 41911 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:71C5h + 41912 MSG_1072: + 41913 ;db 8 + 41914 ;db 'mm-dd-yy' + 41915 00006B9C 09 db 9 + 41916 00006B9D 6D6D2D64642D797900 db 'mm-dd-yy',0 + 41917 MSG_1073: + 41918 ;db 8 + 41919 ;db 'dd-mm-yy' + 41920 00006BA6 09 db 9 + 41921 00006BA7 64642D6D6D2D797900 db 'dd-mm-yy',0 + 41922 MSG_1074: + 41923 ;db 8 + 41924 ;db 'yy-mm-dd' + 41925 00006BB0 09 db 9 + 41926 00006BB1 79792D6D6D2D646400 db 'yy-mm-dd',0 + 41927 MSG_1075: + 41928 00006BBA 05 db 5 + 41929 00006BBB 2531202532 db '%1 %2' + 41930 MSG_1076: + 41931 00006BC0 02 db 2 + 41932 00006BC1 2531 db '%1' + 41933 MSG_1077: + 41934 00006BC3 07 db 7 + 41935 00006BC4 20253120202532 db ' %1 %2' + 41936 MSG_1078: + 41937 00006BCB 1A db 26 + 41938 00006BCC 4469726563746F7279- db 'Directory already exists',0Dh,0Ah + 41938 00006BD5 20616C726561647920- + 41938 00006BDE 6578697374730D0A + 41939 MSG_1079: + 41940 00006BE6 0A db 10 + 41941 00006BE7 25312062797465730D- db '%1 bytes',0Dh,0Ah + 41941 00006BF0 0A + 41942 MSG_1080: + 41943 00006BF1 15 db 21 + 41944 00006BF2 546F74616C2066696C- db 'Total files listed:',0Dh,0Ah + 41944 00006BFB 6573206C6973746564- + 41944 00006C04 3A0D0A + 41945 MSG_1081: + 41946 00006C07 2A db 42 + 41947 00006C08 284572726F72206F63- db '(Error occurred in environment variable)',0Dh,0Ah + 41947 00006C11 63757272656420696E- + 41947 00006C1A 20656E7669726F6E6D- + 41947 00006C23 656E74207661726961- + 41947 00006C2C 626C65290D0A + 41948 ; + 41949 ; 06/08/2024 -Retro DOS 5.0 COMMAND.COM + 41950 %if 0 + 41951 ; 17/06/2023 - Retro DOS 4.2 COMMAND.COM + 41952 MSG_1082: + 41953 db 7 + 41954 db ' [Y/N]?' + 41955 %else + 41956 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 41957 MSG_1082: + 41958 00006C32 0B db 11 + 41959 00006C33 205B592C4E2C455343- db ' [Y,N,ESC]?' + 41959 00006C3C 5D3F + 41960 %endif + 41961 ; + 41962 MSG_1083: + 41963 00006C3E 02 db 2 + 41964 00006C3F 594E db 'YN' + 41965 ; + 41966 MSG_1084: + 41967 00006C41 0F db 15 + 41968 00006C42 28636F6E74696E7569- db '(continuing %1)' + 41968 00006C4B 6E6720253129 + 41969 MSG_1090: + 41970 00006C51 0D db 13 + 41971 00006C52 5265766973696F6E20- db 'Revision %1',0Dh,0Ah + 41971 00006C5B 25310D0A + 41972 MSG_1091: + 41973 00006C5F 0D db 13 + 41974 00006C60 444F5320697320696E- db 'DOS is in ROM' + 41974 00006C69 20524F4D + 41975 MSG_1092: + 41976 00006C6D 0D db 13 + 41977 00006C6E 444F5320697320696E- db 'DOS is in HMA' + 41977 00006C77 20484D41 + 41978 MSG_1093: + 41979 00006C7B 14 db 20 + 41980 00006C7C 444F5320697320696E- db 'DOS is in low memory' + 41980 00006C85 206C6F77206D656D6F- + 41980 00006C8E 7279 + 41981 MSG_1094: + 41982 00006C90 1C db 28 + 41983 00006C91 43616E6E6F74204C6F- db 'Cannot Loadhigh batch file',0Dh,0Ah + 41983 00006C9A 616468696768206261- + 41983 00006CA3 7463682066696C650D- + 41983 00006CAC 0A + 41984 MSG_1095: + 41985 00006CAD 1C db 28 + 41986 00006CAE 4C6F6164486967683A- db 'LoadHigh: Invalid filename',0Dh,0Ah + 41986 00006CB7 20496E76616C696420- + 41986 00006CC0 66696C656E616D650D- + 41986 00006CC9 0A + 41987 MSG_1096: + 41988 00006CCA 30 db 48 + 41989 00006CCB 43616E6E6F74206F70- db 'Cannot open specified country information file',0Dh,0Ah + 41989 00006CD4 656E20737065636966- + 41989 00006CDD 69656420636F756E74- + 41989 00006CE6 727920696E666F726D- + 41989 00006CEF 6174696F6E2066696C- + 41989 00006CF8 650D0A + 41990 + 41991 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 41992 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7320h + 41993 MSG_1097: + 41994 00006CFB 1C db 28 + 41995 00006CFC 4C6F6164486967683A- db 'LoadHigh: Invalid argument',0Dh,0Ah + 41995 00006D05 20496E76616C696420- + 41995 00006D0E 617267756D656E740D- + 41995 00006D17 0A + 41996 MSG_1098: + 41997 00006D18 1C db 28 + 41998 00006D19 526571756972656420- db 'Required parameter missing',0Dh,0Ah + 41998 00006D22 706172616D65746572- + 41998 00006D2B 206D697373696E670D- + 41998 00006D34 0A + 41999 MSG_1099: + 42000 00006D35 15 db 21 + 42001 00006D36 556E7265636F676E69- db 'Unrecognized switch',0Dh,0Ah + 42001 00006D3F 7A6564207377697463- + 42001 00006D48 680D0A + 42002 MSG_1100: + 42003 00006D4B 25 db 37 + 42004 00006D4C 412062616420554D42- db 'A bad UMB number has been specified',0Dh,0Ah + 42004 00006D55 206E756D6265722068- + 42004 00006D5E 6173206265656E2073- + 42004 00006D67 70656369666965640D- + 42004 00006D70 0A + 42005 + 42006 ; 02/08/2024 - PCDOS 7.1 COMMAND.COM + 42007 %if 0 + 42008 MSG_1101: + 42009 db 14 + 42010 db ' %1.%2 to 1.0' + 42011 MSG_1102: + 42012 db 57 + 42013 db ' %1.%2 to 1.0 average compression ratio',0Dh,0Ah + 42014 %endif + 42015 + 42016 MSG_1103: + 42017 00006D71 1A db 26 + 42018 00006D72 4F7665727772697465- db 'Overwrite %1 (Yes/No/All)?' + 42018 00006D7B 20253120285965732F- + 42018 00006D84 4E6F2F416C6C293F + 42019 MSG_1104: + 42020 00006D8C 03 db 3 + 42021 00006D8D 59 _Y_es: db 'Y' + 42022 00006D8E 4E _N_o: db 'N' + 42023 00006D8F 41 _A_ll: db 'A' + 42024 + 42025 ; 02/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 42026 %if 0 + 42027 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:73FEh) + 42028 MSG_1105: + 42029 db 4 + 42030 db ' ' + 42031 %else + 42032 ; 03/08/2024 + 42033 MSG_1105: + 42034 00006D90 0A db 10 + 42035 00006D91 203C4449523E202020- db ' ' + 42035 00006D9A 20 + 42036 + 42037 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:724Eh) + 42038 MSG_1106: + 42039 00006D9B 11 db 17 + 42040 00006D9C 2531204B2062797465- db '%1 K bytes free',0Dh,0Ah + 42040 00006DA5 7320667265650D0A + 42041 %endif + 42042 + 42043 ; ((MSDOS 5.0 COMMAND.COM - TRANGROUP:63C2h)) + 42044 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7403h) + 42045 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:7260h + 42046 MSG_1200: + 42047 00006DAD 00 db 0 ; /? unimplemented + 42048 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7404h) + 42049 MSG_1300: + 42050 00006DAE 86 db 134 + 42051 00006DAF 53657473206F722063- db 'Sets or clears extended CTRL+C checking.',0Dh,0Ah + 42051 00006DB8 6C6561727320657874- + 42051 00006DC1 656E64656420435452- + 42051 00006DCA 4C2B4320636865636B- + 42051 00006DD3 696E672E0D0A + 42052 00006DD9 0D0A db 0Dh,0Ah + 42053 00006DDB 425245414B205B4F4E- db 'BREAK [ON | OFF]',0Dh,0Ah + 42053 00006DE4 207C204F46465D0D0A + 42054 00006DED 0D0A db 0Dh,0Ah + 42055 00006DEF 547970652042524541- db 'Type BREAK without a parameter to display the current BREAK setting.',0Dh,0Ah + 42055 00006DF8 4B20776974686F7574- + 42055 00006E01 206120706172616D65- + 42055 00006E0A 74657220746F206469- + 42055 00006E13 73706C617920746865- + 42055 00006E1C 2063757272656E7420- + 42055 00006E25 425245414B20736574- + 42055 00006E2E 74696E672E0D0A + 42056 MSG_1320: + 42057 00006E35 3F db 63 + 42058 00006E36 446973706C61797320- db 'Displays or sets the active code page number.',0Dh,0Ah + 42058 00006E3F 6F7220736574732074- + 42058 00006E48 686520616374697665- + 42058 00006E51 20636F646520706167- + 42058 00006E5A 65206E756D6265722E- + 42058 00006E63 0D0A + 42059 00006E65 0D0A db 0Dh,0Ah + 42060 00006E67 43484350205B6E6E6E- db 'CHCP [nnn]',0Dh,0Ah + 42060 00006E70 5D0D0A + 42061 00006E73 0D0A db 0Dh,0Ah + 42062 MSG_1321: + 42063 00006E75 70 db 112 + 42064 00006E76 20206E6E6E20202053- db ' nnn Specifies a code page number.',0Dh,0Ah + 42064 00006E7F 706563696669657320- + 42064 00006E88 6120636F6465207061- + 42064 00006E91 6765206E756D626572- + 42064 00006E9A 2E0D0A + 42065 00006E9D 0D0A db 0Dh,0Ah + 42066 00006E9F 547970652043484350- db 'Type CHCP without a parameter to display the active code page number.',0Dh,0Ah + 42066 00006EA8 20776974686F757420- + 42066 00006EB1 6120706172616D6574- + 42066 00006EBA 657220746F20646973- + 42066 00006EC3 706C61792074686520- + 42066 00006ECC 61637469766520636F- + 42066 00006ED5 64652070616765206E- + 42066 00006EDE 756D6265722E0D0A + 42067 MSG_1340: + 42068 00006EE6 5B db 91 + 42069 00006EE7 446973706C61797320- db 'Displays the name of or changes the current directory.',0Dh,0Ah + 42069 00006EF0 746865206E616D6520- + 42069 00006EF9 6F66206F7220636861- + 42069 00006F02 6E6765732074686520- + 42069 00006F0B 63757272656E742064- + 42069 00006F14 69726563746F72792E- + 42069 00006F1D 0D0A + 42070 00006F1F 0D0A db 0Dh,0Ah + 42071 00006F21 4348444952205B6472- db 'CHDIR [drive:][path]',0Dh,0Ah + 42071 00006F2A 6976653A5D5B706174- + 42071 00006F33 685D0D0A + 42072 00006F37 43484449525B2E2E5D- db 'CHDIR[..]',0Dh,0Ah + 42072 00006F40 0D0A + 42073 MSG_1341: + 42074 00006F42 62 db 98 + 42075 00006F43 4344205B6472697665- db 'CD [drive:][path]',0Dh,0Ah + 42075 00006F4C 3A5D5B706174685D0D- + 42075 00006F55 0A + 42076 00006F56 43445B2E2E5D0D0A db 'CD[..]',0Dh,0Ah + 42077 00006F5E 0D0A db 0Dh,0Ah + 42078 00006F60 20202E2E2020205370- db ' .. Specifies that you want to change to the parent directory.' + 42078 00006F69 656369666965732074- + 42078 00006F72 68617420796F752077- + 42078 00006F7B 616E7420746F206368- + 42078 00006F84 616E676520746F2074- + 42078 00006F8D 686520706172656E74- + 42078 00006F96 206469726563746F72- + 42078 00006F9F 792E + 42079 00006FA1 0D0A db 0Dh,0Ah + 42080 00006FA3 0D0A db 0Dh,0Ah + 42081 MSG_1342: + 42082 00006FA5 91 db 145 + 42083 00006FA6 547970652043442064- db 'Type CD drive: to display the current directory in the specified ' + 42083 00006FAF 726976653A20746F20- + 42083 00006FB8 646973706C61792074- + 42083 00006FC1 68652063757272656E- + 42083 00006FCA 74206469726563746F- + 42083 00006FD3 727920696E20746865- + 42083 00006FDC 207370656369666965- + 42083 00006FE5 6420 + 42084 00006FE7 64726976652E0D0A db 'drive.',0Dh,0Ah + 42085 00006FEF 547970652043442077- db 'Type CD without parameters to display the current drive and directory.',0Dh,0Ah + 42085 00006FF8 6974686F7574207061- + 42085 00007001 72616D657465727320- + 42085 0000700A 746F20646973706C61- + 42085 00007013 792074686520637572- + 42085 0000701C 72656E742064726976- + 42085 00007025 6520616E6420646972- + 42085 0000702E 6563746F72792E0D0A + 42086 MSG_1360: + 42087 00007037 1B db 27 + 42088 00007038 436C65617273207468- db 'Clears the screen.',0Dh,0Ah + 42088 00007041 652073637265656E2E- + 42088 0000704A 0D0A + 42089 0000704C 0D0A db 0Dh,0Ah + 42090 0000704E 434C530D0A db 'CLS',0Dh,0Ah + 42091 MSG_1400: + 42092 ;db 145 + 42093 ;db 'Copies one or more files to another location.',0Dh,0Ah 42094 ;db 0Dh,0Ah - 42095 - 42096 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42097 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:76A9h) - 42098 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42099 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:7506h) - 42100 - 42101 00007053 9C db 156 ; 19/06/2023 - 42102 00007054 436F70696573206F6E- db 'Copies one or more files to another location.',0Dh,0Ah - 42102 0000705D 65206F72206D6F7265- - 42102 00007066 2066696C657320746F- - 42102 0000706F 20616E6F7468657220- - 42102 00007078 6C6F636174696F6E2E- - 42102 00007081 0D0A - 42103 00007083 0D0A db 0Dh,0Ah - 42104 00007085 434F5059205B2F4120- db 'COPY [/A | /B] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination',0Dh,0Ah - 42104 0000708E 7C202F425D20736F75- - 42104 00007097 726365205B2F41207C- - 42104 000070A0 202F425D205B2B2073- - 42104 000070A9 6F75726365205B2F41- - 42104 000070B2 207C202F425D205B2B- - 42104 000070BB 202E2E2E5D5D205B64- - 42104 000070C4 657374696E6174696F- - 42104 000070CD 6E0D0A - 42105 000070D0 20205B2F41207C202F- db ' [/A | /B]] [/V] [/Y | /-Y]',0Dh,0Ah - 42105 000070D9 425D5D205B2F565D20- - 42105 000070E2 5B2F59207C202F2D59- - 42105 000070EB 5D0D0A - 42106 000070EE 0D0A db 0Dh,0Ah - 42107 MSG_1401: - 42108 000070F0 68 db 104 - 42109 000070F1 2020736F7572636520- db ' source Specifies the file or files to be copied.',0Dh,0Ah - 42109 000070FA 202020202020537065- - 42109 00007103 636966696573207468- - 42109 0000710C 652066696C65206F72- - 42109 00007115 2066696C657320746F- - 42109 0000711E 20626520636F706965- - 42109 00007127 642E0D0A - 42110 0000712B 20202F412020202020- db ' /A Indicates an ASCII text file.',0Dh,0Ah - 42110 00007134 202020202020496E64- - 42110 0000713D 69636174657320616E- - 42110 00007146 204153434949207465- - 42110 0000714F 78742066696C652E0D- - 42110 00007158 0A - 42111 MSG_1402: - 42112 00007159 76 db 118 - 42113 0000715A 20202F422020202020- db ' /B Indicates a binary file.',0Dh,0Ah - 42113 00007163 202020202020496E64- - 42113 0000716C 696361746573206120- - 42113 00007175 62696E617279206669- - 42113 0000717E 6C652E0D0A - 42114 00007183 202064657374696E61- db ' destination Specifies the directory and/or filename for the new file(s).',0Dh,0Ah - 42114 0000718C 74696F6E2020537065- - 42114 00007195 636966696573207468- - 42114 0000719E 65206469726563746F- - 42114 000071A7 727920616E642F6F72- - 42114 000071B0 2066696C656E616D65- - 42114 000071B9 20666F722074686520- - 42114 000071C2 6E65772066696C6528- - 42114 000071CB 73292E0D0A - 42115 MSG_1403: - 42116 ;db 65 ; MSDOS 5.0 - 42117 ; 17/06/2023 - 42118 000071D0 3F db 63 ; MSDOS 6.22 - 42119 000071D1 20202F562020202020- db ' /V Verifies that new files are written correctly.',0Dh,0Ah - 42119 000071DA 202020202020566572- - 42119 000071E3 696669657320746861- - 42119 000071EC 74206E65772066696C- - 42119 000071F5 657320617265207772- - 42119 000071FE 697474656E20636F72- - 42119 00007207 726563746C792E0D0A - 42120 ;db 0Dh,0Ah ; MSDOS 5.0 - 42121 - 42122 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42123 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7866h - 42124 MSG_1404: - 42125 00007210 74 db 116 - 42126 00007211 20202F592020202020- db ' /Y Suppresses prompting to confirm you want to overwrite an',0Dh,0Ah - 42126 0000721A 202020202020537570- - 42126 00007223 707265737365732070- - 42126 0000722C 726F6D7074696E6720- - 42126 00007235 746F20636F6E666972- - 42126 0000723E 6D20796F752077616E- - 42126 00007247 7420746F206F766572- - 42126 00007250 777269746520616E0D- - 42126 00007259 0A - 42127 0000725A 202020202020202020- db ' existing destination file.',0Dh,0Ah - 42127 00007263 202020202020657869- - 42127 0000726C 7374696E6720646573- - 42127 00007275 74696E6174696F6E20- - 42127 0000727E 66696C652E0D0A - 42128 MSG_1405: - 42129 00007285 72 db 114 - 42130 00007286 20202F2D5920202020- db ' /-Y Causes prompting to confirm you want to overwrite an',0Dh,0Ah - 42130 0000728F 202020202020436175- - 42130 00007298 7365732070726F6D70- - 42130 000072A1 74696E6720746F2063- - 42130 000072AA 6F6E6669726D20796F- - 42130 000072B3 752077616E7420746F- - 42130 000072BC 206F76657277726974- - 42130 000072C5 6520616E0D0A - 42131 000072CB 202020202020202020- db ' existing destination file.',0Dh,0Ah - 42131 000072D4 202020202020657869- - 42131 000072DD 7374696E6720646573- - 42131 000072E6 74696E6174696F6E20- - 42131 000072EF 66696C652E0D0A - 42132 000072F6 0D0A db 0Dh,0Ah - 42133 MSG_1406: - 42134 000072F8 42 db 66 - 42135 000072F9 546865207377697463- db 'The switch /Y may be preset in the COPYCMD environment variable.',0Dh,0Ah - 42135 00007302 68202F59206D617920- - 42135 0000730B 626520707265736574- - 42135 00007314 20696E207468652043- - 42135 0000731D 4F5059434D4420656E- - 42135 00007326 7669726F6E6D656E74- - 42135 0000732F 207661726961626C65- - 42135 00007338 2E0D0A - 42136 - 42137 ;MSG_1404: ; MSDOS 5.0 (TRANGROUP:681Ch) - 42138 ; MSDOS 6.22 (TRANGROUP:7991h) - 42139 MSG_1407: ; PCDOS 7.1 (TRANGROUP:77EEh) - 42140 0000733B 87 db 135 - 42141 0000733C 546F20617070656E64- db 'To append files, specify a single file for destination, but multiple files',0Dh,0Ah - 42141 00007345 2066696C65732C2073- - 42141 0000734E 706563696679206120- - 42141 00007357 73696E676C65206669- - 42141 00007360 6C6520666F72206465- - 42141 00007369 7374696E6174696F6E- - 42141 00007372 2C20627574206D756C- - 42141 0000737B 7469706C652066696C- - 42141 00007384 65730D0A - 42142 00007388 666F7220736F757263- db 'for source (using wildcards or file1+file2+file3 format).',0Dh,0Ah - 42142 00007391 6520287573696E6720- - 42142 0000739A 77696C646361726473- - 42142 000073A3 206F722066696C6531- - 42142 000073AC 2B66696C65322B6669- - 42142 000073B5 6C653320666F726D61- - 42142 000073BE 74292E0D0A - 42143 MSG_1420: - 42144 000073C3 8A db 138 - 42145 000073C4 4368616E6765732074- db 'Changes the terminal device used to control your system.',0Dh,0Ah - 42145 000073CD 6865207465726D696E- - 42145 000073D6 616C20646576696365- - 42145 000073DF 207573656420746F20- - 42145 000073E8 636F6E74726F6C2079- - 42145 000073F1 6F7572207379737465- - 42145 000073FA 6D2E0D0A - 42146 000073FE 0D0A db 0Dh,0Ah - 42147 00007400 435454592064657669- db 'CTTY device',0Dh,0Ah - 42147 00007409 63650D0A - 42148 0000740D 0D0A db 0Dh,0Ah - 42149 0000740F 202064657669636520- db ' device The terminal device you want to use, such as COM1.',0Dh,0Ah - 42149 00007418 202054686520746572- - 42149 00007421 6D696E616C20646576- - 42149 0000742A 69636520796F752077- - 42149 00007433 616E7420746F207573- - 42149 0000743C 652C20737563682061- - 42149 00007445 7320434F4D312E0D0A - 42150 MSG_1440: - 42151 ;db 45 - 42152 ;db 'Displays or sets the date.',0Dh,0Ah - 42153 ;db 0Dh,0Ah - 42154 ;db 'DATE [date]',0Dh,0Ah - 42155 ;db 0Dh,0Ah - 42156 - 42157 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42158 %if 0 - 42159 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42160 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7AA4h) - 42161 db 93 - 42162 db 'Displays or sets the date.',0Dh,0Ah - 42163 db 0Dh,0Ah - 42164 db 'DATE [mm-dd-yy]',0Dh,0Ah - 42165 db 0Dh,0Ah - 42166 db ' mm-dd-yy Sets the date you specify.',0Dh,0Ah - 42167 db 0Dh,0Ah - 42168 %else - 42169 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42170 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:7901h) - 42171 0000744E 26 db 38 - 42172 0000744F 446973706C61797320- db 'Displays or sets the date.',0Dh,0Ah - 42172 00007458 6F7220736574732074- - 42172 00007461 686520646174652E0D- - 42172 0000746A 0A - 42173 0000746B 0D0A db 0Dh,0Ah - 42174 0000746D 444154450D0A db 'DATE',0Dh,0Ah - 42175 00007473 0D0A db 0Dh,0Ah - 42176 %endif - 42177 - 42178 MSG_1441: - 42179 00007475 83 db 131 - 42180 00007476 547970652044415445- db 'Type DATE without parameters to display the current date setting and',0Dh,0Ah - 42180 0000747F 20776974686F757420- - 42180 00007488 706172616D65746572- - 42180 00007491 7320746F2064697370- - 42180 0000749A 6C6179207468652063- - 42180 000074A3 757272656E74206461- - 42180 000074AC 74652073657474696E- - 42180 000074B5 6720616E640D0A - 42181 000074BC 612070726F6D707420- db 'a prompt for a new one. Press ENTER to keep the same date.',0Dh,0Ah - 42181 000074C5 666F722061206E6577- - 42181 000074CE 206F6E652E20205072- - 42181 000074D7 65737320454E544552- - 42181 000074E0 20746F206B65657020- - 42181 000074E9 7468652073616D6520- - 42181 000074F2 646174652E0D0A - 42182 MSG_1460: - 42183 000074F9 64 db 100 - 42184 000074FA 44656C65746573206F- db 'Deletes one or more files.',0Dh,0Ah - 42184 00007503 6E65206F72206D6F72- - 42184 0000750C 652066696C65732E0D- - 42184 00007515 0A - 42185 00007516 0D0A db 0Dh,0Ah - 42186 00007518 44454C205B64726976- db 'DEL [drive:][path]filename [/P]',0Dh,0Ah - 42186 00007521 653A5D5B706174685D- - 42186 0000752A 66696C656E616D6520- - 42186 00007533 5B2F505D0D0A - 42187 00007539 4552415345205B6472- db 'ERASE [drive:][path]filename [/P]',0Dh,0Ah - 42187 00007542 6976653A5D5B706174- - 42187 0000754B 685D66696C656E616D- - 42187 00007554 65205B2F505D0D0A - 42188 0000755C 0D0A db 0Dh,0Ah - 42189 MSG_1461: - 42190 0000755E 83 db 131 - 42191 0000755F 20205B64726976653A- db ' [drive:][path]filename Specifies the file(s) to delete. Specify multiple',0Dh,0Ah - 42191 00007568 5D5B706174685D6669- - 42191 00007571 6C656E616D65202053- - 42191 0000757A 706563696669657320- - 42191 00007583 7468652066696C6528- - 42191 0000758C 732920746F2064656C- - 42191 00007595 6574652E2020537065- - 42191 0000759E 63696679206D756C74- - 42191 000075A7 69706C650D0A - 42192 000075AD 202020202020202020- db ' files by using wildcards.',0Dh,0Ah - 42192 000075B6 202020202020202020- - 42192 000075BF 202020202020202066- - 42192 000075C8 696C65732062792075- - 42192 000075D1 73696E672077696C64- - 42192 000075DA 63617264732E0D0A - 42193 MSG_1462: - 42194 000075E2 4F db 79 - 42195 000075E3 20202F502020202020- db ' /P Prompts for confirmation before deleting each file.',0Dh,0Ah - 42195 000075EC 202020202020202020- - 42195 000075F5 202020202020202050- - 42195 000075FE 726F6D70747320666F- - 42195 00007607 7220636F6E6669726D- - 42195 00007610 6174696F6E20626566- - 42195 00007619 6F72652064656C6574- - 42195 00007622 696E67206561636820- - 42195 0000762B 66696C652E0D0A - 42196 - 42197 ; 17/06/2023 - 42198 %if 0 ; MSDOS 5.0 DIR Help messages + 42095 ;db 'COPY [/A | /B] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination',0Dh,0Ah + 42096 ;db ' [/A | /B]] [/V]',0Dh,0Ah + 42097 ;db 0Dh,0Ah + 42098 + 42099 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42100 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:76A9h) + 42101 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42102 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:7506h) + 42103 + 42104 00007053 9C db 156 ; 19/06/2023 + 42105 00007054 436F70696573206F6E- db 'Copies one or more files to another location.',0Dh,0Ah + 42105 0000705D 65206F72206D6F7265- + 42105 00007066 2066696C657320746F- + 42105 0000706F 20616E6F7468657220- + 42105 00007078 6C6F636174696F6E2E- + 42105 00007081 0D0A + 42106 00007083 0D0A db 0Dh,0Ah + 42107 00007085 434F5059205B2F4120- db 'COPY [/A | /B] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination',0Dh,0Ah + 42107 0000708E 7C202F425D20736F75- + 42107 00007097 726365205B2F41207C- + 42107 000070A0 202F425D205B2B2073- + 42107 000070A9 6F75726365205B2F41- + 42107 000070B2 207C202F425D205B2B- + 42107 000070BB 202E2E2E5D5D205B64- + 42107 000070C4 657374696E6174696F- + 42107 000070CD 6E0D0A + 42108 000070D0 20205B2F41207C202F- db ' [/A | /B]] [/V] [/Y | /-Y]',0Dh,0Ah + 42108 000070D9 425D5D205B2F565D20- + 42108 000070E2 5B2F59207C202F2D59- + 42108 000070EB 5D0D0A + 42109 000070EE 0D0A db 0Dh,0Ah + 42110 MSG_1401: + 42111 000070F0 68 db 104 + 42112 000070F1 2020736F7572636520- db ' source Specifies the file or files to be copied.',0Dh,0Ah + 42112 000070FA 202020202020537065- + 42112 00007103 636966696573207468- + 42112 0000710C 652066696C65206F72- + 42112 00007115 2066696C657320746F- + 42112 0000711E 20626520636F706965- + 42112 00007127 642E0D0A + 42113 0000712B 20202F412020202020- db ' /A Indicates an ASCII text file.',0Dh,0Ah + 42113 00007134 202020202020496E64- + 42113 0000713D 69636174657320616E- + 42113 00007146 204153434949207465- + 42113 0000714F 78742066696C652E0D- + 42113 00007158 0A + 42114 MSG_1402: + 42115 00007159 76 db 118 + 42116 0000715A 20202F422020202020- db ' /B Indicates a binary file.',0Dh,0Ah + 42116 00007163 202020202020496E64- + 42116 0000716C 696361746573206120- + 42116 00007175 62696E617279206669- + 42116 0000717E 6C652E0D0A + 42117 00007183 202064657374696E61- db ' destination Specifies the directory and/or filename for the new file(s).',0Dh,0Ah + 42117 0000718C 74696F6E2020537065- + 42117 00007195 636966696573207468- + 42117 0000719E 65206469726563746F- + 42117 000071A7 727920616E642F6F72- + 42117 000071B0 2066696C656E616D65- + 42117 000071B9 20666F722074686520- + 42117 000071C2 6E65772066696C6528- + 42117 000071CB 73292E0D0A + 42118 MSG_1403: + 42119 ;db 65 ; MSDOS 5.0 + 42120 ; 17/06/2023 + 42121 000071D0 3F db 63 ; MSDOS 6.22 + 42122 000071D1 20202F562020202020- db ' /V Verifies that new files are written correctly.',0Dh,0Ah + 42122 000071DA 202020202020566572- + 42122 000071E3 696669657320746861- + 42122 000071EC 74206E65772066696C- + 42122 000071F5 657320617265207772- + 42122 000071FE 697474656E20636F72- + 42122 00007207 726563746C792E0D0A + 42123 ;db 0Dh,0Ah ; MSDOS 5.0 + 42124 + 42125 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42126 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7866h + 42127 MSG_1404: + 42128 00007210 74 db 116 + 42129 00007211 20202F592020202020- db ' /Y Suppresses prompting to confirm you want to overwrite an',0Dh,0Ah + 42129 0000721A 202020202020537570- + 42129 00007223 707265737365732070- + 42129 0000722C 726F6D7074696E6720- + 42129 00007235 746F20636F6E666972- + 42129 0000723E 6D20796F752077616E- + 42129 00007247 7420746F206F766572- + 42129 00007250 777269746520616E0D- + 42129 00007259 0A + 42130 0000725A 202020202020202020- db ' existing destination file.',0Dh,0Ah + 42130 00007263 202020202020657869- + 42130 0000726C 7374696E6720646573- + 42130 00007275 74696E6174696F6E20- + 42130 0000727E 66696C652E0D0A + 42131 MSG_1405: + 42132 00007285 72 db 114 + 42133 00007286 20202F2D5920202020- db ' /-Y Causes prompting to confirm you want to overwrite an',0Dh,0Ah + 42133 0000728F 202020202020436175- + 42133 00007298 7365732070726F6D70- + 42133 000072A1 74696E6720746F2063- + 42133 000072AA 6F6E6669726D20796F- + 42133 000072B3 752077616E7420746F- + 42133 000072BC 206F76657277726974- + 42133 000072C5 6520616E0D0A + 42134 000072CB 202020202020202020- db ' existing destination file.',0Dh,0Ah + 42134 000072D4 202020202020657869- + 42134 000072DD 7374696E6720646573- + 42134 000072E6 74696E6174696F6E20- + 42134 000072EF 66696C652E0D0A + 42135 000072F6 0D0A db 0Dh,0Ah + 42136 MSG_1406: + 42137 000072F8 42 db 66 + 42138 000072F9 546865207377697463- db 'The switch /Y may be preset in the COPYCMD environment variable.',0Dh,0Ah + 42138 00007302 68202F59206D617920- + 42138 0000730B 626520707265736574- + 42138 00007314 20696E207468652043- + 42138 0000731D 4F5059434D4420656E- + 42138 00007326 7669726F6E6D656E74- + 42138 0000732F 207661726961626C65- + 42138 00007338 2E0D0A + 42139 + 42140 ;MSG_1404: ; MSDOS 5.0 (TRANGROUP:681Ch) + 42141 ; MSDOS 6.22 (TRANGROUP:7991h) + 42142 MSG_1407: ; PCDOS 7.1 (TRANGROUP:77EEh) + 42143 0000733B 87 db 135 + 42144 0000733C 546F20617070656E64- db 'To append files, specify a single file for destination, but multiple files',0Dh,0Ah + 42144 00007345 2066696C65732C2073- + 42144 0000734E 706563696679206120- + 42144 00007357 73696E676C65206669- + 42144 00007360 6C6520666F72206465- + 42144 00007369 7374696E6174696F6E- + 42144 00007372 2C20627574206D756C- + 42144 0000737B 7469706C652066696C- + 42144 00007384 65730D0A + 42145 00007388 666F7220736F757263- db 'for source (using wildcards or file1+file2+file3 format).',0Dh,0Ah + 42145 00007391 6520287573696E6720- + 42145 0000739A 77696C646361726473- + 42145 000073A3 206F722066696C6531- + 42145 000073AC 2B66696C65322B6669- + 42145 000073B5 6C653320666F726D61- + 42145 000073BE 74292E0D0A + 42146 MSG_1420: + 42147 000073C3 8A db 138 + 42148 000073C4 4368616E6765732074- db 'Changes the terminal device used to control your system.',0Dh,0Ah + 42148 000073CD 6865207465726D696E- + 42148 000073D6 616C20646576696365- + 42148 000073DF 207573656420746F20- + 42148 000073E8 636F6E74726F6C2079- + 42148 000073F1 6F7572207379737465- + 42148 000073FA 6D2E0D0A + 42149 000073FE 0D0A db 0Dh,0Ah + 42150 00007400 435454592064657669- db 'CTTY device',0Dh,0Ah + 42150 00007409 63650D0A + 42151 0000740D 0D0A db 0Dh,0Ah + 42152 0000740F 202064657669636520- db ' device The terminal device you want to use, such as COM1.',0Dh,0Ah + 42152 00007418 202054686520746572- + 42152 00007421 6D696E616C20646576- + 42152 0000742A 69636520796F752077- + 42152 00007433 616E7420746F207573- + 42152 0000743C 652C20737563682061- + 42152 00007445 7320434F4D312E0D0A + 42153 MSG_1440: + 42154 ;db 45 + 42155 ;db 'Displays or sets the date.',0Dh,0Ah + 42156 ;db 0Dh,0Ah + 42157 ;db 'DATE [date]',0Dh,0Ah + 42158 ;db 0Dh,0Ah + 42159 + 42160 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42161 %if 0 + 42162 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42163 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:7AA4h) + 42164 db 93 + 42165 db 'Displays or sets the date.',0Dh,0Ah + 42166 db 0Dh,0Ah + 42167 db 'DATE [mm-dd-yy]',0Dh,0Ah + 42168 db 0Dh,0Ah + 42169 db ' mm-dd-yy Sets the date you specify.',0Dh,0Ah + 42170 db 0Dh,0Ah + 42171 %else + 42172 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42173 ; (PCDOS 7.1 COMMAND.COM - TRANGROUP:7901h) + 42174 0000744E 26 db 38 + 42175 0000744F 446973706C61797320- db 'Displays or sets the date.',0Dh,0Ah + 42175 00007458 6F7220736574732074- + 42175 00007461 686520646174652E0D- + 42175 0000746A 0A + 42176 0000746B 0D0A db 0Dh,0Ah + 42177 0000746D 444154450D0A db 'DATE',0Dh,0Ah + 42178 00007473 0D0A db 0Dh,0Ah + 42179 %endif + 42180 + 42181 MSG_1441: + 42182 00007475 83 db 131 + 42183 00007476 547970652044415445- db 'Type DATE without parameters to display the current date setting and',0Dh,0Ah + 42183 0000747F 20776974686F757420- + 42183 00007488 706172616D65746572- + 42183 00007491 7320746F2064697370- + 42183 0000749A 6C6179207468652063- + 42183 000074A3 757272656E74206461- + 42183 000074AC 74652073657474696E- + 42183 000074B5 6720616E640D0A + 42184 000074BC 612070726F6D707420- db 'a prompt for a new one. Press ENTER to keep the same date.',0Dh,0Ah + 42184 000074C5 666F722061206E6577- + 42184 000074CE 206F6E652E20205072- + 42184 000074D7 65737320454E544552- + 42184 000074E0 20746F206B65657020- + 42184 000074E9 7468652073616D6520- + 42184 000074F2 646174652E0D0A + 42185 MSG_1460: + 42186 000074F9 64 db 100 + 42187 000074FA 44656C65746573206F- db 'Deletes one or more files.',0Dh,0Ah + 42187 00007503 6E65206F72206D6F72- + 42187 0000750C 652066696C65732E0D- + 42187 00007515 0A + 42188 00007516 0D0A db 0Dh,0Ah + 42189 00007518 44454C205B64726976- db 'DEL [drive:][path]filename [/P]',0Dh,0Ah + 42189 00007521 653A5D5B706174685D- + 42189 0000752A 66696C656E616D6520- + 42189 00007533 5B2F505D0D0A + 42190 00007539 4552415345205B6472- db 'ERASE [drive:][path]filename [/P]',0Dh,0Ah + 42190 00007542 6976653A5D5B706174- + 42190 0000754B 685D66696C656E616D- + 42190 00007554 65205B2F505D0D0A + 42191 0000755C 0D0A db 0Dh,0Ah + 42192 MSG_1461: + 42193 0000755E 83 db 131 + 42194 0000755F 20205B64726976653A- db ' [drive:][path]filename Specifies the file(s) to delete. Specify multiple',0Dh,0Ah + 42194 00007568 5D5B706174685D6669- + 42194 00007571 6C656E616D65202053- + 42194 0000757A 706563696669657320- + 42194 00007583 7468652066696C6528- + 42194 0000758C 732920746F2064656C- + 42194 00007595 6574652E2020537065- + 42194 0000759E 63696679206D756C74- + 42194 000075A7 69706C650D0A + 42195 000075AD 202020202020202020- db ' files by using wildcards.',0Dh,0Ah + 42195 000075B6 202020202020202020- + 42195 000075BF 202020202020202066- + 42195 000075C8 696C65732062792075- + 42195 000075D1 73696E672077696C64- + 42195 000075DA 63617264732E0D0A + 42196 MSG_1462: + 42197 000075E2 4F db 79 + 42198 000075E3 20202F502020202020- db ' /P Prompts for confirmation before deleting each file.',0Dh,0Ah + 42198 000075EC 202020202020202020- + 42198 000075F5 202020202020202050- + 42198 000075FE 726F6D70747320666F- + 42198 00007607 7220636F6E6669726D- + 42198 00007610 6174696F6E20626566- + 42198 00007619 6F72652064656C6574- + 42198 00007622 696E67206561636820- + 42198 0000762B 66696C652E0D0A 42199 - 42200 MSG_1480: - 42201 db 162 - 42202 db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah - 42203 db 0Dh,0Ah - 42204 db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attributes]]',0Dh,0Ah - 42205 db ' [/O[[:]sortorder]] [/S] [/B] [/L]',0Dh,0Ah + 42200 ; 17/06/2023 + 42201 %if 0 ; MSDOS 5.0 DIR Help messages + 42202 + 42203 MSG_1480: + 42204 db 162 + 42205 db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah 42206 db 0Dh,0Ah - 42207 MSG_1481: - 42208 db 93 - 42209 db ' [drive:][path][filename]',0Dh,0Ah - 42210 db ' Specifies drive, directory, and/or files to list.',0Dh,0Ah - 42211 MSG_1482: - 42212 db 97 - 42213 db ' /P Pauses after each screenful of information.',0Dh,0Ah - 42214 db ' /W Uses wide list format.',0Dh,0Ah - 42215 MSG_1483: - 42216 db 122 - 42217 db ' /A Displays files with specified attributes.',0Dh,0Ah - 42218 db ' attributes D Directories R Read-only files',0Dh,0Ah - 42219 MSG_1484: - 42220 db 191 - 42221 db ' H Hidden files A Files ready for archiving',0Dh,0Ah - 42222 db ' S System files - Prefix meaning "not"',0Dh,0Ah - 42223 db ' /O List by files in sorted order.',0Dh,0Ah - 42224 MSG_1485: - 42225 db 155 - 42226 db ' sortorder N By name (alphabetic) S By size (smallest first)',0Dh,0Ah - 42227 db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah - 42228 MSG_1486: - 42229 db 150 - 42230 db ' G Group directories first - Prefix to reverse order',0Dh,0Ah - 42231 db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah - 42232 MSG_1487: - 42233 db 102 - 42234 db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah - 42235 db ' /L Uses lowercase.',0Dh,0Ah - 42236 db 0Dh,0Ah - 42237 MSG_1488: - 42238 db 146 - 42239 db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah - 42240 db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah - 42241 %endif - 42242 - 42243 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42244 %if 0 - 42245 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42246 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7CBFh - 42247 MSG_1480: - 42248 db 137 - 42249 db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah - 42250 db 0Dh,0Ah - 42251 db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attribs]] [/O[[:]sortord]]',0Dh,0Ah - 42252 MSG_1481: - 42253 db 30 - 42254 db ' [/S] [/B] [/L] [/C[H]]',0Dh,0Ah - 42255 db 0Dh,0Ah - 42256 MSG_1482: - 42257 db 80 - 42258 db ' [drive:][path][filename] Specifies drive, directory, and/or files to list.',0Dh,0Ah - 42259 MSG_1483: - 42260 db 89 - 42261 db ' /P Pauses after each screenful of information.',0Dh,0Ah - 42262 db ' /W Uses wide list format.',0Dh,0Ah - 42263 MSG_1484: - 42264 db 126 - 42265 db ' /A Displays files with specified attributes.',0Dh,0Ah - 42266 db ' attribs D Directories R Read-only files H Hidden files',0Dh,0Ah - 42267 MSG_1485: - 42268 db 123 - 42269 db ' S System files A Files ready to archive - Prefix meaning "not"',0Dh,0Ah - 42270 db ' /O List by files in sorted order.',0Dh,0Ah - 42271 MSG_1486: - 42272 db 149 - 42273 db ' sortord N By name (alphabetic) S By size (smallest first)',0Dh,0Ah - 42274 db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah - 42275 MSG_1487: - 42276 db 70 - 42277 db ' G Group directories first - Prefix to reverse order',0Dh,0Ah - 42278 MSG_1488: - 42279 db 127 - 42280 db ' C By compression ratio (smallest first)',0Dh,0Ah - 42281 db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah - 42282 MSG_1489: - 42283 db 65 - 42284 db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah - 42285 - 42286 MSG_1490: - 42287 db 27 - 42288 db ' /L Uses lowercase.',0Dh,0Ah - 42289 MSG_1491: - 42290 db 82 - 42291 db ' /C[H] Displays file compression ratio; /CH uses host allocation unit size.',0Dh,0Ah - 42292 db 0Dh,0Ah - 42293 MSG_1492: - 42294 db 146 - 42295 db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah - 42296 db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah - 42297 MSG_1493: - 42298 db 22 - 42299 db ' [/S] [/B] [/L]',0Dh,0Ah - 42300 db 0Dh,0Ah - 42301 MSG_1494: - 42302 db 29 - 42303 db ' /L Uses lowercase.',0Dh,0Ah - 42304 db 0Dh,0Ah - 42305 %else - 42306 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42307 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:7AE5h - 42308 MSG_1480: - 42309 00007632 9F db 159 - 42310 00007633 446973706C61797320- db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah - 42310 0000763C 61206C697374206F66- - 42310 00007645 2066696C657320616E- - 42310 0000764E 642073756264697265- - 42310 00007657 63746F726965732069- - 42310 00007660 6E2061206469726563- - 42310 00007669 746F72792E0D0A - 42311 00007670 0D0A db 0Dh,0Ah - 42312 00007672 444952205B64726976- db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attribs]] [/O[[:]sortord]]',0Dh,0Ah - 42312 0000767B 653A5D5B706174685D- - 42312 00007684 5B66696C656E616D65- - 42312 0000768D 5D205B2F505D205B2F- - 42312 00007696 575D205B2F415B5B3A- - 42312 0000769F 5D617474726962735D- - 42312 000076A8 5D205B2F4F5B5B3A5D- - 42312 000076B1 736F72746F72645D5D- - 42312 000076BA 0D0A - 42313 000076BC 202020205B2F535D20- db ' [/S] [/B] [/L]',0Dh,0Ah - 42313 000076C5 5B2F425D205B2F4C5D- - 42313 000076CE 0D0A - 42314 000076D0 0D0A db 0Dh,0Ah - 42315 MSG_1481: - 42316 000076D2 4D db 77 - 42317 000076D3 20205B64726976653A- db ' [drive:][path][filename] Specifies drive, directory, and files to list.',0Dh,0Ah - 42317 000076DC 5D5B706174685D5B66- - 42317 000076E5 696C656E616D655D20- - 42317 000076EE 202053706563696669- - 42317 000076F7 65732064726976652C- - 42317 00007700 206469726563746F72- - 42317 00007709 792C20616E64206669- - 42317 00007712 6C657320746F206C69- - 42317 0000771B 73742E0D0A - 42318 MSG_1482: - 42319 00007720 5B db 91 - 42320 00007721 20202F502020202020- db ' /P Pauses after each full screen of information.',0Dh,0Ah - 42320 0000772A 205061757365732061- - 42320 00007733 667465722065616368- - 42320 0000773C 2066756C6C20736372- - 42320 00007745 65656E206F6620696E- - 42320 0000774E 666F726D6174696F6E- - 42320 00007757 2E0D0A - 42321 0000775A 20202F572020202020- db ' /W Uses wide list format.',0Dh,0Ah - 42321 00007763 205573657320776964- - 42321 0000776C 65206C69737420666F- - 42321 00007775 726D61742E0D0A - 42322 MSG_1483: - 42323 0000777C 7E db 126 - 42324 0000777D 20202F412020202020- db ' /A Displays files with specified attributes.',0Dh,0Ah - 42324 00007786 20446973706C617973- - 42324 0000778F 2066696C6573207769- - 42324 00007798 746820737065636966- - 42324 000077A1 696564206174747269- - 42324 000077AA 62757465732E0D0A - 42325 000077B2 202061747472696273- db ' attribs D Directories R Read-only files H Hidden files',0Dh,0Ah - 42325 000077BB 202020442020446972- - 42325 000077C4 6563746F7269657320- - 42325 000077CD 202052202052656164- - 42325 000077D6 2D6F6E6C792066696C- - 42325 000077DF 657320202020202020- - 42325 000077E8 202048202048696464- - 42325 000077F1 656E2066696C65730D- - 42325 000077FA 0A - 42326 MSG_1484: - 42327 000077FB 7C db 124 - 42328 000077FC 202020202020202020- db ' S System files A Files ready to archive - Prefix meaning "not"',0Dh,0Ah - 42328 00007805 202020532020537973- - 42328 0000780E 74656D2066696C6573- - 42328 00007817 202041202046696C65- - 42328 00007820 732072656164792074- - 42328 00007829 6F2061726368697665- - 42328 00007832 20202D202050726566- - 42328 0000783B 6978206D65616E696E- - 42328 00007844 6720226E6F74220D0A - 42329 0000784D 20202F4F2020202020- db ' /O Lists by files in sorted order.',0Dh,0Ah - 42329 00007856 204C69737473206279- - 42329 0000785F 2066696C657320696E- - 42329 00007868 20736F72746564206F- - 42329 00007871 726465722E0D0A - 42330 MSG_1485: - 42331 00007878 95 db 149 - 42332 00007879 2020736F72746F7264- db ' sortord N By name (alphabetic) S By size (smallest first)',0Dh,0Ah - 42332 00007882 2020204E2020427920- - 42332 0000788B 6E616D652028616C70- - 42332 00007894 686162657469632920- - 42332 0000789D 202020202020532020- - 42332 000078A6 42792073697A652028- - 42332 000078AF 736D616C6C65737420- - 42332 000078B8 6669727374290D0A - 42333 000078C0 202020202020202020- db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah - 42333 000078C9 202020452020427920- - 42333 000078D2 657874656E73696F6E- - 42333 000078DB 2028616C7068616265- - 42333 000078E4 746963292020442020- - 42333 000078ED 427920646174652026- - 42333 000078F6 2074696D6520286561- - 42333 000078FF 726C69657374206669- - 42333 00007908 727374290D0A - 42334 MSG_1486: - 42335 0000790E 8F db 143 - 42336 0000790F 202020202020202020- db ' G Group directories first - Prefix to reverse order',0Dh,0Ah - 42336 00007918 20202047202047726F- - 42336 00007921 757020646972656374- - 42336 0000792A 6F7269657320666972- - 42336 00007933 7374202020202D2020- - 42336 0000793C 50726566697820746F- - 42336 00007945 207265766572736520- - 42336 0000794E 6F726465720D0A - 42337 00007955 20202F532020202020- db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah - 42337 0000795E 20446973706C617973- - 42337 00007967 2066696C657320696E- - 42337 00007970 207370656369666965- - 42337 00007979 64206469726563746F- - 42337 00007982 727920616E6420616C- - 42337 0000798B 6C2073756264697265- - 42337 00007994 63746F726965732E0D- - 42337 0000799D 0A - 42338 MSG_1487: - 42339 0000799E 5E db 94 - 42340 0000799F 20202F422020202020- db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah - 42340 000079A8 205573657320626172- - 42340 000079B1 6520666F726D617420- - 42340 000079BA 286E6F206865616469- - 42340 000079C3 6E6720696E666F726D- - 42340 000079CC 6174696F6E206F7220- - 42340 000079D5 73756D6D617279292E- - 42340 000079DE 0D0A - 42341 000079E0 20202F4C2020202020- db ' /L Uses lowercase.',0Dh,0Ah - 42341 000079E9 2055736573206C6F77- - 42341 000079F2 6572636173652E0D0A - 42342 000079FB 0D0A db 0Dh,0Ah - 42343 MSG_1488: - 42344 000079FD 92 db 146 - 42345 000079FE 537769746368657320- db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah - 42345 00007A07 6D6179206265207072- - 42345 00007A10 6573657420696E2074- - 42345 00007A19 686520444952434D44- - 42345 00007A22 20656E7669726F6E6D- - 42345 00007A2B 656E74207661726961- - 42345 00007A34 626C652E20204F7665- - 42345 00007A3D 72726964650D0A - 42346 00007A44 707265736574207377- db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah - 42346 00007A4D 697463686573206279- - 42346 00007A56 20707265666978696E- - 42346 00007A5F 6720616E7920737769- - 42346 00007A68 746368207769746820- - 42346 00007A71 2D202868797068656E- - 42346 00007A7A 292D2D666F72206578- - 42346 00007A83 616D706C652C202F2D- - 42346 00007A8C 572E0D0A - 42347 MSG_1489: - 42348 00007A90 50 db 80 - 42349 00007A91 546F2072656D6F7665- db 'To remove the commas from the DIR output, use the NO_SEP environment variable.',0Dh,0Ah - 42349 00007A9A 2074686520636F6D6D- - 42349 00007AA3 61732066726F6D2074- - 42349 00007AAC 686520444952206F75- - 42349 00007AB5 747075742C20757365- - 42349 00007ABE 20746865204E4F5F53- - 42349 00007AC7 455020656E7669726F- - 42349 00007AD0 6E6D656E7420766172- - 42349 00007AD9 6961626C652E0D0A - 42350 %endif - 42351 - 42352 MSG_1500: - 42353 00007AE1 3E db 62 - 42354 00007AE2 517569747320746865- db 'Quits the COMMAND.COM program (command interpreter).',0Dh,0Ah - 42354 00007AEB 20434F4D4D414E442E- - 42354 00007AF4 434F4D2070726F6772- - 42354 00007AFD 616D2028636F6D6D61- - 42354 00007B06 6E6420696E74657270- - 42354 00007B0F 7265746572292E0D0A - 42355 00007B18 0D0A db 0Dh,0Ah - 42356 00007B1A 455849540D0A db 'EXIT',0Dh,0Ah - 42357 MSG_1520: - 42358 00007B20 3D db 61 - 42359 00007B21 437265617465732061- db 'Creates a directory.',0Dh,0Ah - 42359 00007B2A 206469726563746F72- - 42359 00007B33 792E0D0A - 42360 00007B37 0D0A db 0Dh,0Ah - 42361 00007B39 4D4B444952205B6472- db 'MKDIR [drive:]path',0Dh,0Ah - 42361 00007B42 6976653A5D70617468- - 42361 00007B4B 0D0A - 42362 00007B4D 4D44205B6472697665- db 'MD [drive:]path',0Dh,0Ah - 42362 00007B56 3A5D706174680D0A - 42363 MSG_1540: - 42364 00007B5E 5D db 93 - 42365 00007B5F 446973706C61797320- db 'Displays or sets a search path for executable files.',0Dh,0Ah - 42365 00007B68 6F7220736574732061- - 42365 00007B71 207365617263682070- - 42365 00007B7A 61746820666F722065- - 42365 00007B83 786563757461626C65- - 42365 00007B8C 2066696C65732E0D0A - 42366 00007B95 0D0A db 0Dh,0Ah - 42367 00007B97 50415448205B5B6472- db 'PATH [[drive:]path[;...]]',0Dh,0Ah - 42367 00007BA0 6976653A5D70617468- - 42367 00007BA9 5B3B2E2E2E5D5D0D0A - 42368 00007BB2 50415448203B0D0A db 'PATH ;',0Dh,0Ah - 42369 00007BBA 0D0A db 0Dh,0Ah - 42370 MSG_1541: - 42371 00007BBC 6B db 107 - 42372 00007BBD 547970652050415448- db 'Type PATH ; to clear all search-path settings and direct PC DOS to search',0Dh,0Ah - 42372 00007BC6 203B20746F20636C65- - 42372 00007BCF 617220616C6C207365- - 42372 00007BD8 617263682D70617468- - 42372 00007BE1 2073657474696E6773- - 42372 00007BEA 20616E642064697265- - 42372 00007BF3 637420504320444F53- - 42372 00007BFC 20746F207365617263- - 42372 00007C05 680D0A - 42373 00007C08 6F6E6C7920696E2074- db 'only in the current directory.',0Dh,0Ah - 42373 00007C11 68652063757272656E- - 42373 00007C1A 74206469726563746F- - 42373 00007C23 72792E0D0A - 42374 MSG_1542: - 42375 00007C28 3B db 59 - 42376 00007C29 547970652050415448- db 'Type PATH without parameters to display the current path.',0Dh,0Ah - 42376 00007C32 20776974686F757420- - 42376 00007C3B 706172616D65746572- - 42376 00007C44 7320746F2064697370- - 42376 00007C4D 6C6179207468652063- - 42376 00007C56 757272656E74207061- - 42376 00007C5F 74682E0D0A - 42377 MSG_1560: - 42378 00007C64 37 db 55 - 42379 00007C65 4368616E6765732074- db 'Changes the PC DOS command prompt.',0Dh,0Ah - 42379 00007C6E 686520504320444F53- - 42379 00007C77 20636F6D6D616E6420- - 42379 00007C80 70726F6D70742E0D0A - 42380 00007C89 0D0A db 0Dh,0Ah - 42381 00007C8B 50524F4D5054205B74- db 'PROMPT [text]',0Dh,0Ah - 42381 00007C94 6578745D0D0A - 42382 00007C9A 0D0A db 0Dh,0Ah - 42383 MSG_1561: - 42384 00007C9C 7C db 124 - 42385 00007C9D 202074657874202020- db ' text Specifies a new command prompt.',0Dh,0Ah - 42385 00007CA6 205370656369666965- - 42385 00007CAF 732061206E65772063- - 42385 00007CB8 6F6D6D616E64207072- - 42385 00007CC1 6F6D70742E0D0A - 42386 00007CC8 0D0A db 0Dh,0Ah - 42387 00007CCA 50726F6D7074206361- db 'Prompt can be made up of normal characters and the following special codes:',0Dh,0Ah - 42387 00007CD3 6E206265206D616465- - 42387 00007CDC 207570206F66206E6F- - 42387 00007CE5 726D616C2063686172- - 42387 00007CEE 61637465727320616E- - 42387 00007CF7 642074686520666F6C- - 42387 00007D00 6C6F77696E67207370- - 42387 00007D09 656369616C20636F64- - 42387 00007D12 65733A0D0A - 42388 00007D17 0D0A db 0Dh,0Ah - 42389 MSG_1562: - 42390 00007D19 2F db 47 - 42391 00007D1A 202024512020203D20- db ' $Q = (equal sign)',0Dh,0Ah - 42391 00007D23 28657175616C207369- - 42391 00007D2C 676E290D0A - 42392 00007D31 202024242020202420- db ' $$ $ (dollar sign)',0Dh,0Ah - 42392 00007D3A 28646F6C6C61722073- - 42392 00007D43 69676E290D0A - 42393 MSG_1563: - 42394 00007D49 2A db 42 - 42395 00007D4A 202024542020204375- db ' $T Current time',0Dh,0Ah - 42395 00007D53 7272656E742074696D- - 42395 00007D5C 650D0A - 42396 00007D5F 202024442020204375- db ' $D Current date',0Dh,0Ah - 42396 00007D68 7272656E7420646174- - 42396 00007D71 650D0A - 42397 MSG_1564: - 42398 00007D74 3D db 61 - 42399 00007D75 202024502020204375- db ' $P Current drive and path',0Dh,0Ah - 42399 00007D7E 7272656E7420647269- - 42399 00007D87 766520616E64207061- - 42399 00007D90 74680D0A - 42400 00007D94 202024562020204D53- db ' $V MS-DOS version number',0Dh,0Ah - 42400 00007D9D 2D444F532076657273- - 42400 00007DA6 696F6E206E756D6265- - 42400 00007DAF 720D0A - 42401 MSG_1565: - 42402 00007DB2 34 db 52 - 42403 00007DB3 2020244E2020204375- db ' $N Current drive',0Dh,0Ah - 42403 00007DBC 7272656E7420647269- - 42403 00007DC5 76650D0A - 42404 00007DC9 202024472020203E20- db ' $G > (greater-than sign)',0Dh,0Ah - 42404 00007DD2 28677265617465722D- - 42404 00007DDB 7468616E207369676E- - 42404 00007DE4 290D0A - 42405 MSG_1566: - 42406 00007DE7 2C db 44 - 42407 00007DE8 2020244C2020203C20- db ' $L < (less-than sign)',0Dh,0Ah - 42407 00007DF1 286C6573732D746861- - 42407 00007DFA 6E207369676E290D0A - 42408 00007E03 202024422020207C20- db ' $B | (pipe)',0Dh,0Ah - 42408 00007E0C 2870697065290D0A - 42409 MSG_1567: - 42410 00007E14 79 db 121 - 42411 00007E15 202024482020204261- db ' $H Backspace (erases previous character)',0Dh,0Ah - 42411 00007E1E 636B73706163652028- - 42411 00007E27 657261736573207072- - 42411 00007E30 6576696F7573206368- - 42411 00007E39 61726163746572290D- - 42411 00007E42 0A - 42412 00007E43 202024452020204573- db ' $E Escape code (ASCII code 27)',0Dh,0Ah - 42412 00007E4C 6361706520636F6465- - 42412 00007E55 202841534349492063- - 42412 00007E5E 6F6465203237290D0A - 42413 00007E67 2020245F2020204361- db ' $_ Carriage return and linefeed',0Dh,0Ah - 42413 00007E70 727269616765207265- - 42413 00007E79 7475726E20616E6420- - 42413 00007E82 6C696E65666565640D- - 42413 00007E8B 0A - 42414 00007E8C 0D0A db 0Dh,0Ah - 42415 MSG_1568: - 42416 00007E8E 4C db 76 - 42417 00007E8F 547970652050524F4D- db 'Type PROMPT without parameters to reset the prompt to the default setting.',0Dh,0Ah - 42417 00007E98 505420776974686F75- - 42417 00007EA1 7420706172616D6574- - 42417 00007EAA 65727320746F207265- - 42417 00007EB3 736574207468652070- - 42417 00007EBC 726F6D707420746F20- - 42417 00007EC5 746865206465666175- - 42417 00007ECE 6C742073657474696E- - 42417 00007ED7 672E0D0A - 42418 MSG_1580: - 42419 00007EDB 47 db 71 - 42420 00007EDC 52656D6F7665732028- db 'Removes (deletes) a directory.',0Dh,0Ah - 42420 00007EE5 64656C657465732920- - 42420 00007EEE 61206469726563746F- - 42420 00007EF7 72792E0D0A - 42421 00007EFC 0D0A db 0Dh,0Ah - 42422 00007EFE 524D444952205B6472- db 'RMDIR [drive:]path',0Dh,0Ah - 42422 00007F07 6976653A5D70617468- - 42422 00007F10 0D0A - 42423 00007F12 5244205B6472697665- db 'RD [drive:]path',0Dh,0Ah - 42423 00007F1B 3A5D706174680D0A - 42424 MSG_1600: - 42425 00007F23 1C db 28 - 42426 00007F24 52656E616D65732061- db 'Renames a file or files.',0Dh,0Ah - 42426 00007F2D 2066696C65206F7220- - 42426 00007F36 66696C65732E0D0A - 42427 00007F3E 0D0A db 0Dh,0Ah - 42428 MSG_1601: - 42429 00007F40 53 db 83 - 42430 00007F41 52454E414D45205B64- db 'RENAME [drive:][path]filename1 filename2',0Dh,0Ah - 42430 00007F4A 726976653A5D5B7061- - 42430 00007F53 74685D66696C656E61- - 42430 00007F5C 6D65312066696C656E- - 42430 00007F65 616D65320D0A - 42431 00007F6B 52454E205B64726976- db 'REN [drive:][path]filename1 filename2',0Dh,0Ah - 42431 00007F74 653A5D5B706174685D- - 42431 00007F7D 66696C656E616D6531- - 42431 00007F86 2066696C656E616D65- - 42431 00007F8F 320D0A - 42432 00007F92 0D0A db 0Dh,0Ah - 42433 MSG_1602: - 42434 ;db 77 - 42435 ;db 'Note that you cannot specify a new drive or path for your destination file.',0Dh,0Ah - 42436 - 42437 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42438 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:8697h + 42207 db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attributes]]',0Dh,0Ah + 42208 db ' [/O[[:]sortorder]] [/S] [/B] [/L]',0Dh,0Ah + 42209 db 0Dh,0Ah + 42210 MSG_1481: + 42211 db 93 + 42212 db ' [drive:][path][filename]',0Dh,0Ah + 42213 db ' Specifies drive, directory, and/or files to list.',0Dh,0Ah + 42214 MSG_1482: + 42215 db 97 + 42216 db ' /P Pauses after each screenful of information.',0Dh,0Ah + 42217 db ' /W Uses wide list format.',0Dh,0Ah + 42218 MSG_1483: + 42219 db 122 + 42220 db ' /A Displays files with specified attributes.',0Dh,0Ah + 42221 db ' attributes D Directories R Read-only files',0Dh,0Ah + 42222 MSG_1484: + 42223 db 191 + 42224 db ' H Hidden files A Files ready for archiving',0Dh,0Ah + 42225 db ' S System files - Prefix meaning "not"',0Dh,0Ah + 42226 db ' /O List by files in sorted order.',0Dh,0Ah + 42227 MSG_1485: + 42228 db 155 + 42229 db ' sortorder N By name (alphabetic) S By size (smallest first)',0Dh,0Ah + 42230 db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah + 42231 MSG_1486: + 42232 db 150 + 42233 db ' G Group directories first - Prefix to reverse order',0Dh,0Ah + 42234 db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah + 42235 MSG_1487: + 42236 db 102 + 42237 db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah + 42238 db ' /L Uses lowercase.',0Dh,0Ah + 42239 db 0Dh,0Ah + 42240 MSG_1488: + 42241 db 146 + 42242 db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah + 42243 db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah + 42244 %endif + 42245 + 42246 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42247 %if 0 + 42248 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42249 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:7CBFh + 42250 MSG_1480: + 42251 db 137 + 42252 db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah + 42253 db 0Dh,0Ah + 42254 db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attribs]] [/O[[:]sortord]]',0Dh,0Ah + 42255 MSG_1481: + 42256 db 30 + 42257 db ' [/S] [/B] [/L] [/C[H]]',0Dh,0Ah + 42258 db 0Dh,0Ah + 42259 MSG_1482: + 42260 db 80 + 42261 db ' [drive:][path][filename] Specifies drive, directory, and/or files to list.',0Dh,0Ah + 42262 MSG_1483: + 42263 db 89 + 42264 db ' /P Pauses after each screenful of information.',0Dh,0Ah + 42265 db ' /W Uses wide list format.',0Dh,0Ah + 42266 MSG_1484: + 42267 db 126 + 42268 db ' /A Displays files with specified attributes.',0Dh,0Ah + 42269 db ' attribs D Directories R Read-only files H Hidden files',0Dh,0Ah + 42270 MSG_1485: + 42271 db 123 + 42272 db ' S System files A Files ready to archive - Prefix meaning "not"',0Dh,0Ah + 42273 db ' /O List by files in sorted order.',0Dh,0Ah + 42274 MSG_1486: + 42275 db 149 + 42276 db ' sortord N By name (alphabetic) S By size (smallest first)',0Dh,0Ah + 42277 db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah + 42278 MSG_1487: + 42279 db 70 + 42280 db ' G Group directories first - Prefix to reverse order',0Dh,0Ah + 42281 MSG_1488: + 42282 db 127 + 42283 db ' C By compression ratio (smallest first)',0Dh,0Ah + 42284 db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah + 42285 MSG_1489: + 42286 db 65 + 42287 db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah + 42288 + 42289 MSG_1490: + 42290 db 27 + 42291 db ' /L Uses lowercase.',0Dh,0Ah + 42292 MSG_1491: + 42293 db 82 + 42294 db ' /C[H] Displays file compression ratio; /CH uses host allocation unit size.',0Dh,0Ah + 42295 db 0Dh,0Ah + 42296 MSG_1492: + 42297 db 146 + 42298 db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah + 42299 db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah + 42300 MSG_1493: + 42301 db 22 + 42302 db ' [/S] [/B] [/L]',0Dh,0Ah + 42303 db 0Dh,0Ah + 42304 MSG_1494: + 42305 db 29 + 42306 db ' /L Uses lowercase.',0Dh,0Ah + 42307 db 0Dh,0Ah + 42308 %else + 42309 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42310 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:7AE5h + 42311 MSG_1480: + 42312 00007632 9F db 159 + 42313 00007633 446973706C61797320- db 'Displays a list of files and subdirectories in a directory.',0Dh,0Ah + 42313 0000763C 61206C697374206F66- + 42313 00007645 2066696C657320616E- + 42313 0000764E 642073756264697265- + 42313 00007657 63746F726965732069- + 42313 00007660 6E2061206469726563- + 42313 00007669 746F72792E0D0A + 42314 00007670 0D0A db 0Dh,0Ah + 42315 00007672 444952205B64726976- db 'DIR [drive:][path][filename] [/P] [/W] [/A[[:]attribs]] [/O[[:]sortord]]',0Dh,0Ah + 42315 0000767B 653A5D5B706174685D- + 42315 00007684 5B66696C656E616D65- + 42315 0000768D 5D205B2F505D205B2F- + 42315 00007696 575D205B2F415B5B3A- + 42315 0000769F 5D617474726962735D- + 42315 000076A8 5D205B2F4F5B5B3A5D- + 42315 000076B1 736F72746F72645D5D- + 42315 000076BA 0D0A + 42316 000076BC 202020205B2F535D20- db ' [/S] [/B] [/L]',0Dh,0Ah + 42316 000076C5 5B2F425D205B2F4C5D- + 42316 000076CE 0D0A + 42317 000076D0 0D0A db 0Dh,0Ah + 42318 MSG_1481: + 42319 000076D2 4D db 77 + 42320 000076D3 20205B64726976653A- db ' [drive:][path][filename] Specifies drive, directory, and files to list.',0Dh,0Ah + 42320 000076DC 5D5B706174685D5B66- + 42320 000076E5 696C656E616D655D20- + 42320 000076EE 202053706563696669- + 42320 000076F7 65732064726976652C- + 42320 00007700 206469726563746F72- + 42320 00007709 792C20616E64206669- + 42320 00007712 6C657320746F206C69- + 42320 0000771B 73742E0D0A + 42321 MSG_1482: + 42322 00007720 5B db 91 + 42323 00007721 20202F502020202020- db ' /P Pauses after each full screen of information.',0Dh,0Ah + 42323 0000772A 205061757365732061- + 42323 00007733 667465722065616368- + 42323 0000773C 2066756C6C20736372- + 42323 00007745 65656E206F6620696E- + 42323 0000774E 666F726D6174696F6E- + 42323 00007757 2E0D0A + 42324 0000775A 20202F572020202020- db ' /W Uses wide list format.',0Dh,0Ah + 42324 00007763 205573657320776964- + 42324 0000776C 65206C69737420666F- + 42324 00007775 726D61742E0D0A + 42325 MSG_1483: + 42326 0000777C 7E db 126 + 42327 0000777D 20202F412020202020- db ' /A Displays files with specified attributes.',0Dh,0Ah + 42327 00007786 20446973706C617973- + 42327 0000778F 2066696C6573207769- + 42327 00007798 746820737065636966- + 42327 000077A1 696564206174747269- + 42327 000077AA 62757465732E0D0A + 42328 000077B2 202061747472696273- db ' attribs D Directories R Read-only files H Hidden files',0Dh,0Ah + 42328 000077BB 202020442020446972- + 42328 000077C4 6563746F7269657320- + 42328 000077CD 202052202052656164- + 42328 000077D6 2D6F6E6C792066696C- + 42328 000077DF 657320202020202020- + 42328 000077E8 202048202048696464- + 42328 000077F1 656E2066696C65730D- + 42328 000077FA 0A + 42329 MSG_1484: + 42330 000077FB 7C db 124 + 42331 000077FC 202020202020202020- db ' S System files A Files ready to archive - Prefix meaning "not"',0Dh,0Ah + 42331 00007805 202020532020537973- + 42331 0000780E 74656D2066696C6573- + 42331 00007817 202041202046696C65- + 42331 00007820 732072656164792074- + 42331 00007829 6F2061726368697665- + 42331 00007832 20202D202050726566- + 42331 0000783B 6978206D65616E696E- + 42331 00007844 6720226E6F74220D0A + 42332 0000784D 20202F4F2020202020- db ' /O Lists by files in sorted order.',0Dh,0Ah + 42332 00007856 204C69737473206279- + 42332 0000785F 2066696C657320696E- + 42332 00007868 20736F72746564206F- + 42332 00007871 726465722E0D0A + 42333 MSG_1485: + 42334 00007878 95 db 149 + 42335 00007879 2020736F72746F7264- db ' sortord N By name (alphabetic) S By size (smallest first)',0Dh,0Ah + 42335 00007882 2020204E2020427920- + 42335 0000788B 6E616D652028616C70- + 42335 00007894 686162657469632920- + 42335 0000789D 202020202020532020- + 42335 000078A6 42792073697A652028- + 42335 000078AF 736D616C6C65737420- + 42335 000078B8 6669727374290D0A + 42336 000078C0 202020202020202020- db ' E By extension (alphabetic) D By date & time (earliest first)',0Dh,0Ah + 42336 000078C9 202020452020427920- + 42336 000078D2 657874656E73696F6E- + 42336 000078DB 2028616C7068616265- + 42336 000078E4 746963292020442020- + 42336 000078ED 427920646174652026- + 42336 000078F6 2074696D6520286561- + 42336 000078FF 726C69657374206669- + 42336 00007908 727374290D0A + 42337 MSG_1486: + 42338 0000790E 8F db 143 + 42339 0000790F 202020202020202020- db ' G Group directories first - Prefix to reverse order',0Dh,0Ah + 42339 00007918 20202047202047726F- + 42339 00007921 757020646972656374- + 42339 0000792A 6F7269657320666972- + 42339 00007933 7374202020202D2020- + 42339 0000793C 50726566697820746F- + 42339 00007945 207265766572736520- + 42339 0000794E 6F726465720D0A + 42340 00007955 20202F532020202020- db ' /S Displays files in specified directory and all subdirectories.',0Dh,0Ah + 42340 0000795E 20446973706C617973- + 42340 00007967 2066696C657320696E- + 42340 00007970 207370656369666965- + 42340 00007979 64206469726563746F- + 42340 00007982 727920616E6420616C- + 42340 0000798B 6C2073756264697265- + 42340 00007994 63746F726965732E0D- + 42340 0000799D 0A + 42341 MSG_1487: + 42342 0000799E 5E db 94 + 42343 0000799F 20202F422020202020- db ' /B Uses bare format (no heading information or summary).',0Dh,0Ah + 42343 000079A8 205573657320626172- + 42343 000079B1 6520666F726D617420- + 42343 000079BA 286E6F206865616469- + 42343 000079C3 6E6720696E666F726D- + 42343 000079CC 6174696F6E206F7220- + 42343 000079D5 73756D6D617279292E- + 42343 000079DE 0D0A + 42344 000079E0 20202F4C2020202020- db ' /L Uses lowercase.',0Dh,0Ah + 42344 000079E9 2055736573206C6F77- + 42344 000079F2 6572636173652E0D0A + 42345 000079FB 0D0A db 0Dh,0Ah + 42346 MSG_1488: + 42347 000079FD 92 db 146 + 42348 000079FE 537769746368657320- db 'Switches may be preset in the DIRCMD environment variable. Override',0Dh,0Ah + 42348 00007A07 6D6179206265207072- + 42348 00007A10 6573657420696E2074- + 42348 00007A19 686520444952434D44- + 42348 00007A22 20656E7669726F6E6D- + 42348 00007A2B 656E74207661726961- + 42348 00007A34 626C652E20204F7665- + 42348 00007A3D 72726964650D0A + 42349 00007A44 707265736574207377- db 'preset switches by prefixing any switch with - (hyphen)--for example, /-W.',0Dh,0Ah + 42349 00007A4D 697463686573206279- + 42349 00007A56 20707265666978696E- + 42349 00007A5F 6720616E7920737769- + 42349 00007A68 746368207769746820- + 42349 00007A71 2D202868797068656E- + 42349 00007A7A 292D2D666F72206578- + 42349 00007A83 616D706C652C202F2D- + 42349 00007A8C 572E0D0A + 42350 MSG_1489: + 42351 00007A90 50 db 80 + 42352 00007A91 546F2072656D6F7665- db 'To remove the commas from the DIR output, use the NO_SEP environment variable.',0Dh,0Ah + 42352 00007A9A 2074686520636F6D6D- + 42352 00007AA3 61732066726F6D2074- + 42352 00007AAC 686520444952206F75- + 42352 00007AB5 747075742C20757365- + 42352 00007ABE 20746865204E4F5F53- + 42352 00007AC7 455020656E7669726F- + 42352 00007AD0 6E6D656E7420766172- + 42352 00007AD9 6961626C652E0D0A + 42353 %endif + 42354 + 42355 MSG_1500: + 42356 00007AE1 3E db 62 + 42357 00007AE2 517569747320746865- db 'Quits the COMMAND.COM program (command interpreter).',0Dh,0Ah + 42357 00007AEB 20434F4D4D414E442E- + 42357 00007AF4 434F4D2070726F6772- + 42357 00007AFD 616D2028636F6D6D61- + 42357 00007B06 6E6420696E74657270- + 42357 00007B0F 7265746572292E0D0A + 42358 00007B18 0D0A db 0Dh,0Ah + 42359 00007B1A 455849540D0A db 'EXIT',0Dh,0Ah + 42360 MSG_1520: + 42361 00007B20 3D db 61 + 42362 00007B21 437265617465732061- db 'Creates a directory.',0Dh,0Ah + 42362 00007B2A 206469726563746F72- + 42362 00007B33 792E0D0A + 42363 00007B37 0D0A db 0Dh,0Ah + 42364 00007B39 4D4B444952205B6472- db 'MKDIR [drive:]path',0Dh,0Ah + 42364 00007B42 6976653A5D70617468- + 42364 00007B4B 0D0A + 42365 00007B4D 4D44205B6472697665- db 'MD [drive:]path',0Dh,0Ah + 42365 00007B56 3A5D706174680D0A + 42366 MSG_1540: + 42367 00007B5E 5D db 93 + 42368 00007B5F 446973706C61797320- db 'Displays or sets a search path for executable files.',0Dh,0Ah + 42368 00007B68 6F7220736574732061- + 42368 00007B71 207365617263682070- + 42368 00007B7A 61746820666F722065- + 42368 00007B83 786563757461626C65- + 42368 00007B8C 2066696C65732E0D0A + 42369 00007B95 0D0A db 0Dh,0Ah + 42370 00007B97 50415448205B5B6472- db 'PATH [[drive:]path[;...]]',0Dh,0Ah + 42370 00007BA0 6976653A5D70617468- + 42370 00007BA9 5B3B2E2E2E5D5D0D0A + 42371 00007BB2 50415448203B0D0A db 'PATH ;',0Dh,0Ah + 42372 00007BBA 0D0A db 0Dh,0Ah + 42373 MSG_1541: + 42374 00007BBC 6B db 107 + 42375 00007BBD 547970652050415448- db 'Type PATH ; to clear all search-path settings and direct PC DOS to search',0Dh,0Ah + 42375 00007BC6 203B20746F20636C65- + 42375 00007BCF 617220616C6C207365- + 42375 00007BD8 617263682D70617468- + 42375 00007BE1 2073657474696E6773- + 42375 00007BEA 20616E642064697265- + 42375 00007BF3 637420504320444F53- + 42375 00007BFC 20746F207365617263- + 42375 00007C05 680D0A + 42376 00007C08 6F6E6C7920696E2074- db 'only in the current directory.',0Dh,0Ah + 42376 00007C11 68652063757272656E- + 42376 00007C1A 74206469726563746F- + 42376 00007C23 72792E0D0A + 42377 MSG_1542: + 42378 00007C28 3B db 59 + 42379 00007C29 547970652050415448- db 'Type PATH without parameters to display the current path.',0Dh,0Ah + 42379 00007C32 20776974686F757420- + 42379 00007C3B 706172616D65746572- + 42379 00007C44 7320746F2064697370- + 42379 00007C4D 6C6179207468652063- + 42379 00007C56 757272656E74207061- + 42379 00007C5F 74682E0D0A + 42380 MSG_1560: + 42381 00007C64 37 db 55 + 42382 00007C65 4368616E6765732074- db 'Changes the PC DOS command prompt.',0Dh,0Ah + 42382 00007C6E 686520504320444F53- + 42382 00007C77 20636F6D6D616E6420- + 42382 00007C80 70726F6D70742E0D0A + 42383 00007C89 0D0A db 0Dh,0Ah + 42384 00007C8B 50524F4D5054205B74- db 'PROMPT [text]',0Dh,0Ah + 42384 00007C94 6578745D0D0A + 42385 00007C9A 0D0A db 0Dh,0Ah + 42386 MSG_1561: + 42387 00007C9C 7C db 124 + 42388 00007C9D 202074657874202020- db ' text Specifies a new command prompt.',0Dh,0Ah + 42388 00007CA6 205370656369666965- + 42388 00007CAF 732061206E65772063- + 42388 00007CB8 6F6D6D616E64207072- + 42388 00007CC1 6F6D70742E0D0A + 42389 00007CC8 0D0A db 0Dh,0Ah + 42390 00007CCA 50726F6D7074206361- db 'Prompt can be made up of normal characters and the following special codes:',0Dh,0Ah + 42390 00007CD3 6E206265206D616465- + 42390 00007CDC 207570206F66206E6F- + 42390 00007CE5 726D616C2063686172- + 42390 00007CEE 61637465727320616E- + 42390 00007CF7 642074686520666F6C- + 42390 00007D00 6C6F77696E67207370- + 42390 00007D09 656369616C20636F64- + 42390 00007D12 65733A0D0A + 42391 00007D17 0D0A db 0Dh,0Ah + 42392 MSG_1562: + 42393 00007D19 2F db 47 + 42394 00007D1A 202024512020203D20- db ' $Q = (equal sign)',0Dh,0Ah + 42394 00007D23 28657175616C207369- + 42394 00007D2C 676E290D0A + 42395 00007D31 202024242020202420- db ' $$ $ (dollar sign)',0Dh,0Ah + 42395 00007D3A 28646F6C6C61722073- + 42395 00007D43 69676E290D0A + 42396 MSG_1563: + 42397 00007D49 2A db 42 + 42398 00007D4A 202024542020204375- db ' $T Current time',0Dh,0Ah + 42398 00007D53 7272656E742074696D- + 42398 00007D5C 650D0A + 42399 00007D5F 202024442020204375- db ' $D Current date',0Dh,0Ah + 42399 00007D68 7272656E7420646174- + 42399 00007D71 650D0A + 42400 MSG_1564: + 42401 00007D74 3D db 61 + 42402 00007D75 202024502020204375- db ' $P Current drive and path',0Dh,0Ah + 42402 00007D7E 7272656E7420647269- + 42402 00007D87 766520616E64207061- + 42402 00007D90 74680D0A + 42403 00007D94 202024562020204D53- db ' $V MS-DOS version number',0Dh,0Ah + 42403 00007D9D 2D444F532076657273- + 42403 00007DA6 696F6E206E756D6265- + 42403 00007DAF 720D0A + 42404 MSG_1565: + 42405 00007DB2 34 db 52 + 42406 00007DB3 2020244E2020204375- db ' $N Current drive',0Dh,0Ah + 42406 00007DBC 7272656E7420647269- + 42406 00007DC5 76650D0A + 42407 00007DC9 202024472020203E20- db ' $G > (greater-than sign)',0Dh,0Ah + 42407 00007DD2 28677265617465722D- + 42407 00007DDB 7468616E207369676E- + 42407 00007DE4 290D0A + 42408 MSG_1566: + 42409 00007DE7 2C db 44 + 42410 00007DE8 2020244C2020203C20- db ' $L < (less-than sign)',0Dh,0Ah + 42410 00007DF1 286C6573732D746861- + 42410 00007DFA 6E207369676E290D0A + 42411 00007E03 202024422020207C20- db ' $B | (pipe)',0Dh,0Ah + 42411 00007E0C 2870697065290D0A + 42412 MSG_1567: + 42413 00007E14 79 db 121 + 42414 00007E15 202024482020204261- db ' $H Backspace (erases previous character)',0Dh,0Ah + 42414 00007E1E 636B73706163652028- + 42414 00007E27 657261736573207072- + 42414 00007E30 6576696F7573206368- + 42414 00007E39 61726163746572290D- + 42414 00007E42 0A + 42415 00007E43 202024452020204573- db ' $E Escape code (ASCII code 27)',0Dh,0Ah + 42415 00007E4C 6361706520636F6465- + 42415 00007E55 202841534349492063- + 42415 00007E5E 6F6465203237290D0A + 42416 00007E67 2020245F2020204361- db ' $_ Carriage return and linefeed',0Dh,0Ah + 42416 00007E70 727269616765207265- + 42416 00007E79 7475726E20616E6420- + 42416 00007E82 6C696E65666565640D- + 42416 00007E8B 0A + 42417 00007E8C 0D0A db 0Dh,0Ah + 42418 MSG_1568: + 42419 00007E8E 4C db 76 + 42420 00007E8F 547970652050524F4D- db 'Type PROMPT without parameters to reset the prompt to the default setting.',0Dh,0Ah + 42420 00007E98 505420776974686F75- + 42420 00007EA1 7420706172616D6574- + 42420 00007EAA 65727320746F207265- + 42420 00007EB3 736574207468652070- + 42420 00007EBC 726F6D707420746F20- + 42420 00007EC5 746865206465666175- + 42420 00007ECE 6C742073657474696E- + 42420 00007ED7 672E0D0A + 42421 MSG_1580: + 42422 00007EDB 47 db 71 + 42423 00007EDC 52656D6F7665732028- db 'Removes (deletes) a directory.',0Dh,0Ah + 42423 00007EE5 64656C657465732920- + 42423 00007EEE 61206469726563746F- + 42423 00007EF7 72792E0D0A + 42424 00007EFC 0D0A db 0Dh,0Ah + 42425 00007EFE 524D444952205B6472- db 'RMDIR [drive:]path',0Dh,0Ah + 42425 00007F07 6976653A5D70617468- + 42425 00007F10 0D0A + 42426 00007F12 5244205B6472697665- db 'RD [drive:]path',0Dh,0Ah + 42426 00007F1B 3A5D706174680D0A + 42427 MSG_1600: + 42428 00007F23 1C db 28 + 42429 00007F24 52656E616D65732061- db 'Renames a file or files.',0Dh,0Ah + 42429 00007F2D 2066696C65206F7220- + 42429 00007F36 66696C65732E0D0A + 42430 00007F3E 0D0A db 0Dh,0Ah + 42431 MSG_1601: + 42432 00007F40 53 db 83 + 42433 00007F41 52454E414D45205B64- db 'RENAME [drive:][path]filename1 filename2',0Dh,0Ah + 42433 00007F4A 726976653A5D5B7061- + 42433 00007F53 74685D66696C656E61- + 42433 00007F5C 6D65312066696C656E- + 42433 00007F65 616D65320D0A + 42434 00007F6B 52454E205B64726976- db 'REN [drive:][path]filename1 filename2',0Dh,0Ah + 42434 00007F74 653A5D5B706174685D- + 42434 00007F7D 66696C656E616D6531- + 42434 00007F86 2066696C656E616D65- + 42434 00007F8F 320D0A + 42435 00007F92 0D0A db 0Dh,0Ah + 42436 MSG_1602: + 42437 ;db 77 + 42438 ;db 'Note that you cannot specify a new drive or path for your destination file.',0Dh,0Ah 42439 - 42440 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42441 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:8447h - 42442 MSG_1602: - 42443 00007F94 A0 db 160 - 42444 00007F95 4E6F74652074686174- db 'Note that you cannot specify a new drive or path for your destination file.',0Dh,0Ah - 42444 00007F9E 20796F752063616E6E- - 42444 00007FA7 6F7420737065636966- - 42444 00007FB0 792061206E65772064- - 42444 00007FB9 72697665206F722070- - 42444 00007FC2 61746820666F722079- - 42444 00007FCB 6F7572206465737469- - 42444 00007FD4 6E6174696F6E206669- - 42444 00007FDD 6C652E0D0A - 42445 00007FE2 0D0A db 0Dh,0Ah - 42446 00007FE4 557365204D4F564520- db 'Use MOVE to rename a directory, or to move files from one directory to another.',0Dh,0Ah - 42446 00007FED 746F2072656E616D65- - 42446 00007FF6 206120646972656374- - 42446 00007FFF 6F72792C206F722074- - 42446 00008008 6F206D6F7665206669- - 42446 00008011 6C65732066726F6D20- - 42446 0000801A 6F6E65206469726563- - 42446 00008023 746F727920746F2061- - 42446 0000802C 6E6F746865722E0D0A - 42447 MSG_1620: - 42448 00008035 57 db 87 - 42449 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42450 %if 0 - 42451 db 'Displays, sets, or removes MS-DOS environment variables.',0Dh,0Ah - 42452 %else - 42453 00008036 446973706C6179732C- db 'Displays, sets, or removes PC DOS environment variables.',0Dh,0Ah - 42453 0000803F 20736574732C206F72- - 42453 00008048 2072656D6F76657320- - 42453 00008051 504320444F5320656E- - 42453 0000805A 7669726F6E6D656E74- - 42453 00008063 207661726961626C65- - 42453 0000806C 732E0D0A - 42454 %endif - 42455 00008070 0D0A db 0Dh,0Ah - 42456 00008072 534554205B76617269- db 'SET [variable=[string]]',0Dh,0Ah - 42456 0000807B 61626C653D5B737472- - 42456 00008084 696E675D5D0D0A - 42457 0000808B 0D0A db 0Dh,0Ah - 42458 MSG_1621: - 42459 0000808D 81 db 129 - 42460 0000808E 20207661726961626C- db ' variable Specifies the environment-variable name.',0Dh,0Ah - 42460 00008097 652020537065636966- - 42460 000080A0 696573207468652065- - 42460 000080A9 6E7669726F6E6D656E- - 42460 000080B2 742D7661726961626C- - 42460 000080BB 65206E616D652E0D0A - 42461 000080C4 2020737472696E6720- db ' string Specifies a series of characters to assign to the variable.',0Dh,0Ah - 42461 000080CD 202020537065636966- - 42461 000080D6 696573206120736572- - 42461 000080DF 696573206F66206368- - 42461 000080E8 617261637465727320- - 42461 000080F1 746F2061737369676E- - 42461 000080FA 20746F207468652076- - 42461 00008103 61726961626C652E0D- - 42461 0000810C 0A - 42462 0000810D 0D0A db 0Dh,0Ah - 42463 MSG_1622: - 42464 0000810F 4B db 75 - 42465 00008110 547970652053455420- db 'Type SET without parameters to display the current environment variables.',0Dh,0Ah - 42465 00008119 776974686F75742070- - 42465 00008122 6172616D6574657273- - 42465 0000812B 20746F20646973706C- - 42465 00008134 617920746865206375- - 42465 0000813D 7272656E7420656E76- - 42465 00008146 69726F6E6D656E7420- - 42465 0000814F 7661726961626C6573- - 42465 00008158 2E0D0A - 42466 MSG_1640: - 42467 ;db 52 - 42468 ;db 'Displays or sets the system time.',0Dh,0Ah - 42469 ;db 0Dh,0Ah - 42470 ;db 'TIME [time]',0Dh,0Ah - 42471 ;db 0Dh,0Ah - 42472 - 42473 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42474 %if 0 - 42475 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42476 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:885Eh) - 42477 db 45 - 42478 db 'Displays or sets the time.',0Dh,0Ah - 42479 db 0Dh,0Ah - 42480 db 'TIME [time]',0Dh,0Ah - 42481 db 0Dh,0Ah - 42482 %else - 42483 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42484 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:860Eh - 42485 0000815B 34 db 52 - 42486 0000815C 446973706C61797320- db 'Displays or sets the system time.',0Dh,0Ah - 42486 00008165 6F7220736574732074- - 42486 0000816E 68652073797374656D- - 42486 00008177 2074696D652E0D0A - 42487 0000817F 0D0A db 0Dh,0Ah - 42488 00008181 54494D45205B74696D- db 'TIME [time]',0Dh,0Ah - 42488 0000818A 655D0D0A - 42489 0000818E 0D0A db 0Dh,0Ah - 42490 %endif - 42491 - 42492 MSG_1641: - 42493 00008190 83 db 131 - 42494 00008191 547970652054494D45- db 'Type TIME with no parameters to display the current time setting and a prompt',0Dh,0Ah - 42494 0000819A 2077697468206E6F20- - 42494 000081A3 706172616D65746572- - 42494 000081AC 7320746F2064697370- - 42494 000081B5 6C6179207468652063- - 42494 000081BE 757272656E74207469- - 42494 000081C7 6D652073657474696E- - 42494 000081D0 6720616E6420612070- - 42494 000081D9 726F6D70740D0A - 42495 000081E0 666F722061206E6577- db 'for a new one. Press ENTER to keep the same time.',0Dh,0Ah - 42495 000081E9 206F6E652E20205072- - 42495 000081F2 65737320454E544552- - 42495 000081FB 20746F206B65657020- - 42495 00008204 7468652073616D6520- - 42495 0000820D 74696D652E0D0A - 42496 MSG_1660: - 42497 00008214 46 db 70 - 42498 00008215 446973706C61797320- db 'Displays the contents of a text file.',0Dh,0Ah - 42498 0000821E 74686520636F6E7465- - 42498 00008227 6E7473206F66206120- - 42498 00008230 746578742066696C65- - 42498 00008239 2E0D0A - 42499 0000823C 0D0A db 0Dh,0Ah - 42500 0000823E 54595045205B647269- db 'TYPE [drive:][path]filename',0Dh,0Ah - 42500 00008247 76653A5D5B70617468- - 42500 00008250 5D66696C656E616D65- - 42500 00008259 0D0A - 42501 MSG_1680: - 42502 0000825B 25 db 37 - 42503 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42504 %if 0 - 42505 db 'Displays the MS-DOS version.',0Dh,0Ah - 42506 %else - 42507 0000825C 446973706C61797320- db 'Displays the PC DOS version.',0Dh,0Ah - 42507 00008265 74686520504320444F- - 42507 0000826E 532076657273696F6E- - 42507 00008277 2E0D0A - 42508 %endif - 42509 0000827A 0D0A db 0Dh,0Ah - 42510 0000827C 5645520D0A db 'VER',0Dh,0Ah - 42511 MSG_1700: - 42512 00008281 B1 db 177 - 42513 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42514 %if 0 - 42515 db 'Tells MS-DOS whether to verify that your files are written correctly to a',0Dh,0Ah - 42516 db 'disk.',0Dh,0Ah - 42517 %else - 42518 00008282 54656C6C7320504320- db 'Tells PC DOS whether to verify that your files are written correctly to a',0Dh,0Ah - 42518 0000828B 444F53207768657468- - 42518 00008294 657220746F20766572- - 42518 0000829D 696679207468617420- - 42518 000082A6 796F75722066696C65- - 42518 000082AF 732061726520777269- - 42518 000082B8 7474656E20636F7272- - 42518 000082C1 6563746C7920746F20- - 42518 000082CA 610D0A - 42519 000082CD 6469736B2E0D0A db 'disk.',0Dh,0Ah - 42520 %endif - 42521 000082D4 0D0A db 0Dh,0Ah - 42522 000082D6 564552494659205B4F- db 'VERIFY [ON | OFF]',0Dh,0Ah - 42522 000082DF 4E207C204F46465D0D- - 42522 000082E8 0A - 42523 000082E9 0D0A db 0Dh,0Ah - 42524 000082EB 547970652056455249- db 'Type VERIFY without a parameter to display the current VERIFY setting.',0Dh,0Ah - 42524 000082F4 465920776974686F75- - 42524 000082FD 74206120706172616D- - 42524 00008306 6574657220746F2064- - 42524 0000830F 6973706C6179207468- - 42524 00008318 652063757272656E74- - 42524 00008321 205645524946592073- - 42524 0000832A 657474696E672E0D0A - 42525 MSG_1720: - 42526 00008333 52 db 82 - 42527 00008334 446973706C61797320- db 'Displays the disk volume label and serial number, if they exist.',0Dh,0Ah - 42527 0000833D 746865206469736B20- - 42527 00008346 766F6C756D65206C61- - 42527 0000834F 62656C20616E642073- - 42527 00008358 657269616C206E756D- - 42527 00008361 6265722C2069662074- - 42527 0000836A 686579206578697374- - 42527 00008373 2E0D0A - 42528 00008376 0D0A db 0Dh,0Ah - 42529 00008378 564F4C205B64726976- db 'VOL [drive:]',0Dh,0Ah - 42529 00008381 653A5D0D0A - 42530 MSG_1740: - 42531 00008386 5B db 91 - 42532 00008387 43616C6C73206F6E65- db 'Calls one batch program from another.',0Dh,0Ah - 42532 00008390 206261746368207072- - 42532 00008399 6F6772616D2066726F- - 42532 000083A2 6D20616E6F74686572- - 42532 000083AB 2E0D0A - 42533 000083AE 0D0A db 0Dh,0Ah - 42534 000083B0 43414C4C205B647269- db 'CALL [drive:][path]filename [batch-parameters]',0Dh,0Ah - 42534 000083B9 76653A5D5B70617468- - 42534 000083C2 5D66696C656E616D65- - 42534 000083CB 205B62617463682D70- - 42534 000083D4 6172616D6574657273- - 42534 000083DD 5D0D0A - 42535 000083E0 0D0A db 0Dh,0Ah - 42536 MSG_1741: - 42537 000083E2 72 db 114 - 42538 000083E3 202062617463682D70- db ' batch-parameters Specifies any command-line information required by the',0Dh,0Ah - 42538 000083EC 6172616D6574657273- - 42538 000083F5 202020537065636966- - 42538 000083FE 69657320616E792063- - 42538 00008407 6F6D6D616E642D6C69- - 42538 00008410 6E6520696E666F726D- - 42538 00008419 6174696F6E20726571- - 42538 00008422 756972656420627920- - 42538 0000842B 7468650D0A - 42539 00008430 202020202020202020- db ' batch program.',0Dh,0Ah - 42539 00008439 202020202020202020- - 42539 00008442 202020626174636820- - 42539 0000844B 70726F6772616D2E0D- - 42539 00008454 0A - 42540 MSG_1760: - 42541 00008455 4C db 76 - 42542 00008456 5265636F7264732063- db 'Records comments (remarks) in a batch file or CONFIG.SYS.',0Dh,0Ah - 42542 0000845F 6F6D6D656E74732028- - 42542 00008468 72656D61726B732920- - 42542 00008471 696E20612062617463- - 42542 0000847A 682066696C65206F72- - 42542 00008483 20434F4E4649472E53- - 42542 0000848C 59532E0D0A - 42543 00008491 0D0A db 0Dh,0Ah - 42544 00008493 52454D205B636F6D6D- db 'REM [comment]',0Dh,0Ah - 42544 0000849C 656E745D0D0A - 42545 MSG_1780: - 42546 000084A2 6B db 107 - 42547 000084A3 53757370656E647320- db 'Suspends processing of a batch program and displays the message "' - 42547 000084AC 70726F63657373696E- - 42547 000084B5 67206F662061206261- - 42547 000084BE 7463682070726F6772- - 42547 000084C7 616D20616E64206469- - 42547 000084D0 73706C617973207468- - 42547 000084D9 65206D657373616765- - 42547 000084E2 2022 - 42548 000084E4 507265737320616E79- db 'Press any',0Dh,0Ah - 42548 000084ED 0D0A - 42549 000084EF 6B657920746F20636F- db 'key to continue...."',0Dh,0Ah - 42549 000084F8 6E74696E75652E2E2E- - 42549 00008501 2E220D0A - 42550 00008505 0D0A db 0Dh,0Ah - 42551 00008507 50415553450D0A db 'PAUSE',0Dh,0Ah - 42552 MSG_1800: - 42553 0000850E 4D db 77 - 42554 0000850F 446973706C61797320- db 'Displays messages, or turns command-echoing on or off.',0Dh,0Ah - 42554 00008518 6D657373616765732C- - 42554 00008521 206F72207475726E73- - 42554 0000852A 20636F6D6D616E642D- - 42554 00008533 6563686F696E67206F- - 42554 0000853C 6E206F72206F66662E- - 42554 00008545 0D0A - 42555 00008547 0D0A db 0Dh,0Ah - 42556 00008549 20204543484F205B4F- db ' ECHO [ON | OFF]',0Dh,0Ah - 42556 00008552 4E207C204F46465D0D- - 42556 0000855B 0A - 42557 MSG_1801: - 42558 0000855C 57 db 87 - 42559 0000855D 20204543484F205B6D- db ' ECHO [message]',0Dh,0Ah - 42559 00008566 6573736167655D0D0A - 42560 0000856F 0D0A db 0Dh,0Ah - 42561 00008571 54797065204543484F- db 'Type ECHO without parameters to display the current echo setting.' - 42561 0000857A 20776974686F757420- - 42561 00008583 706172616D65746572- - 42561 0000858C 7320746F2064697370- - 42561 00008595 6C6179207468652063- - 42561 0000859E 757272656E74206563- - 42561 000085A7 686F2073657474696E- - 42561 000085B0 672E - 42562 000085B2 0D0A db 0Dh,0Ah - 42563 MSG_1820: - 42564 000085B4 47 db 71 - 42565 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42566 %if 0 - 42567 db 'Directs MS-DOS to a labelled line in a batch program.',0Dh,0Ah - 42568 %else - 42569 000085B5 446972656374732050- db 'Directs PC DOS to a labelled line in a batch program.',0Dh,0Ah - 42569 000085BE 4320444F5320746F20- - 42569 000085C7 61206C6162656C6C65- - 42569 000085D0 64206C696E6520696E- - 42569 000085D9 206120626174636820- - 42569 000085E2 70726F6772616D2E0D- - 42569 000085EB 0A - 42570 %endif - 42571 000085EC 0D0A db 0Dh,0Ah - 42572 000085EE 474F544F206C616265- db 'GOTO label',0Dh,0Ah - 42572 000085F7 6C0D0A - 42573 000085FA 0D0A db 0Dh,0Ah - 42574 MSG_1821: - 42575 000085FC 8A db 138 - 42576 000085FD 20206C6162656C2020- db ' label Specifies a text string used in the batch program as a label.',0Dh,0Ah - 42576 00008606 205370656369666965- - 42576 0000860F 732061207465787420- - 42576 00008618 737472696E67207573- - 42576 00008621 656420696E20746865- - 42576 0000862A 206261746368207072- - 42576 00008633 6F6772616D20617320- - 42576 0000863C 61206C6162656C2E0D- - 42576 00008645 0A - 42577 00008646 0D0A db 0Dh,0Ah - 42578 00008648 596F75207479706520- db 'You type a label on a line by itself, beginning with a colon.',0Dh,0Ah - 42578 00008651 61206C6162656C206F- - 42578 0000865A 6E2061206C696E6520- - 42578 00008663 627920697473656C66- - 42578 0000866C 2C20626567696E6E69- - 42578 00008675 6E6720776974682061- - 42578 0000867E 20636F6C6F6E2E0D0A - 42579 MSG_1840: - 42580 00008687 4A db 74 - 42581 00008688 4368616E6765732074- db 'Changes the position of replaceable parameters in a batch file.',0Dh,0Ah - 42581 00008691 686520706F73697469- - 42581 0000869A 6F6E206F6620726570- - 42581 000086A3 6C61636561626C6520- - 42581 000086AC 706172616D65746572- - 42581 000086B5 7320696E2061206261- - 42581 000086BE 7463682066696C652E- - 42581 000086C7 0D0A - 42582 000086C9 0D0A db 0Dh,0Ah - 42583 000086CB 53484946540D0A db 'SHIFT',0Dh,0Ah - 42584 MSG_1860: - 42585 000086D2 5A db 90 - 42586 000086D3 506572666F726D7320- db 'Performs conditional processing in batch programs.',0Dh,0Ah - 42586 000086DC 636F6E646974696F6E- - 42586 000086E5 616C2070726F636573- - 42586 000086EE 73696E6720696E2062- - 42586 000086F7 617463682070726F67- - 42586 00008700 72616D732E0D0A - 42587 00008707 0D0A db 0Dh,0Ah - 42588 00008709 4946205B4E4F545D20- db 'IF [NOT] ERRORLEVEL number command',0Dh,0Ah - 42588 00008712 4552524F524C455645- - 42588 0000871B 4C206E756D62657220- - 42588 00008724 636F6D6D616E640D0A - 42589 MSG_1861: - 42590 0000872D 46 db 70 - 42591 0000872E 4946205B4E4F545D20- db 'IF [NOT] string1==string2 command',0Dh,0Ah - 42591 00008737 737472696E67313D3D- - 42591 00008740 737472696E67322063- - 42591 00008749 6F6D6D616E640D0A - 42592 00008751 4946205B4E4F545D20- db 'IF [NOT] EXIST filename command',0Dh,0Ah - 42592 0000875A 45584953542066696C- - 42592 00008763 656E616D6520636F6D- - 42592 0000876C 6D616E640D0A - 42593 00008772 0D0A db 0Dh,0Ah - 42594 MSG_1862: - 42595 00008774 7D db 125 - 42596 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42597 %if 0 - 42598 db ' NOT Specifies that MS-DOS should carry out the command only',0Dh,0Ah - 42599 %else - 42600 00008775 20204E4F5420202020- db ' NOT Specifies that PC DOS should carry out the command only',0Dh,0Ah - 42600 0000877E 202020202020202020- - 42600 00008787 202053706563696669- - 42600 00008790 657320746861742050- - 42600 00008799 4320444F532073686F- - 42600 000087A2 756C64206361727279- - 42600 000087AB 206F75742074686520- - 42600 000087B4 636F6D6D616E64206F- - 42600 000087BD 6E6C790D0A - 42601 %endif - 42602 000087C2 202020202020202020- db ' if the condition is false.',0Dh,0Ah - 42602 000087CB 202020202020202020- - 42602 000087D4 202069662074686520- - 42602 000087DD 636F6E646974696F6E- - 42602 000087E6 2069732066616C7365- - 42602 000087EF 2E0D0A - 42603 MSG_1863: - 42604 000087F2 A2 db 162 - 42605 000087F3 20204552524F524C45- db ' ERRORLEVEL number Specifies a true condition if the last program run returned',0Dh,0Ah - 42605 000087FC 56454C206E756D6265- - 42605 00008805 722053706563696669- - 42605 0000880E 657320612074727565- - 42605 00008817 20636F6E646974696F- - 42605 00008820 6E2069662074686520- - 42605 00008829 6C6173742070726F67- - 42605 00008832 72616D2072756E2072- - 42605 0000883B 657475726E65640D0A - 42606 00008844 202020202020202020- db ' ' - 42606 0000884D 202020202020202020- - 42606 00008856 2020 - 42607 00008858 616E20657869742063- db 'an exit code equal to or greater than the number specified.',0Dh,0Ah - 42607 00008861 6F646520657175616C- - 42607 0000886A 20746F206F72206772- - 42607 00008873 656174657220746861- - 42607 0000887C 6E20746865206E756D- - 42607 00008885 626572207370656369- - 42607 0000888E 666965642E0D0A - 42608 MSG_1864: - 42609 00008895 66 db 102 - 42610 00008896 2020636F6D6D616E64- db ' command Specifies the command to carry out if the condition is',0Dh,0Ah - 42610 0000889F 202020202020202020- - 42610 000088A8 202053706563696669- - 42610 000088B1 65732074686520636F- - 42610 000088BA 6D6D616E6420746F20- - 42610 000088C3 6361727279206F7574- - 42610 000088CC 206966207468652063- - 42610 000088D5 6F6E646974696F6E20- - 42610 000088DE 69730D0A - 42611 000088E2 202020202020202020- db ' met.',0Dh,0Ah - 42611 000088EB 202020202020202020- - 42611 000088F4 20206D65742E0D0A - 42612 MSG_1865: - 42613 000088FC 6A db 106 - 42614 000088FD 2020737472696E6731- db ' string1==string2 Specifies a true condition if the specified text strings',0Dh,0Ah - 42614 00008906 3D3D737472696E6732- - 42614 0000890F 202053706563696669- - 42614 00008918 657320612074727565- - 42614 00008921 20636F6E646974696F- - 42614 0000892A 6E2069662074686520- - 42614 00008933 737065636966696564- - 42614 0000893C 207465787420737472- - 42614 00008945 696E67730D0A - 42615 0000894B 202020202020202020- db ' match.',0Dh,0Ah - 42615 00008954 202020202020202020- - 42615 0000895D 20206D617463682E0D- - 42615 00008966 0A - 42616 MSG_1866: - 42617 00008967 67 db 103 - 42618 00008968 202045584953542066- db ' EXIST filename Specifies a true condition if the specified filename',0Dh,0Ah - 42618 00008971 696C656E616D652020- - 42618 0000897A 202053706563696669- - 42618 00008983 657320612074727565- - 42618 0000898C 20636F6E646974696F- - 42618 00008995 6E2069662074686520- - 42618 0000899E 737065636966696564- - 42618 000089A7 2066696C656E616D65- - 42618 000089B0 0D0A - 42619 000089B2 202020202020202020- db ' exists.',0Dh,0Ah - 42619 000089BB 202020202020202020- - 42619 000089C4 20206578697374732E- - 42619 000089CD 0D0A - 42620 MSG_1880: - 42621 000089CF 77 db 119 - 42622 000089D0 52756E732061207370- db 'Runs a specified command for each file in a set of files.',0Dh,0Ah - 42622 000089D9 656369666965642063- - 42622 000089E2 6F6D6D616E6420666F- - 42622 000089EB 722065616368206669- - 42622 000089F4 6C6520696E20612073- - 42622 000089FD 6574206F662066696C- - 42622 00008A06 65732E0D0A - 42623 00008A0B 0D0A db 0Dh,0Ah - 42624 00008A0D 464F52202576617269- db 'FOR %variable IN (set) DO command [command-parameters]',0Dh,0Ah - 42624 00008A16 61626C6520494E2028- - 42624 00008A1F 7365742920444F2063- - 42624 00008A28 6F6D6D616E64205B63- - 42624 00008A31 6F6D6D616E642D7061- - 42624 00008A3A 72616D65746572735D- - 42624 00008A43 0D0A - 42625 00008A45 0D0A db 0Dh,0Ah - 42626 MSG_1881: - 42627 00008A47 7D db 125 - 42628 00008A48 202025766172696162- db ' %variable Specifies a replaceable parameter.',0Dh,0Ah - 42628 00008A51 6C6520205370656369- - 42628 00008A5A 666965732061207265- - 42628 00008A63 706C61636561626C65- - 42628 00008A6C 20706172616D657465- - 42628 00008A75 722E0D0A - 42629 00008A79 202028736574292020- db ' (set) Specifies a set of one or more files. Wildcards may be used.',0Dh,0Ah - 42629 00008A82 202020205370656369- - 42629 00008A8B 666965732061207365- - 42629 00008A94 74206F66206F6E6520- - 42629 00008A9D 6F72206D6F72652066- - 42629 00008AA6 696C65732E20205769- - 42629 00008AAF 6C646361726473206D- - 42629 00008AB8 617920626520757365- - 42629 00008AC1 642E0D0A - 42630 MSG_1882: - 42631 00008AC5 56 db 86 - 42632 00008AC6 2020636F6D6D616E64- db ' command Specifies the command to carry out for each file.',0Dh,0Ah - 42632 00008ACF 202020205370656369- - 42632 00008AD8 666965732074686520- - 42632 00008AE1 636F6D6D616E642074- - 42632 00008AEA 6F206361727279206F- - 42632 00008AF3 757420666F72206561- - 42632 00008AFC 63682066696C652E0D- - 42632 00008B05 0A - 42633 00008B06 2020636F6D6D616E64- db ' command-parameters',0Dh,0Ah - 42633 00008B0F 2D706172616D657465- - 42633 00008B18 72730D0A - 42634 MSG_1883: - 42635 00008B1C A2 db 162 - 42636 00008B1D 202020202020202020- db ' Specifies parameters or switches for the specified command.',0Dh,0Ah - 42636 00008B26 202020205370656369- - 42636 00008B2F 666965732070617261- - 42636 00008B38 6D6574657273206F72- - 42636 00008B41 207377697463686573- - 42636 00008B4A 20666F722074686520- - 42636 00008B53 737065636966696564- - 42636 00008B5C 20636F6D6D616E642E- - 42636 00008B65 0D0A - 42637 00008B67 0D0A db 0Dh,0Ah - 42638 00008B69 546F20757365207468- db 'To use the FOR command in a batch program, specify %%variable instead of',0Dh,0Ah - 42638 00008B72 6520464F5220636F6D- - 42638 00008B7B 6D616E6420696E2061- - 42638 00008B84 206261746368207072- - 42638 00008B8D 6F6772616D2C207370- - 42638 00008B96 656369667920252576- - 42638 00008B9F 61726961626C652069- - 42638 00008BA8 6E7374656164206F66- - 42638 00008BB1 0D0A - 42639 00008BB3 257661726961626C65- db '%variable.',0Dh,0Ah - 42639 00008BBC 2E0D0A - 42640 MSG_1900: - 42641 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42642 %if 0 - 42643 ; MSDOS 6.22 COMMAND.COM - 42644 db 23 - 42645 db 'Reserved command name',0Dh,0Ah - 42646 %else - 42647 ; PCDOS 7.1 COMMAND.COM - 42648 00008BBF 48 db 72 - 42649 00008BC0 52657475726E732061- db 'Returns a fully qualified filename.',0Dh,0Ah - 42649 00008BC9 2066756C6C79207175- - 42649 00008BD2 616C69666965642066- - 42649 00008BDB 696C656E616D652E0D- - 42649 00008BE4 0A - 42650 00008BE5 0D0A db 0Dh,0Ah - 42651 00008BE7 545255454E414D4520- db 'TRUENAME [drive:][path]filename',0Dh,0Ah - 42651 00008BF0 5B64726976653A5D5B- - 42651 00008BF9 706174685D66696C65- - 42651 00008C02 6E616D650D0A - 42652 %endif - 42653 MSG_1920: - 42654 00008C08 2F db 47 - 42655 00008C09 4C6F61647320612070- db 'Loads a program into the upper memory area.',0Dh,0Ah - 42655 00008C12 726F6772616D20696E- - 42655 00008C1B 746F20746865207570- - 42655 00008C24 706572206D656D6F72- - 42655 00008C2D 7920617265612E0D0A - 42656 00008C36 0D0A db 0Dh,0Ah - 42657 MSG_1921: - 42658 ;db 88 - 42659 ;db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah - 42660 ;db 'LH [drive:][path]filename [parameters]',0Dh,0Ah - 42661 ;db 0Dh,0Ah - 42662 - 42663 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42664 %if 0 - 42665 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42666 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9303h - 42667 db 157 - 42668 db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah - 42669 db 'LOADHIGH [/L:region1[,minsize1][;region2[,minsize2]...] [/S]]',0Dh,0Ah - 42670 db ' [drive:][path]filename [parameters]',0Dh,0Ah - 42671 db 0Dh,0Ah - 42672 %else - 42673 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42674 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:90EBh - 42675 00008C38 98 db 152 - 42676 00008C39 4C4F41444849474820- db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah - 42676 00008C42 5B64726976653A5D5B- - 42676 00008C4B 706174685D66696C65- - 42676 00008C54 6E616D65205B706172- - 42676 00008C5D 616D65746572735D0D- - 42676 00008C66 0A - 42677 00008C67 4C4F41444849474820- db 'LOADHIGH [/L:region1[,minsize1][;region2[,minsize2]...]]',0Dh,0Ah - 42677 00008C70 5B2F4C3A726567696F- - 42677 00008C79 6E315B2C6D696E7369- - 42677 00008C82 7A65315D5B3B726567- - 42677 00008C8B 696F6E325B2C6D696E- - 42677 00008C94 73697A65325D2E2E2E- - 42677 00008C9D 5D5D0D0A - 42678 00008CA1 202020202020202020- db ' [drive:][path]filename [parameters]',0Dh,0Ah - 42678 00008CAA 5B64726976653A5D5B- - 42678 00008CB3 706174685D66696C65- - 42678 00008CBC 6E616D65205B706172- - 42678 00008CC5 616D65746572735D0D- - 42678 00008CCE 0A - 42679 00008CCF 0D0A db 0Dh,0Ah - 42680 %endif - 42681 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:8111h) - 42682 ;MSG_1922: ; MSDOS 5.0 COMMAND.COM - 42683 ;db 113 - 42684 ;db ' parameters Specifies any command-line information required by the',0Dh,0Ah - 42685 ;db ' program you want to load.',0Dh,0Ah - 42686 - 42687 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42688 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:93A1h - 42689 MSG_1922: - 42690 00008CD1 B6 db 182 - 42691 00008CD2 2F4C3A726567696F6E- db '/L:region1[,minsize1][;region2[,minsize2]]...',0Dh,0Ah - 42691 00008CDB 315B2C6D696E73697A- - 42691 00008CE4 65315D5B3B72656769- - 42691 00008CED 6F6E325B2C6D696E73- - 42691 00008CF6 697A65325D5D2E2E2E- - 42691 00008CFF 0D0A - 42692 00008D01 202020202020202020- db ' Specifies the region(s) of memory into which to load',0Dh,0Ah - 42692 00008D0A 202020537065636966- - 42692 00008D13 696573207468652072- - 42692 00008D1C 6567696F6E28732920- - 42692 00008D25 6F66206D656D6F7279- - 42692 00008D2E 20696E746F20776869- - 42692 00008D37 636820746F206C6F61- - 42692 00008D40 640D0A - 42693 00008D43 202020202020202020- db ' the program. Region1 specifies the number of the first',0Dh,0Ah - 42693 00008D4C 202020746865207072- - 42693 00008D55 6F6772616D2E202052- - 42693 00008D5E 6567696F6E31207370- - 42693 00008D67 656369666965732074- - 42693 00008D70 6865206E756D626572- - 42693 00008D79 206F66207468652066- - 42693 00008D82 697273740D0A - 42694 MSG_1923: - 42695 00008D88 85 db 133 - 42696 00008D89 202020202020202020- db ' memory region; minsize1 specifies the minimum size, if',0Dh,0Ah - 42696 00008D92 2020206D656D6F7279- - 42696 00008D9B 20726567696F6E3B20- - 42696 00008DA4 6D696E73697A653120- - 42696 00008DAD 737065636966696573- - 42696 00008DB6 20746865206D696E69- - 42696 00008DBF 6D756D2073697A652C- - 42696 00008DC8 2069660D0A - 42697 00008DCD 202020202020202020- db ' any, for region1. Region2 and minsize2 specify the',0Dh - 42697 00008DD6 202020616E792C2066- - 42697 00008DDF 6F7220726567696F6E- - 42697 00008DE8 312E2020526567696F- - 42697 00008DF1 6E3220616E64206D69- - 42697 00008DFA 6E73697A6532207370- - 42697 00008E03 656369667920746865- - 42697 00008E0C 0D - 42698 00008E0D 0A db 0Ah - 42699 MSG_1924: - 42700 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42701 %if 0 - 42702 db 127 - 42703 db ' number and minimum size of the second region, if any.',0Dh,0Ah - 42704 db ' You can specify as many regions as you want.',0Dh,0Ah - 42705 db 0Dh,0Ah - 42706 MSG_1925: - 42707 db 131 - 42708 db '/S Shrinks a UMB to its minimum size while the program',0Dh,0Ah - 42709 db ' is loading. /S is normally used only by MemMaker.',0Dh,0Ah - 42710 db 0Dh,0Ah - 42711 %else - 42712 00008E0E 7B db 123 - 42713 00008E0F 202020202020202020- db ' number and minimum size of the second region, if any.',0Dh,0Ah - 42713 00008E18 2020206E756D626572- - 42713 00008E21 20616E64206D696E69- - 42713 00008E2A 6D756D2073697A6520- - 42713 00008E33 6F6620746865207365- - 42713 00008E3C 636F6E642072656769- - 42713 00008E45 6F6E2C20696620616E- - 42713 00008E4E 792E0D0A - 42714 00008E52 202020202020202020- db ' You can specify as many regions as you want.' - 42714 00008E5B 202020596F75206361- - 42714 00008E64 6E2073706563696679- - 42714 00008E6D 206173206D616E7920- - 42714 00008E76 726567696F6E732061- - 42714 00008E7F 7320796F752077616E- - 42714 00008E88 742E - 42715 MSG_1925: - 42716 00008E8A 02 db 2 - 42717 00008E8B 0D0A db 0Dh,0Ah - 42718 %endif - 42719 MSG_1926: - 42720 00008E8D 57 db 87 - 42721 00008E8E 5B64726976653A5D5B- db '[drive:][path]filename',0Dh,0Ah - 42721 00008E97 706174685D66696C65- - 42721 00008EA0 6E616D650D0A - 42722 00008EA6 202020202020202020- db ' Specifies the location and name of the program.',0Dh,0Ah - 42722 00008EAF 202020537065636966- - 42722 00008EB8 69657320746865206C- - 42722 00008EC1 6F636174696F6E2061- - 42722 00008ECA 6E64206E616D65206F- - 42722 00008ED3 66207468652070726F- - 42722 00008EDC 6772616D2E0D0A - 42723 00008EE3 0D0A db 0Dh,0Ah - 42724 - 42725 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42726 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:963Ah + 42440 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42441 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:8697h + 42442 + 42443 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42444 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:8447h + 42445 MSG_1602: + 42446 00007F94 A0 db 160 + 42447 00007F95 4E6F74652074686174- db 'Note that you cannot specify a new drive or path for your destination file.',0Dh,0Ah + 42447 00007F9E 20796F752063616E6E- + 42447 00007FA7 6F7420737065636966- + 42447 00007FB0 792061206E65772064- + 42447 00007FB9 72697665206F722070- + 42447 00007FC2 61746820666F722079- + 42447 00007FCB 6F7572206465737469- + 42447 00007FD4 6E6174696F6E206669- + 42447 00007FDD 6C652E0D0A + 42448 00007FE2 0D0A db 0Dh,0Ah + 42449 00007FE4 557365204D4F564520- db 'Use MOVE to rename a directory, or to move files from one directory to another.',0Dh,0Ah + 42449 00007FED 746F2072656E616D65- + 42449 00007FF6 206120646972656374- + 42449 00007FFF 6F72792C206F722074- + 42449 00008008 6F206D6F7665206669- + 42449 00008011 6C65732066726F6D20- + 42449 0000801A 6F6E65206469726563- + 42449 00008023 746F727920746F2061- + 42449 0000802C 6E6F746865722E0D0A + 42450 MSG_1620: + 42451 00008035 57 db 87 + 42452 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42453 %if 0 + 42454 db 'Displays, sets, or removes MS-DOS environment variables.',0Dh,0Ah + 42455 %else + 42456 00008036 446973706C6179732C- db 'Displays, sets, or removes PC DOS environment variables.',0Dh,0Ah + 42456 0000803F 20736574732C206F72- + 42456 00008048 2072656D6F76657320- + 42456 00008051 504320444F5320656E- + 42456 0000805A 7669726F6E6D656E74- + 42456 00008063 207661726961626C65- + 42456 0000806C 732E0D0A + 42457 %endif + 42458 00008070 0D0A db 0Dh,0Ah + 42459 00008072 534554205B76617269- db 'SET [variable=[string]]',0Dh,0Ah + 42459 0000807B 61626C653D5B737472- + 42459 00008084 696E675D5D0D0A + 42460 0000808B 0D0A db 0Dh,0Ah + 42461 MSG_1621: + 42462 0000808D 81 db 129 + 42463 0000808E 20207661726961626C- db ' variable Specifies the environment-variable name.',0Dh,0Ah + 42463 00008097 652020537065636966- + 42463 000080A0 696573207468652065- + 42463 000080A9 6E7669726F6E6D656E- + 42463 000080B2 742D7661726961626C- + 42463 000080BB 65206E616D652E0D0A + 42464 000080C4 2020737472696E6720- db ' string Specifies a series of characters to assign to the variable.',0Dh,0Ah + 42464 000080CD 202020537065636966- + 42464 000080D6 696573206120736572- + 42464 000080DF 696573206F66206368- + 42464 000080E8 617261637465727320- + 42464 000080F1 746F2061737369676E- + 42464 000080FA 20746F207468652076- + 42464 00008103 61726961626C652E0D- + 42464 0000810C 0A + 42465 0000810D 0D0A db 0Dh,0Ah + 42466 MSG_1622: + 42467 0000810F 4B db 75 + 42468 00008110 547970652053455420- db 'Type SET without parameters to display the current environment variables.',0Dh,0Ah + 42468 00008119 776974686F75742070- + 42468 00008122 6172616D6574657273- + 42468 0000812B 20746F20646973706C- + 42468 00008134 617920746865206375- + 42468 0000813D 7272656E7420656E76- + 42468 00008146 69726F6E6D656E7420- + 42468 0000814F 7661726961626C6573- + 42468 00008158 2E0D0A + 42469 MSG_1640: + 42470 ;db 52 + 42471 ;db 'Displays or sets the system time.',0Dh,0Ah + 42472 ;db 0Dh,0Ah + 42473 ;db 'TIME [time]',0Dh,0Ah + 42474 ;db 0Dh,0Ah + 42475 + 42476 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42477 %if 0 + 42478 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42479 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:885Eh) + 42480 db 45 + 42481 db 'Displays or sets the time.',0Dh,0Ah + 42482 db 0Dh,0Ah + 42483 db 'TIME [time]',0Dh,0Ah + 42484 db 0Dh,0Ah + 42485 %else + 42486 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42487 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:860Eh + 42488 0000815B 34 db 52 + 42489 0000815C 446973706C61797320- db 'Displays or sets the system time.',0Dh,0Ah + 42489 00008165 6F7220736574732074- + 42489 0000816E 68652073797374656D- + 42489 00008177 2074696D652E0D0A + 42490 0000817F 0D0A db 0Dh,0Ah + 42491 00008181 54494D45205B74696D- db 'TIME [time]',0Dh,0Ah + 42491 0000818A 655D0D0A + 42492 0000818E 0D0A db 0Dh,0Ah + 42493 %endif + 42494 + 42495 MSG_1641: + 42496 00008190 83 db 131 + 42497 00008191 547970652054494D45- db 'Type TIME with no parameters to display the current time setting and a prompt',0Dh,0Ah + 42497 0000819A 2077697468206E6F20- + 42497 000081A3 706172616D65746572- + 42497 000081AC 7320746F2064697370- + 42497 000081B5 6C6179207468652063- + 42497 000081BE 757272656E74207469- + 42497 000081C7 6D652073657474696E- + 42497 000081D0 6720616E6420612070- + 42497 000081D9 726F6D70740D0A + 42498 000081E0 666F722061206E6577- db 'for a new one. Press ENTER to keep the same time.',0Dh,0Ah + 42498 000081E9 206F6E652E20205072- + 42498 000081F2 65737320454E544552- + 42498 000081FB 20746F206B65657020- + 42498 00008204 7468652073616D6520- + 42498 0000820D 74696D652E0D0A + 42499 MSG_1660: + 42500 00008214 46 db 70 + 42501 00008215 446973706C61797320- db 'Displays the contents of a text file.',0Dh,0Ah + 42501 0000821E 74686520636F6E7465- + 42501 00008227 6E7473206F66206120- + 42501 00008230 746578742066696C65- + 42501 00008239 2E0D0A + 42502 0000823C 0D0A db 0Dh,0Ah + 42503 0000823E 54595045205B647269- db 'TYPE [drive:][path]filename',0Dh,0Ah + 42503 00008247 76653A5D5B70617468- + 42503 00008250 5D66696C656E616D65- + 42503 00008259 0D0A + 42504 MSG_1680: + 42505 0000825B 25 db 37 + 42506 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42507 %if 0 + 42508 db 'Displays the MS-DOS version.',0Dh,0Ah + 42509 %else + 42510 0000825C 446973706C61797320- db 'Displays the PC DOS version.',0Dh,0Ah + 42510 00008265 74686520504320444F- + 42510 0000826E 532076657273696F6E- + 42510 00008277 2E0D0A + 42511 %endif + 42512 0000827A 0D0A db 0Dh,0Ah + 42513 0000827C 5645520D0A db 'VER',0Dh,0Ah + 42514 MSG_1700: + 42515 00008281 B1 db 177 + 42516 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42517 %if 0 + 42518 db 'Tells MS-DOS whether to verify that your files are written correctly to a',0Dh,0Ah + 42519 db 'disk.',0Dh,0Ah + 42520 %else + 42521 00008282 54656C6C7320504320- db 'Tells PC DOS whether to verify that your files are written correctly to a',0Dh,0Ah + 42521 0000828B 444F53207768657468- + 42521 00008294 657220746F20766572- + 42521 0000829D 696679207468617420- + 42521 000082A6 796F75722066696C65- + 42521 000082AF 732061726520777269- + 42521 000082B8 7474656E20636F7272- + 42521 000082C1 6563746C7920746F20- + 42521 000082CA 610D0A + 42522 000082CD 6469736B2E0D0A db 'disk.',0Dh,0Ah + 42523 %endif + 42524 000082D4 0D0A db 0Dh,0Ah + 42525 000082D6 564552494659205B4F- db 'VERIFY [ON | OFF]',0Dh,0Ah + 42525 000082DF 4E207C204F46465D0D- + 42525 000082E8 0A + 42526 000082E9 0D0A db 0Dh,0Ah + 42527 000082EB 547970652056455249- db 'Type VERIFY without a parameter to display the current VERIFY setting.',0Dh,0Ah + 42527 000082F4 465920776974686F75- + 42527 000082FD 74206120706172616D- + 42527 00008306 6574657220746F2064- + 42527 0000830F 6973706C6179207468- + 42527 00008318 652063757272656E74- + 42527 00008321 205645524946592073- + 42527 0000832A 657474696E672E0D0A + 42528 MSG_1720: + 42529 00008333 52 db 82 + 42530 00008334 446973706C61797320- db 'Displays the disk volume label and serial number, if they exist.',0Dh,0Ah + 42530 0000833D 746865206469736B20- + 42530 00008346 766F6C756D65206C61- + 42530 0000834F 62656C20616E642073- + 42530 00008358 657269616C206E756D- + 42530 00008361 6265722C2069662074- + 42530 0000836A 686579206578697374- + 42530 00008373 2E0D0A + 42531 00008376 0D0A db 0Dh,0Ah + 42532 00008378 564F4C205B64726976- db 'VOL [drive:]',0Dh,0Ah + 42532 00008381 653A5D0D0A + 42533 MSG_1740: + 42534 00008386 5B db 91 + 42535 00008387 43616C6C73206F6E65- db 'Calls one batch program from another.',0Dh,0Ah + 42535 00008390 206261746368207072- + 42535 00008399 6F6772616D2066726F- + 42535 000083A2 6D20616E6F74686572- + 42535 000083AB 2E0D0A + 42536 000083AE 0D0A db 0Dh,0Ah + 42537 000083B0 43414C4C205B647269- db 'CALL [drive:][path]filename [batch-parameters]',0Dh,0Ah + 42537 000083B9 76653A5D5B70617468- + 42537 000083C2 5D66696C656E616D65- + 42537 000083CB 205B62617463682D70- + 42537 000083D4 6172616D6574657273- + 42537 000083DD 5D0D0A + 42538 000083E0 0D0A db 0Dh,0Ah + 42539 MSG_1741: + 42540 000083E2 72 db 114 + 42541 000083E3 202062617463682D70- db ' batch-parameters Specifies any command-line information required by the',0Dh,0Ah + 42541 000083EC 6172616D6574657273- + 42541 000083F5 202020537065636966- + 42541 000083FE 69657320616E792063- + 42541 00008407 6F6D6D616E642D6C69- + 42541 00008410 6E6520696E666F726D- + 42541 00008419 6174696F6E20726571- + 42541 00008422 756972656420627920- + 42541 0000842B 7468650D0A + 42542 00008430 202020202020202020- db ' batch program.',0Dh,0Ah + 42542 00008439 202020202020202020- + 42542 00008442 202020626174636820- + 42542 0000844B 70726F6772616D2E0D- + 42542 00008454 0A + 42543 MSG_1760: + 42544 00008455 4C db 76 + 42545 00008456 5265636F7264732063- db 'Records comments (remarks) in a batch file or CONFIG.SYS.',0Dh,0Ah + 42545 0000845F 6F6D6D656E74732028- + 42545 00008468 72656D61726B732920- + 42545 00008471 696E20612062617463- + 42545 0000847A 682066696C65206F72- + 42545 00008483 20434F4E4649472E53- + 42545 0000848C 59532E0D0A + 42546 00008491 0D0A db 0Dh,0Ah + 42547 00008493 52454D205B636F6D6D- db 'REM [comment]',0Dh,0Ah + 42547 0000849C 656E745D0D0A + 42548 MSG_1780: + 42549 000084A2 6B db 107 + 42550 000084A3 53757370656E647320- db 'Suspends processing of a batch program and displays the message "' + 42550 000084AC 70726F63657373696E- + 42550 000084B5 67206F662061206261- + 42550 000084BE 7463682070726F6772- + 42550 000084C7 616D20616E64206469- + 42550 000084D0 73706C617973207468- + 42550 000084D9 65206D657373616765- + 42550 000084E2 2022 + 42551 000084E4 507265737320616E79- db 'Press any',0Dh,0Ah + 42551 000084ED 0D0A + 42552 000084EF 6B657920746F20636F- db 'key to continue...."',0Dh,0Ah + 42552 000084F8 6E74696E75652E2E2E- + 42552 00008501 2E220D0A + 42553 00008505 0D0A db 0Dh,0Ah + 42554 00008507 50415553450D0A db 'PAUSE',0Dh,0Ah + 42555 MSG_1800: + 42556 0000850E 4D db 77 + 42557 0000850F 446973706C61797320- db 'Displays messages, or turns command-echoing on or off.',0Dh,0Ah + 42557 00008518 6D657373616765732C- + 42557 00008521 206F72207475726E73- + 42557 0000852A 20636F6D6D616E642D- + 42557 00008533 6563686F696E67206F- + 42557 0000853C 6E206F72206F66662E- + 42557 00008545 0D0A + 42558 00008547 0D0A db 0Dh,0Ah + 42559 00008549 20204543484F205B4F- db ' ECHO [ON | OFF]',0Dh,0Ah + 42559 00008552 4E207C204F46465D0D- + 42559 0000855B 0A + 42560 MSG_1801: + 42561 0000855C 57 db 87 + 42562 0000855D 20204543484F205B6D- db ' ECHO [message]',0Dh,0Ah + 42562 00008566 6573736167655D0D0A + 42563 0000856F 0D0A db 0Dh,0Ah + 42564 00008571 54797065204543484F- db 'Type ECHO without parameters to display the current echo setting.' + 42564 0000857A 20776974686F757420- + 42564 00008583 706172616D65746572- + 42564 0000858C 7320746F2064697370- + 42564 00008595 6C6179207468652063- + 42564 0000859E 757272656E74206563- + 42564 000085A7 686F2073657474696E- + 42564 000085B0 672E + 42565 000085B2 0D0A db 0Dh,0Ah + 42566 MSG_1820: + 42567 000085B4 47 db 71 + 42568 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42569 %if 0 + 42570 db 'Directs MS-DOS to a labelled line in a batch program.',0Dh,0Ah + 42571 %else + 42572 000085B5 446972656374732050- db 'Directs PC DOS to a labelled line in a batch program.',0Dh,0Ah + 42572 000085BE 4320444F5320746F20- + 42572 000085C7 61206C6162656C6C65- + 42572 000085D0 64206C696E6520696E- + 42572 000085D9 206120626174636820- + 42572 000085E2 70726F6772616D2E0D- + 42572 000085EB 0A + 42573 %endif + 42574 000085EC 0D0A db 0Dh,0Ah + 42575 000085EE 474F544F206C616265- db 'GOTO label',0Dh,0Ah + 42575 000085F7 6C0D0A + 42576 000085FA 0D0A db 0Dh,0Ah + 42577 MSG_1821: + 42578 000085FC 8A db 138 + 42579 000085FD 20206C6162656C2020- db ' label Specifies a text string used in the batch program as a label.',0Dh,0Ah + 42579 00008606 205370656369666965- + 42579 0000860F 732061207465787420- + 42579 00008618 737472696E67207573- + 42579 00008621 656420696E20746865- + 42579 0000862A 206261746368207072- + 42579 00008633 6F6772616D20617320- + 42579 0000863C 61206C6162656C2E0D- + 42579 00008645 0A + 42580 00008646 0D0A db 0Dh,0Ah + 42581 00008648 596F75207479706520- db 'You type a label on a line by itself, beginning with a colon.',0Dh,0Ah + 42581 00008651 61206C6162656C206F- + 42581 0000865A 6E2061206C696E6520- + 42581 00008663 627920697473656C66- + 42581 0000866C 2C20626567696E6E69- + 42581 00008675 6E6720776974682061- + 42581 0000867E 20636F6C6F6E2E0D0A + 42582 MSG_1840: + 42583 00008687 4A db 74 + 42584 00008688 4368616E6765732074- db 'Changes the position of replaceable parameters in a batch file.',0Dh,0Ah + 42584 00008691 686520706F73697469- + 42584 0000869A 6F6E206F6620726570- + 42584 000086A3 6C61636561626C6520- + 42584 000086AC 706172616D65746572- + 42584 000086B5 7320696E2061206261- + 42584 000086BE 7463682066696C652E- + 42584 000086C7 0D0A + 42585 000086C9 0D0A db 0Dh,0Ah + 42586 000086CB 53484946540D0A db 'SHIFT',0Dh,0Ah + 42587 MSG_1860: + 42588 000086D2 5A db 90 + 42589 000086D3 506572666F726D7320- db 'Performs conditional processing in batch programs.',0Dh,0Ah + 42589 000086DC 636F6E646974696F6E- + 42589 000086E5 616C2070726F636573- + 42589 000086EE 73696E6720696E2062- + 42589 000086F7 617463682070726F67- + 42589 00008700 72616D732E0D0A + 42590 00008707 0D0A db 0Dh,0Ah + 42591 00008709 4946205B4E4F545D20- db 'IF [NOT] ERRORLEVEL number command',0Dh,0Ah + 42591 00008712 4552524F524C455645- + 42591 0000871B 4C206E756D62657220- + 42591 00008724 636F6D6D616E640D0A + 42592 MSG_1861: + 42593 0000872D 46 db 70 + 42594 0000872E 4946205B4E4F545D20- db 'IF [NOT] string1==string2 command',0Dh,0Ah + 42594 00008737 737472696E67313D3D- + 42594 00008740 737472696E67322063- + 42594 00008749 6F6D6D616E640D0A + 42595 00008751 4946205B4E4F545D20- db 'IF [NOT] EXIST filename command',0Dh,0Ah + 42595 0000875A 45584953542066696C- + 42595 00008763 656E616D6520636F6D- + 42595 0000876C 6D616E640D0A + 42596 00008772 0D0A db 0Dh,0Ah + 42597 MSG_1862: + 42598 00008774 7D db 125 + 42599 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42600 %if 0 + 42601 db ' NOT Specifies that MS-DOS should carry out the command only',0Dh,0Ah + 42602 %else + 42603 00008775 20204E4F5420202020- db ' NOT Specifies that PC DOS should carry out the command only',0Dh,0Ah + 42603 0000877E 202020202020202020- + 42603 00008787 202053706563696669- + 42603 00008790 657320746861742050- + 42603 00008799 4320444F532073686F- + 42603 000087A2 756C64206361727279- + 42603 000087AB 206F75742074686520- + 42603 000087B4 636F6D6D616E64206F- + 42603 000087BD 6E6C790D0A + 42604 %endif + 42605 000087C2 202020202020202020- db ' if the condition is false.',0Dh,0Ah + 42605 000087CB 202020202020202020- + 42605 000087D4 202069662074686520- + 42605 000087DD 636F6E646974696F6E- + 42605 000087E6 2069732066616C7365- + 42605 000087EF 2E0D0A + 42606 MSG_1863: + 42607 000087F2 A2 db 162 + 42608 000087F3 20204552524F524C45- db ' ERRORLEVEL number Specifies a true condition if the last program run returned',0Dh,0Ah + 42608 000087FC 56454C206E756D6265- + 42608 00008805 722053706563696669- + 42608 0000880E 657320612074727565- + 42608 00008817 20636F6E646974696F- + 42608 00008820 6E2069662074686520- + 42608 00008829 6C6173742070726F67- + 42608 00008832 72616D2072756E2072- + 42608 0000883B 657475726E65640D0A + 42609 00008844 202020202020202020- db ' ' + 42609 0000884D 202020202020202020- + 42609 00008856 2020 + 42610 00008858 616E20657869742063- db 'an exit code equal to or greater than the number specified.',0Dh,0Ah + 42610 00008861 6F646520657175616C- + 42610 0000886A 20746F206F72206772- + 42610 00008873 656174657220746861- + 42610 0000887C 6E20746865206E756D- + 42610 00008885 626572207370656369- + 42610 0000888E 666965642E0D0A + 42611 MSG_1864: + 42612 00008895 66 db 102 + 42613 00008896 2020636F6D6D616E64- db ' command Specifies the command to carry out if the condition is',0Dh,0Ah + 42613 0000889F 202020202020202020- + 42613 000088A8 202053706563696669- + 42613 000088B1 65732074686520636F- + 42613 000088BA 6D6D616E6420746F20- + 42613 000088C3 6361727279206F7574- + 42613 000088CC 206966207468652063- + 42613 000088D5 6F6E646974696F6E20- + 42613 000088DE 69730D0A + 42614 000088E2 202020202020202020- db ' met.',0Dh,0Ah + 42614 000088EB 202020202020202020- + 42614 000088F4 20206D65742E0D0A + 42615 MSG_1865: + 42616 000088FC 6A db 106 + 42617 000088FD 2020737472696E6731- db ' string1==string2 Specifies a true condition if the specified text strings',0Dh,0Ah + 42617 00008906 3D3D737472696E6732- + 42617 0000890F 202053706563696669- + 42617 00008918 657320612074727565- + 42617 00008921 20636F6E646974696F- + 42617 0000892A 6E2069662074686520- + 42617 00008933 737065636966696564- + 42617 0000893C 207465787420737472- + 42617 00008945 696E67730D0A + 42618 0000894B 202020202020202020- db ' match.',0Dh,0Ah + 42618 00008954 202020202020202020- + 42618 0000895D 20206D617463682E0D- + 42618 00008966 0A + 42619 MSG_1866: + 42620 00008967 67 db 103 + 42621 00008968 202045584953542066- db ' EXIST filename Specifies a true condition if the specified filename',0Dh,0Ah + 42621 00008971 696C656E616D652020- + 42621 0000897A 202053706563696669- + 42621 00008983 657320612074727565- + 42621 0000898C 20636F6E646974696F- + 42621 00008995 6E2069662074686520- + 42621 0000899E 737065636966696564- + 42621 000089A7 2066696C656E616D65- + 42621 000089B0 0D0A + 42622 000089B2 202020202020202020- db ' exists.',0Dh,0Ah + 42622 000089BB 202020202020202020- + 42622 000089C4 20206578697374732E- + 42622 000089CD 0D0A + 42623 MSG_1880: + 42624 000089CF 77 db 119 + 42625 000089D0 52756E732061207370- db 'Runs a specified command for each file in a set of files.',0Dh,0Ah + 42625 000089D9 656369666965642063- + 42625 000089E2 6F6D6D616E6420666F- + 42625 000089EB 722065616368206669- + 42625 000089F4 6C6520696E20612073- + 42625 000089FD 6574206F662066696C- + 42625 00008A06 65732E0D0A + 42626 00008A0B 0D0A db 0Dh,0Ah + 42627 00008A0D 464F52202576617269- db 'FOR %variable IN (set) DO command [command-parameters]',0Dh,0Ah + 42627 00008A16 61626C6520494E2028- + 42627 00008A1F 7365742920444F2063- + 42627 00008A28 6F6D6D616E64205B63- + 42627 00008A31 6F6D6D616E642D7061- + 42627 00008A3A 72616D65746572735D- + 42627 00008A43 0D0A + 42628 00008A45 0D0A db 0Dh,0Ah + 42629 MSG_1881: + 42630 00008A47 7D db 125 + 42631 00008A48 202025766172696162- db ' %variable Specifies a replaceable parameter.',0Dh,0Ah + 42631 00008A51 6C6520205370656369- + 42631 00008A5A 666965732061207265- + 42631 00008A63 706C61636561626C65- + 42631 00008A6C 20706172616D657465- + 42631 00008A75 722E0D0A + 42632 00008A79 202028736574292020- db ' (set) Specifies a set of one or more files. Wildcards may be used.',0Dh,0Ah + 42632 00008A82 202020205370656369- + 42632 00008A8B 666965732061207365- + 42632 00008A94 74206F66206F6E6520- + 42632 00008A9D 6F72206D6F72652066- + 42632 00008AA6 696C65732E20205769- + 42632 00008AAF 6C646361726473206D- + 42632 00008AB8 617920626520757365- + 42632 00008AC1 642E0D0A + 42633 MSG_1882: + 42634 00008AC5 56 db 86 + 42635 00008AC6 2020636F6D6D616E64- db ' command Specifies the command to carry out for each file.',0Dh,0Ah + 42635 00008ACF 202020205370656369- + 42635 00008AD8 666965732074686520- + 42635 00008AE1 636F6D6D616E642074- + 42635 00008AEA 6F206361727279206F- + 42635 00008AF3 757420666F72206561- + 42635 00008AFC 63682066696C652E0D- + 42635 00008B05 0A + 42636 00008B06 2020636F6D6D616E64- db ' command-parameters',0Dh,0Ah + 42636 00008B0F 2D706172616D657465- + 42636 00008B18 72730D0A + 42637 MSG_1883: + 42638 00008B1C A2 db 162 + 42639 00008B1D 202020202020202020- db ' Specifies parameters or switches for the specified command.',0Dh,0Ah + 42639 00008B26 202020205370656369- + 42639 00008B2F 666965732070617261- + 42639 00008B38 6D6574657273206F72- + 42639 00008B41 207377697463686573- + 42639 00008B4A 20666F722074686520- + 42639 00008B53 737065636966696564- + 42639 00008B5C 20636F6D6D616E642E- + 42639 00008B65 0D0A + 42640 00008B67 0D0A db 0Dh,0Ah + 42641 00008B69 546F20757365207468- db 'To use the FOR command in a batch program, specify %%variable instead of',0Dh,0Ah + 42641 00008B72 6520464F5220636F6D- + 42641 00008B7B 6D616E6420696E2061- + 42641 00008B84 206261746368207072- + 42641 00008B8D 6F6772616D2C207370- + 42641 00008B96 656369667920252576- + 42641 00008B9F 61726961626C652069- + 42641 00008BA8 6E7374656164206F66- + 42641 00008BB1 0D0A + 42642 00008BB3 257661726961626C65- db '%variable.',0Dh,0Ah + 42642 00008BBC 2E0D0A + 42643 MSG_1900: + 42644 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42645 %if 0 + 42646 ; MSDOS 6.22 COMMAND.COM + 42647 db 23 + 42648 db 'Reserved command name',0Dh,0Ah + 42649 %else + 42650 ; PCDOS 7.1 COMMAND.COM + 42651 00008BBF 48 db 72 + 42652 00008BC0 52657475726E732061- db 'Returns a fully qualified filename.',0Dh,0Ah + 42652 00008BC9 2066756C6C79207175- + 42652 00008BD2 616C69666965642066- + 42652 00008BDB 696C656E616D652E0D- + 42652 00008BE4 0A + 42653 00008BE5 0D0A db 0Dh,0Ah + 42654 00008BE7 545255454E414D4520- db 'TRUENAME [drive:][path]filename',0Dh,0Ah + 42654 00008BF0 5B64726976653A5D5B- + 42654 00008BF9 706174685D66696C65- + 42654 00008C02 6E616D650D0A + 42655 %endif + 42656 MSG_1920: + 42657 00008C08 2F db 47 + 42658 00008C09 4C6F61647320612070- db 'Loads a program into the upper memory area.',0Dh,0Ah + 42658 00008C12 726F6772616D20696E- + 42658 00008C1B 746F20746865207570- + 42658 00008C24 706572206D656D6F72- + 42658 00008C2D 7920617265612E0D0A + 42659 00008C36 0D0A db 0Dh,0Ah + 42660 MSG_1921: + 42661 ;db 88 + 42662 ;db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah + 42663 ;db 'LH [drive:][path]filename [parameters]',0Dh,0Ah + 42664 ;db 0Dh,0Ah + 42665 + 42666 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42667 %if 0 + 42668 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42669 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9303h + 42670 db 157 + 42671 db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah + 42672 db 'LOADHIGH [/L:region1[,minsize1][;region2[,minsize2]...] [/S]]',0Dh,0Ah + 42673 db ' [drive:][path]filename [parameters]',0Dh,0Ah + 42674 db 0Dh,0Ah + 42675 %else + 42676 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42677 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:90EBh + 42678 00008C38 98 db 152 + 42679 00008C39 4C4F41444849474820- db 'LOADHIGH [drive:][path]filename [parameters]',0Dh,0Ah + 42679 00008C42 5B64726976653A5D5B- + 42679 00008C4B 706174685D66696C65- + 42679 00008C54 6E616D65205B706172- + 42679 00008C5D 616D65746572735D0D- + 42679 00008C66 0A + 42680 00008C67 4C4F41444849474820- db 'LOADHIGH [/L:region1[,minsize1][;region2[,minsize2]...]]',0Dh,0Ah + 42680 00008C70 5B2F4C3A726567696F- + 42680 00008C79 6E315B2C6D696E7369- + 42680 00008C82 7A65315D5B3B726567- + 42680 00008C8B 696F6E325B2C6D696E- + 42680 00008C94 73697A65325D2E2E2E- + 42680 00008C9D 5D5D0D0A + 42681 00008CA1 202020202020202020- db ' [drive:][path]filename [parameters]',0Dh,0Ah + 42681 00008CAA 5B64726976653A5D5B- + 42681 00008CB3 706174685D66696C65- + 42681 00008CBC 6E616D65205B706172- + 42681 00008CC5 616D65746572735D0D- + 42681 00008CCE 0A + 42682 00008CCF 0D0A db 0Dh,0Ah + 42683 %endif + 42684 ; (MSDOS 5.0 COMMAND.COM - TRANGROUP:8111h) + 42685 ;MSG_1922: ; MSDOS 5.0 COMMAND.COM + 42686 ;db 113 + 42687 ;db ' parameters Specifies any command-line information required by the',0Dh,0Ah + 42688 ;db ' program you want to load.',0Dh,0Ah + 42689 + 42690 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42691 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:93A1h + 42692 MSG_1922: + 42693 00008CD1 B6 db 182 + 42694 00008CD2 2F4C3A726567696F6E- db '/L:region1[,minsize1][;region2[,minsize2]]...',0Dh,0Ah + 42694 00008CDB 315B2C6D696E73697A- + 42694 00008CE4 65315D5B3B72656769- + 42694 00008CED 6F6E325B2C6D696E73- + 42694 00008CF6 697A65325D5D2E2E2E- + 42694 00008CFF 0D0A + 42695 00008D01 202020202020202020- db ' Specifies the region(s) of memory into which to load',0Dh,0Ah + 42695 00008D0A 202020537065636966- + 42695 00008D13 696573207468652072- + 42695 00008D1C 6567696F6E28732920- + 42695 00008D25 6F66206D656D6F7279- + 42695 00008D2E 20696E746F20776869- + 42695 00008D37 636820746F206C6F61- + 42695 00008D40 640D0A + 42696 00008D43 202020202020202020- db ' the program. Region1 specifies the number of the first',0Dh,0Ah + 42696 00008D4C 202020746865207072- + 42696 00008D55 6F6772616D2E202052- + 42696 00008D5E 6567696F6E31207370- + 42696 00008D67 656369666965732074- + 42696 00008D70 6865206E756D626572- + 42696 00008D79 206F66207468652066- + 42696 00008D82 697273740D0A + 42697 MSG_1923: + 42698 00008D88 85 db 133 + 42699 00008D89 202020202020202020- db ' memory region; minsize1 specifies the minimum size, if',0Dh,0Ah + 42699 00008D92 2020206D656D6F7279- + 42699 00008D9B 20726567696F6E3B20- + 42699 00008DA4 6D696E73697A653120- + 42699 00008DAD 737065636966696573- + 42699 00008DB6 20746865206D696E69- + 42699 00008DBF 6D756D2073697A652C- + 42699 00008DC8 2069660D0A + 42700 00008DCD 202020202020202020- db ' any, for region1. Region2 and minsize2 specify the',0Dh + 42700 00008DD6 202020616E792C2066- + 42700 00008DDF 6F7220726567696F6E- + 42700 00008DE8 312E2020526567696F- + 42700 00008DF1 6E3220616E64206D69- + 42700 00008DFA 6E73697A6532207370- + 42700 00008E03 656369667920746865- + 42700 00008E0C 0D + 42701 00008E0D 0A db 0Ah + 42702 MSG_1924: + 42703 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42704 %if 0 + 42705 db 127 + 42706 db ' number and minimum size of the second region, if any.',0Dh,0Ah + 42707 db ' You can specify as many regions as you want.',0Dh,0Ah + 42708 db 0Dh,0Ah + 42709 MSG_1925: + 42710 db 131 + 42711 db '/S Shrinks a UMB to its minimum size while the program',0Dh,0Ah + 42712 db ' is loading. /S is normally used only by MemMaker.',0Dh,0Ah + 42713 db 0Dh,0Ah + 42714 %else + 42715 00008E0E 7B db 123 + 42716 00008E0F 202020202020202020- db ' number and minimum size of the second region, if any.',0Dh,0Ah + 42716 00008E18 2020206E756D626572- + 42716 00008E21 20616E64206D696E69- + 42716 00008E2A 6D756D2073697A6520- + 42716 00008E33 6F6620746865207365- + 42716 00008E3C 636F6E642072656769- + 42716 00008E45 6F6E2C20696620616E- + 42716 00008E4E 792E0D0A + 42717 00008E52 202020202020202020- db ' You can specify as many regions as you want.' + 42717 00008E5B 202020596F75206361- + 42717 00008E64 6E2073706563696679- + 42717 00008E6D 206173206D616E7920- + 42717 00008E76 726567696F6E732061- + 42717 00008E7F 7320796F752077616E- + 42717 00008E88 742E + 42718 MSG_1925: + 42719 00008E8A 02 db 2 + 42720 00008E8B 0D0A db 0Dh,0Ah + 42721 %endif + 42722 MSG_1926: + 42723 00008E8D 57 db 87 + 42724 00008E8E 5B64726976653A5D5B- db '[drive:][path]filename',0Dh,0Ah + 42724 00008E97 706174685D66696C65- + 42724 00008EA0 6E616D650D0A + 42725 00008EA6 202020202020202020- db ' Specifies the location and name of the program.',0Dh,0Ah + 42725 00008EAF 202020537065636966- + 42725 00008EB8 69657320746865206C- + 42725 00008EC1 6F636174696F6E2061- + 42725 00008ECA 6E64206E616D65206F- + 42725 00008ED3 66207468652070726F- + 42725 00008EDC 6772616D2E0D0A + 42726 00008EE3 0D0A db 0Dh,0Ah 42727 42728 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42729 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9398h - 42730 MSG_1927: - 42731 00008EE5 5A db 90 - 42732 00008EE6 706172616D65746572- db 'parameters Specifies any command-line information required by',0Dh,0Ah - 42732 00008EEF 732020537065636966- - 42732 00008EF8 69657320616E792063- - 42732 00008F01 6F6D6D616E642D6C69- - 42732 00008F0A 6E6520696E666F726D- - 42732 00008F13 6174696F6E20726571- - 42732 00008F1C 75697265642062790D- - 42732 00008F25 0A - 42733 00008F26 202020202020202020- db ' the program.',0Dh,0Ah - 42733 00008F2F 202020746865207072- - 42733 00008F38 6F6772616D2E0D0A - 42734 - 42735 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM - 42736 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:96F3h - 42737 MSG_1107: - 42738 00008F40 0C db 12 - 42739 00008F41 2531204B2062797465- db '%1 K bytes',0Dh,0Ah - 42739 00008F4A 730D0A - 42740 - 42741 ; --------------------------------------------------------------------------- - 42742 - 42743 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42744 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8183h + 42729 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:963Ah + 42730 + 42731 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42732 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9398h + 42733 MSG_1927: + 42734 00008EE5 5A db 90 + 42735 00008EE6 706172616D65746572- db 'parameters Specifies any command-line information required by',0Dh,0Ah + 42735 00008EEF 732020537065636966- + 42735 00008EF8 69657320616E792063- + 42735 00008F01 6F6D6D616E642D6C69- + 42735 00008F0A 6E6520696E666F726D- + 42735 00008F13 6174696F6E20726571- + 42735 00008F1C 75697265642062790D- + 42735 00008F25 0A + 42736 00008F26 202020202020202020- db ' the program.',0Dh,0Ah + 42736 00008F2F 202020746865207072- + 42736 00008F38 6F6772616D2E0D0A + 42737 + 42738 ; 02/08/2024 - Retro DOS v5.0 COMMAND.COM + 42739 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:96F3h + 42740 MSG_1107: + 42741 00008F40 0C db 12 + 42742 00008F41 2531204B2062797465- db '%1 K bytes',0Dh,0Ah + 42742 00008F4A 730D0A + 42743 + 42744 ; --------------------------------------------------------------------------- 42745 - 42746 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42747 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9695h + 42746 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42747 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8183h 42748 - 42749 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42750 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9400h + 42749 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42750 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9695h 42751 - 42752 ; --------------- S U B R O U T I N E --------------------------------------- - 42753 - 42754 $M_CLS_3: - 42755 00008F4D 0E push cs ; CLASS_F - 42756 00008F4E 07 pop es - 42757 00008F4F 8D3E[FA62] lea di,$M_CLASS_3_STRUC ; LEA DI,$M_CLASS_3_STRUC - 42758 ; 15/04/2023 - 42759 ;add cx,10053 ; ADD CX,$-$M_CLASS_3_STRUC ; 8189h-5A44h - 42760 ; 17/06/2023 - 42761 ;add cx,11627 ; ADD CX,$-$M_CLASS_3_STRUC ; 969Bh-6930h - 42762 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42763 ;add cx,11353 ; ADD CX,$-$M_CLASS_3_STRUC ; 9406h-67ADh - 42764 00008F53 81C1592C add cx,$-$M_CLASS_3_STRUC - 42765 00008F57 C3 retn - 42766 - 42767 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42768 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:818Eh + 42752 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42753 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9400h + 42754 + 42755 ; --------------- S U B R O U T I N E --------------------------------------- + 42756 + 42757 $M_CLS_3: + 42758 00008F4D 0E push cs ; CLASS_F + 42759 00008F4E 07 pop es + 42760 00008F4F 8D3E[FA62] lea di,$M_CLASS_3_STRUC ; LEA DI,$M_CLASS_3_STRUC + 42761 ; 15/04/2023 + 42762 ;add cx,10053 ; ADD CX,$-$M_CLASS_3_STRUC ; 8189h-5A44h + 42763 ; 17/06/2023 + 42764 ;add cx,11627 ; ADD CX,$-$M_CLASS_3_STRUC ; 969Bh-6930h + 42765 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42766 ;add cx,11353 ; ADD CX,$-$M_CLASS_3_STRUC ; 9406h-67ADh + 42767 00008F53 81C1592C add cx,$-$M_CLASS_3_STRUC + 42768 00008F57 C3 retn 42769 - 42770 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42771 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:96A0h + 42770 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42771 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:818Eh 42772 - 42773 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42774 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:940Bh + 42773 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42774 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:96A0h 42775 - 42776 ; --------------------------------------------------------------------------- - 42777 ; Class 1 messages - 42778 ; --------------------------------------------------------------------------- - 42779 - 42780 $M_CLASS_1_STRUC: - 42781 00008F58 01 db 1 ; $M_CLASS_ID - 42782 ;dw 5 ; EXPECTED_VERSION (COMMAND.COM version) - 42783 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42784 ;dw 1606h ; MSDOS 6.22 COMMAND.COM - 42785 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 42786 00008F59 070A dw 0A07h ; PCDOS 7.10 COMMAND.COM - 42787 00008F5B 04 db 4 ; Class_1_MessageCount - 42788 $M_ID_1_1: - 42789 00008F5C 0200 dw 2 ; Message Number = 2 - 42790 00008F5E 1000 dw EXTEND2-$+2 ; 10h ; Message offset from message number - 42791 $M_ID_1_2: - 42792 00008F60 0300 dw 3 ; Message Number = 3 - 42793 00008F62 1B00 dw EXTEND3-$+2 ; 1Bh ; Message offset from message number - 42794 $M_ID_1_3: - 42795 00008F64 0800 dw 8 ; Message Number = 8 - 42796 00008F66 2600 dw EXTEND8-$+2 ; 26h ; Message offset from message number - 42797 $M_ID_1_4: - 42798 00008F68 FFFF dw 0FFFFh ; Message Number = -1 - 42799 00008F6A 3600 dw EXTEND999-$+2 ; 36h ; Message offset from message number - 42800 - 42801 ; --------------------------------------------------------------------------- - 42802 - 42803 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81A2h - 42804 EXTEND2: - 42805 00008F6C 0E db 14 - 42806 00008F6D 46696C65206E6F7420- db 'File not found' - 42806 00008F76 666F756E64 - 42807 EXTEND3: - 42808 00008F7B 0E db 14 - 42809 00008F7C 50617468206E6F7420- db 'Path not found' - 42809 00008F85 666F756E64 - 42810 EXTEND8: - 42811 00008F8A 13 db 19 - 42812 00008F8B 496E73756666696369- db 'Insufficient memory' - 42812 00008F94 656E74206D656D6F72- - 42812 00008F9D 79 - 42813 EXTEND999: - 42814 00008F9E 11 db 17 - 42815 00008F9F 457874656E64656420- db 'Extended Error %1' - 42815 00008FA8 4572726F72202531 - 42816 - 42817 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42818 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81E6h + 42776 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42777 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:940Bh + 42778 + 42779 ; --------------------------------------------------------------------------- + 42780 ; Class 1 messages + 42781 ; --------------------------------------------------------------------------- + 42782 + 42783 $M_CLASS_1_STRUC: + 42784 00008F58 01 db 1 ; $M_CLASS_ID + 42785 ;dw 5 ; EXPECTED_VERSION (COMMAND.COM version) + 42786 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42787 ;dw 1606h ; MSDOS 6.22 COMMAND.COM + 42788 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 42789 00008F59 070A dw 0A07h ; PCDOS 7.10 COMMAND.COM + 42790 00008F5B 04 db 4 ; Class_1_MessageCount + 42791 $M_ID_1_1: + 42792 00008F5C 0200 dw 2 ; Message Number = 2 + 42793 00008F5E 1000 dw EXTEND2-$+2 ; 10h ; Message offset from message number + 42794 $M_ID_1_2: + 42795 00008F60 0300 dw 3 ; Message Number = 3 + 42796 00008F62 1B00 dw EXTEND3-$+2 ; 1Bh ; Message offset from message number + 42797 $M_ID_1_3: + 42798 00008F64 0800 dw 8 ; Message Number = 8 + 42799 00008F66 2600 dw EXTEND8-$+2 ; 26h ; Message offset from message number + 42800 $M_ID_1_4: + 42801 00008F68 FFFF dw 0FFFFh ; Message Number = -1 + 42802 00008F6A 3600 dw EXTEND999-$+2 ; 36h ; Message offset from message number + 42803 + 42804 ; --------------------------------------------------------------------------- + 42805 + 42806 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81A2h + 42807 EXTEND2: + 42808 00008F6C 0E db 14 + 42809 00008F6D 46696C65206E6F7420- db 'File not found' + 42809 00008F76 666F756E64 + 42810 EXTEND3: + 42811 00008F7B 0E db 14 + 42812 00008F7C 50617468206E6F7420- db 'Path not found' + 42812 00008F85 666F756E64 + 42813 EXTEND8: + 42814 00008F8A 13 db 19 + 42815 00008F8B 496E73756666696369- db 'Insufficient memory' + 42815 00008F94 656E74206D656D6F72- + 42815 00008F9D 79 + 42816 EXTEND999: + 42817 00008F9E 11 db 17 + 42818 00008F9F 457874656E64656420- db 'Extended Error %1' + 42818 00008FA8 4572726F72202531 42819 - 42820 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42821 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:96F8h + 42820 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42821 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81E6h 42822 - 42823 ; --------------- S U B R O U T I N E --------------------------------------- - 42824 $M_MSGSERV_1: - 42825 00008FB0 0E push cs - 42826 00008FB1 07 pop es - 42827 00008FB2 8D3E[588F] lea di,$M_CLASS_1_STRUC - 42828 ; 15/04/2023 - 42829 ;add cx,94 ; $-$M_CLASS_1_STRUC ; 81ECh-818Eh - 42830 ; 17/06/2023 MSDOS 6.22 COMMAND.COM - 42831 ; 96FEh-96A0h = 5Eh = 94 - 42832 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42833 ;add cx,94 ; Retro DOS v5.0 COMMAND.COM - 42834 00008FB6 C3 retn - 42835 - 42836 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42837 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81F0h + 42823 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42824 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:96F8h + 42825 + 42826 ; --------------- S U B R O U T I N E --------------------------------------- + 42827 $M_MSGSERV_1: + 42828 00008FB0 0E push cs + 42829 00008FB1 07 pop es + 42830 00008FB2 8D3E[588F] lea di,$M_CLASS_1_STRUC + 42831 ; 15/04/2023 + 42832 ;add cx,94 ; $-$M_CLASS_1_STRUC ; 81ECh-818Eh + 42833 ; 17/06/2023 MSDOS 6.22 COMMAND.COM + 42834 ; 96FEh-96A0h = 5Eh = 94 + 42835 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42836 ;add cx,94 ; Retro DOS v5.0 COMMAND.COM + 42837 00008FB6 C3 retn 42838 - 42839 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42840 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9702h + 42839 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42840 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81F0h 42841 - 42842 ; --------------------------------------------------------------------------- - 42843 ; Class 2 messages - 42844 ; --------------------------------------------------------------------------- - 42845 - 42846 $M_CLASS_2_STRUC: - 42847 00008FB7 02 db 2 ; $M_CLASS_ID - 42848 ;dw 5 ; EXPECTED_VERSION (COMMAND.COM version) - 42849 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42850 ;dw 1606h ; MSDOS 6.22 COMMAND.COM - 42851 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM - 42852 00008FB8 070A dw 0A07h ; PCDOS 7.10 COMMAND.COM - 42853 00008FBA 01 db 1 ; Class_2_MessageCount - 42854 $M_ID_2_1: - 42855 00008FBB FFFF dw 0FFFFh ; Message Number = -1 - 42856 00008FBD 0400 dw PARSE999-$+2 ; 4 ; Message offset from message number - 42857 ; --------------------------------------------------------------------------- - 42858 - 42859 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81F8h - 42860 PARSE999: - 42861 00008FBF 0E db 14 - 42862 00008FC0 506172736520457272- db 'Parse Error %1' - 42862 00008FC9 6F72202531 - 42863 - 42864 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42865 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8207h + 42842 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42843 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9702h + 42844 + 42845 ; --------------------------------------------------------------------------- + 42846 ; Class 2 messages + 42847 ; --------------------------------------------------------------------------- + 42848 + 42849 $M_CLASS_2_STRUC: + 42850 00008FB7 02 db 2 ; $M_CLASS_ID + 42851 ;dw 5 ; EXPECTED_VERSION (COMMAND.COM version) + 42852 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42853 ;dw 1606h ; MSDOS 6.22 COMMAND.COM + 42854 ; 21/07/2024 - Retro DOS v5.0 COMMAND.COM + 42855 00008FB8 070A dw 0A07h ; PCDOS 7.10 COMMAND.COM + 42856 00008FBA 01 db 1 ; Class_2_MessageCount + 42857 $M_ID_2_1: + 42858 00008FBB FFFF dw 0FFFFh ; Message Number = -1 + 42859 00008FBD 0400 dw PARSE999-$+2 ; 4 ; Message offset from message number + 42860 ; --------------------------------------------------------------------------- + 42861 + 42862 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:81F8h + 42863 PARSE999: + 42864 00008FBF 0E db 14 + 42865 00008FC0 506172736520457272- db 'Parse Error %1' + 42865 00008FC9 6F72202531 42866 - 42867 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42868 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9719h + 42867 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42868 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8207h 42869 - 42870 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42871 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9484h + 42870 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42871 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9719h 42872 - 42873 ; --------------- S U B R O U T I N E --------------------------------------- - 42874 $M_MSGSERV_2: - 42875 00008FCE 0E push cs - 42876 00008FCF 07 pop es - 42877 00008FD0 8D3E[B78F] lea di,$M_CLASS_2_STRUC - 42878 ; 15/04/2023 - 42879 ;add cx,29 ; $-$M_CLASS_2_STRUC ; 820Dh-81F0h - 42880 ; 17/06/2023 MSDOS 6.22 COMMAND.COM - 42881 ; 971Fh-9702h = 1Dh = 29 - 42882 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 42883 ;add cx,29 ; Retro DOS v5.0 COMMAND.COM - 42884 00008FD4 C3 retn - 42885 - 42886 ;============================================================================ - 42887 ; TRANMSG.ASM, MSDOS 6.0, 1991 - 42888 ;============================================================================ - 42889 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 42890 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM - 42891 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM - 42892 - 42893 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8211h - 42894 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9723h - 42895 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:948Eh - 42896 - 42897 ;**************************************************** - 42898 ;* TRANSIENT MESSAGE POINTERS & SUBSTITUTION BLOCKS * - 42899 ;**************************************************** - 42900 - 42901 msg_disp_class: - 42902 00008FD5 FF db util_msg_class ; 0FFh - 42903 msg_cont_flag: - 42904 00008FD6 00 db no_cont_flag ; 0 - 42905 - 42906 ; extended error string output - 42907 extend_buf_ptr: - 42908 00008FD7 0000 dw 0 ;AN000;set to no message - 42909 extend_buf_sub: - 42910 00008FD9 00 db 0 ;AN000;set to no substitutions - 42911 00008FDA 0B db parm_block_size ; 11 ;AN000;size of sublist - 42912 00008FDB 00 db 0 ;AN000;reserved - 42913 extend_buf_off: - 42914 00008FDC [A09D] dw string_ptr_2 ;AN000;offset of arg - 42915 extend_buf_seg: - 42916 00008FDE 0000 dw 0 ;AN000;segment of arg - 42917 00008FE0 00 db 0 ;AN000;first subst - 42918 00008FE1 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 42919 00008FE2 80 db 128 ;AN000;maximum width - 42920 00008FE3 00 db 0 ;AN000;minimum width - 42921 00008FE4 20 db blank ; 20h ;AN000;pad character - 42922 - 42923 ; "Duplicate file name or file not found" - 42924 RENERR_PTR: - 42925 00008FE5 EA03 dw 1002 ;AN000;message number - 42926 00008FE7 00 db no_subst ; 0 ;AN000;number of subst - 42927 - 42928 ; "Invalid path or file name" - 42929 BADCPMES_PTR: - 42930 00008FE8 EB03 dw 1003 ;AN000;message number - 42931 00008FEA 00 db no_subst ; 0 ;AN000;number of subst - 42932 - 42933 ; "Insufficient disk space" - 42934 NOSPACE_PTR: - 42935 00008FEB EC03 dw 1004 ;AN000;message number - 42936 00008FED 00 db no_subst ; 0 ;AN000;number of subst - 42937 - 42938 ; "Out of environment space" - 42939 ENVERR_PTR: - 42940 00008FEE EF03 dw 1007 ;AN000;message number - 42941 00008FF0 00 db no_subst ; 0 ;AN000;number of subst - 42942 - 42943 ; "File creation error" - 42944 FULLDIR_PTR: - 42945 00008FF1 F003 dw 1008 ;AN000;message number - 42946 00008FF3 00 db no_subst ; 0 ;AN000;number of subst - 42947 - 42948 ; "Batch file missing",13,10 - 42949 BADBAT_PTR: - 42950 00008FF4 F103 dw 1009 ;AN000;message number - 42951 00008FF6 00 db no_subst ; 0 ;AN000;number of subst - 42952 - 42953 ; "Insert disk with batch file",13,10 - 42954 NEEDBAT_PTR: - 42955 00008FF7 F203 dw 1010 ;AN000;message number - 42956 00008FF9 00 db no_subst ; 0 ;AN000;number of subst - 42957 - 42958 ; "Bad command or file name",13,10 - 42959 BADNAM_PTR: - 42960 00008FFA F303 dw 1011 ;AN000;message number - 42961 00008FFC 00 db no_subst ; 0 ;AN000;number of subst - 42962 - 42963 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM - 42964 %if 1 - 42965 ; "REXX interpreter not found",13,10 - 42966 REXXNOTF_PTR: - 42967 00008FFD F403 dw 1012 - 42968 00008FFF 00 db no_subst ; 0 - 42969 %endif - 42970 - 42971 ; "Access denied",13,10 - 42972 ACCDEN_PTR: - 42973 00009000 F603 dw 1014 ;AN000;message number - 42974 00009002 00 db no_subst ; 0 ;AN000;number of subst - 42975 - 42976 ; "File cannot be copied onto itself",13,10 - 42977 OVERWR_PTR: - 42978 00009003 F703 dw 1015 ;AN000;message number - 42979 00009005 00 db no_subst ; 0 ;AN000;number of subst - 42980 - 42981 ; "Content of destination lost before copy",13,10 - 42982 LOSTERR_PTR: - 42983 00009006 F803 dw 1016 ;AN000;message number - 42984 00009008 00 db no_subst ; 0 ;AN000;number of subst - 42985 - 42986 ; "Invalid filename or file not found",13,10 - 42987 INORNOT_PTR: - 42988 00009009 F903 dw 1017 ;AN000;message number - 42989 0000900B 00 db no_subst ;AN000;number of subst - 42990 - 42991 ; "%1 File(s) copied",13,10 - 42992 copied_ptr: - 42993 0000900C FA03 dw 1018 ;AN000;message number - 42994 0000900E 01 db 1 ;AN000;number of subst - 42995 0000900F 0B db parm_block_size ; 11 ;AN000;size of sublist - 42996 00009010 00 db 0 ;AN000;reserved - 42997 00009011 [A29D] dw Copy_num ;AN000;offset of arg - 42998 00009013 0000 dw 0 ;AN000;segment of arg - 42999 00009015 01 db 1 ;AN000;first subst - 43000 00009016 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43001 ;AN000;binary to decimal - 43002 00009017 09 db 9 ;AN000;maximum width - 43003 00009018 09 db 9 ;AN000;minimum width - 43004 00009019 20 db blank ; 20h ;AN000;pad character - 43005 - 43006 ; "%1 File(s) " - 43007 dirmes_ptr: - 43008 0000901A FB03 dw 1019 ;AN000;message number - 43009 0000901C 01 db 1 ;AN000;number of subst - 43010 0000901D 0B db parm_block_size ; 11 ;AN000;size of sublist - 43011 0000901E 00 db 0 ;AN000;reserved - 43012 0000901F [A59D] dw Dir_Num ;AN000;offset of arg - 43013 00009021 0000 dw 0 ;AN000;segment of arg - 43014 00009023 01 db 1 ;AN000;first subst - 43015 ; MSDOS 5.0 COMMAND.COM - 43016 ;db 0A1h ; Right_Align+Unsgn_Bin_Word - 43017 ; 17/06/2023 - 43018 ;screen_f_3: - 43019 00009024 E1 db 0E1h ; MSDOS 6.22 COMMAND.COM - 43020 ;AN000;binary to decimal - 43021 00009025 09 db 9 ;AN000;maximum width - 43022 00009026 09 db 9 ;AN000;minimum width - 43023 00009027 20 db blank ; 20h ;AN000;pad character - 43024 - 43025 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 43026 %if 0 - 43027 ; "%1 bytes free",13,10 - 43028 bytmes_ptr: - 43029 dw 1020 ;AN000;message number - 43030 db 1 ;AN000;number of subst - 43031 db parm_block_size ; 11 ;AN000;size of sublist - 43032 db 0 ;AN000;reserved - 43033 dw Bytes_Free ;AN000;offset of arg - 43034 dw 0 ;AN000;segment of arg - 43035 db 1 ;AN000;first subst - 43036 ; MSDOS 5.0 COMMAND.COM - 43037 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43038 ; 17/06/2023 - 43039 screen_f_6: - 43040 db 0F1h ;AN000;long binary to decimal - 43041 ; MSDOS 5.0 COMMAND.COM - 43042 ;db 28 ;AN000;maximum width - 43043 ;db 28 ;AN000;minimum width - 43044 ; 17/06/2023 - 43045 screen_f_7: - 43046 db 32 ; MSDOS 6.22 COMMAND.COM - 43047 db 32 - 43048 - 43049 db blank ; 20h ;AN000;pad character - 43050 %else - 43051 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 43052 ; PCDOS 7.1 COMMAND.COM - 43053 dirmes_w_ptr: - 43054 00009028 FB03 dw 1019 - 43055 0000902A 01 db 1 - 43056 0000902B 0B db 11 - 43057 0000902C 00 db 0 - 43058 0000902D [A59D] dw Dir_Num - 43059 0000902F 0000 dw 0 - 43060 00009031 01 db 1 - 43061 00009032 F1 db 0F1h ; long binary to decimal - 43062 00009033 0A db 10 - 43063 00009034 0A db 10 - 43064 00009035 20 db 20h - 43065 dirmes2_ptr: - 43066 00009036 FB03 dw 1019 - 43067 00009038 01 db 1 - 43068 00009039 0B db 11 - 43069 0000903A 00 db 0 - 43070 0000903B [A59D] dw Dir_Num - 43071 0000903D 0000 dw 0 - 43072 0000903F 01 db 1 - 43073 00009040 B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43074 00009041 09 db 9 - 43075 00009042 09 db 9 - 43076 00009043 20 db 20h - 43077 bytmes1_ptr: - 43078 00009044 FC03 dw 1020 - 43079 00009046 01 db 1 - 43080 00009047 0B db 11 - 43081 00009048 00 db 0 - 43082 00009049 [A99D] dw Bytes_Free - 43083 0000904B 0000 dw 0 - 43084 0000904D 01 db 1 - 43085 0000904E F1 db 0F1h ; long binary to decimal - 43086 0000904F 1E db 30 ; maximum width - 43087 00009050 1E db 30 ; minimum width - 43088 00009051 20 db 20h ; blank - 43089 bytmes2_ptr: - 43090 00009052 FC03 dw 1020 - 43091 00009054 01 db 1 - 43092 00009055 0B db 11 - 43093 00009056 00 db 0 - 43094 00009057 [A99D] dw Bytes_Free - 43095 00009059 0000 dw 0 - 43096 0000905B 01 db 1 - 43097 0000905C F1 db 0F1h ; long binary to decimal - 43098 0000905D 21 db 33 ; maximum width - 43099 0000905E 21 db 33 ; minimum width - 43100 0000905F 20 db 20h ; pad - 43101 bytmes_n_ptr: - 43102 00009060 FC03 dw 1020 - 43103 00009062 01 db 1 - 43104 00009063 0B db 11 ; parm_block_size - 43105 00009064 00 db 0 - 43106 00009065 [A99D] dw Bytes_Free - 43107 00009067 0000 dw 0 - 43108 00009069 01 db 1 - 43109 0000906A B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43110 0000906B 1C db 28 - 43111 0000906C 1C db 28 - 43112 0000906D 20 db 20h - 43113 %endif - 43114 - 43115 ; "Invalid drive specification",13,10 - 43116 baddrv_ptr: - 43117 0000906E FD03 dw 1021 ;AN000;message number - 43118 00009070 00 db no_subst ; 0 ;AN000;number of subst - 43119 - 43120 ; "Code page %1 not prepared for system",13,10 - 43121 cp_not_set_ptr: - 43122 00009071 FE03 dw 1022 ;AN000;message number - 43123 00009073 01 db 1 ;AN000;number of subst - 43124 00009074 0B db parm_block_size ; 11 ;AN000;size of sublist - 43125 00009075 00 db 0 ;AN000;reserved - 43126 00009076 [9A9D] dw system_cpage ;AN000;offset of arg - 43127 00009078 0000 dw 0 ;AN000;segment of arg - 43128 0000907A 01 db 1 ;AN000;first subst - 43129 0000907B A1 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43130 ;AN000;binary to decimal - 43131 0000907C 05 db 5 ;AN000;maximum width - 43132 0000907D 01 db 1 ;AN000;minimum width - 43133 0000907E 20 db blank ; 20h ;AN000;pad character - 43134 - 43135 ; "Code page %1 not prepared for all devices",13,10 - 43136 cp_not_all_ptr: - 43137 0000907F FF03 dw 1023 ;AN000;message number - 43138 00009081 01 db 1 ;AN000;number of subst - 43139 00009082 0B db parm_block_size ; 11 ;AN000;size of sublist - 43140 00009083 00 db 0 ;AN000;reserved - 43141 00009084 [9A9D] dw system_cpage ;AN000;offset of arg - 43142 00009086 0000 dw 0 ;AN000;segment of arg - 43143 00009088 01 db 1 ;AN000;first subst - 43144 00009089 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43145 ;AN000;binary to decimal - 43146 0000908A 05 db 5 ;AN000;maximum width - 43147 0000908B 01 db 1 ;AN000;minimum width - 43148 0000908C 20 db blank ; 20h ;AN000;pad character - 43149 - 43150 ; "Active code page: %1",13,10 - 43151 cp_active_ptr: - 43152 0000908D 0004 dw 1024 ;AN000;message number - 43153 0000908F 01 db 1 ;AN000;number of subst - 43154 00009090 0B db parm_block_size ; 11 ;AN000;size of sublist - 43155 00009091 00 db 0 ;AN000;reserved - 43156 00009092 [9A9D] dw system_cpage ;AN000;offset of arg - 43157 00009094 0000 dw 0 ;AN000;segment of arg - 43158 00009096 01 db 1 ;AN000;first subst - 43159 00009097 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43160 ;AN000;binary to decimal - 43161 00009098 05 db 5 ;AN000;maximum width - 43162 00009099 01 db 1 ;AN000;minimum width - 43163 0000909A 20 db blank ; 20h ;AN000;pad character - 43164 - 43165 ; "NLSFUNC not installed",13,10 - 43166 NLSFUNC_PTR: - 43167 0000909B 0104 dw 1025 ;AN000;message number - 43168 0000909D 00 db no_subst ; 0 ;AN000;number of subst - 43169 - 43170 ; "Invalid code page",13,10 - 43171 INV_CODE_PAGE: - 43172 0000909E 0204 dw 1026 ;AN000;message number - 43173 000090A0 00 db no_subst ; 0 ;AN000;number of subst - 43174 - 43175 ; "Current drive is no longer valid" - 43176 BADCURDRV: - 43177 000090A1 0304 dw 1027 ;AN000;message number - 43178 000090A3 00 db no_subst ; 0 ;AN000;number of subst - 43179 - 43180 ; "Press any key to continue" - 43181 PAUSEMES_PTR: - 43182 000090A4 0404 dw 1028 ;AN000;message number - 43183 000090A6 00 db no_subst ; 0 ;AN000;number of subst - 43184 - 43185 ; "Label not found",13,10 - 43186 BADLAB_PTR: - 43187 000090A7 0504 dw 1029 ;AN000;message number - 43188 000090A9 00 db no_subst ; 0 ;AN000;number of subst - 43189 - 43190 ; "Syntax error",13,10 - 43191 SYNTMES_PTR: - 43192 000090AA 0604 dw 1030 ;AN000;message number - 43193 000090AC 00 db no_subst ; 0 ;AN000;number of subst - 43194 - 43195 ; "Invalid date",13,10 - 43196 BADDAT_PTR: - 43197 000090AD 0704 dw 1031 ;AN000;message number - 43198 000090AF 00 db no_subst ; 0 ;AN000;number of subst - 43199 - 43200 ; "Current date is %1 %2",13,10 - 43201 CurDat_Ptr: - 43202 000090B0 0804 dw 1032 ;AN000;message number - 43203 000090B2 02 db 2 ;AN000;number of subst - 43204 000090B3 0B db parm_block_size ; 11 ;AN000;size of sublist - 43205 000090B4 00 db 0 ;AN000;reserved - 43206 000090B5 [96A3] dw Arg_Buf ;AN000;offset of arg - 43207 000090B7 0000 dw 0 ;AN000;segment of arg - 43208 000090B9 01 db 1 ;AN000;first subst - 43209 000090BA 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43210 000090BB 03 db 3 ;AN000;maximum width - 43211 000090BC 03 db 3 ;AN000;minimum width - 43212 000090BD 20 db blank ; 20h ;AN000;pad character - 43213 000090BE 0B db parm_block_size ;AN000;size of sublist - 43214 000090BF 00 db 0 ;AN000;reserved - 43215 CurDat_yr: - 43216 000090C0 0000 dw 0 ;AN000;year - 43217 CurDat_mo_day: - 43218 000090C2 0000 dw 0 ;AN000;month,day - 43219 000090C4 02 db 2 ;AN000;second subst - 43220 000090C5 34 db 34h ; DATE_MDY_4 ;AN000;date - 43221 000090C6 0A db 10 ;AN000;maximum width - 43222 000090C7 0A db 10 ;AN000;minimum width - 43223 000090C8 20 db blank ; 20h ;AN000;pad character - 43224 - 43225 ; "SunMonTueWedThuFriSat" - 43226 WeekTab: - 43227 000090C9 0904 dw 1033 ;AN000;message number - 43228 000090CB 00 db no_subst ; 0 ;AN000;number of subst - 43229 - 43230 ; "Enter new date (%1):" - 43231 - 43232 NewDat_Ptr: - 43233 000090CC 0A04 dw 1034 ;AN000;message number - 43234 000090CE 01 db 1 ;AN000;number of subst - 43235 000090CF 0B db parm_block_size ; 11 ;AN000;size of sublist - 43236 000090D0 00 db 0 ;AN000;reserved - 43237 NewDat_Format: - 43238 000090D1 0000 dw 0 ;AN000;offset of replacement - 43239 000090D3 0000 dw 0 ;AN000;segment of arg - 43240 000090D5 01 db 1 ;AN000;first subst - 43241 000090D6 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43242 000090D7 08 db 8 ;AN000;maximum width - 43243 000090D8 08 db 8 ;AN000;minimum width - 43244 000090D9 20 db blank ; 20h ;AN000;pad character - 43245 - 43246 ; "Invalid time",13,10 - 43247 - 43248 BadTim_Ptr: - 43249 000090DA 0B04 dw 1035 ;AN000;message number - 43250 000090DC 00 db no_subst ; 0 ;AN000;number of subst - 43251 - 43252 ; "Current time is %1",13,10 - 43253 CurTim_Ptr: - 43254 000090DD 0C04 dw 1036 ;AN000;message number - 43255 000090DF 01 db 1 ;AN000;number of subst - 43256 000090E0 0B db parm_block_size ;AN000;size of sublist - 43257 000090E1 00 db 0 ;AN000;reserved - 43258 CurTim_hr_min: - 43259 000090E2 0000 dw 0 ;AN000;hours,minutes - 43260 CurTim_Sec_hn: - 43261 000090E4 0000 dw 0 ;AN000;seconds,hundredths - 43262 000090E6 01 db 1 ;AN000;first subst - 43263 000090E7 A5 db 0A5h ; Right_Align+TIME_HHMMSSHH_Cty - 43264 ;AC059;time - 43265 000090E8 0C db 12 ;AC059;maximum width - 43266 000090E9 0C db 12 ;AC059;minimum width - 43267 000090EA 20 db blank ; 20h ;AN000;pad character - 43268 - 43269 ; "Enter new time:" - 43270 NewTim_Ptr: - 43271 000090EB 0D04 dw 1037 ;AN000;message number - 43272 000090ED 00 db no_subst ; 0 ;AN000;number of subst - 43273 - 43274 ; ", Delete (Y/N)?",13,10 - 43275 Del_Y_N_Ptr: - 43276 000090EE 0E04 dw 1038 ;AN000;message number - 43277 000090F0 00 db no_subst ; 0 ;AN000;number of subst - 43278 - 43279 ; "All files in directory will be deleted!",13,10 - 43280 ; "Are you sure (Y/N)?",13,10 - 43281 SureMes_Ptr: - 43282 000090F1 0F04 dw 1039 ;AN000;message number - 43283 000090F3 00 db no_subst ; 0 ;AN000;number of subst - 43284 - 43285 ; "Microsoft DOS Version %1.%2",13,10 - 43286 VerMes_Ptr: - 43287 000090F4 1004 dw 1040 ;AN000;message number - 43288 - 43289 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 43290 %if 0 - 43291 db 2 ;AN000;number of subst - 43292 db parm_block_size ; 11 ;AN000;size of sublist - 43293 db 0 ;AN000;reserved - 43294 dw Major_Ver_Num ;AN000;offset of arg - 43295 dw 0 ;AN000;segment of arg - 43296 db 1 ;AN000;first subst - 43297 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43298 ;AN000;binary to decimal - 43299 db 1 ;AN000;maximum width - 43300 db 1 ;AN000;minimum width - 43301 db blank ; 20h ;AN000;pad character - 43302 db parm_block_size ; 11 ;AN000;size of sublist - 43303 db 0 ;AN000;reserved - 43304 dw Minor_Ver_Num ;AN000;offset of arg - 43305 dw 0 ;AN000;segment of arg - 43306 db 2 ;AN000;second subst - 43307 db 0A1h ; Right_Align+Unsgn_Bin_Word - 43308 ;AN000;binary to decimal - 43309 db 2 ;AN000;maximum width - 43310 db 2 ;AN000;minimum width - 43311 db '0' ; 30h ;AN000;pad character - 43312 %else - 43313 000090F6 00 db 0 ; no_subst - 43314 %endif - 43315 - 43316 ; "Volume in drive %1 has no label",13,10 - 43317 VolMes_Ptr_2: - 43318 000090F7 1104 dw 1041 ;AN000;message number - 43319 000090F9 01 db 1 ;AN000;number of subst - 43320 000090FA 0B db parm_block_size ; 11 ;AN000;size of sublist - 43321 000090FB 00 db 0 ;AN000;reserved - 43322 000090FC [B39D] dw vol_drv ;AN000;offset of drive - 43323 000090FE 0000 dw 0 ;AN000;segment of arg - 43324 00009100 01 db 1 ;AN000;first subst - 43325 00009101 00 db 0 ; Char_field_Char ;AN000;character - 43326 00009102 80 db 128 ;AN000;maximum width - 43327 00009103 01 db 1 ;AN000;minimum width - 43328 00009104 20 db blank ; 20h ;AN000;pad character - 43329 - 43330 ; "Volume in drive %1 is %2",13,10 - 43331 VolMes_Ptr: - 43332 00009105 1204 dw 1042 ;AN000;message number - 43333 00009107 02 db 2 ;AN000;number of subst - 43334 00009108 0B db parm_block_size ; 11 ;AN000;size of sublist - 43335 00009109 00 db 0 ;AN000;reserved - 43336 0000910A [B39D] dw vol_drv ;AN000;offset of drive - 43337 0000910C 0000 dw 0 ;AN000;segment of arg - 43338 0000910E 01 db 1 ;AN000;first subst - 43339 0000910F 00 db 00000000b ;AN000;character - 43340 00009110 80 db 128 ;AN000;maximum width - 43341 00009111 01 db 1 ;AN000;minimum width - 43342 00009112 20 db blank ; 20h ;AN000;pad character - 43343 00009113 0B db parm_block_size ; 11 ;AN000;size of sublist - 43344 00009114 00 db 0 ;AN000;reserved - 43345 00009115 [6A9C] dw CHARBUF ;AN000;offset of string - 43346 00009117 0000 dw 0 ;AN000;segment of arg - 43347 00009119 02 db 2 ;AN000;second subst - 43348 0000911A 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43349 0000911B 80 db 128 ;AN000;maximum width - 43350 0000911C 01 db 1 ;AN000;minimum width - 43351 0000911D 20 db blank ; 20h ;AN000;pad character - 43352 - 43353 ; "Volume Serial Number is %1-%2",13,10 - 43354 VolSerMes_Ptr: - 43355 0000911E 1304 dw 1043 ;AN000;message number - 43356 00009120 02 db 2 ;AN000;number of subst - 43357 00009121 0B db parm_block_size ; 11 ;AN000;size of sublist - 43358 00009122 00 db 0 ;AN000;reserved - 43359 00009123 [1D9F] dw vol_serial+2 ;AN000;offset of serial - 43360 00009125 0000 dw 0 ;AN000;segment of arg - 43361 00009127 01 db 1 ;AN000;first subst - 43362 00009128 A3 db 0A3h ; Right_Align+Bin_Hex_Word - 43363 ;AN000;binary to hex - 43364 00009129 04 db 4 ;AN000;maximum width - 43365 0000912A 04 db 4 ;AN000;minimum width - 43366 0000912B 30 db '0' ; 30h ;AN000;pad character - 43367 0000912C 0B db parm_block_size ; 11 ;AN000;size of sublist - 43368 0000912D 00 db 0 ;AN000;reserved - 43369 0000912E [1B9F] dw vol_serial ;AN000;offset of serial - 43370 00009130 0000 dw 0 ;AN000;segment of arg - 43371 00009132 02 db 2 ;AN000;second subst - 43372 00009133 A3 db 0A3h ; Right_Align+Bin_Hex_Word - 43373 ;AN000;binary to hex - 43374 00009134 04 db 4 ;AN000;maximum width - 43375 00009135 04 db 4 ;AN000;minimum width - 43376 00009136 30 db '0' ; 30h ;AN000;pad character - 43377 - 43378 ; "Invalid directory",13,10 - 43379 badcd_ptr: - 43380 00009137 1404 dw 1044 ;AN000;message number - 43381 00009139 00 db no_subst ; 0 ;AN000;number of subst - 43382 - 43383 ; "Unable to create directory",13,10 - 43384 badmkd_ptr: - 43385 0000913A 1504 dw 1045 ;AN000;message number - 43386 0000913C 00 db no_subst ; 0 ;AN000;number of subst - 43387 - 43388 ; "Invalid path, not directory,",13,10 - 43389 ; "or directory not empty",13,10 - 43390 badrmd_ptr: - 43391 0000913D 1604 dw 1046 ;AN000;message number - 43392 0000913F 00 db no_subst ; 0 ;AN000;number of subst - 43393 - 43394 ; "Must specify ON or OFF",13,10 - 43395 bad_on_off_ptr: - 43396 00009140 1704 dw 1047 ;AN000;message number - 43397 00009142 00 db no_subst ; 0 ;AN000;number of subst - 43398 - 43399 ; "Directory of %1",13,10 - 43400 dirhead_ptr: - 43401 00009143 1804 dw 1048 ;AN000;message number - 43402 00009145 01 db 1 ;AN000;number of subst - 43403 00009146 0B db parm_block_size ; 11 ;AN000;size of sublist - 43404 00009147 00 db 0 ;AN000;reserved - 43405 00009148 [399D] dw BWDBUF ;AN000;offset of arg - 43406 0000914A 0000 dw 0 ;AN000;segment of arg - 43407 0000914C 01 db 1 ;AN000;first subst - 43408 0000914D 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43409 0000914E 80 db 128 ;AN000;maximum width - 43410 0000914F 00 db 0 ;AN000;minimum width - 43411 00009150 20 db blank ; 20h ;AN000;pad character - 43412 - 43413 ; "No Path",13,10 - 43414 NULLPATH_PTR: - 43415 00009151 1904 dw 1049 ;AN000;message number - 43416 00009153 00 db no_subst ; 0 ;AN000;number of subst - 43417 - 43418 ; "Invalid drive in search path",13,10 - 43419 BADPMES_PTR: - 43420 00009154 1A04 dw 1050 ;AN000;message number - 43421 00009156 00 db no_subst ; 0 ;AN000;number of subst - 43422 - 43423 ; "Invalid device",13,10 - 43424 BADDEV_PTR: - 43425 00009157 1B04 dw 1051 ;AN000;message number - 43426 00009159 00 db no_subst ; 0 ;AN000;number of subst - 43427 - 43428 ; "FOR cannot be nested",13,10 - 43429 FORNESTMES_PTR: - 43430 0000915A 1C04 dw 1052 ;AN000;message number - 43431 0000915C 00 db no_subst ; 0 ;AN000;number of subst - 43432 - 43433 ; "Intermediate file error during pipe",13,10 - 43434 PIPEEMES_PTR: - 43435 0000915D 1D04 dw 1053 ;AN000;message number - 43436 0000915F 00 db no_subst ; 0 ;AN000;number of subst - 43437 - 43438 ; "Cannot do binary reads from a device",13,10 - 43439 INBDEV_PTR: - 43440 00009160 1E04 dw 1054 ;AN000;message number - 43441 00009162 00 db no_subst ; 0 ;AN000;number of subst - 43442 - 43443 ; "BREAK is %1",13,10 - 43444 CtrlcMes_Ptr: - 43445 00009163 1F04 dw 1055 ;AN000;message number - 43446 00009165 01 db 1 ;AN000;number of subst - 43447 00009166 0B db parm_block_size ; 11 ;AN000;size of sublist - 43448 00009167 00 db 0 ;AN000;reserved - 43449 00009168 0000 dw 0 ;AN000;offset of on/off (new) - 43450 0000916A 0000 dw 0 ;AN000;segment of arg - 43451 0000916C 01 db 1 ;AN000;first subst - 43452 0000916D 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43453 0000916E 80 db 128 ;AN000;maximum width - 43454 0000916F 01 db 1 ;AN000;minimum width - 43455 00009170 20 db blank ; 20h ;AN000;pad character - 43456 - 43457 ; "VERIFY is %1",13,10 - 43458 VeriMes_Ptr: - 43459 00009171 2004 dw 1056 ;AN000;message number - 43460 00009173 01 db 1 ;AN000;number of subst - 43461 00009174 0B db parm_block_size ; 11 ;AN000;size of sublist - 43462 00009175 00 db 0 ;AN000;reserved - 43463 00009176 0000 dw 0 ;AN000;offset of on/off (new) - 43464 00009178 0000 dw 0 ;AN000;segment of arg - 43465 0000917A 01 db 1 ;AN000;first subst - 43466 0000917B 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43467 0000917C 80 db 128 ;AN000;maximum width - 43468 0000917D 01 db 1 ;AN000;minimum width - 43469 0000917E 20 db blank ; 20h ;AN000;pad character - 43470 - 43471 ; "ECHO is %1",13,10 - 43472 EchoMes_Ptr: - 43473 0000917F 2104 dw 1057 ;AN000;message number - 43474 00009181 01 db 1 ;AN000;number of subst - 43475 00009182 0B db parm_block_size ; 11 ;AN000;size of sublist - 43476 00009183 00 db 0 ;AN000;reserved - 43477 00009184 0000 dw 0 ;AN000;offset of on/off (new) - 43478 00009186 0000 dw 0 ;AN000;segment of arg - 43479 00009188 01 db 1 ;AN000;first subst - 43480 00009189 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43481 0000918A 80 db 128 ;AN000;maximum width - 43482 0000918B 01 db 1 ;AN000;minimum width - 43483 0000918C 20 db blank ; 20h ;AN000;pad character - 43484 - 43485 ; "off" - 43486 OFFMES_PTR: - 43487 0000918D 2304 dw 1059 ;AN000;message number - 43488 0000918F 00 db no_subst ;AN000;number of subst - 43489 ; "on" - 43490 ONMES_PTR: - 43491 00009190 2404 dw 1060 ;AN000;message number - 43492 00009192 00 db no_subst ; 0 ;AN000;number of subst - 43493 - 43494 ; "Error writing to device",13,10 - 43495 DEVWMES_PTR: - 43496 00009193 2504 dw 1061 ;AN000;message number - 43497 00009195 00 db no_subst ; 0 ;AN000;number of subst - 43498 - 43499 ; "Invalid path",13,10 - 43500 INVAL_PATH_PTR: - 43501 00009196 2604 dw 1062 ;AN000;message number - 43502 00009198 00 db no_subst ; 0 ;AN000;number of subst - 43503 - 43504 ; unformatted string output - 43505 arg_buf_ptr: - 43506 00009199 2704 dw 1063 ;AN000;message number - 43507 0000919B 01 db 1 ;AN000;number of subst - 43508 0000919C 0B db parm_block_size ; 11 ;AN000;size of sublist - 43509 0000919D 00 db 0 ;AN000;reserved - 43510 0000919E [96A3] dw Arg_Buf ;AN000;offset of arg - 43511 000091A0 0000 dw 0 ;AN000;segment of arg - 43512 000091A2 01 db 1 ;AN000;first subst - 43513 000091A3 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43514 000091A4 80 db 128 ;AN000;maximum width - 43515 000091A5 00 db 0 ;AN000;minimum width - 43516 000091A6 20 db blank ; 20h ;AN000;pad character - 43517 - 43518 ; file name output - 43519 file_name_ptr: - 43520 000091A7 2804 dw 1064 ;AN000;message number - 43521 000091A9 01 db 1 ;AN000;number of subst - 43522 000091AA 0B db parm_block_size ; 11 ;AN000;size of sublist - 43523 000091AB 00 db 0 ;AN000;reserved - 43524 000091AC [219E] dw SrcBuf ;AN000;offset of arg - 43525 000091AE 0000 dw 0 ;AN000;segment of arg - 43526 000091B0 01 db 1 ;AN000;first subst - 43527 000091B1 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43528 000091B2 80 db 128 ;AN000;maximum width - 43529 000091B3 00 db 0 ;AN000;minimum width - 43530 000091B4 20 db blank ; 20h ;AN000;pad character - 43531 - 43532 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 43533 %if 0 + 42873 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42874 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9484h + 42875 + 42876 ; --------------- S U B R O U T I N E --------------------------------------- + 42877 $M_MSGSERV_2: + 42878 00008FCE 0E push cs + 42879 00008FCF 07 pop es + 42880 00008FD0 8D3E[B78F] lea di,$M_CLASS_2_STRUC + 42881 ; 15/04/2023 + 42882 ;add cx,29 ; $-$M_CLASS_2_STRUC ; 820Dh-81F0h + 42883 ; 17/06/2023 MSDOS 6.22 COMMAND.COM + 42884 ; 971Fh-9702h = 1Dh = 29 + 42885 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 42886 ;add cx,29 ; Retro DOS v5.0 COMMAND.COM + 42887 00008FD4 C3 retn + 42888 + 42889 ;============================================================================ + 42890 ; TRANMSG.ASM, MSDOS 6.0, 1991 + 42891 ;============================================================================ + 42892 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 42893 ; 17/06/2023 - Retro DOS v4.2 COMMAND.COM + 42894 ; 06/08/2024 - Retro DOS v5.0 COMMAND.COM + 42895 + 42896 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8211h + 42897 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9723h + 42898 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:948Eh + 42899 + 42900 ;**************************************************** + 42901 ;* TRANSIENT MESSAGE POINTERS & SUBSTITUTION BLOCKS * + 42902 ;**************************************************** + 42903 + 42904 msg_disp_class: + 42905 00008FD5 FF db util_msg_class ; 0FFh + 42906 msg_cont_flag: + 42907 00008FD6 00 db no_cont_flag ; 0 + 42908 + 42909 ; extended error string output + 42910 extend_buf_ptr: + 42911 00008FD7 0000 dw 0 ;AN000;set to no message + 42912 extend_buf_sub: + 42913 00008FD9 00 db 0 ;AN000;set to no substitutions + 42914 00008FDA 0B db parm_block_size ; 11 ;AN000;size of sublist + 42915 00008FDB 00 db 0 ;AN000;reserved + 42916 extend_buf_off: + 42917 00008FDC [A09D] dw string_ptr_2 ;AN000;offset of arg + 42918 extend_buf_seg: + 42919 00008FDE 0000 dw 0 ;AN000;segment of arg + 42920 00008FE0 00 db 0 ;AN000;first subst + 42921 00008FE1 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 42922 00008FE2 80 db 128 ;AN000;maximum width + 42923 00008FE3 00 db 0 ;AN000;minimum width + 42924 00008FE4 20 db blank ; 20h ;AN000;pad character + 42925 + 42926 ; "Duplicate file name or file not found" + 42927 RENERR_PTR: + 42928 00008FE5 EA03 dw 1002 ;AN000;message number + 42929 00008FE7 00 db no_subst ; 0 ;AN000;number of subst + 42930 + 42931 ; "Invalid path or file name" + 42932 BADCPMES_PTR: + 42933 00008FE8 EB03 dw 1003 ;AN000;message number + 42934 00008FEA 00 db no_subst ; 0 ;AN000;number of subst + 42935 + 42936 ; "Insufficient disk space" + 42937 NOSPACE_PTR: + 42938 00008FEB EC03 dw 1004 ;AN000;message number + 42939 00008FED 00 db no_subst ; 0 ;AN000;number of subst + 42940 + 42941 ; "Out of environment space" + 42942 ENVERR_PTR: + 42943 00008FEE EF03 dw 1007 ;AN000;message number + 42944 00008FF0 00 db no_subst ; 0 ;AN000;number of subst + 42945 + 42946 ; "File creation error" + 42947 FULLDIR_PTR: + 42948 00008FF1 F003 dw 1008 ;AN000;message number + 42949 00008FF3 00 db no_subst ; 0 ;AN000;number of subst + 42950 + 42951 ; "Batch file missing",13,10 + 42952 BADBAT_PTR: + 42953 00008FF4 F103 dw 1009 ;AN000;message number + 42954 00008FF6 00 db no_subst ; 0 ;AN000;number of subst + 42955 + 42956 ; "Insert disk with batch file",13,10 + 42957 NEEDBAT_PTR: + 42958 00008FF7 F203 dw 1010 ;AN000;message number + 42959 00008FF9 00 db no_subst ; 0 ;AN000;number of subst + 42960 + 42961 ; "Bad command or file name",13,10 + 42962 BADNAM_PTR: + 42963 00008FFA F303 dw 1011 ;AN000;message number + 42964 00008FFC 00 db no_subst ; 0 ;AN000;number of subst + 42965 + 42966 ; 04/08/2024 - PCDOS 7.1 COMMAND.COM + 42967 %if 1 + 42968 ; "REXX interpreter not found",13,10 + 42969 REXXNOTF_PTR: + 42970 00008FFD F403 dw 1012 + 42971 00008FFF 00 db no_subst ; 0 + 42972 %endif + 42973 + 42974 ; "Access denied",13,10 + 42975 ACCDEN_PTR: + 42976 00009000 F603 dw 1014 ;AN000;message number + 42977 00009002 00 db no_subst ; 0 ;AN000;number of subst + 42978 + 42979 ; "File cannot be copied onto itself",13,10 + 42980 OVERWR_PTR: + 42981 00009003 F703 dw 1015 ;AN000;message number + 42982 00009005 00 db no_subst ; 0 ;AN000;number of subst + 42983 + 42984 ; "Content of destination lost before copy",13,10 + 42985 LOSTERR_PTR: + 42986 00009006 F803 dw 1016 ;AN000;message number + 42987 00009008 00 db no_subst ; 0 ;AN000;number of subst + 42988 + 42989 ; "Invalid filename or file not found",13,10 + 42990 INORNOT_PTR: + 42991 00009009 F903 dw 1017 ;AN000;message number + 42992 0000900B 00 db no_subst ;AN000;number of subst + 42993 + 42994 ; "%1 File(s) copied",13,10 + 42995 copied_ptr: + 42996 0000900C FA03 dw 1018 ;AN000;message number + 42997 0000900E 01 db 1 ;AN000;number of subst + 42998 0000900F 0B db parm_block_size ; 11 ;AN000;size of sublist + 42999 00009010 00 db 0 ;AN000;reserved + 43000 00009011 [A29D] dw Copy_num ;AN000;offset of arg + 43001 00009013 0000 dw 0 ;AN000;segment of arg + 43002 00009015 01 db 1 ;AN000;first subst + 43003 00009016 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43004 ;AN000;binary to decimal + 43005 00009017 09 db 9 ;AN000;maximum width + 43006 00009018 09 db 9 ;AN000;minimum width + 43007 00009019 20 db blank ; 20h ;AN000;pad character + 43008 + 43009 ; "%1 File(s) " + 43010 dirmes_ptr: + 43011 0000901A FB03 dw 1019 ;AN000;message number + 43012 0000901C 01 db 1 ;AN000;number of subst + 43013 0000901D 0B db parm_block_size ; 11 ;AN000;size of sublist + 43014 0000901E 00 db 0 ;AN000;reserved + 43015 0000901F [A59D] dw Dir_Num ;AN000;offset of arg + 43016 00009021 0000 dw 0 ;AN000;segment of arg + 43017 00009023 01 db 1 ;AN000;first subst + 43018 ; MSDOS 5.0 COMMAND.COM + 43019 ;db 0A1h ; Right_Align+Unsgn_Bin_Word + 43020 ; 17/06/2023 + 43021 ;screen_f_3: + 43022 00009024 E1 db 0E1h ; MSDOS 6.22 COMMAND.COM + 43023 ;AN000;binary to decimal + 43024 00009025 09 db 9 ;AN000;maximum width + 43025 00009026 09 db 9 ;AN000;minimum width + 43026 00009027 20 db blank ; 20h ;AN000;pad character + 43027 + 43028 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 43029 %if 0 + 43030 ; "%1 bytes free",13,10 + 43031 bytmes_ptr: + 43032 dw 1020 ;AN000;message number + 43033 db 1 ;AN000;number of subst + 43034 db parm_block_size ; 11 ;AN000;size of sublist + 43035 db 0 ;AN000;reserved + 43036 dw Bytes_Free ;AN000;offset of arg + 43037 dw 0 ;AN000;segment of arg + 43038 db 1 ;AN000;first subst + 43039 ; MSDOS 5.0 COMMAND.COM + 43040 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43041 ; 17/06/2023 + 43042 screen_f_6: + 43043 db 0F1h ;AN000;long binary to decimal + 43044 ; MSDOS 5.0 COMMAND.COM + 43045 ;db 28 ;AN000;maximum width + 43046 ;db 28 ;AN000;minimum width + 43047 ; 17/06/2023 + 43048 screen_f_7: + 43049 db 32 ; MSDOS 6.22 COMMAND.COM + 43050 db 32 + 43051 + 43052 db blank ; 20h ;AN000;pad character + 43053 %else + 43054 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 43055 ; PCDOS 7.1 COMMAND.COM + 43056 dirmes_w_ptr: + 43057 00009028 FB03 dw 1019 + 43058 0000902A 01 db 1 + 43059 0000902B 0B db 11 + 43060 0000902C 00 db 0 + 43061 0000902D [A59D] dw Dir_Num + 43062 0000902F 0000 dw 0 + 43063 00009031 01 db 1 + 43064 00009032 F1 db 0F1h ; long binary to decimal + 43065 00009033 0A db 10 + 43066 00009034 0A db 10 + 43067 00009035 20 db 20h + 43068 dirmes2_ptr: + 43069 00009036 FB03 dw 1019 + 43070 00009038 01 db 1 + 43071 00009039 0B db 11 + 43072 0000903A 00 db 0 + 43073 0000903B [A59D] dw Dir_Num + 43074 0000903D 0000 dw 0 + 43075 0000903F 01 db 1 + 43076 00009040 B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43077 00009041 09 db 9 + 43078 00009042 09 db 9 + 43079 00009043 20 db 20h + 43080 bytmes1_ptr: + 43081 00009044 FC03 dw 1020 + 43082 00009046 01 db 1 + 43083 00009047 0B db 11 + 43084 00009048 00 db 0 + 43085 00009049 [A99D] dw Bytes_Free + 43086 0000904B 0000 dw 0 + 43087 0000904D 01 db 1 + 43088 0000904E F1 db 0F1h ; long binary to decimal + 43089 0000904F 1E db 30 ; maximum width + 43090 00009050 1E db 30 ; minimum width + 43091 00009051 20 db 20h ; blank + 43092 bytmes2_ptr: + 43093 00009052 FC03 dw 1020 + 43094 00009054 01 db 1 + 43095 00009055 0B db 11 + 43096 00009056 00 db 0 + 43097 00009057 [A99D] dw Bytes_Free + 43098 00009059 0000 dw 0 + 43099 0000905B 01 db 1 + 43100 0000905C F1 db 0F1h ; long binary to decimal + 43101 0000905D 21 db 33 ; maximum width + 43102 0000905E 21 db 33 ; minimum width + 43103 0000905F 20 db 20h ; pad + 43104 bytmes_n_ptr: + 43105 00009060 FC03 dw 1020 + 43106 00009062 01 db 1 + 43107 00009063 0B db 11 ; parm_block_size + 43108 00009064 00 db 0 + 43109 00009065 [A99D] dw Bytes_Free + 43110 00009067 0000 dw 0 + 43111 00009069 01 db 1 + 43112 0000906A B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43113 0000906B 1C db 28 + 43114 0000906C 1C db 28 + 43115 0000906D 20 db 20h + 43116 %endif + 43117 + 43118 ; "Invalid drive specification",13,10 + 43119 baddrv_ptr: + 43120 0000906E FD03 dw 1021 ;AN000;message number + 43121 00009070 00 db no_subst ; 0 ;AN000;number of subst + 43122 + 43123 ; "Code page %1 not prepared for system",13,10 + 43124 cp_not_set_ptr: + 43125 00009071 FE03 dw 1022 ;AN000;message number + 43126 00009073 01 db 1 ;AN000;number of subst + 43127 00009074 0B db parm_block_size ; 11 ;AN000;size of sublist + 43128 00009075 00 db 0 ;AN000;reserved + 43129 00009076 [9A9D] dw system_cpage ;AN000;offset of arg + 43130 00009078 0000 dw 0 ;AN000;segment of arg + 43131 0000907A 01 db 1 ;AN000;first subst + 43132 0000907B A1 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43133 ;AN000;binary to decimal + 43134 0000907C 05 db 5 ;AN000;maximum width + 43135 0000907D 01 db 1 ;AN000;minimum width + 43136 0000907E 20 db blank ; 20h ;AN000;pad character + 43137 + 43138 ; "Code page %1 not prepared for all devices",13,10 + 43139 cp_not_all_ptr: + 43140 0000907F FF03 dw 1023 ;AN000;message number + 43141 00009081 01 db 1 ;AN000;number of subst + 43142 00009082 0B db parm_block_size ; 11 ;AN000;size of sublist + 43143 00009083 00 db 0 ;AN000;reserved + 43144 00009084 [9A9D] dw system_cpage ;AN000;offset of arg + 43145 00009086 0000 dw 0 ;AN000;segment of arg + 43146 00009088 01 db 1 ;AN000;first subst + 43147 00009089 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43148 ;AN000;binary to decimal + 43149 0000908A 05 db 5 ;AN000;maximum width + 43150 0000908B 01 db 1 ;AN000;minimum width + 43151 0000908C 20 db blank ; 20h ;AN000;pad character + 43152 + 43153 ; "Active code page: %1",13,10 + 43154 cp_active_ptr: + 43155 0000908D 0004 dw 1024 ;AN000;message number + 43156 0000908F 01 db 1 ;AN000;number of subst + 43157 00009090 0B db parm_block_size ; 11 ;AN000;size of sublist + 43158 00009091 00 db 0 ;AN000;reserved + 43159 00009092 [9A9D] dw system_cpage ;AN000;offset of arg + 43160 00009094 0000 dw 0 ;AN000;segment of arg + 43161 00009096 01 db 1 ;AN000;first subst + 43162 00009097 A1 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43163 ;AN000;binary to decimal + 43164 00009098 05 db 5 ;AN000;maximum width + 43165 00009099 01 db 1 ;AN000;minimum width + 43166 0000909A 20 db blank ; 20h ;AN000;pad character + 43167 + 43168 ; "NLSFUNC not installed",13,10 + 43169 NLSFUNC_PTR: + 43170 0000909B 0104 dw 1025 ;AN000;message number + 43171 0000909D 00 db no_subst ; 0 ;AN000;number of subst + 43172 + 43173 ; "Invalid code page",13,10 + 43174 INV_CODE_PAGE: + 43175 0000909E 0204 dw 1026 ;AN000;message number + 43176 000090A0 00 db no_subst ; 0 ;AN000;number of subst + 43177 + 43178 ; "Current drive is no longer valid" + 43179 BADCURDRV: + 43180 000090A1 0304 dw 1027 ;AN000;message number + 43181 000090A3 00 db no_subst ; 0 ;AN000;number of subst + 43182 + 43183 ; "Press any key to continue" + 43184 PAUSEMES_PTR: + 43185 000090A4 0404 dw 1028 ;AN000;message number + 43186 000090A6 00 db no_subst ; 0 ;AN000;number of subst + 43187 + 43188 ; "Label not found",13,10 + 43189 BADLAB_PTR: + 43190 000090A7 0504 dw 1029 ;AN000;message number + 43191 000090A9 00 db no_subst ; 0 ;AN000;number of subst + 43192 + 43193 ; "Syntax error",13,10 + 43194 SYNTMES_PTR: + 43195 000090AA 0604 dw 1030 ;AN000;message number + 43196 000090AC 00 db no_subst ; 0 ;AN000;number of subst + 43197 + 43198 ; "Invalid date",13,10 + 43199 BADDAT_PTR: + 43200 000090AD 0704 dw 1031 ;AN000;message number + 43201 000090AF 00 db no_subst ; 0 ;AN000;number of subst + 43202 + 43203 ; "Current date is %1 %2",13,10 + 43204 CurDat_Ptr: + 43205 000090B0 0804 dw 1032 ;AN000;message number + 43206 000090B2 02 db 2 ;AN000;number of subst + 43207 000090B3 0B db parm_block_size ; 11 ;AN000;size of sublist + 43208 000090B4 00 db 0 ;AN000;reserved + 43209 000090B5 [96A3] dw Arg_Buf ;AN000;offset of arg + 43210 000090B7 0000 dw 0 ;AN000;segment of arg + 43211 000090B9 01 db 1 ;AN000;first subst + 43212 000090BA 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43213 000090BB 03 db 3 ;AN000;maximum width + 43214 000090BC 03 db 3 ;AN000;minimum width + 43215 000090BD 20 db blank ; 20h ;AN000;pad character + 43216 000090BE 0B db parm_block_size ;AN000;size of sublist + 43217 000090BF 00 db 0 ;AN000;reserved + 43218 CurDat_yr: + 43219 000090C0 0000 dw 0 ;AN000;year + 43220 CurDat_mo_day: + 43221 000090C2 0000 dw 0 ;AN000;month,day + 43222 000090C4 02 db 2 ;AN000;second subst + 43223 000090C5 34 db 34h ; DATE_MDY_4 ;AN000;date + 43224 000090C6 0A db 10 ;AN000;maximum width + 43225 000090C7 0A db 10 ;AN000;minimum width + 43226 000090C8 20 db blank ; 20h ;AN000;pad character + 43227 + 43228 ; "SunMonTueWedThuFriSat" + 43229 WeekTab: + 43230 000090C9 0904 dw 1033 ;AN000;message number + 43231 000090CB 00 db no_subst ; 0 ;AN000;number of subst + 43232 + 43233 ; "Enter new date (%1):" + 43234 + 43235 NewDat_Ptr: + 43236 000090CC 0A04 dw 1034 ;AN000;message number + 43237 000090CE 01 db 1 ;AN000;number of subst + 43238 000090CF 0B db parm_block_size ; 11 ;AN000;size of sublist + 43239 000090D0 00 db 0 ;AN000;reserved + 43240 NewDat_Format: + 43241 000090D1 0000 dw 0 ;AN000;offset of replacement + 43242 000090D3 0000 dw 0 ;AN000;segment of arg + 43243 000090D5 01 db 1 ;AN000;first subst + 43244 000090D6 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43245 000090D7 08 db 8 ;AN000;maximum width + 43246 000090D8 08 db 8 ;AN000;minimum width + 43247 000090D9 20 db blank ; 20h ;AN000;pad character + 43248 + 43249 ; "Invalid time",13,10 + 43250 + 43251 BadTim_Ptr: + 43252 000090DA 0B04 dw 1035 ;AN000;message number + 43253 000090DC 00 db no_subst ; 0 ;AN000;number of subst + 43254 + 43255 ; "Current time is %1",13,10 + 43256 CurTim_Ptr: + 43257 000090DD 0C04 dw 1036 ;AN000;message number + 43258 000090DF 01 db 1 ;AN000;number of subst + 43259 000090E0 0B db parm_block_size ;AN000;size of sublist + 43260 000090E1 00 db 0 ;AN000;reserved + 43261 CurTim_hr_min: + 43262 000090E2 0000 dw 0 ;AN000;hours,minutes + 43263 CurTim_Sec_hn: + 43264 000090E4 0000 dw 0 ;AN000;seconds,hundredths + 43265 000090E6 01 db 1 ;AN000;first subst + 43266 000090E7 A5 db 0A5h ; Right_Align+TIME_HHMMSSHH_Cty + 43267 ;AC059;time + 43268 000090E8 0C db 12 ;AC059;maximum width + 43269 000090E9 0C db 12 ;AC059;minimum width + 43270 000090EA 20 db blank ; 20h ;AN000;pad character + 43271 + 43272 ; "Enter new time:" + 43273 NewTim_Ptr: + 43274 000090EB 0D04 dw 1037 ;AN000;message number + 43275 000090ED 00 db no_subst ; 0 ;AN000;number of subst + 43276 + 43277 ; ", Delete (Y/N)?",13,10 + 43278 Del_Y_N_Ptr: + 43279 000090EE 0E04 dw 1038 ;AN000;message number + 43280 000090F0 00 db no_subst ; 0 ;AN000;number of subst + 43281 + 43282 ; "All files in directory will be deleted!",13,10 + 43283 ; "Are you sure (Y/N)?",13,10 + 43284 SureMes_Ptr: + 43285 000090F1 0F04 dw 1039 ;AN000;message number + 43286 000090F3 00 db no_subst ; 0 ;AN000;number of subst + 43287 + 43288 ; "Microsoft DOS Version %1.%2",13,10 + 43289 VerMes_Ptr: + 43290 000090F4 1004 dw 1040 ;AN000;message number + 43291 + 43292 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 43293 %if 0 + 43294 db 2 ;AN000;number of subst + 43295 db parm_block_size ; 11 ;AN000;size of sublist + 43296 db 0 ;AN000;reserved + 43297 dw Major_Ver_Num ;AN000;offset of arg + 43298 dw 0 ;AN000;segment of arg + 43299 db 1 ;AN000;first subst + 43300 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43301 ;AN000;binary to decimal + 43302 db 1 ;AN000;maximum width + 43303 db 1 ;AN000;minimum width + 43304 db blank ; 20h ;AN000;pad character + 43305 db parm_block_size ; 11 ;AN000;size of sublist + 43306 db 0 ;AN000;reserved + 43307 dw Minor_Ver_Num ;AN000;offset of arg + 43308 dw 0 ;AN000;segment of arg + 43309 db 2 ;AN000;second subst + 43310 db 0A1h ; Right_Align+Unsgn_Bin_Word + 43311 ;AN000;binary to decimal + 43312 db 2 ;AN000;maximum width + 43313 db 2 ;AN000;minimum width + 43314 db '0' ; 30h ;AN000;pad character + 43315 %else + 43316 000090F6 00 db 0 ; no_subst + 43317 %endif + 43318 + 43319 ; "Volume in drive %1 has no label",13,10 + 43320 VolMes_Ptr_2: + 43321 000090F7 1104 dw 1041 ;AN000;message number + 43322 000090F9 01 db 1 ;AN000;number of subst + 43323 000090FA 0B db parm_block_size ; 11 ;AN000;size of sublist + 43324 000090FB 00 db 0 ;AN000;reserved + 43325 000090FC [B39D] dw vol_drv ;AN000;offset of drive + 43326 000090FE 0000 dw 0 ;AN000;segment of arg + 43327 00009100 01 db 1 ;AN000;first subst + 43328 00009101 00 db 0 ; Char_field_Char ;AN000;character + 43329 00009102 80 db 128 ;AN000;maximum width + 43330 00009103 01 db 1 ;AN000;minimum width + 43331 00009104 20 db blank ; 20h ;AN000;pad character + 43332 + 43333 ; "Volume in drive %1 is %2",13,10 + 43334 VolMes_Ptr: + 43335 00009105 1204 dw 1042 ;AN000;message number + 43336 00009107 02 db 2 ;AN000;number of subst + 43337 00009108 0B db parm_block_size ; 11 ;AN000;size of sublist + 43338 00009109 00 db 0 ;AN000;reserved + 43339 0000910A [B39D] dw vol_drv ;AN000;offset of drive + 43340 0000910C 0000 dw 0 ;AN000;segment of arg + 43341 0000910E 01 db 1 ;AN000;first subst + 43342 0000910F 00 db 00000000b ;AN000;character + 43343 00009110 80 db 128 ;AN000;maximum width + 43344 00009111 01 db 1 ;AN000;minimum width + 43345 00009112 20 db blank ; 20h ;AN000;pad character + 43346 00009113 0B db parm_block_size ; 11 ;AN000;size of sublist + 43347 00009114 00 db 0 ;AN000;reserved + 43348 00009115 [6A9C] dw CHARBUF ;AN000;offset of string + 43349 00009117 0000 dw 0 ;AN000;segment of arg + 43350 00009119 02 db 2 ;AN000;second subst + 43351 0000911A 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43352 0000911B 80 db 128 ;AN000;maximum width + 43353 0000911C 01 db 1 ;AN000;minimum width + 43354 0000911D 20 db blank ; 20h ;AN000;pad character + 43355 + 43356 ; "Volume Serial Number is %1-%2",13,10 + 43357 VolSerMes_Ptr: + 43358 0000911E 1304 dw 1043 ;AN000;message number + 43359 00009120 02 db 2 ;AN000;number of subst + 43360 00009121 0B db parm_block_size ; 11 ;AN000;size of sublist + 43361 00009122 00 db 0 ;AN000;reserved + 43362 00009123 [1D9F] dw vol_serial+2 ;AN000;offset of serial + 43363 00009125 0000 dw 0 ;AN000;segment of arg + 43364 00009127 01 db 1 ;AN000;first subst + 43365 00009128 A3 db 0A3h ; Right_Align+Bin_Hex_Word + 43366 ;AN000;binary to hex + 43367 00009129 04 db 4 ;AN000;maximum width + 43368 0000912A 04 db 4 ;AN000;minimum width + 43369 0000912B 30 db '0' ; 30h ;AN000;pad character + 43370 0000912C 0B db parm_block_size ; 11 ;AN000;size of sublist + 43371 0000912D 00 db 0 ;AN000;reserved + 43372 0000912E [1B9F] dw vol_serial ;AN000;offset of serial + 43373 00009130 0000 dw 0 ;AN000;segment of arg + 43374 00009132 02 db 2 ;AN000;second subst + 43375 00009133 A3 db 0A3h ; Right_Align+Bin_Hex_Word + 43376 ;AN000;binary to hex + 43377 00009134 04 db 4 ;AN000;maximum width + 43378 00009135 04 db 4 ;AN000;minimum width + 43379 00009136 30 db '0' ; 30h ;AN000;pad character + 43380 + 43381 ; "Invalid directory",13,10 + 43382 badcd_ptr: + 43383 00009137 1404 dw 1044 ;AN000;message number + 43384 00009139 00 db no_subst ; 0 ;AN000;number of subst + 43385 + 43386 ; "Unable to create directory",13,10 + 43387 badmkd_ptr: + 43388 0000913A 1504 dw 1045 ;AN000;message number + 43389 0000913C 00 db no_subst ; 0 ;AN000;number of subst + 43390 + 43391 ; "Invalid path, not directory,",13,10 + 43392 ; "or directory not empty",13,10 + 43393 badrmd_ptr: + 43394 0000913D 1604 dw 1046 ;AN000;message number + 43395 0000913F 00 db no_subst ; 0 ;AN000;number of subst + 43396 + 43397 ; "Must specify ON or OFF",13,10 + 43398 bad_on_off_ptr: + 43399 00009140 1704 dw 1047 ;AN000;message number + 43400 00009142 00 db no_subst ; 0 ;AN000;number of subst + 43401 + 43402 ; "Directory of %1",13,10 + 43403 dirhead_ptr: + 43404 00009143 1804 dw 1048 ;AN000;message number + 43405 00009145 01 db 1 ;AN000;number of subst + 43406 00009146 0B db parm_block_size ; 11 ;AN000;size of sublist + 43407 00009147 00 db 0 ;AN000;reserved + 43408 00009148 [399D] dw BWDBUF ;AN000;offset of arg + 43409 0000914A 0000 dw 0 ;AN000;segment of arg + 43410 0000914C 01 db 1 ;AN000;first subst + 43411 0000914D 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43412 0000914E 80 db 128 ;AN000;maximum width + 43413 0000914F 00 db 0 ;AN000;minimum width + 43414 00009150 20 db blank ; 20h ;AN000;pad character + 43415 + 43416 ; "No Path",13,10 + 43417 NULLPATH_PTR: + 43418 00009151 1904 dw 1049 ;AN000;message number + 43419 00009153 00 db no_subst ; 0 ;AN000;number of subst + 43420 + 43421 ; "Invalid drive in search path",13,10 + 43422 BADPMES_PTR: + 43423 00009154 1A04 dw 1050 ;AN000;message number + 43424 00009156 00 db no_subst ; 0 ;AN000;number of subst + 43425 + 43426 ; "Invalid device",13,10 + 43427 BADDEV_PTR: + 43428 00009157 1B04 dw 1051 ;AN000;message number + 43429 00009159 00 db no_subst ; 0 ;AN000;number of subst + 43430 + 43431 ; "FOR cannot be nested",13,10 + 43432 FORNESTMES_PTR: + 43433 0000915A 1C04 dw 1052 ;AN000;message number + 43434 0000915C 00 db no_subst ; 0 ;AN000;number of subst + 43435 + 43436 ; "Intermediate file error during pipe",13,10 + 43437 PIPEEMES_PTR: + 43438 0000915D 1D04 dw 1053 ;AN000;message number + 43439 0000915F 00 db no_subst ; 0 ;AN000;number of subst + 43440 + 43441 ; "Cannot do binary reads from a device",13,10 + 43442 INBDEV_PTR: + 43443 00009160 1E04 dw 1054 ;AN000;message number + 43444 00009162 00 db no_subst ; 0 ;AN000;number of subst + 43445 + 43446 ; "BREAK is %1",13,10 + 43447 CtrlcMes_Ptr: + 43448 00009163 1F04 dw 1055 ;AN000;message number + 43449 00009165 01 db 1 ;AN000;number of subst + 43450 00009166 0B db parm_block_size ; 11 ;AN000;size of sublist + 43451 00009167 00 db 0 ;AN000;reserved + 43452 00009168 0000 dw 0 ;AN000;offset of on/off (new) + 43453 0000916A 0000 dw 0 ;AN000;segment of arg + 43454 0000916C 01 db 1 ;AN000;first subst + 43455 0000916D 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43456 0000916E 80 db 128 ;AN000;maximum width + 43457 0000916F 01 db 1 ;AN000;minimum width + 43458 00009170 20 db blank ; 20h ;AN000;pad character + 43459 + 43460 ; "VERIFY is %1",13,10 + 43461 VeriMes_Ptr: + 43462 00009171 2004 dw 1056 ;AN000;message number + 43463 00009173 01 db 1 ;AN000;number of subst + 43464 00009174 0B db parm_block_size ; 11 ;AN000;size of sublist + 43465 00009175 00 db 0 ;AN000;reserved + 43466 00009176 0000 dw 0 ;AN000;offset of on/off (new) + 43467 00009178 0000 dw 0 ;AN000;segment of arg + 43468 0000917A 01 db 1 ;AN000;first subst + 43469 0000917B 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43470 0000917C 80 db 128 ;AN000;maximum width + 43471 0000917D 01 db 1 ;AN000;minimum width + 43472 0000917E 20 db blank ; 20h ;AN000;pad character + 43473 + 43474 ; "ECHO is %1",13,10 + 43475 EchoMes_Ptr: + 43476 0000917F 2104 dw 1057 ;AN000;message number + 43477 00009181 01 db 1 ;AN000;number of subst + 43478 00009182 0B db parm_block_size ; 11 ;AN000;size of sublist + 43479 00009183 00 db 0 ;AN000;reserved + 43480 00009184 0000 dw 0 ;AN000;offset of on/off (new) + 43481 00009186 0000 dw 0 ;AN000;segment of arg + 43482 00009188 01 db 1 ;AN000;first subst + 43483 00009189 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43484 0000918A 80 db 128 ;AN000;maximum width + 43485 0000918B 01 db 1 ;AN000;minimum width + 43486 0000918C 20 db blank ; 20h ;AN000;pad character + 43487 + 43488 ; "off" + 43489 OFFMES_PTR: + 43490 0000918D 2304 dw 1059 ;AN000;message number + 43491 0000918F 00 db no_subst ;AN000;number of subst + 43492 ; "on" + 43493 ONMES_PTR: + 43494 00009190 2404 dw 1060 ;AN000;message number + 43495 00009192 00 db no_subst ; 0 ;AN000;number of subst + 43496 + 43497 ; "Error writing to device",13,10 + 43498 DEVWMES_PTR: + 43499 00009193 2504 dw 1061 ;AN000;message number + 43500 00009195 00 db no_subst ; 0 ;AN000;number of subst + 43501 + 43502 ; "Invalid path",13,10 + 43503 INVAL_PATH_PTR: + 43504 00009196 2604 dw 1062 ;AN000;message number + 43505 00009198 00 db no_subst ; 0 ;AN000;number of subst + 43506 + 43507 ; unformatted string output + 43508 arg_buf_ptr: + 43509 00009199 2704 dw 1063 ;AN000;message number + 43510 0000919B 01 db 1 ;AN000;number of subst + 43511 0000919C 0B db parm_block_size ; 11 ;AN000;size of sublist + 43512 0000919D 00 db 0 ;AN000;reserved + 43513 0000919E [96A3] dw Arg_Buf ;AN000;offset of arg + 43514 000091A0 0000 dw 0 ;AN000;segment of arg + 43515 000091A2 01 db 1 ;AN000;first subst + 43516 000091A3 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43517 000091A4 80 db 128 ;AN000;maximum width + 43518 000091A5 00 db 0 ;AN000;minimum width + 43519 000091A6 20 db blank ; 20h ;AN000;pad character + 43520 + 43521 ; file name output + 43522 file_name_ptr: + 43523 000091A7 2804 dw 1064 ;AN000;message number + 43524 000091A9 01 db 1 ;AN000;number of subst + 43525 000091AA 0B db parm_block_size ; 11 ;AN000;size of sublist + 43526 000091AB 00 db 0 ;AN000;reserved + 43527 000091AC [219E] dw SrcBuf ;AN000;offset of arg + 43528 000091AE 0000 dw 0 ;AN000;segment of arg + 43529 000091B0 01 db 1 ;AN000;first subst + 43530 000091B1 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43531 000091B2 80 db 128 ;AN000;maximum width + 43532 000091B3 00 db 0 ;AN000;minimum width + 43533 000091B4 20 db blank ; 20h ;AN000;pad character 43534 - 43535 ; file size output for dir - 43536 disp_file_size_ptr: - 43537 dw 1065 ;AN000;message number - 43538 db 1 ;AN000;number of subst - 43539 db parm_block_size ; 11 ;AN000;size of sublist - 43540 db 0 ;AN000;reserved - 43541 dw File_Size_Low ;AN000;offset of arg - 43542 dw 0 ;AN000;segment of arg - 43543 db 1 ;AN000;first subst - 43544 ; MSDOS 5.0 COMMAND.COM - 43545 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43546 ; 17/06/2023 - 43547 screen_f_1: - 43548 db 0F1h ; MSDOS 6.22 COMMAND.COM - 43549 ;AN000;long binary to decimal - 43550 ; MSDOS 5.0 COMMAND.COM - 43551 ;db 10 ;AN000;maximum width - 43552 ;db 10 ;AN000;minimum width - 43553 screen_f_2: - 43554 db 14 ; MSDOS 6.22 COMMAND.COM - 43555 db 14 - 43556 - 43557 db blank ; 20h ;AN000;pad character - 43558 %else - 43559 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 43560 ; PCDOS 7.1 COMMAND.COM - 43561 disp_file_size_ptr: - 43562 000091B5 2904 dw 1065 - 43563 000091B7 01 db 1 - 43564 000091B8 0B db 11 - 43565 000091B9 00 db 0 - 43566 000091BA [9C9D] dw File_Size_Low - 43567 000091BC 0000 dw 0 - 43568 000091BE 01 db 1 - 43569 000091BF F1 db 0F1h - 43570 000091C0 0C db 12 - 43571 000091C1 0C db 12 - 43572 000091C2 20 db 20h - 43573 disp_file_size_w_ptr: - 43574 000091C3 2904 dw 1065 - 43575 000091C5 01 db 1 - 43576 000091C6 0B db 11 - 43577 000091C7 00 db 0 - 43578 000091C8 [9C9D] dw File_Size_Low - 43579 000091CA 0000 dw 0 - 43580 000091CC 01 db 1 - 43581 000091CD F1 db 0F1h ; long binary to decimal - 43582 000091CE 0E db 14 - 43583 000091CF 0E db 14 - 43584 000091D0 20 db 20h - 43585 disp_file_size_n_ptr: - 43586 000091D1 2904 dw 1065 - 43587 000091D3 01 db 1 - 43588 000091D4 0B db 11 - 43589 000091D5 00 db 0 - 43590 000091D6 [9C9D] dw File_Size_Low - 43591 000091D8 0000 dw 0 - 43592 000091DA 01 db 1 - 43593 000091DB B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43594 000091DC 0A db 10 - 43595 000091DD 0A db 10 - 43596 000091DE 20 db 20h - 43597 %endif - 43598 - 43599 ; unformatted string output - 43600 ; %s - 43601 string_buf_ptr: - 43602 000091DF 2A04 dw 1066 ;AN000;message number - 43603 000091E1 01 db 1 ;AN000;number of subst - 43604 000091E2 0B db parm_block_size ;AN000;size of sublist - 43605 000091E3 00 db 0 ;AN000;reserved - 43606 000091E4 [A09D] dw string_ptr_2 ;AN000;offset of arg - 43607 000091E6 0000 dw 0 ;AN000;segment of arg - 43608 000091E8 01 db 1 ;AN000;first subst - 43609 000091E9 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43610 000091EA 80 db 128 ;AN000;maximum width - 43611 000091EB 00 db 0 ;AN000;minimum width - 43612 000091EC 20 db blank ; 20h ;AN000;pad character - 43613 000091ED 00 db 0 ;AN000; - 43614 - 43615 ; tab character - 43616 tab_ptr: - 43617 000091EE 2B04 dw 1067 ;AN000;message number - 43618 000091F0 00 db no_subst ; 0 ;AN000;number of subst - 43619 - 43620 ; " " - 43621 dmes_ptr: - 43622 000091F1 2C04 dw 1068 ;AN000;message number - 43623 000091F3 00 db no_subst ; 0 ;AN000;number of subst - 43624 - 43625 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 43626 space_4_ptr : - 43627 000091F4 5104 dw 1105 - 43628 000091F6 00 db no_subst ; 0 - 43629 - 43630 ; destructive back space - 43631 dback_ptr: - 43632 000091F7 2D04 dw 1069 ;AN000;message number - 43633 000091F9 00 db no_subst ; 0 ;AN000;number of subst - 43634 - 43635 ; carriage return / line feed - 43636 acrlf_ptr: - 43637 000091FA 2E04 dw 1070 ;AN000;message number - 43638 000091FC 00 db no_subst ; 0 ;AN000;number of subst - 43639 - 43640 ; "mm-dd-yy" - 43641 usadat_ptr: - 43642 000091FD 3004 dw 1072 ;AN000;message number - 43643 000091FF 00 db no_subst ; 0 ;AN000;number of subst - 43644 - 43645 ; "dd-mm-yy" - 43646 eurdat_ptr: - 43647 00009200 3104 dw 1073 ;AN000;message number - 43648 00009202 00 db no_subst ; 0 ;AN000;number of subst - 43649 - 43650 ; "yy-mm-dd" - 43651 japdat_ptr: - 43652 00009203 3204 dw 1074 ;AN000;message number - 43653 00009205 00 db no_subst ; 0 ;AN000;number of subst - 43654 - 43655 ; date string for prompt - 43656 promptdat_ptr: - 43657 00009206 3304 dw 1075 ;AN000;message number - 43658 00009208 02 db 2 ;AN000;number of subst - 43659 00009209 0B db parm_block_size ; 11 ;AN000;size of sublist - 43660 0000920A 00 db 0 ;AN000;reserved - 43661 0000920B [96A3] dw Arg_Buf ;AN000;offset of arg - 43662 0000920D 0000 dw 0 ;AN000;segment of arg - 43663 0000920F 01 db 1 ;AN000;first subst - 43664 00009210 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43665 00009211 03 db 3 ;AN000;maximum width - 43666 00009212 03 db 3 ;AN000;minimum width - 43667 00009213 20 db blank ; 20h ;AN000;pad character - 43668 00009214 0B db parm_block_size ; 11 ;AN000;size of sublist - 43669 00009215 00 db 0 ;AN000;reserved - 43670 promptDat_yr: - 43671 00009216 0000 dw 0 ;AN000;year - 43672 promptDat_moday: - 43673 00009218 0000 dw 0 ;AN000;month,day - 43674 0000921A 02 db 2 ;AN000;second subst - 43675 0000921B 34 db 34h ; DATE_MDY_4 ;AN000;date - 43676 0000921C 0A db 10 ;AN000;maximum width - 43677 0000921D 08 db 8 ;AN000;minimum width - 43678 0000921E 20 db blank ; 20h ;AN000;pad character - 43679 - 43680 ; Time for prompt - 43681 promtim_ptr: - 43682 0000921F 3404 dw 1076 ;AN000;message number - 43683 00009221 01 db 1 ;AN000;number of subst - 43684 00009222 0B db parm_block_size ; 11 ;AN000;size of sublist - 43685 00009223 00 db 0 ;AN000;reserved - 43686 PromTim_hr_min: - 43687 00009224 0000 dw 0 ;AN000;hours,minutes - 43688 PromTim_Sec_hn: - 43689 00009226 0000 dw 0 ;AN000;seconds,hundredths - 43690 00009228 01 db 1 ;AN000;first subst - 43691 00009229 A6 db 0A6h ; Right_Align+TIME_HHMMSSHH_24 - 43692 ;AC013;time - 43693 0000922A 0B db 11 ;AN000;maximum width - 43694 0000922B 0B db 11 ;AC013;minimum width - 43695 0000922C 20 db blank ; 20h ;AN000;pad character - 43696 - 43697 ; Date and time for DIR - 43698 dirdattim_ptr: - 43699 0000922D 3504 dw 1077 ;AN000;message number - 43700 0000922F 02 db 2 ;AN000;number of subst - 43701 00009230 0B db parm_block_size ; 11 ;AN000;size of sublist - 43702 00009231 00 db 0 ;AN000;reserved - 43703 DirDat_Yr: - 43704 00009232 0000 dw 0 ;AN000;year - 43705 DirDat_Mo_Day: - 43706 00009234 0000 dw 0 ;AN000;month,day - 43707 00009236 01 db 1 ;AN000;first subst - 43708 DirDat_form: ; 03/08/2024 - PCDOS 7.1 - 43709 00009237 A4 db 0A4h ; Right_Align+DATE_MDY_2 - 43710 ;AN000;date - 43711 DirDat_width: ; 03/08/2024 - PCDOS 7.1 - 43712 00009238 0A db 10 ;AN000;maximum width - 43713 00009239 08 db 8 ;AN000;minimum width - 43714 0000923A 20 db blank ; 20h ;AN000;pad character - 43715 0000923B 0B db parm_block_size ; 11 ;AN000;size of sublist - 43716 0000923C 00 db 0 ;AN000;reserved - 43717 DirTim_Hr_Min: - 43718 0000923D 0000 dw 0 ;AN000;hours,minutes - 43719 DirTim_Sec_hn: - 43720 0000923F 0000 dw 0 ;AN000;seconds,hundredths - 43721 00009241 02 db 2 ;AN000;second subst - 43722 00009242 85 db 85h ; Right_align+TIME_HHMM_Cty - 43723 ;AN000;time - 43724 00009243 06 db 6 ;AN000;maximum width - 43725 00009244 06 db 6 ;AN000;minimum width - 43726 00009245 20 db blank ; 20h ;AN000;pad character - 43727 - 43728 ; "Directory already exists" - 43729 MD_EXISTS_PTR: - 43730 00009246 3604 dw 1078 ;AN000;message number - 43731 00009248 00 db no_subst ;AN000;number of subst - 43732 - 43733 ; "%1 bytes",13,10 - 43734 - 43735 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 43736 %if 0 - 43737 bytes_ptr: - 43738 dw 1079 ; message number - 43739 db 1 ; number of subst - 43740 db parm_block_size ; 11 ; size of sublist - 43741 db 0 ; reserved - 43742 dw FileSiz ; offset of arg - 43743 dw 0 ; segment of arg - 43744 db 1 ; first subst - 43745 ; MSDOS 5.0 COMMAND.COM - 43746 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord - 43747 ; 17/06/2023 - 43748 screen_f_4: - 43749 db 0F1h ; MSDOS 6.22 COMMAND.COM - 43750 ; long binary to decimal - 43751 ; MSDOS 5.0 COMMAND.COM - 43752 ;db 10 ; maximum width - 43753 ;db 10 ; minimum width - 43754 screen_f_5: - 43755 db 14 ; MSDOS 6.22 COMMAND.COM - 43756 db 14 - 43757 db blank ; 20h ; pad character - 43758 %else - 43759 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 43760 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9718h - 43761 bytes_ptr: - 43762 00009249 3704 dw 1079 - 43763 0000924B 01 db 1 - 43764 0000924C 0B db 11 - 43765 0000924D 00 db 0 - 43766 0000924E [229C] dw FileSiz - 43767 00009250 0000 dw 0 - 43768 00009252 01 db 1 - 43769 00009253 F1 db 0F1h - 43770 00009254 0C db 12 - 43771 00009255 0C db 12 - 43772 00009256 20 db 20h - 43773 bytes_w_tr: - 43774 00009257 3704 dw 1079 - 43775 00009259 01 db 1 - 43776 0000925A 0B db 11 - 43777 0000925B 00 db 0 - 43778 0000925C [229C] dw FileSiz - 43779 0000925E 0000 dw 0 - 43780 00009260 01 db 1 - 43781 00009261 F1 db 0F1h - 43782 00009262 0E db 14 - 43783 00009263 0E db 14 - 43784 00009264 20 db 20h - 43785 bytes_n_ptr: - 43786 00009265 3704 dw 1079 - 43787 00009267 01 db 1 - 43788 00009268 0B db 11 - 43789 00009269 00 db 0 - 43790 0000926A B1 db 0B1h - 43791 0000926B A0 db 160 - 43792 0000926C 00 db 0 - 43793 0000926D 00 db 0 - 43794 0000926E 01 db 1 - 43795 0000926F B1 db 0B1h - 43796 00009270 0A db 10 - 43797 00009271 0A db 10 - 43798 00009272 20 db 20h - 43799 kbytes_ptr: - 43800 00009273 5304 dw 1107 - 43801 00009275 01 db 1 - 43802 00009276 0B db 11 - 43803 00009277 00 db 0 - 43804 00009278 B1 db 0B1h - 43805 00009279 A0 db 160 - 43806 0000927A 00 db 0 - 43807 0000927B 00 db 0 - 43808 0000927C 01 db 1 - 43809 0000927D F1 db 0F1h - 43810 0000927E 0E db 14 - 43811 0000927F 0E db 14 - 43812 00009280 20 db 20h - 43813 kybytes_n_ptr: - 43814 00009281 5304 dw 1107 - 43815 00009283 01 db 1 - 43816 00009284 0B db 11 - 43817 00009285 00 db 0 - 43818 00009286 [229C] dw FileSiz - 43819 00009288 0000 dw 0 - 43820 0000928A 01 db 1 - 43821 0000928B B1 db 0B1h - 43822 0000928C 0A db 10 - 43823 0000928D 0A db 10 - 43824 0000928E 20 db 20h - 43825 %endif - 43826 - 43827 ; "Total:",13,10 - 43828 total_ptr: - 43829 0000928F 3804 dw 1080 ; message number - 43830 00009291 00 db no_subst ; 0 ; number of subst - 43831 - 43832 ; "Error parsing environment variable:",13,10 - 43833 errparsenv_ptr: - 43834 00009292 3904 dw 1081 ; message number - 43835 00009294 00 db no_subst ; 0 ; number of subst - 43836 - 43837 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 43838 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:996Ah) - 43839 cox_Y_quest_ptr: - 43840 00009295 3A04 dw 1082 - 43841 00009297 00 db no_subst ; 0 - 43842 cox_Y_answ_ptr: - 43843 00009298 3B04 dw 1083 - 43844 0000929A 00 db no_subst ; 0 - 43845 - 43846 ; "(continuing %1)",13,10 - 43847 dircont_ptr: - 43848 0000929B 3C04 dw 1084 ;AN000;message number - 43849 0000929D 01 db 1 ;AN000;number of subst - 43850 0000929E 0B db parm_block_size ; 11 ;AN000;size of sublist - 43851 0000929F 00 db 0 ;AN000;reserved - 43852 000092A0 [399D] dw BWDBUF ;AN000;offset of arg - 43853 000092A2 0000 dw 0 ;AN000;segment of arg - 43854 000092A4 01 db 1 ;AN000;first subst - 43855 000092A5 10 db 10h ; Char_field_ASCIIZ ;AN000;character string - 43856 000092A6 80 db 128 ;AN000;maximum width - 43857 000092A7 00 db 0 ;AN000;minimum width - 43858 000092A8 20 db blank ; 20h ;AN000;pad character - 43859 - 43860 ; "Revision %1",CR,LF - 43861 dosrev_ptr: - 43862 000092A9 4204 dw 1090 - 43863 000092AB 01 db 1 ; one substitution - 43864 000092AC 0B db parm_block_size ; 11 - 43865 000092AD 00 db 0 - 43866 000092AE [B19D] dw One_Char_Val ; ptr to char - 43867 000092B0 0000 dw 0 ; segment addr? - 43868 000092B2 01 db 1 ; 1st substitution - 43869 000092B3 00 db 0 ; CHAR_FIELD_CHAR ; character - 43870 000092B4 01 db 1 ; max width - 43871 000092B5 01 db 1 ; min width - 43872 000092B6 20 db blank ; 20h ; pad char - 43873 - 43874 ; "DOS is in ROM" - 43875 DosRom_Ptr: - 43876 000092B7 4304 dw 1091 - 43877 000092B9 00 db no_subst ; 0 - 43878 - 43879 ; "DOS is in HMA" - 43880 DosHma_Ptr: - 43881 000092BA 4404 dw 1092 - 43882 000092BC 00 db no_subst ; 0 - 43883 - 43884 ; "DOS is in low memory" - 43885 DosLow_Ptr: - 43886 000092BD 4504 dw 1093 - 43887 000092BF 00 db no_subst ; 0 - 43888 - 43889 ; "Cannot Loadhigh batch file" ;M016 - 43890 NoExecBat_Ptr: - 43891 000092C0 4604 dw 1094 ; M016 - 43892 000092C2 00 db no_subst ; 0 ; M016 - 43893 - 43894 ; "LoadHigh: Invalid filename" ; M016 - 43895 LhInvFil_Ptr: - 43896 000092C3 4704 dw 1095 ; M016 - 43897 000092C5 00 db no_subst ; 0 ; M016 - 43898 - 43899 ; "Could not open specified country information file" ; M045 - 43900 NoCntry_Ptr: - 43901 000092C6 4804 dw 1096 ; M045 - 43902 000092C8 00 db no_subst ; 0 ; M045 - 43903 - 43904 ; 15/04/2023 - 43905 ; MSDOS 6.0 COMMAND.COM only ! - 43906 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 43907 ;%if 0 - 43908 - 43909 ;* The next four errors emulate those reported by the normal parse - 43910 ; mechanism, with a little more accurate wording; that parser has been - 43911 ; replaced with a custom routine (ParseVar) for LoadHigh and DeviceHigh. - 43912 ; These errors aren't normally generated by LoadHigh except by the normal - 43913 ; parser, so they've been added here. - 43914 - 43915 ; "LoadHigh: Invalid argument" - 43916 LhInvArg_Ptr: - 43917 000092C9 4904 dw 1097 - 43918 000092CB 00 db no_subst ; 0 - 43919 - 43920 ; "Required parameter missing" - 43921 ReqParmMiss: - 43922 000092CC 4A04 dw 1098 - 43923 000092CE 00 db no_subst ; 0 - 43924 - 43925 ; "Unrecognized switch" - 43926 LhInvSwt_Ptr: - 43927 000092CF 4B04 dw 1099 - 43928 000092D1 00 db no_subst ; 0 - 43929 - 43930 ; "A bad UMB number has been specified" - 43931 LhBadUMB_Ptr: - 43932 000092D2 4C04 dw 1100 - 43933 000092D4 00 db no_subst ; 0 - 43934 ;%endif - 43935 - 43936 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 43937 %if 0 - 43938 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 43939 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99AAh - 43940 - 43941 DirCompRatio_Ptr: - 43942 dw 1101 ;message number - 43943 db 2 ;number of subst - 43944 db parm_block_size ; 11 ;size of sublist - 43945 db 0 ;reserved - 43946 dw Dir_CRatio_1 ;offset of arg - 43947 dw 0 ;segment of arg - 43948 db 1 ;first subst - 43949 db 91h ;format - 43950 db 2 ;maximum width - 43951 db 2 ;minimum width - 43952 db blank ; 20h ;pad character - 43953 db parm_block_size ; 11 ;size of sublist - 43954 db 0 ; reserved - 43955 dw Dir_CRatio_2 ;offset of arg - 43956 dw 0 ;segment of arg - 43957 db 2 ;second subst - 43958 db 11h ;format - 43959 db 1 ;maximum width - 43960 db 1 ;minimum width - 43961 db blank ; 20h ;pad character - 43962 - 43963 AveCompRatio_Ptr: - 43964 dw 1102 ;message number - 43965 db 2 ;number of subst - 43966 db parm_block_size ; 11 ;size of sublist - 43967 db 0 ;reserved - 43968 dw Dir_CRatio_1 ;offset of arg - 43969 dw 0 ;segment of arg - 43970 db 1 ;first subst - 43971 db 91h ;format - 43972 db 2 ;maximum width - 43973 db 2 ;minimum width - 43974 db blank ; 20h ;pad character - 43975 db parm_block_size ; 11 ;size of sublist - 43976 db 0 ; reserved - 43977 dw Dir_CRatio_2 ;offset of arg - 43978 dw 0 ;segment of arg - 43979 db 2 ;second subst - 43980 db 11h ;format - 43981 db 1 ;maximum width - 43982 db 1 ;minimum width - 43983 db blank ; 20h ;pad character - 43984 %else - 43985 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 43986 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:97A4h - 43987 kbytesf_ptr: - 43988 000092D5 5204 dw 1106 - 43989 000092D7 01 db 1 - 43990 000092D8 0B db 11 - 43991 000092D9 00 db 0 - 43992 000092DA [A99D] dw Bytes_Free - 43993 000092DC 0000 dw 0 - 43994 000092DE 01 db 1 - 43995 000092DF F1 db 0F1h ; long binary to decimal - 43996 000092E0 1E db 30 - 43997 000092E1 1E db 30 - 43998 000092E2 20 db 20h - 43999 kbytesf_n_ptr: - 44000 000092E3 5204 dw 1106 - 44001 000092E5 01 db 1 - 44002 000092E6 0B db 11 - 44003 000092E7 00 db 0 - 44004 000092E8 [A99D] dw Bytes_Free - 44005 000092EA 0000 dw 0 - 44006 000092EC 01 db 1 - 44007 000092ED B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord - 44008 000092EE 1C db 28 - 44009 000092EF 1C db 28 - 44010 000092F0 20 db 20h - 44011 %endif - 44012 - 44013 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 44014 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8483h + 43535 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 43536 %if 0 + 43537 + 43538 ; file size output for dir + 43539 disp_file_size_ptr: + 43540 dw 1065 ;AN000;message number + 43541 db 1 ;AN000;number of subst + 43542 db parm_block_size ; 11 ;AN000;size of sublist + 43543 db 0 ;AN000;reserved + 43544 dw File_Size_Low ;AN000;offset of arg + 43545 dw 0 ;AN000;segment of arg + 43546 db 1 ;AN000;first subst + 43547 ; MSDOS 5.0 COMMAND.COM + 43548 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43549 ; 17/06/2023 + 43550 screen_f_1: + 43551 db 0F1h ; MSDOS 6.22 COMMAND.COM + 43552 ;AN000;long binary to decimal + 43553 ; MSDOS 5.0 COMMAND.COM + 43554 ;db 10 ;AN000;maximum width + 43555 ;db 10 ;AN000;minimum width + 43556 screen_f_2: + 43557 db 14 ; MSDOS 6.22 COMMAND.COM + 43558 db 14 + 43559 + 43560 db blank ; 20h ;AN000;pad character + 43561 %else + 43562 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 43563 ; PCDOS 7.1 COMMAND.COM + 43564 disp_file_size_ptr: + 43565 000091B5 2904 dw 1065 + 43566 000091B7 01 db 1 + 43567 000091B8 0B db 11 + 43568 000091B9 00 db 0 + 43569 000091BA [9C9D] dw File_Size_Low + 43570 000091BC 0000 dw 0 + 43571 000091BE 01 db 1 + 43572 000091BF F1 db 0F1h + 43573 000091C0 0C db 12 + 43574 000091C1 0C db 12 + 43575 000091C2 20 db 20h + 43576 disp_file_size_w_ptr: + 43577 000091C3 2904 dw 1065 + 43578 000091C5 01 db 1 + 43579 000091C6 0B db 11 + 43580 000091C7 00 db 0 + 43581 000091C8 [9C9D] dw File_Size_Low + 43582 000091CA 0000 dw 0 + 43583 000091CC 01 db 1 + 43584 000091CD F1 db 0F1h ; long binary to decimal + 43585 000091CE 0E db 14 + 43586 000091CF 0E db 14 + 43587 000091D0 20 db 20h + 43588 disp_file_size_n_ptr: + 43589 000091D1 2904 dw 1065 + 43590 000091D3 01 db 1 + 43591 000091D4 0B db 11 + 43592 000091D5 00 db 0 + 43593 000091D6 [9C9D] dw File_Size_Low + 43594 000091D8 0000 dw 0 + 43595 000091DA 01 db 1 + 43596 000091DB B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43597 000091DC 0A db 10 + 43598 000091DD 0A db 10 + 43599 000091DE 20 db 20h + 43600 %endif + 43601 + 43602 ; unformatted string output + 43603 ; %s + 43604 string_buf_ptr: + 43605 000091DF 2A04 dw 1066 ;AN000;message number + 43606 000091E1 01 db 1 ;AN000;number of subst + 43607 000091E2 0B db parm_block_size ;AN000;size of sublist + 43608 000091E3 00 db 0 ;AN000;reserved + 43609 000091E4 [A09D] dw string_ptr_2 ;AN000;offset of arg + 43610 000091E6 0000 dw 0 ;AN000;segment of arg + 43611 000091E8 01 db 1 ;AN000;first subst + 43612 000091E9 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43613 000091EA 80 db 128 ;AN000;maximum width + 43614 000091EB 00 db 0 ;AN000;minimum width + 43615 000091EC 20 db blank ; 20h ;AN000;pad character + 43616 000091ED 00 db 0 ;AN000; + 43617 + 43618 ; tab character + 43619 tab_ptr: + 43620 000091EE 2B04 dw 1067 ;AN000;message number + 43621 000091F0 00 db no_subst ; 0 ;AN000;number of subst + 43622 + 43623 ; " " + 43624 dmes_ptr: + 43625 000091F1 2C04 dw 1068 ;AN000;message number + 43626 000091F3 00 db no_subst ; 0 ;AN000;number of subst + 43627 + 43628 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 43629 space_4_ptr : + 43630 000091F4 5104 dw 1105 + 43631 000091F6 00 db no_subst ; 0 + 43632 + 43633 ; destructive back space + 43634 dback_ptr: + 43635 000091F7 2D04 dw 1069 ;AN000;message number + 43636 000091F9 00 db no_subst ; 0 ;AN000;number of subst + 43637 + 43638 ; carriage return / line feed + 43639 acrlf_ptr: + 43640 000091FA 2E04 dw 1070 ;AN000;message number + 43641 000091FC 00 db no_subst ; 0 ;AN000;number of subst + 43642 + 43643 ; "mm-dd-yy" + 43644 usadat_ptr: + 43645 000091FD 3004 dw 1072 ;AN000;message number + 43646 000091FF 00 db no_subst ; 0 ;AN000;number of subst + 43647 + 43648 ; "dd-mm-yy" + 43649 eurdat_ptr: + 43650 00009200 3104 dw 1073 ;AN000;message number + 43651 00009202 00 db no_subst ; 0 ;AN000;number of subst + 43652 + 43653 ; "yy-mm-dd" + 43654 japdat_ptr: + 43655 00009203 3204 dw 1074 ;AN000;message number + 43656 00009205 00 db no_subst ; 0 ;AN000;number of subst + 43657 + 43658 ; date string for prompt + 43659 promptdat_ptr: + 43660 00009206 3304 dw 1075 ;AN000;message number + 43661 00009208 02 db 2 ;AN000;number of subst + 43662 00009209 0B db parm_block_size ; 11 ;AN000;size of sublist + 43663 0000920A 00 db 0 ;AN000;reserved + 43664 0000920B [96A3] dw Arg_Buf ;AN000;offset of arg + 43665 0000920D 0000 dw 0 ;AN000;segment of arg + 43666 0000920F 01 db 1 ;AN000;first subst + 43667 00009210 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43668 00009211 03 db 3 ;AN000;maximum width + 43669 00009212 03 db 3 ;AN000;minimum width + 43670 00009213 20 db blank ; 20h ;AN000;pad character + 43671 00009214 0B db parm_block_size ; 11 ;AN000;size of sublist + 43672 00009215 00 db 0 ;AN000;reserved + 43673 promptDat_yr: + 43674 00009216 0000 dw 0 ;AN000;year + 43675 promptDat_moday: + 43676 00009218 0000 dw 0 ;AN000;month,day + 43677 0000921A 02 db 2 ;AN000;second subst + 43678 0000921B 34 db 34h ; DATE_MDY_4 ;AN000;date + 43679 0000921C 0A db 10 ;AN000;maximum width + 43680 0000921D 08 db 8 ;AN000;minimum width + 43681 0000921E 20 db blank ; 20h ;AN000;pad character + 43682 + 43683 ; Time for prompt + 43684 promtim_ptr: + 43685 0000921F 3404 dw 1076 ;AN000;message number + 43686 00009221 01 db 1 ;AN000;number of subst + 43687 00009222 0B db parm_block_size ; 11 ;AN000;size of sublist + 43688 00009223 00 db 0 ;AN000;reserved + 43689 PromTim_hr_min: + 43690 00009224 0000 dw 0 ;AN000;hours,minutes + 43691 PromTim_Sec_hn: + 43692 00009226 0000 dw 0 ;AN000;seconds,hundredths + 43693 00009228 01 db 1 ;AN000;first subst + 43694 00009229 A6 db 0A6h ; Right_Align+TIME_HHMMSSHH_24 + 43695 ;AC013;time + 43696 0000922A 0B db 11 ;AN000;maximum width + 43697 0000922B 0B db 11 ;AC013;minimum width + 43698 0000922C 20 db blank ; 20h ;AN000;pad character + 43699 + 43700 ; Date and time for DIR + 43701 dirdattim_ptr: + 43702 0000922D 3504 dw 1077 ;AN000;message number + 43703 0000922F 02 db 2 ;AN000;number of subst + 43704 00009230 0B db parm_block_size ; 11 ;AN000;size of sublist + 43705 00009231 00 db 0 ;AN000;reserved + 43706 DirDat_Yr: + 43707 00009232 0000 dw 0 ;AN000;year + 43708 DirDat_Mo_Day: + 43709 00009234 0000 dw 0 ;AN000;month,day + 43710 00009236 01 db 1 ;AN000;first subst + 43711 DirDat_form: ; 03/08/2024 - PCDOS 7.1 + 43712 00009237 A4 db 0A4h ; Right_Align+DATE_MDY_2 + 43713 ;AN000;date + 43714 DirDat_width: ; 03/08/2024 - PCDOS 7.1 + 43715 00009238 0A db 10 ;AN000;maximum width + 43716 00009239 08 db 8 ;AN000;minimum width + 43717 0000923A 20 db blank ; 20h ;AN000;pad character + 43718 0000923B 0B db parm_block_size ; 11 ;AN000;size of sublist + 43719 0000923C 00 db 0 ;AN000;reserved + 43720 DirTim_Hr_Min: + 43721 0000923D 0000 dw 0 ;AN000;hours,minutes + 43722 DirTim_Sec_hn: + 43723 0000923F 0000 dw 0 ;AN000;seconds,hundredths + 43724 00009241 02 db 2 ;AN000;second subst + 43725 00009242 85 db 85h ; Right_align+TIME_HHMM_Cty + 43726 ;AN000;time + 43727 00009243 06 db 6 ;AN000;maximum width + 43728 00009244 06 db 6 ;AN000;minimum width + 43729 00009245 20 db blank ; 20h ;AN000;pad character + 43730 + 43731 ; "Directory already exists" + 43732 MD_EXISTS_PTR: + 43733 00009246 3604 dw 1078 ;AN000;message number + 43734 00009248 00 db no_subst ;AN000;number of subst + 43735 + 43736 ; "%1 bytes",13,10 + 43737 + 43738 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 43739 %if 0 + 43740 bytes_ptr: + 43741 dw 1079 ; message number + 43742 db 1 ; number of subst + 43743 db parm_block_size ; 11 ; size of sublist + 43744 db 0 ; reserved + 43745 dw FileSiz ; offset of arg + 43746 dw 0 ; segment of arg + 43747 db 1 ; first subst + 43748 ; MSDOS 5.0 COMMAND.COM + 43749 ;db 0B1h ; Right_Align+Unsgn_Bin_DWord + 43750 ; 17/06/2023 + 43751 screen_f_4: + 43752 db 0F1h ; MSDOS 6.22 COMMAND.COM + 43753 ; long binary to decimal + 43754 ; MSDOS 5.0 COMMAND.COM + 43755 ;db 10 ; maximum width + 43756 ;db 10 ; minimum width + 43757 screen_f_5: + 43758 db 14 ; MSDOS 6.22 COMMAND.COM + 43759 db 14 + 43760 db blank ; 20h ; pad character + 43761 %else + 43762 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 43763 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9718h + 43764 bytes_ptr: + 43765 00009249 3704 dw 1079 + 43766 0000924B 01 db 1 + 43767 0000924C 0B db 11 + 43768 0000924D 00 db 0 + 43769 0000924E [229C] dw FileSiz + 43770 00009250 0000 dw 0 + 43771 00009252 01 db 1 + 43772 00009253 F1 db 0F1h + 43773 00009254 0C db 12 + 43774 00009255 0C db 12 + 43775 00009256 20 db 20h + 43776 bytes_w_tr: + 43777 00009257 3704 dw 1079 + 43778 00009259 01 db 1 + 43779 0000925A 0B db 11 + 43780 0000925B 00 db 0 + 43781 0000925C [229C] dw FileSiz + 43782 0000925E 0000 dw 0 + 43783 00009260 01 db 1 + 43784 00009261 F1 db 0F1h + 43785 00009262 0E db 14 + 43786 00009263 0E db 14 + 43787 00009264 20 db 20h + 43788 bytes_n_ptr: + 43789 00009265 3704 dw 1079 + 43790 00009267 01 db 1 + 43791 00009268 0B db 11 + 43792 00009269 00 db 0 + 43793 0000926A B1 db 0B1h + 43794 0000926B A0 db 160 + 43795 0000926C 00 db 0 + 43796 0000926D 00 db 0 + 43797 0000926E 01 db 1 + 43798 0000926F B1 db 0B1h + 43799 00009270 0A db 10 + 43800 00009271 0A db 10 + 43801 00009272 20 db 20h + 43802 kbytes_ptr: + 43803 00009273 5304 dw 1107 + 43804 00009275 01 db 1 + 43805 00009276 0B db 11 + 43806 00009277 00 db 0 + 43807 00009278 B1 db 0B1h + 43808 00009279 A0 db 160 + 43809 0000927A 00 db 0 + 43810 0000927B 00 db 0 + 43811 0000927C 01 db 1 + 43812 0000927D F1 db 0F1h + 43813 0000927E 0E db 14 + 43814 0000927F 0E db 14 + 43815 00009280 20 db 20h + 43816 kybytes_n_ptr: + 43817 00009281 5304 dw 1107 + 43818 00009283 01 db 1 + 43819 00009284 0B db 11 + 43820 00009285 00 db 0 + 43821 00009286 [229C] dw FileSiz + 43822 00009288 0000 dw 0 + 43823 0000928A 01 db 1 + 43824 0000928B B1 db 0B1h + 43825 0000928C 0A db 10 + 43826 0000928D 0A db 10 + 43827 0000928E 20 db 20h + 43828 %endif + 43829 + 43830 ; "Total:",13,10 + 43831 total_ptr: + 43832 0000928F 3804 dw 1080 ; message number + 43833 00009291 00 db no_subst ; 0 ; number of subst + 43834 + 43835 ; "Error parsing environment variable:",13,10 + 43836 errparsenv_ptr: + 43837 00009292 3904 dw 1081 ; message number + 43838 00009294 00 db no_subst ; 0 ; number of subst + 43839 + 43840 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 43841 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:996Ah) + 43842 cox_Y_quest_ptr: + 43843 00009295 3A04 dw 1082 + 43844 00009297 00 db no_subst ; 0 + 43845 cox_Y_answ_ptr: + 43846 00009298 3B04 dw 1083 + 43847 0000929A 00 db no_subst ; 0 + 43848 + 43849 ; "(continuing %1)",13,10 + 43850 dircont_ptr: + 43851 0000929B 3C04 dw 1084 ;AN000;message number + 43852 0000929D 01 db 1 ;AN000;number of subst + 43853 0000929E 0B db parm_block_size ; 11 ;AN000;size of sublist + 43854 0000929F 00 db 0 ;AN000;reserved + 43855 000092A0 [399D] dw BWDBUF ;AN000;offset of arg + 43856 000092A2 0000 dw 0 ;AN000;segment of arg + 43857 000092A4 01 db 1 ;AN000;first subst + 43858 000092A5 10 db 10h ; Char_field_ASCIIZ ;AN000;character string + 43859 000092A6 80 db 128 ;AN000;maximum width + 43860 000092A7 00 db 0 ;AN000;minimum width + 43861 000092A8 20 db blank ; 20h ;AN000;pad character + 43862 + 43863 ; "Revision %1",CR,LF + 43864 dosrev_ptr: + 43865 000092A9 4204 dw 1090 + 43866 000092AB 01 db 1 ; one substitution + 43867 000092AC 0B db parm_block_size ; 11 + 43868 000092AD 00 db 0 + 43869 000092AE [B19D] dw One_Char_Val ; ptr to char + 43870 000092B0 0000 dw 0 ; segment addr? + 43871 000092B2 01 db 1 ; 1st substitution + 43872 000092B3 00 db 0 ; CHAR_FIELD_CHAR ; character + 43873 000092B4 01 db 1 ; max width + 43874 000092B5 01 db 1 ; min width + 43875 000092B6 20 db blank ; 20h ; pad char + 43876 + 43877 ; "DOS is in ROM" + 43878 DosRom_Ptr: + 43879 000092B7 4304 dw 1091 + 43880 000092B9 00 db no_subst ; 0 + 43881 + 43882 ; "DOS is in HMA" + 43883 DosHma_Ptr: + 43884 000092BA 4404 dw 1092 + 43885 000092BC 00 db no_subst ; 0 + 43886 + 43887 ; "DOS is in low memory" + 43888 DosLow_Ptr: + 43889 000092BD 4504 dw 1093 + 43890 000092BF 00 db no_subst ; 0 + 43891 + 43892 ; "Cannot Loadhigh batch file" ;M016 + 43893 NoExecBat_Ptr: + 43894 000092C0 4604 dw 1094 ; M016 + 43895 000092C2 00 db no_subst ; 0 ; M016 + 43896 + 43897 ; "LoadHigh: Invalid filename" ; M016 + 43898 LhInvFil_Ptr: + 43899 000092C3 4704 dw 1095 ; M016 + 43900 000092C5 00 db no_subst ; 0 ; M016 + 43901 + 43902 ; "Could not open specified country information file" ; M045 + 43903 NoCntry_Ptr: + 43904 000092C6 4804 dw 1096 ; M045 + 43905 000092C8 00 db no_subst ; 0 ; M045 + 43906 + 43907 ; 15/04/2023 + 43908 ; MSDOS 6.0 COMMAND.COM only ! + 43909 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 43910 ;%if 0 + 43911 + 43912 ;* The next four errors emulate those reported by the normal parse + 43913 ; mechanism, with a little more accurate wording; that parser has been + 43914 ; replaced with a custom routine (ParseVar) for LoadHigh and DeviceHigh. + 43915 ; These errors aren't normally generated by LoadHigh except by the normal + 43916 ; parser, so they've been added here. + 43917 + 43918 ; "LoadHigh: Invalid argument" + 43919 LhInvArg_Ptr: + 43920 000092C9 4904 dw 1097 + 43921 000092CB 00 db no_subst ; 0 + 43922 + 43923 ; "Required parameter missing" + 43924 ReqParmMiss: + 43925 000092CC 4A04 dw 1098 + 43926 000092CE 00 db no_subst ; 0 + 43927 + 43928 ; "Unrecognized switch" + 43929 LhInvSwt_Ptr: + 43930 000092CF 4B04 dw 1099 + 43931 000092D1 00 db no_subst ; 0 + 43932 + 43933 ; "A bad UMB number has been specified" + 43934 LhBadUMB_Ptr: + 43935 000092D2 4C04 dw 1100 + 43936 000092D4 00 db no_subst ; 0 + 43937 ;%endif + 43938 + 43939 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 43940 %if 0 + 43941 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 43942 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99AAh + 43943 + 43944 DirCompRatio_Ptr: + 43945 dw 1101 ;message number + 43946 db 2 ;number of subst + 43947 db parm_block_size ; 11 ;size of sublist + 43948 db 0 ;reserved + 43949 dw Dir_CRatio_1 ;offset of arg + 43950 dw 0 ;segment of arg + 43951 db 1 ;first subst + 43952 db 91h ;format + 43953 db 2 ;maximum width + 43954 db 2 ;minimum width + 43955 db blank ; 20h ;pad character + 43956 db parm_block_size ; 11 ;size of sublist + 43957 db 0 ; reserved + 43958 dw Dir_CRatio_2 ;offset of arg + 43959 dw 0 ;segment of arg + 43960 db 2 ;second subst + 43961 db 11h ;format + 43962 db 1 ;maximum width + 43963 db 1 ;minimum width + 43964 db blank ; 20h ;pad character + 43965 + 43966 AveCompRatio_Ptr: + 43967 dw 1102 ;message number + 43968 db 2 ;number of subst + 43969 db parm_block_size ; 11 ;size of sublist + 43970 db 0 ;reserved + 43971 dw Dir_CRatio_1 ;offset of arg + 43972 dw 0 ;segment of arg + 43973 db 1 ;first subst + 43974 db 91h ;format + 43975 db 2 ;maximum width + 43976 db 2 ;minimum width + 43977 db blank ; 20h ;pad character + 43978 db parm_block_size ; 11 ;size of sublist + 43979 db 0 ; reserved + 43980 dw Dir_CRatio_2 ;offset of arg + 43981 dw 0 ;segment of arg + 43982 db 2 ;second subst + 43983 db 11h ;format + 43984 db 1 ;maximum width + 43985 db 1 ;minimum width + 43986 db blank ; 20h ;pad character + 43987 %else + 43988 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 43989 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:97A4h + 43990 kbytesf_ptr: + 43991 000092D5 5204 dw 1106 + 43992 000092D7 01 db 1 + 43993 000092D8 0B db 11 + 43994 000092D9 00 db 0 + 43995 000092DA [A99D] dw Bytes_Free + 43996 000092DC 0000 dw 0 + 43997 000092DE 01 db 1 + 43998 000092DF F1 db 0F1h ; long binary to decimal + 43999 000092E0 1E db 30 + 44000 000092E1 1E db 30 + 44001 000092E2 20 db 20h + 44002 kbytesf_n_ptr: + 44003 000092E3 5204 dw 1106 + 44004 000092E5 01 db 1 + 44005 000092E6 0B db 11 + 44006 000092E7 00 db 0 + 44007 000092E8 [A99D] dw Bytes_Free + 44008 000092EA 0000 dw 0 + 44009 000092EC 01 db 1 + 44010 000092ED B1 db 0B1h ; Right_Align+Unsgn_Bin_DWord + 44011 000092EE 1C db 28 + 44012 000092EF 1C db 28 + 44013 000092F0 20 db 20h + 44014 %endif 44015 - 44016 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44017 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99DCh + 44016 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 44017 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8483h 44018 - 44019 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 44020 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:97C0h + 44019 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44020 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99DCh 44021 - 44022 ; --------------------------------------------------------------------------- - 44023 - 44024 PATH_TEXT: - 44025 000092F1 504154483D db "PATH=" - 44026 PROMPT_TEXT: - 44027 000092F6 50524F4D50543D db "PROMPT=" - 44028 COMSPECSTR: - 44029 000092FD 434F4D535045433D db "COMSPEC=" - 44030 DirEnvVar: - 44031 00009305 444952434D443D db "DIRCMD=" ; DIR's environment variable - 44032 - 44033 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 44034 ; PCDOS 7.1 COMMAND.COM - 44035 %if 1 - 44036 no_sep_text: - 44037 0000930C 4E4F5F5345503D db 'NO_SEP=' ; 1 = do not use commas as num separator - 44038 %endif - 44039 - 44040 ;============================================================================ - 44041 ; TDATA.ASM, MSDOS 6.0, 1991 - 44042 ;============================================================================ - 44043 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 44044 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44045 - 44046 ; 15/04/2023 - 44047 00009313 00 db 0 - 44048 align 2 - 44049 - 44050 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:849Eh - 44051 ; --------------------------------------------------------------------------- - 44052 ; 18/06/2023 - 44053 ;db 0 - 44054 - 44055 ; Lists of help message numbers for internal commands and /? - 44056 - 44057 ; 18/06/2023 - 44058 ;;NoHelpMsgs: - 44059 ;dw 1200,0 ;M014 - 44060 - 44061 ; 18/06/2023 - 44062 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99F7h + 44022 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 44023 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:97C0h + 44024 + 44025 ; --------------------------------------------------------------------------- + 44026 + 44027 PATH_TEXT: + 44028 000092F1 504154483D db "PATH=" + 44029 PROMPT_TEXT: + 44030 000092F6 50524F4D50543D db "PROMPT=" + 44031 COMSPECSTR: + 44032 000092FD 434F4D535045433D db "COMSPEC=" + 44033 DirEnvVar: + 44034 00009305 444952434D443D db "DIRCMD=" ; DIR's environment variable + 44035 + 44036 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 44037 ; PCDOS 7.1 COMMAND.COM + 44038 %if 1 + 44039 no_sep_text: + 44040 0000930C 4E4F5F5345503D db 'NO_SEP=' ; 1 = do not use commas as num separator + 44041 %endif + 44042 + 44043 ;============================================================================ + 44044 ; TDATA.ASM, MSDOS 6.0, 1991 + 44045 ;============================================================================ + 44046 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 44047 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44048 + 44049 ; 15/04/2023 + 44050 00009313 00 db 0 + 44051 align 2 + 44052 + 44053 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:849Eh + 44054 ; --------------------------------------------------------------------------- + 44055 ; 18/06/2023 + 44056 ;db 0 + 44057 + 44058 ; Lists of help message numbers for internal commands and /? + 44059 + 44060 ; 18/06/2023 + 44061 ;;NoHelpMsgs: + 44062 ;dw 1200,0 ;M014 44063 - 44064 BreakHelpMsgs: - 44065 00009314 14050000 dw 1300,0 - 44066 ChcpHelpMsgs: - 44067 00009318 280529050000 dw 1320,1321,0 - 44068 CdHelpMsgs: - 44069 0000931E 3C053D053E050000 dw 1340,1341,1342,0 - 44070 ClsHelpMsgs: - 44071 00009326 50050000 dw 1360,0 - 44072 CopyHelpMsgs: - 44073 ;dw 1400,1401,1402,1403,1404,0 - 44074 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 44075 0000932A 780579057A057B057C- dw 1400,1401,1402,1403,1404,1405,1406,1407,0 - 44075 00009333 057D057E057F050000 - 44076 CttyHelpMsgs: - 44077 0000933C 8C050000 dw 1420,0 - 44078 DateHelpMsgs: - 44079 00009340 A005A1050000 dw 1440,1441,0 - 44080 DelHelpMsgs: - 44081 00009346 B405B505B6050000 dw 1460,1461,1462,0 - 44082 DirHelpMsgs: - 44083 0000934E C805C905CA05CB05CC- dw 1480,1481,1482,1483,1484,1485,1486,1487,1488 - 44083 00009357 05CD05CE05CF05D005 - 44084 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 44085 ; MSDOS 6.0 COMMAND.COM - 44086 ;dw 1489,1490,1491,1492 - 44087 ; 06/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM - 44088 00009360 D105 dw 1489 - 44089 00009362 0000 dw 0 - 44090 ExitHelpMsgs: - 44091 00009364 DC050000 dw 1500,0 - 44092 MdHelpMsgs: - 44093 00009368 F0050000 dw 1520,0 - 44094 PathHelpMsgs: - 44095 0000936C 0406050606060000 dw 1540,1541,1542,0 - 44096 PromptHelpMsgs: - 44097 00009374 180619061A061B061C- dw 1560,1561,1562,1563,1564,1565,1566,1567,1568,0 - 44097 0000937D 061D061E061F062006- - 44097 00009386 0000 - 44098 RdHelpMsgs: - 44099 00009388 2C060000 dw 1580,0 - 44100 RenHelpMsgs: - 44101 0000938C 4006410642060000 dw 1600,1601,1602,0 - 44102 SetHelpMsgs: - 44103 00009394 5406550656060000 dw 1620,1621,1622,0 - 44104 TimeHelpMsgs: - 44105 0000939C 680669060000 dw 1640,1641,0 - 44106 TypeHelpMsgs: - 44107 000093A2 7C060000 dw 1660,0 - 44108 VerHelpMsgs: - 44109 000093A6 90060000 dw 1680,0 - 44110 VerifyHelpMsgs: - 44111 000093AA A4060000 dw 1700,0 - 44112 VolHelpMsgs: - 44113 000093AE B8060000 dw 1720,0 - 44114 CallHelpMsgs: - 44115 000093B2 CC06CD060000 dw 1740,1741,0 ;M014 - 44116 RemHelpMsgs: - 44117 000093B8 E0060000 dw 1760,0 ;M014 - 44118 PauseHelpMsgs: - 44119 000093BC F4060000 dw 1780,0 ;M014 - 44120 EchoHelpMsgs: - 44121 000093C0 080709070000 dw 1800,1801,0 ;M014 - 44122 GotoHelpMsgs: - 44123 000093C6 1C071D070000 dw 1820,1821,0 ;M014 - 44124 ShiftHelpMsgs: - 44125 000093CC 30070000 dw 1840,0 ;M014 - 44126 IfHelpMsgs: - 44127 000093D0 440745074607470748- dw 1860,1861,1862,1863,1864,1865,1866,0 ;M014 - 44127 000093D9 0749074A070000 - 44128 ForHelpMsgs: - 44129 000093E0 580759075A075B0700- dw 1880,1881,1882,1883,0 ;M014 - 44129 000093E9 00 - 44130 TruenameHelpMsgs: - 44131 000093EA 6C070000 dw 1900,0 ;M014 - 44132 LoadhighHelpMsgs: - 44133 000093EE 800781078207 dw 1920,1921,1922 - 44134 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 44135 ; MSDOS 6.0 COMMAND.COM - 44136 000093F4 830784078507860787- dw 1923,1924,1925,1926,1927 ;M014 - 44136 000093FD 07 - 44137 000093FE 0000 dw 0 - 44138 - 44139 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM - 44140 %if 1 - 44141 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:98CEh - 44142 twospacechars: - 44143 00009400 202000 db ' ',0 - 44144 %endif - 44145 - 44146 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8578h - 44147 CLSSTRING: - 44148 00009403 041B5B324A db 4,1Bh,"[2J" ; ANSI Clear screen - 44149 - 44150 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:98D6h - 44151 PROMPT_TABLE: - 44152 00009408 42 db "B" - 44153 00009409 [AC21] dw Print_B - 44154 0000940B 44 db "D" - 44155 0000940C [093B] dw PRINT_DATE - 44156 0000940E 45 db "E" - 44157 0000940F [A021] dw PRINT_ESC - 44158 00009411 47 db "G" - 44159 00009412 [A421] dw PRINT_G - 44160 00009414 48 db "H" - 44161 00009415 [5F21] dw PRINT_BACK - 44162 00009417 4C db "L" - 44163 00009418 [A821] dw PRINT_L - 44164 0000941A 4E db "N" - 44165 0000941B [BD21] dw PRINT_DRIVE - 44166 0000941D 50 db "P" - 44167 0000941E [C521] dw build_dir_for_prompt - 44168 00009420 51 db "Q" - 44169 00009421 [6521] dw PRINT_EQ - 44170 ; - 44171 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM - 44172 00009423 52 db "R" - 44173 00009424 [6921] dw PRINT_R ; PRINT Return code, [Retcode] - 44174 ; - 44175 00009426 54 db "T" - 44176 00009427 [BF33] dw PRINT_TIME - 44177 00009429 56 db "V" - 44178 0000942A [D820] dw PRINT_VERSION - 44179 0000942C 5F db "_" - 44180 0000942D [7929] dw CRLF2 - 44181 0000942F 24 db "$" - 44182 00009430 [AE21] dw PRINT_CHAR - 44183 00009432 00 db 0 ; NUL TERMINATED - 44184 - 44185 ; Table of IF conditionals - 44186 IFTAB: - 44187 00009433 034E4F54 db 3,"NOT" ; First byte is count - 44188 00009437 [F80B] dw IFNOT - 44189 00009439 0A4552524F524C4556- db 10,"ERRORLEVEL" - 44189 00009442 454C - 44190 00009444 [B70C] dw IFERLEV - 44191 00009446 054558495354 db 5,"EXIST" - 44192 0000944C [4C0C] dw IFEXISTS - 44193 0000944E 00 db 0 - 44194 - 44195 ; 06/08/2024 - 44196 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:991Dh + 44064 ; 18/06/2023 + 44065 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:99F7h + 44066 + 44067 BreakHelpMsgs: + 44068 00009314 14050000 dw 1300,0 + 44069 ChcpHelpMsgs: + 44070 00009318 280529050000 dw 1320,1321,0 + 44071 CdHelpMsgs: + 44072 0000931E 3C053D053E050000 dw 1340,1341,1342,0 + 44073 ClsHelpMsgs: + 44074 00009326 50050000 dw 1360,0 + 44075 CopyHelpMsgs: + 44076 ;dw 1400,1401,1402,1403,1404,0 + 44077 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 44078 0000932A 780579057A057B057C- dw 1400,1401,1402,1403,1404,1405,1406,1407,0 + 44078 00009333 057D057E057F050000 + 44079 CttyHelpMsgs: + 44080 0000933C 8C050000 dw 1420,0 + 44081 DateHelpMsgs: + 44082 00009340 A005A1050000 dw 1440,1441,0 + 44083 DelHelpMsgs: + 44084 00009346 B405B505B6050000 dw 1460,1461,1462,0 + 44085 DirHelpMsgs: + 44086 0000934E C805C905CA05CB05CC- dw 1480,1481,1482,1483,1484,1485,1486,1487,1488 + 44086 00009357 05CD05CE05CF05D005 + 44087 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 44088 ; MSDOS 6.0 COMMAND.COM + 44089 ;dw 1489,1490,1491,1492 + 44090 ; 06/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM + 44091 00009360 D105 dw 1489 + 44092 00009362 0000 dw 0 + 44093 ExitHelpMsgs: + 44094 00009364 DC050000 dw 1500,0 + 44095 MdHelpMsgs: + 44096 00009368 F0050000 dw 1520,0 + 44097 PathHelpMsgs: + 44098 0000936C 0406050606060000 dw 1540,1541,1542,0 + 44099 PromptHelpMsgs: + 44100 00009374 180619061A061B061C- dw 1560,1561,1562,1563,1564,1565,1566,1567,1568,0 + 44100 0000937D 061D061E061F062006- + 44100 00009386 0000 + 44101 RdHelpMsgs: + 44102 00009388 2C060000 dw 1580,0 + 44103 RenHelpMsgs: + 44104 0000938C 4006410642060000 dw 1600,1601,1602,0 + 44105 SetHelpMsgs: + 44106 00009394 5406550656060000 dw 1620,1621,1622,0 + 44107 TimeHelpMsgs: + 44108 0000939C 680669060000 dw 1640,1641,0 + 44109 TypeHelpMsgs: + 44110 000093A2 7C060000 dw 1660,0 + 44111 VerHelpMsgs: + 44112 000093A6 90060000 dw 1680,0 + 44113 VerifyHelpMsgs: + 44114 000093AA A4060000 dw 1700,0 + 44115 VolHelpMsgs: + 44116 000093AE B8060000 dw 1720,0 + 44117 CallHelpMsgs: + 44118 000093B2 CC06CD060000 dw 1740,1741,0 ;M014 + 44119 RemHelpMsgs: + 44120 000093B8 E0060000 dw 1760,0 ;M014 + 44121 PauseHelpMsgs: + 44122 000093BC F4060000 dw 1780,0 ;M014 + 44123 EchoHelpMsgs: + 44124 000093C0 080709070000 dw 1800,1801,0 ;M014 + 44125 GotoHelpMsgs: + 44126 000093C6 1C071D070000 dw 1820,1821,0 ;M014 + 44127 ShiftHelpMsgs: + 44128 000093CC 30070000 dw 1840,0 ;M014 + 44129 IfHelpMsgs: + 44130 000093D0 440745074607470748- dw 1860,1861,1862,1863,1864,1865,1866,0 ;M014 + 44130 000093D9 0749074A070000 + 44131 ForHelpMsgs: + 44132 000093E0 580759075A075B0700- dw 1880,1881,1882,1883,0 ;M014 + 44132 000093E9 00 + 44133 TruenameHelpMsgs: + 44134 000093EA 6C070000 dw 1900,0 ;M014 + 44135 LoadhighHelpMsgs: + 44136 000093EE 800781078207 dw 1920,1921,1922 + 44137 ; 17/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 44138 ; MSDOS 6.0 COMMAND.COM + 44139 000093F4 830784078507860787- dw 1923,1924,1925,1926,1927 ;M014 + 44139 000093FD 07 + 44140 000093FE 0000 dw 0 + 44141 + 44142 ; 03/08/2024 - Retro DOS v5.0 COMMAND.COM + 44143 %if 1 + 44144 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:98CEh + 44145 twospacechars: + 44146 00009400 202000 db ' ',0 + 44147 %endif + 44148 + 44149 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8578h + 44150 CLSSTRING: + 44151 00009403 041B5B324A db 4,1Bh,"[2J" ; ANSI Clear screen + 44152 + 44153 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:98D6h + 44154 PROMPT_TABLE: + 44155 00009408 42 db "B" + 44156 00009409 [AC21] dw Print_B + 44157 0000940B 44 db "D" + 44158 0000940C [093B] dw PRINT_DATE + 44159 0000940E 45 db "E" + 44160 0000940F [A021] dw PRINT_ESC + 44161 00009411 47 db "G" + 44162 00009412 [A421] dw PRINT_G + 44163 00009414 48 db "H" + 44164 00009415 [5F21] dw PRINT_BACK + 44165 00009417 4C db "L" + 44166 00009418 [A821] dw PRINT_L + 44167 0000941A 4E db "N" + 44168 0000941B [BD21] dw PRINT_DRIVE + 44169 0000941D 50 db "P" + 44170 0000941E [C521] dw build_dir_for_prompt + 44171 00009420 51 db "Q" + 44172 00009421 [6521] dw PRINT_EQ + 44173 ; + 44174 ; 06/08/2024 - PCDOS 7.1 COMMAND.COM + 44175 00009423 52 db "R" + 44176 00009424 [6921] dw PRINT_R ; PRINT Return code, [Retcode] + 44177 ; + 44178 00009426 54 db "T" + 44179 00009427 [BF33] dw PRINT_TIME + 44180 00009429 56 db "V" + 44181 0000942A [D820] dw PRINT_VERSION + 44182 0000942C 5F db "_" + 44183 0000942D [7929] dw CRLF2 + 44184 0000942F 24 db "$" + 44185 00009430 [AE21] dw PRINT_CHAR + 44186 00009432 00 db 0 ; NUL TERMINATED + 44187 + 44188 ; Table of IF conditionals + 44189 IFTAB: + 44190 00009433 034E4F54 db 3,"NOT" ; First byte is count + 44191 00009437 [F80B] dw IFNOT + 44192 00009439 0A4552524F524C4556- db 10,"ERRORLEVEL" + 44192 00009442 454C + 44193 00009444 [B70C] dw IFERLEV + 44194 00009446 054558495354 db 5,"EXIST" + 44195 0000944C [4C0C] dw IFEXISTS + 44196 0000944E 00 db 0 44197 - 44198 ; Table for internal command names - 44199 COMTAB: - 44200 0000944F 0344495203 db 3,"DIR",fSwitchAllowed+fCheckDrive ; 3 - 44201 00009454 [8011] dw CATALOG ; In TCMD1.ASM - 44202 00009456 [4E93] dw DirHelpMsgs - 44203 - 44204 00009458 0443414C4C02 db 4,"CALL",fSwitchAllowed ; 2 - 44205 0000945E [2C0D] dw _$CALL ; In TBATCH2.ASM - 44206 00009460 [B293] dw CallHelpMsgs - 44207 - 44208 00009462 044348435002 db 4,"CHCP",fSwitchAllowed ; 2 - 44209 00009468 [0824] dw CHCP ; In TCMD2B.ASM - 44210 0000946A [1893] dw ChcpHelpMsgs - 44211 - 44212 0000946C 0652454E414D4503 db 6,"RENAME",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44213 00009474 [8E1D] dw CRENAME ; In TCMD1.ASM - 44214 00009476 [8C93] dw RenHelpMsgs - 44215 - 44216 00009478 0352454E03 db 3,"REN",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44217 0000947D [8E1D] dw CRENAME ; In TCMD1.ASM - 44218 0000947F [8C93] dw RenHelpMsgs - 44219 - 44220 00009481 05455241534503 db 5,"ERASE",fSwitchAllowed+fCheckDrive ; 3 - 44221 00009488 [0C1D] dw ERASE ; In TCMD1.ASM - 44222 0000948A [4693] dw DelHelpMsgs - 44223 - 44224 0000948C 0344454C03 db 3,"DEL",fSwitchAllowed+fCheckDrive ; 3 - 44225 00009491 [0C1D] dw ERASE ; In TCMD1.ASM - 44226 00009493 [4693] dw DelHelpMsgs - 44227 - 44228 00009495 045459504503 db 4,"TYPE",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44229 0000949B [351E] dw TYPEFIL ; In TCMD1.ASM - 44230 0000949D [A293] dw TypeHelpMsgs - 44231 - 44232 0000949F 0352454D06 db 3,"REM",fSwitchAllowed+fLimitHelp ; 6 - 44233 000094A4 [0401] dw TCOMMAND ; In TCODE.ASM - 44234 000094A6 [B893] dw RemHelpMsgs - 44235 - 44236 000094A8 04434F505903 db 4,"COPY",fSwitchAllowed+fCheckDrive ; 3 - 44237 000094AE [563B] dw COPY ; In COPY.ASM - 44238 000094B0 [2A93] dw CopyHelpMsgs - 44239 - 44240 000094B2 05504155534506 db 5,"PAUSE",fSwitchAllowed+fLimitHelp ; 6 - 44241 000094B9 [001D] dw PAUSE ; In TCMD1.ASM - 44242 000094BB [BC93] dw PauseHelpMsgs - 44243 - 44244 000094BD 044441544502 db 4,"DATE",fSwitchAllowed ; 2 - 44245 000094C3 [CF32] dw DATE ; In TPIPE.ASM - 44246 000094C5 [4093] dw DateHelpMsgs - 44247 - 44248 000094C7 0454494D4502 db 4,"TIME",fSwitchAllowed ; 2 ;AC018; P3903 - 44249 000094CD [2F33] dw CTIME ; In TPIPE.ASM - 44250 000094CF [9C93] dw TimeHelpMsgs - 44251 - 44252 000094D1 0356455202 db 3,"VER",fSwitchAllowed ; 2 - 44253 000094D6 [6220] dw VERSION ; In TCMD2.ASM - 44254 000094D8 [A693] dw VerHelpMsgs - 44255 - 44256 000094DA 03564F4C03 db 3,"VOL",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44257 000094DF [631F] dw VOLUME ; In TCMD1.ASM - 44258 000094E1 [AE93] dw VolHelpMsgs - 44259 - 44260 000094E3 02434403 db 2,"CD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44261 000094E7 [3C28] dw _$CHDIR ; In TENV.ASM - 44262 000094E9 [1E93] dw CdHelpMsgs - 44263 - 44264 000094EB 05434844495203 db 5,"CHDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 - 44265 000094F2 [3C28] dw _$CHDIR ; In TENV.ASM - 44266 000094F4 [1E93] dw CdHelpMsgs - 44267 - 44268 000094F6 024D4403 db 2,"MD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44269 000094FA [A228] dw _$MKDIR ; In TENV.ASM - 44270 000094FC [6893] dw MdHelpMsgs - 44271 - 44272 000094FE 054D4B44495203 db 5,"MKDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 - 44273 00009505 [A228] dw _$MKDIR ; In TENV.ASM - 44274 00009507 [6893] dw MdHelpMsgs - 44275 - 44276 00009509 02524403 db 2,"RD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 - 44277 0000950D [E728] dw _$RMDIR ; In TENV.ASM - 44278 0000950F [8893] dw RdHelpMsgs - 44279 - 44280 00009511 05524D44495203 db 5,"RMDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 - 44281 00009518 [E728] dw _$RMDIR ; In TENV.ASM - 44282 0000951A [8893] dw RdHelpMsgs - 44283 - 44284 0000951C 05425245414B02 db 5,"BREAK",fSwitchAllowed ; 2 ;AC018; P3903 - 44285 00009523 [533A] dw CNTRLC ; In TUCODE.ASM - 44286 00009525 [1493] dw BreakHelpMsgs - 44287 - 44288 00009527 0656455249465902 db 6,"VERIFY",fSwitchAllowed ; 2 ;AC018; P3903 - 44289 0000952F [953A] dw VERIFY ; In TUCODE.ASM - 44290 00009531 [AA93] dw VerifyHelpMsgs - 44291 - 44292 00009533 0353455406 db 3,"SET",fSwitchAllowed+fLimitHelp ; 6 - 44293 00009538 [A625] dw ADD_NAME_TO_ENVIRONMENT ; In TENV.ASM - 44294 0000953A [9493] dw SetHelpMsgs - 44295 - 44296 0000953C 0650524F4D505406 db 6,"PROMPT",fSwitchAllowed+fLimitHelp ; 6 - 44297 00009544 [8C25] dw ADD_PROMPT ; In TENV.ASM - 44298 00009546 [7493] dw PromptHelpMsgs - 44299 - 44300 00009548 045041544802 db 4,"PATH",fSwitchAllowed ; 2 - 44301 0000954E [2C22] dw PATH ; In TCMD2.ASM - 44302 00009550 [6C93] dw PathHelpMsgs - 44303 - 44304 00009552 044558495400 db 4,"EXIT",0 - 44305 00009558 [FD24] dw _$EXIT ; In TCMD2.ASM - 44306 0000955A [6493] dw ExitHelpMsgs - 44307 - 44308 0000955C 044354545903 db 4,"CTTY",fCheckDrive+fSwitchAllowed ; 3 - 44309 00009562 [6A23] dw CTTY ; In TCMD2.ASM - 44310 00009564 [3C93] dw CttyHelpMsgs - 44311 - 44312 00009566 044543484F06 db 4,"ECHO",fSwitchAllowed+fLimitHelp ; 6 - 44313 0000956C [1A3A] dw _ECHO ; In TUCODE.ASM - 44314 0000956E [C093] dw EchoHelpMsgs - 44315 - 44316 00009570 04474F544F06 db 4,"GOTO",fSwitchAllowed+fLimitHelp - 44317 00009576 [600D] dw _GOTO ; In TBATCH.ASM - 44318 00009578 [C693] dw GotoHelpMsgs - 44319 - 44320 0000957A 05534849465402 db 5,"SHIFT",fSwitchAllowed ; 2 - 44321 00009581 [E50C] dw _SHIFT ; In TBATCH.ASM - 44322 00009583 [CC93] dw ShiftHelpMsgs - 44323 - 44324 00009585 02494606 db 2,"IF",fSwitchAllowed+fLimitHelp ; 6 - 44325 00009589 [910B] dw _$IF ; In TBATCH.ASM - 44326 0000958B [D093] dw IfHelpMsgs - 44327 - 44328 0000958D 03464F5206 db 3,"FOR",fSwitchAllowed+fLimitHelp ; 6 - 44329 00009592 [1910] dw _$FOR ; In TBATCH.ASM - 44330 00009594 [E093] dw ForHelpMsgs - 44331 - 44332 00009596 03434C5300 db 3,"CLS",0 - 44333 0000959B [D122] dw CLS ; In TCMD2.ASM - 44334 0000959D [2693] dw ClsHelpMsgs - 44335 - 44336 0000959F 08545255454E414D45- db 8,"TRUENAME",fSwitchAllowed+fCheckDrive ;AN000; P3903 changed - 44336 000095A8 03 - 44337 000095A9 [8624] dw TRUENAME ;AN000; - 44338 000095AB [EA93] dw TruenameHelpMsgs - 44339 - 44340 000095AD 084C4F414448494748- db 8,"LOADHIGH",fSwitchAllowed ; 2 ; M003 - 44340 000095B6 02 - 44341 000095B7 [1A62] dw LoadHigh ; In loadhi.asm ; M003 - 44342 000095B9 [EE93] dw LoadhighHelpMsgs ; M003 - 44343 - 44344 000095BB 024C4802 db 2,"LH",fSwitchAllowed ; 2 ; Short form; M003 - 44345 000095BF [1A62] dw LoadHigh ; In loadhi.asm ; M003 - 44346 000095C1 [EE93] dw LoadhighHelpMsgs ; M003 - 44347 - 44348 000095C3 00 db 0 ; Terminate command table - 44349 - 44350 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8736h - 44351 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9A92h ; 06/08/2024 + 44198 ; 06/08/2024 + 44199 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:991Dh + 44200 + 44201 ; Table for internal command names + 44202 COMTAB: + 44203 0000944F 0344495203 db 3,"DIR",fSwitchAllowed+fCheckDrive ; 3 + 44204 00009454 [8011] dw CATALOG ; In TCMD1.ASM + 44205 00009456 [4E93] dw DirHelpMsgs + 44206 + 44207 00009458 0443414C4C02 db 4,"CALL",fSwitchAllowed ; 2 + 44208 0000945E [2C0D] dw _$CALL ; In TBATCH2.ASM + 44209 00009460 [B293] dw CallHelpMsgs + 44210 + 44211 00009462 044348435002 db 4,"CHCP",fSwitchAllowed ; 2 + 44212 00009468 [0824] dw CHCP ; In TCMD2B.ASM + 44213 0000946A [1893] dw ChcpHelpMsgs + 44214 + 44215 0000946C 0652454E414D4503 db 6,"RENAME",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44216 00009474 [8E1D] dw CRENAME ; In TCMD1.ASM + 44217 00009476 [8C93] dw RenHelpMsgs + 44218 + 44219 00009478 0352454E03 db 3,"REN",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44220 0000947D [8E1D] dw CRENAME ; In TCMD1.ASM + 44221 0000947F [8C93] dw RenHelpMsgs + 44222 + 44223 00009481 05455241534503 db 5,"ERASE",fSwitchAllowed+fCheckDrive ; 3 + 44224 00009488 [0C1D] dw ERASE ; In TCMD1.ASM + 44225 0000948A [4693] dw DelHelpMsgs + 44226 + 44227 0000948C 0344454C03 db 3,"DEL",fSwitchAllowed+fCheckDrive ; 3 + 44228 00009491 [0C1D] dw ERASE ; In TCMD1.ASM + 44229 00009493 [4693] dw DelHelpMsgs + 44230 + 44231 00009495 045459504503 db 4,"TYPE",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44232 0000949B [351E] dw TYPEFIL ; In TCMD1.ASM + 44233 0000949D [A293] dw TypeHelpMsgs + 44234 + 44235 0000949F 0352454D06 db 3,"REM",fSwitchAllowed+fLimitHelp ; 6 + 44236 000094A4 [0401] dw TCOMMAND ; In TCODE.ASM + 44237 000094A6 [B893] dw RemHelpMsgs + 44238 + 44239 000094A8 04434F505903 db 4,"COPY",fSwitchAllowed+fCheckDrive ; 3 + 44240 000094AE [563B] dw COPY ; In COPY.ASM + 44241 000094B0 [2A93] dw CopyHelpMsgs + 44242 + 44243 000094B2 05504155534506 db 5,"PAUSE",fSwitchAllowed+fLimitHelp ; 6 + 44244 000094B9 [001D] dw PAUSE ; In TCMD1.ASM + 44245 000094BB [BC93] dw PauseHelpMsgs + 44246 + 44247 000094BD 044441544502 db 4,"DATE",fSwitchAllowed ; 2 + 44248 000094C3 [CF32] dw DATE ; In TPIPE.ASM + 44249 000094C5 [4093] dw DateHelpMsgs + 44250 + 44251 000094C7 0454494D4502 db 4,"TIME",fSwitchAllowed ; 2 ;AC018; P3903 + 44252 000094CD [2F33] dw CTIME ; In TPIPE.ASM + 44253 000094CF [9C93] dw TimeHelpMsgs + 44254 + 44255 000094D1 0356455202 db 3,"VER",fSwitchAllowed ; 2 + 44256 000094D6 [6220] dw VERSION ; In TCMD2.ASM + 44257 000094D8 [A693] dw VerHelpMsgs + 44258 + 44259 000094DA 03564F4C03 db 3,"VOL",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44260 000094DF [631F] dw VOLUME ; In TCMD1.ASM + 44261 000094E1 [AE93] dw VolHelpMsgs + 44262 + 44263 000094E3 02434403 db 2,"CD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44264 000094E7 [3C28] dw _$CHDIR ; In TENV.ASM + 44265 000094E9 [1E93] dw CdHelpMsgs + 44266 + 44267 000094EB 05434844495203 db 5,"CHDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 + 44268 000094F2 [3C28] dw _$CHDIR ; In TENV.ASM + 44269 000094F4 [1E93] dw CdHelpMsgs + 44270 + 44271 000094F6 024D4403 db 2,"MD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44272 000094FA [A228] dw _$MKDIR ; In TENV.ASM + 44273 000094FC [6893] dw MdHelpMsgs + 44274 + 44275 000094FE 054D4B44495203 db 5,"MKDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 + 44276 00009505 [A228] dw _$MKDIR ; In TENV.ASM + 44277 00009507 [6893] dw MdHelpMsgs + 44278 + 44279 00009509 02524403 db 2,"RD",fSwitchAllowed+fCheckDrive ; 3 ;AC018; P3903 + 44280 0000950D [E728] dw _$RMDIR ; In TENV.ASM + 44281 0000950F [8893] dw RdHelpMsgs + 44282 + 44283 00009511 05524D44495203 db 5,"RMDIR",fSwitchAllowed+fCheckDrive ;AC018; P3903 + 44284 00009518 [E728] dw _$RMDIR ; In TENV.ASM + 44285 0000951A [8893] dw RdHelpMsgs + 44286 + 44287 0000951C 05425245414B02 db 5,"BREAK",fSwitchAllowed ; 2 ;AC018; P3903 + 44288 00009523 [533A] dw CNTRLC ; In TUCODE.ASM + 44289 00009525 [1493] dw BreakHelpMsgs + 44290 + 44291 00009527 0656455249465902 db 6,"VERIFY",fSwitchAllowed ; 2 ;AC018; P3903 + 44292 0000952F [953A] dw VERIFY ; In TUCODE.ASM + 44293 00009531 [AA93] dw VerifyHelpMsgs + 44294 + 44295 00009533 0353455406 db 3,"SET",fSwitchAllowed+fLimitHelp ; 6 + 44296 00009538 [A625] dw ADD_NAME_TO_ENVIRONMENT ; In TENV.ASM + 44297 0000953A [9493] dw SetHelpMsgs + 44298 + 44299 0000953C 0650524F4D505406 db 6,"PROMPT",fSwitchAllowed+fLimitHelp ; 6 + 44300 00009544 [8C25] dw ADD_PROMPT ; In TENV.ASM + 44301 00009546 [7493] dw PromptHelpMsgs + 44302 + 44303 00009548 045041544802 db 4,"PATH",fSwitchAllowed ; 2 + 44304 0000954E [2C22] dw PATH ; In TCMD2.ASM + 44305 00009550 [6C93] dw PathHelpMsgs + 44306 + 44307 00009552 044558495400 db 4,"EXIT",0 + 44308 00009558 [FD24] dw _$EXIT ; In TCMD2.ASM + 44309 0000955A [6493] dw ExitHelpMsgs + 44310 + 44311 0000955C 044354545903 db 4,"CTTY",fCheckDrive+fSwitchAllowed ; 3 + 44312 00009562 [6A23] dw CTTY ; In TCMD2.ASM + 44313 00009564 [3C93] dw CttyHelpMsgs + 44314 + 44315 00009566 044543484F06 db 4,"ECHO",fSwitchAllowed+fLimitHelp ; 6 + 44316 0000956C [1A3A] dw _ECHO ; In TUCODE.ASM + 44317 0000956E [C093] dw EchoHelpMsgs + 44318 + 44319 00009570 04474F544F06 db 4,"GOTO",fSwitchAllowed+fLimitHelp + 44320 00009576 [600D] dw _GOTO ; In TBATCH.ASM + 44321 00009578 [C693] dw GotoHelpMsgs + 44322 + 44323 0000957A 05534849465402 db 5,"SHIFT",fSwitchAllowed ; 2 + 44324 00009581 [E50C] dw _SHIFT ; In TBATCH.ASM + 44325 00009583 [CC93] dw ShiftHelpMsgs + 44326 + 44327 00009585 02494606 db 2,"IF",fSwitchAllowed+fLimitHelp ; 6 + 44328 00009589 [910B] dw _$IF ; In TBATCH.ASM + 44329 0000958B [D093] dw IfHelpMsgs + 44330 + 44331 0000958D 03464F5206 db 3,"FOR",fSwitchAllowed+fLimitHelp ; 6 + 44332 00009592 [1910] dw _$FOR ; In TBATCH.ASM + 44333 00009594 [E093] dw ForHelpMsgs + 44334 + 44335 00009596 03434C5300 db 3,"CLS",0 + 44336 0000959B [D122] dw CLS ; In TCMD2.ASM + 44337 0000959D [2693] dw ClsHelpMsgs + 44338 + 44339 0000959F 08545255454E414D45- db 8,"TRUENAME",fSwitchAllowed+fCheckDrive ;AN000; P3903 changed + 44339 000095A8 03 + 44340 000095A9 [8624] dw TRUENAME ;AN000; + 44341 000095AB [EA93] dw TruenameHelpMsgs + 44342 + 44343 000095AD 084C4F414448494748- db 8,"LOADHIGH",fSwitchAllowed ; 2 ; M003 + 44343 000095B6 02 + 44344 000095B7 [1A62] dw LoadHigh ; In loadhi.asm ; M003 + 44345 000095B9 [EE93] dw LoadhighHelpMsgs ; M003 + 44346 + 44347 000095BB 024C4802 db 2,"LH",fSwitchAllowed ; 2 ; Short form; M003 + 44348 000095BF [1A62] dw LoadHigh ; In loadhi.asm ; M003 + 44349 000095C1 [EE93] dw LoadhighHelpMsgs ; M003 + 44350 + 44351 000095C3 00 db 0 ; Terminate command table 44352 - 44353 000095C4 2E434F4D comext: db ".COM" - 44354 000095C8 2E455845 exeext: db ".EXE" - 44355 000095CC 2E424154 batext: db ".BAT" - 44356 - 44357 switch_list: - 44358 ; MSDOS 5.0 (& 6.0) COMMAND.COM - 44359 ;db "?VBAPW" ; flags we can recognize - 44360 ; 18/06/2023 - 44361 ; MSDOS 6.22 COMMAND.COM - 44362 000095D0 2D593F5642415057 db "-Y?VBAPW" ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 - 44363 - 44364 AttrLtrs: - 44365 000095D8 524853764441 db "RHSvDA" ; attribute letters for DIR + 44353 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8736h + 44354 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9A92h ; 06/08/2024 + 44355 + 44356 000095C4 2E434F4D comext: db ".COM" + 44357 000095C8 2E455845 exeext: db ".EXE" + 44358 000095CC 2E424154 batext: db ".BAT" + 44359 + 44360 switch_list: + 44361 ; MSDOS 5.0 (& 6.0) COMMAND.COM + 44362 ;db "?VBAPW" ; flags we can recognize + 44363 ; 18/06/2023 + 44364 ; MSDOS 6.22 COMMAND.COM + 44365 000095D0 2D593F5642415057 db "-Y?VBAPW" ; PCDOS 7.1 COMMAND.COM ; 06/08/2024 44366 - 44367 ; Attribute letters in AttrLtrs must appear in the order that - 44368 ; attribute bits occur in the attribute byte returned by - 44369 ; directory searches, starting with bit 0. - 44370 ; The volume label attribute is lowercased to keep it from - 44371 ; being matched (by an uppercase comparison). - 44372 - 44373 OrderLtrs: - 44374 ; MSDOS 5.0 - 44375 ;db "NEDSG" ; sort order letters for DIR - 44376 ; 18/06/2023 - 44377 ; MSDOS 6.0 COMMAND.COM - 44378 ;db "NEDSGC" ; sort order letters for DIR - 44379 ; 06/08/2024 - 44380 ; PCDOS 7.1 COMMAND.COM - 44381 000095DE 4E45445347 db "NEDSG" - 44382 - 44383 ; Sort order letters stand for file name, extension, - 44384 ; date/time, size, grouped (directory files before others), - 44385 ; and compression ratio. DIR routines rely on the specific - 44386 ; order of the letters in this list. - 44387 - 44388 comspec_flag: - 44389 000095E3 00 db 0 ;AN071; + 44367 AttrLtrs: + 44368 000095D8 524853764441 db "RHSvDA" ; attribute letters for DIR + 44369 + 44370 ; Attribute letters in AttrLtrs must appear in the order that + 44371 ; attribute bits occur in the attribute byte returned by + 44372 ; directory searches, starting with bit 0. + 44373 ; The volume label attribute is lowercased to keep it from + 44374 ; being matched (by an uppercase comparison). + 44375 + 44376 OrderLtrs: + 44377 ; MSDOS 5.0 + 44378 ;db "NEDSG" ; sort order letters for DIR + 44379 ; 18/06/2023 + 44380 ; MSDOS 6.0 COMMAND.COM + 44381 ;db "NEDSGC" ; sort order letters for DIR + 44382 ; 06/08/2024 + 44383 ; PCDOS 7.1 COMMAND.COM + 44384 000095DE 4E45445347 db "NEDSG" + 44385 + 44386 ; Sort order letters stand for file name, extension, + 44387 ; date/time, size, grouped (directory files before others), + 44388 ; and compression ratio. DIR routines rely on the specific + 44389 ; order of the letters in this list. 44390 - 44391 BATBUFLEN: - 44392 000095E4 2000 dw BatLen ; 32 + 44391 comspec_flag: + 44392 000095E3 00 db 0 ;AN071; 44393 - 44394 ; ***************************************************** - 44395 ; EMG 4.00 - 44396 ; DATA STARTING HERE WAS ADDED BY EMG FOR 4.00 - 44397 ; FOR IMPLEMENTATION OF COMMON PARSE ROUTINE - 44398 ; ***************************************************** - 44399 - 44400 ; COMMON PARSE BLOCKS - 44401 - 44402 ; Indicates no value list for PARSE. - 44403 - 44404 NO_VALUES: - 44405 000095E6 0000 dw 0 ;AN000; no values + 44394 BATBUFLEN: + 44395 000095E4 2000 dw BatLen ; 32 + 44396 + 44397 ; ***************************************************** + 44398 ; EMG 4.00 + 44399 ; DATA STARTING HERE WAS ADDED BY EMG FOR 4.00 + 44400 ; FOR IMPLEMENTATION OF COMMON PARSE ROUTINE + 44401 ; ***************************************************** + 44402 + 44403 ; COMMON PARSE BLOCKS + 44404 + 44405 ; Indicates no value list for PARSE. 44406 - 44407 NULL_VALUE_LIST: ; for unvalidated value - 44408 000095E8 00 db 0 ; no value lists + 44407 NO_VALUES: + 44408 000095E6 0000 dw 0 ;AN000; no values 44409 - 44410 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 44411 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8759h + 44410 NULL_VALUE_LIST: ; for unvalidated value + 44411 000095E8 00 db 0 ; no value lists 44412 - 44413 ; PARSE control block for a required file specification (upper cased) - 44414 - 44415 FILE_REQUIRED: - 44416 000095E9 0002 dw 0200h ;AN000; filespec - required - 44417 000095EB 0100 dw 1 ;AN000; capitalize - file table - 44418 000095ED [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44419 000095EF [E695] dw NO_VALUES ;AN000; - 44420 000095F1 00 db 0 ;AN000; no keywords - 44421 - 44422 ; PARSE control block for an optional file specification (upper cased) - 44423 ; or drive number + 44413 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 44414 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8759h + 44415 + 44416 ; PARSE control block for a required file specification (upper cased) + 44417 + 44418 FILE_REQUIRED: + 44419 000095E9 0002 dw 0200h ;AN000; filespec - required + 44420 000095EB 0100 dw 1 ;AN000; capitalize - file table + 44421 000095ED [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44422 000095EF [E695] dw NO_VALUES ;AN000; + 44423 000095F1 00 db 0 ;AN000; no keywords 44424 - 44425 FILE_OPTIONAL: - 44426 000095F2 0103 dw 0301h ;AN000; filespec or drive number - 44427 ; optional - 44428 000095F4 0100 dw 1 ;AN000; capitalize - file table - 44429 000095F6 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44430 000095F8 [E695] dw NO_VALUES ;AN000; - 44431 000095FA 00 db 0 ;AN000; no keywords - 44432 - 44433 ; PARSE control block for an optional file specification (upper cased) - 44434 - 44435 FILE_OPTIONAL2: - 44436 000095FB 0102 dw 0201h ;AN000; filespec optional - 44437 000095FD 0100 dw 1 ;AN000; capitalize - file table - 44438 000095FF [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44439 00009601 [E695] dw NO_VALUES ;AN000; - 44440 00009603 00 db 0 ;AN000; no keywords - 44441 - 44442 ; PARSE control block for an optional /P switch - 44443 - 44444 SLASH_P_SWITCH: - 44445 00009604 0000 dw 0 ;AN000; no match flags - 44446 00009606 0200 dw 2 ;AN000; capitalize - char table - 44447 00009608 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44448 0000960A [E695] dw NO_VALUES ;AN000; - 44449 0000960C 01 db 1 ;AN000; 1 keyword - 44450 SLASH_P_SYN: - 44451 0000960D 2F5000 db "/P",0 ;AN000; /P switch - 44452 - 44453 ; PARSE BLOCK FOR BREAK, VERIFY, ECHO - 44454 - 44455 ; The following parse control block can be used for any command which - 44456 ; needs only the optional "ON" and "OFF" keywords as operands. Allows - 44457 ; the equal sign as an additional delimiter. Returns verified result - 44458 ; in PARSE1_OUTPUT. Currently used for the BREAK, VERIFY, and ECHO - 44459 ; internal commands. - 44460 - 44461 PARSE_BREAK: - 44462 00009610 [1396] dw BREAK_PARMS ;AN000; - 44463 00009612 00 db 0 ;AN032; no extra delimiter - 44464 - 44465 BREAK_PARMS: - 44466 00009613 0001 db 0,1 ;AN000; 1 positional parm - 44467 00009615 [1996] dw BREAK_CONTROL1 ;AN000; - 44468 00009617 00 db 0 ;AN000; no switches - 44469 00009618 00 db 0 ;AN000; no keywords - 44470 - 44471 BREAK_CONTROL1: - 44472 00009619 0120 dw 2001h ;AN000; string value - optional - 44473 0000961B 0200 dw 2 ;AN000; capitalize - char table - 44474 0000961D [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44475 0000961F [2296] dw BREAK_VALUES ;AN000; - 44476 00009621 00 db 0 ;AN000; no keywords - 44477 - 44478 BREAK_VALUES: - 44479 00009622 03 db 3 ;AN000; - 44480 00009623 00 db 0 ;AN000; no ranges - 44481 00009624 00 db 0 ;AN000; no numeric values - 44482 00009625 02 db 2 ;AN000; 2 string values - 44483 00009626 00 db 0 ;AN000; returned if ON - 44484 00009627 [2C96] dw BREAK_ON ;AN000; point to ON string - 44485 00009629 66 db 'f' ;AN000; returned if OFF - 44486 0000962A [2F96] dw BREAK_OFF ;AN000; point to OFF string - 44487 - 44488 BREAK_ON: - 44489 0000962C 4F4E00 db "ON",0 ;AN000; - 44490 BREAK_OFF: - 44491 0000962F 4F464600 db "OFF",0 ;AN000; - 44492 - 44493 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 44494 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:87A3h + 44425 ; PARSE control block for an optional file specification (upper cased) + 44426 ; or drive number + 44427 + 44428 FILE_OPTIONAL: + 44429 000095F2 0103 dw 0301h ;AN000; filespec or drive number + 44430 ; optional + 44431 000095F4 0100 dw 1 ;AN000; capitalize - file table + 44432 000095F6 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44433 000095F8 [E695] dw NO_VALUES ;AN000; + 44434 000095FA 00 db 0 ;AN000; no keywords + 44435 + 44436 ; PARSE control block for an optional file specification (upper cased) + 44437 + 44438 FILE_OPTIONAL2: + 44439 000095FB 0102 dw 0201h ;AN000; filespec optional + 44440 000095FD 0100 dw 1 ;AN000; capitalize - file table + 44441 000095FF [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44442 00009601 [E695] dw NO_VALUES ;AN000; + 44443 00009603 00 db 0 ;AN000; no keywords + 44444 + 44445 ; PARSE control block for an optional /P switch + 44446 + 44447 SLASH_P_SWITCH: + 44448 00009604 0000 dw 0 ;AN000; no match flags + 44449 00009606 0200 dw 2 ;AN000; capitalize - char table + 44450 00009608 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44451 0000960A [E695] dw NO_VALUES ;AN000; + 44452 0000960C 01 db 1 ;AN000; 1 keyword + 44453 SLASH_P_SYN: + 44454 0000960D 2F5000 db "/P",0 ;AN000; /P switch + 44455 + 44456 ; PARSE BLOCK FOR BREAK, VERIFY, ECHO + 44457 + 44458 ; The following parse control block can be used for any command which + 44459 ; needs only the optional "ON" and "OFF" keywords as operands. Allows + 44460 ; the equal sign as an additional delimiter. Returns verified result + 44461 ; in PARSE1_OUTPUT. Currently used for the BREAK, VERIFY, and ECHO + 44462 ; internal commands. + 44463 + 44464 PARSE_BREAK: + 44465 00009610 [1396] dw BREAK_PARMS ;AN000; + 44466 00009612 00 db 0 ;AN032; no extra delimiter + 44467 + 44468 BREAK_PARMS: + 44469 00009613 0001 db 0,1 ;AN000; 1 positional parm + 44470 00009615 [1996] dw BREAK_CONTROL1 ;AN000; + 44471 00009617 00 db 0 ;AN000; no switches + 44472 00009618 00 db 0 ;AN000; no keywords + 44473 + 44474 BREAK_CONTROL1: + 44475 00009619 0120 dw 2001h ;AN000; string value - optional + 44476 0000961B 0200 dw 2 ;AN000; capitalize - char table + 44477 0000961D [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44478 0000961F [2296] dw BREAK_VALUES ;AN000; + 44479 00009621 00 db 0 ;AN000; no keywords + 44480 + 44481 BREAK_VALUES: + 44482 00009622 03 db 3 ;AN000; + 44483 00009623 00 db 0 ;AN000; no ranges + 44484 00009624 00 db 0 ;AN000; no numeric values + 44485 00009625 02 db 2 ;AN000; 2 string values + 44486 00009626 00 db 0 ;AN000; returned if ON + 44487 00009627 [2C96] dw BREAK_ON ;AN000; point to ON string + 44488 00009629 66 db 'f' ;AN000; returned if OFF + 44489 0000962A [2F96] dw BREAK_OFF ;AN000; point to OFF string + 44490 + 44491 BREAK_ON: + 44492 0000962C 4F4E00 db "ON",0 ;AN000; + 44493 BREAK_OFF: + 44494 0000962F 4F464600 db "OFF",0 ;AN000; 44495 - 44496 ; PARSE BLOCK FOR CHCP - 44497 - 44498 ; The following parse control block can be used for any command which - 44499 ; needs only one optional three digit decimal parameter for operands. - 44500 ; Returns verified result in PARSE1_OUTPUT. Currently used for the - 44501 ; CHCP internal command. - 44502 - 44503 CHCP_MINVAL EQU 100 ;AN000; - 44504 CHCP_MAXVAL EQU 999 ;AN000; + 44496 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 44497 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:87A3h + 44498 + 44499 ; PARSE BLOCK FOR CHCP + 44500 + 44501 ; The following parse control block can be used for any command which + 44502 ; needs only one optional three digit decimal parameter for operands. + 44503 ; Returns verified result in PARSE1_OUTPUT. Currently used for the + 44504 ; CHCP internal command. 44505 - 44506 PARSE_CHCP: - 44507 00009633 [3696] dw CHCP_PARMS ;AN000; - 44508 00009635 00 db 0 ;AN000; no extra delimiter - 44509 CHCP_PARMS: - 44510 00009636 0001 db 0,1 ;AN000; 1 positional parm - 44511 00009638 [3C96] dw CHCP_CONTROL1 ;AN000; - 44512 0000963A 00 db 0 ;AN000; no switches - 44513 0000963B 00 db 0 ;AN000; no keywords - 44514 - 44515 CHCP_CONTROL1: - 44516 0000963C 0180 dw 8001h ;AN000; numeric value - optional - 44517 0000963E 0000 dw 0 ;AN000; no function flags - 44518 00009640 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44519 00009642 [4596] dw CHCP_VALUES ;AN000; - 44520 00009644 00 db 0 ;AN000; no keywords - 44521 - 44522 CHCP_VALUES: - 44523 00009645 01 db 1 ;AN000; - 44524 00009646 01 db 1 ;AN000; 1 range - 44525 00009647 01 db 1 ;AN000; returned if result - 44526 00009648 64000000E7030000 dd CHCP_MINVAL,CHCP_MAXVAL ;AN000; minimum & maximum value - 44527 00009650 00 db 0 ;AN000; no numeric values - 44528 00009651 00 db 0 ;AN000; no string values - 44529 - 44530 ; PARSE BLOCK FOR DATE - 44531 - 44532 ; The following parse control block can be used for any command which - 44533 ; needs only an optional date string as an operand. Returns unverified - 44534 ; result in DATE_OUTPUT. Currently used for the DATE internal command. - 44535 - 44536 PARSE_DATE: - 44537 00009652 [5596] dw DATE_PARMS ;AN000; - 44538 00009654 00 db 0 ;AN000; no extra delimiter - 44539 DATE_PARMS: - 44540 00009655 0001 db 0,1 ;AN000; 1 positional parm - 44541 00009657 [5B96] dw DATE_CONTROL1 ;AN000; - 44542 00009659 00 db 0 ;AN000; no switches - 44543 0000965A 00 db 0 ;AN000; no keywords - 44544 - 44545 DATE_CONTROL1: - 44546 0000965B 0110 dw 1001h ;AN000; date - optional - 44547 0000965D 0000 dw 0 ;AN000; no function flags - 44548 0000965F [F3A5] dw DATE_OUTPUT ;AN000; result buffer - 44549 00009661 [E695] dw NO_VALUES ;AN000; - 44550 00009663 00 db 0 ;AN000; no keywords - 44551 - 44552 ; PARSE BLOCK FOR TIME - 44553 - 44554 ; The following parse control block can be used for any command which - 44555 ; needs only an optional time string as an operand. Returns unverified - 44556 ; result in TIME_OUTPUT. Currently used for the TIME internal command. - 44557 - 44558 PARSE_TIME: - 44559 00009664 [6796] dw TIME_PARMS ;AN000; - 44560 00009666 00 db 0 ;AN000; no extra delimiter - 44561 TIME_PARMS: - 44562 00009667 0001 db 0,1 ;AN000; 1 positional parm - 44563 00009669 [6D96] dw TIME_CONTROL1 ;AN000; - 44564 0000966B 00 db 0 ;AN000; no switches - 44565 0000966C 00 db 0 ;AN000; no keywords - 44566 - 44567 TIME_CONTROL1: - 44568 0000966D 0108 dw 0801h ;AN000; TIME - optional - 44569 0000966F 0000 dw 0 ;AN000; no function flags - 44570 00009671 [FBA5] dw TIME_OUTPUT ;AN000; result buffer - 44571 00009673 [E695] dw NO_VALUES ;AN000; - 44572 00009675 00 db 0 ;AN000; no keywords - 44573 - 44574 ; PARSE BLOCK FOR VOL - 44575 - 44576 ; The following parse control block can be used for any command which - 44577 ; needs only an optional drive letter as an operand. Returns unverified - 44578 ; drive number (one based) in DRIVE_OUTPUT. Currently used for the VOL - 44579 ; internal command. - 44580 - 44581 PARSE_VOL: - 44582 00009676 [7996] dw VOL_PARMS ;AN000; - 44583 00009678 00 db 0 ;AN000; no extra delimiter - 44584 VOL_PARMS: - 44585 00009679 0001 db 0,1 ;AN000; 1 positional parm - 44586 0000967B [7F96] dw DRIVE_CONTROL1 ;AN000; - 44587 0000967D 00 db 0 ;AN000; no switches - 44588 0000967E 00 db 0 ;AN000; no keywords - 44589 - 44590 DRIVE_CONTROL1: - 44591 0000967F 0101 dw 0101h ;AN000; DRIVE - optional - 44592 00009681 0100 dw 1 ;AN000; capitalize - file table - 44593 00009683 [03A6] dw DRIVE_OUTPUT ;AN000; result buffer - 44594 00009685 [E695] dw NO_VALUES ;AN000; - 44595 00009687 00 db 0 ;AN000; no keywords - 44596 - 44597 ; PARSE BLOCK FOR MKDIR, RMDIR, TYPE - 44598 - 44599 ; The following parse control block can be used for any command which - 44600 ; needs only one required file specification as an operand. Returns a - 44601 ; pointer to the unverified string in PARSE1_OUTPUT. Currently used - 44602 ; for the MKDIR, RMDIR, and TYPE internal commands. - 44603 - 44604 PARSE_MRDIR: - 44605 00009688 [8B96] dw MRDIR_PARMS ;AN000; - 44606 0000968A 00 db 0 ;AN000; no extra delimiter - 44607 MRDIR_PARMS: - 44608 0000968B 0101 db 1,1 ;AN000; 1 positional parm - 44609 0000968D [E995] dw FILE_REQUIRED ;AN000; - 44610 0000968F 00 db 0 ;AN000; no switches - 44611 00009690 00 db 0 ;AN000; no keywords - 44612 - 44613 ; PARSE BLOCK FOR CHDIR, TRUENAME - 44614 - 44615 ; The following parse control block can be used for any command which - 44616 ; needs only one optional file specification an operand. Returns a - 44617 ; pointer to the unverified string in PARSE1_OUTPUT. Currently used - 44618 ; for the CHDIR and TRUENAME internal commands. - 44619 - 44620 PARSE_CHDIR: - 44621 00009691 [9496] dw CHDIR_PARMS ;AN000; - 44622 00009693 00 db 0 ;AN000; no extra delimiter - 44623 CHDIR_PARMS: - 44624 00009694 0001 db 0,1 ;AN000; 1 positional parm - 44625 00009696 [F295] dw FILE_OPTIONAL ;AN000; - 44626 00009698 00 db 0 ;AN000; no switches - 44627 00009699 00 db 0 ;AN000; no keywords - 44628 - 44629 ; PARSE BLOCK FOR ERASE - 44630 - 44631 ; The following parse control block is used for the DEL/ERASE internal - 44632 ; commands. This command has one required file specification and an - 44633 ; optional switch (/p) as operands. The verified switch or unverified - 44634 ; file specification is returned in PARSE1_OUTPUT. - 44635 - 44636 PARSE_ERASE: - 44637 0000969A [9D96] dw ERASE_PARMS ;AN000; - 44638 0000969C 00 db 0 ;AN000; no extra delimiter - 44639 - 44640 ERASE_PARMS: - 44641 0000969D 0101 db 1,1 ;AN000; 1 positional parm - 44642 0000969F [E995] dw FILE_REQUIRED ;AN000; - 44643 000096A1 01 db 1 ;AN000; 1 switch - 44644 000096A2 [0496] dw SLASH_P_SWITCH ;AN000; - 44645 000096A4 00 db 0 ;AN000; no keywords - 44646 - 44647 ; PARSE BLOCK FOR DIR - 44648 - 44649 ; The following parse control block is used for the DIR internal command. - 44650 ; This command has one optional file specification and several optional - 44651 ; switches. Switches, switch values, and the filespec are returned in - 44652 ; PARSE1_OUTPUT. - 44653 ; - 44654 ; Switches are /a[value], /-a, /o[value], /-o, /s, /-s, /?, /b, /-b, - 44655 ; /w, /-w, /p, and /-p. The string values for /a and /o are optional, - 44656 ; do not require colons, and are not checked against a value list. - 44657 ; - 44658 ; Switch /h has been removed from the DIR command ;M008 - 44659 ; Switch /? is no longer handled internally ;M008 + 44506 CHCP_MINVAL EQU 100 ;AN000; + 44507 CHCP_MAXVAL EQU 999 ;AN000; + 44508 + 44509 PARSE_CHCP: + 44510 00009633 [3696] dw CHCP_PARMS ;AN000; + 44511 00009635 00 db 0 ;AN000; no extra delimiter + 44512 CHCP_PARMS: + 44513 00009636 0001 db 0,1 ;AN000; 1 positional parm + 44514 00009638 [3C96] dw CHCP_CONTROL1 ;AN000; + 44515 0000963A 00 db 0 ;AN000; no switches + 44516 0000963B 00 db 0 ;AN000; no keywords + 44517 + 44518 CHCP_CONTROL1: + 44519 0000963C 0180 dw 8001h ;AN000; numeric value - optional + 44520 0000963E 0000 dw 0 ;AN000; no function flags + 44521 00009640 [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44522 00009642 [4596] dw CHCP_VALUES ;AN000; + 44523 00009644 00 db 0 ;AN000; no keywords + 44524 + 44525 CHCP_VALUES: + 44526 00009645 01 db 1 ;AN000; + 44527 00009646 01 db 1 ;AN000; 1 range + 44528 00009647 01 db 1 ;AN000; returned if result + 44529 00009648 64000000E7030000 dd CHCP_MINVAL,CHCP_MAXVAL ;AN000; minimum & maximum value + 44530 00009650 00 db 0 ;AN000; no numeric values + 44531 00009651 00 db 0 ;AN000; no string values + 44532 + 44533 ; PARSE BLOCK FOR DATE + 44534 + 44535 ; The following parse control block can be used for any command which + 44536 ; needs only an optional date string as an operand. Returns unverified + 44537 ; result in DATE_OUTPUT. Currently used for the DATE internal command. + 44538 + 44539 PARSE_DATE: + 44540 00009652 [5596] dw DATE_PARMS ;AN000; + 44541 00009654 00 db 0 ;AN000; no extra delimiter + 44542 DATE_PARMS: + 44543 00009655 0001 db 0,1 ;AN000; 1 positional parm + 44544 00009657 [5B96] dw DATE_CONTROL1 ;AN000; + 44545 00009659 00 db 0 ;AN000; no switches + 44546 0000965A 00 db 0 ;AN000; no keywords + 44547 + 44548 DATE_CONTROL1: + 44549 0000965B 0110 dw 1001h ;AN000; date - optional + 44550 0000965D 0000 dw 0 ;AN000; no function flags + 44551 0000965F [F3A5] dw DATE_OUTPUT ;AN000; result buffer + 44552 00009661 [E695] dw NO_VALUES ;AN000; + 44553 00009663 00 db 0 ;AN000; no keywords + 44554 + 44555 ; PARSE BLOCK FOR TIME + 44556 + 44557 ; The following parse control block can be used for any command which + 44558 ; needs only an optional time string as an operand. Returns unverified + 44559 ; result in TIME_OUTPUT. Currently used for the TIME internal command. + 44560 + 44561 PARSE_TIME: + 44562 00009664 [6796] dw TIME_PARMS ;AN000; + 44563 00009666 00 db 0 ;AN000; no extra delimiter + 44564 TIME_PARMS: + 44565 00009667 0001 db 0,1 ;AN000; 1 positional parm + 44566 00009669 [6D96] dw TIME_CONTROL1 ;AN000; + 44567 0000966B 00 db 0 ;AN000; no switches + 44568 0000966C 00 db 0 ;AN000; no keywords + 44569 + 44570 TIME_CONTROL1: + 44571 0000966D 0108 dw 0801h ;AN000; TIME - optional + 44572 0000966F 0000 dw 0 ;AN000; no function flags + 44573 00009671 [FBA5] dw TIME_OUTPUT ;AN000; result buffer + 44574 00009673 [E695] dw NO_VALUES ;AN000; + 44575 00009675 00 db 0 ;AN000; no keywords + 44576 + 44577 ; PARSE BLOCK FOR VOL + 44578 + 44579 ; The following parse control block can be used for any command which + 44580 ; needs only an optional drive letter as an operand. Returns unverified + 44581 ; drive number (one based) in DRIVE_OUTPUT. Currently used for the VOL + 44582 ; internal command. + 44583 + 44584 PARSE_VOL: + 44585 00009676 [7996] dw VOL_PARMS ;AN000; + 44586 00009678 00 db 0 ;AN000; no extra delimiter + 44587 VOL_PARMS: + 44588 00009679 0001 db 0,1 ;AN000; 1 positional parm + 44589 0000967B [7F96] dw DRIVE_CONTROL1 ;AN000; + 44590 0000967D 00 db 0 ;AN000; no switches + 44591 0000967E 00 db 0 ;AN000; no keywords + 44592 + 44593 DRIVE_CONTROL1: + 44594 0000967F 0101 dw 0101h ;AN000; DRIVE - optional + 44595 00009681 0100 dw 1 ;AN000; capitalize - file table + 44596 00009683 [03A6] dw DRIVE_OUTPUT ;AN000; result buffer + 44597 00009685 [E695] dw NO_VALUES ;AN000; + 44598 00009687 00 db 0 ;AN000; no keywords + 44599 + 44600 ; PARSE BLOCK FOR MKDIR, RMDIR, TYPE + 44601 + 44602 ; The following parse control block can be used for any command which + 44603 ; needs only one required file specification as an operand. Returns a + 44604 ; pointer to the unverified string in PARSE1_OUTPUT. Currently used + 44605 ; for the MKDIR, RMDIR, and TYPE internal commands. + 44606 + 44607 PARSE_MRDIR: + 44608 00009688 [8B96] dw MRDIR_PARMS ;AN000; + 44609 0000968A 00 db 0 ;AN000; no extra delimiter + 44610 MRDIR_PARMS: + 44611 0000968B 0101 db 1,1 ;AN000; 1 positional parm + 44612 0000968D [E995] dw FILE_REQUIRED ;AN000; + 44613 0000968F 00 db 0 ;AN000; no switches + 44614 00009690 00 db 0 ;AN000; no keywords + 44615 + 44616 ; PARSE BLOCK FOR CHDIR, TRUENAME + 44617 + 44618 ; The following parse control block can be used for any command which + 44619 ; needs only one optional file specification an operand. Returns a + 44620 ; pointer to the unverified string in PARSE1_OUTPUT. Currently used + 44621 ; for the CHDIR and TRUENAME internal commands. + 44622 + 44623 PARSE_CHDIR: + 44624 00009691 [9496] dw CHDIR_PARMS ;AN000; + 44625 00009693 00 db 0 ;AN000; no extra delimiter + 44626 CHDIR_PARMS: + 44627 00009694 0001 db 0,1 ;AN000; 1 positional parm + 44628 00009696 [F295] dw FILE_OPTIONAL ;AN000; + 44629 00009698 00 db 0 ;AN000; no switches + 44630 00009699 00 db 0 ;AN000; no keywords + 44631 + 44632 ; PARSE BLOCK FOR ERASE + 44633 + 44634 ; The following parse control block is used for the DEL/ERASE internal + 44635 ; commands. This command has one required file specification and an + 44636 ; optional switch (/p) as operands. The verified switch or unverified + 44637 ; file specification is returned in PARSE1_OUTPUT. + 44638 + 44639 PARSE_ERASE: + 44640 0000969A [9D96] dw ERASE_PARMS ;AN000; + 44641 0000969C 00 db 0 ;AN000; no extra delimiter + 44642 + 44643 ERASE_PARMS: + 44644 0000969D 0101 db 1,1 ;AN000; 1 positional parm + 44645 0000969F [E995] dw FILE_REQUIRED ;AN000; + 44646 000096A1 01 db 1 ;AN000; 1 switch + 44647 000096A2 [0496] dw SLASH_P_SWITCH ;AN000; + 44648 000096A4 00 db 0 ;AN000; no keywords + 44649 + 44650 ; PARSE BLOCK FOR DIR + 44651 + 44652 ; The following parse control block is used for the DIR internal command. + 44653 ; This command has one optional file specification and several optional + 44654 ; switches. Switches, switch values, and the filespec are returned in + 44655 ; PARSE1_OUTPUT. + 44656 ; + 44657 ; Switches are /a[value], /-a, /o[value], /-o, /s, /-s, /?, /b, /-b, + 44658 ; /w, /-w, /p, and /-p. The string values for /a and /o are optional, + 44659 ; do not require colons, and are not checked against a value list. 44660 ; - 44661 ; A list of pointers to all the switch synonyms is provided here to - 44662 ; help identify which switch has been matched. - 44663 - 44664 ; 15/04/2023 - Retro DOS v4.0 COMMAND.COM - 44665 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8815h + 44661 ; Switch /h has been removed from the DIR command ;M008 + 44662 ; Switch /? is no longer handled internally ;M008 + 44663 ; + 44664 ; A list of pointers to all the switch synonyms is provided here to + 44665 ; help identify which switch has been matched. 44666 - 44667 PARSE_DIR: - 44668 000096A5 [A896] dw DIR_PARMS - 44669 000096A7 00 db 0 ; no extra delimiters - 44670 DIR_PARMS: - 44671 000096A8 0001 db 0,1 ; 1 optional positional param - 44672 000096AA [FB95] dw FILE_OPTIONAL2 - 44673 000096AC 02 db 2 ; 2 kinds of switches - 44674 000096AD [B296] dw DIR_SW_VALUED - 44675 000096AF [C196] dw DIR_SW_UNVALUED - 44676 000096B1 00 db 0 ; no keywords - 44677 - 44678 DIR_SW_VALUED: - 44679 000096B2 0120 dw 2001h ; optional string value - 44680 000096B4 2100 dw 21h ; optional colon; capitalize - 44681 000096B6 [EBA5] dw PARSE1_OUTPUT ; result buffer - 44682 000096B8 [E895] dw NULL_VALUE_LIST ; don't validate value - 44683 - 44684 ; 18/06/2023 - 44685 ;db 2 + 44667 ; 15/04/2023 - Retro DOS v4.0 COMMAND.COM + 44668 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8815h + 44669 + 44670 PARSE_DIR: + 44671 000096A5 [A896] dw DIR_PARMS + 44672 000096A7 00 db 0 ; no extra delimiters + 44673 DIR_PARMS: + 44674 000096A8 0001 db 0,1 ; 1 optional positional param + 44675 000096AA [FB95] dw FILE_OPTIONAL2 + 44676 000096AC 02 db 2 ; 2 kinds of switches + 44677 000096AD [B296] dw DIR_SW_VALUED + 44678 000096AF [C196] dw DIR_SW_UNVALUED + 44679 000096B1 00 db 0 ; no keywords + 44680 + 44681 DIR_SW_VALUED: + 44682 000096B2 0120 dw 2001h ; optional string value + 44683 000096B4 2100 dw 21h ; optional colon; capitalize + 44684 000096B6 [EBA5] dw PARSE1_OUTPUT ; result buffer + 44685 000096B8 [E895] dw NULL_VALUE_LIST ; don't validate value 44686 - 44687 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44688 ; PCDOS 7.1 COMMAND.COM - 44689 %if 0 - 44690 ; MSDOS 6.0 COMMAND.COM - 44691 ;ifdef DBLSPACE_HOOKS - 44692 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44693 db 3 ; 3 'synonyms' - 44694 ;else - 44695 %else - 44696 000096BA 02 db 2 ; 2 'synonyms' - 44697 ;endif - 44698 %endif - 44699 - 44700 DIR_SW_A: - 44701 000096BB 2F4100 db "/A",0 - 44702 DIR_SW_O: - 44703 000096BE 2F4F00 db "/O",0 - 44704 - 44705 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44706 ; PCDOS 7.1 COMMAND.COM - 44707 %if 0 - 44708 ; MSDOS 6.0 COMMAND.COM - 44709 ;ifdef DBLSPACE_HOOKS - 44710 ; 18/06/2023 - 44711 DIR_SW_C: - 44712 db "/C",0 - 44713 ;endif - 44714 %endif - 44715 - 44716 DIR_SW_UNVALUED: - 44717 000096C1 0000 dw 0 ; no value - 44718 000096C3 0000 dw 0 ; no format functions - 44719 000096C5 [EBA5] dw PARSE1_OUTPUT ; result buffer - 44720 000096C7 [E695] dw NO_VALUES - 44721 - 44722 ; 15/04/2023 - Retro DOS v4.0 COMMAND.COM - 44723 ;;db 12 - 44724 - 44725 ; 18/06/2023 - 44726 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8839h - 44727 ;db 14 ; 14 'synonyms' !? - 44728 - 44729 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44730 ; PCDOS 7.1 COMMAND.COM - 44731 %if 0 - 44732 ; MSDOS 6.0 COMMAND.COM - 44733 ;ifdef DBLSPACE_HOOKS - 44734 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44735 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9DB0h - 44736 db 13 ; 13 'synonyms' - 44737 ;else - 44738 ;db 12 ; 12 'synonyms' - 44739 %else - 44740 000096C9 10 db 16 ; 16 'synonyms' - 44741 ;endif - 44742 %endif - 44743 - 44744 DIR_SW_NEG_A: - 44745 000096CA 2F2D4100 db "/-A",0 - 44746 DIR_SW_NEG_O: - 44747 000096CE 2F2D4F00 db "/-O",0 - 44748 DIR_SW_S: - 44749 000096D2 2F5300 db "/S",0 - 44750 DIR_SW_NEG_S: - 44751 000096D5 2F2D5300 db "/-S",0 - 44752 DIR_SW_B: - 44753 000096D9 2F4200 db "/B",0 - 44754 DIR_SW_NEG_B: - 44755 000096DC 2F2D4200 db "/-B",0 - 44756 DIR_SW_W: - 44757 000096E0 2F5700 db "/W",0 - 44758 DIR_SW_NEG_W: - 44759 000096E3 2F2D5700 db "/-W",0 - 44760 DIR_SW_P: - 44761 000096E7 2F5000 db "/P",0 - 44762 DIR_SW_NEG_P: - 44763 000096EA 2F2D5000 db "/-P",0 - 44764 DIR_SW_L: - 44765 000096EE 2F4C00 db "/L",0 ;M010 - 44766 DIR_SW_NEG_L: - 44767 000096F1 2F2D4C00 db "/-L",0 ;M010 - 44768 - 44769 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44770 ; PCDOS 7.1 COMMAND.COM - 44771 %if 0 - 44772 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44773 ; MSDOS 6.0 COMMAND.COM (DBLSPACE_HOOKS) - 44774 DIR_SW_NEG_C: - 44775 db "/-C",0 - 44776 %else - 44777 DIR_SW_Z: - 44778 000096F5 2F5A00 db "/Z",0 - 44779 DIR_SW_NEG_Z: - 44780 000096F8 2F2D5A00 db "/-Z",0 - 44781 DIR_SW_4: - 44782 000096FC 2F3400 db "/4",0 - 44783 DIR_SW_NEG_4: - 44784 000096FF 2F2D3400 db "/-4",0 - 44785 %endif - 44786 - 44787 ; Here's a list of pointers to DIR's switch synonyms, for easier - 44788 ; identification. Order is critical - DIR routines rely on the - 44789 ; specific order in this list. Negated options appear at odd - 44790 ; positions in the list, and simple on/off options appear first. - 44791 - 44792 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44793 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9DE0h - 44794 Dir_Sw_Ptrs: ; list of ptrs to switch synonyms - 44795 - 44796 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44797 ; PCDOS 7.1 COMMAND.COM - 44798 %if 0 - 44799 ; 18/06/2023 - 44800 ; MSDOS 6.0 COMMAND.COM ; * - 44801 dw DIR_SW_NEG_C ; * - 44802 Dir_Sw_Ptrs_2: - 44803 dw DIR_SW_C ; * - 44804 ; MSDOS 5.0 COMMAND.COM - 44805 %endif - 44806 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44807 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9BD1h - 44808 Dir_Sw_Ptrs: - 44809 00009703 [E396] dw DIR_SW_NEG_W - 44810 Dir_Sw_Ptrs_2: - 44811 00009705 [E096] dw DIR_SW_W - 44812 00009707 [EA96] dw DIR_SW_NEG_P - 44813 00009709 [E796] dw DIR_SW_P - 44814 0000970B [D596] dw DIR_SW_NEG_S - 44815 0000970D [D296] dw DIR_SW_S - 44816 0000970F [DC96] dw DIR_SW_NEG_B - 44817 00009711 [D996] dw DIR_SW_B - 44818 00009713 [F196] dw DIR_SW_NEG_L ;M010 - 44819 00009715 [EE96] dw DIR_SW_L ;M010 - 44820 - 44821 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 44822 ; PCDOS 7.1 COMMAND.COM - 44823 %if 1 - 44824 00009717 [F896] dw DIR_SW_NEG_Z - 44825 00009719 [F596] dw DIR_SW_Z - 44826 0000971B [FF96] dw DIR_SW_NEG_4 - 44827 0000971D [FC96] dw DIR_SW_4 - 44828 %endif - 44829 0000971F [CE96] dw DIR_SW_NEG_O - 44830 00009721 [BE96] dw DIR_SW_O - 44831 00009723 [CA96] dw DIR_SW_NEG_A - 44832 00009725 [BB96] dw DIR_SW_A - 44833 - 44834 ; PARSE BLOCK FOR RENAME - 44835 - 44836 ; The following parse control block can be used for any command which - 44837 ; needs only two required file specifications as operands. Returns - 44838 ; pointers to the unverified string in PARSE1_OUTPUT. - 44839 ; Currently used for the RENAME internal command. - 44840 - 44841 PARSE_RENAME: - 44842 00009727 [2A97] dw RENAME_PARMS ;AN000; - 44843 00009729 00 db 0 ;AN000; no extra delimiter - 44844 RENAME_PARMS: - 44845 0000972A 0202 db 2,2 ;AN000; 2 positional parms - 44846 0000972C [E995] dw FILE_REQUIRED ;AN000; - 44847 0000972E [E995] dw FILE_REQUIRED ;AN000; - 44848 00009730 00 db 0 ;AN000; no switches - 44849 00009731 00 db 0 ;AN000; no keywords - 44850 - 44851 ; PARSE BLOCK FOR CTTY - 44852 - 44853 ; The following parse control block can be used for any command which - 44854 ; needs one required device name as an operand. Returns a pointer to - 44855 ; unverified string in PARSE1_OUTPUT. Currently used for the CTTY - 44856 ; internal command. - 44857 - 44858 PARSE_CTTY: - 44859 00009732 [3597] dw CTTY_PARMS ;AN000; - 44860 00009734 00 db 0 ;AN000; no extra delimiter - 44861 CTTY_PARMS: - 44862 00009735 0101 db 1,1 ;AN000; 1 positional parm - 44863 00009737 [3B97] dw CTTY_CONTROL1 ;AN000; - 44864 00009739 00 db 0 ;AN000; no switches - 44865 0000973A 00 db 0 ;AN000; no keywords - 44866 CTTY_CONTROL1: - 44867 0000973B 0020 dw 2000h ;AN000; string value - required - 44868 0000973D 1100 dw 11h ;AN000; capitalize - file table - 44869 ;AN000; remove colon at end - 44870 0000973F [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer - 44871 00009741 [E695] dw NO_VALUES ;AN000; - 44872 00009743 00 db 0 ;AN000; no keywords - 44873 - 44874 ; PARSE BLOCK FOR VER - 44875 - 44876 ; The following parse control block can be used for any command which - 44877 ; needs an optional switch "/debug". Currently used for the VER command. + 44687 ; 18/06/2023 + 44688 ;db 2 + 44689 + 44690 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44691 ; PCDOS 7.1 COMMAND.COM + 44692 %if 0 + 44693 ; MSDOS 6.0 COMMAND.COM + 44694 ;ifdef DBLSPACE_HOOKS + 44695 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44696 db 3 ; 3 'synonyms' + 44697 ;else + 44698 %else + 44699 000096BA 02 db 2 ; 2 'synonyms' + 44700 ;endif + 44701 %endif + 44702 + 44703 DIR_SW_A: + 44704 000096BB 2F4100 db "/A",0 + 44705 DIR_SW_O: + 44706 000096BE 2F4F00 db "/O",0 + 44707 + 44708 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44709 ; PCDOS 7.1 COMMAND.COM + 44710 %if 0 + 44711 ; MSDOS 6.0 COMMAND.COM + 44712 ;ifdef DBLSPACE_HOOKS + 44713 ; 18/06/2023 + 44714 DIR_SW_C: + 44715 db "/C",0 + 44716 ;endif + 44717 %endif + 44718 + 44719 DIR_SW_UNVALUED: + 44720 000096C1 0000 dw 0 ; no value + 44721 000096C3 0000 dw 0 ; no format functions + 44722 000096C5 [EBA5] dw PARSE1_OUTPUT ; result buffer + 44723 000096C7 [E695] dw NO_VALUES + 44724 + 44725 ; 15/04/2023 - Retro DOS v4.0 COMMAND.COM + 44726 ;;db 12 + 44727 + 44728 ; 18/06/2023 + 44729 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8839h + 44730 ;db 14 ; 14 'synonyms' !? + 44731 + 44732 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44733 ; PCDOS 7.1 COMMAND.COM + 44734 %if 0 + 44735 ; MSDOS 6.0 COMMAND.COM + 44736 ;ifdef DBLSPACE_HOOKS + 44737 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44738 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9DB0h + 44739 db 13 ; 13 'synonyms' + 44740 ;else + 44741 ;db 12 ; 12 'synonyms' + 44742 %else + 44743 000096C9 10 db 16 ; 16 'synonyms' + 44744 ;endif + 44745 %endif + 44746 + 44747 DIR_SW_NEG_A: + 44748 000096CA 2F2D4100 db "/-A",0 + 44749 DIR_SW_NEG_O: + 44750 000096CE 2F2D4F00 db "/-O",0 + 44751 DIR_SW_S: + 44752 000096D2 2F5300 db "/S",0 + 44753 DIR_SW_NEG_S: + 44754 000096D5 2F2D5300 db "/-S",0 + 44755 DIR_SW_B: + 44756 000096D9 2F4200 db "/B",0 + 44757 DIR_SW_NEG_B: + 44758 000096DC 2F2D4200 db "/-B",0 + 44759 DIR_SW_W: + 44760 000096E0 2F5700 db "/W",0 + 44761 DIR_SW_NEG_W: + 44762 000096E3 2F2D5700 db "/-W",0 + 44763 DIR_SW_P: + 44764 000096E7 2F5000 db "/P",0 + 44765 DIR_SW_NEG_P: + 44766 000096EA 2F2D5000 db "/-P",0 + 44767 DIR_SW_L: + 44768 000096EE 2F4C00 db "/L",0 ;M010 + 44769 DIR_SW_NEG_L: + 44770 000096F1 2F2D4C00 db "/-L",0 ;M010 + 44771 + 44772 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44773 ; PCDOS 7.1 COMMAND.COM + 44774 %if 0 + 44775 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44776 ; MSDOS 6.0 COMMAND.COM (DBLSPACE_HOOKS) + 44777 DIR_SW_NEG_C: + 44778 db "/-C",0 + 44779 %else + 44780 DIR_SW_Z: + 44781 000096F5 2F5A00 db "/Z",0 + 44782 DIR_SW_NEG_Z: + 44783 000096F8 2F2D5A00 db "/-Z",0 + 44784 DIR_SW_4: + 44785 000096FC 2F3400 db "/4",0 + 44786 DIR_SW_NEG_4: + 44787 000096FF 2F2D3400 db "/-4",0 + 44788 %endif + 44789 + 44790 ; Here's a list of pointers to DIR's switch synonyms, for easier + 44791 ; identification. Order is critical - DIR routines rely on the + 44792 ; specific order in this list. Negated options appear at odd + 44793 ; positions in the list, and simple on/off options appear first. + 44794 + 44795 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 44796 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9DE0h + 44797 Dir_Sw_Ptrs: ; list of ptrs to switch synonyms + 44798 + 44799 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44800 ; PCDOS 7.1 COMMAND.COM + 44801 %if 0 + 44802 ; 18/06/2023 + 44803 ; MSDOS 6.0 COMMAND.COM ; * + 44804 dw DIR_SW_NEG_C ; * + 44805 Dir_Sw_Ptrs_2: + 44806 dw DIR_SW_C ; * + 44807 ; MSDOS 5.0 COMMAND.COM + 44808 %endif + 44809 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44810 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9BD1h + 44811 Dir_Sw_Ptrs: + 44812 00009703 [E396] dw DIR_SW_NEG_W + 44813 Dir_Sw_Ptrs_2: + 44814 00009705 [E096] dw DIR_SW_W + 44815 00009707 [EA96] dw DIR_SW_NEG_P + 44816 00009709 [E796] dw DIR_SW_P + 44817 0000970B [D596] dw DIR_SW_NEG_S + 44818 0000970D [D296] dw DIR_SW_S + 44819 0000970F [DC96] dw DIR_SW_NEG_B + 44820 00009711 [D996] dw DIR_SW_B + 44821 00009713 [F196] dw DIR_SW_NEG_L ;M010 + 44822 00009715 [EE96] dw DIR_SW_L ;M010 + 44823 + 44824 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 44825 ; PCDOS 7.1 COMMAND.COM + 44826 %if 1 + 44827 00009717 [F896] dw DIR_SW_NEG_Z + 44828 00009719 [F596] dw DIR_SW_Z + 44829 0000971B [FF96] dw DIR_SW_NEG_4 + 44830 0000971D [FC96] dw DIR_SW_4 + 44831 %endif + 44832 0000971F [CE96] dw DIR_SW_NEG_O + 44833 00009721 [BE96] dw DIR_SW_O + 44834 00009723 [CA96] dw DIR_SW_NEG_A + 44835 00009725 [BB96] dw DIR_SW_A + 44836 + 44837 ; PARSE BLOCK FOR RENAME + 44838 + 44839 ; The following parse control block can be used for any command which + 44840 ; needs only two required file specifications as operands. Returns + 44841 ; pointers to the unverified string in PARSE1_OUTPUT. + 44842 ; Currently used for the RENAME internal command. + 44843 + 44844 PARSE_RENAME: + 44845 00009727 [2A97] dw RENAME_PARMS ;AN000; + 44846 00009729 00 db 0 ;AN000; no extra delimiter + 44847 RENAME_PARMS: + 44848 0000972A 0202 db 2,2 ;AN000; 2 positional parms + 44849 0000972C [E995] dw FILE_REQUIRED ;AN000; + 44850 0000972E [E995] dw FILE_REQUIRED ;AN000; + 44851 00009730 00 db 0 ;AN000; no switches + 44852 00009731 00 db 0 ;AN000; no keywords + 44853 + 44854 ; PARSE BLOCK FOR CTTY + 44855 + 44856 ; The following parse control block can be used for any command which + 44857 ; needs one required device name as an operand. Returns a pointer to + 44858 ; unverified string in PARSE1_OUTPUT. Currently used for the CTTY + 44859 ; internal command. + 44860 + 44861 PARSE_CTTY: + 44862 00009732 [3597] dw CTTY_PARMS ;AN000; + 44863 00009734 00 db 0 ;AN000; no extra delimiter + 44864 CTTY_PARMS: + 44865 00009735 0101 db 1,1 ;AN000; 1 positional parm + 44866 00009737 [3B97] dw CTTY_CONTROL1 ;AN000; + 44867 00009739 00 db 0 ;AN000; no switches + 44868 0000973A 00 db 0 ;AN000; no keywords + 44869 CTTY_CONTROL1: + 44870 0000973B 0020 dw 2000h ;AN000; string value - required + 44871 0000973D 1100 dw 11h ;AN000; capitalize - file table + 44872 ;AN000; remove colon at end + 44873 0000973F [EBA5] dw PARSE1_OUTPUT ;AN000; result buffer + 44874 00009741 [E695] dw NO_VALUES ;AN000; + 44875 00009743 00 db 0 ;AN000; no keywords + 44876 + 44877 ; PARSE BLOCK FOR VER 44878 - 44879 PARSE_VER: - 44880 00009744 [4797] dw VER_PARMS - 44881 00009746 00 db 0 ; no extra delimiters - 44882 VER_PARMS: - 44883 00009747 0000 db 0,0 ; no positional parameters - 44884 ; 20/07/2024 - Retro DOS v5 COMMAND.COM - 44885 %if 0 ; PCDOS 7.1 (& MSDOS 5.0-6.22) COMMAND.COM - 44886 db 1 ; one switch - 44887 dw SLASH_R - 44888 %else - 44889 ; 20/07/2024 - Retro DOS v4-v5 COMMAND.COM - 44890 00009749 02 db 2 - 44891 0000974A [4F97] dw SLASH_R - 44892 0000974C [5B97] dw SLASH_T ; Retro DOS v4-v5 COMMAND.COM switch - 44893 %endif - 44894 0000974E 00 db 0 ; no keywords - 44895 SLASH_R: - 44896 0000974F 0000 dw 0 ; no values - 44897 00009751 0200 dw 2 ; capitalize by filename table - 44898 00009753 [EBA5] dw PARSE1_OUTPUT ; result buffer - 44899 00009755 [E695] dw NO_VALUES ; no values - 44900 00009757 01 db 1 ; one synonym - 44901 SLASH_R_SYN: - 44902 00009758 2F5200 db "/R",0 - 44903 - 44904 ; 20/07/2024 - Retro DOS v5 COMMAND.COM - 44905 %if 1 - 44906 SLASH_T: - 44907 0000975B 0000 dw 0 ; no values - 44908 0000975D 0200 dw 2 ; capitalize by filename table - 44909 0000975F [EBA5] dw PARSE1_OUTPUT ; result buffer - 44910 00009761 [E695] dw NO_VALUES ; no values - 44911 00009763 01 db 1 ; one synonym - 44912 SLASH_T_SYN: - 44913 00009764 2F5400 db "/T",0 - 44914 %endif - 44915 - 44916 ; M003 ; Start of changes for LoadHigh support - 44917 - 44918 ;Parse Control Block for LOADHIGH command - 44919 - 44920 Parse_LoadHi: - 44921 00009767 [6A97] dw LoadHi_Parms ;extended parm table - 44922 00009769 00 db 0 ;no extra delimiters - 44923 - 44924 LoadHi_Parms: - 44925 0000976A 0101 db 1,1 ;min. 1 parm, max. 1 parm - 44926 0000976C [E995] dw FILE_REQUIRED ;control struc for filename - 44927 0000976E 00 db 0 ;no switches - 44928 0000976F 00 db 0 ;no keywords - 44929 - 44930 ; M003 ; End of changes for LoadHigh support - 44931 - 44932 TempVarName: - 44933 00009770 54454D503D00 db "TEMP=",0 + 44879 ; The following parse control block can be used for any command which + 44880 ; needs an optional switch "/debug". Currently used for the VER command. + 44881 + 44882 PARSE_VER: + 44883 00009744 [4797] dw VER_PARMS + 44884 00009746 00 db 0 ; no extra delimiters + 44885 VER_PARMS: + 44886 00009747 0000 db 0,0 ; no positional parameters + 44887 ; 20/07/2024 - Retro DOS v5 COMMAND.COM + 44888 %if 0 ; PCDOS 7.1 (& MSDOS 5.0-6.22) COMMAND.COM + 44889 db 1 ; one switch + 44890 dw SLASH_R + 44891 %else + 44892 ; 20/07/2024 - Retro DOS v4-v5 COMMAND.COM + 44893 00009749 02 db 2 + 44894 0000974A [4F97] dw SLASH_R + 44895 0000974C [5B97] dw SLASH_T ; Retro DOS v4-v5 COMMAND.COM switch + 44896 %endif + 44897 0000974E 00 db 0 ; no keywords + 44898 SLASH_R: + 44899 0000974F 0000 dw 0 ; no values + 44900 00009751 0200 dw 2 ; capitalize by filename table + 44901 00009753 [EBA5] dw PARSE1_OUTPUT ; result buffer + 44902 00009755 [E695] dw NO_VALUES ; no values + 44903 00009757 01 db 1 ; one synonym + 44904 SLASH_R_SYN: + 44905 00009758 2F5200 db "/R",0 + 44906 + 44907 ; 20/07/2024 - Retro DOS v5 COMMAND.COM + 44908 %if 1 + 44909 SLASH_T: + 44910 0000975B 0000 dw 0 ; no values + 44911 0000975D 0200 dw 2 ; capitalize by filename table + 44912 0000975F [EBA5] dw PARSE1_OUTPUT ; result buffer + 44913 00009761 [E695] dw NO_VALUES ; no values + 44914 00009763 01 db 1 ; one synonym + 44915 SLASH_T_SYN: + 44916 00009764 2F5400 db "/T",0 + 44917 %endif + 44918 + 44919 ; M003 ; Start of changes for LoadHigh support + 44920 + 44921 ;Parse Control Block for LOADHIGH command + 44922 + 44923 Parse_LoadHi: + 44924 00009767 [6A97] dw LoadHi_Parms ;extended parm table + 44925 00009769 00 db 0 ;no extra delimiters + 44926 + 44927 LoadHi_Parms: + 44928 0000976A 0101 db 1,1 ;min. 1 parm, max. 1 parm + 44929 0000976C [E995] dw FILE_REQUIRED ;control struc for filename + 44930 0000976E 00 db 0 ;no switches + 44931 0000976F 00 db 0 ;no keywords + 44932 + 44933 ; M003 ; End of changes for LoadHigh support 44934 - 44935 ; 16/04/2023 - Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM - 44936 ;TRANDATAEND: ; TRANGROUP:88C2h + 44935 TempVarName: + 44936 00009770 54454D503D00 db "TEMP=",0 44937 - 44938 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 44939 copycmd: - 44940 00009776 434F5059434D443D db 'COPYCMD=' - 44941 - 44942 ; 06/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM - 44943 %if 0 - 44944 sCVFRoot: - 44945 db '\DBLSPACE.' - 44946 %else - 44947 ; 06/08/2024 - 44948 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9C3Eh - 44949 REXX_EXE: - 44950 0000977E 524558582E45584500 db 'REXX.EXE',0 - 44951 %endif - 44952 - 44953 ; ---------------------------------------------------------------------------- - 44954 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM - 44955 %if 1 - 44956 00009787 0D0A RD5CMD_VER_MSG: db 0Dh, 0Ah - 44957 00009789 526574726F20444F53- db 'Retro DOS v5 COMMAND.COM' - 44957 00009792 20763520434F4D4D41- - 44957 0000979B 4E442E434F4D - 44958 000097A1 0D0A db 0Dh, 0Ah - 44959 000097A3 32303234202D204572- db '2024 - Erdogan Tan' - 44959 000097AC 646F67616E2054616E - 44960 000097B5 0D0A db 0Dh,0Ah - 44961 000097B7 24 db '$' - 44962 %endif - 44963 ; ---------------------------------------------------------------------------- - 44964 - 44965 ; 18/06/2023 - 44966 ; MSDOS 6.22 COMMAND.COM - 44967 TRANDATAEND: ; TRANGROUP:9E53h - 44968 - 44969 ;============================================================================ - 44970 ; PSDATA.INC, MSDOS 6.0, 1991 - 44971 ;============================================================================ - 44972 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 44973 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 44974 - 44975 ; 18/04/2023 - 44976 TRANSPACESTART: + 44938 ; 16/04/2023 - Retro DOS v4.0 (MSDOS 5.0) COMMAND.COM + 44939 ;TRANDATAEND: ; TRANGROUP:88C2h + 44940 + 44941 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 44942 copycmd: + 44943 00009776 434F5059434D443D db 'COPYCMD=' + 44944 + 44945 ; 06/08/2024 - Retro DOS v5.0 - PCDOS 7.1 COMMAND.COM + 44946 %if 0 + 44947 sCVFRoot: + 44948 db '\DBLSPACE.' + 44949 %else + 44950 ; 06/08/2024 + 44951 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9C3Eh + 44952 REXX_EXE: + 44953 0000977E 524558582E45584500 db 'REXX.EXE',0 + 44954 %endif + 44955 + 44956 ; ---------------------------------------------------------------------------- + 44957 ; 20/07/2024 - Retro DOS v5.0 COMMAND.COM + 44958 %if 1 + 44959 00009787 0D0A RD5CMD_VER_MSG: db 0Dh, 0Ah + 44960 00009789 526574726F20444F53- db 'Retro DOS v5 COMMAND.COM' + 44960 00009792 20763520434F4D4D41- + 44960 0000979B 4E442E434F4D + 44961 000097A1 0D0A db 0Dh, 0Ah + 44962 000097A3 32303234202D204572- db '2024 - Erdogan Tan' + 44962 000097AC 646F67616E2054616E + 44963 000097B5 0D0A db 0Dh,0Ah + 44964 000097B7 24 db '$' + 44965 %endif + 44966 ; ---------------------------------------------------------------------------- + 44967 + 44968 ; 18/06/2023 + 44969 ; MSDOS 6.22 COMMAND.COM + 44970 TRANDATAEND: ; TRANGROUP:9E53h + 44971 + 44972 ;============================================================================ + 44973 ; PSDATA.INC, MSDOS 6.0, 1991 + 44974 ;============================================================================ + 44975 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 44976 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM 44977 - 44978 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:88C2h - 44979 - 44980 ; 18/06/2023 - 44981 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9E53h - 44982 - 44983 ;********************** Local Data ************************************* - 44984 - 44985 $P_ORDINAL: - 44986 000097B8 0000 dw 0 ;AN000; Operand ordinal save area - 44987 $P_RC: - 44988 000097BA 0000 dw 0 ;AN000; Return code from parser - 44989 $P_SI_Save: - 44990 000097BC 0000 dw 0 ;AN000; Pointer of command buffer - 44991 $P_DX: - 44992 000097BE 0000 dw 0 ;AN000; Return result buffer address - 44993 $P_Terminator: - 44994 000097C0 00 db 0 ;AN000; Terminator code (ASCII) - 44995 $P_DBCSEV_OFF: - 44996 000097C1 0000 dw 0 ;AN000; Offset of DBCS EV - 44997 $P_DBCSEV_SEG: - 44998 000097C3 0000 dw 0 ;AN000; Segment of DBCS EV - 44999 $P_Flags: ;AN000; Parser internal flags - 45000 $P_Flags1: - 45001 000097C5 00 db 0 ;AN038; to reference first byte flags - 45002 $P_Flags2: - 45003 000097C6 00 db 0 ;AN038; to reference second byte flags only - 45004 $P_SaveSI_Cmpx: - 45005 000097C7 0000 dw 0 ;AN000; save si for later use by complex - 45006 $P_KEYorSW_Ptr: - 45007 000097C9 0000 dw 0 ;AN000; points next to "=" or ":" code - 45008 $P_Save_EOB: - 45009 000097CB 0000 dw 0 ;AN000; save pointer to EOB - 45010 $P_Found_SYNONYM: - 45011 000097CD 0000 dw 0 ;AN000; es:@ points to found synonym - 45012 $P_STRING_BUF: - 45013 000097CF 00 times 128 db 0 ;AN000; Pick a operand from command line - 45014 $P_ORIG_ORD: - 45015 0000984F 0000 dw 0 ;AN039; ORIGINAL ORDINAL FROM CX - 45016 $P_ORIG_STACK: - 45017 00009851 0000 dw 0 ;AN039; ORIGINAL VALUE OF STACK FROM SP - 45018 $P_ORIG_SI: - 45019 00009853 0000 dw 0 ;AN039; ORIGINAL START PARSE POINTER FROM SI - 45020 $P_Got_Time: - 45021 00009855 00 db 0 ;AN023; if 1, use Time delimiters - 45022 $P_Country_Info: - 45023 00009856 FFFF dw -1 ; 0FFFFh - 45024 00009858 00 times 32 db 0 - 45025 $P_1st_Val: - 45026 00009878 0000 dw 0 ;AN000; used when process date or time - 45027 $P_2nd_Val: - 45028 0000987A 0000 dw 0 ;AN000; used when process date or time - 45029 $P_3rd_Val: - 45030 0000987C 0000 dw 0 ;AN000; used when process date or time - 45031 $P_4th_Val: - 45032 0000987E 0000 dw 0 ;AN000; used when process date or time - 45033 $P_Char_CAP_Ptr: - 45034 00009880 FF db 0FFh ;AN000; info id - 45035 00009881 0000 dw 0 ;AN000; offset of char case map table - 45036 00009883 0000 dw 0 ;AN000; segment of char case map table - 45037 $P_File_CAP_Ptr: - 45038 00009885 FF db 0FFh ;AN000; info id - 45039 00009886 0000 dw 0 ;AN000; offset of file case map table - 45040 00009888 0000 dw 0 ;AN000; segment of file case map table - 45041 - 45042 ; 18/04/2023 - 45043 ;M029 - 45044 ;!!!WARNING!!! - 45045 ; In routine SYSPARSE (parse.asm), $P_FileSp_Char is reinitialized using - 45046 ;hardcoded strings. If the chars in the string are changed here, corresponding - 45047 ;changes need to be made in SYSPARSE - 45048 - 45049 $P_FileSp_Char: - 45050 0000988A 5B5D7C3C3E2B3D3B22 db '[]|<>+=;"' ;AN000; delimitter of file spec - 45051 $P_FileSp_Len equ $-$P_FileSp_Char ;AN000; - 45052 - 45053 ;filespec error flag - 45054 $P_err_flag: - 45055 00009893 00 db 0 ;AN033; flag set if filespec parsing error - 45056 ;AN033; was detected. - 45057 - 45058 ;============================================================================ - 45059 ; MSGSERV.ASM, MSDOS 6.0, 1991 - 45060 ;============================================================================ - 45061 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 45062 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45063 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 45064 - 45065 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:899Eh - 45066 - 45067 ; 18/06/2023 - 45068 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9F2Fh + 44978 ; 18/04/2023 + 44979 TRANSPACESTART: + 44980 + 44981 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:88C2h + 44982 + 44983 ; 18/06/2023 + 44984 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9E53h + 44985 + 44986 ;********************** Local Data ************************************* + 44987 + 44988 $P_ORDINAL: + 44989 000097B8 0000 dw 0 ;AN000; Operand ordinal save area + 44990 $P_RC: + 44991 000097BA 0000 dw 0 ;AN000; Return code from parser + 44992 $P_SI_Save: + 44993 000097BC 0000 dw 0 ;AN000; Pointer of command buffer + 44994 $P_DX: + 44995 000097BE 0000 dw 0 ;AN000; Return result buffer address + 44996 $P_Terminator: + 44997 000097C0 00 db 0 ;AN000; Terminator code (ASCII) + 44998 $P_DBCSEV_OFF: + 44999 000097C1 0000 dw 0 ;AN000; Offset of DBCS EV + 45000 $P_DBCSEV_SEG: + 45001 000097C3 0000 dw 0 ;AN000; Segment of DBCS EV + 45002 $P_Flags: ;AN000; Parser internal flags + 45003 $P_Flags1: + 45004 000097C5 00 db 0 ;AN038; to reference first byte flags + 45005 $P_Flags2: + 45006 000097C6 00 db 0 ;AN038; to reference second byte flags only + 45007 $P_SaveSI_Cmpx: + 45008 000097C7 0000 dw 0 ;AN000; save si for later use by complex + 45009 $P_KEYorSW_Ptr: + 45010 000097C9 0000 dw 0 ;AN000; points next to "=" or ":" code + 45011 $P_Save_EOB: + 45012 000097CB 0000 dw 0 ;AN000; save pointer to EOB + 45013 $P_Found_SYNONYM: + 45014 000097CD 0000 dw 0 ;AN000; es:@ points to found synonym + 45015 $P_STRING_BUF: + 45016 000097CF 00 times 128 db 0 ;AN000; Pick a operand from command line + 45017 $P_ORIG_ORD: + 45018 0000984F 0000 dw 0 ;AN039; ORIGINAL ORDINAL FROM CX + 45019 $P_ORIG_STACK: + 45020 00009851 0000 dw 0 ;AN039; ORIGINAL VALUE OF STACK FROM SP + 45021 $P_ORIG_SI: + 45022 00009853 0000 dw 0 ;AN039; ORIGINAL START PARSE POINTER FROM SI + 45023 $P_Got_Time: + 45024 00009855 00 db 0 ;AN023; if 1, use Time delimiters + 45025 $P_Country_Info: + 45026 00009856 FFFF dw -1 ; 0FFFFh + 45027 00009858 00 times 32 db 0 + 45028 $P_1st_Val: + 45029 00009878 0000 dw 0 ;AN000; used when process date or time + 45030 $P_2nd_Val: + 45031 0000987A 0000 dw 0 ;AN000; used when process date or time + 45032 $P_3rd_Val: + 45033 0000987C 0000 dw 0 ;AN000; used when process date or time + 45034 $P_4th_Val: + 45035 0000987E 0000 dw 0 ;AN000; used when process date or time + 45036 $P_Char_CAP_Ptr: + 45037 00009880 FF db 0FFh ;AN000; info id + 45038 00009881 0000 dw 0 ;AN000; offset of char case map table + 45039 00009883 0000 dw 0 ;AN000; segment of char case map table + 45040 $P_File_CAP_Ptr: + 45041 00009885 FF db 0FFh ;AN000; info id + 45042 00009886 0000 dw 0 ;AN000; offset of file case map table + 45043 00009888 0000 dw 0 ;AN000; segment of file case map table + 45044 + 45045 ; 18/04/2023 + 45046 ;M029 + 45047 ;!!!WARNING!!! + 45048 ; In routine SYSPARSE (parse.asm), $P_FileSp_Char is reinitialized using + 45049 ;hardcoded strings. If the chars in the string are changed here, corresponding + 45050 ;changes need to be made in SYSPARSE + 45051 + 45052 $P_FileSp_Char: + 45053 0000988A 5B5D7C3C3E2B3D3B22 db '[]|<>+=;"' ;AN000; delimitter of file spec + 45054 $P_FileSp_Len equ $-$P_FileSp_Char ;AN000; + 45055 + 45056 ;filespec error flag + 45057 $P_err_flag: + 45058 00009893 00 db 0 ;AN033; flag set if filespec parsing error + 45059 ;AN033; was detected. + 45060 + 45061 ;============================================================================ + 45062 ; MSGSERV.ASM, MSDOS 6.0, 1991 + 45063 ;============================================================================ + 45064 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 45065 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45066 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 45067 + 45068 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:899Eh 45069 - 45070 ; 13/08/2024 - 45071 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9D23h + 45070 ; 18/06/2023 + 45071 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9F2Fh 45072 - 45073 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 45074 ;; - 45075 ;; STRUCTURE: $M_RES_ADDRS - 45076 ;; - 45077 ;; Resident data area definition of variables - 45078 ;; - 45079 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 45080 - 45081 $M_RT: - 45082 00009894 00 times $M_RES_ADDRS_SZ db 0 ; times 141 db 0 ; 13/08/2024 + 45073 ; 13/08/2024 + 45074 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:9D23h + 45075 + 45076 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 45077 ;; + 45078 ;; STRUCTURE: $M_RES_ADDRS + 45079 ;; + 45080 ;; Resident data area definition of variables + 45081 ;; + 45082 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 45083 - 45084 ;============================================================================ - 45085 ; COPYRIGHT.INC, MSDOS 6.0, 1993 - 45086 ;============================================================================ - 45087 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 45088 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45089 - 45090 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8A2Bh - 45091 ; --------------------------------------------------------------------------- - 45092 ;;M00 - changed to DOS 5.0 copyright - MD 9 Jul 90 - 45093 ;;M031 - changed copyright to 1991 - 45094 ;;9/16 - changed version to 6.0 and copyright to 1992 - 45095 ;;9/21 - Added international translations, language passed through COUNTRY macro - 45096 ;;B49,50 - changed version to 6 and copyright to 1993 - 45097 ; --------------------------------------------------------------------------- - 45098 - 45099 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 45100 ; PCDOS 7.1 COMMAND.COM - 45101 %if 0 - 45102 ; 18/06/2023 - 45103 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9FBCh - 45104 ;ifdef USA - 45105 MsDosVer6_CCopy: - 45106 ; MSDOS 6.0 - 45107 ;db "MS DOS Version 6 (C)Copyright 1981-1993 Microsoft Corp " - 45108 ; 18/06/2023 - 45109 ; MSDOS 6.22 - 45110 db "MS DOS Version 6 (C)Copyright 1981-1994 Microsoft Corp " - 45111 db "Licensed Material - Property of Microsoft " - 45112 db "All rights reserved " - 45113 ;endif - 45114 %endif - 45115 - 45116 ; --------------------------------------------------------------------------- - 45117 ; 18/06/2023 - 45118 ; 15/04/2023 - 45119 ;MsDosVer5_CCopy: - 45120 ;db "MS DOS Version 5.00 (C)Copyright 1981-1991 Microsoft Corp " - 45121 ;db "Licensed Material - Property of Microsoft " - 45122 ;db "All rights reserved " - 45123 ; --------------------------------------------------------------------------- - 45124 ; 15/04/2023 - 45125 ; 16/04/2023 - 21/04/2023 - 45126 ;db 0 - 45127 ;db 0Dh,0Ah - 45128 ;db 'Retro DOS v4.0 (& v4.1) COMMAND.COM ' - 45129 ;db 0 - 45130 ;db 'by Erdogan Tan - 05/05/2023' - 45131 ;db 0 - 45132 - 45133 ; 19/06/2023 - 45134 ; 18/06/2023 - 45135 ;db 0 - 45136 ;db 0Dh,0Ah - 45137 ;db 'Retro DOS v4.2 COMMAND.COM ' - 45138 ;db 0 - 45139 ;db 'by Erdogan Tan - 19/6/2023' - 45140 ;db 0 - 45141 - 45142 ;============================================================================ - 45143 ; TPRINTF.ASM, MSDOS 6.0, 1991 - 45144 ;============================================================================ - 45145 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 45146 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45147 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 45148 - 45149 PRINTF_HANDLE: - 45150 00009921 0000 dw 0 ;AC000; + 45084 $M_RT: + 45085 00009894 00 times $M_RES_ADDRS_SZ db 0 ; times 141 db 0 ; 13/08/2024 + 45086 + 45087 ;============================================================================ + 45088 ; COPYRIGHT.INC, MSDOS 6.0, 1993 + 45089 ;============================================================================ + 45090 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 45091 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45092 + 45093 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:8A2Bh + 45094 ; --------------------------------------------------------------------------- + 45095 ;;M00 - changed to DOS 5.0 copyright - MD 9 Jul 90 + 45096 ;;M031 - changed copyright to 1991 + 45097 ;;9/16 - changed version to 6.0 and copyright to 1992 + 45098 ;;9/21 - Added international translations, language passed through COUNTRY macro + 45099 ;;B49,50 - changed version to 6 and copyright to 1993 + 45100 ; --------------------------------------------------------------------------- + 45101 + 45102 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 45103 ; PCDOS 7.1 COMMAND.COM + 45104 %if 0 + 45105 ; 18/06/2023 + 45106 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:9FBCh + 45107 ;ifdef USA + 45108 MsDosVer6_CCopy: + 45109 ; MSDOS 6.0 + 45110 ;db "MS DOS Version 6 (C)Copyright 1981-1993 Microsoft Corp " + 45111 ; 18/06/2023 + 45112 ; MSDOS 6.22 + 45113 db "MS DOS Version 6 (C)Copyright 1981-1994 Microsoft Corp " + 45114 db "Licensed Material - Property of Microsoft " + 45115 db "All rights reserved " + 45116 ;endif + 45117 %endif + 45118 + 45119 ; --------------------------------------------------------------------------- + 45120 ; 18/06/2023 + 45121 ; 15/04/2023 + 45122 ;MsDosVer5_CCopy: + 45123 ;db "MS DOS Version 5.00 (C)Copyright 1981-1991 Microsoft Corp " + 45124 ;db "Licensed Material - Property of Microsoft " + 45125 ;db "All rights reserved " + 45126 ; --------------------------------------------------------------------------- + 45127 ; 15/04/2023 + 45128 ; 16/04/2023 - 21/04/2023 + 45129 ;db 0 + 45130 ;db 0Dh,0Ah + 45131 ;db 'Retro DOS v4.0 (& v4.1) COMMAND.COM ' + 45132 ;db 0 + 45133 ;db 'by Erdogan Tan - 05/05/2023' + 45134 ;db 0 + 45135 + 45136 ; 19/06/2023 + 45137 ; 18/06/2023 + 45138 ;db 0 + 45139 ;db 0Dh,0Ah + 45140 ;db 'Retro DOS v4.2 COMMAND.COM ' + 45141 ;db 0 + 45142 ;db 'by Erdogan Tan - 19/6/2023' + 45143 ;db 0 + 45144 + 45145 ;============================================================================ + 45146 ; TPRINTF.ASM, MSDOS 6.0, 1991 + 45147 ;============================================================================ + 45148 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 45149 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45150 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM 45151 - 45152 ;============================================================================ - 45153 ; TSPC.ASM, MSDOS 6.0, 1991 - 45154 ;============================================================================ - 45155 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 45156 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45157 - 45158 ;TITLE COMMAND Transient Uninitialized DATA - 45159 - 45160 ;The TRANSPACE segment contains variable data that is considered - 45161 ;volatile between command cycles, and therefore is not included in the - 45162 ;transient checksum area. Contents of these variables MUST be - 45163 ;initialized before use, and must not be relied upon from command - 45164 ;cycle to command cycle. - 45165 ; - 45166 ;No constant data values should be stored here. - 45167 - 45168 ; --------------------------------------------------------------------------- - 45169 ; START OF UNITIALIZED DATA - 45170 ; --------------------------------------------------------------------------- - 45171 - 45172 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 8AA5h - 45173 - 45174 ; 18/06/2023 - 45175 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A033h + 45152 PRINTF_HANDLE: + 45153 00009921 0000 dw 0 ;AC000; + 45154 + 45155 ;============================================================================ + 45156 ; TSPC.ASM, MSDOS 6.0, 1991 + 45157 ;============================================================================ + 45158 ; 15/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 45159 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45160 + 45161 ;TITLE COMMAND Transient Uninitialized DATA + 45162 + 45163 ;The TRANSPACE segment contains variable data that is considered + 45164 ;volatile between command cycles, and therefore is not included in the + 45165 ;transient checksum area. Contents of these variables MUST be + 45166 ;initialized before use, and must not be relied upon from command + 45167 ;cycle to command cycle. + 45168 ; + 45169 ;No constant data values should be stored here. + 45170 + 45171 ; --------------------------------------------------------------------------- + 45172 ; START OF UNITIALIZED DATA + 45173 ; --------------------------------------------------------------------------- + 45174 + 45175 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 8AA5h 45176 - 45177 ; 13/08/2024 - 45178 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 9DB2h + 45177 ; 18/06/2023 + 45178 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A033h 45179 - 45180 00009923 00 SRCXNAME: times DIRSTRLEN+20 db 0 ; 87 ; buffer for name translate - 45181 0000997A 00 TRGXNAME: times DIRSTRLEN+20 db 0 ; 87 ; buffer for name translate - 45182 000099D1 00 UCOMBUF: times COMBUFLEN+3 db 0 ; 131 ; Raw console buffer - 45183 00009A54 00 COMBUF: times COMBUFLEN+3 db 0 ; 131 ; Cooked console buffer - 45184 00009AD7 00 USERDIR1: times DIRSTRLEN+3 db 0 ; 70 ; Storage for users current directory - 45185 00009B1D 00 EXECPATH: times COMBUFLEN+3 db 0 ; 131 ; Path for external command - 45186 00009BA0 00 RE_INSTR: times DIRSTRLEN+16 db 0 ; 83 ; path for input to redirection - 45187 - 45188 ; Variables passed up from resident ; in the Resident portion: (initial values) - 45189 HEADCALL: - 45190 00009BF3 0000 dw 0 ; TRANVARS (dw THEADFIX) - 45191 00009BF5 0000 RESSEG: dw 0 ; MYSEG (dw 0) - 45192 00009BF7 0000 TPA: dw 0 ; LTPA (dw 0) - 45193 SWITCHAR: - 45194 00009BF9 00 db 0 ; RSWITCHAR (db '-') - 45195 DIRCHAR: - 45196 00009BFA 00 db 0 ; RDIRCHAR (db '/') - 45197 EXEC_ADDR: - 45198 00009BFB 00000000 dd 0 ; (dw EXT_EXEC) - 45199 ; MYSEG1 (dw 0) - 45200 RCH_ADDR: - 45201 00009BFF 00000000 dd 0 ; (dw TREMCHECK) - 45202 ; MYSEG2 (dw 0) - 45203 - 45204 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 45205 ; PCDOS 7.1 COMMAND.COM - 45206 %if 0 - 45207 dw 0 ; RESTEST (dw 0) - 45208 %endif - 45209 - 45210 TRAN_TPA: - 45211 00009C03 0000 dw 0 ; RES_TPA (dw 0) + 45180 ; 13/08/2024 + 45181 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 9DB2h + 45182 + 45183 00009923 00 SRCXNAME: times DIRSTRLEN+20 db 0 ; 87 ; buffer for name translate + 45184 0000997A 00 TRGXNAME: times DIRSTRLEN+20 db 0 ; 87 ; buffer for name translate + 45185 000099D1 00 UCOMBUF: times COMBUFLEN+3 db 0 ; 131 ; Raw console buffer + 45186 00009A54 00 COMBUF: times COMBUFLEN+3 db 0 ; 131 ; Cooked console buffer + 45187 00009AD7 00 USERDIR1: times DIRSTRLEN+3 db 0 ; 70 ; Storage for users current directory + 45188 00009B1D 00 EXECPATH: times COMBUFLEN+3 db 0 ; 131 ; Path for external command + 45189 00009BA0 00 RE_INSTR: times DIRSTRLEN+16 db 0 ; 83 ; path for input to redirection + 45190 + 45191 ; Variables passed up from resident ; in the Resident portion: (initial values) + 45192 HEADCALL: + 45193 00009BF3 0000 dw 0 ; TRANVARS (dw THEADFIX) + 45194 00009BF5 0000 RESSEG: dw 0 ; MYSEG (dw 0) + 45195 00009BF7 0000 TPA: dw 0 ; LTPA (dw 0) + 45196 SWITCHAR: + 45197 00009BF9 00 db 0 ; RSWITCHAR (db '-') + 45198 DIRCHAR: + 45199 00009BFA 00 db 0 ; RDIRCHAR (db '/') + 45200 EXEC_ADDR: + 45201 00009BFB 00000000 dd 0 ; (dw EXT_EXEC) + 45202 ; MYSEG1 (dw 0) + 45203 RCH_ADDR: + 45204 00009BFF 00000000 dd 0 ; (dw TREMCHECK) + 45205 ; MYSEG2 (dw 0) + 45206 + 45207 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 45208 ; PCDOS 7.1 COMMAND.COM + 45209 %if 0 + 45210 dw 0 ; RESTEST (dw 0) + 45211 %endif 45212 - 45213 00009C05 00 CHKDRV: db 0 - 45214 IFNOTFLAG: - 45215 FILTYP: - 45216 00009C06 00 RDEOF: db 0 ; Misc flags - 45217 00009C07 00 CURDRV: db 0 - 45218 PARM1: - 45219 00009C08 00 Concat: db 0 - 45220 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM - 45221 %if 1 - 45222 notzerofile: - 45223 00009C09 00 db 0 ; (if 1, destination file size is not zero) - 45224 %endif - 45225 PARM2: - 45226 00009C0A 00 ArgC: db 0 - 45227 00009C0B 0000 COMSW: dw 0 ; Switches between command and 1st arg - 45228 00009C0D 0000 ARG1S: dw 0 ; Switches between 1st and 2nd arg - 45229 ARG2S: ; Switches after 2nd arg - 45230 DestSwitch: - 45231 00009C0F 0000 dw 0 - 45232 ARGTS: - 45233 AllSwitch: - 45234 00009C11 0000 dw 0 ; ALL switches except for COMSW - 45235 00009C13 00 CFLAG: db 0 - 45236 DestClosed: - 45237 SPECDRV: - 45238 00009C14 00 db 0 - 45239 00009C15 0000 BYTCNT: dw 0 ; Size of buffer between RES and TRANS - 45240 - 45241 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 45242 ;ifdef DBLSPACE_HOOKS - 45243 savBytCnt: ; MSDOS 6.0 - 45244 00009C17 0000 dw 0 ; 13/08/2024 - PCDOS 7.1 COMMAND.COM - 45245 ;endif - 45246 - 45247 00009C19 0000 NXTADD: dw 0 - 45248 FRSTSRCH: - 45249 00009C1B 00 db 0 - 45250 ; 15/04/2023 - 45251 LeftOnLine: - 45252 00009C1C 00 db 0 ; entries left on line u.b. DIR - 45253 PerLine: - 45254 00009C1D 00 db 0 ; entries/line u.b. DIR - 45255 - 45256 ; 13/08/2024 - PCDOS 7.1 COMMAND.COM - 45257 %if 0 - 45258 LINCNT: db 0 - 45259 LINLEN: db 0 - 45260 %endif - 45261 - 45262 LeftOnPage: - 45263 00009C1E 0000 dw 0 ; lines left on page u.b. DIR - 45264 FileCnt: - 45265 00009C20 0000 dw 0 ; file count u.b. DIR - 45266 FileSiz: - 45267 00009C22 00000000 dd 0 ; file size u.b. DIR - 45268 - 45269 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - TRANGROUP:A0B5h - 45270 %if 1 - 45271 00009C26 00000000 dd 0 - 45272 00009C2A 00 narrow: db 0 - 45273 nocommas: - 45274 00009C2B 00 db 0 - 45275 yeardigit4: - 45276 00009C2C 00 db 0 - 45277 bfree_not_kilo: - 45278 00009C2D 00 db 0 - 45279 efs_buffer: - 45280 00009C2E 000000000000000000- db 44 dup(0) ; times 44 db 0 - 45280 00009C37 000000000000000000- - 45280 00009C40 000000000000000000- - 45280 00009C49 000000000000000000- - 45280 00009C52 0000000000000000 - 45281 efs_drive: - 45282 00009C5A 433A5C00 db 'C:\',0 - 45283 %endif - 45284 - 45285 ; Note: keep FileCntTotal through csecUsedTotal together! - 45286 - 45287 FileCntTotal: - 45288 00009C5E 00000000 dd 0 ; total file count u.b. DIR - 45289 FileSizTotal: - 45290 00009C62 00000000 dd 0 ; total file size u.b. DIR - 45291 - 45292 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM - 45293 %if 1 - 45294 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:A0F5h - 45295 00009C66 00000000 dd 0 - 45296 %else - 45297 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM - 45298 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A33Fh - 45299 ; MSDOS 6.0 - 45300 ;ifdef DBLSPACE_HOOKS - 45301 ccluUsed: - 45302 dw 0 ; count of DOS clusters used - 45303 ccluUsedDir: - 45304 dw 0 - 45305 ccluUsedTotal: - 45306 dw 0 - 45307 csecUsed: - 45308 dd 0 ; count of comp sectors used - 45309 csecUsedDir: - 45310 dd 0 - 45311 csecUsedTotal: - 45312 dd 0 - 45313 - 45314 ; Note: keep FileCntTotal through csecUsedTotal together! - 45315 - 45316 fhCVF: - 45317 dw 0 ; Compressed Volume File handle - 45318 szCVF: - 45319 times 16 db 0 ; "X:\\12345678.123\0" - 45320 MDBPB: - 45321 ;MD_BPB <> ; Extended MagicDrv BPB - 45322 times 64 db 0 - 45323 csecPerCluster: - 45324 db 0 ; sectors/cluster for ratio calc - 45325 fUseHostSize: - 45326 db 0 ; NZ if using host cluster size - 45327 cFATEntries: - 45328 dw 0 ; # FAT entries in buffers - 45329 entInBuf: - 45330 dw 0 ; 1st entry # in FAT buffers - 45331 segFATBuf: - 45332 dw 0 ; seg of DOS & MD FAT buffers - 45333 pbufDOSFAT: - 45334 dw 0 ; off of DOS FAT buffer - 45335 pbufMDFAT: - 45336 dw 0 ; off of MD FAT buffer - 45337 bufDOSFAT: - 45338 ;times (cRES_FAT_ENTRIES*2) db 0 - 45339 times 64 db 0 ; small DOS FAT buffer - 45340 bufMDFAT: - 45341 ;times (cRES_FAT_ENTRIES*4) db 0 - 45342 times 128 db 0 ; small MD FAT buffer - 45343 ;endif - 45344 %endif - 45345 - 45346 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 8DAFh - 45347 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A46Fh - 45348 ; 31/07/2024 - 45349 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:A0F9h - 45350 CHARBUF: - 45351 00009C6A 00 times 80 db 0 ;line byte character buffer for xenix write - 45352 DESTFCB2: - 45353 00009CBA 00 IDLEN: db 0 - 45354 00009CBB 00 ID: times 8 db 0 - 45355 00009CC3 00 COM: times 3 db 0 - 45356 00009CC6 00 DEST: times 37 db 0 - 45357 DESTNAME: - 45358 00009CEB 00 times 11 db 0 - 45359 DESTDIR: - 45360 DestFcb: - 45361 00009CF6 00 times DIRSTRLEN db 0 ; 67 ; Directory for PATH searches - 45362 GOTOLEN: ; word - 45363 BWDBUF: ; byte - 45364 EXEFCB: ; word - 45365 00009D39 00 DIRBUF: times DIRSTRLEN+3 db 0 ; 70 - 45366 - 45367 DIRBUF_ATTRIB1 equ DIRBUF+19 ; byte ; INT 21h AH=11h (8+DIR_ENTRY struc) - 45368 DIRBUF_ATTRIB2 equ DIRBUF+21 ; byte ; INT 21h AH=4Eh (FIND_BUF struc) - 45369 DIRBUF_FTIME equ DIRBUF+30 ; word - 45370 DIRBUF_FDATE equ DIRBUF+32 ; word - 45371 DIRBUF_FSIZ_L equ DIRBUF+36 ; word - 45372 DIRBUF_FSIZ_H equ DIRBUF+38 ; word - 45373 - 45374 ; 16/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM - 45375 - 45376 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45377 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0A584h - 45378 SDIRBUF: - 45379 00009D7F 00 times 12 db 0 - 45380 _Bits: - 45381 00009D8B 0000 dw 0 - 45382 PathCnt: - 45383 00009D8D 0000 dw 0 - 45384 PathPos: - 45385 00009D8F 0000 dw 0 - 45386 00009D91 0000 PathSw: dw 0 - 45387 AttrSpecified: - 45388 00009D93 00 db 0 ; attribute bits u.b. DIR - 45389 AttrSelect: - 45390 00009D94 00 db 0 ; attribute bits u.b. DIR - 45391 00009D95 00 comma: db 0 ; flag set if +,, occurs - 45392 plus_comma: - 45393 00009D96 00 db 0 ; flag set if +,, occurs - 45394 DirFlag: - 45395 00009D97 00 db 0 ;AN015; set when pathcrunch called from DIR - 45396 parse_last: - 45397 00009D98 0000 dw 0 ;AN018; used to hold parsing position - 45398 system_cpage: - 45399 00009D9A 0000 dw 0 ;AC001; used for CHCP variable - 45400 - 45401 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 45402 %if 0 - 45403 Arg_Buf: - 45404 times 128 db 0 - 45405 %endif - 45406 - 45407 File_Size_Low: - 45408 00009D9C 0000 dw 0 - 45409 File_Size_High: - 45410 00009D9E 0000 dw 0 - 45411 string_ptr_2: - 45412 00009DA0 0000 dw 0 - 45413 Copy_num: - 45414 00009DA2 0000 dw 0 - 45415 cpyflag: - 45416 00009DA4 00 db 0 - 45417 Dir_Num: - 45418 00009DA5 0000 dw 0 - 45419 - 45420 ; 13/08/2024 - 45421 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 45422 %if 1 - 45423 00009DA7 0000 dw 0 - 45424 %else - 45425 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45426 ; MSDOS 6.0 - 45427 ;ifdef DBLSPACE_HOOKS - 45428 Dir_CRatio_1: - 45429 db 0 - 45430 Dir_CRatio_2: - 45431 db 0 - 45432 ;endif - 45433 %endif - 45434 - 45435 Bytes_Free: - 45436 00009DA9 00000000 dd 0 + 45213 TRAN_TPA: + 45214 00009C03 0000 dw 0 ; RES_TPA (dw 0) + 45215 + 45216 00009C05 00 CHKDRV: db 0 + 45217 IFNOTFLAG: + 45218 FILTYP: + 45219 00009C06 00 RDEOF: db 0 ; Misc flags + 45220 00009C07 00 CURDRV: db 0 + 45221 PARM1: + 45222 00009C08 00 Concat: db 0 + 45223 ; 11/08/2024 - PCDOS 7.1 COMMAND.COM + 45224 %if 1 + 45225 notzerofile: + 45226 00009C09 00 db 0 ; (if 1, destination file size is not zero) + 45227 %endif + 45228 PARM2: + 45229 00009C0A 00 ArgC: db 0 + 45230 00009C0B 0000 COMSW: dw 0 ; Switches between command and 1st arg + 45231 00009C0D 0000 ARG1S: dw 0 ; Switches between 1st and 2nd arg + 45232 ARG2S: ; Switches after 2nd arg + 45233 DestSwitch: + 45234 00009C0F 0000 dw 0 + 45235 ARGTS: + 45236 AllSwitch: + 45237 00009C11 0000 dw 0 ; ALL switches except for COMSW + 45238 00009C13 00 CFLAG: db 0 + 45239 DestClosed: + 45240 SPECDRV: + 45241 00009C14 00 db 0 + 45242 00009C15 0000 BYTCNT: dw 0 ; Size of buffer between RES and TRANS + 45243 + 45244 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 45245 ;ifdef DBLSPACE_HOOKS + 45246 savBytCnt: ; MSDOS 6.0 + 45247 00009C17 0000 dw 0 ; 13/08/2024 - PCDOS 7.1 COMMAND.COM + 45248 ;endif + 45249 + 45250 00009C19 0000 NXTADD: dw 0 + 45251 FRSTSRCH: + 45252 00009C1B 00 db 0 + 45253 ; 15/04/2023 + 45254 LeftOnLine: + 45255 00009C1C 00 db 0 ; entries left on line u.b. DIR + 45256 PerLine: + 45257 00009C1D 00 db 0 ; entries/line u.b. DIR + 45258 + 45259 ; 13/08/2024 - PCDOS 7.1 COMMAND.COM + 45260 %if 0 + 45261 LINCNT: db 0 + 45262 LINLEN: db 0 + 45263 %endif + 45264 + 45265 LeftOnPage: + 45266 00009C1E 0000 dw 0 ; lines left on page u.b. DIR + 45267 FileCnt: + 45268 00009C20 0000 dw 0 ; file count u.b. DIR + 45269 FileSiz: + 45270 00009C22 00000000 dd 0 ; file size u.b. DIR + 45271 + 45272 ; 31/07/2024 - PCDOS 7.1 COMMAND.COM - TRANGROUP:A0B5h + 45273 %if 1 + 45274 00009C26 00000000 dd 0 + 45275 00009C2A 00 narrow: db 0 + 45276 nocommas: + 45277 00009C2B 00 db 0 + 45278 yeardigit4: + 45279 00009C2C 00 db 0 + 45280 bfree_not_kilo: + 45281 00009C2D 00 db 0 + 45282 efs_buffer: + 45283 00009C2E 000000000000000000- db 44 dup(0) ; times 44 db 0 + 45283 00009C37 000000000000000000- + 45283 00009C40 000000000000000000- + 45283 00009C49 000000000000000000- + 45283 00009C52 0000000000000000 + 45284 efs_drive: + 45285 00009C5A 433A5C00 db 'C:\',0 + 45286 %endif + 45287 + 45288 ; Note: keep FileCntTotal through csecUsedTotal together! + 45289 + 45290 FileCntTotal: + 45291 00009C5E 00000000 dd 0 ; total file count u.b. DIR + 45292 FileSizTotal: + 45293 00009C62 00000000 dd 0 ; total file size u.b. DIR + 45294 + 45295 ; 31/07/2024 - Retro DOS v5.0 COMMAND.COM + 45296 %if 1 + 45297 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:A0F5h + 45298 00009C66 00000000 dd 0 + 45299 %else + 45300 ; 18/06/2023 - Retro DOS v4.2 (MSDOS 6.22) COMMAND.COM + 45301 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A33Fh + 45302 ; MSDOS 6.0 + 45303 ;ifdef DBLSPACE_HOOKS + 45304 ccluUsed: + 45305 dw 0 ; count of DOS clusters used + 45306 ccluUsedDir: + 45307 dw 0 + 45308 ccluUsedTotal: + 45309 dw 0 + 45310 csecUsed: + 45311 dd 0 ; count of comp sectors used + 45312 csecUsedDir: + 45313 dd 0 + 45314 csecUsedTotal: + 45315 dd 0 + 45316 + 45317 ; Note: keep FileCntTotal through csecUsedTotal together! + 45318 + 45319 fhCVF: + 45320 dw 0 ; Compressed Volume File handle + 45321 szCVF: + 45322 times 16 db 0 ; "X:\\12345678.123\0" + 45323 MDBPB: + 45324 ;MD_BPB <> ; Extended MagicDrv BPB + 45325 times 64 db 0 + 45326 csecPerCluster: + 45327 db 0 ; sectors/cluster for ratio calc + 45328 fUseHostSize: + 45329 db 0 ; NZ if using host cluster size + 45330 cFATEntries: + 45331 dw 0 ; # FAT entries in buffers + 45332 entInBuf: + 45333 dw 0 ; 1st entry # in FAT buffers + 45334 segFATBuf: + 45335 dw 0 ; seg of DOS & MD FAT buffers + 45336 pbufDOSFAT: + 45337 dw 0 ; off of DOS FAT buffer + 45338 pbufMDFAT: + 45339 dw 0 ; off of MD FAT buffer + 45340 bufDOSFAT: + 45341 ;times (cRES_FAT_ENTRIES*2) db 0 + 45342 times 64 db 0 ; small DOS FAT buffer + 45343 bufMDFAT: + 45344 ;times (cRES_FAT_ENTRIES*4) db 0 + 45345 times 128 db 0 ; small MD FAT buffer + 45346 ;endif + 45347 %endif + 45348 + 45349 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 8DAFh + 45350 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A46Fh + 45351 ; 31/07/2024 + 45352 ; PCDOS 7.1 COMMAND.COM - TRANGROUP:A0F9h + 45353 CHARBUF: + 45354 00009C6A 00 times 80 db 0 ;line byte character buffer for xenix write + 45355 DESTFCB2: + 45356 00009CBA 00 IDLEN: db 0 + 45357 00009CBB 00 ID: times 8 db 0 + 45358 00009CC3 00 COM: times 3 db 0 + 45359 00009CC6 00 DEST: times 37 db 0 + 45360 DESTNAME: + 45361 00009CEB 00 times 11 db 0 + 45362 DESTDIR: + 45363 DestFcb: + 45364 00009CF6 00 times DIRSTRLEN db 0 ; 67 ; Directory for PATH searches + 45365 GOTOLEN: ; word + 45366 BWDBUF: ; byte + 45367 EXEFCB: ; word + 45368 00009D39 00 DIRBUF: times DIRSTRLEN+3 db 0 ; 70 + 45369 + 45370 DIRBUF_ATTRIB1 equ DIRBUF+19 ; byte ; INT 21h AH=11h (8+DIR_ENTRY struc) + 45371 DIRBUF_ATTRIB2 equ DIRBUF+21 ; byte ; INT 21h AH=4Eh (FIND_BUF struc) + 45372 DIRBUF_FTIME equ DIRBUF+30 ; word + 45373 DIRBUF_FDATE equ DIRBUF+32 ; word + 45374 DIRBUF_FSIZ_L equ DIRBUF+36 ; word + 45375 DIRBUF_FSIZ_H equ DIRBUF+38 ; word + 45376 + 45377 ; 16/04/2023 - Retro DOS v4.0 (& v4.1) COMMAND.COM + 45378 + 45379 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45380 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0A584h + 45381 SDIRBUF: + 45382 00009D7F 00 times 12 db 0 + 45383 _Bits: + 45384 00009D8B 0000 dw 0 + 45385 PathCnt: + 45386 00009D8D 0000 dw 0 + 45387 PathPos: + 45388 00009D8F 0000 dw 0 + 45389 00009D91 0000 PathSw: dw 0 + 45390 AttrSpecified: + 45391 00009D93 00 db 0 ; attribute bits u.b. DIR + 45392 AttrSelect: + 45393 00009D94 00 db 0 ; attribute bits u.b. DIR + 45394 00009D95 00 comma: db 0 ; flag set if +,, occurs + 45395 plus_comma: + 45396 00009D96 00 db 0 ; flag set if +,, occurs + 45397 DirFlag: + 45398 00009D97 00 db 0 ;AN015; set when pathcrunch called from DIR + 45399 parse_last: + 45400 00009D98 0000 dw 0 ;AN018; used to hold parsing position + 45401 system_cpage: + 45402 00009D9A 0000 dw 0 ;AC001; used for CHCP variable + 45403 + 45404 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 45405 %if 0 + 45406 Arg_Buf: + 45407 times 128 db 0 + 45408 %endif + 45409 + 45410 File_Size_Low: + 45411 00009D9C 0000 dw 0 + 45412 File_Size_High: + 45413 00009D9E 0000 dw 0 + 45414 string_ptr_2: + 45415 00009DA0 0000 dw 0 + 45416 Copy_num: + 45417 00009DA2 0000 dw 0 + 45418 cpyflag: + 45419 00009DA4 00 db 0 + 45420 Dir_Num: + 45421 00009DA5 0000 dw 0 + 45422 + 45423 ; 13/08/2024 + 45424 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 45425 %if 1 + 45426 00009DA7 0000 dw 0 + 45427 %else + 45428 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45429 ; MSDOS 6.0 + 45430 ;ifdef DBLSPACE_HOOKS + 45431 Dir_CRatio_1: + 45432 db 0 + 45433 Dir_CRatio_2: + 45434 db 0 + 45435 ;endif + 45436 %endif 45437 - 45438 Major_Ver_Num: - 45439 00009DAD 0000 dw 0 - 45440 Minor_Ver_Num: - 45441 00009DAF 0000 dw 0 - 45442 - 45443 One_Char_Val: - 45444 00009DB1 00 db 0 - 45445 00009DB2 00 db 0 - 45446 vol_drv: - 45447 00009DB3 00 db 0 - 45448 ROM_CALL: - 45449 00009DB4 00 db 0 ; flag for rom function - 45450 00009DB5 0000 ROM_IP: dw 0 - 45451 00009DB7 0000 ROM_CS: dw 0 - 45452 - 45453 DestVars: - 45454 DestIsDir: - 45455 00009DB9 00 db 0 - 45456 DestSiz: - 45457 00009DBA 00 db 0 - 45458 DestTail: - 45459 00009DBB 0000 dw 0 - 45460 DestInfo: - 45461 00009DBD 00 db 0 - 45462 DestBuf: - 45463 00009DBE 00 times DIRSTRLEN+20 db 0 ; 87 - 45464 EndDestBuf: - 45465 DESTHAND: - 45466 00009E15 0000 dw 0 - 45467 DESTISDEV: - 45468 00009E17 00 db 0 - 45469 FIRSTDEST: - 45470 00009E18 00 db 0 - 45471 MELCOPY: - 45472 00009E19 00 db 0 - 45473 MELSTART: - 45474 00009E1A 0000 dw 0 - 45475 SrcVars: - 45476 SrcIsDir: - 45477 00009E1C 00 db 0 - 45478 00009E1D 00 SrcSiz: db 0 - 45479 SrcTail: - 45480 00009E1E 0000 dw 0 - 45481 SrcInfo: - 45482 00009E20 00 db 0 - 45483 SrcBuf: - 45484 00009E21 00 times DIRSTRLEN+20 db 0 ; 87 - 45485 SRCHAND: - 45486 00009E78 0000 dw 0 - 45487 SRCISDEV: - 45488 00009E7A 00 db 0 - 45489 ScanBuf: - 45490 00009E7B 00 times DIRSTRLEN+20 db 0 ; 87 - 45491 - 45492 00009ED2 0000 SRCPT: dw 0 - 45493 INEXACT: - 45494 00009ED4 00 db 0 - 45495 NOWRITE: - 45496 00009ED5 00 db 0 - 45497 BINARY: - 45498 00009ED6 00 db 0 - 45499 WRITTEN: - 45500 00009ED7 0000 dw 0 - 45501 TERMREAD: - 45502 00009ED9 00 db 0 - 45503 00009EDA 00 ASCII: db 0 - 45504 00009EDB 00 PLUS: db 0 - 45505 00009EDC 00 objcnt: db 0 ; Used in copy - 45506 00009EDD 0000 CPDATE: dw 0 - 45507 00009EDF 0000 CPTIME: dw 0 - 45508 - 45509 OFilePtr_Lo: - 45510 00009EE1 0000 dw 0 ; original file ptr for COPY when - 45511 OFilePtr_Hi: - 45512 00009EE3 0000 dw 0 ; 1st source is also destination - 45513 zflag: ; 10/08/2024 - PCDOS 7.1 COMMAND.COM - 45514 00009EE5 00 OCtrlZ: db 0 ; original ctrl+Z for COPY when ditto - 45515 - 45516 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45517 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0A76Bh - 45518 cox_sublist_buff: - 45519 00009EE6 00 times 11 db 0 - 45520 cox_y_override: - 45521 00009EF1 00 db 0 - 45522 cox_dest_file: - 45523 00009EF2 00 db 0 - 45524 cox_src_file: - 45525 00009EF3 00 db 0 - 45526 - 45527 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:0A779h) - 45528 BATHAND: - 45529 00009EF4 0000 dw 0 ; Batch handle - 45530 STARTEL: - 45531 00009EF6 0000 dw 0 - 45532 00009EF8 00 ELCNT: db 0 - 45533 00009EF9 00 ELPOS: db 0 - 45534 - 45535 ; 28/03/2023 - Retro DOS v4.0 COMMAND.COM - 45536 ; MSDOS 5.0 - 45537 SKPDEL: - 45538 ; 18/06/2023 - 45539 00009EFA 00 db 0 ; MSDOS 6.22 (& MSDOS 5.0) - 45540 00009EFB 00 SOURCE: times 11 db 0 - 45541 - 45542 ext_entered: - 45543 00009F06 00 db 0 ;AN005; + 45438 Bytes_Free: + 45439 00009DA9 00000000 dd 0 + 45440 + 45441 Major_Ver_Num: + 45442 00009DAD 0000 dw 0 + 45443 Minor_Ver_Num: + 45444 00009DAF 0000 dw 0 + 45445 + 45446 One_Char_Val: + 45447 00009DB1 00 db 0 + 45448 00009DB2 00 db 0 + 45449 vol_drv: + 45450 00009DB3 00 db 0 + 45451 ROM_CALL: + 45452 00009DB4 00 db 0 ; flag for rom function + 45453 00009DB5 0000 ROM_IP: dw 0 + 45454 00009DB7 0000 ROM_CS: dw 0 + 45455 + 45456 DestVars: + 45457 DestIsDir: + 45458 00009DB9 00 db 0 + 45459 DestSiz: + 45460 00009DBA 00 db 0 + 45461 DestTail: + 45462 00009DBB 0000 dw 0 + 45463 DestInfo: + 45464 00009DBD 00 db 0 + 45465 DestBuf: + 45466 00009DBE 00 times DIRSTRLEN+20 db 0 ; 87 + 45467 EndDestBuf: + 45468 DESTHAND: + 45469 00009E15 0000 dw 0 + 45470 DESTISDEV: + 45471 00009E17 00 db 0 + 45472 FIRSTDEST: + 45473 00009E18 00 db 0 + 45474 MELCOPY: + 45475 00009E19 00 db 0 + 45476 MELSTART: + 45477 00009E1A 0000 dw 0 + 45478 SrcVars: + 45479 SrcIsDir: + 45480 00009E1C 00 db 0 + 45481 00009E1D 00 SrcSiz: db 0 + 45482 SrcTail: + 45483 00009E1E 0000 dw 0 + 45484 SrcInfo: + 45485 00009E20 00 db 0 + 45486 SrcBuf: + 45487 00009E21 00 times DIRSTRLEN+20 db 0 ; 87 + 45488 SRCHAND: + 45489 00009E78 0000 dw 0 + 45490 SRCISDEV: + 45491 00009E7A 00 db 0 + 45492 ScanBuf: + 45493 00009E7B 00 times DIRSTRLEN+20 db 0 ; 87 + 45494 + 45495 00009ED2 0000 SRCPT: dw 0 + 45496 INEXACT: + 45497 00009ED4 00 db 0 + 45498 NOWRITE: + 45499 00009ED5 00 db 0 + 45500 BINARY: + 45501 00009ED6 00 db 0 + 45502 WRITTEN: + 45503 00009ED7 0000 dw 0 + 45504 TERMREAD: + 45505 00009ED9 00 db 0 + 45506 00009EDA 00 ASCII: db 0 + 45507 00009EDB 00 PLUS: db 0 + 45508 00009EDC 00 objcnt: db 0 ; Used in copy + 45509 00009EDD 0000 CPDATE: dw 0 + 45510 00009EDF 0000 CPTIME: dw 0 + 45511 + 45512 OFilePtr_Lo: + 45513 00009EE1 0000 dw 0 ; original file ptr for COPY when + 45514 OFilePtr_Hi: + 45515 00009EE3 0000 dw 0 ; 1st source is also destination + 45516 zflag: ; 10/08/2024 - PCDOS 7.1 COMMAND.COM + 45517 00009EE5 00 OCtrlZ: db 0 ; original ctrl+Z for COPY when ditto + 45518 + 45519 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45520 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0A76Bh + 45521 cox_sublist_buff: + 45522 00009EE6 00 times 11 db 0 + 45523 cox_y_override: + 45524 00009EF1 00 db 0 + 45525 cox_dest_file: + 45526 00009EF2 00 db 0 + 45527 cox_src_file: + 45528 00009EF3 00 db 0 + 45529 + 45530 ; (MSDOS 6.22 COMMAND.COM - TRANGROUP:0A779h) + 45531 BATHAND: + 45532 00009EF4 0000 dw 0 ; Batch handle + 45533 STARTEL: + 45534 00009EF6 0000 dw 0 + 45535 00009EF8 00 ELCNT: db 0 + 45536 00009EF9 00 ELPOS: db 0 + 45537 + 45538 ; 28/03/2023 - Retro DOS v4.0 COMMAND.COM + 45539 ; MSDOS 5.0 + 45540 SKPDEL: + 45541 ; 18/06/2023 + 45542 00009EFA 00 db 0 ; MSDOS 6.22 (& MSDOS 5.0) + 45543 00009EFB 00 SOURCE: times 11 db 0 45544 - 45545 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:90BCh - 45546 - 45547 Display_Ioctl: - 45548 00009F07 00 db 0 ;AN000; info level - 45549 00009F08 00 db 0 ;AN000; reserved - 45550 00009F09 0E00 dw crt_ioctl_ln ; 14 ;AN000; length of data - 45551 00009F0B 0000 dw 0 ;AN000; control flags - 45552 display_mode: - 45553 00009F0D 00 db 0 ;AN000; display mode, colors - 45554 00009F0E 00 db 0 ;AN000; reserved - 45555 00009F0F 0000 dw 0 ;AN023; colors - 45556 00009F11 0000 dw 0 ;AN000; display width (PELS) - 45557 00009F13 0000 dw 0 ;AN000; display length (PELS) - 45558 display_width: - 45559 00009F15 0000 dw 0 ;AN000; display width - 45560 LinPerPag: - 45561 00009F17 1900 dw LINESPERPAGE ; 25 ;AN000; display length (default to linesperpage) - 45562 - 45563 vol_ioctl_buf: ;AN000; buffer for ioctl volume label/serial call - 45564 00009F19 0000 dw 0 ;AN000; info level - 45565 vol_serial: - 45566 00009F1B 00000000 dd 0 ;AN000; volume serial number - 45567 vol_label: - 45568 00009F1F 20 times 11 db 20h ; " " ;AN000; volume label - init to blanks - 45569 00009F2A 20 times 8 db 20h ; " " ;AN000; file system type - 45570 - 45571 expand_star: - 45572 00009F32 00 db 0 + 45545 ext_entered: + 45546 00009F06 00 db 0 ;AN005; + 45547 + 45548 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:90BCh + 45549 + 45550 Display_Ioctl: + 45551 00009F07 00 db 0 ;AN000; info level + 45552 00009F08 00 db 0 ;AN000; reserved + 45553 00009F09 0E00 dw crt_ioctl_ln ; 14 ;AN000; length of data + 45554 00009F0B 0000 dw 0 ;AN000; control flags + 45555 display_mode: + 45556 00009F0D 00 db 0 ;AN000; display mode, colors + 45557 00009F0E 00 db 0 ;AN000; reserved + 45558 00009F0F 0000 dw 0 ;AN023; colors + 45559 00009F11 0000 dw 0 ;AN000; display width (PELS) + 45560 00009F13 0000 dw 0 ;AN000; display length (PELS) + 45561 display_width: + 45562 00009F15 0000 dw 0 ;AN000; display width + 45563 LinPerPag: + 45564 00009F17 1900 dw LINESPERPAGE ; 25 ;AN000; display length (default to linesperpage) + 45565 + 45566 vol_ioctl_buf: ;AN000; buffer for ioctl volume label/serial call + 45567 00009F19 0000 dw 0 ;AN000; info level + 45568 vol_serial: + 45569 00009F1B 00000000 dd 0 ;AN000; volume serial number + 45570 vol_label: + 45571 00009F1F 20 times 11 db 20h ; " " ;AN000; volume label - init to blanks + 45572 00009F2A 20 times 8 db 20h ; " " ;AN000; file system type 45573 - 45574 msg_flag: - 45575 00009F33 00 db 0 ;AN022; flag set if non-utility message issued - 45576 Msg_Numb: - 45577 00009F34 0000 dw 0 ;AN022; set with extended error message issued - 45578 append_exec: - 45579 00009F36 00 db 0 ;AN041; set if internal append executed - 45580 print_err_flag: - 45581 00009F37 0000 dw 0 ;AN000; flag set if error during sysdispmsg - 45582 subst_buffer: - 45583 00009F39 00 times parm_block_size*2 db 0 ; times 22 db 0 - 45584 ;AN061; - 45585 ; 15/04/2023 - 45586 00009F4F 00 KPARSE: db 0 ; 3/3/KK - 45587 - 45588 ; Data declarations taken out of parse.asm - 45589 - 45590 ; MSDOS 6.0 - 45591 ;arg arg_unit <> ; pointers, arg count, string buffer - 45592 ;argbufptr dw ? ; index for argv[].argpointer - 45593 ;tpbuf db 128 DUP (?) ; temporary buffer - 45594 ;LAST_ARG dw ? ; point at which to accumulate switch info - 45595 ;comptr dw ? ; ptr into combuf - 45596 - 45597 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9105h - 45598 - 45599 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45600 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A7D5h + 45574 expand_star: + 45575 00009F32 00 db 0 + 45576 + 45577 msg_flag: + 45578 00009F33 00 db 0 ;AN022; flag set if non-utility message issued + 45579 Msg_Numb: + 45580 00009F34 0000 dw 0 ;AN022; set with extended error message issued + 45581 append_exec: + 45582 00009F36 00 db 0 ;AN041; set if internal append executed + 45583 print_err_flag: + 45584 00009F37 0000 dw 0 ;AN000; flag set if error during sysdispmsg + 45585 subst_buffer: + 45586 00009F39 00 times parm_block_size*2 db 0 ; times 22 db 0 + 45587 ;AN061; + 45588 ; 15/04/2023 + 45589 00009F4F 00 KPARSE: db 0 ; 3/3/KK + 45590 + 45591 ; Data declarations taken out of parse.asm + 45592 + 45593 ; MSDOS 6.0 + 45594 ;arg arg_unit <> ; pointers, arg count, string buffer + 45595 ;argbufptr dw ? ; index for argv[].argpointer + 45596 ;tpbuf db 128 DUP (?) ; temporary buffer + 45597 ;LAST_ARG dw ? ; point at which to accumulate switch info + 45598 ;comptr dw ? ; ptr into combuf + 45599 + 45600 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9105h 45601 - 45602 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM - 45603 ; PCDOS 7.1 COMMAND.COM (20023) Transient portion offset 0A3DFh - 45604 ARG: - 45605 ARG_ARGV: - 45606 ARGV0_ARGPOINTER: - 45607 00009F50 0000 dw 0 ; ARGV[0] - 45608 ARGV0_ARG_FLAGS: - 45609 00009F52 00 db 0 - 45610 ARGV0_ARGSTARTEL: - 45611 00009F53 0000 dw 0 - 45612 ARGV0_ARGLEN: - 45613 00009F55 0000 dw 0 - 45614 ARGV0_ARGSW_WORD: - 45615 00009F57 0000 dw 0 - 45616 ARGV0_OCOMPTR: - 45617 00009F59 0000 dw 0 - 45618 ARGV1_ARGPOINTER: - 45619 00009F5B 0000 dw 0 ; ARGV[1] - 45620 00009F5D 00 times 5 db 0 - 45621 ARGV1_ARGSW_WORD: - 45622 00009F62 0000 dw 0 - 45623 00009F64 0000 dw 0 - 45624 ARGV2_ARGPOINTER: - 45625 00009F66 0000 dw 0 ; ARGV[2] - 45626 00009F68 00 times 5 db 0 - 45627 ARGV2_ARGSW_WORD: - 45628 00009F6D 0000 dw 0 - 45629 00009F6F 0000 dw 0 - 45630 00009F71 00 times 671 db 0 ; ARGV[3] to ARGV[63] - 45631 ARG_ARGVCNT: - 45632 0000A210 0000 dw 0 - 45633 ARG_ARGSWINFO: - 45634 0000A212 0000 dw 0 - 45635 ARG_ARGBUF: - 45636 ;times 256 dw 0 ; times ARGBLEN dw 0 - 45637 ; 27/07/2024 PCDOS 7.1 COMMAND.COM - 45638 0000A214 0000 times 128 dw 0 ; times ARGBLEN dw 0 - 45639 ARG_ARGFORCOMBUF: - 45640 0000A314 00 times 128 db 0 ; times COMBUFLEN db 0 - 45641 - 45642 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9649h - 45643 ; 18/06/2023 - 45644 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0AD19h - 45645 ; 03/08/2024 - 45646 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 0A823h - 45647 ARGBUF_PTR: - 45648 0000A394 0000 dw 0 ; index for argv[].argpointer - 45649 TPBUF: ; temporary buffer - 45650 Arg_Buf: ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 45651 0000A396 00 times 128 db 0 - 45652 LASTARG: - 45653 0000A416 0000 dw 0 ; point at which to accumulate switch info - 45654 0000A418 0000 COMPTR: dw 0 ; ptr into combuf - 45655 - 45656 ; Data declarations taken out of path.asm - 45657 ;fbuf find_buf <> ; dma buffer for findfirst/findnext - 45658 ;pathinfo DW 3 DUP (?) ; ES, SI(old), and SI(new) of user path - 45659 ;psep_char DB ? ; '/' or '\' - 45660 ;search_best DB (?) ; best code, best filename so far - 45661 ;fname_max_len equ 13 - 45662 ;search_best_buf DB fname_max_len DUP (?) - 45663 ;search_curdir_buf DB 64 DUP (?) ; a place for CurDir info, if successful - 45664 ;search_error DW (?) ; address of error message to be printed - 45665 - 45666 FINDBUFLEN equ FIND_BUF.size ; 43 - 45667 - 45668 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 96CFh - 45669 - 45670 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45671 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AD9Fh + 45602 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45603 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0A7D5h + 45604 + 45605 ; 13/08/2024 - Retro DOS v5.0 COMMAND.COM + 45606 ; PCDOS 7.1 COMMAND.COM (20023) Transient portion offset 0A3DFh + 45607 ARG: + 45608 ARG_ARGV: + 45609 ARGV0_ARGPOINTER: + 45610 00009F50 0000 dw 0 ; ARGV[0] + 45611 ARGV0_ARG_FLAGS: + 45612 00009F52 00 db 0 + 45613 ARGV0_ARGSTARTEL: + 45614 00009F53 0000 dw 0 + 45615 ARGV0_ARGLEN: + 45616 00009F55 0000 dw 0 + 45617 ARGV0_ARGSW_WORD: + 45618 00009F57 0000 dw 0 + 45619 ARGV0_OCOMPTR: + 45620 00009F59 0000 dw 0 + 45621 ARGV1_ARGPOINTER: + 45622 00009F5B 0000 dw 0 ; ARGV[1] + 45623 00009F5D 00 times 5 db 0 + 45624 ARGV1_ARGSW_WORD: + 45625 00009F62 0000 dw 0 + 45626 00009F64 0000 dw 0 + 45627 ARGV2_ARGPOINTER: + 45628 00009F66 0000 dw 0 ; ARGV[2] + 45629 00009F68 00 times 5 db 0 + 45630 ARGV2_ARGSW_WORD: + 45631 00009F6D 0000 dw 0 + 45632 00009F6F 0000 dw 0 + 45633 00009F71 00 times 671 db 0 ; ARGV[3] to ARGV[63] + 45634 ARG_ARGVCNT: + 45635 0000A210 0000 dw 0 + 45636 ARG_ARGSWINFO: + 45637 0000A212 0000 dw 0 + 45638 ARG_ARGBUF: + 45639 ;times 256 dw 0 ; times ARGBLEN dw 0 + 45640 ; 27/07/2024 PCDOS 7.1 COMMAND.COM + 45641 0000A214 0000 times 128 dw 0 ; times ARGBLEN dw 0 + 45642 ARG_ARGFORCOMBUF: + 45643 0000A314 00 times 128 db 0 ; times COMBUFLEN db 0 + 45644 + 45645 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9649h + 45646 ; 18/06/2023 + 45647 ; MSDOS 6.22 COMMAND.COM (1994) Transient portion offset 0AD19h + 45648 ; 03/08/2024 + 45649 ; PCDOS 7.1 COMMAND.COM (2003) Transient portion offset 0A823h + 45650 ARGBUF_PTR: + 45651 0000A394 0000 dw 0 ; index for argv[].argpointer + 45652 TPBUF: ; temporary buffer + 45653 Arg_Buf: ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 45654 0000A396 00 times 128 db 0 + 45655 LASTARG: + 45656 0000A416 0000 dw 0 ; point at which to accumulate switch info + 45657 0000A418 0000 COMPTR: dw 0 ; ptr into combuf + 45658 + 45659 ; Data declarations taken out of path.asm + 45660 ;fbuf find_buf <> ; dma buffer for findfirst/findnext + 45661 ;pathinfo DW 3 DUP (?) ; ES, SI(old), and SI(new) of user path + 45662 ;psep_char DB ? ; '/' or '\' + 45663 ;search_best DB (?) ; best code, best filename so far + 45664 ;fname_max_len equ 13 + 45665 ;search_best_buf DB fname_max_len DUP (?) + 45666 ;search_curdir_buf DB 64 DUP (?) ; a place for CurDir info, if successful + 45667 ;search_error DW (?) ; address of error message to be printed + 45668 + 45669 FINDBUFLEN equ FIND_BUF.size ; 43 + 45670 + 45671 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 96CFh 45672 - 45673 0000A41A 00 FBUF: times FINDBUFLEN db 0 ; times 43 db 0 - 45674 FBUF_PNAME equ FBUF+30 ; packed name, 13 bytes - 45675 pathinfo: - 45676 ;pathinfo_0: - 45677 0000A445 0000 dw 0 - 45678 ;pathinfo_2: - 45679 0000A447 0000 dw 0 - 45680 ;pathinfo_4: - 45681 0000A449 0000 dw 0 - 45682 psep_char: - 45683 0000A44B 00 db 0 - 45684 search_best: - 45685 0000A44C 00 db 0 - 45686 FNAME_MAX_LEN equ 13 - 45687 search_best_buf: - 45688 0000A44D 00 times FNAME_MAX_LEN db 0 ; times 13 db 0 - 45689 search_curdir_buf: - 45690 0000A45A 00 times 64 db 0 - 45691 search_error: - 45692 0000A49A 0000 dw 0 - 45693 - 45694 ; Data declarations taken out of tbatch.asm - 45695 - 45696 ;if_not_count DW ? - 45697 ; - 45698 ;zflag db ? ; Used by typefil to indicate ^Z's - 45699 ; - 45700 ; DW 80H DUP(0) ; Init to 0 to make sure the linker is not fooled - 45701 - 45702 ; 31/03/2023 - 45703 ;STACK: ;LABEL WORD + 45673 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45674 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AD9Fh + 45675 + 45676 0000A41A 00 FBUF: times FINDBUFLEN db 0 ; times 43 db 0 + 45677 FBUF_PNAME equ FBUF+30 ; packed name, 13 bytes + 45678 pathinfo: + 45679 ;pathinfo_0: + 45680 0000A445 0000 dw 0 + 45681 ;pathinfo_2: + 45682 0000A447 0000 dw 0 + 45683 ;pathinfo_4: + 45684 0000A449 0000 dw 0 + 45685 psep_char: + 45686 0000A44B 00 db 0 + 45687 search_best: + 45688 0000A44C 00 db 0 + 45689 FNAME_MAX_LEN equ 13 + 45690 search_best_buf: + 45691 0000A44D 00 times FNAME_MAX_LEN db 0 ; times 13 db 0 + 45692 search_curdir_buf: + 45693 0000A45A 00 times 64 db 0 + 45694 search_error: + 45695 0000A49A 0000 dw 0 + 45696 + 45697 ; Data declarations taken out of tbatch.asm + 45698 + 45699 ;if_not_count DW ? + 45700 ; + 45701 ;zflag db ? ; Used by typefil to indicate ^Z's + 45702 ; + 45703 ; DW 80H DUP(0) ; Init to 0 to make sure the linker is not fooled 45704 - 45705 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9751h - 45706 - 45707 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45708 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AE21h + 45705 ; 31/03/2023 + 45706 ;STACK: ;LABEL WORD + 45707 + 45708 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9751h 45709 - 45710 ; 14/08/2024 - Retro DOS v5.0 COMMAND.COM - 45711 ; MSDOS 7.1 COMMAND.COM - TRANGROUP:0A92Bh - 45712 IF_NOT_COUNT: - 45713 0000A49C 0000 dw 0 - 45714 - 45715 align 2 ; 18/06/2023 - 45716 - 45717 0000A49E 00 times 256 db 0 - 45718 - 45719 ; 16/04/2023 - 45720 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:9854h + 45710 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45711 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AE21h + 45712 + 45713 ; 14/08/2024 - Retro DOS v5.0 COMMAND.COM + 45714 ; MSDOS 7.1 COMMAND.COM - TRANGROUP:0A92Bh + 45715 IF_NOT_COUNT: + 45716 0000A49C 0000 dw 0 + 45717 + 45718 align 2 ; 18/06/2023 + 45719 + 45720 0000A49E 00 times 256 db 0 45721 - 45722 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM - 45723 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AF24h - 45724 STACK: - 45725 - 45726 ;INTERNATVARS internat_block <> - 45727 ; db (internat_block_max - ($ - INTERNATVARS)) DUP (?) + 45722 ; 16/04/2023 + 45723 ; MSDOS 5.0 COMMAND.COM - TRANGROUP:9854h + 45724 + 45725 ; 18/06/2023 - Retro DOS v4.2 COMMAND.COM + 45726 ; MSDOS 6.22 COMMAND.COM - TRANGROUP:0AF24h + 45727 STACK: 45728 - 45729 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9854h - 45730 INTERNATVARS: - 45731 ; (24+8 = 32 bytes) - 45732 DATE_TIME_FORMAT: - 45733 0000A59E 0000 dw 0 ; 0-USA, 1-EUR, 2-JAP - 45734 CURRENCY_SYM: - 45735 0000A5A0 0000000000 db 0,0,0,0,0 ; times 5 db 0 ; Currency Symbol 5 bytes - 45736 THOUS_SEP: - 45737 0000A5A5 0000 db 0,0 ; Thousands separator 2 bytes - 45738 DECIMAL_SEP: - 45739 0000A5A7 0000 db 0,0 ; Decimal separator 2 bytes - 45740 DATE_SEP: - 45741 0000A5A9 0000 db 0,0 ; Date separator 2 bytes - 45742 TIME_SEP: - 45743 0000A5AB 0000 db 0,0 ; Time separator 2 bytes - 45744 BIT_FIELD: - 45745 0000A5AD 00 db 0 ; Bit values - 45746 ; Bit 0 = 0 if currency symbol first - 45747 ; = 1 if currency symbol last - 45748 ; Bit 1 = 0 if No space after currency symbol - 45749 ; = 1 if space after currency symbol - 45750 CURRENCY_CENTS: - 45751 0000A5AE 00 db 0 ; Number of places after currency dec point - 45752 TIME_24: - 45753 0000A5AF 00 db 0 ; 1 if 24 hour time, 0 if 12 hour time - 45754 MAP_CALL: - 45755 0000A5B0 00000000 dw 0,0 ; dd 0 ; Address of case mapping call (DWORD) - 45756 ; THIS IS TWO WORDS SO IT CAN BE INITIALIZED - 45757 ; in pieces. - 45758 DATA_SEP: - 45759 0000A5B4 0000 db 0,0 ; Data list separator character - 45760 - 45761 0000A5B6 00 times 8 db 0 - 45762 - 45763 ; Max size of the block returned by the INTERNATIONAL call - 45764 - 45765 INTERNAT_BLOCK_SIZE EQU 32 - 45766 - 45767 ;; Buffer for DOS function 64h (Get extended country information) - 45768 ;; subfunctions 2, 4, 6, or 7: - 45769 ; - 45770 ;CountryPtrInfo label byte - 45771 ;CountryPtrId db ? - 45772 ;CountryPtr dd ? - 45773 ; .erre (($ - CountryPtrInfo) GE 5) - 45774 - 45775 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9874h - 45776 CountryPtrInfo: - 45777 CountryPtrId: - 45778 0000A5BE 00 db 0 - 45779 CountryPtr: - 45780 0000A5BF 00000000 dd 0 - 45781 - 45782 OldCtrlCHandler: - 45783 0000A5C3 00000000 dd 0 ; previous int 23 vector + 45729 ;INTERNATVARS internat_block <> + 45730 ; db (internat_block_max - ($ - INTERNATVARS)) DUP (?) + 45731 + 45732 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9854h + 45733 INTERNATVARS: + 45734 ; (24+8 = 32 bytes) + 45735 DATE_TIME_FORMAT: + 45736 0000A59E 0000 dw 0 ; 0-USA, 1-EUR, 2-JAP + 45737 CURRENCY_SYM: + 45738 0000A5A0 0000000000 db 0,0,0,0,0 ; times 5 db 0 ; Currency Symbol 5 bytes + 45739 THOUS_SEP: + 45740 0000A5A5 0000 db 0,0 ; Thousands separator 2 bytes + 45741 DECIMAL_SEP: + 45742 0000A5A7 0000 db 0,0 ; Decimal separator 2 bytes + 45743 DATE_SEP: + 45744 0000A5A9 0000 db 0,0 ; Date separator 2 bytes + 45745 TIME_SEP: + 45746 0000A5AB 0000 db 0,0 ; Time separator 2 bytes + 45747 BIT_FIELD: + 45748 0000A5AD 00 db 0 ; Bit values + 45749 ; Bit 0 = 0 if currency symbol first + 45750 ; = 1 if currency symbol last + 45751 ; Bit 1 = 0 if No space after currency symbol + 45752 ; = 1 if space after currency symbol + 45753 CURRENCY_CENTS: + 45754 0000A5AE 00 db 0 ; Number of places after currency dec point + 45755 TIME_24: + 45756 0000A5AF 00 db 0 ; 1 if 24 hour time, 0 if 12 hour time + 45757 MAP_CALL: + 45758 0000A5B0 00000000 dw 0,0 ; dd 0 ; Address of case mapping call (DWORD) + 45759 ; THIS IS TWO WORDS SO IT CAN BE INITIALIZED + 45760 ; in pieces. + 45761 DATA_SEP: + 45762 0000A5B4 0000 db 0,0 ; Data list separator character + 45763 + 45764 0000A5B6 00 times 8 db 0 + 45765 + 45766 ; Max size of the block returned by the INTERNATIONAL call + 45767 + 45768 INTERNAT_BLOCK_SIZE EQU 32 + 45769 + 45770 ;; Buffer for DOS function 64h (Get extended country information) + 45771 ;; subfunctions 2, 4, 6, or 7: + 45772 ; + 45773 ;CountryPtrInfo label byte + 45774 ;CountryPtrId db ? + 45775 ;CountryPtr dd ? + 45776 ; .erre (($ - CountryPtrInfo) GE 5) + 45777 + 45778 ; MSDOS 5.0 COMMAND.COM (1991) Transient portion offset 9874h + 45779 CountryPtrInfo: + 45780 CountryPtrId: + 45781 0000A5BE 00 db 0 + 45782 CountryPtr: + 45783 0000A5BF 00000000 dd 0 45784 - 45785 BATLEN equ 32 - 45786 - 45787 BATBUFPOS: - 45788 0000A5C7 0000 dw 0 ; integer position in buffer of next byte + 45785 OldCtrlCHandler: + 45786 0000A5C3 00000000 dd 0 ; previous int 23 vector + 45787 + 45788 BATLEN equ 32 45789 - 45790 0000A5C9 00 BATBUF: times BATLEN db 0 ; times 32 db 0 - 45791 BATBUFEND: - 45792 0000A5E9 0000 dw 0 - 45793 - 45794 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM - 45795 %if 0 - 45796 TypeFilSiz: - 45797 dd 0 ; stores size of file to be typed - 45798 %endif - 45799 - 45800 ; ***************************************************** - 45801 ; EMG 4.00 - 45802 ; DATA STARTING HERE WAS ADDED BY EMG FOR 4.00 - 45803 ; FOR IMPLEMENTATION OF COMMON PARSE ROUTINE - 45804 ; ***************************************************** - 45805 ; - 45806 ; COMMON PARSE OUTPUT BLOCKS - 45807 - 45808 ; Common output blocks for PARSE number, complex, or string values. - 45809 - 45810 PARSE1_OUTPUT: - 45811 PARSE1_TYPE: - 45812 0000A5EB 00 db 0 ;AN000; type - 45813 PARSE1_CODE: - 45814 0000A5EC 00 db 0 ;AN000; return value - 45815 PARSE1_SYN: - 45816 0000A5ED 0000 dw 0 ;AN000; es offset of synonym - 45817 PARSE1_ADDR: - 45818 0000A5EF 00000000 dd 0 ;AN000; numeric value / address - 45819 ; of string value - 45820 - 45821 ; Common output block for PARSE date strings. - 45822 - 45823 DATE_OUTPUT: - 45824 DATE_TYPE: - 45825 0000A5F3 00 db 0 ;AN000; type - 45826 0000A5F4 00 db 0 ;AN000; return value - 45827 0000A5F5 0000 dw 0 ;AN000; es offset of synonym - 45828 DATE_YEAR: - 45829 0000A5F7 0000 dw 0 ;AN000; year - 45830 DATE_MONTH: - 45831 0000A5F9 00 db 0 ;AN000; month - 45832 DATE_DAY: - 45833 0000A5FA 00 db 0 ;AN000; day - 45834 - 45835 ; Common output block for PARSE time strings. - 45836 - 45837 TIME_OUTPUT: - 45838 TIME_TYPE: - 45839 0000A5FB 00 db 0 ;AN000; type - 45840 0000A5FC 00 db 0 ;AN000; return value - 45841 0000A5FD 0000 dw 0 ;AN000; es offset of synonym - 45842 TIME_HOUR: - 45843 0000A5FF 00 db 0 ;AN000; hour - 45844 TIME_MINUTES: - 45845 0000A600 00 db 0 ;AN000; minutes - 45846 TIME_SECONDS: - 45847 0000A601 00 db 0 ;AN000; seconds - 45848 TIME_FRACTION: - 45849 0000A602 00 db 0 ;AN000; hundredths - 45850 - 45851 ; Common output block for PARSE drive specifier (one based drive number). - 45852 - 45853 DRIVE_OUTPUT: - 45854 DRIVE_TYPE: - 45855 0000A603 00 db 0 ;AN000; type - 45856 DRIVE_VALUE: - 45857 0000A604 00 db 0 ;AN000; return value - 45858 0000A605 0000 dw 0 ;AN000; es offset of synonym - 45859 DRIVE_NUMBER: - 45860 0000A607 00 db 0 ;AN000; drive number - 45861 0000A608 000000 db 0,0,0 ;AN000; reserved - 45862 - 45863 ; 18/04/2023 - 45864 ; 16/04/2023 - 45865 ;TRANSPACEEND: ; 98C5h - 45866 ; End of MSDOS 5.0 COMMAND.COM (1991) Transient portion - 45867 - 45868 ; 18/06/2023 - 45869 ;TRANSPACEEND: ; 0AF95h - 45870 ; End of MSDOS 6.22 COMMAND.COM (1994) Transient portion - 45871 - 45872 ; ---------------------------------------------------------------------------- - 45873 ; 18/06/2023 - 45874 ; 20/04/2023 - 45875 ; 14/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM - 45876 TRANSPACEEND equ ($-TRANSIENTSTART) ; Transient portion size + 45790 BATBUFPOS: + 45791 0000A5C7 0000 dw 0 ; integer position in buffer of next byte + 45792 + 45793 0000A5C9 00 BATBUF: times BATLEN db 0 ; times 32 db 0 + 45794 BATBUFEND: + 45795 0000A5E9 0000 dw 0 + 45796 + 45797 ; 03/08/2024 - PCDOS 7.1 COMMAND.COM + 45798 %if 0 + 45799 TypeFilSiz: + 45800 dd 0 ; stores size of file to be typed + 45801 %endif + 45802 + 45803 ; ***************************************************** + 45804 ; EMG 4.00 + 45805 ; DATA STARTING HERE WAS ADDED BY EMG FOR 4.00 + 45806 ; FOR IMPLEMENTATION OF COMMON PARSE ROUTINE + 45807 ; ***************************************************** + 45808 ; + 45809 ; COMMON PARSE OUTPUT BLOCKS + 45810 + 45811 ; Common output blocks for PARSE number, complex, or string values. + 45812 + 45813 PARSE1_OUTPUT: + 45814 PARSE1_TYPE: + 45815 0000A5EB 00 db 0 ;AN000; type + 45816 PARSE1_CODE: + 45817 0000A5EC 00 db 0 ;AN000; return value + 45818 PARSE1_SYN: + 45819 0000A5ED 0000 dw 0 ;AN000; es offset of synonym + 45820 PARSE1_ADDR: + 45821 0000A5EF 00000000 dd 0 ;AN000; numeric value / address + 45822 ; of string value + 45823 + 45824 ; Common output block for PARSE date strings. + 45825 + 45826 DATE_OUTPUT: + 45827 DATE_TYPE: + 45828 0000A5F3 00 db 0 ;AN000; type + 45829 0000A5F4 00 db 0 ;AN000; return value + 45830 0000A5F5 0000 dw 0 ;AN000; es offset of synonym + 45831 DATE_YEAR: + 45832 0000A5F7 0000 dw 0 ;AN000; year + 45833 DATE_MONTH: + 45834 0000A5F9 00 db 0 ;AN000; month + 45835 DATE_DAY: + 45836 0000A5FA 00 db 0 ;AN000; day + 45837 + 45838 ; Common output block for PARSE time strings. + 45839 + 45840 TIME_OUTPUT: + 45841 TIME_TYPE: + 45842 0000A5FB 00 db 0 ;AN000; type + 45843 0000A5FC 00 db 0 ;AN000; return value + 45844 0000A5FD 0000 dw 0 ;AN000; es offset of synonym + 45845 TIME_HOUR: + 45846 0000A5FF 00 db 0 ;AN000; hour + 45847 TIME_MINUTES: + 45848 0000A600 00 db 0 ;AN000; minutes + 45849 TIME_SECONDS: + 45850 0000A601 00 db 0 ;AN000; seconds + 45851 TIME_FRACTION: + 45852 0000A602 00 db 0 ;AN000; hundredths + 45853 + 45854 ; Common output block for PARSE drive specifier (one based drive number). + 45855 + 45856 DRIVE_OUTPUT: + 45857 DRIVE_TYPE: + 45858 0000A603 00 db 0 ;AN000; type + 45859 DRIVE_VALUE: + 45860 0000A604 00 db 0 ;AN000; return value + 45861 0000A605 0000 dw 0 ;AN000; es offset of synonym + 45862 DRIVE_NUMBER: + 45863 0000A607 00 db 0 ;AN000; drive number + 45864 0000A608 000000 db 0,0,0 ;AN000; reserved + 45865 + 45866 ; 18/04/2023 + 45867 ; 16/04/2023 + 45868 ;TRANSPACEEND: ; 98C5h + 45869 ; End of MSDOS 5.0 COMMAND.COM (1991) Transient portion + 45870 + 45871 ; 18/06/2023 + 45872 ;TRANSPACEEND: ; 0AF95h + 45873 ; End of MSDOS 6.22 COMMAND.COM (1994) Transient portion + 45874 + 45875 ; ---------------------------------------------------------------------------- + 45876 ; 18/06/2023 + 45877 ; 20/04/2023 + 45878 ; 14/08/2024 - Retro DOS v5.0 (PCDOS 7.1) COMMAND.COM + 45879 TRANSPACEEND equ ($-TRANSIENTSTART) ; Transient portion size diff --git a/retrodos5/command/archive/command7_15_8_2024.zip b/retrodos5/command/archive/command7_15_8_2024.zip new file mode 100644 index 0000000000000000000000000000000000000000..c8e636be9b4e753c6c4e5e479be43ddfa57fd2ae GIT binary patch literal 893233 zcmV(xK5s5@xkti-5<5X`~65MdZg>Uop{XFe+_$E#I{77^+{G{-l(bC){GsHXr`s>Tyf}#fGG`LZOr-a<&wx$f29sdG#_&Gd zPB@3ysmw*3?QnI-((N~TqJ~V1c7gaX!M~G zfi}}z-r@NAVc7THc@t<~^id1JmKmg`E+e3JI^2iI;41?2F*5R$J;gcw{MMIzX(xaW z0QqssM`;N5MKK@-KL2u0PH{xKmSnIL) z_TW3WqncdFfx%eU-6qd~dtiFpV2)wLT)j6&bT0Kif7x-|A=B^cPtPw5hd)%br_cjXrL>Mlk;ZETR1?=d^8wsO z@ZT%7Tw1s~?N8-Ox)F$z<%*&23dV`FSu5!Z6DJF0wTNa1bww_y+GYsu&{e~Q2#JZL zpsN*y#3qG9eY>erQS)BTXNrnkR*0&V72P0}QqkP5xHU9YfTg{;9lX-h;V47qHk9<*>JZS`7LB?DM!Yxo|qmtd*D1-(@F+W zb}D((@T`1gt?GHB27>4Xgs|7=e4PL#0kIH7Qc$5tG&K3RAOwVv3y^kW&n2s~cg^lP zk!dKX_yZJ(4$&ha(NZ8pizsOkLgEJ?(J|{i+Yw1Yfv;HY?9A+&w{PY;U8SV5*L1hK zw2$aRa&cYB9mP_-K+y$z&RS}ZYAz4GC0w`nXE)#JAdU}arQ8G<&OQmvW zf~A-=T#Ou__C<>m|uI`8*+ z#6b*Ytuq$EmX~;i_tbmgz4ktNU%c<$FK@!1^%wjV|A7yF;Xm_V`S1J>erFREm|DFz zj81PL$y`C)*zENh>m04h(fb_1j8$7~mVK$>5qfF84#ATgO5(XFMYxX{l_g;22&c;9 zY;)F^3QH~zBdHWbW}>>U26pa{1%1oV+C;$#@mh&qY+e znVl((L`K({*=@EBMKS|XcATzxaBX?swOTnWluYP$f+Db;sBv3B+&TD8!xleVrEpsp zLs=Z#2~^9bEB3gOBE`7+PRGmi-&Hgev}@5Z!)B_Dn{qmXh$E7cpV>u&!pn@EKMG;s zd6X;V#AFFaU}LshH6|XmV2EQ00fQqVu+-U+ppBjx&Wn@{poyn|oD`$>Ux6aXn`@i& z>cXj-Qw7cw(dbhvd6rmcaL_#7Jh9eRWrtNTxdsML24%snUoWgyw3H((&oZeD3UIri z!a2{?GIx{D3MZ2S;SNQs4QdkN--HBH!F=%fpO|-L?Tkq(NN%w6N$N z0Y6aJr6oXFOrJB+Z}9SxM%yd6!f+6M&P-(Y@hp0xUjj!{OE{YLMjK;LF)~nv2Y%Zo zEbppm0JdH-)r{x_OP8A*UCOp~Z{u|vF+CL(kPTQOeNgJU$3De8HjBK3WgMB$jP7(f zx}F3!3xqtob6&x2P5qvupR$HCi==d~a|1?lih7KrZ?R+1xGGra+GL|Vqs@uiGf-Oz zhJd7PE{2fAzi91h92Sk45NalF))3Oi7h%6EEVix29_LHI2*UM(0F0h93k&WRG7Gnm zLhS7^@m%xQogNe{K|>q-305LB^(P0dM+rur7oc}?FdV5z|9HJL6?wZd3$*1Y zL<;o4$*;d>-bb~B8$4*Rp>{WWCi2*_l8E%$2P|&@?GPAorhSHbgHaFY8h=r2T z6uuSHkUmqJ&9`9bba1Qh;Rz@axIE`j#16P_86sRGgLb+q6fIyW4U5aoDP2+4dypB~UE|h{H&Ykm z==a%P!@i8^Xx1Kyqjxe5w&`fztiPas1JjT*19>%ba1!!7I$f7Ay@HuH@TbSw1%lcF z+{ZpXgu}VLqzfah!bNz0In8C7`?v8IARosOdwUtSuRR$x^eCLbxob2kpvYL9uW%WM z)>ej-T@`2&H1%5&*)*~CIZPMo^3nR(w?xMD8n_9$aCoWy8FW7~&smp?)uSXd6VrKE zJ&~iuIKWxMVgNy*(XIL=>SZ{9iebGcc#oOoU)5K+NY#X*sSx(;2%x!e#Oc8kHt@!w zsEF}j92SK&F256=*eiABg6)zDV$l2b=tqezA;bg&&yVkkIQI6E{VlqZ@l{Jh#y2hR zFx}q0XyBMIJL3hcCA!u-&CIG*f<_#Ab6;lz;(0!Bkbw)|#9L8pqkChZgE7jFjdF}j z96@Ao!tW#%j{at?W=+hl^N%A=Q}a1`lPSQ!is*=`kQ5V%DXT?|h|ZdxQN<+&LWwEy&xO3NfI&>RKYuyW>mfX{PE1`x*?p#^T`~kCZx0&cq(L zVIxeamJIhW5)R!=6zA0}DX;KXg~ggG#d$t%A{Sy#>GKXwU5-1g@Q^OT$g8JItXH2b zo8y2g&Qk2vPh2ra=?fq>oLi*JGb@y_00Z@!I)2?nm?we~3+j4a*Z9#*SM;)H_){Q` zWRVb^mKe_mlO{&#o4PVaS1}$Z5aDv)#zY-u2{ENf>Z3%-=WvK%TFFFDR__KB;gD{k z^P&F&=uhYe6Op$kyfDxtnTPm$TmJd@s?KRRm~O<+un$#g3kg{1HvWU>XkbzhLxsp(d)T;>{0Mc7nmrn8H$j2zDz?UVpUA6jc8tq2Wc=D90 z87Vb@7^rPT(b@EML@#Fi=%3LG;V<16?@7)KNCA;8sb@XY1yNF2gE=wxG-aS_WF=VntJ8j^X+vh&irUPF8DK zutY;z0Tm7zA`YsZY^vgXpQRHi z0d!?J7kmw?UCD3Fwm0!FWJie|Y-2V<1pkej&8n^|`+_X${1B`-A3#gPVpG4Mz)30m zC%7#GwL3ASDceghBFt;}(=`kxUsfp%QNHu074U1~r}dnyVgC2*ItcamFN2l zp>8gjNT$Rxea_oOyXRr1P?`qH>8TG}&{Lm2je@HXWXt)j%I~3csS)DJ5J^+rrO8)g(I^QfB#1c@Yt)>OiE#6~To>l2mMtsm(5SPyG zD9V&Zic+MZLb8~ZPwAi+O~}*eezs_y%vM)N_MoE65|ypUU8{7{MJ&B%Jo>W7`JBi| z5A_lN(WfBoEF$^NIC<aPvhb@_=6NbZ31nO4k|ib5Xj?fQLnCzX4OSqz4U{nu?__!3UWpel8f~`JyhfhD<2(bG(pc#QY4*XOt%$~m}#jD)5T1cePqluZ*HVH9w#<7vNFzBZp*LE zQjP{p#qg}I18)YEf@6$^pB_xjLJX&MpsPDbXR2NLD6 z#l7at@*wi$8#n3bCMCW}G9TR(9aTnW{*j=02Q6^3hSpzU6GC^0?^%Y{D?k;hYC9If zb;x)-@9?3?yiK6zj0w^&3)jbc4w<5d%WVQ5I!g@NkiGE|-EvsA6p|}g*;KZ0XuU7v zc994PcSfkQDcV1h+qlSG6Y5wN9Vq^rTq}=iqX^@(yJQp6CPl4yvPqz9iwB1X0tN(; z0#T6y$(`Y8klwXE!7MyXPQ!P zvM39xd7L%142vfzePt_gD=p2jrWM+H&7f#8!ivf|gK^wTWr!^AWY1veo^CRRkln=a zvJq~L{F991y=-t_k{J9wjUQ%!)b=GIcPr#!N#I}+i9_Q2P@tS~!%5GdNjGw zk(COJMH0;ePFAXAFx4`kgDpvyH`Ss{n_Z{QTHrDpuB6GOn2&Ob;bBCVAfgsZJts!kwuIKDuVXDp2w)q62CU3|H1S=Q6VGKr z51z~E(=|TKp!#Cp5qu#c%OXX-tfI09Z&&RXwYO`m15gp23IV8g&0yWLI(~8e%)&J zafG=h<7=9RnJ)|?>wIT{^XvVJe2J%)UglxX1s&u#tg&lTh8^EUiHygttEJw7YGZ!& zPcrsvOg@e!bd>6(+DU+o0mp+;#sRzTNG15@;Oc8lzD;)BkSu%XWm}V+vaHCZxNFY% zG^KFxPJ=F-YQW2}6_wGZjtq@z)EWP&RD!(e1*8tzRnU`~mf>EMAipY{R08hFV7X=T z1wpIKQy?(HmRppvxDr^Vptr)xh^kJILA@8MYW+~jqwOys*x5ycLmiEfiR^sJEYjy- z$HoHcUvOEpfp&&CXURQ)+Nbs6*MNWBH31B(7i5KUTA%go8Vd+ZxNW8OX<<-}d6yRm{+s!HI zX(?yJp^kGB0k$etqu{HK!C!zfuCxP|cPwlT*dDNQ!N03`mU(3u_6F_JN(p8LAy)`C zuQp!|oRaPe*RL`MyLNRD!c(xQ+wCNX4SYev&}V9Em3Vzd-R%HI)R}A5;5#Ie@-l8E z7fIUS2NPCTXV9M)92m$cAVnqQRt>-0W8b>hoU}aj0!`p+1yDWgGo*Q_!}WyQU@t?^ z#>yLRC0JLO2rD1}FkWO10d(s1S3+tj;0$8@DuQ5y7*T;NGo%P22T7ooXEuj=d5qdB zK_vt%2mlBFQFLy&TOqBqfC#^^s$S&@1}OXjiMUDSN12uoj9U2n9GC$NggioY2}H>k z3kuqq0MwQOH5lq}YNaqRKn_3x6&y6*0wMrdUH$Jku6c=F1sUpr7eZzkkSX{hQXIAkp%6X>NREAV2!;iK2ap$-He2;s zRmz=wq^P7KFEk1DLC&fPk?;<#x}9)lzfHXEdU%Ea@7q=MI)o*us0s+$ZFZ0_Aa#-1 z942eF)BgI(G3^BB;uOy0i=$B-uy}bplo7 z5^CMD64vf2B9GU=@Z5ZtdG+-G?}gUi4fQJSt#l45DTw!((3+eH_Oux^z+NqCJZej<32s?T9Yi_%4<*nv2_|+1_Rfqof7wR`|wLJD% zVheY$?avTIqRdUUrR-CY2#wL?-xhbIdGjn_7SC@u+%nuUjz>yI*wl51G)^61$DVV* zy{y#{xlf2p9c6bsM;QVqIkGwkB*cxd@HCpdJ6jdE#gVlz0ttFY7GO^zgP%!KuomJb z+Pu$i@SrpZ`JBm4x0P;+Lemqquvue(zf45m$;6{M_lYj@(J8V;5;&ZeWItsJ;3!!< zeu~`)+|E-WGD3KG1hdzbu=Z4Ir(`BtBE^g8ai#TkIFpaSN z!K%P<6ZaYuxm(Z^RBn`gjX}^LP^SiNW13Rk%p(v;8LDW7Elzii)gaCk8cl1A<*k8q zPh=g${d9G&L9`h@GWMJ&s(?i5VEXiMw$M2CT=G8WJIvtNb3h^9kJ6^Wvew2+DX2I?<9G@@SenAuo&i0yCE}`-`guTjb}gQ^`Nxk=v6ru-#h;v6 zQJqNG>C7r$hlK5e6|F;FmxoFqkezLv;{n*_pVoMiWA9gvA9Ad+Fuy6Qbe$s;iLC$e zqyD}njhfDdu3qy%B+5VVYOij|=1#9`r~y>~9XuVsven&)attz8F^Ra*LK=nAAT(5Z7ZWnBe@1}MBXRCsf+P!EN- zK;Z%xp)kEOF6;PCDeE}bdatW7dZA0VL)6S|_FuKwf6WpyIKipZkjbK8I+SVeJL*4p zWFp-G44&t(>V+h>g+18DudmU(6eU<7VAKb)bIMEE!byCv{XCwC0qnAAM9pY@(t%Ah z>d)S4@jmr9?kM3r7e>4xW2bGPy4X%P%{TSywptz<7Nf}1dXc!FC*iv6K%ezAF_Kqg z*A+O~nq#LIeU*kqW+o7kwpskprN+?l%Zu8zKDGh?p;8ap-!cpg&B;dv-J#m5YS;ll zylj{RFZhPc@@_$|aiB~H0qhIx;T!8{5&<8ZaQYr_PB?~Gh(Hr;_8R%8A9==3Ue-DH?*myOy==x>$;a_{y$^!vMF^DZ3#oGXYI^ zNMEE3+orcC%BgR*!|nC3kG80Ti9w1}lE~JpA<80DpUbU5gJv1PW8d z{=KsttbpmY_+XK@>oNRu5l#f$%A*|295f?bcg9e9`(&5VM9@G23sT;lYe(7j?dk0! z?B{DKlkaj54FU1XJ=E1?oqBX3gc34pwpwa@Bkc1GH3hhiESg3D<)IYXjw~7>lc2|6 zFnni4tAAT8zE}n=&^%5`Kfskptz-5vqdc-i2{iVAt_piB%>ag z0GGfY&Ozj4bb~CXd=OZGH59&|396wNeb~z9rUw zT&&dqnNOnbz*|_)0KHzw=s7Fdo^Fj?eg3nOZ)}29)=AUq`C8{3LB4O575)o*pyq-c zg%PGZ@JsTrDe#)fZ<7nT%ArlJh~#cOKojN`@*{aN8r*!cm{$O&o zwquPJQM_XF24mVh#{tCCUo0IMI051QBlzjX(v}9_5W0+nIHx}ONW){sx&s)1ty|T zk9U|rAYvw1Ub+YZY(4lxlc4Q}EPY_I*U&xjRbk+ZlB2ce;NMlu$DEcPK<(s z?w6}N+Zli4bWK$ij+^^^&F);QL;i(vHkK<*Bty@dU^Ky+=0bN>3D+nKi*E!**8t1P zF&l~NVIW5fInYD(hz-8#uvP-I&XZF%(8EHe)|zXn&J3Q5kdy<5eCuVQb+CThVG5VJlk^$qw8oy)$8!jQ$NNyCtB~_{awvaxdik8|)0o zILWb|DvF^+5aL3N1{8!wO;FDs;$z&p>v;1-Y5M8MrtA}K#Ng5d}Dlm+8!`VADPqk?EPsSwXG>8KmU1gH_;#S za94~thM$R%C#t;NkNFcVQ_-wT2C9Kq0Mj8=zQ+wQ0;s%6Yo?%u_nkd~gFV(vaT{Jq zKDl`X*uRCv#PAQ2>I3-l7;&ms4qVWK3u455$-{xOdvI2aIO|Ps_aLxuVCNam)#b6R z!wJ99aV>CB)OmbnAG6B}Dje*WGpRWhT3;%jLLJ zhOHAwvvhaSUAXQLJ-oQW^;*D5&^!yU@>OY?`rjr+p?E0n-uFKPW%sC$%+7!QulfIf z|KIcbn?&dMeH_!oEP?M%hpL)}a36;W@S463V+(fpxv$9eDdM#fz>@BSj#G|*RL8?w z!EX<;R#t^-nBn+fW}obM%ao+N*w^I96h3lh(gvyT5_4jMB!8jQEVpjc#wWF;eq8)& z=#adb7AdqWuo6|=ajaevG*H2MYpGLScHY~r4~Nm8aKnMv`f2fAX_%v!$m*Nq$5Z&L z1Ja!zUMehDQ>4xgIyFoA3p=uV2d2kMw`fw$$z9({BoMN4 z)Z@ud2b!N?;D&5S=-DH%3rmBe`cGO#^ISLiZP-2~J&m`L6GQ1HA%Z*|wnyULGJH-5 z`87k{rt0sSmOlZhHuK4k`t4JkctaF4a26 z_hoBzuvG4IJRiPOFfCMKdD_xeO=73o(t-*aLGN6umv38^d{`m$LRsI$EQOvE4%^vG z--9}k-&W^+%@6B(Ym`<(L?EbBLxIVM`#Y0QgQUvi7U{}U9@d);bo6U?IM+pFmFuz~ z#$!|O5u&s50uL)qU=J)Tk}uTdV2jT5bz13Rv3_e3&K^-iUY$tQchE>a(T!Q7Xb4m} z%iHEZQ%Pnlq6JaGFMEb71uyiFEH;?P22b7?7QVZ%n6h<*qOT?(ocI-EKZ6OK77x~A z?jMlP8T#c|5kA>5h+fS6^G4y5>? z4y>La-ukfK0LBi4lI{zEL@oP7U0OSJcQQQ|Sm& zeZ$9tMrokUXm^Z-NdWyvV8ni($Os+{fw-h|)7)oDQ{4-I&xD=h1AQR^55 z6FC}HYKwDe9SHBa@38JpYbaUR#Ziz(c?AJ+=o_b|^ z$gdVE$U}csRdCHhDh?l{52O)~iG6(O4VI5-;(iE8j)<3dsyR@L*b&wtP|HZl3qV3z zo$gRvQzop39e-frK~tKBiAkS_T72WHn<5t>+WQaf-t~S%HBg!3t9@~0Ql8~k}`(m*pPDeQ#ZU6O9I37q43=n@yHMQ?`DK7at!bR{Ax)xO9btTp)C zrZi1Q1XLmgx9xw<(`I1EMveVm@f5kNE9QW`;k%_3WSVxBcxGP|lho3)2UtXMJiN-4 z*pl01v*n8Ch@>kha2K~r7}vGo1epT`Db zPsN^z6+acbv$7Fmlp_NXjM&e9%60>g;>ZZpazfhUE8-5uHP zQeW8tYrQ;PDb6VEA$T1|Q8oVoA{*|s~n+re!s~BZ%e^A2!6HtteX|+0^0Fdp$SgZ4Ki(O|t zER1eUDYvXf7Ad9Kt^J>go&D!4Hy-Oh2Wz5>fuUn53j*qPw(NtB_c~8>o>c$-JuI64 z>h|q&qrzzahgFUY@C1Gee#ztgiz*x$IPHM9EU!=>X#Hy|$WJnYZvm~m31B*H#!K#` z(;IF}KHLb|v*9+o3EK%ypiMq3Ep141nqP9~qw#rP8+4{^bq+u1LVyoq?oZslCN(T_sKm?G0dPO z%GNdmJ0O*Q8QBzOfH`cKk=tm?CCMD94d_!kBl}F^xk-O7#cw^Sx+(XNqYs?MLa_#8?TiI2CGZoiSmC6O&Q23IVVm-M#LXLq=XOF^BBG)zKgOFV#_tDd0pr-|gwlpJw zZUfn=lQ?zFC|_Amo)6on5;#VFAGVL)InI?hP&zQdZYE|*jBWa`!;Iw~Fi3%gZdhrQ z_14ta0jpeFTh_YU@maLM)z$)AgW2uc6*^QWfpbx66$feDAAZYYXZzd1AoLN~HmSd3 zD!t@Ux@Mf~bO3K*HTc=-vjojU_01=?Kv9BWmC!p(`(X!bs zA0=+xV3E{Z`%3a*@@N#L*fFI8z!!(l6q%Jz{ofud9cSn8mr^5qB_n*YT#?G?Q50u;(=dqtyMQl2_?7+2F6-mqT zo!OdZ?bdxU%uvtYO1kx1ZQ(6jCafuxULXJe|KBlw#)QkU?~I4riF9api65yN6a*Ue zt3yWzSg{3Q>z+ORov>Moq`ZUcbfkNHk-AM`E&+B=kxPKGx7KBKW{G}jo* z?XFUb)y1&f_i^(iZk}>M$$atTpW^zr!>?=m(@FlC$~Mx8WW)sM4WQs+h`g#zrh`&^ zcV2#Au6rptJZ24V0LC)Bn%6e0-X*5&a2HXf>mO-k76S?no8w%i8IZ^8;%GM-K6=G6 z@+&QQ+UVb2MM}~NS3&qJhV%h?#J014J5^V~M8)^nGYtthd-p69-xWX28mcGmC_aK* zFy!!K>*Y}?>Xfu(NJBae=gx{}O4~<)+bT_X+d}r;`x|WJEra-JX*Z+_Z^_o3!pLfu{@h2S{Es}tY?PrFE#hAOI0yRc@# zlDX<>8|TQF;$mJf`ma=ypU(wGX`h+A8QO81%R9vtGEZ@-TP%KJ?aPXc=I?N1K(`Vi zX+O+ny7qJD`ma@v@XxO*N#a~Mk(_yBM2pLf>sZm^ar^&KIl^nDZ|ZhdlAEbkXVz#4 zZ*8!S5v9_z@nr|Z6MOZ?$nB%c+R6qyf=QQ4TK@^i(o8gtC<%5LeghNX$qhZC`R*#w za!-}jxg_d*w2I*A!2cV7?#cRBg~sFelrwy;gAMSy@yU%5^b znIM553{mD3OL!9>QHP)SD_7*Mo z`SiuYQzaRfYolJ_rvQH2U8`toqo|rD=%MGz^GVg%BDqu1op~czG>J9JbHeBdzTVcz z;wV+;v!rtS+(MLEO&h#1Ir#GAChe_ia`4sB6t4EYt;*Of1~i(fj7XBl7NKO1VQPyo z>DxJsQ5I&{Mlmr(@{=Q>o_g|k_fv%>9Tp6^Pm|ja&L!ha1)&xpwt&h!W9fh%b6y_yU)U7vF)OILGIfb2 z(rL!2(=3lELNU3@AyRlSx{rGsT#dsJ!Dch^1b`hs;%C{wR1bOJQt?sE0>WHs<1Tm@N?OTX_$mp0 z^Q>fZn#Z|pr5R|-Co5NmkFq72U2a=x9B$+(wt2XDCfer2<@}R2IM&<@5Zg)}_z(Yj z5f;`D!tf9-jx!{Oa~mf0>?x?ks&U}tlLS*@YmV7q?Xz6)tk};YjzylmxXK|_j0(tBrNYjdR z1oF^D$YEhJG7`vwi;5=`z*d@97FKc-$c&3?D44A+O!h_KsB19R zWm9+3g5EmC$|E0MfELs^h8(?+i{qusOwUvf7(jP#xC=0*-rrv#j|DpxuR|+AQ-v4% z^_9z;n4gr#t!Dfat4YO$mG)6&U=GIn4eO7q3|^i?qHd+$L5XIK;DHIkmIC$}O|a^qH-5+!G^AeW5f0fu~LTxC4X zrz(iavW~L;^oh@C8iKkcFG%*URpi%mkR3B=udb`x9?{WlH~HVLl8yeis${L-Uqx2T z3GOsDA{!((>2u$1cfp3Uxc<%U|EeOGItQGBb2UXjw4Y&)&YmCe3%aR?1&f>1=>Y|% zVOm?9f$U*OIU{G%YAmYB?^DBMzkV|o>#kBsOCICW47|m$fDx|ICn)|j{dWEoS;NTP zT)x>5&S%#cxP`QJ?e*VMiq$2&=7Pim4r@9WVgC5gK9 zB*Bp77)lb@EXw8vAs2pOy zvZ;+}yLMdPUbnGd%-G?kC`t&vVy%B?MR4BT*fBpUT6VapRK4qNYNnKRC=|hIILdQ# z1L;bmVv2XrnVM1idckm)Qc_Fv^w;W^Ql(*S`aD6KB~PxWfnYL8&+F^z5u5^ZPoKy4 zkrab)jXs(pR(7dE&!SpvLhS~_rNTK&a?=Ei~1u~CbiIm~iM(!;`5^iWGjhf`HqtQ}8yScusHR*CA zS6_AjIbm=W8R$v4TjlP(cVzPSEEbX##tB!5s>BxIG1&`jv45&Z&GCr7CC4L@g6IAD zmBgMTXD;7)z4FcQ3X+qIbPy(UpN2uk;!69+-)4ZUxHaoz)qf^^P-=`*vl^N{VsnqE zvzw!`sYPrizk0Ed=Zx#F72~$KQBEeYLRJ$KtE{cwzr8|Eb>c~r<|z=%0tg9VoOo&Y-Xh)uBcrI9AY_RPDB?0ZxxE9kILss3O z5@z~qs)R{3(!0kL-{*Q=@V42?nN*SIrV)h0wbSt=QmeY|G7zG(FxH)!xSDXiAJ<44 zo6@?}?-xB{RWi3}Ce*8L5_db+#t31-W|C+|Qp!xU>?^Rnt0U4Hu1&B@DpsSMsPTTMhU{kZ$ab~}feIq9q>{~(R|NmbkTRAZNIspX#DWo&=?_VW#0XbI?edpJp(8v; zgF1zV6$l5c3cb%um#xrf)`7KP~W)=J*y{`keja%_dk;r+EvcKAZ%N%m>cm)@IzelHn?4~Sd*TMNC;E{+v1|pW zkSrZA9&AfIQYvfap0O{;UABT`pIwC(h_XBEfW=s7^!I@mTUl7(2`?U++gdEsG(wjW z*CaE~8r+2i#Rh}_%BJ8{eVw&k4^v@Pp~U6B*s@p+oYRybv9-W35|KnvJl`{nUrTBU zo-*EYW@Bz<^0AABU#bUo42n^BX-Fs{<%47_E2#?NPmD$ClcPhzBI4x~6;YVjIFBTM zQhb`c-B10OCaP@ev19U7>Q0_QegukWoJ-7~6ptm_lqxf66=V!CWX)ZYfBI`sa;|>d zxCHJcLO!;e%Ppy|fwO~6WmU-^`_n4r<766R@4`rFr2XUKe~}fpj+DyCZ~5m}%74E_ zt-XH;YVAbuq5NS^lK_fUwA+}Wl{|-IoZK>~1_?yVw>F87nkC1#eOIQ|m0PcGZ%EsP zEbvfcHp%+fe%cIJjQ@HiO@OPN5s!3Yg7C`qB@)Etjr92tnKSub2-0qdPC4Bq!A`En zBew3`0KJYbdk2heuZI5Cq727P`m->E;1nbDOSuhE%kstJ@J2ve=-ERFvF9N$@M^pEgp!pIo+h0##QfVz&I0xDq5*O*;I-=G9OHYGeL z^ut}cn#I$9oU)%QTg?&!mnFhU?{Z|och4KC3tj_b$}Qz$JqPFZ^AStS^~5$Le3hLz z=(xuAwX$>_UzU~gmGk%*&!NG&muF2nme{&^WX|ID89Q0N&Xisj~{6G}yUD-6+?;J-X{wI)$SB++*OS=<}((wk0UepK^ z#E%eQ%%$m05i}$ae`kT*QxN>>16qsa$Luh=Oq|I@4MP7fDuN+~v}x!gjbI_OneUpO zP}4qT!pF?F5EY|ndN>zKD>BhWwG8C!hQ2?+uQUE>^wXY))8XF#D9p7TKw*(et>zD?7|hL z)>nLt{}mr}AtV|uQ1zUWj8}ZKX9y`xFKqSYR=0D@LCd}s`0;qP5!QY_y)CRJTaABg z;Ufb;95@(p5J{tB{Wmws#^7_Ohw-1*;E7|TL^C4#6}}$=WY-E@uYxFQM!tJ4b!UNY z#L(X5y|u`I=i>LLAqxDktq<=&wTsio@fpKTB(1|uabtV(VcHKM1!8}F`ZNgVgK|H_ zdhaqZR8I~L(t}=)Pgx2*?TbPQ39^hjQK6&!d0P2K=%{=Ol|L$^m0um?Bg^#J^=0}{ zYp7Mef(p^7Ny|d5w0d9YXnKb5!&IHX)nnqVT2g)^J)PH~hp09^A{xN)MlkrcLw@rC zC;;5DeUCC!N0>yOzQK>9#0|w`8b6h`K}Xz@hJ-@-sX7ur$VZ(2n%2Bpmvio@{6(Ss zaC$nRV7(;qMtX)az$gsR4zO?pBNya1@7Rv+%?8!wN`I2smV9 zAE!s5<@3T6Ee=&W#^2FKOsW`jf@Y`U%mKLS;%;93fM>8H?IY5!x})Dzgm;P@F^q&BcR zrVS1gg@e&3ir91h(PeqWG~}yvuS)DKWKW7c3VS-Al2cEj2Y6$S%A&f-o7b_WXbT*x z-eCsMOrJ6QgN(aA4DfwtNm9!OT^6RPDbtAEUm8NCB!*GXt5WVFv(3K)Szb57gI@*XRE1lv zs&EySOg?e3aKF>sUt69sSX*wnUb}2L$Q;jjOL}-^pbgxL6O7bT-%=r3 z4pjIXDoE5+*dUqw#l?JpEbsI0t{^uOOz3R0Uu_F|lKi}^Rn7hn5NRgjl4 z4kZ=(&9R$CeE-Z0GE|L-r0;%pES`4R*9mS)d$oz?+pBD%#aiW$uOg2o7$mF~{JP|W zPVuANHmBug<>F@}ab>D_JuccRu>;t9!&IA?(plmER|T1v0EcL21w+@c(S)oGh*DA< zCNFowefQHadFbl^Xre24@3`c{ez}4KheP#>-WtL8FOihb9Etr~{#@(D--3utlW?!t=7vuFsdoh}F z5>o+|i5H@qV|_`N%RxDzR)Aq+eJ~~8NDxyd)FfYS9rTVgU8fVI8 zpLm}(rO%TX64z;+7)o3hA%>h8n|=FV_9ot#d!$$+o`lecS3*P~hSWpR8y<_kWxlJg zo#m&LX5dBn$<8>70*IWzMEueaVTOzgLdSVcZ%uF~Lno>eCcib$ zX<1QymnFBlWm<4nn};le2o))=hN;cdb_R>jpY zYnj!l6ZIIU>_JVQ72jEUHvzK}L#1t6WfBmG_%1W1f`URr;7!Oboy*lPd zkQ&M<-Id2GNd)7#!Ky?;$678P53H<7?xLUM5sc;Il z-lH`PyyR)Pd10*gk(xkiP4lBQz~_Jv(~Z1IslOD)*{L0m)HpJ@YO2t4)u<^)I4#?1 zNb;2A7CN|;pO@UyoT@a1jdCwMtATg6hy$++#@7+t0%T{J*d92vW%ypl$T7J8*T_AB zUz)@gbpX@U7QouMYBVZZGkm<;I6QHJ28L6h`1yeQnIErC99-C7!+?nUF=&F%#|#2U zDeLB*Tt8Xt7eB&lD4hzXrF9Jp>gwunx&~zSI|umj5^05w`Z$^x`Wcjk;z1znz($h8 zf!yjmd@jZu?Zr#xJb$}*g#2~Lxiz;svBxTocWzyw{K(fjw-&0uBIJ_>k*KIa2{vos z3243x;3^tK_K(eft%9(Vp^)K3>7HepOh{eXZTuW~>71)1Qe!^~f;b#H^8S@~V;+umOCN76XS-{*pfGG@5GppiQR{jTOV7j?Ch$gAX& zZusf}!&nalrmihp!;Bd5#gqJPu92IkCi$;akhPQ4kFPz?7PAu6orKUKA%MAH2-^1; z@_mGq^n#0&b(8FiByrNn@G&F9my!jj5`$^~>^zxxCAg*=U`%_Aq5^UbU~XAS(Hx|N z!+eDQ_YB$E9h}!qAJgOobG+j`>tA0f-yS^HL)Ib+ImaF;=xM@_l+=YkI13k&S`f@R z=Kn!uprX=vTF?ews$4D}+YJ%)he@T9Uc7H5;HvFlz7mN;4>r3=(4uMR5dI__7HS(G zLwm{p>qUt$taHoJV9($di&=Ox%~XF4RQ5 zVp>nox`C`|b^9|b2PGP}A!8XToGl2~PpI;9Rm3AFu3_JUmtA51I89{-lKPsa{}9s!w#e)Db$NVo9`9I}Z=%aL+U4u>`1ZSz z{O9$%y|;P1Z@aw-9`6Sp?>@J8ipP6=oA*PHmvi}^_4q#V_|AB|zx8-8czmCEeCIvh zlOFFDxAzsdcTTl$j0>rJ-qRlMM;`Af4+SwD_aO7nJJI8tpr@;2_8hv`4)VEDVrb?LuB zGGign(FgKmd^9TSe>Y$wY@=NfwlS{$gVWdZCO0DE=*CWw9EJy{nxY z4Xi+0mQK@_#V};1$?*aU|42hxD%b25%#I~GO>>J|c@}MQzM!GfavWTmr~t?GU+_SK zIvnYZ*g3|9^vPIC;EKM3c;)NbcpL$Q7A`B>guNlxBd`&|*H|g6l98b(QlpEZdvwa9 zBS|{4hzY(5aIn@NS>a4caEU2iH_5UD<0Yk{kaa7jS;O2Kd*9EIt6H_zsN@!vWWBNI zq00kz=G#*|_!JTe8JsC`9*M3k!@rt**@>s>%+^NO%P6^&(g|K6f5-Z7akDfJ?-e&I zm(UAC-DwQmY1F50**VqY7)pb@&5TT#xz@XyhNpkdy2#5xH#pGJFx7J>V{7gVH!5&Wt!uAk9tWFB}=5GyZ2p-~cIrrfnGv>|iw$;#h|KV>J2HClNUxT~WAbCsek_UC+TT_CLaQFs7_Z)eb`v}r zK7tN#DVE&(1(6u_iHS6^cJzbx>NqA618?a>56zt}VFWK7f(hP>Ay7u+KV3L-lduW6 zy>&rH8|iY+{x?_G9u`Fv#b@?0y9)@2LTZUnxMtb}JqU2yAQbYe6eM7QfS&*K{&r`w z&#b2Q%XV4mT|4!`7QHnqDk{=4bp^CC#fr+x2U6X2dRpOvwcGFBS=9QJow;}JJ@?MJ zk8|%izjKGO^EYx$jNC!sW6apMLFt4VkaB@sC>-kmUxc{GRdG_npU`*#5T*@CtQ2o@ z=%2`2v7QW8b=hbg30FY`6l1^dViEwVj^kWp3OOJ)(CAp_^E~8hz8~lN-X7}Z>Jd22 zpY>hHpSmx^lnKhP;>%hQk_r{)5E|sH^;bR|xxqyC?>nJ`k$0yAkR6U5M)DBH7>qjA z{Dc2Ao}xAaS<^e_4$7%yKj2PZgWK29ScV;92h+M=1t_Chajwu?aSw_*+5b_%IlZHM z27`Sae$4_0W>mdw?niW;F}=f&zXc!yv}zzhG+ld;k&r+_Kqc;>#nTNmx;2_cjy{vt zL2M=oZZ6Y1$i)UAJ)z!ZwHUC>;AX{z=^c#SU0;TbxOW48&PypI+aM1?%7>`7_C9!t zWrhOaPXK&UoS&n(f}Z)np&r5UVp zIS~fPg35J zbuVqvjh%Xnem@z?F^mf6DnM{Y?q8l?V+gkw{ty~4C36D{4I4XGUt#KBXi0|_=2ENg z(xljC-=#wDQqu+l_Q$bLi9D5g17p1ct*5lW2Lalf1Myjs)qWEWIL&(CCMe0W9=u8Z z%D1n^m%aL?o>F9`imKH&VeJCJvHB(}G*4QuH7@n|##!cNy&@}MJ1Zh%Y9phTtW#sM z32qxq=kj*To?vkoF{{aH`5A7#r z@p}`$XGz9N?e}m2<}G`XS$ev<4#3j}$wp5|Jp5XNb|?&edKD2kSBYTl2!ny4V}sxc zj=TkT4wF1x@7oz{P-D(QPs-zIU*j@K3~>JAqsWKN5{@fk!{cH2_*?bAt`G`_RH`}08)S=26AXJDEN|?EKyQF#}6we zPjO-jmu8adjq)_Tf|J(^50M|!2GILCE{0bLqo+aBc0Wej!9U`{mmxjt)Pmjm=q<(Q zg_+4y6se9E?7n{x3Pn1{pfBFHNw(dGV+Uw}!%D}Wbugrl%Ve6%eHX=e%?QukEWxko zq>v&_rI#Ezi47`w)nduJ{?Ug?V;UU*Izum}m7!zjoIvV93_uXwX4@s@G9NT3%|KQM zi&@Loe;-1SSqUQBqV$p&8EgWNyd8~n#qv^Cq*vuxvD9+qnXuZj3RpDYvMEemIN)vu z@rc#IhBA)qgQ8`a3a)8*jK*8dQJ0SoM>{6Op04Apig#`7ObEZW)IA|407pBX`2hIz zoX~880a9-Y0P1PFoVCUv8{jc1oNLJ0zl$UZCoW&uj4S8SdTp0yBIEP`ZG8BL&wlCm%Gg%zr={3c(frmCeNS#)OX;xXmjnvsU(=eK=^p7y zN)zRe4w$4LXckm}Hr^#~iAASKi&$MGy%sPaoI=zyE4{F^03Q{|b86H9-X3h&)V8u)djmZ!z^3sI~m z-r|nk>#1gv?+?h+s@N)+%;URDh@E#GOG7gENdlS5uhVXyAbRFLhbY@(!Wc^tM~^Zp zJE;*Q9~Z?5jh$@L@-(>z!gvgQ-Oyv`zVHltH00J+9XM!Pb%6A7s}2kw!OaZ^z&IfB<;{HsTHYrSl+73Yf`iUeQ<597hSJ+15C%6}k+ZX0@*? zw8_B4M&^uQIUdO!S<>1$7G9!ND?52?NEC9*{t8mDSDHi?fnXWOHZSLbfi~>(Sm0AK zk0VR=3iZ{g7G~mQX`n($zUTY+hq|e^uc6g~^sU%qt}Tn9l3^%U`+^(?J?&Ce^xLcP zQ&^+^jc{)e&(`A^E<5zgM*Y&JHZ|k2T3zYD50{733l@;mZJrGHme$w&WXiw}VW#N#~Oan>;NMZzkVcH9HHGN!d%Z zlSQ8e5EnsIQu~8^IeEe6>05`ma&6-hkbOTW_FGW-?2m&evb_-W6+i?o!Y>ZdWMp_5 z%DPHEe?%-6dV`(}v8y*YxWBxdhjZ^NqHx+(>@|7V0rhmHI8ry{iUFFV%kQeO+J>^#5K1zi2=&buJu7NKr0={ z+87kuvNr{z_^9 zDb?P7i;etf^jLwR93CA5V%RV42sSi_?Qmbhthz`WT@+@VODEgn?rKr7_XmHi61%ns z=l&-0!a&f4>TK5woh<^ZQIaUu2Hk|+dm(I>_E8Hjr%u$x4D=DIOlxH1T+wj7J#e>4 z^gA~O?S3-|@4$7D!R3IO%_R1Q1@W^&M+cw%3}8IEVTcp^G&4F~7giReB`{!x{e)7WEdBNFw8 z*1b+-K8fBr#vj(JiN{HiQ0+E76Zw7M_~&;@RdUh6`vJ=|yJkNEq@DV+Z^ z|2C4zkqnOCGkG&f0~L5^6s3T<$3cyN$(ah{D$O%Wg0#KtU60y;8yWVd$e|4^wOcA!Kx(dFNfkNUzTi@$djS$HxE%h%2w9e&>CQvQynMEH3VphA=H2Y+ z%1rw7?zELOWWL+d&D-1Zw3%=_f^M>#abDnPAxS6nq8b0RfFa=yy=JnZGu(Nrf%;iH z@&SS?UOqZMKa7q?hXU$pwog(44etXiU&TTMil%z zE6fT-w!Q7Tc(=hG$ox+Qp8Ol#7!0mmR`;fXw)Qh7%$%pjScR<8B+QSqFyhfauGXfo z$aE)V*VK`r~O}z=9b728uT*@*m!j3$Oyr9|ha>Zd?S=K&^_kzkbMidO4Gr@Wkr6-?ms z<;DFAI^I!PcTq~hpNihNKA3}u=w0vl=hxPL+oZ{ zz$oWPS>7)LL&|!JNlI~~NLEvd`%TBR<*)g+B$)rauRp>3r)V?WMeiQ+^`S&-oa`La z9%a*71x86!Y+D#h$#L8YZeAr#aoi-&SaK{X!*P|I%&O0e{R?As(nAQvYQI(0*NFk= zKu~X>DWsW`Ph(<$Z=us;tLD_NOmdw)A-U$d64NQryl75%5_=4l6_piQM0|ErkY=ca z9D6_5(&`%B3h$z-UUM8kB5K)b&u&xS1DD`mVJaVvmQmZ>vWZ!4D(^l+^ujP9_s>rCYzJ8$R*g5>PsK#XLbc9Jv^rI(IqGt zOUAjF>1M-Y(_nCC7kq;w;efz3*_C2W!gnw1ZMJfI2}I;@)G-OQ0tg2lIl&w@Pw&GL z{9G)-^Bwcye47K!EPmkBR#CJGlOibc?o3MJGULJI4MvU;vVc$y2r-th#ZzMCm4i$_ zwu?K1#hNtDah9AhRwcGo#>vrfw;2=CpX07@G>rIhmbw%G;~L1bFyz^ss%)6XYK4N) z2lghuLSp;I(hR%SESHpr`D1es9X}it`*26G$mtY`T(Xc~PS4SU9MhTrLnifqeGIYj zF|6j1hA#$$+$Yhb0=@Da?0T^5!(K^01akhHgypjCJ^P`m( zlO*_;8vIL54a0{TsuU+qY>;4yKj&%wLyDVyWv#2#AM^iF?Y)~GfEc{&&P&>52pg+h&p4FV_(;G{?km!qn~bRCGYM9I7dr9!EFiOkI4P121+s*V#(WF z0~IeqJ%D+e3*xV_9vrP+yh!@|8=Tf?dA>_n^B~z#^o%QL~Jp zeYDY?spM!JZr}A)3?oAQvlqKs!&K7D@`4F*X&SZ3C0BKQtKzUi)uox}#j{YG&fY*0 z=m64eV$pfBNyM#pfL7xq`p9fwVAhP{0<)C7STf^*_WhVPnZAPo?s~>M4f#LQ^BmEC zRE`>_YwLw&{vH18&sAUH*DCoc210XyPcW0y>Eb`YyQen78^h8HKQjc)%?(ZXLK(hZ zkUAE&v^ILTTE}Qd34j2&g=}`3?Pkt1N%wcjAHmy?QBF!WI0fSKb)5DyZ9;l#y#de! zd78Z~6M8YLJ{F-o%3KTe6B4vJM+^$-{5qC|ygPbt)19Z*rukPZHA8qXR*n^s#*UX1&9 z07Bo#Jwm1&> z^j^RL2Z0l$+!pv&@XPtJ%1SK)gXx399<|_`M;|#-xL19Y{&>f2x0#hK=W9k~Oa8Jl zY#&T81>kEW6oWrzL5qzgQ;YW9Ul- z+wtOu(0PDw(@R<~y3mp)Teq$>kc1m0-t)No02W9`i}dT$j~)5afV#O1A7~0$a#BF8M(1Si(*1n zUre$?`inDpe-xQKBGUAw$$$Mj-HKScu@sm{!Dm4qlLg5{_CiK|O!Q{uc7!{8Nl3Y> zL|xHegLh2RSDg!qCKtSK*Or9-%s+s5&Q52us3$9Ccz7n;mxvgm4SbU~_`TzEYeVB= zuSm8p*MjXr^Iy9E=i1N^1Oc(d5DQKKokNP?SZ%3R>!JaDY|wp;HxK-#6CKSfQo4g0 zoX{`90u-x$&z$PrZc~A3>90Q*aGTJkhJH{sb#`tUI|~`ql7IvYnzTCzy3bTSLXs$2 z6bhCAN5@T7ujXlRlaQ+n_h;$UJO8;))SE8cr=g58Uxs+3WbhHSNONM{haIV#1;gJ! z9?g4LcTgzN2?fV0%iV@pJwT58?nTn}yLHO5xGRW2opru^60TV9IiQB3BwExR9L)A& zQFy&~7*1M2naK@qgUhmnxKfvr&38f?^`R{L)3#GeRG+Rb``#N30o~8L*Ss$t|$<-drjUXb#7mcInWX~h?9@@b3lN>R9nL@g-F}$4k+QgLTLOc zWKsM23G6&1hQPOfdgBMy&lb|t?{I~w2tu5030C` z>rF&5Veb-&VlPpt)C9kv;*!|}PZ7fu+2ArkMhVWza2mA;0mTswpcW^hR(&Ker4Z3w zKraq!xBUpfRAPN06ZB_nIep+zy z=^2Ytks)@Vd;7x=+Y?c?IMb^3Hfn69pgdg6e~<6-*N#KSemXDg`t-m3bJv-Xv9 zA$Ys18kkLRF8f-4*x992D*_uKlMTmkJj~M7k}@WVsC&#q}V_Z!~DHof9M)b zelq`18PEnb5a3IcMT|#!9mfhV&5aQWM(pt26ZKi0ow)l@1hX63v`gI+QPjphEEd+PYx`c-Oxysz5vuAx6nDI_ zd2;ksNOn4+qHu%ecsQbi26>?21v?y&tL_ED96E{met(Z{U(cDn0(NgxuUgSplPbi% z>5k4-VP(gGRpJCq+R+9Nn0xbqDLdK=1b43hkF{cC5qqXG#tyQvBy<#~T$o4jN@a&4 z9&X1Uq;VW=5pd>4S`br+4V|&aWO6QAtSMlXF577aUbNOI@feySEl1PKt7g`>fO}jp z2%Et@8U^#`?CLtzy!fd4NhkQ9h5lpUp6_U06=E3M@Tm$bQEu9HUOHkpi;wnkNtO&G zOX6glWG2Ouowy}JZjgqM2c<;vjFd#)kdnzx=~wAHDJ1ntzrpvrG@6`}T;vbwdU9Ht zPtHhw@|W}yIVZhE!csfwl}?a8sh{*qltv^QjY?Cgjx3;h@;H^qN=nIll#!3AO!iPC z>7pibf?7zF#t|!vCz&jP6fi5f7xE%rmO`Flsbm{VBkgP`In0KUZkA5^SO$@KCQ0X6 zWHPsrc|4me;5o#{N06mFm(=o+_>Cej@I11b=ac98XtIirAuD+Sd6thQK|T(@%gKw} zLDq05S<9~=>-l)HfftgE{7UjRFCy>q3FLD=k?iBe95cw)%kzK?rPbH~xDan!D zWQ;tGTq#e-PSdsI4!MjxESHlv#2to;4- zF^_ID=F`(g7oBICOt+h+&{T63ebf9f{lxqTy~Xk<-D!D@j*DAD7sNeIyW*D8iuhVu zAKysh5?-UL6V}mf30vs|>xVRG{fMR|w$ghN+o&#SFRe)0N7pB{)6C@kbWQS?H1Dzl zbn9guG-1eB^pzn;XlTgq)Sg1vycEiIq%bx-HI2%@usLa&Y;{@| z`y$Q8PNrqEdxjRUcZXiXP7N(#reRaroMAVyv%_v?*QMXW+S2c5i5c_R)Qlx;SH^RU zX1>8jWo~ERWVW;1to>|BRyPY}oneJGnXk1O`7v7tpOl@+mu5RS&2jS?In(&-In(*E zoNM{K;blBJyqw=PqJp=LsODpHXY+Nrb9nm5+xWtf5AZmfhbqA|$-;*_m%=SL)&W&KZgk%wir*%p#FQ z{gX(JcQNr0aZ?)lxj`g_;oB_j!w}xFDn@=L;zWSjC>(ze0K)S`` zQaCS6&k>5>KIpQovH% z`a^EWr&&K6sPhqmN+ln+`|S@OOlmOG@(Xh^KZI?82n{`BG8vT_0wIkXCmEpwTw9C~ zc>ccHG_SSHGne6Ps(X~JNMNDvj8S*z5Iqr4aZ)PQz!;hqJAh6HSPDaw(gqMI9o`L; zT8c3&gAx*FH^)jPT-R7v$+hmL*Ll}PB_ZX7gT2Go%pz7E8{h}^IO_p-4xrA&L0qRvA+jRXgD?F_ zoTpE_c>%GSDVC23jYMv{nuVb`~cELQ=aie8t{)9Z9>>taiH2L^ekka!~A zai zBmpFyvdk1po5@7@vo-A3{kHQ)N9Ejhn-tCH;@P&l-qVHS$=+V=SQ6K6w0Sk9Wrh-) zp6uv@)!Dxzr|}1j)<*xO;NP)R;?z;@ae6Xo1VLjut)0eyDA3n*+TiNi2?iLtog}E? z^JeK#f6Pi*l*A6(vh-a5JPwlF*I*e(^j;&@6j!5Kds2J?$n>aeh}`9oy+TRtbfRXn!+z zh1Y&CqapDij&U9`#1}a{fDP`Tzxl)!ps3sZtV!%7UWYhx-|56LcjEx+W&}6z-I5TA zV!1;`Xp|j{eO%C^Qr3wakcD|J=YG|ao!FF2lPvlR8CQ9MZE@FK&`uHoC6x|@z~>y@ zqhCFa?d8FToBJ07hT35C)7SeRj91!fsJcSLin1K>m=RtMnOIZR4x3GUesWuXHn(IO z@sBo}3%r(o&KdZtPl-NJCg2NAWOs!PKiLgfM=nztCUX$LzCd}%12LDHNO{v##ItNt z9?3+ArcJk82B2JJHwDI}vo<~3`sLCC0N9A>sbI){!4jA#!I)GibwO%a?=6vzIz%@5 z`lFD7c8rSQlghd#e2fp{`2v5JU5Lwcn+Z*++}PoGjD(u1l5iAevd!Au@}1nIsWEf; z+lT{xGSZt?IG($)A#$8Y&E)t+z=rDX>YC9#h4}zm&ZUYFJXNMKfRWBLDXD&DDHhFb zV_974CGK=z6ah27mykcSPM$FZHeVq0^q_%;9_|>zq@emDL(<=i(us*=gFn>gNSHsq zifFL8S?z&TAU?*bu3!A$1(6(oQ+lX%drY)u3`s zqei0*cMTd)LHr>2MGyqPDgFchq0h{7lif`(8cT`k-t6q`?7W|_(*x^hxv^op))QNW zIWzSUvAnu@t<(_$$)_H~c`|_kCQobgC?|E|C&rW~IjE3^n%jory+pS;qX|L8Ed$5| zvoe+061(jT(rhO;fjo6wK2PiC8Aop>NB;S0V8r&=W|T$3yr>kcvL=JTJ`1R+dcEHL z0#^PEZshHiU<;WK%-Hc1{7ZAWYV;KF9W8YXh;YgDYiqqk{{5(CNd8*g5GfY(K`xaD zJS`-I(Z32eY!1vVQ_ZB=OFF=Yd~-OVrNRSGrCZ#B44qlCTV&8K)XQ!jp1&brSh>+f3Go*+{zJ%=Wv}zHvowr}s&p%A}_Oj7- zuExA21Nm+SRC*OPFRt#&qbu^!P@ZqP<>*7UD@-lOVU&Ke{JJ%X96a~hv`Xm{NNK^5 z>3CeYKX4%oG3hS0IPngq;YfCd5Y0u~2xdGtwX&Q6+ebQ+O;bFMf^KsTMcGGka)Nyn3C={Ce}P&LxzDX;6U zrdIBS0YCa%F=wr#=4KwQH?Q{U0=Ssrz$I@|X-ljc}f`=uK&cCdwLG>RIuGQeAhI zXR`?|&92t#AR5P&zJzhBAp+O}QSF{Jl_eyw)WuZXNGfi8uffz2rrCPjP1?)6^yS;r z5&ckfAGX~_UMaa#zpBhh?rroA9=LQ>OOg3LGq!mvG-RwxfLZat!+riR4J#RHc-i(F zs14nZbc7J!=HI`d;coHhf&jfxH_E>ug-i-nkhn%&=9$aPgBaei;)6Ma1f^myz=NfU z&;`HN>MmQ>$J}!kpp>*SKo8D6qe9T`xxPfv*rysO`5uMo^z)_D84Cclb6|zT_&X1mICVdiqKY&f&uj zAFi^4*=c6u$1v8zgRq3B(AR=N7RoPSw9U~t#ZrdpBnja+yY-;|g(8{No(&E+7iM#% z8yLOpDo<5nv-%#mZq(KASnR+>SAmG-(K9>}8}rsxq#lNW8AjGIawQ$S&=NLSkfn^s z5eM#0bI(l9PsIA>gLG14-xbY=`2F-b!aUZ%9wtLFb6(r8dmf|Ph9|?Jw(!uPlu;1M z<&3sQPLF3VW9$`y9oP9P#f^^IksK$*P_MdAi94J7mADftv6h11nnd*C{7^A;J4thG zb6FsG%Gozmf&sY#7;yeTM(I&MRk`uU!eV%b^52WPO00dk11 zK8L|pm_QTBf}sFy>at-1yzc8pa*=!!9K)u>-BJMriK|<=rCU8)nhY`bQuDwH*M>-s z{Q1zQMlz@rz<8}d0cJ<3k+aN*dF869kr8#>2pN24L^2KHn?~B~8k(>W*rFa!3R^zEM3!+CUYn_C)GUQ+qA4Ep^|i+G#8l_j zy}SUk7FQO>V?B8_Gk01STO0+GnN`8Jl_}*ZXiPK6Y;;f^NA{_BRdy;c4{7!yuQDU# z1hb~T4GJ3NWYhJFnb^UL?lhMoOKvUc;S?x~(XtG0f|IevI^3c8n`a=4Up=3|&mqQJ zce)7zI6GRKOxva{X3Uv196Z|<8W?NiU5`@joV)^xL~hH*3S?dib$E3PBP)iEjX9qw zjS4?yZ#<+wH7>`;f|;#ei;(iyXUFfcI8eoDQCU7>Sh&dU+!j^L_jjk-I;9N?cT&;< z(c%9us39<`+* zOaxdC3^iBw_Y%ks=Ehs0TiUqp`ps7Fp-VcQR;Q8NO&W#z+QGvx8c@NWQN?8RI1u;-;A-K6q%T*ndd5M$+DR2DlNNdOFs$ z@0TmtVs!r5G@43W<22thj!Ca1MF=EjU{(V7HmMEx)0foNo0i@-P#xPXcofj;? zW_wg(sQqh%Bc7%5UsX`+0b>wX1rh6dXGrIiYB6%=MAKr4;p&|`f6G&l?y{kr)TqFU zMSMKPD~`-M(@CMditu}*wRUZNlUq*Fn%p~&m>8F8HigZT#3 zw1cZi>_^mthm9O&OPMS&6D*PCPATt^j7`QDb1HZ%rC=6fea2RIbSobo%4EfE3cJn`9gF$4`z)yW}Wy1vrM@nT3UNHUm9{=hl1?R|~nOr$AFJal! zJ?<~|4_3ZEzs2nM^VLa%or3t6a&P-gInu4v(U6sz3}k>pZt-^q|MCUDj2QNZ;l5^U z6gYVJ?m30a%Me}XA2qDhp--O(+z0PFCzS4)fAkZWB3QK?K!(Y%?eO*)8<)Kow8<;WmoFYg zqj6|ko;>ykg^!|G>J6ep_NN2{ibo-WK~MxDXo5+w2w^fJaMyB`3`*G%2pN^wq*R2| z(j1VoaM+Fz(tJ^@=a3iD@^lf>6EYAoO34lx36n#1CNkns1VfeqMg|r$OF`b1T(Fj? zTm-pUG(^lo$V$jY$WF*1eN~s%GS@i?xd^!lc?fw4`3U*HSRq~72`HL?3K9wt3KNPD zic%=JQ0}#upy-MiDlTZ5H^qEiaVTB7IJAvtrG%hWfo&*BC`D*TC`~9sC`Twys6eRr z<5>;cmA=@wAri4GlMzGfxGYv}hH2VW2vwzKfn_n90_54`qiw5VHgyP)lraiwN?A2R zbwUk7O+u}Nd2Qge5`<95Zb(QWG$J%6G$Ax4G$S-8v>>!3w5Rw7l2P0v=*3#*?=aR5 z;w$qHI%@j|3AK?$1I2W4PHXAfx(?@UnMdm}daNF&$Lk4tqMpQ>xy-BdYEF0RU3xd? zC-g~uN}twe^jUpQpVt@kMb=(pe#}g!Hcb=AVdgY*nYqn8W?qwjrfb@)E5%&TtZz2p zyrbF4?9BNfb1`>HVJnpd#~? zU9E0bcdG|WLzyRAQ>>}hG;6vw!FPe8uiHrg)*PQ7Ha+c^ygp^&?_W8tpA^Tc&~HsZ^6QwsuH1 zDvVNTw>u>6TSmB04#)KOO4Yo)a~;L9Cur{=U8Tv}*in4w?g=FON~&_cHBzmWNuj+C zi8F@kT(g9uy>E3BdG|XcE(FH;3iTY49W$eB#bu7-{Tic>y@7=`EmhzATOFfeimFvC zpQAmeEl)IBrKmN<207Y0#qmU=eTuqMY__AlJz-z;{N9WXHL^ISzYAn6uCdusygg`c zD7?rq{m00hTX=*+@?06E3Ji5f4vz4lP(O#nxk3#oSj!>#;5T#CIP8#of}6e59(T0& zy=vS_bH*{6H8vMUE;x!;hGxzT*B!-;f%R0XUr`*WA4rwb0y9y;ih}tz31L>FT0oAYwlI|iTluf z?Y?k7x$oU`?m_pIyU#7L1cq^Uu^3o+3ENe32>?5zKYvXG7;TpHkUW^m_HlAY43S3C zx?`hO{Dz5n7S$G)eYtZ;n>s#rufzbvy%_UK$A|C5PWkw&>C>m*uK6YD(Q|yQIwfn@ zEP$k^q^G2(|A07-MI=2XJ^eG3E&=6?<@Wc4q^G2(q^G2(q^G2(|BpTcP)h>@6#xJL z2>>UH4_Qw4BwvY+1OQHX695VT003ieZEaz0WH&Bz%v)`5`!o=LT_nE42_)EH?V7IL zy73^=B;5*qB2C9LQP#R^M4OZ(-6-Po@Cv>ozq6e*9S;JrNvr<5y7`^Y_WAC7vHkym z-h0N+n{RwT)@U#=hjtC$bTqc?(S$B)23hfX9Yk~LMVUx8i2yyOD!Gp5j)<8aTD3ae z?Z|QM(X}}w&m6M2>N9>=UOz}Pnr`MnCa%b6oz~l@je4W`5>0i)eHcYybdQGGr}Ycj z5FI^09X#}-qj4f0!g!kkzdWsT3Th`zfPpTps`NF;!6a*-dm1&%;G1=CnxSHNC5Q za9&H_CGKkF$Q4-DI-X=4FAwb(nPqmN*Ih(tBA6cL^i8YkO;a9QVcnciqX`|gDH=t#u%)>NL7P_mwgr*7| z)a+`GTRhEgL<|}W7b@u3X!}(|DML| zhrdz^@h5jxqXsWN$$vG}uVl-EQsp$;-sz`^vw=lyEHKTd4tHZOu_@9KA*~Bud7SPg)Db!jciAv;UhjDloGT}%&k<76FVP%NZ8a}fBO74C%W z-o%_toI$7W*mSs>VKKWnt+(Vzs`%FH+Ou~~&cUfv+1s?J)#$FwiylV z77?KJv;;epQ*zLBeq)d1itc9#(U41)E(e-cHpneac zZ*7tOkj0yCOV)>4+UC`0u3)8AHdA0#o;R6fBdZ~EK2Jo7Ji5LlH;C>zwXfHgRr~y+ zwWK~mBhtvr{aME{ayg+je;}o$3hSsKPIm#e!F4 zSXTP66vpxf;Vg;Mc#*-@qeVDJei;TUMoPAC9aEVvfxQPTC)Yy7gm{;EQ*;_O@F3$zvXXw0*0}9?J%c#2REwVgXMX`u%QyI=RtY&@mGt z>&-W?s(j|V&crEZ2pR?fYD0#|d|NDn?F!!s;;-g`l9>>}0=ibmA8kaG*N1XJfOQpS zt>RSVAe765*x2nb@h2ikW=p>tCTTuY=$8q`alkSZcq!E^&@B@TLN#HFmB@-Vpi(9n zghV0WN8c5}Jhw3Dk_iT|$G=FzLO=srWP(xX5hNnmqtG4`3`3!=h=O&2LVF-UVI9|w z=i5%#oc8hU_HG@`0}U}jC$)wLCgt^^AP`_CT&#-E`_DpT&`@h*#U#2Va)?my@Ni7z zRz^hE_?8a`@}I+xxsI%>Kl=A|*)GN%(!L4BF(IS-q{{zl{&^LlCk?Ml@miWi-g(R% z6U=;>MOlVsf!Q;`^eYuG8!x7QUoL2x3)9O4X0YcP$EggQngz4Wgm||Lt_L6W9M_$W zJ^$9RypgNf;0hpMgCQy-L^z9QSYLfR$O6B!if2D4R=5Nc*v_8@sM!=BoC5@W7k?gQ znXw5k0Rbc8*O=dQ)JTyW%#v`E#fj#_oP&VxQk%uzRhn=W5MUg&o?uWn2(XT-=Y{J6 zgPuWvS*Z5}gLXlH*{nKNnA_`qC>f`u}H6T>raOxGWc9XD?YCJF)&J|Fa)&7Q{_EY4(-!_XQC zU>m_djOIG;(kL_s0@P7mm~6xhFBPf>x&pGWf*%S60e_eICu7IznSFlq@|*!(yQAs& zH3vXmJFKbeIz!JN+j$DphAl8bEQI_2H4E&43BpYtNc>wYkQEKX0zd#aWV}Lh34 zfC=KuYYwtJrd!?)-}$4cod2|8q)ZU`Uh~Ytx7Bp%Uc+0MASAzLt?So_ywmVxCe%Vq z;@B;7pu)!B$RI!wlFSvdHoSl(IS4-n0Vr3Op~xQNZ4=2$v#MN95aZXUDs5C+Y`pz8&%u zkM$aGh+@L{b(=Na57X>5+cb}%JnM)bOsM7XDCDFgLc)a8G`x?>obXu?aCT`FozQ5p zIN>T#EfXt!p4?8Rrb}91t)d zbl=3-yxguR$KVhkz!19~YvS|v;-4`hoHE)SYeIT|`E{FfmT!;gOc|r$?OOVPDaO-$ z&DNzNmlb8nu9A1%K-WRhb(Owjh}L|3U*HYkpuiDVQTqlqxDo|?1{f4D0;_W9N&z+j zf&y&kvIk-w20goAX@Lb4EC`#u?!?!*sfI5Ag97ew>(Y;@K-)k;fm+XQHB|aoL@O15|LHlrAIP$IHz5^;@w_ppYkYJ93|U>89wgqSlcUZ)RujSI#5 zh318KQ@o&zlZADNd?S`E49(9DtF=_Msje1@`#_#MV<1udxDxYwp_=>huxn?kp7o?T zWZleu;~jEeD(;@<&Vsv_G0YynyS^I3OhoVleYoH361;S)GtJ6yQ@W7FVlG1j=bsocP z$#P^J99_%TE)>LSe!>~4#1fHa=mnR#4hw=J-LDj1iuUo+^;n~-9Xy2d(JGaLc<;T+ zUgK0n{PSo(T8BqVcHxBjBp1>6Z$Ixd!!JZfMuR$EdCqas;ZqEdh<>R^b5iu*N+SqV z(t<2Y!nbiT0K1D8zYsfF_Uy3{WV&vM#l!a?H16uJN;YZ$r z(Bc|OoN@l&_(L6nEoX{OVYgLWmJPTJE<i)Xxi5DT9e+_j^971hKLEjm5K&)VeJPsZVqZJaX01fs_@s947)161Y7RP6`2wJ zAa0=jjue5U$H0TWtNn_3(UhNGw9NKO(SrazE_ihI^& zkSbk40;K|rd@qB1E>aXnRo2{|`*A6x93-tX0XFD#8_8>h*xDbP-c6xEZ05*bm$deN zNm(eDb&d2&9=v@y-u2Rk6l)Ycp=ldl!=B;3BEKYfcco$kk~8i_}~;L1FWT3sfl!5t#gF}?MrGwgj?O|#ufyrp*W zRXrV_NU%(~VzIB_@D4%L{IXW*VKvXucsAqRPnqpTx;l#TC2S|1>oHuxPX&8co)(uR z6T5Yki;ZFhDM5$A55;o5L};0)4q;Iigi)$HFKuNJ*Y?Vogwc$RU-cwj91M>Gfq?m! z7TlB`h5jjP#T&j%3?3yk*8`N~dlbE*QjWf$VCr0@86Y4p3J>CjeSBL_LO zKLyWn&>M|>+-v^I=gSUK&O|aaa|YAmGjrdDn>o62>uIl+df%AA^BfEkWZHg~1nE-D z6?UP8%HBA`(e(PpA2w> zPb0=tp}~xgku+LpsW-ee`#qaeK~rOA9HsCnvdoGGnic(j|DKALnUiKJv^3L~DE6zm zVkk5f#hIUCG4R#Wtm~JQ}|j2cZ^t4l%BiCd8XFNx8-JQ{r zz=!CCEG?=PMXmEz!Km(&OFq1oG>Vdbl3W+$`+mKY*+jOHmf2CwFxX1MhK`m$F3RD{ zi_%dvi=h&=%*r2I{1In#YLOiS>ZV^(x03gi7ErU@d43*hQ6RIF%MNDh<<$+bqL^56 zY4;_W8n^1RS25>4!^=1kO(uNp5YqB+rCMv<^&$n>jZNJyYRYwd-fg}>Ysm)E;{Bqy zf7;~K?4#!=Cn25cT48t`9t)KnVA`jnGn@jWXX6Z)A%{>#W7R}F=eh(IP%`l!)Q*YwyL`keTkn~0ETBE?$bu3i&bS#XH#p<0#mqnK2;v_a& zh^g?h3$Z!jl^(?$rY^?eU};mBfdJJN<&T!j=g@iNE)oK}FuUPkc>x~SwFz5*G|G%8 zY{FM)WP_-#mWQ|FOAcTBmqCu&pPJIg$?N{zO$Fv5+0t^v!-tD>lId1)8X7rCnE{`B zI_>_zoHqN0N@&MCbgm?vcR&lj0-}lH?Kn089e2)poSbb2JwrtW$5R}g!gJ6!2kIOV zayl@zkDd?0zUiG9*91_aqGpMfKZH+T8u2Z2O`yYneJYz9zCh+VyAFtsex^FLfje}r zGwi%!=d5|&509zWhVu@0oeRbHCQw*UM;_t_R)d#kTN1W7fM}g!X&$u)2$NvU17q4J zhO%EjHC6mo7{3+aLl)j~`~Px|LrXATovZdW92NMj4$6E_@H~0=F~1aHR{mLiacu+O9{1VSu~>c04df4(uI53_!h1nC^GtCwZ~tM? zxCh;RUuU79U?!&~-lL)8O@<&9e!NU(I6=izagETE7VsTkCR;GCAy=gN$ithOD;Ty` zD4DXG=5X<+S*8l|=9V0`vW>~H_aec`R2g2rhYC2`RojG%YR!T8s`mG*?8t+uGrU%x z^EhKiwh{{xc@`_d!5T2=Edx}Jtwnad2VXv*pF8bt*hfk|T{2V)n3QXawl|CmZ<89< zgE7mVd4hGJ)PVxJI4yqHJ`VMZ9^_Cfth`RBBnYseg>r$1RxD;#p2xYk9gWCMe-!5^ zRST>JVlCnR@Jk5nnZ?R}8TO;Fb=qT6i38v|AUBhm#$|>JtL$-4r`x$tqW1@*7K~sS zjISS*1bGQ##yEeAi&eey8kmRM0A@!7=f)LX$2GP^*6;Qv*`6nb*P4>q^c4xj9Yl{s z#6(WU1f19rBI0-7xru*`F#Ngh4kq9};j4Kcv~Z!5{?qXR9Zz~pQB#U+u-OJSz3;-~ zf_Z*LlyH9oGyhL7LAo~7PgeHu$Eye*GQ&Vj~h=J z20@_vdehsRi$vthYpQ&;UO2y<7AaepECh#?uWOJnPjLHD4)VAlV0aB$tSlVF1UA+y zJ_gxr9h5)*2`l$5yo~9A`&Y}^eUoJz3 zn#6-*^=aH-HM6oqxN8#KWLMD;5xb1BzUV2Pp;AE-V4Nd*3rF1oa1+kCR&}9p(;WlD z+IbTL1{7#4yT#h;o51B|Dvck`CnFDEJqT3z_ZxrS0mBI(7~9r)=LGFZC+RdAT8(?S zpmDWfOlEVbxF2~mPKWsdGq zVHMi|Eg6bIE2HKs*{2_2DyVEcn^&lAI!1vnCX>c`tZ$3 z*RWd#S@AhJ3a=s*Q$Ky(*yFS-mNZFMfaKcs#E$7AC=EjcJjfX>43V&98Sej0hA9z) z--n#1m>8t)-&n@vRxv-;e%i=d8BJhfuHZW(eq3q9IW`>6_9lfty7noW0hohHOg9z@ z^T4cD5lmuLgy?qWL8!7`7vAHXQx-~k9jhaqCLYdfAPP#rG7iTR{K(Wp43ooX3-> z$cIaR1sl{Hk@ z&>WTShxHl?@N+zIE&ig6w`5szGiJL^$et{dH9phE{Bje|uVt2!`p6&F%2(S$BAk>Y zE|DB=JDFGG!WHwWLpAElhh2&IWB>1(gf3!nJHlq{ONVXF$cNOPW;x2F?xV-n z+N*&{%oJuUBx(;S4t_n0sV!qrY+pSq;plc$j+2%JKUxB_F{goIlM!(N?k|ELFN3pn z;KBTs(p@b$2o&6?Juzq&A33)((nJ$Ym(ZQ`h>S8wg*-Pz#_!hVM5%?OFpD4lyqxiD_CbwMbj!RntVCvUgi6m>!^`N?hbq!dA-*dQO zJvS*jbK-`ZpT2HWqTyfWr2bL_gu*W3#L=_99Z;-{M|z^vJKcqcg{|mOY$90X0Ku;#|gP^$b+B2CtbjfzS~;pq_e9J zs^8c4sc$&7enbHqs*Rps$j`>Jq@~uzgWnfUhp1Fu0K&k6&OadX3tVD+?YCaJSoDkL zxdvn_?LPLG!z~W;ZUy*&{Br-t!2q6g`S2ZoXm?L~J^?}<#g8^bWIi#q>WcWUz7A@w z^|8ENWFLlS-2m0kgrgR1`20E&_rM-0aB53%h$Aal7Wk7WmFIcp(U0e zeblo)0M*N-KN#a~=a?OK%2qgSwNlx2&F)hK_A7EZ3%|ZfblmZl!1V}Lj>}bXKBv0*B^TfMH zo%vPik0?05OZgK)@%l7av6vx0%;Ur9yYox-2BL&aR>(7HSROe6bs!aohS$GVzFuY& zf`@!zXdU{P_41>D4P6AekWs!O(;N%UB*O>04S|$Jh!vm!$mWw~h{d-?mb4LQzu$t3 z;#YduFr$+v(UajqZcDREnRNF2WvozTkUPZQuU=~`3#8{ypEbW1+D8oyY!XQ(H&e<{ zz$YL-BE2fs^T!%f4ydPwCe6?hn(H%Y1LsgYw!ejBZ_V#rcmm5}fibn@kd_Jk!Xs3@ft#<2y_We$XlQrB6T6q$@(EK>+ML@+My2;&)CZ_I59# z*f*I>{A$2kH9fknTyPNl5eCNjAng1kKn$)2a%4Q0$f3s?`GkjghpHwQ&aT$@hMg}y z7zZzJQyb-pwDl_(4{>g;p{KI11RSN5-*dl9v@DLg6N#RQ7*EpXWF3>Y<~^jmB%fVVLp^e?YAwM)umRArIJA@usx zo@0ESku^m=AXkPSv^RuJHbiD@ip{#LTo=up*d{%6k-1ds5lI&ZJ# zG_{6o!uWr%TT-|(U-~MPv-I?i3x{xB6#wFmKaTz9J=y<8To`LOaT6VmG%vD3vq9+v zk%<2xsiQZNWK!LG-fvwz}4miU*WB_BM1oeg4XD!>(0!?@|`;u`8 zNRB(!83KGWrLQslfWBgC>7pcUtT}|SW-*tDUBWNBggTb*%NXs;G5{Y}Qj;*=i~R+n z(|jFP5dkA`Tb#}ow?wj~mpu7nm9DLmom7mN$#`HSDat*c2C`rU8QVzXe=o0VE#BNH5q$m#o_dD3Nx^y-Hmu!&@W=i&jVoYlde}JR`P+D}+o;ARy(ubht zJ^_kbGMwGT*f%;I`kNbgbBwd3xJtu9T|7}>$7pcc?i>6w_^xNDq;L8?(;gr9KLlj;m*r;sGuxh+4CBcCHqV)AYG{%SzcPI zx*W-K((Kr!S}b6V48xe>BSF3PHdG*A3+CIOJEH&Ul{)FagU9j<_;5nk9D5~j3Ub%H z4Ha2`7*y9}@~Q@{-BW|=GcQ}8k6_+-_mDMdl3#nlOxy08kK9&ZRVR-V-Nk{R@Wc6s zd`VscAX|}KO+raDBmz8owPz;d6*_P z8V_A5z4Ov1o0D%44BE$DH4PM>`>!^D0A!mQBNx>{ga;jj$kn84m>+N`mtaj%i9Wqh zDuVUCLrY}0C_nYe^`!+%aJD#_buvfc_tK%XuA}lg{NmphPdwuKwv7ds)ZSQ|)NXdF z@;f6@_^H{x$&grGuVmZ1#Z44_rjsoMRX#f@RL=a(7c%;1#q5p^c8~(=erzT6y6jg{bZfh9B=}M;?I%rL=07d1{{p0|z zIN6IqkZ~nw$_3JaurI}D{3AP(B+i1oN8$yDeq zYJM0~HoJwpGjA6LhT&#^_C%$6VIcv*>&DfA& za4~q-PUYeA^`T=JOiprau3<*qYDukDtJP{L%agLlIXE5(Hi;UJ!jBCnPTL5No#fqy z=Evc7WhZLxv`YLFK(e5`0_23YYG8)ITHhS*cd`P4Pk@#%GM5*4OlzQjrnV@+_q{{6)>eP4R6#*G{Q&NSKQvs zyBO05vYm#lD(E7Mu8|5xluS9;PT7bkl8WdjE)+{Y9hFDIZHhbzwE?6zCM+g0MRH$; zItKwA=A4hMWGl&{-$)io5h^xWm0406G2BWa)L%Uj`&SouKe`ckaXZ_)dFC1-PsB45j4TBX68qeB{C`JQMgV`R^07aj8~LuGu4&)rRHeGFch=~sc~ggmQ)DsO6uC$zFv&^c zTXafq-aIzz#vX`m#!$B(V3pn>`#s7z(*hN9e|LdQZaqVZHe7kd?%{v5W;aGKuccgMZf9 zE7)2L&;BWyp72M_tVhs+^PTB#v73wBj+2!!g?wPBIOOi z*K&@9V!+I2o)m2)(-AAguH{)x1?qx|Gu_0Tga~vQLswnwL0<{N?i`@q;Pf!w-pv=F z)!--3$O2%QoZ%}KH|ioqxZ11J(KwG;)|`VABeO7XVN5Ds4B7!!;N3hi&6aU~bOGg{ z5FS({iAGJ+(-2;ZS2TV=2#c@P!OK0Im)1jo0!etyRwWr5k!5<%!NzzKYn-g0V0i_j zw1F#-%>RkHEkrpZYe#^>yAJXGJ9*Aa_C8OWk)a9!`j7}v=N&kPPlvWH%42XTI=GhV|K(uayPad$3kGHLpfs*|>ezPgqauL%U1?6VPC$aZPFc_}ahr|^) zK%h-HAajw{0ZiPZJJ29?Alt?ggaoi*P16;i{=XnVv$NgV$F}pP91Ut01}bq<0j7!1 z*=nk3=vZ3+HSA(w1Zxm$mJc*Jo0e#Mf9J>nortAIYJN7I&Uxc`hDWEcfzgpMoH#6; zwwMGiM&HZ=a)3*ek+WaQ-wIL;$z)${M`aheqWXYz1caF^(58+F3&xoZ7o^#35Pnee zvI`nVSUA}4!j6Qfb#3{?P&j}ME6aFi^iMD5Hg*lzd$>}|mD%&!o!L_ZWJtl59WnM! zck@9W6gtkphSfnXYsdrDxuS^KGV)F>{hp=Ie_ziio3lkZM+6?8#bA+4!o~V;OY~Gd zLc)|0!ig9~wR&EHS*_sWutcBP(dp-433tN+(>dy$Dt4p+_Od;{kV2KTcA60lu#Y4* zA8yIkj5vZgfklQtvPaq75%PwmjxMT!N}$RJ$;5@~1fHYQ&K_iqh8yw2(Soomrb%pi z5~DJcc=*!ah@?M$iO`i5l(g0{+Z_i3=x-YQeOZI^kzCn2Qg#1MMyqH zaa0PjmR39?ki=}bU_%=^cS=LGc zfj#IBUipTx#iWw1GLCJP`(=d`cq;%G*I%*7a?D+uGJZp44pSaY z=ZQEt_GzS^W3AJDWfo=t8J^Nu%0ar#z0H7NUe1$xqac0gWyC^h=t!XhZJiYmy6Og$ z4DvQKGd#2BSsz{e@FWzu6oL~<5E1ARIoX{c2JW0ybzQellM52@)b2wsSkF~mZjc3 z-iux?B-TiV2VCdM&%AC`AlV1yQ^RqK5_$vMFBp-0_W~53v6FDvYH1%;79c)7ip$;} zYkt z&0~APCsi8h{jdUf4xxRjl^(2Wh@}|2B;Z z-hN%0HM^pw!Mm1NC_u0}MAAi| z)EK?*C~e+DdET*84?09qn_@y5@JPMb!s83&``0oWp>1Fs(Lv0o2(u&E0qy_ePd~Na zJ)4wsXRnUUSyVE)W29DX_VQXP7M)0LeuB2+d!Kl~NB|pElY_!y&fwrlen!cZXLey# zsGn6L6CR~r=P-1J6}FS`?gWp!BDiaXvsU4Z4uw0^m}qEA;cdNH5A{e7Ru!;jT}V3I zw{1n#vxnj;@gH3i4(VQCQ^izr!-qI zGilg=WFu7)f{dSn;?^~3oL9K{>UQr4V8=}cI$@6)eu|}`Ujr~ zV0K@<`p&gVUn4J!5;it#B^WxA+oNboHI|!^;$ZbvX1jBzwqb^(Ayi!m3n3{LQ^}vv z!jdp3bW3x=Vb##mIPed$a5yPkupVk)E5yN;OH#;c#pHP3lFC-V6OZ*V0?e#$ftPwC zrO#=(&f?|~m$fA-B`tc$$H3-PW{Mfl`#)$8y5N<%)VzC zfYIJiaYV5aqMlSfnR0)%RwLB1yGi$k`9wACS>*;Nf@;ZbC)gh#A(%ceZxZuCka=A* zuT=>kBjQuLLep6_l%8snAk+0yk|<0%Y~;YJrEO{c)rfP}m`ku;>uyTPlb3sD)NbP^^|X+T z)8UvL+9=>x?4#GJaGP~*$R0E%;~}+&hbpUtEitcfN9Oz`YF~0a8hJm=pb$}{A^>pR z$&dz=!2)ynw8~qpa+&k!ob(Qh=rM+mNcHa40d^~7TS66#0Ti;|hdT)=sVVk|tJ60g z4|4DSUL0N zGL_)m8~Tgq9|riXlq@ySMVJ%&ZjY^#tggLOt|@Zvzo-QJmM0XhdV)+^HWM81-W`vG zLe(k3kP`KcEtr?_bj%zC4@Aj?@YB $lqmIit)2P4+-66)FKpSt%%2xxE?x4xyz! zF9p`Jipm|rM%n}wX@ZYWPYU?g{yvXvd?IGS$W1W{hQe@q$cp9~wM2M?GRnEX@R1JG zxf$4eva#V2R24y`$%0Nsu)X#Tb>$BW1*$xXLGA%+3Q#RIQvCACCuYlut~}uU(M5x) z)rfh}p-~y%@l|*UB5QgR)JEOqP-iu}-Wqaz4}j4u0D)m_*w{CrW+ypVayq>pqG&Sh zi5EgaE)84o3J(Kr-ng?Xm4}UiKC$KDx=VcKb%oKKOGu$jDd7D5-0XafzddwIxv5#z z4(iz15Bku`MGx36v)uQTR!dd^&?ZWcv|#cFEA_>yJ(=odl(f>VIyMM!mMu=`Z+u|8 z!zwDeI`8}Gk7^E~8W?uKYGfI)Q4bjr4W^KMfvrR}mBh^l1tI6iB_R<2dXn^)*LlMg;h{j0_&|(sMWf>Hf|{MBl<<}}81H|IRhgxl;klvo zIeZpVVNmjx%|%B-I)`UPCyyUNzi(pgY*U#ad$cv}z7>orjFz`J#^VZm&;ZWRTpe6JEl{p30i+)xupv=sL&YIkpy%^7E`?foiU1<##LoFky6p* zPu?Uc)1N`y2DmD=s_HdIl@^J5cC`euAeu$d3E-+q0|pNi}RPRkajrDGx!#cEh+ix6KG@Z+u64m9S4Lv9y+J?47JGsz;0ZQFUW&`o*RAVw0w zN|1(Arz_4Anw!d&Q@X9-PjP%t*B?Kn!X z3R`8(kOfSrPj1ETq(^Orkcy(wxn`O1aZ`p1dGNQjs;5 z(-$D+9>%1>q0>A8=bQyG`ib*@$>|7*HWulJ9zZvZ1aLsCiqskpt*DosZd(>DnAKaY z3e`&)6M4ex_!yc)$Qh=-Q|ET#gY!iH;NuR3p8lMH?R|N;{`GhaA&vR9p>@ zx`=b$XfLU{_%qzWxSaf+T6*k7!;~y3)P6~u24;AEG66W5<3=!a)t3h3&=Du2}!`l z)Jn;hM0I>S{Nc2LxgIic)H&JN`-aXU+kU=8G*&o8!Mxo;D>`AQ0pi&b zubtd}^TlnHTyZPapt#j$)x7jeE!+qR*%7!QxhpxflbsS#Bu^&C1giN`ckTJ!3*tSc zV!7~5Di)qEH8!rWej&=e8{H(XiL`*(cyB|U#*(2(iTGKBx)zF27Xl`YE2ycmt*K@$ zsHq5pyV2l|p+l++d*4tT+cR(`W~A^=;8{(`>=oLX+-&L3heQ}d8cEnpOQ_K^<~%Rw z9h%ZGSF5;#t!RE7NIDSw_PBz8Sc@7uwOlcVX>d8La9wD|^(D{S_CVlRw1?ehfgLM?Z!jQ1mR%&@hWI+? z^Tf76t<@ey5}ft|0%`k5&9#X4*a42+-k$r7%DgD{is7;X`}u;CpDnHSK_UhRrky}r zEEIcR9u=(TdV!Y>3%s1)DIktU5lPnIeK^!o3)%n}Nt{ZpH&oQ*l+dlb@e)Pi6N_woOGjZb=7-UE5H$DAbRj7g zV>K-^nLkpei2o`%A$n51vAkad9ALZ$fU1p-oJES_Tg}F)=CeVp>nBC6ouX71p6JR4 zSXOp={QbifbU6-3;=ht*O0y!4qc^$b0J$95HYT~w_4OVCN-ezQ@u5x8qJoz;klbS8 z?qiJbxJ%w%ci}y;^!;qsqZv*1+Z+;d@h$YWW!WCyEPV?;V{D9ELFGmh}@Zoek*y~B^bW>^T$=@7vX`%IaanEBS zXA;`x-kxA}eW4OA@oj#6saGW1g`O>`6tU!$-82|%wZgAMEXz%<9>$dHckgO)mn5zs z1VL&C6L>kMFfnv30KFMQIluCX!QPc9%7-^A9Vk>S4J9!P>2EA`;YYR6tZL*TW7OMd zD?l@An}hDR+vlC{diDyv{8*kN2^3vchsr$cuM;SY?(;=H+s6)EofgwjX zjHGMHP2*6arj>`+kP8Jo7r9hT*j~rhHoYFLyU47&*nrHtr*Cz?1>eY+G@o$TQ-yoT{>thc31l3d zRhA}H&kr{Or4Zo1>g`Jz`gL2y)W4@0*K8DogCmTK_y)03qC0E!>L--)0CvUWBK2}E zWz6MpnZ)}i+wci=%0I63;B=C2c&u1WiI6eQ| z&~bLJ1<~s5#uTzk)J~-R@$TNLd>jeXl`B(H8R~fP`NnV3WCkL=bDNi2V!cn27%|$MAk>f0+O1qiX&a4crjEC-SIjF3Y8A zn{d1Zp+UCK6UqyLRyCm)b)uXKx;vyHWUG`fn9|-tsxpye-zXDp7?LaKQ)cdZbBVW3KQ*AQJse&g?;lZ2BD9$Z|kF)S((Ya2+(*$yN0bC6~ zS!fs;F{@9(@AbaKit8eR^x9emk=!FRz%$5|7zMwP=JiXfsBYK{E(wJ0Cwa#wKKudT zR|*5)w^y^t(R6@meEAQ+3j{QEd3X*|JAvN{>@^JNJ(f9F=Ii#TQ??4B$HyFCAq?ia z-$6FPYHD14@%SZcumVFvXUj!i-pUL` zSzMJG;mYxGl-dQ^RM@MTo2>ct=`rNbhWOU!!eu(=w=yZ8! zDfJ&6t!_B|H%Qg2vy?7=d;RxYkNqIK`qUR3e~m%9l$mdale!h7GEIa0WP1^oj;mM! zybEC45^b&K8;;*8@nN(j+5mem9w*FJ=~*$fu*ZZ=?v^^Wp)Jsi4#PKVU6)M7 zWU1!vnU^)C>biiN*n6Xl+P%?T;D#bDXbzuCj`kVds||8v8{e^+#b?JKHBSre z(dj(AND)!g(1*Iz1_;mzDkR2dG6CxL7+Q#M$oyUvYf+(-J+8U6NdW={*(Cr+J(6 z^G5T+TKjUo+SSNqA@CY+FR2J^q>3WfP1TZ^^RTv{0{dSW$$xuf@Pg7yPcKo|FFaLP zc=7Su;*{KXZb%ZTNTTy{J~5{!JfpkTBVVuqlTe97@j?p3jx~uuZ~~PR|CJV7K2ZB{ zVRd8u_E@oo(P8=UkZs=olaSZeOZ`vH9N?5Xw%5s-hVq8~*HR9!Ru{hO!KCbdyXzAT zk?Kuf?oXtvIP_{;7U;cetuqR;Y+uAc=0-))nGDDv=c8g>Ob(z_z^s?7$*_Y>=TRipNT+?x0 z!jxEBwI zoGr&dm$y5@0Z-t6ejd5k8m>VMh%;}{v&f~VPkZ&`G6w$O(SBm+8k%dMKm(h$DX<;c z>9I67?B6E^1JA$lh+I>YIPtG1IS#+{Vo|U2;_e)o^>k+6moYra$FW3~DHwKNr&5ij zSbDt|*~$WWV+&riVMp5>eiJDVCnN`fhwqX4LN8x=JqDGaWEqXN07Z9YPAwz-zUWDO z%^StL#S9b((R@L&;AzELnjgxulkCkkEkosBe(RH20ygPj%Oezb%kx-oQ0YV!{Ey ziEL1eT@+!Y(y+@0czB~wtShgI4qJ5KuEFg-5nmeJ=B)!A5Wzp~h1>d-ATY8;UkJOm z;1dQM#0f##mej17#%{B%L^> zjSI@xIk_H&{171-S`!I~{!#m+>UIGCLE&HX*XcbzN{-VReMS!S!|Trv!-sN-1Ug*~ zZZO%Dqp5g967{JaiTFW}POJc*;1;fT*D9UGn~6OJOt_sj6_Pl~lt4%m7pHl?hpW`N zBuAy&Kr_aC!TR3lr`T%i1jW-!{Y^q|a!Qw;}b2Wy+ zabDBG7N(VpMA@QxkTAWaa~R`tm_$CnF8F~<6}Feoc5KB8EdAyRYlq4?eP7?m>1f5k zDGvz~OGCoV-6fhw@6pS_Q`S0q8k^zAG;M5iD_S-v7&5Oah2hX915!9ZWrrw(=}*DD z{Pv%aA+A2D4Ik0jujsg~d3(vZRJ_REONbajk&-Zyf+m9t z>Zf@jswWb_B9ep7D8&B;i7ca+5(#;}oz|UK5UPk)kZSdJPir|v>)JcQjS3gD&5z=6 ztxBYhjNu{n;gDHeXSYy(&hq?==csex59d=>d9$6vZ0Y5ZclYzDjv@{r|3p8LOVK(n z$4l4=#FWw*qWL$!-^?W8&n5r*XL-Y3mv&@mXIC8J#0zGc!CYvk<4TfHBdVv4_!6)x zX}UcUL&v)>X*9EIOg9e+gb4nPQB2qu=nFFXp3Pzk*kCuJvz_Dxqj4G$u(5}Z8_-4x zDX@6GNYMBDEOJ2+yt3mNiQtl$+dL&v$)X{CWlH&NJLk0!8qpT2@inTK`lfy@z4jyb zk~WdHz`xNhVqEey!3T)<=XyWlxdsQ4!uJy{?)Elm3s6U36bXAgkEy5%Jf~>Ry%YE80G)iGa(sR!Y8T$6+^EW@3-*bs?RfA;q4127g9}kYhHvPshrV zqv74rP(|X1btvhE2Z>sD)j1X3PYwQenl-P zGJnoJ>c7%yexu)LRhEsb=wj7Fo;EJi%wwbt^%@YBTee`12N5xK6;nN_U@JO34v zvG4g*87r+?<0(aOI$4IWx0$nr$x%$TLUo^Opdoc zY#$yTF5fTX)3^zDqyw_JjoEVv_EbN!CNjx`ek*_vFXX&C1ID z6GS4SO+o9%j+W)h()_uN{UpI7W_POaiYH#G zg!VnDzKLR`77iK`u5L+(UMRU1Q2vLD+p|%_xL;#rWUn{%A)Z0v)7&93h7M>9Nm7hO z)0-y%2~yMwD(D`$UbA>s=f<6q;3mkW>T6y{73Q7l_OSe`9N#+vAgc_W=U6n8X;c}O zxMlr#N0Z!?K}p3<|KVM#XXmtd){&|i?{6a71@%v({w0esb($>ZzNh)(M_nD2w`7m? zW^-hI9=IGG$K|kl998x?wM~i^9<-6x%6P~cI9@n&=uvr=QH+nX&Eh5M@mopy3rO7v zXHSPuy}=h@ACdR@q1pD_87-m5S#ZCX_UqPY|ECVNKYjJ}Q#W5x0sz@%agpk`gMf#_GAG0~MW6_XxPCr>p$DSFDx1otPES@r`=^g>s|B~l6ePuqCSIzbA!9_7o?%oSLD3KGhZ6Hjgg_?C&H`g&+ zcN3*0GICz7!!4hSf|B9B^vS6KVIRXC+!^94y9S?Sc*HOo(!E-jtXJ`87!dg0KYFVS`L&Dm`B3cg*c8)sa6=C zN(jYW!y5q+Sik4#Fq0H)=&RYM)S@U;-fgvv)2pBhcRG!?Xas$WWSbn`L0Hk>Y-Q_H zT(R<_l$CzWf8hzS+xbUck_ZB<&nr&odcgY z1-@_we9i-{KDD~$bTTIZ+pUN!!uI$s)w^C5_-xbxe@_>AekXoZH2!-xn|Mhru^HXHhub{D@ z-04QtD6dejz!eP)Ygd&XwL>%-_(`^V@@&8*zx~zIU*W8;;EP%rsH1o-@5(9Chx5nz zUtY}pbe|Ld%(KRZz%LRB8Vp9klrON^;P*R|W)ciMG$@O_uJZll6U3~=;Ys5A&O zO9lqtZpF6^{Et0u73(#q{Uep)TXqj%b~ry7X&o*z4{oZ1WC1)3UG#j0P-iXD%8@wH#SA=zAv;fY{ zTgdU9Js-Xf4gFkB(g1~z(9HV+yeEUI)!ZAxgSn8}G%~f?;rZBf^!GTfRckU~HTqPp zS4^n<-u!f>If2WM+B^8q=}F)IFcMm*&ZrZMO7AF#eJv)_F3|VFUQja~$|@!F$W-sMo*t3XlS-ZBa_hx1pC4`+jTW-x&7sb5c>#QIh_Bg_&djm8sR z*i8l$Sh3O2fapJ?FQE}52>1B*Ef_4lf^)%X>5>RW9=1CV+mAKjOFh!DkKpta0U;Br zM-ow~mk?Wj5zMMopFq3dC4N2H5PTyb7q`r9R7J;T9bZ{5JD`BElHvX!$2{=wz;Cbkb9VX zU_drCtc3XLrZVx(%vfk?ghG8f{#$H-)7y9PZ>k$tm~_WZ=Vw!Pd}4l&8ZgJgMCM&P zIra#Ozze7R>`avM9H}>%tlF>=^dc?fyf*a~0C zpI{@()A)+EV=Gn;<@WdZ-IYmT($g;dPeU8~%kAiv7yz%!i|a?_h5DSS<**cEBvIKr zhe>kAT@(c?ELg)G;X%98J%FkW)hn^8vQKxhw!X z0~e!*;xZ8n1!h5cPQ`Hb2IeU|Cl9#+oSto#?&dphW(aS}DcSBMD2#G`H!|=-nMg4mh~#i`O{>#Byg;B!}OKLi{t;Tt{rb?vVX@!u5?t9#4yX z{jHqlB&s5=U9|A2t7MELLv$m6vo(6mJv0}_pahgMfn z8)lR)=1~B8CB3YzW8R*)WT2(#lhN5TL{Wu|mLa@3y$K_LR7Tg01HR!V3gr^N$`B(X zkQHa|scPeE8t#l1iK$#ebNp$KZUo6KZdDqsh2zALr%Xs>)&YkQG)u0;L@!)lhP5{L zv1m0V3vsUJDXUglm_9h%O1M^4y?%wN@?1WeRCbr~@hc%$-Fk)TY>}^+S8fv^0E>p1 z*e0t{JxWQQt@G8-OpXFFu~1lSe68;MR5W;{l2Qr!^nnaYgFKLVY=Ovx=}xofdt&#L zB!N)^fT<_aSGe^!s#k-pmbax9iKfe=4MdXUvP`Uuz*~xEtIIemmpuA)6Sb**?%^<4 z!ANqOA0U!I;K)1uXkFK%eH2x#+~!s@j4mDFssg5GF8&pWPK@?52G`Dj2Q_gUl}kG+ zoQixFdL+Ei&$*VPUD46fEYv~C#KHdR9M#Wem3BKVPgdiRtWs>xM~1PEB|Ek!O(*6HZ_I?DwZ3M&6vMn6 zlI3Fqr`6G(+t|d$C?F{Q(y9NFvSFE5a?3$F)mIn|o$Wk5HaPOTW12Mj6fC9*Y*tH8 zkJdC(+|hE(>h3`$F97W*pevP>w0I!{4B`N^2W32vOt16`Frn?=4Rqb2e8RZI;K%Nm zx^-0n5Zl{oBNd><-776W*Hn)Wi$zB>60Fe2C=cMEArr5hg>o9uDZO+iiWt&qQ;#`POwp$bYJduDDyq7{hE7$C9p@bP)*FY;5kiAE=X&vN=I0@z3S*I z{qdoW9eW)j9?&HIhg1H*M8XK=c+uBPg5(l=I!k&8!`o7Yuh2xFY$2psKqFyS#q>Yp zD63eiTH|&iSotZ}{6e9Bs`xCw1{Y&vthEpHW7uN6B9hDUQW0My_~fUBIMqwT@+arz zPeN(Sv*auEFXMaRp%>D|1LidBh-Ug2<8PD;975_>cpGw0 ztC6N3?AUE`M_nc}-!4vP3*CmEt7b*n8cMW|su;NpV64@9S^lKrc;!To!7@CU{8dDb z@mF!+EMNj`VHKjJB2wdbR9RA=vI(lzS$&Rkw1)`n3=0ys> zuZiGPw3o{ny!|z2aChgzwtwwRHzw1ciCU#s&5pmNB;;T4Z#G=?{=iO1R-NoJMjE$N zNo2HRT@eOl=kOnq>(_q=0siholiPnJvbc;CRH7K$Q|FqBaC@49{Md*5B;E?pF6qrH z(+&E~g9~&=Hpn?i^$zR@h!cN1zB(gfI72#7y_b+&x)FQ+!S&v@lW;Eljf54woy@P% zn)ALaOLa^L^--6@QAAyaPWnj-o>j44RtG8gKwAu{L*MlpUI2)R!$3>5*10`m&_`Z7 zD1%N$%KW=__J8rsY3wJ3W)UDS1>ivBcYJOviQ`Ac#7tVw9mPz<+LRc6 z0`#=3EG_9!)gn%<z4#w5k+Wn+VTG&#)@Mmmjt_9wsrDvs5G|t3n-$))6D2L8Pth~MD!I275bMZocw_u18 z*=8^UNZV&B6+!(_ZzU8ctpYxf15zQxm8MBqQna61!Pk#AtwWIdpIF6I-H;sqC=W*f z=&eicOv)x}_@2Am@x(m%L2>k!P=lF68JIo;ZLZ)`Ki$?4@=X07cw9Vr_fBt=>FPFn zmPFSgZ_5l-p=P=Mhk~@%(<;s+aWEV=hhzR-j+^CJ0pwbvK#6*rsOcHU2jk@*EXNUd)fm zd4ciW0MZzL)z0J*WBDCo{Yz7geI<1-U*qq)cVy`!)1I)t&K7BGaX@%d#-lTmG#RO4 z3kTQM9B`!-dDj2lxq@Kl6OUs}Sw1K_hT7n&TP0j1Q<^`$uS2MlF82zBK8T2V3ON3a za4EogRo#P1#yASxamx)B`Cwi9+bVtA9JCGnkoQF1rq z@}q;r51qZr$Y@CmOx{3uE;HEzMsV`CfK!{9##?$r1FUkIT1S#fZ)vTSxRxZunyi)Q zV9aN1y^M` zYYH%A6JBU=16N~4mpg*Y;?vvkm9X;F>r=f z`frf>_IeP_@TtLqN!eQq2Zl*0+SHM}4cc5Yv5IQTe=@QicO8zWFGj_zwPqlVZDaGoQR_f{ixX4qfy2=3EV!4k)*0?%aKMYd z;Ycg@XjRTHWm`sr=YBl~>jD`Ax*Gfy0!il1eqS<~_S_mg&Q-@EvHYnFa&#OgpOi9_ zQC+O#X33|NMf62cFIn?25cA<`gacRLvK$&KElv+hP3?>|uPK@nT; z8)R9H!FA+CoL!&ia;zDXm{+35yrnF+AAgRs_^X~s=jwE-oLu-k9XUH(KxVhQvwKn3 z-w~l~9JCg?jlH(1+R6N|^!L)V`x7Vc=^t+C*X%8Qu z1+(=&b<&vu+}T!blYCaV&v*6?)J?jEl1fA}wq(~)r$1_N&%>&Pzbexcm3UY zrhYFg$Q?^k+sU)8fwUBtpm!gcIMxAIUyzhdbBXNrM&*|ZR^jH21v81KK=Peb)bHn2 znN!(_R+oV`Mdjv{WaP~bfKoPTIDFO@$@vN70Idm_TL0H~on}QCBw&)t08yTm(Xct= z^0W9#bbU@6$al1-hKSA*Eku|>0|or8ewYU(J?acHFfxsK;oKR11=vIg`I#H%TQ8oMs0KitZ;`)GFEbBXm@aUHuHFX$pu-u;K@#$7p1(9UOG6yA1QgBVCAn^?>f1!Mu8#rkc%wOavPMO+T`daBlYqi$h{_I+9?B7`{TIAmqdZdD%`%%SNiY;4t93d#7aB>i?mC6b)pGPpf zSIP^Ya`Z%7tAfjJ8M9tB1j&Yjb$I@|JsTLp`>ZAH%uc%DlVTt_F-vlQZ>F9OkuBhF z;L=;x7$!(mA9&vSI!no4{pw@7&#KndRSBKCj6>p_#t@HRTn%D6TgQyJy15!ulAcJ| zf1+nYFD!ib(Rc9*_Yl*YKYn*kbt^jOSmVlDR=UmF%mJ18NkBl^JA&yD%-7^$+1*PC zN|bjo6T)4PG}^EYE1;Z7yR+G&jTUY6B_R^^s)LP@jkRyXTDA2hDlUJ=3t+5q9BDv` z)v=~m`*B70>D1lW{t<(l!96+CXP{ieT*U#^CDJ<@XJp0Y;yI0;WpKweNa2Xk7rW?` zk>$=yp%UZd5_w-boE$PH_7K|@Rx_*}7(P0{yQxhe)Cjgv)Y zPFrH*68opTUcDmE?HEJ6<06361%6rJxw!#97kl}s%E1j-pzK`q%29TwuC)x90t&)h z4~D%zLYsxUf{S~e5AbSot5eFTf{@dQpoTiXa3H?cJv$LEUJ;91LkZhrC3TG?^1ifC zT}16tDNQp6E7&@Y0VH1V53&}#?I_uBvr|dOCDMkyy*YX+Ia0gRL$ira50q$+*c;=dKRAwRzyy%X zfYHKWJQ)~>1f76cWLq4~f2!Ydv6keZM5CfhjGIPxgtS1aP9IKEid6*%E&4CUlaCc} z<8)QlG@DY}%!)@vD<$LO&W$0ew#Gjc= zsyQ`+X3&32P#Rf|M((*jROA-5xI-^`Sx&4d>QI>i&~Q z$4@duP%7S0a5q(O$YB!1x9@Z;l$?^Ns1Bbdjj3Mig=`yPC1B_^evPg5@9A2)9)*bDRby-cWACPg(}-9!;p|z%0eU zsk8XXTbZWxiT>FJH&~a%l!kGIDX~2n<7X{_vmcY@;xW4>TYs&#W-)(*6hUk571*32 z`1DEb`kK22ZjZX)a%FMX*=LWI&(esxz>)7pYd_V;9+$uRm9vfRjxPj{{AjL!;j6iZ z1!9y7QTR2l)~C0dM8(v-!BLo0Z}3H;F^Q?F>EB!W_m%X{2bRSftHC-6i!^N^l#w2y zer>QCnuN(8vgm$%(cX|ehW`CV+E8g!gBZ|bXhLGT@aR^1XZQA-r>frL@L<1b+leN2 zgD^f&V5tLe9;OZ@Qcof&Wf0YY5gj|?!EnxM&_)|W{U`ENMLNjA)8Wg3xf3T&Gv~A( zklr>JyIs zqv(`X=-V8rCwE;ddfmKISY^4-Osttxoq;i^IBP9@pS^OD?J^E`q{Q4L_{0b2i z;B^L;3VV^eg#<4V-Ty%)1-1Ax1p|3i*lQt4@q;#%&HbSBpa~4z#O_WKABfYrR*`j| zm>P2P)bND)6u}+r*mref1)keE_IQFdG{iapAk>};AS*xUIyeY`2?2b9=V4%C6RS`5 zj+(NmiCZPjQ1`ZjB9TXj#_GgYoZ;!P%Y#t3b`dmDEV>)BY1Nf`r0Nh*6h3EGlOevY zUp>dr$@4$gT@VNgkTW8j93}3HRr#;WkAC09$72#`#X}qN_Wrs z8DkXO1qc$u2>|BZ6LdiQ(9Y}+eM-3tDLn)$Dl-JNMWi>DHBO*i35zUfL%U9KsJl{k z_V%E$|L6eU+Q<0!cO5-y4he<*5GP7s(SWifG5#k)2S2!r^}}kl6?!c%vhG5JFgCz? z-T=)9ze)nvJ^(D_d$MyJM@Y9mLVR!gP|=!HIE8k+1kvhR1^2=ez;2}?8AJ-LMvxdz zL@p5+n`05>Z#;`_7ivp%&SFx{2|nn_(caO%p{2ErIWwdh8G>ou1jm^U{lqEwAP10W znWqOYVUEj+@x!w~s_I&fr%$ifo0|)tko#;~U`8%Xd-{Cc&IQ@zI9@vzdxApOVm1qM zMGQ)(7`t=gd*P8-Aj(FfDEnYL418E>(z4v9LJD8iFK!t@q&NYLf_T7^RTK;zaMl@Z<=3vGqu;`nJ^ zuXVq4&WGp@e?!iVDsTir_iYY*lS#I!z~OegM3@I{-681~lWs(4s_QYugb@;Mvk5lR z8mO!)p6i{%cIS-OC65Gwml;ikJp|%WB{WKx~x98pN`G znz4HxEQl4h+iPEf6?WR2UxXF5_qK@@jsg-^%x_qNXwq84KXm*<*FUWJhjst3;U6~r z!F=4pbA^QTJyl(5U zn(F~PQ|FBDa}U<{|2(ieYi$SCo&i>fpo0^l{A~8UAmh^G$CSEVA(&4XR%A+z>7tq` zT&523KxKkcz|$q{a&}h}V#_03BA1e=g$W^Em3}gG(oNVj)QqQlRJzJ|r3<~XNXT3S zJXw~0AWGT13od~IT)&>Jzev82ZOiZ8d@ed$ui1Dl+-2J)a?V@Ob&u~$qNwe;iG@c6 zJ%U8niy^9=?$(zes@?AH7a=OdMXmWrUPeU4kBqn~estxzQ+e)Ip4TeR>y_t?%JXLB zdCNU}G?qGnh8Utm=+ke0#g91^{wd^sSKP-f|MaKrB1bjgT|NEHu}1G&S?iA~!IlX} z3$i?i&%PmVD9y<%Tpb;Va}tWwi%Y2cc=XHfo*m9ZB)Epih;ER&f+fQyxv~>Vn`{=& z$y47vVN(iMdW`8wt1QR~R@FAmP?#OTm z!iLkntRTIa1ingUTC)9<-ypy{Vz^2&XL}+>u8dsRd+&X7g6K1>9};&o`o_%5mr?C` zjD`}qF(^-WgsI4t!tEwZ_B&i4+IF6_fgwuI(oTBXvP4 zgsJyJ1Fht@<}3}pWt8e^z6p|jj39VARYI6?r7=LBG>1<14Sc&ghkQ^^QXRxzcdP-t zRMPJUPt1J=>#FAn1MB7fYy_bKsk*|l^JT;=u#!AIkcb@)cfP66&QC`-qKsSzitRNF z^B|r`WT|jQ4><(gR-D)ECk95ib*Fpic}zshyImtcxY-w-vr|#t##O$&QMb4jUAy+S z_P%88+TS|-qP1&ZgCi2&X+~p5Y|f=3qU^AARGuRO=5s`ze2yrR&k+;yIpQ}yM-0a2 zh?@8ukq@6Ej^T4eAAAl=aKsmUj+lVYac=WD&R{(M-|s!#60D3L}f8_KK^ws^^f zsUw!F^hv~Pe2y54&k-^4IU*iDN5ta$-i?KbA^04T0H5Q;{`$J@g{Ig{WEHF!QB)OE zu1<1c4tk0UkMjwxuV2^2Io@(J#c{gtotb^#-aLABa+F5J`gC8VwOgO72fn|ENbJ4} z#KcQS_|L`i*EvM@r5vnROSy+*^n-T25Z4>`5)=hXyQeO9T6a#Qq%+mz(7T7oGH9My zPEWnt<}t#_V0#X)OF9K1*FGh^x8%a8xREM(hLv0@5jZbRk`ZSL>5{TaC2LmPX$Rpa zIefGbJOTNH=UW1u*Ap6ywoyY5C~hS)D5~TXpBDI7+<*}+Gr|Df|Lu45E2k6e&q`mn z5=iE;{KjKfe7$KfR6;M^f@*?p(|a8%s;@ajhTlYZq7Um|-FvU(Pdn~_r|ScdN~KPG z^%f!q%AM+~QsSleuU#B`@V-j~zbT^0Bi^O*4NY4ox25T_R4Nv^O4kSwt5e;rCQCF; zX(2)My|Rf{(^UhiYV@N1EfH7lqTpgplbgiDsvK|?-?N`5Dy+1sS+At!@j~R#89p5( z%Yz#G*c)`=J~e~>nC;;|7cXIDn;%91BSX`Ve!vm*AO(zT*E-VjIKQA`3G-tPs$F(! zj9CU?RW6?~@ae*b#*Z@ ziF#EmY?@dTrmIv$>u~V&**8Cbaz<@K{bK8my1dEQK&~1l-%+oIMYR*F!F1JX;MJM! z8HAJ)dJ0#6?`{%cINPMVO4!b(UI~lNCsu;#s+GW7i0Yl$-bmbIxuXID&u5as%%Ggl zXnVfrn}*Ud^?C(}u6dXiZ|FDe&;SSgoRkiEDI7Ry!(8;$WK4*@ZJ)H{N`&~|@E?h+O$n!4-!S4<46eIXw zvsPBca5(AlLC6oC;7V>g1zVY@d_PsKmmpexW0lOFW?e##XX9oN3 zW5UT7ew+Up-Gt$-T60V1K1Uos`KUpLOjXal;SqJbwhOyd5}L*Na=OGytTHZXP$!^d zVh#pA8PeM|Cm*wVW64Ci1@UmWE^CjDZ!o0@&6@jKEg#1C{@#l9JH;saS|T!otUpv- z(d;AaA@W|HTp?leYt9(tO)?2dZL`EpAsRfOK~peTuya*YzYc4v=>Lueq1H?Ws%Z|A zcr=-bl-yN&noZ_0au8}+)f{G7vHe(*Vqa+60klN;+EK|oB>mSGTi3UjqkGu|a0L6X zh-h2762Xqzl#U}CtdnWLqtxe#{s$n5D<`)t1w@)sin34}e-=cDj4E-m#ilToV`2Ui z%{8GX3k2O0@k(Hn{w(94$d{vsD%ri3A=HKZoY~)8&k(Hzd7<^~&G(hX)gP5kFZ+^# zCQ) zV0W<}tz394pkd2*;T?#;Mj3dr&!PG(Xhy;gnFvb!{Yiz^KHVM#qD_5m$_@ zVOLj4y>N)JXQ{3cm^ogW)v*yZi$@Onl11Faem7EpR-Ho}K+C%0kpFvs@y$l??PQ|E zX5wrs+p-`kyLSf~$YIIQg;kE?P0i*r8Dp5t7)RX2kfS4Hi{$LA$u-tr0U6^{48GEJ zZ;%m7KNDlaO%+LFBS<7GtRp^&0e|5lw7?EiMxQBOp;zc{MSXjzW}GFj+4jlf+ebx0 zbAX2OdL4(;c-`*8y2m?XL5tRE0Gl*B?{i1pd(MhDt&SVi3Q${dsgX-+^6v<)7*_kW51l6 zZlB;v6RMYm_JLEUkGJRFPQOEGUO(W6rN*d4JYjif8<3#xScOQl#tO)*?#R3yjQ%H7 z{jHxQ6t8g)Cmp)Zf5W5GU*eXYIa1f!uljsl`efG!E)<$E5f;>c4oIAD3Ku-%Bt;LPe85`F-v&dDZje37ocFejT}qj6o#TOg=6uuZD+R!KaH? z+?fYKq~v>s4;TRSk(8`JdNngp1d%td(-N+ds|`Nt>d?s;RH%+w8Kp?FYxz+_rMC4FuM;)1ONkW1uxk>0CN-wA#2}Oyr*gD2#+FHls(F4H7p1%myzOB2tZUqKnRf2rje@%9nn;N&ytaX0oBW8^ z%xk#o%QqISkDLPN1todK4JkJ=Xo8SlHj0Ait*Lb5`M%a(U}3TJM7x+oe4t*?*^YpT ztBE=6%>_rQEsjw0mXscYha=o|Ir4^f%1W|)Nmg^48I$Fx4Vs4J7w@~R zhp0Zl(0UbnN~jb34>@elu0y41&CoQRixDj8oJa?g|1p@<0@GDa1f4#VRwk=DMq@u4 zOk`U(g~&|=u0Y7MPBgYdA<*35!{$zw0Xil?Qoq`hs9cRs{->vaTZg+Bp)<@!9_h;r zo9s{bcf@>J{A|$58Mhl7aZS@p;g(=104bn;$b%xMmP$Bdx;KF$GuJ``L!r>A+xNH|K#m?ZKtL9<=CdVA&|lADM$nb$$R z{y2oOK$AP53a?GsC>u-uCRf#V={d`>b~chGjdKIqBMtSZ{ruu>aKBKfZr$ogBECvUHK}5=6{dTtyk+KGyy^e^K z87}VPr)gXGM^u>(&2}RJD(Ed!N2HR)SnH8CsD!hDSzT|f1D|CZ|v>o&3n`wEnpTUcI4r%mAQ&C^3aybUh zVSy!>by`vJg4p6so3rmthCz{wjs6EWMhsA3M%2K84>#K_f>sig;)p{(XS<(4-ED%L z3+f3ocZ{v>$hr7#my84jh-Iy~)|v+|tXqv#1tUPsZm_yCGjgJLQmwiS3iT0Cjjl@Z zXB}-Ie$?~&x4d+XhWij~v=8S{Evd?IR=vk1)UGo}tg4@nntaSOK6B7CJ~d{@l0Ch_ z+dSkWePtU?iPztqEvTYNbGkOHZ|vPX8T9uH$OrGn>9MjC)0`ZcZ`!v zu(bJ%Ah|~(y#1YGNn$af8@%{vBgw&;7!MN;#frF`v8>I{zE@H9r@cYT*2z#cF4uth za`yaapQhLFixQhm>!8t1zXYzeQv)ZyUn?L7iOK4a9(Ek8y_vAgJ@>*vO9}e~2kWpc zWe9~AOOo@)Ki*o#u1bGI_H-yJSL3hk_R4~$2_5HY?*cFdd~%^S3QHB9*<^#KS6`Gz zle7~1HP(a-HGznVaiJZT=FbBOl0{Y&5MOU)MQJAM;my)nL@SEM9B~S1j_2Q;K7nMR z{`u^AV;_Ib+0^HZp7`GJtZ9~log7$q)kST-#W|!T*PXg-Z%Z%WpL3UkkBQDz0$gy( z-8wnL1wk9``=UA2e)q+ZH6NB1nt-^DLpOD{$1icaZXsHD8DL3UXDe~{9wR^I;6(P2 zhX}F)zm43w2Ty`_r2AZ?bBuR7anDGy*=G2<8ZhVHC`OvFESCxEtQlk|TFo znP69Jr3E#$HWs3ZcQ-Sdc$1;K&Xd8KNi91bLqB+<)HC@jIz(h`6T_1ZQ4l4$E#P$5 z(RciYwIKK)QS~sBnK-}BFK|2@LtRYJTrqRr+lrKANIG?-8|_Zk-6`VnbVY8hPbm{^ zl|c8<_GaB;WoUITc#@9vwpz|C?#7xYLvkkz-a9PV_E_-eH7tnV>*B*aPp3?0W%Rj_ z7$VlS!!C*#*WNFVklEnG>gQ#glBc75y^O5MxLpfAX>m7MsWiK5zR6I(46^v4>ru$% zh?5V(?3H}3f}dVP-i??g4QscKZp98ttiFWtoz2HVlhlc5KQ+Qvpu90_sMoiOOilF0tkEM4%Lu@8eB1OW zu@7n5n#6`;VDHg7UwiCpO7ls7p+W%VJSRma5w4ETmX4LrPhYHV-@W^25b2H8ykSNJ zTE~6<*GeUu6?ALu+$+e%cjqP)1N>ZE?a>;swIU^CCthV+hI4TnD9zSvVuz{fgSM4B zh48aCjl!Q%l+hZyR{QzHb9xRwaNt_5Cie(sSS((|1pUk}NJ=Ka~vKnxI8 zF9UX`vGA;atG2iSMv^2P@M&*?KF^;ZZgGMBL_~0 z?-UA}7RXlg5Rwc^$Lsn<*v-c`jahceBl*Sp2)vOq`#;AuDW>ktU}?o&8zoYb+pgY- zz51Wz_jub|`)e0-eRrK>_UWrNp6yAd^j7ELni995h&f_ye*@gaoJ~Rji8Y?f zAp7~HJ9g0y>CK##s7kQuT~?R4PuPJkZ1APA=dUTHo^ABmd1RxjNf0n!bsr_P>D<+) z<(G8s=D7K;uRB%r5CTdyBh^!z>EUSv2wwctTShd`PJZFxjy8Zr?g zdTQbuuya_vmX`wz+q_|<&_-&O_ZX+(3MIcDc{w>}n?rmy!o%uDF1PdOgWig`%aFd= z>TMPhxfJ-Qc!^S-V1{6+u-8ARjT%zBoc6=CpDgub`7`yrT6N3=fl>bH{5&v}blf5H zFD1jRMroj1Z7yuM@X2C)b+C|TX+wS38CE0i*nj#Ht(sP25b-nWa4N0L`lLu|7iqFV z)?|d$^CR{6#q%8w)5XF5;W&*%ex8m&HZIX8Blw?D6=dVyo7tEp4G{J((RHe>`N~U5 zSzo$0Ir?Xx5QO(ipJ$zNemBb{k^Y|jb=L_VPwgtFR_{z29gB!YH39#Z-7%h_`vK$J zR05K@Z!(WU2RHHHP6eI`jWX+lU`^8|8Y@j~#Y26*tb4i;#LL~$A3cQ8BPXA+?ooop zPvNr;r`lYMcM!Om2FrmYrl>0C7|BeD#6`=mKp#7ee?0sOJUt#usvPzX58`l=MqL$q zbbA{w=`tZdgC`u!EH_R;mhyDeHMA10_p_knFz znmJg2GMK@;2?F*li3B`_#8znr4{AXM%HjHsXP|W2G~pD8GP*ROn1S{O8LJay#dh3Pe~Z@3s7>Ey&w%mzrcj7#HH14(a*N}XWlqg@Kq z08K!$zs7!DjwgVCB#Xx<9jCC?&0G%ovao8}t&Mtn*W3_cVa|_`Vo?@<-Pw@ns1-x7 z9g@pz36v)6XpHfAcb+| znEPx8GS?Ph+i>-(x}f3LT2@g$gdG;8Exc1Ab4Y}gTcC2n_5#C7ss1uPmBQmAbKYb6 z3XMGVw)#PfCq;^GPvZPQyi>X7V!R23Px= z@-GnT!B3zo^~sAnrsP5Ox2cO(+7u#Gs?%KC<|!0^=2{X3a*-x&A3FzC*6VLz8SC(O zh`jksZFHeIk)}{DfrPWh8*t=7CkHMQe*-`Y15$`oVqk6Ti;<_Ki)%O>vACU1!x<8i-~8+Oqko5t~qeeN1KN|W3!zWi_DnYz^4h?Sg_ zAb(5uXh`-d<1sxM{1vrB&XgYAwXmKlZ*!=A0QR@65CAp9it{vDWirCM)3>+fnP#Jq z{l&Luv5s}Y;eKHlbAVEomXfxiBuS?brCmYZRN8sL_5@)RJM7-tb8(=H zH@zypIMX)#?6yx?W23#44F?isgaBK12Fcntkg^&zJmVA3-UGfRu`PJ^?D@gTk2>oc zA|cV;REA1FI>mQ)+-RpSk6s9jM?1fPa#vNa+xNkv*{lZ-71A$B{W5l~K{vRiC!Qdk zO4|*|qP4H}A5KDh}@jxS=mCoqI5{?`XuIg!JWjP1vb30zW}-(wBGg<0=*=k)`V#*`cDceXr}C1)+j zOTxQyT&2X58-HW?H3NzmAEzcmDIj}u1xz#=2;HyX zRiWONsQ972Pt^+kfS_*3=I>UAU+V5##Y|OfG565UpU-8t((CdQTp>acyhjr%9N)9e zG(x+Epk>-nSZe)*TBIa0gq>!Ai;~MsEV6Bl-=EO0d+NCmW~iAYlO*^#MvaX&|1hGt zGC}~x+;2dzan>Rg8>JqmYv6uH{%DZyTWj&;gTj4B&-Pv%i*(<^Eet6BJm>UH(-te) z9qsG$y(tnmg8XxGscCwy%h9mOAVM&f?6b+InyhGZsLoT#>myu5QcWRN{+$Nh$X{cy zhH~~SSs&nc6$n$06UvyC+|Jh{kg`yh%4-d@TwvW-N`9!~MF-F!;=E=UJAxPZFDH1G z5fWfqpNvF4#+sv-PFRH8#ui<>hN*h#u4w&E5hn@vJsbpw`8?r|O@AS)qV_ES_zLsI z$piSSWcdcIGHKH5TKS=3ju$WC8PGuE4TCN)H8i(0!-R(Q`aB$_t1CqA1qvkMA0SM~ z&YbQBF!{dJ zA7UX`A(d_Av*P(*96mjJv9o)8@QPyFiIVeRxTgd8HN52hG?1~v=(NPM?^1YJIZ z)CYu52<&#VZSUUkv(p1}i^$=Ov{kqII5YM+6zzRvLY_Lo;C?()U{&S2+K!+%S-HF! zM{P^nLXPM4SdlY%6C-SSQR)uk$K%`hx~7~H7ay(jlC_6eKE7KAGYNu z-`uQlY=cVvV zYh^8{LDIWuq7P3}9#3(J^S|Cr!o6ZA)R;7z*`yqjCZ45d3QGe}SZRJM%Z@$HCwymK7Vw<;Vb`Kb{p&^g*XtxgzhhQhTOE3qM zCfU;u-`|XWl15ke8bgEe>u{2fLXQYq$gtM8z$7Cdyk{p4Mz`uQk^!vFUPR!Pf{%xZc|k zL{mZab3)PC5OWRoX-qSXpS zT+RfK&!^{5Ebb-i{uNSwDWcH$F-)Y&#yD)H7??1&f-i}i^Xx`lMvIB$%zZmGZNzz#FrG;~-d?7_^v z0YBZWznA>vd>_KITW597<*^g!7*vWQuqdYzC-ZO9DN{LcO{DCtEqdA=o}_f6M#Zg+ z6b=KzRLMMj)~yu=gZSPRL6 z2L&FKj!lpQvZe`97~m`ietTWMBDZ%O8u|OQ$=M&MQh}ymfJ6w>HWXd#4ARk^A_+_!^^vBan2^d}M^Xl7ES`0n*6i zd9wAS$o^C1eqggIPSUU-*$B3csSwWDLGb!xkRdAFlg~EonsZ?7zBo?(=$s7TQ}wZI zj#ZEC;8yoHHOH7XCc`Qn7R+UnNg3p}8_O8kAg-CnZ>4sXMKQf|lSYH>Onjqxa<^8M zX`3UPVwTCu+=s{8hexmzdScp6!cY$e*Wi0!s(7x`$9eYI`92{zvrO6GjGOmv zx_6&FJlZ+!LcD43H5&JHcORM!R4K&2ii52`$2XWo%$i+-6>$W;=b?lJ$PF2J45}_E zxH(n92%Wr)X?8y zLJx(0i&YMe3MEvRR>wFK%viU`?yMLQo5_&aoN`R?lREaWcBXtXk>TOctI@^pda_4- z^Dgcqs=<64>&REXATwF;zMH3J=U<%sw6g3wO6ZN@sEaTt%_(#{9To5^s`t_j3%;tl zgXcxKT6Of|`CZo@7m5}OX7Y`-uE=>5_mP01Fnn)=Iq%W1%(|g+^!E{+UyypM{+*RB zr1r562Igm6J%2S9H+Q)ld8Oix*pE_xIn~&;G~Yo_jZ5mo8o4(7BdLmAEQD&$ynv9| ziz1q~=a9CZKFt^1^xiIG1@YQ}$-coL0w10CzwQ!S4`ZZbVz}nkb@HK2{h5u$N9o4z zebw-kjFf=5;+GIfVPy!p755RSoAzc)dkLT)gW29zy2dqK=Z?8XYSZJJ$p}jPhDq>K zNWQ+-Z71Qe*Q2D3ot32&(bwakjqT;NDN&G2ErWrUddtfbF_821mMsKPJ>KC4w3c_e zUR+pzfGl#Wm|SC0=Mt`@X!yi&CJ=-_E{*c9&LgT*;FD9ZAWl#hAtP&2K&DT`WHkkM zkr=Z&2s(P`*&lz7H;sW8u?YQn3G1m&04_ zb}zadp2%=_{8fQGa@P>{WZ}GWGQqm{$ELIFtg}}hj#!(M`HkiVMy{F(o0or*NZ;8& z4{~FisFVUs_+(6Mqb`$zOp=aCIzOws!}Z&9<5qi7dr{sbGLZJ)?4Sh8q|Wsb_Pt`m zzG@@H-&J}BF%n~{E>exHGR5{vyPfXxz*mA%ERgZXZ{;>k_vp<5_m@a1GoM)uWmv~% zglWoi|6xpGo>`9I>!YsyR&I69E;Y!b=?a4dR-6WwisRF)z=J*c!rCI2O_3a#Mp$HW zqz8GIPSb6h)ArjY&!hZL9%=+Zxg>Tv{!z@lL;U;eDn^RFm5$`B&@IyCP}A`Y3p{sL zDL!%a;j_wa)DpU}ge6Q_*}2(7CLBL7ck^ZRsn$)F(W#`htqp)w*@{%5howF`{A~zxGPCp_^PtQ$_ZvAlj`^_DP z|3$u^;z?I)%9F0-4ZtyL65po%kBnI?TD`4<;$`nI+i$iGc8cv|2x%T59|IT)n)m?? zes8YIKWp;OI{v|s2Z6WfzfH#R(dZb$u{V;N3PDtSN1mznpy<@c-{^PkNfI;Tz}t7g z%=;WX#-GLP_BKN23<&Sc?MWiCV9b$H^dfjNFmD;1wAhuF_Ei=)twv{ttK6euT8fD- zl%3;DU0a~*A~lI{>s!Qk6x}-3f*7?JGq&=J6w~sd!L$Y^rc%29XSip5CBX>GE02W{ zwpK2J3V7>k!f+h4mn&Ibt0^}S0A-PVdZAFGviy5>NFrBLzUc;$@jYSZ@Fh41_fx|@ z{SCleVvWhIQwWqu&5b*6lE2Zh_>TLjdJ$)C?l%$m2yk_adx(v3xRPWO=(g zgMV(_o~T)WQ(MbAh`V~EeeJ9a`||=x$MA@xIJm!~_mS|Z(Bp_0JrV08DcGUj2~&-U zVRk_0&7G<;zGF1;c^G?%p2d4lhMY z3)dvBWNE%~deBt{h(k$OE>R*+T)$>TAZE8ekQs29evB&Dbjk`C4D)CBHnqqrAMjO} zj!|5G6-NSJ;PP^>fpKMAWms<}rqP*5Nr~GAV5)H00%w7KZR*>EpPQIBM}K+y?YDAe zo-nU!fkrhf{O~AfBB`s6_q9&qnA$I!&dc&dzctcgFR-+wKXsE}c+Mx#GRw=@8U&ZzQ=rks^3tCxbyD1|}E;~Mlk zY{>eIM}iN7xH6S)(9V(EBtwm(@?GvPyrW{X5;n^1*UP~i!wdf$-i+yAFyo{|UY&Gv zQeDTI`S59^2944iz;NXVpIY))O^uX(yl&uctDga9@bXCcF)CdkYqh++&zt+j?D`U zA(~hlhjZ1CX$eDyMK{*-``&AH8UFa7hcQ}Fcan_A&=fZ)IizGfdBYta?5_R6);xUhm)1;_^WmRXp>B!WUs`zS!b=^-TLELv!wUG;7ZZ;?Icd8D0 z>>ls$-`QTv7x@){pRFT;?`724ocbHC_UNvD#2mUx^!mS6MZ&tyO4i^ci&zgPw>fd= zCIryRutI;-St*#FZv2qvtc5QM1FP8EJrpNGg_(^rKFu)(kUZBFNo^J3msiZ$QDfEn z&s%uMNU$JZ`8-`4DO%}PAo|rJmzyIHK+u#ru8LU=eWW!fFafmr{P%3BZwYT!u*EaM z7IT6vW))pLjsjy zpm=WjS#?^9snZjcwGV_Gm%lxy{QCoJ-sks_J+z=Vh4nH6W5#2mSl*88YQfllm)4ZlEBhnTMn1gjq0o8hO4c7P z@Jdxmh}#$)ZEB{K)S~|}9-*ZD757U1WaRKjSBW>rNA42R2L0f0^ej<9+!j^Wvzgq4 z=Aqm+|V`nV6gwv#eFbC@Bt&|Lo!GHtr|HxRrbT85;)Kg^^oO&1Z-#OOycM;)6 zhCwBzfjXJh_F<}EGxUSn)ocK$^IPSlbR`gH+{kSFf(=gx#7xPmi;Lrn zOPS+Jd{_)3t)Twk9&PVG#Zd8XP4J!DccVAg7Frj6kZC^?kOuE#L9WWpvQEGCX%szv9 zJOIhj*BlW^GZd2`MHrzTd|uQWyW*1%bjw=334t0Lga)0-a!aQAtHUv+7P48G&axg# zMs{H-N6-WrugF(p-gGo+D#sRt%P!Z5Eh^mm%R0CAjxc68&f_Os1m>q_Z)-*Z$4Kn^ zeK~70;N&zK9fgN-v)T9X6Q-EB97&o?tLj@MIx1XRNs!!lVxMvu@=;Dd`Lz~j8uRd_ zw3r*GlV|3HQH<>AASO{p?y}FtWa-F-7JxW#k)m$gK4B~~Pv(`!EWa?)2#PtU8M7gw z!Y`&6vuTd0@1UdqU2j(mBI4t+{&Av?h%{4IdpHfEVi$*q+1d<3ExHGBGg!FhReJzS zY&w{ARP-YfLTg3XLG;1qCNTU;^!+Vz&>W@DM)Cu0?}SJ5>gr7NdQN#dWZphwY&YKs zPl&PpVbQT%?v(#OU@YkJ`WdLCz%-)AAm3G5fTk7~^q^-D*IZ*{Rx9v~#5@|EI3Y+F zw^pOc9Q{O|g8sJfUz(2+pS4w)wf2YC!kEi{X9BvWOUGKTn1Kaowe_;6VowpWO7=?<~9glH-s|GFrg#4zfg!E8gr zl5c8m(w~w~lN7A^?kqUw?o6x&<9=c_L}DYah4^cq*1_evyAsSixeCISkL@6`+3RT) zFltW!2zhWk zj%*%Qb@L8rr@bqPK>S&Dsj0Il={o@=7fcs- zYn1yeS*3VggV#1pX>~%pJU7mycsbvN9~Qhl36~tW?A;r27s5klW}ahnP8)4xr+Nlp zq<~H6XCisX{NE)THAO#v$Zg)I399V{l+K_PHO7iiUpyM4x+#j1R03W02(avAtjo&DXnE%5 zIdd2>S_VD(~;zE$gPQ)TLUKk`zSHNq=xR;3gI zjB4fssj1I45G`wl*|h^2q$aoUKPYr^<%7?nhDtjZBDc_Zk_X2krG_jaJ<^E&`!xd= z%6*ZXrWH9EAKrqR-{@^UyRb)d)Xb|a^>7A2W>Hy^8cei16%S`VJ!LnM$#Af~-+^UB zR?LTyv0={OW@Wa}p;)EIrH~?X_BPh5%EFc@btaRauiEuc4DLt@TMH{JR4e$+l$O1 z;aqEa6Dq8&41_L!)0#(Ait}P;4)ZZ-6(=l)S}6#f(m<-=jQ*+w(tMptfr37Gw0o(` zk8(F`X{TlHhOKTef-b6O{Q2&NE$>PwcCwl36q8u4pD)oRs@CWXTyFhyP-=jPT^NI) z&RH@7gb{(i45qA6AHJDEbr4F*rL9>PM$Ai@_r}<8-FaL)!Kj3lT+gp$eX*YY5E#|0 zPdu98IXowFjsU1+>z$$bINs?-0Cy)D2s#mf#b%BUnDw0K@-LD zd!7+f0wPf?;-@i;Zg|PaghxmiEIxQ2k)1@8EqXHNeG|4+j! zi!J(JUE;9W49i?i+>7bbhDI;nS@@=yZEY+pZOlE+Qu2$z;HXGwG-9^9&{{qnB7{!F zHYu{&`GJx>f_(ULyQg@p>R9MZum?3q%)q4p=wJ5< z)}jOwiXk@>u-^%DWo+X7OLl6K8AZV)y-QXI>O?V!wJgz&LWrPBy+$PUSW}7^)ewj2 z94g_ndDT9W(nIq~-?ZdI1|qV4`ce%^S2d9w?mbF81itmA zo>@LaC!1t9{nuy}VGnn*6_=L&&havG$r`_DB>VK6{+myl-%A#pCGBR|9=ISKEY`=n zVU1P;gP^g|;ABKfJcl!V+NvTam)3-T6h1}A(O^U(WtWrBx>3_L56OzaV4vK~iSlLBmu3; zqw@AX?2njDH;bPxG5LaFIpb|Q-5Rr7E9)0i#V)KWi>;^Huyc}oB4W%U(<( zaz#h(2!!H)DW$_TL-T)3sXv|b>eoh+D>41v^DXPEcFDy*+CeT$|hP&T|gdx zBpRuDb$EM2T=*i!?Qg$!F;VYu;?9M#-|}xXJv6(=^^C1qCtwxFZkM z*vRNo^0)5%$(8x{OP%JoT%H~1xSwa|gT$pPyeylR>Gk5zMO@(}kj$H}1QL}pG#fFA zif+3UAb)^GHViee(MYb)@uQj>UiSc#ZxZlYEMvB@B`Z3Lnp6GfRmE*BAbh?6vwA(U z8O*Yjt~p%aWU;mB)A$99YJ$*cepzBAcwQI27WgPb9s0C0lko;pWB+<2pAR@UW@9Kw zmto}DuuAmyuI%cPGGlh#yWC@ zNa;$RluO_ayCS8p%-%RnX%`m#Oq$mTp)1gBK^Bn*K>)&C)zg$9>1vF^vOFY6n2QyW zkJCJz{G1`TL~HaoKW4O$R3HxJoX$<(P5z>LF){%EOY13?Z)nPHzvpGwV!QSV4fm#N1IhdV&1@ou!4U`cDI9xt-B%P{*|! z71rK#wtO~iev~l@1YYN0oFTGJR?mFT`*Zo8%-7(nk@F~DJZ@6^A8L^Ki$#jqJ(=Sqw*3<6Z+61u`?LTt%(7Q|S)00vd$=y#zhrO~;i(Q{DRSagbo zFA@73biI<^V%VWmoJs42fC_Gd1H;x$O@<<*x(0rPo`=`8t|1KdO#UVK zMXiEWMVkQ|hCL;(1-v)@T3lNoG3=G`wE}u~%`W04NOHqYOsZXrfj3jOyD$(Y|ZPZ>&`J#IPsWNgoz}@GUdq) z&(u0%Wbwz-wgH~LI57~{tsHs@A5Kw9O&PX?RZ{|)>#=~$*MsYT_Dswr)QCU4(uN;d z-)J1~$?bz}4Uk1sI7~kBQ^n?Tvl)2S+724g5C*=;2B?Oj@#W(oy4EPl@}`0~DP^x! z7p@gLle6jat7TAF4XYd*nNsa~p<4ao)1Iz@$WK>VgKz{hnN$E)8#oT}AVn1^{TeVi z*^3boffi*$Dw>ZM5W$;lQE6|QneC&W7J#)lRg*o@1m;$Ja$XuLaYEup01xH z+=K}LxzUd07pE!v67;yTVK+&u+H2kNQ)y7-V>UTXFsMwKCH{G%fKk@+CaDY=gBzlOu zXJwHB*@{QW0MWFx*NzNS%yW$Z@>THx>X??B8t@?wlD15Y59Bz2w zHU%Nh1LCJEI&hmy$K|`IL2M9d05s8X9G2Gept3x+(d|gHS|O>>Ohl%d7d7A6Qzw7* z)mVkCH7gODtjDJC7D{2TL;%1ziqry-xYdtKFPb-IXn?+#0puRQboUzH6ZIP?4nj{3~hW8+X@NwVBw?rWRvlB~I7zpeI6XXzZ4$X(X9={efI98vk;( zq&7|jR?>&%O1IpC*X<15H6j`3!Y@7SRJF;lPbjVKF4%-c8$*r1bl0fNfNZA}wvGUl zy7H4#)*mW2j|@gCnhMmfv-or7F}9L~{`2o60l|{(HFE8frP(dh+qz^`6Ep@-BdY_) zt&W+`!bzwsDs>+_QPXlf1ih+4DDjU^yOID*gEv`)%+|%S|J|z8DcDzbzV}H5r^GD= ztyp!Bq6jCFLc}wIR|0wSjb%7WS+X!{SwZP69IYKljAs4T(u@XbF%;L$;nLW$LulvQyHo(1*f7ukJ-k zu%IxMWFEoObq(Veag$jyMVY6{@i_C>$&l3}V(%#jpfi^6XyGX5x*Lejgx-&oH zC$>+)fh?57tVrr2oa;!+Ahl?DSC7y}9zn5sc0s16%xc_AP^EphXjnEgjZkYd1x=uUg>5J=jxK zRT&0gL+Bqgi89pP7;MB{>}ttB63j;NI>T|g!f0sp{211kyDUD4Rap7UeC)<;RHVf+ z7d0|}9_+o=%CM#7XUT16ini*_UnLhYUQq`*2BRP_eUmT%_YeP!(XJ(P)K~eQfrPK} zgp*y+U?av>1WR4puAuWsQ?{YHK_~f;gpK2^uGC*0!>rp@A1BOZ9aZ}sU7ujakkUr4 zVZQsD%#(_Gw=SaCZbMpKzxHSO%CwVb{gy%1MR4bxgHatT>e9MKG-2g~qC7Mex59%< zJk~E{g5XnQXrPm97{*Hw(Gvw*9UXga6?Uy>5skGfNTL-`H5&7U;!4N3e7pIkjjqK7`NZQ7RBN65@ev3TcN9c1#wqzE__|NwB_w62J zhzM<}zM0&1^=-tvik!+E#SiKURy!U0{CYN&vebY$YSTrJ$HPfb?|XRM;RVpbSdn&O z5;j1{JQ$O}tKkZwwV5UE;RZHVpYpL1sX1OXbRfo&*kkaA*>k%48gORvvY35_>Nr>V zNK86q$2NS0b!Dc_dH*tuhBA-fJRh3k#D?nVcoUojvTucI9Z5Sz63ufR%FWV~Jjedk0c6kGsh)=C;!~f!GM_{Srg4*q_uKxQ z{mp^ijm;CtS$!nFSJo39c_mkcK|xAcEjK&gK@uqT87?Z^@(RPb3a)x;aQve(wca80 zmnIXu!##udr34uyl!bH>qA8{G(i9wAcYSoL_M`vRvY%bjjL0JGV2v9s)at?qCW+Rt zM@wuO9K-6M^>v(B#ijZxE+ti5s;Z(b$NKtfM^lD%z(kmcb8?ZvRLGgnq1PahA*4JH zQzbgs2w`1CMk9m*dQYMFU_sHKJeYgxv@~YGYzC7aDNCSz-SF%6jxa*&%E-gS+!U#9 zLcIU9MlZ?+X*@GKJIhKSo|?IDzg?dD{qL9O7W^0V-|19LYdsUPverpfK4VtYPvbK| z`#z3a52Erlb?N~hZ9aDHf8pW-s?eYzf~CcA14zqO)jL|&UTh^Y+Vd7jTbz?vYGP1o z2@b^3-Vuz`6@hx&OJbhaB)!*v+BAJr>%gR8|@cDAZ-0`O5f-7u}!uqYvA%~QP`$&pMG4?O}=B0dMTy`!0o;7 zX9V_Adu>&iQCqLU=-Lb+*9@-yIfOG)9~s(EKH~x6@YTM8XstG9420oTC4@&HTplzr zb5v6AlpDj{hXFhDF}S1j=^PxlfqvFp(v6B*&>m6vLVpP{{IUX_|GpHHg1@HlNmZeaia- z*4y8QR4MDM)ruMw+7=I_rVWx@ke-ySsiLF>PR54<&b|vZr&kIATMd$Cb(v1zfuV;EDGw?*=wW^MXRH&9AVkP10rK-w*-UX|607z)`w*O!K>$Rh&#Vy ze)r7p!}weB2JKgG4!$pBWd5~x@CGaHuR)NdOQ^n3+7mC{I3859w}i8zYKO}#s(M`M z`jyqDm3d!pHy=y7eswJ`NllN5&S>QprD3!9m|qz;OEj2E0czO1RBVkASQ*!f6*;Cu z(i)ncIwo7Vc!JMvDdFR#rMqV+60tln0OH) zLQr34&|;U)AtRK?sY6>p`e3ZmO5p3@7W87V9Rq^~M3E!0QE&h1V~3e>IVHohT^TK%j~59llRsZ~8B5O%9{%zS+sJN1Nw-N9O7$$Io- ze?&nPWMsGi=zj*%ViekJJV_Yn^N&#?A3u60}M|$A zxok0mZoQ?T*gcIM>f#z*(sDv@oW24<)4UTIpDV`19-IiATYMn$ukGJeH@LmZVRLG| z&@!Sl{DU!bm_R>{<)--Q*3Qm>84&&$6Tpj(hQESk7)*!W4(fC)yk4{cbacORc9CaU zt*3JWBj_P%wl(+Q*2uXVWeJK|=^Ry%pbp{+N~>JUvBd0x^-lc5C4#uSjITqHJ1*BJ z6=2`nDP`jersi?g*++Sb4pJd`)Q++glE@rou<}&lVUPKd%AGd(gR+i3oB={Zw^E)q zR;ur^6f@11zE|n-c@~grk8mwAGjRdXp%MqhoM7|l73flXS10ylmpNCf9T82l=4diS zf;R8^2J=qukSJJNUYd@xOzBbWV>d2P{M&XcpT#dDZ?VkC7sJMD0CT z%SO?(q~r$1DY0UV_vG1klvh>qg@-#DZJ9fln-6+m5D@1zrHPSBFz=$m5*hGLDmD!B zzHv2C;1t%Mr(3TftlPz?olooZ0)@Cb^5P9;!syllTaUar`GBA@A9P`~T4ip3QhJ$@ z<=R;ANqw@Ii|9r(M;i*@62ZGcV_pjYJnINt2+{xCd(x$n7Ys{}byX>46{bTj4qGRH z2WaUXROBbLK|eN+Ho_?yV9Y)|LJKld06|!cY@oFHGZFk(jT(6n&m*#WPU!R z;Uovvce?X$EZp000G!EJZ}DCqWEsAzi69>c_*8t#l+Ku8xC7RncN*|OJFhwB0}3ox z)DmgB$*8Natg^PoAs3w&_>S>`PFG#(k3hREw1nhp@~}M5>{}QK@(xfKV_F+RPz>v?lQ#TO@^6CmO1Oe0rtiTUDtoyLTDL#zHXM$`P z%{ius%mCZe6*3UzIF7snKppWF6@SRt8W%TW2>^~$7uA^7G31qPID%Z*AdNP})35o{Ia$8i-7b~9wcM&Hd3ut8ur_v=0IC939SJcLB~M}-$Jjb46)k4# ztxx`zze58q(kZ7u051Av!fK8bnuGmEY-%DC)O7;?w~UN4;AwQU-Qw#KiS4~`0<3|; z&2%ZG``OkH&$U$g^RNOFRLQVa z*F<-5xG`5RmxDR56diAk&Rpnks*Y(2SHfwJw*6_#LZ=5G{u$FHA*h5pkhUc%{2s?m zy74ed*O@!DbA?c|vyHL>hsJ!-;2q<}9KOs%IAoUvH~vmB)^z08kIb5tUANZ+l@UyP;f}i#~N)F;kEjsFuGq%vzS?Z37e)=U|Y=_CB%ZuyaYkM4%omPwi)x zW%|x!J88O4k3DZ!<(g2HRQ(Tkbk2h#0`MD*s5s|S+{k&16-WfTHRqG`cCz29>$}YL z=FbBSwjSx~R-fJDE=pHLU&!xvtV;b7iA5Z0Qd%xtw8^}@_{B!UMh?KjPEXcc@O0FT zX!T#LyY+StwBO!ex7@iyUJD zdfvUYzOv!)w}?9wE*+F^P!)xZ7lt+q!!FZPx0hcRlhWviDpz(EBA%!+Rfww}fGRTL z1JjJ%az>=ktW_i#8zDP+pv+AcRxwUZ5TX6lR8z>dy2fl%lRV6~y)-GfHj^|;4%zw& z2h#IS(ukh(#z@#7Xie&~PN>jpCv_^xLmbC0y+^ufaLbDY24Mh>)ExZ5XUnd;wET7S z$zK%RypD<6jX-53IixDFW)Lbr#?eSKsq6cs#0ja{2Qxdz1(Gy!Bcv=~kF$z8! ze1!ZPI0e89IxksCU++7^GZxY!kI(pJjL+D5P46Q5)l9Ey0yM4+1(=ZlXYu^1qh&GZ z>3A1!#JUGe(YAOZ4QDP4nQzcZIsj;|+<4a+y`FjX74AK^P8dKsxfx5rKA~tjqwXAl z;h0PEwnJWIgWXaUh_8w@SD7P8)|e9oc%>q7gp;}+F9!c$mhZy~Tg84SDQ+p0$HBmx z5xKfLjL33;!|a{c>W+hSj0W%z`jHyI$@{X5yN3tBpMT0a1uC8J>$aiBl#SyA+ z_cjDK%v%XF@yfQ_&KHG8x$l(m+`O2`b!N(XANd7pq>v1&S94RHt%OutUryZXG5utR z^R+Z4RE+w&nKZcS3nxHSvlP6e_x|-9bFO8RzB*QcG2KoAhJ?jkA2sba<)1nT zg&m9rzIA~=Z=)QVO)sEhccsgfd9LEsaa}^q%lqp{i_O-Q#C5=i7rs?GF;~>5CBR!+ zz5c+_&!~Z~KYWapGS<^d)s5EAJk_T>gHmMM{D@R)OX_2S=7$6sg#J$ES2tAna~7x2 z&swWh&%bR08E`6Win#WHFF>se56XFb6t28|C4obp#-YBRtjw zd#{dPEr_TK->KsNd!i&$Dul6KoqdtO`~^bu=~^3=k2833*1l%lXiC=h)3ps|tql;; z8so2lwSq)=l~=I7S&+c>T~)KB5lgy?LV~-s4S(+!R9t4x=g`AR)o+jlFNxnszq*QK zPc_|Bbeg=;}(j&7G<8d>>(G0`Ju-%_$RPD_Geu=LYY^~}d$=_k|mOqpUA zwVl4R($y)bmV2t(b1omAv1kPET)Q2$bp!xM2R_9U%j?U+MW0??o;Y-)M62xG#`D5n4IqWKv4@X65ZjWvA)~ zByBg_{BlYMlGaWTPsC*eS8Nt@?0!!fCyaX(#LtNUsW;u1WP_HZC=BBRQg;-qYCCUE zzrf-dUiOh_CKx)`t8Z21*lGUTG-8F#=&)Y*#c}r~8tvpBpKG#j2~j!d@bykY%)WO<7` zMGzf7YMALW6=KD5u980D?wn_zB)tGvDI{$g)+;E5wGWf?^O0`q@K6sMRL5!6-56x0 z7oul{YS+f6QKhB%5T|~ODp>)E8`BEm1RlFf6@H{=m)SK8h9DYsjE7L%jp9z_=#J!2 zz+Q}{zkqvgS4w3}&f^8=A@TIw=IgRv&F)ZohB0 zON~w=|A1&BY`J-1y;WiT62Ueb>#~o-eIm{-OQSE;GB(z>*QoJ3TY?yI7bdP)dbe}m zN%&yg=mL6cak)&o&qKGSZfb+3LO;Bs;)P*{A}>C*pq0^{&=olD4#7$6zxWxdT>*yn zr1b$V?Vg)(1gXo&cM(AT8NoZAk38>Xpp(NZprYZeS6&GNNXdnPd`blI>y%Pps8vSB z1(IHW-rK>eln801?J}WHSJlyL@Rw?ORf&PK@`t)9m8j|~+EF)&F2OgW(MO#*48Keo zbg>l9pLBP8O9dG~REmtoa#D`@kt#)`T4_b(H>0q6a*!-$m+TlKNJ^tkJ&N*fvGUCL z(_C*ghlP;r(~f%e=1R@Oo-52vr?lGZXsspF|CyTr;OHLN#z*1$Na?NUHT(qRVT)bDVj}MfzH2Qnourxi zd8U@n)c2WIkSS)H^m$dTm5uMl`U2A7z6HjY;a1q`3bU zdL9GgWPa-hKdLlq^|&zca~SyfytH+;74kqOS5X0H5{VJeSPaZZ!EPNN!I|45f|R@e z^G`Z|m#4iSK-S~c6B0-_{(Dd;6xi6>qUK`_wr(((h zD`#SWHsG60zYTKN#=KhHpS59fX}XOhz_X3@jXRsFofk9>KIpBdC2ha}PB!nT-8TKj zNlL9~smJmDIDLK)e`}i&U9LBcGg)>YW-Qk8HLdx}D#-*~AjU(J25*A)YFUCAM+@D6 zjtAQYnl09K^f2DN%QlEnh(QE0sUTatK}J@imQ_olo2^Kfm1EJNbvg9kx3TfGtf z?0<2Zb{f(E!9Y@C+NNNeghC(#q)jiW$6zP8A(+9?koVX3+0`Ryb##s~p|sQK+rBN< zkydwUwOZ|^BW2VQ2v*$J3*8a!(s;7Wq+*iu_2edn_*dZ5J>L#^ZS)cG6>dD-#IGFQ zhd3VR)x~?MFEZ$PC#)2?uR|c^no6Yc4tq?{lLW1}>t{R_E_U0+#+7r*=z3vc#qL$v z=AKtDZjV_FX)U;6fHGgLn^Lyj2IY1GQKaVza&eV#+5~8%5a^|`G>pc+%>6XcgJe&u zocL-IgQds{hA?u%YE3t)_MP}b5noeF zpJV2T5c$?q*7Pf0@+`%zjqKpwSj6Ony|?cK@k)kHG0LFi&ALsbB_W?i|0b&#MKu?(V%9duFn;Bx4+*tu zWoCWa8SX~V2+Jf!P^z^Jkt5xYrr(X+gX3pyNv_%GRO?B?N=EZ&{tHKMx-c4znkI_1 zFWJ0Q5PRuUb4!{Ei>#&JOs{;5AeTuNuY4>pc|Tz>m-R5Gkgi6H7fw8zFt!V>Hr(KbHBuj4%-x2}QR-wYIk%VxYE> zP>w5)pFLK9<*|$5cjuv-w`zDUqXnff0Q}@!nH>|)H3VnI@o9G3sx3{Tz2d?Eh}i|lb>v&M+&@Mt0G-Ll`SB9ISWY)W?{ zQKGPOK084cECyOIKNU|u6-*(xn>w_T{`+G3Z^!oEj_to&CrRG4%mF}eU*qrHtg)zU z-JM%oSIw`jEKPa0W$xTqj3n7~Z(%fUQ#M|Vc@Iu^7=d zgfU(_N8&@@2E@f5e#?uM{#I+pJBKjsuKlKEcYw!($1&3|uGEVR)JrZI40fPU+760< zO=mopJ9OV$*L^Jm*-*f5^af|>I3n(s;qW4kLGDW&i!;iD)4|i> z;E|tXHIREOTyH)TIhyoJm-P24v-o*d=gK(0WlF+oX!$6md|@804by?N!We_zD7 zFB&llswYsD)g@*upnQ8B0QvLY#~`YIOMVvXT7qX=z7VfUPDX6GwS;%2L?TqX4r_30 zKJRQk@9Oe-m*vBG4`I*pI`-CVIyRe5T{fMnY;;!5TAjAdr(KuNVO@0&AwO!jdkZeU zq>t}@c57L7Y*}_QEZTI&ovw3T||7^?sXIt)d zTkt=p1)qb8gbNOh@$z6;elHc9WtDi@7SU}nQ(0v_#^d&cKlhw9n6zTKeg&5- zZ4p`?f4H?>-pWtWctZ@awq=Ntq6}HDMvZAGZE35(&k88T{X0KjbhkREvyO&0w$^Xz zM)8}{U$Y3rnq zjrMmtN5F?a(%)VCoG1tosC1{62`P&tmmENIXXCXTc^`+?&O3)E_o?b|kxw#o)0fSS z=9`-P_rW~-2#pz!$jWm$7;``4Ajv)HNl(S$Que28@>Lw6m#Qaf{b;oLBzRpuk$ZrP zDAl=EM{ni0TRr86npfa8+0pxhy~97Wa&9g*p0T8TK#cP_@R+T0*vb;M3?IM_NsxG>>8cKJTyeZDvBwV>Db<_=j0;g zjWVM?2evD+sSVBR5<=kVkK&^}%Y;}VruraVb5IIWuy>FK?PbDI>=4bw_8J4|5y?L` zZKP5GFiEHfAU^UBua0R)hxtvFejs&BQH{^Pe=v)*Fad3OIhtovMH z{bz2aYJ0X+$ot<$kzg<*ElfR}i!_&#Y4JjN!QFlD^lQI|Nl5$PEi^Z?-n`v-2HMQ5 z^tVmqSpwZk@z3Yr5ppY`O7+jGP zs%~^?msDmeh!Gd%tkn24m6|wfr@e5UwqMz4Bw_Ue2}{Q4jF3B9fLsY6C3>8UZ+iaa z=|@2+(X5XU_{eUw6c^n?xb*ZN+nZ+M7fmFwQ@-vhIwSv1-5kNTm*v_ryFyj*pTAIk zv_EPk5dV>hFNeG|zPy23U0z+$H0{mDw-Si!MoHZunGVn{2_9LD9sxx3@jydL2C@a5KqV#SuWn-OZ@pXdVjJ@N+fDSQ>#B|0tpEBr$) zNOG0Bz#=e=@{RfEJlWTc>3jyw`Pj&XIYZi~J`k*wI4ijrwJu~srLzV=?{BC#B&fsb zq@u~^#99d>(sDW7wA2;^DY7mX@xigR00FIfczL2)-pJmo2KsBctx8{Gbi-;YTXTEA zeMGsMF$-g)QQ5cB?Mc5w7fOY_cqr~3v~D$>z!^8O&0ES&+yQQh86Rf`2!Hl|2q z7|)7U$JYzPZ^6clsfWrIy2IV{rJl^tXQ{N83}UEi+6`OYQLx#PMq(dsSH`Z3-u^J1 ze$FRR4n};ZvXZ(4pLN{j$;p}MB$__v0TiK`kN|;5+lmP$(q!UO7Z@G8Ng9}vEc+FF(2LQ))f4X91bL6F!WW0Rwxe(t$G_>d7ro0)7fljH12c` zt)e80J@kQ8`iEtYp43r<-HdCM+O6Cq#*~&gy~-oz}NTyn^UJ@@3bRARQYsi_ozx#CEL_>rj7B z@jTrTrPfxi1((;Vk34^qd=Z3B_4+PGRtrKBAXfN}JAOc-V7{>n!EAJ%%Es5CAUp*`7XFfXY+I+y`=|Xv*;FESyo}Tf|B@aT%-Kjq7P+*;<0g9QgXq$Lq>gz+Z za;w|fqDkyKw@?GFt-3G<-(OWA8ShBG=@Klv28W>4&IZ${2g zF^8|wJaK@a!$1fQ$5{%d!@Mb%@d+w~BBG>Dl=nCIpNFmHLDuT6l(9HR%L^SHnJ5xx z_U@O5kM9Ym9%QL884;bd?1W@a;wB^g1OQpS>?1yhrN~eOOhQ0? zA4Sih^#ioV?+)cyjKBhcYlvaVKTiqK3wGj9tCPbDs9^w|UTs7ZeMaYYHvKk?!5p9+ zYF26n$Fx!Z!uQ2xk>ISC%x8_t9yY;RtVg~qe>0Qkk*O&bTxT0?Bi4s zW!)7EVpI+VqES;)yqOk}noc3Iw7v@1d?cbxWiv?EaI#^z#JtCpA5pu8l{f6P6H#jg z{Y-V+pNb@c&io+UC}LoCf5%40uS5Z8-NV7h2x{WQD7lQYHa;k$X^dt&i04_sOqe_8 zsIbyQY&tVzpbkzav+LvCw}vv>T>rk;*2NZ}X?4tbaZJWJZ?~;rC}Y?Ym8_!z5y=d$ zJZLsV8AIdS2l7NXv_Tl0;$XG4VeI>(U4&DO2&IhJGMz8e>X)ACuV>Mxwid`OljFOI zqG~4Z;H`9@%v(CTeB(>UgxWX4RhD%sT5Q4h$ zARz#peNm@qG4{*mPcWIW3&p9H#3C_l(VRV~>~YT6b6q)C0wb0v2|H2|eCp3OEm@W1 zXAt)5#QXwF1Zmgm@mKs;)oY4js9%R_Yt``5X=<0mpNHqeOQpqQH&AW$h=QCSy`%R$ zIL+TITwf?v{}ZgNeFTyDQc_7g{vsqF5#&E_W#*%_NTs|2FIJ14O(_KEK28#nGCa>q zYOOG>+;bKDtPB-1Jqv6>@gzECY+PnSC{mrL9y%;ByX zkOpLPc+o`;D=RB)pToM_U7jy(E>Bqn8$Q}bvweCOb<|At0;#4bo|ag)b^v33Ipz5S z-A_~-Ge`Bx^Hp7(NQa)qKp4cdL$nUEwg#gcz}2nOh*IBPJWmjf!T93x>ekr^R~%=W zjvMW^`ogDBTd4q>8PPs6f!%`obLgSXQ`mV>WG zaIRONYsTrusUX;+!NBUfi&0+=uqhq2O)>bprWEa~%d?aF79#f}9+W{W$qF}93&kYjKN>cK+LBoq2xXSh zb_b4uv?$hacJLv)DA||4z8f6(oQ~$+yAjMFPz==txUu35rKxi!)iwqf*t{pU0e;y! zOV5CiGOsveEe~03-x$l!={7)Mqm%ieiu@1WzY`;a+DF)058v$4LOw>H7F*6V>d>mL z(agbmyBAb{BXto{7cMoTde!C8LXaqqtq~1>Rl+nimS2s7Y4~X2NK}p>V(SpcPiU`p z1<^BnTyiSj^V&X7yS!fMcTv*!osZ94!#7vA3k@q3qrMC>>Kf^=i)m{{9ZQ!F^XZib zpxz%oo%iUUijQiW;164SJ=NJ>YJs)WQlYlTJ*ll$os=%C@nv!a{Y`obz`3H76rCl! z^zLo3HX9Q2e%C1^rY_>Dgj*-a&Ge}wPUNRO_ zt{B;P)}MRQyyd>S8{tiHqFz&x+F_;ho|GG{sy9r_&x(O=F0EpyaYF2kKb{3ry_V+-UEp6LC;NqnG5|NO@{b?Ze{Dw&MWh29RYYP*R>j zuM~{pp{XvkpJ@mio% zxWN91Woi*lYc`rw$7(6N3!!Poeg651fq$2$inqU2B=~HK<`@aLyn1^NY$PG4-%V3F z(}74nT~RqB2KqY}W^d{>RR$Wyk#YhWM;lq0YOGEWQ;fQ5l`|5&vC-Fl-Cn+Pq?kzbM@CqS5L!dJSo2rb-?Gnz)DiznuwK9;;q#%gja;nJAn!1H==J`>s5NY z{(Yh<-2LkgSjL!M{tN zPQ_w@Y_bFZtF~XRyCZsmK`=T ze38Fuqw_L5Z|l(jjUBZqF9<8PY@=v1*R-Y1*TmLDw^9#C^TsS9#yZ{nJH7&C6XrDY zDSFo_7|k8Gk4>>k&a}Uu_#=6$a!kPLh7?~_&~9!(tFghUVVw)G8hVIp1Z~*SREj>G zQqi2Kw#?S3enphc5PRuGGUv_y6Hu5L7nu9&@w`{D4E+ zXB9fscp?W_3J#a2%39QkQ{QMEbKA-4OOcDzN8*#4E)l~!L+Zw73~&xkr)H-WWGaQ?Byi z=PzR2a*vPqZlI~+5}%W_2)Fk>hnBf!polFkDTh?FH0{iqE<{FntbQ~yiE}=jX}Ej^ zK7}xr5t06uMJ4X9v~O8;m=uN}0pnlf8j}$um_@Kajm1XK8`eA;^gx8CN(c?-ekxb2 zZ!oz~dm6W)hDlDI(CrayN3iJB^Hv8jh`{N{C3!x+kh|ET5z#pH3Y#~y(&Hi3lpYoW zh>Ah0>*V!>A7h=_wmf@kHi0tQSPcE&h8u-mA) zDIyr?aU+*!Z``@M`r4QQ&qb*nTnduu-wWgA$YCuxXj4$hE5t5Dnz<+CD>67j+#$jf zylM{&e)8^|vCi>Rg>|Zw1(&FNGhxv$Yvd$7@}jo|_C?5&;n!94`smN^R9|Rz{E8lZ z88RD_>f&xQ*VbMx%emvH-NP&Z@{5>-2ePDhxL8F{vK`dy`HdoY8G$- zTISgRSfLvn^2HuJhyjM;my3#IvT9bGH=Vb^h1XV^6`LADa}1O9NKkU*YV20j@^$yO zke0Xky2_;EMqjalja=;mS&(n?D@|ZWD-3T9S?fmx=#WX0ScS>@q|}h%9`U(`b#F&euXQx?qQRJ3g@afi>kbFsBu>yWKfSB%8kPGyCIc%az&9J0Q$C86e&KM|L8d;5%{fviwkq-2 z0^8pdrau6c<8GupG5a`H>_fzFl?1DF4*EysC|z08Hb!kUGu0d=@~t#49eHyQi6yKY zXSE#nmaRVR^LlQ4R7AWJqNjrWK^%3~PEosc@y)g+Se%dh_+UBgEmu9uQpZ)Fi6|n5 zi~EZuDns{-XrUbW0vd5*Nhgiu3T52>O)1}4(*1C}(*6_cJ8AHp*Uf14Z<|=6*E09j z)H1%h^Xl*l`!8H$Jkhd)tPW0{lJo}Y4)6u>cq?cL;-zRrHl^&9{>I5kXLt@=Id2h@ z$pxci`%(_4>Uy>ZX4{UIb6*|9jaZaANr-==e=zmKTyw~AMM=XXAsY!J{wO9whceyu z+F%+jYxadLZ8TdBE_wn=uQu&O<)so0*3}E0=u%s;!>AGyViTO@wSXcdlcT1Ug(*jzvnrkfH-H)KCh-)je0_Tx!XCJ_Z`R}k-A|3C@s#i!jFIgAZxyO1n= zYRay@BjAu63BAL`vP8?f6lC29z?gg|-}K!|CScS!KJ|7y5Pq57-~}38X(J$R!JV>G z-#sQTa^RQogZ^kLevpmEyp~z>+}Ik~oxil%bFk$IgKhG3KylX(9cFg@f+_0896x7| z?HE2)JYRi*7@BSK_8SHj3({)XM74YP?VEW0E>8MFHu9%#;~vwUDsU{jk^aGrFKpaJ7yTV#m_4kt+QcAOearuwOH{@psFhWoB^sQA(ki#~A@t4(N;(yHh% z06~>3U!&nFqJ>J2Wr* zQIbPqi(2qgZFQ><^J^ZAc$4W6C$ShWBp3Z4l>XIRSp$kTUGS|P^gMZ0TSEeMA$A!L z6Ga#OIPW6x{0tKa)*6$}28BRtFz)40ckb}b4emuxVBg++3kthcP-(Rd(S&ZZM?Ey5 zo#}+j^Z)|p#ec=pl1!5OtsP%oq1j4r>U{7=`{vsD+5vXVX}1JC<*iHFR$j2MPHV?+ z?QXm_+Q`6KBcZplOG#hIUdZ<_Xk^-{PRqZIoEGvYq@E(*CZdEctaT1EQ6<)*@RSx( zYhE}KPO&JQs8wncxsrwTu_84x#fQ2IAv3X@rHreQt*rvmA@7XP_V((@X~*HrDnunA2c0`v}R|k1<@#&z1G*T#S%F;wFEjh zy3cA#)bjP@%o>F8B8V(36^|7rAvCpdi1T8aYsB&VV*<%GPp+5T8fx}oolne@Q8`UW z!GgpDGZ96oxF841a*_n!^!spupW5kDfW3cdj>Nfk!u@4&eyCJf7B zz^F3SgWD~bnA_(FK~j+?Swa zDYyX-$8rd>l^Zl=Ppcwg69j|a=$!l<#tCn?j^xct!+1aG67G9w-kW~tS;hfttiLR! zkEc87g3RM__9d`#wUIGggATZ~ic@}6Yo!ZjSoi`n)msTcS;KM|Yk-jZ&5`^*$+TQx zehIS&+`xh#>N?^g#wyo^e{PZJnl>S1a00HJh6Fz28sKZ`CZJ&}6)! z846M7)>Pm`185PU`V~ty=ob(-A2aGRL z@XkVcOhg$QMzk$v%S;fiOnI7Ccy{J&BsbQSTT{vrY9lt6vWV@YgWX=cBI;@ubqi?G zZf|3A{~!Y$oVlr!Es#cDDMjW}ZTj#^;Mt?}8avP%_8E2_$S2l$=rTjCb=O%yGYiQR zt=N!}pogxnBv?hj(G{iM2#Dhw=!$*1qPPDm6;3hC<-P$tU4CM)PaAHwUmBdIW_Vc) znJO)0$V5)Orf!`X;^)WNP@qc)aRk$Z|v^1i2I%n{HNR+>>I z+c}y@{={eUjB)KV+$I_FLx3zq8;j#_kkZCa{)^_@a2DY=-aoC>p?tSX3QK&TYz*|n+jxOZyJzQ#>|0q1<0y` z=uCs~LZj8|Pi&|`&|z90gjqGdlx;irpCUxX^dwg0m>=hUyZj_N{+-j7xhY2Mg8_!2 zg#MSt0~4*Ndk{HVn;UCZx>fhZ+5>4y?9zJo@MuDnp1!u06!P9Ob%@^iq_J4+YOL^9 z6|4X5?xKM3A13zR{}%mdR)>o|>ktXH=AAaxuhc!%W&+n!z$7y>_X0DJx8k;Z8-XK| z>OhXKb@eg>Dah1eoc6)i%X^fRol=fXg4zZX@d2fjO<(ys_JbE$hI*yolCv{?*q87_ z2H6(f_^>zw<=qhU?MX$#-a=KF+=Z!-)Co&zXPGvL9#-rV3-<`zJG7apDl(Ien*uK{ z>Rf5C?^qxBGAF;tF;_OtS^wt9s=v62H#Nt`BU~;YwO2p(hQ~saW)5xM;u!zoMQGiT z;VbCx+H2-=1{?GHcjA_C*!VOhZ*dA2vwV-^qYw&ja(w7V%F|#rSw(V+KAp<7%HbCL zOBymNSs??d8@Vc1%SQUS_2`z5j;vF+vSUnqoUJX0@KW!pA!R>!HXNVv6nfAdV6N*t zG)2VgbzxZ08I;L)SHbf9t# zZ{{6UeJNtHO%t8dl<01Btc+9II9mVL)VrTG|+AAK^1C8`qD%b<=YVb!avplIunidCk;8CgIp6N*cg=f12oS;KF<0 zY=PJ~fW(z&W&79c*TGrByLqs;f4IAG_~yv!f=~zz{>oBxk5=XV=}({3-(l1uz%XLq zBCNj|Sm-TVgLQ?~;`C)z@3js&@lI2P<d>(cn+|(`%dU1Ub~uK3c{L={ix#~(UnohNJ{FaQ z_pnxkPLpkeG%RI8TjG^PVxcP2<#JB#v6xVst*DYAYT5ID#b`}~d(r9Fd(wGxtq7TN z3rl9`?Ts~THRyN?vJ&{@a%BG?H&?haNGPhVO3P8L0cj1aDyd_oxS;^8MAt%Y=VDe2 ztH^*zss)|p&hS=Qmf3`Vpu}t$Gt^BtvN&#VE|&&%U*1hvIO`>IuzAN`E~bRhU2c0R zVkcAvs7bP98BTHX>9@@(kk)UVP8|KM%FEXD(LWbq!rb#F)0uRTZJC|_EFk) z&73dBE*c6;n{d`F*!JtTe^6aQYT0g~A~O8VU6DURi?E2TY6KL64%M-`G$1Rze})B3 z?-bpyp8m9>1OF%b$I2_?jn7W| zf@gKKQk|iwoCDGFTjs;k585ls6>1KlS>nF`C=mUh0y%-BvD<1C>^EtcIpFu*4m@2d zx^G_>sKwF~lVt1tUR$nXkj7fa&mB_vNvy4)7_TE34C~%BDuhM@ag5RLdIH{c7%X*7 zS_s5fnG$i)6j+jM`cHJkq(3-+Pt&(i)ql$R}ysspN8K^>|?M9%Yhg}Pz8r! z6fK$>Ztp=d9jezkY`BpE?AZ!yC0rDm-=!#u1K4s8e6+3TPo)Pny`C%vx<<+o^Rd8V z^<#?r{v(5pTOrRq4bhGvi^Vi8CULi1TT1!SwOueoeiwVj-oWV_fZiv4^yoRUZG+%# z$|)CA16&`eFd6`Il^)Sy%-l6Bk}!fED)7O`K_wn^jk8-%n`E+4Scb<2iGmq3N&Jt| zgqdZ{A`_7)`RFTTu#QUO1v~zE*fM6!n93uCBnUKz3Ldazxo5vQ*>LNiaq)h0IH2Xk z(oeR*$!4A`!Qu63T#W&%dcw>b>rVTR*{xMY!9QUJic`^KD9$qe$!7c$GOk`l7EQiC zX}8XUxzE)`ZiO6M= zE}{7IMBQ1GHm7g73vG@tIKKPBrBSZE?-xVwtRs3gGi);+37DpTRdVW)_G{_WG+ss< z5xqB2*U-iIT$s_Lnf#+GH5Oa-*huE~c7PH{mpWwgQMMH=?V$Kg``~x#6f6eu1q%L% ziSaX*Q!lHUr_R?iAzer$XW#3*yoR8P>=F8=;j5;QNut#ZAA9BY)Q0R^JGzWXlK_+> zG9+7!F}DE>UBi``-=z_bgrL9p0IrKaEH3e4+1^ELEmKENhFd%YYH^s!8m&er4kb3o*xrK8ZVEun{{huLSenTgMWOoF zYqL7Uz~WV;Ptx5*Ob2;1$>8ajp8{@tE|kYFCcbj8GYMlkbSTgE?x}>|dMn3nyiJ)6 zS_vl43^~ZpG0m7-3a=&3;m-m`$5{W!cX75p(IosZBED&mS!x{KjNx}3Zk7$~9*Z$1=s zG@%+gDSnjJ93g2reRM^F$iO36>#7!uJ{L}k=;rV=Hv-e-Pw=EuU9Z(18#^IxH4h3n zIW%?Z>xnvfDrJtJ*JD0E``OP9cemeyJ?aQ`fTIj?Ji}Du zcjiOqrt{${EjVX~Z-59*?I6SFFqlz`_adF)>RNuBeV@1fow7_w<*pxe0L0$R8l4Wj zOte_4rbde}F=pV|iKlCg8ENCM#~4jxeXfHJidEHVI2a>)qRMB|>T}Is{puIL`1upZ z%t~jHA~>`Fgih#FR$VZdv)7I$rQ(YO0HknuKC2QbLa2pZH_C%+QMCAKw^CpjPM#;H zp(s*s=4xBgmhLOi79_-WrIAlzIK_9JOt$0$UtHs3Yrl~D@d!%apl}f3 zDnlwoJY4#4|Cp&7%Q!|0rbxsQWwCf1#-}Ea!)aG&CWMsf$YChmJ>dRG-;&WwEJ22v zFw|=0ntfwm&Nue|l724IT=FUf3Q`3Zue4p#ES0Rjh~<6ZOu2&#d`Q`Vc`$WjnP*+J zy%rl|4P*(kU9}oXX{+qZ1NgF?bjej4Q9)8uWGcx+6GKe$5%h9dfYJz`9UP_tnrO~W z^)?1}Z{)G;Y)%mq#8RiTR;!bh)^zykfao!Y^~etaMu3CuHe3-(TAGP(a~znYx4fl7 z`$Tlw^@fywHjDnSR%>I&;rObi6L0A;7%oBX3$vc=qGi36Z#Cw{>!5mcAVjxI>xe?} z6+4v>ZsIfM5ohy4@zli zKd-p8A@fu4P8>=2JUjD;TxfsKUa715iScPELli$O$cF-F?K9bf)|#i5Ey@wQ2+!Wq zHW~rZ;8%W${8Jkr<~Kjg!-JvDhj}r31^*{e#V#4p^^ou9SN$8@@u}%X26SAM z*+NbnAv*`#&@gfQ#Q1kY&WSWNzGHc<^?Rk{_R3GTHHsp0ePu9YDwAhbmd)H(7Pdez z%Q4!+o{eRW;@&IyY6LRZn`Zq=eyV8?uVi62%`TG_Ef{C@Lh8r;FS*&xT&VWUg=&XF zwIAhtw)x0=b`pv>`V71_7!AwiCu2-S$EGcRA7f1IT0eVh?8w(y>|19`>}X3=)cwmX zb+4WmARR^9xI@}`M-8VpKzY+ww3`+r^8C1QBfsnP9m#hfR)QhhB^x-6{s~cSM)s?Z z>;dm#(+TQ!xF&CWNT8Hl;r=NZ(4tyAu2q^DDlZG-0AF(ND>@nMj9HbFf}dk!#{zR5 z8qlUyjp!@nb)5^ia90^OXufK~=38oKgoG{iKY-YDmR9Nz8~jrw>dA03mfma*hOR=S z3Ds(aBYkcA%BDE(PaKc-GS1jachUzgO;DRB^==Zrk~qs6hau>}N-b^@v(Sss@Z7l& z5pv~QB>@N=XKu@8^F%_Go+Y0c2;dI1er@ncv3b7OlZyofD9fPEz-cjyr{T9g;@6at zh!AQsU~?Ms&crx*hjW%PImN~hoYPZuWCyv%+$-QknR4PZaJXr# zZm36F3aTI6mDj+!AYlVe~L$X3<%DoFT)Gbhk{LHFmIn#S$~3KI#r|S zNsg&ly2YU1iL&pE34DX=uV23h$}%}oNClLdWU3$2r&lB>Y7G0q%E$wxq&U&Los&#* zU8Ght)=kxl<5+-K*?_7ZF(wnGXGD!TA&+#!1z(AbCFxg)LkT9HkU``mXe{yVPiM4G zqRuD}qLuVEGKzg&Dtw|qAuvxirU+(o3R!aLOexld)upF#SR2ZfQtU%JsuuOIiI=q= ze{wEX$!GxudNLYQasyCOoNv7S7eRSg{5 zqVqaz25Jl~)qZT5}_P35iyy zIaB0NZ1Hnn;1}i&q}f!lS?i&j*MD@9t=CMe{25cZ6jMe%4T3JO3-yCwePZ!D z9>TJAeb{4}ii59uYFi|7zp^8l^zY<0F=l`iM42tBykd%%%P@ZKpFrH`POhA@^tKgu zUdRcMlE{dtjz)w>`FisOg6e1JetIl6O}<|R3nnD{v<>KL@2&yke+{zDn$5Eo*bIT2@umK zz!ie$^f);ff71qCoPJ0;<~eCzjdOU21JUvl1d8aHCmEFKi6|b3EMHjN;i&E?bVszT zn2Lop%1Fkm2gA!UtSBN==ZR2L>2~?-WtwuQli*YWB!{s*@qwFtpu8R_pENO?%}aB#D_GzD>km>k?Kqa(yipHvrNA?fP0F#T8=%?3Ocd8% z7)uO>@exM-xIfjm5FHvx1=ql8Jf(_+5>2fgs+=q-3{JUT(R#kaXbnV=z zz9~jV5F~b9n!Wuq;~7obP;85YKB>DGOS+ysXzmLEPB{ldNoQ~L2zD9~SOta14xHnr zOks9rxlPdo${T<|5(Nnfh``!j81Yc}2XH$Ow{UTE$oW_`m_tMa9(D0HfG0r#$-Row4|Ov?Di%!Y1*9fJdemGlP!uy* zF|wB|^%x&XJN7c#wfvMt#XiO%^+qZ{4ENlL4DA0CNH0ZGbGxy{OQO6=BpfH=jXCHo zfsN!763Qx8c+U*vg;)HR6m$;IJR@a`K2d#}m|5ER%%n768@%2wr8k$^Xq~@6)heZV zusccfb5oHH%kzM6P<0ppko-8HeLjr>Ztoc^mF7puJ4|@Tsab#Ol&^spaXaCMQRnJs z^}oo!_NF*;BmVb(i^&tX0A`1$mt34>Sq@?h1neY^Ls84a$0nGiSaY^hseJbQy7iOP zTFoqrZ7x>{sdIK_q}Hn?wOUd?W?%=y_?|rh?;;-nLc)0wm|{%izr*>kw2h}~B`hwL z3Mjk8{46@Me()l}*K)PC>}$;`mthTRZ@=`!exIEA&c~&D{P$?VUTL}!K=`@6q;NE-Q z0iWQoE-oE4w!pLm44`vzbi=MF#DIcEfLmVQ6m`QA#CTDf2meCzQ=ttgSs-`|#qOA#V zQQK34p)qP-q;|~j%{En#K{Xo zVW0Hu-mypLlllO#ctP*k=f&^#WX*hT|N#ga;2+)gE{mm7c!96 z$shn!K&!u(8u%gqpK>X40c?_ltrR?^otSlyZCEI+K{0DZp6)O;?5tp3Ouj8QGz)tvO5%+pwYJEzwxF(l;_QW}WM^?eqK8zbv_w#r#Gin|`V#I$xf3?Q2Gdn7Eg{sDqW4ij8_Jh^pi^YSOH!P`{{k)(UdBuAO+7TB_IbV*( zuf;fZD+2;ZjJ=ER8WoU0MqUuBho|wiwG3V>IDU$f?0%kHx=XFi0Ldom=8V>C$ z=;5=_s`4*3mQH#hRV6BNQ!$)v&DO&fi5$6+>srP1jS+-g*PJso`Tlv>h=`TwMs$?# z29@w+k?0m_J1i=rMewT^TofH+6||?T-~m~~p7-T2 zmXV8=l3w}hBDX7aC>JtC50|wdHU?stQLSEK-#m|-_(`#@OJV&u#UChp|J+%2Q!G47 z?nkAGIDyA;4V0U~mJ`skGy@y-WM0_-@W8)yY))~Wcy|YiJcx5aHG?`12tfzK^7R!p z>&FA{XdN8AXM94S!mY$cH={~e}=8W8MjWO%`{FKwLqcB8{QnLVB`}hb;9NN%EL)!_ znKD}?e_j*Rv@Y#t{I#x!EEW-n*X^;n%QfQP7Jgo}hODt&F#2$_PWn2hIoMaZuqO9| zo3F{@_czUIqtqC1ML0pHekn`tfH7=x&C>_ms9V9$1a&4Ov{=4maAy(Cm_AuCwe7lK zdY!7(B0c0o_d0vS!8P86!9S2ZQZ~dIW1^BZY{?9f`OxkROR6t&BCnXniRPs8=Ed8H z1X2$pKH4=^GRPMAbC%?+K`VDt0@_Djm323k#5MUBCSlsv=G{|W;RFZUjDQZ#| zw0Gub*;JOb=7TXJ$E!M=C{6o5oeU}RSob4ES%Vd2f)+JM!6J-Di+qInQ7|OF`y50$ ztDaEP%2COH*Ha|QrM4|vwJIhMA@Rm9p6=AtoQF;qTs=~gnXVjU9{N$H5DLS?Kp)cm zueaZW#`~OabWbF^+PY4MjtFg1y3dlo=uOhqlmO0Y?ntdDJ`&$73tAsR!3fha9hIi< z-^*^Uwl8PQ%^B-F6=fXpO{9mHy#6NjGXzp#^k}3SlZKZFSwj~u6?On; ze0E@P^&;`w)}5X=Acrr85r%K0=a{`~$A*#2cV;i-c-+{QXUGH?yKj;sj@c}+yCp!O z%zLwR=Or@=AluI=Gvu(@^byJ?QKV|q2Dnn&|I?JzESd+cloegrRISQmDP!k3Zz!AR zVWHg-Cx;VQO{qb>j1|LIb7QS{f_g~(n-3S?6g>^$wgK5cCOO=bpS+tk2k$ydmopsT zn#LGIZ)L?o)!7v25LPD|7AmY9HdYJYW1_^vEtDW-WtgOo%9zZJKWJ%x-ay8s5cKAbbgvt98d?4z;E%!L&{xZe1TPi*V@NW9M(%75hHEk8BST389S zpcK;Q)B@u@?(oBUnsn@0|H8p1zqcAs-PJ1}y{J1lSbwTJPbiK6;Ue7`J({4NXC8`G ziqN@YoE{!_viYeka2}%Gc%vP_g3!AtvQ0PC6!0_-xfzqltl3IGcxzSkTDJ%?8dB60 zWt_&iCY~Lb)%|&%f!8K6er1Pq&^+1Acm7n?#ap_hf`<}J+>rLkXRcLs86wi@e^{*y@iJXU592T2Z&p|#V&v0mc-y@Oa`tU(hD zj{=;i0A(puTfA3W#y%preuEsLf95?U$2|i>LqUaaRE}h)=+L(mHj0?_D17)a)J$~C z&gG-ryDAqp*Xl?djBY1?K`bC~*01qR`YD$K#Pe`K0kPbk`Ypv|iM&ppOiYMZ%5I4F z0iB5$y4=#&E4}IV#j!0vN3fp%n%AlT7u{{b!=%8p?_-{>tRPU25 zbbY@efo!UA5^BN_6IQqtAe_9w`Hr1~-R@tUCsYsveiniX`5Qix^&)kCQ!iBWI`U5%Ie6@&|@MP13k7_fv&o~70vHDAz(eA7n5 zYv=p640jXNu2)#AfX|Ym^M2?0VkRTQ^u47rNhm%|EI8S9?Ok&9{$U%*Nqm7Upw5Z9YbF<&rl6A{`qS zDZ3tyV=Txe{yap9Y%z!Bd^6d?n4wD&J1=*;4ZbgS66M;do>VDvgH}-$2d_4EcRHdP zx9#8{2M?Sf9x&$ThESl)&1K3=fC&PaLTB*y{M50ZWoH1vS!dms?LA>s+D!UTc;jBg zP-sSGD}=%u_rk(znvDz%wETo;Bs376x^%CYx6!JK9P=7Ke+$1lz-9(4NY?y(kOxYe{#R6YS=Mu|FQ?&E7G@YZM zGmrI04~mV`^|+RR+(n?qK}#8x&@K)jK`*x-1Uj|!H&2MJCo&}mpD8_EWJ>K?5W&W6 z#&@w8zrD=(aG+t-w+THqmw*ZmG!T>m04U8T<^z5acsti#x~Y+c5rIwpa*ELa5c?iU zOqDi}-3y4y!-I{+Pxn5bSETa1BAJLxs3E$q!#G~I7$`#u458R=UX*&9 z`td-6ay9a~WJtB?iJj2I;RAVodm@nZg@mCo(IF6h=}ZHyd*|U0CT`C7lI1gY;zX6y<5V<^hhEj^)9GK%#n3aNHw`YFK8T<(tI~&^B(lO8 zlH*@3(kfH_T%_wieB+)QHYJUp7mP1W+4!c+(=n+q-ErxZl?jz5r3Y5U_|DDqMz%rC zc_QSJLDF3D6|VCnfK@M{keUA7T=#u zWuA+#*Ni;K(3umn9tXZDR69*w_FJZ!*ME!zd_HA8H8fdiOOQKPy+vZnIisrI6TX(_E(#FvNAPpEa8sU%iN)?@F}W(%?!QSN z^Dg8N(tBmoQvI583O@{-J(bXnKa32VxFJdSWJn6csPweO_21Ig*2ZNmNzu>Z>X;mZ_4DIhFu5{il5rS z`9Nd8IPxQLT%&Rbv>r1j>XNK}FT6Ru!m$N}1QtqGX(qc(krb01;HkKp1F;3J#+kSt z8to~$a4)KYtEW*hXSQk{tKk71PbLEk^`OWt7 zBdv4R@@)dxLmIey%F=>8kTE}nXsNC_JCkOa%3;%86zi#WJ{NWc+6aRMTasrK}UROwM zuR?V|ef&o8F{Sd$YeXh)Q?0WR{zn;!5qf|EzV$#+xZ~?b?75&5Qf57`j^d!u1Z2As zWPqu;Olf$))Lb1f7{G_G+;e2BJ$V)($*!wWSB|V(PpIalE@*wo;6|E3o2kcZq=KDe`d_!qG46RuCh5UhH1xR zptV9nt=Uj^L>U=080)D%vwqV<^i4-w!-q7$;-T8$$-ibO&cObGH4R{q%@8oxkU{>Rh6^}T5Jc? z1H5zWZM`cOqDjjMZ~E`uY2P^w%cD;kgi5BJ5k3f<>Xz3aP|E%%Y~caa1o>mJm_-Jq zj9b-iL*yt&vv&GPxm;hEH=?4?n(3FKINLA!o*Yc6P_H=ZI2uvJ@x z#h+XeHj^T3`XX%B7Ga4+Sfi!rLV#V|_Rna7&s=d!yCl+*hP_`FcG80Q#Jf_SMmTeX z`Hcxu8~M00c9Sx8eHpu18JSGWz)L~jiV{}y%9siJmbuqa`@9gw|BKxyNDK$3b@}+~ zu#nX3OX&MAqimHMmov45pAA};-DM4mEHqa{BtCP}DDK%XB-wsahJ9a#eU`!Uijrho;aQy2Ynh2dP0I^kp=Bfa%IVWj zh0(kUTQkBc7+imP=cj%jP7iqb9mYmZi99j(A-d(G)hKTHaqRzoxi#Rf8@-nxx{mIfAW#` zVv8vW@!SxfckpfQYyLH=PDqrC6P=W>hb|Zqi^a)~Y*gIwP0kK+JK*UOe=u71 zH12>9&j$%@wqO!o|E#k?Pn+`wM#}#si}y3PTFY__A5cfnv|?B$}d+F zQv{kvBcaz^oUnRi`ZjWguT4{AlS1thrHzQ((VDkHa%QDj--H{ zeGfE^4OPagZA7%dlGHI@J@mbuw?!C_B=r)b#-@$do*?aX{9p-7Kj5q`_yHm?vft=g z;nuP8v5PnE*bshzi+wGB^7BCc>2QX^Z{=%GjUT(%jt{qp#^>3#%ENQaOdjXWz32~9 zERl;DdI{pZmV$;l{+E!+d@!IG?W?r+vScF7!?qM)|9JA;^#L5;e7pI&LJq&1F~i7;Yc=6RofQ#PjgeyifOX&hN#7vtp2~o z{Om~EP;XCt`z^(MZ>R0Ii!CQ@zsk1L`*J<;CM7gp|810!IbSg$E%-FoVw(GDnw$Nh z#2%{g0UvI$t>lk8f)WsVV)ifkuiA;R|EF$9n@wt)i3KLw5LeQQtgWh0OELFNhiT0I zde+uiXYakQYV*^Jc!4Y8nL~s5;`QLp7Qi;vdNP+6*&mN05UD=_k-Y5n{*bH5SUGv) zzb2S~v==u+FUjAyFG|~s(yjwep9eI!#c*!Z$$E=z0X$jc@V`qxrY(m2nF&Mxy1F^c z@g-y?gu#DY=^BivO}lB*Ui3)19MgXO;IwIo48q*rsSWJ0PuI_GEP0wq|7FSN%M%XR zjkboohJ8oyG(LF~{-WoVX3O8{4g<+ZKxjb(MjlhlV|CPKXxY=mzLBIhj_`HYOlj0; zxVN?Q-Tcw(Bi(sRvBMiPWhe6wg--;a<5QVDEhbM($L{UDU+_Hd{(nnN7<_Rp1f_`n5ghD(zT=$--M@b!&NHBUSwQp2lsvSRf za_KOT3ycMDyf8bYi+)2MVaNn+1UEP0^>fWsl;#l5yp8D21^QW=RI39a#7TKk{jG!E z-l_hyIs8ZWwg#k(BPVF)>aQ=M@LQGI)qK9a-W{A{W^Pu0cOPpDEZEf-xkEM3w;}s- ztN*bE_T>qV7Qea{H)UYhMgdHl^^W{PiIbcbeXtVToPHCGpGJUrTXih@gopGbxQo&TB_M-gDAxb^q(_acbVa8Csx}b zO}u)=>5L|}XZGZLTT7oB+BwTD-#7be)<Jl(Ub3Gu)U~2YpjNRBMj8o?Aoe;_?H-D5VDWr!Zf2HTn)zW1AsB^s zkkU6Rct#pa@`4!r{lA1MpQPmy5a;diqu;0UcOsxLOn^iGR{v`T*&?~sefiTWhJ z9)qk=(XY(~cl&!fy)d5?>j(!pdsuN?%sdKhb$;6Td41}jsuH_d-bi+j^NZ?$vXBE? zx(^uQ5}0k`985VWn9^K$AAz!be`b~dg++OU2B(OGaSi@BP5iRGvs>V=N-hGj#lQVS z$8nH$46gJPyX_5_+WhDJ!%YJybPnugez%9yNkw5rAAF{;1;lbU0NxMI`#<HZIdP=1qTbszAru$H6zYH>zKADO1m*;8(oMQ?LRo8a&WL-^a*do#=^|@j?^5 zcWMWso2^+ZvIL*qjUcfB8+c>k4xv2hjBZDivQ{l;bSe2n#Qz(~WGWWry^){BD+j?X z4rQ^}WC)oSO8H=3K9hhC>*C&R03#?z%w=&XMLRr=4o}`e(&~z%3%yJ#7D&=zFmkm1 z_zD9`v+Qi+3tjp(U&@82P5B~X5jv2A6u&H$Yg^mCdmXepT?{$=vbo&xUjVU<4~(<8 zwX}pUp=e)R6wq2Yo^c|XW)jV<=CUNNzBz5#FN;fEc)X#hL+p^48GLvMx{cAg-R`!G zkq)A}m#4){0Qi6C| zGn?n`YQ+LSxan55>YC1dDHg)D+nR=4tZm2=4OvF zJ}UQ<13xV*rH|3P!5X~y!xMS+ez)uWg>1nBhzl|&ry(#9{J>k&+L1@U|*s*&K2(j%VxY#{w6z#Npv<{GnYg7wdd!t<9+cXEC(OMwU%@MA6~etV)J2E z)kS`45hVLRhQLp4jk0$5ope~zN_YdllMZLcqbv0}+XH9wwab&yh7u@Wy`#!h&gTA% zEy(FQ&UfUQXtrk_z6)u`s(XP$W(+(?Z$(X33ywd|r=w9N*0SH$wbnUO&s77CcR&^% zRO=r-_r4zN($RxNqjTa90ya1n5U34g#Q$x~7W4BnjBO+xTP0angYWy;ymzpMkI<;> zFaGQbxBbsPL61B&CG@YOfQ&tA*FwO5Tw@vGwCw-}z8KePraRcrKbXPQ6LQ*!X1Ij!J6o?$AiDX_hdVFT?SmR@dRe%zh4?OSF$#D)+twe= zOCJXF$P;{s&u>w*kfD|}!(IyNc@xJ@&Vy+2QAM0|aQ1Eg{?96Cf8 zZy^T#JM3L+L|+M#jYk;^{;ZjD_7`1!fZH&ND#(FxG@lPZfGaM&`$PJ6h3ME@6^Zfy zCLvHPHAxG3Himd{n1TBykW&^1j#jE#M_sU*H`fg5*P^x0RNwUZX6W?+>cb6nK$zhJ zbc+)$pDj}vLj%aSHh6F2H_Zv;>Duzr1XjqE%ZXzhnnb(Y9KXK~yLKh?h_=HpgrwtEn#(KU#3`2XK zEgyyfY_25UE7beOtF7Z%*^#1DSiWnFhP6R`SoaR@?A^T|Na^UT43@&(8E>*j^*CYm zT!rxj(J{}w3`dXC4kX|>9Pn=JeDMr_1tyi^&)s6L3ki5H_Y0I2-l}wQV5VEVI)Zu# zP%Ve*!OCk5uh}ZT$F_^AR%;1tcd+%We|vWK4oz_Fd}*Q)y2u#Y-yZhoc;%d%>HA}Z zy;v;IUZdbC8B7zW$7TgEL?w-Q3}o(;T=g%g%MNu7)*h|F3ey(WcIpP6R4wN!V;t5? z)Wac)uC7M8&$HBqC)~f7j`1$dVghsmX0!6V{(D60k} zW-W<@ti4LIQtUrBDzZ32(@u3L?YX`iiVh;&!M&r0ZB#C#DiF!l{024kjl_xDX{hqF zX4Nex-m})(CU!)&uRC!6z03=z$g&91lClh(I5cM>@dvqjgVY3#RB#tE(DIYnDSW5U zkE)IlkcuAW7fc!K38K&s7ZC_+a7}-BzE|$-&Ait{k<}v!6)o#fiZs+plfKU!UhrEe zZZ#P~O=##M(riM^B!(m;I_i&)qmUB#&D_~uF-jQD8}P7VwaolY~x|ZdWh42 z?v3_QXXmdmi|UwZV_NEqx1QY^V8-OwW6g-)`S7`DON2FLICjw4MGQ$)&Br-aiXteT zIv)fZ1#)<(V1m1@g$F@p07kc~Zu(;Su%8GHb`H9m-Cbmvky@$!pKu-g=_L}d1AIPs z$MD^cG;58GpJ8k2g6|wVCF?=r5W~?un`lzN8*Kj`tIrkRdKsj6lkQAac@FI~R^MIWw{xqa zl|ry4mIk}uy<041Hc{6aSC*dJ-URuwYPlW88U&F6&#ogSGOg2A;e9eLuPiSwF8lOc zbmgE)xw!Jq?74k=d*QXDvBIo70%37tyc>(tEv?WG!kGXRWteNqh)aJ7bm~=$t&u;3 zq~;(Ay4)-=p4G^Dzq_FmF=cnB#*bkxH!*AImc<_Eh_P)!kroSyWf&1A`fX{5YtwXqbHjjc1UPgvPqt&rDG_MjXLa6xy)>y*my!qo?_l@tj4R#(2ZCrnwq`O*(l3yeP#V5WT zdNk<7={yjrR2n~+Wu`SpPWYH20i?8^L6#E z3Iz`x?!N?WfFWEdW9e(^la;hsV`M>avVSMqA0!r{y;zA^P#YZ7~5^>w&&v?oe!vVFBmCukZQ&T)dq3+c>y zG4uqT7WqOVSmoX7b--sgQY`=f}+yl5ShMFIrnDij&SsWE}{6zX&4%hY!}>2%qNFx&a8k~C2A&sej*1% zs#o#sS>9B^VfWaO7x`EAfzSj0u(^*)YsO%okmMYg6=ZJ(%)XZ$$!-;#H^LqaaJ7*P zhl;#D>*WNszA1hpjen;O#L;P`bREyaAu$by{+b$>`_Uq- zW#5?+*qV${P*co7_2!iIWXgs6k_+r3urQEw$Zyqbs--L(DELLJECcoFQQ`iZqlOkhRgk*reBW`2NiS;K z)sS4;eWZm}xv_CM!eTC*zm8$ou>b)jv?P_}_iiQ3DYRhR;ulm%VE}pmXe+**>GwQ;%eL1BwrbApV4 zk6e|l7jiT%J&O=1aj@&0{48{?hLAqukq86p-$Ju0Fm!jEDW@+eU26P&a5`i}JrLKx zWWiMrKB-X+d6$=E9CpQWvJIG{KQda2yEqk!<{K}a`zXLq3drlJS;DCfksta!slDeH zpXMdb&Rb-bc#0@g23WPfy^ln9{6UvP!wV1WE23`SON@EJep=4zj$p#_w zkx0yaO(RE+3@d{8UV88ydPe3JVL1ELPR^^mKR*Fwa^f_~ooKctSKG+dn37ds7ixK{ z3v?=;cVBPpw+}a+2gubNVC4p~YtrtcH+~z|&m@<#XP40&d}BsD1CGu?*7|fL>F&27 zEt)#7`-|!pF7v>~nX`Y7HOO{lhD-Qn)={N=LMf}Wrr%l#oFB6k6ih%}-(RHVDTggH zoSRHrX2r;NrEwa?xZIg<>c2S~e1wp1r>sPH%cJDN(4Y%3&-oIbqaDIVzcWQ`y}LIG{2ZOg@bg0l*4ci*Kzl%_N?H4CdK3#ccWr$($ zLT8`1EV)0gDA{Iiv_yt));|31PYWmb_e75G9Uae>d4S(Ypc5P$o$uX#uRL4?E7Xqn zb9hKYUP;sNN+yV(5X-*&fYZZ#{QceFF05B+<~)@=BB{9AkZcQVY{59*85eGUZXd-v z5ptX+5bP%1yi&l3s7Y4#CGS9OU~UJkC|P{7a2#10AAc(We;0lHjEfm#E665tX`Qi{ zc20Z>$LVDAVt97jzX34VdcvYeZ0P0>r)9*);31h$(jw6PzvwzIp-4L+T$;v`7Sb}Ag+3$1B5DUlL3Y94T zb}ULhEo`ce@yHl+Y&{t7>(aq4x2Dr+A3(+U?g{p~qsgOm<NXK3lZEUC7Bv!hy2b zxSpPC`hDyVLaaLc820+-bgmrN=#z5KOKqCU#E>GLXUDno+;^J(=M6J9_F=sf(%m%- zfvkf%!H8FB3!nFuGs7+LTN+k_#h#&D^+RP#bMrkoT-7RypP#pWJ}dwJ&Hdk#pK~C0 zhySHQXe={}u1<)2;DfWwnnm~XvwOsANt8s1R4+0g$PH1m%>A$!U`j=hdV?;>@DLkj ztf}ETAMZ;A1xFDBw~p3$``G{BX-i=c#J&-h#uxF z7NP`=(+iLV0u!)sUWeIv3km|+ONBZ!5&1zok`XjlxCua1 zL~R|@ofU*#)hrIFA6B(;GEZ^eACOp^l11$)3LInDEi{`06mkUyRj4PqWX|zm*iU(~ zy1Y9%dcJc2gbG|!?+C(3O>;WZocJEO2{QTxUAMlJVFL?@V3^MN0A-9`vRQJ8sp702 zGBoAfqI9ZX-U>x>9*G<|H-xb&VcbfBB3?Y)9B>}nNzqAhkw~jclIP4`)KfA&?S2)U zuL9Nx*Ek$m7Lt*vAMM2KHH&Wwy@@VQC)oSc?E21Fc)DL~J96QV!`|_bg=k744)&GR z>T@_8Erg^|Nq#ympqi_#ELU{~7Ri09i=LSg%;&nWA^ADI!JSEt&gh>rG3irmS}<%Y z)+$JU^v>PV65K9(HFRxgvRdVbQ&97QS7#oQ#xb%dT~PSG>@9Jia_WT;bz>CH(n zU7(G{dwgpi3El@BG`T6i8H30bs9ff#T#iBI>GGQ-qcanr^90CTTD0|>4%O)GW3*6? z1g(G5R6#2%4z(YG+yBGJT;|9;ij-xFlsSTzV-cL8>#$=y9+$-9@e{)M>12W#gR}Cv zVj}{)Jo087^FD^sDLjkGl|SLRtjNjub%35gdvfZOHU5H3tAcomOsJ}whCUd z3gTjr3qQl#;A)ip3UAJ@*ssV-kOh6Dn~=Apld0?(+zj|bvp^)MI(v2W67xHVU$l8NE< zGT(V$r0APdJw)6r?lpcf2y%>_kdT+Ub0fBVmZc+?tpC8e^GCS#ov+Y%Svylk__ePa zo5lHbneYUR944*ipE2#pA#Y!NoI8{?$j)ZFcp^q4i1`cefJNtt?8u)PnLHTT_u5CJ z0&%}`u^)+rv9!4II4lf6UIXNjJuk(UvycC5oSl6-zgdzFEO+-lHPY=Q{kq_BG}_^h zwUI?i2P6;Gt`5b+tmgD6JGvPUA#pa+Oe5;P)$tiwrv|&w46Ajtx zW2%c{hVJc0u0-9YkbR;Fb(PqSsmM=eP*L}n4oSn)Bi9k~=n zspZ$7$q`)*-re7_SFh_s0SL2MI;#rL__)|gFX?Fm$q5x>a-2h$x`5V>LV`?uEn{qX zcXowj*F$hueSV@*A6Db`Mrn*BuD?v@q=CHLSF*1FBV)UPE2Eghjj6TXdrF z#Ep0}YEUTiNn+(EZDR)APPkrH5hcFGx;j2jXr#ae>QwOtXmk8*%Ar+JCIH8K;WMaR|$=MagZ!1;+lNY24 z7+X81_Fk)fJu-qTCcl-VYtBTNz5Jz*^?GkAZo2E!>x~X0-W?no)&Ln_0-@Ev@u6%%W2*pcp8p72xB%UR02n>FpCf~Zh; zI5a1`lqCo;nuT&?P9|Opepdu_IcQ~*ZS`zwZmh`|uF?ah+FF^kUfY7#!=@};uVU+v zsY7j8l6b7TGYyZnjU2b>y_viQn+qII^CC7II!1DW41LxfNg;@qNf)%g9(jogH>S1! z936=HMDwx&&2d-lV7L9c!6TI%8568_H&(7`eNRt}9rouF zGel62z<~&CeQkB(MtX!xf@Nl}K7w>Rkb~Rp-Tj}0csm3zw|g>jvtD{~- z{C@fuGyT(dm%XdOd~f)!(M0cA14z*c;zT3uUl--`VtP#kxY1vFQ8sF%CH0~iOPvM$ zIe&-H!2H4gvUap&SI+;sJzuqHltNRi1S*>&<=v;&OSwF? zLTHrc#072~!GGkAG(*s-(!_1UjmGlwW%9Pvx9zsRmH6C|k+;v#uQ;*uzIfrxIq%D% z9f_b8OwrjLM1Uq69I}{xrg|TwTqk1Z2)^lW6($X7T3KF2#|Fz_gR%?+B^hHf&%!$~ z8i?fR7VfGRx1 z3s^ziO5sTo!8mQg5;lO##I!a9QJO^mOhk;%03rYcE5Lz~4Gv-&?X-5v6nZ>QC$yhA zBusp1m>#RRMTVgseIBUvvuHuEtP{GI8f?wsP$@bva8|VhD=eCZg(a!;V6qs9K#nbeyzSEcvlE{*C4%H+zz~OR zXVnrTwaJ%F>B_E^8}G$3)!Zj-V$>KEPnBeq!so*KQ4_L!EB-i;_!n zULmUHR96Vd3+q&!i_mc!Cn~`?KmXo|-pAxFZRH$faFsiCiCKS6m_Sp+h_JJ2BC8f= z?L5fwA>e9_vAc8R?(x2XgcdKm!DRBShj>EX(VbnQ3vy^%seh~OG<49W`|}s`dMAdV zDg7{Z{)&Fi3w9zG>(AVBR0k zdryv!ZNj3xx!z6DD^a-$03RNwRl>TLy<-(K2OvI$^`>h_zg zYkw)!d4R?6^3Xa}W*;o&C^*PTlfBORLx0!=^AEEx1~V`6UOn?7?#aVmcz#FE(|)WM z`am`z3Ud!CrCnByxCwg@$aL5%0Hm$B?Kw;03nCj7Im3Th8S05tZ zoR9Xq8MEC;WXYZNr}(t_^@U$%;nRSqPsEI}M@t;?2Eqol2_Fov3t?28`=v%Msdf^D zJJCp0kT?yv$)Hp|g8P+iLpVwenkC(K#jqEWJ4>pxm3FjqK%ZJr`k;ICFx2D)z3r6J zDE%?kA1ZriKmN0&^Slt2{rF~wXEWIY}M5?N_NmAB zB<%fsxcIopB) zpIB>_SbhViGjC3Jr>YM-Csat-`#9k5)U_h5)A2mT%vGjgueufkCAONI=IvyiuqjEl zsY=K|AEg09edris8~b$Ox_r3vocsngy--WxV${-Sl-}0#+Y%gpeSSpOR>;ekyxVMW zzJ?lN4X3!@7{WMAS2OuOtK5Lgm{wLh!~63@#%~ej%6~LxZK!^eWy1hv%47#`6wfg{ z-5U%_ekpu3N?z=b{ze6+bYPrP>v%ItAWM;T^QO>j9KC!FRryqpO5t@p9O3cPooA?H zdB;?1@9z#>%esH`yS1GIm!^LQ1bBx})}uiwL3+QxUc~a9uhVFp{deQZWrrsJRH-IZ z$}?f5c2Z9jLear~gc|VjyeBUsdf3G?t4;#pqjzw(;YVK3Rm#H2u77cCeJX;cumQdS zU5?@%e|dBEBYdOJ2}ffR_<$RsAefDwZ;~nWUh5e3x&@$WV+-AA9QLuUzjv`gYrKvx zgKlZmT9gy_!Tt_DxXB*-?pBW$LMyK(lT zDi5ku-y>o-PJ>=4CXd0s`E-r8?b}T`NM9a}&b{>N=GV-)KUk#gwvDBdtVTrf!OCi6`dx0=2I`_+4p${ zOOphR$NtlI%utBqyM4ZTuC2aUNqAa$L#!w2={3+-av6PNWMIy- zDtrrA%sJooFHCUka6y-e(?3AYn;+lG_n7?62ijos2x(rsv46RuNc16qkolAu#>+^gx1zqWAJOOj0lu_##$?Q)Ccz3!IveuEG$Y7` zw3{yr4{v$2fd>U88Pbn0KL~H${V_hdg@awQ8tWccnsx|xXCM&3t6utAWT4a`@3Z91 z^u0qUUcdjYKX}EJnGG~KQ_FbhOm!EjG!wXsB$_d*84xdDadmM1eBeF+J3z$0*Cs?7 zVJxsdKtXBPL=$jv1ADu5V7ComH-7ndIdb2m@~(0u9{FxsS>HHuMv2%>+w3M*8-K^x zIuh!l(Yt`7#Uc#Ok$LUE=1TrwpqAcUf3zTK={nHQzxI9_^w5I84`thfm_l=I&Ppq4 z^vrqvb4Mt>UU}M_RMfj$+#F&~Rtd|2tID$O3U%SZ7@_MFe1!Xh$(XJO zN1O=PEwqc`oRViszQu=oVw-28d~(Yf0F?6BJvLH$jVG z?9)8?mZ^U_@GFomY)hpJ-3!3sig^5GO3q>JS{tR*MN6LQ**T`USGc;|E0hvh%dkyD zL#8>%y@h#HN{#ZE@m#rR(hWALTxCu}%?p`V{m#rvFlB1K-#^$K1*ZdiC(oFXMCIfW zTR@^xXf=Ffj+o&LA9fw8m^`~pEq-QP=$uVksa@g}^w+P*V{(Q+FUzHr{h7MFL}=>9 zD;J=OlH^u+Go=N9WS)+zLhd}iRqwU;2;$@8#y7jo86u8!7`)f_$5pDQ-;X~eAH#FG zp0B}{5zKCv1#2A4LIt)WKQn?MyGFyNy(m4WN|_I(2|~5GY7OvXX)6pS`| zUz{dva{3=ek-RhGIph+UfRM|3*fW6upTw_{N{Iq7sp*{joSd9z4svatMf*05kb-rq zH>zS+s^0pzg>piF7S~hhulGh@Jf$itn^*cuO}svE!4ZL6r(41Fk-d#d0i<@m1en4S zbD%q@&C{sUKKLGTx3EdsuHxRUGsY)j?2kqE?$Qshoh2@%t^=hyNQ+6rC;aw&X%{Sh z`4Va&AnU)|tn_ZCZ}B^G-Q_+zbbVH<;E&VaB`SL)t$xM(`fBG-Vf2qsCoGR70;XIs z#NsliS%D2&q{l*{$z)J$I}L&;!LUg8Tjc1ZR@9Is3Rg}^%Ht??wF{x1zhcL1g^EBC zYq`#s73?WP*RnY`RW@>H#N5Idv9CviYIo6qXbQdR{)<=Y{xWBGy9_;5Q)q@J!&TX? zuINalcI|wNgUX1oTHBO^6G@m|%lOGU|LGr$#+gnr4xFcRR?CnvDWOb$&@J@548wKM zw~N-co%?oRdTsuio&-|>m`x^T^FhaEY7b7)gyqyw%nefcv6wXF8pqU7+wp0Zj!5i* zga~ks^AxR1o!mMP-HghKna59_jL-fuxwYiuHelIGXlvWJ9pjmw2EiAziQl`oC}m;y z2ipshw7q{nU>+U`8eVxmD{f&8o!Wq1 znq&10Yix>P1-Jiui2qBo45{Z|8p?%11^?D1TEq|*8-`CQ45pk#bB$mDYkeggXfcRP zBTUAS64L#HorQjL8e?{?>HcNf#QT>&sVM076)fD?_$M!mM>#PGrat7qMIjvz?kx&4 zco;AP8Ic+~Oa3?r!89b#2gY%p4huHKN>qFQ16tr%hZhdNETX8EohnIIF46Wmq;j?A zdky75^TnFk27k4bVyh|`MPWJ^Ebya)z0uk_+zzd_P587`Pma19%)PDV@Sd*R zc>q?S%Rsym1$Qbnt4@dEBnxgKm!!lgW)mc%#*VIt@g;YF01P@QT8!2oF^rrj36x~5 zk`S59=s1@imR%sbSUpko_0N|ydL9I@rsu8{-VPq4Uc?kI{2E;@>6knd_&%7)IWobL z<)|_BEZsUY&P+$prVZe;mRZrtdYAQmWNy@g2hK6+HMu3I&VbzanT%`P1dYr{~fvpUTY!nBZ z@wq^0xWt%F)OVk~Hm68)-MH9&Ge9zt)y4pJo0f!Evk*DchfY$Mgz9@=Lm`+Iv4|v6 zfzfQBBS(HNprlt5X4%f}`mZ3i&dlCnW%!FZOK+SHMO3l{hYy{T`lxUzbfSg@B1+wf`)(-#{w>#jx~_FR?QtO{E| zx4FeTRa5s%=>K7JlkT?ixNO@xN=3`2IYJvJ;ZApZb*Sf3?QC3`Opn!i9@=H?6c2jhi=hmvv;axUvnG7H!px)I@Mlm=4t&_2AFcv zupq@s{?e(ne|A1HBfq1K6C(!e;;@W-Ds5(LuaXfSjK{pM!N6ZlMhB%6KIflXscR!$ z>DVE4C~nw#t(%!9Y}pER3nU2-SLER}%W}{m?06m9Ckfu8eC5E)BQEn&u0R)Y7bMLk zrO>+VkL|nrTU$>YHr{Cu_U=HZ_To$POW+nt$+!47m33};HaVf+#Yj&Vr>TR< zU*zY;L$~NcXoh|4VPlf6HiF+-0!`(!4}aCv)n?~s#3wHxv{Pb|x_-crqUcaP+LM(; zT^)BXmsl!we@wtyKrM?REuPu6Lop4 z?od>}d3^9*l55H5pr+Qin<(^tgL=x@0a+UWX&W@(!Iwm@B-DQSQOF0Mh04N4Sj-Rj3PxVQuy@6*ip1`Ux zA~y6m8xHxYn+g?jJ@0J34^n_~tJth z7X&M3iIqnY{HLx_F?%627GH;)hb@_5tjmF#X<3N|$lPYq2sapXYMG|r(e<|vtRo@@2_WfNoi_^CJ zZXpAE_Xfva#}`FcQq+#!IM|E{WuQ{s9$+B(!8w~rtMRw2=}G;D?U+ImJNFnX&Y4H?2Dthd7VCC z^~JA%J0}}Vd4$mB`{doMGUSmRHUlqM`ktutk@H&N@Zz*ol*VMw`R@FKyjnmF3vk0W z7Z!4(5d@F4dzT6;_m4OJ!h2~FPD%xR;TiO;$FGW<-0y{3x^?OwxX82We#1; zlrhjhiU)|8Pvuk}-U~U=Q~?~Vio?pX%40yyK2GNCMIM=tEy(Voi*^ro?L6P(;+m-@ z6}p22RT&L3XaxdMu4D%Vld;;g*dx*+!ciTm7fen~1iY{CmGCQ@mPfzD)0z%^wRCH8 zUf2m_<@O^(5rjkxs{+*)9vjLd+eMXXA$3Qc}n`G8? z&ZirMLS0^e%+l)PPs!esP0LS2wP7RL>z;6S0(shS3AyBxOQ_bDtwTv#wzA`@nv||& z&BUSI7>ir@hY=7VX^BT~n(c+A(b<^o%{j(l%@l}Kj%jj`_2;gMmZ7R1xdlby`8hw8 zw-OD{Nm7Bw`9<A$bq6`wX|;hwETS*5; ztS9`&<$DdyOO7G*DtGB}!pHsbD|YU%%tkYyb(1LcD5jlIaZ946XSM-5$N6%b z(Ko=XeNTY6XF5y>V=MXuMfydlFhHT}2cQIZ93Z|qM(62XL5dW-;2OGA7|i5y8l19b zn`=89cFS(f-mHh|Nk!L(pTwm6V5OX?-@ozwx&0~es=_#V&1*FC20~j7y3gBe4oV4x z9)we?w#?jy1$ry~3OerNQ6M%_=wUPJXA2mUGGz8&d6T&6(#ZssJ-)Vw1nyNU)BLaH^v^_&PGyU_14OgxW z22jaM2i>Gh>~=qx^~Qm-6i(DfX^TTo+1RMPcaS1A|Bi!G3EG9CBwq4j1v?e~g<3{Z5pJkUmiPVZDAfq{4_CLIBe$clR+IO#*)6Nj` z&x(2;OT+HZlp+t8@u?7*O{#}IMk=YdM&UeGr%_6^F`0Z!`C5l<`^6Bmkm6?DaB@7T zuepGCfm+U!crf&XxMe&hb8Z~KyqhdN5lR=#R&+9%3ehHR z0&!*GmgX^8PZROC*A6|y5XgeAOJ2oq+VJ0t^UBEl8dhv3?T7F11=t)J*%0!|^g`{y zWrh*~JS@ileHM;43cewI@zH1KNQ}>kS*$A?UE>I!*jnVezZ@X1|AGrTaj0WxmP-k> zdz_kvDdSBOvPEkJZ!pzvm8-?Ttrop*nOaq@9iL#IC90siDOwPtUPE)=2j|#N#CbQ% zo~K<*_^-x{2xDJp^*hm@hFuqC{+co$N78qFtiq8vr$F~yNvS#M%^Tjg()q6H`vEd2 zwI_5Guw|RBw&3G)$H2?=yDo5E!H>u3D$nJ^mBebZP=S&)kspHQuVYdpv?)NH2N_1@Cj@0Vl(QNv&%#^15IJX{cK<-`6KAaB3e+8V(lz~LO`#boyi zT$iJR_v2Sijo+g}N!nIa03(n1ykhYPDm^=4uCDb;A{$yny4^lGde>`i{NfH@n5M`1dtC~Da33q< zucc17|I12a9LnoZhRO~;68Z&serB#RMq@LdOLcg1Dzv?M{K`PqLEUnC)hnLQs`}oR zCL6B&+EMiK96!CFoHk1vB*4d2X>|bx7_+&12OTlcd7m?-UwO2pk)il43~nWH4!IlP zPaY7&2|Oh4M^)JfoYY?>Io#u4p#Y2w@1cez)ANRlD0H=)8d`CzF9TIhp1h+T|o ziT;e?~AJHMTOYcxGdV{lxXdN=%938 zTMz&D9Sa?Nxo4qF6hCkAE!1H)i$}9@jA2MrfvnbyD;X!w9{Px^=rd2owu6O}>9G#U zN#hM(qEpCQf_EO8oO19^75`3NTk!LENi|)P2H^VkmN6LyD+;FoRSF$AA?^NPLD>Dn ztwl*|KfIp~4*iF%806QU8xYA>h+#Ci_vtNyY!=Xho?c_I_*$FBhEW-HN;<5(a*MlnR;A#|yii+mOBJOh zMw4^YE2i`gU6Q~gv_`5NoFLDRnK}Yvz1gonq^@`(R-*K?-bCbtzS#0q=-|e*# z_g%E5=TK3XWFFX1SsGqbkwjv)`3#n7;Vegs9xHTS3I(f`E|UHU+JWOzE(!7RQ(>Il z1>j9+>Bq0T05xkBrhc?@8}OSw(ctw5{lfE*HF`{cfTc~>OL6}ja0m#oAD>cnsr+a! zB~Y@Df%!{XI1KmL!cf+poA=j_9#n+AU~M&G5Oo3}=^lGb?#yCxOfJ0{{i?jWoXa-X z6&;;^1h0|ZQ3c$bH{&2VdY{~axKbHYPde8r6;!qRSnU? z7@g@Y2b^Dq19K+}jf3)?!L4d}ad7&6sksu)9mz$yN#ti2tT~cs?|3I-CihA{M*6Ok zSm3_v--|~I$Cdh>wY{|h{<;tW&|jaI);2DJwGGc5%TZUmir%Xz-F|bNgW}!zsat+q ztv26=6234}xQI={7rI&`@r6jB=*Q2t;CASblWvJK>NBKoVV=-8nF93&ZVsme--kRlW(wF=9 zbUDoOX<}svaNbq4)uTjPg+}F)j9Kz4SXYgxO*}}%Tw;A;jK8u{bX(fK9R`Gi!amE! z7VX=4y{omVD1A|b#k2R5c?B%8i<2K+* z$h(6mZIIM#G;hHH>;hSqwi3b0$sbrG8K%a68pJS2w)i)UQ(5oH+y-e?vf|A zUCN!QGiTr8us0dK0Iymj^XHEqT5zG=EZd&YGr1$`a5QRv@8 zr^VHeb3K){h>X zm?s2Er+Zs5;H-rKxSymP4D{ z<5AlHr<6seYdu3fUfD-@dU4ETKk)m#r|IRs;D7K$=%e ze0uN)5F1yW=2H30gDRIa-(JEFt~}-S5|BFtQd0~%$ume^OV?zwGP2i&M7o8b*eyHI z6BuP{Ir)(9F$__%c(xRw($)Ju9Q!`)s<(LY>uK*R{eTes*`;?ywN*mi`%N1$d(Rp!dP|(ADphQ&6{m5NZSwr`f=xn6PP9wWCi*yjQ+eaxB*(>( zmFPx($x~(X7vocnt}ib^uHLZdrMp*-P7egl*4_9-kG1;_ zk;a(d(z6?fJPRtQb=G#Pk%$sF|6n61ya4b|0b%9m8!znNKK_Nq3H$R=e6*rxa8m9Je>N-n@|;Ka zP+)ne@#Yv8d#Oa%=W*ZQh5zD7L*VWH`mUyKpk79klfiD;U&)zOUjB%H#Gcz)+juMy z(Zavgo>TkhC4Z?JY%*=rU$tBbei)B9kVv7<6-|!QW8Xh?A zGK(C|;VXi#30=A4DyIUc@3X{MkZ+b>mMo7(u~KI0;ecIwgs{O5*#c5FbKxdbDZElo z2}_DfR#L#MnysFd7o|8gq%QRxgJZTjhE1OIda`>vDR@k#mU5q z77CV<$7@*03lZ*Gt&ntvnTDlaQAt5BYsnQ)L*8pfay8Lf$kwxO)xL!wG2N)D#1=UT zRLQ&?qm=Y^5H6~$Z5-_W!RVDn>*OcgHyk#yoOxJDi@C|W=FOd3LDfY;s^%new+WSE z4uimH1m;P4*L*Yq<>yrgN!(Gi*JeW1qgifjmU!{4XxE#+2DgPy)D7VWk4bOF>~39i z&StH9iR|b3z_FgN?#S9T*H;|GYl*rZIZ6@K`e&^haHG=t;KTbaUkkmgl9$|MWDgd> zg4(^+NyC*B#V|D!=AOol)Lkb~L&?F}qF3JDI-Pjv^B9WK5Uwn0J;dwo zw`emRDMh!+M7GlYU~P#@UPl#Pf*i6P@a0=68RPGQPWG0LelLK%_p7;J2lwX`Uy6(; zjzgwgqiO@)k$Tnc7e)2dm8Dgl*bxn6C{F@_6$Pdv5C!zK(Nep(n>v;6C3?cnR2uls zN=Zs%sT=LC?H`QjCBBkN4GO;?T}($I9YqVx%`cxnx0bk8b90MEyN(Qikd(!m^;3r7 z1nBpbM1sVv#ktVED2r^Rv>fln0==5NZzs`a_5_^Xk`_~)`}MM$6qA|;dx$6c%#vhY zgCx^kJT=Dss(AkGgR*!%*O1**y{dpDs<_h4wBfZ)IC$07f~2;#mhftBIAzOC_;iM< zJ(oD?|KyDa>*eFI;SdpBvuuQ(4g@7xzl{Kxt{=#hDkuewU#n5&uF;WKm>?8Ff+7Ds zI|n(UFE2Jg?72;vj~L?QBrX1uwhdGnr~mO=u(e`=O6)ZFzPCm0tzjTVpu|6yE)RjS zBt5EC;JYKTNze#_Pe9Uw(8_#S(~)`$*Hle2)DxXL&4o>%Gq^h7-x9(j2d&`o;0p}o zkS_F9ZPu&qPJ>zoF1Tr{T;16C1I#(`VRYMjH6BS<Qn@U6EBs zEIos*sB4)tbJ0@C4jELfNDe;u9k06iVT)QYOOUQ_4{a2LIvsM#26oa5GU(}EDquvj zj!t4mR)t1hhdip6shG*oo#kD-NLTdYHSe)U3;c{FCjy4iL^q!hXcy))tkg>~h z0$RnyQlz>eBPlEblZJJPdSij^JPiIH{CRlzD7w7Rzx(BjkK=Or@~j^{c(7PkBC_42 z+gWod2V1rgR*T)?E2AWJCF21?V^24aYrD|m8&tGf0=*<(=}$La{5(1vITa9w9E8<2 z+KsDjPb04zNym?u;K6{cqv(*&$H5u)`Hu@;!2Zj7XzkIxXmC_2%WKb&4$I5oZi8Rt zk_vdi4uKzd{*VA17tIAoeI4uK7x_iIVi@IgZANERPJ^zT2E%K#r24g;#+3#uc3F}1 zXNuUKgxI8xnZ~VdmX~{Icrr(xIm2N9B?jxPbEh;v#*KYB*~6(W{)%VU7~g6sY}*I!QXi)lfsgKCE|I@*xy4O4rk~s z>3#PlWk0}iSY+Q=I4VF&aMfj`_bRxyMj(;u7@8zW4_@Zm+mdnzgludjOSI1f+4%Aq zQY0eVMGVbY85ZK(=HJKVkEXJIr-g$kV2xfyZb;@wdph-Ba#Lndnt!sW7{=A7`W zYLcb+ShxL2#dOpI7#{ZWYWq(2ACf3yM z$%YMd>EBh1J4G?9GHnI9Qx*hnLRd+@s2rh3+?Kg_dSnVDzZatZeaGH3A{b^M7Y43! z^4JsO>1R=PeYttA$bgKAoYK7-K2rrda)QeH)sF~Z- zJZjNZQ@@0{S?zsVnS+J$Fe*6VZRx?w7the%+n(T5uewYc3I{B+rr&8%N8iyfTkXJ+ z+j{trS)}m3xDvtxK5jnlc2{40$EbO-4F#sxVU{^)D|4mbiSPI`d<#kP3(Tz0ZL`0n zGAT#xhUxLJweZeo=(S*r`p$je;P6~kxZRKWCg8;#&-Y)Y+vjjME+yV1o@@;E`0gHhBbie#x9e&Q3rEf zHJB@10<g$Um!gtW1ix^{4F3TI3s|S}2KQLLa39C`6{!im92_vc4Ww<%S@+#wXfDb|+@?`_4 zv?=@~&bin<@7;v_ScdV#rU0mDs}F0cDa69m7E&B8>Z&GefK&B*kY^)XEbEUedO%=oP0+Q)g90)>MymvS#+NA$ zbiyVppu)zX!xmPitJEkuCRd$~j=W+Q7NR^3Q+u5nGnCpLm_aHU02o$t|EO}j7DoWoI64x66`s_pO^kWtW;eiF0%m|K~XLKP^s(keEt z@P=yEvHz`dh*~qKbUEArU*>dJm(-)iEbqQ__%51A(!19-(VbW$-(7bTc$vIT#jw3| zl{9w_CU4Z<8?rC)pBk5IH-@jF7!BNPw#-h*HvfV9HALTbfrfx(FUaF_9_tNYtUC3@1J|;8)D=XvY+Ej;`OLguF%V@6p=xE;Y=5L9 ze#Y_^P?~e?l%d07R|?zbwowdUuJ3V&bptt_QUJK3dvnCd5Fp2H%5Dufk{+9W6d0Lp$6az=fv0V2V}H)Iv2VHitk7Pg(>HD< z;O044QbPu$N8RaKI-)@lhltH>E57w4f8%3fD{he&H!bojzgy09J00xmBS0vs=VD#+ zkd))KfUN$pfrl>jY8Y3;>he-&z3`@5(yl%_3TCCOrm~D_E9@#O7F*f~pjl2Pw?Db* zxn?$qD;fXQ(kW-@EyzNepr6uz^v@APy1?47>OpKxQ1m@h?k$qZmAac%C87GKU^KVkSU;* zNrgzEF6orOmVLI4yM3ZTb_jWc24ZOvHz*t72p@3cC{{4G3N|DjI+4^{BGm3jquDW4 zRTj&YkRjc>k!1qVj0KutNl=rK&v;|R!S)e;V+Gt%gteL zqpN$>@CA@HmrnLxcVCe3Efh|%?V`|~^a&5wSYQB>tV8Af165lT%FJZIt%jJ`<&t8) z$t8Dhh?ZP-b16$xH2Iu2Fa`Yt!31&{3}?A(4znKHg<2(l9qxpGh|xzH`Vr04kL4t~ zY#9Vx@T*rVlYG>>17 z@PZ8F8&J)Ckl#%e!r~4%{D6_pO6(P~R{kWc`R#l`oj99u+XrjwD7z6|O~lvfkwe!o z5~*I2GCW~f{G#H#=w``w7~<5h2(nGIf5i`(f`Sxje`g!qW7r!?o60*c_D$^Kxxuu5 zhs7F?_SxJ40+^CHJ~Lg@k`ChY%gr;MX`S8Y;`utEN}&)!?`P>^H381@Q~O}3VE0gZ zm69dmOZE=DwxW zBd&e?AmPyX^-wdwI}T^qFgOQX zO*%DP%akj|qNW?br64BdUO6eCAJ4`4slY`L7xpQ`!iH8zNh==Bm@)?-QD>bo!8i|w z*-`xLvCG&{f1!7ljkN2@%kv7eBR8Uap`kVAB0J5Sk@8DYp%M$N?1VdX*JHMY)Nbry zq@fom;H_0BcCvAT_<8bln>$OEOcCmb~k%Wr5J3SC$aV z63|dI{W%q9PWOzhZ2``_FFe5a6Y8l^ORNP+cMrY$y(r2X9*UWY!;`!oA1R7FmK9Bo zg}f#xf}9Cs{0IO5ERP?Fs~=ITm_T!qiJOJ@DlQ03-Jg&KYqni=gf0hojDZ8+g;I6`9AlOIP>ceWYWf6Wo7|vDn`FG@^ zAmZ60YkU+cXLq4kMFcONngI*xQU_FReFvQf$>%xLX*cts+l6=u??O(aa)p~v%>Ji;px0jA{73&* zFy#NI{yzqUR*F{ev~wwTELy&!L6d(oZ52r924MQS>4g@qDX%xq%L&I z)!{f05UXC$VSUq{@Ih30K<-nO%hZ=oaQS{bo$Ysi&AON$JbHVR;X5vw5_fVZqyWOF zF}&|0YBluq*6&9qIEXZ~X-4f7XqLp-qCMr>c`k>I1aVj_mQi(@-Nk`E_@lEQ6}NI^ ziY6d&^;d@v?=)QL@yf2bLZlOm6-|!_$rm_JW<({k)uO5(yl9~kM0N5LndidapeyKy zi^o={c0SS1$Sm1clFB7Ad~oD-IJK%vskbPs{X0gXmv3%ORJ=@P3E+?1IJ_MkIXM)~ z(!&8bp%tB){XFGGt}0t6WD2g-`=A7+t0!@fQ?T=0x^U}I%C4p=CXg#l7lCmxyN$4r zJ3|#Bp(XL{?$&R)70pk`?6!QlYJBV_MmCGTZ4aoeYy*x%B2MpLZ8dlAJU}vs&8sM* zU*d6!b7VC=9ro}`Jm~7$6VqrV2GCQ;Jd;-c?B&y4M<41YlBrp$Z8Kdg>=~?C2TVR4 zp1j2`%T1>2WX4esU5av@iA6&p33zzj;1yX5-LQd6M5o8kuVkv;iE=x8?N>En-TxNE zMsu8e8CHRZ0T6b6))Wu1z<(EJ6@tDD`CPT&zg-^ zk_|$(V~G28Mm=D+8ubCl*T72!4nQ6#>l zF#%`>N;>CIWG9*?=|8Co6z6R0pF|LG%(DRIoX|Y-W?4iQsmL7Mfa(#FUF>4!>Js*b z$i~lA3{ftm{BsH~(iUs!oJtmX91l{F5;bcRJ(j0(wG(u5S}qF3i{?t%j5686H*u~>KKXw^-wwWP3SgbQn_(8)YS$rr5NE~9;ynq@E` zn4ho&wT$oNu zBtIbDNmf|#FSeRD@-eq%Lr`S;Vu`RGBsPS_7>nH)JXn;m*v*yxf*2My?{1J`!J0@X ziO}clX?x1`plEK-5#4xy$CtL;52or2qipQu_-kFcXg)< z;YMj>VDNRqcep&g$L7qs`D1adrFU>QY5*@C*2|!!hg-!9&pj8HcRHPLZS$DrKN`11 zWu~6+7Ww>iswUGH9H?piuifyV(FN7j84H%Yoo~Q+Vl8`OB{k(1EFzQ zt6bg8(Qa^Br&;tOwL7!!cz2IzvkwVg+$AhH+4P-a_kN<@F}gCYJceHLR{Eb}v}IOghQ@@)UpED$Puqj?1BIWlo#g#Qt-W7r!K+<>$f(f0 z$|YJa$%|MvEc3!Y*@AiZ@sr)Pbz4#J&+e1m=Q{fD%1t-l^4)&7td++df;!kgsOu&6 zfyLG9xUQE9GrTVJbd4ET1v{`QqhZa@UrtlWII+Gy7*8GCy-!JEtfKZl{FWW{l5-e< zM3}*zvMl%QbU6?#>4Dr#NXfu=`nJYt0gdv5z*H=d%;V_)7}g2u-LA~o@xaIeHh`?9 zgNFTLJJ`Dszv;=VW2=YiP{O)Sf}-{s%7d;=DUqN2y{2XA*JSs+%VCajn8AZctj?k|2!X6-qeHRu=`b0<{U130u98c)R= zer@%)`zPsc3k;ZTS+Am=*#XU$&v7&^75@1G6{c9ZWL1eU`y(7}Q{9=n%8CoMYVk6K znqM5EX>3)EUA32^Ao?xMe5AW}T(9PD{mv@?>e3#QJr8*(R-@!|-P>b_{yASNNeU~O zF68VUFNg~^K?Pwru39L<99ASePr=*WhQn><6($%vfCdg4S7bmhsJP`6+P7Jq_ z2VV-(Ribk+%PekRYB$KG1|aF;h>8MEM3E+$l7hOBi}CpG@tF*c$iT#}P-?3HKmoeE zx}&qYO9U9bw>y~_6B!M~UC^UGX_`u-C{b7dDYhLOXNQ(0meRjuMH`noMx;9D^z?h* zLy3;;&-WmyfA4z$c9m*7KA2Z=oQW3Deb4cwmm*_tIf2LPG`p1;jWn%R6W_07G4Uek zvn8zusF(7}VMB7$l?pVcsqLQMzWK?EEfeYNR+9El@~^fjuG*R+mdjP0b&c$j6uftG;F;=1W{`rG@QM~|eV)xBnIm$Wl&r!}jqcO6MbM@Q$S z(2~y-Scw>_i{(#~fEIGxoK^nW2M9BBts8dOY`@az#T}vH7X1nEK6W{KFZy zYUc3=xDWsM6x-_}*pcw^@yQ<-Zk|iTJF~ni+-7V)aRUo#Q69i{s*pbnfC`kc{tjwS zt=!NrXHJm%NfCO}v7t6^sN0Bh!3jS$^n>_=EK7L_`!!h4|kyXo`WV_?>4rViKamfhjb-2-AX3W=Wo5WH>&);zxrYYg{`w z0W0QzHU3$JHbFl}C{~@!6fYh&Kf=;R@$H9O)?3}!9wqWdGb~6ciH0&sM3jo)ktjRp zO)omYP)e_+Lsn{f5(|+{B&X1Pl|FbTQb^8DJ!u8&vt&ddw^MU0P77O!RuBWavDq< z*c^Jx_mSIQ1Qae4r-n`TRI7X%8+!&W_C|-YDlIvj?Osg=LZkdfPXl>Son9+?#}u?D`x~knV*-HIt-H9i zzC6TuBYIZCy9tV9e}Snx5)~*zcP>k8vsU*++Z_Zb9KzB)m-21_QJJG# zBFpI)){WtmF=QN$yoAxkt=rM9f%V{LQ>?LagJKQsN$M&I?IICqyVD9Ur%-{JBnFMV zy6-sqzos;Je5i_shdWW*)8O8R?q9QQUk@Lh-p&QSuQH#hn@i7?ypGZpIC`z}yJ=V8 z$Y&anG#?YaZuXV6<>HrF1>J;EdK0cX)#t^)lN8vLW0O1mJz|06Q1FFw8IuOkcS!u1 zMcz-H84`Y|tRH{;NwR)MS@QLi5AW!!eem+c0*Bpp_4hWWwfg;|%%!J&p4FVeBGg_l zdsAa&qkj??M@#ky@+RFYbXYwSx(yCO{Yg>Az?l~962x0qXMv3ck{>u?*k(^HctjodK0OvLUnZ6>UaugzvUIMpIb7hYvQi6?qEt@(1vPg4%HaGEsYRF^R zBRa<|B8P5jn1MZy~`^!!zHXd)VeMv-Ke1w=tbp=#>EA#G6EGxS@Z?&m~$Nk9r z`<4Qb)!$yCv?xc;<{!=~H_VQ=9LSvApd9-)qDpgSyasl1^aK_+0zq5NKAPoIEM39be22k(uHdZIl;ycT zw~_c}nfW9a{7lnZMjzz5wa-g>a&mpmn<*&k|7l75Bw1v9UrMzQIrV84y%kREWEcV`CkCZW!^l$aSzgm5mX}qw>dYBj zy`7i6r+#QRY_x zr?VAP4CCx;t~yxVPOZE-47M3L+k9_bg^d-tEoc_Qw=7kqo2yab(gDM~?PbxiK5Um%vgSUH zxw$@Ms#I`Z7_f3%UvcEaTOgVHZvjp$4GIT8#F-gDXoE@&Tqq~86w46{;)%%ZnkGj^ z#E>`*k|={K_NXeiW-dNyB=RF9K14w8ay_BY?dGM{Ymca~N#mr|g*>O1=V8rE{d`U_ zQueq?bs7tQ)kAx94G=~Q1mjGAc=a8=hvqM1++UM2xtlpHGRuWk>9CH0y_onZ=REV zWx-G%K&aGuSQnVX7;fQbU#gW+c6jQ|($X7h{|zWk&LCBrV0m?g?UEBdVipNcZHNr8 z|GW`!B{)z3FF?@0zxzaGFlS^%lU~usM$ear0;d}Ix01~3oCp3}1vSX;vFrxpGC<2B zCuZnX)y(j&er$+?tu<<#R38vS0k#L{Hi!{gW_N-pWGnDabB;2&Im^Z{o8$u{YuxX{ z;I{C25;!-kHYMD7I76dkmi3|wDJw%{0mLnPf;l<2E41@qYVAnYnrM&ALnZS(#^hYd z%fTLiug?Qv)X>KCI*sgI!I}kl|>8UgRud-YIIHP(;OSujGKt z0baF~_rrQ11dJ;YAMK^2_~_A(65nvgEu0U9OS8TP$xEY&-eGRzm#Y@h8s6wlVwz(f zQ;;wwVr&}!v-|WBST*sQ3qMR+%E7Ql&kT>6MuJj;S#zj>iADMTl`AQw!;$llrXvoO zl#J*8w$h*IlxXL>eH>F&+&iWDjqNR8Pn~_fPHDc`eTrJ8G<7*jkrQlwS0}*ETSvuR zXO4D%P2L!QmIX9Pr-&F8B5|gp<}-zzC#K>bzTAAK1nQgigA3!^l8Li2>d20c#p*zmXgVn}UrtRI9RfzXk1p!1fE#xAt)#2dqcMLk#XMncBEZ&~z>KFLOs`I}f z^vT-$5OS9oG7oLC}A^5F=X&zM4<{-N83|dk2q` z%)M%LDO=#)XnDccA1dtde_5Pic!O2-6Y!=NPrPix0?3B02OhQb0FE8%0DQio{gz+j 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 Jc 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

eYG*+JBgC=eWaiC5!XdJK0vTR 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»!jR%-WL#ZmNTKX${5M z0hgc&RFELzVn1@>XDlmv@l8wn)NNyEnkp<9S%0;xA0ML6h_S4&+_(P|m&QpXmSKv0ZL zEU{CNSF;FO8=6BFU{`OHEEy=^Id=Lr&Dlx3p77*rX=A`jc5eB+@6`9skiPXA^OA~d zK+rzEA+NlPtWW=(BXkC3+P)Ms0I95xNu_M`*u)dI34oGt2g7H~*fL-+DxFhK5WkITeiAg6CKx%Jgh5yt&~ z4*XDB>-Ekm1>X+~?<{0iGj&DS<~G`x`DeEua7DuUx)|tSQiI-TWXj^NX<8n9X~#$N zP5>W^)D!ASd*LdB?r09jx;NOy{02iJuB^dVXPrm-HJ{9X%>g?uRjAl=vmoC*z_+CE z$KUR)zl3`JHTAv=Vy=5yy?U1&#p~Qln_}Wg227LctMR<(VzmF}-|McL`NZ7Jhy;$F zTU!81Bo0A%Qg**UGkFwue?_W5j2}w(Jbu%;)PF#_$W9nH97)h0(s<`+PjA=T^N}#N z3H|K}DSrBTvcx6}w(m6@jmUG;B>c8c*s=+uhK!z{UaS+QHeGCvv4~rb&apToS7)27 z-U6WBSAhqN_D=f@lfaYjGeipU6>AgOWy((L+5NG(Ta>-Hy|(pv$O5!bPApJ-w_TpF z;M-MU%nlLZRV6*rpq2zDzDZHl?I?%^&_g{A>KHFz2i^Aw9iyb8v~I!xP6WV%@!hyO zD<*Rd3QP_9;b+*)L9-G0f}m%%7m#>G;K@{8!=k-cqoS z0n*wDgf{}9gGQxt8D>)i*RN*Iz6cPcG6FtuivNt<*#lJ`tMXK0!v|FTmMk2QJ5mivk&v@0mi+XIhPNSYKzB=};Z`YyuS&Cf1pK z0)<4zaY*hDN-a-KQqQy#<)IFDdwBR9aFM)PhrEI3@_@2J13V7t;^Y}<@oq24)33-4 z?GAtV$HAgwPjqew}O zNM9VmK4GQGA#3ubriufBQAIGk!H9c!7wU^zg=mEWz#T40u5X9_E^m^4&T$2Ndy8}+ zMYZA9kTq_w6hF+(7l&(J+-NU9`i7_Kso&y}mD8}}*n)?!3O9ofNP8VA*o7$cD|B0& zSm?MB`gFFS3DP4MyIIf0wL#iKg=__GcvS=oI5!9fem22zyhn|7Vz4G9eNYd#8Io0< z9;g7gZGpSS0QMsoz^lMKM{JAl5%LzDXFwAVpn=z1`0->#-mmPhfKqSoTIxL@3v@h> zD|$zGKG@aP7KhVLB&(>MbB<_NuY0Om>6RSsJYW3sJNDiHG8RBye(|F7oxw~ZY>Z>5 z(wwy8?$QFPMClUjF^_9BZtx!VbowkQiW{YNIneo6R3-q6Oqrln|28iNn}5FznrQ=| zK$EX!G>MQ@pvkK_dGW8;9DGFCC6a6Lerc%*mOD8`c0H{!_Gn)&Jvk1B`o(;z=#^2% zf$Pg~Y42+``~8*%EcH^8n$f)LtscVgBW8CjP{sCjOFSDuS^g&LafnOiE+z$6PKlkO zMtt+dB7Xp`Gh47#nNlLC4p*DvBUUCrcAG^j7W6KZMmw!J3I)GYgyYP{Ufz$;6G8XF zY1pT`29mm`Xg88%Gma-$ZG64- z-0=I)RQWB)=vJ4dI5sJtIAKsEhpWj_sLQPQj)&2vGNXYIY~#E6om3Ux%etC^<|_f1Sis;F62;qwTu3tyqxj>+ z-O}TNplNN~>6FrzWr$#Sc$=z(RUF`<`1f$M6wUB6vfGK;%%eGk7CHs;8Z@OQ5d;BM zdL7k(7%m{Bnqo4W%{NPHdlzZ-+JXD-_(eYBQ+skMd>ExvXG>fA;PI~sWIM_B&hv+o zMNK>@yNj(}gR&EdV~*l8{!71WpvWh1B&&ygYDfI9?gcU5v`WiWXX6_HHPh}l&w!tF%H!MA4Z8iq(SAo>e4{oKV~qy;cr;#c(qVa=FUG#kW=t>>MF zYe=*_?+LO`w4zBOKl#v$^ze2yyjG+K!Tf*!`HBGxa6#+AladyK3wk;;mN-+$Y(cGe zabG>?56A8`VYQzlxFT_`1dT@LMd<*K^nx=TPY|gSf%(U+h_}CIrh7PI^XU&0Y{EPE zde|WmIp}>&(F%iuFFRiWxVE2y?dMsW1DxqGfSX-@Ke1SlvDmD@B04=ec zDmv@E%*tX8+(6@w_)}`Sd=M!QfGbjl!3ws-V7j3_mErx-z75;=EcS78T|Wk< z54WQF7WHI1Dl5aCvm038)9nWQ)ws&^amPUR8JSPZ=e42x8cNV|_Hf9nPVDh@0eF7N zN{A}8Aedk}0F9)edy3%vO>mREMvHgMqHnW!K2!RNGO)zgD1e^qoL2#;pxaqCv1>LI zkB~Bb^{MrH?h8GyZO-|Ga#gNpi&}&kF95%7@qOTLlgS`*1;-RTh!kJcK=_{`aaz1@^+>L_?>cS1 z_J06)WWign6b+;hv>aMl(0ve6B+|}Jc3ZI*m=QuxiyhMIT`jsl_H^nDoUS%V#kmof zQMN(gJK89OmN4B1XhTjm!sWRHvQU*LgN zL-M&TUidV{i$tbm_@VD@j?@a6SZa|5yIZ7TB9@Vs^twEIAK%inkaJ!(g7kd~pj1pL zXal5aYOzr7E{75ZArd!%$d{V7ERTF957GsKr91r#I~?utpP?ZUi;A=eHje-;v}pd8 zTXP`zxeLZ<##-jJT3!nQSY*Mv4L(-v(&(Z&7w34Ky;xxX4LZY7kHWnxWo>u!Ye)8` z6;P7e*lWDagq|cla!^jjiy_ak0;W}W{7n(}NBtA0coD%|y0_S%2LP8^xOjVQHCC2B zzYJh)!DTq;A{+p-C3I|#*ppm-gWNaQ5ZI;%f-ku22Cky90zs<>&$x?w4xGT^bYFpU z=HTGw87n}c1?m~$KG`7LU#&}bNJw+uNbQPt94Vno9iHFWZivN-G5){L0Qm&GA~zno z#BakSOWb~%yeFRcxP#4Iqk87ycL4R%57ho$Ndc6@!*U;@CRql?lY#7H6MJ=Uwsm3j zJ)4oKxAZP^()Qa6$_i2P@Ef4ly3KeSUUdo&ForF&es>j!rSiA zcBSDGZ4YkxqIjQI-VbpX@AL-MwisO1T51a5VtwjeVZ z%Z#znf#VA%!uZbS`U0yMQ2N@~;gJQ~{aMbx=@L#(UwRDyKM;6H>xsFH7Bhfv9Evcq zDd@)OChm`$?Qq41TJ+-%-j>V1@%CxDe~7=*re=yD{F#5TYN?tgP$%Y8eNyz*AU$;9etF4Oh^nFz@K!yw&D7xwRm`BQfVVyc)xpbW!kBUk6( z^Rq7>0DC>0%h`BTYNYpM8CN_W81=7C+m~Y|KRM9&P{)1n33{(w#tO zyaT5DNxizuIr$pS?;T$wVUVS)rh!44SolB_L*3w2Fra)nri#E$wdNdmTESLlnSYK{bIw!vBEgD1&!Jpgi2l-$G62X9I(!~%802;-Q`cc+tTcBuaRQ+rFI z_sh+0xM#Ax+_!%O@I-+39tQ3<`fmXJ8D9;-krAHdoR7w1yEBXb7qFy)WkYI3E?uDW zugXGDnH5y-3wMH|w>_f{cecZrY$8FW2tk@_w88Fw?apq1#;mebKixqt>Xnlad7l9g z<$}n#mfOG2)9&SwfWo{tB-vg11%k?TsH&u~Beb;L!@Hf>^qOKuL4h7$y(&1SBUS*sJ|BAhO_uW-vwFUT@niAEs zFrM=-hc|4P|1U}fFGQ`zB(F}*B8^o*P~BsAXmdKHq4w&Nx`$=$ZR5q2Jg9tAHxfpk zHf2@YJ>#w3$h>HAt03RARj{YZdn)VCW^V&etijW6dlVe1-mC7MRJWQyLm;|~kA_jC$-|3gM2FSCk8~E3F zDJGi-nZxCaUsxV$AKW}zaKCWbaS23m6GYf9gWX5+@Vj!$gh$>s zzocTk+udn-CZa#uh#HV2dL&4WgP^e3OrIdtcU2>NTI^8tYi^UbCZdFwv;i7tkh%IP z^uoAW_O_#fqssK|_7>G2r{uv^>9RKGFe&h4P4J-l+g{~}FN+7_;%!fsCddh>@&>3F z6z@@nhla)79QJ2rEbJwsMR^}bso$8Rb%i2n)Q+-p@peyGj&*0zFQZ1If=>USL}?@x!?+z{-Lnzzp^1Rlc8H0>sz1 zcRsC%_zWvnY)hC;r*nJZ^_oqa&e|S7CCGjZoQ;|aTAE9An);e`1e`D^%ifX+6v?CP zCP23VB-K}ArmaSI;cZomeXhd!l$aS2BkQbLJ&8Ka+JY1)BOV(?p-qE);|O46O<=4}I|4?o zCRq_g#@eQ!?fYz)F}v@hyh`gHo+kwqRi8iT_ZOA+>E|DjX{DBb`W??ndYw-Pp95H^ z=U$_JjFY$zQk2oAw8|-&aGlG`ZadzhQ3_n-;0I zfl{M_YfgJvrPNCJKK;DYBOerLi!6qDD^7JA2vdC(W(}$^Lz!G(g(k37czkeDO@<7| ze+>UB`DmA4`QS9{*XlUf#&1wpCj$ynuEWCwkcA7Vfx1GBX;2|K%4lsVh4B5*R!Gk> zZL>0<9S(9M7AsiY83y>M0r-@`^Y&N` z>U(_F^14U%Kd0aHTKx9jV^UHUhyxqyoq{mXS4r%njA$r=*+MZqTTTD1{MLXcF%v%^XKzKFfF}t11Z=-mmuZ~z>9jR1D6XVNo)^h78 z=QibcUax-5)gmJpQH?Ow6WzeVW$FhV#HxKdotN(5)*;V0&1tVSpy+kVb$v{Ln@#|L zRL^DBfXe`7nyAm4y*KL$#M@k5`{tw=`HYQ9dt$xz#6bh94azjp9z=QUgyrp!^XDr0 zbX0FfKiiWOhvcdqe+I~nW@yVHF+VI>a3~(>39H7kCFLAFw;>*!`vF+7z77+89R@zi zq zWU35bS$HS7Uhhn<*Yl`T;Ur1~R-%KoM|TC*yHXj-ujb-H3Bv$zssl``X^1MGS7!r= z8<*vbOi^us%yb|R>@7bah_3=51pHtKXI@a30GVs4#4BE0GoBBBUM4N`b#UnP)IP7~ zSQ9P41UfK%sdSo1E{cgYD=P#UrCd)%syrFp|8%c^)*19ys0wwkj(_76<%=sq5xD?$3U}CzcI|63VPj~A_U8iUj(4p`9A&fk+Rh4ao1(>F zm~>cyls03NeJqMvzDGOdmf`5VmMmAApJ40s%MQ+`b4F>T<<9<+KIZ}qxoUN1;Jeq#a;izIEFqO3OL zvbTkm7ALqY*@yvvYE?tI!Er2LT{B?4Dcvjj^*69sy9DbPg;~FS92Hm zO73!Sm*!hED{d2@V%CHgPDdM$H4%jZfMw7!inmg*VHl#Cf^6FGMY8yq#EL9e;SSJHsqF{~=rPR`*(Lcj|2Xthd;-Y|+| zX5HO_h`UJvDbyp4lt^QE0zqn#a>#^_yP|tM7BxUW)pUGNxo%?|qjI8Ky4)Sg(4aR`oK7BS~7PVeW@a2`=wns*sY2 za=|}ZxU;y94Cs_YHF8Ig3!R-?Dm}Ykntrn3+&lMrlcKsUrw!;v&v&TgI|tv9VUCeY z86S^`+s7TRcDv+^?ZNmjoMZ$%k&fZzbj(mT*0ZBjYE$cP2E`nzR9$j+&Ffspy!f2k z8$hReDl#P%0Y)yqv!(3t*m`u?Lzb7L(c=8-O1OHZj(jB@2Cf&;(VyJ#fcR>~m;+#- z$8D6jVaxL%uyxS+Y;fGB9^SK0qh4Gy(FWL1PeG)lKn6Lvl>#qX<0p_T(rYROcdW;) z)x#Lv8`rEV<6+aAyrpOppN{9e9ckpikm`xis-uh|@&MiHhTdJ~7o=|VS{ZA#GDY3w zPBUaA@JZ*ZFF&V90Uf=}KXGK*?r2_I9t%858*6*f;p)3-+W=zpe1%HBWK`j&)V10k zVpz-BKt?uV2gDx-5~Uqwe~6VxO1r?NsFyGo>zUIkbS}(g(N=#vauPvIU_M3miFPN% zc`+Tch2;~4fkZiJzWHPz@A-Y3M`S*ALQ{;J>B8Os2PA_J!grMvlyJkiC+`f9|dxy zCe^{zO=~5`)D{rwo!#{em*l2zQ*=;|c-ePknmi3BisP#SY zwfdf*0+ZZdimnKcuU=0)zKx%i!d-OoD$xfdN@ag_832XBt|zYogweC4)%FxDWr1_q ztAGPGF~d<876Cod6A~*4$%GISRo%O_kCG}7`Gp)%DX}YjRN5vNKaX;q|69qNl0_=#$=wT_ENxGTt|87vkmJHXEaO@+7dl&sgkx( zR5FRB)=h9Ya6zkxCJZ(EQ&vIR=j=xuA^xOI07~2#wa&e%nFy1FvoeSwoG zvf4ICpi1;qXJxV$uDOn1D*@!!Ts{&25x4dVaKKKNs=k z7=ydY<@v_?nlE?O9NE{O-C8Nhu}GNG#`)xM7~v?^bEI_86Mtc(R!!k9Mu`}NFmIA% zp35{5sFW^xJ>+{)xP>zp@U1?dP~ZJ)QQUHM{l=Qli=hEusqDDIKlWWVn&2&8(b3V*>YEJ#m|-PosF=0^tzy?%hX_v#EPK?O65$;;sT{hI{LAGejcWx_|G=i zeYaqb>KO=>{(N=(4iGHS+7{a&Yv0N-O|>s@C>sn)v*_(cZ)d?-_MF44g(*VI^g_#( zLJJ`@Y95qig(Svlt-$f&fX^$0dBE|A*F!hY!ZXeDO5J1S%(=~=eLd6kMJx{B^e$0s zl#E7TG^ZfNiKK0gb>@~N3APKr(gH~Xu4!orR8zM}Fy1r%UY2<-o?4wm%H9c^-73L| z@@7PX&nsa&(z6{a*^Vo=<9pdg?&zC&)@|GZ(+zn}^*m=vo)h7jOgWD|_P(K69V8%F z;9_L!lX}TK<^cjd_NVI*Y#u_uM+l zWcTSKU`mv&2P02vn@AXdwmJ+)6GGAkAbq<@wCx72Y;1?Xq%V8@edK$<<}lAg))!vF z$NY%B<(ZFV3!&T+nd~LD-Qc0BJRf79qwDHxXe*8LGqkrSTK&Z{8i7UWan-E2CH3~s zl1gE{SHE|??5lPOstpCm8$E#{Zj1tFQPR-L8(F`IH>mJ`0eHOwOcJF%oeKYT7!nD; znlexI8WTN9^?IUgbo`xDl(;H#e3s^E97#xG@6Y`ycgk+y!=%Z4jvG5tQ{AHjMu1n< zf#EMdw}v zai-eFnMIAXmx zl%uTFuf!2XHF5B3hz_aTRxF&JK3!9LfZ~cICH!S&v^A|rQ%R`aOmUn8SAV6!H7`>1) zPLSX$X}W8GPRU)fhXjy)&)mkj@jMPz#0zPKS@?u%=T&)&{dmsc(z(7YXeI!nzzz@G z3IeoGX#C%t60;|~(UbKVTP(}lOS{9;vRKj&&N8ryVXQ8y5I-JsXH1Z>$&~waXNR|? z(}BJHV^QNff;7?VpYCOKcKe)M(-gG>N8i;II|S>8KkSklaAx1!oLjfa ztsLHFP2S@l5yM6#N53$@Xch+G%RmoQ(|xr6q_OTb3WTZxJd#BLmDZp;s6DF9CJ#6) zN0)4ABq5)&5U6njsO&fK3TlA00A;7C-GWmBXrc$|e8WHZsdbjpyV3ZnX1=bc0GT!f ziRasG;ilZh6Rq0xUsQvTn>B$wD@r;Zq)qS{Hck+!f_zKWpx4R3Z(3u;&tR{b>YZH` zJbMX%fkwR++7+nuccH#PsBJ{52z-}vZl>cBJYnYc?tMZON~)1(ThN% zVcerJhOLJQ)!8*(3o_a2TweBy$$qVL-k`J{*X(oFdakhX8x)pAIBUpF(4_pI1*OMc zFKwEYzU-eAWxagZwES!~;0R3}M$`z#oILh=>9|2@B&S&~o-`im*XSHRZK7bGkFR=zI+ckYPa{*du$Ez_N1^ZARKZ`H!``Y@<;}`~(L_bM z(+Q^^vOg(?GZZ%s8`n9(m|va`cwzi-+@<(J9a^Yms8+X{P%ge~e#v(2idOp5aXBAO zF7CzvmuSH4s{R5*)d=}b_**fhCbM)?Dftiur!!V;mpl7_n5ipAWvYUm`>&J*9kspr zMi)LcJ6^AL7cZd4%g|l!xBO3@2lR(1%_3w}C*H%v~o&B|8Db7eUH=R z^gLYx0)jD6)23-wn^B+G+qR44dFkI5EjJ0(#Qg790lx>t%J%b>J?Pfkt=ZvSdjTxK zBripOs;**9bKxBeh%AxA!1wjJ^#{{Ga1R}yg?zy?ul4B%1YmCXJ`6cL8AvtVo6Yju zZM{JpseWPQ5+eF9ZcT86$^Q2RMpfK(c*_yY*{GK0Cu3g4dsTol+{DN?uOKm}BU-z>*uF)3n~Y{!C{KjT7OWGQc`#Rp{9Td>Pf=t*j3ge2HGrX%j*7#jvr#s-O6HeF|RJ1)V4P=?pgO{WWT$;~y?(c31cu~6B`6aAt?*$xASTvrw=KDf9 zMlvdY16ob%wzWB;_R48>tus(jWqC0tZY3&8<`PVR~1tv>SZo zEm#fu!XR{dPLz%VriL#I%aT*pkqzqz^SnoOYq#Y4qS@IM21*X z&W!Y|D0}qjp!m6xueEv5!8TBaY86+-T7sBu0==Q-?apQmTex$k7=HfMIST_rZYa}OnIpI4P$(hr}X zedO_TJAXu>SPec=fZv$r0^lgLl2bW!)0ileEwW&y*kGKN_HiZV& z-V0#YvT`KT-RM4?@bVotaNC?jBt?|z=bh@w9gMr4oB&Wp>Z*t}b$xZgZ_RmdRtdxS zeLwKS8^BGJaMR8WL9SXLwZ_$U=+#>3wlTax;H$u*!Fi?p5I$5d?-Kk)+#9on~@fX5@|xS!w-)yehbXGADkOf2dU&3 zaTtj zrd|}8zWc;vaU6$Hu=-KtduILOV0@G`lSO21q)Jl(Z#LjD`0kbb?K-m-K7b3kB3tdVAZrojOuXM zn#i}Tsf6&5s->f79<{pMN2y#gmrJ}K_@M6}@9(>)(rw`*x5REG-Db=_$O1eEI`jo} zwz*rx=Yfv?Vu}9H2$GKXLzejc2k57g=cd@YkM3fX?odE>Rdg$~o0lP8F4G+glD_vt z6#Bgf=;o+!cZKYg<&FR-eSPYys7@7B(+X}{^0G{KCTI-R_dyUmKzDEO32i4|A$(;c z=n4b5K#nvFM839RXd?N%x@U>c$OttHA8MVNt1aKMXiHjiRogc{pAy*lIfDjFh5bA$ zezVVVS|%nEVmePC=1YMMpbG2w*Aamif{m8qJnWDXJb+VA#b^TFOOtEc z4-HvsV~RYLfp!w82{BrKg*Nuw?xRqsnS?0kBc89yt7ju@SMwYX^AN@r50S_w_4-*7 z-6x+dj%#jNbJ{UJ%EeNy;|2W(h`YTjZ?>*VD^~t_F(qBPQ2=07N=jp^jj%2kuVdC~d~Hb3ajq3~8cMnN$%0NJft5U`pwqaapy5`dbRtBhm7qJD1uYOn z&}pg`bf$Hn>w?aO!mdKlnJ-`WNYGJVE9gwr>A-)opfe+|g69-;7B&!cZ5)Eqkq~7n zLH9QZ8W8G&*2MkrWuhK))J2`8LSw2CbtYeDEb34#>RielJXzGaFR;4LDe63EBI^3! z4dp8h?1`{bvr*W9Q5Uy5dKTu9ZroLub(NQGmo0Lrw#a!R<>IGHFBMqHvq~>(Aic$S z6oqr4DXm1evF8;4BDY8rg2R`AewgZHhjK<}?2_!vp;C5{A4<8yC&&)4#Gdv1=aC)2 zHt9{5hwuQ92wg!Xzl|NL09lq{s+M8aXmDSbVlI>>EX7zW#lV+x`IDs>1Olt`oKg%- z11YXfeE>u#lpR!Z+|XaHgMlP9aWH%tYbQqPQVc}j`aVf9I8aM5m2%HHDdWQf~9p{Qym&u&>i(A`~ua zx;P8P0#z}^%v;{O0Z5~*uqbS}LJ`HH1~l`V&o&U<6`~b-C@p*+MHC8Yo8`4jo}H5l zlosxu&j&cE0?sA1Bi<2c8g?r5>v8nekC0I+7P^2^^_6nmf9b;0M;iAzDf zC98KU$bgt@MXT5z3A_2l9c_dl;l+o9nknF0 zH<=8g0dN$0>KNEZfmowa(_1K%)ghNR7;Z(G;Aka)(Q(pBx_E0HkSb zOOjCf(!Q5>A8$*NNZ_znmHA=+hn&4C-+!Vlk*Ek?;gd!|=jpa2Ngky?Nh*Y-UhHpj zhK7HlL?$INFAg`AxR4SG9fjEv0j3&Vj7)M*X#TD3%B& z!w>yAc%WYp1^j|F@bk}99YdNvN)a^y5A+WUEy){b2@F)`3+EAQNxWH0){WhLJyRAu zNp&(KBqfhloh%d>2U^w1DsAiWGo_-=jjioNXvjahWyr8nRq41YX{Ive%G{zOmmN{-@WVI%n~i5)vrvMYqEV zE)nEk@Rl+65KJVl1ds~DCeqzUkx+;Zz5c=B`XCu&(G}f5;Yj27OlS{2zE_V~^A{Sk z=Bb)Og|^wnI`KR1n!V9I`}?rTSQe1h7Gq=cDY+?hhNwHg8hCR(UI9yXWOR!)-gaG) z-MvWX7GLr5>N;8cKS7(6wrFGD*Q3R{#x|$NhuuGa6w+|&Xc?v38eZ_eAlw1UyPttH z&?Bub#*`J!{H(r9TkSu)qv3Hy55EqrkosNh!Uaa7#|SwRhWaA;`r(=F<%QEgp^YHM zzGi9da5g1w$LAwjX>vq6)%VF(ISK(JmIfYs{mzD!R{hQm7hUMW^p?f61S=6(v|2h( zegEOr##pyRm4&T6Ta`M>qW>kxigriEsq{IEY@eVRBW?viWJ273thZ(^g%(kOC0cT= zfCB$TtW+EXY6{Ks%&Y-gsGM2D=g~8aSOF?-Irw=1?F~77*c?M-7kS)o_e%ctn6Muh}z(i_DMa zeBb;0Gr-j7Q8~ZFJ18le29#526MK;OK5yuR$DvMn#zLBK6b8x(F??>cej&bBcZp&2 zG8Q+C)f6VrX>r4}k;M(OCr#`DNZxpS9!GvtV;cocjcsHa&jG|60wtYJWOJkV z={7e?8r$5}@Q8BMzhT%PM_EHN9_0%92ma*Ct zy}+r7K%A;cR4CM195YtkR(C{C6}S6}+(YPH$;8){{FJUwIiiDsmdXaYvIE*OyHw72 z`lIHzZU`%#eq>Ml$B`ZUt6iLKx46$pHciN?> z+mA{>kF-)v;+HvWFiun&e{}rO5v9#=?}M-n0HrU*fuccdK6+?-5x(D9cPJ9|;8qcs zVWj8uv~$W&=cDh=Kk9$!o_rN&zJ1!+F^{o>o0fM-Go|!f`f2d{CBK2$8RPMIYHxrY z&WoS_0@9!%(m@SrumNd6NXv(i8XZz<3ZEW-_6ak(#W*cevjM3Ar{mG&SC?WI5QfbV z4(bTQ4G2SUxrQ)OA!N?ZKc(Ew2S7&%*ZJe$Rg9H<;G_L-2~@FK!4lPm%5z@*bbR$^ zMN-yfl0N52By3^r54>%+t(A8s5_vmF4~NThaUe|9q-71)*PvMbZ0l=!IVN5+UrTfr zyij+a8QqOhwH}4fsiiANOR~j1I_}vk#syA*D80k8ejk9tm*Ob$w6BEN=Pa;!U+!%& zyBXe=Ew32P#v?v|6wJEI0olJVuG;OkeO1YH-jX?SV0^?SZT2A4@n}9D7cO1GmS^w4 zU3wWUKH+rSL)xT!rQ>A>M!k!HtpL42;%XC{UXNqcQKp3LwwEn#_%z5O`P4w zvs8%S)O4-xGJe!8%BgzBuLkZB0N0>%+Zu?PQ?=6q$sEoD zqRpoBpDR9i)HmP=&G1j_{QcpgHgC=foPKE)3~)m=+0jeYtg1O3eDx9iZ4*VMxJfw(kgfWk2JvXt!i2x z>-kZniZUK}9sh^W_v0V$owFmde*oP-qG+nZHoaXS%hZxkId}gOf2GT9BS-kR-U2x) zwqi;P3~oBRE}n@K@2<;oPM4#iOvq$bA{9dNk*81h%-0}D5mZB~M6Mi?jsAL$o}QlR zIeL~WP8OA@BMN*C(b~UoGrI|VHn`8pQ$1Zg!8>&MHdpS$zHwok@sE|60Y++x3XHOh z&?{Wy*)^-;NhxnSMs%k9mu%6LOF*lnjy)f^$?uvb-dr1Xu-r%yg`emB(az7!e<}bT zX}u$iZkHV#gECf^O>(c+7NjDvBQG5ILDNEX7L5QT8Aw8(-~2z`J!N>d77OEBr_;AW zuaHJ7Ox*)VV0>Z7TZ?;s^L`xG$P_XI7veg+DQnYB=m-8+yVBtpxPjotglqQT@(nr+ z13IIv6cg%Hh|^_I2p#L2`>QozsIU7(($(>*3TCr73vwMlM$)!3oZ$PTpsb5s8kgb!tolcE|5nonvGxT`9b+g>eiqo3~i`@a4 z_x1-Xjes#~hM`{Xfg)0ROYwQERZ#doQ72vWOXPdwtO0qQ4n@sdh0?|Mxu6HCg_cR= z3xQ^#V-l&mrpP>!Jr;$^8H`F6X#&IjP+DQ+q3`+SDXC3f4ptU+yyOEsdaPWlhzv*Y#u2HO0QY9Usu#5lN@ z%GNk6E4l50CX^-|dZ9nwZGLClqcB1dClJ=ry=MZ)Y z7tc2wZTf`3rM=)JmEepZILUs&k%YYmeQVK4)uNM%=){IaC)h7Kb^n^kjz~gk1SwX^ zP8zCH83}f(F)Y$p4V*lZ@=sHxVR61H;27Z_@peEsM=`AFuAjVZfhu*x1QkGa~+ z*y_(Szr79dys1>GSlX|b)`bKXL3?Avd+Nd~@do2VpqN&MhdZzoq~Rk~i^hkAFXMaJ z9UA8m2dp(Yt*(MOEf!O^)UY?>8;k$(1W;*fC=26*Jkyi^$5Bcia%~}Ld^Iw|(FIAR zbhA7CFQ70&k$Zl!kD@3+5vnr~2{xaplk7QLjy>johB0Ovm5X-|ezW;Guc5<;V06O6 zh3^M_@Q8)S&`V7)*gdNyXAqp)JtH;egtRdDoV z5=E0;_xIc;Upx_<3wzS>F?dLKo&F$t~u&zym zG-$b*9ArjvntP-EDB4N3o1sE;vb=Qhc_fVbo}ccSC6h`GVj&nPrq!6BlANK!`b{;v zmGI>wS%ztlE3My3gYpBBcWcnPmVU}Ng&h(VY(dA(_>YuL6SOmcIrZ?~yKSrP%3sbJ z08Kl)xGE)v;9{B0r_*AAKKd8`7y~wJZwrGmx`+J>()h7zCDFDIlitVvO*I~t6C0QK z>yy_%vH@V1FlM06wKnUrA`KjA=xa$iHkvxqFwmBX#;;Pf+Ae59QD7sDy~`AlIz6#q zk3ExQVL0*w`Zc>{IN0m6&`C<+z3*(+gU1eb+vD4Rep2$wLf($P2P@IT8Q*eeOoMG! zpi7z0E>FM6^CjUfuL5y{f&y@=&TS@1NZI%b{H)3N5`#c$`#mSZ=0AH6tX#1AUO0@h zC~q*i2LLn!*5O0Lt8VdFW~L@XWkN9s;o&BO_oDXM+Ch z$;5ETnc$Bk6QNM2oC&{0CL*ECT_y(VOhi>CjASAfupwt6jz)VjG5Wz~Vid)a2@%Vl z&qIc^MJ7_AG%gb(btaN36Om*h6R?CbVSMB7$%N-|Cio-CghK1tltZP&zHrNRMpPUK zK~G~uX?!R6GJK?dEROV3h%ljewJ$HFwtvMM$&GEVt>ppK__4B+Jg~78r}vmdWO7?N zPo_Z0?rR&xd0VHXqe~vkTuszQKw|D?7-^hE5Y{dzB5AdK(olocPq=sIKbsn=p?CKW zprqadP84mQy&b!B6yTtvK$Qqp%xW@h>~yzur2n2r#G9RNk_uMtuzETy!&rdG1Y+nQ z20DnS29X0|5IBgD4kAI0HWYvA3s|httf^YcQu9a+A=R$>z=UXRa5`U5J7&#V5A9Zh zzp&emTx6ZzQ~ygo9*+;fF?y`5#;rEAxK*AYZL`pWOQj0T#AV%@!I#VO8jrLn0o!U7 z$bhGwG00s9UcoHJ%;M?%ydEI`*W&u9Fb7E@sw~mCS(qYK7k?($ zsn?HUv+u--%`KO>Y;lggmg_+8Vl$&v)_~6iKEKobj)3uwJoBsykdb~PjvjO5aEmNw zhpdWvV(k;^vSrr)n|JgbGuhk;3P5!akQ>QV-wsf+J4RWxU7_!>bKSmB&?war2nPXN4kkk!m_yhFo7}H>bscTfIN0gg`rW+%IzWL{*h}+~P1E zQiU{^$57s!!?6|&?QIgZBz^&@MgiL_bwQAMy4C&oJim_~$}0cX(0Jpx@lf{g{0Nfv=>w6$PD;otN8tog8P zUT$!~3BaD#Cjge1DNK0%=oJ}xPUUg!&lMAM6@Jz8049_L7(EDYO3 zaJGFQQ2>zWu~HxZuMQ*vexk0x^daIr;xLbZm;IbDk0@t=$+a1Xd}YL4e0!Nbc@73msSYFgUHG7lnM2Oh;X2*2E;m^xNV{%1bUTe7?Ul-=CmscB>-2T+1ZqFS72 z2ttZ8eY4=L*1YhmEG}p?OZnx;lGt&VqXxT37uQ))+J_C`(Dj#yn1sWpXO_D%w3s3e zEh4LBPtyu(Ghhs}qW@uG;i)|4x$tK8RbVVF2#k%w(88NWnFbN4fMcTISfv}WzE^>$ z;~G9>XKvX$mS=@~#wp$}#96HRK-JE$ZQ*ChpvwAGkocY~JC>b$U$~15Zdy>jB?flt z&CrOzG1GBmocd|;x0@jF)XE_Ce})-m#^=>NZ3&%zEJeNVBdU5DFkZ!OXo~{ZWo!BSDiQ<&Ag`j6YB@1iTLYcqY(JS z@6A-rs~-t|q`?>XFy+)&)7?$z<4n-w7U;M@L4u}wb7C9Cb2N^5iCzH6iB##p>kr~(`%c~lh%8kbL(g(`-TG?#li!6{1wh=^Wpy#89@v zd{`ge0`gq#F{tY(l{-$DZgNxwO2My`VA{-|fl47lw3EjDP&=&()Ear=M#F!IZ7SWi z&c{|Au3wL^2LP&`bA7!27KoIYMv~SbyAV=Oc_I_OSBVuB8IIbi30AH2?j>BgDj>l% z>pEWm1iFTIj?c}{)h4;d@rEze2kPVd_#x(ja!r7MI*T)vLayd#$9G45l2?1a#&^el z0g7BG0xuXhQ0%i&a*ekPUj`3sqX5>Z6A(&fjpCwUm5IWrk)Vbgut~IYWx;(c6u`#< zpD1pqR2V3LP1L29>IU!Zpuv53>o7_wDOZS3S7!Te%AJvo9&`9};HVin@Y%g~SYDee zJo{R4c9_7+wRttZ6n5&3@#w6Xj3(0lq@$>AfdQ_RDv5%s(zOvby$a37Xm zPDRgkZP1eRH?&cNlYao1KwyR*mVxht`TObe3NW8N`;~(Mig~P3P#Y_ua(BnU_jvBa zjyJLaDOU4L+BT=V2ae-$T^jjUse@FVEKS4cU;H#IKFLcI4lX7Xsid`1fswbtc=P$7 zv@pM;^NuKF$If@$i~f@R^Zc$rK5P4z{Ei#`#o?=5cn5+y_(ShaM+#-Q`t+)}{*D;f zTB}}UyqbTqv&%Hw3?AzKq}mlnW=E5Wy;)#gkFI((poT?c{N|7eYem(ym#2a>5>iS* z(6m;RSOxe#mhVIFoge#V*Tu1n?+OV-iMkw8fsehW(sRgNo2nk;Q!rXA%af-LeGsTz9W9s+ZXH4#s|AlU4E6Y zC5=+f>1q)3SY!{wsV4GWavmo_n}c$4e2aduY(h`fRgg&|7&JDTdJS}I4JgTlc1R6qPe*}*c2ub^RMZcKdzxv8?*n`v z_})7cHgl1J2bmEvqhk}w_aU(f?qUO?NL$Wn{J&5JCYS+UH=p&xk8ej^REJyd;d0|$ z^6~vP0`PxLKFHk>xoX=N&_u-qfz>fi#RNf3$LwfjDyPxL3VqOtpv**Zo{ zz>Yfeg&M+-KXn{doI;&#P^-K^_*7)jFvmSI=;QlPzK6`;&KN4JdmvF?N~vyXfJ`l! zSu9NB#zYRNIC`+hB&~^>fkuk@lj(SJy<5p=*#p?|x6Q{)Z4~ArFeYiVpd|yMBLk2I zLYnH0>D;JOrs+Xn-(2@;fxzy<%_BVmMNz|Vez|R}(kEN51O<3}@0tTkDwgj&slDqZ zzlYI9q7Md%x};L6h-T{$Ja2V$c_y^IMyqtQi0XD}o(uIrG5#`)kMF5lHREQHSr-uq z6`BcO8euV}-x>=8=(Z@Hcux+jPB;E+t2qHPRCCveT>TA84ffl~!*w`V!I_tU);W+^=^u~MV|dO_m`|65w3*YSdH7sY2V zQOjgtBsp1QUR`9&r!>D?W%qLOasFZJ(y(F$ABJrB2ZvBNGzZJf*Xo_Vo}Re|47y0@ zM$OHiPh_A})yZOzMSf$3=ow3IX|1-)4agE9b8H)`WiUN8(MBp$p-UR+Ttw7?&2dCNntyT!GAL#*8zgj`{5s(p3@7>7E>e=Y2q>^ZMl zCcG)NGlb;g)=8hOUurpXcZUw%9K9M>j@BQ?Y|>i-FphMLKjTpk#P)ph6SFJ;U7f%? zUq~Q5@>);HXfXw|SjP-sC#tWl1X0H7l4nx2i0C$r^lv`Wg5<7;zPlEsc@jMfp9SVw z@B)Cj3h=LPYdcq(m_>XbuDhHQP`W2u^pHKJ#g z7C+q471+S_F91*rpvFsLli8(#95D>cK&nL}X^KUHCQs_V9{v>-75P$8Y-W!9pvi;* zuvd@A1Q3BhjO`B%k$ch`QP2s1%xKH6@_OXVsWCLr?>~(%hy_d(96Ym*-}`F0vJN=W z=5AvNI7I5S#F7@%n3k7|Q}lToX~EW+U44Y@1i>H?24N!ui+uzcvz$qaBBW?%Ted?4qy_^6R(YHZ`wH>N&GnKEGwz+lQUilr7{rYN z^nG!8GXKwp0L8wLrOk%i&E+OdAT)X7C=74jbAvI;3-^9(pL9I?yp6>a&wrWoX16M) z2jCmQZyqDc>+HOGx+)Q8qqI5D;8PB6_vPYzS=IZDZ0#+39AR&9x>ucf=Nv55G9Jh3 zFEvWk?p-VBDTOv&*2a(>lDv2edj@Gq)D{0o+jaQ2`Bh^FPEo0 zAcDYxP6WNztdn_B;Bdaeun}~j&^7DN*EAO57AV8bs!+({r1Ge}-wK#fyR|`}iX|nX zH>N*3i?g_#OKK?d?k|t1TpONF2joQ4Yai4yRuZ41Te&&QKFk!@GwIsL6yotqUwyi;EQ zdyRm25#%kzmt(hPk{df-6a0~z0g%MLpZL zZ*yn!RPAj2p4OVe&3plmWuz5v4Ya)RpZPV7ryNU=jJD$1U@P7nYh{5}-JIF!NA3<> zZQt;&_RZNb-L+XVR-P{DTr=*`oe6SEkA6MnSm0=7bnya!>IvaYr^cgi{A{mt6lk$> zUm`wNMtXkwJ!O&hkvMrmbehwK2~mX21`cTp4m4O&ao7~xEYohI!1uYfZt_ZMo9)`+ z*@yD<*y)cq z*Qdn50fRCTN>k||%=T{6n@e# zyE^1$G8bPF%%G+C=YWiUk&|4*kE1o>7q!_;(}^QEt$@MKR>kC}DIH+lwSa*t772VB zXn1?}u|E9YgTKmLfjsjDyDk7{^l<#j`j@>|-X`Mq6QO|{>Tw5e-@Fb z9_XnOAZVO_}}PD&%ymqw;7jlES%4PdKqDD&Ky$Qob*J7@Hy1W!#PAvp5D!<@iz zK;$Z*R){GQH#0)K?TJHI%S9=Y8|d3i5VXraq;69dT~>>0&M0m}q+xa~Y6(uX6ax6F z8rRe644XqbgNd;h?jo5f6~Ko&zp`-r#AU*aS9a$U_^BEl)7r|Dg4B)+0?o;b)nke6 zd&mM1qMHbVJC=-#)&g0oPMJ!;IV8<47Z;x%^LdHK!g7tvD{1AqdOW)i8Jd27) z8rS`qf$@bd+E2&xQ5%GTHq%BYUMoJTh-1*~c$ejLS*~|>9Rlb7e!B_yMi0IfB{Y8B zJ;A?9CS!H6D%3c;f$?>!`Px=>;Qhw_zp*Z#cX4TSXzT?2^WOsZR=2$N$b9?GP&S@$OFbGr(E+(sw1-gLp1xSrP z8ye}g#cwrCl9B^f3{4X2Dw8z##ZoR_!hB{E$$7;- zRiX=9j@kvzMC8vn^dT^fG)&pIbvd!)bDWnqFRAmN7E`?4$p#b)#8|HvR44km(zh9> ze621fSDf#y=Vx+7N|xo#u~HCUtMl5xHPv%vaD-+c`D>x~bT5^r=Sm(pRZthSSZ_(j zK`WiPD!3Y*s-HM7?evBRIb>d9`V2zV;rN(nX6CFayI3XDE>^2KFU7m!cjtES7w%D^ z$AAj;8B`mC@q_KluJ`4@PSmMTNSLc}4$2UP4bn_UYAmS*d1iG#$Q2R?JzfErIzZy< z08Rh^uxCQ95Jl)+OAaVvpOf^XB%YZp2b|Fsxn`Hu!!!YnJ5JXE61DZGak*(;cEF}5 z5K}ep>;aD^@Sf6q0a=psvkPeN+EL8lrx0P)ar5D*H$xs$Uz=NvGi~ovS8wZ$)I7{` zwkR0QfEcQ?qYzd|dKVP23=!{sxDO~2p}70*A_;h3rnmv2I<8N(bL{D~{Psint&|#M zO0@+`&PxP|KK2n%WWI*Ntq&%muA~vv>JfIPjR-qJ0ChIRh-H1T7#}B#6}5JugK z{HCNEVL^dks7_fVl8|~?KSA7M?cP2%LQkHvr{jy+!xdlSJCKQ)=))fgi1J6MT~j^5uz;* zUQt7@BL_e>hLC+i&UPbzAml%n1rjXKeC}~0v=Qh;A2uKk4=)S6<#Pit6u|V(cO)=i zjWQC-%!`A4lpnS!)xCY5sJ~3xSUsF9Z%VcZpFde3?sfpF6eQ$A6kgsYLsdEI#n8n0#HypCBX=^r z3m^vxU(EFj1{h=#9drTctjHp=+gnnqQs5U_2$fQ^Em;5sdiGK>;X2 zp-4D_nqXf9H6Ol!CK8&AwMV{Jd*m|^#X{7(^TsHzeq-s8jp7Kk3@qJRSj2UMQm!r1 zV^eej_0LCoP63-r5(j&`D*J;JpvEJ!tHQb<&xPkuQXwtg`HuCwIbaz3{fg8;scOmVk7&L6sNTmNgQcc5;#09$Vpvx_&|qCb@ZNU<@A=kV4!jWd1#nZr zWs57kEBKGels9Ctw)Wg3jHXLo`elWy5(OZu8(fr28Zs{nDQ{8EdGi~hSLrhw4r_su zfY_9H4#ln4tP+9z#lB$k<8DktgeH5kN2T_!n~$`o19*WpSFvd^jD7mls#Ke`6W6d0 zX`~dy{6F+xeysdAK|-mL{MFQdthGQIFh0n^97f?Uou;zuitw+_`}KQ_utbc zyT_c^!)HPAY@M#BVaR_G#QZxL#4So7+A*$h&&L6?L^msf!w)VeKappT9do4U%HkIY(6uZm zW{Bz0#~W;5wimErFbY1Yf=_M0#*e<~;OzO!Ih7yla83c@S^h}5yS7=Pf`x(wr%c7E z8WDDI7YfPCbjgY5N^#Nb7N3fR%cu=wmpA#^wWMIAF~VFNNAQ%E9hA&xtV*GUAeW>g zZS`C&%aZ)26b|@TPRsdfVyn}ZhGUre8iqFu;>0CsZ>cO_cz?LOJU#}3raj_QBWi(q zU1R))QSI(t302?mZpuv)4A|;+mqwC`Ocf`bhdI+9wrx9g^`Yr1%Jimwy-I`zh3FWUJv?G)oWEzdxc z3Qd03ZA2i*?zaK})LK_Y==+ke9!K;?qSGv#>opg*=P?8>5V!#;U_WV8z(u8iL1;jj z`I;$15QQzwdQ35bG7@%1HHC**qtId3GY-61UEoQp)`_#VxWP!+Wo}>V3&5pn#+hU} z^0M4-?i*!bZJwdJ}t&U4~#@)u&W}8>>^0NVY@G zG!Tf=w$nhM%Y<31>MeM~ZN1HzT zhA&l@1Hp+_mk8`v=3>40TFV0j1?Wbd4iVR0pqY(eibyC775os&dG~CD)6Oyx(Ja_e ze6Q&U5GU%)rjqnXF|h-hOlT4^Fvn?gcA4hDHss0b+N~v~-B#}OMIT^llQQ;&ZMJvt zhOYzpI#&$d?EJfvB6bP_!l;v0iA?{lQD0U2GLQp8)ULX>sAF|X6Xgjbc<5w(Kvb7j zS?Dn5AhEW5%4c8gs%S7w)k(|RxEJO)Mwk~pik)F6dnG0h`_2`<*u}e|VzWmo*3;hs z(_F)p;CT-YXO$hwd;|?~y&$*~7~V>y5=R_FVHw+f6?y|;?Wo)q=emCj!X^=373(#4$F#d1uO z!=>9e+o`_zI45p4p|a*CR5^K^5m}<4lEF%qjS6y27S%-mVX>f5B>i04#Txa%Y=ot% zxp47qDvJ;7sVayyHpv$Y_6NH1;Ku8s7~v#Bk(5^V%+VR@oIdjfzE)2o=whN+FW0am z9k&ai;}gf(q~vVkDEw^&_ySBqPyJ^dhTCF!%Eib5x$aoPQ58(&wOdjEGL3Pe+8mh6 zkgM_#^#*R?OB@-0dvQo}N%DbKguL8m5-E3l{eu1wVi3!zc%aTS)c;y+Re-V>hEfa~ zTUoWfd*A~y6T7D$aB$eWO|)&f(M8u4C8;n`x0%dHazY+u#QR1WXIG#Jg(lWd`ifJk z{iJUe3%gV?j7NuAZ&n(&6AHQuid0>GnR+W8?B?Y;mRgoTP@BxTui~}*x6!%})K1% zz$g<&1I?xxrpVP(rsW(_8u7vPzo#>@uDX0Hi|v*iSkQJSCdh&|XuxHepK$1IRv!IWXD{g4;qo^p|4n}JR3-*L*KQD%ta$peStSElI8ctdCbyb>+vNmK9UNv83tmg zmeTzvYXB~4mB3!!lbppO2-F4Te!rJAFIlnqdEFa~M%beqskYhS(^NI32BVFqFd9wZ zNVB63Uy8B9;Ys#)UNnI&LgIOKbfGVFnZ_duqQGnE5e1zQW_NFV1VyMVfG|>7@OAfi z)feIj_;sM4f*Gs1Cz7*)N8|Uf@evn%dI5XOFlhx_=>(jh{&_ zZmxi?7RD%&bm-0tVfjPFi3b%xu>g^11VdEB&S!97&-#QV97EpAuK?XBqeLKc&*a0M zspG4F2@;}uLCLw@Xn>XqTA$tV+1NJ??s&3F;fzOy0ku6d$KnRakrl$FQ)$;}10;gqt#+eUCJD69k7T4G<{T=E8qRbhu0^Z}R} z4b#i&nR=fKx1nuGfE?aNQALM{XacRbhEfOkP@Vfo3Opd$9E=)evz*haK+wcO6M9jT zJA7JvAQ})PLJ%>NaU+vyjY%pri5HFcFqsOIObAkMJZvB+uc!FB60}Uak~d0xq3PZ2 zZjLlgJbY<%CwzbQK5uzpZ?5XINhP9*63d%6)3BnoYonbn1q?%V(kk)jE1EHAD)CSq z0RW<;{nRcfD?!n1$zK&01>)4)p;(hlT{O9V))vE}`kZZ)sx?%qw$$W=`p&rb>SRQj z#ns3-lx$ww7&U=v?ln%A8@eJtaMKup@x$ha6iSN7rvv&(o$XjSC5n@lm>>~?RI$>Y z3DWzosEJhGBYc{-T7SovX0GpGuoQfY*4D~x-MuUHF~T(1p;Tg;j*aJl4tn~ zY_8;aek@avhkL%fc7I#UiD*TB0a2%_;{)9VAPX>iiU_4^vGvQ&r$cYK!bVxr7C0JP z2*FS@I>qHzmen>3z+~zo%|%lBBq@Cp^cy6_I&n{HNzK(-E)O2iZvn`MjFSqG;lmu( z6&rsB#8#UGB8_{eenM9lWR-3l(GR=HaI2PE>A~9w>~!}HuLIpY9rc?(cqPg6huI;( z({@wgdG_%2qV<5rzVcLmzJA!AXv-y19qupZi~=iAb5-@W+t-H2s%=iS#M(EY{Tj59 zI&pD}v+M`!!*dGhd)5~Mu;&d=Q`kCC-yNiX430?)jxW~_%f>QzQir@Q?egrutY7JF z6G06A&0DN05Q!*d&)H3jKnYC%iA%Ix0)zqyY6Y}a62v9m9ed{Ubh7LgCxl-ljqS0= zb9oNipMM1XVxe~%RjAxX-5;g+wdx6eaK>IMKz{wL^>mAW;Eap#kgC z7FjoWZbuE2>`jM{A4h}xcej8i)!<JJYh}vlANS%VEL2gtJULmBH`TnwG8URD|4`E&CJ!IO0KM))veaNU>;q+^ngVA}gL6s4=tG_i9qRUN^`eMH7*+JzLuQ8+o{Ke=K=oT4GHWsa*8#X|fpfcMRVj^KlCW8f+k9}q$wTH^&hmPK5UuQtBA zz^}y7wyK|77nR^__auHPjIM}hiX z`>ri*=#uh-m=8dRvw1854A?J{9 z1TtTWp1JteI+X&VR1_2;BOkm(kD!mL8w=t%J)$KDZzLMm2UkX1%4)N(_n ze3KjjW2L4o8iUcaMH=t8A3-kNQXC%tczmTcbohZ7KS~wRw;K}s?}2<0sd5& zZ0~wsA)tq##(SBXfm}U8(W0qojOrC?TE2^F@Alb$)@=6ZbT{OtR8y!lA@jPxBqNG{ z!^KHwZx1bpPUq9rm~%vPNTwPzRIBU&JMPmn$_Y*yjpZ?N`XkbQKrC?+N5#Y{lVwQQH_cm|M9-oEy3Z-;T@1r-5rp_2rrK4 z4CSePzkdt{ZUc|bYXr?XmSW(DyHrLlT68VCI@x_g(Gv1on>!R|%vJj8gf7bge<>|) z*cyPxC1=eO3eHG;3GkJ=Ru!${!SK<;gS(HPKItFc8$26bvKwvDbzj@i$|TkjO=KR~ zAG-gwa_DOGadqMBddk{R#GMS((d=B|G=Qrmz z_3+ZA{~K2!IvLf?6Z|yS_D3Buckq3}u7m~v1cl0@3vEG1DIj!RpzEWO)NNt`wA6ss zCiRNR=wNgN0+lGOk?ymsTDs39jl-h#w0fIu+#8tPV(DqGcK@g7B3z2 zlrFoJE-0)RXBVJ~4Y{i}alfr#X0^Hk)P@#Ggs81t>RwW@MFiBlm;BVr8|jQh@mHk7 zi)Qfq2j`ZXPt)ny+&)1vahV_CEh$b3z`h1_3e@W8qQdk5YW}N@YMY4T%e;3?7lY-r z7O$TOk$ov4K{jUg2$y@Xk&S#4cMv%P8TGKObF4%&^v_?389p&aL-7uMW={K)NnmB< zf!OTCwqX22f8%=0o*h7L6WPxJl~MDkQgCF75s^;cpL=P`30%p5q0`;w<(NOQ@^d=l z=rp5eC+EM|0oh7Lma@`3JU;nRBYS)vk`CVhw;==`f8;mSZ;&GuclRU=s!M397Jp=> zVjW{v4{EO7s1k!jP(4+6#tg%|0L4NzJ`j_j$dfv&B1`}tYxc0CGUh<_w*C8LSzQXC zsF}qC|F^Gbot&>}uamss)@19(gWYVqh~vF{3&>L?JM5U6+36GJ*=)?Oh)K-o*4@c; z{Naec!&zhEhU?U_!;FJiwjw7a{15Je(t;#JhN16}VDv525mAtk;XRPdS0owM3{ENs zQrj!HwnZARv$xyP>-?>4AFs=|AXuzM(3#TTPkmFc306dOET6<$|6?plXq2_a^Y?nK z@$k`5VJ?fRGn!H_5Lb_#w}N1~B3GyzBzpm!#@dA&LI?NB>)G1*s5nHn~+C5x?>GIL5rd#7YwO z^^?CzAoY-jXHtmV<(U87zI|JWB}!s+UG)R=^T>PCqHn%BVbUeP=`m9FctUH^DcK!6 z-KaC4PJ_=Nn6A;(ChXe#^IXOdqaMhOEn9eoi>f z7NA?I=u*@C72SWlLz%Yka)?_*aluz~ZiFJ-m7S;PH>Jr+X?8;#(u=RvNl& zklTq86GUK(h=r1zWN{jiEPwbEg>8pILY<$2X*RVYs*tJ3xu>E#=La#^koulV9d$Sb zSa(|m9>`8OG=5tWj6T$P9^Dp|E!F0+GFfLGrMT1vsoTI&5(BVIT`W~gO5&E#V47CE zil-M938NKx5FV8K*ad#0X0F5vDQgYG4l`kd?Fz6;O<VhN zekgzb*ad-f<3^Gy+tjMO9~PQFN}+RYomPb?P13G3SjU7~QyGD4H&J6P5*k%2ucLV@ zIV>oas8woydh6Ipdhyyd0tCq_+v!GgwGC5m#3qP-F9=Ogz6fogn$1_t5bJoqIlSMR z@v4%S`aH)JT9y3Pij78<3KwK%kL>%c9j0WQt1_U{7;hmaiwbD3K{R{*i^MQ)x6AYHz6981$_OpbK5iMPbc|0CNW{vRzlUI8%5=4vjh+=JzNs*h2?f|7xb6iHc z#E~Bk4-WcwhX(-Dt`B+s&5LQgIz(xL+SDZ%)9=E)TG^6VZ#%Tch#BoRTHB$uRRT%! z{}w@DO4S9=HaNor%6v03yd)f~`C}LO3pI0_%n%AF%gxN6@;u~@KMHr1n!DbnXIf>t z=D1#GE?H*IS6!NDnM-|lTD2wv)E_*4diai$gK+sr^{)ap6WCtVV#K7{Efw z1-2ixS&;AFeME5*1i*h-zt$f)Y8d{R|H5C;3aJZuItgFU>^$H^Im%H$=!6jB4HX~? zNc{K2iM=#3@)^3SmyI}hhEGdBYE0zSZ6PJZfcp3b0?KvAIm>Lb{`96y~Q zzZ7H;5RoK=i+ z4pdk#uGCB^E-+9F(1YoX@|1IQxyaNO_oO)ZzfzzPTn{R)7g(#alo%Ol1v!)wUBZAP zsfoTV@us{5s1zyQ<2@)`FOr;~6o`!Tg2P%MqQ-DH_r5 zXGOxBnqPwbO|yHFXUtFX>UGPct4xd3YFd+U{QRb`&a6G-#JQrHNr*lm zCbW%&{JBSS5nC<^(6>U0h$uu87+ewY^N;gwO?Nk4jQ}fECr+6Zc!fQ=OR!WDRp4C8 zXXQq#JebN^zQ6c$Hb`>*&Y3sO{!M!nzGa?(m)f)gy;a6 zP-9~3=>TT*2Y86K6`%X`VWs4Zy9O@YO6v=SEhz_sSpK6*=bu} z8ShP<1Lm~(Y5DdP9tWdBC{1Ui>e?@fP_ZOxJbW$=9T^z}8GzWXcHB$#qM#CZ zM;?O%$xgw&?4h3X*MZBE>3{h>UqA8XJGXDWw`*8A0~GRwg(Ww^4yS!fbO1C)ndp<5 z+-Q=W9*mHf$Xi&OgVHAMQEZ@71)>t5181q~X=GMnz=t^3rvK(QIyS<)_2*4p%V_}g zXoC-K)<88xi0cg$Y9R`jl;H+yri&3=1V@ovhSCyRb6rNd_9sU$u_-TW(CQ+bg3g?L zbkrhq*Fd^7MBN2ltPmYwW#=nhyp!+U;ox+PbAsz@a84Kk^$7!o(jqwPv4k9!Wutxm zm#Hu4U4}aXb)9a5(Ju4bi~@ zHJ#_HKMIit-K|V1vLoMiA64a%aY=9p&Y-S+EKWG&A3ay&kQ0SHuYSv0$J4ouW3{&o zC%}=|QFVz|?;D~%LeY67heOZiuS8o`VY|K`#@m~5pi?Z`Nw$j_=#86~Rf98I3#J{M zvpGeun+hy5>~h)%@+M2#Vz6Vp`#-y_nTN!|pg;{5CW%_KMFD7V8ZFvm|2*$zTA6n( zx})k&=y9$D69pj}VJ-W0$dAf7My6+66kLr=H#~$twXz-JB?| z(8sSdo|~Q*c^d_XYs)$)2NL}cLYI4HP}0QH_Z<u-jd z8F9$S)R1k8qNFyWcF*%O4PNA1bzjJL-PEtIp_889RzHz>$&Oj;*AmEVT|;Gh2?D3r zKkab*;_1z8HJ4$S6PURkJMbXg=H;4%ueKJ&s4bp#eZ47!K?Huq8@?Eo9%W%DMpea# zTaFborGB-*W|Vo1wVr5=$ZI#tdvqiR_xacUtFy<7^EE$De}4JbOWF^U=RK4Ld-nY9 zQyRF?7xvIy0Lw3*c**R&ut!jO{jwR*Opihz;eNC#eYHaWth@VkCd41K$@Pu15(MGc zZId7heZOjuH(D#SpWN2Ukc8*BNd~Q$p0jPM^!3{kDYM7}g0sbIE$qw|cJzL9rQggS zt5aIYx0#I*HZIpqw|Y+r`3v1I@ToHi>t5hHH4Kzf}v>v7hnqeGV0=&kaaqa()E6i^7ldR zS{6N^M~8`gEx3?^LND@3M2;S`x*%U<`H*o*a9HhTgX3J`*xHRg6{o&M0-f2|wG1XG zEh}cY&tNyRo|7<}5cH*5P264}IXGmG8~5q0pVz1a`n{QW}uvX;XE zD6ex~JjX=FUiJj7t9W8-FE|IDdjSy+`?+{`xhGgi*D@HOmF+<~WFiXm>5_D&O6M6D z1n0p8^f(fGilsKw|Ni&Cdx zMby<*%Q_1#g6OAj$}#Z#+|d^$HM(m#j8OIr^bflSj^cU6L>@tnm&9{bJjXaKxB#wZ zTMr}{v0v8gQ@WM5mF);e1v9DS4-*+7@|TBr+VhGe4N-`Iex;T7PKeSK@5F_7dM~&R96IZaQKb>oq|aQ7sXyf5-SM%%y9OU^U4qhe zXUI}G6ruz=T@o&E0-td~a2@zr%DDF73-7E`(!Bnk?==0Ejt~EoU-X6Y)eWa)Ay}MB z2wC*JeB2WCP(s0Tfo`sgL|SJrcc(g5Lr2CX!8s@^WIP{0jbW(^UHPB8fgkB)=gV^5 zeb=%WfcoI#F@r3|vwSF_cEBrR{Z!>MjMIV(;HG&$({9B2xO7zY%YSwaxK|JqfzP-o z8X>Zv!=^g`%6B`^7FTJy>E%OdXRJ1@+k}dW6{t_*zFsl z0U_8@Jr;ed$>te9KF*9kX_;!{Yt8uaac2CT4kAX}Y=PIB@rOs5@uxnqykYZ@}2TloM30DeJDG45PfDa#gvjD9b1mRLD+`*HDg8 zK~TA}&|gD&Mnyp#$k(r-kWoocxw_(26njQef||19UbTE=6uU-JxxNlpt&tdI1ZA_o zUn|QfMr~d`+4R1b?KT#|ZRvt2*OLcN^#bAbyWx(9ds4X?PFmXf`&(QdZj-a^qqZ#Q z&BdJeS8HN+PA|ly-$l&0+3-m!c71~ItQ+r2CorEPB&7t2;2rN`8|uE*q!FrzPr-1KnWjy!1gG%S1FEA1|w8cvi_sCrE#q);_mEoF4?bYvCjC zhG~njHMVCW%6v?hrL#OEVDCExx3fQwZe*lUs@xn208q`m%UD zC1+q1paY}UqPu<;IwO)GJQ#Pms5-;8>~>lS62YJN$|8p*-p2PA^5@>sJ}!DKhCj=c zyJb3oQPsGV_~o==Lxd4zN2wgOI3)@iLa4D2Or5%;2PSHadr5nI_jEU5(nd<@Kp!qM z;MsFvq!r}h)y*fi+cmtRJ7=|)h|_3nuWB4N$fje$D+>7y(9If2m?Q+n0jHo%ozs(P_bpKZ-neIpu(ZIoB{~=gr$%O?C`1aQ|01HW z3Mx&LChd*V(}H-!vv?sQf`TVJApU!2+IPC$?3Z;uT+ka4=SkCKl1(O)bP~>+L*ANC z*H(hxB zMR2unY(5Ep=W1|`a8!StqFm6Y`9e50qA1G6767eLUMJqK8nxzd=KD|YL0KP9r~X{I ze0`<7S8v|5=3o-qc&BYF-pd;|*+szH_n+O}KE2;R!7?DoO33zb;2h5C|K)h*&3*!H z;mouK;`Ww|AQVKX%}zVE^!b|YgQv3n-h+%ncI*ASa9>IH@2-}s6Wn@}ELE>^SBp@S zpA?;)yGF=%9@Y3zpPf7YD$8N+1TS4acU2)m>`j&3WJcZY%LiM`q(NFC8|_S*Vv_qj z-xhq6q~S^)MHRdTu-h(oJr(NmGilus$!Qy?oPv^#L4+3x?$!A1QR)_`df=RHECL^- zPciltBOdO>>GQJt}ZsUt%AEX_>#ov~gc(G`yZI zTcx67AQcLcb@j}BQB5dBh+f>~s^#(1?Ur62%?YFxvOmv~8a8SsX~b%`oVFC=^;Bpy zvB@;2P>Rsj*gmUX^b+0O7E>{h4rE;@eU#S0(8!VRn>4Y;taSmkmk2fGRD07b*9Sju zOFs}g(uo8wLj952dp3tVykC2jkcW-RpXHXhzU9~^Nuv#BN}-vQb)0H&yq*ee^Ha(Y zAk-DdItRLA%DwgpItP$ZNUQt7#x#19;;q?Do73FYB1F2?=5u$S#xSzA6=ValFU~of zSj~LXq?%-4G0jX9p`pxAk7FT1tttBa=xAUQIM(+;S|K~Fy9ycGHwip?&RZJx5rj$+ zipF-?ybX_@J$~53umjQwS?ltK6D@Ga_FK%`_tV;1vpao+m-1mN*%#uC)9Ckh4nhz@ z1MLcDa+7Y_U)Dc;G~Axg*m4!fN=R=!B|Ceq#3K51Q+)e_+*ZEw*@*~HQLdtmaH_bw zP177m+u72HK5BZu>xqyJCb(F^L` zjZ&MG<<45Nm1eDkP-U}iv~TY}xpzl&x{M&5km+7n?DS9f!g5?+J1sV()1=F3TAc~q z^oo9`iPsaM;Entg&$>J*DulcU4f)wvdzR z**uvFZ71_&qB#(f_STfyHyNHjy!&We^u~g0gmlLHSjA%M+1=qWG{euYAE!93)~~Wj zQ|S%*zO}|ALTzQxlOMiGQ;1M~%)aojef;=2W>Ep86|zy=m%o3<%G_Q8-Si9ZqT5@W zgHS0#jj{H~FZ?oKu@R&bvOTwjK1rc>`5{Q-MW{12yN&n>4M4W-Q@B8atc2{1A30&X zf0zEu-+%Xm?@o@Z__4qCCP`wbFc8@}dPgrg3?ej=8fHy2kDorIeBzt{kWt93@gW_m z?R5$m>#epgA_V5obKW;eieqhdhX-&oh`bLV5t_y!%L#=$lOE(%BW*BpI6SXaQ+!cqNo#W4=n3~-Hb zBXLLb2|L5gl?6D@_17NbFrf!$h5Oqcd&rj}&ztGvvFBiN4$cV|s2#YX%W=yj7@QZb zCVh^1Zka!VtAwL^b4NK$?7#)#dU$LfbG$47MS(_*n>L^tP*rH$v;j2&m0CA#N2M*0 z*SKi|vH}H-n>L_QpjzXm4af=9YTUE|d4YP3n>L_Ipi$$d4JZH#h00AER1~UIxoLx{ zh4LylZBUI+LFuN=lrMy;Rc_j#tWd4WO&e4xRIhT=2IYhrRc_j#Jg8Wx+_XVeLX|2v zZBRiduX57{6@_A4qOQW1#)ZPCf~b}VM;KpqftbCJj%Z8I^o#&RR zJh)0YPdd{a<1obr7laF>HC>)tX1?H}aMWUlG0!dYQE;_zRDb+;j$0;k;2PDpWKQ^J zes0jk!)>GZn*g&$5tPyoMDPGcF@u7nJD(2>D6jH?p*h6b1&02a^MFCJl{(wuKhSq>TKS%a#ZrWt^AwUgYBuCN{>(GVmimMXt0^|ei{!^yCx>$8)V=GM>ltS$vaY?-9VEk$A23S;QtNu>~ z*XX`!d4WHEfs-}a6H;y*>Z~fyPQ0rW}p3`N^3vANce7yqApXW_p2JrhoH|FF?Y_q6{xC;yIP77QTEY zU)%5NGWkve$y-PxXwtxk8K@TLOB5o+1_^ZT8m-ICaW?Z;@g?P`NtwgzLC`@o4Vwa5 zle+jn4asW1&FZWzj4t58k-~2VVvQ<7AxNuwa0;yA-Fy+~@6>$0PNB6VcVOW_TlnHf zyD~P9zsSL}tauZThicjYt0=i0aL6F<7SO8;t~yTxA!RkcIGBt1nw!&VFz?Y{E1L}} zW#g;flD3)obG%=cG&w}4OW&{Ymt&xPHmYBy);xN?ah+TliX$a)RDj0MkN?3Ly1{1+ zn@jV5f1bV{ESYIkkNCW3** zF5R!dm{&jGl$W_dk{XTU&lF^D48m8_;tQj)5^m7LZqP%MK2G%}`Hy;2M?T}`3jGdd zhV)nQASkoy#?r_$Ju{69kUqt8|IH^PDHBgyn67=*Rfo&SxYXQ|;taY%KxbTk)(`;q zh>CFPvhNM7vHUHi169 zT~%x%^B)~rQwH3MqB_7${Z<5gKWrgW_XezOkBFyY-%SA&=UbD4Syz}1S*B4dnci*Oeg=j~3o*Huo^6YX8X3%lVJbb$ zSxntzznH)ebfU0<&te)J788+9-G04|I5-p^+&gBGC(J^|m^Esxdd1)Fd@$JgErjGw zWo!$H?!X!qOE3(ie=!Sb;pq!lWN1T`*Z?98X8n2g z)C^$g3_H2t(t{@&-)d=4siO=d)Jrx}B@`x|(WH}4I+Ka{PG)|M8wH%=FQa~4^#sxE zMM|{X14-H@c<*M)@(W$nBCcH8Wuwx->nHs1cwN_IMX)O#id(k2g2s{|uW_khu2I!f zO*tFD%H!}znB(gwd^|Y=7hfyIB=}E}TcR?_KpW!Lt(D7P)uu3sTDELXHCr&+io6SX9sV~yX81Kq%Pg(G;jP60C(mzoB)<6G+UjNN* zD9t?L0hhyu+;+N4 zE@;GP1iIZf0*6Clw%6gln9)YY8xnZA>cCprajj`xtPm&gje^BD)m$W{+k1o4KNoBt z9q@MP@?uu8s2J)hHT1->0lDvVwa?JT|2?J$Hc6Y^7IH(;Uppb{J!1N$`~BzD?c<_A z7r)RZU7+5i3w*DIMGjQ^bHBhVx6TtI7ej%tf|-piHc73v)T?E+62BghJ83?mLCuW2 zrp+K`P!{fCqqex*XO4{f6Wl_zy;40Tbx2(w9yO}`sQZz&bfaEw|3usSKY?aXPJyg(l*AhWM;IgE2sC?j_WJbj zeP0&x@Gw+rV5Jrn1qYS&f5!2&L9BadsO!?)ZPGK9=j`3Vd)>g_GF%vB!ln< z6UFR+?0TSx+bn~+B6lw!&s)3wKd(wz0a4^FcqQsJDNMDKK2%lNDA3?9KfH&nanw<* zgxy1m1AGz0tlKq4BkUMUiO?W8mnH?}n)Z$e| zhjgHjd+v%HA#}^yE``9)iKRx8oudEBdKP!T{jm8cI}#LLN^dznMuRpu5Ew7Wqjy# zv33IyB;z!neHK2U@EMwMwx>^Jb%Sq5>aoV{mKSkl*DqJZt%27nG%~}!w=-*WL>K4o zC}LSwAk9c6nIVR{QJHh3AZ#oomxs z7Jo5Xd^8iOVy)$qB(WO?T&lGHxZ?E!yUjQ;%4tNjpvq7M5h;}Uk%Bt9B(A?UkA6oD zP)ZC;=^zqN&CFfm4^5~7{K@Q3uDu`lO;`(NOK}D4&+L%dc9qDL31MmUz3WE0nx<)0BS;(2)E!eori~rkFITGFOaJl^d|& z@M@RElWhfyw4ou-m-Z*{S4|c{Hn@7MDCx(l)JSpRMQIj%c;{d z(1rTzk?M{l@bL#jSd&RCl#jD-W+kMFbt)Hm*v~HM%he{kLbT9^YNpU3Jmhani`$Mj z?q|!&9eu9r+nQJ0F8`5__jb71C0bEU7UIv|pH1-5RHvT1jWKwCwz6aB86}q7t-&Hz z^@5O!kCAwcXDHtpDXi9-I3ZPK4v3c`N|1SSW8rc@Y?&v0jm>zlcZr|l+iFKuwNvMC z>E5{XL9sATk2jxIZ}5igrlG$r-@E}|m2x+O%Pdm&Ic}GrlOzSGyXtllk$Lwpd|X!( z3572%3Er&o9^6uOyP33`n7)76k9Tcc0~-6~gzVCype@NOOB{N&qV$cIZDVYOQZw!B zZ;<#xGBioN@9gRFIrO|J$jE~>5Ze48tYJ`uLNPXjeR)5D=6XK)VM>=T=VYQcx(5e| z@KaxRFk#L8wbsyvtCT=;hlx=_How3EoMYh}9=hTn&?*32K%>7?sM&skWP6}UwY-&p z5}oz`=!zeh|3fy00R@wbz)Jxg-0qm4&wtLXai!wuhVR(SyK>E4Grp%X-Lu6fz$vWe zytR5$u}`&_mu_+88p~YG+PLxR%)Fzk&_Nr%a(Un?v6&aJ$=F%It676DI0jlV`l6X> zWcalumr+JDZ%qHZh=!56A8>0|ol`#P?f`UyPpzMPmOBm(1jw8;<;w6tT&v(vJAeJI zkmNLfqkPZ&-PfR4xy&yR?d7gbif3V{O(@2;OO&q>vps)W1 zMXVmK22dJH+77Y@qFUcZCe3A*Z4wCxWK1y(adUcun;1zA0Q|rcNy`e`_f0wo^MF2Y zQGw{v+Cn@Z;EX!NPlUfRu17Vx8T3u6t%K%-Ud!FluNviwAJa}~d;&&oZg?rm9(QxK zW`ukY9r+_{;x~mC1|o)-OVu9uxwi#q^$1Kand_z`&;-kZ{~BL`YuIAY;aO;oFKMLF zl?*k~kZXHIe9dbTQ04dW-EPYqE65TJ8GyjsQkd94&1_%iO9wKELR2tIRXO6KcGadN zkm-2k0KuD6GIxBhqf;rzKA(@k~-clO)8VuSXf@-zFpiQbu z^z{(B(rl>mb3v5|ReS*G^yYSOwc2H0BefH%*yd>{0TzQ;WgxNU@pSgDKtgkTi)NTcaIx``ENkE63Vf zJo_g3z^Wh!4E<_;XNsvlf3iArEF9U&hFsW4ZX{awdMDyypFi|OTM z==eP0JxGGs5$}D-6`y|`KOen(3A#0ZkCMEhqk+BE6xx{6aNH7A{^KgtAVZ&x_zQs+V*uNE6^+#mZh5cbZ1mS z0qOId{y-|#sO{yRa=f`-c9lukU}G7{Id#Sqg0^0TOEVNwU8BUBmUaIZS@?4^G)`9L zK|F$xaNsB<89UgN6>#7+5dy}mi&kmRY--m{v4=&i5mDErT%+1&3zCiV__i`Rxv{#F zp~g-YqzDdAxp_fIJ4X((SM9`D!;*RrMN9Z0Xvo9FOgQKn zlFN2XPR!Ew`Os~7;KnJfCt;O4(X7iKHsVD%2c-yJo=!tR)i`Rs+oLO|uH9Vts!V*E zK@o8E@NADN@6P$&f0`$9>9~IZdWFy%B-Rt3R#i(UB7^DJgD!ythmS&FX{o(u_Bfmm zd+(SjrJ3n05QMxC%92s#%6qKT3{VOt4rxXPc4;c94#S{NP-gmOS)3wGGAhF`*HB`lb-+LA z7mRgHyLM2{)wNVeqZG*iJiJk5Dz?f?N_bi)yOLz7PSPh@+ZfuzzXqt%lJ8`aI#UY5D<-GFsJ1G`@Y2K^j06-ytG8x!*Idp~3)zU^4HV7=l_{?wtm|EUgjlB8Q zL;erxY9yD~#bwWW$A8>ko&xPBrm74GW&fuFsIT{^!cNGl-JpGzf{atQRIaiZnB87Z z_oUt^(dKIi!=TNuQ$P2?Bl_cm1J({8rHDbYOtp>yC)UQ{Es-P1&>$L8&ZdT z2C|uo?9cJFdc;*dM-iW@`09Ew{ztOP)8et@VdbUl+J@1!-xRm1dzgu_5bFAihS8!DvN) zo0#l^r&>WbG`wI)j00Vs>Jq@q7+KCVsq>uvYQm~s;TefjcJxdO`)43-bi{em817bI z$SV68{TD0ir85;2VYUGEOh-M|CoM$cl6P_&Xiz(_7j}@c>ekQIqBYO;qpTb`k#YY! zx-dNWXayu2uTxK3L_>=?L)RmahfdIJ z!QMQQiTH5eN*mo<^@*?-?bX+Eq`Zs&og$vNH)EH}VLIT0hI%VV>Z^&h9zOd~BW5VUhm{U39 z+;n)r9()60HP0kLEmyaME?DwxhpTd&#%4)#Q_jfsn_d$Px!Zk$6ui2eD$VuH-VU6? z?1^oDD5w|q{SQpN%<{q2?r4jHS3EYL)fK5z92S9#k-Ey|Ub9^R({N#}Cl5@n!9WKd z5Dn9u2*&?0xL%P8bz+9cNLaXcwPf@JZI$;M*sJ`ORccoh@H(fZMC+$@D7S$=Wd4?xAM3sy;sjuM|*QraN4!HIcuTU}1fsX$?K z9jnSJ1w42bH|aLV*%;ACP6MmnqpmW&)bT1 zAnQ#Pg#Sm@_P?cx3m5w|iwq00rMh&g3F6`1w)?KZ>~yCtnElJylq#QJYa#Wl-HOWV z6PD=YeC)T3fq0%q>lm1)D&61}sSjY*QI_ukXTMpPgOHPI7_%es>ONsE>F3>KG*Crn z84aLpe%tJR)4N=AXmZSfTO8o~N~qgp)E|$wyFri8s6cfySzI)2qWP_)aDbefRLhE* za~0`|2Y_Uf<(#?KjMK7}d+|t+cJ4KH$7V5ZH|{mLNB`rU>$ z2-DBgp!x{a#B&j@`=IVY-SMfixlf)RO<8a*rRh77rJ$x3URm13k)ljTK65FkM32sc zgr-X|31Drf4rakboTzI^Z^o4+JS}P_G*6hv>tM0auZj#7qnNysZ9BDy&oix ze@{iH6s0JtVV%_!!nOdppE}2yGEjf^1Z1qb?wqt)#-^Qiw9T~haKZ*XZ-LC!K9o&y z!P+~(6_R3}^sFg1Dh&nL;jsUVE@CGo70o}{k(}cb%VHu zQPtO*=eCeabFAq;*sAG1xS%|8c7ZJgTO_@--2-?yKo%$939w$Ul}@=mSDfKM2xE9~ zN(BgfZMtmsO|R-5z7@TMc-cqzfL+{UV{W!!_r+(By{Z!ze5#gwuG0<*FkN;~0O`7e zLWdL|cn5{8=C0;pYQMjz{|KUGk|>xOAN!r$hXSk~g>{xQhkrVLPB)bRVpNdVhkHXo zWa{i#=`Q_-5-0z%U5Rr|@xA^XR2`@mCfbVTK6P!jqO=!wdU8F1kX9SJz(i(cst6K= zq@LevWCL><080UuD#ImP#5RpRkdwCE^3@9&`!`5?_Xrw=G(ZVjnf7=7jR##-Vg211=e6RYsB}Y}__=4V5uf-zpQTj^ zj*z1A-VHg8n1ALwtoFs-O4RzefEh$yrrOggIZxpeq!)DBO&o{A$Y8p4cli7SZRcF& zjg9S3;u>dq!9*#aaodi{!FLYN794~&CyxEW`S(IzEqyzmY5*o2?K85M%SfVlbf(q4 z2ljf-3er4x;fsCV60IMypVuFPPOi>qk!bIu;KcTmxYvoDIC*Q}4TzQMWEG4WQ#=5m z%c+>kQG4z?&GuBj%dp@4VUF%W)imYZ0-UPKwOLT8M>kpZ%HQx%l&c(>!O?$Hm6^CZ zPBdv~=bm{uqu+urjoAX4B`c2lk(zqy=(RgNsz(%qre=DeI)m+(D`&7}dGQ2E6zT$s zT=qq0pY@>NyYcHPxRT^cl@4fLsdj*V5p#SH{n~TBc~Y`;1xidoB>_dFt*c74X)XTs z!jZJ9C600a?1J2>MOA%J$fZ4e;>T&RQ7kWWcei+j z;0M6>RCq2LD3t2uPHmD>rO}6N*6zbL14O&X!Df|q(FlxDFB+!;$tvBi%iaxgUR|>y zgoyY0V~>U7W|ur3D~rOU0_r9G%C&>ezU&tc7}F{0g3EKjGD&KfjBPJ((R;t<^I$br~s>>#*wj-Q87JO-H0iOgC9rS1qC`q$I%zCQj)jf8T@zGt0+5r zz>w7{JA44#>#q#lh_57huU_yL*~2V&3(esLzRXm@3afe%ahcUkCGoY>d_7&;CxnUI zQhkdi-`C`GcM+y_pq#7Axf>H@H52vjb^QZ`7exQQsT2U;p#N6bR9gYoNWN%H9<+E^ zLNlK)M*{Z$og5w?vT-a3spdax3}dZ2pHA{Q+Ig?$;}o>iTX6L>tFbTWMUdG-OQtrh zTJBu@Vny9`wt(|b-pn`$`En=Lw8Cipw6WpoP0NPo#)4HsqUg3AqbQYAbEY$0go)~G zAnMB`Q{KRm>y^)E@Yp?h&%aLUHT{CU!!X;_-lN02Wj{}mphnhlYVT=3g>B$Jg~e}l z8BVG@QNay)kxZriJRPf^WTB_w+0F3?ZIUR-ebu&DHXLf_uyvMHxquxyIBq zXpPZH_hqm(CIgK*75n?Z1JRD2Wg%TU`SIgdT#*;U9zhy~nkRPa6Rz$P{d;D|5OHg3 zK~Sl?#Xv=6t+My;E{_YvVF~#3Ac0kT!=D7MwE-z3xf^y~tAj%J4I@r&CHawRxy2Bt zUag1417#cQTktl>RyN zJb5ZMC}Ns&4%$j>=wc;Yv7$(&N{Vg%Adn+)X392}PHZee$Os{yj4BL1Tl_%)m349= z2`nd{OY(c5q!G@){p|t1cG_N;9&9RXE`{wU{XYD|v`nF*J7(Yt!HxJB&u`Tr@T&)b zpip*L7l_+DCIz^N#bK(LQ~iQ>Es5i@pV9vXV!e}565~z*Jq6cADb{C=yQ@zh-%W2= z!kXeK_mU8fFg+3b`XWSDKf4ijE>p=U2X>M6+8qo9k2n9C0%io3vrI~}v_&ROzOV~k zfHDF3#8w+E$src_Knxfw7!Gka?YHzBxgm?zEw8`lYWQ`+I*Xy`?`SugD&uKzIt2qW z5O*DHS$=;2P%b$dPzSWtxa}Il8W}HayIr+y12OgZT$ajX6tokUcY52foLlgZv#SOt zfUs9*LBWJb9d+f?ohB9DXkfLr51Id~zY2V44Ua#0d5)`?jjt_f-5j~0iXC{ZL zS?@3VZdj0YSwoE)v_+bZvZUV<}#>UwF1JKI?Gn-qSOpv0J+X%Rvfed&m~Qj`Wqt(LGS}v zN8_zwUNj^raahUib_K!)gvVLZv(Suc32y>Lfk(edBl`W@>xr0ogRGV< z%hXB+@+8aCbi8rczY4>CI_8)GfpdbRK2A8ZWx8M(7QD1_giPU3c^=*V7LGzg;U6bA zUqLq)y3BwkyO#mEQudbY_nF2)(z=KDF6y-)TWBjp8S2}L`88jMSC@l#L0|=qg@(MT z3JG|1R;olF>`#;3BiwWyssXE6a>yELE$VtmbS*_p2gl6ThURxk3sVpj?%FwClTWv7 zM*d~?@zX~+g#|q;^ej&=+oR?>U+P;en5l#eo{1W(|2H7&glL|WMVrU_chglC12)&T zoid0wGGvJ3OX2>&8U3_ii}$EP_zaXvb(&sERwh|nbx|NnsIF%9^Tt*)Z4j)4V3l|? z?r}G7tABKIZUJaO{`yy;DNyZMDzt`4Y1@{|lX|^Mb$%?pS927Db~*q;A4|)ou9MlF zx=vQJ);Q^zHffGT*HTn)7V1QbSacZ)U!ENHc>J8?+8~FP9@7 z*pkOMbZ#vFVuYudSrA7F?Ob2=L>@YdATOjva0_t*;@rc`z_!V?xXcA6>(V?ljiN;s zpL_ysCBEPL;oz82{zs6W3Wt(%)S*)8B( z_=z`b7*f=5{+$FK&z=Puko&Vm90+b$VqVq#KK|?0PMOu446~EGyy7`v}o%mg<4PNEbKs6b(sncaEa_ylm(6H zFUXhDfvSW^Wqp17qh)Um)}}-*`QITpket2mvPyyx63quF@njG z@t~zCM47cLGx^$b?1jZvrz24eorbXoa0M?*%^d*ZB*mO>r5UxAiRAzCJGBT3x%Ro7A>0I#pvQZT)Q_O;sFzetu8(sx;%QaP0*(bs8}mp&E5 zK%*GR2qTE0_C7?Oq^@ob`ap3d?93VMgQ`pd|lk9^bdd+K&en$WxzM6t(KZIFnnp$t7AT1U0)klnK~ic zWzPew#f%EUEM8nG3+qi+bu}LYtY#dR6jMuv@>+YJ>Ka_7XpE_Zmpzyur z(3Taxfyo6kVuPKu71L~_qJtn<)PexuQmtFT3We+O4Igt$f|6HJ0-@ZFE`Y0cnHGDK zc1f-v-#@KU+=HOe5EOd0yl9P@zB#`IZ5cK5H0clCWTP~{yTJ_7%{nz!+a-)s_HWpF z0hO!i7dwqM0Be{GpZac|{eV*O(5guET3a7atF|~d66Nd8L>7MEPJZTM%&bMGLe7QbTm2p^XTZs_^+q0U!8tOkK-S) zp6rN)QST+k;U|&NG;A=v%_LvNy{bIPQvZ|^OJZUP-%wVW`l>=Jc;V09guhoQ$eL zH6FDrqHDL1TrZ*(M%(f;giI*mYe$zI45=bwYX4+iRPVs=(yHB9|LJZO;7Q8zRMcJ zYffS0$}y=dAWL=SctuIrb9Y;W?jTdMSI+$;zvm9i{`|wI#c7@0JQZ}wPFKrz<~+Oj z{&bBOb0c7mr^J-{TFTWis^fe0h^skUsO#VWm|V&+h^m0jZ?pG%IiJu_%-6eNK*e2! za+4v5iv041YBuxjHOustHKX7kmJ@WGA-VUGkfVf(@qO|IsA@MkQlz`d5k7!f6QqTD zWm#koE=LO6Nsbh5Cpl8&yULNGP*+a*@Rjp0qN(0<_oYTOae%9*p>IZbnF_q(0BG_~ zvZ*uz4nc6_`kF60$|l98d!uLv06EDXtMuf<_OgA)3JlB4<-k>jy^@>l2LvK1fK{_p zS?KsAZ_Ne3*HmHnVeDnLCkfj)i*~{*0=lTm!ObqDA1@9{&ar1 z|LEtBfGiY978c=8k-PtNJUV{aJAMudrP>|O872I8N!Y7lZ}^FSvA}0iU=;(`bB6|n zIs+=FT~gEoVAMmWW~U!r5&-)@*~Q%hbtm%6Hm6$Y_Ni9W?BaHg=@tm)9d=4*>pP`v zgZAgi%>uLv6)li*xxL5o%&Tl;x;>1^>#Svv$J`9tjnaf*wM+OsRho9mM@~YsZL$D* zMmWRsBM;n0ZC{X+W&<+Qv%vZ6t|20Cy$xun1vM4_3o*|D^0qMn2)d3;0GNugk&U!x zQ+v_c(4biC*3f0AjHEuhxTmGPv^3d^kKc@K)qmS|*#CUg8xF_{4#-N7qu_SB_2_T9 zJm!u_lLFaOs9{vPLx);{#ua6|B-jJVPWnl?wOjhFkW_K1P%QHMdZ2MqM>gqKZ}N@0 z{2+%ONN3By=7KGftQwm(U311RX22AJ@j49vY(}v*|Lp4heC1I$AXy5@UhqM^H9|Y6 z*#qeX$wA4d+4egi`ec^*htrp%SK%56+yX)8D;fSiIS;C~e3c`s+y=C#*1e!C!~s)EI9Tba>~a#g2Ca>OjM33Uhvyz zplj9TR>(^(^1;e11Xy9iei|Jo`{5SH$;`xypa(-gCFi^q9j-wNzk^_*&UUG7uA}M4 zsOI@Jp=>l`y_0`oBZE6_=+!wilnk_v-gNEHW-V2q{vApAf=K~L?(ul z$AsR`zD&Lg&T_HIf?wzK&S!U4d;!=u<*ARU#=qbJv~ptzkA$+a5U+mkj@9ep%DuerLsKVZlu zDic)28sPao8@y!pdNlojvMSCrz;*`!)GXUiyd9;fY4;Ri0LcY1O2%c2DjcZ<69fPS zzoHb9E1AR(Q$>tn4DbRl3P1S_s05HHoY+*FD@*XD(M|%P?*mw-9*lIcb&Xf&l}K#A z8DLH0*&(3p)TLAiD=FXsAiE86Wz7n9$N6Ph^M>1DekuM#>rj0_RK1AvsU%AOOwj%@=(VEfHUpMM7{2%4Gi+te){|OSEnaD_L0F) z5}vb9xepKCnzCEE+xRBI1(LDq(#T*F0%;re+qD&=CmFa&gqK%VRRbLvfjEw~K1Y<- zvI%%bdps}Zr|g41Eb<3TZBB8s@QajI^(jHQ=;EBm_=~qvv{JIN4l-k`Cg4sRR?AtyZ?{OX8TA4P0a5$w!X0 zEVi#pHQW67(tML1LUTV71T_co+nz88G71hA^-ofN2dImew!zES$0IJ>60Q-0vZfG~ zU+DOPLZMW_z~{P6`t?$J?H%8o*~|#6`-u_5Oe#D%U`3@-tH?%Tr=e1SHCm+%e6L;` zazEztT;QzaF@~$y+LKqiF%zgm_FQR4<5c=w<^Z3Ia2wmi*;d9m+uJB14Tuy%#3j~` z^LBx8v476|2UsbvLMJoA!wjDD`rsE3SgW$bc&+R()dS0pEPW8!k(nK2N0xn)?8xjc zvI7kO60Vc*$nsr;M^@}4JhE~p;gNY^PS3(4>mod|s+;hzsa|+gEIclNGm^)C;(azU zl}dR0%rJ>se5^L5#^+SCD;@x5B`afI_Sn?5ySH+2YW)4|8j@s@Wczj>6_0&#!^3gE zO2^x-a-s)rl7qnp*X5EdJvAH@B#K%G*ed;7U{}7|m6Ohuxyv!-T zoX@YNmdXbfJJvsl*s;|PV#lT5BzBzXE_Pt01Oiznq2p|~3k2SM`B@mLiKQjSHD~6D zPs_2{U`e#MLSUuat&qxvRCx2wc9$?qHhT5t7I+2o;me&SYHqiQn%ixnmZwr1yta1Z zF0xkRpQu@X=!trR0DNyHizEF!iT%?;5P?d~L1ZbEjon5nmz2@HI?Dj&+V;+iZf^2` z>hvbA1r>BE@#UVIa~?b0Gu5r2HI!zq*6;l&dWH9IkW zk?HbMi|*FE7*o}Gv07d!oXWv$YO;fPGKxkY(1FyilOe@*#m;9Rg%?XtX&paX(1rDQ z>Kal|>E~V(;{7c8ZFmNtE_?&I{Ri%>ao-Z$i-1zuW3S}xOgzIER z_n0tB3bQY#q*o<@fwLk}h^hxPjnMRbR$BJU_OsHoU#8^+a9s{dV@}waCywOKY&68!f&}VAy&9RUN+}qI-u@^dI(Zr+&(WEhj|H5IZ&C2 zdd7paRnK_6aZ?m{5`JvFmxQ*8XHsTGe^_nLgQStWvJ=Om3pD#us5TJuQdGr_4D@-W z6-PepX7mq~(V&+3@tHb5RzX>9=>(ciMN=X0iTyw_R~JZo>ApNs=IQDk0dVK~Xc0G@ ze$E>(KVjCz*#`eiXYoi(!*lr5>-B`-{RzNIoko?a)q#)%a7Ld*rq(3>S6w=z za(|Ra1dXeK?|p{>d&Y&s`<%IqT#fP23uzct8q4GK7&mtEcqP3g_`QX_%AJ3EhNQFt zQ1$$Oh>8Os+)n;sHiydqlDRs&UC;ahD>X38G@JJz0q)iLt7PCTw=1_{5qS+y;LG4J zA{~AzUn?FEV?fwnEcSyyi z>`|@1Ed&B=;S7)ODX8ukO|YdUfZ!IsmIABYvld7o4%FP`FnB zHN?p*u2yOtD$p`QtCwU2-yKr4xN)SxNTx$7$>9w4Q z0l9iEM(ps5Xa^55*_??Qmv+h4*esW!84>P$gtR!BjLXd#lVboMTYXdPS#A2v=#WqXbdiV!6 z7i?cKc?70|r_^K_I1<2R*O_GkV9jj9hnQLZD!UZ$3LH-3Hl+B-<|)-Ww;PSNiTf%Agvk!y_hlGAub3;Rv>8?xAErf2R@q1e5%K=`h{Y%^X-6k3fEfksZq^jH`k4MQZ&~L!V6k}qD&$$O1Lu#RS$Bhe^dD!p2TKZ6 z_i%^-RL|k6qC;PD2LP37^1h2=Oi*`uRL5yIfk8X}`Wy1mD`)r7+wO0Wf>vN=X)0}i z0Ex5l)+kax-S%nsgGJze+I-v+vL#nxoyAK6e}hCs!g|Z%ptoHd@aDnI;&jOL>W6cE zTJRnW$Ynx~Lnky_Lnk!V1wgjr1adeU_x|*f{(JP|&!e!7%AT+}A8;fPOAP8xUE%qI z?b(80@r`@7AX7fvo-HV99dP3FN?Mhz42OA|D)wwMlWO;D@qNvTy(D$cv|X9YgZ&SC zKitqZY%fk`sqyS>aW*BeFzWpiSNOec;K0E{Rk!yw_5g6oN+Y! z*8xynEgk{us22!SDK#|?@hN9prjCbyI_c9r2PDI(p73;5Rt^mBt(@LMzee}^_!jqh zXpZAg?-o+qRoAf&z)XZ`m9hJ`tlGo_$VD?*E*rcMkdA=#P0%z#Gv_&`RSc4h%Jg%B zI~BsUEOhLyRpBJto*UV?EkQ_=uKgbmPq-3(c!(QrzfyFJUw;Tvxsc*%f*mSrK*5{% zvh1cJ1eBWP^lY3}yG?B}n|3k!L~f4%)IUBsJUMy`8m2=ZdP6+Q&yhbRMM1%9Sq@W) z#f)u69{ug=~NxO+Jq=L->q+DkdmYoz&Pe z*L6b=Fcs%4{e86L)@9n7aasoecT!58;`PF0FMb)WDUR>In|!7Ln1*4{cj}xd_~%Y0 z4uCCotL;+6;V3B2rh_fYvjftd1UI1nuqQE~(QYvJV zY$mz6e*+l^_2eygT^5FcacAc-#`~E>@QUl$t6Ay?-`!JWAD;gluF0br$6 zk5}wS~pP0{pc==%FGsE5m{ZL;-Z7aHn8i{yySt~W`gJa5c zr^8WzjRK5MYvD6UT)xd>?0WC+RcU;(2|8+CE1je`Kt@MLua8boUcWx2Uhvmbu7^{yTNaM;Mo95v7)HbG=L<{u z2XrRr0XKQI?F}WbUbE)WAM1pzK>60Pyt?OfCsaS8RN(u#qu1RD%o{;cJs0!&P9ucM zfMI=z(4A0h8Y8^_hB3mc_jNUA31Ha+AcScKnZoJi-n!=w5b3_}0O^fjxMxH+qd!Ek-Xu}8 z=ipwk4n!u15r^!QZV%Z>t|&49cU4OR%;`Pk-xp5W)5I)G-zAEM>c7NacXR7R5dWKR zA$kj-lkTLGY2zY8=sZFnCX-@_!6YFLJYe|n?B4xWw&O@%nE(thd3pNnwY`4Z$}#K7 zZ;SE=6pMX&7a~npyYo<2$Vo>B%TwR8g8^3c%1TuYyL(vP$Usce=n{m}xdibFw^N8; zz>UcZ3O?5pA<)&S;gc^S5hIDHocv`(CJ3wcivY+x*~igrfUP9UC%F7m`*^crRO1B2 zk`wu~Q|reRpk9&_kLuxsxM2k@CB;eWz|dm%ivGvck|`bRCA@x0$QabSNqkHV>KfjZ zsW2!K!F+g-j5qxw@V9Wd*tQ52UOhlY0kMaOjbh(aBvZeXdZh z!JH99*>er%GC|UUsP0%sE$3^?D4hdK-5ZGsow3~AN4Q@56JL(Ai}h^;h`7DB4zB34 zhncv1b7Kx7eOVGP-zV*nEq81cTqUhqvzf7xuZr)wwhFwITH7h)wY58U3Yx2n@TmBB z#o2OoVN%m+A`V|?@^zL>OkK74&dH@PfaC(PtN=S}J4)dB@%(pS6ikON-2<9|21(`f zIFod@cu`8h;ZOC%`6+2yYEi~R4~~yH(nC@!M+@qxrVoU?5E`-TFGQ#$LR+i@`?RF( zjrH%)y8oD-GJi*P%GZ&gR0$>4^UIVf9VN11N0b&TN~QW0-4g&9ZIhNd-Jb(|E$n6T zWZ1UGU0j_nALDx~-_s9foOOBjDC_9b38qMVKFQMbUd$O|q<#v4RIFpqx9ixWq5x8= zYsl+{QyYVU&vL*j$RJnk%&J|$zVQUpwSwRt06oyoY zRe8ZIVGcG1RY1+C(^brFNOAx~uBL4tdc3fy+qZLrfLho9pO?wr&yb^V_VE!rP77*# z$!=NIJpuBtmS_a)d_fZQ#}lflEus9D@WQ*}OFNeU+0H|BX|kAZ4I8{W&a*Jn3AHg% zTY{RJ8;w<_%YJyfEV}^A^?HR@AJGfEBYNKO`6uj+&iLr#M|gKg6qz^INf(J)Vg-nQ zz>eeFo5k5WV|YDRZDFfk5_=yVjkkG9sblGk1X=jeLw*66>04?4M3i8BGruLRacf1- za(%VkgSLGt?$IH0(mhq@dR3j3is;R6D#-$#aq)RCfhnt!7U&$!bz%c;L!(Y$Ksl`G zE(_G-TCN_~bm9Zh2L*^zLr$f5g$5#q!vv%ru4c;>$SXm~6Q_#*ydU=*VK4bQ~731S-W@9-9IS0ilthI zQd{;Ye3h;WZ|@Xd&2QVKul6s!Q?VOK6X0{BJrj_AUN6wB z?!bNLrool!e0teo);isuh{*#o#33dpFqzK8jJxZH|(Ee+2x;PgUJMw zbIeG-GiD@z0Z=X=)y)zktRPA)!U@7_5rrW5)!w&!3)QBlXnUG3N&%1c!EtWR^7LoW z@#LvrAKDWuRJ=EH(hh{%1SHPp)M^a-;eeyTOs(dF1=E|pK#emWk=bz=c>{J z?NVK8m3(jZDxFUSpQ+OGM!wHGgZRbQnfiQM5V_Fb8Ri!NRsc?M)Mvfxb=0Q{7aL!e z`yUE|g5N{OfK{DhH%d)ymFfZyx;PPYHMdtWVra6mJwue$9KYhtiG;>;UnqO0e;_%d zNUjO6?{r4@#IxWU2}1FM-a^&{AN6c<9Eqz)ehGOQKBsSyV5UfrsGbp3Ak-Tul>vbm z-IX)(>$$TB{cx3ls?fv4n9!uLZRGkh8+-k$AwJAR% z1_iH8Sdy$B>UmX(b5>^>UYzPy_0AX|igc%XQXn!x7=>MRU~<9a3a5klrWZIXIHywh z=!_FUvEvzY7&s1tml*69{m;KHqTjeL)StbXz6ffCP%ArEt@v6mXtwhGhIY%|O6z$^ z&L>$hotoO)G`;6xYIG+jLcf#EzPXS9r9iC`Y7^B;#AT@fYQ;*#Woi@I_&$5^AtTey zd`=bn+?x;i57JfL;ywDDrJ!FOe)i$PYISswn5r@$Q~XcaSFH)NOuVJroH_DWQ;_lM zc2Z5kxAWV@jOJ773-do&yC$4Jxw>KP$@BBI=)WUb&FMM5>?3$VYTO~dexQi`l&NRx zeB=+-TY7b=T&u8Pxcn);SUp+(6m-kQz*8^3pWpnPoU&*@m>bsvC_@UGE`d)AmDdwU zlr@vYoM0Kw(G=4%9JwJcfY!;!>-32fee|_7woW&k+d6

PQdH}1_uEVi_Bv?4x{1Gha94oIE5lw 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 z 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

a|R)*(>KNXiR9LRy{fP+U_ctcM+cVB$ej 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

TuM5%*oRrRPvlmt-E;P+1yYQ;|esw)qT} zYT+zLiykXBgLC;B7x_XzZ^sucuYN%(t8_vOUCyqOhDRTA7J=&h`P1rg!fAg-- z2`@M_qwD<&ilMxL`c^D||IIvq*f0tLu+F=r`?0Q-AO-%Q*J)@B67@I)PcVZ2O16

wY{|h{<;tW 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 z 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

IetAuRSYo| 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

E#?=xK6Y`klH@oqfJ=-j$A zoNgKv?R@UpIW&<;xB5R}(6m|r2nEztb&2_IN-DV3K1le>>h!VN;m~@h5)yXW>Y$Je zLw`Lri0)|H=aoC8gbZRXr~(*CVTv$#fd`nKJ~Uw0(Sce2H3Q+?JI;EsSxx1;iQ(>K z;aoJe^(3RypWj7}(`VLwSs89Z0pz{<(awkH5p_EXHCPu5gfRF=?VEPD#v@_SXfjU4 zY1|rj$D_~oALLr_c<&_aDp;;N@n$pCZGYSpM%^Gr;!%O6{g926TN*OtARm%wK(Q#Gf3h5jVs;{i2 z+NxsbG6t0{J1%Ap~l38fYBcX-R^NH z#6Bs}u<^Dk(ABB>oT-TS6<*O-5!YwYY@WNyk!j=6Od0*FLj!Dg&+*3O-hb@HgfJXY znd*>Zff$1@E?7VYfnZZyVP&sN4_8E6QQ(huI9 z$WDiE@?Gpzw-V5qZK-#zLVtT|?EE?R{xP{0<6u>}c+=wAjfR=9t*#Yyc=qqhtIRuU zUR;I9-Wf;OlFxrpOFHK1L~;(rSlSF_M?&bx5tZ034c+1b795H=C(uf zR;9iCp2J7I-~&Jz7zEXOTs{o5)$?IEcIM*^RsmgTCJAZ-TKRy5t*r=VBe1=*8I-e_ z2z&2hNNLlR+kV5O~qiP=kh-ROse{yEs*?i{@T$dPZTmX*m0$kZ%r-u^_) zv-a&QZUOF9*HP6=1PTj z<4Zb>_==f|&Gi+y&cA#Ol=0;nsGCLUi@6jlDL>Ht*o~6rn0AQhZa%eOI;zq5$esMh z*Wd5ds{mqJez%T^*F^sdjh}Ls9|<^+s97EIrpo4kuj?8RY= zr%Bay&-^H0-G6erapm#}on}jyQUEaAb=*&Vu*CFSjQ^6!im8pInvGcbDvjElS**L&#J}u?9g5_p+1B`)xCr*2YqY ztvOaN*m9=l$93e4GR$5$=?bMGMn>W#E>e8%JqS7PgiAv=ZXLhba*c?5|8M|fny~Dl zB6;>H!+*s|mf5WBn&VE|lli05Po9KMmCTL2`E=SMy8P#i{D*%jZ&&mwh@#}csQu!Z% zDB%+!v2n!fT~xtdK9_N;u3)TrOF5E9M?N!y~2C5aHyD`++&8E+4jCF~ayDhZB zpno{5(#dlmQO3q@(gv zXFR=IwG6o;OMfZZ zbDn|fU_KYJKwzk+bGoV2?wL(wr`8tWQ+9(o#+x^Y4Z;mALg&7>#`^qVtE$Fm&5pN=0f{uw!^APBh7pHZ*$DL!4zKBa7_ZV( zl5J~t&mm(4X6@;Mk&+QmWZ1N^oPSut5fYo*dh<*O5!E{)TafSGK6sRwfT;NeV{ABf zYt7d~Rc&5YZSdC@eb30*&mY!OdQKRL+NFO4v6K&6xbz7XyGi)o4j(;4$ z>Z|_bYk4P>rIWX}X!$MW!6+1b(Yd*w# zhFSFu`4AXFulnFW+V=a8Y^3=}OW}vnBR$tBVHBoe1T#Tq&&V$wn@0F>F^H?@g3+?Y znN^HoIi`rNZPKO9PC{pCR%j<0bGWp`+}2(x`&IORP?**KX^>6%(|@POshk@K=hW`_ zt6BP2Pb0_EPgkeAZGh+&$jrkp&e=k#Xgw|Dpd4dRayUK?;s`q?DNPY>hBD0*cyTX{ zpT1~tLup+24O4 z5#@imFX5^0u}zr~!7P-kU|qw5$05RgSE%goG^*@(ETtgm`ZSOskvy4~1FT_w446Nl zqQGdJ<>BBL4u%tZLDk45mG94zBFF*;Z<_*e+v^v(HJT`@tA79o0{#wc8}9yKgJ*TV zh{s0RL~9EQB^OHYu}u3>CcmFz1Q4?Z1y&wXH8L|^T__aHemy+-`8RpJ)>S}IUYx1} z4eURC%DTr8zPCUu%hU@&UR!X?%v%nQ880n%PZ&(+{8V8bX-^7dIfM(UWxHmFDMJmi zfjRe$%6V}%@PC0h7ou`@m~>G(r&(hIbuL8d>-JXmxCKsg;>)W$V%_+o&!;wQPf#TO9)@y33knWtMzsS#k!IN-M*lVe07S z6?N1wisE9b1I3m_YIpCu>h8m@uw-8SOd|6CYJcz1XMYFRxPJCvG=z00qY-Nl&`#?%rSK2(PQs74j>)_iaw#WpN^hEBJ?ER+ato>o>pUIYvvVN!h zbW(vZbWa+#XS}7_gJMIaLhYsA0Un?e4yophs}ILpZG(y^K`fubphb06gMrCLr{^^s zEm{5DHIfMe<8@{!r^qPqt`VHFIx#%}H{g)ouOA$bowRUV79H5+P;zx%C0G=4P9<2+ z+*WsY$5e#c_DJ*=Rd!)78nHZk#1w7 z6r)0lhL09Dq=f)pJRBl?=Fn!X5qu1{FWX5AI@FTQ{vMJ&8jX7!rei?#nR8q|)sa`w z!hbTV9T8#GX@_B)PXfLT9M{L0=eA+Aihsg|c)ndjF{T3p+TEIacoQ6vbSo{hKa`a_ zWuyMA#g07GoFs(+j1fpBCDXj&u;8vvXSuVw+*zUAQNG+?TgsJ>u}DrDbcik49h19w zpW8a+^`L$YSa%4Y7BLQK0?zRFusgpiUw>Xn zB?;O)Sz@LsbHpIOQto{g?3;G<^!ekXre1nS`Qdor|Q`HfWqaYvgvXIb{gSrruY#@#kX2 zaVGv^=`IS&uJCZs8Q3Fuq_E733GBwkNm;Hdjj{~-8*h3nj%HHb0`d5qWae*-ZT}DX zo{Gi>XmqaIF!I#MspV3xt$%z$hCqlj@Ui;#sd_g%H}k~~hb=xg-T;K)@xU%0@pIm;u$7&@YY?DU7 zRX`SHXK`0~ge``q4<@GaOJZTj*%ZFAep(1I+xUuU|`KLcG!*Val2FYsEg`6vW;G1rbRWoJ!#@%;@Z4^opeKSda?hQ zDklrxHY)H9i}Nt}rKcx5eYCBV`iH%D1Qt6@Z;YfeE9Cp^vc^&6Go+y2cu~7X3B53HyTSWJtI2}b|F;r zc#$=0cl-$4jpKz1qroxNtN>)G994J>CelFESi&@t87iC%Qq>GzW9bz=<7+pcN}sgP zFA|tX@4Nq_G663Hc;ins(CfYS%rE=!&5kQ3(+E)?2aIP7%zxxFHak2oYp1z+C4q19 zn4;~$sW)*V(oL~0E>tPrl$QUev1*?*CWJu>&N-f1vR&Bwc>-Yu5Ycch^_P{TdyY-4 zE!Q)*@tJdJZ$?|2(TQxJE?isoAKr_s0MI)qda7_~==ZnMq zgP25dbAR=gpGus$t?bTsIg<+Tg-pgtSREUcAzOY=pr!~Ht9+dgP^qHcw$7hqg=l}X zN9c(7uiUCeDT`Y)e)A-xu7L|$1DJ_?K*-4ad^hC7)C~KT&PRm;wH6m!1CV7Xw?-)- z)c0Oi&{TT)^5xE7fBjVr;IIzFJyQiDXz1hJ7k@PllmL=1RzS0v?^vi3Y7Gb*{<)k7 z9R2cJaETB~u8^aJu2$K2bY8BSCm*f@y_cl+O(xN z`hR!9bp2~LiJ)7!X{z?Ubnx_!fzyM;S$;Oz(%g4$i>ERwBE%lZva3REpT>bt>+z}Y$Ryxi5+J-L)}*MG>Z z_FWe;JD)|Av?B4lKZr~&zB_vOboT6*0k65pMb)RXqj*X0k5jma&)jv={!5J689qS# z&C4|BUV++LxhzyF^ijX3bZOh>6}Hx^uYU8AEoT^4Jr^{u*qM*SyP4P{RSmxD8aa{EBuZ>12 z$vIieBf_Hn4QuN0C1sL?HnzE#QHOV%LTp4qgD79nD zY#|rPnEBRER#OWTfz*>TwSR`Cws*+UC_yVGq4l!&Sx*qr#cB}hMi7PVSossqRD^nQ zbz}+VU4wX}zW=SLL&FuWRPx0AIiL5 zzWV^O$S%fP1^k|-9q@k=+|L(tHSmhty3^*g7J75kqSdey-GHSS41esp)D|s>gea30 zJG}E@TnwE*6<6z^*d5GwSaZ!E&(uu#)ew&Lvhl9r1Dq43)-zJ;hyr}45vP!g zrmA5lCm8y{YZB%e-a%c!$>x(y2HP&F#fr=mj5sMs4YGJ zIaqkFM*JT#^N6Oom(=N#FLxf^y?e0#NV>+(jq1toLMElFe-=BNXUn@8@-aRCZaqad z%P6Y+`p)Bf<0hw%lRzwT1e{jPwaHLl%(f|p!h1F)OGhw=WPc=L9M-lU7{dLp;^Hrc znB-AI(WvgQWN5)dRSSckD_~Taiw*{jZ%%jb?Sv$}+p8TBM%KJ(@^Lh{3_pZH(CNSf zA8-JJ<*=awe^W3)jfmwE9(sP#1s+*8#~pVvNAS#2d4h~r?4bLP=8r-sWTLBWCUuBtJ2$SAyl6m zZgC9h_rD3DVZg4p`bmPaP^P`#@CA~cZQmH{Z>XEs3P#tODvb)m`=5$1t|`&GS6fz- z)zyh~kkP6(mK8@A4w6+Zk5&K6@)Y$br%;|$pTMEGJU_jY-~Bbo+({RZy1ILtWipveCX>lz zf}RgQlN6GVkk>ROa+(Ti0>X))Q#}>jlBHnCWPjm3cphx#NV`iH0MgMW5#baXuFNsLg&ma@W5@GqAaBBM~XY`e)`timEGZiV8C zRm(WgYDDKiJ{GD z7k{JJxbEz)SQspqEa)ihm2iWVDTjju{fTe6jM&&5xJJDT;~SSG^pS zQF)!i;}=2{Sk_<{m8n#v0ufR<4=qRrzhoxilZjo6@o2HPw|TV?e-@iNI}7q>QL8$T zW&3Av2FKXYjbOnmzBBPfu?I666*jqo^jRIq{ad+vB`Q2oc6mI|eK@z}g$?wsEPn*{ z{<4w2`A|BO{@s|9bmk@nU~+268S;C;hC|G!y>|BtUU=EeZ$)|C7Bff$O~3abbMt3tyoJ(wb02w&s48 zgYRDp^Ae@Wc~*{o&zMp6ZGRU{^ndY5*KgeNmt|i>x83_9RfK$(mbZ6(Lij#MO84xA zC@CH>y@Go_ohFyHxzmIQp3xW3*-h2sl=s;?*FM$WLG#m8Iw`)t>S9NvulaHM=greE zQ|X`ge;fYv^H02!@zxp@enWu&q~3|hN0>4`bpP4T|9_k5Vo|B*{4?D;4uA&0(Of^107LPNvY*{%fRko+JH2D! zu4^v$5;GxQtoz~p&kms@w-k~8dNsU%JL zzn!?Jm*shc19L}Q68C?(84l!s-D;HEbV0IPW7E9U_I&icL@PCtLx1<8u#wg(Qzq`SSP$f(X!6<4|d0_iL=>MYFr%--K%Dqh6W>@BG zoEl}~^Gk<6Qi_}>VSjzi(3+Ugm?dt`0xuL*i^-Sj9mb z*ZyENE7OD<;(%0!PP^Mx%U1E1#G&q!|Me_+qg1Z^r7U^3_E)mx8XAY5o1^2(>5da} za)pHc(g*js5Wx1Ij}<|^$ti6GYPG4+N6~jM_Jg*Lcfmd!E`O=NO>3=f$_Nlkefk71 z+8%kFDw}|Px`31eEMpgI?IE%d^VT7h{%SZ2$AAkMfrOj>@^2Ij_lr0kNRN^qHZ-#aoMI5 zSf_UMO12Ox9DiQs5=w1ezt+wD#1aA?xP~5927$Q2;q3k<9~r(xF(+INkLcE;eQX7& zvjRAJfdnjP`6+lpSu4w~fDWdYcp%F1)Mf-ABRf5eKJ%mQb^wESS>yle$&9IdVH09B zEG8Y@)1-wfzsM_(tQ3Db!~A`Qb(>(TJkE?R$5)k=y?>*-J6R9}&RdsabRNOvn&->Y zwsc|)SzLmK6`HtObC>cnmf!hvRc$4k@-+bDB!gewyHK4(=IZ#+-4vis;)X6cbF`KD zyw{H08yIl2Ok0( z05KV=3V%A*KC`5l4;Qdm55%GNvG^^;9dq788`n@=fyksr(wVT)IZL(^EQgWh`N3-Y zClS5}PEdzH{_Tnro6p=w{6BeLIxUVyu$~a_LQ(LJ_kG~fRh+H<7U27;-4inW{)VPQ z$r&V6?;lT(ljsW0R63Q$V9jxK(zncpm;m^LLwi=M<@f_1nBN2U;z?$q8pEPJK@cG4&YFE6#fy01x6L$dKkE ze19U8qbuIdr0*il*@XadCP{oQT78w=Q>?GwyXT=dOu3JrBIcimX3Z=Gpk6BGJxB9o zTQpmZ4yitbabJuq=XPHMbRp6lzTyg`5CNje!5^o!lRY+8<%e?F6XuOq|B~Rx+}hJx zC|SNkl0{JH51RqhxR^fTG7J-v?R-;nZhvv<_}E#+&~HWmuB8cTod!2j_a!!L@A7xV z(!eGu#A>NR3gJk|1ApPz_7PxiPz3XldBxCto5i?bUZ|$xRP%}s11EaNwBT$chh#mT zBanrY>VP6-l}^&_tcPAJEQHl^18I3{esF>1W+sRY`Ses+5Gj3ExLvF;>zZ8dr+-&s z|83?$T^k~p5snkS5HDI*gRaf1`&it(k^<7sloTQz7PN^{i(RZ&YG#R#kHLpd(29mN z89c6ZZw6juQhE8FG^KAqszSBO<1~6wM*W4m-^EwtEVu7o!~b9QE2ftp`>!Xh;`_fT zZGkGW?hT@JR{%~SK>VuJ5EEN5oPVn6uo*SKvX&Rt^4J*u%+zwg(36+Og(u#ua%jjv zR8xsBC$1;hawwIbPa9U6Bj0KToz*n5uZx;S&EQ->yrKgGG)#Z3SLo17o=~|KDCjFp zeOEWP2(@Mv7gG6h8GU`c%Fo_?nk31ye5~Od}guA!GHx+eJdlKFyla zwRaFi&Y<%u&X6U9^5M0P?tdF(uTWIa)Tl7yfY{ADb3uDuC&Gyjj+(o|i4z-K!4yb{ z3j8@F58FzEpAmTSJvS?^`+|uKm)zzt12GT{`PfIi+M^qhQpP?5nMv5&aFE)I>cj>_ ztlDgQ94Y%DmF`Kf_V_)D^2P$pwxdo{t{047ypS&ZmiHsOBspOOmVd2+LSG;SiuLo{ z1c=ms1O2h)S>(rL|8eTeTd35;miUltChc9!LwgIc3!}x;f5I+o0fslvk9J=iw6nwJ z^LE|is@FW=DVp7Ouhs1wpLD+PX*dD)L~k?{`8borFHUfi1M~QSjpwF|c6;zMR;d>^ zce0U*z*2-ju(IQ9Dt`l+r8)V=`yd*Dk}h5F*zPE!+YA}L8hG7w=dg9~Vz=!I!og=e z^8Ql9W?#bj>!9ph!vQ2IG$i9P8i4dK1nbiNGlzgqtKC~;Yub26J3?2eXFbPns6~}J z1vo6bsRtNypcVC|ZH>OOBC)WrxGJt007U5Tw`S6b?nQ1Ch#r5C~bs5>=znaL60gNp;A+umz;+lPY4 zdiD$o5@~=m?bXjBe8nwU=1J^THKp_axqRgR2cApNY+b=kKO!V?Uz#!9tRSWV(&T9T zEGZAzT6TiDqxUqHYgNKrS^Go%@jH!pt@bJ^ z_yxO5LXOfvPLesGZaFFg6d5IEulwPx)YJa_g&V~LTYqZ$qSKS{p6!c%=cxNtJ!|pU z`t#;j!e_TOnb7@l&_BO?RR@1tl|RW%!1acgzeGU*KD$_!5qtX@DBpclBV8sz69$Zhz(E_$~uA8vgF_BIt&mCcAhoyC$Lb zN{O{sYO3};7Lc{9<4ekbTA{$BF3Ws3d;83BatYf4waZA1V3j)lDF&wk$DcE;2Dauf zu5LVmb#-HI^XkT*wy$o?XJFlUsD*XoF(%fH$Jkgm9%*FVP*&D5$Mr9+px)rC|IZy& zNPmPRpb1C`fgIM9seS99*>e~)R`&8sj@c|DU=duX3G9CevlC<>(Vl(L?$%wNUwxkS zMnlaaGL*qWvC+xgG7M3rTT0j(Pj2pgoS3ooi;P(`+ZE!-vaSu#qXwS!zFv|UDQ+`z zgi2yuvit{P6L?gJWXsUGzZM9BRUD#GOn-ZFdg63xsr1M6%@Yhiaa)IP`I2dRXf$9; zwl|yqP>3)`#~4MPp6g5qK#=D%9Xn4dV?b(E%-W8b(5Od7vJ>}(x6|S&BgxDJFGC7t z2^8ok6EP}VXP0&#zt2@+CKV3Y`Qm0I zV|%mtTKwfvc8p+)Y-2-_fN&asva~$$70+LD>rVPtmWHNsUur<&)XHZg5n|hCa!}x? z1we~ftU4gQ-3fxo2{}*#xd2B%xW7^Xzkz?A;R|qDi-QXeFvQDIVB@pF$Jt$B+^q?z zGP!1yN1}NG8QHiKgG}W3nJJs%1e2VnaeS~BrKn_CjJQ@e6FHGQFGg0X&? zK6%kSWY-W>3kStPqAHmvNRbl~WpvZ+7P}(QjaQES>`Mv23Dfvsm@gofSsqzri~xVl zIOAzhGfQ>@(y@<|Shka+a5Oy;#Oy9imEl`@uIxB)?)$=7A()Jvy}-_jVIOCm5NID1 zHCp^Qdf^l&XPv{nqZlM%lS0pKaoCC?2+m6x)1C~Xc2{9dHDOg_aTV8rt2#ctam%Lr zu`?`MY5=xzUrRh=Js_eAyw+>+Hmm#xQ8t@{mtu;C)7*pCrVAx+1N5vxa2T$^cl!L#Q-1I?(YpfRIuU^B7|AXSNSNFeS!-9Vwo(Ql7 zoZwMM)yt*Lr#Y=-i{5H2>U{m?h66fuPx1JSaix^{I?!LWK~4Jni#?s9%E+=V4+JtY zCt4sNnaMuz7NRDSt8%5%b`IU($f$h+q0`HXSr~eiz5U=$BA8N@bXJK~ue}?O*e?-e zU7tpvT6%^pneGyJM%ug5jQ)REF8aemZlmfQT~Jf`TegZGUjHBj_O=QyOh;Wfq=I7G zIck?J5NQ-lG-izc+TS zmh;lO@F-aK_ZY-kCB@kKz|C|gAE@bBFAAK|8*By|QTlSpeT)%sranSHkop;4*92(%>|b%ANKZ}-FA|2%IjCF6;Ci} zLYdxOK-6?f*;)vtu<9waQm!qKSgIi_R&^cmtu~Qf{Oa+aPBNc-@`>vF$C3q5GLLOD9V46iJ}&=Lhs^rEruZ6uiQoLBWCKXv)6MX)>`|tt?2=4l5ySt zZmJmTqmmR+Qv^|d0)o($CWxWxzQt7rJ7P&d%Y?IXL@nyn&+t4y(j)*fZ3b0>^FuzC zKC(7OJUFZx-IIYf8o?yGDhn7trsf3BN@o1b9F9|3v0hpr8<>CChKdm*k{w@paK~4& zXJ8k;*XNl%r*(2=k#px{{FD~RB)39V0FYTO$$Ja5W^?MK`JZ5qTJ4)8h-zg4T+-H^ z;+3TovuwCc`$pzA&taAkZMUNf<8Ar1tSLL=E8LUE&*Q*D{8a+5iibDLhVxj`e|f3) z-Gf>c)*(TGicNoaY@dZAWvP}@KP+bvnsV_To2Zi4HusgQnb{2D0S9;-A{f(}scbVpd(A$YT`mzSR`4u%r`c&y=EKEDDDFiq@fe@O_kNC{x3^z5OZ>=z2i&DHBmGuDMpJfp|3aRAb5U!b9J(i`|C0M9y<7bS z+2-7pP=rfWgI`qF=B=oQvz@a!9!*#$QI_RC)Cn(`2}MTJmi>saGsJCL-}8#`QS6mr zh3t>sx+w;vX;$b!EG9+yU8zJjZt z#U>J$!;bR&tOmJgH%nIt1yjm3!#6F?a3UoZk(;?$`a6N6N{IjXy#<8i8dWWMzM!24?hU-s&Eo+XuaNIsx;EI-|4qpXTL~ znnGPTDe6qWaGW($zU(EfI;=!K5e`wqf07U*X3`mx0;Wlqb(G$Vo3I(D?h{GsGAs$H z+FiUgcnA_j*gOENYky9)$Ya-?+|4u8;)1~7iU)sVEx4@ai=Ka?!!VyDB~H2q3e|rq zJ&g6w<_bWYlc=NXH#?JRQE^>dN92`-vuAUblxMG7Phv=|+~TB|acq8yflENj_2}*t zD@$9#v0}HHfM-h2i=Qvj#s-#3t)FY*+kd0kSepjcl>|3wY}ZO zwr*6$Y$b!MRb`-_ApmQ}v5`tmuyyF4~crZYbOGW(N##`y3AI>xNDFP)_xE@!y-zflmeV!<`Ke5=E9lFz8 zK!>Vrq;zjqw&ocef2upHB6Z~$sn0~i_JZh|n}X9YQ4&NvH6~p1(d?Y86YW=-nQpUg zw_15??rIrC3H5yEuz4a!BC*Pejp5<#%twR|RWHR2%gC!W!^j^pZ{&X-0{fXbtT^bL ze1&>awV3IGH;zF&?XEFeRdPKQe34SpV!c3Pn|U#om(<2TPN5B?Q?K($naR~lA8zP(p6J^Xq)MhpD&y z#T2sSQWIG82+vFAn<*XUtAHQ$C06%md(Cd9nGA2T1Mm~joWg%FvBcG_CiM*c5@%tb zsM7P^lR~Uq$)O!LEng_`HRb`2rw7`^KwN|sIv%p9Z5a9@BoNf2ura5sjb-VVS=9Vm zv=0Qf;7IoVGG5bTu#nm3R1;_Z5@K@E8J1qnYtFS%3$=qx?8pci9RK)A4%Y}c!BW|R z4~|UjioGJ>R%L%sZe;A|%Te<4V3_>eFBTHG)dsZjV;e5f#P?2QNA9e(-)?;ta)iq$ znJ{4SjbOLb>(-~-gFD+3?OKGV8m}A0AmH~t6!0q+PG24 z4|$eS*`&JYiw9VpN*J|Ip`LIDy_rEvdpAN!M=%hT|4DyBIZ=yr9x|5(24A4H%>u1u z&lKp(v2WF4`8%gHI!XK0i+j4lCb{)1#>t5cn5d|xFG`$OpwC#ygbvQ2?In&L*xS-1 zGf`+fBnI3?oS5se8ulx>@mbUGom}0?@xcDCq8`6_HSilSf!p^45eMx<>EE-~X`GW= zjUj*%{9k{w*Xne>rcp@Fu~0pgUFnX$fuoadr0Ob;#+=`zWMsE6J38JIQHefxWRibR z?hF)SS`&{c?`6-trNJ_%SIv48;vI+4$gnpgkWCsXr$?*;R&QsppeExNu=?3 z8c{Vb^29tSi_Oa0RA3b!Nc}&Z394S6i7RKgFn0eI(qxOY2UYZElpc#uM2(!6zBCh_ zskR)W;oREjSh33Y#wjWCU!^lGju5wY4RVN;eteh}X{p4=zr(d|ZDV77!#`bC73NOW z!pDEUd*aaDrQ3KNsfU-Sx{vSNS<6coo(cXP-CH2PxQSR?be*d_*kD2hJQF6Iz+t@{@u?nq6{y24q@tBeQKRblbx&lV8s;@QyrFlp2|5Q`8J#~ zk%$;TCviQVcS!v&ZgCD^LSEP6`X<_7nLFbdX%JA1m!XE5v`trJ@z|6@VzGO%E0q0znRm*HnIUVWFVUFn5OU zs*tY4Z{d^spz!83Er3D9Z-+pdOZD%~0N)h06(Qx~AxOC>BBeABQu12WP6c`^#}F6e zZihvC9plY3^1WL0<^}g7pk`FTSuvloD*kd68Zql};5_%|z8lGmuixVoEL?w?_gUas z<2fy(-z?o*o%b_5`xD+UU~UJy@lmufv22vIfaegWM7&|O)Qh20Ppeyt)5vRY1F6;4 z0{f=uQXfBdHn)(w!3oEYoj@SpMt#YBRV52)WvMFXTQg8xb$PY*xYmowwU!=GD+f;A zr>vqdC~8Fp-0N?t(L0cKNNarSCA_4*A+8g*j znYv%X5)7wwj&-$xoV7N4%%VLn8&t?X_L1ZHZZ{*2wyobrC!|YZtvY{KmCy&}9IS46 zrR^&wE%Lf>A+5%Uo@c+cCplr>j5TlTG#5wQGaG~abvrWqBmwSp$Ib9u(?aCoCG5n8=9vZ{45LZ0Vggakll10)hr#C5= z(}&KX@d$2{e;JB*Ty=k@g3AbHm_EYGq*(aa>9G`Yi@PM?ePejJrjBQzGA^WLV+NO? zHm{bmZqm3MMeP0N;PW6`7AXsUYUcqqJ47-Eg-j71HM#Y;D1!o5ajB($8}1wPm%5KX+yx zG4iEGW;V!<(PB)jHfBqeF4U`?~=L>emAHX7Us`s4_Vy15iSM@a&KU`i|5<(yjhN zdm#)5A3c8o6h|E%})T8_$Kl@wR*oHL<0Vy2T(; zCK5OD6i#l^7%rEp#^>eK=`5RfK0~ZZ1-A{)LQaPuKlY}}DFJ;Le$Hpi;FTHwTPk)2 zw0Fy4M4f*7ve`LtE?m#B7p7smzad~D>h(N-Uc7(c&h`!lOc9~M^ccAsdD01|xA^s9 zE;k3dpF$K9vHYUb(@LX~ZmM^Gkg=73QqfLue^7gz_XD%4UBh zb=Hx(iOsBASV^E~j|di9H=E7nGCeNw!7LjR3AlF42V>z-Q`8HkRLZlRQ#}t9tf3W6 zn`i1VWG zMIBXhpC~Jr^aMeXB$zqd+}8-8D$Rd})jlbR&55o48hbsb5rDkP_YK}SO|TQ=6FV`5 z&lms?p?^jG<%)wV3y;F!rl4Mjm%|A)vBd#*6ui177fkV>ZD`AO zOxbjd6-3K3dd6aZLO+>=4Wf%uJxR)UsTNGi82Cu9>23)k0C82v!J!F~S2urzVlaA` z=QBb;`QWb;1>T-l80c&6`FN24_Bc4&5eWh_rui2==U1V5y0Uxvf0^Xp*3-OoC6?Bn zrk!xnsgUauO8&(TF{lW$65Z+pGC2{|?5fzA-1ek^dC0{~c_S;v%#}y3pm>q{Z zRS|Z!FK;K$DmIevX&`{-J-dJ5m$`J!mK-ByI|u14UK;EL(Csuy1}@xHB@5Fgdz5#= z^A{b0H~QszfPeF@2yT6*`*YkmPO-8y9pF6P?ue&%#1biYIF~J@x{L8?M}hqJ#d}&P z@UNjqD=Sr~-6?k12jyg!;aut8*KZt6#x}#sJHeMDgD7{t|{m4?9!Hv&HQ)_!_Rwl`SLz0>Jy{fld`OJs87M>MluNN*E8|t!CIMjuvV0o zdof*4D-d02PpO0qdD6^E=fQPn7?vTa+La)d&|knYPY{zh49T^m6mKLjLa+;rQ%Hrc z-5-r5FLsO-#M1+NLE?W4ccacO(bWx;5Q+HUR*v2er%U;AqgVGQS46G zlq?tF(ax3SKP~l)#$Ee+5O#(^yAfuVpxTHdWE=PtgAgG}mSKN(1DBvcDxFuB4Ou)A64)&mCTSnD{a` zz(js<4&cr~AeX=9fGM*jmRk>}#_}wnDPb2s_k#q_X8CoA$CY1`c!l(M+;7$uq5Rd0 zll{3DCt=L1_``pxfq6>BWf-W4T-@s|eTE&KfiU=V@*nCb)&G926ZLal2V15mPlI_X zG+=BOq!gWRPxMX_ECKEul|URAloxwq9H9N>h3oUX*H$2L`-Mv0O^dr$+I^U?tCWD% z()ezUFU4g*d#o&-=ocD|(FT!Zjr8VbFAe9#`4R0-TabUvx1_Vnw#rs<)fVKjd1dg5 zQ#k?;*~w9U>C%^-lYP2R2ueqU62j)M;Ly#afeI)d*-4y`(kn4aq}kNf7+w9lQLmO_ zk6MVK9R{AoQ>$H?@k|oM&Djf_C#80Z+rL>-w{rGBfdb{{@%-w9^hU3nM?nH(t$1K% zR|uB*azKA+uusWi1qlZ?BO>EhJWb$kY@S&{=D;82?K)Cs>}J~?2>LOhXhjxW^m20J zgk=QL17dWiJ^ah94V);0z(LTKG`J`RAdREEkX#`-fm?x-Zjpsp(t3aGWW3qo);nf5&+zj=?xqy=RFA(q<`5LBX-g%&J zFK`ezf)w0KX`|bp?{I_zE%hfz9YKvynq9S|`gSF^d{rAaFb+!OOjt9loUy zgfb(bQo#cgMNfToFSc^M0Qh}#R7*Yqtzh%hQsd;Qki&*^&MoW7k^T`8owxfFCZ!k@ zjf^pRoRcLF#kBzg6H~Fh%%JBel4^f6!kKDZRvqeu4D+nNc=2!c zoF^{*g-?Xj5a9R)$8T>TGZy}Op{*C+ve4c+6=&_Pz``Q@pR)X(!)~!!*Ed7!^9@~YAYftXLuuBsg_buS$H|Q0OaB@m@nh{Ia0f76Y(m|6F;Cg&>GV{3t1Oom za^XB63jVwNCiHeasP*hY!~D5zJq*1dDTVztn`5^VB@34d%(x;?T_)hK;L}>h5Hf}~ zc{JBpiVOyZr1_E2BV&Kp8-hacZ$?!Ryd)4j+!8=umQ=6C@1O(KeUeaO79E*L#Vk_+ zMH9?mnP8l>E32HB!gRO{jR-q&V@J7K#*H1SwxuOiAFW^>U*mbA#(trF_N*pNY^NR@ zVS#mOX*CTbKPn9nds@e7BYa1{e}>)S*>PCe3{&Qrn$kIeB@=(92N8Mw-*SXQ9_%g= zb)8hi&2EC(%X16F`r648e5^S&R#2D2GjGapbN95~Oz(1%!J|~~dI5vn-`lOSA)29^ zJ3STH9aO7DhJ)2F-2 z7w(OhCLf6Fye}P4!)qywx!f9YpmQx{l6YU@|MRJvr<^gWc>0<)gv%u2q|QMo{akcq zA|KKttuTThiN!%gOta@cW?;<~y_rv!R-rYASbWb(_aQ#3XQI zV~O6xUahQeUYS~&4vTv^8?@UDRq;>8D(a!k_e$?2;4Qh5w#OwgdwrTm3bc!j#1xz} zD^7s=Xk&jc`|IE5c_dk66=Cl>8psN~xR5(IC|479)9De~JO#1rociDYRUe?(P!p&{BcY^4q65vZS!(O-B{}>4{BT+5i34&rjU1m|d zA)gx3Z2hrhn%%(49Nz2?e2jf7<0$ovbm+9sgGhgL>gSJ|6cjhq8)Z$1+P-WF4`Jm! z)T`2qQz-o6kiyE5sMvxszJ^IfHIrSj0sjLjsjLAy)ZswT3GHtDYTj0kd z2p7JOvQdcNs*$2(`OF5@>2zPWz%d5)S-m(TKC3NjZv=DeLYq5RS#(07MvIoVOpCjZ zph15F*ro=oQkh$q+S=R#XoPI@Peb;o@lpMUjE|+q50DMhgxTYz`Y#$U8_Drf4dbP1 z$IJF($IH&H8ZYkNN3^%oeUjl)EY|@M?a?7cQjHyRc#K40b9>uVKr7#>kw;HX$*XmyO*O?#HjB?;c=mZv1IH!XtkN zU*@WOfGr0Yj&(saQ;8k4jclBGR)xO+txUPJpzZeEokeW7v*-nFx9?QiDA^8(I-YmB zd$eTK+V_|B@XC5pEww4QOkonE>G7d9U`OTzVfv3f=-~eWo!JPj5>9d_6RN9C>QHJ zWW}~#Q*GF?Km+YoP*fE;j;U(m@)p{r0I-(!we7^|(yH+>PLn@W#v0(r zcd0aeaY(~NH`jUakoDL;FyiAIU`eO|SE9(JksOj2r?tN-hgo6h!bSU5%G3xc^@- z71%0w0|ot5RqI8EOPtdshjvEExq? zF$GKKR7y&=ZhSokmfOFM~XGu#5;-QvG6>`A@tKd|D zG_;?-v*Vv{Z*KPX_Kc61CQ>9g_BlH{J3Bi&GfN?GIi04XGdzQ6BoIxFURLG2(aY+p zSysUcIk_B7vQkwqQK5&^!GgwpMx{2|sS!{v4cS}Kap059;X!{ib~r&GWRU~ooXvwT z_V?c>9U#)lkB(K)Qd?o}0lFd>Ag?`atwtxMBi2SX$1oG5W7ii{Krg-$gV&k`3*Qlu zMne^aEsdj>`@03{i;FfO3QjB=bL=3&AO@wY_^J^o`BNBKpWPv_PzYnnB!hV> z0k}XT_*gG9&h&`*P$umQ3+_53PXX4e+@iR)PL53nd-Ea$@Y|ie_|w;BTru()-XoTU zM|EmJBqeQIq)|=nlzDdt)U?qRbcW0g47^qij4#40NG*TPPS~}s@bsg-qH_w)mlQfQ zpq62bXo%sh3_Z_=B>+5ja&SD0vjI-A7NVZgOr-=%@G`eJtBkSgw@(^JTFs z(t$$1@c(~Z%^e3JZKfMdBWmHHu_0~Itm1ve#emH8n1^dDYZH|O6OZ5-Nobb?_=(`e z{8L{NA0XnLps%_cA-w=e=f(gck!BuMA6)JU|Gnbqwsi7dH&SP#Ob>{EaH=B7-Hj!Bx#V@m$!TJih2%L40s zm^TNUD%%raXi=dUSVblPhxIt4h_WJ_DTlG;K0xH*(9u3%ksbv(Sq|h)GD_02t`l>H z^4qS7_{PKA05XNVO_hns*i*D05x}-fv2+ilRiC6w9UsGF-F5H<-dhTy;yxXdlIY4V zwBmnN>FO*;O;5wEU)e~SbhBkmDG7G%1N&mT;MU{GFr#-I&zwCd`p7~LYYdIy zi5cZf^5|Vtk>y}G=AM^?Mf@m<^Aq!23dHkya(1}G_m6Nt$;;26B(r5>?nP!;lTSuQ_!O>gb$?5#f3|Ts_1_so}!Tf?moS=OY_D=%g&Jn9GM? z6#s4+dp5dbL*0?R2ccA?R^hjnDJsr@fdptJT)2aDgrULloALSPXgm*0*e<|??E*}A z`TEF5qiC&f#^s$bM=Gb|yKFZ|^7Dvp>=blkM|ER<{lH+D9_$St<}nys1-;nPy+D6A zqLP`(y+C&o%+UjKW%+J&@qA|J=BopvTyH0-0L6S~DFY0U<5~KMdCEci&jT+u3-DsI z2rqU@(V_!nFiq5$0NCS&0v7OfLY~`%#w9umRJ=(h*VbqWZ+8iY}U(AkW{Aqwa{v?0R>5Tk^6kP=4Hp;x)0T4Vk(w>(Y;g}4j5|5M7 z0xMS(SKGP}w8Y#l7w50hN}jht2G4dK8VVClwc&%46HF3%qXpesbEJ&G4 zGi#|cOqQr30jyhVrPVFZU@Ukeo8Z=|vRKn7!5W4XK$c`2nl=5x&@0G6)ut6rFoLlR z)qcdi1J36Ub_A=Ub`X%S*c@)j?+=+N0!;Ow33R!%Uw4-3V6dQmA^R%=l%VbYXU&{FDhS{;qnSSDMz zz03Zcqouu9KkO|(G76RO+V)@nvRp%$*&M<3K0OwG9&tJ#mD8c9HMoC6Du|M-qbT`I z8G;#okLY`^BS|%KUlB>rrg!6(4r|bccDH|eyl2YKdB!3MnrJ-=N+ZC?IU3nBeC>x} z%H5=Hv*krZj8oRkCI@FuJ)>VE`jw5fobT_3z%+dH5Wt{o_#SE)zDjBPRfj^yp`9c- zf(J>tD7Eh8z}7@h>C=B}fne&5hB$F;Q)W;-^hz2ecvWh19ZRXuDL2~i@5D1!>Rxpk z7=?PY%zImFb!nOJtaoeDGT&|)*+3RK>=Aq|(Gxp;3+)_>ut9)h&aH}YouCTxpq{XI zp!hd2>A7yd@hea+Z2*g@R$=+}yaaNuN(v&D$mmd!J7RMtbgqAW5e#eSVq@t);idX8 zmz2FpG$$!^{74TeEOWh!{7=9+FA7^5LSLHeb2F@RN6% z>sM<;gXptpPA67Ds@BiY}$G@S?)IAq5u3$ zOS{XG+Kw1R6<~nUCbf2#A;+qW<6_IHGHi1Odtr|Qg^2FS#L3tw9Axd3V0^p*>RjBo z4&MnDc#Z%^4}}7Ak!|!$Zu*!}Z&&9Scuu23u78WyG~$09jU|foC?~HlIy^N; z-Lyaq66wwEJ2Na(|I`C9L)W0*sS4tl#V+0(fJE1H$N1JrcWr@$FbL=5Yx`96!Hwpd zBws8qn;SGKKMp!F+WhAmH={S>N@qW7P1o5Ee^-~fa>3Q#GA}m0NH8!}%Lt$WJ$-+j zw~?#`tnq(CUdgu^%Mbw>1RmgueGO6qkezg-3Tcl=7C=IPDpG*8)(qQz1oN6&% z(~B`p!v{-2=!nk5b$|#^BuKIJ`kTGApPdH;DFc78;ll+@Y+2Ly;oSm(?5n=eXExy| znz=ePOV`c@L)9meWP+J0YPg?D4cQnXkFY5WWtFr#TkWL5Q@RGq=vesDDy=U>S|?cr z4kDePPGAE!`~W?8du;+mgtQ$=(RK~f;F1gsxX(a;qh^PnisNEaq;b9J5QDC_lB&vD z^jm-J%3Au2-{@|pIr9zV#_^%?IbukKiUKhgGc>a0T&DQDixW=|x(70X)$b{Bq=z9^ zE0nrTtmM&G(k3N`jDcFJ-@lc+XND|VHiJkUMNC&$fka0q+4YXrI4pTjB}JDr?qdqo z*M-rk8J1R*G7pKm@#X}AkSsK-XA~DKr>B1@!n(fF!J5$56zNhZ1FmDpZ^D6eyV-g= zma(SUBPYPD%w|PivkJ2bkjFtrr>f5yls-R(6o?_=0JNc6fS1W)>ObcuP@5h6JhwH~ zb#|5Om0wzn1R5;(JA(x!C7>uORsu~m1Tg{yX*Fvwp$sjdQ)mgnmhYXB7ukUQfbV}d zfhJ$k+G)QH0s|CDq^B?Ba@tHuvQgR(YP!RG)?PJ)eTgWIG1gob+Q$ zX1^q!G8BNr;(St=>l)lof>65q>+R%nHKq^Zr#nvarav&a_Bi-<3?UlV z5QSPzZ)7Z{M?ogjC+(uB^Nu3v+h>2H4%gJJcu}->a##cc;JV$Uab8kly;kfpH8wv! zjuy8IXmMNfX7&zDKByi+{#xpl3gCu9LgVm+o_9!6ai865&Bj|Zavobt6}=^Mf8`11 zn(UxIl#E&X>5KXT!Lgz>I@SvslIdSp6RbyZE2%y%IwWj>4$rtVN}?)aQ>uSTv2P*! zR5`f%NX3q>=rDSRRg1bQEF@?b)vs`OQ(h{yZaq;DLC(K)1ua{RdUa{^l@hOWk2~H@ znf2=Z7(Z)&A7kzCqro;#vHE4NK75j^n{#E`G;tTa{Qs|SK)2bJxY@N>MSur&Dy8-^ z>ZU!nQYxp)CM(lQ4e@Zo)O3I62ljrXO|Sac18&FJ$sXre6+J~w6s@fXHA*_HVTv?nQ}m;8+S`bAm*IM?QdbGrhZ2M_;0 z`q^;6q!R`c(9`R=(9?f*H>A>e($ee4($WA@imuH_Na_);)h?NYByx&sx7$ewfrG2z4{%1uE-0coj^zhWHgr+XOV#Bz-)-Z7BI=gv-cx(k0nqAJTrz6|^qe9K|C z*CF@Uzxgh6Xn*t6;f{_Sm$ng~Hv8{9Dxm2bea#pZ3~ygT_`=n0=(o^j_3M z$h|1Uts;Z-;fQ}U;k9aId*{$Zrg?A@8UIyBKl2-^(0djuA;zy2mOm4o8@nd>yAgbn zMmz}%?IEZQ$pi_ZXbEW0d}pv43wkIKkAkNhE@;|Y4q-00-~|kIC6CZg;dZh&SfMMP zd19iC|7-fg00SB7t}GI6$+!vHb(v`g`$CIG)6m5k(zt*4!q%E7ZhZ3BMHX`0SHUfV zaXG@z-o^HmD+uP-?Yo9Ic zZcDcuD{oj+5GmxeuWB#BHDre9j2!G}we_>%z+n^yL#fxb(Y^Bk927kSl75G$t2wbm zLufqsE|CTfdI+1xr1GnFp4IDWWsvQ`KaU4qqc-S;0WTaRaULWc4U(T}5xI6u%Etjo z%VmE%h=Clap3E|tTZNOkB~0F(9=$%?DVxu2-D!A@4WG|YOr>0o=^Rsv3cZWI{Vw|C zDS)K_#5~l1=nD)u4L1NZ;(s*|!Y7;csv=B~r0SeoX^B~MvhQ`6nh1;sr>JBho?ETpN> zZD8g?OA`LCo7Cx6j|r0%MMpMfdLW;?@_xf5vNTdia|h#l2!O4J=tv=z3?LW6<)RG~ zHK#cd-&YcW_mR|6OSPM&(^dPrBX)QQ3uuK=P;1@zF8ftUncd;XnmNxf<;5>|g7!jdp3;#t(rBkZHiG5A6B7ADiKD7owa@!R9HU|)dPw_UK%nq@{^eW|B-+FPmR?;{Ad1)XPuE& zUrP&mDjnvA<3LV9Z!D*$&J9y&4=TNu;T1Xj>;3E}pO?J!m0C`!o-%$ZCE09}&1SRN zB)f|ebu2P$7Qe6u9vFSV2OocsBt=A`1Evei0dZo@0`t|ci{0Nf^IEPF=2+~d7!?!`8{aA<#d&SsbPdj9wOSu?yNgF_$b&VPI-i;W~l(hNCASntuk zR=ll6j~@lF>l?GdV$=aFgBk0qJ1l2GOEu)>M?tWm{H@2<<6@z?qM zXMg|ju+!P!H%9cg9ew05Svwqz);j&uwf$>z5UQ$STv(Tt`OxQ)IrT#;oedE@7@L)) z=xP4G_?8TAvYxL~jq$jPq*VLO_q;PB2kACGFP}|Xq<*X&=zD+Jr_Rc?TaZZ0)lzjg zA9jBL7>!2{O0Jf1KDmCmIJu&}_%6X&6W@rT0T*wHR@@RZLj?xt>q-CL*b+++F8&sQ zGFh@j`FUA1``3w&pO=q?7eu?+G8lzA6xSUAutcyJ=ogg1bh}DfM&x>f>t-NEh_Xsj zZcYKhp}7bO$O1|LM`@y_Hr}B>eBU_5Pu4 zJ&eEq{kGn_ZtH#VX{4@Ll*_gJMq2p3q`MH~Yu%-~fIjZNTYADHZ0T*TMwr~arS~Nh z&qF2N(pwN4Nz=ln5wPK3?!@LZCcXzYcF%`8?0>(*GR=PmBKU@RQjNtedC#xFMdJ;b zn$E+Q_GPAaZvOWhHSgI*%@>dUl^ZpFzeY&@3-@bue1F+zl;S{6XL(?F1R6U%?O#rk zi#{S=Qp}u?1BH3;?;n4cSf@=K=jE@z(7xo=eC)e;98!u_4myO$LZ>|$pLUM9j0g|J zD+tzZZ;5|TPPUixUfUx?j^*EL+j!9T+V-|vfLx-0xsO6(9L#m5_i6ZZHtWxk)A8av zJ;-)DKG>L@gYS>O+5PE>4I?g21)~*tOMmKb>O@bUj1l6O1g^(riwZa=WNvzU)pm<) zD3!v0Dx~+>@w>I$-R*%k`4+ z&C%e5*GcP0Hl4R9w?YyJcc|f)qf*v=o0m1J_@;-g>cmGeQBtu=KE6lgEWP+CZmej^ z)Z*&T`SH*x;-UF~TmAowU{ITE<(cZN2; zY%PC&^KF=~|BZn4)=;!)=uJ;!6SM|+L!&Y{B2Ss*`T zqTw~p#KX0>-s!M`U;jK8Qfxioj}>TFlv)_|jF~4?iuG7uLU{|%;z<1Q!~H1cXogY8 zu$6*%qoC?Cu|+<;MIRs-{fxa!V@%jwBD$)d;fVhTaOl}C{$3vFQj)64GkT2K2H{{B94 zOHLL0jcQ+Y4!F9w-flCr>+420dy{|i!7ciHV&Wi$(%m1P?d%%GCARR{I_D1_#qV7Y z*@~GZ{O&3(77XBYa;AWV{L@rp4~OF$tj>HP`)ddLMVQg|zpQm${eq5x;n6Rtt+ZbK z(hi?ref(-p&N;aNwv_V-*bSUJ@5zh9C#h8#{W-XT7Q}9_W;}kVg7U3q$q;|l%oi)| zX}8eZssm4UE+Qo3W8DYlz;*-k$ zv!}SfCP^waO90!kJ{BBq*pYvH(cK2<`VvLfaUIv#p3n!N3rt;u({nCDKx|=uP_)f4 z+h{ZhqvvMJ6iamgW1}!|c6!O|nl3v>TU;d7wT^~#4c}Vj`d7v()KZ}q zVas(9(j*-?lck15LG|7|0R5O$9jLOuc^wR$|U;7WGfc zPhPZqF)B28RU^F*=Rs|#hb~}?0##S*Y#a)R`#b4z+$Fs$@VP4%n5Drh7ku#T*d5xH zH7BUI)k*M-k_M!HQNAcA!^4toc^`Ss$h}S+r+d{qAn+pRR#}FB--P-5&!m zl4B@>9*|{;Mx2M_%V?wjsC;4*Wr-SKtV!X)CuIOUK0Y?R$?kvC7pC#~Yd@mqgf2KA zjbC6C!u(S@K-AN(k#jaHHHz^~`|~Ae`Vtf8#Ie~A9k3^ZGi$yiAuz<2hK7OJYtvc1 z=F~gvUY&uY9c>-%JOO9|q0EqUGpuR}&fe}n#IO-K^YS$lV|Sh|%Yz<9Y{^-|qRhgS zKMJrlHF>fpq(gr>&q9Q2-1*JR0AKSTaz6r(#lzp-F(YhOxP}!}t><4ih<_E`NAh z%#cB@M7*~aL9!foL8A4qf^|)*_0}9vLH{~lkoh6=iq@ip$qJH<~qk8vzUL+bR#NrFeD5Lr-2Uvg5xrl z<~YqGiIW$R$;$Ca5FDQ-0gVV8R(}R)M3N-Ix@+EUx>sVndh7*%XZ`@1`6+>B3kXhz z$jS9!*i)P-hOYo#9oa8J2$hFl;)WAGn#g)h`E#Do>cDg+;{tJhhY@{+de0$G?uO7s zxm6AH2#|jzj{%jbvjjq87@TDvwBxEI>QEU36Pz%LXEw<#)#lqT5goN?(sSqXFb*6# z?ll98aJuQ0j)=7^4e;q+Ecb^Ul)&k z$RXun>JG%==92h4IXjwFNHZ*-OpZngV?$p2A0&V3JBET?=x0Ks$G(I%htaDu=W_Vh zZ;p)i=FC>i|zcu)ido zZU)gs^aFeiQ!z7TGPYFCM4@0_7T|J67SIT()03-OhLN42j%=C;&|?A;gN%7%k+bjQ zxrX;^oOT|68&PI^cK~{3tCq0?28ObIb$066t?nzy3=ZaSzeE=QIM|OwPclSMykKR! z-!Zhwhz~H|&wGXr@OvFal7tYX0R3Puwf{A9C}05AC3B#7lMG8%wVtUVADcY@8UOxn zKu9b(n2r~|>y|A;c4Q5ct*y64tA1)F4Qr81+1$f_xy>9l5uDecs^Ip!CMHVUT((s@ zI~90RUH!tE=gV3S>u4~#o!`pnFa})L3#i>DYn>dxkLOr}+@qUrEIq@rqYtr_t%`85 z2?Cz-$DojPYpbbNY9?FItfm+YS)YGsxtwpVha2mjR`Ac0F&*cPS6_u z=Y)0wZg!Ci7<$V328yeJg_xT9^>1d&3Me@^F>h_i(ZK-yY=Y6Z z(F7l0AnhC&l$ugSHhE6!b%F9_V=ez>EkJ;OAWI%s7QnE02zvT@j|sGF(EZVJdxj2( z3(j+-SDz^|gDmuK>k-)$=s<#lt-JD^FHC4uPU+sHCOEt10;bC4Hv~$*2VCRAQsSm< z^q9D+(Re-D7t;@IB$1-T@Rh;j5H#PMMjg3k?c+PNt(__S&B8wfQfgHD`;u0T+{@d4 z-`)Af>}X-(@YPQVcD0kw%oNRCzMNo(CS}am_!gf!znvx+nodY?gzjiu&^o(E0alVj zYt4by0yN_tf~D~iA%~_qc=qi#9^CpIaO*j89GQRzZ~?af$^+Y&18hUM#h_#{X#Y1G zQSC1cZ)%_jh4f!XH8UV#gqT#|=lG0yTDDr9?(`4WLr1 zcGjmnY(lj5TORVqQJh~`{iQ|KGLTDLc-3k-MUzM0*z)g^A9C#2=D;sr5>a0mYDLz} zU;qWh1BE?C#{=E75KGfJ>#QYI6^bYsi%2?5nxLxJeaIo0A;?Uc@&RY$G>bKV?j7(i ztp*kmlg#^41%Rlzlr3O1(4&v9j0v5%mq-U$u~7hKWYNEwadzY3E2pi>M-Ob5^4Z?9 z>{6cY0I~)J&WZ5S@s*LTg_6ye|9Bcc_6EUdfnj&xe_KgUhI{xj{RL~f&hA%sFe$5DE5Ek?}=$u^AkD0_8P-R@Nr$@v`!EhoS}r{l`hwl&1`l4sxBFifU2TXCvDr z(lzI@if`HWw!~AL`Z@1&RZ9zqa^AN|u}cd{5E7Yb4dhLkear*>NUEq*E%jd0qBPCr z!NAraplX&)-kP^xd`qW`_MYuNrOAvz?YaQkCGODEP0J5kUS{V z(i1Qf6>{l`wbs&H(R>FluieX$xc&sd0mkBo?sqN1QM3FGcjW{77pNdoXsxd=P|j8N zHg(~FuRs`c!GW)IXoA;tq&%~v?=HHxwmtKDMv1@?siV?O@e@kd7v<7#;?iY;P$Jy6 z!v5ALQM+CMNW#qy8ZN+pt#`S!nMyk0NF7W$PCEZZ6~oJ%tuTFTMpIQ1eZ$E|--MZm zX*BI!HnAobqHg(~P2c&uyEe8sg&{2lyaONg;()i%j8tD2bKG zl-9+2yectxGlm9!X}PPm;Kz2GEr}^`4JN64V8(Vp4Kre3;Ck7A!4S!(cl5h$EBq>f-52kc1{TMX{*qo`R7p zakDC*@I|(QW?On11EWkWBD_7Kfr@D&{HF6cm{q}d#1h&p#NJMk%V7S5hPd?uaeku^ zc9TR6n%B~Q8rOA=S~d1nK;lK2rd8J~z5Zru9?wDA$|I6yE%H6Le&$|@kw+?}{k1?x zKv2ya2;|N_nr>YdgObCsRE**k=j083`E2_<9GaaXo?{3yQ$wqj4=tZ4`CyBDLADQ9=90*@6agkk1S|m7nx^Ogub{(t z`HNbRU!Z8=x|5og&JmPBmc8+AKjQGP{!X?`Gvj|h!0$MT94w04E2bHeP9)aZtRRCn zy*KGND|1VaKa~_|P5o65n@x(`!Ri@_l6mTuPdymTOk_%?>`uHG1w4$IrtxSti3i3H zITQEzb18m zo7P#Mln)6zb!`U9SL=BOb1r8j5F>gRMj=`iYnGgd*+wxT>su=!r)NjZiO)EnqRV3% zYiEWabDcR2I5+5=Nez-Ee*?AqEsck;9RO+W5l( zYlTAt)x!4u_@Wku&kTU2Ggyo`4z)Lb_4paQ6Hi9nH_>=2fe4vpkS~K(NIYB#Fy*Ly{SWNX?0V@4N(U-_e1I|%r=%9*Sq@U`^B<0%jedh6%?dXDR$8ET z{EBUtp5LOD^^Z&Yg!Xn!yN%OOuMJg)g7IyVz$+u$1G3ioe+osGD; zlR?#edhSaJCw%;w9@uOnT;fdKH5msxuCC7X!wdr;hJ%a#%+n+~#?wmI?GR5m;lcAh z6`oe%XN>6Eln?|KT3qL(jSL7qIkuCLLgQcSV0Op<4lvySl8>Fj;7AWet3!rZF)7rF z(-ZW8ofK8PeQ{6Rl;RDtyd~cUE#SESDB>p=|)A%^i?#bX?CGf;~AZvkJ5t; z3usm${FQ8-r{IjUH6TC&`Y6MGcSL9C5T}7fW8$C++gdg*;W&~;aMZhKa>ZQI*TI^L z!6iz7Nf$Il+WnVq1dt+sKHK2Ij>_=7!oA!##t#OQdVMfi1;FkQb>pU1KZna<^_{huyb*P$1w~Yi!bZLJydtX!LC*b*es8wZ;m`MSw$tHC@CG4M#JY1wy*CIS zxd%D58k?##f7LE!Ql-vhl?5D}@4V@))a<H9*YhNBD5~D51ASrGtyzHA_g?gVbw|Mj_4IuhP?o$MdMph4PRk$AH zDXnEfvv;h2*(n6IRa2F$E0lcAHkx72RVLw5gR^nhIw?P(M9vYMJ24#?C)L!`m{Q8f zbR~r_%Pe(Ll7a8f-0Gsr){U&4$CRqKzd2>SK0{~9QP+C@#a`rwZks0 z3mx09dYnOS8sqZ zR9y7>bK+cfbSLsn(`I~{0~CbqNCLnR1~8E}-BPTA;h%Revz!%M8Vz@?U6Yy^%1ysK zH5oLjTXY$MmCYH@gy~gt()twb-#1%%hyN{qPJO)9q4JHo?+*16!09kpb}hFbVb*Af zB+lbYjCug0aUqJ*#m7U))sugPn7pvu>&B#?y$k$(b2XPXeH+}`VH<0Nn2`^Sk&7^H zbsi@zbrDB_HqY)UOddqSWMOHQ>fj$xGJ0v>7dGlYY&HGW$T~lWdiy&V1{iCr6ZCn1 zh00Q`-B5U#*DJKc3XQQ&O9H6^P1p_-pwMpQ1?ns#H-r3v#oN12EEaFLLY@ykUWpwk zFD6zIJSxK?c+8YlawpyMQ!?!m{+fA{n=qH@d`FsaRqpCGYtAk$eh2erZ9pg!UfT$d z_hME6qFqTS#szBQRQ^-{a2y^RS+VaV#!2t$1Tlj?1I3{D~duHYbb=5Rt!d|NoY=^)m~rg zRBCFfa^XRQ;XtB2PvClC4vLCTqpnC%Zh7QO+P@LAO?aH;>9eQe2II#vWpFfq6Bq!# zw!3ef*5j}8$MOK~OzaggNU#RK?M5q$vX6d#;*Q%C{kP_fUxQE}EqC0jFnnq9;Dcyj zs6)_mU7lwlkIug_(*fpD=%y$%#>3YJN~D^bJJ^WVI}f!Zc2wTUuD!UFDUYdm93u0b z!)(AXJg0TxT9 zGXT41uxcsQv|*D_ye4R&Aivq7HG%9PExQaLFGd!<`Tq8ipLe-Tj+O(G@>zu5zG5MlQO1JE7% zG}mD;FE7yoNMn1UL+aXanSE4!`SwBgH&9SLw1#=F#N6X{~9 zE)*DDldB+7NHRgLAfKTpL_YI9>epp37-a`GF5Bt>1^2=m*`H_@G=wkqV4j>m7zBu5 zhO6$h+D?HfD&ysXBQ|Um-$Kxr1yOuiBoxfx*fEetU`B(d9v$KBlF(VmZZxJ5F3}}K zn;1xKmUU!7&lY-rNP}(i3y`AgW@~fvRoLOpO>w;F)0VYeGRY}UTnJvkwBvtn_Hq!r z0aBdJ^RQ)&kLKO)PlH5jOti%=0ejm-Jjkx}C+dlL+wa?){d)Zq!{vH7yWrPu)6mtM z!nmCwj60mO{^WQqylfT|0WZ}Qbt6Y0OS}V|@9YDdb4&++Z3G>h4+A7FV@PUv;59q> zjE_=&e#COKbaTQ24Rguyo(a6X6ul5L#sw&Y`>*H%K2C$IcbPB&5e~mpu!Af5{un%E zDVnk(DER4Gas;`rNZxk1w9ofiO{#_IC-q0UX@zR-C@8)y@5RXl9ey)moJwRPpD1aa z()*@`MGSd=j6_SczCz1=OZ-$=ACOfEL;Io<;>NHFJaWgpF+<-tUk15N7LLM)DKm{T zLSMoeqbGh|u}sMPow&)-IP4O^_aCu~wF3PXQtTf&Zt0q97YV?=l{2du6rZmjK zH9sC3kVh$m<39NJfE9U!dN6Ujl$SN$tx0Zsb#)%ERH1v|EXm20lke=0*#Zgvg!|{J z+d%n?NVh!CjejrX{<99@Bb6pukuOT#oZIw&@!9Y9-r;NUy32#%(Oh-o=gW&b+tBBhx_g1$*_VeJIP$}(|!48~k+Wu`**=zSJb-I!95|&N zlAcuPv|Ub2nh%ey*iM*K{=(Q=+E-!@W>Dn?hGc|ESC8Zm@za9$dKMXdh*xY34pKm% zArRXbV}Lr*W0jy;2oL_{B`>?7H?$dln&Q|f!f?Z!FgaYeD3+>L)xv3rB{$^&D@|7w z%#l-X4PRH*ps3Zt!p6g8xD8!2)RCXp=ilnI7Z=R~$?~?$?jb+bM4+Xl3V>GU42RP) zc}&5XWoQe3-kuLN0pr3{6d;xQWua|(-mfixkUw?a zS)7EHOYDr0ujnTYPrzyn5*>}lO5xzCswY_5yzHJ09@d~;*Q=D;d$oO8Xcmc2B=(1q3I#_F`*kP=L1 z^F5R-$XAJpPkmsQPKXW=@pFF&IPX(8Vv_<5oGUidij_e{l@iX_@0M4k9x!$m9qm+7 zrycxw$RB&|$1U!l#Q6(2CN--0KjyO@?fC*5E}}(H;meF-=biV4r4%H8o&grL16e7X zpibZ7gJrDVjX;G>!ay|gg$N+rUSu`x231{GJE9)>WMJA~`0XS5^)Zdg!TC9TTLoFS zYg)Npv}@bvWN(IzTUX=m1&v$3UE|OyilzHTu0)M&&+9}YF zqO($RB`EZL7W!D=nwq13k~KaxWk&W*TC_SswaVxu+xo$5Q$kIMz0pQ*{1YR+)fKs+ zX+%VlZ?|-CbGLH#bk30bG~LDTSWE2X+BtV)Td;hZD*9e@o_d_S!u)| z=F>qr80RqXhbVI>Qf>#leDsr!nmGNnVNZtt-S}*+{r1MgH9LD?+T)oQfF%|XO3)r% zo^C}dVcLQsOQbD-(W>md2a0~g=NC>e;I2>2@A>xSe6^+wS;p-Jmj#cxFtmVgt(L@9 zU8xa%@RZ4s2=f(RMC?M1qXi>e#aE0S#1S@pX{vdei zpJB=b&u+ft+2`F!bCeZZi>eh**02xb8A}}xF|??^AM7Xjk{y68MD|V_D0^jce^p=r z>qAT)`NeTKmQg-JRYdxK;X$B4`Jbn*UgE-^(uOaWj^CUli4HN;MQ7BrXYhlK=#v*( zRDeI4v0Ivdq(o5|8f*paR~DC-kuaxqHsUF?y!ZPV2wUU}uf~<&^4&8U#9opxwoxk{3OdtRG>?^0F=`2hQ0A!KH6IWV+3^Bp$f%n5s(RlKI7bt{YNHzaTM&G2hM z-U=iwMG({eF_~(m+Ixv^)Cm8LyQ4XrlC$?Zev6t#9|eYjI>;@t>PJ>FIW296jNyy> zHDt1?H18h3ml3oFizTGrtfF)&Y=m-&F<$As2==&G=(ZvvnhRYN>AW#S>AeOJB~FNL z7%a$ts$l~#zSbR%tVR5IJcfV#$GiGm;1EG9`)MwHtj&d2R(9AT_eV<^|BxHTNNaP4 zp!MY5iXkOm7tjkz8r}}Dn&HZsR;1Q#B}>}!GlSZhvWQ#fpfV9CRexee6+NW~1dCMN zX+@;3SG_0ZRq5JmZjw_N@3nHa9pJ-oaof0m8)0gB?V8zP7f|X^j%N1r;wW~@c1ZNcu4tOj%G%2d%`}dIQ%%dv2pO;+pim%lUvA^iu5arBoEU$13B%+= zs7vi^L=;0f?MNECpFNS~Fc~<)^7w_$>0$Z}!&9ox0YRgapx*;z7UYF_(@dkRQm-g~ zdz_o7&;e+Jw2X!6+j^uA53OF9HOkx}XkbFC(Q8p0Qp*0Fj1#LH&1Ju1^^T2ykkG3y z{qZRW%8C+zvuFp7X+(7%&WCoW)Cv4|aVabkFVav`ryKuaon9`esI?YT^+M^rP+-o} z?;^1cA4&_H7~{)I%o6(Xrz#Yt{T06UyEMfdo{Pxer&fNY*6;k=Y%gu5!LKT+a}wPCvYdb zJ=_W`Gig4OHsD3Y*kXTxmJKCKqy@78_6dnhhGNkT3SPLVlfHY=)5_dny$+m~FNiSc zjFPN?dUc&5GV<07ooUz;(@3ERS<{<h8u{tR?>cezstH#m~KGz0(w^zf{nq9JGozu*$;ggv%-QFSFrTDtzR5xk&!Nj0_&s{9EwOYFo#DMUzUY8&D23r8jG}$)ua@yLOps)5?Ej_ zL)%_URC}M$dg(-z@erne)OLzlevSLYoK7YfR(YeMI07SY$8i-kqYY4=dy5 zL1pN)*5IOz(6qF66?~4|I;F0f9pSMm4g}1*om*S89tdTi#F+HmkW;S0ip-uEGO<*? zP#7;=P~)$4XE+|_ZZJx*&2N)%>#^2UN~A@v()e#X4EJoMp;ZNw=)eaX^nqIc%hMs%{GS~nHYg{iXJSvWm)=$LNgp(}C)=XS1dJc^+ zALn9`N`kAlxvOk{jJZOg~>AoIb#7V15TOO76tOIvk<=i zrZA*t9`k%u2&s2M>$zpQx)n2pmGFV}g`B>pL2;bS*Q-~8<@L^`dJ}ab3e^vOcd1(27YK|{%d)eCT;!nD7Sro;o+&?I!|u|dpZqAehgLm zN;|yEgquZs;1TRa8O4AVZ+7sztS+&LZsMPDx~s?7QyjW*78h|rmrw@;ImH@hJ5k}t z6DOvmd=?nTI`NC=HCjU7cfHd09m-eYz!->9)Oy3i56R-nG`5$VWl31h%>rc&TIMAr`9hk0hJ(8 zGZUOqYO?c3js+nf1HAw>MS1R3XFX>mHhQP@)0{7*pl-C-Onb}(k%<==H57}6IsGbe z?wE3q*^_HKFdOVWkpAxuO%LY~Dyp7wylXM1y$NY`_Y`bC88V^iV&J40_shk9)a@^IKMhY}xfbH+g*EgiyyiEAe&s3o;=yIZC!^QeB1AD|Z9 zl7e19%_tVg4^j9G=o^&NykQiDlXA0AQc@7&U3qc)tS#Wt`uA7`3-&B8O!e#@1E~Up;?=U}c zh#$F&R1ha=j3=IUp7_ILze#1>X&g!#Fr0w$idhB-bWQJ=EXdTWQN4WPYdlr?O3hAb zO@>8Rjr7X`m_dy8dyIy&jlUNEWA_eib?^rShZi8=21g^Us12gOMCQ=C4PEQ^%!7b` zr0vcMCmh&a{g5cc9i$ajWQ$qx?bvS?(9IGbb@)iGVhr9GlU2&3yTj3;7)Iw~6@cF7 zhsy_w%)v{#Ndng@tB8@F7SyA9C2zcls`pZcEe#C>UGtIan$al)N>(c~tP{9z4CfbF z6hs_9%7O+G^zzK!%Dyaw3tmZPqtLy7(ojsjpXwZ8|Z)l55Kap}en9C&`y2>jQhP#62sJQG+bN9#4A}D-m3O;IZ;4 zdGLP2Mj(Cz|A{UxLYf|bUw`cH9KIC^0Agbu(zMA>0Bcxx4S!)IgbenVi@B@?*R44E zGB9;>`!1O^SnD(N`04yNHHv5UAb@iZn;?`bB^lvnXTV-)uLejD7F^CQ8st*7)FOYGR+kyM5F&WoE%e7jKK3^Y}qq?{dvaGd^D^JRrco%8j5!q6b69 zxkx1{Ji9x$DEgqR<1Ao*pUv=^8~A>UUqyfwjIWQ{(T}hH#zQkUral^ikx0AWl zAXw@Th}?yETF9AGfD7~s0YD#%i>LSA2u3p8-EVfm^&*!lptmVLErv(iSzB|gIbtz4 z02*i#_OFP^TGl(5ncHgCziF62-tdq!Th#c^tX6wF+61GG+~j*ALX z0bJpH)KFWjgM}M?3G!Qhjxszx_2H?pBC+MAf49CBl^N=O<&1C>_1Y3~T%I&5?X$LwvPL)eL zxZC5T@9&!j@_ENcOdy4>cK7hURCS0zSQ2 zu&2#WI8CtL1T)(V@gRvsbdt5#{~~8bXsFq$npcCtt3jce+G^6euZt=vh&gy-C>^5@=Alo{~7_b&hL%-XODO}b!A%aC$?-Bi zNT%4QV0`F{YjkK-TakWET5iqGcQJB#BUN`D0=(oKij`Oihut~&i{!9kUZp#WolAn$ zZr;J{q$<%L^i4h356QQkS=@|*;|$yW`(50Sf>bbn-$9P8T^M3E?H+Xdi2N08sLuDO zB2b;_W$g-vT*dM^RKr^fsm&&yrl#IrI8E_*jZe$qh?yw!qE2(EgxYnapTyJ;B^i^` zPI1^t4hG4Q;11D$#ol_|uv_ok4Lb2<9O{MSK+{(Atp7#N!?4$xMP1Ert;f95n$ zmX;iU2mB%X?v(T$yt+xeyvI~n^ci5 zE`u6rOZVTu|6r(N-n>RVo6nMxovxZ)`qg#w1e723;SVYqi5u+vAj}7da=%@A*%CIEnd+`YT5WTqP3odFKx&Ql@zc3q4zAq zmn<*jF_A4%lk~E)=MeB3EFZ#n2nRTSvh##QOHno-Y>vSW{5O<$X-O{sBI!?1!mAxSB8UnUCL|EszdrD^qk^;sVlev z-z}R@9Yu%ZBXSOVFLJ$lXtWXOx~k60%brSgD^in>AakltqjF5pW<0zTI+3b>x%Ho* z6WPqLj&tVZ@wsAX^irH;#yk)!7Vrse1x&7|p&o|};V3j1z{*ZfeeLw2W zut~1NCs9G#Bv-YeyPbgFlbwLljwigNw|&ngOnDR(r>JYu)v7%N@{b^Yb>!W}aX$*t zx>3%(SL{k3Y_JPfIINhyrxl~VfdE#^y86}z39e(2K%+8u^=4kXf7fr|e*ez?+1=Xa zp>>g0oL7v%u?D%uA6iMBGm+-p_V^^vH|3#X=8`PKx6*`>{ozW+3EQGfwzqXQmxmwm4 zxdL~%Q#e+Hjc%ezOL1W|pcAQBD)jDfVt>PqTimas*`**UH|!;nZX?RO=G=lzp}C?( zV_bTxVorYw-ph6uo;C6UMJUum-)dj3V6dp053a8%vSM-Jny?9f9^AAGMWHXAYQk!S z6+Z{IVVe@GOuO5Wi!uc+>0yKKSw3fZij33tdnc%ZL5B@;6x&g;mY(|Kd?sH^{&r}z z7tmA8-b|XEkorLr6zydzgByiH*s!f$x5yHr3Z*_%^?w$;Q&gHl=Oc*SFKn$sy_85K zbLawTlxAlO8?q^XyZUJ7i@n`1AMSk3`<7Z5q#3BxO&wz1TW{(Rvu&;x9c)OCF%rJ2 zJ;+FN`dNNaUg7~?LwDmoXmO5XX*XDAS3(5IQtB32^7!r5>M?>75l6Y&!w>f?$|QWw z@HrkFceiMV0R8!eR>EJ|Z+Z5oP9HonEMpY^vK-E_Uw%S=gS4YVD%lSDd~x=nK_yF! z>Aa6*&S_$aM(z9T&a+^)07x9T+Ui&E+WrK*mKhRMdbPewc;i}TsgIdG(G&vDWd0HP zgPX%huP3bvQ?hI)sG8!d@xYG>c32LLAx5@@Ifq_()6InXws4Hy+xi20oAa9kB$Edk zU4c#*Z6#QL`Tp_b$mjLzYAye2bqWJ3e8;_nU*y^l$=Mof>qX~mNkujEFQ@cLAJ76s zyAm0dKc~=SYkuMkC(k7-0V%4IX3VYgg0)l+9J-P07FFC`C2|vIS~@`O*nj7Q@2$Cl(WWTSqYlc;>TlL<$3P?oMiW z&(3yBWyo;(;lwIETz~TE))QiMmD(hg+2JKtP!Ex@(=b?*JfyGLX&|~yP4!3+Cg-hY zdyKGuD^MfV@dBHCz`iPOM7$b(=7)3?VOS$Hv@xc8D}{P5%@)O_yQs=j^Su6Uk197B z^2rtEn{X_sb`4Zcmu=1a>o$V?eny2};pOhGjqYVwt(!Y0WXBILgoWIh@XO8j8p1E% zdB@1_B@|7AV@T0UuP&ZQ`8%~$M>_R%08cxA^%N4!j(J)T;}Azv%!&@=+CN%pr`oO2 z@9%KusVL9-OV=i6HZA9}reYHyOE_J{#b#(?5x^!VO`$XL+lLtve@~lCk#@ zs_RuS8T*y>L~B@iQ-_!)~-1>p(h1MP*r` zv=c=ZO?y#x_gGuG?8L-d@UZMd^K~UUsT~UjzL-v`jjan`LWE2ZIf}0c@iadNqx*T! z=~%dEl!SPNO;d)8Xa=$uzTzF z#7ovq5<<)Bc-$+eup{;q%IoGkmUf{|dqiE`!Merq6L-bUy^u*z175YP;yzS==rl2- ztJSJsEq1<_g$LE(oo>`kmMZjD%|xEV!CEG&|Cn_|1o9xT#u9S9Cc1A~paOeDW!>my z#O6bBW{YUm27ySZEAiqmbzl@5FObl2KGq7RR9fv%vU zVI{F;u^CznYQ|M3CGhhXa7_B-DHsn+;CRa-;XGsdcS2zJOk9_y7W2gy0ehSo9n`?5 z20O2?543-!eIOb0tX^)3e983cB8z1X${}xp_f2+*;;>sRQm11H9l|s z_t>f$&6+iQ)dH^fXP4D~`m?*HJG+=Rynng8@>AlXVU`Kb!FdFja=262;^LW|eQ9sa4)nUrhdekF2I7(PNx%P`ufz&#W&be5AW+H?`l^^uu6wiT*WLNR zZbD*|k`I;7KQON=a^u`9FH9o$Gb0LCnt)B;y#Lc?^*`T#ApA4;1kr?=n>7$mY}!A! zXX)rN>7#c0{kh#IbAW2?&fD*|=Zpcw0E?rm;fu9mD81#vpGHr{fOYMD9PNGZeM)!` z_;w>0X}MQ--YsAKzPQ5hq2Pa&dXndTTDs(1Cy?W*qQDixKp8t~2gbWgw`U@c^O zNhvi5EaRbnvXopi18zZm?y)O6owqxz&nFj0*=zS#-owP(7(e6n;448z=XyuaUAaEI znM%9e>~=(@(t;l zGwe#=fnaS?$9f?}DKmHx$O64#8y33b5(i+o2iRX4hJk328(QvKB(&8}} z8QH0SmYvrFIeF&doZn#a?q)u^Wj+M%M*spU>1;qZ`Q9!3+&Y$s!l1&ZT(6Y0Dk)}q zk`3{4+{Dx>NrpbUmhi2(3j!g)VF>{o0M1)w+qbv3Hq`E~CwL4}>j2ydJD0S7>}=Pw&CCNQ^c0~56Ux^)FQar}rRs7n ztp;W{k=pBR@X?E5S44I2ti?ZLh6rcm-v4B0PNdw`LL2gaH!*pOyuoSKKj z&B5{LB#-*&6#^2lO5@9D5w3g4AMPNn0*ev^%`2CnL17kbPLAy7zr)8{viC^ihIYoJ(s1zz@$KGx!`#M*VK<{+)BnXu*f-AX|f2Z{xUj3vD2h;Ay@3-5DaiU zDD&?cC=#4Rz5+5mJ35)qUDX8s!wg@-E1*w}F9xUy5R!KxnLQ_VMlvl23#HV82Mm+V zjBV*bzqjhArQYWPf=8fEPph(J|;3XY<>-g{WtLI$MzZou>fAYf|C1w8n)K*>^! zjIU(yLOoE}ezWaEO6Dw<_25va?^_~+kL4yZ-~B;ZT;-;zrK14!m?Se}7Z8WK2au!g zJp62L>*?0UH(#5S?a|o!i`|p4!&e`*-|1Ld4uc`#fXOlD7kM$%jzm(=Iev71uQ_0z zIaUkvI4;6o>b9H)Fr7L36ICae?7FCmmTrisl>0!4C1@M>+xmv5sH3_u!pL&_!95m_ zxdkc@Itn==LB_a0*ppS1As^Ljk&latDnyMmE?g$s)*dEk<~FVHHNIQqJyREkLLPr- zC^@t_#B8L%A21<@8!lNXhI1%?fBD>C+~C-J9oiDOAj^l{<3N||b_TRz#RSX2m#;f9 zaVbQ~St(jbNoMbTRB*kC z-TxXp^Xni?wwuKlVC!m1TE@=vO19vr9>ob_WRX~!34dODmi6oS&B;%Hyl!Ay`2j=e z&=+^oSgmY@>GtB~#ZjT%@4OWxAlQ7}xc40x=6jEF2vSz7im#EI&kTdz ziNtBXWII;El>GfPPS8n877^YD!@z>8<>F_(84&`sC5!KJ>21l&GQ6tHP`V#=eMKR_ zqB{3AXFReLuLgS@PAz_ar=(6)N7E>H<&_LTKZ}3BQ)a<0X?KwxmsGCb6T$| z$~#DXeLzXqhLBrC4H+eFH-zeL-XA6_1h^>fwP4R>Vm zjSr}Z4z`};DI|?_G=}JtB8~xo?IvVl=ZeH%L1&;!IpV>I_ERB$#vaen?u6Vs@#a*y zR#LRKEyF4}Si%02He1yqMOqCrb49CxkQIe$WJ@Nxh1BuE1}a3CY2481Js32I3vNE+ z3lpn;-tvNr^>_2Ym%wm(^+qlSowg&YJ9GGc&O96zW$k@=e&*%Y!l%i_K@P}Komysb zd#Sk0=&2f1f8D8nNw=L+c zyNO#LkcJ4Mmx3dJbDXC~BN%wf$FL-lV;&q7KBiw;oEb@fde=k=>|DE79!WX(LQlwZ z6FecWie=?O2)d_>48LuXGLN<%J%%<8T(dpiSpRzG@fTT`6%&+hOq?_a>)p+c>W|4u zAo_(7iU;jsTv=8|%(bSgnoq2%5QLe>;Jr^Y2F5ilIk&4JKXfkThx#7rG}OQa)*K|E z-eS!ajD0(Q8zPcdKp&5-5%A+eIEcvMV*$eGEL_DNaEd*F#+tt;=t5cKVtQoO@mDEG zKyW;_yj6{uYO{!dKs*;o8~S(%PHT?QiY|d!!c%(uQc*3?0i%L|d&+oASBrC|-Z%L| zXbTp26)zP8_@YZr1iU8qrq)d7cq90LAQnev4SgZd>XHjn7&-~Y-FE~`#B!bILZB={AtsuYG1B@{TW=z4iBCko_1>PV79^w zo6NsCA33`nViYl4KH0r(Ci`eoGT^Bw)muP`PJw!R<#3hWrU>;^i9AKQn7ie2NKc%H zA(y&;TfxN8aS@j3ks((;=1s%rvj?5KIiGEB4U-8o;~C8%x}y})Eulf(Yziz7v}sU` z;ER5~{hjlqvoG?->c<~EIwX;T7oUzOYy55Ya z;2(*k^6_C*7;C?hT-OSxiH)J1>+pSgPQN~X?4?_ecjM%LOngzsCh`g_SG~c04p!l+ zOS@W4jHKnt#=je#qagpLn)_j?1074ooy)WF0fk=rDKxwC{3-ZW5B2cESIavSmjK~aOjDDj zshmk&Urc@FlfkbbU7S2ZQvb%_p}p{lZW)|C!^2FazS?YD(wytl1vwWyq>eW8Oqf8j zBi;T)hpoJ+^IY{fH_K`6<_C!DpXI`Tqg;5Bt3Sv!RLkkdIL*ZuhYB*|_^-b^yo=cw ziY9P|dHSu0m=-%XAcS3ZA==3G^XAsWoycLFC0mKM+bO^Pxcl7>u0FT^}3foQ4JtVg$To-)L7G_6E{gLZyEo%EY3ZvD}pC+`Zf=@2uu*3JdsNB zyip!(LPzHm^eV)m8d`k!8(MsyYz>=I8bHy_91GsNXVj-~;`%*4WXSYAL#E_MQp;K) zO%XTaOx<`wTNAqMgP}Mq-tvZjU_b{!;*ZLH@vLu%5A)%N8+T;wZvAE!BoH7B(QKp$ z0gh_CB2DvI&H)|{mCZ%E({aF8G1Qc1Z_3iUfw3%Xfj^-`9R|zAaS|;Iq;8tz#)$y& z88DUc25Sk8Ek+_Av8V}|w9)UPX-xr0Kn&~XN?t9W(jF8Z8o@GS?|J-xf(G!zo4|$U zv@4@==thS2PV%EY>y*8NV;tOnT7pjAo;~ANW1oA}8$V&Q*aINmd*%)SKSob!m#w*J zbz8K%S#Z6%eJ8jQO>8*Q{`JuD>_(Vwb|Zw`z+hCnmAH1|JT!oX$GnE4l-Hmd4*hk5 zoQcP?ap5stQ7ZAH{HPCq`B4zw1J9QXsn~w+_GIEx(lR6v3lWcI=R~bOAGZfafPET= z^PvNr$gV0nJcc@kcEIMUk)=tP(n0bDM((9K){{k8;SgTQAawk}rdMpr9n@mGqZ1dI zQNUI<$CS+uVykqFriwV}48pQ9-4e@kV?^zX$}ux9OfWl>4AQlKtRs(1^>ur>;M010 zyRk#h*1e_Gb)<(b4fhcBiGLbM%{6WRm%EKK-%t6NPVzFYTXNPD_>Y z`Oa2PI3K0s6{$b!La!)@>UcH@ps{#f+ADV);3!~F%@@5|JX_GV0a2WiESVp5{ysIdR)5RZ5Xu6LMH~^49Z@-eN;usxdr~l&mxY+^?pjvTb z`iFv~nlu5MT9@&4UmzuFrWr}vbT1p7M8c0%@1@LSg1?<7*f1(GV_R77jhg&WF zZo;rZ9{a+u==b@a{$-a3B3Vdu%~Ej8Qx{6QPG$uJDgV&x#2>i3z@mB^faG6Kt7q6!DWrC&poAUf(B{gA_fWJ`ECkv`73SC26yXn-+N+*)h3_~G=YELd`S zwv3;%&w%MH$teV8e=3W@%q(4+3E0Mi!P$vNjPHkPJePmW;k!vqidz&%tw5HMtpy~? zb$<}Y{t*xCF%Ro`u>g=?_qJ9lmQE^$BV77n%QFE!9ZE+SZ#>* zhKh@cLy6xT^|Ao9tEs;2M_OnEwJpt>DT?BSFcgJs8I9Ghc{w9UJ3;xn4 z%3&l#ZV62WH0XZ4lU!jz)-ZRD#}!_M(wM=GaRS@%;cmm7dEpBirP2@JjT8xYJi?kB z-bPD|A&e2;H+}fL`-f_SqCUnOf1fQz-ST?6++4-;e^s%&QHP!aFbX=;UP9@JP`es7 zRrEmt>U@TNZFv4wxxSo#5Ftfth@ljdE~?%6ka1tUeoRh43yzeM7QJ3YaCwIgg_QZMmw4Q3wE3G)V3@k+P#ruwJDCrGYa)d z9w+OGe{Nr~$A9_rji%NwsBak^qTpzg)VoU_z>f#{1kt2SyqG$N<-~-SWY9<3;_LbK zVn**7IKO+mok9wh>p|C%D;rnWov2Cj!yf#kQ~$?2c18?v`F#P73+OzIuV(lGj?BM& zyk1OimREzx@z10ApE1$iqax>yH7cqyEuyvkf80^gc-kCgx&4HE(^)hJvfp!X4gGz> z^XQH+;61siCyViNS!d`}eVov2@CtXNHB`|femzyEK|R_T{Tp0n359w3_wR9J=z8=$O+X?aP@e+S5w z0yz=rSYX*gMxdZZrEP?)KsG>`OC=)2eGTKxTD+MbV zb8S2?m}jggB321jG3FzwMl)t~z~HZl8Nm!=7IgWz4#|#!R?t6E?_IZz7>ELBoxgCI za^8=mGUELIFC`M^&PsNQB(4nOe+=(n$)&JdsE{B?CddUZ%eTf*V^fp47O)s=T1!|S z6REX=)mZSgR${wW+$iiRyqXJ-36GVp2~3VD^P0kR%wo-8HddE8%#RuQTEcQnE^Ani zxxtjil*Xdg1SVtIYYNk`zRX~D%sJNr7Gvsb3Cl5;wSv`H_*%nytms-yf1_*T;bLtr zHZ<1^W@9dE0gJJywS?udU@+{H{qp`x(X3}$0)YYy|VptXPn zOx6;XFkUNI!F;V@Jyr!P8Y>!WUt<{GO^EgXpT`g?2$czS`Ld`$9SpkR_bo6K7)Cd& zX{>21d5vK_R+kA(#`-da=`p6u3}$0oYYy`<)3t!bSk$MdwG*Lve?o))4C7;NYld+)JcyYN~|SRPB^-+#VhPHtZ*`13o>Ec-DYF@jZ-S+#P78O+AI zYK>uhHzU!9Ex|+&dxF`XHw97x9fD2@JFhWpI+yb@1tov{Zcc1#0gGcCw3e_urgT}s zYOMLwH+D5b`-J`?y$*6Hhd~&CUI`mQ$o(%i(tuGHe>Jmy!b)qDs>kEszAo|f{+~^h zoi)fX#J6FwLD3lIMApK|EVaED>jUMQeqp)M6r0m~L-93Ak7@ms^nPmh1> zq2~!-h{5gT_2$>)KA%mAA91B?+ZmEiuhOPxvSc7q@yQk3*S;MQ)B&@C<M)9N54%I3(EYK*z#GWQ+_*Yo0-}llqI@?ELtMELm!tIgwvuv9fn0le z7Riw&ER}hn%*K_7%9YAO1O3X0Hm22O$DD*$%0pH*yU|G-s ztsI1*vzHxWW-JBIZG$Q{UAx3^Op-$ZM@Nl%-EWV!aOmW{Lm`_f@l?b6L5th1gsA|Q z`9>8#!VuXwRg$6uidSoz@LdRN`|_GN_)qZ9ZP(Y#bRmLo@k1u#u&%R1UqUzA^MZ`v>r{wwT5MUi03dqOmA+JI=) zTBxAg+K-hIZINhF1?bAZpD*^~1YcnEON(MZKKt(coD=yaS;!Z<$cmS|Dhrwvd!+kV z5ukRfA4{X>rJ5edQDdO2mQsIhYlP%RsbBT-GcIDpocv}TO* zqU=T!ke_1Dhi)aRknEisk|D{7jV`mC-QTP4eyTF@x5L=&kc)C^5}e)N&E`{Z0qXvx zJ|Ur(W(83xZ)~8d;6d4wQiw0e^a8XIonIPpU2e8GH<+eG^O8bXATWQNkMwn>2is9> z(C>v^V=gxX6%IIN42;b&eNB6Iqa)i_YBxAuQUcxpKrT7v{OO>b5j2L#Kx9H~lUu0B zlStG{QS)M4DBeA*7+M*UW-qz0CNIl_A356UTWX1pS+OXS!+gL{h57X=`7xi6^!h82 zgwQPIIBjW&!)e1(f4P6;=Cb%L9Jp3&V+Cz1Fw`|s_z912t=NcetG!s9_P7)rGI1B%yROM$t6gzZ7I(YsSC-!W*(FuJdffJPe$UK5qh3pE*`%b)3wsdvn*4!g zJEL9{-etXbrJ!g#U_uDiEu)E$7K()SIemH_V2lrr4_IJNziZGnB!_O$LsL^_)g;zg>0HMSAvz{|(86xhyz$3k zPK>%p5)O>aZZ>~~IO6pSnnX)rU{!&mF=&#`RKgN}s`9(2mTsUGhdg zD0t*;ICmy-;8;GJfeP?{ZwEu$2fBH@Akk;s@g>u#0Hc4!KJ4RS@UxtK`F@0;{JcK=`r+FvR{1a)xi8QSf^gkp-@mr>8TB;QE%HGH6)$$WDJ6IB`XBj99ND;!vhuV#X zz4~3iB4mFE<%5Ccb%K^*)UAFr8VzmU`nN9pJF62+{6?k|6OL-G{`a4rMrk_Q@B4>5 zhs!PJ30(#jSwuz##^pBHW8nRMR7)|yxZDQAiQu(zu%eSs_)!Qy3SnP?Jpe}l2P`IF z*Z1s|78$cX5$aK!Wjy0yStH9F7tsO@3@6q(k#&E}Q8xNIT6Q@**hiMaO8Z7s9KV*+ z!-at^ij-~kmw)763y%^p5dJHTG0H_bVS!!n8AN0K_R{_7jlnwI-R!j&9t*^m-`g!UO8ko>4nUx@Ys#C$6)VFZa8DDdg#WfHk+30 z#SwqpsAK@7d5j`$lTm7`uOSsbpP?O6&b_8gjkSBP z4Muo$*-}la)7^d8x9Lnh8ZsST7N)#*hfQu2vB2dA{)yN=?;V-hoOPq#vT zIHE}8!q`7)v-P1J-3y@csS=K)4V6s;I=IlLG+`7u7ic3i_Z#O;!i06R8T0bX&8KqQ z&f%@zU=$qrLXV^cb_C0@^hCfV^Csbd3K}hXQlNGWTdj^}m%u->ZXDR|7OP(zzkq*j z8A%gBf)}F~Gx}|Wzx7|ho4%7^*)gkLJc!6|edDwRoA~b;W;?>F6Bdf=D~dc-#!b}F zwULu9BdK(eK*0Cq%7ttuENLBczBNeR?d`2EBM1R34fu8Hk(x1{m@(6Uyq9jM6S#lY zTwlHmfOeDe+eS34hJ^xdCB3KSY(anLycCM|V}y}BIC}En!hmk%g!=^uN0)zbJ&7^6 zt>4gVo%}HI(dm4uCyGm<$mFDX(0y@VMVGZST%q1DZQo; z7trBVi8m-Ze(`zR7S8lXOl~li)mYCST%L?^)&M2wry1|>Pka`e%%Z{LTQOp{1SOv* ze2ZweJ!tzYoZI3T5u^&66U%d1;{a93d18R4-ls=1v_Gy_d z^ywVrSI|2P%%D7TM}yTOuh=pTtw#sPYJ8~=y6Do)32$*||1iD~{M$Zs9r(dn8Ik3j zS2o84etb5m=42BSaD8Q-_IqMBC=wg6HiC8UT}$s~m>$nv3R0ZS5uB)wRRgFLF3s#IY`k$Lu1)abTYyVgQ!fWW+QC&{8%86B z0>iXgiM6sdduA(!v-^KmOEUxI>62(XFZC&O3*`LcX_a13PDsy=e6wzvT1m8}$Di8D z9XpjfJeh0v0qQeffGfe%m*B?3CQF}IKxt;2g*?#Z-7lKyK~ipGhr5m=+- z=(XUODRK+;EmmVpS#2t8v=p!#v!dT`b62EifZ}xyHwM?3r`}_>IH%L<&@BX8jr)E@ zfjqOY3u~y?XtF?B-Cq}oNKhH>({9_z*QRUQBasb^d*pwLU1fxGsSEN_p;P#Y#?_g= zLj(m0!amf)CrJClbUNpE`jT~JmQz?RV!Meaadc2Z$WV-kYWP4nc*X`9Upnx-z2TGo z;c$Ztl5t;@4H(=M<+#3rA4UevxEwYh$671F~jQFzZ>kJ_u7i&@EhG z6Ek9Ktl)o0FU>fXhldsl{FO&#l*(r%HX2>~yVH+zCxn~X>>7Yb6ES%Bl{sf`?46eI z?$d02zNg5PeBCJqe}ZAmjW)qPfFIBCqdy*Bp5#lo^C>{(w3tjnj>98NRLmAoE?fv) zI}nHXaT7ltMEVn~bO{xzDp{-Q9MaFw*)KZbCTxG4v(ura>35WF!n|a`j&guz9lz{6 zc7W2GhYjJOY22lakT3Jx5_*bczQSg8)T}yNh@X~G5=jztinxPN&9ts_Wc{BE6Njt{wMe07poHYB4>nVcxE&MOR z+BpiVtHC_f$M=@JUzOBUr4cUj4t&Et*mHm7C?BG>D()p-`wKT$oRZiA57Wg^__~7R4cRqTyvOf?#0XhXzGM0w0u;q+B zfu`^=7~l1PxC+U-jVP*a2Rd6^ps=yF1eTK&A674FG-7#Og`E*XRB zUh?-sHSeM#BgTDLiO8VM6nc@?+up3xy1^g)VJBb&bb5cE5fEvbi2s~rTR?yM^*!Wf z9OmhuG{XAr1AXhS0(xtfw0{TC7aMuA{{qrmbA>IdT{*Ekbzpn#Z9}rv-~XB4%EpfL zjE-jIdnefA@9Fs^t^i)q8jiBRsQ5g<(IYsd^B`QQ>R{H62_rP~yN^%a(~5`-Z|2g5 zHGag}dH#9t$EbuyU&<|H@U5+i45l_qq$_ejwSN?QQ-uM zDSGJAp8qKMK|p~rqk5bMhcP{I3K2axdWSp^@e_8N-K7o18`Z!z`6W;}w7?vv92 z+P7>H4Wd5bwonk5>i~aqd0~%YY;$6aKB5Pb`8=I6hSo33JkjM;VkFB76akQ}uB%%4 z#!Gd4Kawgrr7Wkm&5meyRn_poK9N_HgDCq=)$sAx0BQTcrX#AmkmV-a7Dn#|0xiAB zDf$N@DP|{y?OvhchG_j1ukv{re_Yd%ZS-@Jg>t+=VXfX=LGgd(E8f73q9R?C5j;y> z}&P#(X$~9 zB)W*J<8=dhK9E%tBhwROKx`r#DD1mysj=?5*+wfe!V0^nZ7|Kwg2pH-bl=S75hA8` zBIM9`h?8TpIV4Iv=YGt2u8oT&Zd4Fi3P}@dRakeHiHLs?6_>fXNrP<`aG}KbWiAb6s9XJwyI^I zhsN07xTC76c)ThhvxvD{$Sh!LQ}Kdg?wzTI9j4-0>?4#%GDtCPVvbV2{g+VbOS$5p ziE=MatD*r5z6_G$jt1OD)`-CyjI{cuQ?E1|V%mSy#B9caS|oXJuXZevZm0A)f3L2A zoA8W43?5l}>P_8R24QGT5#f8>xhX+Fi3Hw(wx%UEi0QNnlwN7S43yre4Ac))5W!qB z!dnykC3bSmx0vKQDO{aAYIKh-T0(nf)T_tEiJG!%;bJec2KqC&$&3WJRU>$|#u}F!75V%RkIIR8-)|_E_ts-Ow%qbm^@&6JT{R*xXbWZ6v>Q zc=q92frT(;Uv93&Ez7?WgI-i2eFH&9=d+_9zQvu38@|ZWXTeLV(&pnhw0h7McL=c8 zzyqlBT^K2a;!C|j)ODuhPwqJV=nHdOR+E2R#xAYj;?JXoPDA7}Wa2&!B?Ya?M1)Ho z+tO86h_}~Qt6R~eHJS2n6WxtKOV8J`p)ohl3I9Z+;+v&QA5n0Q6g8V(r1Wxqg95`R%$(mIFX_ z;x!Bp9L<84IA{Nt{2C(1=|y@>zN>#wU>m1MhK5EZ#L4LU@AH2!vkn{TPq+?^?9{0! zZo+5s+jV#!RSN=u);x!~hM%;M?m9)6_JO6)QbFV66Q%;ThXCE|2!YhH+5=Lop#+2P zj3jOmWy|&`ww6@{wg~8|y1CQp{!Ly8SnBEKuE?R?>~M7>TsW@FwYWBU-oJkz}w*Yb8ch zbtHG)l-q8~tISk=2)nhOUhe*y!fFQ=izIOv6R9HFu|lHdLzs#X6(mP75|K-c2wdmuN7Cy}x~^1DU$C$?ra=XDjQZ7-d_ zk5%RHOk^H~(WKkPP~&Ur(=S*8LI@m#tp-J9Q-c5H^F%FY$E1H>k7FAQ;YRpA4yd^X zAnm%GyhpVTaY)Uc2nL9*5_={(&5>s=NYqA+89y&F=_F7wXm80Fi=aDa%V8 z-Z$IgHdEjW;M{*~X|@^S3&dghCok7&T)+)M^WS4M5z8DVQ??fP;x}?DV2tl2XCy zUAoiWq9W0sXi^ILzVt?iWDbPkqp%WsbablqUy#* zl?GK1RCeNc$b8Bwgx(W0il_}T(22!QL;}Ke)Nhm(X}~ad22D&nrPJ^jWvmp1?Gjc} zP#8gp-B98(l(>L0?FuC(C}TI2aT&^(ps-O_D3pIj5M2Pr328qngG!QwfW>Wr`PaJE zmTJPF^u%xTz=N57CSy@9Hp_|BK<#qs$VSJpyXxc)Ni}od{j}IjK0opWr;YS&w$o8> zW_vd7BXod}B1l}MXBSyi3LferhNvknNCv`Y?(1(*IDp)~_Q|~&*XfF1CtHkS|N-)CW8f^rbDKD{t|7%$8;FU&qBFC3M;FmrlgmPPG- z%IV~6kt&xmXys5ooI4R_uE5#$6Iek0VAh<42fZn2l=KyZj|V;b3D(k2uqHpj62nh0 z36d&)qou$e!a?L^`CQ(NUrLaQu5Z<^c){Fk$Rn8O6kC6q zX(_gDfCthOX3yQwC!xr~b{>Y|W4cxG`nK>W+AG+ugMd3D7zjBtr&5q6PCbBW)3B}2FJn_qu3u}b;pqP$${Mr5a#*jQEh_VOPwGJ&0a-mNTv z7`HH=zIt=Hehr{3T*+d8Vg`zYMSOqMDm4V8BaF4SnD&>QF3*S_JlzC^f*DDWs0ku) zF_Q)5U?35Q(5TET0idVIP3jb?r2~&W0(U2N0nqc4#p&cpszV<5gKQ_oAVGhp^9zgM z2mT;Ca%uq3+4=GD;gJD#><_A)dc&i=C`PBU;PP~`)FCJSAlIbqAW@j7sf9xn`op0r z@rN=EFcV6LA9;Y^F`oz&epH=0gv6E?!TjZ!jxV$ElB1YJ2Q7&RS>5Exlf!hbSLRXG z8k0ehh@3$2o}cN64E-U}G9!NqiO%uKVrg1}Xygx{=DaE-Do68^GjLo-rKM47LIcB- zGc7X<2{r#OMIHpS!6rdzD!_RRFa$0Jy+_6Nf&>^Y`9m0vo?e2`{q@GRQU=jQ` z=j-k7>uh?n&Ys_HI2NC%_vs`qaYn?|4dzSawIsEXMB*Wm&>09%g6)47z!;rr$*wRB z3!kz%c-8~c>L;`{^V1qIeVlIrnf;cY9@z-f{N&j2;4lNvZ4MHO)cGv=?!iAR}xo+H>_dYdAjfp>FaJt}|b{4+z54CY+NhwX~{ z$??suc!PF2_#D;-8pGN5TwH4l<4Ri?v@(Wn3U;R+vGu)U zSoS^kOP2-S-e$jEzPAg#g#lRY;gQ91TKZHXV>|#E#le5T*|WnJ*`O%N1+E};y#w(y zYU#|T3?}UP_4VuJWbgF}JcswjhuE3Ql*SA*5ED479d|X2q|#w1-Fh z1Rz;@f%|`%tnAWcLbiJ=xckjDShj5w$PUdwmhXR>J$?G@*<$hZY4+sZdl}0<35UsJ zPFkv$$=~XNWIg^*l4Rsf_eiLk#Y&H1o1J!@6e9cn-fmf718KJ<>Ax}6HV z@H@;!)$#Qh?WudFSqa`r9PnEcg+WE^*LggH+~|M9brU?h{Nr|$p-I_%$A=-KK0hvf zN2Jeg){3n6rm7uJ`6nx@B`d2X>lfh{Kp<`!Hz86z4hl^)yLTIsDwUdta-?|~Q@R)R z(C2nfZNfgi89Jd|QIcrce^(_vI^zEftl&tS0@!zVOjQo64yGxV?aY^B{|uu)uRf_} z)Bk_Tu<=XdPS0m9f{BpagI)7H;nlyiyHl#wMSkH35@HWh@6k|gMI*jpE>?<19vpvc zdMNIjo?ibW{8LcnpjOxaP0?CEqU z@;{ZJK@^;&YP5X3Gb5_g=ZEloJJrejK+8NR|5i1~hKc_C$V+W3V&L&Jye^H`@_2}~ zuw&?d5QfJ7wPBd_LWdgpgX+pCR>H=^dAe9yt!DnW16NO5{}nx+;q9(&DOWH^6Y z9)O)%jPdATDEC;s5BA;W&6OGF4TrnXeP7vKf4lw;{|UZC2jo|~X|+7X>gDur%bj;O z7Q;p#J;Qc_VKM<<#jX@bqFC%Y_~_ZS6YN4OF?NC2(eePve_PZ;)vtN&bF=c1M-Ol2 zVQhL7xRd7={HUKVhVne3$#G_dS0jIaKK_pOp+sb1uGNN68Vj`nIo=h0qj?^|#}|Uj z)t-`5{5Ki@jn1o`m^#35S!}L$ZAy*@R(V~zq&N%G7M#s9<-0*`VxtDZW;{07JlvVD z;(yD((zeuYApDtsacUQ}o5Vkr^=xcoiEXi*9#;Xt zpMS^Jra3H|vM(m&qO_ecx)%F?B5gsyzbq=~>^rQ=`p@)O-7Yd#+4tAj&0oR(nz;i4 z_`V6P8|4^|4E}a~qv=Cg{#Sq9%@h$SOxWz<0^z4$W(ySLYSWi_%QlGl0WCz0=ot?K z;(cFZHB9|nJSK}d@e2ZHoa zYCDhE_=nM$b~3k1}h`FJJ$;2UXR8 z(V@TUv-v+lkV+=UWLH9F@WpE(Z_U<1j?0b`agA3q!J~0v+D>k22IZfzDptGU&zZI79 zJndx@7@{22`+NtkFJa!^d9L`}KNUwL%a0aMF|ywf@VGZhZQ6gMM^yhPoxh?`!i1SH z`=pIlqSS#(^jArf%8!vIMb8o>Md>o6C{28{nO%I8#Ng4g#75yc*E?6qyf;r=0v>t1 zNab#gdfFYtKj*B!k`(#o*#qkM8HoDH+zDA{7sS^1f4y5v!~ME zQ@~F>shGBJLO*}KoZpf9GJhTz&0Ic2^F~LJCfa&q!-oHK4sxcZ5UI93kuiS~{PWHbKpr~#|-a7?pLR9zBA zAR%?*BcXq!KYs?H2xRLDe&{FsP&OYCN{#KI$o^Cs3B0^XX{-^1A2v@F7$6MW`uH~| z&@X9&{gINop7u5PKe2V+v+K)mvw`uqY&j98VM>>C91UUf_keBi8jVTxdCHDdSb@)_*GsTGjan%d~Sxy5`+Q0i->=y{etl^TB1F+J%iDmSJE&cIV#{n zlR1YjI#fCDvD!pZ@3j-c`D}2%&LRoT3oNLpvuY0ge95GcE<|0@Lr>mVo!DD`zaQQX z5hYHNB{Tf>e0VqUQ%STWs`+R$-V?Ys}DO^(#LD*>{iPSMf zIC|JstHY`lvvE(`<2!#ekX@!ee_|gdI?jKbXdCCGt%G5ziz%rtJ|)#SXa4753eUv< zd!G5<^Ng43*xOFui;|1&N)F}ZzAT$X=^?2@m1EAy@5%ju`;HIQBk z>(mO%xxSs%mV3BfRiuq8!LGP&E3Y;qIuk}=X%+IOH`~q zMwfF%uZ-}A0&F{ux)KMbROyR+l+k~y8<1B7g!lH2M~9$;*DsGN9a+jZTjpyIU6FEF~a^rMPnCX>=x)#q)$Be zqEY)Ol^`&om@{2^17=rEr+icK+0jMdp)#B{90y*=aD0mNi5ZBMQ35bzJU&JG#PliA zr%azs`fSl>n?5^4q!UJAr@((6!`o?}EyNn1B7Hap-QgsFi3uhqn3!QmcP0QT6OiH^ z*a{c=BMoZ1V&Jo*eXcJ9Zrv^@&(Tfbqp}tD{Doc=mu-rRZdqU|Yyh<7Ha%=`cmT3v zLDbg0X^0&}4<9F_k4BRaDkiAdf$CmeUrqwBvKw6UGVn)?@hQ?LrcZx~K4toB(r3%k z$03&iHWGtRkv@ctnpubhym$Y=B1sn~BBWifeHKw^z{a~sA3jC;#LKDH5>APNDAQ+? zK3nwJmQ+aPe7sPmn01u7Q=|TO^2>-7X=zF{)?=rLUVp5|L)m-u&23s7hTR$%DmITl z5^6}`{#AbE>-b|H6ViWusu4f?OblQL{j4#rZ(Z53YIVQW(1XtX6_sHp_vpj>`{G*H zu82*qPs%^y(eOMP-I}<6~>|>0nR9=j`Dc3r1Ky zBR!_RQrQ!bPyLvEN?DWfs$-$h@hEgK@8!Qm%9JZU89g6;jbDHCw{MBIAoe^&($Eo) z&pZ#glU@A!;z!Rrjm7N^7oOK{T!8^jr-*Rp-BI%xrj`7qG9A52mR1ih-np#NqY3ML+6K<}ksQZ_ zqSgM0bEA11^)Trw(gZ{K+QAIM(DiVIjJ=$u4)j>z^xq(VLlC!R)(&G!Qu?NVCY};F zO*1ky$=8iyyl)B0Al4(em0wX7BhShNkSj&3Wx0d$DD8h1be1U8lq})#f*)FmLtAoC zIm>IEYIk13gg$|$QJ2B2P`8}ZXf1~}3K>?rKB+_q@1WUA2~0*-K}ujfXBb%P`jr}{ zg4CAaOAR#CaleCG2(OZoLN7SWmQMt!V@`j!q-BN_6fobikSXebOf3T$y@gSy9xT23 z!q-xyvtNHKMVTH21gVivs=J_)!191j3qZ!uK}n*sNN*dYC-IsGOH#(x0mXJ}Ui+97 zd7z!9R#%M2gP>w?O8p5Tp%vvPNSdH<*R#Vo7fEcx2(!XkL^w#$(GwGN^hs(!M~Mjn z!t4YsA{->B^TY&oj#2~aBqj(5vlFzSaQGCX>@|P#xYudb4EpFKDbsj5A0~)r1la>q;EAOo z5{s~@WJ!5?Q%1fi?U+bP0)iN7BFY8LD)cjjg2-pWo~+kHDLPE}P7pmQLV`>o&O)`2 zIG=y^lPO301ewMiB4r4u!-m*d)P*uZ`NL65StJud4Pp~o(+jH4{%J%-kP$XC&4X-t z@ka9?jdt@gsgmHxxQvtmnMRuBBOz@}#0`Vt?`aHhGY*hI4J6J+HWLOZ)(<9DGuG15Et1yqkpzF;upsB(Mtp>=9} z(SQ^52(1(NZiP^l`cj{C0V;lcvA#s&u3)W}&_DQWzk2dH3xUW&4ZJ>vFYS+vUQ~bf z6%&y(y!cXRMk(14B)W=6%(Ny((zVh#?EYM@Qk?ALXCmBs!Pdgb#yg(M=c<7>G&VK4 z=oM7u_@$MDdu6_`Jd1^u?FijcKZ8jE{917XY5Z8AVXUXcFTym3(aJHK{EExT;C^DP z7Y48h#>;WJi#-sU`07zDKpTGMj27|R8=u|L#pG6 z7#M5MdCJ=t+2py5P)jx@*YFSn6~Cu9)KE5>(qrVYwgQ1I^B%7=GN^~|b9#SC2@%yx ze(etQCP&^Qe$NRPF*W8lTE-+elsCUrNUAy^xwfJdqU3+5wcal75f*AY6zE%xW08zQ zbGS9UrBOw!q+4%4vaGpndJEE%{AMAsS z6g1~K^bc@S+-aj5Zla6~BKkjdUax}fw;+C`C!R8`2c^Qwin0uiJ?Arv&X3P{$*MKm zo4X?Aj`Wk`;0u@5FWIqf+}sDJckk2BbdGL+2=rVzbh z%vn&FxNwuytH*Ql;}#0-O0+#cLqG>8e8jRSDVRKJpAg$uTRM+Qg<@hJ1q5V!W6nh5 zKbmz@`4k&wLPjN3oG^dm{QOC&aQ~t_+c*)Ob3*CDI42xm+3$Yd#5^LUed2+D8mK9N zIE_nKopP}$_F1y16YNC&%VRx++c?22C%tg|r0==yIrk+ja>>g(0P<`UysX`LkKN%- z2!1B>;8jd&mJBy0WhyIMiOem|3L5jK5$dCDiLA7bS0aL3q4R(JO_4?e0E3s|1N)tM zRx$<|#{P#ZGkJ8w=6myq_q164rCV;3pxO%*j_gTW&-mbR7ymG^= zwILX5w~DiCk+FXpdVU@A$x8a-g5T`QPCw~^Uzn0!TJ4eKKEBCt(e%n=ZVo;e^82)` zLhk}rJLi-OjGx}v&6^}DcFqG0hW4?Wy7sXJL!n=@;l6!e&`pH#(@ivl<=1YtkA4e+5Pw!m@{I)ly39N9%vHOKR@$ahkiy)%}oeefj=+ zqLtO{wkjfLTRo6TYr`@(V4%Ti3tB5~tjMQ-#78;jFy4fwfWwU1yZVLphT(G7+ctIt zR9pQb2B$|L3XRQ&hrXe5s4!~UE~~o%Dc>CG4-~Tx6I)n zoNqb-a~sqU$Zt}UYd0+kFR6CBqf7U=JsFuuWwwKnhg)5hLC4l+j^doU%rId^wiS{5 zD|Qk5sTGlMpHdMCZz&bgBdpaEgNlgEe`5V}@;-l;X_%h9?xirK(kfd%LqZhyRE9(p z=Q1QQt4bK<)rP+VpBj!A>waOWm2F%g-0m~%VAQY9CB%Kno9{R zWYd3QF0(9*2>iv|$_g_1sB^@BkaFD;$L_O)w`q;)0Ax_!%yaUhFNdwAMV>o|2NA=? zev%OwCwrz4;-~{yDR=(+Q(4<0o3Udy=Jq7ni{kCH2^?pPEVnO{A7%+){~~7K#4-~| zdS^2NgPR%JGZ=x9pVG>CV(8^E0%`STF8+V(@ze;r(b^yaHa|hfW+^BFLw?eUBXipa zz~O%oFcr17}^=PgAsU zWsU%n2L)dEZ*-Nyp>1!49T)Kf-$;LtrBs09kff-_ zzuk^*e|t41(%9Ja^R+&r39uld_FlvBb^@(Y)zb*7O@*kSyqqr-eTpn}r?`1#8wcA# zm=@kvt)$fnRITK`01>r(?>7R2q~0KQL|9FkI5SeT0fr%CBz8XE&J*R)uV{vq& z>$d_82ryLq-Jb%O1tJD=rXqzWvB3?*FN|smEU5H$EoiZ^tntWPH|G5kSvKAz^xBnZ7FWC z|5mp8a@_dHsWUI6(pbN?^=rF+UE|)JM(F@TK)t_O6whzpxbIJ+>{}Gi?{njS{`oYD z^?Kp?ow%9~KFWzj@%&oGy|tpZy!)6fi%B4nfGm~`v$IwDahq#CudaKksM%Cd6C+$> zK)y2GUrpzn^?Kp?m5qCO8l`Me$j?90`VeEBRg5na2T6Pm()181FK?zAU$c4UGAh#J z=&=@CkgKGv$r14Q-WA_BS@vW!J5 znGy49xPDE~#@1IS`y}W9e;$)Arx9sTBSNRjb@?dVafP}8o5vH*-|3uPCKsoxC`ZsX zRUM7XpgFjDDZovU9uz~Q_apv8jEajrXl%b;oXXxH0iVx|{O1AuiRW^E68LvLmu}#{ z@44&;{w-;!T=&-E8?Ryz@K>J8SAl=ob1Ca$3*g$GOFQtddM?%EnS5ud!ake{GE2DQ z>8KfTpCjxWKSJ6Ew3G!5PUP%$HU%LpseU9YoXr#MxVRO)J;+yKnilMg6D2zWpWwGJ zWwekRXnWsMc)`l}MdL z;ro?T_Crh(I1a9QxwMg0Rz#4#tVja~GNPfvpmSKY=j+6NCjp zIBpioh||Q*(@XF0B;k=ITGX_9|LBzVyp;BW=@9LBrG2!tPf?zHP5Q(B#R21oJG$C{ zG1N;iYEsMh%_atay(w7NM*?Qpz9J*Jq<-{IsAEQy^^*s<&6W(YjFnVVLDr?=cL&hk zdl?m(Se_L4^pE6jUN=>IUoj^_ipGsYa?jv!yqAxS+lwr@*n_D;IEwceL8%1bqNT>s z$$P?xEJT^1VQdC<6p%0T<{@G6@MV(Ce?YOy_F`6-8gfRa7z=dUg#zN>W54xJwi z3D2CjM$Ek-Z(RHApfegxH0f`&B;lnNFFo;muUe^brA(ynW0SNdPrqr?^y+k7c(K5L zY-^JJIKWPQ6FExV7d`o-63I)?BK4**j(b|0w8{V$KGFyhdgK0L^gVjm-r&{+btu2F zsxxEpS@D>E{o?5?yxZ6;T`lF%=aVj<`rJIO{Rd8cW?%_GWhd7q-nm=Jd~AWV7r7@M zj%>>+dFL)#MF`61{@g*7d8_XmC;c`weVh%IcGTKdlN^$%UGoTX@bi#gnaOCKT7co6 zv&iePa(xZMcbok#2!u!{GI1JR>VA&9XhExgkrs@9-=EWdFgT1ENgpsVl9Sn8Wb3Em zxyF~5t*gNHYu(0Yymcka4RfCZK}C(vT#RnxqY$IZH$4O>2c+{^$vGLonPlgCtQ2ZN zi+&nPJJ=9MG72PmczceFHpf9uW5#nZ<;Dq%$|4ZL=b}Q1)n48G8YYYxVSLS9@y!6S zrWpi($RI;WSo$kd_@wdW=$^!2llzbYPnO4g`x8ZJ<-L^%v{ouBTqY(4{YHB~Ie1sM z3P38&WPC4;&DzIb9))Pbapgk^n6NGh+79i2uTF05@1Jt%lN$9Hv*37#It`a!uQ5Cu zXb}MOxn^9pkU%O`^CPNRel$wEdlC6ieT$@j-bDu;RP@>x77fix?UNaZJYuDd{|u<` zyC)8Qa|SZESu*{U=e!7oCR4!KLj4|+?z2u@+KZ?|&2veUzc+paUQJz3)^Fl^G70`g zG1`+y9qIhcm132fjD!2{=<2+%s1OLvWrw%=Vb84SPb@-I7&k^yKNYuh|8(5)7zD+}kAF7Ua*wQ{0+gJE$8#^i=n&t3oKK*& zw3LygJk{wxae)XxOACHL(k@>m^3*ZqL407aOOKrk)?*ovF61B3;r}CkH&ySn)2PrZ z$vUud3J2nJy2igV9A96EJ=g;tkb(m*QQ74=>gJ-Iv7jvEA4(`ir)LHSUhMkauefL9 zvuKoev0PM6e%>yDXGw6-fuN{=mo(oh{o5)@R?e@+`-{IsXOGlA5soza)S~N%khJEW zuKR-bQ9as?K7P1~b_)upRJ2GI66m^}+S}bIZdn-pls7<7NkLQ}qQwd=Ceqc53#*^1 zclu!fI=;a#)}g%t-3PkX=Wa0OW6rM7V}5^y{5!?M%9rSsU_dZY+%NBc<~Iu|QAvzQ zX~EgNP$h-jliR-i+Lh4?JMC7n>1B+YhjFUwR=-BaTvuFD_H?(Su4jVrRm=DTU+=DkkRs<8x>)HH(&zAvOy_d39WL z{m`xCG(U>aQGTsvXpN&)jjEB(esjf{2(EyrY;tf8tcumHF13K4v&SobWONYdmLHqt z+*HTcb{zcwhMFqf{X;ml8t&Y-Mstbf8(2j zC4smC$NbU=k@X~*SNUnjiy6N1_*UIm&ijl&6v~afCG6)Bb^8E08%}<~z7ZpUI{)qb z#@Q}(&nIpIUEU;de)GV?2(36dk*Lb9oAJXd^^EvP9&40Jbj za=0hNARM|n6;^D21--|7mgeA?HGA?hkl+YonBk{D_W2x>Gd-k22K#!G(fEpQ$p_^z zO(JbS%=mDB)apBNLC=?Vwh@j9_Q6)H zdS!;YLt29Q=-D(*5o?n5MlxMfKZ!;uvh%hgh;#~l|{g0&*bzOY5^HH%o3k#5p5fi3h#K7>O2bZY(7N(B0C_i0FjMwYpCuTps z7gIt_G)g>Tz67@ioGK)aN={PB)N3~*v;iQ0L6>K%SHOtx{+B&m=HezvZrqo)TM|Yr z!wKV&6Y)!St(#2yz_6@{JKteKM~dK2ZLQV9!RD33!78skt@b}}Ok64*T=_D=)Yjx2Q!OeF zkIy-mL5|}IfH4|jb=ZVOz>Xu0V;!X&jI$KBl#EZDwJ;(;Oh!Un5FFwcE)}nTkX>$j z8oOOyLHE#0c1zo@=bwl z6Wc%8XOSQ@`|#J?yYCaQc_8=E;QQKrLUiVsKQ33X5&;_+91STB_&<|_c`vgIm*AP;cZplX)Ae0e>BhiT)lZ>7h> zSO#v*TNp#=fum<<;NO4Q{grJ_ zrd`As&L7nFW6){VZRd|46-_sa%s^JVmBfwFjpMfC$g_4^*Ncu9pGU%j#e?%RhVdt% zdIq|+jgPTij-yU9UwuV?5LlZoPop>kP92@E?4hFDML7LD8AIyepdk0>-R9s9Z zRc?UPLG!rY2h=p313r2(a_N)`I(-%jqN{1BIE3mpzv{PqsI6pws6!uW$3n>(#^WTf z%h^kfr}ywnvb$2sPU9f_2dhmcx^Wg0576iN4kx22i0&^kyyvU6y4nUIuWRt{zB0ol zK^fkFiL=4;aMVnFeNCNr@_D{hi<@O2c%HLlmZh*GI&t*MhtbW2(IS$)Uyu^HuZJ_(vg%M2Y}9T( z%sjB3B=b~8>@aJV& zlV-PRXC4x}1Tv0cT{C|CB#3KlUBh0~8c^eoEzPTb{A|#FuhI!}$F;G{h9-Z=8(FM7 z6j}QuBn()e`3OvF&dyP=%@eA@2D7Vwscz^qaIEx5&9MxftwaNC;XCvO*Jg|^SkR*M zVLV1mmRh58y1g*4+%wX;oT1Dv&2GKn$WRW561iKaqehF=f;%D2)85=e{)hO zew0A_OHyZlQ6+H}B2(HR1o2Y?hpEJLvBNbJEk-`+=|aP`XJ1rnP8J-uKkqbq4M)@j z73hwWCFG4uaBXDBID-y^$QFcm2N$I!?K05p196f|(v(quJtg-S8+JY16X(ej- z#m8b>uBL_sy0>U;{PFZX1PtczKr}DRw^WYY5?e%nv`4|*U<@ko3)* z5sj#JZ?Z~27A3vi!hTIG8XLpFHtY`=olkBoJzwGc24`d51b)7qRX7r8(!VAu{hM1_ z)GBK@px=H^&n&;>#bSo`=*Z?&y@Ev*xByDrwObrj?fdTEV znv9e<7y3~&OhXj7+m#YPU9>xyywz6r_wHleP*2U_Atc8pwfxP4bwn!V0SZYWCYSqv zF$#w=-7>^%tKv$uGEIP?!K+wkk6b(F8U;sG4$zy55JLg6%-% zN&9y6XL%#`N8{Ll^nxC`e?9rlSY`yn>K=%vjzHoVNtEJqNdQ~jfa^bTKOjLzRUvXi zm_Ilbk#ccQ;$ZilDd>oxA12DIWcZnX4Fdtkc}el#V}eW~ra~@Yyi7)oiA3C%(3Hhx zZ^ycGSKhJwwmS~CihI)wC!g>Ri;8aNN*kq(Pd?$+iFZQMeM>ikdpWyjGWZew)kr-~ z-s~PBXn#12HL)E2?>~SySh{GB_sK`_P_ov%Y!VT+S9th4x^2>*`hd``Q8K@Oa)p53 z&tHH05`PFOz)wi3mJ{nJqx$JdwD!R|u)tgp48goHOByE+^!iwmGnAPMri*fr>}15& z4l3&jWo3>l6>u>dq&OK={D7Czxj_KW5_#>yZt)D8;1?%@->y@53px=DN-K!%Y?*(Z z1aipv3V*2#Xsk+q6zGR+qN~_{g+lWBy6~+7)2G$YuC9KLM=&-pJ|w;hUFp~{-c{)P zw2>Cr>FYZeXT+}ft*L~YsALu;48x-t&!8D6(~Q$;TG8*e?39RvR_R+XwEF8->06ue z7&v)}RJ5DN2kpRF-{rKrU(GE350%%WkvK?dlV0*pqGPtN)G+(@;e7Lcsc%*`Sl2qu^ z1CS&BFiLiG@+fG?LT!@2OO++Tw-(306f+sirDxXR+QHSb=F;_DMf<>6>2Q)GLnwAf zI`}t$xvtW(jY_XtSWu?K(mDNN6F{-V3l zB|lKg&n&Xx!Qls5yo4;~NeAi}G3K>g#vgt6)#_Lw<%qye;gG5Zv`v85l=)48KCciB ze!Zrga(nwDAG0fO7al>hZ}m7zdNYnXk06I3=zgP>qkjB6H)2b>oPBf% z+R{;^liua+hRuUM^b-5Lsm>Oo8+6y+z{ka3U)SyQv)D#5z@?11vOZ>9erE?} zE|y}|1g*<|?U8(=9!6nDQ%Vbk7uf8F7VAahw3CnG7avzoSbG!)q1L{{`5{NTWy#CG z5n;I_+nheP_58P}``fFt(G5JL`Rg6FPrGD(qoE?I%Gk3orc-0B)s0cCk?M_F^QhWN zKr!66bSG6@4MLJ~M-M^e0yt|ajNW=~n5?5(ALV42h&lE*F)yA_cC1?p_ib-s*M zzVIMLU~>_mib+tke&`b{YJ$fj_1X;i0At&rA^;X^gA~HZ*oBMncYQKy4Ms(}6SlO|c+qXkr zG#d8e%&jtHlphTzBK=CXk9nO*K=!23&<^K+qjEml%10o$T~U2zO<`hHr3u^|3kGvk z3w*x|?utD($R^n(mwPz`pXAoK@$>1eM;|q!O)9r%HGbRF`1zD8p2I~YCuQk6yGyU_ zn+salsU7mdgm~#0%RSCGMgtYmoCp2N&#YV{mXPRCRVlWnk&EO)C=fzOk|4TMVdVsL$i83%!p0 zU$^yy*x#qAj!X4yKB+;O1O+OOfa2;swg#Vw2tKb5|Dvkp-wDPW^SskoE9N&{Xqm9~ z!lhtWciDl`C`dA!E`dpf4NMPEu}>uDgJMHF}3hk>OWs2vEKHWfBOUw2>)K zQ0x6XaV|ry$gkz+i3Ei4TPGnP?#BfL*WI6Dzf%&FJSM{ow{WU?Jqb__-_wA92c2q- z>Ua{QeQ!oK2E$eYb8CTjf3kP4va)2zy~wvBKWAsP!0;h-l?7$I&^(6K-i@TZ_ag2L z&MkylhYb!D3#MCpX6rTeEAWIhn7qFrr_UOGWGC&;%F@EX9BUUZ0SQCNE|!(;%}YIm zBQDr{f?xU3Mz(^Tos`q40TaR~7wpzVKgRtZq!MB3L{@6#xJL2>>XI4_S$3 zDDk|N2mqxum&JtzxB+~(euf20U4Ny^Z6incx84FdDz;)u3k+^LyDpxI6Ys9ea!!|{ zqD;tSRw5Nb@{y-c_srKIND)*+t3<9Gl8yd)j-H;L={b6qD^3=bs3Qt|4bj@aa5K9J zd^Whx$x}UDJi$A3`8HSX!@hB0obiv9nE^&>i3*IejL<7w&| z(UeO-tE7%SAGpcynkL>{8+EYUND+mf=l#*n&&_`-03K<*BaCjB9UOx)R+mk3uhtf% zBC#Vc9QZ-gLUb0503;bmLZ9FKKi)lMc(xV`<6EcGw?eOwMk`F+14m$dVaQvHdw%nN z9M;GbG6NUlI=m@s(@p3H{(o1y(%~4mf#Al3Yxdys4LS@1I-{)=6Y5lm(`8Ty9qXI> zt2JP#ulq#O)$yw1+vO|CLkopw^a`zztR_mw1r`?RUsiH6^mx5>v)s&z)0+j0-2s{R_6IACfPXP+hM`{Xfg)0R zOYwQERZ#doQ72vWOXPdwtO0qQ4n@sdh0?|Mxu6HCg_cR=3xQ^#V-l&mrpP>!Jr;$^ z8H`F6X#&IjP+DQ+q3`+SDXC3f4ptU+yyOEsdaPWSEGxO~f+mzE9D1QY z-fez-A!GK8deXBQh&1{TpT=#*A7>XGl0DcQZ(tTKDdHqPueUZr1a_kDt>d)y@FUKo zXkstx(F*-A#sFlq2edy>%HO%9zXx^Rb_9~B1??Vyywn! z03ahk18*=iyX{q4A$ec|p$OH9RCSu$qLsvI(Mpo`qGjh0b_o~HHymyHgutb};3Spc zj37A4e!-E1y$5}3(Mi>!lZxoXhD9gXFFJMqn#hhwLTUslR?1Eqs#6&WcB(Nf(pU|g zJd*NHQ>9^XzJDs<7~voBc0f2sFf&*ANal-;DZ68^${s6^x!TOw>d!O3y$$iasZ^?1 z+OL<^g#;Esdt<|U>cT7W2IE7Zm{x{|JFpa_;UiUx#)pM3<9pd18s`xQtTj2Uu7Wu& z7E`y>us7oyi~sQiP-$x@3*&=4)06+lQA!?iZ6RrVHGeY0(FIARbhA7CFQ70&k$Zl! zkD@3+5vnr~2{xaplk7QLjy>johB0Ovm5X-|ezW;Guc5<;V06O6h3^M_@Q8)S&`V7) z*gdNyXAqp)JtH;egtRdDoV5=E0;_xIc;Upx_< z3wzS>F@JbScb)`%22roMyyhi4-iUm=!2U7jp&*qQUoBXycxdPYJQwhYcjbo7%g&{w zjH66_UnmnwR%Du!#r=rXOseoWI4<1-5E$W;dnW1GpBrc4i?X}bJl|9EW?KjU>c0nS zD5yg(9K^kSGo?FphtnC}bJiaKj0AAZTU+;SuYZTc9q@j<3CE9NPx(d!oK7evr4@st zBc45e!WR@CgN@eINGtCJnOxZbqS;_+6(wj=p$Vz1{m|$C`dc(4noLtK>;G^u+eLf$ zhfs<+6Tr-CTAI!400|HTD%*3TMg4y1Ef?IL=vMS8ib?72kd?5mO@lOOxtSbfMsk{a zqksM=+DW#Xp+a-Aymaw-B#io=pYE9@lS&O@As8s8)tI1?oT0+{O*Olf@Z}>}hG~#1 zt=~$6@&l1~YtXuue#$q69TF96LC4MbkCaUlv@?J?_3+-iZL99eU(Ol;O*^}|DkX;C zVwugS(_(=>`WOEg12$}L3xhJchy4rE_yy_%vH@V1 zFlM06wKnUrA`KjA=xa$iHkvxqFwmBX#;;Pf+Ae59QD7sDy~`AlIz6#qk3ExQVL0*w z`Zc>{IN0m6&`C<+z3*(+gU1eb+vD4Rep2$wLf($P2P@IT8Q*eeOoMG!pi7z0E`LwI z$nz!PF0TS{gMtEZs?KdDNl4lF3jD0e_!5IaYWqDW!sb7F53F3U`d&DUvM6sbxd`jY zA6~L`73EO|`zrEP$pcCVz}%A{MYAXCjV9donTl!DeC<#gYjT%bw3ehO|W{ zQlT_16C-sdk}4CCWFix=gfd}#)Dh;rNq8)%XLOn90);AV?=3u zC-^daq<$=p^izm1p?I|~FQvAB#TvOCHNyP1Hs}V(w)aX`Dq6)-EU_X|;XQP=nM@xOeA2n;NR2clQsVq}~Hg z6m6fq9lLZC;Gm;Gl?YYLYBFr>bhmV*|DH$0o1Jcw3Rdp0dO9q_Sb)d`V(1_SI*6zS zkpp57IEaxBB0-Ke6o2XqSbwb1tf^YcQu9a+A=R$>z=UXRa5`U5J7&#V5A9Zhzp&em zTx6ZzQ~ygo9*+;fF?y`5#;rEAxK*AYZL`pWOQj0T#AV%@!I#VO8jrLn0o!U7$bhGw zG00s9UcoHJ%;M?%ydEI`*W&ujBC0IWxLKGYRTqCI*s0f# zVzckWiOnsSxNLEby_V}h?_x8fRn~yd1wOyi{f>a~jy&_M3XqY0BaR+(au0l|C@L89e*>~+zARmbq|mm$yDDCP_jElS+!lE@3C{;zEI>dX6+Z&YV@B6N{zI$MTZUuHL_#erMBKc|F1J9XSIa`r@3m3iFaFdkBc zG?&Lv-kig+77Xoe6160L0jWj-+bnfKka@b*{rEh;j~>b@|9{rdc;mS7Q1=gRHN4OA z$E)H&94Pbjr3(Th+(N~yJ`=Q6dLWBD_1Yd##9E4S4vIwb5-AL{OtV)8Up|umAoI2U z18i9!@)p#W`TE$4ye^(9 z2%L+r9WS7NzJFbUV0sT<0w|;VEaL4T*}#Y&tCkXNqY2tN6+o6f)DZ$k?iI;2ZaB0c zs6|sL;h2{T8tqEc-^*%21J))GpzKa_#oaf(y)6_^1>g{0Nfv=>w6$PD;otN8tog8P zUT$!~3BaDO-lxHJHredz=s$%G`jvpzwg5k4*{h+gOmheXqhsXba*XddTCpDYa9 zL~yo!AW;C2=&@2C|E~@t0)C>d!1N*FJmN5qfS3K8Fpnr_fXTHPhuB3%a_#Wo1P+@qK}R!jb8KF(XRyZ)5j+~BEcWF-esf=QxU zoM;F_iZgw);H}oY@T)8?Xf#Xt<;RlPahIb8yMIU**I7~8hYjG+^_Pg4gu|z2mb)^v zm?91>BCBOj(+X=dU<|XO|6yU_sXXSn@MiW^U@R>NjE%z3!kb2!1`()$W1`?#r5mxn zSAnSG8a`xaZrMAQXN7ylDc&!{S*-d%)y}YO;b+O9%KB80_?|2~mYsWFxQh&KT2Q_v z27h+y&CrOzG1GBmocd|;x0@jF)XE_Ce}C@`xEO2rHT0K zVxtiF#P7{i&8r^?ex$({_%P+vSJT~1=;KV#;}+<+KtY10dUIkM#d9={d5K;C$bX4c z>A>p`-kH&^<5U3bkPZ%-pwx2O_87|pkZG^(#P_LAi5g!HeFs^fo5`HxbCu+x9f3rB z*Z^*^C7a`0sZc;f+QLp_<)tNgwE@z4DDCjtb!HR1qruspfKAj1P;ZvRRZ1S7p2apJ z_Pb$M7mWm;lpVlk>SMRpXP+_r?|+Wua2dO<|MsC$z}IfLtWsS&jA}8how8{U-Xr4* z`dsa-%d+6-j%k3S5mALU9m&Lv(z&;9u1w|2s~VZgjmILyKS(pvY(eAh%Kk7FqEyN0 z9N(+NP`1K+SRdX3@?7mPsOu<|J5HExa#RIM!LO8H+RUGUN+CkDlg9l}JAbVT)Ear= zM#F!IZ7SWi&c{|Au3wL^2LP&`bA7!27KoIYMv~SbyAV=Oc_I_OSBVuB8IIbi30AH2 z?j>BgDj>l%>pEWm1iFTIj?c}{)h4;d@rEze2kPVd_#x(ja!r7MI*T)vLayd#$9G45 zl2?1a#&^el0g7BG0xuXhP=D;RQF4v93||HhY@-0ys1p!MW{u*aV3mo&sF9$C9I#2W zb7jGOEEK@U0-q>us8kpzfKAk;mg)xY?4ZGYcSSW zyd+GGBFNpFR7Pg8_j^lA%8u?eLgH)X?O~dG4{4^{+$x9RtE+!PI zq_t9kk+;Ek^ZB5(Fu$Yojwocu&Uf64{*wLk{H{PgYx|e{jvM~P;j3JD2ZB2IL+?#T z3T3$Z^s2c2ju_Zlt6pThnt!sh%QV{z9_s$2+7(A;N0W)YS$|+%kFI((poT?c{N|7e zYem(ym#2a>5>iS*(6m;RSOxe#mhVIFoge#V*Tu1n?+OV-iMkw8fsehW(sRgNo2nk;Q!rXA%af-LeGsTz9W9s z+ZXH4#s|AlU4MR+uqBOB&gp6p^H^jL!>K0nU2+~LLYsqigPaSmN)Ra=%OGo(bCeON zGIdepZ7-Kp#9t8x83vrHEon%4_uzWY?(K|<+Vh$1^o)NYNAlAbhrA`LUgsV6sQv$d zk4Bhnx%wbb5A#%4p#4x3)4wb)c6TAVXSFrRKA}SP@qaSyn#3n@8(_Mjtd4q8te%{DUI}}X{wr_sg= zeb9;IRZ$1urjvBpIz~*ujym&&8p4l1bsSclLY-|;tGqz?RAkUF$2~IWgRscvb2Of8vNEKK9ZL=LDpda%bNt$&G{fkuk@lj(SJy<5p=*#p?|x6Q{) zZ4~ArFeYiVpd|yMBLk2ILYnH0>D;JOrs+Xn-(2@;fxzy<%_BVmMNz|Vez|R}(kEN5 z1O<3}@0tTkDwgj&slDqZzlYI9q7Md%x};L6h-T{$Ja2V$c_y^IMyqtQi0XD}o(uIr zF* zOAYqh$>hACz?WzJ8x9lWJAlXPWXO0S^cy7tsi;W=Xj7pLymy!U^#wIc{d!e&5#Q_c zhUc+TqyKtA;|Bj*TB6tSf^QeaXE0IAWMCvYSz}&ZWXz{DzguPZa`JKhVe8VcVg(|yQyPOkHx+iR#Kn6ab(g?j~UFw}3xwMJ;;g1XY zS7aVrf`Ob1aZQt;&_RZNb-L+XVR-P{DTr=*`oe6SEkA6MnSm0=7 zbnya!>IvaYr^cgi{A{mt6lk$>Um`wNMtXkwJ!O&hkvMrmbehwK2~mX21`cTp4m4O& zao7~xEYohI!1uYfZt_ZMo9)`+*?))f^e^_AZBBGOWMJ4IoZ$U!C=q}L0=nnfA_u!r zkZZsgfoaxzJw8QYdV0d@SqfI}Cvi%f6~e@R1=LX6s`w~VFtADrTW}A7Bh$u%MkQJ! z-X6aqNk}3A+c!4>ITqx7CfMnZH`k}czyX6Y5lU0(Ak6k`QJ!3j2Er^@Sbx()_#1KV z13OjARHn4!S+!!L04fTto%UwYd-kzD{NIDW%3Ogw^9H*v0B7`Y{L1>5y;t5Q z;`S4vfg9>^2XEiJ8X%pn$bW4(2vp>9UX~;_(ic;#;a>%Z<+ve7)wA&@Zk_ebHJ_8$ zl-~|PfTv~*i`TnDrjD!dAWOS52FE1h<%s-fdhYvSUCAI$N+Z>mMy4%|y;VyMV5@K_ z^W2!o8ejrDXY`~5Pfa5sIP$>5oWOBF>0&M0m}q+xa~Y6(uX6ax6F8rRe644XqbgNd;h?jo5f6~Ko&zp`-r#AU*a zS9a$U_^BEl)7r|Dg4B)+0?o;b)nke6d&mM1qMHbVJC=-#)&g0oPMJ!;IV8<47Z;x% z^LdHK!g7tvD{1AqdVf5-59C~u-aLznM;h1tnSt?zF4|AW^HCdwfi}}dCtfQ)s)%FI z?0A>ubXl%RKR{=cz1 zCdEVQw!5CwDDdd~qL_Xx>=PMh_GRN>k!e`q+gz;`RUX4?gnwq$(r3Qo!0Kdod>H0f zFDG+*>OanDDhn_OR17XAtB(b`fbs=MjXoP1>9xggHB6F{16B-8AVf+8(})o3lba}+ z(e#a-CY2IN^(-E*sq>!}Q@q{D1{4d#Sg#jUC;GY4w;88=tu7{4obRpYXL3bKmgUW{QV?IO^V+~Q z)pKQVgk~W5YoYgaFO{a}N**{>P#3gVZ%M{ME1kJ2xPKa*s-HM7?evBRIb>d9`V2zV z;rN(nX6CFayI3XDE>^2KFU7m!cjtES7w%D^$AAj;8B`mC@q_KluJ`4@PSmMTNSLc} z4$2UP4bn_UYAmS*d1iG#$Q2R?JzfErIzZy<08Rh^uxCQ95Jl)+OAaVvpOf^XB%YZp z2b|FsxqoJt)x$IajXO@)0ur_Lr*XMyUUtByClFIL@9Y7OCh(rpd;wXK^Ro+R@7ht! z;HMB_)p7ITs5e6%QeT@}jWccUQ&(^6jnq8Ma<(WK&43uHv!f7JNO~6(u?!LKez*@P z5}~;J?ji|zU#7SLp*pTlwR7z0wEXr%`K^>1WPeJv1xwCL1c^TO5m02lhQh56CZevS z5!C7tcBYL8J3;_;HpGZ!eX$rHCyN!ecCu5dgXjFFq#I#DfnTUjStOE>dRae6-sQ&l zJK{|_n9{9Dyk?H$1vuC+dsI;ee(#$UpKDj>l*KwwQB0?mOUf&a9E&NY7VAaf=Couu ze1BFrHx-y_3`msjXP(C43IM4_nc~xGj;HVSf_GU$McH@-6)mwJEk5zpQ}mNZKh9Un z1!se^Q!lXG7t|3~(db>)P(^2iN;p(SjCukQqAd?zQA4jI2S7H4kbOeVb|Zfv14cO)=ijWQC-%!`A4lpnS!)xCY5sJ~3x zSUsF9Z%VcZpFde3?sfpF6eQ$A6kgsYLsdEI#n8n0#HypCBX=^r3m^DqrftIA{dq9H)VuS>D6f8F>5+}%2(=6>-C9`0b%Ro_Ez)CCbOQCyM|w^Hn@SP~d%G(8gA|~~ zBeSc*x**Sm=TK9YTreXm>3@z~j>)*Jru&nJ~WvAOV0UjAd`J(Wxy0$U}2&Eh9H#PuHlO?9As zj>()y1Y9b10qkTo`ADab&Po7f>N3hzr@A7H4c_>K6)J4f$kv-Xw ztg`HuCwIbaz3{eWkP_eCpr08mVf@>yK!?`l#N=9fPH& zHR4mTSYlXLJ>#4Ae$ZfDLGa#p0`K|OUJkqv_62ZL!DWjpyes&R$&@!_v9|WyBaEg? zUixK)s}cnus~cRDOBymS3n_0=&Uy12qF3oN8xCuMl7QHhcz+JXt=Fs)f&9h3VDsZ{ zOhbewd$LER_OF|dw5J1jfi_pMX)%m_`qZjao3#_yun%dZ6vX^L^k06g{5L^DsgnHF z)PJnIjlu+*qt-Z*q8alAm%CpwTcxkxdpr2U$>{gr(LGo;!uBTzhe-Xs| zI~c?*N+8-Xu78e|7R`<)+%zXO7p&SdqQWt&z0If zUpaQoeXGqU^}r`|sL_aj;2X@&mea4U_b9h&&L6?L^msf!w)VeKappT9do4U%HkIY(6uZmW{Bz0#~W;5wimErFbY1Y zf=_M0#*e<~;OzO!Ih7yla83c@S^h}5yS7=Pf`x(wr%c7E8WDDI7YfPCbjgY5N^#Nb z7N3fR%PXi2W0yDi+O?!$q%p!=97ph!mK~JLXRJ!0g&>!tBW?9uEz6SprW6kNSC=sc z1{4QxsVrZ3f4G-S1_mb*C!B{l(;v2NP{73k*Ym<)Pt=!%1_mG|8{q^8}^!-kv48!FV3&5pn z#+hU}^0M4-?i*!+=+?Y3@LTx)!?QH6~dT@FZdzZKf z1|R{$m)Qsg9Dj!kD(4zFWYwFu@M$}T;7rOWCkMM|QXZM>v)gJXK?( zYdRvkB&O&*s^cUV9H5Fv>;x@R7maRZe-z9e+o`_zIF}9!1|}WAY=ot%xp47qDvJ;7sVayyHpv$Y z_6NH1;Ku8smr)A_6@Ox)STEPGBOSL3q2m+B*`(xb;wb!W1^5C?LQnl?9fsRtdCJAe z0lDs2!ci4WHkyMIlzZMo4!*A*qHFj2Re z%t&%V9%aP)Mj2;Upb3R0)=&D1Q>y)>Zx#!?R56T4hgok{8n+V)x(kX_U4EH*D<16T z^uatRZ2rEWu4>0nL_I z1s{Neu2r~7VSS{nI-GNR_RLn!NgQc+&oQ_~>Kcw8d?Gwge&$4Yp0=6@&ogPQxnh&Y zjy)c0J0Z^ns;}GUVaX!j7qZbE`l9_@H#h_jKi3UpQGdq+Usrmof(ignA>x6!%})K< zT)+(l*W4MOn~lcJvs-2uw-&Jjup+^V|5xQ3|BUi|YP1%z$g<&1I?xxrpVP(rsW(_8u7vPzo#>@uDX0H zi|v*iSbxxVCnm^(HfdlF%}jBp3r)YwfZsOeUyy|wGD%f3@>S6{MQJR_(wH=LbpUoi ziN6i9xJ|OMoRW2S)K1ZGD5*+Bgoa*!H1tin10Lvn^Unz#O81r*@{HV(SM`2W?vyzM zw8~`1T%ivdk?5hXSf57CMdyoW&vt)CJ{! zzn3&GS+V(f-5ZQX*rOb&w%Os+R5hgrqm8F98cpCxv!f1Qim}4sN%nVMG=VNc;(2v+ zp)Yiq#v^|UqQGnE5e1zQW_NFV1VyMVfG|>7@OAfi)feIj_;sM4f*Gs1Cz7*)N8|Uf z@evn%dI5XOFlhx_=>(jh}x>E^e-Xt`^29l62_K3t{;~#fb+M zK(PRkXaqx4#Lj1MV9)x5B^*QE%dY_4D5FFmbI;_%ovGuifC&><%dQwbdN!0+f}< z{KLb!%j%hWp9{C4ZApL}-bPVH zhlpqbt+$3!2l!B(`$!5rAlV#@8fCMb)2cww#6lB#QIk7-T6`cH5F|nnF_Up4lWC1f zDl~}~jrTB_3X@C-Qg1wLASkb=__`9bOuK)QH%fe=>D}#ajx?YoNbh>~?RI$>Y3DWzosEJhGBYc{-T7Sov zX0GpGuoQfY*4D~x-MuUHF|%nJOu)0yWz5^)skoV3v90Bd44QYkcWG|ymo(E z%!z14egRRZs^bIQ1t1GBdx{99Yq9mq&Zk3fxxz+S(iS)xTL{5WGdjiPSC-W_3&3RR zBF#lo`XniR6Z9J-#X50MYe~)3S}qSB&~E|Ahm4a7km17|))gCn2E!jn?HCZ$@7QVA;8miQ{j2`@b#kgfX2S^ zRDZsH*q&(1B~l&kFXxN`D^PP)^|ssBhR3RHPPN3^H=z9*w2?Y-af`F;2kXOg3h8^+ z7Xq;74Np_pI#Ayoq<;*KNeh3DFV_#t#xi(PhrBNB^6bB?U+HcWK@9%QTdXP&i6~{y z*-eW;2~7ZrOSD`9gaQd_1+-NX#3kMxd*<_Wvg{TogkL0$?Xkymc@Ep3e+2zvp?4cq zsN6=~AEo%U>Ir^wu-dsC-941I$-53X(Z$xaLyQ0*Q2|_`0qfEhSvP-qZbuE2>`jM{ zA4h}xcej8i)!<k%YPDkOLh!41%c`A(5p{lv0!wc*{Yw!KY79C2d939pUuz)(erloy#x;F6)LF|$&8%f=)^g3P=LGIp*hN<@ zBxmt3h^8*qKHKpRrK2Ajlw`pgwjZ@G|cFq(kPOZ zq>*R6e@mlC*OG?W|F<;MtwM9t%Em@IU^{VbJ-FvXW``A?i#3%%_vfHcNX@i+2FFcT zxHJcxq9L$lj;j;JLi{d(_sxTj;Dc^s;3^d#5JDbW;{|^`mPK5UuQtBAz^}y7wyK|7 z7nR^__auHPjIM}fXj@tsT`5UzK+SA_j9{xCwyM~*=R~vjkC(-9Nwc+aq2)%N(JLG?GcsBO< zoL$5j?-ys|CX}h597gG=#Yz1ES=>0DN9#~`>&6y9z2=RmakPL^d?DwMZv--5vwCW= z_5+*ra5M3qy$n0Sh*$(^dNt-HDiT(Qb`eVa&d5{UB#MUdje}N zE`GXH{7O9~tu|>J2g>#5q(G4A7JS02Lfz;{@gc|F5rsl3R$Gu&MlIBGL#BL_906mc zrY#zS(X>Sx@3BURG4hJ@5QzKd$__St{dZ1(7MH{_;NQ>Zi{^SZz!BZ_~+#Ytyx z4=smI=hM}gb3}7UrW!OQQH_cm|M9-oEy3Z-;T@1r-5rp_2rrK44CSeP zzkdt{ZUc|bYXr?XmSW(DyHrLlT68VCI@x_g(Gv1on>!R|%vJj8gf7bge<>|)*cyL; z$0cXY6AI2qdgmf;=%CI!-KnzpFZgy-Wxm{U9uZ((RE+j(8?s%5=~?t*&n+9 z#En7xr5{}+dOUlZGzDkl0tEVqfIg%c()A9~i^dl!ybml*-q1w!DU6;Xm9bka9qhA+ zW_3X%Q}e3OYVX6`B!$u)BPT90wJv`d@lb(19rt$_dS`TmG8~>j#;A*5iZt_9X~I*P zlO@0^HG$qL@=4Wqc*C4)c)8(vn|j_az^e91Z*+S>@6US>Jj^ngpe%e2`8MY_=Qj25 z(xv|!S0OqX)y)(9G}rb=9WrpU~~iml_;%|?z5~~y3Zty!=m-HdYf(B8=lc@2cZs7?<#jr^4n}PF0gGDFCFxh zF1wU2D6AM~7ods_xvMsDzpY?qwYmb-h89VLsI6S;UQ)3|1k}5i{M5@E>5N42SER#> zX7Kw5=a!pK)9KmVK0z{ZnIC`QEh$b3z`h1_3e@W8qQdk5YW}N@YMY4T%e;3?7lY-r z7O$TOk$ov4K{jUg2$y@Xk&S#4cMv%P8TGKObF4%&^v_?389p&aL-7uMW={K)NnmB< zf!OTCwqX22f8%=0o*h7L6WPxJl~MDkQgCF75s^;cpL=P`30%p5q0@ie=H-|_vGQ{| zs*a6u}MV7MCJUl-6Q6qbN9+D2<0Jk9o9)ILF)o+j^6?gX}45~|Lsuq7_ zreYmqRu5{f-l!6TL{L3dc*YFFy8y*PH9ioNpvaRtt0GJQ9&7fnqcY||^|t-{WLaGb zps1O}1pl|MXq}v|X|I2iyx`Vk>&AoKY`ci#y?hJEQzbj>n3~z?6Xw}$%&&+^%;?tL z$#neTh`z&FW8#ME)Uv~jgIKmACnWq2?t;>SBt(Xx?~q{hEz}WFkdWa$kjz&k8P*I= zDhE>AE4Q{q8n3gr+tKU%t!*E#%eNp{tVYn8(%(;gQ?LnEM09^FpTt`KV=PK&l(ok5 z_j;}I@X=6VE{m!&no=(iSC5^yf?&BKSEw5#djXxs+JzfJ2lvVB3Ccj=vQjRp6$wsV z$cH2{crfCw3O5ZP2(B=&>wi?lUZ$$91Q|KHu4EBBug6>ksSt8Dxm6qyzw!4t#=OA9 zN)q<PCqHn%BVbUeP=`m9FctUH^ zDcK!6-KaC4PJ_=Nn6A;(ChXe#^IXOdqaMhOEt& zEq+co&K96ss_0VF{1x4QyhE9`?{bJ+L~+4abZ&$q+?AcD=r^UwO5|N9^05Ds#Nt~c z=vErKY>?ZD5)(vVi-?7ioMdqtkt~1s6oqYvLPDLNf@wCjBC3$7$hoJYJLd;6*pT|3 zN*#4L1z3M~TLm7-PB=7vTM~>u)OjA=7L_g4=CLwaXC0-u)CQ^Bz)=zduuNSnRZB|Z zme63DR=kR*7ZnMk6?qUIl>68Pexqit#0n{E4Z{vIVTA1puu4r}l|z0_vZ~?@hLHl4 z$wu;4G4XyVfBx77fpp_Wk}BKOs=OZ-nm)1(p@!B;41j#Df=|*$44O4H#CWwA72u)DF2yLL6%~#A2 z>v+F8yx*Gfs*;!bJjWDTmHgIYHz6981$_OpbK5iMPbc|0CNW{vRzlUI8%5=4vjh+=JzNs*h2 z?f|7xb6iHc#E~Bk4-WcwhX(-Dt`B+s&5M6&ygEc_g4)z27t`;;y;|9lSZ_PD#)uj1 zHd@=EwN(O1^8Xe=U`o{m&o(&21Im0eGrS}mtodUX_zN|2o6HajD9g>vpYlB9jz0=_ zm72TWre|7Zy5_iEXD(T0&R1QUXqiiWcUrY31JoZpetP(hlY?;iNA<4)HWS!h)M9_c zq|#Cf)&cBOfz1WBAGKMK@85kyaS{Z;e^|fPA316m{+a*6U(gDv3wb&TU(oD4;6ypf zQ9$T~5aJCLAPPwQ_r!_4Hwvz*TaISpp!sR zp#AD2*uES;ogu#zWDw-AdOy+a$1{K6tpK9{M^JvvOrLyR%v_+Jfk}W9IE@CUEQD*u z1Er|)KH^-QRg7{DR9G*r)J!QZFi;E7gXxX(lyh{s$kZ11q&WD$QlJrB4=Sz~SgW&? z7#V2=Ig}Dz!hj>GiM}oIro08H6e-^0Jt$l+lANFvh>Y`s!&)Gs#)LhDH_r5XGOxBnqPl{{Y|rbl4s0M^6GWVq^nGf8dTRbiOvbp1ZrB7aQytH zug?<_%4g+9t2~&>S-!vcb2dnF{?3^<&Hhb$6uxDifS7* z#;YY73`jtTQPprlbO3+Vt&9b{5~3coU%dq8AkB}_jMIV}z$F|578@mWM!ALK-~3iy z%40sBIohS+H6pml4f#jA(K$0Z>!y86G=UqW=38wH6HNxz#zW6Odw%Hp504dZ8EOS; zt3pRtriOK?5CuosX_ZOxJbW$= z9T^z}8GzWXcHDnU^`f8>ct;+C1IbRoz3ic$^VfmPlj(o?JzqcZS<(FV!($u z*QWpGH##=LyY=TyUCU_z^k{<*Zq`6GM2PDR6lx&~mz00u25P2@5nKdEkz9t-5?XUz zM!NPVM=-G|FKf{1BAkNGoP2cDB6HV3x->-H1zoHV9bjeWD_y*k@7>|xbc}O?>uYdM z7y|VP1BKEeIP0;59F}FHeg2oPQQ}4HRyAQ9Jq6xW{4Qar5xQ@QMyQ$xCw9c4B}#!R zd?@plB!Pb<`gVw=%9HY}P5(PQELUf|Ubf>|MMLjHoWo#(4R3XuohtxPGhBj0u(RppU!NpJ|xpssx^PB`Qr zJy+w96NNpme#=|O)47dfwYLl>z>(Ndb%|H+8=`+cLeY67heOZiuS8o`VY|K`#@m~5 zpi?Z`Nw$j_=#86~Rf98I3#J{MvpGeun+hy5>~h)%@+M2#Vz6Vp`#-y_nTN!|pg;{5 zCW%_KMFD7V8ZFvm|2*$zTA6n(x})k&=y9$D69pj}VJ-W0$dAf7My6+66kLr=H#~$t zwX=V1WIow_#21^((3vl!+%^2h2r}$`7%cA_qDez(hK>#VT%#mJadpD zU0#}mFlr@feO8h!uYcR+F9hpvhMF01$jH=?ZHl6#HllXV^D_-z_LuGmi0;ktM?Qs0!>CJ65mtmL_n7JN1@F3mh<(h=Awid;x zEuM9Ky(xr21b)REz8IArWnm~rRmF%~jukVdezm}6lzEJ`o@kB8Yd6b#bR-A&`Pcrd zv&V|_H9t>(e)-o++7FZGJ(LD}_WXbDQyRF?7xvIy0Lw3*c**R&ut!jO{jwR*Opihz z;eNC#eYHaWth@VkCd41K$@Pu15(MGcZId7heZOjuH(D#SpWN2Ukc8*BNd~Q$p0jPM z^!3{kDYM7}g0sbIE$qw|cJzL9rQggSt5aIYx0#I*HZIpqw|Y+r`3vEZhw#0oikHu|E^tNV&9#KC>PoM{=+I?w>1K^f1EZeX%4Ou7vw9u@DVVoD-X(m1RbD8wN^TzO90}co{ zk^#<1hC-A;r3;doDw&u!2&@CgLvmSa%$ye4lfR(644X(585u2TyilO!MFlZM5}Z3R z1-dh)kQKE*^Uk<@-OsLNGk`3`p|8RRy>EyTLhxle?M^Ibl@M`OZ%uy@$91Y0rv-Na z=gQ<&vsX2qIpmE|?2rw#bL+lljSzV-`hr|uviyv*g2UG`@azh|UCVJgXX}RO5RbN| zFh!loPKbJ4mI#9@_OeUGoe+h~6@pELc)>;R7JdFXoUf2izyJPMu8;;g=nEBsLS#Uj z3vvaPD>5z!&Yo7ta9V#MbQtNopTB{>^7ldRS{6N^M~8`gEx3?^LND@3M2;S`x*%U< z`H*o*a9HhTgX3J`*xHRg6{o&M0-f2|wG1XGEh}cY&tNyRo|7<}5cH*5P264}haQxHYe)m6(n3oe4_r*FzJ@ci7-7bP{i zYdMTi_6+n7y9bWqdBsE?L5-Khb5%UYI4!sUu4Y>gBp9(@*6dTdm9~}b2uB4ospJn6 z86onQhj`laiX`K#;I?*HG&$kNqwQKA6JQEOJG8un6ZU@%QHX$krIq(ih|(4B#D#Zy zFSrgII_r#4r4iJm&s>YCKjh)v@v*H2s#25C4>3^o8=(4X0!wSe!}-S@gVo+!FOrLcw!^Zmx?&T4yhJ zr#eMjMIV(;HG&$({9B2xO7zY%YSwaxK|JqfzP-o8X>Zv!=^g`%6B`^7FTJy>E%OdXRJ1@+k}dW6{t_*zJECq5&b;Qau)ZtI6gWKR(WkKWUk2 z<7>_M@o{GSoem;K+-!l@n(>E6nenGSvAkjPj6WE0fCJq7sKQt0y!1vAa+Iay3;^S; z;0L(J{w)5DBSN?c;f z6=m!-lxCC@RIVxOuAvO0yr6PbxvMD4C=^u4PLJ16j!{8Sxw6n-LwQC;K^@4~uc44p zNl>}E;#CxTMpA;Bvg2O0d}I{6MpC)H4p)Dzkr-tJWwXCuE6XTGZC*av^uCwvHWtEd z>4GTNlLt@r0^#+$;f{xUQn?yVTH5;iTU;J)le6ukwk+t)#hmw7YhrdzFT|wZMa;O_ z@JT9meS+|;8}CXdFrOkMr38uK9q(cr>b}+GM!)BLnZ-Pd)$*7?(ozpOsC`4EBZPlb z5t&E}Q3Bmv)q!FrzPr- z1KnWjy!1gG%S1FEA1|w8cvi_sCrE#q);_mEoF4?bYvCjChG~njHMVCW%6v?hrL#OE zVDCExx3fQwV?M1e05e7nq19m-@1JJSAsf6rcm6)}p(97CIx6 zAUqg%xu`nBw(NFV2@=7d_{t)OCf>&P7xL%c(LOGEErvhKl)Gg*fl<}Cl=$VeVMBxw zWJjqSwKydT8bYYC5KNuAqX#BxjC)CYeD`!WVbVrQ=|CSYGvL{CV5Ak~;njc5C$`%) zyrMg2wU&s}Xl$=)95%?NW5O#6`3=y`8cCQW1l?b@Yph~KMg~EK&33I%8X_^|O)+;3 zvrYl0piQ0AlWF%YQ3Bq$XNj=1z_uki7zn3EW}+xW7W9?4=lp;eKMB&EHk#_RS(r|mvuf|&>IowNz-JKO(v6c63&}L-kML>R)Xy?No{+OTUZNL zLPKrB?DkwPdn}q%XtW0Q$HR)zoHh+fcM_9A>+1JN@SKPFf~rnpQs{qNC)o(<5{TzB zDS)a^VNz%ZEBS4-`E{bxJm)T|Gd+#qWF#hq-GCBFhz{`#+%|bxBMR2unY(5Ep=W1|` za8!StqFm6Y`9e50q9}jL#TEdqQC=tBuNt-HaOV3@??G7~PpAG|xqN-4yjO4DwB}$E z+IXjJEZ)l-H`ztN+xMT{-9EkFKfy8}$V$leaNr!y>i^|<=FNTrZQ;zc2IBUXj35+5 zsLf70w)FX$?SrSX{oaF&LU!x@yKrAg_wTNjs}tOMlPp!Qa#w$gP?Mh&ot?Wz$aWsp z_)wpnJN_!mVeSMkT|ReJAwuj;mEB}U-R{c=Tg;?ES|Jhd#b-4V%Y8>pOul8r%x7YXjw`0Y{Z7N~mQoNg=vAEZ!v(yDBm2V!!=wUp~$sL7gs?K>z$rbBZKADsWz3VjqHOnZLxeabIXOyq+yvrJ`dX6$+7c z^~`-yO(;Z&UfkuXRsj z*gmUX^b+0O7E>{h4rE;@eU#S0(8!VRn>4Y;taSmkmk2fGRD07b*9SjuOFs}g(uo8w zLj952dp3tVykC2jkcW-RpXHXhzU9~^Nuv#BN}-vQb)0H&yq*ee^Ha(YAk-DdItRLA z%DwgpItPD{QAn%%!NxRtlj5z}O`Fr))gnZ?)#h_|pT;n|L=30dp%h7&Dt$o5;z+xOGjTC+QSgqMHvVJq1e;*Hbj_jV3K5JCg(3TJYY zZrWegKYcXZp3m5F7060RZ#*SCd#%JG`gBu#`-9w8zVg|L2vAY3qK$B>xVuf$97x;Q z(uh84dcW(5kPRldSiwXDSBC?kt$`IEu9LCZRc3%t8MF3l8b>~E`RF0ouR%s3>z!}5 zV{Lz)GMe~i^Vb{U$-7B-XHD=s$K8Eht3`;Uhg|k3c*b#yBe$#r*$7!<SOmNGoJmO%br~(0WJ*DulcU4f)wvdzR**t%l z3T-FzWTH6`lJ?e=**6)UKD_&AT=d3*Y=m^i`&h+d>e=1lF*L)^uOFv4uGX)zNmJ**SVgFF6b%G?E%-O*D_6KBRo&oB)tf$gS}q9jfhh z3K;9Hwl5+C=FfB9H%W?PZFYwTa5IR!4*V8XIO$_H(Z$LIeTJ0J?_JQ&>Rlo54t+4F+{RgeI(VRF9fyA27#Ggsd|> zP~!4l#x3K4P%o=s^VHR|o~J@(Wv0^v4?R&`q1j^%NqdsTmcH)aBf;`~i!GqsNfuj% zdMnxR>Jm8T@e!cHDHdCX(o27SqdLE}C;&&%aP~^c_+st8xicptg++y0^NQ`fIh*@p z=AAiP2-ou(O`dz0a8|gHw}I!m#WV`81m_C!m82riaf?w9oD;4zuUwyh-eS@N=Y{j; zmGAQ0Vr&Cf2^Y+(kmq)`DsVwKs>!%L#=$lOE(%BW*BpI6SXaQ+!cl+yb;U6b)(mis za3gU?^9eh{%#{T=&-K?H<1nEIXNCLQ9(%}_BF~%YD6jH?p*h6b1&02a^MFCJl{(wu zKhUgF1(bwz0k$9jIEJej_!~nFe8?U~rKH1R*1>T5ZFs?f)s=x>V=z zpT9;XVdEY4L$z0=t%-(Wn7%!`#3@IA-e1KdsuO;13`vF)g-S72*<43;_0%W);uw-_ zPGKJ$ZSH^N8g=Vv{!{DFh3$%~67B-z1ML1&roFmYb!KBLO&XL!?H_STyyjs1Y3&AB zRA;OHPX*WLzG-=ZKYoFeHQ5tVZXD{YD%>Q9szNJ8lbT|ype>p|=c^*|^Rciq#|}J& z!1RNq5F_v;H)rt%o>yv~_k0fOfFqAs;t`$$1mS;2P?+De;L9n$`AQ?JuirlKLNE>& zmFN7U)*}_K$t@y7y71-ekLjAG9F4O1$(b=9`1AU_myGIWdVyP}fAftmK*GnO3@$0PNB6V zcVOW_TlnHfyD~P9zsSL}tauZThicjYt0=i0aL6F<7SO8;t~yTxA!RkcIGBt1nw!&V zFz?Y{E1L}}W#g;flD3)obG%=cG&w}4OW%L5@t0$ueKx9Jrq(=qzHyyg8Hyt%aa4fD z&yWAX8M?t|4Vz2ze}A67A1s+^RFC+|Es(%D=w#~PzI@~B-f}S^A+u9 zxGlma`1f*?dc6Wa~J3BMGw&z)N=+?9k7gJ7YPbpbBwR_(jE`yUV zoMMwiyG|uGfj+%mRcs>jA01j#2Hc9GI>1f+Rs?)MY#~$k2CQw7(jmOT{394fGMt1Z znhf?!6#PIJ3tgWDnjRJ?%QFAz!>@1OO#u|=Ta$uWSC|c1rco=I-fi4|28Mr03o*Hu zo^6YX8X3%lVJbb$SxntzznH)ebfU0<&te)J788+9-G04|I5-p^+&gBGC(J^|m^Esx zdd1)Fd@$JgErjGwWo!$H?!X!qOE3(ie=!SbyOOv7(g=7dEN??YdZ1F<-&+S9#9~%ttmhBanj9NmjKN8CH4J}Dp7wW^?svp7 z?a_sO=CbvZ|6F}4@H4o?!X-BOV0XB|Rp3MAe_HW)K-$$Rcbt5g=qXOyq#;;Vpv%$Q3}EOCJGtP}gC`o_YH3iZqYNX|OEyv^6egX~q?1oNlZp9G zW`2zu1)Sn9qkdiW1kvn8O0?VqN!liO?`F#K3tiPBu3Xw>qtd|ZC;aeuUDsqquqz&l zTeiA_#*!hgaj9UgQPopTIUB&r+io6SX9sV~yX81Kq%Pg(G; zjP60C(mzoB)<1v$g;sKY#hTL|`9ZW;%$v^>x5h?Ej`U2jfV+=4axKMxM#Dr0@BAywMH*U9|+ikRO_9{m^qR`!qDiH`RJ^dUGQ6 zpMs0pD-ArISBkRxSS=BX!Si%Ce}>Y&tH=%~fDj@Ex^1^(R}Bt3xLD>+tc99a3X!kI_5LZOtO)k0DAr0lDvVwa?JT|2?J$Hc6Y^ z7IH(;Uppb{J!1N$`~BzD?c<_A7r)RZU7+5i3w*DIMGjQ^bHBhVx6TtI7ej%tf|-pi zHc73v)T?E+62BghJ83?mLCuW2rp+K`P!{fCqqex*XO4{f6Wl_zy;40Tbx2(w9FIZP{M^ z_q;zQGR*$(xSKpVTIUsmAD%;_XIpu9hr!pIda=iYk6s`A@bm5Yy1>vo&+Y|y`NDrI zP-(nCzq&5&_A6=gYX6u#q5CWdZ38gEQ7itcP}8%Tf6-~uS!_~QRFRn zCF(UPOtq6fR8`q1(BLmWyoarE)KPz}gxy1m1AGz0tlKq4BkUMUiO?W8mnH?}n)Z$e|hjgHjd+v%ayU@gm`~uKqLen)#lIOcSHrv%P&1M?D=}RN2 zX0=^67YBCjnrlKg5MG%{!{M%Nf52sY=yb7m0}&+SG@pGIKB4d#nsK(LPi1w3Z%68} z#_g6Dab?#pSH!J>*D5qJ!@jpOYji{x=k6$I4!gQvm4!0^RQM`bsa1bUvu_2n+5?3; zyiPo=CFK+?N2+yww{{JvLCV*6yB$+{=ehyR678r`U)PV7dl5%vks6+yfmjvT;Jc~> z6^RQVl9A9^KQ5Pcd05s~`|Hw$=Zu=2Ytva4e=%BoG!v;}t>u#>u^R?lsL%dc9qDL31MmUz3W zE0nx<)0BS;(2)E!eori~rkFITGFOaJl^d|&@M@RElWhfyw4r|?&zJTm@K;S1K{mL0 ztSITns?nJ(`pc=)Gthyhe?B=GSELs*kZER>J4Z)PQ= ziFGO$dDzb`>C4q7yF#?khH9qJAw1-7ON-l%H|}T4${l^K>)V=F+%Er-kN0-C*(F+0 zO%~$M-k(kI(Nuq@p1X}Pcz?FCW9S(rmfWquB3AW+kcy9yc#LN#-x(>a)|xmWRb>u{ zmm*4#d2(anazJdECw-00c(8YgpX1wVM^&{`=WyxXxb#7>Fi(#+pH^@1hV7=Izb)Uq z0biAJH-pP8QujG-m!Oj*1*p5~b`p_!_b_~1R}%?^FD`!x-mLN-+){PBnY5djzJJ+| zcWqn)8vEsh?9!s3Ey*iO9D22)^o^HoV{C;|GwtkekoZC}G)cVg?CJ73^t>p@$b&Wz z+Wa7_VNirZF*bvJc|U>XdOrDKN|!I^WTH2^2M3ApQ(t#5Va@%u*3gEllt6NaiBUo} zzrX^VW8r@s9=hTn&?-}?*?xj#d!R_Qyp@0wo%R3diXWK&LpFv11(S=wO936+?wFs? zf6lFOrQ+y@@7T<{a?M>czNa$Xv&ARCDXiwawR%&rPqmnrZgJ%r%UsRcxbf=DyrZko zK^wkudEhFsnHR9h*jd10|ol`#P z?f`UyPpzMPmOBm(1jw8;<;w6tT&v(vJAeJIkmNLfqkPZ&-PfR4xy&p@DiNqdp-xTOCx0Xxy|nzmqrT`| z<~R2%>yF6DD|w!ML4UC01k*^E4ow`sW}vVC21TqMt_DyVOWF>y2clZvMkdW=mTeLV z2xLq#3~_UMgPRyh4FLSW6G_Vo+xJa62=jk{K5tQh=+fFkJRjhUI>b+ezcQ{zHM$w} zO{%Sf=7e6$-O;Za<%%EEPH21rMs03*DasyqbG2rKd=MS^BW&U~g%<`QhL}s$9{9Pp z1!(mMOfQ-1rX3HP;!JAVucYLqqZ6UCW!M2_c zeUrwc!QMPD_fhObIQX2Rg4BCGnf@-zFpiQbu^z{(B(rl>mb3v5|ReS*G^yYSO zwc2H0BefH%*yd>{0TzQ;WgxNU@pSgDK~zn3 zy;{jyxmPg-KRAi9U(c_^02cR2Z|4o!6&@_roI2)S$ophGrU_JUv_?L@ z@*VT{S5vBI$Xnjut#^+bgZY1NK)DjiyhI+1w@*~*4o*hp?9TK9S`ci?+G&KYT_mrN?Fs^g34GPfbKq}R!?d6_wyt!U> zl}XrOV;RXgb;cBewqAdQOEVNwU8BUBmUaIZS@?4^G)`9LK|F$xaNsB<89UgN6>#7+ z5dy}mi&kmRY--m{v4=&i5mDErT%+1&3zCiV__i`Rxv{#Fp~g-YqzDdAxp_fIJVzuyRN|3z zOOIm7^7{RIAagmg<7i?b&(Bo>D z0>HwsW0MR@WDeVI&C0^4-N@ln)-R3r5Yn^5ZswJ=se-Lxb00+Req^J4u63-Q#8|_UdJjcQ_#tS>!^BKD=oymBc1%vp()Rh#ZF%6v zDXk}Al{?X_%O5u4MK}kg2wt8}LqOFyYQ5W|E2pmAT==R?e40TKaP{zPk1FrZ`QCq; zCvxeye*t=h&>JMy6Q5R9OD7_O>DYrVfdq$-LSSjBy=Q;+IGhiA@0cm2ndvMLguD>S zl2PT#d#uz9PzojvX+{QiX)3AYTh)nT&$*?^9ktt{9xg#dD|ubo#aPg(ET_JkGAG^E zBCDa0#PfWyq5|h}cRwQz!=O)4X8LAXoFYv!D#I|>P-3KYz(461jCD=Bc2LgMwNyx> z6v+TQyitE;Dz?f?N_bi)yOLz7PSPh@+ZfuzzXqt%lJ8`a zI#UY5D<-GFsJ1G!<-@K*LG~vV>Nzo7b>4iN-=!@CqKP zvwZ+eE@|GY;{ZS*fHE1_b~$u~&(+dK6*dSg#Q4l`0hn6eSdF~-)kFRd>1rgG*u`bf zddGi%++Uso?I)(H36k2t9Xk5|(hQipv8vYCqP&+)Z- z#8o{<5ud8~@raDRf;P?b8P7Jq0;}S*%^lB``Yd|YJqD@ud&fr!&m;1mSLxm$sPLV$ zZ6Y=uUXi9Px5eR0o;R_r^@mSi7r1i;X=#|1W}!E+A?r{ezDA9~XhnaUnCyb5T0ws| zG`wI)j00Vs>Jq@q7+KCVsq>uvYQm~s;TefjcJxdO`)43-bi{em817bI$SV68{TD0i zr85;2VYUGEOh-M|CoM$cl6P_&Xiz(_7j}@c>ekQIqBYO;qpTb`k#YY!x-dNWXa|OT>;Z@VXY?*Os>H|2Oba&)2*ns zPZz(VjSVb9bw)xfzE}ZNvrB(j?Nooht0LUvh9=z8@FH{&s=0?x75nX{l_(!jnYMhs zqw*S1PJ@csBAxa_y1@{@T%EB(tLzF-QLNQEVFyt(b>YGC@$LNjX>jjXOQdL*lYEXo z4l$^B6%)nL`q6FNEQKRkesSFoK*g&IR!NJF5}#U9+90;UiFtEdT~2?@sX$?K9jnSJ z1w42bH|aLV*%;ACP6MmnqpmW&)bT1AnQ#P zg#Sm@_P?cx3m5w|iwu7YvZcCostMxZ-M0I#!R&OWE|~qx*_0}uUuz-ttlf&r>l2pf z52z{WRm5axz~)-vXy)BNRW2!09rt$zcqHpW-)Fz?lrmO-ZRssN~SY~zMe9vsG4*7 z-G(*@)6dhO`Uus;a}lolpzcB4@u{-8Po5r4S#U0;={u37pr#gHS=z;sqD)6Vb1A4q zkIsYTPq=pK>S8|sKE61Af4rakboTzI^Z^o4+JS}P_G*6hv>tM0auZj#7qnNysZ9BD zy&oixe@{iH6s0JtVV%_!!nOdppE}2yGEjf^1Z1qb?wqt)#-^Qiw9T~haKZ*XZ-LC! zK9o&y!P+~(6_R3}^sFg1Dh&nL;jsUVE@CGoPm1w70z&bff=CC_tkGE97h{K(ony@Yt#NBDqU++$;IwqWM7Zo!p0i0<0c|b(S-Se>#3nHg-tQF8ziQC;zftiE~Zyz5X3k9jF#2+KT2rb#1nyv=?@Iay@~NRvWv( zL}q2G2oi;)p5JR^19KSwO97TD!!5Bs#&f7YE!HlU1ywIptAve;-q-mP#5RpRkdwCE^3@9&`!`5?_Xrw=G(ZVjnf7=7jR##-Vg21 z1jwVpy##Xp{R62o%p$D zuMwa4KA)vk367AW^4<+OjhKJtJFND_-AdH@xPTc%UZ&d9DmhQ#6Qmb(+D#mX!^mK| zb$9su1a0SB<&BN)PvRP9dci~~pK;rc%E5OI&lVhnHYbk#!TI+>UM+n)pK1Um9PKl* zm&-_hqIh(s)x8Jydd>>cJa^%XeclqSAF`j_j2crs0HDjMn95Om?mNx)RKClw-~3^Y?m^Ww<=q0Ds>-!lP^d>YS@p`_@KBVi z9GStH>;f_C;r(^`PLp@#`wMlH^O34rpGfc7T2nb9@l}+H<~nQnGXfN=!i| z0Y#&&t4g(LE&lbxnzT&RQ7kWWcei+j;0M6>RCq2LD3t2uPHmD>rO}6N*6zbL14O&X!Df|q(FlxDFB+!; z$tvBi%iaxgUR|>ygoyY0V~>U7W|usF9xIE&qyp+C{mQk2&c5sy4j9uZ>VnI2z%of{ zn2c>NZ_#_d=HwQifw6)a^Qy~iU3D2Llk2eR`rX}CS4~HxNYALR?}Hyl+yw zuu_t@;TimQ*Q+Qyd%%#@Dm#1t-0QCl+=#Cvd9PmZ7TLorcni(p1-{Hw!V0T@dJ%D% z)lDVwwbOh(UE3#wiQH0sizeUKN5xMcs9_fb&n@%s2=6awpcb!f5@pvEk`W%ZBI1f>lDI z=(ZiBD3w!lrZZiHiRx@1>dPck-oTRUmCtAJ*gbjAzfS5k{er#2Fx%ALqrs#z6@Dr_!=?I-;{{KK?N zp`trx;0nQw_!!S`)gbVz2Z5kac32mP+dL)(xQNAJs+d##f_E*6>blTi}m zP60gy*F`DTXN|k7Paoe+Z&<>b;wkr%5RNcC5&QZgL{>k$5q2(9$tVYQk@ngh3YgI4skc_xAYsiA&b^6ufOMN z_;tcMi=pW6Xg8WF<7sd@1p_k>cO7h5et!T^E;$-d2ej3=?Ha=x882+RUA1ikG4=Rd zmdaxkv=f(idfTv^Tkwyws|F{4uvce6!GuU1b>-8YCKcX)XkfLr51Id~zY2V44 zUa#0d5)`?jjt_f-5j~0iXC{ZLS?@3VZdj0YSwoE)v_+bZvZUV<Ixa@1OzO@3vnL5i>>Y~&P zU;w$!V^$or0M8{&mHHba3PJD#Sx4ioVO}&ODREpBf-u|WCC)oC-VFLLeAWo^<<7eR zDJXQ>QWR~Xdhn@svV1GkRH|h~=OW#@$cG9zp9zJ3!QyrvXP(LA!(?^^!UlxLS<Fv>v~q+@;ZS)V-ToGiLPOynCpTX~Hy66hfF`?_0l8B4mhAVL#zE4$hxab(wIEw) zD?}N8>f4I>HD8BUmxFgfUUv0Y zEk#TR$IRA-=66X8QxFvH+Bsg6Pq%DF{$=*@(?>al1wAYDEKe`nqvkqa>RTSGGvJ3OX2>&8U3_ii}$EP_zaXvb(&sE zRwh|nbx|NnsIF%9^Tt*)Z4j)4V3l|??r}G7tABKIZUJaO{`yy;DNyZMDzt`4Y1@{| zlX|^Mb$%?pS927Db~*q;A4|)ou9MlFx=vQJ);Q^zHffGT*HTn)7V1QbSacZ)U!EL) z_IT_7w*0p0@w-)zu#*Xcog1_cb}yGB9oUk`ICO3-|6+uvm{|}<3GG~8^+X;ziXbnf zMQ{so1LEAn%)qwEwYba$ChO8XG>xJ~7N2|qZ6(EC^s!&%EuPTtAe|sbY+FAXj}^;* zg5`i^hGmCsl^x9@ss~l&@l0)B3Y1rW)7NOGvfm_9U%HLa)ZpSnj5I1MjzL6h^RNVO zNo(G2KH`@3cbMd;PHSjG=hIo!%@Qy7qf?jj=&VRmxt%vHNGG?o!=!LgX`QO-)JN|A zoy0q9CLiMj2bG1{J)Cjk$B_8t3I++RISi_QZ=5@x z?5?%2#MxOCpTiV124_>gBE#Gpwl2#%E@CiH$rk`C3v89|DgNd^+(2%PA63Es6D48sRdFYH9?zZy8j$<5MH~oj zSYlq){XYKd6Y*37X`+gMeGdN4IMa=|CFZA2SXS{7Z$S(lwx;qS* zQ@}InDX;Pv{XNnjp;AQm(qc%ghPmL-Nrs!-Np{9(=W-d zNU~pjxV;b_08uYQ2T56`<<=k}7qg~e8U zhOq~51usj@9RT7a#hh=Y8MT#(>*XwNFf=Q7pLJ($FfW*1NilLES|)BIN!<5U*HR$> zudmrsFujEKwc6Z&zetu8(sx;%QaP0*(bs8}mp&E5K%*GR2qTE0_C7?Oq^@ob`ap3d?93VMgQ`pd|lk9 z^bdd+K&en$WxzM6t(KZIFnnp$t7AT1U0)klnK~icWzPeDti_B9!7N@}DGTdOS9LWX z1FU8omK9rg{mn8rKo;s!ms*V&a{z=_D~$7Ls+uaAb4!AfS5X3?+>S1Qt9F?ddy{rat{~q(tx?>ApwSQ%dbYf1 zjhenWzXfd>HS;v-58h;>G{3vS4ARXyHCEdtj8pb+*m?n#tLYazjWz&lm<*r#Zl3*s zQt{BLNc37;A9OZ=lw5+QJn0So0AQvCo;Olcw}0k;gu^%(1E04m?mZ{VuJH^fc$aet zgkrzGB8z6Sv#Wjn4;_GldM?z9#G28tZB4^BO1`_^6U~KM!+#Eb&I+O9lfG|J;6yV$ zHNcdD=_fvzS(ItE@e&|Do%!?h=FgMMw}5(qjuUUklwivda5K3Im?GP92hg;6ks+lS zu{ITdEPJZTM%&bMGLe7QbTm2p^XTZs_^+q0U!8tOkK-S)p6rN)QST+k;U|&NG;A=v z%_LvNy{bIPQvZ|^OJZUP-%wVW`l>=Jc}A`n9-Fhl%E$edxH>Js$&ULQPNcdA`dU!)s1q7e*o!vYYbjeOv%Xa2GyZHWejTdtxV2-E6l=@oA z)iJ8$d-aH`Ia{df-~gCh$}xzlfX;8T_j@^?&``|RyJ0}ZU4?R!A&83n@`h?Q^X)au z^p-WF;2)L~beti%_mYsKgo^Qf@&%}WYBxDjq`S!xK7d&hq=kBAS!53`M+)0XjudVu zIa1`i%8{Z_S5EoxmGdy7sorzJImsTY^yI_#vVF%249m>rz*UC5lAG-Z1R^PbRkKuC?!@h?K*nN!Riheo zx7Ife+#*ipvx`M`_!Ile9X#(HoxVOC9sM-R3-*}H8sHb8W^~uH+=f5VY`kd;CiaN* zH*)%s9Dn!Xgwy(Y@6Yr=FnQXY*To{na`Gs+E;@*_bF!5qZ`{k*Rg$)rys;N_t&T3{ z{c>KsAZ_Ne3*HmHnVeDnLCkf3sns_}Qr5To=a-<6YbemD68?04x&P?rkAN%`NER01 zPm#O-bUZqK**ks?3Z>c|&lx5BcS+c*VQ=_}f3d)4QeYJW*K>ykg*pQ&r(IIi17Orc zr)H-gT@nEMKiS3I19d0z%QmN4>Gr8s)9m7Qj_DQ%<{frQXX`tqY=icH=gG|iv75@t{&jIqbF#!m=j!XcUim{Q6v}aR$(b~|USnSr& zWv7g!KD)T5rM79MzJ>k?CSk|e3c`s+y=C#*1e!C!~s)EI9Tba>~a#g2Ca>OjM33Uhvyzplj9TR>(^( z^1;e11Xy9iei|KrC;Q?Ezu%l@G>7Xxia<`yX4Xl< zo_%VV_MqO#vl z%&&U;2?ZMUBvN##I&r63Wb+*{dw)9$w)wO7h%Yu6i+!ZXNhctsl2Jq^hLgvH-p{^F z&sS(zea=?s-_%aw#31X-VQjbPlL5x_R z)Nb>qI1!A00fvL-@~L;O{ruUv)L#JB#US+Yi`Rpbmwa2&&pZv#O)^$ew_Uve1)9lI z&~ZX1XKPq@PmF;#XM;Hr-2+(7F1hx;S$U&eGC$*OA2w}?iXb#L$L<6>nX9Lvn}s)i zAq~}5O7AZrSS)gUuwasb(!ZuR^XALu#9k;~v|!kO#~zaKnj{_(opABSFIXZh>Lg&T z_HIf?wzK&S!U4d;!=u<*ARU#=qbJv~ptzkA$+a5U+mkj@9ep%DuerLsKVZluDic)2 z8sPao8@y!pdNlojvMSCrz;*`!)GXUiyd9;fY4;Ri0LcY1O2%c2DjcZ<69fPSzoHb9 zE1AT94^u^qVGQsBFbY5U45$Q#BKL`A_=G{3eF| z{pkkoSV7dQ%UN}a`*>vspi)bd%Ixw`#{+;f?a4&F?xhV3^3{I&`}bF;Cp`9%!A}yN zvroAX58j%xTe{o$Ccy=gvFg&uU=spq8}{3^6{9B^xJiVUS5{R69T|Z*jp=QnKWNe;wmDg)Isk?;rhs z{Oa_i*MB*Bi|d!=WNu@&yioUv^+VI@GUx1)4&s2R1QVXER<`R);+U8XTw~(NM~<~D zwy#Sy+x+;_e3KqRb3YOUH3#wAo-hc1G71hA^-ofN2dImew!zES$0IJ>60Q-0vZfG~ zU+DOPLZMW_z~{P6`t?$J?H%8o*~|#6`-u_5Oe#D%U`3@-tH?%Tr=e1SHCm+%e6L;` zazEztT;QzaF@~$y+LKqiF%zgm_FQR4<5c=w<^Z3Ia2wmi*;d9m+uJB14TuzfLc}H3 zkMnkcaj}2S{0CSmutFy@!ov)n^ZMWy5Lm0S!+5RiFx3Ogjx2o;*^!wYWJi{LlkCXs zF0um+01~c~@W}FAghy8FBs{WmC*hHKVNTD&BkLkOvZ|Z#u&G{nR4hC$fHRWEe&T&L zGL=er{LCy)U~^}a&c<>{p=c&WRYb1b{`dweR9LY zalcB(+pcn=2X2yv6~AHZY0hn!%dG21pd4o1jh3;wIuOLiLLq(XBs~8RqtO$P(!{*X zDZiZ0ucemC2NpZlKZw||)ed6ErQalWoaruhV5I~CStp_6Y_|&p-hKIhSs1B_r6tET zXXc4d%dy#DNwl{@V5QrwkjjNrc=OJ7moQ5xl+nF9%K+xu_RfoL zZt{TY^d_za6?7``<*b~49phPFaJ6$AeOn<34NKwE>VIa~?b0Gu5r2HI!zq*6;l&dW zH9IkWk?HbMi|*FE7*o}Gv07d!oXWv$YO;fPGKxkY(1FyilOe@*#m;9Rg%?XtX&paX z(1rDQ>Kal|>E~V(;{7c8ZFmNtE_?&I{Ri%>ao-Z$i-1zuxd1WvB)Akxe3~?; z0)wL0QLML#0jtpY4eq}gq%cw3IDGW3uSx!#a$tuDaP@rNh`tr!3il2V$y>od{$ca%l5O1#n#sOJh#hnJ5Q@ zi+$5&fVlJb$SX*HTgg&C#y`*>wZ}hzLI%QbxicYFxIkVu=VCgb?u2>>QefOZFByk< z2~asunTdMFgS1u8c)f8`6nGMTY`m9*wu)y`W<`HkZO?FON; zaOe7H5jUKE&Kod4Vb;aj2LDWF@kmU=bNJNj^@QO43BXF7MwP17fsh1nMxR8c*4qh} zd;?|m2{=_5#luj|1xXaTB(~FSW236nSC4x8 zud4J{T{@$Ga(|Ra1dXeK?|p{>d&Y&s`<%IqT#fP23uzct8q4GK7&mtEcqP3g_`QX_ z%AJ3EhNQFtQ1$$Oh>8Os+)n;sHiydqlDRs&UC;ahD>X38G@JJz0q)iLt7PCTw=1_{ z5qS+y;LG4JA{~`pD*Kb`0MWfu8!{;@V4cTwOy_-Kk zS?&G}zIRB)rtDFzzbym;Y~c)#?*ol_J)4nYdWhtF!+^yXx_v1b*~?my^MtY?`XrLY>=kC%&;>Eu8Td42tLr z(3<5&+{mfvwVa3nxq2=}?C^_d2M;mXoQWEjcFES+UE;9Y!oMyv?SwO3mUusK+eWa- zW$doc+cKF6EtmLeOXugF&&&-iHQ{bq*ln7N8)tWFPv<00MVEJJu1|YhE@aC4#0da@ zg#f%lO_u?s04jwdFauPaN{Ed!M^{O5J;g?f(OmL?FU`(g8lCP@`BT1}kd_(Q0YFxY z!Y4Rp+^%+7LjiOG93`V_+;8=rCf6b?@9D##Y~wC&kW?=iG-oC9CJ8C1ut;w1o!|oD z1(B&{{Tm!GqC0XI1iM<*+Q83pWa))cq;nEovN=X)0}i0Ex5l)+kax-S%nsgGJze+I-v+vL#nxoyAK6e}hCs!g|Z% zptoHd@aDnI;&jOL>W6cETJRnW$Ynx~Lnky_Lnk!V1wgjr1adeU_x|*f{(JP|&!e!7 z%AT+}A8;fPOAP8xUE%qEgYDUZVDXK6wjfhJ+@38cY8`Om^GaHktqg~Gnkx2eGm~of zZ1H`~ioGOt&a_>b%Y*$7dq3RJHf%3WW~uS)ZE-f6fpE=~gQS!=q9R4Fwz4)G~xTc(bGhkrWh(>(_y!>OL| zbXHal4DYR+-a@}d_xku2_jzcJ<4^AvQrlJ6u@1mYglUzr`?svx!~@7hGg&ShybzF% zfb>n!G(t1yIi^(%l8nmqbAme+!nG`P?5Hupb}{-yZjS%dKR!7;IeH5k zrb8ckLp;jQkv}CxLBVTT4pWK6jBQ39{rC~!cGt4IUD8bf&b8p0PXR1;&2FjXOWl!$ zY=9n3K94U$_>6rjCMZ;$)YvlDbwdv@73VDdeYE7(W!jp5aasoecT!58;`PF0FMb)W zDUR>In|!7Ln1*4{cj}xd_~%Y04uCCotL;+6;V3B2rh_fYvjftd12x$N^xbRF7Beb!NHO=0|D2k(p*RR8IBw_LG~h!};s$sg$8G zQU>pY(7e$T6hs2)9yUr~ zexh@KGe`r_@j@rx77x~0?Zm9nmvs@|;(9n2F+P>_%5bCHMr&t4Mn^}lk4{fszdog2 z@YhqWhf}g!7LM{pNbzGBM#Jsr3rqP2bSCHlH+i+~4JEH$v*yts>x8X9`PQ<$y61E! zR6n9r;QP3v*WC%s8$nV%7xVc}BZSI;VSR{y(4A0h8Y8^_hB3mc_jNUA31Ha+AcScK znZoJi-n!=w5b3_}0O^fjxUw3osL=gX*Zy|aMpp)*TlWF53L+Ct0A10Gxh`}Tw4m@D^ z@a*3GR<`3vUYP(4FnM|U?X|sr+sZM2>&b76@&^=)eR>xnO;@|~P*=!FM+eJO-?M`O zR`tqCRSmm)Sl-A$Ow#BQgwweM@d~$7h+n{s$qNcT*ApSo)v4i=FCq~miKv|XWke$B{>RjkDIM%3ynaf^7}UE-d`u1M8s3ztFennie0Y$IH~k~z(?@t$gJrlX8g+;b z&|pmR@$dsFqO*owr;2w-4A}1pC%}rCy%|FXz{qm2PLpcf!Rz1Sdn?}?%@agMI6-90 zZnZ+m41tQ?N@j@P8gwa1TJW2HM#s$h{sMHo(9r}($bd=!Wl~Mr0jSJ8mCrp*f2q|? zf1F`x+`e4n)Z7TMA$vSV*=^sPoFTuu3jscyiYpHGBMG|KB-Mt0*#6;Y*lGW8<1`9* ztLNDPAPqy+%6DzR6~Ijm2P9l6&Wr#o1!$9cH0t)21cel%#(%6_wzH~#=*{tEr8_@@ zt<~feamQ?Rd?XGGftPKnP1~A(?;I(&*~7T~V@y_|x2wbx@Tq-BLusJt9?Cr<<}yLjf~f9TMlI)S%P5@# zOWhlZ37xUr-AA}y`x9S(jO2OfOPxZw4DQQ}2QN}|L zj*mIgLsBb83+kw*4}`oB8nNpyM5rV}TdV{7w508g_3zNS|CpXKe@Au7*O8!92_@F^ z%ake|C9+{hlol&WrTP`!695=(la@N&p96d?>}B#~*tW)9T%9i;<9jRL(+_5xb$RwE z>*&%6rbv7~$+r-<$kUY_kcmjKz$Lv(4fm~IUlygSabFw+UOF;QEBnwlGpRi?{+c)KjS0L=Az zg;yWZ3%nzG-thS+?2XR&=;KFtcSsbOH`hrQiCSWR1&DvZj^o>##o0Pzcs*BbVXIye zdmkN*w|PpbW9f_pS@_XIegT;2TWSA9lwf=_za_14Yemm;eYM?#wtXt@(IIovJyqv= zRh^ZJ=*@2`$pW5n@p&(SDXWqe=p4;;VgqeMqfTHzIjrd}3)JIUt{&HP;sekJ1&C8a zPNjH%g$5#q!vv%ru4c;>$SXm~6Q_#*ydU=*VK4bQ~731S-W@9-9IS0ilthIQd{;Ye3h;WZ|@Xd&2QVK zul6s!Q?VOK6X0{BJrj_Al=cd7x>U?_HVb(g` zo``r`rzaInS)`K4l%3$5wx2-H4;qXCCO7P#WZC7PWP`~BlXJ{SzB6Vde*sV~Al1zh zBdj1wEy4-HYY~MY_|@LGd<)g4r)YbcFG>NA^}%s&&hqqU(DFiSn)tD)S*~XP%}aBC z{>|Q34qGof=1;`W%TzwM$*?`t+NMU22tlZ}uvkPX(W; z((^{X&pU(o#n+kod|D8>(BB#67XVg&08Vk#XT9rn)Tas;8()_D9}0qk-$TcMRh?ot zN=H-hCI1zI-w^uP@XtJ_BLzLAVzv9h_gvN7UD0`=WAUUH*t_iU3bVm2Yv)~#D zLh*y%Le>Ny^=xt+iK|F{33(Ylr*Dy9rbv*eo)J|b)Eg+30f89g{}Xg3j=TeZ>-IX) z(>$$TB{cx3ls?fv4n9!uLZRGkh8+-k$AwJAR%1_iH8Sdy$B>UmX( zb5>^>UYzPy_0AX|igc%XQXn#aK^TQybzpMA$c8_~?uiK(XT)a~L=d zgO?cW7yZw_E~4MKFVvsCnZ5{Wg-|OySFQM3FKD*%{f2hS-b(9vNzNx(F`b&)+cdrB zVQO?ICqloI&Az#i0Hr{!5^59GO2lQU0BXfb#ARv|+4w$t@F649&U{XP75m(q5BU$$ zRo&t}`kbYpUmbq-;lXNkbdZ>;G9Xj@PuW+k3A0SRrQ4i2@>f%k@#=O`O~SYH+r^CL zQ|b%zKUupboIkm`VeQHD^R?)|BU#PqIlk;8ctL91A-;Z~i2anQXXh<8`lFULkgNMflmvS*AqyTHIu}gU>VNQ z6w@*sxgjrtK(*9opuc4@04sGGR&SYX{B`msTopp0P`h|QBlSN!2Wg|vh01tY%mKU{ zLLLw_0H;j~VSb%~Uan7C@9z+Wqcr*IplM0#^obOG^tCj$PB)x?+d6PQdH}1_uEVi_Bv*1!jjPF(VCAK8z-@jlZGntta6nXI>@5yzv(z z&^-R29zIImufHCBJbXka4xdk_^&`;NMs>%gihd?*%{*#TC3G&XuT2=gr48O`o%amB1%RJ0V>q)2j8>;f$zlmhum5&NTsZ$7&ip z0YE89YOD*XBICxF)&H{~@Y;97Fn>y-uyi{$C!U6s^v3Ck*DsBAzO+uFrty|U$*Wd2 z3lX*_@hS7!?D}>Y-4wIZNqw%*l-2J{kO+WIpGKj7-I?I~Qcv1z*ZlZizn`ko9#)b8 zG5-%sSL%uVU-FU_#O*_^alPAE0a_<3z{;shT0Hy;uqq#F1vqpUAgLZNwZ^97=ekh0 zkL1E}zHFj?57(IOk;uxy*tUxdx=6WccYoC$>iaumBWhsCwB##i$5tKq(i0I+k z^E+5t-DI>#&u9-?b>Vm8UHD*Ye^4~HP*uA79Y7arUp7r&s*H?B zR{izno{=xh)eU@hUjt`WvZ69^JlpELnNyd#;f#un5KcOc5MBebUl8vAdv(_O#9cv3 z{l9zlGjddWcytuudBZF0&j*C*?!s5-mp}WO;ja>2OzPq<>~~Lqq7jO02H5+I#x>V} z7IXS|GW%_KOAjG009H>}c^~cpL@n?<6NFP|M>u4dv!BDpr&+6?!&K&v$We0uO92+F zOwV_@+~fh#O*;I*W`4lU_0jOd;QtZ*DhcXSK&O(VD}JX_q{DmYfDGE5DK+lCP;gjh zv*ePBlDt4_X)pN>FoueSzk4yJW0k&tRN`wRxf<_Q%~9A)zMd%j3I-+@%v7OKi~$ya zQJT1_18^n)CjgVU&V|JsfI`b?x|@y=zzQNF6Tdxa6&4nx`}I9X|uCW(-&MFhPWWN|wds zmId;I7MDN@=cV+P^|z(dy6q@)vmGmKF?t(I2Fxg6+iM7&B?6g7fYHx9GlBF_wb2-b zzlI+~+bgG{Cr8ot^9PDo;u`2e-4>-ZcA2=WbFue35MB_TZIMsfPrA=;7T*I?31*bI zVONJjBBgqtQ}%MI@@5w1GJaQof6Nc-58-z<9@-DzeH&CWb^6WdGETxus2aEUy|9re zuZPex?;dFe=Vd_Ls9#~fRh#*^l?8LBZ17&L34J`1H)*8X-@Mxp7rMi(6%PHi4 z07NCZv}^~_wZ|kiKlqR}Fo$p#4{5>l6sw$lip@3SzPPATp;ZPJNlgcf7+{QGhVX>0 zi$Q2Y|8TZkt0~UIdR0}KkQ;Mxin6OXA#kEqc^=a+H`^$X;?x~~SsDOfCHZOMtGtF& z^V`YuNg6f!M>Ni!&!1=+X!%hi=&Cn?Rj+qW&qw_=t!Fq@vm>%22(o=OtpTR=@r~Ahu_v1Lo8zE$4s~ z`u6x8kWzTaY7QJ3;RWGzatvkfh|?m>q>@mUz^w06M`^-BQuiSX(!M-mw(7VYrO z@HZGHI5q(!kxAaX#_$FsazP9g0u~Ig0vIXIAsFEH;xki!sJAPUP^m=-V;a9#k2aMy zA?a&bx>p@!M!#hPqG5n>oPYAXWwHMejrm_(EjFf~>#OB*&adg=iNSAIi(h}n!V>g_ zU8ZT`$Nap;b<<~=@R?-J3Rou^s|siuU-p{yhF@`rWOup|JXc(jmHw5X{@`A^Y`V&< zROiP(=!}Mc19pW<8g>x}T{};uxYnr{=DH=_OGY>E96Nh zf5F;+yMvqy6QC)1e14qSgM@A2{%|3b)IG&!(l=Q=xt^N5EzI^g3KB~uT z%h%)=Ae9TL;qIW=5qZ=(pjMq<*QYfevn&B`Eau^D>S;W;A%9<$T$L+ULDsjBWYk&JOBrP%PEu^ir9Bw0)eW;|@hKXqR``oFhfv^!cNj#_;>w ziU0`#(y=sIrOl5^bwe7DXFR9HPz%_R$n%XMjdq(!=;-L*+&c$I!f296lIh1EkLbzr z8@%KGi?_;eQ5V9=+&AB#2RPLX@X_pXYi{yBxdFy%Fkh}*=lq_=q?;ML?0~RDxz@;k z)pX(Ft7{0;$T`gSQyEu2WO2{XlX8~QejP##r=@AE&COj(s@G^v1Q*|K*0Lm0s@xx)13o7~YlAHwX4`MjtS2qVDP0MpPdu{W0PEsXE zM7?_Osd8dGzY5DIE=h91JEJRq$SnjJ*jVUSS>Po(oPIX_{G%}o|B}w6fWT&5B~Y?&NAWQ*&93+Q7T+&?vh*U}X-k)~idk_eDUMoy(Y2(vL9GC_EZylsF;5vJHZ{Lq%zmdKK1?1jC;aaFkm4|l zLq4p$KH>;?*jDxj9}JHUKmI5gzgv&rN0N#@upRCo6@&-Aa5fNJYduIlexI8gzW{Bo zq@9|(+E%>dD^>tqPq6Nr`aA$ zOs@?~4zXEsBLZlD`vCbm4>+g6i3Iqbt)#pE`tdCOgqr^tL_ng{_E6Ky%dwRQ;%6)r zv|5+E4QiD(-AouOH~f?;FI%5dH5=BG1)xTqNG6Hco#G-uPFl=jK=#eJl$An%XPo5eIBiwncd}Sjw^vtp zCDiNPZ|8m9aKJQ~X2ZJe?L5D}BE4;WM?o(!@r3^-vR7FIeCAMA@q) zP&840Pp_XI4uJX>ZNd7Y=K(cPxm4Gf<@-vL-~YnC<)RxztPq(dzHC`6aqRa@4>Y)c;sG>T{a^f(%=f@*4;3^~P;U(H1Hi1b zzl}ar=4HDNm75o>ksNp++_cK^nJ*izsuVY%?72OSDu5OOWsmvTW$7+yC1!0td%u($ z^k_hU!_tW?D$?7&EQM}OGhyBpxHXhn0q4~%pkOi-6_xM%-lzd)_8ED+EYgUPZP8(W zIdC}_zfC?ngcqvfF65t7$u~`vdi50Qd)?%c^3PKW<2^ix|>=<%z;v&m1` zXMyE>-H+zxc4)TI5h^SB8}S;b_%^-gWx!S{OdNQZ?Ck>Piekt#WOvXKOa4_9|3^xN zej9AfVpHR31rrR+j0CT`LP3blP{ARVBn6?_-9$NAEx_iu2rmoGh*{ zlB>o~vOuy@2Ub`07IXou=jkm_xxS_ zW2KX6S&fY!uuiN9?PWciwPw=5LtypC;P(ZK0j1<%MfAbD)_}TjaI&Du>TmoQz8vs!5)pboz!(BjC z|6n$yY;R7ca(O1gmsQq>AsceQ8W}&!FoUL@Gbnov44mGyF{Rite@4kz;+&@rf=ns@ z#4{9<$R%q-OrB}WODLy5}U28*QQTOezigQ|r6-r>l7N0nY^o!PV>``mojX*(zXwxPe7)U&QRoVbcLEIA4h#*Mfeb zQnQZ1uer+@n#AXFG>84cw&ND7fAcxx8c(W>3(x3JE@2@Mt1=|uB>|4F%G5jGQQR6A z-%#8( zasZa^vk-Asa>;?@o3u-Rohf*Y7YwW431F;{E@wc#mtr%3?Ose;xP6$k zD3ZN>v%nbe;qr$kwtVFW^>Y7ZA*hF?8xBId)`f-dQIJ*60dANs_^9eTkG8(}nEZ=; zbU6GVVoTw_aT*SD#vO+_>tzDk2s&rAU{1FjRbNO{WxmgVQQAJ0e_7WPs*`3}S-OYY zXqUwUZM4hsp*Px!D~Y()8sPg%wPXsdoSei5<2Uia_&huqKS;i(i+Wl6VR@tyrU22a zOH#FUbT_0E8N%t#)Wum&H<3FlD zJsyreeslzAA<&9rf7+hvdaf_`+^l&o$&LB)0}As@>*dF$+C0iUncO(0r%WGzSx~Q7zTZn!2UdD<_0&Wvx%C^8+iKSEr%Qf5$uOJmvz}Qm{PVOkJ9) zD&6l}>54&53Ky!}QRXCv#afl8URmWV^}gbBw%P12K-dW3k*3ON)Ia`|?C|q&2?CiA z2&)9=cGNp(1;`x8DTjGddqu4iYR|g_r-{3IvwTwZg=8}i1>D70WUCFpQh)`QFH@G! z?^`|vSH&-le`2f%r=UZ{wjf&8I;R;*63gSkcjZEqX z!^p4-L3XzB^!MB!IKEE6bAj_gROG86M-l&I>-~=vz9GT95$VBDs!rBYDn1+wfYz z?a+(*e;x_wbAxl1*(BV-DoRt3%e6d^SxGpD)1>3}U>}CGt{)#xYN;wdu-%q+0^z>? zK>$`ret19|V?fhgn>VE|_Z;3dR|pfj%Q?Ix6}w;ZE5ZSQ!rJU);AmQR-_PHn!3AIk z1nH^n?R@Q=_GWf^b#=RpDdefPMKzZTGExlyf64Z0t2~!dk90OU0kg@2+vMb-VLb^a zIjc2}-a>>=%r$~Wp{{YAReYmS?&j1nTpN5|X{6u3r@&{D$!Ppp1lhEQV*VoAm zf77x{K9Gok=+@)UqH3|toH;3%#?AMJkM^d5kU!4B+$u}&pL5!{r(_v*+Z@x7IzOt}?` z?p6TC0h4Eh$)~B&8smlDz)fqsAX*5~e<1XfcCA0t$PEZXLY!y7@fXOILauzM4SB*k z1CWU5MSL5nc}Z=o*fMfdJjX%D1JISAYgqjqwp;y0&Vu1zss!W*`6$v}52(U2{5?R; zUaRXuhDMuF$xGi=awG_#dd=5Qu@s+M{><`7o4OQV1udseRWYBg8gc-TaGkZuf3zOk zc7N|K?q%V4kPBK~XchnbAdeaj3>=fV!@or(X^ph}8#W>lU8aH-L)uk4|HgcQeWByy z4`ib>d$Vtu?Zv*OtO=dr%~z#nU(L7`3+r=V#RvAsdo>zIQ+JcCUWqon+ke zfk3A2M;Z|iuAc!u7iJAX{pEH#ZCQB{1_-Ym@qM+|wo;|uDOT|Sh@Mdle+4k0nYJ{V zYYaJc!f%u7`8i0I>Q}I) zxL_CJfRpiy=CfgLif;GgJ{iWKFApb7p^2>w!n%)HpA`QIYFLp%B`I)xLDQ-2IDxQZ zC_r*1P5bNy*`U36GU^-+e^Kj{jAWqL*ZBuTGw|u>het7n0ZuQ3L6d}}Uqnh-4>us* zjDtT9*+46pw>b$N0ArdmxPhu*8-%@hj5bFulcu6cW72Qy{pMae62YQu~LA2~y$hH;7fz93y`8Fe*BpTaAVjGQTQM1Wb_%G)O^aT^aBwneW5+Igey>6M)4&a+koC`zGquH7OjzW^mIq>snZ3 zVOCw=e>s+^po^p))xP^W6DtQm)niJT>D^H%RDN z$t!p>gh%}#QYwjz>FSn9i2bUwo7WcKgM?R*z^9eoWuqt>(Foz3UC~>i@CM-k*K$Ed zVoNQ(GhU}F|BjH4S>8rLpZV>t{7e-tRM0Lce@a)fbuJRyYDYr+J!zWF@UrBB%Inwy{#6jG)LGTpV<6Gf8s8gTK0lHGtTvc~j1fL-4w7dx_WSQe3BFgjJ{m8g ze^y0OnJy__qSK*7qvQATZqf}`Mk|W!<{whX|DOS`vf6=Mdy!!K$?<@A@j$*p{ zj=pLW;bxLXNM=NGQnZp>LZ2?A!tYyR0aU6P z!wY%V+GDDY(}f8w`{-x|I5q3#e+}!^t!}Y|tPkKE3t&cIQ^kok1B82~=`NEr0OSJL z=`}h4Rsh+qGjjl(0P=443GsQMuG3OK)$ukSD6gi!-?XDTLtj5j0!-({*$2}BzE@2_ zqM5o`Pyn2(CtsBsAvr7>@XHKr?a_~4Ta6;t>1sx{>@PgCrpVyM)WoMc>?I~KLQeTeaw!Ec8?*m=^THEzGTH{W7$DZfY$qS}> zC9htL z5Z(y#fP)CkT7n3?49H7hY%$Tc65j`k&S(J83g9U5!)p5Ncxe3hPp?hCrKn)o<{?eE zKKbnE_YInve1gqHO zYS_x<4G~rEgx+ZuCSJXq^uAB;(p;Q)^@6f8|4&z6S?v@BE9J&vA8HRk`eD0L4cm{_ z9ecrx_0{u_JwAs+uXh0KT%U|WKQ-F8qf$B5B)xS{ zc(nPFrJTQ1h3lxNv)MIS01o^0Gn&vG0A1A&#sb~ib$MU#pI+n~>I+`jRB%)F?5bCoom&sndSG!x89WiG59CvQ*aY~>|E$pvMQFPKFEyD@LUE9OO=2rlm^UqS47lTBElT2LSPE zb_)5Ee+DHzW@e-;#(XrBc6Bm1nqdJBi3Nfcgej}YNV`;Iq_Nk1hX8mHKdN*5amaCK zX+RZmOsy`;Y!*!h1-WAEUDm6VMJ_zEWRgzO_9$1E0}m(*p;W}1M4ziAC@cHS40!bb zIgWWYrhS$Yf2-pTHp#=fVt&2!DeC~xnFji}3CJeW zPiOFZagV0q(M!v3z=<8t2X?NS^I=!vhCmyegeM#&({J<#KhnD*No=7nGN)hma4)e^ zW^wO?N4^;NF}L+a9Qbwt{|_x>fadl2+HwI?7&VK+_KU{@RR7b`rBE+jiu_;M#RYhw ze@=!*GSQPXS5U=2bA?G4Uo}46>MU6m4Yg$O5F|1(E8O;2-NGG0{#+^u<;F`ps|X`O zP)m~f1qCm>Lag-1pAU~etCw-%k8XZw?GIc%MtgpZkafLAkTQ2d!XA;fOb95*C7K+? ziOq6jms3Lh+niPhF-0p$DFt`LQ9Ea?e=f3~a@5XG+&=1n_UiJk^ySU_%-=_gY;3w2 zSzRq^w%{F907UrGNFFDNAG9p=8t9<1%0yAoAW<+Ax4QF9yxi?i;wicMZ`KY zi60hF71zGQZY6bUVJ=mpbdX!Sm!u()S?zo69!7mhdnj7~7wRN9$z)LLv$kW|es z>!A&W1`?KC=`zAxttp>Am*QdP&AZx8Yy_Yxglfzlhv!`uoATu)yB9DWZ1|D~JjIy0 zxEeF@At*$Ga+8d0ixVVwHXB&nLD5|Ug?QW+s}n@O-U_UHrw3v^gTK#bg|soJf#afcfYSBJ{PEAV)D#% zI%jNlYN%+sJtFZjf!VJBC_=|t_C{INxm#N8fXE5aG%1})yIuMcAv2Zuf2g};uhXi8 z43(e}kz+$_ZMr)^^776g?0A};UHXqTPZh^te+uAA-C#@=n@nzuBqr1EzpN$zKvsZ? z&D$^_Nrj};?Xkd%E)viu_-6uEZMr=guo^D$Hicak^)Yx4H(8WcLnoLbKr zr0-}Zq-D>kJIK67F2appe-KoXGlj)ACa^{b#;Uu%xwS$tQEXVLg09AwnQGYOxx?y! z3-VmesL&K@*y#j;{;~9>jL^;PPM%hx1pu&=GMw`HOxe|R84Oe&RL*MKsjY-0+t^Mc zMQVhiU{(6XlN3*ixca~#Pg7M*ABUOjQ+1tYYF4?Xu8GqjzAv_|f9mFOAh4ViW!a;a z(^9A^m2xm9@j}AdZYP}{IH1bHq1eOaWfaeSdRnw|7cH~`vKE}NR@O2jBvaj(fGK06 z#Oecq(k6MwKR8G#Khi-PeDraR^`dyWuv5k&5 zE7f`M>K!ng6o9VMe{#r8zYEl$`p?4v0^d}3zR=VLpX`e+_{L$JXoatp!sn{(eSF#@ zqNITgG$1YXT+}foMJ9EAn(RtFJKtk38zleFDU&KpYJ6$`m5pqGr~hP(alp*fS=e!g+l3^fNC~I3pB;B+t98EZfP zjMNo;GC4W~f0?HHlWh`jAR497Q2lg@sZWEg1%TB6(A0dDZK|PywSJIfY7&_V>2}E3 zU_Wodhg^*Y#}jg=>3aaEx+a{Wq@Zycn%_vD4!$q@PVh>vrKrnJB^#LGu2wVKqx~qN zc+*cX?IGxF56Rp)*#T9mlg#cUXMI@zA*^#1>yvKQe?^amkxIi*DIR*vP|CUNH}O{+ z2vCK3-A`Rh{y)7aP{oC<(GpWs;|n0FH?FEIQJR2zj!nRUC|8=9!{>!MHCjzdqR;bHx^G@~%@UE=5pTp&BM-YJAJF)Kev8e^VhHZ@TFWf?B#JeNvc%sxo|VR&F>r zdw0=DVIiccGKEeEGSg2GDzSkp|GOP%qS z46IOacnJWg1fZlGm~3MXWEZ?p+`&iT9)iFMt4f>JyV+`L(^Md6-DWx}NQ7Lme;)HB ze`&0RXSC^r4g|Hxj1~G_n7|3aMB$nU6O=+QRV+PKAy4DWs+YmZBGb%xn%`S(O0xg_ z3Mcqx>J;_}V4s3B9mySiUC_~y0s(LE#6*alI(=ooeP>Yl|Eb(7<;;z?;VDw~^anV7 zne4|+rXT9)Mt@l9?hv1&aeqn|-ZVb7f9f4*_9WofS;KVuJ|MJSSr3A$o|ixT{DaT9 zE@1PQvOx}}9S`1~JWHp$^aXoKd;#c82OW>*ZfKJzhGqQ*$a{DkZU|sK&=)D;1po^@ zpe4Y?MnIG9<49&Fj%}q)qf8JPlas0ShFr6R?^Lau$3!U+_(8DQ*5^yxiaU@ySG$`b7C&`j!iwHl!rRh=MMh zs)NqP&t}o5b2^rfe#<;8g8ENHe~(JtJ};LJA{%FPY<7-U^UrF&VRiXjpsW&V+A7^U z1RIS_Ego(;&Xy(k|1_;}>S>Mp7hk3*;;~k0Y|cyH)Yx2R{$dv_oI0nv36gQD(?wwV ze=36U!nfwI(&n%$G-9{;;evKhXx$1YEq|T$3Hug2HSGbxfBs4D8X~-9 zz^m05Z-JX!WB4I0U8a5e&>$ zq2d+@p?W*}w7Q6?yJE#%H$J5btr}lul6jkC<8)%vwoRzt_8OCRoi%3A$!dU&zy7&g z2LMUcjS5uf!UBL!a+LGKf09A>X6M!X2G{I5#?i+gQtClh z^(aH$B1hR*Ml$HA%8V(B_9}aO^4T-=%A}`sKw;TMUlDjdd$+i+U4S9CaKzZXE^2EE ziExI`HQin_JyZr=Nupmrovci|Kl9vc&0?-{DK36!WH)Sn|8U0ge*nrtD*~14GdQWV zHGLU;X6Jd=IY%r--84BTbH&bi)8lu(HGeugJ9*&yTMK+he-h@E2gxTgbWt}wzXemD z^bSUv2Rq>|=IiN$kPdvvS2cO`l=<#~l!#`oOht{+l_lWjddd2r5m!)rCjhI}99vLb zGM6`t8Pf!ox(Kh&e;)4GD0j2VOioz(;=sR1;G0M@GS7qLn05A3QAA&Yf1Y3e{5yDR z+Da@;av64h`*0cO>IWd#_S4SP{q#_Gc;!qj_aoiYqqAVRB}v0uv_*ZTNZfz;0kDNS z$#q9OCV}XDdwdIuQYa?cOnP-{D#7Lu5+_Bwy8qj~#ce2%f74s&WRT^W%-R}rG*x8Q z_)=vX^VgHx^;st?nTU;pyjtf*`EYghd#I;Jt>&YfU-!^Jz*N&ahc>=LQw-v`BQ0Qd z-DrFW^mzf$Or2*D!lC6Dl%4Ti&lqoC@nK?f@>}x8N&x_@5U`x8kiha5Fh;s>ciT({If0uvQrl2WZb6)vM3NSC}E!l;Dp)q;83jwPD-vgl%gh9-)@5r%l+WUXB z&WLcS`3G_bC@U!&bKV9MZQhWx`lxGUV$NJg&RjERcwE1lF||OZx$w(o&sxFVHR-4cpJk;FJ#C44q$de+MB?DlS%Pu+p+sos7l%Y0aAE zBrr#=F(jdRxB+adO@-nV4YRjH5M*lTTsI-RpamD_gd-)m(L(AVx z)-_`K4uF{evPO5A$zSvIxe~l}QAUL+^ly!!&^BZWa(D)=X(`l=S zoL=mmUewyLp&n~RA2S<%{&Z$=)&Puvch3RzXQZ;b4#nv-F^8mTJzv}BBEU5k; z>n+Ze`b!{3^^xuV`gIRE#trLm`stDm%V!HPQ7gD}y7wmoEO2>b5r zB7PTlh-i&AKS3So-m4&w5_#_eM=)X2e}_io7)v4!T13qiXu!s5*aVZdS2qM0%r@}! zB_5H_uL$V?P^r2I%dE#s&ZesN7eJrulpDUgVjDt^(YQ|5J6heT4F>>zOu=f4){sA_ zHt#RkD`GC|)p7x@(-%vrKHDFCjkz<+^5P+QGy@Q?0m0>fUiQ0zU#at>Gxg1Rf8iPu zPoBtY50G1BPWC7#4}2;>4eT7WsXmoGtrvkR*E1-3-HveHX>Ui&mJNdioSMpfQE#!G z)uE~{+ra$|Sd=;z_YD@(T(Br(9xNf_cMmuv;a7`b>>4b*iUk%Ryf4?tjOF!U^hlB! zUEGB*O3&CA!ZYeLe-R0(bUbR{f1SmF41$$WSD@BB_`6iZ3xvCQUWYW>>}$dYvw67B zO|C92;%sdp3Td6zIyi;i4ARim^XbJ$pMOXWD;-bBdd)GH9{<7QtIzmYKTkrmk-X`08nxorlQup`qS}fZNnohDL`8b+Z@Cpj2UqG%CF;WPQ@E{yOJB}R07|8UD(sjrYM=IYYdG`Hq_`8m150($rFTwwuv zsm;fB_D)ohlQ(mJ7|E=Wm0i~R{t6K6_V-sfIP$-Fe}z&6s7zbJHkUjrG(>dRJumAs zB}IJepm0LrbXLquTM9+F(T*M{yioW=^|-OLmA2?q#zpGK{h+aWf0{F)Nqcw?1T9cY z!Q?IGaK;0$Oa-2SSuGY-Y;^PaRO&vsxOg*?}R>SQ>ae^uaEkaXIcz6yFRd+LBK~TuZsI5bZ?m>hVr4usEeKLkVIJ;%RUcoF_q3L{=Jcq}-63dFNmZF-)hKIwfBqXaz=I|enku0VYS0}q z=G9$1OhH4szo7te=RaQT;p8Yr&kA7m94#+Yjrggin>#fV-Imhzd26qfdo{00%5<23 zszq}-Dxok!Fyg})({dQo)Fi!P?e)=t2|%rYPS_qmt488xRQc;CFu+Q+c`qPOg)y;l z4^xx3H14Are>X)cbCBjjnv*EzZST-)QGECM!x=a1km8q5uIuIbZc^{l0=ZBp->LME z%7j@sV<+&zEoR_`>NfwuAwzlD?x5_5Af2Z=uS92-VTtfZB_pq@Dc8cQJSgC%Z``jHSWNc&TO?HaW>idydFEw>;7cO&NEn~egKjuJH~XE^|~e^95Vs3(x#^z@e7#5f9TQ?HD#v zV}cvAzboB{Sb)s+xW`4an~y1r z@y2}Je;e&gWK0XcoHnvuB26|`I?pV2*Ff)uo;!wYsv4u}>kP7&4lMPmrZmFUaS+Fy z$MoEPO672c%X?=aSwZp&zxKr1cuQAYrUEudGCOr`Hvw3@7XahN5BcK4C!Em-w&^&ollLL~BK_g%WRUsflemex17t4=Dz=jSvJ(1|WZ!O_pN;qi zJEueL%1P}05zecZR{n3eHbkTP@ZpCaW_Jx|J7SpMr{RymA(gCEA+&;Bp1=yj}o$rEyM8q{WR9xfD#l_MVcZs6ZHz$mMECe!5rfs$%7WZd_BI@BoZhoNQ z(P* zM!x_Yt)O~SDxWXPGeMAf1sOiAe^k54ZR>MyjhdC}%~0)96ijHh@=X(+%2NWvoDgu$ z&5O8HrayTEo@u}_%BN3`@f@*LSer){z|HlARjBG^aC}Ugd@R5?-b?2EqKnUP=d==} zVc_ik0EkY{yi9tkOjd>mjy?YkoBm#9c^+-Jbq2WBuA5UpuQN-JXcstyf4V8vCAG0S z950cWSjqGo;Pw&n`dLz)Xb9=!5gXVlnU^^aXf&eCc37?`eql<+$|%d@>&jIRVCuy< zE&lOl3SifxiMm|hM$_^ikUc>8?PLtpIwk9um>R8ILG+pVS6WbA{Ho)x$73N#Q?>MD z8sUZD9)d(8n>?Y!=f(E$}f|bU!~&T6&{5;PYOZAnZ+R}`l_V?S-k)nC#mzpY}`JxfBu%lfZ~LHTEqZX z0j@B-f}gf7KxH<#zJT|I5sZ`<@K&)RWxG)#7A*5eQJZK)Fr+1A(9rf>LFn(HBk#yvjnOFG>(>wxxGj>r2wfLg`43mM#3|>_i;3 zIJpnEVEH4ys(L>I7pop-%T)jN=j4)l?ql{nD<-2W1v)LCf6tv7g0#HB(nM_P##toq z(A|zHt55=Tu7tLLZY1sz@(1*b**RbfeVOT%etuMM^pvF@UvGqt-|C;zKhhVM|C3y+ zPjtNh7md+*pQ@9QC2Gy!&9(??g$y>S4k<@+r5gyvR?{wDkF_JVsa>?Yn|VPtwLwz~ z%|zj%CTP4Se|dEX6da_EoHO3p<#S@K zVil=5I8^1|7A^}UzqN4vDG;*qC@qVZ-5_2NmdY3*%N6G(D3azN2N*?fh%ZxN=s1*t zVXJg$eVhqL8Xw6wb*~E)M#_)nJNdB)#oswcpAwu z)%~#S;y>7Z#mdO43VIx0X4@1>n)gg-Bb`7ff7B^-TNR~3SVUGp;T04gjrrkTciF4E z6Vo`+=RSQ=uA`_#)5ZxtCvl8I|~oEq330Gv9sv z^?Y|KlvBlrw$8OL#TH55?fUkklFu~6@^U4K=~?? zDeG6;OU7B+A)OOfG||rv7CXB@E!0)$`V?jIaxBX9z^>RX-D@T)JurJoX5wIGy(Fnr zCrLBLe)jHXAMlR3oQiRjpmUPrKf!UB;J^J{gV{&P1^6BSEVg}|N zo(_J7N!FR?8Y!Azccn-z$nO8Kdt5oI zPGS1*O%PnBPDQ@Wl+~$Z_2m|uIrG>>?I)8)C6lio4`=jpWEQG>7kpg5?ue(7))^41 zJ6g>-3M7^}q=kEKlcc(;XV1jIe~p}k!gr1n(%E7r=ODz+ zNgvkBW*4-2ajdGIZ9+DuoH6EKYOR1*NGHBb|Ivi#Q<$k!nEy{HRCUeAbi4SoeS{MZYYj~!dLj@=;IMc3pEps?BSVBGCHo6aqW#8KTjGzA1{9fhfT0o`{AZ8TLXb9lr__n}IGIJ3Q{ci5a zcR7w|zIH{YIn@Q1R9j+cmi!wxivXS{|BO}K!kMPcSWio^U9c$BId#cDXcZTjW%3VM z#dT$C4iz#@ZYXh#x`&|9TUNQn+ZDbl`8H`Vy*)fSX6>Dnf9MeN)9DO`80Xguo@L8+ zuruNq8e5HaWz*>*tQoiJC{R>PcwKH1qdDa?ze#lcK9y=csB zg9_-&#SLdlGJ60lr>?%fZzMq0&(O31RVC7xCBqF~e&KOlf6uq7h`f)M3?7_7<}_qXCnjJi z2EAjN$mQDt8gbWGwnB;n#rg|Yoxjp>5MMu#oCPVkD;5L}^N&@TX|UicK1FwR&B zkIPcq6>uY!A!)LFN<&qIb4K7C$4j41C*AQ^fJ!}_yEN$)M>tR6yL^bdVN{mSw z7VYZiv_X)6y+*LpdjM8UN8cd@@$ns>Go=XP&`^V#PP!eRWXh0=gk3x36%xO#0+K>F zg=s2GgQ7dr-pk__dGyQn*ZE?$7s9dyj6z&P7jTI0^Q~5qrFzvrb<|=_H0^Uyep5FiixfQpJg}PFaWaH8lbT|Lkb+QCI}+9stOzGgtkK zi&t;9>94%)(O)?kWPPflLTH?z$r8Pmw|xsDy^87vQK2O|t7jnIsZ%%K`DfAn*HgGaJUu_1pr;Qi9%WmMNIyWpkj_G-U} zO&Yk&?wfX9Yv(ZIiZ7aVj}{ieL?x)AhBEHa-tzPIm-j9IKkU^1czJVra=H99vQQZ< z`Z%IL1jDKCj#uI37lLZFs3S%_xngQ=&}IZ?Af9cSM zfkqUe9D+Dk5kF_l1$7s&C$=oKbD$I|6#AF3j1#SH?jd8VUW7(Tc@Dtp1$MRF0=w$D zz~(Np?&L%^AkWI)C#BhBoKUrF_61aHOwXkT$ZVgaxQQgCYnftA+H-LMvaC;9d?jh= zSeRIo%hV+26M<=3w(Fqf!8Du`f6$S2J#@ zlOz+7w--scAw4@6v+cV;E+wC3GNfF0J-LjELGc)d8&eIw0GJoBDj8>!L059=F&8Hm z&+tHB3H^|#;hk-!4g-!b79HQk+CXnBbE(MA8eun1j2(A11THmUcm7-Vf0mxi>Vz4I zK~oyQ+Y0Y#GRVHIOlrR0l+|yUoRDMmTa>o95LuY^6n2&|H)qMH}S>n@)lO%=qp}X9Dt{8e$6%*4_D2 z(PfBe#&fZt-vGSQCL=Rj^>3M#67pfQde}1P%Sb>U7;^zy^=gs`W7gm0Vfup)o)EOz zEGQbez2$L(PXU8je?u_JB$307-t9KVR-K(BIJ;;9;aURT0#qR>81pN8)AGumfle+# z;)G<%`?Z_GTA1BGqb<^B)OZndQgjNMI@SlY9o0b>KK0-|wp^>}ux%=b8cn4}tKKzA z;~p2>Y6Uhoo#WwX#LtbSEALa0xm8yr?BQc@AkqMqHqe+5L9=pt|`UG?Od1U5o$w5&R8G_I-34gN-eN-gCBg5awT2H@ zw4efrMyx@oH!!N@c+^W?Dj}OBzM|mzhZ9(M>6mFozR!+19pCSr{wA|c2vSU7#4k*u z{R;%r%TCfHf3xFZyW)o5h;!FK0#oKR<622jD)>29X1S@omlvSRdROFeTSXpsRb-J% z0!vLrLR|w-8h;O}*m%eUl6vsh9JDo?(jmzDZg+r8uau|OPJ_e^I`vJ$3As&=-*c?Jn{w)vHI9RzED%=kRl4&Ze`Q7vD~<&$#DoUXkLZJ713q zH?Dr-t8(=rpjD{{Y%bB`Q)l{-#e{oR_Unsx>J9*yX#fX&Rjld6-X46=S#@Shdab1s zI!u6Vf!Qy-G6vUNyAmZc;IR;}=!Ir*&SAKze+E4LB&c+Ky=VhnDRP)awP!`!cnc@m zK&I7*^|Tjl0I7O-%I2)sDj09|lnpp)mCsaJ&9d_9Ejph`sk+UR1X@zR{4Pls{ru|S zt2c@wo}+|;=N0;)(butoyvfm&9#`&yQJ!q04;I9QIzP&rz;x(dG{!n#s>qJQX4)ZW zf4qtYuCj6|U&N>@oBd9+%;K3ln*#bhxqAqQ=-^c8IKcwr{+rEBuf|!Wt<-&MWp#u9 zV!pIS(D1crH$2#UdFQbshC6%74t#go+1&-JRGp|=SbbuuwjBXDWCW62NCpbGgyOjH zjK%;SF*`;KfEVhNyR9a;Ro&-}SgClGf4Og~B6Z)d^?7`4herJOu5N=j*x!?hi>BfI z$DT<69ViT^jA`vQ!Ic{35HX|SIAp$RJ`JilS_?OAXPE_*R^*Dnp6_! zDT5%rJ20vw4)#4k^!)f5{xp z!39E6asdj%hevDw)@SG9yOk5*pN7Qy+m*C>ORHT&Aak9%uZFMSOu>wWT6qUfbHxbyd)|{sTpmx%1(+Yz5AErq*Xx%j&wWGSfuMY$O%rF@3 z{#O3K;oV;>v4Jq;s863VWtO?X%PG)gOyelntaRJ6j%m#cVRreB0T0Uj>4(Adi)-LX zI@_UHd-Y}EbFp^3-SeT7BXFM?lL)Y|EOJ3}tZAy^!8uk35yXy(E7_^=e^_*3>;a!N zO%7f)`%`q&YoAXt?axYD>!C}G)hC~opHCi_Q89V?iC??_;aqkJ?3g-}U%1`T(Gbm_6%htR=2CuzJU= zs(5HNGh5zSHcD~%g)FYVe^nMoCk5@OtbG&pt;lEPWH$97OGGRRtDy9WS&+F9RWb+h zyMC+ByP&d9GWg&63!h~~7fS1J7$$`ug-1vJFC-q>N%^d7_!yDOKETJC(~?KFm`%5~ z8mo1)$D6ctwdxh1Vuo_tyBgqt$}koAM>yc1KMAnmoqu;I)LGyIe{90Ayl7nrVc(5; zy_$4AYIGf-sZ_~Lh$-LabSxWm++F+3oM@d5HpoQQKNHRf!T`IQ#jPfcIi1lAkj%$L z4PLamgbR|qKtjllWlQPAi7AI#-sey2gXHZg6W%R4|LdSZN)#hmpGq~^nM!(KfOvI< zR+A;rG^0&Pu0##Ve?^a=Jo6_iNHCDbOj?p4g-8&uAbmj!7KBwf(X}A)E;$hJ8ddtVNn?E#<-T+Ieq$Tq9aa)>dw#2lw8aETdY zI!KPGAvuOm5XPeGVEEJouwGkw1#uEmj&!4d&nl8p!h{bRe*$cra>}l8^^XzGUm;%1 z-mcEe=Jg!Fid1y9q=kjnpg$&qbZnt>K=B~*odZyZE6VJah&COPVLz6>|Af*O0aTI0;7-SMXg?>JztZytt z_YDHG*hxTsf88)|41|;uo<%Cn+^xxMeY0!psMaz|-b4*u7%F}5zoB>+#Go@e9 z(MNv{zI6yROCCi(&@bn__>(ID)BAKrnSr%AejnebfA|P4L_BWZ1pL$2Ia*S!{ac}Z zW#DSYO`?e&&PWot%}bE()>z1K2m-^r^13%K1`F-8Zi#(#d3ov=X~}K0wXYzT>$1v| zkda}`(x)uUga#_{&VkC*KMwKe#7{QY-q^lDjRZAltLP{1$Qrqw$xR)Y2s9dB<}A)E zs#h1&f1%CF$A29ye$uq6NV$X4jix@#NvkE~@jQIzTki&GW47;9%JpXa(H3shx8Hc^zk^S`Ob3!<>CvDc4MmQUOU1{PB4H>Uhs;;-ucq<9$8Y^Mi#6 zWpP@waEe&O@8)h_5BHW2z(i>2B<7`1kfkGKOFbAMGOlVaDsq)Qw@Ivy;R*~xY-HfD z8qfz#9T`%CT(oi0&9EjT{fkw4nwsUlm(}YuBiBY6oC3HNg7bPX>4C@1G7tA|jeqy9 z=TfD_WvZ5aCMlRm9i+{SQ9+H%*~Rw8#b`NaQO)RAjd~`iRo%KYjZ4>r%VyOu!Bqn+ zvYJJlW?(T~`%K%HR8Y^@tEW~&>In|bQzGvXBd`HnDs7#Oa2u!ZC=?Agn|&PmX+^_M zx`jiVIbM>}?n-*QPy&9rh#%NFJAX@-J8~{`DgZJUB8Qq(lVry}k4fY=H2UMsW(b?i z(xUFlqPJ*W;#Pfp8=Um0W>j{su1)e};s&>rqPLX)^Q4xSg)&j_p399r5deugiPl~N zh`?YhPG?CQc-+l5~cTYuY2*sLi1 zOaVJ97R<3=MHD+2k+{vvv)Xb5KVki9?H9>@^hVA8;VQalm&tBc<5V%1l2+bqHMsId zXay#m8S3k9_4h2K_y&pD2Qm zH;tL1==n50BH!%a;oCfuzXv86m`s$w7u8r{o1-Ii`VZO zA0k(8gPTB|@ueMA27gY9Z&f5Srqgcg%=!GZZ#Hqs?|e=P$Idiax}l0jx&83znf%}O7s4AR*K z8`S+}&%V!Py(vsNGXH}xz}86EZoXk#hcVPJoJVzZa6U^BVt+>`V;Z-<5rPglCIXJw zpuffV6wC)vl76|k{FDB^@eJib&$Vr^O(krp(CB__Cm@pgX2T_2ZtFPY()ccTKz^qa z2|MLWXGQ7EG#M%a+f2gtbV0Ta>P_7XdWM0(2!|xuXcxMT4?a2oGjWBrcGO@`vd7AU zio=G)DQ>cAQ-538u&J#&cTYU!U^XGH0iLblmD zFr=03w&L5iYe^$p4jS-=4_RBa8SjhGOsR3>Y{3&{;if7(l*Kn?K`fq8N_I_uy1e!^ ziZlY2Iuh}Py+q_;`}#HVMXwP%z4A>PaAGmXP;-MI8-FvzMjs7?l+_}SripgjHn6l? zf+&lEZmFHj%4+iEXa3(WKKZJobhJo0vv;!lN{O;eF^wwH<3YPg=OA!QFpDPfbC(P* z4EW*N?COu>J*L!Rh0$6*w`6Mothso_eV+2lM4}C&7@?uEL?=v=MtNe)_9^JarI-5j>W{_>7ScqoUV4w1 z7o3z-oX;8aCT%raw_6_`J_J$DL@rbTEK?SdN)k2b@G{+)RPdz|q1U6_dIptSgWQ03 z(saj)1u3Iy$cf6;^(nsAV%#`vTo06i&%+i4HOK<> zbhr(mk?aznE|Q=Qv;qx=Y_II+`AvlawSTzDZExhw_;&D4SNx;6^=-0Q#l5<`{I$6_ z-qaYXFb9A)3?J__pupF57HbqZE;xVH4DwfGF{$mRlZ3HlK|CO=GtYp$v20gG(CD$i z;?7^P6}DNw=n|hK_IXwV8>ZIG#f@sUQ+3x?JJn;Fk2H=(yzi69ZsEZ#lnz-E$$yO| z=+uEq*2F!2@|E{ucJE15(N*!zLe?R>{P1qaDUyA?uhqw3kOheK7NhNVSiIebUfa`i z)e<};tt42iu?T8I#pIXrR+Ni5sGK+#kL0;%*14F4o@!f(GSeV4{nu``jKE6^b92?p zP1DQG=mEe)b$~La_-3ywS`5)%P=E9WOMn@nWS*$w$3~5%lLR1CPejq62Y+ zV#6cyqTsy9xtmBLJDaAq8lIba>$Fr@&;1~lg}o$ATm1kU1AiJ(tY<`! zh{YMDe|f0>fh^~A#I-%KB(17jYgjX<*w?g73Q{XhksH&S$}YmOY^q$YMU!2IYue|p zpL{WkeB2uJ8r5@dL8&1=-kW>_xLDlUlPI^h!z3N7XKczlZk^I5qsrW-AsNewA!(x_ z`7^01*!-?btCBsKb{cUA8h^)Ho<&tL!1cvB2INlh*Yyovlf`OaWoz=~vnSKZGh_|< zn6>x%;rI00@|&_a@PB$8kmAP3i8eIjSoF+o;!Mym-Q7#n++W>%ViDl!9n59-Oh=pL z+kgyc^upzp4lblNYNPitoOY46ep2k_VY;Cgj&WQjjXQ(8a4E2}im#3>A2n8_bi;JJG zm$Vwy0kRB~QbZkFy~|&nt+5D!qiSp7Ydr&?1E9w;s!WDMFkSA=murJR9qBfc8!KrZ z%bq7YTl?g&c@U>HYDN!9AYiz;j}HY5VzDT#PC8N8IEX9Z`hSx64&+0^kkhCj&jx10 zLadGCdcURj)Qs}FPC4z;&1(ZJXWj+?P6PozW&BbaMF?J6dGQJe&~b|E%{t|`rK(sT z4@>ym?-!o19?j2J$An9At`8Y>{t6zsxCpGslbaXw>6Fe)%udxv{MmI*I@5f}D~D zwz%h)+{vP7ntv825a5IaI0UhluhwnYc56_J2GyIe=|7nAvda_PVlKXfjIcU4G_poS zQ6<~n2f1PLJhD?R{o9v=HcFm~og{1x(QcN!Nf>`h4+O;n`iUSfy83zg3J579%o?kd zncl9S{xIc9lTk0P`<5wLIzG8a12IyV`fIcnvfZY72!D6V-t*T7Y)@|LPnXF&D&wrw=`!e=gqsj==(kZn~>ux?Yn894SX8yn(2fq35th{AY;wf zZr8JE4}W~xy|7VN*p#Vjllo@Zq&{R_=OaD81`vrZqcdlcR&$G}bYvCic2o2950k5( zRx^K5V+gz6z>fCUhD%e)rq#7Re1NZAh*J5%GM(J|{7Dlq5@kpe!1HM|$1&OH^2Lka zQK`}(ja4Ah5+c}lo4*24JW7F5!$nc;3Z*N80)KS`W$laUe15j$kw)%UF0Khl*D7@L zF+kvo$Ihu}6Li|N#Aklk?ptD%65N>g%-8n4x8Bo~XbTl0_&)ZCoZ zf*gW$)Rt)~dvy$P2d)El=?~NarNvP5R~@K26=>~&6yn$lC&aKW#gR3YRc6@ZlChS3^;L0PrNBMQRYMs=}`M+~Tpq4J$EC6bMucXkwT&Tw|8nJ$9cUdEQeoNR`OVH`hkO%)Mt z7SKF#_6cAe!%ibR-8m4We`r_i#(0dG(SHimO-@JPl#3^ixt6~8vHa!aba8(6>mdkZ zPD~XUSCxbD;vo_k5*s5D9*3WfSVfHY3*z*P%IHI8ifNCQLz6h?O%~nzteikD=uc3~c7=KNE zIeQuXa6TtD>*=>E09sCAM&7UF+fP6Cm1CVvE+BcXp|Oe?Tc5ScZOdB!J_+)}t<&Ov zxjuNi0;p!t38lu2N{tn-fY?@pi^xn=_B^>I&L=L5FOGaeUU-3NoBH8<59@?<+jh$; zT1V@or`!0W*&W-o+mu`DMsip}d+6ZB%^nY_Yn2G{5+{&bCihbfJdWqKutppp42m9h#^}T06R( z_ptVv?7bo)rw<;1M;x@plZsqz?0(YNK<;ad)dW+5*Ub?zX&!e5S z=Mk`-wDt&g>Tb_fC~UCJMv%pv_}Q*-Y`8QyV4D7%7jTB*%3ZPR5L_RxKO+ZVGBR6Y z&X-nkD+=r)9-f86x(@bfF|6&Uj#W3)bgZOM>2}xBcq@WPb0$qZX|Ahci1fwP`H!Hn zOp{0D)NLQPV=cI;et(;rVr|>fE+q0H6z~!&s!?HsY*1-2ek{N*J}!$#v!ky+c~*RU z2s#rogME1V5M&_>U);zr-A+C_%rJq;MmTJK;tr@o)5`!!{goPRu8WRJN{$U{5|E7JGC z{zptF>x+BTOn(4Qap0&LWG1MziQ(f$fXiQ6-#+Sy)~*2<^xPC@Q%H;*kA3S(yF|1g zyjd0`O!In;zb-~k_ItZHztg?e6A zB^zGn`xz(#m4EM+B$Pf4yv;J8^eHQSuIPM9cB|5Ze7n+L!<^*xZC z4Ze6i)a`i8Ulxm({k|p*yS9>vH@mVlll4s^f4u>jig}C{MF8bX5{tT3%f1VfQI~(!~YsiY-n7YNT~1zpJ60tlc8AanmIvIl6>x zM;4!c;eTCSfA-jSEFS&KRc(Uor4N(l?7Dt0@2?d%4t2n?;FN{Q3aVT>D&RryqsbQ^ zfp*kVQSLZL@~CwAq^gDw#oX2x4b6S5l9sB~(%C3+Is}n$n3;y1)Cah^uao+@Df;K# zt77>!m?ZakQXiP(nHTEY&yU;CEi3w8vLi_&n~F2( z1ApLWz<2fOu;#(2gDYen9`0M;>VFT2Y`F7~V|_N*^}a zx$%5WF1BQtYkl8S?p(50HqgHUz=W)J<~reg?CGSL%60PFZaIB>qnxy8sM9T|Z-4s* z_15Zo@e)nW+rSJR*no_ChCFwDLoia2jFMbo(9R0B$U2#K2qMiX zjw7q+(gwW&q5I1byi(cBp}sw#Rg~ksNGs+XGYHK*Oz6x5AV!*X;!Q6U4JS2~uB+ku zj8oOqd!5Sl{xSV8MYhc=?S0LU^M6py$CiT6%gt7bx8#2Gr2~8$IJE*9H=Hx-BwW6; z;e=Eu9wTlX&HXoyCcd9)Wvkf|h+(azNjUR*y;_pXwdUil)_ir@=)5o~X_vf4tInWnR;{F+rvB z6T^dg!=ZVSVBR>fxFVlbp?@l(2+GzM9xgBVmhA!PwKPp>JVw=0!}TL=_9`a6%!cb>VL*6SH;j} z=XJTN26Xwy%C8z7lfzWdWm-iV(B^EM24-0lbbOd37^nkTm}fO0ve6xnNbJB@DropNIYpCe- z-G+)T7N^OKsdR!}qj5t;!CfWsP|;SN?SH^M&U##4K?)$`;v$piQunG7C({MZ?Or@=$PzVT`u5@&#CrVnt!$(Rka$3r z$QI#_dMY3a+}K~*=;vsXiiOH#$Ma}x+=SMGc4tYQW|sX|m?qytPIK#(tnlC4W8x3xW3as>R{v2_~B=$jL5NPSSzV zUMmw@uzX6HN?8gYr1_DmUKWFkW-jI63GN32N4HTrWPXDR2=7VnwWqnkAr9M^=y6rC0;>KO3 zjjZ2T0s@=Ri;p0)QOM1v#lR(0fVuD;7Jn<-o*1`+lk4a|y3z#vcvPn6ZF4z|@^n&- zyV7JO`yFk89fBrh)-zmbN(ZkrK^r%3G_{9FqX$40&sp;PKOS}G_Kr7YbQ=fP(4+id z42isQxtd^!G!&2@9oGK*92;4wp@$&PqBiS_XiFL1&sB?>zW7%^ick$;`) zSriS2UO|qyk)8VoFmlh{>k^E(MYahu%pz+FqpDjNvU_j{z@g_fWxq=RXv&~Y8b%Si zA;eMC^gsa17;H*m6isgh>wAypJ43`>nE)df=Z9r(v&Pk48{hsiGJC;9?)4JO=6~^~ z>be&Nssn0m-f60;QoQZ=;Fh~@w|@*+op|)&beI(iP{kp8Th^IyD-;&{Ge)+DS8xn|6%wE~*^uq9zdTRwL-CE=7BVa);luHM<2gA*C28*k0QZSEC` zTY~;a{WVO0hgoNEl8319<-J>Ha7wsa&IM!d=}v++ToeL*UY}8hnrRibLw`Ugn!Rnh zljX1T6F+G1YC*s0O4sznD&SOq@2TR12X6c6jC$wM&pi!qP2qWyo(^Jd!RWSuhh=22Dk@g~Vhep7N zB^bjs)0n_(ejrOYJIPvSWr7zeV&DiAbtCr_!e9`G}6Z<-!YOnF*SBEeF#ts(3}>*Z5g;33=nZMD%lI$ z)`}*Y#m$8 z6H_h#zqg>9te*7^qReKv0q0UBO>3&})94E@?=Q?Im-W*))$24GaT=3*HxJ`P*L6g_ zYc*K{G7~3Apvv95eup5lVg`YC$1W}}_Ob4PH#Ojb*+GMsiGTGm3%pDSswk$4H>4B7Mo(A@b;!@AsfcJ;iZaR-i)CewM!8%w#U#q(A!|PH@SSSm z(bbFPkuN$t&qZ%;%>sngP|%9z4LRaV4S-9q8FqOTvEp6}UK%ABcc8-MiKj#2F=tNF~wf%Ss3Q_#lI zvuTU#;_~7UG>$o1av!SP=021uA*Kz9!@cZ-B(R<9Nx$B*P!pCkrzxEF8{P4S1a9{?tWvGALnDN@C zQ!JRNmy?F8K4ZKSr`g;8(8M)K6swBU43i0!OXe^gzBQxN!zC<~jqPbAExr-{ zFO8Ys2B0u#+?3BsflQ=w>qjR*m4{I=nGMKSk$(oQb7(?w7J60e<`6YP^zakSJUc4t z$E3gg-fS-AO7tQSK5Z3=&e+W++r|g9{keV>dGROOKL82z3ttA_>;hG*Toia#bIfOQ zGjgh)2U@-vYAgh4Af!N;#&~dW+v>8XF0ZaYnTgXD=w1k@LM~^K2L8}_=HuD&%KOte z|9^AdL|Sp`ZJ`0xjY1uQExu`BwUTCr*5jLgAjDi`Nt6O@z_o@(c90n+ODQ}kvn@O* z1CoSEtROZ^(4^v=$O0QwkO{Qu>cxw5ibehqB$m@Lk&J~vv|9q1R!~4u8-YX$i$#{)HAqq4fa4J^YCgU#}&MQ-(6+ zJbb#rCrQu9>yO1LeTXRM!6%jQp&TF^&UD@5ltS%@=0DBPE&!2<6P0t; zWl@~brbsi2+i3YWMsW{V9V{czg@3>}yW{yffI4XcQZ;6PmulI-|JC2^)xJ+-kc#&v zoBI)6`5YtYLlCsBQz@&DAZzud5>_?Pv6hs|PotDpYIs_sLE@N%9{DXM z+omZuUymE8G_OC~JPPu9!!1+HE%V&Us+w%$h6m?Bs+rV9rPDT`1^_@jReuv)_vkJ| z9b#N`xn2v~i&j1hV5hKYgDAoYS_=n@QTmsqoCoXK;1sjLt!_y^onJ38DHfx~@d0}y*_?R z;y(Znaf_F$C@dm&IyrK6c7KZ4-^pp;o@3kx(WLL~Gu&V$hnKx)$Oqu6r2(-6qjBi? z+{0dxs$DJWot;xUA3i6u2;M43R|;^6#kn9|5)%bm0nGb~D&IP{1Y{bx9SpLdupYVM-a+DfIPU4LxuYBuTvc!%=1t^htCw+<2-pc1HT6mU6!w7Tm*s0N78_|fekki1Q1KZk<3snKwwl zkmy)nTR8KX>!QAU#(#(6_#i=zs+D5YD%hDR>TsJ-Qdvl?B>II<<1w{Z3)cM`nbymh znpgdu(sD<@=IcW&KuH-TjuO3Py^-_D|4g}maoq^i;sm`bi2Lpew30RqG+mdE{-ym& zn;R#B=;!?xf-jsKW;8lR;goF|0_;&qptw^`;>Cs#FR{Ze6n{US>CtOhiY>Y21gc=O zLGR7gbM?&h^qf8W=Ct`$o6|=K#|FL3xmG#;h|ekc(srb{gVS3;NuQPJV!5jHZF{yCpJ7XtW! z6shk0TB9GAbMhQ}y)$YO_zY{-K4#Y(L%*9k3RTx=fv6jP!&D^!woodOp^?qeXo6Mx z-#>Hz(!&B^>*1B38q%yBT|@PRgFZ}amhwx+y%B!opj|w2$ER(=FwHK^tF>~%?Fxd>67CC+32rrR@ z=PYwLr4GUAF1wfX5CG20_45*H{!|BVd&R5&+5Lf_Qqk)MXeXv8=WT>|@Pq58?xy)2 zmys^XE`R0a(*$2ludWUdm=%jt_TY0gZPbI!(Z>A^s7!W=;&eHlPr+cA!M{T$>a<8tZ!thL zpzs7q#3Tbz8Prn{GjtRbgK^fq1G1hGYl=klh=i^AmvZRjghor~sH>OrI?w_b>LAR< zn}0=!rw|cv*#Kq?G_6(pQEQzBNvxQ}2G$f~Ww(b;B%a`8b@TO%5w-V9X4s6yZ{aUIC=WmFK2J4TQwUh0vAS2E=re0X(tk}G@JHD`!{#5Ji-vqA?CeA+AnS#jq)goE>iTUJ!Q;oIrNP4n zCf65J1ZDbIhNGwRoSYuJTXU%v`iJzq>3$m1q^&uJf_YK|BGY`Zy(fTT5vY32GEhmM zce7nCfl9>>74^>&1ImiS`q8^oeScDXP8xEcGckI)tWZ|<(gQgK0dO*@Wc87MecIXZ zi{qaG59LW+mhN_60Vxx(jXHUJSB(uinJ6_I66`}FO(9sM+BA%z=!$6f>`KlIp^O3S zJFC){dL|Hv8@{v;Kc$u(NZC}xXEM?2(lClvqw2B%SlB1Sbp(`1@&ICY!GG6Y`zux# zh?l0cU}=hUJ8pQeUaH9ManK12DffB17CZ30^l}`riX&)ZrisZOQnK@+S{gPo zwx>7()n}C|1I9`)ZPCo`S$}IntvHj?AkW*h9;*dvO(Q*mlSuvl!}k(nZuRf0Rw@q)qqi$Z{MOf|Wavy?(tOY<^xg0L?f9NBJjhot6+3O3q2sIq-N)&5*$Y>xPQ3_f`kdiL1Dwe zc(BtyMgUU)W0^LDH|WFRV>dqqk7XW1n>B~sNBgRt8{mw=v8WpjjbcC&K_+f>x<-0%#5kO5gx7!^vZj4}PHvWfatWfOC}20<|>qAvC9WFJJ0j#%)X+lMn0Dp{R#}Wb43@Zec6@GW3zT)|IAgbhJEUGp@nSNGB*eG_5fm@qI ziOjSBB|gx!+-i`Uc9wI(6OMo;U1MlFbd8t?oYFr0hI$cHDN{wXK38;|5!DeemN6;q zI?uO1Rs%C{ey;|g;@&KN(B3TW*PF%r^k%W)Y#9W~wloXPL4QXaF=W)`;Rd(Zb9bcR zc(GXdO7Zn%x$--_{6%_Sf9Tk$R0Rt0)OkLw-8+1uVIXnehp(> z3DX#!z>YgSfgR0nyd$u{T3}N{SrP8Itc|k*;Ecg>5G5Tu+jvXNXhF6E=;}f`qOrIo zHx@o9xe~=(iGQpg6lv)3Y1nU=p8{qAxmVDDL}Eylj#v!g0f+3;^ervX2b(RC(BrUX zQzX-+Z*Pl|ERcHbPMTq-JRClGeq3T@cZt-@`?&XI9Y1?^>VyvjT0$TcS($#lF0-kT zw!;!#H&@0(K;rvOX48c0U@BNz0wxtF$@bBySISZx>VI;ZxTdRR?b_4%iu^uVT)qMJ zhu<|6TGjLBLBKR;V@7vtB<+u0d)<8WnyaFlYTmH7Z(x9#KH1GRTcj8VXhYlinzWs5 zuH1q@mWqq5gmJWUO&^Gq5j$s+0N6gOR%`okKuaX94klYlw7+Vk6b2$$)#;7BDYj0# zb_5GH%YQjzX|tj5L5Cu1wSyWI%xNG2=6V<%6x6n(Swj1n88*AM`SYuvsQnJ{5J1*&$HbJ`ILZieo(z z*-`*XGpf(gY9lt-WcnIx0;&?BaStmAz{dBSs(%`p`WxS}uw+U&FR!$5n4K3V!F&la z%Vc`TQ(eHtI;~6KGscrMILUZCdf5AeQlpi$;QJbI0!lK6T$?#K1j_U_kpN)S&p-lD zu{aat-Wu@P4DtGs5h&B^Z8qnX-G7`3hD<)l*wD$ih`0z{{r+V6>mxkE{^iPFV2is8 zQhyUFmSTD(`;TKd>9utLHpoXb(ERF2aRRWGmW}L^2{%Ze9y-1GTduxN&gn$LYQgh~ zYdR1|Qyu!JJ+AFaAzJ*^Y_YQ)S#UI{@ z;@_P$2!CoFfkcu(ew|)VZ_2atuO>Iwu78F*DwmQspD&inIZcgT%wIpged$l(zqnew zdec2InNp5GVo4y2-|5H%J-GS(`dgG;E;)8@8#sxAuLhJTcW$Eeq~2eE`#wTRB%zcA zvRus_ZCL=n`WF-*fFu=5f$dpC0Ta~$w@E7hyeJ>ZG5zy4@K3rw&5uvtt4T{qD1STR zu-!8J`$1?zHG3}{W#Q}{@QLez>FYQwU`7DzlL4Zpc++k?=Ri`p95BWVs~ixw(!zId zmRgNi4Z`kOl93%;09~$!phLR0@CjwqvRW4~k&Gf13B_W&GWbzR7gfzN`ELJqI*RQ( zTNmo;rS76tmw}fzbQ;^w|Cdzx(SJLbI4WicMIg6)&Nf)M+Z*TCldFzxlqM1nRYhwY z6mm^=+fwAE1hf*t-b@grYg<9YTo42QN{~pmzY-*gfk_xs;FU9-isH+~%bOLD>AidV z$;CxScV8`xM#~G-)@&Wiz9FqATXEw=088^zpbQZk5 zzCor)d32D(;*=&2shS37`hQRdTJtQcr*If$oI=Se58sk>2uQY%vL;n5bWvc*;Fux* z8@Jm;S-)7FMZRf%sFL|q?`1TFSV15b<@>m{1%`-oz_vOW$Ny||APFonvy8~bcpJGNs+s}8H)PirQftppInbtP^tK*gg)(Z=BpK zy*UC?AFt#a!2No6%YR}@Hk&QHMrv7Psd@`&V!6f zY>;-8SUv7Qhm0P!=HMfrb@<-!_ahWmhocI(i(sL=7g{<|YP&@}YVn`vWoLIZ zB4RM~IM0oV-+yL{apa;KPC?j5pI--RC6CFbAZpDy5z)Lq*DZpGP{V0W40XuZ)CqA| zgmL@Idl-ks46t73T;Hbg#?e!%ao;>YJ^R*8!kr51*e=yqnvX?92u@QX$9a z9$9K^`yH_1oT5(pcqpnp5mOCRgJm`qn}hiysr;%IBb{IU`n zJ_nO4&EDJX4q$w7uFDWW5;92)l4QH4g3)0EZF-jYWveb2gb_z4BTrzWK}WfOuZb5_ zBz!49tiG&ii2+W72YMYk_$()TNb2ME4VKG0>SMsA50wzvyNn_wR_$+SkC$G13?3~l zjDLuwP^(f~6h~byCpBzB*C!BQ>m!w5Z5j&+YPv0OM&gb#ia9ZH#{eJGF!a#hUCf-f z$;+x@MG14HJ2g>2q>QkFy`luL49Em_n}NxsB^s-qH3Trtks?Qvbh=|vZs_bu`RcGK z1aa82PCNomwsERG1~JD#wv<$(diMN#Uw@hEnpO9+lXf^5QyLR>AtHcSTpE=)(Ye-c z1a{^Dm@*JMkh_32;fk#|YMH#Ub}T2d9juZxQ5@}YA0t{pn+YwjvT%l>uu>)=BTNvd zU5Lv$5QY)-WU4GzVe8pnvZq)86)`GpwVuf7twM?!lSxyPFd~;VF-gjRK@fKWIDbx- z0mEIpJpsrVFba0QA+s-->6r2=IhYDH|Iq8T^^Z4w4lPZuw) zFAo6|>5|0NQ)Y~+cm0%Et0H4n%ZBMjN9%q`Ll+C8N(_DTk;by-gFU=X243cGMwufIKw{0tqO*jJ%7fHfJX9+;&#h~JGYkukubvSJl_pODs2&DCvG-N zP2y1ma_H%^@zW71V%GD%JfQk$VNgK+lw)(&lZA4cI?Kihut>JFf~vZqsa;#!16w4I z7jv#Tg34ka*hFnzL%@36kj@CPfJs(bs{V|nB-=+QW2HnwiBakyK=-(n8h;G()`l)+ zyIl?3mI!oG2Pe1Z%azlb@USLU;zsC4V*BQFkPp8)`DSo(`uy}5#zCQ=TR}7H_8xQd&_EJ1Nfua@4wW`}*WF5Ua_Hu*!?*ZZ zq_of5ALqSso90=6?BBJ^F@HulRZBSXf0ItH$m$3TXu4e`0C6{35PY{3V&kS59xt&;JCYc2MnW|zZje`I46%O zHg#%{G6KJqzxCKVB%u)dP%(H!AzK%6INs5wP|(gE2z%m!rl9mF7OYxYL}A#o|G@q} z(N@M-wAzACd){UW6o0p-Nl2H$rtNd+rCY3edFHe#XKGT@ zI$gI!Xo)ymQ>pi&ZrZdWzva%S?#L0vXGszAcPG4_T&%DV0RK9v25=@*3r)_Z+`;87dF4tsqfjO_zC*Z@L4PiLXX;;9%&uNfC?Wog z)Xj8T#O8RJtV`$mvqc%I?5URLQ}4AKJ8$~M(UaoI0s6Ns2}dliFRpGcr@p`SSwRU$ zs9F*#Cofn~kNs-yU+=q_cu-1)+xXP5#K&~^Wui=*#GiPHcgdm~8~75Yjbzf?{lxtU z_DCF$s^(eA+<%M^2_rIrPKf|%&$G;!H2`hJNs$Qe^V@S*1;~TRCzIFnKW_ghu~ENW zAkiKh!ehbWN-bW8vc2J>;SB6Orh5H0ddH$OMMAw+Y&gCG5$)}5A*dzu!Mbl#lIV*2 zj40h}Di_&(I?gEDN6p9Sb9<4lPv~XsC0VTckon`9ZGS=v!oJE^zuaQ zJy&(U6WFMSj#4W%15D_;jbX#dfK{z)9t?_+3hfry-H5(d3pSO?X>8?J8B}}kD9E+! zj9k~}M&GW=Xr;aYZPtg@ro(WD5G86aAxd=L3R?0JF}Fq!Nj9)l>IwKYwT zKp3%z(0@^`9|tx|Hg(9z`B1R{3i-Zk$A6qvxLibIKmeAF?4e}(TgfA7+-TV7*K zRo=hG7?_YTHn3(CDzz1JK^O&yVaR~Ida>0X63;*e2Fj-y9+$k+e z%O#o6BPH16cD0zkcAAI9&H8PBE!0VZ5NA4?p0T9Jv1*yys>y zYkwbP5r}y9FI)Y=$)UI3J~{fK2sn5AotZ9t9n*i@zv{*8oey*ZX0z8|#zs9N6amAs zYHctWsLrDSRZ<4IbHdzRM)Sn&c|4$Wz4M+<-cw_r1iBZ|82W{dYe`Bt9PdAk?ew3< z&Hze#9P!G(b}KNgVgbTRsNq>n$3HlVg@3PGDr{n&vh{arR~$7sDCVRJet%TfCc-XXH{K*ecdcWg_tk`>ZAFKU;ETehXa0UY;{aTl z#ILnd;raCS%58Hhae{L}`2G+8&G}(yc}6SUrmS|SEO2KidM`>puX!}CzxQ3mdWTse zzUw~`8Kc8PY{^wTUo^`l8Gm>6MbBPoq89^cBo032%t&_L0nyFZaFTO!KEIl;{-y|S zG}&P#>#1-v@UD=%yw8}jm{hgE%61a(3KX<t1Ggs*S$Kct&L14xbv1cR_ZwGJn-(SBq3IcP~L_ zsl!8wAq~^Z18_&+9_k>C)Q*Sgx=b%#&sTuP3^hTR4F|0kgrAeICcw!2CJ)`-Pf*IC9z`CAywq0 z{kAZO$eT246DV#gJmF$R_ z0Fp8!qvt}X7Jd6wd95@XXsh-N)Q8itWvW472CMrHF9zH!u-nvLH7d@&(~y)f)1QrOcJc)NPk} zn_O>Oz5{CUUN|n?`ZKLH8d3c889s&|dukph7eU+YoiF@4s7ygiv6xf8t zd>B|mD@57WSFP4OWQQhML0wH7$*}cr(o`v<6{;4Y#=6U5>_0WXvqlTIs?E)iQzQMl zs4F<(K-}yXVTmkEJGnZhX80Xbtv*V=UyvZi8bQr zM4aDAkZUg~tt~&K1f5+oYG8}O#*gyMMkINr#Y>^$Vzww<<}=jDR-9A!dk`i}Sd{wn zydXl|qCbB+U9QOgKCoT8zxu~+c`rXpa_~Za2PzVr_y&K*iZeCq_3}RS#`TQMlr*eN zb4n7@vya8e)gCJ5ZFdxoq05k)J zk_<}4H~N31%1A{2i^Xz!KKb>Ha<%2x+rM4QJ@s3uNvFtaq}vNpG)$c%?4|a1?vAY*)d2GCegdHhDZqLyEvdzMu(y(usgC&$h`|#Ws;WD>F?mP z%x8A+;d|*2OZ1rgvb3+Mw5jITd>sXc7Khfy@abc{rQTmJHiI{NH2@*YpN@7_N3Q>m zHK2d7IKh<|c}J!5PP6n1n3OTz`816AK#06HpyuZZUznk(PDCe9ITzoTFszAC_DFS*L?+Vmq+(#jrRKX>K)J; zaRj1Z|I2P%qG|gen5qVcPGq#y1`wh608AL@uUxTReVYX&1;qFpSK`haS6%^Qdmc0a zEaRZUP9H9sV_SAA(c3AQ-1s}B@HBrs8h!A)r+In33@Q=#dr6PQrS4KoLQb9u26=m_ z`5zn^O0Kp4OpG`UQLxvI&OpZ;??iYV^JX)ZB=@)#n%11@a%LLslWWMJtOQf!v^q^1 zrlg9ms{rA%AqXuK4rrsY?cS(-y_h%xATvgeMDGnDOsW_o@k4!Eo~F9@ZOnh=b-+z$h4xwX>F+AH@RPFGG({d+LE@UrBN znLEqopMoyx=Upo`FV22DyVmMt)bTZ!4M4o#kjy6iOm^lM7o+KQal^Tj?o~6aR*6(> z{NPl-na$fQ!^`67K$JK21IsKE7os~ea7%u^V}bp`{jLm4E15+b=SCpGUlH7IoS~2q zN-Y7jT)!n<2MA0Hz0jpB^O5B1*lXG4t<-ShDN6_6F?}c%9BqFd>IhDe&Oq6BT@Ky=4UsVJv(v*y?!$29KR0!nn1%YdrCb*@%Pz0&FT7_@iV|P z2^@1i%cuB-Ppb!xgFSloH2?aek1Qy(gkmd4Iceoh7A(A%)0f__)RnIt2t**Zjq3&h z6UcD=DC<`=O9+1m52Ig?(HNXBN*(=tHRJs|l4sdN!T$RFIOGf$$udx1Jv%P)v*ELE zo}M0m@BSPWE@p6Co9sPKekaw|@6=pge+vE$xt5G71Dq9lAIV*}^}k~l2=-K3YeL)O zE@G!~89Sw&kA(TaeDM44Adv_)I6@X_qwb-#`)X1ufV_W`jAfbA6v;cbaJhI?kDTZ< z27+OoERYgmW~E*^!lh^hG#S73JqRDnY{W+*>y_Tm)B3&LQ@7D^zMOIOYo<{m;(T-S zUA^99zFV(nO)PI+yGpAO>qOj?-YuC_h-A$fV78~StZF<>wx6PJqpC!zX9LOFHLl<_ z?OM=e*86|9p-md0(8C#;O}vrep?(7>>Z@_v3^(qXu}!o@6r1X=O%8FRD_Q740b%Og z45&pI1-hel<&hPv5jB-Z-P$87SU`f++GY>er9J|)cx)Vt-*fN?fGD`f-RXBM>VY!; zUnckuIBcSAN%gv2W6Q!bRJa&3>O?HofPX&K?d@9nCQBb7mp>xRPX5lhC|Na2>C}+Nc zuCBI+@A3ez6!6v~5M(9~l4cewSMbZZHyJ_3J(q!-bxi!Wz~G!3j)|M7PfDfJ)x;UB z4k|mKP&8T9CyhuRD5%wj-G?%Gs+G-HVM8egCe{$!zDpB;8F}4lH<9|NOfV>Wt?_@8 zrPOZsJgklP(yrM=o-}VLb%&QWR<<67Z>>D=wXITMGbt9&=5J(wCN#NobNAru&Gc%r z@)vHns@P!Ed*y#twWZ|OK|0!MxBhMpeDX>32yi16{Vd{uiogzsou1iWEP;uEv5JgX z+V;JF{5}?J#zb zjvE={wG-M{sLn;twa1s?{#WyW!Em96zLU;(b<*XI1%M;*LDtLa8t5a}cjcFtV5np+ zF1Ij5wrdLm4-^1S#QBs;Cd+>O1VB&g+Cc5K={6IsIaLRX5kt`t6z;M0F{xJfzUtW;Arr~oe&465|6Ar@|(w7kNjd(jf33Yy%Z26Oi&2k zRtues@Su36)BpFNcvc-#$-I|HS<+$Mf^O|Pb`Rk`bp|eg&KONrxT07zmCZsWJu;5( z^_&f@n#>%3tAOmI-~OV=N5!$bwyLG@g%6{@yK6-D2zrY1 zA-=bJ6@+v=hWRoz+~cqF&#Q`Q#I}c=DRM#sChi(dxR+cSvroe>Sv#S&g>+)@*MS;? z{P}a2I-2&ZrXY&B&L#psr(u^B`x-D!0#U+5>AtQLm-pt3PC%G4p%s6*Pz;o1R7TsA z(?Qxk;8lZErL$m5ne=fN#pfwK1J{k6PYXC%z_ZJh*ZJiB@i`@Tq&R}Z($?;vP+^;` z-4b|qLPS3Y#9cm?XtnSGup?vj0*y5Ib46ONal4jlTrMd97BWoW=QU<44Jq&u1DCjq z7QLWy=+}$KbX}8cGiiU9L)|>lYQc+5d`T5w?nLsm^zU!r*ZjzyLtlGZQFVP&xpRkp zELS0$-?(60<4zxyCq~>CehC$UN_0QJ-8x$wtBH3H(3yZEbd^e1ytn5lb2d-ue|LZY zQgMD;E@e|5+siUM$#CnjJJf%m*hNDU zD`{%tO4M`7b>oBx8L|8MEI=4>Y$E0!O1Wc3j09Jc6CjcAd${W%4>|Yp;;f)mc#x$W zdO?0sB*`|K~dJwnmB!NqTI@xXWEJ zBcqzcT0kt>>@p;NwISg|3<2YBk{b(MYioRI9KI6BO{7fhG+%Mh)mt`)x8aNNZww;Tr zew~X>+1{aJX&f3dGc_J`M(uSoYVT<@CRQ;^669tF%Uy~}8E3V0p8~!Qr9x$mcvv`p zvGq1ls&s!}Jjwl9mA709W9ReL`hOC3zFKma5<&Lt+!K8gs257984VIa>4$(z4FBE0 z>FAomA+sU~Bo=2u!bOzPeZ4vzjSHp5Es7|(5AHOjYD`gr*~><*Ac~)YKV^QphowzV zb&fHcBXT0}s=kqPMd_?3&5D!8GCZQruw475!H0j++g83QX`GW7hw=h;Jy|8SWZea6 zIRrv;WYS&p9soiHSlOU0GYrUrVxUa-E-iY}*nBxVqXk#sBWcEpjtn_3!AVMK-Pe!1 zw^X0i!qI(@rzq0J_2&Z<1| zfKY!WI;RiF67|yUs=k;V04A1E$%0Kak@2Erl~P>L13JgqaYytMLXsTvG>A*06lu^2 znpb=oK42dVO0#z#3<9aW3w$mR-CE7y98aV=y=qiYTwl_95RF$sxZc}}GXeGR&prc# zVTQPjfGSkf9s%UT*%xl@!NsDv)X9d$sX|eMv7o-;gKwS;5LCoLG&L}Dt1f|amyDj(Oga=IUV$!Qx^XZdcH6G5jIGi$Hpw};;)a=ayt{wS z@Ylb=n1XREadn*?Su^js|2VToACO0Du5o{M{C(gz(D}nOfpcra={7(A9zh7Nh=Fr! zFK(|dd_;X)xg+)&$3CJv_Hgu`-SH5K0kkZ2Wd@;k@$E^w#bEcHXW=9?y&SRqW zUO<=XRgh^W%m1(J4a56n@7ok&d_I3&P2OowgyBRCY4De~4F1|{K^QSX0VQ_SeqkIg ze*YOzRG^^>CAS*_lrSjjk?SGlI_T?YF^9%n<&)iFS*T>Wp;AubkU)q-oP~v7k6QD3JQI8D9+QPC zZok)(rggQXR%`g;;MvizAv%BWBs!^!W>qqVL?@d?PlB2E*-?M+l)~s(OE=i+t9Xw_KYqfy5E0_{^D=EKpMb; zfkOhOb~Df{k*Q|nBqFoTNLxc1Ae{v=--L8Eq-A7ENb9v}L0-_ZN7#vLMl&lz@L{3?D0mu-U${$4|9ic4H~4W1{KCn8BtSV@x#dtSl^m$V>a3 z8Ree7SP#g8lVFuEblRGPn0Ho@OfxE8#**t~{mxV>^#l;ZkesecFWRq4zmrhF1wCu6 ze0xAS7Agt24w!^71Hpx|z@&^B37q2tlQCvOAKz{I_-;AYVpD$<4Y8_=fNJ9{kP8QJ z)k&Pi`NbJMCAiljfb^faxfx6i-H5Y3;kc6Yhn^}MAd^Z9DfKg1&eXY z7o&|krg7hBH4d#OH`mOQZgk10;?Zni3}bT1S~VdoBYe=b_S6Od?bZHJY2dmI`UZU( z1Q0&#FH?40`3rvsTf(WJ9(~Yn9~L|a*!Pl$_3kZC89Wkr_a{KsE$!n*+9!9@p0oHd zrG309?UR+Xdw??|FjEttU;u^cyx9ri3>dE&lSpEV2FNfd>ozrmo03a}(fZZlR|@y! zgV=VNqut#f5Gn~>_(im!bDU1U?K)ln5(X54z@;f6Y-~?sXB|NP#_^NW4cLCA>zyEmt*VXK%Mp5bIP}z8W@~X{d zj~QaQ9NlFQ&rqtBF8}j>GD%`M9PbXlq*oa(*~v98EDZ&#a~{{3a-C_iOS@#U?u2BM z0un%EIwyZoQ#+Q7l2J_L7hk*!Cd*0koTR?i^tW?#j&U#Wvb1DiJK)jd;PKnM*mb%7l5H`k&GbCsy zt4n|3d%%eNdIl8V&OJYa-ysBRe_F-@K!G_QK7Fj7mA~Rxufi<%*|WzGl}bc0!J^@J zZ}=TJ#CmM<-H-2q!E>F=l?#7uoe7@MnN45{(RKdx;yQc)t654Rh-c0lYxwtlm6#2q zDo&EM3>b(4nj?r~$Vd{<95MuK!q|x#y7qsT> zjebJE$~qE)=0!Q_KaOD;!YOetptAvXuan5zk3V{C;ccc`L9*q@zkZSi;rGyV(_k zy|@%5s@*(*D_GWC6@BPA71dbm?>gToT<9Ihz1qS7#G|-Ji1w z5azo$kO0;zxeEvbOwk>a>K!m<2aJE+si#?;mB<`W04-50c!=Q2AaY$srm_lHV>xZ2F-_*giAi4L zWGj=5x69+roX?KWbOuVKB$)03;>G8$gTeIcua1Jb6iE3hKjn)^gj4Zh;PbMk2tap zIDl^ikqKTe;Kff1$sBY{exmp2oe2%0ZyOO;u2E~BPeA*x5Z zq6yeyx5z;D7t4PxnF?`NRPa=OpjB!&jeZeM2py9SCk4U+?C3jCSf((_=cE358$}3@ zp2ow>a{Ow&Vi!(mr-fUM=pW%!4LB_cr^Rhqc4|onopzbM+AmLqYmk4YOq!^X*}Ot+ zYP1-}W4XIL@CU}ML;O;tD8Y$L*txX$@%Yuxpl637+!!r>0d>xa&6FP$lOM-U7cF~5 z1Ks;!C)r_eDH9x(9R3Uj&kTL}_dIP+k=XQ(j5Xf>=&jbAoS_c-SZg`Y_yBq|NhQQ+@%ArzO#kI{aUS2|5489#{xFyv9De&W#EH;92oXGg@GeNK z>h@xVI?L%LNV>gT;Nba}htK+lPhJ3>i1RVMtff4az<{b!nst9m>G(xL@t6H`7OJ;V z;E-rlmB$`HUS7`2y#B;_E#!F(t>axy5&6!FdF=sUq{D1hWotVPv#k|3F!nXh^Q^># zUOsn#OD5ahJ_?4MTjChskJGxXU$`K_Wphsd6nh0)y9SS_m8vd9h-8+?;>8$$hyG=H zRl8veq=o7f-_n26MQ~VsY*ge8{~WIcq0!C7FZj?-@6>cV!=;p{+$H0dWt5XRG#7fl(QgHQUFm~YWA6s-wdQHOL`K7P1&zzF`r3cUS7MoO(BYkQz&gfG1lwGJ zNra_ixOh?s8JVq5(+47BgjH#_39;Zr<%|$L5`z$4nvE(S1qSuTVkR7Jqu14h`(%u=&PAP5&P#LBg%kt^1blz4uv59A^ zfOdZp^j-A=Hj!W#w(Vb< zJv}-5*lf#zWQC(K9q)y>g@sHI0xI^^#YMFA{Y28B0$Oj zF9;qMm`q$!IkWe-j!ZGqr~KEBKAoHgYomV(|Lx*Zz4`H*p!G~kZGq0VwFOYdo$h7u zPIrrA5#R6?z#?4{7Xi0nPIfgzy*&g@vQ~y1^Z==JO4eLDoiboT(N&_aT8*xfbgIH+ zz!+M^nG~&7{{|>$kQ3B!r=^o%Couv;wNOZ=t9=A8!#POQK)cae7((b`^>;=dmJxpq zb^drcy(B{pom?*e?I`|hqj$VgAA{U+iZU90+RejHl)@`u6KSzoF1D1VdF6C#oMPCT zyVusGiyj4!q_X5nclv5j&_A^w$SmU#p@7wa^^6^m}8j=r0Re~<^EF?YHq@lJOTA6jG*Z{f%4SqM(~=25)J@Py(rz*g+*Yy4M8 zFaqW>Nj)ICEipLprf26~;}U~&={=p>89I9o%1oTIyxV3YphR~AzV~1MfUti;A`CxH zwCKkwlvud&aopQeXou*3Jm`-`B*Ds(F!}oVklc3l_F~v| ze1rg&_;~+7St(SkDxrV9_;Y$$#=HheP9$k>kGSG!Z+a5yf86>1thyh7Vo_>Hiu*Yr zArVR-PEwJJv$~u!3j5(ta-DyBa&e)I_4|q(7lJ#La)>LR;lW?jBiF8fkXpNAJ4h0ioP+^hDm)*n3yHZRRj{~36wsEFveUjC<`D};1G zk%s-l@ljCT15Vnu@0#ik#grOZF@-8smJ{c%o~fl;fYf$Lf%_lZ8;O6-9lsQ4Fielw z54U$Uo8Hi169n0A8{?=O1w$@QEDtTMR&I!WmMvCHubcPpM?DQq)F;cD4AO#0t;(&@ zn>_%=SQU=WV(@2t(|KJ%LyRHlz%tFeiLz~p#jt`C8-oo2ov|LX+l#BZ-e-n+h1V1T zW*L@mJs(|%i3YWFUju(_IO7e`RG&j>9QA{fhW8CFmxy^_zYSndI8j~=Q*xe|t=<51 ziLk9{Q(S}hXON^!G9(X0uJvRJb5RCc7=06UD9fLtA z1(pj#5MAno*Xfwf%oB(^|9#bO3_#{MQT) z7()yBD8{M@RwJ#~f*tRTiihj%0d}3HKvmRs%h^!K!}<<+9}-wgU83ADGn<;7ccDv5)q0)cdp|V4}vB9)xFcB4xx?Il3xayUpg3b8##56R^8&1$zVw3Pzs_&vb z`5{%qkSaxcNdZg50(RPyBYH7=bg~+X>-OX*zJzWX6|4t>|9Yt2d3ntJ%_&FtM>6Qn zPN^R4!yC)>BAfO}fIMZR?XOstO;g<`}`bU|*IJbFgUHU+=J+oEYqe?7liP?^MAEvLW5 z`|B@*i$-;M@mut+4|>b=sT$JLbdA<}w1%EKNPZcg9^qPzcr8IJrBn6M@Zb}2^YCWq zT&_cby;*+~;#f$3+fpks5S@mZbGq2=?2NYR^BsaGzwJ{r6Xd-P+zE3J)Ud6;3&nZ6 z$3-7giX-kZ1Me=>aS$`R*{5b7w5ePRG1(<0ISrCdZp)kanEo*sGdbf^O5DW)Gam5J z$9zE!O_)$TYA!^Rx<~i;2jogUtt48%7TXla&3%8_rZQXiDKoM5{2@eGaZWp4aSBxO zf6N^rOJ>r*kF&0(s>78x;ejddBGz{{PaWcwcZ6 z-CBPXhoPZ_D?d;>DfRf-;TS2sSlmfpB2OQ+eH)TDzoL_YzkxUHz#DH?2Q}EDIkB1D ztV?!*$?rWCUdl-KHBSI4I_RF&-K>aTjSs${M{XU)FuP*7R_LUzLiY?#sXo(3Jqn7v znN6(Ihp~nu0Ut2wCjc5AhJv}-gdigooMwTNX+M$Z?e_@ zU*rQU0W1}s2L>!0xV;g6*%d@P1twuF{k=BK8#KG=n%X)^Csjz*>7^6+{}Nz zXJ97q@LdOrbu7^=!q+c=(%UY8(m_^yh{<*MFDK>A+@FHdFy)ADgx<0Z^lE+t3SxXd zM__ExLV5EyBG7A&oDwU}os;-i*!y<&?#(RbWO@}oVR@-{e3r?}8~RJub3 z-Z8#VeyFn_2U>t9Z!WAVX~GPWTg3^GO7%7sxv&@=s*kG~B(;fg`2!5OSe7)5p_D@W ziTA$64Z`Qa;Dh>k9^(qS`n!H*y+Yh|q3SLJ1$YdRg^pjkr*OvJyw_%c6L|I}>6x=8)`IsFe#PF%Q)*bIRjctZDP|aXF8{<)m7aRh3~} z4|qUt33vdV8>I$3DR^?H^2B8A?gi1I1!ogSRQ7jhBozoh&E@6w#v6Zc96o#cMYt~I zg&OulwL2U?Q%}N6l~s5mH{F01egIa#gNl<6nxNnDwJC9;Lf?3${VSI`7mwAGSsV${ zt6LznL%lklg~4i69j~5MoO1TdznATmB0qZ&Y2+efEC{HCVI@8s z4ybYw@2o0CJO;59cWB;m7n%wU6OAri(hd&|N03hr)?#wLE>`*w*u!`pJTdHMX6RDHW{l)~5+Q;zYhd zP^tI;Gnd5bcAx2?Qx9b1GCgFAsu3?5(INvFS^IwrO|A~M#RLwM9Cj;F7e@gVV6z(- zrSq^QRkVSD!zXqPGeaOux6IJ!G{I(#}BH#E8?#Iul8 z#m9f~4{VD~DU=M+<7ND{SD1pRV4@hx#AwTw$)*O?^u}nZ-WVgQMvzq2A|Sh-(B}$t zxAMTqP0GJ)Ha~?B#|6@{k^-Ip-lrO=yVuA^>I&X1LD(fAuxCNj`!~NV=n7(9$l!X0 zekV3+ZywNQ$*_>Ue7KAHJuO}W7J@aiMO^y#S3#Bs}-m! z6&#BCd!SNAjkfL61|XAuGg~Rfmi?!D_4If#y=2a}x{AAWZkjrAdJ2X_F06|$_Pr;pA4~7*^{lSfkwn~lNscB~ zO53Ap1bbUgJH5m5WYOa)ynkBz=UMHa7t4Q!ghHB)wCV#VYB2Uj>-H_!9xp11m)$L$ zZm(1TFq<6)?A%zzQNYo#WCkDipo2JqE(+UzL4Mo~b%cfxa3{Woa~x*X%lv;)bMyQ3 zhHqdvzMONHnkJm0RB%OJq#n|2{jKU1S<}mMsP*omUjNdRd2`XDf9aEa#{sb*)ikXM zkAA}DZ}19~`{ca59RP@Y$1psPA`3`7XQwD5@$}=3k$6^cI>|%-9ot&V55Rd5Yj`HR z^8{W4!))N_%gNERu%8!jks5yk{RmHernf!=ZacZFJ~kM%b>_O{ zEz~Z0$kg*MkK#T-P$XR_G(f2YRL|D8=NBh*tb(>xT%3k4dUZQ}rDm5i8m2a~l*y=h z^2r)oK05}LG?)!$pc83uC}PT8jQkRSxb1ng=ya{H5)LZlOkJg31 zwmd8|bXw0xLBRLVf8Kvb2NoE^zfyc?AAI^Ih&>Y*^nKSGxNFsq1|d{KxcR7EEELDl z@6?Pod2x@0FaWp>-?r<7Xn|~PzeZcz;`Lb3H%ldBKb~%h`&PpLgOJ^- zLQz$PLgndbycX7?caoK}SWrFuK4Dn{!MWp9uoi~)jrqma`^D{6n@4N& zoC!ZftvF-bPBc+@@+#+|40xZi)KMkuv`WrF3VTEX@J$~nCQ zTH)61E8M&ZVQKI|lo=qBn7YdP3qZk=M}qpB87(ab(GkJQq!JCa09vsK_gW0KAW!be zP&?A@9F(azXB|6dpmH(4L`~vpD;$EQsP|^nBR*<+GB}-;ia1*|0}|v=I=N6FR%|}a zWT*U|-qwFpa6Da2QI=Zd3FWj>aioa3%5*7TI5ejrGB#UJMU`&Lrr#50)qZ4w)~r&Mdjex{XlO zYGDQ)(ZM&)h?kJiU*m`ipyIzsR_|B;9)m$dN}PX|kS-J9j4cDvDCkC0Mg`6>EiFKv%hTbd%R#+$pSucpDb#grqyewINtLZg9gIJFdKk9C z9jbqRTzVOgdWud>l5rY5MlMp^mrItO=zLs=s3m${+zXo<_L9D~=fEdoNwS%>@uGW* zz?t1ss3eoYgfomHgw_(ttPimnCQ_PLO{<#Z928@LDEQOt5YRg{Ot&pjz5C4TPOAGP?O3sS&Ek1wHFHZwWMCOvi zJ@}D_t6w2#yX4<;j({nych&qC%1-S&9XzEh#)doWT9+B0Czg|=K zW3x~HAH;G8qk9^Q9s-L!(st6mrUiD^?TNMNMpP zO?7cbEXzvowx&tUttw4iz&f#%gv%@GI_0J>RoRiimNHvT;l30t;lA8NHb63l6k_*J^Y(qN}t1%ivIS-By45FmH9-APQq)U1>^maKnfQ zERt>!yRRDKcfiHnTk3c36jE_FCt9~y)YsSIW+s4*Sd87R{%7Le?KK5x2J-a2wo9e< z9F&mW1qBP4bot8XNX3nZo!5+yYUYlbb)*+A&et8d!)i;k60x$}+}9)!z$ z=^dAH>QCALJQ2Y0({#rjEZDHi#TzpQ%1kaj@34Pw<;9vOz2N;JL2b$hHN?=k);v@M z;=E{E*6IAOsE}Nmg*ZR{zifgz#y*(+1qBiVLU9Z4?R{=M0jIm4jVD&?@i{0Z-2{Fr zP|Zf;S>JgA3UMP}ErPi1j_82!jL0PZx(Oj36%?AebHSz-U<_jl!KM~q>~33FfOg{i zB=>*1{L`>y7b)j^AY1JLEMwSM5Tf=SBlf4@$nR(U2W#_Mp(>fk~M$I$3rIQ{ZTB@)M6&p@Ln}`!2 zXt8J<6`vXeNXA7bYBZe0WwG1mi1FB+CRpV! z3qRhlk*6VJUVSIzUbfT$85Jk6M*1NoOBdq46qHUF?`vC!3YtWmhn;S|^rFKdw4_>h zJO`*~q6921>z&>-_SW%!yidXC1&nnM>(qdtHNk_VswM@DlEK{aK|bEfme$5Mr}KYb zrdR4k`14UsF+gH=QCbz6da{sFxPceT2QR@A7Dm0ZHy(oDc8aygiR;O5`vBStmOEZt zA7ma)&+LVnr{JW@T>Bu(%S3-&PfMEPSH!-Ipb1SfPJn<@Jax|G6O*={0YqK*xd3M6 zv#-v*N9K0wJ+eexCgR>htr638gBD;_^F^;V+t8I9ukA|KC8X;HEx^3Im|_pK*VYAr zPpq`L7M+)H`a}HQC{b|oQOBj=)-66mn8Z-Dx=bD0 zu#%zB(u@^`OET?x!nf`}ptd%dMF()U$t9!wXq%Vui!+d_KoC2iIU*|`_IjVu91`V@vZdO8Ovm4L1Y zgp=FLX5bb`#r>V@5{$rG#q-Je0du=bt| z>Y#J4!=MiCM7<7!I>=M?8Vu^-?m9>SELZn#PzST$O)~|Rqmx0sa9X`CgL)x8(^H79 z!eN7YAy|SE8`QxlQS8c~4vauwVNeGk6BkEk(|fVH_9HaC7lO5&hUvXXv^3)k*v<3~ zutYV;^p1a@cQd^g;!`<==u}Q~e>iRa2RIXp5ruAixd<(3x%VG1FM#2vlJQ%-o9WJO zcbuB2j{ZDS<%P5K-yM zSx9r1>u$$>fHJ~kKmQVcoz0QdK=kwd3qesF=?=vijY+i;t^i}sCLWY)u@}6BIUimV ze?5O{&Fk42dqa8QXr+Wk%_FQ*@^k?rP-c zYSI6NOe;HfbGC(b@ft9ywLLeuayC83?8V8a>pNyT*V#Rb3kaNek6Yi z=g!NGcdguXjIrNUo7QeV64vpsPz>S}75BMP5}f6IZ8a(;oS-O9kidXv?5}U^GO8*q z?~JJHoe|M3EcjK+W3)qMCfgy@=u}E2alkspjwHL42;mtq-Wkmw5P=bsovYG-5VtcV zlPm2)1XL8Dx{VW*nRPZ=N&H;1uDO5GS~vu46n@`u{!NuBWZ!qW1l9suX=SF{u@rhq zwhhL*e)h|S4QPQc!fyuF(WrsJ8!R@jI8!Ru6RihXfTj=&ELoth55f#|6Z`tlvN{hl zx6J0JNotxp2T^1qxr5nDlq%)9A^tdkW=D6c;(aKlW!+#vT6)$l0uDI z8lIb@ej9cYy%#ENaN&Y$dm`Q+(m`$@w@M5dd5W}@zRB(Tb&Uu@A7MR)3} zRSAN!WJO!Yz3#H|Zd5}E>8OA0@;(50Wb&v=Us$>2Q%n^P>W~CLRY`4Ec0CL3Om13{ z6uW8?_WaS`X$c6HC*>f}7j=J$o_<7)UheI@17Suc?CJa@-3~{zi_08XW?JpB_cA{?jj zuQT{ar;)UwRzs~tNlS6MYM>3HZ9fkSxWIU**WOXsu}H55lkM0XhrGlmay^xn(hj`DhO(~LC)HRZuotZ&}T6@t|p zH*>A953XtEHM2};gUHruEKO_8QQItk0NemR(zqK?P>=j{ag_}j6qYG}EJE?$OtFf{ zA6UoOfKdFmYX5vLC<}O}6RnBLkGF*+&yq@&@@lBm?p9t-?W){@NbGDSGeMk{dw`Uz zWmPYh4Pj%;c(tT-WgTcWP(*%pWw*EjaTIGUb-wTt&^&0VfMD)%Q4uJuvcKtjxjDd#@b4^5M&1GZHrPzzlKNY!wU;NX!<$DzVH}#_a(mwM@8JeE+RJR&>yR8&)J_Kq>Z_g6XSH z+1&%IshWF^8vyQPt=j8SJ*1BHzuB-Y1B)@L^wx=+E{P(Mb=+H7FqiAy?kr2jdTRef zt#`J6MwDN*n_GFg2)d|lzbX>MD<@Z0tXxTr%woKykqI#SICRI~`>s_>!r4X5tb^M$ zI-_Cus9&QKb_N!I%PbQ~yEFf@?FOR*eq#RRwrBJ#$qCw?9jDk$vAF3Og-y?H!Hp&B ziP)oxA}XNRvCs5v*|=pSCNJjhfgTR zC}+ze=E1<(pX8D9;3lZ0BLUs?G`2WVzLNMKQb<%kR-UPUr~jrmZYG(gxg+WC;*G0< zxop3Z33$nHPxrt_d2xd>pb^_}Rf$Sl=aU<)S<9kFl>@BlId=`1Ws#+d<7$k-^DgXs zK5HJcaJqPNHH1#jN677+%ZrO&c%=(nzr8qFg5UL=fCkJ3HxJ+i|3?39YHIkMVT~O9<$7+?_wZ#QLp?_KhOr%)A=k1oJebS zP8W3O`zlWP&d@Z3R?-|dO?l`uiw>;mIXri|q(F>+o*j&b6s8W{tbMRJ{T^gZDH*9a zF%wg4Zqb2@h#seah09)>!X;S{55BXozi^XaB>htqcr9Xf` zxcX_n`_X01S@$*Zbaa(Y62TIfC2T!!MRmSF!JtBwVTb#FzG*^=tnT4uzJ=S^va0@2^xnBT5*<7#yQ zZ7NlCweCtEEA2WO$vj%~9rl2+Vs_DT!vPkJvHNTM1aEc(nHP&~Y;;7gPNu}lEG1l-Ur)$KijwDYuq z105OdZiB8E9d3bkn$cx1^mfA-B9qe3j1ntvPeaL z1SeCxRUcRZsp6)LWHVBZ!FINGikYGcTGD#Y*A{7Y@c4;(={==i$2@*oru!GQ4=B6| zNE5Yb5ZW$6+X6C*QzU3q;1j{2dA43_1(BHp(`PT!YO;G%lIgtPyx^HKmlw=JlGxpP z$La7&Z|L`8=>a;tzRiv>+3Z#t}BK3bX37+fBCEhGaJOM0Ur;0AD~>0O7?`t6kAmf<~D zGXU-w?s4eg*8VqZvHSsW&+wwhnnz&6t@54+KtWQl0;LL-OaZpPP%<`B)>VRktn1{w z*ojGIvzihJH&$pVyJ$M9-g7`9AI~l+@?<*KxCwjdb#l@j2VGdP^u~bja7alZUI6PE zJEZ3)>fIjzi>v?-3?Gy24kWglPTyeLEeeKDRgl^)YhH@;CyJ`%?q;Ao3b4$>^Xj#{ z1myL)g9J`-PrKCjxtK*M#o+{hK6)Q(Q@+zLLlpZluY0U<0oF3sDYxUae-1gU?nx~d z-`CGgdBTH6$>1*jhDdWHGJf?CUHtdehv@V=(qP6``P&wLkDu zAnv-CMW0Tu@o($c8iy-O&Yn^Y&4xf0aL`EsNMuO0`FPq+6|qeta8}HJIaDrkw|VP# z?{uE=>05nfeEz7JcuJq&-R1K~BQ0%Fv5cm2^FUQF zRZwwUhHbM&Jgc%?)UztzZ_+YPU~o0RI^?r{>H*}IJ$%fl4*&mnytv$)Cy^5pX)I_f zJ!pM-25iOH!B)SM|0Vez!8fv6Gw0}@Kfl$|`owD6qnS{lnK0V>E^naYmVy;b)yeLx z2VJk$P`T2oqf?)M1`r%2H>wh236?^@(r)}v<#0yl=K^2yM;=ovsNB*D+M+}hD1l$C zq^Ul=c{@|5CaU>NW293x9IUU=9)J#TUh~tk6L5(hUed7>un@=Q1INJ5bwFtaPek2LkT&lh*Y2Nw(z=D$v-wIVJ1(lMl!#RRX89P75#n zt~T7=DWMGu!p3GtiZb{M}7J4XK{W~72nVgHJ zw}*0uv2_Q3Z5y_yqjHw1gDUL~M|HBk!`(H8{DO<;4>2hPDNbtDPGJ9SH@OE`;AE6E z7(WnokpA4U`Z zWO(%c^>qA8<;geYY1F$sdBfPreU~S1L0#$l?tgfHaUt@al`uWlE$&dFJ)8Wz+cbgH zz*23$DXFbexj&n02dZLt;M)2^oF8TXv3wp8!Gb;zMX^ZP{C9WDixnNzNHAIzPK(03 zt*zH~pYdbL!P)B&ChpIM#;CpQ&NRRr!@|aCBHE~jn4sH8-)EfN6S7{8aXF_bZtE)@ zF6a4wwhl0co~=8;3Qhuzw|l*Hyxps7O~Ozzy4o<&g@bJK>{d<%o&ePvd08yg-{~gr z`6)Ofa}GtXDFCXHe(OTt$O?$^>Pg9DgOzQ~>r6AWH(ox!0FA$= zJ&$d7*V(_=xV$3VZa*Z@g*f{#J=dO}14ns(KY13#dB$5#H_gq#!bLm#xTqSd(3@=K za?_y{UG0_2?at~8ghssU5CAJJuBE$0)i$a>2xh85% zDNaD+LPyF~y4bddib_Lw|J3Zy8-=2o4$bcl*)`hJDI2F0#BsZ1#2z#MwBdp(Pns5g zh~EQmSQo3}*oU=O^YN4du&uq0->I+;r%zd?uD!5f&@Z`=mKe{9+fL3bF<=|0%{^0+tt zn7^TB`8UW@LQWyQ4*vP3YgdFPO}G2?j?Kl`bIs z?CCe4l${EQeGID`i%s!}tT^v$NLxu>oGtm$)Zi@zyzLQDY!(1oI#A$r--Ytd2&`(g zP#&27YN5O{R+@6bTp-@xLCc)?I(7QDF z;#Q>r=>kV7HBBFTcb}YKlH@+SPcHP`RUzm*xnO#b-l6m4g6-9La=}TzUFdtvH()`y zZN2@?n;Dhi&exy;P%@x@+V%2(03rhhg6K5}P%)s#d^oUz>5_G~=>cq5@MwD=8~Al` zvDdW_ zdZTQ9OXTv}Lrl~9_<4#inv9Ch@qj>4yN<)%!wEm#_bStiFw>d$Ii~X)k5{I5_9j## zu8@eEy`U?eZeV!q6OO(O_3(u7{6^OKefJgpxh4tK9MLpLIUy^>( zNg1RBd4dXg4VIh*YqV^c;}RB&N5*vR3{pzDLh%lvQqqY}bQ%UNf2K9@d^Ca=9|Pzm z6A-IgkK3320pIfm@~(XtD?sB{9oHdFa&sRcyf_no0&{zs`gPmp(dw5Z{6P11t}SF> zESRy_xQ3ngU+_nh#f_Iii|Y@0&JW%{o{*CPS!4wwJ^ipK^ya4@-T>bzQi%Lm=HsJP zX|S4A$rrDb+unV36KohPdI!cOEIzP9~l&r+N z!GpGctC{A}=-EAiOXB`gDP0m5v}_0hT)u3dlwNHB8{eyR!`QVNw;O1eWv8EHKhgxr*0W@Y?;K!ABQkR+DR|bS(=}zzz zv3F=MKb~ukOa_f*8n3h&uTcYGj?DOxlN_RdsC4zaUz z_3}(W8+Nw8#yiKm2v}fPC6~+g2a19z25Mrb<%Wz+g&iLRFtJU#$O1;YoCyFG1IB`3 zK<~9w6VZc!R?Y0(y#dmSW&AsD{Q|ics}cJ3MSv=L^+l2)EjRT=Ivo-8KF~?1-|Pv0 ziIQd>zdjyuI5o}1-WVS_|*cdMzyC`b9p?A;KZ`4y+RJ&mDZj%jXARY@%~XsJx( zRV#c|gfDga7*s~w77w;ZZ-?3q^xFM@#!lW_Q+Ed^7w+Xf6KpBzn&{1b32Y1XH~j>n zf~Z$UX3CjZ$kS2YzC(k~%mPeN>M%kjs*zFZZ+2n|u@^4x@Iu?0jr5|a&?kKw>8y(b zdSa+e2tWS=`fr>BNrCKv{}YCh$)3cox7Z@MEHQ7OWmeq$r9F zEt=ajyP_2~yHc;_`0J!?s_d_Sx4Y>7QTqtf#b^&S2k<3SeU{lJL`uU#r*{b9#*EIS z8)7S5#rcsv#%W$&l3QnaoH*B;kmw~6lP@JQicXiLH%+}i5aTotq)#?VpE7^!_gWuN(R-EK9~sn@Sc~emv84lUVY_)HeT{ z4Uo#;WfZjvVnw;XJk`QM)T$J7_jyN4%8BDo(|MOq4nCQDtqwo>L`C(cqMtt5KRimC z1CB=@O-3Jsxnivi1rVwIme9t%)4KM2L2HJ2NyLzZ5S_pE4(%LCrwJ_5@sEG1M@ehi z)d0N*M^8T6S6O**S{dhm(>y=Emo`SE0u%Ka(W21MZuqMlP75fVh?1z@eLr(OzW@~o zJm*ZI+-Q9bL3@X31!96fAhOT*Zm1EMC2rU$*?ovv`nvRDVj|n$qw@_pAjn^TTU>!s z+|LN2ITk8)T!rLtXf7|#)sMeD&x{@1^uizt|s<1?B)c!EE?54b(829i_)`=`ogJV`1qr?$)J;UY)4&(YH?(X+AkT z1gGy;deT(LkPfbaxwpSC2&KL3K4KA=%*?muQa=@1vpFmE<5e4Gu zcjMo*-*Y!9NVboEaG}}*q+*$+Xt*+1&49SQbCEk%`7ycx8fiX?-g4Ti9dkbeP$w4R z1w!7t&p#knw7%?%eVRLYJUIOHtyS~+EoG|8fTsAL)E7BX>)+N@>cg1W?Zddo8Z=S- zohpgI*PMP^`!y2nW6e2eADhlm0b#em!t-3+z_h2L@#+PME9*ZUb8{ zV3i2=nhA)d@W(}J^IXEdeB&_5)owtio%tvkvP+FEn#g-qHgG6}JJEGSI_M z7blk&%ZnecUVHj_O39;?6#6%Q`UWLSKLlsIjUts$keqm^iZ2@eP3 z#QDj`pQer#P$DD!0}28oc7mlAB|Qv!C0)((*{>=Mv@Yg1Gom!oj2MhYJ#VFq#F>*tr{|beIr=Px^!qS8331J>2__pp&mtw4Di`(m^i&I?Ggl`QV+M zc$;{<)_UBe#Yp{VVMKn^TG2fxh4}qK_;ufJfD9;s)BN~a)=PXMXZ^>U^Sny8Rtf4VDw^*d(R!M4IEvAO<-)RWAOO9G=3+jps5|;qeJVa)2+-$ z?==k~A7!!-ir)O!-_&b=uRK~wfBlgGktn9?cj{jb`o8DG3eop30n^WkQo>}Q4m z2`sI1`^+A2(y63}e9c(%;X}dpGF0B>HmLX0;IwW*fvjlr2gf-9V3U6v^Pw)wSupb9S3LrF`zEPK>kWfW=zTLr3Ojm8*u2rg*q zw7YQ_p~K&9Gp!weyl7Zb0QSc zr$9x~O5mYRSufXf#2zqzFL4OV^V#z3_~h)8)e90- z*6(fBuaH1~xFM+&OZtu_Nvt5x6Sn0@453EVh*C>ChgP2fAu$8Cofj;|iZkHFLqJ>) zIj1bgi{+fMoX|tg3Ck(Oa!y!|@aV=@C4DKVMfYImEj0cwT>fDclY2e1Ueh&FSV zw{eG}hySPH!t`z+&I4|O#2q7<^s#A1JBR6(1D4B2J#Z}dHJjBU@t@BAgm`OMyx%S! zkrFO``R$jiMi%_X{1h}+us-5E50nDnSZ=XfZl2VCr$c6DS8CB&Ee$e(9euH!x5Wn* zA9stN{c`bJ9X>xRLf?Q>E}0|Q>Lmp04~Jrz$PJIvjjBQT1RiD61Ztq*dh5#A()KbQevqEFGLiT2P(DZ;k8Fv6pkY&F5-f zpP_tzK^C01^8Rt5=m?hO<7_6p^J;YhBJ{=1V#sx34F%>&QyUaI-g3^F8kB4ete;MY zXB$^Lyms_-uwQp72L}g}{qb>5%IgqPNUw-ttxEpX6ZOp4jk8H~A1y@}ObJS!JN+aS zekgm54(D2w>6YZMa_mYgEpVkc#Q|G}sdOWM9!esu2_?h#N0-l&Gv}}74XYsZ<|ME& zvn0B8-4qzD)XZdK`qqgCw?OIpj7^o2k^Pj}^Q(E|h-C}(ImZ$d4@k!jN&3kT=O;gt zXHK;PeZtn~D^?Y6RNn)_viWVDe(YrC+sT=K zi9%@&+Md<|srp2Y{bcnZF9c}=pwj!wIh3zl5SC7-U5EHIhu)Y4k)V;XWvLy=&3!Gk8y9DwwBnTA>+?Rq>F;e# z-XL&_f;dIReXhv^XL(<1@?zu!MR9_EdYvvqruGGITdnu1q9szwo+WV9ZnvTA@D}_Z zQb*`#J}agDgjF2L!v7xvjYuGKWmzQi^fwxRz19sO33OG*^Q+mPZOKU*JcMjIp}{?S z`-AV*v(vrrpV8f8-#>f%ApJE>e~r^$lf6IbkMwWJb*I0NQY|n)`7NKx_C3UZIe|F* zsuyWCc>Y&?^o<7`)Ol(UmK1dr=Kh+;Lqh1iE7q*t279hpPa)23yHu^RhS;Pkdk`-SBIBm=Tsix*GP@#|2~GW zQl9rwZ1rz{u+l6a^LREtf1$2_QvHvoeV;CtFV1IwB{k?<)j`9mix*^`Z1R;v+WHSn z=g$9>UPDjxqt<;T^p#sr-~2J@SqqDz0=+K(qPXi9tz^MnI0(8 zPpDgeNzrQjcmWeeDJQi!6t7draXmoT=0K`Qn#FN)1>9w%-xXikB=s_v-ED#h*6IH_bVmvvbPFUqBO?CiNJH zgPrN0KKWzxb0UV0_B84qsmg_b*a8*O9`;h zvoQo%A=I|Y%2wBvEqgY9f&h#C+BrZqR%DePZZ1T|)K+Y|%0{gj@6@xA+i8V|Up+Y* zePjSO3=RoA6@o3mmcgZZHXaJW4q(UNd5bOc=3?8ayT3aIm2Y>^E#|b3M?qR~A|2w;X42uXp7 zPywUc!*XD<%#>`;52Q?H4U=Q0N>+*eJpU_?#R4u}{t^X~L7l2%53qvu8z^nG-Pm=v z+MLy|xjD}dlu?h+x|*GXsbr=RG3iZAwWB$iy;xk;*Zw}rob{Q?po&bDD$TIfB=^VW zIPE+=_~IyE61q%(r(hxAPf)Q@j&!2hY!myR9e+9aL~$e*(Q3xo+k7``q~A?2b#&d# z_JDM(qT4>|0u}N2yC2VIKe3jc8G_PwGlT7ZG72y`?*MCmGaHzzyz4i!1yfc1zFEn* zq0(maH$zp&pA6vGqn&ts_{~0lg~q@}%1*=D?@%w~ICz+UU)`|kJ=FwGOHIX@zNTXL zfV8aS^p>XL*x1JA&Zgo#bGf^kiVI8?dYOtV7+3Z;6<79fwJlR|k%dOuw^?j9l_{Ib zv}-Dr)Kt9gYbtIJNW)4FZ)qytGQ;@Jrs5rQP48+do~>?TdYOt3jC1`>#rNoaj$5YU zOBU+MRQzUtQyH_Vj60^{qu5lczNX@#WYDZ6X&X0w=%}@(wgV0D&o37z`J{KM_b<~j zM~Wx|bcX3FndR}Jqiy30mPv+pHJIR-Dz)UNySqLUvYQ8dISIXv6A3-%INxIMOgZgu zOQA;#Z_=`*W^!n%$(F)qTbi&fO**y|N~tXcaV3g>>|zxwR#8yKYDl3O;ze0`nJ%B6 z18Nu=c0+N=ZXW!Em4L;HMgdM09qRGvC##oNq?@$!GNM;`K~ZfcV09AK-BGqo?eOe% zQ2KrY2OB7@orH!ma1It~ptat#an}^|25RKM0|juw-~qXfjo|!34MOLP1GZ%BMAR(r zx|}6{NFtL=MI;DDqRSz!ip$UM*}RqQvN15|H67XKmsN_XQZg7ELWMGFDJ5JTTbKuEK5kU$`R zfWr|GiVOrC0XDJ;hs49vHB+@a)3dv-9S3lfu#3N{n(qF(`kX$7C`poNrTsEuCaFk6 zyeTo0T(haVAu*F&6Rc(u6Xh()wFeV3$pie@2SiMe^JKIGKepOU%n!(meK6)_;tWL~ zGA`j|l4;4vT~Y_v#nN4rBw880keEt;lLmWZVk$$r{7s3eEUAhI5mPyms}3io^89po zJR+tFWON0ct!Xzg9}_VjPl%}^mzavdu)}7mCC$CGE5g+c+HI4WZN_*E|ANs5c^5_3 zoNE{608Lc0^2RwpJJO|Zngg^aRra79paaSI!*jqP!wvUFIY1{e8o)Kj-8tZY9_4_0 zlN`VvZb(KQ%oTMPMKwKTwU8^ukcRrkTrq3jwKwI8A=){45Lb*RIej=+4jFHFIO2+l zWYhpx_S7#Q5?3BhxpLUt{$$zQvJ7rbk^_TeHCyh{UT z3IxOD2*6vD9Sf6_+{GL&ewg&hp*Vw6L%zI=0-7G3*O@r(0OVZIA42pfeX+9k;Au!T~su&ggi=XjDGs6;W8z{RM3ex5J-pXbs(%Wo;Y z38&k7`$H*Fhi2$Fevv=7&@h9#h_vF+Ro0Vt#4RIK*qy7iLA)ot6*l?S8{Y*Tw0GVF zd(2&xy;Rl+Er+$av<%*VyR6b27ogyUPrmc5Y-CjiJsiB`ee#hMuY{`h1l=P(5xy3- z3ockKedm4t*ZCHM&RVFy&=;Ku-lw1;aJ~U;IVwv~E3^zINUyx{4&z_|1$Idu)PmJ` zQ{ZravS$s-8Rn7)$)bQ|3QQt0xJ6Q)A+=`%8`{4H#`R>8w5+#(Di-ZYlhm7~t;kON zbl5w$gH&X;gC)Y%i(UYdb;W+xOK>_;%Q`ZcxrNY?!OtwhP8RD-X z7-!&O8JBIz<;ZHn{CtIV$RuC%OXMjj@j}+bGtps~l3ql$^%zI;!rMJIB@y&DyTAJ-7m#4U&~bd+;dl@(Ct4+XrICg|3v;}X;e zBWI6^pn#y26k3*ljyWv74^{W`Q+z9E^*p~^1&b|wc>3KLd>XiWyEKwCo z0#s`eWPlPr`QRhe9Bi6_Rssrs?=r0QDt}6IO^p@sOJ8Sy4LZ0!#@ZRE5m}1~kTOkQ zUxoBHj?b7S05y2SR#ypYkWH3@_QAY^q&LC$ubnH!2QKg%+n)TVfHjm zoI`vdyn7Mpac9S_X{E7tPx27RggwbaAS<^ePYFtW^5|L*O#uUWxCA+!&Gkl{Z-?N^ zW(HabS?$U|tUaV2e4Gy!VEG`sDiU^b$@W1~>TY?`(j_M#K6G zz5P3!<|bd*0rsCSQj2v;uf27JUAv;7eocXIfO-}ZI@mr9)VlcD8x|-mnPDMY9$k3Q zvTuh=V9ap|>cr4W4c15Rw1gtN1cf+ifP*gI_@)F!1+;yv!8W6zt%C z({TZ6m4IKmgrL4mn1L!W6cbb?gnF*2Ghl87@*D6BR10r`!V|s@AX=``NX0KQSO*&@ z_-!;hOIQ*y^lV04Hyj6LjYcs`Vzy87se75E`PhTO|HgVNp3iGjS%p=FPM@9ULT1t- zal16w2=HEmt6DdW3y|`&x^plyP$#H=LNQcjp~NpiI*LtI7Aeq{AfrTvD5y~Me*@H| zXP`=yi{jg^1X&|&Gb@M?szcXqDpQAHk}-aM0&l<*x$ z4?2)en`qDLujbe*$z(acsbGfX`zB8!hMuw#*6k*fPl&gKU-bz))J~`(G9eRHpVnl; zqbt!eW3z3Ifmyx8aGZ!YZx<$iE9ldjaj67ByUIgs8=}h`wDMwbBpHx~UNY}ype~y$ z2i!_f9YugL&16_b#4ACK0-Ch+2U_bP%|KPw1jN_v%q>|*pq5{{S&lm@>A-hKfken1 zwUXtIY$Ciu2Dx1wu({Sf`T6klCv-*7D6Y}@+~2f-M~4xU+d zFOK5!weL>zpt=rccZMr!{dTnRH-#!FjZ;>UCgmQ2I8LeHhvPe?NFwZoqa+Ggej8%l z&ZaSy)64!evDpoemx$Yctl*Zt5lY+{7jgWZ*Rs}gSQz!!t68M`Mct$>P+GOZ`aM~W zq9+m_TMyVA+?M5XGK|%nz=SnAe$zB|9|14g^H@>fOhRwVxY?`<&;}syQ zgu^P}koCYR&p?$JJay1PW9i+LAZKt)BWnn#E6qT4Uy}4Ly`g%4X9@C7=-5Ax3eKnD z$!4HdpbJYQzm1@TpkVl3+q1_myn2D7ny6AQ9n~ZShBuiD(U$ER(p?mB6sJzuY7g}- z;yvL#Q9te~ZSGCgJjjbb_NC3Xl4dwM;;H!T!-WIM=WGZ2()&e_IhV9BOOCA^+Bt`Ky!Cvam!LoL)8Dq$G`@YhId&lBrYN}2z?+;&(uXL0-BwETL9jknd4)ID-Yb@<@gpY-oRt=y23W=6Ckooa! zxRW=$?*ra2@AdJ^v;v)%Q78?jZEmmtX+6{nU653NN(Maxt@;iYAAF>Obgs!*;dS4m zX?!GyI0H4phmc{u$q?+4DnZtZ&18Y0Ek8GB`*&>1v`3Ifkb}Z!sK{pUYSuF(E-rIt z{Va(C*JH)FsCf|&p8p9_tVwodxt$c>J86>96n&L2-JUKhgLp&ub(hs>@Onb=(J)E> z)AoyhwPT;dhR=k7zjyt~|>23>-Z5`8yXKg}!{BqxIGB8E7IR9O}!&u54snLuHvgk9}%f)4SK@N0&w zb}{6GgBb#YF3--NXUygEa~OMh^LAmj+RBlC610ya1X^w7ND11<5dzgEM*v!a8tB@F z_C(*RaNC~=IyQB1zNL|yzM+hugrHWlo5)#=gzN!AyuzMb4GQT6JXg~2DQn4+r7(G6 z>phh9ho!l$9E9Y_Hc{Q~5r7Q@sv?`WvT+ZhP5B#_M401g2(mLLTq z1Lfqp8K?nGsjo-S%&Qqld*SCt*FumdP!v?|)6`lYMsW@mp69UT!n#l>6qv1p)CdX( z5Y-TU;v%9ZK2aT7Qj)@8gx=#@twFqhBD`I@CTDE4&enFk@i{oqlWgq)IZrxBc0RLC zcmKUNPadC$V$`)T(5G+NSyF)PF!Dq7#DOz2P$x2hyiGRf))|+anQL-!+Xyj&7=8nh z9AA+)MfvdR$16$!OHTl+r`B43vu8TNAL|4}VIsO$;_KwL3g6mDX_WFL1^WemwAV>d z(g%`q;%jNN*)L^LDv}he(q3ODw2`ZC7UKao*QOuK=$t>u!yGBf*SRgT%SzcW$ zrco@CSO6YeD`rqEaiiJDe|2Vmm@rJRlxCP;F*($i zcTtQt08D`wu&@W*1|t`%{c+Ln4W~OtWp0_Wtm%n-B8B zoj*gBksY!dzs@iZke4rNt5shs43Ssd5OD_R$KG*L6WKL%Ph{F$F9D4iD!V(8qzt>t z?!t*eAVK4klYBpvM^I{ol|CD-ISyan`0_}+j%F;HiAn@7)h;uCgL|E7zjX`rt02ev z;pCBw zVfW*c%br@m0O)A|rtu%iKoXVRy;;=Sn{Tn8D?hdXU&j^_Sy&0{cSq62(Qh$f!z2(k zOac)knP^1S>?YBFpnofgsxTo@6(;%>>F-2icISn0`LHDrp_?Q%d>tFnXe237o82iv zMaQ;;s3!(=JvCs+fDyKqahHK{sj|gL^pgw$U&lr)*P8`*17AA!b8`=N7cKD0wqWAf z9Th_ERx#o}r1r4(_7iI29603@-XA z8!OLXX8!g9bwW)jLdG~#$h^3Q9}&bJ5h2vxCL$eeNF+2w%fSVp7F zb@Y}-g^_K4I&rEgSMUGw>$nk@$cN)RM|c}s@MK}d zvcPt7ytU;yHGZSa8R|?do&8~gg)(CO+?u@-h?Z)9iF3{$URZOWY0pq6$B|)Z^*FGW z9oPd;tA|ny*8|-^Ia@w~V~2n%c^O3m`_ZCcp7^}|s5wEI#MRC^h!AK-xMC~*&zF5f zyS&4{*|(G&&P@K=^jPu}I-ca+@K5t}mZwLk-2P92a_nelUDNB^TQBVnHT0Ucm)~Ff zczP~>9_7DZLo|K!66#-YU?LEU;f<%O2P8>d?%X>P%B3F^f7Wn+M7 zS%Owk43h<{3oruR`QTLvs#QOQ!C9~R|E`RGHgX24gwe*jW=mGkmOu@IbDEvSwEusc zzyUWd*z4JjP+k0=g267E45w^*RNa37AGTa~0JU&(Eq!?S=`a;rqO4}f!r6<4p1lXv zs(m27c=&09;^u$=Y)Wrq*)il82J#Bg?|meoU?^@h017j;$JSl9~6%*y^>WPp)PhM$!gXTv17~c zO7ZIW`#Z{`uC-5W^M`lxh0=vSd$%Y(hC1?V${&wZ9F3~X)^b-CM7(2%)i0@H+i*w@ zyo*9?K5+)}h7#A#eX5@MRLAjHc*c8wrK9K@%_zzyjr*T!*1Th!k{>=6eX2m;4~pCW z>9N@ibsUCnPTDmg25JawTalF;)Dm~<(*G0Fp53>=8Qd@-y; z6(|@qn9f?#5ZFl^*%W#qNt{?gyI;N6K7mBSps7wd3>xeBMIYy*NeI(sN zgNFTRmJ^d7SGSO#$xsCH`1#R;_M<^o+QyTtXFndV=z0l#9e~7=*DncURsehQwjRT}wZ-K()WsW3^hXR4WU>ON(_VHx-%3jUYN6@g}HoKWZ$cQFMsd{8=&oZKEea4 zu1|33=4%3q#4KZxiM{#h=7!oIy{-Ha1dXR4iDMBu4}6L_X;O=YwcU$TDZ zYpxb;sam;#z^h8QJ2&7UW*zvZ1=+L&3-EX&kQykD+{N%|! zSSOnz@hq6AqBXr;M7Eyu7kck5z3VE9^cZ{b>iHRQNtEP!tduyFBwnyft<@qrEAplt=Jy0GWm0N<cN}-zwYabreZjsKvD*+H}__HR`Lm_WG-jadP`l&te=u8&#}lyunnJBQ=9`{rA2BdXB0iQaTa~- zR=mDt-5Ne9_z#w^4vz$RM$>~(QYpVk|7YuIR<>I8A)i=Dd`0tkuqa_jKt&9zIj%SR zqD_1>RZklWmuSlFLk>lXQ zPbFmQWe?5YqV#EUAL~bk6%e_3qHK%jZ<2Mm#fg?=?QK@o7enja1|=xb zdP&q5#<%e0s587=v3J9vx$K=?Z}Ajw^rDRj*^0CNf4`uX*g8?uVzairpB7P~r^$RQ z>P11TnNKhuER2Zo#0HmWf$tFGX;B`Jh{%ZHgY_bWHk%`NcX5sM^ZOlpZe*rboT>1C ze;#Xyt&_N3C~YK2`&dI*c)O}+ZClyqv2(uqHwZNm*Z+qsl2Mm>mx>!uk09Qb$zi+J`cXcr)A}h%}Q31PGgQCpf_1CZbgQ-DQ=SU&5 zhw=@UImP+S)&`#;fOWCi*)Luc{R1`F-v6FZe?*ds^!QY9JbUT1dOgD1=lJjSQCu@& zMKUbdA*=x`1EmiC$-Ao8<2I0p>-`6mQy$PKaW;K3fzzVuyv+zxDy*SSpF&xLMoTkj zjBxzq15oLFtCPP@&Z_!OHRuB5-k^4-{_5bE@b`0AmQ&;Evg#2pi8==afPXWYfgyrH zf0A&3)ZT_VpVk*9>Zkn`Ak8peh9~eFEXOrcWe<#tYkN> zqT~tp@ldr5-<|X61*J|owG*Tc#7}gh^oG$R6%S`O$*9JDqh8PyDm>VG4Le z!~qlMDo;xIr%hMhbT4D~ zu;tD3O?HlHoQlJi6JCDf2hQ*8f^vrI#RNngF>$Q&FjzSj1gyb>c+If@_-&WJyn+|M z|1{h_z|mlim2d{qbw+~&Rb#61MfRMK(sf1zt;gNW|6s<91@qg_mDcm$Uy}$4f0oqd z6}v?=h6|QMY0DDD&fXV0y!B7#_2^Qe;Bkx^Ci%jDa8J!}tz}$|PVv4%lbh<4uvsbt zt*j{qON)9lz3d!cbdN7O9pw@62!gq}iaJig6pSG)L!#u_;xKa{v}L&He-N!e3BLNc_<8$aZ&>Vc4M)r{Rk~l&)__e`1LJ`D8Y(PV1xT@4TpofK%y^ z66z-z+(qkTlvFl>8coidFWs-5#C(P&Po8=NY31BQ*`~|w*DBvrUw*B0e-~Tj93TBL z#owFF%7hOkI`<4%IJo$c zy!i3ch=g4wxF*MTpaPkY|Z4t$- zYA#gS_I-krvr|ePa_Ukg{XVo)yT!tK(K({AMwMABhY6*QICY?sVxU_&%x2xu4bg~A zhS^1z94B*g7W|z3?+Hj2LbDiF61tSL9jd&4m=>8kTA-vHc!r3Pf0aS_;3-^Tq{W%S zD+{+D6UKN(iWfMZ7Z7D2&PkR9gB1sR5uW8ri&dGo;LWZklsc4fr?ifd6Of{QyA)M( zDT<;s@Yj1Qu_mg7bCscNxA&e?%oWsQwgai_C%_E$)zx%9gb<*}k(BN4zx<)-;L)@! z^xZ+@7uZ_gM?N)Xf2<{#lk-2PzgL|D_;|yM-E06Sk8^HOSK@$o`KpYd_j)e1`!8hUzM_t@mPOsUezftc?G-DQw>B2Nyf!Ty)%=&NYS$2Ij z#a36RQ?#2P6sFi9KH_m#w5JTL#N~G3xSDtDx&3%Lg=yabe=G2w0YPjfmMoipbTh^t zMUfA7)lY@me<_NAI@ndvW(T{&0!|<;)XV*1xDVdYVbO=b{o>OTzfe?6_2wG-KH6Jb znAiF%L?@HWlk2z8b(1L|UCh8)MPCTNzP!BEt)d0B#uY5iCKc{Tf5z~|D-8MW5lk$WA?{;nWTh?h z?)kJEVhJkX^%_N~IoD27hKbN)lP;er|4kF+18DalG&R8O(3HKaPVg{bA7wr-Uk#pW z2KT)=#@-x2Z`MW+nmvyu^7G#OnE|Cb&}Qu2fuK}L8VS}gY^jQz-GPfU;ij7jK#5q; z_qdo_e?-DVLu6E<(H~)SKtn^*A3+KPGJG|dTtW$mJY;gLVxw1AG3OSl_~o4{RlDC4 zo@2a3nU%f5zKONP-QKy!RPeH;z zt!a2W{&>QfOV;Z-Bj~q$drv=Woe#LI5BwKof8XHz?RbjcF6*HX0kQYfUlCi;T=44M ziR#HeO9u+H#gk_^WAttPKk=Mr;HXA0UxX?cF%hL}_^JEf zLVG}C+)^9OES=ml9ejrI0pEhz?g#2l|K)H9fjXV}Q2h)TZ4WnyhmrcM;oBlVcQ(IP z*?xcf*GA7ghiID4Gwcs^H_Cbqk?{jAe?u&5A<0q~Ys)Pn37JPyYibi}+pekiCKpwS zPaa`i?Tll90S<@RL%Mpe{{nJ=l>)bwgi*?S(C8&if2mXd$La=LHUu9rd`bDU59JR# zf>_OaMeXBPqem4yBOI- z>oJi9;?ZSZ)^jBnE#{@~dW zgHTx6Z>lSvWNkLzvqdm&&GCxn5WWfc-49K?h|8TTm#i3{xC7ak3HmC?e?gIy@uHVw zc75!Z*5MeIBaA@(`73@IBmCv=j%z|?O`K`v?5d7@%=t)}!l*nq@Y8ac0fMfHYMM|p zO{mJau*+4<^%>CkD*Sote$MH3J_KhNE>bREQFol@Fkk|x#B>m}%wADLoZd8MuT!+M zqwsq|v5b=9Xl+-H*7!P4f7oyXSi9c?6dLq|5;BS;t^zZ&4MXU(tNc^MaJ~~cl*VR# z2xPO)&K40wQuA7}$cA!8kxPxhE}uVG>Z~gIq%L=edzTE6ZD8}e=4mNcPr0@vIF=b zXb)Bad?I40&5eqqHt{*;D1qm@2e@I2Xhj+qDiJyUW6E+&be4Hq6*#TSVhJ6Q!T;16 zbu2pe&_4gl{{&!!B~YZ4=`Esg%so<>Jv1)uFCUo?^Is17I|oO&uz>63H_%;rb0NYB zwtq$5F$+<3N*p5Qe~^k@zjb6jT^j;iLBH2$_g&BC;)s?~k2u6)p-4C{166uUZ-ADb zxsw+t&J~+_C*x^tZW~5m)!GlxbyKWXFwYB&r<)tw)B3yB!xz+Ek!G||6^TvSjqLsH zo#!tKbVCuPVM@FOl1W=6^-eyBGGNNo*FinwD9e^QXihmme`ayH-Vl&wphCsY1npCg z#XN*kBk8%Ky1Tdp3xh7yg4zm92*P3s9_YF}S+0W>DN$zD{xC_bd)R z!?l)n0!%nBu`1C?8m7KXWqGemVToe=EWiMX(oa{0bK5sNS}SfaS4h#;PsO==~21@oJhtA_no{YJ;|h^FK5j zj~gOp`gFAb;SWn>h)@znDKQsr?Od?yRV>33vklY4-d-l%Su}K^c@SOI}E_H{9(*rS<8; zA@ynn{T6)h?fnoN>$#~Bf@B-_Us zkWdug$Iq*qt7b<(;g0T^gv`VVI{HElIi`-Gv*!cdZ|Uqn+vGU1G799ffTnC|J;$eJOZ{R)fg^%!@6k7Ky3{0dV200D?%#U9=vd=}_XE05j} zRxf0}g1gl3UtJypePJaF7`1;LO=La-;{4G{qq0w?ah02Ghhf9Ayhi_`c zKudWChFd6BI$Grtu4bJ^94Llc6#Ik`Fvf#HBMTS<#;|LwGN4EA)ofgW`3Zh}e+Hyr zA-v31?a=j=VT18(GtEsz;-KPp1R z=Q!7LbbUTK@zF>#a!(Sofb;2aVbX;wVm|6XG@`Rim*8xrY@e-^<3^pK5#z^W-wg;V z6dfpucW@z>_znDwN-ON$_|V9@%jD$6X!XhVK*hP8d88#99&~i4+l27*!;?&|%xOWLRVa(7l~IX17}(0-Kz`=H=3N+ z(bZlusM?5!VIF}>a#I}UXyz|pz&_l8dDp8tqeLA%%CvNrnMSw*owuw&BhTX-A_;|B z1c`J9D}l|Nt2)%1F7n<`rG)G_Gl?MVtXawD)4I={-nKs>MvR!LBsE2=Nkfeeg+x3Y z=NqSi`C0B_ZezwSe-s9F*X^arSXl_`p0`+2VjIweD$vnX@-3oZ@lHcolxP%brf{;Z z8Hvo3d8~PzKcWrPe|i(AD6(9dNENwjam3usn+BW4g%ZLHc z`Dq5LWqepXpO-UUyCPTDTf#XhLEl)Iq1)wsV>am??pJRoe|vD9U@Qtur|-`oWqaxf zj3(tB!lB`dM=!^iF-vJ?RT5+VT+5*yfZ3>NqBcw&tGqmPQLB+V>C$eCfG7i|%#=0# zwDl;56Nq6XohVs_tNpJpc6ax-h$v)6eU-KCB0ig*&Wtb*>zR#(VF0^qSO zVy4mKHF>hG0wS{HJyxg*;#Np9Q1LchL&c|J|B~!gfB1apQIrN^VEewu@-5bg@HO~? z!}#!aI)v%OC5k>|AOm5>A1sg|$a5}IA}&(8)|M}@I4|GMqu+Z36U+8C?OpotdHhr= zVjWNZ9)WWK7X3#sA-ICAQ~T4ml|Q)E@1US$@L8b>He~`k;$rx(5e_(s&v)e5l@O$~<<^H!&rS&GMVxasY zWHD6rOZ93_M!#<*Cj`U;bl+fYB@fhAGA6R%J!*?tTV@@qJkX|nlgU}v5J|`+(c>!^ z_G>Mx-XHjA^VqmG&rZ8tL99+yeTjZB8an72o9Lqiu55955p;{>U7bKkD3sF zX!^?IKr?XW_eYvEZS|GYu5BVTQsou|>#f-lmFSgd2bX_giExK{Eq&;j{d0a~0LH?o zKPMxU((kLkdW0QHu(w~=0no3(BAs=8f1EPrFsDFh1$f8P(Is9K9OQ#k2+q!Lu}pkpzj*ab)L4>m%G~jY63Rd(TqaA@DYwh_?0oMXxphIPBWNj%>~J!9 zHs3p=njtAHrEn%!(%gZWOs8PYz$O$)f*3K{O5e6&2os1vMZh@NT%!AIE`-yBOGRa} zyT#t$ZUETjDO5#>0|C~!!pS4_g5rHEO*iT$Vh=D`i!EDD`w(f_Ja#{6e@dbqPMXSM zjzk?hODo|TiPE`|j_=F%XDmb;VYDw-ovcFz}U_Ln@1j<)>QCM12Iu-}#U znDTC!aw&%hh)FOl%*2$Ge;qrA5Rx!?XyW0B2g`8}AW}kfpQZ~xY&%m+5=rO+PWx4b zR4u3d&Mv?Dr#N3;!Km;3O83x8f{~J8J_dj$fD)s!qZ?dqc7ur_TqIl;<@Ic|Wn{2i zJXMszh;RveSddu4q%bUqrEVD(_%v#S!~_Aag4#;ernLO(=@`oLf7|#1N)zD;!7GuN z)?-;`O%)Ct;6Mz-GI+84C-v*SLkC1y$_WAQhhkmB7Q$M?60pD*WhkybzB6gId&za4-!t+l}cOE znX;GV5r{ChKrvP>8s$!@im2d0PgrMEs~BX*{uY^o!xDj(fS@5-&wS8{l%p2`@5>U- zLDbJ=_(5D=gDbMr;2iwp<>d$3Xq==m>otXeCgp@gNGqlte=2o^(7e7PO$iX3#8jE9 zTJ1|db%)uj@#{Cox9uKIN+JZVi>k!Rwo+gE>Gv#H-98{x5foZV;i{sgrO-Vo2;+*8 zV;K6WHiw8{4Tc)$Q?lbf{7H`epJTXw;^h6FMnbkfp{GD>T)r&#C)XdtnL|$woRcrk zr)Sp{avk|tEsk}aTV>LL~)f+HIdXO5)n}Nmmvg}@b2l=KpGx2uek6$jo ztoA1^(bYSgkDx5FRM~pB3lu-36&NV5ZItqBO_L=YuL{4b8>dr}@?q+2 zHA-gf+iIv##&3Q2BTy*+IJ>y<9FdkHTCj_(xaW)=f2mZ&>Yh0!vGX@5ha)k;AEJ-C z@>}f{@?r*CKquGV>K*^IVDFTnG-h>vtxc=${5FNaZx~)@HzHCMWLNUC3x0*Zc-Z}*B%Ow@~9>FWI&g(tBR;E?Up5EJ94R+eWv=)C!G)d=MDV$6y z@Qe?1TD&KoeueExkA{zYj=km;li-fB@jMGu!8#?f;8anK?zt?;A0_=m5f1Bxr60P> ze-C!c{%dx9xzcn-64_X|OeI|ltUj&pp<=EUXP=&Zxx$2cN7FYrC2-txGDL1eYvN1b zsZ{X`iN$Kzu8chJKU&TaW+;D7I9ckVx&wwNSyXe#-|B!zeJtk7*(b^$FRpm-rUt3c zv)2c2vX^7|%-Iu8EI<2R8Gp2VWb5u1FL46i%?mycUm6gFpXT|L0df zM+Sx%z+GLbZk<@vm!X0HKpK}bx)Su}63z)U6c*BDv=Xf9AtEfLq=d8NO1qYn)G!1w zG=C@*VnX7cC|KFEZK@8$9V!b^e~wT_Wcre8zk$Ad5fF?jLDxH;W3wj`1XOntKF9+9_Yd?M1%%O>r z@Y3;3U|@(r>2oe!SI!+mB7`_8w9654TY~}Q>>M$cFj{1~V^sPsj7gzpe|%2D&!H7w ze>txoA>aq>A8+PJG$x`}j4G$P4!1f*poBn9*v`YxOR57$h?G4R2MzpbaTS~n!Bh}t z15+5eO=sTA;}Qv{L^uzY25s9c4KNN~4TISM0=ii7XV!hMv39ZE)y7$4<2lka?5ssQ zUo~^F-Px*{Nfl)&W@jncfB9ONi`}l)!c1x?M=3W)Nxx-Ci73_MffFv#>^u0tj)}9U zB{fb^DimP#d~%I9^o6S?>YJ&U?b$78lKo;OWS4`dn#O zI~omRt(&lw4_PK0mQY$m1CmbJg-e9aJ)_!p>CNO5UN)q360#iR$S1>}OuU{TL&wY` z`Kt>YNh%<3(33zSe_$+nJz35@OP|XdsPEPL=8zY=p*l%DQ6-|dV_dRaY@As`v|{to zoRzTg$%}*6u*U;IG(<_|J*T_C7y&cVEs4hIYA8`884*bZJ#W_D^A>(tHH}Jx+ z$uBI{Cl_wQA=yQkP%UTYbho{8mS{(ev$vSr*JS~LDxFQde=ygko$&{-Tus-;HSllj z$8^XfCMGfGfEi=}p6a=}fpj{9tK>j*&|-UljW+V zK0_9cSY*Ov;Osobod~xx@b2Wt1AiJmJBHc$t;cYoO$^DVM7D%8bh6uw-;gyFP{!h6 zBfmogDP)>;f4vfM2CWAHngEJ%FcL9_b+;PKzigc-^@1uK8Mb`FOYG>55 zK;1hzM`AG%vkUH0LR&@qHWp(*PS6I zm69;9;8duVtNd^Lt`Y<&0+iwOqw_!CJ?U}MpJiXce@Hq;TG+B<>2pa5Gu)_P@O#c+ z0!~iRy~N8<(Re%XH8kxh*h0MOn@*RFw*#JDd&P(^i>Jd$skA*)7c(z2Y>r&O;gehk z;8I8Hiq4_HPy;SpkbJ@m#q}EwO~^a>XYZO1?z;|7IDJV_?i{Nu!5_}{SO~8RY-EFI za{KL6f5{$pHm~9L8`^&P&oQitAtCiJgWZo~h|~H#5?KkZL4#ewHrP>eh?F5xiEybW zB}ZxAc5wLQ$M?RGg3W6VPGk1!TOZG-6jvGyis7^zU9mWu?E@&U z(<>iK3eG+-a|xa;sRDDn|E2AU^(;G!sc^?a@PBL zf3LBoI_hcWL71hCINs_f!s6Yo!lpW*bc`OloQj0pE|ybMo&HajQ&S^%xty9BMa5Qt zNmaU5ld3PPR|-w4C(uK$Zo6z|+vtb%CF+-3s&Kn!F{W?NqHgyrhK90*tb3MNGkX?D zT}MA-ED?^dpD9}U8Bar(zK(8`f0q7bN5>%ql1_Se9h$lhOSu5JR(Iz${wAEMzBV3DH+`a9pY{8b|S;>LiEtr z8=@jgg%+bKzONg3szM-{aXv@5-SK`Mq8n4PY@bdcN_N~SM2^zoep;sxr90^qf2{o9 zbP87Ov{SGv+0H_zkaczn`gW&)WO^%YeOqbU=ph}7zOO^EmavlAqvngf6{?wUREQu7{1ydxgR*z}W)}GLtli;Qltc`SU zFHFe7ep{rem^*|heRWa6&5y9>e<&=Ugn8d;CKqciMJhSSCtTJzKmvxcITAYTo7I`# zE-}P!?JpxrRA3QNs%jBZs$GQMG(?EA{D@zol)_PtOt!D4gK-TP)Df5vFzg|Vag)TI zd&p>)1VJ4^Ga+5;4U2%Bo@2j_d#7N7(AsXhuCtUV=6F9)XD1$F6ZJQYfBsPkPy9x_ zdVBH)>@l;iwJ(r8zdW;!o26!vNMccns?1%hU2qbT{P+N`Scb@}{Nm0xF!qBXAuPU3 zL+r&*kg`I`N{Z5ppHABDR0xq-0`*n6H5B4N^XA|Bg-J-8AT7R8{ky5~S^jwr;xBRrk8p4ap|DbublE@FzZNc-ci3?0s|FJTClCNDA&n zs>w0#wOW_K5HX5!ne+;lsaa3NUK6PtD#LVdDTE-C{)j+Bzhvzlls zcbXR@syIZS&%Qo8hPBRvA``#z+Iu-!E@z*;mYr_A)!}E2*iQXS=rB9ke#sAV)!(IB zQp1(DboX1L(sXxQf1)B2&yi@%&eHC;M5XD@wnRn7QH~gGXX`9?&_YT|Nm?iprD=1> zdG_^RgR`@5)2j#u5)cE%w?XrmFVbSPi$FyZb4|>{w&+|Io!g?9ur0cnBi0Z$6$zxi zQ@PiPM`T3EQOz~GpKC^3En&lz0#y&LF(M;*@1-}0NC=_Ae=RPp1D)A=po2(9NGo)l z$@=EXmht&)ImBx#5u6e@6`8wZg^xx_fL0Rrb_BbC8vIr$zsv}?UgCjyu~>!xZf4V( zw30-61f|z?H4~Mdfe3Cs{8n!CQ%Fq_wZiApNmJt8k?O8`gnZt*JW@ft*o%uNVzjxqHEn!J!1^B!;=>?2=yW(E|GGrFhUi+6xv0B%qfoqv4}lkbSt1$s z9mJ2Jaw4b-IL_mTl~6$g*cIk?^H3&{g{O@X5Yvwh!e`mNC0N1sg1xn2;jsn^8s3OXW zQk4iDE}!$vWXtfrgW8@#dYV}+dWZl+2`EIBw(h?=PIc{AJ!x&j(Bc)CP7mbjMp zUG;(huDC__FiwbZC34fk*vHjyfuA$FZTylmkj0{@5k@i)8--vLmq$cAG>6C8IaV+0 z(OZq;e=!lac#LJ%pQV&j&zVTrD;4t5=2>C6KukgyEk+}$yJCpY2yq0lViZNP!(Afi zWdx-JN_qyDQAg|e<|r%|2*1Jb`QW)9<-NpiBI4TnN8s`jIxdV-XiwySUd2B;SVuT; zDZ*x6q^@|>w{N0Cw5Cj_As!N&>Q+}5wI`-gF0wY%V`i>TqQaQu#={^WD<> zA08nK!|UFJ2tD{xDCzVQ#72}nIM$M>sA4$KK&T~X#qnqb2og>w#mJeFj5_>mNe4rO zx=3(@gvX>FuXbBEhEI5Min5guCnH92Rkb&Rx$h_Oe5${x$h#pQ`!XM&ollmOXh)J6yX0)Lv{{XJmZ)!@GcQ)hjZm^;Zz|l9G zM&%t~O2uCeAFb!d;ctJLEq`@*DIVu9fBP3KU8{-WNF=&#Mfa>Znurl;2np*!aB#If zEijot6u0|~hX}C5h7%AH0J!~RLL5lIf6@@UuIo~O4k3;pny>ygUAOKH4v$2cKR-f> zspuc=E$wL}1rzyf>4sVOolm}EbF;yBsW)eXv|AfRp^05J@1V6f7US; zfPotcJ0c8sNsUyupHZBjAT(t*9ES}jk;KahldDlzp{Y@GM)v~}P(&bum8g_cfGI*X zL31d;+hHouy5V*SQj7|Z>!f&Nsz2CsU6&{Zr+^$-Yw_DfsS(`QCWtT+!;uzg-q8<# z!0%)F-arIxj#b-~#DrPhDOI;)e;Wn6!wN=nDWx4wDnzPHdcqH26HriX=$b)ECkdW( zbX=$P56$cw#Ix4I@mo#2QlTSokkJPZc-SYKRC;%;J00!C*ioCpSv2 z;dvBE8X}np=kkt8<$8pWMubVBo7bHI9V3L~tk2%!;^5@<%j_=$x}qfzin%kkjb6RJ znfziJ{(Iw_=H#00|3JFQe}fb>ZxO=}M?c{ADYwqi8l`vDkUQVXoitVan35?m)|4cedw)ti?q+Pmq)GP`hy<&KB-T4 z5UxMa;nor_ICE+5_J3hp{9hn#%}xc&mUoipCkKUB9>0J5izkcIf6w#D`Q`p(`FWuB zm2egw0->k?m~kN=T?qX`Ja!OJz3|STK>aLc%SP13lhxyUL=Np_9*&rMg@wN?D*z)` z%i`L&o0!784hQJ!qs*r>`1jNE%Mh4_fSr68Bj>&dhvgB2EMp!^*b6&ZT!4?8V5We{ z2(El>1ur^*)&4K=f0pl{l!5s_7SmZhKt!eqizx-A1si)HC$lBo%T@c1f-4F?hewe4=&q4S(z|ZpO}q%^OCW0%Wh04A88DKc)!79W z*AIwQZ0wES{E1jmynVecYNNR{n$@*M!}KkIMoF89UDC#K+xjf<5+EEwzrs(Td{F0r znhoc(Nf*IBf2Ii>5b$?VemS39(^FTFFHgAwebSn!qqq3NmRo%=~; z8yd3Y2`?>{KiNl^;}<4RY$4DBhy?8#?#c@XhS5Y&2i#CU?sS6w(D8;*+Nz2AG~(;i zh$YdD5eDdTI^eO7G*}XSSx19@eur89mujKnWaAK)sSV;oW$udvcJDIo&JYly4xSyXv=&j&y;t~Rc ztRMx?k-FvO4SepMN~7hlA8x8 z6yUZgpeS&dbgQ^6?8hLIb-B>ZzhT>JGc*Ute_yCwNIB#Yvxv+zE9oFHzz@`vuffYt zo(*heg?&w%t|O4FVJjsY@rRhfz1Gq<2RzB+Lr^^pE1SLyP}XMPGb4=W&%DOCUQ9pM zPkQvm4v=+U2*{S#+X3N6b8jtq2AgyrQ41xHBn>9M>@REO?Mv#|^A8e&-68UfnIrlM zf8JXPRR6J9F8pR;l78qMmOeMq9AzvXg_{>*C3`y?SJEHL2a9_=tp7&Gp##RlXlst|vLM zWHN^3j&nS*gCyW$i1XkV?jPQt5FCghe{tUz;8`x5E2D0ieDWe&#baAXjvlx|hU;8H zK-$k|0@TbUM##3fsedIdLq*DzjLdg-TNe=mK8 z&Sun$f+4h)ZYcQW<%gSpPEhqvkteHzoi1P-jA!8`2aW+!0b(1!4dM;qf8*{1tme5yfD*uv)AgG}5!2&2p@@jN(vT!vX@EoL zZzzvg|~~4|wIBI1z8fXmBi!{D0pJ4#c4-MK4RbV=FVx8YR8aAm4hUe}Rve57>|SZknkIh9 z5IgAn;qt{HLRL$ehIhb7e@jD%h~tVL5D_7)ut^tUN(f7cSXkACIQxo-m=Fmk@@qgO zgm9b?lL6t_6~Wr@x<2cJfk3=J;tYH&?XDU;LD zVTr5^)qbVeZPX~je;8p@Rke9+2KO)|14eU;+?bw9Zh}w2ZmgAS6ERD|heq=D<*G0& zWz2%|QKqmq%WiK-TOS3ShV!_YwR5Bp6NN1JJ7=h#mj@?r5S$P=7t%WaQ_JnyzS^B6 zj*gkr^01(6ro^WbrfAXUkj*W9PTuOQ)FRPk(H+_;2^wM*e_&}8^$y8!gomnbh!}QgIH%`(wd6e2@3)uQpFyt%QLFfWqQt~ha52ba zW(%or5#FS`HpDax8}E@^LgX@GWJlXQo$sB(o>h7x9T__*s%=Ur(_5~)HM8YZb)T8t-^RC5F=0vQh~jgxnQE&|Axkb_`O zD6sNNp+6y&J|042#29wqm6qmE0E;NW5CDgaySyW=>waxhLMm490+GVcV`d`&L(dQ~ z2_-ZQvMP(V(?=w$&;n}tq&A3@98t>eyBiE7go3PTe^N+^Lct7QK96nRsJZy~zy886s!BDlYCjpFo`lf+Man=3O9#IbARGG|Q1Af>d}z#3YnC@ReS~ zUH(j`e_s*f2$SA-;R^y%0%QxH;WrJw;7@qe^CtSUs)a&;le>PWq#T@M)L29hgJk`~3fG9_KwZYAc zsqS<00w>xKn-bQ6oLI(~(m#Iyi^)j>XMwSn_cIpA*eSxoxsy8 zh%v;m61sFb_?1i2;?E)XX27i+XwggV^KS!fo ze@tIPH|A0|-6< z&%FcD*>a=1N))?o2 zpTN+4AYwid8VQ$kH!NVT-h2LI= zbW=*EVV8`N@ zirErrBy4VuasrlTt+nlNz;3msnoUI?fABuB*~r?^_ms(P?YUNxV*@^JRy;=YE76Ftj)U1+C2S=7(5FR56ul0E+rPTBH$j$Jj zjTeUlWoY_&LOmzK*}b%(fB8uQt2$k6bKTBNLKuh{$H{gpBdtCF$Poy_x>KED-KmT~ zeT4DEch1GD%nRcRA4y{B`Y2p{*F<B;5OzX43`SKZ0SyHT{wq z_Ns;9ty!$YcSH5!0%-CfAKxS*`4h>ozEfO zEyS(Fs}z~h?N|J~^QvdRJp9wa@zG%e?%4TD`!uq%%WDWkQsDEO8WT@rC70!DMZu~2 z7U^*U0B4YZ<(?NM_zUSbq^F6VW_PXD5GDd6an^3o10ykFB7R+ZQwgCgaf*dYRqzbj zUXvp~ReCXoTQ}AOf7qQP?;;s|_Mq^~d4Ab!zPQ@1NXO=vQr0qd!N-y?xrnl^>vq2) zKoOu|E9Y1frV^3vS`Ya;K!jn}t$M%aLsQ38)^)4e>eg$|!)!kkc>`_<9`UormWDWa zP|Jqb`yv6yW|dM#V&POZl2XaL&8FZ>M$cFnlGJ#Dod*qgye{wfrOr zVL%-fc{}E6U2Kjpju9*(Vp76nOsk4xcOXvnkZkhc(0JH;xFf z+z2kVl5H1Tf35Qt5ugaK9yesE-!2W@E3>xOBc7yVq*r*`g(s6e;bX!l?3tuX2$PC@ z)V@pXLs;#icg!J{tvWd7^UhluYBH((9>#x@svYfpwz-}oNwyTG=6jqUFe!WN%-MMk z_Cl@Z-lAB?xI0AXN?@~lEqlRJ{x6>(Fd^WG;cv|2e^x+8z?^9~PE$e@_x3;nL6MXM zsz7Ity83)k4}c{i6(aL{hs_Ak1kjAbPGw2ulH2t||}BT6TYZ1r61`GZJ&fWIKt5;hjOh9Pvzj@5zoDS>$=#0V#*!2d}& zhw01ZfAT|}L?p=_NJTRF9_=iWj-5b;4sDj{u!iyM^6Op&e1K1vLl@5xzY@q)K$qlj zt5sX4^f>yZPr{R@8ZKf)8KapTQq&JiQA8;+l%k?eQPiEHkf8U2Rci1!7ZM|REtIgf zQz2X-!V*Hm?ZCDxGKeK%V#2@}&XzK7*9Y%Tf3Kb@{XSS!f?zK$ni8!NB9-{uCo#17 zuG|B)$Wz0fJ6O-?j68@*z2J7cF)BxVGU2KymU)XJTC>q>He{p=XK*)FjY^4dA#Bm1 z;i$m1BtY5uKzICF(brY?fCfL;-1eu5m$|l7@;JeCF}JffJg|TI2|b< ze;gq+V=9N3lrYh~{U~9KBuvcfL5(6n!trGs8BO0ihCK4N?uQ<6+EjOPl+TeuMEpPl zt8$b}d3Toz19VV#RZw?zv#aKK@5D7yvqY_6EFA$LCP2wJM-rKYE3f9eY~_he%1vM- zzlRgdC}K@F-h|7A+Ff`?k^VlZH@k4*e;Gv)yO!+#_|$haO6SNbW+&?Vj3y(;P9SGS zKJv@Ep9a6F-@!JT-1xFP^4HUYldXSF7QvBJ6K zo+C-a&JROo+1G0#NxQ3~;&#=aShf`N929{_z;Lo53j6583?1ft@WYL}z6kERe`eFg zL@bubks-jewgK*c_J9k%8xI{`;cxfF5nZPZA2oJfQ9`IVI4uFw{Bj0cpix0IZH?Y{ z8agd*80p_*aCHYd~`g9+rq})0|uQ-$PT5} zeq$1PWP`Z3>vkLAUAKa=mgRX-9{RwF5u0+bc;JVMsD?VWo^?w6g!g?R4TjJ) zg&N{GS&7;o==FK4-p=yYe90#nAFvDwLs`n8QAdat&WT6VF=ta(gh3;;T%(Yf!3_d3>oWW#w|7?STJ z@r0cWM`Zw!^G72&YHP+m^G8*MsFYBpN2ReY+EDNa)1wclGg65#f2BmG;U$hOH!tEd z95KF8LwsX^_BG+hVLSVS^eXz!0+pf}V5Ibc`+X=c}?x zBf@2z;H?2+3BlRF3V@ie^P9Iu`X-n|6NK)|?_vB#UCKs~ddMPqkp4_byh04#Qbi@> zGD}Zqn|sPO6P>&%f5zbzE7f3ox430HFtUNl`+EP_OOV}fT6^~&}YLv<@IcF;eWi@ zn#v%_n9ZCaXe(7bL<~up);t5Pl_?<%uTfeh2@$axrB#ZXe`VG4;Vp>je-fiH<2@|P zpbx>GN~2k%8&O7WP^w9XQY9*+RjslQ)I|PYgCS+xYyu0H{yX1!BZI!C;A=HVV@FdDB@ObOhDik!*TZ!HX$~TKr*;>A@v$rSZtMX)Bz*_PPSTypo`E<6_R+7?0$_?1xmnBF{NypI)lsiLqpUj(#8MAz zlqj7pTPHUVLW#fD)O#&GdQl=aCM;7?=!5_k?)vQXuFy0;Alh-&j83^<8o6_8gEdO* zDBfACvpLe#>>Qbgs94r5B)|NL|3g-sK9|0YIo}Fje_C%24$I--=*|haHAxSaj>WQi zdzimDI652-09in$zfNF0v|&I%&+wti&)@=y5PHzXbT+N0X2>YzCn}PhZ|mEJhXc3> zev>8529cWT!CA97`w9rG;VnnO*FUHXRC>O5@YgfUke=zm`~N4Dti>bzlp~W@Urx^# zXSWSPWD6i#34ga)b5?Y2aq}0mLbNsELXIuQYz=88>Fk8{eqXYxVWeP-DNF{?QjQcA zQFOwU9WTV3ZasQe>+R>|ZV~3icI8cqz9Nc~A$srHsuP|gDhl=ypTFBoAg&m~e{RhV zY+v692(yA8t(}&0MDa$DI{KB2n#@+cbS_3^$5VipcYi+x7^%1(<74pi4cB{Z6yw_Y z6-L^Igi}ghSotVg-#kK8YgpVT0#2GltOmCYd$45%CDt_i-GJkc=5T-AGsPM+6KQya zfl1S%^$`Z6AB)l33UP*Tmhpb4Mq2#e*S8oUE%tOdw!}5zKH*sFJDzZi)MBFM7%$L8 zVhBz8wSV;0EM=RHdr)(XQ%ZRnP6E9vXzI9a-K%@yv6mf~7QtblRjGJYP16xNxx2V% z9L=&x&j?l^b_g(U)d56Mcqukfl-QzHh$ zsrH=ZQv>}&XrN_X(4)Gbks{6SZSY%Abj|NKD}QQ$1Z`QL2YvTU9?Tg?@_H#j$N-DH@pk_INp~xi<@wf4ASZu zqgbN~Jh7GhI!T!uq5P&@^1DsNFUXHW+K`%hnCyb`_M}9U6zT3*vh~;c?aR~2&16#_ zI)6j-RQKxoI(f9s774Hwx#J9XZw)8$PL6FQ>S8wAg#D%a9{Z-OV-Jf{$=^5ihuMvP zSDkNlV5xdmUs5POt^TEcI^Dwo#QAZy3zX>W<&HkTv&xapI50&hRoi z|BfG+xh`R;ZF0W8ou01os#Az;4TEjt27f?kJ@DpD+(+=39{U&4@~anR~U%4kJE8nnvs>;np7Y>$l&7Q2kzi1Lo%Z=znk= z3{&Iq#8Gk{c62N@f9u_vuVQ40`*|soxpY|EtYc1H=?l@NcBG6K0QI(qmHcIy9k1WQ zSig=D39ELsEU%9n{BD zN=3ZuvQKti_N)d1qd5FN<*En0`+ud1SgU@E1&CS=e6_H;(>Z}ugtGryg(YJ zk6e`b$rwyJ4dvknRR=JwT6})x-J~K>mUpw(Bw5Oqfty8iY}y?v#zyKn!eW9k9w*zz znj?oK&|Vwsr}Ztu&!9sPFOH7O>`**@esuVU^6kqf^*R8(Y!=9Kgc3hZDStPvSKS7C z@1m}d5dYk4BZEf%#Ogk|qq>dyDb;OOQk+6{t9zZ3$n= zY58D*Gx0+O?t~+7hAYo6MeSel^SV+U4=UvxC%++O@P3QtgvI}3Nc<;!&?-K5k0u>U zWR^0SDPmR!NdVUgKZBqtW`ENr&&m1nvL+l!c8g;f&-dJDXFANZb<%;_h0G z9&eAQB11645;oAw>msSIxPLK1?{8sBM}(t364=p)bC&Mz=)r}I;g1CVaQ=^tUYvcv zE9S;C%^zw-j!N7@Mag?AN>X`};$}Ghs}WZ2s0OUseGOR6tpRKP2Y+3Q{YfJUYpE`> zK3$8A3HD#&ue7;&8VG;xzwp2?oGm(RODd<6INZmyG1oihnC8QgA`DNJ_nQAG66fTBkHtlCOpCeM|rs;wp#?_P5IBH)`4{ zY~S=_blD5C^J|)4$#?L^(ZVXDgxY?IW)0D}B=Y$IK)twe;pw+gPCc1&&lMNI6tlGZ z7c^n+=`>-!;uhuN771AOs7}`$pac^gtKs!(IuJgZuhO|8y?~I?aoIG%*cA0? zU&fS8q^{N3@;c@ONx@fV6xSlK3}aF7-g>(G!LP_UU&SZGPftEMtwx_5odCl!MvZ2f zUCny$>J(w9Qh!zMiKiN3i5?R~0b-6FTx( zMCVXZM9>dVq!tv}&Ug*ZcbCgm1d0Jh9B?L5S8MM`E9(39Vq41Hh^~;MJn%Xd)5*B^dwB7Ypro@cRg`yWn$#Ot5+z4_Jcj33i zKfajbB_WAYRt!(dx&Sp zks`m|J6>udzuurJnZ`(GR1i8QER+9B<#+qP+@2VZ=kuQ!$}?2eKvlz`UN#IC#4?@dbcHj8=vC37fJ@5SED&f;ZjI59_gB1KUf!5@7k*DwN0 zTS)HcLfpcVyVp|8vDL1aG%5SpCNa_lH7T{{ExBj^5(%b$0=iO#Eeexe_VanS+t`cbH$)Rp0otE%UEls>64p7sq_OJgwtt)#>DO)PtHC7$0Sc`|ed{pa9PW(6hUy-hH>0xuc&mLN?$URAhs5IAE z_@bjL3{y;oO_qiH$rn%8G(g4tTkGb@7vJ;b%e^xq;bgCE3Gh}TqliLWF@LRM?sr_X zl51APnyFe<(wbqeZjl@#1=&8f7-j?b;c;Dm&^hG=NA>bb@DJRaL;KJo{DKln7ets9r^Fv&w#Gw{{JMnM#T47asL0jjSEB<+4 zCZYgj$JMmgRnPW&6%D;plHwxC_xQb(``Y(hNTu@GG)hWNr2t6gQJZpSpX_|9wpw;3eVRyr(Vy~pYUgr9#ce_Gc75IOm4&n_A*&NN! zX-$=u|35^PWlZJ>MM{&fozHH%mQ}Y={dt*GY7vuU@f8DFaccz<6-)g?P!v44mN`EZJg` zawCC|`ksSJy!ma}ysACBOh<&PL*P0AE`I7|F$q4WsO0CuUKDUEQnMgmPx=$Ra!j5l zJBfnAq-Fc85M>5onX5m3er}IF=FPJBpJ&TUKzF0_1h5zT@$;fU#9E69uMB?~70D+LM1h&QFU zT7nsM{Q(?;X3c#;lK3%>U@sRO-tJp~2@F$7Q$E(-DkdU3vdMV2o_AaO%~9O~OU!Oo zwqF5@Cr#>t4kRf&p2aoJSs2SouqJWwb3UiIl7DG6Ohb%dVrg4-Hwp9QHSM`D`c}-8 zl0%>5|Nk^@Y7RkD@(9$K*L6Gqb~pguO6R{l{LT%UfELrhXV70o^lt4wIAOL6eh|gz*-gUu zK7X2-0Y@_q?Kh`JmAm|Ie;D(z1D#>IIvGgaJzK!{)PJ_1fMkJ`TS3@OM|D)`gD_{p z0v4kas)Fvb7^RaQWOkKw49mpc;O6Y6`OhYtT=;w*T3fk3{!`f8A%#Lw`4Ahf2f1j0)GoUUy7HFrIYH6smIgT$y=BMn(}C7pT*;p^xP~i z<)+~5Z-0T3w>!0$UR*E1ERNj}z6GbapS(0P{ <{&L>TeZg7JehRQqDeikah+!L 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

&6S19B1T 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

`g4{-q96`(Og$I4lg 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 rMafLuGKgITjdAAl#v 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 b&|}{qpPvmRWVmd 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 umAE1e6(pdlTLBKCT1 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 Dx>XDI{Q$~O|cqd8Z74Z_(V3RTRe<&8- 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 W|KcCu{38zQe$rsv*8<}E-TwfhO@inE delta 872744 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

O7uACXFJ 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

szVj6tFKcJ|2*34pW3xD) zEfb!Ak;A0b{3E74J>=*8PYXw~2HD+i7f-})1hIhOJ+SB^ksW{eBO{XsBl~{)cw8Xv zH!k)gu`pJa*B*z30mvJGJhtbh*mC~qAC2?#&lfi<(t+jf-seWTouprvJdQ?N{INE& zNa=v&q1x42|_Y;FukQm_UdL4ovcAo(;a(<+;%*|OuKmLwS>vxsG^_!!uZTneMq z^6Ss!h^_|j9_-kw*Y%+QgxM^eWrgQ_TyCY8^t6HGgo=MLJI*0YT|jF~AweeomNB-x zJHJA*n<2QXK0nc@Bdc+HqcnyR*I%Y{(m-AvDA`wlk@38NE2Eghjk&~%Fuct>Uv#1Y z#f^9~YFH@qNn+(EZDR)APPkrH5k0=erg}e5Xr#ae>P+z#Xmj#x#-UYFCB{-pq<78sO%jx+Q#&0WD0FxJ_ z3K)AkXZGKyi9IrcD<;2_qifDenEm{vkM(AMCT_ax)0_V2$^H=6boYMsM!U_q#s0Mz zR|Y9!!&7jN}9v`m8;YLJ%#JE@*!}@)8qn z%xeG1afZpXd^HOKa#T)Iv?pjdIuP@T=4Az%z z?9V4=h@ftP0}N=1nGZvAP1kf_YQs#;_VQ?-0sQ9&3fs{jpI(| zcy}9(@|)S8%ni=oU-qtsi@nkNMiaef10Y2!h!c%;a9xxyirEbj;6|tEMc=5Ameh-u zEOnOf=X@SQ1M_2dMcCcuyOEFdfRuoia-n3*G!-90!UDZe@Ru zR;Lvi;?=6jF+{eHM?^D*X{YLU85A5VkJ=794YTU zHDJo+sTD$_G^Z|b;}}jPccdADR+T1h8*VjLS1*&drM_*q^{vF`j*Ps0hJM9~o%h8H zXVUpV4(&(;HDZbm?;rwn+2D}H>@$DW`yk~y6;ns>O@FH}X-Lz`@+vwuSOy!EWgsZY z7?XJx-ih5nd{=D0KD0?E+2Xe>1)H+$mFl-bGp+cezfg3%4k}4+`=RYn9nP^%oLyHJ zhbRJ6;UQkY3gT7@Pm%}*Y7>^Q0bC|#wIPVoB>LwfVswTO0U%fb4vcJY5YvBXtF=?6 z(BpYJq5aGuVd6`}^jO6$G7RXglf_U3a_k7?=PunpI`K&} zB1ldK3~}0aUX3wQyL{P{uIztWx$#~sQw^>)Au53c>!*hp4Xhleo-=e}o&_fW`eTK6 zRwH!UmA%J%J-xB1+NgYdZcMAGuKFQtoH09E1lJsL7M-_Ii9F1zV3f;NxZD+61FwmI zAx&gXprj4K1_&+xN3D9~&)n2dHjTaVrTL*-pqeLZ@2}P%;0Su6+4cE9MkB1xNA4c)8%StzwHr((-+G8A3{B~WvGadd^mAUY6M=fYk(OeseZ1QdQ)EBSYgU6H%(yYkgq@G0v|wV9 z0EJw>B4?MMyb)Q(M;kWRVj(9wlrPTVB%IxH;G6_Gg{B$QTs?b+Xi~@5QYEyC)_tP+ zRtg*`>H!3K;h>3ik4|3Nt>!7TIm<#bGyqM8mutl=k;ooE{-}R(aP6};8eVA^jPv8L z@uJ^HhZU67@ot1x@xoOA_`DxR2{f;39VwXD0P(TMuBXG+#Xy$dh>Dt2_CGVoW}nrv zHs@WLOALk|&ZSYQ_CZ3PIwLtnD}&Yk&}{loZ&a_mE#tH(b0Il0wv@0a;L%*Xt| z2-FFYsC!^8WwU?kl#_4-fka!41VEUItKMr)Y(}VqA}09N!jPA@^>9}%O}#iSUKd*p zT)x78Up01%{i0huM3_2dDRxp>ir)9ue{+AO-EHku^t1oPeLxp2FAcFfI}~sx8k!C? zDdQ?$Zjv^JH0i2a+OqiZ?6b8c9a;A#ZmF4Az;sl7_c#DX+gTE=K#^ip6dwvgGc@BV=uU{myT*aBD!+Ct^m~sU=Q%17VZe zgb#+7g)u75{Zb>BR6B{nooJ-0NL&UyWKb&~#{JrkAsnR!&5~}rX4nhKoh4P;YCGON zpj$1deb9eBdKg;rj1G57X_WpY37D|%-9ZufSO;b`f)uK&!iTOQ{+B0@w}-w>K8A^^ zlN1rGZVG|`(Z1(<+vW3-`N~eZ`v~WM)fId2FFL!IemB(xXtKcM{`RU8~iq0D2PFF%r;d1i)6@*b`nACqDK3P|n>GQ_wHpnRL^YUcnC21#8 zRjoskT2F|bGKT0=>J@YUTHJ!1J~H(blH8G2EdGJXhMq$nDd0M927h(W)werilgM?? zd$k0O)k(G?J0UuaX5kd3O5XJ1g@6MM}H>u=z6=gsMERPEv5ga!$Fp9K7!x>lrhI^L&P zxau_QRnKCe#8zw59GR3Q`{>_?~r-=Fv7XhaXEcxKf}AbbQ5 z?lt_#3%W{KIN9~z9ov|SpebyCzkq)(NAZroygK_a@+dpuXifqja5EGHv+>g{GKJo1 zougj2090*kV;GIYKDPDuIf4iEf?+9`{}H&5*9 zpg=AG4%$Bd1XN^T2fTVgfRElxvMW`2Ql<7D5xa33^hz;#O!louBU-m_H|2jIeR(vN zvtxd@qXV4t?Oq0+*V5j5iKmy+=n5XoQ;$e#c59J`d=7R|mHZQ&^*4EEC1V(ya_BgG z_MH*EnUY%6ynzb2)y4wa9+Rw~>inY)A|r)HV26FK3yzMWCL7qg9*!xdbfmgSEp@O< zI6IlX^%e02h<*N3F=)bPKJ|Z6nSEbourx`~`0TTG^~C#$3YJo%zQ<^#X<-~K34F?0 zkkV&|h26}k;^Aq_dY!p>H+u^(P8mSGJFBL8S#Snds3`kfR40hKg2*8T#telxzB}iu z?>g#>orJfQSHyavo?ZieA(zoNMg|tVtHQg0<=pe_{K5jq2^VykIQ@SErM2ia26GIMI_Xn6At9rm!3q#0x>VouFrGX)ZT2q0uWWr6WA66vj~ zuk4TLcmDu6ZJ#k2bErwM3X{%;a%z-ho^9YkK~08q<;zdPt2cjwEZ17u=cILDMt!jEBxtH<3y! zfu~5K8Kap2@$wDV0O#xjmtBVtX@s%D%7BW}u!$Dn@+S69>%?xGz;6EX-^-c%D%E$L zGx5j|)7r-7i8D&XVcOv^vDx_d7+*(1T{L@_aJ5*5!8tOo{nvjy$^Q$~(wiIimP9Sx z0Q&jY-p_&_TJZOwZciYl(43pU(uy2Cb6)@45lSytp0*$r_2xE@h;QVRoIiUuHU*eX z!gk=AvZ}X2J$Nuq=sE>I;r(Dbq4&WNC&F_J?V>opvA9?r{gaJqCXrX+c>qwGnEu;@_V@)xYP0ONshviRMq1ap6%b#iDDTDMOTK8ka7~ zjzK{eoyK%?4hFbT>BZ2HXk#M810>tZw>FYlJfQ^j1F_-}BMj*Y#C$>KNc>_2QM7jP zg4{q!8KF!k8R|w~yqv|Qz=|~H_>GNBBq#|1Z=f>0u<W<6=06yxUm&5Z_w`9<^y`m z$OD^~lfrpwPu?5tKMY!?DYe@Inftd}dmPie_*SWZI`AuyE^J$+3*QUC;f;9w%aokM z+O-Z!sf&M>Jk{fKEOW1Lb+uP0C9{5BloTi!= zGOxy+g_U5+)ck$_U~3$l4)B9KXGRi@lT&N~iAv$s@RRvshC6&Xb*N(U>^imhnQ@_W zc5S70iA&HwzoLxk8UFQsxs`G}(~y@4P2G9r22_7hlH3k&rnCT%%+qmK$b-jUHG1tM zf*ARD@Xa4{hKM5_Chz6ragpljx04Ua&G1~Wrz6-hg4yk|VvU1YsK8eAXGSpO&}iDU zSEbj>dHGSAAk>sn877hhHf6jjKY6%4Zy~Zgen@oAo%Zb%tlk=oS_2aL z7yo|)5d2?*QVw?UeAjzYZ`4W>W4;;o=v-d0;fvFRT}~IoD3W((Jcrx@6A*HF4|^sM z;FI`WQYld(CN-UtpOc^SEJ5DQvufX_6H>r#^+8pfO4YAEcA=cm-^KM+`s=;X7f-3m z%I1~6QWLKXE+~v^GTEKVnxV;XRraf^Iufa0JAcJRWlUJDeagv+BrL9F z{$!p1^bbb!Ot%;Z&eJ)oZOE9EP$z#s>6Ut5hT%Hs+eL5N$$dRAy*7VMUxFzBtR@q) z`JihvwFjq&!g6XT<_4+!SWKF7jbmo0?c_8|M zr#F83@S$(l_U8VWm|7lWY!-j?B6IrY5o1>bfHn|GQp70pE-o<6GOHz{o-cW!QP4X6=7rvoJVL{k>D=>7Y~qzNRDg zFY5^J7Xr0Pg-@8FI%Eim`s&;UjE^kruTr!wCCw?^Gy&-+AQUn&w(EcE*p)%Z@UY;< z^LZGNui7cj&c|jUt>8l}7*k|jH5VB~CmwF-H9H&uz6ZP3SiQm;TVmM3?f>rL|I#W$ z>czK)a$``%zjck4F@?p3;Zq8ODOb@#Gg!b{e-aL~97LuOCSynm>HfjaLcckUal6)Z z|1xdj{mWS@3cBTjg&TjH|Kw%yC?^)d%!mEAETrSktz}^bcLQc1BT_?W$sZRXn1DpzN|*H9ibUyRH)_=}YkURA*; z3e&-0fgc|{8ILyL-b-m&?<`trLe^G2IT~&-_qLkDd$e}r4p@JM-Us59D7Z7JS#>%L zr&(|dr6eUzv6vtkHF0!B%rChE1Ypof(PFgzh>_$(NuVTam4wJ-M#s7Iu=*ql8(tMfxibcIY%Z~vKlp}o~2i3#+vB}+Oz?D z*0L&ES?{vGkIa8^|_}Ds$ZNq*xrrgC%xY4-j-f< zRFTxF$Yi~h$!O?EM{WdISRYpVsK!OgkEO?1d>1&%z{o~%usNR#l!jZ3=|p|=*=uu( zG}p~{d#?saCbHTDz^>Dh@Ol;^XZkQm3YAb}?^`GYvm$>MkwhvmS`BpM$gc&|^kTv+ z``JDJ6~xxL)jO;Vf3algjq~A%O7||s9C&S{N>HQw=kQimqe)QMg>XU-^~@{Smg~f7o25 z$F00B+p&L+TG6s;4${U+xYOfaUFx}2JKNl+)Q%q%s80jM zJ`96d;*f44%l7%~&}|xR_D;3!Yi(ot<_)k*r`ofvysTf#08>sHHl*0dUplq+kI%bs9!np@{G&8lxxsM+yzN%Nh!2%`)m8&{`U4m zhmCjIgS|P>t-Z);ehFMdE%__{nd-W*Je&N`?_#8OK}u6ge5 zH^+aFB|aL8xKB(p_ZhzSIB4?wUfaeT|6q!%TdmFfm*`whJJfT2!T)bD(nF51ITPV zG928UrdPjyXY|Oj4#TuLlJqMtaM%^;I$$C=cq^puJX2y+%VeGtb$O!UP-MS(e(+tA zd&%dZrq;NdDD-}XddfKfSsOs0ZLG){9%9cDYG(vylzNz)64jn%S?w!pmh#HI9wvVd z9XycUar_&l0w|@P6`6CP*0{7_%|5@m0zfe!a{T%7{8U*=?G3zx@dj4S5wW4i)o{qH zZYfmA^`fi!Hb?;~jq~cSAhK6SXkQ1VElAiau=M;xs2RBJulEb9S_e;_?15nAEV1$` zg8$SlDpoIq#^TSRoXE*7=M0`z%Q!bo=P?VxLTd#Ze2gbMQ_2=}%3J3diY)(vM8X&Y4H?5m@-d6_<8jm58k zJ0}}Vd4|yD`}EDcGUTycHUlqM%1>1K$a$@B`0lh+l*VMVA56P4dzT6;_2xpJy(@FFV~PIR=4te<6gVX?Yq8l3x^?O_M(5byj4zJtdt4R zKZ*y4m`~+YAKnT%(NX~%?TW+7vdRNM%|1@%<3&!HPb|>xVuhJK#-TWK}wEcTJdKr_OdWY%@h zryGPqU0#07((02>$=;JK%TGkLVI$h>o^W;odE0Oax#g2fsMeRQOG((5;mtwL2jN(+j_^LJ*I zw-OESNm7Bw^+obF-RMgd+;1AAu4d(Vu8gu7YZX~WyQ|Bgwu7APwAw%-76BQUd5aHh zKXH4p@=+$&3_@<8hbxqSJ`p5!n{L-&dS&W)>I*E5ym^0-G|Pzgs1v-{KV>~pQyc)V z_wx=kbO) zrPxoH$CY~t%}b6U^yI9MFwh1&IZAYwFh$LyW5HQf+d%~?hSBZ~yP741g@wmxQmGHfa0ZI| zW$cNeh*4CFU2~25>u%lh@(z`UbT#4Q{`wUMcUXTGqZQD4NECV$(@Ch%CDGC|JAj?z ze7Vo)8(`MHCqO(i9VUdi6@7vt{i0MDpz!qrP=Y%S5MLc*@bs=AMG9VU4MQpnW(sOL zRW7j4bsP@6Ww+*E*2D6oqU*y?Vp6`dR<6_^T=~Jm{*-uCVO+fCHJW(?p(6*w=WR9z zr38OM55lcgM`rHB0=*S~1s(VCC=fd-jIbH?vkj2=OGRi*e3w^jJfwg0oqohz7Kx~O%DV(TG>4<;BNZH(|y?2lzHUAqYrxLUaMM=Em+2+$f zR7Wr*8S9<2V=CA5_h7!UVO`thCjsE9F8k-wC`t^K8e(dBp{0K)3Cy?2(i5Tdz-(0~lR4gs#;!E?lq+ODL$3%TS}S;krFN~{Ee3A4=yl7~s&Vc31jj5<1>H;0k{EyW8k+k) zILCP+&bxW`Je^{~e>G=B82du2---S-?0PWs&y@K(lJfPj3rFIdV%>8!rRJnpulU|d z=ew%>0~AndPw1#%%Q0OY!N=#0ftUMtUE#cgA5YR#o-2ntiM3{_0wp7nAA;tuV^Sk@ zDA)QS#E!WG2C5t+z-sfzY^HzN^WMtn_bW1isA;ei%>Br8g0!G)O; z(lN4Jrr=SUch$7QoZ9&P%9du+Or9ce#JZ5rD=Lx zeAK1z2k)^m{#xpU`@d{7=Apa}Wwh+zBcWfA=V#_BV>CANxm1TIr$XDi$L|be9n>qQ zSH0r-tg8IBHQ97!Zb#9}Yy9*b<+NGbAOSw9YO4n@z?d)HJLrgs&i9-d{mP>)jSR&f zVQ?#nYskF-fAWAJPT+qbc|RgivpLuIu7n!L|o!!*`~INld!|a7XtA>1s zXsv-r2Rvu;gNGjs(G!aT$|_N^CXoKJFD?Lq3xHmASibWw?dICO+jEK;ZGPKAd`0zpAI-)!hCxvUvRX5#WSqEq=p(WM z&^(#g2^Maq$GRjZjW_ragF@aC{N|y_DF^RV@$cld1+<s@aM(0N1a#49hTBQ8)#t zQs}@5Y4-<9!tU>GFH2hc?(KAO=-+L{AiwtBFuFs)8>4^V-lw++vgIv;G~08=KX}3Q zPs7+kdD-T=Lh>M&bnZOdOY4!G6SeqLjm~;cucJb2`+AAR;!ABB8%AZ+De18C$}Mi* zSeJq;^FnRKZB>+(7*Eg9u9(t0bV&k}&>E?7aDqI$X6ig3QT&NCCYM`i9@F7oo{Ji~ zip50no=1Ovt0nb^_aK%WXe(}zhUoEm)*55T0f3*yH(MbDHHqZuU z%vWUkDHR%cVUpGsuFp4d!4_Wp#>3Si4Hc|F@|W|SbC)xm@8&y}k#nKvi##s0f2CZK z*8?yS1Qn5?cVhtj4iVowHz0sTn8+7pflfacy4rt8Q1p$F$$x8Rtqo57GOYB%c?0E% z@6g^hWHpd1X%xRy{Gulzgwkvhwx2H)s;SG9FLIMYlXPX`J5$*JYysy7_O@Xx0{v^; zy3}QtT>9ruh1wL@l;DS{pB+LjkDX<%KVN4NH|cGUTFGub_L4R$Y=nImVOQ6~_R?y=A0 z&h(1|d$Kp9U)5KSbJ^y);-k}F0dpS1bM$vHC);8CX?z|E2?C1TBXR0>MgkY5O+|mu z3(}P?KIJMsZ0n91>KX5b3$WaY+`aOMwx@d)j?T=y>r289oSM<~eg(x)zCe8| zmcRdIo1A^aSEPb2LF|8BNM)+X4|wg+~^i# zs^nUfqttMJOj}Rx3#uBTg)utQTTXvCzYPcG&QR(5&5gmeYI|{T`hKgq5Y7$BMY=`g zR~M`~l4$RECt@MDNnde`CNw3}ty6Pmm^ zvC-(>=%g#&RhQ7mQ5E!c=tZG_3xgJSKd$vu*Osi@NVOdvX*;w$abf2U763Ou$iI~G ztx(uI8$s1c%+uv}V;)i>s z;s>!!C?W;^ih7oeDwm$M{{y@g>6Az=pgtLg!mTIwlS13tP6VLjF&t`tetn&u$?l1J z@wjXFGNH$5$w>?s2Er+Zs0PjJrKxSymQ$O@<5AlLr<6seYduCgURWl4eRs@cKlJCl zr|IR{d$~tD7OQO5U!}Ja2blM>%Us$yK$;gT{Ce;Q5F6K>=2H30gC>_W-(JEFF1+RS z5|A4NQd0~%$ume^OV?z7vNDR-gG73Tpx7-3&=VMCYdQIl?=cKfvUs-?q0+VcHXQpt z?P|Ap@#|&p8-0fm{N1H@L9uc=F;5;h-1JtsPF1Ve zS8Gn=Ci~-cdsyX%kt=#gRNoS*!8!+S{hJ1s!Sscm-$L{G<8JEwO|OLG1;AuQ9TklmO`0PR3ixY)*%Wc zP(XdXO$BDd!qj>vg<>GYp@9eP$4K)+D9@lD=Db0pOnj z!rIR_pV>eA_$M?@*uUP3pVssZPRgC(Uz;`MJm=LtR9GHrygJ6iUaHaMW!yG+;lKFO z5O}-4zUyfisF%^?WN=#c*K%Q%mp>vPapbl~n-3%+TKKoxb87#*}EcA32bJv*IDgFw*OsNvX);!RWVEA87%Io}T#DNNi)1aa)(ch!L$L4-dP6(@)mu zR>|%kQUHcLI(zhlrCEi{TMjmhy~l~mbHgu0YIxwh%Pevpszvt%+>bheV=fZ_k11bJJp(9;m+94Sf`>1PmaUL@MGHG+eZ6S7 zS3#n&mSgVcHb7q8$5fnOSdv*5Hags=7R6S_*%TKO8(Jt>N*=FaCoe>}Yqdhs8D<)m zdPO6D1-)z~cRWpbuNld;M0+87&+@8&3qfMKQB{d8auKMJc{@fe>Fpp~R2gj^?ES&$ zl}77i7M>dp8(Gaftfa+U8);4%X9B)w}snu7B4qJt#v zDB7dBQ1xh*8;2!+_*S&*tzU!NLO1G$@Po&Hq*r5c*Dkqdv(>#s_Vaw;*iYDY6z#g} zD=y--L|u;@r3h>Nv-S@U(si}Qi^VsiEO3)!P*j+ zypAfo1UY0sAm?i-8ROqEvrORwMO*@Zd+*nC!47UOD83XKPaKC#xkuFox+C?f-7kvj ztE)?^Jh3Ah$WWdH04oYiM<5CqX``ifaW{1;-%Ip_-I+A-ot2W5#!@%l8|@#A=_S6B zOAQKhkS?aHkglSI=H};5pIT2`s=2vEqg_V( zY^AiE@5Khap1f}-(PsVzoPH%Orn>j*$8J(g>KdFOp6D}Al6eV|On3Fv8MmwI`Cspp z)$6&A?565f6(mu`)o!j2FYUs?i>@9dwY9Z|7jwg@SRTTsb5!kx#7X}rUp&|@ACC>E zi0GPSC-ih7D9QS51ixv&Xz22Th4cM0KK>m z12^1sRIYDs{sHEk_%XWey&kWm>+y0|suT!W2qsR0^)wHjMptAt5U}<yTIV zG8GFMy1TsVx7=-^K}cq_+?oTIm--@6|v`vH!_ zBKyX|Q2|ndiykArSHZP40*O?|&?HHE@G{@tmXy07WMeCTS)zR|$j0Z7ks=Y<-o?<2 zRbU~$ZT@|{|M5(=wlGX|t5AWnIyWN@T)aD~1d$BfW5{H!Nw`{8)SMH3Q7y6*AM1|4 zshEy>0K>;#-fiFL{i8DY_>HbIEOZB&;ng;)^|m!wD_gRPck1L5E?$V z62|9$l>u>oJ&cHol{xRS2rL5*vTGBQj8$jlPAoS3QFUw0(d{ZhX>OqA0P2h;+ZY)pgbjeF(tk4j%$)2QFO2WxK!^-|eeK z)WY3_*Z{vDtQckV{MFbo3Ag~uz?=^ zyQ*=csD?GBts*zdioi_>tH~GDBaDbUGM}6tnF7i0Le#%+IGRQT!wTfaz+FxrdtyG_ zkFx8l%~M4NWK86g?$z{}DcF${>~>da59+;y6By&J1RTS$^$U}1%BoBeIoNhRtu zOrM9Xm3KZvkAf}gKmU<4PlIK6Z>3JvWWj=eDi~T}Wm7ouC_x|rEl#M(napX;Z|Sl7 zhncVI0X+Zu?z``rkp)>Wo0@l^xaCR)opG|Au@p>sE3wkDf$x;n04#ijMorY^oaJNk zOL`a6pN7m#BvbbgSwX9z@izbiwlDS%BLA^vg8bZk7k>Z2rZs@;#V(V%(FSu}HJB@Z zT>-SJ94tUp0|kj+y@X*<Go9oioyyWYq1WE!VJ)0U^B~(wLD6oF5oM^N9<8MY8@x zrXzAoO#w87GPU=jqYt3iNR)`_xL@cRcGJH~rl$Fd1E6vHvwG94lZ8uzoKbSuqxQc5uO8p9HC%U6g1Y260g|m*j!o zuGYq>aW)Y<%~Fx9q&QqOR82SlXBzh)&qlUbwjWRQfWX+Aplgd41r&UYUO_(c7AX#N z!X_(V3>$|ITUebgQlsdYTy;BtI`WELSc&pFOzm~*%us80VFsya0ASe7{inX^h1QzT z1zOP=+gc-CT=lGY`v1l2v!{K&;~I{laya}vP#uStfQ*8!^plwN$J)xA6ly?mlvc5E zgJ#r@Rp zJJ(5b=VbCm?Y$xU691`jxprgtnu^iD&B^rD`^FAc?x@k^c|4E3D)hX;WwSm~nht1z zb26c>Tqd-)tjNvf@vj8Xh)TRXf32yFv7z53M^>f|z_fD7;zCbLF4+cGU5kz(k%rFX zBA?0|@%JS=&KXTW*kLn}`m3ru!k|1_p0dicHute*cg$RB35%}&WS|AFTS}qnN(j-{T4ECUUx^0F?cRX0*0{i}aU3BpZg+Vdx9z zj5z!gL5zHQK7a=C?kx}_Lx3EIDZ4e`NP6u0abRS&6L-Z81-`cJjr|4p#=e#Ai$Z^m zPhYv6fQRQ`MI9NC9u24K>4*kJ93pnN?f5p5{2Q5xt+-8I+_WgK%(t59cDmTrSAbAe z&&4|OkW}KOfUNz0v4e*$^?I0B!|L%;cfIgSwWVErbrj4>Sxsdb({|W(HZ1nE5kRw? zOzwYj({s;k5LYt(tF2Sc(p!*)G(kV3|LC71hV%}5%j>j0@QK%*d^IruMB}3|32*x^ zMFnGrIU?dC{f%<#h*@e1KKjWU0A~^aU2QhPHoU@1O_W@JaA>ZTpU|VDmAqVuACi3` z*Ni0fhVHlrWLldk;knym>EGdxXSDue+XPv3P$Xa^nuOvSmQ5i(ekQx6+T1I@BH;XR zb?ri-fL10IB89f3TLOFb@dn=Zi3ZsvOdqKjtP&vi6i%NIWCp=tZfdNRe4wdf@RBcfxGm`_d@RauS136>#c{rgCFmCj7LY4{U^vfRbC~tmF4Zde%kU=rBg{V1 z(2r=Qej+E)Wy>Jol6SIFn)Tfsa;KWl5mB5zf8|Fap9?yn2yU~SQDpD^KRiB2KDezr z4%Vgg1FQSx{HaUPy}EJxUNYKn=bIXB*cfdC^7u!)JHzU6mj3!-jnn2lLld19iX7{R z$8Q#Y&mdd-^%Wx~yzB*}SG<5Ik5;jZjowx$mX#7n&WZ=9@Zc0hn~x2B=kdAaPH?f~ zvw7`rMwWC7C}v8Y3qYo9^q6s-LedH7ODutCs&cs(6yFD_ugJ;M{iY%yH9F(48NcJB z3QuUc8r|c!Bm6)H@=d7bKFGh#6vE;zIQ)Qrk-5NBXc&o9FG(4mur7X6ab9$@X1fe=YFGr>CfdK^hfG01inPDG1MV@L4W&)x z-DmqIcJb6;+CPWI9*_Rn+64lbk~uyzJ=2m7;>*k3Gnwn1y{F>&I-yFT5JK-~>0&j1 z0nRcjGN?RE71j>RmO?DB17tb(XF~PVFhS^d4?6J$lP=BF! zR*bak$;Y|K>SjLZ!c)O#np`QtU)_Etx)@wOKDh+2`w=lohsOwZ7qvwYIW)>M9^i ze^>VWRC#tzW`TlrJ=RF1$Ep#7suglO(!@J2@8098dj)Ow8T7AD>SI5ErL}i8zN*%| zA0qejn*vpz^753y@D>J(2_)C4)zL1kZ)`o6Flq5nWI7ELl1|;HoDjTm|Dq?hI^XK2 zzwXJD7#mydExJtjUUF(|{XIxs?-yP7e*wyx%vGeN?7C=KAT;QeCB(7@G!#vLPQ{ti zy<%%yfOEeW9^m^0^~k6t)`O(Ghtd5mit>h!Vy5EsB(KLuiXu;BMU!(O?+J<^XUZ5q z0ssKZ^GD+9N7O1N&|GBVX5qVv3qn)xC#1oeZC72P%L!h2d*3=j3k;A{7_g3Ie>9<` zwdW6KY#EwC*A;YhdwKO>$}Vgrc&l(22+k4q`mj1|S%qH@h6`1F@e{eIh|AOV*n)_pxIEyRf|PHo8MBBnV&6x zp|kc#j}9;GMUAvJ(vJMrM0#E6e_4}yUjx$JZ*ia+hQYunOjo^7eBBpIxy7RMevgnJ z_J{6|@#p{%TVrqS*}se*>~3vAT`d27AI=g&ot-J5{r)C))u7Yw5fCG`aDjHm0?XYt zLGUb;2$Ehbl!|w3R4TBOfACUZ$6uG?CAz|DXE* z7`z}w=<47fH?Czh8YOb)Y99l3cAu(vo$*`#DfTHteZ;>VdbPXwD4!H!VD>&LHN0Os z_x&%6vso$DUN{XeE*LXEOPWqC;7;%0b}?*DZMjB{3Gh!@-O=fyNPniJE_BM(;W`iy zt6tDyebv73LsWS{?o-vvf7F*x@%Vl`n;&=PW?Re;9{qZi;XAIF5_fVZqyWNaF}&|0 zYBh}X_V33gIEXZ~X-4f7=$6FTqBG^vbuNdE1aVkwmQi(@y~Tk(_~Wx57q4<;iY6d& z^;ee{Ln%ri0b60e=^U7e+OMbf4F#T zb!+Dr{TZ1h`$|%|M1~AUUWZewx|I5e!rs4Y6ngpQ)BLsoBp{UgWB>4ML{iO1%$iP`Y{&&o~7;-=zz;4yEj3s$v4U)^rgVmvh<(3%M~= zB@$W^f8E>uEsvtbe+il0mM_By-rjsxtm1 zKBqWG*3;Kv4}XaVT|;|f8m+_tdJ36m(&`^Sf3)Z5L)}C&bxU<@riX3yvb-X#Y^8rHW(>&^RASKF3C8;mumcY3zN|Dp=&D*N z;fm7NavsqMyp@U?SWrJ+&Bb?fj2xAiH&Z4DwsfuKj+b7G0+j5TA2iUd4U920hnO8JO(y>%E&8AeV2ss>h58LBf6tA^2H2)PJJMMpASlgGG=eue z*!N#0c^DPs;vrY1Xif2^RIZ^BA1_t{jwer_91m}mqe;|!7Xf_P(q4p${Jz%3!Us&U zCrIO(T?zM5Tjyg6FMG_-9%cO6&$@SScUZ)vo=QtT8g`eWO^OX$%>)NL5~}E^Ad1Ad zG$#Pfe?Up+9IEU@(TRe|E1jpLIDB93_$z?>7BN8T)p$RZV)g9lJOL$ZrqEL=mv z(Gc1Asj4B$g_M8J;6>VUEuB-zBCq2?DpI0mZKB8WRIYY{PEN~3p?J|;DVw~K4H_F0 zALK0KMA7B97NXSz^(AxlgJJv0)BW$}y(It|e^C1=q7#Cq)M}b`Hp3v_>}=~}(%C$8 z+T$_y2-Vc6xNJzVQm$kxve*9ysPtQhweNrDtjOOj~JpU9lmi)Okur6ODe+$nK&)`d6HYfUh6{ ze+h#}@&n?XWQ7&~Vyk&0A9Gta1VyGV)(HDSVnbMtvDnSQon;w|-CFA}iD6;u<|Y{y ztc!G$2xHEXwy)d|ithFt(T(?ad}Z7H!Bm}Lluf)Gf2}LGya?OE#hR|&+T>v+#&G1P zPD%Z1cu^V~801d)4!5VbIGouwe=V-HfAkJ+Mh)Pl!+IIC^l+>0~!)dJA%zfHG)IAti$d z22tOK^D&zI_b@Vz?MzrK0&Jn9jGXa(d6!w?3H;V~NjhtIwUjaTh5hjC+SnHGf6sG6 zzMs&Bt#iurYr%d$Xan4;hV###eW?XnO%DkA90C8 zuxKDOu4vV(n>pG|P8&3fUZi$s)?M#z5pDJ%!Hc_u6(^g%Q|#VP)H_C3#+}D7Zt%ps zoO?*weZ1*ZJn?V&s+J&~9lw_Tf2SC2nN^vgG2!#qEdlA%_MrSkVK(-Yyq~DG_e(8! zbqWv}6}nfsMC&Da5zB@ZUic?lFz-HixHsCc9R>f`d${*hSN}b^>E?UB+wYc9dEFtX zgZ+cLU1A?tUb~L#cBwMM%R)~t<_vS$g-rzwYkvN6nM%fq?e)QU>f-Kwe@YT#6}9)_ zZ`n~VIfnsAgc+PEt8(8?j|0Jy9>~pvlni{Qyfsb>Xp|oWrec9)9!LMjuuo9$c4fwn z7e-dF0c33*H0&4q!G0SvPfuPQTRYT-64qrB6t&k-J`@v-M8!NM77Dqy0BNe#-XilU zPKx1zQ_Jr}7GT+yw|DEee~4NxPKo^D?=>w;zb3oqQx0p4(+nO&Vs{p$K?r2E8XbzI ztixmg?}lnsRB~Y)f9qbS&!c*#emHvk>waE};%)5M62uOeRMbUI%a~%3Hr8eNu6t-5 z25{&zbe^g={MzR4^iR^;78o$wie5)MvjdvXpWmDon9*f6J;8Vf9BiI;Oe{ zca0SnYSrUq3U$9YMAO`=I=kvGM?v&Qn)yg~>AYUgc@O9E?#}WVlRXc)D^{cAbKUD> zhyFQVDoF|}nJ(n)9v_GcHbDhpIH`Il!W>p4JWs*f+kwMv<`pJ7%{mF1SZZ&Sx`}`; zA5hl>um;h6v>a42f7_%-5ogXC`23~GyKnbuLM5dXxTMgL4tOW)L^S~u27eRes91^< z*&-eYc`hf0Tgij31nDZ#Iap*Cw=cCDx1_8mKCmzE_~(m%383uMo0FqZ$VQ3?mGaxNVOe5EUGxpL<{J?C&t)Gk#V$~z~g0_-Aar` znpUfY?{~78cp3EBlGX#%OJ(J-A$jOZ1)9^;cFP~%%<^p8L^`{bq!m{3nFBi!zv^N6 zU(3E=*e2s=oUAim*m7)#7`(A7e@?OsTPfFg?BD^f9WoAKDT?3D z>7yg5HM%#RBzU0;D2PW_Z?&XWtJM#1(A;z*8MHiiAN>`n&1syEhcsOa-`kn8&f6Mg zPIO?{`K_rvA7go4z-sBq|5kx(HwzR6x@B9uH8P~wD0oFys|mJ!{ny&-|4)Ro4QpL( zVAf;>DP37y#s8qJ;-s0!AK*Ux!&7Xpi(p5>%g6mcEZjVoh<9drSGdjC*>{&)`T-jq zSrK~Ev7t6^sN0Bh!3jS$Vih-*5-Iwh80U9dnTsyY_E9QSS{#k=IK|e<*R-McgFCH~Nz|uzX?T1^|Tiw_m zC-O!!D3>t%0Y?T~7jbv}WtV;X0T)1jyLW_Ha|G)RAH(Zb9C8{=8`vCr%lDBxUj`H| z6Q>4E_Ef8U8XJ2CF7`%;vMMb(ob6ss2129!Mo$BIeR2$!)cXNA1-!DpJjRz1`~e*` zpN@(n@yr;tj!HeRcfD3pnR{T6HvK7$LZewU3b~=B#1dlYl@^;B71#LO$_n4yx#eK| zB$s3S0Wg2AN^G-M_e9$r1SlNB(mj{*ZUIr5qgx`&=@-_G!IUv%9FDw%(Z#LX(XD~? z;3re8v2ufA4ed$lDhcf(5oo8=3NNQnfte%*jl8<=I{Uw-G?>=_#V@l8x(TE7 zCR}x@&x?U)DX=NWCU^P=!~)5o;7jK+CJmtPkoYr;yq`KVB>Y%eKmPcWWc>`Y9 z8ytUx`jeuJfio@IC5X4K&H@_?BtLM(u+5%Y$`L{;`vG&)EzV-J==nF+-1)EUD)l!D z_C)6^F^~NQiDcbV3Zg|dqbo{?#4=`rzAsU{FAMpntoyQt7u89I3uTX*bP3FqW7uB9 z4JK4XBF5B6_mqLs(QHXwG&g*H6w`RrtTjFNb0nFQ`|YG_lUUCSfH{1!m~+{Rw9VWw zx=h6GF>NNSj<3yDI^`hLS{X#TUGn{{B}?W!m(n(M`asm7mrecw7k`HMi^6t6lr(AH zbW*)+LAc4)eRKb=E@#Uqy!uJ zS~he1Ws&CkY;NKM)sV-shjflxL=N55FavuY$=8v~_LrSbY&_mz`;v&f_y{qP>I$g% zR_5KCSXOp*-fB||Pk;N7_xBwIAgjNzF8Gb!(rO^nc{!`kFUWP}cwBlK4ro z$oRgLY9Vs!(=5nQ^4PUitC9LO$ILkRX&UEQ0l|lMOGX*3*vaJ_%5{1xoY=`Q1Wry2 zN}Gm}rQWl=rb#R>t8CSoGq`#;F#+rligJ-GapUU)gbLTPe^D9CE!1Vn(go4mx(`IL z1{$zyvriR;Z-1`SGZAK^%-;r_&Q?q@jI*z~>R@#{xANvN*kCq9)(M6 zS8eF6e}R+QA5zdnGVB^w^^06))1zUT1BeV=+umyC@qYz9GPFr77512%Lwkx*A$xOUN!TQozHq&5VLvoWAlzPks}DyN7h68>tzQ^4(Nx@T+?Dr<{CHE?vcGto@B2R zPVJhPP9!bi%@NF3(0#TcC7V;X{LaA=DtLg@QqT+04heL}x8zZj+zA14QG*PC_0Hr6 zOs6|ik$(;t=4~&Fj`d-?q>?rFam>y2AycJ-^TL3Y+xm(lAKn7V+s-r#8NCrEQn_!w`-c57!gC_G)SV9EB50{Zp~bL(n#b-NPLKZ-sO5iq1(+% zt=Aq=VUtEls|$HfuP(xxnfm#HVx;VGmFhGS{(q{6_UIZQj2H;UnE>(fb($#A zcR~=*6dY>$mYE{ISC<5K3f$j3C;Q5Rp+106sr9ffFo!YR!q2``E2Hf2)SIQHH`M+c zP=B19L9RBy5~Oi#mz?ksvq*SqLu7#c=Z%0X!GZeSCn|$EBP*Kpias`azC08-*TBD% zWM1by@ZTz^L4HqUHyD=zS{6AmL$9i4hIjQNLmX_aQRAfgfEWs}Jvg^PjL6GS0f zfp?k+xe*wge3 z84f4tMb0AToucLmMO4i8N)E^z;8ja`Kdc8rz_=3e(Oyc5j~@Lf@eOy}!ue3RG=J-B zki0aU=pE(`ez|H9t>KN{B&Ip#F$D=@BF3iiKYLFfgH;o+x$wiJr5p`<^vv+2X(T8m zm^FtAm{^qWU%8S}IvhEVX*%LSNy&KbZ!7(YPKkEEJH#y+l3 zy{D*EN>i7k6gk1xcXa~nymeIEb${k)57y<40ccr3lXQxRQ6Um%I%+;s*m+_q{_)GL zXG);HX+O9yzAc$JE2EC==tv$YN5k&??yYY$^Y_=+&lkGmtUO$6JZ0M6ZCQnQk5v#r zMAJep(pnu34u8j>V|@l_8_e?k^zBpFX1~;${cRiChbI%;gW8NF{{Y`V%ztN(=I8!g zC+y(OEyQ!W+~0mwGO_%UZ}Z$W@j7A@=CVy)8!1|xkAgAeX@h)s_3j$~3ys<~rt2H` z@Q)RWl$}rZHaYmyY1h`i#6MP@{{^8>*4{_B>y&X$nOb;%{l3xvOUBoA3!Lt`{MmP& z)|ROk)~UFpV}e_*2}&nMPk$PK1W`_!$6MgZklTZ!RIe|2hv|aW5meQRpQ~DF^+E=@ zCIfeS)t;9=w&sMm(qlihVq%ZsIRY6I3`^cQGbFFhIeON^b7xF zuFtcvIRPgd+u@1a*FJe!C`AGzyJnMF93uuc3eY&R6pMoRorOx`J8mX?XWugPgni(KXWXu%kj^B(j3_etJZEmVbJ3>s7e5nix@NG$-Wk z9uMN_r9k-OnY&!%4KVgsXo_y-i9CicJV0i4S%w{t=c=S$8>66n`lF=&x zd&t4FeAY|J+AIqM(6~gF=3rGdp-8?|6|D|vjdnE{ZGF_t<1DqHMX6Xw?`Mt(V@A+X zie!4xYRA_}D`!~unu}KIDUqw)(KiPNM^BQ>y=rwSTj1VkdBN8oE9~%pS)5^bgH`nt z@TM30UN&I?WCPa&k6U^G#}0J>KHt!O%dc_G$M4ko?{}VWz3Tm%#1bQA=tYLUk}|XP z#Bj*n^X2u&=a;(%0xN%CC7~cIyaYLVvAs<+H07&zxqx6>33NHfXTnI%MSj`lY{Kic z!VL41=5+&7ex+JJQ^6 z-=q>Pfa8x|k>|;oGl^?jXofYW?~-vXLv(H_<*xe?yF)gQ8iSH|hrSF@D~FL7^zV0# zFw)4>wo;d23yu|s5rCB6i|__j3dl;bA(C3fDPB3RHV}vTU|pW4#en-3@KH<3xtEX#0!M#Z#XI(f z<153qlleHXRX0m}E+E$lKvb6Xa=MO=4M&Ye;LlV%wo!_vvT zkBC}V&}o_FEj^c8Z*yNy3v{al~d(}TgP$eK0Qt>-&O zNi$wImnaY6fO4L}5l)v>3IZ7ipX&N((|o{}bP577e+XD+cFmZrzz)(YIElmhVrJhR zuf0k*RISNH ze>;NgIj5gOjREz|#jBNI+xRq#Fxp{E+dnIL)KyZ>=2mVQrC$zpRCx-xjnZa)bN6^{ z{kCL)f8z1r?Z^OKUBTN^-6aod(;22Ut$W*lfoG>zMpu{4%%pe3I7>9lK~>XO+Sguc z%aVc8$<@^lKl@m5lB!oBQE~=>l3Foa1xhM>;Djn>ZG99~zS4a4YqO8)D-v5qm)Gf; zhSA@Epl8YG66+kOGMBGPLYY7qk-hn>6F@I8e+e?i+Kj6Z?35!N2cfJ)*+7a2=*hf| z`%^UJ}ZhR?U zS?kQ?bq|)=$2;Ebo_}E`(7t$ZV&R5=G>kIcs0D9Qqv+g^Nqxo@YE!s5>b`!z_w?9Y ze?)lIxVJezImDpa<}#IBALsU-&UJQ+`nRgtbU{V`kFSZZ^=ZBr2Z6^PDx53`F(i?O z>p#_&r#g2b*j}s6Y}`}_1(H`6MB-Ddm2l@#Bt=l2-NPzk*GX2Xaf->sjkK9NUd=1t)Kqw`v9e^v0gYWP>Wsc83Ti{VL8MEA!*fj`#KtVypV zgPpal8nhC^r`d#@t{M=;TnENso@!vY&Dq;?+7a(%au_Ofb)iIIdDpFP?%N2$xW1|xsF0g|34XEB1?BEaj9tw|)l*!2f8`YUpJGm%Y2rUVzv(Tfo0EgK4N^TPd7YCsen?^v z^~6z!4!U*~iF^6Ql-RSj{h^qu4*95gG*q~voCh8)Pd{L$$IlObZ)=cBqi!UAAi#K6 z>IV(iCmBH8i_zc4n&|i3LRFLFebcf>V_tEd{6jty0OQ06)-eVp?^pMoe;eZX{SL`| zDmFn{N+aF%8tfW(4Pv-*AkZ3mqB7C;wD3*Mx)`l?=p?5&8NOwMJeI-8*4qJmAyub% zbIBQzJC6;uizB5dA-}B5AhUAlcN-{(^#)(>$^8H3*95|ASp;hfua(8kw1Zg9*{?2l zJW8oc^&8#iN$|o-_jHq+Bxj!KVNPOSoL&*2_?B&L#0N(#NaVy8mmLoR2?3^;Cl3N8 ze+TIfPtYL#g=}Pi{3noh(gKF2uVnu?|?Q z8C{>9Uh$Y{%uJ7Qv+9nBI|p+;1&i=re^;{mEIz*WEd~>X$@=q+CVpLK*lX*;tLP3^ z=R=QP>ulqKoTKr6-~xBu7p22r-NsvTDmXX8-lF)4^>VTq7VPFj3&{lJTCvQ@n>I(< zyw}$h@}tLT(x+An)`)tGAFP+R()CsPFEe2++18scf%)!Zv3S6dq^!fwEZz^Jmr4)< z8UYHIWe@^$91wYN6qLCFx-u`ow5ues|05e;(z<1QkxNp*rMnkik9>*Otrtl&uYsLR z=#!1~-uam9UKo{F=(9Yy*`&oN%{G@O5&}Pef3vf?^-~GBTzPnVmSgYY!SgL?)Ls2( zFTo`RHtW!a6&{Hb%8-$Z@Ydn1kb^VS^DCT1qu7gIedd3d2mjAJ3Vv?({`VSqXt%Y0 z@LM!SRS70{Oct=|ER2IYs&@=6I5-iK5>!JfsAb@hcktL{ty|EXhbTj`#ulH(2l1w zlz*zAzb9kbkb$9DO^-ZA?Ksw`6UXv@Mk*jDd!F~Sa``6VO<83bu@dvDS}YAhMZVM? z(1N>6-jigO)T1KGmyaKB(+mjfg1`hr;FP77L%hle4+hTQlA~`;tAD0#mIhzcWxJxkY&&wCcH{McLP|Dp zczsS$a_yZKFT-2P9LnG`r`j)n=skTe>Ni(?F7rL7zhXE?RQSP4un#1;G^yx1Y0j_o zSLqX{6*$P0mF*{Xi4;2zdL{W&YsSIvUmonIwT-2HJx7^BOTUu1$067gxDWA;aOs1p zbG@cq=K|G<9A7q)H^{J#v6XCxT0bb{jdGuO^+_FUER(XXmYBod^CLcgW{iR{nchow z9i9L$cR9*#Crd03R;9YH+@anliK&I{=7KdU7je0IRqe53kF9QWM8aFNkkS;0s~~u# zjLOxoz+<7b59$~X%{CgKN_2oZjR=~|s-xa#h93MWKa|HPa-G%RN6@ac{p4E|22>zD zVpk;n375#fK~X4hYPxKHxcK*T{BQSmc4K^tl_n=bpk zT9TrZOzjWDR~k8pdu`$skrVCLLEi^7ORmXw8EAAKW%E!j&uvNN(VVb1f!ln1r=Of} z?oQ$bDwiq!T0A;ds)wH>cf|{C5xOic|1`7mq%sT{;&Ml(8#&p3NR*!a%Jh_|2pD;} zxBcGa1m(e*Q+a_)=>q@LvIYJ;a+}QxlZwwyEkm(yL$OOsQ)o>9Hd>vu_Xr3Mc)V|j zL5rn!c38FP`Cg{do_?Lhq0H8a2QD1V0v9K_s8Y!ah5XSs{^s+J6@^Pl9h&NdmlAy%nvo zsEmnB#^rbzDfxKk+1|_Dc!;>@kCJ6PBfbs&pXv`^FLh6U-IlyPh$&d>o_VzleZSk^ z95Sf~%hfW?T1Oh6WGz)k<@~R96l>PmRc!qrB24E*8+9@~SL&*_ve^_j?g*oDM^K7a zs$psDl>XMKbgdgyS%>ndwY{SYsao3CC(H0s!TH$s^sy_H_F}eJKx#ER= zuH@|jXfh}=EFbLwmc{>k-#Nyx%a+9seDHgmcPy4!K~Y3Op@b;^X!0?iX3m7Kq3hum&h`^;coA>M z@PE=Oe)jrWN~+oOpz3Kil~!31PP`w8DzQ8@v=xgXkv=(=vq|F-HNuE~q3E1TkN3U{ z(IEhTAXz2JQY}!}w7LNp@N?p<^_=(fjXbNviO(=Emp<26fk9OOv-8y~>=qhM?6Og^ z-%Wd?4JCu>|W|u*(T<3atJavsXSXxrZcnaEx9=}##frqa>ny6pUYcz zVfNXnACh->UE1)X!2s*E0yRuMmiyY&*`e)5Dpfd0{pdTWM2& zTRMZ-b0Cb{)&USyf;H$fmfXREp_$q+zJN%M%blkjHHTP7-popiVNA_{Li zww2o5@`<4<6(JwM%IT6c2l`6)(hZm1hZI>*WP)ymKsljVR5s?aXPRC@QD7n0b{z+^ zkT1>Z5uMw4jfC;IU40lcuD@;EwauD(W0&w3Gp=%Vt+z2nY`1AA zZm2K}&v%Z)u05@!41A%OaUpqeELD>%!twsA`peyW58N5GtK!CXisXt&*i#U2jIQFI zv=+B9YjIEN;+~W!&0`Df>LHAOGbK?Fe6rWBp|4UG4PBjgU~xKV;Ut6-+=@u5{#rVU zbyuGmb#NsFknPE2E{gJFSs7u*>CJM@t7R^5uA!wBbh$Mxgr%NxF`iS+elIrV$Cx`W z4>G%=b1VM7?64n3x8k>;cL8$Rfb)u-onl>buKFTjTF5u&b#kuE@b_we&g)04x88E( zEFpGdrAK)a*hR2Wf|FoF&!3sY%8Gx+{mtG!u>QShlV6IF!V}(Q!*IO)UGThyRda*= zeD52Mkv`-B&d15_0cPT8V9B9Hq4~&In4}QKxu&4L<~x8icIqAsQ}>_hzp1W#0(8tU z4;=FQ#;R=i9)IpTX=+wnzvH!a!5~6l%p+@P`YH}t{m9fK$2`*n3SWswkmYTJeMvVC zJKy!?zXBnPA_Q1fqF6YGWX|4*Y#gYP zrGb81moFRw7k~TN!Tx^x9=P^_J@C-@ezgY{eoT}ZCqYRPyc-|8bl;$4+R}?7nTI)5 z)zB@D*Z@ng(bFjEfR5}mLo?#9t>Z%ugH|M#+AYk@vvarR6L~E#S_7-^4D)!Q^LB&a zZUh%Y*Nxx0pl8Hg21M(mI9P2LwuUX0$dt2I$RknR_J0cDz64R?(M^Xo1-65f9=Ljt zjF}m4^AW6`oC32LJSYz9+Sd~Dmg=e?tW7i{K)1xzXzkD?KsQ=uegJ7j$M%6f)EgP` z!TAkWJ6%-9-^M#7W)%kqBf#U1^o-4~;J5Dc`n^^B*y^w0{~z^nhFVGj!z!<^LhV!hZ)cyK?k*{o(xn`2$cvHW4$rCG_spdShSM*BWHkiMPUDDO4IQa9DK3#8V>! z+LAWf?JS*3h`~vYd(X%1Sf0gQa2pG?p8uq=iz>@+g((rU;iuq8{8ZLH{}915`hl0L zr>Y|}{8gFXXVLH{ZOQya^Z5-xcGN%y1zYbf&VQn8(~0BiT%ux6s=rqx3XU6J17Cp5 z);ot-PuF7uo9BtkQtZN$JK^|mhy|68y&IbDj}f`Lc-AySZ$RrZWn&~&v1}{Z>0+=( zOJSQ4AF6JdSZDPc?sHJE`E1MnfyeRqe~>>VFY@K?v(OkZcbu6b-|MT)d*QV4QU@Ef zgn!a>y@pk?jf&mUxBp*DKezaM^-%~8zt%`=$(`8b>hlHcb;;1lE_z}7hbS-ejarPa z;sx(-n&tP+@|$M)q*?s3RY zLPd>q!2m@-y1!!3gyniOlZ1F%v58Jd|4DbsXIX#u?NVd73DY9GGPSfS_mJ`mq9>^L z)@$|9hCp4=L?)RTq9{=$4>M;H<0kTGCT8bvxmA<|$%n38e&73cd`c}Je8(5)94Llz zy;!dJSgEGXhK1g-lJ+vk_EGh;7-tnhW)L z(>s4OKR=9uA-RZ1q}n0-EzqjK5DwQiF07fV8*5{x5RvFXP>%ibx+G#sHVrbQB1gP6 z23?$qr3A!8-B3xT@zIEn0UnS*Jj$T4AU+!%o{BmB-R0O?E&(u0OJB1MC-AW3ZQZ97 zutpWL09dpSFk5sqN>aUwj&7=M?%V6h#5;e}N4jJy|7rAf!qco!%5UusfHG2Pgj3Ru z9!4lUfR!@{h)pfM`S7wl=_k$1NF&W6sx_-DV4C#oR_e@X?j8)TF=EJ7Wb{d#+h|3E zbRNJQFG@cHSBjwFB(GU0q-y3RS!69T`5$ z1>5@4bUadBBtlJpv(`ez05=c1Yf*iMc5oJ?hAf1YB4sEAk`BOlJ%ds#;$=`*+A9RAy;_6R1(=fcl-j=T2 z486DrW=h*iqlIgE*cTKtXI+~_dlmr9d1^VQD7C^WA7m1M#%9rlPpn0XgPrgH7;1xm zt5IhqMwkX6*8mhlLPygD8#ehSr$Yc_sC{2mx2|-Hm`y?;0Kt38MMHE5qV21BtXvBy(h3>%nh~HA7Y7^ z7TA*gUdOd+Wn=RRE!#RJ_`W5k%-qhC<+_ozJAsmus!6g0w|tG{?BfqQ4j4 z+g49y+EYlKzQ5`5-81n+KP~is`9z;BlM~E=GVw%TPrFbj#k=ac7iA=7lL0xbvWhe8 z#mU#XnxaiM-6zF)3Qr`tyk}f{(r5g{sf}v$)v~ut0YXp2Bt#=I3CCZY1X+=T2#niBh|o_}q%&F#?|W*!IEaCv=1 z{mjGJb=>fS#=!@ege@;0je5Eji}i+t@i4jY8_3KtPT!@F;&-^maYFuxn)p0owKjUE zCs)0P%WLbb7f-Gz+ve4;UmW!#(n?;(k$2vOrEnrsxGGRH)FhOI9DwS7(OA-8sJZII z)$3Y*fkenTGFuDhglT7t_diBSZGKTwglCpT-^?e8ISYIse*Y%v_)3;V<6FA%YwW?z z&ZB)^UmQOOtdkZ}kC4w_n&gf+0#=D?fsI_G2&#hL>RPkMTr* z!aas9*|^!{r>dY0q%Uh}MPRO)M*X{OO<4c8vHbhl!x#~4Rt42+9P*@!V7l`%Mi zp&k!nlzl}pwq!=)a5K_9)Wv$>-s;WJ&7_w@@VC8J+E~CJ%Q_fS$U37uNDW!fb(pHc z>YBA>di-u$1^mo^_torP1)An_z`j2s31qOU8U5KArU|Jr3Hh@}>{|vZ!3@I$Mhde| z%77!dP?$hPkf1<8heof228|a2H9}zWZej)r{7x~Lf?lKZpM(z!Z94r-0#~;_ss$FKPDN>HGZI z0!~l)yC@j-nXo#$#**rwGz=pk5ks68bjGsvoGa{rVYtE(cYi`=bRg8{$D*9Z_jL%) zhZ;28Kyq3$P3g?HX6Ul!mB2~QFK`-IGSX;)%vIThqqU-KXKvzaewJRoAG|5M-qVQ zDb4I&|IXOndYEq)K{8oDTNeMbby@r$5PUR?LWI?ojh*wvF`?l`3`disi8rx3y~&O} zJLi5u4*(924oN8GvGWTFIru@gWno1VS&j?Vb_~D95s(f+QAd>t_&M((6=wTxUtS}^7l|C?;yRNfdjePmffWK2 z-tYR4zJsprKG-#n_P|Nje{`tte8<#S!Xt$=4Oeom;(QH63dq`b&Mh>DH89l$-X6|@+@7%hw)+jYr=T>Sou1sXp&VN+BIK8c6Ap;aw%W{fL zlB6D}-L#f6w%K2!iYQoIo;LGXD(NjSjvVstdtoW0+&Vmj40c6FRqgKO2`(cZkN+;n zi&vm1fFko$Q@vzS2H~}e^86MW75vkzA0t(FM4@@|%1lpS1fa?_CqbcjP=gYq+C(I@ z(NV!9YoP=A6o2Ri+OG`c3UcJ-8T~lAh}GJ^A{8@R7B*Ea3?reN8&Hx3s6NK~)m;Z; z?K2_TnDt(_^44AaAjcd+;))_m`j%^YebnQ;CJ{N@C;LUo0%q5!hp4l!elscGTU~uX z-yV35nu*@=A77rzXY(yr@?;DLkhE7>TW2wKg2h;M629oZAaK)YJe%lfjjj@!!@40MA>PCsa`Dop~; zgnzZJ8j2i;sOudSTq|F0<1}R{PI0q+y)KwX;)Veez4)4a?I{{Lov~nJszO*GbL9pf zuAOOJ@Kx(B&SiRUP~1}Vc6d+r1*WoO3)#-aLxoh0f{8>mW?JV_S90lEAysN z9{lCy)y3A^Kba;F+|_JD%J}G98&>3n5`QAI8OGKIjN`>?cl*HbMz2~lpylh<99-`( zb)-ZVq`^?Xc^y_BBX*ST)j&kTo5GI3w7BI2Rk?AGe51cpypkpT? z6*cnwvMrfbffQL19^*qPNR2qSG+qYGT`%WRUk=k3uTn|HNDv*-)RUsnX}ApI7k_{y z4ei9JvuE`9bV71jeUc!u3@ck23fC_lL%etamS%eP>G#9 z@U<{Lesp-!;@_9K0y4WzKCl^u=AD^RiQN);xiJ8T($*V;O7xCutpklZKF46XQtyGo zE<=;L#n}ZRcAKSeJNFJr*dRJf<$okmGd+r$iPB!O1~YuJh*A+%e}7%{EU*%#@Yf9a zRZinvm#D-_@)24bj(jm&%Z-di8*HZ7Wi{A|382!Z7k=7GVdOpj$VL&#)_*6j<1**! z<-j3dPNnV%|9g$hic=YU>87zNG=R;Jbjq#bMOMl3|KYEW| zI!k0^CqyE6KR}|5-cX1g%{RoGLXgGAbjp&sJe#4}YHIA~J!p)=zuVVuFSbd}Hm;8e=M;h${#pYm$nY&Bs+ywN!X`v)jU((rW zc(>Z{Kg9~ap3ic$I)3}*;|uhlL|(IjrmKzgvX}fW0w;e4<(LR0{sqVp&+6EJ%JJWeNo$*HM?J|$mb{v81CHzoB!FmU}I5Uc1 zd7~RQ+7W~jL*TF%8jo5~%zMG;5XbT_h5!yPR(;>g_9$nfZk|eY%iSDn%l$RT(ZpO% z@>;PJ#&>@eGhuGGgt$GJc~~}@58-QAjuN(ZLcV6M*9FgKxd`IdjD8nPOmj}=%jkSd z&X*PN9sw{lSIU;M=iYUF!)<*>mDk#q}Hx<%_|m1D*9w zUHl;Ghff%fhNs)7#?cnLc0A3SkWU|I<>*w3*2)Qsay}22z%T+E0STAfFajbg$Mu@E zHvJk*55kJ)vTJeB^iz1lGN@^YEZ+GrTk4#yA0=`G9yzx9A@K#5DKP>YVaFvXq{Yio zKaWx8V_v%+e>0Jc(i;^1(GV`e$&n5CM)thOW8Xj!G?rbiVt&*ZtAKiDbZaQ=1ZWOV ztmjV)8*86(G4}Zzs1`N8J#V)2%hQ*EEJZj$Y2Di`s(!<6yD68YF#<1tbg0qoXbu#k ziN6WKxK6TeibQegCw^tmakA5T<2?iG#?D^Fv(SU^fwv>j%aG;Vujcyjmb+Q3>cNPl zA0J*#GF_|wOwN)Pdm3AA%3bT7K<7{y3j5is3o1Q#{$3R_jloFKT|cLS!{jwNqS~*L zU>g_56yYB{KHi6JGU&#CE!+)mj3`!GMCH5Bq7;ja`h;`Pb&x8SZQ$_obC@eVTmftT5M1;1v?o`Gco;L|Gv?>>I5WGRH*hg%?0HX;BXop2QqHD=WjuG6e;?wZgA$J=i&*w{Ps zyT1FTA!lhq=}waT>{3>En6NLRbY;XWdth@<&tSuKiHw23OIV31z`(sZJNV0hlzLJ} z0nfyR>EW4f8pAW)bJeqg-Ku8D^QV`QGy*Dr-@Gks{{d0x%Ut`^QQY2M>u28TmD8%4 zR0F0bIwV|z8NGGl)I+7eOG}ZKPZ`Djf4^mY{+9Kbqt`U$(uRTZ*>Q1FzbA16(>_;lsIs`@GjV7m5KO~FBC1jJP0I_x*VQN_}K z|A8G&6Hl=_cel3ftzIbeb~ifsODZD!g^_nZN^~KINc&FLgl!I$_Fbj!5xY9Kx%zft zWM`n&W*)5gU#SHP!Di7Bo!&ydlF|n>nXjxw%2VC3sCMoG*0Mp%SC+cMQh)7B9bKSQ zSEPEtGSb?8t4nvyD%dQlM>EsL^n-bS>uatS8PUef)4P011`0y2l5TomtnB^8P3b*##^AD5SSc@w_+a+o|sCx4EP=LT-|?@7W7)WJfN4lLB)>I9&M5 z*X#GCuhh{HTLDw9XYKew-P_61z%$=oJvH3qL(ZA>ScUg$Rz6>uZs@$s;EBy9pFRZ_ znCR6CK!!GI2*r`R6&Mm&4y;}TGk@0e8Imt;@{?_J;*xI`gNi1p54&!qU2D0XeFdKp zLr*SUbfD?F#XR1-f-&KLp;!Bo%V*sT+zf(N!K3Rb789!Q;{jH=WL92$o%Xx_3vuxV zL(WA`P*lA#R5mCI1*Q#WII`26UNtVim&%6GSxxV`9g{6r*B%+4+ULLHsdK(}?>=+R zPy&b)Vsqlf{l0~G1NwAg-q@q<(46QbEKmMhd`>lk`p0sni?_gk1{#n#Sq;so=n-r# zi5g#SM!8{8N-mRha3;oYW&Kz5#ntme+>ISWS@l#G!=u%m$CjO{tBN{UcGKncKKhDt zGj`>mH|t$-^MT7^<+d{DxIA5>_U8EnZVSf2JfFs_{Xx!rf{B0fFUE9Nr8P|0qWJ;V zQ^$FF6XU7BXH8vyg>K`%^M%uSFREmg*=+)gfv?u$?_~UAEiMmfLNe||X%+3;LG>so zj)4;=+LcAh^)A3Wqz0K=-lpGbtC1QggwfFy=OdqD;|Y;>p+g=FZf*rR3_x^!cBRh= z+s~dKKZ7hq`dzpIYob&b&8hBn8IN@1l4h7*@+jh$kDcbC0x>}{iz>op#xF|* zGdIW$Njy&Z8P1ul*zOsUhR@+IN+cb-SC>kd7LCe(^aSn48T}MW^Qtg}K_gNp&mxXZ z5`9Z9tJQ9=^|oubFF7W2@XWit_OP{T1FN{1S8v$j|4sgtHpfu|(a-xYhERoVSR1e7 zgs{sM90w>Mq;R;QsI}L@3&wV3xWWg1JFnk7Nv+Y0ca2$2ih^WTXR9T(TCF~IyCFlD zAC`lEOfOhqM=w+|)&a$|bxx?)W%4Lfx6Shw33AS}sn>=%k-n%PUPES}l+=o|tWeq> zD?`oDqGQ+}xk68=Y*hiu5$*ocXs&Z%=GNX;dSa7St1p^*%>xjeO+R?>wb=?XES1B5 z>VQ;Tz3vTUD{EI+8TGliids2~`fTE`^;z+M^5Of`?FCA%y&9iLyX|a;*?BSl!RC?} z(s^m?^iX7P3Qb2hcQ!URU;F6dqWQbCet3_UbH6o#^s4N35U#tSy5z&i2+ET%cF~KG z(W`eiTF#0X*3$TvW#z>o`j-Yr=qOy``#OSc<%dW2+6+|R6o=oZzc!lCPv?9oRth42 z`LkrNypO-kx=bo*Xkg|kFv-}O%4#A4|D^eJiB?bBX2)bT?gk2w&9lapuur6rPiRwe0pB z$~K^Tb2)=05d?-Qb$aSwlmjTyCjxc!OiyD4*_0UBMG1PuMTP~nZ>#cTJ6@6Z`4GzM zd3G_UE)_3SFCLtuTuJ~i{4>gg<#wjDw<|q4d74~#I>Y(1^vX9hvf6CKvf_M*tC?O_ zW2MkYi7|*-&GNn9RosVzGX$o82O!i#&4AGHCa#j*LqEbA7Q3yBQP(VI?lGkPDhE|c zoMV+u3L|MXzGzM{#_T{EV&3t|t+RRFBV7U&_sn)l`~aI6TI25a)wOqOj27h<&v>qy zH>-G9Iklv&)y)diUj4eTp<2hW1HjEMka_G7a`>>VLgT&y`;LURZzNBD$8IwCcV;~H z`RU05^3|}~6dvF-l+iV@=Xz;;91D7X`tLTfdjkcfC`6|I6NS4S@9>PDF)qw+f4K~4j!i=m$f0u=y`Cd1!l?8gGfMS;J|d$z21qR47scpwml&cZ z=PaCB?$~(=^~*Sq42p$tMxAef65wt|)|s{G^p?X|qzV?%ciSoTt>}xuxclUQ=*eSyJo;00 z22jqPCAM@nxTWZj|JkkMZGaps3y_250kUeQRMP!_QEf)Axy~9BU(twIp%27Ou04q| zrFl)Azm)Jj7Msz8QDrw*MagKH7%mJHbe>6JvTikqH4Ylic)vLDFbXFFt+Vo$<1&#K zB3;p5b4B%>HwLS82lHQ%j=Cu_r#O_S%?ZjGK+7|6mQqGtu2o(=$FNd+`8Vzn5`hk) z)oyHmlV)OB87|c~i=ET0oj4&=ZL!+P^%>hcfCXOfe05qsIG>6CKec(r0=Uw}fRed; z89~VLggI!mJU0?0YAnc_%MzS@Nl`hAa_d?HV{^w&GaIgej3YSme#`pZE8nTb?uofr zOSo{u4rlmSRT2wJ!qX?9&Z>-g+W=&o>p}g0MSg`RP4@Kc+U2*5@4+LR#L-i{&3l%F zd6TDZXZW50(DR5+Yv7&BAeP2v2y!vZlw2y!7Rz?W04Fw0EovNAl@_OC6NOXzT{Gex zky#O&u)93wrN;eG&p0IM0KxXSM^SRUF{x`XQ(@_Kdz6`+{YXw+r)9C%{n4m_EGngc zg00Nb*t~ARQ3SH`g*RpALmzze*fwP{$_d;SI;QSp6^P4z)A8{jc`#L|#*)&e+=#jJ zLWIV_q$BxVhN;KHw+>8>KeCxuYb-)5xZBWljdg(VB#%>=bf zTGGS_vqvOn_$5MI<@Nwg&Vvt9GdT|F$qP~#X2^I*7K@$k$H;0k38YN9voi2l9cUDK zE>=}yoTTI~q@Ign4wK8Vt)-tA^Tjk4(&!YOZU0dNvM0AxQc{jAm&XS#Q2_{lg0}&l zG?2OJRURuj1B;m}q*CBdEDY^!O+76&KChdAJk1ISCiP%yU0CPW%_XEn5i(6BVwJkp zX-BJ5k1`ppJ9!5)bv5w;()o9;*wGzVZmEQ%v)D7Q7sZt-Mq>i4U%YAq1>du;kR(OF zoGBU^@J!}sk{Iqs4<8~bgy2(u?ZIVjiJ7Qcj@x38-E~1s`_-Hil}M9qrWx7Ws9jB3 zH9^EN^`>YS?$xn)VKJ%LPm5R(-0Hv-4`T|3$D5^Ce2Cq<{IOrudrLZucNTV%M5Vb+ zif#h$VeFAeujKUx+v=EUkM$Z(Jo%Dvo5bIP9VAcZ!1nUi+Qb(@WAvDRa>q~P_yFU5 z)*FKomdeZ1Om}{>WzEcNIx{6Iap|zPmX}XX2pFX=g-2VD=TgpNZy*b=rWU*MnCGAz zZ+@XC(R`px*HDBTnWFcF!&`a8f`#997_;z@ujtx^0XU>c**XhWNm{&I2Z$lHPy~4M zL*8`x+}Nik`GveOmSaJG_aZ42x54i(?$$@Y276$XORz8%?MT%*r@6UITiqZ+axf0f z6!P46Bgd(g^hzOVEb8>dvYpoaQD+bPI!j~QuCt;|K|p=&yN$g28CKZ`+K6aeh{s_XG4Ke*;3+Sx?kjzSp0BHOBa${MnNYsaE zSI$o`W9oAIndR7R!UG|;exKb~nb z7F|$$+KaR@9i$|Gzl+am30AHx^pb@Wk2%zQ8%tD?4>u~{hpi^%+JP^HMXb4a8BK|v z)gy-UP!2AvZ8>^mJh+>&tUC6WfX(i?xnPBa>-0l%BMyWEE2i7A7#~iVl-DKY<7U)> zGv#*@?Abnfd=C=>sbj+M248ft)Xgfqo9HTKeuzxDlYt$7e=050$w4kQ28`g~ZttX? zHh&HslUw?{sl*nlz>uW3qdA0sCM-ykA)EXHvVg^w_m&yYk@OoL*XH+4APyr|f92n_ z5_xS(YifvKmjqG-EY$ACCTW6fnvhNX^YkJ}25ZAXm6fdYaBeGoE~j(+0LiV~vD_48 zh@L$4#Uh`78o28|Xr$UynJOs@V=;1x&?+A1;#d9S?@1WqtJ^|rGtI|PXo77mld$`) z@j&n?DSP5$cp7a?VzNY!>GdGb$5;>;On2G}o}}9K*m{DSP&u?9S5a!zlg`;l>K*iD zdGjBhl4%`1Sdb_*iqi&nbxPSOkG$*+-ODF>4Y8zuIeL}7%+tT!-TkKUh{$7%pTl@y zvG69_yv)WdQa>Oip}&A#AOHMl?tTETJ^jUu3SarnSAW-wo~xR@>@C#lXb%A)ksjW^ zq{s9uKFnlh5TH`}wAUBud$(xPC>)hyZ+1kE60Cj;Eq72fBW|8o-2Md6wEO9;_kOmk z#F{*RAzHlGPK}6hzM;HuBJV6zv~fr~Ds+x$ql*R3e1T>4S%I^@0`ZG;7tjd2T%5Fg z6`%8)?_?W+O}QUhPyjsDFY`Ix5jJmscbQ66o_>FLPTxh1v+x-6D{d>?E}8)v zD-z_+7yP$#p}w;R=cZ-hktb|QMFG|HCtRa24cDh|rjc-KEss`vRF$*_Y*hc?v?{d* zWan(=esrL6uH{~M$q5Xhzmf1ie45^a`X4|?n!qGJg79$A`HCc_TMi2_q_|~J|=T{>9S+}t^MK$>W9rRhUND9celM zGcoyH&R0SN5S2sM$F+jZ?E$Z!Ol+E##}cwG>2*Q1vjn7emVlHRG5f_eqCkFyx_dlG z$QJ_RjU+knTvsiWwhOmjn)tf);=K10IFhUJLNTT0@}bWc+2@C%%C!>GJV%Fr%BQ$w z(*GZOo1T4}SGbcrGaWTJzu;Y0@NR6uDI_&vr(+^4`*#6~hmfz%3F z^9=ZjD(ga~3(FLL@n-cGEHV;h&suUTS%r4|Mao9?+J$dj9JmXyzy(_R{fiO3Kg^(tkC}cLOSAqJB*3pEUJAa7{ zr`$4biW1Bl#N}JfI;lU}fgG zfpWQgP5cP-*Ih|`hWcz}--N$sHteN6;Mq%sVGn2n?oY005gcMObnm- z>@ag0e2^Z0Se?@j2{qFxi8*Ru%IN&FC(aXE1#;$(lJ%n-1mXAwJXaf@J}$~x*1$9e zV0jO4l&#Ms<~5B<&&-J?$~6!Q{Do3M&?t?b&14@u{TP3_H>Vw2_Y+PpNA>Yh%;tWY z=_lqB?O6Yu{vVq$w$yPmCaC(XpzGc#Tl1*I-rUZAOouhUOogG2UqcH9K74#Fmi9;f zKUq*x>MPoD9~J#oGfI2wuIJupaRVG@fs0*kG{#rYi4W1tlkp!lGJi6Zm+SqWuuH#w zeAjCARR`QL!rgGoE%vCe&pW;TY>!4zZ#`y^UIeZMB`eIlrj4AJ(0-ZVe%=&^n+>Wh zWd?0IX;Ct{-zRokN4~Z`5wDA{ZJ*dN$M8Ot%f)h6BK-@uGj>PMS>8jLSsaUx>#x}v zYC*(Gv^W0pMwdZO0v><5xqTD5Pw3A)>@dKN&;Gq8q(@=~Vj-@GEYw$58;>imj@>xQg5h;GCG~d&Iu3h02=JT zUhWY(QT9Pkc8{KN=3eE5;^azyEd73bcJ2 zk&>9BN<84MZ*QaIFouIr_!Oyt%rX5y=?6+5tJp;q_nJENEDuepNdh$bX0ahLUgcCl z^N56jpHnLe2HJn0xl`G9I?5(N!ID)=Oug5UI^Da5cGMyLXgj6nu9Dn&ifOC!%!O2C z?CkQz$cN^ftAu_xiOh0Hj$mY|PLMemnyS^M@+g zDWIQhTCk6(WsnGPrZ3C7j2BqywI=Ggk~ z?nZjRtOfXv?V7~JL57Q3k(Fvh#qVjjO6+jdhO*o~`N~Uh^XV)02{am?T@Yg5p5-+7 z*CU!!$KtfRTdlwI=KEnQd-oX21CE4HeNtiB9AX7~wb?PWS@SrEF1o75t0g=J1<8?x z@8H(>1p$9MEFG~!)r9O&9P_W*0XY?Cp<2P==H@D?#*06D~+MG)ULm8*~85n=xhafI{-DWG>b!$>(}pi?&BD8Hh+!>K|1^Vde>sT+o(5bw{xe} z&S7=)X6$mvI=&q4QtYnD6D+lNjfV4SPOyJi_ioL3T%Xr~0wI(iu+G$Ab$mUJ(8e%! zBDVZiazw1;;b73u&d%JJBv#HO=jBXhx$g`)b5W?F)T?6`dmY}@rXq0U(VyBcWW-V` zyqDA|zfhSx^tzm<@S5fCJab7i!kju0=vS8G(tiG-EGRE-;qt~UQAarHoj^NW9Xx*v zu=diO0fq(UXn<0&0W87Fz9_G_)Dja-;u{t7I$*0Q2JZlwl-Wq(qMKdSnC4UM$91|d zp$9d$nK>NlrtUOI_0cjEGoOLLv>T8*f<`(DnENAh9OH){0e-~WF+_$~*_sWK_iY3T zV-d{Eax{GDVh7@)c!F!KIk8Re25f&7j&H!@Oul{ONHMci`#){cxAj{)J^wpr&S$S7 z^G2U4TX|d;(RoGNWp|oef0$?Qr-fUFlP35|a?l0pC%(wc$wCG1CYaGliF>cnRfZ(r zEn1|*(}AUb(O?-@ma%6wruQx$l z>Y8Z71!*m1wCzAVQ4q=LKKv$$>j-2v*fHsRXV@yqD);v!^UGiku~Fob!uq6EU6GWMuO=)1FRR_*3-<5nk^Og<+YZGg! z&7_uH>3Nr3X@1Q#6AbQkG{%1iuGYPzz4;^GyPq<4zBB?;tp!*WsI;$tQD|JZ!9||c zkvy|lG@sC9f>EJL@wo=4VWCWC+ERxv!d!aHB`e@T96m*0P>p;f?|v_B1({s?p=AEYura=)e6DkhWGa6Q8Vli?MbL=V z2pmBMdLPXOZ#P1j153gtJBl&}bnXL4_LE090!Iu1rxXS?xQQ}c0allYn{sffb zBjafG)8HWNFhrc=) zu2>*sclZ9P1VV1zxwRsJklUBlRRU&z4wATG9*7Xt7~BIeEQ?k>&hNM!3`O)1WU}{v ziR=GS9S`8T#hIFdALYqS21SsS6LU)6eJFBw)`*L~hY~{#Kij)PxI8Jf!^rFv8ozV) z{_*!{xZ9Ss9%*09Q7zLCiuJx(s?OlbZ(`W&bsZ?UW z2xJLbf=4}#0IGU5qn2a<^^95>r1iXd{$BT{siJDtf|m)^E~DgfN+~1e@HuUe)cfUe ze8baaCF!MsD=Dp9U+ZP0)>@W-a?Qbfks|rw{y{(0kgP1$@`szm!kSrhP0z3hVmzr1tLkbfptAK6{u&a)!m*-dlEgg4&&3I_h4?Jga4WgCUDynuS4W7R-$h_FAD#^)g zZ|~gAE0{zx2+!ZB+?spi`K=p1X!3n#)E$VFO{pjzf$Fwhf2GBDK)DFE zVc4d-7s%t^%Ls>~P7@7+tkc9F<+ruqNfj-Z*&%TPyTuVnn86CVeZS~7s_O4Ge!R5P zI{L|A&h>ij$rl2Ehf3KO)_cxiR={9%4J#GPo0Di8k7y)Hj#E2qQ%i9RPca?NyuB1Hp}Un6X;q zX>$WjF@71;?$m!=6b^A^Wh^$L;|$H%@L4m)vY315bX0LGRit6AbnlWQ7Y?Q=lp5!= zQ89^4rO>#whgIw0wdh8UeQcYsk8fXueX6p7__&`YW%caa^yG2Se=~9c23V(sn3{=J zPZ{bkr?b9iUOC#{AHrHhWsw&n)tl8*ljT7cKlL5`Ji%C|Ne?(P*W}I?oK-S{@4ajA zz?bK0dw@G7eL6z;MN?b_p*$bvQ9ytlj%u%RAExqC?L@#S{K&VGV+rNTah^`?_L~%b zxA$R1Zr68UZ{j1Qe{b-tR97kxv9oKH{zH*aenqzhw{IG?lYyyAORCMxLl8$J@0M(t zE+osm2dQZ8`d7~if)JhwJEOQ4s`$o!!&THuk9vAI2!1`v7%>xf_UGoJQOwpOztw0? z3=8MnR=eVO2PH8y*r1~akqaF1)T%)*1+V0xU}u@)`1{|KMtu-YFbYA*ZEf8pP3xoi z{8x3u`#ae$zsG{tKRK4CH=IoC)6?(I>mN3713>AzdJd_8czZ~1X__zrnYp3SEToKg z&c5E42V4Rm7nhkSVfH7534uJ4$V7Aa95`HA9Wn=?TsIeU|Z=fz&A4`8^Xx6%y&Ya0o=uvM6-74&_Qv{Q_^cggVyK z;4ybT77*lTM>f%n)JM|aZhxTLg%>dX_e#>-zHQ8;(6N@5B7|N4Rd_eGnMV{upz6oy z>4k@EtE4wk65do6WsD>^eD}Tg7-xVyc#yC|jDw(qT=&u7BP-h4=0W=AxR5|bWP25n z=S%K;8L{uOF+HjpCc&B!e{ke!y0J>c$KyqYU6DjLlAiD<+OE}Qqkm#P;w^gd!00_q zu&x7;i?+WF;3Yx3(*s)6SV9&b3&4h!b~eyANERPbYy0(OEF6PHLqMJ4gnYd4-m1vY zOiPBXVHzH`JbIuegM4?s+L{3#mR`)QGUB^I%p?i>(aX{*<3HYc!9ud+qPJy#qV#I%L7l5MrLK>Sp_h(c0%I92WOhM?1B){ru^jbrn#&|XBl*+LXuZ#(mkM73G6dhJ zh5MI4UjiEzUJb!>>(+iGc<%hk1kcO6D-s=k=_QwOUjix%%DT7mLUvh5>*H;gre6YT z0hN~#U;=Uiu5g!yU;;w{mzT+40xbz85xD%(u2!KJm;Yb_77V8p`DV~JN!Rd`AH$a+ zVFDKf{^K_%mpowtKLQ>pmwjOZOh2(cjAY*(APLrEPYJ48kZ1a0x4E|_xoH5 z#xH~5m*%q01;2E^-?`v&uPf_(lXd>KQ@rvk9pKHL1tQ~OPlQ{ION3+Ke0y(M`e@hV zj5|o)G^g2uM`rPXHumk~jBpeKEIh93ryGyo(I#eS;MmT#@BR#?#5im-=D?hYODM zRGB;$8NZ$%>6eUS0w#ZhDb^jTfchM5UKH58r@^8pNvokmZcG{^sSe7SI&R0y~kLHR&qoA(r9m0 z4BPwG>NtzX3k22buRH1b}yFhk>o z2*~YpU-F!{m@g^%RHH6VSVLB~r04zb-W`H%Zo-?R(dNi~w&}~M8SXRb_dopuGjP~X z(Q3Z3tmikDkKTWIe}A*Q#N1#tGBuHPl!f;FHdA~C`3C3ERyG`*+aj^O)OJlp*YQ{9 z^RctFc3OBP9=^WN9!(C8z3J)EhxVPWxq-%wgX?jmHP2^1e*b-kNj>4mwV~o#6%RM| zWe*kdt2Kg-l-A*bM_Qkf_q1}PH$Hu31C>g=R#E5YsmN`)V@axn0b8I}yBUi<#hf(d zUf4^+5xYP#0m)?qvck5C`WUn5k<3TtK70jG!S%WFlg#zM_{aW&$%4 za0c5aaJ70f#G6DJ5a}ocJ^3P+ab^M(2*>r}AsOyn9+!<~0!RoAQL)q_ettfe-DUz- zf8JH!`ZQ|faZX8fx3k=Y64Fe(^nO4>TPz97-(?0<2lw-km~ehvGAt{fi)-PK%FFX! zTp>iO^f+pThFSaLnyQDLIhuq)7Z0_nCoVtfs%u6yRZNtKpyT9@Rl33e zpQqpSEJa`xq6zxagHzUGdL9Z~1@R!le_y`JVY5tco=}F9B=Z7-Te$;swiXk6XwsOk z%oKrX@$g)#t9Yk`7PvD!^1kpPC)AsqPq7?I%ceBD`1{3_Pl*Oe%6Jr1S}@Ql`dN0i zsRcFxVx#ZTx>PZ%dHI{9Nm7nI1shwdcTxzh$46fDpJW}%Ww_E$MPj28+w zamPga#7_y0#vhAD=c+uon?5_le?jAx^J!G#1*qke(!&8fnpvA$^ z`P;U9#r}}n7df$cZWNiX$x$x^874{E{>b?`N+Liov_eFGWaXILoT3bAYN3Qe9e!S8 zA+5$8r`vl{f2<>Kb8IgYaw`yKBk5?kTp`F7NS&@;(W`0{#J)+Oz9U>pf6}`V27=T~ zkdpN*{m7QE?SZ-!$b6wQ%4sY8u^Sn9e?g%**VxWS-%;M!dl{|~BI5=OTb_>)j5-q9h5BCo~dhe0R?ox<1 z$hV&rC6$Qci;F8Bd*I~A>}r*Qiqj}hSJ}oY&Jl6f&F}n}?0t@&748SCNj`^w=Ddtn z|0t9EaDUHUljeYef6y?!$}gJPifr_N?X{%#NFt?INA%t^2b#d8bGuSTpyfLtF(U$+ zLO%u4@|}QBZy4pog|R8JLum&$cSA$)E5tASJuU=fj*&2lz+2RyNvLn~SM0LntadVA zKDajX<%2)Sd?Ahf@8h;ym-YRx<&rFP*ys9B(ezV9**WZ{oY!jJ#wjI-gnV--Wtik6{sq;spPHro6?JOoP>26H%fXK zLt0U1#JbYnW0QS)3RVksStq~Wy&tVQc2oX{;zyFV!TP}CcQp6M45V9ZsCgtu?!vou zMnK34&^hCje=)$Y;HFP)UpJg{dOo)_Pt)Lw<+P=`Kk1H3>P1DAK3~(%$&<9$VCBj>C8mq@LlkSv>HP!z6=Rmb;IyR2E(8dh~6#;ntz4>_$I} z?0g9pnT!cTv@v!f_pOwCfd%|AT%KIU9*a0rP9& z4Kli`VAK66jJfkA7<1rqW{kPA(fHoqXpFH#Q*GCyO>p;Q;7*9|k}?r@SnO3V&iKq- zu;Hu~e`knHi&oh#NU1oBJ3V@*;_j4KXN1o68{uuHC0vQpH&UY0HbhYkC=Ljtdqfk_ z>eu03=2J<%9=d#qIpzCbvZboZ60%X_(i8d4{qx%FtIil_eYeT2vK47O=!|Q?%ZMj@ zAoecVheem7UCTJzHU8@vW4Ua(pIO(IKI)ZNfAhx#iobLo6ZXD%`>Si86!x-{!eBXp zi2uWxVoAXb*;d9w{kP9+dO4HqW|HY6Fb`=B(0zFOUv}vDv-Mfr*=@w56OzMUCsUQL z1ujVT43e}3{*7u?x(^|L(a}PIq#=qIwJ4|kt4KUC>cWnl&C)xRauv*;sgo9>r^nTe9$_yU`b|BQBg(PYK?@>%6F3|+)bLwqst0@y0{B8 ze3BjwNxjNaa)y1{BskJ~goEPqTNA$WmoXoxll{;l3EFwa{{D|nX}+5*O(xXbxs zZgU00BPB%@{>jQ-ee~n2U!)b=&%gA(f8&3C4e{r`)VaOCbF!+P==RGf+RfF-;W~1> zti9v`u-kHseDFa6aj!XediF3`p8@t`>wo&ao<=KWvHK{O_8z66*HHZjZfYw0*+Ss2 z(;3@+EU$I~DVG{m9@o>E+g`XFd}0UgQGVjy-tcB!ZWk}D({Fb!d0VYCz9#dJebmT!Y(>#2-(c@9e3qTz`9xlVtWv*=f^piU)bS_-%mT2 z0N1{&cNa%=-R9uu5I2(?>!5)#SDttAJ!oe??!}43lr_F=%+d)UNe>cl-9iKMe zW00fUEZov83zUrg%DUoUKy0qcr z-PK1Y1Jy(3C4WbBGKfj$y>}jc7Ne8tZ%MVX6GIBur`l9VFS(jktXt9fHGhKWbF^?U z$b%xwDL!ZsFJeJ-X9u-rf7Y$>mHB#Ajb7iRr5ATvY|N69qd)%6{gpPgwH(pU{EM5s zsu*H{C4p@$vavbO6>l+q*Fnr{LWpsmu3mnw z5s^GZpBvOUK{y(AoppmBGF+1;^n@umw5kp7I|Qv7w-l9X;c*%RQ^o%lS`nxR#Q^@ULB*#0?@vxB|<3= zB&KnhRz~q_c1eBm)X`9%#lA>m;eUlFw%3}M!Z{}K4v>VY@HA~;CZEH;~^y+%&{hOz%d>ij%3V&|ATX{14 z?BDIl@P^Tf#l$Ps5N0@ERG_b#_n>pc-|rL@b9}tPziNk2!M-w3wj)=fHG#_`PC?Y{ zj_1!1PVb}RgLvWk5$(9at1=k|kkemTxs4H{ZpFB(C;M09vl5?{D5YHDKMavhmj4CJ z%3S`;x2#Ve&uYv1tlJGmV}HV|e#0&6`W8!$c&S*K1;z+m!kTPK2GwXqV-oMN&`GoQ zMQE%=C=aW|+0}0j-cE2+BhT;#m9uPL6pf9F3j)_sT)S#+N3H%D3R}VtFIVh*R zU6qa-W^*rnw^doWKVHW&_={9pz_T7gd@dT(RVC#ZRs|SkPgFCDYNX0q-8-#o4Z(1B zYxLTiy2`fNJh;r1f{6jmzO+#;6}@N6(=q`w7{Utfx8YT6xBerifw;MoiW7e1WeL)m znugVrm&0@dH55D`9_|AVN&h^m@!o-6p-&txd{mbVbpjd!k877GbpmE1gZ^AhB)%~5 zJ3O21sdt$rS?WGrTQ}yicywM01|IF2+nKwUv2_9=5h6@$3T$W0+pc$4X2gJQJ+_zQ zbpk1W+arsz%??>q0iXhknml+Tv>}otco6}>O&-un7W%3k1A-1x)`5iQDOZ53)`A*KP_hHV&5Pp$wt8Nzw8{T7WckIyk2}eK zD(!OMt9ETTe^1FrX~h8;%sKffX#U&%3!qedkA$Q{FGZ1H$T%&FOOr65aZ(oHrAqb- zgiJ~%)QJZRc0tqm;=nb5ZTnA%1I0r%O9cI6mXO({vcaty%hi$L!?SYa9^hg=3Qr|= z+=3(T5no1#RUKBIHSQjdPCvyv!At*tqjJbb5u*9pLH-eGpy~MWY7zjTBWK=bCJ1mA zjYl%aV+EaG-6dt+$n62-gLXT?u|XM|6Ye*jjSZFAATyk6lA_Y39|5Z@`|6w}>#b!h zYh0s9vBPWV&t@*b++3ZR0Q2$kj25Q#t}S`#JQ{@k^_1hV{LpNBCk^ovSRHAX2zUZ6 z0pXW7cmf^)e3w>u0%#$3l#A6xV&X(%lyMSX9&ax$D!JBg(}mYcd3TpEc>*ner()7kc;Pp}pJP*l^i#>I5en5rnzGya8RVR?+O1=r|k0=yj#Aw45 zV$CE1NJ^`zsL)2SRi;eI@qab`)pd30L5>u+CirO-rFlwqAO=rb(rh5t|1imaUYP;O z7OvcbVgsfk*tenBeMhlZZlc(mJA)e0zBA3R@i^n|4p)+|O;v_}iX!pT`O$9mz+(X!_{84Dl}LJYnZCn{5rDx$yofHr z@qH9O)qOqBE)fcLV zJI-F6FpF|2)g?^VtI})XvaZ2gtu#G#T)JXd>=Ajbl+^#Y9I&5{#%+M@wdlm$8n7sv zi_`Q2fL=RfpF^L6?*-ytfu+{<-=i8!f$CZShp7p`v8WtyqmyhHvbQ+XEHGpC4n20c z$iR2_ge8N&zoYU=clx}4U2K`DxAoX08~E@hVdKb8f68#qD+c7x%4rbY0HiPsFA8Q{ z7a+$B1LcU<3{auSDM!hzcAOi=#~uEsw1efcNL-$CA8oK|0Lq^d&nfQhnvZI;LT-P= z+`gKZcERn3ux8g!xOh(sbK}Tfc)sA1?VEC1!A>!L{K5xwqs38wmmSL&g??Nz_YkAo zDrr}WaGG;cob4LtfeQS2y7C8zWOnVRUXD#ql|vx#7yI;n0#(thgczZC;4CL9R6ivD zpvsEG8YG7K;ON>yV3_z#ek#rEaa>Td!Y(35Fnc!{P(^~D|GCw*dw93y)!#eev_^U@ ztzPq1lj}dEfLq*uLIL-tXzvaazG0&1FX~T`OKThV-FVPco^#<_s(k<(=>nesv6P%n z+o`V)4UaR_7f{#b^155;B6(m&~uU^L=2K0)7HMf8%}UXx7Eq*+~u6^w`Dd zg4Iw$bi$bC+^8Y3o}9)@c9r|M3nt06+@JS_lTa~J6+kOi=<8CT7^B@VbyAP3MLJ*z zu$ebaneEdpA}qT(nB(0}^6#uo;%^zrs47pm*4qVx%AxRnEJLr8(AHOR0A!VzApl;w z$u8kS05%&Qe{KY1qp0`sZ=Mu!I?P;jlgjgIJTql_kARt8uJ<(uD_aR^1-eBJmKFJx z;r^#A;iz(jRPOR-5I38U>QNQOX6I9 ztOsrf-fB)!+qLsvFeOEw%t{Rp$eVYI9~TAO(QoI*a>{B|xlrjOW6Am){XR3xh`+#y zK}Xx5fD1`is{&9qcE9fHeX+;qya?G6W zM{P*DHU(?Fbq>f7YtByPdyscmary}4pq~pt06tlr7VaNMTfCejm_C9=K`5f~a*E1R zfnr$(IX*N%#N%x>YX?GM#neHv$rEEatq5i=VnXCI~h6LL8>A4 zV+tX6dc6<((`r_-hPt0M)crk_`P2Ay4J5+@OJD`rpxlGP#Sj(i6m4ZL3tF+Y4WAY2 zA>u&fNLeJWoT(^hT1<*H?0Y=t%4w~Tu_Y>+#hBQ#4-zcPk&>7gkS=(C5HO8whPaHS zf7AfHA8Jb_wfr)NAw-ZHH;ue<3FmyG-s2BKp|pQ^3jky?6DjrLCWg=f3m})19YQwFIJ7A2l~wkbCP!UqD;yB-{ zibcM5YConv%;bM+64_Kc1m`z#)2nf&!G?#qt1NhPnjJ?RJG^*=1P*%dk4}c)UkqOz zof6=J9$T6MPJJ2NZF%)u0Pr&)NGKW$7B@IgpB7@@>`%o2xsW`@r}4FOeZz2sy*+w;P0QLre z-3IHGDgA2i*3-z8c#cNEf1Gl_>luC0#gy^7x4PZsWg z$p2RS&GLwLcC#NMmCS$iM4+3{ZgMnt@#=3bkJzbQoEEGL<1 zmVT3@Y6>qh<*Ca|OAf`gs@l!wEdK`CV%~&QrF&L}GP^oOa_@UF z_d^)}k+ad6(%3z05M}4A-n@|RQsBpSYr!{Dnic}{-aA*UCME|L|F$#G{_T$;dMj}; z^27CCrf_Le*ra1MrORTj7F+d2yWXX|P0tP%2W)tlh`~6rLu&zB-}R8+o-F z+T|HvC&_MqEi@;33Iv-A_xxl5ri_xHv&%wn$j3B_9Xsc=@=&rb?xG6mrTYD840i0af6ZF}DOSAqtW!KIJKCWXY_55?mkD<>S<2od2vf2uKj)S9x|Kt<%sEBq z%k?%ML8uA9db5VahPZZw!?j{wvR-XYe4F|=z=5-%Y*>GA3%rWr4QGhnQa!#rnn!L5kTCfAhAp(3<=mCZWHy0Uk_tI-(;BHpiS-@5jB6K??0fh{#t6I>E>42=rvVzNo(OARj@q9%NDXpwg6{TGUsw@ z%I~8I&{b7_n7KX6)%Bomv;0lfZ8o>IS#liRe}9kqdtj&a#=tE#YmjofT8$Dm=+vlZ z2X}y@Cj_5+K>;WCKG-R@|M@}NZJGUpqidfP;6bT_xw{yA2D*Bie=P?3W(49)ls6UR z+`NA^#QV2{_=h%#!zY6#koO0rS5#wB0yp_Jmzzwl)lC23W6!w^+_(MN!{vwe-CR7H ze_;j87Z2>lsWV!mv8*=+HtI7^oc(nPYxVMAuHDiGenuK*M6!F|Y?!q+r+QrBE>NDBO}n%h!Zr0?k3p%9%a>e;0vLb2NXxdJqtsA*5I4rpNaB6FzDtfO zPXGq0ma(fJI!rmVZ~28aqdjrI+SiuOuUBfj+TPyX6_vI}I(&*tI#|($oGYxd zHCZq2(bCq=oc{a?ZfQuUxmbEl^AYdmN+{`!Uv$U@-2MFtOtD)8C{+9;GnvH3qz}Ed zJ#J=%`xTtpgSH2MLi)a0KM=u&*e*A6E zQ8&A*Gur!YG3fe;yn}cR*yG0C`;{=y$(y76#$##CVsV>2oI8~Gu)@5D74{&%kRTS+ zf099Tnxh{*5JP{jST~Tp2ibEoe7*Pb;&@XoQWT30WKUq+)A(VG#PQ-@aafn6i2^YK z9{ZQqi2@#f?~kbyNgj;Hlzf8v!a{!RFt>tlVGspBpjyz89>_G6g#;X0!Qll18U*se zG@FfjC||*iNH-9FXJe}y2?4^LDpnX~R=_afx~qGKr6VKwj6m!;Hm`E_VQJ`h<*=p-=aA`yW69~ptC1+qUi?B?tPr_QbX#&VIv@j(#hJM`xz(OM z#sRIRc=`6~)OvKq1|rmd9nOP~&nEkuzvC-u1y5D%ivr*1+OPSdvL9@#*;M^OH_|Sq zOxvn|W7qmaP0(p#XvsZ`_OBBYJc6d=(LYo<1m^}a6S&wLMxgYtw|(QncMS_I=iFm_iZnM-?5Z$DKrWF z&@qdo2mrHOPe2!B*WrQ=Lzsx+!Ji%^v8L>Qp{kf&zmC#hgXjciF48kZ!7W;?nE&DY zylm9N<^BQ;Q>c;FbCx#qz@F+xFWexfkAIFXW#grFl=*Y1F+oe((&0F0a!vw-1jRM) zFy_3s5j!uwa=`CK)N4=}G&!a;b|z^i{^8KvpomP+yxy06?jo~39j60@B+6JiB}6uV z&OeLFZPVxdcvht3$qDN=q5(cAn_rRP{~BZ86(EMcYKYj{713^^+d-tI(`=f-r>TnE zez$K{Wy3o*GqdEK8LN&n+l^&9Ir4VIl#GU+!!5y9Q^T~}obQk16tWwB4YLElpxJ?? zvGd|V zzFyyXWen5y#rW*w2xq;c({J4EJMup>(Q)2fu{S%zWqR@M*gYB(zAW5w_T=+(vxbO84d*2_YF%Lm`e z3opc4#UQ*&kDyn&3z22=rx0q;5XtvxYE|c#!{DAYU58UH&poet1EoMQdz8UC;V6sO<)-$KFAZ zAtHWx79%;yuP97p_04o)%INKNsfx#d4@|1VJJ}1x^Y!;UIeRtwc(k{Fb@6w8fh{+E z%Y)$LbF~svtA@L4GoD-?6YY;^$d`F8znt$cAjdh9qhyuKkFU1ulTN7E45=8YQL4bi zJhppAVjs;DlPKKkVxI1p`4+K6*&0@=g(ZQ?Cq$ik;Zo>5DE3g3qE}05b1sA!FJF~{ zs`y0vL_awNSrjDGO)TJl3oWjx$fX&^B!UIXw*8CT@E4o$Y0Tdl8KSh6Bh?yPjo+$- zIPNesS9(vJ_`(vPCgL|Hc+*1$->}+**W@)mE^{a+m4=16wn3(WQ*-)98!XFV|!F z7ZxSoyPF|VP2Pt;t5!gWX&$o^J*$K<4Y z#4A`hbipm2(4_yk9I_F6d5(|1Bp?+<>@092HNpJ}|#^Rt9u1y*%2SeSlbZz+vrEMF@xix6J zcdWv!5I^A2YzwOu$pHhBAg_i^6TsJ_4IW=vNS=0o*7Du5T(a6$-%7Y1a-VSJG%^G@xM@^H0p6w2~3CmFV#7%j|OCK zS1H`dY1dn8W&`wIBJYYQ^ty9KCfRDiIh8fh3{YI(6R;dIfd)^5jW)zKs@i2*PGFsn znA)3vm!_CXW8WK;Z8>CAQBD}eTy*(tvUdd854vQPF%6g4D$=tFiD&E_0l=Z^KG4j; zCugiWc4tJ=Nfpmu+1LE5Y!-U0VJ1@A8<%9++VSvC_UX7Kkl2XVB0VnZsHkQ@!8}EJ z{Nyn$MLc--y9dQQ7Ga{uLZo`jTivb?b)1EN`O8i!SboJ7ya!26YO&})#DCtr-F^+8 zW9K)8#ST#X{>A(6i|^6um)kOLU3v{DQSqOgh4f(hNHm^O3w_;1$!5)-^lq26Iy%#D z=;_MlO4-wmm)28FhJ^}P&Q{hun~cyyiq!>^wsdXzUb7V&Z1XOCI%HEGSp(Fz27n2F zVl5Qp_8?V61UX4pH1$t>Py;CtV(LMfSRVCyMpQ2Kh7EXG#-NFLt@!>s!ueJ+4(=p~Sd0Kg+6Kt> zq6h3;A0=})rUOeTuhVW&vIP9e+|4~pZ(^ms6?ZX7c=ihyG_XQ^AGt=8F3ax|}P~IL=dwU3*DkF^#dDZ4xBSt~Y=QbXkdLM#+Q?AFf z*I7B!E5+FGU~VzF->PGb)qipB(*f@8lwRxq$u zO$Nb%H=;pwUmBlHhP&sxOQvh}7Kb#)SJvYs%|mz%VB0S}!_)-(q%nakgff}f>`n;v zUV=e5{?d^o0Yk&xtG28{FDngy-wc|=F$G9|@pH%zKk@DvO?<|nEIU;LK!M88cEe^_ zRUX^6_rlj2C-rjwr#+J42lf<_nj zoO}tUy%0mk5MMB+!x!?bK&g|IXdhbElKjs>K8CBTlf23(efyA;!|+>wo=;-B=4|@O zwK%Ovf2JvXk)ec~YH2ZP4))o$C1tE{jnAnT;2}&LGBL`j4OJLkeiy2`bE> z-Rds!lX`5%u&Wosmq+GKv4Ta&{#uBukSsn*Is>hozAIK7WY}#L+-`m6QloV-+SuSK z$oOiHF(q>jqE$gEnIN@)ELVckYy*``!#78Al>Wj@Jxq#nhVX@PBm9zySW)VM=3SUW zE@W@t;X2$c^x{&*B;A0#AqEGJNos&Vt%4*h78tcCvzZT* zlqs?2}09&Mg?pNy;!t0?l3Syl^ zw_S9KYQO#w&8n#bhbU|cQDw0QG43%MF3q(GcSSL}0{mV@XX81Cy}<8yheuz&+1Yl? zj!7#a`h``h3 z<1yzs*(wFOzxVHd!zCYuWU&}el{h3*jH2;EQSfnDOhd5iaLMR^^CFNSyOoqBS}O47 z{K%Z*8x*6Eujns5MY$HJWN?%dlqm|J*3C?(*+2Y=ye4~k$b{iGg3g`3<9H>p^kV?n zZl*WZCQYA5(VypXcN{wD?S_uOL=ivmx9Sxdr_^`4f4^CO=LdC=OFs9U3^bZ|izeJ0 zrRKs$y(Y?jsLkV1++9lDcelnR6xt078ZX-ryD^Lbfe2RdVy`W}=S7x*#>}2}$7rzlSD#7K|zc2DjagH(LzF~Ia zikd-D>mf3KN5A<6y?83ha~f_*vxbmlxZ|HBIBTwPA#`W?Y3rQf#%KgP4j}4-%|A3( zlCeU!O9dWqZeNNcXSWZK}`4S2X)hk1eU2RPp zr-+ivk0PG|$$yd5r%*|xJ83)HtMSJ&0<_CZEF5zA#|qL;E}Ln#bVK&%t*!@O82I}j z0Alt#Qix?U-n1#tw7dXK7+7F6LHYe29FfC{q-Nc3y*X z9SQ`3e5}x_ZimMTmj;httLzJJO)@(ti}w?MQjym?(@4>MYY^(ivxCL*|O8xzburw=gUb58G$Xp`2P6Ig2wq3Wm$4J08L_xY)97X zcKCkq;pn*JN3aSXP0ZehA_P)QD&hq8jTc~i2TVBD)?YhV^^j-K5hCoMx18$bfld#k z8^%`bsB*e*y$3!TG(SWT5n3reK3|Uq?xhM@e?}xf?dg8+QNMyf;8g-So?3PB&==6& zkQxTs$7D3q$diKNP((HX*0^qsJ2akuCBTxjT9-M%hHu zYeu^v)F481l}fg|lSrjuE^}#rN!(;_=^14ceMYU}bt2T9cooIDl07Q{PZ1UX4o0y^ ze`RdIga{tBLa$78BduXi$6@YeU}RkBPsc`LX*4b%f>NVrO6&=Z5{FrNFUrg=41&$A z<^Hhu1bx9+Nau@G!7zm1#}>9waViE~fYvKoa=`?I15)@)+(qL1vb?WOq2wpN7Q9C{ z9I@-ee|43KL8Ao_kp@x^1F6vzK9eyie?CH000f`(#q^|0=jC<(xX)6Uu#%ckc_+VC z#{~t=2|x}`78!K7<4F$@LTB9EpX~0I^W94U44{ZpYsf3u(V?b-M8tF)u1?4@#F|Ao zkfxjNBB=NhKdNa~s;gw+iI8m2UTe2Ex%6Y;DO5Y*X{KFqu|u=VRyztD$#F{lf0Vv; zwVX1C18xqq^-~9hVXVRM4AtjhIjS1U*jRU5Uz8+_fTdtz4kp*LrzPpu6Eju9K zxjN-zxCTze|3h@jlNL#QW$jFvM0evwSSj--CtmuQbx#h(kD|Jm!c!&Iqn72BKx5oT zlNI^N3HZqwsflktH~R-E5Z$zmf4bj_VslTs`0t{|x1YBk$2=t9GKcQSk6d;ObWQ!L z>Dp8dLzmhC2faQl-1A(sJI5!3kPn0l2y8I@rPuh7vcU4zVe&we+R^LlYX0~P#pI$r z9V`D_J;E7jJQ($7fOUt`KiqgchngEt=i;dxQq&Jp%H|HlH@P!fg2=Ttf0#yf&F(Ed zZfiL4j)qlr-CM#XlM_nND>qzdIE|vD9v9^(uvw}egFG9LD|v5+Ij-zdywaC9T4-~w zQx5gt_fM!Z=EM!Dy-x|@#f8&>w?(^#r5{~c2HR-!=*P!!W?DOEF%yi8z7`* z7kNS)dy-)YvIk9MiPR~MfBdw+f9@L_I;52(mSFAMenZV#73hu?MZ@Q{3*(HrUT}}K zWbZDf5Irb?o}KE?2RR%{Q_X6~z#kCke1K3cAz-s-E%2lcRhexss5lfq!(DmdG@(|T z-*W_8DLw468pXJ3ItthD00*ttoK=kadNfN*bKU?qiDtfL=#U~`e=@k6v*%27XezX6 zT_`ZmX1Q4KYy?H6M<>2%)0U0b_dT{tAT{uGTWiGbSF8~y)7JC$HwebZZRARj)GlVCqAE~2s2qScg9LVU}0Cc zKz_mV`)iD8%t!nse_*;YiqvOE>8|4Mrr>tsIGVoB4-`eY85whixG2BErEmfrl|W|4 z1U+Bbph8A%B&OnfvcW&t9om&Z>?Xk0yVPF6ONT~z4xJqd`|4V=T$l+s`NJzsCJ%iJ zkJ3s@2L6(7n8_JJP#U((*E z7K|T(nlXMY_Za>ALHL95RRw|*p7Q8B8spEsF0f?p1*w*{X=!&^v_A(>`^x9;H5B6e z*7V+*-MuW8fVK~7&K!}W`Yy0C%J9!#Q}U5Lkb_V+ArOrzWzhjwr)L6gmjfaH=Swo5i+KBjk|vc*vLnB9Wq ziHIV~s1gfdkxH0Q+XhHqrW}%Eh58>e2g_;r1RXRqe}-$dLst@KcTMO*H!13TiH0oI z3(1F@qm48qDj)LkT)~(~wt4-HhKBWdKnK_+88K%Z8vlZKRq}4Ve0=C zp6$jyflg`sv%=Ll&98*vaa5-1+v#l3UGWe9_ySrnkgf3zQ)_a}^yr9^r(h%XL|RaC zO`8xQf2A>y)rO%K^lQ7`cEDy*T-;>gS7h^A5A;W~mtnb%7K@Pp+;9~y7mNF0?36AG zYkdw-HVJs;5$cg15c1oN8aviuK-_!}nQe0Wif^fo8~Z+J@a^06p~1&*wo6@d$m(8! z^J~)hI>+{dkr+~c-|pqk_V#c5g*$iYx({uye@t<>`3Bd;p5N!R?{C_#n)y4}NneGm z{K0`p9m@=aI)#-CM6d&$CCpE}+p{O{dkeo~Bk4mX|Q?{M71{ ze=&VgG%t09M;h#E0`%bcH7Cy3m~C`+f$v`N`pUX0uJyRsDSjw6=H3-=@Gp$I6t9cz z;+D{w)$Z{5%B+m2Z`$oYdK&NEzT@XtxNPfq|bkNy$Rb` zuLpAs@xSy&=hOm`lzAxe=5#HQh7!s*THadjIonamj&|{O{r&fw?@-+LOOUQ0RTAK@ zbgwMW)p_{QhdmJDX{&5|Q)QVhH!hVK-&F2LbsE#sO!@mhR%0{|VjWetU&i}ye|^|_ zxxVxL+aV#MWcqa}0OZB%w?Die%q4Ibg;}`T`#z)ukeRg9r4f^aA83Ec@;ojrofoph z6z;_X{#Ct9-{9J$b~Z{Ce^BN3#}p!WzdIw-=8vDw$nAFU61`bbmMweug}5=O`wf~t z+GWVc7}h)c?t|AWTV;55>zmNlf0jPHL#N~x6PmH}`|{@X`fDcVqONc@t1yz!oLv&m z(-Ma%a0nS8c&5#AOey2jd^*2Nt5qc4kJMpku1XKm<7%a@$Y%Nq6Z_a(Ee|q6#I|HX z$ky=km%shBR(-$ydTaRR`S2ykl&Z*00TWsY7ew##hxWBHkrygo-`=lce~9+gbo~e1 z#{J>t`{C<1LsAuMm&8cY9t}e_J{qGXw7e8(6&n(zX87)}eP&QAq&!Lo?^2KdP`UvD zttbc)Y09M?3Q#gT8eM7cCmHDnYpntFW8?N-f-uSuRnB10f%qx19JZO z(c2%VIP`fmaa1w6>2FuPe~BenNU_6`3V1RM=nW}Xm0*o5kE}dZQOXq)fW+RuDBVee z+=_9VhFEu(a(@OV7kj+Pz2@S07U;RFi4syw7-EeJB2L|3-`aXd>+^nM`Uw*nDD17Q zWgb~nO|S@hb~;on=d~aC0GrB8!&f8(oi%_Gd`vPt`;;~Y@K_8{e^q2n=zs7tW{9Q7 zkfENW%hEKCRAEwkIG*=ujrMY!H$$@mGsJ2;eE#N#*IRU#BqBqlYs<=Iuj~6d;}?1T`O` zrws93b0CH!=cVw+-Y?6`Xkg?7Nk^fSLqiG5)ZE2E0F!8@2Vxk5a9{h;d7NWkIeLNe z4lLQP8Ak;lA~}}ZdzPSrNPNd8Ios!{ROC0J3Fc8lZ3hg*ndTwTq(uL1gzLvx z29yaiR1gS8AD0{qv_~)6H|Zg9+@>=ksqp>GchL9uv*d1@T%k_3b-l;N_3gjNztXO_ ziXi%VfBwZY$D@e?&>HVhL*2_S>}(K!etpafzD*W-`()_wPNSHGUeK$3CwxMg0i z)z#JA)z!7w^uSKz?$h-B@ae-2UvD@87x*TT}as_QS74x*WdwK}== z?tvU({mcido$C%%&db4U%f2&Z%dP|x-<;4ahc6jI5u2VHaU?jBV$Du7*4%X5cWUFV zVU|G=PhmCMB=3oG|ng}LJ!7d{W_g=IPQj|71VSRK0FU)Y+jaX^r?v$y?-ny zf4LL#dy~)73H$&)!&zp^0arqNicRI)nP>J@XlKMUx84?^gelu1ufQ$a9JPA}^XBgx zhsS$>svYmLNf_KrkCt%m6{MbfsTli;E%RTv*RS>tJq)4P-x&M{GN8dXkEiVXnllI-Emx$ zDa=%jq>6GLL8Q|m9cv`fTp(TQe|-^0cxz{OA18O-DJv5vUT_rQp`nq+)47Rc?K?Vs z3K$p~*diEe0Pj!a35|Xt&YvTxepM^xxpZRsRE83&Mx>#KE;xA@kh9S~KRI=|YYuCX zfUZ$Ex>Hwli=`WVORsO=OE||mniN8Mt1QZgtP{^4b?o$?nS6QH;f8=ryOct=! zu3<7*9j#TUiQ_A(q_0{P1++68w@yG!Zdn-cc-#Mb67b8@i%um5klwoB7gI!v?~;E@ znlBy32|I@rQ$W5s3!No!paYXBy^i^*B#B5jX}aPo8iTKAM;U`QX-Kc%9}I`1&B4yr zz}m4g`*wInu_rqrYkK@qe<>;M80N*Aog@gB6LiexY}~jYMd0imDLco}uItU@6}m@R zsPsUOo3%9;P?q7szeVoj;LE)MPz<1xhcgmBzA%*swx%jBaXoG=U!jAD+{xrO5+ zP}*_21-75Z<;~k%fQ5p}mtaf2HPxO`rU1+CXYiZQ$NGY(>V0tP2qemk;g#puFuXK* zqi(tDu2pn2>!Z7 zn>W5Sb|69?eb1RaY?CD#N3!U+l}l=R!UoVz`lc>!2&a&1gj}$SSBm%PJQ%UkP=F^% zHcF?ah#3n-5QwB@MI%PYX8WNcZp5O)3*jfnI1yn)el#fxwo9Dd6{2Z?Z9cFfI=WLR zL9>(M0$$;-3p45>qkkA>#wl*c+|+j&UmdnHPWvMhcrT+x>Feb6Dx6#ux6uX*w@W!HpX4*Yv-0 zMCJpu7%VCJOlJw_JAB+4mENNq)EV;Qljmt|?e-708=iD5V}Gu{NW`z`>M<=XwovdG ztqVa$-c7O0tS+<(01L$%>N2I(g|AVBNp4amJQS4EAklHcaBlLw)LPpi;h>-n$+ry`yk zh$VtiKtgoLk;~t0VUwMweKz9TuejLNyo;;%pf?#7d>E{f;uPpKav znP7BOFFwB1`633TSEnGi7#?5D6xxv!yn;jL*en3|$l55on^b%lo;@P#I&)0zLHmVt zAdc_jGKLVGt5%mkCNL9PeSWpN`~xYpt$-}e>xGliuC$rbJ-iMjcQ2q9Rr$$eR~4vX zdJm~o!++D5at@26r$bY&^1>zdy{qvMj{0uiybsEscSB9I`iRVLzoRRE4#IaqX#NVn zqOyoN>Xb5;vtxrfgAbW9zJ;;XyVp2NL<^s*PsrcUC+UYQ>5H-Dk~O`KEA3}k%CkyY zOg^IMDnZw6M%3FOV$pz!lMqdM1i2rs+S7Hcet)*lKYg9mLFD0LxsV7#N4+!<9-x=RDyJAfyt@cVx+v$!&iU_J>a@`Z-A>j|#+q-n zihl>7F!jk|QDN!naFGeoQNPlaHFbq^M>?mt!{QNYe?;|abiB#9rWaJd40B0U;F-*# ziO*YbP?jruVi&^%)smhZFpElqG@EE(*9bZIr_4vNWn*X_+CG>8bQ+?*2wMiVly%BM zr+6j<3dXu&-r-6Y+dNbK^7QQLBv^Y)w0}Cg>GZj!it}mt#h!1ZG1)&4FOSeAtNnZb z3_Km^hf99;X^Obnw=`+?h1^UXhBT=~_g>}p3m2pXEqHMtc0Vree*4uu_ueUQ@A}ol zW$!AfuTzsa<;-BlCq;Dgaj=&0)LC+zW_RB7r%e`C{n2(`$D^&`=HN2{NE=jlwtogK zN|}r)oB$V&U=EM!%F98a+D6abN?7sP?l!jY6ymQv%l`h z9?sq7_Je)PL|?DF)j*CZcN$7H`x}k)vE=l(lKq>$mE8RS>QC?lC>1f)zz5&1!q{K) zQqq5F-{6&`zlq@w$-5EMh`r?m!GG6VJ)ZPEyusT^%a%8y;q|1GZQ>{yfFDNJOC;W; zFb!=eDCqRK@`9-J8r;gsk#71O3tE=qlu}Q*c1e*chmnfWDL_c`lx$-;T0#`E9TWMC zWJ^2&L4vJb^mw1w3t^ZkQy0LP-X+Y`C*Gb}kvJ|r;-wcTy}domk7si7aDQ&2!Oue# zYR4c|b4>2)*%iTKr&sz~apk;@n^(O3EFkPZP6EMwh`s#y6tKq{+u&|o9@;x~*DC>~ zfNW?`9|s#~8IIo|+@=Blr_!IT!fuPsPgq81z|n6WdVzCzJE0vWdV!rRh679H~~K=`t-XwYz)s`Mhy}+V+sDPo#8=m zd%N=QROr7I-0kD3hn9llcB#Fw=J!joUXBbr9tpR9K0Az_l|0La>VDi%HF&Ufd?*Lm zRVB$v)$+jZ%lnL)Tk0^^Wp(t^HiK z{+ez>BMrv-VBouczY3LqXfkdSy1x3?cHQxbu}2sVKKLd$&lilTN8kA>hI%=GBlbb| z$ox;pY*XP_O_n^L=UXfFee#y)JIb$LkR7fQgC6UVi1O#wOQ}21*HJ3m%m!ju8;D`R z!Ny@&`)h}RXcpZLK7X4U;z#pQ>%r2JFFr&@JNu3b|U012cW zfXwzD&c%QCPKN$11Mm~V0WA*-D;=ygL9V(n@Xwf7@#1LD9?qXRKa8Ugfp0G@b<_M1 zBg3`>A)`zs#Dd4T$>P@$pP0$zn=9PNgYjb}nmq;8Ji^9*cYkO5OAe%aN-@7?5~M5W zo_jp#D~VA;2cU#Q4|5$H@}e``qz)`I?+WCoNoJ?g{3$KWv2fjy3O475xFT1kU&4Pg zZ%^nvb$NUo0ZHLZ0)@OU=>l(Bmh$RUB2VOoW&(|e0NC9^II(@a(t`Z)que*iA_H67wN3P@iTuE$?K8dbSpnTxIWBm}Z>m#|c2m)XH|Ek`fsWrPnx@x$w_VF?LcXOWgOf^@(GCwcK@2UY9CBMhzXZmwgMb~ zO`17gI~X(A1KNEs;NIS-hr>EI7|v}D-$kNC`4`eh@0_PQ8Is%KRgNc-x$PMe-ruKz zpiJ^`{lj2oT6ya<<>D!qZeYRDi|?4@$7I{G^m@5jLD=>OVAkM~E3Y&G>dgTYiZA%H z<1S<0fxk|J%RoyO^diBl7sv)-#6dcL1WW;0z?V=a#5caEgIH`g4`p%XYQ8Z5h`C|f zYu#qhNj{--d+#rLb+tKf7uWQISf>8=hI{_<_bhdD)4AhppLk_X0fg}!e=8k;a+gCp(!*65|xmuF+M4!fJg=3y;J?YWzR0Dk!UMzcyZX!=q!9{r$k@F)RbD) zXpHbNNCnN+#)%_S%RYM+e~?LkTDy^q&|rUP8;OSaOXg18ABgLv@J^;)QSgxN-Gxkf zULG*KN+5#PMMBW3Joa}DrEtQ@ANe3wF2@>xQpeM)dSO3V^2mEI(TRubhrB(jdSphE zKt`J1SbI5FFKJ|m#Hj#kkoeyr;hFhLfr)CWDYgAQFQurwmpRWGdvV!+*j_Ivg_AU8 zg>uO%gT++5$-P-_=fxGQRH6X5Lz+fh45^GbpDAuK@Dtfw zzM>1DqCr5rOytJ3tNRRn>_|iJ=xS7=c6W*r`GcTD{@@P&^F~xhE!K11XQ!rPa|N3T zL;n#XdWsu9Xn7d*cXvjAu*-s1Mx%0*j?&*M6uTskhk{Dn`w1A;04adjwDK5AY;H44 zC`BAguJclUi)ctag`BJ}iioUfdA5HwmQM}a6*+CBuo!%^A2yFA;8k;Po4w$X|9&7m zbAF|b3_0_op2QrK#=Zm-W`W>bd!nqHd@Ol&Xda+vAgQSkrXSK8h zSp`30af`n4IytEa`=1VikjIXWU^LzhkUl>A-uQ4EA6jIl_J5n(q0jikhXnOFuxcxx zXsaadlzn{en`WMWn;esDvj8SIwYT_6WHQxDiQhXl1j1?3F9C&0DXf_Nk+v%}Vb? zZD9WrwWT41z16-ZLehrOy*)TO(MR8=*}q@G-h~XB8@&H61|a)ofTYb~GO=T+`VlfRbX!^eju5wH|gps0e4MvzvFFTJz2_((V4MNdQ&8pD*l9OIRflvFBF_|1=o z9yrw2*ln|aVOaL6TTH13X|j6so2#dDO+5t0)OwI6t4F`Nday3I!Y2l^Ega}(hQ-{j z*#^d)bn(Zyk6lkzq4kLi)p{&?R<`4sxA;Klq&Z#B4jP1?HJ{^KwzgX*szsuO4EBGm zxCV3bklWEEc`4Tj8&gm5?|Md#qL_X*l7@^sTR8?cY2U4Le*pHZ`oJ2Q7S#fX@&@Nm?cToC{Q$29qW;}lP34=#C*+4@{Ug0f!AV>1Y4?H* zmeV)X-yW8ShS#lvJ6|t;bSJ(rE0J(?(A(I59?UOg;>r=AsBftojZrVv=1&OKa}S4< z&st8xo$L(o#rSH@r7>@z`w-wRiiC_;khD1A(l#u6Jj3T4$=Ij_Oj#>SthgR21i}m$ z%@~mbBgcoEpu=Qr$dMt(h2`#qTZXfYM8t{D!z&}D`z9Bbom9h0H+=RQN5x`|G)SC( zcWqr?%oBqbMf4PPA8AqQZaE`L8$RgmA3y-C(A$EZU9dql@1T!&pRa|$vCF4k`bCn> zPWFAHw=uBN%Kw3=L=^4Mh+@=%&`x6#g_wysbZ9ITn9e>Ch7L(DftmYPR$zPP{r>F~n>(qs3r zKf<8-aqN`i=m)Y^LtCgnb3*HTwCV|MN?CIPc@pxjO(l@4B9Q4|Ezg1?<|HtqcWLWa zrqVm#=C#?;JJs;!ZRy=iBi}5cvC->)+|3r7aF{pIEj!C+`{x-pY4Azc?bP0Xc{Ks0 zAH&&1U9$QdLG|XZ;>@d7aVONheV9k8q|LrY1%2FCePezVmh(AMv;6%}1WU*mktRPS zffLekPqUR}1j1~rWZb&nq03d4FnVpiL}~}#k21>KB?@&FWchwYKIDvfbSBe`b%lEB zLBZAi(fc9?kpncH+WM~bDuDg!T>HgGM*|R* zXj8nr|0;;(n2rxLVWtmR27l`P^vD=Zt8;~+yKX+ezQj}Q4i56)D2AfIMqtq6>w#Z` z)$|cA!zgsk-^E1;XAKex3HrHX)8fiXQB>T7!T`mO(go6I{#cZ$PwBFMcs#sF&n)<) zqC-tgSv7aSqO@49>HmQ;^_H8zTd*O(yfpsNcyxP$Doj4JY9e+9X_HixHAzWXDycbJ z>Z`U-K#l^=WSa#V{prru#)F3OySrEJtnMf&R=~MC`}aI3ivvS}y|R`&lPkEJV1Xle z_n2Wl9g@Ao$Lv2qR$zDbx0#$Frz z{cYV&+PXcdt#7lf{lBrTBHSBETR+?A?fYi_Va;6Y&&(Nz+sjNu7-c$8{Po`Fr*K)0 zMz<9g${11)1^&qUr0&xTAIkRTOeya=WX4YhAAk!{6>Av-Dv? z|CM|7wK&06Qjm_zce}HC;rd*oB(7hb6TUgP-}`i1AL+n^u9P5f|X(;EyuzVO#? z?uFOa{odXdPWz)C-+g6g4=Hj=d)6=!|2ZJNnTmI!PH$LA41HikSm_PcvCWH+=l686T9?i!4oA3%uS0H04%*%JS_}!s4 z>f9dyX;6;c1g|-y<{vVoUaW+5m9vO(4NInX;@cp58f0O-x>rHNtyc8kZgqK{+yeRV zatNUvcga_BGXS|osMAl`v~f$`ZTVwZJdLXN67o+pCmvsalBThyXfuq%fQnivKe(0x z91vwEsi@x_YP$XtZjhdDW^Ue}k%E@R{>p^ub99RT>*k!eaun;&qZ=^%*ZhJw=rio5 z_)sKk@pO!9#;ax=NXJL4uM`FU!FW<1gKlFaM0`N$<$IF1(5Sre4YVwdkZdTEqlnHF zSe3|G5UW#v*VmW+HT2C0q+$sn&0EZ3pq(}+FAh6fjb7ftK-*)x*$8E@N zMx*X`?$2!Z(0^-2yN9K=kv}t8Q#%o4Z^3uk%Wnnc67ZeY^k`(U@C^6+UznNBn1L)E zE8qMAKKH(tC}^CRbPHa)<8>)?8Z!eBmeJ%?fk>TyxuisCSvm+oHmWs&V~+XL+y9`T zk`ZH7!!j&e6Wo|^Tzd*jn!QD)jz9oPYbhplw-(MSUWMFsEZOn@-KB2w&li|ZcyQmFA(gMgr3lsqIy`m!v&c%-G5RkduqO^mKX>Pa;X zrB4Cb715dy-bcZhA_+3*j%ifA>(-R&ii^CiZcZjD8-`RiZw%9=LpPy zUXz%Ap>;LCh*s8S8*JB`IqxLncIQAoskjgxCs;0TEY5qqGR-VJ8D0@_rdWHwjSYGK zGQ*RM3WpNB-YciQDHi3U){BM}It{=o5SK{{Zc&Kjq(Tv>J*1(AHWok~0~bG^J-xi3 z!X9P8LP$0^w*g<(%3;6<(@97V8w%W~q9t&$D&WS4JN+R50(Oftn?jxf?4 zp1&h&+|E2A+dHmN8|l^%tl2FqwUtc5jH3E=C&D7+iHm2b*276}QKY{1xUPSHt(D@X zhi4KE8EvLy0M>z^+N5=x5msMxfoGp`r_Gu7rn9*fRVkjI>;U$A!;Qt3ldvL=dqJ-<9v57!)?mam zr*c}CiFy56Uu)Zw`=s*-Nc;$Y_G%nU#cqdL-)aa2sxosB{lm_ia&htq4Jb3tADw$m zTFxKBr;ZUb9jyNPIG)Y9c?c%lj zj%lba=rmCfz>La9B`cFE_-Fd}lH8swL5tzSWQg5yo{e38J=E!yiRF^0EFgW} z0Z`Y)Ottpb21af0B*j!F9N|@Cgg{7+>go3^8&*z;>M5+@-ME_@#gt=%va8t z6=&v88V=h_D8RAe%RHkk1F;+0Oz)kS>V>BtRhX#N=g<_uNqS~~%22>!T%5JVftr5D z^no)TN5ZT87D;?@dUf?=+AQLu7=Z8O!7a*+k#wm=tJUM!!RH!$1_y85$3=YPiAe5lqWl<{1051| ziI+oSQD@mZwiGgdQc34s+reqg?|^$h%!zd42hLqgsjJ`WnZ`wjp&hMEYUOI^0*yWs z9q)GDxxy*VRQo|b=m~<182etYUDxY3T}RI0=`LvGJ8-Y}^5_)Tq-Lq-9kfW(?CjT* zbCiPgND<-Mrm@KD*e%Yr(@u)D)SZyt${s zEBn-VwzFr<0)wk9VNYbw)LfQvmc=*VSXDAK<_V2x52iIjeb3u*p0y*-)gbJ9UT;|S z;nai7A8<^`66k!WPNW?_8C7>=fmA)Cv`(L?i230-QrmTBuSy~HG?=bRe0kyGP|O>= zL|sJyQ}b4To}?-FjSN-Ax}pJTZ+iImd9z&(J z-(u^!PVy-3c(~9p%ZTOyCb)w0C=|*R@d~UR4KS8}C7j`J{J|pv{!EH6Us$NvDraj~ zBabgmIN5O)%JL4+pPU}DIJbc#*8G-$ z)aM`4CT#5|*eb|&Ct)sOkx@)^P#~>hUoYl$I*Ud_+V=^6ylpa1$Bpj&Ci+ak)>aT? zFx5ROt$>cFLvv$j%#k`edx`)uerC`T06f-zsFIfH+z1Ps+eaQN3}rf*s1=kHHaH>Y%aKk52ev;*y2in zsi#~40{6q-jJ-cUdl=*TWgH!Si&gZ;0(w=>?Y{0RQcOu-`sG`}r;jZ7bTq^y3^@6J z%(d$3DNhR(H-@%O4xJswnaXQ)_`1Ijp+6{u`KG!g>GggpdcR^`)KLs!`M0|e{&hxz3r0NGOE+4bhZ?qbiW$x@9Lu#BDW1- zuReOPS8UxccB*8qUB<1&dbYpU`(R*yfHQ^G2fGkr4~@!?DayJCmQ`6xR~Ni$(&-88 zM_;|(VQp_#>l%`dwEBX4O<2@K8@gVlBk9AeHTlhuyR<*}VDxMprVl5ugD4y$F;~Nz zzM1XV8H$Yr9YFD`uxjR9qGx9P2pzhWVUJ7GTA@1#mmJFiIDa`qoKu|}+YC+X`CwTh*a=NhndO9X^xAW6 zEk=urj!$s)%cZzXkdf07u3_=b7h8gb@#%dybzAIPm|`HCII6T8W;m!WRNvj>fGo%w zAdH(OMO)piU_J$|m(u_%I{h!E&g7cjl00MIM}yk<-^kqO9!6w1x@weBa1q~sE?iNr z&YoR=IMn4=eD*FGOuRo^#v?EYKjH=atJPg`RNO_E#~A9^vX4T~JFkBD3tz(kuRJ9= zI)7?0M|YDV#YdT_KTkrWcC;SuB0lG>H+BmXyzKQ42K$0>708z_%mNpGPXARmhX)5= zS})~Gz~#mG^4!f~xr?QQVn~|%ZoKaRA zx?B)h2iepLyUe8q+m$DO?t7+c**`hd$Vg6?_ZCE%y2@q!CJtbu@pq;3+Lx8S+5CHE ztNZBjap`kY`0_lq-*4k6_tDkWZ>6P(nipIAZHiai(Uer?30~qbcR`!!FrQuoEANf9 ze>uQX#TssD=G~W8+{V&-o;A1i?)~?AHqSYyIzKA(3tmJuWC-4Wd$GxshO6BCb5?YW zQy+>(%aqHBswt(HgC$={;&3&2!Dt9B7B*F=O&92T=6e{VzhM2}>CP#%{i%DJnD?*X z^M}Y`iEWca8-t5N7VJ8scVp9?l+5S-4W@jPnf)6~J|~|}VQWbnV$q0y z=%x?5&c-mlj}r!G; zssFhSpL7Ax6~871x~np~X@iSb(noYjkoV5X&c#9@%Y#1gkU}{7#Baa-=Dj~G86v!2 zbOIXuW05p9f4g;yQ21N7426HOiecmxwOgVLex$Qt>)oY)<7;5RqWQWLN< zjD}0Zt^T03wR3-W{{dxiykQ&#fROI5(wj+-z)Z)-W(>a>f9lrbd!|MTgLfY(jPUS% zkV^K!KR33%ET)$aLfY=w+GHYCAnhjaZUF_!Qsyr${r&Pd#3XuQ2Pt)TDz1wUCz7zH zMaJC+r@J(N?+NJP(bIEEAIcTb&Ljh3-0!rpO>Q4L1~>M$=ZR#xeh)^MRiYw0qSsoM z2a+9C`A%KF607Zkt>AS4kuD$;l-nv*u;%9JEdH1qCIm50@+du^!ua_7ET)?-QZw&w zGl1y?i%*R=BJm;&jK%hi8r}lciuep0Y2?*ZY+Fsf2UNa`Atz`&Be(t zMH#Pd2xM#Pa%7hODtFleO<3x1q4k@;@J(zE|C87mc8`o!b`PFjY+oMZD!M}xA4R6l zKvKYKE2p(j`cf;vJ*yZ0oF*6UA3pt;*{tk;*x&QaujBG6DTp+S8=>${?(#N&rO*(x z3q173M&ZrXdzo*gEcfeQe}&Fd=KO_X5%@D#W--Y^b(5VhRcg;TL#bq(nY^p)V15|g zOJ+^0%k9Mv)0;lkVn666An#9iwuc7wD0N=ga{#@62e6y0vRk90C#|CVv`7n{`R|>ZYUzKgk%2cGo*f3V zk!LrBW!J>9o6fL9rP;w9zfE=4NXb0EZaTY837miGw|3a**<)J4S=xnG0(?+w6yJrD zu6@N4_-XG0Vo_Gd1kfaXERj=BE?80brU9}@;CGs{>%J#PPsH{UVx42^$`V0IRD+fC>YWO+pb-gKP@Eo+<&3FDZXq=z{Xviwzd_(EQhRV*g-! zccZsWbJqpM9C?&LVx3kb3Kg5Ka-u0)*Q>ixZi=(%yUWWfhP{lfY%MSrU_wdUG;EdE zY++JOcZpl`)0Ien<)tpVLN_LrdGG2H3#P*x?TAk}+%=d9Z{5~Rc;2tAozHsPTbreD z?z$;0F6{MTwwF(=W{yaQpZyilA!LA%~hr*8Y)=d*%UgK54JJI9R2m z!-T8lq^;f32fdZ`n>uV@FUJ&-{Y{-S@KxjrNp9w$fr@B(MXvWP<+a{2db^PJ`7IWP*AVYm4qa;3rfT z9FrZ;%n@{wiXdE$Wlbh=BP;*JoZ+pv_Z7hE3vV$r(6^3w7vN^-nJiQX`1$1N(4u3c0nbAq*^e9*k2 zG;iu!WlzFN^Mr^Z4+uSo%LIgQZkv-D^@-4YjptUFN@o7wBt8XWw+wt?vPcx8lq{(g zVRdyHc}vO~eK`!_+3@f>W@676A>&3-2Si8QfmT(2zDl7ESS?J&4D=T2FmdfC=2lKC z#OG$!K8JWlELC~ZCRh%B1&vEeI>yH0?!rCmeUYu^&` z84VG$N$$Cx$4K_*NO9tIyz<3#lj7OadA9mhd8Wp*r-1hUp`v9=Gtr>A*m*02gV$-l zSPhzgYs;M(DG**++hobrZ0owEKTg4uI8mQlpe@aIZO}c8qhcyQEOW?ys{fMH9GGlk zh~;`hn}wWywJGIzXfICY?dpOW`to?Mn)1h32etJ2b<>$VdUfGd{3&W^%Y^}d zHC1Iz$U*t??5eI{LBz^>UX4RSFg0=I-Rk-EIfOQu@CE#K4+UR;Dy`n5 z2xwYDTIJc zMv;Q&Hp`V#c%;l#&1TF=Rc`u$q;@tUERGT|nUG~cod7d3$cHzDdG_7eBmHnMvgv-^ zLD>g(eoWkYV~spkS|n85gnO2MQKm$Q8O4_m@FfwrRT*-^{#7wJ|_W2U(yU%bu(pQfQKUnmP> zmDkCmm(2;L8@#@gM7q-%lM5{-(>1#M>NBMd79j}@BRSMakAK*m^e^Eqg|ua_P>mUd z(GR0n!c`xWW%?nWrCUJ#E#=f6#eOc#=bPW;=93*@KBp3ESE6U0wm!X}^WzeM5B?J) zNpTk_YwOWH(^_VVl#aoF6{K%9C-G75LM`IjA+xhvkV`SYTb5HtfJTe}qE&t>P?Ydq z1rD$m+UeA;*v3x(AMfM$w+>ruf#R>>pt?>A~f24 z`0$&!xr2#`7^-?KSVgKVu;5$)!;?p80Yc=a5^`m?G6Df|=&jIdl;h3<7#ejNWuXm< zP1rn>4BKi`iPxAI#$dOd5)qL>E+4h4DyZgDj%+OyRZLu+@+>wMtKB9+aHV$~3Pe#p zJI}4`9`76YN&41*%5bn-p?EY`r6q;g<_GILd!Y3w=5gaB!sB3Z5~&JmjIz@B9qdZL zEea^%r_SoB4zOv+ww4Ch#$_;)&X=c@AjR4?EPD{on)~CWhzg9qA?KL zB;7HRbElw95vQKrm1!+>1@^t{6DhwL50O#w)Gq`5=pw|QwT_ipUGj+$Pkq)SSgUDJ zv;xc@iq1e+b27vu&f>xD{=gcF4f%n& z4gu6xCP)B(>u`wn`@GiUJZDSGvk|K^}(tFgiAdWU^IP^KDFt`d?gEP=5E- zLwbGoj>IyR%B(?9zLDu0{-VOD5R8gGknQUd(Nh~d_T1aMF+^r;L8IY+x5&?!s83-h*QdZenD;4pGN-In zevI6jj3tzre`0$XGP1asUf!BF3{Wck*k5Zk`_bkDf~GMYB2sj4H@^`QlP--CT2VSf zFiHjH&&+iXl*a9h`9l@mT*Enguwx1n0vqOf@!jUQpnc`q1?BRgDe$`b!SeFQZi4l> zKb!x5a`JDF#BA3)o%&~T1|<4(++cYrgWM;|c6WAm zUMilGqq!`VAi@~rd|U2G*o)9ljIy!qCDCqd0;rqAi^eCMMPSLOIX;wl)^iEBy@ zl<|X!Yp%P7*B=up>n}H~NzQWq5c=4y(L>KrQ|4=#+>?v_!;(#~3!d&DlX#XxIwSRL zeLU(Z3Z@5PNj#SU42UaJ9E#>(x{*Zsi6yzbFdsweFblIB87;j5mHYpra1&9xa}#TS zjMJ<@N}@@O^OTu&y*I$hI^7vyuO4TTN+t3B1uiwF7jZ*ZAaom`$!WuSbeWP;}hUA@#pvo^ezRv&E<=?^@y|n_sVrq!IaA)#Of% z&)0m7bd!4`0i5lgXzKmcgs$m0yU^-?Aa@-e_v1Y2r;Z-0YV%Rw+28%=C!@UcX!~fV zZ$gMy_ba+k90gUHx_KMRi^+bpEGZo}qf;u%He5Yf4aq-PFDSe~uk?c6nY&)lwe`)H zzr$^rujZ`RUN&;AE2{0CYGn82#DeFLN`FOnQL#<( zatvl?AEc^Np8MQ!ZUB8LVNHpo5E=G()auBcY|q{2*$fi~cTsc$_d-tNDkAHV6odo3 zx94iru${^=NXXY6wW0cfqoS6793So3PumB3yHCJq@1)(}H{<~vn<%NVk(hc_tocBU z0qu`~gqu!jmi!wc_3zaOgYibl1gR(RDTt43AUOLm{>tAF&cjeQ3QS}Kbq zL`WLYGr@M1W>M^*U#vGeVNN<{#PYFl-r*_$3?eVf1`?E*fTEH(h<4H07&08N2qW(5 zO!-O-C(nF}xwK7^V{q$~NhJZp?rYm$w03_XvgGsUSND<== z-=35^*}-ehJycx0AmHtZZBs#fWPLjb6aX#o#|ns@B2DwR?ZwW2DWaJag$nvY)ID~$G!=Ym(`fuISwZZ*sB*9y zg`*^_5C2gTD{S;I1e!t<>RPL*zFD6#csKNks+{gTRqXNBPVX!3J6&C(Qy(OTie+1P z#ZgZ&Dw6ATR`!N}4DAK!&fcC%ryo^PDRW9!0laQkeKkUE2YQ+lP){kV^fqsD`{xr^ zOEli+ifvFy6A`2uukEZ=*7Zuf+;X75{+FOPPV=Gyiu{-FW7h?1S>e0jv$)!XNP^N* z0CyaQ3iFG~upzB=QL+%w6;oge2}hcdO*}XKI8kk~sa&dm=vyrqcFA%<-zd=K(NhS} zbWgpoSIuwiXK0c0XfZ~2hucdo!mrNF&J8tS@pn)9T!b1J82E*dnD@}BJ#jG6-^_l}{uok?!sika}DRrW67)u(>f!xol z>_MxrSSOHpp}wn!Ls}0x0kyaS7G4Ri2KoX~ypncO z&ob!Cx2l3d`f0blM$SrvCYmNTUO`J4sGZo#}od z)5k>kI9)`rhxG_Av7@6~h5&~%Tz2@m?fbufwzTI?CkV`17)sYmRre;8SLv^FC;@Gm z;DtkDo9cqunKKHm+&Q^DF+20fxf0TeJ8b$cVMIbQ%b>AjX=DA zVr>9xhk@|t=FwH|v&NzLbTWc_mb$g3Xqt(3^wq)*2(}p##g8XIfeMRae35j;A8!9aEC?6rVePiUo6h0_D1{(Oz&}zhE zYPm&GQ<5|RR^2GYqEipIDB4N6A`zx+20kP>(YMGWhII{~OW z;nIH=ETlm-&hJh$XA@Gq(_ee3+TU=wusomSV!?|2o=XL5Fc0FNVK637y!x2vP*1ld z$=hoeiz%y0NhfJS03g$qB8HxqEfHZ(AkhX3Aip@4-4a4^p=kSsLM-q(j1G;6%mqg+ zs9VY2*>TIdr@fpFS#~5t*16q(_E{ac`92$l7l_cScXT_%wXq}THB^_3r<6t!j2}ri zTsr*fP6R%&0vC57AB#@5JFPs}ok+DqGS90_2|y#aC*|5q@L=ptScC-oo%2Fj{|KTQ z@>+Ri?ODQk&DC;bgPE%HecYeJ)<9;d3YI;`HwB1nCq=MytubrmIci1F# zoS(&R%$hfN+|vX&(|j#b4HbD4`M`=pFcOJB)_QvPj%nU1Cs}8*SEqSY)TslRUFL4b z+#}9b^o19T@vIQ68_AHgYb{F^$`Jf_Du=iA-B}Cb*mnKk8yLdt_(7K^ODDmFfBg~e z%08{FQm9tOsF=tJN?Y-Nfi!9ok!t5RE>$U0?qb|!WCg2J%)|rs3T^X3k~?#en5;x_ zq_G+Kw1&16aESXr8c$PSHn<(`nvq?(){Q~!JNfRSVISeQ3=&Jb zxGclzUExj&2ifFC${G|ZTJi~W2$cv3$EiKp_pcV+MH8q*IK3KMMsk0->_tjE3G@@t ziuv7`)`5*Tn?;I7G*^*(tOQQAm8LQ>1 zt25fg%PZm3R_H3kC6Q3bk%<*3eJ!4)GZPuefQI|%8+V9*)-$U~{+<5qOfOqP)xQ$H z8V9^K_%{OYDHwa)C4rV$kU28J%ZPu9ct@|cbS4asmq_qm!4e@KWpdG=1QQ^YE$S4r z7X$Q53sUnNMvn!v6*oc%o%WhOHO)D$g!z|wQ@}Z@1TS~Myh2_ybF`bq`u9cu$yeqG z*zKi>51<-PQ#>pt9c&9=+isJnvBAQCu~BC(@PD&&xDx!3{GKlTtgF|aq!2s2 zqBn|v^wH@Y`9o_3(pN?(7Bpo;K}8GfeMRt@Tvj2$EXyWxopeM_!IPJ(0Adi6m|Kf? z(b-Jd3d+<<#%!J1dDV2=HX|Z~$~;H|VOkc7WmQ(Lq6qZOoPL$9 z0aw;9v8-QQuE|7t)k+&QmKIT$k-`RWvPH^&*sLgytwAF7avhd*W$2jsdov?ePBvcM zl<~s>l??8rvG5V*X!OYF591?ncxIU={iRGgn3&Y}>Xhz`8KZaRFF=@VBae0*TSH8Q zdl5e_1^W}EU9S}>TeW7Zxdl?UO6{tPQm?vH$gYwlnd9N^@W?a(_2@DT*4>0ZQ-DT) ze~Vj_V*7|LRP{GN&w2;n|LS!t^6)wd179>WgG;Hv_WkOa;6x>c!QSY-``y2K8m-?b z2qN`rn}<1Z4(S?BT;vIPQ8S;xb(ha0vgcE(21+B%$Tt%zkWjO%o3dSeq(!`mVhbV> zM)O64D2V8(7{{UQ>@nwq5sNs4>(&i_UfXUR^!uhxED(Rc-tY;}iLEjW&_3-dzzkXw zk@^9s5UmYS$>Le9W1;Nr9oGCiYwi%p6aaHHGp) z#Blc-pmegR+t}4-BnMjfY}EAjen7wH#@^Pu$J`86#kv8qPQxGdArf;Clo)G&J=Gp( zgW=MHc;y)`aJz#cit6T0(ki&uHEAW}%Im;YLdrbg9^O^rh+w*p&A78V$DhHoty)2!GT1PvB*HQD(qgg0=W6 zzZFmlwVqvncq3?dAi@Db(FsaaNLCTK7m-xuZ0Bk&Q3;fxh$gLdWDtV5DyR?ia7=g~S0?PV(kQ{jO>zuv-U@6( zx7<;o#dhYZIl`h&m>;V%t5~4C9hPQuC7*ueb<&H7Wn0y$1mf*wLL`cR=k~j;c zV!50=>$^s109HV$zk^9&fQ3**$>t~HC{YuQulwS@a zCYA{0lu_O>q;!9qKFr>#wf$M0NWx`D5y_2sIAC`;N6b9tYP5MlC)&#!tKV>3gPzgO zl*oqS^^9df4&ZZG-TmE6Y|C%me+Fly@F~JDhn0l3b7W!N6U>cANKfC;o84Q0Hw$Lb z?@_;{5CvKxM1f+FMi`bRdb;A2&hnl6;%oZ(dUE!5s24O#{vO3UA%pHd3VYnNnW8sJ zG&g-0YrmPoi_ia%3NIdPtW^px?#^A|#l6oz|3f*#^%u^H+3YwnX;3{bf8|onril2N z(QIRCv{CuJnMN5_QpU_sBN;*f>zY`M=1Z5=@W_{JvHnv`^Uvx7_`H>-t$fRLOJHRh5cQEvzc%C*?L zG2L8L?hr5Pc?iw48;_o)@#&xopYWjP5tcn_lYnVG+2~f1N4tAlTaMvs3UFF8%|!&5 z@^v~FL)dLy%EdXTazd+)IrdwS+Rm#aY2vJMO%^2^5VLDFjr`vAr`tQ5$JQ@!g{Z{2 zqH!F%Nu;h!EQL~Gf8RTWeN9YED*6xUJQ%&9p@t&A4<fQYgHg z)o#^`%5#?c-ck-Nc`}B3aTd*n>Gh>oGNe=s+j=3nS)DW&l#Awm&b3B_Ei)4X5Ol-P^D$e-;D;w!7W8j=ndk7u^VtlMybpQ>u@3c+SwCAFX78^DG2#ZBK^fyY#NI z*ynDv#(!ElMb>@&DlACN$M@zMOkKUYf#&57%lQck&Vc!&#R=+HEv#mwFpV6L?uW2I zy1$YK;u)=RAwX-Z>UL@YV{LLd?uIqk^#_#t_Jda6ev-0*t_`|D)6wLJbCON8$NkeB0Dn2<=_jy91!6AmIF;r zAwlzM(E44LgD0EO&kbgsx-Lv7lO9U$X2xl}mU=xzskH)CW6FzB&FJ`g8k-a+nHE3v zWeFSjf9lPU%V=Uo_Z+3Q-1_Ii>+sJB#<^s@5uielan@@Tb08dBVZy%1!?%J>K%iltpV`?U=iu0rQ8S=*wluJc&WL|&t zj*bqF)4;m|qyn%8Z%*jSNF?WTYoq8zJ|RLef5Cxswkg`A=e2G$R&TYDxxFyNt1m{< zLJbd;Yf#_GBvLU5z2*$|{ZN7U+gkfsfe+d5_LTP+W=mJCGoM9o5U=fA`GDefVS3*( zr4K+u)NpcJ(E8JJRXid#a>Mx9;gR%s`s`!bL_ISNckhKAh4+IdCECiE#++pQ9vcVN zf8hM|3YVO(Dj2@zomge>T(nZa3nKrI?+&D+&p$zn(%CwWIZu>!>Baf6xCg zNr0`tTQmq@5^`1hj2)#Fn|h-EF%Jh01GUOMDCC7y5YNq=@8L4TYfpAj>B*pOFvqJ+ zF8C16Aed1pb5-ot5AkY{nsUm^HUi}<7E-;auUX^_)9W`N_?cTFH}EQ? zJH?xjDK1k?_a(%Kspdwl*}D)wYI*bGt?)E|LZ-VD(iP4qL_KO#4D@Zaf2A8^Tom(C z5eLTi7c})haeg)3Bux`2koUKZx6BbExq$v+jVJEvo*|mQ^hzE;VqU*~rJX>9`<*5m zWbD(Kd|vZ!d@Hed6?U^r7vtI@$SH8P@P=cbfXK(>H0&aJbyI-dz+51?n#CNiC z-2H6@uOp|!dprYF@f5Q7BMyWmFfYiC(Dk3J#tPcDkWjt$5_1&*2f1=((0DcoMP*m1z zmi?Ltudi`4(QP)?sO&QuYsB8;E!I;Ep}73Tgh#J_9Js>Fi!l5hufk09yjTej5rT`h z7d~Z| zf0imz5f;Yg4o^q2e<4wGBnqrgD#T)v;i*}wql?o5RxDOkqbr`t0N4S9oeZ{hVR91!NKn+sx0kzX|~7PT8)F1Tf0;_1bzSUxCwZf3{i51UCZ zQBOUP${-m}e;mAGoR(rg-KgWGmvFj?6D9N-*o%ExiIGAIi21Jsb5jBId|!%reb^+e zJK#GzEjOqfcQKHfBlMwHn-6pCRcNe|%DH2W{@9;Xh{V<>|TMZA+40 z9M)5>vBx6!=^X|{`F#lz;utrJr(nbW%Wj8}Gd?IMJqKp#hKf6gD5~%Pcgwx)UE?Ao zvnmfWIG&3iZ|@)OZ^YG5KXfX+%N4+h@C=e$g_Tb0+~BO%=+uKR`t4N|4N9a#RN!Wj z@X^7uf1>Vvud1tfO$Q9O%>V4m)#4rBqT)b}`wsQf%~tihA@T3K!_!)-1crGR(acP0`=a*L6{rirJB-_4O+C$bMSma3zWno z80Bb78@pwuls$r?AC0aUG9Gkj5FWDMC}cQu3@{@JFtoquQKOF|CV=;QqaPckYD;L2iGW ztN%`Qh|(tL-rnN^4;l*ig7aj1w}<^{a;&COcPXizY&$FfZ#wHY#=&1C8X(fwvA+A3 zf0~>iYal%n0_U$a2wgs@l{DfEE0kmu(AMUGIM7Z937IPLWj3g=&lEPyQNPmc^WE3A zlW%4xsHSlK3-2B7_cr+3A>j2#P@1UD!!^Xuomie;NRIuZN!LFjpIqeB5C!F8F?$D`@`DxMW5* zN`9~hSv;>|>GPc&Kln^u5$hP+(w9!-7?Sw}mnYyS;d7PH?;HPZ0PoobuT0fpb%nKa zUEWMMW#a&h-bclXSS_Ut5B5vucUggL%Th4%uA}jvxeJFYQYU5;%kq@}+ei2Bf5U&V zhq7oaYQ*(2%KZT7=qk+wx15nFM9r#vs*kx-RfkQRl}?oC-DlKqvIOAD+*| z=jv!rW zn3wYwJU%llCT$qL68tUg(JL8>KO3MY^-PV^-3DIV!l8h;&O8DW8c;G5?0Pa+ulsiV zIqzfNd3JIjY()fLmqjDlRn;w5BPV~4R4OL+~5A=As}e?6#h2*b#k z_2sQ`hBca2COeL8Arq#l2!9Qhz;1%kcd zi-}$3cIEdz9{cL^`=5Wze`hnB?e<5Mcv)xgCUHb2ioCGfN>x$ScykBguQ3i254$;e zr)UZbBJ5bwo;k^N4BRs@S;I=Q*v22dutgO2It0pik`uA>K$z++Dk9VLvYY_NCnhxb zAK#!D?+w;251%ptm&jauii(V6f|TCnjOn)lwr4S-e;~0V{NDvCe--Hs7pIkI$L*RW zlba1LZ_E@W9vq3juKODw&SHmw56L0~PUV*c`r)rjCWLyP`k?v-fgzv5dSghd0T?!#@4^`{_CIsF6R?Ey-Yo6G05bdG0mk39pUb2MGczbF=KPABG?+TNFHY+Xs-z z>qUNj5nkH&CM9Sje;s*%_*nd3xO2{lgia3z+?F9G&vR0SjFejn*3@;mpe^RMuQ7NO zek5ly4GL0b8iuAHp6}WXxNPli^|P z<*$r&5{f|=tf6X;d%It6lc>U$5n_Vnvn`yr+~kgjMt^dy&=x?C-r)ajPr?(O3Uh{F z#v|EIoUwDpf5t2F{pp>N@`-gH78b+WvckGB+9vhUm?qUcqtB$$`$u^{`xTY4(CfGB3AO~7#w+2H)8_0&Q!MI1=5IOn7*(NS0 z6V4}wART6u7yRyxC;Lh7;GDa$nFidJ6=@|_b?)RSe`s%6Bkea3oHY?ZVj;C&Bu29C%*%|^ODNE}20P;!7{Ftty!hqBjgRn>AnOlIEXV}C z=cCC-*IUg~OI?z7?9__;xw6)2$yb`_JV{Aa{3NO^kS9ZAv9M#QR1`L~Q3lpJNX4OU zDn2Jrf1E1U&4sE;5$E}j6x5{QUbDevy;APAhC9C(nsE6ONV7g?hQ8^NhJ1B63HN+R zt?g+tUM>33+WrEPx@Kv-+C=eSkChYIid%*}J}G_#u#vO=yUOX5bbLD|z7-R?Dz34L zOyufG*amGfFalv3zq|M&f=e;CMk?L`^L1P3BtM!0`iwJum)T`o5g zC&L1X-kuFfTXis>fx@}LY0Wk|VkIWT4@}>kt={&|%r%>K?noDY^{d2vIOXV;hwR@E zJO8$wQ%)3`TF+9Z?*$A+N+s;$vx(HY+my7`y2<__t7bmrremi1cSq90URpR7&(B!^ ze}}W2tGd7W!RmtroBT;^Xe>?PRpXea+uhEGKhMk$G_C88F_rTgnTT!l5AEv0(1|~w z!quo3zF9J9oB@f3)5u0*uTpyF8+xX;|U!Q-sB$juJvye4Qrjf6R4~#kZv4nz1 zg8qN;ln2hNGyDZxT#XLP5k5_kM z&Ozq#+1nOS_85(YU&t04eF!LX?TaL!O#azQqDm|XfZT>uC9c&k;3n4<2A4-!e-tP4 z2?Pv=aMg5urZfmXJ1^cbv(Cz*-onPkDLB<45zihZ( zm4R(Hj-+`UMqZN7_wMj^dq!Qk-RnG{ZsYst1xADBGRu2~)`omcOHJgtmw#hBUh__9 z-4OL6$vvXJW0Wuu#b|p+=r**Ni1~NHv zajDZM%OG_k=EU`6NIRWGtyp+`wHi(~*-6K*C$WYso}*RJdMF9auyn6Oe*{id84UmP zc8uRb)jQFn4w~cfIobs5}4j3A*zSyfXaO6L2Z0B|lY?e~qM#bW+-73{Cir z$X+AAllL-Ss+!l7yzO8He+=j=o20hg3LcZeAv;{=D(ZGhXq!C0U@hy4dUPJ{6e;fa z20K{ zOGVm%{chfplJ{n`|J{78eFG0fvdus#N7bo&g}7Y?pbP6Z^zt@#3C74WK`3&+Q**w6 zTm=}>>_qbW=t1%sh9YjyeOR#}Ym zRU;@$&&wMoyZFOk0~9%wG%i$)&L%kbBYdUzE-uH8ndpVwX+=?XE^U95*$;)Ef$o%FD|6tRo|th z8cNSBn9+wnX6`*eQTS|5!{K!_(+8KBl1u+ZRMk#C_1Z5Ni}&j-UUD%IXL7{RlSukG zh*eJbg_Mbc-otNQZ~=)uDKW|iJgESZL((u8Y#T%%vT9y53k~b7&B=&t;e@eWPH+%B zf+C}1!bdzYf5dlu?K-Vb!#6)ksb3$g^Tq zxZ`+k93pz`DA%FKbZ1<3@D{>aF!2xD7m@_nSA)~k`Uk# zCkZ5xe+`_(u~2Ks6maYgY77z|vSx^gdC)z4sG zDF5FAI$Ld+YJ2za2t?c>g==YAwpM_s{f(zbeWubi9=l*!uU!IDLn#i*c;CWnSG}Ji zzoQaK9JDk$Y^0UX`=EvH2u=m&^G+Es^oAR6e}OBDz-K`;gk^tZXa=mUM7fJr&)QLS zRk!T>PWg#Vd_DMabfPOjYp$|wFka@{)n7YaEIGjHyxroNhB+(GIpv2Vquby?#XeSn$tO zf47=?Lp2iEu}^ht?3__$fs6Pm%8B;;aJc+<}klwgzaZIcVP0X1+d}ge4G{2!N9iV3ZnP3-lKNeN(HN zMnoB=#V~;>2P7( z_9y{w^@HdhiBLddN^d5i0pYQ$SJqZ~MP*R@3Ic%68Qm;Y-mo-^L)PUo8hbIDe?yVE z#f9mo!THH4WlEKY*9SlU(h3`gqGWK5%+FR%VjV}oEb;Jl-f@dG`CY^gPQk3^zJq(~ zW?V;Aa4!pSsH}M1)vps4{FW4(<;de*bA=Fu6~kAdgO@J?FO#)1Z`+|%^ps$r!3`g(|lRQgCc>&TQ}byfSu8 zHX-t#0~^ME|2J)O3Dg{Y#@(eWpcBE{7ylCevoBYR4V<`vtRnT+k`l&fJi-f*2L;vBgY#URLAqaZl{)YdKpYCoSf2|_pPbcSBl?|%X zY3&ci6)W1$ux9kgsT1NH3e$)9^R9FoceymCH2BfBQHF*_g;B#-)|xL@OT`y&3ae2S z;RAir9@}TVt$9}(b6aLdp?zPnaq2&i;#6Xf?KSodNVsT4ZTrC`NIq&@Cvhhrf#BHm z4mY^x7o`F)-GBy1f8=kCdAfC{oWxJtf>!&=q@_A8bS_A&G*Rwi$z-!ENCD{{V8CKR z?nnT^m}fhjE>w?Qgux9)Qu-nG+xww~z8Zn$MCk12s)?j&WR>H}LJovdn-svAoSS=q zV?v;pLCT?_pgb1SVDy#k6P*p0QzGbCLDY2WCsm(0&P&pHf7Y9!6FMFi#nI2P^Am_P zJf<0>)~2p9-CwiJAlr<@+s)I?WKz^_phR2D#QYj>Y0Nd_Xy*e>U2BbmPs&9zx+2Z| zZkJ;A9Vr^mxl7%w$HO4cprFq{ve0%Rsxqxvrnlp8&E(5OeL(E?9{U(EM5xkwh_zPo z(z0O-EVi7(e>UMc_>nZcncgCK=?S8JCAXOQI7$wLq{P<#8=;B8Q$^CW=rnV1(^=cT zA=Lvqg>s&3$Jc~9{}5Pke2k>lEVz&;qnA(L85+w`M%&}QJ-Na{VH$O%u$usNX182` z7s|*?B|o@L%Bt?|_((pi6}s`@w*~}Tn~aYy%GI~0e^oA+DMeF!MR>F67jMlY+0OiS z@8EGuIzDte>T_4sJ-;vrWtd6JF*3w)(BeC_gk7jlYA7Pztxkys;)a1m{2ji#G6klYTIyg_Q9Zm+Q$<-1WVoQuxoRJ}7lQ@Po1F?l z5T_90e`Y(gD4`6C)*xt912W4Ik>Ld`9+CY`8Vu%08E=R5ND^6eN;P-mr0R^$WuZPnnMH@_Wo$CpNk;mhf zT4vrbmu5;4xpp-{zbfpmaX@(j>jt#(M^uHYf5OC^meBkHRYKJzPj}mu&>yiQ-VNR} zP%w#orL8O2XTI{3?eUA#_O1<%fvg9-)~(@HnX(g>k3A%8Pqb%g*+hYd#JeShr63Sg ze{?4<6|P%OUIriLPoh>Lx~xfM@lc8%UwJW-oGoOP(f7jzxq181OkUlX0)m3 zbPcE7RrYgiR0S}3jd)yMW7{=b<$LYxa;aP_j}t&Z^3AAz#2tU*X@)t2VgE1d??^Ep zzP@{}R62GRLyTA)Up$|18&}I2->KhiQC8>?3C8UQk9gg)ikk6Qu6wx(c-E>_V8 z6f|t%uQ&};Jhw5pvw1rSQ#5^*u?PBMUGtbC@P&oWRXjqO3@?4sV~o_ce~36c(l-E! zkMO(6<{8&js@wdqmFtf7&PV$=c5xcYcuw1RVDIG7jLv~N>cwUf!jz-a&xhk4rNe`~| za2;NB@oxREc)hp_5n)7Se~!D^pO-{s>SG}MIOu=(-7(MxSr_cztN8aqaO2(>qWJHh zKJq~^O5u*zPTv@%Ix#7UJ2hFN+m@Z-Q5?qQho3VzWDdF4a4|n584iy6JJ(f$qB5sv z*HnV*+JkFr0Mtg3hWv-$9^;s_Ijt4rcgOZ&Vmpqp|FuKdbqzVbe*jsO&4OzD)x%^< zfU7zB(Of^Rtd_O(x*=a6#A(P_pFr53e?C5cLA$R$0uLZk&|fhOyIyF83maTY$}a{^ z&XRw&P;})T-kZ|K5Z^;jrm?O9k^4kc#3p9TloPhPjKivZyS)au6=J$a!5*}Z%U<+e z>!;AYqvYkE6V40Wf3WCY}wjX&xgk)e}Z$>kxBJ-L0a&1F&Q=+55rQ1uA!b8)z^OTO3i?@bIlT^E8; z@%;3x^pR2Fu~_1FZ>V*m`~37|V2bQmCcpexsv?sR*bqz5f9T{?+*!q7xn}1YTat9M zNhvWhGkc|EKUS~{>Mdh&d{RB80s$;+bW#KVUD{O-a{g2UK7KjS8zm0a7^!(Bfctq& zH0BGdVZ2!7qCm#T&ZFb1LqRgwYpvO$(8TmY_?Zo{Xr}9wIiDuSzOHxSi)InDIYZ={ zJP1t>Ycp4df2y;9^q#^vkcIeKMA7T~+(aNTOY|Ztuv8BL^R%d}Y7`@50LPaD%lOM~ z5|x@`Np6e8#}p?GMa-;$nl%k32E%@g{^m*0D;_h$S7%jk@Z!{DF4nnyh?&qOWuC*{ zR^Re~R&VtWoIoBjAu}Z7RU6IE$(akpliqLybUcZtS05D zT;vPWf4XehU*WH=&Fl4Y@2@ZVGr5)sC)pTfV68`(I6L_&eco9<0;I>JNm^i#lYd&% z^+gWR%T?p^gf@_FkTO{Kq&le5Ec^v;Hz^ejD#_a@Imm=rY)>~<$y+0-ohvKNPJN2?8VowFSXXOc3G4+Q$(@_lw%p;7E|HQOC>Sj8>3Nv zZnBT{WJLm|vKNI!7w4lBa%oCm^j9Txl&r>NEL@H*C0fcmai&C)+CHEVCM2h{$6+;X4`5SU`Q$+((=hA*YsDV?9(m*>zk@E1# zxPhdWHRIklj6|lfEe-=8Y0J4jPsj=K8yh0mPN#{8qc`?;ORD+{VpfwYsoC?WL2)w( zoH?t;h`g9u@Kr_CMEgZQ6rs_on;YXa5_I$CKNKSo70A_`NQ{_}71T=xI!7IDe=%b3 zbS5LYS76P)3I-PQHXtmUqdQy^DakojD7!X-9%Jdc9kwQT? zIBMS1Ijh@QLe0j)fp-|=Z*`Lfy$7lBt(v|2t3K;YiU-b{501B2Up69+CT^m0JSYNC z=P*U!!Kl8eKT5OCR)N2Mk1hJ_e*&S)C`me-YgbOD)9U`j(+RIX24{&J@(W0pn18B= z>s)ui%}kNw&EPpsd*)}j@WVq20I2RX01%Nri~sP$8`{SkEY)|KepiijiH;>|F2n)W z_y)C)U(tn*gMe}Bq3rWFe0JQ>JHGZB249V9YCy2A@K|KW!T1NwB=&uXf3N6lfO~a% z)pRIPLafrg^#jD<)IWOWyR9Y=_CNBkw5zcqhz+$k;IR z0gcPn5(9>NT{MtzvJ};+f75)yxWoj3tZq|3Is&~5vu@p$vok|N*NxDA7nVwu3q3@h zL1_;B!u-2O<>Iv$dE!R4#?Z;Il(FV1L+G`3=i!rO>&SPr8=1E`GOK=Mj>E`MEL<+P zp+cl$!X3$b>9cJNfEnip$H_^o2lM(qQrXGVUnq)L`@zf>3c($Mf5i2yI;@zgMBA|p z=Z;$5hbT^ZYv)g&%m-2TzwVW84w!27T9<+;6cj zER#`Q0dlF1Lpz1`h)&6z49#@X9f3q2WW@9iP3yz(QN&n7@jhs^NTg4k8uX5`1j-Hy zk3JQvu_H)gkU0eLfAPo72lPqujo06NYaF)c%}TxT8qrVQI^oTlPzH&NB(>;j=h70Z z(;UE_v*aJu8jAEua>WWY!2C{Fa6>LQYnGR(h#^tO6L5VGi&lv+;lA4X=sw}$F9Fbd z4xGH!yU1%nqRpFV_waIv4WT$7%|E=(f^9BYy;vtsXVRN~EYy76s;#wa2D(@^!O+4L zlA+O=yrb7wBcDAZ8)>(yi?4>nNU%MR)+DKUE0-D-0~&vSD&Y`$?~GamvJKLB_2Mj~`Td1e{2kA@xP5NVO7O#VSdTTZxHiSG4;sXG?*K^$Kz~3qD-H}4)C>N zGQy@>d9*FmurIwuxvX-YYn-vmk$fH*M9s$U z3YveNEzd4{Htsa%11%f=VRQ6hTuS(DWpmGpf%5nGDNM$VUHir!8d+!=M7Q{Ufo>Z2 zYnApJJR-`?3#ZTeZ7xu{QzetI+h&k!7~1mY{@_UZl?Qq>ATKdxPmFAR&fus_;$rYK ziIyu3Wcu9?{jvS{v)vD+`6ym3qi{*~7j1vmiS@xG!?ccZ`vYI#RuKUysOT|ePuAy^ zA4U02syz7!AJ>g=4z+HWkFPPz$K!^%Q9sVu9gL-%`;IowXFVzM~6j^f(NkDz~)`{?+NF;Q!>rCn{GTiYdu@r+vLmKWt&yAHrN z-dtgWt-M{@RgS^{Cw-Goe{JzW(+Ai2#+z>{Y|v0qyf?F7!ZYO@#Qit#jltF0Q`~Sq zT4}PrRfU&VDI1tcr=VACEiq|X3s?W|vWv`V?<&_jX?H#9OwnD9q`w}ms=t3~JH{1I z-z+6i$&I>!n!aC`)vv1OGMX00)z>h*(nyCpuL4seaeir=9Z76gXKxb(jhCy5$1SO2 zF9(p^2QW$M1yenHGL!`*KidTDG*a2L#2%kbAz{(*DhX4~f6Z%Y{wpS^ z{?o4oU#I5^0Kds~+l}Y|OGNuYkhc%^VdLpgZYorB&#CFm1O+*XrdAo)dASo)`!E{OIBZqI4|wYN%9z3XEHH&kl>sI#tur#1n;>3c7Gvdy|m0&446v1C@ zcszQ!0PA&-f0q}E<6T}@9PjMHkT2N5c1c|*D4J0{NAC6lz%7kh8lQum@u^@%a4URl z>|@*-QYP#S0Lb0Zoh8qs08gO+#%iTOc9Agzt$UbT;r$Sq^{an7bJDyAjC6n^awi2+ z4Z4t;I2H4z@(8!bi#)wo#Xqj-04128;lUK&vO4I#IX940erECGruSQ3v+z5wBqyKe z%HW9!pCKAJ9-cluKZrEql{ZBWDrkblB|T6kWXr|K!?A2vxAyo*(*5)yp8l5>(LT`1 zp8SF(v!36~e&>Ix(TA+ri9$T}kAyf}e@c)e72@!AfrXCeka*o|Z85z!NR&V*2C2GO zQec@}Nt(y|+NkeonIbF8TSo8iK>5yXR~B=2>3JEQ0}fsxlJ4{hq~?ry9w3CDxiG64 ziIrgm4+mE4C9iCMH~}I=1~C6f|0ifKCBCR&*Y5sWnsk3G%0EPXD5nS1;{aNiR@Y*z zTzXEeCI?AQwLS27IU-6rfA=K?CdOtG!Ba2XOD>!95q6OU)uiBKmP+Xa`t+(fp;Q7; zdYZ&pK0#nt_NNHUo$ z>1=P#$u1MRR@<4?&_6UmqNLagMk~`~jykt9?3{h(0VtQwZ|Og;NBz0&1%g7(YRypP z)#GP~Y}QvUc!(tT<&trlX~k7wozrsu#z0Be5}(&(bXfBxNr(|bf)IRy_ZlF;YEA6~ z-9PSs+JM>$TFh*W+?~z`8@rJ0+~qZAXXo?ITIM<*@QB>*=zeN}G!Ke2xq_(|rr7Dw z2(W)4yzxXy$s^TR`qUb1+lkk&4-vzsc;N=tMTIchP)lOkyZ0vlpVvf%;y;rq$dM-&CmFax$7ki@mqb2KiH+BIu zR$Ue-1tYbrVbhz_G$zM02Z{S|T9GP$EF)L&(`R$H)A`s>O4kwSW@or?o(7IJW9hp4 z-ZpTg^&(s{_U)!OCW?KS^&InaE>UgT>tF0_>~)}mk!mT6vQqc_2 zj!p?w=#?e}6Fmf2YKknU<01=AW-&gTVgqh=OH^3dN@J>QLg14&BQqq~!hJ`6XF*Sd z`hB4{BNQ(-`x3qLpWds9@{}2W@<<}3|5zwXzV4Wj3eYKx=R85mS6sPc$4pp9tddlb z`8BwhtwH4>AXX{NOL_`i_TpJ9-7ftSoiN8zY2~gC*K}}NMHtuk{<9YbrdpMtXN@8{ z7#5>@ca9?#Q=u?x_w~>|6o2JV`C{|ouG^HA}K6>v`uNxMu$zL<&P$#`JIomYa3V(n=A_FsWL)+lQcbVL@5{e)z%**aoBH%Dd}Z z0ZFhJGj;m%<}k`Yo>HM-ABz#t_>E8I2c<;^ia;y-M}YUMnY;6Umb;Eg6?=zE5$o@3 zi*M3xHviM(wMPqp(A_f$t|0cA{8~EeV{K;x{~P4)%A*;PyUq3cfE;-atxTV{9w3R{ z9Y=}QldBqo32qCA#jm0aV6_n&!6ub$mAdA(SKplV$@oSmgr-2=duan47EeHC`&_7RJjw~8w)qfGFhdda^`;vfWI#16xzvnq4|-S zCT+akN!R5NLdd8kUC@7b8+;aMT~*>3KSu|Ru}tL7Q3-LgE zrt{lciSBtd3QBiY=X!K{``dRGQtl@a(xE|U58lCc*0c?0)WCA(RDYGQU`jkQT1!~i zcu&liC3IusZWDihl@XqmUGv+${9@N>N{m8z^p7Svvxx0De9N*4kE;)I2{YbUgR+dN zt$~{B0x85^R!LT?GDpj!r~XN^dfWSoG#u33RzI0BLB8HQ=k~)rEAm$J`Rix;jTij- z;{BtWF5O3%e>Yu?50;N^z?hhN)6luqwFkDXF~myaS%`lX&Wk6r4ku-Hu^5vpY_8TL z^cp-}8y}OgEhIfg5W>ZY8a=TuGcOdvvJ~oY`u@t&HTxf0s5zw!9;CnVTg2s*OC{bf-e>XRL7d`^f7A;7({NqGWi^<(wp*r`Zi{aH*)@r8+7LI`c?V%Wv^ zE``)vE>~&{RKLc!0ON}rJ1vcsuQ#=_E!r#+j1j`+G!!%+9+XoKqOa0U=(O#r ziGiRANxg>^n(}<5dCku7cV|hz#LV*Zjp7w)n_7h{1hVer8TF8w3?nbFDzs@dil>dO zGzchr2kIN`9n8-=E2>M$W4q0#h&X5?Op!J2c4pV&I5UInO3KAsQ!r;{%=v(_k;!Oe z(zJj5L6-3dZ=R4Zud>jiF|EVuk|}|#2lSI)^uniH&vE+Apt9aYx!7oXItUBEp{#zdwJ8q5FULj-N}Pc>fRNREM($%R33Xy(WQOrcw=+ zWZ2RzhvLQK85F=>Fn*z9`_}=bOSETs2Ne!OVEB6aWWWHMnh0=VC#7|8>LWZ@H4aW+ zjwf14v^+HA7iFs4STI=NikGixd6~g`gdcGI4i@;rHQA3yI}1ZK%gZa}-S#Z*ZBfdTHAsS7&xTw-iCimpWi*rlV|tYG#%XsvRgKJbQhPC(S2k2t?5U1 zEg9VhYg3PI$B*t({ph~-@U3)!muiOczciBZAx9pxhJS>DO36O3&XgHln`b+!S7zz# z)#6WkjHSbwt6gpuzB8&eY3~|$@9l2}pHoxZ75ozyU#a6}UBSRgdEBY*G`)Xd)>IcL zDM)SBb>WCi?yB5)t@lb>9=_MtAbmUZWGX&#`Z87X`J-&q!k5;}?dfVrA5MARPk+{5 z>*(e@dc3o}3R$MTuqbllt?BZWkr$z1QLC?gW1PTwIH>uh#vsQ4NI9lIE0d>vDcv0Q z<@j`R4~Atv@11X9_p?-TCH8;Cz0N0(-+7S(xNE{QM}s~jap}DfZ}%7&Gcp-dxZ8;+ z;6l;)4GutJ2Brn-YH}!zii&ttuNBV^sr;anMLCZ4Y8X?p?aSsgh{H20scNc&t@x3> zlK##cy|%Kqf`KW$Omae2D7tHAb-Kz{+lBrPgkXoi_Rg$*v=T5(ZC-z=5A#}8jWU0? zy0p%NwDt#@>XB(qsm`T`sYg=KBFtDp!K1HQ|9#Si?r?NQI24TIVj&Pq}FgsuyfJ$)y zSf5scec^8CxA}S@Azj--7-xOO;y7_bE9x#8q0V;?u>QYxwN=eW1 zw6~;+3C}32)s@E^&?4EDA@PWx;V@Xzdwja%<@R-SA2z#Fastg*3LR@x<`M-6vkNkl z2E?oU!O&*GFR|ZjPaNj8SbS}n;r!&)(}(PQY47f|B`5i7j~q`w7;1xrIr0!i&U^CC z2{f1z0hrp$KeB(zWrQAo%g8W4g?C*lMVtUw;0)Hf08C&B(+7BiOuxZ@F!K-!_2ul> zVPe*fX+OS7jtz9d$M50&#OLX}NS)hY&Ey29PqyTe<&=vbwiNnni}e{7(-M@l(bgb@ z{&#(!FAY7pYBps@+_j7M@va5@p<0Dmq%0G*@R|;)-MoL(P0nxIMIF)E$hO`Z>A?Np zCO#Fee_ztELylx2Y_qdA47iGYZuk%-3Y?_K%E-2!iiGIl34CY!^t1Ar5R=rqa?V`< zQ$Vc07)zL!Dj{y9UUBD6@fytTmhT)(82ZcBC2}7c+bc-ydP#G=YvE7+am!tD@Al0F zt>)a~+!6#GC8mX!4J-pG8+A^EOz%TT{;)JbIk-Je%}*KOp43m|5nf5Hmr*POAYY20 ztrFW$t&s_R?fKlkB}Z6p-Zz2MVSbxa8BlyDRD^(tdj63F$b`hh<6NUjJE%vborc;K zGV1bh%=YLC75AeYrYciq6~NnN$SniZ+-G@*Xh-zC*u|Qt&^;qUHaiz3q!$J@NbMkk~uP?v;@yGRFk|QLv1k+RX zY1JAi*<8_aQ^CG!ryFZ!ZOm@ARJU_^TWXqkS)B!50!9AD?`IUMDc$o+!{>4@Od-|U^sBFt9|3`7hUreGjX6vFxBMnT}pGeY14vg zGdbOGjTw06bV4SDf?V#@z!RMcT=McFC#8QYDU|BWSWV9i{jvQI)YNeE`&xF1BYkzo z_~V1MnekyEMF`55ANsqvrHGDrXc_)Zc_dA4-fY~ zhaz%!guIz315qlfD_q&ssbgs-#J|1$nHe^jU+b7Ni53ZWuJ-VUcttc%Id2AE_=H@o z+^ad;QG@0JrMo$kYN=TXKPO8Iw&{os6{Z&MMDJV8MK;!g>N&=L&gTTJLfQ0^4i2gT zj!i6C+e(Ux8+Fq(a|X@CIH{}u$D^iCI{A&bUUJa`lB#R|#m~B|#Tdig@U)u!JpOqX z#94d%jLWCEWkUnI=xqmJPLGnJ1(@L0u)ACfIka~vlSVy=-O4#lsAXZwg@QFXk=mA! zE3X+fa5&55T8(*sQR7O8#nU$RP&xR1w+ioD*-Jl_)H%*R*qEnhnV-4h)V#U);h1M- z3|{-zUvfR1%}cKJRZ9QQLge`VgU*Z;M!m845Rh#Zcm?ZJ`d8}6IOD5C`N8LQqQQxc zU}RI!ute7YRitd@MQTiPeC@A(-!pX{M!MaUHW7ll!l&~3h`rvC#l0+VV0^NG*Q)jT?}DWyJf z9kXPodK%>-le)x}oGRcM<1;|zEoXry{-#%O(gElpCoW|2IKl6sp|N^uVKV>4gaCLH zg0>dyaWPnbe9uKx5{GY-#DmYK{u-^CQ2|wksu5!byR34{Su3*a-LE>}VWdiOFkk5T zUNy<934Ww3pTLawhb|A^a}k~F^LeBXyy93n)>gjq=>a!JUcouKki6Vf!r-BAjF{1V zb^3f=7CwG*ONJXaD2*{IXX&kc<%BPOQ)Oe3ExIw50KYT zJC(q9!k7V%nL*~B_kiXCPs4*17D6XuFD3eyPj}tjnW8)GQ_(F6)j&y>LU?DHnrP%M z6xJE5WFJHHujaP!+J~kR6!KO_QfYjNO)WJr>y5(37)@UfR!rfXwhXck4~YkgLb>@Z zpjW99lP`1Y1V-THm-(vj&21X0r%j zDrH~8Tw#|Kyli#8;Ie2n^3xUH@hL7$;e8Q1)$;M1e|pLWHo@&2x7AE#ru=QTU-{XQ zdxJBVN8@!5-R$B7N1s1Q$J7@?98P8(%2}ps9kjmBraWoW^0I>#|I1k%j@EW#fqy!E z%8qFTGID2geW^Ni-fS0K093lzD`=OOqnkMM2?%^9kuMw1u=I1*AK`2#&w%Gdml~aH z1ye%Yb^&tZ$cLIC;mT4y;mQK*30HouCtL;K8icEIOi8#RWgX$lZ#O4g0p-~VS7iR* z60Xb5rL~z6u4@lxMYz(F12UIXVQ4=!NQ?vkf6Mu>p4gUFd z$=cf{Xa|RCPqg$$cru0lL=Z!cltmYGkIuV*MS|FqvMh&7TqULC ztdG4Ug|`c@YmZJc(pWVi#88)sK(QtT_SPw6-}YvalF4lST-EZqs`7IqwXcV)UU&w| znRtjJm+@z}?mcBZn?t->Vx-O}!-ha40sjKqpNnL(+ zq%Qt+BT~25*AmI+|7b)U>e`$F*4ztoW$*m*c@n?76$z;@eCgJfp7EK~1AmZEBzcytA1@GAz&=Jz8`a(3b%$Ay`VfN+VI2Y8> z9r?^h;F-HndPiC{%72q{{X&UfR64q%xm^5MV~1GqBwP^&704T+Fa?P+;hWxFdrX-CcRbcM=)oB0U7;#0k~(k zi2~)F5CUkqEnFz;6JNw+q$m{>`Zvo4mA4+YTJqbD8cyp6;(z|?){E}&M6*niPb-3a znpl%wOpW71bgBgOV#oS9h~~VgESf=b=GYRNI3E(af)^zDr7VD|sd1sObC_7w%VGvo zCYaH2f*a)+(_IY)BrJdmo=|zp^eM~03TLbO<9Mqy)|GQnRsRI+j)jH#+0IsBiuiYL zoyGd*j99FlrGHtmSRcG;CxEv2TV=7{r!zX`DrkANC>y0CRwYkHrb%;I&dQ66lB<45 zBU_r8VTr`u5-!p+z4ND_2b(Cf)Li=K@3jDBM5>JSR^Xm7p-E0 zshb>2NPlAZ$mABaV<&s~$`<+aRA=^e+X11`|nYH9TVz%|nF0-CgP`@6uvX zM0uMl&Yv6|5rKW2l6gxKdf%r;c8Ws>rEEdjQ4nBpq@{KkJNHq8aOy9N!?pR&mZ#=T z*S^18lAga?t-NPc2 zZktj?w{uny^vdd9XRU?npl9Bnhp_`?`V>F?+C4sNjq$X z1{V}>%>0&Rg%!`KGwPwXWjoXBXXhpmtNc8&k+g7pX-somJa)mQUm8~0d0Dr1R zoy=NgiOO_SO}gV|l~Z85uaf(vjnSdgj+o3Tvlf&%TE{|oBB_}AxrHsQ=;I%3BbaBi z#sePC?6um%#m=nofK`K>syYsGQclSH!TtNo_tQ(Oc#;Q`qSEh7xukfr;k7?Y>vYXT zXlNM+ZQY73@OQ-)h}_b9%xyB-Ab)dubJMc?w2HU54ct;njz|Wof)(cgx3Ur;8tzK< zoJH;#E|u?v+|=4Rz2*hwqSobF#S4BeG$OG%R{5yIy106*!b+Fb+x5N|I!i)8k~VCP zp<9(BR!j+EqGok%41(apKuY`n!TQwwFQu~S5K!Ob^@rfW+N})1Qk?kwV}Cj#OZ6k7 zmQ3#brR;`x7B+B-7{A&5|SF1;1?o3|)a5*4b3RC>8J{R~j}yQ4(AhuYrU^#rY9;D}$d!5($0< zqCY$Tap)WffM4x@F!7Xs7yW$PJ3q#o+i$A42?d5I5g+>Gu??5LHKJ{T zV=1^r4bhH%>qY+iTl@!=#{a$k;sUrDPFe|EmAa^Oe9!r{UkuQWq-^hvCR!{I$D zibD6ZHbE^uxdN!QJYyf{%795O8yEMrr)W-9paJ5NqeaRKuB zf2$TS=bfs`YO^ghi)BnMULR`O%!$QoDFA#hwD{Lq$zCwr6=n)9vFKa_Hv2i0hCjVL zur9mn3%-YTQYS4wO2-#zU;*K$s;YP9$a999j^Y1U_l4rKp*2zihLS>*>jK06X4{aC z%CBP}qr>9?;{QCp3jekivLB)Wn{ zW@Ll^yDDDOs%FNf<+%H1^TT_V_}db2D_iycirnUR-)Eo=7}=f8)Li zGzrazBw@0a&Ra9*t?2nt219W-;L7)I=%Vrc^|C4fpmT3TN;iiUH*rW!bP@ZDo=!03 z{-t&bNR#KTPxPG`^~@cLCnG+`oLxSV=kSFhA%1a{H6+XUP;S<(Za@Bt=-7+aoaD+M zY9GzbN@?}8=%*t-*}E_nFV6!omz6&Q8Z_oxOT`2O2}l;=)8F0rx`X7FOU~Z}f|1av7OZg6 z*Gn|@iW(_lU48UotanWs-g zZaqDtbc_)Kt$Xm9oRn~kl>*EfWQ|dw7&INfKl?Z3K|QTpJ2fw93UwM+5_e}b8Ar$roCVD#?Oe&#Rr z8;RIcsiUSA#)V^@X<=ciL^&jV@oU46h!1`{zSoT!8AJRQo{1JLX4Dorys}8v+bNZ2 zD81$dAF*=rUo19%WA^kI@Mk3Glx<(vQub;lCwBv%Kqq4oVpp4 zR4?tH&F$m9YTRy0F*{P>;TTO6VUmdNcZ~|=o+qCp%b$x^?~s@B-ko6{TLLe}6wlue z<;yL`m7s)WS(c6kF$6R9m&J=qdB5EaD1yR2k2cGogsZ@i5m0KU`xxDWUw!jd6#}1& zO(YL@+`Hxr5Hi^>lP)T#P=&Mp}eDVo=+gbso`;~3r2d1z#q?FF&h3I+VNx&lJSfRm1NX(7(l#AT+ zJLD{1+D#TOtTWxh$yX>!aU5CX|6&V_bkI^Ndd57}1 z@?Lq+#ZjPJf)Nt3auZ@K=@vJC(5Yg8v6il`XBH>J|NM4^zqB)Uz@YO5_E;NJIf3@n zTx>cdZXkD8u)k84er*HE zVz`B)pG(95DK7Yx965YcY)}$&5A*jV+l&b%a@QK#`>=Q7l>U`P8kbFfG8!Zr#HJVb zFS5`HsYIPwC0Wds@dC!H>To-z)Ip$(!n;uiv6snqnvcH4M0%y{f}zVQzH1|6kt>0i z@QuKM&sgscn!~wn*0Y%67(REUpw_Nz;^%OU(DK&{4&R)UU|U?#*Ao+%nt1ob+~k}5 za^Gu3Quo@Ftu|2W=JMn~VL(BKd)|qB&pF*Tc+4O?I@#+d?hJmp?=U7=PtU6JwzFg+GKh{-<3`oy)E* z@`fo4vBUSUuQP>s*f73!*f()LXMQ%RWQB%Rn~o)P>GDby={4bNuYFgFTycjhh2jtL z&JZ$tRcqb5qAFv2ACl#8bK{pT{_ns>TOrjtx4^V!E7*wm0Y8VD(A8D7Rsi)qvl3=3ISY%4c7Tv?vYb92Ah| zh3O-T^OthIK$wf|AJr7d#QH8`!}CW*>!I$S+ug`&;y#;&n{XfqMqacM%c@2&olI%9 z80n2WqP(L)hw>B)OWby54zXN^3kKYI_mc#ku7AU4v{iy=ts2v)s=RktSg4P0)^gg2 zu~EG%h5A@@ldp+CeM&oI^id7snt*EiZu>i=_x_@7gG7f+sEG|7nirNIe2*2~=OZW5%u4~bj(fBZQ z>3a9<_-Tm}ku1HZY0fS{uh1*HYncu zB_z?$R|#54)ABIDqeZ3_`gjkF$@-E(Q-Akjw;2(l{*AWcnA6W^g+=!C%y_sFsTK39 z4FAYs6<1K9N@cXtEiV9%EVvh!i{pwH>KSI4OTVPKbG^EGNbPiF@aNj9xBZlD>&hUR zfDhM?!qbRJGf?2@aFay&DJGN7tookHrkOgbHA2q1F>GCjVx2LeY8@jCxDQ?(IDdUo z)D~!_vXa zHU#8liI7Fs3D^Xi-6aW8$q%ry#(#2ICO|5c-=5Rwo;%Z{(Y4I(iab);WUV{X^PcJM z>F()%XQFNvCV$AHBi%GqmT7=U{D!eHD~8}Cf3nG;bq^G-R6C|@&QNk`{PcARu78Fn zlD-KF1C)&2lh-_?~gA{DzWmnQl5w!lz*fgvBh0= zra=*Hg7Ki+>IQ|ZywEASnlJ*AqJnZPl3)%@eT{Vq{h75E6X=Zb%^aR!QJ3m_$6&$f zl_KnMG0Bi}3I`@lO1VqDw#6?+URVbX{k+BelYIZm4d~gNjGcr1ok)GU``v4aT1UVt zP=Hg$SSUHShKoL1@@>T;h<{BAaFk}UjDkqwinmIfk5ms`TTHpHZ79;!4|Z@#-3a}S zP0d`Geo9=;2%GR!Y6iPiC~)cVsA7Bv%2$kY5J&(UkN;4E5Z5$NE@i4NImr?Vb#SDf zNVN>h`updRgLaW@KdxnTp={7iQhtx0>w{=II=6^FYsfh!U z;LBbz3s!@|WRub=zlrc0C<-0xYt+VPll?I!@xBxRK2ItPvw!b4=KeT8|C`96J3cI+ z1dPZ1E*8spw@ndt44Ie0zHrr_nXY8(-kg*q4!&*uzv@U71>0xM3xet1DP&&(K8XckEByXKcmh19EprV5rlzvKs+CqM*_MXZ2xJrj5 zyznecG3~%&01FQ9<*u4nDhCpt7Z%#2 zQPmhuBj~^GRLI9S99hh3Mx|SW;^DW$F*HT4f=k<0FC$}xw{dj^vR|aW!#T8H3+td1 zPk$eOECnLf?F({$`DA9Cb>#Q$hzTNT*vTyG&}O4e?I*`_D1nY+xa1w|FTR5x!-FF&;>iOM5c z3qYhusewSPkwoPnaGQi^i>99>48_F z+}_yA&WjhXnq?m#qg<5X2_tfw{;yw-FcmqNE59(>F(+z=?uGB;$x3ka?A^qGBLo)& zctc(y6-|0U&s`oTQ&dwUj|$MNqrTGCl3ZWGAQ#ml3Eu}Bj3EkBd(m)|PnCffdVgYZ z+`g^FvA?0!t9LRiknaAO70+3ibt`4gtZ&9H#4M8eo&&K za;BTkb%~RzlCn%vD{}iYa{-au3xAzwpqQYGYZT&QL7WzIy^PSEVpZ&_s3W(C7IIW6 zP9Z{i$oK$X~5q}2Xlx8G_ zmM6e*5(u15!$tBG{#-VxZ|7wna9(o>1jxg&w-K72pg9ttWl62n9D{_o_R-MB*mr?D z*Tqg??n>~}X_i9hGdjLVl#f|Lg_v(j2NsJENvYsXVZ*nU8ZYJ6XGRn?%Nf`d|3%n( zB*C1S zqw?GxC~$+3AZhl24B({)&0vzEr(6R8mZy~qwXG8|Zl7BCvX7&rb>hxl} zNK~2It!7c`KesoVMWr!~UxNar{kyo=?N-S^N+8(K6ljutsPgkSs-IL)_zR6c3RY3( zn*+K3Gxh22wkmzP*8MN4Pq)6^`m*|T_kTkLK25s$$2Iz!^(QP(v&7ca3<*Ij6Op(K zzP?x(^RE8($-9MO7=KlWXZi`R8<`lz)R=b-4)u|Fg2iW@{Xc}Mzf|1OFPgOE%enZ^ zjE}k2H@>-K z9U__ylUme)K{}&yTvR>p0JnqH*aJ$wbMF9R5<=ogxinI~PJd#uFa;81k#3{u9dqv^ zf=OZ^UO~X>Uw`{qM}AziI&`B7W9kH#VYiXlB}SCHezxC}w|;hKwEqOwH#@jjD)3sY zDf>)#Z$TbdgVPew1T-4-@g7IYOG2qR$&=nidd3Zx4@(rsIwFY1*}vP#dk0*ZlQDAg z)mQVT7kA0L-hYDN5o|A@pB6k8r9Q|qY*raSD%WHP?<_cB9i0#8UOIq5v}jcZ zSTyH}_wbC49dnbz$Cbi^r;!zjpKo5IP2r7p-lc9FJn%ok=#`pGRke978

1euZ`J+&)sX(6 zmyd3q6+fVZ){C|}?T~#s8J?lTiO@i$g-@WGMn)_ub zUn_5SZaW!nbaD*iSw|qmBV?JG^fNvwGq6Q~7TRIQGXqe$gMd2e+47X|r0(hXY+Fdj}u&j9NJ?=P{r! zAAjVi>(dJy#q{$1b(Bv`r%{-HtB;KFFdm7Oa6a5%tlVrhQz;3H{mpO^o9&_hQF; z7qJ7X4d~e`=VFA``Qq9`TrLj4T4=T&cA6(wM=Q?P<^3I}U3G7B*`~HCW>ob+D)ru5 zAV1LL$BGy(1~Cn>C9-ouSnoJD!D7-@MlW$CnOp^@klWp)bY$Ixj>_7{Lps4gSARgo zZnVk??vgu5^ASHcoieR7w~9=`SFg}+Wd)`6_8u4LaueUB=7P4Qnvn#|&m|CvXc_2S$GWoHl0a4a1Igv>tHI!Jwc6NitP z1`})l+y~8XpE6$;Tx_iH_C z0d*eZJpKL2FV3Pvr+*vKk8sNFu4-uk^B@d|n zX_L&PhW68lKHMr#QwYa3t?2p&t!Zm-o zL4lHpU{Z8hzty74LVb{=0ws$Blv>6#6*9+RX%;23T9eE!wv*6|`$uH`o7y7(Eg^L( zT5>5P9;Q(YXM@u>jqsH-OGuu)ZBI=W@V#JHg^bY2rlBH89EWmFP9AZiX3P=hYgg9}RnA2B| zz6tp@9bx0?`bgAkUM(-Dr%xorBCvHwiFvMqSPC9k#34OMnnvyH!y@V5&Ht?Xn4|EioIF zoX#g^`59eadK4^00D z@&bi;+o2bR$;}RNV1taOXU>1+vs1_$D;Cugj{{E7MJY+0nnjxzo!SBJ@b) zaqB!L`FJhKI7wTmD!x~u((6Ve_#XRVctN(U`aE>BEu8;$Vx&CH6f1vN@?@mDC)1i_ zgJKVGx~dB}v2}cAeGo`IM~8)v-GcDdSOMVyoX-D z>Z*0zcDrE86#FzhIRoQ=!fHtBFdpC8x(cfAx~Cb}Zn+#t7bQCyA^zELoJHLtwM)0N z{lteWm?ZvDTE-8kd$E5dA32eMqwbh_GBTg6mmiY=(;B&}og$Xeom)1yAgbZH4y|c{JZzqF&*oTQbduCF zxKc7THqsIOK8f>=CJ|Ce<2`bD`q^?ROf1iYm4sFX=Q|YzzF$Bt#JtQ#^irKiA!*t1 zz#^p~H^Fj}CE$PWK~t$dVlh&_r{HX1+-TtAKc$xIE?kS_>Yy7Zi1V_r>Np*eJ4T8{ z>7J3Qx`_xoZ>BzADnUs0_9|XOUOgL^l6il@AAi9gk1~-XNe<Lq>+kLA(TPTp1~stIJ<*Pr=&lV_ernft`$FgvQu^mn)E4(vS;Jle+p?N90hy zkX9X;Jlz*~C-mFuT@jtGWW9yIgcC@*9vtI0RT6^|*$|w&??$6>CHL#4Imw2miQ-GM zhE7d9YJqj#3BX zqGb5cH7ZVPQfatrs~8;e9dJ}i9L`UA z5keAwv?MV-)B%c!Qha6!pdhCBmU8A?8rlM7(za2}q^8}xl`reyzGCI=N|UJ{ZXLC4 z*=OP&Jc-Z5 zZT_Oq#NB_q4#$r!} z`XG_XT<%ClcMoBz141t;v(S@<;``!r(AR%as+qLmxUFgTcYzfec(`-!a$m2DzZIGLrRNOR3fqs_R*rj12blSM7fX z8?#n{RT92-pFV6sy$jNJ7%{7nl!pRcxBa-gUrVuRG$VPo-u9DYvZS?ZOWIFL+N#=E zTdEV4eA}L&{0N#Wgl1heT)E_)w{xAYRr%+fxG8n0=@`*ODxe_y2hKS?b_JS6>un3% zq8@`3-$lGa#Rjcf?wh%K#EOYe?mq%h#D}1%G7|$4y`np}qw<#~|EG z`ipnj2q=2pePSKSBuj~RnSjnu1#6V>=BZuT3VoAN_%Th}dyL^eto!Xymd<}LqB)XS zjDT*&#h+W4GmuT<*ds$n(p@xti!>wo^B!j1;x(-%oB<9|;@}Uj>%*FImevYu!fV9m zF}kL$5@#2(m5XmmEr&WLs6X&x?BW@7B%4=T$sBLX0?eTdV90?g#Xpa}i=CGVmAJmp z8n6gvbja{AuczA8P;p2wowI-Wvd&F}q>+-C7Z}Q`Ph{I=#=Bic=&#gpK9o2j=#3B9d3W`Art?iyutT7Pq&TI z)K8D_(|_NCboaLJoz9yf(S0y4hD7H#8*^evJXkl+ID~+-e;F2pGDbp{EFt4`6^rE) zJ4EiFzp@m$4@@6)-u0GL*uS!yB5n5?fBZEtOQ! zY5@fU`NCfJ4^Ds70umjf>76){NP4VzOS87k7uWyA=og(5fi$>(Jh^nT7Qel1!VgS| z>`qLdprtW_43kxA|JMssgdp)EOObj2G}%f~k(1jcT7Hyv`_Arnou@n7Wnf(*e`ID! zFE5y1%B-faQOUMxu2|>}$bp~}l{sA3jU&s|PQuuQ3@d-`iJgg65B8`U$mlf5AhvI^ z-yliIy8eB#v%6h}TGJ>agjlp+_=AryLiKQgM%2a^!L_8Xi)=Q<@np9l4-PT!(%n6t z9_~q@^t5bFJz~r@wab#9o}~$E^)jC=6Onyeml!;^`IJGJ!FrBMj7t@J@alOF5W+Pi zx>(59uaAE)#Ey>jwXO<2q$~>+^LZtrH!fIsF$V4@A@H+_^=(`W!jMFoqxwcp)h+F* zL68v^d~h?_W@*6DmK6!{C_R~588y^w<;_qb?sJ25$)C`^x1GkSf_}SWGpTQ(H1i|+ zo4;Rh~nZ%4)?;AM{b)uFkdtF1{Q(@pU8hGjsp_W59Gbiu5m_SIt_-`O7E7+_tg-K7-p1^iVX5a{y$DiQ}4AnnRMEKyB;h1H86I zctHz$l^bznAEkUC)y6ZAQvWG)mw$u-V3~he9RKJwM=-H&ek<3EIa1VPB5yUlgC*Yj zZ9SVFUMAgjN@U68nBQzB$DHK@{OK_%!XoQ3BKd)#@!fR_Npgb@bZ2&FF2b3{Yd!5O zqn(6Mf32--mVk!<4rv*}GH#mA{L_;GwDhjKN0y<)7^^Pdia@7nmKl7zm8g^%G@gI+ zdwOf0~1#Q2051+;mvOYSgln)lAr|B&B zc_|v%ngbw7q#zGRDZK)SqXjW*gz0U*@KRYYnir;yii|TK4*dOjs+^f0rU748bA%ua z$H|W40p`3`h_gRLyPDfO4}~&xf3P3WgUk3o0OD-^*;pu>?B^AcE~QN`zW#vDvJ2jQ z%x+1$_yakGS`>eJkxNc(RQQY)gt>Ix{Hak?^9$L_fk{0LKfB%Kk>6daTWP%vJ2-YX zBNeDA|L+#c#6puY$t20$h?!$&UBe~Ip4!xuB#lu_s)7M%oUhkIrD#+H)&6gEQ2>Dg z^mrb7QJi4=UQ#i`F*{d}a5yJW0@iAvg3W!b{qiY}sgHkfoCuCjFZx2pB>*g4qVo3Y zWZ+eRoSo`ZOs97ykD|B;E(ToZfFqkB*&_k5@U0>|Na6iulCXldK%xpZ-z2>tq5=dh ztJPFp2wC=M5>=(xq4bI5gNf4cib7t05z^P{*l*IeXzWW_>hk(GQQ#f*XkC7*(yp3=F{ha(Gl{iv7-@f&oISF)+781Cw$s9|b_-LAKcp{!^ z)D4W&2GFgw-^gPi#AApL`aN+e2w#xKToqy(=`j%Tu@w+z7N@Y65s@GBfJZ$Qe#dwR zbSi)R5GSX5!1C$Sy>4|udjA?}5hgT$yPx%*NlrvT0Xqz?b&modt|Y^lhQKboECR+k zx(7o4Vsm3qVQ(C|NCU&iz?_$1`y@QT=$s20@80!E)Ov|##1uqW?bF4W92T@e3yT?Qj?&U>Fk`ClYU*Km?r+EJP0I#bj!8d z`=vn*0a85ni*q?csi!~gc~t+nXR7qUkEtK#Y~+N!X*-1afFxy{B@MLabnu=B7>)#zM5SDdUtnVD$|N@P z1!s@=Ru%D$%zFuMAvPLBui+jYeoWa%Ip66HlFa4>F%@Y&8On~+F9(k`%fcsIdpM4v zx*|o5&kjgca1j(rw5G5_V?O>+-&}vso2s|^H>25tkTqM>hMFD|`lja<$(z2BwQ5@N zGg|5#Z^)avS2_Z5O*?)584dL%r0fN0*wcE-f~9#h}xM+dudNZ~1m~ zSlqQoh_@0V{XBn^<;aMrYhxl28=0u!9z;&FOk42)H3WF_tJ7z(ze?4awB>*CMop#U z=4Kp}*|jER8{h(%t6`ECzDT}#2z*lKzKo-MCdq1^-azIdg*;E~nS+;lBtBQ4DHdBx zUs{ERRT^GFiZOT*gI6Knn^*4dhW6AZsiv-}03K8V@;_UU{{H61=^VHNb8|nOIvWRg zh(@{>(rQP%v8%loo&8>5&QE`JM11?iq#pI|6Ro7Xmp3lQl~ZUd@@-sRct;n4Xx?D=ryaRvIeQdP*-J?^1A&V?Xzd(6B@b^?&H?!{` z7iE+#ewcq0VS1eOMXz|Z_p;c3iGNXySJdP>#wd{6@zu&#UxZr4Mvi|yd%f*qe{u#8 z(bsp34SLu7703HFCILCkQ|3oL-fdF&7>>$-m+}Dse{TC$X>%3-TAIQ#hUKIx&LK$1 zNryNt2XD{Y?v0Us&;rj+#`NGHf*Tem)Thz=(%F$kOv@8LPo*#$G?Me&E; ztH*mCyb}i5DZH=~qc$hQ{_q5ZKHL?*hkt&9f9~@IKU8DI#i?Lq$7yqL>ct+)j+^ka zOe0alVOLsH{)Tt_{f|)Yr_@dQNCY+7WkBhu;morQ-^3?YG0T5wRR}e~vdl}3V!~9T z>3=dtUUldR__-&j^$klT2d2m#tpaj5bx|=y==oVF3ShI027qFwR&Ayu%k-+Z?{lSG z{@@1xOLO$?yR2%BSr^!qoPW3TeCMF^w9h+C7x)pCU;3|NcWmjG_O#rum^-+s=)5@> zqLTuLLG;e=cCCNX)d*zkG!}v-k#t}ld5#|>m$8M21JX_;jfYPm;G<$0|N9T#zj$Y) zeDzg(Z4Yj8YnuoPLZ`NY^>wmIR$gn}zSzdroyPvbk=Z-wmBDiVeK=?!?WBeZeoD_B z{0r{-?9Vf~0;(*={XbJcDBRz8jo-#Q zwe|H7mQ7F?w)+Jpb_;II$Qox_nSmc-GY@eW8H>H$ce0&HdYY$i-xw z5l*=5x_adD?(0Q?Y}beQk;jjtnuNfykE(&F8+2`fTfj6?ktC1|y*$TP=X8Af6`00O zbo007wr0OJ=PH4r)>EXVvKzg(t}B_(J5z0~cxeH2+iK5$OVp2&s*3ALGcB4I^liq_ zaAag8LyOfJr4Z)(dzY!x?IQLE<*?BxlY|vGA0^*=+nc9zq*iES@p+$=Nj=H3`h0%W z3NI9|Cs;Ci<#-Cg5+zf+l~+4x7@}geF%>0TU>!%wCxfD z1w`aw8*3a(JhYPL(6*V1^Ghbo9cmGhCb9IDTTsmw6@VX)tRI3#gnd)3Q+%eu-889` zn`blYCCnlI#A}FjMQEq;cttqlM7c9{O%SjVWjp470`8ZzuPhE{=}jiOkCZxvZdh!w zOzDI&V0dIRzYzxXxwAlrF0 zqN?bB&Y!e0wH!Sd>v-)8qT5{^5~M!->;twl=L?6}WJORm%NwpY7~1RB>fwiD9R4oA zyYII_Nl$@ayT^npq&zgD^!Zo$CF3R0coX3R2<&4AmJ)^^0J%s&Z%ek@e@R{(BMD&B zzHd(_R9W!jgeYb#a{UHH(x@^UaXF-v;$I4XjDasH9UWxSH$w{7h1p5D}K>M+;J&w!1!BC5Ddcbv0g%&b%}os zThsM!^0mQwS?-xUQU5zKM3yR%nm8PPf;g2MnZ`ir_>th@IhLf7{S?k58IyisB7agp z0QV=$Bwof%q-_7ES(M_v9Sz`FKDg{Ivv zf#~B%nN2DDQ&u?g`qEpGBWPHA&JiT~=}|}%jhRv%eGZxyqMff@X6n{+=~g6vOD>-o zQgsyKdTJ@kA=M1g8ZBbAeRp2o{aT0 z+}qJrC?{Njg&rVb9<0AoimiPyM#eW z<`@oc;A+&dRaVMI1nTo`mL&#%w);^$xlWggCE(%g^tO%VRbggwMb0-VwZ>HuKuCK& zD&2|EOCv1LRlR%p^bOJIDk8h?i{+}hcjb7>Gq7jD_i($qrmBXMH!1F1&Qi=Rg@CKYO@$2{eK3fAtf6?*2; z{%-7|85V2@1D}K98kuXSJoh2j2VbzjpL~V{yyj&W>JbV4hs>WkS(oWR7>=IVeYpVFT#6A)a9fDRyVXgQSX zdvjKV4;}O04k3&PeFap1=9Wu&h}me#BNRzdNTJTTaK^v(Vg4cdZMbNVmu}s$iP}D=8J%X|y=5#-$$GZS%+1x~gwD_nPr(!q>|fBRuCjO? zbuFHpt&tvrQCV)$&2U&(S^9k5jIWWq)tR~jhNXs&Q!aFL?{LElJv6^x5qS2YAf^|W zk#YkQe^;+^ztF|X7|7y<-!w!;r5hzWCc@A9#+DuIayv?l{+G%=wP|B$Wd?W9ka)@! z)z;5ql^9~`C$-w@5gIj}CCo|Ysn`8>56+n566X)4`M&RZFLs{13eJ+OI0wuZ_I4MT zW&uLR3tviYqqTNJwT-^DC0OzU6@ywjHw%!fe+NV8xi9p|DgzAV8%+tx*3lD6*cM(s znRE?LxG43tce43=j$68F;*9mTd~!_yvy$krv7g6B;FWRH-rF^@4;3oH)508EqG{1l zDLpxGNU}fDpHpKWAs)xo6`0<%+;qLwH^KpF4lu5)wlU|ZfdMuC`3N(<{MpL z?%?3=B1ym7Ke#MiekF6qL7q_tuBgfv; zWga7?L=^7lqmUd$WW=gBnVVG;mn+8p@AdL;Z043uS+|39jrO+DC35P|U2U&(f0?7P z3-rQ{^}+F($08L>i1G9O+ASsI=2;^R)KA!CiOdA+3Jludk$e0l8G0?h%IDRQy&?az zcESv_J)d!82=I&@&PAx^JDszriwCinAKMd$nm~(#(}x=yr@@^Ajg>YyOMavsZZ2bk zozj#5Xfl9Ul1)@1NvdCVi+Zyje>HY2&xj}P2-(}!b1ptIRy+T7|K%TFNk@R7U`W&f zLmj6l>r z;Yd;>YV;U<>?YxX$Ts18x)1g?=QX6g>*f6NZll&ye$N$WszSeY&GBBy0|^&YiHeWj zN6?zx+Oab-Y<~F0&1ogzjU_R5%~6jy=gTyGeEa^z&Ot96_3ORKqrOa;tU>%_AZxtJ z5-n&RmrR_oW3}btro~}|3arUp}EM~zhgi4_s;v@TPGU3eAC|uW-mHu9yBy}rVC9E z%V;9(xT(@;Ub%0(?lnMns9TL{sFwdF^)M~zsp6D$Wiunot7qUwe;0Z^nWTRuj|gC1 zC=Z#%+|huL$wOLRIijn9xjbZA?jR`P-EV!H#CzLk5tGu&xws=(5scj;#Cj$u47bZp zlwcbteBginWV<(K14>WxpuMv)`J!SSa!}`^z=rVcPN8<6TE-YVtp^}lHBBB}>*Z&n z3li9(OzgbGKX1;Df5Q~iR_e&x**L$aejANkxNZ!W9cv2YpfuyTX zdQVB;lu6GgDppnEP?bRAtO_-CXf$Fc0Q9K^`h2?vaw9@Sf69WMgyP?oJZ^XB{HoSl zRRehbIPz&riS*@c;9}&Wf&KZ7W@BpOcxvUtSt+fvLSxlZ4>sO_ky`pO)gPT3_FCQU zZ>-;>EgZv;gGi_(gIq(IDf0q_hc#jv1+suA{brc8f_;fa^I>cQZH^Rj;!cEm@nvD?;H*e%?QkL zY24sFud_Vpb_y8#aRywXy6zCFi)Gj)@y=aj5eXZe=U?>lmxXEQ!FADeYwM_pxRQ+1 zk4_#`*{|6K{Vs?_qYU|0=t~7V_~p|B+{?+XQLW5~f6uh$Ep*oy=q`t(&zl5|xx4f?GrfwSS^c^0% zSd$Zn?#}()q$XhkL=DLs`*?5+WR0OyhqU1xCd!8BH7F6yKIk{AZRfP6BLFGy2v@y! ztXyi^e@K%>LZ1S`E(fj@RYQ}mQ(Kj@DBPtIp8~ElKf~aAkEnj;YMi~;cC*D+v#fTn zSypum6oa3xw!RwWXZr45y6&X(8dK=nIQ9q*FV~~zn)y1x)0KrG zHE#PAs0z-7)%Zf5rgZG_F(5e)<5#L9zGlK zU-)Pz_u#`1f$BgNtmN?bb9PWl!{869OS!8HwU)O9Q!h-?Ik*@)w|0=$A8dC{mtxnV z*KXZ<^yt>DLcgJtJuRXF>aQ6zej2{)e?C6C+lq1GFzJGe5ilwo1G^zO_7Z9`DaoM# z33KdRYNcox0QEmzG72W1JYvP$c*%bjZNVwOCI|9v1lXoR*A|4@ok&s-ViZ8f#QtdM?nocvAK&+Se>muv4S@x$ zeysb0_b1<<93Py%e{wn8A6zX6qCy&qm@tc)4C_!4zq|FHF27dI@?$@5kI0F(Mi%2w zFjFaCY-~bk`fWHh8|`1*yD;Wqe>dH7lXIouI+aQ1#C7fN56$f#$cEQyZo7~dVF2*) z`!``aNaCM>U9rfJZQR(mm21LTRD5*|_y`(V`LV1MtRf&4wp)kVJD28COrH6Cqr&Fp zQwFGhUbtxyW<^6!3Uq$>YQw#hI-D$ZJaqobeUE-P7#zNyagoaY0$-&5e;U4^1#PT#v^E5yU-UXnRPT7(R zOqF#59_1@ zAlGXiAi&+0<|L4DNhVbZe_DA0fR;1ljna&#dB+)K>FtA8t%HyWLv3iB3-@w;<9)A9 zXHFMW`Zs+g{g4jf$VbV1b$FGXsv)>h1QEN-n?;`#3(Y)tl0A9V*+>ro-tt2pY4>oOGNp)9>WF7*eH&ITc zWj_wz`1}>u7)pRg!=bry-L!x;LME8@y|T1ppyuBqd58#nVIbM{e=JP9=~T4p1r@2!O{8`;IN@qDWBQ~`-iDTTHelpK()G-BkTgQJ^H zzS=RCWdCarnr0N@Z(qA|xKH9|I_Z%*G32`uDW>#d1FuO@e?ly1$YYwA;)%sGbf=XR z!ion>!7@wgYCY{-imc-XQ6@tSvL)uOiHeZ#jglzm&H8O>g8AY-+d6Cl1=u+X)Hf^U zA4#6++t>;Ve;Q0J$jw=l;u+_PTa4Gf%LXxwhE`mFmURR+R-cCFqfaxBvy!1tf3dT& zHRG(j^7f=zwJ4y%6sy`%r~c>J(1I5ky}2@jsBgHK5t2cD26|(9$zb0WyGu#-OYltj zK!&=a7DNZ6;0ptRSP~RNNqNAmvcA}i8&wbUhkdg{eJ3F;J|V)# z#g4+mD+4#e4WTTjRScES3*kmNY%@sSTNieW;UvbLapAx zA3)Tdl|~Hw&J%BBP)*i3)pws)Q@vsnZrOdngS2m?dwwjp+wkivlS#y%kqRt3U{Lz_ ze=e7JLp=|9S`$DO&9YSk&pK_Gv%tl(KSB5_1`UqB<2niY)MNDc@FQI?dLN!zrX4ZH zjuZ-_rT8}OLVU}3pvIH$I4cH&6=?y|-{23UkY534P{Pc%mgUmZG)x;0M7A^xwHRSa zFc`X6hc&G)%cv-4vP$T7kJ%^lmrY{-f84VjN&V9y&JKl*@rd=g8eP$KGFBO5yQ2FB zK;xA;mlOOv#YtU)!hi4ID|){xbh_GiI<RKa^o#joz)eXvp) zC)sEf`!DP=uGO;sC=+a~-FvW7f4m%9r<{M1-i^f_hC13dVI#xo$->zWU`l`iJh1bR z4MOeZ1f!*=nFhK=Ay4qaw9OPCJ<8aX$VyG%-T1OGqV(=A6;#lJJ zp|g%%*@l;&4ed3P4zKYQAAh9@&D{<$EV->_yyWu%YkYp7Opwjd>t29 z^5_7M^edO5g7y!1ht1o0cjN17$F*EXz3pnI{qK@d9oZmx)jxSjmuwkpDb`@pRg8rk0^VW2W@?~ z;B(e1YU%JF$~M)DgRDf2VV15e16rh9)d6Y<$lk6e^6{Gvt2SBPYJT> zp*$(kJl>;LS5+Vg2A+1ei$#_FkbS!}S=fv1-rkccmz_)^{y06ds_mQY+TCio2r{wF zbSXZ!yHusJ4(5$en&M#RS(1WoRi|6X&i;1qyR-|@bMg_~*G(tMOrsfoKMm@Ld#3jL zr>YqH1bu2+lTSz1^6ckt>2x`= zRs|N>dbKSe9e6me@C@>i+f@VNr5#2yU)j`HsnRaoX*L%qeU~S+V2Jx6b&;m#9>gJw z^MCQtQkB1?cVUG}*Lsx5BZRVka_ z$GOh0=#*_%SeGbxRjY`QVx*Brp?5a7K*; zh!0-^DME~Kf1`#)L6J!@#4Kg`xBH#%ez*Jd?R%La$>=M!N)2;+UrwJseb(oQ#OGV` zlVWt#l{^PeH#I8F;ZJ>bB;&-pf!U6q7NK(uL}objX+#FjuZS#1p!81+7=C;D;okn} zY84 zD4;xi#u*}EI89Ecl92sC!SaX-it$;sK}DN80CJiGax8eF!9rN~kRr9yqgr3Q0(u2) zoM7%if7l2PYmCyTR;$Y=$YZ(Kf;5j%iV0M2Re8)$2AVDhNd5Tf^u)K@#8!B2H>}Rj ze zPmD)XG@_{a3BLhg=4Y)+Sh%|&EqU_kfw3%kkC+Wl~C;YQ7 zkB*+pSEn?FoSe3AI=00c1z`PD`)J>|J#AeXjhm`lVqg|F1}{*77$`|$96=NY#Glj= zVQp+=pd0RPoQ3ESJ~WTn?@I|LJ4d57gx37GHn+g#^#!C3u?6E3Tl*Gi6 ze;YP_jBQO@sZe&L7X94Sou-sq){U>X*_{KRR*UbV8g5=-=IQk1CcP-u&i}&6vdGP61e}rul zj`SO9xM*LdtL@8_bq@V6p?20CD!t6s;hP>Z?lM7p)$2D@y`EKF{y%!{D$eT#^5_~d zNEe`upIhaN`=@U~NVonh`D}eM0yHdV4}*!sempd$kSn}BmOlURw_;L0a0IsGcYIcI zGcrh~Hk<(k|5Km8)c~WH-?&{Ee|byI{(}<{{a`}r44sYib|`ob4e*C55_F2LG^TruX%mA=OOOKBOO(F!+D14f9GU^Ik}9N zj9Jx>EGK?#&FC?df0bYDDS)VPnAXP*t9kSkEWOEP1W8@aq68K3hdPji^rld!&QQs! zm$Sc(K4#;4Bhkyn7uoOsN zxsKkVw_U(uM00{@qB%yiba=0C* z5UkNO_3E!vWT`En95_=2^^bdpz)RmCJjuxCBh(oe{{u;T= zERJZZ(X5d51-WMIxgV{8)AB{T62VJ@P1p`U*!#|=_-8*a`f*Z0XR%Oar(m^TacG~T zQ`OMke>|+cA{o}I%LT`Gf`Ls&Gr8UI9oTFyP}CO85FFz~g>gTe{C@m}kzxk4W*hYU zSA#i--Z)iU8-apPuZ_gE61koN$kZNBkiNd{SAqCFP~!*_n=v^}UR@6)4sWdhti$GLRDYjU?cH^gwC5iPX9!zZHd3*q0*;04Wj3(il zM%3}n$$$?~&Uo%yct_4nmi+b`EX9NUSDWVM6h0TjFlj>RP#7|02yOn5!zm1SXb7V; zf5uU&MhWoU9&O9|v&vJowMRRMbGWMMb+jkBaGtsn(i*IJ8Qr7oRFD*E?= zI7;jnPw#X+@QD7>#gMJ`yZv;%%i<0D`#oGaejIOJJ%Dmz$bdz4W1F=AhG>Y7+2~sg zrvW|v!yQ3gjg2)@fg^#LwPFDvpnua;&We=e}O86w*F@1 z$!U#C(i;Yw-KK=^al5sM+nbBfR16~T5BHvzD#9L`%G5K-xq8Glm666~;hd_mPKmU4 z8xATPI14J?sBKTdEH`LmHEQECYULC1;}UXs_8Uv9fl2k-Rt@P$u{zIE(gs@}rQ}#G z2_g61pPxiQJIrOE5tjF(f5;{qHJL59cdba8f0+$VLNgI%jOV79 zZgoCNKsUBc2|AQq+4&=Yu^pXmzZ#El7*j^ZALZR(F;WcLJkTp9Z3)ZbTf(m0mH%T@ zfkli{mghTBa7*p1+&K(pC7)q}4Y3VP?K?fTte2Qy1X6*IJeSm(oadSmHNgj}zr4O$ zGmk|bAjt)tdpDmMf5rmb-2)XBng}!r)NT-cA*VO35cAHq|2f0BwjmWREE`cm@Hwqyfb}n^Dql$Zx4#ldakuMbhM9J+sw7!jZ#G#QI)4!2&hps1de>=J9TNEg}W*r*IzK~Qo z-7_XnIn1XX<^IqYS@R5}!VW?LBz?P=bY5HHrOV4u5DnR;<&(| zIV3AhJo}+kfBd98*Otp;c7~1lY#W{#Qna&SYce7#cneDo?F&rHTn1AoXcGT&E_7NK z%ON5lq0ZG33rC5MJG2E&Vi z5!F5sn`94o@iZ3`9->Ta?nR z59J`j?5_{8*g)f(x02trd0JZ6NvUIeH=c>Wqs+kxd)*Kvks?91Qwd-MS_NHR6I-@m zXDbZx~DaS>mpw-zB{*JJ;l5g+~In?I&k&mZ*gUyrnKWe{@;H6o!rW=+JUz}X`iuYmh z<;F6U*$s8ZC59*Uyn|Xv4Vze*9ZHW%mBW(! zpkgk?f+3Y@7$_b#is_zGZqBLVln{=>QlhkUdzmt?@fGKjb#zVb-R9_8UoFffDJczp zSEHyzfzN&O^hM!b`l6(OXZOi~s&S-6e=8_|;$>J$($GM;Jj~Ef3v_?|K69xZaz&)n zv&VFNf*m_2uQ3GtooD6%U!BTIQ&e>$`1 zslP|(7D$LW&o{2D53tx^D$YqYthg8pS+$K2hH#AQlZ!e3G;XhN$uTQ4e7xQnyBbdu zNM*(=R~#_OG3#|9@u zEO2qw!YNbP6!UPl7gazsyIAK>e~{MBhc2;_U1Fy!W|!LN-uHz6Eh|x zo^~-p2{>KxN$VN^3IIDsUmh^V82;CNF&o_E7$KiB7|+wfQ-gu!7hA*&Y5ZC^jWx#u zXS1v0&2^PBw`CP|*G4#7-UE_J?v+^sqqr|wz4FH)06Jjxlbv6!1m5cifAgGGH5~=+ z5YX}#?DyGhlw-LA?=^tTr`R7+NIhkW%bRAQ{~YW>0fP6uwI6|tME4`UrN2}5VU081 zSw7~7jBBuOZ?5n~Oo_5&jh!m)Nwp>3O6sk-+iURp&B`jbFkyIzr%OR2q03u)|Mw!2 zt@P&A-j?CG9HkZU0k%oye-*8m0;QbR;QJWLMgU>{qbQJ3xM7kqws;k;yC===6z+}RPJfAY+;vP*{22qq#d z8`GS~=OdLP>N`BcX4i?b`f=`=*du`o3I<$rzQ;{kXjgd|8BLk9bH~83H4ukrj30x6 zq>7pSPNbqTXez6fj{rG!-}?zQo!z?H#=SwxLPZLau!J`KX+a>d*30UJkS@Y6D)CZq z04jtk=R&5a7J9KLf8Thi`t;m_$L8h?&IMu3;e1CeW~*QNsl6eCjA7O z1Z_QPWuv|x>1BGHugM3Y6~$tg&Ph$EPGhNkQ78FV)u>dMe>0(4_O#|A!GalU0rc4s z*L=YGhIp+!n#i<0Yt=}LI2G7F9_H>bDao(ZqO}{lP$eE@<@w686E1GA&)HpSZN6yQ zH`r(FujcJFeRs_Y_n7X>wpRPj%0~RFY_u;!YlIq2A0DtVzTUJGr|Gp3N#5&p@`Bw` zcStFRaOtllfB$PbTEJ1OiUy(!f5B^IzwNcM-~L+Z52bdxbf%@HmDlZa55#gj0_fSI z0-6~nYIkpoFZ0w z&~qgMsX%k1SgfbTlHA^UYOUP(Sg3xYx;Fz2qK4vcr zxw61uf5k5^ku|HNd2zdWR`3%O9ZpER`0(faR2ejmjUKaGap zcSQVqsow=TF+L->q+ZA3+TQ=4Ayw)TSCo^)V_S8VzvV=YX*ugQlbEmgDI)!A}Kt)5tE}DBcrIT-lL>okVjkIVlSqVe=YfC z8qD0p0NU*-T9$sC?Urb{1%G^HwlnWW3a3mAGvZNlx9V7j!TrFo&$5Gl7^UqcA~xA9 z#_J{BKQ(EjlIJ>&*kSL*_U_(ymE`&OFXr*c$3e04A2`(SIOga*yR zSC*1z5^><-^$s?@DY$;dhmfYQroEtU#BH_OF#YiZEYxtnG!3|SYQbXGGdElgcV9h! zvb~=M{viK?)@qbyf>z6vIhx-_jv0nLF+R7tmHdaZ3EQy?QSpNC#neE=e^HPplV%Ij36Sf~FXS6v_0QXXuT@$mBS8rzW6LTbKjq-R^ry9gobvm?;5Ne>BEk;bl5z5`yq6 z$va=ekVyf_%Y3s7M5JY+|IQf$CdwV9$lVPN1xRWlxT8O-rtkWG5ir$Q1TeLtdIDdR zM~$45S=!YkvK?aVLbl6sN(`19dlk*&r-r;%XuNr&De9~{1akn8WH6EYBXhpUbI2<3gS_0&QUe~lBrk{~c=km=VCI%&75#)3_D$98&g@8o?;4FkG-p&H-(8Xds> zp7T*B5Oi1@!Qri7=#UxOq3G}?FgpB9I69mTNQXB;(qRph4sU>^!x@3;aAs&aYzC*p znc(U0b^vu)hp1)I*}<8^0gS`rB2U9e;GVoWP;78&OhxTVe?kEDp|6hq0T@X`?X-wl zS0=T;M_A-vFN)-)BY(^Aj~RaJIy+CPfRqCwv`b0ok#|Y088qq#fVsOr#=ErDVwm&O zc8q{Yp6>5G&(P*J%&beTnhmj&3PVm%?UdTXrVfSGxeoi0O6Pr6B+xsdC6{WXc2Uu` zy1@;xzo^ZAe{$kBN+(A_U2RCeVYOGfTK~K)s2C>*o+2UGO66;=%JPE29~?nkOEt2} zl4vLIazea;nrv=j=}j>Dfx>M)EyHb%Zs+**3{f$}R47%co(`d(tTkntf%c1Uq8uhu zZw4;D+qB`;pUA19am!faSdmWNDJ1_RXF3FvP!E-LfAogET zdDw?=Sk%Tr+wx)Cxp5fKt|sTN^=g#eO+zd0I=&3c4v$p~tou(0?xHGb(1$fYME$|{j{3?bO7E0}*C?kZt3&_@ME&Xtfh6b_#W^fm zui!_@f0#<1qRY*oeMJkcbS&cH^v~B$-i?p%6s7Po?fLs}zAXLdVgQJ(%2-+1@(47% zMh~Ym34n>y7X?6$(1B>3N0_eQl~pQ<$xA;VZl!6L2iNk~G0_PA?c-DHWaS3D+>Q}_ zSRyObkW{=JcPmM~_mwCheQ^2H@4AZAcy#d|e~iD8XF+5{{D>XKqFsqql?E}W9T-Is zy_Kh7A{?qF$`fK2VZs7i14bo#+FPV*UlfVbMs=OD_K>)AA8sK`#$6OdGMaets@NV_ z3TX$vU05mB3BE$IMl^)tsHK4SDOfC`NYTmF=sh2($!|6C3l2rW8vtsxLMzERb|%x* zf2yA6QE0^Zsk|z%mTP$F3;o4Etb={F2x*)J?VctHnjNfqIxk9t?rh5W-_4LQsEm)} zIuI6_!F+|CDVVRMah=0;wBOA@Fq~d?D%A;JOd5*SzJShG9uX)-t85W4t+E0bwu)wb zsZ%$nwYy1X2Rt;A!yk739poz$3@p=!e|Vv^_OzpLnP0O&0i@>)2L$!?fpyS)BL3Zy z$E~nPl}XzYnM_??8HO9srs7YZ3^$rowkA6*uhWsb6bx2IE$~(0Le4y}Kz(=_iGJGk z{7Hrj5-vrqn7}_x)Cqf&_MhmJuHAT^(G7^kbP;ehGLf2@fF(O|g zWctgED4)qmB30KEPaxpoAw}KR2}xi}9Ay=%)pcfme8wSa|vRSs1iE^rUzZ$*JmVTDTOq99|JXZ|3n_1 zw4`Q0-V<0EG#&jCrOi|HaHq<;b~+FWPdfC87Af;Ru&@+rvue|ziP%D=bH z=lJ)gTXpZJ>noKU*6|r^HKc>gD#92)V*iyw!&){dBzaIzGVPx#1Lrne3bD-SfXc*7 z(hpbyvSVxBibVN%h%qsl4p6y@XJH0b?5J@thmb@a&X1bwcY)@C7`cXq|M z#l@DnRp;pZP$GU83F2pxe|?VPA0J+%sE@K=<;+hny5M8k#hCo%p1G9%5H`3^ z0(|Yku2&r?>5E47E<~YZK&H9Dd3P31WLHyC$&l$7>Z-VnL%g}1KVkIdtIGak}X=Bk&f(2i#Wu3n-Xy736&W+xuPmK~;_-K-$>!R}e^2ZqP>#BSC)l;4t2zZznsK{F zF(DYQu;-0j^)aNT9$lf+q^p9wlj=={8X=QRXK)dUfhbWXmbr_Km|1@GSY-{{kw zunC|G`sSUt+c74;Nv6*;dfw>)h~@2c%6FF11o%gJbfJ=i&vYW85@iK`Tl9NM5#60r ze2d?Ff0aIK+UBJMFBeg4Q^p^0Gsq7c2W&yd=^_f}p>=SY!!xDe-HHTmnON5V7b8td zP0d!ET;e<`B?<6LjGQO$-d<46)9pBnX67!^u|N?0)ftRf>epm3;+QmXPt^u=;L&gN zg#ov&50ZtWV<)yRchHzyJFX2n@8(OcyD0S4e-AJx9VIDja`lUD}}jHrz-nvx2M41^N%LwH03 zeX@^Qe462KjQ1Z9b65oxGF=SC(Ae}|Ik-MZkmV6alSrcEn{C)D) z16b}uG(+jAn{3wr;g5G&mQVKx>3CNye;=5yKfV>MAuDm+789R=K0w{u--9V!8pm47 zlK)i6LHC{|d2dDO-;Pccd2zIawYajBO?8x@aKp16Oxo%gaDAdBn6i?!{w+^m6)2DQe`_gLn_|)6zr7Qz%`Eq;_di5Nkb4EqT<*WQx3vwa zi!D6Q1ZnL;rWSX87b&bF7l#NLJNML9)c$)!mU%kiqc{9)C>}R8{DDutdpIsr@6M8X zFeid~AvR1d-NA3GYe+OVyPwNRt z$~;5^BR#n@h10Qctd1Se>PX1YEf3DZaXIF_V@ur_KxmKT;L`89MI@n8k;&Me#rS3E zzu5tK4XO)r>zuDfg=1&4Z^iKy*T`ARPSoB)g8$0i(wl`lBUT=*G@TK%FI#`yeJ)hb zhVgUYxgJI`2+}kYYc;^pf0*du&3=m9sMYC5cil=_8)Rt%jk!2BbNnnUUyYBle4-MD zCJylLJMKi)|Wf1>kp{(7E}t!AJM z`d|DK4&O%fU!y>K`o>bb`F!i=cjCFS?i8t=!dF)%*ZZ}v@)xA&lKR4Io)DNe?CV&L<(S zNm}Qb#yg+-d^9bMJ~zad8_vhbm*$?j_;_?`MFbHO{wkiPhI0Can{E~8d|K~6dbplS zuFzdPrB|`(nhRStRNd?|omKHvST)L7zT( zGLHx}{+mLvNd_+s4r?304VIVmw;o!fD`su)?}xOvMg3HncvdF9B^6PER<4ja`=8$~crdKmI&k4CR6?>& zRgnY$?U%f_EI^t&^d<2;k%aV`*NWjKdtN(-qmBzKf2NbTo(#Q^6MTf1FVomV|6DHp zmb$M!vt!b{6T-kE2p<6C?vC#l8Qp=YDiQYLXTM+o)-@G+l3ur@d+)BB3t#zy4Op%K zK0v|0{RdxpTRqv}+|6ZUJ+en6Z4K?KT#~U-M?k8+;CkD1Bu{jlR)2)w2brk>py#y0 z!4-io%|`Rscuy21)eJHH6@CBQowO^HbpqMsQ?zQ*Q?7Ym)@*L z66wlVIh^qqE<@F54O+E~ElSOp@e_A$r)4biJb&qZOx!#1Rk5arjKd{qy%Bx& zaV{QHtO7s?Tm$s^Uv7v*mjzsgg&*sU=Z8dqx&h{fyUJCjY+AyUE=)^ByXHt~Byo0KtY71V@I!4Ui= zs&tnv-R)6*8TwQVqm$BIowHOp#*u32>(F&}&wl{273^@0O~C#Gt6`IekE1vbWBP&X zw*4kGYmHo;ED($W**inA$WJ6t2mh*~Jb|r_03vQsxK=EhB)>Qkqm3+bh|(#iOyA2F z+&2*Ztc}Ysn%sW%42n+)*M~Q#ZW~fjg$MdVb^PrJe|we(%4XYWAMSm(@rG((KC@=5 zgnx#r|C(1so7xSFGH#1O`Fuh%3f{=iDjly55#3s8%jL`?Lof&$xBh6NSS~Qj^3=Ti zx><o-J>D`*Xw%w^U_^cv;v%VYO&yg+=3|%pCDCCg6gEXOrdBw!@^#@U5JwSiF)8 z{!3jMA<7w9xTYxU5B@M68jefse4_p^`hSB1MsQ8WIm&5E-#s&!{1dr6yc<7Mgx^W{ zS8VJLZSW8G=sMhQM^HE{ZoEMVpKfKS2FRl+3T*#&qn(FOxd@X}-cBz8+lC1jpL-E~ zx@z%PsVUYG--YSCgGngob6_1rD`sUKES*mOb>DX&#l6DsG171!WB4%L;<=ilbbsat z4er)9t5Zx-_Fmn#49+jD|4dgS4;zYXQ3<1jzX~1Q!hmVN!M&pb76d@hBJ)+$WxkMS zirkm)ZCx1^yF=#jOi>`kZ>ZhM`7D|$#!9U0avUn3-MsE9ZS<|gYN|eAkG3ku@Kfj> zTgvlPf61qdyYfQA#`*4g>SvcNcQy!v$7*z=FMaAfr?L=?1U%tzmPF*qC7;JVF(K_S zHr+o@7`q`8t}xU6J@to?mZ$qe5Yb1 zC{~sPP|_jGSJ{nJR`JvxS9HnRfls)TV-+_c6(u5(1FWGb+5=GhYt3Z2S8~baH{cms zUVpc!Hw&W@R5FohgCC^bjTl3>yo!FZOUj9mT`DO453QTYuiRG;~>A4 zqNd7W5P52125ar=Uf$W|TFgf)#b>6%n@C_}pc?i(97Hk}F)o$?X-=4iJtPT|P3d9` zUbB_#fyCdJ?t9msAmw;q+fG^!fgD~y`v33nK0rP@(QyEUVFIFnv!C=50u9>~Xn%N$ ztfOPe1}D2UmwhNw6I+yBY0w&-Xd_Hq91CjNR&-EH%0X|vH40@sn|G|GmGwjj{!DGAaak*JiD7C%4-R1(Tp;+E6rfQ z?{^)XfuLp_yGUQtuct64Jge3W%6}Rw50h3s!`sXZfVWcBsPSs#{&P(%n6Ee&nK9U_^$;7TSipV`NM z49zr!`@Y?+svb48h68?js18CETy<6v*wP0HGRX&*tK(RTQms3MW%tA47F;8^`HBq3 zp5J%|fHSl17!M*2e~m$uv44pGemG{&P1V_D@Ert0XiBlAr@!kb-cr}+p16d3c4%5a zHCtXG+yts;<7UDMGh zp2zruidzz?g^{&Y-7mc@bJw)?nw12}kt?;sc>0gmS7vImsv4>eg@0D60WGS{SV}gS z!tZgi11S}gG|Azbr1lx0kC0XgLxPbux=*A@hc-I3z3A9$g|DBjWR2#aj^Vu!hNlJG zgwlDOt`V2>$XrF#deN>`rTtAf)e7GUn(e|13J`RlQ>61YA#rUwt9Hj$w{|7B0hY7k zN5dA=t|Jx98{G3JMSuG%R-@kM1TKr%49uHhl%ezxh(!p#BF80ZeAoIqo(Q^l3 z9HqIvlVo=vpK=s9tnV&je#Kf8@mCH+PP<|N!+3Gb-QSSCGaq3Oin06xT73RIxO&GY zWBei0mdwQ?!*X52+Z19ZmSBSpN}ix26mR!>y~9nBpxk~ckI zrSKy+4pBKxc7KNZ)HKsIYD#lULiOR~{fbJe1(^mjD!u{5J5?s>)0HbS^M8ZW>)_Mwg_F8kCuvq`U7)#Snl_h)n+j73D&TqF%| zC1{g>_ps6I7$cAUF;PcZHp{TOi38#5{lco?eV*Si0<>^bQnuB`oIpXfLW3LMj_|fr zh*GdT>VI0VSYq<{q$ei-lJjhDW9#K>)Q1*c8s=mX*xY0Htefg_WU=*aP~B!?CRVea z#YYp_Zu1Vre5;)-T$&OI3dlKsDcd{9Uc{V*)_Jq?KDzDBoSiT9c2PqIe#+#%A;!4k z<5>6Cn(si0+<3D0N`A-En=x9{6y2ImN#%Z^Wq-~Te+`e#+S$ccd$YQ1mN{*f+eR0= z24B7TdeF{wiloT^wRwc&;*V+ble$dt@}RPCSY-qM8JB=);!Q)zU!uQTU?=Xtzwf-=uh(KEr ze1F45WbpCs!CIN|Y1H0E`5HsyXD#T6x)Z$h;F(T5=uRUm$eLZ!Ll>N;3(o2-JY@Qm zddRez_`+0F2z>RG>nwQ7T(Z`U4I8ux#nhC1bFyERQumG%&I9UMXXsh(ob?VgB@Qy> z(Fk1x7nxP%51qqHL&yynJSxQn-W%18WPde60QyXZ#AK^_MrWKRD9P|?dZc$5+<5C2 z-|(m0ueS*^-@PpJk;O3gDsB>7HKRLPcNdr|(D+8hQ77Zpc3;0~|B7~vIxSyr%r`=l zkJ@tL+vtXG-=yEVX+TaGiI3$qH9DAGlzH!u?vCys;s3$y_ZF(=Cx+rv{a0^tZGWFj zq6$0!JNx*U?1^PYWV(y5wT!4R(ifP;g{^~eo$t&%QD#K6wVMj}hi z>5Gm+&0@+B)R8}nJy#4+WLix@S+Ps*=%!{3M%awkf(R8-&rbW15kSjEQ-n%bO0O!V zmzJWHL;&PVc20UM!lKOu%;covA-IOC<6(f3&58W3`r9Sk2k#`+xi8mgzP4 zNV}qkZ47hn1OIJ&+fVCuTrZrU7K^!_-@~Cl*gh?8)e2kwLS37w0Gv7yC%5bRVyo3L z0?jO$wf=NNTxG77d5CE}+FZknNWibKYHJiLA`0^ z!7eVTw!9+C99Pb=BfCtW9^3a#B0QZG$?;P-AYsm7d=5yKPYNQ za|A}-`%P|8E~8SGVWN0_0*<+NKwoh3@~Z~jXM?u+_&tUWlC!JWOLhiKu(uf7?Y6<) zo;teu@HUOFnnc%-b6SN;C^3-TSI=V5_TNVmS${n>hp;*qihr3XL@~s)cF*}0=#Tfd zzmBZGFgl5i?vA{5$+>s^OZN$N*((kvdleRMsTA|$b7%zsULpH@_<1cG*cA5(%z)=f zMEwoIx5!1QT1A?jN#fpyptmw77i|4Yta_6Rf<_2`^1+MPc)?&jth74Op~7czr2}jd zd?@CjoQ|_t5r1VAa(|otD0>a!I76;9zE05>K$K!I5_ePG(oZUnh;*pX{?9DmCvqctzHkj)quLLLkK(XY;Sd3HFBlngieOc zQj6}068vI-OW|8R%z?H&rl-8`w+|u5wGpt+gvB_RB7fpFcP}rpSNX4NC;Il%Ulnv$ zA`jMgUTz@4wDV!L>3mqVg6ic|GvXKolJYEQ%c6`IRiD-jLzxEerBD+bBb37}0pKc6 zqRX-9s^ML;Ye2*8a|KwhxUo95UlS5&=^QbmY0Jt<5u2?BBG!&{YzmYjo(f zK_ZwXbARw86?3^89U};=Zv5sIpPr_Thljy1Rf#;1rtEmoA+uiG^j`pmZwpXDV+I}v zu-5CuUu!=69g;xG_FItU>2>nvwINgla#5QSBn&alMXhcU5F2Y%l4 z-eG@w0*&X9{gR8$;tXs${nd@Lr84^8yYDguuUU$qXfx03$bR`p zf1=SUVV1xJj*(~AYT;S>Z}P9TD~jd_e}CS8F)o z6bP$Pb8_tKrZ z=fTvU_hK9wX+zDUh)f6}u*|5{SMv_va%tryMk)?WB;LT{Do)X|>|(bRez*4v#dNzW zVy>#Px@--m>F$2Bsp`5sk$f>sxqo)wH#ED)%UsdS*@|** zjxAyC_yejs@lB&^$44hDTq9V{4EJ-pKi{6e64pz5lV!GBWOtFGCUseCN> zndnEEOoijj_#fE>kS{E}j;>3;Yf8tr$IwD+Bw3){Y=FUk*2>5e5s6Fk84m%fuU2!# zv7DUM&1Si*yi_6Ar9WTKP9+S98vk;!@0+vsTRmOrgaa=>vEFYP(|-|5hoa7$3D1q~ zt1Vx5xmhv2K_F0a6Hyr<=O!2^`ILV@8+};U$NT|p3SX6oyksbT^>l6jmnPi2{Rq?l zOn(c0L(NX@98oxJJi?#pmI|OPqLaTHI(!ZwUU@@S|FtYpzn2E5^2OK&M(uH8~Dpqn{~N1gV6)j_-k>{PF`9mM;ZA$1MCgKG>Z0Dq&KidQXN@CH~@ zcl3{1>1F@sf?`rS!lq6dLD-E2qI28$@u%ZcK?cC}oz5_Ow10_v*aeih1zPSstx-d@ zWFU|A&W}z4!IO5hDp+1p=#=)fub-yIsD<5{F(_J#sb@Edqm^EtFM4s^f(JJX3IWS; zXnB9Fh>!B*7s;j zMi4YyNE3#;`zRp~2+aD-^=p}XWW@Hzq52|Tg#B2&R8?z_c#`P&C@Jk?iZCotGL(c~ zo_FBteJ#C?R!M1C0GFrH%%BYWhK|5d;95PcPpNAY+JCmC)CaI$UO^Ta;tzAZY)Y=BOI9}`lHfmFnoG@ENe^hSys<-V!3#z z&P^*aKX~vFXD}v+{oS+emv?!R$Gn&L%Wr>w4?hlp%jnL>Ls;M=AC_Q_uZ)!kWPeKO z0%L;SP^eBzQy{8Xn%X+0vq~RBrB&sBeir<>MPheto$vfR@A}&3;XC(Y-h<;L4L(Ly z$mz3Kd*yqhOvQv*rMV^*6=ruPA5m3f9riNfa`^Ua*1dlfOMKpZC=(I4s*{(uhzqlf zj%220Pe%Ma_~E>b`70Gm$_+2SFem zz>4>KN|guBqiHHo{*zW z+RB;<*E9v>Tm6B#(_se;+T>-XxN~3vMZJntJqo@SZ0+pr4yzMHLoxxN;LGHSY;5DH z?zx^IW0qsKjG9Y12=U9kO@GT#0T5=1Oo!vT>AJHvv4{sy+nCuZOHXYtv+?@C3dq=A zn#`X}8g5)+*=$-&;HylNPUz9(@bBT>d1Ar4&o$e2#*7Jt6gBDv#n;4#@* zX#9%2t$(!(aF1Ajh!tIDs_S$Sd5U(QaBnrG>`>*4c5$(r98|wwmd6l3;ed@Ah!S^4EBQ z^&Z4SJ03uB23O5sUVm%qmIvkN%vR1)sSAy5U4q?Cy+uuyb>|Xtkhqh;6vkK^)Q}#Y zd)>tFSM}W?`K`^3RBdryNwIh07r$n#r7#|qVc{(=V)AgwvQiZU$`gRS8mQO)qoI9| zehhj4$WlErQ5_XeLExhL>h%4D^iJpVFE%E8Cs9(qkMxs1;(xkG#|H>DsJt0}$!sS3 zf5p$WJApFhkon}}M>S>__?j4vpRpo7@ZfN)lfhMyu>aAlf|jXlNg5@R_ytsH{- zul#cD*)Nx##{(JxCzrX$18)<49}$}5sUueorDC{Pub$gKzFn6)$O9#ROz-s`Ux)#G zX}aF-;{#>gwPpRLdMujX9fBWH92U3wC`@V_9Zvv=8ry3zgfa!rlKv^`)Ob~Tkb*zk z=o_R^`MC61=;)nr*oY<;6<>Ol|ym(0q$EddTJ)(5q@wxqSEuw2i-lC6> zO@oPVBM*jLCFbQSM!9i+^#)GC;clAc$~UAwJN~3qT5=0R03;Me_8e$YkX_ts8?A*O zuE@5ZBegoq`cJIGoFPD6up;=9$am*&ji!eS$ik%VRz&}+%=f}qFy9N;V7{}pWR-lm zx{(ezp zeZzUby4zb4g$!IoE*pp84IQ?naHNv&naL(eK+On?S=lg-e#|Ga%cO?{lSPn8J_5Hz z))ENxT*NJ0Yy7GNEW#rX%RX5~!nvrqH*;OQ#TFIy#XLH~78r(I*Ki#0t)%61n{Jy_ z78yMo9E>jn8b20)_K|ivSnfe17s83F-YFMzV(X_B$8-x`C+#ae&7lcp#NjJu+9R@t zU5)L>&YiW8NT7epv8f*IMceOO$#MDS;B%HIRlTZT%A@a@4tw@+c&FR6U0So-J}up! z+N@L}ZY7!O#0XLA2`PppXVi3cKI**Zi4rYf8p7Vmt0|K&CuU5X4zC<5OZ^4+%yZetM>VND+wUJx`<<@bT16|C|a4()Cc1 zW^O86loB(+vB_;p@HxibP)xyHM1YUs+4MHk!=%gMdxDcJ^xBv2O}}Kvi<`dX<4~1$ zv>9`)Z75!9b;c$xNs7u`KfKpO}@}omgBw{V6CF`*)mRJ%CQwgkN7tMHzLe)mF!u`t3lJUkzROQbcBDL-#)B?tdZLIF|`*i}d$o zn9i?1F6}fcRDWxjN9U69D^`9=nA=+s`5-8N(1+cZo>P1q#!Vpa_YZ zdDAI6oy}jDUbX@{c>BZIn3MItLVH$?8wklDF@dCUZ2|e-mcLU2zg`5pV$#JDgkMQ| z(5M^~St-`Il;2_E-L6)G4R077bu#ZwSAX*KpczBdeR)D`1ejnZ*`l zba}aoqAz+*iK+0~dRSoTRkE_n`GdXD=K652XX+BifBx8^%`$Kmu#Yi%vKzyiS zB@Nox4q*(88O0Uapmb$`2mBIr+t#m?F~-jWAT^tY(S z`J%(mFZsthb6@ZpZp@gEbGk@d2 z+mGo^h@#xWAzMGLO$i%Hq6Nim+jcW4Qm8koj!W4pnn!-yl0RUZGDCyabO*m(GGmHXW{m4{@caKpqaPAIs#=)LKD>mO0D^AH%mt-%XB@ByC4!^aQIzpVPRp zueeXJSy1M;P~4c|dN!LQZ|&~nV_Q)X79-uOGkua`^E108?-8C+FK5L_*OU-6&r?QCfZzEZp%<6&u1#Y&UgeRlhKW4!rg zi-*B*-FS-@Z)4Z;`I5j_jo7z{G{R^$(XJY+XR&As5XVh+UR^cX{4%2b>N~t+XY-on zo9`hensFCAh_U!<&&d!#ah{#U0nYcIJQQ&W1lNW3o;=*$D`|gg=#0Sw>asu9z@c1Z zFPr{u2U&Ynu&Tf{?`)-MreHi|BQReE%Np*4_hsNR_QU(${H&n*fC?LJ5F5KKI|v+t z0CqKGU&$i2ev^}|5rB0(G=Ny!!zy^aI6XN^nN1Pwdzu}FufU(ZdOEb~e!OdSik2gi zh~pNN1aDD0&G>&g(1H1Gr27IJ=&AT;a%vs_?()z_BnBumCCU>x8N$8IQ{1Na>g;2I z-{?dE>i{=W*sH|5oHhs#d73a5e5rzvytk86rzg0ngVz670}N8tF&HAVvvKxB&k`5v z{!Ms5zPmo@9E)vSWR_ympu<%eOc+0zEBy2X$NtR85F>wK6d80t7zZOl6Vjt}L)F22 zJ!Ran|EdbvbD@^OuGuvZVUQ@#B^|nTh8!-GuyaIEJA`)@>$G5aA&r|2g)Hd}>Pp27HdSzvhR?E~_^~c>!I=#%1v4oQVhyfW+fU(k9+&8r!B$+TLBZ4%3)wkhtdu{Yma zXTul>3f9sr{i`>Nx=Qk49UpFh{iSr%4^sQ6wdb$L?}ChmyP|&O3Ay570f>*sgdf%- zET(@EhM?AF20`)u662j%MUIA1!kNZnuym*x0dG`s;Jp+afgYGI8HvF2%Ly<76X1>a z=bs($VgkIuSMGmy@DxHp7-HVDRcin$- zRSP0puWE%E#xTT1xr|8|Cv@q%Y#97AN#Zfu!Nk%SlfebIgp+9CMFF2n!@h4+RiqnyX(X$R1y1wqV)&vlrXm&Oo#T@E z=GV#iuVlP)nUN`)q%1cfAvk%w{fvL2ACvTAR$Jg2=#HW5{H?H<7a$u+%zZN{HY@?| z00NTOr;zLa96+T-0O8&iXjon=#%AYb_Z3hoRCy7`&LF0oXL{qw?)Jvj(pD@*$@4%s zU?=AbdjuPTj8U`vpc#>);%jpx-mfJ`FFIv#o+ZUaSlKikEo+1hX@<3sHavfRQzf%Keu}yS6tY^geWA3GS)Sg?-FnN&W~MCD|=_#VZha zApnaz2+)$>yG*P!Z3m3Y45@#2%)qI|Vso=FC!@$EZ?4Y?g z%yFZaJB*i1ZU99zIRe6Z@)4e75%|)l_86}&O=66K0znqBC8@TU|KfkyQPQe7J5mCM zKXxIKgJ>1P5=xx*ZC+dhXtfVvOpd`)Tr9edm*^Dp4}o%P|JPfa+Pwr!r}wa&9^E&@a~ z-H`GZ_@>q5(Wj0$o1cFf6zu%}ED9%NGfCn&Xzb=Ro&U%#=yyz&o1Ih3RDCM;FlQI; zuMWoE31hIPVDIViW7sd6#h=f2odnTGA^6PJP|hkLyF>ZYDDG}{N^+_u)=QaI-0?2c zn-bY>H2({eXWOW7FkEqW4K03my^F~hzud=@=cbnU6`mPj>?40LnYEDlyZ!lzTdO<2IYrB%-YI0;-c@)Ij5sHN#P|PEW%wcgh zmm2E@s`31cZx7VA3k>3Xz4oF|jHQ(;m9D54 zZ@7iE%w~e->q~!_qkjTJ`ukg(&z}s59!=)Qf#bCTkA<|!TDg>YM>>UzF10TV6S)^o zPPcxrvD*Om>u8ux^P*&(e9ak>q-Q|*Fg~@-p>AZIIz)p}GAVj+*C6Sct?>GA`h z35=5vAeo3n$%&YE;XRt1GBec659V%wQ@RwPmWWf9y5)Z?U@Kj1$UX;kA9S*HoPAb# zs-^8V9;h{XK7P{x&GoYJ$^ZeQ_@;~?(m8_HKKV*mvT&>1VM&A8+_g0KPRszJO|Mm| zPDLr7MI|3$z$A1Eo50k?Ju|Or5({eT4xOUL>}>JLXB3AMsMHc6Sgt%m2xDzV+pw=* z)Ywf6u;YIy$Da)@h@@(4TKSm}l9Ca`ms;PQ*bD=xgj#Bom{BBF!rZS3%Az3faS8As z6#+)spTd_@sUO2j8JY@3sFk{aEfh`6rS&8tq%$3{D$gS6-~=36Rd3^?2AgO?bRYC+h_J4AiucriqcMZj+_SQP`ea^apjQET$GHc~nq}5Ae;i-owhzuEq8@ zIG%qAcej^~XMakC{R?Tj(@X{eBoyIy(Pv(p3Bf}iMGfEk115w7Dyq?oofs;6dKjWB z4J8L3${IL+Q^o4XSolf{%B;9J?s|QJE(%nat8$v!17kW#TgJM9$=?-gIg1r~gG@(j z^Wa5{)SJ&EsrMyus1>J9-Vi0zGvk0(Y8`)d)hS64oD0t7S;i`NKGbV`#AHXLMKcYP z)Z|a)2sIbfMmx5q%QMfHc!H{A5}6qDI}?gT+I2U1N?P91Jlf#ck{I^HWn9oYhE0F7 z(9&D4E?idixZ-Vl)9^DV-DJUb8w?HYR{B|^K@5kpQ!a1+D44ul1G%$)T>h!S6 zu$x-b`}|q!&kx>J{7j}<&DdX~SIvl5*Q(YFxw;UvXP;T_4bT0Z4iP{fufpPCT&Gbq;=vw=oN?&;>Mn$#|aZ9Xl- zdJSQ(o^DD=nyNQmdM+p&nY#Y5AhCDfX*VYrv%*ZJi@1(jBcE7zl_EO zk}7oy8@L$83`$%io=^o81D7H&uqX2I#6q%v+XnC1DRpszoESrAatW9s0x!BJ#SJeZme?px%| zCjj)9hh$mKVaA?rW<ftnnjFKVZVP%!ua-2#=?f* z(-1qDW@+fp;U}<5A#m?(QmHvt-^df{TN2L!ay9u*d(g_9c_cNkpxv_YGy5-Q3A(=# zejRR)%+Jg4_vXu){qncxs^qf^d{MFniWsIJGQ$Ysr$h9|#`IO917cDvRL44^0FRrV zQmZUaPA0r*(3JF(!HJ%9l{$s%xxS9I4vK1tk;cGA}fr$P{zG~uh$PbTE~N6 z-tguJEhkGZnlsiXvJs`u#EjLtzVr$w%HrJjqWnHveqv&a4T*mZ&n`B(-p>-mLVuE^ z$K-@o()x&dY1W8NJW-mZMD}TTPG-o^g-_h(BI~ErLphiW!n|+K#e!QIV@j(LoP__?t;`wz~l=3Kotrut4z$E)Xe1&np-kn-Q;1u z=pvyrkS5Rc$_{^5NK8wm87=8%_0VzX+rbwGdFy`)_vATehvg5%6bG2Ql)lY- zOaqMwBRFV5IOpVvH`DHwX+MDHd!hp@gFI9|8*xLQWrupo=XpEjFxyuD)oxfp%>6oM znI2Lt-BWM58nT5tGRh4{rG5g)CHRpAdCSPYnX5~r_!fmPjP**sHrkaKjke=3cRoaC zDXWq_= z&vi>(uK~Xt8f@zbGkq+d4(OL1YeloPEftEr{oM`J6&JNwPD1Xl?V>;)Q9x}q=zZ{K z7omTI%q_2&<>Q>o{WsWqb5D4Wh=L_8R_SS&UYra-s{kzks^^sz;dy0r4!#?&A@wz_ zCsG?S%nvwqkN@4n|E%I**Z|Z%MvB786J;GG$roJqC141N zalaG{=lQw)VLH9i37)BnX}gMcZ(W?81C|DRNvwNbZcTjUxS8wN7>ULZ3tGR441luT zgpd25fkW|oY-t$-DwcH)bxjYA*ikb5(-|M05t4&wMN6HQ{BW8Gjbg#I@J>{0vZMf9G$H zXY&QN_gB}A_z>M0tik0>ysWA<4$6G`B_(+QO~@P5)nt1P!hQDUqnp1(B(w`$!~t8zuwsavk(eujH&8Yu>zn7Tt{ak2iDE|7elSzbu#cywe9*Yzsx^n6 zfeRwxIz)6J8U2P^sBBoYr@TQM+dSh&RzIIb?w2F0Kfl=Pl02)eWb2{}f7gOyk8>r` z^q~c!_ddai)P2$qvZNn`r28axK!$e%9moCcNg)RTL!!Dq57pp}a|cUNimx)^;EO9=_<>yko8u zjt@<+kI$CEanwv=w|3>|fAz9*tf(Bl`%67~oV349`##>1&_2E7fa-!rwOmKFFke;4 z5>P?Nr0W7mthi>mb&LHt&Y;LD)$z>yKIn|~gW+~ulyNv4*(Z@llY~2B;|PAu!NRQz zpSzVTcfF9i<)v~(@*{f0XuGGx4eQKO4~zBw>*GU>rI;fU81zRne?4w}w#UwCTjHc4 ziRjT!W1s1f_bIO`v=i}#EXQ}l=$@c!ycO&F4F_BF~&v zJ}$~IarwlsNA^#(I*)FOT3vR-abtb~d>4cerq2Jo(8Ec)n6e?s!Z|4u6rnx;TJp7X z4$)FXq{iViv#{`>fA_mR7qQ`2P3Bb zLWXIj#ME1^DE%#tv0Ej!atPuN+xTN|O7f}{!EjVlzjR`C|hHKb-A-cCxHR4B=^ z(Ug^W6FIMSp3cuNb@q6rDmWN*95Ro=Tsu0b8GxXoe^teem10;4e2}d$>oS#ZxT#-0 z!-bC~x{je#d+;I4G6+VcCtoJ~Vjr&cT76}rzj8AkWG`+#_%^qQ=BPK;)^F$$f$I+z zfVryDLGoOY!^xo9*e&1JzG3uLj%1@H;;V4IYj}#byTAQ&{BP6V8{N^!DD305nP@`* ze?Hzve}*<*HbliGHXFbEeRp!6Mb>c|jC8`3IEH&oIJSY{BuBsta6%O{g(T+#RBmpTGqg$i@naM7qWM zWFmnkr4JOTqe?iNi{3*3XA9;x5CM=|1v1-E`*?2B6rfNJF@eTyHvtfD9VgY;F<>ZZ ze~^%K4nNtABw(d{S0{;)^HP8_#|yOA2doy=hU1t#Z_BkGLXNOHL_OGkF?Wtp7S%6s z8DBCkWmeqKaavATl%yw#6pLnFCR&p-GEiH_^5*uh-I^ZhPT!*a?I*V{0b4Y%pWYEzf6)qe-{2mu-u7KiisP}*>6U?1amSs9F-~A| zVinNi!C1a*2mBy!?@4@xF$}iYiIGwNSorCzm*4%ut&k!j(+>m1{O(|R=$t%>n(>Lw zHC>EC4`37D?YU=yKbFCKy%sxCs_3Sq+#|c=jke~7TIFn$;JrI#@v_e{M%Yp3f73d2 zV;1Nn;~jjylUSFmEJ_;s1T3Q0_LoRzeBlI>)C1b-lhLsngx%pZ#P>1-N-NQeU6uA@ zZ6!xP%&?_vQ8Z;Yuj}`M6~)eP7vw`(%M2xM8R;4U-y*uVh&__BywMht3c*_1B2}j> z=o8Ez;fln)o&BloQPqnFK9hdVmjvnqECH{Eux9ewx?`PZWCC1ih-l9;Yt%HrqVvnrY-jzP7m0dDdPVkM_dO&0X9>!0U zT|9n77b~^*YBPo#o{;;6!ZREEu){CoTvkhsxgBI#y`(yaFYc6QzIdJS^eRPok|iFovPy-HWjrO4(UluMcxkiMr`;1VL#0^+HVuODfCc&eDQ zY#^vtsUJyNHSF>-x{*ib$HjHanXrlpYpY(`m3Z|*wZ3UtfXN*H?^}G<#Hs9uLSs#T znF+AQpJQd|Fuh-JJxW$)?kGOxR#_coE3AOjzgno42glhT^KlH`5SkOB>87||t#tU` zkNcjmYU6{x8{F>SMi!bv%YE@TDZ|7qyMxbB$;#hCAb$$zaPX8U&U%X?I#M9Ip*8Y# zkYJEOckOkU1+$|@(P%{Cu8wQX`rJ}~+H=7Dd7}-jMw7b0plMmOX8pkR_cm!~uSLe` zaHWJi?MvS*?-avd)fMc7VEP&HUpjQveSNQ+G8|^c$jmH;#1*?MQc%xqlHMq9INf&W z^LA({DQ522HvNA*#;H7Si#l--g%wLf6qH*R89R8%n9PUP4~@>U#mwzKWX*1WfF3lr z(?8onO>L95$n>^oZ3PK?>K!i*dSAG#(Q0j#wvzp8YZ!TVkT(kQ>09KAZ6T+}T{+%d zlwyq{7ybCAZYPjwqEd#RMj4T8Mi`G0!l>dmN%FX6xGJrYC^P1U*qtJLmsITA%ur${ zd~F~lvEIr-qbG|R2XX?~^`d1p>qL#0xo~tK+*^i**{1?k#%CgS{ z(OhTVI9Kz0mn)*Aa~_JJ^hz%^sx1qxgM4Zvq%plJ3rTI}Iwb0UNcqPpT=Zr)eYH%q zhnsC8#@Z0+w+4xL-kOe*cW*Y@mUXQb>=K*OzKjLcNQ!&fNkCzbe>=Go@)r3xPamh& z!`XRO4Ogw?Y}Zz4=d?J&ICQnhWlsLp)1SEA>ra1TzHWT(lYO%RsSc0ZUp5mCp}>ra z*9}NlnH)760<_Wil`xr&Y#F;Mk^IL@puNQ#aECbW9VvS+7j*Q2+Os%_dU8lRHIryd z9tegn^3Du!Itn&-e*?Wb?E!3AIdi3Z*61u<3b$NSf|Y8#yd%l|YssZiTrfLdfXfG0zj}Kd&g1%uaE5vK(abR_0L*%C%lpjC5Qo#w1 z)}1#<*82j$=RgM+zs!3HW3-z!o3oG;n7!&-8^w78%#=JkY>tnbGh zf+7U()&I2y^s_hW zgq?MlFe=N>ek)n$1JiDu9&J$3ptLj}5QX_xLK&PttnHb|gQ=$C>HY~<53P_}l#}?0 zm1`vCSySZMMX*=#j>jyTgo(QD>z>S%WP1yLaacsTy-eW#q0rCD2gv$6HQF^LTlZyPC@ZLWJ&Uz$W_+#^W7eEv!N96ucmkI`fs#}PA;Cg%p{%c!6&arq|tH>K}&;r-dn|g zli?npwtc*n`gYHR;QqB(X@+71))-uwW zp729ac2X+7J;({O6Mg8b)m<999=RTWZvSL98-y@7`Tap5E4J``IRE>s?>!!0pY)4lJ5*T`_P@GAzZmB@uzFNDW!?o2ghuhH&LZC(&S$ynZx8srjeLWmeXoOmbI$Y~ zjH1w%`6YW0MMrXsrU_7;puL2(M)M#1w)($zA?(YUEj}zPw>F+FIrxs@ZEXQ*p}{u* z^3*8p*y!)xpnxm>n=fe`VWDrdP`6Ug*nJ?p&Uw~H=no1((;U=Hd8gJat)IF(Pkfa7 zh_Yi*=w2~Uf8Sl7Tj2iO!YIOcV-ug+Ye$mwOv`Ze5-n=Uda_$gUN2<3d1N~T%RUTS|eFgjMf(2Mph-K|jLk*cSt`_qvh z){)=GmqzvjA%EGLbE#jsti6`9KJaDL?Za46JV>37kqbEKnND?-CalXIE3I%5>$1PE z`1)Ayr+KAwF~E91Qb2t2X!DlwoalAh=3PVE)JdF@ziKB8O|#I_G>b`bbq7#PQ(~5> z#a(iE9lgs%IsTyRDGxPhe+S(x7*x?@l4<1K;Y1Wzh2)ZMKxOS-VLdF=)8EYN>1TtCee1%H$-g6nty06#Q_8BCbbN^D4qO znat~@Rg|UEGO=Dk0#U6UB!qBo^E8Subeh{)cro5Hb)ZLQJCgPT)cm|_KowQPOTVTU z#hOWxkbe{`1Tcln{}OeUEU~^%%x7ZI`6g9F(`ao~)NiaJ9&wk^yS6&&HP%tTp^lh= z#HiLsf2VRoMfuuk5TfL3iGVqXP%Kamin+Uueg50^?7qInojXNsHSRCyrnP@$KXphc zukoC!s2?G=WgtXfHaZD zM^5-W)4Pua*Q~8H$#3ZmG5$0eFPR#Xr{qROD#&NL0lls_%!-f)9kd4>O$j>5g8un! zEaADnNI4e@qrFX_oMkbWFBeEG2WuA}dw(dA^R|%BZ6OD3AuSD+iuHAmt@=f4wFSsQ z@<{2rihby?i5<*v0WX8O4Up%niki*u@lc1nldk>_&a}1o&*tZ1;qE)Um)mDvoo=9c zoEd0VLwkzcX*h7I)!x+34S?3p9UlVSm2Zc~QFl?&H{VKHFV@=J)p4w!wz^-=s()Ut z$@z8u)T&?jS5!T-^>45Ge~^D|O>q@L_?drkDi4~N4eo9rhFwuf0AooKOX9sOYGF}O z1S*S)DSx~@-}!c?=k(0E5H@1WgC%=rdU|d>Jv}`=-F1!4hj%#-(~UG-WwHeMB5aju zeio;usIgF+%3@|`z#=;e>aA2McIK@Zcm^+Mn(o z{mGEe6#S`7nnN#QtJ{%iw1-A~-QIYe?s$;vj-lxe?~h{aP!G0gsowZtv46dB!^ZUo zXh{3}!+Zl<`oX=U^-nUtZm%t%m7_guvYA8i>1rE!i0T=;Z!^AcgT!Z(4+>TRFPHh< z+{elO8Uht=1aZ$dn7sy0P3v1KN#ATNz38KS*%8&5bw}yy`>Gfr$ZW#)HgwD|X!T72N?Dy9hSSX8Mox ze8*fv2~uh5+-7{UNe2JU2OHUSMm&oGIa4AnS{=Gtd@_fDGcJ7KR6ZxH2pIicRggM) zPbw4N9azO?{A^X5sZWVzM9OvFn#v6J2STi&{+zH@j~eaqQq3E)C4b=tLl>O7o(5sI z{yy@tFnbE2=mJybbul@cD$3RD1J-r!+(mS!kdW2UeFzI>9#p)bs$!=x;{%7FQ55nX zVI#gUKxSHbN1Hk~&4}3$-!{bECv&$6*cx@v(9~5Hp=@^Zn-NYff=HVqAWNpdC|#`! zE*ZmkMAd6$aK<=%@_!yD&4t)!>b1&BlI1GFr%qupa)df$(*T)f1!-8Y|J-rS(0(R& zP`$%ZT(9`wEF_S3^SxS{)_wWXIB# z=xP$sNL)anNuF@9iw^3vyb*Xzhd~lah>3r7goVB26KA7sf`2e5P;+3zAq<>?qTwv1 z1vss`;f1`I2qbkHQALcyiz~d+%w}pLtDwoc!Cf~QA`M{eX>^uE6YmZbni&i^w&H!i zE-s#7j(h*#ro@{qDDkGD#FkJq>y=2ZJTF;Dkk-Zfe~JqGy0}dC|Ddzd{W`uz739WP zd;JC~VDvtsCw~JtH6HJMdZvbN0DWt63#xpBqw2jl#3UDB053t`rz!$rEgX~&*QLAN ze{a3I6_xM`C48X5_5gmhph{$Tb?eQV0NpMWb<$@^#pr zsCUFp3*)s}fjcQyv0lJ%(nLykUr1L39u{Ia1OVq@zWee!_zVMa?=s_pa&d^cr5%2X z@m8C6I)BEyXe6+ZtLN;(%7daO^a&3SYV6DO3{DgY6uzzj2Zy~IGn1Ki6~t)y`JJ}z z1My78d>1LTa!m$eY(6% zv#!xZfbNZ}d@r=!PeDE@^$9Wf)2BLmQdeiD?tiEkd(~HrjZ1wVDtxT-ngo(8aFszbGBeEWjd#+gn8)luMd+0cW&=GK_*Nd=FNa4@xn?;gIq>EK z0!<-F!6eO)6+SR5U<~mdnsA^rMK0WTkPJU$OZs~^xUpFAhY{DB;>5jJ-u|1Xsiht0?8a8WP?Q1dk&3z6hCS!S`T?fsz6*1Qa zriPm^f16}{DRwxdsYXADDp?T#Y(hsd0lvZN(K~qAYx)Q@Z2+ ze&Nrpt>UWV@puCj2kEdH7z=l(uX?ENnQ9L$(9*H~YV0*kiN$g0NEX%|&?#>Moqt|+ z0(t}(lmmof<_^#P!o2qNQci#!Nou#_jU4$PWbKTLiw;T(6)%3?xPEKa+V%6VxATTP z>9XG2evh;qBI%=(yvZGz?e#W$Fs_V)0JKOjsd#f*Ytv?X^Qh4{4%}@`9tXqBdhocl z{(J{$sYo^Nx?`8&qa$^7ia~G5?|<^u=as=7v-fP+Xh)&|-vi)H4VXc40rEWs`5qyk zYS2=b{vft3Sof+b+9zct8e9%tA2>Cx$)XDFBw=B?yNpCoXUr-}f!a_8$D&hwj-Io7 zXTOe$4x`*&Q@9yZx`o~Pwbj+vvRj{pygC@HEy&2%_T$H;k*_>u>AH*4<9|&@US55& zhpxB}9yk*>Gp3YHfreR3B_$olV?rzNpb(#)jVaGxL&X+zb}UP&y-J1h`u*g+p1wF$ zUM$6|*JO5ZyT81=b_e^BH z@#|B9Fbo$B-^1ywgv)*qCx4h79shKJ8==mSD;|sYt)Xay@^ASMVKAk;i?ajlEO2kC zp(T{*{Q2`aVe30J^%Cf}1>rkE-T$DP2165x>g&C71M6Lb?!z01uIzFgy5@~7AUx;; zV~O8YFph>OIq{9n%{Ptcc^siu{5CCIjQZL6@kf_%0``5MFE~!n!+$1kARUAeSKwyO z8>$dlgO(4E6Kv}vEk1>&sZNE~q^XRp`koBv`@u0)|#By4nb*eC9EAszFH+2FF0Lu)xen;>$-S()mkj(f_;-Z<}nzU+Y8-q~cq89HNb z-iK-=`>Gfu7R;K)b$Pg^d3Wt~Lo=2WRJIbxiNn`4?tPP}R(X&QZNe_r9_(V3korTr z53+O8iiRLDu7CHg<6$uC9N!jZ!GL7MD+iZsySpkbl@KWk2E9%f$?P#Tg))>!Gv7X; zia=cKGdWL59rUw|&rYq(XIhKY4w2I7234e{bEJ0akz%nP8Qn8&n&`V!6Mc|tqVJy2 zD`qxC9x018pV;WsR^O%CYBkqZ-|e(Oi?g{NGd<=^lYcH^)SWc7<FZFKVH$6GU64qokmv&t(vQKez4i=vZ@RzDw^)r7Wq^(xq9QDdDnD&%B@ zmC#`m2{vm*#X%G$^&(g9mMy$#0~0G7J85dK_lf=?>Gu&%1ZtDNYNW%T$Xz&kpq3h> zsc%Rs1wj<3DtuoPi%Zaz z65coXL@POvU7A*X+{cd)hw*wSu-DK zn2N^&h6r@o6mS=(!P~p)lCElkl$bfZKivH4j--FsRQ_=o3{Iqx`%DfG8$ zKWQupg{O9HpKd1G?0u)yr=Y|met)LWjh+=+ z5jiWe;$N)`@xiOq>7!>tD zz+FcN7W=R12VvEZ?IT?v7_U7fo4CFgpF&HgcSu#_r3?a1#n3@6`|1KSGa$ z+fhhgaj`%MgMHM#YIkcm5C)AV<5Zl+wQ+a6c(U~@RfE0FW4EgyTz_-o&1$OKxP>n+ z?IVH!@SV^_@#7oz_Ml&RrJ65-n(j__Lu(^xw?=XI_CkZQ#A;tQ3;=J|ki#5aBIg|x zD12AS$f+w@Mo^26D+&XoaXje0(w1rk7(16Ss5B}6z(yShHYUMK*Sx8bw6`mf0?c7} z-C*CC=`Af=&Taw7`hPnm^2vM@*0fc>&}{t_zlok*Z*Iy%h4sznkn4>d`BCvIUrAcX zYu1CdepFdU5GXaXzEId1J1DYh(`UMq{455s)}29iFfze(B2&g1l4|a$IC;K@D)#fd zTOE_Xe0P~fRLc%*V<{U+`E^p7G10)y6#-*+4VCCQ$29Xb>3=XLmXafa7@0ke87N>b z+6&2qPEbVT<>Bxj|MXBct-1I!UayDh$Ig$uQ`rk@T94w#ElXGe^xNoSO&J zzS5D&W@lG7H={50ymKq&k%j;%{9xUQY;^c0-NjaQD}NxJ*p^!7DzvA@#-DTRACsvu z4pxy!as#7=P+_el9v=>JRmAAq%5OML>Dkw!^&Z58Xzx01!zaZ=W4H9Ij(XxOm^%R2T z(piZy`+qT#_}9maN(qsFbD{HPbKN0ntI}3}&*7t9@ByL>41(%CCLe}b_k0+Rjrn+k zRZth2NrGCzRz6^1s{_GoM7DLdsL2V&tr~m+th8lXVseSEOKlpV zOAgkzIS21Qa^y!;E0)O$%G4~Y-u^_)v-e>QK=ij^v%J?!B)YYQ&CAt(V zDL>Tx*xV%5F>M;6x%$+CX(&dwN9yF?zyAKXTm=x*^4&5f-YEKCX#C`}{7A&nh?>oh5Ziv=dgV}=6}q9UIg{q5A>acF5cPrx&pk}R7_ChOYn}KWJxc9> z%#lF`O{tFB;{l_oJ-iQzTbp48>pLT`R)?$9>>uIVB`RUyXnJ8_oqiN>ZY4Z8`WX(- zX>93{!k==i^i<}aaD(>IGZQ^!&JtoKc3^g^{jM8lq(+R^sBo zr{05*^G>)lbpPSe+b!4djc*?gV1G;#F?*;;Ui_5d>^RA6mUhi?C+%?h;_T6(>r}~H z$(v56EuzamW8@!w4|%(0JY7zQLH1E(*4aLnqh57jPvwNd1i^`-3LP15tzU8!dqetO zEHrB;Dw@>U)gSs77d5zI7K~r}`% z=iJi>#(=wFG_o9ut)w2mZ`^OHSb%D2S4q4k@%^}ziD@1N^L$MQOCC%*zceSX$E;I86cd*!{t zorybC3{P${ucpT5rb~Zzf!F>;wp;k^55qp=t#iiHD~ZaRARi;4ITzhL%u$ z5y-1cq+)I)FwhYh`0|q*nS4OOC%Zj^)mQ(3?{ZO|O~1ncAKh%`|9|q~ah`sj1eJvH zvwYzPu8jKQ5(AVh#;#4wrXK;)v4(??))g2~BO3Xm^pNp0HuR(#i6qT#n{HKw`c5^| ziyUYMZE0rno2KxwQE*hnp}j0)Uz_?IN^#}=FG9jE=Fli z7d6&LDqLxSQ^x$eWK5;cEu|0P4>B7$SCi~WA%uATN5$>BptD@(zQ4fo>|iU3%4kiF zx9dTPG|=M2F{XwQhgseT^#KmA>3kTk(o>Qhmu#Lx#tO{R!+!-MB_p87uxevDu!I99 zR=4%0i4Y=+_e8cJ->rRcFEasAvkS&B=Ge70UxQU+osrX4$Qs(WvQE8ZYH(_4ONr?d zGN%0#C@&R# zv-=9rphnFUGJiU;W{Ujuc4?;ce0vO62E)eJVj7iJ9Oe|@>J%#%NB?0pmSOAdgdSRY zYTZPQmfcAD;CUTydoHirVsxHiTXAsoV-Hqe^(QO0LKAH}uOKQyr{N0Rdz7P=ncS>3 z!eDz=2|)dRMOTrQfCj?|8rwk+_E0joikGq_IX>lsPk)DH=(D%Zf4k+o6$dc?Np&2P z57V(-zRVtxTwZWs;&+CH8rZVRmWV+f7vL;fS{Z$Gk1^7Ha$+|%s{xJcE_tK^e<05$J0(%r@3yx=po3=^UtqXLn&x6 zHRPZiVo-88?m2NpJSHhk5pISu%@BBT2aTWRW`di#Zn=>A6~bfemtIj_kWFpfc#BZ} z0sUVIf$ctf{-W4=hET$HK6|#sIp{wZ#i!4U7k|%-l^0KB3-R>P)|dGkKkkw%3)pbM z@zO?MHu13V#XQ;AMcB(_T)qZ};?dUDGl?kwi!BLHeUo)cj0k3-Tm|bI9z1pt_8XwG zztc?>f5%b^g04>k84}6iG#_9M^JBpL2^9rK<17ycUl<&Y%>~sUmsGw#OA03o=)D^O zz<+HoiQ@AjP*hU@4g~BS*t)j+lNFwn`FuN8V6$0knox29f{kU`jxzcE3?qOotD2xH z4=E~{8LuuB3MRkpAOHNjyk2VxASxGU>OcegPn)vrF@*0e7|SwsA&plT95eIggJZ@^ zi_H@T(>Xm=SVq{BqOnYaOH<2sEeul|YJU&|b8Z`z^X$B519Q$q{R|O0R6GxCYg- zC1$R544loK*DTAkXHcoMG7K7~j&5F4M-8LMFQz(BY+0l>Hoq&jpMQxZ^MCde ziOB!Ut<4utcJFZgY{6&<>rO_)my%T}&T|i%8#P;lcAUfp3<7w%-Sgq|FeaenLTmzi zgqz|zULDqo3lA%m)#B}@3a5(6Vi!tlW@QG$$#2{yWRvnV>Y>Q|v2hNEDhbxrUBBIU zI?v%=SEVcDw>F;YoSZE)*~}c`8-EsN|GgK^3*26w@J0?6HvUYAC*XNq??M(z1UFAB ztF~Q;6y@{+3gwCbkAdd?JZN4QLfeK+u3r{9PXI1CLY zt+{EgI;-y5`il0XD;AKH&(!`VD`;)sIa`4J_?5h5H?V|}=qsMRdjNAC)PE_$2~83x zb5ec!i>Dz6&K_8RFI#?_*8viA=xQ9(h6g$+Ll~MT4eK*pQS|{>SEx{XDYu6Q=!8Qm zIpgA^;Y!n>lJXGCr!Z(4W+|sgDDW;2oxD0RJpec8 zfZi_}9osr#;kYR}u)(3^;(w}2umEyJC0NVc7={Ww%0kY3DE3XNl1W{i$k!dopUZz_ z4a31a1i;ur>do>@4#zx6Uh2#w%&Ek+29D4q6i1 zQMlmGw@WOBbYMWcTeE{V!4XNf2PL#lS-Dd->d$NJ$V1IZQV7BrfmBk8s@Lyl+|_A> zJ1OB#GH?fJxWCoFm5&}ICk;9zhHQ?>O}x)_o$_XyegUm+8ho5>aYz$*2I#U;Un}2= z#VNz^WwgjM8o7vxNq?>{unG`|c;|QPi(3JbG zo0F!1d%7Ukx{}x$v*lu}HwfG!WH((KPcewQVeuP7=H-GAVALq{v!cNs-G+e zMRM;F^i6!IBG~+8E9{=T-}0I$JZRvbD#FTCgmPa}AtnCthHyqL{G-_1?k^~=$JNzG zD<1UlIvu1~U0K->$n4HGHeII2?FN37(VO9ZC-Qo801a8cen9pV#P5g{ycOO1!YrsIOq)Q5p1In=CuTNW8$RD zmBruES9vRMddvv$0mYIsinM8lW9?vvmjB0+NzU z8xXDZ6o+Ng9M(35qkVGz^`2NO0b!d|0p@jJJ(4e8cQ241VtE$wnV-i|@B_-LxmU z6>1i%o56iAMlPv4GDKh5sP)YNB6(n;fJ{PMXMeUOz0YOL9A|XOLO=ZY_lFJg!D}q7qGx>L=2PjD_SHoKQ}2EEe^e%5g#d5;sRnwz)t>pX4c~0I zVt+D?5cP4uSjHfleA;G5o|ok`k6uYIZ}I@NJ~*`|PDHvX*2RS?`J2-6|1?%@llnwn zW;k`HcO&^vzaV9aiq{WazqXn81}pEl82}~9{X?33pC&hg8Z4iWL6_v(thy`LcvdH}I`ulGGd0?s;ldlMezlYMu2b=R?;A7H{IS1eGKv?%ibDky6ZJ z?4RVT-USGzaHfD6o{@*RLdu551m94Vms{>7ZsRlO+}@0~Hlq{8fx2*Q*?PVcSOEvR zm-STP#>n#*!xQK+rYAw=6EzuP27h@v+fP4;$tJF@-ttqPGuMSZ{w`%w0ltvQIB~0E zr7&bm?+Mft;bN68^BD_O)LWPNldKR8Z}x0mivP;BYLv3LdE+;SE_I2V(;C1`lr2t5>gz9vs$zxPND?Py`L# z+qfv(KnWoEVg)pt`HqExP-;NL;h)QSz`?J-JC_KduQyaN9XyXdGcX8(CP&w zTNxmW5HE4H5H%0l#Z|03JH2jH$A7y(lx0G3`OMWqKG#g@XVrr879dWEeGI{fv>4 zHm77~UDstw(gXur_WwqZ#_s7LMblQczJy=VN6G~e@y+d69Jb}X8?(BxxRSKAdyokl z`<(!Rnuie9zyM;S$7pfUss`m>51dDRU#Yz!-;29gO<92;|%*GP_(K$ps;RY&| zuCJdh2eFA;F58jMzOS+T$H3Q>>tX;cU=K>LCbV|_0K6XPmV=|z(+=?@ERwB6&Dsr6 z3RGi!)c2@G1kc8aXMg3caoM9ADR=eUYTI=ovGbXENh=cH{Xt}M{@v02lga6?JzjH> zi>fD+1Aj^H&oj7)&)j9w4oi&Q89qb&&GR%@UV-XrIR`2Q+Nj?{y0C4t3R{cSSATHB zmNSg2)(e`^=h2NVoEd5UBB3P{NHg_nXUb(n}1rE2&4|r)fyJ+-XKS#1TC9{ z*2_L%IZj09i$SOxP87Bt%b#$jBGikkBOyfZ8u%mit#3sg8m@5FdM!;*=oikrj8HPV z!=PHEIwriJ60NThc1=%|Gn9GOhB7af@7{$hvWf9l0l$Z7hxR{q?&piS8hXX8-Dxvg z3#~b7(SK@K_in&a3xO7j*(T$IU*9bW&)FNVgSirZyS?2^e<1pGBTthr;4XG$jg zwhPC4UU^gTULlZG?HQ@HZvuR$5hs_6rmA5l#~J#;YZB2jyuA{@@$%s^gKd}8VnyZ< zBTfLR0k`bq$t1eMS%b3l%DXd%(>tNxU{pz0pnoU7@-Qro`WfC!k~}a_z5ly&MF0Ue zq!9-SoH{-FV*UB{_U_gT>6&?v}zjH1Y|9`Ef8tDHVg0A(XYZ~%j4T0;f?rf`B95#bUadVbP`&Qg1H6cSlI zX@a7Iyh2GX&QvR!i<*QtXbuiVjfbi@>wly=B1nSTlva!zN{dv&+YaM#Y8(%SnOf$? zJ^7LR`D5K(+5S;H-Ny%98>nx{lSED(j2As^42ok_5fdq8+y#%f*ZVvv0)rNc&<#5v zki`oN$+u`_#kpOH6x%XUTS01Wd(|fYLWOrq1W9HDM;--htPK98_2O|}8JoNVQ-6Q< zlUtG@s4ThE3BfBFfm-8=@HU$Z)#tuh99{aYuU%*uugKhA!JVo~qiW%;PemA4mFVr1mepi+H6k5k?Dw0@U=U-2Nmonc(^Lh|8-wZLtMI9t zowMq%WAk#_*4JKyhsaDYUF65d8-K8S!SoOAEvodb=8WoTJ-p=#qU*tk!gfO;WR8E5bkbfX#&ipx| z=_dQI3PFk z*nlm#_3dXb%-F1Z7{&T^XTKJ^)~`E=G$DT``W78_Xv$9<-FLJMA=rj~Bfgr?>hd}Z zPxN%7SY9`|K;-Wl&Kmig^?z&p=h%Q3Fg?4xvHP^=%?tE<#b9l1uz=FKFZwRmb#Qd$ ze~N#|zxJ-iY9RhM-{Sh-Rlv5C0_{;xDaGv(VQpDOJ<2JRmFfx{iqB8)CX>lzGMR`cgJbaqE(`z8r+cTUyZUwi#bM{TcXTK}_kWx^=%rJy;zBSP zZIiKMhD0u3to(fa!v#``Vq);+Aa6>QU+?hw3n2{^aTi~aqr%cc0U*xKD)l0S<^-JvYoKciDP#)fVL3tsV^i7yd*FrzVQO|Bq)Qit;J zM($ownJ4nD76aXfbAMZ1+CcBiLSX+d8|hp3r8DW@%>_y49;6_^Gegdh-&JeKe||jZ z_CH4}p=su)7l>BYhrI{h{dH4VU`*WAy`q(zoZpVm@}2sji;(EmI1kV7r*qMwfKc#1 z*_#r$&Wl|a#&^E(6?!182}NYa*x~2cM_1knd9S?w$vP?{h%9XD=vFJYsqk_k21{E=zN#2@yP_&!D%LD#t1Bv$w81 z)c!&H;}o1^KU{OMBhuG=0sm?HzKmPP1?_~UCEbci&n%-eL&G>3+n&<5l z`oZ)D6T|c2sDE(0EkhmsNSb@RKOQ?fP6S(zHW56Lfg-@iev-VozJ+#`*ILWuuJ z=0m0jQ(S#UahqG6jmMiZo`~0mjaj8N>Urg!-^$|j&h4w0 zNkC3Qo&Ldot(bU9T}C+=AfUHL5RveA5ReAPA|GMOcz@shXE*J=tJyjXYRyPsTxPTW#N{_EBF?zbZOdLCPI zo@OH4(p|;Mi!mTi5l%Ffw`0eBp?^DePcO^U2nXhlxBw4-z8;U{f8A=7+jK#)TW8h0 z)b{D*JAa8*Y9fd3Mawx^S<9g5R%M>M?v5Q$o9a&2)Z{|QATy1s<_ex z5`eRf(PRcEDuW?|=7X6b;b^m(L$5q>3)`ow%8)f~^e0Yj_;i)f`5q=Fs|XG@Bs@@d z%l<&)Mwv->^-B2%Q0`^gI=ei7!>LgMpIx~2BY&mHc@mb_K3QS2+KS5GL6W|by;pvG z45`_T&5L|+HlxFj`H(n$CamJ1i)(+dnw4q74RK&9L#NyC>t(C+m&Bp&!T)-eyjiK% z{!*5_*Z3=0as!n^&n?h#)pW-RIk`+if5iv)xe&nipN|zGdXrPy3e;*-)ko2HF!qCP z9DnbEeK=fFf1B1?TS$e7rM~zCFY2y5&Q+2Z=Cgeb^f@o-3s>YsWq+)LUohhuM;(9B z3L(e3Ef{IoBR{2+^4rLHd@^eDY24Ald!O_=yL|fUoH)yaH+(V&UT(;iG!Y`jxm4)~ zJ?u3HK91zxP>=fI7{$2OIK^eFPGp_h(SIx1e5i1EnTyJ`eHAnL$wvu75KSO^SQ`Z5 z28YwT>wIMR9L1b)O+TVrkM_a}Fir~O=miqEoaU$CiDjdTV;DM^UbX|9EQdBD014UY zVf2|F<8B8sc$YQ)ubE7kN*6XECgU>b!@f7p-Db{T+!i6F+x_=yB zLsHW_?CxYn5IAof#N>iaUb$6gI9Q zyAqK}iKH`OqYLJ2Cs+<6!}FDu_m3ickDQqQ^ex)(7c(Ygw)H3c`r~s*%r;#)FIXTFz)k-<=pOTz)nY+gNwOA3JQ^!9Q<)w zJK1AnReq>eJz-vZ^)Cs&;MShjLeBCXk}QHkzuyd?#>Ko5mtmNYY=0MhiO+dcx!O^9GBGB1tIH<@k= zriE%sLoF&gjGXALX~Ee@j>&pFM<5F))uD-yR5~fHXEXF#X(1dfHvr39^Mea4H#0$O z$fu|Bf=KJT!tG+ES%250azDKi`)@N3#-$;G8R0nL3)>}@)u3zh>ON+-sH6bcxsrm? zVL_WHrP#%Ktznk<{8%V`gH|-G$>4FNe?9UdQAZ_1c+Z_HGjm^T4*3s|8zp~tF+~X zwLCV4KXbJlF!bc5ap8$KYaAMw8q`$c^U>ufTMn)A^RQv1Iq|iQu(O&*_H|j)7&AB* z5U=RKfDPfV^a`DN$zv+l0tJ1Esqgao2BFrh;X*1OGD^s`84UEw4d}Dd?|o(?#sXXM z5@FeYg#DMK%zqADY_ebu5Uh}lF*FOq^TS@Opq!aLeuuD@ABvGWLHUl)>&7+X^YP6E z{66}(Lr0DoPrti%yb_6vk?N9&F>GM>&wJ0i-A}u+OL!b>cSAF{=8C#oXWX30m!!QG zWlO=-iw&k5o2^2|>XEmLgpPfhHKl9sAc&kHP8)HCEPo-CkFVnBzDf3~iJF-n6?Po3 zb@R?#(q7lGaN>ib_MUL!#0FO|1rnkHe-7YbTWRzY0#ClE{vE+H=N3j1m_2o6xYGO-#1e-^D=ZnzZ zQtZNL@${dt3tNKW&8J6uFAlodVf)i=)3?>2eZW&Rd)+~&-+O-C``p8D0vw3mXe{z^ zCcrO_agzhn_<@b*ri*ra^b=O8=hwHgk%_=kgnvM=vg2$j1DUxw`NsPont+lnT=3ZL zD5Kj98NV8N-E{A;bMRuX>oUT@XFT%$Ld0gD11!?0>|DnIB*`>@aTyInhUe1iQvXxe z0KHCku+G|a@s4(cuF%W|j^9v=DrE|CSawqnP;j8t=uO`a_Kp~-vT+~fNK8Ih5LnUT zMSsBN7MX`=zpk%}VqWqrS18X{N6fg_4v+euwhx+O1dN^#pNcNWPP;EPbxJ6BomB85 zcpvp=f>#NS03Tc&5dH3cx8FUKhHPd}pdgV7NY!5bB*K@j36CqUtf?uT|Ig(k|6lW5 zqGrnqZu$`+iTl#lbhC<>21t{W;#pE2v48dK7<0++mKPB42T+uJIWJT%B5z*&D9RT` z&Mk@7vm<9aB0~IkF5eN!jV5j-{olep#A0PGoC}wEy~cek(BzVfaPqd2_#lOk<~7r+1Qy4lI{meSeSfL~A&I$_ zljFM#)M)&>Zx?B9=xMU^-(=S$lwPZ_^jae-J&y%sJ?r_LGBmAF;8CA>zMZ{!>NvTC zZGqBdBr05`jDL#3so?SFOsmma3m8|o9>Kc0wXk`0>rdNPw-z(7Zr#_yy7dqf>()bT ztXmH>vTj9I)-uNp&o80g;D4+C&m2`qge0H|NC|-))+1B<&Ov+NTF_Y8%P)D$W*HGv zc%dY)|1r!?kbp#c`gynCbZLI^X*MK{o<(FRgN0(Flc{AGqDZ%tuq7T}-}yK(we^dP zSybC);>fZY8=$KSo({fRkr_$X87V>`x-FUiJzEp)7%~hsL+AcdB7X=LafnJ0_W0!3 z>C#g0&*_^d7=Gfm4qx*XQ}s}3;Fhd!w)mkCVE{8g%)gF~F^W9B(3udRAkSxd?mVd! zh&1Y$wH-5|QICvdC+-Vxr^Qo7l9`KM28hTKD9}+RVpO)lF6~oR36Z4c9a=b13U<@F zHysZJYN=J#joBw|ff*r-()pi!dh1w9}*zvP|x0`h%y(Fw0VIiUN-R~WA zaa}|y+iFxg2UIfxvq*~Y`>D>%Lg9d&&u$JF>zgfB<1db~=LojQR90mP3}+!IOUq+l z@Zu$RZl!-^X=n-$x%yhqEPQ?=LTvj)4hkG~fM~fD>kdh8cY+{tLJEK6K(173-$2js z1vsO|$^{1);>9Ge@%iZE?5;5G&J?Ijt{LT#Xr4euGVa765jlQl@}@XJkh63fAM7iL zT9)aC>+~~`6Up;*W2G{!6InI`!Ta6g7yUza4N*2VO2Q_Ep55ZGqap~-b17&~ z22r=Ks$8nVTHK0jybfHI@$t1=Hr*A@uxP0P+={-Ic*IWkof?1SI7v4?-1}TgWzdZz z(HAm347$SO+RXyRO-oM4&yHS{!D`7Oj>YF&Ht+$h5yNh$w^(up+iP+_9p~r3I-2AX zdevgdAlVa5MJaX5cy`d_hO!4Hpw*yEnyu}9Ubm957)tz)y^?kwwk{nn;KI&@F@_>6I- zl=?a{UzI^k`uvMMof74dWqlq9WModXKmeFYKJpf#CX%aat=4r8-QdWmdkmq|%ZgbT zdbRy$-kpRprK-e9C04!eo*uDZAjrBQjX-1R8Mb7)OXzIVmH932>x+(wO+`W97=hlZu!KS~*KqnQ5!ur6?bjR=M`L47ma7J&i z8E7f^YQ=wj)D456Z(u;jIdJG)-2qP&>1F1H3wBr0mx|qX-(tr4Xv9d=cQYeK*&!ClRV~NC44@t4A>xpl* zsr2GkkNqEYKt~sbZtP460zsGl+j;qxNTsqB@-@8X+n4E?(DS2*Ul! zUDP3Brp|i%11DmwcTc)8Jzz~zl>P6fib5Ziq=-gD5Y zPOF+)^r@fmS$?ER5F~5{Rf6+FUPvEV7b6}VHX7a2kv1B^WOLP)Fn&zQi8ia4@iTWg z&ZvLIMrDa?U}_y|MvO>yeC^&HU(23=UHD#KWcHlZ$+cz9ozvT=vP34i9g+fp%yLQI zTM%nDXHJ^`3HBJPeUk)HuPuQ~+Oku;vXWw!Ew^dk%G~BT%rew=JGxMB%dcl`*%@Eu zo;-do0uS+53BW2I-Yi?rW6AL4MQPtX?6QAfjnp(wCcX3i9 zvd)k4m-Fl_Qx}+OvHg;nJ(s)7(!L9|U!}*_l{DKh_;HS+csap%g8NEJfenA!+XsE= zV@KLlgQtx8-H!(Zi4{)T2ekcqmi&J@G+*_N1D|#eYZcbeTryz3xAGdmVWm42I=KC6Fk1+Hj_E;`aC}+p9NMXzj?auu!+3(R!)DjY3urKpl<@-({g(3Tc0Eee_X( zj-9t>Ey2kbkA1HI3w*t(atDJr>GMHHW|^PIx7SzjjTYR$8(~+0sS`^?YhiE>^u?hU z&pTp17~6}?Z|o@N(LFi;SKKe@?ds3THWx00GF++{{1SC-UW;Zp+&Q1)(S~&zWm)b+ zrSOuOkg}S#>_@DfA#cD8% zFCCg&N7ABfKP+I91&0efFOAH60hd3CQ6z4Mo#g3R3{uf>mc9^5wv_9JZ(5eAnr`xw zM5F9XshfE@9VbYTvp7MI3z7WC-hM{mPfoBn#~Xa!ulp?zm6JCce*k|tT7hNnWmOLY zJNi>^c8|~9gF!b9z;vR|=TE#MYQI9hP9oV=B?hXxG<6@Gu)IdOaveAb)VGW2y` zgF(hgV0kV)fT;$GZhTk9b;J;f-NGpAJd?F)cdsewR^|N}os<7GyS1I(oFfj~Wgss~ zis5ld7heA44)^6zd1%uG3oCsFSV$WVv%RB@Msqf+TdUrW(S3gvF}1A-iNoup%g`2m zkh!~Rws$)1%Wr?OsqSeZSY|`-{BwI}r;Dv!mB)NNgTU)Ty{aJ~YdoK!LDZ#D<2jsm zi`;FiNk0gv4zy`i>)c5Y}Hr`3wyJZw9csd@Bj~5^ z&$8%~LM0Tqp$mN0DQ_fmh{u#CLkFpT^@^G5C^aF~hHii6(qmnbJyikU8W>lifD?kc0TNVKPpPw6FX ztCwhOE6>LAl1A}Ej!2VjK5t_pgsr8vA|P=pJgpy6`y^Z(G<+_$$?bz8_fl0EDqlJ$ zxrmuvestIsT;)V;r(13;(Ow3(hF%_@E@05!@e+Sx1_TTd@93cq=S9)pHNRlA&5w1D zYuNXqoT)!XGn+2Td*WToAGV4ga*9M+(t8DU=Nx}{;K;)xvYXces~#+kUUR=Q>V99}8J>wW)=5sQ_~3yD44E*MUFiODykC z_uGH{EM_vi%?`*<}v)$)Y`Ut}KI@#G*j zGY~gnrH+RzYAS}lPyo{O$gJR$jY5`wnW^eG)K(DKf+N|x3%#tzU?H>5sYWOM0%CI6 zAy&Mgk2%+7Ba{v@u_Hqz5dQI{9Iz2|g0+9LMIRiQ3Kn}!z>Q82Uld?JUrdspN8{w@ zVL6k)tu~>MFYLHP89z9dO}W#~vu@`TpF&+oNxC@c?YwUD2n z>dWsez3mpx8BmCAf)T@kAdD5PFMd^CYvV>GKjcX&RReWC6fdwblrZW5p<_#d>db#M zOLtE-Nl#ip<^NGaInhu$51C5?gD=tAR*BZKClTsTwSU!e{<|kMJW2c3(>+~dmE8Ij z}{!%nJD6RNDR1h4b1ge16!8d`)tJc9bewc z5y9avq9MP2H7YbMirWvQAr88S(!YPFofDmsyNw};68v9#(CPKQqG3qRu~0mfUFnX$ zhO?8tQgxL_W6p0x&uioQmy=(DKmZX={&h`QG35a@sWJZZG< zNgJ(4Ar8*g#9&eKXr<|+2~8qp;$_0&8li`B~ORALqHN%=pXN>jZ& z6?e{XW9b8enCe7XXh&MJSyqeo@A@St^r40|W6>%oLcXfXygGbmdWGZGC z_JB{|XLdN|=Dcy3GEp8=m}c);oQ9AJ>gWYAden^-AP?m1_R4>K55-bYGibZ2ft>3Y zH=@|0_x&p>=g@x6fY5548g=b5dqLCTHJE3XQ`IZ(7te+k#>sB?eqY9rI4-0yst5HR zO+NA%O=$FIW z1-mLflv3w9BxQR~^D(T4V0c5O`hbSevaXdmHxp3b%F0@FM z8h9fRWtBuZV|uV{AsFPCcunQk=N1e44Rh!CE=zC~ehZ)6htO_X(*hhs{B{jUi>cwA z8Q@#Owp62>-=|T|%Z*Z5q*3xxxl^HfD{mn##@!A}?0Jm0)5!OF*`pU+kbs&|1ZTy3 z%BragR%pkp$AN$I-VcY01v9>Shf}a{W!`Clr;X>djDE9pZ*|^J@bpi3#DK*eOvfi` zW8$e%(gL4DoD}i4)lx2oPBX1;El(rAc{50=tpn|Ci7xfwV`pm{sau?I{MZQu@{Q_C z?yE+!P^>JC^7+OL6jxkcY*UwdKE2e+Jxb-k$@`Q=lm>rAqs)K@{jHQT`XU10P8>35 zCPerOJNTCi8ImL4adc= z5Zk3JXG8B)iIe`6wa|jLFl>=7Ou%di1d(fR;rnRjehG6hoYFbhH8yg_+U)*|_B?M; zA^X@zkLQ28-HbSzw|=8eNms&Jb)h1m56U@M)ACB&R|GBdy7*FBVqyZ)`^KK;goQKK zyqy#MOancluede_HB(VOfZ49%#j#uQJIZ;h9remCJt#MCa6a0@ukukHtf7bgY8Qh{!g5 zg4ang^TP45WO9T1B;bK#e6b##&_H2aNXy0yE<$ZzKF#_``*LK-ht`~!{phtOu)H^EssBb&q2cMNX_ilP)kzSz>xVjpHMe+vG30@-QmSO;c(SDO!EetE zK%-~?LLTH5OHjycFULvPMkNoyWhrjL+Dm_P6SlLtDLIp2PCKChzJY5pA8=Sf%#|le zt6aO`ZVxM@k2cuSltnj*ndhXR2$WfjbB@cpwDpP|}AteL|?+$-ipl_uHl5X{v+6!Sg{OAoB&n;V@epuDJ(2&tk zVkKj>-|%$m0UUGTlAn37@m%T~Z_C$;Cbkr)TMPm+0o=+VoZJ+*aJ5o5elKTEXW63j z8RAtcxo&t8Qo086V{f*cqM8rGPyEJ=UYYT~&G;Eqi)`nr2SpWMw0p72fWX=pbZp7ilt>WWq!xxqRb6X0-rLRFhjL@{=VBC7ylV5JH z@ifRAiJ|`~Zf?DmtE^o>3Zj1xm2@j@3RL6OLkXC;^vc%@!cS_U9 zASqLYFGT6$kJDevVfov!3iWewn}i^|SbK!nXpEUl1}sdbWu=lkW=o3~r32zp9i4zPN^w$325%bK9xjme0 zGJO!u>~?;&0wuN)Xy1QKOV^&D-&7F=lkSXkjl5Y%lVzlCV>9a(782;$Hw3e7n$6~F zl}?xVXqHWh20V7n2V>z-lIn#@3i5RKM9%}}rg2Tv_Nn^TnGCJhdHdeRd-S&F{bQm~ zq0_xC;1EKvztagwQuZn~1IcD*Jd&BLXNAWokqsu|=Tti5*Sha|XbD=szO=YR%!5g@<8qQ!rkK zSHlT4vBd#*6vUtsXH4;+YiP@MOx1LZ6-29Zdd9Z?lzuXREjAaV zdXkjt(pWI5V&H!RKBl`BhyZM>CJqiwk-YjL9D~XIoSzW`$_Ia)DDdW@!objQ&j*SG zu*bpC4kZZ8ndV;%oL`0Z$?D$8|7DUdI;J_zn^;p4np@zP*Vp>C&1GH~Ip3QSL%>`~qe&tKv&ywNXL&~6p?MR4mg-JeD0 zIK|4!Y=rZeyA@CGi6v6*b1qv+br)mQR>Axa#erJL@UNjqD=XEg-6?n2d(~u@;aut8 z*KZt6#x{S$$~(cGBLgXQ6JCo|ZYCx>nBQSo80F974T_dCuBql8?b4Qw?fiHQL(qG5 z@$yb(^^sBTNnX}E)I+ekN(N#1@k~5@u+|nGthGqXy^OB6Rv;*J5UGR=dD6@(PJ=7Y zFf0|Q-j!f0QM^HaL3So_7?SHqF5XCBf`Atot5AOw!uD`dNM7t1D~P8D_L9UG?na%S z%SG2;F-!p7Ozi@k{lRf9`Ty@O^_#LGf8_Cp(9QxG-Q7y{MTUW340+REpgn#GS{Cbz ziLj(#bAc=Un^M>2=vN_vfzF=J*=EE59c33h83pZ#91-Liwu~C(jmMoP;s2V-V+3`Y{!kYM>%| zaj&=Z33lTI#KFVKe?&*A{`YGg)z3{Ga9MfsG%Zhs28`{rl%mt^i{42BCcwR;5{v@_ z^I}gFLE2xOyFS1D%?c!Lzc4VDw78p;cJC?dY9(O3Qryq+g}4mp7Ru78uAx~OZ4iG+ z)<|z|_Tq3}p08+k)`D!YC7oTi)wav4wjhr!DudUY$`S359UtWvFMZKFen$5RLFtHa zLRkG(9J-k{P=Un*JBbrgdL>4QG@H2^qql!I>Z7IDgBD__hrwt0)M}SzJd;FmbN&M7 zQK_Bc_OF)It(^T&pg{S#m|vZc-Wq@O^GHZwtfdE5c8P$QFGiFGhmY$U@hzVjS1~DTS9S6wnxzgMHA>H@SeuMUuxPW=VhaeDFO) zuvHcDRY8lz+=1ZFU%G2EhKRs+e5VkW_AN3pi|>a!Dj{}KQwH?Ks{Zr*O~~NUt|r(R z2}ctEe1MM$tM91c&=zMDKVEQ1#4Q~3icgk;Aa$AUNdxQI7wU0P%B+q5eGLXD*||eZ zZawJJi3E)k2$bbw*-yOxR zzWs{ug4o$j)gk zpg8LBJCZ3XKbJtau78kJOhQ;!?eKaIVrn*h&P&-yw>d~M&tGssW5IvI81;!so7czfokln3wS}JvFYb0(5Aw0{i>C!+KW7o#{uYBn@P6dt-JrAAx z$YSjWw#Ji*YgW`wmPuk3H9kl1cmTocy`H-EmP`=NjG#&d4@?w2^))2BiX8_qd5EGKXD57^Loy+0x-#UM2@iso@nmOOtJR|XACOy&AAK|Dv1 zRMiM4RFPK`uDvfQDfZ04uy$3zh}x^U+i!GP3O&oE=cXn^d+x~r7Q z{>5lPi@eUsDlS4;#wgnP2Pv_NPVh!Rqf7YBoN>xq9dLi>rO$R-E1ivcI2QqnGv$7N zyW&lYfQrN`H25SlK64OOv)kO5g!2;&Yc(oKTtOIr4kNivGK{gaBezAORoTMbbI;<9j1%73pr}oPR-)K zBD-ED{HuS=dbJv9K}Mjh118xZU&%WQy*xhDT@jwljVlKcXMli(r4OZ9%N9D`cpN7) z#xMPgfW(irlfWIqc(n<2=jAk2pQbm6;H|P;YRH9iu~YWnV+`<=Y8AI3@*5rRt-(=}zFfgQ;9~nI|cD*4e1pj7K z1;I-K(ZekPoiOQoD%)?7OOO!Y))z6;Qq>1g!V5U>Zbo!�I{dzSZ##w#BZQs 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⁡Ki1txVS>$3YaB_@jQNVo-EWz# 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 p-~V=ui}@dFRBh%z^x%WU|J8|u`?oD@A^