Please enable JavaScript to display the menu.

Playing Uncharted Waters 1 with FM TOWNS Emulator Tsugaru

ysflight.com

Introduction

If I think of why do I play retro games, I was not able to buy many games when I was using FM-7 and FM77AV because I was a kid, and I was too busy learning 3D graphics and C programming when I was using FM TOWNS. New games must be much more sophisticated and spectacular than games from 1980s and 1990s. Nonetheless, there were many games that I was interested but I didn't play back then. I feel those are unfinished business before moving on to modern games.

Daikoukaijidai, or Uncharted Waters in English, was one of them. About 30 years ago, my high-school friends were playing it. It looked fun, but I was just watching. Once I graduated high school, I spent most of my time to write my own flight simulator for FM TOWNS. I even didn't notice Uncharted Waters was released for FM TOWNS then. But, I was able to win a copy in Yahoo! Auction. I was looking forward to playing it.

But the problem was time. Once I start, I knew it was going to take time. I kept it on hold until this winter break. Then, finally after 30 years, I played Uncharted Waters on my FM TOWNS Emulator Tsugaru.

The file in the CD-ROM, VER.DAT indicated Ver 1.00 Rel 1.00, date was 1990 10.31. I have encountered at least four bugs during my play. I was able to patch three of them. The other one was not so critical, and I cannot re-produce it again. One of them was critical and if you encounter it you cannot continue and you need to start over from the beginning. The situation will be saved to the data file. Resetting and resuming from the save data does not help. Another one was less critical. It seemed that you could get around by resetting and loading from the previous save data. The rest two were something that should have been caught if someone play tested from the beginning to the end. Therefore, I am suspecting that nobody play-tested FM TOWNS version Uncharted Waters from the beginning to the end before the release. I am still wondering if KOEI released a fixed version later.

Unfortunately there is no Uncharted Waters English translation of FM TOWNS version. So, unless you can read Japanese, there is a language barrier to play FM TOWNS version of Uncharted Waters. But, if you are interested, it is available for Windows, Android, and iOS. It is a great game. I finished FM TOWNS version, but I'm thinking to try Windows version eventually as well.

Contents

World Map of Uncharted Waters for FM TOWNS

In this game, you will be asked to find a treasure buried somewhere in the world. But, unless you have a world-map, it is virtually impossible to find one. I initially started building my map using my Retro Map Tool. But, the scale of the map is much bigger than of an 8-bit game. Also, since I had to be always on the water, I couldn't fill in-land part of the map. So, I ripped the map data based on the disassembly, matched the map code with the partially-completed map, and filled the void.

By the way (*) after the port name means it is a supply-only port. No business.


World Map with Ocean Current and Port Names

Without Ocean Current and Port Names

Findings

Fully Playable with Compatible ROMs

Most importantly, I have confirmed that the game is playable from the beginning to the end with the newest version of the Compatible ROMs. If you own an original copy of CD and floppy disk, you can legally play it on the emulator, even if you don't own an actual FM TOWNS hardware. You need a floppy-disk image, but the disk is not copy protected. You can make it straight using a disk-imaging tool, or if you are able to extract files in the floppy disk, you can write them to an empty disk image, and you are good to go.

A Bug that Makes the Game Unplayable

During my first play-through attempt, somehow pirates stopped appearing. I could not build up my battle-experience points. I gave up and started the second play-through attempt. Then, after I defeated Admiral Emilio's fleet, the program started crashing. I did reset and restarted from save data, but the program crashed again and again. I ended up writing a patch to prevent this crash. I write up details below.

A Bug that Requires You to Reset

When you build up your rank, and close to the ending, the program freezes and stops responding to mouse clicks, although the BGM still keeps playing. This one, you seem to be able to get around by resetting and resuming from the previous save data. I write up details below as well.

You need to Save, Reset, and Load after the Final Fleet Battle

I haven't figured why it is needed, (I figured. I patched it.) but after the final fleet battle, the program will freeze if you report to the King right away. You will need to save, reset, and load, and continue.

Actually, the picture is corrupted when you win the final fleet battle and rescue the princess. This graphics corruption is confirmed on the actual FM TOWNS II MX hardware. Therefore it looks to be another bug of Uncharted Waters for FM TOWNS. (Confirmed it was a bug, and I patched it.)

Stack Overflow Bug

During the first play-through attempt, I defeated a pirate Singleton's fleet, then I could not find any more pirates. I wanted to build up battle experience point, but I couldn't. I gave up the first play-through attempt, and started over my second attempt. Then, the King ordered me to defeat Admiral Emilio. I did it, then the program started crashing. I first thought it was a problem of the Compatible ROMs. But, Tsugaru debugger indicated that the program was shooting INT 20H to abort the program. Further investigation concluded that the program destroyed its own code due to stack overflow, and the stack overflow was caused by the infinite recursion.

Was it a Tsugaru's CPU core? Or, Tsugaru's device emulation? Or, was it a bug of Uncharted Waters for FM TOWNS? I decided to look into deeper.

I was easily able to find the function that was causing infinite recursion with the call stack. Then I stopped at the function, and was able to see what the program was doing before this function. One thing I noticed was that the program was making 36(24h) times 72(48h) world map. Lattitude for X axis and longitude for Y axis. FEh is water, and FFh was land.

