First commit 06/07/1996
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								CDS/EJE1.COM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDS/EJE1.COM
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										43
									
								
								CDS/EJEMPLO1.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								CDS/EJEMPLO1.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
segmento    SEGMENT para PUBLIC 'CODE'
 | 
			
		||||
            ASSUME DS:segmento, CS:segmento
 | 
			
		||||
            ORG 100h
 | 
			
		||||
principal   PROC NEAR
 | 
			
		||||
 | 
			
		||||
            call Borra
 | 
			
		||||
 | 
			
		||||
            mov ah, 02h
 | 
			
		||||
            mov dh, 11
 | 
			
		||||
            mov dl, 30
 | 
			
		||||
            mov bh, 00h
 | 
			
		||||
            int 10h
 | 
			
		||||
 | 
			
		||||
            mov ah, 09h
 | 
			
		||||
            mov dx, OFFSET MensajeSaludo
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            call Borra
 | 
			
		||||
 | 
			
		||||
            mov ah, 4ch
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
principal   ENDP
 | 
			
		||||
 | 
			
		||||
Borra PROC NEAR
 | 
			
		||||
 | 
			
		||||
      mov ax, 0600h
 | 
			
		||||
     mov bh, 07h
 | 
			
		||||
      mov cx, 0000h
 | 
			
		||||
      mov dx, 184fh
 | 
			
		||||
      int 10h
 | 
			
		||||
 | 
			
		||||
      ret
 | 
			
		||||
 | 
			
		||||
Borra ENDP
 | 
			
		||||
 | 
			
		||||
MensajeSaludo DB '<27>Hola Mundo!$'
 | 
			
		||||
 | 
			
		||||
segmento  ENDS
 | 
			
		||||
          END  principal
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								CDS/EJEMPLO1.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDS/EJEMPLO1.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										8
									
								
								CDS/EJEMPLO1.MAP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								CDS/EJEMPLO1.MAP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
 | 
			
		||||
 Start  Stop   Length Name               Class
 | 
			
		||||
 | 
			
		||||
 00000H 00139H 0013AH SEGMENTO           CODE
 | 
			
		||||
 | 
			
		||||
Program entry point at 0000:0100
 | 
			
		||||
Warning: No stack
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										55
									
								
								CDS/EJEMPLO2.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								CDS/EJEMPLO2.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
segmento    SEGMENT
 | 
			
		||||
            ASSUME DS:segmento
 | 
			
		||||
            ORG 100h
 | 
			
		||||
principal   PROC NEAR
 | 
			
		||||
 | 
			
		||||
            call Borra
 | 
			
		||||
 | 
			
		||||
            mov ah, 02h
 | 
			
		||||
            mov dh, 11
 | 
			
		||||
            mov dl, 30
 | 
			
		||||
            mov bh, 00h
 | 
			
		||||
            int 10h
 | 
			
		||||
 | 
			
		||||
            mov ah, 09h
 | 
			
		||||
            mov dx, OFFSET MensajeSaludo
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            call Borra
 | 
			
		||||
 | 
			
		||||
            mov ah, 4ch
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
principal   ENDP
 | 
			
		||||
 | 
			
		||||
Borra PROC NEAR
 | 
			
		||||
 | 
			
		||||
      push ax    ; Se almacenan en la pila los registros que va a utilizar
 | 
			
		||||
      push bx    ; la subrutina. El valor de SP disminuye en 4 * 2 = 8
 | 
			
		||||
      push cx    ; unidades
 | 
			
		||||
      push dx
 | 
			
		||||
 | 
			
		||||
      mov ax, 0600h     ; Se borra la pantalla
 | 
			
		||||
      mov bh, 07h
 | 
			
		||||
      mov cx, 0000h
 | 
			
		||||
      mov dx, 184fh
 | 
			
		||||
      int 10h
 | 
			
		||||
 | 
			
		||||
      pop dx     ; Se recuperan los valores de los registros, de forma que
 | 
			
		||||
      pop cx     ; al volver el control de la ejecuci<63>n al m<>dulo principal
 | 
			
		||||
      pop bx     ; <20>stos almacenen los valores que pose<73>an antes de la
 | 
			
		||||
      pop ax     ; llamada al procedimiento. SP se incrementa en 4 * 2 = 8
 | 
			
		||||
                 ; unidades
 | 
			
		||||
 | 
			
		||||
      ret
 | 
			
		||||
 | 
			
		||||
Borra ENDP
 | 
			
		||||
 | 
			
		||||
MensajeSaludo DB '<27>Hola Mundo!$'
 | 
			
		||||
 | 
			
		||||
segmento  ENDS
 | 
			
		||||
          END  principal
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								CDS/EJEMPLO2.COM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDS/EJEMPLO2.COM
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										110
									
								
								CDS/EJEMPLO3.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								CDS/EJEMPLO3.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,110 @@
 | 
			
		||||
segmento    SEGMENT
 | 
			
		||||
            ASSUME DS:segmento
 | 
			
		||||
            ORG 100h
 | 
			
		||||
principal   PROC NEAR
 | 
			
		||||
 | 
			
		||||
            mov ax, OFFSET Cadena1
 | 
			
		||||
            push ax
 | 
			
		||||
            mov al, 1eh
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call VerCadena
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h               ; Se acepta una tecla
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            mov ax, OFFSET Cadena2
 | 
			
		||||
            push ax
 | 
			
		||||
            mov al, 21h
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call VerCadena
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h               ; Se acepta una tecla
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            mov ax, OFFSET Cadena3
 | 
			
		||||
            push ax
 | 
			
		||||
            mov al, 34h
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call VerCadena
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h               ; Se acepta una tecla
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            mov ax, OFFSET Cadena4
 | 
			
		||||
            push ax
 | 
			
		||||
            mov al, 42h
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call VerCadena
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h               ; Se acepta una tecla
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            mov ax, OFFSET Fin
 | 
			
		||||
            push ax
 | 
			
		||||
            mov al, 07h
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call VerCadena
 | 
			
		||||
 | 
			
		||||
            mov ah, 00h               ; Se acepta una tecla
 | 
			
		||||
            int 16h
 | 
			
		||||
 | 
			
		||||
            mov ah, 4ch
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
principal   ENDP
 | 
			
		||||
 | 
			
		||||
VerCadena PROC NEAR
 | 
			
		||||
 | 
			
		||||
      push bp
 | 
			
		||||
      mov bp, sp
 | 
			
		||||
 | 
			
		||||
      push bx    ; Se almacenan en la pila los registros que va a utilizar
 | 
			
		||||
      push cx    ; la subrutina. El valor de SP disminuye en 3 * 2 = 6
 | 
			
		||||
      push dx    ; unidades
 | 
			
		||||
                 ; Por otro lado, cuando se sabe que el registro AX es el
 | 
			
		||||
                 ; empleado para pasar los par<61>metros, no es necesario
 | 
			
		||||
                 ; salvarlo
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      mov ax, 0600h     ; Se borra la pantalla empleando el atributo
 | 
			
		||||
      mov bh, [bp+4]    ; pasado como par<61>metro mediante el registro AL,
 | 
			
		||||
      mov cx, 0000h     ; almacenado ahora en la pila y recuperado con
 | 
			
		||||
      mov dx, 184fh     ; la instrucci<63>n MOV BH, [BP+4]
 | 
			
		||||
      int 10h
 | 
			
		||||
 | 
			
		||||
      mov ah, 02h       ; Se posiciona el cursor en (25,11)
 | 
			
		||||
      mov bh, 00h
 | 
			
		||||
      mov dh, 11
 | 
			
		||||
      mov dl, 25
 | 
			
		||||
      int 10h
 | 
			
		||||
 | 
			
		||||
      mov ah, 09h
 | 
			
		||||
      mov dx, [bp+6]   ; El desplazamiento de la cadena que se va a visualizar
 | 
			
		||||
      int 21h          ; se mueve a DX
 | 
			
		||||
 | 
			
		||||
      pop dx     ; Se recuperan los valores de los registros, de forma que
 | 
			
		||||
      pop cx     ; al volver el control de la ejecuci<63>n al m<>dulo principal
 | 
			
		||||
      pop bx     ; <20>stos almacenen los valores que pose<73>an antes de la
 | 
			
		||||
                 ; llamada al procedimiento. SP se incrementa en 3 * 2 = 6
 | 
			
		||||
                 ; unidades
 | 
			
		||||
 | 
			
		||||
      pop bp     ; Se restaura BP
 | 
			
		||||
 | 
			
		||||
      ret 4
 | 
			
		||||
 | 
			
		||||
VerCadena ENDP
 | 
			
		||||
 | 
			
		||||
Cadena1 DB 'Primera cadena que se visualiza$'
 | 
			
		||||
Cadena2 DB 'Segunda cadena que se visualiza$'
 | 
			
		||||
Cadena3 DB 'Tercera cadena que se visualiza$'
 | 
			
		||||
Cadena4 DB 'Cuarta  cadena que se visualiza$'
 | 
			
		||||
Fin     DB 'Fin del programa ejemplo$'
 | 
			
		||||
 | 
			
		||||
segmento  ENDS
 | 
			
		||||
          END  principal
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								CDS/EJEMPLO3.COM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDS/EJEMPLO3.COM
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										61
									
								
								CDS/EJEMPLO4.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								CDS/EJEMPLO4.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
			
		||||
segmento    SEGMENT
 | 
			
		||||
            ASSUME DS:segmento
 | 
			
		||||
            ORG 100h
 | 
			
		||||
principal   PROC NEAR
 | 
			
		||||
 | 
			
		||||
            mov ax, Numero
 | 
			
		||||
            push ax
 | 
			
		||||
            mov ax, OFFSET Producto
 | 
			
		||||
            push ax
 | 
			
		||||
 | 
			
		||||
            call Multiplica
 | 
			
		||||
 | 
			
		||||
            mov ah, 4ch
 | 
			
		||||
            int 21h
 | 
			
		||||
 | 
			
		||||
principal   ENDP
 | 
			
		||||
 | 
			
		||||
