Rev 832 |
Rev 999 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
| ?url?
;LAST UPDATE: 04.08.2019 savelij
TITLE "virtual.a80"
DB 0XFF ;DCU
;[
256 ]
COPY_BLOCK REPT 128 ;
256
LDI
ENDM
COPYHBLOCK REPT 126
LDI
ENDM
JR COPY_BLOCK1
DW 0XFFFF ;
IM2 I=9
COPY_BLOCK1 LDI
LDI
RET
;®¬¥à ¢ãâ२å äãªæ¨©
INIT_VAR
SETVAR _OUT_1F
SETVAR _OUT_3F
SETVAR _OUT_5F
SETVAR _OUT_7F
SETVAR _OUT_FF
SETVAR _OUTI
SETVAR _IN_1F
SETVAR _IN_3F
SETVAR _IN_5F
SETVAR _IN_7F
SETVAR _IN_FF
SETVAR _INI
SETVAR _OUT_C_D
SETVAR _IN_H_C
SETVAR _WR_RD_SECT
SETVAR _CMP_RAMDISK
SETVAR _SET_VIRT_BITS
SETVAR WOUTCA
SETVAR WWRITE_SEC_
SETVAR WREAD_SEC_
SETVAR WINI_RET
; ¤à¥á ¢ãâ२å äãªæ¨©
;[
]
W_DATA DW W_OUT1F ;00 1F
DW W_OUT3F ;01 3F
DW W_OUT5F ;02 5F
DW W_OUT7F ;03 7F
DW W_OUTFF ;04 FF
DW W_OUTI ;05 OUTI
DW W_IN1F ;06
1F
DW W_IN3F ;07
3F
DW W_IN5F ;08
5F
DW W_IN7F ;09
7F
DW W_INFF ;0A
FF
DW W_INI ;0B INI
DW W_OUTCD ;0C
'D' 'BC'
DW W_INHC ;0D
'H' 'BC'
DW READ_WRITE_SEC ;0E
/
DW CMP_RAM_DISK ;12
RAM
DW SET_VIRT_BITS ;13
RST 8
EW_DATA
;[
]
DW W_OUTCA ;13
'A' 'BC'
DW WRITE_SEC_ ;14
DW READ_SEC_ ;15
DW W_INI ;16 INI
TEXT4VIRTDRV DB 0X16,ZASTV_Y+2,1
TXT4VIRTDRV DC "Virtual Drive: "
ETXT4VIRTDRV
DOS_NOEMUL DB ROM_BAS48 | 0X80 ; DOS
3D13
DOS_EMUL DB ROM_ADD_BAS48 | 0X80 ; DOS
NUM_ALT_PAGE IF EMU3D2F=1
DB ROM_ADD_BAS48 | 0X80
ELSE
DB ROM_BAS48 | 0X80
ENDIF
;[ RST 30]
RST30_WORK EX (SP),HL
PUSH AF
PUSH BC
LD A,I
JP PE,RST30_WORK1
LD A,I
RST30_WORK1 DI
PUSH AF
LD A,(NUM_ALT_PAGE) ;
PUSH AF
AND 0X3E ;
LD BC,WIN_A0
OUT (C),A
LD B,HIGH (WIN_P0)
LD A,RAM_EVODOS
OUT (C),A
IN A,(PEVO_CONF)
LD (WR_BF),A
OR 1
OUT (PEVO_CONF),A
POP AF
LD (TEK_ROMPAGE),A
LD A,(HL)
LD (DOS_STEK),SP
LD SP,DOS_STEK
PUSH HL ; HL=
PUSH DE
LD HL,(DOS_STEK)
LD DE,REG_IF
REPT 8
LDI
ENDM
LD HL,EXIT_RST30
PUSH HL ;
LD HL,W_DATA
ADD A,A
ADD A,L
LD L,A
LD A,(HL)
INC L
LD H,(HL)
LD L,A
JP (HL)
EXIT_RST30 LD HL,REG_IF
LD DE,(DOS_STEK)
REPT 8
LDI
ENDM
POP DE
POP HL
LD SP,(DOS_STEK)
LD A,(HL)
INC HL
CP LOW ((EW_DATA-W_DATA)/2)
JR C,EXIT_RST302
LD HL,FOR_RET ;
EXIT_RST302 PUSH HL
LD HL,(COPY_VIRT_BITS)
LD A,(MASK_MNT_DRV)
AND L
LD A,ROM_ADD_BAS48 | 0X80 ; 3D2F
JR NZ,EXIT_RST305 ; ROM 3D2F
LD HL,(VIRT_DRIVE) ;
LD A,(MASK_WRK_DRV)
CP L
LD A,ROM_ADD_BAS48 | 0X80 ; 3D2F
JR Z,EXIT_RST305
LD A,ROM_BAS48 | 0X80 ; 3D13
EXIT_RST305 LD HL,(WR_BF)
LD BC,WIN_A0
EXIT_RST303 CALL WR_BYTE_RET
LD A,L
POP HL
OUT (PEVO_CONF),A
POP AF
JP PO,EXIT_RST304
EI
EXIT_RST304 POP BC
POP AF
EX (SP),HL
RET
;[ "A" 0X1F]
W_OUT1F LD A,(REG_A)
LD (WR_1F),A
CP 0X10
JR NC,W_OUT1F10
;00-0F
XOR A
LD (PORT_3F),A
LD (PORT_5F),A
OUT (0X3F),A
OUT (0X5F),A
JR INFF_BIT6
W_OUT1F10 CP 0X20
JR NC,W_OUT1F20
;10-1F
LD A,(PORT_7F)
LD (PORT_3F),A
OUT (0X3F),A
CALL DISK_NONE
LD A,0X80
JR C,INFF_BIT61
INFF_BIT6 XOR A
INFF_BIT61 LD (RD_1F),A
LD A,0XBF
LD (RD_FF),A
RET
W_OUT1F20 CP 0X40
JR NC,W_OUT1F40
;20-3F
LD A,(PORT_3F)
NAPRAVL NOP
LD (PORT_3F),A
OUT (0X3F),A
JR INFF_BIT6
W_OUT1F40 CP 0X60
JR NC,W_OUT1F60
;40-5F
LD A,(PORT_3F)
INC A
LD (PORT_3F),A
OUT (0X3F),A
LD A,0X3C
LD (NAPRAVL),A
JR INFF_BIT6
W_OUT1F60 CP 0X80
JR NC,W_OUT1F80
;60-7F
LD A,(PORT_3F)
DEC A
LD (PORT_3F),A
OUT (0X3F),A
LD A,0X3D
LD (NAPRAVL),A
JR INFF_BIT6
W_OUT1F80 CP 0XA0
JR NC,W_OUT1FA0
;80-9F
JR INFF_BIT6
W_OUT1FA0 CP 0XC0
JR NC,W_OUT1FD0
;A0-BF
JR INFF_BIT6
INFF_BIT7 XOR A
LD (RD_1F),A
LD A,0X7F
LD (RD_FF),A
RET
W_OUT1FD0 CP 0XD0
JR NC,W_OUT1FE0
;C0-CF
JR INFF_BIT6
W_OUT1FE0 CP 0XE0
JR NC,W_OUT1FF0
;D0-DF
LD A,0XBF
LD (RD_FF),A
RET
W_OUT1FF0 CP 0XF0
JR C,INFF_BIT6
;E0-EF
JR INFF_BIT6
;[ "A" 0X3F]
W_OUT3F LD A,(REG_A)
LD (PORT_3F),A
OUT (0X3F),A
RET
;[ "A" 0X5F]
W_OUT5F LD A,(REG_A)
LD (PORT_5F),A
OUT (0X5F),A
RET
;[ "A" 0X7F]
W_OUT7F LD A,(REG_A)
LD (PORT_7F),A
OUT (0X7F),A
RET
;[ "A" 0XFF]
W_OUTFF LD A,(REG_A)
LD (WR_FF),A
OUT (0XFF),A
AND 3
LD (MASK_WRK_DRV),A ;®¬¥à ¤¨áª®¢®¤
INC A
LD B,A
LD A,%00001000
.L1 RLCA
DJNZ .L1
LD (MASK_MNT_DRV),A ;¬ ᪠ᬮâ¨à®¢ ®£® ¤¨áª®¢®¤
RET
;[ "A" (C)]
W_OUTCA LD A,(REG_A)
W_OUTCA1 LD D,A
LD BC,(REG_C) ;
TR-DOS
LD A,C
;
CP 0X1F
JP Z,W_OUT1F
CP 0X3F
JR Z,W_OUT3F
CP 0X5F
JR Z,W_OUT5F
CP 0X7F
JR Z,W_OUT7F
CP 0XFF
JR Z,W_OUTFF
CP LOW (WIN_A0)
JR Z,W_OUTCA3
W_OUTCA4 OUT (C),D
RET
;[ ATM/PENTEVO]
W_OUTCA3 LD A,B
LD HL,BB_CPU1
CP HIGH (WIN_A1)
JR Z,W_OUTCA2
CP HIGH (WIN_P2)
JR Z,W_OUTCA2
LD HL,BB_CPU2
CP HIGH (WIN_A2)
JR Z,W_OUTCA2
CP HIGH (WIN_P2)
JR NZ,W_OUTCA4
W_OUTCA2 LD E,B
PUSH DE
PUSH HL
CALL READ_WCPU12
POP HL
POP DE
LD (HL),D
INC HL
LD (HL),E
JP WRITE_WCPU12
;[ "D" (C)]
W_OUTCD LD A,(IREG_D)
JR W_OUTCA1
;[
, OUTI]
W_OUTI LD HL,(BUFF_SECT)
EXX
LD A,(HL)
INC HL
EXX
LD (HL),A
INC HL
LD (BUFF_SECT),HL
RET
;[
0X1F]
W_IN1F LD A,(WR_1F)
AND 0XF0
CP 0X10
JR C,W_IN1F1
CP 0X20
JR C,W_IN1F3
CP 0XD0
JR Z,W_IN1F1
XOR A
JR W_IN1F2
W_IN1F3 LD A,(INDEX)
XOR %00000100
JR W_IN1F4
W_IN1F1 LD A,0X24
INDEX EQU $-1
W_IN1F4 XOR %00000010
LD (INDEX),A
W_IN1F2 LD (RD_1F),A
LD (REG_A),A
RET
;[
0X3F]
W_IN3F LD A,(PORT_3F)
LD (REG_A),A
RET
;[
0X5F]
W_IN5F LD A,(PORT_5F)
LD (REG_A),A
RET
;[
0X7F]
W_IN7F LD A,(PORT_7F)
LD (REG_A),A
RET
;[
0XFF]
W_INFF LD A,(RD_FF)
LD (REG_A),A
RET
;[
"H" ()]
W_INHC LD A,(REG_C)
;[
]
W_INHC1 CP 0X1F
JR NZ,W_INHC2
LD A,(RD_1F)
LD (REG_H),A
RET
W_INHC2 CP 0X3F
JR NZ,W_INHC3
LD A,(PORT_3F)
LD (REG_H),A
RET
W_INHC3 CP 0X5F
JR NZ,W_INHC4
LD A,(PORT_5F)
LD (REG_H),A
RET
W_INHC4 CP 0X7F
JR NZ,W_INHC5
LD A,(PORT_7F)
LD (REG_H),A
RET
W_INHC5 CP 0XFF
JR NZ,W_INHC6
LD A,(WR_FF)
LD (REG_H),A
RET
W_INHC6 LD BC,(REG_C)
IN A,(C)
LD (REG_H),A
RET
;[
INI]
W_INI LD A,(RD_1F)
LD HL,(REG_L)
LD (HL),A
INC HL
DEC B
LD (REG_L),HL
RET
;[
]
READ_SEC_ LD A,(WR_1F)
AND 0X0F0
CP 0X80
JP C,INFF_BIT6
CP 0XC0
JR NZ,READ_SEC_1
LD A,(PORT_3F)
LD HL,(REG_L)
LD (HL),A
INC HL
DEC B
LD A,(PORT_5F)
LD (HL),A
INC HL
DEC B
LD (REG_L),HL
RET
;[
/
]
;IXL=0-
, =FF-
READ_WRITE_SEC PUSH IX
JR WRITE_SEC_1
;[
]
READ_SEC_1 PUSH IX
LD IXL,0
JR WRITE_SEC_1
;[
]
WRITE_SEC_ PUSH IX
LD IXL,0XFF
WRITE_SEC_1 CALL READ_WCPU12
CALL W_WR_RD_SECT
LD IX,0X8090
LD (REG_F),IX ;
/
CALL WRITE_WCPU12
POP IX
RET
;[
]
W_WR_RD_SECT LD A,(WR_FF)
AND 3
INC A
LD B,A
LD A,(COPY_VIRT_BITS)
REPT 5
RRCA
ENDM
DJNZ $-1
JP C,WR_RD_SEC_M ;
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,WWRRD1
INC C ; 1
WWRRD1 LD B,HIGH (CPU1)+2 ;
LD A,(PORT_5F) ;
LD L,A
LD H,0
WWRRD3 LD A,(BC)
LD D,A ;
INC B
LD A,(BC)
LD E,A ;
INC B
; LD A,D
; AND A
; JR Z,WWRRD_ERR
LD A,L
CP D
JR Z,WWRRD2
LD A,E
ADD A,H
LD H,A
JR WWRRD3
WWRRD2 LD A,E
RRCA
LD (PORT_7F),A
OUT (0X7F),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,WWRRD5
SUB 0X40
LD H,A
INC C
;HL=
WWRRD5 LD A,C ;
,
ADD A,RAM_DATARAMD ;
+1. 0
LD IXH,A ;
LD DE,(REG_L)
LD BC,(BB_CPU1)
LD A,C
LD C,LOW (WIN_A0)
OUT (C),A ;
5
SP_RAMD9 LD A,D ;
/
CP HIGH (CPU2)
PUSH DE
LD DE,CPU1+HIGH (WIN_P1)
LD BC,WIN_A1 ;
32 , 1
JR NC,SP_RAMD1
LD DE,CPU2+HIGH (WIN_P2)
LD B,HIGH (WIN_A2) ;
32 , 2
SP_RAMD1 LD A,0X40
OUT (C),A
LD B,E
LD A,IXH ;
OUT (C),A ;
LD B,D ;
POP DE
LD A,B
ADD A,H
LD H,A
LD A,IXL
AND A
JR NZ,IN_ROM1
LD A,D
INC A
JR NZ,IN_ROM1
LD A,E
AND A
JR Z,IN_ROM1
IN_ROM4 NEG
LD C,A
LD B,0
LDIR
NEG
LD C,A
IN_ROM2 EX DE,HL
ADD HL,BC
EX DE,HL
ADD HL,BC
LD A,(PORT_7F)
JP SP_RAMD8_
IN_ROM1 LD A,D
CP HIGH (CPU1)
JR NC,IN_ROM3
LD A,(PORT_7F)
AND A
LD BC,0X80
JR Z,IN_ROM2
LD BC,0X100
JR IN_ROM2
IN_ROM3 CP HIGH (CPU2) ;
JP NC,SP_RAMD3 ;
CP HIGH (CPU2)-1
JP C,SP_RAMD3 ;
LD A,E
AND A ;
,
JR Z,SP_RAMD3 ;
LD A,IXL ;
?
AND A
LD A,E ;
JR Z,SP_RAMD4
EX DE,HL ;
SP_RAMD4 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,IXH
OUT (C),A ;
1
LD A,IXL ;
AND A
JR Z,SP_RAMD5
LD A,D ;
SUB 0X40 ;
LD D,A
JR SP_RAMD6
SP_RAMD5 LD A,H ;
SUB 0X40 ;
LD H,A
SP_RAMD6 POP AF
LD C,A ;
LD B,0
LDIR
LD A,(PORT_7F)
JR SP_RAMD8_
SP_RAMD3 LD A,IXL ;
AND A
JR Z,SP_RAMD7
EX DE,HL ;
SP_RAMD7 LD A,(PORT_7F)
AND A
JR NZ,SP_RAMD8
CALL COPYHBLOCK ;
128
ECOPY_BLOCK LD A,IXL
AND A
JR Z,ECOPY_BLOCK1
EX DE,HL
ECOPY_BLOCK1 LD (REG_L),DE
RET
SP_RAMD8 CALL COPY_BLOCK ;
256
SP_RAMD8_ DEC A
JR Z,ECOPY_BLOCK
LD (PORT_7F),A
OUT (0X7F),A
LD A,IXL
AND A
JR Z,SP_RAMD0
EX DE,HL
SP_RAMD0 LD A,0X3F
AND H
LD H,A
JP SP_RAMD9
CP_TYPEDRIVE PUSH BC
PUSH HL
LD H,VIRT_REAL_DRIVE
CALL READCMOS
POP HL
AND 3
LD B,A
LD A,(TRD_5CF6)
CP B
POP BC
RET
;[
]
SET_DRIVENAME LD H,VIRT_REAL_DRIVE
CALL READCMOS
RRCA
RRCA
AND 3
LD (TRD_5D19),A
LD (TRD_5CF6),A
OR 0X3C
LD (TRD_5D16),A
RET
;[
RAM ]
FORMAT_RAM LD A,(TRD_5CF6)
LD B,A
INC B
LD A,%00001000
RLCA
DJNZ $-1
LD B,A
; LD A,(COPY_VIRT_BITS)
RST8D _MOUNTER,_GET_VIRT_BITS
LD (COPY_VIRT_BITS),A
AND B
JR NZ,FORMAT_RAM3 ;
=1
CALL CP_TYPEDRIVE
RET NZ ;
CALL CREATE_TRDTABL ;
XOR A
RET
FORMAT_RAM3 LD HL,TRD_5D25
LD DE,TRD_5D26
LD BC,0XFF
LD (HL),B
LDIR
LD D,B
LD E,B
LD B,0X10
FORMAT_RAM1 PUSH BC
PUSH DE
LD B,1
LD HL,TRD_5D25
CALL COM_06
POP DE
POP BC
INC E
DJNZ FORMAT_RAM1
XOR A
RET
;[
]
CMP_RAM_DISK CALL READ_WCPU12
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_WCPU12
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+0X8E1
LD BC,DSK_END-DSKINFO
LDIR
LD BC,WIN_A1
LD A,0X7A
OUT (C),A
RET
;[
1,2]
WRITE_WCPU12 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_WCPU12 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,RST30_01
LD E,A
LD D,HIGH (WIN_P1)
JR RST30_02
RST30_01 RLCA
RLCA
SLA L
RRA
SLA H
RRA
LD E,A
LD D,HIGH (WIN_A1)
RST30_02 LD (BB_CPU1),DE
INC B
IN A,(C)
CP 0XC0
JR NC,RST30_03
LD E,A
LD D,HIGH (WIN_P2)
JR RST30_04
RST30_03 RLCA
RLCA
SLA L
RRA
SLA H
RRA
LD E,A
LD D,HIGH (WIN_A2)
RST30_04 LD (BB_CPU2),DE
RET
DISK_NONE PUSH HL
PUSH BC
CALL READ_WCPU12
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_WCPU12
POP AF
POP BC
POP HL
RET
SET_RWPORT0 RST8D _MOUNTER,_MOUNT_RAMDISK
RST30 _SET_VIRT_BITS
RET
SET_VIRT_BITS LD A,(REG_A)
LD (COPY_VIRT_BITS),A
LD C,A
AND 3
LD (VIRT_DRIVE),A
LD A,C
RRCA
RRCA
AND 3
LD (REAL_DRIVE),A
RET