This commit is contained in:
Tolik 2024-12-16 22:14:32 +10:00
parent c82b010f1e
commit 9d0d096208
41 changed files with 4572 additions and 2237 deletions

View File

@ -11,9 +11,9 @@
;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R008 - 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS
;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 - 03-04-2003 DNS IMPROVED FN. VERSION
;R008 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 03-04-2003 DNS IMPROVED FN. VERSION
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM"
;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
@ -21,6 +21,8 @@
;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES
;R101 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
;R102 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
;R001 16-12-1999 DNS Y2K fix
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
@ -28,10 +30,23 @@
;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
;
;---------------------------------------------------------------
; VIDEO
include 'API/Clear.asm'
include 'API/PChars.asm'
include 'API/PutChar.asm'
include 'API/Locate.asm'
include 'API/Cursor.asm'
include 'API/RdChar.asm'
include 'API/WrChar.asm'
include 'API/WinCopy.asm'
include 'API/WinRest.asm'
include 'API/Scroll.asm'
include 'API/SelPage.asm'
include 'API/GetVMod.asm'
include 'API/SetVMod.asm'
;
include 'API/Version.asm'
include 'API/bootDsk.asm'
include 'API/curDisk.asm'
@ -67,6 +82,7 @@
include 'API/Lib_Sub.asm'
include "API/EXECUTE.ASM"
include "API/Print.asm"
include "API/Move_FP.asm"

View File

@ -74,7 +74,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute
;LD (OPEN.TMP),A ; à ¡. ï祩ª  (§¤¥áì  âਡãâ § ¯¨á¨)
;
CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER

View File

@ -34,7 +34,7 @@ CHDIR_FN:
POP AF
RET
;
CHDIR: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
CHDIR: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME
LD A,(HL)

14
DSS/API/Clear.asm Normal file
View File

@ -0,0 +1,14 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #56. Žç¨áâ¨âì ®ª­®.
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - á⮫¡¥æ «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; A - ᨬ¢®« § ¯®«­¨â¥«ì
; B -  âਡãâ § ¯®«­¨â¥«ì
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
CLEAR: LD C,BIOS.LP_CLS_WIN2
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

View File

@ -106,7 +106,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
AND FAT_ATTR.NoDIRnoVolID
LD (.TMP),A
LD (.PATH0),HL
CALL GETWORD
CALL SetPath_GetName
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER

10
DSS/API/Cursor.asm Normal file
View File

@ -0,0 +1,10 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #53. “§­ âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: ­¥â
; ¢ë室: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
;///////////////////////////////////////////////////////////////////////
CURSOR: LD C,BIOS.LP_GET_PLACE
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

View File

@ -17,7 +17,7 @@ DEL_FN: ;!TEST
POP HL
RET C
;
.old_EXE: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
.old_EXE: CALL SetPath_GetName ; âĽáâ ­  ¤ŽŻăáâ. ¨Źď ¨ ­ áâŕ. ­  ¤¨áŞ
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER

View File

@ -96,7 +96,7 @@ EXEC_1: ;LD (CMDLINE),HL
LD HL,(CMDLINE)
LD A,FAT_ATTR.READ_ONLY
LD (OPEN_FN.TMP),A
CALL GETWORD
CALL SetPath_GetName
RET C
; LD HL,TMPNAME
; LD DE,MASKARE
@ -407,7 +407,7 @@ FRC000: LD A,(DE)
CALL MOVE_FP
;
LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë SHARED_PAGE
_ret+1: JP 0
_ret+1: JP 0 ;EXEC02.RET1 ¨«¨ _RET_2
_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)

View File

@ -30,7 +30,7 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS
JR F_FIRST.begin
;
F_FIRST: CALL .INIT_VARS
.begin: CALL GETWORD
.begin: CALL SetPath_GetName
;CALL LOADDIR
RET C
CALL MASK

14
DSS/API/GetVMod.asm Normal file
View File

@ -0,0 +1,14 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #51. <20>®«ãç¨âì ⥪ã騩 ०¨¬ íªà ­ .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ⥪ã騩 ०¨¬ íªà ­ 
; B - áâà ­¨æ  íªà ­  0/1
;///////////////////////////////////////////////////////////////////////
GETVMOD:
IN A,(SCREEN_SWITCH)
LD B,A
LD A,(VMODE)
AND A
RET
;///////////////////////////////////////////////////////////////////////

10
DSS/API/Locate.asm Normal file
View File

@ -0,0 +1,10 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #52. “áâ ­®¢¨âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
LOCATE: LD C,BIOS.LP_SET_PLACE
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

View File

@ -32,7 +32,7 @@ MKDIR:
POP AF
RET
;
.START: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
.START: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
@ -40,7 +40,7 @@ MKDIR:
;
CALL MASK
RET C
;!TEST optimization à ­¥¥ GETWORD 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;!TEST optimization à ­¥¥ SetPath_GetName 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;
CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 

41
DSS/API/Move_FP.asm Normal file
View File

@ -0,0 +1,41 @@
; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR
MOVE_FP: CALL SET_FM
RET C
INC B
DJNZ .B_1
;from Start File
; B=0
.F_start: LD C,B
LD D,B
LD E,B
JP .DO
;
.B_1: DJNZ .B_2
;from Current Position
.F_current: LD C,(IY+_sFM.F_POSITION)
LD B,(IY+_sFM.F_POSITION+1)
LD E,(IY+_sFM.F_POSITION+2)
LD D,(IY+_sFM.F_POSITION+3)
.DO: ADD IX,BC
ADC HL,DE
LD D,XH
LD E,XL
LD (IY+_sFM.F_POSITION),E
LD (IY+_sFM.F_POSITION+1),D
LD (IY+_sFM.F_POSITION+2),L
LD (IY+_sFM.F_POSITION+3),H
XOR A
RET
;
.B_2: DJNZ .error
;from End File
.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
LD B,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.FS_REC.F_SIZE+2)
LD D,(IY + _sFM.FS_REC.F_SIZE+3)
JP .DO
; B > 2
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET

View File

@ -29,7 +29,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
.old_EXE: ;JR .start
;!FIXIT ᤥ« âì ª ª ¢ mkdir ¨«¨ rmdir?
;R008 ;
.start: CALL GETWORD
.start: CALL SetPath_GetName
RET C
CALL MASK
RET C

14
DSS/API/PChars.asm Normal file
View File

@ -0,0 +1,14 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5C. ‚뢮¤ áâப¨ ­  íªà ­.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâபã ᨬ¢®«®¢
; ¢ë室: HL - 㪠§ â¥«ì ­  á«¥¤ãîéãî áâபã ᨬ¢®«®¢
; PRINT NULL-TERMINATED CHARS STRING
;///////////////////////////////////////////////////////////////////////
PCHARS: LD A,(HL)
INC HL
OR A
RET Z
CALL PUTCHAR
JP PCHARS
;///////////////////////////////////////////////////////////////////////

98
DSS/API/PutChar.asm Normal file
View File

@ -0,0 +1,98 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5B. ‚뢮¤ ᨬ¢®«  ­  íªà ­ ¢ ⥪. ¯®§¨æ¨¨.
;
; ¢å®¤: A - ᨬ¢®«
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
PUTCHAR: ;CALL .NO_SCROLL
CP #0E
JR C,.control_characters
;
LD BC,1*256 + BIOS.LP_PRINT_SYM
;[x] CR+LF+SCROLL
RST ToBIOS
;
; ¯à®¢¥àª  ­  ¯¥à¥å®¤ ªãàá®à  ¢ á ¬®¥ ­ ç «® (X:Y == 0:0)
CALL CURSOR
LD A,D
OR E
RET NZ
;
.LFF: PUSH HL
LD BC,1*256 + BIOS.LP_SCROLL_UD
LD DE,#0020
RST ToBIOS
LD DE,#1F00
CALL LOCATE
LD A,' '
LD BC,#50*256 + BIOS.LP_PRINT_SYM
RST ToBIOS
LD DE,#1F00
CALL LOCATE
POP HL
RET
.TB_: CALL CURSOR
IF TABisSPACES
LD B,E
LD A,E
AND #F8
ADD A,8
SUB B
LD B,A
LD A,' '
LD C,BIOS.LP_PRINT_SYM
JP ToBIOS
ELSE
LD A,E
ADD A,8
AND #78 ;????? £«ï­ãâì, çâ® ¡ã¤¥â ¥á«¨ ª®®à¤¨­ âë ªãàá®à  ¢ ª®­æ¥ áâப¨ ¯®çâ¨
LD E,A
JP LOCATE
ENDIF
.BK_: CALL CURSOR
XOR A
CP E
RET Z
DEC E
JP LOCATE
;
.LF_: CALL CURSOR
LD A,D
CP #1F
JR NC,.LFF
INC D
IFN EnoughtOnly_LF
JP LOCATE
ELSE
CALL LOCATE
; !!!! <20>… à §à뢠âì LF_ ¨ CR_ !!!!
ENDIF
.CR_: CALL CURSOR
LD E,0
JP LOCATE
;
.control_characters:
CP "\r"
JR Z,.CR_
CP "\n"
JR Z,.LF_
CP "\t" ; tab
JR Z,.TB_
CP "\b" ; backspace
JR Z,.BK_
CP "\a" ; [x] Beep in PChars/PUTCHAR
RET NZ
; [x] Beep in PChars/PUTCHAR
.BELL: LD DE,1200
PUSH HL
LD HL,4
CALL BEEP
POP HL
RET
;
; [x] -bug with Vasil's version of cursor
.NO_SCROLL: CP #0E
JR C,.control_characters
._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

15
DSS/API/RdChar.asm Normal file
View File

@ -0,0 +1,15 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #57. <20>à®ç¨â âì ᨬ¢®« á íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; ¢ë室: A - ᨬ¢®«
; B -  âਡãâ
;///////////////////////////////////////////////////////////////////////
RDCHAR: XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
LD A,L
LD B,H
RET
;///////////////////////////////////////////////////////////////////////

View File

@ -25,7 +25,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
RET C
;
.old_EXE: ;
; !TODO ЂЎтЊ­уть тут GETWORD, чтЎЁ ЌЎІ­Ў ЁыЋЎ уЄ Ћять ЏЎ Ўт­ЎсЈтЅЋь­ыЌ ЏутяЌ?
; !TODO ЂЎтЊ­уть тут SetPath_GetName, чтЎЁ ЌЎІ­Ў ЁыЋЎ уЄ Ћять ЏЎ Ўт­ЎсЈтЅЋь­ыЌ ЏутяЌ?
;
; [ ] 26/06/2024
PUSH HL

View File

@ -28,7 +28,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
POP AF
RET
;
.START: CALL GETWORD
.START: CALL SetPath_GetName
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER

105
DSS/API/Scroll.asm Normal file
View File

@ -0,0 +1,105 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #55. ‘ªà®««¨­£ íªà ­ .
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B = 1 - ¯à®ªàã⪠ ¢¢¥àå
; B = 2 - ¯à®ªàã⪠ ¢­¨§
; A = 0 - ®ç¨é âì áâபã
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
SCROLL: DJNZ .SCR_DW ;!TODO § ¬¥­¨âì ­  BIOS.LP_SCROLL_UD ¨ ¯®á¬®âà¥âì, çâ® èãáâ॥
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC D
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI:
POP HL
POP DE
;[x] 04/04/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
LD A,D
ADD A,H
DEC A ;R101
LD D,A
.print: PUSH DE ;R101
CALL LOCATE
LD A,' '
LD B,L
LD C,BIOS.LP_PRINT_SYM
RST ToBIOS
POP DE ;R101
JP LOCATE ;R101
;AND A
;RET
.SCR_DW:
DJNZ .SCR_ERR
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC XH
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
; [x] 29/9/23
POP AF
JP PO,.skip2_EI:
EI
.skip2_EI:
POP HL
POP DE
;[x] 29/9/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
JP SCROLL.print
.SCR_ERR:
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;///////////////////////////////////////////////////////////////////////

20
DSS/API/SelPage.asm Normal file
View File

@ -0,0 +1,20 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #54. ‚ë¡à âì  ªâ¨¢­ãî áâà ­¨æã íªà ­ .
;
; ¢å®¤: B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;///////////////////////////////////////////////////////////////////////
SELPAGE:
LD A,(VMODE)
;BIT 7,A
CP %1000'0000
JR NC,.SEL2
PUSH BC
LD C,A
CALL SETVMOD.TEXT_M
POP BC
.SEL2: LD A,B
AND #01
OUT (SCREEN_SWITCH),A
RET
;///////////////////////////////////////////////////////////////////////

246
DSS/API/SetVMod.asm Normal file
View File

