SDCC Ejecutables con retorno a BASIC

Programando el Amstrad en BASIC, C, etc.
KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: SDCC Ejecutables con retorno a BASIC

Mensajepor KaosOverride » Jue 23 Ene , 2014 4:50 pm

Sencillamente quiero hacer un .BIN que lo ejecute y vuelva al Basic

Si el Ready fuese el propmt del MSDOS, querria poder ejecutar por ejemplo un CHKDSK y volver al prompt, no andar reseteando cada vez
Ready
RUN"Hello"
Hello World.
Ready
Por lo que he trasteado un poco con el metodo de Cesar, es bastante trivial adaptarlo a mis necesidades...

hago un programa tonto en BASIC

Código: Seleccionar todo

10 CALL &FFF
Lo guardo con SAVE"CODE.BIN",b,&170,&4000 (El ultimo digito es por abultar)

Extraigo el BIN del DSK

Renombro de .BIN a .BAS

Injecto el .BAS en el DSK, cabecera BASIC, inicio en 0x&170

RUN"CODE.BAS o LOAD"CODE.BAS y se carga el basic pero con la morralla posterior del BIN creado (El RUN" proboca reset al hacer call a &FFF)

Ahora me tengo que ausentar pero cuando pueda, toca probar el resto del metodo.
-"Pegar" dentro del BIN el codigo a partir del ultimo byte del programa BASIC (O un poco mas adelante)
-Cambiar el &FFFF del CALL del BASIC con el offset real de mi codigo.
-Probar

y ver como un RUN"ALGO.BAS" ejecuta mi binario sin haber mas que un solo fichero en el floppy y evitarme duplicidad de ficheros por el duo BAS + BIN :mrgreen:
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: SDCC Ejecutables con retorno a BASIC

Mensajepor pacomix » Vie 24 Ene , 2014 9:52 am

Sigo sintiendo mucha curiosidad sobre el por qué usar Run... al final estas haciendo un call...

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: SDCC Ejecutables con retorno a BASIC

Mensajepor KaosOverride » Vie 24 Ene , 2014 10:41 am

Entre otras cosas, tengo una Wiznet para en un futuro trastear con el CPC, muchas utilidades sencillas (Ping, FTP, etc) son un tanto poco practicas para andar cargando por el metodo MEMORY/LOAD/CALL, y andar con cargadores BASIC me parecen un poco incomodos, prefiero tener un unico fichero.

Subo el "Hello World" autoejecutable desde el Ready con RUN"DISC" y con retorno al BASIC

Basicamente la ñapa es esta:

Editar el CRT0_CPC.S y agregar esto en el area HEADER antes del Reset Vector:

Código: Seleccionar todo

.org 0x170 ;;BASIC LOADER
.db 0x0A,0x00,0x0A,0x00,0x83,0x20,0x1C,0x80,0x01,0x00,0x06,0x00,0x14,0x00,0xB1,0x00,0x00,0x00
Quedando asi:

Código: Seleccionar todo

.area _HEADER (ABS)
.org 0x170 ;;BASIC LOADER
.db 0x0A,0x00,0x0A,0x00,0x83,0x20,0x1C,0x80,0x01,0x00,0x06,0x00,0x14,0x00,0xB1,0x00,0x00,0x00
;; Reset vector
.org 0x185 ;; Start from address &185
jp init

.org 0x195
Lo que hemos agregado es simplemente este programa BASIC tokenizado justo en el area de memoria donde lo carga BASIC

Código: Seleccionar todo

10 CALL &185
20 NEW
El reset vector que era el antiguo punto de entrada se reemplaza a &185 y por eso el CALL apunta a esa direccion. Pero el nuevo punto de entrada lo falseamos al programa BASIC tokenizado en &170

Ya con nuestro nuevo CRT0_CPC compilamos el hello world

En el MAKE.BAT:

Código: Seleccionar todo

sdcc -mz80 --code-loc 0x1BB --data-loc 0 --no-std-crt0 crt0_cpc.rel
....(cosas)
managedsk -C -Isdcc01.bin/disc.bin/BAS/368/0 -Sdisc.dsk
nuestro codigo entraria en la siguiente zona libre de memoria, en &1BB. Y aunque usemos extension BIN, lo metemos con cabecera BASIC y su direccion de carga y ejecucion caracteristicos de los BASIC.

Ahora con un RUN"DISC" vemos el hello world y vuelta al Ready

La memoria BASIC se limpia gracias al NEW de la linea 20

EDIT: Al partir de un BASIC desprotegido, no se puede proteger simplemente cambiando la cabecera con ManageDSk o CPCDiskXP, habria que partir del mismo programa BASIC protegido y modificar el bloque tokenizado :D (He probado a modificar la cabecera BASIC a BASIC protegido y da error)
EDIT2: Por cierto, uso el CRT0_CPC que ha modificado Mochilote para inicializacion de variables
EDIT3: Mochi, si lo ves conveniente, y si vas a reactualizar los tutoriales con tu nuevo CRT0_CPC, sin problema que agreges mi parchecillo como anexo al tutorial Hello World, o si prefieres hacer un tutorial aparte con la ñapa \:D/
Adjuntos
autorun.zip
Hello World SDCC autoejecutable
(1.7 KiB) Descargado 59 veces
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: SDCC Ejecutables con retorno a BASIC

Mensajepor pacomix » Vie 24 Ene , 2014 1:37 pm

Yo veo que eso es buscarle tres pies al gato... La mejor solución en tu caso sería hacer una compilación de todas las herramientas y cargarlas como RSXs para tenerlas siempre disponibles.

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: SDCC Ejecutables con retorno a BASIC

Mensajepor KaosOverride » Vie 24 Ene , 2014 3:29 pm

Los RSX los descarto porque aun no tengo maduro ningun proyecto que lo precise... me parece mas complicado y tengo que andar o grabando romflahboards o cargando previamente en ram.

No se... a mi se me hace mas limpio asi...
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic