diff --git a/build b/build new file mode 100644 index 0000000..aa63c6e --- /dev/null +++ b/build @@ -0,0 +1,5 @@ +nasm sp2.s -s -o res/sp2.bin +dd if=res/sp2.bin of=sp2.com bs=1 count=1993 + +ndisasm -b 16 sp2.com > res/disas.new +diff res/disas.old res/disas.new > diff diff --git a/sp2.s b/sp2.s new file mode 100644 index 0000000..8cfff2a --- /dev/null +++ b/sp2.s @@ -0,0 +1,1087 @@ +; =================================================================== +; port of starport 2 to nasm. i cannot really tell what setborder is +; supposed to do, but the rest works fine. nasm puts out some opcodes +; that differ from tasm so it does not produce an identical binary at +; the hash level, but it is identical in function. see the diff file. +; =================================================================== + + + + +;-------------------------------------------------------------------- +; 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. +;-------------------------------------------------------------------- + +XORTEXTS equ 0x17 ; xor's all text characters with this value. + ; original intro binary used 0x17 + +BORDERS equ 0 ;set to 1 for visible border-timings + +[bits 16] +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 + %macro setborder 1 + %if BORDERS + push ax + push dx + mov dx,3dah + in al,dx + mov dx,3c0h + mov al,11h+32 + out dx,al + mov al,%1 + out dx,al + pop dx + pop ax + %endif + %endmacro + +;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ 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:;: ;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 + +;±±±±±±±±±±±±±±±± load instrument to adlib ±±±±±±±±±±±±±± +a_loadinstrument:;: + ;bx=channel, ds:si=offset to instrument data + ;mov ah,ds:a_inst_table[bx] + mov ah,[bx+a_inst_table] + mov cx,4 +.l: call a_lodsboutaw03 + add ah,20h-3 + loop .l + add ah,40h + call a_lodsboutaw03 + mov ah,bl + add ah,0c0h + jmp a_lodsboutaw + + +;±±±±±±±±±±±±±±±± set note on/off ±±±±±±±±±±±±±± +a_playnote:;: + ;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 + +;±±±±±±±±±±±±±±±± initialize/clear/shutup adlib ±±±±±±±±±±±±±± +a_init: + 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,music_instruments +.l: mov si,[di] + add di,2 + call a_loadinstrument + xor ax,ax + call a_playnote + inc bx + dec bp + jnz .l + ret + +;±±±±±±±±±±±±±±±± advance music one row ±±±±±±±±±±±±±± +a_dorow: + sub word [a_musiccnt], byte 1 + jnc .end + mov word [a_musiccnt],music_speed + mov cx,music_channels + mov di,music_patterns + xor bx,bx +.lp1: sub byte a_chdelaycnt[bx],1 + jns .lp2 + mov si,[di] + xor ax,ax + call a_playnote +.ldata: lodsb + or al,al + jz .l7 + jns .l6 + sub al,81h + mov a_chdelay[bx],al + lodsb +.l6: mov dl,al + and ax, strict word 15 + mov bp,ax + add bp,bp + mov ax,ds:a_note_table[bp] + shr dl,2 + ;and dl,not 3 + and dl,0xFC + add ah,dl + call a_playnote + mov al,a_chdelay[bx] + mov a_chdelaycnt[bx],al + mov [di],si +.lp2: add di,4 + inc bx + loop .lp1 +.end: ret +.l7: mov si,[di+2] + jmp .ldata + +;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Intro Routines ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +;±±±±±±±±±±±±±±±± sin/cos ±±±±±±±±±±±±±±±± +;entry: ax=angle (0..65535) +; exit: ax=muller (-127..127) +addwcos:add ax,[bx] ;optimized entry for wavesets + mov [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,sintable[bx] + xor al,al + imul cx + push ax + push dx + mov ah,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: + mov eax,1107030247 + mul dword [seed] + add eax,97177 + mov [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 [bx],ax + ret + +;±±±±±±±±±±±±±±±± timer ±±±±±±±±±±±±±±±± +inittimer: + mov eax,fs:[8*4] + mov [oldint8],eax + mov ax,cs + shl eax,16 + mov ax,intti8 ;TODO ????? + mov dx,17000 ;70hz + jmp ml1 +deinittimer: + mov eax,[oldint8] + xor dx,dx +ml1: 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 + +intti8: ;timer interrupt + push ax + mov al,20h + out 20h,al + inc word cs:framecounter + pop ax + iret + +;±±±±±±±±±±±±±±±± load indexed palette ±±±±±±±±±±±±±± +setpal: + ;ds:si=pointer to colorindices + mov dx,3c8h + xor al,al + out dx,al + inc dx + mov cx,8 +.l1: xor bh,bh + mov bl,[si] + shr bl,2 + call setpl2 + mov bl,[si] + shl bx,2 + call setpl2 + inc si + loop .l1 + ret +setpl2: and bx,15*2 + mov ax,word col0[bx] + out dx,al + mov al,ah + out dx,al + mov al,col0[bx+2] + out dx,al + ret + +;±±±±±±±±±±±±±± clear & copy videobuffer to screen ±±±±±±±±±±±±±± +clearcopy: +;---copy/clear buf + xor edx,edx + mov si,vbuf + mov bx,4 + mov cx,200 + mov di,-4 +.l1: mov bp,5 +.l2: ;REPT 2 + mov eax,[si] + add di,bx + mov [si],edx + add si,bx + mov es:[di],eax + + mov eax,[si] + add di,bx + mov [si],edx + add si,bx + mov es:[di],eax + + dec bp + jnz .l2 + add si,bx + dec cx + jnz .l1 + ret + +;±±±±±±±±±±±±±± draw a small pixel ±±±±±±±±±±±±±± +pset1: ;ds:di=destination center, si=xmask offset + mov al,colb[si] + or [di],al +.l1: ret + +;±±±±±±±±±±±±±± draw a big pixel (depending on Z) ±±±±±±±±±±±±± +pset2: ;ds:di=destination center, si=xmask offset + mov ax,colbww[si] + or [di+0],ax + or [di+44],ax + cmp bp,8300 ;zcompare for size + jl pset3 + ;smaller one + mov ax,colbw[si] + or [di-44],ax + or [di+88],ax + mov ax,colbv[si] + or [di-88],ax + or [di+132],ax + ret +pset3: ;larger one + or [di-44],ax + or [di+88],ax + mov ax,colbw[si] + or [di-88],ax + or [di+132],ax + ret + +;±±±±±±±±±±±±±± add a letter composed of big dots to dotlist ±±±±±±±±±±±±± +letter3d: + ;bx=letter + ;si=basex + ;bp=basey + sub bx,'A' + jc .l0 + shl bx,3 + mov di,[nextdot] + mov cx,8 +.l1: push cx + push si + mov cx,8 +.l2: cmp byte font[bx],0 + je .l3 + mov dots[di],si + mov dots[di+2],bp + ;zsinus + push si + add si,[sinus1] + sar si,6 + and si,63 + mov al,sintable[si] + cbw + pop si + shl ax,2 + mov dots[di+4],ax + ; + mov word dots[di+6], pset2 + add di,8 + and di,DOTNUM1*8-1 +.l3: inc bx + add si,LETTERDOTSPACING + loop .l2 + pop si + add bx,320-8 + add bp,LETTERDOTSPACING + pop cx + loop .l1 + mov [nextdot],di +.l0: ret + +;±±±±±±±±±±±±±± calc 2x2 rotation matrix ±±±±±±±±±±±±± +set3drot: + ;ax=angle,ds:di=pointer to matrix + push ax + call sin + mov [di+r01-r00],ax + neg ax + mov [di+ar10-r00],ax + pop ax + call cos + mov [di+r00-r00],ax + mov [di+ar11-r00],ax + ret + +;±±±±±±±±±±±± rotate point with 2x2 rotation matrix (innerpart) ±±±±±±±±±±±±± +rotate2x2i: + ;(di,bp)->(cx) with matrix half at ds:si + ;this is the inner part, called twice + push bx + mov ax,di + imul word [si] + mov cx,ax + mov bx,dx + mov ax,bp + imul word [si+2] + add cx,ax + adc bx,dx + shrd cx,bx,14 + pop bx + add si,4 + ret + +;±±±±±±±±±±±±±± advance demo one frame (raw work) ±±±±±±±±±±±±± +doit: +;======wait for border + setborder 0 + mov dx,3dah +.lw1: in al,dx + test al,8 + jnz .lw1 +.lw2: in al,dx + test al,8 + jz .lw2 + setborder 30 +;======done + mov si,[index] + push si + call setpal + pop si + add si,9 + cmp si, index4 + jbe .li2 + mov si, index1 +.li2: mov [index],si + mov al,2 + mov ah,[si+8] + mov dx,3c4h + out dx,ax + call clearcopy +;======do timer simulation stuff + setborder 28 + xor cx,cx + mov word [scrollsubber],0 + xchg cx,[framecounter] + jcxz .l78 +.l77: push cx + add word [scrollsubber],SCROLLSPEED + call doit70 + pop cx + loop .l77 + setborder 26 +.l78:;====== +;---redraw dots + mov cx,DOTNUM + mov bx, dots +.l1: push cx + push bx + mov bp,[bx+2] + mov di,[bx+4] + cmp word [bx+6], pset2 + jne .l5 + ;ysinus + mov cx,[bx] + mov si,[sinus2] + add si,cx + sar si,7 + and si,63 + mov al,sintable[si] + cbw + shl ax,2 + add bp,ax + ;scroll + sub cx,[scrollsubber] + mov [bx],cx + cmp cx,-3900 + jl .l7 + cmp cx,3900 + jg .l7 +.l5: ;--rotate coordinates + mov si, r00 + call rotate2x2i + push cx + call rotate2x2i + pop di + mov bp,[bx] + mov si, p00 + push cx + call rotate2x2i + push cx + call rotate2x2i + pop bp + pop di + ;bp=Z, cx=X, di=Y + add bp,[zadder] + cmp bp,1024 + jl .l7 + ;--project + mov ax,256 + imul di + idiv bp + add ax, strict word 100 + mov di,ax + mov ax,307 + imul cx + idiv bp + add ax,160 + mov si,ax + ;si=SX, di=SY + mov ax,[bx+6] + cmp si,319 + ja .l7 + cmp di,199 + ja .l7 + ;calc dest address & xmask offset + add di,di + mov di,rows[di] + add si,si + add di,cols[si] + ; + call ax +.l7: pop bx + pop cx + add bx,8 + dec cx + jnz .l1 + ret + +;±±±±±±±±±±±±±± advance demo counters 1/70 sec ±±±±±±±±±±±±± +;a separate routine is used to get frame syncronization for +;slower machines (and slow vga cards) +doit70: +;---add sinuses & udforce + add word [sinus1],70 + add word [sinus2],177 + add dword [udforced],3000 +;---set wave1 + mov bx, wwave + mov ax,77 + call addwcos + sar ax,5 + mov [wave1],ax +;---set zadder + mov bx, zwave + mov ax,370 + call addwcos + sar ax,3 + add ax,8888 + mov [zadder],ax +;---set 3d rotate YZ + mov bx, udwave + mov ax,[wave1] + call addwcos + imul word [udforce] + shrd ax,dx,8 + mov di, r00 + call set3drot +;---set 3d rotate XZ + mov bx, lrwave + mov ax,200 + call addwcos + sar ax,1 + mov di, p00 + call set3drot +;---add more text to 3d scroller + sub word [textcnt],SCROLLSPEED + jnc .lt1 + mov word [textcnt],LETTERDOTSPACING*8-1 + mov si,[text] + mov bl,[si] + xor bl,XORTEXTS + and bx,255 + jz .lt3 + inc si + mov [text],si + cmp bl,32 + jge .lt4 + shl bx,SCROLLDELAYSHL + mov [textcnt],bx + jmp .lt1 +.lt4: mov bp,0 + mov si,4100 + call letter3d + jmp .lt1 +.lt3: mov si, text0 + mov [text],si +.lt1: ;;; +;======adlib music + jmp a_dorow + +;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Main routine ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ +;stack @ cs:0fffeh + +main: +;ÍÍÍÍÍÍÍÍÍ Zero Zerodata & Init Segs ÍÍÍÍÍÍÍ +[bits 16] + push cs + push cs + pop ds + pop es + mov cx,(zeroend-zerobeg)/2 + mov di, 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 .lo1 +.lo2: jmp endansi ;80(1)86 +.lo1: mov bx, rows + sgdt [bx] + cmp byte [bx+5],0 + js .lo2 +;ÍÍÍÍÍÍÍÍÍ Check for VGA ÍÍÍÍÍÍÍÍÍ + 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 +.la1: int 10h + inc al + loop .la1 + mov cx,8*320/2 + mov bx, font + xor di,di +.la2: mov ax,es:[di] + mov [di+bx],ax + add di,2 + loop .la2 +;ÍÍÍÍÍÍÍÍÍ Initialize - vga ÍÍÍÍÍÍÍÍÍ + ;init videomode 320x200x16 + mov ax,0dh + int 10h + ;set up rows/cols/etc + mov si,-2 + mov di, vbuf-44 + mov bl,128 + xor bp,bp + jmp .lb5 +.lb1: mov rows[si],di + mov colb[si],bl + mov colbww[si],cx + shr cl,1 + rcr ch,1 + mov colbw[si],dx + shr dl,1 + rcr dh,1 + mov colbv[si],ax + shr al,1 + rcr ah,1 + mov cols[si],bp + ror bl,1 + jnc .lb4 + inc bp +.lb5: mov cx,0000000011111110b + mov dx,0000000001111100b + mov ax,0000000000111000b +.lb4: add di,44 + add si,2 + cmp si,(320)*2 + jle .lb1 + ;set simplex palette order (16 color mode) + mov dx,3dah + in al,dx + mov dl,0c0h + xor ax,ax + mov cx,16 +.lb2: out dx,al + out dx,al + inc al + loop .lb2 + mov al,20h + out dx,al +;ÍÍÍÍÍÍÍÍÍ Initialize - doinit ÍÍÍÍÍÍÍÍÍ + mov cx,DOTNUM + mov bx, dots-2 +.lc1: push cx + call rand + call rand + call rand + sar ax,2 + mov [bx],ax + add bx,2 + mov word [bx], pset1 + pop cx + loop .lc1 +;ÍÍÍÍÍÍÍÍÍ 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, endtext + push 0b800h ;if the user has an MGA or HGC + pop es ;it's not my problem :-) + xor di,di + mov ah,0eh +.l1: lodsb + xor al,XORTEXTS + cmp al,31 + jae .l2 + mov ah,al + jmp .l1 +.l2: jz .l3 + stosw + jmp .l1 +.l3: mov ax,4c00h + int 21h + +;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Initialized (nonzero) data ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +;pointer & delay counter for scrolltext +text dw text0 +textcnt dw 1 + +;3d rotation values (more in zerodata) +udforced: + dw 0 +udforce dw 64 +lrwave dw -20000 +zwave dw 16000 + +sintable: ;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: + + 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: + 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 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: +dw ains6 +dw ains2 +dw ains4 +dw ains3 +dw ains3 +dw ains1 +dw ains1 +dw ains4 +ains1: +db 65,194,6,0,35,242,240,240,1,0,4 +ains2: +db 145,64,135,128,243,111,35,3,1,1,2 +ains3: +db 225,33,17,128,17,19,34,34,0,0,12 +ains4: +db 97,33,27,0,98,132,86,85,0,0,14 +ains6: +db 145,64,135,136,243,111,35,3,1,1,2 +music_patterns: +ach0 dw ach0d, ach0dr +ach1 dw ach1d, ach1dr +ach2 dw ach2d, ach2dr +ach3 dw ach3d, ach3d +ach4 dw ach4d, ach4d +ach5 dw ach5d, ach5d +ach6 dw ach6d, ach6d +ach7 dw ach7d, ach7d +ach0d: +db 081h +ach0dr: +db 057h,050h,050h,055h,057h,050h,055h,057h +db 050h,055h,057h,050h,055h,057h,050h,055h +db 0 +ach1d: +db 081h +ach1dr: +db 050h,055h,057h,050h,055h,057h,050h,055h +db 057h,050h,055h,057h,050h,055h,057h,050h +db 0 +ach2d: +db 0C0h,050h,084h +db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah +db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah +ach2dr: +db 030h,020h,030h,020h,02Ah,01Ah,02Ah,01Ah +db 025h,015h,025h,015h,028h,018h,02Ah,01Ah +db 0 +ach3d: +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: +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: +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: +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: +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: ;scrolltext (numbers are delays) + db 31 ^ XORTEXTS + db 25 ^ XORTEXTS + db 'C' ^ XORTEXTS + db 'A' ^ XORTEXTS + db 'L' ^ XORTEXTS + db 'L' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'S' ^ XORTEXTS + db 'T' ^ XORTEXTS + db 'A' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'P' ^ XORTEXTS + db 'O' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'T' ^ XORTEXTS + db 9 ^ XORTEXTS + db 'F' ^ XORTEXTS + db 'U' ^ XORTEXTS + db 'T' ^ XORTEXTS + db 'U' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'E' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'C' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'E' ^ XORTEXTS + db 'W' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'W' ^ XORTEXTS + db 'O' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'L' ^ XORTEXTS + db 'D' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'H' ^ XORTEXTS + db 'Q' ^ XORTEXTS + db 9 ^ XORTEXTS + db 'C' ^ XORTEXTS + db 'D' ^ XORTEXTS + db 'N' ^ XORTEXTS + db 9 ^ XORTEXTS + db 'G' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'A' ^ XORTEXTS + db 'V' ^ XORTEXTS + db 'I' ^ XORTEXTS + db 'S' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'E' ^ XORTEXTS + db 'U' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'O' ^ XORTEXTS + db 9 ^ XORTEXTS + db 'A' ^ XORTEXTS + db 'N' ^ XORTEXTS + db 'D' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'M' ^ XORTEXTS + db 'O' ^ XORTEXTS + db 'R' ^ XORTEXTS + db 'E' ^ XORTEXTS + db 0 ^ XORTEXTS + +endtext: ;endansi... well... endansiline (numbers are colors) + db 15 ^ XORTEXTS + db 'S' ^ XORTEXTS + db 't' ^ XORTEXTS + db 'a' ^ XORTEXTS + db 'r' ^ XORTEXTS + db 'P' ^ XORTEXTS + db 'o' ^ XORTEXTS + db 'r' ^ XORTEXTS + db 't' ^ XORTEXTS + db 3 ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'Ä' ^ XORTEXTS + db 'Ä' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 11 ^ XORTEXTS + db 'V' ^ XORTEXTS + db '3' ^ XORTEXTS + db '2' ^ XORTEXTS + db 'b' ^ XORTEXTS + db 'i' ^ XORTEXTS + db 's' ^ XORTEXTS + db ' ' ^ XORTEXTS + db '+' ^ XORTEXTS + db '3' ^ XORTEXTS + db '5' ^ XORTEXTS + db '8' ^ XORTEXTS + db '-' ^ XORTEXTS + db '0' ^ XORTEXTS + db '-' ^ XORTEXTS + db '8' ^ XORTEXTS + db '0' ^ XORTEXTS + db '4' ^ XORTEXTS + db '4' ^ XORTEXTS + db '6' ^ XORTEXTS + db '2' ^ XORTEXTS + db '6' ^ XORTEXTS + db ' ' ^ XORTEXTS + db '+' ^ XORTEXTS + db '3' ^ XORTEXTS + db '5' ^ XORTEXTS + db '8' ^ XORTEXTS + db '-' ^ XORTEXTS + db '0' ^ XORTEXTS + db '-' ^ XORTEXTS + db '8' ^ XORTEXTS + db '0' ^ XORTEXTS + db '4' ^ XORTEXTS + db '1' ^ XORTEXTS + db '1' ^ XORTEXTS + db '3' ^ XORTEXTS + db '3' ^ XORTEXTS + db 3 ^ XORTEXTS + db ' ' ^ XORTEXTS + db 'Ä' ^ XORTEXTS + db 'Ä' ^ XORTEXTS + db ' ' ^ XORTEXTS + db 15 ^ XORTEXTS + db 'F' ^ XORTEXTS + db 'C' ^ XORTEXTS + db '-' ^ XORTEXTS + db 'W' ^ XORTEXTS + db 'H' ^ XORTEXTS + db 'Q' ^ XORTEXTS + db 31 ^ XORTEXTS +endtext1: + +db 0fch + + +;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Uninitialized (zero) data ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +zerobeg: ;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: + db 44*200 dup(0) ;video buffer + db 44*8 dup(0) ;positive overflow for videobuffer + +ALIGN 4 +font: + 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: + dw DOTNUM dup(0,0,0,0) ;x,y,z,routine data for each dot + +;2x2 rotation matrices +r00: dw 0 +ar10: dw 0 +r01: dw 0 +ar11: 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: ;end zero clear here