From 2daded6994ed5eccadc0135d3f273d485d8ebe90 Mon Sep 17 00:00:00 2001
From: "John W. Linville" <linville@tuxdriver.com>
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 <ENTER>? (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

