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

tsr program

12 views
Skip to first unread message

Almas

unread,
Jul 16, 2009, 8:05:01 AM7/16/09
to
Hi everybody, i try again, the version TSR is "better" : now i have no
trouble, but no thing happen.

The aim : when Minute Mn is detect... clean screen, display the minutes.

I try with XP in DOS cession, i want to use with DOS 5.

The non TSR version is correct, but computer must wait !

If somebody have an idea to have an usefull TSR file, i appreciate !

Below, the 2 files.
Note : i use A86 ; somebody suggest to use IRET....but i did not
understand.

;---------------------------------------------------
jmp short debut ; 1st version no TSR
; it go to end of file, keep minutes then return to detecte

detecte:

PUSHA
PUSH ES
mov ah,2
int 1Ah
mov ah,cl ; Minutes
mov al,cl
ror al,4
and ax,0F0Fh
add ax,3030h
cmp ax,bx ; time comes ?
jnz again ; not ready, then try again

push ax
mov ax,0003
int 10h ; Clean Screen
pop ax

xchg ah,al
push ax
xchg ah,al
mov ah,0Eh ; display time
mov bx,0004 ; back black write red
int 10h
pop ax
inc bx ; change the color
mov ah,0Eh
int 10h

; iret
int 20h

again:
POP ES
POPA
jmp short detecte ; go to the top of file

debut:
mov si,82h ; Sure, i type text here, sure it is correct
lodsw ; i do not verify the syntax
xchg ax,bx
jmp short detecte

; --------------------------------------------

jmp short init ; 2nd version should be TSR
detecte:

PUSHA
PUSH ES
mov ah,2
int 1Ah
mov ah,cl ; Minutes
mov al,cl
ror al,4
and ax,0F0Fh
add ax,3030h
cmp ax,bx ; time comes ?
jnz again ; not ready, then try again

push ax
mov ax,0003
int 10h ; i test Clean Screen
pop ax

iret ;
int 20h

again:
POP ES
POPA

suivant: jmp far cs:Old_P
Old_P: db ,0,0
pointeur: db ,0,0

init: ; NewInt1C ENDP
mov si,82h ; Sure, i type text here, sure it is correct
lodsw ; i do not verify the syntax
xchg ax,bx

push bx ; save value of SI 82 and SI 83

mov ax,351Ch
int 21h
mov [offset Old_P],bx
mov ax,es
mov [offset pointeur],ax

mov dx,offset detecte
mov ax,251Ch
int 21h

pop bx

mov dx, offset (init-detecte)
mov cx,4
shr dx,cl
inc dx
mov ax,3100h
int 21h


Wolfgang Kern

unread,
Jul 16, 2009, 2:35:43 PM7/16/09
to

Almas wrote:

> Hi everybody, i try again, the version TSR is "better" : now i have no
> trouble, but no thing happen.

Good to remember: "no problems if nothing happens" :)

> The aim : when Minute Mn is detect... clean screen, display the minutes.

> I try with XP in DOS session, i want to use with DOS 5.

> The non TSR version is correct, but computer must wait !
> If somebody have an idea to have an usefull TSR file, i appreciate !

INT 1Ch is a software interrupt, in fact it's an appendix of the
PIT-IRQ(0)routine, onbly working while in DOS-mode and its default
vector points to nothing else than a CFh instruction (an IRET).
So a INT-1C hook doesn't need to return to the original vector, as
long not several instances use it chained or are involved at all.

Your TSR-code (called on every timer tick) must correct terminate,
which INT20h or INT21h/4C00 wont do here.

Assuming you correct setup the TSR itself and the INT-1C vector as well
your INT1Ch-hook should look like:


MyInt1C: ;called every timer tick, usually with disabled IRQs.
PUSH ... ;all what becomes dirty except flag-register
... ;do whatever you like, on every timer tick,
;but be aware that the next timer-IRQ may occure soon ...
;so I wouldn't clear the full screen and
;avoid any timer using OS-function calls in here,
;best not use INT21h/INT1Ah during this routine, see ***)
POP ... ;all you pushed
IRET ;or if (rare) really required: JMP far OLD_INT21

All you need to see it working is let DOS idle (usually on prompt
or during PAUSE in .bat-files).

Unsure about LODSW ?
it just loads AX from DS:[SI] followed by ADD/SUB SI,2 (CLD/STD)
in opposition to STOSW
which stores AX into ES:[DI] also followed like above.

The use of CLI/STI in winXP will need special authorisation ...

__
wolfgang

***) READ Minutes from RTCL, I/O-port pair [70h/71h]:

MOV AL,82h ;index 02= Minutes, a set bit7 disables NMI
OUT 70h,AL
OUT EBh,AL ;dummy port delay, may not be needed on newer hardware
IN AL,71h ;get minutes (in BCD if RTCL is configured for it)


Rod Pemberton

unread,
Jul 16, 2009, 8:14:38 PM7/16/09
to
"Almas" <al_mas...@wanadoo.fr> wrote in message
news:4a5f1772$0$12650$ba4a...@news.orange.fr...

[snip]

I'm not sure what is needed to make it work, but I have some comments from
comparing it to other TSRs.

> ; --------------------------------------------
>
> jmp short init ; 2nd version should be TSR
> detecte:
>
> PUSHA
> PUSH ES
> mov ah,2
> int 1Ah
> mov ah,cl ; Minutes
> mov al,cl
> ror al,4
> and ax,0F0Fh
> add ax,3030h
> cmp ax,bx ; time comes ?
> jnz again ; not ready, then try again
>
> push ax
> mov ax,0003
> int 10h ; i test Clean Screen
> pop ax
>
> iret ;

delete this 'iret'.

first, the 'iret' isn't working properly. 'PUSHA; PUSH ES' are on the stack
infront of the CS, IP, flags, needed by the 'iret'. i.e., 'iret' attempts
to load 'ES' as IP, etc. You'd need to do 'POP ES, POPA' before the 'iret'.

second, if 'iret' was working, it would skip calling the original interrupt
routine, e.g., 'suivant: jmp far cs:Old_P'. is that what you want?

> int 20h

delete this 'int 20h'. you can't use this after becoming TSR. all you can
to disable the TSR is restore the original interrupt vectors. using the
ax=351Ch and ax=251Ch, int 21h calls.

> again:
> POP ES
> POPA
>
> suivant: jmp far cs:Old_P

...

> Old_P: db ,0,0
> pointeur: db ,0,0

'db ,0,0' ???... is that correct? the extra comma at the start? could
you dump your binary and make sure you only have four zero bytes, not six?

Old_P: db 0,0
pointeur: db 0,0

> init: ; NewInt1C ENDP
> mov si,82h ; Sure, i type text here, sure it is correct
> lodsw ; i do not verify the syntax
> xchg ax,bx
>
> push bx ; save value of SI 82 and SI 83
>
> mov ax,351Ch
> int 21h
> mov [offset Old_P],bx
> mov ax,es
> mov [offset pointeur],ax
>

don't you need to set ds? ds:dx for 251Ch call? it looks like ds is never
set anywhere.

push cs
pop ds

> mov dx,offset detecte
> mov ax,251Ch
> int 21h
>
> pop bx
>
> mov dx, offset (init-detecte)
> mov cx,4
> shr dx,cl
> inc dx

instead of 'inc dx' you might want "add dx, 17" this adds extra space for
the PSP

> mov ax,3100h
> int 21h
>

also, the TSR's I've seen have a call to the ah=49h, int 21h function to
free the environment block.


Rod Pemberton


Almas

unread,
Jul 17, 2009, 3:15:51 AM7/17/09
to
Hi ; thanks for your answer.

It could be a joke... but i'm not sure that i know what i do !

I used an other file : floppy A becomes B ; and B > A
If run again .. A > B and B > A

So this file is OK... my idea : use it for an other application !

If i compare the two versions : now i do not use "EA X X X X" : jmp far...
now i do not use mov ah 48 to keep RAM

-----------------------------------
jmp short debut
detecte:
cmp dl,80h ; Hard Disk ?
jae suivant
cmp dl,1 ; floppy B
je vers_A
inc dx ; A become B
jmp short suivant

vers_A: mov dl,0


suivant: jmp far cs:Old_P

Old_P: db ,0,0
pointeur: db ,0,0


;------------------------- debut
debut: mov ax,3513h
int 21h
mov [offset Old_P],bx ; i understand a correct value will be put

mov ax,es
mov [offset pointeur],ax ; same : will give a correct value for the jmp

mov dx,offset detecte
mov ax,2513h
int 21h

mov dx,0012h ; RAM reserved
mov ax,3100h
int 21h


Herbert Kleebauer

unread,
Jul 17, 2009, 7:52:26 AM7/17/09
to
Almas wrote:
>
> Hi everybody, i try again, the version TSR is "better" : now i have no
> trouble, but no thing happen.
>
> The aim : when Minute Mn is detect... clean screen, display the minutes.


Here a minimal (no way to unload) example for a TSR program. It displays
the time in the upper right corner. Convert it to A86 syntax or disassemble
the binary:


@=$100

0100: 31 c0 eor.w r0,r0
0102: 8e c0 move.w r0,s1

0104: 66 26 a1 0020 move.l 8*4{s1},r0
0109: 66 a3 0130 move.l r0,old08

010d: 8c c8 move.w s6,r0
010f: 66 c1 e0 10 lsl.l #16,r0
0113: b8 0134 move.w #int08,r0
0116: 66 26 a3 0020 move.l r0,8*4{s1}

011b: 66 ba 0000017a move.l #prog_ende,r1
0121: 66 83 c2 0f addq.l #15,r1
0125: 66 c1 ea 04 lsr.l #4,r1
0129: b8 3100 move.w #$3100,r0
012c: cd 21 trap #$21

;*************************************

012e: 00 00 even 4
0130: 00000000 old08: dc.l 0

0134: 06 int08: move.w s1,-(sp)
0135: 57 move.w r6,-(sp)
0136: 66 51 move.l r2,-(sp)
0138: 66 50 move.l r0,-(sp)

013a: fc bclr.w #10,sr
013b: 68 b800 move.w #$b800,-(sp)
013e: 07 move.w (sp)+,s1
013f: bf 008c move.w #70*2,r6
0142: 66 b9 f0f00004 move.l #$f0f00004,r2
0148: eb 04 br.b _10
014a: b8 f03a _20: move.w #$f000+':',r0
014d: ab move.w r0,(r6.w)+-{s1}
014e: 66 89 c8 _10: move.l r2,r0
0151: e6 70 out.b r0,#$70
0153: e4 71 in.b #$71,r0
0155: c1 e0 04 lsl.w #4,r0
0158: c0 e8 04 lsr.b #4,r0
015b: c1 c8 08 ror.w #8,r0
015e: 05 3030 add.w #'00',r0
0161: 66 c1 c0 08 rol.l #8,r0
0165: c1 c8 08 ror.w #8,r0
0168: 66 ab move.l r0,(r6.w)+-{s1}
016a: 83 e9 02 subq.w #2,r2
016d: 79 db bpl.b _20
016f: 66 58 move.l (sp)+,r0
0171: 66 59 move.l (sp)+,r2
0173: 5f move.w (sp)+,r6
0174: 07 move.w (sp)+,s1
0175: 2e ff 2e 0130 jmp.ww (old08{s6})

prog_ende:

> I try with XP in DOS cession, i want to use with DOS 5.
>
> The non TSR version is correct, but computer must wait !
>
> If somebody have an idea to have an usefull TSR file, i appreciate !

