;	disassembly of sysmov utility for Imdos V2.05
;	last edit: 12/01/14

;	ORG	0100h	;for M80/L80

	cseg

;called from genesys after image created at H0600

H0100:	JMP 	H0130
	JMP 	H0128
H0106:	JMP 	H0583	;genesys entry point

	DB 'COPYRIGHT(C)1977,IMSAI MFG CORP'
H0128:	XRA 	A
	LXI 	SP,H05DE
	CALL	H0133
	RST 	07
H0130:	LDA 	0080h
H0133:	LXI 	H,0000h
	DAD 	SP
	SHLD	H0387+1
	LXI 	SP,H05DC
	CALL	H0548

	DB 0Dh,0Ah
	DB 'SYSMOV VERS 2.05'
	DB 0Dh,0Ah,00h
	ORA 	A
	CNZ	H0285
	CALL	H038C
H015C:	MVI 	A,01h
	LXI 	D,H022E
	LXI 	H,H0106
	CALL	H0415
	JC 	H015C
	JZ 	H018A
	CALL	H0548

	DB 'SOURCE ON $'
	CALL	H051D
	JC 	H018A
	LXI 	D,H0247
	CALL	H03A8
	CALL	H02C2
H018A:	CALL	H01A6

	DB 'PUT SYSTEM? (Y/N/DISK:) $'
H01A6:	POP 	D
H01A7:	MVI 	A,02h
	LXI 	H,H0100
	CALL	H0415
	JC 	H01A7
	JZ 	H022B
	CALL	H0548

	DB 'DESTINATION ON $'
	CALL	H051D
	JC 	H022B
	LXI 	D,H0264
	CALL	H03A8			;load boot sector and check serial, vcb
	LDA 	H0600
	CPI 	10h
	JNZ	H01FE
	CALL	H036A

	DB "   CAN'T PUT OBSELETE SYSTEM"
	DB 0Dh,0Ah
	DB '$'
H01FE:	LDA 	00DBh
	LXI 	H,H06FF
	SUB 	M
	JNC	H0218
	CALL	H036A

	DB "   WON'T FIT$"
H0218:	LXI 	H,00C7h
	LXI 	D,H0647
	MVI 	C,2Ch
H0220:	MOV 	A,M
	STAX	D
	INX 	D
	INX 	H
	DCR 	C
	JNZ	H0220
	CALL	H02C5
H022B:	JMP 	H0386

H022E:	DB 'GET SYSTEM? (Y/N/DISK:) $'
H0247:	DB 'HAS OBSELETE SYSTEM ON IT ??$'
H0264:	DB "MUST BE 'FORMAT'ED BEFORE SYSMOV$"
H0285:	LXI 	H,0080h
	LXI 	D,H0100
	MVI 	B,3Dh
	CALL	H0295
	LXI 	D,H0106
	MVI 	B,00h
H0295:	MVI 	C,04h
H0297:	INX 	H
	CALL	H04FE
	STAX	D
	INX 	D
	DCR 	C
H029E:	JM 	H02A8
	SUB 	B
	JNZ	H0297
	DCX 	D
	STAX	D
	RET 	
H02A8:	CALL	H036A

	DB '    BAD COMMAND LINE'
	DB 0Dh,0Ah,00h
H02C2:	MVI 	A,20h
	DB	21h	;	LXI 	H,nnnn
H02C5:	MVI	A,10h	
	STA 	H049B
	LXI 	H,H0600
	SHLD	H033C+1
	MVI 	A,05h
	STA 	H0302+1
	MOV 	A,L
	MOV 	H,L
	SHLD	H049D
	LXI 	D,0080h
H02DD:	MOV 	C,A
	LDA 	00E1h		;=1Ah
	ORA 	A
	JZ 	H0333		;not taken
H02E5:	MOV 	B,C		;=5
	INR 	C
	MOV 	A,C		;=6
	STA 	H049F
	CALL	H033C
	SHLD	H04A0
	DAD 	H
	MOV 	A,H
	SUI 	0Ch
	LXI 	H,00DBh
	SUB 	M
	INR 	A
	CC 	H035D		;call bdos UQUEIO
	JM 	H036E		;if error then abort
	MOV 	C,A		;=0
	MOV 	A,B		;=0
