File-Manager/MOD2/INFO.ASM
2025-04-04 00:37:36 +10:00

612 lines
13 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.

;/////////////////////////////////////////////////////////////////////
; ‚뢮¤ ¤ ­­ëå  ªâ. ¯ ­¥«¨ -> ¢ ¯ áá. ¯ ­¥«ì (¢ë§ë¢ ¥âáï ¨§ ä ©«¥à )
; <âਣ£¥à­ ï ä¨âç >
;/////////////////////////////////////////////////////////////////////
alt_info_panel:
call test_show_panels ; â¥áâ ­  ०¨¬ ¢ª«. ¯ ­¥«¥©
ret z ; ¢ëª«.
; â¥áâ ­ «¨ç¨ï qview-ä®à¬ â  ­   ªâ. ¯ ­¥«¨
ld a,(format_mode) ; ä®à¬ â  ªâ. ¯ ­¥«¨
and form_info
jr nz,set_norm_actpanel2 ; ¢ë¢¥á⨠­®à¬.  ªâ¨¢­ãî ¯ ­¥«ì
ld hl,info1_ ; âਣ£¥à ¯ áá. ¯ ­¥«¨
ld a,(hl)
or a
jr nz,set_norm_noactpanel2 ; ¢ë¢¥á⨠­®à¬. ¯ áᨢ­ãî ¯ ­¥«ì
jr set_info_noactpanel ; info-¯ ­¥«ì ¢ ¯ áá. ¯ ­¥«¨ ( ªâ. ¤ ­­ë¥)
;--------------------------------------------------
; ‚뢥á⨠­®à¬ «ì­®©  ªâ. ¯ ­¥«ì
;--------------------------------------------------
set_norm_actpanel2:
ld hl,info_ ; âਣ£¥à  ªâ. ¯ ­¥«¨
ld (hl),0 ; á¡à. âਣ£¥à
inc hl
ld a,(hl) ; ï祩ª  form_under_info
ld (format_mode),a ; ä®à¬ â  ªâ. ¯ ­¥«¨
jp A20FC ; ¢ë¢¥á⨠¯ ­¥«ì
;--------------------------------------------------
; ‚뢥á⨠­®à¬ «ì­®© ¯ áá. ¯ ­¥«ì
;--------------------------------------------------
set_norm_noactpanel2:
call change_panel
call set_norm_actpanel2
jp change_panel
;----------------------------------------------------
; ‚뢥á⨠info-¯ ­¥«ì ¢  ªâ. ¯ ­¥«¨ (¯ áá. ¤ ­­ë¥)
; (¢ë§ë¢ ¥âáï ¨§ Œ¥­î)
;----------------------------------------------------
set_info_actpanel:
; § ¯®«­¨âì ¤ ­­ë¬¨ â¨â«-®¯¨á â¥«ì + ãáâ. ¥£® ⨯
call change_panel
call get_info_data
call change_panel
set_info_actpanel1:
ld de,format_mode ; ä®à¬ â  ªâ. ¯ ­¥«¨
ld a,(de)
bit 3,a ; info
ret nz ; ­¥ ®âà ¡. ¯®¢â®à­®
bit 4,a ; qview
jr z,$+5
ld a,(form_under_qview) ; ä®à¬ â ¯®¤ qview-¯ ­¥«ìî
ld hl,info_ ; âਣ£¥à  ªâ. ¯ ­¥«¨
ld (hl),1 ; ãáâ. âਣ£¥à
inc hl
ld (hl),a ; form_under_info
and form_trd ; ãç¥áâì 6-© ¡¨â ᯥª-ä®à¬ â 
or form_info
ld (de),a ; ãáâ. info-ä®à¬ â
xor a
ld (qview_),a ; á¡à. qview-âਣ£¥à
ld (enter_done3+1),a ; á¡à. ä« £ ®¡­®¢«¥­¨ï info-¯ ­¥«¨
ret
;----------------------------------------------------
; ‚뢥á⨠qview-¯ ­¥«ì ¢ ¯ áá. ¯ ­¥«¨ ( ªâ. ¤ ­­ë¥)
;----------------------------------------------------
set_info_noactpanel:
; § ¯®«­¨âì ¤ ­­ë¬¨ â¨â«-®¯¨á â¥«ì + ãáâ. ¥£® ⨯
call get_info_data
xor a
ld (D48B1),a ; á¡à. ¨­¢¥àá¨î â¨â« 
call change_panel
call set_info_actpanel1 ; ¢ë¢®¤  ªâ. ¯ ­¥«¨
call draw_half_frame ; ®ç¨áâ¨âì ¯ ­¥«ì
call prn_up_path ; ¢ë¢¥á⨠§ ¯®«­. ®¯¨á â¥«ì
call change_panel
ld a,true
ld (D48B1),a ; ãáâ. ¨­¢¥àá¨î â¨â« 
ret
;-----------------------------------------------------------
; ‡ ¯®«­¨âì â¨â«-®¯¨á â¥«ì ¤ ­­ë¬¨ ¤¨áª  ( ªâ. ¤ ­­ë¥)
;-----------------------------------------------------------
get_info_data:
ld hl,win_info_panel ; ®¯¨á â¥«ì "Calculating disk space..."
call WinSimple ; ®âªàëâì ®ª­®
;
; ­ áâநâì áâபã ⥪. ¤ âë
call info_get_date
;
; ’¥áâ ­  ­ «¨ç¨¥ ¬/á CMOS
ld c,0F5h
rst 08h
ld hl,cmos_yes ; "Yes"
jr nc,$+5
ld hl,cmos_no ; " No"
ld b,3 ; ¤«¨­  áâப¨
ld ix,info_cmos_string
call A0E90 ; ᪮¯¨à®¢ âì áâபã
;
; ‚¥àá¨ï BIOS
ld hl,work_buffer ; ¢à¥¬. ¡ãä¥à
ld c,0EFh ; ¨­ä  ® ¢¥àᨨ <20>¨®á  ¨ ¦¥«¥§ 
rst 08h
push bc
push de
xor a
ld l,d
ld h,a
ld ix,info_bios_version ; ¡ãä¥à
exx
ld l,a ; áâ. à §àï¤
ld h,a
exx
ld bc,0120h ; á ¢¥¤ãé. ¯à®¡¥«®¬
ld iy,tmp1__
res 7,(iy+0)
call dec2
pop hl
ld a,l
ld (ix+0),"."
inc ix
call dec8
pop hl
ld h,0
ld (ix+0),"."
inc ix
call dec16
;
; Board ID
ld bc,01EDh
rst 08h
ld ix,info_board_id ; ¡ãä¥à
push de
push hl
ld a,b
call hex8 ; hex
ld (ix+0),"-"
inc ix
ld a,c
call hex8 ; hex
ld (ix+0),"-"
inc ix
pop hl ; ¬«. à §àï¤
exx
ld hl,0 ; áâ. à §àï¤
exx
ld bc,0130h ; á ¢¥¤ãé. ­ã«ï¬¨
ld iy,tmp1__
res 7,(iy+0)
call dec5 ; 16-bit ¤¥áïâ. ¢ë¢®¤ (á ¢¥¤. ­ã«ï¬¨)
pop hl
call hex16 ; hex
;
; ’¥ªã騩 ¤¨áª
ld a,(disk)
add a,"A"
ld (info_hdd+14),a ; ï祩ª  ¡ãª¢ë ¤¨áª 
ld (info_cdrom+15),a
ld (info_fdd+16),a
ld (info_ram+13),a
; ¯à®ç¨â âì BPB ¤¨áª 
ld a,(disk) ; ­®¬¥à ¤¨áª 
ld c,1 ; open device
rst 18h
jr c,get_inf_data_err
ld a,(disk)
ld de,work_buffer ; ¡ãä¥à
ld c,4 ; get BPB
rst 18h
push af
ld a,(disk) ; ­®¬¥à ¤¨áª 
ld c,2 ; close device
rst 18h
pop af
jr c,get_inf_data_err
; ¡ ©â ä®à¬ â  ­®á¨â¥«ï
ld a,(work_buffer+21)
ld (media_byte),a
get_inf_data_err:
; ‘¥à¨©­ë© ­®¬¥à «®£. ¤¨áª 
ld ix,info_serial ; xxxx-xxxx
ld hl,(work_buffer+41) ; áâ.ç áâì
call hex16
ld (ix+0),"-"
inc ix
ld hl,(work_buffer+39) ; ¬«.ç áâì
call hex16
;
; Œ¥âª  ¤¨áª 
ld a,(disk) ; ­®¬¥à ¤¨áª 
cp 2 ; ¬¥­ìè¥ "C:" ?
jr nc,get_inf_data1 ; ¬¥âª  ¢ BPB
; floppy, ¬¥âª  - § ¯¨áì ä ©« 
ld c,1 ; ãáâ. ¤¨áª
rst 10h
ld hl,scan_mask ; "*.*" ¨¬ï ¯®¨áª  ¬¥âª¨ ⮬ 
ld de,work_buffer+127;255
ld a,8 ;  âਡãâ ¬¥âª¨ ⮬ 
ld bc,0019h ; F_FIRST, ä®à¬ â "FilenameExt"
rst 10h
jr c,get_inf_data1 ; ¬¥âª¨ ­¥â
ld hl,work_buffer+127+43 ;+255+43 ®âªã¤  (ª®­¥æ ¬¥âª¨)
jr $+5
get_inf_data1:
ld hl,work_buffer+53 ; ®âªã¤  (ª®­¥æ ¬¥âª¨)
ld de,info_volume+10 ; ªã¤  (ª®­¥æ áâப¨)
ld ix,info_volume
call copy_volume ; ᪮¯¨à. ¬¥âªã
;
; Ž¡ê¥¬ ¤¨áª 
ld a,(disk) ; ­®¬¥à ¤¨áª 
ld c,3 ; ¨­ä  ® ¤¨áª¥
rst 10h
jr nc,get_inf_data_ok
xor a
ld l,a
ld h,a
ld e,a
ld d,a
ld c,a
ld b,a
inc a
get_inf_data_ok:
; a=à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; bc=à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; hl=®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; de=᢮¡. ª« áâ¥à®¢
push de
push hl
ld hl,0
add hl,bc ; ¢ëç¨á«¨âì à §¬¥à ª« áâ¥à 
dec a
jr nz,$-2
ex de,hl ; de=à §¬¥à ª« áâ¥à 
pop bc ; ®¡é.ª®«-¢® ª« áâ¥à®¢
call mul_bcde ; bc*de=hlbc ®¡é¨© ®¡ê¥¬ ¤¨áª 
push hl
exx
pop hl ; áâ.à §àï¤
exx
ld l,c ; ¬«.à §àï¤
ld h,b
push de
ld ix,info_total_bytes ; 0,000,000,000
call decimal32
; ᢮¡®¤­®¥ ¬¥áâ®
pop de ; à §¬¥à ª« áâ¥à 
pop bc ; ᢮¡. ª« áâ¥à®¢
call mul_bcde ; bc*de=hlbc ᢮¡. ¬¥áâ®
push hl
exx
pop hl ; áâ.à §àï¤
exx
ld l,c ; ¬«.à §àï¤
ld h,b
ld ix,info_free_bytes ; 0,000,000,000
call decimal32
; ‚ᥣ® ¯ ¬ïâ¨
ld c,3Ch ; ¨­ä®à¬ æ¨ï ® ¯ ¬ïâ¨
rst 10h
push bc
ld ix,info_total_memory ; 0,000,000
call conv_kbytes ; kbytes -> bytes ¨ ¢ë¢®¤ ¢ ¡ãä¥à
pop hl
; ‘¢®¡®¤­ ï ¯ ¬ïâì
ld ix,info_free_memory ; 0,000,000
call conv_kbytes ; kbytes -> bytes ¨ ¢ë¢®¤ ¢ ¡ãä¥à
;
; ¢ë¢®¤ áâப¨ ¤¨áª   ªâ. ¯ ­¥«¨
db 3Eh ; ld a,..
media_byte:
db 0 ; ¡ ©â ä®à¬ â  ¨§ BPB
ld hl,info_hdd ; fixed disk
cp 0F8h
jr z,get_inf_data2
ld hl,info_fdd ; removable disk
cp 0F0h ; 1.44Mb
jr z,get_inf_data3
cp 0F9h ; 720kB
jr z,get_inf_data3
ld hl,info_ram ; ram-disk
cp 0FAh
jr z,$+5
ld hl,info_cdrom ; cd-rom
get_inf_data2:
ld de,info_type_device ; ªã¤ 
ld bc,19 ; ¤«¨­  áâப¨
ldir
; â¥áâ ­  ᯥª-ä®à¬ â
ld a,(format_mode)
and form_trd
call nz,get_spec_info ; § ¯®«­¨âì ᯥª-®¯¨á â¥«ì
; ®ç¨áâ¨âì ¡ãä¥à ª« ¢ë
ld a,1
rst 20h
; § ªàëâì ®ª­® "Calculating disk space..."
jp CloseWinSimple
get_inf_data3:
ld a,(disk) ; ­®¬¥à ¤¨áª 
cp 2 ; ¬¥­ìè¥ "C:" ?
jr c,$+5
ld hl,info_ram ; ram-¤¨áª
jr get_inf_data2
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¨¬ï ¬¥âª¨ ¤¨áª .
; ¢å®¤: hl=®âªã¤  (ª®­¥æ ¬¥âª¨)
; de=ªã¤  (ª®­¥æ áâப¨ ¬¥âª¨)
; ix=­ ç «® áâப¨ ¬¥âª¨
copy_volume:
ld bc,11 ; ¤«¨­  ¬¥âª¨
ld a,(hl)
cp " "+1
jr nc,$+10
dec hl
dec c
jr nz,$-7
ld a,11
jr $+7
;
ld a,11
sub c
lddr
ld b,a
or a ; ¤«¨­  ¬¥âª¨ 11 ᨬ¢. ?
call nz,spaces ; ¤®¯®«­¨âì ¢¥¤. ¯à®¡¥«ë
ret
; <20>¥à¥¢®¤ ç¨á«  áâà ­¨æ ¢ ¡ ©âë ¨ ¢ë¢®¤ ç¨á«  ¢ ¡ãä¥à
; ¢å®¤: hl=ç¨á«® áâà ­¨æ
; ix=¡ãä¥à
conv_kbytes:
add hl,hl ; à §¬¥à ¯ ¬ï⨠¢ kB
add hl,hl ; x4
add hl,hl ; x8
add hl,hl ; x16
; ¯¥à¥¢®¤¨¬ ¢ ¡ ©âë
ex de,hl
ld bc,1024 ; 1 ª¨«®¡ ©â
call mul_bcde ; bc*de=hlbc ¢á¥£® ¯ ¬ïâ¨
push hl
exx
pop hl ; áâ.à §àï¤
exx
ld l,c ; ¬«.à §àï¤
ld h,b
ld iy,tmp2__
res 7,(iy+0)
jp decimal24
;-------------------------------------------------
; <20> áâநâì ¢ info-®¯¨á â¥«¥ áâபã ⥪. ¤ âë
;-------------------------------------------------
info_get_date:
ld c,21h ; á¨áâ. ¤ â 
rst 10h
push ix ; £®¤
push de ; ¤¥­ì/¬¥áïæ
ld ix,info_date_string ; ¡ãä¥à
ld bc,0120h ; á ¢¥¤ãé. ¯à®¡¥«®¬
ld iy,tmp1__
res 7,(iy+0)
ld l,d ; ¤¥­ì
ld h,0
call dec2 ; 0..99 ç¨á«®
pop hl
ld c,l ; ¬¥áïæ
ld h,0
add hl,hl
ld de,info_array_months-2
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
ld de,info_date_string+3 ; ¡ãä¥à
; ᪮¯¨à. ¨¬ï ¬¥áïæ 
info_get_date_loop:
ld a,(hl)
ld (de),a
inc hl
inc de
or a
jr nz,info_get_date_loop
dec de
ld a," "
ld (de),a
inc de
push de
pop ix ; ¡ãä¥à
pop hl ; £®¤
push bc
ld b,0 ; ­¥ ¢áâ ¢«ïâì ¢¥¤ãé. ᨬ¢®«
ld iy,tmp1__
res 7,(iy+0)
call dec4 ; 0..9999 ç¨á«®
ld (ix+0),0 ; ª®­¥æ ®¯¨á â¥«ï
pop bc ; c=¬¥áïæ
; ­ áâநâì ï祩ª¨ ®¯¨á â¥«ï
ld a,c
ld c,7+8 ; ¯®«­ ï ¤«¨­  áâப¨
ld b,0Ch
dec a ; a=1
jr z,info_get_date1
inc c
dec a ; a=2
jr z,info_get_date1
ld c,5+8
inc b ; b=0Dh
dec a ; a=3
jr z,info_get_date1
dec a ; a=4
jr z,info_get_date1
inc b ; b=0Eh
ld c,3+8
dec a ; a=5
jr z,info_get_date1
inc c
dec a ; a=6
jr z,info_get_date1
dec a ; a=7
jr z,info_get_date1
dec b ; b=0Dh
ld c,6+8
dec a ; a=8
jr z,info_get_date1
dec b
dec b ; b=0Bh
ld c,9+8
dec a ; a=9
jr z,info_get_date1
inc b ; b=0Ch
ld c,7+8
dec a ; a=10
jr z,info_get_date1
inc c
info_get_date1:
ld hl,info_date_string-1
ld (hl),b ; X ¯®«®¦. áâப¨
ld hl,info_date
ld (hl),c ; ¤«¨­  áâப¨
ret
info_array_months:
dw inf_jan
dw inf_feb
dw inf_mar
dw inf_apr
dw inf_may
dw inf_jun
dw inf_jul
dw inf_aug
dw inf_sep
dw inf_oct
dw inf_nov
dw inf_dec
inf_jan:db "January",0
inf_feb:db "February",0
inf_mar:db "March",0
inf_apr:db "April",0
inf_may:db "May",0
inf_jun:db "June",0
inf_jul:db "July",0
inf_aug:db "August",0
inf_sep:db "September",0
inf_oct:db "October",0
inf_nov:db "November",0
inf_dec:db "December",0
;-------------------------------------------------
; ‡ ¯®«­¨âì ᯥª-®¯¨á â¥«ì ¤ ­­ë¬¨ ᯥª-¨¬¨¤¦ 
; ¢å®¤: § ¯®«­. ¡ãä¥à ¤ ­­ë¬¨ ᯥª-¨¬¨¤¦ 
;-------------------------------------------------
get_spec_info:
; ’¨¯ ®¡à § 
ld a,(image_type); ; ¨­¤¥ªá ⨯ 
ld c,a
add a,a ;1+1=2
add a,c ;2+1=3
ld c,a
ld b,0
ld hl,list_image_types ; ᯨ᮪ ⨯®¢ ®¡à § 
add hl,bc ; ®âªã¤ 
ld de,img_type ; ªã¤ 
ld bc,3
ldir
; Œ¥âª  ¤¨áª 
ld hl,test_vol+10; ; ®âªã¤  (ª®­¥æ ¬¥âª¨)
ld de,trd_vol+10 ; ªã¤  (ª®­¥æ áâப¨)
ld ix,trd_vol ; ­ ç «® áâப¨ ¬¥âª¨
call copy_volume ; ᪮¯¨à. ¬¥âªã
; ’¨¯ ¤¨áª 
ld a,(spec_type); ; ¨­¤¥ªá ⨯ 
ld c,a
add a,a ;1+1=2
add a,a ;2+2=4
add a,c ;4+1=5
ld c,a
ld b,0
ld hl,list_disk_types ; ᯨ᮪ ⨯®¢ ᯥª-¤¨áª 
add hl,bc ; ®âªã¤ 
ld de,trd_type ; ªã¤ 
ld bc,5
ldir
; ‡ é¨â  ®â § ¯¨á¨
ld a,0; ; ä« £ § é¨âë 0=­¥â, 1=¥áâì
or a
ld hl,"a " ; " absent"
ld a,"b"
jr z,$+7
ld hl,"rp" ; "present"
ld a,"e"
ld (trd_protect),hl ; ¯¥à¥¯¨á âì âà¨
ld (trd_protect+2),a ; ¯¥à¢ë¥ ᨬ¢®«ë
; ‚ᥣ® ä ©«®¢
ld a,255; ; ç¨á«®
ld ix,trd_files ; ¡ãä¥à
call dec9 ; ¢ë¢®¤ ç¨á¥« 0..999 á ¢¥¤ãé. ¯à®¡¥«®¬
; “¤ «¥­­ëå ä ©«®¢
ld a,0; ; ç¨á«®
ld ix,trd_delfiles ; ¡ãä¥à
call dec9
; ¤«ï SCL-¨¬¨¤¦  ¤ «ìè¥ ®¡­ã«¨âì
ld a,(image_type) ; ⨯ ¨¬¨¤¦ 
or a
jr nz,get_spec_inf_scl ; scl, ®¡­ã«¨âì
; <20>¥à¢ ï ᢮¡®¤­ ï ¤®à®¦ª 
ld de,1; ; ç¨á«®
ld ix,ffree_trk ; ¡ãä¥à
call dec16s ; ¢ë¢®¤ ç¨á¥« 0..65535 á ¢¥¤. ¯à®¡¥«®¬
; <20>¥à¢ë© ᢮¡®¤­ë© ᥪâ®à
ld de,0; ; ç¨á«®
ld ix,ffree_sec ; ¡ãä¥à
call dec16s
; ‘¢®¡®¤­ëå ᥪâ®à®¢
ld de,2544; ; ç¨á«®
ld ix,free_sec ; ¡ãä¥à
jp dec16s
; ®¡­ã«¨âì 3 §­ ç¥­¨ï
get_spec_inf_scl:
ld bc,5
ld a,c
ld hl,spec_null ; ®âªã¤ 
ld de,ffree_trk ; ¡ãä¥à "First free trk"
ldir
ld hl,spec_null
ld de,ffree_sec ; ¡ãä¥à "First free sec"
ld c,a
ldir
ld hl,spec_null
ld de,free_sec ; ¡ãä¥à "Number of free sectors"
ld c,a
ldir
ret
spec_null:
db " 0" ; ®¡­ã«ï«ª 
; ’¨¯ ᯥª-¨¬¨¤¦  (0=TRD, 1=SCL)
image_type:
db 0 ; ¨­¤¥ªá
; ’¨¯ ᯥª-¤¨áª  (0=2S/DD, 1=2S/SD, 2=1S/DD, 3=1S/SD, 4=??/??)
spec_type:
db 0 ; ¨­¤¥ªá
; ᯨ᮪ ⨯®¢ ¨¬¨¤¦¥©
list_image_types:
db "TRD" ; 0
db "SCL" ; 1
; ᯨ᮪ ⨯®¢ ᯥª-¤¨áª®¢
list_disk_types:
db "2S/DD" ; 0
db "2S/SD" ; 1
db "1S/DD" ; 2
db "1S/SD" ; 3
db "??/??" ; 4
; â¥á⮢ ï áâப . ã¡à âì
test_vol:;
db "ADVENT#10/2";