+ READ_PORTS, * FN_HDD_PART и FN_HDD_INIT переделаны

This commit is contained in:
Anatoliy Belyanskiy 2024-01-27 04:11:34 +10:00
parent 84e81ef7df
commit 832cbf9460
7 changed files with 320 additions and 180 deletions

@ -1 +1 @@
Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673

Binary file not shown.

View File

@ -235,8 +235,8 @@ TAB_FNS:
DB low CMOS_RD ; #F6 DB low CMOS_RD ; #F6
DB low CMOS_WR ; #F7 DB low CMOS_WR ; #F7
DB low SET_PORTS ; #F8 DB low SET_PORTS ; #F8
DB low READ_PORTS ; #F9 !TODO DB low READ_PORTS ; #F9 [x] 26/01/2024
DB low WRITE_PORTS ; #FA !TODO DB low FN_RESERVED ; #FA [x] 26/01/2024 ­¥ à ¡®â «  ¨ ­¥ ­ã¦­ , ¤ã¡«¨àã¥â SET_PORTS
DB low GOTO_SPEC ; #FB Goto Spectrum! DB low GOTO_SPEC ; #FB Goto Spectrum!
DB low FN_RESERVED ; #FC DB low FN_RESERVED ; #FC
DB low REINIT ; #FD DB low REINIT ; #FD
@ -428,7 +428,7 @@ TAB_FNS:
DB high CMOS_WR DB high CMOS_WR
DB high SET_PORTS DB high SET_PORTS
DB high READ_PORTS DB high READ_PORTS
DB high WRITE_PORTS DB high FN_RESERVED
DB high GOTO_SPEC DB high GOTO_SPEC
DB high FN_RESERVED DB high FN_RESERVED
DB high REINIT DB high REINIT

View File

