Moving Grave nº2:(MG#_2.X05):21/11/1995 << Back To Moving Grave nº 2
Bue' como decia el titulo de esta seccion "LO PROMETIDO ES DEUDA", he me aqui pagando las deudas 8-D. A continuación describire los programitas que mandamos en la primera edi- ción, que como es sabido NADIE lo habra EJECUTADO, asi que para que se saquen los pañales tranquilos, les comentamos los fuentes de cada programita. ------------------------------- CUT HERE ------------------------------- ;──────────────────────────────────────────────────────────────────────────── ; THE BOOT SECTOR READER. versión 1.00 ; Copyright (c)1995-96 by DESTROYER of COEAC GROUP DEVELOPMENT ;──────────────────────────────────────────────────────────────────────────── .model small .code org 100h Start: push cs cs pop ds es lea si,MensajeBase ; Mensaje de Entrada call print lea si,MsgProg ; Mensaje de Preguntas call print ;──────────────────────────────────────────────────────── ;────────────── Espero la unidad designada ────────────── ;──────────────────────────────────────────────────────── Inkey: xor ax,ax int 16h or al,20h ;───────────────────────────────────────────────── mov dl,0 ;Disco A (FD) lea si,FileBoot1 mov dh,0 ;Side number... cmp al,'a' je Continuar ;───────────────────────────────────────────────── mov dl,1 ;Disco B (FD) lea si,FileBoot2 mov dh,0 ;Side number... cmp al,'b' je Continuar ;───────────────────────────────────────────────── mov dl,080h ;Disco C (HD=Fixed Disk) lea si,FileBoot3 mov dh,1 ;Side number... cmp al,'c' je Continuar ;───────────────────────────────────────────────── mov dl,081h ;Disco D (HD=Fixed Disk) lea si,FileBoot4 mov dh,1 ;Side number... cmp al,'d' je Continuar jmp Inkey Continuar: ;─────────────────────────────────────────────────────────── ;────────────── Procedo a leer el boot sector ────────────── ;─────────────────────────────────────────────────────────── push cx lea di,FileBoot mov cx,12 rep movsb pop cx mov ah,2 ;Lectura de Sectores del DISCO mov al,1 ; │ Sectors to Read │ mov ch,0 ; │ Cylindre │ mov cl,1 ; │ Sector │ lea bx,Buffer ;Puntero al Buffer donde se guardaran int 13h ;los datos. jc Error ;═════ Limpio la parte de programa de boot ═════ lea si,buffer+3Eh ;Salto por encima de los registros del boot lea di,buffer ;y los copio a un buffer mov cx,01C2h ;448 bytes + 55h + AAh rep movsb ;───────────────────────────────────────────────────────────────────── ;───────────── Creo el archivo para copiar en él el BOOT ───────────── ;───────────────────────────────────────────────────────────────────── mov ah,03Ch ;---+ mov cx,00h ; | lea dx,FileBoot ; | int 21h ; | ; | mov ax,03D02h ; | lea dx,FileBoot ; \ int 21h ; \ Por si no se dieron cuenta... xchg bx,ax ; / aqui copio el prog. de boot a un push bx ; / file. ; | mov ax,4000h ; | mov cx,01C2h ; | mov dx,offset Buffer ; | int 21h ; | ; | pop bx ; | mov ah,03Eh ; | int 21h ;---+ lea si,MsgOk ;Mensaje de OK! call print ExitCode 0 ;aaaahhhh!....ya acabe! Error: lea si,MsgError ;Mensaje de ERROR! call print ExitCode 0 ;bue' nadie es perfecto.... ;----------------------------------------------------------------------------- ; Zona de Datos ;----------------------------------------------------------------------------- ;Mensages de entrada y salida del programa : ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MensajeBase db 'THE PROGRAM',96,'S BOOT SECTOR Reader versión 1.00',0ah,0dh db 'COPYRIGHT (c)1995-96 by COEAC GROUP. All Rights Reserveds.' db 0ah,0dh,0 MsgProg db 'Unidades (A), (B), (C) y (D)',0ah,0dh db 'Seleccione la unidad a leer:',0 MsgError db 0ah,0dh,'Error: No se pudo leer correctamente el programa de BOOT...',0 MsgOK db 0ah,0dh,'La lectura del programa de BOOT fue realizada con EXITO...',0 ;Nombre de los archivos de contencion: ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileBoot1 db 'MBR_FD.(A)',0 FileBoot2 db 'MBR_FD.(B)',0 FileBoot3 db 'MBR_HD.(C)',0 FileBoot4 db 'MBR_HD.(D)',0 ;Variables para procesos: ;^^^^^^^^^^^^^^^^^^^^^^^^ FileBoot db 12 dup (?) Buffer db 200h dup (?) ;----------------------------------------------------------------------------- ; Final de la Zona de Datos ;----------------------------------------------------------------------------- ;╔═════════════════════════════════════════════════════════════════════════╗ ;║ Procedimiento de impresion en pantalla ║ ;╚═════════════════════════════════════════════════════════════════════════╝ Print proc near Repeat: lods byte ptr cs:[si] ; leo el primer byte de la cadena or al,al ; es 0 ? jz Retorno ; Anda....maricon.... xor bh,bh mov ah,0eh ; escribo el caracter.! int 10h jmp short Repeat Retorno: retn Print Endp end Start ;──────────────────────────────────────────────────────────────────────────── ;| END OF READBOOT | ;──────────────────────────────────────────────────────────────────────────── ------------------------------- CUT HERE ------------------------------- ;──────────────────────────────────────────────────────────────────────────── ; THE BOOT SECTOR WRITER. versión 1.00 ; Copyright (c)1995-96 by DESTROYER of COEAC GROUP DEVELOPMENT ;──────────────────────────────────────────────────────────────────────────── .model small .code org 100h Start: lea si,MensajeBase ; Mensaje de Entrada call print cmp byte ptr es:[80h],00 ; Compruebo si hay parametro jnz OK ; si!, hay parametrito! lea si,ParamError ; BOLUDON!, te lo olvidaste call print ExitCode 0 ; te hecho FLYT.... ;───────────────────────────────────────────────────────────── ;────────────── Chequeo el tamaño del Parametro ────────────── ;───────────────────────────────────────────────────────────── OK: cld mov si,82h ; Empiezo a leer el PARAM. luego del es- lea di,FileBoot ; pacio y lo coloco en un buffer mov cl,es:[80h] dec cl ; por si dejaron espacio al final... ;═════ saco los espacios correspondientes ═════ Again: mov al,byte ptr ds:[si] inc si cmp al,' ' je Again mov byte ptr es:[di],al inc di loop Again lea si,MsgProg ; Mensaje de preguntas.... call print ; para seleccionar la unidad vio?... ;──────────────────────────────────────────────────────── ;────────────── Espero la unidad designada ────────────── ;──────────────────────────────────────────────────────── Inkey: push cs cs pop ds es xor ax,ax int 16h ; Espero un tecla... or al,20h ; transformo a minusculas. ;═════ Parametros para la UNIDAD A ═════ mov dl,0 mov dh,0 cmp al,'a' je Continuar ;═════ Parametros para la UNIDAD B ═════ mov dl,1 mov dh,0 cmp al,'b' je Continuar ;═════ Parametros para la UNIDAD C ═════ mov dl,080h mov dh,1 cmp al,'c' je Continuar ;═════ Parametros para la UNIDAD D ═════ mov dl,081h mov dh,1 cmp al,'d' je Continuar jmp Inkey Continuar: ;─────────────────────────────────────────────────────────── ;────────────── Procedo a leer el boot sector ────────────── ;─────────────────────────────────────────────────────────── push dx push dx pop dx mov ah,2 ;Lectura de Sectores del DISCO mov al,1 ; │ Sectors to Read │ mov ch,0 ; │ Cylindre │ mov cl,1 ; │ Sector │ lea bx,Buffer ;Puntero al Buffer donde se guardaran int 13h ;los datos. jnc Read_File jmp Error Read_File: lea si,ReadBoot call print ;───────────────────────────────────────────────────────────────────── ;────────────── Leo el archivo para copiarlo en el BOOT ────────────── ;───────────────────────────────────────────────────────────────────── mov ax,3D02h lea dx,FileBoot int 21h jnc Continue_Reading cmp ax,1 ; Aqui veo que tipo de problemas tuve 8-| jz caca_A cmp ax,2 jz caca_B cmp ax,3 jz caca_C cmp ax,4 jz caca_D cmp ax,5 jz caca_E cmp ax,12 jz caca_F jmp caca_X caca_a: lea si,Error_A call print exitcode 0 caca_b: lea si,Error_B call print exitcode 0 caca_c: lea si,Error_C call print exitcode 0 caca_d: lea si,Error_D call print exitcode 0 caca_e: lea si,Error_E call print exitcode 0 caca_f: lea si,Error_F call print exitcode 0 caca_x: lea si,Error_X call print exitcode 0 Continue_Reading: ; Sigo si todo OK! xchg bx,ax push bx lea si,readfile call print mov ax,3F00h mov cx,01C0h mov dx,offset FileBuffer ; Leo el file indicado. int 21h pop bx mov ah,03Eh int 21h ;────────────────────────────────────────────────────────────────── ;────────────── Comienzo la operacion de PUT & PASTE ────────────── ;────────────────────────────────────────────────────────────────── ;═════ Primero coloco los 3 primeros byte del boot ═════ lea si,JmpBoot lea di,Buffer movsw movsb ;═════ Limpio la parte de programa de boot ═════ lea di,Buffer+3Eh mov cx,01C0h xloop: mov al,00 ; asi no queda basura junto con el stosb ; nuevo programita. loop xloop mov al,55h stosb mov al,0AAh stosb ;═════ Ahora traslado el fucking file ═════ cld lea si,FileBuffer lea di,Buffer add di,3Eh mov cx,01C0h xloop2: lodsb stosb loop xloop2 ;────────────── Procedo a Escribir el boot sector ────────────── lea si,WriteData call print pop dx mov ah,3 ;Lectura de Sectores del DISCO mov al,1 ; │ Sectors to Write │ mov ch,0 ; │ Cylindre │ mov cl,1 ; │ Sector │ lea bx,Buffer ;Puntero al Buffer donde se guardaran int 13h ;los datos. jc Error ;────────────── Mensajes de errores o de aprobacion ────────────── lea si,MsgOk call print ExitCode 0 Error: lea si,MsgError call print ExitCode 0 ;----------------------------------------------------------------------------- ; Zona de Datos ;----------------------------------------------------------------------------- ;Mensages de entrada y salida del programa : ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MensajeBase db 'THE PROGRAM',96,'S BOOT SECTOR writer versión 1.00',0ah,0dh db 'COPYRIGHT (c)1995-96 by COEAC GROUP. All Rights Reserveds.' db 0ah,0dh,0 ParamError db 0ah,0dh db 'WRBOOT [File-Name]',0ah,0dh,0ah,0dh db ' [File-Name] Archivo a colocar en el boot sector.',0ah,0dh db ' Tiene que ser menor o igual a los 448 bytes.',0ah,0dh,0 MsgProg db 'Unidades (A), (B), (C) y (D)',0ah,0dh db 'Seleccione la unidad a escribir:',0 MsgOK db 0ah,0dh,'La escritura del programa de BOOT fue realizada con EXITO...',0 ReadFile db 'Lectura del File.....',0fbh,0ah,0dh,0 ReadBoot db 0ah,0dh,'Lectura del Boot.....',0fbh,0ah,0dh,0 WriteData db 'Escritura del Boot...',0fbh,0ah,0dh,0 ;Mensages de Errores Ocurridos Durante el Proceso: ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MsgError db 0ah,0dh,'Error: No se pudo procesar correctamente el programa de BOOT...',0 Error_A db 'Numero de funcion invalida',0 Error_B db 'File not found',0 Error_C db 'Path not found',0 Error_D db 'No handle available',0 Error_E db 'Access Denied',0 Error_F db 'Open Mode Invalid',0 Error_X db 'Ocurrio otro tipo de error',0 ;Variables para procesos: ;^^^^^^^^^^^^^^^^^^^^^^^^ JmpBoot db 0EBh,03Ch,090h FileBoot db 128 dup (0) Buffer db 200h dup (?) FileBuffer db 1C0h dup (0),055h,0AAh ;----------------------------------------------------------------------------- ; Final de la Zona de Datos ;----------------------------------------------------------------------------- ;╔═════════════════════════════════════════════════════════════════════════╗ ;║ Procedimiento de impresion en pantalla ║ ;╚═════════════════════════════════════════════════════════════════════════╝ Print proc near Repeat: lods byte ptr cs:[si] ;la descripcion de esto es la or al,al ;misma que la de arriba... jz Retorno ;lease prog. anterior xor bh,bh mov ah,0eh int 10h jmp short Repeat Retorno: retn Print Endp end Start ;──────────────────────────────────────────────────────────────────────────── ;| END OF WRBOOT | ;──────────────────────────────────────────────────────────────────────────── ------------------------------- CUT HERE ------------------------------- ;╔══════════════════════════════════════════════════════════════╗ ;║ Demostracion de como hacer un programita para el bootsector! ║ ;║ ───────────────────────────────────────────────────────────- ║ ;║ ║ ;║ PD: Mataria que esto fuera una bombita MBR, no?....8-D ║ ;╚══════════════════════════════════════════════════════════════╝ .286c .model tiny .code org 100h start: nop nop nop nop nop cli ; Aqui no se permiten INTs (figuradamente) xor ax,ax mov ss,ax mov sp,7BF0h sti ;Bue' esta good pasa con las INTs...8-D mov ax,7C0h mov ds,ax mov si,75h ;Direccion del mensaje! nop nop cld Inkey: lodsb or al,al ;Se termino el mensaje?... jz BootStrap ;sip! push si ;nop! mov ah,0Eh mov bx,7 int 10h ;Imprimo de a un caracter pop si jmp short Inkey BootStrap: xor ah,ah ;Dale! pulsa una tecla man!..... int 16h mov ah,0Fh ;--+ int 10h ; \ Esto funca como xor ah,ah ; / un CLS int 10h ;--+ int 19h ;BootStrap ;────────────/ Aqui coloco el mensaje para el booteo /───────────────── db ' ▀▀▀▀▀\ ▀▀▀▀▀\ ▀▀▀▀▀▀▀\ ▀▀▀▀▀\ ▀▀▀▀▀\ ',0ah,0dh db ' ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\',0ah,0dh db '▀▀▀\ ▀▀▀\ ▀▀▀\▀▀▀▀▀\ ▀▀▀▀▀▀▀\▀▀▀\ ',0ah,0dh db ' ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\ ▀▀\',0ah,0dh db ' ▀▀▀▀▀\ ▀▀▀▀▀\ ▀▀▀▀▀▀▀\▀▀\ ▀▀\ ▀▀▀▀▀\ ',0ah,0dh db ' --───/ G - R - O - U - P /──--- ',0ah,0dh db 0ah,0dh db 'Presione cualquier tecla para continuar... ',0ah,0dh,0 ;────────────────────────────────────────────────────────────────────── end start ;──────────────────────────────────────────────────────────────────────────── ;| END OF PROGBOOT | ;──────────────────────────────────────────────────────────────────────────── ----- CUT HERE -----