Top secrets sources NedoPC pentevo

Rev

Rev 1041 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?


; LAST UPDATE: 15.02.2023 savelij

; ((out&0ffff)==37f7)&&((val&0ff)==1)
; ((out&0ffff)==77f7)&&((val&0ff)==1)
; ((out&0ffff)==0b7f7)&&((val&0ff)==1)
; ((out&0ffff)==0f7f7)&&((val&0ff)==1)
; ((M(5CF4)==2)&&(M(5CF5)==1B))
; (((M(5CF4)==2)&&(M(5CF5)==1B))&&(SP<4000))
; ((OUT&0FFFF)==1F)|((OUT&0FFFF)==3F)|((OUT&0FFFF)==7F)

                include ../../macros.a80
                include ../../global_vars.a80
                include ../../define.a80
                include ../../evodos_vars.a80

STACK           EQU 0x0DFF

OLD_IF          EQU STACK-WORD*2
OLD_AF          EQU STACK-WORD

; ª®¬ ­¤  ¢ë室  ¨ ¯¥à¥å®¤ ­  ®¡à ¡®â稪
JP_EMU          MACRO ADDRESS
                DUPL ADDRESS-$,0
                OUT (EXIT_PORT),A
                JP ADR_ADDRESS
                ENDM

; £¥­¥à æ¨ï  ¤à¥á®¢ ¤«ï â ¡«¨æë
LABEL_GEN       MACRO ADDRESS
_ADDRESS        EQU ($ - TABLE_VIRT) / 4
                DW ADDRESS,ADR_ADDRESS.WORK
                ENDM

; ¯¥à¥å®¤ ­  ®¡à ¡®â稪 á ª®¤®¬  ¤à¥á 
EMU_JUMP        MACRO ADDRESS
ADR_ADDRESS     EQU $
                LD (OLD_AF + 1),A
                LD A,_ADDRESS
                JP WORKER

.WORK           EQU $
                ENDM

                ORG 0
                DUPL 0x0038 - $,0
                EI
                RET

                DUPL 0x006F - $,0
                JP (HL)

        JP_EMU 0x02BE                           ; OUT      (0xFF), A

                DUPL 0x0801 - $,0
;â ¡«¨æ   ¤à¥á®¢ ¯¥à¥å¢ â  ¨ ¢ë§ë¢ â®à  ®¡à ¡®â稪®¢
TABLE_VIRT
        LABEL_GEN 0x02BE                        ; OUT      (0xFF), A
        LABEL_GEN 0x1E3A                        ; OUT      (0x3F), A
        LABEL_GEN 0x1FDD                        ; IN    A, (0x1F)
        LABEL_GEN 0x1FF3                        ; OUT      (0xFF), A
        LABEL_GEN 0x2000                        ; OUT      (0x1F), A
        LABEL_GEN 0x2076                        ; IN    A, (0x1F)
        LABEL_GEN 0x2085                        ; OUT      (0x3F), A
        LABEL_GEN 0x208D                        ; OUT      (0x5F), A
        LABEL_GEN 0x2093                        ; OUT      (0x1F), A
        LABEL_GEN 0x2099                        ; IN    A, (0x1F)
        LABEL_GEN 0x20B1                        ; IN    A, (0xFF)
        LABEL_GEN 0x20B8                        ; OUT      (C),    D
        LABEL_GEN 0x2740                        ; IN    A, (0x1F)
        LABEL_GEN 0x2748                        ; OUT      (0x7F), A
        LABEL_GEN 0x2A53                        ; OUT      (C),    A
        LABEL_GEN 0x2A71                        ; OUT      (0xFF), A MAGIC
        LABEL_GEN 0x2A77                        ; IN    A, (0x1F)    MAGIC
        LABEL_GEN 0x2AD9                        ; OUT      (OxFF), A MAGIC
        LABEL_GEN 0x2B25                        ; IN    A, (0x5F)    MAGIC
        LABEL_GEN 0x2C07                        ; IN    A, (0x5F)    MAGIC
        LABEL_GEN 0x2CD8                        ; IN    A, (0x5F)    MAGIC
        LABEL_GEN 0x2D75                        ; OUT      (0x5F), A MAGIC
        LABEL_GEN 0x2D80                        ; OUT      (0x1F), A MAGIC
        LABEL_GEN 0x2D87                        ; IN    A, (0x1F)    MAGIC
        LABEL_GEN 0x2F0C                        ; OUT      (0xFF), A MAGIC
        LABEL_GEN 0x2F1D                        ; OUT      (0x5F), A MAGIC
        LABEL_GEN 0x2F28                        ; OUT      (0x1F), A MAGIC
        LABEL_GEN 0x2F2F                        ; IN    A, (0x1F)    MAGIC
        LABEL_GEN 0x2F3C                        ; OUT      (0xFF), A MAGIC
        LABEL_GEN 0x2F4D                        ; OUT      (0xFF), A MAGIC
        LABEL_GEN 0x2F50                        ; OUT      (0x7F), A MAGIC
        LABEL_GEN 0x2F57                        ; OUT      (0x1F), A MAGIC
        LABEL_GEN 0x2F59                        ; IN    A, (0xFF)
        LABEL_GEN 0x2FB1                        ; OUT      (0xFF), A
        LABEL_GEN 0x2FC3                        ; OUT      (0x1F), A
        LABEL_GEN 0x3C30                        ; IN    A, (0x1F)
        LABEL_GEN 0x3D4D                        ; OUT      (0xFF), A
        LABEL_GEN 0x3D9A                        ; OUT      (0x1F), A
        LABEL_GEN 0x3DA6                        ; IN    A, (0xFF)
        LABEL_GEN 0x3DB5                        ; IN    A, (0x1F)
        LABEL_GEN 0x3DBA                        ; IN    A, (0x1F)
        LABEL_GEN 0x3DD5                        ; OUT      (0xFF), A
        LABEL_GEN 0x3E30                        ; IN    A, (0x1F)
        LABEL_GEN 0x3E3A                        ; IN    A, (0x1F)
        LABEL_GEN 0x3E44                        ; OUT      (0x7F), A
        LABEL_GEN 0x3E4C                        ; OUT      (0x7F), A
        LABEL_GEN 0x3E50                        ; IN    A, (0x3F)
        LABEL_GEN 0x3E78                        ; IN    A, (0x3F)
        LABEL_GEN 0x3E7E                        ; OUT      (0x3F), A
        LABEL_GEN 0x3E87                        ; IN    A, (0x3F)
        LABEL_GEN 0x3E95                        ; OUT      (0x3F), A
        LABEL_GEN 0x3EB5                        ; IN    A, (0x1F)
        LABEL_GEN 0x3EBC                        ; IN    A, (0x3F)
        LABEL_GEN 0x3EC9                        ; OUT      (0x1F), A
        LABEL_GEN 0x3ECE                        ; IN    A, (0xFF)
        LABEL_GEN 0x3EDF                        ; OUT      (0x1F), A
        LABEL_GEN 0x3EF3                        ; IN    H, (C)
        LABEL_GEN 0x3EF5                        ; IN    A, (0xFF)
        LABEL_GEN 0x3EFE                        ; IN    A, (0x7F)
        LABEL_GEN 0x3F1B                        ; OUT      (0x5F), A
        LABEL_GEN 0x3F25                        ; OUT      (0x1F), A
        LABEL_GEN 0x3F33                        ; IN    A, (0x1F)
        LABEL_GEN 0x3F4D                        ; OUT      (0x1F), A
        LABEL_GEN 0x3F55                        ; IN    A, (0x3F)
        LABEL_GEN 0x3F5A                        ; Ix    A, (0x5F)
        LABEL_GEN 0x3F69                        ; IN    A, (0x3F)
        LABEL_GEN 0x3F72                        ; IN    A, (0x5F)
        LABEL_GEN 0x3FBC                        ; IN    A, (0xFF)
        LABEL_GEN 0x3FCA                        ; IN    A, (0xFF)
        LABEL_GEN 0x3FD1                        ; OUTI
        LABEL_GEN 0x3FD7                        ; IN    A, (0xFF)
        LABEL_GEN 0x3FE5                        ; IN    A, (0xFF)
        LABEL_GEN 0x3FEC                        ; INI
        LABEL_GEN 0x3FF0                        ; OUT      (C),    A
        LABEL_GEN 0x3FF3                        ; IN    A, (C)

; ¢ë§ë¢ â®àë ¯¥à¥å¢ â 
        EMU_JUMP 0x02BE                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x1E3A                         ; OUT (0x3F),A
                JP OUT_3F

        EMU_JUMP 0x1FDD                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x1FF3                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2000                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x2076                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x2085                         ; OUT (0x3F),A
                JP OUT_3F

        EMU_JUMP 0x208D                         ; OUT (0x5F),A
                JP OUT_5F

        EMU_JUMP 0x2093                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x2099                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x20B1                         ; IN A,(0xFF)
                JP IN_FF

        EMU_JUMP 0x20B8                         ; OUT (C),D
                JP OUT_C_D

        EMU_JUMP 0x2740                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x2748                         ; OUT (0x7F),A
                JP OUT_7F

        EMU_JUMP 0x2A53                         ; OUT (C),A
                JP OUT_C_A

        EMU_JUMP 0x2A71                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2A77                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x2AD9                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2B25                         ; IN A,(0x5F)
                JP IN_5F

                DUPL 0x09FF - $,0
                DW 0xFFFF

        EMU_JUMP 0x2C07                         ;IN A,(0x5F)
                JP IN_5F

        EMU_JUMP 0x2CD8                         ; IN A,(0x5F)
                JP IN_5F

        EMU_JUMP 0x2D75                         ; OUT (0x5F),A
                JP OUT_5F

        EMU_JUMP 0x2D80                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x2D87                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x2F0C                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2F1D                         ; OUT (0x5F),A
                JP OUT_5F

        EMU_JUMP 0x2F28                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x2F2F                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x2F3C                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2F4D                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2F50                         ; OUT (0x7F),A
                JP OUT_7F

        EMU_JUMP 0x2F57                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x2F59                         ; IN A,(0xFF)
                CALL IN_FF
                LD HL,EXIT_0x2F59
                LD (ADR_EXIT),HL
                JP UPDATE_AF

        EMU_JUMP 0x2FB1                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x2FC3                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3C30                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3D4D                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x3D9A                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3DA6                         ; IN A,(0xFF)
                JP IN_FF

        EMU_JUMP 0x3DB5                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3DBA                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3DD5                         ; OUT (0xFF),A
                JP OUT_FF

        EMU_JUMP 0x3E30                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3E3A                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3E44                         ; OUT (0x7F),A
                JP OUT_7F

        EMU_JUMP 0x3E4C                         ; OUT (0x7F),A
                JP OUT_7F

        EMU_JUMP 0x3E50                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3E78                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3E7E                         ; OUT (0x3F),A
                JP OUT_3F

        EMU_JUMP 0x3E87                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3E95                         ; OUT (0x3F),A
                JP OUT_3F

        EMU_JUMP 0x3EB5                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3EBC                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3EC9                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3ECE                         ; IN A,(0xFF)
                JP IN_FF

        EMU_JUMP 0x3EDF                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3EF3                         ; IN H,(C)
                JP IN_H_C

        EMU_JUMP 0x3EF5                         ; IN A,(0xFF)
                CALL IN_FF
                LD HL,EXIT_0x3EF5
                LD (ADR_EXIT),HL
UPDATE_AF       LD A,(OLD_AF + 1)
                AND 0xC0
                PUSH AF
                POP HL
                LD (OLD_AF),HL
                RET

        EMU_JUMP 0x3EFE                         ; IN A,(0x7F)
                CALL OUT_1F.INFF_BIT6
                JP IN_7F

        EMU_JUMP 0x3F1B                         ; OUT (0x5F),A
                JP OUT_5F

        EMU_JUMP 0x3F25                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3F33                         ; IN A,(0x1F)
                JP IN_1F

        EMU_JUMP 0x3F4D                         ; OUT (0x1F),A
                JP OUT_1F

        EMU_JUMP 0x3F55                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3F5A                         ; IN A,(0x5F)
                JP IN_5F

        EMU_JUMP 0x3F69                         ; IN A,(0x3F)
                JP IN_3F

        EMU_JUMP 0x3F72                         ; IN A,(0x5F)
                JP IN_5F

        EMU_JUMP 0x3FBC                         ; IN A,(0xFF)   ; § ¯¨áì ᥪâ®à 
                JP WRITE_SECTOR

        EMU_JUMP 0x3FCA                         ; IN A,(0xFF)   ; § ¯¨áì ᥪâ®à 
                JP WRITE_SECTOR

        EMU_JUMP 0x3FD1                         ; OUTI          ; § ¯¨áì ᥪâ®à 
                JP WRITE_SECTOR

        EMU_JUMP 0x3FD7                         ; IN A,(0xFF)   ; ç⥭¨¥ ᥪâ®à 
                JP READ_SECTOR
;       EMU_JUMP 0x3FD7                         ; ®¦¨¤ ­¨¥ £®â®¢­®á⨠ç⥭¨ï
;               JP WAIT_READ

        EMU_JUMP 0x3FE5                         ; IN A,(0xFF)   ; ç⥭¨¥ ᥪâ®à 
                JP READ_SECTOR

        EMU_JUMP 0x3FEC                         ; INI           ; ç⥭¨¥ ᥪâ®à 
                JP IN_INI

        EMU_JUMP 0x3FF0                         ; OUT (C),A
                LD BC,(OLD_BC)
                LD A,(OLD_AF+1)
                LD D,A
                JP WR_C_D

        EMU_JUMP 0x3FF3                         ; IN A,(C)
                LD BC,(OLD_BC)
                IN A,(C)
                PUSH AF
                POP HL
                LD (OLD_AF),HL
                RET

; á⥪ ¨ ®¡à ¡®â稪¨
                DUPL STACK - $,0
                DW INT_BREAK

                DUPL STACK + 0x41 - $,0
INT_BREAK       PUSH AF
                PUSH HL
                PUSH DE
                LD A,(FLAG_RW_BREAK)
                AND A
                JR NZ,IB1
                LD HL,(OLD_IF)
                LD L,0xFF
                LD E,(HL)
                INC HL
                LD D,(HL)
                LD HL,(OLD_SP)
                DEC HL
                LD (HL),D
                DEC HL
                LD (HL),E
                LD (OLD_SP),HL
                POP DE
                POP HL
                POP AF
                EI
                RET

IB1             PUSH BC
                LD (INT_SP),SP
                CALL READ_TMP_CPU12
                CALL WRITE_CPU12
                LD A,(OLD_PORT_BF)
                OUT (PEVO_CONF),A
                LD A,(OLD_IF + 1)
                LD I,A
                LD HL,(OLD_AF)
                PUSH HL
                POP AF
                LD HL,(OLD_SP)
                LD DE,0x2A71                    ;  ¤à¥á ¢®§¢à â  ¨§ ®¡à ¡®â稪  ¯à¥à뢠­¨ï ¢­¥è­¥© ¯à®£¨ ç¥à¥§ OUT (0xFF),A
                DEC HL
                LD (HL),D
                DEC HL
                LD (HL),E
                DEC HL
                EX DE,HL
                LD HL,OLD_IF + 1
                LD H,(HL)
                LD L,0xFF
                LD C,(HL)
                INC HL
                LD B,(HL)
                EX DE,HL
                LD (HL),B
                DEC HL
                LD (HL),C
                LD SP,HL
                LD HL,(OLD_HL)
                LD DE,(OLD_DE)
                LD BC,(OLD_BC)
                LD A,(WR_FF)                    ; ¡ ©â¨ª ¤«ï ¢®§¢à â  ç¥à¥§ ª®¬ ­¤ã OUT (0xFF),A
                EI
                JP 0x2A53

INT_RET         LD SP,0
INT_SP          EQU $-2
                IN A,(PEVO_CONF)
                LD (OLD_PORT_BF),A
                OR 1
                OUT (PEVO_CONF),A
                LD A,HIGH (STACK)
                LD I,A
                CALL WRITE_TMP_CPU12
                POP BC
                POP DE
                POP HL
                POP AF
                RET

