;-- TURBO DISK UTILITY 2.1 --
;1997 Red Ltd Drunkards group/RPSG
;2003 Deadie/HorrorSoft/CPU

	ORG #6000

WORK	EQU 1 ;0=LINK
BREAK	EQU #1F54
BR	EQU #40	 ;મ
DEF_COL	EQU 5	 ;㡮
WR_COL	EQU 2|BR ;
WRCOL	EQU 2*8|BR
RD_COL	EQU 4|BR ;
RDCOL	EQU 4*8|BR
VF_COL	EQU 6|BR ;
VFCOL	EQU 6*8|BR
FM_COL	EQU 7|BR ;

NULSTART
	LD HL,IMG_TRK:LD DE,CRT_CAT
	LD BC,BLEN:LDIR

	DI
	LD (ABORT+1),SP

START
	CALL RESET_WG:CALL INIT_WG
	CALL CLS
	LD HL,#5800:LD (HL),0
	CALL ANYKEY

	LD HL,TITLE0
	LD DE,#4005:CALL PR_STRING
	LD HL,TITLE1
	LD DE,#4020:CALL PR_STRING

	LD HL,LPAGES
	LD DE,#406A:CALL PR_STRING
	LD HL,LTRACKS
	LD DE,#4085:CALL PR_STRING
	LD HL,LLAG
	LD DE,#4093:CALL PR_STRING

	LD HL,LCHGDSK
	LD DE,#40C8:CALL PR_STRING
	LD HL,LFORMAT
	LD DE,#40E8:CALL PR_STRING
	LD HL,LCHECK
	LD DE,#4808:CALL PR_STRING
	LD HL,LRESTOR
	LD DE,#4828:CALL PR_STRING
	LD HL,LCOPFRM
	LD DE,#4848:CALL PR_STRING
	LD HL,LCOPY
	LD DE,#4868:CALL PR_STRING
	LD HL,LVERIFY
	LD DE,#4888:CALL PR_STRING
	LD HL,LINPUT
	LD DE,#48A8:CALL PR_STRING
	LD HL,LOUTPUT
	LD DE,#48C8:CALL PR_STRING
	LD HL,LCAT
	LD DE,#48E8:CALL PR_STRING

	LD HL,LEXIT
	LD DE,#40A8:CALL PR_STRING

MEMORY_TEST
	CALL ANYKEY
	XOR A:LD (TYPE),A:LD (BANK),A

