Metropoli BBS
VIEWER: giant.asm MODE: TEXT (CP437)
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ 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
[ RETURN TO DIRECTORY ]