Modifications to prince.exe (hex editing)

User avatar
Norbert
The Prince of Persia
The Prince of Persia
Posts: 5743
Joined: April 9th, 2009, 10:58 pm

Re: Modifications to prince.exe (hex editing)

Post by Norbert »

Shauing wrote: September 17th, 2021, 7:53 pm
Norbert wrote: September 16th, 2021, 1:02 pm
Shauing wrote: September 16th, 2021, 3:59 amEDIT: It's still outputting an unknown file instead of exporting the files. Maybe by watching some images/video about how to export the resources would be nice?
Can you screen record what you do, and share that video recording with us.
Then we can see what you're doing, and hopefully provide suggestions.
[video]
PR.bat asks multiple questions, and it appears you missed one question entirely.

"Where is Prince of Persia (the .DAT files):"

You answered that by telling PR.bat where the file resources.xml resides.

Your answer should instead be the full directory path where Prince of Persia 1 for DOS is on your disk. In other words, where the .DAT files are.

An example answer: C:\Games\Prince of Persia\
User avatar
Shauing
Calif
Calif
Posts: 431
Joined: April 5th, 2018, 10:38 pm
Contact:

Re: Modifications to prince.exe (hex editing)

Post by Shauing »

Didn't get to make it work via the batch but made it work via cmd.
I have a midi question, do we have an instrument list that Prince of Persia uses? It seems PR doesn't export that midiinfo file.
NEW UPDATE! Prince Of Persia: 30th Anniversary Port v1.1.5. Download it today!: viewtopic.php?p=29053#p29053
NEW UPDATE! Prince Of Persia: The Queen Of Light v2.6. Download it today! viewtopic.php?p=33174#p33174
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

Shauing wrote: September 21st, 2021, 12:34 am I have a midi question, do we have an instrument list that Prince of Persia uses?
The PRINCE.DAT of PoP 1.3 contains some instrument names for the MT-32, but possibly not in the order of their codes.

The PR which comes with Apoplexy can't export the resource which contains these names.
But the newest PR can export it.
Shauing wrote: September 21st, 2021, 12:34 am It seems PR doesn't export that midiinfo file.
So you export PRINCE.DAT and you get all files except "prince\binary\midi info 1.bin" ?
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

Norbert wrote: September 18th, 2021, 11:57 am
David wrote: September 18th, 2021, 9:32 amApoplexy will crash if you try load such a level, though.
I've not tested, but probably you mean "exit", maybe with the "[FAILED] Wrong dir.!" notice? I think "crash" would imply it additionally stopped functioning properly, e.g. read invalid memory.
You're right.
"[FAILED] Wrong dir.!" appears on the console when I load the level, but it's only visible if I start Apoplexy from a console.
Then Apoplexy closes itself.
If I start Apoplexy from a file manager, not from a console, then Apoplexy's console window is closed before I could see the error message there.
User avatar
Shauing
Calif
Calif
Posts: 431
Joined: April 5th, 2018, 10:38 pm
Contact:

Re: Modifications to prince.exe (hex editing)

Post by Shauing »

David wrote: September 25th, 2021, 10:15 am
The PRINCE.DAT of PoP 1.3 contains some instrument names for the MT-32, but possibly not in the order of their codes.

The PR which comes with Apoplexy can't export the resource which contains these names.
But the newest PR can export it.

So you export PRINCE.DAT and you get all files except "prince\binary\midi info 1.bin" ?
Yes and I tried it with the newest PR (1.3.1). Even using Prince of Persia DOS v1.4.
NEW UPDATE! Prince Of Persia: 30th Anniversary Port v1.1.5. Download it today!: viewtopic.php?p=29053#p29053
NEW UPDATE! Prince Of Persia: The Queen Of Light v2.6. Download it today! viewtopic.php?p=33174#p33174
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

Shauing wrote: September 26th, 2021, 9:25 am
David wrote: September 25th, 2021, 10:15 am So you export PRINCE.DAT and you get all files except "prince\binary\midi info 1.bin" ?
Yes and I tried it with the newest PR (1.3.1). Even using Prince of Persia DOS v1.4.
That's strange.

