This commit is contained in:
Anatoliy Belyanskiy 2024-06-22 03:36:26 +10:00
parent 3814444250
commit b45094a6f5
8 changed files with 342 additions and 263 deletions

View File

@ -534,6 +534,12 @@ GET_BPB: LD HL,#0000
JP NC,.loop3
.loop3.end: ;
LD (FatBuffer.BytesPerCluster),HL
; LD DE,#8001 ; 能恥丞<E681A5> <20> <20>妞丞 物<><EFBFBD> &恢镼 32 炕 - 郊 祚中丞成<E4B89E>乒摬 ; !TODO
; AND A
; SBC HL,DE
; CCF
; RET C ; [ ] fixed bug, thanks to @Romychs (Roman Boykov)
;
LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive)
LD BC,0
LD A,H

View File

@ -180,66 +180,85 @@ TMPNAME: DZ ' ' ; 12
;----------------------------------------------------------------------;
; IN: A - drive number
OPENDSK:;!TEST DRV.Open ®¡å®¤ R10
LD C,A
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP C
IF CHECK_DRIVE_CHANGE
JR NZ,.open
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
ENDIF
JR Z,.exit
OPENDSK: ;!TEST DRV.Open ®¡å®¤ R10
LD C,A
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP C
IF CHECK_DRIVE_CHANGE
JR NZ,.open
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
ENDIF
JR Z,.exit
.open: LD A,C
;
.force: PUSH AF
LD C,Dss.DRV.Open
RST ToDSS.DRV
POP BC
JP C,.error
;[x] 29/02/2024 fix "open drive error"
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD D,A
PUSH DE
;
LD A,B
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
CALL RD_BPB
;[x] 29/02/2024 fix "open drive error"
POP DE
LD A,D
JR C,.error_disk
; RET C
;
.exit: LD A,(LDRIVE)
AND A
RET
;
.error: CP DSS_Error.sys.INVALID_DRIVE
SCF
RET Z
LD A,DSS_Error.sys.NOT_READY
RET
;[x] 29/02/2024 fix "open drive error"
.error_disk:
CALL OPENDSK.force
LD A,(BOOTDSK.NUM)
CALL C,OPENDSK.force
; ¯à®¢¥àª  ­  ®è¨¡ªã
LD HL,.NOT_READY
LD E, +(80-.NOT_READY.size)/2 ; coord X
LD BC,.NOT_READY.size
JP C,KERNEL_PANIC
;
LD A,DSS_Error.sys.NOT_READY
SCF
RET
;
.NOT_READY: DZ "Boot drive not ready..."
.open: LD A,C
;
.force: PUSH AF
LD C,Dss.DRV.Open
RST ToDSS.DRV
POP BC
JP C,.error
;[x] 29/02/2024 fix "open drive error"
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD D,A
PUSH DE
;
LD A,B
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
CALL RD_BPB
;[x] 29/02/2024 fix "open drive error"
POP DE
JR C,.error_bpb
; RET C
;
.exit: LD A,(LDRIVE)
AND A
RET
;
.error: CP DSS_Error.sys.INVALID_DRIVE
SCF
RET Z
LD A,DSS_Error.sys.NOT_READY
RET
;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed
.error_bpb: PUSH AF ; á®å࠭塞 ­®¬¥à ®è¨¡ª¨
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP D
JR Z,.next_check
;
LD A,D
CP #FF
SCF
JR Z,.set_panic
;
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
CALL OPENDSK.force
LD A,(BOOTDSK.NUM)
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
CALL C,OPENDSK.force
;
.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A'
LD (CORE_BUFFERS.CurrentPath),A
POP AF
RET
;
.next_check: LD A,(BOOTDSK.NUM)
CP D
SCF
.reBPB: CALL NZ,OPENDSK.force
; ¯à®¢¥àª  ­  ®è¨¡ªã
.set_panic: LD HL,.NOT_READY
LD E, +(80-.NOT_READY.size)/2 ; coord X
LD BC,.NOT_READY.size
JR NC,.err_exit
JP KERNEL_PANIC
;
.errorCycle: DB 0
.NOT_READY: DZ "Boot drive error..."
.NOT_READY.size EQU $-.NOT_READY
;----------------------------------------------------------------------;

View File

