;[BEGIN] ;//MODULE: DOS-MAIN AUTHOR: Denis Parinov ;//CREATE: A LONG TIME AGO :) ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;[ ] увеличить длину PATH и строки BAT ;[ ] путь текущего каталога в 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). (Опционально при компиляции) ;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE ;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE ;R06 31-03-2003 DNS RELAYOUTING MEMORY ;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD ;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE ;R03 14-03-2003 DNS CODE OPTIMIZATION ;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION ;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT ;--------------------------------------------------------------- ; OUTPUT './Build/system.dos' ; MODULE MAIN //SPRINTER EQU 2000 includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/constants/sp2000.inc' INCLUDE 'defines.inc' include 'Structures.inc' include 'shared_includes/constants/standart_colors.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' INCLUDE 'VERSION.INC' INCLUDE 'DSS_MACROSES.Z80' ;PAGEDRV EQU #00 ; DIRPAGE EQU 0 ; FATPAGE EQU 1 ; TXTPAGE EQU 2 ; ENVPAGE EQU 2 ; DRVPAGE EQU 3 ; ENVPAGE EQU 3 ; DRVPAGE EQU 4 ; TXTADDR EQU #C000 ; ENVADDR EQU #E400 ; DIR EQU #C000 ; FAT EQU #C000 ; ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ORG 0 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[CLOSE TASK]> ; RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[BIOS API]> ; _mInfoBLOCK 8-$,#FF ; RST_0x08: PUSH AF ; LD A,SYS_PORT.PAGE8; OUT (SYS_PORT.ON),A ; POP AF ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DSS API]> ; _mInfoBLOCK #10-$,#FF ; RST_0x10: JP RST_10 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE API]> ; _mInfoBLOCK #18-$,#FF ; ;A0018 JP INTDISK ; RST_0x18: PUSH AF ; PUSH BC ; DRV_PG_NUMBER+2: ; LD BC,0*256+SLOT0 ; JP PORTAL.out_MAIN ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; _mInfoBLOCK #20-$,#FF ; RST_0x20: JP RST_20 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; RST_20: RST_28: NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; _mInfoBLOCK #28-$,#FF ; RST_0x28: JP RST_28 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[MOUSE API]> ; _mInfoBLOCK #30-$,#FF ; RST_0x30: PUSH AF .drv_page+1: LD A,#FF OUT (SLOT0),A POP AF RET ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; //////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> _mInfoBLOCK #38-$,#FF RST_38: ;для того, чтоб софты могли менять обработчик на свой. JP RST_0x38 RST_0x38: INT_: 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 LD C,Dss.Mouse.GetPackets RST ToDSS.Mouse ;CALL M_INT IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL 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 //////////////////////////////////////////////////////////////////////// ; NMI: RETN ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[ NMI ]> ; _mInfoBLOCK #66-$,#FF ; NMI_0x66: JP NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; RST_10: PUSH HL LD L,C IF SHORT_RSTx10_TABLE ;[ ] R09 LD H,A LD A,#5F SUB C JR C,.error LD A,H ;[ ] R09 ENDIF LD H,high ADRST10 LD C,(HL) INC H LD H,(HL) LD L,C EX (SP),HL RET IF SHORT_RSTx10_TABLE ;[ ] R09 .error: POP HL JR NOPS ;[ ] R09 ENDIF ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK #80-$,0 ; ;ENTER: ; PORTAL.out_MAIN: ; IN A,(C) ; OUT (C),B ; ASSERT $!=84,'-> Portal error!'; POP BC ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;R01 ; Area for boot sector BootSector. ;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } ; end boot sector ;R01 ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ; ; CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; ;R07 ;R11 XOR A LD HL,CLEAR_ZONE.start LD DE,CLEAR_ZONE.start+1 LD BC,CLEAR_ZONE.size-1 LD (HL),A LDIR LD HL,':'*256 + 'X' LD (CORE_BUFFERS.CurrentPath),HL LD A,'\' ; LD (CORE_BUFFERS.CurrentDirectory),A LD (CORE_BUFFERS.WorkDirectory),A ; LD A,#FF LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; ;R07 ;R11 ;R11 LD HL,CORE_BUFFERS.FM_BUF LD (HL),'.' ;R11 ;---------------------------; ;R02 ;LD B,#FF ;INIT ENVIRONMENT CALL INITENV IFN CLASSIC_CURSOR CALL SETUP_CURSORS ENDIF ;R02 JP VERSION ;R03 ;R07Allocate memory ; LD BC,#03C2 ; RST ToBIOS ; LD HL,BANKTBL ; LD C,A ; LD B,#FF ;VERINIT INC B ; PUSH BC ; PUSH HL ; LD A,C ; LD C,#C4 ; RST ToBIOS ; POP HL ; POP BC ; LD (HL),A ; INC HL ; JR NC,VERINIT ;R07;R03 ;R07 JP INIT2 ;R03 ; DS $/256+1*256-$,0 c:\bin\menu ;----------------------------------------------------------------------; ;MEMTAB: BLOCK 256,0 ;----------------------------------------------------------------------; _mInfoALIGN 256,0 ;------------------------------------------------------------------------------------------------------------------------; GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE ;[ ] R09 DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63 DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D DUP 13 DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO; 110-239 6E-EF EDUP DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF ELSE ;!TODO free space _mInfoBLOCK ADRST10+#100 - $,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT IFN SHORT_RSTx10_TABLE ;[ ] R09 DB high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO DUP 13 DB high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO EDUP DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END ELSE ;!TODO free space ;_mInfoBLOCK ADRST10+#200 - $,0 ;[ ] R09 ENDIF ; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63 ; DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT, high NOPS, high NOPS, high NOPS, high NOPS ;---------------------------------------------------------------------------------------------------------------------------------------------------------------; ;[INCLUDE] ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса INCLUDE "KEYINTER.ASM" INCLUDE "VIDEO.ASM" INCLUDE "API.ASM" INCLUDE "DOS_Proc.asm" INCLUDE "FS/FAT/FAT.ASM" INCLUDE "FS/FAT/FAT_X.ASM" INCLUDE "DOS_FM.ASM" INCLUDE "Procedures.asm" INCLUDE "Kernel_Panic.asm" ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE HANDBUF: BLOCK HANDBUF.SIZE,0 ; MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 ; DISPLAY "DOS-MAIN end address: ",/H,$-1 ; ;!TODO к буферам! ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* ; 259 CurrentPath: DB 'X' DB ':' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; ; 257 WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; 516 */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ; ; CLEAR_ZONE.start EQU $ MODULE CORE_BUFFERS BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK _sStack = BUFFERSplace.Stack .Spoint EQU XSTACK + _sStack BUFFER EQU BUFFERSplace.Buffer SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER MemoryTable EQU BUFFERSplace.MemoryTable CurrentPath EQU BUFFERSplace.CurrentPath CurrentDirectory EQU BUFFERSplace.CurrentDirectory .DEPTH EQU DIRECTORY_PATH_LENGTH WorkDirectory EQU BUFFERSplace.WorkDirectory .DEPTH EQU DIRECTORY_PATH_LENGTH ENDMODULE ; ; CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers ; CurrentDirectory EQU CurrentPath + 2 ; .DEPTH: EQU DIRECTORY_PATH_LENGTH ; ; ; WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH ; .DEPTH: EQU DIRECTORY_PATH_LENGTH ; CLEAR_ZONE.size EQU _sBuffers ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "Consist: " DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace) DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" EXPORT CORE_BUFFERS.BUFFERSplace EXPORT CORE_BUFFERS.FM_BUF EXPORT CORE_BUFFERS.FatBuffer EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.BUFFER EXPORT CORE_BUFFERS.SECTOR_BUFFER EXPORT CORE_BUFFERS.MemoryTable /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FM_BUF _sFM=$ .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size ;????? а не грузится ли полностью сектор в 512 байтов при загрузке хэдера? EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize ; EXEBUFF: ; DB "EXE" ; DB #00 ; OFFCOD1 DW #0000 ; OFFCOD2 DW #0000 ; LOADER DW #0000 ; DW #0000 ; DW #0000 ; DW #0000 ; LD_ADDR DW #0000 ; PC_REG DW #0000 ; SP_REG DW #0000 ; BLOCK 512-($-EXEBUFF),0 ;(!!!HERE STACK FOR EXEC!!!) ; BLOCK 255,0 ;XSTACK DB #00 XSTACK EQU EXEBUFF+_sEXE_HEADER+255 BUFFER EQU XSTACK+1 SECTOR_BUFFER EQU BUFFER ;R11 //////////////////////////////// */ ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ; ;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; затрётся после инициализации ;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ;LD (.saveDRV),A LD H,A LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве ; ;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+1) 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 KEYBOARD_INIT CALL PRINT_INIT LD C,Dss.Mouse.Init RST ToDSS.Mouse LD A,(VMODE) LD C,Dss.Mouse.SetVideoMode RST ToDSS.Mouse ;CALL INITDVC ;R05 ;R05 LD C,Dss.DRV.Init RST ToDSS.DRV LD (LDRIVE),A ;R05 .saveDRV+1: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD HL,0 ; H - номер устройства, L - номер раздела на устройстве ;LD A,H ;LD A,0 ; LD B,1 CALL BOOTDSK RET C ; EI ;Set new address fn. VERSION LD HL,ADRST10 LD (HL),low VERSION ;R03 INC H LD (HL),high VERSION ;R03 JP CLEAR_BUFFER_AND_INIT_PROC ; ;R12 .err_oldBIOS: LD HL,.err_oldBIOS_message ;LD C,Dss.PChars ;RST ToDSS CALL PCHARS SCF RET .err_oldBIOS_message: DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." ; DEPLOY: ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS RET C ;R10 LD C,A IN A,(SLOT3) PUSH AF IN A,(SLOT0) LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST OUT (SLOT3),A LD A,C LD HL,BANKTBL + #C000 LD C,BIOS.GetMemBlkPages RST ToBIOS ; должна идти после GetMemBlkPages, чтоб вместо ; закрывашки #FF поставить страницу COREPAGE LD HL,BANKTBL + COREPAGE IN A,(SLOT0) LD (HL),A ; для API драйвера мышки LD (MOUSE_HANDLER.CorePage),A LD A,(BANKTBL + DRVPAGE) LD (RST_0x30.drv_page),A POP AF OUT (SLOT3),A SET_PAGE_X DRVPAGE PUSH AF LD HL,DRV_CONTENT LD DE,#C000 LD BC,DRV_CONTENT.SIZE LDIR IN A,(SLOT3) LD (DRV_PG_NUMBER),A POP AF OUT (SLOT3),A AND A ;R10 RET IF ENVVALUE != CORE_BUFFERS.BUFFER ASSERT "Warning! ENVVALUE != BUFFER" //BLOCK 1000,0 ENDIF ;--- --- --- --- [Build version] --- --- --- ---; ; C_OSTYPE ;--- --- --- --- --- --- --- --- --- --- --- ---; DISPLAY "DEPLOY end address: ",/H,$ ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: DISP 0 INCLUDE 'DRV-MAIN.ASM' ENT DRV_CONTENT.SIZE EQU $-DRV_CONTENT BIN_END_ADDRESS EQU $ DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!'; ;[END] ; ; DTA DB " " ; DB " " ; DB #20 ; DW 0,0,0,0,0 ; DW 0 ; DW 0 ; CLUSTER DW 0 ; SIZE DW 0,0 ; ASCIIZ DB "FILENAME.EXT",#00 ;R06 ;R06 BUFFER ;R06 SECTOR_BUFFER DB ". ",#10 ;R06 DW 0,0,0,0,0 ;R06 DW #0000 ;R06 DW #0000 ;R06 DW #0000 ;R06 DW #0000,0000 ;R06 DB ".. ",#10 ;R06 DW 0,0,0,0,0 ;R06 DW #0000 ;R06 DW #0000 ;R06 DW #0000 ;R06 DW #0000,0000 ;R06 DS 512-64 ;,0