@ -0,0 +1,246 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #50. ‚ë¡®à ०¨¬  íªà ­ .
;
; ¢å®¤: A - ०¨¬ íªà ­ 
; #02 - ⥪áâ®¢ë© 40x32x16 梥⮢
; #03 - ⥪áâ®¢ë© 80x32x16 梥⮢
; #81 - £à ä¨ç¥áª¨© 320x256x256 梥⮢
; #82 - £à ä¨ç¥áª¨© 640x256x16 梥⮢
; B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;///////////////////////////////////////////////////////////////////////
SETVMOD: CP %1000'0000
LD C,A
JR NC,.GRAPH
.TEXT_M: LD IX,BACKTXT
PUSH IX
EX AF,AF'
LD A,(VMODE)
LD (BACKTXT.VMODE),A
EX AF,AF'
OR A
JR Z,.NOMODE
DEC A
JR Z,.NOMODE
DEC A
LD HL,TAB_40x32
JR Z,.SET_TXT_MODE
DEC A
LD HL,TAB_80x32
JR Z,.SET_TXT_MODE
.NOMODE: POP IX
LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
; “áâ ­®¢ª  £à ä. ०¨¬®¢
.GRAPH: CALL SAVETXT
AND #7F
JR Z,.G320_16 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
DEC A
JR Z,.G320_56
DEC A
JR Z,.G640_16
;DEC A
;JP Z,.G640_56 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
.G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
;
.SET_TXT_MODE: PUSH BC
LD A,B
RLCA
RLCA
RLCA
RLCA
OR B
AND #11
XOR #10
LD E,A
.SETMODE_END: CALL SETMODE
POP BC
LD A,C
LD (VMODE),A
LD A,B
AND #01
OUT (SCREEN_SWITCH),A
LD A,(VMODE)
LD C,Dss.Mouse.SetVideoMode
RST ToDSS.Mouse
SAFE_PORTY
XOR A
RET
;
.G320_56: PUSH BC
LD HL,TAB_320x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_320x256_1
LD E,#00
JP .SETMODE_END
;
.G640_16: PUSH BC
LD HL,TAB_640x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_640x256_1
LD E,#00
JP .SETMODE_END
;
VMODE: DB #03
;-----------------------------------------------------------------------
; Žâªàëâì ®ª­®
; ¢å®¤: hl=®¯¨á â¥«ì ®ª­ 
; e=ä« £¨ ®ª­ 
;
;02h - TEXT 40 x 32 (16 colors)
;03h - TEXT 80 x 32 (16 colors)
;80h - GRAF 320 x 256 (16 colors)
;81h - GRAF 320 x 256 (256 colors)
;82h - GRAF 640 x 256 (16 colors)
;83h - GRAF 640 x 256 (256 colors) UNUSED
;-----------------------------------------------------------------------
SETMODE: PUSH DE
LD DE,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª. ª¨¤ ¥â ¤ ­­ë¥ ¢ ¡ãä¥à á«ã¦¥¡­®© áâà ­¨æë ¡¨®á .
LD BC,ScreenDescriptorTable.Size ; <20>ˆŽ ¯à¨ ¨á¯®«ì§®¢ ­¨¨ IX ¯à¥¤¯®« £ ¥â, çâ® ®­ 㪠§ë¢ ¥â
IN A,(SLOT3) ; ­   ¤à¥á ­¨¦¥ #C000 ¨ ¢áâ ¢«ï¥â ¢ âà¥âìî ¡ ­ªã áâà ­¨æã #FE
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LDIR
EX AF,AF'
OUT (SLOT3),A
.skip_EI: POP DE
LD IX,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª.
LD C,BIOS.WIN_OPEN
RST ToBIOS
SAFE_PORTY
XOR A
RET
;IX+0 ;HORIZONTAL
;IX+1 ;VERTICAL
;IX+2 ;X - COORD
;IX+3 ;Y - COORD
;IX+4 ;MODE
;IX+5 ;EXT MODE
;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
;
;.......................................................................
;+0 X à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+1 Y à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+2 X ¯®«®¦. ®ª­  ­  íªà ­¥
;+3 Y ¯®«®¦. ®ª­  ­  íªà ­¥
;+4 ०¨¬ §­ ª®¬¥áâ 
;+5 ¤®¯. ०¨¬ §­ ª®¬¥áâ  (bit0=1 ᯥª.  ¤à¥á æ¨ï íªà ­ )
;+6 X ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
;+7 Y ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
ScreenDescriptorTable EQU $
; 80x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 16x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1
; 40x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 8x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2
; 640x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3
; 320x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4
; 640x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5
; 320x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6
ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6
;.......................................................................
;
;-----------------------------------------------------------------------
; ‘®åà ­¨âì íªà ­ ⥪áâ. ०¨¬ .
; „«ï ¡ãä¥à  íªà ­  ¨á¯. 2-ï ¡ ­ª  à áè¨à¥­¨ï „Ž‘.
SAVETXT: PUSH AF
LD A,(VMODE)
;BIT 7,A
CP %1000'0000
JR NC,.NOSAVET
SUB #02
JR C,.NOSAVET
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
;
PUSH AF
LD C,BIOS.LP_GET_PLACE
RST ToBIOS
LD (BACKTXT.CURS),DE
POP AF
LD IX,#C000
LD HL,#2050
OR A
JR NZ,.SVTEXT1
LD L,#28
.SVTEXT1: LD (BACKTXT.WinMax),HL
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_COPY
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI: ;
POP IX
POP HL
POP DE
POP BC
.NOSAVET: POP AF
RET
;-----------------------------------------------------------------------
BACKTXT: PUSH AF
.VMODE+1: LD A,#00
;BIT 7,A
CP %1000'0000
JR C,.NOBACKT
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD IX,#C000
.WinMax+1: LD HL,#2050
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_RESTORE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.no_ei
EI
.no_ei: ;
.CURS+1: LD DE,#0000
CALL LOCATE
POP IX
POP HL
POP DE
POP BC
.NOBACKT: POP AF
RET
;///////////////////////////////////////////////////////////////////////

View File

@ -14,6 +14,7 @@ SYSTIME:
LD C,BIOS.CMOS_TEST
RST ToBIOS
JP C,.NOCMOS
;
LD D,CMOS.Register.date
CALL RCMOS
PUSH AF

23
DSS/API/WinCopy.asm Normal file
View File

@ -0,0 +1,23 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #59. ‘®åà ­¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
WINCOPY: AND A
LD A,R ;R102
PUSH AF ;R102
XOR A
LD C,BIOS.WIN_COPY
DI ;R102
RST ToBIOS
POP AF ;R102
RET PO ;R102
EI ;R102
RET
;///////////////////////////////////////////////////////////////////////

23
DSS/API/WinRest.asm Normal file
View File

@ -0,0 +1,23 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5A. ‚®ááâ ­®¢¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
WINREST: AND A
LD A,R ;R102
PUSH AF ;R102
XOR A
DI ;R102
LD C,BIOS.WIN_RESTORE
RST ToBIOS
POP AF ;R102
RET PO ;R102
EI ;R102
RET
;///////////////////////////////////////////////////////////////////////

23
DSS/API/WrChar.asm Normal file
View File

@ -0,0 +1,23 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #58. ‚뢥á⨠ᨬ¢®« ­  íªà ­.
; “¯à ¢«ïî騥 ᨬ¢®«ë ¢ë¢®¤ïâáï ª ª ®¡ëç­ë¥ ᨬ¢®«ë.
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; A - ᨬ¢®«
; B -  âਡãâ
; ¢ë室: ­¥â
;!FIXIT slow ª ª ¡¥§ WIN_GET_SYM âãâ ®¡®©â¨áì?
;///////////////////////////////////////////////////////////////////////
WRCHAR: LD C,A
PUSH BC
PUSH DE
XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
POP DE
POP HL
XOR A
LD C,BIOS.WIN_PUT_SYM
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

View File

@ -1,207 +0,0 @@
;[BEGIN]
;//MODULE: DOS_FM
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;
;---------------------------------------------------------------
;FMS DB FMCOUNT
;ACCESS MODE:
; 00 - READ/WRITE
; 01 - READ
; 02 - WRITE
;FM_BUF:
;File Manipulator (FM)
; BYTE '. ' ;+00 NAME
; BYTE ' ' ;+08 EXT
; BYTE #10 ;+11 ATTRIBUT
; BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
; BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
; BLOCK 8,0 ;+14 RESERVED
; WORD #0000 ;+22 TIME
; WORD #0000 ;+24 DATE
; WORD #0000 ;+26 START CLUSTER
; DWORD #0000 ;+28 SIZE FILE
; DWORD #0000 ;+32 FILE POSITION (FP)
; WORD #0000 ;+36 DIRECTORY CLUSTER
; WORD #0000 ;+38 HANDLE NUMBER
; BYTE #00 ;+40 DRIVE OR CURRENT
; BYTE #00 ;+41 ACCESS MODE
; BYTE #00 ;+42 TASK
; BYTE #00 ;+43 EMPTY
/*
;!TEST
FM_BUF: _sFM
.Size EQU _sFM
BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
*/
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
; MACRO _mFM_FIND
; CP FMCOUNT+1
; CCF
; RET C
; PUSH DE
; LD IY,CORE_BUFFERS.FM_BUF
; LD DE,CORE_BUFFERS.FM_BUF.Size
; AND A
; JR Z,.endLoop
; .loop: ADD IY,DE
; DEC A
; JR NZ,.loop
; .endLoop:
; POP DE
; ; A=0
; OR (IY) ;+00 NAME
; RET
; ENDM
////////////////////////////////////////////////////////////////////////
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
FM_FIND: CP FMCOUNT+1
JR NC,.error
;
PUSH DE
LD IY,CORE_BUFFERS.FM_BUF
LD DE,CORE_BUFFERS.FM_BUF.Size
AND A
JR Z,.endLoop
.loop: ADD IY,DE
DEC A
JR NZ,.loop
.endLoop: POP DE
; A=0
OR (IY) ;+00 NAME
RET
;
.error: XOR A
LD A,DSS_Error.sys.INVALID_HANDLE
RET
SET_FM: CALL FM_FIND
; error
;LD A,DSS_Error.sys.INVALID_HANDLE
; CF = 1
SCF
RET Z
; no error
XOR A ;LD A,DSS_Error.sys.NO_ERROR
; CF = 0
RET
RES_FM: CALL FM_FIND
; error
; LD A,DSS_Error.sys.INVALID_HANDLE
SCF
RET Z
; no error
XOR A
LD (IY + _sFM.FS_REC.NAME),A
RET
;
GET_FM: LD B,FMCOUNT
LD C,#FF
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
.loop: ADD IY,DE
INC C
LD A,(IY + _sFM.FS_REC.NAME)
OR A
RET Z
DJNZ .loop
LD A,DSS_Error.sys.NO_HANDLES
SCF
RET
/*
;!TODO CHECK LOCKING 10/11/2023
GET_FM: LD IY,0
LD (.freeHandle),IY
;
LD B,FMCOUNT
LD C,#FF
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
.loop: ADD IY,DE
INC C
; CHECK LOCKING
;
.cont: LD A,(IY+0)
OR A
RET Z
DJNZ .loop
LD A,DSS_Error.sys.NO_HANDLES
SCF
RET
*/
; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR
MOVE_FP: CALL SET_FM
RET C
INC B
DJNZ .B_1
;from Start File
; B=0
.F_start: LD C,B
LD D,B
LD E,B
JP .DO
;
.B_1: DJNZ .B_2
;from Current Position
.F_current: LD C,(IY+_sFM.F_POSITION)
LD B,(IY+_sFM.F_POSITION+1)
LD E,(IY+_sFM.F_POSITION+2)
LD D,(IY+_sFM.F_POSITION+3)
.DO: ADD IX,BC
ADC HL,DE
LD D,XH
LD E,XL
LD (IY+_sFM.F_POSITION),E
LD (IY+_sFM.F_POSITION+1),D
LD (IY+_sFM.F_POSITION+2),L
LD (IY+_sFM.F_POSITION+3),H
XOR A
RET
;
.B_2: DJNZ .error
;from End File
.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
LD B,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.FS_REC.F_SIZE+2)
LD D,(IY + _sFM.FS_REC.F_SIZE+3)
JP .DO
; B > 2
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;;;;;;;;;
;FP COMPARE
; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE
MOVE_CP:
LD L,(IY + _sFM.FS_REC.F_SIZE)
LD H,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.F_POSITION)
LD D,(IY + _sFM.F_POSITION+1)
AND A
SBC HL,DE
LD L,(IY + _sFM.FS_REC.F_SIZE+2)
LD H,(IY + _sFM.FS_REC.F_SIZE+3)
LD E,(IY + _sFM.F_POSITION+2)
LD D,(IY + _sFM.F_POSITION+3)
SBC HL,DE
RET
;

View File