@ -547,6 +547,10 @@ LOADDIR: ;!TODO optimize
RET
;----------------------------------------------------------------------;
;!TODO FAT procedures
;----------------------------------------------------------------------;
LOAD_SAVE_DIR_PREPARE:
;!TODO optimize
XOR A ; FILE MANIPULATOR = 0
@ -571,7 +575,56 @@ LOAD_SAVE_DIR_PREPARE:
EX AF,AF'
RET
;!TODO FAT procedures
;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
WRT_HND: SET_PAGE_X DIRPAGE
EX AF,AF'
LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index
; EXX
; LD DE,0
; EXX
;
LD BC,FAT_DIRECTORY_RECORD
.loop: ;LD A,(IX+00)
LD A,(HL)
OR A
JR Z,.WRT_HN2
CP #E5
JR Z,.WRT_HN2
;ADD IX,BC
ADD HL,BC
JR NC,.loop ;!FIXIT ª®«¨ç¥á⢮ § ¯¨á¥© ª â «®£  = áâà ­¨æ 
;
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.ROOT_OVERFLOW
SCF
RET
;
.WRT_HN2: ;LD D,XH
;LD E,XL
EX DE,HL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
EX AF,AF'
OUT (SLOT3),A
LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE)
DEC BC
ADD HL,BC
AND A
SBC HL,DE
JR NC,SAVEDIR
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
;JP SAVEDIR
;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
@ -619,62 +672,6 @@ SAVEDIR: ;!TODO optimize
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
WRT_HND: SET_PAGE_X DIRPAGE
EX AF,AF'
;
;LD IX,DIRPAGE.buffer
LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index
; EXX
; LD DE,0
; EXX
;
LD BC,FAT_DIRECTORY_RECORD
.loop: ;LD A,(IX+00)
LD A,(HL)
OR A
JR Z,.WRT_HN2
CP #E5
JR Z,.WRT_HN2
;ADD IX,BC
ADD HL,BC
JR NC,.loop ;!FIXIT ª®«¨ç¥á⢮ § ¯¨á¥© ª â «®£  = áâà ­¨æ 
;
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.ROOT_OVERFLOW
SCF
RET
.WRT_HN2:
;LD D,XH
;LD E,XL
EX DE,HL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
EX AF,AF'
OUT (SLOT3),A
LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE)
DEC BC
ADD HL,BC
AND A
SBC HL,DE
JP NC,SAVEDIR
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
JP SAVEDIR
;----------------------------------------------------------------------;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; [x] fat32 ;!TEST
RD_BPB: ; LD C,SLOT3
@ -811,6 +808,10 @@ RD_BPB: ; LD C,SLOT3
JP NC,.loop3
.loop3.end: ;
LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL
;LD DE,#8001 ; ¯à®¢¥àª  ­  à §¬¥à ª« áâ¥à  ¡®«ìè¥ 32 ª¡ - ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ; !TODO
;AND A
;SBC HL,DE
;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov)
////////////////////////////////////////////////////////////////////////
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
; EX DE,HL

View File

@ -14,7 +14,7 @@
; MOUSE
DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
;DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. <EFBFBD>à®áâ® ¥áâì ªà¨¢ë¥ ¯¥à¥å®¤­¨ª¨
DEFINE MOUSE_READ_PORT_TIMEOUT 16*1024 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨.
; KEYBOARD
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A

View File

