home *** CD-ROM | disk | FTP | other *** search
/ Rat's Nest 1 / ratsnest1.iso / incoming / pas_sors.arj / 4PM.ASM < prev    next >
Assembly Source File  |  1994-02-08  |  29KB  |  916 lines

  1. ;############################################################################
  2. ;
  3. ; FOUR PAST MIDNIGHT MULTI INTRO...
  4. ;
  5. ; Code, Design and Graphics: Chc from Reset-Tvc
  6. ; Muzak: who knows??
  7. ; Adlib FM code: JCH from Vibrants
  8. ;
  9. ; Sant Joan Despí, Barcelona, 29 de Gener de 1994
  10. ;
  11. ; Greets goes to: Gvyt,darkmind,De-Pha$$ed,dyonisos,FxSoft,King Graham,Slump
  12. ;                 Elfo,Skatur,Fiber,Spiral,Red Devil,Ked...and all the guys
  13. ;                 I forgot...
  14. ;
  15. ; Source code compiled with TASM 3.2 (I think if will work correctly with
  16. ; TASM 2.x ...)
  17. ;
  18. ; NOTES: this code waz done in only three days before a Maths examination,
  19. ;        it is not very nice, but it runs at full speed...
  20. ;        For ANY comment, sugestion, or something like this, yo can
  21. ;        contact me in Four Past Midnight BBS:
  22. ;
  23. ;               Handle: Chechu
  24. ;
  25. ;        Or writing to:
  26. ;
  27. ;               Jorge Cabezas Garcia/Chc
  28. ;               C/ Valencia 1
  29. ;               San Juan Despi
  30. ;               Barcelona
  31. ;               SPAIN
  32. ;
  33. ;############################################################################
  34.  
  35.         jumps
  36.  
  37. ;el segmento de pila...
  38.  
  39. pila     SEGMENT para stack 'STACK'
  40.      DB      64 DUP(0)
  41. pila     ENDS
  42.  
  43. ;el segmento de datos...
  44.  
  45. data   SEGMENT    para public 'DATA'
  46.  
  47.         include driver.inc                      ; driver include file
  48.         MusicOffset = $-data                    ; Offset for the music
  49.         include song.inc                        ; the music!
  50.         include plasma.inc                      ; gráfico del plasma
  51.         include tile.inc                        ; tile número 1...
  52.         include tile2.inc                       ; tile número 2...
  53.         include logo.inc
  54. SINUS LABEL BYTE
  55.         include seno.inc                        ; la tabla de seno...
  56.         include seno.inc
  57.         numstars dw 150
  58.         speedx   dw 0
  59.         speedy   dw 0
  60.         speedz   dw 0
  61.         distanciareal dw 200
  62.         include stars.inc
  63.         error    db 'Sorry...but this intro needs at least a 386 to run... $'
  64.  
  65.         ;mensaje final...
  66.         mensaje  db 'Four Past MidNight Intro .... CALL IT NOW! Phone Numba: +34-3-FINDIT!',10,13,10,13
  67.                  db '■ Code and graphics: Chc from Reset-Tvc',10,13
  68.                  db '■ Design: Chc and Tranx',10,13
  69.                  db '■ Adlib code: JCH from Vibrants',10,13
  70.                  db '■ Greets goes to: Tranx (cool sysop!),Dyonisos,Darkmind,Skatur,',10,13
  71.                  db '                  De-Phassed,FxSoft,King Graham,Slump,Ked,Spiral,',10,13
  72.                  db '                  Elfo,Fiber,Red Devil and all the others!!! ',10,13,'$'
  73.  
  74.         ;mensaje del scroll de texto...Tranx!
  75.         texto    db 'YAH, U GOT IT! AGAIN! NOW FROM FOUR PAST MIDNIGHT, AND HERE I AM TO TELL '
  76.                  db 'YOU TO CALL MY SUPER-MEGA-BOARD 4PM OR R U SCARED WITH THE FEDS? '
  77.                  db 'I WON',34,'T TELL U THE NUMBA SINCE I SUPPOSE YAR SO ELITE TO FIND IT '
  78.                  db 'YARSELF , IF NOT THEN FUCK U AND KEEP CALLING THE SAME BOARDS YAR '
  79.                  db 'GRANDPA USED TO CALL TO...ENJOY IT! LIVE IT! SPURTING 0-1 DAY WAREZ '
  80.                  db 'LIKE A CUMMING ELEPHANT COCK USING TWO USR DS.LOTS OF THANX TO CHC '
  81.                  db 'FOR THIS KEWL AND AWESOME LITE INTRO MADE IN SOME HOURS. '
  82.                  db 'OH I ALMOST FORGET...NO LAMERS, LEECHERS, FIDOLAMERS OR ANY OTHER '
  83.                  db 'KIND OF NON-WANTED-ANYWHERE PEOPLE ARE ALLOWED! CALL ONLY IF YOU '
  84.                  db 'HAVE SOMETHING IMPORTANT TO OFFER US AND DON',34,'T GIVE THE NUMBA TO '
  85.                  db 'LAME PEOPLE COS THEY MAKE THE BOARD BUSY THE WHOLE TIME...OK '
  86.                  db 'THAT',34,'S ALL JUST REMIND THIS: CALL TO 4PM, CALL TO 4PM, CALL TO 4PM '
  87.                  db '....AND.....UPLOAD....UPLOAD....UPLOAD....HEHEHE..... '
  88.                  db 'WHAT ARE YOU DOING STILL HERE?? U SHOULD BE GONE RITE NOW! '
  89.                  db '                       ',0
  90.  
  91.                  ;para el scroll de texto utilizo un doble buffer de intermedio,
  92.                  ;que me quita algo de memoria pero es MUY rápido...
  93.  
  94.         buffer   db 320*8*2 dup(0)
  95.                  db 320 dup(0)
  96.  
  97.                  ;fuente a utilizar en el scroll de texto
  98.  
  99.                  include font.inc
  100. data ends
  101.  
  102. ;y nuestro segmento de código...
  103.  
  104. code    segment byte public 'code'
  105.         assume cs:code,ds:data
  106.  
  107.         P386
  108.  
  109. IMR     db 0    ;máscara del PIC
  110. Escape  db 0    ;estado de la tecla escape
  111. cicle   dw 0    ;ciclo de la paleta actual
  112.  
  113. ;estos dos bytes sirven para la sincronización de algunos movimientos...
  114.  
  115. sincro  db 0
  116. sincro2 db 0
  117.  
  118. ;constantes de las estrellas
  119.  
  120. ;amplitud del campo estelar en X,Y y Z
  121.  
  122. MaxXpos     EQU 400
  123. MinXpos     EQU -400
  124. MaxYpos     EQU 400
  125. MinYpos     EQU -400
  126. MaxZpos     EQU 4095
  127. MinZpos     EQU 100
  128.  
  129. ;centro del campo estelar
  130.  
  131. CentroX     EQU 240
  132. CentroY     EQU 152
  133.  
  134. ;color inicial de las estrellas
  135.  
  136. Color       EQU 1
  137.  
  138.  
  139. ;******************************************************************************
  140. ; Este es el scroll de texto...
  141. ;******************************************************************************
  142.  
  143. ;aqui utilizo una tabla para buscar la letra correspondiente
  144.  
  145. letras  db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,!-',34,':014? ',0
  146. bufpos  dw 0                    ;posición del buffer visualizada actualmente
  147. textpos dw OFFSET texto         ;posición en el texto
  148. contpos dw 1                    ;contador de anchura de una letra...
  149. actlet  dw 0                    ;letra actual que se está dibujando...
  150.  
  151. scroll  proc
  152.  
  153.         mov ax,0a000h           ;segmento de video
  154.         mov es,ax
  155.  
  156.         dec byte ptr cs:[contpos]
  157.         jnz no_new_letter       ;mira si es necesaria una nueva letra
  158.  
  159.         inc word ptr cs:[textpos]
  160.  
  161.         mov bx,cs:[textpos]
  162.         mov al,[bx]             ;si se necesita una nueva letra búscala, excepto
  163.         test al,0ffh            ;si es un 0...que indica que es el final del
  164.         jnz no_restart          ;scroll...
  165.  
  166.         mov bx,OFFSET texto     ;restaura en ese caso la posición del scroll
  167.         mov cs:[textpos],bx
  168.         mov al,[bx]
  169.  
  170. no_restart:
  171.         xor bx,bx
  172.         mov di,OFFSET letras
  173. siu:    cmp al,cs:[di]          ;buscas la letra en la tabla para saber su
  174.         je acaba                ;posición real en la fuente...
  175.         inc di
  176.         inc bx
  177.         jmp siu
  178.  
  179. acaba:  shl bx,3                ;*8
  180.         add bx,OFFSET font
  181.         mov cs:[actlet],bx      ;en BX está la posición real de la letra en la
  182.                                 ;fuente
  183.         mov byte ptr cs:[contpos],8
  184.  
  185. no_new_letter:
  186.         mov bx,cs:[actlet]      ;ahora coge la posición de la letra
  187.         inc word ptr cs:[actlet]
  188.  
  189.         mov di,cs:[bufpos]      ;y ahora dibuja la linea vertical correspondiente
  190.         add di,OFFSET buffer    ;a esa posición en el buffer de video...
  191.         mov al,[bx]
  192.         mov [di],al
  193.         mov [di+320],al
  194.         mov al,[bx+320]
  195.         mov [di+640],al
  196.         mov [di+640+320],al
  197.         mov al,[bx+320*2]
  198.         mov [di+640*2],al
  199.         mov [di+640*2+320],al
  200.         mov al,[bx+320*3]
  201.         mov [di+640*3],al
  202.         mov [di+640*3+320],al
  203.         mov al,[bx+320*4]
  204.         mov [di+640*4],al
  205.         mov [di+640*4+320],al
  206.         mov al,[bx+320*5]
  207.         mov [di+640*5],al
  208.         mov [di+640*5+320],al
  209.  
  210.         inc word ptr cs:[bufpos]        ;incremento la posición del buffer
  211.         cmp word ptr cs:[bufpos],320    ;intermedio...teniendo en cuenta que
  212.         jne siu2                        ;es un buffer CIRCULAR...
  213.         mov word ptr cs:[bufpos],0
  214.  
  215. siu2:   mov si,OFFSET buffer            ;ahora pasa el buffer intermedio a la
  216.         mov di,32000-320*3              ;memoria de video...
  217.         add si,cs:[bufpos]
  218.         cld
  219.         mov cx,320
  220.         rep movsb                       ;una linea...
  221.         add si,320
  222.         mov cx,320
  223.         rep movsb                       ;siguiente linea...
  224.         add si,320
  225.         mov cx,320
  226.         rep movsb                       ;etc...
  227.         add si,320
  228.         mov cx,320
  229.         rep movsb
  230.         mov cx,320
  231.         add si,320
  232.         rep movsb
  233.         add si,320
  234.         mov cx,320
  235.         rep movsb
  236.  
  237.         ret
  238.  
  239. scroll  endp
  240.  
  241. ;******************************************************************************
  242. ; Ahora viene la parte de las estrellas 3D...
  243. ;******************************************************************************
  244.  
  245. ;el macro move realiza el movimiento cada coordenada de una estrella y
  246. ;la trunca si es necesario...
  247.  
  248. move        macro despl1,despl2,maximo,minimo
  249.             LOCAL no_mayor,no_menor
  250.             mov ax,[di+despl1]
  251.             add ax,[despl2]
  252.             cmp ax,maximo
  253.             jnge no_mayor
  254.             sub ax,maximo-minimo
  255. no_mayor:   cmp ax,minimo
  256.             jnl no_menor
  257.             add ax,maximo-minimo
  258. no_menor:   mov [di+despl1],ax
  259.             ENDM
  260.  
  261. ;el movimiento de la z es un caso muy especial, aunque ahora está un poco
  262. ;reducido respecto a la original rutina de estrellas que ordenaba por Z...
  263. ;aunque aquella era en Tweaked... 8)
  264.  
  265. move2       macro despl1,despl2,maximo,minimo
  266.             LOCAL no_mayor,no_menor,no_inicial,no_inicial2
  267.             mov ax,[di+despl1]
  268.             add ax,[despl2]
  269.             cmp ax,maximo
  270.             jnge no_mayor
  271.             sub ax,maximo-minimo
  272. no_mayor:   cmp ax,minimo
  273.             jnl no_menor
  274.             add ax,maximo-minimo
  275. no_menor:   mov [di+despl1],ax
  276.             ENDM
  277.  
  278. ;trunca las coordenadas reales de la pantalla en este caso...
  279.  
  280. trunca      macro centro
  281.             LOCAL no_trunca,no_trunca_2
  282.             cmp ax,centro+80-1
  283.             jle no_trunca
  284.             mov si,[di+6]
  285.             mov byte ptr es:[si],0
  286.             xor bx,bx
  287.             jmp Erase0
  288. no_trunca:
  289.             cmp ax,centro-80
  290.             jnle no_trunca_2
  291.             mov si,[di+6]
  292.             mov byte ptr es:[si],0
  293.             xor bx,bx
  294.             jmp Erase0
  295. no_trunca_2:
  296.             ENDM
  297.  
  298. ;trunca la coordenada Y....
  299.  
  300. trunca2     macro centro
  301.             LOCAL no_trunca,no_trunca_2
  302.             cmp ax,centro+48-1
  303.             jle no_trunca
  304.             xor bx,bx
  305.             mov si,[di+6]
  306.             mov byte ptr es:[si],0
  307.             jmp Erase0
  308. no_trunca:
  309.             cmp ax,centro-48
  310.             jnle no_trunca_2
  311.             xor bx,bx
  312.             mov si,[di+6]
  313.             mov byte ptr es:[si],0
  314.             jmp Erase0
  315. no_trunca_2:
  316.             ENDM
  317.  
  318. ;programa principal de las estrellas...
  319.  
  320. estrellas   proc
  321.  
  322.             ;segmento de video
  323.  
  324.             mov ax,0a000h
  325.             mov es,ax
  326.  
  327.             mov di,OFFSET stars
  328.             mov cx,[numstars]
  329.  
  330.             ;aquí se produce el desplazamiento tridimensional de las estrellas
  331.             ;en el campo definido en las constantes...
  332.  
  333. stars10:    Move 0,speedx,maxXpos,minXpos
  334.             Move 2,speedy,maxYpos,minYpos
  335.             Move2 4,speedz,maxZpos,minZpos
  336.             add di,8
  337.             loop stars10
  338.  
  339.             ;ahora, una vez desplazadas las estrellas, nos dispones a proyectarlas
  340.             ;en la pantalla...
  341.  
  342.             mov di,OFFSET stars
  343.             mov cx,[numstars]
  344. stars11:    push cx
  345.  
  346.             ;lo primero que hacemos para la transformación es dividir por la
  347.             ;Z...
  348.             mov cx,[di+4]            ;la coordenada z en cx
  349.             mov ax,[di]
  350.             movsx dx,ah              ;ESTA es la instruccion que me ha obligado
  351.                                      ;a usar código para 386...
  352.             shl ax,8
  353.             idiv cx                  ;en ax tenemos la X real
  354.             add ax,CentroX
  355.             Trunca CentroX
  356.             mov bx,ax                ;ahora la x está en bx
  357.             mov ax,[di+2]
  358.             movsx dx,ah
  359.             shl ax,8
  360.             idiv cx                  ;divide por la Z
  361.             add ax,CentroY           ;súmale el centro
  362.             Trunca2 CentroY          ;trunca por el clipping
  363.             xchg bx,ax               ;BX=Y  AX=X
  364.             shr cx,9                 ;ahora averigua el color...
  365.             mov ch,cl
  366.             add ch,Color
  367.             push ax
  368.             mov ax,320               ;cada fila -> 320 bytes...
  369.             mul bx
  370.             pop bx
  371.             add bx,ax                ;posición a donde poner la estrella
  372.             mov si,[di+6]
  373.             mov byte ptr es:[si],0   ;borra antes la estrella anterior
  374.             mov es:[bx],ch           ;pon la nueva estrella
  375. erase0:     mov [di+6],bx            ;guarda la estrella que se borrará en el
  376.             add di,8                 ;siguiente retrazo...
  377.             pop cx
  378.             loop stars11             ;y así todas las estrellas...
  379.             ret
  380.  
  381. estrellas   endp
  382.  
  383. ;**************************************************************************
  384. ; Pon un tile en la posición requerida...
  385. ;
  386. ; NOTA: ES exactamente lo que parece: o sea, una animación por COLORES...
  387. ;
  388. ;**************************************************************************
  389.  
  390. tileput proc
  391.  
  392.         mov     cx,8            ;8 lineas...
  393.         mov     dx,3c8h         ;puerto de direcciones del DAC para escritura
  394.         out     dx,al           ;color de inicio
  395.         inc     dx              ;ahora el puerto de datos
  396. next_row:
  397.         push    cx
  398.         mov     cx,8*3          ;número de colores a escribir, 8 cada vez...
  399. next_pixel:
  400.         mov     al,[si]
  401.         out     dx,al           ;escribe el dato...
  402.         inc     si              ;busca siguiente dato
  403.         loop    next_pixel
  404.         pop     cx
  405.         add     si,8*3          ;siguiente posición en el tile...
  406.         loop    next_row
  407.         ret
  408.  
  409. tileput endp
  410.  
  411. ;**************************************************************************
  412. ; Un Vsync de lo más normal...
  413. ;**************************************************************************
  414.  
  415. ;no merece comentarios...
  416.  
  417. Vsync   proc
  418.  
  419.         mov     dx,03dah
  420. esp1:   in      al,dx
  421.         test    al,8
  422.         jnz     esp1
  423. esp2:   in      al,dx
  424.         test    al,8
  425.         jz      esp2
  426.         ret
  427.  
  428. Vsync   endp
  429.  
  430. ;**************************************************************************
  431. ; Rellena el trozo deseado con el tile oportuno...
  432. ;**************************************************************************
  433.  
  434. ;dibuja una sola linea de tiles....
  435.  
  436. do      proc
  437.  
  438. shut1:  push cx
  439.         push di
  440.         push si
  441.         mov bx,si               ;inicio del ciclo
  442.         mov cx,dx
  443. shut2:  push cx
  444.         mov es:[di],bl          ;pon uno por uno todos los0
  445.         inc bl                  ;colores...
  446.         mov es:[di+1],bl
  447.         inc bl
  448.         mov es:[di+2],bl
  449.         inc bl
  450.         mov es:[di+3],bl
  451.         inc bl
  452.         mov es:[di+4],bl
  453.         inc bl
  454.         mov es:[di+5],bl
  455.         inc bl
  456.         mov es:[di+6],bl
  457.         inc bl
  458.         mov es:[di+7],bl
  459.         inc bl
  460.         add di,320              ;siguiente linea
  461.         pop cx
  462.         loop shut2
  463.         pop si
  464.         pop di
  465.         pop cx
  466.         add di,8                ;siguiente tile en la linea
  467.         dec cx
  468.         jnz shut1
  469.         ret
  470.  
  471. do      endp
  472.  
  473.  
  474. ;ahora vas poniendo un tile, a partir del color indicado en SI, en la posición
  475. ;requerida...
  476.  
  477. rellena proc
  478.  
  479.         ;es:di es el destino...
  480.         ;el ciclo comienza con si...
  481.  
  482.         mov ax,0a000h
  483.         mov es,ax               ;buffer de video
  484. shut0:  push cx
  485.         push di
  486.         push si
  487.         mov cx,20               ;20 tiles por linea
  488.         mov dx,8                ;8 lineas por tile
  489.         call do                 ;dibuja un tile
  490.         pop si
  491.         pop di
  492.         pop cx
  493.         add di,2560             ;siguiente linea0
  494.         dec cx                  ;ya queda una linea menos...
  495.         jnz shut0
  496.         ret
  497.  
  498. rellena endp
  499.  
  500. ;*****************************************************************************
  501. ; Esta es la interrupción del teclado...
  502. ;*****************************************************************************
  503.  
  504. int09   proc
  505.  
  506.         push    ax bx
  507.  
  508.         in al,60h       ; lee la tecla
  509.  
  510.         ;haz un strobe del teclado...
  511.  
  512.         mov bh,al
  513.         in al,61h
  514.         mov ah,al       ;el strobe consiste en poner a uno y después a zero
  515.         or al,80h       ;el bit de más peso del registro de control del
  516.         out 61h,al      ;controlador del teclado
  517.         xchg ah,al
  518.         out 61h,al
  519.  
  520.         ;comprueba si es un escape...
  521.  
  522.         dec     bh
  523.         jnz     skip    ;si no hay escape no hagas nada...
  524.  
  525.         mov     byte ptr cs:[Escape],1  ;si hay escape indícalo...
  526. skip:
  527.  
  528.         ;EOI
  529.  
  530.         mov     al,20h
  531.         out     20h,al
  532.  
  533.         pop     bx ax
  534.  
  535.         iret          ;vuelve a donde estaba...
  536.  
  537.         oldint09        dd      0
  538.  
  539. int09   endp
  540.  
  541. ;*****************************************************************************
  542. ; Esta es la interrupción 08 del timer 0...
  543. ;*****************************************************************************
  544.  
  545. int08   proc
  546.  
  547.         push    ax
  548.  
  549.  
  550.         mov     al,20h  ;la verdad es que es una interrupción bastante
  551.         out     20h,al  ;complicada... 8)
  552.  
  553.         pop     ax
  554.  
  555.         iret
  556.  
  557.         oldint08        dd      0
  558.  
  559. int08   endp
  560.  
  561. ;*****************************************************************************
  562. ; Esta es la llamada al driver de música...
  563. ;*****************************************************************************
  564.  
  565. MusicDriver     proc
  566.  
  567. MusicPatch      label
  568.         nop
  569.         call    dword ptr cs:[Player]   ;llama al driver de música...
  570.         ret
  571.  
  572. Player  DW      0,0
  573.  
  574. MusicDriver     endp
  575.  
  576. ;*****************************************************************************
  577. ; Código principal!
  578. ;*****************************************************************************
  579.  
  580. ;esta es la rutina principal del programa...
  581.  
  582. main    proc far
  583.  
  584.         mov ax,data
  585.         mov ds,ax                       ;el segmento de datos
  586.  
  587.  
  588.         ;esta es la rutina de detección del micro 386...
  589.  
  590.         pushf
  591.         xor ah,ah
  592.         push ax
  593.         popf
  594.         pushf
  595.         pop ax
  596.         and ah,0f0h
  597.         cmp ah,0f0h
  598.         je detectno386
  599.         popf
  600.         jmp si_386
  601. detectno386:
  602.  
  603.         ;no se ha detectado un 386...
  604.         popf
  605.         mov dx,OFFSET error             ;pon el mensaje de error
  606.         mov ah,9
  607.         int 21h
  608.         mov ah,04ch                     ;vuelve al DOS...
  609.         int 21h
  610. si_386:
  611.  
  612.         mov     ax, data                ;segmento del driver de música...
  613.         mov     cs:Player[2], ax
  614.  
  615.         push    ds
  616.  
  617.         push    cs
  618.         pop     ds
  619.  
  620.         mov     ah, 6                   ;inicializa el driver de música...
  621.         call    MusicDriver
  622.  
  623.         jnc     InitializedOk           ;se ha encontrado la tarjeta de sonido
  624.  
  625.         ;si no se inicializó bien la música pon un RET para que las próximas
  626.         ;llamadas al driver vuelvan sin hacer nada...
  627.  
  628.         mov     byte ptr cs:[MusicPatch], 0C3h
  629.  
  630. InitializedOk:
  631.         ;Inicializa la música...
  632.         mov     ah, 0                           ;función 0: inicializa música
  633.         mov     bx, data                        ;segmento de la música
  634.         mov     cx, MusicOffset                 ;offset de la música
  635.         call    MusicDriver
  636.  
  637.         mov     ah, 2
  638.         mov     bx, 0                           ;esto sirve para algo...
  639.         call    MusicDriver                     ;pero no sé para que...
  640.  
  641.         pop     ds
  642.  
  643. ;*****************************************************************************
  644. ; Pon la velocidad apropiada...
  645. ;*****************************************************************************
  646.  
  647.         cli
  648.  
  649.         ;Salva la anterior interrupción...
  650.  
  651.         xor     ax,ax
  652.         mov     es,ax
  653.         mov     di,8*4                  ;cambia los vectores de interrupción
  654.         mov     bx,es:[di]              ;de la IRQ 0 y la IRQ 1, salvándolos
  655.         mov     si,es:[di+2]            ;previamente en variables de apoyo...0
  656.         mov     word ptr cs:[oldint08],bx
  657.         mov     word ptr cs:[oldint08+2],si
  658.         mov     bx,es:[di+4]
  659.         mov     si,es:[di+6]
  660.         mov     word ptr cs:[oldint09],bx
  661.         mov     word ptr cs:[oldint09+2],si
  662.  
  663.         ;pon la nueva interrupción...
  664.  
  665.         mov     di,8*4
  666.         mov     word ptr es:[di],OFFSET int08   ;pon las nuevas rutinas de
  667.         mov     word ptr es:[di+2],SEG int08    ;interrupción en los
  668.         mov     word ptr es:[di+4],OFFSET int09 ;vectores...
  669.         mov     word ptr es:[di+6],SEG int09
  670.  
  671.         in      al,21h
  672.         mov     cs:[IMR],al                     ;deja sólo activadas las
  673.         or      al,011111111b                   ;lineas de la IRQ0 y la
  674.         and     al,011111100b                   ;IRQ 1....
  675.         out     21h,al
  676.  
  677.         sti
  678.  
  679.         ;pon las imagenes en pantalla...
  680.  
  681.  
  682.         mov     ax,013h                         ;pon el modo gráfico 320x200
  683.         int     10h                             ;x256 colores normal...
  684.  
  685.         mov     dx,3c8h
  686.         xor     al,al
  687.         out     dx,al
  688.         inc     dx
  689.         mov     cx,768                          ;borra los 768 colores del
  690. next:   out     dx,al                           ;DAC mientras escribimos en
  691.         loop    next                            ;la pantalla...
  692.  
  693.         mov     ax,0a000h                       ;segmento de video
  694.         mov     es,ax
  695.         mov     di,160
  696.         mov     si,OFFSET PLASMA+768            ;dibujo del plasma
  697.         mov     cx,48                           ;son 48 lineas...
  698. siguiente:
  699.         push    cx
  700.         mov     cx,160                          ;160 bytes por linea...
  701.         cld
  702.         rep     movsb                           ;coloca una linea
  703.         sub     si,160                          ;duplica la siguiente linea
  704.         mov     cx,160
  705.         add     di,160                          ;siguiente posición en el buffer
  706.         rep     movsb                           ;y coloca otra linea igual...
  707.         pop     cx
  708.         add     di,160                          ;siguiente posición en el buffer
  709.         loop    siguiente
  710.  
  711.         mov     di,320*41+195                   ;posición centrada del logo...
  712.         mov     si,OFFSET logo                  ;ahora pon el logo en pantalla
  713.         mov     cx,16                           ;son 16 lineas de logo
  714. ll1:    push    cx
  715.         push    di
  716.         mov     cx,90
  717. ll2:    mov     al,[si]
  718.         test    al,0ffh                         ;solo se escriben aquello bytes
  719.         jz      skip_logo                       ;que son diferentes de 0, o sea
  720.         mov     es:[di],al                      ;que no son de fondo...
  721. skip_logo:
  722.         inc     di
  723.         inc     si
  724.         loop    ll2                             ;siguiente pixel0
  725.         pop     di
  726.         pop     cx
  727.         add     di,320                          ;siguiente linea
  728.         loop    ll1
  729.  
  730.         ;pon los patrones para los tiles...
  731.  
  732.         mov     di,32000+320*4
  733.         mov     si,16
  734.         mov     cx,12                   ;pon el dibujo necesario para que el
  735.         call    rellena                 ;primer tile sea fácil de mover...
  736.  
  737.         xor     di,di
  738.         mov     si,256-64
  739.         mov     cx,12                   ;pon el dibujo necesario para que el
  740.         call    rellena                 ;segundo tile sea fácil de mover...
  741.  
  742.         mov     si,OFFSET TILE2
  743.         add     al,256-64               ;pon la paleta del segundo tile...
  744.         call    tileput
  745.  
  746.         mov     si,OFFSET TILE1
  747.         mov     al,16                   ;pon la paleta del primer tile...
  748.         call    tileput
  749.  
  750.         ;Bucle principal...
  751.  
  752.         mov     dx,3c8h                 ;coloca la paleta de colores en
  753.         xor     al,al                   ;los registros del DAC de video...
  754.         out     dx,al
  755.         inc     dx
  756.         mov     si,OFFSET PLASMA
  757.         mov     cx,768                  ;son 256 colores *3
  758. paleta: mov     al,[si]
  759.         inc     si
  760.         out     dx,al                   ;escríbelos...
  761.         loop    paleta
  762.  
  763. keywait:
  764.         ;espera el retrazo vertical...
  765.  
  766.         call    Vsync           ;espera el retrazo vertical...
  767.  
  768.  
  769.         ;movimiento del primer tile...
  770.  
  771.         mov     bl,cs:[sincro]
  772.         and     bx,0ffh
  773.         mov     al,[bx+OFFSET SINUS]
  774.         mov     cl,[bx+OFFSET SINUS+64]
  775.         and     ax,0111b
  776.         mov     bx,8*2*3
  777.         mul     bx
  778.         mov     si,OFFSET TILE2
  779.         add     si,ax
  780.         and     cx,0111b
  781.         mov     ax,3
  782.         mul     cx
  783.         add     si,ax
  784.         mov     al,256-64
  785.         call    tileput
  786.  
  787.         call    scroll                  ;scroll de texto...
  788.  
  789.         ;movimiento del segundo tile...
  790.  
  791.         mov     bl,cs:[sincro]
  792.         and     bx,07fh
  793.         mov     al,[bx+OFFSET SINUS]
  794.         and     ax,0111b
  795.         mov     bx,8*2*3
  796.         mul     bx
  797.         mov     si,OFFSET TILE1
  798.         add     si,ax
  799.         mov     al,16
  800.         call    tileput
  801.  
  802.         ;cáculo de las velocidades relativas de las estrellas...
  803.  
  804.         mov     bl,cs:[sincro2]
  805.         and     bx,0ffh
  806.         mov     al,[bx+OFFSET SINUS]
  807.         cbw
  808.         sar     ax,2
  809.         mov     [speedx],ax
  810.         mov     al,[bx+OFFSET SINUS+64]
  811.         cbw
  812.         sar     ax,2
  813.         mov     [speedy],ax
  814.         mov     al,[bx+OFFSET SINUS+128]
  815.         cbw
  816.         sar     ax,2
  817.         mov     [speedz],ax
  818.  
  819.  
  820.         inc     byte ptr cs:[sincro]
  821.         mov     al,cs:[sincro]
  822.         and     al,01h                  ;esto nos sirve para calcular la
  823.         jz      par                     ;frecuencia de llamada del ciclo de
  824.                                         ;paleta...
  825.  
  826.         ;ciclo de colores 1...
  827.  
  828.         cmp     word ptr cs:[cicle],108*3
  829.         jne     no_restaura
  830.         mov     word ptr cs:[cicle],0
  831. no_restaura:
  832.         mov     dx,3c8h
  833.         mov     al,84                   ;esta parte se encarga del ciclo de
  834.         out     dx,al                   ;colores del plasma...
  835.         inc     dx
  836.         mov     si,OFFSET PLASMA+84*3
  837.         add     si,cs:[cicle]
  838.         mov     cx,107*3
  839. otra_vez:
  840.         cmp     si,OFFSET PLASMA+192*3
  841.         jne     siga
  842.         mov     si,OFFSET PLASMA+84*3
  843. siga:   mov     al,[si]
  844.         inc     si
  845.         out     dx,al
  846.         loop    otra_vez
  847.  
  848.         add     word ptr cs:[cicle],3   ;mueve la paleta...
  849.  
  850. par:
  851.         mov     al,cs:[sincro]
  852.         and     al,0111b
  853.         jnz     sigue                   ;calcula la velocidad de los tiles...
  854.  
  855.         inc     byte ptr cs:[sincro2]   ;para la sincronización de los tiles...
  856.  
  857. sigue:
  858.         ;actualiza la música...
  859.  
  860.         mov     ah, 3
  861.         call    MusicDriver             ;llama a la rutina de música...
  862.  
  863.         call    estrellas               ;llama a la rutina de estrellas...
  864.  
  865.         ;mira si se ha pulsado escape...
  866.  
  867.         test    byte ptr cs:[Escape],0ffh
  868.         jz      keywait
  869.  
  870.         ;Restaura la interrupción anterior...
  871.  
  872.         cli                             ;fuera interrupciones...
  873.         xor     ax,ax
  874.         mov     es,ax
  875.         mov     di,8*4                  ;posición de la IRQ 0
  876.         mov     si,OFFSET oldint08
  877.         mov     ax,cs:[si]              ;lee el vector original...
  878.         mov     es:[di],ax
  879.         mov     ax,cs:[si+2]
  880.         mov     es:[di+2],ax            ;coloca el vector original...
  881.         mov     si,OFFSET oldint09
  882.         mov     ax,cs:[si]              ;ahora igual para la IRQ 1
  883.         mov     es:[di+4],ax
  884.         mov     ax,cs:[si+2]
  885.         mov     es:[di+6],ax
  886.  
  887.         mov     al,cs:[IMR]             ;restaura la máscara del PIC i8259
  888.         out     21h,al
  889.  
  890.         sti                             ;permite interrupciones otra vez...
  891.  
  892.         ;apaga la música...
  893.  
  894.         mov     ah, 2
  895.         mov     bx, 0
  896.         call    MusicDriver             ;apaga la música...
  897.  
  898.         ;vuelve al DOS...
  899.  
  900.         mov     ax,03h
  901.         int     10h                     ;vuelve al modo de texto...
  902.  
  903.         mov     ah,9                    ;escribe el mensaje final con los
  904.         mov     dx,OFFSET mensaje       ;greetings y los creditos...
  905.         int     21h
  906.  
  907.         mov     ax,04c00h               ;vuelve al DOS
  908.         int     21h
  909. main    endp
  910.  
  911.  
  912. code ends
  913. end main
  914.  
  915.  
  916.