Multiplica  PROC NEAR
 | 
			
		||||
 | 
			
		||||
            push bp         ; se salva BP
 | 
			
		||||
            mov  bp, sp     ; se hace que BP apunte a la zona de par<61>metros
 | 
			
		||||
            sub  sp, 2      ; se crea espacio para una variable local de 2 bytes
 | 
			
		||||
            push si         ; se salva SI
 | 
			
		||||
 | 
			
		||||
            mov si, [bp+4]  ; se mueve a SI el desplazamiento del campo resultado
 | 
			
		||||
            mov ax, [bp+6]  ; se mueve a AX el n<>mero que va a ser multiplicado por 9,5
 | 
			
		||||
 | 
			
		||||
            shr ax, 1       ; se divide el n<>mero entre 2
 | 
			
		||||
            mov [bp-2], ax  ; se guarda el resultado en la variable local
 | 
			
		||||
 | 
			
		||||
            mov ax, [bp+6]  ; se mueve a AX de nuevo el n<>mero que va a ser multiplicado por 9,5
 | 
			
		||||
 | 
			
		||||
            shl ax, 1       ; se multiplica AX por 8 por el m<>todo de los desplazamientos
 | 
			
		||||
            shl ax, 1
 | 
			
		||||
            shl ax, 1
 | 
			
		||||
 | 
			
		||||
            add ax, [bp+6]  ; se suma el resultado de la multiplicaci<63>n con el
 | 
			
		||||
                            ; n<>mero para obtener el producto de <20>ste por 9
 | 
			
		||||
 | 
			
		||||
            add ax, [bp-2]  ; se suma la mitad del n<>mero original al resultado de
 | 
			
		||||
                            ; multiplicar por 9
 | 
			
		||||
 | 
			
		||||
            mov [si], ax    ; se mueve al campo resultado
 | 
			
		||||
 | 
			
		||||
            pop si          ; se recupera el valor inicial de SI
 | 
			
		||||
 | 
			
		||||
            mov sp, bp      ; se elimina la variable local
 | 
			
		||||
 | 
			
		||||
            pop bp          ; se recupera el valor inicial de BP
 | 
			
		||||
 | 
			
		||||
            ret 4           ; finaliza el proceso restaurando la pila
 | 
			
		||||
 | 
			
		||||
Multiplica  ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Numero    WORD 1000h
 | 
			
		||||
Producto  WORD   ?
 | 
			
		||||
 | 
			
		||||
segmento  ENDS
 | 
			
		||||
          END  principal
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								CDS/EJEMPLO4.COM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDS/EJEMPLO4.COM
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										395
									
								
								E/ASM.DOC
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								E/ASM.DOC
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,395 @@
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                               THE ARROWSOFT ASSEMBLER
 | 
			
		||||
                                          
 | 
			
		||||
                             Public Domain Version 1.00D
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                    User's Guide
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                                          
 | 
			
		||||
                 The Arrowsoft Assembler Program and Manual are both
 | 
			
		||||
                    Copyright (C) 1986 by Arrowsoft Systems, Inc.
 | 
			
		||||
                                554 West Sixth Avenue
 | 
			
		||||
                                 Larkview, MO  66069
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler v1.00                            User's Guide
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                    INTRODUCTION
 | 
			
		||||
          
 | 
			
		||||
          Thank  you  for  trying  out  the  public  domain  version of our
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler.  We feel that the best way to alert you, the 
 | 
			
		||||
 | 
			
		||||
          programmer, to our fine line of professional products is  to  let
 | 
			
		||||
 | 
			
		||||
          you use one.  Once you have experienced the high quality and ease 
 | 
			
		||||
 | 
			
		||||
          of  use  of  this  free product, we hope that you will contact us
 | 
			
		||||
 | 
			
		||||
          regarding our other software (our address is on the cover of this 
 | 
			
		||||
 | 
			
		||||
          manual).  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          You will no doubt notice that this manual is not  exhaustive;  in
 | 
			
		||||
 | 
			
		||||
          fact,  it  includes  the  least  amount of information we felt we
 | 
			
		||||
 | 
			
		||||
          could include without robbing  the  program  of  its  usefulness.
 | 
			
		||||
 | 
			
		||||
          There  are  two reasons for the brevity of this manual: First, we
 | 
			
		||||
 | 
			
		||||
          have targeted professional software developers with our products, 
 | 
			
		||||
 | 
			
		||||
          and we suspect that an  experienced  professional  will  have  no
 | 
			
		||||
 | 
			
		||||
          trouble  figuring out how to use the Arrowsoft Assembler with the
 | 
			
		||||
 | 
			
		||||
          information given; second, the program is, after all, free and we 
 | 
			
		||||
 | 
			
		||||
          feel that the quality of this assembler will more that compensate 
 | 
			
		||||
 | 
			
		||||
          you for the time you spend learning to use it.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          Please note that this is NOT a supported product.  If you contact 
 | 
			
		||||
 | 
			
		||||
          us, we will be happy to discuss our line of software but we  will
 | 
			
		||||
 | 
			
		||||
          NOT answer questions about the Arrowsoft Assembler.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          Again, we thank you for giving our product a try.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          (NOTE: 'Microsoft' and 'Microsoft Macro Assembler' are trademarks 
 | 
			
		||||
 | 
			
		||||
          of  Microsoft  Corporation.  'Arrowsoft', 'Arrowsoft Professional
 | 
			
		||||
 | 
			
		||||
          Assembler' and 'Super Link' are trademarks of Arrowsoft  Systems,
 | 
			
		||||
 | 
			
		||||
          Inc.) 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                                      OVERVIEW
 | 
			
		||||
          
 | 
			
		||||
          The  Arrowsoft Assembler takes as its input 8086, 8088, 80186 and
 | 
			
		||||
 | 
			
		||||
          80286 assembly language source  files  and  produces  relocatable
 | 
			
		||||
 | 
			
		||||
          object  modules  which may be linked and run under the MS-DOS and
 | 
			
		||||
 | 
			
		||||
          PC-DOS operating systems.  The syntax of the  input  files  is  a
 | 
			
		||||
 | 
			
		||||
          superset  of  that  accepted  by  the  Microsoft  Macro Assembler
 | 
			
		||||
 | 
			
		||||
          (versions 3.0 and later).  In fact, most programs written for the 
 | 
			
		||||
 | 
			
		||||
          Microsoft product should assemble without modification  with  the
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          The  remaining sections of this manual will cover, in this order,
 | 
			
		||||
 | 
			
		||||
          assembler command line options,  input  language  specifications,
 | 
			
		||||
 | 
			
		||||
          linking  and execution of assembled object modules, and assembler
 | 
			
		||||
 | 
			
		||||
          error messages.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                          INVOKING THE ARROWSOFT ASSEMBLER
 | 
			
		||||
          
 | 
			
		||||
          You may run the Arrowsoft  Assembler  interactively  or  directly
 | 
			
		||||
 | 
			
		||||
          from the   DOS   command   line.      To   invoke  the  assembler
 | 
			
		||||
 | 
			
		||||
          interactively, simply type 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                         -1-
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler v1.00                            User's Guide
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                   asm
 | 
			
		||||
          
 | 
			
		||||
          at the DOS prompt and follow the ensuing instructions.    To  run
 | 
			
		||||
 | 
			
		||||
          the assembler non-interactively, use the following syntax: 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
                   asm source [,object] [,list] [,xref] [options] [;]
 | 
			
		||||
          
 | 
			
		||||
          where  'source'  is  a  filespec  for  the  source  file (default
 | 
			
		||||
 | 
			
		||||
          extension .ASM), 'object' is  a  filespec  for  the  object  file
 | 
			
		||||
 | 
			
		||||
          (default  extension  .OBJ),  'list' is a filespec for the listing
 | 
			
		||||
 | 
			
		||||
          file (default extension .LST) and 'xref' is a  filespec  for  the
 | 
			
		||||
 | 
			
		||||
          cross-reference  file  (default  extension  .CRF).  Note that all
 | 
			
		||||
 | 
			
		||||
          filespecs may consist of a drive letter, a pathname,  a  filename
 | 
			
		||||
 | 
			
		||||
          and an  extension.    If  the  object  file is not specified, the
 | 
			
		||||
 | 
			
		||||
          assembler will use the source filename with the  .OBJ  extension.
 | 
			
		||||
 | 
			
		||||
          If  the  list  and  cross-reference  files are not specified, the
 | 
			
		||||
 | 
			
		||||
          assembler will not produce them.  Finally, the semicolon (;) will 
 | 
			
		||||
 | 
			
		||||
          force the assembler to assume default values for any  unspecified
 | 
			
		||||
 | 
			
		||||
          parameters.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                                    OPTION CODES
 | 
			
		||||
          
 | 
			
		||||
          The options  list  consists of a sequence of option codes.  These
 | 
			
		||||
 | 
			
		||||
          option codes consist of a slash (/) or dash (-) followed  by  one
 | 
			
		||||
 | 
			
		||||
          or more letters, case being insignificant.  Most of these options 
 | 
			
		||||
 | 
			
		||||
          are compatible with Microsoft conventions.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
                   /A             Write segments in alphabetical order
 | 
			
		||||
                   /Bnumber       Set buffer size
 | 
			
		||||
                   /Dsymbol       Define assembler symbol
 | 
			
		||||
                   /E             Generate 8087/80287 emulator code
 | 
			
		||||
                   /Ipath         Set 'include' search path
 | 
			
		||||
                   /ML            Case sensitive internal labels
 | 
			
		||||
                   /MX            Case sensitive external and public labels
 | 
			
		||||
                   /MU            Convert labels to uppercase
 | 
			
		||||
                   /R             Generate 8087/80287 floating point code
 | 
			
		||||
                   /S             Write segments in source code order
 | 
			
		||||
                   /X             Include false conditionals in listing
 | 
			
		||||
                   /Z             Display error lines on screen
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          Many  of  these  command  line  options are self explanatory; for
 | 
			
		||||
 | 
			
		||||
          whose which aren't, see the descriptions below: 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          /B Set Buffer Size 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          Sets the size of the buffer used to hold the source  file  during
 | 
			
		||||
 | 
			
		||||
          assembly.   The  'number'  is the number of 1K pages reserved for
 | 
			
		||||
 | 
			
		||||
          use as a buffer.  You may  set  the  buffer  size  to  any  value
 | 
			
		||||
 | 
			
		||||
          between  1K  and  63K;  default  buffer  size is 32K. Note that a
 | 
			
		||||
 | 
			
		||||
          larger buffer can speed assembly of large files considerably.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          /E Generate 8087/80287 Emulator Code 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                         -2-
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler v1.00                            User's Guide
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          If you are writing programs for use with the  8087/80287  numeric
 | 
			
		||||
 | 
			
		||||
          processor on a machine which does not have the processor, and you 
 | 
			
		||||
 | 
			
		||||
          have  an  8087/80287  emulator  library  available, the /E option
 | 
			
		||||
 | 
			
		||||
          directs the assembler to generate code for the emulator.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          /I Set 'include' file search paths 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          You may direct the assembler to search up to  5  directories  for
 | 
			
		||||
 | 
			
		||||
          'include'  files  by  including  a  '/Ipath'  command for EACH of
 | 
			
		||||
 | 
			
		||||
          them.  For example,  to  set  the  search  paths  '\bin\lib'  and
 | 
			
		||||
 | 
			
		||||
          '\asm\lib',   include   the   following  in  your  options  list:
 | 
			
		||||
 | 
			
		||||
          /I\bin\lib/I\asm\lib.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          /R 
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          This option directs the assembler to generate floating point code 
 | 
			
		||||
 | 
			
		||||
          for the  8087/80287  numeric  processor.    Note  that   programs
 | 
			
		||||
 | 
			
		||||
          assembled  with  the  '/R' option will run ONLY on machines which
 | 
			
		||||
 | 
			
		||||
          have an 8087/80287 installed.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                             ARROWSOFT ASSEMBLY LANGUAGE
 | 
			
		||||
          
 | 
			
		||||
          As we mentioned earlier, the Arrowsoft  Assembly  Language  is  a
 | 
			
		||||
 | 
			
		||||
          superset of the well-known Microsoft Macro Assembler Language. We 
 | 
			
		||||
 | 
			
		||||
          modeled  our system after Microsoft's for two reasons: First, the
 | 
			
		||||
 | 
			
		||||
          language has a flexible and moderately powerful  macro  facility;
 | 
			
		||||
 | 
			
		||||
          second,  and for this public domain project most important, there
 | 
			
		||||
 | 
			
		||||
          is a plethora of third-party books which explain how  to  program
 | 
			
		||||
 | 
			
		||||
          using the  Microsoft product.  We recommend that you purchase one
 | 
			
		||||
 | 
			
		||||
          of these guides if  you  are  not  familiar  with  8086  assembly
 | 
			
		||||
 | 
			
		||||
          language.   If  you  would  like  to  take  advantage of the many
 | 
			
		||||
 | 
			
		||||
          extensions to the Microsoft Language we have implemented  in  the
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler, you must do one of two things: Try to figure 
 | 
			
		||||
 | 
			
		||||
          them  out  for  yourself  (using  experimentation, disassembly or
 | 
			
		||||
 | 
			
		||||
          anything else you can think of); or  you  can  contact  us  about
 | 
			
		||||
 | 
			
		||||
          purchasing  the  Arrowsoft Professional Assembler, which includes
 | 
			
		||||
 | 
			
		||||
          the complete documentation.  Again, please DO NOT CALL  us  about
 | 
			
		||||
 | 
			
		||||
          the  Arrowsoft  Assembler;  we  will  not answer any questions or
 | 
			
		||||
 | 
			
		||||
          provide clues as  to  how  to  access  the  assembler's  advanced
 | 
			
		||||
 | 
			
		||||
          features.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
          
 | 
			
		||||
                   LINKING AND EXECUTING ARROWSOFT OBJECT MODULES
 | 
			
		||||
          
 | 
			
		||||
          The Arrowsoft Assembler produces relocatable object modules which 
 | 
			
		||||
 | 
			
		||||
          are  compatible  with  the Microsoft 8086 Object Linker (versions
 | 
			
		||||
 | 
			
		||||
          3.0 and later).   This  means  that  programs  assembled  by  the
 | 
			
		||||
 | 
			
		||||
          Arrowsoft   Assembler   may   be   linked  with  other  Microsoft
 | 
			
		||||
 | 
			
		||||
          Linker-compatible programs  generated  by  other  assemblers  and
 | 
			
		||||
 | 
			
		||||
          compilers.   If  you  need  more  information  on  how to use the
 | 
			
		||||
 | 
			
		||||
          Microsoft 8086 Object Linker, see your DOS or Microsoft  language
 | 
			
		||||
 | 
			
		||||
          manual.  
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                         -3-
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          Arrowsoft Assembler v1.00                            User's Guide
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								E/M.MAP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								E/M.MAP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
 | 
			
		||||
 Start  Stop   Length Name               Class
 | 
			
		||||
 | 
			
		||||
 00000H 0001EH 0001FH PRIMERO            CODE
 | 
			
		||||
 | 
			
		||||