; ¢ë室 ¨§ ®¡à ¡®â稪 
EXIT_PAGE_FE    LD A,(OLD_PORT_BF)
                OUT (PEVO_CONF),A               ; ¢®ááâ ­®¢«¥­¨¥ ¯®àâ  0xBF
                LD A,(OLD_IF + 1)
                LD I,A
                LD HL,(OLD_AF)
                PUSH HL
                POP AF
                LD HL,0                         ; ¢®ááâ ­®¢«¥­¨¥ HL
OLD_HL          EQU $-2
                LD DE,0                         ; ¢®ááâ ­®¢«¥­¨¥ DE
OLD_DE          EQU $-2
                LD BC,0                         ; ¢®ááâ ­®¢«¥­¨¥ BC
OLD_BC          EQU $-2
                LD SP,0                         ; ¢®ááâ ­®¢«¥­¨¥ SP
OLD_SP          EQU $-2
                JP 0
ADR_EXIT        EQU $-2        

                DUPL STACK + 0x101 - $,0
; ¢å®¤ ¢ ®¡à ¡®â稪
WORKER          LD (NUM_ADR),A
                LD (OLD_SP),SP
                LD SP,STACK-WORD
                PUSH AF
                EX (SP),HL
                LD A,L
                LD (OLD_AF),A
                POP HL
                LD A,I
                JP PE,WORKER1
                LD A,I
WORKER1         PUSH AF                         ; IF
                IN A,(PEVO_CONF)
                LD (OLD_PORT_BF),A              ; ¯®àâ BF
                OR 1
                OUT (PEVO_CONF),A
                LD A,HIGH (STACK)
                LD I,A
                LD (OLD_HL),HL
                LD (OLD_DE),DE
                LD (OLD_BC),BC
                LD HL,0
NUM_ADR         EQU $-2
                ADD HL,HL
                ADD HL,HL
                LD DE,TABLE_VIRT
                ADD HL,DE
                LD E,(HL)
                INC HL
                LD D,(HL)                       ; DE- ¤à¥á ¢®§¢à â  ¨§ ®¡à ¡®â稪 
                INC HL
                LD (ADR_EXIT),DE
                LD E,(HL)
                INC HL
                LD D,(HL)                       ; DE- ¤à¥á ®¡à ¡®â稪 
                PUSH DE
                LD HL,EXIT_PAGE_FE              ; ª®¤ ¢ë室  ¨§ ®¡à ¡®â稪 
                EX (SP),HL
                JP (HL)

; ç⥭¨¥/§ ¯¨áì ¯à¨¬®­â¨à®¢ ­­®£® ¤¨áª 
MOUNT_RW        DI
                LD A,(RDWR_MODE)
                AND 0x80
                LD L,A
                LD A,(WR_FF)
                AND 3
                OR L
                BIT 7,A
                PUSH AF
                LD HL,0x2A77
                PUSH HL
                LD HL,MNT_RW
                PUSH HL
                JR Z,.L1
; ª®¯¨à㥬 ᥪâ®à ª®â®àë© ¡ã¤¥¬ § ¯¨á뢠âì ­  ᬮ­â¨à®¢ ­­ë© ®¡à §
                LD HL,(OLD_HL)
                LD DE,MNT_SECTOR
                CALL COPY_BLOCK
                LD (OLD_HL),HL
; ¯¥à¥ª«îç ¥¬ ¯ £¨ ¤«ï à ¡®âë á ¬ ã­â®¬
.L1             PUSH AF
                LD BC,WIN_A1
                LD A,0x40
                OUT (C),A
                LD B,HIGH (WIN_P1)
                LD A,RAM_EVODOS
                OUT (C),A
                POP AF
; ¯¥à¥áâ ¢«ï¥¬ á⥪
                LD HL,0x4000
                ADD HL,SP
                LD SP,HL
                JP 0x2A53

        PHASE $ + 0x4000

MNT_RW          LD L,A
                LD A,(PORT_3F + 0x4000)         ; ¢§ï«¨ ­®¬¥à â४ 
                ADD A,A                         ; áâ®à®­ 2
                LD D,A
                LD A,(WR_FF + 0x4000)
                AND 0x10                        ; ¯à®¢¥àª  ª ª ï áâ®à®­  ¤¨áª 
                JR NZ,WRRDSECM1
                INC D                           ; ¤«ï áâ®à®­ë 1
WRRDSECM1       LD A,(PORT_5F + 0x4000)         ; ¢§ï«¨ ­®¬¥à ᥪâ®à 
                LD E,A                          ; D-â४, E-ᥪâ®à
                LD A,L
                LD HL,MNT_SECTOR + 0x4000
        RST8 _MOUNTER,_RDWR_MOUNT
                JP 0x3D2F

        DEPHASE

RET_MNT_RW
                LD HL,-0x4000
                ADD HL,SP
                LD SP,HL
                CALL WRITE_CPU12
                LD HL,(OLD_IF)
                PUSH HL
                POP AF
                JP PO,.DI_MODE                  ; ¯à¥à뢠­¨ï à §à¥è¥­ë?
                CP 0x3F
                JR Z,.DI_MODE
                EI
.DI_MODE        POP AF
                RET NZ
                LD HL,MNT_SECTOR
                LD DE,(OLD_HL)
                CALL COPY_BLOCK
                LD (OLD_HL),DE
                RET

; ¨­ä  ¤«ï ᮧ¤ ­¨ï 9 ᥪâ®à  ­®¢®£® ¤¨áª 
DSKINFO         DB 0                            ; + 0xE1 - ­®¬¥à ¯¥à¢®£® ᢮¡®¤­®£® ᥪâ®à 
                DB 1                            ; + 0xE2 - ­®¬¥à ¯¥à¢®£® ᢮¡®¤­®£® â४ 
                DB 0x16                         ; + 0xE3 - ⨯ ¤¨áª¥âë
                DB 0                            ; + 0xE4 - ª®«¨ç¥á⢮ ä ©«®¢ ­  ¤¨áª¥â¥
SECFREE         DW 2544                         ; + 0xE5 - ª®«¨ç¥á⢮ ᢮¡®¤­ëå ᥪâ®à®¢
                DB 0x10                         ; + 0xE7 - ¨¤¥­â¨ä¨ª æ¨®­­ë© ª®¤ TRDOS
                DW 0                            ; + 0xE8 - 2 ¡ ©â  0
                DUPL 9," "                      ; + 0xEA - 9 ¡ ©â 0x20
                DB 0                            ; + 0xF3 - 1 ¡ ©â 0
                DB 0                            ; + 0xF4 - ª®«¨ç¥á⢮ 㤠«¥­­ëå ä ©«®¢
                DB "RAMDISKO"                   ; + 0xF5 - ¨¬ï ¤¨áª¥âë
DSK_END

                DUPL LOW (-$),0
MNT_SECTOR

;  ¤à¥á  ¯¥à¥å¢ â 
        JP_EMU 0x1E3A                           ; OUT      (0x3F), A
        JP_EMU 0x1FDD                           ; IN    A, (0x1F)
        JP_EMU 0x1FF3                           ; OUT      (0xFF), A
        JP_EMU 0x2000                           ; OUT      (0x1F), A
        JP_EMU 0x2076                           ; IN    A, (0x1F)
        JP_EMU 0x2085                           ; OUT      (0x3F), A
        JP_EMU 0x208D                           ; OUT      (0x5F), A
        JP_EMU 0x2093                           ; OUT      (0x1F), A
        JP_EMU 0x2099                           ; IN    A, (0x1F)
        JP_EMU 0x20B1                           ; IN    A, (0xFF)
        JP_EMU 0x20B8                           ; OUT      (C),    D
        JP_EMU 0x2740                           ; IN    A, (0x1F)
        JP_EMU 0x2748                           ; OUT      (0x7F), A
        JP_EMU 0x2A53                           ; OUT      (C),    A

; ¯¥à¢ ï ª®¬ ­¤  ¢ ®¡à ¡®â稪¥ MAGIC ¤«ï ¢®§¢à â  ¢ ¯ £ã FE
;       JP_EMU 0x2A71                           ; OUT      (0xFF), A
                DUPL 0x2A71 - $,0
                OUT (EXIT_PORT),A
                JP INT_RET                      ; ¢®§¢à é¥­¨¥ ¨§ ®¡à ¡®â稪  INT

