
;fixed: codeprotection removed
;	illegal access to a memoryplace $fcxxxx caused a crash
;	  on 68030+ (mmu?), moreover it was useless, possibly
;	  a freezertest
;	diskroutines contained dbf-delays, now vbi-synced or 
;	  removed

;This is an example of a formatconversion.
;At first it formats a disk and creates a directory S. (cycle 1)
;Then it gets the data from the original disk. (cycle2)
;These data can be read only index-synchronized with OS1.3.
;Therefore here is a strange decoding routine.
;Then these data will be modified by changes and saved as file.
;A proper startup-sequence will be added. (cycle3)

	INCDIR	ASM-ONE:INCLUDE2.0/

	INCLUDE	OWN/Patcher.I
	INCLUDE	DEVICES/TRACKDISK.I
	INCLUDE	EXEC/EXEC_LIB.I
	INCLUDE	EXEC/IO.I
	INCLUDE	LIBRARIES/DOS_LIB.I

HP	MOVEQ.L	#20,D0
	RTS
	DC.L	TAB
	DC.B	'PTCH'
	DC.B	'$VER:CARRIER_COMMAND_1.0',0
	EVEN

TAB	DC.L	PCH_INIT,INITROUT
	DC.L	PCH_FILECOUNT,3
	DC.L	PCH_ADAPTOR,ADNAME
	DC.L	PCH_DISKNAME,DISKNAMEARRAY
	DC.L	PCH_FILENAME,FILENAMEARRAY
	DC.L	PCH_CHANGES,CHANGESARRAY	
	DC.L	PCH_NAME,PARAMNAME
	DC.L	PCH_DATALENGTH,LENGTHTABLE
	DC.L	PCH_SAVEDATA,DATATABLE
	DC.L	PCH_SPECIAL,SPECIALARRAY
	DC.L	PCH_STATE,STATEARRAY
	DC.L	PCH_STATE2,STATEARRAY2
	DC.L	0

ADNAME	DC.B	'Fixed by Harry.',0
	EVEN


PARAMNAME	DC.B	'Carrier Command V1.2',0
	EVEN


DISKNAMEARRAY	DC.L	0		;no name for formatting a disk
	DC.L	DISK1NAME		;to save the read data on the 
	DC.L	DISK1NAME		;newly formatted disk

DISK1NAME	DC.B	'CarrierCommand',0
	EVEN


FILENAMEARRAY	DC.L	0		;no filename needed to format a disk
	DC.L	FILE2NAME		;filename of the mainprogram
	DC.L	FILE3NAME		;adding a startup-sequence
FILE2NAME	DC.B	'CarrierCommand',0
	EVEN
FILE3NAME	DC.B	'S/Startup-Sequence',0
	EVEN

LENGTHTABLE	DC.L	$1600		;just a space of $1600 for personal use
	DC.L	360076			;save-length (theres a customloadingroutine)
	DC.L	DATA3END-DATA3		;length of the startup

DATATABLE	DC.L	0		;no unread data to save
	DC.L	0			;no unread data to save
	DC.L	DATA3			;startup-sequence to add

DATA3	DC.B	'CarrierCommand',$a
DATA3END
	EVEN

CHANGESARRAY	DC.L	0		;no changes to made in cycle 1
	DC.L	CHANGE2			;changes to the data read from the original
	DC.L	0			;no changes to made in cycle 3

