diff --git a/Shared_Includes b/Shared_Includes index be5eed4..83c2b69 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit be5eed466fa1c0e442b828a42ffc1b9abda23ac9 +Subproject commit 83c2b69b4af0a36475fa42378000fb6e57c59021 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 063881c..dfcd642 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -677,16 +677,15 @@ TAB_5xFNS: ;************************************ ; Вход в функцию по RST18 и RST8 -EXP_FNS_RST18: - PUSH HL - LD L,C - LD H,high TAB_FNS - LD C,(HL) - INC H - LD H,(HL) - LD L,C - EX (SP),HL - RET +EXP_FNS_RST18: PUSH HL + LD L,C + LD H,high TAB_FNS + LD C,(HL) + INC H + LD H,(HL) + LD L,C + EX (SP),HL + RET ; ATA_5x_RESET ; ATA_5x_LONG_READ @@ -704,50 +703,39 @@ EXP_FNS_RST18: ; FN_RESERVED_5x ; DRV_LIST -FN_5x_Parser_1: ; ATA_5x_RESET - LD C,#01 - JP FN_5x_Parser -FN_5x_Parser_2: ; ATA_5x_LONG_READ - LD C,#02 - JP FN_5x_Parser -FN_5x_Parser_3: ; ATA_5x_LONG_WRITE - LD C,#03 - JP FN_5x_Parser -FN_5x_Parser_4: ; ATA_5x_VERIFY - LD C,#04 - JP FN_5x_Parser -FN_5x_Parser_6: ; ATA_5x_WRITE - LD C,#06 - JP FN_5x_Parser -FN_5x_Parser_7: ; ATA_5x_DETECT - LD C,#07 - JP FN_5x_Parser -FN_5x_Parser_8: ; ATA_5x_GET_PAR - LD C,#08 - JP FN_5x_Parser -FN_5x_Parser_9: ; ATA_5x_SET_PAR - LD C,#09 - JP FN_5x_Parser -FN_5x_Parser_E: ; DRV_EXTENDED - LD C,#0E - JP FN_5x_Parser -FN_5x_Parser_5: ; ATA_5x_READ - LD C,5 -FN_5x_Parser: - PUSH HL - LD H,A - AND #F0 - OR C - ; тут в A номер УСТРОЙСТВА + НОМЕР ФУНКЦИИ - LD L,A - LD A,H - LD H,high TAB_5xFNS - LD C,(HL) - INC H - LD H,(HL) - LD L,C - EX (SP),HL - RET +FN_5x_Parser_1: LD C,#01 ; ATA_5x_RESET + JR FN_5x_Parser +FN_5x_Parser_2: LD C,#02 ; ATA_5x_LONG_READ + JR FN_5x_Parser +FN_5x_Parser_3: LD C,#03 ; ATA_5x_LONG_WRITE + JR FN_5x_Parser +FN_5x_Parser_4: LD C,#04 ; ATA_5x_VERIFY + JR FN_5x_Parser +FN_5x_Parser_6: LD C,#06 ; ATA_5x_WRITE + JR FN_5x_Parser +FN_5x_Parser_7: LD C,#07 ; ATA_5x_DETECT + JR FN_5x_Parser +FN_5x_Parser_8: LD C,#08 ; ATA_5x_GET_PAR + JR FN_5x_Parser +FN_5x_Parser_9: LD C,#09 ; ATA_5x_SET_PAR + JR FN_5x_Parser +FN_5x_Parser_E: LD C,#0E ; DRV_EXTENDED + JR FN_5x_Parser +FN_5x_Parser_5: LD C,5 ; ATA_5x_READ +FN_5x_Parser: PUSH HL + LD H,A + AND #F0 + OR C + ; тут в A номер УСТРОЙСТВА + НОМЕР ФУНКЦИИ + LD L,A + LD A,H + LD H,high TAB_5xFNS + LD C,(HL) + INC H + LD H,(HL) + LD L,C + EX (SP),HL + RET ; Вход в функции БИОС из TR-DOS EXP_FNS:; отключаем запись в экран спектрума diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 406f2c1..748eff1 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -767,7 +767,7 @@ POST_5_OK: ; Don't use IY before this point if it`s normal booting!!! LD IX,0 XOR A - ADD IX,SP ; восстановить значение переданное загрузчиком конфы (если старт после ресета) + ADD IX,SP ; восстановить значение переданное загрузчиком конфы (если старт после ресета) ; В этом месте у нас IX:IY из Loader.asm ; Дотащили до сюда метку от лоадера ;[x] 31/12/2023 подстраховка от недоутечки памяти @@ -788,7 +788,7 @@ POST_5_OK: JR NZ,.no_conf_reload LD A,#80 .no_conf_reload: - LD R,A ; reg R bit7 - признак работы лоадера + LD R,A ; reg R bit7 - признак запуска с отработкой лоадера конфы ; ; на всякий случай LD HL,ACEX.Config_ID.Sp2000 @@ -881,24 +881,24 @@ No_Reset_handlers: ;-----------------------------------------------------------------------; MODULE Prepare_For_Setup -Set_ALL_Mode: LD A,Port_All_Mode.DEFAULT - LD BC,Port_All_Mode - OUT (C),A +Set_ALL_Mode: LD A,Port_All_Mode.DEFAULT + LD BC,Port_All_Mode + OUT (C),A Set_Default_Screen: - CALL FN_SYNC.INT_DEF ; set default int - ld a,128+4 ; !HARDCODE - CALL FN_SYNC ; set default vsync -Setup_to_RAM: LD HL,Setup_Starter.Start - LD DE,COMPILE_ADDR.SETUP_STARTER - LD BC,Setup_Starter.Size + CALL FN_SYNC.INT_DEF ; set default int + LD A,128+4 ; !HARDCODE + CALL FN_SYNC ; set default vsync +Setup_to_RAM: LD HL,Setup_Starter.Start + LD DE,COMPILE_ADDR.SETUP_STARTER + LD BC,Setup_Starter.Size LDIR ; на стек кладётся адрес возврата и дальше тащится всякими костылями, чтоб вернуться назад - CALL Setup_Starter.Exec ; #C000 + CALL Setup_Starter.Exec ; #C000 ;JP PrepareToZX ENDMODULE -PrepareToZX: ; Setup HDD drives for ZX Spectrum mode +;PrepareToZX: ; Setup HDD drives for ZX Spectrum mode ; DI ; LD D,CMOS_CELL.TRDOSmount ; CALL CMOS_RD @@ -1052,8 +1052,8 @@ PORTS_INIT: OUT (C),A ; глушим ковокс XOR A - OUT (CBL.SYS_PORT),A - LD BC,CBL.OUT + OUT (SP_SND.CBL.SYS_PORT),A + LD BC,SP_SND.CBL.OUT LD A,#80 .CBL_MUTE: OUT (C),A DJNZ .CBL_MUTE @@ -1556,7 +1556,7 @@ BEEP: LD A,#10 JR NZ,BEEP RET ; -.beep_loop: OUT (ZX_Beeper),A +.beep_loop: OUT (SP_SND.Beeper),A LD B,D LD C,E ; diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 1c209ae..40ca74d 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -181,7 +181,7 @@ ATAPI_5x_READ: ;PUSH IY ; !FIXIT EX AF,AF' IN A,(SLOT3) EX AF,AF' - JP ATAPI_5x_LONG_READ.main + JR ATAPI_5x_LONG_READ.main ;[]================================================================[#52] ;Function: Long Read Sectors ; A - Disk @@ -198,17 +198,19 @@ ATAPI_5x_LONG_READ: ; ;PUSH IY ; !FIXIT зачем? LD C,1 ; признак long -.main: SAFE_PORTY_2 - PUSH BC - PUSH IX - PUSH HL +.main: EX AF,AF' + AND A ;read + EX AF,AF' + JR ATAPI_BEGIN_RW ; - EX AF,AF' - AND A ;read - EX AF,AF' - CALL RW_ATAPI_SECTORs - ; [ ] sector size. media changed - JP ATA_5x_LONG_READ.shared + ; SAFE_PORTY_2 + ; PUSH BC + ; PUSH IX + ; PUSH HL + ; ; + ; CALL RW_ATAPI_SECTORs + ; ; [ ] sector size. media changed + ; JP ATA_5x_LONG_READ.shared ; JP NC,ATA_5x_LONG_READ.shared ; CP BIOS.Error.UnitAttention ; JR Z,ATAPI_MEDIA_ERROR @@ -278,6 +280,15 @@ RW_ATAPI_SECTORs: ;[]===========================================================[#52, #55] +ATAPI_BEGIN_RW: SAFE_PORTY_2 + PUSH BC + PUSH IX + PUSH HL + ; + CALL RW_ATAPI_SECTORs + ; + JP ATA_5x_LONG_READ.shared + ;[]================================================================[#56] ;Function: Write Sectors ; A - Disk @@ -289,11 +300,14 @@ RW_ATAPI_SECTORs: ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) ATAPI_5x_WRITE: ;PUSH IY ; !FIXIT зачем? - LD C,0 ; признак short + ; проба бага + LD C,0 ; признак short + ;LD C,1 ; признак long + ; EX AF,AF' IN A,(SLOT3) EX AF,AF' - JP ATAPI_5x_LONG_WRITE.main + JR ATAPI_5x_LONG_WRITE.main ;[]================================================================[#53] ;Function: Long Write Sectors ; A - Disk @@ -310,17 +324,19 @@ ATAPI_5x_LONG_WRITE: ; ;PUSH IY ; !FIXIT зачем? LD C,1 ; признак long -.main: SAFE_PORTY_2 - PUSH BC - PUSH IX - PUSH HL +.main: EX AF,AF' + SCF ;write + EX AF,AF' + JR ATAPI_BEGIN_RW ; - EX AF,AF' - SCF ;write - EX AF,AF' - CALL RW_ATAPI_SECTORs - ; - JP ATA_5x_LONG_READ.shared + ; SAFE_PORTY_2 + ; PUSH BC + ; PUSH IX + ; PUSH HL + ; ; + ; CALL RW_ATAPI_SECTORs + ; ; + ; JP ATA_5x_LONG_READ.shared ;[]================================================================[#57] ;Function: Detect Disk @@ -607,9 +623,10 @@ EXEC_PACKET_COMMAND: ; POP BC OUT (C),B - ; - LD B,#80 -.pause2: DJNZ .pause2 + ; pause + LD B,0 + DJNZ $ + ; DJNZ $ ; EX AF,AF' LD XH,A ; страница для R/W_LONG @@ -617,7 +634,9 @@ EXEC_PACKET_COMMAND: EX AF,AF' EX DE,HL ; -.AP_LOOP: CALL ATAPI_CHECK_DRV +.AP_LOOP: ;LD B,128 + ;DJNZ $ + CALL ATAPI_CHECK_DRV JP C,.error;_APLOOP RET Z ;====== IF DATA REQUEST ===============================================; @@ -626,23 +645,6 @@ EXEC_PACKET_COMMAND: ; LD A,XH OUT (SLOT3),A - ; - ;LD BC,IDE.Read.ByteCountLow - ;IN E,(C) - ;INC C ;LD BC,IDE.Read.ByteCountHigh - ;IN D,(C) ;TRANSFER BLOCK SIZE - ;; - ;LD A,D - ;OR E - ;RET Z ;BLOCK = 0 - ;; уменьшаем счётчик загружаемых байтов в 2 раза. Читаем по 2 байта - ;SRL D - ;RR E - ;; - ;LD BC,IDE.Read.InterruptReason - ;IN A,(C) - ;AND IDE.InterruptReasonByte.IO - ;LD BC,IDE.Read.Data CALL ATAPI_PREPARE_RW RET NC JR Z,.WRITE_DATA @@ -688,24 +690,7 @@ ATAPI_IdlePasses: JP C,EXEC_PACKET_COMMAND.error JP Z,EXEC_PACKET_COMMAND.error_fail ; -.Enter: ;LD BC,IDE.Read.ByteCountLow - ;IN E,(C) - ;INC C ;LD BC,IDE.Read.ByteCountHigh - ;IN D,(C) ;TRANSFER BLOCK SIZE - ;; - ;LD A,D - ;OR E - ;RET Z ;BLOCK = 0 - ;; - ;; уменьшаем счётчик загружаемых байтов в 2 раза. Читаем по 2 байта - ;SRL D - ;RR E - ;; - ;LD BC,IDE.Read.InterruptReason - ;IN A,(C) - ;AND IDE.InterruptReasonByte.IO - ;LD BC,IDE.Read.Data - CALL ATAPI_PREPARE_RW +.Enter: CALL ATAPI_PREPARE_RW RET NC JR Z,.write_data ; @@ -737,6 +722,7 @@ ATAPI_IdlePasses: ATAPI_CHECK_DRV: ;EX DE,HL EXX + ;CALL .zeroWait CALL ATAPI_WAITPRT EXX ; ZF=1 @@ -764,9 +750,25 @@ ATAPI_CHECK_DRV: JP Z,ATAPI_MEDIA_ERROR CP BIOS.Error.ATAPI.UnitAttention JP Z,ATAPI_MEDIA_ERROR + ; + ;CP BIOS.Error.ATAPI.IllegalRequest + ;RET Z + ; SCF RET ; +; .zeroWait: ;LD B,2 +; LD HL,#800 +; .loop: LD A,high IDE.Read.Status +; IN A,(low IDE.Read.Status) +; AND A +; RET NZ +; DEC HL +; LD A,H +; OR L +; JR NZ,.loop +; ;DJNZ .loop +; RET ATAPI_PREPARE_RW: LD BC,IDE.Read.ByteCountLow @@ -836,9 +838,9 @@ ATAPI_GET_ERROR_REG: ; !!! некоторые функции надеются, что на выходе всегда ZF ; не должна трогать рег. C ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 -.Custom: LD B,100 +.Custom: LD B,6 ; 3 = общая задержка около секунды LD HL,#0000 - ; + ; 4 128 768 .LOOP: LD A,high IDE.Read.Status IN A,(low IDE.Read.Status) CP #FF @@ -852,13 +854,59 @@ ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 LD A,H OR L JR NZ,.LOOP + ; + ; LD A,high IDE.Read.Status + ; IN A,(low IDE.Read.Status) + ; CP #FF + ; SCF + ; RET Z + ; + ; 1 392 512 256 DJNZ .LOOP + ; + ; LD A,high IDE.Read.Status + ; IN A,(low IDE.Read.Status) + ; INC A ;CP #FF + ; SCF + ; RET Z + ; LD A,BIOS.Error.Busy -.error: SCF + RET + ; +.error: SCF RET ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; D - MASK, E - PATTERN +; !!! некоторые функции надеются, что на выходе всегда ZF +; не должна трогать рег. C +; ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 +; .Custom: +; .LOOP: LD A,high IDE.Read.Status +; IN A,(low IDE.Read.Status) +; CP #FF +; JR Z,.error +; ; +; AND D +; CP E +; RET Z +; JR .LOOP +; ; +; ; LD A,high IDE.Read.Status +; ; IN A,(low IDE.Read.Status) +; ; INC A ;CP #FF +; ; SCF +; ; RET Z +; ; ; +; ; LD A,BIOS.Error.Busy +; ; RET +; ; +; .error: SCF +; RET +;----------------------------------------------------------------------; + ;----------------------------------------------------------------------; ; DE - buffer ATAPI_READ_CAPACITY_DATA: diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index ac1e3d2..304df85 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -119,7 +119,7 @@ RESERVED_PAGES: ;[x] free zx pages! DB #58,#59,#5A,#5B,#5C,#5D,#5E,#5F ; ;DB MODE_PAGE ; ????? - DB CBL.BUFFER_PAGE ; Page for CBL audio + DB SP_SND.CBL.BUFFER_PAGE ; Page for CBL audio DB SYS_PAGE ; Page for system (BIOS) variables DB #FF ; End of the block ; diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index 4116d74..a766644 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -72,7 +72,7 @@ RST_CONF: LD A,#80 JR Z,.YES_CBL XOR A -.YES_CBL: LD BC,CBL.SYS_PORT +.YES_CBL: LD BC,SP_SND.CBL.SYS_PORT OUT (C),A ; LD A,E ; config-byte diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 04643f5..1a66800 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -163,12 +163,10 @@ EMM.CheckColdInit: INC HL INC DE DJNZ .loop - ; Disable user IM address in SYS_PAGE XOR A LD (SYS_PAGE.INT_ID - #4000),A ; - EX AF,AF' OUT (SLOT2),A RET diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 10b58de..c6a76d2 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -397,7 +397,8 @@ SETUP_FROM_CMOS: ; RET /////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[v] -IDESPEC: IN A,(SLOT3) +PARSE_IdentifyDevice: + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A @@ -440,11 +441,7 @@ IDESPEC: IN A,(SLOT3) ; LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A - IF IDE_Optimization - LD B,high IDE.Write.Counter - ELSE - LD BC,IDE.Write.Counter - ENDIF + LD B,high IDE.Write.Counter OUT (C),A LD A,IDE.CMD.ATA.InitializeDeviceParameters CALL IDE_CMD @@ -460,7 +457,8 @@ IDESPEC: IN A,(SLOT3) ; LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H -.END: ; [x] save hdd parameters to cmos for "setup" in settings +.END: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media + ; [x] save hdd parameters to cmos for "setup" in settings LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ; for save to cmos in GETPARM ; EX AF,AF' @@ -474,19 +472,22 @@ IDESPEC: IN A,(SLOT3) LD HL,ICHANEL OR (HL) LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A + ; + ; ; на всякий случай LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 LD B,100 ; счётчик попыток (1 попытка - 1 HALT) .get_error_loop: PUSH BC ;LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY ;CALL EXEC_PACKET_COMMAND.start - CALL EXEC_TEST_CMD + CALL EXEC_TEST_CMD POP BC JR NC,.s_size ; - RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media CP BIOS.Error.ATAPI.UnitAttention - JR Z,IDESPEC.END + JR Z,PARSE_IdentifyDevice.END ;!TEST ;!FIXIT ZIP bug + ;JR Z,.TEST_SET + ; HALT DJNZ .get_error_loop @@ -508,9 +509,59 @@ IDESPEC: IN A,(SLOT3) ; .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L - RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media ; - JR IDESPEC.END + JR PARSE_IdentifyDevice.END ;!TEST ;!FIXIT ZIP bug + ; +/* +;====; ;!TEST ;!FIXIT ZIP bug +.TEST_SET: LD HL,.MODE_SENSE + LD DE,SYS_PAGE.MS_BPB ; просто нужен был буфер + LD BC,BIOS.DRV_EXTENDED.ATAPI_Custom_PCMD + CALL ATAPI_CUSTOM_CMD + JR NC,.OK_DONE + ; + LD A,COLORS.CGA.BORDER.CYAN + OUT (BorderColor),A + JR .go_exit + ; +.OK_DONE: LD A,(SYS_PAGE.MS_BPB + 2) + AND A + JR NZ,.go_exit + ; + LD (SYS_PAGE.MS_BPB + 10),A + LD HL,(SYS_PAGE.MS_BPB) + LD (.MODE_SELECT.Size),HL + LD HL,.MODE_SELECT + LD DE,SYS_PAGE.MS_BPB ; просто нужен был буфер + LD BC,BIOS.DRV_EXTENDED.ATAPI_Custom_PCMD + CALL ATAPI_CUSTOM_CMD + JR NC,.go_exit + ; + LD A,COLORS.CGA.BORDER.GREEN + OUT (BorderColor),A + ;JR .go_exit + ; +.go_exit: AND A + JP PARSE_IdentifyDevice.END + ; + ; + +.MODE_SENSE: BYTE #5A + BYTE #08 +.MODE_SENSE.Page: BYTE #08 ;bit7..6 - Page Control, bit5..0 - Page Code + BLOCK 4,0 + BYTE #02,#00 + BLOCK 3,0 + ; +.MODE_SELECT: BYTE #55 + BYTE #08 +.MODE_SELECT.Page: BYTE #08 ;bit7..6 - Page Control, bit5..0 - Page Code + BLOCK 4,0 +.MODE_SELECT.Size: BYTE #02,#00 + BLOCK 3,0 + ; +;====; ;!TEST +*/ ; /////////////////////////////////////////////////////////////////////[^] @@ -761,7 +812,7 @@ GETPARAM: LD HL,PAUSES.WAIT.IDE LD HL,IDENTIFY_DEVICE_BUFFER INIR INIR - CALL IDESPEC + CALL PARSE_IdentifyDevice ; [x] save hdd parameters to cmos for "setup" in settings CALL SaveToCMOS AND A diff --git a/src/bios/rom/SETUP/IM2_INT.asm b/src/bios/rom/SETUP/IM2_INT.asm index 512791a..f923a6c 100644 --- a/src/bios/rom/SETUP/IM2_INT.asm +++ b/src/bios/rom/SETUP/IM2_INT.asm @@ -17,32 +17,38 @@ INT_POINTER: WORD 0 ENDIF ENDIF -INT_HANDLER: - PUSH AF - EX AF,AF' - PUSH AF - PUSH BC - PUSH DE - PUSH HL - EXX - PUSH BC - PUSH DE - PUSH HL - PUSH IX - PUSH IY - CALL KEYSCAN - POP IY - POP IX - POP HL - POP DE - POP BC - EXX - POP HL - POP DE - POP BC - POP AF - EX AF,AF' - POP AF - EI - RETI +INT_HANDLER: PUSH AF + EX AF,AF' + PUSH AF + PUSH BC + PUSH DE + PUSH HL + EXX + PUSH BC + PUSH DE + PUSH HL + PUSH IX + PUSH IY + CALL KEYSCAN + ; + IF STARTUP_SND + SCF +.sndSwitch: CCF ; SCF/CCF + CALL C,STARTUP_SOUND + ENDIF + ; + POP IY + POP IX + POP HL + POP DE + POP BC + EXX + POP HL + POP DE + POP BC + POP AF + EX AF,AF' + POP AF + EI + RETI ; \ No newline at end of file diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 314eac8..c15361e 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -554,15 +554,17 @@ RESTART_ID: .str: DZ "RESTART" .size EQU $ - RESTART_ID.str -Start_again: - ld sp,STACK-2 -START: - DI - PUSH AF - XOR A - LD (ERRSUM),A - LD (ERRSUM.ErrDateTime),A +Start_again: LD SP,STACK-2 +START: DI + PUSH AF + XOR A + LD (ERRSUM),A + LD (ERRSUM.ErrDateTime),A + ; + LD A,R ; reg R bit7 - признак запуска с отработкой лоадера конфы (из SET_CONFIG_ID) + LD (LOGOTYPE.playSnd),A + ; ; LD C,#97 ; RST_to_BIOS_18 ; XOR A @@ -1598,7 +1600,9 @@ ElementsBuffer: .DownCenter: BYTE "┴" ; DC - DownCenter .Size EQU $-ElementsBuffer ; - + IF STARTUP_SND + INCLUDE 'startup_sound.asm' + ENDIF INCLUDE 'VIDEO_IO.asm' INCLUDE 'AUTOIDE.asm' INCLUDE 'SETTINGS.asm' diff --git a/src/bios/rom/SETUP/VIDEO_IO.asm b/src/bios/rom/SETUP/VIDEO_IO.asm index be66ec6..e20e038 100644 --- a/src/bios/rom/SETUP/VIDEO_IO.asm +++ b/src/bios/rom/SETUP/VIDEO_IO.asm @@ -290,22 +290,33 @@ PRSYM: LD B,1 //////////////////// LOGO \\\\\\\\\\\\\\\\\\\\ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOGOTYPE: CALL SHOW_LOGO + ; + IF STARTUP_SND +.playSnd+1: LD A,#80 + RLA + JR NC,.noSound + ; + LD A,#37 ; opcode SCF, play sound on + LD (INT_HANDLER.sndSwitch),A +.noSound: ; + ENDIF + ; LD BC,CMOS_CELL.BootUpParams.Mask.StartDelay CALL GET_CMOS_VALUE OR A - JR Z,.EASYDLY ; Delay average + JR Z,.MinDelay DEC A - JR Z,.SKIPDLY ; Delay disabled + JR Z,.AverageDelay ; Delay enabled LD B,LOGO_DELAY_NORM .loop EI push bc HALT - CALL go_setup + CALL go_setup pop bc DJNZ .loop ; Delay average -.SKIPDLY: LD B,LOGO_DELAY_MAX +.AverageDelay: LD B,LOGO_DELAY_MAX .MMA: PUSH BC EI HALT @@ -323,12 +334,17 @@ LOGOTYPE: CALL SHOW_LOGO DI CALL WIN_OPEN.SCR1 ; + IF STARTUP_SND + LD A,#3F ; opcode CCF, play sound off + LD (INT_HANDLER.sndSwitch),A + ENDIF + ; LD DE,0 LD HL,#0920 ;!HARDCODE LOGOTYPE SIZE LD B,7 JP LP_CLS_WIN ; Delay disabled -.EASYDLY: LD B,LOGO_DELAY_MIN +.MinDelay: LD B,LOGO_DELAY_MIN .loop2: EI HALT DJNZ .loop2 diff --git a/src/bios/rom/SETUP/startup_sound.asm b/src/bios/rom/SETUP/startup_sound.asm new file mode 100644 index 0000000..f4417a0 --- /dev/null +++ b/src/bios/rom/SETUP/startup_sound.asm @@ -0,0 +1,215 @@ +; CODE BY Александр -=TmK deMarche=- +; play frame +; use: af,hl,de,bc 251 +STARTUP_SOUND: LD HL,.BYTE_POS + LD A,(HL) + LD C,SP_SND.AY + CP .toneDataSize + 1 + JR C,.play + ;-- mus off + XOR A + LD E,A +.offLp: LD B,high SP_SND.AY.CTRL + OUT (C),A + LD B,high SP_SND.AY.DATA + OUT (C),E + INC A + CP 15 + JR NZ,.offLp + RET + ; +.play: LD DE,#0700+56 + LD B,high SP_SND.AY.CTRL + OUT (C),D + LD B,high SP_SND.AY.DATA + OUT (C),E + CP 33 + JR NC,.playVol + AND 3 + JR NZ,.playVol + ;--- play tone + LD HL,(.WORD_TONE) + ;A=0 +.playToneLp: LD B,high SP_SND.AY.CTRL + OUT (C),A + LD B,high SP_SND.AY.DATA + OUTI + INC A + CP 6 + JR NZ,.playToneLp + ; + LD (.WORD_TONE),HL +.playVol: LD HL,(.WORD_VOL) + LD A,8 + LD E,(HL) + INC HL +.playVolLp: LD B,high SP_SND.AY.CTRL + OUT (C),A + LD B,high SP_SND.AY.DATA + OUT (C),E + INC A + CP 11 + JR NZ,.playVolLp + ; + LD (.WORD_VOL),HL + LD HL,.BYTE_POS + INC (HL) + RET +;----------------------------------------------------------------------- +.BYTE_POS: DB 0 +.WORD_VOL: DW .volData +.WORD_TONE: DW .toneData +;----------------------------------------------------------------------- +.volData: ;DB 11,10,08,06,08,07,06,05 + ;DB 12,11,09,07,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 12,12,10,08,07,06,05,04 + DB 07,06,05,04,03,02,01,00 + DB 05,04,03,02,01,00,00,00 + DB 04,03,02,02,01,00,00,00 + DB 02,02,01,01,00,00,00,00 + +.toneData: DB 68,3,136,6,162,1 + DB 136,6,136,6,68,3 + DB 57,1,229,4,114,2 + ;DB 68,3,229,4,162,1 + ;DB 46,2,92,4,23,1 + ;DB 57,1,92,4,114,2 + ;DB 209,0,68,3,162,1 + ;DB 46,2,68,3,23,1 + ;DB 209,0,68,3,162,1 +.toneDataSize EQU $ - .toneData + +.codeEnd: DISPLAY "StartUp Sound size: ",/A,.codeEnd - STARTUP_SOUND + +; savesna "startup_sound.sna", #8000 + + + +/* + + + MODULE STARTUP_SOUND + DEFINE SND_VARIANT 2 ; 0, 1, 2 + + IF SND_VARIANT == 0 + DEFINE SND_Const1 15 + DEFINE SND_Const2 7 + ; + ELSEIF SND_VARIANT == 1 + DEFINE SND_Const1 15 + DEFINE SND_Const2 7 + ; + ELSEIF SND_VARIANT == 2 + DEFINE SND_Const1 14 + DEFINE SND_Const2 6 + ENDIF + +codeBegin: LD A,SND_Const1 + LD HL,.volData + LD DE,.sndData +.lp: CALL .snd + CALL .vol + CALL .vol + CALL .vol + DEC A + JP NZ,.lp + ;-- + LD DE,#07ff + LD B,E + OUT (C),D + LD B,#bf + OUT (C),E + RET +;---------------- +.snd: CALL .vol + CP SND_Const2 + RET C + ; +.sndEnd: EX AF,AF + EX DE,HL + PUSH DE + XOR A +.sndLp: LD B,#ff + OUT (C),A + LD B,#bf + OUTI + INC A + CP 6 + JR NZ,.sndLp + POP DE + EX DE,HL + EX AF,AF + RET +;---------------- +.vol: ;EI + ;HALT + EX AF,AF + PUSH DE + LD BC,#fffd + LD DE,#0700+56 + OUT (C),D + LD B,#bf + OUT (C),E + LD A,8 + LD E,(HL) + INC HL +.volLp: LD B,#ff + OUT (C),A + LD B,#bf + OUT (C),E + INC A + CP 11 + JR NZ,.volLp + POP DE + EX AF,AF + RET +;---------------- +.volData: + IF SND_VARIANT == 0 + DB 13,12,10,08,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 12,12,10,08,07,06,05,04 + DB 07,06,05,04,03,02,01,00 + DB 05,04,03,02,01,00,00,00 + DB 04,03,02,02,01,00,00,00 + DB 02,02,01,01,00,00,00,00 + ; + ELSEIF SND_VARIANT == 1 + DB 11,10,08,06,08,07,06,05 + DB 12,11,09,07,09,08,07,06 + DB 13,12,10,08,09,08,07,06 + DB 13,12,10,08,07,06,05,04 + DB 08,07,06,05,04,03,02,01 + DB 06,05,04,03,02,01,00,00 + DB 04,04,03,02,01,00,00,00 + DB 02,02,01,01,00,00,00,00 + ; + ELSEIF SND_VARIANT == 2 + DB 15,14,13,10,10,09,09,07 + DB 15,14,13,10,10,09,09,07 + DB 15,14,13,10,10,09,09,07 + DB 15,14,13,10,07,06,05,04 + DB 08,07,06,05,04,03,02,01 + DB 06,05,04,03,02,01,00,00 + DB 04,03,02,01,00,00,00,00 + ENDIF + + +.sndData: DB 68,3,136,6,162,1 + DB 136,6,136,6,68,3 + DB 57,1,229,4,114,2 + DB 68,3,229,4,162,1 + DB 46,2,92,4,23,1 + DB 57,1,92,4,114,2 + DB 209,0,68,3,162,1 + DB 46,2,68,3,23,1 + DB 209,0,68,3,162,1 + +codeEnd: DISPLAY "StartUp Sound size: ",/A,codeEnd-codeBegin + + ENDMODULE +*/ \ No newline at end of file diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index a8d2ccc..50529af 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -17,6 +17,7 @@ BETA_RC EQU 2 ; DEFINE LOGO_DELAY_NORM 100 ; DEFINE LOGO_DELAY_MAX 130 ; ;----------------------------[ TEST ]---------------------------; + DEFINE STARTUP_SND 1 ; DEFINE ERROR_POST_5 0 ; виснуть на ошибке в POST 5 DEFINE TEST_INT 1 ; Тестовый обработчик пользовательского INT DEFINE NEW_FEATURE 0 ; !TODO пункты в сетап diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index eee9238..148ed49 100644 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