
cmdo1max equ 15 ;##??
cmdo2	LABEL WORD ;commads 77##
	dw	OFFSET cmd700
	dw	OFFSET cmd701
	dw	OFFSET cmd702
	dw	OFFSET nrserr;cmd703
	dw	OFFSET nrserr;cmd704
	dw	OFFSET cmd705
	dw	OFFSET cmd706
	dw	OFFSET cmd707
	dw	OFFSET cmd708
	dw	OFFSET cmd709
	dw	OFFSET cmd70a
	dw	OFFSET cmd70b
	dw	OFFSET nrserr;cmd70c
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET cmd710
	dw	OFFSET cmd711
	dw	OFFSET cmd712
	dw	OFFSET cmd713
	dw	OFFSET cmd714
	dw	OFFSET cmd715
	dw	OFFSET cmd716
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET cmd719
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET nrserr
	dw	OFFSET cmd71F
	dw	OFFSET cmd720
	dw	OFFSET cmd721
	dw	OFFSET cmd722
cmdo2max equ 22h

ALIGN 2
nrscount dw	0
nrsbase	 dw	0
docmd_dssi PROC NEAR
	push	cs:[nrscount]
	inc	ax
	mov	cs:nrscount,ax
nrsl:	;nodeloop, entered also by goto
	dec	cs:nrscount
	jz	nrsret
	lodsw
	cmp	ah,77h
	je	nrs77
	cmp	ah,cmdo1max
	ja	nrserr
	cmp	ah,0
	je	cmd00
	call	nrs_poly
	jmp	nrsl
nrs77:	cmp	al,cmdo2max
	ja	nrserr
	mov	bl,al
	xor	bh,bh
	shl	bx,1
	jmp	cs:cmdo2[bx]
nrsret:	pop	cs:[nrscount]
	ret

nrserr: ;error, unknown block etc!
	sub	si,2
	mov	ax,ds:[si]
	int	3
	mov	cx,16
nrserr1: push	cx
	forcesetborder 1
	forcesetborder 15
	pop	cx
	loop	nrserr1
	
cmd00:	mov	ax,1 ;add this object to OBJD list
	jmp	nrsret

cmd700: ;goto
	mov	si,ds:[si]
	jmp	nrsl

cmd701: ;call
	push	si
	push	ds
	mov	si,ds:[si]
	call	donrsnode
	pop	ds
	pop	si
	add	si,2
	jmp	nrsl

cmd702: ;call multiple
	lodsw
	cmp	ax,-1
	je	nr7c1
	push	si
	push	ds
	mov	si,ax
	call	donrsnode
	pop	ds
	pop	si
	jmp	cmd702
nr7c1:	jmp	nrsl

cmd705:	;call just one command (no node push/pop/etc)
	lodsw
	push	si
	push	ds
	add	ax,cs:nrsbase
	mov	si,ax
	mov	ax,1 ;do just one command
	call	docmd_dssi
	pop	ds
	pop	si
	jmp	nrsl

cmd70a:	;call multiple one command (no node push/pop/etc)
	mov	cx,ds:[si]
	add	si,2
cm70a2:	push	cx
	lodsw
	push	si
	push	ds
	add	ax,cs:nrsbase
	mov	si,ax
	mov	ax,1 ;do just one command
	call	docmd_dssi
	pop	ds
	pop	si
	pop	cx
	loop	cm70a2
	jmp	nrsl

cmd706:	;set base offset
	mov	ax,si
	sub	ax,2
	mov	cs:nrsbase,ax
	jmp	nrsl

cmd707: ;goto/relative
	mov	si,ds:[si]
	add	si,cs:nrsbase
	jmp	nrsl

cmd708: lodsw
	or	cs:noflags,ax
	jmp	nrsl
	
cmd709: ;call NRS header equipped node
	push	si
	push	ds
	mov	si,ds:[si]
	call	donrswheader
	pop	ds
	pop	si
	add	si,2
	jmp	nrsl

cmd712: ;translate and move
cmd710: ;translate
	push	ax
	mov	di,OFFSET nmatrix
	call	rotateposition ;si=>rotatedx,y,z
	mov	eax,cs:rotatedx
	add	cs:nxpos,eax
	mov	eax,cs:rotatedy
	add	cs:nypos,eax
	mov	eax,cs:rotatedz
	add	cs:nzpos,eax

	mov	ebp,ds:[si+4]
	mov	dword ptr ds:[si+4],0
	mov	di,OFFSET nmatrix
	call	rotateposition ;si=>rotatedx,y,z
	mov	eax,cs:rotatedx
	add	cs:nxspos,eax
	mov	eax,cs:rotatedy
	add	cs:nyspos,eax
	mov	eax,cs:rotatedz
	add	cs:nzspos,eax
	mov	ds:[si+4],ebp

	add	si,12
	pop	ax
	cmp	al,12h
	jne	nr7d2
	mov	cx,cs:_framestaken
cm710b:	mov	eax,ds:[si]
	add	ds:[si-3*4],eax	
	mov	eax,ds:[si+4]
	add	ds:[si-2*4],eax	
	mov	eax,ds:[si+8]
	add	ds:[si-1*4],eax	
	loop	cm710b
	add	si,12
nr7d2:	jmp	nrsl

cmd711: ;rotate ZR*YR*XR
	push	si
	push	ds
	mov	ax,ds:[si+0]
	mov	bx,ds:[si+2]
	mov	cx,ds:[si+4]
	cmp	ax,0
	jne	nr7e1
	cmp	bx,0
	jne	nr7e1
	cmp	cx,0
	jne	nr7e1
	jmp	nr7e2
nr7e1:	cmp	ax,ds:[si+6]
	jne	nr7e3
	cmp	bx,ds:[si+8]
	jne	nr7e3
	cmp	cx,ds:[si+10]
	jne	nr7e3
	mov	ax,ds
	mov	es,ax
	mov	di,si
	add	di,12
	jmp	nr7e4
nr7e3:	mov	ds:[si+6],ax
	mov	ds:[si+8],bx
	mov	ds:[si+10],cx
	mov	di,si
	add	di,12
	call	calcmatrix ;ds:si=src(rx,ry,rz) => ds:di=dest
	mov	ax,ds
	mov	es,ax
nr7e4:	mov	si,OFFSET nmatrix
	mov	ax,cs
	mov	ds,ax
	call	mulmatrices
nr7e2:	pop	ds
	pop	si
	add	si,6+6+9*2
	jmp	nrsl

cmd719: ;simplex precalced zsort jmp
	mov	cx,ds:[si]
	add	si,2
	mov	edx,32767
cm719b:	mov	ebx,ds:[si]
	shl	bx,pointshl
	push	edx
	mov	eax,dword ptr cs:point[PX+bx] ;X
	imul	eax
	mov	edi,eax
	mov	eax,dword ptr cs:point[PY+bx] ;Y
	imul	eax
	add	edi,eax
	mov	eax,dword ptr cs:point[PZ+bx] ;Z
	imul	eax
	add	edi,eax
	sar	edi,16
	mov	bx,di
	pop	edx
	cmp	bx,dx
	jg	cm719c
	mov	edx,ebx
cm719c:	add	si,4
	loop	cm719b
	shr	edx,16
	add	dx,cs:nrsbase
	mov	si,dx
	jmp	nrsl

cmd720: ;bounding box
	add	si,6
	call	initnrsobj
	jmp	nrsl

cmd721: ;points
	push	si
	push	ds
	mov	ax,cs
	mov	ds,ax
	mov	si,OFFSET nmatrix
	call	nwritematrix
	pop	ds
	pop	si
	mov	cx,ds:[si]
	add	si,2
	;calc
	push	cx
	push	ds
	push	si
	call	ncalcpoints ;cx,ds:si
	pop	si
	pop	ds
	pop	cx
	;add si
	shl	cx,1
	mov	dx,cx
	shl	cx,1
	add	cx,dx
	add	si,cx
	jmp	nrsl

cmd722: ;normals
	push	si
	push	ds
	mov	ax,cs
	mov	ds,ax
	mov	si,OFFSET nmatrix
	call	nwritematrix2
	pop	ds
	pop	si
	mov	cx,ds:[si]
	add	si,2
	;calc
	push	cx
	push	ds
	push	si
	call	ncalcpoints2 ;cx,ds:si
	pop	si
	pop	ds
	pop	cx
	;add si
	shl	cx,1
	mov	dx,cx
	shl	cx,1
	add	cx,dx
	add	si,cx
	jmp	nrsl

cmd70b: ;breakpoint
	int	3
	jmp	nrsl

cmd713: ;killer counter
	cmp	word ptr ds:[si],0
	jg	nr7k1
	mov	ax,0 ;do NOT add this object to OBJD list
	jmp	nrsret
nr7k1:	dec	word ptr ds:[si]
	add	si,2
	jmp	nrsl

cmd714: ;rotate ZR*YR*XR
	push	si
	push	ds
	mov	ax,ds
	mov	es,ax
	mov	di,si
	mov	si,OFFSET nmatrix
	mov	ax,cs
	mov	ds,ax
	call	mulmatrices
	pop	ds
	pop	si
	add	si,9*2
	jmp	nrsl

cmd715: ;far goto
	mov	bx,ds:[si]
	mov	ax,ds:[si+2]
	cmp	bx,0
	jne	cm715a
	cmp	ax,0
	jne	cm715a
	jmp	cmd00
cm715a:	mov	ds,ax
	mov	si,bx
	jmp	nrsl
	
cmd716: ;lightsource position
	push	ds
	push	si
	mov	di,OFFSET nmatrix
	call	rotateposition
	mov	eax,cs:rotatedx
	mov	ebx,cs:rotatedy
	mov	ecx,cs:rotatedz
	call	unify32
	shl	ax,6
	shl	bx,6
	shl	cx,6
	mov	cs:newlight[0],ax
	mov	cs:newlight[2],bx
	mov	cs:newlight[4],cx
	pop	si
	pop	ds
	add	si,12
	jmp	nrsl
	
cmd71F: ;set shadow level
	jmp	nrsl
docmd_dssi ENDP