DS:009883C was this world map. By replacing FEh with .. in the dump, you can clearly see the world map (left and right reversed). Also, after each level of recursion, distance from certain point was written in the map. This was a typical pattern of path-finding. 00h was the start of the search, and FDh was the goal.

            
FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF FF .. FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF FF FF FF FF FF FF FF FF .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF FF FF FF FF FF FF FF FF FF FF FF .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF| FF FF FF FF FF FF FF FF FF FF FF .. .. .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. FF FF FF FF FF FF FF FF .. FF FF .. .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF .. .. FF FF FF FF FF FF FF FF .. .. .. FF FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. .. .. FF FF .. FF FF FF FF FF FF .. .. .. FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF .. FF FF FF .. FF FF FF FF .. .. .. FF .. .. FF FF .. FF FF FF FF .. .. .. .. .. .. .. .. .. .. FF| FF .. .. FF .. FF .. .. FF .. .. .. .. .. .. .. .. FF FF FF .. .. FF FF FF .. .. .. .. .. .. .. .. .. .. FF| FF .. .. .. .. FF .. FF FF .. .. .. .. .. .. .. .. FF FF FF .. .. FF .. FF FF FF FF .. .. .. .. .. .. .. FF| FF .. .. .. .. .. FF FF .. .. .. .. .. .. .. .. .. .. FF FF .. FF .. FF FF FF FF FF FF FF FF FF .. FF .. FF| FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. .. .. FF FF FF FF FF FF FF FF .. FF .. FF| FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. FF FF FF FF FF FF FF FF FF .. .. .. .. .. FF| FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF FF FF FF FF FF .. .. .. .. .. .. FF| FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF FF FF FF .. .. .. .. .. .. .. .. FF| FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. FF| FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF FF FF .. .. .. 04 04 04 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF FF .. .. 03 03 03 03 03 03 03 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF .. .. .. .. FF FF| FF .. .. .. .. 03 02 02 02 02 02 03 .. .. FF .. FF .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. .. .. FF FF| FF .. .. .. .. 03 02 01 01 01 02 03 .. FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. .. FF FF .. .. .. FF FF| FF .. .. .. .. 03 02 01 00 FF FF 03 FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. .. 03 02 01 FF FF FD .. FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. .. 03 FF 02 FF .. .. FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF .. FF FF FF .. .. FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. FF .. .. FF FF .. .. .. .. FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. FF .. .. FF FF .. .. .. .. FF FF FF .. FF FF FF FF FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. FF| FF .. .. FF FF .. FF FF .. .. .. .. .. .. .. .. FF FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. FF| FF .. .. .. FF FF FF FF .. .. .. FF FF FF FF .. .. FF FF FF FF FF FF FF .. FF FF FF .. .. .. .. .. .. FF FF| FF .. .. .. FF FF FF FF .. .. FF FF .. .. FF FF FF .. .. FF FF FF FF FF .. FF FF .. .. .. .. .. .. .. FF FF| FF .. .. .. FF FF FF .. FF FF FF FF FF FF .. .. FF FF FF .. FF FF FF FF .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF FF .. FF FF FF FF FF FF FF FF FF .. FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF .. .. FF FF .. FF FF FF FF FF FF FF FF FF .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF FF .. .. FF FF FF FF FF FF FF FF FF .. FF FF .. .. FF .. .. .. FF FF .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF FF FF FF FF FF FF FF FF .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF .. .. FF .. .. FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. .. FF .. FF .. FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF .. FF FF| FF .. .. .. FF FF FF FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF FF FF FF FF FF FF FF FF .. FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. .. FF FF FF FF FF FF FF FF .. .. .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. .. FF FF FF FF FF FF FF FF FF FF FF .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF| FF .. FF FF FF FF FF FF FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. FF FF FF FF FF FF FF FF .. .. FF .. FF FF FF FF FF .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. FF FF FF FF FF FF FF .. FF FF .. FF .. .. FF .. .. .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. FF FF FF FF FF FF FF .. FF .. FF FF .. .. .. .. .. FF FF .. .. .. .. .. FF FF FF FF .. .. .. .. FF| FF .. FF FF FF FF FF FF FF .. .. FF .. FF .. .. .. FF FF .. FF .. FF .. .. .. FF FF FF FF FF .. .. .. .. FF| FF .. .. FF FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. FF .. .. .. .. .. .. FF FF FF FF FF .. .. .. .. FF| FF .. .. FF FF FF FF FF FF FF FF .. FF .. .. .. .. .. .. .. .. FF .. .. .. FF FF FF FF FF .. .. .. .. .. FF| FF .. .. FF FF FF FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. FF FF FF FF FF FF .. .. .. .. FF| FF .. .. FF FF FF FF FF FF .. FF FF .. .. .. .. .. .. .. .. .. .. FF FF .. .. FF FF FF FF FF .. .. .. .. FF| FF .. .. FF FF .. FF FF .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. FF .. FF FF FF FF FF FF .. .. .. .. FF| FF .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF .. .. FF FF FF FF FF FF .. .. .. FF| FF .. .. FF FF .. .. .. .. .. .. .. .. .. .. FF FF .. .. .. .. .. .. .. .. .. .. FF FF FF FF FF FF .. .. FF| FF FF .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF FF .. .. .. .. FF| FF .. .. FF FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF .. FF| FF .. .. FF FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF FF .. .. FF| FF .. .. FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF FF .. .. FF| FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF| FF .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. FF|

Actually, the executable MAIN.EXP still retained the symbol table for debugging. So, I modified Tsugaru's debugger so that it can import the symbol table from .EXP executable file. This revealed that the function that is causing infinite recursion was called SAITAN. Shortest in Japanese. Confirmation that this was a path-finding function.

SAITAN function takes longitude and lattitude as input parameters. When it crashes, longitude was 47h, but latitude was F5h. The range of lattitude was 00h to 23h. F5h exceeds the range by large. Therefore, the goal marker FDh was not written in the world map, and the function was searching for the goal marker indefinitely, and ended up with making infinite recursion.

Based on the disassembly around this function, there are two relevant arrays of structures. I call them Fleet structure, and Path structure. The first two bytes of a Fleet structure was longitude and lattitude, and the next two bytes were position on the screen. By the way, the first of the Fleet-structure array was the player's fleet. There are 20 COM fleets. Since the player fleet does not require the path, the length of the Path-structure array is shorter than the Fleet-structure array by 1.

          
0D90h~ 27 bytes each 21 Fleet structures (KANTAIK in the symbol table) 02F4h~ 53 bytes each 20 Path structures (CKANTAI in the symbol table)

Latitude and Longitude of the Fleet structure seemed to be copied from somewhere in the Path structure. I was able to pin-point where (47h,F5h) was coming from.

          
DS:000006E3 16 1F 08 0B 04 33 00 F8 06 00 00 08 FE 07 FD 06 FC 05 FB 04 FA 03 F9 02 F8 01 F7 00 F6 47 F5 FF FF FF FF FF FF FF ^^^^^

After loading the machine state immediately after defeating Admiral Emilio's fleet, longitude 00h, latitude FFh was copied to one of the Fleet structures. The source of the coordinate was computed in function called SET_KOURO (set navigation path). Actually, SAITAN function was called from inside of SET_KOURO, but this time it did not crash. Apparently the output from SET_KOURO is an array of integers from DS:22418h, vectors (vx,vy) for incrementally update fleet's coordinate. If the coordinate started from (00h,FFh) it can reach (47h,F5h). Also the expected coordinates calculated by adding (vx,vy)s were stored in the Path structure.