@ -7,8 +7,8 @@
;---------------------------------------------------------------
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 - 03-04-2003 DNS IMPROVED FN. VERSION
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 03-04-2003 DNS IMPROVED FN. VERSION
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
@ -86,10 +86,12 @@ GetName: LD BC,#08FF ;!HARDCODE
;----------------------------------------------------------------------;
; old GETWORD
; ’¥áâ ­  ¤®¯ãá⨬®¥ ¨¬ï ¨ ­ áâநâìáï ­  ¤¨áª.
; ¢å®¤: hl=áâப  ¨¬¥­¨
; ¢ë室: (TMPNAME)
GETWORD: ; !TEST
SetPath_GetName:
; !TEST
INC HL
LD A,(HL)
DEC HL
@ -297,16 +299,17 @@ MASK: LD HL,TMPNAME
CP ' '+1
CCF
RET NC
CP '"'
JR Z,.MASK_ERR
;
CP '*'
JR Z,.MASK3
CP '.'
JR Z,.MASK5
CP '"'
JR Z,.MASK_ERR
CP '+'
JR Z,.MASK_ERR
CP ','
JR Z,.MASK_ERR
CP '.'
JR Z,.MASK5
CP '/'
JR Z,.MASK_ERR
CP ':'
@ -327,11 +330,6 @@ MASK: LD HL,TMPNAME
JR Z,.MASK_ERR
CP '|'
JR Z,.MASK_ERR
; CP 'a' ;?????
; JR C,.MASK2
; CP 'z' + 1
; JR NC,.MASK2
; SUB #20
CALL UPPER ; a..z -> A..Z
.MASK2: LD (DE),A
INC HL
@ -341,35 +339,33 @@ MASK: LD HL,TMPNAME
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;
.MASK3: LD A,'?'
INC HL
DJNZ .MASK6
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
JR .MASK_ERR
;
.MASK6: LD (DE),A
INC DE
DJNZ .MASK6
LD B,1
JR .MASK1
;
.MASK5: LD A,' '
INC HL
DJNZ .MASK4
LD B,4
DEC C
JP NZ,.MASK1
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
JR NZ,.MASK1
JR .MASK_ERR
;
.MASK4: LD (DE),A
INC DE
DJNZ .MASK4
LD B,4
DEC C
JP NZ,.MASK1
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
JR NZ,.MASK1
JR .MASK_ERR
;----------------------------------------------------------------------;
@ -445,7 +441,7 @@ DIR_PATH_CHECK: LD A,(HL)
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET C
LD HL,CORE_BUFFERS.CurrentPath
JP GETWORD
JP SetPath_GetName
;
.end: CP (HL)
RET Z
@ -469,3 +465,115 @@ CHECK_NAME:
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;FMS DB FMCOUNT
;ACCESS MODE:
; 00 - READ/WRITE
; 01 - READ
; 02 - WRITE
;FM_BUF:
;File Manipulator (FM)
; BYTE '. ' ;+00 NAME
; BYTE ' ' ;+08 EXT
; BYTE #10 ;+11 ATTRIBUT
; BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
; BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
; BLOCK 8,0 ;+14 RESERVED
; WORD #0000 ;+22 TIME
; WORD #0000 ;+24 DATE
; WORD #0000 ;+26 START CLUSTER
; DWORD #0000 ;+28 SIZE FILE
; DWORD #0000 ;+32 FILE POSITION (FP)
; WORD #0000 ;+36 DIRECTORY CLUSTER
; WORD #0000 ;+38 HANDLE NUMBER
; BYTE #00 ;+40 DRIVE OR CURRENT
; BYTE #00 ;+41 ACCESS MODE
; BYTE #00 ;+42 TASK
; BYTE #00 ;+43 EMPTY
/*
;!TEST
FM_BUF: _sFM
.Size EQU _sFM
BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
*/
////////////////////////////////////////////////////////////////////////
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
FM_FIND: CP FMCOUNT+1
JR NC,.error
;
PUSH DE
LD IY,CORE_BUFFERS.FM_BUF
LD DE,CORE_BUFFERS.FM_BUF.Size
AND A
JR Z,.endLoop
.loop: ADD IY,DE
DEC A
JR NZ,.loop
.endLoop: POP DE
; A=0
OR (IY) ;+00 NAME
RET
;
.error: XOR A
LD A,DSS_Error.sys.INVALID_HANDLE
RET
SET_FM: CALL FM_FIND
; error
;LD A,DSS_Error.sys.INVALID_HANDLE
; CF = 1
SCF
RET Z
; no error
XOR A ;LD A,DSS_Error.sys.NO_ERROR
; CF = 0
RET
RES_FM: CALL FM_FIND
; error
; LD A,DSS_Error.sys.INVALID_HANDLE
SCF
RET Z
; no error
XOR A
LD (IY + _sFM.FS_REC.NAME),A
RET
;
;!TODO CHECK LOCKING
GET_FM: LD B,FMCOUNT
LD C,#FF
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
.loop: ADD IY,DE
INC C
LD A,(IY + _sFM.FS_REC.NAME)
OR A
RET Z
DJNZ .loop
LD A,DSS_Error.sys.NO_HANDLES
SCF
RET
;FP COMPARE
; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE
MOVE_CP:
LD L,(IY + _sFM.FS_REC.F_SIZE)
LD H,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.F_POSITION)
LD D,(IY + _sFM.F_POSITION+1)
AND A
SBC HL,DE
LD L,(IY + _sFM.FS_REC.F_SIZE+2)
LD H,(IY + _sFM.FS_REC.F_SIZE+3)
LD E,(IY + _sFM.F_POSITION+2)
LD D,(IY + _sFM.F_POSITION+3)
SBC HL,DE
RET
;
;----------------------------------------------------------------------;

View File

@ -397,14 +397,10 @@ ADRST10: ;DS 512 ;,0
;[INCLUDE]
;!TODO § ¬¥­¨âì ¯®-¬ ªá¨¬®¬ã ¢áñ ¢ KEYINTER.ASM ­  ¢ë§®¢ë ¡¨®á 
INCLUDE "KEYINTER.ASM"
INCLUDE "VIDEO.ASM"
INCLUDE "API.ASM"
INCLUDE "DOS_Proc.asm"
INCLUDE "FS/FAT/FAT.ASM"
INCLUDE "FS/FAT/FAT_X.ASM"
INCLUDE "DOS_FM.ASM"
INCLUDE "FS_Module.asm"
INCLUDE "Procedures.asm"
INCLUDE "Kernel_Panic.asm"
; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb

3
DSS/FS/CDFS.ASM Normal file
View File

@ -0,0 +1,3 @@
;
;
;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

8
DSS/FS_Module.asm Normal file
View File

@ -0,0 +1,8 @@
INCLUDE "FS/FAT.ASM"
INCLUDE "FS/CDFS.ASM"
/*
READ_BPB ; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER
*/

View File

@ -1,81 +0,0 @@
;
MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor
LD HL,txtString
LD BC,txtColor*256 + txtStringSize
LD DE,coordY * 256 + (80 - txtStringSize)/2
CALL .PRINT_LINE
ENDM ; 12 bytes
;
;-----------------------[]
; HL - á®®¡é¥­¨¥
; E - ª®®à¤¨­ â  X ­  ⥪á⮢®¬ íªà ­¥
; BC - ¤«¨­  á®®¡é¥­¨ï
KERNEL_PANIC:
DI
;
PUSH DE
PUSH HL
PUSH BC
;
LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD HL,#2050
LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS
;
LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2
;
PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED)
PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE)
;
POP BC
POP HL
LD DE,#A000
LD A,C
LDIR
;
POP DE
LD D,15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
.PRINT_LINE:
PUSH BC
PUSH DE
LD DE,#A000
LD B,E
LD A,C
LDIR
;
POP DE
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
POP DE
LD E,D
LD HL,#A000
LD D,L
LD B,A
LD C,BIOS.LP_PRINT_LINE3
JP ToBIOS
;
.kernel_panic: DZ "KERNEL PANIC!"
.kernel_panic.size EQU $-.kernel_panic
;
.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
.press_CAD.size EQU $-.press_CAD
;-----------------------[]

View File

@ -265,7 +265,6 @@ BCD2HEX:
;!TODO hardware
;----------------------------------------------------------------------;
;!FIXIT ¯¥à¥¤¥« âì ¯® ¤®ª¥ ­  „ «« á ¨ § ¯¨áì ¢ ï祩ª¨ ç á®¢
; ‡ ¯¨áì ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
WCMOS: CALL HEX2BCD
@ -344,3 +343,86 @@ DIV_by_Shifts:
LD L,A
RET
;----------------------------------------------------------------------;
;===============================================================================================================================
MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor
LD HL,txtString
LD BC,txtColor*256 + txtStringSize
LD DE,coordY * 256 + (80 - txtStringSize)/2
CALL .PRINT_LINE
ENDM ; 12 bytes
;
;-----------------------[]
; HL - á®®¡é¥­¨¥
; E - ª®®à¤¨­ â  X ­  ⥪á⮢®¬ íªà ­¥
; BC - ¤«¨­  á®®¡é¥­¨ï
KERNEL_PANIC:
DI
;
PUSH DE
PUSH HL
PUSH BC
;
LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD HL,#2050
LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS
;
LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2
;
PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED)
PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE)
;
POP BC
POP HL
LD DE,#A000
LD A,C
LDIR
;
POP DE
LD D,15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
.PRINT_LINE:
PUSH BC
PUSH DE
LD DE,#A000
LD B,E
LD A,C
LDIR
;
POP DE
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
POP DE
LD E,D
LD HL,#A000
LD D,L
LD B,A
LD C,BIOS.LP_PRINT_LINE3
JP ToBIOS
;
.kernel_panic: DZ "KERNEL PANIC!"
.kernel_panic.size EQU $-.kernel_panic
;
.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
.press_CAD.size EQU $-.press_CAD
;-----------------------[]
;===============================================================================================================================

View File

