mirror of
https://github.com/Tolik-Trek/WAV-Player.git
synced 2026-06-15 09:01:35 +03:00
1575 lines
21 KiB
NASM
1575 lines
21 KiB
NASM
|
||
DEFINE WAVPLunknown 1
|
||
DEFINE SoundBugFix 1
|
||
|
||
SH_HDD_X EQU 223 ; ¯®«®¦¥¨¥ ¨¤¨ª â®à HDD £®à.
|
||
SH_HDD_Y EQU 90 ; ¯®«®¦¥¨¥ ¨¤¨ª â®à HDD ¢¥àâ.
|
||
|
||
|
||
MACRO NEXT_SEC
|
||
LD BC,P_S_NUM-256
|
||
IN A,(C)
|
||
INC A
|
||
; LD BC,P_S_NUM
|
||
INC B
|
||
OUT (C),A
|
||
JR NZ,.NO_NEXT
|
||
|
||
LD BC,P_C_LOW-256
|
||
IN E,(C)
|
||
LD BC,P_C_HIG-256
|
||
IN D,(C)
|
||
|
||
INC DE
|
||
LD BC,P_C_LOW
|
||
OUT (C),E
|
||
LD BC,P_C_HIG
|
||
OUT (C),D
|
||
|
||
.NO_NEXT:
|
||
ENDM
|
||
|
||
MACRO WAIT_HDD
|
||
.LOCS1:
|
||
; LD BC,P_HDST
|
||
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 0 ; 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 #BFFE ; STACK ADRESS
|
||
;DS 490
|
||
.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:
|
||
|
||
POP HL ; ¢á¯®¬¨âì ª®¬ ¤ãî áâபã
|
||
INC HL
|
||
INC HL
|
||
|
||
LD (SAV_SP),SP
|
||
|
||
PLAY_ALL:
|
||
CALL TEST_SWITCH
|
||
|
||
IF SoundBugFix
|
||
LD A,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 (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 (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
|
||
XOR A
|
||
LD B,L
|
||
.loop: DEC HL
|
||
LD (HL),A
|
||
DJNZ .loop
|
||
ENDIF
|
||
|
||
IN A,(SLOT3)
|
||
LD (SAV_PAGE3),A
|
||
|
||
;LD A,CBL.BUFFER_PAGE ; ᯥæ-áâà ¨æ !
|
||
;LD (PLAY_PAGE),A
|
||
|
||
;*********************************************
|
||
|
||
LD A,CBL.BUFFER_PAGE
|
||
OUT (SLOT3),A
|
||
|
||
LD A,16 ; ç¨á«® ᥪâ®à®¢ - ¯à¨§ ª ª®æ ¤ ëå
|
||
LD (NUM_SEC+1),A
|
||
|
||
LD HL,#C000
|
||
;
|
||
CALL READ_FILE_X1
|
||
|
||
LD A,0
|
||
LD BC,#4E
|
||
OUT (C),A
|
||
|
||
LD BC,#4F
|
||
LD A,#80
|
||
FILL_L0:
|
||
OUT (C),A ; § ¡¨âì ¢® ¢á¥ 80h
|
||
DJNZ FILL_L0
|
||
|
||
LD HL,0A000h ; CLEAR PAGE_IM2
|
||
LD DE,0A001h
|
||
LD BC,100h
|
||
LD (HL),0
|
||
LDIR
|
||
|
||
DI
|
||
|
||
LD DE,PLAY
|
||
LD (0A0FFh),DE ; IM2_ADRESS
|
||
|
||
LD A,0A0h
|
||
LD I,A
|
||
IM 2
|
||
|
||
LD A,(CBL_MODE)
|
||
LD BC,#4E
|
||
OUT (C),A
|
||
|
||
EI
|
||
|
||
LD A,(MAX_)
|
||
ADD A,60h
|
||
RRCA
|
||
AND 7Fh
|
||
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 0DFh
|
||
JR NC,LOOP
|
||
|
||
LD A,1
|
||
LD (HDD_CNT),A
|
||
|
||
LD HL,0E000h
|
||
;
|
||
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 0DFh
|
||
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,CBL.SYS_PORT
|
||
XOR A ; CBL.Covox
|
||
OUT (C),A ; stop Audio
|
||
LD A,#80
|
||
LD C,CBL.OUT
|
||
OUT (C),A ; COVOX=80h
|
||
|
||
CALL PAUSE_KEY1
|
||
|
||
LD A,(CBL_MODE) ; PLAY MORE
|
||
LD BC,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
|
||
|
||
LD A,0
|
||
LD BC,#4E
|
||
OUT (C),A
|
||
|
||
LD BC,#4F
|
||
LD A,#80
|
||
|
||
.loop: OUT (C),A ; § ¡¨âì ¢® ¢á¥ 80h
|
||
DJNZ .loop
|
||
|
||
LD A,(SAV_PAGE3)
|
||
OUT (SLOT3),A
|
||
|
||
CALL CLOSE_FILE
|
||
|
||
; LD C,50h ; OPEN_TEXT_SCR
|
||
; LD B,1
|
||
; LD A,3h
|
||
; RST 10h
|
||
LD B,0
|
||
.exit: LD C,Dss.Exit
|
||
RST ToDSS
|
||
JR .exit
|
||
|
||
SAV_PAGE3: db 0
|
||
;*************************************
|
||
PLAY: DI
|
||
PUSH AF
|
||
IN A,(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,CBL.BUFFER_PAGE
|
||
;PLAY_PAGE EQU $-1 ; !FIXIT § 祬, ¥á«¨ ¬®¦® ¯àï¬ãî ¡ë«® ¯à®¯¨á âì?
|
||
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,(SND_A+1)
|
||
ADD A,A
|
||
; ADD A,A
|
||
AND #7F
|
||
LD L,A
|
||
LD H,#B0
|
||
LD BC,7
|
||
ADD HL,BC
|
||
|
||
LD BC,(SND_A)
|
||
|
||
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 ; Vertical Shift
|
||
LD (NEW_),A
|
||
|
||
LD B,A
|
||
LD A,(MAX_)
|
||
CP B
|
||
JR NC,NO_MAX
|
||
LD A,B
|
||
LD (MAX_),A
|
||
NO_MAX:
|
||
LD A,#50
|
||
OUT (SLOT3),A
|
||
|
||
LD A,(HL) ; old
|
||
LD (OLD_),A
|
||
LD A,(NEW_)
|
||
LD (HL),A
|
||
|
||
OLD_+1: LD A,0
|
||
OUT (PORT_Y),A ; old
|
||
|
||
LD A,H
|
||
ADD A,#10
|
||
LD H,A
|
||
|
||
LD A,0 ; clear
|
||
LD (HL),A
|
||
INC L
|
||
LD (HL),A
|
||
; INC L
|
||
; LD (HL),A
|
||
; INC L
|
||
; LD (HL),A ; áâ¥à¥âì
|
||
|
||
NEW_+1: LD A,0
|
||
OUT (PORT_Y),A ; new
|
||
|
||
COLOR_+1: LD A,#FF
|
||
LD (HL),A
|
||
DEC L
|
||
LD (HL),A
|
||
; DEC L
|
||
; LD (HL),A
|
||
; DEC L
|
||
; LD (HL),A ; à¨á®¢ âì ®¢®¥
|
||
|
||
LD A,CBL.BUFFER_PAGE
|
||
OUT (SLOT3),A
|
||
|
||
POP AF
|
||
OUT (PORT_Y),A
|
||
RET
|
||
|
||
;*************************************
|
||
|
||
|
||
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
|
||
|
||
;********************************************
|
||
|
||
EXTR_LINE: ; ¢ë¤¥«¥¨¥ áâப¨ ¨§ HL ¨ á®åà ¥¨¥ ¥¥ ¢ DE
|
||
LD B,0
|
||
EXTR_LOOP:
|
||
LD A,(HL)
|
||
CP 13
|
||
RET Z
|
||
LD (DE),A
|
||
INC HL
|
||
INC DE
|
||
INC B
|
||
JR NZ,EXTR_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 DE,200h ; ç¨â âì § £®«®¢®ª
|
||
LD C,#13
|
||
RST ToDSS
|
||
RET C ; ®è¨¡ª ¯à¨ ç⥨¨
|
||
; ¤«¨ áç¨â ëå ¤ ëå ¢ DE
|
||
RET ; ®è¨¡ª ¯à¨ § ªàë⨨ ¨«¨ Ok
|
||
|
||
READ_MORE: ; ç¨â âì ¤ «ìè¥ ¤«ï playlist 4kb
|
||
|
||
LD DE,#1000 ;
|
||
LD C,#13
|
||
LD A,(FILE_HANDLE)
|
||
RST ToDSS
|
||
; JR CLOSE_FILE
|
||
|
||
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
|
||
LD A,1
|
||
AND 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 1Fh ; 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,P_S_CNT
|
||
OUT (C),A
|
||
|
||
LD BC,P_CMD
|
||
LD A,#20
|
||
OUT (C),A ; ç¨â âì!
|
||
|
||
LOOP_HDDR1:
|
||
LD BC,P_HDST
|
||
WAIT_HDD
|
||
|
||
LD BC,P_DATS ; 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,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
|
||
LD C,80h
|
||
D_FILL EQU $-1
|
||
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,"File format not recognized.",13,10,0
|
||
ERROR_MSG3:
|
||
db 13,10,"Not standart data rate",13,10,0
|
||
|
||
START_MSG:
|
||
db 13,10,"COVOX-Blaster WAV-Player by Ivan Mak"
|
||
db 13,10,"(c) Sprinter Team. 2023.",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
|
||
;
|