Fecha actual Lun Ago 19, 2019 4:48 am

Implementing a Function to Switch Standard VGA Video Modes (BIOS INT 10h AH=00h Equivalent)

[html]Programacion/Hardware/Video/VGA/Description.txt[/html]


Usuarios leyendo este tema: Ninguno

Implementing a Function to Switch Standard VGA Video Modes (BIOS INT 10h AH=00h Equivalent)

Notapor ~ » Vie May 27, 2016 12:38 am

INDEX: Switching Standard VGA Modes Without the BIOS



I need a fully standard function as a default configuration entry point for the VGA, which takes 3 parameters to replace the BIOS services to switch video mode:

- VGA Register values or NULL (0)
- 256-color palette or NULL (0)
- Default text-mode font or NULL (0)


All of those structures must contain their size at the start in a 16-bit WORD, which contains the size of the structure including that WORD.

As we can see, we can tweak this function so that only non-null parameters cause an action in their respective area (switching video mode, loading a palette and/or loading a default text font). If they are null, we won't do anything, so we could use this same function only for 1 or several of these configuration tasks.



To be able to put together that function, I mostly only need functions to read and write the Attribute, CRTC, General, Graphics and Sequencer registers with those of the provided standard register set structure. I mainly need functions that know how to read or write to a full array of indexed registers. It looks like unless I really need to read or write individual indexed registers, and I know for what, I won't know how to implement that.

But when I implement individual routines for the different indexed or individual registers, I will do it in a level that denotes that those functions are NOT to control registers or controllers inside the VGA, but instead they provide functionality to make use of a VGA function.


I will also need a few functions to control fine-grained functionality through the different existing registers and bits of the VGA.

So I need the register values for modes 3h, 4h, 12h, 13h and Mode X, which are the most used ones. I might try to find information for other modes.

I need to put together extremely well-commented structures with the register values for the VGA so it serves as a good tutorial.

It seems that only text modes need a default font when we enter them, and also, only 256-color modes require that we specify a good palette to switch them.



Table of Contents

Text Mode 3h Configuration (80x25x16-Color EGA)
Mode 3h: Register Set Values
Mode 3h: 256-Color Palette
Mode 3h: Default Text Font


Graphics Mode 4h Configuration (320x200x4-Color CGA)
Mode 4h: Register Set Values
Mode 4h: 256-Color Palette
Mode 4h: Default Text Font (Not Present)


Graphics Mode 12h Configuration (640x480x16-Color VGA)
Mode 12h: Register Set Values
Mode 12h: 256-Color Palette
Mode 12h: Default Text Font (Not Present)


Graphics Mode 13h Configuration (320x200x256-Color MCGA)
Mode 13h: Register Set Values
Mode 13h: 256-Color Palette
Mode 13h: Default Text Font (Not Present)


Graphics Mode X Configuration (320x240x256-Color MCGA)
Mode X: Register Set Values
Mode X: 256-Color Palette
Mode X: Default Text Font (Not Present)


Making Use of the Configuration Information Blocks
Configuration Write Sequence for the Main VGA Register Set
Writing the Indexed Registers in the Four Controllers Embedded in the VGA
Turning the VGA Monitor On and Off
Enabling the 16-Color VGA Palette
Making the CRTC Controller Registers Writable
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 3h (Registers)

Notapor ~ » Vie May 27, 2016 12:49 pm

Register Values, Mode 3h, Text, 80x25x16 Colors, EGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 3h (256-color palette)

Notapor ~ » Sab May 28, 2016 9:33 pm

Palette, Mode 3h, Text, 80x25x16 Colors, EGA

It's a 16-color mode, so the palette indexes into the 256-color palette are integrated into 16 color registers in the main VGA register set. Also, only the first 16 colors are used.

It looks like all standard 4-color and 16-color CGA/EGA/VGA modes use the exact same default palette from the BIOS, so in the final code we will only include a single palette for that called PALETTE256_4_16_colors .

Howevever, every color index can select between 64 different colors, but there are just 16 colors selected at a time on screen.