I downloaded a fresh copy of them for testing.
PR 1.3.1: https://www.popot.org/other_useful_tools.php?tool=PR
PoP 1.4: https://www.popot.org/get_the_games.php?game=1

If I copy PRINCE.DAT to PR's bin folder then the following command exports everything from PRINCE.DAT, including "prince\binary\midi info 1.bin".

Code: Select all

pr.exe -e PRINCE.DAT
It also works without copying the DAT file, with the path to PRINCE.DAT given to PR in the command line.

Code: Select all

pr.exe -e ..\..\..\PoP1_4\PRINCE.DAT
The current directory must have resources.xml, otherwise PR doesn't export anything and stops with the error "Cannot open XML file".

If I copy resources.xml over to the PoP1_4 folder, then exporting works from there as well.

Code: Select all

..\PR-1.3.1\src\bin\pr.exe -e PRINCE.DAT
What are we doing differently?
User avatar
Shauing
Calif
Calif
Posts: 431
Joined: April 5th, 2018, 10:38 pm
Contact:

Re: Modifications to prince.exe (hex editing)

Post by Shauing »

No, Prince.DAT is exported correctly, all of them in fact. I meant that midi info 1 seems that it cannot be opened or its contents extracted by PR. If PR is not meant to export it's contents, how do you open this file to know which instruments they use?
NEW UPDATE! Prince Of Persia: 30th Anniversary Port v1.1.5. Download it today!: viewtopic.php?p=29053#p29053
NEW UPDATE! Prince Of Persia: The Queen Of Light v2.6. Download it today! viewtopic.php?p=33174#p33174
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

Shauing wrote: September 26th, 2021, 10:44 am I meant that midi info 1 seems that it cannot be opened or its contents extracted by PR. If PR is not meant to export it's contents, how do you open this file to know which instruments they use?
The format of that resource is specific to PoP and the Adlib sound card.

The first byte is the number of instruments, the rest are the instruments (16 bytes each), according to the instrument_type in types.h of SDLPoP.
https://github.com/NagyD/SDLPoP/blob/v1 ... #L643-L660

midi.c simply gives most of them to the emulation of the OPL chip (which is in opl3.c).

Falcury made midi.c, he might know more about how this works.
teljesnegyzet
Efendi
Efendi
Posts: 14
Joined: September 20th, 2021, 8:29 pm

Re: Modifications to prince.exe (hex editing)

Post by teljesnegyzet »

I would like the fire of the torches to be drawn with transparent background. So with BLIT_TRANS mode, if I understand it correctly.
I know that this wouldn't erase the previous fire frame and the new frame would just be drawn over it.
Is it possible?
User avatar
Norbert
The Prince of Persia
The Prince of Persia
Posts: 5743
Joined: April 9th, 2009, 10:58 pm

Re: Modifications to prince.exe (hex editing)

Post by Norbert »

teljesnegyzet wrote: January 11th, 2022, 8:07 pm I would like the fire of the torches to be drawn with transparent background. So with BLIT_TRANS mode, if I understand it correctly.
I know that this wouldn't erase the previous fire frame and the new frame would just be drawn over it.
Is it possible?
I can't help, but looked into it. I think somewhere B8 00 00 would need to be changed to B8 10 00, but this is just a guess, and I've modified all matching byte locations in PRINCE.EXE one at a time in trial-and-error fashion, but playtesting either shows no changes or results in a game crash.

It is possible to make the modification with SDLPoP, by changing "blitters_0_no_transp" to "blitters_10h_transp" on line 531 of src/seg008.c (and then recompiling). However, without a background all the torch flames are drawn on top of each other, to a big smeary blob. If you know what I mean. The default, without transparency, is that the black background around each flame automatically overwrites the previous fire. One possible solution might be drawing back the rectangle portion of the background between each frame, but I can't help with that as my knowledge of the SDLPoP code is insufficient.
teljesnegyzet
Efendi
Efendi
Posts: 14
Joined: September 20th, 2021, 8:29 pm

