Skip to content

Commit

Permalink
Merge pull request #11 from mojontwins/v5_new_z88dk
Browse files Browse the repository at this point in the history
V5 new z88dk
  • Loading branch information
mojontwins authored Jun 29, 2021
2 parents c9e7d2d + 61910e6 commit 03ada31
Show file tree
Hide file tree
Showing 864 changed files with 45,488 additions and 6,343 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ Descarga la última release estable de la v5 de la carpeta "releases".

El motor/_framework_ reside en [/src](./src). El código, tal y como está, genera un juego mínimo por defecto que debes *reemplazar* con el tuyo. Para compilarlo, sigue los siguientes pasos:

1. Descomprime la versión mínima de z88dk que encontrarás en `env/` en la raíz de `C:` (el archivo `env/z88dk10-stripped.zip`). Se creará un directorio `C:\z88dk10\` con los archivos del compilador.
2. Desde una ventana de línea de comandos, entra en `src/dev` y ejecuta los siguientes comandos:
1. Obtén la última versión de **z88dk** (nightly build) desde https://github.com/z88dk/z88dk e instálala.
2. Descomprime la versión de splib2 que encontrarás en `env/` en una ubicación temporal, y posteriormente mueve `spritepack.h` al subdirectorio `include` de **z88dk** (por ejemplo, `c:/z88dk/include`) y `splib2_mk2.lib` al subdirectorio `lib/clibs` de **z88dk** (por ejemplo, `c:/z88dk/lib/clibs/`).
3. Si has instalado **z88dk** en una ubicación diferente de `c:/z88dk/` tendrás que modificar `src/dev/setenv.bat`.
4. Desde una ventana de línea de comandos, entra en `src/dev` y ejecuta los siguientes comandos:

```
$ setenv.bat
Expand Down
17 changes: 16 additions & 1 deletion docs/tutorial-cap01.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,22 @@ Ah, que se me olvidaba. También hicimos un dibujo de la Meemaid. Es ésta:

## Metiendo la cara en el barro

Vamos a empezar a montar cosas. En primer lugar, necesitarás **z88dk**, que es un compilador de C, y **splib2**, que es la biblioteca de gráficos y demás E/S que usamos. Como no tenemos ganas de que te compliques instalando cosas (sobre todo porque la splib2 es muy vieja y es complicado compilarla usando un z88dk moderno, y porque la splib2 que usamos en el motor está modificada por Elías, el mono modificalibrerías), hemos preparado, para los usuarios de Windows, un paquete `z88dk10-stripped.zip` que encontrarás en el directorio `env` de este repositorio y que deberás descomprimir en C:.
Vamos a empezar a montar cosas. En primer lugar, necesitarás **z88dk**, que es un compilador de C, y **splib2**, que es la biblioteca de gráficos y demás E/S que usamos. Hasta ahora habíamos venido usando la versión 1.10 de **z88dk** y una versión modificada de **splib2** con un par de cambios. Sin embargo, a partir de 5.9, **MTE MK1** utiliza la versión más reciente de **z88dk**.

Lo primero que tienes que hacer es instalar **z88dk**. Por lo general, valdrá con que vayas a https://github.com/z88dk/z88dk, descargues la última *nightly build* (que debería estar siempre disponible en [este enlace](http://nightly.z88dk.org/z88dk-win32-latest.zip)), y la descomprimas en `c:\`.

Lo siguiente sería instalar **splib2**. Puedes:

* O bien *construir e instalar splib2* : Para ello entraríamos en `lib/splib2` y ejecutaríamos, en una ventana de linea de comandos, que recompilará toda splib2 con la versión que acabas de instalar de **z88dk** y posteriormente la instalará:

```
$ setenv.bat
$ Makefile.bat
```

* O bien, simplemente **instalar la versión ya compilada** que hay en `env/splib2_mk2.zip`. En el `zip` encontrarás dos archivos: `spritepack.h` que deberás copiar a `c:/z88dk/include` y `splib2_mk2.lib` que deberás copiar en `c:/z88dk/lib/clibs`.

Si todo esto te parece un dolor, puedes coger la versión de **z88dk** con **splib2** preinstalado que hay en `env/z88dk_mt.7z`, que corresponde con la versión `v18462-8d70c5a-20210624` del 25 de Junio de 2021. Sin embargo, pienso que es mejor estar "a la última" y realizar este proceso manualmente, y es lo que deberías hacer si tienes un mínimo de experiencia.

También vamos a necesitar un editor de textos. Si eres programador ya tendrás uno que te guste de la hostia. Si no lo eres, por favor, no utilices el Bloc de Notas de Windows.

Expand Down
8 changes: 4 additions & 4 deletions docs/tutorial-cap13.md
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ Cuando se descomprime un *level bundle*, los primeros 16 bytes del binario corre
Accediendo a los datos en `level_data` podremos leer las dimensiones del nivel actual o donde vamos a empezar, el número máximo de objetos o la vida de los enemigos. Como `level_data` es un puntero a una estructura `extern`, tendremos que usar `->` para acceder a los valores de sus campos, por ejemplo:
```c
rda = level_data->max_objs;
rda = level_data.max_objs;
```

## Configurando el motor
Expand Down Expand Up @@ -754,7 +754,7 @@ Antes hemos visto la fullería que hemos hecho con `PLAYER_NUM_OBJETOS` para pod

### Número de objetos

Como ya hemos visto, se trata de configurar `PLAYER_NUM_OBJETOS` al valor de la cabecera `level_data->max_objs`:
Como ya hemos visto, se trata de configurar `PLAYER_NUM_OBJETOS` al valor de la cabecera `level_data.max_objs`:

```c
#define PLAYER_NUM_OBJETOS (level_lata->max_objs)
Expand Down Expand Up @@ -1149,12 +1149,12 @@ El código que saca la pantalla, toca la música de nuevo nivel y saca el numer
Una cosa que suele ayudar mucho al _gameplay_, sobre todo cuando el juego es más de avanzar que de explorar, es dar un pequeño boost al jugador al subir a la pantalla de arriba. Vamos a detectar que estemos cambiando de pantalla hacia arriba para dar a la VY el máximo valor negativo, lo que hará más fácil dirigir a Goku Mal a una plataforma en lugar de fallar y volver a la pantalla de abajo.
Si recordamos, `my/ci/before_entering_screen.h` se inyecta justo al ir a cambiar pantalla, cuando `n_pant` y `o_pant` son distintas. Justo ahí podremos detectar que `n_pant == (o_pant - level_data->map_w)` y en ese caso aplicar el boost:
Si recordamos, `my/ci/before_entering_screen.h` se inyecta justo al ir a cambiar pantalla, cuando `n_pant` y `o_pant` son distintas. Justo ahí podremos detectar que `n_pant == (o_pant - level_data.map_w)` y en ese caso aplicar el boost:
```c
// before_entering_screen.h
if (n_pant == (o_pant - level_data->map_w)) p_vy = -PLAYER_MAX_VY_SALTANDO;
if (n_pant == (o_pant - level_data.map_w)) p_vy = -PLAYER_MAX_VY_SALTANDO;
```

## Fin!
Expand Down
Binary file added env/splib2_mk2.zip
Binary file not shown.
Binary file removed env/z88dk10-stripped.zip
Binary file not shown.
Binary file added env/z88dk_mt.7z
Binary file not shown.
Binary file added examples/dogmole/bin/ending.bin
Binary file not shown.
Binary file added examples/dogmole/bin/marco.bin
Binary file not shown.
Binary file added examples/dogmole/bin/title.bin
Binary file not shown.
100 changes: 10 additions & 90 deletions examples/dogmole/dev/128k.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,99 +6,19 @@
void SetRAMBank(void) {
#asm
.SetRAMBank
ld a, b
or a
jp z, restISR
xor a
ld i, a
jp keepGoing
.restISR
ld a, $f0
ld i, a
.keepGoing
ld a, 16
or b
ld bc, $7ffd
out (C), a
#endasm
}
/*
// Esto lo empecé pero por ahora lo dejo aparcado :-/
#ifdef MOVE_STUFF_TO_RAM_6
typedef struct {
int x, y;
unsigned char x1, y1, x2, y2;
char mx, my;
char t;
unsigned char life;
} MALOTE;
MALOTE malotes [3];
MALOTE *malote_copy;
void ram6_to_ram (void) {
// This function copies current screen data from RAM 6 to low RAM (new screen)
#asm
di
ld b, 6
call SetRAMBank
#endasm
// Map screen
#ifdef UNPACKED_MAP
map_pointer = 0xc000 + (n_pant * 150);
#else
map_pointer = 0xc000 + (n_pant * 75);
#endif
for (gpit = 0; gpit < 150; gpit ++) {
#ifdef UNPACKED_MAP
// Mapa tipo UNPACKED
gpd = *map_pointer ++;
map_buff [gpit] = gpd;
#else
// Mapa tipo PACKED
if (!(gpit & 1)) {
gpc = *map_pointer ++;
gpd = gpc >> 4;
} else {
gpd = gpc & 15;
}
map_buff [gpit] = gpd;
#endif
}
// Enems
enoffs = n_pant * 3;
#ifdef UNPACKED_MAP
map_pointer = 0xc000 + MAP_W * MAP_H * 150 + 12 * enoffs;
#else
map_pointer = 0xc000 + MAP_W * MAP_H * 75 + 12 * enoffs;
#endif
malote_copy = malotes;
for (gpit = 0; gpit < 36; gpit ++) {
*malote_copy ++ = *map_pointer ++;
}
enoffs = 0;
// Hotspots
// Bolts
// Get back
#asm
di
ld b, 0
call SetRAMBank
#endasm
}
void ram_to_ram6 (void) {
// This function copies current screen data from low RAM to RAM 6 (update)
#asm
di
ld b, 6
call SetRAMBank
#endasm
// Enems
// Hotspots
// Bolts
// Get back
#asm
di
ld b, 0
call SetRAMBank
#endasm
}
#endif
*/
7 changes: 0 additions & 7 deletions examples/dogmole/dev/aplib.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
// MTE MK1 (la Churrera) v5.0
// Copyleft 2010-2014, 2020 by the Mojon Twins

unsigned int ram_address;
unsigned int ram_destination;

#ifdef MODE_128K
unsigned char ram_page;
#endif

#asm

; aPPack decompressor
Expand Down
56 changes: 39 additions & 17 deletions examples/dogmole/dev/assets/ay_fx_numbers.h
Original file line number Diff line number Diff line change
@@ -1,20 +1,42 @@
// MTE MK1 (la Churrera) v5.0
// Copyleft 2010-2014, 2020 by the Mojon Twins

#define SFX_START 0
#define SFX_BREAKABLE_HIT 1
#define SFX_BREAKABLE_BREAK 2
#define SFX_PUSH_BOX 3
#define SFX_OPEN_LOCK 3
#define SFX_SHOOT 4
#define SFX_OBJECT_GET 5
#define SFX_KILL_ENEMY_STEP 6
#define SFX_KILL_ENEMY_SHOOT 6
#define SFX_HIT_ENEMY 7
#define SFX_ONE_OBJECT_GET 8
#define SFX_ONE_OBJECT_WRONG 9
#define SFX_KEY_GET 10
#define SFX_REFILL_GET 11
#define SFX_JUMP 12
#define SFX_SPIKES 13
#define SFX_ENEMY_HIT 14
#ifdef USE_ARKOS_PLAYER
#define SFX_START 1
#define SFX_BREAKABLE_HIT 1
#define SFX_BREAKABLE_BREAK 2
#define SFX_PUSH_BOX 3
#define SFX_OPEN_LOCK 3
#define SFX_SHOOT 4
#define SFX_OBJECT_GET 5
#define SFX_KILL_ENEMY_STEP 6
#define SFX_KILL_ENEMY_SHOOT 6
#define SFX_HIT_ENEMY 7
#define SFX_ONE_OBJECT_GET 8
#define SFX_ONE_OBJECT_WRONG 9
#define SFX_KEY_GET 4
#define SFX_REFILL_GET 11
#define SFX_JUMP 2
#define SFX_SPIKES 2
#define SFX_ENEMY_HIT 8

#else
#define SFX_START 0
#define SFX_BREAKABLE_HIT 1
#define SFX_BREAKABLE_BREAK 2
#define SFX_PUSH_BOX 3
#define SFX_OPEN_LOCK 3
#define SFX_SHOOT 4
#define SFX_OBJECT_GET 5
#define SFX_KILL_ENEMY_STEP 6
#define SFX_KILL_ENEMY_SHOOT 6
#define SFX_HIT_ENEMY 7
#define SFX_ONE_OBJECT_GET 8
#define SFX_ONE_OBJECT_WRONG 9
#define SFX_KEY_GET 10
#define SFX_REFILL_GET 11
#define SFX_JUMP 12
#define SFX_SPIKES 13
#define SFX_ENEMY_HIT 14

#endif
6 changes: 3 additions & 3 deletions examples/dogmole/dev/assets/levels.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
// Map data, 75 or 150 * (MAP_W*MAP_H) bytes
// Bolts, 32 * 4 = 128 bytes
// Tileset, 2304 bytes
// Enemies, MAP_W * MAP_H * 3 * 10 bytes
// Enemies, MAP_W * MAP_H * MAX_ENEMS * 10 bytes
// Hotspots, MAP_W * MAP_H * 3 bytes
// Behs, 48 bytes
// Spriteset, 2312 bytes
Expand Down Expand Up @@ -64,7 +64,7 @@ extern unsigned char font [0];
._font BINARY "font.bin"
#endasm

extern LEVELHEADER level_data [0];
extern LEVELHEADER level_data;
#asm
._level_data defs 16
#endasm
Expand Down Expand Up @@ -94,7 +94,7 @@ extern unsigned char tileset [0];

extern MALOTE malotes [0];
#asm
._malotes defs MAP_W * MAP_H * 3 * 10
._malotes defs MAP_W * MAP_H * MAX_ENEMS * 10
#endasm

extern HOTSPOT hotspots [0];
Expand Down
49 changes: 45 additions & 4 deletions examples/dogmole/dev/compile.bat
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,65 @@ echo Importando GFX
..\..\..\src\utils\png2scr.exe ..\gfx\marco.png ..\gfx\marco.scr > nul
..\..\..\src\utils\png2scr.exe ..\gfx\ending.png ..\gfx\ending.scr > nul
..\..\..\src\utils\png2scr.exe ..\gfx\loading.png loading.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\title.scr title.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\marco.scr marco.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\ending.scr ending.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\title.scr ..\bin\title.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\marco.scr ..\bin\marco.bin > nul
..\..\..\src\utils\apultra.exe ..\gfx\ending.scr ..\bin\ending.bin > nul

if [%1]==[justassets] goto :end

rem echo Running The Librarian
rem ..\utils\librarian2.exe list=..\bin\list.txt index=assets\librarian.h bins_prefix=..\bin\ rams_prefix=..\bin\ > nul

rem *** Música AY: Descomenta el player que vayas a usar (Wyz o Arkos) ***

rem echo Compilando musica 128k - Wyz Player
rem cd ..\mus
rem ..\utils\apultra.exe menu.mus menu.bin
rem ..\utils\apultra.exe level1.mus level1.bin
rem ..\utils\pasmo WYZproPlay47aZXc.ASM ..\bin\RAM1.bin
rem cd ..\dev

rem echo Compilando musica 128k - Arkos Player
rem cd ..\mus_arkos
rem if [%1]==[nomus] goto :nomus
rem ..\utils\build_mus_bin.exe ram1.bin > nul
rem :nomus
rem copy ram1.bin ..\bin
rem copy arkos-addresses.h ..\dev\sound
rem cd ..\dev

:compile
echo Compilando guego
zcc +zx -vn mk1.c -o %game%.bin -lsplib2_mk2.lib -zorg=24000 > nul
zcc +zx -vn mk1.c -O3 -crt0=crt.asm -o %game%.bin -lsplib2_mk2.lib -zorg=24000 > nul
rem zcc +zx -vn mk1.c -o %game%.bin -lsplib2_mk2.lib -zorg=24000 > nul
..\..\..\src\utils\printsize.exe %game%.bin
..\..\..\src\utils\printsize.exe scripts.bin

rem *** Tipo de cargador ***

echo Construyendo cinta
rem cambia LOADER por el nombre que quieres que salga en Program:
..\..\..\src\utils\bas2tap -a10 -sDOGMOLE loader\loader.bas loader.tap > nul
..\..\..\src\utils\bin2tap -o screen.tap -a 16384 loading.bin > nul
..\..\..\src\utils\bin2tap -o main.tap -a 24000 %game%.bin > nul
copy /b loader.tap + screen.tap + main.tap %game%.tap > nul
rem echo Construyendo cinta 128k
rem ..\..\..\src\utils\imanol.exe ^
rem in=loader\loaderzx.asm-orig ^
rem out=loader\loader.asm ^
rem ram1_length=?..\bin\RAM1.bin ^
rem ram3_length=?..\bin\RAM3.bin ^
rem mb_length=?%game%.bin > nul

rem ..\utils\pasmo.exe loader\loader.asm ..\bin\loader.bin loader.txt

rem cambia LOADER por el nombre que quieres que salga en Program:
rem ..\..\..\src\utils\GenTape.exe %game%.tap ^
rem basic 'LOADER' 10 ..\bin\loader.bin ^
rem data loading.bin ^
rem data ..\bin\RAM1.bin ^
rem data ..\bin\RAM3.bin ^
rem data %game%.bin

if [%1]==[justcompile] goto :end
if [%1]==[noclean] goto :end
Expand Down
17 changes: 17 additions & 0 deletions examples/dogmole/dev/crt.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
MODULE zx82_crt0
INCLUDE "zcc_opt.def"
XREF _main ; main() is always external to crt0 code

IF !STACKPTR
defc STACKPTR = $FFFF
ENDIF
IF !CRT_ORG_CODE
defc CRT_ORG_CODE = 32768
ENDIF

org CRT_ORG_CODE

start:
ld sp,STACKPTR
jp _main
Loading

0 comments on commit 03ada31

Please sign in to comment.