H0302:	ADI 	05h		;self modified
H0304:	LXI 	H,00E1h		;self modified
	CMP 	M		;a=5 m=1Ah
	JC 	H02DD		;taken
	SUB 	M
	JNZ	H02DD
	DCR 	C
	JP 	H0345		;when function complete
	MOV 	C,M
	LXI 	H,H049E
	INR 	M
	INR 	C
	CALL	H033C
	SHLD	H033C+1
	LHLD	00DDh
	ORA 	H
	JZ 	H02E5
	LDA 	00E0h
	STA 	H049D
	LDA 	00E2h
	STA 	H0302+1
	XCHG	
H0333:	LXI 	H,00D7h
	SHLD	H0304+1
	JMP 	H02E5
H033C:	LXI 	H,H0600		;self modified
H033F:	DCR 	C
	RZ 	
	DAD 	D
	JMP 	H033F
H0345:	CALL	H0548

	DB 'FUNCTION COMPLETE'
	DB 0Dh,0Ah
	DB '$'
	RET 	
H035D:	PUSH	D
	PUSH	B
	LXI 	D,H0494
	MVI 	C,28h		;bdos function #40 = UQUEIO
	CALL	0005h
	POP 	B
	POP 	D
	RET 	
H036A:	POP 	D
H036B:	CALL	H0566
H036E:	CALL	H0548

	DB '   SYSMOV ABORTED'
	DB 0Dh,0Ah
	DB '$'
	DB 3Eh			;MVI A,0AFh
H0386:	XRA	A
H0387:	LXI 	H,0000h		;self modified
	SPHL	
	RET

;get serial# and check imdos version
 	
H038C:	LHLD	0006h
	DCX 	H
	DCX 	H
	SHLD	H03F3+1		;points to serial#
	DCX 	H
	MOV 	A,M		;check imdos version
	SUI 	05h
	CPI 	05h
	JNC	H03A2
	DCX 	H
	MOV 	A,M
	SUI 	02h
	RZ 	
H03A2:	LXI 	D,H05A7		;incompatible version
	JMP 	H036B
H03A8:	CALL	H03E0		;load boot sector then check serial# and vcb
	RNC			;if ok	
	CALL	H0548

	DB '   BAD VOLUME CONTROL BLOCK:'
	DB 0Dh,0Ah
	DB '      DISKETTE $'
	JMP 	H036B
H03E0:	PUSH	B
	PUSH	D
	LXI 	D,0080h
	MVI 	C,1Ah		;set dma
	CALL	0005h
	LDA 	H0493
	MOV 	E,A
	MVI 	C,22h		;read volume control block
	CALL	0005h
H03F3:	LHLD	0000h		;self modified to LHLD serial#
	XCHG			;BC points to volume name checksum in vcb	
	LXI 	H,001Eh
	DAD 	B		;now BC points to serial# in vcb
	MOV 	A,M		;compare bdos serial with vcb by subtracting them
	SUB 	E
	MOV 	E,A
	INX 	H
	MOV 	A,M
	SUB 	D
	ORA 	E
	STC 	
	JNZ	H0412		;if serial mismatch, return carry set 
	LDA 	00E0h		;??? field in vcb
	ORA 	A
	JZ 	H0412		;taken
	LDA 	H0493		;=22h
	CPI 	25h
H0412:	POP 	D
	POP 	B
	RET			;carry clear = vcb valid 	
H0415:	PUSH	B
	PUSH	D
	PUSH	H
	STA 	H049A
	MOV 	A,M
	ORA 	A
	JP 	H0426
	CALL	H056C
	CALL	H04EC
H0426:	CALL	H04A2
	JM 	H0441
	STA 	H049A
	CALL	H04FE
	ORA 	A
	JNZ	H044F
H0436:	CALL	H0481
	JM 	H0479
	ORI 	01h
	JMP 	H047A
H0441:	MOV 	A,M
	CALL	H057A
	CPI 	59h
	JZ 	H0436
	CPI 	4Eh
	JZ 	H047A
H044F:	CALL	H0548

	DB '   "Y", "N", OR DISK NAME WITH COLON'
	DB 0Dh,0Ah
	DB '$'
