From a079479b6d9fb11d82d0229100b9e6bc64c65a4e Mon Sep 17 00:00:00 2001 From: Jonathan Campbell Date: Wed, 7 Feb 2018 08:31:14 -0800 Subject: [PATCH] DOS_MakeName: Dont mangle Shift-JIS trailing bytes in PC-98 mode --- src/dos/dos.cpp | 8 ++++++++ src/dos/dos_files.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 022e5116e..ab0d0d2d0 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -42,6 +42,14 @@ int ascii_toupper(int c) { return c; } +bool shiftjis_lead_byte(int c) { + if ((((unsigned char)c & 0xE0) == 0x80) || + (((unsigned char)c & 0xE0) == 0xE0)) + return true; + + return false; +} + unsigned char cpm_compat_mode = CPM_COMPAT_MSDOS5; bool dos_in_hma = true; diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index 1a27b9d4a..a09349b25 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -44,6 +44,8 @@ Bitu DOS_FILES = 127; DOS_File ** Files = NULL; DOS_Drive * Drives[DOS_DRIVES] = {NULL}; +bool shiftjis_lead_byte(int c); + Bit8u DOS_GetDefaultDrive(void) { // return DOS_SDA(DOS_SDA_SEG,DOS_SDA_OFS).GetDrive(); Bit8u d = DOS_SDA(DOS_SDA_SEG,DOS_SDA_OFS).GetDrive(); @@ -91,12 +93,17 @@ bool DOS_MakeName(char const * const name,char * const fullname,Bit8u * drive) { break; default: upname[w++]=c; + if (IS_PC98_ARCH && shiftjis_lead_byte(c) && r0 && name_int[r-1]==' ') r--; if (r>=DOS_PATHLENGTH) { DOS_SetError(DOSERR_PATH_NOT_FOUND);return false; } upname[w]=0; + /* Now parse the new file name to make the final filename */ if (upname[0]!='\\') strcpy(fullname,Drives[*drive]->curdir); else fullname[0]=0; @@ -818,6 +825,7 @@ static bool isvalid(const char in){ #define PARSE_RET_WILD 1 #define PARSE_RET_BADDRIVE 0xff +/* TODO: Shift-JIS awareness. Convert to ASCII uppercase but don't apply toupper() to trailing SJIS byte. */ Bit8u FCB_Parsename(Bit16u seg,Bit16u offset,Bit8u parser ,char *string, Bit8u *change) { char * string_begin=string; Bit8u ret=0;