Re: Modifications to prince.exe (hex editing)

Post by teljesnegyzet »

Norbert wrote: January 12th, 2022, 1:53 pm but looked into it.
Thank you!
Norbert wrote: January 12th, 2022, 1:53 pm However, without a background all the torch flames are drawn on top of each other, to a big smeary blob.
Yes, that's what I meant by "I know that this wouldn't erase the previous fire frame".

I found a solution:
Search for:

Code: Select all

A1 68 59 40 50 2B C0 50 A1 26 43 2D 28 00 50 2B C0 50
Change to:

Code: Select all

A1 68 59 50 2B C0 50 A1 26 43 2D 28 00 50 B8 10 00 50
As a side effect, the flame is now drawn 8 pixels to the left, but that can be easily compensated by adding 8 black columns to each image of the fire.
torch.png
torch.png (2.62 KiB) Viewed 5880 times
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

teljesnegyzet wrote: January 12th, 2022, 9:57 pm I found a solution:
Search for:

Code: Select all

A1 68 59 40 50 2B C0 50 A1 26 43 2D 28 00 50 2B C0 50
Change to:

Code: Select all

A1 68 59 50 2B C0 50 A1 26 43 2D 28 00 50 B8 10 00 50
As a side effect, the flame is now drawn 8 pixels to the left, but that can be easily compensated by adding 8 black columns to each image of the fire.
For the record, your hack changes this part:

Code: Select all

seg008:0919                      tile_torch:                             ; CODE XREF: draw_tile_anim_right+22^Xj
seg008:0919                                                              ; draw_tile_anim_right+27^Xj
seg008:0919 80 3E CC 4C 09                       cmp     modifier_left, 9
seg008:091E 73 4D                                jnb     end
seg008:0920 B8 01 00                             mov     ax, id_chtab_1_flameswordpotion
seg008:0923 50                                   push    ax
seg008:0924 A0 CC 4C                             mov     al, modifier_left
seg008:0927 2A E4                                sub     ah, ah
seg008:0929 40                                   inc     ax
seg008:092A 50                                   push    ax
seg008:092B A1 68 59                             mov     ax, draw_xh
seg008:092E 40                                   inc     ax ; <-- removed (xh is not increased, x=xh*8+xl, so x is decreased by 8)
seg008:092F 50                                   push    ax
seg008:0930 2B C0                                sub     ax, ax
seg008:0932 50                                   push    ax
seg008:0933 A1 26 43                             mov     ax, draw_main_y
seg008:0936 2D 28 00                             sub     ax, 40
seg008:0939 50                                   push    ax
seg008:093A 2B C0                                sub     ax, ax ; <-- changed to MOV AX, 0010h
seg008:093C 50                                   push    ax
seg008:093D EB CD                                jmp     short loc_A52C

Here is my attempt, which does not move the flame:

Search for:

Code: Select all

A1 68 59 40 50 2B C0 50 A1 26 43 2D 28 00 50 2B C0 50
Change to:

Code: Select all

A1 68 59 40 50 2B C0 50 A1 26 43 2D 28 00 50 B0 10 50
(Only 2 bytes change.)

With this hack, INC AX is not removed, and SUB AX, AX is changed to MOV AL, 10h.
User avatar
Shauing
Calif
Calif
Posts: 431
Joined: April 5th, 2018, 10:38 pm
Contact:

Re: Modifications to prince.exe (hex editing)

Post by Shauing »

There's a few hacks I need to complete the port of Queen Of Light. Not sure if this is where I should ask for these if they are possible.
How can it be made that all guards can fall to other rooms without dying?
The loose tile that can be walked over (the one with a prohibited sign in apoplexy) is not climbable?
Move the event where the shadow gets out of the mirror and runs occurs on Level 6?
Move the event where the shadow steals the potion, and steps on the switch both on Level 7 (or at least only the first one?)
That a specific guard (maybe the skeleton or Jaffar which have been left unused up to now otherwise) can go thru chompers by not gettting damaged and not put down the sword by them, and that they can die from a two row height fall like any other guard for the final level? (If I recall correctly, at least the skeleton if it falls from a two row height, the game freezes)
NEW UPDATE! Prince Of Persia: 30th Anniversary Port v1.1.5. Download it today!: viewtopic.php?p=29053#p29053
NEW UPDATE! Prince Of Persia: The Queen Of Light v2.6. Download it today! viewtopic.php?p=33174#p33174
David
The Prince of Persia
The Prince of Persia
Posts: 2846
Joined: December 11th, 2008, 9:48 pm
Location: Hungary

