From c50040b71506cf220e9e1ee5c36e919e0b0ed682 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 29 Jul 2023 03:28:09 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 69 +++-- BOOT/boot.asm | 4 +- Console/CONSOLE.ASM | 171 ++++++------ DSS/DOS5.ASM | 2 +- DSS/DRV-MAIN.ASM | 278 ++++++++++++++----- DSS/DSS-MAIN.ASM | 50 +++- DSS/Media_drivers/fdd-drv.asm | 10 +- DSS/Media_drivers/ide-drv.asm | 427 ++++++++++++++++------------- DSS/Media_drivers/ram_disk-drv.asm | 4 +- DSS/Media_drivers/shared-drv.asm | 33 ++- DSS/VIDEO.ASM | 4 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 + Shared_Includes | 2 +- 14 files changed, 637 insertions(+), 421 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index ff46adf..b08db66 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -27,7 +27,7 @@ CDRIVE EQU #02 DRIVE: _mSYSID DI LD (DRIVE),A - LD C,BIOS.EXT_VERSION + LD C,BIOS.DRV_VERSION RST ToBIOS_18 LD A,INCORR JR C,FAIL @@ -35,7 +35,7 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,#0215 ; если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ; если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL @@ -47,7 +47,7 @@ GOOD_DRIVE: LD A,(DRIVE) RST ToBIOS_18 JR C,NULL - JP CONTINU + JP CONTINUE FAIL CALL MESSAGE NULL LD A,FAILURE @@ -131,7 +131,7 @@ STARTDO EQU 6 ; 0 10 20 30 40 50 60 70 80 MSG0: DB 0 DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 - DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10,0 + DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10 DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 DB "Invalid partition table.",13,10,0 DB "Invalid BOOT sector.",13,10,0 @@ -139,7 +139,7 @@ MSG0: DB 0 DB 13,10,"Starting DSS... ",13,10,13,10,0 MSGE DB 0 -CONTINU +CONTINUE: LD HL,0 LD (DISKL),HL LD (DISKH),HL @@ -178,7 +178,7 @@ CONTINU LD A,(DRIVE) LD C,#00 RST #10 - jp c,XFAIL + jp c,XFAIL.fail LD A,STARTDO CALL DOSMESS @@ -198,7 +198,7 @@ CONTINU LD A,(DRIVE) LD C,#00 RST #10 - jp c,XFAIL + jp c,XFAIL.fail ENDIF LD A,STARTDO @@ -238,14 +238,14 @@ DOSMESS CALL FMESAGE RST #10 RET -XFAIL CALL DOSMESS - LD A,FAILURE +XFAIL: CALL DOSMESS +.fail: LD A,FAILURE CALL DOSMESS DI HALT -.halt JR .halt +.halt: JR .halt -PART_TB PUSH BC +PART_TB: PUSH BC LD HL,(BOOT+510) LD DE,#AA55 AND A @@ -253,7 +253,7 @@ PART_TB PUSH BC JR NZ,ERRP LD IX,BOOT+#01BE LD B,4 -DOSAGA LD A,(IX+4) +DOSAGA: LD A,(IX+4) CP #0E JR Z,YEPDOS CP 6 @@ -263,14 +263,12 @@ DOSAGA LD A,(IX+4) CP 1 JR Z,YEPDOS LD DE,#10 -; ошибка в оригинале -; ADD IY,DE ADD IX,DE DJNZ DOSAGA -ERRP LD A,ERRPART +ERRP: LD A,ERRPART JP FAIL -YEPDOS LD E,(IX+08) +YEPDOS: LD E,(IX+08) LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) @@ -278,15 +276,15 @@ YEPDOS LD E,(IX+08) LD XL,E LD (DISKL),IX LD (DISKH),HL + LD A,(DRIVE) LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ - LD A,(DRIVE) RST ToBIOS_18 POP BC LD A,C RET -SET_PRM PUSH BC +SET_PRM: PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS_18 @@ -300,7 +298,7 @@ SET_PRM PUSH BC LD A,C RET -GET_BPB LD IX,#0000 +GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ @@ -315,7 +313,7 @@ GET_BPB LD IX,#0000 JR NZ,NX1 CALL PART_TB ;HDD RET C -NX1 CP #00 +NX1: CP #00 JR NZ,NX2 CALL SET_PRM ;FDD NX2: LD HL,(BOOT+510) @@ -338,7 +336,7 @@ NX2: LD HL,(BOOT+510) LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BOOT.FAT_NUM) ;amount FATs -C_DATA1 ADD HL,DE +C_DATA1: ADD HL,DE DEC A JR NZ,C_DATA1 LD (DIR_FRM),HL ;first sector DIR @@ -362,7 +360,7 @@ C_DATA1 ADD HL,DE LD B,(IY+_sBOOT_SEC.B_P_S+1) LD HL,0 LD A,(BOOT.S_P_C) -NEXTAD3 +NEXTAD3: ADD HL,BC ;calc. cluster size DEC A JR NZ,NEXTAD3 @@ -371,16 +369,16 @@ NEXTAD3 LD HL,BOOT.ID_FAT LD DE,FATMSG LD B,3 -R_BPBL1 +R_BPBL1: LD A,(DE) CP (HL) JP NZ,IBMDOS_ INC HL INC DE DJNZ R_BPBL1 -FID LD A,(HL) +FID: LD A,(HL) INC HL - CP #20 + CP " " JR Z,FID CP "1" SCF @@ -425,12 +423,12 @@ IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) LD HL,#0FFF JR BPB_FAT -GETROOT LD HL,(DIR_FRH) +GETROOT: LD HL,(DIR_FRH) LD IX,(DIR_FRL) LD BC,(DISKL) LD DE,(DISKH) LD A,(DIR_S_S) -NEXTSEC PUSH AF +NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE ;HL:IX @@ -454,9 +452,9 @@ NEXTSEC PUSH AF SCF RET -SEARCH LD C,17 ;HANDELS PER SECTOR 512/32 + 1 +SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX,DIR-#0020 -SKIPNAM LD DE,#0020 +SKIPNAM: LD DE,#0020 ADD IX,DE DEC C RET Z @@ -473,7 +471,7 @@ SKIPNAM LD DE,#0020 LD D,XH LD E,XL LD B,11 -SEARCH2 LD A,(DE) +SEARCH2: LD A,(DE) CP (HL) JR NZ,SKIPNAM INC HL @@ -491,14 +489,13 @@ SEARCH2 LD A,(DE) ; HL - CLUSTER ; DE - ADDRESS - -FLOAD LD (READMEM),DE -LD_FILE PUSH HL +FLOAD: LD (READMEM),DE +LD_FILE: PUSH HL CALL NSECTOR LD DE,(READMEM) LD A,(BOOT.S_P_C) CP #20 - JR C,SMCLUS + JR C,SMALL_CLUSTER LD BC,#20*256 + BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' @@ -507,8 +504,8 @@ LD_FILE PUSH HL POP HL AND A RET - -SMCLUS LD B,A +SMALL_CLUSTER: + LD B,A LD C,BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 4e26e7f..c4a7479 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -25,13 +25,13 @@ MACRO _mEXEinfo BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX BYTE ' Bootloader ' - BYTE ' installer ' + BYTE ' installer ' BYTE ' for DSS. ' BYTE ' Vasil Ivanov, ' BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2023 ' + BYTE ' 2023 ' ENDM diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 8e339bc..4b20315 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -10,6 +10,7 @@ ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] +;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти ;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? @@ -532,26 +533,27 @@ RUN_BAT CALL BATCH BATLIST DZ 'PAUSE' : DW CPAUSE DZ 'REM' : DW CREM CMDLIST DZ 'CD' : DW CCHDIR - DZ 'CHDIR' : DW CCHDIR - DZ 'CLS' : DW CLS - DZ 'DATE' : DW CDATE - DZ 'DEL' : DW CDELET DZ 'DIR' : DW DIR DZ 'ECHO' : DW CECHO - DZ 'ERASE' : DW CDELET - DZ 'EXIT' : DW CEXIT - DZ 'HELP' : DW HELP - DZ 'MD' : DW CMKDIR - DZ 'MKDIR' : DW CMKDIR DZ 'PATH' : DW CPATH + DZ 'MD' : DW CMKDIR DZ 'REN' : DW CRENAM - DZ 'RENAME' : DW CRENAM + DZ 'DEL' : DW CDELET DZ 'RD' : DW CRMDIR - DZ 'RMDIR' : DW CRMDIR DZ 'SET' : DW CSET DZ 'TIME' : DW CTIME - DZ 'VERSION' : DW VERS + DZ 'DATE' : DW CDATE DZ 'VER' : DW VERS + DZ 'CLS' : DW CLS + DZ 'CHDIR' : DW CCHDIR + DZ 'MKDIR' : DW CMKDIR + DZ 'RENAME' : DW CRENAM + DZ 'ERASE' : DW CDELET + DZ 'RMDIR' : DW CRMDIR + DZ 'EXIT' : DW CEXIT + DZ 'HELP' : DW HELP + DZ 'VERSION' : DW VERS + DZ 'REBOOT' : DW REBOOT DB #00 CLS LD DE,#0000 @@ -1780,9 +1782,21 @@ QUIT: LD B,0 RST ToDSS RET +;----------------------------------------------------------------------- +;R12 +REBOOT: DI + LD C,BIOS.FullInit + RST ToBIOS + LD BC,2*256 + BIOS.REINIT + RST ToBIOS + DI + HALT +;R12 +;----------------------------------------------------------------------- + ERR_MSG: INC DE LD HL,ERR0 - LD BC,ERR1-ERR0 + LD BC,ERR0.Size CALL LCPIR CALL PRINTZ CALL CRLF @@ -1795,7 +1809,7 @@ MESSAGE: CALL FMESAGE FMESAGE: INC DE LD HL,MSG0 - LD BC,MSG1-MSG0 + LD BC,MSG0.Size LCPIR: XOR A CPIR RET PO @@ -1903,75 +1917,74 @@ MSG0: DB 0 ; FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 DB "COMMANDS:",CR,LF,CR,LF - DB "CD DEL HELP RD SET " - DB " ",CR,LF - DB "CHDIR DIR MD REN TIME " - DB " ",CR,LF - DB "CLS ERASE MKDIR RENAME VER " - DB " ",CR,LF - DB "DATE EXIT PATH RMDIR VERSION " - DB " ",CR,LF - DB 0 -MSG1: + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 + ;R11 + BYTE 0 + DZ "Unknown command" + ; +.Size EQU $-MSG0 ;----------------------------------------------------------------------- ;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0 DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора - DZ "File exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "No free memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation interrupted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" +ERR0: DB #00 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора + DZ "File exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "No free memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation interrupted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" ;R11 - BYTE 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" + DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" ; -ERR1: +.Size EQU $-ERR0 ;----------------------------------------------------------------------- GETPATH: diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index a279d3e..f023b0d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1411,7 +1411,7 @@ SETTIME PUSH IX PUSH BC PUSH HL PUSH DE - LD C,#F5 + LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS2 POP AF diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 34ed599..84ed777 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -6,15 +6,25 @@ ;--------------------------------------------------------------- ;R00 2003-03-19 DNS Initial version ;--------------------------------------------------------------- -// INCLUDE "hardware.inc" -// INCLUDE "bios.inc" - ; ORG #0000 - MODULE DRV ; !FIXIT обойтись без модуля ;PAGEDRV EQU 0 + +;===============; + ;!FIXIT в процедуре которая будет отвечать за переход из этой страницы обратно в MAIN для вызова функций + ; ДСС и, возможно, повторному заходу в эту страницу через RST #18 из других страниц (которых пока нет) + ; сделать нечто подобное с программным стеком страниц. Эта процедура их сохраняет, примерно такая же + ; должна восстанавливать. +; PUSH HL +;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES +; LD (HL),A +; DEC L ; Не HL, а L - чтоб закольцевать область +; LD (.SP),HL +; POP HL +;===============; + ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; @@ -32,7 +42,7 @@ RST_00: ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[BIOS API]> ; - BLOCK 8-$,#FF ; + BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode A0008: PUSH AF ; LD A,SYS_PORT.PAGE8; OUT (SYS_PORT.ON),A ; @@ -44,35 +54,35 @@ A0008: PUSH AF ; ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DSS API]> ; - BLOCK #10-$,#FF ; -A0010: ;JP RST_10 ; + BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode +A0010: ;JP DRV_PAGE.RST_10 ; DI : HALT ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[DRIVE API]> ; - BLOCK #18-$,#FF ; -;A0018 JP INTDISK ; -A0018: PUSH AF ; - PUSH BC ; -MAIN_PG_NUMBER+2: ; - LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? - JP PORTAL.outDRV ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; ; <[DRIVE API]> ; +; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode +; ;A0018 JP INTDISK ; +; A0018: PUSH AF ; +; PUSH BC ; +; DRV_PAGE.MAIN_PAGE_NUMBER+2: ; +; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? +; JP PORTAL.outDRV ; +; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #20-$,#FF ; -A0020: JP RST_20 ; + BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode +A0020: JP DRV_PAGE.RST_20 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -RST_20: +DRV_PAGE.RST_20: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET @@ -81,13 +91,13 @@ RST_20: ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #28-$,#FF ; -A0028: JP RST_28 ; + BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode +A0028: JP DRV_PAGE.RST_28 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -RST_28: +DRV_PAGE.RST_28: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET @@ -96,7 +106,7 @@ RST_28: ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #30-$,#FF ; + BLOCK #30-$,#C7 ; A0030: JP RST_30 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -111,7 +121,7 @@ RST_30: ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[MAIN INT]> ; - BLOCK #38-$,#FF ; + BLOCK #38-$,#C7 ; A0038: ; ; JP RST_38 ; ; RST_38: ; @@ -148,56 +158,51 @@ A0038: ; ; ; -KEYSCAN: RET ;!FIXIT +DRV_PAGE.KEYSCAN: RET ;!FIXIT ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[ NMI ]> ; -NMI: RETN ; - BLOCK #66-$,#FF ; -A0066: JP NMI ; +DRV_PAGE.NMI: RETN ; + BLOCK #66-$,#C7; +A0066: JP DRV_PAGE.NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;-------------------------------; -;ADRST10 EQU #00 ;!!!!! +;ADRST10 EQU #00 ; ;!!!!! ;-------------------------------; ;!FIXIT -RST_10 PUSH HL - LD L,C - LD H,ADRST10/256 - LD C,(HL) - INC H - LD H,(HL) - LD L,C - EX (SP),HL - RET +; DRV_PAGE.RST_10: +; PUSH HL +; LD L,C +; LD H,ADRST10/256 +; LD C,(HL) +; INC H +; LD H,(HL) +; LD L,C +; EX (SP),HL +; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; - BLOCK #7E-$,0 ; -PORTAL.toMAIN: ; - PUSH BC ; -RETBANK+2: ; - LD BC,0*256+SLOT0 ; - OUT (C),B ; - ASSERT $!=84,'-> Portal error!'; -;Entry point from DSS main page ; !FIXIT если 2 раза прилететь на эту точку входа, то засрётся RETBANK - LD (RETBANK),A ; - POP BC ; - POP AF ; -ADCALL+1: ; - CALL DISPATCH ; патчится на INTDISK - JR PORTAL.toMAIN ; + _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 +PORTAL.out_DRV: PUSH BC ; +.RETBANK+2: LD BC,0*256+SLOT0 ; +.switch: OUT (C),B ; + ASSERT $!=84,'-> Portal error!'; + ;Entry point from DSS main page + LD (.RETBANK),A ; + POP BC ; + POP AF ; +ADCALL+1: CALL DISPATCH ; патчится на INTDISK + JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -/* - push hl - -*/ + display "=============================",/H,(#82-#73-(PORTAL.toMAIN.switch-PORTAL.toMAIN)) ;!FIXIT чёт не то тут @@ -214,23 +219,162 @@ PORTAL.outDRV: ; ; DISPATCH: - CALL INITDVC LD HL,INTDISK LD (ADCALL),HL - LD A,(LDRIVE) +INITDVC_RET_DRIVE: + CALL INITDVC + LD A,(DRV_PAGE.LDRIVE) AND A RET ; -LDRIVE DB #00 +DRV_PAGE.LDRIVE: DB #00 - INCLUDE 'dss/media_drivers/Shared.asm' - INCLUDE 'dss/media_drivers/ide.asm' - INCLUDE 'dss/media_drivers/fdd.asm' - INCLUDE 'dss/media_drivers/ram_disk.asm' + INCLUDE 'dss/media_drivers/shared-drv.asm' + INCLUDE 'dss/media_drivers/ide-drv.asm' + INCLUDE 'dss/media_drivers/fdd-drv.asm' + INCLUDE 'dss/media_drivers/ram_disk-drv.asm' -; DB 0 - - ENDMODULE +DEVICE_CFG: +DRV_TEMP_BUFFER: +; + + +; +;---------[256 bytes stack for return pages of RST #18 callers]--------; +; #3F00 - #3FFF +DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF +;----------------------------------------------------------------------; + ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" +; ENDMODULE ; OUTEND ;[END] + +/* +; +; NEW RESCAN +;=====================================================================[] +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +.Size: EQU $-DEVICE + +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV: BLOCK 16*LD_DSK,0 +.Size: EQU $-LOGDRV +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) +;+09 FREE +;+15 + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +RAMDTBL: DUP MAX_RAMDRIVES * 2 + DB #FF + EDUP +.Size EQU $-RAMDTBL + + + + +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE +.noNeedRescan: + ; + PUSH HL + PUSH BC + ADD A,A + ADD A,A + LD C,A + LD B,0 + LD HL,DEVICE + ADD HL,BC + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + + + +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы + CALL FDDRIVE.INIT ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы + ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET +.if_old: CALL INIT_H + ;CALL .CHECK_HDD + LD DE,HDDRIVE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET +.CHECK_HDD: + + RET + + + ;R01 +INITDVC_RET_DRIVE: + LD DE,DRV_TEMP_BUFFER + LD HL,DEVICE + LD BC,DEVICE.Size + LDIR + LD HL,LOGDRV + LD BC,LOGDRV.Size + LDIR + LD HL,RAMDTBL + LD BC,RAMDTBL.Size + LDIR + + CALL INITDVC + + ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его + LD HL,DEVICE + LD DE,DRV_TEMP_BUFFER + LD B,DEVICE.Size +.loop_DEVICE: + LD A,(DE) + CP (HL) + CALL NZ,.FIND_DEV + INC HL + INC DE + DJNZ .loop_DEVICE + + LD A,(DRV_PAGE.LDRIVE) + AND A + RET + ; + + +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF +;=====================================================================[] +; +; +*/ \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 3809b5c..76ccc1c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -9,6 +9,7 @@ ;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов ;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов ;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается +;R12 24-07-2023 BAO Check minimum BIOS version on boot ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 14-04-2023 BAO Аварийный зависон с выводом сообщения при старте системы, если нет свободной памяти ;R09 08-04-2023 BAO Сокращение размера таблицы API до 96 функций (0 - #5F). (Опционально при компиляции) @@ -94,7 +95,7 @@ RST_0x18: PUSH AF ; PUSH BC ; DRV_PG_NUMBER+2: ; LD BC,0*256+SLOT0 ; - JP PORTAL.outMAIN ; + JP PORTAL.out_MAIN ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -219,7 +220,7 @@ RST_10: PUSH HL ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK #80-$,0 ; ;ENTER: ; -PORTAL.outMAIN: ; +PORTAL.out_MAIN: ; IN A,(C) ; OUT (C),B ; ASSERT $!=84,'-> Portal error!'; @@ -262,19 +263,33 @@ PORTAL.outMAIN: ; ;R01 ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION -F_START: - DI +F_START: DI LD (.saveDRV),A - CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения + ;R12 + LD C,BIOS.DRV_VERSION + RST ToBIOS + JR C,.err_oldBIOS + EX DE,HL + LD DE,MINIMUM_BIOS_VERSION + SBC HL,DE + JR NC,.good + LD A,(.saveDRV) + CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 + JR NC,.err_oldBIOS + LD HL,#C9AF ; XOR A : RET opcodes + LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! + ; + +.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения RET C ;R10 CALL KINIT CALL PRINT_INIT - LD C,0 - RST #30 + LD C,0 ;!HARDCODE + RST #30 ;!HARDCODE LD A,(VMODE) - LD C,#81 - RST #30 + LD C,#81 ;!HARDCODE + RST #30 ;!HARDCODE ;CALL INITDVC ;R05 ;R05 LD C,Dss.DRV.Init @@ -284,7 +299,7 @@ F_START: .saveDRV+1: LD A,0 LD BC,1*256 + Dss.BootDSK - RST #10 + RST ToDSS EI ;Set new address fn. VERSION @@ -315,6 +330,18 @@ F_START: ENDIF ;R02 JP VERSION + + ;R12 +.err_oldBIOS: + LD HL,.err_oldBIOS_message + LD C,Dss.PChars + RST ToDSS + SCF + RET +.err_oldBIOS_message: + DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." + ; + ;R03 ;R07Allocate memory ; LD BC,#03C2 @@ -502,7 +529,7 @@ DEPLOY: IN A,(SLOT3) PUSH AF IN A,(SLOT0) - LD (DRV.MAIN_PG_NUMBER),A + LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST OUT (SLOT3),A LD A,C @@ -546,7 +573,6 @@ DEPLOY: ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: -; ENDMODULE DISP 0 INCLUDE 'DRV-MAIN.ASM' ENT diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index 594a837..f7b8813 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -222,8 +222,6 @@ FDDRIVE: ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK - - .IOCTL_F: BIT 7,B JR NZ,.O_CTL_F @@ -263,7 +261,6 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED - .FGETPRM: EX DE,HL LD BC,#55AA @@ -276,7 +273,7 @@ FDDRIVE: LD A,L AND #0F PUSH AF - LD C,#58 + LD C,BIOS.DRV_GET_PAR RST ToBIOS JR C,.NONEF PUSH HL @@ -334,7 +331,6 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED - .FSETPRM: PUSH AF EXX @@ -346,13 +342,13 @@ FDDRIVE: PUSH AF PUSH HL PUSH DE - LD C,#58 + LD C,BIOS.DRV_GET_PAR RST ToBIOS POP DE POP HL JR C,.NONEF POP AF - LD C,#59 + LD C,BIOS.DRV_SET_PAR RST ToBIOS RET C AND A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 928e142..16b9130 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ; ; Disk Driver Specification ver. 2.20 -;[]===========================================================[] +;[]===========================================================[0] ;Procedure : Initialization ; ;Function : Initialization device(s) @@ -15,8 +15,9 @@ ; IX - Environment ;Output : A = Amount drive support ; HL = Size driver -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[0] + +;[]===========================================================[1] ;Procedure : Open ; ;Function : Open disk @@ -25,8 +26,9 @@ ; A - Drive ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[1] + +;[]===========================================================[2] ;Procedure : Close ; ;Function : Close disk @@ -35,8 +37,9 @@ ; A - Drive ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[2] + +;[]===========================================================[3] ;Procedure : Media check ; ;Function : Checking change line @@ -46,8 +49,9 @@ ;Output : A = 00h disk no changed ; A = 0FFh disk changed ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[3] + +;[]===========================================================[4] ;Procedure : Get BPB ; ;Function : Get Block Parameters BIOS @@ -56,8 +60,9 @@ ; DE - Address ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[4] + +;[]===========================================================[5] ;Procedure : Input ; ;Function : Input from disk @@ -68,8 +73,9 @@ ; B - Sector count ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[5] + +;[]===========================================================[6] ;Procedure : Output ; ;Function : Output to disk @@ -80,8 +86,9 @@ ; B - Sector count ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[6] + +;[]===========================================================[7] ;Procedure : Removable ; ;Function : Checking change line @@ -91,8 +98,9 @@ ;Output : A = 00h Removable ; A = FFh Nonremovable ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[7] + +;[]===========================================================[8] ;Procedure : Generic IOCTL ; ;Function : Generic Input Output Control @@ -110,8 +118,9 @@ ; 82h - Format track ;Output : ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[8] + +;[]===========================================================[9] ;Procedure : Read Long ; ;Function : Reading sectors from disk @@ -125,8 +134,9 @@ ; HL:IX - Next Logical Block (sector) ; DE - Next Address ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[9] + +;[]===========================================================[10] ;Procedure : Write Long ; ;Function : Writing sectors to disk @@ -140,7 +150,8 @@ ; HL:IX - Next Logical Block (sector) ; DE - Next Address ; -;[]===========================================================[] +;[]===========================================================[10] + ; ; Errors: ; 0 (00h) - NO ERRORS @@ -158,7 +169,7 @@ ; 12 (0Ch) - BUSY (DEVICE OPENED) ; 13 (0Dh) - RESERVED -LD_DSK EQU 16 +LD_DSK EQU 16 ; максимальное количество логических дисков в системе ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 @@ -166,77 +177,110 @@ PART EQU #C000 HDDRIVE INC C DEC C - JP Z,INIT_H ;#00 + JP Z,INIT_H ; c=0 Initialization DEC C - JP Z,RESE_H ;#01 + JP Z,RESE_H ; c=1 open DEC C - JP Z,STAT_H ;#02 + JP Z,STAT_H ; c=2 close DEC C - JP Z,CHEK_H ;#03 + JP Z,CHEK_H ; c=3 media check (смена носителя) DEC C - JP Z,GBPB_H ;#04 + JP Z,GBPB_H ; c=4 get BPB DEC C - JP Z,READH ;#05 + JP Z,READH ; c=5 input (чтение секторов) DEC C - JP Z,WRITEH ;#06 + JP Z,WRITEH ; c=6 output (запись секторов) DEC C - JP Z,REMOV_H ;#07 + JP Z,REMOV_H ; c=7 Removable DEC C - JP Z,IOCTL_H ;#08 + JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL DEC C - JP Z,RESR_H ;#09 + JP Z,RESR_H ; c=9 Reserved DEC C - JP Z,LREADH ;#0A + JP Z,LREADH ; c=10 Read Long DEC C - JP Z,LWRITEH ;#0B + JP Z,LWRITEH ; c=11 Write Long RESR_H LD A,DSS_Error.drv.INVALID_COMMAND SCF RET -;Commands for restart #18 -INIT_H PUSH IY + +//////////////////////////////////////////////////////////////////////// +// Commands for restart #18 // +//////////////////////////////////////////////////////////////////////// + +;!FIXIT ---------------------------------------------------------------------------[v] +; c=0 Initialization +INIT_H: PUSH IY LD HL,LOGDRV LD (OFFSECT),HL - LD IX,DEVICE_CFG ;!TODO сделать RAMDRIVE тут в DEVICE_CFG ? + + ; IN A,(SLOT2) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT2),A + + ;LD IX,DEVICE_CFG+#8000 ; могло засрать память + LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST RST ToBIOS - XOR A - ;!TEST - ;LD B,(IX+2) ;HDD - ;CP B - CP (IX+2) - JR Z,NO_HARDS - LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта -NX_DVCI PUSH BC + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + XOR A + LD B,(IX+2) ;количество HDD для процедуры NX_DVCI + CP B + LD A,C + OUT (SLOT3),A + JR Z,NO_HARDS + ;LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT + LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT + +NX_DVCI: PUSH BC LD A,C - LD (DRV),A - CALL PARTIT + LD (DRV_NUM),A + LD C,BIOS.DRV_DETECT + RST ToBIOS + ;JR C,.NO_DRIVE + CALL NC,PARTIT POP BC INC C + JR C,NX_DVCI DJNZ NX_DVCI -;R02 -;R02 LD A,#80 -;R02 LD (DRV),A -;R02 LD C,SLOT3 -;R02 IN B,(C) -;R02 LD A,SYSPAGE -;R02 OUT (C),A -;R02 LD HL,IDE0 -;R02 CALL YEP_DRV -;R02 OUT (C),B -;R02 CALL NZ,PARTIT -;R02 -;R02 LD A,#81 -;R02 LD (DRV),A -;R02 LD C,SLOT3 -;R02 IN B,(C) -;R02 LD A,SYSPAGE -;R02 OUT (C),A -;R02 LD HL,IDE1 -;R02 CALL YEP_DRV -;R02 OUT (C),B -;R02 CALL NZ,PARTIT + + +; c=0 Initialization +; INIT_H: PUSH IY +; LD HL,LOGDRV +; LD (OFFSECT),HL +; LD IX,DEVICE_CFG ;!FIXIT не засрет ли память? +; LD C,BIOS.DRV_LIST +; RST ToBIOS +; XOR A +; ;!TEST +; ;LD B,(IX+2) +; ;CP B +; CP (IX+2) ;HDD +; JR Z,NO_HARDS +; LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT +; ;LD C,#80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT + +; NX_DVCI: PUSH BC +; LD A,C +; LD (DRV_NUM),A +; LD C,BIOS.DRV_DETECT +; RST ToBIOS +; ;JR C,.NO_DRIVE +; CALL NC,PARTIT +; POP BC +; INC C +; ;JR C,NX_DVCI +; DJNZ NX_DVCI +;!FIXIT ---------------------------------------------------------------------------[^] +; + NO_HARDS: POP IY LD HL,(OFFSECT) @@ -245,37 +289,21 @@ NO_HARDS: SBC HL,DE RET Z LD DE,LD_DSK -DRVCLC INC A +DRVCLC: INC A SBC HL,DE JR NZ,DRVCLC AND A RET -DEVICE_CFG EQU #4000 +;DEVICE_CFG EQU #4000 ;!TEST +;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST ; DB 0 ;LEN ; DB 0 ;FDD COUNT ; DB 0 ;HDD COUNT ; DB 0 ;CDROM COUNT ; DS 28 ;RESERVED -YEP_DRV LD A,#FF -; CP (HL) -; RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET + ;+00 ;SECTORS PER TRACK ;+01 ;TRACKS PER CYLLINDER @@ -286,40 +314,17 @@ YEP_DRV LD A,#FF ;+06 ;RESERVED ;+07 ;RESERVED -DRVHD_H EQU 0 -SC_PT_H EQU 1 -HEADS_H EQU 2 -CYL_L_H EQU 3 -CYL_H_H EQU 4 -SPCLL_H EQU 5 -SPCLH_H EQU 6 - -;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00 -; DB #FF ;SECTORS PER TRACK ;01 -; DB #FF ;HEADS ;02 -; DB #FF ;CYLINDERS LOW ;03 -; DB #FF ;CYLINDERS HIGH ;04 -; DB #FF ;SECTOR PER CYLINDER LOW ;05 -; DB #FF ;SECTOR PER CYLINDER HIGH ;06 -; DB #FF ;RESERVED ;07 - -;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00 -; DB #FF ;SECTORS PER TRACK ;01 -; DB #FF ;HEADS ;02 -; DB #FF ;CYLINDERS LOW ;03 -; DB #FF ;CYLINDERS HIGH ;04 -; DB #FF ;SECTOR PER CYLINDER LOW ;05 -; DB #FF ;SECTOR PER CYLINDER HIGH ;06 -; DB #FF ;RESERVED ;07 - -LOGDRV BLOCK 12*LD_DSK,0 +LOGDRV: BLOCK 16*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -SELHDD PUSH DE +.Size EQU $-LOGDRV + + +SELHDD: PUSH DE PUSH BC PUSH HL LD L,A @@ -349,8 +354,6 @@ SELHDD PUSH DE ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK - - IOCTL_H BIT 7,B JR NZ,O_CTL_H INC B @@ -400,14 +403,17 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED - -HGETPRM EX DE,HL +; A - DRIVE/HEAD REGISTER PHISICAL DISK: +; bit7 - reserved "1" +; bit6 - ADDRESSING MODE LBA/CHS +; bit5 - reserved "1" +; bit4 - DEVICE MASTER/SLAVE +; bit3 - reserved "0" (MAY BE OTHER) +; bit2 - reserved "0" (MAY BE OTHER) +; bit1 - reserved "0" (MAY BE OTHER) +; bit0 - Primary/Secondary Chanel +HGETPRM: + EX DE,HL LD BC,#55AA AND A SBC HL,BC @@ -415,6 +421,8 @@ HGETPRM EX DE,HL LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET NZ + + PUSH IX PUSH IY LD H,0 ADD HL,HL @@ -423,55 +431,81 @@ HGETPRM EX DE,HL ADD HL,HL LD B,H LD C,L - LD IY,LOGDRV ;!FIXIT нахрена тут индексный? + LD IY,LOGDRV ADD IY,BC - LD E,(IY+5) - LD D,(IY+6) - LD L,(IY+7) - LD H,(IY+8) - LD A,(IY+0) - LD C,A - LD IY,SYS_PAGE.IDE_0 - AND #0F - JR Z,GELH1 - LD IY,SYS_PAGE.IDE_1 - CP 2 - JR C,GELH1 - LD IY,SYS_PAGE.IDE_2 - JR Z,GELH1 - LD IY,SYS_PAGE.IDE_3 -GELH1 IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,(IY+DRVHD_H) ;HDD/DRV - EXX - LD L,(IY+CYL_L_H) ;CYLINDER LOW - LD H,(IY+CYL_H_H) ;CYLINDER HIGH - LD E,(IY+HEADS_H) ;HEADS - LD D,0 - LD C,(IY+SC_PT_H) ;SECTORS - LD B,0 - EXX - EX AF,AF' - POP AF - OUT (SLOT3),A - LD A,C - EX AF,AF' + ; + LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;!TEST --------------------------------------------------------------------------------+ + PUSH IY + LD C,BIOS.DRV_GET_PAR + RST ToBIOS POP IY + LD A,DSS_Error.drv.INVALID_DRIVE + JR C,.error + + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX + + ;SECTORS ON LOGICAL DISK + LD E,(IY+5) + LD D,(IY+6) + LD L,(IY+7) + LD H,(IY+8) + ; + EX AF,AF' + LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + EX AF,AF' + +; LD C,A +; LD IY,SYS_PAGE.IDE_0 +; AND #0F +; JR Z,GELH1 +; LD IY,SYS_PAGE.IDE_1 +; CP 2 +; JR C,GELH1 +; LD IY,SYS_PAGE.IDE_2 +; JR Z,GELH1 +; LD IY,SYS_PAGE.IDE_3 +; GELH1: IN A,(SLOT3) +; PUSH AF +; LD A,SYS_PAGE +; OUT (SLOT3),A + +; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV +; EXX +; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW + +; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH + +; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS + +; LD D,0 +; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS + +; LD B,0 +; EXX +; EX AF,AF' +; POP AF +; OUT (SLOT3),A +; LD A,C +; EX AF,AF' +;!TEST --------------------------------------------------------------------------------+ + AND A +.error: POP IY + POP IX + RET + +REMOV_H: + LD A,1 AND A RET -REMOV_H LD A,1 - AND A +RESE_H: XOR A RET -RESE_H XOR A - RET - -STAT_H XOR A +STAT_H: XOR A RET CHEK_H: @@ -484,8 +518,7 @@ CHEK_H: ;HL:IX - SECTOR ; DE - ADDRESS - -GBPB_H PUSH IY +GBPB_H: PUSH IY PUSH DE LD L,A LD H,0 @@ -506,7 +539,7 @@ GBPB_H PUSH IY LD A,(IY+0) POP DE POP IY - LD BC,#0155 + LD BC,1*256 + BIOS.DRV_READ RST ToBIOS RET @@ -514,10 +547,11 @@ GBPB_H PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE +; A - HDD NUMBER +#80 ;READ SECTOR -LREADH PUSH IY +LREADH: PUSH IY CALL SELHDD - LD C,#52 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_READ_LONG RST ToBIOS POP IY RET @@ -526,10 +560,12 @@ LREADH PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE +; A - HDD NUMBER +#80 ;WRITE SECTOR -LWRITEH PUSH IY +LWRITEH: + PUSH IY CALL SELHDD - LD C,#53 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_WRITE_LONG RST ToBIOS POP IY RET @@ -537,10 +573,11 @@ LWRITEH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;WRITE SECTOR -WRITEH PUSH IY +WRITEH: PUSH IY CALL SELHDD - LD C,#56 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_WRITE RST ToBIOS POP IY RET @@ -548,10 +585,11 @@ WRITEH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;READ SECTOR -READH PUSH IY +READH: PUSH IY CALL SELHDD - LD C,#55 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_READ RST ToBIOS POP IY RET @@ -559,18 +597,20 @@ READH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;CHECK SECTOR -CHECKH PUSH IY +CHECKH: PUSH IY CALL SELHDD - LD C,#54 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_VERIFY RST ToBIOS POP IY RET ;----------------- -EASYDOS -MEDIDOS -HIGHDOS LD E,(IY+08) +EASYDOS: +MEDIDOS: +HIGHDOS: + LD E,(IY+08) LD D,(IY+09) LD L,(IY+10) LD H,(IY+11) @@ -599,7 +639,7 @@ HIGHDOS LD E,(IY+08) LD (IX+6),D LD (IX+7),L LD (IX+8),H - LD A,(DRV) + LD A,(DRV_NUM) LD (IX+0),A LD DE,LD_DSK ; DSKITEM ADD IX,DE @@ -611,7 +651,7 @@ NXTPART LD DE,#10 AND A RET -PARTIT IN A,(SLOT3) +PARTIT: IN A,(SLOT3) PUSH AF LD A,DSS_PAGE OUT (SLOT3),A @@ -628,14 +668,14 @@ PARTIT2 LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC ;!TEST - RET C ;FOR IDE2..3 + ;RET C ; for absent drive ; - LD HL,(PART+510) + LD HL,(PART+510) ;!HARDCODE LD DE,#AA55 AND A SBC HL,DE JR NZ,NODEFIN - LD IY,PART+#01BE + LD IY,PART+#01BE ;!HARDCODE LD B,4 DOSAGA PUSH BC LD A,(IY+4) @@ -670,8 +710,7 @@ NOEXTDS CP #0F NODEFIN SCF RET -EXTDOS - LD HL,(EXTDOSL) +EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L OR H @@ -701,13 +740,13 @@ LOADSEC PUSH IY LD IX,(CURSECL) LD HL,(CURSECH) LD DE,PART + LD A,(DRV_NUM) LD BC,1*256 + BIOS.DRV_READ - LD A,(DRV) RST ToBIOS POP IY RET -DRV DB #00 ;PHISICAL DRIVE NUMBER +DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. номер девайса (#80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв) CURSECL DW #0000 ;CURRENT SECTOR LOADED CURSECH DW #0000 diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index b266f7f..34417d1 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -247,7 +247,8 @@ CHEK_RD LD A,#FF RET ;DE - ADDRESS -GBPB_RD LD IX,0 +GBPB_RD: + LD IX,0 LD HL,0 LD B,#01 ;JP READ_RD @@ -329,7 +330,6 @@ INIT_RD: LD (DE),A INC DE JP 1F - .noDRV: POP BC 1: INC B LD A,RAMDTBL.Size / 2 diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index de0c995..03acf6a 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -116,6 +116,9 @@ ; EX (SP),HL ; RET +;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые + + ;------------------------------------------------- ; RST 18h. Вектор дисковых устройств ; вход: a=номер устройства (0-25) @@ -159,7 +162,7 @@ NODEV: POP BC PDEVICE DW DEVICE DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF -.End: DB #FF +.Size: DB #FF FLOPPY EQU #0001 FIXED EQU #0002 @@ -191,33 +194,30 @@ NETWORK EQU #0008 ;----------------------------------------------------------------------- ;R01 -INITDVC_RET_DRIVE: - CALL INITDVC - LD A,(LDRIVE) - AND A - RET +; INITDVC_RET_DRIVE: +; CALL INITDVC +; LD A,(DRV_PAGE.LDRIVE) +; AND A +; RET ; ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- INITDVC: XOR A - LD (LDRIVE),A ; сбр. ячейку + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку ; FDD девайсы - LD C,A - CALL FDDRIVE ; узнать число FDD-девайсов + CALL FDDRIVE.INIT ; узнать число FDD-девайсов LD DE,FDDRIVE ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы - LD C,0 - CALL HDDRIVE +.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,HDDRIVE CALL MAKEDVC ; RAM-диски - LD C,0 - CALL RMDRIVE + CALL INIT_RD LD DE,RMDRIVE CALL MAKEDVC XOR A @@ -227,7 +227,7 @@ INITDVC: XOR A ; вход: de=адрес обработчика девайса ; a=число девайсов (0=нет) MAKEDVC: LD C,A - LD HL,LDRIVE ; ячейка номера посл. диска + LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A LD A,C @@ -235,7 +235,7 @@ MAKEDVC: LD C,A OR A RET Z ; нет девайсов LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер драйва этого устройства (младшие 4 бита). Например, для HDD #81: #80 - тип драйва, 1 - номер драйва +.loop: LD (HL),C ; номер лог.драйва этого устройства INC HL LD (HL),E ; de=адрес обработчика INC HL @@ -269,5 +269,4 @@ MAKEDVC: LD C,A ; DW HDDRIVE ; HDD I ; DB #07 ; DW HDDRIVE ; HDD J -; DB #FF - +; DB #FF \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index de58e29..f7128db 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -12,7 +12,7 @@ ;--------------------------------------------------------------- ; CLEAR TEXT WINDOW -CLEAR LD C,BIOS.LP_CLS_WIN2 +CLEAR: LD C,BIOS.LP_CLS_WIN2 RST ToBIOS AND A RET @@ -20,7 +20,7 @@ CLEAR LD C,BIOS.LP_CLS_WIN2 ; PRINT NULL-TERMINATED CHARS STRING ; HL - STRING POINTER -PCHARS LD A,(HL) +PCHARS: LD A,(HL) INC HL OR A RET Z diff --git a/DSS/build.txt b/DSS/build.txt index ac4213d..c9c4108 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -43 \ No newline at end of file +114 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index e0fcecc..2ef0604 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -12,11 +12,13 @@ DEFINE TABisSPACES 1 DEFINE CLASSIC_CURSOR 0 DEFINE SAVE_PATH_MACRO 0 + DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; DEFINE USING_MEMPAGES 4 DEFINE OLD_SET_BANK 0 + PORTAL.RSTx18_SWITCH_ADDRESS #82 ; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 diff --git a/Shared_Includes b/Shared_Includes index 94cb0e3..b25c377 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 94cb0e39f321bd11519008801187d93eacb280f2 +Subproject commit b25c3779d6af8abc2970d3a9a55006f43292c86e