home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Equalizer BBS
/
equalizer-bbs-collection_2004.zip
/
equalizer-bbs-collection
/
DEMOSCENE-STUFF
/
WM_SRC.ZIP
/
WM.ASM
< prev
next >
Wrap
Assembly Source File
|
1995-10-13
|
61KB
|
2,145 lines
Dosseg
model large
.386p
;------------------
; MESSAGES=1 ; Comment out this line to remove message output.
;------------------
Assume ss:stack1,cs:code16,ds:data1
;code16 segment para use16
;code16 ends
data1 segment para use16
;--------------
; Generic data.
;--------------
IFDEF MESSAGES
Header db 10,13," ·W·I·N·T·E·R·M·U·T·E· 1.0 ",10,13
db "───────────────────────────",10,13,"$"
V86 db " ■ System is running in Protected Mode.",10,13,"$"
EMM db " ■ An EMM manager has been detected.",10,13,"$"
Err_ db " ■ Error:"
No_w db " Re-boot computer in real mode...",10,13,"$"
ENDIF
ChangeMode dw 0
Seg_ dw 0
Tst db 0
EMMName DB "EMMXXXX0",0
Status DB 0 ; 0=Real Mode, 0FFH=Real Mode Switched
;-----------
; XMS Stuff.
;-----------
;IFDEF MESSAGES
XMS_OK DB " ■ XMS Manager present.",10,13,"$"
NO_XMS DB " ■ XMS Manager not found.",10,13,"$"
A20 DB " ■ A20 Gate is not enabled!",10,13,"$"
BLOCK DB " ■ Largest free block: $"
BSIZE DB "0000 Kb.",10,13,"$"
ALL_ERR DB " ■ Couldn't allocate memory.",10,13,"$"
L_ERR DB " ■ Couldn't lock memory.",10,13,"$"
L_OK DB " ■ Memory allocated and locked at: ","$"
BASE1 DB "0000$"
BASE2 DB "0000h",10,13,"$"
;ENDIF
MSIZE DW 0
HANDLE DW 0
XMS_PTR DW 0,0
MEM_ADD DW 0,0
Values DB "0123456789ABCDEF"
;----------------------
; RAW environment data.
;----------------------
RAW_ME DB " ■ RAW environment with $"
RAW_M DB "0000h Kbs.",10,13,"$"
RAW_CHECK DB 0
;----------------
; Soundcard data.
;----------------
SBlast DB " ■ SoundBlaster found at address "
SB_Base DB "000h, Irq "
Irq_ DB "0, DMA "
DMA_ DB "0.",10,13,"$"
GUS DB " ■ Gravis UltraSound found at address "
GUSBase DB "000h, "
GUSMEM DB "0000Kb of DRAM available.",10,13,"$"
NO_MUS DB " ■ ULTRASND/BLASTER environment variable not found."
DB 10,13,"$"
Card DB 0 ; 0=Nothing, 1=SB, 2=GUS
IRQ DB 0 ; IRQ vector (if needed)
DMA DB 0 ; DMA channel
BASEADD DW 0 ; Base address of soundcard
DRAM DW 0 ; GUS DRAM
;----------------------
; Flat Real Mode Table.
;----------------------
GDT dw 4 dup (0)
GDT_code16=8
dw 0FFFFh,0,9A00H,0 ; 16 bit code segment
GDT_code32=16
dw 0FFFFH,0,9A00H,0CFH ; 32 bit code segment
GDT_data16=24
dw 0FFFFH,0,9200H,0 ; 64k data segment
GDT_data32=32
dw 0FFFFH,0,9200H,8FH ; 4 Gig. data segment
ptr_GDT LABEL FWORD
dw 40-1 ; GDT size-1
dd offset data1:GDT
dw 0
;---------
save_NMI db 0
;--------
Music_call dw PLAYER,PLAYER
data1 ends
PLAYER segment para use16
DB 100H DUP (90H)
include ULTRASND.DRV
PLAYER ENDS
Mod_seg segment para use16
include reverie.dat
Mod_seg ends
data2 segment para public use16
Buffer db 64000 dup (0)
public Tabl
public Integer
public Fract
public Pointer
public StartPoint
public Y
public Size_
public Reduce
public Buffer
Tabl LABEL WORD
include stretch.tab
Integer DW 0
Fract DW 0
Pointer DW 0
StartPoint DW 0
Y DW 0
Size_ DW 0
Reduce DW 248
data2 ends
logo1 segment para use16
logo db "LOGO1"
db 64000 dup (0)
Pal db "PAL1"
db 768 dup (0)
logo1 ends
data3 segment para public use16
Buffer1 db "MUÑECO"
db 64000 dup (0)
data3 ends
data4 segment para use16
circles db "cir"
db 64000 dup (0)
cirpal db "cirpal"
db (768-6) dup (0)
ZDelta DW 0
Delta2 DW 0
data4 ends
stack1 segment para use16 stack 'STACK'
db 800h dup (?)
stack1 ends
code16 segment para use16
start:
;---------------
; Get Soundcard.
;---------------
call pre_code
call GET_SOUND
;----------------------------------
; All Interrupt stuff is done here.
;----------------------------------
; call pre_code
;------------------------------
; Check if running in PM or V86
;------------------------------
mov ax,data1
mov ds,ax
IFDEF MESSAGES
mov dx,offset Header
mov ax,0900h
int 21h
ENDIF
smsw ax
test al,1
jnz Is_V86
xor al,al
mov ds:[Status],al
jmp @@1
Is_V86: nop
IFDEF MESSAGES
lea dx,V86
mov ax,0900h
int 21h
ENDIF
mov al,0FFh
mov ds:[Status],al
;-----------------------------------
; Check Out for EMM386/QEMM/386^MAX.
;-----------------------------------
mov ax,3D00H
mov dx,offset EMMName
int 21h
jnc @2
;----------------------------------------
; No EMM386 but in Protected Mode. Abort.
;----------------------------------------
IFDEF MESSAGES
lea dx,No_w
mov ax,0900h
int 21h
ENDIF
jmp @end
@2: mov bx,ax
mov ax,3E00h
int 21h
IFDEF MESSAGES
lea dx,EMM
mov ax,0900h
int 21h
ENDIF
;------------------
; Call XMS manager.
;------------------
call XMS_Manager
IFDEF MESSAGES
call Sound_Info
ENDIF
;---------------------
; Fake Windows Startup
;---------------------
mov ax,1605H
xor bx,bx
xor cx,cx
xor dx,dx
xor si,si
mov ds,bx
mov es,bx
mov di,30AH ; Fake windows version 3.10
int 2Fh
;-----------------------
; Test for permission...
;-----------------------
; DS:SI should point to a Mode Switch routine.
; CX _MUST_ be =0
cmp cx,0
jne @E1
mov ax,ds
add ax,si
cmp ax,0
jne @rm1
;-----------------------------------------------
; If DS:SI= 00:00 then abort. Fake Windows Exit.
;-----------------------------------------------
@E1:
mov ax,1606H
xor bx,bx
xor dx,dx
int 2FH
sti
mov ax,data1
mov ds,ax
IFDEF MESSAGES
lea dx,Err_
mov ax,0900h
int 21h
ENDIF
call UNLOCK_MEM
mov ax,4c00h
int 21h
;---------------------------------
; Store pointer to switch routine.
;---------------------------------
@rm1: mov ax,data1
mov es,ax
mov bp,offset ChangeMode
mov es:[bp],si
mov ax,ds
mov es:[bp+2],ax
;----------------------------------------------------
; Enter Real Mode. (Remember= No interrupts allowed!)
;----------------------------------------------------
cli
xor ax,ax
call dword ptr es:[ChangeMode]
;----------------------
; Enter Flat Real Mode.
;----------------------
call Init_FRM
;--------------------------
; Real mode code call here
;--------------------------
call rmode_code
;-------------------------------
; Switch back to Protected Mode.
;-------------------------------
mov ax,data1
mov es,ax
mov ax,1
call dword ptr es:[ChangeMode]
;----------------------
; Simulate Windows exit
;----------------------
mov ax,1606H
xor dx,dx
int 2FH
sti
call UNLOCK_MEM
jmp @end
;------------------------------------------------
; Computer was already in Real Mode. (Enable FRM)
;------------------------------------------------
@@1:
call XMS_Manager
IFDEF MESSAGES
call Sound_Info
ENDIF
call Init_FRM
call rmode_code
mov ax,data1
mov ds,ax
mov al,ds:[RAW_CHECK]
cmp al,0FFh
je @end
call UNLOCK_MEM
@end:
mov ax,4c00h
int 21h
;---------------------------------------
; Flat Real Mode Initialization routine.
;---------------------------------------
Init_FRM:
mov ax,data1
mov es,ax
mov ax,code16
movzx eax,ax
shl eax,4 ; Physical address in EAX
mov word ptr es:GDT[GDT_code16+2],ax
ror eax,16
mov byte ptr es:GDT[GDT_code16+4],al
mov ax,data1 ; Segment that contains GDT
movzx eax,ax
shl eax,4
add dword ptr es:ptr_GDT+2,eax ; Physical address of GDT
lgdt fword ptr es:ptr_GDT
cli
; Clear NMI
mov ax,data1
mov ds,ax
in al,70h
mov ds:[save_NMI],al
mov al,80h
out 70h,al
mov eax,cr0
or al,1
mov cr0,eax
;---
db 0EAH ; FAR JUMP
dw offset pmode
dw GDT_code16
pmode: mov ax,GDT_data32
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov eax,cr0
and al,0feh
mov cr0,eax
db 0eah
dw offset rmode
dw code16
rmode: sti
mov ax,data1
mov ds,ax
mov al,ds:[save_NMI]
out 70h,al
RET
;-------------------
; Interrupt handler.
;-------------------
Interrupt:
pushad
push ds
push es
mov ax,data1
mov ds,ax
mov al,ds:[Status]
or al,al
jz realthing
mov ax,1
cli
call dword ptr ds:[ChangeMode] ; Enter V86 mode.
mov ax,1606H ; Exit Windows.
xor bx,bx
xor dx,dx
int 2FH
realthing:
sti
pop es
pop ds
popad
ror eax,16
mov cs:[selfmod],al
jmp $+2
rol eax,16
DB 0CDh
selfmod DB 00h ; Self-modifying code!!!
cli
push ax
push ds
mov ax,data1
mov ds,ax
mov al,ds:[Status]
or al,al
jz real_too
push es
push fs
push gs
mov ax,1605H
xor bx,bx
xor cx,cx
xor dx,dx
xor si,si
mov ds,bx
mov es,bx
mov di,30AH ; Fake windows version 3.10
int 2Fh
cli
xor ax,ax
call dword ptr ds:[ChangeMode]
call Init_FRM
pop gs
pop fs
pop es
real_too:
pop ds
pop ax
RET
;-----------------------
; Register Dump routine.
;-----------------------
; IN: AX=Number DS:DI=Pointer to string.
; OUT: Nothing
; Destroys: AX,BX,CX,DX,SI,DI
WRITER:
Push di
Mov bx,ax
Mov si,offset Values
Mov dx,si
Shr ax,12
Add si,ax
Mov cl,ds:[si]
Mov ds:[di],cl
Mov ax,bx
And ah,0fh
Shr ax,8
Mov si,dx
Add si,ax
Inc di
Mov cl,ds:[si]
Mov ds:[di],cl
Mov ax,bx
Xor ah,ah
Shr al,4
Mov si,dx
Add si,ax
Inc di
Mov cl,ds:[si]
Mov ds:[di],cl
Mov al,bl
And al,0fh
Mov si,dx
Add si,ax
Inc di
Mov cl,ds:[si]
Mov ds:[di],cl
Pop dx
Mov ah,9
Int 21h
Ret
;---------------------
; XMS Manager routine.
;---------------------
XMS_Manager:
mov ax,4300h ; Check install.
int 2fh
cmp al,80h
jnz NOXMS
IFDEF MESSAGES
mov dx,offset XMS_OK
mov ax,0900h
int 21h
ENDIF
jmp GET_PTR
NOXMS: nop
IFDEF MESSAGES
mov dx,offset NO_XMS
mov ax,0900h
int 21h
ENDIF
jmp RAW_SYSTEM
GET_PTR:
mov ax,4310h ; Get API address.
int 2fh
mov word ptr ds:[XMS_PTR],bx
mov word ptr ds:[XMS_PTR+2],es
; Check A20 gate.
mov ax,0700h
call dword ptr ds:[XMS_PTR]
cmp ax,0
je NO_A20
cmp bl,80h
je NO_A20
jmp QUERY
NO_A20: nop
mov ax,0300h
call dword ptr ds:[XMS_PTR]
cmp ax,0
je A20_ERROR
cmp bl,80h
je A20_ERROR
jmp QUERY
A20_ERROR:
IFDEF MESSAGES
mov dx,offset A20
mov ax,0900h
int 21h
ENDIF
jmp FINNISH
QUERY: mov ax,0800h ; Query free extended block.
call dword ptr ds:[XMS_PTR]
cmp bl,80h
je NO_QUERY
mov ds:[MSIZE],ax
IFDEF MESSAGES
mov dx,offset BLOCK
mov ax,0900h
int 21h
mov ax,ds:[MSIZE]
mov di,offset BSIZE
Call Writer
ENDIF
jmp ALLOC
NO_QUERY:
jmp FINNISH
ALLOC: mov ax,0900h ; Allocate block.
mov dx,ds:[MSIZE]
call dword ptr ds:[XMS_PTR]
cmp ax,0
je FAIL
cmp bl,80h
je FAIL
mov ds:[HANDLE],dx
jmp LOCK_MEM
FAIL: nop
IFDEF MESSAGES
mov dx,offset ALL_ERR
mov ax,0900h
int 21h
ENDIF
jmp FINNISH
LOCK_MEM:
mov dx,ds:[HANDLE] ; Lock memory.
mov ax,0C00h
call dword ptr ds:[XMS_PTR]
cmp ax,0
je FAIL2
mov word ptr ds:[MEM_ADD+2],dx ; 32bit address.
mov word ptr ds:[MEM_ADD],bx
IFDEF MESSAGES
mov dx,offset L_OK
mov ax,0900h
int 21h
mov ax,word ptr ds:[MEM_ADD+2]
mov di,offset BASE1
call Writer
mov ax,word ptr ds:[MEM_ADD]
mov di,offset BASE2
call Writer
ENDIF
jmp FINNISH ; UNLOCK_MEM
FAIL2: nop
IFDEF MESSAGES
mov dx,offset L_ERR
mov ax,0900h
int 21h
ENDIF
jmp DE_ALLOC
UNLOCK_MEM:
mov ax,0D00h
mov dx,ds:[HANDLE]
call dword ptr ds:[XMS_PTR]
cmp ax,0
je FAIL3
jmp DE_ALLOC
FAIL3: jmp FINNISH
DE_ALLOC:
mov ax,0A00h
mov dx,ds:[HANDLE]
call dword ptr ds:[XMS_PTR]
cmp ax,0
je FAIL4
jmp FINNISH
FAIL4: ;jmp FINNISH
FINNISH:
RET
RAW_SYSTEM:
mov ax,data1
mov ds,ax
mov al,ds:[Status]
cmp al,0FFh
jne RAW1
mov ax,4c00h
int 21h
RAW1: mov ds:[RAW_CHECK],0FFh
call ENABLEA20
cmp ax,4
jne RAW2
mov ax,data1
mov ds,ax
mov dx,offset A20
mov ax,0900h
int 21h
mov ax,4c00h
int 21h
RAW2: mov ax,data1
mov ds,ax
mov ax,8800h
int 15h
mov ds:[MSIZE],ax
mov eax,100000h
mov dword ptr ds:[MEM_ADD],eax
mov ax,0900h
mov dx,offset RAW_ME
int 21h
mov ax,ds:[MSIZE]
mov di,offset RAW_M
call Writer
RET
;-----------------------------
; Soundcard detection routine.
;-----------------------------
GET_SOUND:
mov di,2Ch ; Environment segment is stored at PSP
mov ax,ds
mov fs,ax
mov ax,ds:[di] ; offset $2C, so [DS:2C] for both .COM
mov es,ax ; and .EXE
xor di,di
mov cx,2048
mov ax,data1
mov ds,ax
GUS1: mov al,es:[di]
cmp al,"U"
jne GUS2
mov al,es:[di+1]
cmp al,"L"
jne GUS2
mov al,es:[di+2]
cmp al,"T"
jne GUS2
mov al,es:[di+3]
cmp al,"R"
jne GUS2
mov al,es:[di+4]
cmp al,"A"
jne GUS2
mov al,es:[di+5]
cmp al,"S"
jne GUS2
mov al,es:[di+6]
cmp al,"N"
jne GUS2
mov al,es:[di+7]
cmp al,"D"
jne GUS2
mov al,es:[di+8]
cmp al,"="
jne GUS2
jmp GUS3
GUS2: inc di
dec cx
jnz GUS1
jmp NO_GUS
GUS3: add di,8
GUS4: inc di
mov al,es:[di]
cmp al," "
je GUS4
mov al,es:[di]
mov si,offset GUSBase
mov ds:[si],al
mov al,es:[di+1]
mov ds:[si+1],al
mov al,es:[di+2]
mov ds:[si+2],al
mov al,es:[di+1]
xor ah,ah
sub al,30h
shl ax,4
mov bx,200h
add bx,ax
mov ds:[BASEADD],bx
mov byte ptr ds:[Card],2
mov di,offset GUSMEM
mov cl,4
xor si,si
call CHECK_DRAM
cmp al,0CCH
je GUS5
mov ax,256
mov ds:[DRAM],ax
mov eax,"6520"
mov dword ptr ds:[di],eax
ret
GUS5: mov cl,8
xor si,si
call CHECK_DRAM
cmp al,0CCh
je GUS6
mov ax,512
mov ds:[DRAM],ax
mov eax,"2150"
mov dword ptr ds:[di],eax
ret
GUS6: mov cl,0Ch
xor si,si
call CHECK_DRAM
cmp al,0CCh
je GUS7
mov ax,768
mov ds:[DRAM],ax
mov eax,"8670"
mov dword ptr ds:[di],eax
ret
GUS7: mov ax,1024
mov ds:[DRAM],ax
mov eax,"4201"
mov dword ptr ds:[di],eax
ret
;-----------------------------------
; Check GUS DRAM (IN: ADDRESS CL:SI)
;-----------------------------------
CHECK_DRAM:
mov dx,ds:[BASEADD] ; Test GUS DRAM
add dx,103h
mov al,43h
out dx,al
mov ax,si
inc dx ; 104h
out dx,ax
mov al,44h
dec dx ; 103h
out dx,al
add dx,2 ; 105h
mov al,cl
out dx,al
add dx,2 ; 107h
mov al,0CCh
out dx,al
mov dx,ds:[BASEADD]
add dx,103h
mov al,43h
out dx,al
mov ax,si
inc dx ; 104h
out dx,ax
mov al,44h
dec dx ; 103h
out dx,al
add dx,2 ; 105h
mov al,cl
out dx,al
add dx,2 ; 107h
in al,dx
RET
NO_GUS:
mov di,2Ch ; Environment segment is stored at PSP
mov ax,fs:[di] ; offset $2C, so [DS:2C] for both .COM
mov es,ax ; and .EXE
xor di,di
mov cx,2048
SOUND1:
mov al,es:[di]
cmp al,"B"
jne SOUND2
mov al,es:[di+1]
cmp al,"L"
jne SOUND2
mov al,es:[di+2]
cmp al,"A"
jne SOUND2
mov al,es:[di+3]
cmp al,"S"
jne SOUND2
mov al,es:[di+4]
cmp al,"T"
jne SOUND2
mov al,es:[di+5]
cmp al,"E"
jne SOUND2
mov al,es:[di+6]
cmp al,"R"
jne SOUND2
mov al,es:[di+7]
cmp al,"="
jne SOUND2
mov ax,data1
mov ds,ax
jmp SOUND3
SOUND2:
inc di
dec cx
jnz SOUND1
jmp NO_Sound
SOUND3:
add di,7
SOUND4:
inc di
mov al,es:[di]
cmp al,"A"
jne SOUND4
mov si,offset SB_Base
inc di
mov al,es:[di]
mov ds:[si],al
inc si
inc di
mov al,es:[di]
mov ds:[si],al
inc si
inc di
mov al,es:[di]
mov ds:[si],al
SOUND5:
inc di
mov al,es:[di]
cmp al,"I"
jne SOUND5
inc di
mov si,offset Irq_
mov al,es:[di]
mov ds:[si],al
SOUND6:
inc di
mov al,es:[di]
cmp al,"D"
jne SOUND6
inc di
mov si,offset DMA_
mov al,es:[di]
mov ds:[si],al
mov di,offset Card
mov byte ptr ds:[di],1
mov si,offset SB_Base
inc si
mov al,ds:[si]
sub al,30h
mov bx,200h
xor ah,ah
shl ax,4
add bx,ax
mov si,offset BASEADD
mov ds:[si],bx
mov si,offset Irq_
mov al,ds:[si]
sub al,30h
mov si,offset IRQ
mov ds:[si],al
mov si,offset DMA_
mov al,ds:[si]
sub al,30h
mov si,offset DMA
mov ds:[si],al
RET
NO_Sound:
mov ax,data1
mov ds,ax
RET
;---------------------
; Dump soundcard info.
;---------------------
Sound_Info:
mov al,ds:[Card]
cmp al,0
jne SB_GUS
mov dx,offset NO_MUS
mov ax,0900h
int 21h
ret
SB_GUS: cmp al,1
jne IS_GUS
mov dx,offset SBLAST
mov ax,0900h
int 21h
ret
IS_GUS: cmp al,2
jne JOKE
mov dx,offset GUS
mov ax,0900h
int 21h
ret
JOKE: ret
;-------------------------------
; RAW environment routines
; A20 line code by Thomas Pytel.
;-------------------------------
ENABLEA20: ; hardware enable gate A20
pushf
push fs gs
cli
xor ax,ax ; set A20 test segments 0 and 0ffffh
mov fs,ax
dec ax
mov gs,ax
call enablea20test ; is A20 already enabled?
jz short @@enablea20done ; if yes, done
in al,92h ; PS/2 A20 enable
or al,2
jmp short $+2
jmp short $+2
jmp short $+2
out 92h,al
call enablea20test ; is A20 enabled?
jz short @@enablea20done ; if yes, done
call enablea20kbwait ; AT A20 enable
jnz short @@enablea20f0
mov al,0d1h
out 64h,al
call enablea20kbwait
jnz short @@enablea20f0
mov al,0dfh
out 60h,al
call enablea20kbwait
@@enablea20f0: ; wait for A20 to enable
mov cx,800h ; do 800h tries
@@enablea20l0:
call enablea20test ; is A20 enabled?
jz @@enablea20done ; if yes, done
in al,40h ; get current tick counter
jmp short $+2
jmp short $+2
jmp short $+2
in al,40h
mov ah,al
@@enablea20l1: ; wait a single tick
in al,40h
jmp short $+2
jmp short $+2
jmp short $+2
in al,40h
cmp al,ah
je @@enablea20l1
loop @@enablea20l0 ; loop for another try
; mov bp,sp ; error, A20 did not enable
mov ax,4 ; error code 4
; mov word ptr [bp+6],offset init_done ; set init_done return address
@@enablea20done:
pop gs fs
popf
ret
;-----------------------------------------------------------------------------
enablea20kbwait: ; wait for safe to write to 8042
xor cx,cx
@@enablea20kbwaitl0:
jmp short $+2
jmp short $+2
jmp short $+2
in al,64h ; read 8042 status
test al,2 ; buffer full?
loopnz @@enablea20kbwaitl0 ; if yes, loop
ret
;-----------------------------------------------------------------------------
enablea20test: ; test for enabled A20
mov al,fs:[0] ; get byte from 0:0
mov ah,al ; preserve old byte
not al ; modify byte
xchg al,gs:[10h] ; put modified byte to 0ffffh:10h
cmp ah,fs:[0] ; set zero if byte at 0:0 not modified
mov gs:[10h],al ; put back old byte at 0ffffh:10h
ret ; return, zero if A20 enabled
;--------------------
; Put your code here.
;--------------------
rmode_code:
jmp st1
INCLUDE PLAYER.INC ;RUTINA DE LLAMADA AL PLAYER!!
st1:
mov bp,1
call PLAYER_FUNCTION ; Init
jnc init_ok
RET
init_ok:
mov cx,Mod_seg
mov bp,2
call Player_function ; Load Mod
mov bp,3
call Player_function ; Play
;---
check1:
mov bp,13
call Player_function ; Get Patt pos
cmp al,1
jne check1
;---
mov ax,logo1
mov es,ax
mov ax,0A000h
mov fs,ax
mov ax,data2
mov ds,ax
assume ds:data2,es:nothing,fs:nothing,gs:nothing,ss:nothing
; xor eax,eax
; xor ebx,ebx
stretcher:
mov bp,offset Tabl
add bp,ds:[Pointer]
xor dx,dx
xor ax,ax
mov al,ds:[bp]
shr ax,1
mov bx,160
sub bx,ax
mov ds:[StartPoint],bx
mov ax,320
xor bx,bx
mov bl,ds:[bp]
mov ds:[Size_],bx
div bx
mov ds:[Integer],ax
mov ax,0
div bx
mov ds:[Fract],ax
mov si,offset logo
mov ax,ds:[Y]
add si,ax
mov di,offset Buffer
add di,ax
add di,ds:[StartPoint]
xor ax,ax
mov dx,ds:[Size_]
copy:
push dx
mov bx,ds:[Integer]
mov cx,ds:[Fract]
add ax,cx
adc si,bx
inc di
mov dh,es:[si]
mov ds:[di],dh
pop dx
dec dx
jnz copy
add ds:[Y],320
cmp ds:[Y],64000
jb go_on
mov dx,03dah
@retrace:
in al,dx
test al,8
je @retrace
@retrac2:
in al,dx
test al,8
jne @retrac2 ; Wait for vertical retrace
xor ax,ax
mov ds:[Y],ax
mov si,offset Buffer
xor di,di
mov cx,16000
blitt:
mov eax,ds:[si]
mov fs:[di],eax
add si,4
add di,4
dec cx
jnz blitt
mov cx,16000
mov si,offset Buffer
xor eax,eax
@clear: mov ds:[si],eax
add si,4
dec cx
jnz @clear
; Compress...
dec ds:[Reduce]
jz end_of_thing
mov cl,70
mov si,offset Tabl
do_it:
mov al,ds:[si]
cmp al,1
jbe no_comp
dec al
mov ds:[si],al
no_comp:
inc si
dec cl
jnz do_it
go_on:
inc ds:[Pointer]
cmp ds:[Pointer],70
je restart
in al,60h
cmp al,1
je end_of_thing
jmp stretcher
restart:
xor ax,ax
mov ds:[Pointer],ax
jmp stretcher
end_of_thing:
;---
mov ax,0013h
int 10h
check2:
mov bp,13
call Player_function ; Get Patt pos
cmp al,2
jne check2
jmp plas_1
Palplas LABEL BYTE
i=0
REPT 63
db i,0,0
i=i+1
ENDM
db 63,0,0
i=0
REPT 63
db 0,i,0
i=i+1
ENDM
db 0,63,0
i=0
REPT 63
db 0,0,i
i=i+1
ENDM
db 0,0,63
Sines LABEL BYTE
include plasma.inc
Delta DW 0
plas_1:
include modex.inc
mov ax,cs
mov ds,ax
mov dx,3c8h
xor al,al
out dx,al
mov si,offset Palplas
mov cx,64*3*3
inc dx
rep outsb
mov ax,data3
mov ds,ax
mov di,offset Buffer
mov ax,cs
mov fs,ax
mov bp,offset Sines
mov si,bp
mov ax,0A000h
mov es,ax
Do_Plasma:
mov si,offset Sines
add si,cs:[Delta]
mov di,offset buffer
;----------------------
; Red plasma.
; Col = sin(x)+sin(y)/2
;----------------------
xor cx,cx ; X
xor dx,dx ; Y
Red_Plasma:
add si,cx
mov bl,fs:[si] ; Sin(x)
sub si,cx
add si,dx
mov bh,fs:[si] ; Sin(y)
sub si,dx
add bl,bh
shr bl,1
mov byte ptr ds:[di],bl ; PutPixel
inc di
inc cx
cmp cx,319
jb Red_Plasma
xor cx,cx
add di,641
inc dx
cmp dx,66 ;132
jge Red_Done
jmp Red_Plasma
Red_Done:
;-----------------
; Green plasma.
; Colour = sin (x)
;-----------------
xor cx,cx ; X
xor dx,dx ; Y
mov di,offset buffer
add di,320
Green_Plasma:
add si,cx
add si,cs:[Delta]
mov bl,fs:[si] ; Sin(x)
sub si,cx
add si,dx
mov bh,fs:[si]
sub si,dx
sub si,cs:[Delta]
add bh,64
add bl,64
add bl,bh
shr bl,1
mov byte ptr ds:[di],bl ; PutPixel
inc di
inc cx
cmp cx,319
jb Green_Plasma
xor cx,cx
add di,641
inc dx
cmp dx,66 ; 132
jge Green_Done
jmp Green_Plasma
Green_Done:
;-----------------
; Blue plasma.
; Colour = sin (y)
;-----------------
xor cx,cx ; X
xor dx,dx ; Y
mov di,offset buffer
add di,640
mov si,offset Sines
Blue_Plasma:
add si,dx
mov bl,fs:[si] ; Sin(x)
sub si,dx
add bl,128
mov byte ptr ds:[di],bl ; PutPixel
inc di
inc cx
cmp cx,319
jb Blue_Plasma
xor cx,cx
add di,641
inc dx
inc dx
cmp dx,132 ;264
jge Blue_Done
jmp Blue_Plasma
Blue_Done:
;-----------------------------
; Blitt Buffer to planar Vmem.
;-----------------------------
mov dx,03dah
@r1trace:
in al,dx
test al,8
je @r1trace
@r1trac2:
in al,dx
test al,8
jne @r1trac2 ; Wait for vertical retrace
;------------
mov si,offset buffer
mov di,8000 ;8000
mov ah,00000001b ; Plane 0
mov al,02
mov dx,3c4h
out dx,ax
mov cx,16000
copy0:
mov al,ds:[si]
mov es:[di],al
inc di
add si,4
dec cx
jne copy0
mov ax,0A000h
mov es,ax
mov si,offset buffer
add si,1
mov di,8000 ;8000
mov ah,00000010b ; Plane 1
mov al,02
mov dx,3c4h
out dx,ax
mov cx,16000
copy1:
mov al,ds:[si]
mov es:[di],al
inc di
add si,4
dec cx
jne copy1
mov si,offset buffer
add si,2
mov di,8000 ;8000
mov ah,00000100b ; Plane 2
mov al,02
mov dx,3c4h
out dx,ax
mov cx,16000
copy2:
mov al,ds:[si]
mov es:[di],al
inc di
add si,4
dec cx
jne copy2
mov si,offset buffer
add si,3
mov di,8000 ;8000
mov ah,00001000b ; Plane 3
mov al,02
mov dx,3c4h
out dx,ax
mov cx,16000
copy3:
mov al,ds:[si]
mov es:[di],al
inc di
add si,4
dec cx
jne copy3
inc cs:[Delta]
cmp cs:[Delta],445
jb Still
xor ax,ax
mov cs:[Delta],ax
Still:
mov bp,13
call Player_function ; Get Patt pos
cmp al,4
je Fin
jmp Do_Plasma
Fin:
;---
mov ax,0013h
int 10h
mov ax,0A000h
mov es,ax
xor eax,eax
mov cx,16000
rep stosd
mov ax,data4
mov ds,ax
mov si,offset cirpal
xor ax,ax
mov dx,3c8h
out dx,al
inc dx
mov cx,768
rep outsb
;---
Main1:
mov bp,offset data4:circles
add bp,ds:[ZDelta]
mov si,offset data4:circles
add si,ds:[Delta2]
xor di,di
mov cx,16000
Circle:
mov eax,ds:[si]
add eax,ds:[bp]
mov es:[di],eax
add si,4
cmp si,offset data4:circles+64000
jb @10
mov si,offset data4:circles
@10:
add di,4
add bp,4
cmp bp,offset data4:circles+64000
jb @21
mov bp,offset data4:circles
; add bp,fs:[ZDelta]
@21:
cmp si,offset data4:circles+64000
jb @3
mov si,offset data4:circles
@3:
dec cx
jnz Circle
mov dx,03dah
@vetrace:
in al,dx
test al,8
je @vetrace
@vetrac2:
in al,dx
test al,8
jne @vetrac2 ; Wait for vertical retrace
; xor si,si
; xor di,di
; mov cx,16000
; rep movsd
add ds:[ZDelta],640 ;320
cmp ds:[ZDelta],64000
jb @1
xor ax,ax
mov ds:[ZDelta],ax
@1: inc ds:[Delta2]
inc ds:[Delta2]
cmp ds:[Delta2],64000
jb @5
xor ax,ax
mov ds:[Delta2],ax
@5:
mov bp,13
call Player_function ; Get Patt pos
cmp al,6
je fin4
jmp Main1
fin4:
;----
mov ax,0003h
int 10h
mov ax,cs
mov ds,ax
mov si,offset ANSI
mov ax,0B800h
mov es,ax
xor di,di
mov cx,1000
rep movsd
mov bp,10
call Player_function
mov ah,al
fade_vol:
mov al,ah
mov bp,11
call Player_function
mov dx,3dah
espera: in al,dx
test al,8
jnz espera
esp2: in al,dx
test al,8
jz esp2
dec ah
jnz fade_vol
mov bp,4
call Player_function
mov bp,5
call Player_function
RET
; 10 GET_VOLUME \ AL=MASTER_VOLUME
; 11 SET_VOLUME / BL=MUSIC_VOL, BH=FX_VOL
; 13 GET_SONGPOSITION \ AL=0..127 POSITION IN PATTERN ORDER
; al=pattern bx=row
ret
pre_code:
mov bx,20030 ;320000/16
mov ah,4ah
int 21h
push ds
push es
mov ax,0013h
int 10h
mov ax,logo1
mov ds,ax
mov ax,0A000h
mov es,ax
mov dx,3c8h
xor al,al
out dx,al
mov si,offset Pal
mov cx,768
inc dx
rep outsb
mov si,offset logo
mov di,offset Buffer
mov ax,logo1
mov es,ax
mov cx,16000
rep movsd
mov si,offset logo
xor di,di
mov ax,0A000h
mov es,ax
mov cx,16000
rep movsd
pop es
pop ds
ret
comment $
;=============================================================================
INIT_MUSIC PROC NEAR
CALL ALLOC_MUSIC ;ALLOCATE MEMORY FOR PLAYER
CALL LOAD_PLAYER ;LOAD THE RIGHT PLAYER
MOV MUSIC_FILE,0
RET
INIT_MUSIC ENDP
;=============================================================================
START_MUSIC PROC NEAR
CMP PLAYER,0 ;IS A PLAYER IN THE MEMORY?
JE SHORT GMUA1
MOV MUSIC_FILE,AX ;LOAD MUSIC
MOV DX,OFFSET MOD_NAME
MOV BP,2
CALL PLAYER_FUNCTION
JC SHORT GMUA2
CALL MUSIC_SETTINGS ;SET PLAYING PARMS
CALL LOAD_SAMPLES ;LOAD SAMPLES
MOV BP,3 ;START MUSIC
CALL PLAYER_FUNCTION
JNC SHORT GMUA1
GMUA2: CALL STOP_MUSIC ;DISABLE ALL MUSIC AFTER ERROR
MOV PLAYER,0
CALL FREE_MUSIC
GMUA1: RET
START_MUSIC ENDP
;=============================================================================
STOP_MUSIC PROC NEAR
CMP MUSIC_FILE,0
JE SHORT GMUC1
MOV BP,4 ;STOP MUSIC
CALL PLAYER_FUNCTION
MOV BP,8 ;REMOVE SAMPLES
CALL PLAYER_FUNCTION
MOV BP,5 ;REMOVE MUSIC
CALL PLAYER_FUNCTION
GMUC1: MOV MUSIC_FILE,0
RET
STOP_MUSIC ENDP
;=============================================================================
CLOSE_MUSIC PROC NEAR
CALL DEALLOC_MUSIC ;REMOVE PLAYER
RET
CLOSE_MUSIC ENDP
;=============================================================================
PLAYER_FUNCTION PROC NEAR
PUSHA
PUSH DS
SHL BP,2
ADD BP,0100H
PUSH CS
PUSH PLAYER_RETURN
PUSH SEG PLAYER
PUSH BP
RETF
PLAYER_RETURN:
POP DS
POPA
RET
PLAYER_FUNCTION
;=============================================================================
;The functions of the players are translated to a number in BP:
;BP = 1 CONFIG_INIT IF CARRY RETURNED IS 1 THEN ERROR
!!!siempre!!!
; 2 LOAD_MOD DS:DX IS POINTER TO FILENAME
; cx=segmento del modulo
; 3 PLAY_MUSIC IF CARRY RETURNED IS 1 THEN ERROR
; 4 STOP_MUSIC
; 5 END_MUSIC
; 10 GET_VOLUME \ AL=MASTER_VOLUME
; 11 SET_VOLUME / BL=MUSIC_VOL, BH=FX_VOL
; 13 GET_SONGPOSITION \ AL=0..127 POSITION IN PATTERN ORDER
; al=pattern bx=row
$
; TheDraw Assembler Screen Image. Date: 10/13/95
ANSI LABEL BYTE
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB '┌',7,'╦',7,'═',7,'═',15,'═',15,'╦',15,'┐',15,' ',15,'┌'
DB 7,'╦',7,'═',7,'═',15,'═',15,'╦',15,'┐',15,' ',15,'┌',7
DB '╦',7,'═',7,'═',15,'═',15,'╦',15,'┐',15,' ',15,'┌',7,'╦'
DB 7,'═',7,'╦',15,'═',15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7
DB ' ',15,' ',15,' ',15,'╦',15,'┐',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'│',3,'╠',3
DB '═',3,'═',11,'═',11,'╩',11,'┘',11,' ',15,'├',3,'╬',3,'═'
DB 3,'═',11,'═',11,'╬',11,'┤',11,' ',15,'│',3,'╠',3,'═',3
DB '═',11,'╦',11,'╩',11,'┘',11,' ',15,' ',15,' ',15,' ',15
DB '║',11,' ',15,' ',15,' ',15,' ',15,'└',3,'╩',3,'═',3,'═'
DB 11,'═',11,'╣',11,'│',11,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'└',1,'╩',1,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'└',1,'╩',1,' ',15,' '
DB 15,' ',15,'╩',9,'┘',9,' ',15,'└',1,'╩',1,' ',15,' ',15
DB '╚',9,'═',9,'┘',9,' ',15,' ',15,' ',15,' ',15,'╩',9,' '
DB 15,' ',15,' ',15,' ',15,'└',1,'╩',1,'═',1,'═',9,'═',9
DB '╩',9,'┘',9,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'┌',7,'╦',7
DB '═',7,'═',15,'═',15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7,'═'
DB 7,'═',15,'═',15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7,'═',7
DB '═',15,'╦',15,'─',15,'┐',15,' ',15,'┌',7,'╦',7,'═',7,'═'
DB 15,'═',15,'╦',15,'┐',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'│',3,'║',3,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'│',3,'║',3,' ',15,' '
DB 15,' ',15,'║',11,'│',11,' ',15,'│',3,'║',3,' ',15,' '
DB 15,'╚',11,'╦',11,'┤',11,' ',15,'├',3,'╬',3,'═',3,'═',11
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,'└',1,'╩',1,'═',1,'═',9,'═'
DB 9,'╩',9,'┘',9,' ',15,'└',1,'╩',1,'═',1,'═',9,'═',9,'╩'
DB 9,'┘',9,' ',15,'└',1,'╩',1,'═',1,'═',9,'═',9,'╩',9,'┘'
DB 9,' ',15,'└',1,'╩',1,'═',1,'═',9,'═',9,'╩',9,'┘',9,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'┌',7,'╦',7,'═',7,'═',15
DB '═',15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7,' ',15,' ',15
DB ' ',15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,'┌',7,'╦',7,'═',7,'═',15,'═'
DB 15,'╦',15,'┐',15,' ',15,'┌',7,'╦',7,'═',7,'═',15,'═',15
DB '╦',15,'┐',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,'│',3,'╠',3,'═',3,'═',11,'╦',11,'╩'
DB 11,'┘',11,' ',15,'│',3,'║',3,' ',15,' ',15,' ',15,'║'
DB 11,'│',11,' ',15,'│',3,'║',3,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'├',3,'╬',3,'═',3,'═',11,' ',15,' ',15
DB ' ',15,' ',15,'└',3,'╩',3,'═',3,'═',11,'═',11,'╦',11,'┐'
DB 11,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,'└',1,'╩',1,' ',15,' ',15,'╚',9,'═',9,'┘',9
DB ' ',15,'└',1,'╩',1,'═',1,'═',9,'═',9,'╩',9,'┘',9,' ',15
DB '└',1,'╩',1,'═',1,'═',9,'═',9,'╩',9,'┘',9,' ',15,'└',1
DB '╩',1,'═',1,'═',9,'═',9,'╩',9,'┘',9,' ',15,'└',1,'╩',1
DB '═',1,'═',9,'═',9,'╩',9,'┘',9,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,'·',15,' ',15,'G',15,' ',15,'·',15,' ',15,'O',15,' '
DB 15,'·',15,' ',15,'R',15,' ',15,'·',15,' ',15,'E',15,' '
DB 15,'·',15,' ',15,'·',15,' ',15,'D',15,' ',15,'·',15,' '
DB 15,'E',15,' ',15,'·',15,' ',15,'S',15,' ',15,'·',15,' '
DB 15,'I',15,' ',15,'·',15,' ',15,'G',15,' ',15,'·',15,' '
DB 15,'N',15,' ',15,'·',15,' ',15,' ',15,39,15,' ',15,'·'
DB 15,' ',15,'9',15,' ',15,'·',15,' ',15,'5',15,' ',15,'·'
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═',15,'═'
DB 15,'═',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'C',15,'o',15,'d',15,'e',15,' ',15,'.'
DB 15,'.',15,'.',15,'.',15,'.',15,'.',15,'.',15,'.',15,'.'
DB 15,'.',15,'.',15,'.',15,'.',15,'.',15,' ',15,'F',15,'l'
DB 15,'y',15,'n',15,'n',15,'/',15,'G',15,'o',15,'r',15,'e'
DB 15,' ',15,'D',15,'e',15,'s',15,'i',15,'g',15,'n',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'G',15,'f',15,'x',15,' ',15,'+',15,' '
DB 15,'T',15,'u',15,'n',15,'e',15,' ',15,'.',15,'.',15,'.'
DB 15,'.',15,'.',15,'.',15,'.',15,'.',15,' ',15,'S',15,'a'
DB 15,'c',15,'e',15,'2',15,'/',15,'G',15,'o',15,'r',15,'e'
DB 15,' ',15,'D',15,'e',15,'s',15,'i',15,'g',15,'n',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'T',15,'h'
DB 15,'a',15,'n',15,'k',15,'s',15,' ',15,'g',15,'o',15,' '
DB 15,'t',15,'o',15,':',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'C',15,'r',15,'a',15,'n',15,'k',15,'y'
DB 15,' ',15,'&',15,' ',15,'A',15,'s',15,'t',15,'a',15,'r'
DB 15,'o',15,'t',15,'h',15,' ',15,'o',15,'f',15,' ',15,'T'
DB 15,'.',15,'L',15,'.',15,'O',15,'.',15,'T',15,'.',15,'B'
DB 15,'.',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'S',15,'h',15,'a',15,'d',15,'e',15,' '
DB 15,'&',15,' ',15,'F',15,'o',15,'x',15,' ',15,'o',15,'f'
DB 15,' ',15,'A',15,'l',15,'i',15,'e',15,'n',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
progen label byte
code16 ends
end start