Re: Modifications to prince.exe (hex editing)

Post by David »

So far I have figured out only the shadow events.

All offsets are for unpacked 1.0.
Shauing wrote: January 22nd, 2022, 11:07 am Move the event where the shadow gets out of the mirror and runs occurs on Level 6?
Spoiler: show

Code: Select all

seg002:06E1 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: mirror music
seg002:06E6 75 1D                                jnz     locret_3D85
seg002:06E8 80 3E 27 3D 00                       cmp     char.curr_row, 0 ; only if he is in the top row
seg002:06ED 75 16                                jnz     locret_3D85
seg002:06EF 80 3E 2B 3D 0B                       cmp     char.room, 11
seg002:06F4 75 0F                                jnz     locret_3D85
Search: 83 3E 9E 0F 04 75 1D 80 3E 27 3D 00 75 16 80 3E 2B 3D 0B 75 0F
Change: 04 to level number, 00 to row of prince, 0B to room which the prince exits to the left
Offset: level: 0x5615, row: 0x561C, room: 0x5623

Code: Select all

seg002:081D 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: shadow runs
seg002:0822 75 06                                jnz     loc_3EAA
seg002:0824 0E                                   push    cs
seg002:0825 E8 D8 07                             call    near ptr autocontrol_shadow_level4
Search: 83 3E 9E 0F 04 75 06 0E E8 D8 07
Change: 04 to level number
Offset: 0x5751

Code: Select all

seg006:0354 83 3E 9E 0F 04                       cmp     current_level, 4 ; level 4 has different ending music
seg006:0359 75 0B                                jnz     not_alt_level_music
Search: 83 3E 9E 0F 04 75 0B
Change: 04 to level number
Offset: 0x88B8

Code: Select all

seg007:0673 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: place mirror
seg007:0678 75 2A                                jnz     loc_8BF4
seg007:067A B8 04 00                             mov     ax, 4
seg007:067D 50                                   push    ax              ; room
seg007:067E 50                                   push    ax              ; col
seg007:067F 2B C0                                sub     ax, ax
seg007:0681 50                                   push    ax              ; row
(This one is in CusPoP except for the row number.)
Search: 83 3E 9E 0F 04 75 2A B8 04 00 50 50 2B C0 50
Change: first 04 to level number, second 04 to room and column number, 2B C0 to B0 RR where RR is the row number.
Offset: level number: 0xA477, room and column: 0xA47B, row: 0xA47F-0xA480

If you need different room and column numbers:
Change B8 04 00 50 50 to 68 RR 00 6A CC where RR is the room, CC is the column.
Offset: 0xA47A-0xA47E

Code: Select all

seg008:235D 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: shadow is clipped: may appear only right from the mirror
seg008:2362 75 0D                                jnz     loc_BF91
seg008:2364 80 3E 2B 3D 04                       cmp     char.room, 4
seg008:2369 75 06                                jnz     loc_BF91
seg008:236B C7 06 A6 42 89 00                    mov     obj_clip_left, 137
Search: 83 3E 9E 0F 04 75 0D 80 3E 2B 3D 04 75 06 C7 06 A6 42 89 00
Change: first 04 to level number, second 04 to room number, 89 (decimal 137) to clip x = column * 32 + 9 (conver it to hex).
Offset: level number: 0xD831, room: 0xD834, clip: 0xD83F
Shauing wrote: January 22nd, 2022, 11:07 am Move the event where the shadow steals the potion, and steps on the switch both on Level 7 (or at least only the first one?)
Spoiler: show
Shadow stealing the potion