CHANGE2
	DC.B	$00,$80,$00,$00,$4C,$00,$00,$03
	DC.B	$F3,$00,$00,$00,$00,$00,$00,$00
	DC.B	$02,$00,$00,$00,$00,$00,$00,$00
	DC.B	$01,$00,$01,$5F,$89,$40,$00,$00
	DC.B	$01,$00,$00,$03,$E9,$00,$01,$5F
	DC.B	$89,$4E,$F9,$00,$05,$7D,$28,$46
	DC.B	$FC,$27,$00,$2E,$7C,$00,$05,$86
	DC.B	$AA,$4E,$B9,$00,$01,$A0,$EC,$50
	DC.B	$F8,$12,$0F,$50,$F8,$22,$9C,$31
	DC.B	$FC,$00,$04,$22,$9E,$4E,$F8,$5F
	DC.B	$50,$80,$70,$3A,$06,$00,$40,$61
	DC.B	$00,$04,$06,$80,$70,$D6,$06,$76
	DC.B	$01,$61,$00,$03,$6A,$00,$70,$DF
	DC.B	$FA,$80,$71,$6B,$09,$7F,$61,$00
	DC.B	$02,$D6,$08,$2E,$00,$01,$00,$00
	DC.B	$71,$75,$1F,$80,$71,$C4,$08,$00
	DC.B	$10,$61,$00,$02,$7C,$4E,$71,$80
	DC.B	$74,$26,$08,$30,$3C,$00,$B4,$08
	DC.B	$39,$00,$00,$80,$74,$2F,$09,$DF
	DC.B	$F0,$05,$66,$F6,$08,$39,$00,$00
	DC.B	$00,$80,$74,$39,$1B,$DF,$F0,$05
	DC.B	$67,$F6,$51,$C8,$FF,$EA,$4E,$75
	DC.B	$4E,$71,$4E,$71,$08,$39,$00,$00
	DC.B	$00,$DF,$F0,$05,$66,$F6,$08,$39
	DC.B	$00,$80,$74,$55,$09,$00,$00,$DF
	DC.B	$F0,$05,$67,$F6,$4E,$75,$00,$00
	DC.B	$AE,$80,$00,$00,$AE,$A0,$00,$00
	DC.B	$AE,$B0,$00,$00,$AE,$C0,$00,$00
	DC.B	$AE,$E0,$00,$00,$AE,$F0,$00,$00
	DC.B	$AF,$10,$00,$00,$AF,$20,$00,$00
	DC.B	$AF,$40,$00,$00,$AF,$50,$00,$00
	DC.B	$AF,$60,$00,$00,$C7,$C3,$18,$80
	DC.B	$C7,$C8,$04,$12,$C1,$4E,$71,$81
	DC.B	$9D,$52,$0C,$4E,$71,$4E,$71,$4E
	DC.B	$71,$4E,$71,$4E,$71,$4E,$71,$81
	DC.B	$A5,$AC,$08,$4E,$B9,$00,$00,$77
	DC.B	$F8,$4E,$71,$85,$7D,$4C,$02,$2C
	DC.B	$78,$85,$7D,$4F,$03,$04,$43,$FA
	DC.B	$00,$85,$7D,$53,$02,$6A,$70,$85
	DC.B	$7D,$56,$06,$4E,$AE,$FD,$D8,$23
	DC.B	$C0,$85,$7D,$5D,$04,$05,$7D,$AA
	DC.B	$67,$85,$7D,$63,$05,$3E,$61,$6C
	DC.B	$2C,$78,$00,$85,$7D,$69,$08,$04
	DC.B	$4E,$AE,$FF,$6A,$46,$FC,$27,$85
	DC.B	$7D,$72,$03,$4F,$F8,$01,$00,$85
	DC.B	$7D,$76,$FF,$33,$FC,$7F,$FF,$00
	DC.B	$DF,$F0,$9A,$33,$FC,$7F,$FF,$00
	DC.B	$DF,$F0,$96,$41,$F9,$00,$00,$00
	DC.B	$06,$43,$F8,$03,$DE,$20,$3C,$00
	DC.B	$01,$5F,$49,$22,$D8,$53,$80,$66
	DC.B	$FA,$4E,$F8,$03,$DE,$4A,$B9,$00
	DC.B	$05,$7D,$AA,$67,$0C,$2C,$78,$00
	DC.B	$04,$22,$7A,$00,$20,$4E,$AE,$FE
	DC.B	$62,$70,$14,$4E,$75,$00,$00,$00
	DC.B	$00,$67,$72,$61,$70,$68,$69,$63
	DC.B	$73,$2E,$6C,$69,$62,$72,$61,$72
	DC.B	$79,$00,$00,$00,$00,$00,$00,$2C
	DC.B	$7A,$FF,$FA,$23,$EE,$00,$22,$00
	DC.B	$05,$7D,$94,$32,$7C,$00,$00,$4E
	DC.B	$AE,$FF,$22,$4E,$AE,$FE,$F2,$4E
	DC.B	$AE,$FE,$F2,$41,$F9,$00,$00,$00
	DC.B	$00,$23,$C8,$00,$DF,$F0,$80,$30
	DC.B	$39,$00,$DF,$F0,$04,$02,$40,$00
	DC.B	$01,$67,$F4,$30,$39,$00,$DF,$F0
	DC.B	$04,$02,$40,$00,$01,$66,$F4,$30
	DC.B	$39,$00,$DF,$F0,$04,$02,$40,$00
	DC.B	$01,$67,$F4,$30,$39,$00,$DF,$F0
	DC.B	$04,$02,$40,$00,$01,$66,$F4,$30
	DC.B	$39,$00,$DF,$F0,$7C,$0C,$00,$00
	DC.B	$F8,$66,$10,$33,$FC,$00,$00,$00
	DC.B	$DF,$F1,$FC,$33,$FC,$0C,$01,$00
	DC.B	$DF,$F1,$06,$4E,$75,$00,$00,$03
	DC.B	$EC,$00,$00,$00,$05,$00,$00,$00
	DC.B	$00,$00,$00,$00,$02,$00,$05,$7D
	DC.B	$38,$00,$05,$7D,$64,$00,$05,$7D
	DC.B	$7E,$00,$05,$7D,$B6,$00,$00,$00
	DC.B	$01,$00,$00,$00,$01,$00,$05,$7D
	DC.B	$CC,$00,$00,$85,$7E,$75,$17,$00
	DC.B	$00,$00,$00,$00,$03,$F2,$00,$00
	DC.B	$03,$EA,$00,$00,$00,$01,$FF,$FF
	DC.B	$FF,$FE,$00,$00,$03,$F2,$00,$40
	DC.B	$00,$00

	EVEN