The only TSR program I use is matahari.com. It is a debugger running in
the background, press F12 and you can single step through the currently
running program. Execute the batch below to get the binary com program
(or download the source code from http://bitlib.de/pub/assembler/ass486.zip ).
For DOS5 you can compile it with "V86=0" to be able use the hardware
debug registers and to examine memory above 1 MByte.


==============================================================================

Use this debugger only on a 486 in real mode (no EMM386 loaded)
and the graphics card in text mode. After starting the debugger
(MATAHARI is a TSR program) you can activate it by pressing the F12 key.

If you assemble the source with V86=1 it also works with some
restrictions in a V86 DOS box in windows.
Also some VGA graphic modes are supported. But for a first use
you should really us a 486 in real mode (it crashes on 586+ when
displaying the control and debug register of the processor) .

The program was never really finished. I used it to
debug my own assembler programs but also to debug
external programs. I always added only the function
I just needed.

If you want to debug your own program, insert a jmp -2
at the beginning (or any other point) of your program,
start your program and then press F12.

*******************************************************************************

Press F12 to activate MATAHARI. You will see the output
in the upper screen. Press ESC to exit MATAHARI. There
is no way to unload MATAHARI.

Inputs: (German keyboard, maybe different for US)

0-9, a-f : Input of HEX number
Backspace works
finish with:
CR : number is used as offset for the memory pointer
# : number is used as segment address for the memory pointer
shift CR : number is stored as a byte in (memory pointer)
ctrl CR : number is stored as a word in (memory pointer)
alt CR : number is stored as a long in (memory pointer)

SHIFT f1-f10 : memory pointer is saved in savelocation 1-10

f1-f10 : memory pointer is restored from savelocation 1-10

CTRL f10,f1-f3,f6,f7 : segment adress of the memory pointer is loaded
from s0-s3,s6,s7 (DS,ES,FS,GS,CS,SS)

ALT f10,f1-f7 : offset of the memory pointer is loaded from r0.w-r7.w
ALT-GR f10,f1-f7 : offset of the memory pointer is loaded from r0.l-r7.l

ALT f8 : memory pointer is loaded with the memory address where the
content of the processor register is saved
(r0.l - r7.l, sr.l, pc.l, s0.w - s7.w) (just a simple
workaround to modify the register of the interrupted
program)

ALT f9 : memory pointer is loaded from s6,pc.w
ALT-GR f9 : memory pointer is loaded from s6,pc.l

If the graphics card is not in text mode but in graphics mode,
MATAHARI doesn't automatically detect the graphics mode. By
pressing the NUM key you can switch between:
- VGA 640x480 16 color
- EGA 320x200 16 color (40 character/line)
- VGA 320x200 256 color (40 character/line)

for 40 character/line modes you can shift the display by
pressing the keys / * - on the numeric key pad.

You can switch the display format by:

INSERT : register content and next three instructions
POS1 : memory dump in hex
PAGE up : memory dump in ascii
DELETE : disassembled code (16 Bit)
SHIFT + DELETE: disassembled code (32 Bit)
END : processor test and debug register
PAGE down: memory dump in ascii for 40 character/line graphics mode


other inputs:


s : search for 'search string' starting at the memory pointer
(search range: up to 640k if memory pointer < 640k
up to MAXMEM if memory pointer > 1M
(MAXMEM is a parameter in the source code)

<shift> s : Input of the search string in hex
finish with RETURN or ENTER
BACKSPACE works

t : search for text starting at the memory pointer
(search range: up to 640k if memory pointer < 640k
up to MAXMEM if memory pointer > 1M
(MAXMEM is a parameter in the source code)
(used for debugging adventure games)

g : enable A20-Gate

u : exit RUN mode if a trap or rte instruction is executed
(status displayed at the right in the last line: T enabled,
t enabled but not for trap #$21 nr. 3f,42 (DOS read and seek) )

i : break in RUN mode if an in or out instruction is executed
(status displayed at the right in the last line: I enabled,

---------------------------------------------------------------------------

p : print the 8 line display (select lpt1/lpt2 in the source)
oe : print only the first line
l : print empty line

if assembled for PostScript printer:
o : Initialise printer (must be done before the first p or oe)
ue : eject paper

---------------------------------------------------------------------------

shift x: the offset of the memory pointer is saved as linear address
of the Global Descriptor Table; the segment part of
the memory pointer is saved as selector for the Local
Descriptor Table.

shift y: the offset of the memory pointer is saved as physical
address of the Page Directory Table; if the segment part
of the memory pointer is 0, then paging will be disabled
(then offset doesn't matter), else enabled.

x : the memory pointer is interpreted as Selector/Offset and
converted to a linear Address. After conversion, the
segment part of the memory pointer contains an error code
(0: no error) and the offset the linear address.
y : the offset of the memory pointer is interpreted as linear
address and converted to a physical address. After conversion,
the segment part of the memory pointer contains an error code
(0: no error) and the offset the physical address.

before you can use the commands x and y, you have to specify the
table address by <shift> x and <shift> y (or insert the values in
the source code)

---------------------------------------------------------------------------

ctrl TAB : at the memory location pointed by the memory pointer
the bytes eb fe (jmp -2) are written. The old
memory content is saved together with the address.
This can be use as breakpoint when the debug register
can't be use (V86 mode or DOS extender)

alt TAB : the next but one instruction (pc.w) is overwritten by
the bytes eb fe (jmp -2). The old memory content is
saved together with the address.

shift TAB : the saved value is restored
WARNING: only one value can be saved, i.e. before
setting a new breakpoint by ctrl/alt-TAB
the old save value must be restored with
shift-TAB

TAB : the address of the saved value is stored into the
memory pointer

^ : this key is activated only if assembled for DOS extender
support (calculates the address of the next instruction
of the interrupted program). Overwrites the content of
the save location F1 and F2. You have to adopt the source
for the used DOS extender.

---------------------------------------------------------------------------

ss: dr0 is transferred into the memory pointer

ctrl ss: the address which is specified by the memory pointer is
written into dr0 and dr1; breakpoints by debug register
dr0 and dr1 are enabled (dr0 for code and dr1 data access)

alt ss: the address of next but one instruction (pc.w) is
written into dr0 and dr1; breakpoints by debug register
dr0 and dr1 are enabled (dr0 for code and dr1 data access)

shift ss: breakpoints by debug register dr0 and dr1 are disabled

ALtGr ss: breakpoints by debug register dr0 and dr1 are enabled

' :\
ctrl ' : \
alt ' : > same as ss but for dr2 and dr3
shift ' : /
AltGr ' :/
---------------------------------------------------------------------------

NUM field:

4 : decrement memory pointer by 1
5 : decrement memory pointer by 1 line
6 : decrement memory pointer by 4 lines

7 : increment memory pointer by 1
8 : increment memory pointer by 1 line
9 : increment memory pointer by 4 lines
+ : increment memory pointer by 8 lines

0 : restore for 1 second (486 66MHz) the original screen
content and keyboard interrupt routine (this way you
can make inputs to the interrupted program)


ERNTER: execute the next instruction

If the next instruction is a 'jmp -2' (opcode eb fe) this
instruction is skipped. <shift>ENTER replaces a 'jmp -2'
by two nops (remove a breakpoint).


The RUN mode is started by the following keys:

1 : execute program till the next br jmp bsr jsr rts
2 : execute program till the next bsr jsr rts
3 : execute program till the next rts at the current level
(i.e. not a rts from a nested subroutine)
, : execute program

Pressing any key will stop the RUN modus. The RUN modus is
also stopped, if a trap, rte, in, out is executed and the
corresponding flag is set (see keys u and i)

There is currently no way to modify the register content of
the interrupted program. A simple workaround is given by:

SHIFT CURSOR up: increment program counter by 1
SHIFT CURSOR down: decrement program counter by 1
SHIFT CURSOR left: increment byte pointed by memory pointer by 1
SHIFT CURSOR right: decrement byte pointed by memory pointer by 1
CONTROL CURSOR left: increment byte pointed by memory pointer by $10
CONTROL CURSOR right: decrement byte pointed by memory pointer by $10
number and shift/ctrl/alt RETURN: load byte/word/long byte pointed
by memory pointer with number


***********************************************************************
Parameters in the source code:

I486=1 ; 0: for 386 >0: for 486

V86=0 ; >0 you can use MATAHARI also in V86-Mode,
; but then the offset part of the memory
; pointer must not be greater than 64k,
; memory above 1 MByte can't be accessed

TIMERINT=0 ; if <>0 with any timer interrupt
; the program checks if F11 was pressed
; (some games replace the keyboard interrupt
; routine or filter F12)

KEYINT=0 ; if <>0 on any activation of MATAHARI
; the interrupt vector for the keyboard is set
; (some games replace the keyboard interrupt
; routine or filter some keys)

NO_INTERRUPT=0 ; >0: interrupts are disabled when MATAHARI
; is active (necessary if a interrupt
; routine sets the size of GS to 64K
; >0 only if V86=0 !!!

MAXMEM=(512*1024)*1024 ; 16 MByte + 320KByte (size of PC memory)

LPT=2 ; 0/1/2 printer LPT0,LPT1 or LPT2

NODIS==0 ; 0: with disassembler
; if MATAHARI must be very small

CONST_LANG=1 ; fixed program length
; useful when you have to modify MATAHARI
; while debugging a program, so the load
; address of the program is the same

PS=1 ; >0: PostScript printer

SAVE_ONLY_BW=0 ; screen is only saved in text mode
; if MATAHARI must be very small

DOS_EXTENDER=0 ; if a DOS extender is running, the return
; address from the keyboard interrupt
; is not the interrupted program (which
; you would like to debug), but the
; DOS extender itself. You must adopt
; the code for the used DOS extender

FINDCHANGE=0 ; better don't use it

==============================================================================
The binary:

@echo off
echo hD1X-s0P_kUHP0UxGWX4ax1y1ieimnfeinklddmemkjanmndnadmndnpbbn>bat.com
echo hhpbbnpljhoxolnhaigidpllnbkdnhlkfhlflefblffahfUebdfahhfkokh>>bat.com
echo wvPp0w@FGl9C5/R/pN0d0uDFG8bwo1Yi38JWtbGov5//B6mkuMEo0IL0l/w>>bat.com
echo ef2iC57R/pNEA/jeefHhC5AR/pNEA/juefXgC5ER/phCfDM@m042knfuur5>>bat.com
echo I8PlZTa4Xol/gXcTaNZhcUYgZNX9K/AWgN02C3sWB0bNKN8978PVvy0MqcO>>bat.com
echo 4UNuqBeZMKUu2EgZAr/u1EgaBckDMKkeH/i/3HnVsL7atmx5sJ/zzzzzLrB>>bat.com
echo a0ZNGx/ea4Xol/gXcTaNZhcU3gZNiYX0O4/RHMa@XuJ/atGcO4kNaJKW1Gk>>bat.com
echo KDYeNON5K2Pa@rPUL0wzzzzDRwM5Ia8p2cOKAG62kCWyNaJqW1GkKatGC5c>>bat.com
echo J/pVVNi3eL0Ma@6PUL0kpNaJKW1GkKDYeNON5K2vWx5QJ/zHL/DvWx5kN2z>>bat.com
echo z/V0tL/atmc2FU@AulF3MKA/Xp6S/Z@qP/eBwDR7R5Uskw23qI/b07CCz/V>>bat.com
echo 44kN/WnnDEMD0Q5UsoQResWx5UO2zz/Wh3kN/WL/VwEVY3U@/u2F3wn23GD>>bat.com
echo /i/cD3FUEDEcu/YS20sWx5YO2zH6Eb07CYz/Vx2kN/WHtDEMx/Q5Usky23q>>bat.com
echo C/b07Chz/VZ2kN/WXtDEMr/Q5UsQy23KB/b07Chz/VB2kN/WnvDEMl/s1Uy>>bat.com
echo kN23wkUJ1U@/u2bB3ER8R5UswERFQ5Us4/UmlnN/WL/DSLBdn8/b07Ck86@>>bat.com
echo b07CzxUVC1kN/WHuD776/Q5Usgy255YT/Q5UswTRCQaW/4/8sk27ot5DcEb>>bat.com
echo Ob07C1z/VH0kN/WnkDEsG/Q5Uscw23C3/b07C@z/Vv/kN/W2uDE7@/Q5Usc>>bat.com
echo t23G1/b07CzLb2bd7E0E1Cw/0RIk25o0V2TUS42Ar6a4uE3sc66Fkniwj0R>>bat.com
echo qku6smzCoN2sVU@/u2bB7kROPa@VC30isc66FU@5P/bB/U@Au0ABsk6AOUA>>bat.com
echo Bkc8oo/XiMH2AOVCBMqc7oUN8O02BMKWC/F2aZc6IoUN8u15BMKWqkF2aZc>>bat.com
echo DUok2V/gNXmH2D31maB9EBwE7EPqc3pk2VUhNXWI2D31waB9HBwE7sPqcEp>>bat.com
echo UN0J1/zzzzDA1yDO/@Bwc0soUNQOqX5UG2DO/9BMKWaEG25PkJ0wz2uO29B>>bat.com
echo U/uIqjl5MJ/zffn2kCIkOUv1lCe0wEZ5kI/9VZvvPg0h4//cXj/dHI3yJUy>>bat.com
echo qP/IBwDR2Ui5xPKcwok2X/gNV1I2DA1ma49FBwk7EPKc7pk2XUhNl/w2X/j>>bat.com
echo NV1J2DA1ya491BMqWKkE2ahc2EoUN@u04BMqWiUF2ahcBQoUN@u27BMqWaE>>bat.com
echo G2COVCB/c2eoE/axjBco/OZwjBso/OZwjBgoUX57H2CO1BBsc@qoUXS/H2i>>bat.com
echo Mg0L4//axAIY25DMJb3k1WtUUJJ8KSUCN//0o4u0t6zDXZ@qPUJ0wTR4smz>>bat.com
echo i7K/a0a6AWgXM2PfczG/Y2ax5kK/zz/Wg1k24qD/w/SR7Mg0g4kzdv7/w3S>>bat.com
echo R7Mg0g4E/d@7/woNR6/c8h4kxfT6DeKr0/OGP0ozuglXhpR/UaoK/yjSMwU>>bat.com
echo PR6/c8h4kvfP4DMRbIwoFR6/c2h4/1fT3DeIr0/uEP07kuwkXBpR/UCoK/0>>bat.com
echo gSAwUHR6/c2h4/3fP1DuIr0/OHP0/ouPMq2qOFK0Q5W1qJJZsjksM0K0Ib/>>bat.com
echo yfAWKYJ/ku9u01/gUMC7TMKMEygl5kK//k26pF/gNhimwoFR6/c2h4/1ffB>>bat.com
echo DRKr0/OGP0QzuDnHBpF/gOhCfwQHR3/@JfH9DsIr0/uEP0/muom2ipR/Uao>>bat.com
echo K/TjSewMYQZmnIr490JgiUyP/P0kHlDIc1//PEPNg0g4//dvqz/u2P0MUQ1>>bat.com
echo Og0g4//dfrzF84IuG5/YH5e1E61tG5/WvjGp8DKaHaKNBgNGNq2qO0K0cX4>>bat.com
echo N4/Rovj0M4kN99MLJJWNOBgNGNq2qO0K0cX4N4EyolUz5UJ/bdcURJJ8sPa>>bat.com
echo K22ZIQejiCD/vWuI/k5Uv1licD4UGkCUv1licE4UGkGUv1licF4UGkKUv1l>>bat.com
echo icG4UGkWUv1licH4Ui3D/vWGJ/k9Uv1licJ4EbOVpkE84buf@l2Uf/DwiiC>>bat.com
echo D/i4/kvkCkvk5kvsWkzjrdKMBAIGldyuuw/k5UWawI/j2v/9O1I0wCg3cc8>>bat.com
echo F4kvkKUWa7J/j2@19OmI0wCcC4UvuGw/k9UWaIJ/j29J0sSbOVpkqP/H0wT>>bat.com
echo RhMaJaRZ0D/9XSvcly1/iCOiNlMjNzqBKZMKi/4E8wDzNaFKdD3u0axZNSB>>bat.com
echo AuTwDuaxjNUNk2Um7qC1Ai//eXUffn2MqjRXJ8/uHH07kQ5Nqi/IE8wX@0/>>bat.com
echo wiN8ahNlMzwbN5NZW@00wiN8ahNlMzwbN5NZW@01wiN8ahNlMzwbN5NZW@0>>bat.com
echo 2wiN8ahNlMzwbN5NZaCd//cDB4k/ntZNv1/4ZkDi3/kvaZMqa4XxbF5daBc>>bat.com
echo l27yxsGE/jPKWNPaj0gpNYFeN2Ow/WTDi37kvaZMqatf/PR5NYOqU5DUsrX>>bat.com
echo @02wiN8ahNyCkKbF5daBcl27yxfz2UyoI/3A6CwX@0/wCuL//i33kvc20/s>>bat.com
echo GU/jXS1/U@02wCu1/kuNg@E/MKAqPKiIgpwbN5NZOqU5PkGptykD3u0a45Y>>bat.com
echo dLbzqP/H0wTRYMaJaRZ0y1/iCOgNlwjNyqBKZMKi/4E8wDzNaJu0axZNSBA>>bat.com
echo ubsjNUN/i//eX/PajRXJ8uGw//uHH07kQ1Nqi/IE8wXf/0wiN8ahNlwzwbN>>bat.com
echo Kds9U/jPKWNPKAzDzNaJ9i1EkvaZMqa4nznTaNZWf/7wiN8ahNlwzwbNKdd>>bat.com
echo 69//uHH0AkQONqi/EF8wXf/0wiN8ahNlwzNYOqU6DUssXf/1wiN8ahNz5kK>>bat.com
echo bFeN2Sw/WXDi1EkvaZMqaxf/PR5daBsl27Cys9/1jPKWNPqj2gpNYOqU6DU>>bat.com
echo ssjCE/uHH0EkQtkDi13kvcT0/s9U/jXC3/Uf/3wCu8//i1Ukvc@//ffli/0>>bat.com
echo UNlwjNtGlKnTaNZOqU6PkGpxykf2k0a45YdLIza05DU760wwbR5/@7f@UNU>>bat.com
echo V7laZ@E1x//uab/gX9Ub4iyop2WUf@S1siiu8/v7GAgDsSi9/Usy2f2iPKi>>bat.com
echo /8o2/cPS1kCe/SKsuLL05PkdB//gzf@S1sCWUffS1siNV0tk5PkdB/UNV0t>>bat.com
echo kENaIbdc/1F7koN/uLyzun2WNOVpkZM5M5sPLK4nzqP/H0wTRSU@/su7kt1>>bat.com
echo c/oCUW3MY88KkF68ixfD/uRmz0a45Y2X@/Uu7kc26z/uHH0//RQ/cDB4E/o>>bat.com
echo B6UyoI/1w/VE2/UyoI/2w/VT4EuBzTj7/EiE0UWQMIUXz6/0Dy/0CwQYcs0>>bat.com
echo aUM09SI/aUMVE0UW68U87K7c/csF2M1W41D/9S30aUMV/4UW6JU87K7Y0cs>>bat.com
echo F5M1W41S/9So0aUMVk7kFW@PU62X/BJ6edzqz2MHA9o@1/Y@9/c7654ssz0>>bat.com
echo EkXDEU2D689SU87KUW64U87K79/csF1M1W414/9So/aUMVs0UW6FU87K7c/>>bat.com
echo csF4M1W4WA/9SY0aUMVk2UW6RU87K750QYsm5clc/EU6XF/BJ6ddbkz2MHA>>bat.com
echo 93P/uGw/s9E/jXC9/c@l2Uf/1wCuS/Ui3D/i1EkvcH0/uGw/s9/1jXi1/c@>>bat.com
echo l2Uf/DwSuFvjJLp@1/c@9/c762OQ/0CyT/3ws23sknF1h7QZW6AYoEDb0aM>>bat.com
echo Q02gC0aMQ0D/Ao3Ar0aMQF3Aku4MWl4Fk20SAE0sDnpNxL2SA19xEVuyTU5>>bat.com
echo X1/0SAk7oo24euzTRYL04ok2MHA93P/uGw/s9E/jXC9/c@l2Uf/1wCuS/Ui>>bat.com
echo 3D/i1EkvcH0/uGw/s9/1jXi1/c@l2Uf/DwSutsjJLp@1/c@9/c762OQ/0Cy>>bat.com
echo T/3ws23sknF1h7QZW67BonNU85Lk/fHU85Lk2/2B0nRU85LI/2gS0aMQF0w>>bat.com
echo kE0SgJ/sDnpNxL2Sg/9xEVuyTU5X1/0SAM1oo24euzTtJE0BAIGVck/XC03>>bat.com
echo /2DtMb/3Q1W4Q3WEHm23/2DtMb/3Q1W4QYKMBQk/X/uKzTk/X/uEzzka4Ak>>bat.com
echo 7UCmzPKk/X/u0zjN02A1cfvza4Ak7UygzDgNENaIFNKW1b@1/MKA/Pq2Y1B>>bat.com
echo 0p0VN0@A0W2zuNMKA/Pq2Y1B03/2DtMb/3Q1W4QYN0@A0WTSKadZNMBgTF5>>bat.com
echo UTCM5M5w/ezqZJaRQ0cA6QiAsl3Mql4QL9u/kU6DUNl7xWKEG2COUCBYf2/>>bat.com
echo 3cyzzDRGQa8@9Ul4/mFcrfz29g/m8UscbPfKZGyqNUl4/mFWDjN6LUQkc2/>>bat.com
echo aBsl2Mai7oE8tG//bNqW1MqU1HUl4/mFcDdzWzil4/mFaRQ0U76BuAsl3Y@>>bat.com
echo 0/QaN@9UN29A05L/76VSQy@yvaRQ0kBaCUAsl3MKcgo/uStzgkMaikoE8tO>>bat.com
echo //aRQ0U/mQ/Asl2UM66NQ0uQYz22syoI60yDgz2TqW1MqU1@/uUsjsMTQ0U>>bat.com
echo /mU6@UN6LkQmd272SA0a499BUy3yvc@soUN@O2@BY@0/UC6OU@I/MT0zHb0>>bat.com
echo 6VIRrjy05L/76VIRt@itVWJ2cfRz5LUC6NKcIp/uQrjl4snFa4eZBUivxbP>>bat.com
echo rMZGyqNUl4/mFWfjx5UO2zHb15LYzIV605LYzoNj0dqkzoFUl4xTGDYu0a4>>bat.com
echo 5Y2P5MDUeN@u0JBsc@MpkjRNZi7//XcXCTxPQ0uQYN8WBuzpjl4/mFt10/b>>bat.com
echo JaW2MqE5L/76ViCx@Sw6L/7UAsl1MKiEgZNdgwNZds/aB3W4QYspfo24ivz>>bat.com
echo DYeNV0tka0q2cyPLKd@1/MqWSEJ2Cu1KBk7ucvFz5LUC6NKWMXS7xPQ0UQI>>bat.com
echo i/0kNZds/aB3W4QYspTQ0U/mU6@UGDIsozzEea45Y2P5MDUujRN4cPqUcjU>>bat.com
echo YXiUJ2ahcBIpUN89jNxyN2ZY@1/UCwMMKWnPK9HTaD7q4/aJ3iE0Ux4wDR5>>bat.com
echo Q3GpRzu6MQ0UQ3GpZjsNPg0jU3/DYeNV0tka0qjRNZN6LUQkImU6DUNuWE2>>bat.com
echo ZY@0/QaN@9UN29A05L/76ViUw@yv5L/76Nql4/WQocnU6HEi3/kNahc/aBc>>bat.com
echo k3MQ0UQ3uUljsjPql4/rMu/mU6HUNVmG2cr3zn1XNu1H2ZYf0/Mql4/17n0>>bat.com
echo kU6D/WRQYl4cnFyDAUvHHR3szkyDwN@9UN29g/cz/zWXxl4/172Sg/aRQ0n>>bat.com
echo 8bCUAsl3MKcco/u1kjN6LkMm0XC2SA05L/76Nql4oG@homU6HUN6LE@hoG@>>bat.com
echo 2SA0aRQ0U/17UAsl3Mql4AaQlcnU6HUl4/mFaRQ0hoG@hAsl3Mql4oG@hom>>bat.com
echo U6HUN6L/7U/172SA0aRQ0X8bAuAsl3MQ0UQYN6LE@hoG@2SA0aRQ0hoG@hA>>bat.com
echo sl3Mql4/17U/mU6HUN6LkMmBXC2SA05L/76Nql4oG@homU6HUN6LE@hoG@2>>bat.com
echo SA0aV@7U/17aZM0aZMF3MKW4VUN8K322SA3aRQ0o8rAuAsl3MQ0UQYN6LE@>>bat.com
echo hoG@2SA0aRQ0hoG@hAsl3Mql4/17U/mU6HUN6L/RmFXC2SA05L/76Nql4oG>>bat.com
echo @homU6HUN6LE@hoG@2SA0aRQ0U/17UAsl3Mql4EbQpcnU6HUl4/mFaRQ0ho>>bat.com
echo G@hAsl3Mql4oG@homU6HUN6L/7U/172SA0aRQ0o8bBuAsl3MQ0UQYN6LE@h>>bat.com
echo oG@2SA0aRQ0hoG@hAsl3Mql4/17U/kU6DUN6L/RmRXC2SA05L/76Nql4oG@>>bat.com
echo homU6HUN6LE@hoG@2SA0aRQ0Y86AuAsl3MaiwoE8tG//bNqW1MqU1HUl4/m>>bat.com
echo Fc2ZyWzyl4/172Sg/aRQ0Y8bBuAsl3Yf//QaN@9UN29A05L/76Vy9u@yvaV>>bat.com
echo @7U/17aZM0aZMF3MKW4VUN8K322SA3axE/Cgr3aRQ0dF5RmBsl3QQ0u/mU6>>bat.com
echo @UNVqr3cDTy6L/7cAsl13uSHUSqtPql4Y17U/mU6HUND3U0vBVN6LkNYFbQ>>bat.com
echo 2SA06LUCUAsl1MKcxB0uyazl4/192Sg/Vir3cHOyaRQ0d/17UAsl3Mql4k5>>bat.com
echo No8rU6Hkl4c272Sg/aRQ0hoG@hAsl3Mql4/17U/mU6HUN6L/Rmd272SA0aR>>bat.com
echo Q0hoG@hAsl3M5iU/17UYv4/MKW4Asl37Cy2yi/VWJ2cTIy5LUC6NKcIp/u8>>bat.com
echo Zjl4snFtqBKdYjR5MQ0UQYsnPKMECgT6M5MDUujRNZi7/UN@u0JBsc@MpEi>>bat.com
echo c/kNZds/aB3W4MQFc/mFW6zU6XWGDIctzzEea45Y2PUTKM5MDUeNzqZJZM5>>bat.com
echo iU/17UY@c/QaN8SUN2SA0WPjNzqZJZgc2qCFE04RuoNaNuWv3ZQaW1MaEbV>>bat.com
echo sVUi4ujVDgUQ5W6MqFWXCX7v7uat@iHIWNzqoJZUCbIMqHaRoNqTkzpVzN5>>bat.com
echo T/7at@iHIWNzqtJZMg0jUI/cf645Pk@70UNDNqFbNz0zL6ybNw0UwEea45Y>>bat.com
echo 2PKA/69KBMKkUHUN2M/JBMKizrT1/MKC7@r3apH8E/UQ0lZNtyTzzzVNtUw>>bat.com
echo QFNK90vc@MpUN@u0JBMqEaZMr@OVhH7IoeHrBlwjN8iyNZds/aB3C4Wv3pR>>bat.com
echo kFtQxQMgSvaJIUx2/wmhEUh2/UAWS0/UUXcTasGPKWiEJ2Au1KBAAUycN25>>bat.com
echo EL05PUaBAUNl/QcMpUN02C0aBU0IpUNt1/z8/UNtUgQ1gSSaZGkCu1KBMqW>>bat.com
echo SEJ2a4sk/7E8uG0/loyNZds/aBIUv2/wmhEUf2/UAWS0/UUXcPKGop21/L6>>bat.com
echo 10eD4/Ebpfj/DU76op4EFwwrR8fIR@6Mz1/UQ53Mz9/UREMKUfDlKa4MkHg>>bat.com
echo pueOKUfHlKaZc6Ip/XiUJ22PKUyEJ2Qp6B0u1KB//1mpUN0O/JB//UZYL7f>>bat.com
echo jScMpE0/Ukl5UJ2Z3As3MK/5EJ2tZUN6P/JBkZN0u2JB//wZMbI0u2KB//y>>bat.com
echo ndFU5UJ2/UUN0u1JB//UZMKUyEJ2//T8q0XNl/QcMpUN02C0aBU0IpUNx/U>>bat.com
echo zD/UR5M5i/sz2/MKW1PKkcHkcMpUN29y2aZc4Ip/cOqUz7LL0crrxfrWz7L>>bat.com
echo L0cXByfHWz7LL0crGyfjVz7LL0cfKyf@Vz7LL0cLPyfbUz7LL0cbGzf2/uI>>bat.com
echo DDumziNl7BW12hsbxjckNF8kF1QLsv4ySVjLsv4ySVjLsv4ySVjLAx4e9mS>>bat.com
echo Xwy4Pm0QY/68bT0QYA55kF1HYE58Fr0aRs77kFW/M/68LTFOMAy4fTl1N/6>>bat.com
echo 8kF1QYo87Ar0QY/68kFWGMkB7e1mrL/68PT0QY/68kF1QY/68kFmAN/68kF>>bat.com
echo 1QYII5OZlPNEM5Ma0fN/Q5Ib0uNkT5CY0QYkm5ogFTPkH5KeVbO7i5AjV6Q>>bat.com
echo g16skVIQI36kF1QY/68kF1QYg56eY0QYAs4colWL/689p0QY3L6kFWfLYH6>>bat.com
echo qSlSLAt4kF1QY/68kF1QY/68kF1QY/68kF1QY/68kF1QY/68kF1QY/68kF1>>bat.com
echo QY/68kF1QYUC3lPg0K4//dvAv5PUaB3Eu3sjl5cN21YCzxPg0Oqk/dHTz5P>>bat.com
echo UaBEUl5gN2/Mj0h4k/DEMsxPg0PqkzdbRz5PUaBIEuFrjl5cN25YSmxvDma>>bat.com
echo 4g8Kq/0/MUZBUSrpXyMmbCXy22kfbCg9gStkikuV2@2frBgBgSqkukuJ2v2>>bat.com
echo f6hN0vWZBEk23uMzcvOxcHXwdrZzCu1KBMqWKEJ2a4eZBMql5MN2QNj0h4k>>bat.com
echo /pJVx5oK/AIL4qPEP0/FRJMqcIpEuHpzNZVc/dnIzbJKW1YSFxTaNZZc/dr>>bat.com
echo HzrP/aBwzzDIs1y6eZBA9KBQg0KqE8dHGzcz6zdvFzqPEP0AER5UywvbS3x>>bat.com
echo XSJvXyhlXSphnX/mZDD9Qr7yXwWyMv3FziQ8/As3UMVsClu3UEVsCFUzH0/>>bat.com
echo n8xz5Mv3fnAD@I60k/wuLnX6pF/g9gynw/HR3/v1fTADiI60kmkuzm27pF/>>bat.com
echo gBgyhw7FR3/f2fz9DVI60kykubmX2pNFUaMv3yzzUiMv31YrU6PUhHIGuux>>bat.com
echo DDQw/V4mDDNx/VzlTulxTutlDumxCU5oI/0/cDB4k/DMM0/Mg0B4//c6Vvd>>bat.com
echo r4z6PEA9IGuIlzl53X1I/Eu@lzl53X1c/Eu1ljNueJ2ZMKimoE8ah@2BIGu>>bat.com
echo o1UNu1K2ZMKiooE8ah@3BIGuT1UNuOK2ZMKiqoE8ah@4BIGu91UNumK2ZMK>>bat.com
echo iMpE8ah@5BImuqNaimpE8aZ@KBIWNvmF2ZgiMad@SBIWNtWH2ZMqiUoE8fv>>bat.com
echo YNu5YTBIWNteH2ZMqiYoE8ffXNuGM2ZMKiMpE8ah@JBImuaMai9qE8aZ@KB>>bat.com
echo IWNvmG2Zgi3ad@YBIWNt1H2ZMqi7oE8qPEP0AERbMj0h4/2p8Xx5oK/EI6B>>bat.com
echo qPEP0/GRLRaN@9UNXGJ2bhcE3A9KBYyGvPKcIpkNaZc/VWJ2bZcE3YS3wTq>>bat.com
echo W0A9KBYCAvnXEoN0D2Jb0VWH2XWJ2bNq2rCUNXGJ2dPlyAu/KBMql5EJ27o>>bat.com
echo E8dPkywAIR539CBA9KBQaN@CUNXGJ2d6jyaxj2IpEudfDUycN21QL1aBc@I>>bat.com
echo p/3dbhy/uXaBAER8MqUiEJ2/ZSmu2cDOq/0DIM1/MqUiEJ23Yyhu2cDOqU0>>bat.com
echo DIcVvPqUiEJ2cYSdu2cDOqU/rZUN2u1JB/IuJeDUycN22I62a4c@Ip//0IG>>bat.com
echo u1eDUycN23wEV8/UN2u1JB/FukdDUycN25wEVzgjN0u1JB/uKd6oKuPqz5E>>bat.com
echo J2dDZy/uXaB7kR8MqU5EJ2EYyEu2cDOqk/pZUN2O/JB/IuncDUycN23wEVC>>bat.com
echo /UNDMf0TqUN0M/JBYC6u2cDOqU0DIsuuPqU5EJ2cYi1u2cDOqU/rZUN2O/J>>bat.com
echo B/IuubDUycN22I62a4c0Ip//0IGubbDUycN23wEVC/UNDMf0WqUN0M/JBYC>>bat.com
echo ot2cDOqU0DIsbuPKU5EJ2UiJuvaDUycN21Q62a4c0Ip/UPZCet2cDOqk/pl>>bat.com
echo UN0O/JB/U/ZYSZt2cDOq/0DIc2/Mq2qOUdBMK/5EJ2d6YTt2cDOqU0DIMHu>>bat.com
echo PKU5EJ2/4E8dbKy5P/bB3kl5oN2ZgSM5P/bB7kl5oN2ZgCJ5P/bBAkl5oN2>>bat.com
echo ZgyF5P/bBEkl5oN2ZgiCcv1v5PUJ0/UNti43b8Sz5PUJ0wTuQYTcsoUX/jc>>bat.com
echo BgoU80mnuyLL32O/@B7Ux5oK/2EL0aQA0E18uTHy2uu19BU/ufjSuiSix5o>>bat.com
echo K/2Ir6qPEP0kERfMj0h4/3pNIcWolcMpUNVGG6aB9JBYils697Rsc@WoVN@>>bat.com
echo O08RQKN89EunWjXiUJ2ahc4IpkNZhc/X1G6AuW7RMKWKEG6bJql1gizd68y>>bat.com
echo Cu1CBMKAqjcBgokjnV1u/jkNZhc0X1G6AuW7RMKWqEG6bJql5gizdT5yP09>>bat.com
echo LqPEP0Ak23uGyaxj0goEuCVjx5oK/2w/VRYjNzv/@BYSDsPKcIpUXiUJ2qP>>bat.com
echo EP0AERFMj0h4/2DEMzsTKN/W13dr0ybJaz7Yi4sPKcIpUXiUJ2qPEP0AERF>>bat.com
echo Mj0h4/2DEcpsTKN/1/3dPzxbJaz/Yyvrf@1/Mg0bqE/ahPLKJGiE0kN9CUN>>bat.com
echo 2Vi/gPj0bqkzDEMnr@Svkq/u/kCg9UyyffIRRbyirfP//gimadPrRI1u1lS>>bat.com
echo u1WD7l/2AUEKOXF67WJqNdt57jkqLm4aPY0WBk/1NZN57jwqLm4aPY0GBo/>>bat.com
echo 27YJaNUwGRT8LMiF57l/27YJaNUwGPdF6RZ01Bm/27YJaNUwWST4aMn01CU>>bat.com
echo EKNa0m@gxZNg4qNU327YJaNUwmQU327nFbQdtqNUEKNa0m@X86Pa0mSXJbQ>>bat.com
echo mJaPo0rPdt5RUcrLV8qQUALRW01Np067pxZQVt5NUkKNUg6Qj067kx5QUoK>>bat.com
echo OoFLNUkqLalKMb0GAUsKNUgrNn4aRZ0mQcxqRk4qNZ0mNmJqQoxaQZ0WPZR>>bat.com
echo KTUYaNU/27o8LMiB6PVFLNUw1PTN5PVR57gxZNg4qNUsKNb01NZN57gxZQV>>bat.com
echo t5NUwqLm4aPY0GPjNLNox57x0mSZVrMc01Qj067gxZQVt5NUI5SXV57hxaR>>bat.com
echo ZFrPx0GOaJ5PnJ57x01NZN57jEqPUg67vBKRm8LNiFbNdlKNU7LNVF57kx5>>bat.com
echo QUEKRk0GAk/GNl0mSkx5QUAaQgNKTUg6Np067lA27Z467v0rPkp67vFKRk0>>bat.com
echo GAm/GNl0mSkx5QU/27k/GPjNLNox57X86Pap67vFKRk0GBUIKQUg6Qj067Z>>bat.com
echo VLOop67vB67ZVrMc01AUI5SXV57kJ6RUA67nVqPr0GTUYaNZlqQZ0GTUYaN>>bat.com
echo ZlqQZ0GTUYaNZlqQZ0GTdNKNgBLNUo67gxqPk01PTN5PVR57l/WPZ0mMp8b>>bat.com
echo QZt5RkxKOiF67jxZQVt5NUsKNUI5SXV57gxZQVt5NUsKNUwaQUwaQUgrQcx>>bat.com
echo qRk4qNZp67dN57x01NZN57jAoPp8LOZ867aZaPYNqPiF670hZBU/27k/1CU>>bat.com
echo /27ko47h4qOZNqPiF67nJ5RaxaPo0GBr/27k/1Rm4aPnlKMoJ57t/27mx5R>>bat.com
echo VFLNUkqLm4aPY0mPT8LMiF57hxaRZFrPUEqPU/UNue87ZUSVdbSlpL/0//P>>bat.com
echo 2czFuke/uOYSupKjx5oK/2Ib5ahc2IpkWSUJ2cf4/aZc4IpEcJ3mcMpEuwG>>bat.com
echo jNVGJ2aBO1V39KBAO2VYyUpPj0h4k/pJVN@O0JBUC10MqcIpEcJ3mcMpEuD>>bat.com
echo GjNVGJ2aBu2V39KBAu3VYiJp2/7E1/9Z/py/3kKa0q2c52kCWiN@OF1VMKU>>bat.com
echo XnzzZMg0J3G/DEMN/Qzk3/k2418/bNKXIcVN29g/cj9/mRpNZd75a4wm7Ma>>bat.com
echo Ecn8/m0pNZd75a4wm7MaEcr7/mZoNZd75a4wm7MqU1D/uw0UQ/RKN9WVN0j>>bat.com
echo A1a4kmaZc6J51yDYeNV0dN@OFZVAAL6PE4V/0/fXGU5IF7U/kuU3c0J31A/>>bat.com
echo gC50OE4V/3/f2FU5IF7E0ku73c0J31M/gC/tjij0CCyzbMraZsn@uF2VQzk>>bat.com
echo 3/ERO6ssszjNlYAuiwjQKPKWtbsudbozrPk3VwzzphUN81xl5IF7ZUzka0q>>bat.com
echo 2cOKcD3WN85gN0JmzDIm2415/CWiN81hN0Xi4bNKN@GEUc5/RJ4I8//jNxg>>bat.com
echo 47n8ZN85hN0bC2a4MszDE8bNKN@G/Wc5/R14I8//jNxg47nxHUWzz20/hNX>>bat.com
echo Sb76PE4VIm2dOKMEOKcr81y2npl5IF70/kuUQg0J3W//gC56PE4VA//f2ll>>bat.com
echo 5IF73/ku7Qg0J3G0/gC/DYeNV0Ny2Pj0h4k/phYx5oK/AILJqPEP0/l24i7>>bat.com
echo /qPEP0/m24e8/a42kVKr7XWJ2ahc4rBWN8O0JBMKkUHUN0/x2V7gNt7w23a>>bat.com
echo dw6P/KBIWN8O0JBYyWmPKcEpUN0J1wzzzzaB9IBYiSmPKA/69KBMqWqEJ2X>>bat.com
echo Kr7aZcBrBWN02C0a4/wDA1kDA1maB9DBMqc/pUNV1J2a4I8kLmzapk22A//>>bat.com
echo aB9IBYyCmvc@soUNlMzWqkG2zC69cfK0a42kAWyuoOKcEpUNBwkKaB9IBYi>>bat.com
echo 3mvL0qPEP0AER@Nj0h4/2pJZx5oK/EwEV@1Ux5oK/UwEVO1UNl/Qc5FmcMp>>bat.com
echo UN@O0GYMKWKEJ2a4As3MK/EzE7GPKC1z/V76zl5UJ2ZMKWKEJ2dfPwa49IB>>bat.com
echo MKEZwkzzzjNX1J2dbOwa42kVWJ2ahcBIpkc5FWN8O2GYMKkUHUN0/z2X/x2>>bat.com
echo XUhNXGI2aB9GBMKcEpUN0Jm2/wD/ap/w2/k/aB9IBYiOlvc@soUNlMzWqkG>>bat.com
echo 2zC69cb80a42kAWyuoOKcEpUNB/zKaB9IBYSE04jT4sj0cq/UyUO21IL05P>>bat.com
echo /eBwjl5cN20Yy7lPj4dqUl5cN20Yy4lbCvl2/Feeee3h4FgG9dCh4Fe99dC>>bat.com
echo h4HWOecAhZGeuec1hZHcOecAhZFcueeAhZHWG9e7h4FeGee3h4FeOecAhZH>>bat.com
echo euee9h4HemeeAhZFcW9e5h4HeeeeAhZHcm9eChZHcm9e7h4F9fYGYj4FAH3>>bat.com
echo Fij4F9@3Fij4H1PYEgjZG9vYEWjZH7PYEgjZF7vYGgjZH1H3Gcj4F9HYGYj>>bat.com
echo 4F9PYEgjZH9vYGej4H9nYGgjZF7X3Gaj4H9fYGgjZH7n3GijZH7n3GcvL1E>>bat.com
echo /03E/0/EI18YE1LcU1Tck69c//3w/4CIU63/E5N7/07Al3/sE39ks3Hm//3>>bat.com
echo E/VT3U/3U/17EU//U/017U/3UI18Mk25Yg43Ek63Esb0E/07PlXT7U05/E/>>bat.com
echo 17/07U/3/sE3HIF5Fs//3k/03E/0C/U2F3U07/l6/sE30ME/Fs//1MU1GwV>>bat.com
echo /1/k6E/V603U6/s/3EsF3Fs//D3U/1E/03/U2F3V2F3V2/sE3FwE/0sg45M>>bat.com
echo //5Mk43//03U//2k/3AAk4D/k2LUV00M/K8sE32M/0/E//C343L0l4E3V2/>>bat.com
echo sk5FwF3F30/S3F3S3F3S/U2F/03E3V2/sF3F3F3Fs0/T/03S/03T/k6E/V6>>bat.com
echo E/03/sE3E0l4F3V2/3F3FwF3F30/CE/03E/0C/E/03E/03V2/3V3IU04G30>>bat.com
echo /E/03E/03T/E3PIF3F3F3/3F5NIl3H30/C3F3F3F3C/U6F3V6E/03/sE3F3>>bat.com
echo F4Hw//S3F3SEV3F/U2F/V203V2/w003E/03E//F3F3F3F3C/E3F3F3Fc/0/>>bat.com
echo 3F3FIF4P30/F3V23sE3F/E3F3V13E/0/wF/1E/1Ew0/DU/17U/1D//3EU/0>>bat.com
echo 13E//sU/17U/1s//3cEYT9k6/U/01yN/C3k2Fw//E/V6F3F3SPV2E/03C/E>>bat.com
echo /0wE3F3lnKsE3T/V2/M/17k017Ug4D3F3D3U2E/V4N3F3F//0/k/03EU2/3>>bat.com
echo //03E/0YU0E/F3GkV3F//23E/03EUnKck6JIFoKsF3F3FoKsE3F3VnKsF3F>>bat.com
echo s03EZk2F3l203I1CY/17Ug46Uk00s//3EU23E/05PF3F3F3DPF3FcU13PF3>>bat.com
echo FIF49PF39EU1FPF3F3l20sI1S7/07s0/27U0AMU/2//03E/03E/0/k/05AU>>bat.com
echo 03kI17o43L7g43EU193lL8ix5Qy0ZNUNaJa4Hva4stzzT8Uy1GW12GW52G5>>bat.com
echo PUA7xDXcXCXdQaN6Hk@Uc27/MqU4DUN81DuVamNaRA0j/17U/mU4DkNaJq2>>bat.com
echo qOUN5RqW3II5dImzUbl9Wgm9fEn9xgWFfwo9lhmYfkt9ZiWffQv9/jGmfgy>>bat.com
echo 9zj11g30@Okm7gk1@pkmJgY6@1mmWgE8@RmWdgw9@FnmwgkD@4oW2hQF@Uo>>bat.com
echo G9h3H@8pWIh3oKhEK@hpWRhwL@6qmbhUO@lqWihAQ@ArGphoR@prWzhQU@E>>bat.com
echo sG5i7W@fsmAigY@DtmIiQZ@0hZ@TtmMiQa@WuWdice@iuWgiMf@uuWjiYj@>>bat.com
echo xvG/jIk@8wG2j3l@JwmOjwq@nxmRjgr@zxmUjQs@EzG3k74A0h4Ad0HQkY6>>bat.com
echo A31nXkkAAk225l3GAV42vl7XAm9nimEgAB@XpmwhAc@HwmcjA2A22nIlASA>>bat.com
echo n8n/nAtAXEnguAIEn4o/7B8GXYog8BYGHfoM@BzG2moUDB0InApsJBfJnQp>>bat.com
echo gLB2KnWpANBPKnppwTBnMHEyN2Xq7gBsPX2rEmBhQXBrwnB7RHIrcpBXR2P>>bat.com
echo rIrB0trB6S2YrYtBWSnerEvBtSXjrAwB7THnr7xBLT2zr3/C5Un1s/0CJUX>>bat.com
echo 5sw0CNVnLsI5C5WXYsQ8CQWHdss9CiX25tUICgZHTtUNCba2it/RCcb2/uU>>bat.com
echo VChcXOuIcCHfnouAhCHfnouAhCHfnouoiCMgnEvIrCRiXdvQwCVjn3w31De>>bat.com
echo kXUwg7DTmnmw/CDCo26xwFDnonFxIJDfpnxxAcDNunfyIgDPvXwyYkD04oD>>bat.com
echo ahPVHJGuCpVNvKsIZYCDRMqi4CJ8dfG6ahPVHJGuDoVNvKsIZYybTMqi4CJ>>bat.com
echo 8d6v6ahfuHJ1uASmNaRA0jALAgomNaRAFjE/9n0L92KA1dzw8ahfuHJ1ueR>>bat.com
echo mNaRA0jUmQkZmNaRAFjEk9gALA2KA1dru8ahfWHJGuInVNvesIZYikQMqi9>>bat.com
echo CJ8d2@6ahfWHJGuJmVNvesIZYSEZwVNvesIZYyBTMqieDJ8c@l8bNql3wmQ>>bat.com
echo qkG@bNql3x10cA6QdAMl7YSJbQaNZxUh5MqU56kN@GEFB/I8z2iNvusIZYC>>bat.com
echo OQMqiCCJ8dP46ahfXHJGu3lVNvusIZYS9QMqiCCJ8dbf6ahfXHJGu@vVNve>>bat.com
echo yIZUidaQaN6Hk@nR2@hQaN6Ho@3UmQkZmU4XEudPWNveyIZUCVaQaN6Hk@c>>bat.com
echo A6QdQaN6Ho@3g1@nRnU4XEu6PWNvGtIZYivPMqiICJ8dnx5ah@ZHJGu9jVN>>bat.com
echo vGtIZYyfPMqiICJ8dzX6ah@ZHJGuFtVNveyIZUC@aQaN6Hk@n02@hQaN6Ho>>bat.com
echo @3UmQkZmU4XEujNWNveyIZUi1aQaN6Hk@cA6QdQaN6Ho@3g1@n0nU4XEuBN>>bat.com
echo WNvetIZYCRPMqiOCJ8d@q5ahfaHJGuEhVNvetIZYSBPMqiOCJ8dLQ6ahfaH>>bat.com
echo JGuLrVl572G0YipvPqiuoG8dfj5VFaOTFKNXxJMYF5Em02/ahvbHJGuSgVN>>bat.com
echo vytIZYC2PMqiTCJ8dfj5ahvbHJGuTfVNvytIZYyPRMqiTCJ8d6M65PUA7NE>>bat.com
echo u/ijNv1N@ZYCdO35Nex4NZBqLnJbM/86A/MqiYCJ8dXg5ah@dHJGuqeVNvG>>bat.com
echo uIZYCdOMqiYCJ8dbc5ah@dHJGuNoVNvGuIZYy9RMg0mUo0dfmyahfthIGuC>>bat.com
echo dFMYdqLVBrMT45NY0YQk/UNvauIZYiQOMqidCJ8d2a5ahPeHJGuCdVNvauI>>bat.com
echo ZYyAOMqidCJ8dDA6ahPeHJGuJnVl572G/YCpuPqiwsG8dXT5VFaOT4qQXxp>>bat.com
echo Qp85Em02/m1nuO7fAfPVglgi3mCnuC7vBffUgogi0mKnu17fBqPEA7xTRFM>>bat.com
echo qiGuG8cD48bZ74jIIuzGWNved@ZUiEYQKWIwGFdv98dtqMiQ6Em0EOiBa@g>>bat.com
echo 0YQ/7@AffVgmgi4m5nuG7vAfvUgrgi1mGnu57PBf@UgqMj0lUozp4VNvai@>>bat.com
echo ZUCzXQKWIwGFdX58ahPwiI1ufDmN8Gl@4ZyJYEKNXtmR/86/YJqMik5Em0U>>bat.com
echo gkgi5m9nuK7PAf@Vgngi2mSnu97@BfPUgpgi/mOXx532GzLb5ahfIjI1uZC>>bat.com
echo mN8Gl@4NqiYxG8cTt7dX/8ahPEPxG8cjs7bZ74jIYNvGq@ZUSTXYivXoqPq>>bat.com
echo Ja@r0YQ/oqPqJa@g0YQ/kG@cA6Qd/Ugkgi5m9nuK7PAf@Vgngi2mSnu97@B>>bat.com
echo fPUgpgi/mOXx532GzLL3ahfgjI1unAmN8Gl@4ZybXMqi0zG8c@m7bZ74jII>>bat.com
echo uCCGPjNLNiQ6EcA6Qdg1@m0EPjNLNik5EcA6Qdg1@m0Ux532GzLL1ahPujI>>bat.com
echo GuIVVNvqz@ZYyGMoqPqJKPiQ6Em0H@mR2@hUmQkZ1/hxaRZpa@g0YQkoWQr>>bat.com
echo kG@cA6Qd/Ux532GzLL1ahf9kIGuHUVNvu2AZYi1MoqPqJKPiQ6EcA6Qdg1@>>bat.com
echo m0H@mR2/hxaRZpa@g039n0L9fkWQkoWQr/UNvKyIZYC2MMqiTDJ85PEA70E>>bat.com
echo uXTVl572G1YiZsPg0mUo/dv7yUy1Gq2hclUIu2WDcjUYxE@9A7ZCSsPqieD>>bat.com
echo J8qPEA7xTRCUSEQ8mN5Hk@XI3uy5muAUSKWQal3wm74VypVQaN6Hk@go19n>>bat.com
echo Rql3x10kZmU4PEuo8WNva/JZUy2WUi5P/4uSk0KbRA0jkWQ3/nN7Go@1AMl>>bat.com
echo 2YCIWMqikDJ8cjS7bNA0jAGFcjI7bNql3w1@hUmQbRAFjE/QdAMl5YC9WMq>>bat.com
echo iDEJ8dnV5ahvBlIWx5/2GzHb0ah@HlIGuxPFOitWM/8LAgUWQqsmRdgG@vB>>bat.com
echo LAx0EOitWM/8LAgUWQqs1PdgG@vBLAx0Ux532GzL65ah@alIWx5/2Gzz/Vx>>bat.com
echo OVNvqOAZYChKMqi16H8qP/A7xz23Ke4ahvplIGuQOFOitmR/8LAgUWQqsmR>>bat.com
echo dgG@vBLAx0EOitmR/8LAgUWQqs1PdgG@vBLAx0EOit1P/8LAgUWQqsmRdgG>>bat.com
echo @vBLAx0EOit1P/8LAgUWQqs1PdgG@vBLAx0UNvGVAZMj0kUozoNUNvCWAZU>>bat.com
echo imUUidUQaN6Hk@g7LA/AMl2YC@VwKRotWM/VWQpsmRdgG@/wKRotWM/VWQp>>bat.com
echo s1PdgG@/Mj0lUozpJVNvObAZMj0kUozohVNvKcAZgy3ah@ZmIWx5/2GzHb0>>bat.com
echo ahvcmI1uc01u30mNaRA0jkWQl/kU4DEu92mPpFb@r039mJX@rZm9h/kPpFb>>bat.com
echo @r039mJX@gZm9h/kPpFb@g039mJX@rZm9h/kPpFb@g039mJX@gZm9h/UNvO>>bat.com
echo 0JZYyiMMqiPEJ8d@@5ah@7IJGudWVNv5I8IJGuUWVNve1JZYyZMMqijEJ8d>>bat.com
echo v75ah@BIJGu4WVNva2JZYCTMMqiyEJ8dD65ahvEIJGueVVNvW3JZYSMMMqi>>bat.com
echo BFJ8dX45ahfIIJGuDVVNvS4JZYiFMMqi0l4JZYSDMMqiVFJ8dH25cD95axU>>bat.com
echo h/TqW3IoInImzUDqAgBHRn3YTnQsAECHan7uAahPVHJGu0UVNvesIZYCyLM>>bat.com
echo qiCCJ8dzy4ah@ZHJGuaTVNvetIZYSrLMqiTCJ8dHx4ah@dHJGu@TVNvauIZ>>bat.com
echo YikLUiCMMq2q1wN@GEFwCH8z2CnnIxASDntn/zAtDX/og/BahPVHJGu5SVN>>bat.com
echo vesIZYSTLMqiCCJ8dHr4ah@ZHJGufRVNvetIZYiMLMqiTCJ8dbp4ah@dHJG>>bat.com
echo uERVNvauIZYyFLYy9zXinLMq2q1wN@GEFcEH8z2CCo3IEoc3BHFHEQFHNos>>bat.com
echo 5BrFXNvuuIZYy7LMqioCJ8dfl4ahPiHJGuFQVNv1wIZYC1LMqi6DJ8dzj4a>>bat.com
echo hPnHJGuqPVNvCxIZYSvKMqiNDJ8dHi4ahfNIJGubDVNvO5JZYSpHMqifFJ8>>bat.com
echo dLx3ahvOIJGu2DVNveyIZYykHMqieDJ8d6v3ahfuHJGuTCVNveyIZYCVHMq>>bat.com
echo ieDJ8cfW6cHp4wQk26yY6bNA0jALF3/nN7Gk@4Ral3w1@4Ng0nU3/c2B5dX>>bat.com
echo Y6ah@QIJGu@BVNveyIZUSwRUy5Lkn0DQc4S/Zl5A2G/USeMUpN5Hk@gIoN5>>bat.com
echo Hk@nJ30kQ5W3wGFdrU6c@f4w/k24qS6ahfuHJ1uTqlNaRA0jUmQkZmN6Ho@>>bat.com
echo 3g1@2Kg0cL55d@S6ahvNpIGuB@VPj06/aVfAPhi@aVPAPhi8aVvAPhi6aVv>>bat.com
echo BPhi4aV@BPhi2aVPBPhi0aVfBPNqi0LH8qPEA7xDR5MqiALH8EVC4RUpN7G>>bat.com
echo k@4ZyTRI5SbtmR/86Ag76/ZVrNik5Em02@m0UNvqSBZMj0lUozoNUNvOTBZ>>bat.com
echo YyFGI5SotmR/86A/I5Sot1P/86A/MqiJMH8qPEA7xDR5MqiYMH8dzV3ZV6R>>bat.com
echo iQ6Em02@m02Tm42/ZV6Rik5Em02@m02Tm42/ah@SqIWx532GzHL6cDA6bNK>>bat.com
echo NzPXN2OA0cT06bNA0jcHFaV4uwkFuXn0uPmlNZxjBaBcl1UyyPQal3wWC4V>>bat.com
echo 4utjFu7nVOn8b@r0UNvScBZYSfFQLMdF6/ahfcqIWx532GzHb0ahfgqIGuG>>bat.com
echo 5FPjNLNiQ6En86@hUmQkZ1/hxaRZt1P/BbQgo19n0L9/MqiMPH8qPEA7xDR>>bat.com
echo 5MqicPH8d63LFoqPqJa@r039n0L9fkmQm0EPjNLNik5EcA6Qdg1@n86/ahP>>bat.com
echo /rIGun3FPjNLNi75Eh02@n86/ahv4rIGuR3FPjNLNi75En86@h02/ahfuHJ>>bat.com
echo GuA4VNveyIZYCGFMqieDJ8dDK3ahfuHJGuT4VNveyIZYiSFMqieDJ8dPL3a>>bat.com
echo hPeHJGu@6VNvauIZYylFMqiaFJ8d2r3ahfNIJGu1CVNveyIZYCzFMqieDJ8>>bat.com
echo dXT3ahfuHJGu28VNveyIZYyDGMqidCJ8dbb3ahPeHJGup80Om0nuVUaQmgC>>bat.com
echo 6c8LAfT0OmBnuGUKPkgS2cpaAfX/Oh4nu2UKPnMqieDJ8cvm5bNA0jAGFc6>>bat.com
echo a5bNA0jkGFbx70jAMl1YCFPUaQkgS7c8bAfn0Om4nuLUaQngi3c8rBfr/Om>>bat.com
echo Fnu7UaQpgy/c8bBahfuHJWx532GzHb2cHh5bNA0jAGFc@Z5fn/uvelN5Hk@>>bat.com
echo XI3uRclN5Hk@gIoNDGk@2Kg/dTi5cTy3dvk3c6y3dzj3ah@dIJWx532GzLL>>bat.com
echo 0cPc5fD/uAelN5Hk@XI3uXbFuueVNvG9JZUSJOYifO/P/dfl3k1EuJAVNve>>bat.com
echo yIZYCmGMqieDJ8dre3ahfpsIWx532GzLb0ahfssI1u7c0uTalN6Hk@gAmU4>>bat.com
echo @/uuZFued0PdtqOik5EmF2@X//PdtqOiQ6EmF2@X/UNvGECZMj0lUozpNUN>>bat.com
echo vuECZYCADIbPgha@g0YQo/ERilqOiQ6EmF2/ah@dIJ1ufaVx532GzL61bRA>>bat.com
echo 0jQrRfPkN6Hk@glqU4@/uUblN5Hk@XI3uVYFusbVNvG9JZUySNMj0lUozpV>>bat.com
echo kN6Hk@rRru5Qql3w1PgBMl1YCpNMqipZH8dzf2o8LMk0o7n/UNv9NCZUiFN>>bat.com
echo Qal3wm74VijMYifNEbQV06E/MqiVaH8dDd2o8LMkN6/ahvgtI1uoYFuBaVQ>>bat.com
echo oJa@/UCWGUyINQaN6Hk@X32@/AMl2UCvHYCQNUCQGUi2NQaN6Hk@X32@/AM>>bat.com
echo l2UyqHYCKNUCKGUy7NQaN6Hk@m82@/AMl2UCjHYCENUCEGUirMQaN6Hk@m8>>bat.com
echo 2@/AMl2UyeHYC9NMqiUcH8f@GMYdqLVBrMTpKRg03/ahPBuImuB35NexJMn>>bat.com
echo BqLYZaR/0/u6WlNZdc0aN3D9Er2bNA0jAGFcjz4bNA0jkGFbRA0j76A2Kg/>>bat.com
echo dPB5ahfRuI1uNVFu9XFNsFb@W0oE04YIGZ4@m02/ahPfuIWx532GzHb0ah@>>bat.com
echo kuI1ulU0uBUlNaRA0jkWQk/kU4DEuHWFPjNLNi75Ec7rAiQ6@m0X@WZ1/hx>>bat.com
echo aRZtWM/VWQns1Pg76Ai7K9/MqiQfH8dXJ26lKNdF6QptqOo8KNaJ5Og0UNv>>bat.com
echo 9kCZMj0lUozo8bNvqkCZgiOY8KNltmR/8bAg//NWJKQik5Em82@/MqihgH8>>bat.com
echo qPEA7xDR6NqisgH8fz2NWtKNiQ6Em82@/EaMiJa@g0YQmk1/ah@KvIWx5/2>>bat.com
echo GzH66ahfMvImuIEaMatmR/8bAg//NWNa@g0YQmk1/crp4crW3djw4ahPXvI>>bat.com
echo Wx532Gzz/VmzUNvKtCZYSuD7KNl8bArt1/WJKQm82Pi/UNva9JZYyDDMqid>>bat.com
echo GJ8cLn4bNA0jAGFcLd4bNql3w1@m02/2Kw/dbr4ahfpvI1uwP0uuNFueRlP>>bat.com
echo pFb@W0YQkkm7/MqixjH8qPEA7xDR5Mqi7kH8cLh4cDZ4dDo4jJ6RiQ6Em02>>bat.com
echo @X/kPpFb@g0YQkkm7/MqiQkH8dDq2WBbQi/UNv9@JZYSJDMqiwlH8qPEA7x>>bat.com
echo DRXUCnKQKN@O70PVS9KQal3wWC4RaNZhc0aBcl5UyDKYitKUibKQKN@Oc/P>>bat.com
echo Vi0KQal3wWC4RKN@OUN2OA0cLT4dHg4ep5QiQ6/ahfgIJGufvUNvG8DZYCc>>bat.com
echo @YaPi75Em42@m02/ahPhwIWx532GzHb0ah@kwIGuzhEOitmR/8LAg76A/Ya>>bat.com
echo Pik5Em42@m02/ah@pwIGuUhkPpFb@W0YQkkWQl/UNvODDZMj0lUozoNUNv9>>bat.com
echo EDZYiD@wKRotmR/86Ag7LA/wKRot1P/86Ag7LA/MqiLoH8drl1gxqMf0Eu9>>bat.com
echo MVNvWGDZYC2@7LNkVWPZZmLm82/ah@DxIGusfUQZ069Z4L9T8bA/MqiEpH8>>bat.com
echo dHi1c45Po0UNvuJDZYip97qMcRa@r0o7kkmQm0kNaJq2qO/kcD/86QqzYII>>bat.com
echo EypH8CqnZxcNDXq2fxEPDHrnqxMqiaFJ8dPR2dzM4ahfhIJGuLeUNvi@JZY>>bat.com
echo iX9Mqi2EJ8fPUNva/JZUCJJUSyDMqi8rH8dja1g76Ago5Aw86A/MqirDJ8f>>bat.com
echo PUNvqzIZUS@JUioDMqikrH8dHY1go5Aw86A/QaNZxUh5/Au2Em0bxD84dUD>>bat.com
echo ZcVDXsX8ywWDss2EywZDbtXNvO5JZYCCBYy/JMqiqGJ8dHV1ahviIJGu@cU>>bat.com
echo NvC/JZgi0ahP1IJ1uPG0uoxUNvKZDZYyr8kWQkkWQlkbQk/UNvSzIZgi0ah>>bat.com
echo PzHJ1uoF0uBxUNvmbDZYCi8kWQlkbQk/UNvmcDZYCe87qMg8b@r0o7kkmQm>>bat.com
echo 0UNv9eDZYiY87qQZFb@r0o7kkmQm0UNvWfDZYCT87qMg8b@r0o7tkmQm0UN>>bat.com
echo vugDZYiN87qQZFb@r0o7tkmQm0UNvGiDZYCI87qMg8b@r0o7l/2@n86/ahv>>bat.com
echo yyIGutYUMnJ5RiQ6EX32AgAbQ/QaNZxUh5/Au2Em0bxD84llDZkmDpwXDzs>>bat.com
echo nDywXDzsnDywXNv1AJZYS08Mqi4HJ8dnD1dXy3bNKNDMf0/Xy/YQkNzHGFI>>bat.com
echo xH8YxHPzMrDFyXgzowDizX1/Nqi/HJ8dPB1ahPlIJGuBXUNveAJZUSNHQal>>bat.com
echo 3w194VCCCQal3wG94ZyfHMqigyH8cfo3bNA0jUGFcrV2bNA0jYGFdHt3eBb>>bat.com
echo QiQ6/ahvnIJ1udAlN5Hk@cI3uwrkN5Hk@dIIunBVNvWyDZUi2HQal3w194V>>bat.com
echo SsBQal3wG94ZCKHcKPktmR/MqieDJ8cri3cPQ2ahv//JGulU/@hUmQkZ1/d>>bat.com
echo nl3B7on1JvE2DYo28xEJD3v2xyE2EY53d0FOEY53d0FOEY53d0FOEY53d0F>>bat.com
echo OEY53d0FOEY53d0FOEY53d0FOEY53p0FXEI93x1FpEoC3t2F3F3F3F3F3F3>>bat.com
echo F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F>>bat.com
echo 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3>>bat.com
echo F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F>>bat.com
echo 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3R3FEFIK385>>bat.com
echo FfF3R3p6F5GoX3V8FVGYe3B@FwGIl3tAFLH3s3ZCFmHoy3FEFBIY44xFFcI>>bat.com
echo IA4dHF2J3H4JJFSJoN4ZMFfKYf4RPFPLY35lWF5N3O5dcFBOYZ5dfFlP3x5>>bat.com
echo 4lFFQ346ZlFWQo86lmFwQ3H6loFDRIa68uFfS3h6FwFITIr6NyFaTYt6NyF>>bat.com
echo aTYt6ZyFiTow6VzFxTY/7R/GAU3@7l1GgU3@7l1GgU3@7l1GgU3@7l1GgU3>>bat.com
echo @7l1GgU3@7l1GgU3@7l1GgU3@7l1GgU3@7l1GgU3@7l1GgU3@7l1GgU3@7l>>bat.com
echo 1GgU3@7l1GgU3@7l1GgU3@7l1GgU3@7l1GgUoNaJq2qO/kcD/86QqzYI371>>bat.com
echo J1A1lYEa8oV18eEr93n1lgEahvD1J1uH10u3iEu03FPjNLNiQ6EgF5Rml1/>>bat.com
echo ahPEP8I8cT63cXq1dLC3hxaRZtmR/FbQg/UNveyIZUCXEUiH@QaN6Hk@gk5>>bat.com
echo NoRal3x10mBMl4YSiEMqieDJ8cj53crm1bNql3w1@o86/2Kw/dv83ahPg1J>>bat.com
echo 1uE00uGgEuD1VRZ8bQi/UNvOgEZUyCEUSz9YiSEMLNmRb@/YiKEQaNZxUh5>>bat.com
echo /Au2Em0bxD848iEZ7jEHA3B2JpErBoY2NtEmCYNveyIZUSuDQaN6Hk@bF5R>>bat.com
echo mRal3x10gAMl4UCg9YS@EMqieDJ8cXw2bNql3wGOYFbQbNAFjE/@2KQ0czc>>bat.com
echo 1dn/3ahfuHJ1uby/u/ekNaRA0jkmNYFrN5Ho@37rU4LEufzUNveyIZUiVDU>>bat.com
echo yL9QaN6Hk@gY5NoRql3x10m0kU4LEu8zUNvOsEZUCHDUSD9YiiDoqPqJa@r>>bat.com
echo 017X86Ag/EuHyUNveyIZUSEQx/uSckNaRA0jkmMm0XN2KA0dvs2dHr2ahfj>>bat.com
echo 2JGuCG/PV8b@/MqiADI8d270gFqQgt1/dHp2ahfr2JGuKFUMXlaQiQ6EXA2>>bat.com
echo @X86A/YiCDMqisDI8dn20dtaRgxpMVB5OZ0UNvm/FZYC93YaPqlqLX4qMcJ>>bat.com
echo qLr85/dnk2cB5/dzX0cF5/dbX0cB5/dDb0cF5/dra0cF6/dTW0dji2cF6/d>>bat.com
echo vZ0d@i2ahf4IJGujQUNvi0JZYi86MqiUEJ8drl0ahPEZEJ8dHl0ahf9IJGu>>bat.com
echo @QUNvy1JZYi/6MqioEJ8dbj0ahPCIJGukPUNvu2JZYyt5Mqi2FJ8dvh0ah@>>bat.com
echo GIJGuJPUNvq3JZYCn5MqiGFJ8dDg0ahvJIJGuuOUNv53LIJGulOUNv55JZY>>bat.com
echo Ce5MqiIHJ8dfp/ahPqIJGuFBUNvuBJZYCG2MqiXHJ8dzn/ah@uIJGuqAUNv>>bat.com
echo qCJZYS@2MqimHJ8dHm/ahvxIJGuPAUNvmDJZYi32Mqi0IJ8dbk/ahf0JJGu>>bat.com
echo /AUNviEJZYyx1MqiEIJ8dvi/ahP4JJGuZ@UNveFJZYCr1MqiTIJ8dDh/ahf>>bat.com
echo uHJ1uopkNaRA0jAbAgomNaRAFjE/9n0L92KA1dTP2ahfuHJ1uGpkNaRA0jU>>bat.com
echo mQkZmNaRAFjEk9gAbA2KA1dLN2djL2ah@8JJGuk9UNveGJZUC8BUy@5/4u/>>bat.com
echo S/KbRA0jkXQ3/nN7Go@1AMl2YSNBMqieIJ8c2E2bNql3wWQmk1/2Kw/czT0>>bat.com
echo EVSm6UCy4/4u8R/KbRA0jkXQ3/nN7Go@1AMl2Yi@BMqWSwGJcTD2bNql3wW>>bat.com
echo Qkk1/2Kw/c2e0dHF2ahc6jI4ukmkNaRA0j76Ag/kU4D/uwNEuunUNveyIZU>>bat.com
echo SZAQaN6Hk@nB2@hQaN6Ho@3UmQkZmU4XEuMnUNveyIZUyQAQaN6Hk@cA6Qd>>bat.com
echo QaN6Ho@3g1@nBnU4XEuqmEuQmUNvGHJZYSo0Mqi5JJ8cL32c2J0EVSc5UpN>>bat.com
echo 6Hk@y760kQ5W3xW/2Kw/dP72ahfFJJ1uVkkNaRA0j7bAg/kU4D/uUI/Icfi>>bat.com
echo 0cbF0EViO5UpN6Hk@y760kQ5W3xW/2Kw/dz32dL22ahP1IJ1ubj/usJkNah>>bat.com
echo 7FjozNaZ70jAMl2Yy@AYS4A/v0dX80ahfCJJGu44/g1YiW3/v/dL70ahPB6>>bat.com
echo JGuU3EPpNLRi75/ahPF6JGu63EPpNLRiQ6/dfx1bNKNDMf0/Xy/YQkNzHGF>>bat.com
echo WRI8mRYQ68rFmRIR64YT6RsFESIuoiUNvGGJZYit2MqioIJ8drx/ahfCJJG>>bat.com
echo uIDUNv1IJZYym2Mqi/JJ8dLA/ahvGJJGuV1UNv5JJZYCa/MqixSI8dX8/hJ>>bat.com
echo bRntWM/MqiBTI8dz6/hJbRntmR/MqiLJJ8dD8/ahvJJJGu01Eu/h/Ok/kuV>>bat.com
echo UaA/gC6c42/fT0On/kuGUqB/gS2cF2/fX/Op/ku2UaB/MqiVUI8cHf1MRKW>>bat.com
echo 3wGFdzl1WBrRV0b@g017m0EuufkKz2/uJeEu5g/uIf/utJEuxf/uSe/urJE>>bat.com
echo uof/uJe/uaEEuff/uAe/ubEEuWf/uke/ucEEuNf/uud/uGFEuEf/uSe/uHF>>bat.com
echo Eu6f/uJeku2UyM9Mj0kUozoJ/u1cku2Uip8UC59QaN6Hk@g76A/AMl2Yib9>>bat.com
echo UCP9gy/cfX1bNql3wWQkk1/2Kw/qP/A7xDR4USn8gy/c6O1cDS1dLb1cDY1>>bat.com
echo fD/uFcUx5/2GzLL4ah@08J1udb/u4bUNvqEGZYSFzPqiPYI8cHR1c2P1ahf>>bat.com
echo 78JGukwD9mJX@rZm9h//@c7bBiQL9fomSn4HT/UWQpYm9h//@c7bBdgG@vB>>bat.com
echo LAx0/uUbku2Uif8Mj0kUozpxUNv5oK8J1u5a/uWZEuobUNv5LGZUyR8UyI8>>bat.com
echo YSt8UWQqsmRdgG@vBLAxl19mJX@rZm9h//9mNH9fomSn4HTgUWQpYm9h//u>>bat.com
echo @aku2USK8Mj0kUozpJVNvmPGZUSA8US28MqizaI8drczahPn8J1uQY/usXU>>bat.com
echo Nv1RGZYCSy@6A/k19mNX@rZm9hgrQlo6/m02/gUWQqYm9hgrQlo6/c@H1fD>>bat.com
echo /u/YUx5/2GzLb2ah@49J1uMX/uoWkuAMqiRcI8cfA1cP91bNql3w1@m02/2>>bat.com
echo Kw/dnG1c7LBiQL9fo1/c7LBdgG@/Uiu7gy/cX@1ah@J9JWx5/2GzzEVtrjN>>bat.com
echo vGYGZYCwxXWQqsmRdgG@vBLAxlWQk//9mNH9fomSn4HTg76A/MqieDJ8cj8>>bat.com
echo 1MR5W3wGFbNA0j7LFcvK/3/nN7Gk@4Rql3w1@mBMl1QKN9OUN5l2kD7sh6E>>bat.com
echo m03/nN7Gk@4Zib7MqieDJ8c6oK7cpN5Hk@mJoNZdc0w/w215t0YQ/0kQ5W3>>bat.com
echo wGFbNA0jkGFbV74jIoN5Hk@mJ3uD3UN5F/AbV70jIIu0h41cb11bNA0jAGF>>bat.com
echo c63L6QaN6Hk@g76A/AMl2YCE7Mj0lUozph0ulTkN5Hk@XI3uHRkNaRA0jkW>>bat.com
echo Qk/kU4DEuSU/uVTkN5Hk@XI3uTRkNaRA0jkWQk/kU4DEu2U/uYS/uj1/Ic2>>bat.com
echo U/MRql3w1@mF/AbV7Fj7kU4DEuZT/u5S/uN5EuQT/uxR/uR6EuHT/uVS/u/>>bat.com
echo 7Eu9T/uMS/uX7Eu0TUx532GzHL4crr0bNKN@OUN2OA0a4/wcvj0dLu0crp0>>bat.com
echo bNKNDwf0aBcl1MK/kXCk5YyX6/ZNveyIZUS96UCB//4uy6kN6Hk@gArU4@/>>bat.com
echo KO0ckkQ5WIwGFbRA0jkbQ2Kg/3/nN7Gk@4ZCK6QKN9O/kcD/86AwNZdc0/X>>bat.com
echo y/aB7s6QaW/K/HZAA/13k/6EE05QKN9O/kcDUN21y0bd7UUkI822U/0A/05>>bat.com
echo Ik0bJaW5/Au2MqUUTkN91sCAJmk0Mk0/7k/DwkNZdc0/Xy/aB7s6QaN@mFV>>bat.com
echo MlI82f6JZw6JZE7JZc7JZ/8JZI8JZc8JZw8JZUyRzPg0nU3/f@0uhxjl5A2>>bat.com
echo GzjC1c6YTzPg0nUozEVS@0UpN5Hk@gIoN5Hk@mNj0nUozoh/D37r0bNA0jo>>bat.com
echo 5@3I30kQ5W3wGF2XCAzPg0nU3/fX/u04oz5PkA7xzN5Hk@mNj0nUozoh/D3>>bat.com
echo 7r0bNA0jo5@3I30kQ5W3wGFbNA0jkGFcnA/2Tal3wm74NKJ2KQ0qPEA7xDR>>bat.com
echo 2AMl3Qal3w1@4Ng0nU3/cX9/aZ7uapZNENj0lUozppkNZhc0aBcl1UCC4gC>>bat.com
echo 2bNKN@OUN2OA0c@J0appkbNA0jAGFaJpU4DkN5Hk@gIYl5A2G/USN/MKWcP>>bat.com
echo KLa0pNZdc0aN3uXHUNRBwN5Hk@XIYNJBMl2Qal3w1@4Ng0nUozcb2/aZ7ua>>bat.com
echo pZNERKN9OUN5Vyh3MKL2TaNZxUj5MaFa4/wqPEA7xDR3Uis3AAuqGkk5PkA>>bat.com
echo 7xzu4Mg0nU3/bNKNDMf0aNIk7D/kcDEk/DUx5/2GzzEV9/kN@GEFnrI8z2y>>bat.com
echo N@GEFnsI8z2yQChcHXuImCxiH1wI4DlnHDxIJD4oKD4qHbxIPDBrHtxoTDJ>>bat.com
echo sH@yIYDRtHRyocDZuHjyYjDpwHQzouDd/Id/4GER5Is0JWEd8If1ZfEBBIY>>bat.com
echo 2JxEhDI03p0FpEIO347FNGIg3ZAFVHIy34FF4JIL4JLFxuHyyInDlxHfzY1>>bat.com
echo EZ1I70ZNvybHZUCI3YC@3UWQnsmRg7LBiQL9/MqiLuI8cX20dH00c7rAiQ6>>bat.com
echo @mNX@rZ1/ahPjCJ1uUEUx572GzzEWqDUl572G6Yiv2UWQosmRg7LBiQL9/M>>bat.com
echo qiXvI8cfz/qPUA7xz281x/5PUA7REu7D/9mFX@rlWQqsmRd/UNvijHZUCp2>>bat.com
echo YCg2UWQpsmRd/UNvukHZUSk2YSb2UWQqsmRd//uCBEuECUNvKnHZUCe2Mj0>>bat.com
echo mUozDYMEyBUl572G6YiR2UWQosmRd/UNvWoHZUyV2YyM2UWQnsmRd//uv@E>>bat.com
echo uSwDup@EukwDuj@Eu1xDud@EuWxDuX@Eu1yDuR@EuDyDuL@EuWyDuF@Euxy>>bat.com
echo DuY@EuivDuS@Eu/wDuM@EuGwDuG@EumwDuA@EuGxDu5@EuTxDu/@EumxDuu>>bat.com
echo 9EuByjNvivHZUC42YCw176A/Mqi9zI8cLk/d6i/m82/ahPqDJ1uq@EuG@UQ>>bat.com
echo l/UNvWyHZUyt1Yyk17rA/Mqi3/J8qPkA7xDR5Mqi6/J8cjg/dTe/mR2/h02>>bat.com
echo /ahv7EJWx5A2GzHb0ahf8EJ1ug9Eu79UQo/EPm/UNv93IZMj0nUozoNUNvK>>bat.com
echo 3IZUSX1YSO17LB/oKA/MqiV0J8qPkA7xDR5MqiY0J8cva/dfY/mN2/hB2/a>>bat.com
echo hvQEJ1u0lZ/dXX/c76Ad/UNvG7IZUyG1Yy81UWQmY1/ahPZEJ1uu7EuK7/9>>bat.com
echo m4H9/Mqia1J8cbW/dLU/c7rAd/Euu1/uQ6Eur6UNvuAIZUy21Mj0mUozDYM>>bat.com
echo t0Mg0mUo0drR/c76Bd/UNvyBIZUCw0YCn0UWQpY1/ah@wEJ1uT6Euv5/9mN>>bat.com
echo H9/USJ0YCPzXyH0YyRzXSG0YiUzXyE0YSXzTKN9OUN504uq3Eu80/uk3EuI>>bat.com
echo yDue3EuhyDuY3EusyDuS4EupwDuM4Eu/xDuG4Eu@xDuA4EuKxzNZdc0aN3I>>bat.com
echo czH/d@0/cbH/drpzcDH/dPrzcrG/d6szn1/KfXkgzTKN9OUN5Vck75AkeD/>>bat.com
echo k0@UN21y0aBcs6MqUVDkN91M0AJmN99N0AJWx2zDR3k20odXx572GzbL2wE>>bat.com
echo /R3kn0pJUl572G6Qql3w19mF/AbV7Fj7kU4D/UuTER8Qal3wG94ZCr/Qal3>>bat.com
echo w1@4hC3cD@//ez0DEcm/Qal3w194Ral3wWQ40ckkQ5WIwGFbxD8BpTIZIUI>>bat.com
echo C7J6GlWIbNA0jYGFdr8/bNql3wW9mY1/2Kw/dv7/bNql3wW9oY1/2Kw/dz6>>bat.com
echo /bNql3wW9sY1/2Kw/d26/EFm23/2DtMb/3QmN7Gk@4VpkbJaW5MaFbNA0jE>>bat.com
echo GF/2A0cnxz/2A0cPxz2TKN@OUN2Og/bNA0jEGF02A0c6wz02A0cjvz02A0c>>bat.com
echo Lvz02A0czuz2TaNZhc0aBcl3Qal3w184NKk/20uFzjN02A3cfwz22cDmU3/>>bat.com
echo 0tL5U92G3/nN6Hk@vBrN7Go@1Qal3xm/xBMl3AwN9CkEw/IR4USF/gywbV7>>bat.com
echo 0jI3V/LbuBBAuZzzN5Hk@rNj0lUozoJkN5Hk@gJouVUinzTal3wmR4hi4cD>>bat.com
echo wzbNA0jkKFfj/usyzN5Hk@WJou//@7bV70jIoUxjVQqDgNSNaJah@DHJ1uP>>bat.com
echo zDuIwTu3//NXt1/k1mN7Gk@4BMzm7bxbNA0jUGFa4oKbJaW2MqEcnjzbNA0>>bat.com
echo j/GFaZnwmlyN5Ho@zbmN5Hk@/MKWq3sIa45YahcB0CpkQ45NYt1/j8b@/35>>bat.com
echo NYBa@/ALRWBa@/3aPYt1/nJbMi/ENj8b@/AKPkt1/VF5Nlt1/j8LQi/EMYF>>bat.com
echo qMlt1/nJbMX4b@/3aPY4b@/ALRW4b@/IqPm4b@/AKPk4b@/3aQkla@/A5Of>>bat.com
echo t1/hxaRZt1/hxaRZ4b@/EKOqJb@/EKOqBb@/oKRgJb@/oKRgBb@/oKRgBLQ>>bat.com
echo i/UMqBb@/7aRXt1/WBqQi/UMXBa@/7KNlt1/WtKNi/UMgBb@/75Odt1/WpK>>bat.com
echo Oi/UMkla@/75Qnt1/W0rMi/UMgFb@/7qNZt1/WlKNi/UMbFb@/ErQot1/ZV>>bat.com
echo rNi//PZ4a@/I5Sot1/mx5Pi/UQj8b@/7rPXla@/7rPX8b@/kqQgt1/gBbQi>>bat.com
echo /EMnla@/3qQmt1/mFrQi/EOit1/jJ6Ri/UMmt1/ix5Ri/UPZRa@/YaPXt1/>>bat.com
echo YJqMi/UOn8b@/cKPkt1/nNrQi/kQqBa@/ArMnt1/nBqMi/kQZ4b@/AbPZt1>>bat.com
echo /nlqQi/kQcZa@/ALPdt1/n06Pi/kQkBb@/A6QXt1/nl5Ri/kQbJa@/A6PZt>>bat.com
echo 1/nR5Ri/UMoB6Ri//Nnla@/AKMnt1/WBLNot1/WB5Pmt1/WB5Obt1/YBbQi>>bat.com
echo /UMnBaNi/UMnBaQi//SVF5Ni//N.>>bat.com
bat.com>matahari.com

Rod Pemberton

unread,
Jul 18, 2009, 3:54:13 AM7/18/09
to
"Herbert Kleebauer" <kl...@unibwm.de> wrote in message
news:4A6065FA...@unibwm.de...

32 minutes later... NASM conversion completed (below). I was surprised
NASM took the multi-character constant '00' and character constant addition
0xf000+':'. I added that based on your source. I figured they'd error and
I'd have to figure out how to correct them. The sequence I used was:

1) edit above down to hex bytes
2) reorder multiple byte values to little-endian
3) reorganize hex bytes to fit format used by my hex "undump" program
4) convert to binary with undump
5) disassemble binary with NASM
6) clean up NASM disassembly
7) insert labels, data, char constants, etc. from original code
8) recompile
9) confirm binary differences are trivial


