From fef3ca735c7268ebf3b1d05bb516b47b3aaf1c05 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Mon, 18 Jun 2018 19:12:32 -0700 Subject: [PATCH] parse Z5U saves --- Makefile | 2 + src/zinfo/z5u/gamedata.txt | 49 +++ src/zinfo/z5u/z5u.s | 869 +++++++++++++++++++++++++++++++++++++ winmake.bat | 2 + 4 files changed, 922 insertions(+) create mode 100644 src/zinfo/z5u/gamedata.txt create mode 100644 src/zinfo/z5u/z5u.s diff --git a/Makefile b/Makefile index b295d3f..d06307e 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,7 @@ asm: md $(ACME) -r build/zinfo3.lst src/zinfo/z3/z3.s $(ACME) -r build/zinfo4.lst src/zinfo/z4/z4.s $(ACME) -r build/zinfo5.lst src/zinfo/z5/z5.s + $(ACME) -r build/zinfo5u.lst src/zinfo/z5u/z5u.s dsk: md asm cp res/"Pitch Dark.master games collection.do.not.edit.2mg" build/"$(DISK)" @@ -58,6 +59,7 @@ dsk: md asm $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/LIB/" "build/ZINFO3" $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/LIB/" "build/ZINFO4" $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/LIB/" "build/ZINFO5" + $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/LIB/" "build/ZINFO5U" # TODO remove these save game files, just here for development $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/Z/WISHBRINGER/" "res/R69.850920.SAV" $(CADIUS) ADDFILE build/"$(DISK)" "/PITCH.DARK/Z/ZORK.I/" "res/R88.840726.SAV" diff --git a/src/zinfo/z5u/gamedata.txt b/src/zinfo/z5u/gamedata.txt new file mode 100644 index 0000000..e4a1efb --- /dev/null +++ b/src/zinfo/z5u/gamedata.txt @@ -0,0 +1,49 @@ +gamelist + + !byte bzork47e-bzork47b +bzork47b + !text "R47.870915.SAV" +bzork47e + + !byte bzork49e-bzork49b +bzork49b + !text "R49.870917.SAV" +bzork49e + + !byte bzork51e-bzork51b +bzork51b + !text "R51.870923.SAV" +bzork51e + + !byte bzork57e-bzork57b +bzork57b + !text "R57.871221.SAV" +bzork57e + + !byte 0 ;end of list + +gameloc +;bzork47 + !byte $a6 + +;bzork49 + !byte $a6 + +;bzork51 + !byte $a6 + +;bzork57 + !byte $a6 + +gamemoves +;bzork47 + !byte $8c + +;bzork49 + !byte $8c + +;bzork51 + !byte $8c + +;bzork57 + !byte $8c diff --git a/src/zinfo/z5u/z5u.s b/src/zinfo/z5u/z5u.s new file mode 100644 index 0000000..d20340e --- /dev/null +++ b/src/zinfo/z5u/z5u.s @@ -0,0 +1,869 @@ +;license:MIT +;(c) 2018 by qkumba + +!cpu 6502 +!to "build/zinfo5u",plain +*=$3000 + +save_name = $2006 +read_buffer = $2e00 ;512 bytes +info_buffer = $2000 ;record_size*8, 600 ($258) bytes +zpage_info = $fe ;word +zpage_ptr = $fd +zpage_gamind = $fc +name_offset = 0 ;1+37 bytes, a zero-length name is an empty record +time_offset = 42 ;1+8 bytes ("12:01 pm") +score_offset = 51 ;1+6 bytes (-12345) +moves_offset = 58 ;1+5 bytes (12345) +date_offset = 64 ;1+10 bytes ("10/10/2099") +record_size = 75 ;bytes + +;zpage used by Infocom code +zp_58 = $58 +zp_59 = $59 +zp_5A = $5a +zp_5B = $5b +zp_6B = $6b +zp_6C = $6c +zp_6D = $6d +zp_6E = $6e +zp_7B = $7b +zp_7C = $7c +zp_7D = $7d +zp_7E = $7e +zp_7F = $7f +zp_80 = $80 +zp_83 = $83 +zp_84 = $84 +zp_87 = $87 +zp_88 = $88 +zp_89 = $89 +zp_8A = $8a +zp_A0 = $a0 +zp_A1 = $a1 +zp_A8 = $a8 +zp_A9 = $a9 +zp_AA = $aa +zp_AB = $ab +zp_AC = $ac +zp_AD = $ad +zp_AE = $ae +zp_CC = $cc +zp_CD = $cd +zp_CE = $ce +zp_CF = $cf +zp_D0 = $d0 +zp_D1 = $d1 +zp_D2 = $d2 +zp_D3 = $d3 +zp_D4 = $d4 + + jsr exchange + jsr $bf00 + !byte $c8 ;open file + !word c8_parms + lda c8_handle + sta ce_handle + sta ca_handle + + lda #>info_buffer + sta zpage_info+1 + lda #gamelist + sta zpage_info+1 +--- ldy #0 + lda (zpage_info),y + beq close ++ pha + cmp $2006 + beq + +-- inc zpage_gamind + pla + sec + adc zpage_info + sta zpage_info + bcc --- + inc zpage_info+1 + bne --- ++ tay +- lda $2006,y + cmp (zpage_info),y + bne -- + dey + bne - + pla + + lda #>info_buffer + sta zpage_info+1 + lda #read_buffer + sta zp_6E + LDA (zp_6D),Y + STA zp_6C + INY + LDA (zp_6D),Y + STA zp_6B + pla + sta zp_6E + RTS + +sub_E1B1: + SEC + SBC #$10 + LDY #0 + STY zp_6E + ASL + ROL zp_6E + CLC + ADC zp_83 + STA zp_6D + LDA zp_6E + ADC zp_84 + STA zp_6E + +locret_E1C6: + RTS + +decompress + JSR sub_F538 + LDY #$C + jsr load_page + lda #>read_buffer + sta zp_6E + LDA (zp_6D),Y + TAX + INY + LDA (zp_6D),Y + STA zp_6D + STX zp_6E + INC zp_6D + BNE loc_E49C + INC zp_6E + +loc_E49C: + JSR sub_F081 + JMP sub_F307 + +sub_E7BD: + JSR sub_E7C7 + LDX zp_CE + LDA zp_CF + rts + +sub_E7C7: + LDA zp_59 + STA zp_D3 + EOR zp_5B + STA zp_D2 + LDA zp_58 + STA zp_CC + LDA zp_59 + STA zp_CD + BPL loc_E7DC + JSR sub_E805 + +loc_E7DC: + LDA zp_5A + STA zp_CE + LDA zp_5B + STA zp_CF + BPL loc_E7E9 + JSR sub_E7F7 + +loc_E7E9: + JSR sub_E813 + LDA zp_D2 + BPL loc_E7F3 + JSR sub_E805 + +loc_E7F3: + LDA zp_D3 + BPL locret_E804 + +sub_E7F7: + LDA #0 + SEC + SBC zp_CE + STA zp_CE + LDA #0 + SBC zp_CF + STA zp_CF + +locret_E804: + RTS + +sub_E805: + LDA #0 + SEC + SBC zp_CC + STA zp_CC + LDA #0 + SBC zp_CD + STA zp_CD + RTS + +sub_E813: + JSR sub_E849 + +loc_E81C: + ROL zp_CC + ROL zp_CD + ROL zp_D0 + ROL zp_D1 + LDA zp_D0 + SEC + SBC zp_CE + TAY + LDA zp_D1 + SBC zp_CF + BCC loc_E834 + STY zp_D0 + STA zp_D1 + +loc_E834: + DEX + BNE loc_E81C + ROL zp_CC + ROL zp_CD + LDA zp_D0 + STA zp_CE + LDA zp_D1 + STA zp_CF + RTS + +sub_E849: + LDX #$10 + LDA #0 + STA zp_D0 + STA zp_D1 + CLC + RTS + +loc_E9E4: + LDA zp_58 + STA zp_CC + LDA zp_59 + STA zp_CD + LDA zp_CD + BPL loc_E9F8 + LDA #$2D + JSR emit_char + JSR sub_E805 + +loc_E9F8: + LDA #0 + STA zp_D4 + +loc_E9FC: + LDA zp_CC + ORA zp_CD + BEQ loc_EA14 + LDA #$A + STA zp_CE + LDA #0 + STA zp_CF + JSR sub_E813 + LDA zp_CE + PHA + INC zp_D4 + BNE loc_E9FC + +loc_EA14: + LDA zp_D4 + BNE loc_EA1D + LDA #$30 + JMP emit_char + +loc_EA1D: + PLA + CLC + ADC #$30 + JSR emit_char + DEC zp_D4 + BNE loc_EA1D + RTS + +sub_F081: + LDA zp_6D + STA zp_7B + LDA zp_6E + STA zp_7C + LDA #0 + STA zp_7D + JMP sub_F109 + +sub_F109: + ldy zp_7D + LDA zp_7C + STY zp_80 + STA zp_7F + RTS + +sub_F2AC: + PHA + INC zp_7C + BNE loc_F2B3 + INC zp_7D + +loc_F2B3: + JSR sub_F109 + PLA + RTS + +sub_F2C4: + LDY zp_7B + lda zp_7F + pha + jsr load_page + lda #>read_buffer + sta zp_7F + LDA (zp_7E),Y + INC zp_7B + BNE loc_F2D7 + JSR sub_F2AC + +loc_F2D7: + TAY + pla + sta zp_7F + tya + RTS + +sub_F2EE: + LDA zp_6D + ASL + STA zp_7B + LDA zp_6E + ROL + STA zp_7C + LDA #0 + ROL + STA zp_7D + ASL zp_7B + ROL zp_7C + ROL zp_7D + JMP sub_F109 + +locret_F306: + RTS + +sub_F307: + LDX #0 + STX zp_A8 + STX zp_AC + DEX + STX zp_A9 + +loc_F310: + JSR sub_F3ED + BCS locret_F306 + STA zp_AA + TAX + BEQ loc_F35B + CMP #4 + BCC loc_F379 + CMP #6 + BCC loc_F35F + JSR sub_F3CF + TAX + BNE loc_F333 + LDA #$5B + +loc_F32A: + CLC + ADC zp_AA + +loc_F32D: + JSR emit_char + JMP loc_F310 + +loc_F333: + CMP #1 + BNE loc_F33B + LDA #$3B + BNE loc_F32A + +loc_F33B: + LDA zp_AA + SEC + SBC #6 + BEQ loc_F349 + TAX + LDA byte_F51E,X + JMP loc_F32D + +loc_F349: + JSR sub_F3ED + ASL + ASL + ASL + ASL + ASL + STA zp_AA + JSR sub_F3ED + ORA zp_AA + JMP loc_F32D + +loc_F35B: + LDA #$20 + BNE loc_F32D + +loc_F35F: + SEC + SBC #3 + TAY + JSR sub_F3CF + BNE loc_F36D + STY zp_A9 + JMP loc_F310 + +loc_F36D: + STY zp_A8 + CMP zp_A8 + BEQ loc_F310 + LDA #0 + STA zp_A8 + BEQ loc_F310 + +loc_F379: + SEC + SBC #1 + ASL + ASL + ASL + ASL + ASL + ASL + STA zp_AB + JSR sub_F3ED + ASL + CLC + ADC zp_AB + TAY + lda zp_88 + pha + jsr load_page + lda #>read_buffer + sta zp_88 + LDA (zp_87),Y + STA zp_6E + INY + LDA (zp_87),Y + STA zp_6D + pla + sta zp_88 + LDA zp_7D + PHA + LDA zp_7C + PHA + LDA zp_7B + PHA + LDA zp_A9 + PHA + LDA zp_AC + PHA + LDA zp_AE + PHA + LDA zp_AD + PHA + JSR sub_F3DB + JSR sub_F307 + PLA + STA zp_AD + PLA + STA zp_AE + PLA + STA zp_AC + PLA + STA zp_A8 + PLA + STA zp_7B + PLA + STA zp_7C + PLA + STA zp_7D + LDX #$FF + STX zp_A9 + JSR sub_F109 + JMP loc_F310 + +sub_F3CF: + LDA zp_A9 + BPL loc_F3D6 + LDA zp_A8 + RTS + +loc_F3D6: + LDY #$FF + STY zp_A9 + RTS + +sub_F3DB: + LDA zp_6D + ASL + STA zp_7B + LDA zp_6E + ROL + STA zp_7C + LDA #0 + ROL + STA zp_7D + JMP sub_F109 + +sub_F3ED: + LDA zp_AC + BPL loc_F3F3 + SEC + RTS + +loc_F3F3: + BNE loc_F408 + INC zp_AC + JSR sub_F2C4 + STA zp_AE + JSR sub_F2C4 + STA zp_AD + LDA zp_AE + LSR + LSR + JMP loc_F431 + +loc_F408: + SEC + SBC #1 + BNE loc_F423 + LDA #2 + STA zp_AC + LDA zp_AD + STA zp_6D + LDA zp_AE + ASL zp_6D + ROL + ASL zp_6D + ROL + ASL zp_6D + ROL + JMP loc_F431 + +loc_F423: + LDA #0 + STA zp_AC + LDA zp_AE + BPL loc_F42F + LDA #$FF + STA zp_AC + +loc_F42F: + LDA zp_AD + +loc_F431: + AND #$1F + CLC + RTS + +byte_F51E: + !BYTE 0, $D, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '!', '?', '_' + !BYTE '#', $27, '"', '/', $5C, '-', ':', '(', ')' + +sub_F538: + STX zp_6E + ASL + STA zp_6D + ROL zp_6E + LDX zp_6E + ASL + ROL zp_6E + ASL + ROL zp_6E + ASL + ROL zp_6E + SEC + SBC zp_6D + STA zp_6D + LDA zp_6E + STX zp_6E + SBC zp_6E + STA zp_6E + LDA zp_6D + CLC + ADC #$70 + BCC loc_F5B5 + INC zp_6E + +loc_F5B5: + CLC + ADC zp_89 + STA zp_6D + LDA zp_6E + ADC zp_8A + STA zp_6E + RTS + +emit_char + sty yreg+1 + inc zpage_ptr + ldy zpage_ptr + sta (zpage_info),y + dec max_chars + beq fail_slot +yreg + ldy #0 + rts + +fail_slot +stack_pointer + ldx #0 + txs + rts + +max_chars !byte 0 + +zpage_old diff --git a/winmake.bat b/winmake.bat index a72f821..0ca23ae 100644 --- a/winmake.bat +++ b/winmake.bat @@ -33,6 +33,7 @@ if "%1" equ "asm" ( %ACME% -r build\zinfo3.lst src\zinfo\z3\z3.s %ACME% -r build\zinfo4.lst src\zinfo\z4\z4.s %ACME% -r build\zinfo5.lst src\zinfo\z5\z5.s +%ACME% -r build\zinfo5u.lst src\zinfo\z5u\z5u.s goto :EOF ) @@ -61,6 +62,7 @@ cscript /nologo bin\fixFileInformation.js build\_FileInformation.txt %CADIUS% ADDFILE "build\%DISK%" "/PITCH.DARK/LIB/" "build\ZINFO3" %CADIUS% ADDFILE "build\%DISK%" "/PITCH.DARK/LIB/" "build\ZINFO4" %CADIUS% ADDFILE "build\%DISK%" "/PITCH.DARK/LIB/" "build\ZINFO5" +%CADIUS% ADDFILE "build\%DISK%" "/PITCH.DARK/LIB/" "build\ZINFO5U" goto :EOF )