RSS
Mostrando entradas con la etiqueta demoscene. Mostrar todas las entradas
Mostrando entradas con la etiqueta demoscene. Mostrar todas las entradas

💾 Galería Vía Florida, "La galería de la computación"

Galería Vía Florida, San Martín 1051

Si uno entrecierra los ojos y se deja llevar por la nostalgia —esa traicionera que te hace creer que todo tiempo pasado fue mejor, aunque tuviéramos que configurar los IRQ a mano—, esto no es una foto; es un daguerrotipo de nuestra inocencia digital.

Fijate vos la iluminación, esa luz ámbar, medio tanguera, medio de interrogatorio policial. Esa era la Galería Vía Florida. En los 90, eso no era un pasillo; era el Silicon Valley de la Peatonal San Martín, pero con olor a encierro y humedad del río.

🛑 Game Line: El Primer peaje del vicio

Apenas cruzabas la línea de entrada, ni bien te tragaba la galería, te encontrabas con un peaje. Ahí estaba Game Line, en el local 44, el primero que te clavaba la vista. No hacía falta caminar, el cartel te llegaba a vos.

Este no era un local de computación, era una emboscada. Era el manija de la Peatonal San Martín. Ese que te cebaba, te mostraba el futuro y te dejaba con la saliva goteando. Ellos no te vendían un Super Nintendo; te vendían la droga dura del ocio digital, con un tono de voz que te decía: 'Yo te doy la primera dosis, pibe, y después vení a rogarme por el cartucho'.

Su folleto, ese que tenés ahí con el Sonic mirándote con cara de tramposo, era el anzuelo: "NO COMPRE" "CONSULTE". Una obra maestra del cinismo. ¿Qué vas a consultar? Vas a entrar a ver la caja del Panasonic 3DO. Te dejaban más shockeado que un módem sin filtro de línea. Te afanaban la voluntad, el efectivo y la decisión de seguir caminando antes de que te dieras cuenta de si era jueves o sábado.

✂️ DMA: El confesionario del Shareware

Si lograbas salir vivo de la trampa de Game Line, venía el purgatorio. A la izquierda, ahí nomás, en el local 41 tenías el local de DMA Informática. Empapelado de listas impresas en matriz de punto, como si fueran los decretos de un rey loco. Ahí te vendían shareware. Pero ojo, que la relación con DMA era de un amor tierno, casi familiar, de esos que te hacen la vida imposible, sobre todo en Navidad.

Me acuerdo cuando decoraban la galería con esas lucecitas musicales, una tortura china a pilas. Estaban colgadas a una altura que invitaban al delito, y con Kato pasábamos levantando los brazos y activando las musiquitas de todas las guirnaldas al mismo tiempo. Era una sinfonía del infierno, un "Jingle Bells" polifónico que te taladraba el cerebelo. Los chicos de DMA salían y las apagaban una por una, con paciencia de monje tibetano. Hasta que un día, la paciencia se quebró. Y uno de ellos tuvo su día de furia: salió del local transformado, desencajado, igualito a Jack Nicholson en El Resplandor. Pero como esto es Rosario y el presupuesto no daba para un hacha, salió con una tijera. Y ahí nomás, harto de las melodías, empezó a cortar los cables de las luces a diestra y siniestra. Un mártir del silencio.

💥 TodoComputación: El deporte de riesgo silencioso

Si te animabas a seguir caminando por esas baldosas —que tenían más kilómetros de trapo de piso que la pista del aeropuerto de Fisherton—, allá en el centro de la galería asomaba TodoComputación. Ahí la cosa se ponía seria... y peligrosa. Porque con Kato teníamos una especie de ritual vandálico-afectivo con ellos. Los tipos, inocentes, armaban en la vidriera una torre inmensa de cajas de diskettes, una obra de ingeniería sobre el vidrio.

¿Y qué hacíamos nosotros? Pasábamos y, con disimulo, empujábamos el vidrio. ¡Plaf! El efecto dominó era instantáneo, la torre se venía abajo del lado de adentro y nosotros seguíamos caminando silbando bajito. Y si cerraban al mediodía y dejaban los escritorios de PC afuera, volvíamos y se los amontonábamos todos contra la puerta, haciendo una barricada. Era nuestra forma de decirles "los queremos", pero en un idioma muy particular.

😈 ONLINE: El último nivel, la Gloria.