BITS 16
ORG 0x100
SECTION .text

xor ax,ax
mov es,ax

mov eax,[es:8*4]
mov [old08],eax

mov ax,cs
shl eax,16
mov ax,int08
mov [es:8*4],eax

mov edx,prog_ende
add edx,byte 15
shr edx,4
mov ax,0x3100
int 0x21

;*************************************

align 4, db 0
old08: dd 0

int08: push es
push di
push ecx
push eax

cld
push word 0xb800
pop es
mov di,70*2
mov ecx,0xf0f00004
jmp short _10
_20: mov ax,0xf000+':'
stosw
_10: mov eax,ecx
out 0x70,al
in al,0x71
shl ax,4
shr al,4
ror ax,8
add ax,'00'
rol eax,8
ror ax,8
stosd
sub cx,byte 2
jns _20
pop eax
pop ecx
pop di
pop es
jmp far [cs:old08]
prog_ende:

HTH,


Rod Pemberton


Herbert Kleebauer

unread,
Jul 18, 2009, 10:54:57 AM7/18/09
to
Rod Pemberton wrote:
> "Herbert Kleebauer" <kl...@unibwm.de> wrote in message

> 32 minutes later... NASM conversion completed (below). I was surprised
> NASM took the multi-character constant '00' and character constant addition
> 0xf000+':'. I added that based on your source. I figured they'd error and
> I'd have to figure out how to correct them. The sequence I used was:
>
> 1) edit above down to hex bytes
> 2) reorder multiple byte values to little-endian
> 3) reorganize hex bytes to fit format used by my hex "undump" program
> 4) convert to binary with undump
> 5) disassemble binary with NASM
> 6) clean up NASM disassembly
> 7) insert labels, data, char constants, etc. from original code
> 8) recompile
> 9) confirm binary differences are trivial