H0479:	STC 	
H047A:	POP 	H
	POP 	D
	POP 	B
	RNC	
	MVI 	M,0C3h
	RET 	
H0481:	PUSH	B
	PUSH	D
	LDA 	H049A
	MOV 	E,A
	LXI 	B,H029E
	CALL	0005h
	STA 	H0493
	POP 	D
	POP 	B
	RET 	
H0493:	DB 03h

; parameters for bdos call #40

H0494:	DB 2Bh,7Eh
	DB 07h,0Ch,9Ah,04h
H049A:	DB 0D2h			;set =2 before call
H049B:	DB 0A2h			;r/w function set =10h for write
	DB 03h	
H049D:	DB 2Bh			;set =0
H049E:	DB 7Eh			;set =0
H049F:	DB 0D6h			;set =1
H04A0:	DB 02h,0C8h		;dma set = dw 0600h
H04A2:	PUSH	B
	PUSH	D
	CALL	H04FE
	SHLD	H04B9
	LXI 	D,H04B9
	LXI 	B,019Fh
	CALL	0005h
	LHLD	H04B9
	POP 	D
	POP 	B
	RET 	

H04B9:	DB 'UM'
H04BB:	DB 'E'
H04BC:	DB ' CONTROL'
H04C4:	PUSH	B
	PUSH	D
	PUSH	H
	LDA 	H049A
	STA 	H04BB
	LXI 	H,H04BC
	SHLD	H04B9
	PUSH	H
	MVI 	C,20h
	LXI 	D,H04B9
	CALL	0005h
	LHLD	H04B9
	MVI 	M,3Ah
	INX 	H
	MVI 	M,24h
	POP 	D
	CALL	H056C
	POP 	H
	POP 	D
	POP 	B
	RET 	
H04EC:	PUSH	B
	PUSH	D
	MVI 	C,0Ah
	LXI 	D,H0506
	CALL	0005h
	CALL	H0569
	LXI 	H,H0508
	POP 	D
	POP 	B
H04FE:	MOV 	A,M
	CPI 	20h
	RNZ	
	INX 	H
	JMP 	H04FE
H0506:	INR 	D
	NOP 	
H0508:	NOP 	
	ORA 	A
	JZ 	H0412
	LDA 	H0493
	CPI 	25h
	POP 	D
	POP 	B
	RET 	
	PUSH	B
	PUSH	D
	PUSH	H
	STA 	H049A
	MOV 	A,M
	ORA 	A
H051D:	CALL	H04C4
	MOV 	A,M
	ORA 	A
	JP 	H0569
	CALL	H0548

	DB ', TYPE RETURN $'
	CALL	H04EC
	ORA 	A
	RZ 	
	CALL	H0548

	DB '   ?'
H0543:	DB 0Dh,0Ah
	DB '$'
	STC 	
	RET 	
H0548:	XTHL	
	PUSH	PSW
	PUSH	B
	PUSH	D
H054C:	MOV 	E,M
	MVI 	C,02h
	PUSH	H
	CALL	0005h
	POP 	H
	INX 	H
	MOV 	A,M
	CPI 	24h
	JZ 	H0560
	CPI 	00h
	JNZ	H054C
H0560:	INX 	H
	POP 	D
	POP 	B
	POP 	PSW
	XTHL	
	RET 	
H0566:	CALL	H056C
H0569:	LXI 	D,H0543
H056C:	PUSH	PSW
	PUSH	B
	PUSH	D
	MVI 	C,09h
	PUSH	H
	CALL	0005h
	POP 	H
	POP 	D
	POP 	B
	POP 	PSW
	RET 	
H057A:	CPI 	61h
	RC 	
	CPI 	7Bh
	RNC	
	ANI 	0DFh
	RET 	
H0583:	LXI 	H,0000h
	DAD 	SP
	SHLD	H0387+1
	LXI 	SP,H05DC
	CALL	H038C
	CALL	H01A6

	DB 'DESTINATION DISK:? $'
H05A7:	DB 'INCOMPATIBLE VERSION OF SYSTEM$'

H05DC	EQU	05DCh		;top of stack
H05DE	EQU	H05DC+2
H0600	EQU	0600h		;genesys image buffer
H0647	EQU	H0600+47h
H06FF	EQU	H0600+0FFh

	END
