1

Iniciado por tmb90, 6 Diciembre 2012, 06:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Binary_Death

Pues hombre... lo saqué de aquí: http://foro.elhacker.net/scripting/error_con_el_comando_goto_msdos-t358617.0.html;msg1735378#msg1735378

El post es de abril de 2012, lo que significa que por ese entonces tú nivel de batch era muy, muy básico.

Mi intención no era ofenderte ni decirte lo que debías o no debías hacer, mi intención fue ayudarte a que no empezaras un proyecto grande sin considerar bien las cosas antes.

Ahora, allá tú. Yo ya me callo  :rolleyes:

Eleкtro

Casi sería más fácil hacer un simulador de aviones en Batch xD

tmb90, dejando a un lado el nivel que tengas tanto de Batch como de C/C++/C# (el cual no voy a comentar), Binary_Death tiene razón en los dos cosas,
La primera es que aún no hemos visto ni siquiera una imagen del simulador, y la segunda es que simplemente con que tengas indicios de C ya es una locura que vayas a hacerlo en Batch.

Pero bueno, no es una tarea imposible, alguien ya hizo esto en otro foro:


No tengo más imagenes y cuando me lo descargué no era compatible con mi Windows 7 (Creo que porque necesitaba mucho uso del Debug.exe) así que no sé como es "por dentro" ni si se le puede considerar un verdadero simulador de SO,
Pero si no recuerdo mal está todo hecho en Batch, menos las "extensiones" (llamemosle comandos externos) en C y Ruby (Alguna app mía xD), y algunos scripts en Batch.

Un saludo!








xogeid46

hola,
usando la función cecho de Binary Death pueden darle mas estilo a su  SSO. xD

@Echo Off
for %%x in (0,1,2,3,4,5,6,7,A,B,C,D,E,F) do (
for %%y in (0,1,2,3,4,5,6,7,A,B,C,D,E,F) do (
call:_echo "Color %%x%%y" %%x%%y
)
)
exit
:_echo
chdir "%temp%"
exit|cmd /k prompt $H>"%~1"
findstr /v /a:%~2 /r "^$" "%~1*" && ECHO+
del /f /q "%~1"
goto:eof

:P

Binary_Death

Bueno, la función no es mía. La idea es vieja y muchísimos batch coders hicieron sus versiones, pero lo difícil era quitar esos : que aparecían al final. En mi versión lo conseguí con el carácter backspace y usando un poco de imaginación  :P

En fin, aunque yo para colorear scripts largos recomendaría más el uso de ANSI.SYS, que a diferencia del colored echo permite displayear (¿?) caracteres especiales. No es tan limitado como cecho. Eso sí, tiene de malo que no anda en Windows de 64 bits.

Para el que le interese el uso de ansi.sys, una vez hice una recopilación de toda la info que me encontré por la red:

Citar
               Uso de ANSI.SYS
            Recopilación de información.




   Cargar el controlador de dispositivo ANSI.SYS.

Añadir a CONFIG.NT la siguiente línea:

DEVICE=[Unidad:][Ruta]ANSI.SYS [/X] [/K] [/R]

Parámetros:

/X
Reasigna de forma independiente las teclas extendidas en teclados de
101 teclas.

/K
Hace que ANSI.SYS considere un teclado de 101 teclas como si fuera un
teclado de 84 teclas.

/R
Ajusta el desplazamiento de líneas para mejorar la legibilidad cuando se
utiliza ANSI.SYS con programas de lectura de pantalla.



   Manejo del Cursor:

<ESC>[xA
Desplaza el cursor hacia arriba X filas.
Si el cursor se haya en la primera fila, no surge efecto.
Si no se especifica el número de filas se asume 1.

<ESC>[xB
Desplaza el cursor hacia abajo X filas.
Si el cursor se haya en la última fila, no surge efecto.
Si no se especifica el número de filas se asume 1.

<ESC>[xC
Desplaza el cursor hacia la derecha X columnas.
Si el cursor se haya en la primera columna, no surge efecto.
Si no se especifica el número de columnas se asume 1.

<ESC>[xD
Desplaza el cursor hacia la izquierda X columnas.
Si el cursor se haya en la última columna, no surge efecto.
SI no se especifica el número de columnas se asume 1.

<ESC>[Y;X(f/H)
Desplaza el cursor a la fila Y, columna X.
Si no se especifica Y se asume 1.
Si no se especifica X se asume 1.

<ESC>[s
Guarda la posición actual del cursor.

<ESC>[u
Restaura la posición del cursor previamente guardada.


   Borrado de pantalla:

<ESC>[xJ
Borra la pantalla.
Si X vale 0, se borra desde la posición del cursor hasta el final de la pantalla.
Si X vale 1, se borra desde la posición del cursor hasta el principio de la pantalla.
Si X vale 2, se borra toda la pantalla.

<ESC>[xK
Borra la línea actual.
Si X vale 0, se borra desde la posición del cursor hasta el final de la línea.
Si X vale 1, se borra desde la posición del cursor hasta el principio de la línea.
Si X vale 2, se borra toda la línea.

   
   Atributos de texto:

<ESC>[<Atr>;...mTEXTO
Establece los atributos de texto.
Puede escribirse un texto en pantalla después del finalizador "m".
Los atributos son procesados secuencialmente.


Valores de <Atr> para propiedades de texto:

X=0   Desactiva todos los atributos.
X=1   Activa negrita.
X=4   Activa subrayado (monócromo).
x=5   Activa parpadeo.
X=7   Activa vídeo inverso.
X=8   Activa texto oculto.

Valores de <Atr> para color de texto:

Negro      Primer Plano X=30, Segundo Plano X=40.
Rojo      Primer Plano X=31, Segundo Plano X=41.
Verde      Primer Plano X=32, Segundo Plano X=42.
Amarillo   Primer Plano X=33, Segundo Plano X=43.
Azul      Primer Plano X=34, Segundo Plano X=44.
Magenta      Primer Plano X=35, Segundo Plano X=45.
Azul Verdoso   Primer Plano X=36, Segundo Plano X=46.
Blanco      Primer Plano X=37, Segundo Plano X=47.


Si no se especifica <Atr>, se asume 0.
Nota: Los atributos pueden combinarse, separados por punto y coma.


   Selección de modo gráfico:

<ESC>[=Xh
Establece el tamaño del búfer de vídeo o el modo de presentación.

Valores de X para el cambio:

X=0   40x25 B/N.
X=1   40x25 COLOR.
X=2   80x25 B/N.
X=3   80x25 COLOR.
X=4   320x200 COLOR (CGA).
X=5   320x200 B/N (CGA).
X=6   640x200 B/N (CGA).
X=7   TURN ON LINE WRAP (Habilitar ajuste de línea).
X=14   640x200 COLOR (EGA).
X=15   640x350 MONO (EGA 4 colores).
X=16   640x350 COLOR (EGA 16 colores).
X=17   640x480 COLOR (VGA 16 colores).
X=18   640x480 COLOR (VGA 256 colores).
X=19   320x200 COLOR (MCGA 256 colores).

Nota: Para deshabilitarlos usar el mismo valor que para habilitarlos
A excepción de LINE WRAP, en cuyo caso su deshabilitación procede de la siguiente manera:

<ESC>[=7l
TURN OFF LINE WRAP (Deshabilitar ajuste de línea, truncar).

Nota: Si el ajuste de línea está desactivado una línea mayor de 80 carácteres es truncada.

   Asignación de teclas:

<ESC>[<Key>;<Result...>p
Redefine el resultado de presionar una tecla.

Donde <Key>, será el número ASCII de la tecla a redefinir o bien el carácter mismo encerrado entre comillas dobles.
<Result>, será el número ASCII de la tecla como resultado de la redefinición o bien el carácter mismo encerrado entre comillas dobles.

Nota: pueden especificarse más de un carácter ASCII separados por punto y coma como resultado de una asignación, mas no como tecla a redefinir.

Ejemplo:

<ESC>[65;66;67p

Redefine el carácter ASCII 65, equivalente a la letra "A", como la sucesión de carácteres "66;67", equivalentes a "BC".
Esto es, redefine la tecla "A" para que cuando ésta sea presionada, en pantalla se escriba "BC".

En elhacker.net no la había posteado. Por ahí os sirve.

Y también hice esto:


@echo off
:_ansi.sys
mode con cols=80 lines=25
mem/c | find /i "ansi" 1>nul || ((
echo.device=%SystemRoot%\system32\ansi.sys /X
)>>%SystemRoot%\system32\config.nt
if "%~1" NEQ "1" (
start "" %0 1 & exit /b 0
) else (exit /b 1)
) 1>nul 2>&1
:_code


Función para añadir al comienzo de todos los scripts batch que usen ansi.sys.
La función intenta cargarlo en memoria añadiendo una línea al fichero config.nt. Si por la razón que fuera no pudiera hacerlo (no tiene permisos, por ejemplo), cierra el script. Si puede cargar correctamente el controlador de dispositivo reinicia el script y continúa su normal ejecución.

Bueno  ;D casi que el tema daba para un topic aparte pero espero que para Batch Games o Sistemas Operativos en Batch ( :silbar:) sirva ;)

Segadorfelix

Binary_Death buen aporte, no encontraba nada sobre ANSI.sys (no se, si es uqe no hay nada, o no se buscar XD).

¿porque no funciona en Windows de 64 bits?

imoen

Pq es una libreria de 16 bit y accede a direccioens de memoria muy concretas y windows no deja que se accedan a esas direcciones .

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

Binary_Death

#36
Windows de 32 bits emula un entorno 8086 donde es como si trabajaras en modo real con el procesador, y como si el sistema fuese monotarea. En verdad esto no es así, únicamente lo emula.
ANSI.SYS lo que hace es escribir directamente bytes en el segmento de pantalla que comienza en la dirección 0B800h.
Si estuviéramos en MS-DOS escribiríamos directamente en la pantalla, no hay restricciones. En Windows toma como el segmento de pantalla lo que es la consola de comandos, la cmd, y escribe ahí.

Cuando trabajas con debug, Segadorfelix, en realidad estás haciendo eso mismo, pero manualmente. Es por lo mismo que tampoco funciona debug en Windows de 64 bits, no emula un entorno en modo real y por tanto no deja acceder, como bien dijo imoen, a ciertas direcciones de memoria que están únicamente reservadas para el propio kernel.

Aquí dejo otro tutorial de hace tiempo para quien prefiera entender un poco más como funciona esto usando debug, aunque repito que es mucho más rápido, fácil y eficiente trabajar con ANSI.SYS  ;)

Citar
Gráficos con Debug en Batch

¿Qué es Debug?
Debug es un debugger,  un depurador de código ensamblador para 16 bits. Windows lo incorpora por defecto y puede ser usado desde el CMD.
En este manual se explica de forma sencilla como acceder al segmento de pantalla y poder manipular de una forma potente, sencilla y eficaz los gráficos. Útil para juegos o para darle una apariencia más profesional a los scripts.

El segmento de pantalla.

El segmento de pantalla es un pedazo de la memoria donde todas las computadoras que ejecutan DOS, almacenan sus caracteres junto con sus atributos correspondientes a la consola de comandos.
El citado segmento comienza en la dirección 0B800h.
Al escribir datos directamente en un desplazamiento sobre ese segmento, esos datos aparecerán en pantalla.

Posición.

En ese segmento una posición ocupa dos bytes. El primero contiene el carácter y el segundo los atributos de éste.
Trabajando en una consola de x80y25, como es por defecto, veríamos que toda la pantalla ocupa 4000 bytes.
Bien, sabiendo que cada fila ocupa 160 bytes y cada columna ocupa 2 bytes, no es muy difícil hallar la fórmula para calcular la posición donde insertar un carácter.
La fórmula es esta: fila*160+columna*2. Lo que, adaptándolo al plano cartesiano, quedaría así: x*2+y*160. Puesto que las columnas son el eje horizontal X y las filas el eje vertical Y.
Así pues, la coordenada x1y3, por ejemplo, aplicando la fórmula, quedaría así:

1*2+3*160 = 482D = 1E2H

Se ha transformado a hexadecimal ya que es el sistema de numeración empleado en el uso de memoria.

Aplicación a Batch.

Lo que nos interesa es poder usar este sistema para realizar gráficos en batch. Vamos a ver como.


(
Echo.EB800:1E2 "Û"A
Echo.q
)|Debug>nul


En ese código hemos escrito desde Debug en la posición EB800:1E2. Hemos escrito dos bytes, que son los mencionados al comienzo de este manual: el carácter a escribir (1º byte) y su atributo (2º byte).
El carácter se encierra entre comillas, y posteriormente le sigue su atributo, que es un color en hexadecimal.
El atributo puede contener dos números hexadecimales, que corresponden al color de fondo de la coordenada en cuestión y al color del carácter, respectivamente.
Por lo tanto, al escribir en el segmento de pantalla algo así:


EB800:1E2 "A"AF


Lo que hicimos fue escribir en x1y3 la letra "A"; darle un fondo verde brillante a la casilla y un color blanco brillante a la letra.

Esto es todo, tan sólo hay que usar el ingenio para conseguir realizar gráficos más complejos y automatizar el cálculo de coordenadas hexadecimales.

Un saludo =)

xogeid46

lastima lo del ansi.sys...
seria bueno que esto que estan haciendo sea compatible con los de 32 y 64, haci su trabajo no sea en vano, ya que cada vez hay mas gente que se cambia al 7, y la mayoria es 64.
:P