1760 lines
20 KiB
NASM
1760 lines
20 KiB
NASM
;Copyright (c) 1990-2012 by Neil Dodwell
|
|
;Released with permission from Neil Dodwell under GPLv2
|
|
;See LICENSE file for full license text
|
|
Screenwidth equ 320 ;physical width of screen
|
|
|
|
|
|
|
|
Allocatework proc near
|
|
|
|
mov bx,1000h
|
|
call allocatemem
|
|
mov workspace,ax
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Showpcx proc near
|
|
|
|
call openfile
|
|
mov bx,handle
|
|
mov ds,workspace
|
|
mov ah,3fh
|
|
mov cx,128
|
|
mov dx,0
|
|
int 21h
|
|
|
|
mov ds,workspace
|
|
mov si,16
|
|
mov cx,48
|
|
mov es,buffers
|
|
mov di,maingamepal
|
|
pcxpal: push cx
|
|
call readabyte
|
|
shr al,1
|
|
shr al,1
|
|
stosb
|
|
pop cx
|
|
loop pcxpal
|
|
mov cx,768-48
|
|
mov ax,0ffffh
|
|
rep stosw
|
|
|
|
call readoneblock
|
|
mov si,0
|
|
mov di,0
|
|
mov cx,480
|
|
convertpcx: push cx
|
|
push di
|
|
mov ds,workspace
|
|
mov es,buffers
|
|
mov di,pointerback
|
|
mov bx,0
|
|
sameline: call readabyte
|
|
mov ah,al
|
|
and ah,11000000b
|
|
cmp ah,11000000b
|
|
jnz normal
|
|
mov cl,al
|
|
and cl,00111111b
|
|
mov ch,0
|
|
push cx
|
|
call readabyte
|
|
pop cx
|
|
add bx,cx
|
|
rep stosb
|
|
cmp bx,4*80
|
|
jnz sameline
|
|
jmp endline
|
|
normal: stosb
|
|
inc bx
|
|
cmp bx,4*80
|
|
jnz sameline
|
|
|
|
endline: pop di
|
|
push si
|
|
mov dx,0a000h
|
|
mov es,dx
|
|
mov si,pointerback
|
|
mov ds,buffers
|
|
|
|
mov dx,03c4h
|
|
mov al,2
|
|
mov ah,1
|
|
out dx,ax
|
|
mov cx,40
|
|
push di
|
|
rep movsw
|
|
pop di
|
|
mov ah,2
|
|
out dx,ax
|
|
mov cx,40
|
|
push di
|
|
rep movsw
|
|
pop di
|
|
mov ah,4
|
|
out dx,ax
|
|
mov cx,40
|
|
push di
|
|
rep movsw
|
|
pop di
|
|
mov ah,8
|
|
out dx,ax
|
|
mov cx,40
|
|
rep movsw
|
|
|
|
pop si
|
|
pop cx
|
|
loop convertpcx
|
|
|
|
mov bx,handle
|
|
call closefile
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Readabyte proc near
|
|
|
|
cmp si,30000
|
|
jnz notendblock
|
|
push bx es di ds si
|
|
call readoneblock
|
|
pop si ds di es bx
|
|
mov si,0
|
|
notendblock: lodsb
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Readoneblock proc near
|
|
|
|
mov bx,handle
|
|
mov ah,3fh
|
|
mov ds,workspace
|
|
mov ah,3fh
|
|
mov cx,30000
|
|
mov dx,0
|
|
int 21h
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Loadpalfromiff proc near
|
|
|
|
mov dx,offset cs:palettescreen
|
|
call openfile
|
|
mov cx,2000
|
|
mov ds,mapstore
|
|
mov dx,0
|
|
call readfromfile
|
|
call closefile
|
|
mov es,buffers
|
|
mov di,maingamepal
|
|
mov ds,mapstore
|
|
mov si,30h
|
|
mov cx,768
|
|
palloop: lodsb
|
|
shr al,1
|
|
shr al,1
|
|
|
|
cmp brightness,1
|
|
jnz nought
|
|
cmp al,0
|
|
jz nought
|
|
mov ah,al
|
|
shr ah,1
|
|
add al,ah
|
|
shr ah,1
|
|
add al,ah
|
|
cmp al,64
|
|
jc nought
|
|
mov al,63
|
|
|
|
nought: stosb
|
|
loop palloop
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Setmode proc near
|
|
|
|
call vsync
|
|
mov ah,12h
|
|
mov al,1
|
|
mov bl,33h
|
|
int 10h
|
|
|
|
mov ah,0
|
|
mov al,13h
|
|
int 10h
|
|
|
|
mov al,6 ; sets graphic controller
|
|
mov dx,3ceh ; register 6 (MM) to 1 - 64K
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,11110011b
|
|
or al,00000100b
|
|
out dx,al
|
|
|
|
mov al,4 ; sets sequencer
|
|
mov dx,3c4h ; register 4 (EM) to 1 - >64K
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,11111101b
|
|
or al,00000010b
|
|
out dx,al
|
|
|
|
mov al,13h ;give screen 16 extra hidden
|
|
mov dx,3d4h ;pixels at one side
|
|
out dx,al
|
|
inc dx
|
|
mov al,screenwidth/8 ; width of screen
|
|
out dx,al
|
|
|
|
mov al,8h
|
|
mov dx,3d4h
|
|
out dx,al
|
|
inc dx
|
|
mov al,00000000b
|
|
out dx,al
|
|
|
|
mov al,11h
|
|
mov dx,3d4h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
or al,128
|
|
out dx,al
|
|
|
|
mov al,00
|
|
mov dx,3d4h
|
|
out dx,al
|
|
inc dx
|
|
mov al,3fh
|
|
out dx,al
|
|
mov al,01
|
|
mov dx,3d4h
|
|
out dx,al
|
|
inc dx
|
|
mov al,3fh
|
|
out dx,al
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Cls proc near
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov di,0
|
|
mov cx,7fffh
|
|
mov ax,0
|
|
rep stosw
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Printundermon proc near ;prints workspace through the text
|
|
|
|
mov si,(screenwidth*43)+76
|
|
mov di,si
|
|
mov es,workspace
|
|
add si,8*screenwidth
|
|
mov dx,0a000h
|
|
mov ds,dx
|
|
mov cx,104
|
|
scrollmonloop1: push cx di si
|
|
mov cx,170
|
|
scrollmonloop2: lodsb
|
|
cmp al,231
|
|
jnc dontplace
|
|
placeit: stosb
|
|
loop scrollmonloop2
|
|
jmp finmonscroll
|
|
dontplace: inc di
|
|
loop scrollmonloop2
|
|
|
|
finmonscroll: pop si di cx
|
|
add si,screenwidth
|
|
add di,screenwidth
|
|
loop scrollmonloop1
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Worktoscreen proc near
|
|
|
|
call vsync
|
|
mov si,0
|
|
mov di,0
|
|
mov cx,25
|
|
mov ds,workspace
|
|
mov dx,0a000h
|
|
mov es,dx
|
|
|
|
dumpallloop: call width160
|
|
call width160
|
|
call width160
|
|
call width160
|
|
call width160
|
|
call width160
|
|
call width160
|
|
call width160
|
|
loop dumpallloop
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
;Worktoscreen2 proc near
|
|
;
|
|
; call showpointer
|
|
;
|
|
; mov ds,workspace
|
|
; mov dx,0a000h
|
|
; mov es,dx
|
|
;
|
|
; mov si,320-16
|
|
; mov di,320-16
|
|
; mov bl,33
|
|
; mov cx,16
|
|
;screen2loop1: push di si cx
|
|
; call vsync
|
|
; cmp bl,21
|
|
; jc screen2loop2
|
|
; sub cx,16
|
|
; jz isoneblock
|
|
;screen2loop2: movsw
|
|
; movsw
|
|
; movsw
|
|
; movsw
|
|
; movsw
|
|
; movsw
|
|
; movsw
|
|
; movsw
|
|
; add di,320-15
|
|
; add si,320-15
|
|
; loop screen2loop2
|
|
;isoneblock: mov cx,16
|
|
; mov ax,320-15
|
|
;oneblockloop: push cx
|
|
; rep movsb
|
|
; pop cx
|
|
; add si,ax
|
|
; add di,ax
|
|
; inc ax
|
|
; loop oneblockloop
|
|
;
|
|
; pop cx si di
|
|
; add cx,16
|
|
; cmp cx,200
|
|
; jc itsallright
|
|
; mov cx,200
|
|
;itsallright: sub si,16
|
|
; sub di,16
|
|
; dec bl
|
|
; jnz screen2loop1
|
|
;
|
|
; call delpointer
|
|
; ret
|
|
;
|
|
; endp
|
|
;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
|
|
|
|
Paneltomap proc near
|
|
|
|
mov di,mapxstart
|
|
add di,mapadx
|
|
mov bx,mapystart
|
|
add bx,mapady
|
|
mov ds,mapstore
|
|
mov si,0
|
|
mov cl,mapxsize
|
|
mov ch,mapysize
|
|
call multiget
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Maptopanel proc near
|
|
|
|
mov di,mapxstart
|
|
add di,mapadx
|
|
mov bx,mapystart
|
|
add bx,mapady
|
|
mov ds,mapstore
|
|
mov si,0
|
|
mov cl,mapxsize
|
|
mov ch,mapysize
|
|
call multiput
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Dumpmap proc near
|
|
|
|
mov di,mapxstart
|
|
add di,mapadx
|
|
mov bx,mapystart
|
|
add bx,mapady
|
|
mov cl,mapxsize
|
|
mov ch,mapysize
|
|
call multidump
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Pixelcheckset proc near ;al=x, ah=y, es:bx=setlist pos
|
|
;checks exact pixel in a frame
|
|
push ax
|
|
sub al,[es:bx] ;for detection.
|
|
sub ah,[es:bx+1] ;al,ah now holds offset within
|
|
;the frame
|
|
push es bx cx ax
|
|
mov al,[es:bx+4] ;object number
|
|
call getsetad
|
|
mov al,[es:bx+17] ;finds frame number
|
|
mov es,setframes
|
|
mov bx,framedata
|
|
mov ah,0
|
|
mov cx,6
|
|
mul cx
|
|
add bx,ax ;get data for this frame in es:bx
|
|
pop ax
|
|
|
|
push ax
|
|
mov al,ah
|
|
mov ah,0
|
|
mov cl,[es:bx]
|
|
mov ch,0
|
|
mul cx
|
|
pop cx
|
|
mov ch,0
|
|
add ax,cx ;ax now holds offset from corner
|
|
;of the frame
|
|
add ax,[es:bx+2]
|
|
mov bx,ax ;es:bx now holds offset of pixel!
|
|
add bx,frames
|
|
|
|
mov al,[es:bx]
|
|
mov dl,al
|
|
pop cx bx es ax
|
|
cmp dl,0
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Createpanel proc near
|
|
|
|
mov di,0
|
|
mov bx,8
|
|
mov ds,icons2
|
|
mov al,0
|
|
mov ah,2
|
|
call showframe ;spritef
|
|
mov di,160
|
|
mov bx,8
|
|
mov ds,icons2
|
|
mov al,0
|
|
mov ah,2
|
|
call showframe ;spritef
|
|
mov di,0
|
|
mov bx,104
|
|
mov ds,icons2
|
|
mov al,0
|
|
mov ah,2
|
|
call showframe ;spritef
|
|
mov di,160
|
|
mov bx,104
|
|
mov ds,icons2
|
|
mov al,0
|
|
mov ah,2
|
|
call showframe ;spritef
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Createpanel2 proc near
|
|
|
|
call createpanel
|
|
mov di,0
|
|
mov bx,0
|
|
mov ds,icons2
|
|
mov al,5
|
|
mov ah,2
|
|
call showframe
|
|
mov di,160
|
|
mov bx,0
|
|
mov ds,icons2
|
|
mov al,5
|
|
mov ah,2
|
|
call showframe
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;Showspritef proc near
|
|
;
|
|
; mov ax,bx
|
|
; mov bx,screenwidth
|
|
; mul bx
|
|
; add di,ax
|
|
; mov dx,screenwidth
|
|
; mov es,workspace
|
|
; mov si,2080
|
|
; mov ah,0
|
|
; add ax,ax
|
|
; mov bx,ax
|
|
; add ax,ax
|
|
; add bx,ax
|
|
; add si,[bx+2]
|
|
; mov cx,[bx+0]
|
|
;spritefloop: push cx di
|
|
; call width80
|
|
; pop di cx
|
|
; add di,dx
|
|
; dec ch
|
|
; jnz spritefloop
|
|
; ret
|
|
;
|
|
; endp
|
|
;
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Clearwork proc near
|
|
|
|
mov ax,0h
|
|
mov es,workspace
|
|
mov di,0
|
|
mov cx,(200*320)/64
|
|
clearloop: stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
loop clearloop
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Vsync proc near
|
|
|
|
push ax bx cx dx si di ds es
|
|
|
|
mov dx,03dah
|
|
loop2: in al,dx
|
|
test al,8
|
|
jz loop2
|
|
loop1: in al,dx
|
|
test al,8
|
|
jnz loop1
|
|
|
|
call doshake
|
|
call dofade
|
|
if debuglevel2
|
|
call debugkeys
|
|
endif
|
|
pop es ds di si dx cx bx ax
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Doshake proc near
|
|
|
|
cmp shakecounter,48
|
|
jz finishshake
|
|
inc shakecounter
|
|
mov bl,shakecounter
|
|
mov bh,0
|
|
add bx,offset cs:shaketable
|
|
mov al,10h
|
|
mov dx,3d4h
|
|
out dx,al
|
|
inc dx
|
|
mov al,[cs:bx]
|
|
out dx,al
|
|
finishshake: ret
|
|
|
|
shaketable: db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9eh
|
|
db 9ch,9ah,9fh,9ah,9ch,9eh,0a0h,9bh,9dh,99h,9fh,9ch
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Zoom proc near
|
|
|
|
cmp watchingtime,0
|
|
jnz inwatching
|
|
cmp zoomon,1
|
|
jz zoomswitch
|
|
inwatching: ret
|
|
|
|
zoomswitch: cmp commandtype,199
|
|
jc zoomit
|
|
cantzoom: call putunderzoom
|
|
ret
|
|
|
|
zoomit: mov ax,oldpointery
|
|
sub ax,9
|
|
mov cx,screenwidth
|
|
mul cx
|
|
add ax,oldpointerx
|
|
sub ax,11
|
|
mov si,ax
|
|
|
|
mov ax,zoomy+4
|
|
mov cx,screenwidth
|
|
mul cx
|
|
add ax,zoomx+5
|
|
mov di,ax
|
|
mov es,workspace
|
|
mov ds,workspace
|
|
|
|
mov cx,20
|
|
zoomloop: push cx
|
|
mov cx,23
|
|
zoomloop2: lodsb
|
|
mov ah,al
|
|
stosw
|
|
mov [es:di+screenwidth-2],ax
|
|
loop zoomloop2
|
|
add si,screenwidth-23
|
|
add di,screenwidth-46+screenwidth
|
|
pop cx
|
|
loop zoomloop
|
|
|
|
call crosshair
|
|
mov didzoom,1
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Delthisone proc near
|
|
|
|
push ax
|
|
push ax
|
|
mov al,ah
|
|
mov ah,0
|
|
add ax,mapady
|
|
mov bx,screenwidth
|
|
mul bx
|
|
pop bx
|
|
mov bh,0
|
|
add bx,mapadx
|
|
add ax,bx
|
|
mov di,ax
|
|
pop ax
|
|
push ax
|
|
mov al,ah
|
|
mov ah,0
|
|
mov bx,22*8
|
|
mul bx
|
|
pop bx
|
|
mov bh,0
|
|
add ax,bx
|
|
mov si,ax
|
|
|
|
mov es,workspace
|
|
mov ds,mapstore
|
|
mov dl,cl
|
|
mov dh,0
|
|
mov ax,screenwidth
|
|
sub ax,dx
|
|
neg dx
|
|
add dx,22*8
|
|
deloneloop: push cx
|
|
mov ch,0
|
|
rep movsb
|
|
pop cx
|
|
add di,ax
|
|
add si,dx
|
|
dec ch
|
|
jnz deloneloop
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------Pointer update----
|
|
|
|
|
|
Multiget proc near ;di,bx = dest x,y
|
|
;cl,ch = size
|
|
mov ax,bx ;si,di = storage
|
|
mov bx,screenwidth
|
|
mul bx
|
|
add di,ax
|
|
|
|
mov es,workspace
|
|
push es ds
|
|
pop es ds
|
|
xchg di,si
|
|
mov al,cl
|
|
mov ah,0
|
|
mov dx,screenwidth
|
|
sub dx,ax
|
|
|
|
mov al,cl
|
|
and al,1
|
|
jnz oddwidth2
|
|
|
|
mov bl,cl
|
|
mov bh,0
|
|
mov ax,offset cs:width0
|
|
shr bx,1
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop3: call ax
|
|
add si,dx
|
|
loop multiloop3
|
|
ret
|
|
|
|
oddwidth2: mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop4: call ax
|
|
movsb
|
|
add si,dx
|
|
loop multiloop4
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Multiput proc near ;di,bx = dest x,y
|
|
;cl,ch = size
|
|
mov ax,bx ;si,di = storage
|
|
mov bx,screenwidth
|
|
mul bx
|
|
add di,ax
|
|
|
|
mov es,workspace
|
|
mov al,cl
|
|
mov ah,0
|
|
mov dx,screenwidth
|
|
sub dx,ax
|
|
|
|
mov al,cl
|
|
and al,1
|
|
jnz oddwidth3
|
|
|
|
mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop5: call ax
|
|
add di,dx
|
|
loop multiloop5
|
|
ret
|
|
|
|
oddwidth3: mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop6: call ax
|
|
movsb
|
|
add di,dx
|
|
loop multiloop6
|
|
ret
|
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Multidump proc near ;di,bx = dest x,y
|
|
;cl,ch = size
|
|
mov dx,0a000h
|
|
mov es,dx
|
|
mov ds,workspace
|
|
|
|
mov ax,bx
|
|
mov bx,screenwidth
|
|
mul bx
|
|
add di,ax
|
|
mov dx,screenwidth
|
|
mov si,di
|
|
|
|
mov al,cl
|
|
and al,1
|
|
jnz oddwidth
|
|
|
|
mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov bl,cl
|
|
mov bh,0
|
|
neg bx
|
|
add bx,dx
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop1: call ax
|
|
add di,bx
|
|
add si,bx
|
|
loop multiloop1
|
|
ret
|
|
|
|
oddwidth: mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov bl,cl
|
|
mov bh,0
|
|
neg bx
|
|
add bx,screenwidth
|
|
mov cl,ch
|
|
mov ch,0
|
|
multiloop2: call ax
|
|
movsb
|
|
add di,bx
|
|
add si,bx
|
|
loop multiloop2
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Width160 proc near
|
|
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
width128: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
width110: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
width88: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
width80: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
width63: movsw
|
|
width62: movsw
|
|
width61: movsw
|
|
width60: movsw
|
|
width59: movsw
|
|
width58: movsw
|
|
width57: movsw
|
|
width56: movsw
|
|
width55: movsw
|
|
width54: movsw
|
|
width53: movsw
|
|
width52: movsw
|
|
width51: movsw
|
|
width50: movsw
|
|
width49: movsw
|
|
width48: movsw
|
|
width47: movsw
|
|
width46: movsw
|
|
width45: movsw
|
|
width44: movsw
|
|
width43: movsw
|
|
width42: movsw
|
|
width41: movsw
|
|
width40: movsw
|
|
width39: movsw
|
|
width38: movsw
|
|
width37: movsw
|
|
width36: movsw
|
|
width35: movsw
|
|
width34: movsw
|
|
width33: movsw
|
|
width32: movsw
|
|
width31: movsw
|
|
width30: movsw
|
|
width29: movsw
|
|
width28: movsw
|
|
width27: movsw
|
|
width26: movsw
|
|
width25: movsw
|
|
width24: movsw
|
|
width23: movsw
|
|
width22: movsw
|
|
width21: movsw
|
|
width20: movsw
|
|
width19: movsw
|
|
width18: movsw
|
|
width17: movsw
|
|
width16: movsw
|
|
width15: movsw
|
|
width14: movsw
|
|
width13: movsw
|
|
width12: movsw
|
|
width11: movsw
|
|
width10: movsw
|
|
width9: movsw
|
|
width8: movsw
|
|
width7: movsw
|
|
width6: movsw
|
|
width5: movsw
|
|
width4: movsw
|
|
width3: movsw
|
|
width2: movsw
|
|
width1: movsw
|
|
width0: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Doblocks proc near
|
|
|
|
mov es,workspace
|
|
mov ax,mapady
|
|
mov cx,screenwidth
|
|
mul cx
|
|
mov di,mapadx
|
|
add di,ax
|
|
|
|
mov al,mapy
|
|
mov ah,0
|
|
mov bx,mapwidth
|
|
mul bx
|
|
mov bl,mapx
|
|
mov bh,0
|
|
add ax,bx
|
|
|
|
mov si,map
|
|
add si,ax
|
|
|
|
mov cx,10
|
|
loop120: push di cx
|
|
mov cx,11
|
|
loop124: push cx di
|
|
|
|
mov ds,mapdata
|
|
lodsb
|
|
mov ds,backdrop
|
|
|
|
push si
|
|
cmp al,0
|
|
jz zeroblock
|
|
mov ah,al
|
|
mov al,0
|
|
mov si,blocks
|
|
add si,ax
|
|
mov bh,14
|
|
|
|
|
|
mov bh,4
|
|
firstbitofblock: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
add di,screenwidth-16
|
|
dec bh
|
|
jnz firstbitofblock
|
|
|
|
mov bh,12
|
|
loop125: movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
movsw
|
|
mov ax,0dfdfh
|
|
stosw
|
|
stosw
|
|
|
|
add di,screenwidth-20
|
|
dec bh
|
|
jnz loop125
|
|
|
|
add di,4
|
|
mov ax,0dfdfh
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
add di,screenwidth-16
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
add di,screenwidth-16
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
add di,screenwidth-16
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
stosw
|
|
|
|
|
|
zeroblock: pop si
|
|
|
|
pop di cx
|
|
add di,16
|
|
loop loop124
|
|
add si,mapwidth-11
|
|
pop cx di
|
|
add di,screenwidth*16
|
|
loop loop120
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------General sprite output routine----
|
|
|
|
Showframe proc near ; shows a frame from sprites
|
|
|
|
push dx ax ; es=destination
|
|
mov cx,ax ; ds=source
|
|
and cx,511 ; di=x, bx=y
|
|
add cx,cx ; al=frame number
|
|
mov si,cx ; ah=effects flag
|
|
add cx,cx
|
|
add si,cx
|
|
cmp word ptr [si],0
|
|
jnz notblankshow
|
|
pop ax dx
|
|
mov cx,0
|
|
ret
|
|
|
|
notblankshow: test ah,128
|
|
jnz skipoffsets
|
|
mov al,[si+4]
|
|
mov ah,0
|
|
add di,ax
|
|
mov al,[si+5]
|
|
mov ah,0
|
|
add bx,ax
|
|
skipoffsets: mov cx,[si+0]
|
|
mov ax,[si+2]
|
|
add ax,2080
|
|
mov si,ax
|
|
pop ax dx
|
|
cmp ah,0
|
|
jz noeffects
|
|
|
|
test ah,128
|
|
jz notcentred
|
|
push ax
|
|
mov al,cl
|
|
mov ah,0
|
|
shr ax,1
|
|
sub di,ax
|
|
mov al,ch
|
|
mov ah,0
|
|
shr ax,1
|
|
sub bx,ax
|
|
pop ax
|
|
|
|
notcentred: test ah,64
|
|
jz notdiffdest
|
|
push cx
|
|
call frameoutfx
|
|
pop cx
|
|
ret
|
|
|
|
notdiffdest: test ah,8
|
|
jz notprintlist
|
|
push ax
|
|
mov ax,di
|
|
sub ax,mapadx
|
|
push bx
|
|
sub bx,mapady
|
|
mov ah,bl
|
|
pop bx
|
|
;call addtoprintlist
|
|
pop ax
|
|
|
|
notprintlist: test ah,4
|
|
jz notflippedx
|
|
mov dx,screenwidth
|
|
mov es,workspace
|
|
push cx
|
|
call frameoutfx
|
|
pop cx
|
|
ret
|
|
|
|
notflippedx: test ah,2
|
|
jz notnomask
|
|
mov dx,screenwidth
|
|
mov es,workspace
|
|
push cx
|
|
call frameoutnm
|
|
pop cx
|
|
ret
|
|
|
|
notnomask: test ah,32
|
|
jz noeffects
|
|
mov dx,screenwidth
|
|
mov es,workspace
|
|
push cx
|
|
call frameoutbh
|
|
pop cx
|
|
ret
|
|
|
|
noeffects: mov dx,screenwidth
|
|
mov es,workspace
|
|
push cx
|
|
call frameoutv
|
|
pop cx ; returns size printed in cx
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Frameoutv proc near
|
|
|
|
push dx
|
|
mov ax,bx
|
|
mov bx,dx
|
|
mul bx
|
|
add di,ax
|
|
pop dx
|
|
|
|
push cx
|
|
mov ch,0
|
|
sub dx,cx
|
|
pop cx
|
|
|
|
frameloop1: push cx
|
|
mov ch,0
|
|
|
|
frameloop2: lodsb
|
|
cmp al,0
|
|
jnz backtosolid
|
|
backtoother: inc di
|
|
loop frameloop2
|
|
pop cx
|
|
add di,dx
|
|
dec ch
|
|
jnz frameloop1
|
|
ret
|
|
|
|
frameloop3: lodsb
|
|
cmp al,0
|
|
jz backtoother
|
|
backtosolid: stosb
|
|
loop frameloop3
|
|
pop cx
|
|
add di,dx
|
|
dec ch
|
|
jnz frameloop1
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Frameoutnm proc near
|
|
|
|
push dx
|
|
mov ax,bx
|
|
mov bx,dx
|
|
mul bx
|
|
add di,ax
|
|
pop dx
|
|
|
|
push cx
|
|
mov ch,0
|
|
sub dx,cx
|
|
pop cx
|
|
|
|
mov al,cl
|
|
and al,1
|
|
jnz oddwidthframe
|
|
|
|
mov bl,cl
|
|
mov bh,0
|
|
mov ax,offset cs:width0
|
|
shr bx,1
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
nmloop1: call ax
|
|
add di,dx
|
|
loop nmloop1
|
|
ret
|
|
|
|
oddwidthframe: mov bl,cl
|
|
mov bh,0
|
|
shr bx,1
|
|
mov ax,offset cs:width0
|
|
sub ax,bx
|
|
mov cl,ch
|
|
mov ch,0
|
|
nmloop2: call ax
|
|
movsb
|
|
add di,dx
|
|
loop nmloop2
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Frameoutbh proc near
|
|
|
|
push dx
|
|
mov ax,bx
|
|
mov bx,dx
|
|
mul bx
|
|
add di,ax
|
|
pop dx
|
|
|
|
push cx
|
|
mov ch,0
|
|
sub dx,cx
|
|
pop cx
|
|
|
|
bhloop2: push cx
|
|
mov ch,0
|
|
mov ah,255
|
|
bhloop1: cmp [es:di],ah
|
|
jnz nofill
|
|
movsb
|
|
loop bhloop1
|
|
jmp nextline
|
|
nofill: inc di
|
|
inc si
|
|
loop bhloop1
|
|
nextline: add di,dx
|
|
pop cx
|
|
dec ch
|
|
jnz bhloop2
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Frameoutfx proc near
|
|
|
|
push dx
|
|
mov ax,bx
|
|
mov bx,dx
|
|
mul bx
|
|
add di,ax
|
|
pop dx
|
|
|
|
push cx
|
|
mov ch,0
|
|
add dx,cx
|
|
pop cx
|
|
|
|
frameloopfx1: push cx
|
|
mov ch,0
|
|
|
|
frameloopfx2: lodsb
|
|
cmp al,0
|
|
jnz backtosolidfx
|
|
backtootherfx: dec di
|
|
loop frameloopfx2
|
|
pop cx
|
|
add di,dx
|
|
dec ch
|
|
jnz frameloopfx1
|
|
ret
|
|
|
|
frameloopfx3: lodsb
|
|
cmp al,0
|
|
jz backtootherfx
|
|
backtosolidfx: mov [es:di],al
|
|
dec di
|
|
loop frameloopfx3
|
|
pop cx
|
|
add di,dx
|
|
dec ch
|
|
jnz frameloopfx1
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------Transfers for extra data----
|
|
|
|
Transferinv proc near
|
|
|
|
mov di,exframepos
|
|
push di
|
|
mov al,expos
|
|
mov ah,0
|
|
mov bx,ax
|
|
add ax,ax
|
|
add ax,bx
|
|
inc ax
|
|
mov cx,6
|
|
mul cx
|
|
mov es,extras
|
|
mov bx,exframedata
|
|
add bx,ax
|
|
add di,exframes
|
|
|
|
push bx
|
|
mov al,itemtotran
|
|
mov ah,0
|
|
mov bx,ax
|
|
add ax,ax
|
|
add ax,bx
|
|
inc ax
|
|
mov cx,6
|
|
mul cx
|
|
mov ds,freeframes
|
|
mov bx,frframedata
|
|
add bx,ax
|
|
mov si,frframes
|
|
mov al,[bx]
|
|
mov ah,0
|
|
mov cl,[bx+1]
|
|
mov ch,0
|
|
add si,[bx+2] ;we have si, and length
|
|
mov dx,[bx+4]
|
|
pop bx
|
|
mov [es:bx+0],al
|
|
mov [es:bx+1],cl
|
|
mov [es:bx+4],dx
|
|
|
|
mul cx
|
|
mov cx,ax
|
|
push cx
|
|
rep movsb
|
|
pop cx
|
|
pop ax
|
|
mov [es:bx+2],ax
|
|
add exframepos,cx
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Transfermap proc near
|
|
|
|
mov di,exframepos
|
|
push di
|
|
mov al,expos
|
|
mov ah,0
|
|
mov bx,ax
|
|
add ax,ax
|
|
add ax,bx
|
|
mov cx,6
|
|
mul cx
|
|
mov es,extras
|
|
mov bx,exframedata
|
|
add bx,ax
|
|
add di,exframes
|
|
|
|
push bx
|
|
mov al,itemtotran
|
|
mov ah,0
|
|
mov bx,ax
|
|
add ax,ax
|
|
add ax,bx
|
|
mov cx,6
|
|
mul cx
|
|
mov ds,freeframes
|
|
mov bx,frframedata
|
|
add bx,ax
|
|
mov si,frframes
|
|
mov al,[bx]
|
|
mov ah,0
|
|
mov cl,[bx+1]
|
|
mov ch,0
|
|
add si,[bx+2] ;we have si, and length
|
|
mov dx,[bx+4]
|
|
pop bx
|
|
mov [es:bx+0],al
|
|
mov [es:bx+1],cl
|
|
mov [es:bx+4],dx
|
|
|
|
mul cx
|
|
mov cx,ax
|
|
push cx
|
|
rep movsb
|
|
pop cx
|
|
pop ax
|
|
mov [es:bx+2],ax
|
|
add exframepos,cx
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
;------------------------------------------------------------------Filenames----
|
|
|
|
|
|
Spritename1 db "DREAMWEB.S00",0
|
|
Spritename3 db "DREAMWEB.S02",0
|
|
|
|
Idname db "INSTALL.DAT",0
|
|
|
|
Characterset1 db "DREAMWEB.C00",0
|
|
Characterset2 db "DREAMWEB.C01",0
|
|
Characterset3 db "DREAMWEB.C02",0
|
|
|
|
Samplename db "DREAMWEB.V00",0
|
|
|
|
Basicsample db "DREAMWEB.V99",0
|
|
|
|
Icongraphics0 db "DREAMWEB.G00",0
|
|
Icongraphics1 db "DREAMWEB.G01",0
|
|
Extragraphics1 db "DREAMWEB.G02",0
|
|
Icongraphics8 db "DREAMWEB.G08",0
|
|
Mongraphicname db "DREAMWEB.G03",0
|
|
Mongraphics2 db "DREAMWEB.G07",0
|
|
Cityname db "DREAMWEB.G04",0
|
|
Travelgraphic1 db "DREAMWEB.G05",0
|
|
Travelgraphic2 db "DREAMWEB.G06",0
|
|
Diarygraphic db "DREAMWEB.G14",0
|
|
|
|
Monitorfile1 db "DREAMWEB.T01",0
|
|
Monitorfile2 db "DREAMWEB.T02",0
|
|
Monitorfile10 db "DREAMWEB.T10",0 ;News items 10-13
|
|
Monitorfile11 db "DREAMWEB.T11",0
|
|
Monitorfile12 db "DREAMWEB.T12",0
|
|
Monitorfile13 db "DREAMWEB.T13",0
|
|
Monitorfile20 db "DREAMWEB.T20",0
|
|
Monitorfile21 db "DREAMWEB.T21",0 ;Ryan's private stuff
|
|
Monitorfile22 db "DREAMWEB.T22",0 ;Use for blank carts
|
|
Monitorfile23 db "DREAMWEB.T23",0 ;Use for edens cart
|
|
Monitorfile24 db "DREAMWEB.T24",0 ;Use for church cart
|
|
Foldertext db "DREAMWEB.T50",0
|
|
Diarytext db "DREAMWEB.T51",0
|
|
Puzzletextname db "DREAMWEB.T80",0 ;puzzle text
|
|
Traveltextname db "DREAMWEB.T81",0 ;location descriptions
|
|
Introtextname db "DREAMWEB.T82",0 ;intro sequence
|
|
Endtextname db "DREAMWEB.T83",0 ;end sequence/credits
|
|
Commandtextname db "DREAMWEB.T84",0 ;commands
|
|
|
|
Volumetabname db "DREAMWEB.VOL",0
|
|
|
|
Foldergraphic1 db "DREAMWEB.G09",0
|
|
Foldergraphic2 db "DREAMWEB.G10",0
|
|
Foldergraphic3 db "DREAMWEB.G11",0
|
|
Symbolgraphic db "DREAMWEB.G12",0
|
|
Gungraphic db "DREAMWEB.G13",0
|
|
Monkface db "DREAMWEB.G15",0
|
|
|
|
Title0graphics db "DREAMWEB.I00",0
|
|
Title1graphics db "DREAMWEB.I01",0
|
|
Title2graphics db "DREAMWEB.I02",0
|
|
Title3graphics db "DREAMWEB.I03",0
|
|
Title4graphics db "DREAMWEB.I04",0
|
|
Title5graphics db "DREAMWEB.I05",0
|
|
Title6graphics db "DREAMWEB.I06",0
|
|
Title7graphics db "DREAMWEB.I07",0
|
|
|
|
Palettescreen db "DREAMWEB.PAL",0
|