The palette below contains 64 different colors.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 3h (Default hardware text font)

Notapor ~ » Sab May 28, 2016 10:33 pm

Default Text Font, Mode 3h, Text, 80x25x16 Colors, EGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 4h (Registers)

Notapor ~ » Dom May 29, 2016 12:00 pm

Register Values, Mode 4h, Graphics, 320x200x4 Colors, CGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 4h (256-color palette)

Notapor ~ » Dom May 29, 2016 12:22 pm

Palette, Mode 4h, Graphics, 320x200x4 Colors, CGA

This one seems to be the same palette for Text Mode 80x25x16 Colors.

It's a 4-color mode, so the palette indexes into the 256-color palette are integrated into 4 color registers in the main VGA register set. Also, only the first 4 colors are used.

It looks like all standard 4-color and 16-color CGA/EGA/VGA modes use the exact same default palette from the BIOS, so in the final code we will only include a single palette for that called PALETTE256_4_16_colors .

Howevever, every color index can select between 64 different colors, but there are just 16 colors selected at a time on screen.

The palette below contains 64 different colors.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 4h (Default text font)

Notapor ~ » Dom May 29, 2016 12:47 pm

Default Text Font, Mode 4h, Graphics, 320x200x4 Colors, CGA

This is a graphics mode so it doesn't use text fonts.

Instead you'll need direct drawing techniques along with the default font to get text with your own routines. We don't provide it here (it would be part of a drawing tutorial).

Anyway, in this mode we would effectively get a text area with a 40x12x16 colors resolution implemented in software.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 12h (Registers)

Notapor ~ » Dom May 29, 2016 1:02 pm

Register Values, Mode 12h, Graphics, 640x480x16 Colors, VGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 12h (256-color palette)

Notapor ~ » Dom May 29, 2016 1:17 pm

Palette, Mode 12h, Graphics, 640x480x16 Colors, VGA

This one seems to be the same palette for Text Mode 80x25x16 Colors.

It looks like all standard 4-color and 16-color CGA/EGA/VGA modes use the exact same default palette from the BIOS, so in the final code we will only include a single palette for that called PALETTE256_4_16_colors.

It's a 16-color mode, so the palette indexes into the 256-color palette are integrated into 16 color registers in the main VGA register set. Also, only the first 16 colors are used.

Howevever, every color index can select between 64 different colors, but there are just 16 colors selected at a time on screen.

The palette below contains 64 different colors.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 12h (Default text font)

Notapor ~ » Dom May 29, 2016 1:33 pm

Default Text Font, Mode 12h, Graphics, 640x480x16 Colors, VGA

This is a graphics mode so it doesn't use text fonts.

Instead you'll need direct drawing techniques along with the default font to get text with your own routines. We don't provide it here (it would be part of a drawing tutorial).

Anyway, in this mode we would effectively get a text area with a 80x30x16 colors resolution implemented in software.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 13h (Registers)

Notapor ~ » Dom May 29, 2016 1:49 pm

Register Values, Mode 13h, Graphics, 320x200x256 Colors, MCGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 13h (256-color palette)

Notapor ~ » Dom May 29, 2016 2:04 pm

Palette, Mode 13h, Graphics, 320x200x256 Colors, MCGA

It looks like all standard 256-color CGA/EGA/VGA modes use the exact same default palette from the BIOS, so in the final code we will only include a single palette for that called PALETTE256.

It's a 256-color mode, and it uses the 256-color palette registers directly.

Each palette entry contains R, G and B components.
These components use up to 6 bits.
So we can select colors from a range of 18-bit colors (262,144 colors).
But we can only select and display 256 colors simultaneously.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode 13h (Default text font)

Notapor ~ » Dom May 29, 2016 2:20 pm

Default Text Font, Mode 13h, Graphics, 320x200x256 Colors, MCGA

This is a graphics mode so it doesn't use text fonts.

Instead you'll need direct drawing techniques along with the default font to get text with your own routines. We don't provide it here (it would be part of a drawing tutorial).

Anyway, in this mode we would effectively get a text area with a 40x12.5x256 colors resolution implemented in software. It a very graphics-looking mode due to the potential clipping of partial font glyphs if we use 16-pixel tall fonts.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode X (Registers)

Notapor ~ » Dom May 29, 2016 2:43 pm

Register Values, Mode X, Graphics, 320x240x256 Colors, MCGA

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode X (256-color palette)

Notapor ~ » Dom May 29, 2016 2:56 pm

Palette, Mode X, Graphics, 320x240x256 Colors, MCGA

It looks like all standard 256-color MCGA/VGA modes use the exact same default palette from the BIOS, so in the final code we will only include a single palette for that called VGA_PALETTE256.

It's a 256-color mode, and it uses the 256-color palette registers directly.

Each palette entry contains R, G and B components.
These components use up to 6 bits.
So we can select colors from a range of 18-bit colors (262,144 colors).
But we can only select and display 256 colors simultaneously.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Register Values for Mode X (Default text font)

Notapor ~ » Dom May 29, 2016 2:58 pm

Register Values for Mode X (Default text font)

This is a graphics mode so it doesn't use text fonts.

Instead you'll need direct drawing techniques along with the default font to get text with your own routines. We don't provide it here (it would be part of a drawing tutorial).

Anyway, in this mode we would effectively get a text area with a 40x12.5x256 colors resolution implemented in software. It a very graphics-looking mode due to the potential clipping of partial font glyphs if we use 16-pixel tall fonts.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Generic Function to Write the VGA Register Set Sequentially

Notapor ~ » Dom May 29, 2016 3:46 pm

Writing the Main VGA Register Set (Step/Parameter 1)

Now that we have all of the basic data configuration for the main standard VGA video modes, we need an internal function that will let us copy the values of the structures into the VGA registers.

This function only writes the main VGA register set.
We will also keep functions specific to write the Palette as well as to write text fonts into the VGA memory when we are in text mode.

What it does is:

