;-------------------------; ;-- SM : Sound Manager --; ;-------------------------; .Z80 ASEG ORG 100h ;--------------------------- HLAVNI CYKLUS ------------------------------- PRVOL equ 0EFh ; prvni volna oblast rd ENDVOL equ 0F0h ; posledni - || - SOUNDMANAGER: GOIT: ld sp,STACK call SYSINIT di xor a out (0DCh),a out (0E0h),a out (0E1h),a ld hl,GOIT ld (1),hl ld a,0C3h ld (0),a ; pri user break skoci na me ... jp MENU EDIT_BUF: ; ::: editace bufferu :::::::::::::::: push bc ;c=start port,b=size push hl ;hl=start rd_adr. ld ix,(SPEEDBUF) ld de,100*80+8000h ld bc,640 VYPSPB: ld (ix+0),e ld (ix+1),d inc ix inc ix dec bc ld a,b or c jr nz,VYPSPB di in a,(0E0h) ld hl,8000h ld de,8001h ld bc,80*200 ld (hl),0 ldir ; clg() in a,(0E1h) ld de,EB ld c,9 call 5 in a,(0E0h) ld hl,100*80+8000h ld (MODI01+1),hl pop hl pop bc exx ;1 ld de,TRANSFTAB exx ;0 ld a,(INBDATA) or a jr nz,EDIT07 ld a,3 jp ERROR EDIT07: ld a,c add a,b ld (MODI04+1),a ; kdy mam koncit ld a,21h ; rezim XOR out (0CCh),a ld e,80 ; 640 vram byte se bude zobrazovat ld d,8 ; vram_b_counter ld ix,(SPEEDBUF) ; ukazatel do vram na minulost ex af,af' ld a,1 ; rotace ve vram ex af,af' EDIT05: EDIT30: ; ::::: prehravaci smycka ::::::::::::::::::::::::::::::: ; 0 : a,hl,bc,de ; 1 : a,hl,de exx ;1 ld l,(ix+0) ld h,(ix+1) ex af,af' ld (hl),a ; vyxoruji stareho ex af,af' exx ;0 ld b,l in b,(c) ld b,h in a,(c) ; ziskat... bajt out (0D4h),a exx ;1 rlca ; max + 128 ... ld l,e ld h,d ld c,a ld b,0 add hl,bc ld c,(hl) inc hl ld b,(hl) MODI01: ld hl,200*80+8000h add hl,bc ; mam primo offset ld (ix+0),l ld (ix+1),h ex af,af' ld (hl),a ; zaxor noveho rlca ex af,af' exx ;0 inc hl ; ramdiskove hl - JEDU fifty-fifty inc ix inc ix ld a,l or h jr nz,EDIT03 inc c ld a,c MODI04: cp ENDVOL ; kdy koncit jr nz,EDIT03 ld a,1 out (0CCh),a in a,(0E1h) pop af ; odstran bc jp MENU ; po 1 bloku koncim EDIT03: dec d jr nz,EDIT30 ;8 hodnot {1 vram byte} exx ;1 ld hl,(MODI01+1) inc hl ld (MODI01+1),hl ; dalsi byte ve vram exx ;0 ld d,8 dec e jr nz,EDIT30 ; uz jsem preskocil celou vram exx ;1 ld hl,100*80+8000h ld (MODI01+1),hl exx ;0 ld ix,(SPEEDBUF) ld e,80 ex af,af' ld a,1 ex af,af' jp EDIT30 ; cekani na editovaci prikazy atd. , budou okna ...... ZPOZD: EDIT65: ld a,9 out (0D0h),a nop in a,(0D1h) xor 0FFh jr z,EDIT65 ret MENU: ;::::::::::: MENU programu :::::::::::::::::::::::::::: di xor a out (0DCh),a call SETUP ld de,NABIDKA ld c,9 call 5 ld c,PRVOL ; *** pocatecni oblast na RD pro buffer ld hl,180h ; stejne : zatim mam samply jen na 64kB.. ld a,(BUFSIZE) ld b,a ; onisi to ohlidaji pomoci inbdata MENU2: ld a,9 out (0D0h),a nop in a,(0D1h) xor 0FFh cp 80h jp z,LOAD_MUSIC ; F1 : load buffer cp 40h jp z,PLAY_MUSIC ; F2 : play buffer cp 20h jp z,SAVE_MUSIC ; F3 : save buffer cp 10h jp z,READ_MUSIC ; F4 : read buffer cp 8 jp z,EDIT_BUF ; F5 : play buffer exklusive ld a,2 out (0D0h),a nop in a,(0D1h) bit 5,a jp z,INIT_BUF ; s x e 1..8 jr MENU2 ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: INIT_BUF: ld de,IB ld c,9 call 5 INIT01: ld c,1 call 5 cp "9" jr nc,INIT01 cp "1" jr c,INIT01 sub "0" ld (BUFSIZE),a jp MENU IB: db 26,10,13," Init buffer - enter number of 64kB blocks in buffer [1-8]" db " : $" ;::::::::::::::: READ_MUSIC: ld de,RB1 ld c,9 call 5 ld hl,FCBI+1 ld de,FCBI+2 ld bc,7 ld (hl),20h ldir ld hl,FCBI+1 REBU01: push hl ld c,1 call 5 pop hl cp 13 jr z,REBU02 cp "9"+1 jr c,REBU09 and 5Fh REBU09: ld (hl),a inc hl jr REBU01 REBU02: ld de,FCBI call CLRFCB ld de,FCBI ld c,15 call 5 inc a jr nz,REBU03 ld a,1 ; o.k. + : navrat do menu jp ERROR REBU03: ld de,(IOBUF) ld c,26 call 5 ; set DMA ld bc,8*512 ; budu tahat maximalne 512 kB ld hl,100h ld e,PRVOL ; prvni volna oblast , jinak to dostanu jako adresu RD [3b] REBU04: push bc push de push hl ld c,20 ld de,FCBI call 5 ; nacti jeden sektor pop hl pop de or a jr nz,REBU10 ld c,e ld ix,(IOBUF) ld b,128 REBU05: push bc ld a,(ix+0) inc ix ld c,e ld b,l in b,(c) ld b,h out (c),a inc hl ld a,l or h jr nz,REBU06 inc c REBU06: ld e,c pop bc djnz REBU05 pop bc dec bc ld a,b or c jr nz,REBU04 push bc REBU10: ; v bc pocet zbytku do 512kB pop bc ld hl,8*512 or a sbc hl,bc ; v hl size nacteneho ld b,9 REBU11: srl h rr l djnz REBU11 ; hl / 512 ,zatim , pak to bude i na bajty .. ld a,l ld (BUFSIZE),a ld a,1 ld (INBDATA),a jp MENU ;::::::: CLRFCB: ld hl,12 add hl,de ld e,l ld h,d inc de ld bc,36-12 ld (hl),0 ldir ret ;::::::::::::::::::: ;;;;;;;;;;;;;;;;;;;;;;;; PLAY_MUSIC: push bc push hl ld de,PM ld c,9 call 5 pop hl pop bc ld a,(INBDATA) or a jr nz,PLAY40 ld a,3 jp ERROR PLAY40: ld a,c add a,b ld (MODI05+1),a PLAY01: ; ::: bude hodne casu !!! ::: ld b,l in b,(c) ld b,h in a,(c) ; ziskat...64 urovnovou bit 0,(ix+0) bit 0,(ix+0) bit 0,(ix+0) bit 0,(ix+0) bit 0,(ix+0) ; 6 * 20 = 120 out (0D4h),a ; rovnou si to prehraju inc hl ld a,l or h jr nz,PLAY03 ; misto jr nz,PLAY03 zde jr PLAY01 pro over inc c ld a,c MODI05: xor ENDVOL jp z,MENU ; po 1 bloku koncim PLAY03: jr PLAY01 ;::::::: LOAD_MUSIC: ;::: nahraje muziku na ramdisk , pak se stahne na FD :::: push bc push hl ld de,LM ld c,9 call 5 pop hl pop bc ex af,af' ; in ld a,00010000b ; select : PA4 out (0D0h),a ; jedna xor 00010000b ex af,af' ; out jr DIGI02 DIGI01: ex af,af' ; in 4 xor 00010000b ; nula 7 out (0D0h),a ; -----_____ : GO !! : cti !! 11 xor 00010000b ; jedna na priprave.. 7 ex af,af' ; out 4 : zatim : 33 ld b,l in b,(c) ld b,h out (c),a ; ulozit... inc hl ld a,l or h jr nz,DIGI03 inc c ld a,c xor 0ECh jp z,MENU DIGI03: in a,(0F1h) ; read hi_2 33 + : 11 ld b,a ; mam 6 nizsich ; 4 in a,(0F0h) ; read lo_6 ; 11 rlca ; 4 rlca ; 4 rrc b ; 8 rra ; 4 rrc b ; 8 rra ; 4 srl a ; 8 srl a ; 8 ; nekdy by stacilo i 32 hodnot out (0D4h),a ; rovnou si to prehraju ... DIGI02: ex af,af' ; 4 out (0D0h),a ; jedna : 11 ex af,af' ; 4 jr DIGI01 ; celkem : 126 ;:::::::::::::::::::::::::::: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; :::::::::::: setup obvodu :::::::::::::: SETUP: LD A,1 OUT (0D3h),A LD A,20h OUT (0D7h),A ; zapis jen nizsich XOR A OUT (0D4h),A INNIT: sbc hl,hl INNIT1: dec hl ld a,h or l jr nz,INNIT1 ; wait na vynulovani nizsiho LD A,10h out (0D7h),a ; zapis jen vyssich slabik ld a,(ISTRNS) or a jr nz,TRNS45 ; tabulka uz je.. TRNS01: ld hl,0 ld de,TRANSFTAB ld b,65 TRNS02: push bc ld a,l ld (de),a inc de ld a,h ld (de),a inc de or a ld bc,80 sbc hl,bc pop bc djnz TRNS02 ld a,1 ld (ISTRNS),a TRNS45: ld a,(BUFSIZE) ld b,a ld de,3 ld hl,SIZES-3 SETU04: add hl,de djnz SETU04 ld de,NSIZE ld bc,3 ldir ret ISTRNS: db 0 ;;;;;;;;;;;;;;;; SAVE_MUSIC: push hl push bc ld de,SM ld c,9 call 5 ld a,(INBDATA) or a jr nz,SAVE00 ld a,3 pop bc pop hl jp ERROR SAVE00: ld de,FCBOUT call CLRFCB ld de,FCBOUT ld c,15 call 5 ; vymaz stary inc a jr z,SAVE01 ; nasel jsem toho,ktery uz na disku neni ld hl,NAMEFCB SAVE02: ld a,(hl) inc a ld (hl),a Š cp "9" jr nc,SAVE00 ; zkus to znova ld (hl)," " inc hl jr SAVE02 SAVE01: ld de,FCBOUT ld c,22 call 5 ; zaloz ho jako noveho pop bc ld (SAVE07),bc ld a,b add a,c sub PRVOL ld l,a ld h,0 ld b,9 SAVE23: sla l rl h ; pocet stranek * 512 = pocet sektoru djnz SAVE23 ; zatim jen na hranicich techto - velkych... ld c,l ld b,h pop hl ld (SAVE09),hl SAVE08: push bc ld de,(IOBUF) ld c,26 call 5 ; set DMA ld de,FCBOUT ld c,21 call 5 ; write van sektor pop bc dec bc ld a,b or c jr z,SAVE04 push bc ld hl,(SAVE09) ld ix,(SAVE05) ld bc,(SAVE07) ld e,128 SAVE06: ld b,l in b,(c) ld b,h in a,(c) ld (ix+0),a inc hl inc ix dec e jr nz,SAVE06 ld a,l or h jr nz,SAVE11 inc c ld (SAVE07),bc SAVE11: ld (SAVE09),hl pop bc jr SAVE08 SAVE09: dw 100h SAVE05: dw IOBUF SAVE07: db 0E9h,0 SAVE04: ld de,FCBOUT ld c,16 call 5 ; zavri ten soubor jp MENU ERROR: push af ld de,ERRTAB ld c,9 call 5 ld hl,ERRTAB ERRO01: xor a cpir pop af cp (hl) jr z,ERRO02 push af jr ERRO01 ERRO02: inc hl ex de,hl ld c,9 call 5 jp MENU SYSINIT: ld hl,(SPEEDBUF) ld de,640*2 add hl,de ld hl,2000h ld (SAVE05),hl ld (IOBUF),hl ret ; :::::::::::::::: data :::::::::::::::: ERRTAB: db 10,10,13," ERROR - $" db 0,1," reading or opening file",7,36 db 0,2," writing file",7,36 db 0,3," no data in buffer",7,36 INBDATA: db 1 NABIDKA: db 26,10,13,"---- Sound manager v 1.01 (c) 11/1992 Sv. Svec ----",10,13 db 10,13," F1 : load music to buffer" db 10,13," F2 : play music from buffer" db 10,13," F3 : save music in buffer to current drive as 'SAMPLE.MUS'" db 10,13," F4 : load music from current drive to buffer" db 10,13," F5 : exclusive play buffer data",10,10,13 db " Buffer status : Main memory : off",10,13 db " Ramdisk Pezik : " NSIZE: db "256 kB of maximum 512kB",10,13 db " Ramdisk Lamac : off$" dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; zasobnik STACK: LM: db 26," Loading music ..$" PM: db 26," Playing music ..$" EB: db 26," Frequency view of music ..$" SM: db 26," Saving music to disk..$" RB1: db 26," Enter name of music file {.mus} : $" RB2: db 10,13," Reading music from disk..$" BUFSIZE: db 1 TRANSFTAB: ; ::: transform data - VRAM : primo ld e,(hl) ,inc hl ld d,(hl) dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 SIZES: db " 64","128","192","256","320","384","448","512" FCBOUT: db 0,"SAMPLE0" NAMEFCB: db "0MUS" dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0 FCBI: db 0," MUS" dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SPEEDBUF: dw FREMEM ; ::: urychlovaci buffer : primo adresy minulych ve vram. IOBUF: dw 0 ; ::: vyrovnavaci buffer :::. FREMEM: ; volna ram end