;	disassembly of CCP.SYS for Imsai IMDOS V2.05
;	address labels with Hnnnn are based on a system with 16k of memory.
;	named labels are the actual labels from the relocatable object file
;	see note at H2CF0 about checksum routine

;	last edit: 11/30/14

;	ORG	2780h	for reference only. this is a relocatable module

	EXTRN	BDOS,BDOSE,BIOS,SUFLAG,BTDISK,COPYHL,NXM,SELDSK,WINIT,CCPDSK
	
	PUBLIC	SYSBOT,SIGNON,INTVEC,ENCCP,LFSTCK,ABSTCK,BTSTCK

;	ccp module

	CSEG

SYSBOT:	DW 0000h
	DW H2D11
	DW BIOS
	DB 'COPYRIGHT (C) 1977 IMSAI MFG CORP '
SIGNON:	DB '32K IMDOS VERS 2.05 $'
H27BD:	MVI 	A,0Dh
	CALL	H27C4
	MVI 	A,0Ah
H27C4:	PUSH	B
	MVI 	C,02h
	CALL	H27FB
	POP 	B
	RET 	
H27CC:	PUSH	B
	CALL	H27BD
	POP 	D
H27D1:	MVI 	C,09h
	JMP 	0005h
H27D6:	CALL	H27E4
	DB	0Fh		;open file 	
	JM 	H28E8
	RET 	
H27DE:	CALL	H27E4
	DB	11h		;search for first
	INR 	A
	RET 	
H27E4:	LXI 	D,H2CF0		;fcb
H27E7:	XTHL			;call bdos with function# following call	
	MOV 	C,M		;pulled from HL pointer on stack
	INX 	H
	XTHL	
	JMP 	0005h
H27EE:	CPI 	61h
	RC 	
	CPI 	7Bh
	RNC	
	ANI 	5Fh
	RET 	
H27F7:	MVI 	A,0FFh
	MVI 	C,1Dh
H27FB:	MOV 	E,A
	JMP 	0005h
H27FF:	INR 	A
H2800:	STA 	H2D9C+2
	PUSH	B
	PUSH	D
	PUSH	H
	LXI 	H,H2D9F
	SHLD	H2D9C
	PUSH	H
	LXI 	D,H2D9C
	CALL	H27E7
	DB 32			;this bdos call# 32 adds drive letter terminated by $ 
	LHLD	H2D9C
	MVI 	M,24h
	POP 	D
	CALL	H27D1
	POP 	H
	POP 	D
	POP 	B
	RET 	
H2821:	LXI 	D,H2CCF
	LDA 	SUFLAG
	ORA 	A
	JZ 	H286B
	LXI 	H,H2CDE
	CMP 	M
	LDA 	BTDISK
	STAX	D
	MVI 	C,0Fh
	CZ 	0005h
	MOV 	A,M
	DCR 	A
	STA 	H2CEF
	MVI 	C,14h
	CP 	0005h
	JNZ	H2864
	DCR 	M
	CALL	H27E7
	DB 10h			;close file
	JM	H2864
	LXI 	D,H2D12
	LXI 	H,0080h
	MVI 	B,80h
	CALL	H2A22
	CALL	H28AB
	JZ 	H287F
	CALL	H289A
	JMP 	H2993
H2864:	XRA 	A
	STA 	H2D12
	CALL	H289A
H286B:	LXI 	D,H2D12
	LDAX	D
	DCX 	D
	ORA 	A
	JZ 	H287A
	CALL	H28AB
	JZ 	H287F
H287A:	MVI 	C,0Ah
	CALL	0005h
H287F:	LXI 	H,H2D12
	MOV 	B,M
H2883:	INX 	H
	MOV 	A,B
	ORA 	A
	JZ 	H2892
	MOV 	A,M
	CALL	H27EE
	MOV 	M,A
	DCR 	B
	JMP 	H2883
H2892:	MOV 	M,A
	LXI 	H,H2D13
	SHLD	H2D94+1
	RET 	
H289A:	LDA 	SUFLAG
	ORA 	A
	RZ 	
	LXI 	D,H2CCF
	CALL	H27E7
	DB	13h		;delete file
	XRA 	A
H28A7:	STA 	SUFLAG
	RET 	
H28AB:	LXI 	H,H2D12
	MOV 	C,M
H28AF:	INX 	H
	DCR 	C
	JM 	H28BB
	MOV 	A,M
	CALL	H27C4
	JMP 	H28AF
H28BB:	MVI 	A,0Dh
	CALL	H27C4
H28C0:	CALL	H27E7
	DB	0Bh		;console status
	MVI 	C,01h
	CNZ	0005h
	ORA 	A
	RET 	
H28CB:	LXI 	D,0080h
H28CE:	MVI 	C,1Ah
	JMP 	0005h
