• Re: TR util for DOS

    From Kerr-Mudd, John@21:1/5 to John" on Fri Dec 30 21:36:12 2022
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Fri, 30 Dec 2022 10:24:29 +0000
    "Kerr-Mudd, John" <admin@127.0.0.1> wrote:

    On Fri, 23 Dec 2022 15:54:28 +0000
    "Kerr-Mudd, John" <admin@127.0.0.1> wrote:

    [[unix]]

    $ more bin/rot13
    #!/bin/sh
    tr '[A-Za-z]' '[N-ZA-Mn-za-m]'




    tr.com: uses DOS int 21 for fileIO

    [100 byte version]


    Only example I've tested:

    tr 'A-Za-z' 'N-ZA-Mn-za-m' {<con}

    example text to unrot:

    Onebarff Znetnerg Gungpure!



    Better^w Smaller version (94 bytes):


    []

    Now allows >1 space between the strings! (but no error checking)


    Now 90 bytes, assumes that at start ax=0,bh=0 and that cx > lth of
    parameters.

    I think that's as small as I can manage.

    d 100 l5A
    1637:0100 99 BF 5A 01-AA FE C0 75-FB B3 83 B0-20 89 DF F2 ..Z....u.... ... 1637:0110 AE F3 AE 89-FE 80 F2 01-74 04 88 86-5A 01 95 87 ........t...Z... 1637:0120 DE 80 3C 2D-75 08 40 3A-44 01 76 E9-46 46 AC 3C ..<-u.@:D.v.FF.< 1637:0130 27 75 E2 BA-5A 02 31 DB-89 D6 89 F7-B9 A5 FD B4 'u..Z.1......... 1637:0140 3F CD 21 91-E3 13 BB 5A-01 51 AC D7-AA E2 FB 59 ?.!....Z.Q.....Y 1637:0150 BB 01-00 B4 40 CD-21 EB DD C3 ....@.!...
    q

    Wolfgang, would you like it in asm? here it is -

    u 100 l5A
    1637:0100 99 cwd
    1637:0101 BF 5A 01 mov di,015A
    1637:0104 AA stosb
    1637:0105 FE C0 inc al
    1637:0107 75 FB jnz 0104
    1637:0109 B3 83 mov bl,83
    1637:010B B0 20 mov al,20
    1637:010D 89 DF mov di,bx
    1637:010F F2 AE repnz scasb
    1637:0111 F3 AE repz scasb
    1637:0113 89 FE mov si,di
    1637:0115 80 F2 01 xor dl,01
    1637:0118 74 04 jz 011E
    1637:011A 88 86 5A 01 mov [bp+015A],al
    1637:011E 95 xchg ax,bp
    1637:011F 87 DE xchg bx,si
    1637:0121 80 3C 2D cmp byte [si],2D
    1637:0124 75 08 jnz 012E
    1637:0126 40 inc ax
    1637:0127 3A 44 01 cmp al,[si+01]
    1637:012A 76 E9 jbe 0115
    1637:012C 46 inc si
    1637:012D 46 inc si
    1637:012E AC lodsb
    1637:012F 3C 27 cmp al,27
    1637:0131 75 E2 jnz 0115
    1637:0133 BA 5A 02 mov dx,025A
    1637:0136 31 DB xor bx,bx
    1637:0138 89 D6 mov si,dx
    1637:013A 89 F7 mov di,si
    1637:013C B9 A5 FD mov cx,FDA5
    1637:013F B4 3F mov ah,3F
    1637:0141 CD 21 int 21
    1637:0143 91 xchg ax,cx
    1637:0144 E3 13 jcxzw 0159
    1637:0146 BB 5A 01 mov bx,015A
    1637:0149 51 push cx
    1637:014A AC lodsb
    1637:014B D7 xlat [bx]
    1637:014C AA stosb
    1637:014D E2 FB loopw 014A
    1637:014F 59 pop cx
    1637:0150 BB 01 00 mov bx,0001
    1637:0153 B4 40 mov ah,40
    1637:0155 CD 21 int 21
    1637:0157 EB DD jmp 0136
    1637:0159 C3 ret



    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Sat Dec 31 20:52:35 2022
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Fri, 30 Dec 2022 21:36:12 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Fri, 30 Dec 2022 10:24:29 +0000
    "Kerr-Mudd, John" <admin@127.0.0.1> wrote:

    On Fri, 23 Dec 2022 15:54:28 +0000
    "Kerr-Mudd, John" <admin@127.0.0.1> wrote:

    [[unix]]

    $ more bin/rot13
    #!/bin/sh
    tr '[A-Za-z]' '[N-ZA-Mn-za-m]'




    tr.com: uses DOS int 21 for fileIO

    [100 byte version]


    Only example I've tested:

    tr 'A-Za-z' 'N-ZA-Mn-za-m' {<con}

    example text to unrot:

    Onebarff Znetnerg Gungpure!


    []

    Now allows >1 space between the strings! (but no error checking)


    Now 90 bytes, assumes that at start ax=0,bh=0 and that cx > lth of parameters.

    I think that's as small as I can manage.

    [duff code dump]
    I see no-one (including me,til now!) has tested it. it works under grdb
    because bp is 0 at start. Not in native DOS/XP cmd box though.

    Fix by using di instead of bp.


    d 100 l5A
    1637:0100 99 BF 5A 01-AA FE C0 75-FB B3 83 B0-20 89 DF F2 ..Z....u.... ... 1637:0110 AE F3 AE 89-FE 80 F2 01-74 04 88 85-5A 01 97 87 ........t...Z... 1637:0120 DE 80 3C 2D-75 08 40 3A-44 01 76 E9-46 46 AC 3C ..<-u.@:D.v.FF.< 1637:0130 27 75 E2 BA-5A 02 31 DB-89 D6 89 F7-B9 A5 FD B4 'u..Z.1......... 1637:0140 3F CD 21 91-E3 13 BB 5A-01 51 AC D7-AA E2 FB 59 ?.!....Z.Q.....Y 1637:0150 BB 01-00 B4 40 CD-21 EB DD C3 ....@.!...
    q


    Wolfgang, would you like it in asm? here it is -

    u 100 l5A
    1637:0100 99 cwd
    1637:0101 BF 5A 01 mov di,015A
    1637:0104 AA stosb
    1637:0105 FE C0 inc al
    1637:0107 75 FB jnz 0104
    1637:0109 B3 83 mov bl,83
    1637:010B B0 20 mov al,20
    1637:010D 89 DF mov di,bx
    1637:010F F2 AE repnz scasb
    1637:0111 F3 AE repz scasb
    1637:0113 89 FE mov si,di
    1637:0115 80 F2 01 xor dl,01
    1637:0118 74 04 jz 011E
    change bp to di in the next 2 lines:
    1637:011A 88 86 5A 01 mov [bp+015A],al
    1637:011E 95 xchg ax,bp

    1637:011A 88 85 5A 01 mov [di+015A],al
    1637:011E 97 xchg ax,di

    1637:011F 87 DE xchg bx,si
    1637:0121 80 3C 2D cmp byte [si],2D
    1637:0124 75 08 jnz 012E
    1637:0126 40 inc ax
    1637:0127 3A 44 01 cmp al,[si+01]
    1637:012A 76 E9 jbe 0115
    1637:012C 46 inc si
    1637:012D 46 inc si
    1637:012E AC lodsb
    1637:012F 3C 27 cmp al,27
    1637:0131 75 E2 jnz 0115
    1637:0133 BA 5A 02 mov dx,025A
    1637:0136 31 DB xor bx,bx
    1637:0138 89 D6 mov si,dx
    1637:013A 89 F7 mov di,si
    1637:013C B9 A5 FD mov cx,FDA5
    1637:013F B4 3F mov ah,3F
    1637:0141 CD 21 int 21
    1637:0143 91 xchg ax,cx
    1637:0144 E3 13 jcxzw 0159
    1637:0146 BB 5A 01 mov bx,015A
    1637:0149 51 push cx
    1637:014A AC lodsb
    1637:014B D7 xlat [bx]
    1637:014C AA stosb
    1637:014D E2 FB loopw 014A
    1637:014F 59 pop cx
    1637:0150 BB 01 00 mov bx,0001
    1637:0153 B4 40 mov ah,40
    1637:0155 CD 21 int 21
    1637:0157 EB DD jmp 0136
    1637:0159 C3 ret



    --
    Bah, and indeed Humbug.



    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From wolfgang kern@21:1/5 to John on Mon Jan 2 11:53:55 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On 31/12/2022 21:52, Kerr-Mudd, John wrote:

    example text to unrot:

    Onebarff Znetnerg Gungpure!

    Now allows >1 space between the strings! (but no error checking)
    Now 90 bytes, assumes that at start ax=0,bh=0 and that cx > lth of
    parameters.
    I think that's as small as I can manage.

    [duff code dump]
    I see no-one (including me,til now!) has tested it. it works under grdb because bp is 0 at start. Not in native DOS/XP cmd box though.

    Fix by using di instead of bp.
    d 100 l5A
    1637:0100 99 BF 5A 01-AA FE C0 75-FB B3 83 B0-20 89 DF F2 ..Z....u.... ... 1637:0110 AE F3 AE 89-FE 80 F2 01-74 04 88 85-5A 01 97 87 ........t...Z... 1637:0120 DE 80 3C 2D-75 08 40 3A-44 01 76 E9-46 46 AC 3C ..<-u.@:D.v.FF.< 1637:0130 27 75 E2 BA-5A 02 31 DB-89 D6 89 F7-B9 A5 FD B4 'u..Z.1......... 1637:0140 3F CD 21 91-E3 13 BB 5A-01 51 AC D7-AA E2 FB 59 ?.!....Z.Q.....Y 1637:0150 BB 01-00 B4 40 CD-21 EB DD C3 ....@.!...
    q

    Wolfgang, would you like it in asm? here it is -

    :) Happy New Year!

    I actually had no idea what this is supposed to do...
    if it is something like ROT13 I dunno the required algo. but
    code parts look suspicious as if compiled by good old BASIC.

    u 100 l5A
    1637:0100 99 cwd
    1637:0101 BF 5A 01 mov di,015A
    1637:0104 AA stosb
    1637:0105 FE C0 inc al
    1637:0107 75 FB jnz 0104
    1637:0109 B3 83 mov bl,83
    1637:010B B0 20 mov al,20
    1637:010D 89 DF mov di,bx
    1637:010F F2 AE repnz scasb
    1637:0111 F3 AE repz scasb
    1637:0113 89 FE mov si,di
    1637:0115 80 F2 01 xor dl,01
    1637:0118 74 04 jz 011E
    change bp to di in the next 2 lines:
    1637:011A 88 86 5A 01 mov [bp+015A],al
    1637:011E 95 xchg ax,bp

    1637:011A 88 85 5A 01 mov [di+015A],al
    1637:011E 97 xchg ax,di

    1637:011F 87 DE xchg bx,si
    1637:0121 80 3C 2D cmp byte [si],2D
    1637:0124 75 08 jnz 012E
    1637:0126 40 inc ax
    1637:0127 3A 44 01 cmp al,[si+01]
    1637:012A 76 E9 jbe 0115
    1637:012C 46 inc si
    1637:012D 46 inc si
    1637:012E AC lodsb
    1637:012F 3C 27 cmp al,27
    1637:0131 75 E2 jnz 0115
    1637:0133 BA 5A 02 mov dx,025A
    1637:0136 31 DB xor bx,bx
    1637:0138 89 D6 mov si,dx
    1637:013A 89 F7 mov di,si
    1637:013C B9 A5 FD mov cx,FDA5
    1637:013F B4 3F mov ah,3F
    1637:0141 CD 21 int 21
    1637:0143 91 xchg ax,cx
    1637:0144 E3 13 jcxzw 0159
    1637:0146 BB 5A 01 mov bx,015A
    1637:0149 51 push cx
    1637:014A AC lodsb
    1637:014B D7 xlat [bx]
    1637:014C AA stosb
    1637:014D E2 FB loopw 014A
    1637:014F 59 pop cx
    1637:0150 BB 01 00 mov bx,0001
    1637:0153 B4 40 mov ah,40
    1637:0155 CD 21 int 21
    1637:0157 EB DD jmp 0136
    1637:0159 C3 ret
    __
    wolfgang

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to wolfgang kern on Mon Jan 2 13:51:56 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Mon, 2 Jan 2023 11:53:55 +0100
    wolfgang kern <nowhere@nospicedham.nevernet.at> wrote:

    On 31/12/2022 21:52, Kerr-Mudd, John wrote:

    example text to unrot:

    Onebarff Znetnerg Gungpure!

    Now allows >1 space between the strings! (but no error checking)
    Now 90 bytes, assumes that at start ax=0,bh=0 and that cx > lth of
    parameters.
    I think that's as small as I can manage.

    [I've found a problem and a few small gains; now 87]


    Wolfgang, would you like it in asm? here it is -

    :) Happy New Year!

    And to you!

    I actually had no idea what this is supposed to do...
    if it is something like ROT13 I dunno the required algo. but

    Sorry I dropped that part; it's an implementation of unix's
    'tr' utility that unix users use to do rot13.

    rot13:

    tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
    or
    tr 'A-Za-z' 'N-ZA-Mn-za-m'

    (luckily both work as the square brackets are translated to themselves!)

    code parts look suspicious as if compiled by good old BASIC.

    Er, I'm that good? - the 'clever' bits are:
    1) using 'dl' as a toggle to alterately get a 'from' char and then a 'to'
    char.

    2) dealing with the range by keeping 'si' at the 'dash'

    once the table is setup it's just a matter of fileio and using 'xlat' on
    each input byte.


    u 100 l5A
    1637:0100 99 cwd
    1637:0101 BF 5A 01 mov di,015A ; Xlat Table after code
    1637:0104 AA stosb
    1637:0105 FE C0 inc al ; full range 0-255
    1637:0107 75 FB jnz 0104

    1637:0109 B3 83 mov bl,83 ; pt to PSP parms, after 1st string's initial quote
    1637:010B B0 20 mov al,20
    1637:010D 89 DF mov di,bx
    1637:010F F2 AE repnz scasb ; find gap
    1637:0111 F3 AE repz scasb ;;; skip intermediate spaces
    1637:0113 89 FE mov si,di ; after 1st quote of 2nd string
    1637:0115 80 F2 01 xor dl,01
    1637:0118 74 04 jz 011E

    1637:011A 88 85 5A 01 mov [di+015A],al

    this is the 'problem'; on 1st run it hits a table entry; I hadn't noticed
    unitl now as it's a non-ASCII 8x posn. It can be lived with, but I find it unsatisfactory; I want the smallest, but fully functional code!

    1637:011E 97 xchg ax,di

    1637:011F 87 DE xchg bx,si
    1637:0121 80 3C 2D cmp byte [si],2D ; processing a range? >> 1637:0124 75 08 jnz 012E
    1637:0126 40 inc ax
    1637:0127 3A 44 01 cmp al,[si+01]
    1637:012A 76 E9 jbe 0115
    1637:012C 46 inc si
    1637:012D 46 inc si
    1637:012E AC lodsb
    1637:012F 3C 27 cmp al,27 ; end of string
    1637:0131 75 E2 jnz 0115

    1637:0133 BA 5A 02 mov dx,025A ; IO area
    1637:0136 31 DB xor bx,bx
    1637:0138 89 D6 mov si,dx
    1637:013A 89 F7 mov di,si
    1637:013C B9 A5 FD mov cx,FDA5 ; remainder of seg as IO area
    1637:013F B4 3F mov ah,3F ; read from STDIN
    1637:0141 CD 21 int 21
    1637:0143 91 xchg ax,cx
    1637:0144 E3 13 jcxzw 0159 ; no more input
    1637:0146 BB 5A 01 mov bx,015A
    1637:0149 51 push cx
    1637:014A AC lodsb
    1637:014B D7 xlat [bx]
    1637:014C AA stosb
    1637:014D E2 FB loopw 014A
    1637:014F 59 pop cx
    1637:0150 BB 01 00 mov bx,0001
    1637:0153 B4 40 mov ah,40 ; write to STDOUT
    1637:0155 CD 21 int 21
    1637:0157 EB DD jmp 0136
    1637:0159 C3 ret



    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Sat Jan 7 16:34:02 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Mon, 2 Jan 2023 13:51:56 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Mon, 2 Jan 2023 11:53:55 +0100
    wolfgang kern <nowhere@nospicedham.nevernet.at> wrote:

    On 31/12/2022 21:52, Kerr-Mudd, John wrote:


    [rejigged]

    [] it's an implementation of unix's
    'tr' utility that unix users use to do rot13.

    rot13:

    tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
    or
    tr 'A-Za-z' 'N-ZA-Mn-za-m'

    (luckily both work as the square brackets are translated to themselves!)


    Now bloated to 158 bytes, to allow common Unix Escape codes (including hex: \xHH); valid codes are "abefnrtv", other \c escaped chars stay "as is",
    notably '\\' translates to '\'.

    It still doesn't have [:keyword:] 'complement' 'squeeze' or delete or -help
    for that matter.


    d 100 l94
    16AB:0100 BE 94 01 88-18 FE C3 75-FA B3 83 B0-20 89 DF F2 .......u.... ... 16AB:0110 AE F3 AE 89-C5 30 CD 74-02 88 02 95-87 FB 80 3D .....0.t.......= 16AB:0120 2D 75 07 40-3A 45 01 76-EC AF 8A 05-47 3C 5C 74 -u.@:E.v....G<\t 16AB:0130 26 3C 27 75-E0 B6 03 B4-3F 31 DB 89-C1 CD 21 89 &<'u....?1....!. 16AB:0140 D7 91 E3 C2-89 F3 51 8A-05 D7 AA E2-FA 59 B4 40 ......Q......Y.@ 16AB:0150 BB 01 00 CD-21 EB E0 8A-05 47 3C 78-75 13 8A 05 ....!....G<xu... 16AB:0160 47 24 4F D4-37 92 30 CF-75 F4 92 88-D4 D5 10 EB G$O.7.0.u....... 16AB:0170 A4 51 57 BF-84 01 B9 08-00 F2 AE 75-03 8A 45 07 .QW........u..E. 16AB:0180 5F 59 EB 91-61 62 65 66-6E 72 74 76-07 08 1B 0C _Y..abefnrtv.... 16AB:0190-0A 0D 09 0B ....
    q

    I guess that'll do.

    example text to unrot:

    Onebarff Znetnerg Gungpure!

    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to All on Sun Jan 22 09:24:40 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    Finally, a rot13 program for DOS that's smaller than the standard version
    with jumps:


    u 100 l2E
    1637:0100 B6 02 mov dh,02
    1637:0102 B4 3F mov ah,3F
    1637:0104 89 C1 mov cx,ax
    1637:0106 CD 21 int 21
    1637:0108 89 D6 mov si,dx
    1637:010A 91 xchg ax,cx
    1637:010B E3 20 jcxzw 012D
    1637:010D 51 push cx
    1637:010E AC lodsb
    ; main rot13 rtn
    1637:010F 24 DF and al,DF
    1637:0111 2C 41 sub al,41
    1637:0113 3C 1A cmp al,1A
    1637:0115 18 E4 sbb ah,ah
    1637:0117 3C 0D cmp al,0D
    1637:0119 D6 salc
    1637:011A 25 1A F3 and ax,F31A
    1637:011D 00 E0 add al,ah
    1637:011F 00 44 FF add [si-01],al

    1637:0122 E2 EA loopw 010E
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D5 jmp 0102
    1637:012D C3 ret
    d 100 l2E
    1637:0100 B6 02 B4 3F-89 C1 CD 21-89 D6 91 E3-20 51 AC 24 ...?...!.... Q.$ 1637:0110 DF 2C 41 3C-1A 18 E4 3C-0D D6 25 1A-F3 00 E0 00 .,A<...<..%..... 1637:0120 44 FF-E2 EA 59 43-B4 40 CD 21-4B EB D5 C3 D...YC.@.!K...
    q

    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Terje Mathisen@21:1/5 to John on Wed Jan 25 15:03:26 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version with jumps:


    u 100 l2E
    1637:0100 B6 02 mov dh,02
    1637:0102 B4 3F mov ah,3F
    1637:0104 89 C1 mov cx,ax
    1637:0106 CD 21 int 21
    1637:0108 89 D6 mov si,dx
    1637:010A 91 xchg ax,cx
    1637:010B E3 20 jcxzw 012D
    1637:010D 51 push cx

    The loop starts here of course!

    1637:010E AC lodsb
    ; main rot13 rtn
    1637:010F 24 DF and al,DF
    Folding to lowercase ascii
    1637:0111 2C 41 sub al,41
    1637:0113 3C 1A cmp al,1A
    Checking that it was in-range
    1637:0115 18 E4 sbb ah,ah
    1637:0117 3C 0D cmp al,0D

    Very nice, handling plus/minus for upper and lower case!

    1637:0119 D6 salc
    1637:011A 25 1A F3 and ax,F31A
    1637:011D 00 E0 add al,ah
    1637:011F 00 44 FF add [si-01],al

    1637:0122 E2 EA loopw 010E
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D5 jmp 0102
    1637:012D C3 ret
    d 100 l2E
    1637:0100 B6 02 B4 3F-89 C1 CD 21-89 D6 91 E3-20 51 AC 24 ...?...!.... Q.$ 1637:0110 DF 2C 41 3C-1A 18 E4 3C-0D D6 25 1A-F3 00 E0 00 .,A<...<..%..... 1637:0120 44 FF-E2 EA 59 43-B4 40 CD 21-4B EB D5 C3 D...YC.@.!K...
    q


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to Terje Mathisen on Wed Jan 25 17:02:43 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Wed, 25 Jan 2023 15:03:26 +0100
    Terje Mathisen <terje.mathisen@nospicedham.tmsw.no> wrote:

    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version with jumps:


    u 100 l2E
    1637:0100 B6 02 mov dh,02
    ;dirty save of 1 byte by not fully specifying the IOAREA

    1637:0102 B4 3F mov ah,3F
    1637:0104 89 C1 mov cx,ax
    ;dirty save of 1 byte by not fully specifying the IOAREA_Lth

    1637:0106 CD 21 int 21
    1637:0108 89 D6 mov si,dx
    1637:010A 91 xchg ax,cx
    1637:010B E3 20 jcxzw 012D
    1637:010D 51 push cx

    The loop starts here of course!

    1637:010E AC lodsb
    ; main rot13 rtn
    1637:010F 24 DF and al,DF
    Folding to lowercase ascii
    1637:0111 2C 41 sub al,41
    1637:0113 3C 1A cmp al,1A
    Checking that it was in-range
    1637:0115 18 E4 sbb ah,ah
    1637:0117 3C 0D cmp al,0D

    Very nice, handling plus/minus for upper and lower case!

    1637:0119 D6 salc
    1637:011A 25 1A F3 and ax,F31A
    1637:011D 00 E0 add al,ah
    1637:011F 00 44 FF add [si-01],al

    1637:0122 E2 EA loopw 010E
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D5 jmp 0102

    1637:012D C3 ret
    d 100 l2E
    1637:0100 B6 02 B4 3F-89 C1 CD 21-89 D6 91 E3-20 51 AC 24 ...?...!.... Q.$ 1637:0110 DF 2C 41 3C-1A 18 E4 3C-0D D6 25 1A-F3 00 E0 00 .,A<...<..%..... 1637:0120 44 FF-E2 EA 59 43-B4 40 CD 21-4B EB D5 C3 D...YC.@.!K...
    q



    TYVM, It's appreciated, especially from you.

    simpler? version; hardcoded IOAREA, rotamt in dl
    u 100 l2E
    1637:0100 BA 0D 1A mov dx,1A0D
    1637:0103 B4 3F mov ah,3F
    1637:0105 89 C1 mov cx,ax
    1637:0107 CD 21 int 21
    1637:0109 89 D6 mov si,dx
    1637:010B 91 xchg ax,cx
    1637:010C E3 1F jcxzw 012D
    1637:010E 51 push cx
    1637:010F AC lodsb

    1637:0110 24 DF and al,DF
    1637:0112 2C 41 sub al,41
    1637:0114 38 D0 cmp al,dl
    1637:0116 18 E4 sbb ah,ah
    1637:0118 38 F0 cmp al,dh
    1637:011A D6 salc
    1637:011B 21 D0 and ax,dx
    1637:011D 28 C4 sub ah,al
    1637:011F 00 64 FF add [si-01],ah

    1637:0122 E2 EB loopw 010F
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D6 jmp 0103
    1637:012D C3 ret
    d 100 l2E
    1637:0100 BA 0D 1A B4-3F 89 C1 CD-21 89 D6 91-E3 1F 51 AC ....?...!.....Q. 1637:0110 24 DF 2C 41-38 D0 18 E4-38 F0 D6 21-D0 28 C4 00 $.,A8...8..!.(.. 1637:0120 64 FF E2 EB-59 43 B4 40-CD 21 4B EB-D6 C3 d...YC.@.!K...
    q



    Sad there's no^w little interest in x86 asm these days, but I suppose such things might have been "hot" 40 years ago.

    (Modesty forbids me from adding "me too!")

    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Fri Jan 27 09:57:22 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Wed, 25 Jan 2023 17:02:43 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Wed, 25 Jan 2023 15:03:26 +0100
    Terje Mathisen <terje.mathisen@nospicedham.tmsw.no> wrote:

    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version with jumps:


    simpler? version; hardcoded IOAREA, rotamt in dl
    u 100 l2E
    1637:0100 BA 0D 1A mov dx,1A0D
    1637:0103 B4 3F mov ah,3F
    1637:0105 89 C1 mov cx,ax

    Nasty hack gave poor use of seg for R/W buffer; replace with
    mov ch,E4 ; (ie. FF-1A-1)
    []



    u 100 l2E
    1637:0100 BA 0D 1A mov dx,1A0D
    1637:0103 B4 3F mov ah,3F
    1637:0105 B5 E4 mov ch,E4
    1637:0107 CD 21 int 21
    1637:0109 89 D6 mov si,dx
    1637:010B 91 xchg ax,cx
    1637:010C E3 1F jcxzw 012D
    1637:010E 51 push cx
    1637:010F AC lodsb
    1637:0110 24 DF and al,DF
    1637:0112 2C 41 sub al,41
    1637:0114 38 D0 cmp al,dl
    1637:0116 18 E4 sbb ah,ah
    1637:0118 38 F0 cmp al,dh
    1637:011A D6 salc
    1637:011B 21 D0 and ax,dx
    1637:011D 28 C4 sub ah,al
    1637:011F 00 64 FF add [si-01],ah
    1637:0122 E2 EB loopw 010F
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D6 jmp 0103
    1637:012D C3 ret
    d 100 l2E
    1637:0100 BA 0D 1A B4-3F B5 E4 CD-21 89 D6 91-E3 1F 51 AC ....?...!.....Q. 1637:0110 24 DF 2C 41-38 D0 18 E4-38 F0 D6 21-D0 28 C4 00 $.,A8...8..!.(.. 1637:0120 64 FF-E2 EB 59 43-B4 40 CD 21-4B EB D6 C3 d...YC.@.!K...
    q
    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Fri Jan 27 13:30:13 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Fri, 27 Jan 2023 09:57:22 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Wed, 25 Jan 2023 17:02:43 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    []
    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version
    with jumps:


    simpler? version; hardcoded IOAREA, rotamt in dl
    u 100 l2E
    1637:0100 BA 0D 1A mov dx,1A0D
    1637:0103 B4 3F mov ah,3F
    1637:0105 89 C1 mov cx,ax

    Nasty hack gave poor use of seg for R/W buffer; replace with
    mov ch,E4 ; (ie. FF-1A-1)
    []
    []
    'Better' still use C3 (embedded 'ret') to reduce prog to 45 bytes.

    u 100 l2D
    1637:0100 BA 0D 1A mov dx,1A0D
    1637:0103 B4 3F mov ah,3F
    1637:0105 B5 C3 mov ch,C3
    1637:0107 CD 21 int 21
    1637:0109 89 D6 mov si,dx
    1637:010B 91 xchg ax,cx
    1637:010C E3 F8 jcxzw 0106
    1637:010E 51 push cx
    1637:010F AC lodsb
    1637:0110 24 DF and al,DF
    1637:0112 2C 41 sub al,41
    1637:0114 38 D0 cmp al,dl
    1637:0116 18 E4 sbb ah,ah
    1637:0118 38 F0 cmp al,dh
    1637:011A D6 salc
    1637:011B 21 D0 and ax,dx
    1637:011D 28 C4 sub ah,al
    1637:011F 00 64 FF add [si-01],ah
    1637:0122 E2 EB loopw 010F
    1637:0124 59 pop cx
    1637:0125 43 inc bx
    1637:0126 B4 40 mov ah,40
    1637:0128 CD 21 int 21
    1637:012A 4B dec bx
    1637:012B EB D6 jmp 0103
    d 100 l2D
    1637:0100 BA 0D 1A B4-3F B5 C3 CD-21 89 D6 91-E3 F8 51 AC ....?...!.....Q. 1637:0110 24 DF 2C 41-38 D0 18 E4-38 F0 D6 21-D0 28 C4 00 $.,A8...8..!.(.. 1637:0120 64-FF E2 EB 59-43 B4 40 CD-21 4B EB D6 d...YC.@.!K..
    q

    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Sat Nov 18 11:10:20 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Fri, 27 Jan 2023 13:30:13 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Fri, 27 Jan 2023 09:57:22 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Wed, 25 Jan 2023 17:02:43 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    []
    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version
    with jumps:

    []
    'Better' still use C3 (embedded 'ret') to reduce prog to 45 bytes.
    []

    One that works even if the rot amount isn't 13 (ie the older version
    didn't!) also 45 bytes:

    u 100 l2D
    16AD:0100 BA E6 0D mov dx,0DE6
    16AD:0103 B4 3F mov ah,3F
    16AD:0105 B5 C3 mov ch,C3
    16AD:0107 CD 21 int 21
    16AD:0109 91 xchg ax,cx
    16AD:010A E3 FA jcxzw 0106

    16AD:010C 89 D6 mov si,dx
    16AD:010E 51 push cx

    16AD:010F AC lodsb
    16AD:0110 24 DF and al,DF
    16AD:0112 2C 41 sub al,41
    16AD:0114 2C 1A sub al,1A
    16AD:0116 18 E4 sbb ah,ah
    16AD:0118 00 F0 add al,dh
    16AD:011A D6 salc
    16AD:011B 21 D0 and ax,dx
    16AD:011D 00 E0 add al,ah
    16AD:011F 00 64 FF add [si-01],ah
    16AD:0122 E2 EB loopw 010F

    16AD:0124 59 pop cx
    16AD:0125 43 inc bx
    16AD:0126 B4 40 mov ah,40
    16AD:0128 CD 21 int 21
    16AD:012A 4B dec bx
    16AD:012B EB D6 jmp 0103

    d 100 l2D
    16AD:0100 BA E6 0D B4-3F B5 C3 CD-21 91 E3 FA-89 D6 51 AC ....?...!.....Q. 16AD:0110 24 DF 2C 41-2C 1A 18 E4-00 F0 D6 21-D0 00 E0 00 $.,A,......!.... 16AD:0120 64-FF E2 EB 59-43 B4 40 CD-21 4B EB D6 d...YC.@.!K..
    q



    And a version that allows the rot amount as a parameter in 64 bytes:
    example usage:
    rot 3<input.txt

    u 100 l40
    16AD:0100 BA E6 0D mov dx,0DE6
    16AD:0103 BE 82 00 mov si,0082
    16AD:0106 AD lodsw
    16AD:0107 2D 30 30 sub ax,3030
    16AD:010A 72 04 jb 0110
    16AD:010C 86 E0 xchg ah,al
    16AD:010E D5 0A aad 0A
    16AD:0110 3C 00 cmp al,00
    16AD:0112 72 02 jb 0116
    16AD:0114 88 C6 mov dh,al

    16AD:0116 B4 3F mov ah,3F
    16AD:0118 B5 C3 mov ch,C3
    16AD:011A CD 21 int 21
    16AD:011C 91 xchg ax,cx
    16AD:011D E3 FA jcxzw 0119

    16AD:011F 89 D6 mov si,dx
    16AD:0121 51 push cx

    16AD:0122 AC lodsb
    16AD:0123 24 DF and al,DF
    16AD:0125 2C 41 sub al,41
    16AD:0127 2C 1A sub al,1A
    16AD:0129 18 E4 sbb ah,ah
    16AD:012B 00 F0 add al,dh
    16AD:012D D6 salc
    16AD:012E 21 D0 and ax,dx
    16AD:0130 00 E0 add al,ah
    16AD:0132 00 44 FF add [si-01],al
    16AD:0135 E2 EB loopw 0122

    16AD:0137 59 pop cx
    16AD:0138 43 inc bx
    16AD:0139 B4 40 mov ah,40
    16AD:013B CD 21 int 21
    16AD:013D 4B dec bx
    16AD:013E EB D6 jmp 0116

    d 100 l40
    16AD:0100 BA E6 0D BE-82 00 AD 2D-30 30 72 04-86 E0 D5 0A .......-00r..... 16AD:0110 3C 00 72 02-88 C6 B4 3F-B5 C3 CD 21-91 E3 FA 89 <.r....?...!.... 16AD:0120 D6 51 AC 24-DF 2C 41 2C-1A 18 E4 00-F0 D6 21 D0 .Q.$.,A,......!. 16AD:0130 00 E0 00 44-FF E2 EB 59-43 B4 40 CD-21 4B EB D6 ...D...YC.@.!K..
    q



    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Sat Nov 18 16:16:14 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Sat, 18 Nov 2023 11:10:20 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:



    And a version that allows the rot amount as a parameter in 64 bytes:
    example usage:
    rot 3<input.txt

    u 100 l40

    Bah, I knew I shouldn't have posted so soon:


    16AD:0100 BA E6 0D mov dx,0DE6
    Instead of

    16AD:0103 BE 82 00 mov si,0082
    16AD:0106 AD lodsw
    use:
    16AD:0103 A1 82 00 mov ax,[0082]

    (and adjust everything else up 1)

    16AD:0107 2D 30 30 sub ax,3030
    16AD:010A 72 04 jb 0110
    16AD:010C 86 E0 xchg ah,al
    16AD:010E D5 0A aad 0A
    16AD:0110 3C 00 cmp al,00
    16AD:0112 72 02 jb 0116
    16AD:0114 88 C6 mov dh,al

    16AD:0116 B4 3F mov ah,3F
    16AD:0118 B5 C3 mov ch,C3
    16AD:011A CD 21 int 21
    16AD:011C 91 xchg ax,cx
    16AD:011D E3 FA jcxzw 0119

    16AD:011F 89 D6 mov si,dx
    16AD:0121 51 push cx

    16AD:0122 AC lodsb
    16AD:0123 24 DF and al,DF
    16AD:0125 2C 41 sub al,41
    16AD:0127 2C 1A sub al,1A
    16AD:0129 18 E4 sbb ah,ah
    16AD:012B 00 F0 add al,dh
    16AD:012D D6 salc
    16AD:012E 21 D0 and ax,dx
    16AD:0130 00 E0 add al,ah
    16AD:0132 00 44 FF add [si-01],al
    16AD:0135 E2 EB loopw 0122

    16AD:0137 59 pop cx
    16AD:0138 43 inc bx
    16AD:0139 B4 40 mov ah,40
    16AD:013B CD 21 int 21
    16AD:013D 4B dec bx
    16AD:013E EB D6 jmp 0116

    d 100 l40
    16AD:0100 BA E6 0D BE-82 00 AD 2D-30 30 72 04-86 E0 D5 0A .......-00r..... 16AD:0110 3C 00 72 02-88 C6 B4 3F-B5 C3 CD 21-91 E3 FA 89 <.r....?...!.... 16AD:0120 D6 51 AC 24-DF 2C 41 2C-1A 18 E4 00-F0 D6 21 D0 .Q.$.,A,......!. 16AD:0130 00 E0 00 44-FF E2 EB 59-43 B4 40 CD-21 4B EB D6 ...D...YC.@.!K..
    q



    --
    Bah, and indeed Humbug.



    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kerr-Mudd, John@21:1/5 to John" on Sat Nov 18 22:19:55 2023
    XPost: comp.os.msdos.programmer, alt.lang.asm

    On Sat, 18 Nov 2023 11:10:20 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Fri, 27 Jan 2023 13:30:13 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Fri, 27 Jan 2023 09:57:22 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    On Wed, 25 Jan 2023 17:02:43 +0000
    "Kerr-Mudd, John" <admin@nospicedham.127.0.0.1> wrote:

    []
    Kerr-Mudd, John wrote:
    Finally, a rot13 program for DOS that's smaller than the standard version
    with jumps:

    []
    'Better' still use C3 (embedded 'ret') to reduce prog to 45 bytes.
    []

    One that works even if the rot amount isn't 13 (ie the older version
    didn't!) also 45 bytes:

    u 100 l2D
    16AD:0100 BA E6 0D mov dx,0DE6
    16AD:0103 B4 3F mov ah,3F
    16AD:0105 B5 C3 mov ch,C3
    16AD:0107 CD 21 int 21
    16AD:0109 91 xchg ax,cx
    16AD:010A E3 FA jcxzw 0106

    16AD:010C 89 D6 mov si,dx
    16AD:010E 51 push cx

    16AD:010F AC lodsb
    16AD:0110 24 DF and al,DF
    16AD:0112 2C 41 sub al,41
    16AD:0114 2C 1A sub al,1A
    16AD:0116 18 E4 sbb ah,ah
    16AD:0118 00 F0 add al,dh
    16AD:011A D6 salc
    16AD:011B 21 D0 and ax,dx
    16AD:011D 00 E0 add al,ah

    16AD:011F 00 64 FF add [si-01],ah
    Oh bother, make that al:
    16AD:011F 00 44 FF add [si-01],al

    16AD:0122 E2 EB loopw 010F

    16AD:0124 59 pop cx
    16AD:0125 43 inc bx
    16AD:0126 B4 40 mov ah,40
    16AD:0128 CD 21 int 21
    16AD:012A 4B dec bx
    16AD:012B EB D6 jmp 0103

    d 100 l2D
    16AD:0100 BA E6 0D B4-3F B5 C3 CD-21 91 E3 FA-89 D6 51 AC ....?...!.....Q. 16AD:0110 24 DF 2C 41-2C 1A 18 E4-00 F0 D6 21-D0 00 E0 00 $.,A,......!.... 16AD:0120 64-FF E2 EB 59-43 B4 40 CD-21 4B EB D6 d...YC.@.!K..
    -----------^44

    q



    (It happens to work, so passes my test but iff rot13)

    --
    Bah, and indeed Humbug.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)