;       JP_EMU 0x2A77                           ; IN    A, (0x1F)
                DUPL 0x2A77 - $,0
                OUT (EXIT_PORT),A
                JP RET_MNT_RW                   ; ¢®§¢à é¥­¨¥ ¯®á«¥ ¢ë§®¢  RST 8

        JP_EMU 0x2AD9                           ; OUT      (0xFF), A
        JP_EMU 0x2B25                           ; IN    A, (0x5F)
        JP_EMU 0x2C07                           ; IN    A, (0x5F)
        JP_EMU 0x2CD8                           ; IN    A, (0x5F)
        JP_EMU 0x2D75                           ; OUT      (0x5F), A
        JP_EMU 0x2D80                           ; OUT      (0x1F), A
        JP_EMU 0x2D87                           ; IN    A, (0x1F)
        JP_EMU 0x2F0C                           ; OUT      (0xFF), A
        JP_EMU 0x2F1D                           ; OUT      (0x5F), A

                DUPL 0x2F24 - $,0               ; ¤«ï  ¤à¥á  0x2F4D
                JP ADR_0x2F4D

        JP_EMU 0x2F28                           ; OUT      (0x1F), A
        JP_EMU 0x2F2F                           ; IN    A, (0x1F)
        JP_EMU 0x2F3C                           ; OUT      (0xFF), A

                DUPL 0x2F4D - $,0               ; OUT      (0xFF), A
                OUT (EXIT_PORT),A
                DB 0x18                         ; JR 0x2F24

        JP_EMU 0x2F50                           ; OUT      (0x7F), A

                DUPL 0x2F57 - $,0               ; OUT      (0x1F), A
                OUT (EXIT_PORT),A
                JR JUMP_0x2F57

                JR JUMP_0x2F59                  ; IN    A, (0xFF)

EXIT_0x2F59     OUT (EXIT_PORT),A
JUMP_0x2F59     JP ADR_0x2F59

JUMP_0x2F57     JP ADR_0x2F57

        JP_EMU 0x2FB1                           ; OUT      (0xFF), A
        JP_EMU 0x2FC3                           ; OUT      (0x1F), A

                DUPL 0x32A2 - $,0
; ®¡à ¡®â稪¨ ç⥭¨ï/§ ¯¨á¨ ¯®à⮢
; § ¯¨áì "A" ¢ ¯®àâ 0x1F
OUT_1F          LD A,(OLD_AF + 1)
                LD (WR_1F),A

                AND %11110000
                RRCA
                RRCA
                RRCA
                ADD A,LOW (.TABL_CMD)
                LD L,A
                ADC A,HIGH (.TABL_CMD)
                SUB L
                LD H,A
                LD A,(HL)
                INC HL
                LD H,(HL)
                LD L,A
                JP (HL)

.TABL_CMD       DW .CMD_00
                DW .CMD_10
                DW .CMD_20
                DW .CMD_30
                DW .CMD_40
                DW .CMD_50
                DW .CMD_60
                DW .CMD_70
                DW .CMD_80
                DW .CMD_90
                DW .CMD_A0
                DW .CMD_B0
                DW .CMD_C0
                DW .CMD_D0
                DW .CMD_E0
                DW .CMD_F0

; 00-0F ª®¬ ­¤  ¢®ááâ ­®¢«¥­¨ï
.CMD_00         XOR A
                LD (PORT_3F),A
                JR .INFF_BIT6

; 10-1F ª®¬ ­¤  ¯®¨áª 
.CMD_10         LD A,(PORT_7F)
                LD (PORT_3F),A
                CALL DISK_NONE
                LD A,0x80
                JR C,.INFF_BIT6_1
.INFF_BIT6      XOR A
.INFF_BIT6_1    LD (RD_1F),A
                LD A,0xBF
                LD (RD_FF),A
                RET

; 20-3F ª®¬ ­¤  è £ ¢ ¯à¥¤ë¤ã饬 ­ ¯à ¢«¥­¨¨
.CMD_20
.CMD_30         LD A,(PORT_3F)
.NAPRAVL        INC A
                LD (PORT_3F),A
                JR .INFF_BIT6

; 40-5F ª®¬ ­¤  è £ ¢¯¥à¥¤
.CMD_40
.CMD_50         LD A,(PORT_3F)
                INC A
                LD (PORT_3F),A
                LD A,0x3C                       ; INC A
                LD (.NAPRAVL),A
                JR .INFF_BIT6

; 60-7F ª®¬ ­¤  è £ ­ § ¤
.CMD_60
.CMD_70         LD A,(PORT_3F)
                DEC A
                LD (PORT_3F),A
                LD A,0x3D                       ; DEC A
                LD (.NAPRAVL),A

; 80-9F ª®¬ ­¤  ç⥭¨¥ ᥪâ®à 
.CMD_80
.CMD_90

; A0-BF ª®¬ ­¤  § ¯¨áì ᥪâ®à 
.CMD_A0
.CMD_B0

; C0-CF ç⥭¨¥  ¤à¥á 
.CMD_C0         JR .INFF_BIT6

; D0-DF ¯à¨­ã¤¨â¥«ì­®¥ ¯à¥à뢠­¨¥
.CMD_D0         LD A,0xBF
                LD (RD_FF),A
                RET

; E0-EF ç⥭¨¥ ¤®à®¦ª¨
.CMD_E0
.CMD_F0         JR .INFF_BIT6

; § ¯¨áì "A" ¢ ¯®àâ 0x3F
OUT_3F          LD A,(OLD_AF + 1)
                LD (PORT_3F),A
                RET

; § ¯¨áì "A" ¢ ¯®àâ 0x5F
OUT_5F          LD A,(OLD_AF + 1)
                LD (PORT_5F),A
                RET

; § ¯¨áì "A" ¢ ¯®àâ 0x7F
OUT_7F          LD A,(OLD_AF + 1)
                LD (PORT_7F),A
                RET

; § ¯¨áì "A" ¢ ¯®àâ 0xFF
OUT_FF          LD A,(OLD_AF + 1)
                LD (WR_FF),A
                LD D,A
                LD BC,0x00FF
                JR WR_C_D

; § ¯¨áì "A" ¢ ¯®àâ (C)
OUT_C_A         LD A,(OLD_AF + 1)
WRCA1           LD D,A
                LD BC,(OLD_BC)                  ; ¥á«¨ ¯®àâ ­¥ TR-DOS
                LD A,C
; ®¯à¥¤¥«¥­¨¥ ¢ ª ª®© ¯®àâ § ¯¨áì      
                CP 0x1F
                JP Z,OUT_1F
                CP 0x3F
                JR Z,OUT_3F
                CP 0x5F
                JR Z,OUT_5F
                CP 0x7F
                JR Z,OUT_7F
                CP 0xFF
                JR Z,OUT_FF
                CP LOW (WIN_A0)
                JR Z,WRCA3
WR_C_D          PUSH BC
                LD BC,FDD_EMU_PORT
                IN E,(C)
                XOR A
                OUT (C),A
                POP BC
                OUT (C),D
                LD BC,FDD_EMU_PORT
                OUT (C),E
                RET

; § ¯¨áì ¢ ¯®àâë ATM/PENTEVO
WRCA3           LD A,B
                LD HL,BB_CPU1
                CP HIGH (WIN_A1)
                JR Z,WRCA2
                CP HIGH (WIN_P2)
                JR Z,WRCA2
                LD HL,BB_CPU2
                CP HIGH (WIN_A2)
                JR Z,WRCA2
                CP HIGH (WIN_P2)
                JR NZ,WR_C_D
WRCA2           LD E,B
                PUSH DE
                PUSH HL
                CALL READ_CPU12
                POP HL
                POP DE
                LD (HL),D
                INC HL
                LD (HL),E
                JP WRITE_CPU12

; § ¯¨áì "D" ¢ ¯®àâ (C)
OUT_C_D         LD A,(OLD_DE + 1)
                JR WRCA1