Where was this FFh coming from? Actually, I felt very strange when I saw the dump of Path-structure array. Structure +7 seemed to be a pointer to one of its own vectors. When a fleet moves, next coordinate is read from this pointer, and the pointer was incremented. But, the Path structure for the fleet that causes a problem had a pointer that was pointing outside of its own territory. I also checked with other machine-states, I even saw one of the pointers pointing to 00000034h, which was even outside of the path-structure array. It looked to be the destruction of this pointer was the culprit.

            
DS:000002F4 20 08 03 0C 04 00 00 07 03 00 00 23 09 22 0A 21 0B 20 0B 1F 0A 1F 09 20 08 FF 0B 1F 0A 1F 09 FF FF FF FF (All FF omitted) DS:00000329 24 08 0B 00 04 00 00 34 03 00 00 FF 09 1F 0A 20 0B 21 0A 22 09 23 09 24 08 FF 0B 1F 0A 1F 09 FF FF FF FF (All FF omitted) DS:0000035E 24 08 0B 00 02 04 01 69 03 00 00 FF 09 1F 0A 20 0B 21 0A 22 09 23 09 24 08 FF 0B 1F 0A 1F 09 FF FF FF FF (All FF omitted) DS:00000393 11 12 0B 01 00 10 00 9E 03 00 00 FF 12 FF 10 13 10 12 11 11 12 FF 0A 19 0B 18 0C 17 0D 16 0E FF FF FF FF (All FF omitted) DS:000003C8 11 12 0B 01 00 10 00 D3 03 00 00 FF 12 FF 0A 19 0B 18 0C 17 0D 16 0E 15 0F 14 10 13 10 12 11 FF FF FF FF (All FF omitted) DS:000003FD 28 09 05 0A 04 01 00 08 04 00 00 FF 0A 22 09 23 09 24 08 25 08 26 08 27 08 28 09 FF 08 18 07 FF FF FF FF (All FF omitted) DS:00000432 20 0A 06 05 04 01 00 45 04 00 00 27 08 26 09 25 08 24 09 23 0A 22 09 21 0A 20 0A FF 08 18 07 FF FF FF FF (All FF omitted) DS:00000467 28 09 05 0A 04 01 00 72 04 00 00 FF 0A 22 09 23 09 24 08 25 08 26 08 27 08 28 09 FF 08 18 07 FF FF FF FF (All FF omitted) DS:0000049C 11 12 0B 01 00 10 00 A7 04 00 00 FF 12 FF 10 13 10 12 11 11 12 FF 0A 19 0B 18 0C 17 0D 16 0E FF FF FF FF (All FF omitted) DS:000004D1 11 12 0B 01 00 10 00 DC 04 00 00 11 12 FF 0B 17 0C 16 0D 15 0E 14 0F 13 10 12 11 11 12 FF 11 FF FF FF FF (All FF omitted) DS:00000506 26 09 0B 02 04 02 00 19 05 00 00 22 09 23 09 24 08 25 08 26 09 FF 08 25 08 26 09 FF 0E 1E 0D FF FF FF FF (All FF omitted) DS:0000053B 26 09 0B 02 04 02 00 50 05 00 00 22 09 23 09 24 08 25 08 26 09 FF 08 25 08 26 09 FF 0E 1E 0D FF FF FF FF (All FF omitted) DS:00000570 26 09 0B 02 04 02 00 7D 05 00 00 25 08 26 09 FF 09 FF 09 23 09 24 08 25 08 26 09 FF 0E 1E 0D FF FF FF FF (All FF omitted) DS:000005A5 11 12 0B 01 00 11 00 B0 05 00 00 FF 12 FF 09 19 0A 18 0B 17 0C 16 0D 15 0E 14 0F 13 10 12 11 FF FF FF FF (All FF omitted) DS:000005DA 37 10 06 08 00 12 00 E5 05 00 00 FF 13 37 12 38 11 37 10 FF 14 31 13 32 12 33 11 34 12 35 13 FF FF FF FF (All FF omitted) DS:0000060F 11 12 0B 01 04 32 00 1A 06 00 00 FF 0A 18 0B 17 0C 16 0D 15 0E 14 0F 13 10 12 11 11 12 FF 09 FF FF FF FF (All FF omitted) DS:00000644 11 12 0B 01 04 32 00 4F 06 00 00 FF 0A 18 0B 17 0C 16 0D 15 0E 14 0F 13 10 12 11 11 12 FF 09 FF FF FF FF (All FF omitted) DS:00000679 37 10 06 08 04 34 00 84 06 00 00 FF 13 32 12 33 11 34 12 35 13 36 13 37 12 38 11 37 10 FF 14 FF FF FF FF (All FF omitted) DS:000006AE 37 10 06 08 04 34 00 B9 06 00 00 FF 13 36 13 37 12 38 11 37 10 FF 11 32 12 31 13 30 14 2F 15 FF FF FF FF (All FF omitted) DS:000006E3 24 08 02 0A 04 33 00 FA 02 00 00 21 0A 22 09 23 09 24 08 FF 10 1C 0F 1D 0E 1E 0D 1F 0C 20 0B FF FF FF FF (All FF omitted) ^^^^^^^^^^^

If the Path structure +7 was a pointer, I expected that the pointer should be re-calculated after loading the data. I set break-on-memory-write to one of the vectors, and resumed from one of the save data. Surprisingly, DMA was writing to the pointer, but nothing else. The program was fread- and write-ing the pointer! It is a big NO in the modern programming. You cannot expect where the operating system will put the array. Memory layout may change from execution to execution. But, FM TOWNS version Uncharted Waters was doing it. Well, it was written in 1991 (I believe) after all :-P