Y allá en el fondo..., a la izquierda, en el local 35 estaba la perdición: ONLINE Software: El Último Nivel. El antro donde estaban los jueguitos. Vos caminabas ese pasillo como quien firma su propia condena a horas de joystick y pizza fría. Ya habías pasado por Game Line, DMA y TodoComputación. y vos no te ibas a ir de ahí sin el último jueguito que te hacía vibrar la retina y que prometía la felicidad total por unos miserables megabytes.

Y te digo más, para que veas que el destino es una cosa seria y caprichosa: la galería era tan perfecta para la computación, tan metida en el personaje, que la simulación se desbordaba a la realidad. ¡Si hasta los porteros parecían renderizados! Tenías a uno, el más petiso, que era un clon del Mario Bros, le faltaba cabecear ladrillos nomás. Y el otro... ¡Qué personaje! Un tipo con un porte, un aire a galán de kermesse venido a menos... era el mismísimo Leisure Suit Larry en carne y hueso. No me digan que no era una señal. Estábamos viviendo dentro de una aventura gráfica y nosotros preocupados por el autoexec.bat.

Mario y Larry en la galería.

Hoy ves esas fotos y te agarra una cosa acá, en el pecho... una angustia existencial. Porque esos locales, con sus vidrieras llenas de promesas de 8 y 16 bits, sus empleados al borde del ataque de nervios y sus porteros de videojuego, eran nuestros templos. Y ahora... ahora todo eso cabe en la uña del dedo chico de un pibe que no sabe lo que es esperar a que conecte el módem o que cargue un juego de Spectrum.

Qué barbaridad. Tanta tecnología, tanto futuro que nos prometieron en esos pasillos, y al final, miranos... acá estamos, suspirando por unas fotos pixeladas y dándonos cuenta de que la vida, pasa más rápido que un microprocesador obsoleto.


Facu LU6FPJ

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

Virus "PHX" segunda parte.

Hoy vamos a desempolvar una crónica fascinante, Es una historia que lo tiene todo: ingenio, traición, un plan de venganza y una lección aprendida de la peor manera.

Imaginen la escena: son los años 90. Los juegos de computadora se mueven en diskettes y la piratería es la norma.

El Ingenio: La "Intro" Imborrable

En Rosario, un programador muy talentoso, que se movía bajo el alias de "Armagedón", tenía un negocio de venta de shareware y juegos. Para publicitarse, desarrolló un programita brillante: una "Intro" (una pantalla de presentación) que se "pegaba" al inicio de cada juego que vendía. (overlay)

Esta intro no era un simple cartelito. Estaba diseñada para que, si alguien copiaba ese juego o programa (es decir, pirateaba al pirata), no pudiera sacarle la publicidad. El próximo comprador vería inevitablemente el anuncio del local. Era un sello de agua digital imposible de borrar.

El programa era un secreto bien guardado, compartido solo con uno o dos colegas de confianza en Rosario.

Ingreso a la Galería Vía Florida en los 90 (San Martín 1051)

La Traición: El Pirata de la Moto

Como en toda buena historia, aparece el conflicto. El colega de “Armagedón” tenía un socio en Buenos Aires. Este "pirata porteño" consiguió una copia de la famosa "Intro" con la promesa de no compartirla con nadie.

Pero, como dice el artículo, "pirata al fin", vio el potencial de negocio. Rompió su promesa, empezó a vender el programa de Armagedón por su cuenta y le fue tan bien que, con las ganancias del esfuerzo ajeno, se compró una moto.

Cuando Armagedón se enteró, la furia fue total. Él apenas tenía dinero, y el otro se estaba enriqueciendo gracias a su código.

"La Cueva" o "La Tinto" Entre Ríos 1071 - 1075

La Venganza: Nace el "Tracker"

Armagedón buscó primero la vía legal. Fue al registro de propiedad intelectual, pero el trámite era un laberinto. Un abogado amigo le bajó las esperanzas: "Ni te molestes. Aunque lo registres, se va a salir con la suya. Tiene amigos en lugares importantes".

Desesperanzado de la justicia, Armagedón optó por la venganza. Digital, por supuesto.

Decidió crear un virus.

Aunque nunca había hecho uno, sus "intros" eran técnicamente similares, ya que se "pegaban" a otros programas. Su plan era crear un "tracker" (buscador), un virus que se esparciría de máquina en máquina, silencioso e inofensivo, hasta que diera con la computadora del pirata traidor. Solo ahí, en esa máquina, el virus despertaría y empezaría a destruir lentamente el disco rígido.

Para proteger su identidad, adoptó el apodo "Armagedón", sugerido por un amigo, un nombre que sonaba potente y no tenía nada que ver con su alias habitual en el mundo informático.

El Error: "Volvete en Virus, es más Rápido"

El Día del Padre de 1993, el virus estuvo listo.

Armagedón y su "pandilla" probaron el virus en todas las computadoras que pudieron para asegurarse de que era 100% inofensivo para los inocentes… O eso creyeron.

Comenzaron la distribución de forma "quirúrgica". Le pasaron una copia del software "Vista Pro" infectado a un conocido pirata de Buenos Aires. Casi al mismo tiempo, uno de sus amigos viajó a Uruguay por negocios (que también trabajaban con el enemigo porteño) y llevó una versión 2 del virus.

Aquí es donde todo se salió de control.

El virus demostró ser más infeccioso de lo que jamás imaginaron. Unos días después, el pirata de Buenos Aires volvió a Rosario. Cuando revisaron sus diskettes, Armagedón no podía creerlo: ¡tenía la versión 2, la que se había ido a Uruguay!

El virus había viajado de Uruguay a Buenos Aires y de Buenos Aires a Rosario en cuestión de días. La broma interna fue épica:

—¿En qué te volviste de Uruguay?

—En colectivo.

—No, eso pasó de moda. La próxima vez volvete en virus que es mucho más rápido.

Las Consecuencias: El Virus "PHX"

La broma dejó de ser graciosa muy rápido. Armagedón descubrió que su creación tenía errores. Esos "pequeños" bugs que se le habían pasado hacían que el virus no fuera inofensivo para las computadoras inocentes. Estaba corrompiendo datos en todas partes.

La culpa lo carcomía. La infección se multiplicaba exponencialmente. Habían elegido demasiado bien a sus distribuidores.

Mientras tanto, el virus llegó a organizaciones antivirus internacionales. En EE.UU. lo llamaron "Willistrover III" y (gracias a un dato falso) creyeron que venía de Bolivia. Pero fue el islandés Fridrik Skulason, autor del famoso antivirus F-Prot, quien le dio el nombre con el que pasaría a la historia: PHX. Lo llamó así por un texto que el virus buscaba en las máquinas para identificar a su víctima.

El virus "PHX" estaba en todos lados: Uruguay, Paraguay, Rosario y Buenos Aires. Había infectado incluso a organismos oficiales del gobierno, que (en teoría) no deberían usar software pirata.

La Redención: El Antivirus

Irónicamente, el virus cumplió parcialmente su objetivo. El pirata porteño recibió una avalancha de quejas de clientes a los que se les borraba la información. La venganza se había servido...

Pero el plato estaba demasiado frío. La alegría de Armagedón y compañía quedó completamente opacada por la culpa de la infección masiva que había causado.

En un intento por frenar a su propia creación, crearon varios programas antivirus y curas específicas para el PHX. Empezaron a repartirlos gratuitamente y hasta montaron una "campaña de vacunación" en Rosario.

La experiencia los marcó para siempre. Aprendiendo por las malas que un virus es algo que, por definición, se sale de control.

El limpiador es eficiente: no analiza byte por byte, sino que va directo a donde sabe que está el virus.

  • Objetivo: Archivos ejecutables (.COM y .EXE).

  • Posición Clave: El virus PHX mide exactamente 822 bytes y siempre se adhiere al final del archivo.

  • Método: El programa salta al final del archivo y retrocede 822 bytes. Luego, lee ese bloque y verifica cuatro "marcas" o "firmas" exactas en posiciones específicas. Si las cuatro firmas coinciden, confirma la infección y avanza a la curación.


2. La Cirugía: Revertir la Infección

La infección consistía en que el virus sobrescribía el inicio del archivo original para ejecutarse primero. La cura revierte esto en dos pasos:

A. Recuperación del "ADN" Original

El virus fue diseñado para guardar los datos de arranque originales (header) dentro de sus propios 822 bytes. El limpiador tiene que hacer una distinción:

  • Para archivos .COM: Recupera los pocos bytes originales que el virus necesitaba para saltar al programa real.

  • Para archivos .EXE: Recupera y reconstruye el encabezado del archivo, incluyendo los valores originales del puntero de instrucción (IP) y de la pila (SP) para que el archivo vuelva a ser ejecutable.

