Skip to content

Commit 71b0a32

Browse files
committed
gcipack: Fix block count being calculated incorrectly
1 parent 7802a02 commit 71b0a32

File tree

1 file changed

+22
-23
lines changed

1 file changed

+22
-23
lines changed

ttyd-tools/gcipack/gcipack.py

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,6 @@
99
inputBuffer = ctypes.create_string_buffer(inputFile.read())[:-1]
1010
inputFile.close()
1111

12-
blockCount = math.ceil((0x2040 + len(inputBuffer)) / 0x2000)
13-
14-
# Create header
15-
headerBuffer = ctypes.create_string_buffer(0x40)
16-
struct.pack_into(">L", headerBuffer, 0x00, 0x47384D45) # game code
17-
struct.pack_into(">H", headerBuffer, 0x04, 0x3031) # maker code
18-
struct.pack_into(">B", headerBuffer, 0x06, 0xFF) # unused
19-
struct.pack_into(">B", headerBuffer, 0x07, 2) # banner flags (RGB5A3)
20-
struct.pack_into("32s", headerBuffer, 0x08, sys.argv[2].encode()) # filename
21-
struct.pack_into(">L", headerBuffer, 0x28, 0) # modified time
22-
struct.pack_into(">L", headerBuffer, 0x2C, 0) # image offset
23-
struct.pack_into(">H", headerBuffer, 0x30, 2) # icon format
24-
struct.pack_into(">H", headerBuffer, 0x32, 3) # animation speed (1 icon for 12 frames)
25-
struct.pack_into(">B", headerBuffer, 0x34, 4) # permissions
26-
struct.pack_into(">B", headerBuffer, 0x35, 0) # copy counter
27-
struct.pack_into(">H", headerBuffer, 0x36, 0) # first block number
28-
struct.pack_into(">H", headerBuffer, 0x38, blockCount) # block count
29-
struct.pack_into(">H", headerBuffer, 0x3A, 0xFF) # unused
30-
struct.pack_into(">L", headerBuffer, 0x3C, 0x2000) # comment address
31-
3212
# Load banner and icon
3313
bannerFile = open(sys.argv[5], "rb")
3414
bannerBuffer = ctypes.create_string_buffer(bannerFile.read())[:-1]
@@ -51,12 +31,31 @@
5131
fileInfoBuffer = ctypes.create_string_buffer(0x200 - 0x40)
5232
struct.pack_into(">L", fileInfoBuffer, 0, len(inputBuffer))
5333

54-
5534
# Pad to block boundary
56-
paddingLength = blockCount * 0x2000 - (len(bannerBuffer) + len(iconBuffer) + len(commentBuffer) + len(fileInfoBuffer) + len(inputBuffer))
35+
fileLength = len(bannerBuffer) + len(iconBuffer) + len(commentBuffer) + len(fileInfoBuffer) + len(inputBuffer)
36+
blockCount = math.ceil(fileLength / 0x2000)
37+
paddingLength = blockCount * 0x2000 - fileLength
5738
paddingBuffer = ctypes.create_string_buffer(paddingLength)
5839

59-
outputFilename = os.path.splitext(os.path.splitext(inputFilename)[0])[0] + ".gci"
40+
# Create header
41+
headerBuffer = ctypes.create_string_buffer(0x40)
42+
struct.pack_into(">L", headerBuffer, 0x00, 0x47384D45) # game code
43+
struct.pack_into(">H", headerBuffer, 0x04, 0x3031) # maker code
44+
struct.pack_into(">B", headerBuffer, 0x06, 0xFF) # unused
45+
struct.pack_into(">B", headerBuffer, 0x07, 2) # banner flags (RGB5A3)
46+
struct.pack_into("32s", headerBuffer, 0x08, sys.argv[2].encode()) # filename
47+
struct.pack_into(">L", headerBuffer, 0x28, 0) # modified time
48+
struct.pack_into(">L", headerBuffer, 0x2C, 0) # image offset
49+
struct.pack_into(">H", headerBuffer, 0x30, 2) # icon format
50+
struct.pack_into(">H", headerBuffer, 0x32, 3) # animation speed (1 icon for 12 frames)
51+
struct.pack_into(">B", headerBuffer, 0x34, 4) # permissions
52+
struct.pack_into(">B", headerBuffer, 0x35, 0) # copy counter
53+
struct.pack_into(">H", headerBuffer, 0x36, 0) # first block number
54+
struct.pack_into(">H", headerBuffer, 0x38, blockCount) # block count
55+
struct.pack_into(">H", headerBuffer, 0x3A, 0xFF) # unused
56+
struct.pack_into(">L", headerBuffer, 0x3C, 0x2000) # comment address
57+
58+
outputFilename = os.path.splitext(inputFilename)[0] + ".gci"
6059
outputFile = open(outputFilename, "wb")
6160
outputFile.write(bytearray(headerBuffer))
6261
outputFile.write(bytearray(bannerBuffer))

0 commit comments

Comments
 (0)