H28D3:	LXI 	D,H2964
	LXI	H,BDOS
	MVI	B,06H
H28DB:	LDAX	D
	MOV 	M,A
	INX 	D
	INX 	H
	DCR 	B
	JNZ	H28DB
	RET 	
H28E4:	CALL	H2926
	RZ 	
H28E8:	CALL	H27BD
	LHLD	H2D97
H28EE:	MOV 	A,M
	CPI 	20h
	JZ 	H28FF
	ORA 	A
	JZ 	H28FF
	CALL	H27C4
	INX 	H
	JMP 	H28EE
H28FF:	MVI 	A,3Fh
	CALL	H27C4
	CALL	H27BD
H2907:	CALL	H289A
	JMP 	H2993
H290D:	LHLD	H2D94+1
H2910:	MOV 	A,M
	CPI 	20h
	INX 	H
	JZ 	H2910
	DCX 	H
	SHLD	H2D94+1
	RNC	
	ORA 	A
	RZ 	
	JMP 	H28E8
H2921:	ADD 	L
	MOV 	L,A
	RNC	
	INR 	H
	RET 	
H2926:	LXI 	H,H2CF0
H2929:	XCHG	
	CALL	H290D
	SHLD	H2D97
	XCHG	
	SHLD	H2D93
	MVI 	C,24h
	LXI 	D,H2D93
	CALL	0005h
	MOV 	L,M
	ADD 	A
	JC 	H2943
	MVI 	H,00h
H2943:	SHLD	H2D99
	RRC 	
	RET
 	
H2948:	DB 'VER GO  DIR ERA TYPESAVEREN '

;	serial number

H2964:	DB 02h
	DB 00h			;revision# 0
	DB 02h,05h		;version# 2.05
	DB 0CDh,00h		;serial#

H296A:	LXI 	H,H2948
	MVI 	C,07h
H296F:	LXI 	D,H2CF1
	MVI 	B,04h
H2974:	LDAX	D
	CMP 	M
	JNZ	H2985
	INX 	D
	INX 	H
	DCR 	B
	JNZ	H2974
	LDAX	D
	CPI 	20h
	RZ 	
	DCX 	H
	INR 	B
H2985:	INX 	H
	DCR 	B
	JNZ	H2985
	DCR 	C
	JNZ	H296F
	RET 	
H298F:	POP 	B
H2990:	CALL	H27CC
H2993:	XRA 	A
	STA 	H2D12
H2997:	LXI 	SP,BDOS
	CALL	H28CB
	CALL	H27F7
	CALL	H27BD
	LDA 	CCPDSK
	LXI 	B,808Eh
	CALL	H27FB
	MOV 	A,E
	CALL	H27FF
	MVI 	A,3Eh
	CALL	H27C4
	CALL	H2821
	CALL	H28E4
	LDA 	H2D99
	ORA 	A
	JNZ	H2C37
	CALL	H296A
	LXI 	H,H29CF
	DAD 	B
	DAD 	B
	MOV 	A,M
	INX 	H
	MOV 	H,M
	MOV 	L,A
	PCHL	
H29CF:	DW H2C37
	DW H2BBC
	DW H2B72
	DW H2B2A
	DW H2AEB
	DW H2A3A
	DW H2C81
	DW H2A31
H29DF:	LXI 	H,H2CF1
	LXI 	B,000Bh
H29E5:	MOV 	A,M
	CPI 	20h
	JZ 	H2A08
	INX 	H
	SUI 	30h
	CPI 	0Ah
	JNC	H28E8
	MOV 	D,A
	MOV 	A,B
	CPI 	1Ah
	JNC	H28E8
	ADD 	A
	ADD 	A
	ADD 	B
	ADD 	A
	ADD 	D
	JC 	H28E8
	MOV 	B,A
	DCR 	C
	JNZ	H29E5
	RET 	
H2A08:	MOV 	A,M
	CPI 	20h
	JNZ	H28E8
	INX 	H
	DCR 	C
	JNZ	H2A08
	MOV 	A,B
	RET 	
H2A15:	LDA 	H2D9A
	ORA 	A
	RNZ	
H2A1A:	LXI 	H,H2A25
	LXI 	D,H2CF9
	MVI 	B,03h
H2A22:	JMP 	COPYHL
H2A25:	DB 'COM'
H2A28:	LXI 	H,0080h
	ADD 	C
	CALL	H2921
	MOV 	A,M
	RET 	
H2A31:	LXI 	B,SIGNON
	CALL	H27CC
	JMP 	H2CBF
H2A3A:	CALL	H2926
	LDA 	H2CF9
	CPI 	20h
	JNZ	H2A57
	LXI 	H,H2CF1
	MOV 	A,M
	CPI 	20h
	JNZ	H2A57
	MVI 	B,0Bh