; ¯¥à¥¤ ç  ¡ ©â , ª®¬ ­¤  OUTI
OUT_OUTI        LD HL,(BUFF_SECT)
                EXX
                LD A,(HL)
                INC HL
                EXX
                LD (HL),A
                INC HL
                LD (BUFF_SECT),HL
                RET

; ç⥭¨¥ ¯®àâ  0x1F
IN_1F           LD A,(WR_1F)
                AND %11110000
                CP 0x10
                JR C,.L1                        ; 00-0F ª®¬ ­¤ë ¢®ááâ ­®¢«¥­¨ï
                CP 0x20
                JR C,.L3                        ; 10-1F ª®¬ ­¤ë ¯®¨áª 
                CP 0x80
                JR C,.L5                        ; 20-7F ª®¬ ­¤ë è £ ­¨ï £®«®¢ª¨
                CP 0xC0
                JR C,.L8                        ; 80-BF ª®¬ ­¤ë ç⥭¨ï/§ ¯¨á¨
                CP 0xD0
                JR Z,.L7                        ; D0-DF ª®¬ ­¤ë ¯à¨­ã¤¨â¥«ì­®£® ¯à¥à뢠­¨ï
                XOR A
                JR .L2

; ¯à®¢¥àª  ¢ë室  §  80 ¤®à®¦ªã
.L8             LD A,(PORT_3F)
                CP 80
                LD A,0
                JR C,.L2
                LD A,%00010000                  ; ¯à¨ ã室¥ §  80 ¤®à®¦ªã ¢ë¤ ç  ®è¨¡ª¨ "¬ áᨢ ­¥ ­ ©¤¥­"
                JR .L2

.L7             LD A,0x80
                JR .L2

.L5             LD A,(PORT_3F)
                AND A
                JR NZ,.L1
                LD A,%00100100
                JR .L6

.L3             LD A,(.INDEX)
                XOR %00000100
                JR .L4

.L1             LD A,%00100100
.INDEX          EQU $-1
.L4             XOR %00000010
.L6             LD (.INDEX),A
.L2             LD (RD_1F),A
                LD (OLD_AF + 1),A
                RET

; ç⥭¨¥ ¯®àâ  0x3F
IN_3F           LD A,(PORT_3F)
                LD (OLD_AF + 1),A
                RET

; ç⥭¨¥ ¯®àâ  0x5F
IN_5F           LD A,(PORT_5F)
                LD (OLD_AF + 1),A
                RET

; ç⥭¨¥ ¯®àâ  0x7F
IN_7F           LD A,(PORT_7F)
                LD (OLD_AF + 1),A
                RET

; ç⥭¨¥ ¯®àâ  0xFF
IN_FF           LD A,(RD_FF)
                LD (OLD_AF + 1),A
                RET

; ç⥭¨¥ ¢ "H" ¨§ (‘)
IN_H_C          LD A,(OLD_BC)
; ®¯à¥¤¥«¥­¨¥ ¨§ ª ª®£® ¯®àâ  ç⥭¨¥
                CP 0x1F
                JR NZ,.L2
                LD A,(RD_1F)
                LD (OLD_HL + 1),A
                RET

.L2             CP 0x3F
                JR NZ,.L3
                LD A,(PORT_3F)
                LD (OLD_HL + 1),A
                RET

.L3             CP 0x5F
                JR NZ,.L4
                LD A,(PORT_5F)
                LD (OLD_HL + 1),A
                RET

.L4             CP 0x7F
                JR NZ,.L5
                LD A,(PORT_7F)
                LD (OLD_HL+1),A
                RET

.L5             CP 0xFF
                JR NZ,.L6
                LD A,(RD_FF)
                LD (OLD_HL + 1),A
                RET

.L6             LD BC,(OLD_BC)
                IN A,(C)
                LD (OLD_HL + 1),A
                RET

; ç⥭¨¥ INI
IN_INI          LD HL,(OLD_HL)
                LD A,H
                CP 0x40
                JR C,.L1
                DEC HL
                LD A,(RD_1F)
                LD (HL),A
; ¢à¥¬¥­­®, ¤«ï  ­àë« 
;               LD A,0xD3
;               LD (0x3FD7),A
; ¢à¥¬¥­­®, ¤«ï  ­àë« 
.L1             LD HL,0x2A53
                LD (ADR_EXIT),HL
                JP OUT_1F.INFF_BIT6

WAIT_READ       LD A,(WR_1F)
                AND 0xF0
                CP 0x80
                JP C,OUT_1F.INFF_BIT6
                CP 0xC0
                JR NC,READ_SECTOR.L1
                CALL READ_CPU12                 ; á®åà ­¥­¨¥ ⥪ã饩 ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2
                CALL FIND_SECTOR                ; ¯à®¢¥à塞 ­ «¨ç¨¥ ᥪâ®à 
                PUSH AF
                CALL WRITE_CPU12                ; ¢®ááâ ­®¢«¥­¨¥ ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2
                POP AF
                JR NC,READ_SECTOR_1
; ᥪâ®à  ­¥â, ­¥ ¤®¦¤¥â¥áì
                LD A,0x3C
                JP OUT_1F.INFF_BIT6_1

; ç⥭¨¥ ᥪâ®à  ¨«¨ ¯®à⮢
READ_SECTOR     LD A,(WR_1F)
                AND 0xF0
                CP 0x80
                JP C,OUT_1F.INFF_BIT6
                CP 0xC0
                JR C,READ_SECTOR_1
.L1             CALL READ_CPU12                 ; ç⥭¨¥ ⥪ã饩 ª®­äë
                LD BC,WIN_A1
                LD A,0x40
                OUT (C),A
                LD B,HIGH (WIN_P1)
                LD A,RAM_RAMDISK
                OUT (C),A                       ; áâà ­¨æ  § £®«®¢ª®¢ à ¬¤¨áª 
                LD A,(PORT_3F)                  ; ¢§ï«¨ ­®¬¥à â४ 
                ADD A,A                         ; áâ®à®­ 2
                LD C,A
                LD A,(WR_FF)
                AND 0x10                        ; ¯à®¢¥àª  ª ª ï áâ®à®­  ¤¨áª 
                JR NZ,.L2
                INC C                           ; ¤«ï áâ®à®­ë 1
.L2             LD B,HIGH (CPU1) + 2            ;  ¤à¥á ­ ç «  ¨­äë ® ᥪâ®à å ­  ¤®à®¦ª¥
                LD A,0                          ; ⥪ã騩 ­®¬¥à ᥪâ®à 
.CURR_SEC       EQU $-1
                INC A
                AND %00001111
                LD (.CURR_SEC),A
                ADD A,A
                ADD A,HIGH (CPU1) + 2
                LD B,A
                LD A,(PORT_3F)                  ; ­®¬¥à ¤®à®¦ª¨
                LD C,A
                LD A,(BC)                       ; ¯à®¨çâ «¨ ­®¬¥à ᥪâ®à 
                PUSH AF
                CALL WRITE_CPU12                ; ¢®ááâ ­®¢«¥­¨¥ ª®­äë
                LD A,(PORT_3F)
                LD HL,(OLD_HL)
                LD (HL),A                       ; ­®¬¥à ¤®à®¦ª¨
                INC HL
                LD (HL),0                       ; ­®¬¥à áâ®à®­ë
                INC HL
                POP AF
                LD (HL),A                       ; ­®¬¥à ᥪâ®à 
                INC HL
                LD (HL),0                       ; à §¬¥à ᥪâ®à 
                INC HL
                LD (HL),0                       ; ¡ ©â CRC
                INC HL
                LD (HL),0                       ; ¡ ©â CRC
                INC HL
                LD (OLD_HL),HL
                LD HL,OLD_BC + 1
                LD A,(HL)
                SUB 6                           ; REG B - 6
                LD (HL),A
                LD HL,0x2A53
                LD (ADR_EXIT),HL
                JP OUT_1F.INFF_BIT6

; ç⥭¨¥ ᥪâ®à 
READ_SECTOR_1   XOR A
                JR WRITE_SECTOR_1