- Turn off the monitor (it makes the VGA work faster and it's good for configuring the video mode)
* Write the Miscellaneous Output Register
* Write the Feature Control Register
* Write the 5 indexed Sequence Registers
- Unprotect the CRTC Registers 0-7
* Write the 25 indexed CRTC Registers
* Write the 9 indexed Graphics Controller Registers
- Reset the Flip/Flop of the Attribute Controller by reading a byte from Feature Control Register at port 0x3DA (color) or 0x3BA (mono)
* Write the 21 indexed Attribute Controller Registers
- Reset the Flip/Flop again reading a byte from Feature Control Register at port 0x3DA (color) or 0x3BA (mono)
- Enable the 16-color palette from the main register set
- Turn on the monitor with the new display mode configured

NOTE: We write all indexed registers in all controllers in one pass, using DX containing the index in DL and the data in DX.    The exception is the Attribute Controller Register, which is an exception since it switches the Flip/Flop every time we access it.    The Attribute Controller Register switches to the Index byte port and then to the Data byte port when we write it 8 bits at a time.    If we try to write it 16 bits at a time, we will only access the Index Register discarding the higher 8 bits, so we must write 8 bits for the Index byte port, and then let the Flip/Flop select the Data byte port, and then perform a second write to write the Data byte.

This is the main function that will let us switch standard video modes, but obviously we must clean it up and add the rest of the code for the other functions (and name them better).



This is the initial function to further standardize:
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Writing the Indexed VGA Registers

Notapor ~ » Dom May 29, 2016 6:59 pm

Writing the Indexed Registers of the Controllers Embedded in the VGA

We will use the following 2 functions to write the different controllers that are embedded in the VGA, which use indexed registers (an index port and a data port).

There are 2 versions of the function. The first one writes 16 bits (2 bytes) in a single write to specify the index and the data. Most controllers inside the standard VGA support it except for the Attribute Controller, which only supports 8-bit writes at a time.

So we use the first version, that performs 16-bit writes at a time, for most operations for performance and shorter code; and the second version, that performs 8-bit writes at a time, only for the Attribute Controller Register, where it's really obligatory.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Writing the VGA Sequencer's Function to Turn the Monitor On or Off

Notapor ~ » Dom May 29, 2016 7:20 pm

Turning the VGA Monitor On and Off

This function is part of the intrinsic functions contained in the Sequencer Controller. We can turn on or off the monitor by controlling bit 5 of the Clocking Mode Register (index 1) at the Sequencer Controller.

It gets to be a good and interesting power saving feature if it works in a given video card, which should if it's really compatible with the standard VGA at that function.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Enabling the 16 and 256-Color VGA Palettes

Notapor ~ » Dom May 29, 2016 7:23 pm

Enabling the 16 and 256-Color VGA Palettes

This is part of the intrinsic functions contained in the Attribute Controller Register.

We need to enable bit 5 of the Index Register for the Attribute Controller Index Register, keeping the Flip/Flop reset at the start and the end to perform proper reads and writes to this controller in the future.

Every time we drive the index register for the Attribute Controller, we need to disable bit 5 or it would be considered a different index. By disabling it to get the correct index count, it also has the hardware effect to disable the 16-color palette, and that causes that all 4-color, 16-color and 256-color text and graphics modes get a black screen.

In other words, if bit 5 is 0, the standard VGA will always generate a fully black screen (will it show the overscan color? I don't remember so I need to change the overscan color... but how is it done???).

So we need to set bit 5 of this index register again to 1 after we finish the actual reprogramming of the Attribute Controller for things to go back to normal.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Unprotecting the VGA Registers of the CRTC Controller for Writing

Notapor ~ » Dom May 29, 2016 9:27 pm

Unprotecting the first 8 Registers of the CRTC Registers (Make Them Writable)

Registers 0-7 of the CRTC register are write-protected. We need to make them writable to reprogram the CRTC Controller.

We can leave them unprotected, which doesn't seem to have any ill effect at all.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Reading and Writing the 256-Color VGA Palette

Notapor ~ » Vie Jun 03, 2016 6:28 pm

Reading and Writing the Palette

We need functions to read and write the palette.

It's easy in principle.

To write the palette, we need to specify the 0-255 color index at register 0x3C8 and make 3 writes for each one of those color indexes at offset 0x3C9.

To read the palette, we need to specify the 0-255 color index at register 0x3C7 and make 3 read for each of those color indexes at offset 0x3C9.

There's a hardware path for reads and writes that lets us then access the colors we want.

And we need 3 writes or 3 reads because we need to specify 3 bytes, one for the R (Red) component, one for the G (Green) component, and one for the B (Blue) component.

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Loading a Default 80x25x16 colors Text Mode Font

Notapor ~ » Vie Jun 03, 2016 8:22 pm

Loading a Default 80x25x16 colors Text Mode Font

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Reading and Writing Single Graphics Controller and Sequencer Controller Indexed Registers

Notapor ~ » Vie Jun 03, 2016 8:57 pm

Reading and Writing Single Graphics Controller and Sequencer Controller Indexed Registers

We need two convenience functions to read and write different Graphics and Sequencer indexed registers from those controllers.

Originally they will allow us to load a default text font for text mode 80x25x16 colors mode (BIOS display mode 03h).

It's easier to use these convenience functions than to use the other standard function to write all indexed registers of a given controller, because the convenience functions here are specific to the Graphics and Sequencer controllers, and it allows to pack the usage of the VGA registers and the CPU registers only to the inside of that function. It means that we will need to write considerably less code and use less parameters, which will make our code clearer, more maintainable, standardized and space-efficient.

The following two functions are to read and write the indexed registers from the VGA's Graphics Controller:


And the following two functions are to read and write the indexed registers from the VGA's Sequencer Controller:


NNow we're ready to use our font-loading function for the standard VGA text mode 03h, 80x25x16 colors.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Code for an Implementation of BIOS INT 10h AH=00h

Notapor ~ » Sab Jun 04, 2016 3:55 pm

Code for an Implementation of BIOS INT 10h AH=00h

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm


Volver a Programación VGA

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 19 invitados


cron