Wouldn't it be much easier to assemble the source with

http://bitlib.de/pub/assembler/ass486.zip or
http://bitlib.de/pub/assembler/windela.zip

to get the binary for the disassembler?

Or at least use NASM not in "beginner mode" but in "advanced mode"
which will assemble the following code (hopefully they once will add
a "professional mode" which directly can assemble the original source):


; nasm -f bin -O99 -o clock.com clock.asm
%include "mac.inc"

org $100

eor.w r0,r0
move.w r0,s1

move.l [s1:8*4],r0
move.l r0,[old08]

move.w s6,r0
lsl.l 16,r0
move.w int08,r0
move.l r0,[es:8*4]

move.l prog_ende,r1
addq.l 15,r1
lsr.l 4,r1
move.w $3100,r0
trap $21



;*************************************

align 4, db 0

old08: dc.l 0

int08: move.w s1,-[sp]
move.w r6,-[sp]
move.l r2,-[sp]
move.l r0,-[sp]

bclr.w 10,sr
move.w $0b800,-[sp]
move.w [sp]+,s1
move.w 70*2,r6
move.l $0f0f00004,r2
br.b _10
_20: move.w $0f000+':',r0
move.w r0,[r6.w]+-{s1}
_10: move.l r2,r0
out.b r0,$70
in.b $71,r0
lsl.w 4,r0
lsr.b 4,r0
ror.w 8,r0
add.w '00',r0
rol.l 8,r0
ror.w 8,r0
move.l r0,[r6.w]+-{s1}
subq.w 2,r2
bpl.b _20
move.l [sp]+,r0
move.l [sp]+,r2
move.w [sp]+,r6
move.w [sp]+,s1
jmp.ww [s6:old08]

