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