diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index bca1372..976d700 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -179,7 +179,7 @@ BLOK_RD: PUSH BC LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV32 ;!FIXIT заменить вызов HLDE/BC на HLDE/C + CALL DIV_for_SPC ;!FIXIT заменить вызов HLDE/BC на HLDE/C ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb LD B,XH LD C,XL @@ -349,7 +349,7 @@ BLOK_WR PUSH BC LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV32 + CALL DIV_for_SPC LD B,XH LD C,XL @@ -565,22 +565,34 @@ READ: LD (R_POINT),HL ; JP C,RPERR1 ;Расчёт смещения в секторах - LD C,(IY+_sFM.F_POSITION) + ; LD C,(IY+_sFM.F_POSITION) + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD H,0 + ; OR A + ; RR L + ; RR D + ; RR E + LD H,0 + LD L,(IY+_sFM.F_POSITION+3) + LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) LD A,E AND #01 LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A + LD C,(IY+_sFM.F_POSITION) + ;OR A RR L RR D RR E ;HL:DE FP (in sectors) ;BC FP residue (in bytes) ; - LD A,B + ;LD A,B OR C JP NZ,ROV1 ROV4: POP BC @@ -890,28 +902,58 @@ WOV3: PUSH HL ADC HL,BC JP WOV4 - +////////////// OLD //////////////// +; HL - CLUSTER +; HL:IX - SECTOR +; NSECTOR: DEC HL +; DEC HL +; EX DE,HL +; LD A,(BootSector.S_P_C) +; LD B,A +; LD HL,0 +; LD IX,0 +; ADD_DE1: ADD IX,DE +; JR NC,ADD_DE2 +; INC HL +; ADD_DE2: DJNZ ADD_DE1 +; LD DE,(FatBuffer.DAT_FRM) ;first data sector +; ADD IX,DE +; LD DE,#0000 +; ADC HL,DE +; RET +///////////////////////////////////// ; HL - CLUSTER ; HL:IX - SECTOR NSECTOR: DEC HL DEC HL - EX DE,HL + LD DE,0 LD A,(BootSector.S_P_C) - LD B,A - LD HL,0 - LD IX,0 -ADD_DE1: ADD IX,DE - JR NC,ADD_DE2 - INC HL -ADD_DE2: DJNZ ADD_DE1 - LD DE,(FatBuffer.DAT_FRM) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + RRCA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(FatBuffer.DAT_FRM) ;first data sector ADD IX,DE - LD DE,#0000 + ; A=0 + LD D,A + LD E,A ADC HL,DE RET +///////////////////////////////////// + ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A -DIV32: LD A,C +DIV_for_SPC: + LD A,C DEC A JR Z,.exit ; @@ -923,7 +965,7 @@ DIV32: LD A,C .loop: SRL H : RR L RR D : RR E RRCA - JR NC,.loop + JP NC,.loop LD A,B ; .exit: LD XH,D diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 29576fc..b672853 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -210,25 +210,25 @@ RD_BPB: LD C,SLOT3 RST ToDSS.DRV POP BC OUT (C),B - JP C,RDERR1 + JP C,DOS_X_Error.Not_ready PUSH IY - LD DE,#AA55 ;R05 -;R08 LD HL,(BOOT+510) ;R07 - LD HL,(SECBUF+510) ;R08 - AND A ;R05 - SBC HL,DE ;R05 - JP NZ,ERR_BPB ;R05 -;R08 - LD HL,SECBUF ;R08 - LD DE,BootSector ;R08 - LD BC,_sBOOT_SEC ;R08 size - LDIR -;R08 + LD DE,#AA55 ;R05 + LD HL,(SECBUF+510) ;R08 ;R07 + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ;R08 + LD HL,SECBUF + LD DE,BootSector + LD BC,_sBOOT_SEC ; size + LDIR + ; LD IY,BootSector LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 - JP C,ERR_BPB + JP C,DOS_X_Error.UnknownBPB ;!TEST ;LD HL,0 ; calc. first sector FAT @@ -250,17 +250,18 @@ RD_BPB: LD C,SLOT3 LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BootSector.FAT_NUM) ; amount FATs CP 1 - JR Z,C_DATA1 + JR Z,.loop1 DEC A ADD HL,DE LD (FatBuffer.FAT2_XX),HL -C_DATA1 ADD HL,DE +;C_DATA1 +.loop1: ADD HL,DE DEC A - JR NZ,C_DATA1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR + JR NZ,.loop1 - LD C,(IY+#0B) ; Size sectors - LD B,(IY+#0C) + LD (FatBuffer.DIR_FRM),HL ; first sector DIR + LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors + LD B,(IY+_sBOOT_SEC.B_P_S+1) RL C RL B RL C @@ -276,11 +277,12 @@ C_DATA1 ADD HL,DE EX DE,HL DEC HL XOR A -NEXTAD2 - INC A - JP Z,ERR_BPB +;NEXTAD2 +.loop2: INC A + JP Z,DOS_X_Error.UnknownBPB SBC HL,BC - JR NC,NEXTAD2 + JR NC,.loop2 + EX DE,HL LD C,A ; A - sectors in DIR LD B,0 @@ -290,58 +292,68 @@ NEXTAD2 ;LD HL,0 LD H,B ; тут в B ноль должен быть LD L,B - LD C,(IY+#0B) ; Size sector - LD B,(IY+#0C) + LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector + LD B,(IY+_sBOOT_SEC.B_P_S+1) LD A,(BootSector.S_P_C) -NEXTAD3 - ADD HL,BC ; calc. cluster size + +//////////////////////////////////////////////////////////////////////// + IF COMPILE_UNUSED_CODE +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +;NEXTAD3 +.loop3: ADD HL,BC ; calc. cluster size DEC A - JR NZ,NEXTAD3 + JR NZ,.loop3 + + LD (FatBuffer.CLU_LEN),HL EX DE,HL - LD HL,#3FFF + LD HL,#3FFF ;!TODO FATcacheSize XOR A -NEXTAD4 - INC A - JP Z,ERR_BPB +;NEXTAD4 +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB SBC HL,DE - JR NC,NEXTAD4 + JR NC,.loop4 LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) + ENDIF +//////////////////////////////////////////////////////////////////////// LD HL,BootSector.ID_FAT LD DE,FatBuffer.MSG LD B,3 -R_BPBL1 - LD A,(DE) +;R_BPBL1 +.loop5: LD A,(DE) CP (HL) - JP NZ,IBMDOS_ + JP NZ,.IBM_DOS INC HL INC DE - DJNZ R_BPBL1 -FID: LD A,(HL) + DJNZ .loop5 +;FID +.loop6: LD A,(HL) INC HL CP ' ' - JR Z,FID + JR Z,.loop6 + CP '1' - JP NZ,ERR_BPB + JP NZ,DOS_X_Error.UnknownBPB LD A,(HL) CP '6' ; FAT16 LD HL,#FFFF - JR Z,BPB_FAT + JR Z,.BPB_FAT CP '2' ; FAT12 - JP NZ,ERR_BPB + JP NZ,DOS_X_Error.UnknownBPB LD HL,#0FFF -BPB_FAT: +.BPB_FAT: LD (FatBuffer.FAT_TYP),A LD (FatBuffer.ENDCLUS),HL LD HL,0 LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track LD B,(IY+_sBOOT_SEC.S_P_T+1) LD A,(BootSector.HEADS) -BPB_L1: ; calc. sector per cylinder +.BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A - JR NZ,BPB_L1 + JR NZ,.BPB_L1 LD (FatBuffer.S_X_H),HL LD DE,(FatBuffer.DAT_FRM) @@ -354,30 +366,30 @@ BPB_L1: ; calc. sector per cylinder LD H,(IY+_sBOOT_SEC.S_P_D+1) LD A,H OR L - JP NZ,HDDSMAL + JP NZ,.HDDSMAL LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) AND A SBC HL,DE - JP NC,HDDBIG + JP NC,.HDDBIG DEC BC - JP HDDBIG -HDDSMAL: + JP .HDDBIG +.HDDSMAL: ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -HDDBIG LD A,(BootSector.S_P_C) +.HDDBIG: LD A,(BootSector.S_P_C) SCF -S4C01 RRA - JR C,S4C02 +.S4C01: RRA + JR C,.S4C02 RR B RR C RR H RR L - JP S4C01 -S4C02 INC HL + JP .S4C01 +.S4C02: INC HL LD (MAX_CLU),HL POP IY ; LD DE,FAT @@ -402,9 +414,10 @@ S4C02 INC HL XOR A RET -IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) +.IBM_DOS: + LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 - JR C,ERR_BPB + JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? // OR 2 // CP #FA ; ID ram-диска @@ -412,22 +425,24 @@ IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) ;????? LD A,'6' LD HL,#FFFF - JP Z,BPB_FAT + JP Z,.BPB_FAT LD A,'2' LD HL,#0FFF - JP BPB_FAT + JP .BPB_FAT -ERR_BPB: +DOS_X_Error: +.UnknownBPB: POP IY LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET -RDERR1: LD A,DSS_Error.sys.NOT_READY +.Not_ready: + LD A,DSS_Error.sys.NOT_READY ;SCF RET -;!FIXIT к буферам! +;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 @@ -451,14 +466,15 @@ FatBuffer: .ENDCLUS: DW #FFFF ; -; +;!TODO к буферам! DIRSPEC: DB '\' - ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 - BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 + ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 + BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 ; ;R11 ; !TODO починить + IF SAVE_PATH_MACRO SAVE_CUR_PATH PUSH IX PUSH IY @@ -525,6 +541,7 @@ BACK_CUR_PATH: POP IX POP IY RET + ENDIF ;R11 ;R12 @@ -624,11 +641,11 @@ SCANDRV: EI RET .ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_OPEN_S + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S LD E,0 RST ToBIOS - LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_CLS_WIN + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN LD DE,0 LD HL,#2050 RST ToBIOS @@ -647,14 +664,17 @@ SCANDRV: RST ToBIOS LD HL,#A000 - LD DE,0*256 + COLORS.FLASH + COLORS.PAPER.BLUE + COLORS.INC.WHITE + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE LD B,A LD C,BIOS.LP_PRINT_LINE3 RST ToBIOS .loop: DI - HALT - JR .loop +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." .ERROR_MSG.size EQU $-.ERROR_MSG @@ -663,45 +683,7 @@ SCANDRV: RET ; .TMP_BUFFER: BLOCK 3,#FF - MODULE COLORS -; -INC: -.BLACK EQU #00 -.BLUE EQU #01 -.GREEN EQU #02 -.CYAN EQU #03 -.RED EQU #04 -.MAGENTA EQU #05 -.BROWN EQU #06 -.LGRAY EQU #07 -.DGRAY EQU #08 -.LBLUE EQU #09 -.LGREEN EQU #0A -.LCYAN EQU #0B -.LRED EQU #0C -.LMAGENT EQU #0D -.YELLOW EQU #0E -.WHITE EQU #0F -PAPER: -.BLACK EQU 16*INC.BLACK -.BLUE EQU 16*INC.BLUE -.GREEN EQU 16*INC.GREEN -.CYAN EQU 16*INC.CYAN -.RED EQU 16*INC.RED -.MAGENTA EQU 16*INC.MAGENTA -.BROWN EQU 16*INC.BROWN -.LGRAY EQU 16*INC.LGRAY -.DGRAY EQU 16*INC.DGRAY -.LBLUE EQU 16*INC.LBLUE -.LGREEN EQU 16*INC.LGREEN -.LCYAN EQU 16*INC.LCYAN -.LRED EQU 16*INC.LRED -.LMAGENT EQU 16*INC.LMAGENT -.YELLOW EQU 16*INC.YELLOW -.WHITE EQU 16*INC.WHITE -FLASH EQU #80 - ENDMODULE ; .old_letter: DB #FF ; .old_DRIVE_ID: DB #FF ; .new_letter: DB #FF diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index de73b12..fca761f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -30,6 +30,7 @@ includelua 'Shared_includes/lua/Functions.lua' INCLUDE 'defines.inc' include 'shared_includes/constants/sp2000.inc' + include 'shared_includes/constants/standart_colors.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/structures/FileSystem.inc' diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 07e7939..a18cb2e 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -61,11 +61,11 @@ R_F_FAT: EX DE,HL LD A,DSS_Error.sys.DISK_FULL RET C - EXX + EXX ;!TODO optimize SET_PAGE_X FATPAGE + EXX ;!TODO optimize - EXX PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYP) @@ -77,17 +77,17 @@ R_F_F16: AND #0F LD H,A LD A,B - ; A/16 + ; swap bit7..4 and bit3..0. RRCA RRCA RRCA RRCA ; - AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE LD E,(HL) @@ -247,7 +247,8 @@ W_T_F16: AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + CP C + CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE POP DE @@ -323,7 +324,7 @@ RE_FAT: PUSH HL PUSH AF LD A,(FATCASH.Update) OR A - CALL NZ,WR_FAT_ + CALL NZ,WR_FAT.Start POP AF LD L,A LD H,0 @@ -340,7 +341,7 @@ RE_FAT: PUSH HL LD HL,0 ;HL:IX - SECTOR FAT FOR READING LD DE,FAT ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) - LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) + LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize RST ToDSS.DRV POP HL RET @@ -350,13 +351,12 @@ WR_FAT: EXX EXX PUSH AF - CALL WR_FAT_ + CALL .Start POP AF OUT (SLOT3),A RET - -WR_FAT_: - LD HL,(FATCASH) + ; +.Start: LD HL,(FATCASH) LD H,0 LD (FATCASH),HL ADD HL,HL @@ -374,14 +374,14 @@ WR_FAT_: LD A,16 AND A SBC HL,DE - JR C,WALLFAT + JR C,.WALLFAT EX DE,HL LD HL,16 ; AND A ;тут точно CF не взведён SBC HL,DE JP C,FATERR LD A,L -WALLFAT: +.WALLFAT: LD H,B LD L,C LD DE,(FatBuffer.FAT_FRM) diff --git a/DSS/build.txt b/DSS/build.txt index b8e817d..61f9147 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -255 \ No newline at end of file +275 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index ff987ef..675eadc 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -4,6 +4,7 @@ ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE COMPILE_UNUSED_CODE 0 ; ; diff --git a/Shared_Includes b/Shared_Includes index 7f4046e..cf19a28 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7f4046e7fabff85738efcf2a7aa1dbbeca7af906 +Subproject commit cf19a287a2cfe1946de5c1d50a255c43ae4fc390