Community
General and Everything Else => The Games and other Sierra Adventure stuff => Topic started by: lance.ewing on October 22, 2016, 03:42:09 PM
-
Does anyone happen to know what the exact release date of the original IBM PCjr version of King's Quest 1 was? Clearly it wasn't July 1983 as Wikipedia might have us believe . The best evidence for this is this magazine article:
https://books.google.co.uk/books?id=kSzKzjWHeVEC&lpg=PA61&pg=PA142&redir_esc=y#v=onepage&q&f=true
So in January 1984, Roberta is saying in that article that she has only just finished the game for the PCjr. The IBM PCjr itself had only just started shipping when the above magazine article was published (apparently PCjr shipping was very slow at first and didn't ramp up until about March 1984). It is clear from the wording of the above article that the game wasn't yet available in January 1984. All the stories around the release of King's Quest suggest that it came out first on the PCjr, and then when this was a failure, Sierra refocussed on the other platforms, like the Apple II, standard IBM PC, and the Tandy 1000 (that apparently came out at the end of 1984). Perhaps the 1983 date has relevance to some kind of internal release to IBM, but clearly there was no public availability of the game until 1984.
In Chuck Tingley's LinkedIn profile, he says he was contracted by Sierra to work on King's Quest from January 1983 to May 1984.The February 1985 article about King's Quest says that Sierra were told about the IBM PCjr about a year before the announcement of the IBM PCjr. This announcement happened in November 1983, so a year before that would have been either the end of 1982, or the start of 1983. Chuck's arrival at Sierra would align with these dates then. So Sierra spent the whole of 1983 working on King's Quest.
The July 1983 date seems to come from Sierra themselves:
http://www.sierrahelp.com/Documents/Manuals/Kings_Quest_Collection_-_Manual.pdf
...but the year must be a typo. Surely the month must be wrong as well. I would have expected it to come out earlier in the year in 1984.
Has anyone been able to research this further and work out a month and year that King's Quest was originally released?
-
It had apparently been released by August 1984 since it is referenced here as not being available on the IBM PC AT 5170:
http://www.minuszerodegrees.net/misc/IBM%20PC%20AT%205170%20announcement%20letter.txt
-
King's Quest entered the Top 20 in this Billboard magazine in November 1984:
https://books.google.co.uk/books?id=JCQEAAAAMBAJ&pg=PA27&dq=kings+quest&hl=en&sa=X&ved=0ahUKEwifhI-Wme_PAhWrAcAKHdJqCXEQ6AEINjAG#v=onepage&q=kings%20quest&f=false
It was already available for the Apple II and IBM at that point.
There is a NEW next to King's Quest in position 16 in the Entertainment section. This would refer to it being a new entry in the Top 20 rather than being a new release though.
-
Record number TX0001393675 at the U.S. Copyright Office (http://cocatalog.loc.gov/cgi-bin/Pwebrecon.cgi?Search_Arg=TX0001393675&Search_Code=REGS&PID=O7gAqTNZ2U_hl6V4AbMerlL97X&SEQ=20161022160501&CNT=25&HIST=1) lists 1984-05-10 as the publication date.
-
Wow! That's great. So the 10th May 1984.
I just found this from a magazine published May 1984:
https://archive.org/details/enter-magazine-07
Page 11 has a write up on King's Quest.
It says that it is already available for the IBM PC and other computers. So by this date it was already available for computers other than the IBM PCjr.
May is the month that Chuck Tingley left Sierra, so it all seems to line up.
-
To seemingly contradict what that previous magazine said, we have this one in September 1984 claiming that it wasn't yet available for the Apple II series:
https://archive.org/details/k-power-magazine-07
If it was available in May 1984 for the IBM PC and other computers, then what would those other computers have been at that stage? (we know that by November 1984 it was available for the Apple II though, since that Billboard magazine article had Apple II ticked). They seem to be either ignoring the IBM PCjr or are lumping the standard and PCjr IBM machines in the same pot. So when they said other computers, I was assuming the Apple II was the most likely other computer.
-
Here's another one, page 16, published in October 1984:
https://archive.org/details/enter-magazine-11
This one does mention both the IBM PC and PCjr, but strangely it does not yet mention the Apple II.
-
Donald B. Trivette's article in February 1985 seems to support the May 1984 date as well:
http://www.atarimagazines.com/compute/issue57/kings_quest.html
A year before the PCjr was announced - when the "Peanut" was just a rumor to the rest of us - IBM asked Sierra to create a game that would show off the new computer's color graphics capabilities. IBM supplied Sierra with a prototype junior.
Roberta Williams, who had worked on five other adventure games, was given the task of designing something completely new and different. Eighteen months later, Williams and a team of six programmers and artists had created King's Quest-at a cost of over $700,000.
The IBM PCjr was officially announced in November 1983. A year before that goes back to November 1982. Eighteen months after November 1982 is May 1984.
Someone could easily say that "a year before" and "Eighteen months" are not particularly exact time periods, but in this case it would appear that they point to the correct date.
-
The previously-available PC-CGA version had an August 16th 1984 date of MAIN.EXE. An earlier version of the game has now been acquired, dated May 31st 1984. Comparing the two versions shows that the game logic, graphics and sound are byte-for-byte identical; only interpreter (MAIN.EXE) as well as the boot sector and loader code changed. (The title screen code is in MAIN.EXE; logic code is not interpreted until the first actual game screen.) Notably, the earlier version only supports CGA composite mode, not RGB mode, and does not credit Chris Iden at the title screen, similar to the IBM PCjr release.
And, most interestingly, the disk again had a snippet of original source code in it! mov [di+saveptr],ax ;save buffer pointer
mov ax,[si+word ptr outxpos]
mov [di+word ptr xpos],ax ;positions
pop bx
call setcel
mov al,[di+steptime]
or al,al
jnz stepok
mov al,1
stepok: mov [di+steptime],al ;set default steptime
mov [di+stepclock],al ;set stepclock
ret
setcel: mov al,[bx] ;loop count
mov ah,0
xor bx,bx ;if 1 loop, get loop 0
dec ax
jz stcel
inc bx ;if 2 loops, get loop 1
dec ax
jz stcel
inc bx ;if 4 loops, get loop 2
xor ax,ax
stcel: push bp
mov bp,sp
push ax ;pass cel #
push bx ;pass loop #
push di ;pass table pointer
call getstcel
pop di ;get table pointer
pop bx ;get loop #
mov sp,bp
pop bp
mov [di+celcnt],al ;set cel count
mov [di+curl],bl ;set loop #
ret
trashem:lea si,objtab ;animation table pointer
lea di,chuck ;object table pointer
mov ch,outlen ;object table entry length
mov cl,4 ;nibble shifter
t0: add si,grplen ;point to next animation table
mov dl,[si] ;get room entry
cmp dl,0 ;not terminator?
jz t1
mov byte ptr [si],0
cmp dl,flags.roomflag ;in this room?
jne t0
mov al,[si+disknum] ;get this object's #
mul ch ;offset of this obj's table entry
mov bx,ax
mov dh,[di+bx+outroom]
and dh,80h
or dl,dh ;maintain ego possession
mov [di+bx+outroom],dl ;set this obj's room # entry
mov ah,[si+curl]
mov al,[si+curcel] ;combine loop & cel values
shl ah,cl
or al,ah
mov [di+bx+outlupcel],al ;set loop & cel entry
mov ax,word ptr [si+xpos]
mov word ptr [di+bx+outxpos],ax ;set position entries
jmp t0 ;process the 3 non-ego animation tables
t1: add di,inobjtab ;point to 1st object table's anitbl entry
mov cx,110 ;object count minus 1 (ego)
outlup: add di,outlen ;point to next object table
mov byte ptr [di],0 ;clear all objs' animation table entries
loop outlup ;process all objects' tables
mov chuckptr,0 ;clear loaded objects count
lea di,objtab
mov byte ptr [di+grplen],0 ;terminate animation tables
mov ax,curact
mov objptr,ax ;reset free memory pointer
mov cx,40-9
lea di,soundpos
add di,18
lea ax,stopsnd
; rep stosw ;set all non-res. sound ptrs to silence
ret
loadego:call wtprt
mov al,0
call load_obj ;get ego
lea di,objtab ;object table pointer
mov [di+lgrpptr],ax ;set loop group pointer
lea bx,alterego
mov [bx],ax ;ditto
mov al,0
mov [di+disknum],al
mov [di+objnum],al
mov [di+curcel],al ;disk #, obj # & cel # = 0
mov [di+curl],al ;loop # = 2
mov [di+stepclock],1 ;stepclock = 1
lea bx,chuck ;out table pointer
mov ax,[bx+word ptr outxpos]
mov [di+word ptr xpos],ax ;set positions
mov ax,savetab
mov [di+saveptr],ax ;set save buffer pointer
mov [di+celcnt],8 ;cel count = 8
push bp
mov bp,sp
mov ax,6
push ax ;pass cel #
mov al,0
push ax ;pass loop #
push di ;pass table pointer
call getstcel ;set step sizes, cel pointer & stepclock
mov sp,bp
pop bp
mov flags.roomflag,1
mov dx,0
call dwt
lea ax,objtab
mov tabptr,ax
cmp cpyseq,0
jnz ldgrtn
call ers
ldgrtn: ret
clearscrn:
push ax
mov ax,600h
jmp sc1
scroll: push ax
mov ax,601h
sc1: push bx
push cx
push dx
mov cx,1500h
mov dx,1827h
mov bh,0
call wtprt
int 10h
mov dx,1800h
jmp short stcr
setcsr: push ax
push bx
push cx
push dx
stcr: mov curchar,dl
mov ah,2
mov bh,0
call wtprt
int 10h
pop dx
pop cx
pop bx
pop ax
ret
term equ 0ffh
skip equ 0feh
psn equ 0fdh
flag equ 0fch
always equ 0fbh
ignore equ 0fah
unknown equ 0f9h
; Say-what?
; Scans the text logic table ( @texptr or @texany )
; for true sequences of conditions [ text, flag & position ]
; then passes a pointer for the action table [ @actptr or @actany ]
; to ACTMODUL to execute the action string for the matched conitions.
saywhat:
mov lgcflg,1 ;flag text table checks
mov si,txtptr ;get text logics table pointer
jmp chklup
; Check-mate!
; Scans the position logic table ( @posptr or @posany )
; for true sequences of conditions [ flags & positions ]
; then passes a pointer for the action table [ @actptr or @actany ]
; to ACTMODUL to execute the action string for the matched conitions.
chekmate:
mov lgcflg,0 ;flag position table checks
mov
-
Wow! That source code snippet is a really great find. I'll have to study this closely. A few familiar concepts in there, but it also looks like some of those comments have answered a few questions about what various things were called in those early KQ "GAL" releases.
Does the code correspond with part of the disassembly that you've been working on?
-
I can find the relevant sections in MAIN.EXE. Basically, GAL has two separate logic scripts for each room, the first logic script dealing with things such as moving objects around, check ego's position, and so on; the second logic script checking and acting upon "said" strings. The source code snippet calls the first logic script the "position logic table", and second logic the "text logic table". AGI of course combines both types into a single logic per room, and Sierra's AGI documentation to my knowledge calls them just "logics", not "logic tables". And what the snippet calls "action table" are just commands outside of a test command block (or inside a curly brace, to speak in source code terms) in AGI, which in GAL again are in a separate section of the room data file.
The code does not seem to use any scoping of names --- procedures are just simple code labels instead of using the Assembler's "PROC" directive, which was introduced with Intel's ASM86 assembler in 1978 and adopted by Microsoft's Macro Assembler in 1981. Due to the lack of scoping, the code in some sections jumps around wildly in the code segment, basically jumping from one end of a procedure right into the middle of another one at the other end of the segment. The code also uses no constants for things like interrupt 10 subfunction numbers. Variable names are shortened to the point of being unintelligible - what the code snippet calls "wtprt" I had named "waitForMsgFinish" in my disassembly, so "wtprt" apparently stands for something like "waitPrint". And why the hell is scanning the "position logic table" called "check-mate"?
Overall, the programming style seems archaic even by 1984 standards. I'm a bit disappointed that this is what original source code looks like. :)
-
That's a great find - and very interesting analysis.
Thanks!
-
On second look, there are three small differences in the game logic as well:
1. Room 18, when typing "kill elf": "I'm surprised at you! that is very\nimpolite!"changed to
"I'm surprised at you! That is very\nimpolite!"
2. Room 21: if (roomObjectActive==1 && haveGoat==1) {
print("There is a witch in the area, but\n having that menacing goat with you,\n she will keep her distance.");
set(v113);
}
if (roomObjectActive==1 && haveGoat==1) {
print("There is a witch in the area, but with\n the shield no harm will come to you.");
}changed to
if (roomObjectActive==1 && haveGoat==1) {
print("There is a witch in the area, but\n having that menacing goat with you,\n she will keep her distance.");
set(v113);
}
if (roomObjectActive==1 && haveShield==1) {
print("There is a witch in the area, but with\n the shield no harm will come to you.");
}
3. Room 65: "As the wicked witch flew over her\n house, she dropped you... into her\n cage! If you can't get out, you may\n become the secret ingredient in this\n witches brew!" changed to "As the wicked witch flew over her\n house, she dropped you... into her\n cage! If you can't get out, you may\n become the secret ingredient in this\n witch's brew!"
Everything else is the same, as I have verified by using GALextract on both disk images, then comparing all files using Windows' FC command.
-
It's quite amusing to see bugs like that second one. So in that early version, when you're in a room with the witch, and the goat is following you, does it print both of those messages?
-
Yep. I made a video:
https://www.youtube.com/watch?v=UgIawXE4lfg
-
Even more amusing seeing the video. :)