diff --git a/firmware/FIRMWARE.ZX1 b/firmware/FIRMWARE.ZX1 index 285010c..06faa49 100644 Binary files a/firmware/FIRMWARE.ZX1 and b/firmware/FIRMWARE.ZX1 differ diff --git a/firmware/FIRMWARE.ZX2 b/firmware/FIRMWARE.ZX2 index 70942ee..f59ce6a 100644 Binary files a/firmware/FIRMWARE.ZX2 and b/firmware/FIRMWARE.ZX2 differ diff --git a/firmware/FIRMWARE.ZX3 b/firmware/FIRMWARE.ZX3 index f628c3a..dda960f 100644 Binary files a/firmware/FIRMWARE.ZX3 and b/firmware/FIRMWARE.ZX3 differ diff --git a/firmware/FIRMWARE.ZXD b/firmware/FIRMWARE.ZXD index c2750c3..a02573c 100644 Binary files a/firmware/FIRMWARE.ZXD and b/firmware/FIRMWARE.ZXD differ diff --git a/firmware/firmware.asm b/firmware/firmware.asm index dfdba38..300be46 100644 --- a/firmware/firmware.asm +++ b/firmware/firmware.asm @@ -1155,16 +1155,17 @@ main call prnmul ; Harward tests ... ld iy, quietb ld bc, $0f0b -main1 call showop + call showop defw cad28 defw cad110 defw cad111 defw cad112 defw cad113 defw $ffff - ld a, iyl - rrca - jr c, main1 + call showop + defw cad28 + defw cad29 + defw $ffff main2 call showop defw cad30 defw cad31 @@ -1221,6 +1222,8 @@ main4 call showop sub keyiss&$ff jr z, main5 jr nc, main6 + inc a + jp z, advana call popupw ; quiet or crc (enabled or disabled) defw cad28 defw cad110 @@ -2915,7 +2918,7 @@ advan4 djnz advan5 defw $ffff ret advan5 djnz advan6 - call popupw ; Scanlines +advana call popupw ; Scanlines defw cad28 defw cad29 defw $ffff @@ -3004,7 +3007,7 @@ exit4 djnz exit5 exit5 djnz exit6 jp alto loadch exit6 call savech -exit7 jp star17 +exit7 jp star11 ;++++++++++++++++++++++++++++++++++ ;++++++++ Boot list ++++++++ diff --git a/firmware/make.bat b/firmware/make.bat index 384875b..42b2476 100644 --- a/firmware/make.bat +++ b/firmware/make.bat @@ -1,11 +1,27 @@ -if not exist strings.bin.zx7b echo > strings.bin.zx7b -if not exist version.asm echo define version 1 > version.asm -sjasmplus firmware.asm -fcut firmware_strings.rom 7e00 -7e00 strings.bin -zx7b strings.bin strings.bin.zx7b -sjasmplus firmware.asm -fcut firmware_strings.rom 0000 4000 firmware.rom -copy /y firmware.rom FIRMWARE.ZX1 -rem GenRom sm12 BIOS firmware.rom firm.TAP -rem cgleches firm.tap firm.wav 3 -rem firm.wav +echo define version 1 > version.asm +sjasmplus firmware.asm +fcut firmware_strings.rom 7e00 -7e00 strings.bin +zx7b strings.bin strings.bin.zx7b +sjasmplus firmware.asm +fcut firmware_strings.rom 0000 4000 FIRMWARE.ZX1 +echo define version 2 > version.asm +sjasmplus firmware.asm +fcut firmware_strings.rom 7e00 -7e00 strings.bin +zx7b strings.bin strings.bin.zx7b +sjasmplus firmware.asm +fcut firmware_strings.rom 0000 4000 FIRMWARE.ZX2 +echo define version 3 > version.asm +sjasmplus firmware.asm +fcut firmware_strings.rom 7e00 -7e00 strings.bin +zx7b strings.bin strings.bin.zx7b +sjasmplus firmware.asm +fcut firmware_strings.rom 0000 4000 FIRMWARE.ZXD +echo define version 4 > version.asm +sjasmplus firmware.asm +fcut firmware_strings.rom 7e00 -7e00 strings.bin +zx7b strings.bin strings.bin.zx7b +sjasmplus firmware.asm +fcut firmware_strings.rom 0000 4000 FIRMWARE.ZX3 +rem GenRom sm12 BIOS firmware.rom firm.TAP +rem cgleches firm.tap firm.wav 3 +rem firm.wav diff --git a/firmware/scroll/FuenteABin.c b/firmware/scroll/FuenteABin.c index b02e14d..6e97a44 100644 --- a/firmware/scroll/FuenteABin.c +++ b/firmware/scroll/FuenteABin.c @@ -1,57 +1,57 @@ -#include "lodepng.c" -#include -#include -unsigned char *image, *pixel, output[0x280]; -unsigned error, i, j, k, l, celda, fondo, tinta, outpos= 0; -FILE *fo; - -int check(int value){ - return value==0 || value==192 || value==255; -} - -int tospec(int r, int g, int b){ - return g>>7<<2 | r>>7<<1 | b>>7; -} - -int main(int argc, char *argv[]){ - error= lodepng_decode32_file(&image, &i, &j, "fuente6x8.png"); - if( error ) - printf("\nError %u: %s\n", error, lodepng_error_text(error)), - exit(-1); - if( i!= 96 || j!= 40 ) - printf("\nError. Incorrect size, must be 96x40\n"), - exit(-1); - fo= fopen("fuente6x8.bin", "wb+"); - if( !fo ) - printf("\nCannot create output file\n"), - exit(-1); - for ( i= 0; i < 5; i++ ) - for ( j= 0; j < 16; j++ ){ - pixel= &image[((j|i<<7)*6)<<2]; - fondo= tinta= tospec(pixel[0], pixel[1], pixel[2]); - for ( k= 0; k < 8; k++ ){ - celda= 0; - for ( l= 0; l < 6; l++ ){ - pixel= &image[((j|i<<7)*6 + k*96 + l)<<2]; - if( !(check(pixel[0]) && check(pixel[1]) && check(pixel[2])) - || ((char)pixel[0]*-1 | (char)pixel[1]*-1 | (char)pixel[2]*-1)==65 ) - printf("\nThe pixel (%d, %d) has an incorrect color\n" , j*6+l, i*8+k), - exit(-1); - if( tinta != tospec(pixel[0], pixel[1], pixel[2]) ) - if( fondo != tospec(pixel[0], pixel[1], pixel[2]) ){ - if( tinta != fondo ) - printf("\nThe pixel (%d, %d) has a third color in the cell\n", j*6+l, i*8+k), - exit(-1); - tinta= tospec(pixel[0], pixel[1], pixel[2]); - } - celda<<= 1; - celda|= fondo != tospec(pixel[0], pixel[1], pixel[2]); - } - output[outpos++]= celda<<2; - } - } - fwrite(output, outpos, 1, fo); - fclose(fo); - printf("\nDone\n"); - free(image); -} +#include "lodepng.c" +#include +#include +unsigned char *image, *pixel, output[0x280]; +unsigned error, i, j, k, l, celda, fondo, tinta, outpos= 0; +FILE *fo; + +int check(int value){ + return value==0 || value==192 || value==255; +} + +int tospec(int r, int g, int b){ + return g>>7<<2 | r>>7<<1 | b>>7; +} + +int main(int argc, char *argv[]){ + error= lodepng_decode32_file(&image, &i, &j, "fuente6x8.png"); + if( error ) + printf("\nError %u: %s\n", error, lodepng_error_text(error)), + exit(-1); + if( i!= 96 || j!= 40 ) + printf("\nError. Incorrect size, must be 96x40\n"), + exit(-1); + fo= fopen("fuente6x8.bin", "wb+"); + if( !fo ) + printf("\nCannot create output file\n"), + exit(-1); + for ( i= 0; i < 5; i++ ) + for ( j= 0; j < 16; j++ ){ + pixel= &image[((j|i<<7)*6)<<2]; + fondo= tinta= tospec(pixel[0], pixel[1], pixel[2]); + for ( k= 0; k < 8; k++ ){ + celda= 0; + for ( l= 0; l < 6; l++ ){ + pixel= &image[((j|i<<7)*6 + k*96 + l)<<2]; + if( !(check(pixel[0]) && check(pixel[1]) && check(pixel[2])) + || ((char)pixel[0]*-1 | (char)pixel[1]*-1 | (char)pixel[2]*-1)==65 ) + printf("\nThe pixel (%d, %d) has an incorrect color\n" , j*6+l, i*8+k), + exit(-1); + if( tinta != tospec(pixel[0], pixel[1], pixel[2]) ) + if( fondo != tospec(pixel[0], pixel[1], pixel[2]) ){ + if( tinta != fondo ) + printf("\nThe pixel (%d, %d) has a third color in the cell\n", j*6+l, i*8+k), + exit(-1); + tinta= tospec(pixel[0], pixel[1], pixel[2]); + } + celda<<= 1; + celda|= fondo != tospec(pixel[0], pixel[1], pixel[2]); + } + output[outpos++]= celda<<2; + } + } + fwrite(output, outpos, 1, fo); + fclose(fo); + printf("\nDone\n"); + free(image); +} diff --git a/firmware/scroll/game.asm b/firmware/scroll/game.asm index 2a93663..cd4cc6a 100644 --- a/firmware/scroll/game.asm +++ b/firmware/scroll/game.asm @@ -1,796 +1,796 @@ - output scroll.bin - org $5e6d -string dz $45 - dz $45, 'We want to thank all backers' - dz $45 - dz $48, 'AdvanSys' - dz $48, 'aguij~n' - dz $48, 'Airsoft' - dz $48, 'Aivalahostia' - dz $48, 'Akis Pluto63 Fletsios' - dz $48, 'alberchi' - dz $48, 'albor{n70' - dz $48, 'aldelgado' - dz $48, 'Alejandro Ib{\ez' - dz $48, 'Alejandro Valero > wilco2009' - dz $48, 'Alfonso Mart}nez > Sr?Presley' - dz $48, 'AlfredoLambda' - dz $48, 'alioth' - dz $48, '[lvaro Adrados' - dz $48, 'Alxinho' - dz $48, 'Andrew Munro' - dz $48, 'AndyRCM' - dz $48, 'Antonio Ant',$7f,'nez Rom{n' - dz $48, 'Antonio Peregr}n' - dz $48, 'Antxiko' - dz $48, 'arkapone' - dz $48, 'Arnau Jess' - dz $48, 'arrizen' - dz $48, 'Arturo Arenas Laguna' - dz $48, 'Astorri' - dz $48, 'AugustoRuiz' - dz $48, 'BCH' - dz $48, 'Baycorps' - dz $48, 'Ben>kenobi' - dz $48, 'Brendan Alford' - dz $48, 'Broteletal' - dz $48, 'Carlos Castre\o' - dz $48, 'Carmeloco' - dz $48, 'C|sar Moreno L~pez' - dz $48, 'chernandezba' - dz $48, 'Chernobyl' - dz $48, 'ciberchuso' - dz $48, 'Ckultur' - dz $48, 'dammnield' - dz $48, 'Dandare' - dz $48, 'Daniel Escudero > Quantumleap' - dz $48, 'darro99' - dz $48, 'David Bernal Dom}nguez' - dz $48, 'David Bl^ck' - dz $48, 'David Carri~n > Bytecnia' - dz $48, 'David [lvarez Torres' - dz $48, 'Deadtool' - dz $48, 'Diego Macktek' - dz $48, 'Diegols' - dz $48, 'DoDesKaDen' - dz $48, 'Drachco' - dz $48, 'Eduardo Solans' - dz $48, 'Eduardo Y{\ez Parareda' - dz $48, 'electrotrains' - dz $48, 'eltargui' - dz $48, 'eltator' - dz $48, 'Emilio > modosita68' - dz $48, 'Emilio Ortiz' - dz $48, 'Eneakao' - dz $48, 'Eric Magnus' - dz $48, 'Erwin Rattinger' - dz $48, 'Esemarcus' - dz $48, 'fantastic64' - dz $48, 'fastofruto' - dz $48, 'Fede Jerez' - dz $48, 'Federico J? [lvarez Valero' - dz $48, 'Felipe Gamusino' - dz $48, 'F|lix Rivero' - dz $48, 'Fino de Benej',$7f,'zar' - dz $48, 'flopping' - dz $48, 'flunky' - dz $48, 'Fran Matsusaka' - dz $48, 'Francisco Huerta' - dz $48, 'Francisco Javier D}az Blanco' - dz $48, 'Francisco Javier Nieto' - dz $48, 'Francisco L? Vargas' - dz $48, 'Fredman' - dz $48, 'garvidal' - dz $48, 'GUi' - dz $48, 'Gacel Miguel' - dz $48, 'Garra' - dz $48, 'Gazpachuelo' - dz $48, 'GroovyDrifter' - dz $48, 'Gumpbito' - dz $48, 'Gustavo Javier Fern{ndez Sanz' - dz $48, 'Hern{n [lvarez' - dz $48, '@HoracioGloton' - dz $48, 'Hugo Sanch~n' - dz $48, 'hyperandroid' - dz $48, 'Ignacobo' - dz $48, 'I\aki Mart}nez > IMD?guru' - dz $48, 'IrregularShed' - dz $48, 'Iv{n Ruiz Etxabe' - dz $48, 'javidoom' - dz $48, 'jgilcas' - dz $48, 'JGranadino' - dz $48, 'jjmarin' - dz $48, 'jmgperez' - dz $48, 'JMV' - dz $48, 'JSJ' - dz $48, 'Javier Albizu' - dz $48, 'Javier Basilio' - dz $48, 'Javier Ortiz ' - dz $48, 'Javier Rueda > Blackhero' - dz $48, 'Javier S{ez Alonso' - dz $48, 'Javier Torres > kowols' - dz $48, 'Jean' - dz $48, 'Jeff Bennett' - dz $48, 'Jes',$7f,'s M' - dz $48, 'Jes',$7f,'s Relinque > Pedja' - dz $48, 'Jevilon' - dz $48, 'Joe Morgan' - dz $48, 'Jordi Alabau Basart' - dz $48, 'Jordi Mestres Ruiz' - dz $48, 'Jordi Ramos' - dz $48, 'Jos| Luis Carrasco' - dz $48, 'Jose Luis Franzen' - dz $48, 'Jos| Manuel Bra\a [lvarez ' - dz $48, 'Jos| Manuel Cardona' - dz $48, 'Jose M{rquez' - dz $48, 'Jose Rodelgo > Joss' - dz $48, 'Juan Antonio L? Almagro' - dz $48, 'Juan Cruz Mangado' - dz $48, 'Juan Fco Torres' - dz $48, 'Juan Luis Fern{ndez > XurL' - dz $48, 'Juan Moreira' - dz $48, 'JuanVe' - dz $48, 'Juanillo67' - dz $48, 'Juanjo > Yog' - dz $48, 'Juli{n Garrido' - dz $48, 'Julio Mateos' - dz $48, 'Julio Medina' - dz $48, 'Jungsi' - dz $48, 'Kan' - dz $48, 'Kelvinator' - dz $48, 'Kever67>NL' - dz $48, 'Kevin Quinn ' - dz $48, 'KgMcNeil' - dz $48, 'Lenko' - dz $48, 'Leticia Vargas Flores' - dz $48, 'Lex Sparrow > VZ' - dz $48, 'Luis Alberto Gris Casinegro' - dz $48, 'Luis Brocan Broky' - dz $48, 'Luis I? Garc}a > Benway' - dz $48, 'Luis Ruiz' - dz $48, 'Luis Soto' - dz $48, 'LukeZab > Luca Zabeo' - dz $48, 'Mac}as Pajas' - dz $48, 'Manu Huertas' - dz $48, 'Manu Sevilla' - dz $48, 'Manuel Naranjo Vera' - dz $48, 'Manuel Sagra de Diego' - dz $48, 'mapi20' - dz $48, 'MarcusW' - dz $48, 'Martin Saguer' - dz $48, 'Mejias3D' - dz $48, 'melvex' - dz $48, 'Metalbrain' - dz $48, 'Microhobbit' - dz $48, 'microsnk' - dz $48, 'Miguel [ngel' - dz $48, 'Miguel G? Prada' - dz $48, 'Miguel Ser~n' - dz $48, 'mike=01' - dz $48, 'msch' - dz $48, 'Nanoc' - dz $48, 'Neil Parsons' - dz $48, 'Neuro' - dz $48, 'Newsdee' - dz $48, 'nivaria' - dz $48, 'nonnoes' - dz $48, 'Norbert>K?' - dz $48, 'nuggetreggae' - dz $48, 'Obocaman' - dz $48, ']scar BraindeaD' - dz $48, ']scar Hern{ndez > Gatuso' - dz $48, ']scar Ruiz' - dz $48, 'PacMobius' - dz $48, 'Pachu003' - dz $48, 'Paco Montes' - dz $48, 'Pagantipaco' - dz $48, 'Pedro Romero' - dz $48, 'Peter Robert Jones' - dz $48, 'Peter \'Sweetlilmre\' Edwards' - dz $48, 'peterthedark' - dz $48, 'princemegahit' - dz $48, 'Radastan' - dz $48, 'Rafa Vico' - dz $48, 'Rafa Zitror' - dz $48, 'Raindog' - dz $48, 'Ramon Berto' - dz $48, 'RetroManiac' - dz $48, 'RetroPixeleadores>FloppyDerno' - dz $48, 'RetroVirtualMachine' - dz $48, 'RetroWorks' - dz $48, 'Retrocant' - dz $48, 'RiCCo' - dz $48, 'Rinconete' - dz $48, 'Robcfg' - dz $48, 'Robert Perelegre Orteu' - dz $48, 'Roberto Henr}quez' - dz $48, 'Rub|n Guti|rrez' - dz $48, 'Sad1942' - dz $48, 'Salvador Perugorria Lorente' - dz $48, 'Santiago Romero' - dz $48, 'Schombi' - dz $48, 'Sebasti{n Tito Rodr}guez' - dz $48, 'serbalgi' - dz $48, 'Sergio L~pez Cantero' - dz $48, 'Sergio S{nchez > RaNaRaMa' - dz $48, 'Shikit}n' - dz $48, 'sinclair200' - dz $48, 'Skywalky' - dz $48, 'spark2k06' - dz $48, 'SpeedXP' - dz $48, 'stcube' - dz $48, 'Stratotrasto' - dz $48, 'TallerSeverino' - dz $48, 'TarkuS666' - dz $48, '@TessMSX' - dz $48, 'thEpOpE' - dz $48, 'TitoxUnix' - dz $48, 'Tom Dalby' - dz $48, 'Tromponauta' - dz $48, 'uniVNG' - dz $48, 'Uto' - dz $48, 'utopian' - dz $48, 'Vago > Avalon Software' - dz $48, 'Vejeta' - dz $48, 'Vicente Sim~n' - dz $48, 'vicenteo' - dz $48, 'V}ctor Robledo > Robe=Inie' - dz $48, 'vidamia' - dz $48, 'Visualtorpedo' - dz $48, 'web8bits' - dz $48, 'weirdocollector' - dz $48, 'Will Woodvine' - dz $48, 'Yombo' - dz $48, 'Zolt{n B_sz_rm|nyi' - dz $48, 'Zup' - dz $48 - dz $43, 'The ZX>UNO core team are' - dz $43 - dz $48, 'Superfo' - dz $48, 'antoniovillena' - dz $48, 'McLeod' - dz $48, 'Quest' - dz $48, 'Hark0' - dz $48 - dz $42, 'With additional support from' - dz $42 - dz $48, 'DistWave' - dz $48, 'Radastan' - dz $48, 'jepalza' - dz $48, 'Mejias3D' - dz $48, 'chernandezba' - dz $48, 'Anyone We Forgot???' - dz $48 - dz $44, 'Easter egg credits' - dz $44 - dz $48, 'Coder: Antonio Villena' - dz $48, 'Music: Yerzmyey' - dz $48, 'Graphics: Quest' - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - dz $48 - defb 1 -music ld (vari+2), ix - incbin music.bin -fuente incbin fuente6x8.bin -start ld hl, $c000 - ld de, $c001 - ld bc, $017f - ld (hl), l - ldir - ld hl, fuente - ld b, 3 - ldir - ld hl, fondo - ld b, $40 ; filtro RCS inverso -start0 ld a, b - xor c - and $f8 - xor c - ld d, a - xor b - xor c - rlca - rlca - ld e, a - inc bc - ldi - inc bc - ld a, b - sub $58 - jr nz, start0 - ld b, 3 - ldir - out ($fe), a - inc a - ex af, af' - ld hl, $c000 - ld de, $c400 -start1 ld b, $08 -start2 ld a, (hl) - rrca - ld (de), a - inc de - cpi - jp pe, start2 - jr nc, start1 - ld a, $c9 - ld ($c006), a - ld hl, $716f - call music+7 -start3 call $6e77 - ei - halt - di - ld bc, 5 -start4 djnz start4 - dec c - jr nz, start4 - - macro linea src1, src2, src3, dst1, dst2, dst3 - ld sp, $4005+$800*src1+$100*src3+$20*src2 - pop hl - pop de - pop bc - pop af - exx - pop hl - pop de - pop bc - ld sp, $4013+$800*dst1+$100*dst3+$20*dst2 - push bc - push de - push hl - exx - push af - push bc - push de - push hl - ld sp, $4013+$800*src1+$100*src3+$20*src2 - pop hl - pop de - pop bc - pop af - ld sp, $401b+$800*dst1+$100*dst3+$20*dst2 - push af - push bc - push de - push hl - endm - linea 0, 0, 1, 0, 0, 0 - linea 0, 0, 2, 0, 0, 1 - linea 0, 0, 3, 0, 0, 2 - linea 0, 0, 4, 0, 0, 3 - linea 0, 0, 5, 0, 0, 4 - linea 0, 0, 6, 0, 0, 5 - linea 0, 0, 7, 0, 0, 6 - linea 0, 1, 0, 0, 0, 7 - linea 0, 1, 1, 0, 1, 0 - linea 0, 1, 2, 0, 1, 1 - linea 0, 1, 3, 0, 1, 2 - linea 0, 1, 4, 0, 1, 3 - linea 0, 1, 5, 0, 1, 4 - linea 0, 1, 6, 0, 1, 5 - linea 0, 1, 7, 0, 1, 6 - linea 0, 2, 0, 0, 1, 7 - linea 0, 2, 1, 0, 2, 0 - linea 0, 2, 2, 0, 2, 1 - linea 0, 2, 3, 0, 2, 2 - linea 0, 2, 4, 0, 2, 3 - linea 0, 2, 5, 0, 2, 4 - linea 0, 2, 6, 0, 2, 5 - linea 0, 2, 7, 0, 2, 6 - linea 0, 3, 0, 0, 2, 7 - linea 0, 3, 1, 0, 3, 0 - linea 0, 3, 2, 0, 3, 1 - linea 0, 3, 3, 0, 3, 2 - linea 0, 3, 4, 0, 3, 3 - linea 0, 3, 5, 0, 3, 4 - linea 0, 3, 6, 0, 3, 5 - linea 0, 3, 7, 0, 3, 6 - linea 0, 4, 0, 0, 3, 7 - linea 0, 4, 1, 0, 4, 0 - linea 0, 4, 2, 0, 4, 1 - linea 0, 4, 3, 0, 4, 2 - linea 0, 4, 4, 0, 4, 3 - linea 0, 4, 5, 0, 4, 4 - linea 0, 4, 6, 0, 4, 5 - linea 0, 4, 7, 0, 4, 6 - linea 0, 5, 0, 0, 4, 7 - linea 0, 5, 1, 0, 5, 0 - linea 0, 5, 2, 0, 5, 1 - linea 0, 5, 3, 0, 5, 2 - linea 0, 5, 4, 0, 5, 3 - linea 0, 5, 5, 0, 5, 4 - linea 0, 5, 6, 0, 5, 5 - linea 0, 5, 7, 0, 5, 6 - linea 0, 6, 0, 0, 5, 7 - linea 0, 6, 1, 0, 6, 0 - linea 0, 6, 2, 0, 6, 1 - linea 0, 6, 3, 0, 6, 2 - linea 0, 6, 4, 0, 6, 3 - linea 0, 6, 5, 0, 6, 4 - linea 0, 6, 6, 0, 6, 5 - linea 0, 6, 7, 0, 6, 6 - linea 0, 7, 0, 0, 6, 7 - linea 0, 7, 1, 0, 7, 0 - linea 0, 7, 2, 0, 7, 1 - linea 0, 7, 3, 0, 7, 2 - linea 0, 7, 4, 0, 7, 3 - linea 0, 7, 5, 0, 7, 4 - linea 0, 7, 6, 0, 7, 5 - linea 0, 7, 7, 0, 7, 6 - linea 1, 0, 0, 0, 7, 7 - linea 1, 0, 1, 1, 0, 0 - linea 1, 0, 2, 1, 0, 1 - linea 1, 0, 3, 1, 0, 2 - linea 1, 0, 4, 1, 0, 3 - linea 1, 0, 5, 1, 0, 4 - linea 1, 0, 6, 1, 0, 5 - linea 1, 0, 7, 1, 0, 6 - linea 1, 1, 0, 1, 0, 7 - linea 1, 1, 1, 1, 1, 0 - linea 1, 1, 2, 1, 1, 1 - linea 1, 1, 3, 1, 1, 2 - linea 1, 1, 4, 1, 1, 3 - linea 1, 1, 5, 1, 1, 4 - linea 1, 1, 6, 1, 1, 5 - linea 1, 1, 7, 1, 1, 6 - linea 1, 2, 0, 1, 1, 7 - linea 1, 2, 1, 1, 2, 0 - linea 1, 2, 2, 1, 2, 1 - linea 1, 2, 3, 1, 2, 2 - linea 1, 2, 4, 1, 2, 3 - linea 1, 2, 5, 1, 2, 4 - linea 1, 2, 6, 1, 2, 5 - linea 1, 2, 7, 1, 2, 6 - linea 1, 3, 0, 1, 2, 7 - linea 1, 3, 1, 1, 3, 0 - linea 1, 3, 2, 1, 3, 1 - linea 1, 3, 3, 1, 3, 2 - linea 1, 3, 4, 1, 3, 3 - linea 1, 3, 5, 1, 3, 4 - linea 1, 3, 6, 1, 3, 5 - linea 1, 3, 7, 1, 3, 6 - linea 1, 4, 0, 1, 3, 7 - linea 1, 4, 1, 1, 4, 0 - linea 1, 4, 2, 1, 4, 1 - linea 1, 4, 3, 1, 4, 2 - linea 1, 4, 4, 1, 4, 3 - linea 1, 4, 5, 1, 4, 4 - linea 1, 4, 6, 1, 4, 5 - linea 1, 4, 7, 1, 4, 6 - linea 1, 5, 0, 1, 4, 7 - linea 1, 5, 1, 1, 5, 0 - linea 1, 5, 2, 1, 5, 1 - linea 1, 5, 3, 1, 5, 2 - linea 1, 5, 4, 1, 5, 3 - linea 1, 5, 5, 1, 5, 4 - linea 1, 5, 6, 1, 5, 5 - linea 1, 5, 7, 1, 5, 6 - linea 1, 6, 0, 1, 5, 7 - linea 1, 6, 1, 1, 6, 0 - linea 1, 6, 2, 1, 6, 1 - linea 1, 6, 3, 1, 6, 2 - linea 1, 6, 4, 1, 6, 3 - linea 1, 6, 5, 1, 6, 4 - linea 1, 6, 6, 1, 6, 5 - linea 1, 6, 7, 1, 6, 6 - linea 1, 7, 0, 1, 6, 7 - linea 1, 7, 1, 1, 7, 0 - linea 1, 7, 2, 1, 7, 1 - linea 1, 7, 3, 1, 7, 2 - linea 1, 7, 4, 1, 7, 3 - linea 1, 7, 5, 1, 7, 4 - linea 1, 7, 6, 1, 7, 5 - linea 1, 7, 7, 1, 7, 6 - linea 2, 0, 0, 1, 7, 7 - linea 2, 0, 1, 2, 0, 0 - linea 2, 0, 2, 2, 0, 1 - linea 2, 0, 3, 2, 0, 2 - linea 2, 0, 4, 2, 0, 3 - linea 2, 0, 5, 2, 0, 4 - linea 2, 0, 6, 2, 0, 5 - linea 2, 0, 7, 2, 0, 6 - linea 2, 1, 0, 2, 0, 7 - linea 2, 1, 1, 2, 1, 0 - linea 2, 1, 2, 2, 1, 1 - linea 2, 1, 3, 2, 1, 2 - linea 2, 1, 4, 2, 1, 3 - linea 2, 1, 5, 2, 1, 4 - linea 2, 1, 6, 2, 1, 5 - linea 2, 1, 7, 2, 1, 6 - linea 2, 2, 0, 2, 1, 7 - linea 2, 2, 1, 2, 2, 0 - linea 2, 2, 2, 2, 2, 1 - linea 2, 2, 3, 2, 2, 2 - linea 2, 2, 4, 2, 2, 3 - linea 2, 2, 5, 2, 2, 4 - linea 2, 2, 6, 2, 2, 5 - linea 2, 2, 7, 2, 2, 6 - linea 2, 3, 0, 2, 2, 7 - linea 2, 3, 1, 2, 3, 0 - linea 2, 3, 2, 2, 3, 1 - linea 2, 3, 3, 2, 3, 2 - linea 2, 3, 4, 2, 3, 3 - linea 2, 3, 5, 2, 3, 4 - linea 2, 3, 6, 2, 3, 5 - linea 2, 3, 7, 2, 3, 6 - linea 2, 4, 0, 2, 3, 7 - linea 2, 4, 1, 2, 4, 0 - linea 2, 4, 2, 2, 4, 1 - linea 2, 4, 3, 2, 4, 2 - linea 2, 4, 4, 2, 4, 3 - linea 2, 4, 5, 2, 4, 4 - linea 2, 4, 6, 2, 4, 5 - linea 2, 4, 7, 2, 4, 6 - linea 2, 5, 0, 2, 4, 7 - linea 2, 5, 1, 2, 5, 0 - linea 2, 5, 2, 2, 5, 1 - linea 2, 5, 3, 2, 5, 2 - linea 2, 5, 4, 2, 5, 3 - linea 2, 5, 5, 2, 5, 4 - linea 2, 5, 6, 2, 5, 5 - linea 2, 5, 7, 2, 5, 6 - linea 2, 6, 0, 2, 5, 7 - linea 2, 6, 1, 2, 6, 0 - linea 2, 6, 2, 2, 6, 1 - linea 2, 6, 3, 2, 6, 2 - linea 2, 6, 4, 2, 6, 3 - linea 2, 6, 5, 2, 6, 4 - linea 2, 6, 6, 2, 6, 5 - linea 2, 6, 7, 2, 6, 6 - linea 2, 7, 0, 2, 6, 7 - linea 2, 7, 1, 2, 7, 0 - linea 2, 7, 2, 2, 7, 1 - linea 2, 7, 3, 2, 7, 2 - linea 2, 7, 4, 2, 7, 3 - linea 2, 7, 5, 2, 7, 4 - linea 2, 7, 6, 2, 7, 5 - linea 2, 7, 7, 2, 7, 6 - - ld sp, $401b+$800*2+$100*7+$20*7 - sbc hl, hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - ld sp, hl -vari ld ix, string - ld hl, start3 - push hl - ld hl, music - push hl - ex af, af' - rrca - jr c, start5 - ex af, af' - ret -start5 ex af, af' - linea 3, 1, 0, 3, 0, 0 - linea 3, 2, 0, 3, 1, 0 - linea 3, 3, 0, 3, 2, 0 - linea 3, 4, 0, 3, 3, 0 - linea 3, 5, 0, 3, 4, 0 - linea 3, 6, 0, 3, 5, 0 - linea 3, 7, 0, 3, 6, 0 - linea 3, 0, 1, 3, 7, 0 - linea 3, 1, 1, 3, 0, 1 - linea 3, 2, 1, 3, 1, 1 - linea 3, 3, 1, 3, 2, 1 - linea 3, 4, 1, 3, 3, 1 - linea 3, 5, 1, 3, 4, 1 - linea 3, 6, 1, 3, 5, 1 - linea 3, 7, 1, 3, 6, 1 - linea 3, 0, 2, 3, 7, 1 - linea 3, 1, 2, 3, 0, 2 - linea 3, 2, 2, 3, 1, 2 - linea 3, 3, 2, 3, 2, 2 - linea 3, 4, 2, 3, 3, 2 - linea 3, 5, 2, 3, 4, 2 - linea 3, 6, 2, 3, 5, 2 - ld sp, $fffc - ld b, (ix) - djnz start6 - ld ix, string -start6 inc ix - ld hl, $5ac5 - ld (hl), b - ld de, $5ac6 - ld bc, 21 - ldir - xor a - push ix - pop hl - ld bc, $172b - cpir - srl c - ld a, c - jr c, prn2 - and %11111100 - ld d, a - xor c - ld c, a - ld e, a - jr z, prn1 - dec e -prn1 ld a, d - rrca - ld d, a - rrca - add a, d - add a, e - ld e, a - ld a, b - and %00011000 - or %01000000 - ld d, a - ld a, b - and %00000111 - rrca - rrca - rrca - add a, e - ld e, a - rr c - jr c, pos26 - jr nz, pos4 -pos0 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c0 >> 2 - call simple -pos2 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d8 >> 2 - ld bc, $04fc - call doble -pos4 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d0 >> 2 - ld bc, $04f0 - call doble -pos6 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c8 >> 2 - call simple - inc de - jr pos0 -pos26 rr c - jr c, pos6 - jr pos2 -prn2 and %11111100 - ld d, a - xor c - ld c, a - cp 2 - adc a, -1 - ld e, a - ld a, d - rrca - ld d, a - rrca - add a, d - add a, e - ld e, a - ld a, b - and %00011000 - or %01000000 - ld d, a - ld a, b - and %00000111 - rrca - rrca - rrca - add a, e - ld e, a - rr c - jr c, pos37 - jr nz, pos5 -pos1 ld a, (ix) - inc ix - add a, a - ret z - ld h, $cc >> 2 - ld bc, $04e0 - call doble -pos3 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c4 >> 2 - call simple -pos5 ld a, (ix) - inc ix - add a, a - ret z - ld h, $dc >> 2 - ld bc, $04fe - call doble -pos7 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d4 >> 2 - ld bc, $04f8 - call doble - jr pos1 -pos37 rr c - jr c, pos7 - jr pos3 - -simple ld b, 4 - ld l, a - add hl, hl - add hl, hl -simple2 ld a, (de) - xor (hl) - ld (de), a - inc d - inc l - ld a, (de) - xor (hl) - ld (de), a - inc d - inc l - djnz simple2 - ld hl, $f800 - add hl, de - ex de, hl - ret - -doble ld l, a - add hl, hl - add hl, hl -doble2 ld a, (de) - xor (hl) - and c - xor (hl) - ld (de), a - inc e - ld a, (hl) - and c - ld (de), a - inc d - inc l - ld a, (hl) - and c - ld (de), a - dec e - ld a, (de) - xor (hl) - and c - xor (hl) - ld (de), a - inc d - inc l - djnz doble2 - ld hl, $f801 - add hl, de - ex de, hl - ret -fondo incbin fondo.rcs + output scroll.bin + org $5e6d +string dz $45 + dz $45, 'We want to thank all backers' + dz $45 + dz $48, 'AdvanSys' + dz $48, 'aguij~n' + dz $48, 'Airsoft' + dz $48, 'Aivalahostia' + dz $48, 'Akis Pluto63 Fletsios' + dz $48, 'alberchi' + dz $48, 'albor{n70' + dz $48, 'aldelgado' + dz $48, 'Alejandro Ib{\ez' + dz $48, 'Alejandro Valero > wilco2009' + dz $48, 'Alfonso Mart}nez > Sr?Presley' + dz $48, 'AlfredoLambda' + dz $48, 'alioth' + dz $48, '[lvaro Adrados' + dz $48, 'Alxinho' + dz $48, 'Andrew Munro' + dz $48, 'AndyRCM' + dz $48, 'Antonio Ant',$7f,'nez Rom{n' + dz $48, 'Antonio Peregr}n' + dz $48, 'Antxiko' + dz $48, 'arkapone' + dz $48, 'Arnau Jess' + dz $48, 'arrizen' + dz $48, 'Arturo Arenas Laguna' + dz $48, 'Astorri' + dz $48, 'AugustoRuiz' + dz $48, 'BCH' + dz $48, 'Baycorps' + dz $48, 'Ben>kenobi' + dz $48, 'Brendan Alford' + dz $48, 'Broteletal' + dz $48, 'Carlos Castre\o' + dz $48, 'Carmeloco' + dz $48, 'C|sar Moreno L~pez' + dz $48, 'chernandezba' + dz $48, 'Chernobyl' + dz $48, 'ciberchuso' + dz $48, 'Ckultur' + dz $48, 'dammnield' + dz $48, 'Dandare' + dz $48, 'Daniel Escudero > Quantumleap' + dz $48, 'darro99' + dz $48, 'David Bernal Dom}nguez' + dz $48, 'David Bl^ck' + dz $48, 'David Carri~n > Bytecnia' + dz $48, 'David [lvarez Torres' + dz $48, 'Deadtool' + dz $48, 'Diego Macktek' + dz $48, 'Diegols' + dz $48, 'DoDesKaDen' + dz $48, 'Drachco' + dz $48, 'Eduardo Solans' + dz $48, 'Eduardo Y{\ez Parareda' + dz $48, 'electrotrains' + dz $48, 'eltargui' + dz $48, 'eltator' + dz $48, 'Emilio > modosita68' + dz $48, 'Emilio Ortiz' + dz $48, 'Eneakao' + dz $48, 'Eric Magnus' + dz $48, 'Erwin Rattinger' + dz $48, 'Esemarcus' + dz $48, 'fantastic64' + dz $48, 'fastofruto' + dz $48, 'Fede Jerez' + dz $48, 'Federico J? [lvarez Valero' + dz $48, 'Felipe Gamusino' + dz $48, 'F|lix Rivero' + dz $48, 'Fino de Benej',$7f,'zar' + dz $48, 'flopping' + dz $48, 'flunky' + dz $48, 'Fran Matsusaka' + dz $48, 'Francisco Huerta' + dz $48, 'Francisco Javier D}az Blanco' + dz $48, 'Francisco Javier Nieto' + dz $48, 'Francisco L? Vargas' + dz $48, 'Fredman' + dz $48, 'garvidal' + dz $48, 'GUi' + dz $48, 'Gacel Miguel' + dz $48, 'Garra' + dz $48, 'Gazpachuelo' + dz $48, 'GroovyDrifter' + dz $48, 'Gumpbito' + dz $48, 'Gustavo Javier Fern{ndez Sanz' + dz $48, 'Hern{n [lvarez' + dz $48, '@HoracioGloton' + dz $48, 'Hugo Sanch~n' + dz $48, 'hyperandroid' + dz $48, 'Ignacobo' + dz $48, 'I\aki Mart}nez > IMD?guru' + dz $48, 'IrregularShed' + dz $48, 'Iv{n Ruiz Etxabe' + dz $48, 'javidoom' + dz $48, 'jgilcas' + dz $48, 'JGranadino' + dz $48, 'jjmarin' + dz $48, 'jmgperez' + dz $48, 'JMV' + dz $48, 'JSJ' + dz $48, 'Javier Albizu' + dz $48, 'Javier Basilio' + dz $48, 'Javier Ortiz ' + dz $48, 'Javier Rueda > Blackhero' + dz $48, 'Javier S{ez Alonso' + dz $48, 'Javier Torres > kowols' + dz $48, 'Jean' + dz $48, 'Jeff Bennett' + dz $48, 'Jes',$7f,'s M' + dz $48, 'Jes',$7f,'s Relinque > Pedja' + dz $48, 'Jevilon' + dz $48, 'Joe Morgan' + dz $48, 'Jordi Alabau Basart' + dz $48, 'Jordi Mestres Ruiz' + dz $48, 'Jordi Ramos' + dz $48, 'Jos| Luis Carrasco' + dz $48, 'Jose Luis Franzen' + dz $48, 'Jos| Manuel Bra\a [lvarez ' + dz $48, 'Jos| Manuel Cardona' + dz $48, 'Jose M{rquez' + dz $48, 'Jose Rodelgo > Joss' + dz $48, 'Juan Antonio L? Almagro' + dz $48, 'Juan Cruz Mangado' + dz $48, 'Juan Fco Torres' + dz $48, 'Juan Luis Fern{ndez > XurL' + dz $48, 'Juan Moreira' + dz $48, 'JuanVe' + dz $48, 'Juanillo67' + dz $48, 'Juanjo > Yog' + dz $48, 'Juli{n Garrido' + dz $48, 'Julio Mateos' + dz $48, 'Julio Medina' + dz $48, 'Jungsi' + dz $48, 'Kan' + dz $48, 'Kelvinator' + dz $48, 'Kever67>NL' + dz $48, 'Kevin Quinn ' + dz $48, 'KgMcNeil' + dz $48, 'Lenko' + dz $48, 'Leticia Vargas Flores' + dz $48, 'Lex Sparrow > VZ' + dz $48, 'Luis Alberto Gris Casinegro' + dz $48, 'Luis Brocan Broky' + dz $48, 'Luis I? Garc}a > Benway' + dz $48, 'Luis Ruiz' + dz $48, 'Luis Soto' + dz $48, 'LukeZab > Luca Zabeo' + dz $48, 'Mac}as Pajas' + dz $48, 'Manu Huertas' + dz $48, 'Manu Sevilla' + dz $48, 'Manuel Naranjo Vera' + dz $48, 'Manuel Sagra de Diego' + dz $48, 'mapi20' + dz $48, 'MarcusW' + dz $48, 'Martin Saguer' + dz $48, 'Mejias3D' + dz $48, 'melvex' + dz $48, 'Metalbrain' + dz $48, 'Microhobbit' + dz $48, 'microsnk' + dz $48, 'Miguel [ngel' + dz $48, 'Miguel G? Prada' + dz $48, 'Miguel Ser~n' + dz $48, 'mike=01' + dz $48, 'msch' + dz $48, 'Nanoc' + dz $48, 'Neil Parsons' + dz $48, 'Neuro' + dz $48, 'Newsdee' + dz $48, 'nivaria' + dz $48, 'nonnoes' + dz $48, 'Norbert>K?' + dz $48, 'nuggetreggae' + dz $48, 'Obocaman' + dz $48, ']scar BraindeaD' + dz $48, ']scar Hern{ndez > Gatuso' + dz $48, ']scar Ruiz' + dz $48, 'PacMobius' + dz $48, 'Pachu003' + dz $48, 'Paco Montes' + dz $48, 'Pagantipaco' + dz $48, 'Pedro Romero' + dz $48, 'Peter Robert Jones' + dz $48, 'Peter \'Sweetlilmre\' Edwards' + dz $48, 'peterthedark' + dz $48, 'princemegahit' + dz $48, 'Radastan' + dz $48, 'Rafa Vico' + dz $48, 'Rafa Zitror' + dz $48, 'Raindog' + dz $48, 'Ramon Berto' + dz $48, 'RetroManiac' + dz $48, 'RetroPixeleadores>FloppyDerno' + dz $48, 'RetroVirtualMachine' + dz $48, 'RetroWorks' + dz $48, 'Retrocant' + dz $48, 'RiCCo' + dz $48, 'Rinconete' + dz $48, 'Robcfg' + dz $48, 'Robert Perelegre Orteu' + dz $48, 'Roberto Henr}quez' + dz $48, 'Rub|n Guti|rrez' + dz $48, 'Sad1942' + dz $48, 'Salvador Perugorria Lorente' + dz $48, 'Santiago Romero' + dz $48, 'Schombi' + dz $48, 'Sebasti{n Tito Rodr}guez' + dz $48, 'serbalgi' + dz $48, 'Sergio L~pez Cantero' + dz $48, 'Sergio S{nchez > RaNaRaMa' + dz $48, 'Shikit}n' + dz $48, 'sinclair200' + dz $48, 'Skywalky' + dz $48, 'spark2k06' + dz $48, 'SpeedXP' + dz $48, 'stcube' + dz $48, 'Stratotrasto' + dz $48, 'TallerSeverino' + dz $48, 'TarkuS666' + dz $48, '@TessMSX' + dz $48, 'thEpOpE' + dz $48, 'TitoxUnix' + dz $48, 'Tom Dalby' + dz $48, 'Tromponauta' + dz $48, 'uniVNG' + dz $48, 'Uto' + dz $48, 'utopian' + dz $48, 'Vago > Avalon Software' + dz $48, 'Vejeta' + dz $48, 'Vicente Sim~n' + dz $48, 'vicenteo' + dz $48, 'V}ctor Robledo > Robe=Inie' + dz $48, 'vidamia' + dz $48, 'Visualtorpedo' + dz $48, 'web8bits' + dz $48, 'weirdocollector' + dz $48, 'Will Woodvine' + dz $48, 'Yombo' + dz $48, 'Zolt{n B_sz_rm|nyi' + dz $48, 'Zup' + dz $48 + dz $43, 'The ZX>UNO core team are' + dz $43 + dz $48, 'Superfo' + dz $48, 'antoniovillena' + dz $48, 'McLeod' + dz $48, 'Quest' + dz $48, 'Hark0' + dz $48 + dz $42, 'With additional support from' + dz $42 + dz $48, 'DistWave' + dz $48, 'Radastan' + dz $48, 'jepalza' + dz $48, 'Mejias3D' + dz $48, 'chernandezba' + dz $48, 'Anyone We Forgot???' + dz $48 + dz $44, 'Easter egg credits' + dz $44 + dz $48, 'Coder: Antonio Villena' + dz $48, 'Music: Yerzmyey' + dz $48, 'Graphics: Quest' + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + dz $48 + defb 1 +music ld (vari+2), ix + incbin music.bin +fuente incbin fuente6x8.bin +start ld hl, $c000 + ld de, $c001 + ld bc, $017f + ld (hl), l + ldir + ld hl, fuente + ld b, 3 + ldir + ld hl, fondo + ld b, $40 ; filtro RCS inverso +start0 ld a, b + xor c + and $f8 + xor c + ld d, a + xor b + xor c + rlca + rlca + ld e, a + inc bc + ldi + inc bc + ld a, b + sub $58 + jr nz, start0 + ld b, 3 + ldir + out ($fe), a + inc a + ex af, af' + ld hl, $c000 + ld de, $c400 +start1 ld b, $08 +start2 ld a, (hl) + rrca + ld (de), a + inc de + cpi + jp pe, start2 + jr nc, start1 + ld a, $c9 + ld ($c006), a + ld hl, $716f + call music+7 +start3 call $6e77 + ei + halt + di + ld bc, 5 +start4 djnz start4 + dec c + jr nz, start4 + + macro linea src1, src2, src3, dst1, dst2, dst3 + ld sp, $4005+$800*src1+$100*src3+$20*src2 + pop hl + pop de + pop bc + pop af + exx + pop hl + pop de + pop bc + ld sp, $4013+$800*dst1+$100*dst3+$20*dst2 + push bc + push de + push hl + exx + push af + push bc + push de + push hl + ld sp, $4013+$800*src1+$100*src3+$20*src2 + pop hl + pop de + pop bc + pop af + ld sp, $401b+$800*dst1+$100*dst3+$20*dst2 + push af + push bc + push de + push hl + endm + linea 0, 0, 1, 0, 0, 0 + linea 0, 0, 2, 0, 0, 1 + linea 0, 0, 3, 0, 0, 2 + linea 0, 0, 4, 0, 0, 3 + linea 0, 0, 5, 0, 0, 4 + linea 0, 0, 6, 0, 0, 5 + linea 0, 0, 7, 0, 0, 6 + linea 0, 1, 0, 0, 0, 7 + linea 0, 1, 1, 0, 1, 0 + linea 0, 1, 2, 0, 1, 1 + linea 0, 1, 3, 0, 1, 2 + linea 0, 1, 4, 0, 1, 3 + linea 0, 1, 5, 0, 1, 4 + linea 0, 1, 6, 0, 1, 5 + linea 0, 1, 7, 0, 1, 6 + linea 0, 2, 0, 0, 1, 7 + linea 0, 2, 1, 0, 2, 0 + linea 0, 2, 2, 0, 2, 1 + linea 0, 2, 3, 0, 2, 2 + linea 0, 2, 4, 0, 2, 3 + linea 0, 2, 5, 0, 2, 4 + linea 0, 2, 6, 0, 2, 5 + linea 0, 2, 7, 0, 2, 6 + linea 0, 3, 0, 0, 2, 7 + linea 0, 3, 1, 0, 3, 0 + linea 0, 3, 2, 0, 3, 1 + linea 0, 3, 3, 0, 3, 2 + linea 0, 3, 4, 0, 3, 3 + linea 0, 3, 5, 0, 3, 4 + linea 0, 3, 6, 0, 3, 5 + linea 0, 3, 7, 0, 3, 6 + linea 0, 4, 0, 0, 3, 7 + linea 0, 4, 1, 0, 4, 0 + linea 0, 4, 2, 0, 4, 1 + linea 0, 4, 3, 0, 4, 2 + linea 0, 4, 4, 0, 4, 3 + linea 0, 4, 5, 0, 4, 4 + linea 0, 4, 6, 0, 4, 5 + linea 0, 4, 7, 0, 4, 6 + linea 0, 5, 0, 0, 4, 7 + linea 0, 5, 1, 0, 5, 0 + linea 0, 5, 2, 0, 5, 1 + linea 0, 5, 3, 0, 5, 2 + linea 0, 5, 4, 0, 5, 3 + linea 0, 5, 5, 0, 5, 4 + linea 0, 5, 6, 0, 5, 5 + linea 0, 5, 7, 0, 5, 6 + linea 0, 6, 0, 0, 5, 7 + linea 0, 6, 1, 0, 6, 0 + linea 0, 6, 2, 0, 6, 1 + linea 0, 6, 3, 0, 6, 2 + linea 0, 6, 4, 0, 6, 3 + linea 0, 6, 5, 0, 6, 4 + linea 0, 6, 6, 0, 6, 5 + linea 0, 6, 7, 0, 6, 6 + linea 0, 7, 0, 0, 6, 7 + linea 0, 7, 1, 0, 7, 0 + linea 0, 7, 2, 0, 7, 1 + linea 0, 7, 3, 0, 7, 2 + linea 0, 7, 4, 0, 7, 3 + linea 0, 7, 5, 0, 7, 4 + linea 0, 7, 6, 0, 7, 5 + linea 0, 7, 7, 0, 7, 6 + linea 1, 0, 0, 0, 7, 7 + linea 1, 0, 1, 1, 0, 0 + linea 1, 0, 2, 1, 0, 1 + linea 1, 0, 3, 1, 0, 2 + linea 1, 0, 4, 1, 0, 3 + linea 1, 0, 5, 1, 0, 4 + linea 1, 0, 6, 1, 0, 5 + linea 1, 0, 7, 1, 0, 6 + linea 1, 1, 0, 1, 0, 7 + linea 1, 1, 1, 1, 1, 0 + linea 1, 1, 2, 1, 1, 1 + linea 1, 1, 3, 1, 1, 2 + linea 1, 1, 4, 1, 1, 3 + linea 1, 1, 5, 1, 1, 4 + linea 1, 1, 6, 1, 1, 5 + linea 1, 1, 7, 1, 1, 6 + linea 1, 2, 0, 1, 1, 7 + linea 1, 2, 1, 1, 2, 0 + linea 1, 2, 2, 1, 2, 1 + linea 1, 2, 3, 1, 2, 2 + linea 1, 2, 4, 1, 2, 3 + linea 1, 2, 5, 1, 2, 4 + linea 1, 2, 6, 1, 2, 5 + linea 1, 2, 7, 1, 2, 6 + linea 1, 3, 0, 1, 2, 7 + linea 1, 3, 1, 1, 3, 0 + linea 1, 3, 2, 1, 3, 1 + linea 1, 3, 3, 1, 3, 2 + linea 1, 3, 4, 1, 3, 3 + linea 1, 3, 5, 1, 3, 4 + linea 1, 3, 6, 1, 3, 5 + linea 1, 3, 7, 1, 3, 6 + linea 1, 4, 0, 1, 3, 7 + linea 1, 4, 1, 1, 4, 0 + linea 1, 4, 2, 1, 4, 1 + linea 1, 4, 3, 1, 4, 2 + linea 1, 4, 4, 1, 4, 3 + linea 1, 4, 5, 1, 4, 4 + linea 1, 4, 6, 1, 4, 5 + linea 1, 4, 7, 1, 4, 6 + linea 1, 5, 0, 1, 4, 7 + linea 1, 5, 1, 1, 5, 0 + linea 1, 5, 2, 1, 5, 1 + linea 1, 5, 3, 1, 5, 2 + linea 1, 5, 4, 1, 5, 3 + linea 1, 5, 5, 1, 5, 4 + linea 1, 5, 6, 1, 5, 5 + linea 1, 5, 7, 1, 5, 6 + linea 1, 6, 0, 1, 5, 7 + linea 1, 6, 1, 1, 6, 0 + linea 1, 6, 2, 1, 6, 1 + linea 1, 6, 3, 1, 6, 2 + linea 1, 6, 4, 1, 6, 3 + linea 1, 6, 5, 1, 6, 4 + linea 1, 6, 6, 1, 6, 5 + linea 1, 6, 7, 1, 6, 6 + linea 1, 7, 0, 1, 6, 7 + linea 1, 7, 1, 1, 7, 0 + linea 1, 7, 2, 1, 7, 1 + linea 1, 7, 3, 1, 7, 2 + linea 1, 7, 4, 1, 7, 3 + linea 1, 7, 5, 1, 7, 4 + linea 1, 7, 6, 1, 7, 5 + linea 1, 7, 7, 1, 7, 6 + linea 2, 0, 0, 1, 7, 7 + linea 2, 0, 1, 2, 0, 0 + linea 2, 0, 2, 2, 0, 1 + linea 2, 0, 3, 2, 0, 2 + linea 2, 0, 4, 2, 0, 3 + linea 2, 0, 5, 2, 0, 4 + linea 2, 0, 6, 2, 0, 5 + linea 2, 0, 7, 2, 0, 6 + linea 2, 1, 0, 2, 0, 7 + linea 2, 1, 1, 2, 1, 0 + linea 2, 1, 2, 2, 1, 1 + linea 2, 1, 3, 2, 1, 2 + linea 2, 1, 4, 2, 1, 3 + linea 2, 1, 5, 2, 1, 4 + linea 2, 1, 6, 2, 1, 5 + linea 2, 1, 7, 2, 1, 6 + linea 2, 2, 0, 2, 1, 7 + linea 2, 2, 1, 2, 2, 0 + linea 2, 2, 2, 2, 2, 1 + linea 2, 2, 3, 2, 2, 2 + linea 2, 2, 4, 2, 2, 3 + linea 2, 2, 5, 2, 2, 4 + linea 2, 2, 6, 2, 2, 5 + linea 2, 2, 7, 2, 2, 6 + linea 2, 3, 0, 2, 2, 7 + linea 2, 3, 1, 2, 3, 0 + linea 2, 3, 2, 2, 3, 1 + linea 2, 3, 3, 2, 3, 2 + linea 2, 3, 4, 2, 3, 3 + linea 2, 3, 5, 2, 3, 4 + linea 2, 3, 6, 2, 3, 5 + linea 2, 3, 7, 2, 3, 6 + linea 2, 4, 0, 2, 3, 7 + linea 2, 4, 1, 2, 4, 0 + linea 2, 4, 2, 2, 4, 1 + linea 2, 4, 3, 2, 4, 2 + linea 2, 4, 4, 2, 4, 3 + linea 2, 4, 5, 2, 4, 4 + linea 2, 4, 6, 2, 4, 5 + linea 2, 4, 7, 2, 4, 6 + linea 2, 5, 0, 2, 4, 7 + linea 2, 5, 1, 2, 5, 0 + linea 2, 5, 2, 2, 5, 1 + linea 2, 5, 3, 2, 5, 2 + linea 2, 5, 4, 2, 5, 3 + linea 2, 5, 5, 2, 5, 4 + linea 2, 5, 6, 2, 5, 5 + linea 2, 5, 7, 2, 5, 6 + linea 2, 6, 0, 2, 5, 7 + linea 2, 6, 1, 2, 6, 0 + linea 2, 6, 2, 2, 6, 1 + linea 2, 6, 3, 2, 6, 2 + linea 2, 6, 4, 2, 6, 3 + linea 2, 6, 5, 2, 6, 4 + linea 2, 6, 6, 2, 6, 5 + linea 2, 6, 7, 2, 6, 6 + linea 2, 7, 0, 2, 6, 7 + linea 2, 7, 1, 2, 7, 0 + linea 2, 7, 2, 2, 7, 1 + linea 2, 7, 3, 2, 7, 2 + linea 2, 7, 4, 2, 7, 3 + linea 2, 7, 5, 2, 7, 4 + linea 2, 7, 6, 2, 7, 5 + linea 2, 7, 7, 2, 7, 6 + + ld sp, $401b+$800*2+$100*7+$20*7 + sbc hl, hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + ld sp, hl +vari ld ix, string + ld hl, start3 + push hl + ld hl, music + push hl + ex af, af' + rrca + jr c, start5 + ex af, af' + ret +start5 ex af, af' + linea 3, 1, 0, 3, 0, 0 + linea 3, 2, 0, 3, 1, 0 + linea 3, 3, 0, 3, 2, 0 + linea 3, 4, 0, 3, 3, 0 + linea 3, 5, 0, 3, 4, 0 + linea 3, 6, 0, 3, 5, 0 + linea 3, 7, 0, 3, 6, 0 + linea 3, 0, 1, 3, 7, 0 + linea 3, 1, 1, 3, 0, 1 + linea 3, 2, 1, 3, 1, 1 + linea 3, 3, 1, 3, 2, 1 + linea 3, 4, 1, 3, 3, 1 + linea 3, 5, 1, 3, 4, 1 + linea 3, 6, 1, 3, 5, 1 + linea 3, 7, 1, 3, 6, 1 + linea 3, 0, 2, 3, 7, 1 + linea 3, 1, 2, 3, 0, 2 + linea 3, 2, 2, 3, 1, 2 + linea 3, 3, 2, 3, 2, 2 + linea 3, 4, 2, 3, 3, 2 + linea 3, 5, 2, 3, 4, 2 + linea 3, 6, 2, 3, 5, 2 + ld sp, $fffc + ld b, (ix) + djnz start6 + ld ix, string +start6 inc ix + ld hl, $5ac5 + ld (hl), b + ld de, $5ac6 + ld bc, 21 + ldir + xor a + push ix + pop hl + ld bc, $172b + cpir + srl c + ld a, c + jr c, prn2 + and %11111100 + ld d, a + xor c + ld c, a + ld e, a + jr z, prn1 + dec e +prn1 ld a, d + rrca + ld d, a + rrca + add a, d + add a, e + ld e, a + ld a, b + and %00011000 + or %01000000 + ld d, a + ld a, b + and %00000111 + rrca + rrca + rrca + add a, e + ld e, a + rr c + jr c, pos26 + jr nz, pos4 +pos0 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c0 >> 2 + call simple +pos2 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d8 >> 2 + ld bc, $04fc + call doble +pos4 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d0 >> 2 + ld bc, $04f0 + call doble +pos6 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c8 >> 2 + call simple + inc de + jr pos0 +pos26 rr c + jr c, pos6 + jr pos2 +prn2 and %11111100 + ld d, a + xor c + ld c, a + cp 2 + adc a, -1 + ld e, a + ld a, d + rrca + ld d, a + rrca + add a, d + add a, e + ld e, a + ld a, b + and %00011000 + or %01000000 + ld d, a + ld a, b + and %00000111 + rrca + rrca + rrca + add a, e + ld e, a + rr c + jr c, pos37 + jr nz, pos5 +pos1 ld a, (ix) + inc ix + add a, a + ret z + ld h, $cc >> 2 + ld bc, $04e0 + call doble +pos3 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c4 >> 2 + call simple +pos5 ld a, (ix) + inc ix + add a, a + ret z + ld h, $dc >> 2 + ld bc, $04fe + call doble +pos7 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d4 >> 2 + ld bc, $04f8 + call doble + jr pos1 +pos37 rr c + jr c, pos7 + jr pos3 + +simple ld b, 4 + ld l, a + add hl, hl + add hl, hl +simple2 ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + djnz simple2 + ld hl, $f800 + add hl, de + ex de, hl + ret + +doble ld l, a + add hl, hl + add hl, hl +doble2 ld a, (de) + xor (hl) + and c + xor (hl) + ld (de), a + inc e + ld a, (hl) + and c + ld (de), a + inc d + inc l + ld a, (hl) + and c + ld (de), a + dec e + ld a, (de) + xor (hl) + and c + xor (hl) + ld (de), a + inc d + inc l + djnz doble2 + ld hl, $f801 + add hl, de + ex de, hl + ret +fondo incbin fondo.rcs diff --git a/firmware/scroll/loader.asm b/firmware/scroll/loader.asm index 8b9b559..1e32839 100644 --- a/firmware/scroll/loader.asm +++ b/firmware/scroll/loader.asm @@ -1,89 +1,89 @@ - include define.asm - output loader.bin - org $5ccb - ld de, $8000 - di - defb $de, $c0, $37, $0e, $8f, $39, $96 ; Basic de Paolo Ferraris - ld hl, finload-1 - ld de, $baff - call dzx7b - inc hl - inc hl - ld bc, $4000 ; filtro RCS inverso (jamorski) - ld a, b -init xor c - and $f8 - xor c - ld d, a - xor b - xor c - rlca - rlca - ld e, a -init2 inc bc - ldi - inc bc - ld a, b - cp $58 - jr c, init - sub $5b - jr nz, init2 - ld hl, $5e6d-2 - ld de, compsize - call $07f4 - di - ld de, $5e6d+rawsize-1 - ld hl, $5e6d-2+compsize-1 - call dzx7b - jp $7be4 - -; ----------------------------------------------------------------------------- -; ZX7 Backwards by Einar Saukas, Antonio Villena -; Parameters: -; HL: source address (compressed data) -; DE: destination address (decompressing) -; ----------------------------------------------------------------------------- -dzx7b ld bc, $8000 - ld a, b -copyby inc c - ldd -mainlo add a, a - call z, getbit - jr nc, copyby - push de - ld d, c - defb $30 -lenval add a, a - call z, getbit - rl c - rl b - add a, a - call z, getbit - jr nc, lenval - inc c - jr z, exitdz - ld e, (hl) - dec hl - sll e - jr nc, offend - ld d, $10 -nexbit add a, a - call z, getbit - rl d - jr nc, nexbit - inc d - srl d -offend rr e - ex (sp), hl - ex de, hl - adc hl, de - lddr -exitdz pop hl - jr nc, mainlo -getbit ld a, (hl) - dec hl - adc a, a - ret - -loadscr incbin loadscr.rcs.zx7b -finload + include define.asm + output loader.bin + org $5ccb + ld de, $8000 + di + defb $de, $c0, $37, $0e, $8f, $39, $96 ; Basic de Paolo Ferraris + ld hl, finload-1 + ld de, $baff + call dzx7b + inc hl + inc hl + ld bc, $4000 ; filtro RCS inverso (jamorski) + ld a, b +init xor c + and $f8 + xor c + ld d, a + xor b + xor c + rlca + rlca + ld e, a +init2 inc bc + ldi + inc bc + ld a, b + cp $58 + jr c, init + sub $5b + jr nz, init2 + ld hl, $5e6d-2 + ld de, compsize + call $07f4 + di + ld de, $5e6d+rawsize-1 + ld hl, $5e6d-2+compsize-1 + call dzx7b + jp $7be4 + +; ----------------------------------------------------------------------------- +; ZX7 Backwards by Einar Saukas, Antonio Villena +; Parameters: +; HL: source address (compressed data) +; DE: destination address (decompressing) +; ----------------------------------------------------------------------------- +dzx7b ld bc, $8000 + ld a, b +copyby inc c + ldd +mainlo add a, a + call z, getbit + jr nc, copyby + push de + ld d, c + defb $30 +lenval add a, a + call z, getbit + rl c + rl b + add a, a + call z, getbit + jr nc, lenval + inc c + jr z, exitdz + ld e, (hl) + dec hl + sll e + jr nc, offend + ld d, $10 +nexbit add a, a + call z, getbit + rl d + jr nc, nexbit + inc d + srl d +offend rr e + ex (sp), hl + ex de, hl + adc hl, de + lddr +exitdz pop hl + jr nc, mainlo +getbit ld a, (hl) + dec hl + adc a, a + ret + +loadscr incbin loadscr.rcs.zx7b +finload diff --git a/firmware/scroll/player.asm b/firmware/scroll/player.asm index 5e70878..d76329f 100644 --- a/firmware/scroll/player.asm +++ b/firmware/scroll/player.asm @@ -1,746 +1,746 @@ -; SPECTRUM PSG proPLAYER V 0.2 - WYZ 07.09.2011 -; VER AL FINAL PARA DATOS PROPIOS: - -; ISR LLAMA A: -inicio: ld (vari+2), ix - call rout - ld hl, psg_reg - ld de, psg_reg_sec - ld bc, 14 - ldir - ld hl, interr - bit 2, (hl) ;esta activado el efecto? - jr z, finop2 - ld hl,(PUNTERO_SONIDO) - ld a,(hl) - cp $ff - jr z, finson - ld (psg_reg_sec+2),a - inc hl - ld a,(hl) - rrca - rrca - rrca - rrca - and 00001111b - ld (psg_reg_sec+3),a - ld a,(hl) - and 00001111b - ld (psg_reg_sec+9),a - inc hl - ld a,(hl) - and a - jr z, noruid - ld (psg_reg_sec+6),a - ld a, 10101000b - jr siruid -noruid ld a, 10111000b -siruid ld (psg_reg_sec+7),a - inc hl - ld (PUNTERO_SONIDO),hl - jr finopla -finson ld hl, interr - res 2, (hl) - ld a, 10111000b - ld (psg_reg+7), a - -;play __________________________________________________ -finopla ld hl, interr ;play bit 1 on? -finop2 bit 1, (hl) - ret z -;tempo - inc l -; ld hl, ttempo ;contador tempo - inc (hl) - ld a, (tempo) - sub (hl) - jr nz, pautas - ld (hl), a - -;INTERPRETA - ld iy, psg_reg - ld ix, puntero_a - ld bc, psg_reg+8 - call localiza_nota - ld iy, psg_reg+2 - ld ix, puntero_b - ld bc, psg_reg+9 - call localiza_nota - ld iy, psg_reg+4 - ld ix, puntero_c - ld bc, psg_reg+10 - call localiza_nota - ld ix, puntero_p ;el canal de efectos enmascara otro canal - call localiza_efecto - -;pautas -pautas: ld iy, psg_reg+0 - ld ix, puntero_p_a - ld hl, psg_reg+8 - call pauta ;pauta canal a - ld iy, psg_reg+2 - ld ix, puntero_p_b - ld hl, psg_reg+9 - call pauta ;pauta canal b - ld iy, psg_reg+4 - ld ix, puntero_p_c - ld hl, psg_reg+10 ;pauta canal c - -; PAUTA DE LOS 3 CANALES -; IN:(IX):PUNTERO DE LA PAUTA -; (HL):REGISTRO DE VOLUMEN -; (IY):REGISTROS DE FRECUENCIA - -; FORMATO PAUTA -; 7 6 5 4 3-0 3-0 -; BYTE 1 (LOOP|OCT-1|OCT+1|ORNMT|VOL) - BYTE 2 ( | | | |PITCH/NOTA) - -pauta: bit 4, (hl) ;si la envolvente esta activada no actua pauta - ret nz - ld a, (iy+0) - ld b, (iy+1) - or b - ret z - push hl -pcajp4: ld l, (ix+0) - ld h, (ix+1) - ld a, (hl) - bit 7, a ;loop / el resto de bits no afectan - jr z, pcajp0 - and 00011111B ;máximo loop pauta (0,32)x2!!!-> para ornamentos - rlca ;x2 - ld d, 0 - ld e, a - sbc hl, de - ld a, (hl) -pcajp0: bit 6, a ;octava -1 - jr z, pcajp1 - ld e, (iy+0) - ld d, (iy+1) - and a - rrc d - rr e - ld (iy+0), e - ld (iy+1), d - jr pcajp2 -pcajp1: bit 5, a ;octava +1 - jr z, pcajp2 - ld e, (iy+0) - ld d, (iy+1) - and a - rlc e - rl d - ld (iy+0), e - ld (iy+1), d -pcajp2: ld a, (hl) - bit 4, a - jr nz, pcajp6 ;ornamentos seleccionados - inc hl ;funcion pitch de frecuencia - push hl - ld e, a - ld a, (hl) ;pitch de frecuencia - ld l, a - and a - ld a, e - jr z, ornmj1 - ld a, (iy+0) ;si la frecuencia es 0 no hay pitch - add a, (iy+1) - and a - ld a, e - jr z, ornmj1 - bit 7, l - jr z, ornneg - ld h, $ff - jr pcajp3 -ornneg: ld h, 0 -pcajp3: ld e, (iy+0) - ld d, (iy+1) - adc hl, de - ld (iy+0), l - ld (iy+1), h - jr ornmj1 -pcajp6: inc hl ;funcion ornamentos - push hl - push af - ld a, (ix+24) ;recupera registro de nota en el canal - ld e, (hl) - adc a, e ;+- nota - call tabla_notas - pop af -ornmj1: pop hl - inc hl - ld (ix+0), l - ld (ix+1), h -pcajp5: pop hl - and 00001111B ;volumen final - ld (hl), a - ret - -;carga una cancion -;in:(a)=nº de cancion -cancio: ld hl, interr ;carga cancion - set 1, (hl) ;reproduce cancion - ld hl, song_1 - ld a, (hl) - ld (tempo), a -; xor a -; ld (ttempo), a - -;header byte 1 -;(-|-|-|-|-|-|-|loop) - - inc hl ;loop 1=on/0=off? - ld a, (hl) - bit 0, a - jr z, nptjp0 - push hl - ld hl, interr - set 4, (hl) - pop hl -nptjp0: inc hl ;2 bytes reservados - inc hl - inc hl - -;busca y guarda inicio de los canales en el modulo mus - - ld (puntero_p_deca), hl - ld e, $3f ;codigo intrumento 0 - ld b, $ff ;el modulo debe tener una longitud menor de $ff00 ... o_o! -bgicm1: xor a ;busca el byte 0 - cpir - dec hl - dec hl - ld a, e ;es el instrumento 0?? - cp (hl) - inc hl - inc hl - jr z, bgicm1 - ld (puntero_p_decb), hl -bgicm2: xor a ;busca el byte 0 - cpir - dec hl - dec hl - ld a, e - cp (hl) ;es el instrumento 0?? - inc hl - inc hl - jr z, bgicm2 - ld (puntero_p_decc), hl -bgicm3: xor a ;busca el byte 0 - cpir - dec hl - dec hl - ld a, e - cp (hl) ;es el instrumento 0?? - inc hl - inc hl - jr z, bgicm3 - ld (puntero_p_decp), hl - -;lee datos de las notas -;(|)(|||||) longitud\nota -; init_decoder: - ld de, (canal_a) - ld (puntero_a), de - ld hl, (puntero_p_deca) - call decode_canal ;canal a - ld (puntero_deca), hl - ld de, (canal_b) - ld (puntero_b), de - ld hl, (puntero_p_decb) - call decode_canal ;canal b - ld (puntero_decb), hl - ld de, (canal_c) - ld (puntero_c), de - ld hl, (puntero_p_decc) - call decode_canal ;canal c - ld (puntero_decc), hl - ld de, (canal_p) - ld (puntero_p), de - ld hl, (puntero_p_decp) - call decode_canal ;canal p - ld (puntero_decp), hl - ret - - -;DECODIFICA NOTAS DE UN CANAL -;IN (DE)=DIRECCION DESTINO -;NOTA=0 FIN CANAL -;NOTA=1 SILENCIO -;NOTA=2 PUNTILLO -;NOTA=3 COMANDO I - -decode_canal: - LD A,(HL) - AND A ;FIN DEL CANAL? - JR Z,FIN_DEC_CANAL - CALL GETLEN - - CP 00000001B ;ES SILENCIO? - JR NZ,NO_SILENCIO - SET 6,A - JR NO_MODIFICA - -NO_SILENCIO: - CP 00111110B ;ES PUNTILLO? - JR NZ,NO_PUNTILLO - OR A - RRC B - XOR A - JR NO_MODIFICA - -NO_PUNTILLO: - CP 00111111B ;ES COMANDO? - JR NZ,NO_MODIFICA - BIT 0,B ;COMADO=INSTRUMENTO? - JR Z,NO_INSTRUMENTO - LD A,11000001B ;CODIGO DE INSTRUMENTO - LD (DE),A - INC HL - INC DE - LD A,(HL) ;Nº DE INSTRUMENTO - LD (DE),A - INC DE - INC HL - JR decode_canal - -NO_INSTRUMENTO: - BIT 2,B - JR Z,NO_ENVOLVENTE - LD A,11000100B ;CODIGO ENVOLVENTE - LD (DE),A - INC DE - INC HL - LD A,(HL) - LD (DE),A - INC DE - INC HL - JR decode_canal - -NO_ENVOLVENTE: - BIT 1,B - JR Z,NO_MODIFICA - LD A,11000010B ;CODIGO EFECTO - LD (DE),A - INC HL - INC DE - LD A,(HL) - CALL GETLEN - -NO_MODIFICA: - LD (DE),A - INC DE - XOR A - DJNZ NO_MODIFICA - SET 7,A - SET 0,A - LD (DE),A - INC DE - INC HL - RET ;** JR DECODE_CANAL - -FIN_DEC_CANAL: - SET 7,A - LD (DE),A - INC DE - RET - -GETLEN: LD B,A - AND 00111111B - PUSH AF - LD A,B - AND 11000000B - RLCA - RLCA - INC A - LD B,A - LD A,10000000B -DCBC0: RLCA - DJNZ DCBC0 - LD B,A - POP AF - RET - -;LOCALIZA NOTA CANAL A -;IN (puntero_a) - -localiza_nota: - LD L,(IX) ;HL=(PUNTERO_A_C_B) - LD H,(IX+1) - LD A,(HL) - AND 11000000B ;COMANDO? - CP 11000000B - JR NZ,LNJP0 - -;BIT(0)=INSTRUMENTO - -COMANDOS: LD A,(HL) - BIT 0,A ;INSTRUMENTO - JR Z,COM_EFECTO - - INC HL - LD A,(HL) ;Nº DE PAUTA - INC HL - LD (IX),L - LD (IX+1),H - LD HL,TABLA_PAUTAS - CALL ext_word - LD (IX+PUNTERO_P_A0-puntero_a),L - LD (IX+PUNTERO_P_A0-puntero_a+1),H - LD (IX+puntero_p_a-puntero_a),L - LD (IX+puntero_p_a-puntero_a+1),H - LD L,C - LD H,B - RES 4,(HL) ;APAGA EFECTO ENVOLVENTE - XOR A - LD (psg_reg_sec+13),A - LD (psg_reg+13),A - JR localiza_nota - -COM_EFECTO: BIT 1,A ;EFECTO DE SONIDO - JR Z,COM_ENVOLVENTE - - INC HL - LD A,(HL) - INC HL - LD (IX),L - LD (IX+1),H -;INICIA EL SONIDO Nº (A) -INICIA_SONIDO: - LD HL,TABLA_SONIDOS - CALL ext_word - LD (PUNTERO_SONIDO),HL - LD HL,interr - SET 2,(HL) - RET - -COM_ENVOLVENTE: - - BIT 2,A - RET Z ;IGNORA - ERROR - - INC HL - LD A,(HL) ;CARGA CODIGO DE ENVOLVENTE - LD (ENVOLVENTE),A - INC HL - LD (IX),L - LD (IX+1),H - LD L,C - LD H,B - LD (HL),00010000B ;ENCIENDE EFECTO ENVOLVENTE - JR localiza_nota - -LNJP0: LD A,(HL) - INC HL - BIT 7,A - JR Z,NO_FIN_CANAL_A ; - BIT 0,A - JR Z,FIN_CANAL_A - -FIN_NOTA_A: LD E,(IX+canal_a-puntero_a) - LD D,(IX+canal_a-puntero_a+1) ;PUNTERO BUFFER AL INICIO - LD (IX),E - LD (IX+1),D - LD L,(IX+puntero_deca-puntero_a) ;CARGA PUNTERO DECODER - LD H,(IX+puntero_deca-puntero_a+1) - PUSH BC - CALL decode_canal ;DECODIFICA CANAL - POP BC - LD (IX+puntero_deca-puntero_a),L ;GUARDA PUNTERO DECODER - LD (IX+puntero_deca-puntero_a+1),H - JP localiza_nota - -FIN_CANAL_A: - LD HL,interr ;LOOP? - BIT 4,(HL) - JR NZ,FCA_CONT -poff: xor a - ld (interr), a - ld hl, psg_reg - ld de, psg_reg+1 - ld bc, 14*2-1 - ld (hl), a - ldir -rout: ld de, $ffc0 - ld bc, $fffe - ld hl, psg_reg_sec+13 - xor a - cpd - jr nz, qout -sout: ld a, 12 -lout: out (c), a - ld b, e - outd - ld b, d - dec a - jp p, lout - ret -qout: ld a, 13 - out (c), a - inc l - ld b, e - outd - xor a - ld (psg_reg_sec+13), a - ld (psg_reg+13), a - jr sout - - -FCA_CONT: LD L,(IX+puntero_p_deca-puntero_a) ;CARGA PUNTERO INICIAL DECODER - LD H,(IX+puntero_p_deca-puntero_a+1) - LD (IX+puntero_deca-puntero_a),L - LD (IX+puntero_deca-puntero_a+1),H - JR FIN_NOTA_A - -NO_FIN_CANAL_A: - LD (IX),L ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO - LD (IX+1),H - AND A ;NO REPRODUCE NOTA SI NOTA=0 - JR Z,FIN_RUTINA - BIT 6,A ;SILENCIO? - JR Z,NO_SILENCIO_A - LD A,(BC) - AND 00010000B - JR NZ,SILENCIO_ENVOLVENTE - XOR A - LD (BC),A ;RESET VOLUMEN DEL CORRESPODIENTE CHIP - LD (IY+0),A - LD (IY+1),A - RET - -SILENCIO_ENVOLVENTE: - LD A,$FF - LD (psg_reg+11),A - LD (psg_reg+12),A - XOR A - LD (psg_reg+13),A - LD (IY+0),A - LD (IY+1),A - RET - -NO_SILENCIO_A: - LD (IX+REG_NOTA_A-puntero_a),A ;REGISTRO DE LA NOTA DEL CANAL - CALL NOTA ;REPRODUCE NOTA - LD L,(IX+PUNTERO_P_A0-puntero_a) ;HL=(PUNTERO_P_A0) RESETEA PAUTA - LD H,(IX+PUNTERO_P_A0-puntero_a+1) - LD (IX+puntero_p_a-puntero_a),L ;(PUNTERO_P_A)=HL - LD (IX+puntero_p_a-puntero_a+1),H -FIN_RUTINA: - RET - -;LOCALIZA EFECTO -;IN HL=(PUNTERO_P) - -localiza_efecto: - LD L,(IX+0) ;HL=(PUNTERO_P) - LD H,(IX+1) - LD A,(HL) - CP 11000010B - JR NZ,LEJP0 - - INC HL - LD A,(HL) - INC HL - LD (IX+00),L - LD (IX+01),H - CALL INICIA_SONIDO - RET - -LEJP0: INC HL - BIT 7,A - JR Z,NO_FIN_CANAL_P ; - BIT 0,A - JR Z,FIN_CANAL_P - -FIN_NOTA_P: - LD DE,(canal_p) - LD (IX+0),E - LD (IX+1),D - LD HL,(puntero_decp) ;CARGA PUNTERO DECODER - PUSH BC - CALL decode_canal ;DECODIFICA CANAL - POP BC - LD (puntero_decp),HL ;GUARDA PUNTERO DECODER - JP localiza_efecto - -FIN_CANAL_P: - LD HL,(puntero_p_decp) ;CARGA PUNTERO INICIAL DECODER - LD (puntero_decp),HL - JR FIN_NOTA_P - -NO_FIN_CANAL_P: - LD (IX+0),L ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO - LD (IX+1),H - RET - -;NOTA : REPRODUCE UNA NOTA -;IN (A)=CODIGO DE LA NOTA -; (IY)=REGISTROS DE FRECUENCIA - - -NOTA: LD L,C - LD H,B - BIT 4,(HL) - LD B,A - JR NZ,ENVOLVENTES - LD A,B -tabla_notas: - LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA - CALL ext_word - LD (IY+0),L - LD (IY+1),H - RET - -;IN (A)=CODIGO DE LA ENVOLVENTE -; (IY)=REGISTRO DE FRECUENCIA - -ENVOLVENTES: - LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA - CALL ext_word - - LD A,(ENVOLVENTE) ;FRECUENCIA DEL CANAL ON/OFF -LOCALIZA_ENV: - RRA - JR FRECUENCIA_OFF - LD (IY+0),L - LD (IY+1),H - JR CONT_ENV - -FRECUENCIA_OFF: - LD HL,$0000 - LD (IY+0),L - LD (IY+1),H - -;CALCULO DEL RATIO (OCTAVA ARRIBA) - -CONT_ENV: PUSH AF - PUSH BC - AND 00000011B - LD B,A - INC B - XOR A -OCTBC01: ADD A,12 ;INCREMENTA OCTAVAS - DJNZ OCTBC01 - POP BC ;RECUPERA CODIGO DE LA NOTA - ADD A,B ;EN REGISTRO A CODIGO NOTA - - LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA - CALL ext_word - - LD A,L - LD (psg_reg+11),A - LD A,H - AND 00000011B - LD (psg_reg+12),A - POP AF ;SELECCION FORMA DE ENVOLVENTE - - RRA - AND 00000110B ;$08,$0A,$0C,$0E - ADD A,8 - LD (psg_reg+13),A - - RET - -;EXTRAE UN WORD DE UNA TABLA -;IN:(HL)=DIRECCION TABLA -; (A)= POSICION -;OUT(HL)=WORD - -ext_word: LD D,0 - RLCA - LD E,A - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL - RET - - -; VARIABLES__________________________ - - -interr: defb 00 ;INTERRUPTORES 1=ON 0=OFF - ;BIT 0=CARGA CANCION ON/OFF - ;BIT 1=PLAYER ON/OFF - ;BIT 2=SONIDOS ON/OFF - ;BIT 3=EFECTOS ON/OFF -ttempo: defb 00 ;DB CONTADOR TEMPO -tempo: defb 00 ;DB TEMPO -puntero_a: defw 00 ;DW PUNTERO DEL CANAL A -puntero_b: defw 00 ;DW PUNTERO DEL CANAL B -puntero_c: defw 00 ;DW PUNTERO DEL CANAL C - -canal_a: defw buffers_canales ;DW DIRECION DE INICIO DE LA MUSICA A -canal_b: defw buffers_canales+$30 ;DW DIRECION DE INICIO DE LA MUSICA B -canal_c: defw buffers_canales+$60 ;DW DIRECION DE INICIO DE LA MUSICA C - -puntero_p_a: defw 00 ;DW PUNTERO PAUTA CANAL A -puntero_p_b: defw 00 ;DW PUNTERO PAUTA CANAL B -puntero_p_c: defw 00 ;DW PUNTERO PAUTA CANAL C - -PUNTERO_P_A0: defw 00 ;DW INI PUNTERO PAUTA CANAL A -PUNTERO_P_B0: defw 00 ;DW INI PUNTERO PAUTA CANAL B -PUNTERO_P_C0: defw 00 ;DW INI PUNTERO PAUTA CANAL C - - -puntero_p_deca: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL A -puntero_p_decb: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL B -puntero_p_decc: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL C - -puntero_deca: defw 00 ;DW PUNTERO DECODER CANAL A -puntero_decb: defw 00 ;DW PUNTERO DECODER CANAL B -puntero_decc: defw 00 ;DW PUNTERO DECODER CANAL C - -REG_NOTA_A: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL A - defb 00 ;VACIO -REG_NOTA_B: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL B - defb 00 ;VACIO -REG_NOTA_C: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL C - defb 00 ;VACIO - -;CANAL DE EFECTOS - ENMASCARA OTRO CANAL - -puntero_p: defw 00 ;DW PUNTERO DEL CANAL EFECTOS -canal_p: defw buffers_canales+$90 ;DW DIRECION DE INICIO DE LOS EFECTOS -puntero_p_decp: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL P -puntero_decp: defw 00 ;DW PUNTERO DECODER CANAL P - -psg_reg: defs 14 ;DB (11) BUFFER DE REGISTROS DEL PSG -psg_reg_sec: defs 14 ;DB (11) BUFFER SECUNDARIO DE REGISTROS DEL PSG - - - -;ENVOLVENTE_A EQU $D033 ;DB -;ENVOLVENTE_B EQU $D034 ;DB -;ENVOLVENTE_C EQU $D035 ;DB - - -;EFECTOS DE SONIDO - -N_SONIDO: defb 0 ;DB : NUMERO DE SONIDO -PUNTERO_SONIDO: defw 0 ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE - -;EFECTOS - -N_EFECTO: defb 0 ;DB : NUMERO DE SONIDO -PUNTERO_EFECTO: defw 0 ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE -CANAL_EFECTOS: defb 1 ; CANAL DE SFX -ENVOLVENTE: defb 0 ;DB : FORMA DE LA ENVOLVENTE - ;BIT 0 : FRECUENCIA CANAL ON/OFF - ;BIT 1-2 : RATIO - ;BIT 3-3 : FORMA - -;BUFFER_DEC: defb $00 - -;************************* mucha atencion!!!! -; aqui se decodifica la cancion hay que dejar suficiente espacio libre. -;************************* - -;; INCLUIR LOS DATOS DE LA MUSICA (PATTERNS/EFFECTS) - - include song.mus.asm -song_1 incbin song1.mus - -;; NADA A PARTIR DE AQUI!!! -buffers_canales: +; SPECTRUM PSG proPLAYER V 0.2 - WYZ 07.09.2011 +; VER AL FINAL PARA DATOS PROPIOS: + +; ISR LLAMA A: +inicio: ld (vari+2), ix + call rout + ld hl, psg_reg + ld de, psg_reg_sec + ld bc, 14 + ldir + ld hl, interr + bit 2, (hl) ;esta activado el efecto? + jr z, finop2 + ld hl,(PUNTERO_SONIDO) + ld a,(hl) + cp $ff + jr z, finson + ld (psg_reg_sec+2),a + inc hl + ld a,(hl) + rrca + rrca + rrca + rrca + and 00001111b + ld (psg_reg_sec+3),a + ld a,(hl) + and 00001111b + ld (psg_reg_sec+9),a + inc hl + ld a,(hl) + and a + jr z, noruid + ld (psg_reg_sec+6),a + ld a, 10101000b + jr siruid +noruid ld a, 10111000b +siruid ld (psg_reg_sec+7),a + inc hl + ld (PUNTERO_SONIDO),hl + jr finopla +finson ld hl, interr + res 2, (hl) + ld a, 10111000b + ld (psg_reg+7), a + +;play __________________________________________________ +finopla ld hl, interr ;play bit 1 on? +finop2 bit 1, (hl) + ret z +;tempo + inc l +; ld hl, ttempo ;contador tempo + inc (hl) + ld a, (tempo) + sub (hl) + jr nz, pautas + ld (hl), a + +;INTERPRETA + ld iy, psg_reg + ld ix, puntero_a + ld bc, psg_reg+8 + call localiza_nota + ld iy, psg_reg+2 + ld ix, puntero_b + ld bc, psg_reg+9 + call localiza_nota + ld iy, psg_reg+4 + ld ix, puntero_c + ld bc, psg_reg+10 + call localiza_nota + ld ix, puntero_p ;el canal de efectos enmascara otro canal + call localiza_efecto + +;pautas +pautas: ld iy, psg_reg+0 + ld ix, puntero_p_a + ld hl, psg_reg+8 + call pauta ;pauta canal a + ld iy, psg_reg+2 + ld ix, puntero_p_b + ld hl, psg_reg+9 + call pauta ;pauta canal b + ld iy, psg_reg+4 + ld ix, puntero_p_c + ld hl, psg_reg+10 ;pauta canal c + +; PAUTA DE LOS 3 CANALES +; IN:(IX):PUNTERO DE LA PAUTA +; (HL):REGISTRO DE VOLUMEN +; (IY):REGISTROS DE FRECUENCIA + +; FORMATO PAUTA +; 7 6 5 4 3-0 3-0 +; BYTE 1 (LOOP|OCT-1|OCT+1|ORNMT|VOL) - BYTE 2 ( | | | |PITCH/NOTA) + +pauta: bit 4, (hl) ;si la envolvente esta activada no actua pauta + ret nz + ld a, (iy+0) + ld b, (iy+1) + or b + ret z + push hl +pcajp4: ld l, (ix+0) + ld h, (ix+1) + ld a, (hl) + bit 7, a ;loop / el resto de bits no afectan + jr z, pcajp0 + and 00011111B ;máximo loop pauta (0,32)x2!!!-> para ornamentos + rlca ;x2 + ld d, 0 + ld e, a + sbc hl, de + ld a, (hl) +pcajp0: bit 6, a ;octava -1 + jr z, pcajp1 + ld e, (iy+0) + ld d, (iy+1) + and a + rrc d + rr e + ld (iy+0), e + ld (iy+1), d + jr pcajp2 +pcajp1: bit 5, a ;octava +1 + jr z, pcajp2 + ld e, (iy+0) + ld d, (iy+1) + and a + rlc e + rl d + ld (iy+0), e + ld (iy+1), d +pcajp2: ld a, (hl) + bit 4, a + jr nz, pcajp6 ;ornamentos seleccionados + inc hl ;funcion pitch de frecuencia + push hl + ld e, a + ld a, (hl) ;pitch de frecuencia + ld l, a + and a + ld a, e + jr z, ornmj1 + ld a, (iy+0) ;si la frecuencia es 0 no hay pitch + add a, (iy+1) + and a + ld a, e + jr z, ornmj1 + bit 7, l + jr z, ornneg + ld h, $ff + jr pcajp3 +ornneg: ld h, 0 +pcajp3: ld e, (iy+0) + ld d, (iy+1) + adc hl, de + ld (iy+0), l + ld (iy+1), h + jr ornmj1 +pcajp6: inc hl ;funcion ornamentos + push hl + push af + ld a, (ix+24) ;recupera registro de nota en el canal + ld e, (hl) + adc a, e ;+- nota + call tabla_notas + pop af +ornmj1: pop hl + inc hl + ld (ix+0), l + ld (ix+1), h +pcajp5: pop hl + and 00001111B ;volumen final + ld (hl), a + ret + +;carga una cancion +;in:(a)=nº de cancion +cancio: ld hl, interr ;carga cancion + set 1, (hl) ;reproduce cancion + ld hl, song_1 + ld a, (hl) + ld (tempo), a +; xor a +; ld (ttempo), a + +;header byte 1 +;(-|-|-|-|-|-|-|loop) + + inc hl ;loop 1=on/0=off? + ld a, (hl) + bit 0, a + jr z, nptjp0 + push hl + ld hl, interr + set 4, (hl) + pop hl +nptjp0: inc hl ;2 bytes reservados + inc hl + inc hl + +;busca y guarda inicio de los canales en el modulo mus + + ld (puntero_p_deca), hl + ld e, $3f ;codigo intrumento 0 + ld b, $ff ;el modulo debe tener una longitud menor de $ff00 ... o_o! +bgicm1: xor a ;busca el byte 0 + cpir + dec hl + dec hl + ld a, e ;es el instrumento 0?? + cp (hl) + inc hl + inc hl + jr z, bgicm1 + ld (puntero_p_decb), hl +bgicm2: xor a ;busca el byte 0 + cpir + dec hl + dec hl + ld a, e + cp (hl) ;es el instrumento 0?? + inc hl + inc hl + jr z, bgicm2 + ld (puntero_p_decc), hl +bgicm3: xor a ;busca el byte 0 + cpir + dec hl + dec hl + ld a, e + cp (hl) ;es el instrumento 0?? + inc hl + inc hl + jr z, bgicm3 + ld (puntero_p_decp), hl + +;lee datos de las notas +;(|)(|||||) longitud\nota +; init_decoder: + ld de, (canal_a) + ld (puntero_a), de + ld hl, (puntero_p_deca) + call decode_canal ;canal a + ld (puntero_deca), hl + ld de, (canal_b) + ld (puntero_b), de + ld hl, (puntero_p_decb) + call decode_canal ;canal b + ld (puntero_decb), hl + ld de, (canal_c) + ld (puntero_c), de + ld hl, (puntero_p_decc) + call decode_canal ;canal c + ld (puntero_decc), hl + ld de, (canal_p) + ld (puntero_p), de + ld hl, (puntero_p_decp) + call decode_canal ;canal p + ld (puntero_decp), hl + ret + + +;DECODIFICA NOTAS DE UN CANAL +;IN (DE)=DIRECCION DESTINO +;NOTA=0 FIN CANAL +;NOTA=1 SILENCIO +;NOTA=2 PUNTILLO +;NOTA=3 COMANDO I + +decode_canal: + LD A,(HL) + AND A ;FIN DEL CANAL? + JR Z,FIN_DEC_CANAL + CALL GETLEN + + CP 00000001B ;ES SILENCIO? + JR NZ,NO_SILENCIO + SET 6,A + JR NO_MODIFICA + +NO_SILENCIO: + CP 00111110B ;ES PUNTILLO? + JR NZ,NO_PUNTILLO + OR A + RRC B + XOR A + JR NO_MODIFICA + +NO_PUNTILLO: + CP 00111111B ;ES COMANDO? + JR NZ,NO_MODIFICA + BIT 0,B ;COMADO=INSTRUMENTO? + JR Z,NO_INSTRUMENTO + LD A,11000001B ;CODIGO DE INSTRUMENTO + LD (DE),A + INC HL + INC DE + LD A,(HL) ;Nº DE INSTRUMENTO + LD (DE),A + INC DE + INC HL + JR decode_canal + +NO_INSTRUMENTO: + BIT 2,B + JR Z,NO_ENVOLVENTE + LD A,11000100B ;CODIGO ENVOLVENTE + LD (DE),A + INC DE + INC HL + LD A,(HL) + LD (DE),A + INC DE + INC HL + JR decode_canal + +NO_ENVOLVENTE: + BIT 1,B + JR Z,NO_MODIFICA + LD A,11000010B ;CODIGO EFECTO + LD (DE),A + INC HL + INC DE + LD A,(HL) + CALL GETLEN + +NO_MODIFICA: + LD (DE),A + INC DE + XOR A + DJNZ NO_MODIFICA + SET 7,A + SET 0,A + LD (DE),A + INC DE + INC HL + RET ;** JR DECODE_CANAL + +FIN_DEC_CANAL: + SET 7,A + LD (DE),A + INC DE + RET + +GETLEN: LD B,A + AND 00111111B + PUSH AF + LD A,B + AND 11000000B + RLCA + RLCA + INC A + LD B,A + LD A,10000000B +DCBC0: RLCA + DJNZ DCBC0 + LD B,A + POP AF + RET + +;LOCALIZA NOTA CANAL A +;IN (puntero_a) + +localiza_nota: + LD L,(IX) ;HL=(PUNTERO_A_C_B) + LD H,(IX+1) + LD A,(HL) + AND 11000000B ;COMANDO? + CP 11000000B + JR NZ,LNJP0 + +;BIT(0)=INSTRUMENTO + +COMANDOS: LD A,(HL) + BIT 0,A ;INSTRUMENTO + JR Z,COM_EFECTO + + INC HL + LD A,(HL) ;Nº DE PAUTA + INC HL + LD (IX),L + LD (IX+1),H + LD HL,TABLA_PAUTAS + CALL ext_word + LD (IX+PUNTERO_P_A0-puntero_a),L + LD (IX+PUNTERO_P_A0-puntero_a+1),H + LD (IX+puntero_p_a-puntero_a),L + LD (IX+puntero_p_a-puntero_a+1),H + LD L,C + LD H,B + RES 4,(HL) ;APAGA EFECTO ENVOLVENTE + XOR A + LD (psg_reg_sec+13),A + LD (psg_reg+13),A + JR localiza_nota + +COM_EFECTO: BIT 1,A ;EFECTO DE SONIDO + JR Z,COM_ENVOLVENTE + + INC HL + LD A,(HL) + INC HL + LD (IX),L + LD (IX+1),H +;INICIA EL SONIDO Nº (A) +INICIA_SONIDO: + LD HL,TABLA_SONIDOS + CALL ext_word + LD (PUNTERO_SONIDO),HL + LD HL,interr + SET 2,(HL) + RET + +COM_ENVOLVENTE: + + BIT 2,A + RET Z ;IGNORA - ERROR + + INC HL + LD A,(HL) ;CARGA CODIGO DE ENVOLVENTE + LD (ENVOLVENTE),A + INC HL + LD (IX),L + LD (IX+1),H + LD L,C + LD H,B + LD (HL),00010000B ;ENCIENDE EFECTO ENVOLVENTE + JR localiza_nota + +LNJP0: LD A,(HL) + INC HL + BIT 7,A + JR Z,NO_FIN_CANAL_A ; + BIT 0,A + JR Z,FIN_CANAL_A + +FIN_NOTA_A: LD E,(IX+canal_a-puntero_a) + LD D,(IX+canal_a-puntero_a+1) ;PUNTERO BUFFER AL INICIO + LD (IX),E + LD (IX+1),D + LD L,(IX+puntero_deca-puntero_a) ;CARGA PUNTERO DECODER + LD H,(IX+puntero_deca-puntero_a+1) + PUSH BC + CALL decode_canal ;DECODIFICA CANAL + POP BC + LD (IX+puntero_deca-puntero_a),L ;GUARDA PUNTERO DECODER + LD (IX+puntero_deca-puntero_a+1),H + JP localiza_nota + +FIN_CANAL_A: + LD HL,interr ;LOOP? + BIT 4,(HL) + JR NZ,FCA_CONT +poff: xor a + ld (interr), a + ld hl, psg_reg + ld de, psg_reg+1 + ld bc, 14*2-1 + ld (hl), a + ldir +rout: ld de, $ffc0 + ld bc, $fffe + ld hl, psg_reg_sec+13 + xor a + cpd + jr nz, qout +sout: ld a, 12 +lout: out (c), a + ld b, e + outd + ld b, d + dec a + jp p, lout + ret +qout: ld a, 13 + out (c), a + inc l + ld b, e + outd + xor a + ld (psg_reg_sec+13), a + ld (psg_reg+13), a + jr sout + + +FCA_CONT: LD L,(IX+puntero_p_deca-puntero_a) ;CARGA PUNTERO INICIAL DECODER + LD H,(IX+puntero_p_deca-puntero_a+1) + LD (IX+puntero_deca-puntero_a),L + LD (IX+puntero_deca-puntero_a+1),H + JR FIN_NOTA_A + +NO_FIN_CANAL_A: + LD (IX),L ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO + LD (IX+1),H + AND A ;NO REPRODUCE NOTA SI NOTA=0 + JR Z,FIN_RUTINA + BIT 6,A ;SILENCIO? + JR Z,NO_SILENCIO_A + LD A,(BC) + AND 00010000B + JR NZ,SILENCIO_ENVOLVENTE + XOR A + LD (BC),A ;RESET VOLUMEN DEL CORRESPODIENTE CHIP + LD (IY+0),A + LD (IY+1),A + RET + +SILENCIO_ENVOLVENTE: + LD A,$FF + LD (psg_reg+11),A + LD (psg_reg+12),A + XOR A + LD (psg_reg+13),A + LD (IY+0),A + LD (IY+1),A + RET + +NO_SILENCIO_A: + LD (IX+REG_NOTA_A-puntero_a),A ;REGISTRO DE LA NOTA DEL CANAL + CALL NOTA ;REPRODUCE NOTA + LD L,(IX+PUNTERO_P_A0-puntero_a) ;HL=(PUNTERO_P_A0) RESETEA PAUTA + LD H,(IX+PUNTERO_P_A0-puntero_a+1) + LD (IX+puntero_p_a-puntero_a),L ;(PUNTERO_P_A)=HL + LD (IX+puntero_p_a-puntero_a+1),H +FIN_RUTINA: + RET + +;LOCALIZA EFECTO +;IN HL=(PUNTERO_P) + +localiza_efecto: + LD L,(IX+0) ;HL=(PUNTERO_P) + LD H,(IX+1) + LD A,(HL) + CP 11000010B + JR NZ,LEJP0 + + INC HL + LD A,(HL) + INC HL + LD (IX+00),L + LD (IX+01),H + CALL INICIA_SONIDO + RET + +LEJP0: INC HL + BIT 7,A + JR Z,NO_FIN_CANAL_P ; + BIT 0,A + JR Z,FIN_CANAL_P + +FIN_NOTA_P: + LD DE,(canal_p) + LD (IX+0),E + LD (IX+1),D + LD HL,(puntero_decp) ;CARGA PUNTERO DECODER + PUSH BC + CALL decode_canal ;DECODIFICA CANAL + POP BC + LD (puntero_decp),HL ;GUARDA PUNTERO DECODER + JP localiza_efecto + +FIN_CANAL_P: + LD HL,(puntero_p_decp) ;CARGA PUNTERO INICIAL DECODER + LD (puntero_decp),HL + JR FIN_NOTA_P + +NO_FIN_CANAL_P: + LD (IX+0),L ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO + LD (IX+1),H + RET + +;NOTA : REPRODUCE UNA NOTA +;IN (A)=CODIGO DE LA NOTA +; (IY)=REGISTROS DE FRECUENCIA + + +NOTA: LD L,C + LD H,B + BIT 4,(HL) + LD B,A + JR NZ,ENVOLVENTES + LD A,B +tabla_notas: + LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA + CALL ext_word + LD (IY+0),L + LD (IY+1),H + RET + +;IN (A)=CODIGO DE LA ENVOLVENTE +; (IY)=REGISTRO DE FRECUENCIA + +ENVOLVENTES: + LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA + CALL ext_word + + LD A,(ENVOLVENTE) ;FRECUENCIA DEL CANAL ON/OFF +LOCALIZA_ENV: + RRA + JR FRECUENCIA_OFF + LD (IY+0),L + LD (IY+1),H + JR CONT_ENV + +FRECUENCIA_OFF: + LD HL,$0000 + LD (IY+0),L + LD (IY+1),H + +;CALCULO DEL RATIO (OCTAVA ARRIBA) + +CONT_ENV: PUSH AF + PUSH BC + AND 00000011B + LD B,A + INC B + XOR A +OCTBC01: ADD A,12 ;INCREMENTA OCTAVAS + DJNZ OCTBC01 + POP BC ;RECUPERA CODIGO DE LA NOTA + ADD A,B ;EN REGISTRO A CODIGO NOTA + + LD HL,DATOS_NOTAS ;BUSCA FRECUENCIA + CALL ext_word + + LD A,L + LD (psg_reg+11),A + LD A,H + AND 00000011B + LD (psg_reg+12),A + POP AF ;SELECCION FORMA DE ENVOLVENTE + + RRA + AND 00000110B ;$08,$0A,$0C,$0E + ADD A,8 + LD (psg_reg+13),A + + RET + +;EXTRAE UN WORD DE UNA TABLA +;IN:(HL)=DIRECCION TABLA +; (A)= POSICION +;OUT(HL)=WORD + +ext_word: LD D,0 + RLCA + LD E,A + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + RET + + +; VARIABLES__________________________ + + +interr: defb 00 ;INTERRUPTORES 1=ON 0=OFF + ;BIT 0=CARGA CANCION ON/OFF + ;BIT 1=PLAYER ON/OFF + ;BIT 2=SONIDOS ON/OFF + ;BIT 3=EFECTOS ON/OFF +ttempo: defb 00 ;DB CONTADOR TEMPO +tempo: defb 00 ;DB TEMPO +puntero_a: defw 00 ;DW PUNTERO DEL CANAL A +puntero_b: defw 00 ;DW PUNTERO DEL CANAL B +puntero_c: defw 00 ;DW PUNTERO DEL CANAL C + +canal_a: defw buffers_canales ;DW DIRECION DE INICIO DE LA MUSICA A +canal_b: defw buffers_canales+$30 ;DW DIRECION DE INICIO DE LA MUSICA B +canal_c: defw buffers_canales+$60 ;DW DIRECION DE INICIO DE LA MUSICA C + +puntero_p_a: defw 00 ;DW PUNTERO PAUTA CANAL A +puntero_p_b: defw 00 ;DW PUNTERO PAUTA CANAL B +puntero_p_c: defw 00 ;DW PUNTERO PAUTA CANAL C + +PUNTERO_P_A0: defw 00 ;DW INI PUNTERO PAUTA CANAL A +PUNTERO_P_B0: defw 00 ;DW INI PUNTERO PAUTA CANAL B +PUNTERO_P_C0: defw 00 ;DW INI PUNTERO PAUTA CANAL C + + +puntero_p_deca: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL A +puntero_p_decb: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL B +puntero_p_decc: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL C + +puntero_deca: defw 00 ;DW PUNTERO DECODER CANAL A +puntero_decb: defw 00 ;DW PUNTERO DECODER CANAL B +puntero_decc: defw 00 ;DW PUNTERO DECODER CANAL C + +REG_NOTA_A: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL A + defb 00 ;VACIO +REG_NOTA_B: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL B + defb 00 ;VACIO +REG_NOTA_C: defb 00 ;DB REGISTRO DE LA NOTA EN EL CANAL C + defb 00 ;VACIO + +;CANAL DE EFECTOS - ENMASCARA OTRO CANAL + +puntero_p: defw 00 ;DW PUNTERO DEL CANAL EFECTOS +canal_p: defw buffers_canales+$90 ;DW DIRECION DE INICIO DE LOS EFECTOS +puntero_p_decp: defw 00 ;DW PUNTERO DE INICIO DEL DECODER CANAL P +puntero_decp: defw 00 ;DW PUNTERO DECODER CANAL P + +psg_reg: defs 14 ;DB (11) BUFFER DE REGISTROS DEL PSG +psg_reg_sec: defs 14 ;DB (11) BUFFER SECUNDARIO DE REGISTROS DEL PSG + + + +;ENVOLVENTE_A EQU $D033 ;DB +;ENVOLVENTE_B EQU $D034 ;DB +;ENVOLVENTE_C EQU $D035 ;DB + + +;EFECTOS DE SONIDO + +N_SONIDO: defb 0 ;DB : NUMERO DE SONIDO +PUNTERO_SONIDO: defw 0 ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE + +;EFECTOS + +N_EFECTO: defb 0 ;DB : NUMERO DE SONIDO +PUNTERO_EFECTO: defw 0 ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE +CANAL_EFECTOS: defb 1 ; CANAL DE SFX +ENVOLVENTE: defb 0 ;DB : FORMA DE LA ENVOLVENTE + ;BIT 0 : FRECUENCIA CANAL ON/OFF + ;BIT 1-2 : RATIO + ;BIT 3-3 : FORMA + +;BUFFER_DEC: defb $00 + +;************************* mucha atencion!!!! +; aqui se decodifica la cancion hay que dejar suficiente espacio libre. +;************************* + +;; INCLUIR LOS DATOS DE LA MUSICA (PATTERNS/EFFECTS) + + include song.mus.asm +song_1 incbin song1.mus + +;; NADA A PARTIR DE AQUI!!! +buffers_canales: diff --git a/firmware/scroll/scroll.asm b/firmware/scroll/scroll.asm index e22834a..506141a 100644 --- a/firmware/scroll/scroll.asm +++ b/firmware/scroll/scroll.asm @@ -1,336 +1,336 @@ - output scroll.bin - org $5e6d - display $6d35+string-music -string include string.asm -music ld (vari+2), ix - incbin music.bin -fuente incbin fuente6x8.bin -start ld hl, $c000 - ld de, $c001 - ld bc, $017f - ld (hl), l - ldir - ld hl, fuente - ld b, 3 - ldir - ld hl, fondo - ld b, $40 ; filtro RCS inverso -start0 ld a, b - xor c - and $f8 - xor c - ld d, a - xor b - xor c - rlca - rlca - ld e, a - inc bc - ldi - inc bc - ld a, b - sub $58 - jr nz, start0 - ld b, 3 - ldir - out ($fe), a - inc a - ex af, af' -; ld de, $401f -;rever ld hl, $ffe1 -; add hl, de -; ld c, (hl) -; ld a, $80 -;revl1 rl c -; rra -; jr nc, revl1 -; ld (de), a -; inc hl -; dec de -; ld c, (hl) -; ld a, $80 -;revl2 rl c -; rra -; jr nc, revl2 -; ld (de), a -; inc hl -; dec de -; ld c, (hl) -; ld a, $80 -;revl3 rl c -; rra -; jr nc, revl3 -; ld (de), a -; inc hl -; dec de -; ld c, (hl) -; ld a, $80 -;revl4 rl c -; rra -; jr nc, revl4 -; ld (de), a -; ld hl, $23 -; add hl, de -; ex de, hl -; ld a, d -; cp $58 -; jr nz, rever - - ld hl, $c000 - ld de, $c400 -start1 ld b, $08 -start2 ld a, (hl) - rrca - ld (de), a - inc de - cpi - jp pe, start2 - jr nc, start1 - ld a, $c9 - ld ($c006), a - ld hl, $716f - call music+7 -start3 call $6e77 - ei - halt - di - ld bc, 5 -start4 djnz start4 - dec c - jr nz, start4 - include lineas.asm - ld sp, $401b+$800*2+$100*7+$20*7 - sbc hl, hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - push hl - ld sp, hl -vari ld ix, string - ld hl, start3 - push hl - ld hl, music - push hl - ex af, af' - rrca - jr c, start5 - ex af, af' - ret -start5 ex af, af' - linea 3, 1, 0, 3, 0, 0 - linea 3, 2, 0, 3, 1, 0 - linea 3, 3, 0, 3, 2, 0 - linea 3, 4, 0, 3, 3, 0 - linea 3, 5, 0, 3, 4, 0 - linea 3, 6, 0, 3, 5, 0 - linea 3, 7, 0, 3, 6, 0 - linea 3, 0, 1, 3, 7, 0 - linea 3, 1, 1, 3, 0, 1 - linea 3, 2, 1, 3, 1, 1 - linea 3, 3, 1, 3, 2, 1 - linea 3, 4, 1, 3, 3, 1 - linea 3, 5, 1, 3, 4, 1 - linea 3, 6, 1, 3, 5, 1 - linea 3, 7, 1, 3, 6, 1 - linea 3, 0, 2, 3, 7, 1 - linea 3, 1, 2, 3, 0, 2 - linea 3, 2, 2, 3, 1, 2 - linea 3, 3, 2, 3, 2, 2 - linea 3, 4, 2, 3, 3, 2 - linea 3, 5, 2, 3, 4, 2 - linea 3, 6, 2, 3, 5, 2 - ld sp, $fffc - ld b, (ix) - djnz start6 - ld ix, string -start6 inc ix - ld hl, $5ac5 - ld (hl), b - ld de, $5ac6 - ld bc, 21 - ldir - xor a - push ix - pop hl - ld bc, $172b - cpir - srl c - ld a, c - jr c, prn2 - and %11111100 - ld d, a - xor c - ld c, a - ld e, a - jr z, prn1 - dec e -prn1 ld a, d - rrca - ld d, a - rrca - add a, d - add a, e - ld e, a - ld a, b - and %00011000 - or %01000000 - ld d, a - ld a, b - and %00000111 - rrca - rrca - rrca - add a, e - ld e, a - rr c - jr c, pos26 - jr nz, pos4 -pos0 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c0 >> 2 - call simple -pos2 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d8 >> 2 - ld bc, $04fc - call doble -pos4 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d0 >> 2 - ld bc, $04f0 - call doble -pos6 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c8 >> 2 - call simple - inc de - jr pos0 -pos26 rr c - jr c, pos6 - jr pos2 -prn2 and %11111100 - ld d, a - xor c - ld c, a - cp 2 - adc a, -1 - ld e, a - ld a, d - rrca - ld d, a - rrca - add a, d - add a, e - ld e, a - ld a, b - and %00011000 - or %01000000 - ld d, a - ld a, b - and %00000111 - rrca - rrca - rrca - add a, e - ld e, a - rr c - jr c, pos37 - jr nz, pos5 -pos1 ld a, (ix) - inc ix - add a, a - ret z - ld h, $cc >> 2 - ld bc, $04e0 - call doble -pos3 ld a, (ix) - inc ix - add a, a - ret z - ld h, $c4 >> 2 - call simple -pos5 ld a, (ix) - inc ix - add a, a - ret z - ld h, $dc >> 2 - ld bc, $04fe - call doble -pos7 ld a, (ix) - inc ix - add a, a - ret z - ld h, $d4 >> 2 - ld bc, $04f8 - call doble - jr pos1 -pos37 rr c - jr c, pos7 - jr pos3 - -simple ld b, 4 - ld l, a - add hl, hl - add hl, hl -simple2 ld a, (de) - xor (hl) - ld (de), a - inc d - inc l - ld a, (de) - xor (hl) - ld (de), a - inc d - inc l - djnz simple2 - ld hl, $f800 - add hl, de - ex de, hl - ret - -doble ld l, a - add hl, hl - add hl, hl -doble2 ld a, (de) - xor (hl) - and c - xor (hl) - ld (de), a - inc e - ld a, (hl) - and c - ld (de), a - inc d - inc l - ld a, (hl) - and c - ld (de), a - dec e - ld a, (de) - xor (hl) - and c - xor (hl) - ld (de), a - inc d - inc l - djnz doble2 - ld hl, $f801 - add hl, de - ex de, hl - ret -fondo incbin fondo.rcs + output scroll.bin + org $5e6d + display $6d35+string-music +string include string.asm +music ld (vari+2), ix + incbin music.bin +fuente incbin fuente6x8.bin +start ld hl, $c000 + ld de, $c001 + ld bc, $017f + ld (hl), l + ldir + ld hl, fuente + ld b, 3 + ldir + ld hl, fondo + ld b, $40 ; filtro RCS inverso +start0 ld a, b + xor c + and $f8 + xor c + ld d, a + xor b + xor c + rlca + rlca + ld e, a + inc bc + ldi + inc bc + ld a, b + sub $58 + jr nz, start0 + ld b, 3 + ldir + out ($fe), a + inc a + ex af, af' +; ld de, $401f +;rever ld hl, $ffe1 +; add hl, de +; ld c, (hl) +; ld a, $80 +;revl1 rl c +; rra +; jr nc, revl1 +; ld (de), a +; inc hl +; dec de +; ld c, (hl) +; ld a, $80 +;revl2 rl c +; rra +; jr nc, revl2 +; ld (de), a +; inc hl +; dec de +; ld c, (hl) +; ld a, $80 +;revl3 rl c +; rra +; jr nc, revl3 +; ld (de), a +; inc hl +; dec de +; ld c, (hl) +; ld a, $80 +;revl4 rl c +; rra +; jr nc, revl4 +; ld (de), a +; ld hl, $23 +; add hl, de +; ex de, hl +; ld a, d +; cp $58 +; jr nz, rever + + ld hl, $c000 + ld de, $c400 +start1 ld b, $08 +start2 ld a, (hl) + rrca + ld (de), a + inc de + cpi + jp pe, start2 + jr nc, start1 + ld a, $c9 + ld ($c006), a + ld hl, $716f + call music+7 +start3 call $6e77 + ei + halt + di + ld bc, 5 +start4 djnz start4 + dec c + jr nz, start4 + include lineas.asm + ld sp, $401b+$800*2+$100*7+$20*7 + sbc hl, hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + push hl + ld sp, hl +vari ld ix, string + ld hl, start3 + push hl + ld hl, music + push hl + ex af, af' + rrca + jr c, start5 + ex af, af' + ret +start5 ex af, af' + linea 3, 1, 0, 3, 0, 0 + linea 3, 2, 0, 3, 1, 0 + linea 3, 3, 0, 3, 2, 0 + linea 3, 4, 0, 3, 3, 0 + linea 3, 5, 0, 3, 4, 0 + linea 3, 6, 0, 3, 5, 0 + linea 3, 7, 0, 3, 6, 0 + linea 3, 0, 1, 3, 7, 0 + linea 3, 1, 1, 3, 0, 1 + linea 3, 2, 1, 3, 1, 1 + linea 3, 3, 1, 3, 2, 1 + linea 3, 4, 1, 3, 3, 1 + linea 3, 5, 1, 3, 4, 1 + linea 3, 6, 1, 3, 5, 1 + linea 3, 7, 1, 3, 6, 1 + linea 3, 0, 2, 3, 7, 1 + linea 3, 1, 2, 3, 0, 2 + linea 3, 2, 2, 3, 1, 2 + linea 3, 3, 2, 3, 2, 2 + linea 3, 4, 2, 3, 3, 2 + linea 3, 5, 2, 3, 4, 2 + linea 3, 6, 2, 3, 5, 2 + ld sp, $fffc + ld b, (ix) + djnz start6 + ld ix, string +start6 inc ix + ld hl, $5ac5 + ld (hl), b + ld de, $5ac6 + ld bc, 21 + ldir + xor a + push ix + pop hl + ld bc, $172b + cpir + srl c + ld a, c + jr c, prn2 + and %11111100 + ld d, a + xor c + ld c, a + ld e, a + jr z, prn1 + dec e +prn1 ld a, d + rrca + ld d, a + rrca + add a, d + add a, e + ld e, a + ld a, b + and %00011000 + or %01000000 + ld d, a + ld a, b + and %00000111 + rrca + rrca + rrca + add a, e + ld e, a + rr c + jr c, pos26 + jr nz, pos4 +pos0 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c0 >> 2 + call simple +pos2 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d8 >> 2 + ld bc, $04fc + call doble +pos4 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d0 >> 2 + ld bc, $04f0 + call doble +pos6 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c8 >> 2 + call simple + inc de + jr pos0 +pos26 rr c + jr c, pos6 + jr pos2 +prn2 and %11111100 + ld d, a + xor c + ld c, a + cp 2 + adc a, -1 + ld e, a + ld a, d + rrca + ld d, a + rrca + add a, d + add a, e + ld e, a + ld a, b + and %00011000 + or %01000000 + ld d, a + ld a, b + and %00000111 + rrca + rrca + rrca + add a, e + ld e, a + rr c + jr c, pos37 + jr nz, pos5 +pos1 ld a, (ix) + inc ix + add a, a + ret z + ld h, $cc >> 2 + ld bc, $04e0 + call doble +pos3 ld a, (ix) + inc ix + add a, a + ret z + ld h, $c4 >> 2 + call simple +pos5 ld a, (ix) + inc ix + add a, a + ret z + ld h, $dc >> 2 + ld bc, $04fe + call doble +pos7 ld a, (ix) + inc ix + add a, a + ret z + ld h, $d4 >> 2 + ld bc, $04f8 + call doble + jr pos1 +pos37 rr c + jr c, pos7 + jr pos3 + +simple ld b, 4 + ld l, a + add hl, hl + add hl, hl +simple2 ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + djnz simple2 + ld hl, $f800 + add hl, de + ex de, hl + ret + +doble ld l, a + add hl, hl + add hl, hl +doble2 ld a, (de) + xor (hl) + and c + xor (hl) + ld (de), a + inc e + ld a, (hl) + and c + ld (de), a + inc d + inc l + ld a, (hl) + and c + ld (de), a + dec e + ld a, (de) + xor (hl) + and c + xor (hl) + ld (de), a + inc d + inc l + djnz doble2 + ld hl, $f801 + add hl, de + ex de, hl + ret +fondo incbin fondo.rcs diff --git a/firmware/scroll/scrolldesc.asm b/firmware/scroll/scrolldesc.asm index cf360d2..a21fd64 100644 --- a/firmware/scroll/scrolldesc.asm +++ b/firmware/scroll/scrolldesc.asm @@ -1,59 +1,59 @@ - include define.asm - output scrolldesc.bin - org $5ccb - ld de, $5e6d+filesize-1 - di - defb $de, $c0, $37, $0e, $8f, $39, $96 - jr aqui -getbit ld a, (hl) - dec hl - adc a, a - ret -aqui ld hl, fin-1 - -; ----------------------------------------------------------------------------- -; ZX7 Backwards by Einar Saukas, Antonio Villena -; Parameters: -; HL: source address (compressed data) -; DE: destination address (decompressing) -; ----------------------------------------------------------------------------- -dzx7b ld bc, $8000 - ld a, b -copyby inc c - ldd -mainlo add a, a - call z, getbit - jr nc, copyby - push de - ld d, c - defb $30 -lenval add a, a - call z, getbit - rl c - rl b - add a, a - call z, getbit - jr nc, lenval - inc c - jr z, exitdz - ld e, (hl) - dec hl - sll e - jr nc, offend - ld d, $10 -nexbit add a, a - call z, getbit - rl d - jr nc, nexbit - inc d - srl d -offend rr e - ex (sp), hl - ex de, hl - adc hl, de - lddr -exitdz pop hl - jr nc, mainlo - jp $7be4 - incbin scroll.bin.zx7b + include define.asm + output scrolldesc.bin + org $5ccb + ld de, $5e6d+filesize-1 + di + defb $de, $c0, $37, $0e, $8f, $39, $96 + jr aqui +getbit ld a, (hl) + dec hl + adc a, a + ret +aqui ld hl, fin-1 + +; ----------------------------------------------------------------------------- +; ZX7 Backwards by Einar Saukas, Antonio Villena +; Parameters: +; HL: source address (compressed data) +; DE: destination address (decompressing) +; ----------------------------------------------------------------------------- +dzx7b ld bc, $8000 + ld a, b +copyby inc c + ldd +mainlo add a, a + call z, getbit + jr nc, copyby + push de + ld d, c + defb $30 +lenval add a, a + call z, getbit + rl c + rl b + add a, a + call z, getbit + jr nc, lenval + inc c + jr z, exitdz + ld e, (hl) + dec hl + sll e + jr nc, offend + ld d, $10 +nexbit add a, a + call z, getbit + rl d + jr nc, nexbit + inc d + srl d +offend rr e + ex (sp), hl + ex de, hl + adc hl, de + lddr +exitdz pop hl + jr nc, mainlo + jp $7be4 + incbin scroll.bin.zx7b fin \ No newline at end of file diff --git a/firmware/scroll/upgrade.asm b/firmware/scroll/upgrade.asm index cf1a5df..0b52654 100644 --- a/firmware/scroll/upgrade.asm +++ b/firmware/scroll/upgrade.asm @@ -1,327 +1,327 @@ - output UPGRADE - - define FA_READ 0x01 - define M_GETSETDRV 0x89 - define F_OPEN 0x9a - define F_CLOSE 0x9b - define F_READ 0x9d - define F_SEEK 0x9f - - define zxuno_port $fc3b - define flash_spi 2 - define flash_cs 48 - - macro wreg dir, dato - call rst28 - defb dir, dato - endm - - org $2000 ; comienzo de la ejecución de los comandos ESXDOS - -Main xor a - rst $08 - db M_GETSETDRV ; A = unidad actual - jr nc, SDCard - call Print - dz 'SD card not inserted' - ret -SDCard ld b, FA_READ ; B = modo de apertura - ld hl, FileName ; HL = Puntero al nombre del fichero (ASCIIZ) - rst $08 - db F_OPEN - ld (handle+1), a - jr nc, FileFound - call Print - dz 'File FLASH not found' - ret -FileFound ld l, 0 - ld bc, 0 - ld de, 0 - rst $08 - db F_SEEK - call Print - dz 'No ' - ld a, (puerto+2) - add a, $30 - rst $10 - call repe - jr nz, nfallo -; call hex - call Print - dz 'Flash error' - jr Next -nfallo halt - halt - ;jr Verify;call hex - ld ixl, 0 - ld de, $0000 - exx -Bucle ld a, ixl - inc a - and $0f - jr nz, punto - ld a, '.' - exx - push de - rst $10 - pop de - exx -punto ld hl, $8000 - ld bc, $4000 -handle ld a, 0 - rst $08 - db F_READ - jr nc, ReadOK - call Print - dz 'Read Error' - ret -ReadOK ld a, $40 - ld hl, $8000 - exx - call wrflsh - inc de - exx - dec ixl - jr nz, Bucle - - halt - halt - -Verify ld de, $8000 - ld hl, $0040 - ld a, 2 - call rdflsh - ld de, $8000 - ld hl, 0 -Verify1 ex de, hl - ld c, (hl) - inc l - ld b, (hl) - inc hl - ex de, hl - add hl, bc - bit 1, d - jr z, Verify1 - ld a, h - call hex - ld a, l - call hex - halt - halt - -; ld de, $371a -; sbc hl, de -; jr z, Next -; call Print -; dz 'CRC Error' -Next ld a, 13 - rst $10 - ld a, (puerto+2) - inc a - ld (puerto+2), a - cp $10 - ld a, (handle+1) - jp nz, FileFound - rst $08 - db F_CLOSE - ret - -Print pop hl - db $3e -Print1 rst $10 - ld a, (hl) - inc hl - or a - jr nz, Print1 - jp (hl) - -; ------------------------ -; Write to SPI flash -; Parameters: -; A: number of pages (256 bytes) to write -; DE: target address without last byte -; BC': zxuno_port+$100 (constant) -; HL': source address from memory -; ------------------------ -wrflsh ex af, af' -wrfls1 call puerto - wreg flash_spi, 6 ; envío write enable - call flashcs - call puerto - wreg flash_spi, $20 ; envío sector erase - out (c), d - out (c), e - out (c), a - call flashcs -wrfls2 call waits5 - call puerto - wreg flash_spi, 6 ; envío write enable - call flashcs - call puerto - wreg flash_spi, 2 ; page program - out (c), d - out (c), e - out (c), a - ld a, $20 - exx - ld bc, zxuno_port+$100 -wrfls3 inc b - outi - inc b - outi - inc b - outi - inc b - outi - inc b - outi - inc b - outi - inc b - outi - inc b - outi - dec a - jr nz, wrfls3 - exx - call flashcs - ex af, af' - dec a - jr z, waits5 - ex af, af' - inc e - ld a, e - and $0f - jr nz, wrfls2 - ld hl, wrfls1 - push hl -waits5 call puerto - wreg flash_spi, 5 ; envío read status - in a, (c) -waits6 in a, (c) - and 1 - jr nz, waits6 - -flashcs push af - ld a, (puerto+2) - rrca - jr c, flashcs1 - wreg flash_cs, $ff - pop af - ret -flashcs1 wreg flash_cs+1, $ff - pop af - ret - -puerto push af - ld a, 0 - srl a - push af - ld bc, zxuno_port - ld a, flash_cs - adc a, 0 - out (c), a - pop bc - inc b - ld a, $7f -puerto1 rlca - djnz puerto1 - ld bc, zxuno_port + $100 - out (c), a - pop af - ret - -rst28 ld bc, zxuno_port + $100 - pop hl - outi - ld b, (zxuno_port >> 8)+2 - outi - jp (hl) - -repe ld e, 0 -repe1 call puerto - wreg flash_spi, 6 ; envío write enable - call flashcs - call puerto - wreg flash_spi, 1 ; envío write register status - out (c), 0 - ld a, 2 - out (c), a - call flashcs - call puerto - wreg flash_spi, $35 ; envío write register status - in a, (c) - in a, (c) - call flashcs - and 2 - ret nz - dec e - jr nz, repe1 - ret - -; ------------------------ -; Read from SPI flash -; Parameters: -; DE: destination address -; HL: source address without last byte -; A: number of pages (256 bytes) to read -; ------------------------ -rdflsh ex af, af' - xor a - push hl - call puerto - wreg flash_spi, 3 ; envio flash_spi un 3, orden de lectura - pop hl - push hl - out (c), h - out (c), l - out (c), a - ex af, af' - ex de, hl - in f, (c) -rdfls1 ld e, $20 -rdfls2 ini - inc b - ini - inc b - ini - inc b - ini - inc b - ini - inc b - ini - inc b - ini - inc b - ini - inc b - dec e - jr nz, rdfls2 - dec a - jr nz, rdfls1 - call flashcs - pop hl - ret - -hex push af - and $f0 - rrca - rrca - rrca - rrca - cp $0a - jr c, mayo - add a, 7 -mayo add a, $30 - rst $10 - pop af - and $0f - cp $0a - jr c, maya - add a, 7 -maya add a, $30 - rst $10 - ret - -FileName dz 'FLASH.ZX1' + output UPGRADE + + define FA_READ 0x01 + define M_GETSETDRV 0x89 + define F_OPEN 0x9a + define F_CLOSE 0x9b + define F_READ 0x9d + define F_SEEK 0x9f + + define zxuno_port $fc3b + define flash_spi 2 + define flash_cs 48 + + macro wreg dir, dato + call rst28 + defb dir, dato + endm + + org $2000 ; comienzo de la ejecución de los comandos ESXDOS + +Main xor a + rst $08 + db M_GETSETDRV ; A = unidad actual + jr nc, SDCard + call Print + dz 'SD card not inserted' + ret +SDCard ld b, FA_READ ; B = modo de apertura + ld hl, FileName ; HL = Puntero al nombre del fichero (ASCIIZ) + rst $08 + db F_OPEN + ld (handle+1), a + jr nc, FileFound + call Print + dz 'File FLASH not found' + ret +FileFound ld l, 0 + ld bc, 0 + ld de, 0 + rst $08 + db F_SEEK + call Print + dz 'No ' + ld a, (puerto+2) + add a, $30 + rst $10 + call repe + jr nz, nfallo +; call hex + call Print + dz 'Flash error' + jr Next +nfallo halt + halt + ;jr Verify;call hex + ld ixl, 0 + ld de, $0000 + exx +Bucle ld a, ixl + inc a + and $0f + jr nz, punto + ld a, '.' + exx + push de + rst $10 + pop de + exx +punto ld hl, $8000 + ld bc, $4000 +handle ld a, 0 + rst $08 + db F_READ + jr nc, ReadOK + call Print + dz 'Read Error' + ret +ReadOK ld a, $40 + ld hl, $8000 + exx + call wrflsh + inc de + exx + dec ixl + jr nz, Bucle + + halt + halt + +Verify ld de, $8000 + ld hl, $0040 + ld a, 2 + call rdflsh + ld de, $8000 + ld hl, 0 +Verify1 ex de, hl + ld c, (hl) + inc l + ld b, (hl) + inc hl + ex de, hl + add hl, bc + bit 1, d + jr z, Verify1 + ld a, h + call hex + ld a, l + call hex + halt + halt + +; ld de, $371a +; sbc hl, de +; jr z, Next +; call Print +; dz 'CRC Error' +Next ld a, 13 + rst $10 + ld a, (puerto+2) + inc a + ld (puerto+2), a + cp $10 + ld a, (handle+1) + jp nz, FileFound + rst $08 + db F_CLOSE + ret + +Print pop hl + db $3e +Print1 rst $10 + ld a, (hl) + inc hl + or a + jr nz, Print1 + jp (hl) + +; ------------------------ +; Write to SPI flash +; Parameters: +; A: number of pages (256 bytes) to write +; DE: target address without last byte +; BC': zxuno_port+$100 (constant) +; HL': source address from memory +; ------------------------ +wrflsh ex af, af' +wrfls1 call puerto + wreg flash_spi, 6 ; envío write enable + call flashcs + call puerto + wreg flash_spi, $20 ; envío sector erase + out (c), d + out (c), e + out (c), a + call flashcs +wrfls2 call waits5 + call puerto + wreg flash_spi, 6 ; envío write enable + call flashcs + call puerto + wreg flash_spi, 2 ; page program + out (c), d + out (c), e + out (c), a + ld a, $20 + exx + ld bc, zxuno_port+$100 +wrfls3 inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + dec a + jr nz, wrfls3 + exx + call flashcs + ex af, af' + dec a + jr z, waits5 + ex af, af' + inc e + ld a, e + and $0f + jr nz, wrfls2 + ld hl, wrfls1 + push hl +waits5 call puerto + wreg flash_spi, 5 ; envío read status + in a, (c) +waits6 in a, (c) + and 1 + jr nz, waits6 + +flashcs push af + ld a, (puerto+2) + rrca + jr c, flashcs1 + wreg flash_cs, $ff + pop af + ret +flashcs1 wreg flash_cs+1, $ff + pop af + ret + +puerto push af + ld a, 0 + srl a + push af + ld bc, zxuno_port + ld a, flash_cs + adc a, 0 + out (c), a + pop bc + inc b + ld a, $7f +puerto1 rlca + djnz puerto1 + ld bc, zxuno_port + $100 + out (c), a + pop af + ret + +rst28 ld bc, zxuno_port + $100 + pop hl + outi + ld b, (zxuno_port >> 8)+2 + outi + jp (hl) + +repe ld e, 0 +repe1 call puerto + wreg flash_spi, 6 ; envío write enable + call flashcs + call puerto + wreg flash_spi, 1 ; envío write register status + out (c), 0 + ld a, 2 + out (c), a + call flashcs + call puerto + wreg flash_spi, $35 ; envío write register status + in a, (c) + in a, (c) + call flashcs + and 2 + ret nz + dec e + jr nz, repe1 + ret + +; ------------------------ +; Read from SPI flash +; Parameters: +; DE: destination address +; HL: source address without last byte +; A: number of pages (256 bytes) to read +; ------------------------ +rdflsh ex af, af' + xor a + push hl + call puerto + wreg flash_spi, 3 ; envio flash_spi un 3, orden de lectura + pop hl + push hl + out (c), h + out (c), l + out (c), a + ex af, af' + ex de, hl + in f, (c) +rdfls1 ld e, $20 +rdfls2 ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + dec e + jr nz, rdfls2 + dec a + jr nz, rdfls1 + call flashcs + pop hl + ret + +hex push af + and $f0 + rrca + rrca + rrca + rrca + cp $0a + jr c, mayo + add a, 7 +mayo add a, $30 + rst $10 + pop af + and $0f + cp $0a + jr c, maya + add a, 7 +maya add a, $30 + rst $10 + ret + +FileName dz 'FLASH.ZX1'