home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / GIANTSRC.ZIP / GIANT.ASM < prev    next >
Assembly Source File  |  1995-03-03  |  84KB  |  2,435 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ Filename:    GIANT.ASM                                                      ║
  3. ;╠═════════════════════════════════════════════════════════════════════════════╣
  4. ;║ Source Codes for GIANT. The Ultimate 4KB-Intro! [:)] v. 1.1                 ║
  5. ;║                                                                             ║
  6. ;║ Written by:  Sigma of Star Team Productions, (Σ, STP)                       ║
  7. ;║              alias Jari Kytöjoki                                            ║
  8. ;║                                                                             ║
  9. ;║ Snail-Mail:  Jari Kytöjoki                                                  ║
  10. ;║              Puolukkakatu 5                                                 ║
  11. ;║              44200 Suolahti                                                 ║
  12. ;║              Finland, Europe, Earth                                         ║
  13. ;║                                                                             ║
  14. ;║ E-Mail:      jari.kytojoki@hut.fi                                           ║
  15. ;║                                                                             ║
  16. ;║ Please, send me a Postcard!!!                                               ║
  17. ;║ Send me your source codes! (or at least some technical info, etc...) ;)     ║
  18. ;║ Don't hesitate to contact me!                                               ║
  19. ;║                                                                             ║
  20. ;║ Copyright (C) 1994, 1995 Jari Kytöjoki. All Rights Reserved.                ║
  21. ;╚═════════════════════════════════════════════════════════════════════════════╝
  22.  
  23. ;       After many inquiries for sources I decided to release this
  24. ;       source code. It is released as public domain. You can do it
  25. ;       whatever you want or like. But remember, if you are just
  26. ;       planning to make a new intro only by adding, removing or any
  27. ;       other way changing a few lines of this code, you are entering
  28. ;       worldwide lamers' club. But if you are reading this file just
  29. ;       because you want to learn something new, go on it! This is
  30. ;       the most biggest reason why I released this code. However,
  31. ;       I cannot promise there's anything new that you haven't known
  32. ;       before. (It's always worth studying new sources...) If you find
  33. ;       this file very helpful, please send me a postcard or at least
  34. ;       write me some E-Mail.
  35. ;───────────────────────────────────────────────────────────────────────────
  36. ;       You can compile this file with TASM, I included MAKE.BAT
  37. ;       to help you. You'll notice that resulting COM-file will be
  38. ;       much larger than the released version. This is due to
  39. ;       the original COM-file has been compressed to fit in those
  40. ;       specified limits. If you are just compiling, testing and
  41. ;       debugging this source file there's no harm of it. You'll
  42. ;       have to compress the COM-file with your own compressor if
  43. ;       you want the new COM-file to be as small as the original
  44. ;       one. ;-)
  45. ;───────────────────────────────────────────────────────────────────────────
  46. ;       The code was optimized mainly for size and some parts seem to
  47. ;       be coded quite weirdly. In some time critical parts I repeated
  48. ;       the source code and I trusted the compressor would do the rest,
  49. ;       so that the file would be less than 4KB. There is still some
  50. ;       "extra" dummy bytes which could easily be removed.
  51. ;         My opinion of making a small intro is not hard. I had quite a
  52. ;       many ideas to put in this intro within the limits I had set, but
  53. ;       soon all 4KB was used and I had to think all over again. Many of
  54. ;       my plans finished undone. The size limit was reached too quickly.
  55. ;         I hope you enjoy my intro and learn something new.
  56. ;
  57. ;Last words: I'm sorry there isn't too many comments in this file.
  58. ;            Just try to figure it out.
  59. ;═══════════════════════════════════════════════════════════════════════════
  60.  
  61. Code    Segment Para Public use16 'Code'
  62.  
  63.         .386
  64.         .387
  65.         Jumps
  66.  
  67.         Assume  cs:Code, ds:Code, es:Code, ss:Code, fs:Code, gs:Code
  68.  
  69.         Temp0           Equ     word ptr ds:10A2h
  70.         Temp1           Equ     word ptr ds:10A4h
  71.         Temp2           Equ     word ptr ds:10A6h
  72.         Temp4           Equ     word ptr ds:0100h
  73.         Sin2T           Equ     word ptr ds:0D000h
  74.         Cos2T           Equ     word ptr ds:0D200h
  75.         SinT            Equ     word ptr ds:0E000h
  76.         CosT            Equ     word ptr ds:0E200h
  77.         Temp_PAL3       Equ     word ptr 0DF00h
  78.         Temp_PAL2       Equ     word ptr 0DC00h
  79.         Temp_PAL1       Equ     word ptr 0EC00h
  80.         Row256T         Equ     word ptr ds:0CE00h
  81.         CharP           Equ     word ptr ds:0106h
  82.         CharColor       Equ     word ptr ds:010Ah
  83.         TextSeg         =       Temp0
  84.         XMin            Equ     word ptr ds:010Ch
  85.         YMax            Equ     word ptr ds:010Eh
  86.         XStep           Equ     word ptr ds:0110h
  87.         YStep           Equ     word ptr ds:0112h
  88.         ScreenX         Equ     word ptr ds:0114h
  89.         ScreenY         Equ     word ptr ds:0116h
  90.         NMax            Equ     word ptr ds:0118h
  91.         x               Equ     word ptr ds:011Ah
  92.         y               Equ     word ptr ds:011Ch
  93.         zi              Equ     word ptr ds:011Eh
  94.         zr              Equ     word ptr ds:0120h
  95.         cr              Equ     word ptr ds:0122h
  96.         ci              Equ     word ptr ds:0124h
  97.         d2x             =       zi
  98.         d2y             =       zr
  99.         i               =       ScreenX
  100.         j               =       ScreenY
  101.         TempPAL1        Equ     word ptr 0E000h
  102.         TempPAL2        Equ     word ptr 0E400h
  103.  
  104.  
  105. M_WaitVRT       Macro
  106.                 Local   @@wv1, @@wv2
  107.   @@wv1:
  108.                         in      al, dx
  109.                         test    al, 8
  110.                         jz      @@wv1
  111.   @@wv2:
  112.                         in      al, dx
  113.                         test    al, 8
  114.                         jnz     @@wv2
  115.                 EndM
  116.  
  117. M_WaitVRT_DX    Macro
  118.                         mov     dx, 03DAh
  119.                         M_WaitVRT
  120.                 EndM
  121.  
  122. M_FadePAL_Out   Macro   SourcePAL, DestPAL
  123.                 Local   @@fo1, @@fo2
  124.                         mov     bx, 0200h
  125.   @@fo1:
  126.                         mov     si, SourcePAL
  127.                         mov     di, DestPAL
  128.                         mov     cx, 3*256
  129.   @@fo2:
  130.                         lodsb
  131.                         sub     al, bl
  132.                         cmc
  133.                         sbb     ah, ah
  134.                         and     al, ah
  135.                         stosb
  136.                         loop    @@fo2
  137.                         mov     si, DestPAL
  138.                         mov     cx, 3*256
  139.                         mov     dx, 03DAh
  140.                         M_WaitVRT_DX
  141.                         mov     dx, 03C8h
  142.                         mov     al, 00h
  143.                         out     dx, al
  144.                         inc     dx
  145.                         rep     outsb
  146.                         mov     dx, 03DAh
  147.                         M_WaitVRT_DX
  148.                         add     bl, bh
  149.                         test    bl, 3Fh
  150.                         jnz     @@fo1
  151.                 EndM
  152.  
  153. M_FadePAL_In    Macro   SourcePAL, DestPAL
  154.                 Local   @@fi1, @@fi2
  155.                         mov     bx, 0FE40h
  156.   @@fi1:
  157.                         mov     si, SourcePAL
  158.                         mov     di, DestPAL
  159.                         mov     cx, 3*256
  160.   @@fi2:
  161.                         lodsb
  162.                         sub     al, bl
  163.                         cmc
  164.                         sbb     ah, ah
  165.                         and     al, ah
  166.                         stosb
  167.                         loop    @@fi2
  168.                         mov     si, DestPAL
  169.                         mov     cx, 3*256
  170.                         mov     dx, 03DAh
  171.                         M_WaitVRT_DX
  172.                         mov     dx, 03C8h
  173.                         mov     al, 00h
  174.                         out     dx, al
  175.                         inc     dx
  176.                         rep     outsb
  177.                         mov     dx, 03DAh
  178.                         M_WaitVRT_DX
  179.                         add     bl, bh
  180.                         test    bl, 3Fh
  181.                         jnz     @@fi1
  182.                 EndM
  183.  
  184. M_FadeOUT       Macro   SrcPAL, DstPAL
  185.                         cli
  186.                         M_FadePAL_Out   SrcPAL, DstPAL
  187.                         sti
  188.                 EndM
  189.  
  190. M_FadeIN        Macro   SrcPAL, DstPAL
  191.                         cli
  192.                         M_FadePAL_In    SrcPAL, DstPAL
  193.                         sti
  194.                 EndM
  195.  
  196. M_ClearPAL      Macro
  197.                 Local   @@cp
  198.                         M_WaitVRT_DX
  199.                         mov     cx, 768
  200.                         mov     dx, 03C8h
  201.                         xor     ax, ax
  202.                         out     dx, al
  203.                         inc     dx
  204.   @@cp:
  205.                         out     dx, al
  206.                         loop    @@cp
  207.                 EndM
  208.  
  209. M_KeyPressed    Macro
  210.                         mov     ah, 01h
  211.                         int     16h
  212.                         jnz     @KeyDownOut
  213.                 EndM
  214.  
  215.  
  216.         org     100h
  217.  
  218.   Begin:
  219.                 mov     bp, offset @GetNextBit
  220.                 mov     si, offset @CompressedBlock
  221.                 mov     di, 1100h
  222.                 mov     ax, 0E781h
  223.                 cwd
  224.                 cld
  225.                 xor     cx, cx                          ;;; the file is not
  226.                 jmp     Start                           ;;; compressed, yet! :)
  227. ;                cli                                    ; instead of above
  228. ;                xor     cx, cx                         ; if the file is
  229. ;                jmp     @Decompress                    ; compressed with XPC
  230.   @CompressedBlock:
  231.                 ret
  232.  
  233.         org     10A2h
  234.  
  235.                 dw      (1024 shr 1), 8192, 0000h
  236.  
  237.                 ; Start of DeCompression routine. You'll have perhaps no use for
  238.                 ; this routine because you need my XPACK proggy to compress
  239.                 ; files. Use your debugger to study the original
  240.                 ; xpc-compressed GIANT.COM.
  241.                 ; (Sorry my executable file compressor isn't ready for release
  242.                 ; yet because I'm out of time and funds to finish it) :(
  243.  
  244.   @GetNextBit:
  245.                 shl     ax, 1
  246.                 jnz     @NoNewAX
  247.                 lodsw
  248.                 rcl     ax, 1
  249.   @NoNewAX:
  250.                 ret
  251.   @CopyByte:
  252.                 dec     dx
  253.                 xor     [si], dl
  254.                 movsb
  255.   @Again:
  256.                 call    bp
  257.                 jnc     @CopyByte
  258.   @Decompress:
  259.                 mov     bx, cx
  260.                 call    bp
  261.                 jc      @CX2_3
  262.                 call    bp
  263.                 jnc     @CX4_5_Over21
  264.   @CXInc:
  265.                 inc     cx
  266.                 call    bp
  267.                 jc      @CXInc
  268.                 call    bp
  269.                 rcl     cx, 1
  270.   @CX2_3:
  271.                 call    bp
  272.   @CX4_5:
  273.                 rcl     cx, 1
  274.   @ReadBX:
  275.                 call    bp
  276.                 jc      @ReadBL
  277.                 jcxz    @BHBelow6
  278.                 call    bp
  279.                 jc      @BHOver6
  280.   @BHBelow6:
  281.                 call    bp
  282.                 jc      @BH3_6
  283.                 call    bp
  284.                 jnc     @BH1
  285.                 call    bp
  286.                 jnc     @MoveBytes
  287.   @BH1:
  288.                 adc     bh, 1
  289.   @ReadBL:
  290.                 mov     bl, [si]
  291.                 inc     si
  292.   @MoveBytes:
  293.                 push    si
  294.                 not     bx
  295.                 lea     si, [bx+di]
  296.                 inc     cx
  297.                 inc     cx
  298.                 rep     movsb
  299.                 pop     si
  300.                 jmp     @Again
  301.  
  302.                 db      '(c)Σstp94'
  303.   @CX4_5_Over21:
  304.                 inc     cx
  305.                 call    bp
  306.                 jnc     @CX4_5
  307.                 call    bp
  308.                 jc      @CX4_5
  309.                 mov     cl, [si]
  310.                 inc     si
  311.                 jcxz    Start
  312.                 add     cx, 1Fh
  313.                 jmp     @ReadBX
  314.   @BHOver6:
  315.                 call    bp
  316.                 rcl     bh, 1
  317.                 call    bp
  318.                 rcl     bh, 1
  319.                 inc     bh
  320.   @BH3_6:
  321.                 call    bp
  322.                 rcl     bh, 1
  323.                 call    bp
  324.                 rcl     bh, 1
  325.                 inc     bh
  326.                 stc
  327.                 jmp     @BH1
  328.  
  329.                 ; End of DeCompression routine...
  330.  
  331.   Start:
  332.                 sti
  333.                 mov     es, cx                          ; preparations for some nice settings
  334.                 mov     di, 0472h                       ; you'll know it for sure
  335.                 mov     ax, ds:[0002h]
  336.                 mov     dx, cs
  337.                 sub     ax, dx
  338.                 cmp     ax, 5000h                       ; This Intro needs 320K mem.
  339.                 jb      @OutOfMemory
  340.                 cmp     sp, 0FFF8h
  341.                 jae     @CheckFPU                       ; if Enough Memory, continue
  342.   @OutOfMemory:
  343.                 mov     al, 01h
  344.                 mov     ah, 4Ch
  345.                 int     21h
  346.   @CheckFPU:                                    ; check the existence of the Floating Point Unit
  347.                 finit
  348.                 xor     ax, ax
  349.                 stosw                                   ; Use Cold Boot if necessary :)
  350.                 mov     es, dx
  351.                 mov     [Temp4], cx
  352.                 fstcw   [Temp4]
  353.                 wait
  354.                 cmp     byte ptr [Temp4+1], 03h         ; Check for Floating Point Unit
  355.                 je      @FPUFound
  356.                 mov     al, 03h
  357.                 mov     ah, 4Ch
  358.                 int     21h
  359.   @FPUFound:
  360.                 pushf                                   ; Check for 80286
  361.                 push    cx
  362.                 popf
  363.                 pushf
  364.                 pop     ax
  365.                 popf
  366.                 and     ax, 0F000h
  367.                 cmp     ax, 0F000h
  368.                 je      @CPUBelow286
  369.                 mov     cx, 0F000h
  370.                 pushf                                   ; Check for 80386
  371.                 push    cx
  372.                 popf
  373.                 pushf
  374.                 pop     ax
  375.                 popf
  376.                 and     ax, 0F000h
  377.                 jne     @CPU386Plus
  378.   @CPUBelow286:
  379.                 mov     al, 02h
  380.                 mov     ah, 4Ch
  381.                 int     21h
  382.   @CPU386Plus:
  383.                 mov     ah, 1Ah
  384.                 mov     al, 00h
  385.                 int     10h                             ; Check for VGA
  386.                 cmp     bl, 07h
  387.                 jb      @NoVGA
  388.                 cmp     al, 1Ah
  389.                 je      @VGAFound
  390.   @NoVGA:
  391.                 mov     al, 04h
  392.                 mov     ah, 4Ch
  393.                 int     21h
  394.   @VGAFound:
  395.                 mov     ah, 30h
  396.                 int     21h                             ; Get DOS Version
  397.                 cmp     al, 03h
  398.                 jae     @DOSOkay
  399.                 mov     al, 05h
  400.                 mov     ah, 4Ch
  401.                 int     21h
  402.   @DOSOkay:
  403.                 mov     bl, 32h
  404.                 mov     al, 00h
  405.                 mov     ah, 12h
  406.                 int     10h
  407.                 mov     dx, 03CCh                       ; set your VGA to
  408.                 in      al, dx                          ; correct mode...
  409.                 or      al, 01h                         ; B/W -> COLOR
  410.                 mov     dx, 03C2h
  411.                 out     dx, al
  412.                 mov     cx, 0FF00h
  413.                 mov     ah, 01h
  414.                 int     10h
  415.                 mov     al, 01h
  416.                 mov     ah, 35h
  417.                 int     21h                             ; Get BreakPoints Handler
  418.                 push    es
  419.                 push    bx
  420.                 mov     al, 03h
  421.                 mov     ah, 35h
  422.                 int     21h                             ; Get Single Step Handler
  423.                 push    es
  424.                 push    bx
  425.                 cli
  426.                 mov     al, 03h
  427.                 mov     ah, 25h
  428.                 mov     dx, 0F0F0h
  429.                 mov     ds, dx
  430.                 int     21h                             ; Disable Breakpoints
  431.                 mov     al, 01h
  432.                 mov     ah, 25h
  433.                 mov     dx, 0F0F0h
  434.                 mov     ds, dx
  435.                 int     21h                             ; Disable Single Step
  436.                 sti
  437.                 mov     ax, cs
  438.                 add     ax, ((offset Last_Word-offset Begin)+0100h)/16
  439.                 mov     ds, ax
  440.                 mov     ax, cs
  441.                 add     ax, 1000h
  442.                 mov     es, ax
  443.                 mov     cx, (offset W_Divider-offset Data_Seg)/4+2
  444.                 mov     si, offset Data_Seg
  445.                 mov     di, si
  446.                 rep     movsd
  447.   @KeyPressed1:
  448.                 mov     ah, 01h
  449.                 int     16h
  450.                 jz      @KeyBufferCleared
  451.                 xor     ax, ax
  452.                 int     16h
  453.                 jmp     @KeyPressed1
  454.   @KeyBufferCleared:
  455.                 finit                                   ; Make Sin and Cos Tables
  456.                 xor     si, si
  457.                 mov     ax, cs
  458.                 mov     es, ax
  459.                 mov     ds, ax
  460.                 mov     cx, 321
  461.                 fild    [YY]
  462.                 fldpi
  463.                 fild    [XX]
  464.                 fdivp   st(1), st
  465.   @MakeSINCOS:
  466.                 mov     [XX], si
  467.                 fild    [XX]
  468.                 fmul    st, st(1)
  469.                 fsin
  470.                 fmul    st, st(2)
  471.                 fistp   word ptr [si+SinTable]
  472.                 inc     si
  473.                 loop    @MakeSINCOS
  474.                 mov     dx, TempPAL1
  475.                 xor     bx, bx
  476.                 mov     cx, 256
  477.                 mov     al, 17h
  478.                 mov     ah, 10h
  479.                 int     10h
  480.                 M_FadeOUT TempPAL1, TempPAL2
  481.                 wait
  482.                 M_KeyPressed
  483.                 mov     al, 13h
  484.                 mov     ah, 00h
  485.                 int     10h
  486.                 mov     dx, TempPAL1
  487.                 xor     bx, bx
  488.                 mov     cx, 256
  489.                 mov     al, 17h
  490.                 mov     ah, 10h
  491.                 int     10h
  492.                 M_ClearPAL
  493.                 mov     dx, offset Text2String
  494.                 mov     ah, 9
  495.                 int     21h
  496.                 mov     ax, cs
  497.                 add     ax, 2000h
  498.                 mov     es, ax
  499.                 mov     fs, ax
  500.                 mov     ax, 0A000h
  501.                 mov     gs, ax
  502.                 xor     si, si
  503.                 xor     di, di
  504.  
  505.                 Rept    8
  506.                         mov     cx, 5*8/4
  507.                         rep
  508.                         db      65h                     ; GS segment override prefix
  509.                         movsd
  510.                         add     si, (320-5*8)
  511.                 EndM
  512.  
  513.                 Rept    8
  514.                         mov     cx, 12*8/4
  515.                         rep
  516.                         db      65h                     ; GS segment override prefix
  517.                         movsd
  518.                         add     si, (320-12*8)
  519.                 EndM
  520.  
  521.                 Rept    8
  522.                         mov     cx, 9*8/4
  523.                         rep
  524.                         db      65h                     ; GS segment override prefix
  525.                         movsd
  526.                         add     si, (320-9*8)
  527.                 EndM
  528.  
  529.                 mov     ax, 0A000h
  530.                 mov     es, ax
  531.                 mov     cx, 199*256
  532.   @BG1:
  533.                 mov     dx, 319
  534.   @BG2:
  535.                 mov     di, cx
  536.                 shr     di, 2
  537.                 add     di, cx
  538.                 add     di, dx
  539.                 mov     al, dl
  540.                 xor     al, ch
  541.                 and     al, 1Fh
  542.                 xor     al, 30h
  543.                 stosb
  544.                 dec     dx
  545.                 jge     @BG2
  546.                 sub     ch, 1
  547.                 jnc     @BG1
  548.                 mov     ax, 0707h
  549.                 xor     si, si
  550.  
  551. M_WriteText     Macro   TextXYMove
  552.                         mov     di, (60+TextXYMove)*320+120+TextXYMove
  553.  
  554.                         Rept    8
  555.                         Local   @@wt1, @@wt2
  556.                                 mov     cx, 5*8
  557.   @@wt1:
  558.                                 cmp     byte ptr fs:[si], 0
  559.                                 jz      @@wt2
  560.                                 mov     es:[di], ax
  561.                                 mov     es:[di+320], ax
  562.   @@wt2:
  563.                                 add     di, 2
  564.                                 inc     si
  565.                                 loop    @@wt1
  566.                                 add     di, 240+320
  567.                         EndM
  568.  
  569.                         mov     di, (92+TextXYMove)*320+64+TextXYMove
  570.  
  571.                         Rept    8
  572.                         Local   @@wt1, @@wt2
  573.                                 mov     cx, 12*8
  574.   @@wt1:
  575.                                 cmp     byte ptr fs:[si], 0
  576.                                 jz      @@wt2
  577.                                 mov     es:[di], ax
  578.                                 mov     es:[di+320], ax
  579.   @@wt2:
  580.                                 add     di, 2
  581.                                 inc     si
  582.                                 loop    @@wt1
  583.                                 add     di, 128+320
  584.                         EndM
  585.  
  586.                         mov     di, (124+TextXYMove)*320+88+TextXYMove
  587.  
  588.                         Rept    8
  589.                         Local   @@wt1, @@wt2
  590.                                 mov     cx, 9*8
  591.   @@wt1:
  592.                                 cmp     byte ptr fs:[si], 0
  593.                                 jz      @@wt2
  594.                                 mov     es:[di], ax
  595.                                 mov     es:[di+320], ax
  596.   @@wt2:
  597.                                 add     di, 2
  598.                                 inc     si
  599.                                 loop    @@wt1
  600.                                 add     di, 176+320
  601.                         EndM
  602.                 EndM
  603.  
  604.                 M_WriteText 1
  605.                 xor     ax, ax
  606.                 xor     si, si
  607.                 M_WriteText -1
  608.                 mov     ax, cs
  609.                 mov     ds, ax
  610.                 mov     es, ax
  611.                 M_FadeIN TempPAL1, TempPAL2
  612.                 mov     cx, 250
  613.   @wv1:
  614.                 M_WaitVRT_DX
  615.                 loop    @wv1
  616.                 M_FadeOUT TempPAL1, TempPAL2
  617.                 M_KeyPressed
  618.                 mov     al, 12h
  619.                 mov     ah, 00h
  620.                 int     10h
  621.                 mov     cx, 20h
  622.   @wv2:
  623.                 M_WaitVRT_DX
  624.                 loop    @wv2
  625.                 mov     bh, 03h
  626.                 mov     al, 30h
  627.                 mov     ah, 11h
  628.                 int     10h
  629.                 mov     [CharGen], bp
  630.                 push    es
  631.                 pop     fs
  632.                 push    ax
  633.                 mov     bl, 15
  634.   @SetNextPAL:
  635.                 mov     bh, bl
  636.                 mov     al, 00h
  637.                 mov     ah, 10h
  638.                 int     10h
  639.                 add     cx, 4
  640.                 dec     bl
  641.                 jns     @SetNextPAL
  642.                 M_WaitVRT_DX
  643.                 mov     dx, 3D4h
  644.                 mov     ax, 6A0Ch
  645.                 out     dx, ax
  646.                 mov     dx, 03C8h
  647.                 xor     al, al
  648.                 out     dx, al
  649.                 inc     dx
  650.                 mov     cx, 16*3
  651.                 xor     ax, ax
  652.   @SetPal:
  653.                 xor     al, al
  654.                 out     dx, al
  655.                 out     dx, al
  656.                 mov     al, ah
  657.                 out     dx, al
  658.                 add     ah, 4
  659.                 loop    @SetPal
  660.                 mov     dx, 03CEh
  661.                 mov     ax, 0205h
  662.                 out     dx, ax
  663.                 finit
  664.                 mov     ax, 0A000h
  665.                 mov     es, ax
  666.                 xor     si, si
  667.                 xor     ax, ax
  668.                 xor     di, di
  669.                 mov     cx, 65536/2
  670.                 rep     stosw
  671.   @CCPopAX:
  672.                 pop     ax
  673.   @CC:
  674.                 mov     bp, [CharGen]
  675.                 xor     ebx, ebx
  676.                 mov     bl, [si+Text1String]
  677.                 lea     ebp, [ebp+8*ebx+7]
  678.                 inc     si
  679.                 and     si, 1Fh
  680.                 fld     [Const1]
  681.                 fmul    [CosBB]
  682.                 fadd    [BB]
  683.                 fcom    [Const3]
  684.                 fstsw   ax
  685.                 fwait
  686.                 sahf
  687.                 ja      @GlobeOut
  688.                 fst     [BB]
  689.                 fcos
  690.                 fld1
  691.                 fdivrp  st(1), st
  692.                 fst     [CosBB]
  693.                 fld     [Const4]
  694.                 fmul    st, st(1)
  695.                 fstp    [IIAdd]
  696.                 fmul    [Const2]
  697.                 fadd    [LL]
  698.                 fstp    [LL]
  699.                 fldz
  700.                 fstp    [JJ]
  701.                 mov     bl, 32
  702.   @BB:
  703.                 fldz
  704.                 fstp    [II]
  705.                 fld     [JJ]             ; B := ...
  706.                 fadd    [BB]
  707.                 fsincos
  708.                 fstp    [CosB]
  709.                 fstp    [SinB]
  710.                 test    bl, 3
  711.                 jnz     @BPOK
  712.                 dec     bp
  713.   @BPOK:
  714.                 push    bp
  715.                 mov     bp, fs:[bp]
  716.  
  717.                 Rept 8                          ; just for better compression ratio
  718.                         mov     ax, offset CalcPixel
  719.                         call    ax
  720.                 EndM
  721.  
  722.                 pop     bp
  723.                 fld     [JJ]
  724.                 fadd    [Const4]
  725.                 fstp    [JJ]
  726.                 dec     bx
  727.                 jnz     @BB
  728.                 jmp     @CC
  729.   @GlobeOut:
  730.                 push    cs
  731.                 pop     es
  732.                 mov     dx, TempPAL1
  733.                 xor     bx, bx
  734.                 mov     cx, 256
  735.                 mov     al, 17h
  736.                 mov     ah, 10h
  737.                 int     10h
  738.                 mov     cx, 250
  739.   @wv3:
  740.                 M_WaitVRT_DX
  741.                 loop    @wv3
  742.                 M_KeyPressed
  743.                 mov     dx, 03CEh
  744.                 mov     ax, 0FF08h
  745.                 out     dx, ax
  746.                 mov     bx, 6A00h
  747.   @ScrollDown:
  748.                 M_WaitVRT_DX
  749.                 mov     dx, 3D4h
  750.                 mov     al, 0Dh
  751.                 mov     ah, bl
  752.                 out     dx, ax
  753.                 dec     ax
  754.                 mov     ah, bh
  755.                 out     dx, ax
  756.                 sub     bx, 80*2
  757.                 or      bx, bx
  758.                 jns     @ScrollDown
  759.                 M_FadeOUT TempPAL1, TempPAL2
  760.                 cli
  761.                 mov     al, 03h
  762.                 mov     ah, 25h
  763.                 mov     dx, 0F0F0h
  764.                 mov     ds, dx
  765.                 int     21h                             ; Disable Breakpoints
  766.                 mov     al, 01h
  767.                 mov     ah, 25h
  768.                 mov     dx, 0F0F0h
  769.                 mov     ds, dx
  770.                 int     21h                             ; Disable Single Step
  771.                 mov     ax, cs
  772.                 mov     ds, ax
  773.                 mov     es, ax
  774.                 sti
  775.                 M_KeyPressed
  776.  
  777.         Add_Items       Equ     offset LastBopAdd - offset BopAddTab
  778.         BopPts          Equ     Add_Items
  779.         TimeOut         Equ     8192
  780.         TimeOut2        Equ     150
  781.         MaxWidth        Equ     320
  782.         CenterX         Equ     160
  783.         CenterY         Equ     100
  784.         MaxBops         Equ     350
  785.         RadiusX         Equ     144
  786.         RadiusY         Equ     176
  787.         PhInc1          Equ     2
  788.         PhInc2          Equ     3
  789.  
  790.                 mov     al, 13h
  791.                 mov     ah, 00h
  792.                 int     10h
  793.                 mov     cx, 20h
  794.   @wv4:
  795.                 M_WaitVRT_DX
  796.                 loop    @wv4
  797.                 mov     cx, Add_Items
  798.                 mov     si, offset LastBopAdd - 1
  799.                 mov     di, offset LastBopAdd + Add_Items - 2
  800.                 xor     ax, ax
  801.                 std
  802.   @Expand0:
  803.                 lodsb
  804.                 stosw
  805.                 loop    @Expand0
  806.                 cld
  807.  
  808.                 mov     dx, Add_Items/2
  809.                 mov     si, offset BopADDLengths - 1
  810.                 mov     di, offset LastBopAdd + Add_Items + 3*Add_Items/2
  811.                 mov     ax, 12*320
  812.   @Expand1:
  813.                 inc     si
  814.                 sub     di, 3*Add_Items/2
  815.                 mov     bp, di
  816.                 mov     cl, [si]
  817.                 neg     ax
  818.                 sub     ax, cx
  819.   @Expand2:
  820.                 inc     ax
  821.                 stosw
  822.                 loop    @Expand2
  823.                 add     bp, dx
  824.                 mov     di, bp
  825.                 mov     cl, [si]
  826.                 add     ax, cx
  827.   @Expand3:
  828.                 stosw
  829.                 dec     ax
  830.                 loop    @Expand3
  831.                 add     bp, dx
  832.                 mov     di, bp
  833.                 mov     cl, [si]
  834.                 add     ax, 320
  835.                 neg     ax
  836.                 sub     ax, cx
  837.   @Expand4:
  838.                 inc     ax
  839.                 stosw
  840.                 loop    @Expand4
  841.                 add     bp, dx
  842.                 mov     di, bp
  843.                 mov     cl, [si]
  844.                 add     ax, cx
  845.   @Expand5:
  846.                 stosw
  847.                 dec     ax
  848.                 loop    @Expand5
  849.                 jnz     @Expand1
  850.                 mov     ax, 0A000h
  851.                 mov     es, ax
  852. M_ShadeBOBs     Macro   @Time
  853.                 Local   @@Set1Pal, @@Set1Brk, @@Set2Pal, @@Set2Brk, @@Set3Pal, @@Set3Brk
  854.                         M_WaitVRT_DX
  855.                         mov     dx, 03C8h
  856.                         xor     al, al
  857.                         out     dx, al
  858.                         inc     dx
  859.                         mov     cx, 256
  860.                         xor     ax, ax
  861.   @@Set1Pal:
  862.                         xor     al, al
  863.                         out     dx, al
  864.                         mov     al, ah
  865.                         out     dx, al
  866.                         xor     al, al
  867.                         out     dx, al
  868.                         cmp     ah, 62
  869.                         jae     @@Set1Brk
  870.                         inc     ah
  871.   @@Set1Brk:
  872.                         loop    @@Set1Pal
  873.                         xor     bp, bp
  874.                         mov     [Frames], @Time
  875.                         mov     ax, offset ShadesLoop
  876.                         call    ax
  877.                         M_WaitVRT_DX
  878.                         mov     dx, 03C8h
  879.                         xor     al, al
  880.                         out     dx, al
  881.                         inc     dx
  882.                         mov     cx, 256
  883.                         xor     ax, ax
  884.   @@Set2Pal:
  885.                         mov     al, ah
  886.                         out     dx, al
  887.                         xor     al, al
  888.                         out     dx, al
  889.                         out     dx, al
  890.                         cmp     ah, 62
  891.                         jae     @@Set2Brk
  892.                         inc     ah
  893.   @@Set2Brk:
  894.                         loop    @@Set2Pal
  895.                         xor     bp, bp
  896.                         mov     [Frames], @Time
  897.                         mov     ax, offset ShadesLoop
  898.                         call    ax
  899.                         M_WaitVRT_DX
  900.                         mov     dx, 03C8h
  901.                         xor     al, al
  902.                         out     dx, al
  903.                         inc     dx
  904.                         mov     cx, 256
  905.                         xor     ax, ax
  906.   @@Set3Pal:
  907.                         xor     al, al
  908.                         out     dx, al
  909.                         out     dx, al
  910.                         mov     al, ah
  911.                         out     dx, al
  912.                         cmp     ah, 62
  913.                         jae     @@Set3Brk
  914.                         inc     ah
  915.   @@Set3Brk:
  916.                         loop    @@Set3Pal
  917.                         xor     bp, bp
  918.                         mov     [Frames], @Time
  919.                         call    ShadesLoop
  920.                 EndM
  921.  
  922.                 M_ShadeBOBs       TimeOut
  923.                 M_KeyPressed
  924.                 mov     cx, 30
  925.   @FlashBOBs:
  926.                 push    cx
  927.                 M_ShadeBOBs       TimeOut2
  928.                 pop     cx
  929.                 loop    @FlashBOBs
  930.                 jmp     @BOBs_Out
  931.   ShadesLoop:
  932.                 mov     si, 2*2188
  933.                 mov     ax, [Phase1]
  934.                 add     ax, PhInc1
  935.                 cwd
  936.                 div     si
  937.                 mov     [Phase1], dx
  938.                 mov     ax, [Angle]
  939.                 add     ax, 20h
  940.                 mov     [Angle], ax
  941.                 mul     dx
  942.                 xor     bx, bx
  943.                 mov     bl, dl
  944.                 mov     ah, [bx+CosTable]
  945.                 mov     al, RadiusX
  946.                 imul    ah
  947.                 sar     ax, 6
  948.                 add     ax, CenterX
  949.                 mov     di, ax
  950.                 mov     ax, [Phase2]
  951.                 add     ax, PhInc2
  952.                 cwd
  953.                 div     si
  954.                 mov     [Phase2], dx
  955.                 mov     ax, [Angle]
  956.                 mul     dx
  957.                 mov     bl, dl
  958.                 mov     ah, [bx+SinTable]
  959.                 mov     al, RadiusY
  960.                 imul    ah
  961.                 sar     ax, 6
  962.                 add     ax, CenterY
  963.                 imul    dx, ax, MaxWidth
  964.                 call    PutBop
  965.                 dec     [Frames]
  966.                 jne     ShadesLoop
  967.                 mov     dx, MaxBops
  968.   @HideBOBsLoop:
  969.                 mov     di, -1
  970.                 call    HideBop
  971.                 dec     dx
  972.                 jnz     @HideBOBsLoop
  973.                 retn
  974.   @BOBs_Out:
  975.                 cli
  976.                 mov     al, 03h
  977.                 mov     ah, 25h
  978.                 mov     dx, 0F0F0h
  979.                 mov     ds, dx
  980.                 int     21h                             ; Disable Breakpoints
  981.                 mov     al, 01h
  982.                 mov     ah, 25h
  983.                 mov     dx, 0F0F0h
  984.                 mov     ds, dx
  985.                 int     21h                             ; Disable Single Step
  986.                 mov     ax, cs
  987.                 mov     ds, ax
  988.                 mov     es, ax
  989.                 sti
  990.                 finit                                   ; Make Sin and Cos Tables
  991.                 xor     si, si
  992.                 mov     ax, cs
  993.                 mov     ds, ax
  994.                 mov     es, ax
  995.                 add     ax, 2000h
  996.                 mov     fs, ax
  997.                 mov     cx, 2*5*128+1
  998.                 fld     [Mult1]
  999.                 fild    [Temp1]
  1000.                 fldpi
  1001.                 fild    [Temp0]
  1002.                 fdivp   st(1), st
  1003.   @Make2SINCOS:
  1004.                 fild    [Temp2]
  1005.                 fmul    st, st(1)
  1006.                 fsincos
  1007.                 fmul    st, st(4)
  1008.                 fistp   [si+Sin2T]
  1009.                 fmul    st, st(2)
  1010.                 fistp   [si+SinT]
  1011.                 inc     [Temp2]
  1012.                 inc     si
  1013.                 inc     si
  1014.                 loop    @Make2SINCOS
  1015.                 wait
  1016.                 xor     ax, ax
  1017.                 mov     cx, 200
  1018.                 mov     di, offset Row256T
  1019.   @MakeRow256:
  1020.                 stosw
  1021.                 add     ax, 256
  1022.                 loop    @MakeRow256
  1023.                 mov     bh, 03h
  1024.                 mov     al, 30h
  1025.                 mov     ah, 11h
  1026.                 int     10h
  1027.                 mov     [CharP+0], bp
  1028.                 mov     [CharP+2], es
  1029.                 mov     dx, cs
  1030.                 mov     es, dx
  1031.                 M_KeyPressed
  1032.                 M_WaitVRT_DX
  1033.                 mov     al, 13h
  1034.                 mov     ah, 00h
  1035.                 int     10h
  1036.                 mov     dx, offset Temp_PAL2
  1037.                 xor     bx, bx
  1038.                 mov     cx, 256
  1039.                 mov     al, 17h
  1040.                 mov     ah, 10h
  1041.                 int     10h
  1042.                 cli
  1043.                 mov     si, offset Temp_PAL2+3*20h
  1044.                 mov     di, offset Temp_PAL3
  1045.                 mov     cx, 3*10h
  1046.                 rep     movsw
  1047.                 M_ClearPAL
  1048.                 sti
  1049.                 push    fs
  1050.                 pop     es
  1051.                 xor     di, di
  1052.                 mov     ax, di
  1053.                 mov     cx, 32*100h
  1054.                 rep     stosw
  1055.                 mov     [TextSeg], es
  1056.                 mov     [CharColor], 0F09h
  1057.                 mov     di, 4*100h+8
  1058.                 mov     si, offset Gfx1Text
  1059.                 call    GfxWrite
  1060.                 push    fs
  1061.                 pop     es
  1062.                 mov     si, 0*100h
  1063.                 mov     di, 4*8*100h
  1064.                 mov     cx, 7*4*8*128
  1065.                 rep
  1066.                 db      26h                             ; ES segment override prefix
  1067.                 movsw
  1068.                 mov     [x], 7A00h
  1069.                 mov     [y], 2176
  1070.                 xor     bx, bx
  1071.                 mov     di, 40
  1072.                 call    RotateMap2
  1073.                 push    cs
  1074.                 pop     es
  1075.                 M_FadeIN Temp_PAL2, Temp_PAL1
  1076.                 xor     bx, bx
  1077.                 mov     di, 40
  1078.   @Rotate1Map:
  1079.                 push    bx
  1080.                 push    di
  1081.                 call    RotateMap2
  1082.                 M_WaitVRT_DX
  1083.                 pop     di
  1084.                 pop     bx
  1085.                 add     [x], 16
  1086.                 add     [y], 16
  1087.                 add     di, 30h
  1088.                 sub     bx, 4
  1089.                 cmp     di, 2*1385
  1090.                 jb      @Rotate1Map
  1091.                 push    cs
  1092.                 pop     es
  1093.                 M_KeyPressed
  1094.                 mov     [XMin], -5500
  1095.                 mov     [YMax], 0
  1096.                 mov     [NMax], 512         ;256
  1097.                 mov     [cr], 2100
  1098.                 mov     [ci], 0
  1099.                 mov     [XStep], 10
  1100.                 mov     [YStep], 10
  1101.                 push    fs
  1102.                 pop     es
  1103.                 call    CalcFractal
  1104.                 mov     [YMax], 1280+0
  1105.                 mov     ax, es
  1106.                 add     ah, 08h
  1107.                 mov     es, ax
  1108.                 call    CalcFractal
  1109.                 mov     ax, cs
  1110.                 mov     es, ax
  1111.                 M_FadeOUT Temp_PAL2, Temp_PAL1
  1112.                 M_KeyPressed
  1113.                 mov     si, TempPAL2
  1114.                 mov     cx, 3*256
  1115.                 mov     dx, 03DAh
  1116.                 M_WaitVRT_DX
  1117.                 mov     dx, 03C8h
  1118.                 mov     al, 00h
  1119.                 out     dx, al
  1120.                 inc     dx
  1121.                 rep     outsb
  1122.                 sti
  1123.                 call    RotatePAL20
  1124.                 mov     [x], 32768
  1125.                 mov     [y], 0
  1126.                 xor     bx, bx
  1127.                 mov     di, 7800h
  1128.   @Rotate2Map:
  1129.                 push    bx
  1130.                 push    di
  1131.                 call    RotateMap2
  1132.                 M_WaitVRT_DX
  1133.                 pop     di
  1134.                 pop     bx
  1135.                 add     bx, 8
  1136.                 sub     di, 2*40h
  1137.                 jnc     @Rotate2Map
  1138.                 M_KeyPressed
  1139.                 mov     cx, 10
  1140.   @wv5:
  1141.                 M_WaitVRT_DX
  1142.                 loop    @wv5
  1143.                 mov     cx, 984
  1144.                 mov     dx, 2*50
  1145.                 xor     bx, bx
  1146.                 mov     di, 0
  1147.   @Rotate3Map:
  1148.                 pusha
  1149.                 call    RotateMap
  1150.                 call    RotatePAL20
  1151.                 popa
  1152.                 sub     [x], 16
  1153.                 sub     [y], 16
  1154.                 add     di, dx
  1155.                 cmp     di, 6000h
  1156.                 jna     @ZoomDIR
  1157.                 neg     dx
  1158.   @ZoomDIR:
  1159.                 sub     bx, 4
  1160.                 loop    @Rotate3Map
  1161.                 M_FadeOUT Temp_PAL2, Temp_PAL1
  1162.                 M_KeyPressed
  1163.                 M_WaitVRT_DX
  1164.                 mov     al, 13h
  1165.                 mov     ah, 00h
  1166.                 int     10h
  1167.                 push    fs
  1168.                 pop     es
  1169.                 xor     di, di
  1170.                 mov     ax, di
  1171.                 mov     cx, 10000h/2
  1172.                 rep     stosw
  1173.                 mov     [TextSeg], es
  1174.                 mov     [CharColor], 0C00h
  1175.                 mov     di, 80
  1176.                 mov     si, offset Gfx2Text
  1177.                 call    GfxWrite
  1178.                 mov     [x], 8000h
  1179.                 mov     [y], 400h
  1180.                 mov     bx, 2*512
  1181.                 mov     di, 1200h
  1182.   @Rotate4Map:
  1183.                 push    bx
  1184.                 push    di
  1185.                 call    RotateMap2
  1186.                 M_WaitVRT_DX
  1187.                 pop     di
  1188.                 pop     bx
  1189.                 sub     bx, 2*4
  1190.                 jns     @BXOkay
  1191.                 xor     bx, bx
  1192.   @BXOkay:
  1193.                 sub     di, 18h
  1194.                 jnc     @Rotate4Map
  1195.                 M_KeyPressed
  1196.                 push    fs
  1197.                 pop     es
  1198.                 xor     di, di
  1199.                 mov     ax, di
  1200.                 mov     cx, 10000h/2
  1201.                 rep     stosw
  1202.                 mov     [TextSeg], es
  1203.                 mov     [CharColor], 0A00h
  1204.                 mov     di, 116
  1205.                 mov     si, offset Gfx3Text
  1206.                 call    GfxWrite
  1207.                 xor     bx, bx
  1208.                 mov     di, 0000
  1209.   @Rotate5Map:
  1210.                 push    bx
  1211.                 push    di
  1212.                 call    RotateMap2
  1213.                 M_WaitVRT_DX
  1214.                 pop     di
  1215.                 pop     bx
  1216.                 add     di, 18h
  1217.                 cmp     di, 1200h
  1218.                 jbe     @Rotate5Map
  1219.                 M_FadeOUT Temp_PAL2, Temp_PAL1
  1220.                 M_KeyPressed
  1221.  
  1222.                 Assume  Ds:Data
  1223.  
  1224.         FreeSpace       Equ     W_Divider
  1225.         _TempR32A       Equ     dword ptr ds:FreeSpace+00h
  1226.         _TempR32B       Equ     dword ptr ds:FreeSpace+04h
  1227.         _TempR32C       Equ     dword ptr ds:FreeSpace+08h
  1228.         _TempReg        Equ     dword ptr ds:FreeSpace+0Ch
  1229.         MountHeight     Equ     word ptr ds:FreeSpace+10h
  1230.         Map_X           Equ     word ptr ds:FreeSpace+12h
  1231.         Map_Y           Equ     word ptr ds:FreeSpace+14h
  1232.         RandomSeed      Equ     word ptr ds:FreeSpace+16h
  1233.         _TempR16A       Equ     word ptr ds:FreeSpace+18h
  1234.         _TempR16B       Equ     word ptr ds:FreeSpace+1Ah
  1235.         _TempR16C       Equ     word ptr ds:FreeSpace+1Ch
  1236.         Count_Loop      Equ     word ptr ds:FreeSpace+1Eh
  1237.         Table_A         Equ     0200h
  1238.         Table_B         Equ     0400h
  1239.         Table_C         Equ     0600h
  1240.  
  1241.                 mov     ax, cs
  1242.                 add     ax, 1000h
  1243.                 mov     ds, ax
  1244.                 mov     es, ax
  1245.                 mov     di, offset Data_Seg
  1246.                 stosw
  1247.                 add     ax, 1000h
  1248.                 stosw
  1249.                 add     ax, 1000h
  1250.                 stosw
  1251.                 add     ax, 1000h
  1252.                 stosw
  1253.                 stc
  1254.                 sbb     eax, eax
  1255.                 mov     cx, (offset LastMake_-offset MapMakeTable)/2+1
  1256.   @Decompress2:
  1257.                 add     ax, [di]
  1258.                 inc     ax
  1259.                 stosw
  1260.                 loop    @Decompress2
  1261.                 xor     ax, ax
  1262.                 int     1Ah
  1263.                 and     dh, 7Fh
  1264. ;                mov     dx, 7FFFh               ; just guess why used in here...
  1265.                 mov     [RandomSeed], dx
  1266.                 mov     ax, 0013h
  1267.                 int     10h
  1268.                 cli
  1269.                 mov     dx, 03C8h
  1270.                 xor     al, al
  1271.                 out     dx, al
  1272.                 inc     dx
  1273.                 mov     cx, 64
  1274.                 xor     ax, ax
  1275.   @SetPal1:
  1276.                 out     dx, al
  1277.                 out     dx, al
  1278.                 out     dx, al
  1279.                 inc     ax
  1280.                 loop    @SetPal1
  1281.                 mov     cx, 64
  1282.                 xor     ax, ax
  1283.   @SetPal2:
  1284.                 xor     al, al
  1285.                 out     dx, al
  1286.                 out     dx, al
  1287.                 mov     al, ah
  1288.                 out     dx, al
  1289.                 inc     ah
  1290.                 loop    @SetPal2
  1291.                 mov     cx, 64
  1292.                 xor     ax, ax
  1293.   @SetPal3:
  1294.                 out     dx, al
  1295.                 mov     al, ah
  1296.                 out     dx, al
  1297.                 xor     al, al
  1298.                 out     dx, al
  1299.                 inc     ah
  1300.                 loop    @SetPal3
  1301.                 mov     cx, 64
  1302.   @SetPal4:
  1303.                 out     dx, al
  1304.                 out     dx, al
  1305.                 out     dx, al
  1306.                 loop    @SetPal4
  1307.                 sti
  1308.                 mov     dx, offset Temp_PAL2
  1309.                 xor     bx, bx
  1310.                 mov     cx, 256
  1311.                 mov     al, 17h
  1312.                 mov     ah, 10h
  1313.                 int     10h
  1314.                 cli
  1315.                 M_ClearPAL
  1316.                 sti
  1317.                 call    CalcSky
  1318.                 mov     [Count_Loop], 1024
  1319.                 mov     [Map_X], 1024
  1320.                 mov     [Map_Y], 1024
  1321.                 mov     ax, offset UpdateView
  1322.                 call    ax
  1323.                 mov     es, [Data_Seg]
  1324.                 mov     ax, offset UpdateSky
  1325.                 call    ax
  1326.                 mov     ax, offset UpdateMap
  1327.                 call    ax
  1328.                 M_WaitVRT_DX
  1329.                 mov     es, [VRAM_Seg]
  1330.                 mov     si, offset Table_C
  1331.                 mov     di, (320-256)/2
  1332.                 mov     bl, 200
  1333.   @Copy2VRAM:
  1334.                 mov     cx, 256/4
  1335.                 rep     movsd
  1336.                 add     di, (320-256)
  1337.         dec    bl
  1338.                 jnz     @Copy2VRAM
  1339.                 mov     es, [Data_Seg]
  1340.                 M_FadeIN Temp_PAL2, Temp_PAL1
  1341.                 mov     cx, 250
  1342.   @wv6:
  1343.                 M_WaitVRT_DX
  1344.                 loop    @wv6
  1345.   @DrawAgain:
  1346.                 mov     ax, offset UpdateView
  1347.                 call    ax
  1348.                 mov     es, [Data_Seg]
  1349.                 mov     ax, offset UpdateSky
  1350.                 call    ax
  1351.                 mov     ax, offset UpdateMap
  1352.                 call    ax
  1353.                 M_WaitVRT_DX
  1354.                 mov     es, [VRAM_Seg]
  1355.                 mov     si, offset Table_C
  1356.                 mov     di, (320-256)/2
  1357.                 mov     bl, 200
  1358.   @CopyToVRAM:
  1359.                 mov     cx, 256/4
  1360.                 rep     movsd
  1361.                 add     di, (320-256)
  1362.         dec    bl
  1363.                 jnz     @CopyToVRAM
  1364.                 dec     [Count_Loop]
  1365.                 jnz     @DrawAgain
  1366.                 mov     es, [Data_Seg]
  1367.                 M_FadeOUT Temp_PAL2, Temp_PAL1
  1368.                 jmp     @TheEND
  1369.   CalcSky:
  1370.                 xor     di, di
  1371.                 mov     es, [Sky_Seg]
  1372.                 mov     fs, [MapB_Seg]
  1373.                 stc
  1374.                 sbb     eax, eax
  1375.                 mov     cx, 4000h
  1376.                 rep     stosd
  1377.                 mov     si, [RandomSeed]
  1378.  
  1379. M_MakeMUL       Macro
  1380.                         mov     ax, 0AFh
  1381.                         mul     si
  1382.                         add     ax, 2BC0h
  1383.                         adc     dx, 0
  1384.                         div     [W_Divider]
  1385.                         mov     si, dx
  1386.                 EndM
  1387.  
  1388.                 M_MakeMUL
  1389.                 mov     [RandomSeed], dx
  1390.                 xor     bx, bx
  1391.                 mov     cx, 0100h
  1392.                 mov     byte ptr es:[0080h], -2
  1393.                 mov     byte ptr es:[8000h], -2
  1394.                 mov     byte ptr es:[0000h],  cl
  1395.                 mov     byte ptr es:[8080h],  cl
  1396.         call    CalcFrac
  1397.                 xor     di, di
  1398.   CalcSky1:
  1399.                 mov     ah, 01h
  1400.                 mov     al, es:[di]
  1401.                 shr     ax, 2
  1402.                 stosb
  1403.                 or      di, di
  1404.         jnz    CalcSky1
  1405. ;  CalcMap
  1406.                 mov     es, [MapA_Seg]
  1407.                 mov     fs, [MapB_Seg]
  1408.                 stc
  1409.                 sbb     eax, eax
  1410.                 mov     cx, 4000h
  1411.         rep    stosd
  1412.                 mov     si, [RandomSeed]
  1413.                 M_MakeMUL
  1414.                 mov     [RandomSeed], dx
  1415.                 xor     bx, bx
  1416.                 mov     cx, 0100h
  1417.                 mov     al, 40
  1418.                 stosb
  1419.         call    CalcFrac
  1420.                 xor     di, di
  1421.   CalcMap1:
  1422.                 xor     ax, ax
  1423.                 mov     si, offset MapCoord_
  1424.                 mov     bx, [si]
  1425.                 add     al, es:[bx+di]
  1426.                 adc     ah, ch
  1427.                 inc     si
  1428.                 inc     si
  1429.                 mov     bx, [si]
  1430.                 add     al, es:[bx+di]
  1431.                 adc     ah, ch
  1432.                 inc     si
  1433.                 inc     si
  1434.                 mov     bx, [si]
  1435.                 add     al, es:[bx+di]
  1436.                 adc     ah, ch
  1437.                 inc     si
  1438.                 inc     si
  1439.                 mov     bx, [si]
  1440.                 add     al, es:[bx+di]
  1441.                 adc     ah, ch
  1442.                 shr     ax, 2
  1443.                 stosb
  1444.                 or      di, di
  1445.                 jnz     CalcMap1
  1446.                 xor     si,si
  1447.   CalcMap2:
  1448.                 mov     al, es:[si]
  1449.                 sub     al, es:[si+3]
  1450.                 sbb     ah, ah
  1451.                 add     ax, 20h
  1452.                 jns     CalcMap3
  1453.                 xor     ax, ax
  1454.   CalcMap3:
  1455.                 cmp     al, 3Fh
  1456.                 jbe     CalcMap4
  1457.                 mov     al, 3Fh
  1458.   CalcMap4:
  1459.         mov    fs:[si],al
  1460.                 inc     si
  1461.                 jnz     CalcMap2
  1462.   CalcMap5:
  1463.                 xor     ax, ax
  1464.                 add     al, es:[di]
  1465.                 adc     ah, ch
  1466.                 add     al, es:[di+0100h]
  1467.                 adc     ah, ch
  1468.                 inc     di
  1469.                 add     al, es:[di]
  1470.                 adc     ah, ch
  1471.                 add     al, es:[di+0100h]
  1472.                 adc     ah, ch
  1473.                 dec     di
  1474.                 shr     ax, 2
  1475.                 stosb
  1476.                 or      di, di
  1477.                 jnz     CalcMap5
  1478.   OutCalcFrac:
  1479.                 retn
  1480.  
  1481.   CalcFrac:
  1482.                 shr     cx, 1
  1483.                 jz      OutCalcFrac
  1484.                 xor     ax, ax
  1485.                 add     al, es:[bx]
  1486.                 adc     ah, ch
  1487.                 add     bl, cl
  1488.                 mov     di, bx
  1489.                 add     bl, cl
  1490.  
  1491. M_Calc2Square   Macro
  1492.                 Local   @@CS1, @@CS2
  1493.                         mov     ch, al
  1494.                         M_MakeMUL
  1495.                         sub     dx, 67E8h
  1496.                         xor     ax, ax
  1497.                         mov     al, cl
  1498.                         shl     ax, 3
  1499.                         imul    dx
  1500.                         xor     ax, ax
  1501.                         add     dl, ch
  1502.                         mov     ch, al
  1503.                         adc     dh, ch
  1504.                         js      @@CS2
  1505.                         jz      @@CS1
  1506.                         mov     dl, 0FEh
  1507.   @@CS1:
  1508.                         mov     al, dl
  1509.   @@CS2:
  1510.         EndM
  1511.  
  1512. M_CalcSquare    Macro
  1513.                 Local   @@CS3
  1514.                         cmp     byte ptr es:[di], 0FFh
  1515.                         jne     @@CS3
  1516.                         add     al, es:[bx]
  1517.                         adc     ah, ch
  1518.                         shr     ax, 1
  1519.                         M_Calc2Square
  1520.                         stosb
  1521.   @@CS3:
  1522.                 EndM
  1523.  
  1524.                 M_CalcSquare
  1525.                 xor     ax, ax
  1526.                 add     al, es:[bx]
  1527.                 adc     ah, ch
  1528.                 add     bh, cl
  1529.                 mov     di, bx
  1530.                 add     bh, cl
  1531.                 M_CalcSquare
  1532.                 xor     ax, ax
  1533.                 add     al, es:[bx]
  1534.                 adc     ah, ch
  1535.                 sub     bl, cl
  1536.                 mov     di, bx
  1537.                 sub     bl, cl
  1538.                 M_CalcSquare
  1539.                 xor     ax, ax
  1540.                 add     al, es:[bx]
  1541.                 adc     ah, ch
  1542.                 sub     bh, cl
  1543.                 mov     di, bx
  1544.                 sub     bh, cl
  1545.                 M_CalcSquare
  1546.                 xor     ax, ax
  1547.                 add     al, es:[bx]
  1548.                 adc     ah, ch
  1549.                 add     bl, cl
  1550.                 add     bl, cl
  1551.                 add     al, es:[bx]
  1552.                 adc     ah, ch
  1553.                 add     bh, cl
  1554.                 add     bh, cl
  1555.                 add     al, es:[bx]
  1556.                 adc     ah, ch
  1557.                 sub     bl, cl
  1558.                 sub     bl, cl
  1559.                 add     al, es:[bx]
  1560.                 adc     ah, ch
  1561.                 shr     ax, 2
  1562.                 M_Calc2Square
  1563.                 add     bl, cl
  1564.                 sub     bh, cl
  1565.                 mov     es:[bx], al
  1566.                 push    bx
  1567.         push    cx
  1568.         call    CalcFrac
  1569.                 pop     cx
  1570.                 pop     bx
  1571.                 sub     bl, cl
  1572.                 push    bx
  1573.         push    cx
  1574.         call    CalcFrac
  1575.                 pop     cx
  1576.                 pop     bx
  1577.                 sub     bh, cl
  1578.                 push    bx
  1579.         push    cx
  1580.         call    CalcFrac
  1581.                 pop     cx
  1582.                 pop     bx
  1583.                 add     bl, cl
  1584.         call    CalcFrac
  1585.         retn
  1586.   UpdateView:
  1587.                 mov     cx, [Map_X]
  1588.                 mov     dx, [Map_Y]
  1589.                 mov     bx, [Count_Loop]
  1590.                 dec     bx
  1591.                 shr     bx, 8
  1592.                 shl     bx, 1
  1593.                 add     cx, [bx+AddCXTable]
  1594.                 add     dx, [bx+AddDXTable]
  1595.                 mov     [Map_X], cx
  1596.                 mov     [Map_Y], dx
  1597. ; Calculate New Points
  1598.                 mov     es, [MapA_Seg]
  1599.                 ror     cx, 4
  1600.                 ror     dx, 4
  1601.                 mov     bl, cl
  1602.                 mov     bh, dl
  1603.                 shr     cx, 0Ch
  1604.                 shr     dx, 0Ch
  1605.                 push    dx
  1606.                 inc     bl
  1607.                 xor     ax, ax
  1608.                 add     al, es:[bx]
  1609.         dec    bl
  1610.                 sub     al, es:[bx]
  1611.                 sbb     ah, ah
  1612.                 imul    cx
  1613.                 mov     dx, ax
  1614.                 xor     ax, ax
  1615.                 add     al, es:[bx]
  1616.                 shl     ax, 4
  1617.                 add     ax, dx
  1618.                 xchg    si, ax
  1619.                 inc     bh
  1620.                 inc     bl
  1621.                 xor     ax, ax
  1622.                 add     al, es:[bx]
  1623.         dec    bl
  1624.                 sub     al, es:[bx]
  1625.                 sbb     ah, ah
  1626.                 imul    cx
  1627.                 mov     dx, ax
  1628.                 xor     ax, ax
  1629.                 add     al, es:[bx]
  1630.                 shl     ax, 4
  1631.                 add     ax, dx
  1632.                 pop     dx
  1633.                 sub     ax, si
  1634.                 imul    dx
  1635.                 shl     si, 4
  1636.                 add     ax, si
  1637.                 add     ah, 1Ah
  1638.                 jnc     CalcNew1
  1639.                 mov     ax, 0FFFFh
  1640.   CalcNew1:
  1641.                 mov     [MountHeight], ax
  1642.                 mov     ah, 01h
  1643.                 int     16h
  1644.                 jz      CalcNew2
  1645.                 mov     [Count_Loop], 1
  1646.                 xor     ax, ax
  1647.                 int     16h
  1648.   CalcNew2:
  1649.         retn
  1650.   UpdateSky:
  1651.                 mov     si, offset MountHeight
  1652.                 mov     di, offset _TempR32A
  1653.                 xor     eax, eax
  1654.                 lodsw
  1655.         neg    ax
  1656.                 shr     ax, 3
  1657.                 add     ah, 40h
  1658.                 shl     eax, 4
  1659.                 shl     eax, 9
  1660.                 stosd
  1661.                 xor     eax, eax
  1662.                 lodsw
  1663.                 shl     eax, 9
  1664.                 stosd
  1665.                 xor     eax, eax
  1666.                 lodsw
  1667.                 shl     eax, 9
  1668.                 stosd
  1669.                 mov     gs, [Sky_Seg]
  1670.                 lea     ecx, [si-(offset MountHeight-offset Data_Seg)-6+63h]
  1671.                 mov     di, Table_C
  1672.   @UpdateSky1:
  1673.                 mov     si, offset _TempR32A
  1674.                 mov     eax, [si]
  1675.                 xor     edx, edx
  1676.                 div     ecx
  1677.                 mov     ebx, [si+4]
  1678.                 mov     esi, [si+8]
  1679.                 sub     esi, eax
  1680.                 add     ebx, eax
  1681.                 shr     eax, 7
  1682.                 mov     bp, si
  1683.                 shr     esi, 10h
  1684.                 and     si, 0FFh
  1685.                 shr     ebx, 8
  1686.                 xor     bl, bl
  1687.                 or      si, bx
  1688.                 mov     ebx, eax
  1689.                 shr     ebx, 10h
  1690.                 dec     bx
  1691.  
  1692.         rept    255
  1693.  
  1694.                 db      65h                             ; GS segment override prefix
  1695.                 movsb
  1696.                 add     bp, ax
  1697.                 adc     si, bx
  1698.  
  1699.         EndM
  1700.  
  1701.                 db      65h                             ; GS segment override prefix
  1702.                 movsb
  1703.                 dec     cx
  1704.                 jnz     @UpdateSky1
  1705.                 mov     eax, 50505050h
  1706.                 mov     cx, 40h
  1707.                 rep     stosd
  1708.                 mov     si, [MountHeight]
  1709.                 mov     bx, 04
  1710.   @UpdateSky2:
  1711.                 mov     ax, si
  1712.                 xor     dx, dx
  1713.                 div     bx
  1714.                 shr     ax, 7
  1715.                 cmp     al, 3Fh
  1716.                 jbe     @UpdateSky3
  1717.                 mov     al, 3Fh
  1718.   @UpdateSky3:
  1719.                 or      al, 80h
  1720.                 mov     ah, al
  1721.                 mov     dx, ax
  1722.                 shl     eax, 10h
  1723.                 xchg    ax, dx
  1724.                 mov     cx, 40h
  1725.                 rep     stosd
  1726.                 inc     bx
  1727.                 cmp     bx, 2Ch
  1728.                 jne     @UpdateSky2
  1729.         retn
  1730.   UpdateMap:
  1731.                 mov     fs, [MapA_Seg]
  1732.                 mov     gs, [MapB_Seg]
  1733.                 mov     eax, 7D007D00h
  1734.                 mov     di, Table_A
  1735.                 mov     cx, 40h
  1736.                 rep     stosd
  1737.                 mov     cx, 40h
  1738.         rep    stosd
  1739.                 xor     eax, eax
  1740.                 mov     di, Table_B
  1741.                 mov     cx, 40h
  1742.                 rep     stosd
  1743.                 mov     cx, 40h
  1744.                 rep     stosd
  1745.                 mov     [_TempR16A], 78h
  1746.   @UpdateMap1:
  1747.                 mov     si, [_TempR16A]
  1748.                 mov     si, [si+MapMakeTable]
  1749.                 shl     si, 4
  1750.                 mov     ax, [Map_Y]
  1751.                 and     ax, 0Fh
  1752.                 xor     al, 0Fh
  1753.                 add     si, ax
  1754.                 mov     ax, [MountHeight]
  1755.                 xor     dx, dx
  1756.         div    si
  1757.                 add     ax, 64h
  1758.                 mov     [_TempR16B], ax
  1759.                 lea     eax, [si]
  1760.                 shl     eax, 6
  1761.                 mov     [_TempReg], eax
  1762.                 cmp     [_TempR16A], 2
  1763.                 jne     @UpdateMap2
  1764.                 mov     [_TempR16B], 7D00h
  1765.                 mov     [_TempR16C], 0000h
  1766.                 jmp     @UpdateMap3
  1767.   @UpdateMap2:
  1768.                 xor     ax, ax
  1769.                 mov     dx, 1
  1770.         div    si
  1771.                 mov     [_TempR16C], ax
  1772.   @UpdateMap3:
  1773.                 xor     ecx, ecx
  1774.                 mov     cx, [Map_X]
  1775.                 shl     ecx, 0Ch
  1776.                 mov     eax, [_TempReg]
  1777.                 shl     eax, 7
  1778.                 sub     ecx, eax
  1779.                 mov     ax, [Map_Y]
  1780.                 shl     ax, 4
  1781.                 mov     ebx, ecx
  1782.                 shr     ebx, 10h
  1783.                 mov     bh, ah
  1784.                 mov     ax, si
  1785.                 shl     ax, 4
  1786.                 add     bh, ah
  1787.                 mov     si, 1FEh
  1788.                 mov     word ptr [_TempR32B], Table_C
  1789.                 shr     cx, 1
  1790.   @UpdateMap4:
  1791.                 shl     cx, 1
  1792.                 add     cx, word ptr [_TempReg]
  1793.                 adc     bl, byte ptr [_TempReg+2]
  1794.                 shr     cx, 1
  1795.                 mov     al, fs:[bx+1]
  1796.                 sub     al, fs:[bx]
  1797.                 sbb     ah, ah
  1798.         imul    cx
  1799.                 shrd    ax, dx ,7
  1800.                 add     ah, fs:[bx]
  1801.                 mul     [_TempR16C]
  1802.                 mov     di, [_TempR16B]
  1803.                 sub     di, dx
  1804.                 jns     @UpdateMap5
  1805.                 mov     di, 0FFFFh
  1806.   @UpdateMap5:
  1807.                 cmp     di, 0C8h
  1808.                 jl      @UpdateMap6
  1809.                 mov     di, 0C7h
  1810.   @UpdateMap6:
  1811.                 mov     al, gs:[bx+1]
  1812.                 sub     al, gs:[bx]
  1813.         imul    ch
  1814.                 shl     ax, 1
  1815.                 add     ah, gs:[bx]
  1816.                 mov     dx, ax
  1817.                 xchg    ax, [si+Table_B]
  1818.                 mov     bp, di
  1819.                 xchg    bp, [si+Table_A]
  1820.                 sub     bp, di
  1821.                 jns     @UpdateMap7
  1822.                 shl     di, 8
  1823.                 add     di, word ptr [_TempR32B]
  1824.                 push    ax
  1825.                 sub     ax, dx
  1826.         cwd
  1827.         idiv    bp
  1828.                 pop     dx
  1829.                 push    bx
  1830.                 lea     bx, [bp+1]
  1831.                 shl     bp, 1
  1832.                 shl     bx, 8
  1833.                 lea     bp, [ebp+ebp*2]
  1834.                 add     bp, offset @UpdateMap8+06h
  1835.                 call    bp
  1836.                 pop     bx
  1837.   @UpdateMap7:
  1838.                 inc     word ptr [_TempR32B]
  1839.                 dec     si
  1840.                 dec     si
  1841.                 jns     @UpdateMap4
  1842.                 sub     [_TempR16A], 2
  1843.                 jnz     @UpdateMap1
  1844.         retn
  1845.  
  1846.         Assume  ds:Code
  1847.  
  1848.   @TheEND:
  1849.                 M_KeyPressed
  1850.                 mov     ax, cs
  1851.                 mov     ds, ax
  1852.                 mov     es, ax
  1853.                 add     ax, 2000h
  1854.                 mov     fs, ax
  1855.                 M_WaitVRT_DX
  1856.                 mov     al, 13h
  1857.                 mov     ah, 00h
  1858.                 int     10h
  1859.                 mov     dx, offset Temp_PAL2
  1860.                 xor     bx, bx
  1861.                 mov     cx, 256
  1862.                 mov     al, 17h
  1863.                 mov     ah, 10h
  1864.                 int     10h
  1865.                 push    fs
  1866.                 pop     es
  1867.                 xor     di, di
  1868.                 mov     ax, di
  1869.                 mov     cx, 10000h/2
  1870.                 rep     stosw
  1871.                 mov     [TextSeg], es
  1872.                 mov     [CharColor], 0E03h
  1873.                 mov     di, 44
  1874.                 mov     si, offset Gfx4Text
  1875.                 call    GfxWrite
  1876.                 mov     [x], 8000h
  1877.                 mov     [y], 0800h
  1878.                 xor     bx, bx
  1879.                 mov     di, 1008h
  1880.   @Rotate6Map:
  1881.                 push    bx
  1882.                 push    di
  1883.                 call    RotateMap2
  1884.                 M_WaitVRT_DX
  1885.                 pop     di
  1886.                 pop     bx
  1887.                 sub     di, 18h
  1888.                 jnc     @Rotate6Map
  1889.                 mov     ax, cs
  1890.                 mov     es, ax
  1891.                 mov     ds, ax
  1892.                 M_FadeOUT Temp_PAL2, Temp_PAL1
  1893.                 jmp     @NoKeyPressed
  1894.   @KeyDownOut:
  1895.                 M_WaitVRT_DX
  1896.                 mov     al, 13h
  1897.                 mov     ah, 00h
  1898.                 int     10h
  1899.                 mov     cx, 20h
  1900.   @wv7:
  1901.                 M_WaitVRT_DX
  1902.                 loop    @wv7
  1903.                 xor     ax, ax
  1904.                 int     16h
  1905.   @NoKeyPressed:
  1906.                 M_WaitVRT_DX
  1907.                 mov     al, 03h
  1908.                 mov     ah, 00h
  1909.                 int     10h                             ; Switch Back to Char Mode
  1910.                 cli
  1911.                 mov     bx, 414Fh
  1912.                 M_WaitVRT_DX
  1913.                 M_WaitVRT
  1914.                 mov     ah, bh
  1915.                 mov     dx, 03D4h
  1916.                 mov     al, 09h
  1917.                 out     dx, ax
  1918.                 mov     cx, (offset EndPicCol-offset EndPic)
  1919.                 mov     dx, 0B800h
  1920.                 mov     es, dx
  1921.                 xor     di, di
  1922.                 mov     si, offset EndPic
  1923.   @PutPage:
  1924.                 mov     ah, [si+(offset EndPicCol-offset EndPic)]
  1925.                 lodsb
  1926.                 stosw
  1927.                 loop    @PutPage
  1928.                 sti
  1929.                 mov     dx, 0700h
  1930.                 mov     bh, 00h
  1931.                 mov     ah, 02h
  1932.                 int     10h
  1933.                 cli
  1934.                 mov     bx, 424Fh
  1935.   @IncCharHeight:
  1936.                 M_WaitVRT_DX
  1937.                 M_WaitVRT
  1938.                 mov     ah, bh
  1939.                 mov     dx, 03D4h
  1940.                 mov     al, 09h
  1941.                 out     dx, ax
  1942.                 inc     bh
  1943.                 cmp     bh, bl
  1944.                 jbe     @IncCharHeight
  1945.                 sti
  1946.                 mov     al, 03h
  1947.                 mov     ah, 25h
  1948.                 pop     dx
  1949.                 pop     ds
  1950.                 int     21h                             ; Enable Breakpoints
  1951.                 mov     al, 01h
  1952.                 mov     ah, 25h
  1953.                 pop     dx
  1954.                 pop     ds
  1955.                 int     21h                             ; Enable Single Step
  1956.                 mov     al, 00h
  1957.                 mov     ah, 4Ch
  1958.                 int     21h
  1959.  
  1960.   PutBop:
  1961.                 add     di, dx
  1962.                 xor     si, si
  1963.                 mov     cx, BopPts/4
  1964.   @PutLoop:
  1965.                 mov     ax, [si+BopAddTab]
  1966.                 mov     bx, [si+BopTab]
  1967.                 add     es:[bx+di], al
  1968.                 mov     ax, [si+BopAddTab+2]
  1969.                 mov     bx, [si+BopTab+2]
  1970.                 add     es:[bx+di], al
  1971.                 mov     ax, [si+BopAddTab+4]
  1972.                 mov     bx, [si+BopTab+4]
  1973.                 add     es:[bx+di], al
  1974.                 mov     ax, [si+BopAddTab+6]
  1975.                 mov     bx, [si+BopTab+6]
  1976.                 add     es:[bx+di], al
  1977.                 add     si, 8
  1978.                 loop    @PutLoop
  1979.   HideBop:
  1980.                 xchg    ds:[bp+BopQueue], di
  1981.                 cmp     di, -1
  1982.                 jae     @SkipHide
  1983.                 xor     si, si
  1984.                 mov     cx, BopPts/4
  1985.   @HideLoop:
  1986.                 mov     ax, [si+BopAddTab]
  1987.                 mov     bx, [si+BopTab]
  1988.                 sub     es:[bx+di], al
  1989.                 mov     ax, [si+BopAddTab+2]
  1990.                 mov     bx, [si+BopTab+2]
  1991.                 sub     es:[bx+di], al
  1992.                 mov     ax, [si+BopAddTab+4]
  1993.                 mov     bx, [si+BopTab+4]
  1994.                 sub     es:[bx+di], al
  1995.                 mov     ax, [si+BopAddTab+6]
  1996.                 mov     bx, [si+BopTab+6]
  1997.                 sub     es:[bx+di], al
  1998.                 add     si, 8
  1999.                 loop    @HideLoop
  2000.   @SkipHide:
  2001.                 add     bp, 2
  2002.                 cmp     bp, 2*MaxBops
  2003.                 sbb     bx, bx
  2004.                 and     bp, bx
  2005.                 ret
  2006.  
  2007.   CalcPixel:
  2008.                 mov     bh, 4
  2009.   @CalcPixel:
  2010.                 or      bp, bp
  2011.                 jns     @NoPixel
  2012.                 fld     [II]                     ; L := ...
  2013.                 fadd    [LL]
  2014.                 fsincos
  2015.                 fmul    [CosB]
  2016.                 fld     [Cos1]
  2017.                 fmul    st, st(1)
  2018.                 fld     [SinB]
  2019.                 fmul    [Sin1]
  2020.                 faddp   st(1), st
  2021.                 fimul   [Ker1]
  2022.                 fistp   [U]
  2023.                 fwait
  2024.                 mov     ax, [U]
  2025.                 fmul    [Sin1]
  2026.                 fld     [Cos1]
  2027.                 fmul    [SinB]
  2028.                 fsubrp  st(1), st
  2029.                 fimul   [Ker2]
  2030.                 fistp   [YY]
  2031.                 fmul    [CosB]
  2032.                 fimul   [Ker2]
  2033.                 fistp   [XX]
  2034.                 or      ax, ax
  2035.                 js      @CCPopAX
  2036.                 inc     ax
  2037.                 and     al, 0Fh
  2038.                 mov     cx, 320
  2039.                 fwait
  2040.                 add     cx, [XX]
  2041.                 mov     di, cx
  2042.                 and     di, 7
  2043.                 mov     dx, 03CEh
  2044.                 mov     ah, [di+MaskTable]
  2045.                 mov     di, ax
  2046.                 mov     al, 08h
  2047.                 out     dx, ax
  2048.                 mov     ax, di
  2049.                 mov     di, 240
  2050.                 sub     di, [YY]
  2051.                 shr     cx, 3
  2052.                 shl     di, 4
  2053.                 add     cx, di
  2054.                 shl     di, 2
  2055.                 add     di, cx
  2056.                 add     di, 6A00h
  2057.                 mov     ah, es:[di]
  2058.                 stosb
  2059.   @NoPixel:
  2060.                 fld     [II]
  2061.                 fadd    [IIAdd]
  2062.                 fstp    [II]
  2063.                 dec     bh
  2064.                 jnz     @CalcPixel
  2065.                 shl     bp, 1
  2066.                 retn
  2067.  
  2068.   PrintChar:            ; si = Char Number, di = Place.
  2069.                 cli
  2070.                 mov     si, ax
  2071.                 shl     si, 3
  2072.                 add     si, [CharP]
  2073.                 mov     cl, 08h
  2074.                 mov     dx, 03C4h
  2075.   @@MC1:
  2076.                 mov     es, [CharP+2]
  2077.                 db      26h                             ; ES segment override prefix
  2078.                 lodsb
  2079.                 mov     ch, al
  2080.                 mov     es, [TextSeg]
  2081.  
  2082.                 Rept 8
  2083.                         xor     bx, bx
  2084.                         shl     ch, 1
  2085.                         adc     bx, offset CharColor
  2086.                         mov     al, [bx]
  2087.                         stosb
  2088.                 EndM
  2089.  
  2090.                 add     di, 256-8       ;320-8
  2091.                 dec     cl
  2092.                 jz      @@MCOUT
  2093.                 jmp     @@MC1
  2094.   @@MCOUT:
  2095.                 sub     di, 8*256-8     ;8*320-8
  2096.                 sti
  2097.                 retn
  2098.  
  2099. M_ShlDXAX       Macro   Count
  2100.                         Rept Count
  2101.                                 shl     ax, 1
  2102.                                 rcl     dx, 1
  2103.                         EndM
  2104.                 EndM
  2105.  
  2106.   CalcFractal:
  2107.                 cli
  2108.                 mov     ax, [YMax]
  2109.                 mov     [y], ax
  2110.                 mov     [ScreenY], 0
  2111.   @RepeatY:
  2112.                 mov     ax, [XMin]
  2113.                 mov     [x], ax
  2114.                 mov     [ScreenX], 0
  2115.   @RepeatX:
  2116.                 xor     cx, cx
  2117.                 mov     ax, [y]
  2118.                 mov     [zi], ax
  2119.                 mov     di, ax
  2120.                 imul    di
  2121.                 M_ShlDXAX 3
  2122.                 mov     di, dx
  2123.                 mov     ax, [x]
  2124.                 mov     [zr], ax
  2125.                 mov     si, ax
  2126.                 imul    si
  2127.                 M_ShlDXAX 3
  2128.                 mov     si, dx
  2129.   @RepeatCount:
  2130.                 mov     ax, si
  2131.                 sub     ax, di
  2132.                 add     ax, [cr]
  2133.                 mov     si, ax
  2134.                 mov     ax, [zr]
  2135.                 imul    [zi]
  2136.                 M_ShlDXAX 4
  2137.                 add     dx, [ci]
  2138.                 mov     di, dx
  2139.                 mov     [zi], dx
  2140.                 mov     [zr], si
  2141.                 mov     ax, si
  2142.                 imul    si
  2143.                 M_ShlDXAX 3
  2144.                 mov     si, dx
  2145.                 mov     ax, di
  2146.                 imul    di
  2147.                 M_ShlDXAX 3
  2148.                 mov     di, dx
  2149.                 add     dx, si
  2150.                 jc      @CountOut
  2151.                 js      @CountOut
  2152.                 inc     cx
  2153.                 cmp     cx, [NMax]
  2154.                 jna     @RepeatCount
  2155.                 xor     ax, ax
  2156.                 jmp     @Plot
  2157.   @CountOut:
  2158.                 mov     ax, cx
  2159.                 mov     cl, 31
  2160.                 div     cl
  2161.                 mov     al, ah
  2162.                 inc     al
  2163.   @Plot:
  2164.                 and     al, 1Fh
  2165.                 add     al, 20h
  2166.                 mov     si, [ScreenX]
  2167.                 mov     di, [ScreenY]
  2168.                 mov     cx, di
  2169.                 mov     di, [di+offset Row256T]
  2170.                 add     di, si
  2171.                 stosb
  2172.                 inc     [ScreenX]
  2173.                 mov     ax, [x]
  2174.                 add     ax, [XStep]
  2175.                 mov     [x], ax
  2176.                 cmp     si, 288
  2177.                 jae     @OutM1
  2178.                 jmp     @RepeatX
  2179.   @OutM1:
  2180.                 mov     dx, 3DAh
  2181.                 in      al, dx
  2182.                 mov     dx, 3C0h
  2183.                 mov     al, 11h+32
  2184.                 out     dx, al
  2185.                 mov     al, cl
  2186.                 shr     al, 1
  2187.                 and     al, 0Fh
  2188.                 out     dx, al
  2189.                 add     [ScreenY], 2
  2190.                 mov     ax, [y]
  2191.                 add     ax, [YStep]
  2192.                 mov     [y], ax
  2193.                 cmp     cx, 256
  2194.                 jae     @OutM2
  2195.                 jmp     @RepeatY
  2196.   @OutM2:
  2197.                 sti
  2198.                 retn
  2199.  
  2200.  
  2201. M_Init_Rotate   Macro   Method
  2202.                 Local   @@ir1, @@ir2
  2203.                         mov     ax, 0A000h
  2204.                         mov     es, ax
  2205.                         and     bh, 7
  2206.                         mov     ax, [bx+SinT]
  2207.                         imul    di
  2208.                         sar     dx, 1
  2209.                         adc     dx, 0
  2210.                         mov     bp, dx
  2211.                         mov     ax, [bx+CosT]
  2212.                         imul    di
  2213.                         sar     dx, 1
  2214.                         adc     dx, 0
  2215.                         mov     si, dx
  2216.                         mov     ax, [bx+Sin2T]
  2217.                         imul    di
  2218.                         sar     dx, 1
  2219.                         adc     dx, 0
  2220.                         mov     [d2y], dx
  2221.                         imul    cx, dx, 100
  2222.                         mov     ax, [bx+Cos2T]
  2223.                         imul    di
  2224.                         sar     dx, 1
  2225.                         adc     dx, 0
  2226.                         mov     [d2x], dx
  2227.                         imul    dx, 100
  2228.                         imul    bx, si, 160
  2229.                         add     bx, dx
  2230.                         mov     ax, [x]
  2231.                         sub     ax, bx
  2232.                         imul    bx, bp, 160
  2233.                         add     bx, cx
  2234.                         mov     dx, [y]
  2235.                         sub     dx, bx
  2236.                         xor     di, di
  2237.   @@ir1:
  2238.                         mov     [i], ax
  2239.                         mov     [j], dx
  2240.                         mov     cx, 320/4
  2241.   @@ir2:
  2242.                         Rept 4
  2243.                                 add     ax, si
  2244.                                 add     dx, bp
  2245.                                 mov     bl, ah
  2246.                                 mov     bh, dh
  2247.                                 mov     bl, fs:[bx]
  2248.                                 mov     es:[di], bl
  2249.                                 inc     di
  2250.                         EndM
  2251.  
  2252.                         loop    @@ir2
  2253.  
  2254.                 If Method
  2255.                         inc     si
  2256.                         inc     bp
  2257.                 EndIf
  2258.  
  2259.                         mov     ax, [d2x]
  2260.                         mov     dx, [d2y]
  2261.                         add     ax, [i]
  2262.                         add     dx, [j]
  2263.                         cmp     di, 4*16000
  2264.                         jb      @@ir1
  2265.                         mov     ax, cs
  2266.                         mov     es, ax
  2267.                         retn
  2268.                 EndM
  2269.   RotateMap2:
  2270.                 M_Init_Rotate 0
  2271.  
  2272.   RotateMap:
  2273.                 M_Init_Rotate 1
  2274.  
  2275.   RotatePAL20:
  2276.                 cli
  2277.                 std
  2278.                 mov     si, offset Temp_PAL3+3*1Fh-2
  2279.                 mov     di, offset Temp_PAL3+3*20h-2
  2280.                 mov     ax, [di]
  2281.                 mov     bl, [di-1]
  2282.                 mov     cx, 47
  2283.                 rep     movsw
  2284.                 mov     [di+1], ax
  2285.                 mov     [di], bl
  2286.                 cld
  2287.                 mov     si, di
  2288.                 mov     cx, 3*20h
  2289.                 mov     dx, 03DAh
  2290.                 M_WaitVRT_DX
  2291.                 mov     dx, 03C8h
  2292.                 mov     al, 20h
  2293.                 out     dx, al
  2294.                 inc     dx
  2295.                 rep     outsb
  2296.                 sti
  2297.                 retn
  2298.  
  2299.   GfxWrite:
  2300.                 xor     ax, ax
  2301.   @WriteFPush:
  2302.                 push    di
  2303.   @WriteF:
  2304.                 lodsb
  2305.                 or      al, al
  2306.                 jz      @WriteFLN
  2307.                 cmp     al, 0FFh
  2308.                 je      @WriteFOut
  2309.                 push    si
  2310.                 call    PrintChar
  2311.                 pop     si
  2312.                 jmp     @WriteF
  2313.   @WriteFLN:
  2314.                 pop     di
  2315.                 add     di, 8*256       ;320
  2316.                 jmp     @WriteFPush
  2317.   @WriteFOut:
  2318.                 pop     di
  2319.                 mov     dx, cs
  2320.                 mov     es, dx
  2321.                 retn
  2322.  
  2323.                 Rept    199
  2324.                         mov     [bx+di], dh
  2325.                         add     dx, ax
  2326.                         inc     bh
  2327.                 EndM
  2328.   @UpdateMap8:
  2329.                 mov     [bx+di], dh
  2330.                 retn
  2331.  
  2332.  
  2333. EndPic          db      '  ╔══════════════════════════════════════════════════════════════════════════╗  '
  2334.                 db      '╔═╝                                                                          ╚═╗'
  2335.                 db      '║ ▄ ▄▄▄  ╔══╗ ║  ║ ═╦═    ╔══╗ ╔══    ╔═╦═╗ ╔══ ╔═╦═╗ ╔══╗ ╔══╗ ║ ║  ║   ▄ ▄▄▄ ║'
  2336.                 db      '║ ▄ ▄▄▄  ║  ║ ║  ║  ║     ║  ║ ╠═     ║ ║ ║ ╠═  ║ ║ ║ ║  ║ ╠═╦╝ ╚╦╝  ║   ▄ ▄▄▄ ║'
  2337.                 db      '║        ╚══╝ ╚══╝  ║     ╚══╝ ║      ║ ║ ║ ╚══ ║ ║ ║ ╚══╝ ║ ╚╗  ║   ■         ║'
  2338. ;               db      '║                                Released at Assembly ''94 in Finland, (C) 1994 ║'
  2339.                 db      '║                         Released at Assembly ''94 in Finland, (C) 1994 Σ, STP ║'
  2340.                 db      '╚══════════════════════════════════════════════════════════════════════════════╝'
  2341.                 db      '█████████▒▒▒▒▒▒▒▒░░░░░░░GIANT - the Ultimate 4KB-Intro!░░░░░░░░▒▒▒▒▒▒▒▒█████████'
  2342. EndPicCol       db      80 dup (1Fh), 80 dup (1Fh)
  2343.                 db      3 dup (1Fh), 11h, 3 dup (1Fh), 66 dup (1Ch), 1Fh, 11h, 5 dup (1Fh)
  2344.                 db      3 dup (1Fh), 11h, 3 dup (1Fh), 66 dup (1Eh), 1Fh, 11h, 5 dup (1Fh)
  2345.                 db      9 dup (1Fh), 62 dup (1Ah), 9 dup (1Fh)
  2346.                 db      80 dup (1Fh), 80 dup (1Fh), 24 dup (19h), 5 dup (9Eh),3 dup (15h), 4 dup (1Ah), 9 dup(1Dh)
  2347.                 db      1Fh, 17h, 17h, 14h, 5 dup(13h), 1Ch, 25 dup (19h)
  2348. Gfx1Text        db      '╔════════════════════════════╗', 0
  2349.                 db      '║Please wait while Computing!║', 0
  2350.                 db      '╚════════════════════════════╝', 0, -1
  2351. Gfx2Text        db      'Is that all?', 0, -1
  2352. Gfx3Text        db      'NO!', 0, -1
  2353. Gfx4Text        db      '╔═══════════════════╗', 0
  2354.                 db      '║ That''s all Folks! ║', 0
  2355.                 db      '╚═══════════════════╝', 0, -1
  2356. Text1String     db      ' Assembly 1994 *'
  2357.                 db      ' GIANT 4KB-Intro'
  2358. Text2String     db      'GIANT', 13, 10
  2359.                 db      'the Ultimate', 13, 10
  2360.                 db      '4KB-Intro$'
  2361.                 db      2       dup (00h)
  2362. SinTable label byte
  2363.                 db      64      dup (00h)
  2364. CosTable label byte
  2365.                 db      258     dup (00h)
  2366. Frames          dw      0000h
  2367. U               dw      0
  2368. CharGen         dw      0
  2369. SinB            dd      0
  2370. CosB            dd      0
  2371. II              dd      0
  2372. JJ              dd      0
  2373. IIAdd           dd      0
  2374. LL              dd      0.0e00
  2375. BB              dd      -1.0e00
  2376. Const1          dd      2e-03
  2377. Const2          dd      0.09e00
  2378. Const3          dd      1.255e00
  2379. Const4          dd      0.0025e00
  2380. Sin1            dd      0.84147098480791e00
  2381. Cos1            dd      0.54030230586814e00
  2382. CosBB           dd      1.8508157176809e00
  2383. Mult1           dd      9830.4
  2384. Ker1            dw      14
  2385. Ker2            dw      240
  2386. XX              dw      80h
  2387. YY              dw      40h
  2388. MaskTable       db      80h, 40h, 20h, 10h, 08h, 04h, 02h, 01h
  2389. BopQueue        dw      MaxBops dup(-1)
  2390. Angle           dw      -1 and 0FFC0h
  2391. Phase1          dw      2*1024-PhInc1
  2392. Phase2          dw      2*1024-PhInc2
  2393. BopADDLengths   db      5,  8,  9, 11, 12, 13, 13, 14, 14, 15, 15, 15
  2394.                 db      10 dup (01h)
  2395. BopAddTab label word
  2396.                 Rept 4
  2397.                         db                          1,1,1,1,1
  2398.                         db                    1,1,1,2,2,2,2,2
  2399.                         db                  1,1,2,2,2,3,3,3,3
  2400.                         db              1,1,2,2,3,3,3,3,3,3,3
  2401.                         db            1,1,2,2,3,3,3,3,4,4,4,4
  2402.                         db          1,1,2,2,3,3,3,4,4,4,4,4,4
  2403.                         db          1,2,2,3,3,3,4,4,4,5,5,5,5
  2404.                         db        1,2,2,3,3,3,4,4,4,5,5,6,6,6
  2405.                         db        1,2,2,3,3,4,4,5,5,5,6,6,6,6
  2406.                         db      1,2,2,3,3,4,4,4,5,5,6,6,7,7,7
  2407.                         db      1,2,2,3,3,4,4,5,5,6,6,7,7,7,7
  2408.                         db      1,2,2,3,3,4,4,5,5,6,6,7,7,7,7
  2409.                 EndM
  2410. LastBopAdd       db      4*144 dup (00h)
  2411. BopTab  label word
  2412. ;                db      10 dup (00h)           ; in reserve for correct alignment
  2413.         align 16
  2414. Last_Word:
  2415.  
  2416. Code    EndS
  2417.  
  2418. Data    Segment Byte Public Use16
  2419.  
  2420. Data_Seg        dw      0000h
  2421. MapA_Seg        dw      0000h
  2422. MapB_Seg        dw      0000h
  2423. Sky_Seg         dw      0000h
  2424. MapMakeTable    dw      41 dup (0000h), 10 dup (0001h), 09 dup (0003h)
  2425. LastMake_       dw      0003h, 0000h
  2426. AddCXTable      dw       32, -16, -8, 8
  2427. AddDXTable      dw      -32,  -8, 16, 8
  2428. MapCoord_       dw      0000h, 0004h, 0202h, 0FEFFh
  2429. VRAM_Seg        dw      0A000h
  2430. W_Divider       dw      0DB97h
  2431.  
  2432. Data    EndS
  2433.  
  2434.         End     Begin
  2435.