@ -1,696 +0,0 @@
;[BEGIN]
;//MODULE: VIDEO
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
;---------------------------------------------------------------
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #56. Žç¨áâ¨âì ®ª­®.
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - á⮫¡¥æ «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; A - ᨬ¢®« § ¯®«­¨â¥«ì
; B -  âਡãâ § ¯®«­¨â¥«ì
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
CLEAR: LD C,BIOS.LP_CLS_WIN2
JP ToBIOS
;AND A
;RET
;
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5C. ‚뢮¤ áâப¨ ­  íªà ­.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâபã ᨬ¢®«®¢
; ¢ë室: HL - 㪠§ â¥«ì ­  á«¥¤ãîéãî áâபã ᨬ¢®«®¢
; PRINT NULL-TERMINATED CHARS STRING
;/////////////////////////////////////////////////////////////////////
PCHARS: LD A,(HL)
INC HL
OR A
RET Z
CALL PUTCHAR
JP PCHARS
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5B. ‚뢮¤ ᨬ¢®«  ­  íªà ­ ¢ ⥪. ¯®§¨æ¨¨.
;
; ¢å®¤: A - ᨬ¢®«
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
PUTCHAR:
;CALL .NO_SCROLL
CP #0E
JR C,.control_characters
;
LD BC,1*256 + BIOS.LP_PRINT_SYM
;[x] CR+LF+SCROLL
RST ToBIOS
;
; ¯à®¢¥àª  ­  ¯¥à¥å®¤ ªãàá®à  ¢ á ¬®¥ ­ ç «® (X:Y == 0:0)
CALL CURSOR
LD A,D
OR E
RET NZ
;
.LFF: PUSH HL
LD BC,1*256 + BIOS.LP_SCROLL_UD
LD DE,#0020
RST ToBIOS
LD DE,#1F00
CALL LOCATE
LD A,' '
LD BC,#50*256 + BIOS.LP_PRINT_SYM
RST ToBIOS
LD DE,#1F00
CALL LOCATE
POP HL
RET
.TB_: CALL CURSOR
IF TABisSPACES
LD B,E
LD A,E
AND #F8
ADD A,8
SUB B
LD B,A
LD A,' '
LD C,BIOS.LP_PRINT_SYM
JP ToBIOS
ELSE
LD A,E
ADD A,8
AND #78 ;????? £«ï­ãâì, çâ® ¡ã¤¥â ¥á«¨ ª®®à¤¨­ âë ªãàá®à  ¢ ª®­æ¥ áâப¨ ¯®çâ¨
LD E,A
JP LOCATE
ENDIF
.BK_: CALL CURSOR
XOR A
CP E
RET Z
DEC E
JP LOCATE
;
.LF_: CALL CURSOR
LD A,D
CP #1F
JR NC,.LFF
INC D
IFN EnoughtOnly_LF
JP LOCATE
ELSE
CALL LOCATE
; !!!! <20>… à §à뢠âì LF_ ¨ CR_ !!!!
ENDIF
.CR_: CALL CURSOR
LD E,0
JP LOCATE
;
.control_characters:
CP #0D
JR Z,.CR_
CP #0A
JR Z,.LF_
CP #09
JR Z,.TB_
CP #08
JR Z,.BK_
CP #07 ; [x] Beep in PChars/PUTCHAR
RET NZ
; [x] Beep in PChars/PUTCHAR
.BELL: LD DE,1200
PUSH HL
LD HL,4
CALL BEEP
POP HL
RET
;
; [x] -bug with Vasil's version of cursor
.NO_SCROLL:
CP #0E
JR C,.control_characters
._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM
JP ToBIOS
;
;-----[]
;
;
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #52. “áâ ­®¢¨âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
LOCATE: LD C,BIOS.LP_SET_PLACE
JP ToBIOS
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #53. “§­ âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: ­¥â
; ¢ë室: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
;/////////////////////////////////////////////////////////////////////
CURSOR: LD C,BIOS.LP_GET_PLACE
JP ToBIOS
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #57. <20>à®ç¨â âì ᨬ¢®« á íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; ¢ë室: A - ᨬ¢®«
; B -  âਡãâ
;/////////////////////////////////////////////////////////////////////
RDCHAR: XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
LD A,L
LD B,H
;AND A
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #58. ‚뢥á⨠ᨬ¢®« ­  íªà ­.
; “¯à ¢«ïî騥 ᨬ¢®«ë ¢ë¢®¤ïâáï ª ª ®¡ëç­ë¥ ᨬ¢®«ë.
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; A - ᨬ¢®«
; B -  âਡãâ
; ¢ë室: ­¥â
;!FIXIT slow ª ª ¡¥§ WIN_GET_SYM âãâ ®¡®©â¨áì?
;/////////////////////////////////////////////////////////////////////
WRCHAR: LD C,A
PUSH BC
PUSH DE
XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
POP DE
POP HL
XOR A
LD C,BIOS.WIN_PUT_SYM
JP ToBIOS
;AND A
;RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #59. ‘®åà ­¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
WINCOPY: AND A
LD A,R ;R02
PUSH AF ;R02
XOR A
LD C,BIOS.WIN_COPY
DI ;R02
RST ToBIOS
POP AF ;R02
RET PO ;R02
EI ;R02
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5A. ‚®ááâ ­®¢¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
WINREST: AND A
LD A,R ;R02
PUSH AF ;R02
XOR A
DI ;R02
LD C,BIOS.WIN_RESTORE
RST ToBIOS
POP AF ;R02
RET PO ;R02
EI ;R02
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #55. ‘ªà®««¨­£ íªà ­ .
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B = 1 - ¯à®ªàã⪠ ¢¢¥àå
; B = 2 - ¯à®ªàã⪠ ¢­¨§
; A = 0 - ®ç¨é âì áâபã
; ¢ë室: ­¥â
;/////////////////////////////////////////////////////////////////////
SCROLL: DJNZ .SCR_DW ;!TODO § ¬¥­¨âì ­  BIOS.LP_SCROLL_UD ¨ ¯®á¬®âà¥âì, çâ® èãáâ॥
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC D
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI:
POP HL
POP DE
;[x] 04/04/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
LD A,D
ADD A,H
DEC A ;R01
LD D,A
.print: PUSH DE ;R01
CALL LOCATE
LD A,' '
LD B,L
LD C,BIOS.LP_PRINT_SYM
RST ToBIOS
POP DE ;R01
JP LOCATE ;R01
;AND A
;RET
.SCR_DW:
DJNZ .SCR_ERR
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC XH
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
; [x] 29/9/23
POP AF
JP PO,.skip2_EI:
EI
.skip2_EI:
POP HL
POP DE
;[x] 29/9/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
JP SCROLL.print
.SCR_ERR:
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #54. ‚ë¡à âì  ªâ¨¢­ãî áâà ­¨æã íªà ­ .
;
; ¢å®¤: B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
SELPAGE:
LD A,(VMODE)
;BIT 7,A
CP %1000'0000
JR NC,.SEL2
PUSH BC
LD C,A
CALL SETVMOD.TEXT_M
POP BC
.SEL2: LD A,B
AND #01
OUT (SCREEN_SWITCH),A
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #51. <20>®«ãç¨âì ⥪ã騩 ०¨¬ íªà ­ .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ⥪ã騩 ०¨¬ íªà ­ 
; B - áâà ­¨æ  íªà ­  0/1
;/////////////////////////////////////////////////////////////////////
GETVMOD:
IN A,(SCREEN_SWITCH)
LD B,A
LD A,(VMODE)
AND A
RET
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #50. ‚ë¡®à ०¨¬  íªà ­ .
;
; ¢å®¤: A - ०¨¬ íªà ­ 
; #02 - ⥪áâ®¢ë© 40x32x16 梥⮢
; #03 - ⥪áâ®¢ë© 80x32x16 梥⮢
; #81 - £à ä¨ç¥áª¨© 320x256x256 梥⮢
; #82 - £à ä¨ç¥áª¨© 640x256x16 梥⮢
; B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
SETVMOD:;
CP %1000'0000
LD C,A
JR NC,GRAPH
.TEXT_M: LD IX,BACKTXT
PUSH IX
EX AF,AF'
LD A,(VMODE)
LD (BACKTXT.VMODE),A
EX AF,AF'
OR A
JR Z,.NOMODE
DEC A
JR Z,.NOMODE
DEC A
LD HL,TAB_40x32
JR Z,T_40_32
DEC A
LD HL,TAB_80x32
JR Z,T_80_32
.NOMODE: POP IX
LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
; “áâ ­®¢ª  £à ä. ०¨¬®¢
GRAPH: CALL SAVETXT
AND #7F
JR Z,G320_16 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
DEC A
JR Z,G320_56
DEC A
JR Z,G640_16
; DEC A
; JP Z,G640_56 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
T_80_32:
T_40_32: PUSH BC
; LD HL,TAB2
LD A,B
RLCA
RLCA
RLCA
RLCA
OR B
AND #11
XOR #10
LD E,A
GRAPH_NEXT:
CALL SETMODE
POP BC
LD A,C
LD (VMODE),A
LD A,B
AND #01
OUT (SCREEN_SWITCH),A
LD A,(VMODE)
LD C,Dss.Mouse.SetVideoMode
RST ToDSS.Mouse
SAFE_PORTY
XOR A
RET
; T_80_32 PUSH BC
; LD HL,TAB1
; LD A,B
; RLCA
; RLCA
; RLCA
; RLCA
; OR B
; AND #11
; XOR #10
; LD E,A
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
G320_56 PUSH BC
LD HL,TAB_320x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_320x256_1
LD E,#00
JP GRAPH_NEXT
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
G640_16 PUSH BC
LD HL,TAB_640x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_640x256_1
LD E,#00
JP GRAPH_NEXT
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
VMODE: DB #03
;-----------------------------------------------------------------------
; Žâªàëâì ®ª­®
; ¢å®¤: hl=®¯¨á â¥«ì ®ª­ 
; e=ä« £¨ ®ª­ 
;
;02h - TEXT 40 x 32 (16 colors)
;03h - TEXT 80 x 32 (16 colors)
;80h - GRAF 320 x 256 (16 colors)
;81h - GRAF 320 x 256 (256 colors)
;82h - GRAF 640 x 256 (16 colors)
;83h - GRAF 640 x 256 (256 colors) UNUSED
;-----------------------------------------------------------------------
SETMODE: PUSH DE
LD DE,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª. ª¨¤ ¥â ¤ ­­ë¥ ¢ ¡ãä¥à á«ã¦¥¡­®© áâà ­¨æë ¡¨®á .
LD BC,ScreenDescriptorTable.Size ; <20>ˆŽ ¯à¨ ¨á¯®«ì§®¢ ­¨¨ IX ¯à¥¤¯®« £ ¥â, çâ® ®­ 㪠§ë¢ ¥â
IN A,(SLOT3) ; ­   ¤à¥á ­¨¦¥ #C000 ¨ ¢áâ ¢«ï¥â ¢ âà¥âìî ¡ ­ªã áâà ­¨æã #FE
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LDIR
EX AF,AF'
OUT (SLOT3),A
.skip_EI: POP DE
LD IX,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª.
LD C,BIOS.WIN_OPEN
RST ToBIOS
SAFE_PORTY
XOR A
RET
;IX+0 ;HORIZONTAL
;IX+1 ;VERTICAL
;IX+2 ;X - COORD
;IX+3 ;Y - COORD
;IX+4 ;MODE
;IX+5 ;EXT MODE
;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
;
;.......................................................................
;+0 X à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+1 Y à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+2 X ¯®«®¦. ®ª­  ­  íªà ­¥
;+3 Y ¯®«®¦. ®ª­  ­  íªà ­¥
;+4 ०¨¬ §­ ª®¬¥áâ 
;+5 ¤®¯. ०¨¬ §­ ª®¬¥áâ  (bit0=1 ᯥª.  ¤à¥á æ¨ï íªà ­ )
;+6 X ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
;+7 Y ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
ScreenDescriptorTable EQU $
; 80x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 16x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1
; 40x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 8x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2
; 640x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3
; 320x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4
; 640x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5
; 320x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6
ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6
;.......................................................................
;
;----------------------------------------------------------------------
; ‘®åà ­¨âì íªà ­ ⥪áâ. ०¨¬ .
; „«ï ¡ãä¥à  íªà ­  ¨á¯. 2-ï ¡ ­ª  à áè¨à¥­¨ï „Ž‘.
SAVETXT: PUSH AF
LD A,(VMODE)
;BIT 7,A
CP %1000'0000
JR NC,.NOSAVET
SUB #02
JR C,.NOSAVET
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
;
PUSH AF
LD C,BIOS.LP_GET_PLACE
RST ToBIOS
LD (BACKTXT.CURS),DE
POP AF
LD IX,#C000
LD HL,#2050
OR A
JR NZ,.SVTEXT1
LD L,#28
.SVTEXT1: LD (BACKTXT.WinMax),HL
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_COPY
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI: ;
POP IX
POP HL
POP DE
POP BC
.NOSAVET: POP AF
RET
;----------------------------------------------------------------------
BACKTXT: PUSH AF
.VMODE+1: LD A,#00
;BIT 7,A
CP %1000'0000
JR C,.NOBACKT
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD IX,#C000
.WinMax+1: LD HL,#2050
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_RESTORE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.no_ei
EI
.no_ei: ;
.CURS+1: LD DE,#0000
CALL LOCATE
POP IX
POP HL
POP DE
POP BC
.NOBACKT: POP AF
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;//MODULE: VIDEO
;[END]

View File

