From 2daded6994ed5eccadc0135d3f273d485d8ebe90 Mon Sep 17 00:00:00 2001 From: "John W. Linville" Date: Sun, 4 Feb 2018 14:54:14 -0500 Subject: [PATCH] Reverse-engineer source changes to go from version C to version D This is the bulk of the changes required to go from version C to version D of the Infocom ZIP as currently (2018-02-04) known to the Tandy Color Computer community. The reference binaries are currently archived here: Version C: http://www.colorcomputerarchive.com/coco/Disks/Games/Infocom%20Adventures/Zork%20I%20(Infocom).zip Version D: http://www.colorcomputerarchive.com/coco/Disks/Games/Infocom%20Adventures/Ballyhoo%20(Infocom).zip The single change to no longer set the infamous "Tandy Bit" has been incorporated in a separate commit, as it is not clear whether that was an official Infocom change or simply the work of a random hacker. If desired, that single change could also be applied specifically to the version C code, as it is in this repository. --- cocozip.src | 14 +++++++------- disk.src | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- read.src | 16 ++++++++++------ screen.src | 2 +- zequates.src | 2 +- 5 files changed, 73 insertions(+), 23 deletions(-) diff --git a/cocozip.src b/cocozip.src index 6e96a957c51f..9031f5e7cd05 100644 --- a/cocozip.src +++ b/cocozip.src @@ -1,7 +1,7 @@ - ;TITLE "ZIP/6809-C INFOCOM, INC. --- INITIALIZATION" + ;TITLE "ZIP/6809-D INFOCOM, INC. --- INITIALIZATION" ; ------------------------------- - ; ZIP/6809 VERSION C + ; ZIP/6809 VERSION D ; Z-CODE INTERPRETER PROGRAM ; FOR 64K TRS-80 COLOR COMPUTER 2 ; ------------------------------- @@ -38,29 +38,29 @@ DEBUG EQU 0 ; ASSEMBLY FLAG INCLUDE zequates.src INCLUDE warm.src - ;TITLE "ZIP/6809-B INFOCOM, INC. --- MAINLINE" + ;TITLE "ZIP/6809-D INFOCOM, INC. --- MAINLINE" INCLUDE main.src INCLUDE mainsubs.src INCLUDE dispatch.src - ;TITLE "ZIP/6809-B INFOCOM, INC. --- OPCODE EXECUTORS" + ;TITLE "ZIP/6809-D INFOCOM, INC. --- OPCODE EXECUTORS" INCLUDE ops0.src INCLUDE ops1.src INCLUDE ops2.src INCLUDE opsx.src INCLUDE read.src - ;TITLE "ZIP/6809-B INFOCOM, INC. --- OPCODE SUPPORT" + ;TITLE "ZIP/6809-D INFOCOM, INC. --- OPCODE SUPPORT" INCLUDE paging.src INCLUDE zstring.src INCLUDE objects.src - ;TITLE "ZIP/6809-B INFOCOM, INC. --- COCO MACHINE DEPENDENT" + ;TITLE "ZIP/6809-D INFOCOM, INC. --- COCO MACHINE DEPENDENT" INCLUDE ioprims.src INCLUDE screen.src INCLUDE disk.src - ;TITLE "ZIP/6809-B INFOCOM, INC." + ;TITLE "ZIP/6809-D INFOCOM, INC." IF DEBUG INCLUDE bugger.src ENDIF diff --git a/disk.src b/disk.src index a8456328bded..d09344398af3 100644 --- a/disk.src +++ b/disk.src @@ -66,6 +66,9 @@ ZSAVE: BSR SAVRES ; INIT THINGS JSR PARAMS ; GET POSITION AND DRIVE + TSTA ; IS A ZERO? + BEQ ZSAVE ; THEN LOOP + LDX #SING LDB #SINGL JSR DLINE ; "SAVING" @@ -197,6 +200,9 @@ ZREST: JSR SAVRES JSR PARAMS + TSTA ; IS A ZERO? + BEQ ZREST ; THEN LOOP + LDX #RING LDB #RINGL JSR DLINE ; "RESTORING" @@ -317,9 +323,12 @@ GETPOS: JSR GETKEY BRA GETPOS ; AND TRY AGAIN SETPOS: LDA GPOSIT ; USE DEFAULT -POSSET: STA GPOSIT ; TEMP DEFAULT +POSSET: STA TPOSIT ; TEMP DEFAULT ADDA #$31 ; CONVERT TO ASCII STA PDO ; HERE TOO + + STA PDTNPO ; AND HERE + JSR OUTCHR ; AND SHOW CHOICE ; GET DRIVE # @@ -341,12 +350,37 @@ GETDRV: JSR GETKEY BRA GETDRV ; DRIVE # NO GOOD DRVSET: LDA GDRIVE -SETDRV: STA DRIVE ; NEW DEFAULT +SETDRV: STA TDRIVE ; TEMP DEFAULT ADDA #$30 ; CONVERT TO ASCII STA GAMDRI ; FOR PROMPT - JSR OUTCHR ; SHOW CHOICE - LDA GPOSIT ; MAKE IT THE NEW DEFAULT + STA PDTNDR ; SAVE IN PDTION STRING + + JSR OUTCHR ; AND SHOW CHOICE + + LDX #PDTION + LDB #PDTIONL + JSR DLINE ; "\n\nPOSITION *, DRIVE *. ARE YOU SURE? (Y/N) >" + +SDLOOP: JSR GETKEY ; SHOW CHOICE + + CMPA #'Y' ; CHOICE IS 'Y'? + BEQ SDSAVE + CMPA #EOL ; CHOICE IS ? (SAME AS 'Y') + BEQ SDSAVE + CMPA #'N' ; CHOICE IS 'N'? + BEQ SDABRT + JSR BOOP ; BOOP AT BAD CHOICE + BRA SDLOOP ; AND LOOP +SDABRT: LDA #$00 + RTS + +SDSAVE: LDA TDRIVE ; SAVE NEW DEFAULT DRIVE + STA GDRIVE + STA DRIVE + LDA TPOSIT ; SAVE NEW DEFAULT POSITION + STA GPOSIT + LDB #5 ; CALC BLOCK OFFSET (5 TRACKS/GAME) MUL STB TRACK ; TRACK ADDRESS @@ -356,7 +390,10 @@ SETDRV: STA DRIVE ; NEW DEFAULT LDX #INSERM LDB #INSERML JSR DLINE ; "INSERT SAVE DISK IN DRIVE X," - JMP ENTER ; ETC. + JSR ENTER ; ETC. + + LDA #$FF + RTS ; ------------ ; SHOW DEFAULT @@ -427,8 +464,8 @@ WDRIV: .DB EOL .STR "DRIVE 0 OR 1 " WDRIVL EQU *-WDRIV -DEFALT: .STR "(DEFAULT IS " -DEFNUM: .STR "0) >" +DEFALT: .STR "(DEFAULT = " +DEFNUM: .STR "*) >" DEFALL EQU *-DEFALT SING: .DB EOL @@ -440,10 +477,19 @@ RING: .DB EOL RINGL EQU *-RING PTION: .STR " POSITION " -PDO: .STR "1 ..." +PDO: .STR "* ..." .DB EOL PTIONL EQU *-PTION +PDTION: .db EOL + .db EOL + .STR "POSITION " +PDTNPO: .STR "*, DRIVE " +PDTNDR: .STR "*." + .db EOL + .STR "ARE YOU SURE? (Y/N) >" +PDTIONL EQU *-PDTION + ENDTST: .STR "END" ;END diff --git a/read.src b/read.src index d8c2546f1cbe..a9d1411ce778 100644 --- a/read.src +++ b/read.src @@ -23,14 +23,18 @@ ZREAD: JSR ZUSL ; UPDATE STATUS LINE FIRST STA RTABP ; AND RESULT TABLE POINTER READL: LDX ARG2 - LDA ,X+ ; FETCH MAXIMUM # OF WORDS - CMPA ,X ; COMPARE TO # WORDS READ - BHS RL1 ; STILL ROOM + LDA ,X ; FETCH MAXIMUM # OF WORDS - ; *** ERROR #13 -- PARSER OVERFLOW *** + BEQ RL4 ; ENFORCE 60 WORD LIMIT FOR PARSER? + CMPA #$3C + BCS RL5 - LDA #13 - JSR ZERROR +RL4: LDA #$3B + STA ,X + +RL5: LEAX 1,X + CMPA ,X + BCS RDEX RL1: LDD MASK ; OUT OF CHARS & WORDS? BNE RL2 ; NOT YET diff --git a/screen.src b/screen.src index 44b38d9e1ac0..b4e7defad964 100644 --- a/screen.src +++ b/screen.src @@ -73,7 +73,7 @@ ENDSL EQU *-ENDSES ; DISPLAY ZIP VERSION NUMBER ; -------------------------- - .STR "COCO 2 VERSION C" + .STR "COCO VERSION D" .DB EOL VCODEL EQU *-VCODE diff --git a/zequates.src b/zequates.src index fb7b3f34492d..92a650510d65 100644 --- a/zequates.src +++ b/zequates.src @@ -17,7 +17,7 @@ LOCALS EQU MSTART+$600 ; LOCAL VARIABLE STORAGE (32 BYTES) BUFFER EQU MSTART+$620 ; I/O LINE BUFFER (32 BYTES) BUFSAV EQU MSTART+$640 ; I/O AUX BUFFER (32 BYTES) ZIP EQU MSTART+$700 ; START OF EXECUTABLE CODE -ZCODE EQU ZIP+$1700 ; START OF Z-CODE (ASSUME 5.75K ZIP) +ZCODE EQU ZIP+$1800 ; START OF Z-CODE (ASSUME 6K ZIP) ; Z-CODE HEADER OFFSETS -- 2.13.6