B. El Corte y el Reemplazo (Truncamiento)

Con el encabezado (header) original reconstruido en memoria, el programa finaliza la cura:

  1. Corte del Virus: Mueve el puntero del archivo justo antes de donde inician los 822 bytes del virus. Ejecuta un comando de "escritura de 0 bytes" (truncamiento), que efectivamente corta y elimina el bloque de 822 bytes del PHX.

  2. Restauración del Inicio: Vuelve al principio del archivo y sobrescribe el inicio dañado (que antes era un salto al virus) con el cabezal original y limpio que había reconstruido.

El resultado es un archivo limpio, con su tamaño original restaurado, como si nunca hubiera sido infectado.

Facu LU6FPJ

.286c assume cs:cseg,ds:cseg cseg segment para public 'WIII cleaner' org 100h remove proc near jmp startup_sequence tracker_lenght equ 822 alloc_mem dw 0 lenght_hi dw 0 lenght_lo dw 0 filehandle dw 0 id db 0dh,0ah,' File cleaner for WIII',0dh,0ah db ' (C) 1993 The Last Hackers Group - Internal Use Only',0dh,0ah db ' Date: 31/08/1993',0dh,0ah,0dh,0ah,'$' filespec1 db '*.com',0 filespec2 db '*.exe',0 disk_transfer_area db 080h dup (0) header db 01ch dup (0) buffer db tracker_lenght dup (0) scanning db 0dh,0ah,'Scanning: $' fileinfected db ', cleaning$' done db ', done.$' no_more_files: ret clean_dir: mov ah,01ah mov dx,offset disk_transfer_area int 21h mov dx,offset filespec1 call search_n_rescue mov dx,offset filespec2 search_n_rescue: mov ah,04eh xor cx,cx int 21h clean_curr_dir: cmp ax,012h je no_more_files mov ax,03d02h mov dx,offset disk_transfer_area+01eh int 21h mov bx,ax mov filehandle,bx call print_scanning mov ax,04202h mov cx,-1 mov dx,-tracker_lenght int 21h mov lenght_hi,dx mov lenght_lo,ax mov ah,03fh mov cx,tracker_lenght mov dx,offset buffer int 21h cmp word ptr buffer+tracker_lenght-3,00828h jne not_infected cmp byte ptr buffer+tracker_lenght-1,093h jne not_infected cmp word ptr buffer,0680eh jne not_infected cmp word ptr buffer+2,0100h jne not_infected call neutralize not_infected: mov dx,offset done mov ax,0900h int 21h mov ah,03eh int 21h mov ah,04fh int 21h jmp clean_curr_dir neutralize: mov dx,offset fileinfected mov ax,0900h int 21h mov ax,04200h xor cx,cx xor dx,dx int 21h mov ah,03fh mov dx,offset header mov cx,01ch int 21h mov si,offset buffer mov di,offset header cmp word ptr [di+000h],'ZM' je is_a_fucking_exe mov ax,[si+023h] mov bl,[si+02ah] mov [di+000h],ax mov [di+002h],bl jmp neutralized is_a_fucking_exe: mov dx,[di+016h] add dx,[di+008h] mov cx,dx shl dx,4 shr cx,12 mov ax,04200h mov bx,filehandle int 21h mov ah,03fh mov cx,080h mov dx,offset buffer int 21h mov ax,[si+061h] mov bx,[si+05fh] mov cx,[si+063h] mov dx,[si+05ch] mov [di+016h],ax mov [di+014h],bx mov [di+00eh],cx mov [di+010h],dx ;RHP: ******************* mov ax,04202h mov bx,filehandle mov cx,-1 mov dx,-(tracker_lenght) int 21h mov [di+002h],ax and [di+002h],01ffh shr ax,9 shl dx,7 or dx,ax mov [di+004h],dx inc word ptr [di+004h] jmp chop_file_end neutralized: mov ax,04202h mov bx,filehandle mov cx,-1 mov dx,-(tracker_lenght) int 21h chop_file_end: mov ah,040h xor cx,cx int 21h mov ax,04200h mov bx,filehandle xor cx,cx xor dx,dx int 21h mov ah,040h mov dx,offset header mov cx,01ch int 21h ret print_scanning: mov di,offset disk_transfer_area+01eh xor al,al mov cx,080h repne scasb mov byte ptr [di-1],'$' mov dx,offset scanning mov ax,0900h int 21h mov dx,offset disk_transfer_area+01eh mov ax,0900h int 21h ret startup_sequence: call clean_dir int 20h remove endp cseg ends end remove


  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

