home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Equalizer BBS
/
equalizer-bbs-collection_2004.zip
/
equalizer-bbs-collection
/
DEMOSCENE-STUFF
/
FCSP2SRC.ZIP
/
SP2.ASM
< prev
Wrap
Assembly Source File
|
1993-11-26
|
21KB
|
977 lines
;--------------------------------------------------------------------
; StarPort Intro II V1.0
;--------------------------------------------------------------------
; Copyright (C) 1993 Future Crew
;--------------------------------------------------------------------
; code: Psi
; music: Skaven
;--------------------------------------------------------------------
; This code is released to the public domain. You can do
; whatever you like with this code, but remember, that if
; you are just planning on making another small intro by
; changing a few lines of code, be prepared to enter the
; worldwide lamers' club. However, if you are looking at
; this code in hope of learning something new, go right
; ahead. That's exactly why this source was released.
; (BTW: I don't claim there's anything new to find here,
; but it's always worth looking, right?)
;--------------------------------------------------------------------
; The code is optimized mainly for size but also a little
; for speed. The goal was to get this little bbs intro to
; under 2K, and 1993 bytes sounded like a good size. Well,
; it wasn't easy, and there are surely places left one could
; squeeze a few extra bytes off...
; Making a small intro is not hard. Making a small intro
; with a nice feel is very hard, and you have to sacrifice
; ideas to fit the intro to the limits you have set. I had
; a lot of plans (a background piccy for example), but well,
; the size limit came first.
; I hope you enjoy my choice of size/feature ratio in this
; intro! In case you are interested, this was a three evening
; project (the last one spent testing).
;--------------------------------------------------------------------
; You can compile this with TASM, but the resulting COM-file
; will be a lot larger than the released version. This is
; because all the zero data is included to the result. The
; released version was first compiled to a COM file, and then
; a separate postprocessing program was ran which removed all
; the zero data from the end of the file. If you are just
; experimenting, recompiling is as easy as MAKE.BAT. If you
; want to make this small again, you have to do some work as
; well, and make your own postprocessor.
;--------------------------------------------------------------------
BORDERS=0 ;set to 1 for visible border-timings
code SEGMENT para public 'CODE'
ASSUME cs:code
LOCALS
.386
ORG 100h
start: cld ;filler to make the filesize exactly 1993 bytes
cld ;filler to make the filesize exactly 1993 bytes
jmp main
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ setborder ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;descr: debug/change border color
setborder MACRO col
IF BORDERS
push ax
push dx
mov dx,3dah
in al,dx
mov dx,3c0h
mov al,11h+32
out dx,al
mov al,col
out dx,al
pop dx
pop ax
ENDIF
ENDM
;████████████████ Simplex Adlib Player ████████████████
;this doesn't just read raw data to output to adlib like the one
;used in the last starport intro. This player really does have
;note & instrument data it reads and processes!
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ output data to adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_lodsboutaw03: ;size optimization related entry (instrument loading)
call a_lodsboutaw
add ah,3
a_lodsboutaw: ;size optimization related entry (instrument loading)
lodsb
a_outaw PROC NEAR ;ah=reg,al=data
push ax
push cx
xchg al,ah
mov dx,388h
out dx,al
mov cx,7
call a_wait
mov dx,389h
mov al,ah
out dx,al
mov cx,30
call a_wait
pop cx
pop ax
ret
a_wait: in al,dx
loop a_wait
ret
a_outaw ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ load instrument to adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_loadinstrument PROC NEAR
;bx=channel, ds:si=offset to instrument data
mov ah,ds:a_inst_table[bx]
mov cx,4
@@1: call a_lodsboutaw03
add ah,20h-3
loop @@1
add ah,40h
call a_lodsboutaw03
mov ah,bl
add ah,0c0h
jmp a_lodsboutaw
a_loadinstrument ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ set note on/off ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_playnote PROC NEAR
;bx=channel, ax=data
push bx
xchg ah,bl
add ah,0a0h
call a_outaw
mov al,bl
add ah,010h
pop bx
jmp a_outaw
a_playnote ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ initialize/clear/shutup adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_init PROC NEAR
mov ax,00120h
call a_outaw
mov ax,00800h
call a_outaw
mov ah,0bdh
call a_outaw
mov bp,9
xor bx,bx
mov di,OFFSET music_instruments
@@1: mov si,ds:[di]
add di,2
call a_loadinstrument
xor ax,ax
call a_playnote
inc bx
dec bp
jnz @@1
ret
a_init ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ advance music one row ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_dorow PROC NEAR
sub ds:a_musiccnt,1
jnc @@0
mov ds:a_musiccnt,music_speed
mov cx,music_channels
mov di,OFFSET music_patterns
xor bx,bx
@@1: sub ds:a_chdelaycnt[bx],1
jns @@2
mov si,ds:[di]
xor ax,ax
call a_playnote
@@4: lodsb
or al,al
jz @@7
jns @@6
sub al,81h
mov ds:a_chdelay[bx],al
lodsb
@@6: mov dl,al
and ax,15
mov bp,ax
add bp,bp
mov ax,ds:a_note_table[bp]
shr dl,2
and dl,not 3
add ah,dl
call a_playnote
mov al,ds:a_chdelay[bx]
mov ds:a_chdelaycnt[bx],al
mov ds:[di],si
@@2: add di,4
inc bx
loop @@1
@@0: ret
@@7: mov si,ds:[di+2]
jmp @@4
a_dorow ENDP
;███████████████ Intro Routines ████████████████████
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ sin/cos ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;entry: ax=angle (0..65535)
; exit: ax=muller (-127..127)
addwcos:add ax,ds:[bx] ;optimized entry for wavesets
mov ds:[bx],ax
cos: add ax,16384
sin: mov bx,ax
mov cx,bx
and cx,1023
neg cx
add cx,1023
shr bx,10
mov ah,ds:sintable[bx]
xor al,al
imul cx
push ax
push dx
mov ah,ds:sintable[bx+1]
xor al,al
neg cx
add cx,1023
imul cx
pop bx
pop cx
add ax,cx
adc dx,bx
shrd ax,dx,11
ret
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ rand ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;returns a random value in range -4096..4095
rand PROC NEAR
mov eax,1107030247
mul ds:seed
add eax,97177
mov ds:seed,eax
shr eax,15
and ax,8191
sub ax,4096
;size optimizatin, some code moved from after all rand calls
add bx,2
mov ds:[bx],ax
ret
rand ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ timer ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
inittimer PROC NEAR
mov eax,fs:[8*4]
mov ds:oldint8,eax
mov ax,cs
shl eax,16
mov ax,OFFSET intti8
mov dx,17000 ;70hz
jmp @@1
deinittimer:
mov eax,ds:oldint8
xor dx,dx
@@1: cli
mov fs:[8*4],eax
mov al,036h
out 43h,al
mov al,dl
out 40h,al
mov al,dh
out 40h,al
sti
ret
inittimer ENDP
intti8 PROC FAR ;timer interrupt
push ax
mov al,20h
out 20h,al
inc cs:framecounter
pop ax
iret
intti8 ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ load indexed palette ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
setpal PROC NEAR
;ds:si=pointer to colorindices
mov dx,3c8h
xor al,al
out dx,al
inc dx
mov cx,8
@@1: xor bh,bh
mov bl,ds:[si]
shr bl,2
call setpl2
mov bl,ds:[si]
shl bx,2
call setpl2
inc si
loop @@1
ret
setpl2: and bx,15*2
mov ax,word ptr ds:col0[bx]
out dx,al
mov al,ah
out dx,al
mov al,ds:col0[bx+2]
out dx,al
ret
setpal ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ clear & copy videobuffer to screen ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
clearcopy PROC NEAR
;---copy/clear buf
xor edx,edx
mov si,OFFSET vbuf
mov bx,4
mov cx,200
mov di,-4
@@1: mov bp,5
@@2: REPT 2
mov eax,ds:[si]
add di,bx
mov ds:[si],edx
add si,bx
mov es:[di],eax
ENDM
dec bp
jnz @@2
add si,bx
dec cx
jnz @@1
ret
clearcopy ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ draw a small pixel ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
pset1 PROC NEAR ;ds:di=destination center, si=xmask offset
mov al,ds:colb[si]
or ds:[di],al
@@1: ret
pset1 ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ draw a big pixel (depending on Z) ▒▒▒▒▒▒▒▒▒▒▒▒▒
pset2 PROC NEAR ;ds:di=destination center, si=xmask offset
mov ax,ds:colbww[si]
or ds:[di+0],ax
or ds:[di+44],ax
cmp bp,8300 ;zcompare for size
jl pset3
;smaller one
mov ax,ds:colbw[si]
or ds:[di-44],ax
or ds:[di+88],ax
mov ax,ds:colbv[si]
or ds:[di-88],ax
or ds:[di+132],ax
ret
pset3: ;larger one
or ds:[di-44],ax
or ds:[di+88],ax
mov ax,ds:colbw[si]
or ds:[di-88],ax
or ds:[di+132],ax
ret
pset2 ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ add a letter composed of big dots to dotlist ▒▒▒▒▒▒▒▒▒▒▒▒▒
letter3d PROC NEAR
;bx=letter
;si=basex
;bp=basey
sub bx,'A'
jc @@0
shl bx,3
mov di,ds:nextdot
mov cx,8
@@1: push cx
push si
mov cx,8
@@2: cmp ds:font[bx],0
je @@3
mov ds:dots[di],si
mov ds:dots[di+2],bp
;zsinus
push si
add si,ds:sinus1
sar si,6
and si,63
mov al,ds:sintable[si]
cbw
pop si
shl ax,2
mov ds:dots[di+4],ax
;
mov word ptr ds:dots[di+6],OFFSET pset2
add di,8
and di,DOTNUM1*8-1
@@3: inc bx
add si,LETTERDOTSPACING
loop @@2
pop si
add bx,320-8
add bp,LETTERDOTSPACING
pop cx
loop @@1
mov ds:nextdot,di
@@0: ret
letter3d ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ calc 2x2 rotation matrix ▒▒▒▒▒▒▒▒▒▒▒▒▒
set3drot PROC NEAR
;ax=angle,ds:di=pointer to matrix
push ax
call sin
mov ds:[di+r01-r00],ax
neg ax
mov ds:[di+r10-r00],ax
pop ax
call cos
mov ds:[di+r00-r00],ax
mov ds:[di+r11-r00],ax
ret
set3drot ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒ rotate point with 2x2 rotation matrix (innerpart) ▒▒▒▒▒▒▒▒▒▒▒▒▒
rotate2x2i PROC NEAR
;(di,bp)->(cx) with matrix half at ds:si
;this is the inner part, called twice
push bx
mov ax,di
imul word ptr ds:[si]
mov cx,ax
mov bx,dx
mov ax,bp
imul word ptr ds:[si+2]
add cx,ax
adc bx,dx
shrd cx,bx,14
pop bx
add si,4
ret
rotate2x2i ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ advance demo one frame (raw work) ▒▒▒▒▒▒▒▒▒▒▒▒▒
doit PROC NEAR
;======wait for border
setborder 0
mov dx,3dah
@@w1: in al,dx
test al,8
jnz @@w1
@@w2: in al,dx
test al,8
jz @@w2
setborder 30
;======done
mov si,ds:index
push si
call setpal
pop si
add si,9
cmp si,OFFSET index4
jbe @@i2
mov si,OFFSET index1
@@i2: mov ds:index,si
mov al,2
mov ah,ds:[si+8]
mov dx,3c4h
out dx,ax
call clearcopy
;======do timer simulation stuff
setborder 28
xor cx,cx
mov ds:scrollsubber,0
xchg cx,ds:framecounter
jcxz @@78
@@77: push cx
add ds:scrollsubber,SCROLLSPEED
call doit70
pop cx
loop @@77
setborder 26
@@78:;======
;---redraw dots
mov cx,DOTNUM
mov bx,OFFSET dots
@@1: push cx
push bx
mov bp,ds:[bx+2]
mov di,ds:[bx+4]
cmp word ptr ds:[bx+6],OFFSET pset2
jne @@5
;ysinus
mov cx,ds:[bx]
mov si,ds:sinus2
add si,cx
sar si,7
and si,63
mov al,ds:sintable[si]
cbw
shl ax,2
add bp,ax
;scroll
sub cx,ds:scrollsubber
mov ds:[bx],cx
cmp cx,-3900
jl @@7
cmp cx,3900
jg @@7
@@5: ;--rotate coordinates
mov si,OFFSET r00
call rotate2x2i
push cx
call rotate2x2i
pop di
mov bp,ds:[bx]
mov si,OFFSET p00
push cx
call rotate2x2i
push cx
call rotate2x2i
pop bp
pop di
;bp=Z, cx=X, di=Y
add bp,ds:zadder
cmp bp,1024
jl @@7
;--project
mov ax,256
imul di
idiv bp
add ax,100
mov di,ax
mov ax,307
imul cx
idiv bp
add ax,160
mov si,ax
;si=SX, di=SY
mov ax,ds:[bx+6]
cmp si,319
ja @@7
cmp di,199
ja @@7
;calc dest address & xmask offset
add di,di
mov di,ds:rows[di]
add si,si
add di,ds:cols[si]
;
call ax
@@7: pop bx
pop cx
add bx,8
dec cx
jnz @@1
ret
doit ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒ advance demo counters 1/70 sec ▒▒▒▒▒▒▒▒▒▒▒▒▒
;a separate routine is used to get frame syncronization for
;slower machines (and slow vga cards)
doit70 PROC NEAR
;---add sinuses & udforce
add ds:sinus1,70
add ds:sinus2,177
add ds:udforced,3000
;---set wave1
mov bx,OFFSET wwave
mov ax,77
call addwcos
sar ax,5
mov ds:wave1,ax
;---set zadder
mov bx,OFFSET zwave
mov ax,370
call addwcos
sar ax,3
add ax,8888
mov ds:zadder,ax
;---set 3d rotate YZ
mov bx,OFFSET udwave
mov ax,ds:wave1
call addwcos
imul ds:udforce
shrd ax,dx,8
mov di,OFFSET r00
call set3drot
;---set 3d rotate XZ
mov bx,OFFSET lrwave
mov ax,200
call addwcos
sar ax,1
mov di,OFFSET p00
call set3drot
;---add more text to 3d scroller
sub ds:textcnt,SCROLLSPEED
jnc @@t1
mov ds:textcnt,LETTERDOTSPACING*8-1
mov si,ds:text
mov bl,ds:[si]
IFDEF XORTEXTS
xor bl,17h
ENDIF
and bx,255
jz @@t3
inc si
mov ds:text,si
cmp bl,32
jge @@t4
shl bx,SCROLLDELAYSHL
mov ds:textcnt,bx
jmp @@t1
@@t4: mov bp,0
mov si,4100
call letter3d
jmp @@t1
@@t3: mov si,OFFSET text0
mov ds:text,si
@@t1: ;;;
;======adlib music
jmp a_dorow
doit70 ENDP
;████████████████ Main routine ████████████████
;stack @ cs:0fffeh
main PROC NEAR
;═════════ Zero Zerodata & Init Segs ═══════
.8086 ;;;
push cs
push cs
pop ds
pop es
mov cx,(zeroend-zerobeg)/2
mov di,OFFSET zerobeg
xor ax,ax ;zero used later
rep stosw
mov dx,0a000h
mov es,dx
;segments now set: DS=code/data ES=vram
;═════════ Check for 386 ═════════
push sp
pop dx
cmp dx,sp
jz @@o1
@@o2: jmp endansi ;80(1)86
.286p ;;;
@@o1: mov bx,OFFSET rows
sgdt ds:[bx]
cmp byte ptr ds:[bx+5],0
js @@o2
;═════════ Check for VGA ═════════
.386p ;;;
mov fs,ax ;ax was zero
;segments now set: DS=code/data ES=vram FS=zeropage
mov ax,1a00h
int 10h
cmp al,01ah
jne endansi ;no vga
cmp bl,7
jb endansi ;no vga
;═════════ Initialize - doinit 0 ═════════
;copy vga font to font buffer
mov ax,13h
int 10h
mov cx,'Z'-'A'+1
mov bx,16
mov ax,'A'+0eh*256
@@a1: int 10h
inc al
loop @@a1
mov cx,8*320/2
mov bx,OFFSET font
xor di,di
@@a2: mov ax,es:[di]
mov ds:[di+bx],ax
add di,2
loop @@a2
;═════════ Initialize - vga ═════════
;init videomode 320x200x16
mov ax,0dh
int 10h
;set up rows/cols/etc
mov si,-2
mov di,OFFSET vbuf-44
mov bl,128
xor bp,bp
jmp @@b5
@@b1: mov ds:rows[si],di
mov ds:colb[si],bl
mov ds:colbww[si],cx
shr cl,1
rcr ch,1
mov ds:colbw[si],dx
shr dl,1
rcr dh,1
mov ds:colbv[si],ax
shr al,1
rcr ah,1
mov ds:cols[si],bp
ror bl,1
jnc @@b4
inc bp
@@b5: mov cx,0000000011111110b
mov dx,0000000001111100b
mov ax,0000000000111000b
@@b4: add di,44
add si,2
cmp si,(320)*2
jle @@b1
;set simplex palette order (16 color mode)
mov dx,3dah
in al,dx
mov dl,0c0h
xor ax,ax
mov cx,16
@@b2: out dx,al
out dx,al
inc al
loop @@b2
mov al,20h
out dx,al
;═════════ Initialize - doinit ═════════
mov cx,DOTNUM
mov bx,OFFSET dots-2
@@c1: push cx
call rand
call rand
call rand
sar ax,2
mov ds:[bx],ax
add bx,2
mov word ptr ds:[bx],OFFSET pset1
pop cx
loop @@c1
;═════════ Initialize - others ═════════
call a_init
call inittimer
;═════════ Do the intro stuff ═════════
again: call doit
mov ah,1
int 16h
jz again
mov ah,0
int 16h
;═════════ DeInitialize ═════════
call deinittimer
call a_init ;reinitializing adlib shuts it up
;═════════ Display end ansi (only thing done if no 386 or vga) ═════════
endansi:mov ax,3h
int 10h
mov si,OFFSET endtext
push 0b800h ;if the user has an MGA or HGC
pop es ;it's not my problem :-)
xor di,di
mov ah,0eh
@@1: lodsb
IFDEF XORTEXTS
xor al,17h
ENDIF
cmp al,31
jae @@2
mov ah,al
jmp @@1
@@2: jz @@3
stosw
jmp @@1
@@3: mov ax,4c00h
int 21h
main ENDP
;████████████████ Initialized (nonzero) data ████████████████
;pointer & delay counter for scrolltext
text dw OFFSET text0
textcnt dw 1
;3d rotation values (more in zerodata)
udforced LABEL DWORD
dw 0
udforce dw 64
lrwave dw -20000
zwave dw 16000
sintable LABEL BYTE ;sine table (circle is 64 units)
db 0,12,24,36,48,59,70,80,89,98,105,112,117,121,124,126,127,126
db 124,121,117,112,105,98,89,80,70,59,48,36,24,12,0,-12,-24,-36
db -48,-59,-70,-80,-89,-98,-105,-112,-117,-121,-124,-126,-127
db -126,-124,-121,-117,-112,-105,-98,-89,-80,-70,-59,-48,-36
db -24,-12,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54
db 57,59,62,65,67,70
;adlib player data
a_inst_table LABEL BYTE
db 20h+0,20h+1,20h+2,20h+8,20h+9,20h+10,20h+16,20h+17,20h+18
NTB equ 8192 ;+1024*1
a_note_table LABEL WORD
dw NTB+363,NTB+385,NTB+408,NTB+432,NTB+458,NTB+485
dw NTB+514,NTB+544,NTB+577,NTB+611,NTB+647,NTB+868
;note: a zero word is expected after this table (found in col0)
col0 db 0, 0, 0 ,0 ;background color
col1 db 0,15,35 ,0 ;delay color 3
col2 db 16,30,48 ,0 ;delay color 2
col3 db 32,45,55 ,0 ;delay color 1
col4 db 60,61,62 ;brightest color
;1 . x . x . x . x . x . x . x . x
;2 . . x x . . x x . . x x . . x x
;4 . . . . x x x x . . . . x x x x
;8 . . . . . . . . x x x x x x x x
;palette indices for 4 palettes. Last number is bitplane to write
;during the frame having this palette
index1 db 04h,34h,24h,34h,14h,34h,24h,34h ,1 ;1248
index2 db 03h,23h,13h,23h,44h,44h,44h,44h ,8 ;8124
index3 db 02h,12h,44h,44h,33h,33h,44h,44h ,4 ;4812
index4 db 01h,44h,33h,44h,22h,44h,33h,44h ,2 ;2481
index dw OFFSET index1 ;offset to current index
;################## Music - (tune by skaven/fc) ###################
;generated with ST3->SIMPLEXADLIB, handoptimized by psi (283 bytes)
music_channels equ 8
music_speed equ 8
music_instruments LABEL BYTE
dw OFFSET ains6
dw OFFSET ains2
dw OFFSET ains4
dw OFFSET ains3
dw OFFSET ains3
dw OFFSET ains1
dw OFFSET ains1
dw OFFSET ains4
ains1 LABEL BYTE
db 65,194,6,0,35,242,240,240,1,0,4
ains2 LABEL BYTE
db 145,64,135,128,243,111,35,3,1,1,2
ains3 LABEL BYTE
db 225,33,17,128,17,19,34,34,0,0,12
ains4 LABEL BYTE
db 97,33,27,0,98,132,86,85,0,0,14
ains6 LABEL BYTE
db 145,64,135,136,243,111,35,3,1,1,2
music_patterns LABEL BYTE
ach0 dw OFFSET ach0d,OFFSET ach0dr
ach1 dw OFFSET ach1d,OFFSET ach1dr
ach2 dw OFFSET ach2d,OFFSET ach2dr
ach3 dw OFFSET ach3d,OFFSET ach3d
ach4 dw OFFSET ach4d,OFFSET ach4d
ach5 dw OFFSET ach5d,OFFSET ach5d
ach6 dw OFFSET ach6d,OFFSET ach6d
ach7 dw OFFSET ach7d,OFFSET ach7d
ach0d LABEL BYTE
db 081h
ach0dr LABEL BYTE
db 057h,050h,050h,055h,057h,050h,055h,057h
db 050h,055h,057h,050h,055h,057h,050h,055h
db 0
ach1d LABEL BYTE
db 081h
ach1dr LABEL BYTE
db 050h,055h,057h,050h,055h,057h,050h,055h
db 057h,050h,055h,057h,050h,055h,057h,050h
db 0
ach2d LABEL BYTE
db 0C0h,050h,084h
db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah
db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah
ach2dr LABEL BYTE
db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah
db 025h,015h,025h,015h,028h,018h,02Ah,01Ah
db 0
ach3d LABEL BYTE
db 0A0h,050h,040h,0C0h,040h,088h,040h,040h
db 03Ah,042h,090h,045h,088h,040h,042h,040h
db 047h,090h,04Ah,088h,045h,098h,040h
db 0
ach4d LABEL BYTE
db 0A0h,050h,030h,0C0h,047h,088h,047h,043h
db 042h,045h,047h,045h,048h,047h,047h,050h
db 052h,084h,050h,04Ah,088h,050h,098h,045h
db 0
ach5d LABEL BYTE
db 0C0h,020h,0A0h,010h,010h,090h,010h,02Ah
db 025h,088h,028h,02Ah,090h,010h,02Ah,025h
db 088h,028h,02Ah
db 0
ach6d LABEL BYTE
db 0C0h,020h,0A0h,020h,020h,090h,020h,01Ah
db 015h,088h,018h,01Ah,090h,020h,01Ah,015h
db 088h,018h,01Ah
db 0
ach7d LABEL BYTE
db 0C0h,00Ch,0FEh,050h,090h,00Ch,081h,04Ah
db 050h,084h,052h,055h,086h,04Ah,081h,050h
db 04Ah,086h,050h,082h,055h,098h,045h
db 0
;#########################################################
SCROLLSPEED equ 90
SCROLLDELAYSHL equ 9
LETTERDOTSPACING equ 128
db 0fch
text0 LABEL BYTE ;scrolltext (numbers are delays)
db 31,25,'CALL STARPORT',9,'FUTURE CREW WORLD HQ',9,'CDN',9,'GRAVIS EURO',9,'AND MORE',0
endtext LABEL BYTE ;endansi... well... endansiline (numbers are colors)
db 15
db 'StarPort'
db 3,' ── ',11
db 'V32bis +358-0-8044626'
db ' +358-0-8041133'
db 3,' ── ',15
db 'FC-WHQ'
db 31
endtext1 LABEL BYTE
db 0fch
;████████████████ Uninitialized (zero) data ████████████████
zerobeg LABEL WORD ;start zero clear from here
rows dw 320 dup(0) ;offsets to screen rows
cols dw 320 dup(0) ;offsets to screen cols
colb db 320 dup(0,0) ;bitmasks for screen cols
colbv dw 320 dup(0) ;wide -"-
colbw dw 320 dup(0) ;wider -"-
colbww dw 320 dup(0) ;very wide -"-
ALIGN 4
db 44*8 dup(0) ;negative overflow for videobuffer
vbuf LABEL BYTE
db 44*200 dup(0) ;video buffer
db 44*8 dup(0) ;positive overflow for videobuffer
ALIGN 4
font LABEL BYTE
db 8 dup(320 dup(0)) ;font buffer
DOTNUM1 equ 256 ;number of dots used for text
DOTNUM equ 444 ;total number of dots
ALIGN 4
dots LABEL WORD
dw DOTNUM dup(0,0,0,0) ;x,y,z,routine data for each dot
;2x2 rotation matrices
r00 dw 0
r10 dw 0
r01 dw 0
r11 dw 0
p00 dw 0
p10 dw 0
p01 dw 0
p11 dw 0
;zero initialized 3d rotation stuff
zadder dw 0
wave1 dw 0
udwave dw 0
wwave dw 0
sinus1 dw 0
sinus2 dw 0
;adlib data
a_musiccnt dw 0
a_chdelaycnt db 9 dup(0)
a_chdelay db 9 dup(0)
ALIGN 2
;misc
nextdot dw 0
scrollsubber dw 0
framecounter dw 0
oldint8 dd 0
seed dd 0
padder db 16 dup(0)
zeroend LABEL WORD ;end zero clear here
code ENDS
END start