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.

Etiquetas:

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

Descargas