Difference between revisions of "Frankie crashed on Jupiter"
Jump to navigation
Jump to search
| Line 114: | Line 114: | ||
* Reset if invalid | * Reset if invalid | ||
| − | Details | + | ==== Details ==== |
<nowiki> | <nowiki> | ||
Floppy code: | Floppy code: | ||
Revision as of 22:50, 2 March 2026
Contents
Source 1
| Property | Data |
|---|---|
| Title | Frankie crashed on Jupiter |
| Publisher and/or Developer | Kingsoft GmbH |
| Year | 1985 |
| Disk(s) | 1 |
| Number of Index Holes | ? |
| Media Type | 5.25 DSDD |
| Retail, Budget or Compilation (with name) | Retail |
| Country of Release | DE |
| Language(s) | English |
| Platform | C64 |
| NTSC or PAL | PAL |
| Protection | From C64 Preservation Project: Protection reads the track 1, sector 20 data block at a non-standard density (%00 instead of %11). (LordCrass) |
| Working? | Yes |
| Archived | ? |
| Verified by | parser |
G64
File:Frankie crashed on Jupiter (Kingsoft) (1985) (original) -PAL- -NTSC- -working- -unpatched-.g64
Source 2
| Property | Data |
|---|---|
| Title | Frankie crashed on Jupiter |
| Publisher and/or Developer | Kingsoft GmbH |
| Year | 1985 |
| Disk(s) | 1 |
| Number of Index Holes | 2 |
| Media Type | 5.25 DSDD |
| Retail, Budget or Compilation (with name) | Retail |
| Country of Release | DE |
| Language(s) | English |
| Platform | C64 |
| NTSC or PAL | PAL |
| Protection | Track 1 Sector 20 has data block (after header) in speed 0, additionally there is a signature on track 18 |
| Working? | Yes |
| Archived | 13 Dec 2025 enigma, provided by @rndt@F64 |
| Verified by | enigma |
Streams
File:Streams Kingsoft FrankieCrashedOnJupiter arndt.zip
P64
File:Kingsoft FrankieCrashedOnJupiter arndt s0.p64
G64
File:Kingsoft FrankieCrashedOnJupiter arndt s0.g64
Disk side 1 is empty.
Protection Analysis
Summary
Floppy
- Seek to track 1 sector 20
- read header
- switch speedzone to 0
- wait until byte is ready in shift register - drop this, then read 256 raw bytes to buffer
- decode buffer from GCR to $CC usable bytes
- return OK
C64
- Read $80 bytes from floppy buffer to RAM
- Sum up the first $70 bytes and compare to hard coded checksum (must be $2AC1)
- Reset if invalid
Details
Floppy code:
.8:0300 4C BC 01 JMP $01BC
.8:0303 A9 01 LDA #$01 // buffer 0 track 1
.8:0305 85 06 STA $06
.8:0307 A9 14 LDA #$14 // buffer 0 sector 20
.8:0309 85 07 STA $07
.8:030b A9 B0 LDA #$B0 // Job: SEEK
.8:030d 85 00 STA $00
.8:030f A5 00 LDA $00
.8:0311 30 FC BMI $030F // wait until done
.8:0313 C9 01 CMP #$01
.8:0315 D0 F4 BNE $030B // wait until OK
.8:0317 A0 2C LDY #$2C
.8:0319 B9 25 03 LDA $0325,Y // copy routine from 0325 -> 01BC
.8:031c 99 BC 01 STA $01BC,Y
.8:031f 88 DEY
.8:0320 10 F7 BPL $0319
.8:0322 4C E0 01 JMP $01E0 // then jump to 01E0
.8:0325 20 0A F5 JSR $F50A // this code and below is copied to 01bc
.8:0328 AD 00 1C LDA $1C00
(8:$032b) see below for the copied routine
.8:032b 49 60 EOR #$60
.8:032d 8D 00 1C STA $1C00
.8:0330 50 FE BVC $0330
.8:0332 B8 CLV
.8:0333 AD 01 1C LDA $1C01
.8:0336 91 30 STA ($30),Y
.8:0338 C8 INY
.8:0339 D0 F5 BNE $0330
.8:033b 20 E0 F8 JSR $F8E0
.8:033e AD 00 1C LDA $1C00
.8:0341 49 60 EOR #$60
.8:0343 8D 00 1C STA $1C00
.8:0346 4C 05 F5 JMP $F505
.8:0349 A9 E0 LDA #$E0
.8:034b 85 00 STA $00
.8:034d A5 00 LDA $00
.8:034f 30 FC BMI $034D
.8:0351 60 RTS
Copied routine:
.8:01bc 20 0A F5 JSR $F50A -> read block header and wait for sync
.8:01bf AD 00 1C LDA $1C00
.8:01c2 49 60 EOR #$60
.8:01c4 8D 00 1C STA $1C00 -> 1C Motor On, Led On, Write Protect Sense On, Speedzone 0
.8:01c7 50 FE BVC $01C7 -> wait for full byte
.8:01c9 B8 CLV
.8:01ca AD 01 1C LDA $1C01 -> read byte
.8:01cd 91 30 STA ($30),Y -> write to $0300
.8:01cf C8 INY
.8:01d0 D0 F5 BNE $01C7 -> 256 bytes
.8:01d2 20 E0 F8 JSR $F8E0 -> Decode 255 GCR bytes to 204 BIN bytes, then the last byte from the previous buffer with 64 GCR bytes from $01BA
for the remaining 52 BIN bytes
At $01BA is in that case no senseful data loaded. Later only the first $70 bytes are evaluated.
.8:01d5 AD 00 1C LDA $1C00 -> 03
.8:01d8 49 60 EOR #$60
.8:01da 8D 00 1C STA $1C00 -> FC
.8:01dd 4C 05 F5 JMP $F505 -> set "OK" error message -> CODE ENDS HERE when OK, then C64 read floppy memory, see code below
.8:01e0 A9 E0 LDA #$E0 -> execute program in $0300 -> From $0322
.8:01e2 85 00 STA $00 -> Job starts execution at $0300, where a jump jumps to $01BC
.8:01e4 A5 00 LDA $00
(8:$01e6) d
.8:01e6 30 FC BMI $01E4 -> wait for program
.8:01e8 60 RTS
Raw bytes read to buffer at 0300:
>8:0300 55 f4 a5 57 79 95 ae bc e5 4a ea 92 95 aa b7 6a 77 95 ea eb ce 54 a4 e5 U..Wy....J.....jw....T..
>8:0318 a9 6a 95 de aa af 73 54 a4 e7 4a 52 b2 9c e5 4a ba da 9e aa ba 73 7c dc .j....sT..JR...J.....s|.
>8:0330 fb 3d 4f 9f 54 d7 73 4d 5a 9c a9 af cc af b6 aa f2 6b 92 bf 69 4a 52 a4 .=O.T.sMZ........k..iJR.
>8:0348 97 4e 59 92 a6 b9 e6 69 9b e4 a7 49 f9 92 9d b7 65 de 75 df 37 55 d6 7b .NY....i...I....e.u.7U.{
>8:0360 95 d5 75 cb 73 5c d9 29 f2 76 5d 77 25 ee 7c e4 a7 c9 cf 7c dc f7 c9 f6 ..u.s\.).v]w%.|....|....
>8:0378 73 dc e5 75 5d 74 dd 57 a9 f9 76 5d e7 5e 4a 76 5f 39 29 f6 76 5d 57 35 s..u]t.W..v].^Jv_9).v]W5
>8:0390 cb 7b 9d 97 55 de 92 9d 57 5a 4a 73 5c b7 dd 5f d5 dd ee ae ea ea ae ae .{..U...WZJs\.._........
>8:03a8 ea ae d7 5d 56 f5 bd dd 5d 5d 57 75 75 55 6a ab ae b5 d5 55 d5 55 dd be ...]V...]]WuuUj....U.U..
>8:03c0 ea fa aa ae d5 57 55 56 bb b5 aa ea ea eb 6d b7 6e aa aa aa aa aa aa bb .....WUV......m.n.......
>8:03d8 aa aa aa aa d5 55 55 55 55 55 55 55 77 55 55 55 55 aa aa aa ab 55 55 55 .....UUUUUUUwUUUU....UUU
>8:03f0 55 dd 55 55 55 dd 55 55 55 57 5d d7 57 aa aa aa
After GCR decode, (message starts at 0338)
>8:0300 a0 0f b9 26 71 99 00 d0 88 10 f7 c8 b9 1a 71 99 00 89 c8 c0 0d d0 f5 4c ...&q.........q........L
>8:0318 00 89 a0 00 98 99 00 71 c8 d0 fa 4c ec 9e 9d 8e 5f 8f b3 8f c8 90 c5 92 .......q...L...._.......
>8:0330 7b c0 72 c4 81 ea 00 00 28 43 29 20 31 39 38 35 20 42 59 20 4b 49 4e 47 {.r.....(C) 1985 BY KING
>8:0348 53 4f 46 54 0d 0d 41 4c 4c 20 52 49 47 48 54 53 20 52 45 53 45 52 56 45 SOFT..ALL RIGHTS RESERVE
>8:0360 44 0d 0d 43 4f 50 59 49 4e 47 20 49 53 20 56 49 4f 4c 41 54 49 4f 4e 20 D..COPYING IS VIOLATION
>8:0378 4f 46 20 4c 41 57 ff a7 4e d1 70 d0 70 da f4 ad 4f cd cd bf 4f af bf 4f OF LAW..N.p.p...O...O..O
>8:0390 06 f0 d4 67 0f 1f 0f b6 ff fe f0 fb 0f 4f 06 74 aa fa 70 dc 6b 4b f0 f0 ...g.........O.t..p.kK..
>8:03a8 f0 f0 f0 74 f0 f0 f0 af 0f 0f 0f 0f 0f 0d af 0f 0f 10 f0 f0 ff 0f 0f 07 ...t....................
>8:03c0 4f 0f 0f bf 0f 0f 07 17 1f 50 f0 f0 00 ff ff e6 ff ff ff ff ff ff ff ff O........P..............
>8:03d8 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 1d c8 ff ff ff ff ff ........................
>8:03f0 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Decoded program part at 0300, not executed by floppy but later read to C64 memory at $7100:
.8:0300 A0 0F LDY #$0F
.8:0302 B9 26 71 LDA $7126,Y
.8:0305 99 00 D0 STA $D000,Y
.8:0308 88 DEY
.8:0309 10 F7 BPL $0302
.8:030b C8 INY
.8:030c B9 1A 71 LDA $711A,Y
.8:030f 99 00 89 STA $8900,Y
.8:0312 C8 INY
.8:0313 C0 0D CPY #$0D
.8:0315 D0 F5 BNE $030C
.8:0317 4C 00 89 JMP $8900
.8:031a A0 00 LDY #$00
.8:031c 98 TYA
.8:031d 99 00 71 STA $7100,Y
.8:0320 C8 INY
.8:0321 D0 FA BNE $031D
.8:0323 4C EC 9E JMP $9EEC
C64 routine reads floppy memory from 0300:
128 bytes to $7100
.C:707a A5 BA LDA $BA
.C:707c 20 09 ED JSR $ED09 -> TALK
.C:707f A9 6F LDA #$6F
.C:7081 20 C7 ED JSR $EDC7 -> Set Secondary Adress TALK
.C:7084 A2 00 LDX #$00
.C:7086 20 13 EE JSR $EE13 -> Get Char from serial bus
.C:7089 9D 00 71 STA $7100,X
.C:708c E8 INX
.C:708d 10 F7 BPL $7086
.C:708f 20 EF ED JSR $EDEF -> Untalk
.C:7092 A0 00 LDY #$00
.C:7094 4C EE 70 JMP $70EE -> fill memory at $7000
.C:70ee 98 TYA -> from $7094 fill 7000-70F0 with 00
.C:70ef 99 00 70 STA $7000,Y
.C:70f2 C8 INY
.C:70f3 C0 F0 CPY #$F0
.C:70f5 90 F8 BCC $70EF
.C:70f7 20 60 72 JSR $7260
.C:70fa 20 23 72 JSR $7223
.C:70fd 4C 00 72 JMP $7200 -> Check protection signature with a checksum
Evaluation of data read from floppy, checks if sum is 2AC1
.C:7200 A2 6F LDX #$6F -> calculate some checksum from 70 bytes at 7100-716F
.C:7202 A9 00 LDA #$00 A = 0, Y = 0
.C:7204 A8 TAY
.C:7205 18 CLC
.C:7206 7D 00 71 ADC $7100,X A += MEM
.C:7209 9A TXS Save X
.C:720a AA TAX X = A
.C:720b 98 TYA A = Y
.C:720c 69 00 ADC #$00 A += carry // carrys are summed in Y
.C:720e A8 TAY Y = A
.C:720f 8A TXA A = X
.C:7210 BA TSX Restore X
.C:7211 CA DEX
.C:7212 10 F1 BPL $7205
.C:7214 9A TXS
.C:7215 C0 2A CPY #$2A Y == 2A ?
.C:7217 D0 07 BNE $7220
.C:7219 C9 C1 CMP #$C1 -> A == C1 ?
.C:721b D0 03 BNE $7220
.C:721d 4C 00 71 JMP $7100 -> OK?
.C:7220 4C 09 80 JMP $8009 -> error?
Bytes at 7100
>C:7100 a0 0f b9 26 71 99 00 d0 88 10 f7 c8 b9 1a 71 99 00 89 c8 c0 ...&q.........q.....
>C:7114 0d d0 f5 4c 00 89 a0 00 98 99 00 71 c8 d0 fa 4c ec 9e 9d 8e ...L.......q...L....
>C:7128 5f 8f b3 8f c8 90 c5 92 7b c0 72 c4 81 ea 00 00 28 43 29 20 _.......{.r.....(C)
>C:713c 31 39 38 35 20 42 59 20 4b 49 4e 47 53 4f 46 54 0d 0d 41 4c 1985 BY KINGSOFT..AL
>C:7150 4c 20 52 49 47 48 54 53 20 52 45 53 45 52 56 45 44 0d 0d 43 L RIGHTS RESERVED..C
>C:7164 4f 50 59 49 4e 47 20 49 53 20 56 49 4f 4c 41 54 49 4f 4e 20 OPYING IS VIOLATION
>C:7178 4f 46 20 4c 41 57 ff a7
.C:7223 A5 BA LDA $BA
.C:7225 20 0C ED JSR $ED0C -> LISTEN
.C:7228 A9 6F LDA #$6F
.C:722a 20 B9 ED JSR $EDB9 -> Set Secondary Adress LISTEN
.C:722d A0 00 LDY #$00
.C:722f B9 3D 72 LDA $723D,Y
.C:7232 20 DD ED JSR $EDDD -> send $23 bytes to floppy
.C:7235 C8 INY
.C:7236 C0 23 CPY #$23
.C:7238 90 F5 BCC $722F
.C:723a 4C FE ED JMP $EDFE -> UNLISTEN
.C:7260 A0 57 LDY #$57
.C:7262 A9 00 LDA #$00
.C:7264 99 00 02 STA $0200,Y
.C:7267 99 A6 02 STA $02A6,Y
.C:726a 88 DEY
.C:726b 10 F7 BPL $7264
.C:726d A9 09 LDA #$09
.C:726f 8D 16 03 STA $0316
.C:7272 A9 80 LDA #$80
.C:7274 8D 17 03 STA $0317
.C:7277 60 RTS