From 5d4dd9dba90afe1256fdef29cf5a4e4a21a81ce7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 15 Jun 2023 17:40:21 +1000 Subject: [PATCH] Setup --- .gitmodules | 4 + Shared_Includes | 1 + WAVPLAY.ASM | 1608 +++++++++++++++++++++++++++++++++++++++++++++++ WAV_PL.BMP | Bin 0 -> 41140 bytes 4 files changed, 1613 insertions(+) create mode 100644 .gitmodules create mode 160000 Shared_Includes create mode 100644 WAVPLAY.ASM create mode 100644 WAV_PL.BMP diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7355856 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "Shared_Includes"] + branch = main + path = Shared_Includes + url = https://github.com/Tolik-Trek/Shared_Includes.git diff --git a/Shared_Includes b/Shared_Includes new file mode 160000 index 0000000..6e27011 --- /dev/null +++ b/Shared_Includes @@ -0,0 +1 @@ +Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa diff --git a/WAVPLAY.ASM b/WAVPLAY.ASM new file mode 100644 index 0000000..3bae8d2 --- /dev/null +++ b/WAVPLAY.ASM @@ -0,0 +1,1608 @@ + + 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 +; diff --git a/WAV_PL.BMP b/WAV_PL.BMP new file mode 100644 index 0000000000000000000000000000000000000000..732c7a676acabc3f0383fe23b30314e1593f03b5 GIT binary patch literal 41140 zcmeI4%dQ*85r*mAktL0;N4LWxZ-cyqg6y-*3*<#&=t%@P0SqqCb=p>BCOikLdq^$Dh91?Y@QlYIlWR z+s9_N{ZB!zE6MqZTIOt9^c{d@xPECA^)}e{LLSs|5M`sL){}1xr-{q;dZX;_K3{Zg|Fj1vge)FlO^MsX2!t-k50cXg~|sTFg3yB#x76dOV*^JESiG|@;E;&L@dxEvr;3tgr5QQXr&BKH(o*L zj{O@c?f0*4@n}_M z2st?8{`Dk@F5t`S?_~-wp(OYsz{Df)BEaMP{QT2nkOv<@#sV~C3Qi6@sYYQZoxdBU zWR!{8!TQVbwfMyfjFb#t02nC7-prX#Umw$b5Qv?LjkE1%DVHhdMD`*)nA$|v(H#y z|Dw^17ClbS3ov>(FMUT2@iSThBgP&4jFj`kkZL{rvU15NVUXhM1NG$nj$i0O#{Vs^{(j&TUH<25Ra}5y=SOZrZx9Mka_*J_-P^P-X%IOOlTghl;P>d zD}DUNM;;WxGfnw5a^UgY)00nq2+xC$4FdS2?CdyHh!@MxE6!_<()2*l$vMARc4UbL zhrb)8l(o}zT7OTgX?mDgp*cUo3%chm_2$%cAS3N$R>{rB9%2G1{CEad)8xx=p_MSx zid2JVtuqXE?7?x_<&$DZdFaLx_@_kEe+)QH0-=KQiQZ`6F8A&A`xnomVM` z#_L$8{5l-xF?pu)?9ZM(gX9C93m8Rh9O@c3c{ zR?=f^{LHxA{%xA;8m_>xV#p@}=iJOhFIobSYQoQ4{%({~R!`F*v>Z9tH3019r+ZiG zF6Wm3?L0Po^uFrl0^AvY3UMW%>e*Wn($b&CHwBjKuD?AW{Ce3Uynn!iX2@|zg zf7S7`VuJ`}hf;Kkl7GT4tv{#eyh=F{JBC>Wzi{1<`m^kHn`-aygr`Eapfhvo=81z8g_z}hwt*kpAPZ8T|?}C@?WU0caA&A#oDMS46$_nbw&Oh0@>Hd|IPm0a|G@ot{)^MwdWm~ZP$cYUT>u==ZzTGTz_`0 z_4^lQS?pgs|N8PTx%s$n{s4R3{CX4G?w?P(f8O}DG4)zHK7RfBz~xqo)XSegyV_>_YEcN^U+D{~Pppym`Ye(S7l0ay|Tz z4{A_K(D{*CPEIL$>dvc_@V_x;O0MiZz;Stz{F0jMASd4A;{IGLn3rp!uQh#LT zdp6?-a?z)Jj`j8P6L_+Bm0-Mn$Yw?NK&~IstL{mc`_{(?>JR)JqDMI>SH#cqAWyyi zI=|ioomVNb0Oy}_QkJRS8?MVyKR@5U^6K;bOA{gXwUV2U`{oa@uYg}yR@>)~_HA^$ ze?I>6%i}X*H0*Z!txS`rEI#cgs1mxqpC82^LXObz38moX;}JpgrTP^0@$1^LLu@_# zhJ@-{gQwW|wc+S(VB6lZ)XeX-zS`HX8~#Ca4FmqgkS0@f0*0}jUVq`X88^_>jh_tc z4kw09wfgxfBytHF6(K6Ux@>}&J;A&412_2ylJHZUX7I>Cu7Y2nW!wTkWh%*#ADRgr z4C2Sy(;^H~EE=-xtL7&=l-o1xU)7YK+bP3@EWbPO(@o0i)9{DST z^=F%wm1e4$rTEeUyaPW$Y|p{j=;FpTm4-IzrN4!@zc zv;H=I!w6{oo%X8=OU!!vc8O=1@HyH)P2VgVfn^D->{lkbf05!$R=!i~y5v26{CL<| zKgX)d?q5zw@#f~HB7m#pcT-ORu8$u|^roo>;EeomPHCD{ph+K17@G}5bVjm!X|TD$ zOM@Ci0qP{}lhwE`9f;|VQPo~E1_M78uyM1De_!!RMP zH-0kZOFjRPxRQ$u5?)b_c#NISSM-rRuFv{j$mItcSSHY90g}~=sk7Ff+~@{6k%U|+ z#IDXbj(M9Wy25;4!(v2C&=e)T{fS}b*5>8M0@QR(Snfz%N=fU92sqAiO_zy|j;k

(^b literal 0 HcmV?d00001