L3 Disk Explorer is an application in order to access to files in a floppy disk image for retro computer and operating system.
| Revision | 857db820194c3d92db706bb2e191800d3827f7f1 (tree) |
|---|---|
| Time | 2023-07-08 01:10:27 |
| Author | Sasaji <sasaji@s-sa...> |
| Commiter | Sasaji |
Version 0.6.3 Release
| @@ -3,7 +3,7 @@ | ||
| 3 | 3 | # |
| 4 | 4 | CC=g++ |
| 5 | 5 | |
| 6 | -APPLICATION_VERSION=0.6.2 | |
| 6 | +APPLICATION_VERSION=0.6.3 | |
| 7 | 7 | |
| 8 | 8 | CDEFS= |
| 9 | 9 | DBG_CDEFS=-D_DEBUG -D_DEBUG_LOG |
| @@ -13,7 +13,7 @@ | ||
| 13 | 13 | <Description lang="ja">CPC DSK形式ファイル</Description> |
| 14 | 14 | </FileFormatType> |
| 15 | 15 | <FileFormatType name="fdi"> |
| 16 | - <Description>Anex98 FDI format file</Description> | |
| 16 | + <Description>Anex86 FDI format file</Description> | |
| 17 | 17 | <Description lang="ja">Anex86 FDI形式ファイル</Description> |
| 18 | 18 | </FileFormatType> |
| 19 | 19 | <FileFormatType name="cqmimg"> |
| @@ -2,6 +2,10 @@ | ||
| 2 | 2 | 更新履歴 |
| 3 | 3 | ============================================================================== |
| 4 | 4 | |
| 5 | +2023-07-08 Version 0.6.3 | |
| 6 | +・実機で書き込みしたHxC HFE形式のディスクイメージが読み込めなくなることがある | |
| 7 | + 不具合を修正した。 | |
| 8 | + | |
| 5 | 9 | 2023-04-03 Version 0.6.2 |
| 6 | 10 | ・CDOS II 2DD,2HD版のシステムディスクに対応した。 |
| 7 | 11 | ・MSX BASICのベタディスクを読み込めないことがある不具合を修正した。 |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | ============================================================================== |
| 2 | 2 | L3 Disk Explorer 仕様 |
| 3 | - Version 0.6.2 | |
| 3 | + Version 0.6.3 | |
| 4 | 4 | |
| 5 | 5 | Copyright(C) Sasaji 2015-2023 All Rights Reserved. |
| 6 | 6 | ============================================================================== |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | ============================================================================== |
| 2 | 2 | L3 Disk Explorer |
| 3 | - Version 0.6.2 | |
| 4 | - 2023/04/03 | |
| 3 | + Version 0.6.3 | |
| 4 | + 2023/07/08 | |
| 5 | 5 | |
| 6 | 6 | Copyright(C) Sasaji 2015-2023 All Rights Reserved. |
| 7 | 7 | ============================================================================== |
| @@ -38,7 +38,7 @@ PROJECT_NAME = L3DiskExplorer | ||
| 38 | 38 | # could be handy for archiving the generated documentation or if some version |
| 39 | 39 | # control system is used. |
| 40 | 40 | |
| 41 | -PROJECT_NUMBER = 0.6.2 | |
| 41 | +PROJECT_NUMBER = 0.6.3 | |
| 42 | 42 | |
| 43 | 43 | # Using the PROJECT_BRIEF tag one can provide an optional one line description |
| 44 | 44 | # for a project that appears at the top of each page and should give viewer a |
| @@ -252,19 +252,26 @@ FormatMFMParser::FormatMFMParser(DiskD88Disk *n_disk, int n_track_number, int n_ | ||
| 252 | 252 | clk 1 0 0 1 0 0 0 0 \n |
| 253 | 253 | 10010010 01010100 -> 9245 \n |
| 254 | 254 | rev 01001001 00101010 -> 492A \n |
| 255 | + | |
| 256 | + @par SYNC code | |
| 257 | + 00 -> 0 0 0 0 0 0 0 0 \n | |
| 258 | + clk 1 1 1 1 1 1 1 1 \n | |
| 259 | + 10101010 10101010 \n | |
| 260 | + rev 01010101 01010101 -> 5555 \n | |
| 255 | 261 | */ |
| 256 | -/// @return GAPフィールドあり | |
| 262 | +/// @return GAP and SYNCフィールドあり | |
| 257 | 263 | bool FormatMFMParser::AdjustGap() |
| 258 | 264 | { |
| 259 | 265 | bool found = false; |
| 260 | 266 | int maxlen = data_len; |
| 261 | - wxUint8 buf[4]; | |
| 267 | + wxUint8 buf[6]; | |
| 262 | 268 | int pos = 0; |
| 269 | + // search GAP field | |
| 263 | 270 | for(; pos<maxlen; pos++) { |
| 264 | 271 | memcpy(buf, &data[pos], 3); |
| 265 | 272 | int cnt = 0; |
| 266 | 273 | for(; cnt<8; cnt++) { |
| 267 | - if (buf[0] == 0x49 && buf[1] == 0x2a) { | |
| 274 | + if (memcmp(buf, "\x49\x2a", 2) == 0) { | |
| 268 | 275 | found = true; |
| 269 | 276 | break; |
| 270 | 277 | } |
| @@ -279,17 +286,44 @@ bool FormatMFMParser::AdjustGap() | ||
| 279 | 286 | } |
| 280 | 287 | if (!found) { |
| 281 | 288 | data_len = 0; |
| 289 | + return found; | |
| 290 | + } | |
| 291 | + // search the terminate of SYNC field | |
| 292 | + found =false; | |
| 293 | + pos = 0; | |
| 294 | + for(; pos<maxlen; pos++) { | |
| 295 | + memcpy(buf, &data[pos], 4); | |
| 296 | + int cnt = 0; | |
| 297 | + for(; cnt<8; cnt++) { | |
| 298 | + if (memcmp(buf, "\x55\x55\x25", 3) == 0 | |
| 299 | + || memcmp(buf, "\x55\x55\xa5", 3) == 0) { | |
| 300 | + found = true; | |
| 301 | + break; | |
| 302 | + } | |
| 303 | + | |
| 304 | + // bit shift left | |
| 305 | + ShiftBits(buf, 4, 1); | |
| 306 | + } | |
| 307 | + if (found) { | |
| 308 | + if (cnt >= 4) { | |
| 309 | + cnt -= 4; | |
| 310 | + } else { | |
| 311 | + pos--; | |
| 312 | + cnt += 4; | |
| 313 | + } | |
| 314 | + if (pos >= 0) { | |
| 315 | + data_len = ShiftBits(data, data_len, pos * 8 + cnt); | |
| 316 | + } | |
| 317 | + break; | |
| 318 | + } | |
| 319 | + } | |
| 320 | + if (!found) { | |
| 321 | + data_len = 0; | |
| 282 | 322 | } |
| 283 | 323 | return found; |
| 284 | 324 | } |
| 285 | 325 | /** データの解析(MFM) |
| 286 | 326 | |
| 287 | -@par SYNC code | |
| 288 | - 00 -> 0 0 0 0 0 0 0 0 \n | |
| 289 | - clk 1 1 1 1 1 1 1 1 \n | |
| 290 | - 10101010 10101010 \n | |
| 291 | - rev 01010101 01010101 -> 5555 \n | |
| 292 | - | |
| 293 | 327 | @par PRE AM |
| 294 | 328 | A1 -> 1 0 1 0 0 0 0 1 \n |
| 295 | 329 | clk 0 0 0 0 1 x 1 0 \n |
| @@ -417,19 +451,26 @@ FormatFMParser::FormatFMParser(DiskD88Disk *n_disk, int n_track_number, int n_si | ||
| 417 | 451 | clk 01 01 01 01 01 01 01 01 \n |
| 418 | 452 | 01010101 01010101 01010101 01010101 -> 55555555 \n |
| 419 | 453 | rev 10101010 10101010 10101010 10101010 -> AAAAAAAA \n |
| 454 | + | |
| 455 | + @par SYNC code | |
| 456 | + 00 -> 00 00 00 00 00 00 00 00 \n | |
| 457 | + clk 01 01 01 01 01 01 01 01 \n | |
| 458 | + 01000100 01000100 01000100 01000100 \n | |
| 459 | + rev 00100010 00100010 00100010 00100010 -> 22222222 \n | |
| 420 | 460 | */ |
| 421 | -/// @return GAPフィールドあり | |
| 461 | +/// @return GAP and SYNCフィールドあり | |
| 422 | 462 | bool FormatFMParser::AdjustGap() |
| 423 | 463 | { |
| 424 | 464 | bool found = false; |
| 425 | 465 | int maxlen = data_len; |
| 426 | - wxUint8 buf[6]; | |
| 466 | + wxUint8 buf[8]; | |
| 427 | 467 | int pos = 0; |
| 468 | + // search GAP field | |
| 428 | 469 | for(; pos<maxlen; pos++) { |
| 429 | 470 | memcpy(buf, &data[pos], 5); |
| 430 | 471 | int cnt = 0; |
| 431 | 472 | for(; cnt<8; cnt++) { |
| 432 | - if (buf[0] == 0xaa && buf[1] == 0xaa && buf[2] == 0xaa && buf[3] == 0xaa) { | |
| 473 | + if (memcmp(buf, "\xaa\xaa\xaa\xaa", 4) == 0) { | |
| 433 | 474 | found = true; |
| 434 | 475 | break; |
| 435 | 476 | } |
| @@ -444,17 +485,46 @@ bool FormatFMParser::AdjustGap() | ||
| 444 | 485 | } |
| 445 | 486 | if (!found) { |
| 446 | 487 | data_len = 0; |
| 488 | + return found; | |
| 489 | + } | |
| 490 | + // search the terminate of SYNC field | |
| 491 | + found =false; | |
| 492 | + pos = 0; | |
| 493 | + for(; pos<maxlen; pos++) { | |
| 494 | + if (pos == 0xb3) { | |
| 495 | + int nn=0; | |
| 496 | + } | |
| 497 | + memcpy(buf, &data[pos], 6); | |
| 498 | + int cnt = 0; | |
| 499 | + for(; cnt<8; cnt++) { | |
| 500 | + if (memcmp(buf, "\x22\x22\x22\x22\xa2", 5) == 0) { | |
| 501 | + found = true; | |
| 502 | + break; | |
| 503 | + } | |
| 504 | + | |
| 505 | + // bit shift left | |
| 506 | + ShiftBits(buf, 6, 1); | |
| 507 | + } | |
| 508 | + if (found) { | |
| 509 | + if (cnt >= 4) { | |
| 510 | + cnt -= 4; | |
| 511 | + } else { | |
| 512 | + pos--; | |
| 513 | + cnt += 4; | |
| 514 | + } | |
| 515 | + if (pos >= 0) { | |
| 516 | + data_len = ShiftBits(data, data_len, pos * 8 + cnt); | |
| 517 | + } | |
| 518 | + break; | |
| 519 | + } | |
| 520 | + } | |
| 521 | + if (!found) { | |
| 522 | + data_len = 0; | |
| 447 | 523 | } |
| 448 | 524 | return found; |
| 449 | 525 | } |
| 450 | 526 | /** データの解析(FM) |
| 451 | 527 | |
| 452 | -@par SYNC code | |
| 453 | - 00 -> 00 00 00 00 00 00 00 00 \n | |
| 454 | - clk 01 01 01 01 01 01 01 01 \n | |
| 455 | - 01000100 01000100 01000100 01000100 \n | |
| 456 | - rev 00100010 00100010 00100010 00100010 -> 22222222 \n | |
| 457 | - | |
| 458 | 528 | @par INDEX mark |
| 459 | 529 | FC -> 01 01 01 01 01 01 00 00 \n |
| 460 | 530 | clk 01 01 0x 01 0x 01 01 01 \n |
| @@ -7,7 +7,7 @@ | ||
| 7 | 7 | <key>CFBundleExecutable</key> |
| 8 | 8 | <string>l3diskex</string> |
| 9 | 9 | <key>CFBundleGetInfoString</key> |
| 10 | - <string>L3DiskExplorer version 0.6.2, (c) 2015-2023 Sasaji</string> | |
| 10 | + <string>L3DiskExplorer version 0.6.3, (c) 2015-2023 Sasaji</string> | |
| 11 | 11 | <key>CFBundleIconFile</key> |
| 12 | 12 | <string>l3diskex.icns</string> |
| 13 | 13 | <key>CFBundleIdentifier</key> |
| @@ -19,17 +19,17 @@ | ||
| 19 | 19 | <string>jp</string> |
| 20 | 20 | </array> |
| 21 | 21 | <key>CFBundleLongVersionString</key> |
| 22 | - <string>0.6.2, (c) 2015-2023 Sasaji</string> | |
| 22 | + <string>0.6.3, (c) 2015-2023 Sasaji</string> | |
| 23 | 23 | <key>CFBundleName</key> |
| 24 | 24 | <string>L3DiskExproler</string> |
| 25 | 25 | <key>CFBundlePackageType</key> |
| 26 | 26 | <string>APPL</string> |
| 27 | 27 | <key>CFBundleShortVersionString</key> |
| 28 | - <string>0.6.2</string> | |
| 28 | + <string>0.6.3</string> | |
| 29 | 29 | <key>CFBundleSignature</key> |
| 30 | 30 | <string>????</string> |
| 31 | 31 | <key>CFBundleVersion</key> |
| 32 | - <string>0.6.2</string> | |
| 32 | + <string>0.6.3</string> | |
| 33 | 33 | <key>CSResourcesFileMapped</key> |
| 34 | 34 | <true/> |
| 35 | 35 | <key>LSApplicationCategoryType</key> |
| @@ -6,10 +6,10 @@ | ||
| 6 | 6 | #ifndef _VERSION_H_ |
| 7 | 7 | #define _VERSION_H_ |
| 8 | 8 | |
| 9 | -#define APPLICATION_VERSION "0.6.2" | |
| 9 | +#define APPLICATION_VERSION "0.6.3" | |
| 10 | 10 | #define APP_VER_MAJOR 0 |
| 11 | 11 | #define APP_VER_MINOR 6 |
| 12 | -#define APP_VER_REV 2 | |
| 12 | +#define APP_VER_REV 3 | |
| 13 | 13 | #define APP_VER_BUILD 0 |
| 14 | 14 | #define APP_COPYRIGHT "Copyright (C) 2015-2023 Sasaji" |
| 15 | 15 |