;*******************************************************************************
; /\______ /\______ /\________
; __\\\___ \_ __\\\___ \_ __\\\______ \
; | / / | / / | _____/ \_
; | / /____| / /____| \ |
; | \____ : _____/ : \ |
; | / \ \ |
; | / . \ . \ |
; __ _|_ / \ \ _|_ __
; \ \\_\ \\__\ _/ : \_ : \_ /__// /_// /
; |____/_ _ :______ _ :______ _ |
; \\\____________| \\\____________| \\\____________|
;
; _______ _______ _______ _______ _______ _______
; _\\\__ \___\\\__ \___\\\__ \___\\\_____ \___\\\_____ \___\\\__ \_
;| /______/| / /| / /| / | / | / /
;\ | / /_| / /_| / | / | / /_
;|\_______ : _____/ : \_____/ : / : / : \____ |
;| / . \ . \ . / . / . / |
;| / \ \ / / |
;|___ :___ :___ :___\ :___ :___/ sns |
; \\_________: \\_________: \\_________: \\_________: \\_________: \\_________|
;
; R E D S E C T O R I N C
;
; Centurio 256b xpdos tiny intro Baudsurfer/rsi 2015 aka olivier.poudade.free.fr
; Presented first at Chaos Constructions 2015 demoparty in St. Petersburg Russia
; Greets Blabla Conscience Bon^2 BReWErS CODEX Flush Lineout Mandarine Onslaught
; Paranoimia Quartex Rebels Razor1911 RiOT Titan and to all assembly programmers
; Youtube video courtesy of Astrofra
https://www.youtube.com/watch?v=F6vvDUkPihs
;*******************************************************************************
b equ byte ; type shortner helper
w equ word ; type shortner helper
d equ dword ; type shortner helper
org 100h ; ip=seg:256
mov al,13h ; mode 320x200w256
int 10h ; bios video api
mov cl,30 ; sigma of bit-glyphs
a:mov eax,171445ddh ; logo 10111000101000100010111011101b
shr eax,cl ; bt eax,ecx; ^reversed logo 29-bit bitmask%10
salc ; xor al,al=ascii(NUL)~space glyph=mov al,20h
jnc c ; cf=block (ie: non-space)
mov al,0dbh ; block glyph
c:int 29h ; fast putch(al)
mov al,cl ; al=cl
aam 0ah ; =aam 10=>ah=cl/10 al=cl%10
jnz e ; time for crlf-2*rows ?
mov w[fs:450h],ax ; bda curs pos col=[40:50h]=cx%10 row=[40:51h]=int(cx/10)
e:loop a ; process 30 bits
std ; draw bottom to top
fld d[bx] ; load angle start
f:mov es,w[bx] ; bx=0 entering or looping
mov cl,52h ; checker board 3d plane height=82 pixels
inc bp ; increase timer
g:mov si,0a0h ; yloop checker board 3d plane rightmotst (160) limit
h:mov ah,54h ; xloop load delta=cos([counter]/9*pi^2)
cwd ; xor dx,dx
div cx ; ax=ax/delta
mov bl,al ; bl=depth
mul si ; dx:ax=ax*si
mov al,ah ; shr ax,8
add bx,bp ; bp is k*rtc advance checker board z
xor al,bl ; checker board row column parity
and al,40h ; checker board single checker size
add al,0c8h ; 3d checkerboard single checker color
stosb ; plot checkerboard single checker point
shld ax,cx,0dh ; rasterbars routine 248b mov ax,cx/shr al,1
add al,50h ; rasterbars sky base color
mov [es:di-62bfh],al; rasterbars bottom of gradient
dec si ; beam right to left
cmp si,0ff60h ; checkboard 3d plane leftmotst (-160) limit
jnz h ; continue checkboard 3d plane horizontal loop
loop g ; continue checkboard 3d plane vertical loop
not si ; si=not(ff60h)=159d < this com's 256 org (psp)
i:sub di,bp ; plot destination-=timer
j:lodsb ; parallax starfield : load PSP=starfield
test al,al ; differenciate xyyyyyyb parallax starfield stars
js i ; if bit7=1 decrease destination by subtracting timer
imul si ; prettify scatter starfield across vga display
sub di,ax ; star's absolute coordinates base movement
mov al,0ffh ; parallax starfield star's color
stosb ; plot this star
or si,si ; if si>0
jnz j ; continue starfield routine
mov bx,168h ; bx=320+40 ; moutain ridge val (+40 for bx remainder)
mov di,0aeefh ; 0aeefh; di=mountain ridge start loc fff9h para fixup
k:sub di,141h ; MOUTAINS assume mountain ridge slope direction up
xlatb ; read a mountain ridge slope value (flags unaffected)
aaa ; randomize mountain ridge peak value (affect flags)
jp l ; determine mountain ridge slope direction
add di,280h ; fallthrough moutain ridge slope direction correct down
l:mov si,di ; preserve mountain ridge peak row value
m:mov b[es:si],cl ; moutain color is black
add si,140h ; get next moutain row point
cmp si,0d46fh ; if row height < (mountain height-para fixup)
jc m ; continue filling mountain row
dec bx ; else decrease mountain column
cmp bx,28h ; total 320+remainder rows (ie 40) processed ?
jnz k ; if not continue drawing moutain
n:cwd ; xor dx,dx=cx%40
mov ax,cx ; cube volume 40^3<2^16<seg
div bx ; divide by mountain loop remainder
push dx ; push first coordinate
cwd ; xor dx,dx
div bx ; ax=ax/40
push ax ; push second coordinate
push dx ; push third coordinate ax%40
mov si,sp ; address stack with si
fild w[si+4] ; z coord of cloud cube point
fild w[si+2] ; y coord of cloud cube point
fild w[si] ; x coord of cloud cube point
call p ; rotate around x axis
call p ; rotate around y axis => rotation around z axis
fistp w[si] ; dst=y2 coord of cloud cube point
add w[si],64h ; dst->y2+=100 vert centerize
imul di,[si],140h ; dst->y2*=line width
fistp w[si] ; x coord of cloud cube point
add di,[si] ; dst+=x
fistp w[si] ; z coord of cloud cube point
sub di,bp ; horizontal translation=-k*timer
lodsb ; z coord cube color delta
add al,90h ; z coord cubes base color
cmp al,[di] ; if al>z buffer
jna o ; then replace value
aam 6 ; ah=al/6 al=al%6
mov al,ah ; al=al/6
stosb ; 1st cube point cloud
not di ; inverse coords by negation
stosb ; overlap to simulate 3rd cube
o:xor sp,sp ; stack reinitialisation
loop n ; while( --cx ) goto points;
fiadd w[q] ; increase cube rotation angle (cs:018ah=e85800h)
mov bl,cl ; xor bl,bl_>bx=0
les si,[bx] ; es=09fffh si=0
mov fs,si ; fixed segment
mov ch,0beh ; cx=152*320 points to copy
mov di,0e8aeh ; physical screen dst start
fs rep movsb ; fs src prefix override
jmp f ; x y z a
p:fld st3 ; a x y z a
fsincos ; ca sa x y z a
fmul st0,st2 ; x*ca sa x y z a
fxch st1 ; sa x*ca x y z a
fmul st0,st3 ; y*sa x*ca x y z a
faddp st1,st0 ; y*sa+x*ca x y z,a
fld st4 ; a y*sa+x*ca x y z a
fsincos ; ca sa y*sa+x*ca x y z a
fmulp st4,st0 ; sa y*sa+x*ca x y*ca z a
fmulp st2,st0 ; y*sa+x*ca x*sa y*ca z a
fxch st1 ; x*sa y*sa+x*ca y*ca z a
fsubp st2,st0 ; y*sa+x*ca y*ca-x*sa z a
fxch st2 ; z y*sa+x*ca y*ca-x*sa a
ret ; z x2 y2 a
org 7 ; 0 word loc far call to CP/M compatibility
q db 58h ; step angle increment