ZX-SP-ROMs/TRDOS/TR_MSD_3.ASZ
2025-06-16 04:41:18 +10:00

1229 lines
19 KiB
Plaintext
Raw Permalink 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.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

File_Start DEFL $
DISPLAY "===================================================="
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
INIT_RMD:
DI
LD BC,BIOS.REINIT.FREE_NO_ZX_MEM ; [ ] free zx pages!
;!TEST 06/01/2024 á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨© § ç¥¬-â®
CALL EXP_FNS
; [ ] 23/02/2024 £à®å ¥¬ ¯¥à¥å¢ â à¥á¥â 
LD A,ACEX.RET_PORT
LD BC,BIOS.SET_PORTS
JP EXP_FNS
;
; DI
; LD C,PAGE3
; IN B,(C)
; LD A,SYS_PAGE
; OUT (C),A
; LD A,(0C000H)
; CPL
; LD (0C000H),A
; OUT (C),B
; EI
; CALL INIT_SYS_PAGE
; JP AUTO_03E1
;INIT_SYS_PAGE:
; LD C,97H
; CALL EXP_FNS
; EI
; RET
RAMD_FAT_PROG:
CALL AUTO_1D97 ; CLS
CALL OPEN_CH2
LD HL,SYS_PAGE.RAM_TABLE
RAMD_F_L1:
DI
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD C,(HL)
OUT (SLOT3),A
EI
PUSH HL
LD A,C
CALL PRINT_HEX_A
POP HL
INC L
JR NZ,RAMD_F_L1
CALL OPEN_CH0
JP AUTO_03E1
;***************************************************************************
;[x] ¨á¯à ¢«¥­ ¡ £ á ­¥à ¡®â î騬¨ ª®¬ ­¤ ¬¨ TBON/TBOFF
TB_ONOFF:
DEC DE
DEC DE
LD A,(DE)
OR %0010'0000
CP 'f'
LD C,BIOS.FN_TURBO
LD A,BIOS.FN_TURBO.OFF
JR Z,.set
;
LD A,BIOS.FN_TURBO.ON
.set: JP EXP_FNS
; TB_ON_EXE:
; LD C,BIOS.FN_TURBO
; LD A,4
; JP EXP_FNS
; TB_OFF_EXE:
; LD C,BIOS.FN_TURBO
; LD A,3
; JP EXP_FNS
;
;***************************************************************************
;
; €«£®à¨â¬ ç⥭¨ï ä ©« 
;
;***************************************************************************
; ‚室 - ¤ ­­ë¥ ä ©«  ¢ ¯¥à¥¬¥­­ëå TR-DOS - ¤«¨­ ,áâ àâ®¢ë© ª« áâ¥à
;  ¤à¥á § £à㧪¨, ­ ç «ì­ë© ¡«®ª § £à㧪¨
; ¯à¥¤¢ à¨â¥«ì­®¥ §­ ç¥­¨¥ max2 - ¤«¨­  ¡«®ª , ä« £ ¡«®ª®¢®©
; § £à㧪¨
;***************************************************************************
MSDOS_WRITE_FILE:
LD (ZX_VARS.CONT_BUF_ADR),HL ;  ¤à¥á § £à㧪¨
LD (ZX_VARS.MED_START),A ; áâà ­¨æ  § £à㧪¨
LD A,TRDOS_ROM_CMD.WRITE
JR MSDOS_R_W_FILE
;
MSDOS_READ_FILE:
LD (ZX_VARS.CONT_BUF_ADR),HL ;  ¤à¥á § £à㧪¨
LD (ZX_VARS.MED_START),A ; áâà ­¨æ  § £à㧪¨
LD A,TRDOS_ROM_CMD.READ
MSDOS_R_W_FILE:
LD (ZX_VARS.MED_LEN),A
; beg=start_claster. <20>®«ãç¨âì ­ ç «ì­ë© ª« áâ¥à
LD IX,(ZX_VARS.START_CLUSTER) ; áâ àâ®¢ë© ª« áâ¥à
; next=beg
; max=file_len. ¤«¨­  ¢ ª« áâ¥à å
CALL GET_FILE_CLASTERS_BC
; LD A,B
; CALL PRINT_HEX_A
; LD A,C
; CALL PRINT_HEX_A
msd_rf_cont2:
; max2=blk_len ; ¤«¨­  ¡«®ª  ¢ ª« áâ¥à å
; DI ; GET_BLK_CLASTERS_L
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(C_P_B)
; LD L,A
; EX AF,AF'
; OUT (SLOT3),A
; EI
LD L,128
msd_rf_cont1:
; num=0
PUSH IX
POP DE
LD A,0
;---------------------------------
msd_rf_cont:
; num=num+1
INC A
; if num=max then goto msd_rf_last_blk ; <20>஢¥à¨âì ç¨á«® ª« áâ¥à®¢,
CP C
JR NZ,msd_rf_l1
DEC B
INC B
JR Z,msd_rf_last_blk
msd_rf_l1:
; if num=max2 then goto msd_rf_blk ; <20>஢¥à¨âì ç¨á«® ª« áâ¥à®¢,
CP L
PUSH HL
PUSH BC
PUSH AF
JR Z,msd_rf_blk
; sec=next ; ç¨â ¥¬ëå §  ®¤¨­ à §
; next=FAT(sec) ; ‚ëç¨á«¨âì á«¥¤ãî騩 ª« áâ¥à
CALL FAT_DE_to_HL
; if next = end then goto msd_rf_last_blk ; ¯à®¢¥à¨âì ª®­¥æ
JR C,msd_rf_last_blk2
EX DE,HL
AND A
INC HL
; if next-sec = 1 then goto msd_rf_cont ; <20>஢¥à¨âì next
SBC HL,DE
JR NZ,msd_rf_blk2
POP AF
POP BC
POP HL
JR msd_rf_cont
;---------------------------------
msd_rf_blk:
CALL FAT_DE_to_HL
JR C,msd_rf_last_blk2
EX DE,HL
msd_rf_blk2:
; beg=next
; EX DE,IX
PUSH IX
PUSH DE
POP IX
POP DE
POP AF
PUSH AF
call READ_num_clasters_from_beg ; ç¨â âì á ª« áâ¥à  DE
POP AF
POP BC
POP HL
LD H,A
; max=max-num
LD A,C
SUB H
LD C,A
JR NC,msd_rf_l2
DEC B
msd_rf_l2:
; max2=max2-num ; ¡«®ª ®ª®­ç¥­ ?
LD A,L
SUB H
LD L,A
; if not max2=0 then goto msd_rf_cont1 ; ¥á«¨ ¤ ,á«¥¤ãî騩 ¡«®ª
JR NZ,msd_rf_cont1
; max2=blk_len ; ¤«¨­  ¡«®ª  ¢ ª« áâ¥à å ¤«ï ç⥭¨ï
JR msd_rf_cont2
;-------------------------------
msd_rf_last_blk2:
POP AF
POP BC
POP HL
msd_rf_last_blk:
; EX DE,IX
push de
push ix
pop de
pop ix
call READ_num_clasters_from_beg
RET
;=========================================
READ_num_clasters_from_beg:
PUSH IX
PUSH DE
CALL CLAST_TO_SEC
PUSH AF
LD A,(ZX_VARS.MED_LEN)
LD C,A
SUB TRDOS_ROM_CMD.READ
JR Z,CONT_XX1
DEC A
JR NZ,SKEEP_XX1
;TRDOS_ROM_CMD.WRITE
CONT_XX1:
POP AF
ADD A,A
INC A
LOOP_128:
PUSH AF
PUSH DE
PUSH IX
PUSH BC
LD HL,(ZX_VARS.CONT_BUF_ADR)
LD A,(ZX_VARS.MED_START)
CALL MSD_R_W_UT
LD (ZX_VARS.CONT_BUF_ADR),HL
LD (ZX_VARS.MED_START),A
POP BC
POP IX
POP DE
POP AF
LD H,0
LD L,B
AND A
ADC HL,DE
JR NC,NO_INC_IX
INC IX
NO_INC_IX:
EX DE,HL
LD B,128
DEC A
JR NZ,LOOP_128
POP DE
POP IX
RET
SKEEP_XX1:
POP AF
POP DE
POP IX
RET
;*****************************************
;!TODO ¯®á¬®âà¥âì
; MADE_next_blk:
; PUSH BC
; LD C,BIOS.GetMemPageNext
; CALL EXP_FNS
; POP BC
; INC L ; SET ZF, if END BLK !!!
; LD HL,#C000
; RET
;*****************************************
CLAST_TO_SEC:
PUSH AF
EX DE,HL
CALL CALC_CLAST
DI
IN A,(SLOT3)
LD B,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
LD C,A
LD A,B
OUT (SLOT3),A
EI
POP AF
PUSH HL
LD L,A
LD H,0
LD A,C
CLAST_TO_SEC_L:
RRA
JR C,CLAST_TO_SEC_L2
ADD HL,HL
JR CLAST_TO_SEC_L
CLAST_TO_SEC_L2:
LD B,L
LD A,H
POP HL
RET
FAT_DE_to_HL:
; LD H,D
; LD L,E
; INC HL
; AND A
; RET
PUSH AF
PUSH DE
PUSH BC
PUSH IX
DI
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD HL,(SYS_PAGE.FAT_FLAG)
LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; à §¬¥à ᥪâ®à 
OUT (SLOT3),A
EI
PUSH HL
LD A,H
AND #80
LD C,A
LD H,D
LD L,E
ADD HL,DE
ADC A,C
JR NC,FAT_12_L1
ADD HL,DE
ADC A,C
FAT_12_L1:
ADD HL,DE
ADC A,C
RRA ; A,HL = FATx4..3/2
RR H
RR L
POP DE ; ¢®ááâ ­®¢¨âì ä« £¨ FAT ¢ DE
PUSH AF ; § ¯®¬­¨âì ä« £ ᬥ饭¨ï
; HL - ᬥ饭¨¥ ®â ­ ç «  FAT
; A,HL - ᬥ饭¨¥ ¢ FAT
PUSH HL
LD C,0
PUSH BC
FAT_DE_L1:
RR B
JR C,FAT_DE_L2
RRA
RR H
JR FAT_DE_L1
FAT_DE_L2:
LD A,H ; A - ᥪâ®à FAT
BIT 0,D
JR NZ,CALL_ALL
CP E ; ­®¬¥à à ­¥¥ áç¨â ­­®£® ᥪâ®à  FAT
CALL_ALL:
CALL NZ,READ_FAT_SEC ; ç¨â âì FAT ᥪâ®à ­®¬¥à A
POP BC ; ¢á¯®¬­¨âì à §¬¥à ᥪâ®à 
POP HL ; ¢á¯®¬­¨âì  ¤à¥á ¢ FAT
DEC BC
LD A,H
AND B
LD H,A
LD BC,SYS_PAGE.MS_FAT
ADD HL,BC
DI
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD (SYS_PAGE.FAT_FLAG),DE
LD C,(HL) ; áç¨â âì ª« áâ¥à
INC HL
LD B,(HL)
INC HL
OUT (SLOT3),A
; RET_PAGE3
EI
POP AF
JR NC,FAT_HALF
LD A,4
FAT_HALF_L:
RR B
RR C
DEC A
JR NZ,FAT_HALF_L
FAT_HALF:
BIT 7,D
LD A,#FF
JR NZ,FAT_16_L2
LD A,#0F
AND B
LD B,A
LD A,#0F
FAT_16_L2:
CP B
JR NZ,NO_END_CLAST
;FAT_ALL:
LD A,C
CP #F0
JR C,NO_END_CLAST
LD L,C
LD H,B
POP IX
POP BC
POP DE
POP AF
SCF
RET
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
;INCLUDE 'trdos/tr_msd_4.asz'
;-----------------------------------------------------------------------
_mInfoBLOCK #09FF-$, #FF
;த¨®­®¢áª¨© ¢¥ªâ®à ¯à¥à뢠­¨ï
DW #FFFF
;-----------------------------------------------------------------------
NO_END_CLAST:
; PUSH AF
; LD A,B
; CALL PRINT_HEX_A
; LD A,C
; CALL PRINT_HEX_A
; POP AF
LD H,B
LD L,C
POP IX
POP BC
POP DE
POP AF
AND A
RET
ERROR_MSG:
LD HL,MSG_3 ; ERROR msg
;LD HL,AUTO_29B2 ; ERROR msg
JP AUTO_03E4
;**********************************************
READ_FAT_SEC:
PUSH IX
PUSH HL
PUSH BC
LD E,A
RES 0,D
PUSH DE
LD D,0
DI
IN A,(SLOT3)
LD L,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,L
LD IX,(SYS_PAGE.MSD_FAT_SEC)
LD HL,(SYS_PAGE.MSD_FAT_SEC2)
OUT (SLOT3),A
EI
LD BC,0
ADD IX,DE
ADC HL,BC
PUSH IX
POP DE
PUSH HL
POP IX
LD HL,(ZX_VARS.CONT_BUF_ADR)
LD A,(ZX_VARS.MED_START)
PUSH AF
PUSH HL
LD HL,SYS_PAGE.MS_FAT
LD A,SYS_PAGE
LD BC,256*2 + TRDOS_ROM_CMD.READ
CALL MSD_R_W_UT
POP HL
POP AF
LD (ZX_VARS.CONT_BUF_ADR),HL
LD (ZX_VARS.MED_START),A
POP DE
POP BC
POP HL
POP IX
RET
;**********************************************
;
; ‘ç¨â뢠­¨¥ FAT ¯® âਠᥪâ®à  ???
;
;**********************************************
GET_FILE_CLASTERS_BC:
DI
IN A,(SLOT3)
LD L,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,L
LD HL,(SYS_PAGE.CLUSTER_LEN)
OUT (SLOT3),A
; RET_PAGE3
EI
LD BC,(ZX_VARS.FL_SIZE)
LD A,(ZX_VARS.FL_SIZE+2)
LD DE,0
SCF
GET_FL_CL_2: ; ¢ëç¨á«¥­¨¥ ª®«¨ç¥á⢠ ª« áâ¥à®¢ ¢ ä ©«¥
RR H ; HL/2
RR L
JR C,GET_FL_L2 ; ¥á«¨ ¯¥à¢ë© ¡¨â = 1 - ¢ë©â¨ ¨§ 横« 
RRA ; file_len/2
RR B
RR C
JR NC,GET_FL_CL_2
LD E,1
JR GET_FL_CL_2
GET_FL_L2:
BIT 0,E
RET Z
INC BC
RET
;**********************************
; MS-DOS system
;**********************************
MSDOS_FIND_FILE:
PUSH DE ; ˆŒŸ ˆ‘ŠŽŒŽƒŽ ”€‰‹€
CALL MSDOS_1ST_FL
POP DE
RET C
FIND_LOOP_ALL:
CALL MSDOS_KOMP_FL
RET Z ; އ<E280A1> - ”€‰‹ <20>€‰„…<E2809E> !!
;MSDOS_FIND_NEXT:
CALL MSDOS_NEXT_FL
JR NC,FIND_LOOP_ALL
RET
;***********************************************
;
; CHECK_BPB:
; IN A,(SLOT3)
; LD E,A
; LD A,SYS_PAGE
; DI
; OUT (SLOT3),A
; ;
; LD A,(SYS_PAGE.BPB_PARSED)
; ADD A,1
; ;
; LD A,E
; OUT (SLOT3),A
; EI
; RET
;***********************************************
MSDOS_1ST_FL:
PUSH DE
; 15/07/2024
;CALL CHECK_BPB
CALL READ_BPB
;CALL C,READ_BPB
;
CALL READ_1ST_DIR
POP DE
MSDOS_TEST_FL:
PUSH DE
DI
IN A,(SLOT3)
LD E,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,E
; [x] 07/07/2024 ¯à®¯ã᪠LFN
PUSH HL
LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT
ADD HL,DE
LD D,(HL)
POP HL
;
LD E,(HL)
OUT (SLOT3),A
EI
; [x] 07/07/2024 ¯à®¯ã᪠LFN
LD A,D
CP #0F ; FAT_ATTR.LFS_Entry
JR NZ,.nxt
POP DE
JR MSDOS_NEXT_FL
;
.nxt: LD A,E
POP DE
AND A
SCF
RET Z ; ŠŽ<C5A0> Š€’€‹Žƒ€
CP #E5
JR Z,MSDOS_NEXT_FL
AND A
RET
;**********************
MSDOS_NEXT_FL:
PUSH DE
LD DE,32 ; FAT_DIRECTORY_RECORD size
ADD HL,DE
DI
IN A,(SLOT3)
LD D,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.COUNT_FL)
DEC A
LD (SYS_PAGE.COUNT_FL),A
LD E,A
LD A,D
OUT (SLOT3),A
; RET_PAGE3
EI
LD A,E
POP DE
AND A ; <><E28098>Ž CF !!
JR NZ,MSDOS_TEST_FL
PUSH DE
DI
IN A,(SLOT3)
LD D,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.COUNT_SEC)
DEC A
LD (SYS_PAGE.COUNT_SEC),A
LD E,A
LD A,D
OUT (SLOT3),A
; RET_PAGE3
EI
LD A,E
POP DE
AND A
SCF
RET Z
PUSH DE
CALL READ_NEXT_DIR
POP DE
LD HL,SYS_PAGE.MS_DIR
JR MSDOS_TEST_FL
;**********************************
MSDOS_CAT:
PUSH DE
CALL AUTO_1D97 ; CLS
CALL OPEN_CH2
LD A,"\r"
RST #10
POP DE ; <E28098>ŽŠ€ <20>Ž… CAT
.loop: LD A,(DE)
CP " "
;JR NZ,CAT_NO_SPACE
INC DE
JR Z,.loop
DEC DE
;CAT_NO_SPACE:
CP "\r"
JR NZ,CAT_ALL
LD DE,CAT_FILES
CAT_ALL:
; CALL MSDOS_FIND_FILE
CALL MSDOS_1ST_FL
JR C,CAT_END
CAT_LOOP:
JR Z,CAT_NO_PRINT
CALL MSDOS_KOMP_FL
JR NZ,CAT_NO_PRINT
PUSH HL
PUSH DE
CALL OPEN_CH2
POP DE
POP HL
; CALL COPY_NAME_MSD
CALL PRINT_MSD_NAME
CALL PRINT_MSD_DATS
; CALL MSDOS_FIND_NEXT
CAT_NO_PRINT:
CALL MSDOS_NEXT_FL
JR NC,CAT_LOOP
CAT_END:
CALL OPEN_CH0
JP AUTO_03E1
PRINT_MSD_NAME:
PUSH HL
PUSH DE
LD HL,ZX_VARS.FL_NAME
LD A,' '
RST #10
LD A,' '
RST #10
;
LD B,8
.L1: LD A,(HL)
;AND #7F ; ¡ £ á ¨¬¥­¥¬, ¥á«¨ ­  FAT ¨¬¥­  á UTF8
RST #10
INC HL
DJNZ .L1
;
LD A,' '
RST #10
;
LD B,3
.L2: LD A,(HL)
;AND #7F ; ¡ £ á ¨¬¥­¥¬, ¥á«¨ ­  FAT ¨¬¥­  á UTF8
RST #10
INC HL
DJNZ .L2
;
LD A,6
RST #10
POP DE
POP HL
RET
PRINT_MSD_DATS:
PUSH HL
PUSH DE
LD HL,ZX_VARS.FL_PLACE+1
LD A,(HL)
DEC HL
CALL PRINT_HEX_A
LD A,(HL)
DEC HL
CALL PRINT_HEX_A
LD A,(HL)
DEC HL
CALL PRINT_HEX_A
LD A,' '
RST 10H
LD A,(HL)
DEC HL
CALL PRINT_HEX_A
LD A,(HL)
DEC HL
CALL PRINT_HEX_A
LD A,13
RST 10H
POP DE
POP HL
RET
;**********************************************
CAT_FILES: DB '*.*',13
;**********************************************
COPY_NAME_MSD:
PUSH HL
PUSH DE
DI
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD DE,ZX_VARS.FL_NAME
LD BC,11
LDIR
LD BC,15
ADD HL,BC
LD BC,5
LDIR
LD L,(HL)
OUT (SLOT3),A
; RET_PAGE3
EI
LD A,L
POP DE
POP HL
AND A ; A = 0 „‹Ÿ ”€‰‹€ „ˆ<E280B9>މ < 16 Œ¡.
RET
;*********************************************
;******************************************************
CMD_MSDOS: ; MS-DOS ª®¬ ­¤¥à !!
;******************************************************
CALL SINTAX_RET
LD HL,WORDS
LOOP_FIND2:
LD DE,(ZX_VARS.ADR_DOS_COM)
INC DE ; <20>யãáâ¨âì /
LD A,(HL)
AND A
JR Z,END_TAB
LD B,A
INC HL
LOOP_FIND:
LD A,(DE)
AND 223
CP (HL)
JR NZ,NEXT_WORD
INC DE
INC HL
DJNZ LOOP_FIND
LD A,(DE)
CP "\r"
JR Z,CMD_EXE1
CP ' '
JR Z,CMD_EXE
JR NEXT_WORD2
CMD_EXE:
INC DE
CMD_EXE1:
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
CALL JP_HL
JP AUTO_03E1
JP_HL: JP (HL)
NEXT_WORD:
INC HL
DJNZ NEXT_WORD
NEXT_WORD2:
INC HL
INC HL
JR LOOP_FIND2
END_TAB:
INC DE
LD A,(DE)
CP ':'
DEC DE
JR NZ,END_TAB3
LD A,(DE)
AND 223
SUB 'A'
JR C,END_TAB3
CP 4
JR NC,END_TAB2
LD (ZX_VARS.OPER_DISK),A
LD (ZX_VARS.CONT_DISK),A
LD B,A
LD A,(ZX_VARS.PDOS_COPY)
AND #7C
OR B
LD (ZX_VARS.PDOS_COPY),A
OUT (FDC_93.DrvCTRL),A
; [ ] 19/07/2024 ­  ª ¦¤ë© ¤¨áª âमá ᢮© à §¤¥« hdd ¬®¦­® § ¬ ¯¨âì
LD C,BIOS.GET_DISK_REDIR
CALL EXP_FNS
CP #40
JR C,.exit
;
AND #0F
LD C,BIOS.HDD_PART
CALL EXP_FNS
;LD HL,MSG_3
;CALL C,AUTO_03C3
;
.exit: JP AUTO_03E1
END_TAB2:
SUB 4
CP SYS_PAGE.RAMD_KEYS.NUM
JR NC,END_TAB3
CALL RAMD_SET1
JP AUTO_03E1
END_TAB3:
LD A,0
JP LOAD_RMD_XX
MSD_ERR:
LD HL,MSDOS_MSG ; File not found...
JP AUTO_03E4
;************************************
LOAD_RMD:
CALL RAMD_SYM ; ¯®«ãç¨âì ­®¬¥à RAM-Disk ¨§ (DE)
JP C,MSD_ERR
LOAD_RMD_XX:
LD (ZX_VARS.MED_START+1),A ; á®åà ­¨âì
CALL MSDOS_FIND_FILE
JP C,MSD_ERR
CALL RMD_BLKS_FL ; B - ç¨á«® ¡«®ª®¢ , DE -  ¡á®«îâ­ë© ᥪâ®à
LD A,(ZX_VARS.MED_START+1)
PUSH AF
CALL CLEAR_RMD_A ; ®á¢®¡®¤¨âì RAM-Disk A
POP AF
CALL GET_RMD_A ; ãáâ ­®¢¨âì RAM-Disk A à §¬¥à®¬ B
LD HL,#C000
CALL MSDOS_READ_FILE
JP AUTO_03E1
SAVE_RMD:
CALL RAMD_SYM ; ¯®«ãç¨âì ­®¬¥à RAM-Disk ¨§ (DE)
JP C,MSD_ERR
LD (ZX_VARS.MED_START+1),A
CALL MSDOS_FIND_FILE
JP C,MSD_ERR
CALL RMD_BLKS_FL
LD A,(ZX_VARS.MED_START+1)
CALL TEST_RAMD ; ¯à®¢¥à¨âì ­ «¨ç¨¥ RAM-Disk A à §¬¥à®¬ B
JP C,MSD_ERR ; A - ­®¬¥à ¯¥à¢®£® ¡«®ª 
JP Z,MSD_ERR
LD HL,#C000
CALL MSDOS_WRITE_FILE
JP AUTO_03E1
RMD_BLKS_FL:
LD A,(ZX_VARS.FL_SIZE+2)
PUSH HL
LD HL,(ZX_VARS.FL_SIZE)
LD B,A
AND A
RL L
RL H
RL B
AND A
RL L
RL H
RL B
LD A,H
OR L
JR Z,RMD_BLKS_L2
INC B
RMD_BLKS_L2:
POP HL
RET ; B - —ˆ‘‹Ž <20>ŽŠŽ RAM_DISK
;****************************************
; DE - ˆŒŸ ”€‰‹€ ‘Ž *,?
; HL - ˆŒŸ Š€’€‹Žƒ…
MSDOS_KOMP_FL:
CALL COPY_NAME_MSD ; <20><EFBFBD>…Œ…ˆœ ˆŒŸ Ž<>œ TR-DOS
LD A,(ZX_VARS.FL_NAME)
AND A
JR NZ,KOMP_CONT1
LD A,2 ; ŠŽ<C5A0> Š€’€‹Žƒ€
AND A ; NZ - ˆŒŸ <20>Ž<C5BD>€„€…
RET
KOMP_CONT1:
CP 0A5h
JR NZ,KOMP_CONT2
LD A,1 ; <E28099>‰ ”€‰‹ - ˆŒŸ <20>Ž<C5BD>€„€…
AND A
RET
KOMP_CONT2:
PUSH DE
PUSH HL
LD HL,ZX_VARS.FL_NAME
CALL MSDOS_KOMP_ALL
POP HL
POP DE
RET
MSDOS_KOMP_ALL:
LD A,(DE)
INC DE
CP " "
JR Z,MSDOS_KOMP_ALL
CP "\r"
JR Z,KOMP_ERROR_NAME ; <20><E2809A><E280A6>Ž… ˆŒŸ
DEC DE
LD B,8
CALL KOMP_TX
RET NZ
LD A,(DE)
CP "."
JR Z,KOMP_POINT
CP "\r"
JR Z,KOMP_SPACING3
CP " "
JR Z,KOMP_SPACING3
KOMP_ERROR_NAME: ; <20><E2809A><E280A6>Ž… ˆŒŸ
LD A,1
AND A
RET
KOMP_POINT:
INC DE
LD B,3
CALL KOMP_TX
RET NZ
LD A,(DE)
CP 13
RET Z
CP 20H
RET Z
JR KOMP_ERROR_NAME
;****************************************************
KOMP_TX:
LD A,(DE)
CP "\r"
JR Z,KOMP_SPACING
CP " "
JR Z,KOMP_SPACING
CP "."
JR Z,KOMP_SPACING
CP "?"
JR Z,KOMP_EX_OK
CP "*"
JR Z,KOMP_EX_OK2
CP "a"
JR C,KOMP_EXEC
CP "z"+1
JR NC,KOMP_EXEC
AND %1101'1111
KOMP_EXEC:
CP (HL)
RET NZ ; ­¥â ᮢ¯ ¤¥­¨ï
KOMP_EX_OK:
INC DE
KOMP_EX_OK2:
INC HL
DJNZ KOMP_TX
CP '*'
JR NZ,KOMP_NO_STAR1
INC DE
KOMP_NO_STAR1:
XOR A
RET
KOMP_SPACING3:
LD B,3
KOMP_SPACING:
LD A,20H
KOMP_L2:
CP (HL)
INC HL
RET NZ
DJNZ KOMP_L2
RET
;************************************************
CALC_CLAST: ; HL - áâ àâ®¢ë© ª« áâ¥à
PUSH BC
PUSH HL
DEC HL
DEC HL
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
EX DE,HL
LD BC,0
LD H,B
LD L,B
LD HX,B
LD LX,B
CALC_CL_LP:
ADD IX,DE
ADC HL,BC
DEC A
JR NZ,CALC_CL_LP
LD DE,(SYS_PAGE.MSD_DAT_SEC)
LD BC,(SYS_PAGE.MSD_DAT_SEC2)
ADD IX,DE
ADC HL,BC ; HL,IX - Œ…™…<E284A2>ˆ… Š<E28099>€ Ž’ <20>€—€€ „€<E2809E><E282AC>
EX AF,AF'
OUT (SLOT3),A
PUSH IX
EX (SP),HL
POP IX
EX DE,HL
EI
POP HL
POP BC
RET
HD_TX: DC ' - HDD error'
;HD_TX: DC 'HDD error #'
HD_TX2: DC 'HDD not found'
MSG_3: DC '*ERROR*'
MSDOS_MSG: DC 'File not found'
NO_MEMORY: DC 'Out of memory'
;NO_MEMORY: DC 'No RAM-Disk MEM'
WORDS:
DB 3,'CAT' ; ª â «®£ MS-DOS
DW MSDOS_CAT
DB 3,'DIR' ; ª â «®£ MS-DOS
DW MSDOS_CAT
DB 3,'HDD' ; ¯®¤ª«îç¨âì HDD
DW HDD_SET
DB 3,'FDD' ; ¯®¤ª«îç¨âì FDD
DW FDD_SET
DB 3,'RMD' ; ¯®¤ª«îç¨âì RMD
DW RAMD_SET
DB 3,'HDT' ; â¥áâ HDD
DW HDD_PROG
DB 2,'RD' ; â¥áâ RAM-Disk space
DW RAMD_FAT_PROG
DB 4,'SAVE' ; á®åà ­¨âì RAM-Disk
DW SAVE_RMD
DB 4,'LOAD' ; § £à㧨âì RAM-Disk
DW LOAD_RMD
DB 4,'TBON' ; ¢ª«îç¨âì âãà¡®
DW TB_ONOFF
DB 5,'TBOFF' ; ¢ëª«îç¨âì âãà¡®
DW TB_ONOFF
DB 4,'INIT' ; २­¨§¨ «¨§ æ¨ï
DW INIT_RMD
DB 5,'CLEAR' ; ®ç¨áâ¨âì RAM-Disk
DW CLEAR_RAMD_X
DB 8,"SPRINTER"
DW SPR_1
DB 2,"AY"
DW AY8910
DB 0
;SAVE_AUTOEXEC:
; LD C,0FEH
; CALL EXP_FNS
; RET
AY8910:
LD A,#EA
LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL
CALL EXP_FNS
;!TEST 06/01/2024 á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨© § ç¥¬-â®
;EI
;
CALL AUTO_1D97
AND A
RET
SPR_1: LD A,(DE)
INC DE
CP " "
JR Z,SPR_1
CP "1"
LD C,BIOS.RST_CONF.SP97_1
JR Z,SP_1
CP "2"
SCF
RET NZ
LD C,BIOS.RST_CONF.SP97_2
SP_1: LD A,(DE)
CP " "+1
CCF
RET C
CALL EXP_FNS
CALL AUTO_1D97
AND A
RET
;****************************************************
;*****************************************
; ERRORS
;*****************************************
; 0 - ƒ<E282AC>€Ÿ <20><>Ž<E2809A>Š€ <20><>Žƒ<C5BD>€ŒŒ
; 1 - <20><E2809A><E280A6>‰ ”Ž<E2809D>Œ€ ˆŒ…<C592>ˆ
; 2 - ŠŽ<C5A0> Š€’€‹Žƒ€
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
DISPLAY "TR_MSD_3.ASZ size: ",/A,$-File_Start
DISPLAY "===================================================="