Punteros en Basic

Quizás os sorprenda que hable de punteros, y de Basic. Los punteros, o apuntadores, un recurso típico de C/C++, ensamblador y Pascal en menor medida.

Así que puede que te extrañe, que PowerBasic, desde su versión 3.2 de 1996 soportara incluso aritmética de punteros.

La sintaxis es realmente sencilla, tenemos el tipo de datos Ptr, que puede apuntar a casi cualquier tipo elemental Basic: Byte, Integer, …

A partir de ahí, cada operación con esa variable alterará el puntero, mientras que usando el operador @, actuaremos sobre su contenido.

Aquí os muestro un pequeño ejemplo, que aparte de llamar a los servicios de BIOS para video (10h), y teclado (16h), utiliza punteros para primeramente borrar la pantalla accediendo directamente al framebuffer, y posteriormente dibujar píxeles.

El borrado de la pantalla, se hace optimizado de 16 bits en 16 bits, de forma que en arquitecturas 8088/8086 o superiores resulta el doble de rápido que de byte en byte.

'Poner modo 320x200x256
Reg 1, &h13
Call Interrupt &h10

Call ClrScr(1)
Call SetPixel(160, 100, 10)

'Esperar pulsación de tecla
Reg 1, 0
Call Interrupt &h16

'Volver a modo texto
Reg 1, &h3
Call Interrupt &h10


'Set Pixel
Sub SetPixel (ByVal piX As Word, ByVal piY As Word, ByVal piColor As Byte)
	Dim pScreen As Byte Ptr

	pScreen = &hA0000000 + (piY * 320) + piX
	@pScreen = piColor
End Sub


'Clear screen
Sub ClrScr (ByVal piColor As Byte)
	Dim pScreen As Word Ptr
	Dim iCont As Word
        Dim iColor As Word

	pScreen = &hA0000000
        iColor = piColor * 256 + piColor
	For iCont = 0 To 31999
		@pScreen = iColor
		Incr pScreen, 2
	Next
End Sub

He dejado aquí (15 Kb. en formato ZIP), el ejecutable para DOS y su código fuente.

Punteros en Basic

5 comentarios en “Punteros en Basic”

  1. En su día programé para QBasic unas librerías en ensamblador, ahí si que me empapé de cómo QB trataba los tipos de datos…

    Respecto a los punteros en Basic puedo decir que para lo que los utilicé fue para que una función en ensamblador me retornara en “tiempo real” la posición x e y del ratón en un par de variables.

    El funcionamiento era muy simple, llamabas a la función con los punteros a dos variables como argumento y ésta programaba la interrupción del estado del ratón para que con cada actualización escribiera en las variables apuntadas los valores x e y.

    Lamentablemente perdí el código por un fallo del disco duro y después de dos meses de investigaciones, pruebas y desesperos no me quedaron ganas de volver a escribirlo de cero.

    Un saludo

  2. Javier Gutiérrez Chamorro (Guti)

    Fernando, recuerdo haber hecho cosas parecidas en ensamblador mezclado con otros lenguajes, que si al mismo tiempo interceptaban interrupciones de sistema, era en el mejor de los casos dificilísimo de depurar.

  3. Como se te nota la vena de ensamblador, Guti 😀 Y la sintaxis es una buena muestra de lo bonito y agradable que es Basic.

  4. Javier Gutiérrez Chamorro (Guti)

    Gracias Manuel. Interesante, y además notablemente eficiente. Una pequeña lanza para romper los tópicos de que BASIC no es un lenguaje potente, o que no permite hacer operaciones de bajo nivel.

Deja un comentario