Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: TR util for DOS

65 views
Skip to first unread message

Kerr-Mudd, John

unread,
Dec 30, 2022, 4:50:15 PM12/30/22
to
On Fri, 30 Dec 2022 10:24:29 +0000
"Kerr-Mudd, John" <ad...@127.0.0.1> wrote:

> On Fri, 23 Dec 2022 15:54:28 +0000
> "Kerr-Mudd, John" <ad...@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.

Kerr-Mudd, John

unread,
Dec 31, 2022, 4:06:48 PM12/31/22
to
On Fri, 30 Dec 2022 21:36:12 +0000
"Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:

> On Fri, 30 Dec 2022 10:24:29 +0000
> "Kerr-Mudd, John" <ad...@127.0.0.1> wrote:
>
> > On Fri, 23 Dec 2022 15:54:28 +0000
> > "Kerr-Mudd, John" <ad...@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

wolfgang kern

unread,
Jan 2, 2023, 6:08:45 AM1/2/23
to
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.
__
wolfgang

Kerr-Mudd, John

unread,
Jan 2, 2023, 8:53:55 AM1/2/23
to
On Mon, 2 Jan 2023 11:53:55 +0100
wolfgang kern <now...@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



Kerr-Mudd, John

unread,
Jan 7, 2023, 11:36:55 AM1/7/23
to
On Mon, 2 Jan 2023 13:51:56 +0000
"Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:

> On Mon, 2 Jan 2023 11:53:55 +0100
> wolfgang kern <now...@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!

Kerr-Mudd, John

unread,
Jan 22, 2023, 4:27:21 AM1/22/23
to
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

Terje Mathisen

unread,
Jan 25, 2023, 9:11:52 AM1/25/23
to
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!

Kerr-Mudd, John

unread,
Jan 25, 2023, 12:12:03 PM1/25/23
to
On Wed, 25 Jan 2023 15:03:26 +0100
Terje Mathisen <terje.m...@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
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!")

Kerr-Mudd, John

unread,
Jan 27, 2023, 5:06:50 AM1/27/23
to
On Wed, 25 Jan 2023 17:02:43 +0000
"Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:

> On Wed, 25 Jan 2023 15:03:26 +0100
> Terje Mathisen <terje.m...@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

Kerr-Mudd, John

unread,
Jan 27, 2023, 8:40:17 AM1/27/23
to
On Fri, 27 Jan 2023 09:57:22 +0000
"Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:

> On Wed, 25 Jan 2023 17:02:43 +0000
> "Kerr-Mudd, John" <ad...@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..

Kerr-Mudd, John

unread,
Nov 18, 2023, 6:20:59 AM11/18/23
to
On Fri, 27 Jan 2023 13:30:13 +0000
"Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:

> On Fri, 27 Jan 2023 09:57:22 +0000
> "Kerr-Mudd, John" <ad...@nospicedham.127.0.0.1> wrote:
>
> > On Wed, 25 Jan 2023 17:02:43 +0000
> > "Kerr-Mudd, John" <ad...@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..

Kerr-Mudd, John

unread,
Nov 18, 2023, 11:21:16 AM11/18/23
to
On Sat, 18 Nov 2023 11:10:20 +0000
"Kerr-Mudd, John" <ad...@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)

Kerr-Mudd, John

unread,
Nov 18, 2023, 5:21:35 PM11/18/23
to
On Sat, 18 Nov 2023 11:10:20 +0000
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)
0 new messages