Code: Select all

seg002:00E3 83 3E 9E 0F 05                       cmp     current_level, 5 ; Special event: shadow appears
seg002:00E8 75 23                                jnz     loc_378D
seg002:00EA A0 9E 40                             mov     al, byte ptr drawn_room
seg002:00ED A2 2B 3D                             mov     char.room, al
seg002:00F0 3C 18                                cmp     al, 24
seg002:00F2 75 19                                jnz     loc_378D
Search: 83 3E 9E 0F 05 75 23 A0 9E 40 A2 2B 3D 3C 18 75 19
Change: 05 to level number, 18 to room number
Offset: level: 0x5017, room: 0x5021

Code: Select all

seg002:082A 83 3E 9E 0F 05                       cmp     current_level, 5 ; Special event: shadow drinks
seg002:082F 75 06                                jnz     loc_3EB7
seg002:0831 0E                                   push    cs
seg002:0832 E8 E5 07                             call    near ptr autocontrol_shadow_level5
seg002:0835 EB 18                                jmp     short locret_3ECF
Search: 83 3E 9E 0F 05 75 06 0E E8 E5 07 EB 18
Change: 05 to level number, EB 18 to 90 90 (to allow the two events on the same level)
Offset: level: 0x575E, EB 18: 0x5765-0x5766


Shadow stepping on the switch

Code: Select all

seg002:00B3 83 3E 9E 0F 06                       cmp     current_level, 6 ; Special event: level 6 shadow
seg002:00B8 75 29                                jnz     loc_3763
seg002:00BA A0 9E 40                             mov     al, byte ptr drawn_room
seg002:00BD A2 2B 3D                             mov     char.room, al
seg002:00C0 3C 01                                cmp     al, 1
seg002:00C2 75 49                                jnz     loc_378D
Search: 83 3E 9E 0F 06 75 29 A0 9E 40 A2 2B 3D 3C 01 75 49
Change: 06 to level number, 01 to room number, 75 49 to 75 1F (to allow the two events on the same level)
Offset: level: 0x4FE7, room: 0x4FF1, 75 49: 0x4FF2-0x4FF3

Code: Select all

seg002:0837 83 3E 9E 0F 06                       cmp     current_level, 6 ; Special event: shadow steps
seg002:083C 75 06                                jnz     loc_3EC4
seg002:083E 0E                                   push    cs
seg002:083F E8 22 08                             call    near ptr autocontrol_shadow_level6
Search: 83 3E 9E 0F 06 75 06 0E E8 22 08
Change: first 06 to level number
Offset: 0x576B

Code: Select all

seg002:1064                      autocontrol_shadow_level6 proc far
seg002:1064 80 3E 2B 3D 01                       cmp     char.room, 1
seg002:1069 75 16                                jnz     locret_4701
Search: 80 3E 2B 3D 01 75 16
Change: 01 to room number
Offset: 0x5F98
User avatar
Shauing
Calif
Calif
Posts: 431
Joined: April 5th, 2018, 10:38 pm
Contact:

Re: Modifications to prince.exe (hex editing)

Post by Shauing »

David wrote: January 22nd, 2022, 7:25 pm So far I have figured out only the shadow events.

All offsets are for unpacked 1.0.
Shauing wrote: January 22nd, 2022, 11:07 am Move the event where the shadow gets out of the mirror and runs occurs on Level 6?
Spoiler: show

Code: Select all

seg002:06E1 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: mirror music
seg002:06E6 75 1D                                jnz     locret_3D85
seg002:06E8 80 3E 27 3D 00                       cmp     char.curr_row, 0 ; only if he is in the top row
seg002:06ED 75 16                                jnz     locret_3D85
seg002:06EF 80 3E 2B 3D 0B                       cmp     char.room, 11
seg002:06F4 75 0F                                jnz     locret_3D85
Search: 83 3E 9E 0F 04 75 1D 80 3E 27 3D 00 75 16 80 3E 2B 3D 0B 75 0F
Change: 04 to level number, 00 to row of prince, 0B to room which the prince exits to the left
Offset: level: 0x5615, row: 0x561C, room: 0x5623