@ -7,6 +7,32 @@
PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl
PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data
////////////////////////////////////////////////////////////////////////
MACRO READ_MOUSE_PACKET
IF MOUSE_INT_ENABLED
IN A,(PORT_MOUSE.Ctrl)
RRCA
RET NC
ELSE
;[x] mouse freeeeezzzz
;LD BC,MOUSE_READ_PORT_TIMEOUT
;
.READ_BYTE: IN A,(PORT_MOUSE.Ctrl)
RRCA
;[x] mouse freeeeezzzz
;JR C,.NEXT
;DEC BC
;LD A,B
;OR C
;JR NZ,.READ_BYTE
;RET
JR NC,.READ_BYTE
.NEXT: ;
ENDIF
ENDM
////////////////////////////////////////////////////////////////////////
; MOUSE SOFTWARE SPECIFICATION
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
@ -633,146 +659,179 @@ MOUSE: LD A,(MODE_M)
;----------------------------------------------------------------------;
CLEAR_MOUSE_BUFFER:
IN A,(Z84.SIO.Ch_B.Data)
IN A,(Z84.SIO.Ch_B.Ctrl)
RRCA
JR C,CLEAR_MOUSE_BUFFER
SCF
RET
IN A,(Z84.SIO.Ch_B.Data)
IN A,(Z84.SIO.Ch_B.Ctrl)
RRCA
IF MOUSE_INT_ENABLED
JR C,CLEAR_MOUSE_BUFFER
;
XOR A
LD (READ_M.Step),A
RET
ELSE
;RET NC
;JR CLEAR_MOUSE_BUFFER
JR C,CLEAR_MOUSE_BUFFER
SCF
RET
ENDIF
;----------------------------------------------------------------------;
READ_M: ;[ ] 18/02/2024 ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à 
; reg 1
LD A,1
OUT (PORT_MOUSE.Ctrl),A
IN A,(PORT_MOUSE.Ctrl)
AND %0010'0000 ; check receiver overrun error
; JP NZ,.Receiver_Overrun
JR Z,.READ_FIRST_BYTE
; reg 0 - error reset
LD A,%0011'0000
OUT (Z84.SIO.Ch_B.Ctrl),A
JP CLEAR_MOUSE_BUFFER
READ_M: ;[ ] 18/02/2024 ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à 
; reg 1
LD A,1
OUT (PORT_MOUSE.Ctrl),A
IN A,(PORT_MOUSE.Ctrl)
AND %0010'0000 ; check receiver overrun error
IF MOUSE_INT_ENABLED
JR Z,.Prepare
ELSE
JR Z,.READ_FIRST_BYTE
ENDIF
; reg 0 - error reset
LD A,%0011'0000
OUT (Z84.SIO.Ch_B.Ctrl),A
; reg 0 - return from int
;LD A,%0011'1000
;OUT (Z84.SIO.Ch_B.Ctrl),A
;
JR CLEAR_MOUSE_BUFFER
;
IF MOUSE_INT_ENABLED
.Prepare: LD HL,.Step
LD A,(HL)
OR A
JR Z,.READ_FIRST_BYTE
DEC A
JR Z,.READ_SECOND_BYTE
DEC A
JR Z,.READ_THIRD_BYTE
XOR A
LD (HL),A
ENDIF
.READ_FIRST_BYTE:
IN A,(PORT_MOUSE.Ctrl)
RRCA
RET NC
; AND 1
; RET Z
IN A,(PORT_MOUSE.Data)
LD L,A
AND %0100'0000
;BIT 6,A
;CCF
RET Z
;[x] mouse freeeeezzzz
;LD BC,MOUSE_READ_PORT_TIMEOUT
IN A,(PORT_MOUSE.Ctrl)
RRCA
RET NC
IN A,(PORT_MOUSE.Data)
IF MOUSE_INT_ENABLED
LD (.Reg_L),A
ELSE
LD L,A
ENDIF
AND %0100'0000
;RET Z
JP Z,CLEAR_MOUSE_BUFFER
;
IF MOUSE_INT_ENABLED
INC (HL)
ENDIF
;
.READ_SECOND_BYTE:
IN A,(PORT_MOUSE.Ctrl)
RRCA
;[x] mouse freeeeezzzz
;JR C,.NXT_1
;DEC BC
;LD A,B
;OR C
;JR NZ,.TST_01
;RET
JR NC,.READ_SECOND_BYTE
READ_MOUSE_PACKET
;
IN A,(PORT_MOUSE.Data)
IF MOUSE_INT_ENABLED
LD (.Reg_E),A
AND %0100'0000
JR Z,.nxt1
LD (HL),0
JR .READ_FIRST_BYTE
.nxt1: ;
INC (HL)
ELSE
LD E,A
AND %0100'0000
;!TEST
RET NZ
;JR Z,.READ_THIRD_BYTE
;LD L,E
;JR .READ_SECOND_BYTE
ENDIF
;
.READ_THIRD_BYTE:
READ_MOUSE_PACKET
;
IN A,(PORT_MOUSE.Data)
IF MOUSE_INT_ENABLED
LD (.Reg_D),A
AND %0100'0000
JR Z,.nxt2
LD (HL),0
JR .READ_FIRST_BYTE
.nxt2: ;
LD (HL),0
LD DE,(.Reg_E)
LD HL,(.Reg_L)
ELSE
LD D,A
AND %0100'0000
;!TEST
RET NZ
;JR Z,.packet_end
;LD L,D
;JR .READ_SECOND_BYTE
.packet_end: ;
ENDIF
;
; ¢á¥ âਠ¡ ©â  ¯ ª¥â  ¯à®ç¨â ­ë
;
LD A,E
AND #3F
LD E,A
LD A,L
AND #03
RRCA
RRCA
OR E
LD E,A
;.NXT_1:
IN A,(PORT_MOUSE.Data)
LD E,A
AND %0100'0000
;CCF
RET NZ
;[x] mouse freeeeezzzz
;LD BC,MOUSE_READ_PORT_TIMEOUT
;
.READ_LAST_BYTE:
IN A,(PORT_MOUSE.Ctrl)
RRCA
;[x] mouse freeeeezzzz
;JR C,.NXT_2
;DEC BC
;LD A,B
;OR C
;JR NZ,.READ_LAST_BYTE
;RET
JR NC,.READ_LAST_BYTE
;
;.NXT_2:
IN A,(PORT_MOUSE.Data)
LD D,A
;BIT 6,A
AND %0100'0000
;CCF
RET NZ
; ¢á¥ âਠ¡ ©â  ¯ ª¥â  ¯à®ç¨â ­ë
;
LD A,E
AND #3F
LD E,A
LD A,L
AND #03
RRCA
RRCA
OR E
LD E,A
LD A,D
AND #3F
LD D,A
LD A,L
AND #0C
RRCA
RRCA
RRCA
RRCA
OR D
LD D,A
LD A,L
RLCA
RLCA
RLCA
RES 6,A
JR NC,.STBU
SET 6,A
.STBU: RLCA
RLCA
AND #03
LD (MOUSE_BUTTONS),A
CALL SENSE
LD (MOUSE_COORDINATES),DE
; LD A,E
; LD (MX),A
; LD A,D
; LD (MY),A
SCF
RET
;[ ] 14/03/2024 ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à 
/*
.Receiver_Overrun:
; empty the buffer
IN A,(Z84.SIO.Ch_B.Data)
IN A,(Z84.SIO.Ch_B.Ctrl)
RRCA
JR C,.Receiver_Overrun
; reg 0 - error reset
LD A,%0011'0000
OUT (Z84.SIO.Ch_B.Ctrl),A
;!TEST
; reg 0 - return from int
; LD A,%0011'1000
; OUT (Z84.SIO.Ch_B.Ctrl),A
;
RET
*/
LD A,D
AND #3F
LD D,A
LD A,L
AND #0C
RRCA
RRCA
RRCA
RRCA
OR D
LD D,A
;
; LD A,L
; RLCA
; RLCA
; RLCA
; RES 6,A
; JR NC,.STBU
; SET 6,A
; .STBU: RLCA
; RLCA
; AND #03
LD A,L
AND #30
RRCA
RRCA
RRCA
RRCA
;
LD (MOUSE_BUTTONS),A
CALL SENSE
LD (MOUSE_COORDINATES),DE
; LD A,E
; LD (MX),A
; LD A,D
; LD (MY),A
SCF
RET
;
IF MOUSE_INT_ENABLED
.Reg_L: DB 0
.Reg_E: DB 0
.Reg_D: DB 0
.Step: DB 0
ENDIF
MCORECT:
LD HL,(PIX_X)

