MBimport 1

Descripción del contenido de la página

Primera variante de MBimport, programa escrito en MasterBASIC para importar en el emulador SimCoupe código fuente en MasterBASIC escrito en ficheros de texto creados en el sistema operativo anfitrión.

Etiquetas:

La primera variante de MBimport utiliza la opción del emulador SimCoupe para importar ficheros del sistema anfitrión en la memoria de la SAM Coupé.

No profundicé apenas en la arriesgada aventura de lidiar con la paginación de memoria de la SAM Coupé desde BASIC y tras algunas pruebas me limité a bajar el valor de RAMTOP a 32767 y usar la página entera a partir de la dirección 32768 para importar el código fuente. Después el procedimiento v2f (abreviatura de «Vim to file») lee esa zona de la memoria, extrae las líneas del código y con ellas creaba un fichero secuencial en el disquete (con extensión por defecto «V2S»), que finalmente el procedimiento f2s (abreviatura de «file to SAM») lee para convertirlo con KEYIN en un programa efectivo.

El tamaño máximo del código fuente a importar en cada paso es de 16 KiB, que es el de una página de memoria. No obstante es posible importar programas mayores en varios pasos y conservar la numeración de líneas correcta.

Código fuente

   10 REM MBimport 1 (Version A-20110907)
      (C) 2011 Marcos Cruz (programandala.net)
      License programandala.net/license
   15 MODE 1
   20 OPEN BLOCKS 1
   25 DEF FN nn$(n)=CHR$ (n MOD 256)+CHR$ INT (n/256)
   30 DEF FN min(a,b)=a*(a<b)+b*(b<a)
   35 DEF FN max(a,b)=a*(a>b)+b*(b>a)
   40 DEF PROC addExtensionTo REF file$
   45   LOCAL drive$
        LET drive$=""
   50   IF LEN file$>4
   55     IF EQU(file$(1),"d") AND file$(3)=":"
   60       LET drive$=file$(2),drive$=file$( TO 3) AND (drive$>="1" AND drive$<="9")
   65     END IF
   70   END IF
   75   IF LEN drive$ THEN LET file$=file$(4 TO )
   80   LET file$=drive$+TRUNC$ ((file$+"      ")(1 TO 6))+".mb"
   85 END PROC
   90 DEF PROC about
        CLS #
        PRINT PEN 5;"MBimport 1"'"Copyright (C) 2011 Marcos Cruz"'"(programandala.net)"''
      END PROC
   95 DEF PROC v2fs DATA
        REM "From Vim to files"
  100   LOCAL file$,file
  105   DO WHILE ITEM
          IF ITEM=2
            READ file
            LET file$=STR$ file
          ELSE READ file$
          END IF
          v2f file$
        LOOP
  110 END PROC
  115 DEF PROC v2f file$
        REM "From Vim to file"
  120   DEFAULT file$="tmp"
  125   LOCAL line$,start,end,eol$,eol,stream,clear$
        LET start=RAMTOP,eol$=CHR$ 10,eol=LEN eol$,stream=4
        addExtensionTo file$
  130   LET clear$=CHR$ &21+FN nn$(32768)+CHR$ &11+FN nn$(32769)+CHR$ &01+FN nn$(16383)+CHR$ &36+CHR$ 0+CHR$ &ED+CHR$ &B0+CHR$ &C9
        REM machine code to clear 16 KiB at 32768
  135   about
  140   IF start<>32768 THEN PRINT "Error: RAMTOP<>32768"'"Press any key to do "; BRIGHT 1;"CLEAR 32768"; BRIGHT 0'"and then try again."
          PAUSE
          CLEAR 32768
          STOP
        ELSE CALL LENGTH(0,clear$)
  145   PRINT "The file "; BRIGHT 1;file$; BRIGHT 0;" will be"'"created with the content of the"'"memory (address range from"'"32768 to 49151)."''"Now please import the host"'"system file into the BASIC"'"address 32768, using the"'"SimCoupe's data import 