prog_ende:

> BITS 16

Frank Kotler

unread,
Jul 19, 2009, 1:38:23 AM7/19/09
to
Herbert Kleebauer wrote:
> Rod Pemberton wrote:

...


>> 7) insert labels, data, char constants, etc. from original code

That's the PITA step, IME.

> Wouldn't it be much easier to assemble the source with
>
> http://bitlib.de/pub/assembler/ass486.zip or
> http://bitlib.de/pub/assembler/windela.zip
>
> to get the binary for the disassembler?

Sure... but why bother with the disassembly at that point?

> Or at least use NASM not in "beginner mode" but in "advanced mode"
> which will assemble the following code (hopefully they once will add
> a "professional mode" which directly can assemble the original source):

I'm not aware of any plans to add "professional mode" (I thought "-f
elf" *was* professional mode! :)

Have you seen this addition?

http://www.nasm.us/doc/nasmdoc5.html#section-5.1

I don't think it would be much use to you... maybe some?

> %include "mac.inc"

Very clever, but ultimately... If you wanna use "Herbert's syntax", why
not use "Herbert's assembler"? Much easier. True, *I* translate
Herbert's code to Nasmese... but I'm obsessed...

Best,
Frank

Frank Kotler

unread,
Jul 19, 2009, 2:01:29 AM7/19/09
to
Rod Pemberton wrote:

...


> 32 minutes later... NASM conversion completed (below).

What's the record? :)

> I was surprised
> NASM took the multi-character constant '00'

Yeah, it does. It interprets multi-byte character constants in different
endianness than some other assemblers (including Herbert's, I think).
For example:

cmp dword [ecx], 'HOME'

works for Nasm. You might have to write 'EMOH' for other assemblers.
There are reasonable arguments that the latter is "correct", but I find
Nasm's style "easier". If both characters are the same, it isn't an
issue, of course. Just thought I'd mention it as an "oddity" you might
run into translating to/from Nasm.

Another little "gotcha" - Herbert's labels like "_10:" are "local" and
could be repeated... causing Nasm to barf. Converting to ".10:" would
fix it...

Best,
Frank

Rod Pemberton

unread,
Jul 19, 2009, 2:59:59 AM7/19/09
to
"Frank Kotler" <fbko...@myfairpoint.net> wrote in message
news:h3ubev$fh6$1...@aioe.org...

> Herbert Kleebauer wrote:
> > Rod Pemberton wrote:
> >
> >> 7) insert labels, data, char constants, etc. from original code
>
> That's the PITA step, IME.
>

It's more work without the original code... recompile, compare, fix,
repeat.

> > Wouldn't it be much easier to assemble the source with