@ -582,72 +582,94 @@ DCP_CONFIG:
;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;
; ;
;----------------------------------------------------------------------;
;[x] 26/01/2024
READ_PORTS:
CALL SET_PORTS.Prepare
LD BC,0
IN B,(C)
JR SET_PORTS.End
;[x] 26/01/2024
; WRITE_PORTS:
; SCF
; RET
;----------------------------------------------------------------------;
; ;
;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;
;[x] ’¥¯¥àì íâ® ­¥ ­ã¦­®: CALL from 3D13h! Žáâ®à®¦­¥¥ á ¯à¥à뢠­¨ï¬¨, «ãçè¥ £ á¨âì, ç⮡ ­¥ ᡨâì ᨣ­ « DOS_ON ;[x] ’¥¯¥àì íâ® ­¥ ­ã¦­®: CALL from 3D13h! Žáâ®à®¦­¥¥ á ¯à¥à뢠­¨ï¬¨, «ãçè¥ £ á¨âì, ç⮡ ­¥ ᡨâì ᨣ­ « DOS_ON
; in: A - ¢­ãâ७­¨© ¯®àâ, B - §­ ç¥­¨¥ ¤«ï § ¯¨á¨ ¢® ¢­ãâ७­¨© ¯®àâ ; in: A - ¢­ãâ७­¨© ¯®àâ, B - §­ ç¥­¨¥ ¤«ï § ¯¨á¨ ¢® ¢­ãâ७­¨© ¯®àâ
; out: B - áâ à®¥ §­ ç¥­¨¥ ¢­ãâ७­¥£® ¯®àâ ; <20>¥à¥¤ ¢ë室®¬ ¢®ááâ ­ ¢«¨¢ ¥âáï ª®­ä  ¯à®¯¨á ­­ ï ¢ CONFIG_DE. ; out: B - áâ à®¥ §­ ç¥­¨¥ ¢­ãâ७­¥£® ¯®àâ ; <20>¥à¥¤ ¢ë室®¬ ¢®ááâ ­ ¢«¨¢ ¥âáï ª®­ä  ¯à®¯¨á ­­ ï ¢ CONFIG_DE.
SET_PORTS: SET_PORTS:
EX AF,AF' CALL .Prepare
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
AND A
LD A,R
PUSH AF
DI
CALL DOS_ON
;
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD C,SLOT2 ; ¯®«ãç¨âì áâà ­¨æã
IN D,(C)
;
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (C),A
;
LD A,(#8000) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(#8200)
LD H,A
EX AF,AF' ; áâà ­¨æ 
; ;
LD (#8000),A ; ãáâ ­®¢¨âì ¢­ãâ७­¨© ¯®àâ EX AF,AF'
LD (#8200),A LD A,B
LD BC,0
EX AF,AF'
; ;
EX AF,AF' ; —⥭¨¥ ¯®àâ 
LD A,B IN A,(C)
LD BC,0 ; ‡ ¯¨áì ¯®àâ 
EX AF,AF' EX AF,AF'
OUT (C),A ; ãáâ ­®¢¨âì ­®¢®¥ §­ ç¥­¨¥ ¯®àâ 
EX AF,AF'
; ;
IN A,(C) LD B,A ; ¯à®è«®¥ á®áâ®ï­¨¥ ¯®àâ 
; ;
EX AF,AF' .End: LD A,DCP_PAGE ; ãáâ ­®¢¨âì DCP
OUT (C),A ; ãáâ ­®¢¨âì ­®¢®¥ §­ ç¥­¨¥ ¯®àâ  LD C,SLOT2
EX AF,AF' OUT (C),A
LD A,L
LD (#8000),A ; ¢¥à­ãâì ¯®àâ
LD A,H
LD (#8200),A ; ¢¥à­ãâì ¯®àâ
; ;
LD B,A LD A,SYS_PAGE
LD A,L OUT (C),A
LD (#8000),A ; ¢¥à­ãâì ¯®àâ LD A,(SYS_PAGE.CONFIG_DE-#4000)
LD A,H OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
LD (#8200),A ; ¢¥à­ãâì ¯®àâ OUT (SYS_PORT.ROM),A
LD C,SLOT2
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.CONFIG_DE-#4000)
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
OUT (SYS_PORT.ROM),A
; ;
CALL DOS_OFF CALL DOS_OFF
; ;
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
POP AF BIT 2,E
RET PO RET Z
EI EI
RET RET
;
;AND A ;AND A
;RET ;RET
; ;
.Prepare:
EX AF,AF'
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
AND A
LD A,R
PUSH AF
POP DE
DI
CALL DOS_ON
;
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD C,SLOT2 ; ¯®«ãç¨âì áâà ­¨æã
IN D,(C)
;
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (C),A
;
LD A,(#8000) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(#8200)
LD H,A
EX AF,AF' ; áâà ­¨æ 
;
LD (#8000),A ; ãáâ ­®¢¨âì ¢­ãâ७­¨© ¯®àâ
LD (#8200),A
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
RET
;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;
; ;

View File

@ -596,15 +596,15 @@ SET_DOS_OFF:
; ;
FDD.SET720: FDD.SET720:
LD A,#01 ;!HARDCODE LD A,FDD_Density.SET_720
OUT (#BD),A ;!HARDCODE OUT (FDD_Density),A
RET RET
; ;
; ;
FDD.SET1440: FDD.SET1440:
LD A,#21 ;!HARDCODE LD A,FDD_Density.SET_1440
OUT (#BD),A ;!HARDCODE OUT (FDD_Density),A
RET RET
; ;

View File

@ -7,32 +7,89 @@
ENDM ENDM
;______________________________________________________________________: ;______________________________________________________________________:
; ;
;--
; GET_BPB_OFFSET:
; ;LD A,SYS_PAGE
; ;LD HL,MS_BPB
; PUSH AF
; PUSH HL
; LD B,1
; LD IX,#0000
; LD DE,#0000
; CALL FN_HDD_READ
; POP IX
; POP AF
; PUSH AF
; PUSH IX
; LD DE,#01BE ;!HARDCODE ᬥ饭¨¥ ®â ­ ç «  ᥪâ®à  ¤«ï â ¡«¨æë à §¤¥«®¢
; ADD IX,DE
; ;
; EX AF,AF'
; IN A,(SLOT3)
; EX AF,AF'
; OUT (SLOT3),A
; ;
; LD E,(IX+8) ; ¯¥à¢ë© ᥪâ®à (LBA) ­ ç «  à §¤¥«  (DWORD)
; LD D,(IX+9)
; LD L,(IX+10)
; LD H,(IX+11)
; ;
; EX AF,AF'
; OUT (SLOT3),A
; EX AF,AF'
; ;
; PUSH HL
; POP IX
; POP HL
; POP AF
; RET
HD_BPB_PREP: HD_BPB_PREP:
LD D,A ; [ ] 27/01/2023
IN A,(SLOT3) ;LD D,A
EX AF,AF' ;IN A,(SLOT3)
LD A,SYS_PAGE ;EX AF,AF'
OUT (SLOT3),A ; LD A,SYS_PAGE
LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; OUT (SLOT3),A
LD E,A ; LD A,(SYS_PAGE.HD_IDF_ADR.sectors)
EX AF,AF' ; LD E,A
OUT (SLOT3),A ;EX AF,AF'
LD A,D ;OUT (SLOT3),A
LD D,#00 ;LD A,D
LD IX,#0000 ;LD D,#00
LD B,#01 ;LD IX,#0000
;LD B,#01
LD B,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.CURRENT_HDD)
INC A
JR NZ,.configured
;
LD A,(SYS_PAGE.HD_IDF_ADR.sectors)
LD E,A
LD D,#00
LD IX,#0000
JR .done
;
.configured:
LD IX,(SYS_PAGE.HDD_PARTITION_OFFSET+2)
LD DE,(SYS_PAGE.HDD_PARTITION_OFFSET)
.done: EX AF,AF'
OUT (SLOT3),A
LD A,B
LD B,#01
;
HD_PREPARE: HD_PREPARE:
PUSH AF PUSH AF
PUSH HL PUSH HL
CALL HD_CALC_SECS CALL HD_CALC_SECS
JR NC,.L1 JR C,.error
POP HL ;
POP AF LD A,B
SCF
RET
.L1: LD A,B
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨ LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A OUT (C),A
@ -57,13 +114,16 @@ HD_PREPARE:
AND #F0 ; !!!!! ¯®á¬®âà¥âì AND #F0 ; !!!!! ¯®á¬®âà¥âì
OR H OR H
INC B ; IDE.Write.DeviceHead INC B ; IDE.Write.DeviceHead
OUT (C),A OUT (C),A
POP HL ; BUFER & PAGE POP HL ; BUFER & PAGE
POP AF POP AF
AND A AND A
RET RET
;
.error: POP HL
POP AF
SCF
RET
NEXT_ADD_SEC: NEXT_ADD_SEC:
@ -222,7 +282,8 @@ HD_RD_L1:
HD_RD_L2: HD_RD_L2:
WAIT_HDD WAIT_HDD
BIT IDE.ControlBit.DataRequest,A ;BIT IDE.ControlBit.DataRequest,A
AND IDE.ControlByte.DataRequest
JR NZ,HD_READ_CONT JR NZ,HD_READ_CONT
ZERO_PORTY ZERO_PORTY
@ -404,45 +465,114 @@ TEST_HDD_DRV:
IN A,(C) ; ????? IDE.Write.Sector+#100 IN A,(C) ; ????? IDE.Write.Sector+#100
CP H CP H
RET RET
/*
TEST_HDD_DRV: ; TEST_HDD_DRV:
; EXTENDED.ASM variant ; ; EXTENDED.ASM variant
LD HL,#00FF ;????? ; LD HL,#00FF ;?????
LD BC,IDE.Write.CylinderLow ; LD BC,IDE.Write.CylinderLow
OUT (C),L ; OUT (C),L
IF IDE_Optimization ; IF IDE_Optimization
INC C ; INC C
OUT (C),H ; IDE.Write.CylinderHigh ; OUT (C),H ; IDE.Write.CylinderHigh
INC B ; INC B
DEC C ; DEC C
IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0254 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï? ; IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0254 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï?
CP L ; CP L
RET NZ ; RET NZ
INC C ; INC C
ELSE ; ELSE
LD BC,IDE.Write.CylinderHigh ; LD BC,IDE.Write.CylinderHigh
OUT (C),H ; OUT (C),H
LD BC,#0254 ;???!!!! ; LD BC,#0254 ;???!!!!
IN A,(C) ; IN A,(C)
CP L ; CP L
RET NZ ; RET NZ
LD BC,#0255 ;???!!!! ; LD BC,#0255 ;???!!!!
ENDIF ; ENDIF
IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0255 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï? ; IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0255 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï?
CP H ; CP H
RET ; RET
*/
FN_HDD_INIT: ; [ ] 07/01/2024 bit1: Primary/Secondary, bit0 - master/slave, bit2..3: ¨á¯®«ì§ãî騩áï à §¤¥« ¢ MBR
LD BC,IDE.Write.DeviceHead ; !TODO ᤥ« âì à ¡®âã á ¯¥à¥¬¥­­ë¬¨ ¡¨®á  SYS_PAGE.IDE_0..3
FN_HDD_PART:
DI
PUSH BC
PUSH HL
;
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;
LD C,A
AND 2
LD A,IDE.Chanel.Primary
JR Z,.SET_CH
LD A,IDE.Chanel.Secondary
.SET_CH:
OUT (IDE.Chanel.Set),A
;
LD A,C
PUSH AF
AND 1
;
LD A,IDE.Drive.Slave
JR NZ,.SET_Master_Slave
;
LD A,IDE.Drive.Master LD A,IDE.Drive.Master
.SET_Master_Slave:
LD BC,IDE.Write.DeviceHead
OUT (C),A OUT (C),A
CALL TEST_HDD_DRV CALL TEST_HDD_DRV
JR NZ,.ABSENT JR NZ,.Error
;
CALL FN_HDD_INIT.L3
JR C,.Error
;
POP BC
LD A,SYS_PAGE
OUT (SLOT3),A
;e tu
LD A,B
LD (SYS_PAGE.CURRENT_HDD),A
;
EX AF,AF'
OUT (SLOT3),A
;
CALL SET_BPB_OFFSET
;AND A
.exit: POP HL
POP BC
EI
RET
;
.Error: POP AF
SCF
JR .exit
; [ ] 27/01/2024  ¤ ¯â¨à®¢ ­  ¤«ï ª®à४⭮© à ¡®âë á FN_HDD_PART
FN_HDD_INIT:
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,(SYS_PAGE.CURRENT_HDD)
OUT (C),B
INC A
JR Z,FN_HDD_PART
CALL TEST_HDD_DRV
SCF
RET NZ
; LD BC,IDE.Write.DeviceHead
; LD A,IDE.Drive.Master
; OUT (C),A
; CALL TEST_HDD_DRV
; JR NZ,.ABSENT
; ;
.L3: WAIT_HDD .L3: WAIT_HDD
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
@ -450,17 +580,20 @@ FN_HDD_INIT:
OUT (C),A OUT (C),A
WAIT_HDD WAIT_HDD
BIT IDE.ControlBit.DataRequest,A BIT IDE.ControlBit.DataRequest,A
JR NZ,.L2 ;JR NZ,.L2
SCF SCF
RET RET Z
.ABSENT: ;JR NZ,.L2
LD BC,IDE.Write.DeviceHead ;SCF
LD A,IDE.Drive.Slave ;RET
OUT (C),A ; .ABSENT:
CALL TEST_HDD_DRV ; LD BC,IDE.Write.DeviceHead
JR Z,.L3 ; LD A,IDE.Drive.Slave
SCF ; OUT (C),A
RET ; CALL TEST_HDD_DRV
; JR Z,.L3
; SCF
; RET
; ;
.L2: LD BC,IDE.Read.Data .L2: LD BC,IDE.Read.Data
LD HL,SYS_PAGE.HD_IDF_ADR LD HL,SYS_PAGE.HD_IDF_ADR
@ -503,13 +636,18 @@ FN_HDD_INIT:
LD BC,IDE.Write.DeviceHead LD BC,IDE.Write.DeviceHead
OUT (C),H OUT (C),H
LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ç¨á«® ᥪâ®à®¢ LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ç¨á«® ᥪâ®à®¢
.HDD_CONFIGURED:
LD BC,IDE.Write.Counter LD BC,IDE.Write.Counter
OUT (C),A OUT (C),A
LD A,D LD A,D
OUT (SLOT3),A OUT (SLOT3),A
LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS
;CALL HD_CMD_EXE CALL HD_CMD_EXE
;RET ;
;
;
;
RET
HD_CMD_EXE: HD_CMD_EXE:
CALL HD_WAIT CALL HD_WAIT
RET C RET C
@ -642,60 +780,44 @@ HD_CALC_SECS:
AND A AND A
RET RET
; [ ] 07/01/2024 bit0: Primary/Secondary, bit1 - master/slave, bit2..3: ¨á¯®«ì§ãî騩áï à §¤¥« ¢ MBR ; [ ] 27/01/2024 ⥯¥àì ०¨¬ ᯥªâà㬠 à ¡®â ¥â á «î¡ë¬ à §¤¥«®¬ HDD
; !TODO ᤥ« âì à ¡®âã á ¯¥à¥¬¥­­ë¬¨ ¡¨®á  SYS_PAGE.IDE_0..3 SET_BPB_OFFSET:
FN_HDD_PART:
DI
PUSH BC
PUSH HL
;
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;
LD C,A
AND 1
LD A,IDE.Chanel.Primary
JR Z,.SET_CH
LD A,IDE.Chanel.Secondary
.SET_CH:
OUT (IDE.Chanel.Set),A
;
LD A,C
PUSH AF
AND 2
;
LD A,IDE.Drive.Slave
JR NZ,.SET_Master_Slave
;
LD A,IDE.Drive.Master
.SET_Master_Slave:
LD BC,IDE.Write.DeviceHead
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,.Error
CALL FN_HDD_INIT.L3
JR C,.Error
;
POP BC
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A LD HL,SYS_PAGE.MS_BPB
; LD IX,#0000
LD A,B LD DE,#0000
LD (SYS_PAGE.CURRENT_HDD),A LD B,1
CALL FN_HDD_READ
; ;
EX AF,AF'
IN A,(SLOT3)
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
; ;
AND A LD A,(SYS_PAGE.CURRENT_HDD)
.exit: POP HL RRCA
POP BC RRCA
EI AND 3
RET INC A
LD B,A
; ;
.Error: POP AF LD HL,SYS_PAGE.MS_BPB-16 + #01BE ;!HARDCODE ᬥ饭¨¥ ®â ­ ç «  ᥪâ®à  ¤«ï â ¡«¨æë à §¤¥«®¢ c ¯¥à¢ë¬ ᥪâ®à®¬ LBA ¤«ï ¯¥à¢®£® à §¤¥« 
SCF LD DE,16 ;!HARDCODE à §¬¥à ¯®«ï ®¯¨á â¥«ï à §¤¥« 
JR .exit .loop: ADD HL,DE
DJNZ .loop
;
LD A,8
ADD L
LD L,A
LD DE,SYS_PAGE.HDD_PARTITION_OFFSET
LD C,4
LDIR
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
RET
; ENDMODULE ; ENDMODULE
;************************************************ ;************************************************

View File

@ -271,14 +271,14 @@ FN_TURBO:
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬ ;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_720: .SET_FDD_720:
LD A,1 LD A,FDD_Density.SET_720
OUT (#BD),A ; !HARDCODE OUT (FDD_Density),A
AND A AND A
RET RET
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬ ;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_1440: .SET_FDD_1440:
LD A,#21 LD A,FDD_Density.SET_1440
OUT (#BD),A ; !HARDCODE OUT (FDD_Density),A
AND A AND A
RET RET
@ -308,18 +308,14 @@ FN_TURBO:
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
READ_PORTS: ; !TODO ᤥ« âì
WRITE_PORTS: ; !TODO ᤥ« âì
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;!TODO ;!TODO
;FN_GET_SYS_VAR: ;FN_GET_SYS_VAR:
; ‚室: HL - ­®¬¥à á¨á⥬­®© ¯¥à¥¬¥­­®© ; ‚室: HL - ­®¬¥à á¨á⥬­®© ¯¥à¥¬¥­­®©
; ‚ë室: HL - §­ ç¥­¨¥ á¨á⥬­®© ¯¥à¥¬¥­­®© ; ‚ë室: HL - §­ ç¥­¨¥ á¨á⥬­®© ¯¥à¥¬¥­­®©
; RET ; RET
;----------------------------------------------------------------------;
;!TODO ᪮¬¯®­®¢ âì ;!TODO ᪮¬¯®­®¢ âì