“Cuando los bytes bailaban cumbia: Anatomía de una demo de los 90 de T.L.H.”

¡Che, pibe! Sentate a la mesa que hoy no vamos a hablar de la tablita del 8, ni de la selección de fútbol. Hoy vamos a desentrañar un misterio más denso que un mate cocido sin azúcar: el código máquina hecho por rosarigasinos en los noventa. Sí, señores, ese artefacto digital que, en lugar de una buena charla de café, te exigía un Intel 80286 y una placa VGA como si fueran una entrada a un show exclusivo de Les Luthiers.

El código que nos ocupa no es un programa, sino una "demo". ¿Y qué es una demo? Mirá, si un programa es un delivery de pizza, la demo es la caja vacía de cartón que queda después: puro estilo, puro rinde, y con el olor a hazaña todavía flotando en el aire. La hizo la gente de TLH Group (The Last Hackers), con los capos de Maxi K, Marcelo V y Diego A. Estos muchachos de Rosario, en lugar de tomar el bondi a la playa, se pusieron a domar el silicio.

DMA Informática en la Galería Vía Florida 

Paréntesis Histórico: The Last Hackers no eran unos improvisados. Fue un grupo dedicado por años a la programación de intros y demos para la incipiente escena local. Su hito más grande, y digno de placa, es haber realizado la primer y única demo hecha en nuestro país en 1994. Es decir, antes de que existiera el Wi-Fi, estos pibes ya estaban empujando los límites del hardware con arte digital.


La Anatomía del Milagro de 320x200

Este engendro informático está escrito en lenguaje ensamblador (Assembly), usando el mítico TASM 2.0. El Ensamblador es la lengua madre de la computadora, el dialecto crudo y brutal con el que le decís al microprocesador: "Che, hacé esto, pero YA". Olvidate de que la máquina te interprete. Acá, si movés un bit mal, la PC te devuelve un error más seco que bizcocho viejo.


El programa se carga como un
archivo COM (ORG 100h). Esto significa que vive y muere en un solo segmento de memoria, como si fuera un hippie acampando en la RAM.

  • El Corazón 80286: La directiva .286 ya te avisa que estos muchachos no tenían paciencia para esperar el 386. Iban a lo seguro, a las instrucciones que te permiten mover datos más rápido que un carterista en el centro.

  • Modo VGA (La Lucha de Clases): Al principio, el programa te saluda con un mensaje de Max of The Last Hackers y luego, sin anestesia, chequea si tenés VGA. Si no la tenés, te tira un mensaje de error más dramático que una telenovela venezolana: Hardware Error #280819930825 Proc: _vgaprint. Es la dictadura del modo gráfico $13h$: 320 píxeles de ancho por 200 de alto, con 256 colores. ¡Una explosión visual que dejaba tu monitor más excitado que perro con dos colas!


2. Los Efectos Visuales: La Mística Rosarina del Demoscene

Aquí es donde la demo se convierte en arte, o al menos en una performance de alto rendimiento digital. Todo sucede dentro del bucle central llamado print_sinus_wave, una verdadera orquesta de instrucciones.


a) El Sinus Scroll (El Chiste de la Ondita)

Los muchachos dibujan una onda senoidal con un color en el centro de la pantalla. ¿Cómo? Moviendo el índice de la tabla de senos (sinus_offset) de a dos pasos por frame. Es decir, a la máquina, en lugar de contarle un chiste, le dan un valor precalculado (sinus_line[bx]) y ella obedece, dibujando la curva. Y para que no quede como un garabato de chico de jardín de infantes, aprovechan para dejar un rastro de 12 píxeles de espesor.

b) El Texto Desplazable (La Mensajería del Caos)

El famoso scrolling text de las demos, la nota al pie digital de la historia.

  1. Carga y Empuje: El código copia caracteres (rept 6 / movsw) desde la tabla de fuentes (font_now) a un buffer temporal (buffer_area).

  2. Desplazamiento a Torta Frita: Cada 12 frames se reinicia el contador (scroll_counter). Con la bandera de dirección en STD (Set Direction Flag), se invierte el sentido de los MOVSW (mover palabra), y se desplaza el búfer de texto hacia la izquierda, como si estuviera apurado por llegar al kiosko. Cuando se acaba la frase, ¡El texto empieza de nuevo! Un infinito de bits rosarinos.