; § ¯¨áì ᥪâ®à 
WRITE_SECTOR    LD A,0xFF
WRITE_SECTOR_1  LD (RDWR_MODE),A
                LD A,1
                LD (FLAG_RW_BREAK),A
                LD HL,(OLD_IF)
                PUSH HL
                POP AF
                JP PO,.DI_MODE                  ; ¯à¥à뢠­¨ï à §à¥è¥­ë?
                CP 0x3F
                JR Z,.DI_MODE
                HALT                            ; à §à¥è¥­ë, ¦¤¥¬ ®¡à ¡®â稪 ¯à¥à뢠­¨ï
.DI_MODE        CALL READ_CPU12                 ; á®åà ­¥­¨¥ ⥪ã饩 ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2
                CALL W_WR_RD_SECT
                XOR A
                LD (FLAG_RW_BREAK),A
                LD HL,0x8090
                LD (OLD_AF),HL                  ; í¬ã«ïæ¨ï ä« £  ãᯥ譮£® ç⥭¨ï/§ ¯¨á¨ ᥪâ®à 
                LD HL,0x2A53
                LD (ADR_EXIT),HL
                JP WRITE_CPU12                  ; ¢®ááâ ­®¢«¥­¨¥ ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2

; ¯®¨áª ᥪâ®à  ¢ â ¡«¨æ¥
FIND_SECTOR     LD BC,WIN_A1
                LD A,0x40
                OUT (C),A
                LD B,HIGH (WIN_P1)
                LD A,RAM_RAMDISK
                OUT (C),A                       ; áâà ­¨æ  § £®«®¢ª®¢ à ¬¤¨áª 
                LD A,(PORT_3F)                  ; ¢§ï«¨ ­®¬¥à â४ 
                ADD A,A                         ; áâ®à®­ 2
                LD C,A
                LD A,(WR_FF)
                AND 0x10                        ; ¯à®¢¥àª  ª ª ï áâ®à®­  ¤¨áª 
                JR NZ,.L2
                INC C                           ; ¤«ï áâ®à®­ë 1
.L2             LD B,HIGH (CPU1) + 2            ;  ¤à¥á ­ ç «  ¨­äë ® ᥪâ®à å ­  ¤®à®¦ª¥
                LD HL,(PORT_5F)                 ; ¢§ï«¨ ­®¬¥à ᥪâ®à 
                LD H,0
.L1             LD A,(BC)
                LD D,A                          ; ¢§ï«¨ ­®¬¥à ᥪâ®à 
                INC B
                LD A,(BC)
                LD E,A                          ; ¢§ï«¨ à §¬¥à ᥪâ®à 
                INC B
                LD A,D
                AND A
                SCF
                RET Z                           ; ®è¨¡ª , ᥪâ®à ­¥ ­ ©¤¥­
                LD A,L
                CP D
                RET Z                           ; ᥪâ®à ­ ©¤¥­
                LD A,E
                ADD A,H
                LD H,A
                JR .L1

; ç⥭¨¥ ¨«¨ § ¯¨áì ᥪâ®à  à ¬¤¨áª 
W_WR_RD_SECT    LD A,(WR_FF)
                AND 3
                INC A
                LD B,A
                LD A,%10000000
.L1             RLCA
                DJNZ .L1
                LD B,A
                LD A,(COPY_VIRT_BITS)
                AND B
                JP NZ,MOUNT_RW                  ; à ¡®â  á ¯à¨¬®­â¨à®¢ ­­ë¬ ®¡à §®¬
                CALL FIND_SECTOR
                JR NC,.L2
; ᥪâ®à ­¥ ­ ©¤¥­, ­  ¢ë室
                LD A,0x10
                JP IN_1F.L2

; ᥪâ®à ­ ©¤¥­, ç¨â ¥¬/¯¨è¥¬
.L2             LD A,E
                RRCA
                LD (SECTOR_SIZE),A              ; à §¬¥à ­ ©¤¥­­®£® ᥪâ®à 
                LD L,0
                LD E,L
                SRL H
                RR L                            ; HL = ᬥ饭¨¥ ¢ ¡«®ª å ¤® ­ ©¤¥­­®£® ᥪâ®à 
                LD B,HIGH (CPU1)
                LD A,(BC)
                LD D,A
                ADD HL,DE                       ; HL = ᬥ饭¨¥ ®â ­ ç «  áâà ­¨æë ¢ ¡«®ª å
                INC B
                LD A,(BC)
                LD C,A                          ; ᬥ饭¨¥ ¢ áâà ­¨æ å ®â ­ ç «  à ¬¤¨áª 
                LD A,H
                CP HIGH (CPU1)
                JR C,.L5
                SUB 0x40
                LD H,A
                INC C
; HL = ᬥ饭¨¥ ¢ áâà ­¨æ¥ ¤® ­ ç «  ᥪâ®à 
.L5             LD A,C                          ; ᬥ饭¨¥ ¤® ­®¬¥à  áâà ­¨æë, £¤¥ 㪠§ ­­ë© ᥪâ®à ­ ç¨­ ¥âáï
                ADD A,RAM_DATARAMD              ; ¯à¨¡ ¢¨«¨ ­®¬¥à ­ ç «  à ¬¤¨áª ¨ +1. ¢ 0 áâà ­¨æ¥ à ¬¤¨áª  ®¯¨á â¥«¨ ᥪâ®à®¢
                LD (RDWR_PAGE),A                ; á®åà ­¨«¨ ­®¬¥à ¢ëç¨á«¥­­®© áâà ­¨æë
                LD DE,(OLD_HL)
                LD BC,(BB_CPU1)
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A                       ; ¢¥à­ã«¨ áâ ­¤ àâ­ãî 5 áâà ­¨æã
.S9             LD A,D                          ; ¯à®¢¥àª  £à ­¨æë ®âªã¤ /ªã¤  ª®¯¨à®¢ âì
                CP HIGH (CPU2)
                PUSH DE
                LD DE,CPU1 + HIGH (WIN_P1)
                LD BC,WIN_A1                    ; ¥á«¨ ¢¥àå­¨¥ 32ª¡ ®§ã, â® ­ã¦­® ¢ª«îç¨âì ¢ 1 ®ª­¥ ¯à®¥æ¨à®¢ ­¨ï
                JR NC,.S1
                LD DE,CPU2 + HIGH (WIN_P2)
                LD B,HIGH (WIN_A2)              ; ¥á«¨ ­¨¦­¨¥ 32ª¡ ®§ã, â® ­ã¦­® ¢ª«îç¨âì ¢® 2 ®ª­¥ ¯à®¥æ¨à®¢ ­¨ï
.S1             LD A,0x40
                OUT (C),A
                LD B,E
                LD A,(RDWR_PAGE)                ; ­®¬¥à ¢ëç¨á«¥­­®© áâà ­¨æë ®§ã
                OUT (C),A                       ; ¢ª«î稫¨ ¢ëç¨á«¥­­ãî áâà ­¨æã
                LD B,D                          ; áâ à訩 ¡ ©â  ¤à¥á  ­ ç «  ¢ª«î祭­®© áâà ­¨æë
                POP DE
                LD A,B
                ADD A,H
                LD H,A
                LD A,(RDWR_MODE)
                AND A
                JR NZ,.I1
                LD A,D
                INC A
                JR NZ,.I1
                LD A,E
                AND A
                JR Z,.I1
                NEG
                LD C,A
                LD B,0
                LDIR
                NEG
                LD C,A
.I2             EX DE,HL
                ADD HL,BC
                EX DE,HL
                ADD HL,BC
                LD A,(SECTOR_SIZE)
                JP .S8_

.I1             LD A,D
                CP HIGH (CPU1)
                JR NC,.I3
                LD A,(SECTOR_SIZE)
                AND A
                LD BC,0x80
                JR Z,.I2
                LD BC,0x100
                JR .I2

