WAV-Player/WAVPLAY.ASM
Tolik 0c69e84a29 исправлено несколько багов с некорректной работой плейлиста.
исправлен баг с шумом при переключении треков плейлиста.
2025-06-27 23:16:27 +10:00

1633 lines
23 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

DEFINE WAVPLunknown 1
DEFINE SoundBugFix 1
DEFINE FULL_VERSION "2.02"
SH_HDD_X EQU 223 ; ¯®«®¦¥­¨¥ ¨­¤¨ª â®à  HDD £®à.
SH_HDD_Y EQU 90 ; ¯®«®¦¥­¨¥ ¨­¤¨ª â®à  HDD ¢¥àâ.
MACRO NEXT_SEC
LD BC,IDE.Read.Sector
IN A,(C)
INC A
INC B
OUT (C),A
JR NZ,.NO_NEXT
;
DEC B
INC C
IN E,(C) ;IDE.Read.CylinderLow
INC C
IN D,(C) ;IDE.Read.CylinderHigh
;
INC DE
INC B
OUT (C),D ;IDE.Write.CylinderHigh
DEC C
OUT (C),E ;IDE.Write.CylinderLow
.NO_NEXT:
ENDM
MACRO WAIT_HDD
.LOCS1:
IN E,(C)
BIT 7,E
JR NZ,.LOCS1
BIT 3,E
JP Z,END_READ1
ENDM
INCLUDE 'shared_includes/constants/sp2000.inc'
INCLUDE 'Shared_Includes/constants/dss_equ.inc'
INCLUDE 'Shared_Includes/constants/bios_equ.inc'
INCLUDE 'shared_includes/macroses/accelerator.z80'
ORG #8100-EXE_HEADER.Size
;************************************
EXE_HEADER:
BYTE 'EXE'
BYTE 1 ; MY VERSION
DWORD EXE_HEADER.Size ; START CODE IN FILE
WORD Loader_length ; LEN START LOAD DATA
WORD 0,0,0 ; RESERV
WORD START ; ADRESS IN MEM
WORD START ; START ADRESS
WORD #C000 ; STACK ADRESS
.Size EQU $-EXE_HEADER
START: PUSH IX
LD A,(IX-3) ;this file handle
LD (FILE_HANDLE),A
LD HL,START_MSG
LD C,#5C
RST ToDSS ; Start Message
LD C,#50
LD B,0
LD A,#81
RST ToDSS ; OPEN_GRAF_SCR
DI
LD C,#A6 ; set GRAF_PAL
LD B,1
LD A,0 ;GRAPHIC_SCREEN
RST ToBIOS
EI
IN A,(SLOT3)
EX AF,AF'
LD A,#50
OUT (SLOT3),A
ACC_SetBlockSize
LD A,0
ACC_Off
OUT (PORT_Y),A
LD HL,#C13F
LD DE,#C13E
LD BC,319
ACC_FillScreenOneByte
LD (HL),A
LDDR
ACC_Off
EX AF,AF'
OUT (SLOT3),A
; ================[ <20>Ž„ƒŽ<C692>Š€ ]================; !TODO
IF WAVPLunknown
LD HL,#B000 ; clear mem_part
LD DE,#B001
LD BC,#DFF
LD (HL),L
LDIR
ENDIF
;================[----------]================;
;*******************************
;!TEST
; LD HL,FACE_FILE
; LD A,1
; LD C,#11
; RST #10 ; Open FACE 䨫¥
; JP C,NO_FACE ; ®è¨¡ª , ¥á«¨ ­¥â ä ©« 
; LD (FILE_HANDLE),A
LD A,(FILE_HANDLE)
LD HL,0
LD IX,PIC_MAIN.Size
LD BC,Dss.Move_FP.FrEnd
;!TEST
LD HL,#B400
LD DE,#36
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS ; READ Head
; LD HL,0B436h ; Set All PAL=0
; LD DE,0B437h
; LD (HL),0
; LD BC,3FFh
; LDIR
LD HL,(#B42E) ; ç¨á«® 梥⮢
LD A,L
LD (PALS_N),A ; ç¨á«® 梥⮢
ADD HL,HL
ADD HL,HL
LD D,H
LD E,L
LD HL,#B436
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS ; READ PAL
; LD HL,0B832h ; 梥â FF - ¡¥«ë©
; LD (HL),0FFh
; INC L
; LD (HL),0FFh
; INC L
; LD (HL),0FFh
LD HL,#B836
LD DE,#B837
LD BC,#400
LD (HL),0
LDIR
LD HL,#B836
CALL SET_PAL_
LD B,8
LD C,#9E ; line for FACE
LOOP_FACE:
PUSH BC
LD HL,#9000
LD DE,#1400 ; ¯® 5k
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS ; READ File
POP BC
PUSH BC ; ¢á¯®¬­¨âì C - Line
IN A,(SLOT3)
PUSH AF
IN A,(PORT_Y)
PUSH AF
LD HL,#9000
LD A,#50
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
LD A,#10
NEXT_LINE_:
EX AF,AF'
LD DE,#C000
LD BC,#140
LDIR
IN A,(PORT_Y)
DEC A ; BMP lines up!
OUT (PORT_Y),A
EX AF,AF'
DEC A
JR NZ,NEXT_LINE_
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT3),A
POP BC
EX AF,AF' ; AF'=(PORT_Y)
LD C,A ; Line
DJNZ LOOP_FACE
CALL CLOSE_FILE
CALL OFF_IND
LD HL,#B436
LD DE,#B836
LD C,4
LD B,0
LOOP_P:
LD A,(HL)
RRA
RRA
AND #3F
LD (DE),A
INC HL
INC DE
DJNZ LOOP_P
DEC C
JR NZ,LOOP_P
LD HL,#B836
CALL SET_PAL_
LD B,2
PAUS1:
EI
HALT
DJNZ PAUS1
LD HL,#B436
LD DE,#B836
LD C,4
LD B,0
LOOP_P2:
LD A,(HL)
RRA
AND #7F
LD (DE),A
INC HL
INC DE
DJNZ LOOP_P2
DEC C
JR NZ,LOOP_P2
LD HL,#B836
CALL SET_PAL_
LD B,2
PAUS2:
EI
HALT
DJNZ PAUS2
LD HL,#B436 ; Pal adress
CALL SET_PAL_
JR FACE_OK
NO_FACE:
DI
LD C,#A6 ; set GRAF_PAL
LD B,1
LD A,0
RST ToBIOS
EI
FACE_OK:
LD HL,EXIT_ALL.norm_exit
EX (SP),HL ; ¢á¯®¬­¨âì ª®¬ ­¤­ãî áâபã
;POP HL ; ¢á¯®¬­¨âì ª®¬ ­¤­ãî áâபã
INC HL
INC HL
LD (SAV_SP),SP
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
IF SoundBugFix
IN A,(SLOT3)
LD (SAV_PAGE3),A
ENDIF
PLAY_ALL:
CALL TEST_SWITCH
IF SoundBugFix
LD A,SP_SND.CBL.BUFFER_PAGE
OUT (SLOT3),A
ENDIF
; HL - name
CALL READ_FILE ; ç⥭¨¥ ä ©«  (á­ ç « !)
JP C,ERROR
LD DE,PLAY_LIST_ID
LD B,8
LD HL,#C000
CALL LINE_COMP
JP NZ,PLAY_WAVE
LD SP,(SAV_SP) ; STOP RECURSE
LD HL,#C100
CALL READ_MORE ; ¯à®ç¨â âì ¥é¥
LD HL,#C00A ; ¤ ­­ë¥ PLAYLIST
LD DE,#9000 ; files
LOOP_WPL:
PUSH DE
CALL EXTR_LINE ; ¯®¨áª áâப¨ ¨ ¯¥à¥­¥á¥­¨¥ ¢ DE
XOR A
LD (DE),A ; § ª®­ç¨âì áâப㠭㫥¬
INC HL
INC HL
LD A,B
AND A
JR Z,END_WPL
POP DE
LD A,E
ADD A,#40
LD E,A
LD A,D
ADC A,0
LD D,A
CP #97 ; ¤® 60 ä ©«®¢
JR NZ,LOOP_WPL
PUSH DE
END_WPL:
POP HL
ADD HL,HL
ADD HL,HL
LD A,H
AND #3F
LD (NUM_FILES),A
INC A
LD (NUM_MAX),A
LD HL,#9000
LOOP_WPL_ALL:
LD A,(NUM_FILES)
AND A
JR Z,STOP_ALL
PUSH HL
CALL PLAY_ALL ; RECURSE!!!!
POP HL
LD A,(KEY_)
CP 118
JR Z,STOP_ALL
CP 107
JR NZ,NEXT_SOU
PREV_SOU:
LD BC,-#40
ADD HL,BC
XOR A
LD (KEY_),A ; for none-repeat prev
LD A,(NUM_FILES)
INC A
LD (NUM_FILES),A
LD C,A
LD A,(NUM_MAX)
CP C
JR NZ,LOOP_WPL_ALL
NEXT_SOU:
LD BC,#40
ADD HL,BC
LD A,(NUM_FILES)
DEC A
LD (NUM_FILES),A
JR LOOP_WPL_ALL
STOP_ALL:
LD SP,(SAV_SP) ; STOP RECURSE
RET
TEST_SWITCH:
PUSH HL
LD A,1
LD (DOS_FLAG1),A
NEXT_SYM:
LD A,(HL)
INC HL
AND A
JR Z,END_SWITCH
CP ' '
JR NZ,NEXT_SYM
LD A,(HL)
OR ' '
CP 'h'
JR NZ,END_SWITCH
LD A,0
LD (DOS_FLAG1),A
END_SWITCH:
POP HL
RET
;*************************************
PLAY_WAVE:
LD DE,LINES
LD HL,#C000
LD B,4
CALL LINE_COMP
JR NZ,ERROR2
LD HL,#C008
LD B,8
CALL LINE_COMP
JR NZ,ERROR2
LD A,#80
LD (D_FILL),A ; FILL by 80h
LD A,0
LD (VISIO.ADD_PAR),A
LD A,(#C022)
LD (FLAG16),A
CP 8
LD B,#80+#10 ; CBL-mode8 & INT ENABLE
JR Z,NEXT_1
CP 16
LD B,#80+#20+#10; CBL-mode16 & INT ENABLE
LD A,0
LD (D_FILL),A ; FILL by 0
LD A,#80
LD (VISIO.ADD_PAR),A
JR Z,NEXT_1
;JR ERROR2 ; format error
ERROR2: CALL RESTORE_SCR
LD HL,ERROR_MSG2
LD C,#5C
RST ToDSS
CALL CLOSE_FILE
LD B,DSS_Error.sys.UNKNOWN_FORMAT
JP EXIT_ALL.exit
ERROR: CALL RESTORE_SCR
LD HL,ERROR_MSG
LD C,#5C
RST ToDSS
LD B,DSS_Error.sys.FILE_NOT_FOUND
JP EXIT_ALL.exit
ERROR3: CALL RESTORE_SCR
LD HL,ERROR_MSG3
LD C,#5C
RST ToDSS
CALL CLOSE_FILE
LD B,DSS_Error.sys.UNKNOWN_FORMAT
JP EXIT_ALL.exit
RESTORE_SCR:
LD C,#50
LD B,0
LD A,#03
JP ToDSS ; OPEN_TXT_SCR
NEXT_1:
LD A,(#C016)
CP 1
JR Z,NEXT_2
CP 2
SET 6,B ; set stereo-mode
JR NZ,ERROR2
NEXT_2:
LD A,B
LD (CBL_MODE),A
LD BC,(#C018) ; ç áâ®â 
LD HL,7000
LD DE,9000
CALL Test_DIAP
LD A,8 ; 8khz
JR Z,NEXT_3
LD HL,10000
LD DE,12000
CALL Test_DIAP
LD A,9 ; 11khz
JR Z,NEXT_3
LD HL,15000
LD DE,17000
CALL Test_DIAP
LD A,10 ; 16khz
JR Z,NEXT_3
LD HL,21000
LD DE,23000
CALL Test_DIAP
LD A,11 ; 22khz
JR Z,NEXT_3
LD HL,30000
LD DE,34000
CALL Test_DIAP
LD A,12 ; 32khz
JR Z,NEXT_3
LD HL,42000
LD DE,46000
CALL Test_DIAP
LD A,13 ; 44khz
; LD A,15 ; 109khz
JR Z,NEXT_3
; LD HL,50000
; LD DE,60000
; CALL Test_DIAP
; EX AF,AF'
; LD A,14 ; 54khz
; EX AF,AF'
; JR Z,NEXT_3
JP ERROR3
NEXT_3:
LD (FRQ_),A ; ç áâ®â  8..13
LD C,A
LD A,(CBL_MODE)
ADD A,C
LD (CBL_MODE),A
PLAY_FILE:
CALL FRQ_ON
LD HL,#C024
FIND_DATA:
PUSH HL
LD DE,LINES_DATA
LD B,4
CALL LINE_COMP
POP HL
JR Z,DATA_1
INC L
JR NZ,FIND_DATA
JP ERROR2
DATA_1:
INC HL
INC HL
INC HL
INC HL
INC HL ; only by 256 bytes
LD DE,LENGTH_DATA
LD BC,3
LDIR ; COPY LEN of DATA
IF SoundBugFix
LD A,(D_FILL)
LD B,L
.loop: DEC HL
LD (HL),A
DJNZ .loop
ELSE
IN A,(SLOT3)
LD (SAV_PAGE3),A
ENDIF
;LD A,SP_SND.CBL.BUFFER_PAGE ; ᯥæ-áâà ­¨æ !
;LD (PLAY_PAGE),A
;*********************************************
LD A,SP_SND.CBL.BUFFER_PAGE
OUT (SLOT3),A
LD A,16 ; ç¨á«® ᥪâ®à®¢ - ¯à¨§­ ª ª®­æ  ¤ ­­ëå
LD (NUM_SEC+1),A
LD HL,#C100
CALL READ_FILE_X1 ;!FIXIT
LD A,0
LD BC,SP_SND.CBL.SYS_PORT
OUT (C),A
LD BC,SP_SND.CBL.OUT
LD A,#80
FILL_L0:
OUT (C),A ; § ¡¨âì ¢® ¢á¥ 80h
DJNZ FILL_L0
LD HL,#A000 ; CLEAR PAGE_IM2
LD DE,#A001
LD BC,#100
LD (HL),0
LDIR
DI
LD DE,PLAY
LD (#A0FF),DE ; IM2_ADRESS
LD A,#A0
LD I,A
IM 2
LD A,(CBL_MODE)
LD BC,SP_SND.CBL.SYS_PORT
OUT (C),A
EI
LD A,(MAX_)
ADD A,#60
RRCA
AND #7F
LD (MAX_),A
;***************************************
; MAIN play LOOP
;***************************************
LOOP:
CALL INKEY
JR Z,NO_KEY1
CP 118 ; ESC
JP Z,EXIT_ALL ; exit
CP 107 ; Left arrow
JP Z,EXIT_ALL ; next_sound
CP 116 ; Right arrow
JP Z,EXIT_ALL ; next_sound
CP 41 ; Space
CALL Z,PAUSE_KEY
CP 5 ; F1
CALL Z,HELP_OUT
NO_KEY1:
LD A,(SND_A+1)
CP #DF
JR NC,LOOP
LD A,1
LD (HDD_CNT),A
LD HL,#E000
;
CALL READ_FILE_X
JP NZ,EXIT_ALL
CALL HDD_IND
LD A,(MAX_)
ADD A,60h
RRCA
AND 7Fh
LD (MAX_),A
LOOP2:
CALL INKEY
JR Z,NO_KEY2
CP 118
JP Z,EXIT_ALL
CP 107 ; Left
JP Z,EXIT_ALL
CP 116 ; Right
JP Z,EXIT_ALL
CP 41
CALL Z,PAUSE_KEY
CP 5
CALL Z,HELP_OUT
NO_KEY2:
LD A,(SND_A+1)
CP #DF
JR C,LOOP2
LD A,1
LD (HDD_CNT),A
LD HL,#C000
;
CALL READ_FILE_X
JP NZ,EXIT_ALL
CALL HDD_IND
LD A,60h
LD (MAX_),A
; ================[ <20>Ž„ƒŽ<C692>Š€ ]================; !TODO
IF WAVPLunknown
JP LOOP
ELSE
JR LOOP
ENDIF
;================[----------]================;
;***********************************
HDD_IND:
IN A,(SLOT3)
PUSH AF
IN A,(PORT_Y)
PUSH AF
DI
LD A,#50
OUT (SLOT3),A
ACC_SetBlockSize
LD A,#20 ; § ¡¨âì ¢¥áì ¨­¤¨ª â®à
ACC_Off
LD HL,#C000 + SH_HDD_X ; ¯®«®¦¥­¨¥ ¨­¤¨ª â®à  HDD £®à.
LD A,SH_HDD_Y
OUT (PORT_Y),A
; LD A,0Eh ; 梥⠯ ­¥«¨ (ᨭ¨©)
LD A,3 ; 梥⠯ ­¥«¨ (ªà á­ë©)
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,5 ; §¥«¥­ë©
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,SH_HDD_Y
OUT (PORT_Y),A
INC HL
LD A,3 ; 梥⠯ ­¥«¨ (ªà á­ë©)
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,5 ; §¥«¥­ë©
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,(HDD_CNT)
CP #3E
LD B,#1D
JR C,NO_
COLOR_B+1: LD B,#1D
LD A,(COLOR_B)
XOR #1E
LD (COLOR_B),A
LD A,#3E
NO_:
LD DE,HDD_S
ACC_SetBlockSize
LD (DE),A
ACC_Off
NEG
ADD A,SH_HDD_Y+#40
LD C,A
OUT (PORT_Y),A
LD A,B
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,C
OUT (PORT_Y),A
DEC HL
LD A,B
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD HL,#C0E7
LD A,SH_HDD_Y
OUT (PORT_Y),A
ACC_SetBlockSize
LD A,#10 ; § ¡¨âì ¢¥áì ¨­¤¨ª â®à
ACC_Off
; LD A,0Eh ; 梥⠯ ­¥«¨ (ᨭ¨©)
LD A,3 ; 梥⠯ ­¥«¨ ªà á­ë©! (¦¥«âë©?)
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,1 ; §¥«¥­ë©
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
ACC_SetBlockSize
LD A,#20 ; § ¡¨âì ¢¥áì ¨­¤¨ª â®à
ACC_Off
LD A,5
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,SH_HDD_Y
OUT (PORT_Y),A
INC HL
ACC_SetBlockSize
LD A,#10 ; § ¡¨âì ¢¥áì ¨­¤¨ª â®à
ACC_Off
; LD A,0Eh ; 梥⠯ ­¥«¨ (ᨭ¨©)
LD A,3 ; 梥⠯ ­¥«¨ ªà á­ë©! (¦¥«âë©?)
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,1 ; §¥«¥­ë©
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
ACC_SetBlockSize
LD A,#20 ; § ¡¨âì ¢¥áì ¨­¤¨ª â®à
ACC_Off
LD A,5
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD B,#1D
LD A,(MAX_)
SUB #60
ADD A,A
AND #3F
INC A
ACC_SetBlockSize
LD (DE),A
ACC_Off
NEG
ADD A,SH_HDD_Y+#40
LD C,A
OUT (PORT_Y),A
LD A,B
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
LD A,C
OUT (PORT_Y),A
DEC HL
LD A,B
ACC_FillScreenOneByte
LD (HL),A
ACC_Off
EI
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT3),A
RET
HDD_S: db 0
HDD_CNT: db 0
PAUSE_KEY:
DI
LD BC,SP_SND.CBL.SYS_PORT
XOR A ; SP_SND.CBL.Covox
OUT (C),A ; stop Audio
LD A,#80
LD C,SP_SND.CBL.OUT
OUT (C),A ; COVOX=80h
CALL PAUSE_KEY1
LD A,(CBL_MODE) ; PLAY MORE
LD BC,SP_SND.CBL.SYS_PORT
OUT (C),A
EI
XOR A
RET
PAUSE_KEY1:
CALL INKEY
JR Z,PAUSE_KEY1
CP 118 ; ESC
RET Z
; CP 117 ; UP
CP 90 ; Enter
RET Z
JR PAUSE_KEY1
INKEY: IN A,(Z84.SIO.Ch_A.Ctrl)
BIT 0,A
RET Z
IN A,(Z84.SIO.Ch_A.Data)
CP #F0
JR Z,KEY_OFF1
LD (KEY_),A
LD A,(NO_KEY)
AND A
LD A,(KEY_)
RET NZ
LD (NO_KEY),A ;
RET
KEY_OFF1:
XOR A
LD (NO_KEY),A
LD (KEY_),A
RET
NO_KEY: db #FF
;KEY_OFF: ; ¯à®¯ãáâ¨âì ®¤¨­ ª®¤
; IN A,(Z84.SIO.Ch_A.Ctrl)
; BIT 0,A
; JR Z,KEY_OFF
; IN A,(Z84.SIO.Ch_A.Data)
; RET
EXIT_ALL: IM 1
XOR A
LD BC,SP_SND.CBL.SYS_PORT
OUT (C),A
;
LD (HDD_CNT),A
LD (HDD_S),A
;
LD BC,SP_SND.CBL.OUT
LD A,#80
.loop: OUT (C),A ; § ¡¨âì ¢® ¢á¥ 80h
DJNZ .loop
;
LD HL,#C000
LD (SND_A),HL
;
LD A,(SAV_PAGE3)
OUT (SLOT3),A
JP CLOSE_FILE
;
.norm_exit: LD B,0
.exit: LD C,Dss.Exit
RST ToDSS
JR .exit
SAV_PAGE3: DB 0
;*************************************
PLAY: DI
PUSH AF
IN A,(SP_SND.CBL.INT_PORT)
RLCA
JP NC,NO_SND
PUSH HL
PUSH DE
PUSH BC
LD A,(HDD_CNT)
INC A
LD (HDD_CNT),A
; LD A,7
; OUT (0FEh),A
IN A,(SLOT3)
LD E,A
IN A,(SLOT0)
LD D,A
PUSH DE
LD A,SP_SND.CBL.BUFFER_PAGE
OUT (SLOT3),A
OUT (SLOT0),A
CALL VISIO
;****************
SND_A+1: LD HL,#C000
LD B,0
ACC_SetBlockSize
LD C,128 ; 128 bytes
ACC_Off
LD A,(FLAG16) ; 8/16
; AND 18h
L_DDX:
ACC_CopyBlock ;  áá-lines read & write to CBL
LD D,(HL)
LD (HL),D
ACC_Off
ADD HL,BC ; BC=80h
SUB 8
JR NZ,L_DDX
LD A,H
OR #C0
LD H,A
;===========================================================;
LD (SND_A),HL
;****************
POP DE
LD A,D
OUT (SLOT0),A
LD A,E
OUT (SLOT3),A
POP BC
POP DE
POP HL
; LD A,0
; OUT (0FEh),A
NO_SND:
POP AF
EI
RETI
;***********************************
/*
VISIO: IN A,(PORT_Y)
PUSH AF
;
; LD A,(.ADD_PAR)
; OR A
; LD A,1 ; x2 pixels
; JR NZ,.set_pix
; LD A,2 ; x2 pixels
.set_pix: ; LD (.pixels),A
; LD B,A
;
LD HL,(SND_A)
LD (.ADDRESS),HL
; OR A
; JR Z,.no_add
.no_add: LD A,H
CALL .PUT_DOT
; ¢ë室
.exit: POP AF
OUT (PORT_Y),A
RET
; ‚•Ž„: A - áâ à訩 ¡ ©â  ¤à¥á  SND_A
; B = (ª®«¨ç¥á⢮ ¯¨ªá¥«®¢)/2
.PUT_DOT: ADD A,A
;DJNZ .PUT_DOT
AND #7F ; !HARDCODE ¤«¨­  ®ª­  - 128 ¡ ©â®¢
LD L,A
LD H,#B0 ; !HARDCODE ¡ãää¥à
LD BC,7 ; !HARDCODE ᬥ饭¨¥ ®â ­ ç «  à ¬ª¨
ADD HL,BC
;
LD A,(SND_A)
RLCA
LD C,A
ADD HL,BC
;
CALL .SET_Y_COLOR
;
LD A,#50
OUT (SLOT3),A
LD A,(HL) ; old
LD (.OLD_),A
LD A,(.NEW_)
LD (HL),A
; ¯¥à¥ª«îç ¥¬ ¢ HL  ¤à¥á á ¡ãä¥à  ­  íªà ­
LD A,H
ADD A,#10
LD H,A
;
LD A,(SND_A)
RLCA
JR NC,.no_dec_hl
INC HL
.no_dec_hl: ;
; áâ¥à¥âì ¯® áâ à®© ª®®à¤¨­ â¥
; LD A,(.pixels)
; LD B,A
; LD C,A
;
.OLD_+1: LD A,0
OUT (PORT_Y),A ; old
; áâ¥à¥âì
.clear+1: LD A,0 ; clear
.loop_clear: LD (HL),A
INC L
LD (HL),A ; áâ¥à¥âì
; INC L
; DJNZ .loop_clear
; DEC L
; ­ à¨á®¢ âì ¯® ­®¢®© ª®®à¤¨­ â¥
; LD B,C
; DEC L
; DEC L
; DEC L
.loop_draw: ;
.NEW_+1: LD A,0
OUT (PORT_Y),A ; new
.COLOR_+1: LD A,#FF
; ­ à¨á®¢ âì
LD (HL),A
DEC L
LD (HL),A
; INC L
;
; LD A,(.ADDRESS)
; ADD A,8
; LD (.ADDRESS),A
; LD D,B
; CALL .SET_Y_COLOR
; ;
; LD B,D
; DJNZ .loop_draw
;
.no_draw: LD A,CBL.BUFFER_PAGE
OUT (SLOT3),A
RET
;
.SET_Y_COLOR: ;
.ADDRESS+1: LD BC,0
LD A,(BC)
RRA
CPL
AND #7F
ADD A,#40
LD (.COLOR_),A
INC BC
LD A,(BC) ; new
.ADD_PAR+1: ADD A,0 ; parameter for 8/16 bit
RRA
RRA
AND #3F
ADD A,#40 ; !HARDCODE Vertical Shift
LD (.NEW_),A
;
LD B,A
LD A,(MAX_)
CP B
RET NC
LD A,B
LD (MAX_),A
RET
;
; .pixels: DB 1 ; 1 = 2, 2 = 4, 3 = 6
*/
include 'visio2.asm'
;*************************************
FRQ_ON:
CALL OFF_IND
LD A,(FRQ_)
SUB 4
CALL SET_COL
LD A,(FLAG16)
CP 8
LD A,0 ; § ¦¥çì 8bit
JR Z,LLL1
LD A,1 ; § ¦¥çì 16 bit
LLL1: CALL SET_COL
LD A,(CBL_MODE)
BIT 6,A
LD A,2
JR Z,LLL2
LD A,3
LLL2: CALL SET_COL
LD HL,#B436
CALL SET_PAL_
RET
SET_COL:
LD C,A
LD B,0
LD HL,TAB_COL
ADD HL,BC
LD A,(HL)
ADD A,A
ADD A,A
LD C,A
LD HL,#B436
ADD HL,BC
LD (HL),#C0
INC HL
LD (HL),#F5
INC HL
LD (HL),#F5
RET
OFF_IND:
LD DE,TAB_COL
NEXT_COL:
LD HL,#B436
LD A,(DE)
ADD A,A
ADD A,A
LD C,A
LD B,0
ADD HL,BC
LD (HL),#F5
INC HL
LD (HL),#80
INC HL
LD (HL),0
INC DE
LD A,(DE)
AND A
JR NZ,NEXT_COL
; CALL SET_PAL_
RET
TAB_COL:
db 9,8 ; æ¢¥â  8/16
db 12,15 ; æ¢¥â  ¬®­®/áâ¥à¥®
db 19,22,20,13,11,10,0 ; æ¢¥â  8/11/16/22/32/44khz
SET_PAL_:
LD B,#FF
SET_PAL_1:
DI
PALS_N+2: LD DE,0
LD C,#A4
LD A,0
RST ToBIOS ; set Pal
EI
RET
;********************************************
Test_DIAP: ; ¯à®¢¥àª  ¯®¯ ¤ ­¨ï BC ¢ ¤¨ ¯ §®­ HL--DE
AND A
SBC HL,BC
JR NC,no_diap
EX DE,HL
AND A
SBC HL,BC
JR C,no_diap
XOR A
RET
no_diap:
LD A,1
AND A
RET
;********************************************
; ¢ë¤¥«¥­¨¥ áâப¨ ¨§ HL ¨ á®åà ­¥­¨¥ ¥¥ ¢ DE
EXTR_LINE: LD B,0
.LOOP: LD A,(HL)
AND A
RET Z
CP 13
RET Z
LD (DE),A
INC HL
INC DE
INC B
JR NZ,.LOOP
;SCF
RET
;********************************************
LINE_COMP:
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ LINE_COMP
RET
;********************************************
READ_FILE: ; HL - name, ç¨â âì ¢  ¤à¥á #C000
LD A,1
LD C,#11
RST ToDSS
RET C ; ®è¨¡ª , ¥á«¨ ­¥â ä ©« 
LD (FILE_HANDLE),A
LD A,(FILE_HANDLE)
LD HL,#C000
LD DE,#100 ; ç¨â âì § £®«®¢®ª
LD C,#13
RST ToDSS
PUSH AF
LD HL,#C000
ADD HL,DE
LD (HL),0
POP AF
RET ; ®è¨¡ª  ¯à¨ § ªàë⨨ ¨«¨ Ok
READ_MORE: ; ç¨â âì ¤ «ìè¥ ¤«ï playlist 4kb
PUSH HL
LD DE,#1000 ;
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS
;
JP C,ERROR
POP HL
ADD HL,DE
LD (HL),0
CLOSE_FILE:
LD A,(FILE_HANDLE)
LD C,#12
RST ToDSS
RET
;*******************************************
READ_FILE_XD1:
;LD HL,#C100
LD DE,#1F00 ; ç¨â âì ¤ «ìè¥
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS
RET
READ_FILE_XD:
; LD HL,#C000
PUSH HL
LD DE,#2000 ; ç¨â âì ¤ «ìè¥
LD C,#13
LD A,(FILE_HANDLE)
RST ToDSS
POP HL
ADD HL,DE
LD A,D
CP #20
RET Z
LD A,E
OR D
JR NZ,SET_Z_FLAG
XOR A
INC A
RET
SET_Z_FLAG: ; § ¡¨âì ®áâ «ì­ë¥ ¡ ©âë ¢ 80h
LD (HL),#80
INC HL
LD A,H
AND #1F
OR L
JR NZ,SET_Z_FLAG
RET
DOS_FLAG1: db 1
;********************************************
READ_FILE_X: ; HL - ªã¤  ç¨â âì
;
LD A,(DOS_FLAG1)
AND A
JP NZ,READ_FILE_XD
;
;================[ <20>Ž„ƒŽ<C692>Š€ ]================; !TODO
IFN WAVPLunknown
NEXT_SEC
ENDIF
;================[----------]================;
;
READ_FILE_X1: ; HL - ªã¤  ç¨â âì
LD A,(DOS_FLAG1)
AND A
JP NZ,READ_FILE_XD1
LD A,(NUM_SEC+1)
CP 16
RET NZ
LD A,(LENGTH_DATA)
SUB 32
LD (LENGTH_DATA),A
LD A,(LENGTH_DATA+1)
SBC A,0
LD (LENGTH_DATA+1),A
LD A,(LENGTH_DATA+2)
SBC A,0
LD (LENGTH_DATA+2),A
JR NC,CONT_1
LD A,(LENGTH_DATA)
ADD A,32
RRA
AND #1F ; number of sectors
LD (NUM_SEC+1),A
;
;================[ <20>Ž„ƒŽ<C692>Š€ ]================; !TODO
IFN WAVPLunknown
JP Z,READ_END
CONT_1:
NUM_SEC:
LD A,16 ; áç¨â âì 16 ᥪâ®à®¢
LD BC,IDE.Write.Counter
OUT (C),A
LD BC,IDE.Write.Command
LD A,#20
OUT (C),A ; ç¨â âì!
LOOP_HDDR1:
LD BC,IDE.Read.Status
WAIT_HDD
LD BC,IDE.Read.Data ; READ/WRITE INIR/OTIR
LD D,16
LOOP_HDDR:
DUP 32
INI
EDUP
DEC D
JR NZ,LOOP_HDDR
JR LOOP_HDDR1
END_READ1:
READ_END:
ELSE
CONT_1:
LD A,SP_SND.CBL.BUFFER_PAGE
NUM_SEC:
LD B,16 ; áç¨â âì 16 ᥪâ®à®¢
LD C,#48
RST ToBIOS ; CALL BIOS !!! READ_NEXT
ENDIF
;================[----------]================;
;
LD A,(NUM_SEC+1)
READ_END1:
CP 16
RET Z
PUSH HL
POP DE
INC DE
D_FILL+1:
LD C,#80
LD (HL),C
LD BC,1FFh
LDIR
INC HL
INC A
JR READ_END1
;**********************************
HELP_OUT:
IN A,(SLOT1)
PUSH AF
IN A,(PORT_Y)
PUSH AF
LD A,#50
OUT (SLOT1),A
LD A,(HELP_FLAG)
AND A
JR NZ,NO_OUT_PIC
LD DE,PIC_HELP
LD A,#FC
OUT (PORT_Y),A
LOOP_ALL:
LD HL,#4060
LD C,16
LOOP_LINE:
LD A,(DE)
LD B,8
LOOP_BYTE:
RLCA
; LD (HL),0
JR NC,NO_POINT
LD (HL),#FF ; HELP_COLOR
NO_POINT:
INC HL
DJNZ LOOP_BYTE
INC DE
DEC C
JR NZ,LOOP_LINE
IN A,(PORT_Y)
DEC A
OUT (PORT_Y),A
CP #FC-#50
JR NZ,LOOP_ALL
LD A,1
LD (HELP_FLAG),A
NO_OUT_PIC:
LD A,#FF
OUT (PORT_Y),A
LD HL,#43E0 ;?????
COLOR_X+1: LD A,#FF
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
CPL
LD (COLOR_X),A
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT1),A
RET
;**********************************
HELP_FLAG: db 0
MAX_: db #40
FRQ_: db 0
KEY_: db 0
SAV_SP: dw 0
LENGTH_DATA: dw 0,0
FLAG16: db 0
FILE_HANDLE: db 0
CBL_MODE: db 0
;FACE_FILE: db "WAV_PL.BMP",0
LINES: db "RIFF","WAVEfmt "
LINES_DATA: db "data"
ERROR_MSG:
db 13,10,"File not found."
db 13,10,"USE: wavplay.exe filename.ext",13,10,0
ERROR_MSG2:
db 13,10,"The file format is not recognized.",13,10,0
ERROR_MSG3:
db 13,10,"Non-standart data rate.",13,10,0
START_MSG:
db 13,10,"COVOX-Blaster WAV-Player v",FULL_VERSION," by Ivan Mak"
db 13,10,"(c) Sprinter Team. 2025.",13,10,0
PLAY_LIST_ID: db "PLAYLIST"
NUM_FILES: db 1
NUM_MAX: db 2
PLAY_LIST: BLOCK #8A00-$,0
PIC_HELP:
incbin 'BIN/WAV_HELP.PAK'
Loader_length EQU $ - START
;
;
DISP 0
PIC_MAIN:
incbin './BIN/WAV_PL.BMP'
.Size EQU $-PIC_MAIN
ENT
;