;the parameter-initializing opens source- and destinationdevice, 
;both are needed
INITROUT	MOVEQ.L	#0,D0
	MOVE.L	PTB_OPENDEVICE(A5),A0
	JSR	(A0)
	TST.L	D0
	BEQ.S	.1
	RTS

.1	MOVEQ.L	#1,D0
	MOVE.L	PTB_OPENDEVICE(A5),A0
	JSR	(A0)
	RTS	

;loading-statetexts for the cycles
STATEARRAY	DC.L	FORMATSTATE1	;i programmed the formatting in the
					;loading-routine and i'm to lazy to change that
	DC.L	LOADSTATE2
	DC.L	SAVESTATE

FORMATSTATE1
	DC.B	'Please insert an empty dd-disk',$a
	DC.B	'in your destination drive.',0
	EVEN

LOADSTATE2
	DC.B	'Please insert your original writepro-',$A
	DC.B	'tected disk in the source drive.',0
	EVEN

STATEARRAY2	DC.L	0		;no text in cycle 1
	DC.L	SAVESTATE
	DC.L	SAVESTATE


SAVESTATE	
	DC.B	'Please insert your destination disk.',0
	EVEN

;routines to 'load' something
SPECIALARRAY	DC.L	FORMAT		;more correctly this would be put to
					;PCH_SAVEPGM, but i'm to lazy
	DC.L	LOADROUT		;load stuff from original
	DC.L	0			;nothing special in cycle 3


FORMAT
	MOVEQ.L	#0,D0			;format dd-disk in destination-drive
	LEA.L	DISK1NAME(PC),A0
	MOVE.L	PTB_FORMATDEST(A5),A1
	JSR	(A1)
	TST.L	D0
	BEQ.S	.1
.ERR	MOVEQ.L	#-1,D0
	RTS

