home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DEMOS / BLA2SRC.ZIP / BI.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-02-14  |  26.0 KB  |  1,050 lines

  1. ; ------------------- BI.ASM ---------------------
  2. ; BlasterSound BBS intro. Hope you like it, Mikel!
  3. ; ------------------------------------------------
  4. ; Written by Iguana in 1994.
  5. ; Design and text writer by Jare.
  6. ; Snowfaller and Adlib player by JCAB.
  7. ; Tune by COI.
  8. ; Font by unknown (Hi unknown! Howya doing?).
  9. ; ------------------------------------------------
  10. ;    The original idea comes from one of the first
  11. ; ASM routines that JCAB and I coded, long ago, on
  12. ; the ZX Spectrum. We liked the way it looked, and
  13. ; as it seems that this year we will not have snow
  14. ; in our city, we brought the concept back. :-)
  15. ;    I had never thought that a screen had so many
  16. ; pixels. Just wait until it fills completely!
  17. ; ------------------------------------------------
  18.  
  19. NFLAKES = 2000
  20. SCRW    = 80
  21. SIZEX   = 640
  22. SIZEY   = 480
  23. SIZESCR = SCRW*SIZEY
  24. TEXTY   = 400
  25.  
  26. TCCLEAR   = 0FFFEh
  27. TCRESTART = 0FFFFh
  28.  
  29. TFLAKE STRUC
  30.     addr  DW ?
  31.     mask  DB ?
  32.     yvel  DB ?
  33.     erase DB ?
  34. ENDS
  35.  
  36. SetBorder MACRO r,g,b
  37.         PUSH    DX AX
  38.         MOV     DX,3C8h
  39.         XOR     AL,AL
  40.         OUT     DX,AL
  41.         INC     DX
  42.         MOV     AL,r
  43.         OUT     DX,AL
  44.         MOV     AL,g
  45.         OUT     DX,AL
  46.         MOV     AL,b
  47.         OUT     DX,AL
  48.         POP     AX DX
  49. ENDM
  50.  
  51.  
  52.  
  53. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  54. ; ▒    Here comes the code.                                             ▒
  55. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  56.  
  57.         MODEL TINY
  58.         LOCALS @@
  59.         CODESEG
  60.         ORG 100h
  61.         JUMPS
  62. Start:
  63.         JMP RealStart                   ; Filler for JCAB's compressor.
  64. FillStart:
  65.  
  66.         ORG 100h+102
  67.  
  68. ;        DB 98+(OFFSET Start-OFFSET FillStart) DUP (0)
  69.                                         ; It takes 98 bytes; Wow!
  70.  
  71. RealStart:
  72.         MOV     AX,CS
  73.         MOV     ES,AX
  74.         MOV     DX,AX
  75.         CMP     AX,7000h
  76.         JNC     SHORT @@novga
  77.         ADD     AX,1000h
  78.         MOV     SS,AX
  79.         MOV     SP,0FFFEh
  80.         XOR     BX,BX
  81.         MOV     AX,01A00h
  82.         INT     10h
  83.         CMP     BL,7
  84.         JC      SHORT @@novga
  85.         CMP     BL,0Dh
  86.         JC      SHORT VGAYes
  87.     @@novga:
  88.         MOV     DX,OFFSET VgaMsg
  89. MessageExit:
  90.         MOV     AH,9
  91.         INT     21h
  92.         MOV     AX,4C00h
  93.         INT     21h
  94.  
  95. VGAYes:
  96.         CLD
  97.         CALL    SetupVideoMode
  98.         MOV     DI,OFFSET ZeroStart
  99.         MOV     CX,ZeroLength
  100.         XOR     AX,AX
  101.         REP STOSB
  102.  
  103.         MOV     DX,SS
  104.         MOV     ES,DX
  105.         XOR     DI,DI
  106.         MOV     CX,7F00h
  107.         REP STOSW
  108.         MOV     DX,CS
  109.         MOV     ES,DX
  110.  
  111.         MOV     DI,OFFSET ScrOffs
  112.         MOV     CX,SIZEY
  113.     @@sl1:
  114.          STOSW
  115.          ADD    AX,SCRW
  116.          LOOP   SHORT @@sl1
  117.  
  118.         ;SetBorder 63,0,63
  119.         MOV     BL,FontNChars
  120.         MOV     DI,OFFSET FontOffs
  121.         MOV     SI,OFFSET FontTable
  122.         MOV     AX,OFFSET FontData
  123.     @@fl1:
  124.          STOSW
  125.          XOR    CX,CX
  126.          MOV    CL,[SI]
  127.          INC    SI
  128.      @@fl2:
  129.           ADD    AX,12
  130.           LOOP   @@fl2
  131.          DEC    BL
  132.          JNZ    SHORT @@fl1
  133.  
  134.          MOV    ES,[VGASeg]
  135.          XOR    DI,DI
  136.          MOV    CX,SIZESCR/2
  137.          XOR    AX,AX
  138.          REP STOSW
  139.  
  140.          DEC    AX
  141.          MOV    CX,SCRW*6/2
  142.     @@evlp:
  143.           MOV   WORD PTR SS:[DI],AX
  144.           STOSW
  145.           LOOP  SHORT @@evlp
  146.  
  147.         CALL    WriteBlaster
  148.  
  149.         CALL    MPU_Reset
  150.         CALL    ADL_Reset
  151.         CALL    ADL_StartSong
  152.         CALL    InitTimer
  153.  
  154. MainLoop:
  155.         MOV     AX,1234h
  156.     @@timlp:
  157.          CMP    AX,[TimerCounter]
  158.          JZ     SHORT @@timlp
  159.         MOV     AX,[TimerCounter]
  160.         MOV     WORD PTR CS:[@@timlp-2],AX
  161.  
  162.         ;SetBorder 0,0,63
  163.         CALL    DoFlakes
  164.  
  165.         ;SetBorder 0,63,0
  166.         CALL    DoWriter
  167.         CALL    DoWriter
  168.         CALL    DoWriter
  169.         ;SetBorder 63,0,0
  170.         XOR     AX,AX
  171.         MOV     ES,AX
  172.         MOV     AX,ES:[41Ah]            ; Tran's way to kbhit().
  173.         CMP     AX,ES:[41Ch]            ; Sure it's better than INT 16h.
  174.         JZ      MainLoop
  175.  
  176.         XOR     AX,AX
  177.         INT     16h
  178.  
  179.     @@bye:
  180.         CALL    DoneTimer
  181.         CALL    RestoreSystemTime
  182.         CALL    ADL_Reset
  183.         CALL    MPU_Reset
  184.         MOV     AX,3
  185.         INT     10h
  186.         MOV     DX,OFFSET ByeMsg
  187.         JMP     MessageExit
  188.  
  189. ; =======================================
  190.  
  191. SetupVideoMode:
  192.         MOV     AX,11h          ; VGA 640x480x16
  193.         INT     10h
  194.  
  195.         CLI
  196.         MOV     DX,3DAh         ; Now use a linear palette, DACs 0-15.
  197.         IN      AL,DX
  198.         MOV     DX,3C0h         ; Mode control register,
  199.         MOV     AL,10h
  200.         OUT     DX,AL
  201.         INC     DX
  202.         IN      AL,DX           ; Read it.
  203.         DEC     DX
  204.         MOV     AH,AL
  205.         MOV     DX,3DAh
  206.         IN      AL,DX
  207.         MOV     DX,3C0h
  208.         MOV     AL,10h
  209.         OUT     DX,AL
  210.         MOV     AL,AH           ; Force get bits p4&p5 from reg #14.
  211.         OR      AL,80h
  212.         OUT     DX,AL
  213.  
  214.         MOV     AL,14h
  215.         OUT     DX,AL
  216.         XOR     AL,AL
  217.         OUT     DX,AL           ; Force DAC index bits p4-p7 == 0.
  218.  
  219.         MOV     CX,16
  220.         XOR     AL,AL
  221.     @@pl1:
  222.          OUT    DX,AL           ; Output index.
  223.          OUT    DX,AL           ; Output value. Value == index.
  224.          INC    AL
  225.          LOOP   SHORT @@pl1
  226.  
  227.         MOV     AL,34h          ; Redo it, activating the VGA along.
  228.         OUT     DX,AL
  229.         XOR     AL,AL
  230.         OUT     DX,AL           ; Force DAC index bits p4-p7 == 0.
  231.  
  232.         MOV     CX,16*3         ; Time to output the palette.
  233.         MOV     DX,3C8h
  234.         XOR     AL,AL
  235.         OUT     DX,AL
  236.         INC     DX
  237.         MOV     SI,OFFSET Palette
  238.      @@pl2:
  239.          LODSB
  240.          OUT    DX,AL
  241.          LOOP   SHORT @@pl2
  242.         STI
  243.         RET
  244.  
  245. ; =======================================
  246. ; Returns random AX.
  247.  
  248. GetRandomNumber:
  249.         MOV     AX,[RandSeed]
  250.         MOV     BX,[RandSeed2]
  251.         MOV     BP,[RandSeed3]
  252.         ADD     AX,0a137h
  253.         ADD     BX,63f7h
  254.         ADD     BP,784Ah
  255.         ROL     AX,2
  256.         MOV     [RandSeed],AX
  257.         ADD     BX,AX
  258.         ROR     BX,1
  259.         MOV     [RandSeed2],BX
  260.         SUB     BP,BX
  261.         XOR     AX,BP
  262.         MOV     [RandSeed3],BP
  263.         ADD     AX,BX
  264.         RET
  265.  
  266. ; =======================================
  267. ; Returns in AX a number between 1 and 3.
  268.  
  269. GetRandomNumber3:
  270.         CALL    GetRandomNumber
  271.         OR      AX,AX
  272.         JZ      SHORT GetRandomNumber3
  273.    @@rl1:
  274.         TEST    AL,3
  275.         JNZ     SHORT @@ret
  276.         SHR     AX,2
  277.         JZ      SHORT GetRandomNumber3
  278.         JMP     SHORT @@rl1
  279.    @@ret:
  280.         AND     AX,3
  281.         RET
  282.  
  283. ; =======================================
  284. ; Return a number in the range 0-639
  285.  
  286. GetRandomNumber640:
  287.         CALL    GetRandomNumber
  288.         AND     AX,1023
  289.         CMP     AX,SIZEX
  290.         JNC     SHORT GetRandomNumber640
  291.         RET
  292.  
  293. ; =======================================
  294. ; Rotate an addr(DI) and mask(AH) by a one bit(AL=-1,0,1)
  295.  
  296. RotMask:
  297.         AND     AL,AL
  298.         JS      SHORT RotMaskLeft
  299.         JNZ     SHORT RotMaskRight
  300.         RET
  301.  
  302. RotMaskRight:
  303.         ROR     AH,1
  304.         ADC     DI,0
  305.         RET
  306.  
  307. RotMaskLeft:
  308.         ROL     AH,1
  309.         SBB     DI,0
  310.         RET 
  311.  
  312. ; =======================================
  313.  
  314. DoFlakes:
  315.         MOV     ES,[VGASeg]
  316.         MOV     SI,OFFSET Flakes
  317.         MOV     [nnew],0
  318.         MOV     AX,[MaxFlakes]
  319.         ADD     AX,1
  320.         CMP     AX,NFLAKES
  321.         JC      SHORT @@fc1
  322.          MOV    AX,NFLAKES
  323.    @@fc1:
  324.         MOV     [MaxFlakes],AX
  325.         MOV     [FlakeCounter],AX
  326.  
  327.         MOV     DX,3CEh
  328.         MOV     AL,4
  329.         OUT     DX,AL
  330.         INC     DX
  331.         MOV     AL,3                    ; Read from plane 3
  332.         OUT     DX,AL
  333.         DEC     DX
  334.  
  335.         MOV     AL,5
  336.         OUT     DX,AL
  337.         INC     DX
  338.         IN      AL,DX
  339.         AND     AL,0FCh                 ; Write mode 0
  340.         OUT     DX,AL
  341.         DEC     DX
  342.         MOV     AL,8                    ; Bitmask
  343.         OUT     DX,AL
  344.         INC     DX
  345.         MOV     AL,0FFh
  346.         OUT     DX,AL
  347.  
  348.         MOV     DX,3C4h
  349.         MOV     AL,2
  350.         OUT     DX,AL
  351.         INC     DX
  352.         MOV     AL,08h                  ; Write to plane 3.
  353.         OUT     DX,AL
  354.  
  355.   @@loop:
  356.         MOV     AL,yvel[SI]
  357.         OR      AL,AL
  358.         JNZ     SHORT @@doflake
  359.          CMP    [nnew],10
  360.          JNC    @@next
  361.          CALL   GetRandomNumber640
  362.          MOV    CL,AL
  363.          AND    CL,7
  364.          MOV    BL,80h
  365.          SHR    BL,CL
  366.          MOV    mask[SI],BL
  367.          MOV    CL,3
  368.          SHR    AX,CL
  369.          MOV    addr[SI],AX
  370.          CALL   GetRandomNumber
  371.          AND    AX,3
  372.          INC    AL
  373.          ADD    AL,AL
  374.          MOV    yvel[SI],AL
  375.          XOR    AX,AX
  376.          MOV    erase[SI],AL
  377.          INC    [nnew]
  378.  
  379.    @@doflake:
  380.         MOV     AL,erase[SI]
  381.         OR      AL,AL
  382.         JZ      SHORT @@noer
  383.          MOV    DI,addr[SI]
  384.          MOV    AH,mask[SI]
  385.          NOT    AH
  386.          AND    ES:[DI],AH
  387.          AND    SS:[DI],AH
  388.      @@noer:
  389.         XOR     BH,BH
  390.         MOV     erase[SI],BH
  391.         MOV     BL,yvel[SI]
  392.         MOV     AX,ScrOffs[BX]
  393.         ADD     AX,addr[SI]
  394.         MOV     addr[SI],AX
  395.         CALL    GetRandomNumber3
  396.         SUB     AL,2
  397.         MOV     DI,addr[SI]
  398.         MOV     AH,mask[SI]
  399.         CALL    RotMask
  400.  
  401.         TEST    AH,SS:[DI]
  402.         JZ      SHORT @@nostop
  403.  
  404.         MOV     DI,addr[SI]
  405.         MOV     AH,mask[SI]
  406.         TEST    AH,SS:[DI]
  407.         JZ      SHORT @@nostop
  408.         ADD     DI,SCRW
  409.         TEST    AH,SS:[DI]
  410.         JZ      SHORT @@nostop
  411.     @@stoplp1:
  412.          SUB    DI,SCRW
  413.          JC     SHORT @@ynook
  414.          TEST   AH,SS:[DI]
  415.          JNZ    SHORT @@stoplp1
  416.  
  417.          CALL   RotMaskLeft
  418.          TEST   AH,SS:[DI]
  419.          JNZ    SHORT @@donelt
  420.           TEST  AH,SS:[DI+SCRW]
  421.           JZ    SHORT @@nostop
  422.     @@donelt:
  423.          CALL   RotMaskRight
  424.          CALL   RotMaskRight
  425.          TEST   AH,SS:[DI]
  426.          JNZ    SHORT @@donert
  427.           TEST  AH,SS:[DI+SCRW]
  428.           JZ    SHORT @@nostop
  429.     @@donert:
  430.         CALL    RotMaskLeft
  431.         MOV     yvel[SI],0
  432.  
  433.     @@nostop:
  434.         OR      ES:[DI],AH
  435.         OR      SS:[DI],AH
  436.         MOV     addr[SI],DI
  437.         MOV     mask[SI],AH
  438.         MOV     erase[SI],AH
  439.  
  440.    @@next:
  441.         ADD     SI,SIZE TFLAKE
  442.         DEC     [FlakeCounter]
  443.         JNZ     @@loop
  444.  
  445.         RET
  446.  
  447.     @@ynook:
  448.          MOV    yvel[SI],0
  449.          JMP    SHORT @@next
  450.  
  451. ; =======================================
  452. ; Warning: spaghetti code follows.
  453. ; Sometimes you have to do things like
  454. ; this one, just to enjoy yourself.
  455.  
  456. DoWriter:
  457.         MOV     AX,[TextDelay]
  458.         OR      AX,AX
  459.         JZ      SHORT @@wc1
  460.          DEC    [TextDelay]
  461.          RET
  462.     @@wc1:
  463.         MOV     ES,[VGASeg]
  464.         MOV     DX,3C4h
  465.         MOV     AL,2
  466.         OUT     DX,AL
  467.         INC     DX
  468.         MOV     AL,07h                  ; Write to planes 0-2.
  469.         OUT     DX,AL
  470.         MOV     DX,3CEh
  471.         MOV     AL,5
  472.         OUT     DX,AL
  473.         INC     DX
  474.         IN      AL,DX
  475.         AND     AL,0FCh                 ; Write mode 0
  476.         OUT     DX,AL
  477.  
  478.         MOV     SI,[TextPos]
  479.         OR      SI,SI
  480.         JNZ     @@drawl
  481.    @@inittext:
  482.          MOV    SI,OFFSET IntroText
  483.          JMP    SHORT @@initline
  484.    @@looptext:
  485.          MOV    SI,OFFSET LoopText
  486.    @@initline:
  487.          LODSW
  488.          CMP    AX,TCRESTART
  489.          JZ     SHORT @@looptext
  490.          CMP    AX,TCCLEAR
  491.          JNZ    SHORT @@ic2
  492.           MOV   DX,3CEh
  493.           MOV   AL,8                    ; Bitmask
  494.           OUT   DX,AL
  495.           INC   DX
  496.           MOV   AL,0FFh
  497.           OUT   DX,AL
  498.           MOV   DI,165*SCRW
  499.           MOV   CX,SCRW*(350-165)/2
  500.           XOR   AX,AX
  501.           REP STOSW
  502.           JMP   SHORT @@initline
  503.      @@ic2:
  504.          MOV    BX,AX
  505.          SHR    BX,3
  506.          MOV    CL,AL
  507.          MOV    AL,80h
  508.          AND    CL,7
  509.          JZ     SHORT @@ic1
  510.           SHR   AL,CL
  511.      @@ic1:
  512.          MOV    [TextBitmask],AL
  513.          LODSW
  514.          ADD    AX,AX
  515.          MOV    DI,AX
  516.          MOV    AX,ScrOffs[DI]
  517.          ADD    BX,AX
  518.          MOV    [TextAddr],BX
  519.     @@newchar:
  520.          LODSB
  521.          MOV    [TextPos],SI
  522.          OR     AL,AL
  523.          JZ     SHORT @@initline
  524.          CMP    AL,' '
  525.          JZ     SHORT @@nc1
  526.          JNC    SHORT @@nc2
  527.           XOR   AH,AH
  528.           MOV   DX,60
  529.           MUL   DX
  530.           MOV   [TextDelay],AX
  531.           RET
  532.      @@nc1:
  533.           MOV   CX,15
  534.        @@nl1:
  535.            CALL @@advpos
  536.            LOOP @@nl1
  537.           JMP   SHORT @@newchar
  538.      @@nc2:
  539.          SUB    AL,'A'
  540.          XOR    BX,BX
  541.          MOV    BL,AL
  542.          MOV    AL,FontTable[BX]
  543.          MOV    [TextWidth],AL
  544.          ADD    BX,BX
  545.          MOV    AX,FontOffs[BX]
  546.          MOV    [TextCharData],AX
  547.    @@drawl:
  548.         MOV     AL,[TextWidth]
  549.         OR      AL,AL
  550.         JNZ     SHORT @@dc1
  551.          CALL   @@advpos
  552.          CALL   @@advpos
  553.          JMP    @@newchar
  554.     @@dc1:
  555.         DEC     [TextWidth]
  556.         MOV     DX,3CEh
  557.         MOV     AL,5
  558.         CLI
  559.         OUT     DX,AL
  560.         INC     DX
  561.         IN      AL,DX
  562.         AND     AL,0FCh
  563.         OR      AL,2                    ; Write Mode 2
  564.         OUT     DX,AL
  565.         DEC     DX
  566.         MOV     AL,8                    ; Bitmask
  567.         OUT     DX,AL
  568.         INC     DX
  569.         MOV     AL,[TextBitmask]
  570.         OUT     DX,AL
  571.         STI
  572.         MOV     SI,[TextCharData]
  573.         MOV     DI,[TextAddr]
  574.         MOV     CX,12
  575.       @@dl1:
  576.          LODSB
  577.          MOV    AH,AL
  578.          SHR    AL,4
  579.          AND    AL,7
  580.          JZ     SHORT @@dc2
  581.           MOV   BL,ES:[DI]      ; Load latches.
  582.           MOV   ES:[DI],AL
  583.      @@dc2:
  584.          ADD    DI,SCRW
  585.          MOV    AL,AH
  586.          AND    AL,7
  587.          JZ     SHORT @@dc3
  588.           MOV   BL,ES:[DI]      ; Load latches.
  589.           MOV   ES:[DI],AL
  590.      @@dc3:
  591.          ADD    DI,SCRW
  592.          LOOP   SHORT @@dl1
  593.         MOV     [TextCharData],SI
  594.  
  595.    @@advpos:
  596.         ROR     [TextBitmask],1
  597.         ADC     [TextAddr],0
  598.         RET
  599.  
  600. ; =======================================
  601. ; Writes the big BlasterSound logo at the
  602. ; bottom. Upper squares are softened.
  603.  
  604. WriteBlaster:
  605.         MOV     ES,[VGASeg]
  606.         MOV     DX,3C4h
  607.         MOV     AL,2
  608.         OUT     DX,AL
  609.         INC     DX
  610.         MOV     AL,0Fh                  ; Write to planes 0-2.
  611.         OUT     DX,AL
  612.         MOV     DX,3CEh
  613.         MOV     AL,5
  614.         OUT     DX,AL
  615.         INC     DX
  616.         IN      AL,DX
  617.         AND     AL,0FCh                 ; Write mode 2
  618.         OR      AL,2
  619.         OUT     DX,AL
  620.         MOV     DI,SCRW*400+7
  621.         MOV     AH,0C0h
  622.         MOV     SI,OFFSET BlasterMsg
  623.    @@loop:
  624.          LODSB
  625.          SUB    AL,'A'
  626.          JC     SHORT @@ret
  627.          XOR    BX,BX
  628.          MOV    BL,AL
  629.          MOV    CH,FontTable[BX]
  630.          ADD    BL,BL
  631.          MOV    BX,FontOffs[BX]
  632.       @@cl1:
  633.           MOV   DX,3CEh
  634.           MOV   AL,8                    ; Bitmask
  635.           OUT   DX,AL
  636.           INC   DX
  637.           MOV   AL,AH
  638.           OUT   DX,AL
  639.           MOV   CL,12
  640.       @@cl2:
  641.            MOV  AL,[BX]
  642.            INC  BX
  643.            MOV  DL,AL
  644.            SHR  AL,4
  645.            AND  AL,7
  646.            JZ   SHORT @@dc2
  647.             OR  AL,8
  648.             MOV DH,ES:[DI]      ; Load latches.
  649.             MOV ES:[DI],AL
  650.             MOV ES:[DI+SCRW],AL
  651.             OR  SS:[DI],AH
  652.             OR  SS:[DI+SCRW],AH
  653.        @@dc2:
  654.            ADD  DI,SCRW*2
  655.            MOV  AL,DL
  656.            AND  AL,7
  657.            JZ   SHORT @@dc3
  658.             OR  AL,8
  659.             MOV DH,ES:[DI]      ; Load latches.
  660.             MOV ES:[DI],AL
  661.             MOV ES:[DI+SCRW],AL
  662.             OR  SS:[DI],AH
  663.             OR  SS:[DI+SCRW],AH
  664.        @@dc3:
  665.            ADD  DI,SCRW*2
  666.            DEC  CL
  667.            JNZ  SHORT @@cl2
  668.           SUB   DI,2*12*2*SCRW
  669.           ROR   AH,1
  670.           ROR   AH,1
  671.           ADC   DI,0
  672.           DEC   CH
  673.           JNZ   SHORT @@cl1
  674.           JMP   SHORT @@loop
  675.     @@ret:
  676.  
  677.         ; Smooth corners.
  678.  
  679.         MOV     DX,3CEh
  680.         MOV     AL,5
  681.         OUT     DX,AL
  682.         INC     DX
  683.         IN      AL,DX
  684.         AND     AL,0FCh                 ; Write mode 0
  685.         OUT     DX,AL
  686.  
  687.         MOV     DI,OFFSET SCRW*400+7
  688.         MOV     CL,24
  689.     @@sl1:
  690.         PUSH    DI
  691.         MOV     AH,80h
  692.         MOV     SI,(640-7*8)/2
  693.     @@sl2:
  694.          TEST   AH,SS:[DI]
  695.          JZ     SHORT @@sc1
  696.          TEST   AH,SS:[DI-SCRW]
  697.          JNZ    SHORT @@sc1
  698.          CALL   RotMaskLeft
  699.          TEST   AH,SS:[DI]
  700.          PUSHF
  701.          CALL   RotMaskRight
  702.          POPF
  703.          JNZ    SHORT @@sc1
  704.           DEC   DX
  705.           MOV   AL,8                    ; Bitmask
  706.           OUT   DX,AL
  707.           INC   DX
  708.           MOV   AL,AH
  709.           OUT   DX,AL
  710.           NOT   AL
  711.           AND   SS:[DI],AL
  712.           AND   ES:[DI],AL
  713.     @@sc1:
  714.          CALL   RotMaskRight
  715.          TEST   AH,SS:[DI]
  716.          JZ     SHORT @@sc2
  717.          TEST   AH,SS:[DI-SCRW]
  718.          JNZ    SHORT @@sc2
  719.          CALL   RotMaskRight
  720.          TEST   AH,SS:[DI]
  721.          PUSHF
  722.          CALL   RotMaskLeft
  723.          POPF
  724.          JNZ    SHORT @@sc2
  725.           DEC   DX
  726.           MOV   AL,8                    ; Bitmask
  727.           OUT   DX,AL
  728.           INC   DX
  729.           MOV   AL,AH
  730.           OUT   DX,AL
  731.           NOT   AL
  732.           AND   SS:[DI],AL
  733.           AND   ES:[DI],AL
  734.     @@sc2:
  735.     @@next:
  736.          CALL   RotMaskRight
  737.          DEC    SI
  738.          JNZ    SHORT @@sl2
  739.         POP     DI
  740.         ADD     DI,2*SCRW
  741.         DEC     CL
  742.         JNZ     SHORT @@sl1
  743.        RET
  744.  
  745. ; =======================================
  746. ; Timer handler routine.
  747.  
  748. TimerHandler:
  749.         CLI
  750.         PUSH    AX
  751.         MOV     AL,20h
  752.         OUT     20h,AL
  753.         INC     CS:[TimerCounter]
  754.         CALL    ADL_DoSong
  755.         POP     AX
  756.         IRET
  757.  
  758. ; =======================================
  759. ; Timer (un)initialization.
  760.  
  761. InitTimer:
  762.         MOV     AX,3508h
  763.         INT     21h
  764.         MOV     [OldTimerHandlerOffs],BX
  765.         MOV     [OldTimerHandlerSeg],ES
  766.  
  767.         MOV     DX,OFFSET TimerHandler
  768.         MOV     AX,CS
  769.         MOV     DS,AX
  770.         MOV     AX,2508h
  771.         INT     21h
  772.  
  773.         MOV     BX,23863  ;19886                ; 1193180/60
  774.         MOV     AL,54
  775.         OUT     43h,AL
  776.         MOV     AL,BL
  777.         OUT     40h,AL
  778.         MOV     AL,BH
  779.         OUT     40h,AL
  780.         RET
  781.  
  782. DoneTimer:
  783.         MOV     DX,[OldTimerHandlerOffs]
  784.         MOV     DS,[OldTimerHandlerSeg]
  785.         MOV     AX,2508h
  786.         INT     21h
  787.         MOV     AX,CS
  788.         MOV     DS,AX
  789.  
  790.         MOV     AL,54
  791.         OUT     43h,AL
  792.         XOR     AL,AL
  793.         OUT     40h,AL
  794.         OUT     40h,AL
  795.         RET
  796.  
  797. ; =======================================
  798. ; Restore system time from CMOS registers.
  799. ; Just to be nice.
  800.  
  801. RestoreSystemTime:
  802.        XOR     AL,AL
  803.        OUT     70h,AL
  804.        IN      AL,71h
  805.        MOV     DH,AL
  806.        AND     DH,15
  807.        SHR     AL,4
  808.        MOV     DL,10
  809.        MUL     DL
  810.        ADD     DH,AL
  811.  
  812.        MOV     AL,2
  813.        OUT     70h,AL
  814.        IN      AL,71h
  815.        MOV     CL,AL
  816.        AND     CL,15
  817.        SHR     AL,4
  818.        MOV     DL,10
  819.        MUL     DL
  820.        ADD     CL,AL
  821.  
  822.        MOV     AL,4
  823.        OUT     70h,AL
  824.        IN      AL,71h
  825.        MOV     CH,AL
  826.        AND     CH,15
  827.        SHR     AL,4
  828.        MOV     DL,10
  829.        MUL     DL
  830.        ADD     CH,AL
  831.  
  832.        XOR     DL,DL
  833.        MOV     AH,2Dh
  834.        INT     21h
  835.  
  836.        MOV     AL,7
  837.        OUT     70h,AL
  838.        IN      AL,71h
  839.        MOV     DL,AL
  840.        AND     DL,15
  841.        SHR     AL,4
  842.        MOV     CH,10
  843.        MUL     CH
  844.        ADD     DL,AL
  845.  
  846.        MOV     AL,8
  847.        OUT     70h,AL
  848.        IN      AL,71h
  849.        MOV     DH,AL
  850.        AND     DH,15
  851.        SHR     AL,4
  852.        MOV     CH,10
  853.        MUL     CH
  854.        ADD     DH,AL
  855.  
  856.        MOV     AL,4
  857.        OUT     70h,AL
  858.        IN      AL,71h
  859.        MOV     CL,AL
  860.        AND     CL,15
  861.        SHR     AL,4
  862.        MOV     CH,10
  863.        MUL     CH
  864.        ADD     CL,AL
  865.  
  866.        XOR     CH,CH
  867.        ADD     CX,1900
  868.        MOV     AH,2Bh
  869.        INT     21h
  870.        RET
  871.  
  872. ; =======================================
  873.  
  874. PUBLIC CmfBeg
  875. CmfBeg:
  876. INCLUDE SONGOPT.INC
  877. PUBLIC AdlBeg
  878. AdlBeg:
  879. INCLUDE ADLIB.INC
  880. PUBLIC AdlEnd
  881. AdlEnd:
  882. INCLUDE MPU.INC
  883. PUBLIC MpuEnd
  884. MpuEnd:
  885.  
  886. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  887. ; ▒    Here comes the data.                                             ▒
  888. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  889.  
  890. ; ----------- Non-VGA message ----------------
  891. VgaMsg DB 'This intro requires 196Kb free and a VGA card.', 10, 13
  892.  
  893.        ; ----------- Exit message -------------------
  894. ;ByeMsg DB 'Call BlasterSound BBS! +34-58-293-583', 10, 13
  895. ;       DB 'Intro by Iguana: coded by JCAB & Jare, tune by COI.$'
  896.  
  897. ByeMsg DB 'For hearing this intro''s music you must use an OPL2 (AdLib) or ',10,13
  898.        DB 'General Midi (MPU) device. Every sound card supports one of them.',10,10,13
  899.        DB 'Greetings from Iguana to all our friends all over the world.',10,10,13
  900.        DB '────────────────────────────────────────────────────────────────────',10,13
  901.        DB '                THE FINEST DEMO ORIENTED BBS IN SPAIN',10,13
  902.        DB '════════════════════════════════════════════════════════════════════',10,13
  903.        DB '                BLASTERSOUND BBS        +34-58-293583',10,13
  904.        DB '════════════════════════════════════════════════════════════════════',10,13
  905.        DB '   Sound Blaster Connection 14:4500/200 & 201 Hub Granada (Spain).',10,13
  906.        DB '      Creativity Demo Net 94:620/200 & 201 Hub Granada (Spain).',10,13
  907.        DB '              SoundNet España 34:34/0 Coordinator/Host.',10,13
  908.        DB '                          Fidonet 2:345/805',10,13
  909.        DB '                      IGUANA  World HeadQuarters',10,13
  910.        DB '                    VangeliSTeam Distribution Site',10,13
  911.        DB '                        DUST Distribution Site',10,13
  912.        DB '                 Authorized Product Support Node for',10,13
  913.        DB '               Advanced Gravis Computer Technology Ltd.',10,13
  914.        DB '────────────────────────────────────────────────────────────────────',10,13
  915.        DB '             Baudrate: 19k2 ZyXEL/ 24 Open/ +1 Gb On-line',10,13
  916.        DB '════════════════════════════════════════════════════════════════════',10,13,'$'
  917.  
  918. ; ------------ DAC Palette -------------------
  919. Palette LABEL BYTE
  920. DB  0, 0, 0, 12,32,11, 20,37,20, 28,44,28, 36,51,36, 46,56,44, 52,59,52, 60,60,60
  921. DB 63,63,63, 12,12,40, 20,20,44, 28,28,52, 36,36,56, 44,44,56, 52,52,60, 60,60,60
  922.  
  923. ; ------------ Font data ---------------------
  924.  
  925. PUBLIC FontBeg
  926. FontBeg:
  927. INCLUDE Font.Inc
  928. PUBLIC FontEnd
  929. FontEnd:
  930.  
  931. FontNChars EQU $ - OFFSET FontTable
  932.  
  933. ; ------------
  934. RandSeed     DW 348Bh
  935. RandSeed2    DW 7F34h
  936. RandSeed3    DW 32bfh
  937.  
  938. ; ------------
  939. VGASeg       DW 0A000h
  940.  
  941. ; Intro text ----------------
  942. ; Haha! It's even worse than my handwriting!
  943.  
  944. _0 = 'Z'+1
  945. _1 = 'Z'+2
  946. _2 = 'Z'+3
  947. _3 = 'Z'+4
  948. _4 = 'Z'+5
  949. _5 = 'Z'+6
  950. _6 = 'Z'+7
  951. _7 = 'Z'+8
  952. _8 = 'Z'+9
  953. _9 = 'Z'+10
  954.  
  955. Separator EQU DB 'ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg',0
  956.  
  957. IntroText LABEL BYTE
  958.         DW 25, 115
  959.         DB 3,'BLASTERSOUND',_9+1,'  '
  960.         DB _9+4,_3,_4,_9+5,' ',_5,_8,_9+3,_2,_9,_3,_9+3,_5,_8,_3,0
  961.         DW 0, 95
  962.         Separator
  963.         DW 0, 135
  964.         Separator
  965.         DW 0, 0
  966.         Separator
  967.         DW 0, 350
  968.         Separator
  969.         DW 11, 34
  970.         DB 'THE FINEST DEMO ORIENTED BBS',0
  971.         DW 230, 60
  972.         DB 'IN SPAIN'
  973.         DB 3,0
  974. LoopText LABEL BYTE
  975.         DW 30, 165
  976.         DB 'IGUANA WORLD HEADQUARTERS',0
  977.         DW 50, 205
  978.         DB 'VANGELISTEAM DISTRO SITE',0
  979.         DW 80, 245
  980.         DB 'DUST DISTRIBUTION SITE',0
  981.         DW 44, 285
  982.         DB 'PRODUCT SUPPORT NODE FOR',0
  983.         DW 90, 315
  984.         DB 'ADVANCED GRAVIS LTDk',10,0
  985.         DW TCCLEAR
  986.         DW 0, 165
  987.         DB 'SOUNDNET   ',_3,_4,_9+6,_3,_4,_9+2,_0,0
  988.         DW 0, 215
  989.         DB 'SBCNET       ',_1,_4,_9+6,_4,_5,_0,_0,_9+2,_2,_0,_0,0
  990.         DW 0, 265
  991.         DB 'CDNET        ',_9,_4,_9+6,_6,_2,_0,_9+2,_2,_0,_0,0
  992.         DW 0, 315
  993.         DB 'FIDONET       ',_2,_9+6,_3,_4,_5,_9+2,_8,_0,_5,10,0
  994.         DW TCCLEAR
  995.         DW 200, 165
  996.         DB _1,_9,_2,_0,_0,' BAUD',0
  997.         DW 170, 205
  998.         DB 'OPEN ',_2,_4,' HOURS',0
  999.         DW 192, 245
  1000.         DB _1,' GB ON LINE',0
  1001.         DW 203,285
  1002.         DB 'ggggggggggggggggggggggggggggggggggggg',0
  1003.         DW 198,300
  1004.         DB 'ggggCALL NOWgggg',0
  1005.         DW 203,315
  1006.         DB 'ggggggggggggggggggggggggggggggggggggg',0
  1007.  
  1008.         DW 0,0
  1009.         DB 10,0
  1010.         DW TCCLEAR
  1011.         DW TCRESTART
  1012.  
  1013. BlasterMsg DB 'BLASTERSOUND',0
  1014.  
  1015. PUBLIC DataEnd
  1016. DataEnd:
  1017.  
  1018. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1019. ; ▒    Here comes the BSS. All initialized to zero at startup           ▒
  1020. ; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1021.  
  1022. ZeroStart LABEL BYTE
  1023.  
  1024. TextBitmask  DB ?
  1025. TextAddr     DW ?
  1026. TextPos      DW ?
  1027. TextDelay    DW ?
  1028. TextCharData DW ?
  1029. TextWidth    DB ?
  1030.  
  1031. FontOffs DW FontNChars DUP (?)
  1032.  
  1033. FlakeCounter DW ?
  1034. MaxFlakes    DW ?
  1035. nnew         DW ?
  1036. Flakes   DB (SIZE TFLAKE)*NFLAKES DUP (?)
  1037.  
  1038. TimerCounter        DW ?
  1039. OldTimerHandlerOffs DW ?
  1040. OldTimerHandlerSeg  DW ?
  1041.  
  1042. ZeroLength EQU $-OFFSET ZeroStart
  1043.  
  1044. ScrOffs DW SIZEY DUP (?)
  1045.  
  1046. END Start
  1047.  
  1048. ; --------------- End of BI.ASM ------------------
  1049.  
  1050.