diff --git a/tsfm_speccy_player/!build.bat b/tsfm_speccy_player/!build.bat new file mode 100644 index 0000000..42f2cf7 --- /dev/null +++ b/tsfm_speccy_player/!build.bat @@ -0,0 +1,5 @@ +@echo off +bas2tap -a10 -spsgplay loader.bas loader.tap +sjasmplus main.asm --lst=main.lst +copy /b loader.tap+player.tap "moebius.tap" +pause \ No newline at end of file diff --git a/tsfm_speccy_player/.gitignore b/tsfm_speccy_player/.gitignore new file mode 100644 index 0000000..f9dbfc2 --- /dev/null +++ b/tsfm_speccy_player/.gitignore @@ -0,0 +1,5 @@ +*.tap +*.sna +*.obj +*.exe +*.lst \ No newline at end of file diff --git a/tsfm_speccy_player/loader.bas b/tsfm_speccy_player/loader.bas new file mode 100644 index 0000000..0d97750 --- /dev/null +++ b/tsfm_speccy_player/loader.bas @@ -0,0 +1,3 @@ +10 BORDER 0 : PAPER 7 : INK 7 : CLEAR 24575 +20 LOAD "moebius" CODE +100 RANDOMIZE USR 33155 \ No newline at end of file diff --git a/tsfm_speccy_player/main.asm b/tsfm_speccy_player/main.asm new file mode 100644 index 0000000..4310f37 --- /dev/null +++ b/tsfm_speccy_player/main.asm @@ -0,0 +1,229 @@ + ; moe-bius - zx/tsfm player + ; --atemka 14.o8.2o25 + + device zxspectrum128 + +ivt equ 0x8000 +isr equ 0x8181 +codestart equ 0x8080 + +reg_buffer equ 0x5B00 ; basic variables :meatjob: + + EMPTYTAP "psgplay.tap" + + ; IM2 vector table - all 257 values for floating bus condition + org ivt + block 257, (isr >> 8) ; isr at 0x8181 + + ; dummy ISR (vblank synchronization is done by HALT) + org isr +stack_top: + ei + ret + + ; entrypoint +start: + di + ld sp, stack_top + + ; set IM2 vector table to 0x80 + ld a, high ivt + ld i, a + im 2 + + ; enable interrupts + ei +.loop: + halt + + ; output OPN registers + ; TODO + ld hl, test_dump + call player.reg_out + di + halt + + ; draw VU meters +.base = 0x4000 + 2048*2 + 32*6 + 19 + ld bc, .base + 0 ; 10 + call vumeter.draw_0 ; 17 +.vu0 equ $-2 + ld bc, .base + 2 ; 10 + call vumeter.draw_0 ; 17 +.vu1 equ $-2 + ld bc, .base + 4 ; 10 + call vumeter.draw_0 ; 17 +.vu2 equ $-2 + ld bc, .base + 7 ; 10 + call vumeter.draw_0 ; 17 +.vu3 equ $-2 + ld bc, .base + 9 ; 10 + call vumeter.draw_0 ; 17 +.vu4 equ $-2 + ld bc, .base + 11 ; 10 + call vumeter.draw_0 ; 17 +.vu5 equ $-2 + + ; and jump to next frame + xor a : ld bc, 0x7FFD : out (c), a ; map fast page to fix 128k AY ports contention + jp .loop + +test_dump: + db 0x2F, 0xFF ; prescaler reg + db 0x2D, 0xFF ; prescaler reg + db 0x30, 0x01 + db 0x34, 0x21 + db 0x38, 0x52 + db 0x3C, 0x02 + db 0x40, 0x32 + db 0x44, 0x17 + db 0x48, 0x1C + db 0x4C, 0x03 + db 0x50, 0x1F + db 0x54, 0x1F + db 0x58, 0x1F + db 0x5C, 0x1F + db 0x60, 0x08 + db 0x64, 0x0C + db 0x68, 0x11 + db 0x6C, 0x09 + db 0x70, 0x00 + db 0x74, 0x00 + db 0x78, 0x01 + db 0x7C, 0x00 + db 0x80, 0xC0 + db 0x84, 0xB1 + db 0x88, 0x52 + db 0x8C, 0xF4 + db 0x90, 0x00 + db 0x94, 0x00 + db 0x98, 0x00 + db 0x9C, 0x00 + db 0xB0, 0x28 + db 0x28, 0x00 + db 0xA4, 0x0C + db 0xA0, 0xA3 + db 0x28, 0xF0 + db -1 + + +; ---------------------------------------------------- + ; vu meters + ; orig by natt, rewritten by me + +vumeter: + ld a, 0 + call .get_address + ld [start.vu0], hl + ld a, 1 + call .get_address + ld [start.vu1], hl + ld a, 2 + call .get_address + ld [start.vu2], hl + ld a, 3 + call .get_address + ld [start.vu3], hl + ld a, 4 + call .get_address + ld [start.vu4], hl + ld a, 5 + call .get_address + ld [start.vu5], hl + + ret + + ; DE - screen pos, A - register value +.get_address: + bit 4, a + jp nz, .get_e + and 0x0E + ld h, high .calltab + ld l, a + ld e, [hl] : inc l + ld d, [hl] + exd + ret +.get_e: + ld hl, .draw_e + ret + + ; ------------------ + ; drawing routines + ; DE - dst +.draw_e: + ld a, 0b00000000 : ld [bc], a : inc b ; 18 + ld a, 0b11111111 : ld [bc], a : inc b ; 18 + ld a, 0b11000011 : ld [bc], a : inc b ; 18 + ld a, 0b11011111 : ld [bc], a : inc b ; 18 + ld a, 0b11000111 : ld [bc], a : inc b ; 18 + ld a, 0b11011111 : ld [bc], a : inc b ; 18 + ld a, 0b11000011 : ld [bc], a : inc b ; 18 + ld a, 0b11111111 : ld [bc], a : ret ; 24 = 150t per char + +.draw_0: +.draw_1: + dup 7 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*7 + dup 1 : ld a, 0x00 : ld [bc], a : ret : edup ; 24*1 +.draw_2: + dup 6 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*6 + dup 1 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*1 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 +.draw_3: + dup 5 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*5 + dup 2 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*2 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 +.draw_4: + dup 4 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*4 + dup 3 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*3 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 +.draw_5: + dup 3 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*3 + dup 4 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*4 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 +.draw_6: + dup 2 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*2 + dup 5 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*5 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 +.draw_7: + dup 1 : ld a, 0x00 : ld [bc], a : inc b : edup ; 18*1 + dup 6 : ld a, 0xFF : ld [bc], a : inc b : edup ; 18*6 + dup 1 : ld a, 0xFF : ld [bc], a : ret : edup ; 24 + + align 256 +.calltab: + dw .draw_0, .draw_1, .draw_2, .draw_3, .draw_4, .draw_5, .draw_6, .draw_7 + + ; player include + include "player.asm" + +code_end + + ; ------------------------------------------------- + ; music pages + page 0 + emptytap "page0.tap" + org 0xC000 + align 256 + ;incbin "!music/200_percent_partyfinal.2.6.psg.packed" + savetap "page0.tap",CODE,"page0",0xC000,$-0xC000 + + + ; splash screen + emptytap "splash.tap" + org 0x4000 +splash: + block 6144, 0 + block 768, (0<<3)|(7<<0) + ;incbin "200a.scr" + savetap "splash.tap",CODE,"splash",0x4000,$-0x4000 + +endmodule +; ---------------------------------------------------- +total_codelength equ code_end-codestart + + display "total: ", /a, total_codelength, " bytes" + + savesna "moebius.sna", start + savetap "player.tap",CODE,"moebius",codestart,total_codelength + diff --git a/tsfm_speccy_player/player.asm b/tsfm_speccy_player/player.asm new file mode 100644 index 0000000..f19ed31 --- /dev/null +++ b/tsfm_speccy_player/player.asm @@ -0,0 +1,26 @@ + module player + + ; ----------------------------- + ; ----------------------------- + ; OPN register dump output + ; in: HL - registers in (reg:data) byte pairs, reg==0xFF - return +reg_out: + ld bc, 0xFFFD + ld de, 0x00C0 ; 0xFFBF compensated for outi + + ; select 1st chip + ld a, 0b11111000 + out (c), a +.loop: + ld b, d + ld a, [hl] + inc a ; test for 0xFF terminator + ret z + outi + ld b, e + outi + dup 4: nop : edup ; delay + jp .loop + + + endmodule \ No newline at end of file