brender-1997/pentprim/rastbuff.asm
2022-05-03 14:31:40 -07:00

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