@ -0,0 +1,495 @@
;!TODO ª®¤ ¤¨ª® ª®áâë«ì­ë© ¨ ¡ã¤¥â ¯¥à¥¤¥« ­ ¢¬¥áâ¥ á ¯à®æ¥¤ãன INITDVC
ReScanDRV:
.NUMBER_OF_SUBTABLES EQU 2 ;ª®«¨ç¥á⢮ â ¡«¨æ ¢â®à®£® ã஢­ï (LOGDRV, RMDRIVE)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 0. § ¯®¬¨­ ¥¬ ¡ãâ-¤¨áª
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,B
LD (.old_letter),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 1. ª®¯¨à㥬 ¢ ¡ãä¥à â ¡«¨æë DEVICE, LOGDRV, RAMDTBL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD HL,DEVICE
LD DE,OLD_TABLES.DEVICE
LD BC,OLD_TABLES.DEVICE - DEVICE
LDIR
;
LD A,.NUMBER_OF_SUBTABLES
LD (Fill_if_Exists.tbl),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 2. ¢ë§ë¢ ¥¬ ¨­¨æ¨ «¨§ æ¨î ¤à ©¢®¢
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
CALL INITDVC_RET_DRIVE
LD (DRV_PAGE.LDRIVE),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 3. áà ¢­¨¢ ¥¬ § ¯¨á¨ áâ àëå â ¡«¨æ á ­®¢ë¬¨:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD HL,OLD_TABLES.DEVICE
LD B,DSS_MAX_DRIVES_AMOUNT
.tbl_scanNew_mainLoop:
PUSH BC
PUSH HL
; ¯®«ãç ¥¬ ­®¬¥à ¯à®æ¥¤ãàë ¤«ï í⮩ ¡ãª¢ë ¤¨áª 
LD A,(HL)
;
CP #FF
JR Z,.nextN
;
LD B,A
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
; [¨é¥¬ çâ® §  ¤à ©¢]
EX DE,HL
; FDD?
LD HL,FDD_DRV.API_TABLE
AND A
SBC HL,DE
JR Z,.nextN ; ¯à®¯ã᪠FDD ¤à ©¢®¢
; HDD?
LD HL,HDDRIVE
AND A
SBC HL,DE
; HDD! ‘¢¥àª  ¯® â ¡«¨æ¥ LOGDRV
JP Z,SCAN_TABLES.HARD_DRV
; RD?
LD HL,RMDRIVE
AND A
SBC HL,DE
; RAM Drive! ‘¢¥àª  ¯® â ¡«¨æ¥ RAMDTBL
JP Z,SCAN_TABLES.RAM_DRV
; CD/DVD?
;LD HL,CDDRIVE
;AND A
;SUB HL,DE
; CD/DVD!
; JR Z,SCAN_TABLES.CD_ROM
; á«¥¤ãî騩 ¢¨â®ª
.nextN: POP HL
.nextN2:
INC HL
INC HL
INC HL
POP BC
DJNZ .tbl_scanNew_mainLoop
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 4. áà ¢­¨¢ ¥¬ § ¯¨áì ­®¢ëå â ¡«¨æ á® áâ à묨
;  . ¥á«¨ ¤à ©¢ ⮫쪮 ¢ ­®¢®©:
;  1) ¢â몠¥¬ ¥£® ¢ ¯¥à¢ãî ᢮¡®¤­ãî § ¯¨áì ¢ DEVICE (¨«¨ áâ ¢¨¬ ¯®á«¥ ¯®á«¥¤­¥£® ¤à ©¢ )
;
; ‚•Ž„: IX - OLD_TABLES.DEVICE
; HL - OLD_TABLES.DEVICE.End
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
INC HL
LD (OLD_TABLES_CURRENT),HL
EXX
LD HL,OLD_TABLES.LOGDRV - LOGDRV
LD B,DSS_MAX_DRIVES_AMOUNT
EXX
; ­ å®¤¨¬ ¢ áâ à®© DEVICE ¯¥à¢ãî ᢮¡®¤­ãî ï祩ªã (¯à®¢¥à塞 á ª®­æ  ¢ ­ ç «®)
LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry
LD IY,LOGDRV
LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; ¤¢¨£ ¥¬áï ¯® â ¡«¨æ¥ ­ § ¤
LD B,DSS_MAX_DRIVES_AMOUNT
;
.loop1: LD A,#FF
CP (IX+0)
JR NZ,.loop2_start
ADD IX,DE
DJNZ .loop1
.loop1_exit:
LD A,C ; § ª®­ç¨«¨ áç¨â âì ¯¥à¥¬¥­­ãî LDRIVE
LD (DRV_PAGE.LDRIVE),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 5. ¯à®¢¥à塞, ­¥ £à®å­ã«áï «¨ ¡ãâ-¤¨áª.
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
.old_letter+1:
LD A,0
_CALC_DEVICE_ENTRY OLD_TABLES.DEVICE
LD A,(HL)
INC A
SCF
;JP Z,ERROR_BOOTDRV_DIES
RET Z
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 6. § ¬¥­ï¥¬ ­®¢ë¥ â ¡«¨æë ­  ¬®¤¨ä¨æ¨à®¢ ­­ë¥ áâ àë¥
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD HL,OLD_TABLES.DEVICE
LD DE,DEVICE
LD BC,OLD_TABLES.DEVICE - DEVICE
LDIR
;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;7. ¢ë室
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,(DRV_PAGE.LDRIVE)
AND A
RET
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;-----------------------[]
.loop2_start:
LD C,B ; ­ ç¨­ ¥¬ áç¨â âì ¯¥à¥¬¥­­ãî LDRIVE
LD A,DSS_MAX_DRIVES_AMOUNT
SUB B ; ᪮«ìª® è £®¢ ¢¯¥àñ¤ ¯® â ¡«¨æ¥ ®áâ «®áì
LD B,A
;
.loop2: LD DE,DEVICE.TBL_Entry ; ⥯¥àì ¤¢¨£ ¥¬áï ¯® â ¡«¨æ¥ ¢¯¥àñ¤
ADD IX,DE
; âãâ 㪠§ â¥«ì ¯®ª §ë¢ ¥â ­  ¯¥à¢ãî ᢮¡®¤­ãî ï祩ªã ¯®á«¥ ¡«®ª  á ¤ ­­ë¬¨ ¤à ©¢®¢
PUSH IX
PUSH BC
CALL Fill_if_Exists
POP BC
POP IX
; NC:
; DE =  ¤à¥á ¯à®æ¥¤ãàë ®¡à ¡®â稪  â ¡«¨æë
; A = «®£¨ç¥áª¨© ­®¬¥à ãáâனá⢠ ¢ â ¡«¨æ¥ ®¡à ¡®â稪 
;
; CF - ­¥â ¡®«ìè¥ ­®¢ëå § ¯¨á¥©
JR C,.loop1_exit
LD (IX+0),A
LD (IX+1),E
LD (IX+2),D
;
INC C ; ¤®¡ ¢¨«¨ ¤à ©¢
;
DJNZ .loop2
JR .loop1_exit
;-----------------------[]
;-----------------------[]
Fill_if_Exists:
.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES
DJNZ 1F
; B=1, RAMDTBL
LD A,RAMDTBL.TBL_Entry
LD IY,RAMDTBL
CALL .RUN
LD DE,RMDRIVE
RET NC
LD A,(.tbl)
DEC A ;!!!!! ¬®¦¥â ¡ëâì ¯¥à¥¯®«­¥­¨¥
LD (.tbl),A
RET
;
1: DJNZ 1F
; B=2, LOGDRV
LD A,LOGDRV.TBL_Entry
LD IY,LOGDRV
CALL .RUN
LD DE,HDDRIVE
RET NC
; ¯¥à¥å®¤¨¬ ­  ¤àã£ãî â ¡«¨æã - RAMDTBL
LD A,(.tbl)
DEC A ;!!!!! ¬®¦¥â ¡ëâì ¯¥à¥¯®«­¥­¨¥
LD (.tbl),A
LD HL,OLD_TABLES.RAMDTBL
LD (OLD_TABLES_CURRENT),HL
EXX
LD B,MAX_RAMDRIVES
EXX
JR Fill_if_Exists
;
1: SCF ; unknown table number
RET
;
.RUN: EXX
;
LD D,0
LD E,A
PUSH DE
;
LD A,#FE ; ’ ª ¯®¨áª § ª®­ç¨âáï «¨¡® ­  ­®¬¥à¥ ¤à ©¢ , «¨¡® ¯® ª®­æã â ¡«¨æë
PUSH BC
CALL Find_Record.loop1 ; ¨é¥â ¢ ­®¢®© â ¡«¨æ¥ ­®¢ãî § ¯¨áì
POP BC
JR NC,1F
;
POP DE
EXX
RET
;
1: PUSH IY ; á®å࠭塞 ⥪ã騩  ¤à¥á ­®¢®© â ¡«¨æë
;
LD IY,(OLD_TABLES_CURRENT)
;
LD A,#FF ; ’ ª ¯®¨áª § ª®­ç¨âáï «¨¡® ­  ¯ãá⮩ § ¯¨á¨, «¨¡® ¯® ª®­æã â ¡«¨æë
LD C,D ; ­®¬¥à § ¯¨á¨ ¢ â ¡«¨æ¥. D=0
PUSH BC
CALL Find_Record.loop2
LD A,C
POP BC
JR NC,1F
;
POP DE
POP DE
EXX
RET
;
1: EX (SP),IY ; ¯¥à¥ª«î祭¨¥ á® áâ à®© ­  ­®¢ãî â ¡«¨æã
PUSH IY
EXX
; ¯¥à¥ª¨¤ë¢ ¥¬ § ¯¨áì ¨§ ­®¢®© ¢ áâ àãî
POP HL
POP DE
POP BC
LDIR
LD (IY),#FF ; £à®å ¥¬ ⮫쪮 çâ® ¯¥à¥ª¨­ãâãî § ¯¨áì ¨§ ­®¢®© â ¡«¨æë
AND A
RET
OLD_TABLES_CURRENT: WORD 0
;-----------------------[]
;-----------------------[]
; ‚•Ž„: A - Œ áª  ¤«ï áà ¢­¥­¨ï
; DE - „«¨­  ®¤­®© § ¯¨á¨
; IY - €¤à¥á ¤ ­­ëå ¢ â ¡«¨æ¥
; ‚›•Ž„: NC:
; IY - ­ ç «® ¯®¤å®¤ï饩 § ¯¨á¨
; C - ­®¬¥à ­®¢®© § ¯¨á¨ ¢ áâ à®© â ¡«¨æ¥
; CF - <20>¥ ­ ©¤¥­®, â ¡«¨æ  § ª®­ç¨« áì
Find_Record:
.loop1: CP (IY)
RET NC
ADD IY,DE
INC C
DJNZ .loop1
; â ¡«¨æã ¯à®è¥àá⨫¨
SCF
RET
.loop2: CP (IY)
RET Z
ADD IY,DE
INC C
DJNZ .loop2
; â ¡«¨æã ¯à®è¥àá⨫¨
SCF
RET
;-----------------------[]
;-----------------------[]
; ERROR_BOOTDRV_DIES:
; DI
; LD E,1
; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
; RST ToBIOS
; ;
; LD HL,#2050
; LD DE,0
; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
; RST ToBIOS
; ;
; LD A,1
; OUT (SCREEN_SWITCH),A ; set scr-2
; ;
; LD HL,.ERROR_MSG
; LD DE,#A000
; LD BC,.ERROR_MSG.size
; LD A,C
; LDIR
; ;
; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16
; LD C,BIOS.LP_SET_PLACE
; RST ToBIOS
; ;
; LD HL,#A000
; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
; LD B,A
; LD C,BIOS.LP_PRINT_LINE3
; RST ToBIOS
; ;
; .loop: DI
; HALT
; JR .loop
; ;
; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET."
; .ERROR_MSG.size EQU $-.ERROR_MSG
;-----------------------[]
;-----------------------[]
; <20>… ƒ<>Ž•€œ HL!
;  . ¥á«¨ ¤à ©¢ ¥áâì ¢ ­®¢®© ¨ áâ à®©, â® § â¨à ¥¬ ¢ ­®¢®©
; â ¡«¨æ¥ ᮢ¯ ¢è¨© ¤à ©¢
; ¡. ¥á«¨ ¤à ©¢ ¥áâì ⮫쪮 ¢ áâ à®©, â®:
; ¡1) £à®å ¥¬ ä ©«®¢ë¥ ¬ ­¨¯ã«ïâ®àë á ¥£® ­®¬¥à®¬
MODULE SCAN_TABLES
; ¢å®¤: B - «®£.­®¬¥à ¤à ©¢ , DE
RAM_DRV:
; <20>®«ãç ¥¬ ­®¬¥à à ¬¤¨áª  ¢ OLD_TABLES.RAMDTBL
LD A,B
LD BC,OLD_TABLES.RAMDTBL
CALL GET_RAMDRV_NUM.skip_tbl
LD (.cur_drv),BC
AND #0F
LD C,A ; ­®¬¥à à ¬¤¨áª 
; ˆé¥¬ ¢ ­®¢®© â ª®© ¦¥ ­®¬¥à à ¬¤¨áª 
LD B,MAX_RAMDRIVES
LD DE,RAMDTBL
.loop: LD A,(DE)
SUB C
JR Z,.found
INC DE
INC DE
DJNZ .loop
; ‡€<E280A1>ˆœ <20><20>€‰„…<E2809E>
; „®áâ ñ¬ ¯®«®¦¥­¨¥ ¢ OLD_TABLES.DEVICE
POP HL
; „®áâ ñ¬ è £ ®¡é¥£® 横«  ¤«ï ¯®«ã祭¨ï «®£.­®¬¥à  ¤à ©¢  ¢ KILL_FM
POP BC
PUSH BC
; ƒà®å ¥¬ ”Œ ¨ § ¯¨áì ¢ OLD_TABLES.DEVICE
CALL KILL_FM
; £à®å ¥¬ ¢ áâ à®© RAMDTBL íâ®â ¤à ©¢
EX DE,HL
.cur_drv+1:
LD HL,0
LD (HL),#FF
DEC HL
LD (HL),#FF
EX DE,HL
JP ReScanDRV.nextN2
;
.found: DEC A
; § â¨à ¥¬ ¢ ­®¢®© â ¡«¨æ¥ ᮢ¯ ¢è¨© ¤à ©¢ (ç⮡ «¥£ç¥ ¡ë«® ¯ àá¨âì ®á⠢襥áï)
LD (DE),A
DEC DE
LD (DE),A
JP ReScanDRV.nextN
;-----[]
HARD_DRV:
LD L,B
LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV
LD IX,LOGDRV
LD DE,LOGDRV.TBL_Entry
LD B,DSS_MAX_DRIVES_AMOUNT
;
.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER)
;CP #FF
;JR Z,.skip
CP (IX+LOGDRV.PHISICAL_DRV_NUMBER)
JR NZ,.skip
;
LD A,(IY+LOGDRV.SECTOR_OFFSET)
CP (IX+LOGDRV.SECTOR_OFFSET)
JR NZ,.skip
LD A,(IY+LOGDRV.SECTOR_OFFSET+1)
CP (IX+LOGDRV.SECTOR_OFFSET+1)
JR NZ,.skip
LD A,(IY+LOGDRV.SECTOR_OFFSET+2)
CP (IX+LOGDRV.SECTOR_OFFSET+2)
JR NZ,.skip
LD A,(IY+LOGDRV.SECTOR_OFFSET+3)
CP (IX+LOGDRV.SECTOR_OFFSET+3)
JR NZ,.skip
LD A,(IY+LOGDRV.SIZE_IN_SECTORS)
CP (IX+LOGDRV.SIZE_IN_SECTORS)
JR NZ,.skip
LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1)
CP (IX+LOGDRV.SIZE_IN_SECTORS+1)
JR NZ,.skip
LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2)
CP (IX+LOGDRV.SIZE_IN_SECTORS+2)
JR NZ,.skip
LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3)
CP (IX+LOGDRV.SIZE_IN_SECTORS+3)
JR Z,.found
;
.skip: ADD IX,DE
DJNZ .loop
; ‡€<E280A1>ˆœ <20><20>€‰„…<E2809E>
; ƒà®å ¥¬ áâ àãî § ¯¨áì ¢ OLD_TABLES.LOGDRV
LD A,#FF
LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A
; „®áâ ñ¬ ¯®«®¦¥­¨¥ ¢ OLD_TABLES.DEVICE
POP HL
; „®áâ ñ¬ è £ ®¡é¥£® 横«  ¤«ï ¯®«ã祭¨ï «®£.­®¬¥à  ¤à ©¢  ¢ KILL_FM
POP BC
PUSH BC
; ƒà®å ¥¬ ”Œ ¨ § ¯¨áì ¢ OLD_TABLES.DEVICE
CALL KILL_FM
;
JP ReScanDRV.nextN2
;
.found: ; § â¨à ¥¬ ¢ ­®¢®© â ¡«¨æ¥ ᮢ¯ ¢è¨© ¤à ©¢ (ç⮡ «¥£ç¥ ¡ë«® ¯ àá¨âì ®á⠢襥áï)
LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF
JP ReScanDRV.nextN
;
; CD_ROM:
; JP ReScanDRV.nextN
;-----[]
; ‚•Ž„: HL - ⥪ãé ï § ¯¨áì ¢ â ¡«¨æ¥ DEVICE
; B - è £ ®¡é¥£® 横« 
KILL_FM:;
LD A,DSS_MAX_DRIVES_AMOUNT
SUB B
LD C,A
; ¢â몠¥¬ áâà ­¨æã ï¤à  á â ¡«¨æ¥© ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
PUSH BC
LD A,(PORTAL.out_DRV.RETBANK)
LD B,A
LD C,SLOT3
IN A,(SLOT3)
OUT (C),B
POP BC
PUSH AF
; ˜¥àá⨬ ¬ ­¨¯ã«ïâ®àë ­  ­ «¨ç¨¥ ¢ ­¨å £à®å­ã⮣® ¤à ©¢ 
LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size
LD B,FMCOUNT - 1 ; ¯à®¯ã᪠¥¬ á«ã¦¥¡­ë© ­ã«¥¢®© ¬ ­¨¯ã«ïâ®à
LD DE,CORE_BUFFERS.FM_BUF.Size
.loop_fm:
ADD IY,DE
LD A,(IY+_sFM.DRIVE)
CP C
JR NZ,.skip
XOR A
LD (IY+_sFM.FS_REC.NAME),A ; £à®å ¥¬ ¬ ­¨¯ã«ïâ®à
.skip: DJNZ .loop_fm
;
POP AF
OUT (SLOT3),A
;
; £à®å ¥¬ ¢ OLD_TABLES.DEVICE 㡨âë© ¤à ©¢
LD (HL),#FF
;
RET
ENDMODULE
;-----------------------[]
/*
[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526
; «®£¨ç¥áª¨© ­®¬¥à ãáâனá⢠ +  ¤à¥á ®¡à ¡®â稪 .
; <20>®à浪®¢ë© ­®¬¥à * 3 = ¡ãª¢  ¤¨áª  + "A"
DEVICE EQU $
.TBL_Entry EQU 3
.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; ¤«ï á⮯-¡ ©â  #FF
.Size EQU .End - $
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO
;+13 WORD FREE
;+15 BYTE FREE
; ‹®£¨ç¥áª¨© ­®¬¥à à §¤¥« .
;<3B>®¬¥à £à㯯ë = «®£¨ç¥áª¨© ­®¬¥à à §¤¥«  HDD ¨§ DEVICE
LOGDRV EQU DEVICE + DEVICE.Size
.TBL_Entry EQU 16
.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID
RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size
.TBL_Entry EQU 2
.Size EQU .TBL_Entry * MAX_RAMDRIVES
*/

