
|
MoonBlaster music cruncher Onbekend, 00-00-00
;---- MoonBlaster music cruncher ----
;em1pag = constante, banknr waar gecrunchte song in moet komen
;sngpag = constante, banknr waar ongecrunchte song in staat.
sngcrc: ld hl,08000h+200 ;zet settings neer
ld de,08000h
ld bc,376
sngcrl1: call copcrbyte
inc hl
inc de
dec bc
ld a,b
or c
jr nz,sngcrl1
ld a,(08000h) ;last position
inc a
ld b,a
push bc ; verplaats pat/pos data
ld hl,08000h
sngcrl2: call copcrbyte
inc hl
inc de
djnz sngcrl2
push de
pop ix
ld a,sngpag
out (0feh),a
pop bc ; zoek hoogste gebruikte pattern
ld e,1
ld hl,08000h
sngcrl3: ld a,(hl)
cp e
jr c,sngcrl4
ld e,a
sngcrl4: inc hl
djnz sngcrl3
ld d,0
push ix
dec ix
dec ix
pop hl
add hl,de
add hl,de
ld a,sngpag
out (0feh),a
ld b,e ;aantal patterns
ex de,hl
ld hl,08240h
ld a,242
ld (numzer),a
sngcrl5: push bc
inc ix
inc ix
ld a,em1pag
out (0feh),a
push de
res 7,d
ld (ix+0),e ;pattern adres
ld (ix+1),d
pop de
ld a,sngpag
out (0feh),a
call sngcrdat ;crunchen echte songdata
pop bc
djnz sngcrl5
ld a,em1pag
out (0feh),a
xor a
ld (de),a
inc de
ex de,hl
ld de,-08000h
add hl,de
ld (lengte),hl ;lengte van uiteindelijke gecrunchte
ret ;data, is handig voor saven file
;---- crunchen echte songdata ----
sngcrdat: ld b,16 ;aantal steps per pattern
sngcrl6: push bc
ld b,13
sngcrl7: push bc ;aantal bytes per step
ld a,(hl)
or a
jr nz,sngcrl8 ;niet 0? dan aantal evt. opgespaarde
ld a,(numzer) ;nullen schrijven
inc a
ld (numzer),a
call wrtcrbyte ;schrijven aantal nullen byte
pop bc
djnz sngcrl7
jr sngcrla
sngcrl8: ld a,(numzer)
cp 242 ;nullen opgespaard?
jr z,sngcrl9
inc de ;ja, dan hier al aantal nullen byte
sngcrl9: ld a,(hl) ;schrijven niet-nulbyte
call wrtcrbyte
inc de
ld a,242
ld (numzer),a
pop bc
djnz sngcrl7
sngcrla: ld a,(numzer)
cp 242
jr z,sngcrlb
inc de
ld a,242
ld (numzer),a
sngcrlb: pop bc
djnz sngcrl6
ret
;--- copieer byte van ene bank naar andere ---
copcrbyte: ld a,sngpag
out (0feh),a
ld a,(hl)
ex af,af'
ld a,em1pag
out (0feh),a
ex af,af'
ld (de),a
ret
;---- schrijf byte in lege pagina ---
wrtcrbyte: ex af,af'
ld a,em1pag
out (0feh),a
ex af,af'
ld (de),a
ld a,sngpag
out (0feh),a
inc hl
ret
numzer: db 0
lengte: dw 0
|