However, then I could see if the pointers were destroyed in the save data from actual FM TOWNS hardware. Since the disk I got from Yahoo! Auction already had some save data, I loaded them and checked the pointers.

            
DS:000002F4 13 11 07 09 02 19 00 09 03 00 00 1F 07 1E 06 1D 07 1C 08 1B 09 1A 0A 19 0B 18 0C 17 0D 16 0E FF FF FF FF FF FF DS:00000329 20 08 03 0C 04 00 00 38 03 00 00 14 10 15 0F 16 0E 17 0D 18 0C 19 0B 1A 0A 1B 09 1C 08 1D 07 FF FF FF FF FF FF DS:0000035E 13 11 07 09 02 19 00 6D 03 00 00 15 0F 14 10 13 11 FF 08 1B 09 1A 0A 19 0B 18 0C 17 0D 16 0E FF FF FF FF FF FF DS:00000393 16 0D FF FF 00 11 00 A2 03 00 00 13 10 14 0F 15 0E 16 0D FF 12 FF 10 FF 0C 18 0B 17 0C FF 0B FF FF FF FF FF FF DS:000003C8 16 1F 08 0B 00 14 00 D3 03 00 00 FF 18 1C 19 1B 1A 1A 1B 19 1C 18 1D 17 1E 16 1F FF 09 FF 0B FF FF FF FF FF FF DS:000003FD 26 0B 06 07 04 01 00 68 02 00 00 21 0A 22 09 23 09 24 09 25 0A 26 0B FF 0E 1D 0D 1E 0C 1F 0B FF FF FF FF FF FF ^^^^^^^^^^^ DS:00000432 26 0B 06 07 04 01 00 D2 02 00 00 21 0A 22 09 23 09 24 09 25 0A 26 0B FF 0A 19 09 1A 08 1B 07 FF FF FF FF FF FF ^^^^^^^^^^^ DS:00000467 26 0B 06 07 04 01 00 78 02 00 00 21 0A 22 09 23 09 24 09 25 0A 26 0B FF 0A 19 09 1A 08 1B 07 FF FF FF FF FF FF ^^^^^^^^^^^ DS:0000049C 22 06 03 0C 00 00 00 B1 04 00 00 1E 04 1F 03 20 04 21 05 22 06 FF 07 1C 06 1D 05 1E 06 1F 07 FF FF FF FF FF FF DS:000004D1 20 08 02 09 04 01 00 84 00 00 00 FF 09 FF 07 1E 08 1F 09 FF 08 20 09 FF 07 20 08 FF 06 1E 07 FF FF FF FF FF FF ^^^^^^^^^^^ DS:00000506 22 07 05 0A 04 02 00 18 01 00 00 25 08 24 09 23 0A 22 09 21 0A 20 0B 1F 0A 1E 09 1F 08 20 07 FF FF FF FF FF FF ^^^^^^^^^^^ DS:0000053B 22 07 05 0A 04 02 00 F2 00 00 00 FF 06 22 07 FF 0A 22 09 21 0A 20 0B 1F 0A 1E 09 1F 08 20 07 FF FF FF FF FF FF ^^^^^^^^^^^ DS:00000570 21 0A 0A 06 02 07 00 81 05 00 00 25 08 24 09 23 0A 22 09 21 0A FF 09 FF 0E 1E 0D 1F 0C 20 0B FF FF FF FF FF FF DS:000005A5 16 0D FF FF 00 11 00 B2 05 00 00 14 0F 15 0E 16 0D FF 12 FF 0F 13 10 FF 09 19 0A 18 0B 17 0C FF FF FF FF FF FF DS:000005DA 26 0A 06 05 04 02 00 2A 01 00 00 FF 0A FF 09 23 09 24 08 25 08 26 09 FF 0E 1E 0D 1F 0C 20 0B FF FF FF FF FF FF ^^^^^^^^^^^ DS:0000060F 22 07 05 0A 04 32 00 A2 00 00 00 FF 07 1D 06 1E 05 1F 04 20 05 21 06 22 07 FF 0A 1A 09 1B 08 FF FF FF FF FF FF ^^^^^^^^^^^ DS:00000644 22 05 09 0C 00 00 00 59 06 00 00 14 0F 15 0E 16 0D 17 0C 18 0B 19 0A 1A 09 1B 08 1C 07 1D 06 FF FF FF FF FF FF DS:00000679 22 06 03 09 00 00 00 88 06 00 00 38 11 37 12 36 13 35 13 34 12 33 11 32 12 31 13 30 14 2F 15 FF FF FF FF FF FF DS:000006AE 22 05 06 04 00 00 00 BB 06 00 00 35 13 34 12 33 11 32 12 31 13 30 14 2F 15 2E 16 2D 17 2C 18 FF FF FF FF FF FF DS:000006E3 22 05 05 05 00 00 00 F0 06 00 00 17 1E 18 1D 19 1C 19 1B 1A 1A 1A 19 1A 18 1B 17 1B 16 1B 15 FF FF FF FF FF FF

The pointers were destroyed even played on the actual hardware. At that point, I was 99% convinced that it was not the bug of Tsugaru. I was 99% certain it was a bug of Uncharted Waters for FM TOWNS.

Then, where is this pointer destroyed? Again, I set break-on-memory-write and resumed from the machine state immediately after the battle with Admiral Emilio. Then, after the victory before going back to the ocean, the pointer was NULLified. The function doing it was not in the symbol table, but apparently this was the function to erase a COM fleet. And, nothing was written to this pointer until the pointer was used next.

Where is this NULL pointer was de-referenced? It was also very easy to find the location with the debugger. The call stack of when the NULL pointer was de-referenced was as follows.

            
FR=000C:00056AC2 TO=000C:000298E0 RET=000C:00056AC7{MAIN ()} FR=000C:0002999D TO=000C:0003A1BC RET=000C:000299A2{MAITUKI_MAIN ()} FR=000C:0003A1C1 TO=000C:00039D80 RET=000C:0003A1C6{KAKKOKU ()} FR=000C:00039DB7 TO=000C:00039600 RET=000C:00039DBC{KAIJI ()} FR=000C:0003960C TO=000C:000393D4 RET=000C:00039611{MAKE_KAIZOKU ()} FR=000C:0003944A TO=000C:00038C40 RET=000C:0003944F{MAKE_SENTYOU ()}

MAKE_KAIZOKU! KAIZOKU is Pirates in Japanese! I carefully read disassembly around this function, but nowhere was the pointer reset. The pointer was de-referenced and then incremented by two. Since the pointer started from NULL, or zero, broken pointers were before the beginning of the first Path structure, which was in 02F4h.

When the coordinate of a COM fleet was set to (00h,FFh)? After the pointer was nullified, the program was reading from this pointer two bytes at a time. Therefore, the pointer was pointing to an even address always. Every time, a COM fleet was jumping around the world. If no byte at even address was FFh, which seemed to be the terminator, the pointer eventually reached 02FEh. However, the first path of the Path structure for the first COM fleet was at 02FFh. Unfortunately, the first coordinate of the first Path structure was (FFh,00h). This FFh was supposed to mean the goal of the path for the first COM fleet. But, it was taken as the latitude since the pointer was one byte before this FFh. This was how the COM fleet coordinate was reset to (00h,FFh), leading to the infinite recursion. Eventually the pointer was reset, if the program was lucky enough to avoid infinite recursion. But, the fleet was already out of the world. Too late to come back to meet the player's fleet.

This problem could be fixed by the following easy patch.

            
Before 000C:000488E2 C7470700000000 MOV DWORD PTR [EDI+07H],00000000H After 000C:000488E2 8B7F07 MOV EDI,[EDI+07H] 000C:000488E5 C607FF MOV BYTE PTR [EDI],FFH 000C:000488E8 90 NOP

In Tsugaru, if you start the CUI program with -APP DAIKOUKAI or select "DAIKOUKAIJIDAI" in the Application-Specific Support list in the GUI, the program will apply this patch when mouse-bios is initialized.

This patch was confirmed to work by my 4th play-through attempt.

Freeze Near Ending

You build up your rank, and you are close to the ending, and then the program may suddenly freeze. BGM keeps playing, but the program becomes unresponsive to your mouse clicks.

Debugger told that the program did not come out of a function called IBENTO_MAIN (Event Main). Strictly-speaking, it was function 000C:0002CD44 called from IBENTO_MAIN, but this function was not in the symbol table.

This function is called 1 in 20 chance per day. In the function, it sets up a random event (or a mission).

In one of the events, function 000C:0002CD44 was called for picking a random person who is not travelling with the player fleet, and flag 02h is clear. But, no person matched this condition. The program was re-creating a random number and check if the person matched the condition, but nobody matched, and therefore it was looping indefinitely.

During the 3rd and 4th play-through, I kept a break point at 000C:0002CD44. And, apparently this function was called for setting up a treasure-hunting mission. In a treasure-hunting mission, the player need to meet at least 3 persons to know where the treasure is. 000C:0002CD44 was used for the 3 persons.

I initially suspected it was due to incomplete emulation by Tsugaru's CPU core, but now I am 99% certain it was another bug of FM TOWNS Uncharted Waters. It was written in early 1991. Debugging methodology was very primitive, or virtually didn't exist after all.

There is a possibility that the above patch to prevent stack-overflow enabled this bug. Due to the destruction of the pointer, some fleets start traveling outside of the world. Then, maybe a person will never be killed, or somehow preserved in the state that can be selected by 000C:0002CD44. But, the stack-overflow bug makes it impossible to continue the game play. The stack-overflow bug was more serious. This freeze problem was, you may be able to get away by resetting and resuming from the last saved state. This function will not freeze unless a treasure-hunting mission was selected in the function called roughly once every 20 days. Just save often, and resume from the last-save data when the program froze.

Also, during an event, no new quest is created. If you start from a save data, and if you get a new order from the king, you are safe until you complete it.

I wanted to patch it as well. I know what to do to patch it, but I couldn't find bytes to insert the patch. I haven't been able to solve this problem yet. It is possible to block treasure-hunting all together, but treasure-hunting missions are fun. I don't want to block it.

Also, looks like if you are not hostile to other countries (not to flip other countries' allied ports and not attack other countries' fleets), and mainly target pirates, I didn't encounter this problem.

Fleet Travels like a Rocket

One of the very bad programming in the FM TOWNS Uncharted Water was the timing with busy wait. The program is not CPU intensive at all. It needs some wait after every time step, or the program runs too fast. So the program uses the following function to slow down.

            
XWAIT 000C:00025CE4 8B542404 MOV EDX,[ESP+04H] 000C:00025CE8 2BC9 SUB ECX,ECX 000C:00025CEA 3BD1 CMP EDX,ECX 000C:00025CEC 7610 JBE 00025CFE 000C:00025CEE 2BC0 SUB EAX,EAX 000C:00025CF0 81F8581B0000 CMP EAX,00001B58H 000C:00025CF6 7303 JAE 00025CFB 000C:00025CF8 40 INC EAX 000C:00025CF9 EBF5 JMP 00025CF0 000C:00025CFB 41 INC ECX 000C:00025CFC EBEC JMP 00025CEA 000C:00025CFE C3 RET

Probably it was written in C like:

>
            
void XWAIT(unsigned int counter) { int i,j; for(i=0; i<counter; ++i) { for(j=0; j<0x1B58; ++j) { } } }

There is another function for waiting longer, FIXWAIT, which probably was written in C like:

            
void FIXWAIT(unsigned int counter) { XWAIT(counter*6); }

Obviously, the duration the function will wait depends on the CPU speed. With 486DX 66MHz, the program runs too fast for a human to control. Again, in Tsugaru, I could patch it, and let XWAIT use I/O 6Ch (1us wait).

Another weird thing was, in each time step, the program was calling XWAIT function for the number of fleets docked in a port times. If all fleets were on the go, there was zero wait. So, if all COM fleet left the port, the player's fleet moved like a rocket. It took about a second from Lisbon to Virginia. Again, totally uncontrollable by a human.

This can be corrected by patching the main-loop and force it to call XWAIT for the constant times each time step. This makes day-passing after tavern or shipyard takes same time as 1 day on the ocean, but waiting for some seconds is not too bad compared to the ship blasts across Atlantic less than a second. I know the flag that indicates the player fleet is docked. If I am able to insert one more check in the patch, I can make day-passing at the port fast. But, I couldn't find bytes for the check.

This patch is also enabled by -APP DAIKOUKAIJIDAI or select DAIKOUKAIJIDAI from the Application Specific Support in the GUI.

Usability Issue: Requiers Hundreds of Mouse Clicks for Loading Stuffs after Fleet-Battle Victory

This game had numerous usability issues, but one of the worst was hundreds of clicks after loading stuffs after fleet-battle victory. Actually, if you hold down mouse-left button on "Up" or "Down" button, it repeats. But, the interval was too long. You don't want to spend ten minutes after each fleet battle. You had to pound on your mouse button. It was not good for you finger muscle, and your mouse button. Actually, it was easy to find FIXWAIT function call after taking mouse button. I just NOPped it to make the repeat faster. This patch is also applied when Application Specific Support for DAIKOUKAIJIDAI is enabled in Tsugaru.

Picture Corrupts after Rescuing the Princess, and You need to Save, Reset, and Load after the Final Fleet Battle to see Ending.

After winning the final fleet battle and rescuing the princess, the picture corrupts. The same corrupted picture was confirmed using actual FM TOWNS II MX. Since it happens on the actual FM TOWNS hardware, most likely it was another bug of Uncharted Waters for FM TOWNS. Now I am suspecting nobody play-tested it before release.


Corrupted Graphics. It happens on actual FM TOWNS II MX, too.

But, I feel it's not done until I see the picture that I was supposed to see. The corrupted picture looks to have some stripes. It is a typical broken image when you draw a tightly-packed bitmap with a wrong width. I'm a programmer, why not fixing it by C++? I loaded the corrupted image, and shifted each row by N pixels. I gradually increased N, and I saw something meaningful when N=16.


Something meaningful

But, I still see some fault lines. How come? I am shifting 16 pixels for each Y, which is a very strong shear transformation. The fault lines are at X=0 in the source image. What kind of transformation error is it? My hand-written sketch below is how the broken image is sheared to become a meaningful image.


As a result of the shear, the bitmap is stretched long in the horizontal direction. But, by taking remainder of X by the bitmap width, X coordinate is forced within the bitmap width. And, the quotient will tell which segment the pixel is in. I need to shift each segment in the Y direction in the source coordinate. I changed my program so that I can control how many pixels to shift for each segment, and as soon as I shifted 1 pixel, the image was corrected. And, by making the first segment shifted by 3 pixels, the left edge of the picture came to the left edge of the bitmap. I thought about writing a patch for correcting the image, but I guess it is more complex than I thought. I'm just happy to be able to see the correct image.


Corrected.

The below code is the one I wrote for correcting the image.

            
#include <fssimplewindow.h> #include <ysbitmap.h> void Shear(YsBitmap &dst,const YsBitmap &src,int d) { // 1:16 dst=src; for(int xDst=0; xDst<dst.GetWidth(); ++xDst) { for(int yDst=0; yDst<dst.GetHeight(); ++yDst) { int xSrc=(xDst+yDst*16)%src.GetWidth(); int ySrc=yDst; int xSrcUB=(xDst+yDst*16); // UB:Unbounded int segment=(xSrcUB/src.GetWidth()+3); // Why 3? ySrc=(ySrc-segment*d); while(ySrc<0) { ySrc+=src.GetHeight(); } ySrc%=src.GetHeight(); auto srcPix=src.GetRGBAPixelPointer(xSrc,ySrc); auto dstPix=dst.GetEditableRGBAPixelPointer(xDst,yDst); dstPix[0]=srcPix[0]; dstPix[1]=srcPix[1]; dstPix[2]=srcPix[2]; } } auto toSave=dst; toSave.Invert(); FILE *fp=fopen("shear.png","wb"); toSave.SavePng(fp); fclose(fp); } int main(void) { YsBitmap bmp,src; bmp.LoadPng("CorruptedGraphics.png"); printf("%d %d\n",bmp.GetWidth(),bmp.GetHeight()); int wid=288; // By trial and error. int shift=0; src=bmp; int dy=1; int mx=100,my=100; Shear(bmp,src,dy); wid=bmp.GetWidth(); FsOpenWindow(0,0,1280,800,1); for(;;) { FsPollDevice(); auto key=FsInkey(); if(key==FSKEY_UP) { ++dy; Shear(bmp,src,dy); wid=bmp.GetWidth(); } else if(key==FSKEY_DOWN) { if(0<dy) { --dy; Shear(bmp,src,dy); wid=bmp.GetWidth(); } } else if(key==FSKEY_SPACE) { Shear(bmp,src,dy); wid=bmp.GetWidth(); } glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glRasterPos2i(0,799); glPixelZoom(4,4); glDrawPixels(bmp.GetWidth(),bmp.GetHeight(),GL_RGBA,GL_UNSIGNED_BYTE,bmp.GetRGBABitmapPointer()); FsSwapBuffers(); FsSleep(25); } return 0; }

Actually, after finding how to correct the graphics, I was able to patch the program as well. It was an extremely easy fix. The program was giving wrong width (in number of DWORDs) to the function that drew the image.

000C:00048D26 68DE010000 PUSH DWORD PTR 000001DEH [EBP+18h] 000C:00048D2B 68B0000000 PUSH DWORD PTR 000000B0H [EBP+14h] 000C:00048D30 6A22 PUSH DWORD PTR 22H [EBP+10h] 000C:00048D32 6A50 PUSH DWORD PTR 50H [EBP+0Ch] 000C:00048D34 68B8000000 PUSH DWORD PTR 000000B8H [EBP+8] 000C:00048D39 E8EECFFDFF CALL 00025D2C {XNUP ()}

PUSH DWORD PTR 22H needed to be PUSH DWORD PTR 20H. That was it. I've enabled this patch in Tsugaru as well if Application Specific Support for DAIKUOKAIJIDAI is enabled..

Also, after winning the final fleet battle, you need to save, reset, and load to see the ending. If you report to the king right away, the program cannot start the ending. Probably the image-corruption also destroyed some critical memory location.

Well, I once thought I pass this bug. Just save, reset, and load. But, it's a crash. It is relatively easy to find a crash bug than something supposed to happen is not happening. Why not looking into it? Here's what was happening. When the player meets with the King after the final fleet battle, the main program, MAIN.EXP exits, and then END.EXP is supposed to start. When the program failed to start END.EXP, MAIN.EXP was ending without stopping sound-BIOS service by calling SND_end() function. So, the sound interrupt was still enabled, and the control was given back to real-mode program KOEI.COM, and when the next sound interrupt is shot, it died.

Why the program ended without calling SND_end()? The program was trying to free all malloc-ed buffers. However, the program apparently destroyed heap, and the free function crashed. The function 000C:31624 was free-ing all buffers, and then MB_RESET function was supposed to be called next, in which SND_end() was called. So, it's the end of the program anyway. How about not freeing buffers? I just NOPped 000C:3138F CALL 31624h. Then, it worked. With this patch, you don't have to save, reset, and load after the final fleet battle. You can just go straight to King to see the ending. I have also included this patch in Tsugaru. At the time I am writing, it is not in the release, but will be eventually included.

  
In END_MAIN function 000C:0003183F E8E0FDFFFF CALL 00031624 { ()} 000C:00031844 E87348FFFF CALL 000260BC {MB_RESET ()} 000C:00031849 83C41C ADD ESP,1CH 000C:0003184C C3 RET

Did anyone play tested Uncharted Waters for FM TOWNS before releasing? If someone played all the way, this corrupted-picture bug should have been caught. Probably nobody play tested it. It was unfortunate. The BGM is fantastic. The very nice plot. It is a great game. But, the programming quality was like a student-written program.

Was it a bug? Ocean Current never flows to the South, Southwest, West, and Northwest

The following function returns the ocean-current direction.

            
TYOURYU 000C:00028918 0FB6053D250000 MOVZX EAX,BYTE PTR [0000253DH] 000C:0002891F C1E806 SHR EAX,06H 000C:00028922 2407 AND AL,07H 000C:00028924 C3 RET ; Return ([253DH]>>6)&7()

The direction is calculated by taking DS:[253Dh], shifting it 6 times to the right, and taking bitwise-AND with 7. Since a byte is shifted 6 times to the right, only top-most 2 bits remains. Therefore, the direction can only be 0,1,2, or 3. 0 means north, and goes clockwise. The ocean current will never flow to the south, southwest, west, and northwest. It was confirmed by my memo on the Retro Map Tool. Was it intentional? Was it a bug? I cannot tell.

Usability Issue

The program had a usability issue. Especially, it was a excruciating pain to change directions on the ocean. You need to open direction dialog, and click left and right to change the direction. No keyboard shortcut. Also, to trade goods, you need to click on the keypad dialog. No keyboard shortcut either. Also moving the cursor to Yes/No dialog from time to time was extremely painful. The game itself was fantastic, but the user interface was extremely disappointing.

So, how about adding keyboard shortcuts? On the emulator, if I am able to locate button position, I can virtually move mouse to the location and virtually click it on some key strokes. Menu buttons on the ocean and direction dialog were fixed, so no issue. Keypad dialog, Yes/No dialog can be moved, so I needed to know the location of the dialog. I located them using the debugger. I didn't need it, but I also found a location of the shop dialog.

            
DWORD [0001F098H] Y/N dialog X (low 3 bits are ignored) DWORD [0001F09CH] Y/N dialog Y DWORD [0001F0ACH] Keypad dialog X (low 3 bits are ignored) DWORD [0001F0B0H] Keypad dialog Y DWORD [0001F4F8h] Shop dialog X (low 3 bits are ignored) DWORD [0001F4FCh] Shop dialog Y