View File

@ -0,0 +1,417 @@
; Disk Driver Specification ver. 2.00
;[]===========================================================[0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[3]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[7]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[8]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
; R_COM EQU #0F ;Command/Status
; R_TRK EQU #3F ;Track
; R_SEC EQU #5F ;Sector
; R_DAT EQU #7F ;Data
; R_DSK EQU #FF ;Drive Control
; COM_B EQU #1B
////////////////////////////////////////////////////////////////////////
MODULE FDD_DRV
////////////////////////////////////////////////////////////////////////
;-------------------------------------------------
; Ž¡à ¡®â稪 FDD (rst 18h)
;-------------------------------------------------
API_TABLE: INC C
DEC C
JP Z,Init ;#00 Init
DEC C
JP Z,Open ;#01 Open
DEC C
JP Z,Close ;#02 Close
DEC C
JP Z,MediaCheck ;#03 MediaCheck
DEC C
JP Z,GetBPB ;#04 GetBPB
DEC C
JP Z,Read ;#05 Read
DEC C
JP Z,Write ;#06 Write
DEC C
JP Z,Removable ;#07 Removable
DEC C
JP Z,GenIOCTL ;#08 GenIOCTL
DEC C
JP Z,Reserved ;#09
;
Reserved: LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Commands for restart #18 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
Init: LD A,2 ;ª®«¨ç¥á⢮ FDD ¢ ª®¬¯¥ ;!FIXIT   ¥á«¨ ®âª«îçã ¢ <20>ˆŽ?
AND A
RET
; ; ;
;
Open: LD C,BIOS.DRV_RESET
RST ToBIOS
RET
; ; ;
;
Close: XOR A
RET
; ; ;
;!FIXIT ¯à®¢¥àïâì ƒ93 ª®£¤  íâ® áâ ­¥â ¢®§¬®¦­ë¬
MediaCheck: IF NON_REMOVABLE_FDD
XOR A
ELSE
LD A,#FF
OR A
ENDIF
RET
; ; ;
;DE - ADDRESS
GetBPB: LD IX,0
LD HL,0
PUSH DE
PUSH AF
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP DE
POP HL
RET C
LD BC,BOOT_SECTOR.SectorsPerTrack
ADD HL,BC
LD E,(HL)
PUSH DE
LD A,D
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD C,BIOS.DRV_SET_PAR
RST ToBIOS
XOR A
RET
; ; ;
; !TODO read track?
;READTR: XOR A
; RET
; ; ;
;
Read: LD C,BIOS.DRV_READ
RST ToBIOS
RET
; ; ;
;
Write: LD C,BIOS.DRV_WRITE
RST ToBIOS
RET
; ; ;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
GenIOCTL: BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.GetParams
;!TODO
;DEC B
;JP Z,.ReadTrack
;DEC B
;JP Z,.TestTRK
;
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
.O_CTL_F: RES 7,B
INC B
DEC B
JP Z,.SetParams
;!TODO
;DEC B
;JP Z,.WriteTRK
;DEC B
;JP Z,.FormatTRK
;
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; ; ;
; ‚室: - A - Drive number
; ‚ë室:
; HL:DE - SECTORS ON LOGICAL DISK
; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D1..D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.GetParams: EX DE,HL
LD BC,#55AA
AND #0F
SBC HL,BC
JR Z,.next
;
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
;
.next: PUSH AF
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
JR C,.NONE_FDD
PUSH HL
PUSH DE
LD A,H
LD H,0
;
.mull_loop1: ADD HL,HL
DEC A
JR NZ,.mull_loop1
;
; HL - SECTOR PER CYLLINDER
; A=0 ZF=0 CF=0
LD B,H
LD C,L
;LD HL,0
;XOR A
LD H,A
LD L,A
EX AF,AF'
;
.mull_loop2: EX AF,AF'
ADD HL,BC
ADC A,0
DEC DE
EX AF,AF'
LD A,D
OR E
JR NZ,.mull_loop2
;
; A=0 DE=0 ZF=0 CF=0
EX AF,AF'
LD E,A
EX DE,HL
; H=0
LD C,H ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
EXX
POP DE
POP HL
POP AF
EX AF,AF'
; A=0 ZF=0 CF=0
LD B,0
LD C,L
LD L,H
LD H,B
EX DE,HL
EXX
AND A
RET
;
.NONE_FDD: POP BC
LD A,DSS_Error.drv.INVALID_DRIVE
; CF=1
RET
; ; ;
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.SetParams: PUSH AF
EXX
EX DE,HL
LD H,L
LD L,C
POP AF
AND #0F
PUSH AF
PUSH HL
PUSH DE
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP DE
POP HL
JR C,.NONE_FDD
POP AF
LD C,BIOS.DRV_SET_PAR
JP ToBIOS
;RST ToBIOS
;RET C
;AND A
;RET
; ; ;
Removable: ; LD A,1
; AND A
XOR A
INC A
RET
; ; ;
;==============================================
ENDMODULE ; FDD_DRV
////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,715 @@
;!TODO ¯à¨¢¥á⨠ª ®¡é¥¬ã ¢¨¤ã ¢ ®¤­ã ¨­áâàãªæ¨î, ¯à®¢¥à¨âì ª®à४⭮áâì
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 06-08-2001 DNS Secondary IDE
;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk
;---------------------------------------------------------------
;
; Disk Driver Specification ver. 2.20
;[]===========================================================[0]
;Procedure: Initialization
;
;Function: Initialization device(s)
;
;Input: C = #00
; IX = Environment
;
;Output: A = Amount drive support
;[]===========================================================[0]
;[]===========================================================[1]
;Procedure: Open
;
;Function: Open disk
;
;Input: C = #01
; A = Drive
;
;Output: None
;[]===========================================================[1]
;[]===========================================================[2]
;Procedure: Close
;
;Function: Close disk
;
;Input: C = #02
; A = Drive
;
;Output: None
;[]===========================================================[2]
;[]===========================================================[3]
;Procedure: Media check
;
;Function: Checking change line
;
;Input: C = #03
; A = Drive
;
;Output: A = #00 disk no changed
; #FF disk changed
;[]===========================================================[3]
;[]===========================================================[4]
;Procedure: Get BPB
;
;Function: Get Block Parameters BIOS
;
;Input: C = #04
; A = Drive
; DE = Address
;
;Output: None
;[]===========================================================[4]
;[]===========================================================[5]
;Procedure: Read
;
;Function: Read from disk
;
;Input: C = #05
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A = Drive
;
;Output: None
;[]===========================================================[5]
;[]===========================================================[6]
;Procedure: Write
;
;Function: Write to disk
;
;Input: C = #06
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
;
;Output: None
;[]===========================================================[6]
;[]===========================================================[7]
;Procedure: Removable
;
;Function: Checking change line
;
;Input: C = #07
; A = Drive
;
;Output: A = #00 Removable
; A = #FF Non-removable
;[]===========================================================[7]
;[]===========================================================[8]
;Procedure: Generic IOCTL
;
;Function: Generic Input Output Control
;
;Input: C = #08
; B = Subcommand
; DE = #55AA Magic Number
; A = Drive
;
;Subcommands: #00 - Get Device Parameters
; #01 - Read track
; #02 - Test track
; #80 - Set Device Parameters
; #81 - Write track
; #82 - Format track
;Output:
;[]===========================================================[8]
;[]===========================================================[9]
;Procedure: Read Long
;
;Function: Reading sectors from disk
;
;Input: C = #0A
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[9]
;[]===========================================================[10]
;Procedure: Write Long
;
;Function: Writing sectors to disk
;
;Input: C = #0B
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[10]
;
; Errors:
; 0 (#00) - NO ERRORS
; 1 (#01) - BAD COMMAND
; 2 (#02) - BAD DRIVE NUMBER
; 3 (#03) - UNKNOW FORMAT
; 4 (#04) - NOT READY
; 5 (#05) - SEEK ERROR
; 6 (#06) - SECTOR NOT FOUND
; 7 (#07) - CRC ERROR
; 8 (#08) - WRITE PROTECT
; 9 (#09) - READ ERROR
; 10 (#0A) - WRITE ERROR
; 11 (#0B) - FAILURE
; 12 (#0C) - BUSY (DEVICE OPENED)
; 13 (#0D) - RESERVED
; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8
PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR
HDDRIVE: INC C
DEC C
JP Z,INIT_H ; c=0 Initialization
DEC C
JP Z,RESE_H ; c=1 open
DEC C
JP Z,STAT_H ; c=2 close
DEC C
JP Z,CHEK_H ; c=3 media check (ᬥ­  ­®á¨â¥«ï)
DEC C
JP Z,GBPB_H ; c=4 get BPB
DEC C
JP Z,READH ; c=5 read (ç⥭¨¥ ᥪâ®à®¢)
DEC C
JP Z,WRITEH ; c=6 write (§ ¯¨áì ᥪâ®à®¢)
DEC C
JP Z,REMOV_H ; c=7 Removable
DEC C
JP Z,IOCTL_H ; c=8 ã§­ âì £¥®¬¥âà¨î ¤¨áª  Generic IOCTL
DEC C
JP Z,.Reserved ; c=9 Reserved
DEC C
JP Z,LREADH ; c=10 Read Long
DEC C
JP Z,LWRITEH ; c=11 Write Long
;
.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
////////////////////////////////////////////////////////////////////////
// Commands for restart #18 //
////////////////////////////////////////////////////////////////////////
;--------------------------------------------------------------------[v]
; c=0 Initialization
INIT_H: PUSH IY
;!TEST ;[ ] ¤«ï rescanDRV
XOR A
LD (DRVCLC.count),A
;
LD HL,LOGDRV
LD (OFFSECT),HL
LD IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST
RST ToBIOS
; DRV_LIST:
; +0 LEN
; +1 FDD COUNT
; +2 HDD COUNT
; +3 CDROM COUNT
; +4 RESERVED (28)
;
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
XOR A
LD B,(IX+2) ;ª®«¨ç¥á⢮ HDD ¤«ï ¯à®æ¥¤ãàë NX_DVCI
CP B
LD A,C
OUT (SLOT3),A
JR Z,NO_HARDS
LD C,#80 ;!HARDCODE - ID ¢¨­â  ¤«ï ¯à®æ¥¤ãàë BIOS.DRV_DETECT
NX_DVCI: PUSH BC
LD A,C
LD (DRV_NUM),A
LD C,BIOS.DRV_DETECT
RST ToBIOS
;JR C,.NO_DRIVE
CALL NC,DEFINE_PARTITIONS.BEGIN
POP BC
INC C
JR C,NX_DVCI
DJNZ NX_DVCI
;
NO_HARDS:
POP IY
;!TEST
; LD HL,(OFFSECT)
; LD DE,LOGDRV
; XOR A
; SBC HL,DE
; RET Z
; LD DE,LOGDRV.TBL_Entry
DRVCLC: ; INC A
; SBC HL,DE
; JR NZ,DRVCLC
;
.count+1: LD A,0
;
AND A
RET
;---------------------------------------------------------------------[^]
; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
; ;+01 DWORD SECTOR OFFSET
; ;+05 DWORD SIZE IN SECTORS
; ;+09 FREE
; ;+15
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0
; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV
SELHDD: PUSH DE
PUSH HL
;
LD L,A
LOGDRV_ENTRY_FIND LOGDRV
; !HARDCODE
LD E,(IY+1)
LD D,(IY+2)
ADD IX,DE
LD E,(IY+3)
LD D,(IY+4)
POP HL
ADC HL,DE
LD A,(IY+0) ;DRIVE NUMBER
POP DE
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_H BIT 7,B
JR NZ,O_CTL_H
INC B
DEC B
JP Z,HGETPRM
DEC B
JP Z,HRDTRAC
DEC B
JP Z,HCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
O_CTL_H RES 7,B
INC B
DEC B
JP Z,HSETPRM
DEC B
JP Z,HWRTRAC
DEC B
JP Z,HFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HCHTRAC LD B,L
CALL CHECKH
RET
HSETPRM AND A
RET
HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - DRIVE/HEAD REGISTER PHISICAL DISK:
; bit7 - reserved "1"
; bit6 - ADDRESSING MODE LBA/CHS
; bit5 - reserved "1"
; bit4 - DEVICE MASTER/SLAVE
; bit3 - reserved "0" (MAY BE OTHER)
; bit2 - reserved "0" (MAY BE OTHER)
; bit1 - reserved "0" (MAY BE OTHER)
; bit0 - Primary/Secondary Chanel
HGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
;
PUSH IX
PUSH IY
;
LOGDRV_ENTRY_FIND LOGDRV
;
LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
PUSH IY
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
LD A,DSS_Error.drv.INVALID_DRIVE
JR C,.error
; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â BIOS
EX DE,HL
LD C,E
LD E,D
LD D,0
LD A,B
LD B,D
EXX
; SECTORS ON LOGICAL DISK
LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0)
LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1)
LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2)
LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3)
;
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; ­®¬¥à ¯ àâ¨æ¨¨ ¢ MBR ¤¨áª 
;
EX AF,AF'
LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
EX AF,AF'
;
AND A
.error: POP IY
POP IX
RET
REMOV_H:
LD A,1
AND A
RET
RESE_H: XOR A
RET
STAT_H: XOR A
RET
CHEK_H: ;LD A,#FF
XOR A
;AND A
RET
; DE - ADDRESS
; A - DRIVE
GBPB_H: PUSH IY
PUSH DE
LD L,A
;
LOGDRV_ENTRY_FIND LOGDRV
; !HARDCODE
LD E,(IY+1)
LD D,(IY+2)
LD L,(IY+3)
LD H,(IY+4)
LD XL,E
LD XH,D
LD A,(IY+0)
POP DE
POP IY
LD BC,1*256 + BIOS.DRV_READ
JP ToBIOS
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;READ SECTOR
LREADH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;WRITE SECTOR
LWRITEH:
PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;WRITE SECTOR
WRITEH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;READ SECTOR
READH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;CHECK SECTOR
CHECKH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_VERIFY
RST ToBIOS
POP IY
RET
;------------------------------[ PARTIT ]------------------------------;
DEFINE_PARTITIONS:
.FAT32_DOS: ;
.EASYDOS: ;
.MEDIDOS: ;
.HIGHDOS: ;
LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3)
LD IX,(CURRENT_SECTOR_L)
ADD IX,DE
LD DE,(CURRENT_SECTOR_H)
ADC HL,DE
LD D,XH
LD E,XL
;BPB SECTOR
LD IX,(OFFSECT)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),E
LD (IX + LOGDRV.SECTOR_OFFSET + 1),D
LD (IX + LOGDRV.SECTOR_OFFSET + 2),L
LD (IX + LOGDRV.SECTOR_OFFSET + 3),H
LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3)
;SIZE DISK
LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.ExtendedPartitionFlag+1:
LD A,0
OR A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
LD A,#FF
JR NZ,.not_supported ; ¥á«¨ à áè¨à¥­­ë© à §¤¥«, â® ®¡«®¬
;
POP BC
PUSH BC
LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
SUB B
.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A
;
;!TEST <09>®¤áâà å®¢ª  ®â ¯¥à¥¯®«­¥­¨ï â ¡«¨æë LOGDRV
LD A,(DRVCLC.count)
INC A
CP DSS_MAX_DRIVES_AMOUNT+1
RET NC
LD (DRVCLC.count),A
;
LD A,(DRV_NUM)
LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
LD DE,LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE
LD (OFFSECT),IX
JP .NextPartition
;
.NotExtended: CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_32Mb
JR Z,.MEDIDOS
CP PartitionSysTypes.FAT12
JR Z,.EASYDOS
;[ ] fat32
CP PartitionSysTypes.FAT32
JP Z,.FAT32_DOS
CP PartitionSysTypes.FAT32_LBA
JP Z,.FAT32_DOS
;
CP PartitionSysTypes.Win_Ext_LBA
JR Z,.SubLevel
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ 
;OR A ;PartitionSysTypes.Empty
;JR NZ,NXTPART
JR .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;POP BC ; ¡ « ­á á⥪ 
;RET
;POP BC
;OR A
;RET Z
;NODEFIN:
;SCF
;RET
;
.BEGIN: IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
CALL .Start
POP AF
OUT (SLOT3),A
RET
.Start: LD IX,0
LD DE,0
LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01
;
.LOOP: LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),IX
CALL .LOAD_SECTOR
;
LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
;JR NZ,NODEFIN
SCF
RET NZ
;
LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR
LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
.DOSAGA: PUSH BC
LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
CP PartitionSysTypes.Extended
JR Z,.SubLevel
CP PartitionSysTypes.Win_Ext_LBA
JR NZ,.NotExtended
;
.SubLevel: PUSH IY
LD DE,(CURRENT_SECTOR_L)
LD IX,(CURRENT_SECTOR_H)
PUSH DE
PUSH IX
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
LD A,(.ExtendedPartitionFlag)
INC A
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
CALL .ParseExtended
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
LD A,(.ExtendedPartitionFlag)
DEC A
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
POP IX
POP DE
LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),IX
CALL .LOAD_SECTOR
POP IY
.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
ADD IY,DE
POP BC
DJNZ .DOSAGA
AND A
RET
;
.ParseExtended: LD HL,(EXTDOSL)
LD DE,(EXTDOSH)
LD A,L
OR H
OR E
OR D
LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
JP NZ,.ext_in_ext
LD (EXTDOSL),DE
LD (EXTDOSH),HL
PUSH DE
JR .set_regs
;
.ext_in_ext: LD IX,(EXTDOSL)
ADD IX,DE
LD DE,(EXTDOSH)
ADC HL,DE
PUSH IX
.set_regs: PUSH HL
POP IX
POP DE
JP .LOOP
;
.LOAD_SECTOR: PUSH IY
LD IX,(CURRENT_SECTOR_L)
LD HL,(CURRENT_SECTOR_H)
LD DE,PARTITION_BUFFER
LD A,(DRV_NUM)
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP IY
RET
;----------------------------------------------------------------------;
;
;=======================================================================
; PHISICAL DRIVE NUMBER
; #80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢
DRV_NUM: DB #00
CURRENT_SECTOR_L: DW #0000
CURRENT_SECTOR_H: DW #0000
EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE
EXTDOSH: DW #0000
OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================================

View File

@ -0,0 +1,533 @@
; SYSPAGE EQU #FE
; SLOT1 EQU #A2
; SLOT2 EQU #C2
; SLOT3 EQU #E2
; ORG #3CDB
; Disk Driver Specification ver. 2.20
;[]===========================================================[ 0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[ 0]
;[]===========================================================[ 1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[ 1]
;[]===========================================================[ 2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[ 2]
;[]===========================================================[ 3]
;!TODO
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[ 3]
;[]===========================================================[ 4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[ 4]
;[]===========================================================[ 5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 5]
;[]===========================================================[ 6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 6]
;[]===========================================================[ 7]
;!TODO
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[ 7]
;[]===========================================================[ 8]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[ 8]
;[]===========================================================[ 9]
; RESERVED
;[]===========================================================[ 9]
;[]===========================================================[ 10]
;!TODO
;Procedure : Read Long
;
;Function : Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 10]
;[]===========================================================[ 11]
;!TODO
;Procedure : Write Long
;
;Function : Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 11]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
; MACRO CALL GET_RAMDRV_NUM
; LD BC,RAMDTBL
; SLA A
; ADD A,C
; LD C,A
; LD A,0
; ADC A,B
; LD B,A
; INC BC
; LD A,(BC)
; OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
; ENDM
; parser
RMDRIVE: INC C
DEC C
JP Z,INIT_RD ; 0
DEC C
JR Z,RESET_RD ; 1
DEC C
JR Z,STATUS_RD ; 2
DEC C
JR Z,CHEK_RD ; 3
DEC C
JR Z,GBPB_RD ; 4
DEC C
JR Z,READ_RD ; 5
DEC C
JR Z,WRITE_RD ; 6
DEC C
JR Z,REMOV_RD ; 7
DEC C
JP Z,IOCTL_RD ; 8
DEC C
JP Z,.error ; 9 RESR_H
DEC C
JP Z,LREAD_RD ; 10
DEC C
JP Z,LWRITE_RD ; 11
.error:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
REMOV_RD:
RESET_RD:
STATUS_RD: XOR A
RET
;!FIXIT ᤥ« âì ¢ SYS_PAGE ¤«ï à ¬¤¨áª®¢ ¯¥à¥¬¥­­ë¥ ¨ ¡à âì ®ââ㤠 §­ ç¥­¨¥
;!FIXIT ª ª-â® ®¯à¥¤¥«ïâì ᬥ­ã RMD?
; [x] 18/08/2024 ¯®ª  ­¥¬­®£® ª®áâë«ì­® ¨ ®¯ á­®
CHEK_RD: ;LD A,#FF
;AND A
XOR A
;
RET
;DE - ADDRESS
GBPB_RD: LD IX,0
LD HL,0
LD B,#01
;JP READ_RD
;READ SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
READ_RD: PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_READ
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LREAD_RD:
PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_READ_LONG
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
;WRITE SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
WRITE_RD:
PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_WRITE
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LWRITE_RD:
PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_WRITE_LONG
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
;
;;
;;;
;----------------------------------------------------------------------;!TEST
; ;S_P_P DB #00
; INIT_RD:
; ; .SectorSize EQU 512 ;!HARDCODE
; ; LD HL,.SectorSize
; ; LD A,#80
; ; .loop: SRL A
; ; RR H
; ; JR NC,.loop
; ; LD (S_P_P),A
; LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
; LD DE,RAMDTBL
; .initLoop:
; PUSH BC
; LD A,B
; PUSH DE
; RST ToBIOS
; POP DE
; OR A
; JR Z,.noDRV
; LD (DE),A
; INC DE
; POP BC
; LD A,B
; LD (DE),A
; INC DE
; JP 1F
; .noDRV: POP BC
; 1: INC B
; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry
; CP B
; JR NZ,.initLoop
; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL
; EX DE,HL
; AND A ;!FIXIT ----
; SBC HL,DE ;!FIXIT ADD HL,DE
; SRL L
; LD A,L
; ; LD HL,ENDDRVR
; AND A
; RET
;----------------------------------------------------------------------;!TEST
;;;
;;
;
;
;;
;;;
;----------------------------------------------------------------------;!TEST
;S_P_P DB #00
INIT_RD:
; .SectorSize EQU 512 ;!HARDCODE
; LD HL,.SectorSize
; LD A,#80
; .loop: SRL A
; RR H
; JR NC,.loop
; LD (S_P_P),A
LD BC,0*256+BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
LD DE,RAMDTBL
.initLoop: PUSH BC
LD A,B
PUSH DE
RST ToBIOS
POP DE
OR A
JR Z,.noDRV
;
INC DE
LD (DE),A
DEC DE
;
POP BC
LD A,B
LD (DE),A
INC DE
INC DE
JP .skip_pop
;
.noDRV: POP BC
.skip_pop: INC B
LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry
CP B
JR NZ,.initLoop
LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL
EX DE,HL
AND A ;!FIXIT ----
SBC HL,DE ;!FIXIT ADD HL,DE
SRL L
LD A,L
; LD HL,ENDDRVR
AND A
RET
;----------------------------------------------------------------------;!TEST
;;;
;;
;
; ;
; ; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
; RAMDTBL.TBL_Entry EQU 2
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
; DB #FF
; EDUP
; .Size EQU $-RAMDTBL
; ;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_RD:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.RGETPRM
;DEC B
;JP Z,FRDTRAC
;DEC B
;JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F: ;RES 7,B
;INC B
;DEC B
;JP Z,.RSETPRM
;DEC B
;JP Z,FWRTRAC
;DEC B
;JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.RGETPRM: EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
;
EX AF,AF'
LD A,L
CALL GET_RAMDRV_NUM
PUSH AF
PUSH AF
EX AF,AF'
POP AF
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
PUSH HL ;ç¨á«® £®«®¢®ª, ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
PUSH DE ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
EXX
POP HL ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
POP BC ;ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
LD D,0
LD E,B ;ç¨á«® £®«®¢®ª
LD B,D
EXX
LD A,L
RRA
JR C,.end
.loopShift: SLA E
RL D
RRA
JR NC,.loopShift
;
.end: EX AF,AF'
POP AF
EX AF,AF'
XOR A
LD L,A
LD H,L
LD C,A ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,%10100000
RET
; !TODO
; !FIXIT
; .RSETPRM: AND A
; RET
GET_RAMDRV_NUM: LD BC,RAMDTBL
.skip_tbl: ADD A,A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
;INC BC
LD A,(BC)
OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
RET
;
;ENDDRVR EQU $
;

View File

@ -0,0 +1,290 @@
;[BEGIN]
;//MODULE: Shared AUTHOR: Denis Parinov
;//CREATE: A LONG TIME AGO :)
;---------------------------------------------------------------
;Rev Date Name Description
;R01 17-04-2023 BAO „®¡ ¢«¥­  ¯à®æ¥¤ãà  INITDVC_RET_DRIVE ¨ ¨§¬¥­¥­  INTDISK ¤«ï ¯®¤¤¥à¦ª¨ à¥áª ­  ¤à ©¢®¢
;---------------------------------------------------------------
; DISK DRIVER SPECIFICATION
; !FIXIT ­¥ª®à४⭠ï!
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;
; INPUT: A - DRIVE LETTER
; IX - ENVIRONMENT
; RETURN: A - AMOUNT DRIVE SUPPORT
; HL - LENGTH DRIVER
;---------------------------------------------
; COMMAND 01h (OPEN)
;
; INPUT: A - DRIVE
;
;---------------------------------------------
; COMMAND 02h (CLOSE)
;
; INPUT: A - DRIVE
; RETURN: A -
;---------------------------------------------
; COMMAND 03h (MEDIA CHECK)
;
; INPUT: A - DRIVE
; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK
;---------------------------------------------
; COMMAND 04h (GET BPB)
;
; INPUT: HL - ADDRESS
; A - DRIVE
;---------------------------------------------
; COMMAND 05h (INPUT)
;
; INPUT: IX:DE - ABSOLUTE SECTOR
; HL - MEMORY ADDRESS
; B - SECTORS COUNT
; A - DRIVE
;---------------------------------------------
; COMMAND 06h (OUTPUT)
;
; INPUT: IX:DE - ABSOLUTE SECTOR
; HL - MEMORY ADDRESS
; B - SECTORS COUNT
; A - DRIVE
;---------------------------------------------
; COMMAND 07h (REMOVABLE)
;
; INPUT: A - DRIVE
; RETURN: A = 0 - REMOVABLE
; A = 1 - NONREMOVABLE
;---------------------------------------------
; COMMAND 08h (GENERIC IOCTL)
;
; INPUT: A - DRIVE
; B - SUBCOMMAND
; DE - MAGIC NUMBER (55AAh)
; SUBCOMMAND
;----------------------
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
;---------------------------------------------
;
; ERRORS:
; 0 - NO ERRORS
; 1 - BAD COMMAND
; 2 - BAD DRIVE NUMBER
; 3 - UNKNOW FORMAT
; 4 - NOT READY
; 5 - SEEK ERROR
; 6 - SECTOR NOT FOUND
; 7 - CRC ERROR
; 8 - WRITE PROTECT
; 9 - READ ERROR
; 10 - WRITE ERROR
; 11 - FAILURE
; 12 - BUSY (DEVICE OPENED)
; 13 - RESERVED
;INTDISK PUSH HL
; PUSH BC
; LD HL,DEVICE
; INC A
;INTD001 DEC A
; JP Z,YEP
; LD C,(HL)
; INC C
; INC HL
; INC HL
; INC HL
; JP NZ,INTD001
; POP BC
; POP HL
; LD A,2
; SCF
; RET
;YEP LD A,(HL)
; INC HL
; LD C,(HL)
; INC HL
; LD H,(HL)
; LD L,C
; POP BC
; EX (SP),HL
; RET
;-----------------------------------------------------------
; <20>à®áª ­¨à®¢ âì á¨á⥬㠭  FDD/HDD ¤¥¢ ©áë ¨ RAM-¤¨áª¨
;-----------------------------------------------------------
INITDVC: XOR A
LD (DRV_PAGE.LDRIVE),A ; á¡à. ï祩ªã
LD HL,DEVICE
LD (PDEVICE),HL ; ¢®ááâ. ï祩ªã
; ‡ ç¨á⪠ â ¡«¨æ. <20>¥®¡ï§ â¥«ì­®, ­® ¬ «® «¨ çñ ¡ã¤¥â ¤ «ìè¥... ;[ ]
LD HL,DEVICE
LD (HL),#FF
LD DE,DEVICE+1
LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1
LDIR
; FDD ¤¥¢ ©áë
CALL FDD_DRV.Init ; ã§­ âì ç¨á«® FDD-¤¥¢ ©á®¢
LD DE,FDD_DRV.API_TABLE ;  ¤à¥á ®¡à ¡®â稪  ⥪. ¤¥¢ ©á 
CALL MAKEDVC ; ¨­¨æ. â ¡«¨æã ¯¥à¥å®¤®¢
; HDD ¤¥¢ ©áë
.if_old: CALL INIT_H ; ¥á«¨ ­  áâ à⥠¢¥àá¨ï BIOS ­¥ ¯®¤å®¤¨â, â® £à㧨âìáï ¬®¦­® ⮫쪮 á ¤¨áª¥âë, ¤«ï í⮣® âãâ § ¬¥­  ª®¤  ­  XOR A : RET
LD DE,HDDRIVE
CALL MAKEDVC
; RAM-¤¨áª¨
CALL INIT_RD
LD DE,RMDRIVE
CALL MAKEDVC
XOR A
RET
; ˆ­¨æ¨¨à®¢ âì â ¡«¨æã ¯¥à¥å®¤®¢ ¤¥¢ ©á .
; ¢å®¤: de= ¤à¥á ®¡à ¡®â稪  ¤¥¢ ©á 
; a=ç¨á«® ¤¥¢ ©á®¢ (0=­¥â)
MAKEDVC: LD C,A
LD HL,DRV_PAGE.LDRIVE ; ï祩ª  ­®¬¥à  ¯®á«. ¤¨áª 
ADD A,(HL)
LD (HL),A
;!TEST ;[ ] ®¯â¨¬¨§¨à®¢ âì ¡ë«® «¥­ì
CP DSS_MAX_DRIVES_AMOUNT+1
JR C,1F
LD (HL),DSS_MAX_DRIVES_AMOUNT
SUB DSS_MAX_DRIVES_AMOUNT
NEG
ADD C
JP 2F
;
1: LD A,C
OR A
RET Z ; ­¥â ¤¥¢ ©á®¢
2: LD C,0 ; á¡à.
LD HL,(PDEVICE) ; ⥪. ¯®«®¦. ¢ â ¡«¨æ¥
.loop: LD (HL),C ; ­®¬¥à «®£.¤à ©¢  í⮣® ãáâனá⢠
INC HL
LD (HL),E ; de= ¤à¥á ®¡à ¡®â稪 
INC HL
LD (HL),D
INC HL
INC C ; ++­®¬¥à ¤à ©¢ 
DEC A
JR NZ,.loop
LD (PDEVICE),HL
DEC A
LD (HL),A
RET
;!FIXIT ¯®¯¥à¥¤¥«ë¢ âì âã⠢맮¢ë ç¥à¥§ â®çª¨ ¢å®¤  ⨯  RST ¨«¨ ¢ë§®¢ë ⨯  LD C,0 : CALL HDDRIVE ­  ¯àï¬ë¥
;-------------------------------------------------
; RST 18h. ‚¥ªâ®à ¤¨áª®¢ëå ãáâனáâ¢
; ¢å®¤: a=­®¬¥à ãáâனá⢠ (0-25)
;-------------------------------------------------
INTDISK:
;R01
CP #FF
JR NZ,.noNeedRescan
CP C
;JR Z,INITDVC_RET_DRIVE
JR Z,ReScanDRV
.noNeedRescan:
;
PUSH HL
PUSH BC
_CALC_DEVICE_ENTRY DEVICE
LD A,(HL)
CP #FF
JR Z,NODEV
INC HL
LD C,(HL)
INC HL
LD H,(HL)
LD L,C
POP BC
EX (SP),HL
RET
NODEV: POP BC
POP HL
LD A,DSS_Error.drv.INVALID_DRIVE
SCF
RET
PDEVICE DW DEVICE
; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
; .Size: DB #FF
; .TBL_Entry EQU 3
FLOPPY EQU #0001
FIXED EQU #0002
CDROM EQU #0004
NETWORK EQU #0008
;DISKS: DB 27 ;LENGTH DISK INFO
; DW FLOPPY ;DISK TYPE
; DB 2,"A:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT12 "
; DB #00 ;PHISICAL DRIVE NUMBER
;
; DB 27 ;LENGTH DISK INFO
; DW FLOPPY ;DISK TYPE
; DB 2,"B:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT12 "
; DB #01 ;PHISICAL DRIVE NUMBER
;
; DB 27 ;LENGTH DISK INFO
; DW FIXED ;DISK TYPE
; DB 2,"C:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT16 "
; DB #80 ;PHISICAL DRIVE NUMBER
;
; DB #00 ;END OF TABLE
;-----------------------------------------------------------------------
;R01
; INITDVC_RET_DRIVE:
; CALL INITDVC
; LD A,(DRV_PAGE.LDRIVE)
; AND A
; RET
;
////////////////////////////////////////////////////////////////////////
// NEW RESCAN //
////////////////////////////////////////////////////////////////////////
INCLUDE 'ReScanDRV.ASM'
////////////////////////////////////////////////////////////////////////
;DEVICE DB #00
; DW FDDRIVE ; FDD A
; DB #01
; DW FDDRIVE ; FDD B
; DB #00
; DW HDDRIVE ; HDD C
; DB #01
; DW HDDRIVE ; HDD D
; DB #02
; DW HDDRIVE ; HDD E
; DB #03
; DW HDDRIVE ; HDD F
; DB #04
; DW HDDRIVE ; HDD G
; DB #05
; DW HDDRIVE ; HDD H
; DB #06
; DW HDDRIVE ; HDD I
; DB #07
; DW HDDRIVE ; HDD J
; DB #FF