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