c) La Ciclotimia de la Paleta (pallete_cycling)

El efecto más hipnótico. En lugar de cambiar los gráficos, cambian los colores. El código toma la paleta de 256 colores (que en realidad son 256 entradas de 3 bytes RGB) y las rota. Es decir, el color Naranja pasa a ser Amarillo, el Amarillo pasa a ser Rojo, y así en un baile sin fin.

El chiste es que esto se hace escribiendo directamente a los Puertos I/O del chip VGA (03c8h y 03c9h). Es como meterle mano al motor del Fiat 600 mientras vas a 80 km/h: pura adrenalina técnica.

d) El Campo de Estrellas (El Espacio Exterior... o El Cielo Rosarino)

Para que todo fluya sin un solo glitch que arruine la performance, los Rosarigasinos esperan al Retraso Vertical (VBLANK). Esto es sincronizar el dibujo con la frecuencia de refresco del monitor, para que la pantalla no "se rompa" con líneas extrañas.

Luego, el bucle stars_loop procesa 64 estrellas. Cada una tiene su posición y su velocidad (stars_data). El programa:

  1. Borra la estrella de la posición vieja (mov es:bx, byte ptr 0).

  2. Calcula la nueva posición y la mueve.

  3. Le asigna un color (add al, 0Ah) y la dibuja.

Es un efecto de profundidad, donde las estrellas se mueven hacia el usuario, generando la ilusión de que tu PC con 1 MB de RAM es, en realidad, una nave espacial despegando desde La Florida.


3. Conclusión: El Código Rosarino

En resumen, aquel código de TLH Group no era solo un montón de bytes. Era la destilación de la creatividad argentina de los 90, la prueba viviente de que se podía hacer arte sin presupuesto, solo con conocimiento de Ensamblador y mucho aguante. Un verdadero homenaje a la eficiencia, donde cada registro (AX, BX, CX, DX) actuaba como un personaje en una obra de teatro absurda, pero perfectamente coreografiada.

Y todo eso solo para mostrar una onda y unas estrellitas en pantalla. En su momento, aquello era una locura total. Si eso no era amor al código, entonces yo era el Indio Solari.

Facu LU6FPJ





.286

assume cs:cseg,ds:cseg

cseg segment

org 100h

mp proc near


                                cli

                                jmp startup_sequence



                                include font.inc

                                include wave.inc

                                include pal.inc

                                include ascii.inc

                                include stars.inc

                                include tlh.inc

                                include msg.inc


print_tlh:                      mov si,offset tlh_graphic

                                mov di,5164

                                mov cx,114

print_scans:                    push cx

                                push di

                                mov cx,232/2

                                rep movsw

                                pop di

                                pop cx

                                add di,320

                                loop print_scans

                                ret


buffer_area                     db 0ea4h dup (?)

sinus_offset                    dw ?

scroll_counter                  dw 00c0h

text_offset                     dw offset message

buffer_now                      dw offset buffer_area

font_now                        dw offset font_area


print_sinus_wave:               ;cli

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                               ;PRINT SINUS WAVE

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                                mov si,offset buffer_area+0c0h

                                add si,scroll_counter

                                mov cx,280

                                xor al,al

print_loop:                     mov bx,cx

                                add bx,sinus_offset

                                shl bx,1

                                mov di,sinus_line[bx]

                                add di,cx

                                add di,20

                                stosb

                                sub di,321

                                stosb

                                sub di,321

                                rept 12

                                movsb

                                sub di,321

                                endm

                                loop print_loop

                                add sinus_offset,2

                                cmp sinus_offset,180

                                jb scrolling_text

                                mov sinus_offset,0

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                                ;SCROLLING TEXT

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

scrolling_text:                 mov ax,cs

                                mov es,ax


                                mov si,font_now

                                mov di,buffer_now

                                rept 6

                                movsw

                                endm

                                mov font_now,si

                                mov buffer_now,di


                                sub scroll_counter,00ch

                                jnz pallete_cycling

                                mov scroll_counter,0c0h

                                mov si,text_offset

                                inc text_offset

                                mov bl,[si]

                                or bl,bl

                                jnz no_text_end

                                mov bl,020h

                                mov text_offset,offset message

