Last active
July 31, 2022 16:19
-
-
Save svofski/f41ec5939d75b69bd7a2933f81489df1 to your computer and use it in GitHub Desktop.
unpacking 14 parallel ay register streams
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; Song title: EA at feb 2018 (YM+ABC) | |
; | |
; compressed into 14 parallel streams from YM6 file saved by register | |
; | |
; This example is decompressing and playing 14 parallel streams. | |
; Compressed data size 2310 bytes (uncompressed 61586) | |
; | |
; code by svofski 2022 | |
; | |
; | |
; DZX0: | |
; ----------------------------------------------------------------------------- | |
; ZX0 8080 decoder by Ivan Gorodetsky - OLD FILE FORMAT v1 | |
; Based on ZX0 z80 decoder by Einar Saukas | |
; v1 (2021-02-15) - 103 bytes forward / 100 bytes backward | |
; v2 (2021-02-17) - 101 bytes forward / 100 bytes backward | |
; v3 (2021-02-22) - 99 bytes forward / 98 bytes backward | |
; v4 (2021-02-23) - 98 bytes forward / 97 bytes backward | |
; v5 (2021-08-16) - 94 bytes forward and backward (slightly faster) | |
; v6 (2021-08-17) - 92 bytes forward / 94 bytes backward (forward version slightly faster) | |
; v7 (2022-04-30) - 92 bytes forward / 94 bytes backward (source address now in DE, slightly faster) | |
; ----------------------------------------------------------------------------- | |
; Parameters (forward): | |
; DE: source address (compressed data) | |
; BC: destination address (decompressing) | |
; | |
; Parameters (backward): | |
; DE: last source address (compressed data) | |
; BC: last destination address (decompressing) | |
; ----------------------------------------------------------------------------- | |
; compress forward with <-c> option (<-classic> for salvador) | |
; | |
; compress backward with <-b -c> options (<-b -classic> for salvador) | |
; | |
; ----------------------------------------------------------------------------- | |
.project gigachad.rom | |
.org $100 | |
; total number of scheduler tasks | |
n_tasks equ 14 | |
; task stack size | |
task_stack_size equ 22 | |
xra a | |
out $10 | |
mvi a, $c9 | |
sta $38 | |
brutal_restart: | |
lxi sp, $100 | |
create_tasks: | |
lxi d, song_00 | |
lxi b, buffer00 | |
lxi h, stack_00 + task_stack_size | |
mvi a, 0 | |
call dzx0_create | |
lxi d, song_01 | |
lxi b, buffer01 | |
lxi h, stack_01 + task_stack_size | |
mvi a, 1 | |
call dzx0_create | |
lxi d, song_02 | |
lxi b, buffer02 | |
lxi h, stack_02 + task_stack_size | |
mvi a, 2 | |
call dzx0_create | |
lxi d, song_03 | |
lxi b, buffer03 | |
lxi h, stack_03 + task_stack_size | |
mvi a, 3 | |
call dzx0_create | |
lxi d, song_04 | |
lxi b, buffer04 | |
lxi h, stack_04 + task_stack_size | |
mvi a, 4 | |
call dzx0_create | |
lxi d, song_05 | |
lxi b, buffer05 | |
lxi h, stack_05 + task_stack_size | |
mvi a, 5 | |
call dzx0_create | |
lxi d, song_06 | |
lxi b, buffer06 | |
lxi h, stack_06 + task_stack_size | |
mvi a, 6 | |
call dzx0_create | |
lxi d, song_07 | |
lxi b, buffer07 | |
lxi h, stack_07 + task_stack_size | |
mvi a, 7 | |
call dzx0_create | |
lxi d, song_08 | |
lxi b, buffer08 | |
lxi h, stack_08 + task_stack_size | |
mvi a, 8 | |
call dzx0_create | |
lxi d, song_09 | |
lxi b, buffer09 | |
lxi h, stack_09 + task_stack_size | |
mvi a, 9 | |
call dzx0_create | |
lxi d, song_10 | |
lxi b, buffer10 | |
lxi h, stack_10 + task_stack_size | |
mvi a, 10 | |
call dzx0_create | |
lxi d, song_11 | |
lxi b, buffer11 | |
lxi h, stack_11 + task_stack_size | |
mvi a, 11 | |
call dzx0_create | |
lxi d, song_12 | |
lxi b, buffer12 | |
lxi h, stack_12 + task_stack_size | |
mvi a, 12 | |
call dzx0_create | |
lxi d, song_13 | |
lxi b, buffer13 | |
lxi h, stack_13 + task_stack_size | |
mvi a, 13 | |
call dzx0_create | |
frame: | |
ei | |
hlt | |
call scheduler_tick | |
call ay_send | |
jmp frame | |
; | |
; AY-3-8910 register buffer | |
; | |
ay_line db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
ayctrl equ $15 | |
aydata equ $14 | |
; send ay_line to AY regs | |
; reg13 (envelope shape) is special: $ff means no change / don't write | |
ay_send | |
mvi e, 13 | |
lxi b, ay_line+13 | |
ldax b | |
cpi $ff | |
jz ay_send_L2 ; no touchy fishy | |
ay_send_L1 | |
mov a, e | |
out ayctrl | |
ldax b | |
out aydata | |
ay_send_L2 | |
dcr c | |
dcr e | |
jp ay_send_L1 | |
ret | |
; | |
; call all tasks in order | |
; | |
scheduler_tick: | |
lxi h, 0 | |
dad sp | |
shld sched_sp | |
; data harvest pointer | |
lxi h, ay_line | |
shld ay_line_ptr | |
lxi h, context | |
sched_next_task: | |
shld context_ptr | |
mov e, m \ inx h \ mov d, m ; de = &context[n] | |
xchg | |
sphl | |
; restore task context and return into it | |
pop h | |
pop d | |
pop b | |
pop psw | |
ret | |
sched_yield: ; a = decoded byte in-order | |
ay_line_ptr equ $+1 | |
lxi h, 0 | |
mov m, a | |
inx h | |
shld ay_line_ptr | |
lxi h, 0 | |
dad sp | |
xchg ; de = task context | |
lhld context_ptr ; hl = context[n] | |
mov m, e \ inx h \ mov m, d \ inx h | |
mvi a, context_end >> 8 | |
cmp h | |
jnz sched_next_task | |
mvi a, context_end & 255 | |
cmp l | |
jnz sched_next_task | |
sched_sp equ $+1 | |
lxi sp, 0 | |
ret | |
; dzx0 task calls this to yield after producing each octet | |
dzx0_yield: push psw | |
push b | |
push d | |
push h | |
jmp sched_yield | |
; | |
; create a dzx0 task | |
; | |
; a = task number (0..n_tasks-1) | |
; hl = task stack end | |
; bc = dst buffer | |
; de = stream source | |
dzx0_create: | |
shld crea_loadsp | |
lxi h, crea_b+1 | |
mov m, c \ inx h \ mov m, b \ inx h \ inx h | |
mov m, e \ inx h \ mov m, d | |
lxi h, 0 | |
dad sp | |
shld dzx0_create_sp | |
lxi d, context ; context[0] | |
mov l, a | |
mvi h, 0 | |
dad h | |
dad d ; hl = &context[a] | |
shld crea_ctx+1 ; will save task sp here | |
crea_loadsp equ $+1 | |
lxi sp, 0 | |
crea_b: lxi b, 0 | |
crea_d: lxi d, 0 | |
; create task entry point within its context | |
lxi h, dzx0 | |
push h | |
push psw | |
push b | |
push d | |
push h | |
lxi h, 0 | |
dad sp | |
crea_ctx: shld 0 ; save sp in task context | |
dzx0_create_sp equ $+1 | |
lxi sp, 0 | |
ret ; this is a normal return | |
dzx0: | |
lxi h,0FFFFh ; tos=-1 offset? | |
push h | |
inx h | |
mvi a,080h | |
dzx0_literals: ; Literal (copy next N bytes from compressed file) | |
call dzx0_elias ; hl = read_interlaced_elias_gamma(FALSE) | |
; call dzx0_ldir ; for (i = 0; i < length; i++) write_byte(read_byte() | |
push psw | |
dzx0_ldir1: | |
ldax d | |
stax b | |
inx d | |
call dzx0_yield | |
inr c ; stay within circular buffer | |
dcx h | |
mov a,h | |
ora l | |
jnz dzx0_ldir1 | |
pop psw | |
add a | |
jc dzx0_new_offset ; if (read_bit()) goto COPY_FROM_NEW_OFFSET | |
; COPY_FROM_LAST_OFFSET | |
call dzx0_elias ; hl = read_interlaced_elias_gamma(FALSE) | |
dzx0_copy: | |
xchg ; hl = src, de = length | |
xthl ; ex (sp), hl: | |
; tos = src | |
; hl = -1 | |
push h ; push -1 | |
dad b ; h = -1 + dst | |
mov h, b ; stay in the buffer! | |
xchg ; de = dst + offset, hl = length | |
; call dzx0_ldir ; for (i = 0; i < length; i++) write_byte(dst[-offset+i]) | |
push psw | |
dzx0_ldir_from_buf: | |
ldax d | |
stax b | |
inr e | |
call dzx0_yield | |
inr c ; stay within circular buffer | |
dcx h | |
mov a,h | |
ora l | |
jnz dzx0_ldir_from_buf | |
mvi h,0 | |
pop psw | |
add a | |
; de = de + length | |
; hl = 0 | |
; a, carry = a + a | |
xchg ; de = 0, hl = de + length .. discard dst | |
pop h ; hl = old offset | |
xthl ; offset = hl, hl = src | |
xchg ; de = src, hl = 0? | |
jnc dzx0_literals ; if (!read_bit()) goto COPY_LITERALS | |
; COPY_FROM_NEW_OFFSET | |
; Copy from new offset (repeat N bytes from new offset) | |
dzx0_new_offset: | |
call dzx0_elias ; hl = read_interlaced_elias_gamma() | |
mov h,a ; h = a | |
pop psw ; drop offset from stack | |
xra a ; a = 0 | |
sub l ; l == 0? | |
;rz ; return | |
jz dzx0_ded | |
push h ; offset = new offset | |
; last_offset = last_offset*128-(read_byte()>>1); | |
rar\ mov h,a ; h = hi(last_offset*128) | |
ldax d ; read_byte() | |
rar\ mov l,a ; l = read_byte()>>1 | |
inx d ; src++ | |
xthl ; offset = hl, hl = old offset | |
mov a,h ; | |
lxi h,1 ; | |
cnc dzx0_elias_backtrack; | |
inx h | |
jmp dzx0_copy | |
dzx0_elias: | |
inr l | |
dzx0_elias_loop: | |
add a | |
jnz dzx0_elias_skip | |
ldax d | |
inx d | |
ral | |
dzx0_elias_skip: | |
rc | |
dzx0_elias_backtrack: | |
dad h | |
add a | |
jnc dzx0_elias_loop | |
jmp dzx0_elias | |
dzx0_ldir: | |
push psw | |
mov a, b | |
cmp d | |
jz dzx0_ldir_from_buf | |
; reached the end, just restart the scheduler | |
dzx0_ded jmp brutal_restart | |
;call dzx0_yield | |
;jmp dzx0_ded | |
; | |
; | |
; SONG DATA | |
; | |
; see ym6break.py | |
; | |
; recipe: | |
; 1. extract each register as separate stream | |
; 2. salvador -classic -w 256 register_stream | |
; 3. make db strings etc | |
; Special for Vortex Tracker 2.5 | |
; EA at feb 2018 (YM+ABC) | |
; Created by Sergey Bulba's AY-3-8910/12 Emulator v2.9 | |
song_00: db $79,$8e,$1c,$ef,$fa,$54,$26,$b2,$65,$1c,$15,$19,$85,$9f,$3e,$fc,$47,$2e,$02,$fa,$55,$09,$85,$b2,$65,$1c,$46,$61,$9f,$3e,$fc,$51,$9b,$0e,$9c,$6f,$21,$50,$79,$d0,$04,$79,$fb,$a6,$32,$e5,$9c,$65,$1c,$b2,$01,$e0,$d0,$47,$9a,$fb,$1f,$be,$7c,$60,$3e,$fc,$9f,$1e,$d0,$05,$73,$20,$02,$a8,$1c,$8e,$43,$81,$a0,$47,$9a,$fb,$32,$e5,$9c,$60,$65,$1c,$b2,$1e,$d7,$b8,$9c,$d0,$5e,$a0,$51,$e6,$fb,$1f,$be,$7c,$98,$3e,$fc,$9f,$07,$ae,$d7,$7c,$d0,$17,$95,$a0,$72,$20,$68,$0e,$5a,$0e,$07,$85,$d0,$e0,$a0,$51,$e6,$fb,$32,$e5,$9c,$89,$65,$1c,$a5,$b2,$fc,$e9,$f4,$ae,$9c,$d0,$17,$94,$a0,$79,$fb,$a2,$1f,$be,$7c,$3e,$fc,$69,$9f,$7f,$e9,$f4,$2b,$7c,$85,$d0,$e5,$a0,$5c,$95,$20,$78,$a0,$14,$79,$fb,$a2,$32,$e5,$9c,$65,$1c,$69,$b2,$7f,$e9,$f4,$2b,$9c,$85,$d0,$e5,$a0,$1e,$fb,$68,$1f,$be,$7c,$9a,$3e,$fc,$9f,$5f,$e9,$ca,$f4,$7c,$e1,$d0,$79,$a0,$57,$25,$20,$5e,$a0,$05,$1e,$fb,$68,$32,$e5,$9c,$9a,$65,$1c,$b2,$5f,$e9,$ca,$f4,$9c,$e1,$d0,$79,$a0,$47,$9a,$fb,$1f,$be,$7c,$26,$3e,$fc,$97,$9f,$f2,$e9,$f4,$b8,$7c,$d0,$5e,$a0,$55,$c9,$20,$57,$81,$a0,$47,$9a,$fb,$32,$e5,$9c,$26,$65,$1c,$97,$b2,$f2,$e9,$f4,$b8,$9c,$d0,$5e,$a0,$51,$e6,$fb,$1f,$be,$7c,$89,$3e,$fc,$a5,$9f,$fc,$e9,$f4,$ae,$7c,$d0,$17,$95,$a0,$72,$20,$55,$e0,$a0,$51,$e6,$fb,$32,$e5,$9c,$89,$65,$1c,$a5,$b2,$fc,$e9,$f4,$ae,$9c,$d0,$17,$94,$a0,$79,$fb,$a2,$1f,$be,$7c,$3e,$fc,$69,$9f,$7f,$e9,$f4,$2b,$7c,$85,$d0,$e5,$a0,$5c,$95,$20,$78,$a0,$14,$79,$fb,$a2,$32,$e5,$9c,$65,$1c,$69,$b2,$7f,$e9,$f4,$2b,$9c,$85,$d0,$e5,$a0,$1e,$fb,$68,$1f,$be,$7c,$9a,$3e,$fc,$9f,$5f,$e9,$ca,$f4,$7c,$e1,$d0,$79,$a0,$57,$00,$00,$80 | |
song_01: db $79,$00,$01,$00,$fa,$55,$28,$01,$55,$68,$00,$05,$56,$85,$01,$47,$25,$80,$56,$0f,$02,$03,$04,$05,$d0,$00,$0f,$ed,$80,$fa,$e0,$d0,$57,$34,$50,$57,$f9,$0f,$ff,$a0,$10,$3e,$03,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$80,$55,$c0,$00,$20 | |
song_02: db $85,$00,$55,$6b,$ef,$a2,$fc,$ec,$e9,$9b,$ef,$f2,$f5,$9b,$f0,$1c,$e2,$ff,$fd,$19,$16,$9b,$1c,$1f,$22,$9e,$f0,$b8,$54,$f0,$7c,$e5,$40,$57,$81,$64,$be,$65,$ff,$fd,$29,$62,$5f,$b9,$65,$68,$6b,$f0,$e5,$b8,$4f,$7c,$0b,$fc,$e2,$ff,$fd,$f9,$f6,$9b,$fc,$ff,$02,$9b,$f0,$3e,$e2,$ff,$fd,$3b,$38,$9b,$3e,$41,$44,$9e,$f0,$b8,$54,$f0,$7c,$c8,$08,$17,$95,$b8,$3c,$7c,$39,$40,$55,$e0,$64,$6f,$65,$ff,$8a,$fd,$62,$5f,$6e,$65,$68,$6b,$f0,$79,$b8,$53,$c2,$7c,$f8,$fc,$ff,$fd,$a6,$f9,$f6,$fc,$ff,$02,$e6,$f0,$f8,$3e,$ff,$fd,$a6,$3b,$38,$3e,$41,$44,$e7,$f0,$95,$b8,$3c,$7c,$32,$08,$05,$e5,$b8,$4f,$7c,$0e,$40,$55,$78,$64,$1b,$65,$e2,$ff,$fd,$62,$5f,$9b,$65,$68,$6b,$9e,$f0,$b8,$54,$f0,$7c,$be,$fc,$ff,$fd,$29,$f9,$f6,$b9,$fc,$ff,$02,$f0,$be,$3e,$ff,$fd,$29,$3b,$38,$b9,$3e,$41,$44,$f0,$e5,$b8,$4f,$7c,$0c,$96,$50,$fb,$bd,$fe,$ba,$25,$ec,$e7,$dc,$95,$b8,$79,$7c,$79,$40,$55,$e0,$28,$6f,$65,$ff,$8a,$fd,$62,$5f,$6e,$65,$68,$6b,$dc,$79,$b8,$57,$96,$7c,$f8,$fc,$fe,$08,$f9,$f6,$f9,$fc,$ff,$02,$ff,$d6,$22,$d3,$3e,$e8,$fc,$a6,$3b,$38,$3e,$41,$44,$e7,$dc,$95,$b8,$79,$7c,$79,$f0,$6e,$1c,$fe,$25,$86,$1a,$18,$1a,$1c,$1e,$20,$bd,$86,$d6,$86,$ef,$15,$f2,$ed,$eb,$ed,$ef,$f1,$f3,$ef,$eb,$e7,$e3,$df,$db,$d5,$cf,$cd,$cb,$c9,$c7,$c1,$bd,$bb,$b9,$bb,$b8,$5f,$d4,$d2,$d4,$d6,$d8,$da,$d8,$f0,$f0,$a0,$e7,$70,$e7,$b0,$bf,$c1,$bf,$93,$f0,$97,$94,$9f,$40,$4c,$0f,$9c,$79,$f0,$43,$21,$80,$08,$07,$ea,$e5,$e0,$db,$d6,$cf,$c8,$c5,$c2,$bf,$bc,$b5,$b2,$b0,$ae,$b0,$b2,$20,$bc,$79,$a0,$73,$44,$5f,$f0,$72,$38,$07,$d3,$ac,$d6,$9c,$55,$fc,$da,$e4,$ee,$f8,$02,$08,$0e,$14,$1a,$24,$2e,$38,$42,$48,$4e,$54,$5a,$64,$6e,$78,$82,$88,$8e,$94,$9a,$a4,$ae,$b8,$c2,$c8,$ce,$c0,$84,$80,$24,$33,$eb,$e7,$e3,$df,$db,$d5,$cf,$cd,$cb,$c9,$c7,$c1,$94,$e0,$10,$7c,$a0,$33,$44,$5f,$f0,$79,$94,$79,$a0,$f0,$4c,$f7,$9c,$94,$f0,$32,$80,$10,$80,$72,$ea,$e5,$e0,$db,$d6,$cf,$c8,$c5,$c2,$bf,$bc,$b5,$b2,$b0,$ae,$b0,$b2,$bc,$07,$97,$a0,$35,$44,$f7,$f0,$20,$38,$7d,$ac,$3d,$9c,$64,$4c,$da,$e4,$ee,$f8,$02,$08,$0e,$14,$1a,$24,$2e,$38,$42,$48,$4e,$54,$5a,$64,$6e,$78,$82,$88,$8e,$1c,$8e,$5e,$e1,$9b,$f4,$27,$bd,$5e,$3f,$2a,$83,$5e,$22,$6b,$47,$a2,$6b,$77,$4f,$f9,$f9,$ac,$92,$fc,$7e,$54,$fc,$fc,$7e,$43,$81,$d0,$e4,$a0,$f0,$40,$02,$0f,$65,$b2,$77,$65,$f8,$18,$25,$df,$ef,$9f,$df,$39,$b8,$e7,$ac,$f9,$58,$f8,$17,$fc,$10,$f8,$78,$7c,$1c,$98,$74,$ff,$3e,$9f,$fb,$f9,$a0,$e4,$f8,$5e,$74,$78,$f4,$18,$3e,$bd,$5e,$3f,$bd,$f9,$4c,$72,$20,$5e,$40,$7c,$94,$7d,$d0,$79,$a0,$79,$40,$55,$83,$65,$b2,$77,$65,$c6,$f8,$09,$df,$ef,$9f,$df,$4e,$b8,$79,$ac,$fe,$58,$f8,$45,$ff,$10,$f8,$1e,$7c,$07,$26,$74,$3f,$3e,$9f,$fb,$f9,$f9,$a0,$f8,$17,$3a,$6f,$fc,$29,$ec,$e9,$af,$ef,$f2,$f5,$bd,$fe,$be,$ba,$5f,$fc,$8a,$19,$16,$6e,$1c,$1f,$22,$dc,$79,$b8,$57,$97,$7c,$95,$40,$5e,$28,$06,$f8,$65,$ff,$fd,$a6,$62,$5f,$65,$68,$6b,$e7,$04,$95,$b8,$79,$7c,$6f,$fc,$fe,$80,$82,$f9,$f6,$f9,$fc,$ff,$02,$ff,$d6,$2e,$d3,$3e,$fc,$8a,$3b,$38,$6e,$3e,$41,$44,$dc,$79,$b8,$57,$97,$c4,$00,$00,$80 | |
song_03: db $90,$00,$40,$68,$01,$07,$91,$b8,$7d,$7c,$79,$40,$10,$f0,$fe,$43,$d7,$10,$de,$ea,$b8,$00,$72,$08,$05,$f4,$b8,$4f,$40,$00,$7c,$fe,$10,$f5,$10,$f7,$ea,$80,$b8,$1c,$81,$08,$7d,$b8,$13,$c0,$40,$1f,$fe,$04,$3d,$10,$7d,$ea,$e0,$b8,$07,$35,$08,$7d,$c4,$79,$b8,$53,$c5,$40,$0e,$ac,$07,$80,$dc,$1c,$91,$80,$a4,$01,$1e,$b8,$55,$b8,$01,$fe,$12,$85,$00,$05,$c9,$80,$00,$2e,$01,$fe,$41,$a1,$00,$41,$72,$80,$40,$0c,$dc,$be,$c7,$ae,$bd,$f8,$f4,$32,$82,$17,$97,$d0,$81,$a0,$f0,$b8,$3c,$40,$11,$f7,$f8,$d7,$dc,$91,$04,$e4,$f8,$5c,$95,$b0,$f7,$14,$35,$08,$e5,$fe,$5c,$94,$bc,$e5,$ac,$79,$94,$5e,$b8,$57,$c1,$40,$4f,$f8,$7d,$dc,$79,$04,$1e,$f8,$45,$c9,$b0,$5f,$14,$73,$08,$5e,$fe,$00,$68,$01,$5f,$b8,$01,$f5,$c4,$e5,$40,$57,$81,$ac,$e0,$dc,$07,$24,$80,$69,$01,$07,$95,$b8,$3c,$c4,$30,$00,$08 | |
song_04: db $79,$1c,$ef,$bd,$fa,$54,$26,$65,$1c,$ef,$15,$19,$85,$3e,$fc,$d6,$47,$2e,$02,$fa,$55,$09,$85,$65,$1c,$ef,$46,$61,$3e,$fc,$d6,$51,$cb,$02,$95,$fa,$42,$61,$65,$1c,$ef,$51,$98,$3e,$fc,$d6,$54,$72,$02,$e5,$fa,$50,$98,$65,$1c,$ef,$54,$66,$3e,$fc,$d6,$15,$1c,$96,$68,$e4,$70,$fe,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$95,$20,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$95,$20,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$00,$02 | |
song_05: db $2e,$01,$00,$fa,$55,$1a,$01,$15,$5a,$00,$01,$55,$a1,$01,$51,$cc,$80,$00,$83,$02,$02,$03,$05,$95,$d0,$42,$8a,$03,$01,$3d,$fa,$78,$d0,$15,$e5,$10,$78,$d0,$04,$1a,$03,$28,$01,$f5,$fa,$e0,$d0,$57,$31,$50,$42,$e4,$04,$fe,$e4,$d0,$40,$a2,$03,$8e,$01,$fa,$2e,$05,$fe,$4e,$d0,$05,$79,$10,$5e,$d0,$01,$02,$8a,$03,$01,$38,$fa,$b9,$05,$fe,$38,$d0,$15,$e5,$10,$78,$d0,$04,$0a,$03,$28,$01,$e2,$fa,$e4,$05,$fe,$e0,$d0,$57,$95,$10,$e0,$d0,$10,$28,$03,$a3,$01,$8b,$fa,$05,$93,$fe,$81,$d0,$5e,$10,$57,$80,$d0,$40,$a2,$03,$8e,$01,$fa,$2e,$05,$fe,$4e,$d0,$05,$79,$10,$5e,$d0,$01,$02,$8a,$03,$01,$38,$fa,$b9,$05,$fe,$38,$d0,$15,$c9,$80,$55,$c0,$00,$20 | |
song_06: db $81,$00,$04,$56,$08,$10,$08,$06,$04,$0e,$a0,$50,$56,$f8,$01,$ff,$f4,$27,$12,$0a,$08,$ae,$aa,$02,$ff,$8a,$00,$03,$38,$f4,$3b,$82,$9e,$f4,$d0,$5e,$a0,$5e,$70,$5e,$40,$04,$40,$4c,$00,$02 | |
song_07: db $85,$28,$55,$68,$38,$55,$56,$f0,$30,$d0,$11,$22,$30,$30,$17,$b8,$fe,$d0,$79,$a0,$15,$5f,$df,$ea,$fe,$34,$9f,$3c,$f7,$ff,$f4,$a0,$85,$d0,$e0,$a0,$50,$55,$c0,$00,$20 | |
song_08: db $49,$0e,$0d,$0c,$0b,$0a,$09,$38,$e8,$1f,$c4,$41,$f7,$d0,$90,$40,$55,$6e,$0f,$e6,$bc,$0a,$fe,$fa,$e8,$0b,$17,$81,$dc,$b9,$0b,$d0,$7c,$a0,$39,$70,$5e,$40,$11,$16,$3b,$0d,$0d,$ec,$84,$40,$f9,$d1,$40,$3d,$d0,$79,$70,$5e,$40,$11,$42,$85,$0d,$b8,$0d,$d0,$15,$14,$30,$00,$08 | |
song_09: db $85,$00,$55,$61,$91,$0f,$0e,$0d,$0c,$0b,$f5,$dc,$1f,$e8,$5e,$40,$01,$14,$21,$f1,$0a,$0a,$09,$08,$08,$dc,$1e,$40,$14,$17,$d6,$f8,$fb,$0f,$cf,$cc,$97,$e8,$df,$f4,$d0,$5e,$94,$07,$d1,$70,$e4,$28,$1b,$0b,$85,$fe,$32,$80,$45,$5b,$0a,$81,$fe,$32,$80,$01,$0f,$fe,$44,$c8,$80,$51,$6e,$0a,$fe,$52,$fa,$0f,$98,$0a,$e6,$e9,$09,$08,$07,$01,$e7,$c4,$c3,$b8,$95,$e8,$7c,$40,$10,$f9,$46,$7e,$06,$05,$04,$03,$02,$01,$00,$ff,$dc,$07,$d1,$a0,$f5,$e0,$f9,$ff,$60,$79,$40,$55,$cd,$08,$1e,$f4,$7d,$b8,$7d,$e8,$57,$d5,$40,$73,$20,$47,$81,$dc,$f4,$a0,$7d,$e0,$7e,$7b,$60,$5f,$40,$04,$3d,$fe,$fb,$7c,$08,$80,$dc,$1e,$e8,$5e,$40,$05,$57,$00,$00,$80 | |
song_10: db $49,$0e,$0d,$0c,$0b,$0a,$09,$38,$e8,$1f,$c4,$41,$f7,$d0,$90,$40,$55,$6e,$0f,$e6,$bc,$0a,$fe,$fa,$e8,$0b,$17,$81,$dc,$b9,$0b,$d0,$7c,$a0,$39,$70,$5e,$40,$44,$45,$b9,$1f,$fe,$39,$70,$38,$d0,$43,$95,$70,$e0,$40,$41,$55,$c0,$00,$20 | |
song_11: db $90,$00,$01,$16,$85,$47,$55,$a1,$59,$55,$a1,$50,$55,$a1,$47,$05,$a1,$00,$68,$47,$55,$68,$59,$41,$68,$00,$5a,$50,$15,$5a,$47,$10,$5a,$00,$16,$85,$47,$56,$84,$59,$16,$85,$00,$a1,$50,$55,$a1,$47,$55,$68,$59,$55,$68,$50,$55,$68,$47,$55,$5a,$59,$15,$5a,$50,$15,$5a,$47,$15,$56,$85,$59,$56,$84,$50,$17,$00,$00,$80 | |
song_12: db $94,$00,$55,$55,$c0,$00,$20 | |
song_13: db $90,$ff,$01,$16,$f4,$08,$d0,$41,$2c,$01,$95,$80,$55,$38,$d0,$01,$55,$c0,$00,$20 | |
; | |
; runtime data (careful with relative equ directives) | |
; | |
; task stacks | |
stacks | |
stack_00 equ stacks | |
stack_01 equ stack_00 + task_stack_size | |
stack_02 equ stack_01 + task_stack_size | |
stack_03 equ stack_02 + task_stack_size | |
stack_04 equ stack_03 + task_stack_size | |
stack_05 equ stack_04 + task_stack_size | |
stack_06 equ stack_05 + task_stack_size | |
stack_07 equ stack_06 + task_stack_size | |
stack_08 equ stack_07 + task_stack_size | |
stack_09 equ stack_08 + task_stack_size | |
stack_10 equ stack_09 + task_stack_size | |
stack_11 equ stack_10 + task_stack_size | |
stack_12 equ stack_11 + task_stack_size | |
stack_13 equ stack_12 + task_stack_size | |
stack_14 equ stack_13 + task_stack_size | |
stack_15 equ stack_14 + task_stack_size | |
stacks_end equ stack_15 + task_stack_size | |
; array of task sp: context[i] = task's stack pointer | |
context equ stacks_end | |
context_end equ context + 2 * n_tasks | |
context_ptr: equ context_end | |
bss_end equ context_ptr + 2 | |
; buffers for unpacking the streams, must be aligned to 256 byte boundary | |
buffer00 equ 0xff00 & bss_end + 256 | |
buffer01 equ 0xff00 & bss_end + 256 * 2 | |
buffer02 equ 0xff00 & bss_end + 256 * 3 | |
buffer03 equ 0xff00 & bss_end + 256 * 4 | |
buffer04 equ 0xff00 & bss_end + 256 * 5 | |
buffer05 equ 0xff00 & bss_end + 256 * 6 | |
buffer06 equ 0xff00 & bss_end + 256 * 7 | |
buffer07 equ 0xff00 & bss_end + 256 * 8 | |
buffer08 equ 0xff00 & bss_end + 256 * 9 | |
buffer09 equ 0xff00 & bss_end + 256 * 10 | |
buffer10 equ 0xff00 & bss_end + 256 * 11 | |
buffer11 equ 0xff00 & bss_end + 256 * 12 | |
buffer12 equ 0xff00 & bss_end + 256 * 13 | |
buffer13 equ 0xff00 & bss_end + 256 * 14 | |
.end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; Song title: EA at feb 2018 (YM+ABC) | |
; | |
; compressed into 14 parallel streams from YM6 file saved by register | |
; | |
; This example is decompressing and playing 14 parallel streams. | |
; Only one task is executed each frame. 16 bytes are decoded at a time. | |
; | |
; frame time: 5-20 lines | |
; | |
; Compressed data size 2310 bytes (uncompressed 61586) | |
; | |
; code by svofski 2022 | |
; | |
; | |
; DZX0: | |
; ----------------------------------------------------------------------------- | |
; ZX0 8080 decoder by Ivan Gorodetsky - OLD FILE FORMAT v1 | |
; Based on ZX0 z80 decoder by Einar Saukas | |
; v1 (2021-02-15) - 103 bytes forward / 100 bytes backward | |
; v2 (2021-02-17) - 101 bytes forward / 100 bytes backward | |
; v3 (2021-02-22) - 99 bytes forward / 98 bytes backward | |
; v4 (2021-02-23) - 98 bytes forward / 97 bytes backward | |
; v5 (2021-08-16) - 94 bytes forward and backward (slightly faster) | |
; v6 (2021-08-17) - 92 bytes forward / 94 bytes backward (forward version slightly faster) | |
; v7 (2022-04-30) - 92 bytes forward / 94 bytes backward (source address now in DE, slightly faster) | |
; ----------------------------------------------------------------------------- | |
; Parameters (forward): | |
; DE: source address (compressed data) | |
; BC: destination address (decompressing) | |
; | |
; Parameters (backward): | |
; DE: last source address (compressed data) | |
; BC: last destination address (decompressing) | |
; ----------------------------------------------------------------------------- | |
; compress forward with <-c> option (<-classic> for salvador) | |
; | |
; compress backward with <-b -c> options (<-b -classic> for salvador) | |
; | |
; ----------------------------------------------------------------------------- | |
.project gigachad16.rom | |
.org $100 | |
; total number of scheduler tasks | |
n_tasks equ 14 | |
; task stack size | |
task_stack_size equ 22 | |
xra a | |
out $10 | |
mvi a, $c9 | |
sta $38 | |
brutal_restart: | |
lxi sp, $100 | |
create_tasks: | |
lxi d, song_00 | |
lxi b, buffer00 | |
lxi h, stack_00 + task_stack_size | |
mvi a, 0 | |
call dzx0_create | |
lxi d, song_01 | |
lxi b, buffer01 | |
lxi h, stack_01 + task_stack_size | |
mvi a, 1 | |
call dzx0_create | |
lxi d, song_02 | |
lxi b, buffer02 | |
lxi h, stack_02 + task_stack_size | |
mvi a, 2 | |
call dzx0_create | |
lxi d, song_03 | |
lxi b, buffer03 | |
lxi h, stack_03 + task_stack_size | |
mvi a, 3 | |
call dzx0_create | |
lxi d, song_04 | |
lxi b, buffer04 | |
lxi h, stack_04 + task_stack_size | |
mvi a, 4 | |
call dzx0_create | |
lxi d, song_05 | |
lxi b, buffer05 | |
lxi h, stack_05 + task_stack_size | |
mvi a, 5 | |
call dzx0_create | |
lxi d, song_06 | |
lxi b, buffer06 | |
lxi h, stack_06 + task_stack_size | |
mvi a, 6 | |
call dzx0_create | |
lxi d, song_07 | |
lxi b, buffer07 | |
lxi h, stack_07 + task_stack_size | |
mvi a, 7 | |
call dzx0_create | |
lxi d, song_08 | |
lxi b, buffer08 | |
lxi h, stack_08 + task_stack_size | |
mvi a, 8 | |
call dzx0_create | |
lxi d, song_09 | |
lxi b, buffer09 | |
lxi h, stack_09 + task_stack_size | |
mvi a, 9 | |
call dzx0_create | |
lxi d, song_10 | |
lxi b, buffer10 | |
lxi h, stack_10 + task_stack_size | |
mvi a, 10 | |
call dzx0_create | |
lxi d, song_11 | |
lxi b, buffer11 | |
lxi h, stack_11 + task_stack_size | |
mvi a, 11 | |
call dzx0_create | |
lxi d, song_12 | |
lxi b, buffer12 | |
lxi h, stack_12 + task_stack_size | |
mvi a, 12 | |
call dzx0_create | |
lxi d, song_13 | |
lxi b, buffer13 | |
lxi h, stack_13 + task_stack_size | |
mvi a, 13 | |
call dzx0_create | |
call scheduler_init | |
mvi a, -16 | |
sta ay_nline | |
mvi a, -1 | |
sta nfrm | |
frame: | |
ei | |
hlt | |
lxi h, nfrm | |
mov a, m | |
inr a | |
ani $f | |
mov m, a | |
cpi 14 | |
jp sched_skip | |
call scheduler_tick | |
sched_skip: | |
lxi h, ay_nline | |
inr m | |
call ay_send | |
jmp frame | |
; current line in decode buffer | |
; regs would be r0 = buffer00[ay_nline], r1 = buffer00[ay_nline + 256], etc | |
ay_nline db 0 | |
nfrm db 0 | |
; | |
; AY-3-8910 register buffer | |
; | |
ayctrl equ $15 | |
aydata equ $14 | |
; send from buffers to AY regs | |
; m = line number | |
; reg13 (envelope shape) is special: $ff means no change / don't write | |
ay_send | |
mvi e, 13 | |
;lxi b, ay_line+13 | |
mov c, m | |
mvi b, (buffer00 >> 8) + 13 ; last column | |
ldax b | |
cpi $ff | |
jz ay_send_L2 ; no touchy fishy | |
ay_send_L1 | |
mov a, e | |
out ayctrl | |
ldax b | |
out aydata | |
ay_send_L2 | |
dcr b ; prev column | |
dcr e | |
jp ay_send_L1 | |
ret | |
scheduler_init: | |
lxi h, context | |
shld context_ptr | |
ret | |
; | |
; call all tasks in order | |
; | |
scheduler_tick: | |
lxi h, 0 | |
dad sp | |
shld sched_sp | |
lhld context_ptr | |
mov e, m \ inx h \ mov d, m ; de = &context[n] | |
xchg | |
sphl | |
; restore task context and return into it | |
pop h | |
pop d | |
pop b | |
pop psw | |
ret | |
sched_yield: | |
lxi h, 0 | |
dad sp | |
xchg ; de = task context | |
lhld context_ptr ; hl = context[n] | |
mov m, e \ inx h \ mov m, d \ inx h | |
mvi a, context_end >> 8 | |
cmp h | |
jnz sched_ret | |
mvi a, context_end & 255 | |
cmp l | |
jnz sched_ret | |
lxi h, context | |
sched_ret | |
shld context_ptr | |
sched_sp equ $+1 | |
lxi sp, 0 | |
ret | |
; dzx0 task calls this to yield after producing each octet | |
dzx0_yield: push psw | |
push b | |
push d | |
push h | |
jmp sched_yield | |
; | |
; create a dzx0 task | |
; | |
; a = task number (0..n_tasks-1) | |
; hl = task stack end | |
; bc = dst buffer | |
; de = stream source | |
dzx0_create: | |
shld crea_loadsp | |
lxi h, crea_b+1 | |
mov m, c \ inx h \ mov m, b \ inx h \ inx h | |
mov m, e \ inx h \ mov m, d | |
lxi h, 0 | |
dad sp | |
shld dzx0_create_sp | |
lxi d, context ; context[0] | |
mov l, a | |
mvi h, 0 | |
dad h | |
dad d ; hl = &context[a] | |
shld crea_ctx+1 ; will save task sp here | |
crea_loadsp equ $+1 | |
lxi sp, 0 | |
crea_b: lxi b, 0 | |
crea_d: lxi d, 0 | |
; create task entry point within its context | |
lxi h, dzx0 | |
push h | |
push psw | |
push b | |
push d | |
push h | |
lxi h, 0 | |
dad sp | |
crea_ctx: shld 0 ; save sp in task context | |
dzx0_create_sp equ $+1 | |
lxi sp, 0 | |
ret ; this is a normal return | |
dzx0: | |
lxi h,0FFFFh ; tos=-1 offset? | |
push h | |
inx h | |
mvi a,080h | |
dzx0_literals: ; Literal (copy next N bytes from compressed file) | |
call dzx0_elias ; hl = read_interlaced_elias_gamma(FALSE) | |
; call dzx0_ldir ; for (i = 0; i < length; i++) write_byte(read_byte() | |
push psw | |
dzx0_ldir1: | |
ldax d | |
stax b | |
inx d | |
inr c ; stay within circular buffer | |
; yield every 16 bytes | |
mvi a, 15 | |
ana c | |
cz dzx0_yield | |
;call dzx0_yield | |
dcx h | |
mov a,h | |
ora l | |
jnz dzx0_ldir1 | |
pop psw | |
add a | |
jc dzx0_new_offset ; if (read_bit()) goto COPY_FROM_NEW_OFFSET | |
; COPY_FROM_LAST_OFFSET | |
call dzx0_elias ; hl = read_interlaced_elias_gamma(FALSE) | |
dzx0_copy: | |
xchg ; hl = src, de = length | |
xthl ; ex (sp), hl: | |
; tos = src | |
; hl = -1 | |
push h ; push -1 | |
dad b ; h = -1 + dst | |
mov h, b ; stay in the buffer! | |
xchg ; de = dst + offset, hl = length | |
; call dzx0_ldir ; for (i = 0; i < length; i++) write_byte(dst[-offset+i]) | |
push psw | |
dzx0_ldir_from_buf: | |
ldax d | |
stax b | |
inr e | |
inr c ; stay within circular buffer | |
; yield every 16 bytes | |
mvi a, 15 | |
ana c | |
cz dzx0_yield | |
dcx h | |
mov a,h | |
ora l | |
jnz dzx0_ldir_from_buf | |
mvi h,0 | |
pop psw | |
add a | |
; de = de + length | |
; hl = 0 | |
; a, carry = a + a | |
xchg ; de = 0, hl = de + length .. discard dst | |
pop h ; hl = old offset | |
xthl ; offset = hl, hl = src | |
xchg ; de = src, hl = 0? | |
jnc dzx0_literals ; if (!read_bit()) goto COPY_LITERALS | |
; COPY_FROM_NEW_OFFSET | |
; Copy from new offset (repeat N bytes from new offset) | |
dzx0_new_offset: | |
call dzx0_elias ; hl = read_interlaced_elias_gamma() | |
mov h,a ; h = a | |
pop psw ; drop offset from stack | |
xra a ; a = 0 | |
sub l ; l == 0? | |
;rz ; return | |
jz dzx0_ded | |
push h ; offset = new offset | |
; last_offset = last_offset*128-(read_byte()>>1); | |
rar\ mov h,a ; h = hi(last_offset*128) | |
ldax d ; read_byte() | |
rar\ mov l,a ; l = read_byte()>>1 | |
inx d ; src++ | |
xthl ; offset = hl, hl = old offset | |
mov a,h ; | |
lxi h,1 ; | |
cnc dzx0_elias_backtrack; | |
inx h | |
jmp dzx0_copy | |
dzx0_elias: | |
inr l | |
dzx0_elias_loop: | |
add a | |
jnz dzx0_elias_skip | |
ldax d | |
inx d | |
ral | |
dzx0_elias_skip: | |
rc | |
dzx0_elias_backtrack: | |
dad h | |
add a | |
jnc dzx0_elias_loop | |
jmp dzx0_elias | |
dzx0_ldir: | |
push psw | |
mov a, b | |
cmp d | |
jz dzx0_ldir_from_buf | |
; reached the end, just restart the scheduler | |
dzx0_ded jmp brutal_restart | |
;call dzx0_yield | |
;jmp dzx0_ded | |
; | |
; | |
; SONG DATA | |
; | |
; see ym6break.py | |
; | |
; recipe: | |
; 1. extract each register as separate stream | |
; 2. salvador -classic -w 256 register_stream | |
; 3. make db strings etc | |
; Special for Vortex Tracker 2.5 | |
; EA at feb 2018 (YM+ABC) | |
; Created by Sergey Bulba's AY-3-8910/12 Emulator v2.9 | |
song_00: db $79,$8e,$1c,$ef,$fa,$54,$26,$b2,$65,$1c,$15,$19,$85,$9f,$3e,$fc,$47,$2e,$02,$fa,$55,$09,$85,$b2,$65,$1c,$46,$61,$9f,$3e,$fc,$51,$9b,$0e,$9c,$6f,$21,$50,$79,$d0,$04,$79,$fb,$a6,$32,$e5,$9c,$65,$1c,$b2,$01,$e0,$d0,$47,$9a,$fb,$1f,$be,$7c,$60,$3e,$fc,$9f,$1e,$d0,$05,$73,$20,$02,$a8,$1c,$8e,$43,$81,$a0,$47,$9a,$fb,$32,$e5,$9c,$60,$65,$1c,$b2,$1e,$d7,$b8,$9c,$d0,$5e,$a0,$51,$e6,$fb,$1f,$be,$7c,$98,$3e,$fc,$9f,$07,$ae,$d7,$7c,$d0,$17,$95,$a0,$72,$20,$68,$0e,$5a,$0e,$07,$85,$d0,$e0,$a0,$51,$e6,$fb,$32,$e5,$9c,$89,$65,$1c,$a5,$b2,$fc,$e9,$f4,$ae,$9c,$d0,$17,$94,$a0,$79,$fb,$a2,$1f,$be,$7c,$3e,$fc,$69,$9f,$7f,$e9,$f4,$2b,$7c,$85,$d0,$e5,$a0,$5c,$95,$20,$78,$a0,$14,$79,$fb,$a2,$32,$e5,$9c,$65,$1c,$69,$b2,$7f,$e9,$f4,$2b,$9c,$85,$d0,$e5,$a0,$1e,$fb,$68,$1f,$be,$7c,$9a,$3e,$fc,$9f,$5f,$e9,$ca,$f4,$7c,$e1,$d0,$79,$a0,$57,$25,$20,$5e,$a0,$05,$1e,$fb,$68,$32,$e5,$9c,$9a,$65,$1c,$b2,$5f,$e9,$ca,$f4,$9c,$e1,$d0,$79,$a0,$47,$9a,$fb,$1f,$be,$7c,$26,$3e,$fc,$97,$9f,$f2,$e9,$f4,$b8,$7c,$d0,$5e,$a0,$55,$c9,$20,$57,$81,$a0,$47,$9a,$fb,$32,$e5,$9c,$26,$65,$1c,$97,$b2,$f2,$e9,$f4,$b8,$9c,$d0,$5e,$a0,$51,$e6,$fb,$1f,$be,$7c,$89,$3e,$fc,$a5,$9f,$fc,$e9,$f4,$ae,$7c,$d0,$17,$95,$a0,$72,$20,$55,$e0,$a0,$51,$e6,$fb,$32,$e5,$9c,$89,$65,$1c,$a5,$b2,$fc,$e9,$f4,$ae,$9c,$d0,$17,$94,$a0,$79,$fb,$a2,$1f,$be,$7c,$3e,$fc,$69,$9f,$7f,$e9,$f4,$2b,$7c,$85,$d0,$e5,$a0,$5c,$95,$20,$78,$a0,$14,$79,$fb,$a2,$32,$e5,$9c,$65,$1c,$69,$b2,$7f,$e9,$f4,$2b,$9c,$85,$d0,$e5,$a0,$1e,$fb,$68,$1f,$be,$7c,$9a,$3e,$fc,$9f,$5f,$e9,$ca,$f4,$7c,$e1,$d0,$79,$a0,$57,$00,$00,$80 | |
song_01: db $79,$00,$01,$00,$fa,$55,$28,$01,$55,$68,$00,$05,$56,$85,$01,$47,$25,$80,$56,$0f,$02,$03,$04,$05,$d0,$00,$0f,$ed,$80,$fa,$e0,$d0,$57,$34,$50,$57,$f9,$0f,$ff,$a0,$10,$3e,$03,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$20,$57,$d4,$a0,$43,$e0,$c3,$fa,$3f,$a0,$85,$d0,$e5,$a0,$5c,$95,$20,$7d,$a0,$44,$3e,$c3,$fa,$03,$f8,$a0,$d0,$5e,$a0,$55,$c9,$80,$55,$c0,$00,$20 | |
song_02: db $85,$00,$55,$6b,$ef,$a2,$fc,$ec,$e9,$9b,$ef,$f2,$f5,$9b,$f0,$1c,$e2,$ff,$fd,$19,$16,$9b,$1c,$1f,$22,$9e,$f0,$b8,$54,$f0,$7c,$e5,$40,$57,$81,$64,$be,$65,$ff,$fd,$29,$62,$5f,$b9,$65,$68,$6b,$f0,$e5,$b8,$4f,$7c,$0b,$fc,$e2,$ff,$fd,$f9,$f6,$9b,$fc,$ff,$02,$9b,$f0,$3e,$e2,$ff,$fd,$3b,$38,$9b,$3e,$41,$44,$9e,$f0,$b8,$54,$f0,$7c,$c8,$08,$17,$95,$b8,$3c,$7c,$39,$40,$55,$e0,$64,$6f,$65,$ff,$8a,$fd,$62,$5f,$6e,$65,$68,$6b,$f0,$79,$b8,$53,$c2,$7c,$f8,$fc,$ff,$fd,$a6,$f9,$f6,$fc,$ff,$02,$e6,$f0,$f8,$3e,$ff,$fd,$a6,$3b,$38,$3e,$41,$44,$e7,$f0,$95,$b8,$3c,$7c,$32,$08,$05,$e5,$b8,$4f,$7c,$0e,$40,$55,$78,$64,$1b,$65,$e2,$ff,$fd,$62,$5f,$9b,$65,$68,$6b,$9e,$f0,$b8,$54,$f0,$7c,$be,$fc,$ff,$fd,$29,$f9,$f6,$b9,$fc,$ff,$02,$f0,$be,$3e,$ff,$fd,$29,$3b,$38,$b9,$3e,$41,$44,$f0,$e5,$b8,$4f,$7c,$0c,$96,$50,$fb,$bd,$fe,$ba,$25,$ec,$e7,$dc,$95,$b8,$79,$7c,$79,$40,$55,$e0,$28,$6f,$65,$ff,$8a,$fd,$62,$5f,$6e,$65,$68,$6b,$dc,$79,$b8,$57,$96,$7c,$f8,$fc,$fe,$08,$f9,$f6,$f9,$fc,$ff,$02,$ff,$d6,$22,$d3,$3e,$e8,$fc,$a6,$3b,$38,$3e,$41,$44,$e7,$dc,$95,$b8,$79,$7c,$79,$f0,$6e,$1c,$fe,$25,$86,$1a,$18,$1a,$1c,$1e,$20,$bd,$86,$d6,$86,$ef,$15,$f2,$ed,$eb,$ed,$ef,$f1,$f3,$ef,$eb,$e7,$e3,$df,$db,$d5,$cf,$cd,$cb,$c9,$c7,$c1,$bd,$bb,$b9,$bb,$b8,$5f,$d4,$d2,$d4,$d6,$d8,$da,$d8,$f0,$f0,$a0,$e7,$70,$e7,$b0,$bf,$c1,$bf,$93,$f0,$97,$94,$9f,$40,$4c,$0f,$9c,$79,$f0,$43,$21,$80,$08,$07,$ea,$e5,$e0,$db,$d6,$cf,$c8,$c5,$c2,$bf,$bc,$b5,$b2,$b0,$ae,$b0,$b2,$20,$bc,$79,$a0,$73,$44,$5f,$f0,$72,$38,$07,$d3,$ac,$d6,$9c,$55,$fc,$da,$e4,$ee,$f8,$02,$08,$0e,$14,$1a,$24,$2e,$38,$42,$48,$4e,$54,$5a,$64,$6e,$78,$82,$88,$8e,$94,$9a,$a4,$ae,$b8,$c2,$c8,$ce,$c0,$84,$80,$24,$33,$eb,$e7,$e3,$df,$db,$d5,$cf,$cd,$cb,$c9,$c7,$c1,$94,$e0,$10,$7c,$a0,$33,$44,$5f,$f0,$79,$94,$79,$a0,$f0,$4c,$f7,$9c,$94,$f0,$32,$80,$10,$80,$72,$ea,$e5,$e0,$db,$d6,$cf,$c8,$c5,$c2,$bf,$bc,$b5,$b2,$b0,$ae,$b0,$b2,$bc,$07,$97,$a0,$35,$44,$f7,$f0,$20,$38,$7d,$ac,$3d,$9c,$64,$4c,$da,$e4,$ee,$f8,$02,$08,$0e,$14,$1a,$24,$2e,$38,$42,$48,$4e,$54,$5a,$64,$6e,$78,$82,$88,$8e,$1c,$8e,$5e,$e1,$9b,$f4,$27,$bd,$5e,$3f,$2a,$83,$5e,$22,$6b,$47,$a2,$6b,$77,$4f,$f9,$f9,$ac,$92,$fc,$7e,$54,$fc,$fc,$7e,$43,$81,$d0,$e4,$a0,$f0,$40,$02,$0f,$65,$b2,$77,$65,$f8,$18,$25,$df,$ef,$9f,$df,$39,$b8,$e7,$ac,$f9,$58,$f8,$17,$fc,$10,$f8,$78,$7c,$1c,$98,$74,$ff,$3e,$9f,$fb,$f9,$a0,$e4,$f8,$5e,$74,$78,$f4,$18,$3e,$bd,$5e,$3f,$bd,$f9,$4c,$72,$20,$5e,$40,$7c,$94,$7d,$d0,$79,$a0,$79,$40,$55,$83,$65,$b2,$77,$65,$c6,$f8,$09,$df,$ef,$9f,$df,$4e,$b8,$79,$ac,$fe,$58,$f8,$45,$ff,$10,$f8,$1e,$7c,$07,$26,$74,$3f,$3e,$9f,$fb,$f9,$f9,$a0,$f8,$17,$3a,$6f,$fc,$29,$ec,$e9,$af,$ef,$f2,$f5,$bd,$fe,$be,$ba,$5f,$fc,$8a,$19,$16,$6e,$1c,$1f,$22,$dc,$79,$b8,$57,$97,$7c,$95,$40,$5e,$28,$06,$f8,$65,$ff,$fd,$a6,$62,$5f,$65,$68,$6b,$e7,$04,$95,$b8,$79,$7c,$6f,$fc,$fe,$80,$82,$f9,$f6,$f9,$fc,$ff,$02,$ff,$d6,$2e,$d3,$3e,$fc,$8a,$3b,$38,$6e,$3e,$41,$44,$dc,$79,$b8,$57,$97,$c4,$00,$00,$80 | |
song_03: db $90,$00,$40,$68,$01,$07,$91,$b8,$7d,$7c,$79,$40,$10,$f0,$fe,$43,$d7,$10,$de,$ea,$b8,$00,$72,$08,$05,$f4,$b8,$4f,$40,$00,$7c,$fe,$10,$f5,$10,$f7,$ea,$80,$b8,$1c,$81,$08,$7d,$b8,$13,$c0,$40,$1f,$fe,$04,$3d,$10,$7d,$ea,$e0,$b8,$07,$35,$08,$7d,$c4,$79,$b8,$53,$c5,$40,$0e,$ac,$07,$80,$dc,$1c,$91,$80,$a4,$01,$1e,$b8,$55,$b8,$01,$fe,$12,$85,$00,$05,$c9,$80,$00,$2e,$01,$fe,$41,$a1,$00,$41,$72,$80,$40,$0c,$dc,$be,$c7,$ae,$bd,$f8,$f4,$32,$82,$17,$97,$d0,$81,$a0,$f0,$b8,$3c,$40,$11,$f7,$f8,$d7,$dc,$91,$04,$e4,$f8,$5c,$95,$b0,$f7,$14,$35,$08,$e5,$fe,$5c,$94,$bc,$e5,$ac,$79,$94,$5e,$b8,$57,$c1,$40,$4f,$f8,$7d,$dc,$79,$04,$1e,$f8,$45,$c9,$b0,$5f,$14,$73,$08,$5e,$fe,$00,$68,$01,$5f,$b8,$01,$f5,$c4,$e5,$40,$57,$81,$ac,$e0,$dc,$07,$24,$80,$69,$01,$07,$95,$b8,$3c,$c4,$30,$00,$08 | |
song_04: db $79,$1c,$ef,$bd,$fa,$54,$26,$65,$1c,$ef,$15,$19,$85,$3e,$fc,$d6,$47,$2e,$02,$fa,$55,$09,$85,$65,$1c,$ef,$46,$61,$3e,$fc,$d6,$51,$cb,$02,$95,$fa,$42,$61,$65,$1c,$ef,$51,$98,$3e,$fc,$d6,$54,$72,$02,$e5,$fa,$50,$98,$65,$1c,$ef,$54,$66,$3e,$fc,$d6,$15,$1c,$96,$68,$e4,$70,$fe,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$95,$20,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$95,$20,$e4,$d0,$15,$be,$65,$e1,$fa,$0b,$94,$93,$fe,$81,$d0,$59,$e0,$3e,$fc,$d6,$fa,$b9,$f8,$fe,$38,$d0,$15,$c9,$20,$5e,$d0,$41,$5b,$65,$e0,$e1,$fa,$b9,$94,$fe,$38,$d0,$15,$9e,$3e,$fc,$d6,$fa,$0b,$f8,$93,$fe,$81,$d0,$5c,$00,$02 | |
song_05: db $2e,$01,$00,$fa,$55,$1a,$01,$15,$5a,$00,$01,$55,$a1,$01,$51,$cc,$80,$00,$83,$02,$02,$03,$05,$95,$d0,$42,$8a,$03,$01,$3d,$fa,$78,$d0,$15,$e5,$10,$78,$d0,$04,$1a,$03,$28,$01,$f5,$fa,$e0,$d0,$57,$31,$50,$42,$e4,$04,$fe,$e4,$d0,$40,$a2,$03,$8e,$01,$fa,$2e,$05,$fe,$4e,$d0,$05,$79,$10,$5e,$d0,$01,$02,$8a,$03,$01,$38,$fa,$b9,$05,$fe,$38,$d0,$15,$e5,$10,$78,$d0,$04,$0a,$03,$28,$01,$e2,$fa,$e4,$05,$fe,$e0,$d0,$57,$95,$10,$e0,$d0,$10,$28,$03,$a3,$01,$8b,$fa,$05,$93,$fe,$81,$d0,$5e,$10,$57,$80,$d0,$40,$a2,$03,$8e,$01,$fa,$2e,$05,$fe,$4e,$d0,$05,$79,$10,$5e,$d0,$01,$02,$8a,$03,$01,$38,$fa,$b9,$05,$fe,$38,$d0,$15,$c9,$80,$55,$c0,$00,$20 | |
song_06: db $81,$00,$04,$56,$08,$10,$08,$06,$04,$0e,$a0,$50,$56,$f8,$01,$ff,$f4,$27,$12,$0a,$08,$ae,$aa,$02,$ff,$8a,$00,$03,$38,$f4,$3b,$82,$9e,$f4,$d0,$5e,$a0,$5e,$70,$5e,$40,$04,$40,$4c,$00,$02 | |
song_07: db $85,$28,$55,$68,$38,$55,$56,$f0,$30,$d0,$11,$22,$30,$30,$17,$b8,$fe,$d0,$79,$a0,$15,$5f,$df,$ea,$fe,$34,$9f,$3c,$f7,$ff,$f4,$a0,$85,$d0,$e0,$a0,$50,$55,$c0,$00,$20 | |
song_08: db $49,$0e,$0d,$0c,$0b,$0a,$09,$38,$e8,$1f,$c4,$41,$f7,$d0,$90,$40,$55,$6e,$0f,$e6,$bc,$0a,$fe,$fa,$e8,$0b,$17,$81,$dc,$b9,$0b,$d0,$7c,$a0,$39,$70,$5e,$40,$11,$16,$3b,$0d,$0d,$ec,$84,$40,$f9,$d1,$40,$3d,$d0,$79,$70,$5e,$40,$11,$42,$85,$0d,$b8,$0d,$d0,$15,$14,$30,$00,$08 | |
song_09: db $85,$00,$55,$61,$91,$0f,$0e,$0d,$0c,$0b,$f5,$dc,$1f,$e8,$5e,$40,$01,$14,$21,$f1,$0a,$0a,$09,$08,$08,$dc,$1e,$40,$14,$17,$d6,$f8,$fb,$0f,$cf,$cc,$97,$e8,$df,$f4,$d0,$5e,$94,$07,$d1,$70,$e4,$28,$1b,$0b,$85,$fe,$32,$80,$45,$5b,$0a,$81,$fe,$32,$80,$01,$0f,$fe,$44,$c8,$80,$51,$6e,$0a,$fe,$52,$fa,$0f,$98,$0a,$e6,$e9,$09,$08,$07,$01,$e7,$c4,$c3,$b8,$95,$e8,$7c,$40,$10,$f9,$46,$7e,$06,$05,$04,$03,$02,$01,$00,$ff,$dc,$07,$d1,$a0,$f5,$e0,$f9,$ff,$60,$79,$40,$55,$cd,$08,$1e,$f4,$7d,$b8,$7d,$e8,$57,$d5,$40,$73,$20,$47,$81,$dc,$f4,$a0,$7d,$e0,$7e,$7b,$60,$5f,$40,$04,$3d,$fe,$fb,$7c,$08,$80,$dc,$1e,$e8,$5e,$40,$05,$57,$00,$00,$80 | |
song_10: db $49,$0e,$0d,$0c,$0b,$0a,$09,$38,$e8,$1f,$c4,$41,$f7,$d0,$90,$40,$55,$6e,$0f,$e6,$bc,$0a,$fe,$fa,$e8,$0b,$17,$81,$dc,$b9,$0b,$d0,$7c,$a0,$39,$70,$5e,$40,$44,$45,$b9,$1f,$fe,$39,$70,$38,$d0,$43,$95,$70,$e0,$40,$41,$55,$c0,$00,$20 | |
song_11: db $90,$00,$01,$16,$85,$47,$55,$a1,$59,$55,$a1,$50,$55,$a1,$47,$05,$a1,$00,$68,$47,$55,$68,$59,$41,$68,$00,$5a,$50,$15,$5a,$47,$10,$5a,$00,$16,$85,$47,$56,$84,$59,$16,$85,$00,$a1,$50,$55,$a1,$47,$55,$68,$59,$55,$68,$50,$55,$68,$47,$55,$5a,$59,$15,$5a,$50,$15,$5a,$47,$15,$56,$85,$59,$56,$84,$50,$17,$00,$00,$80 | |
song_12: db $94,$00,$55,$55,$c0,$00,$20 | |
song_13: db $90,$ff,$01,$16,$f4,$08,$d0,$41,$2c,$01,$95,$80,$55,$38,$d0,$01,$55,$c0,$00,$20 | |
; | |
; runtime data (careful with relative equ directives) | |
; | |
; task stacks | |
stacks | |
stack_00 equ stacks | |
stack_01 equ stack_00 + task_stack_size | |
stack_02 equ stack_01 + task_stack_size | |
stack_03 equ stack_02 + task_stack_size | |
stack_04 equ stack_03 + task_stack_size | |
stack_05 equ stack_04 + task_stack_size | |
stack_06 equ stack_05 + task_stack_size | |
stack_07 equ stack_06 + task_stack_size | |
stack_08 equ stack_07 + task_stack_size | |
stack_09 equ stack_08 + task_stack_size | |
stack_10 equ stack_09 + task_stack_size | |
stack_11 equ stack_10 + task_stack_size | |
stack_12 equ stack_11 + task_stack_size | |
stack_13 equ stack_12 + task_stack_size | |
stack_14 equ stack_13 + task_stack_size | |
stack_15 equ stack_14 + task_stack_size | |
stacks_end equ stack_15 + task_stack_size | |
; array of task sp: context[i] = task's stack pointer | |
context equ stacks_end | |
context_end equ context + 2 * n_tasks | |
context_ptr: equ context_end | |
bss_end equ context_ptr + 2 | |
; buffers for unpacking the streams, must be aligned to 256 byte boundary | |
buffer00 equ 0xff00 & bss_end + 256 | |
buffer01 equ 0xff00 & bss_end + 256 * 2 | |
buffer02 equ 0xff00 & bss_end + 256 * 3 | |
buffer03 equ 0xff00 & bss_end + 256 * 4 | |
buffer04 equ 0xff00 & bss_end + 256 * 5 | |
buffer05 equ 0xff00 & bss_end + 256 * 6 | |
buffer06 equ 0xff00 & bss_end + 256 * 7 | |
buffer07 equ 0xff00 & bss_end + 256 * 8 | |
buffer08 equ 0xff00 & bss_end + 256 * 9 | |
buffer09 equ 0xff00 & bss_end + 256 * 10 | |
buffer10 equ 0xff00 & bss_end + 256 * 11 | |
buffer11 equ 0xff00 & bss_end + 256 * 12 | |
buffer12 equ 0xff00 & bss_end + 256 * 13 | |
buffer13 equ 0xff00 & bss_end + 256 * 14 | |
.end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import struct | |
import sys | |
import os | |
from subprocess import Popen, PIPE | |
def drop_comment(f): | |
comment = '' | |
while True: | |
b = f.read(1) | |
if b[0] == 0: | |
break | |
comment = comment + chr(b[0]) | |
print(chr(b[0]), end='') | |
print() | |
return comment | |
def readym(filename): | |
with open(filename, "rb") as f: | |
hdr = f.read(12) # YM6!LeOnArD! # 12 | |
nframes = struct.unpack(">I", f.read(4))[0] # 16 | |
print("YM6 file has ", nframes, " frames") | |
attrib = struct.unpack(">I", f.read(4)) # 20 | |
digidrums = struct.unpack(">h", f.read(2)) # 22 | |
masterclock = struct.unpack(">I", f.read(4)) # 26 | |
framehz = struct.unpack(">h", f.read(2)) # 28 | |
loopfrm = struct.unpack(">I", f.read(4)) # 32 | |
f.read(2) # additional data # 34 | |
print("Masterclock: ", masterclock, "Hz") | |
print("Frame: ", framehz, "Hz") | |
# skip digidrums but we don't do that here.. | |
comment1 = drop_comment(f) | |
comment2 = drop_comment(f) | |
comment3 = drop_comment(f) | |
regs=[] | |
for i in range(16): | |
regs.append(f.read(nframes)) | |
return [regs, comment1, comment2, comment3] | |
try: | |
ymfile = sys.argv[1] | |
except: | |
sys.stderr.write(f'usage: {sys.argv[0]} unpacked-interleaved.ym label_prefix\n') | |
exit(1) | |
(origname, ext) = os.path.splitext(ymfile) | |
incname = origname + ".inc" | |
try: | |
label = sys.argv[2] | |
except: | |
label = origname.replace('-', '_') | |
workdir = 'tmp/' | |
try: | |
os.mkdir(workdir) | |
except: | |
pass | |
try: | |
[columns, comment1, comment2, comment3] = readym(ymfile) | |
except: | |
sys.stderr.write(f'error reading f{ymfile}\n') | |
exit(1) | |
with open(incname, "w") as inc: | |
inc.write(f'; {comment1}\n; {comment2}\n; {comment3}\n') | |
for i, c in enumerate(columns[0:14]): | |
cname = workdir + origname + ("%02d" % i) + ".bin" | |
zname = workdir + origname + ("%02d" % i) + ".z" | |
with open(cname, "wb") as f: | |
f.write(c) | |
with Popen(["./salvador.exe", "-v", "-classic", "-w 256", cname, zname], stdout=PIPE) as proc: | |
print(proc.stdout.read()) | |
with open(zname, "rb") as f: | |
dbname = label + ("%02d" % i) | |
data = f.read() | |
inc.write(f'{dbname}: db ' + ",".join("$%02x" % x for x in data) + "\n") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment