187 lines
3.3 KiB
NASM
187 lines
3.3 KiB
NASM
; Copyright (c) 1992,1993-1995 Argonaut Technologies Limited. All rights reserved.
|
|
;
|
|
; $Id: rastbuff.asm 1.2 1997/06/07 13:17:30 jon Exp $
|
|
; $Locker: $
|
|
;
|
|
; Rasteriser buffer system
|
|
;
|
|
; All rasterisers are entered with esp pointing at the triangle parameter block
|
|
; and exit by popping setup block from stack and jumping to next function
|
|
;
|
|
; XXX should rearrange this so that stack is built bottom to top, and then flushed -
|
|
; means that prims are rasterised in order
|
|
;
|
|
;
|
|
.586
|
|
.MMX
|
|
.model flat,c
|
|
|
|
; include iammx.inc
|
|
include drv.inc
|
|
include unpack.inc
|
|
|
|
include rastmacs.inc
|
|
|
|
.code
|
|
|
|
; void BR_ASM_CALL RasteriseBufferDone(void);
|
|
;
|
|
; Termination function for chain of rasterise blocks - restores original stack pointer and
|
|
; returns
|
|
;
|
|
RasteriseBufferDone proc
|
|
; Tidy up MMX
|
|
;
|
|
emms
|
|
|
|
; Reset rasterise stack pointer
|
|
;
|
|
mov eax,offset rasteriseBufferLast
|
|
|
|
mov esp,rasteriseBufferSaved
|
|
|
|
; Restore original stack pointer
|
|
;
|
|
mov rasteriseBufferTop,eax
|
|
|
|
pop ebx
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
|
|
ret
|
|
RasteriseBufferDone endp
|
|
|
|
|
|
RasteriseBufferExit proc
|
|
|
|
mov esp,rasteriseBufferSaved
|
|
|
|
pop ebx
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
|
|
ret
|
|
RasteriseBufferExit endp
|
|
|
|
|
|
; void BR_ASM_CALL RasteriseBufferDisable(void);
|
|
;
|
|
; Initialise rasterisation stack
|
|
;
|
|
RasteriseBufferDisable proc
|
|
|
|
mov eax,offset rasteriseBufferOff
|
|
mov rasteriseBufferTop,eax
|
|
ret
|
|
RasteriseBufferDisable endp
|
|
|
|
; void BR_ASM_CALL RasteriseBufferBegin(void);
|
|
;
|
|
; Initialise rasterisation stack
|
|
;
|
|
RasteriseBufferBegin proc
|
|
|
|
mov eax,offset rasteriseBufferLast
|
|
mov rasteriseBufferTop,eax
|
|
ret
|
|
RasteriseBufferBegin endp
|
|
|
|
; void BR_ASM_CALL RasteriseBufferEnd(void);
|
|
;
|
|
RasteriseBufferEnd proc
|
|
ret
|
|
RasteriseBufferEnd endp
|
|
|
|
; void * BR_ASM_CALL RasteriseBufferAllocate(br_size_t param_size,br_size_t work_size);
|
|
;
|
|
; Allocate workspace on the rasterise stack
|
|
;
|
|
RasteriseBufferAllocate proc uses esi edi ebx, param_size:dword, work_size:dword
|
|
|
|
; See how mush free space is left on stack
|
|
;
|
|
mov eax,offset rasteriseBuffer
|
|
mov edx,rasteriseBufferTop
|
|
|
|
sub edx,eax
|
|
|
|
cmp edx,work_size
|
|
jae no_flush
|
|
|
|
; Flush out existing stack
|
|
;
|
|
call RasteriseBufferFlush
|
|
|
|
|
|
no_flush: mov eax,rasteriseBufferTop
|
|
sub eax,param_size
|
|
mov rasteriseBufferTop,eax
|
|
ret
|
|
|
|
RasteriseBufferAllocate endp
|
|
|
|
; void BR_ASM_CALL RasteriseBufferFlush(void);
|
|
;
|
|
; Executes the current set of stacked rasterisation blocks
|
|
;
|
|
;
|
|
RasteriseBufferFlush proc
|
|
; Save registers on original stack
|
|
;
|
|
push ebp
|
|
push esi
|
|
push edi
|
|
push ebx
|
|
|
|
; Get pointer to top of rasterise stack
|
|
;
|
|
mov eax,rasteriseBufferTop
|
|
|
|
|
|
; Get pointer to first function
|
|
;
|
|
mov edx,[eax].tsb_header.function
|
|
|
|
; Save original stack pointer
|
|
;
|
|
mov rasteriseBufferSaved,esp
|
|
mov esp,eax
|
|
|
|
jmp edx
|
|
|
|
RasteriseBufferFlush endp
|
|
|
|
.data
|
|
|
|
|
|
; Stack of stored rasterisation blocks
|
|
;
|
|
public rasteriseBuffer
|
|
public rasteriseBufferTop
|
|
|
|
qword 40 dup(?) ; Leeway for workspace and stack frames
|
|
|
|
rasteriseBuffer qword 200 dup(?)
|
|
|
|
; Fake header that does nothing
|
|
;
|
|
rasteriseBufferOff dword RasteriseBufferExit
|
|
|
|
; Fake header that terminates stack
|
|
;
|
|
rasteriseBufferLast dword RasteriseBufferDone
|
|
|
|
; Pointer to current top of stack
|
|
;
|
|
rasteriseBufferTop dword rasteriseBufferLast
|
|
|
|
; Saved stack pointer during rasterisation
|
|
;
|
|
rasteriseBufferSaved dword 0
|
|
dword 0 ; Pad
|
|
|
|
|
|
end
|
|
|