H2A50:	MVI 	M,3Fh
	INX 	H
	DCR 	B
	JNZ	H2A50
H2A57:	CALL	H27DE
	JZ 	H2C0B
	DCR 	A
	PUSH	PSW
	LXI 	H,H2CF1
	MVI 	B,0Bh
H2A64:	MOV 	A,M
	CPI 	3Fh
	JNZ	H2A85
	INX 	H
	DCR 	B
	JNZ	H2A64
	LXI 	B,H2ADD
	CALL	H27CC
	LXI 	H,SELDSK
	INX 	H
	INX 	H
	MVI 	C,07h
H2A7C:	MOV 	A,M
	CALL	H27C4
	INX 	H
	DCR 	C
	JNZ	H2A7C
H2A85:	CALL	H27BD
	LDA 	H2CF0
	CALL	H2800
	MVI 	A,3Ah
	CALL	H27C4
	MVI 	A,20h
	CALL	H27C4
	POP 	PSW
	RRC 	
	RRC 	
	RRC 	
	ANI 	60h
	MOV 	C,A
	MVI 	B,01h
H2AA1:	MOV 	A,B
	CALL	H2A28
	CPI 	20h
	JNZ	H2AB5
	MVI 	A,09h
	CALL	H2A28
	MVI 	A,20h
	CMP 	M
	JZ 	H2ACC
H2AB5:	CALL	H27C4
	INR 	B
	MOV 	A,B
	CPI 	0Ch
	JNC	H2ACC
	CPI 	09h
	JNZ	H2AA1
	MVI 	A,20h
	CALL	H27C4
	JMP 	H2AA1
H2ACC:	CALL	H28C0
	JNZ	H2ADA
	CALL	H27E4
	DB	12h		;search for next
	PUSH	PSW
	JP 	H2A85
H2ADA:	JMP 	H2CBF
H2ADD:	DB 'VOLUME NAME: $'
H2AEB:	CALL	H2926
	CPI 	0Bh
	JNZ	H2B12
	LXI 	B,H2B19
	CALL	H27CC
	XRA 	A
	STA 	H2D12
	CALL	H2821
	LXI 	H,H2D12
	DCR 	M
	JNZ	H2993
	INX 	H
	MOV 	A,M
	CPI 	59h
	JNZ	H2993
	INX 	H
	SHLD	H2D94+1
H2B12:	CALL	H27E4
	DB	13h		;delete file
	JMP 	H2CBF
H2B19:	DB 'ALL FILES (Y/N)?$'
H2B2A:	CALL	H28E4
	CALL	H27D6
	CALL	H27BD
	LXI 	H,H2D9A+1
	MVI 	M,0FFh
H2B38:	LXI 	H,H2D9A+1
	MOV 	A,M
	ORA 	A
	JP 	H2B48
	CALL	H27E4
	DB	14h		;read sequential
	JNZ	H2B60
	MOV 	M,A
H2B48:	INR 	M
	LXI 	H,0080h
	CALL	H2921
	MOV 	A,M
	CPI 	1Ah
	JZ 	H2CBF
	CALL	H27C4
	CALL	H28C0
	JZ 	H2B38
	MVI 	A,01h
H2B60:	DCR 	A
	JZ 	H2CBF
	CALL	H298F
	DB 'READ ERROR$'
H2B72:	CALL	H2926
	LDA 	H2D99
	ORA 	A
	JNZ	H28E8
	CALL	H29DF
	ADD 	A
	PUSH	PSW
	CALL	H28E4
	CALL	H2A15
	CALL	H27E4
	DB	13h		;delete file		
	CALL	H27E4
	DB	16h		;make file
	JM	H2BB4
	LXI 	H,0100h
H2B95:	POP 	PSW
	JZ 	H2BAD
	DCR 	A
	PUSH	PSW
	XCHG	
	LXI 	H,0080h
	DAD 	D
	CALL	H28CE
	CALL	H27E4
	DB	15h		;write sequential
	JP 	H2B95
	CALL	H2BB4
H2BAD:	CALL	H27E4
	DB	10h		;close file
	JP	H2CBF
H2BB4:	MVI 	C,21h
	CALL	H27FB
	JMP 	H2907
H2BBC:	CALL	H28E4
	LDA 	H2D99
	ORA 	A
	JNZ	H2BCA
	LDA 	CCPDSK
	INR 	A
H2BCA:	PUSH	PSW
	CALL	H27DE
	LXI 	B,H2C18
	JNZ	H2990
	LXI 	H,H2CF0
	LXI 	D,H2D00
	MVI 	B,10h
	CALL	H2A22
	LHLD	H2D94+1
	MOV 	A,M
	CPI 	3Dh
	JZ 	H2BED
	CPI 	5Fh
	JNZ	H28E8