no_text_end:                    sub bl,020h

                                xor bh,bh

                                shl bx,1

                                mov si,ascii[bx]

                                mov buffer_now,offset buffer_area

                                mov font_now,si


                                std

                                mov si,offset buffer_area+0de0h

                                mov di,offset buffer_area+0ea0h

                                mov cx,150

scrolling:

                                rept 00ch

                                movsw

                                endm

                                loop scrolling

                                cld



;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                                ;PALLETE CY;;cliNG

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

pallete_cycling:                mov al,00h

                                inc byte ptr pallete_cycling+1

                                and al,01h

                                jnz skip_pallete

                                mov si,offset pallete+33h

                                mov di,offset pallete+30h

                                mov cx,[di]

                                mov dh,[di+2]

                                rept 16h

                                movsw

                                endm

                                movsb

                                mov [di],cx

                                mov [di+2],dh


                                mov si,offset pallete+30h

                                mov cx,010h

                                mov dx,03c8h

                                mov al,010h

                                out dx,al

                                inc dx

send_rgb_to_vga:                mov al,[si]

                                out dx,al

                                mov al,[si+1]

                                out dx,al

                                mov al,[si+2]

                                out dx,al

                                add si,3

                                loop send_rgb_to_vga


skip_pallete:                   mov ax,0a000h

                                mov es,ax

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                                     ;STARS

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


                                mov dx,03dah

                                in al,dx

                                test al,08h

                                jz retrace_wait_on

retrace_wait_off:               in al,dx

                                test al,08h

                                jnz retrace_wait_off

retrace_wait_on:                in al,dx

                                test al,08h

                                jz retrace_wait_on


stars_scroll:                   mov cx,040h

                                mov si,offset stars_data

                                xor ah,ah

stars_loop:                     mov bx,[si]

                                add bx,[si+2]

                                mov dl,es:bx

                                cmp dl,0ah

                                jb  there_is_something

                                mov es:bx,byte ptr 0

there_is_something:             mov al,cl

                                and al,03h

                                inc al

                                sub [si+02],ax

                                sub bx,ax

                                add al,0Ah

                                mov dl,es:bx

                                or dl,dl

                                jz go_on

                                cmp dl,0ah

                                jb  something_ii

go_on:                          mov es:bx,al

something_ii:                   add si,4

                                loop stars_loop

skip_stars:                     xor ax,ax

                                in al,060h

                                and al,03h

                                jnz go_out

no_alt_x:                       jmp print_sinus_wave

                                sti

go_out:                         ret


startup_sequence:               cli

                                mov dx,offset guru_chief

                                mov ah,09h

                                int 21h

                                mov bx,05h

pause_2:                        mov cx,0h

pause_1:                        loop pause_1

                                dec bx

                                jnz pause_2

                                call detect_vga

                                jne no_hercules

                                mov dx,offset guru

                                mov ah,09h

                                int 21h

                                jmp skip_demonstration

no_hercules:                    mov al,0ffh

                                out 21h,al

                                mov ax,0013h

                                int 10h

                                mov ax,01012h

                                xor bx,bx

                                mov cx,32

                                mov dx,offset pallete

                                int 10h

                                mov ax,0a000h

                                mov es,ax

                                call print_tlh

                                call print_sinus_wave

                                mov ax,0003h

                                int 10h

skip_demonstration:             xor al,al

                                out 21h,al

                                sti

                                int 20h


detect_vga:                     mov ax,0f00h

                                int 10h

                                xor ah,ah

                                push ax

                                mov ax,00013h

                                int 10h

                                push es

                                mov ax,0a000h

                                mov es,ax

                                mov es:[0],byte ptr 0f8h

                                cmp es:[0],byte ptr 0f8h

                                mov dx,0ffffh

                                jz its_vga

                                mov dx,00000h

its_vga:                        mov es:[0],byte ptr 000h

                                pop es

                                pop ax

                                int 010h

                                or dx,dx

                                ret










guru_chief                      db 0dh,0ah,'The Last Hackers Demo, Done by Max of The Last Hackers Group. ADN 52:801/200',0dh,0ah,'$'

guru                            db 0dh,0ah

                                db 'Hardware Error #280819930825 Proc: _vgaprint ',0dh,0ah,0dh,0ah

                                db 'Error Description: Cant write memory at address: A000:0000',0dh,0ah,'$'



mp endp

cseg ends

end mp


  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS