Debug Functions#
Being based on the same engine, the DOS version of King's Quest shares a set of debugging features with King's Quest II.
Main Debug Commands#
Press ALT+D (or Command-D in the Mac version) to enable some debugging words. These features are disabled upon entering a new room.
Here's the complete word list:
- TP: Teleport to the appropriate room.
- POS: Set Graham's X and Y positions.
- GET OBJECT: Puts the appropriate object by ID in the player's inventory.
- OBJECT or SP: Gives status on the appropriate object.
- SET VAR: Sets a chosen variable to a given value.
- SHOW VAR: Displays the value of a variable.
- SET FLAG: Sets the appropriate flag.
- RESET FLAG: Resets the appropriate flag.
- SHOW FLAG: Displays info on a flag (Can be either set or not set).
Additional Functions#
When debug mode is active, the text for handling unknown words is simplified.
Word not known: |
Press F10 to display info on memory use.
Press F6 to display priority settings for the current room.
Unused Graphics#
An animation of King Edward spinning. This is used in the original PCjr release - right before Edward falls over dead - but not from the Apple II version onward.
This frame, however, is specific to newer versions and recycled from King's Quest II. When Graham looks at the throne in the ending sequence, he looks left, not up.
(Source: Original TCRF research)
Unused Text#
ID |
Message |
PCjr |
Notes |
|---|---|---|---|
General Logic |
|||
2 |
Where do you think it could be? |
No |
An alternate message for trying to FIND something. |
12 |
You need to be closer to the |
No |
Unused message for trying to SWIM at an insufficient distance from the water. |
22 |
You do not have a bowl. |
No |
This is the first of several error messages that went unused because they spoil content in the game. |
95 |
With disappointment, you see |
No |
From where it's placed in the code, this is a generic message for the magic ring failing to work. |
Logic 6 - Stump & Pouch Field |
|||
4 |
You could get a much better |
Yes |
Should be triggered by LOOK POUCH, but it's not. |
11 |
You need to get closer to look |
No |
A more specific message for trying to look at the log from far away. |
Logic 10 - Goat Pen (West Side) |
|||
1 |
There is no reason to jump or |
Yes |
The first of several messages for failing to jump / duck in a specific room. |
8 |
That is not something the old |
Yes |
Probably meant for trying to feed the goat something other than a carrot. |
17 |
The goat is following you. |
Yes |
Possibly triggered by typing LOOK GOAT after getting him to follow you. |
Logic 11 - Goat Pen (East Side) |
|||
2 |
It's not nice to tease the |
Yes |
Could have been used after showing the goat the carrot a second time. |
16 |
You have nothing the old goat |
Yes |
(See above). |
29 |
Why would you want to do that? |
Yes |
Trying to jump over or break the fence might have provoked this text. |
Logic 13 - Wolf Field |
|||
11 |
Now that the goat is gone, |
Yes |
If the player killed the goat while the wolf was on the screen, this text could have popped up. |
Logic 21 - Witch Area |
|||
5 |
Your protection is gone and |
Yes |
A message meant for when the Fairy Godmother's protection disappeared while the witch was still on-screen. |
6 |
With the goat now dead, you |
Yes |
Another message for the goat dying, opening the player to danger. |
18 |
Oh NO!! She's back!!! |
No |
Maybe the witch could leave the screen and come back again? |
Logic 22 - Condor Area |
|||
8 |
You would hit your head on the |
Yes |
More room-specific jumping messages! Woo! |
Logic 25 - Troll Bridge (North) |
|||
19 |
You have no treasure to give |
Yes |
Attempting to GIVE the troll something with no items, most likely. |
20 |
'''You can't give it if you don't |
Yes |
Trying to give the troll a treasure that you don't actually have would display this message. |
Logic 28 - Outside Witch's House |
|||
10 |
The goat is suspicious of this |
Yes |
When Graham tries to enter the witch's house with the goat by his side, the goat would leave him. |
20 |
The path is around the corner. |
No |
Typing LOOK CORNER with the path not in view? |
Logic 29 - Sorcerer Area |
|||
3 |
'''You're so afraid of the |
Yes |
Yet more room-specific jumping / ducking failure text. |
8 |
You are immobilized! You can't |
Yes |
Whoa, two in the same room. |
Logic 36 - Leprechaun Cave Entrance |
|||
9 |
There are several pretty trees |
Yes |
A nice description of the area that's never referenced in the room logic. |
Logic 39 - Troll Bridge (West) |
|||
20 |
'''If you don't have it, how can |
Yes |
(Please see Logic 25). |
Logic 41 - Troll Bridge (South) |
|||
20 |
You don't have any. |
Yes |
(Please see Logic 39, which will direct to you Logic 25). |
Logic 46 - Ogre Area |
|||
6 |
The ogre can see you now! |
No |
A message for the magic ring's invisibility wearing off with the Ogre still on the screen. |
Logic 51 - Dragon's Lair |
|||
28 |
You don't have a dagger. |
Yes |
Another message deleted for spoiling of a game item. |
29 |
You don't have any water. |
Yes |
See above. |
37 |
You are too busy looking |
Yes |
This is a pretty nondescript message, so it could have been used for any number of things. |
Logic 53 - Daventry Throne Room |
|||
1 |
Even as you are reaching for |
No |
A humorous Easter egg that seems to have been removed from the game entirely. |
7 |
You bow, but you are the only |
Yes |
This appears in the PCjr version for bowing to the king after his death. |
11 |
Before exposing your |
No |
Oh that Graham, always traveling through time to get weapons for regicide! |
15 |
He bids you to approach so he |
Yes |
This can be triggered in the PCjr version by typing LOOK KING from far away. |
17 |
Your heart also aches with |
Yes |
Even in the PCjr version, you can't look at the King in the middle of his heart attack. |
18 |
The King is lying motionless |
Yes |
Another message left over from the PCjr version. |
31 |
As you are leaving, your |
Yes |
This is the last message specific to the PCjr game. |
Logic 58 - Giant's Room |
|||
17 |
You have no sling! |
Yes |
A message revealing the existence of an item in the game? Right out. |
19 |
You have no dagger! |
Yes |
Another one? Get that out of here. |
Logic 65 - Witch's House |
|||
4 |
This is not a good place to |
Yes |
Unknown. It's not possible to voluntarily give up your protection... |
5 |
There is no reason to jump or |
Yes |
I heard you like room-specific jumping and ducking messages. Here's one now. |
51 |
The note was here at one time, |
Yes |
Trying to TAKE NOTE a second time would produce this message. |
Logic 70/71/72 - Beanstalk Climb |
|||
1 |
If you were to jump or duck |
Yes |
Okay, this exact string appears in three rooms, so it's not really room-specific. |
Logic 75 - Rat Cave |
|||
11 |
It is already open. |
Yes |
You can't open an open door. That's not how doors work, (wo)man. |
13 |
The door appears to be stuck |
Yes |
If for some reason the player tried to close the door, this message might have been displayed. |
17 |
You have no treasure to give |
Yes |
Remember the troll message similar to this one? Yeah. Same deal. |
23 |
You do not have any. |
Yes |
Trolls, like rats, hate adventurers who give them the absence of objects. |
Logic 77 - Leprechaun King's Chamber |
|||
3 |
It is very difficult to play a |
Yes |
It is indeed. Also, this message spoils the existence of the fiddle, so out it went. |
20 |
The shield is already in your |
Yes |
Typing TAKE SHIELD a second time would prompt this error message. |
(Source: Original TCRF research)
Early Draft#
Early |
Final |
Notes |
|---|---|---|
'''Logic 0, Message 25 |
'''Logic 102, Message 3 |
Verily, there is no reason at all to drop any item in this game. |
'''Logic 0, Message 26 |
'''Logic 101, Message 4 |
Emphasis!! |
'''Logic 12, Message 26 |
'''Logic 12, Message 19 |
|
Logic 12, Message 28 |
'''Logic 12, Message 21 |
Commenting on the age of a bucket at the top of a well is poor form. Everybody knows that. |
'''Logic 12, Message 31 |
'''Logic 12, Message 22 |
|
'''Logic 12, Message 51 |
'''Logic 12, Message 50 |
The final text is notably less apologetic. |
'''Logic 79, Message 5 |
'''Logic 79, Message 37 |
This bland description of the fiddle was thankfully improved. |
(Source: Original TCRF research)
Word Dictionary#
Present only in the booter versions of the game are the following words:
- greg
- rowland
- ken
- macneill
- doug
- hal
- schwab
- arthur
- abraham
- charles
- tingley
- chris
- teresa
These refer to staff members Greg Rowland, Ken MacNeill, Doug MacNeill, Hal Schwab, Arthur Abraham, and Charles Tingley along with two whose meanings are unknown:
- Arthur Abraham was responsible for programming what eventually evolved into the game's engine.
- "chris" most certainly is Chris Iden, who was not involved originally but worked as a programming department manager around this time.
- Hal Schwab, according to Bob Heitman (who had recalled from Greg Rowland), was the game's director.
- "teresa" may refer to Teresa Baker, who appears in the 1988 Christmas Card.
This Easter egg of sorts must have been certainly implemented by Greg Rowland himself, as it is used in the logic for the well as an individual command, meaning that the game will register "greg rope" as a valid statement.
(Source: Lance Ewing)
Unused Sounds#
|
Standard PC |
Tandy PC |
|---|---|
Sound 03 is never used. This is actually the nightingale call from King's Quest II. The new version of King's Quest was built off of King's Quest II, and this sound was mistakenly left in.
The old versions also have their own as well:
ID |
Sound |
Description |
|---|---|---|
06 |
Cut from the game entirely. |
|
08 |
Cut from the game entirely. |
|
26 |
Noise. |
|
27 |
More noise. |
|
28 |
Very alluring. Possibly related to being immobilised by the sorcerer? |
|
29 |
Maybe intended for when underground? |
|
30 |
Same as above. |
|
31 |
Short and mischievous. |
|
32 |
No clear purpose. |
|
34 |
Sounds similar to sound 09 (fairy godmother). |
|
35 |
Connects the above two. |
|
36 |
Duplicate of sound 16 (opening doors). |
|
37 |
No clear purpose. Very turbulent. |
|
38 |
Most likely a placeholder. |
|
39 |
Most likely a placeholder. |
|
40 |
Most likely a placeholder. |
|
(Source: Original TCRF research)
(Source: NewRisingSun)
Uncompiled Source Code#
The very first IBM PC release for CGA (not the PCjr release) with a MAIN.EXE dated May 30, 1984, has uncompiled 8088 assembler source code in the thirteen 512-byte sectors starting at cylinder 7, head 0, sector 3:
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
(Source: NewRisingSun)