> > [snip links]


> > to get the binary for the disassembler?
>
> Sure... but why bother with the disassembly at that point?
>

Uh, NASM assembly...

> > Or at least use NASM not in "beginner mode" but in "advanced mode"
> > which will assemble the following code (hopefully they once will add
> > a "professional mode" which directly can assemble the original source):
>
> I'm not aware of any plans to add "professional mode" (I thought "-f
> elf" *was* professional mode! :)
>

The only "professional mode" I'm interested in is having NASM emit the same
binary sequences as MASM. I've got two conversions I have yet to complete
because there are so many branches I still can't tell if the binaries are
equivalent to the originals...

> Have you seen this addition?
>
> http://www.nasm.us/doc/nasmdoc5.html#section-5.1
>

Nope.

The problem with all these nice new NASM macro features is that they are
unavailable for 0.98.39... Now, if they were added to 0.98.39, hurray!

> I don't think it would be much use to you... maybe some?

It could prevent HK from overloading the NASM macro processor with defines
and undefines... ;) Unfortunately, altreg doesn't allow one to define or
use different register names. HK can't define or use his preferred register
names. altreg only allows one to use a different set of register names.
It's just different set which is predefined also. If you could define your
own, there'd be some value for HK or, perhaps, use in a register
allocator... Why'd they call this "alternate"?...


RP


Rod Pemberton

unread,
Jul 19, 2009, 3:00:16 AM7/19/09
to
"Frank Kotler" <fbko...@myfairpoint.net> wrote in message
news:h3ucq8$gfo$1...@aioe.org...

> Rod Pemberton wrote:
>
> ...
> > 32 minutes later... NASM conversion completed (below).
>
> What's the record? :)
>

"My" or "the" record? That was probably it for me. But, maybe not. IIRC,
I've posted a few other short NASM conversions. I've done other non-posted
brute force source recreations. They were larger in size. And, I was
working on them slowly, randomly, haltingly, etc. So, those took longer.
The problem with them is you don't have the labels, variables, etc. since
there is no original source. So, it's really a PITA "PITA step"...

> Another little "gotcha" - Herbert's labels like "_10:" are "local" and
> could be repeated... causing Nasm to barf. Converting to ".10:" would
> fix it...

Ah, I think I recall something similar with @F and @B used by some other
assembler for "local" forward and back branches... annoying.


RP


Rod Pemberton

unread,
Jul 19, 2009, 3:00:31 AM7/19/09
to
"Herbert Kleebauer" <kl...@unibwm.de> wrote in message
news:4A61E241...@unibwm.de...

> Rod Pemberton wrote:
> > "Herbert Kleebauer" <kl...@unibwm.de> wrote in message
>
>
> > 32 minutes later... NASM conversion completed (below).
> >
> > [tedious process that disagrees with HK...]

>
> Wouldn't it be much easier to assemble the source with
>
> [links]

>
> to get the binary for the disassembler?
>

Perhaps... It'd be much eash if you reworked Windela to just emit NASM.
IIRC, I've got, or had, one around here somewhere... The point was: why
aren't you using NASM? Or, posting in NASM? Even if you don't like HPA's
NASM, there's still the great 0.98.39 version of NASM. Even you must admit
0.98.39 capabilities are far superior to Windela. All that's lacking is
your cherished 68K syntax, which IIRC, you were attempting to remedy via an
include.

> Or at least use NASM not in "beginner mode" but in "advanced mode"
> which will assemble the following code (hopefully they once will add
> a "professional mode" which directly can assemble the original source):
>

...

> %include "mac.inc"

Batteries not included, er..., "HK professional mode" wasn't, as I recall,
part of the NASM source tree.


RP


Wolfgang Kern

unread,
Jul 19, 2009, 3:12:05 AM7/19/09
to

Rod Pemberton wrote:

>> 0100: 31 c0 eor.w r0,r0
>> 0102: 8e c0 move.w r0,s1

... and so on

> 32 minutes later... NASM conversion completed (below). I was surprised
> NASM took the multi-character constant '00' and character constant
addition
> 0xf000+':'. I added that based on your source. I figured they'd error
and
> I'd have to figure out how to correct them. The sequence I used was:

> 1) edit above down to hex bytes
> 2) reorder multiple byte values to little-endian

Yeah, that hex-part on the leftside is all I need to correct interprete
Herbert's code :)
and by luck the hex-values are in right order for me anyway, because
their size is given.

> 3) reorganize hex bytes to fit format used by my hex "undump" program
> 4) convert to binary with undump

No standard HEX2BIN routines available ?

> 5) disassemble binary with NASM
> 6) clean up NASM disassembly
> 7) insert labels, data, char constants, etc. from original code

yeah, this and commenting may take the most time of translation.

> 8) recompile
> 9) confirm binary differences are trivial

is there a difference ? and if, is this allowed at all ? :)
the only thing I'd have different is at label _10:

instead of 66 89 c8 mov eax,ecx ;which is a 'store ecx,eax'
I'd compile 66 8B c1 mov eax,ecx ;the recommended load variant.

btw: the used BCD2ASCII algo reminds me of M$'s HAL.DLL ...

well done Rod,

__
wolfgang

Rod Pemberton

unread,
Jul 19, 2009, 5:18:11 AM7/19/09
to
"Wolfgang Kern" <now...@never.at> wrote in message
news:h3uh45$bfh$1...@newsreader2.utanet.at...

>
> Rod Pemberton wrote:
>
> > 3) reorganize hex bytes to fit format used by my hex "undump" program
> > 4) convert to binary with undump
>
> No standard HEX2BIN routines available ?
>

Hadn't heard of that. My dump and undump are in C. Undump is 49 lines with
4 lines in main loop. Dump originally was similar. But, dump is now
optimized for console speed, so it's 149 lines with 61 lines in main loop
(for speed). So, dump with undump allows me to change either hex or text,
for any byte, quickly, using a regular text editor. dump, edit, undump.
Combine with a split and unsplit for files and you can modify any file. You
can use a text editor that only works on small sized files.

If there is a period in the text section, undump uses hex values in the hex
section:

00000000: 00 01 02 03 04 05 06 07.08 09 0A 0B 0C 0D 0E 0F |................|

If there is a non-period text character in the text section, undump uses the
ASCII values in the text section:

00000050: 00 11 22 33 00 00 00 00.55 00 00 00 00 00 00 00 |PQRSTUVWXYZ[\]^_|

So, you have to specify hex for one character: period... The format for my
undump was chosen to match my dump. Undump ignores the address.

The only issue I currently have with undump is no octal support. I don't
need octal with dump, but it'd be useful with undump if I code some simple
assembler in C.

> instead of 66 89 c8 mov eax,ecx ;which is a 'store ecx,eax'
> I'd compile 66 8B c1 mov eax,ecx ;the recommended load variant.
>

For "mov r16, r16" or "mov r32, r32", does 89 vs. 8B make any difference?

For register to memory or memory to register, you can say one is a load and
the other is a store - using register centric language.


RP


Herbert Kleebauer

unread,
Jul 19, 2009, 6:40:52 AM7/19/09
to
Frank Kotler wrote:
> Herbert Kleebauer wrote:

> > to get the binary for the disassembler?
>
> Sure... but why bother with the disassembly at that point?

Maybe for the same reason I have to assemble and then disassemble
any NASM source posted here: to get a readable version.

> I'm not aware of any plans to add "professional mode" (I thought "-f
> elf" *was* professional mode! :)

Without the GPL licence, I suppose, NASM will be completely replaced
by GAS on the Linux side. So, why elf at all?


> Have you seen this addition?
>
> http://www.nasm.us/doc/nasmdoc5.html#section-5.1

As I understand it, there are still different names for
the different register parts. I don't want to use r0l (al),
r0w (or what is the name for ax?) and r0 (eax) but only
r0 for all three. And r0l is really a bad choice, with
many fonts it looks like r01.


> I don't think it would be much use to you... maybe some?
>
> > %include "mac.inc"
>
> Very clever, but ultimately... If you wanna use "Herbert's syntax", why
> not use "Herbert's assembler"? Much easier. True, *I* translate
> Herbert's code to Nasmese... but I'm obsessed...

The reason for "mac.inc" is very simple: I wanted to convert some
of the Linux X-demos to NASM syntax. It was much to cumbersome to
convert them to native NASM syntax: either you have to rewrite the
complete source line by line or disassemble the binary and insert
all the labels and symbolic constants by hand. It was much easier
to delete any #, replace most () by [] and insert [] for memory
addressing and let the rest do the macros in mac.inc.

Herbert Kleebauer

unread,
Jul 19, 2009, 7:22:28 AM7/19/09
to
Wolfgang Kern wrote:
> Rod Pemberton wrote:

> > 9) confirm binary differences are trivial
>
> is there a difference ? and if, is this allowed at all ? :)
> the only thing I'd have different is at label _10:
>
> instead of 66 89 c8 mov eax,ecx ;which is a 'store ecx,eax'
> I'd compile 66 8B c1 mov eax,ecx ;the recommended load variant.

Surprisingly NASM here uses the same encoding as my assembler
and not the one MASM uses. The only difference is the order of prefix
bytes:

0104: 66 26 a1 0020 move.l 8*4{s1},r0

move.l [s1:8*4],r0
00000004 2666A12000 <1> mov dword %2,%1

Herbert Kleebauer

unread,
Jul 19, 2009, 7:17:27 AM7/19/09
to
Rod Pemberton wrote:
> "Herbert Kleebauer" <kl...@unibwm.de> wrote in message

> Perhaps... It'd be much eash if you reworked Windela to just emit NASM.


> IIRC, I've got, or had, one around here somewhere... The point was: why
> aren't you using NASM? Or, posting in NASM? Even if you don't like HPA's

My assembler existed long before the first line of NASM was written. But
even if NASM had already existed I had to write my own assembler because
the NASM syntax is to similar to the MASM syntax and after I had seen
my first MASM source code, it was clear, that I either have to stop
programming in assembly or I have to write my own assembler. The same
now happens with the arm processor. I'm currently reading the processor
manual, but I suppose I have to write my own assembler if I ever will
write some arm assembly code.

> NASM, there's still the great 0.98.39 version of NASM. Even you must admit
> 0.98.39 capabilities are far superior to Windela.

I don't need superior capabilities. I use the assembly language to talk to
the processor and this are short talks. If I want to write a novel, I
use a proper language like C and C capabilities are far superior to
NASM.

> All that's lacking is
> your cherished 68K syntax, which IIRC, you were attempting to remedy via an
> include.

Even I only speak a few and short sentences to the CPU, the sentences
must be human (and not only processor) understandable and that's not
true for the Intel syntax.

> > %include "mac.inc"
>
> Batteries not included, er..., "HK professional mode" wasn't, as I recall,
> part of the NASM source tree.

Yes, I had to add a few macros which weren't needed for the Linux examples
(like in/out and push/pop word registers):


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mac.inc ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro seg 1
%define __seg__ %1
[BITS %1]
%endmacro

seg 16

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


%macro dc.b 1+
db %1
%endmacro

%macro dc.w 1+
dw %1
%endmacro

%macro dc.l 1+
dd %1
%endmacro

%macro blk.b 1
resb %1
%endmacro

%macro blk.b 2
times %1 db %2
%endmacro

%macro blk.w 1
resw %1
%endmacro

%macro blk.l 1
resd %1
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro move.l 2
reg32
%ifidn %2,-[sp]
push dword %1
%elifidn %1,[sp]+
pop dword %2
%elifidn %2,[r6]+-{s1}
%ifidn %1,r0
stosd
%endif
%elifidn %2,[r6.w]+-{s1}
%ifidn %1,r0
stosd
%endif
%elifidn %1,[r5]+-
%ifidn %2,r0
lodsd
%endif
%else
mov dword %2,%1
%endif
reg0
%endmacro

%macro move.w 2
reg16
%ifidn %2,-[sp]
push word %1
%elifidn %1,[sp]+
pop word %2
%elifidn %1,[r5]+-
%ifidn %2,r0
lodsw
%endif
%elifidn %2,[r6.w]+-{s1}
%ifidn %1,r0
stosw
%endif
%else
mov word %2,%1
%endif
reg0
%endmacro

%macro move.b 2
%ifidn %1,[r5]+-
%ifidn %2,[r6]+-{s1}
movsb
%endif
%elifidn %2,[r6.w]+-{s1}
%ifidn %1,r0
stosb
%endif
%else
reg8
mov byte %2,%1
reg0
%endif
%endmacro


%macro moveq.l 2
reg32
%ifidn %2,-[sp]
push dword %1
%endif
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro movu.bw 2
reg16
movzx %2,byte %1
reg0
%endmacro

%macro movu.bl 2
reg32
movzx %2,byte %1
reg0
%endmacro

%macro movu.wl 2
reg32
movzx %2,word %1
reg0
%endmacro

%macro movem.l 2
%if __seg__ = 16
db $66
%endif
%ifidn %2,-[sp]
pusha
%else
popa
nop
%endif
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro exg.l 2
reg32
xchg %2,%1
reg0
%endmacro

%macro exg.w 2
reg16
xchg %2,%1
reg0
%endmacro

%macro exg.b 2
reg8
xchg %1,%2
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro add.l 2
reg32
add %2,%1
reg0
%endmacro

%macro add.w 2
reg16
add word %2,%1
reg0
%endmacro

%macro add.b 2
reg8
add %2,%1
reg0
%endmacro

%macro addq.l 2
reg32
add %2,%1
reg0
%endmacro

%macro addq.w 2
reg16
add word %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro addc.l 2
reg32
adc %2,%1
reg0
%endmacro

%macro addc.w 2
reg16
adc word %2,%1
reg0
%endmacro

%macro addc.b 2
reg8
adc %2,%1
reg0
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro sub.l 2
reg32
sub %2,%1
reg0
%endmacro

%macro sub.w 2
reg16
sub word %2,%1
reg0
%endmacro

%macro sub.b 2
reg8
sub %2,%1
reg0
%endmacro

%macro subq.l 2
reg32
sub %2,%1
reg0
%endmacro

%macro subq.w 2
reg16
sub word %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro subc.l 2
reg32
sbb %2,%1
reg0
%endmacro

%macro subc.w 2
reg16
sbb word %2,%1
reg0
%endmacro

%macro subc.b 2
reg8
sbb %2,%1
reg0
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro cmp.l 2
reg32
cmp %2,long %1
reg0
%endmacro

%macro cmp.w 2
reg16
cmp %2,word %1
reg0
%endmacro

%macro cmp.b 2

%ifidn %1,[r6]+-{s1}
%ifidn %2,[r5]+-
%if __seg__ = 16
db $66
%endif
cmpsb
%endif

%elifidn %1,[r6.l]+-{s1}
%ifidn %2,[r5.l]+-
%if __seg__ = 16
db $66
%endif
cmpsb
%endif

%elifidn %1,[r6.w]+-{s1}
%ifidn %2,[r5.w]+-
%if __seg__ = 32
db $66
%endif
cmpsb
%endif

%else
reg8
cmp %2,byte %1
reg0
%endif
%endmacro

%macro cmpq.l 2
reg32
cmp %2,long %1
reg0
%endmacro

%macro cmpq.w 2
reg16
cmp %2,word %1
reg0
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro and.l 2
reg32
and %2,%1
reg0
%endmacro

%macro and.w 2
reg16
and %2,%1
reg0
%endmacro

%macro and.b 2
reg8
and %2,%1
reg0
%endmacro

%macro andq.l 2
reg32
and %2,%1
reg0
%endmacro

%macro andq.w 2
reg16
and %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro or.l 2
reg32
or %2,%1
reg0
%endmacro

%macro or.w 2
reg16
or %2,%1
reg0
%endmacro

%macro or.b 2
reg8
or %2,%1
reg0
%endmacro

%macro orq.l 2
reg32
or %2,%1
reg0
%endmacro