.1	MOVE.L	#DIRNAME,D1		;and create a 's'-drawer
	MOVE.L	PTB_DOSBASE(A5),A6
	JSR	_LVOCREATEDIR(A6)
	TST.L	D0
	BEQ.S	.ERR
	MOVE.L	D0,D1
	JSR	_LVOUNLOCK(A6)
	MOVEQ.L	#0,D0
	RTS


DIRNAME	DC.B	'CarrierCommand:S',0
	EVEN

LOADROUT
	MOVEQ.L	#0,D7				;one diskchange allowed
.NEU
.4	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;disk in sourcedrive?
	MOVE.W	#TD_CHANGESTATE,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	IO_ACTUAL(A1)
	BNE.W	.NOTCC

	MOVE.L	PTB_ADDRESSOFFILE(A5),A4	;load first part of disk
	LEA.L	$4C(A4),A2			;offset to load in the dataspace
	MOVE.L	#$9,D2				;starttrack on the disk
	MOVE.L	#$50000,D3			;$50000 bytes to read
	MOVEQ.L	#0,D4				;data from the start of the track
;	bra.s	.5				;because reading starts with
						;trackstart, this is obsolete

.3	TST.L	D4
	BNE.S	.1
.5	MOVEQ.L	#$4,D6				;4 tries, then error
.55	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.L	PTB_SPACE(A5),IO_DATA(A1)	;track is to load in PTB_SPACE
	MOVE.L	#$7FFE,IO_LENGTH(A1)		;double length of track
						;to decode the index-sync-read data
	MOVE.L	D2,D0				;my own trackcounter
	ADD.L	D0,D0				;original is one-sided
	MOVE.L	D0,IO_OFFSET(A1)
	MOVE.W	#TD_RAWREAD,IO_COMMAND(A1)
	MOVE.B	#IOTDB_INDEXSYNC,IO_FLAGS(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	D0
	BNE.W	.ERR
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7FFE(A0),A1			;end of buffer
	LEA.L	$7FFE(A0),A3
	BSR.W	TRACKDECODE
	TST.L	D0
	BEQ.S	.R1OK
	DBF	D6,.55
	BRA.W	.NOTCC

.R1OK	ADDQ.L	#1,D2
	ST	D7				;correct disk - nothing anymore
						;to change
.1	MOVE.B	(A3)+,(A2)+
	ADDQ.L	#1,D4
	CMP.L	#$1400,D4			;tracklength
	BNE.S	.2
	MOVEQ.L	#0,D4				;new track
.2	SUBQ.L	#1,D3
	BNE.S	.3

	LEA.L	(A4),A2
	ADDA.L	#$4FFB4+$22,A2			;second part to read from the
	MOVE.L	#$2,D2				;original
	MOVE.L	#32160,D3
	MOVEQ.L	#0,D4
.13	TST.L	D4
	BNE.S	.11
	MOVEQ.L	#$4,D6
.REP	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.L	PTB_SPACE(A5),IO_DATA(A1)
	MOVE.L	#$7FFE,IO_LENGTH(A1)
	MOVE.L	D2,D0
	ADD.L	D0,D0
	MOVE.L	D0,IO_OFFSET(A1)
	MOVE.W	#TD_RAWREAD,IO_COMMAND(A1)
	MOVE.B	#IOTDB_INDEXSYNC,IO_FLAGS(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	D0
	BNE.S	.ERR
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7FFE(A0),A1
	LEA.L	$7FFE(A0),A3
	BSR.W	TRACKDECODE
	TST.L	D0
	BEQ.S	.R2OK
	DBF	D6,.REP
	BRA.S	.ERR

.R2OK	ADDQ.L	#1,D2

.11	MOVE.B	(A3)+,(A2)+
	ADDQ.L	#1,D4
	CMP.L	#$1400,D4
	BNE.S	.12
	MOVEQ.L	#0,D4
.12	SUBQ.L	#1,D3
	BNE.S	.13

	MOVEQ.L	#0,D4
.END	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;switch motor off
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)

	MOVE.L	D4,D0
	RTS

.ERR	MOVEQ.L	#-1,D4
	BRA.S	.END