Program entry point at 0000:0000
 | 
			
		||||
Warning: No stack
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										195
									
								
								LETC.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								LETC.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,195 @@
 | 
			
		||||
#include <conio.h>
 | 
			
		||||
 | 
			
		||||
void Letrero(int AX_register );
 | 
			
		||||
char  mi_estruct[] = "Esto solo es una prueba, de mi primer programa en Assembly      JD     $                                                                                                                                                                     000018000000000000";
 | 
			
		||||
 | 
			
		||||
long dir_fuentes;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void main( void )
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Letrero( 1 );
 | 
			
		||||
 | 
			
		||||
 while( !kbhit() )
 | 
			
		||||
          Letrero( 0 );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Letrero(int AX_register )
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 asm{
 | 
			
		||||
 | 
			
		||||
 push DS
 | 
			
		||||
 mov AX, SEG mi_estruct
 | 
			
		||||
 mov DS, AX
 | 
			
		||||
 mov SI, OFFSET mi_estruct
 | 
			
		||||
 | 
			
		||||
 mov AX,  AX_register
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//; Funci<63>n para generar un letrero digital 100 % ASM
 | 
			
		||||
//;
 | 
			
		||||
//; Entradas:
 | 
			
		||||
//;               SI              ptr a las estructura de datos 256 bytes
 | 
			
		||||
//;
 | 
			
		||||
//;                      237 cadena a mostrar en el letrero: el final es $
 | 
			
		||||
//;                        2 posici<63>n X
 | 
			
		||||
//;                        2 posici<63>n Y
 | 
			
		||||
//;                        1 (1nibble Escala X | 2nibble Escala Y )
 | 
			
		||||
//;                        1 n<>mero de d<>gitos a mostrar en pantalla
 | 
			
		||||
//;                        1 color de fondo
 | 
			
		||||
//;                        1 color principal
 | 
			
		||||
//;                     -----------------------------------------------
 | 
			
		||||
//;                        1 posici<63>n dentro de la cadena
 | 
			
		||||
//;                        1 posici<63>n en el byte
 | 
			
		||||
//;                        8 FUTURA AMPLIACI<43>N
 | 
			
		||||
//;
 | 
			
		||||
//;               AX              si 1, inicializa nuestra informacion
 | 
			
		||||
//;
 | 
			
		||||
 | 
			
		||||
//;  letrero_digital  PROC near    //;--------------------------------------------
 | 
			
		||||
 | 
			
		||||
        cmp AX, 1               //;  si no hay que inicializar nada,
 | 
			
		||||
        jne generar_digitos     //;  empezamos a generar los d<>gitos
 | 
			
		||||
 | 
			
		||||
        mov AX, 1130h           //;  obtenemos la direccion del juego
 | 
			
		||||
        mov BH,   03h           //;  de caracteres 8x8 de la ROM ( 0 - 127 )
 | 
			
		||||
        int 10h                 //;  Funci<63>n de video 10h
 | 
			
		||||
 | 
			
		||||
        mov [dir_fuentes],   ES   //;  guardamos el segmento en dir_fuentes
 | 
			
		||||
        mov [dir_fuentes+2], BP   //;  guardamos el offset en dir_fuentes
 | 
			
		||||
 | 
			
		||||
        mov [SI + F6h], 0       //;  posicion dentro de la cadena <-- 0
 | 
			
		||||
        mov [SI + F7h], 0       //;  posicion dentro del byte <------ 0
 | 
			
		||||
 | 
			
		||||
     generar_digitos:
 | 
			
		||||
 | 
			
		||||
        mov BH, [ SI + F3h ]    //;  n<> de digitos a mostar
 | 
			
		||||
 | 
			
		||||
        push  [ SI + F6h ]      //;  guardo el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        mov BP, [ SI + F6h ]    //;  posicion dentro de la cadena
 | 
			
		||||
        add BP, SI              //;  posicion del digito a procesar
 | 
			
		||||
                
 | 
			
		||||
        mov AL, [BP]            //;  digito a procesar
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
     nuevo_digito:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0
 | 
			
		||||
        mov CL, 3               //;  multiplico por 8 AX para tener la
 | 
			
		||||
        shl AX, CL              //;  posicion dentro de la ROM
 | 
			
		||||
                                
 | 
			
		||||
        add AX, dir_fuentes+2   //;  cargo AX con la direccion de la letra
 | 
			
		||||
 | 
			
		||||
        mov CH, 0               //; recorre las 8 filas ( 0 - 7 )
 | 
			
		||||
 | 
			
		||||
     siguiente_fila:
 | 
			
		||||
 | 
			
		||||
//; **************************
 | 
			
		||||
         mov DH, 0
 | 
			
		||||
         mov DL, CH
 | 
			
		||||
         add AX, DX
 | 
			
		||||
//;        add AX, CH              //;  direccion por fila de la letra a recorrer
 | 
			
		||||
//; **************************
 | 
			
		||||
        mov BL, dir_fuentes:[AX]//;  colocamos en BL la fila del digito a tratar
 | 
			
		||||
 | 
			
		||||
        mov CL, 8               //;  recorre los 8 puntos horizontales
 | 
			
		||||
     
 | 
			
		||||
     sigue_horizontal:
 | 
			
		||||
 | 
			
		||||
//; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        mov DH, [SI+238]        //;  coordenada x inicial
 | 
			
		||||
        mov DL, [SI+240]        //;  coordenada y inicial
 | 
			
		||||
 | 
			
		||||
        add DL, CH              //;  coordenada y final
 | 
			
		||||
 | 
			
		||||
        mov AL, [SI+F3]         //; n<> de digitos a mostar
 | 
			
		||||
        sub AL, BH              //; ndm - digitos que quedan = digitos mostrados
 | 
			
		||||
 | 
			
		||||
        mov CL, 3               //;
 | 
			
		||||
        shl AL, CL              //; multiplico por 8 los digitos mostrados
 | 
			
		||||
 | 
			
		||||
        add DH, AL              //; coordenada y final
 | 
			
		||||
                        
 | 
			
		||||
        mov AH,   02h
 | 
			
		||||
        mov BH,    1h
 | 
			
		||||
        int 10h
 | 
			
		||||
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
//; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
//; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        shl BL, 1               //;  dezplaza 1 bit a la izquierda
 | 
			
		||||
 | 
			
		||||
        jc punto_letrero_on
 | 
			
		||||
 | 
			
		||||
        mov AL, 32d
 | 
			
		||||
                    
 | 
			
		||||
        jmp fin_punto
 | 
			
		||||
 | 
			
		||||
     punto_letrero_on:
 | 
			
		||||
 | 
			
		||||
        mov AL, 43d
 | 
			
		||||
 | 
			
		||||
     fin_punto:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0Ah
 | 
			
		||||
        mov BH,  1h
 | 
			
		||||
        mov CX,  1h
 | 
			
		||||
        int 10h
 | 
			
		||||
        
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
//; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
 | 
			
		||||
        dec CL                  //;
 | 
			
		||||
        jnz sigue_horizontal    //;  continua hasta los 8 bit's
 | 
			
		||||
 | 
			
		||||
        inc CH                  //;
 | 
			
		||||
        cmp CH, 8               //;
 | 
			
		||||
        jne siguiente_fila      //;  procesa las 8 filas
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        //;  inc el puntero de posicion
 | 
			
		||||
 | 
			
		||||
        mov BP, [ SI + F6h ]    //;  posicion dentro de la cadena
 | 
			
		||||
        add BP, SI              //;  posicion del digito a procesar
 | 
			
		||||
 | 
			
		||||
        mov AL, [BP]            //;  digito a procesar
 | 
			
		||||
 | 
			
		||||
        inc [SI + F6h]          //;  inc la posicion dentro de la frase
 | 
			
		||||
        cmp AL, '$'             //;  si no fin de frase continuo normalmente
 | 
			
		||||
        jne es_fin_frase        //;
 | 
			
		||||
        mov [SI + F6h], 0       //;  si no, posicion de frase == 0
 | 
			
		||||
 | 
			
		||||
     es_fin_frase:
 | 
			
		||||
 | 
			
		||||
        dec  BH                 //;  solo visualiza los digitos que manda el
 | 
			
		||||
        jnz  nuevo_digito       //;  usuario.
 | 
			
		||||
 | 
			
		||||
        pop  [ SI + F6h ]       //;  restauro el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        //;  actualizo la rotacion para la proxima vez
 | 
			
		||||
        cmp AL, '$'             //;
 | 
			
		||||
        je frase_rotada         //;
 | 
			
		||||
        mov [ SI + F6h ], 0     //;
 | 
			
		||||
 | 
			
		||||
     frase_rotada:
 | 
			
		||||
 | 
			
		||||
        RET                     //;  regreso de la llamada
 | 
			
		||||
 | 
			
		||||
//;    letrero_digital endp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  POP DS
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										204
									
								
								LETRERO.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								LETRERO.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,204 @@
 | 
			
		||||
Codigo segment
 | 
			
		||||
 | 
			
		||||
        assume cs:Codigo, ds:Datos, ss:Pila
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  display_frase PROC near       ;--------------------------------------------
 | 
			
		||||
 | 
			
		||||
        mov AX, 1
 | 
			
		||||
        mov SI, OFFSET mi_estruct
 | 
			
		||||
        CALL letrero_digital
 | 
			
		||||
 | 
			
		||||
        mov CX, FFFFh
 | 
			
		||||
       
 | 
			
		||||
  continua_un_rato:
 | 
			
		||||
 | 
			
		||||
        push CX
 | 
			
		||||
        mov AX, 0
 | 
			
		||||
        CALL letrero_digital
 | 
			
		||||
        pop CX
 | 
			
		||||
 | 
			
		||||
        loop continua_un_rato
 | 
			
		||||
 | 
			
		||||
        mov     ax,4c00h             ;no exit back to DOS
 | 
			
		||||
        int     21h                  ;DOS interrupt
 | 
			
		||||
 | 
			
		||||
  display_frase endp            ;--------------------------------------------
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Funci<63>n para generar un letrero digital 100 % ASM
 | 
			
		||||
;
 | 
			
		||||
; Entradas:
 | 
			
		||||
;               SI              ptr a las estructura de datos 256 bytes
 | 
			
		||||
;
 | 
			
		||||
;                      237 cadena a mostrar en el letrero: el final es $
 | 
			
		||||
;                        2 posici<63>n X
 | 
			
		||||
;                        2 posici<63>n Y
 | 
			
		||||
;                        1 (1nibble Escala X | 2nibble Escala Y )
 | 
			
		||||
;                        1 n<>mero de d<>gitos a mostrar en pantalla
 | 
			
		||||
;                        1 color de fondo
 | 
			
		||||
;                        1 color principal
 | 
			
		||||
;                     -----------------------------------------------
 | 
			
		||||
;                        1 posici<63>n dentro de la cadena
 | 
			
		||||
;                        1 posici<63>n en el byte
 | 
			
		||||
;                        8 FUTURA AMPLIACI<43>N
 | 
			
		||||
;
 | 
			
		||||
;               AX              si 1, inicializa nuestra informacion
 | 
			
		||||
;
 | 
			
		||||
                                
 | 
			
		||||
  letrero_digital  PROC near    ;--------------------------------------------
 | 
			
		||||
 | 
			
		||||
        cmp AX, 1               ;  si no hay que inicializar nada,
 | 
			
		||||
        jne generar_digitos     ;  empezamos a generar los d<>gitos
 | 
			
		||||
 | 
			
		||||
        mov AX, 1130h           ;  obtenemos la direccion del juego
 | 
			
		||||
        mov BH,   03h           ;  de caracteres 8x8 de la ROM ( 0 - 127 )
 | 
			
		||||
        int 10h                 ;  Funci<63>n de video 10h
 | 
			
		||||
 | 
			
		||||
        mov dir_fuentes,   ES   ;  guardamos el segmento en dir_fuentes
 | 
			
		||||
        mov dir_fuentes+2, BP   ;  guardamos el offset en dir_fuentes
 | 
			
		||||
 | 
			
		||||
        mov [SI + F6h], 0       ;  posicion dentro de la cadena <-- 0
 | 
			
		||||
        mov [SI + F7h], 0       ;  posicion dentro del byte <------ 0
 | 
			
		||||
 | 
			
		||||
     generar_digitos:
 | 
			
		||||
        
 | 
			
		||||
        mov BH, [ SI + F3h ]    ;  n<> de digitos a mostar
 | 
			
		||||
 | 
			
		||||
        push  [ SI + F6h ]      ;  guardo el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        mov BP, [ SI + F6h ]    ;  posicion dentro de la cadena
 | 
			
		||||
        add BP, SI              ;  posicion del digito a procesar
 | 
			
		||||
                
 | 
			
		||||
        mov AL, [BP]            ;  digito a procesar
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
     nuevo_digito:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0
 | 
			
		||||
        mov CL, 3               ;  multiplico por 8 AX para tener la
 | 
			
		||||
        shl AX, CL              ;  posicion dentro de la ROM
 | 
			
		||||
                                
 | 
			
		||||
        add AX, dir_fuentes+2   ;  cargo AX con la direccion de la letra
 | 
			
		||||
 | 
			
		||||
        mov CH, 0               ; recorre las 8 filas ( 0 - 7 )
 | 
			
		||||
 | 
			
		||||
     siguiente_fila:
 | 
			
		||||
 | 
			
		||||
; **************************
 | 
			
		||||
         mov DH, 0
 | 
			
		||||
         mov DL, CH
 | 
			
		||||
         add AX, DX
 | 
			
		||||
;        add AX, CH              ;  direccion por fila de la letra a recorrer
 | 
			
		||||
; **************************
 | 
			
		||||
        mov BL, dir_fuentes:[AX];  colocamos en BL la fila del digito a tratar
 | 
			
		||||
 | 
			
		||||
        mov CL, 8               ;  recorre los 8 puntos horizontales
 | 
			
		||||
     
 | 
			
		||||
     sigue_horizontal:
 | 
			
		||||
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        mov DH, [SI+238]        ;  coordenada x inicial
 | 
			
		||||
        mov DL, [SI+240]        ;  coordenada y inicial
 | 
			
		||||
 | 
			
		||||
        add DL, CH              ;  coordenada y final
 | 
			
		||||
 | 
			
		||||
        mov AL, [SI+F3]         ; n<> de digitos a mostar
 | 
			
		||||
        sub AL, BH              ; ndm - digitos que quedan = digitos mostrados
 | 
			
		||||
 | 
			
		||||
        mov CL, 3               ;
 | 
			
		||||
        shl AL, CL              ; multiplico por 8 los digitos mostrados
 | 
			
		||||
 | 
			
		||||
        add DH, AL              ; coordenada y final
 | 
			
		||||
                        
 | 
			
		||||
        mov AH,   02h
 | 
			
		||||
        mov BH,    1h
 | 
			
		||||
        int 10h
 | 
			
		||||
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        shl BL, 1               ;  dezplaza 1 bit a la izquierda
 | 
			
		||||
 | 
			
		||||
        jc punto_letrero_on
 | 
			
		||||
 | 
			
		||||
        mov AL, 32d
 | 
			
		||||
                    
 | 
			
		||||
        jmp fin_punto
 | 
			
		||||
 | 
			
		||||
     punto_letrero_on:
 | 
			
		||||
 | 
			
		||||
        mov AL, 43d
 | 
			
		||||
 | 
			
		||||
     fin_punto:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0Ah
 | 
			
		||||
        mov BH,  1h
 | 
			
		||||
        mov CX,  1h
 | 
			
		||||
        int 10h
 | 
			
		||||
        
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
 | 
			
		||||
        dec CL                  ;
 | 
			
		||||
        jnz sigue_horizontal    ;  continua hasta los 8 bit's
 | 
			
		||||
 | 
			
		||||
        inc CH                  ;
 | 
			
		||||
        cmp CH, 8               ;
 | 
			
		||||
        jne siguiente_fila      ;  procesa las 8 filas
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        ;  inc el puntero de posicion
 | 
			
		||||
 | 
			
		||||
        mov BP, [ SI + F6h ]    ;  posicion dentro de la cadena
 | 
			
		||||
        add BP, SI              ;  posicion del digito a procesar
 | 
			
		||||
 | 
			
		||||
        mov AL, [BP]            ;  digito a procesar
 | 
			
		||||
 | 
			
		||||
        inc [SI + F6h]          ;  inc la posicion dentro de la frase
 | 
			
		||||
        cmp AL, '$'             ;  si no fin de frase continuo normalmente
 | 
			
		||||
        jne es_fin_frase        ;
 | 
			
		||||
        mov [SI + F6h], 0       ;  si no, posicion de frase == 0
 | 
			
		||||
 | 
			
		||||
     es_fin_frase:
 | 
			
		||||
 | 
			
		||||
        dec  BH                 ;  solo visualiza los digitos que manda el 
 | 
			
		||||
        jnz  nuevo_digito       ;  usuario.
 | 
			
		||||
 | 
			
		||||
        pop  [ SI + F6h ]       ;  restauro el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        ;  actualizo la rotacion para la proxima vez
 | 
			
		||||
        cmp AL, '$'             ;
 | 
			
		||||
        je frase_rotada         ;
 | 
			
		||||
        mov [ SI + F6h ], 0     ;
 | 
			
		||||
 | 
			
		||||
     frase_rotada:
 | 
			
		||||
 | 
			
		||||
        RET                     ;  regreso de la llamada
 | 
			
		||||
 | 
			
		||||
    letrero_digital endp
 | 
			
		||||
 | 
			
		||||
Codigo ends
 | 
			
		||||
 | 
			
		||||
Datos segment para public 'data'
 | 
			
		||||
 | 
			
		||||
dir_fuentes     qb   FFFF0000h
 | 
			
		||||
 | 
			
		||||
        mi_estruct  db 'Esto solo es una prueba, de mi primer programa en Assembly      JD     $                                                                                                                                                                     000018000000000000'
 | 
			
		||||
 | 
			
		||||
Datos ends
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Pila segment stack 'stack'
 | 
			
		||||
 | 
			
		||||
        db 1000 dup (0)
 | 
			
		||||
 | 
			
		||||
Pila ends
 | 
			
		||||
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										200
									
								
								LETRERO.JD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								LETRERO.JD
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,200 @@
 | 
			
		||||
        NAME JD
 | 
			
		||||
        PAGE 60, 130
 | 
			
		||||
        TITLE 'MI PRIMER PROGRAMA EN ASM -->JD'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
UNICO    SEGMENT PARA PUBLIC 'CODE'
 | 
			
		||||
 | 
			
		||||
        ORG  0100H
 | 
			
		||||
 | 
			
		||||
        ASSUME CS:UNICO, DS:UNICO, ES:UNICO, SS:UNICO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
mi_estruct  db "Esto solo es una prueba, de mi primer programa en Assembly      JD     $                                                                                                                                                                     000018000000000000"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
diplay_frase PROC near
 | 
			
		||||
 | 
			
		||||
        mov AX, 1
 | 
			
		||||
        mov SI, OFFSET mi_estruct
 | 
			
		||||
        CALL letrero_digital
 | 
			
		||||
 | 
			
		||||
        mov CX, FFFFh
 | 
			
		||||
       
 | 
			
		||||
continua_un_rato:
 | 
			
		||||
 | 
			
		||||
        push CX
 | 
			
		||||
 | 
			
		||||
        mov AX, 0
 | 
			
		||||
        CALL letrero_digital
 | 
			
		||||
 | 
			
		||||
        pop CX
 | 
			
		||||
 | 
			
		||||
        loop continua_un_rato
 | 
			
		||||
 | 
			
		||||
        mov AX, 04c00h
 | 
			
		||||
        int 21h
 | 
			
		||||
 | 
			
		||||
display_frase endp
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
; Funci<63>n para generar un letrero digital 100 % ASM
 | 
			
		||||
;
 | 
			
		||||
; Entradas:
 | 
			
		||||
;               SI              ptr a las estructura de datos 256 bytes
 | 
			
		||||
;
 | 
			
		||||
;                      237 cadena a mostrar en el letrero: el final es $
 | 
			
		||||
;                        2 posici<63>n X
 | 
			
		||||
;                        2 posici<63>n Y
 | 
			
		||||
;                        1 (1nibble Escala X | 2nibble Escala Y )
 | 
			
		||||
;                        1 n<>mero de d<>gitos a mostrar en pantalla
 | 
			
		||||
;                        1 color de fondo
 | 
			
		||||
;                        1 color principal
 | 
			
		||||
;                     -----------------------------------------------
 | 
			
		||||
;                        1 posici<63>n dentro de la cadena
 | 
			
		||||
;                        1 posici<63>n en el byte
 | 
			
		||||
;                        8 FUTURA AMPLIACI<43>N
 | 
			
		||||
;
 | 
			
		||||
;               AX              si 1, inicializa nuestra informacion
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
dir_fuentes     db      4 DUP (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
letrero_digital  PROC near
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        cmp AX, 1               ;  si no hay que inicializar nada,
 | 
			
		||||
        jne generar_digitos     ;  empezamos a generar los d<>gitos
 | 
			
		||||
 | 
			
		||||
        mov AX, 1130h           ;  obtenemos la direccion del juego
 | 
			
		||||
        mov BH,   03h           ;  de caracteres 8x8 de la ROM ( 0 - 127 )
 | 
			
		||||
        int 10h                 ;  Funci<63>n de video 10h
 | 
			
		||||
 | 
			
		||||
        mov dir_fuentes,   ES   ;  guardamos el segmento en dir_fuentes
 | 
			
		||||
        mov dir_fuentes+2, BP   ;  guardamos el offset en dir_fuentes
 | 
			
		||||
 | 
			
		||||
        mov [SI + F6h], 0       ;  posicion dentro de la cadena <-- 0
 | 
			
		||||
        mov [SI + F7h], 0       ;  posicion dentro del byte <------ 0
 | 
			
		||||
 | 
			
		||||
 generar_digitos:
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        mov BH, [ SI + F3h ]    ;  n<> de digitos a mostar
 | 
			
		||||
 | 
			
		||||
        push  [ SI + F6h ]      ;  guardo el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        mov AX, [ SI + F6h ]    ;  posicion dentro de la cadena
 | 
			
		||||
        add AX, SI              ;  posicion del digito a procesar
 | 
			
		||||
        mov AL, [AX]            ;  digito a procesar
 | 
			
		||||
 | 
			
		||||
 nuevo_digito:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0
 | 
			
		||||
        mov CL, 3               ;  multiplico por 8 AX para tener la
 | 
			
		||||
        shl AX, CL              ;  posicion dentro de la ROM
 | 
			
		||||
                                
 | 
			
		||||
        add AX, dir_fuentes+2   ;  cargo AX con la direccion de la letra
 | 
			
		||||
 | 
			
		||||
        mov CH, 0               ; recorre las 8 filas ( 0 - 7 )
 | 
			
		||||
 | 
			
		||||
 siguiente_fila:
 | 
			
		||||
 | 
			
		||||
        add AX, CH              ;  direccion por fila de la letra a recorrer
 | 
			
		||||
        mov BL, dir_fuentes:[AX];  colocamos en BL la fila del digito a tratar
 | 
			
		||||
 | 
			
		||||
        mov CL, 8               ;  recorre los 8 puntos horizontales
 | 
			
		||||
     
 | 
			
		||||
 sigue_horizontal:
 | 
			
		||||
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        mov DH, [SI+238]        ;  coordenada x inicial
 | 
			
		||||
        mov DL, [SI+240]        ;  coordenada y inicial
 | 
			
		||||
 | 
			
		||||
        add DL, CH              ;  coordenada y final
 | 
			
		||||
 | 
			
		||||
        mov AL, [SI+F3]         ; n<> de digitos a mostar
 | 
			
		||||
        sub AL, BH              ; ndm - digitos que quedan = digitos mostrados
 | 
			
		||||
 | 
			
		||||
        mov CL, 3               ;
 | 
			
		||||
        shl AL, CL              ; multiplico por 8 los digitos mostrados
 | 
			
		||||
 | 
			
		||||
        add DH, AL              ; coordenada y final
 | 
			
		||||
                        
 | 
			
		||||
        mov AH,   02h
 | 
			
		||||
        mov BH,    1h
 | 
			
		||||
        int 10h
 | 
			
		||||
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
        push AX        push BX        push CX
 | 
			
		||||
 | 
			
		||||
        shl BL, 1               ;  dezplaza 1 bit a la izquierda
 | 
			
		||||
 | 
			
		||||
        jc punto_letrero_on
 | 
			
		||||
 | 
			
		||||
        mov AL, 32d
 | 
			
		||||
                    
 | 
			
		||||
        jmp fin_punto
 | 
			
		||||
 | 
			
		||||
punto_letrero_on:
 | 
			
		||||
 | 
			
		||||
        mov AL, 43d
 | 
			
		||||
 | 
			
		||||
fin_punto:
 | 
			
		||||
 | 
			
		||||
        mov AH, 0Ah
 | 
			
		||||
        mov BH,  1h
 | 
			
		||||
        mov CX,  1h
 | 
			
		||||
        int 10h
 | 
			
		||||
        
 | 
			
		||||
        pop CX        pop BX        pop AX
 | 
			
		||||
; ************************** muestro en (x,y) un punto o un espacio
 | 
			
		||||
 | 
			
		||||
        dec CL                  ;
 | 
			
		||||
        jnz sigue_horizontal    ;  continua hasta los 8 bit's
 | 
			
		||||
 | 
			
		||||
        inc CH                  ;
 | 
			
		||||
        cmp CH, 8               ;
 | 
			
		||||
        jne siguiente_fila      ;  procesa las 8 filas
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        ;  inc el puntero de posicion
 | 
			
		||||
 | 
			
		||||
        mov AX, [ SI + F6h ]    ;  posicion dentro de la cadena
 | 
			
		||||
        add AX, SI              ;  posicion del digito a procesar
 | 
			
		||||
        mov AL, [AX]            ;  digito a procesar
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
        inc [SI + F6h]          ;  inc la posicion dentro de la frase
 | 
			
		||||
        cmp AL, '$'             ;  si no fin de frase continuo normalmente
 | 
			
		||||
        jne es_fin_frase        ;
 | 
			
		||||
        mov [SI + F6h], 0       ;  si no, posicion de frase == 0
 | 
			
		||||
 | 
			
		||||
 es_fin_frase:
 | 
			
		||||
 | 
			
		||||
        dec  BH                 ;  solo visualiza los digitos que manda el 
 | 
			
		||||
        jnz  nuevo_digito       ;  usuario.
 | 
			
		||||
 | 
			
		||||
        pop  [ SI + F6h ]       ;  restauro el contenido original de la pos.
 | 
			
		||||
 | 
			
		||||
        inc [ SI + F6h ]        ;  actualizo la rotacion para la proxima vez
 | 
			
		||||
        cmp AL, '$'             ;
 | 
			
		||||
        je frase_rotada         ;
 | 
			
		||||
        mov [ SI + F6h ], 0     ;
 | 
			
		||||
 | 
			
		||||
 frase_rotada:
 | 
			
		||||
 | 
			
		||||
        RET                     ;  regreso de la llamada
 | 
			
		||||
 | 
			
		||||
letrero_digital endp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
UNICO ends
 | 
			
		||||
 | 
			
		||||
        end
 | 
			
		||||
							
								
								
									
										21
									
								
								M.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								M.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
primero segment para public 'CODE'
 | 
			
		||||
 | 
			
		||||
                              
 | 
			
		||||
        assume cs:primero, ds:primero, ss:primero
 | 
			
		||||
 | 
			
		||||
        inicial proc near
 | 
			
		||||
 | 
			
		||||
                    mov DX, offset ds:cadenatexto
 | 
			
		||||
                    mov AH, 09h
 | 
			
		||||
                    int 21h
 | 
			
		||||
 | 
			
		||||
                    mov ax, 04c00h
 | 
			
		||||
                    int 21h
 | 
			
		||||
 | 
			
		||||
        inicial endp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        cadenatexto db "Esto es una prueba$"
 | 
			
		||||
 | 
			
		||||
primero ends
 | 
			
		||||
 end 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								NONAME00.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NONAME00.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NONAME00.TFA
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NONAME00.TFA
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										454
									
								
								V/BROWSE.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										454
									
								
								V/BROWSE.ASM
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,454 @@
 | 
			
		||||
;	BROWSE.ASM -- Full Screen File Pager
 | 
			
		||||
;	====================================
 | 
			
		||||
 | 
			
		||||
CSEG		Segment para public 'code'
 | 
			
		||||
		Assume	CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
 | 
			
		||||
		Org	0080h
 | 
			
		||||
Parameter	Label	Byte
 | 
			
		||||
		Org	0100h
 | 
			
		||||
Entry:		Jmp Begin
 | 
			
		||||
 | 
			
		||||
;	All Data
 | 
			
		||||
;	--------
 | 
			
		||||
 | 
			
		||||
		db	'ATTR='
 | 
			
		||||
Attribute	db	0		; Current screen attribute
 | 
			
		||||
		db	'SHIFT='
 | 
			
		||||
ShiftHoriz	db	8		; Horizontal shift screen default
 | 
			
		||||
DosVersionFail	db	'Requires DOS 2.0 or above$'
 | 
			
		||||
NoSpaceFail	db	'Not enough memory$'
 | 
			
		||||
FileFail	db	'File Not Found$'
 | 
			
		||||
ScreenFail	db	'Unsupported video mode$'
 | 
			
		||||
Delimiters	db	9,' ,;=/'	; Delimiters in parameter
 | 
			
		||||
FileHandle	dw	?		; Use for saving file handle
 | 
			
		||||
WSMode		db	0FFh		; AND value for non-WordStar mode
 | 
			
		||||
LineLength	db	?		; Length of line (from BIOS)
 | 
			
		||||
NumberLines	db	25,0		; Number of lines (check EGA BIOS)
 | 
			
		||||
ScreenSize	dw	?		; Size of screen in bytes
 | 
			
		||||
CheckRetrace	db	1		; Flag zero if EGA or MONO used
 | 
			
		||||
Addr6845	dw	?		; Could use for retrace check	
 | 
			
		||||
ScreenAddr	Label	DWord		; Address of screen
 | 
			
		||||
ScreenOff	dw	0		; Higher for non-page 0
 | 
			
		||||
ScreenSeg	dw	0B800h		; Set to B000h for Mono Mode 7
 | 
			
		||||
ScreenStart	dw	?		; Points within buffer 
 | 
			
		||||
EndOfFile	dw	?		; Points within buffer
 | 
			
		||||
FileOffset	dw	-1, -1		; Address within file of buffer data
 | 
			
		||||
HorizOffset	dw	0		; Horizontal offset for display	
 | 
			
		||||
RightMargin	dw	0		; Right margin for offset display
 | 
			
		||||
Dispatch	dw	Home, Up, PgUp, Dummy, Left
 | 
			
		||||
		dw	Dummy, Right, Dummy, Ending, Down, PgDn
 | 
			
		||||
 | 
			
		||||
;	Check DOS Version for 2.0 or above
 | 
			
		||||
;	----------------------------------
 | 
			
		||||
 | 
			
		||||
Begin:		Cld			; All string directions forward
 | 
			
		||||
		Mov	AH,30h
 | 
			
		||||
		Int	21h		; Get DOS Version Number
 | 
			
		||||
		Cmp	AL,2		; Check for 2.0 or later
 | 
			
		||||
		Jae	DOSVerOK
 | 
			
		||||
		Mov	DX,Offset DOSVersionFail
 | 
			
		||||
ErrorExit:	Mov	AH,9		; Write error message
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Int	20h
 | 
			
		||||
 | 
			
		||||
;	Parse Command Line to get File Name and WordStar flag
 | 
			
		||||
;	-----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
DOSVerOK:	Mov	SI,1 + Offset Parameter	; Points to parameter
 | 
			
		||||
NameSearch:	Lodsb				; Get byte
 | 
			
		||||
		Cmp	AL,13			; Check if carriage return
 | 
			
		||||
		Jz	NoFileFound		; If so, no file name
 | 
			
		||||
		Mov	DI,Offset Delimiters	; String of delimiters
 | 
			
		||||
		Mov	CX,5			; Number of delimiters (no /)
 | 
			
		||||
		Repne	Scasb			; See if a match
 | 
			
		||||
		Je	NameSearch		; If a delimiter, keep looking
 | 
			
		||||
		Mov	DX,SI			; Otherwise found file name
 | 
			
		||||
		Dec	DX			; Points to beginning of it
 | 
			
		||||
EndSearch:	Lodsb				; Get next byte
 | 
			
		||||
		Cmp	AL,13			; See if carriage return
 | 
			
		||||
		Je	GotFileEnd		; If so, we're all done
 | 
			
		||||
		Mov	DI,Offset Delimiters	; String of delimiters
 | 
			
		||||
		Mov	CX,6			; Number (including /)
 | 
			
		||||
		Repne	Scasb			; See if a match
 | 
			
		||||
		Jne	EndSearch		; If not, still in file name
 | 
			
		||||
		Mov	Byte Ptr [SI - 1],0	; If so, mark end of file name
 | 
			
		||||
		Jcxz	GotFlag			; If slash, check for W
 | 
			
		||||
		Jmp	EndSearch		; Or continue flag search
 | 
			
		||||
GotFlag:	Lodsb				; Get byte after / flag
 | 
			
		||||
		Or	AL,20h			; Uncapitalize
 | 
			
		||||
		Cmp	AL,'w'			; See if w for WordStar mode
 | 
			
		||||
		Jnz	GotFileEnd		; If not, just ignore it
 | 
			
		||||
		Mov	[WSMode],7Fh		; AND value for WordStar
 | 
			
		||||
 | 
			
		||||
;	Open the File
 | 
			
		||||
;	-------------
 | 
			
		||||
 | 
			
		||||
GotFileEnd:	Mov	Byte Ptr [SI - 1],0	; Mark end of file name
 | 
			
		||||
						; DX still points to name
 | 
			
		||||
		Mov	AX,3D00h		; Open file for reading
 | 
			
		||||
		Int	21h			;   by calling DOS
 | 
			
		||||
		Jnc	GotTheFile		; If no error, continue	
 | 
			
		||||
NoFileFound:	Mov	DX,Offset FileFail	; Otherwise print a message 
 | 
			
		||||
		Jmp	ErrorExit
 | 
			
		||||
GotTheFile:	Mov	[FileHandle],AX		; Save the file handle
 | 
			
		||||
 | 
			
		||||
;	Get Screen Mode Information from BIOS Data Area
 | 
			
		||||
;	-----------------------------------------------
 | 
			
		||||
 | 
			
		||||
		Push	ES			; Save register
 | 
			
		||||
		Sub	AX,AX
 | 
			
		||||
		Mov	ES,AX			; Set ES to 0 (BIOS Data)
 | 
			
		||||
		Mov	AL,ES:[0449h]		; Current Video Mode
 | 
			
		||||
		Cmp	AL,3			; Check if Color Alpha
 | 
			
		||||
		Jbe	DisplayOK		; Continue if so
 | 
			
		||||
		Cmp	AL,7			; Check if monochrome display
 | 
			
		||||
		Je	Monochrome		; If so, branch
 | 
			
		||||
		Mov	DX,Offset ScreenFail	; We can't handle graphics
 | 
			
		||||
		Jmp	ErrorExit		; So print an error message
 | 
			
		||||
Monochrome:	Mov	[ScreenSeg],0B000h	; Use Monochrome Segment
 | 
			
		||||
		Mov	[CheckRetrace],0	; Don't have to check retrace
 | 
			
		||||
DisplayOK:	Mov	AL,ES:[044Ah]		; Number of Columns
 | 
			
		||||
		Mov	[LineLength],AL		; Save it
 | 
			
		||||
		Mov	AX,ES:[044Eh]		; Offset into screen buffer
 | 
			
		||||
		Mov	[ScreenOff],AX		; Save it		 
 | 
			
		||||
		Mov	AX,ES:[0463h]		; Address of 6845 Regsiter
 | 
			
		||||
		Mov	[Addr6845],AX		; Save it
 | 
			
		||||
		Push	ES
 | 
			
		||||
		Sub	DL,DL			; Set Rows to zero first
 | 
			
		||||
		Sub	BH,BH
 | 
			
		||||
		Mov	AX,1130h		; EGA BIOS: Get Information
 | 
			
		||||
		Int	10h
 | 
			
		||||
		Pop	ES
 | 
			
		||||
		Or	DL,DL			; Check if DL is still zero
 | 
			
		||||
		Jz	NoEGA			; If so, skip rest of stuff
 | 
			
		||||
		Inc	DL
 | 
			
		||||
		Mov	[NumberLines],DL	; Save Number of Lines
 | 
			
		||||
		Test	Byte Ptr ES:[0487h],4	; Check if must check retrace
 | 
			
		||||
		Jnz	NoEGA
 | 
			
		||||
		Mov	[CheckRetrace],0	; EGA says we don't have to
 | 
			
		||||
NoEGA:		Mov	BH,ES:[0462h]		; Get Current Page (use later)
 | 
			
		||||
		Pop	ES
 | 
			
		||||
		Mov	AL,[LineLength]		; Length of each line
 | 
			
		||||
		Mul	[NumberLines]		; Total chars on screen
 | 
			
		||||
		Add	AX,AX			; Double for attributes
 | 
			
		||||
		Mov	[ScreenSize],AX		; And Save it
 | 
			
		||||
 | 
			
		||||
;	See if enough memory is left
 | 
			
		||||
;	----------------------------
 | 
			
		||||
 | 
			
		||||
		Add	AX,Offset ScreenHold	; Add ScreenSize to code end
 | 
			
		||||
		Add	AX,256			; Add a little stack room
 | 
			
		||||
		Cmp	AX,SP			; Check against stack pointer
 | 
			
		||||
		Jbe	GotEnufMemory		; Continue if OK
 | 
			
		||||
		Mov	DX,Offset NoSpaceFail	; Otherwise end program
 | 
			
		||||
		Jmp	ErrorExit		;    with error messae
 | 
			
		||||
		
 | 
			
		||||
;	Get Current Screen Attribute
 | 
			
		||||
;	---------------------------- 
 | 
			
		||||
 | 
			
		||||
GotEnufMemory:	Cmp	[Attribute],0		; Check if attribute pre-set
 | 
			
		||||
		Jnz	GotAttribute		; If so, move on
 | 
			
		||||
		Mov	DL,' '			; Write out a byte
 | 
			
		||||
		Mov	AH,2			;   using DOS
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Mov	AL,8			; Now backspace
 | 
			
		||||
		Mov	AH,14			;   using BIOS call
 | 
			
		||||
		Int	10h
 | 
			
		||||
		Mov	AH,8			; Read character & attribute
 | 
			
		||||
		Int	10h			;   using BIOS call (BH = pg)
 | 
			
		||||
		Mov	[Attribute],AH		; And save attribute
 | 
			
		||||
 | 
			
		||||
;	Save Current Screen
 | 
			
		||||
;	-------------------
 | 
			
		||||
 | 
			
		||||
GotAttribute:	Mov	DX,Offset Terminate	; Set Ctrl-Break exit
 | 
			
		||||
		Mov	AX,2523h		;   to terminate that way
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Mov	DI,Offset ScreenHold	; Destination of screen
 | 
			
		||||
		Mov	CX,[ScreenSize]		; Size of screen
 | 
			
		||||
		Push	DS			; Save Source Segment
 | 
			
		||||
		Lds	SI,[ScreenAddr]		; Get screen address
 | 
			
		||||
		Rep	Movsb			; Move in the bytes
 | 
			
		||||
		Pop	DS			; Restore Source Segment
 | 
			
		||||
 | 
			
		||||
;	Get Keyboard Key and Decide on Action
 | 
			
		||||
;	-------------------------------------
 | 
			
		||||
 | 
			
		||||
		Call	Home			; Read file in
 | 
			
		||||
		Mov	[ScreenStart],SI	; Set buffer address
 | 
			
		||||
KeyLoop:	Call	UpDateScreen		; Write file to screen
 | 
			
		||||
GetKey:		Mov	AH,8			; Get key
 | 
			
		||||
		Int	21h			;   by calling DOS
 | 
			
		||||
		Cmp	AL,27			; Check if ESC
 | 
			
		||||
		Je	Terminate		; If so, terminate 
 | 
			
		||||
		Cmp	AL,0			; Check if extended
 | 
			
		||||
		Jnz	GetKey			; If not, try again
 | 
			
		||||
		Mov	AH,8			; Get extended code
 | 
			
		||||
		Int	21h			;   by calling DOS
 | 
			
		||||
		Sub	AL,71			; Subtract Home key value
 | 
			
		||||
		Jb	GetKey			; If below that, not valid
 | 
			
		||||
		Cmp	AL,(81 - 71)		; Check if above PgDn
 | 
			
		||||
		Ja	GetKey			; If so, ignore it
 | 
			
		||||
		Sub	AH,AH			; Zero out top byte
 | 
			
		||||
		Add	AX,AX			; Double for word access
 | 
			
		||||
		Mov	BX,AX			; Offset in dispatch table
 | 
			
		||||
		Mov	SI,[ScreenStart]	; Set current buffer pointer
 | 
			
		||||
		Call	[Dispatch + BX]		; Do the call
 | 
			
		||||
		Mov	[ScreenStart],SI	; Set new buffer pointer
 | 
			
		||||
		Jmp	KeyLoop			; And update the screen
 | 
			
		||||
 | 
			
		||||
;	Terminate -- Restore screen and close file
 | 
			
		||||
;	------------------------------------------
 | 
			
		||||
 | 
			
		||||
Terminate:	Mov	SI,Offset ScreenHold	; Address of Saved Screen
 | 
			
		||||
		Les	DI,[ScreenAddr]		; Address of Display
 | 
			
		||||
		Mov	CX,[ScreenSize]		; Number of characters
 | 
			
		||||
		Rep	Movsb			; Move them back 
 | 
			
		||||
		Mov	BX,[FileHandle]		; Get File Handle
 | 
			
		||||
		Mov	AH,3Eh			; Close File
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Int	20h			; Terminate
 | 
			
		||||
 | 
			
		||||
;	Cursor Key Routines -- Home Key
 | 
			
		||||
;	-------------------------------
 | 
			
		||||
 | 
			
		||||
Home:		Sub	BX,BX			; For zeroing out values
 | 
			
		||||
		Mov	AX,[FileOffset]		; Check if read in file
 | 
			
		||||
		Or	AX,[FileOffset + 2]
 | 
			
		||||
		Mov	[FileOffset],BX		; Zero out file address
 | 
			
		||||
		Mov	[FileOffset + 2],BX
 | 
			
		||||
		Mov	[HorizOffset],BX	; Zero out horizontal offset	
 | 
			
		||||
		Mov	SI,Offset Buffer	; Reset buffer pointer	
 | 
			
		||||
		Jz	Dummy			; Skip file read if in already
 | 
			
		||||
		Mov	DX,Offset Buffer	; Area to read file in
 | 
			
		||||
		Mov	CX,32768		; Number of bytes to read
 | 
			
		||||
		Call	FileRead		; Read in file
 | 
			
		||||
Dummy:		Ret
 | 
			
		||||
 | 
			
		||||
;	Up and PgUp Keys
 | 
			
		||||
;	----------------
 | 
			
		||||
 | 
			
		||||
Up:		Call	GetPrevChar		; Get previous char in buffer
 | 
			
		||||
		Jc	UpDone			; If none available, finish
 | 
			
		||||
UpLoop:		Call	GetPrevChar		; Get previous char again
 | 
			
		||||
		Jc	UpDone			; if none, we're done
 | 
			
		||||
		Cmp	AL,10			; Check if line feed
 | 
			
		||||
		Jnz	UpLoop			; If not, try again 
 | 
			
		||||
		Call	GetNextChar		; Get char after line feed
 | 
			
		||||
UpDone:		Ret
 | 
			
		||||
 | 
			
		||||
PgUp:		Mov	CX,Word Ptr [NumberLines]	; Number of lines
 | 
			
		||||
PgUpLoop:	Call	Up			; Do UP that many times
 | 
			
		||||
		Loop	PgUpLoop
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	Left and Right Keys
 | 
			
		||||
;	-------------------
 | 
			
		||||
 | 
			
		||||
Left:		Mov	[HorizOffset],0		; Reset Horizontal Offset
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
Right:		Mov	AL,[ShiftHoriz]		; Get places to shift
 | 
			
		||||
		Sub	AH,AH
 | 
			
		||||
		Add	[HorizOffset],AX	; Move that many right
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	End, Down, and PgDn Keys
 | 
			
		||||
;	------------------------
 | 
			
		||||
 | 
			
		||||
Ending:		Mov	BX,SI			; Save buffer pointer
 | 
			
		||||
		Call	PgDn			; Go page down
 | 
			
		||||
		Cmp	BX,SI			; Check if we did so
 | 
			
		||||
		Jnz	Ending			; If so, do it again
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
Down:		Call	GetNextChar		; Get next character
 | 
			
		||||
		Jc	NoMoreDown		; If no more, we're done
 | 
			
		||||
DownLoop:	Call	GetNextChar		; Get one again
 | 
			
		||||
		Jc	UpLoop			; If no more, find prev LF
 | 
			
		||||
		Cmp	AL,10			; See if line feed
 | 
			
		||||
		Jnz	DownLoop		; If not, continue
 | 
			
		||||
NoMoreDown:	Ret
 | 
			
		||||
 | 
			
		||||
PgDn:		Mov	CX,Word Ptr [NumberLines]	; Number of lines
 | 
			
		||||
PgDnLoop:	Call	Down			; Do DOWN that many times
 | 
			
		||||
		Loop	PgDnLoop
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	Update Screen
 | 
			
		||||
;	-------------
 | 
			
		||||
 | 
			
		||||
UpdateScreen:	Push	ES
 | 
			
		||||
		Mov	SI,[ScreenStart]	; Address of data in buffer
 | 
			
		||||
		Les	DI,[ScreenAddr]		; Address of display
 | 
			
		||||
		Mov	CX,ScreenSize		; Number of bytes in screen
 | 
			
		||||
		Shr	CX,1			; Half for number of chars
 | 
			
		||||
		Mov	AL,' '			; Will blank screen
 | 
			
		||||
		Mov	AH,[Attribute]		; With screen attribute
 | 
			
		||||
		Rep	Stosw			; Blank it
 | 
			
		||||
		Mov	AL,[LineLength]		; Length of display line
 | 
			
		||||
		Sub	AH,AH
 | 
			
		||||
		Add	AX,[HorizOffset]	; Add Horizontal Offset
 | 
			
		||||
		Mov	[RightMargin],AX	; That's right display margin
 | 
			
		||||
		Sub	DL,DL			; Line Number
 | 
			
		||||
LineLoop:	Sub	BX,BX			; Column Number
 | 
			
		||||
		Mov	AL,[LineLength]		; Use Line Length
 | 
			
		||||
		Mul	DL			;   and Line Number
 | 
			
		||||
		Add	AX,AX			;     to recalculate
 | 
			
		||||
		Mov	DI,AX			;       display destination
 | 
			
		||||
		Add	DI,[ScreenOff]		; Add beginning address	
 | 
			
		||||
CharLoop:	Call	GetNextChar		; Get next character
 | 
			
		||||
		Jc	EndOfScreen		; If no more, we're done
 | 
			
		||||
		And	AL,[WSMode]		; Will be 7Fh for WordStar
 | 
			
		||||
		Cmp	AL,13			; Check for carriage return
 | 
			
		||||
		Je	CharLoop		; Do nothing if so
 | 
			
		||||
		Cmp	AL,10			; Check for line feed
 | 
			
		||||
		Je	LineFeed		; Do routine if so
 | 
			
		||||
		Cmp	AL,9			; Check for tab
 | 
			
		||||
		Je	Tab			; Do routine if so
 | 
			
		||||
		Mov	CX,1			; Just 1 char to display
 | 
			
		||||
PrintChar:	Cmp	BX,[HorizOffset]	; See if we can print it
 | 
			
		||||
		Jb	NoPrint		
 | 
			
		||||
		Cmp	BX,[RightMargin]	; See if within margin
 | 
			
		||||
		Jae	NoPrint
 | 
			
		||||
		Mov	AH,[Attribute]		; Attribute for display
 | 
			
		||||
		Cmp	[CheckRetrace],0	; See if must stop snow
 | 
			
		||||
		Jz	WriteIt			; If not, skip retrace wait
 | 
			
		||||
		Push	BX
 | 
			
		||||
		Push	DX
 | 
			
		||||
		Mov	BX,AX			; Save character and attribute
 | 
			
		||||
		Mov	DX,[Addr6845]		; Set up I/O address
 | 
			
		||||
		Add	DX,6 
 | 
			
		||||
RetraceWait1:	In	AL,DX			; Check until
 | 
			
		||||
		Shr	AL,1			;   vertical retrace
 | 
			
		||||
		Jc	RetraceWait1		;     ends
 | 
			
		||||
		Cli				; Clear interrupts
 | 
			
		||||
RetraceWait2:	In	AL,DX			; Check until
 | 
			
		||||
		Shr	AL,1			;   vertical retrace
 | 
			
		||||
		Jnc	RetraceWait2		;     begins
 | 
			
		||||
		Mov	AX,BX			; Get back character & attr
 | 
			
		||||
		Stosw				; Write to display
 | 
			
		||||
		Sti				; Enable interrupts again
 | 
			
		||||
		Pop	DX
 | 
			
		||||
		Pop	BX
 | 
			
		||||
		Jmp	Short NoPrint		; Skip around "no snow" write
 | 
			
		||||
WriteIt:	Stosw				; Write without retrace wait
 | 
			
		||||
NoPrint:	Inc	BX			; Bump up line counter
 | 
			
		||||
		Loop	PrintChar		; Do it CX times
 | 
			
		||||
		Jmp	CharLoop		; Then go back to top
 | 
			
		||||
Tab:		Mov	AX,BX			; Current column number
 | 
			
		||||
		And	AX,07h			; Take lower three bits
 | 
			
		||||
		Mov	CX,8
 | 
			
		||||
		Sub	CX,AX			; Subtract from 8
 | 
			
		||||
		Mov	AL,' '			; Will print CX blanks
 | 
			
		||||
		Jmp	PrintChar
 | 
			
		||||
LineFeed:	Inc	DL			; Next line
 | 
			
		||||
		Cmp	DL,[NumberLines]	; See if down at bottom
 | 
			
		||||
		Jb	LineLoop		; If not, continue
 | 
			
		||||
EndOfScreen:	Pop	ES			; All done -- leave
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	Get Next Character from buffer
 | 
			
		||||
;	------------------------------
 | 
			
		||||
;		(Input is SI pointing to buffer, Returns AL, CY if no more)
 | 
			
		||||
 | 
			
		||||
GetNextChar:	Cmp	SI,[EndOfFile]		; See if at end of file
 | 
			
		||||
		Jae	NoMoreNext		; If so, no more chars
 | 
			
		||||
		Cmp	SI,Offset BufferEnd	; See if at end of buffer
 | 
			
		||||
		Jb	CanGetNext		; If not, just get character
 | 
			
		||||
		Push	CX			; Otherwise save registers
 | 
			
		||||
		Push	DX
 | 
			
		||||
		Push	DI
 | 
			
		||||
		Push	ES
 | 
			
		||||
		Push	DS			; Set ES to DS
 | 
			
		||||
		Pop	ES			;   (could be different)
 | 
			
		||||
		Mov	SI,Offset BufferMid	; Move 2nd buffer half
 | 
			
		||||
		Mov	DI,Offset Buffer	;   to 1st buffer half	
 | 
			
		||||
		Mov	CX,16384	   
 | 
			
		||||
		Sub	[ScreenStart],CX	; New buffer pointer
 | 
			
		||||
		Rep	Movsb			; Move them
 | 
			
		||||
		Mov	SI,DI			; SI also buffer pointer
 | 
			
		||||
		Add	[FileOffset],32768 	; Adjust file addr to read
 | 
			
		||||
		Adc	[FileOffset + 2],0 
 | 
			
		||||
		Mov	DX,Offset BufferMid	; Place to read file
 | 
			
		||||
		Mov	CX,16384		; Number of bytes
 | 
			
		||||
		Call	FileRead		; Read the file
 | 
			
		||||
		Sub	[FileOffset],16384	; Now adjust so reflects
 | 
			
		||||
		Sbb	[FileOffset + 2],0	;   1st half of buffer
 | 
			
		||||
		Pop	ES			; Get back registers
 | 
			
		||||
		Pop	DI
 | 
			
		||||
		Pop	DX
 | 
			
		||||
		Pop	CX
 | 
			
		||||
		Jmp	GetNextChar		; And try again to get char
 | 
			
		||||
CanGetNext:	Lodsb				; Get the character
 | 
			
		||||
NoMoreNext:	Cmc				; So CY set if no more
 | 
			
		||||
		Ret				
 | 
			
		||||
 | 
			
		||||
;	Get Previous Character from buffer
 | 
			
		||||
;	----------------------------------
 | 
			
		||||
 | 
			
		||||
GetPrevChar:	Cmp	SI,Offset Buffer	; See if at top of buffer
 | 
			
		||||
		Ja	CanGetPrev		; If not, just get character
 | 
			
		||||
		Mov	AX,[FileOffset]		; See if at top of file
 | 
			
		||||
		Or	AX,[FileOffset + 2]
 | 
			
		||||
		Jz	AtTopAlready		; If so, can't get anymore
 | 
			
		||||
		Push	CX			; Save some registers
 | 
			
		||||
		Push	DX
 | 
			
		||||
		Mov	SI,Offset Buffer	; Move 1st half of buffer
 | 
			
		||||
		Mov	DI,Offset BufferMid	;   to 2nd half of buffer
 | 
			
		||||
		Mov	CX,16384
 | 
			
		||||
		Add	[ScreenStart],CX	; New buffer pointer
 | 
			
		||||
		Rep	Movsb			; Do the move
 | 
			
		||||
		Sub	[FileOffset],16384	; Adjust file addr for read
 | 
			
		||||
		Sbb	[FileOffset + 2],0
 | 
			
		||||
		Mov	DX,Offset Buffer	; Area to read file into
 | 
			
		||||
		Mov	CX,16384		; Number of bytes
 | 
			
		||||
		Call	FileRead		; Read the file
 | 
			
		||||
		Pop	DX			; Get back registers
 | 
			
		||||
		Pop	CX
 | 
			
		||||
		Jmp	Short CanGetPrev	; Now get character
 | 
			
		||||
AtTopAlready:	Stc				; CY flag set for no more
 | 
			
		||||
		Ret
 | 
			
		||||
CanGetPrev:	Dec	SI			; Move pointer back
 | 
			
		||||
		Mov	AL,[SI]			; Get the character
 | 
			
		||||
		Clc				; CY flag reset for success
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	Read CX bytes from the file into DX buffer
 | 
			
		||||
;	------------------------------------------ 	
 | 
			
		||||
 | 
			
		||||
FileRead:	Push	AX			; Save some registers
 | 
			
		||||
		Push	BX
 | 
			
		||||
		Push	CX
 | 
			
		||||
		Push	DX
 | 
			
		||||
		Mov	[EndOfFile],-1		; Initialize this
 | 
			
		||||
		Mov	DX,[FileOffset]		; Get file address to read
 | 
			
		||||
		Mov	CX,[FileOffset + 2]
 | 
			
		||||
		Mov	BX,[FileHandle]		; Get file Handle
 | 
			
		||||
		Sub	AL,AL			; Do LSEEK from beginning
 | 
			
		||||
		Mov	AH,42h			; LSEEK call
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Pop	DX			; Get back destination
 | 
			
		||||
		Pop	CX			; Get back count
 | 
			
		||||
		Mov	AH,3Fh			; Read file function call
 | 
			
		||||
		Int	21h
 | 
			
		||||
		Jnc	NoReadError		; If no error, continue
 | 
			
		||||
		Sub	AX,AX			; Otherwise read zero bytes
 | 
			
		||||
NoReadError:	Cmp	AX,CX			; See if 32K has been read
 | 
			
		||||
		Je	GotItAll		; If so, we're home free
 | 
			
		||||
		Add	AX,DX			; Otherwise add to buffer addr
 | 
			
		||||
		Mov	[EndOfFile],AX		; And save as end of file
 | 
			
		||||
GotItAll:	Pop	BX
 | 
			
		||||
		Pop	AX
 | 
			
		||||
		Ret
 | 
			
		||||
 | 
			
		||||
;	File Buffer and Screen Hold Areas
 | 
			
		||||
;	---------------------------------
 | 
			
		||||
 | 
			
		||||
Buffer		Label	Byte			; Area for file reads
 | 
			
		||||
BufferMid	equ	Buffer + 16384		; Halfway through it
 | 
			
		||||
BufferEnd	equ	BufferMid + 16384	; At end of it		
 | 
			
		||||
ScreenHold	equ	BufferEnd		; Area for holding screen
 | 
			
		||||
CSEG		EndS				; End of segment
 | 
			
		||||
		End	Entry			; Denotes entry point
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								V/BROWSE.COM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								V/BROWSE.COM
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user