; LAST UPDATE: 30.05.2025 savelij include macros.a80 include macros_sp.a80 include define_sp.a80 include bios_sp.a80 include dss_sp.a80 include errors_sp.a80 include ports_sp.a80 include mouse_sp.a80 include accel_sp.a80 include fat_dir_sp.a80 include fn_version.a80 INIT_VAR 0xC000 SETVAR FONT_RAW, 6888;IFFFONT_RAW_PACK - FONT_RAW_PACK SETVAR_ALIGN SETVAR IFFFONT_RAW, 8704;IFFFONT_RAW_END - IFFFONT_RAW_PACK SETVAR CLOCK_BMP, CLOCK_BMP_END - Clock_BMP SETVAR MOUSE_BMP, MOUSE_BMP_END - Mouse_BMP org 0x80EA EXEhead: db "EXE" db 1 ; +3 dw EntryExec-EXEhead dw 0x0000 ; +4 dw EXEend-EntryExec ; +8 dw 0,0 ; +10 dw 0 ; +14 dw EntryExec ; +16 dw EntryExec dw 0x80FF EntryExec: DI LD A,(IX-0x03) ; file handle LD (MAIN.hFile),A ; save LD HL,MAIN.copyright_str SPDSS DSSF.PCHARS ; print text SPDSS DSSF.VERSION LD A,D OR A JR NZ,.next1 LD HL,MAIN.incor_dos_str SPDSS DSSF.PCHARS ; print text SPDSS DSSF.EXIT,0x26 ; exit .next1 SPDSS DSSF.GETMEM,6 ; запрос 6 страниц памяти JR NC,.next2 ; CY - not enough memory LD HL,MAIN.no_memory_str SPDSS DSSF.PCHARS ; print text SPDSS DSSF.EXIT,0x1E ; exit .next2 LD (MAIN.hMem),A ; memory handle LD HL,MAIN.FNMAIN SPBIOS BIOSF.GETMEMBLKPAGES ; get memory pages list LD A,(MAIN.FNMAIN) ; set pages from 0xC000 SETPORT WINSP.CPU3,,0 LD HL,BASE_ADDR ; FNMAIN LD DE,END_BLOCK_1 - START_BLOCK_1 LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.FNFUNCT) SETPORT WINSP.CPU3,,0 LD HL,0xC000 ; FNFUNCT LD DE,END_BLOCK_2 - START_BLOCK_2 LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.FNVIEW) ; FNVIEW SETPORT WINSP.CPU3,,0 LD HL,0xC000 LD DE,END_BLOCK_EDITOR - START_BLOCK_EDITOR LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.FNEDIT) ; FNEDIT SETPORT WINSP.CPU3,,0 LD HL,0xC000 LD DE,END_BLOCK_VIEWER - START_BLOCK_VIEWER LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.FNHELP) ; FNHELP SETPORT WINSP.CPU3,,0 SETPORT WINSP.CPU1,,0 LD HL,0xC000 LD DE,END_BLOCK_3 - START_BLOCK_3 LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.FNFONT) ; FNFONT SETPORT WINSP.CPU3,,0 LD HL,0xFFFF - (IFFFONT_RAW_END - FONT_RAW_PACK) LD DE,END_BLOCK_4 - START_BLOCK_4 LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error LD A,(MAIN.hFile) SPDSS DSSF.CLOSE ; close file ; распаковка шрифтов LD HL,0xFFFF - (IFFFONT_RAW_END - FONT_RAW_PACK) LD DE,0xC000 CALL UNPACK LD HL,0xFFFF - (IFFFONT_RAW_END - IFFFONT_RAW_PACK) LD DE,0xDB00 CALL UNPACK ; перенос иконок мыши на рабочее место LD HL,Clock_BMP LD DE,CLOCK_BMP LD BC,CLOCK_BMP_Size + MOUSE_BMP_Size LDIR ;!TEST ; !HARDCODE SYS_PAGE SETPORT WINSP.CPU3,PAGE.SYSTEM;0xFE LD HL,0x0124 + CPU3 ; !HARDCODE LD (HL),0x38 ; interrupt routine address Low byte INC HL XOR A LD (HL),A ; interrupt routine address High byte INC HL GETPORT WINSP.CPU0 LD (HL),A ; interrupt routine page LD A,(MAIN.FNMAIN) SETPORT WINSP.CPU3,,0 LD A,(MAIN.hMem) LD (RAMPAGES.FNPAGESID),A LD HL,MAIN.FNFUNCT LD DE,RAMPAGES.FNFUNCT LD BC,0x0005 LDIR JP BASE_ADDR disk_error: PUSH AF LD A,(MAIN.hMem) ; free memory SPDSS DSSF.FREEMEM LD A,(MAIN.hFile) SPDSS DSSF.CLOSE ; close file LD HL,MAIN.load_err_str SPDSS DSSF.PCHARS ; print text POP BC SPDSS DSSF.EXIT ; exit UNPACK include dec40.a80 ; 14 x 9 = 126 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D Clock_BMP: DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE ; 00 DB 0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF ; 01 DB 0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0x00 ; 02 DB 0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE,0xF0,0xFE,0x00,0xFF,0xFF,0xFF,0xFF ; 03 DB 0xFF,0x00,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0x00,0xFF ; 04 DB 0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xF0,0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE ; 05 DB 0xFE,0xFE,0x00,0xFE,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00 ; 06 DB 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE ; 07 DB 0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 08 CLOCK_BMP_END ; 13 x 9 = 117 00 01 02 03 04 05 06 07 08 09 0A 0B 0C Mouse_BMP: DB 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0x00,0xFF ; 00 DB 0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF ; 01 DB 0xFF,0x00,0xFE,0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xFE ; 02 DB 0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00 ; 03 DB 0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0xFF,0x00,0xFE ; 04 DB 0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0xFE,0x00 ; 05 DB 0xFF,0xFF,0xFF,0x00,0xFE,0x00,0x00,0xFE,0xFE,0x00,0xFF,0xFF,0x00 ; 06 DB 0x00,0xFF,0xFF,0x00,0xFE,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00 ; 07 DB 0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF ; 08 MOUSE_BMP_END MAIN .hFile db 0x00 .hMem db 0x00 .FNMAIN db 0x00 .FNFUNCT db 0x00 ; 00 .FNVIEW db 0x00 ; 01 .FNEDIT db 0x00 ; 02 .FNHELP db 0x00 ; 03 .FNFONT db 0x00 ; 04 DB 0xFF .copyright_str: DB "\r\nThe Flex Navigator, ver.\{FLEX_VERS.NAVIGATOR}\r\n",0 .incor_dos_str: DZ "Incorrect DOS version, need DOS 1.00 or high.\r\n" .no_memory_str: DZ "Not enough memory to load program.\r\n" .load_err_str: DZ "Disk loading error.\r\n" EXEend: include fnmain.a80