.NOTCC	TST.L	D7			;if the first time the original
	BNE.S	.ERR			;was not in the source drive,
	ST	D7			;youll be asked to put it there
	LEA.L	LINE1(PC),A0
	LEA.L	LINE2(PC),A1
	MOVE.L	PTB_REQUEST(A5),A6
	JSR	(A6)
	TST.L	D0
	BNE.S	.ERR
	BRA.W	.NEU

LINE1	DC.B	'Please insert your original',0
	EVEN
LINE2	DC.B	'in the source drive.',0
	EVEN

;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR

TRACKDECODE	MOVEM.L	A2/A3/D2/D3/D4/D5/D6,-(A7)
	MOVE.L	A0,A2
	MOVE.L	A1,A3
	MOVE.W	#$4489,-2(A3)		;sync has to be searched with shifting
	MOVE.L	#$55555555,D3		;the data
.SHF2	MOVEQ.L	#$10-1,D5
.SHF1	MOVE.L	(A2),D0
	LSR.L	D5,D0
	CMP.W	#$4489,D0
	BEQ.S	.SY
	DBF	D5,.SHF1
	ADDQ.L	#2,A2
	BRA.S	.SHF2

.SY	MOVE.L	(A2),D0
	ADDQ.L	#2,A2
	LSR.L	D5,D0			;d5 is the shifting-number when sync was found
	CMP.W	#$4489,D0
	BNE.S	.SY

.1	MOVE.L	(A2),D0
	ADDQ.L	#2,A2
	LSR.L	D5,D0
	CMP.W	#$4489,D0
	BEQ.S	.1

	CMP.L	A2,A3
	BLS	.ERR
	SUBQ.W	#2,A2
	LEA.L	8(A2),A0
	BSR.S	.DC1L
	MOVE.L	D0,D4
	LEA.L	$10(A2),A0
	MOVE.W	#$2800,D1
	BSR.S	.CHKSUM
	CMP.L	D0,D4
	BNE.S	.ERR
	LEA.L	$10(A2),A0
	MOVE.W	#$1400,D0
	BSR.W	.DC
	MOVEM.L	(A7)+,A2/A3/D2/D3/D4/D5/D6
	MOVEQ	#0,D0
	RTS	

.ERR	MOVEM.L	(A7)+,A2/A3/D2/D3/D4/D5/D6
	MOVEQ	#-1,D0
	RTS	

.CHKSUM	LSR.W	#2,D1
	MOVE.L	(A0)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A0),D0
	LSR.L	D5,D0
	AND.L	#$FFFF,D0
	OR.L	D6,D0
	SUBQ.W	#2,D1
.CHK1	MOVE.L	(A0)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A0),D2
	LSR.L	D5,D2
	AND.L	#$FFFF,D2
	OR.L	D6,D2
	EOR.L	D2,D0
	DBF	D1,.CHK1
	AND.L	D3,D0
	RTS	

.DC1L	MOVE.L	(A0)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A0),D0
	LSR.L	D5,D0
	AND.L	#$FFFF,D0
	OR.L	D6,D0
	MOVE.L	(A0)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A0),D1
	LSR.L	D5,D1
	AND.L	#$FFFF,D1
	OR.L	D6,D1
	
	AND.L	D3,D0
	AND.L	D3,D1
	ADD.L	D0,D0
	OR.L	D1,D0
	RTS	

.DC	LEA.L	(A0,D0.W),A1
	LSR.W	#2,D0
	SUBQ.W	#1,D0
.DC1	MOVE.L	(A0)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A0),D1
	LSR.L	D5,D1
	AND.L	#$FFFF,D1
	OR.L	D6,D1
	MOVE.L	(A1)+,D6
	LSR.L	D5,D6
	SWAP	D6
	CLR.W	D6
	MOVE.L	-2(A1),D2
	LSR.L	D5,D2
	AND.L	#$FFFF,D2
	OR.L	D6,D2
	AND.L	D3,D1
	AND.L	D3,D2
	ADD.L	D1,D1
	OR.L	D2,D1
	MOVE.L	D1,(A3)+
	DBF	D0,.DC1
	RTS	