Code: Select all

seg002:081D 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: shadow runs
seg002:0822 75 06                                jnz     loc_3EAA
seg002:0824 0E                                   push    cs
seg002:0825 E8 D8 07                             call    near ptr autocontrol_shadow_level4
Search: 83 3E 9E 0F 04 75 06 0E E8 D8 07
Change: 04 to level number
Offset: 0x5751

Code: Select all

seg006:0354 83 3E 9E 0F 04                       cmp     current_level, 4 ; level 4 has different ending music
seg006:0359 75 0B                                jnz     not_alt_level_music
Search: 83 3E 9E 0F 04 75 0B
Change: 04 to level number
Offset: 0x88B8

Code: Select all

seg007:0673 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: place mirror
seg007:0678 75 2A                                jnz     loc_8BF4
seg007:067A B8 04 00                             mov     ax, 4
seg007:067D 50                                   push    ax              ; room
seg007:067E 50                                   push    ax              ; col
seg007:067F 2B C0                                sub     ax, ax
seg007:0681 50                                   push    ax              ; row
(This one is in CusPoP except for the row number.)
Search: 83 3E 9E 0F 04 75 2A B8 04 00 50 50 2B C0 50
Change: first 04 to level number, second 04 to room and column number, 2B C0 to B0 RR where RR is the row number.
Offset: level number: 0xA477, room and column: 0xA47B, row: 0xA47F-0xA480

If you need different room and column numbers:
Change B8 04 00 50 50 to 68 RR 00 6A CC where RR is the room, CC is the column.
Offset: 0xA47A-0xA47E

Code: Select all

seg008:235D 83 3E 9E 0F 04                       cmp     current_level, 4 ; Special event: shadow is clipped: may appear only right from the mirror
seg008:2362 75 0D                                jnz     loc_BF91
seg008:2364 80 3E 2B 3D 04                       cmp     char.room, 4
seg008:2369 75 06                                jnz     loc_BF91
seg008:236B C7 06 A6 42 89 00                    mov     obj_clip_left, 137
Search: 83 3E 9E 0F 04 75 0D 80 3E 2B 3D 04 75 06 C7 06 A6 42 89 00
Change: first 04 to level number, second 04 to room number, 89 (decimal 137) to clip x = column * 32 + 9 (conver it to hex).
Offset: level number: 0xD831, room: 0xD834, clip: 0xD83F
I tried to do this first one, but the Shadow doesn't run to the right of the screen, he stays still after getting out of the mirror (at least on DOSBox, on SDLPoP the mirror appears on Room 20 for some reason and on a different column).
This one is supposed to occur on Level 6, at row 1, column 4, room 22, exiting room 21 to the left.
So I changed each part here to the following:
Spoiler: show
Search: 83 3E 9E 0F 06 75 1D 80 3E 27 3D 01 75 16 80 3E 2B 3D 15 75 0F
Change: 04 to level number, 00 to row of prince, 0B to room which the prince exits to the left

Search: 83 3E 9E 0F 06 75 06 0E E8 D8 07
Change: 04 to level number

Search: 83 3E 9E 0F 06 75 0B
Change: 04 to level number

Search: 83 3E 9E 0F 06 75 2A 68 16 00 6A 04 B0 01 50
Change: first 04 to level number, change B8 04 00 50 50 to 68 RR 00 6A CC where RR is the room, CC is the column, 2B C0 to B0 RR where RR is the row number.

Search: 83 3E 9E 0F 06 75 0D 80 3E 2B 3D 16 75 06 C7 06 A6 42 89 00
Change: first 04 to level number, second 04 to room number, 89 (decimal 137) to clip x = column * 32 + 9 (conver it to hex).
NEW UPDATE! Prince Of Persia: 30th Anniversary Port v1.1.5. Download it today!: viewtopic.php?p=29053#p29053
NEW UPDATE! Prince Of Persia: The Queen Of Light v2.6. Download it today! viewtopic.php?p=33174#p33174
Post Reply