home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
GIANTSRC.ZIP
/
GIANT.ASM
< prev
next >
Wrap
Assembly Source File
|
1995-03-03
|
84KB
|
2,435 lines
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ Filename: GIANT.ASM ║
;╠═════════════════════════════════════════════════════════════════════════════╣
;║ Source Codes for GIANT. The Ultimate 4KB-Intro! [:)] v. 1.1 ║
;║ ║
;║ Written by: Sigma of Star Team Productions, (Σ, STP) ║
;║ alias Jari Kytöjoki ║
;║ ║
;║ Snail-Mail: Jari Kytöjoki ║
;║ Puolukkakatu 5 ║
;║ 44200 Suolahti ║
;║ Finland, Europe, Earth ║
;║ ║
;║ E-Mail: jari.kytojoki@hut.fi ║
;║ ║
;║ Please, send me a Postcard!!! ║
;║ Send me your source codes! (or at least some technical info, etc...) ;) ║
;║ Don't hesitate to contact me! ║
;║ ║
;║ Copyright (C) 1994, 1995 Jari Kytöjoki. All Rights Reserved. ║
;╚═════════════════════════════════════════════════════════════════════════════╝
; After many inquiries for sources I decided to release this
; source code. It is released as public domain. You can do it
; whatever you want or like. But remember, if you are just
; planning to make a new intro only by adding, removing or any
; other way changing a few lines of this code, you are entering
; worldwide lamers' club. But if you are reading this file just
; because you want to learn something new, go on it! This is
; the most biggest reason why I released this code. However,
; I cannot promise there's anything new that you haven't known
; before. (It's always worth studying new sources...) If you find
; this file very helpful, please send me a postcard or at least
; write me some E-Mail.
;───────────────────────────────────────────────────────────────────────────
; You can compile this file with TASM, I included MAKE.BAT
; to help you. You'll notice that resulting COM-file will be
; much larger than the released version. This is due to
; the original COM-file has been compressed to fit in those
; specified limits. If you are just compiling, testing and
; debugging this source file there's no harm of it. You'll
; have to compress the COM-file with your own compressor if
; you want the new COM-file to be as small as the original
; one. ;-)
;───────────────────────────────────────────────────────────────────────────
; The code was optimized mainly for size and some parts seem to
; be coded quite weirdly. In some time critical parts I repeated
; the source code and I trusted the compressor would do the rest,
; so that the file would be less than 4KB. There is still some
; "extra" dummy bytes which could easily be removed.
; My opinion of making a small intro is not hard. I had quite a
; many ideas to put in this intro within the limits I had set, but
; soon all 4KB was used and I had to think all over again. Many of
; my plans finished undone. The size limit was reached too quickly.
; I hope you enjoy my intro and learn something new.
;
;Last words: I'm sorry there isn't too many comments in this file.
; Just try to figure it out.
;═══════════════════════════════════════════════════════════════════════════
Code Segment Para Public use16 'Code'
.386
.387
Jumps
Assume cs:Code, ds:Code, es:Code, ss:Code, fs:Code, gs:Code
Temp0 Equ word ptr ds:10A2h
Temp1 Equ word ptr ds:10A4h
Temp2 Equ word ptr ds:10A6h
Temp4 Equ word ptr ds:0100h
Sin2T Equ word ptr ds:0D000h
Cos2T Equ word ptr ds:0D200h
SinT Equ word ptr ds:0E000h
CosT Equ word ptr ds:0E200h
Temp_PAL3 Equ word ptr 0DF00h
Temp_PAL2 Equ word ptr 0DC00h
Temp_PAL1 Equ word ptr 0EC00h
Row256T Equ word ptr ds:0CE00h
CharP Equ word ptr ds:0106h
CharColor Equ word ptr ds:010Ah
TextSeg = Temp0
XMin Equ word ptr ds:010Ch
YMax Equ word ptr ds:010Eh
XStep Equ word ptr ds:0110h
YStep Equ word ptr ds:0112h
ScreenX Equ word ptr ds:0114h
ScreenY Equ word ptr ds:0116h
NMax Equ word ptr ds:0118h
x Equ word ptr ds:011Ah
y Equ word ptr ds:011Ch
zi Equ word ptr ds:011Eh
zr Equ word ptr ds:0120h
cr Equ word ptr ds:0122h
ci Equ word ptr ds:0124h
d2x = zi
d2y = zr
i = ScreenX
j = ScreenY
TempPAL1 Equ word ptr 0E000h
TempPAL2 Equ word ptr 0E400h
M_WaitVRT Macro
Local @@wv1, @@wv2
@@wv1:
in al, dx
test al, 8
jz @@wv1
@@wv2:
in al, dx
test al, 8
jnz @@wv2
EndM
M_WaitVRT_DX Macro
mov dx, 03DAh
M_WaitVRT
EndM
M_FadePAL_Out Macro SourcePAL, DestPAL
Local @@fo1, @@fo2
mov bx, 0200h
@@fo1:
mov si, SourcePAL
mov di, DestPAL
mov cx, 3*256
@@fo2:
lodsb
sub al, bl
cmc
sbb ah, ah
and al, ah
stosb
loop @@fo2
mov si, DestPAL
mov cx, 3*256
mov dx, 03DAh
M_WaitVRT_DX
mov dx, 03C8h
mov al, 00h
out dx, al
inc dx
rep outsb
mov dx, 03DAh
M_WaitVRT_DX
add bl, bh
test bl, 3Fh
jnz @@fo1
EndM
M_FadePAL_In Macro SourcePAL, DestPAL
Local @@fi1, @@fi2
mov bx, 0FE40h
@@fi1:
mov si, SourcePAL
mov di, DestPAL
mov cx, 3*256
@@fi2:
lodsb
sub al, bl
cmc
sbb ah, ah
and al, ah
stosb
loop @@fi2
mov si, DestPAL
mov cx, 3*256
mov dx, 03DAh
M_WaitVRT_DX
mov dx, 03C8h
mov al, 00h
out dx, al
inc dx
rep outsb
mov dx, 03DAh
M_WaitVRT_DX
add bl, bh
test bl, 3Fh
jnz @@fi1
EndM
M_FadeOUT Macro SrcPAL, DstPAL
cli
M_FadePAL_Out SrcPAL, DstPAL
sti
EndM
M_FadeIN Macro SrcPAL, DstPAL
cli
M_FadePAL_In SrcPAL, DstPAL
sti
EndM
M_ClearPAL Macro
Local @@cp
M_WaitVRT_DX
mov cx, 768
mov dx, 03C8h
xor ax, ax
out dx, al
inc dx
@@cp:
out dx, al
loop @@cp
EndM
M_KeyPressed Macro
mov ah, 01h
int 16h
jnz @KeyDownOut
EndM
org 100h
Begin:
mov bp, offset @GetNextBit
mov si, offset @CompressedBlock
mov di, 1100h
mov ax, 0E781h
cwd
cld
xor cx, cx ;;; the file is not
jmp Start ;;; compressed, yet! :)
; cli ; instead of above
; xor cx, cx ; if the file is
; jmp @Decompress ; compressed with XPC
@CompressedBlock:
ret
org 10A2h
dw (1024 shr 1), 8192, 0000h
; Start of DeCompression routine. You'll have perhaps no use for
; this routine because you need my XPACK proggy to compress
; files. Use your debugger to study the original
; xpc-compressed GIANT.COM.
; (Sorry my executable file compressor isn't ready for release
; yet because I'm out of time and funds to finish it) :(
@GetNextBit:
shl ax, 1
jnz @NoNewAX
lodsw
rcl ax, 1
@NoNewAX:
ret
@CopyByte:
dec dx
xor [si], dl
movsb
@Again:
call bp
jnc @CopyByte
@Decompress:
mov bx, cx
call bp
jc @CX2_3
call bp
jnc @CX4_5_Over21
@CXInc:
inc cx
call bp
jc @CXInc
call bp
rcl cx, 1
@CX2_3:
call bp
@CX4_5:
rcl cx, 1
@ReadBX:
call bp
jc @ReadBL
jcxz @BHBelow6
call bp
jc @BHOver6
@BHBelow6:
call bp
jc @BH3_6
call bp
jnc @BH1
call bp
jnc @MoveBytes
@BH1:
adc bh, 1
@ReadBL:
mov bl, [si]
inc si
@MoveBytes:
push si
not bx
lea si, [bx+di]
inc cx
inc cx
rep movsb
pop si
jmp @Again
db '(c)Σstp94'
@CX4_5_Over21:
inc cx
call bp
jnc @CX4_5
call bp
jc @CX4_5
mov cl, [si]
inc si
jcxz Start
add cx, 1Fh
jmp @ReadBX
@BHOver6:
call bp
rcl bh, 1
call bp
rcl bh, 1
inc bh
@BH3_6:
call bp
rcl bh, 1
call bp
rcl bh, 1
inc bh
stc
jmp @BH1
; End of DeCompression routine...
Start:
sti
mov es, cx ; preparations for some nice settings
mov di, 0472h ; you'll know it for sure
mov ax, ds:[0002h]
mov dx, cs
sub ax, dx
cmp ax, 5000h ; This Intro needs 320K mem.
jb @OutOfMemory
cmp sp, 0FFF8h
jae @CheckFPU ; if Enough Memory, continue
@OutOfMemory:
mov al, 01h
mov ah, 4Ch
int 21h
@CheckFPU: ; check the existence of the Floating Point Unit
finit
xor ax, ax
stosw ; Use Cold Boot if necessary :)
mov es, dx
mov [Temp4], cx
fstcw [Temp4]
wait
cmp byte ptr [Temp4+1], 03h ; Check for Floating Point Unit
je @FPUFound
mov al, 03h
mov ah, 4Ch
int 21h
@FPUFound:
pushf ; Check for 80286
push cx
popf
pushf
pop ax
popf
and ax, 0F000h
cmp ax, 0F000h
je @CPUBelow286
mov cx, 0F000h
pushf ; Check for 80386
push cx
popf
pushf
pop ax
popf
and ax, 0F000h
jne @CPU386Plus
@CPUBelow286:
mov al, 02h
mov ah, 4Ch
int 21h
@CPU386Plus:
mov ah, 1Ah
mov al, 00h
int 10h ; Check for VGA
cmp bl, 07h
jb @NoVGA
cmp al, 1Ah
je @VGAFound
@NoVGA:
mov al, 04h
mov ah, 4Ch
int 21h
@VGAFound:
mov ah, 30h
int 21h ; Get DOS Version
cmp al, 03h
jae @DOSOkay
mov al, 05h
mov ah, 4Ch
int 21h
@DOSOkay:
mov bl, 32h
mov al, 00h
mov ah, 12h
int 10h
mov dx, 03CCh ; set your VGA to
in al, dx ; correct mode...
or al, 01h ; B/W -> COLOR
mov dx, 03C2h
out dx, al
mov cx, 0FF00h
mov ah, 01h
int 10h
mov al, 01h
mov ah, 35h
int 21h ; Get BreakPoints Handler
push es
push bx
mov al, 03h
mov ah, 35h
int 21h ; Get Single Step Handler
push es
push bx
cli
mov al, 03h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Breakpoints
mov al, 01h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Single Step
sti
mov ax, cs
add ax, ((offset Last_Word-offset Begin)+0100h)/16
mov ds, ax
mov ax, cs
add ax, 1000h
mov es, ax
mov cx, (offset W_Divider-offset Data_Seg)/4+2
mov si, offset Data_Seg
mov di, si
rep movsd
@KeyPressed1:
mov ah, 01h
int 16h
jz @KeyBufferCleared
xor ax, ax
int 16h
jmp @KeyPressed1
@KeyBufferCleared:
finit ; Make Sin and Cos Tables
xor si, si
mov ax, cs
mov es, ax
mov ds, ax
mov cx, 321
fild [YY]
fldpi
fild [XX]
fdivp st(1), st
@MakeSINCOS:
mov [XX], si
fild [XX]
fmul st, st(1)
fsin
fmul st, st(2)
fistp word ptr [si+SinTable]
inc si
loop @MakeSINCOS
mov dx, TempPAL1
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
M_FadeOUT TempPAL1, TempPAL2
wait
M_KeyPressed
mov al, 13h
mov ah, 00h
int 10h
mov dx, TempPAL1
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
M_ClearPAL
mov dx, offset Text2String
mov ah, 9
int 21h
mov ax, cs
add ax, 2000h
mov es, ax
mov fs, ax
mov ax, 0A000h
mov gs, ax
xor si, si
xor di, di
Rept 8
mov cx, 5*8/4
rep
db 65h ; GS segment override prefix
movsd
add si, (320-5*8)
EndM
Rept 8
mov cx, 12*8/4
rep
db 65h ; GS segment override prefix
movsd
add si, (320-12*8)
EndM
Rept 8
mov cx, 9*8/4
rep
db 65h ; GS segment override prefix
movsd
add si, (320-9*8)
EndM
mov ax, 0A000h
mov es, ax
mov cx, 199*256
@BG1:
mov dx, 319
@BG2:
mov di, cx
shr di, 2
add di, cx
add di, dx
mov al, dl
xor al, ch
and al, 1Fh
xor al, 30h
stosb
dec dx
jge @BG2
sub ch, 1
jnc @BG1
mov ax, 0707h
xor si, si
M_WriteText Macro TextXYMove
mov di, (60+TextXYMove)*320+120+TextXYMove
Rept 8
Local @@wt1, @@wt2
mov cx, 5*8
@@wt1:
cmp byte ptr fs:[si], 0
jz @@wt2
mov es:[di], ax
mov es:[di+320], ax
@@wt2:
add di, 2
inc si
loop @@wt1
add di, 240+320
EndM
mov di, (92+TextXYMove)*320+64+TextXYMove
Rept 8
Local @@wt1, @@wt2
mov cx, 12*8
@@wt1:
cmp byte ptr fs:[si], 0
jz @@wt2
mov es:[di], ax
mov es:[di+320], ax
@@wt2:
add di, 2
inc si
loop @@wt1
add di, 128+320
EndM
mov di, (124+TextXYMove)*320+88+TextXYMove
Rept 8
Local @@wt1, @@wt2
mov cx, 9*8
@@wt1:
cmp byte ptr fs:[si], 0
jz @@wt2
mov es:[di], ax
mov es:[di+320], ax
@@wt2:
add di, 2
inc si
loop @@wt1
add di, 176+320
EndM
EndM
M_WriteText 1
xor ax, ax
xor si, si
M_WriteText -1
mov ax, cs
mov ds, ax
mov es, ax
M_FadeIN TempPAL1, TempPAL2
mov cx, 250
@wv1:
M_WaitVRT_DX
loop @wv1
M_FadeOUT TempPAL1, TempPAL2
M_KeyPressed
mov al, 12h
mov ah, 00h
int 10h
mov cx, 20h
@wv2:
M_WaitVRT_DX
loop @wv2
mov bh, 03h
mov al, 30h
mov ah, 11h
int 10h
mov [CharGen], bp
push es
pop fs
push ax
mov bl, 15
@SetNextPAL:
mov bh, bl
mov al, 00h
mov ah, 10h
int 10h
add cx, 4
dec bl
jns @SetNextPAL
M_WaitVRT_DX
mov dx, 3D4h
mov ax, 6A0Ch
out dx, ax
mov dx, 03C8h
xor al, al
out dx, al
inc dx
mov cx, 16*3
xor ax, ax
@SetPal:
xor al, al
out dx, al
out dx, al
mov al, ah
out dx, al
add ah, 4
loop @SetPal
mov dx, 03CEh
mov ax, 0205h
out dx, ax
finit
mov ax, 0A000h
mov es, ax
xor si, si
xor ax, ax
xor di, di
mov cx, 65536/2
rep stosw
@CCPopAX:
pop ax
@CC:
mov bp, [CharGen]
xor ebx, ebx
mov bl, [si+Text1String]
lea ebp, [ebp+8*ebx+7]
inc si
and si, 1Fh
fld [Const1]
fmul [CosBB]
fadd [BB]
fcom [Const3]
fstsw ax
fwait
sahf
ja @GlobeOut
fst [BB]
fcos
fld1
fdivrp st(1), st
fst [CosBB]
fld [Const4]
fmul st, st(1)
fstp [IIAdd]
fmul [Const2]
fadd [LL]
fstp [LL]
fldz
fstp [JJ]
mov bl, 32
@BB:
fldz
fstp [II]
fld [JJ] ; B := ...
fadd [BB]
fsincos
fstp [CosB]
fstp [SinB]
test bl, 3
jnz @BPOK
dec bp
@BPOK:
push bp
mov bp, fs:[bp]
Rept 8 ; just for better compression ratio
mov ax, offset CalcPixel
call ax
EndM
pop bp
fld [JJ]
fadd [Const4]
fstp [JJ]
dec bx
jnz @BB
jmp @CC
@GlobeOut:
push cs
pop es
mov dx, TempPAL1
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
mov cx, 250
@wv3:
M_WaitVRT_DX
loop @wv3
M_KeyPressed
mov dx, 03CEh
mov ax, 0FF08h
out dx, ax
mov bx, 6A00h
@ScrollDown:
M_WaitVRT_DX
mov dx, 3D4h
mov al, 0Dh
mov ah, bl
out dx, ax
dec ax
mov ah, bh
out dx, ax
sub bx, 80*2
or bx, bx
jns @ScrollDown
M_FadeOUT TempPAL1, TempPAL2
cli
mov al, 03h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Breakpoints
mov al, 01h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Single Step
mov ax, cs
mov ds, ax
mov es, ax
sti
M_KeyPressed
Add_Items Equ offset LastBopAdd - offset BopAddTab
BopPts Equ Add_Items
TimeOut Equ 8192
TimeOut2 Equ 150
MaxWidth Equ 320
CenterX Equ 160
CenterY Equ 100
MaxBops Equ 350
RadiusX Equ 144
RadiusY Equ 176
PhInc1 Equ 2
PhInc2 Equ 3
mov al, 13h
mov ah, 00h
int 10h
mov cx, 20h
@wv4:
M_WaitVRT_DX
loop @wv4
mov cx, Add_Items
mov si, offset LastBopAdd - 1
mov di, offset LastBopAdd + Add_Items - 2
xor ax, ax
std
@Expand0:
lodsb
stosw
loop @Expand0
cld
mov dx, Add_Items/2
mov si, offset BopADDLengths - 1
mov di, offset LastBopAdd + Add_Items + 3*Add_Items/2
mov ax, 12*320
@Expand1:
inc si
sub di, 3*Add_Items/2
mov bp, di
mov cl, [si]
neg ax
sub ax, cx
@Expand2:
inc ax
stosw
loop @Expand2
add bp, dx
mov di, bp
mov cl, [si]
add ax, cx
@Expand3:
stosw
dec ax
loop @Expand3
add bp, dx
mov di, bp
mov cl, [si]
add ax, 320
neg ax
sub ax, cx
@Expand4:
inc ax
stosw
loop @Expand4
add bp, dx
mov di, bp
mov cl, [si]
add ax, cx
@Expand5:
stosw
dec ax
loop @Expand5
jnz @Expand1
mov ax, 0A000h
mov es, ax
M_ShadeBOBs Macro @Time
Local @@Set1Pal, @@Set1Brk, @@Set2Pal, @@Set2Brk, @@Set3Pal, @@Set3Brk
M_WaitVRT_DX
mov dx, 03C8h
xor al, al
out dx, al
inc dx
mov cx, 256
xor ax, ax
@@Set1Pal:
xor al, al
out dx, al
mov al, ah
out dx, al
xor al, al
out dx, al
cmp ah, 62
jae @@Set1Brk
inc ah
@@Set1Brk:
loop @@Set1Pal
xor bp, bp
mov [Frames], @Time
mov ax, offset ShadesLoop
call ax
M_WaitVRT_DX
mov dx, 03C8h
xor al, al
out dx, al
inc dx
mov cx, 256
xor ax, ax
@@Set2Pal:
mov al, ah
out dx, al
xor al, al
out dx, al
out dx, al
cmp ah, 62
jae @@Set2Brk
inc ah
@@Set2Brk:
loop @@Set2Pal
xor bp, bp
mov [Frames], @Time
mov ax, offset ShadesLoop
call ax
M_WaitVRT_DX
mov dx, 03C8h
xor al, al
out dx, al
inc dx
mov cx, 256
xor ax, ax
@@Set3Pal:
xor al, al
out dx, al
out dx, al
mov al, ah
out dx, al
cmp ah, 62
jae @@Set3Brk
inc ah
@@Set3Brk:
loop @@Set3Pal
xor bp, bp
mov [Frames], @Time
call ShadesLoop
EndM
M_ShadeBOBs TimeOut
M_KeyPressed
mov cx, 30
@FlashBOBs:
push cx
M_ShadeBOBs TimeOut2
pop cx
loop @FlashBOBs
jmp @BOBs_Out
ShadesLoop:
mov si, 2*2188
mov ax, [Phase1]
add ax, PhInc1
cwd
div si
mov [Phase1], dx
mov ax, [Angle]
add ax, 20h
mov [Angle], ax
mul dx
xor bx, bx
mov bl, dl
mov ah, [bx+CosTable]
mov al, RadiusX
imul ah
sar ax, 6
add ax, CenterX
mov di, ax
mov ax, [Phase2]
add ax, PhInc2
cwd
div si
mov [Phase2], dx
mov ax, [Angle]
mul dx
mov bl, dl
mov ah, [bx+SinTable]
mov al, RadiusY
imul ah
sar ax, 6
add ax, CenterY
imul dx, ax, MaxWidth
call PutBop
dec [Frames]
jne ShadesLoop
mov dx, MaxBops
@HideBOBsLoop:
mov di, -1
call HideBop
dec dx
jnz @HideBOBsLoop
retn
@BOBs_Out:
cli
mov al, 03h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Breakpoints
mov al, 01h
mov ah, 25h
mov dx, 0F0F0h
mov ds, dx
int 21h ; Disable Single Step
mov ax, cs
mov ds, ax
mov es, ax
sti
finit ; Make Sin and Cos Tables
xor si, si
mov ax, cs
mov ds, ax
mov es, ax
add ax, 2000h
mov fs, ax
mov cx, 2*5*128+1
fld [Mult1]
fild [Temp1]
fldpi
fild [Temp0]
fdivp st(1), st
@Make2SINCOS:
fild [Temp2]
fmul st, st(1)
fsincos
fmul st, st(4)
fistp [si+Sin2T]
fmul st, st(2)
fistp [si+SinT]
inc [Temp2]
inc si
inc si
loop @Make2SINCOS
wait
xor ax, ax
mov cx, 200
mov di, offset Row256T
@MakeRow256:
stosw
add ax, 256
loop @MakeRow256
mov bh, 03h
mov al, 30h
mov ah, 11h
int 10h
mov [CharP+0], bp
mov [CharP+2], es
mov dx, cs
mov es, dx
M_KeyPressed
M_WaitVRT_DX
mov al, 13h
mov ah, 00h
int 10h
mov dx, offset Temp_PAL2
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
cli
mov si, offset Temp_PAL2+3*20h
mov di, offset Temp_PAL3
mov cx, 3*10h
rep movsw
M_ClearPAL
sti
push fs
pop es
xor di, di
mov ax, di
mov cx, 32*100h
rep stosw
mov [TextSeg], es
mov [CharColor], 0F09h
mov di, 4*100h+8
mov si, offset Gfx1Text
call GfxWrite
push fs
pop es
mov si, 0*100h
mov di, 4*8*100h
mov cx, 7*4*8*128
rep
db 26h ; ES segment override prefix
movsw
mov [x], 7A00h
mov [y], 2176
xor bx, bx
mov di, 40
call RotateMap2
push cs
pop es
M_FadeIN Temp_PAL2, Temp_PAL1
xor bx, bx
mov di, 40
@Rotate1Map:
push bx
push di
call RotateMap2
M_WaitVRT_DX
pop di
pop bx
add [x], 16
add [y], 16
add di, 30h
sub bx, 4
cmp di, 2*1385
jb @Rotate1Map
push cs
pop es
M_KeyPressed
mov [XMin], -5500
mov [YMax], 0
mov [NMax], 512 ;256
mov [cr], 2100
mov [ci], 0
mov [XStep], 10
mov [YStep], 10
push fs
pop es
call CalcFractal
mov [YMax], 1280+0
mov ax, es
add ah, 08h
mov es, ax
call CalcFractal
mov ax, cs
mov es, ax
M_FadeOUT Temp_PAL2, Temp_PAL1
M_KeyPressed
mov si, TempPAL2
mov cx, 3*256
mov dx, 03DAh
M_WaitVRT_DX
mov dx, 03C8h
mov al, 00h
out dx, al
inc dx
rep outsb
sti
call RotatePAL20
mov [x], 32768
mov [y], 0
xor bx, bx
mov di, 7800h
@Rotate2Map:
push bx
push di
call RotateMap2
M_WaitVRT_DX
pop di
pop bx
add bx, 8
sub di, 2*40h
jnc @Rotate2Map
M_KeyPressed
mov cx, 10
@wv5:
M_WaitVRT_DX
loop @wv5
mov cx, 984
mov dx, 2*50
xor bx, bx
mov di, 0
@Rotate3Map:
pusha
call RotateMap
call RotatePAL20
popa
sub [x], 16
sub [y], 16
add di, dx
cmp di, 6000h
jna @ZoomDIR
neg dx
@ZoomDIR:
sub bx, 4
loop @Rotate3Map
M_FadeOUT Temp_PAL2, Temp_PAL1
M_KeyPressed
M_WaitVRT_DX
mov al, 13h
mov ah, 00h
int 10h
push fs
pop es
xor di, di
mov ax, di
mov cx, 10000h/2
rep stosw
mov [TextSeg], es
mov [CharColor], 0C00h
mov di, 80
mov si, offset Gfx2Text
call GfxWrite
mov [x], 8000h
mov [y], 400h
mov bx, 2*512
mov di, 1200h
@Rotate4Map:
push bx
push di
call RotateMap2
M_WaitVRT_DX
pop di
pop bx
sub bx, 2*4
jns @BXOkay
xor bx, bx
@BXOkay:
sub di, 18h
jnc @Rotate4Map
M_KeyPressed
push fs
pop es
xor di, di
mov ax, di
mov cx, 10000h/2
rep stosw
mov [TextSeg], es
mov [CharColor], 0A00h
mov di, 116
mov si, offset Gfx3Text
call GfxWrite
xor bx, bx
mov di, 0000
@Rotate5Map:
push bx
push di
call RotateMap2
M_WaitVRT_DX
pop di
pop bx
add di, 18h
cmp di, 1200h
jbe @Rotate5Map
M_FadeOUT Temp_PAL2, Temp_PAL1
M_KeyPressed
Assume Ds:Data
FreeSpace Equ W_Divider
_TempR32A Equ dword ptr ds:FreeSpace+00h
_TempR32B Equ dword ptr ds:FreeSpace+04h
_TempR32C Equ dword ptr ds:FreeSpace+08h
_TempReg Equ dword ptr ds:FreeSpace+0Ch
MountHeight Equ word ptr ds:FreeSpace+10h
Map_X Equ word ptr ds:FreeSpace+12h
Map_Y Equ word ptr ds:FreeSpace+14h
RandomSeed Equ word ptr ds:FreeSpace+16h
_TempR16A Equ word ptr ds:FreeSpace+18h
_TempR16B Equ word ptr ds:FreeSpace+1Ah
_TempR16C Equ word ptr ds:FreeSpace+1Ch
Count_Loop Equ word ptr ds:FreeSpace+1Eh
Table_A Equ 0200h
Table_B Equ 0400h
Table_C Equ 0600h
mov ax, cs
add ax, 1000h
mov ds, ax
mov es, ax
mov di, offset Data_Seg
stosw
add ax, 1000h
stosw
add ax, 1000h
stosw
add ax, 1000h
stosw
stc
sbb eax, eax
mov cx, (offset LastMake_-offset MapMakeTable)/2+1
@Decompress2:
add ax, [di]
inc ax
stosw
loop @Decompress2
xor ax, ax
int 1Ah
and dh, 7Fh
; mov dx, 7FFFh ; just guess why used in here...
mov [RandomSeed], dx
mov ax, 0013h
int 10h
cli
mov dx, 03C8h
xor al, al
out dx, al
inc dx
mov cx, 64
xor ax, ax
@SetPal1:
out dx, al
out dx, al
out dx, al
inc ax
loop @SetPal1
mov cx, 64
xor ax, ax
@SetPal2:
xor al, al
out dx, al
out dx, al
mov al, ah
out dx, al
inc ah
loop @SetPal2
mov cx, 64
xor ax, ax
@SetPal3:
out dx, al
mov al, ah
out dx, al
xor al, al
out dx, al
inc ah
loop @SetPal3
mov cx, 64
@SetPal4:
out dx, al
out dx, al
out dx, al
loop @SetPal4
sti
mov dx, offset Temp_PAL2
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
cli
M_ClearPAL
sti
call CalcSky
mov [Count_Loop], 1024
mov [Map_X], 1024
mov [Map_Y], 1024
mov ax, offset UpdateView
call ax
mov es, [Data_Seg]
mov ax, offset UpdateSky
call ax
mov ax, offset UpdateMap
call ax
M_WaitVRT_DX
mov es, [VRAM_Seg]
mov si, offset Table_C
mov di, (320-256)/2
mov bl, 200
@Copy2VRAM:
mov cx, 256/4
rep movsd
add di, (320-256)
dec bl
jnz @Copy2VRAM
mov es, [Data_Seg]
M_FadeIN Temp_PAL2, Temp_PAL1
mov cx, 250
@wv6:
M_WaitVRT_DX
loop @wv6
@DrawAgain:
mov ax, offset UpdateView
call ax
mov es, [Data_Seg]
mov ax, offset UpdateSky
call ax
mov ax, offset UpdateMap
call ax
M_WaitVRT_DX
mov es, [VRAM_Seg]
mov si, offset Table_C
mov di, (320-256)/2
mov bl, 200
@CopyToVRAM:
mov cx, 256/4
rep movsd
add di, (320-256)
dec bl
jnz @CopyToVRAM
dec [Count_Loop]
jnz @DrawAgain
mov es, [Data_Seg]
M_FadeOUT Temp_PAL2, Temp_PAL1
jmp @TheEND
CalcSky:
xor di, di
mov es, [Sky_Seg]
mov fs, [MapB_Seg]
stc
sbb eax, eax
mov cx, 4000h
rep stosd
mov si, [RandomSeed]
M_MakeMUL Macro
mov ax, 0AFh
mul si
add ax, 2BC0h
adc dx, 0
div [W_Divider]
mov si, dx
EndM
M_MakeMUL
mov [RandomSeed], dx
xor bx, bx
mov cx, 0100h
mov byte ptr es:[0080h], -2
mov byte ptr es:[8000h], -2
mov byte ptr es:[0000h], cl
mov byte ptr es:[8080h], cl
call CalcFrac
xor di, di
CalcSky1:
mov ah, 01h
mov al, es:[di]
shr ax, 2
stosb
or di, di
jnz CalcSky1
; CalcMap
mov es, [MapA_Seg]
mov fs, [MapB_Seg]
stc
sbb eax, eax
mov cx, 4000h
rep stosd
mov si, [RandomSeed]
M_MakeMUL
mov [RandomSeed], dx
xor bx, bx
mov cx, 0100h
mov al, 40
stosb
call CalcFrac
xor di, di
CalcMap1:
xor ax, ax
mov si, offset MapCoord_
mov bx, [si]
add al, es:[bx+di]
adc ah, ch
inc si
inc si
mov bx, [si]
add al, es:[bx+di]
adc ah, ch
inc si
inc si
mov bx, [si]
add al, es:[bx+di]
adc ah, ch
inc si
inc si
mov bx, [si]
add al, es:[bx+di]
adc ah, ch
shr ax, 2
stosb
or di, di
jnz CalcMap1
xor si,si
CalcMap2:
mov al, es:[si]
sub al, es:[si+3]
sbb ah, ah
add ax, 20h
jns CalcMap3
xor ax, ax
CalcMap3:
cmp al, 3Fh
jbe CalcMap4
mov al, 3Fh
CalcMap4:
mov fs:[si],al
inc si
jnz CalcMap2
CalcMap5:
xor ax, ax
add al, es:[di]
adc ah, ch
add al, es:[di+0100h]
adc ah, ch
inc di
add al, es:[di]
adc ah, ch
add al, es:[di+0100h]
adc ah, ch
dec di
shr ax, 2
stosb
or di, di
jnz CalcMap5
OutCalcFrac:
retn
CalcFrac:
shr cx, 1
jz OutCalcFrac
xor ax, ax
add al, es:[bx]
adc ah, ch
add bl, cl
mov di, bx
add bl, cl
M_Calc2Square Macro
Local @@CS1, @@CS2
mov ch, al
M_MakeMUL
sub dx, 67E8h
xor ax, ax
mov al, cl
shl ax, 3
imul dx
xor ax, ax
add dl, ch
mov ch, al
adc dh, ch
js @@CS2
jz @@CS1
mov dl, 0FEh
@@CS1:
mov al, dl
@@CS2:
EndM
M_CalcSquare Macro
Local @@CS3
cmp byte ptr es:[di], 0FFh
jne @@CS3
add al, es:[bx]
adc ah, ch
shr ax, 1
M_Calc2Square
stosb
@@CS3:
EndM
M_CalcSquare
xor ax, ax
add al, es:[bx]
adc ah, ch
add bh, cl
mov di, bx
add bh, cl
M_CalcSquare
xor ax, ax
add al, es:[bx]
adc ah, ch
sub bl, cl
mov di, bx
sub bl, cl
M_CalcSquare
xor ax, ax
add al, es:[bx]
adc ah, ch
sub bh, cl
mov di, bx
sub bh, cl
M_CalcSquare
xor ax, ax
add al, es:[bx]
adc ah, ch
add bl, cl
add bl, cl
add al, es:[bx]
adc ah, ch
add bh, cl
add bh, cl
add al, es:[bx]
adc ah, ch
sub bl, cl
sub bl, cl
add al, es:[bx]
adc ah, ch
shr ax, 2
M_Calc2Square
add bl, cl
sub bh, cl
mov es:[bx], al
push bx
push cx
call CalcFrac
pop cx
pop bx
sub bl, cl
push bx
push cx
call CalcFrac
pop cx
pop bx
sub bh, cl
push bx
push cx
call CalcFrac
pop cx
pop bx
add bl, cl
call CalcFrac
retn
UpdateView:
mov cx, [Map_X]
mov dx, [Map_Y]
mov bx, [Count_Loop]
dec bx
shr bx, 8
shl bx, 1
add cx, [bx+AddCXTable]
add dx, [bx+AddDXTable]
mov [Map_X], cx
mov [Map_Y], dx
; Calculate New Points
mov es, [MapA_Seg]
ror cx, 4
ror dx, 4
mov bl, cl
mov bh, dl
shr cx, 0Ch
shr dx, 0Ch
push dx
inc bl
xor ax, ax
add al, es:[bx]
dec bl
sub al, es:[bx]
sbb ah, ah
imul cx
mov dx, ax
xor ax, ax
add al, es:[bx]
shl ax, 4
add ax, dx
xchg si, ax
inc bh
inc bl
xor ax, ax
add al, es:[bx]
dec bl
sub al, es:[bx]
sbb ah, ah
imul cx
mov dx, ax
xor ax, ax
add al, es:[bx]
shl ax, 4
add ax, dx
pop dx
sub ax, si
imul dx
shl si, 4
add ax, si
add ah, 1Ah
jnc CalcNew1
mov ax, 0FFFFh
CalcNew1:
mov [MountHeight], ax
mov ah, 01h
int 16h
jz CalcNew2
mov [Count_Loop], 1
xor ax, ax
int 16h
CalcNew2:
retn
UpdateSky:
mov si, offset MountHeight
mov di, offset _TempR32A
xor eax, eax
lodsw
neg ax
shr ax, 3
add ah, 40h
shl eax, 4
shl eax, 9
stosd
xor eax, eax
lodsw
shl eax, 9
stosd
xor eax, eax
lodsw
shl eax, 9
stosd
mov gs, [Sky_Seg]
lea ecx, [si-(offset MountHeight-offset Data_Seg)-6+63h]
mov di, Table_C
@UpdateSky1:
mov si, offset _TempR32A
mov eax, [si]
xor edx, edx
div ecx
mov ebx, [si+4]
mov esi, [si+8]
sub esi, eax
add ebx, eax
shr eax, 7
mov bp, si
shr esi, 10h
and si, 0FFh
shr ebx, 8
xor bl, bl
or si, bx
mov ebx, eax
shr ebx, 10h
dec bx
rept 255
db 65h ; GS segment override prefix
movsb
add bp, ax
adc si, bx
EndM
db 65h ; GS segment override prefix
movsb
dec cx
jnz @UpdateSky1
mov eax, 50505050h
mov cx, 40h
rep stosd
mov si, [MountHeight]
mov bx, 04
@UpdateSky2:
mov ax, si
xor dx, dx
div bx
shr ax, 7
cmp al, 3Fh
jbe @UpdateSky3
mov al, 3Fh
@UpdateSky3:
or al, 80h
mov ah, al
mov dx, ax
shl eax, 10h
xchg ax, dx
mov cx, 40h
rep stosd
inc bx
cmp bx, 2Ch
jne @UpdateSky2
retn
UpdateMap:
mov fs, [MapA_Seg]
mov gs, [MapB_Seg]
mov eax, 7D007D00h
mov di, Table_A
mov cx, 40h
rep stosd
mov cx, 40h
rep stosd
xor eax, eax
mov di, Table_B
mov cx, 40h
rep stosd
mov cx, 40h
rep stosd
mov [_TempR16A], 78h
@UpdateMap1:
mov si, [_TempR16A]
mov si, [si+MapMakeTable]
shl si, 4
mov ax, [Map_Y]
and ax, 0Fh
xor al, 0Fh
add si, ax
mov ax, [MountHeight]
xor dx, dx
div si
add ax, 64h
mov [_TempR16B], ax
lea eax, [si]
shl eax, 6
mov [_TempReg], eax
cmp [_TempR16A], 2
jne @UpdateMap2
mov [_TempR16B], 7D00h
mov [_TempR16C], 0000h
jmp @UpdateMap3
@UpdateMap2:
xor ax, ax
mov dx, 1
div si
mov [_TempR16C], ax
@UpdateMap3:
xor ecx, ecx
mov cx, [Map_X]
shl ecx, 0Ch
mov eax, [_TempReg]
shl eax, 7
sub ecx, eax
mov ax, [Map_Y]
shl ax, 4
mov ebx, ecx
shr ebx, 10h
mov bh, ah
mov ax, si
shl ax, 4
add bh, ah
mov si, 1FEh
mov word ptr [_TempR32B], Table_C
shr cx, 1
@UpdateMap4:
shl cx, 1
add cx, word ptr [_TempReg]
adc bl, byte ptr [_TempReg+2]
shr cx, 1
mov al, fs:[bx+1]
sub al, fs:[bx]
sbb ah, ah
imul cx
shrd ax, dx ,7
add ah, fs:[bx]
mul [_TempR16C]
mov di, [_TempR16B]
sub di, dx
jns @UpdateMap5
mov di, 0FFFFh
@UpdateMap5:
cmp di, 0C8h
jl @UpdateMap6
mov di, 0C7h
@UpdateMap6:
mov al, gs:[bx+1]
sub al, gs:[bx]
imul ch
shl ax, 1
add ah, gs:[bx]
mov dx, ax
xchg ax, [si+Table_B]
mov bp, di
xchg bp, [si+Table_A]
sub bp, di
jns @UpdateMap7
shl di, 8
add di, word ptr [_TempR32B]
push ax
sub ax, dx
cwd
idiv bp
pop dx
push bx
lea bx, [bp+1]
shl bp, 1
shl bx, 8
lea bp, [ebp+ebp*2]
add bp, offset @UpdateMap8+06h
call bp
pop bx
@UpdateMap7:
inc word ptr [_TempR32B]
dec si
dec si
jns @UpdateMap4
sub [_TempR16A], 2
jnz @UpdateMap1
retn
Assume ds:Code
@TheEND:
M_KeyPressed
mov ax, cs
mov ds, ax
mov es, ax
add ax, 2000h
mov fs, ax
M_WaitVRT_DX
mov al, 13h
mov ah, 00h
int 10h
mov dx, offset Temp_PAL2
xor bx, bx
mov cx, 256
mov al, 17h
mov ah, 10h
int 10h
push fs
pop es
xor di, di
mov ax, di
mov cx, 10000h/2
rep stosw
mov [TextSeg], es
mov [CharColor], 0E03h
mov di, 44
mov si, offset Gfx4Text
call GfxWrite
mov [x], 8000h
mov [y], 0800h
xor bx, bx
mov di, 1008h
@Rotate6Map:
push bx
push di
call RotateMap2
M_WaitVRT_DX
pop di
pop bx
sub di, 18h
jnc @Rotate6Map
mov ax, cs
mov es, ax
mov ds, ax
M_FadeOUT Temp_PAL2, Temp_PAL1
jmp @NoKeyPressed
@KeyDownOut:
M_WaitVRT_DX
mov al, 13h
mov ah, 00h
int 10h
mov cx, 20h
@wv7:
M_WaitVRT_DX
loop @wv7
xor ax, ax
int 16h
@NoKeyPressed:
M_WaitVRT_DX
mov al, 03h
mov ah, 00h
int 10h ; Switch Back to Char Mode
cli
mov bx, 414Fh
M_WaitVRT_DX
M_WaitVRT
mov ah, bh
mov dx, 03D4h
mov al, 09h
out dx, ax
mov cx, (offset EndPicCol-offset EndPic)
mov dx, 0B800h
mov es, dx
xor di, di
mov si, offset EndPic
@PutPage:
mov ah, [si+(offset EndPicCol-offset EndPic)]
lodsb
stosw
loop @PutPage
sti
mov dx, 0700h
mov bh, 00h
mov ah, 02h
int 10h
cli
mov bx, 424Fh
@IncCharHeight:
M_WaitVRT_DX
M_WaitVRT
mov ah, bh
mov dx, 03D4h
mov al, 09h
out dx, ax
inc bh
cmp bh, bl
jbe @IncCharHeight
sti
mov al, 03h
mov ah, 25h
pop dx
pop ds
int 21h ; Enable Breakpoints
mov al, 01h
mov ah, 25h
pop dx
pop ds
int 21h ; Enable Single Step
mov al, 00h
mov ah, 4Ch
int 21h
PutBop:
add di, dx
xor si, si
mov cx, BopPts/4
@PutLoop:
mov ax, [si+BopAddTab]
mov bx, [si+BopTab]
add es:[bx+di], al
mov ax, [si+BopAddTab+2]
mov bx, [si+BopTab+2]
add es:[bx+di], al
mov ax, [si+BopAddTab+4]
mov bx, [si+BopTab+4]
add es:[bx+di], al
mov ax, [si+BopAddTab+6]
mov bx, [si+BopTab+6]
add es:[bx+di], al
add si, 8
loop @PutLoop
HideBop:
xchg ds:[bp+BopQueue], di
cmp di, -1
jae @SkipHide
xor si, si
mov cx, BopPts/4
@HideLoop:
mov ax, [si+BopAddTab]
mov bx, [si+BopTab]
sub es:[bx+di], al
mov ax, [si+BopAddTab+2]
mov bx, [si+BopTab+2]
sub es:[bx+di], al
mov ax, [si+BopAddTab+4]
mov bx, [si+BopTab+4]
sub es:[bx+di], al
mov ax, [si+BopAddTab+6]
mov bx, [si+BopTab+6]
sub es:[bx+di], al
add si, 8
loop @HideLoop
@SkipHide:
add bp, 2
cmp bp, 2*MaxBops
sbb bx, bx
and bp, bx
ret
CalcPixel:
mov bh, 4
@CalcPixel:
or bp, bp
jns @NoPixel
fld [II] ; L := ...
fadd [LL]
fsincos
fmul [CosB]
fld [Cos1]
fmul st, st(1)
fld [SinB]
fmul [Sin1]
faddp st(1), st
fimul [Ker1]
fistp [U]
fwait
mov ax, [U]
fmul [Sin1]
fld [Cos1]
fmul [SinB]
fsubrp st(1), st
fimul [Ker2]
fistp [YY]
fmul [CosB]
fimul [Ker2]
fistp [XX]
or ax, ax
js @CCPopAX
inc ax
and al, 0Fh
mov cx, 320
fwait
add cx, [XX]
mov di, cx
and di, 7
mov dx, 03CEh
mov ah, [di+MaskTable]
mov di, ax
mov al, 08h
out dx, ax
mov ax, di
mov di, 240
sub di, [YY]
shr cx, 3
shl di, 4
add cx, di
shl di, 2
add di, cx
add di, 6A00h
mov ah, es:[di]
stosb
@NoPixel:
fld [II]
fadd [IIAdd]
fstp [II]
dec bh
jnz @CalcPixel
shl bp, 1
retn
PrintChar: ; si = Char Number, di = Place.
cli
mov si, ax
shl si, 3
add si, [CharP]
mov cl, 08h
mov dx, 03C4h
@@MC1:
mov es, [CharP+2]
db 26h ; ES segment override prefix
lodsb
mov ch, al
mov es, [TextSeg]
Rept 8
xor bx, bx
shl ch, 1
adc bx, offset CharColor
mov al, [bx]
stosb
EndM
add di, 256-8 ;320-8
dec cl
jz @@MCOUT
jmp @@MC1
@@MCOUT:
sub di, 8*256-8 ;8*320-8
sti
retn
M_ShlDXAX Macro Count
Rept Count
shl ax, 1
rcl dx, 1
EndM
EndM
CalcFractal:
cli
mov ax, [YMax]
mov [y], ax
mov [ScreenY], 0
@RepeatY:
mov ax, [XMin]
mov [x], ax
mov [ScreenX], 0
@RepeatX:
xor cx, cx
mov ax, [y]
mov [zi], ax
mov di, ax
imul di
M_ShlDXAX 3
mov di, dx
mov ax, [x]
mov [zr], ax
mov si, ax
imul si
M_ShlDXAX 3
mov si, dx
@RepeatCount:
mov ax, si
sub ax, di
add ax, [cr]
mov si, ax
mov ax, [zr]
imul [zi]
M_ShlDXAX 4
add dx, [ci]
mov di, dx
mov [zi], dx
mov [zr], si
mov ax, si
imul si
M_ShlDXAX 3
mov si, dx
mov ax, di
imul di
M_ShlDXAX 3
mov di, dx
add dx, si
jc @CountOut
js @CountOut
inc cx
cmp cx, [NMax]
jna @RepeatCount
xor ax, ax
jmp @Plot
@CountOut:
mov ax, cx
mov cl, 31
div cl
mov al, ah
inc al
@Plot:
and al, 1Fh
add al, 20h
mov si, [ScreenX]
mov di, [ScreenY]
mov cx, di
mov di, [di+offset Row256T]
add di, si
stosb
inc [ScreenX]
mov ax, [x]
add ax, [XStep]
mov [x], ax
cmp si, 288
jae @OutM1
jmp @RepeatX
@OutM1:
mov dx, 3DAh
in al, dx
mov dx, 3C0h
mov al, 11h+32
out dx, al
mov al, cl
shr al, 1
and al, 0Fh
out dx, al
add [ScreenY], 2
mov ax, [y]
add ax, [YStep]
mov [y], ax
cmp cx, 256
jae @OutM2
jmp @RepeatY
@OutM2:
sti
retn
M_Init_Rotate Macro Method
Local @@ir1, @@ir2
mov ax, 0A000h
mov es, ax
and bh, 7
mov ax, [bx+SinT]
imul di
sar dx, 1
adc dx, 0
mov bp, dx
mov ax, [bx+CosT]
imul di
sar dx, 1
adc dx, 0
mov si, dx
mov ax, [bx+Sin2T]
imul di
sar dx, 1
adc dx, 0
mov [d2y], dx
imul cx, dx, 100
mov ax, [bx+Cos2T]
imul di
sar dx, 1
adc dx, 0
mov [d2x], dx
imul dx, 100
imul bx, si, 160
add bx, dx
mov ax, [x]
sub ax, bx
imul bx, bp, 160
add bx, cx
mov dx, [y]
sub dx, bx
xor di, di
@@ir1:
mov [i], ax
mov [j], dx
mov cx, 320/4
@@ir2:
Rept 4
add ax, si
add dx, bp
mov bl, ah
mov bh, dh
mov bl, fs:[bx]
mov es:[di], bl
inc di
EndM
loop @@ir2
If Method
inc si
inc bp
EndIf
mov ax, [d2x]
mov dx, [d2y]
add ax, [i]
add dx, [j]
cmp di, 4*16000
jb @@ir1
mov ax, cs
mov es, ax
retn
EndM
RotateMap2:
M_Init_Rotate 0
RotateMap:
M_Init_Rotate 1
RotatePAL20:
cli
std
mov si, offset Temp_PAL3+3*1Fh-2
mov di, offset Temp_PAL3+3*20h-2
mov ax, [di]
mov bl, [di-1]
mov cx, 47
rep movsw
mov [di+1], ax
mov [di], bl
cld
mov si, di
mov cx, 3*20h
mov dx, 03DAh
M_WaitVRT_DX
mov dx, 03C8h
mov al, 20h
out dx, al
inc dx
rep outsb
sti
retn
GfxWrite:
xor ax, ax
@WriteFPush:
push di
@WriteF:
lodsb
or al, al
jz @WriteFLN
cmp al, 0FFh
je @WriteFOut
push si
call PrintChar
pop si
jmp @WriteF
@WriteFLN:
pop di
add di, 8*256 ;320
jmp @WriteFPush
@WriteFOut:
pop di
mov dx, cs
mov es, dx
retn
Rept 199
mov [bx+di], dh
add dx, ax
inc bh
EndM
@UpdateMap8:
mov [bx+di], dh
retn
EndPic db ' ╔══════════════════════════════════════════════════════════════════════════╗ '
db '╔═╝ ╚═╗'
db '║ ▄ ▄▄▄ ╔══╗ ║ ║ ═╦═ ╔══╗ ╔══ ╔═╦═╗ ╔══ ╔═╦═╗ ╔══╗ ╔══╗ ║ ║ ║ ▄ ▄▄▄ ║'
db '║ ▄ ▄▄▄ ║ ║ ║ ║ ║ ║ ║ ╠═ ║ ║ ║ ╠═ ║ ║ ║ ║ ║ ╠═╦╝ ╚╦╝ ║ ▄ ▄▄▄ ║'
db '║ ╚══╝ ╚══╝ ║ ╚══╝ ║ ║ ║ ║ ╚══ ║ ║ ║ ╚══╝ ║ ╚╗ ║ ■ ║'
; db '║ Released at Assembly ''94 in Finland, (C) 1994 ║'
db '║ Released at Assembly ''94 in Finland, (C) 1994 Σ, STP ║'
db '╚══════════════════════════════════════════════════════════════════════════════╝'
db '█████████▒▒▒▒▒▒▒▒░░░░░░░GIANT - the Ultimate 4KB-Intro!░░░░░░░░▒▒▒▒▒▒▒▒█████████'
EndPicCol db 80 dup (1Fh), 80 dup (1Fh)
db 3 dup (1Fh), 11h, 3 dup (1Fh), 66 dup (1Ch), 1Fh, 11h, 5 dup (1Fh)
db 3 dup (1Fh), 11h, 3 dup (1Fh), 66 dup (1Eh), 1Fh, 11h, 5 dup (1Fh)
db 9 dup (1Fh), 62 dup (1Ah), 9 dup (1Fh)
db 80 dup (1Fh), 80 dup (1Fh), 24 dup (19h), 5 dup (9Eh),3 dup (15h), 4 dup (1Ah), 9 dup(1Dh)
db 1Fh, 17h, 17h, 14h, 5 dup(13h), 1Ch, 25 dup (19h)
Gfx1Text db '╔════════════════════════════╗', 0
db '║Please wait while Computing!║', 0
db '╚════════════════════════════╝', 0, -1
Gfx2Text db 'Is that all?', 0, -1
Gfx3Text db 'NO!', 0, -1
Gfx4Text db '╔═══════════════════╗', 0
db '║ That''s all Folks! ║', 0
db '╚═══════════════════╝', 0, -1
Text1String db ' Assembly 1994 *'
db ' GIANT 4KB-Intro'
Text2String db 'GIANT', 13, 10
db 'the Ultimate', 13, 10
db '4KB-Intro$'
db 2 dup (00h)
SinTable label byte
db 64 dup (00h)
CosTable label byte
db 258 dup (00h)
Frames dw 0000h
U dw 0
CharGen dw 0
SinB dd 0
CosB dd 0
II dd 0
JJ dd 0
IIAdd dd 0
LL dd 0.0e00
BB dd -1.0e00
Const1 dd 2e-03
Const2 dd 0.09e00
Const3 dd 1.255e00
Const4 dd 0.0025e00
Sin1 dd 0.84147098480791e00
Cos1 dd 0.54030230586814e00
CosBB dd 1.8508157176809e00
Mult1 dd 9830.4
Ker1 dw 14
Ker2 dw 240
XX dw 80h
YY dw 40h
MaskTable db 80h, 40h, 20h, 10h, 08h, 04h, 02h, 01h
BopQueue dw MaxBops dup(-1)
Angle dw -1 and 0FFC0h
Phase1 dw 2*1024-PhInc1
Phase2 dw 2*1024-PhInc2
BopADDLengths db 5, 8, 9, 11, 12, 13, 13, 14, 14, 15, 15, 15
db 10 dup (01h)
BopAddTab label word
Rept 4
db 1,1,1,1,1
db 1,1,1,2,2,2,2,2
db 1,1,2,2,2,3,3,3,3
db 1,1,2,2,3,3,3,3,3,3,3
db 1,1,2,2,3,3,3,3,4,4,4,4
db 1,1,2,2,3,3,3,4,4,4,4,4,4
db 1,2,2,3,3,3,4,4,4,5,5,5,5
db 1,2,2,3,3,3,4,4,4,5,5,6,6,6
db 1,2,2,3,3,4,4,5,5,5,6,6,6,6
db 1,2,2,3,3,4,4,4,5,5,6,6,7,7,7
db 1,2,2,3,3,4,4,5,5,6,6,7,7,7,7
db 1,2,2,3,3,4,4,5,5,6,6,7,7,7,7
EndM
LastBopAdd db 4*144 dup (00h)
BopTab label word
; db 10 dup (00h) ; in reserve for correct alignment
align 16
Last_Word:
Code EndS
Data Segment Byte Public Use16
Data_Seg dw 0000h
MapA_Seg dw 0000h
MapB_Seg dw 0000h
Sky_Seg dw 0000h
MapMakeTable dw 41 dup (0000h), 10 dup (0001h), 09 dup (0003h)
LastMake_ dw 0003h, 0000h
AddCXTable dw 32, -16, -8, 8
AddDXTable dw -32, -8, 16, 8
MapCoord_ dw 0000h, 0004h, 0202h, 0FEFFh
VRAM_Seg dw 0A000h
W_Divider dw 0DB97h
Data EndS
End Begin