.I3             CP HIGH (CPU2)                  ; ¯à®¢¥àª  ¯¥à¥å®¤  £à ­¨æë áâà ­¨æ
                JP NC,.S3                       ; ¥á«¨ ¢ëè¥ â® áࠧ㠪®¯¨à㥬
                CP HIGH (CPU2) - 1
                JP C,.S3                        ; ¥á«¨ ­¨¦¥ â ª ¦¥ áࠧ㠪®¯¨à㥬
                LD A,E
                AND A                           ; ¥á«¨ ᥪâ®à ¯®«­®áâìî 㪫 ¤ë¢¥âáï ¤® £à ­¨æë, â® áࠧ㠪®¯¨à㥬
                JR Z,.S3                        ; ¨­ ç¥ ¯à¨­ã¤¨â¥«ì­® ª®¯¨à㥬 ¢ ¤¢  ¯à¨¥¬ 
                LD A,(RDWR_MODE)                ; ç⥭¨¥ ¨«¨ § ¯¨áì?
                AND A
                LD A,E                          ; ¬« ¤è¨© ¡ ©â  ¤à¥á ¢ ¡«®ª¥
                JR Z,.S4
                EX DE,HL                        ; ¤«ï § ¯¨á¨ ¬¥­ï¥¬ ­ ¯à ¢«¥­¨¥
.S4             NEG
                LD C,A                          ; ª®¯¨à㥬 ®áâ â®ª ¤® ª®­æ  ¡«®ª 
                LD B,0
                LDIR
                NEG
                PUSH AF                         ; á¯àïâ «¨ ᪮«ìª® ®áâ «®áì ª®¯¨à®¢ âì ¨§ ­ ç «  á«¥¤ãî饣® ¡«®ª 
                LD BC,(BB_CPU2)
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A
                LD B,HIGH (WIN_A1)
                LD A,0x40
                OUT (C),A
                LD B,HIGH (WIN_P1)
                LD A,(RDWR_PAGE)
                OUT (C),A                       ; ¢ëç¨á«¥­­ãî áâà ­¨æã ¢ª«îç ¥¬ ¢ 1 ®ª­¥ ¯à®¥æ¨à®¢ ­¨ï
                LD A,(RDWR_MODE)                ; ç⥭¨¥ ¨«¨ § ¯¨áì
                AND A
                JR Z,.S5
                LD A,D                          ; ¤«ï § ¯¨á¨
                SUB 0x40                        ; ¨§¬¥­¨«¨  ¤à¥á ªã¤  ª®¯¨à®¢ âì ­  ¤à㣮¥ ®ª­® ¯à®¥æ¨à®¢ ­¨ï
                LD D,A
                JR .S6

.S5             LD A,H                          ; ¤«ï ç⥭¨ï
                SUB 0x40                        ; ¨§¬¥­¨«¨  ¤à¥á ªã¤  ª®¯¨à®¢ âì ­  ¤à㣮¥ ®ª­® ¯à®¥æ¨à®¢ ­¨ï
                LD H,A
.S6             POP AF
                LD C,A                          ; ᪮«ìª® ®áâ «®áì ᪮¯¨à®¢ âì ¡ ©â
                LD B,0
                LDIR
                LD A,(SECTOR_SIZE)
                JR .S8_

.S3             LD A,(RDWR_MODE)                ; ç⥭¨¥ ¨«¨ § ¯¨áì
                AND A
                JR Z,.S7
                EX DE,HL                        ; ¤«ï § ¯¨á¨ ¬¥­ï¥¬ ­ ¯à ¢«¥­¨¥
.S7             LD A,(SECTOR_SIZE)
                AND A
                JR NZ,.S8
                CALL COPYHBLOCK                 ; ¤«ï ᥪâ®à  à §¬¥à®¬ 128 ¡ ©â ª®¯¨à㥬 ¯®«®¢¨­ã ¨ ¢ë室¨¬
.ECOPY_BLOCK    LD A,(RDWR_MODE)
                AND A
                JR Z,.ECOPY_BLOCK1
                EX DE,HL
.ECOPY_BLOCK1   LD (OLD_HL),DE
                RET

.S8             CALL COPY_BLOCK                 ; ¤«ï ᥪâ®à  256 ¡ ©â ª®¯¨à㥬 ¢¥áì ¨ ¢ë室¨¬
.S8_            DEC A
                JR Z,.ECOPY_BLOCK
                LD (SECTOR_SIZE),A
                LD A,(RDWR_MODE)
                AND A
                JR Z,.S0
                EX DE,HL
.S0             LD A,0x3F
                AND H
                LD H,A
                JP .S9

COPY_BLOCK
        REPT 128
                LDI
        ENDM
COPYHBLOCK
        REPT 128
                LDI
        ENDM
                RET

; ¯à®¢¥àª  ­ «¨ç¨ï ¬ àª¥à  à ¬¤¨áª 
CMP_RAM_DISK    CALL READ_CPU12
                LD BC,WIN_P1
                LD A,RAM_RAMDISK
                OUT (C),A
                LD HL,CPU1 + 0x3FFF
                LD D,(HL)
                DEC H
                LD E,(HL)                       ; ¢§ï«¨ ¡ ©âë ¤«ï ¯à®¢¥àª¨ ¬ àª¥à 
                CALL WRITE_CPU12
                LD HL,"RD"
                AND A
                SBC HL,DE
                RET Z                           ; ¥á«¨ ¬ àª¥à ­  ¬¥áâ¥, â® à ¬¤¨áª  ­¥ ᮧ¤ ¥¬
; ᮧ¤ ­¨¥ ç¨á⮣® à ¬¤¨áª 
CREATE_TRDTABL  LD BC,WIN_P1
                LD A,RAM_RAMDISK                ; ­ã¦­  áâà ­¨æ  ­ ç «  à ¬¤¨áª , £¤¥ ¡ã¤¥â â ¡«¨æ  ®¯¨á â¥«¥©
                OUT (C),A
                LD HL,CPU1
                PUSH HL
                LD DE,CPU1 + 1
                LD BC,0x3FFF
                LD (HL),L
                LDIR                            ; ®ç¨á⨫¨ áâà ­¨æã
                POP DE                          ;  ¤à¥á ­ ç «  áâà ­¨æë
                LD HL,0                         ; ᬥ饭¨¥ ¢ ¡«®ª å ¨ áâà ­¨æ å
                LD A,0xA0
ELT2            PUSH AF
                LD BC,0x1000                    ; áç¥â稪 ­®¬¥à®¢ ᥪâ®à®¢ ¨ ¨å ­®¬¥à 
                LD A,L
                RRCA
                RRCA
                LD (DE),A                       ; ᬥ饭¨¥ ¢ ¡«®ª å ¤®à®¦ª¨ ¢ áâà ­¨æ¥
                INC D
                LD A,H
                LD (DE),A                       ; ᬥ饭¨¥ ¢ áâà ­¨æ å ¤® ¤®à®¦ª¨
                INC D
ELT1            INC C
                LD A,C
                LD (DE),A                       ; ­®¬¥à ᥪâ®à 
                INC D
                LD A,2
                LD (DE),A                       ; à §¬¥à ᥪâ®à 
                INC D
                DJNZ ELT1                       ; ¢­®á¨¬ ¢ â ¡«¨æ㠢ᥠ­®¬¥à  ᥪâ®à®¢ á à §¬¥à ¬¨
                LD D,HIGH (CPU1)                ; ¢¥à­ã«¨ 㪠§ â¥«ì ¢ ­ ç «®
                INC E                           ; ¤«ï á«¥¤ãî饩 ¤®à®¦ª¨
                LD BC,0x40
                ADD HL,BC                       ; ¯¥à¥å®¤ ª á«¥¤ãî饩 ¤®à®¦ª¥
                POP AF
                DEC A
                JR NZ,ELT2                      ; ¯®¢â®à塞 ¤«ï ¢á¥å ¤®à®¦¥ª
                LD HL,CPU1 + 0x3FFF
                LD (HL),"R"                     ; ¢­®á¨¬ ¬ àª¥à à ¬¤¨áª 
                DEC H
                LD (HL),"D"
                LD BC,WIN_P1
                LD A,RAM_DATARAMD
                OUT (C),A
                LD HL,CPU1
                LD DE,CPU1 + 1
                LD BC,0x0FFF
                LD (HL),L
                LDIR
                LD HL,DSKINFO
                LD DE,CPU1 + 0x08E1
                LD BC,DSK_END - DSKINFO
                LDIR
; ¢®ááâ ­®¢«¥­¨¥ ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2
WRITE_CPU12     LD BC,(BB_CPU1)
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A
                LD BC,(BB_CPU2)
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A
                RET

