MBimport 2

Descripción del contenido de la página

Segunda 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 segunda variante de MBimport es más cómoda y rápida de utilizar que la primera variante. Permite, en un solo paso, importar programas de más de 16 KiB. El código fuente lo extrae de los sectores de una falsa imagen de disquete MGT creada por el sistema anfitrión. Por ello el tamaño máximo del programa a importar es de 800 KiB, que es la capacidad bruta de un disquete de SAM Coupé).

El procedimiento import hace todo el trabajo de un tirón.

Para aumentar la velocidad, esta versión no reúne las líneas divididas ni elimina la indentación. Esas tareas deben hacerse en el sistema anfritrión.

Código fuente

   10 REM MBimport 2 (version A-20110907)
      (C) 2011 Marcos Cruz (programandala.net)
      License programandala.net/license
   15 MODE 1
   20 DEF PROC about
        CLS #
        PRINT PEN 5;"MBimport 2"'"Copyright (C) 2011 Marcos Cruz"'"(programandala.net)"''
      END PROC
   25 DEF PROC import drive,lineN
        REM "From disk image to SAM"
   30   DEFAULT drive=2,lineN=endOfMBimport+1
   35   LOCAL srcLine$,buffer,bufferEnd,cr$,endOfSource
   40   LET cr$=CHR$ 13,endOfSource=0
   45   LOCAL sectorLen,track,sector,sliceStart,CRPos,lastTrack
   50   LET sectorLen=512,track=0,sector=1,CRPos=0,lastTrack=79 BOR 128
   55   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
   60   LET buffer=RAMTOP,bufferEnd=buffer+sectorLen-1
   65   SCROLL CLEAR
   70   loadSector
   75   DO
   80     diskTo srcLine$
   85   EXIT IF endOfSource
   90     PRINT AT 0,0;lineN
   95     KEYIN STR$ lineN+srcLine$
  100     LET lineN=lineN+1
  105   LOOP
  110   keyinLine "label lastLineByMBimport"
  115   SCROLL RESTORE
  120 END PROC
  125 DEF PROC diskTo REF diskLine$
  130   LET diskLine$=""
  135   IF NOT PEEK (sliceStart) THEN debug "Zero found"
          LET endOfSource=1
          EXIT PROC
  140   DO
  145     LET crPos=LOCN(sliceStart,bufferEnd,cr$,ABS )
  150     debug "crPos="+STR$ crPos+(" (+"+STR$ (crPos-buffer)+")") AND crPos
  155     IF crPos
  160       LET diskLine$=diskLine$+MEM$(sliceStart TO crPos-1)
  165       IF crPos=bufferEnd THEN feedBuffer
            ELSE LET sliceStart=crPos+1
  170     ELSE
  175       LET diskLine$=diskLine$+MEM$(sliceStart TO bufferEnd)
            feedBuffer
  180     END IF
  185   LOOP UNTIL crPos
  190 END PROC
  195 DEF PROC feedBuffer
  200   debug "feedBuffer (current sector is "+STR$ sector+"/"+STR$ track+")"
  205   nextSector
        loadSector
  210 END PROC
  215 DEF PROC loadSector d,t,s
  220   DEFAULT d=drive,t=track,s=sector
  225   debug "loadSector ("+STR$ sector+"/"+STR$ track+")"
  230   READ AT d,t,s,buffer,1
  235   LET sliceStart=buffer
  240 END PROC
  245 DEF PROC nextSector
  250   debug "nextSector (current is "+STR$ sector+")"
  255   IF sector<10 THEN LET sector=sector+1
        ELSE nextTrack
  260 END PROC
  265 DEF PROC nextTrack
  270   debug "nextTrack (current is "+STR$ track+")"
  275   IF track=lastTrack THEN wipeBuffer
          LET endOfSource=1
          EXIT PROC
  280   IF FN side0(track)
  285     DoSide1 track
  290   ELSE doSide0 track
          LET track=track+1
  295   END IF
  300   LET sector=1
  305 END PROC
  310 DEF FN side0(t)=t<80
  315 DEF PROC doSide1 REF track
  320   debug "doSide1"
  325   LET track=track+128
  330 END PROC
  335 DEF PROC doSide0 REF track
  340   debug "doSide0"
  345   LET track=track-128
  350 END PROC
  355 DEF PROC debug message$,color
  360   DEFAULT color=2
  365   REM PRINT PEN color;message$
        REM PAUSE 
  370 END PROC
  375 DEF PROC keyinLine l$
  380   LOCAL color
        LET color=4
  385   ON ERROR GO TO syntaxError
        KEYIN STR$ lineN+l$
        ON ERROR STOP
        GO TO printLine
  390   LABEL syntaxError
  395   ON ERROR STOP
        KEYIN STR$ lineN+"REM MIS"+"TAKE "+l$
        LET color=2
  400   LABEL printLine
        PRINT lineN; PEN color;l$
  405   LET lineN=lineN+1
  410 END PROC
  415 DEF PROC sr
        SCROLL RESTORE
      END PROC
  420 DEF PROC c
        REM Clear after an error
  425   sr
        CLOSE *
        CLEAR
        STOP
      END PROC
  430 DEF PROC d
        REM Delete the imported code
  435   DELETE endOfMBimport+1 TO
      END PROC
  440 DEF PROC dMBimport
        REM Delete MBimport
  445   DELETE TO endOfMBimport
      END PROC
  450 DEF PROC r
        REM Renum MBimport
  455   RENUM TO endOFMBimport-1 LINE 10 STEP 5
      END PROC
  460 DEF PROC s
        REM Save MBimport
  465   d
        ERASE "MBimport2~"
        RENAME "MBimport2","MBimport2~"
        SAVE "MBimport2"
      END PROC
  999 LABEL endOfMBimport
      REM The first line of the imported code will be one more than this one.
      --------------------------



Descargas

MBimport 2 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.