ZX-SP-ROMs/TRDOS/TR_MSD_S.ASZ
2024-07-21 01:35:29 +10:00

782 lines
13 KiB
Plaintext
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.

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 "===================================================="
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;********************************************
; MS-DOS system
;********************************************
; MS-DOS utilites
;********************************************
MSD_R_W_UT:
PUSH AF
CALL DISK_REDIR
CP #40
JR C,.NOT_HDD
;************************************************
;* <20>®¤¯à®£à ¬¬  ç⥭¨ï/§ ¯¨á¨ MS-DOS ¤¨áª®¢ *
;* 1. €¤à¥á ¡ãä¥à  - HL *
;* 2. <20>®¬¥à ᥪâ®à  - DE *
;* 3. —¨á«® ᥪâ®à®¢ - B *
;* 4. Š®¬ ­¤  - C *
;* 5. ‘âà ­¨æ  އ“ - A *
;************************************************
.HDD: POP AF
;!TEST 06/01/2024 㡨ࠥ¬ «¨è­¨¥ ⥫®¤¢¨¦¥­¨ï
;CALL HD_CMD
SET 6,C
CALL EXP_FNS
;
RET NC
JP HDD_ERROR
;************************************************
.NOT_HDD:
POP AF
EX AF,AF'
LD A,C
SUB 4
JR Z,MSD_cmd4
; JR Z,MSD_cmd4M
DEC A
JR Z,MSD_cmd5
; JR Z,MSD_cmd5M
DEC A
JR Z,MSD_cmd6
; JR Z,MSD_cmd6M
EX AF,AF'
RET
;MSD_cmd4M:
; LD DE,0
; LD IX,0
; LD B,1
;MSD_cmd5M:
; EX DE,HL
; PUSH IX
; EX (SP),HL
; POP IX
; LD C,12H
; LD A,(ZX_VARS.OPER_DISK)
; DI
; PUSH IY
; CALL HD_CMD
; POP IY
; EI
; PUSH IX
; EX (SP),HL
; POP IX
; EX DE,HL
; JP C,ERROR_MSDOS
; EX AF,AF'
; AND A
; RET
;
;MSD_cmd6M:
; EX DE,HL
; PUSH IX
; EX (SP),HL
; POP IX
; LD C,13H
; LD A,(ZX_VARS.OPER_DISK)
; DI
; PUSH IY
; CALL HD_CMD
; POP IY
; EI
; PUSH IX
; EX (SP),HL
; POP IX
; EX DE,HL
; JP C,ERROR_MSDOS
; EX AF,AF'
; AND A
; RET
;*************************************
MSD_cmd4:
PUSH HL
;PUSH AF ;!TEST 21/2/2024
CALL RESET_WG
;POP AF ;!TEST 21/2/2024
POP HL
LD B,1
;!TEST 21/2/2024
; LD DE,0
XOR A
LD D,A
LD E,A
MSD_cmd5:
; LD A,0
; A=0
LD (ZX_VARS.RD_WR_COM),A
EX AF,AF'
JR MSD_RWU1
MSD_cmd6:
LD A,255
LD (ZX_VARS.RD_WR_COM),A
EX AF,AF'
JR MSD_RWU1
PREPARE1:
LD (ZX_VARS.MED_START),A
LD (ZX_VARS.CONT_BUF_ADR),HL
DI
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,(SYS_PAGE.DS_1440-4000H)
AND BIT_MASK_1440
SET 0,A
LD (SYS_PAGE.DS_1440-4000H),A
LD A,C
OUT (SLOT2),A
EI
CALL Z,RES_1440
CALL NZ,SET_1440
CALL CALC_SECTOR
LD (ZX_VARS.CONT_SEC),DE
LD A,(ZX_VARS.RD_WR_COM)
RET
MSD_RWU1:
PUSH BC
PUSH HL
CALL PREPARE1
; JR MSD_R_W_LOOP
MSD_R_W_LOOP:
POP HL
POP BC
LD A,(ZX_VARS.MED_START)
INC B
DEC B
LD DE,(ZX_VARS.CONT_SEC)
RET Z
DEC B
PUSH BC
PUSH HL
LD (ZX_VARS.CONT_BUF_ADR),HL
LD A,(ZX_VARS.CONT_SEC)
LD (ZX_VARS.SEC_NUM),A
LD A,(ZX_VARS.CONT_TRK)
CALL Global_trk
LD A,(ZX_VARS.RD_WR_COM)
OR A
PUSH AF
CALL Z,MSD_3F0E
POP AF
CALL NZ,MSD_3F0A
DI
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD DE,(SYS_PAGE.MS_BPB+SEC_SIZE-#4000)
LD A,C
OUT (SLOT2),A
EI
POP HL
ADD HL,DE
LD A,H
OR L
JR NZ,MSD_NO_PAGE
DI
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,(ZX_VARS.MED_START)
LD HL,SYS_PAGE.RAMD_FAT-#4000
LD L,A
LD L,(HL)
LD A,C
OUT (SLOT2),A
EI
LD A,L
LD HL,#C000
LD (ZX_VARS.MED_START),A
MSD_NO_PAGE:
LD (ZX_VARS.CONT_BUF_ADR),HL
PUSH HL
DI
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,(SYS_PAGE.DS_1440-#4000)
AND %1111'1110
LD (SYS_PAGE.DS_1440-#4000),A
LD A,(SYS_PAGE.MSD_SECS-#4000)
LD L,A
LD A,C
OUT (SLOT2),A
EI
LD A,L
LD HL,ZX_VARS.CONT_SEC
INC (HL)
CP (HL)
JP NZ,MSD_R_W_LOOP
LD (HL),0
LD HL,ZX_VARS.CONT_TRK
INC (HL)
JP MSD_R_W_LOOP
;*****************************************
;
;*****************************************
MSD_3F0A:
LD A,160
JR MSD_3F10
MSD_3F0E:
LD A,128
MSD_3F10:
LD (ZX_VARS.COMAND_WG),A
MSD_3F13:
LD D,5 ; —ˆ‘‹Ž <20>ŽŽ<E28099><EFBFBD>ˆ
MSD_3F15:
PUSH DE
PUSH IX
DI
IN A,(SLOT3)
EX AF,AF'
LD A,(ZX_VARS.MED_START)
OUT (SLOT3),A
AND A
JR Z,NO_OFF_SCR
LD A,0C0H
OUT (RGADR),A
NO_OFF_SCR:
LD IX,MSD_RET_ADR
LD A,(ZX_VARS.SEC_NUM)
INC A
OUT (FDC_93.Sector),A
LD HL,(ZX_VARS.CONT_BUF_ADR)
LD C,127
LD A,(ZX_VARS.COMAND_WG)
OUT (FDC_93.Command),A
CP 160
JP Z,MSD_3FBA ; ‡€<E280A1>ˆœ …ŠŽ<E28099>
JP MSD_3FD5 ; —<E28099>ˆ…ŠŽ<E28099>
MSD_RET_ADR:
LD A,0
OUT (RGADR),A
EX AF,AF'
OUT (SLOT3),A
POP IX
POP DE
EI
IN A,(FDC_93.Command)
LD B,A
AND 127
RET Z
MSD_3F39:
LD HL,READ_ONLY_MSG
AND '@'
JR NZ,MSD_3F4B
LD A,B
AND 4
JR Z,MSD_3FA0 ; -> „<>“ƒ€Ÿ Ž˜ˆ<CB9C>Š€
DEC D ; <20>Ž<E28099>Ÿ „€<E2809E><E282AC>
JR Z,MSD_3F48 ; MSD_3F15
CALL SWITCH_DT
JR MSD_3F15
MSD_3F48:
LD HL,DISK_ERROR_MSG
MSD_3F4B:
LD A,208
OUT (FDC_93.Command),A
LD A,B
AND 1
JP NZ,AUTO_3EE7
PUSH HL
CALL AUTO_1D97
POP HL
RST PRINT_LN
LD HL,AUTO_2A13
RST PRINT_LN
IN A,(FDC_93.Track)
CALL AUTO_1DA3
LD HL,AUTO_2A18
RST PRINT_LN
IN A,(FDC_93.Sector)
CALL AUTO_1DA3
LD HL,AUTO_29FE
RST PRINT_LN
MSD_3F7B:
CALL AUTO_1052
CP 'I'
RET Z
CP 'R'
JR Z,MSD_3F94
CP 'A'
JR NZ,MSD_3F7B
CALL exit_No_disk
LD A,7
LD (ZX_VARS.DOS_ERR_2),A
JP AUTO_01D3
MSD_3F94:
LD A,(ZX_VARS.CONT_TRK)
CALL Global_trk
CALL pause_750ms
JP MSD_3F13
MSD_3FA0:
DEC D
JP Z,MSD_3F48
CALL SWITCH_DT
PUSH DE
CALL AUTO_3D98 ; RESET_WG
LD A,(ZX_VARS.CONT_TRK)
CALL Global_trk ; <20>އˆˆŽ<CB86>ˆ<EFBFBD>Ž<E2809A>ˆ
POP DE
JP MSD_3F15
SWITCH_DT:
DI
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,(SYS_PAGE.DS_1440-4000H)
BIT 0,A
JR Z,NO_SW_DT
XOR BIT_MASK_1440
LD (SYS_PAGE.DS_1440-4000H),A
AND BIT_MASK_1440
LD A,C
OUT (SLOT2),A
EI
;!TEST
;CALL Z,RES_1440
;CALL NZ,SET_1440
;RET
JR Z,RES_1440
JR SET_1440
;
NO_SW_DT:
LD A,C
OUT (SLOT2),A
EI
RET
;******************************************
; Sector Write !!!
;******************************************
MSD_3FBA:
LD B,4
MSD_3FBC:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR NZ,MSD_3FD1
INC DE
LD A,E
OR D
JR NZ,MSD_3FBC
DJNZ MSD_3FBC
MSD_RET_IX:
JP (IX)
MSD_3FCA:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,MSD_3FCA
JP M,MSD_RET_IX
MSD_3FD1:
OUTI
JR MSD_3FCA
;******************************************
; Sector Read !!!
;******************************************
MSD_3FD5:
LD B,4
MSD_3FD7:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR NZ,MSD_3FEC
INC DE
LD A,E
OR D
JR NZ,MSD_3FD7
DJNZ MSD_3FD7
MSD_RET_IX2:
JP (IX)
MSD_3FE5:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,MSD_3FE5
JP M,MSD_RET_IX2
MSD_3FEC:
INI
JR MSD_3FE5
;******************************************
;****************************************
RES_1440:
LD A,FDD_Density.SET_720
OUT (FDD_Density),A
RET
SET_1440:
LD A,FDD_Density.SET_1440
OUT (FDD_Density),A
RET
READ_BPB:
CALL DISK_REDIR
; LD C,BIOS.GET_DISK_REDIR
; CALL EXP_FNS
CP #40
JR NC,.HDD
CP 4
JP NC,.ERROR_MSDOS
;
CALL SET_DISK
;
CALL .MAIN
RET NC
JP .ERROR_MSDOS
;
.HDD: CALL .MAIN
CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd
RET NC
; old hdd
LD IX,0
LD DE,63 ;!HARDCODE
LD A,SYS_PAGE
LD HL,SYS_PAGE.MS_BPB
;
LD BC,256*1 + TRDOS_ROM_CMD.READ
CALL MSD_R_W_UT
;
CALL .PARAMS
CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd
RET NC
JP .ERROR_MSDOS
;
.MAIN: LD A,SYS_PAGE
LD HL,SYS_PAGE.MS_BPB
LD C,TRDOS_ROM_CMD.READ_BPB
CALL MSD_R_W_UT
;CALL BPB_PARAMS
;RET
;
; LD C,18H
; LD A,(ZX_VARS.OPER_DISK)
; CALL HD_CMD
; ;
; DI
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; ;
; LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Š®«¨ç¥á⢮ ᥪâ®à®¢ ­  â४
; LD L,A
; ;
; EX AF,AF'
; OUT (SLOT3),A
; EI
; ;
; LD A,(ZX_VARS.OPER_DISK)
; LD C,19H
; CALL HD_CMD
.PARAMS:
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.MS_BPB+FORM_CODE)
CP #F0
JP C,.ERROR_BPB
LD DE,SYS_PAGE.MS_BPB+FAT_ID
LD HL,.FAT1_MSG
LD B,4
.L1: LD A,(DE)
CP ' '
JR NZ,.L11
INC DE
JR .L1
.L11: CP (HL)
JR NZ,.PC_DOS
INC HL
INC DE
DJNZ .L1
LD A,(DE)
CP '6'
LD HL,#81FF ; FAT16 ä« £
JR Z,.FAT
CP '2'
JP NZ,.ERROR_BPB
.PC_DOS:
LD HL,#01FF ; FAT12 ä« £
.FAT: LD (SYS_PAGE.FAT_FLAG),HL
LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Š®«¨ç¥á⢮ ᥪâ®à®¢ ­  â४
LD (SYS_PAGE.MSD_SECS),A
; BIT 7,H
; LD IX,0
; LD HL,0 ; ¢ëç¨á«¨âì ­ ç «ì­ë© ᥪâ®à FAT
; JR Z,.NO_LD_SPECIAL
LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS)
LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2)
;.NO_LD_SPECIAL:
LD BC,0
LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS)
ADD IX,DE
ADC HL,BC
LD (SYS_PAGE.MSD_FAT_SEC),IX ; ­ ç «ì­ë© ᥪâ®à FAT
LD (SYS_PAGE.MSD_FAT_SEC2),HL ; ­ ç «ì­ë© ᥪâ®à FAT
LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; ç¨á«® ᥪâ®à®¢ ¢ FAT
;LD BC,0
LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; ª®«¨ç¥á⢮ FATs
.NEXT_ADD:
ADD IX,DE
ADC HL,BC
DEC A
JR NZ,.NEXT_ADD
LD (SYS_PAGE.MSD_CAT_SEC),IX ; ­ ç «ì­ë© ᥪâ®à DIR
LD (SYS_PAGE.MSD_CAT_SEC2),HL ; ­ ç «ì­ë© ᥪâ®à DIR
; A=0
LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; <20> §¬¥à ᥪâ®à 
LD A,B
RL C
RLA
RL C
RLA
RL C
RLA
LD C,A
LD B,0 ; BC - ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
LD (SYS_PAGE.FilesPerSector),A
LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; —¨á«® ä ©«®¢ëå § ¯¨á¥©
EX DE,HL
DEC HL
XOR A
.NEXT_ADD2:
INC A
JR Z,.ERROR_BPB
SBC HL,BC
JR NC,.NEXT_ADD2
EX DE,HL
LD E,A ; A - ç¨á«® ᥪâ®à®¢ ¢ DIR
LD BC,0
LD D,B
LD (SYS_PAGE.SectorsPerCluster),A
ADD IX,DE ; <20> ç «® DATA area
ADC HL,BC
LD (SYS_PAGE.MSD_DAT_SEC),IX
LD (SYS_PAGE.MSD_DAT_SEC2),HL
LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; <20> §¬¥à ᥪâ®à 
; D = 0
LD H,D
LD L,D
LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
LD D,A
XOR A
.NEXT_ADD3:
ADD HL,BC ; ‚ëç¨á«¥­¨¥ ¤«¨­ë ª« áâ¥à 
ADC A,0
DEC D
JR NZ,.NEXT_ADD3
LD (SYS_PAGE.CLASTER_LEN),HL
; D = 0
LD B,D
LD C,A
LD (SYS_PAGE.CLASTER_LEN2),BC
; D = 0
LD H,D
LD L,D
LD BC,(SYS_PAGE.MS_BPB+S_P_T)
LD A,(SYS_PAGE.MS_BPB+H_P_S)
.BPB_L1:; ‚›—ˆ‘‹ˆ’œ ŠŽ‹ˆ—…‘’‚Ž …ŠŽ<E28099>Ž <20>ˆˆ<E280B9><EFBFBD>
ADD HL,BC
DEC A
JR NZ,.BPB_L1
LD (SYS_PAGE.S_X_H),HL
;
EX AF,AF'
OUT (SLOT3),A
EI
AND A
RET
.ERROR_BPB:
EX AF,AF'
OUT (SLOT3),A
SCF
EI
RET
;
.ERROR_MSDOS:
LD HL,MSG_3
JP AUTO_03E4
;
.FAT1_MSG:
DB 'FAT1'
;********************************************
READ_NEXT_DIR:
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,(SYS_PAGE.MSD_CONT_SEC)
LD IX,(SYS_PAGE.MSD_CONT_SEC2)
JR READ_NEXT2
;********************************************
READ_1ST_DIR:
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IX,(SYS_PAGE.MSD_CAT_SEC2)
LD DE,(SYS_PAGE.MSD_CAT_SEC) ; <20>€—€œ<E280B9>…ŠŽ<E28099> Š€’€‹Žƒ€
LD (SYS_PAGE.MSD_CONT_SEC),DE
LD (SYS_PAGE.MSD_CONT_SEC2),IX
LD A,(SYS_PAGE.SectorsPerCluster) ; …ŠŽ<E28099>Ž Š€’€‹Žƒ…
LD (SYS_PAGE.COUNT_SEC),A
READ_NEXT2:
EX AF,AF'
OUT (SLOT3),A
; RET_PAGE3
EI
LD HL,SYS_PAGE.MS_DIR
LD A,SYS_PAGE
LD BC,256*1 + TRDOS_ROM_CMD.READ
CALL MSD_R_W_UT
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,(SYS_PAGE.MSD_CONT_SEC)
INC DE
LD (SYS_PAGE.MSD_CONT_SEC),DE
LD A,D
OR E
JR NZ,READ_NEXT3
LD IX,(SYS_PAGE.MSD_CONT_SEC2)
INC IX
LD (SYS_PAGE.MSD_CONT_SEC2),IX
READ_NEXT3:
LD A,(SYS_PAGE.FilesPerSector) ; ”€‰‹Ž‚ …ŠŽ<E28099>
LD (SYS_PAGE.COUNT_FL),A
EX AF,AF'
OUT (SLOT3),A
; RET_PAGE3
EI
LD HL,SYS_PAGE.MS_DIR
AND A
RET
;******************************************
;********************************************
CALC_SECTOR: ; ‚›—ˆ‘‹ˆ’œ <>…Š/…ŠŽ<E28099> ¤«ï ¤¨áª¥â
LD A,D ; DE -  ¡á. ­®¬¥à ᥪâ®à 
OR E
JR NZ,CALC_SECT_L1
LD HL,0
RET
CALC_SECT_L1:
PUSH BC
EX DE,HL
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD BC,(SYS_PAGE.MS_BPB+S_P_T)
XOR A
LOOP_TRK:
SBC HL,BC
JR C,SEC_ENDER
INC A
JR NZ,LOOP_TRK
POP BC
JP READ_BPB.ERROR_BPB
SEC_ENDER:
ADD HL,BC
LD H,A ; <>…Š
; LD L,L ; …ŠŽ<E28099>
EX AF,AF'
OUT (SLOT3),A
EI
EX DE,HL
POP BC
RET
;************************************************
REDIR_LINE_CODING:
LD (ZX_VARS.MED_START),HL
LD HL,(ZX_VARS.DOS_CH_ADR)
LD A,(HL)
CP '/'
RET Z
JP AUTO_3057
PRINT_HEX_A:
PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL PRINT_HEX_SYM
POP AF
PRINT_HEX_SYM:
PUSH HL
PUSH DE
PUSH BC
AND 0FH
ADD A,'0'
CP '9'+1
JR C,NO_ADD
ADD A,7
NO_ADD:
RST 10H
POP BC
POP DE
POP HL
RET
;*******************************************
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
DISPLAY "TR_MSD_S.ASZ size: ",/A,$-File_Start
DISPLAY "===================================================="