DEFINE WAVPLunknown 1 DEFINE SND_Abug 0 DEFINE OutOfPageBugFix 0 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/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 #10 ; Start Message LD C,#50 LD B,0 LD A,#81 RST #10 ; OPEN_GRAF_SCR DI LD C,#A6 ; set GRAF_PAL LD B,1 LD A,0 ;GRAPHIC_SCREEN RST 8 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 ; ================[ ПОДГОНКА ]================; !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 * 256 + Dss.Move_FP ;!TEST LD HL,#B400 LD DE,#36 LD C,#13 LD A,(FILE_HANDLE) RST #10 ; 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 #10 ; 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 #10 ; 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 8 EI FACE_OK: POP HL ; вспомнить командную строку INC HL INC HL LD (SAV_SP),SP PLAY_ALL: CALL TEST_SWITCH ; 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 ERROR: CALL RESTORE_SCR LD HL,ERROR_MSG LD C,5Ch RST 10h LD B,DSS_Error.sys.FILE_NOT_FOUND RET ERROR2: CALL RESTORE_SCR LD HL,ERROR_MSG2 LD C,#5C RST #10 CALL CLOSE_FILE LD B,DSS_Error.sys.UNKNOWN_FORMAT RET ERROR3: CALL RESTORE_SCR LD HL,ERROR_MSG3 LD C,#5C RST #10 CALL CLOSE_FILE LD B,DSS_Error.sys.GENERAL_FAILURE RET RESTORE_SCR: LD C,#50 LD B,0 LD A,#03 JP #10 ; 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,(0C018h) ; частота 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 SND_Abug LD (SND_A),HL ; Adress of data ENDIF IN A,(SLOT3) LD (SAV_PAGE3),A LD A,#FD ; спец-страница! LD (PLAY_PAGE),A ;********************************************* LD A,(PLAY_PAGE) OUT (SLOT3),A LD A,16 ; число секторов - признак конца данных LD (NUM_SEC+1),A LD HL,#C000 ; ; ================[ ПОДГОНКА ]================; !TODO IF WAVPLunknown LD DE,0 ENDIF ;================[----------]================; ; 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 ; ; ================[ ПОДГОНКА ]================; !TODO IF WAVPLunknown LD DE,1 ENDIF ;================[----------]================; ; 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 ; ; ================[ ПОДГОНКА ]================; !TODO IF WAVPLunknown LD DE,1 ENDIF ;================[----------]================; ; CALL READ_FILE_X JP NZ,EXIT_ALL CALL HDD_IND LD A,60h LD (MAX_),A ; ================[ ПОДГОНКА ]================; !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 SH_HDD EQU 5Ah ; положение индикатора HDD верт. LD HL,#C0DF ; положение индикатора HDD гор. LD A,SH_HDD 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 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_ LD B,#1D COLOR_B EQU $-1 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+#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 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 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+#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,#4E LD A,0 OUT (C),A ; stop Audio LD A,#80 LD C,#4F OUT (C),A ; COVOX=80h CALL PAUSE_KEY1 LD A,(CBL_MODE) ; PLAY MORE LD BC,#4E 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 FILL_L1: OUT (C),A ; забить во все 80h DJNZ FILL_L1 LD A,(SAV_PAGE3) OUT (SLOT3),A CALL CLOSE_FILE ; LD C,50h ; OPEN_TEXT_SCR ; LD B,1 ; LD A,3h ; RST 10h RET SAV_PAGE3: db 0 ;************************************* PLAY: DI PUSH AF IN A,(0FEh) 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,#FD 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 ;========================[ BUG FIX ]========================; IF OutOfPageBugFix ex de,hl ld hl,#100 adc hl,de ex de,hl jr nc,1F ld hl,#C02C ENDIF ;===========================================================; 1: 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,(PLAY_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 8h ; 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 #10 RET C ; ошибка, если нет файла LD (FILE_HANDLE),A LD A,(FILE_HANDLE) LD HL,#C000 LD DE,#100 ; читать заголовок ; LD DE,200h ; читать заголовок LD C,#13 RST #10 RET C ; ошибка при чтении ; длина считанных данных в DE RET ; ошибка при закрытии или Ok READ_MORE: ; читать дальше для playlist 4kb LD DE,#1000 ; LD C,#13 LD A,(FILE_HANDLE) RST #10 ; JR CLOSE_FILE CLOSE_FILE: LD A,(FILE_HANDLE) LD C,#12 RST #10 RET ;******************************************* READ_FILE_XD1: LD HL,#C100 LD DE,#1F00 ; читать дальше LD C,#13 LD A,(FILE_HANDLE) RST #10 RET READ_FILE_XD: ; LD HL,#C000 PUSH HL LD DE,#2000 ; читать дальше LD C,#13 LD A,(FILE_HANDLE) RST #10 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 ; ;================[ ПОДГОНКА ]================; !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 ; ;================[ ПОДГОНКА ]================; !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,(PLAY_PAGE) NUM_SEC: LD B,16 ; считать 16 секторов LD C,#48 RST #8 ; 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 VAW-Player for Sprinter." db 13,10,"(c) Peters Plus Ltd." db 13,10,"Writed by Ivan Mak.",13,10,0 PLAY_LIST_ID: db "PLAYLIST" NUM_FILES: db 1 NUM_MAX: db 2 PLAY_LIST: ds 8A00h-$ PIC_HELP: incbin 'ORIGINAL/WAV_HELP.PAK' Loader_length EQU $ - START ; ; DISP 0 PIC_MAIN: incbin './WAV_PL.BMP' .Size EQU $-PIC_MAIN ENT ;