option"'"(PC key F4)."''"After importing the file, press any key to continue."
  150   PAUSE
  155   CLOSE #stream
        IF FSTAT(file$,1)
          PRINT "erased"
          ERASE file$
        END IF
        OPEN #stream;file$ OUT
  160   PRINT "Copying the lines from memory"'"into the temporary file..."
  165   DO
  170     LET end=LOCN(start, 49151,eol$,ABS )
  175   EXIT IF NOT end
  180     PRINT #stream;MEM$(start TO end-1)
          LET start=end+eol
  185   LOOP
  190   CLOSE #stream
  195   PRINT "Done!"
  200 END PROC
  205 DEF PROC fs2s DATA
        REM "From files to SAM"
  210   LOCAL file$,file
  215   DO WHILE ITEM
          IF ITEM=2
            READ file
            LET file$=STR$ file
          ELSE READ file$
          END IF
          f2s file$
        LOOP
  220 END PROC
  225 DEF PROC f2s file$,lineN
        REM "From file to SAM"
  230   DEFAULT file$="tmp",lineN=lastLineByMBimport+1
  235   LOCAL srcLine$,srcLineL,line$,stream,tabChars$,tail$
        LET line$="",stream=4,tabChars$=CHR$ 9+CHR$ 32
        addExtensionTo file$
  240   about
  245   IF RAMTOP<81919 THEN PRINT "Error: RAMTOP<81919"'"Press any key to do "; BRIGHT 1;"CLEAR 81919"; BRIGHT 0'"and then try again."
          PAUSE
          CLEAR 81919
          STOP
  250   SCROLL CLEAR
  255   CLOSE #stream
        OPEN #stream,file$ RND
  260   DO WHILE NOT EOF stream
  265     REM LET srcLine$=INP$(#stream,0)
          rem fails with lines longer than 255
  270     INPUT #stream; LINE srcLine$
  275     REM PRINT "raw srcLine$="; PEN 5;srcLine$
          rem debug!!!
  280     FOR first=1 TO LEN srcLine$
            IF NOT INSTR(tabChars$,srcLine$(first)) THEN EXIT FOR
  285     NEXT first
          IF first>1 THEN LET srcLine$=srcLine$(first TO )
  290     REM PRINT "srcLine$="; PEN 2;srcLine$
          PRINT "line$="; PEN 6;line$
  295     LET srcLineL=LEN srcLine$
  300     IF srcLineL
            PRINT PEN 6;srcLine$
            IF srcLine$(srcLineL)=CHR$ 92
              LET tail$=srcLine$( TO srcLineL-1)
              JOIN TO line$,tail$
            ELSE
              keyinLine line$+srcLine$
              LET line$=""
            END IF
          END IF
  305   LOOP
        IF LEN line$ THEN keyinLine line$
  310   keyinLine "label lastLineByMBimport"
  315   SCROLL RESTORE
  320   CLOSE #stream
  325 END PROC
  330 DEF PROC keyinLine l$
  335   LOCAL color
        LET color=4
  340   ON ERROR GO TO syntaxError
        KEYIN STR$ lineN+l$
        ON ERROR STOP
        GO TO printLine
  345   LABEL syntaxError
  350   ON ERROR STOP
        KEYIN STR$ lineN+"REM MIS"+"TAKE "+l$
        LET color=2
  355   LABEL printLine
        PRINT lineN; PEN color;l$
  360   LET lineN=lineN+1
  365 END PROC
  370 DEF PROC si
        REM Show input (for debugging)
  375   LOCAL pointer,first,last
        LET pointer=PTR stream,first=FN max(pointer-16,0),last=FN min(pointer+16,LENGTH#stream)
  380   FOR pos=first TO last
          POINT#stream,pos
          LET char$=INP$(#stream,1),color=7-5*(pos=pointer)
          PRINT PEN color;SHIFT$(char$,4);"(";CODE char$;")";
        NEXT pos
  385   POINT#stream,pointer
  390 END PROC
  395 DEF PROC sr
        SCROLL RESTORE
      END PROC
  400 DEF PROC c
        REM Clear after an error
  405   sr
        CLOSE *
        CLEAR
        STOP
      END PROC
  410 DEF PROC cat drive
        DEFAULT drive=DSTAT(*,8)
        DIR "d"+STR$ (drive)+":*.mb"
      END PROC
  415 DEF PROC d
        REM Delete the imported code
  420   DELETE 1e3 TO
      END PROC
  425 DEF PROC dMBimport
        REM Delete MBimport
  430   DELETE TO VAL "999"
      END PROC
  435 DEF PROC r
        REM Renum MBimport
  440   RENUM TO endOFMBimport LINE 10 STEP 5
      END PROC
  445 DEF PROC s
        REM Save MBimport 1
  450   d
        ERASE "MBimport1~"
        RENAME "MBimport1","MBimport1~"
        SAVE "MBimport1"
      END PROC
  455 LABEL endOfMBimport
  999 LABEL lastLineByMBimport
      REM This line must be 999
      -------------------------

Descargas

MBimport 1 y el resto de variantes están disponibles en la sección de descarga en la página principal de MBimport.

Páginas relacionadas

BBimport
Programa para importar en el intérprete de Beta BASIC un código fuente creado en el sistema anfitrión del emulador de ZX Spectrum.