The physical address is cached when mouse BIOS is initialized, and Tsugaru will send virtual mouse move and mouse click to the VM on specific key strokes. (Printed on the console window when enabled.) This feature is enabled when Tsugaru is started with Application Specific Support for DAIKOUKAIJIDAI is enabled.

Play Diary

2022/01/14

I had to ditch my first two attempts to play-through Uncharted Waters, first one probably due to the Uncharted Waters's bug, and the second 100% due to Uncharted Waters's bug. I was able to play through all the way the third time, but since I was flipping Spanish ports to Portugees, my fleet was attacked by both Pirates and Spanish fleets, which I didn't want to start a Portugal-Spain war. The fourth time I was determined to keep good relation with Spain and Osman Empires. This time, my goal was to make sure I can play through from the beginning to the end with Tsugaru's Application Specific Support enabled (with all the patches).

Player's name is Cessna. Flagship name was Provider taken from C-123 Cargo airplane. Player's initial status was as follows.

            Leadership     70
            Judgement      71
            Intelligence   70
            Courage        71
            Toughness      70
          

First fully-loaded with Sugar from Lisbon and sold all at Bordeaux. Then loaded with Ceramics and returned to Lisbon to sell. Repeated it a few times. I saw Fernando and Marco at the tavern, but they didn't join my fleet.

After a few round trips between Lisbon and Bordeaux, my navigation level was 3. Marco joined my fleet.

Then headed for London with fully loaded with Sugar. I can do the same Sugar and Ceramic trade between Lisbon and London, too. One ship cannot make much money per round trip, so purchased a new ship. Brigantine class, ship name is Skytrain, taken fron C-47 Cargon Airplane.

I saw Fernando, Fasco, Solis, and Jorge, but none of them agreed to join my fleet.

After buying Ceramics too much, prices at Bordeaux went too much high. I just sold Sugar at Bordeaux, but didn't buy Ceramics a few times.

Still Fernando does not join my fleet. I hired Jorge instead, and added another ship, Brigantine class, named Grayhound taken from C-2 Cargo Airplane. Pirates nearby, but I cannot fight at this time since my ships were not armed with cannons yet. Just stay away.

Invested money and made Bordeaux allied with Portugal. Fame point became 45. Made London my ally, and fame point 919. Someone was looking for me at Napoli.

Fully loaded with sugar, headed for Napoli, then, instead of getting an order, Portugees King summoned me. Order of Wool 36 units. Nearby supply port was London. Easy mission. I was rewarded with 2000 gold coins and Sir rank.

The price in London was sky-high. Could make good profit by selling Lisbon Sugar there.

Made Hamburg my ally, and the fame point 1309. Then someone was calling at Istanbul. Order of Coral. I need to go St. Domingo across the Atlantic. I don't think Brigatine class ship was no good to cross Atlantic. Sold all ships with purchased two used Karak-class ships, named Starlifter from C-141 Cargo airplane, and Hercules from C-130 Cargo airplane.

I have loaded with Weapons purchased at 61 gold coins per unit at Lisbon. At St. Doming, 1 unit was sold at 171 gold coins. 110 gold coins profit per unit! With that money, purchased 250 units of Corals and headed back to Europe.

Delivered Corals and fame point 1524. By selling left over Corals, I made Mallorca, Tunis, Napoli, and Pisa my allies. Fame point 2808. Hired Buonarroti at Marseille. Made Marseille and Algiers my allies and my fame point 3423.

Then summon from my King. Order of Corals 27 units. Piece of cake. Added a Karak-class ship named Stratotanker from KC-135 Tanker airplane. Made Oslo my ally and fame point 3709. Hired Nicolas at Antwerp.

Completed the trans-Atlantic trip. Rewarded with 4000 gold coins, and rank of Low(?) Chevalier.

Immediately had another order from the King. Order of Ivory 29 units. Need to go to St. Georges.

Made Algin my ally on the way, and my fame point 3840. Purchased Gold 30 units and Ivory 160 units and returned. Rewarded with some coins (probably about 10000?) and rank of Chevalier.

Sold left over gold and ivory at Algiers.

Next, headed for African ports. Made Sofala and Mozambique my allies and my fame point 4021. I wanted to stay there a while to make more allied ports. Looks like I can buy Ivory at Mombasa and sell at Mecca, buy Grain at Mecca and sell at Mombasa to stay alive quite long.

Hired Bambora at Monbasa. Well, intelligence level was 10. Too low. I just let him travel with my fleet.

Made Mombasa, Div (maybe Karachi), Goa , Calcutta, and Kochi, allies and my fame point 5004. Ceylon(?) allied and 5113. Probably about time to be summoned by the king.

Someone in Valencia was calling. Headed back to Europe.

Order of 24 units of crystals. Another round trip to Mombasa. I didn't want to waste a trip. I also made Sumatra, Java, Ternate, Amboina, allies, and my fame point 5424. Delivered crystals to Valencia and my fame point up to 5649.

Then another order from Oslo.

Crystal again! 24 units. I had enough money to build a new ship. Karak-class ship named Galaxy, taken from C-5 Cargo airplane.

Made another round trip to Mombasa and my fame point up 5894.

Then, built another Karak-class named Osprey from CV-22 Cargo aircraft. And headed for far east.

Close encounter with pirates. I guess about time to arm my ships. Made Malacca, Macao, and Nagasaki allies. Fame point 6726.

King's summon! New order was to deliver a secret letter to Osman Empire. Easy mission.

Rewarded with rank of Lesser(?) Baron. Someone in Panama was calling me. Travelled all the way to Panama, but actually was called back to Hamburg. (Later I learned from disassembly that a quest or a mission is re-created by 1 in 20 chance every day. If it takes too long to get to the port, the quest may be changed already. If the King summons, the quest is fixed until meeting with the king.)

Actual quest was from Antwerp. Treasure-hunting. Saint Knight's Shield? Looks like Amerix at Mallorca knows about it. Then, Amerix heard about it from Rosanna at Panama. Went all the way. Rosanna heared from Miguel at Algiers. After a few negotiations, Miguel sold the map for 400 gold coins.

Found it. Fame point was up to 8575.

Then order from Napoli. Pimiento 92 units. Bought from Hormuz and delivered. Fame point 8800.

Next mission was to from Seville. Kill Pirate Singleton. About time!

It was December 1506.

Singleton was heading for Nova Granada. Went there at full speed, but could not intercept. Returned to Lisbon.

Instead, I have killed other pirates fleets. Then Singleton left the port to retaliate me. I only needed to wait.