%macro orq.w 2
reg16
or %2,%1
reg0
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro eor.l 2
reg32
xor %2,%1
reg0
%endmacro

%macro eor.w 2
reg16
xor %2,%1
reg0
%endmacro

%macro eor.b 2
reg8
xor %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro tst.l 2
reg32
test dword %2,%1
reg0
%endmacro

%macro tst.w 2
reg16
test word %2,%1
reg0
%endmacro

%macro tst.b 2
reg8
test byte %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro lsl.l 2
reg32
shl %2,%1
reg0
%endmacro

%macro lsl.w 2
reg16
shl %2,%1
reg0
%endmacro

%macro lsl.b 2
reg8
shl %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro lsr.l 2
reg32
shr %2,%1
reg0
%endmacro

%macro lsr.w 2
reg16
shr %2,%1
reg0
%endmacro

%macro lsr.b 2
reg8
shr %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro asr.l 2
reg32
sar %2,%1
reg0
%endmacro

%macro asr.w 2
reg16
sar %2,%1
reg0
%endmacro

%macro asr.b 2
reg8
sar %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro rol.l 2
reg32
rol %2,%1
reg0
%endmacro

%macro rol.w 2
reg16
rol %2,%1
reg0
%endmacro

%macro rol.b 2
reg8
rol %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro ror.l 2
reg32
ror %2,%1
reg0
%endmacro

%macro ror.w 2
reg16
ror %2,%1
reg0
%endmacro

%macro ror.b 2
reg8
ror %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


%macro btst.l 2
reg32
bt dword %2, %1
reg0
%endmacro

%macro bchg.l 2
reg32
btc dword %2, %1
reg0
%endmacro

%macro bset.w 2
%ifidn %1,0
%ifidn %2,sr
stc
%endif
%endif
%endmacro

%macro bclr.w 2
%ifidn %2,sr
%ifidn %1,0
clc
%endif
%ifidn %1,10
cld
%endif
%endif
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro neg.l 1
reg32
neg %1
reg0
%endmacro

%macro neg.w 1
reg16
neg %1
reg0
%endmacro

%macro neg.b 1
reg8
neg %1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro not.l 1
reg32
not %1
reg0
%endmacro

%macro not.w 1
reg16
not %1
reg0
%endmacro

%macro not.b 1
reg8
not %1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro inc.l 1
reg32
inc dword %1
reg0
%endmacro

%macro inc.w 1
reg16
inc %1
reg0
%endmacro

%macro inc.b 1
reg8
inc %1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro dec.l 1
reg32
dec dword %1
reg0
%endmacro

%macro dec.w 1
reg16
dec %1
reg0
%endmacro

%macro dec.b 1
reg8
dec %1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro muls.l 3
reg32
%ifidn %3,r1|r0
imul dword %1
%else
imul %2,%1
%endif
reg0
%endmacro

%macro mulu.l 3
reg32
%ifidn %3,r1|r0
mul dword %1
%else
mul %2,%1
%endif
reg0
%endmacro

%macro mulu.b 3
reg8
%ifidn %3,m0|r0
mul %1
%else
mul %2,%1
%endif
reg0
%endmacro

%macro divs.l 2
reg32
idiv %1
reg0
%endmacro

%macro divu.l 2
reg32
div dword %1
reg0
%endmacro

%macro divu.w 2
reg16
div word %1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro lea.l 2
reg32
lea %2,%1
reg0
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro adj_dec_sub 1
das
%endmacro

%macro in.b 2
reg8
in %2,%1
reg0
%endmacro

%macro out.b 2
reg8
out %2,%1
reg0
%endmacro

%macro ext.l 2
%ifidn %2,r1|r0
%ifidn %1,r0
cdq
%endif
%endif
%endmacro

%macro ext.w 2
%ifidn %2,r1|r0
%ifidn %1,r0
cwd
%endif
%endif
%endmacro

%macro ext.l 1
%ifidn %1,r0
cwde
%endif
%endmacro

%macro ext.w 1
%ifidn %1,r0
cbw
%endif
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro trap 1
int %1
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro br.b 1
jmp %1
%endmacro
%macro br.l 1
jmp %1
%endmacro

%macro bmi.b 1
js %1
%endmacro
%macro bmi.l 1
js %1
%endmacro

%macro bpl.b 1
jns %1
%endmacro
%macro bpl.l 1
jns %1
%endmacro

%macro bcc.b 1
jnc %1
%endmacro
%macro bcc.l 1
jnc %1
%endmacro

%macro bhs.b 1
jnc %1
%endmacro
%macro bhs.l 1
jnc %1
%endmacro

%macro bls.b 1
jbe %1
%endmacro
%macro bls.l 1
jbe %1
%endmacro

%macro bcs.b 1
jc %1
%endmacro
%macro bcs.l 1
jc %1
%endmacro

%macro blo.b 1
jc %1
%endmacro
%macro blo.l 1
jc %1
%endmacro

%macro bhi.b 1
ja %1
%endmacro
%macro bhi.l 1
ja %1
%endmacro

%macro beq.b 1
jz %1
%endmacro
%macro beq.l 1
jz %1
%endmacro

%macro bne.b 1
jne %1
%endmacro
%macro bne.l 1
jne %1
%endmacro

%macro bgt.b 1
jg %1
%endmacro
%macro bgt.l 1
jg %1
%endmacro

%macro bge.b 1
jge %1
%endmacro
%macro bge.l 1
jge %1
%endmacro

%macro ble.b 1
jle %1
%endmacro
%macro ble.l 1
jle %1
%endmacro

%macro dbf.l 2
loop %2
%endmacro

%macro dbf.w 2
loop %2
%endmacro

%macro jmp.ww 1
jmp far %1
%endmacro


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%macro bsr.l 1
call dword %1
%endmacro

%macro bsr.w 1
call word %1
%endmacro

%macro rts.l 0
%if __seg__ = 16
db $66
%endif
ret
%endmacro

%macro rts.w 0
%if __seg__ = 32
db $66
%endif
ret
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro rep_r2 1+
rep
%1
%endmacro

%macro repeq_r2 1+
repe
%1
%endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%define r0.b al
%define r1.b dl
%define r2.b cl
%define r3.b bl
%define m0 ah
%define m1 dh
%define m2 ch
%define m3 bh

%define r0.w ax
%define r1.w dx
%define r2.w cx
%define r3.w bx
%define r4.w bp
%define r5.w si
%define r6.w di
%define r7.w sp

%define r0.l eax
%define r1.l edx
%define r2.l ecx
%define r3.l ebx
%define r4.l ebp
%define r5.l esi
%define r6.l edi
%define r7.l esp

%define s0 ds
%define s1 es
%define s2 fs
%define s3 gs
%define s6 cs
%define s7 ss


%macro reg0 0
%undef r0
%undef r1
%undef r2
%undef r3
%undef r4
%undef r5
%undef r6
%undef r7
%endmacro

%macro reg8 0
%define r0 al
%define r1 dl
%define r2 cl
%define r3 bl
%endmacro

%macro reg16 0
%define r0 ax
%define r1 dx
%define r2 cx
%define r3 bx
%define r4 bp
%define r5 si
%define r6 di
%define r7 sp
%endmacro

%macro reg32 0
%define r0 eax
%define r1 edx
%define r2 ecx
%define r3 ebx
%define r4 ebp
%define r5 esi
%define r6 edi
%define r7 esp
%endmacro

H. Peter Anvin

unread,
Jul 19, 2009, 3:34:13 PM7/19/09
to
Rod Pemberton wrote:
>
> The only "professional mode" I'm interested in is having NASM emit the same
> binary sequences as MASM. I've got two conversions I have yet to complete
> because there are so many branches I still can't tell if the binaries are
> equivalent to the originals...
>

Got specifics? How hard it is to do probably depends on what is
different, but at least prefix order is largely arbitrary.

>
> It could prevent HK from overloading the NASM macro processor with defines
> and undefines... ;) Unfortunately, altreg doesn't allow one to define or
> use different register names. HK can't define or use his preferred register
> names. altreg only allows one to use a different set of register names.
> It's just different set which is predefined also. If you could define your
> own, there'd be some value for HK or, perhaps, use in a register
> allocator... Why'd they call this "alternate"?...
>

Overloading the NASM 2.x preprocessor is really hard. One of my
standard performance tests is a file which contains over a million
macros; it took over 10 minutes on a Core 2 box to assemble when I
started optimizing, now it takes little over 7 seconds.

-hpa

Rod Pemberton

unread,
Jul 20, 2009, 3:47:43 AM7/20/09
to
"H. Peter Anvin" <h...@zytor.com> wrote in message
news:h3vsfl$ij5$1...@terminus.zytor.com...
>
> Got specifics?

Offhand, no. I haven't looked at them in a while. I ...seem to recall...
that branches, and a few other instructions encoded to equivalent sequences
with higher value opcodes than MASM uses. I did create a NASM assembly file
with most supported 16-bit opcodes. If I can figure out enough of MASM to
port it or find MASM syntax dis/assemblers to help in conversion (JWASM?), I
could make a list. Don't hold your breathe waiting...

> > It could prevent HK from overloading the NASM macro processor with
defines
> > and undefines... ;) Unfortunately, altreg doesn't allow one to define
or
> > use different register names. HK can't define or use his preferred
register
> > names. altreg only allows one to use a different set of register names.
> > It's just different set which is predefined also. If you could define
your
> > own, there'd be some value for HK or, perhaps, use in a register
> > allocator... Why'd they call this "alternate"?...
> >
>
> Overloading the NASM 2.x preprocessor is really hard. One of my
> standard performance tests is a file which contains over a million
> macros; it took over 10 minutes on a Core 2 box to assemble when I
> started optimizing, now it takes little over 7 seconds.
>

Good to know, but I was joking... I was using HK's use of macros to
discuss the issue that one can't define their own register set for %altreg.

HK has one of the larger includes for NASM that I've seen. He uses a number
of macro's to %define and %undef entire register sets. I'm assuming these
are used repetitiously. He posted his include in this thread, dated
7/19/2009 7:17AM here. It's much smaller than "yours".

> a file which contains over a million macros

Yeah, that's one way to write a C or ADA compiler...

Memory usage must've been "large" assuming a few pointers per macro, other
overhead, and an some average size, say 64 bytes, per macro. You could
easily hit 200Mb just for the internal memory representation of the macros
without allocating memory space for compilation. Of course, defining and
undefining macros, as HK does during compilation, tests not just the macros
but the host's memory allocator too.


RP


Rod Pemberton

unread,
Jul 20, 2009, 3:48:03 AM7/20/09
to
"Herbert Kleebauer" <kl...@unibwm.de> wrote in message
news:4A6300C7...@unibwm.de...
>
> [...] it was clear, that I either have to stop

> programming in assembly or I have to write my own assembler. The same
> now happens with the arm processor. I'm currently reading the processor
> manual, but I suppose I have to write my own assembler if I ever will
> write some arm assembly code.
>

Time for an interpreter? Time for assembly language independence?

I'm thinking it's about time for my code. I doubt any of the C compilers I
use will ever be 64-bit capable... Which will cause future problems for a
number of my personal projects. Even though all the interpreters I've used
and written are on the slow side, I'm thinking that for code portability it
may be a necessary reality. Only the interpreter would need to be rewritten
for each target. The code could be "compiled" as token threaded, like
interpreted BASICs or Pascal P-code of yesteryear. If the interpreter is
small enough, one could embed it in the startup code for an executable or as
the executable with a big data section for the tokenized program. Slower,
but no real loss of functionality...


RP


Rod Pemberton

unread,
Jul 20, 2009, 3:48:19 AM7/20/09
to
"Herbert Kleebauer" <kl...@unibwm.de> wrote in message
news:4A62F834...@unibwm.de...

>
> Without the GPL licence, I suppose, NASM will be completely replaced
> by GAS on the Linux side.

Replaced? GNU GAS is what's used by GNU/Linux code. GAS is the system
assembly tool. NASM is just a user assembly tool.

Anyway, without a platform of captive users, software dies. (Apple
ideology?... er, MS-DOS ideology?...) It's better for NASM if it's is the
system assembly tool.

So, BSD licensed NASM might be a smart choice to prevent NASM's demise. I'm
only saying that because the various BSD's desperately want non-GPL licensed
tools and/or BSD licensed tools. They attempted to resurrect Steve
Johnson's PCC (Portable C Compiler) so they could have a BSD licensed C
compiler. (They've been using GNU GCC since '94.)


Rod Pemberton


Maxim S. Shatskih

unread,
Jul 20, 2009, 11:27:26 AM7/20/09
to
> for each target. The code could be "compiled" as token threaded, like
> interpreted BASICs or Pascal P-code of yesteryear.

Yes, and JIT is by far better then interpreters for such systems.

--
Maxim S. Shatskih
Windows DDK MVP
ma...@storagecraft.com
http://www.storagecraft.com

BGB / cr88192

unread,
Jul 21, 2009, 5:47:56 PM7/21/09
to

"Rod Pemberton" <do_no...@nohavenot.cmm> wrote in message
news:h417gs$9oa$1...@aioe.org...

oddly, I migrated my project both from x86 to x86-64, and from GCC to MSVC,
in a matter of days...

most of my time initially was not related to coding, but more trying to
figure out just how the hell I was going to go about building my stuff on
Win64 (since, I was initially motivated for the jump by MinGW-w64, but was
disappointed to find that it wasn't even close to working well enough for my
uses, and so was faced with an MSVC migration...).

then a bunch of stuff to "clean up" after the Win64 migration...

then I decided to go implement the native Win64 calling convention, ...


now, I am back mostly to working on my core issues, namely beating at my
codegen trying to make it "less crap", ... (and, currently stuck in an
odd-land somewhere between RPN and SSA, namely RPN on top of an essentially
"synthetic" stack...).

>
> RP
>
>


Almas

unread,
Jul 22, 2009, 2:51:43 AM7/22/09
to
Hello,
I try the file of Herbert : clock.com ; it display the date.
But i did not found a solution tu catch the minutes in a register.

I did not found a solution to maka an alarm : clean screen and make a noise
when times comes.

If somebody can give me a solution....

Best regrds
Almas


Herbert Kleebauer

unread,
Jul 22, 2009, 3:03:17 PM7/22/09
to
Almas wrote:

> I try the file of Herbert : clock.com ; it display the date.
> But i did not found a solution tu catch the minutes in a register.

I don't understand your motivation. If you want to do some
assembly programming, start with normal programs and not with
TSR. If you are interested in the program itself, use a
Windows program and not a TSR program in a DOS box.



> I did not found a solution to maka an alarm : clean screen and make a noise
> when times comes.

I don't think you should clear the screen in a TSR program: suppose
you are just editing a file and then the TSR program in the background
clears the screen and plays a sound. Most user will think the editor
crashed and will close the DOS box which means, you loose all your
changes made to the file. And it's also not easy to clear the screen
in a TSR program, because you don't know which graphics mode currently
is used (for example, if you are playing a DOS graphics game in full
screen mode).


> If somebody can give me a solution....

The solution is, to not use a TSR program. In Windows use a Windows
program and in DOS 5 use a normal alarm clock which also works
when the PC is off.

Almas

unread,
Jul 22, 2009, 4:40:54 PM7/22/09
to
Hi,
my aim is to do something when "time comes".
do "CLS" or make a noise, it can be send a word in LPT1...
The final aim is to use the pins of the printer and use a relay.

I would have a file with a small size : i have to use it on a floppy.

I found a file alarm.com : 1808 bytes, it makes a noise, but it is a too
large file.
i did not found a way to modify it


Herbert Kleebauer

unread,
Jul 23, 2009, 8:11:05 AM7/23/09
to
Almas wrote:

> my aim is to do something when "time comes".
> do "CLS" or make a noise, it can be send a word in LPT1...
> The final aim is to use the pins of the printer and use a relay.

The real time clock in an AT already supports an alarm time. Use

Interrupt 1Ah, Funktion 06h BIOS (ab AT)

Eingabe AH = 06h
CH = Stunde
CL = Minute
DH = Sekunde
Ausgabe Carry-Flag = 0: O.k.
Carry-Flag = 1: Entweder ist die Batterie der Uhr leer, oder es ist
bereits eine Alarmzeit programmiert.


to set the alarm time and hook interrupt 0x4a which is called when
the alarm time is reached. In this interrupt routine set the appropriate
bit in the parallel port data register (0x378 for lpt1 or 278 for lpt2).

But I will not give you any ready to use code because I think this is
a big waste of energy. Even an old PC with DOS 5 will consume about
100 W and does nothing but wait for an interrupt from the RTC. Use
a normal, battery driven alarm clock and replace the alarm speaker
by a relay or, if you want to do it with a CPU, use a cheap low power
single chip microcontroller like http://www.atmel.com/products/avr/default.asp

Almas

unread,
Jul 23, 2009, 2:50:57 PM7/23/09
to
Danke sh�n.
ich werde versuchen

"Herbert Kleebauer" <kl...@unibwm.de> a �crit dans le message de news:
4A685359...@unibwm.de...

0 new messages