Floorcast 86 bytes by Red Sector Inc. [web]
; This is a 86-byte modified version of a 114-byte VGA floor Casting code by rbz
; by olivier.poudade.free.fr 2013
; cf. http://www.dbfinteractive.com/forum/index.php?topic=3107.0
; C:\128BIN~1>fasm floorcast.asm
; flat assembler version 1.70.03 (786431 kilobytes memory)
; 2 passes, 86 bytes.
; NB : 83 bytes if you delete the ESC key check
ORG 100h ; nb : sp equ 65534 at program start
DWU equ 34h ; saves 2 bytes / was DWU DW ?
DWV equ 36h ; saves 2 bytes / was DWV DW ?
INIT: MOV AL,13h
INT 10h
les di,[bx] ;es=9fffh di=20cdh / was PUSH 0A000H POP ES
FLDZ
MAIN: FLD1
FADDP ST1,ST0
mov di,16 ; make up for les di,[bx]
mov si,DWV ; saves 1 byte
PUSH word si ; was PUSH WORD 56 ; we can't use 0038h but 36h (54d)
FORY: mov bp,sp ; adress stack with base ptr
FILD WORD[DDXMIN]
FIDIV WORD[bp] ; was FIDIV WORD[ESP]
FLD ST0
PUSH 320
FIMUL WORD[bp-2] ; was FIMUL WORD[ESP]
FSUB ST0,ST2
fistp word[si] ; DWV
FLD ST0
FIMUL WORD[DDXMIN]
FADD ST0,ST2
POP CX
FORX: FADD ST0,ST1
dec si ; make up for lodsw below and mov si,DWV above
dec si ; make up for lodsw below and mov si,DWV above
fist word[si] ; saves 2 bytes / was FIST WORD[DWU]
lodsw ; saves 1 byte / was MOV AL,BYTE[DWU]
xor al,byte[si] ; saves 1 byte / was XOR AL,BYTE[DWV]
MUL BYTE[si+4] ; was MUL BYTE [ESP]
shr ax,12 ; was SHR AX,10 & make up for VGA default palette 16->31
or al,10h ; was SHR AX,10 & make up for VGA default palette 16->31
STOSB
LOOP FORX
fistp word[si-2] ; saves 3 bytes was FISTP WORD[DWU]
fistp word[si] ; saves 3 bytes was FISTP WORD[DWV]
DDXMIN:INC BYTE[ESP] ; DDXMIN equ $ saves 2 bytes ff67h close to ff60h / was DDXMIN DW -160
JNZ FORY
IN AL,60h ; was equ KEYBRD
dec ax ; saves 1 byte / was DEC AL
JNZ MAIN
RET[ back to the prod ]
