Discussion:
TR util for DOS
(too old to reply)
Kerr-Mudd, John
2022-12-30 21:36:12 UTC
Permalink
On Fri, 30 Dec 2022 10:24:29 +0000
On Fri, 23 Dec 2022 15:54:28 +0000
[[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]
tr 'A-Za-z' 'N-ZA-Mn-za-m' {<con}
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.

-> 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
2022-12-31 20:52:35 UTC
Permalink
On Fri, 30 Dec 2022 21:36:12 +0000
Post by Kerr-Mudd, John
On Fri, 30 Dec 2022 10:24:29 +0000
On Fri, 23 Dec 2022 15:54:28 +0000
[[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]
tr 'A-Za-z' 'N-ZA-Mn-za-m' {<con}
Onebarff Znetnerg Gungpure!
[]
Post by Kerr-Mudd, John
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
Post by Kerr-Mudd, John
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
Post by Kerr-Mudd, John
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.
wolfgang kern
2023-01-02 10:53:55 UTC
Permalink
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
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: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
-> q
Post by Kerr-Mudd, John
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.
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
-> 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:011A 88 85 5A 01 mov [di+015A],al
1637:011E 97 xchg ax,di
Post by Kerr-Mudd, John
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
Kerr-Mudd, John
2023-01-02 13:51:56 UTC
Permalink
On Mon, 2 Jan 2023 11:53:55 +0100
Post by wolfgang kern
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
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]
Post by wolfgang kern
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
Wolfgang, would you like it in asm? here it is -
:) Happy New Year!
And to you!
Post by wolfgang kern
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!)
Post by wolfgang kern
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.
Post by wolfgang kern
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
-> 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!
Post by wolfgang kern
Post by Kerr-Mudd, John
1637:011E 97 xchg ax,di
Post by Kerr-Mudd, John
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.
Kerr-Mudd, John
2023-01-07 16:34:02 UTC
Permalink
On Mon, 2 Jan 2023 13:51:56 +0000
Post by Kerr-Mudd, John
On Mon, 2 Jan 2023 11:53:55 +0100
[rejigged]
Post by Kerr-Mudd, John
[] it's an implementation of unix's
'tr' utility that unix users use to do 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.
Post by Kerr-Mudd, John
Onebarff Znetnerg Gungpure!
--
Bah, and indeed Humbug.
Kerr-Mudd, John
2023-01-22 09:24:40 UTC
Permalink
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 ***@.!K...
-> q
--
Bah, and indeed Humbug.
Terje Mathisen
2023-01-25 14:03:26 UTC
Permalink
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
->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!
Post by Kerr-Mudd, John
1637:010E AC lodsb
; main rot13 rtn
1637:010F 24 DF and al,DF
Folding to lowercase ascii
Post by Kerr-Mudd, John
1637:0111 2C 41 sub al,41
1637:0113 3C 1A cmp al,1A
Checking that it was in-range
Post by Kerr-Mudd, John
1637:0115 18 E4 sbb ah,ah
1637:0117 3C 0D cmp al,0D
Very nice, handling plus/minus for upper and lower case!
Post by Kerr-Mudd, John
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<...<..%.....
-> q
Kerr-Mudd, John
2023-01-25 17:02:43 UTC
Permalink
On Wed, 25 Jan 2023 15:03:26 +0100
Post by Terje Mathisen
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
->u 100 l2E
1637:0100 B6 02 mov dh,02
;dirty save of 1 byte by not fully specifying the IOAREA
Post by Terje Mathisen
Post by Kerr-Mudd, John
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
Post by Terje Mathisen
Post by Kerr-Mudd, John
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!
Post by Kerr-Mudd, John
1637:010E AC lodsb
; main rot13 rtn
1637:010F 24 DF and al,DF
Folding to lowercase ascii
Post by Kerr-Mudd, John
1637:0111 2C 41 sub al,41
1637:0113 3C 1A cmp al,1A
Checking that it was in-range
Post by Kerr-Mudd, John
1637:0115 18 E4 sbb ah,ah
1637:0117 3C 0D cmp al,0D
Very nice, handling plus/minus for upper and lower case!
Post by Kerr-Mudd, John
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<...<..%.....
-> 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 ***@.!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.
Kerr-Mudd, John
2023-01-27 09:57:22 UTC
Permalink
On Wed, 25 Jan 2023 17:02:43 +0000
Post by Kerr-Mudd, John
On Wed, 25 Jan 2023 15:03:26 +0100
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
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 ***@.!K...
-> q
--
Bah, and indeed Humbug.
Kerr-Mudd, John
2023-01-27 13:30:13 UTC
Permalink
On Fri, 27 Jan 2023 09:57:22 +0000
Post by Kerr-Mudd, John
On Wed, 25 Jan 2023 17:02:43 +0000
[]
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
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 ***@.!K..
-> q
--
Bah, and indeed Humbug.
Kerr-Mudd, John
2023-11-18 11:10:20 UTC
Permalink
On Fri, 27 Jan 2023 13:30:13 +0000
Post by Kerr-Mudd, John
On Fri, 27 Jan 2023 09:57:22 +0000
Post by Kerr-Mudd, John
On Wed, 25 Jan 2023 17:02:43 +0000
[]
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
[]
Post by Kerr-Mudd, John
'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 ***@.!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 ***@.!K..
-> q
--
Bah, and indeed Humbug.
Kerr-Mudd, John
2023-11-18 16:16:14 UTC
Permalink
On Sat, 18 Nov 2023 11:10:20 +0000
Post by Kerr-Mudd, John
rot 3<input.txt
->u 100 l40
16AD:0100 BA E6 0D mov dx,0DE6
Instead of
Post by Kerr-Mudd, John
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)
Post by Kerr-Mudd, John
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,......!.
-> q
--
Bah, and indeed Humbug.
--
Bah, and indeed Humbug.
Kerr-Mudd, John
2023-11-18 22:19:55 UTC
Permalink
On Sat, 18 Nov 2023 11:10:20 +0000
Post by Kerr-Mudd, John
On Fri, 27 Jan 2023 13:30:13 +0000
Post by Kerr-Mudd, John
On Fri, 27 Jan 2023 09:57:22 +0000
Post by Kerr-Mudd, John
On Wed, 25 Jan 2023 17:02:43 +0000
[]
Post by Kerr-Mudd, John
Post by Kerr-Mudd, John
Finally, a rot13 program for DOS that's smaller than the standard version
[]
Post by Kerr-Mudd, John
'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
->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
Post by Kerr-Mudd, John
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,......!....
-----------^44
Post by Kerr-Mudd, John
-> q
(It happens to work, so passes my test but iff rot13)
--
Bah, and indeed Humbug.
Loading...