Perfecto
Luego he tenido un problema con string slicing. Para obtener el carácter n-ésimo de "cadena", he entendido que se emplea la sintaxis "cadena (n to n)", o llamando a mid, "mid (cadena, n, 1)".
Con este código, usando mid [y = Val (
Mid (terrain, i, 1) )]:
Código: Seleccionar todo
Sub terrainDraw (terrain As String)
' Draws a terrain based on heights in string terrain
For i = 0 To 31
y = Val (Mid (terrain, i, 1))
For j = 0 To y
If j < y Then
Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
Else
Print At 21-j, i; Ink 4; "b"
End If
Next j
Next i
End Sub
Obtengo la siguiente salida (algo fue mal):
Código: Seleccionar todo
Traceback (most recent call last):
File "zxb.py", line 255, in <module>
File "zxb.py", line 197, in main
File "ply\yacc.pyc", line 263, in parse
File "ply\yacc.pyc", line 710, in parseopt
File "zxbparser.pyc", line 3968, in p_val
KeyError: None
Usando slicing [y = Val (
terrain (i To i))]:
Código: Seleccionar todo
Sub terrainDraw (terrain As String)
' Draws a terrain based on heights in string terrain
For i = 0 To 31
y = Val (terrain (i To i))
For j = 0 To y
If j < y Then
Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
Else
Print At 21-j, i; Ink 4; "b"
End If
Next j
Next i
End Sub
La salida es:
Código: Seleccionar todo
Traceback (most recent call last):
File "zxb.py", line 255, in <module>
File "zxb.py", line 203, in main
File "zxbtrad.pyc", line 250, in traverse
File "zxbtrad.pyc", line 959, in traverse
File "zxbtrad.pyc", line 257, in traverse
File "zxbtrad.pyc", line 1103, in traverse
File "zxbtrad.pyc", line 257, in traverse
File "zxbtrad.pyc", line 770, in traverse
File "zxbtrad.pyc", line 375, in traverse
File "zxbtrad.pyc", line 530, in traverse
AttributeError: 'SymbolSTRSLICE' object has no attribute '_mangled'
Por suerte, he podido usar la función asc definida en la biblioteca. Así sí funciona:
Código: Seleccionar todo
Sub terrainDraw (terrain As String)
' Draws a terrain based on heights in string terrain
For i = 0 To 31
y = asc (terrain, i) - 48
For j = 0 To y
If j < y Then
Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
Else
Print At 21-j, i; Ink 4; "b"
End If
Next j
Next i
End Sub
Si necesitas el código completo para hacer pruebas, te lo mando. Uso la última versión que hay en la web, la 1.2.6.
Otra cosa, ¿dónde puedo encontrar documentación y/o ejemplos sobre cómo pasar información entre BASIC y secciones asm? Necesito leer el valor de variables de BASIC dentro del código contenido en una sección asm/endasm.