From 4a5753ea2c090485263117929d6a734d4a669ec4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 19 Apr 2025 03:44:45 +1000 Subject: [PATCH 1/4] ... --- constants/EXE_Header.z80 | 2 +- constants/SP2000.inc | 2 ++ constants/dss_equ.inc | 5 +++-- constants/dss_errors.z80 | 8 ++++---- printf.asm | 0 5 files changed, 10 insertions(+), 7 deletions(-) mode change 100755 => 100644 printf.asm diff --git a/constants/EXE_Header.z80 b/constants/EXE_Header.z80 index 560588c..535695e 100644 --- a/constants/EXE_Header.z80 +++ b/constants/EXE_Header.z80 @@ -17,7 +17,7 @@ exe_header: WORD code_addr ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) WORD program_start ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) WORD stack_point ; 20-21 Адрес стека (Reg. SP) - IFDEF EXEinfoMACRO ; 22-512 Можно использовать под текст для выпендрёжа или не использовать + IFDEF EXEinfoMACRO ; 22-512 Можно использовать под текст для выпендрёжа или не использовать _mEXEinfo ENDIF ; ПРИМЕР: diff --git a/constants/SP2000.inc b/constants/SP2000.inc index 4bceb22..06bf712 100644 --- a/constants/SP2000.inc +++ b/constants/SP2000.inc @@ -843,6 +843,7 @@ FDD_0 EQU SYS_PAGE.FDD_0 .CYLINDL EQU FDD_0+3 .CYLINDH EQU FDD_0+4 .BytesPerSector EQU FDD_0+5 ;WORD B_P_S +.ID EQU .BytesPerSector + 1 FDD_1 EQU SYS_PAGE.FDD_1 .DISK EQU FDD_1+0 .F144 EQU .DISK @@ -852,6 +853,7 @@ FDD_1 EQU SYS_PAGE.FDD_1 .CYLINDL EQU FDD_1+3 .CYLINDH EQU FDD_1+4 .BytesPerSector EQU FDD_1+5 ;WORD B_P_S +.ID EQU .BytesPerSector + 1 ENDMODULE ; diff --git a/constants/dss_equ.inc b/constants/dss_equ.inc index 5bffad7..7581d56 100644 --- a/constants/dss_equ.inc +++ b/constants/dss_equ.inc @@ -273,6 +273,7 @@ Dss: MODULE DSS_Error sys: .NO_ERROR EQU #00 ; 0 - нет ошибок +.Unknown_Error EQU #00 ; .INVALID_FUNCTION EQU #01 ; 1 - неверный номер функции .INVALID_DRIVE EQU #02 ; 2 - неправильный номер устройства .FILE_NOT_FOUND EQU #03 ; 3 - файл не обнаружен @@ -302,10 +303,10 @@ sys: ;.GENERAL_FAILURE EQU #1B ; 27 - общая ошибка .DRIVE_FAILURE EQU #1B ; 27 - сбой диска .MEDIA_CHANGED EQU #1C ; 28 - смена носителя -;.RESERVED_29 EQU #1D ; 29 - зарезервирован +.BUSY_NO_MEDIA EQU #1D ; 29 - Устройство занято или носитель не читается (нет носителя) .NOT_ENOUGH_MEMORY EQU #1E ; 30 - недостаточно памяти .INVALID_MEMORY_HND EQU #1F ; 31 - несуществующий блок памяти -;.RESERVED_32 EQU #20 ; 32 - зарезервировано +.NOT_SUPPORTED EQU #20 ; 32 - Операция не поддерживается .ENV_ITEM_OVERFLOW EQU #21 ; 33 - превышен максимальный размер переменной ;.RESERVED_34 EQU #22 ; 34 - зарезервировано .TOO_MANY_FILES_IN_DIR EQU #23 ; 35 - слишком много файлов в директории diff --git a/constants/dss_errors.z80 b/constants/dss_errors.z80 index 11b71d8..678fc68 100644 --- a/constants/dss_errors.z80 +++ b/constants/dss_errors.z80 @@ -23,7 +23,7 @@ SYS_ERRORS: DB #00 DZ "Invalid filename" ; 16 - неверное имя DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен + DZ "Access denied" ; 19 - Доступ запрещен DZ "Not ready" ; 20 - нет готовности DZ "Seek error" ; 21 - ошибка позиционирования DZ "Sector not found" ; 22 - сектор не найден @@ -33,10 +33,10 @@ SYS_ERRORS: DB #00 DZ "Write error" ; 26 - ошибка записи DZ "Drive failure" ; 27 - сбой диска DZ "Warning! Media changed" ; 28 - Media changed - DZ "E29" ; 29 - Reserved + DZ "Device busy or media unreadable" ; 29 - Device busy or media unreadable DZ "Not enough memory" ; 30 - недостаточно памяти DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "E32" ; 32 - Reserved + DZ "Operation not supported" ; 32 - Операция не поддерживается DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной DZ "E34" ; 34 - Reserved DZ "Too many files in directory" ; 35 - слишком много файлов в директории @@ -61,7 +61,7 @@ SYS_ERRORS: DB #00 ;----------------------------------------------------------------------- ; ошибки драйверов накопителей DRV_ERRORS: DB #00 - DZ "No errors" ; 000 - NO ERRORS + DZ "e0" ; 000 - NO ERRORS DZ "Bad command" ; 001 - BAD COMMAND DZ "Bad drive number" ; 002 - BAD DRIVE NUMBER DZ "Unknown format" ; 003 - UNKNOW FORMAT diff --git a/printf.asm b/printf.asm old mode 100755 new mode 100644 From be6067585059da92ec2674091bedf341e9219f09 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 23 Apr 2025 02:39:28 +1000 Subject: [PATCH 2/4] ... --- constants/SP2000.inc | 4 +-- structures/ATA_ATAPI.INC | 54 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/constants/SP2000.inc b/constants/SP2000.inc index 06bf712..ca6282d 100644 --- a/constants/SP2000.inc +++ b/constants/SP2000.inc @@ -771,8 +771,8 @@ SYS_PAGE EQU #FE //░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ .MS_BPB EQU #C400 ; буфер BPB //░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ -; IDENTIFY ATA buffer -.HD_IDF_ADR EQU #C600 ; !FIXIT структурой сделать!!! +; IDENTIFY ATA buffer ; !FIXIT структурой сделать!!! +.HD_IDF_ADR EQU #C600 ; с чётного адреса. Используется в HDD_PROG tr-dos .HD_IDF_ADR.sec_cyl EQU .HD_IDF_ADR+4 .HD_IDF_ADR.heads EQU .HD_IDF_ADR+6 ; Number of heads .HD_IDF_ADR.sectors EQU .HD_IDF_ADR+12 ; Number of sectors per track diff --git a/structures/ATA_ATAPI.INC b/structures/ATA_ATAPI.INC index 19c7d09..147991d 100644 --- a/structures/ATA_ATAPI.INC +++ b/structures/ATA_ATAPI.INC @@ -648,4 +648,56 @@ Description 08h - 1Eh Reserved 1Fh Unknown or no device type The Peripheral Device Type shall be set to 05h to indicate a CD-ROM Device. -*/ \ No newline at end of file +*/ + +/* ZIP DRIVE +Если на приводе нажата кнопка выброса, то получить эту информация можно отправив ATAPI команду 06 - MODE NON SENSE +2-й байт 2-й страницы == 1 если нажат eject, 0 если не нажат. + * ZIP100 CMD - 06h + * Three pages: + * 00 - 6 bytes + * 01 - 88 bytes + * 02 - 64 bytes - ZIP disk id + +const uint8_t zip_disk_100[3][88] = { + { 0x00, 0x04, 0x00, 0x01, 0x02, 0x03 }, + { 0x01, 0x56, 0x01, 0x00, 0x00, 0x02, 0x06, 0x48, 0x06, 0x01, 0x06, 0x48, 0x06, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x18, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x02, 0x3e, 0x00, 0x02, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7e, 0x00, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x30, 0x34, 0x35, 0x31, 0x30, 0x32, 0x34, 0x33, 0x35, + 0x35, 0x33, 0x39, 0x39, 0x30, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x49, 0x50, 0x31, 0x20, 0x20, + 0x20, 0x4b, 0x41, 0x41, 0x32, 0x31, 0x30, 0x30, 0x45, 0x33, 0x31, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x00, 0x12 } + }; + + +const uint8_t zip_disk_250[3][88] = { + { 0x00, 0x04, 0x00, 0x01, 0x02, 0x03 }, + { 0x01, 0x56, 0x02, 0x00, 0x00, 0x00, 0x12, 0xf6, 0x12, 0x2e, 0x12, 0xf6, 0x12, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x17, 0x01, + 0x10, 0x00, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x01, 0x0f, 0x3e, 0x24, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x17, 0x29, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00 }, + { 0x02, 0x3e, 0x00, 0x02, 0x00, 0x00, 0x07, 0x78, 0x3b, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x31, 0x39, 0x39, + 0x33, 0x35, 0x31, 0x38, 0x31, 0x32, 0x37, 0x31, 0x30, 0x30, 0x30, 0x32, + 0x37, 0x30, 0x33, 0x5a, 0x49, 0x50, 0x32, 0x20, 0x20, 0x20, 0x41, 0x41, + 0x41, 0x41, 0x53, 0x30, 0x36, 0x36, 0x33, 0x76, 0x47, 0x20, 0x20, 0x20, + 0x20, 0x10, 0x10 } + }; + +Сигнализировать приводу отдать дискету можно через проприетарную команду 0x0D, в третьем байте установить флаг. (У меня в коде все наоборот) +Если конечно отдача дискеты не заблокирована командой "0x1E: // PREVENT/ALLOW MEDIUM REMOVAL" +// ZIP VENDOR SPECIFIC +// (0d 00 0a 01 00 00 00 00 00 00 00 00 00 - Eject disk if not prohibited) +// (0d 00 0a 00 00 00 00 00 00 00 00 00 00 - Clear Eject flag) + uint8_t eject = packet[3]; + log_debug("ZIP disk eject: %s\n",eject?"EJECT":"CLEAR EJECT"); + */ \ No newline at end of file From e0dd54cb5615a23ea55bd217578aab57481fcf77 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 24 Apr 2025 00:24:29 +1000 Subject: [PATCH 3/4] ... --- constants/SP2000.inc | 90 ++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/constants/SP2000.inc b/constants/SP2000.inc index ca6282d..db7f7da 100644 --- a/constants/SP2000.inc +++ b/constants/SP2000.inc @@ -36,6 +36,50 @@ .ID_2 _ZX_TASK_DATA .ID_3 _ZX_TASK_DATA ENDS + +; MODULE FDD_INIT_TABLE +; FDD EQU 3 +; FDD_0 EQU SYS_PAGE.FDD_0 +; .DISK EQU FDD_0+0 +; .F144 EQU .DISK +; .SECTORS EQU FDD_0+1 +; .MS_SECS EQU .SECTORS +; .HEADS EQU FDD_0+2 +; .CYLINDL EQU FDD_0+3 +; .CYLINDH EQU FDD_0+4 +; .BytesPerSector EQU FDD_0+5 ;WORD B_P_S +; .ID EQU .BytesPerSector + 2 +; ; FDD_1 EQU SYS_PAGE.FDD_1 +; ; .DISK EQU FDD_1+0 +; ; .F144 EQU .DISK +; ; .SECTORS EQU FDD_1+1 +; ; .MS_SECS EQU .SECTORS +; ; .HEADS EQU FDD_1+2 +; ; .CYLINDL EQU FDD_1+3 +; ; .CYLINDH EQU FDD_1+4 +; ; .BytesPerSector EQU FDD_1+5 ;WORD B_P_S +; ; .ID EQU .BytesPerSector + 1 +; ENDMODULE +; + STRUCT FDD_1440_TABLE +.DISK BYTE #80 ;FDD_0+0 ; bit0 - fdd number, bit7 - 720/1440 +.SECTORS BYTE #12 ;FDD_0+1 +.HEADS BYTE #02 ;FDD_0+2 +.CYLINDL BYTE #50 ;FDD_0+3 +.CYLINDH BYTE #00 ;FDD_0+4 +.BytesPerSector WORD #0200 ;FDD_0+5 ;WORD B_P_S +.ID BYTE #03 ;.BytesPerSector + 2 + ENDS +; + STRUCT FDD_720_TABLE +.DISK BYTE #00 ;FDD_0+0 ; bit0 - fdd number, bit7 - 720/1440 +.SECTORS BYTE #09 ;FDD_0+1 +.HEADS BYTE #02 ;FDD_0+2 +.CYLINDL BYTE #50 ;FDD_0+3 +.CYLINDH BYTE #00 ;FDD_0+4 +.BytesPerSector WORD #0200 ;FDD_0+5 ;WORD B_P_S +.ID BYTE #03 ;.BytesPerSector + 2 ; хер его знает, что за параметр + ENDS ;███████████████████████████████████████████████████████████████████████████████████████████████████████; @@ -740,9 +784,12 @@ SYS_PAGE EQU #FE .IDE_3 EQU #C1D0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;======================================================================= -.FDD_0 EQU #C1E0 -.FDD_1 EQU #C1E8 -.FDD_TBL.Size EQU #10 +;.FDD_0 EQU #C1E0 +.FDD_TABLE FDD_1440_TABLE = #C1E0 +.FDD_TABLE.Size EQU FDD_1440_TABLE +;.FDD_1 EQU #C1E8 +;.FDD_1_TABLE: FDD_720_TABLE = #C1E8 +;.FDD_TBL.Size EQU #10 ; ; копии рамдисков для переключения между режимами Spectrum / Sprinter .Sp_RAMD_KEYS EQU #C1F0 @@ -820,43 +867,6 @@ SYS_PAGE EQU #FE ; -; STRUCT FDD_INIT_TABLE -; DISK BYTE 0 -; F144 EQU FDD_0+0 -; SECTORS EQU FDD_0+1 -; MS_SECS EQU .SECTORS -; HEADS EQU FDD_0+2 -; CYLINDL EQU FDD_0+3 -; CYLINDH EQU FDD_0+4 -; B_P_S EQU FDD_0+5 -; ENDS - -; - MODULE FDD_INIT_TABLE ; !FIXIT таблицы для FDD устройств 32 байта. привязаться к структуре выше -FDD EQU 3 ; ????? хер его знает, что за параметр, разобраться -FDD_0 EQU SYS_PAGE.FDD_0 -.DISK EQU FDD_0+0 -.F144 EQU .DISK -.SECTORS EQU FDD_0+1 -.MS_SECS EQU .SECTORS -.HEADS EQU FDD_0+2 -.CYLINDL EQU FDD_0+3 -.CYLINDH EQU FDD_0+4 -.BytesPerSector EQU FDD_0+5 ;WORD B_P_S -.ID EQU .BytesPerSector + 1 -FDD_1 EQU SYS_PAGE.FDD_1 -.DISK EQU FDD_1+0 -.F144 EQU .DISK -.SECTORS EQU FDD_1+1 -.MS_SECS EQU .SECTORS -.HEADS EQU FDD_1+2 -.CYLINDL EQU FDD_1+3 -.CYLINDH EQU FDD_1+4 -.BytesPerSector EQU FDD_1+5 ;WORD B_P_S -.ID EQU .BytesPerSector + 1 - ENDMODULE -; - ; STRUCT BIOS_DATE_FORMAT ; !FIXIT переделать под структуру все переменные #FE hour BYTE From a6c50f572424e88f6199d639fa8109d53b71142c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 26 Apr 2025 02:13:49 +1000 Subject: [PATCH 4/4] ... --- constants/dss_equ.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/constants/dss_equ.inc b/constants/dss_equ.inc index 7581d56..55cabd4 100644 --- a/constants/dss_equ.inc +++ b/constants/dss_equ.inc @@ -140,6 +140,8 @@ Dss: .K_SETUP.SetLayout EQU 0*256 + .K_SETUP .K_SETUP.GetSoundVars EQU 1*256 + .K_SETUP .K_SETUP.SetSoundVars EQU 2*256 + .K_SETUP +.K_SETUP.ShowCursor EQU 3*256 + .K_SETUP +.K_SETUP.HideCursor EQU 4*256 + .K_SETUP .TestKey EQU #37 ; ; Memory