I waited offshore Seville and intercepted Singleton! Battle of Seville. Actually what's interesting in this game is the initial location in the fleet-battle mode depends on the location on the ocean map. If I enter the fleet-battle mode from the behind of the enemy fleet, I can start the battle with significant advantage. If I am lucky enough, I can attack the enemy ship from the behind in the first turn. But, if I am caught up by the enemy fleet and started from the same map block, it will be chaotic. I can beat the enemy but will sustain big damage. So, I need to maneuver my fleet to take behind the enemy. The battle begins before entering the fleet-battle mode. Very strategic and fun aspect of this game. I took a advantage position and was an easy victory. Fame point up to 11220. My #4 ship almost sank, but maybe it was due to low battle experience.

To prepare for more fleet battles, built a new Galleon-class flagship named Concorde! Wanted to repair other ships and hire sailors in Lisbon, but Pirate El Drago came after me as soon as I left Seville. I returned to Seville, and did repair there. With fully battle-ready condition, El Drago became just an additional fame points and battle experience. Well, maybe I should make second Galleon considering this frequent pirate attack. Built 2nd Galleon named Valkyrie, taken from XB-70 Bomber.

Pirate Robert caught up with my fleet on the way to Lisbon. I was thinking to buy cannons in Lisbon, so Valkyrie didn't have cannons yet, but my ships fought well. At Lisbon, I sold #3 ship, Stratotanker, and built a new Karak-class named Glovemaster. With Glovemaster, all ships in my fleet were newly-built and of high-end wood.

Then came King's summon! .... Just a secret letter to Spain? Easy delivery. Rewarded with rank of Baron.

Intercepted Pirate Ahon. Fame point 13240. Then an order from Bordeaux.

Defeat Admiral Ali of Osman Empire? I didn't want to break relation with Spain and Osman. But, maybe it's unavoidable then. I accepted the order.

Intercepted Admiral Alie near Istanbul. The hostility point of Osman Empire increased a bit, but not the state of war yet. Another order from King to kill Pirate Kid. It took a while to find him.

Waited until he came after my fleet. Actually other pirate fleets attacked my fleet while waiting for Kid. My fame point up to 20780, and rewarded with rank of Viscount.

Actually another order from King immediately. Kill Pirate Silver? Actually he was of a fleet of two small ships. I felt sympathy, but it was an order from the king. Rewarded with rank of Count.

An order from Pisa. Pepper 160 units. Easy travel to India.

2022/01/15

Well, I couldn't finish it one day even with a map I made in the first three play-through attempts. (I did play all the way in my 3rd attempt once.)

Order from London. Treasure Hunting. Golden Gauntlet?

Oharu at Nagasaki knows about it. How come? Anyway, go to Nagasaki.

Oharu heard it from Bonita at Veracruz. How come? Did she travel to Veracruz? Or Bonita once visited Nagasaki? (I know they were randomly picked :-P) Amboina, Capetown, Rio Grande, Pernambugo, then Veracruz. I avoided cross Pacific route. Bonita heard from Vicent at Trebizond?

Came all the way back to Europe. Came to Trebizond, but told he was in Azov. Close enough. After a few times negotiations, he sold me the map. Actually I hired him.

Golden Gauntlet was in New Zealand.

Delivered it, and my fame point up to 26133. Getting tired of treasure hunting. Hope next mission is not treasure hunting. 名声ポイント26133。次が宝探しだったら死ねる。

Then came an order from the King! .... Another treasure hunting. Crystal Hand Mirror?

Sita at Goa knows about it? Went there. Sita heard from Beatrice at Genoa? Beatrice heard from Margarita at Seville? Margarita heard from Carlota at Lisbon? Pirate Tatoo Silver owns it? I hope this pirate come after me.

Actually he did. Thanks. Fulfilled the mission, rewarded with rank of Marquis. Fame point 27993. Ending must be close.

Someone at Veracruz is calling me. Maybe too far, but gave a shot.

A few pirates challenged my fleet only to be defeated. My fame point 29303. Then before getting to Veracruz, I was called from Venice. I kind of was expecting it. So, I was ordered to find Lion's Crown. OK. First met Mary in London. Then Balboa at N5 E75? I stopped at Mombasa to find Balboa moved to Ternate. Balboa heard from Arjuna at Calcutta? Arjuna heard from Solis at Macao. Finally I got a map! Multiple pirate fleets attacked me at Macao. It was tough battles. Fame point up to 31213.

Likely to be arctic region. I have been making a 1x map using my tool but I think it is almost impossible to a player without detailed map to find it....

Delivered the crown. King's summon! .... Another treasure hunt. Deamon's Cup? Ok. I find it. Balboa again! I met him! Damn it!

.... As soon as I left Lisbon, a pirate attacked my fleet. The pirate happened to have Deamon's Cup. Thank you for the delivery. Made my job easy. Delivered Deamon's Cup to the King. Finally! I got the rank of Duke! Duke Cessna! OK. I need to win the final fleet battle, but to get there I need to wait for the summon from the King. For the meantime, someone in Oslo is calling me. Platinum Sword? OK. I do it. Miguel at Algiers told he heard from Margarita at Seville. Margarita heard from Fatisia at Istanbul. Fatisia heard from Oharu at Nagasaki! What a girl! Oharu told that the Platinum Sword is loaded on a ship of Admiral Hidalgo. The problem is, Hidalgo is not a pirate, just a trader. I hoped he would sell it to me by negotiation. I didn't want to attack unarmed commercial ship.

I intercepted Hidalgo offshore Seville. Negotiation did not work. In fact I didn't have an option to ask the sword. Easy victory, but bad after taste. It's not my way. I just reset and load the state before the quest. Going back to October 1511.

Waiting for the King's summon while battling with pirates in the wild. Order from Azov, 188 unit of Clove. Easy mission. Round trip to Ternate. Completed delivery and my fame point 40428.

Back to Lisbon. Finally! King's order to rescue abducted princess! What? Spanish Admiral Emilio abducted her? OK. I had to defeat hin in my third play-through attempt, but I was not expecting to fight with him in this play-through. Anyway, I waited for him offshore Seville. In fact, I was able to attack his fleet from his 6 o'clock. It didn't take three turns to destroy his flagship. FM TOWNS version Uncharted Water 1 has another bug that the picture after the final-battle victory is corrupted. It happens on Tsugaru and also on the actual hardware. I confirmed with my FM TOWNS II MX. I still don't know what picture I was supposed to see.

Also, I had to save data to disk, reset, and then load it to proceed to the Ending. Well, it's ok. At leat I could see the ending this way. I finally finished (twice) one of my unfinished games. Despite programming quality and usability issues, Uncharted Waters is clearly a masterpiece. I hope I can play Uncharted Water 2 eventually.

Comments are welcome.  Send E-Mail to: 

Back to http://www.ysflight.com