.386 CODE SEGMENT USE16 ASSUME CS:CODE,DS:CODE ORG 100h START: ;============= INIT mov ah,4Ah mov bx,1000h int 21h mov ah,48h mov bx,2000h int 21h jnc MemOK mov ah,9 mov dx,offset NotMem int 21h ret NotMem db 'not enough memory$' MemOK: mov FreeMem,ax mov al,43h out 43h,al xor al,al out 40h,al out 40h,al call UnpackLogo call preparefont call makesine call ClearTXTLFB mov si,offset DataArea+1553 mov dx,821 mov ax,cs:freemem add ax,0F40h mov es,ax xor di,di call UnpackText xor ax,ax mov cs:NextChar,ax mov ax,13h int 10h mov dx,3C2h mov al,0E3h out dx,al call InitColorFade call InitSound SetLogoPalete: mov dx,3C8h mov al,128 out dx,al inc dx xor al,al SLP_1: out dx,al out dx,al out dx,al inc al inc al cmp al,40h jnz SLP_1 mov dx,3C8h mov al,255 out dx,al inc dx mov al,63 out dx,al out dx,al out dx,al mov ax,cs:freemem mov es,ax xor di,di mov cx,14400 xor eax,eax rep stosd xxxx: call PutWaves call PutLogo call ViewText call ShowTXTLFB call ColorFade call ShowLFB mov ah,1 int 16h jz xxxx xor ah,ah int 16h jmp ExitApp ;============ SHOW LFB ShowLFB: mov ax,cs:freemem mov ds,ax mov ax,0A000h mov es,ax xor si,si mov di,3200 mov cx,14400 rep movsd mov ax,ds mov es,ax xor di,di mov cx,14400 xor eax,eax rep stosd ret ;============= SHOW TEXT LFB ShowTXTLFB: mov ax,cs:freemem mov es,ax add ax,1200h mov ds,ax xor si,si xor di,di mov dl,180 STL_1: mov cx,288 STL_2: lodsb or al,al jz STL_3 mov es:di,al STL_3: inc di dec cx or cx,cx jnz STL_2 add di,32 dec dl or dl,dl jnz STL_1 ret ;============ CLEAR TXT LFB ClearTXTLFB: mov ax,cs:freemem add ax,1200h mov es,ax xor di,di mov cx,12960 xor eax,eax rep stosd ret ;============= EXIT ExitApp: call EndSound mov ax,3 int 10h mov ax,cs:FreeMem mov es,ax mov ah,49h int 21h ret ;============= MAKE SINEWAVE MakeSine: mov ax,cs mov ds,ax mov si,offset DataArea mov ax,freemem add ax,0F00h mov es,ax xor di,di mov cx,64 rep movsb mov al,127 mov si,di stosb mov ax,es mov ds,ax mov cx,63 MS_1: mov al,ds:si dec si stosb loop MS_1 xor si,si mov cx,128 MS_2: lodsb not al stosb loop MS_2 ret ;============= TEXT UNPACKER UnpackText: xor cl,cl mov ax,cs mov ds,ax UT_1: mov ax,ds:si shr ax,cl and al,63 stosb add cl,6 mov ch,cl and ch,7 cmp cl,ch jz UT_2 inc si and cl,7 UT_2: dec dx or dx,dx jnz UT_1 ret ;============= GET TEXT PARAMETERS GetTextHi: xor dl,dl push si GTH_1: lodsb or al,al jnz GTH_2 pop si ret GTH_2: cmp al,1 jnz GTH_1 inc dl jmp GTH_1 GetLineLen: push si mov dx,-1 GLL_1: inc dx lodsb cmp al,1 jnz GLL_1 pop si ret ;============= PREPARE GRAPHIC FONT PrepareFont: mov ax,1130h mov bh,6 int 10h mov ax,es mov ds,ax xor di,di mov bx,offset CharTable+3 mov ax,cs:freemem add ax,1000h mov es,ax mov ch,61 PF_1: mov al,cs:bx inc bx xor ah,ah shl ax,4 mov si,ax add si,bp xor cl,cl PF_2: lodsb mov dl,al or cl,8 PF_3: xor al,al shl dl,1 jnc PF_4 mov al,-1 PF_4: stosb dec cl test cl,15 jnz PF_3 PF_5: sub cl,16 or cl,cl jnz PF_2 dec ch or ch,ch jnz PF_1 mov ax,cs mov ds,ax mov es,ax ret ;============= PUT WAVES PutWaves: mov ax,cs:freemem mov es,ax add ax,0F00h mov ds,ax xor di,di xor bx,bx mov ch,cs:lastvalue xor cl,cl XLoop: movzx bp,cl shl bp,3 add bp,256 mov ah,cl shr ah,4 add ch,ah mov al,cl not al mul al shr ah,1 mov al,ch shl al,1 xlat imul ah mov al,ah movsx ax,al add ax,90 not ax imul bp mov dx,ax mov si,90 shl bp,1 XLoop2: mov al,dh xlat xor al,80h mov ah,cl not ah mul ah shr ah,2 add ah,64 mov es:di,ah add di,640 add dx,bp dec si or si,si jnz XLoop2 add di,7938 inc cl inc cl or cl,cl jnz XLoop mov al,cs:lastvalue inc al mov cs:lastvalue,al ret LastValue db 0 ;============= TEXT VIEWER ViewText: mov ax,cs:freemem add ax,0F40h mov ds,ax mov si,cs:NextChar mov ax,cs:FrameCount or ax,ax jz VT_1 cmp ax,1 jnz VT_0 call GetTextHi or dl,dl jnz VT_NoLoop xor ax,ax mov cs:nextchar,ax mov al,128 mov cs:FrameCount,ax jmp VT_Exit VT_NoLoop: movzx bx,dl shl bx,3 dec dl movzx ax,dl shl ax,1 add bx,ax mov ax,90 sub ax,bx mov bx,288 mul bx mov cs:RefAdress,ax call GetLineLen mov di,144 shl dx,2 sub di,dx add di,cs:RefAdress mov cs:NextAdress,di jmp VT_Exit VT_0: cmp ax,2 jnz VT_Exit call ClearTXTLFB VT_Exit: mov ax,cs:Framecount dec ax mov cs:Framecount,ax ret VT_1: lodsb mov cs:nextchar,si or al,al jnz VT_2 mov ax,512 mov cs:FrameCount,ax ret VT_2: cmp al,1 jnz VT_3 add cs:RefAdress,5760 call GetLineLen mov di,144 shl dx,2 sub di,dx add di,cs:RefAdress mov cs:NextAdress,di ret VT_3: sub al,3 mov bl,al mov ax,cs:NextAdress mov di,ax add ax,8 mov cs:NextAdress,ax jmp PutChar NextChar dw 0 FrameCount dw 64 RefAdress dw 0 NextAdress dw 0 ;============= PUT CHARACTER PutChar: mov ax,cs:freemem add ax,1000h mov ds,ax add ax,200h mov es,ax movzx si,bl shl si,7 mov cl,16 PC_1: movsd movsd add di,280 dec cl or cl,cl jnz PC_1 ret ;============= UNPACK LOGO UnpackLogo: mov ax,cs mov ds,ax mov ax,freemem add ax,1EA8h mov es,ax mov si,offset DataArea+64 xor di,di Unpack: lodsb test al,128 jz Nopacked and al,127 dec al movzx cx,al xor al,al or cx,cx jz NoPacked rep stosb NoPacked: stosb cmp di,4480 jnz UnPack mov ax,es mov ds,ax xor si,si xor di,di mov cx,4480 xor dl,dl UnPack2: lodsb shr al,1 jnc UP2NoSign not al UP2NoSign: add dl,al mov al,dl add al,128 stosb loop UnPack2 RotateLogo: mov ax,es add ax,1F0h mov es,ax mov di,27 xor si,si mov ch,28 RL_1: mov cl,160 RL_2: lodsb mov es:di,al add di,28 dec cl or cl,cl jnz RL_2 sub di,4481 dec ch or ch,ch jnz RL_1 push ds push es pop ds pop es xor si,si xor di,di mov cx,1120 rep movsd ret ;============= PUT LOGO Putlogo: mov ax,cs:freemem mov es,ax add ax,1EA8h mov ds,ax xor si,si mov di,3490 mov ch,160 PL_1: mov cl,28 PL_2: movsb dec cl or cl,cl jnz PL_2 add di,292 dec ch or ch,ch jnz PL_1 ret ;============= COLOR FADE InitColorFade: mov ax,cs mov ds,ax mov es,ax mov di,offset FadeState mov ax,256 stosw xor ax,ax stosw stosw ColorFade: mov ax,cs mov ds,ax mov cl,3 mov si,offset FadeState CF_1: mov al,ds:si inc si mov bl,ds:si test bl,128 jnz CF_SUB add al,bl cmp al,255 jz CF_NextRow jmp CF_XADD CF_SUB: add al,bl or al,al jz CF_NextRow CF_XADD: dec si mov ds:si,al inc si inc si dec cl or cl,cl jnz CF_1 jmp CF_Prep&Set CF_NextRow: mov al,FadeCount inc al cmp al,6 jnz CF_NoCycle xor al,al CF_NoCycle: mov FadeCount,al mov cl,3 mul cl mov si,offset FadeTable add si,ax lodsb mov FadeState+1,al lodsb mov FadeState+3,al lodsb mov FadeState+5,al CF_Prep&Set: mov dx,3DAh in al,dx test al,8 jz CF_WaitForSync CF_XtremeWait: in al,dx test al,8 jnz CF_XtremeWait CF_WaitForSync: in al,dx test al,8 jz CF_WaitForSync mov ax,freemem add ax,0F10h mov es,ax xor di,di mov bl,FadeState mov bh,FadeState+2 mov ch,FadeState+4 mov cl,1 CF_PS_1: mov al,bl mul cl mov al,ah stosb mov al,bh mul cl mov al,ah stosb mov al,ch mul cl mov al,ah stosb inc cl cmp cl,65 jnz CF_PS_1 mov ax,es mov ds,ax xor si,si mov dx,3C8h mov al,64 out dx,al inc dx mov cx,192 CF_PS_2: lodsb out dx,ax loop CF_PS_2 ret FadeState db 0,0,0,0,0,0 FadeCount db 0 FadeTable db 0,0,-1 db 0,1,0 db -1,0,0 db 0,0,1 db 0,-1,0 db 1,0,0 ;============= SWOUND SYSTEM InitSound: cli mov ax,cs mov ds,ax call resetcard mov ax,offset DataArea+1108 mov lastpos,ax xor al,al mov delaycount,al mov ax,3508h int 21h mov oldint,bx mov oldint+2,es mov ax,2508h mov dx,offset playerint int 21h sti ret EndSound: cli call resetcard mov ax,cs mov ds,ax mov dx,oldint mov ax,oldint+2 mov ds,ax mov ax,2508h int 21h sti ret PlayerInt: cli push ax mov al,cs:delaycount or al,al jz PlayNextRow dec al mov cs:delaycount,al jmp IntEnd PlayNextRow: pusha push ds push es mov ax,cs mov ds,ax mov es,ax mov al,1 mov delaycount,al playrow: mov si,lastpos lodsb or al,al jz playrowe playrow1: cmp al,255 jnz playrow2 mov ax,offset DataArea+1108+127 mov lastpos,ax jmp playrow playrow2: mov cl,0 mov ch,al playrow5: mov al,1 shl al,cl test ch,al jz playrow3 lodsb cmp al,254 jz playrow4 call playnote jmp playrow3 playrow4: call stopnote playrow3: inc cl cmp cl,3 jnz playrow5 playrowe: mov lastpos,si pop es pop ds popa IntEnd: mov al,20h out 20h,al pop ax sti iret playnote: push cx push si mov ch,al mov si,offset inst1 mov al,cl mov bl,11 mul bl add si,ax mov al,cl mov bx,offset operator xlat mov cl,al mov ah,0B0h ;reset chanel add ah,cl xor al,al call output mov ah,20h add ah,cl lodsb call output mov ah,20h add ah,cl add ah,3 lodsb call output mov ah,40h add ah,cl lodsb test ch,128 jz pn1 mov al,8 pn1: call output mov ah,40h add ah,cl add ah,3 lodsb test ch,128 jz pn2 mov al,8 pn2: call output mov ah,60h add ah,cl lodsb call output mov ah,60h add ah,cl add ah,3 lodsb call output mov ah,80h add ah,cl lodsb call output mov ah,80h add ah,cl add ah,3 lodsb call output mov ah,0F0h add ah,cl lodsb call output mov ah,0F0h add ah,cl add ah,3 lodsb call output mov ah,0C0h add ah,cl lodsb call output mov bx,offset notefreq mov al,ch and al,15 shl al,1 push ax xlat mov ah,0A0h add ah,cl call output pop ax inc al xlat mov dl,al mov al,ch and al,070h shr al,2 or al,dl or al,20h mov di,offset keyoffval xor ch,ch add di,cx stosb mov ah,0B0h add ah,cl call output pop si pop cx ret StopNote: mov bx,offset Operator mov al,cl xlat add al,0B0h mov ah,al mov bx,offset keyoffval mov al,cl xlat and al,0DFh call output ret resetcard: mov cx,256 resetloop: mov ah,cl mov al,0 call output loop resetloop mov ah,0BDh mov al,01000000b ret output: mov dx,388h xchg ah,al out dx,al in al,dx in al,dx in al,dx in al,dx mov al,ah inc dx out dx,al dec dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx in al,dx ret oldint dw 0,0 notefreq dw 342,363,385,408,432,458,485,514,544,577,611,647 operator db 0,01,02,08,09,10,16,17,18 inst1 db 0,0,0,0,0F6h,0F6h,8,6,2,0,1 inst2 db 60h,60h,9,9,0F6h,0F6h,4,4,3,1,7 inst3 db 0,20h,7,3,0F4h,0F4h,6,6,0,0,0 keyoffval db 0,0,0 delaycount db 0 lastpos dw 0 ;============= GLOBAL DATA CharTable db 1Ah,13,9,' 0123456789aBcDeFGHiJKLmnoPQRsTUvwxyZ.,/;:()+-=[]*''!@#$%^&\<>' FreeMem dw 0 DataArea db ? CODE ENDS END START