; 䨣樨 :
;0 - #7FFD 
;1 - #1FFD ௨
;2 - #DFFD 
;3 - #FFF7  ࡮
;4 - #FDFD  ࡮ 2+
;5 - 6,7  #7FFD 
;6 ---
;7 -  (8)=#C3 ௨
	CALL TABINIT
	LD A,(#0008):CP	#C3:JR NZ,ITURBO
	LD HL,TYPE:SET 7,(HL)
ITURBO	LD HL,(1111)
	LD BC,#FFF7
	LD A,#1F:CALL OUTCA
	LD DE,(#C000+1111)
	OR A:SBC HL,DE
	LD BC,#FFF7
	LD A,#FF:CALL OUTCA
	JR NZ,I1FFD
	LD HL,TYPE:SET 3,(HL)
	JR I7FFD
I1FFD	LD BC,#1FFD
	LD DE,#10
	CALL TSTB:JR NZ,IDFFD
	LD HL,TYPE:SET 1,(HL)
	JR I7FFD
IDFFD	LD B,#DF:LD E,#01
	CALL TSTB:JR NZ,IFDFD
	LD HL,TYPE:SET 2,(HL)
	JR I7FFD
IFDFD	LD B,C
	LD DE,#1110
	CALL TSTB:JR NZ,I7FFD
	LD HL,TYPE:SET 4,(HL)
I7FFD	LD B,#7F
	LD DE,#1110
	CALL TSTB:JR NZ,SIZED
	LD HL,TYPE:SET 0,(HL)
SIZED	CALL VIRT
	LD A,(BANK):CP 8:JR C,ENDING
	LD HL,TYPE:LD A,(HL)
	DEC A:JR NZ,ENDING
	SET 5,(HL)
ENDING	XOR A:CALL EX_RAM
	EI
	JP CONTINUE

TSTB	LD IX,#FFFF
	OUT (C),E:CALL TSTB1
	LD L,(IX):LD (IX),E
	OUT (C),D:CALL TSTB1
	LD H,(IX):LD (IX),D
	OUT (C),E:CALL TSTB1
	LD A,(IX):CP E:LD (IX),L
	OUT (C),D
	PUSH AF
	CALL TSTB1
	POP AF
	LD (IX),H
	RET

TSTB1	LD A,B:CP #7F:RET Z
	PUSH BC
	LD B,#7F:LD A,#10:OUT (C),A
	POP BC
	RET

VIRT	LD IX,#C000:LD HL,RSCT+63
	LD B,64
V_R11	LD A,B:DEC A:CALL EX_RAM
	LD C,(IX):LD (HL),C:LD (IX),A
	DEC HL:DJNZ V_R11
	PUSH AF
	LD A,LENTABL:LD	(BANK),A
	POP AF
	LD DE,TABL_PG
V_R20	LD A,(DE)
	CP #FF:JR Z,V_R30
	CALL EX_RAM
	CP (IX):JR Z,V_R22
	PUSH DE
	LD HL,TABL_PG+LENTABL
	AND A:SBC HL,DE
	PUSH HL:POP BC
	PUSH DE:POP HL
	INC HL
	LDIR
	PUSH HL
	LD HL,BANK:DEC (HL)
	POP HL
	POP DE:DEC DE
V_R22	INC DE
	JR V_R20
V_R30	LD B,64:LD HL,RSCT
V_R31	LD A,64:SUB B:CALL EX_RAM
	LD A,(HL):LD (IX),A
	INC HL
	DJNZ V_R31
	RET

;樠 ⠡ ,
;᪫  2,5.
TABINIT	LD HL,TABL_PG-1
	LD (HL),#FF
	INC HL
	XOR A
TABI1	LD (HL),A
TABI2	INC A
	CP 2:JR	Z,TABI2
	CP 5:JR	Z,TABI2
	INC HL
	CP LENTABL+2:JR	NZ,TABI1
	LD (HL),#FF
	LD HL,RSCT
	PUSH HL:POP DE
	INC DE
	LD BC,63:LD (HL),B:LDIR
	INC B:LD (TYPE),BC
	RET

TURBO_2	PUSH AF,IX
	AND #38:CPL
	LD BC,#FFF7:CALL OUTCA
	POP IX,AF
	JR SPECCY
ATM1	LD BC,#FDFD
	PUSH AF
	RRCA:RRCA:RRCA:AND 7
	JR HOME
PROFI	LD BC,#DFFD
	PUSH AF
	RRCA:RRCA:RRCA:AND 7
	JR HOME
ZS256	PUSH AF
	LD B,A
	AND #08:RLCA:LD	C,A
	LD A,B
	AND #30:RLCA:RLCA:ADD A,C
	LD BC,#1FFD
HOME	OUT (C),A
	POP AF
SPECCY	LD B,A
	AND 24:RLCA:RLCA:RLCA
	LD C,A
	LD A,B:AND 7:ADD A,C:OR	#10
	LD BC,#7FFD:OUT	(C),A
	NOP
TDK	POP BC,AF,HL
	LD HL,#C000
	RET

OUTCA	LD IX,#2A53:PUSH IX
	JP #3D2F

RSCT	EQU 23296 ;६.  TABL_PG
LENTABL	EQU 62	  ;..
	DEFB 0
TABL_PG	DEFS LENTABL+1 ;⠡	

TYPE	DEFB 0 ;⨯ 
BANK	DEFB 0 ;- 㯭.


CONTINUE
;	- 
	LD A,(BANK)
	LD C,0:RL C
	LD DE,#4074
	LD C,"0"
SETBN0	SUB 10:JR C,SETBN1
	INC C
	JR SETBN0
SETBN1	ADD A,"9"+1
	EXA
	LD A,C
	PUSH DE
	CALL PR_SYMBOL
	POP DE
	INC E
	EXA
	CALL PR_SYMBOL
;롮/ - ४
	LD A,(TRQUAN)
	OR A:JR	Z,SET160
	DEC A:JR Z,SET162
	DEC A:JR Z,SET164
	JR SETCAT
SET160	LD A,159:LD HL,T160:JR SETTRX
SET162	LD A,161:LD HL,T162:JR SETTRX
SET164	LD A,163:LD HL,T164:JR SETTRX
SETCAT	XOR A:LD HL,TCAT
SETTRX	LD (COP3+1),A
	LD (CTP1+1),A
	LD (CFP3+1),A
	INC A
	LD (FORM0+1),A
	LD (REST0+1),A
	LD (CHEK0+1),A
	LD DE,#408E:CALL PR_STRING
;롮/ lag'
	LD A,(LAG)
;	 LD (CTP3+1),A
	LD (CFP4+1),A
	LD (REST4+1),A
	LD (FORM4+1),A
	LD (CHEK4+1),A
	LD C,0:RL C
	LD DE,#4099
	LD C,"0"
SETLG0	SUB 10:JR C,SETLG1
	INC C
	JR SETLG0
SETLG1	ADD A,"9"+1
	EXA
	LD A,C
	PUSH DE
	CALL PR_SYMBOL
	POP DE
	INC E
	EXA
	CALL PR_SYMBOL
;롮/ ஢ન
	LD A,(VERIFY_TRACK+1)
	LD HL,OFF:OR A:JR Z,SETVRF
	LD HL,ON
SETVRF	LD DE,#4891:CALL PR_STRING
;롮/ / ᪮
	LD A,(OUTDRV)
	ADD A,"A"
	LD DE,#48D6:CALL PR_SYMBOL
	LD A,(INPDRV):LD (#5D19),A
	ADD A,"A"
	LD DE,#48B5:CALL PR_SYMBOL
;롮/ ⥪樨 ᪠
	LD A,(AUTO_DETECT+1)
	LD HL,AUTO:OR A:JR Z,SETAUM
	LD HL,MANUAL
SETAUM	LD DE,#40D6:CALL PR_STRING

	EI:HALT:DI
; 
	LD A,#FB
	IN A,(#FE)
	RRA:RRA:RRA:JP NC,EXIT
	RRA:RRA:JP NC,TRACKS
	LD A,#BF
	IN A,(#FE)
	RRA:RRA:JP NC,SET_LAG
	LD A,#EF
	IN A,(#FE)
	RRA:JP NC,CHANGE_DISK
	RRA:JR NC,CATALOGUE
	RRA:JP NC,OUTPUT_DISK
	RRA:JP NC,INPUT_DISK
	RRA:JP NC,VERIFY
	LD A,#F7
	IN A,(#FE)
	RRA:JP NC,FORMAT
	RRA:JP NC,CHECK
	RRA:JP NC,RESTORE
	RRA:JR NC,COPY_FORMAT
	RRA:JP C,MEMORY_TEST
	XOR A:LD (CFP4+1),A
	JR COPY

CATALOGUE ;뢮 ⠫
	XOR A:LD (CURTRK),A
	CALL CLS
	CALL INIT_SCREEN
	LD HL,LCAT+2:CALL PR_OPER
	CALL PRIDRV
	CALL PR_TRACK_SIDE
	CALL TRACK_0
	LD A,CAT_PLC.h:LD (RDS2+1),A
	LD A,"R"
	LD DE,#4040:CALL PR_SYMBOL
	LD A,RD_COL:LD (#5840),A
	CALL READ_SECTORS
	CALL CRT_CAT
	JP START

COPY_FORMAT ;஢  ଠ⮬
	LD A,(LAG):LD (CFP4+1),A
	LD A,1
COPY ;४ ஢
	LD (COPFRM),A
	PUSH AF
	CALL INIT_SCREEN
	POP AF
	LD HL,LCOPY+2:OR A:JR Z,COPY1
	LD HL,LCOPFRM+2
COPY1	CALL PR_OPER:CALL PRODRV
	CALL COPYING
	JP START

COPFRM	DEFB 0 ;+
OUTDRV	DEFB 0 ;.ࠩ
INPDRV	DEFB 0 ;.ࠩ
TRQUAN	DEFB 0 ;- ४
LAG	DEFB 2 ;.ᥪ.

CHANGE_DISK ;.⥪ ᪠
	LD HL,AUTO_DETECT+1
	INC (HL)
	RES 1,(HL)
	JP MEMORY_TEST

TRACKS ;.- ४
	LD HL,TRQUAN:JR	CIODISK
OUTPUT_DISK ;..᪠
	LD HL,OUTDRV:JR	CIODISK
INPUT_DISK ;..᪠
	LD HL,INPDRV
CIODISK	INC (HL):RES 2,(HL)
	JP MEMORY_TEST

VERIFY ;.஢ન 
	LD A,(VERIFY_TRACK+1)
	XOR 1
	LD (VERIFY_TRACK+1),A
	JP MEMORY_TEST

RESTORE	;⠭
	CALL INIT_SCREEN
	LD HL,LRESTOR+2:CALL PR_OPER
	CALL PRIDRV
	CALL WAIT_INPUT
	CALL RESTORING
	JP START

FORMAT ;ଠ஢
	CALL INIT_SCREEN
	LD HL,LFORMAT+2:CALL PR_OPER
	CALL PRIDRV
	CALL WAIT_INPUT
	CALL FORMATING
	JP START

CHECK ;஢ઠ
	CALL INIT_SCREEN
	LD HL,LCHECK+2:CALL PR_OPER
	CALL PRIDRV
	CALL WAIT_INPUT
	LD A,(VERIFY_TRACK+1)
	PUSH AF
	LD A,1:LD (VERIFY_TRACK+1),A
	CALL CHECKING
	POP AF
	LD (VERIFY_TRACK+1),A
	JP START

SET_LAG	;.lag'
	LD A,(LAG)
	INC A:AND #0F
	LD (LAG),A
	JP MEMORY_TEST

PR_OPER	LD DE,#4080:JP PR_STRING

PRIDRV	LD A,(INPDRV):ADD A,"A"
	LD HL,DISKS:LD (HL),A
PRD	JP PR_STRING

PRODRV	LD A,(OUTDRV):ADD A,"A"
	LD (DISKS),A
	LD A,(INPDRV):ADD A,"A"
	LD HL,DISKS2:LD	(HL),A
	JR PRD

DISKS2	DEFB "A:>"
DISKS	DEFB "A:",0

EXIT
       IF WORK
	RET
       ELSE
;室  RC/QC  DOS
	LD A,#17:LD BC,#7FFD:OUT (C),A
	LD HL,(#C000)
	LD DE,#FF31
	XOR A:SBC HL,DE:JP Z,#C000
	LD A,#10:LD BC,#7FFD:OUT (C),A
	AND A:SBC HL,HL:PUSH HL
	JP #3D21
       ENDIF

TITLE0	DEFB "TURBO DISK UTILITY 2.1",0
TITLE1	DEFB "1997 Red	Ltd.  "
	DEFB "2003 HorrorSoft",0

LPAGES	DEFB "RAM-PAGES:",0
LTRACKS	DEFB "T.TRACKS:",0
LLAG	DEFB "L.LAG:",0
LEXIT	DEFB "E.EXIT TO	DOS",0

LCHGDSK	DEFB "0.CHANGE DISK:",0
LFORMAT	DEFB "1.FORMAT ",0
LCHECK	DEFB "2.CHECK ",0
LRESTOR	DEFB "3.RESTORE	",0
LCOPFRM	DEFB "4.COPY&FORMAT ",0
LCOPY	DEFB "5.COPY ",0
LVERIFY	DEFB "6.VERIFY:",0
LINPUT	DEFB "7.INPUT DISK:",0
LOUTPUT	DEFB "8.OUTPUT DISK:",0
LCAT	DEFB "9.CATALOGUE ",0

ON	DEFB "ON ",0
OFF	DEFB "OFF",0
AUTO	DEFB "AUTO  ",0
MANUAL	DEFB "MANUAL",0

TRKSIDE	DEFB "TRACK:   SIDE:",0
SECTORS	DEFB "0123456789ABCDEF",0

NO_DISK	DEFB "NO DISK!",0
ERROR	DEFB "DISK ERROR!",0
RIA	DEFB "Retry/Ignore/Abort",0

T160	DEFB "160",0
T162	DEFB "162",0
T164	DEFB "164",0
TCAT	DEFB "CAT",0

TITLE	DEFB "Title: "
RD_NAME	DEFB "***********",0
WR_NAME	DEFB "TDU v2.1'03",0

PAGE_	DEFB "Page:"
PAGE1	DEFB "1/1",0

INPUT	DEFB "Insert INPUT disk",0
OUTPUT	DEFB "Insert OUTPUT disk",0


IMG_TRK
TRLEN	EQU 7160 ;	४
CAT_PLC	EQU (((IMG_TRK+TRLEN).h)+1).e

	PHASE #5000

CRT_CAT
	CALL INIT_WG
	LD HL,CAT_PLC+#8F5
	LD DE,RD_NAME:LD BC,11
	LDIR
	LD HL,CAT_PLC+#08
	LD DE,14
CRCAT0	LD A,(HL):LD (HL),#20
	INC HL:LD (HL),A
	INC HL:LD (HL),0
	ADD HL,DE
	DJNZ CRCAT0
	LD A,(CAT_PLC+#8E4)
	LD B,0
CRCAT1	SUB 42
	JR C,PAGE_CAT
	JR Z,PAGE_CAT
	INC B
	JR CRCAT1

PAGE_CAT ; .⠫
	LD A,"1":LD (PAGE1),A
	ADD A,B:LD (PAGE1+2),A
	LD HL,CAT_PLC
PGCAT0	PUSH HL
	CALL CLS
	LD HL,TITLE
	LD DE,#4000:CALL PR_STRING
	LD HL,PAGE_
	LD DE,#4018:CALL PR_STRING
	POP HL
	LD A,(PAGE1):INC A:LD (PAGE1),A
	LD XH,14
	LD BC,#1000
PGCAT1	PUSH BC,HL
	LD A,B
	CALL #22B1
	EX DE,HL
	POP HL
	LD XL,3
PGCAT2	LD A,(HL)
	AND A:JR Z,ENDCAT
	PUSH HL
	CALL PR_STRING
	POP HL
	LD BC,16:ADD HL,BC
	INC E
	DEC XL:JR NZ,PGCAT2
	POP BC
	LD A,B:ADD A,8:LD B,A
	DEC XH:JR NZ,PGCAT1
	CALL ANYKEY
	CALL KEYPORT:JR	Z,$-3
	LD A,(PAGE1)
	LD C,A
	LD A,(PAGE1+2)
	CP C:JR	NC,PGCAT0
	RET
ENDCAT	POP BC
	CALL ANYKEY
	CALL KEYPORT:JR	Z,$-3
	RET

COPYING
	LD A,(OUTDRV):LD (#5D19),A
	CALL TRACK_0
	LD A,(INPDRV):LD (#5D19),A
	CALL TRACK_0
COP0	LD A,(INPDRV):LD (#5D19),A
	LD L,A
	LD A,(OUTDRV):CP L:JR NZ,COP1
	CALL WAIT_INPUT
COP1	CALL TRACK_0
	CALL COPY_TO_PAGES
	LD A,(INPDRV):LD L,A
	LD A,(OUTDRV):LD (#5D19),A
	CP L:JR	NZ,COP2
	LD HL,OUTPUT
	LD DE,#4827:CALL PR_STRING
	CALL DISK_CHANGER
	LD DE,#4825:CALL CLR_LINE
COP2	LD A,(CURTRK):LD (LASTTR0),A
	LD A,(LASTTR1):LD (CURTRK),A
	LD A,(CURSEC):LD (LASTSC0),A
	LD A,(LASTSC1):LD (CURSEC),A
	LD HL,PB_TRK:LD	DE,CTRK_S
	LDI:LDI:LDI
	LD HL,CTRK_D:LD	DE,PB_TRK
	LDI:LDI:LDI
	CALL TRACK_0
	CALL COPY_FROM_PAGES
	LD A,(CURTRK):LD (LASTTR1),A
	LD A,(LASTTR0):LD (CURTRK),A
	LD A,(CURSEC):LD (LASTSC1),A
	LD A,(LASTSC0):LD (CURSEC),A
	LD HL,PB_TRK:LD	DE,CTRK_D
	LDI:LDI:LDI
	LD HL,CTRK_S:LD	DE,PB_TRK
	LDI:LDI:LDI
	LD A,(CURTRK)
COP3	CP 0:RET Z
	JP COP0

WAIT_INPUT ;"" ᪠
	CALL ANYKEY
	LD HL,INPUT
	LD DE,#4828:CALL PR_STRING
	CALL DISK_CHANGER
	LD DE,#4828:JP CLR_LINE

COPY_TO_PAGES ;⥭ 	࠭窨
	XOR A:LD (CURPAGE),A
	CALL EX_RAM
	LD HL,#C000
CTP0	PUSH HL
	LD A,H:LD (RDS2+1),A
	CALL PR_TRACK_SIDE
	CALL READ_TRACK
	POP HL
	LD A,(CURTRK)
CTP1	CP 0:RET Z
	INC A:LD (CURTRK),A
	RRA
;	 JR C,CTP2
;	 LD A,(CURSEC)
;CTP3	 SUB 0
;	 AND 15
;	 LD (CURSEC),A
CTP2	LD A,H:ADD A,16:LD H,A
	CALL C,CALC_NEXTPAGE
	JR NC,CTP0
	RET

COPY_FROM_PAGES	;	 ࠭祪
	XOR A:LD (CURPAGE),A
	CALL EX_RAM
	LD HL,#C000
CFP0	PUSH HL
	LD A,H:LD (WRS1+1),A
	CALL PR_TRACK_SIDE
	LD A,(COPFRM):OR A:JR Z,CFP2
CFP1	CALL FORMAT_TRACK
CFP2	CALL WRITE_TRACK:JR C,CFP1
	CALL VERIFY_TRACK:JR C,CFP1
	POP HL
	LD A,(CURTRK)
CFP3	CP 0:RET Z
	INC A
	LD (CURTRK),A
	RRA:JR C,CFP5
	LD A,(CURSEC)
CFP4	SUB 0
	AND 15
	LD (CURSEC),A
CFP5	LD A,H:ADD A,16:LD H,A
	CALL C,CALC_NEXTPAGE
	JR NC,CFP0
	RET

CALC_NEXTPAGE ;.᫥.
	LD A,(CURPAGE)
	INC A
	LD (CURPAGE),A
	LD HL,TABL_PG
	PUSH BC,HL
	LD C,A:LD B,0
	ADD HL,BC
	LD A,(HL)
	POP HL,BC
	CP #FF:SCF:RET Z
	CALL EX_RAM
	AND A
	RET

;롮 䨧.  ॣ.A
EX_RAM	DI
	PUSH HL,AF,BC
	LD HL,TYPE
	BIT 1,(HL):JP NZ,ZS256
	BIT 2,(HL):JP NZ,PROFI
	BIT 3,(HL):JP NZ,TURBO_2
	BIT 4,(HL):JP NZ,ATM1
	BIT 0,(HL):JP NZ,SPECCY
	BIT 5,(HL):JP NZ,SPECCY
	JP TDK

ANYKEY ; "	"
	CALL KEYPORT
	JR NZ,ANYKEY
	RET

KEYPORT	;  
	XOR A
	IN A,(#FE)
	CPL:AND	#1F
	RET

DISK_CHANGER
	CALL AUTO_DETECT
	LD (DCHG1+1),A
	CALL ANYKEY
DCHG0	CALL BREAK:JP NC,ABORT
	CALL KEYPORT:RET NZ
	CALL AUTO_DETECT
DCHG1	CP 0:LD	(DCHG1+1),A:JR Z,DCHG0
DCHG2	LD A,#0C:CALL OUT_1F
	LD DE,#20AF:LD BC,#017F
	CALL DOS
	AND #80:JR Z,DCHG2
	RET

INIT_SCREEN ;.࠭
	CALL CLS
	XOR A:LD (PBB2),A
	LD (CURTRK),A:LD (CURSEC),A
	LD (LASTTR1),A:LD (LASTSC1),A
	LD (PB_TRK),A:LD (CTRK_D),A
	LD A,#80:LD (PBB1),A
	LD (CTRK_D+1),A:LD (CTRK_D+2),A
	LD A,CAT_PLC.h
	LD (RDS2+1),A:LD (WRS1+1),A
	CALL CREATE_TRK
	LD HL,#4060
	LD B,20
	LD (HL),#FF:INC	L:DJNZ $-3
	LD HL,#4760
	LD B,20
	LD (HL),#FF:INC	L:DJNZ $-3
	LD HL,#5860:LD DE,#5861
	LD BC,20:LD (HL),7:LDIR
	LD HL,TRKSIDE
	LD DE,#4000:CALL PR_STRING
	LD HL,SECTORS
	LD DE,#4020:JP PR_STRING

RESTORING
	CALL RETRY
REST0	LD B,0
REST1	PUSH BC
	CALL PR_TRACK_SIDE
	CALL READ_TRACK
REST2	CALL FORMAT_TRACK
	CALL WRITE_TRACK:JR C,REST2
	CALL VERIFY_TRACK:JR C,REST2
	LD A,(CURTRK)
	INC A
	LD (CURTRK),A
	RRA:JR C,REST3
	LD A,(CURSEC)
REST4	SUB 0
	AND 15
	LD (CURSEC),A
REST3	POP BC
	DEC B:JR NZ,REST1
	RET

FORMATING
	CALL RETRY
FORM0	LD B,0
FORM1	PUSH BC
	CALL PR_TRACK_SIDE
FORM2	CALL FORMAT_TRACK
	CALL VERIFY_TRACK:JR C,FORM2
	LD A,(CURTRK)
	INC A
	LD (CURTRK),A
	RRA:JR C,FORM3
	LD A,(CURSEC)
FORM4	SUB 0
	AND 15
	LD (CURSEC),A
FORM3	POP BC
	DEC B:JR NZ,FORM1
	JP WRITE_CAT

CHECKING
	CALL RETRY
CHEK0	LD B,0
CHEK1	PUSH BC
	CALL PR_TRACK_SIDE
	LD A,(CURSEC):LD YL,A
	XOR A:LD (CURSEC),A
	CALL VERIFY_TRACK
	LD A,YL:LD (CURSEC),A
	JR C,CHECK_ERROR
CHEK2	LD A,(CURTRK)
	INC A
	LD (CURTRK),A
	RRA:JR C,CHEK3
	LD A,(CURSEC)
CHEK4	SUB 0
	AND 15
	LD (CURSEC),A
CHEK3	POP BC
	DEC B:JR NZ,CHEK1
	LD IY,#5C3A
	RET

CHECK_ERROR ;१	४
	CALL READ_TRACK
CHEKREP	CALL FORMAT_TRACK
	CALL WRITE_TRACK:JR C,CHEKREP
	CALL VERIFY_TRACK:JR C,CHEKREP
	JR CHEK2

POSITION ;.  ४
	LD A,(CURTRK):LD C,A
	LD A,(#5D19)
	AND 3:OR #2C:SRL C
	JR C,POSIT0
	OR #3C
POSIT0	CALL OUT_FF
	LD A,C
	LD C,#7F:CALL OUTC_A
POSIT1	LD A,#18:CALL OUT_1F
	LD DE,#20AF:LD BC,#017F
	CALL DOS
	AND #80:JR Z,POSIT1
	RET

FORMAT_TRACK
	LD A,"F"
	LD DE,#4040:CALL PR_SYMBOL
	LD A,FM_COL:LD (#5840),A
	LD BC,#100*16+FM_COL
	CALL CLI1
	LD HL,IMG_TRK+#7A
	LD BC,#0175
	LD A,(CURTRK)
	SRL A:LD E,A:LD	D,0:RL D
	LD A,(CURSEC)
	LD XL,16
FORMT0	LD (HL),E
	INC HL:LD (HL),D
	INC HL,A:LD (HL),A
	AND #0F:INC HL:LD (HL),1
	ADD HL,BC
	DEC XL:JR NZ,FORMT0
	LD (CURSEC),A
	CALL BREAK:JP NC,ABORT
	LD A,#F0:CALL OUT_1F
	LD HL,IMG_TRK
	LD C,#7F:LD DE,#3FCA
	JP DOS

VERIFY_TRACK
	LD A,0
	AND A:RET Z
	LD A,"V"
	LD DE,#4040:CALL PR_SYMBOL
	LD A,VF_COL:LD (#5840),A
	LD HL,0
	JP VERIFY_SECTORS

READ_TRACK
	LD A,"R"
	LD DE,#4040:CALL PR_SYMBOL
	LD A,RD_COL:LD (#5840),A
	JP READ_SECTORS

WRITE_TRACK
	LD A,"W"
	LD DE,#4040:CALL PR_SYMBOL
	LD A,WR_COL:LD (#5840),A
	JP WRITE_SECTORS

WR_SECS	;ᥪ.
	LD A,#A0:CALL OUT_1F
	LD DE,#3FCA:LD C,#7F
	CALL DOS
	JR CONT_
RD_SECS	;ᥪ.⥭
	LD A,#80:CALL OUT_1F
	LD DE,#3FE5:LD C,#7F
	CALL DOS
	CALL BREAK:JP NC,ABORT
CONT_	CALL REPOSIT
	LD A,(CURTRK)
	SRL A
	JP OUT_3F

REPOSIT	;९.
	XOR A:CALL OUT_3F
	LD A,#0A:CALL OUT_5F
	JP IN_1F

WRITE_SECTORS
	CALL CLR_INDIK
	LD B,16
	LD A,(CURSEC)
	LD E,A
WRS0	LD A,E
	PUSH DE,BC
	LD B,A
WRS1	ADD A,CAT_PLC.h
	LD H,A
	LD A,B
	INC A
	CALL OUT_5F
	ADD A,#1F
	LD E,A:LD D,#58
	LD A,WRCOL:LD (DE),A
	LD L,0
	CALL WR_SECS
	LD A,B
	POP BC,DE
	AND #FC:JP NZ,WR_ERROR
WRS2	INC E:RES 4,E
	DJNZ WRS0
	AND A
	RET

READ_SECTORS
	CALL CLR_INDIK
	LD B,16
	LD A,(CURSEC):LD E,A
RDS0	XOR A:LD (REPEAT+1),A
RDS1	LD A,E
	PUSH DE,BC
	LD B,A
RDS2	ADD A,CAT_PLC.h
	LD H,A
	LD A,B
	INC A
	CALL OUT_5F
	ADD A,#1F
	LD E,A:LD D,#58
	LD A,RDCOL:LD (DE),A
	LD L,0
	CALL RD_SECS
	LD A,B
	POP BC,DE
	BIT 4,A:JP NZ,RD_ERROR
	AND #8C:JR NZ,REPEAT
RDS3	INC E,H:RES 4,E
	DJNZ RDS0
	AND A
	RET

REPEAT ; ⥭
	LD A,0
	INC A:LD (REPEAT+1),A
	CP 10:JP Z,CONT_
	JP RDS1

VERIFY_SECTORS
	CALL CLR_INDIK
	LD B,16
	LD A,(CURSEC):LD E,A
VFS0	LD A,E
	EXX
	INC A
	CALL OUT_5F
	ADD A,#1F
	LD L,A:LD H,#58:LD (HL),VFCOL
	LD H,0
	CALL RD_SECS
	LD A,B
	EXX
	AND #9C:JR NZ,VF_ERROR
VFS1	INC E:RES 4,E
	DJNZ VFS0
	AND A
	RET

VF_ERROR ;訡 ஢ન
	CALL DISK_ERROR
	DEC A:JR Z,VFS1
	SCF
	RET
RD_ERROR ;訡 ⥭
	CALL DISK_ERROR
	DEC A:JP Z,RDS3
	JP RDS0
WR_ERROR ;訡 
	CALL DISK_ERROR
	DEC A:JP Z,WRS2
	SCF
	RET

;ࠡ稪 .訡
DISK_ERROR
	PUSH DE,BC
	LD HL,ERROR
	LD DE,#482A:CALL PR_STRING
	LD HL,RIA
	LD DE,#4846:CALL PR_STRING
	POP BC,DE
DERR0	LD A,#FB
	IN A,(#FE)
	BIT 3,A:JR Z,RETRY
	LD A,#DF
	IN A,(#FE)
	BIT 2,A:JR Z,IGNORE
	LD A,#FD
	IN A,(#FE)
	RRA:JP NC,ABORT
	JR DERR0

RETRY ; 樨
	CALL CLR_MSG
	PUSH DE,BC
RETRY0	LD A,#08:CALL OUT_1F
	LD DE,#20AF:LD C,#7F
	CALL DOS
	AND #80:JR Z,RETRY0
	CALL TRACK_0
	POP BC,DE
	SCF
	RET

IGNORE ;஢
	CALL CLR_MSG
	LD A,1
	RET

CLR_MSG	;⪠ ᮮ. 訡
	PUSH DE,BC
	LD DE,#4826:CALL CLR_LINE
	LD DE,#4846:CALL CLR_LINE
	POP BC,DE
	RET

RESET_WG ;	
	LD A,#08:CALL OUT_1F
	LD DE,#20AF:LD BC,#017F
	CALL DOS
	AND #80:JR Z,TRACK_0
	RET

TRACK_0	;.	0- ४
	CALL RESET_WG
	CALL POSITION
	LD HL,#5CC2:LD (HL),#C3
	INC HL:LD (HL),WRC1.b
	INC HL:LD (HL),WRC1.h
	LD DE,#3DB2
	JP DOS

WRITE_CAT ; ⠫ ᫥ ଠ
	LD HL,CAT_PLC:LD DE,CAT_PLC+1
	LD BC,#FFF:LD (HL),L:LDIR
;ନ.⠫
	LD HL,CAT_PLC+#800
	LD (HL),0:INC L:JR NZ,$-3
	LD HL,CAT_PLC+#8E2
	LD (HL),#01 ; .	ࢮ
	INC HL	    ; ⮣ ᥪ
	LD (HL),#16 ;⨯ ᪠ (80DS)
	INC HL:INC HL
	LD (HL),#F0 ;-
	INC HL	    ;ᥪ஢
	LD (HL),#09 ;	᪥
	INC HL	    ;=2455
	LD (HL),#10 ;䨪 TRDOS
	INC HL,HL,HL
	LD B,9
	LD (HL)," " ;.
	INC HL
	DJNZ $-3
	INC HL,HL
	LD DE,WR_NAME
	EX DE,HL
	LD BC,11
	LDIR
;	⠫
WRC2	XOR A
	LD (CURSEC),A:LD (CURTRK),A
	CALL POSITION
	CALL WRITE_TRACK
	JR NC,WRC0
WRC1	CALL CLR_MSG
	LD HL,NO_DISK
	LD DE,#482B:CALL PR_STRING
WRC0	LD B,#1E
	EI:HALT:DJNZ $-2
	JP ABORT

CLR_INDIK ;⪠ .ᥪ஢
	LD BC,#100*16+DEF_COL
CLI1	LD HL,#5820
	LD (HL),C:INC L:DJNZ $-2
	RET

AUTO_DETECT ;⥪ ᪠
	LD A,0
	AND A:RET NZ
	CALL BRK_COM
	LD A,#08:CALL OUT_1F
	LD A,#FF:LD (#5CD8),A
	LD (DRIVE_SETTING+1),SP
	LD A,#C3:LD (#5CC2),A
	LD HL,DRIVE_SETTING
	LD (#5CC3),HL
	LD DE,#2076 ;஢ઠ .
	LD B,0
	CALL DOS
	JR INI_WG_

DRIVE_SETTING ;.ࠩ
	LD SP,0
	XOR A
INI_WG_	LD B,A
INIT_WG	LD A,#08:CALL OUT_FF
	LD A,(#5D19):OR	#3C
	CALL OUT_FF
	EI:HALT:DI
	CALL BRK_COM
	LD A,B
	RET

CLR_LINE ;⪠ ப ࠭
	LD B,32
CLRLOOP	LD A," "
	PUSH DE
	CALL PR_SYMBOL
	POP DE
	INC E
	DJNZ CLRLOOP
	RET

CREATE_TRK ;ᮧ ࠧ ४ (MFM)
	LD HL,IMG_TRK
	LD DE,IMG_TRK+1
	LD BC,TRLEN  ; ஦
	LD (HL),#4E
	LDIR
	LD HL,IMG_TRK+80
	LD B,12
NUL12_1	LD (HL),0:INC HL:DJNZ NUL12_1
	LD B,3
C2	LD (HL),#F6 ; C2
	INC HL:DJNZ C2
	LD (HL),#FC ;᭠ ⪠
	INC HL
	LD BC,10
	ADD HL,BC   ; ஡
	LD B,16
S_LOOP	PUSH BC

	LD B,12
NUL12_2	LD (HL),0:INC HL:DJNZ NUL12_2
	LD B,3
A1_1	LD (HL),#F5 ; A1
	INC HL:DJNZ A1_1
	LD (HL),#FE ;.⪠ 
	INC HL	    ; ஦
	INC HL	    ; ஭
	INC HL	    ; ᥪ
	INC HL	    ; ᥪ
	INC HL
	LD (HL),#F7 ;. ⮢ 
	LD BC,23
	ADD HL,BC ;ன ஡
	LD B,12
NUL12_3	LD (HL),0:INC HL:DJNZ NUL12_3
	LD B,3
A1_2	LD (HL),#F5 ; A1
	INC HL:DJNZ A1_2
	LD (HL),#FB ;.⪠  
	INC HL
	LD B,0
DATA	LD (HL),0   ;
	INC HL:DJNZ DATA
	LD (HL),#F7 ;.    
	LD BC,61
	ADD HL,BC   ;⨩ ஡

	POP BC
	DJNZ S_LOOP
	RET

PR_STRING ; ப
;: DE-. ࠭
;    HL-⥪ (0-)
	LD A,(HL)
	AND A:RET Z
	INC HL
	PUSH DE,HL
	CALL PR_SYMBOL
	POP HL,DE
	INC E
	JP PR_STRING

PR_SYMBOL ; ᨬ (A-)
	ADD A,A:LD L,A:LD H,#0F
	ADD HL,HL:ADD HL,HL
	PUSH BC
	LD B,8
PRSYM	LD A,(HL):LD C,A
	RRCA:OR	C:LD (DE),A
	INC D,L
	DJNZ PRSYM
	POP BC
	RET

PR_TRACK_SIDE
	CALL POSITION
	LD A,(CURTRK)
	SRL A:LD C,0:RL	C
;	 ஭
	EXA
	LD A,C:ADD A,"0"
	LD DE,#400E:CALL PR_SYMBOL
	EXA
;	 ४
	LD DE,#4006
	LD C,"0"
PRTR0	SUB 10:JR C,PRTR1
	INC C
	JR PRTR0
PRTR1	ADD A,"9"+1
	EXA
	LD A,C
	PUSH DE
	CALL PR_SYMBOL
	POP DE
	INC E
	EXA
	CALL PR_SYMBOL

;ண-
	LD HL,#4260
	LD A,(PB_TRK):ADD A,L:LD L,A
	LD A,(PBB1):LD C,A
	LD A,(PBB2):LD B,A
	LD XL,4
PGSBAR	LD A,B:XOR C:LD	B,A
	OR (HL):LD (HL),A:INC H
	DEC XL
	JR NZ,PGSBAR
	LD A,B:XOR C:RRCA:LD (PBB2),A
	LD A,C:RRCA:LD (PBB1),A
	RET NC
	LD A,(PB_TRK)
	INC A
	LD (PB_TRK),A
	RET

CLS ;⪠ ࠭
	XOR A:OUT (#FE),A
	LD HL,#4000:LD DE,#4001
	LD BC,#FFF:LD (HL),L:LDIR
	LD HL,#5800:LD DE,#5801
	LD BC,#200:LD (HL),DEF_COL:LDIR
	LD (HL),C:INC L:JR NZ,$-2
	RET

BRK_COM	LD DE,#2FC1:JR DOS
OUT_FF	LD DE,#1FF3:JR DOS
OUT_1F	LD DE,#2FC3:JR DOS
OUT_3F	LD DE,#1E3A:JR DOS
OUT_5F	LD C,#5F
OUTC_A	LD DE,#2A53:JR DOS
IN_1F	LD DE,#3F33:PUSH DE:LD D,1:JR TODOS
DOS	PUSH DE
TODOS	JP #3D2F

ABORT ;뢠
	LD SP,0
	JP START

CURPAGE	DEFB 0
LASTTR0	DEFB 0
LASTTR1	DEFB 0
LASTSC1	DEFB 0
LASTSC0	DEFB 0
PB_TRK	DEFB 0
PBB1	DEFB 0
PBB2	DEFB 0
CTRK_S	DEFS 3
CTRK_D	DEFS 3
CURTRK	DEFB 0
CURSEC	DEFB 0

	UNPHASE

BLEN	EQU $-IMG_TRK

       IF WORK
       ELSE
	SAVEOBJ	"A:TDU2_1.C"
       ENDIF
 	LD DE,#3F33:PUSH DE:LD D,1:JR TODOS
DOS	PUSH DE
TODOS	JP #3D2F

ABORT ;뢠