View File

@ -21,7 +21,7 @@ cmd_chdir:
dec hl
.chdir: ld c,Dss.ChDir ; ᬥ­¨âì ⥪. ª â «®£
RST ToDSS
jp c,print_err_message ; ¢ë¢®¤ á®®¡é¥­¨ï
call c,print_err_message ; ¢ë¢®¤ á®®¡é¥­¨ï
jp Get_Path ; á®åà. ⥪. ¤¨áª ¨ ¯ãâì
; ; ¢ë¢®¤ á¨áâ. ¯ã⨠­  íªà ­
; ld c,8Eh ; ã§­ âì ¯®«®¦. ªãàá®à 

View File

@ -304,16 +304,10 @@ Print_Header: ; %1
ld bc,16+16+16-1-2
ldir
;
ld hl,Buffers.work.free + 256 + 128 ; á¨áâ. ¯ãâì
ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 ¡ ©â®¢ ¡ãä¥à
ld hl,Buffers.work.free + 256 + 128; á¨áâ. ¯ãâì
ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 ¡ ©â®¢ ¡ãä¥à
call make_short_path
;pop hl
; ld hl,Buffers.screen_path ; !FIXIT ¥á«¨ ¢¢¥á⨠"DIR gamez\*.*", â® ®â®¡à ¦ ¥¬ë© ¯ãâì ¢ § £®«®¢ª¥ ¡ã¤¥â ­¥¢¥à­ë¬
; ld de,PRM3 ;+PRM4 ; 32 ¡ ©â  ¡ãä¥à
; CALL copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..."
ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..."
JP ECHO_MESSAGE ; ¢ë¢¥á⨠áâபã
;

View File

@ -1 +1 @@
406
407