where_am_i
Descripción del contenido de la página
Programa en SuperBASIC para distinguir la plataforma de ejecución entre unas pocas opciones.
Escribí este programa para poder distinguir el emulador de QL sobre el que el propio programa estaba funcionando, así como el sistema operativo. El objetivo era poder escribir un fichero de arranque multiplataforma que funcionara igual en ciertas combinaciones de emulador y sistema operativo.
La idea que se me ocurrió fue utilizar la salida del comando EXTRAS
de ToolKit 2 y examinar su contenido en busca de comandos propios de cada emulador o sistema operativo. Es un método rudimentario y lento, pero que funciona bien para las pocas combinaciones que necesitaba distinguir: Los emuladores Q-emuLator, QPC2 y uQLx (fuentes de uQLx en EmuWiki.com y fuentes y versión compilada de uQLx en sinclairql.es); y los sistemas QDOS (sólo las ROM s JS y MGE), Minerva y SMSQ/E.
Preguntando sobre este asunto en el foro de Sinclair QL en speccy.org supe de una solución completa y más sofisticada, escrita por Jack D. Mitchell en 1997.
Código fuente
El programa está escrito con Vim bajo Debian, no con el editor incorporado en SuperBASIC; por eso tiene un estilo diferente del habitual: todos los comandos y funciones del lenguaje los he escrito abreviados y en minúsculas (por ejemplo, def fn
en lugar de DEFine FuNction
); y, lo más importante, no hay números de línea, que son obligatorios en el lenguaje. Lo hago así porque me resulta mucho más cómodo y rápido. El fichero de resaltado syntaxis de SuperBASIC para Vim que escribí ayuda.
Para cargar el programa en el intérprete hay dos opciones sencillas:
Primera opción: añadir números de línea con cualquier editor de textos que permita hacerlo fácilmente (para hacer esto cómodamente con el propio Vim escribí line_numbers).
Segunda opción: usar el comando AUTO
de SuperBASIC, borrar el número de línea que nos propone, y seguidamente cargar el programa (por ejemplo con load flp1_who_am_i_bas
, con el dispositivo que corresponda en lugar de flp). cuando el programa se haya cargado, el comando AUTO
nos pedirá que introduzcamos la línea siguiente; bastará con pulsar Ctrl+Espacio para terminar. Este truco no funciona en SMSQ/E, pues el comando AUTO
hace lo mismo que ED
, el editor de pantalla.
rem where_am_i
rem Copyright (C) 2010 Marcos Cruz (programandala.net)
rem License: http://programandala.net/license
rem This program is written in SuperBASIC for Sinclair QL emulators.
rem It guesses the emulator and the operating system it's running under,
rem and the BASIC flavour.
rem It was written in order to write a multiplatform boot file for three
rem emulators: Q-emuLator, QPC2 and uQLx.
rem A complete and more powerful solution, written by J.D.Mitchell in 1997:
rem http://www.dilwyn.me.uk/docs/articles/what_hw.zip
rem 2010-08-06 First version, limited to the few combinations I use:
rem Emulators: Q-emuLator, QPC2 and uQLx.
rem Operating systems: QDOS (ROMs JS and MGE only), Minerva and SMSQ/E.
tk2_ext: rem Toolkit 2
where_am_i
print
print "Emulator:"!emulator$
print "Operating system:"!operating_system$
print "BASIC:"!basic$
stop
def fn where_am_i$
rem Guess and return the current emulator, the operating system and the BASIC flavour.
rem Change: keywords$,emulator$,operating_system$ and basic$.
let keywords$="" : rem init needed by the function keyword()
if keyword("QPC_EXIT")
let emulator$ = "QPC2"
else
if keyword("Kill_UQLX")
let emulator$ = "UQLX"
else
let emulator$ = "Q-EMULATOR" : rem default
end if
end if
let operating_system$ = "unknown" : rem default
if ver$="JS" or ver$="MGE"
let operating_system$ = "QDOS"
else
if ver$="JSL1"
let operating_system$ = "MINERVA"
else
if emulator$="QPC2"
let operating_system$ = "SMSQ/E"
end if
end if
end if
if keyword("SBASIC")
let basic$ = "SBASIC"
else
let basic$ = "SUPERBASIC"
end if
return emulator$ & ", " &operating_system$ & ", " & basic$
end def where_am_i$
def proc where_am_i
rem Guess and print the current emulator, the operating system and the BASIC flavour.
print where_am_i$
end def where_am_i
def fn keyword(keyword$)
rem Is keyword$ a current keyword?
local extra$,extras_file$,channel%
if len(keywords$)=0
rem First time. Get all the current keywords.
let extras_file$ = datad$ & "where_am_i_" & rnd(10000 to 32726) & "_tmp"
channel% = fop_new(extras_file$)
if channel%<0
rem Error!
report channel%
stop
end if
extras#channel%
bget#channel%\0 : rem set the file position to 0
rep read_line
if eof(#channel%)
close#channel%
exit read_line
end if
input#channel%,extra$
let keywords$ = keywords$ & " " & extra$ & " "
end rep read_line
delete extras_file$
end if
let keyword$= " " & keyword$ & " "
return keyword$ instr keywords$
end def keyword