; ç⥭¨¥ ⥪ã饣® ª®­ä¨£  áâà ­¨æ ¯à®¥æ¨à®¢ ­¨ï 1,2
READ_TMP_CPU12  LD HL,(BB_CPU1)
                PUSH HL
                LD HL,(BB_CPU2)
                PUSH HL
                CALL READ_CPU12
                LD HL,(BB_CPU1)
                LD (TMP_BB_CPU1),HL
                LD HL,(BB_CPU2)
                LD (TMP_BB_CPU2),HL
                POP HL
                LD (BB_CPU2),HL
                POP HL
                LD (BB_CPU1),HL
                JR WRITE_CPU12

; ¢®ááâ ­®¢«¥­¨¥ ⥪ã饩 ª®­ä¨£ãà æ¨¨ áâà ­¨æ ¯à®¥æ¨à®¢ ­¨ï 1,2
WRITE_TMP_CPU12 LD BC,0
TMP_BB_CPU1     EQU $-2
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A
                LD BC,0
TMP_BB_CPU2     EQU $-2
                LD A,C
                LD C,LOW (WIN_A0)
                OUT (C),A
                RET

; ç⥭¨¥ ª®­ä¨£ãà æ¨¨ ®ª®­ ¯à®¥æ¨à®¢ ­¨ï 1,2
READ_CPU12      LD BC,RD_RAMNROM
                IN L,(C)                        ; ¡¨âë RAM & ROM
                INC B
                IN H,(C)                        ; ¡¨âë DOS & 7FFD
                ADD HL,HL
                LD B,HIGH (RD_1WINA1)
                IN A,(C)
                CP 0xC0
                JR NC,.L1
                LD E,A
                LD D,HIGH (WIN_P1)
                JR .L2

.L1             RLCA
                RLCA
                SLA L
                RRA
                SLA H
                RRA
                LD E,A
                LD D,HIGH (WIN_A1)
.L2             LD (BB_CPU1),DE
                INC B
                IN A,(C)
                CP 0xC0
                JR NC,.L3
                LD E,A
                LD D,HIGH (WIN_P2)
                JR .L4

.L3             RLCA
                RLCA
                SLA L
                RRA
                SLA H
                RRA
                LD E,A
                LD D,HIGH (WIN_A2)
.L4             LD (BB_CPU2),DE
                RET

; ¯à®¢¥àª  ­ «¨ç¨ï ¢¨àâã «ì­®£® ¤¨áª 
DISK_NONE       PUSH HL
                PUSH BC
                CALL READ_CPU12
                LD BC,WIN_A1
                LD A,0x40
                OUT (C),A
                LD B,HIGH (WIN_P1)
                LD A,RAM_RAMDISK
                OUT (C),A
                LD HL,CPU1 + 0x3FFF
                LD A,(HL)
                DEC H
                CP "R"
                SCF
                JR NZ,DISK_NONE1
                LD A,(HL)
                CP "D"
                SCF
                JR NZ,DISK_NONE1
                XOR A
DISK_NONE1      PUSH AF
                CALL WRITE_CPU12
                POP AF
                POP BC
                POP HL
                RET

; ­  ¢å®¤¥: H- ¤à¥á ï祩ª¨
;           L-¯à®ç¨â ­­®¥ §­ ç¥­¨¥
READCMOS        PUSH BC
                LD BC,CMOSD_SET_ADR
                OUT (C),H
                LD B,HIGH (CMOSD_RD_WR)
                IN L,(C)
                POP BC
                LD A,L
                AND A
                RET

        JP_EMU 0x3C30                           ; IN    A, (0x1F)

                DUPL 0x3D2F - $,0
                NOP
                RET

        JP_EMU 0x3D4D                           ; OUT      (0xFF), A
        JP_EMU 0x3D9A                           ; OUT      (0x1F), A
        JP_EMU 0x3DA6                           ; IN    A, (0xFF)
        JP_EMU 0x3DB5                           ; IN    A, (0x1F)
        JP_EMU 0x3DBA                           ; IN    A, (0x1F)
        JP_EMU 0x3DD5                           ; OUT      (0xFF), A
        JP_EMU 0x3E30                           ; IN    A, (0x1F)
        JP_EMU 0x3E3A                           ; IN    A, (0x1F)
        JP_EMU 0x3E44                           ; OUT      (0x7F), A

                DUPL 0x3E49 - $,0
                JP ADR_0x3E4C                   ; ¤«ï  ¤à¥á  0x3E4C

;               JP_EMU 0x3E4C                   ; OUT      (0x7F), A
                DUPL 0x3E4C - $,0
                OUT (EXIT_PORT),A
                JR 0x3E49

        JP_EMU 0x3E50                           ; IN    A, (0x3F)
        JP_EMU 0x3E78                           ; IN    A, (0x3F)
        JP_EMU 0x3E7E                           ; OUT      (0x3F), A
        JP_EMU 0x3E87                           ; IN    A, (0x3F)
        JP_EMU 0x3E95                           ; OUT      (0x3F), A
        JP_EMU 0x3EB5                           ; IN    A, (0x1F)
        JP_EMU 0x3EBC                           ; IN    A, (0x3F)
        JP_EMU 0x3EC9                           ; OUT      (0x1F), A
        JP_EMU 0x3ECE                           ; IN    A, (0xFF)
        JP_EMU 0x3EDF                           ; OUT      (0x1F), A

                DUPL 0x3EF3 - $,0               ; IN    H, (C)
                OUT (EXIT_PORT),A
                JR JUMP_0x3EF3

                JR JUMP_0x3EF5                  ; IN    A, (0xFF)

EXIT_0x3EF5     OUT (EXIT_PORT),A
JUMP_0x3EF5     JP ADR_0x3EF5

;       JP_EMU 0x3EF5                           ; IN    A, (0xFF)
        JP_EMU 0x3EFE                           ; IN    A, (0x7F)

JUMP_0x3EF3     JP ADR_0x3EF3

                JP_EMU 0x3F1B                   ; OUT      (0x5F), A
                JP_EMU 0x3F25                   ; OUT      (0x1F), A
                JP_EMU 0x3F33                   ; IN    A, (0x1F)

                DUPL 0x3F40 - $,0               ; ¤«ï  ¤à¥á  0x3EF3
                JP ADR_0x3EF3

        JP_EMU 0x3F4D                           ; OUT      (0x1F), A
        JP_EMU 0x3F55                           ; IN    A, (0x3F)
        JP_EMU 0x3F5A                           ; IN    A, (0x5F)
        JP_EMU 0x3F69                           ; IN    A, (0x3F)
        JP_EMU 0x3F72                           ; IN    A, (0x5F)

        JP_EMU 0x3FBC                           ; IN    A, (0xFF)       ;§ ¯¨áì ᥪâ®à 

                DUPL 0x3FC7 - $,0
JUMP_0x3FF0     JP ADR_0x3FF0

        JP_EMU 0x3FCA                           ; IN    A, (0xFF)       ;§ ¯¨áì ᥪâ®à 
        JP_EMU 0x3FD1                           ; OUTI                  ;§ ¯¨áì ᥪâ®à 

        JP_EMU 0x3FD7                           ; IN    A, (0xFF)       ;ç⥭¨¥ ᥪâ®à 

JUMP_0x3FEC     JP ADR_0x3FEC
JUMP_0x3FF3     JP ADR_0x3FF3

        JP_EMU 0x3FE5                           ; IN    A, (0xFF)       ;ç⥭¨¥ ᥪâ®à 

;       JP_EMU 0x3FEC                           ; INI                   ;ç⥭¨¥ ᥪâ®à 
                DUPL 0x3FEC - $,0
                OUT (EXIT_PORT),A
                JR JUMP_0x3FEC

;               DUPL 0x3FF0 - $,0               ; OUT      (C), A
                OUT (EXIT_PORT),A
                DB 0x18                         ; JR 0x3FC7

;               DUPL 0x3FF5 - $,0               ; IN    A, (C)
                OUT (EXIT_PORT),A
                JP JUMP_0x3FF3

                DUPL 0x3FF8 - $,0
                DB "EVOSFE"
                DW DATA_VERS