File-Manager/FM.ASM
2025-04-05 01:58:39 +10:00

261 lines
6.4 KiB
NASM
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

INCLUDE 'shared_includes/constants/Sp2000.inc'
INCLUDE 'shared_includes/constants/bios_equ.inc'
INCLUDE 'shared_includes/constants/dss_equ.inc'
INCLUDE 'version.inc' ; ¢¥àá¨ï ¬¥­¥¤¦¥à 
; include 'fm.exp' ; ᮤ¥à¦¨â "@label" ¬¥âª¨
ORG 0
EXE_HEADER:
.START: DB "EXE" ; exe ID
DB 0 ; exe ¢¥àá¨ï
DWORD EXE_HEADER.SIZE ; ᬥé. ª®¤ 
DW end_loader-entry ; end-beg, ¯¥à¢¨ç­ë© § £àã§ç¨ª
DW 0,0,0 ; १¥à¢
DW entry ;  ¤à¥á § £à㧪¨ ª®¤ 
DW start ;  ¤à¥á ¯¥à¥¤ ç¨ ã¯à ¢«¥­¨ï
DW start ;  ¤à¥á á⥪ 
;
BLOCK 10,' ' ; ‚ëà ¢­¨¢ ­¨¥ ¤«ï ªà á¨¢®£® ®â®¡à ¦¥­¨ï ¢ HEX
BYTE 'The File Manager'
BYTE ' v ',str_version,' '
BYTE 'by Vasil Ivanov '
BYTE '(c) 2005-2007. '
BYTE ' Modified by '
BYTE ' Anatoliy '
BYTE ' Belyanskiy, '
BYTE ' Sprinter Team '
BYTE ' 2025. '
.END: ;
.SIZE EQU .END - .START
;
ORG #4100
entry: include "fview/viewer.asm"
tmp_sp_buffer: BLOCK 64 ; ¤«ï á⥪ 
; ‡ £àã§ç¨ª ”Œ
start: ; ®ç¨áâ¨âì ¡ãä¥à ª« ¢ë
LD BC,Dss.ScanKey*256+Dss.K_CLEAR
RST ToDSS
DI
; á®åà. §­ ç¥­¨¥ ¯®à⮢
IN A,(SLOT0)
LD (DSS_PAGE__),A
IN A,(SLOT3)
LD (port_E2__),A
IN A,(PORT_Y)
LD (port_89__),A
; á®åà. ¤¥áªà¨¯â®à ¬¥­¥¤¦¥à 
LD A,(ix-3)
LD (hFile),A
; § ªàëâì ᯥª. íªà ­
LD A,#C0
OUT (PORT_Y),A
; ¢ë¤¥«¨âì 9 áâà. ¯ ¬ïâ¨
LD BC,9*256+Dss.GetMem
RST ToDSS
JR NC,ok_malloc ; Ok
LD A,(hFile) ; ⥪. ¤¥áªà¨¯â®à
LD C,Dss.Close ; § ªàëâì exe-ä ©«
RST ToDSS
LD HL,no_space ; ­¥â ¯ ¬ïâ¨
LD BC,DSS_Error.sys.NOT_ENOUGH_MEMORY*256 + Dss.Exit
abort: EI
PUSH BC
LD C,Dss.PChars
RST ToDSS
POP BC
.loop: RST ToDSS ; ¢ë室 ¢ „Ž‘
DI
HALT
;
ok_malloc: LD (id_block__),A ; åí­¤« ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ
LD HL,page_sys_screen__
LD C,BIOS.GetMemBlkPages
RST ToBIOS
; ã§­ âì ¢¥àá¨î „Ž‘
LD C,Dss.Version
RST ToDSS
LD HL,1*256 + 71 - 1 ; 1.71
AND A
SBC HL,DE
LD HL,old_dss ; ­¥â ¯ ¬ïâ¨
LD BC,DSS_Error.sys.COMMON_ERROR*256 + Dss.Exit
JR NC,abort ; =< 1.71 - ®è¨¡ª 
; à á¯ ª®¢ âì ¬®¤ã«ì 1
;...
; § £à㧨âì ®á­. ª®¤ ¬¥­¥¤¦¥à 
LD A,(page_manager__) ; à ¡®â ¥â ¢ #8000
OUT (SLOT3),A
LD HL,SLOT3.MEM_ADDR
LD DE,FM_CORE_BLK.Size ; à §¬¥à ¬®¤ã«ï 1
LD A,(hFile)
LD C,Dss.Read
RST ToDSS
JP C,read_error
; à á¯ ª®¢ âì ¬®¤ã«ì 2
;...
; § £à. ¤à ©¢¥àë ª« ¢ë/¬ë誨, ®¡à ¡®â稪¨ ®¡ê¥ªâ®¢ ¨ ¤¨ «. ®ª®­
LD A,(page_module0__) ; à ¡®â ¥â ¢ #0000
OUT (SLOT3),A
LD HL,SLOT3.MEM_ADDR
LD DE,FM_MOD_0_BLK.Size ; à §¬¥à ¬®¤ã«ï 2
LD A,(hFile)
LD C,Dss.Read
RST ToDSS
JP C,read_error
LD A,(page_spec__)
LD (0C02Ah),A ; á®åà. ᯥª-áâà ­¨æã (vectors.asm)
; à á¯ ª®¢ âì ¬®¤ã«ì 3
;...
; § £à㧨âì ®¯¨á â¥«¨ ¯ ­¥«¥©
LD A,(page_module1__)
OUT (SLOT3),A
LD HL,SLOT3.MEM_ADDR
LD DE,FM_MOD_1_BLK.Size ; à §¬¥à ¬®¤ã«ï 3
LD A,(hFile)
LD C,Dss.Read
RST ToDSS
JP C,read_error
; à á¯ ª®¢ âì ¬®¤ã«ì 4
;...
; § £à㧨âì ᯥª-ª®¤
LD A,(page_spec__)
OUT (SLOT3),A
LD HL,SLOT3.MEM_ADDR
LD DE,FM_SPEC_BLK.Size ; à §¬¥à ¬®¤ã«ï 4
LD A,(hFile)
LD C,Dss.Read
RST ToDSS
JP C,read_error
LD A,(page_module0__)
LD (VECT.rst28.page+SLOT3.MEM_ADDR),A ; á®åà. ä¬-áâà ­¨æã (vect.asm)
; à á¯ ª®¢ âì ¬®¤ã«ì 5
;...
; § £à㧨âì ¢ìî¥à
; LD A,(page_viewer__)
; OUT (SLOT3),A
; LD HL,SLOT3.MEM_ADDR
; LD DE,FM_FVIEW_BLK.Size ; à §¬¥à ¢ìî¥à 
; LD A,(hFile)
; LD C,Dss.Read
; RST ToDSS
; JP C,read_error
IN A,(SLOT1)
LD (page_viewer__),A
;
; § ªàëâì exe-ä ©« ¬¥­¥¤¦¥à 
hFile+1: LD A,0 ; á®åà. ¤¥áªà¨¯â®à ¬¥­¥¤¦¥à 
LD C,Dss.Close
RST ToDSS
; ¢ª«. ¢ #8000 ®á­. ª®¤ ”Œ
LD A,(page_manager__)
OUT (SLOT2),A
; ¯¥à¥ª ç âì åí­¤«ë áâà ­¨æ
LD HL,id_block__ ; ®âªã¤ 
LD DE,id_block ; ªã¤ 
LD BC,pages_end - id_block__
LDIR
;
LD SP,stack ; á⥪ ”Œ
; ­¥ ¬¥­ïâì ¯®«®¦. ¬ë誨 ”Œ
LD C,Dss.Mouse.ReadState ; ã§­ âì áâ âãá ¬ë誨
RST ToDSS.Mouse
LD (Xcoord),HL ; ª®®à¤¨­ â  X (0..639)
LD (Ycoord),DE ; ª®®à¤¨­ â  Y (0..255)
JP begin ; ¯¥à¥©â¨ ­  ¯à®£à ¬¬ã
; •í­¤«ë áâà ­¨æ ¬¥­¥¤¦¥à 
id_block__: DB -1 ; ¤¥áªà¨¯â®à ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
page_sys_screen__: DB -1 ; +#0000 á¨áâ.íªà ­, +#1400 íªà ­ ”Œ
page_dial_screen__: DB -1 ; ¡ãä¥à á®åà. ¤¨ «. ®ª®­ ¨ ¢¥àâ. ¬¥­î
page_left_dir__: DB -1 ; ᯨ᮪ «¥¢®© ¯ ­¥«¨
page_right_dir__: DB -1 ; ᯨ᮪ ¯à ¢®© ¯ ­¥«¨
page_manager__: DB -1 ; ®á­. ª®¤ ¬¥­¥¤¦¥à 
page_module0__: DB -1 ; ¤à ©¢¥àë ª« ¢ë, ¬ë誨, ¤¨ «. ª®¤ á ®¡à ¡.
page_module1__: DB -1 ; ®¯¨á â¥«¨ ¯ ­¥«¥©
page_spec__: DB -1 ; áâà ­¨æ  à §¡®à  ᯥª-ä㭪権
page_viewer__: DB -1 ; áâà ­¨æ  ¢ìî¥à 
;DB -1
DB 0 ; á⮯-¡ ©â
;
DSS_PAGE__: DB -1 ; á®åà. ¯®àâ 82h
port_E2__: DB -1 ; á®åà. ¯®àâ 0E2h
port_89__: DB -1 ; á®åà. ¯®àâ 89h
pages_end:
; ®è¨¡ª  § £à㧪¨ ¬¥­¥¤¦¥à 
read_error: LD (.number),A
LD A,(id_block__)
LD C,Dss.FreeMem ; ®á¢®¡. ¢ë¤¥«. ¡«®ª ¯ ¬ïâ¨
RST ToDSS
LD A,(hFile)
LD C,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
LD HL,load_err
.number+1: LD B,0
LD C,Dss.Exit
JP abort
no_space: DZ "Not enough memory to run FM!\r\n"
load_err: DZ "Disk loading error!\r\n"
old_dss: DZ "FM requires DSS version 1.71 or higher!\r\n"
; ; <20>®¤£®â®¢¨âì §­ ª®£¥­. ¤«ï á®äâ. ªãàá®à 
; setup_znak: LD A,(page_manager__) ; ¢à¥¬. ¡ãä¥à
; OUT (SLOT2),A
; ; ¯®«ãç¨âì á¨áâ. §­ ª®£¥­.
; LD DE,SLOT2.MEM_ADDR ; ¡ãä¥à ¤«ï 2048 ¡ ©â ¤ ­­ëå
; PUSH DE
; LD C,BIOS.WIN_GET_ZG ; ¯®«ãç¨âì §­ ª®£¥­.
; RST ToBIOS
; ; § ¯®«­¨âì ª®¤®¬ 0FFh 2 ­¨¦­¨¥ «¨­¨¨
; LD HL,SLOT2.MEM_ADDR+(2048-(2*256)) ; ¯®á«¥¤­¨¥ 512 ¡ ©â
; LD BC,511
; LD A,1Ah ; ­®¬¥à §­ ª®£¥­.
; CALL fill_data_font
; POP HL
; ; § ¯®«­¨âì ®áâ «ì­ë¥ 6 «¨­¨© (¯®«­ë© ¡«®ª)
; LD BC,2048-513
; LD A,19h ; ­®¬¥à §­ ª®£¥­.
; ; <20> áâனª  §­ ª®£¥­. ¨ ¥£® ॣ¨áâà æ¨ï
; ; ¢å®¤: a=­®¬¥à §­ ª®£¥­.
; ; hl=¤ ­­ë¥
; ; bc=à §¬¥à ¤ ­­ëå
; fill_data_font: LD E,L
; LD D,H
; LD (HL),-1
; INC DE
; LDIR
; LD DE,SLOT2.MEM_ADDR ; §­ ª®£¥­.
; LD C,BIOS.WIN_SET_ZG ; ãáâ. §­ ª®£¥­.
; RST ToBIOS
; RET
;-------------------------------------------------
; Š®­¥æ § £àã§ç¨ª 
end_loader:
;-------------------------------------------------
; Š®¤ ¬¥­¥¤¦¥à 
;-------------------------------------------------
; incbin 'Build/fm.bin'
INCLUDE 'main.asm'