H2BED:	INX 	H
	SHLD	H2D94+1
	CALL	H28E4
	POP 	PSW
	MOV 	B,A
	LDA 	H2D99
	ORA 	A
	JZ 	H2C04
	CMP 	B
	LXI 	B,H2C24
	JNZ	H2990
H2C04:	CALL	H27E4
	DB	17h		;rename file 	
	JP 	H2CBF
H2C0B:	CALL	H298F
	DB 'NOT FOUND$'
H2C18:	DB 'FILE EXISTS$'
H2C24:	DB 'DIFFERENT DRIVES??$'
H2C37:	CALL	H28D3
	LDA 	H2CF1
	CPI 	20h
	JNZ	H2C4F
	LDA 	H2D99
	DCR 	A
	JM 	H2CBF
	STA 	CCPDSK
	JMP 	H2CBF
H2C4F:	LDA 	H2CF9
	CPI 	20h
	JNZ	H28E8
	CALL	H2A1A
	CALL	H2C85
	LHLD	H2CF1
	LXI 	D,0AAADh
	DAD 	D
	MOV 	A,H
	ORA 	L
	CMA 	
	CZ 	H28A7
	LXI 	H,H2993
	XTHL	
	LXI 	H,0100h		;for .COM file
	SHLD	H2D00		;load address
	SHLD	H2D02		;execute address
	CALL	H27E4		;load and execute file via
	DB	2Bh		;bdos call #43 
	LXI 	H,H2D13		;invalid filename returns here
	JMP 	H28EE
H2C81:	LXI 	H,0100h
	PUSH	H
H2C85:	LXI 	H,005Ch
	CALL	H2929
	LXI 	H,006Ch
	CALL	H2929
	CALL	H27F7
	LXI 	H,H2D12
H2C97:	INX 	H
	MOV 	A,M
	ORA 	A
	JZ 	H2CA2
	CPI 	20h
	JNZ	H2C97
H2CA2:	MVI 	B,0FFh
	LXI 	D,0081h
H2CA7:	INR 	B
	MOV 	A,M
	STAX	D
	ORA 	A
	INX 	H
	INX 	D
	JNZ	H2CA7
	MOV 	A,B
	STA 	0080h
	CALL	H27BD
	LXI 	H,H2993
	XTHL	
	PUSH	H
	JMP 	H28CB
H2CBF:	LHLD	H2D94+1
	MOV 	A,M
	ORA 	A
	JZ 	H2993
	CPI 	3Bh
	JZ 	H2993
	JMP 	H28E8

H2CCF:	DB 00h
	DB '$$$     SUB'
	DB 00h,00h,00h
H2CDE:	DB 0FFh
	DS 16
H2CEF:	DB 00h

;H2CF0 is also beginning of 256 bytes that get added in checksum routine (H2DF0-256 in BDOS)

H2CF0:	DS 1		;fcb
H2CF1:	DS 8		;filename
H2CF9:	DS 3		;filetype
	DS 4
H2D00:	DS 2
H2D02:	DS 15
H2D11:	DB 7Fh

;if there is a startup command, it is placed here by genesys

H2D12:	DB 00h		;# of chars in buffer
H2D13:	DS 80h		;input buffer

;the next 15 bytes are shared after boot init

H2D93:	DB 00h		;=0000:JMP BIOS
H2D94:	DW BIOS
	DB 05h		;=0005:JMP BDOSE
H2D97:	DW BDOSE
H2D99:	DB 38h		;=0038:JMP NXM
H2D9A:	DW NXM
INTVEC:
ENCCP:
H2D9C:	CALL	WINIT
H2D9F:	LXI	D,H2D93

;this area called during boot init then becomes stack space

	MVI 	C,03h	;3 jump vectors
	MVI 	H,00h
H2DA6:	LDAX	D
	MOV 	L,A
	MVI 	M,0C3h	;set up 0000: JMP BIOS
	INX 	D	;       0005: JMP BDOSE
	INX 	H	;       0038: JMP NXM
	LDAX	D
	MOV 	M,A
	INX 	D
	INX 	H
	LDAX	D
	MOV 	M,A
	INX 	D
	DCR 	C
	JNZ	H2DA6
	LDA 	CCPDSK
	INR 	A
	JNZ	H2993
	STA 	CCPDSK
	LXI 	B,SIGNON
	CALL	H27CC
	CALL	H27E7
	DB	0Dh		;reset disk system
	CALL	H28A7
	DB	0C3h		;JMP H2997

;stack pointers

LFSTCK:	DW 	H2997
ABSTCK:
BTSTCK:	DW	H2D9F

	END
