153 lines
3.0 KiB
NASM
153 lines
3.0 KiB
NASM
; Catacomb 3-D Source Code
|
|
; Copyright (C) 1993-2014 Flat Rock Software
|
|
;
|
|
; This program is free software; you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation; either version 2 of the License, or
|
|
; (at your option) any later version.
|
|
;
|
|
; This program is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License along
|
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
IDEAL
|
|
MODEL MEDIUM,C
|
|
|
|
include "ID_ASM.EQU"
|
|
|
|
;===========================================================================
|
|
;
|
|
; SCALING GRAPHICS
|
|
;
|
|
;===========================================================================
|
|
|
|
|
|
|
|
MACRO MAKELAB NUM
|
|
|
|
lab&NUM:
|
|
|
|
ENDM
|
|
|
|
MACRO MAKEREF NUM
|
|
|
|
dw OFFSET lab&NUM
|
|
|
|
ENDM
|
|
|
|
|
|
;=========================================================================
|
|
|
|
MAXSCALES equ 256
|
|
|
|
DATASEG
|
|
|
|
EXTRN screenseg:WORD
|
|
EXTRN linewidth:WORD
|
|
|
|
LABEL endtable WORD
|
|
labcount = 0
|
|
REPT MAXSCALES
|
|
MAKEREF %labcount
|
|
labcount = labcount + 1
|
|
ENDM
|
|
|
|
|
|
CODESEG
|
|
|
|
;==================================================
|
|
;
|
|
; void scaleline (int scale, unsigned picseg, unsigned maskseg,
|
|
; unsigned screen, unsigned width)
|
|
;
|
|
;==================================================
|
|
|
|
PROC ScaleLine pixels:word, scaleptr:dword, picptr:dword, screen:word
|
|
USES si,di
|
|
PUBLIC ScaleLine
|
|
|
|
;
|
|
; modify doline procedure for proper width
|
|
;
|
|
mov bx,[pixels]
|
|
cmp bx,MAXSCALES
|
|
jbe @@scaleok
|
|
mov bx,MAXSCALES
|
|
@@scaleok:
|
|
shl bx,1
|
|
mov bx,[endtable+bx]
|
|
push [cs:bx] ;save the code that will be modified over
|
|
mov [WORD cs:bx],0d18eh ;mov ss,cx
|
|
push [cs:bx+2] ;save the code that will be modified over
|
|
mov [WORD cs:bx+2],90c3h ;ret / nop
|
|
push bx
|
|
|
|
mov dx,[linewidth]
|
|
|
|
mov di,[WORD screen]
|
|
mov es,[screenseg]
|
|
|
|
mov si,[WORD scaleptr]
|
|
mov ds,[WORD scaleptr+2]
|
|
|
|
mov bx,[WORD picptr]
|
|
mov ax,[WORD picptr+2] ;will be moved into ss after call
|
|
|
|
mov bp,bx
|
|
|
|
cli
|
|
call doline
|
|
sti
|
|
;
|
|
; restore doline to regular state
|
|
;
|
|
pop bx ;address of modified code
|
|
pop [cs:bx+2]
|
|
pop [cs:bx]
|
|
|
|
mov ax,ss
|
|
mov ds,ax
|
|
ret
|
|
|
|
;================
|
|
;
|
|
; doline
|
|
;
|
|
; Big unwound scaling routine
|
|
;
|
|
; ds:si = scale table
|
|
; ss:bx = pic data
|
|
; es:di = screen location
|
|
;
|
|
;================
|
|
|
|
doline:
|
|
|
|
mov cx,ss
|
|
mov ss,ax ;can't call a routine with ss used...
|
|
|
|
labcount = 0
|
|
|
|
REPT MAXSCALES
|
|
|
|
MAKELAB %labcount
|
|
labcount = labcount + 1
|
|
|
|
lodsb ; get scaled pixel number
|
|
xlat [ss:bx] ; look it up in the picture
|
|
xchg [es:di],al ; load latches and write pixel to screen
|
|
add di,dx ; down to next line
|
|
|
|
ENDM
|
|
|
|
mov ss,cx
|
|
ret
|
|
|
|
ENDP
|
|
|
|
END |