;	ORG	0100h	for relocation

;usage: genesys nn * does active relocation to nnK of memory

;	last edit: 12/01/14
;	see notes on a confirmed bug at H0B7E

H0000	EQU	0000h		;warm reboot
H0005	EQU	0005h
H005C	EQU	005Ch		;FCB
H0069	EQU	0069h		;hidden location to store 2 digit serial# for checksum seed
H0080	EQU	0080h

	cseg

	JMP 	H052E

	DB 'COPYRIGHT (C) 1978 IMSAI MFG CORP SAN LEANDRO, CA 94557'

H013A:	LDA 	H0E7F
	ORA 	A
	RNZ	
H013F:	CALL	H0679

	DB 0Ah,0Dh
	DB 'How many multiple density system'
	DB 0Ah,0Dh
	DB 'buffers do you want? '
	DB 00h

	MVI 	A,03h
	CALL	H0CE9
	JC 	H013F
	CALL	H0679

	DB 0Ah,0Dh,00h

	MOV	A,L
	STA	V0ECC
	SHLD	V0ECA
	SHLD	H0E7C
	ORA	A
	RZ
	MVI	A,44h
	STA	H0E27
H019B:	CALL	H0679

	DB 0Ah,0Dh
	DB 'Buffer size (256 or 1024)? '
	DB 00h

	MVI 	A,05h
	CALL	H0CE9
	JC 	H019B
	SHLD	V0ECA
	XCHG	
	LXI 	H,0400h
	CALL	H0C9A
	ORA 	L
	LXI 	H,0100h
	CNZ	H0C9A
	ORA 	L
	JNZ	H019B
	MOV 	H,D
	MOV 	L,E
	INX 	D
	INX 	D
	LDA 	V0ECC
H01E0:	DAD 	D
	DCR 	A
	JC 	H013F
	JNZ	H01E0
	SHLD	H0E7C
	RET 	
H01EC:	LXI 	H,H0E03
	SHLD	H0E01
	LXI 	H,V0EE3
	SHLD	H0DFB
	LXI 	H,V0ED9
	SHLD	H0DFD
H01FE:	LXI 	H,H0E0C
	SHLD	H0E50
	CALL	H02C7
	MVI 	A,02h
	STA 	V0F2A
H020C:	CALL	H02C0
	LDA 	V0F2A
	CPI 	02h
	JNZ	H021D
	CALL	H027E		;check serial#
	LDA 	V0F2A
H021D:	CPI 	05h
	JNZ	H023F
	LDA 	V0ECC
	ORA 	A
	JNZ	H023C
	LXI 	H,H0E80
	CALL	H0B43
	XCHG	
	MOV 	E,M
	INX 	H
	MOV 	D,M
	LHLD	H0E5A
	CALL	H0C9A
	SHLD	H0EB6
H023C:	LDA 	V0F2A
H023F:	INR 	A
	STA 	V0F2A
	CPI 	06h
	RNC	
	JMP 	H020C
H0249:	LDA 	V0F2A
	MOV 	B,A
	MVI 	A,06h
	SUB 	B
	ADI 	31h
	STA 	H0266
	CALL	H0BD7

	DB 'Module number '
H0266:	DB 62h
	DB ' was not found. Sorry.$'

;check bdos serial#

H027E:	LHLD	H0005+1
	DCX 	H
	MOV 	D,M		;get system serial#
	DCX 	H
	MOV 	E,M
	LXI 	H,H13FF+4	;location of new BDOS.SYS serial#
	MOV 	A,M
	CMP 	E
	JNZ	H0291
	INX 	H
	MOV 	A,M
	CMP 	D
	RZ 	
H0291:	CALL	H0BD7

	DB 'SYNCHRONIZATION ERROR**********************'
	DB 00h

H02C0:	LHLD	H0E50
	INX 	H
	SHLD	H0E50
H02C7:	LXI 	D,H0E4E		;parameter block
	MVI 	C,24h		;bdos function #36 parses filename to FCB
	CALL	H0005
	LXI 	D,H005C		;FCB
	MVI 	C,0Fh		;open file
	CALL	H0005
	JM 	H0249
	LXI 	H,V0F4E
	CALL	H0DA7
	LXI 	H,H13FF
	SHLD	H0E5A
	SHLD	H0E5C
	CALL	H08EA
	CALL	H08F4
	LHLD	V0F3D
	LXI 	D,H13FF
	CALL	H0C9A
	XCHG	
	LHLD	H0E7A
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	SHLD	H0E7A
	RET 	
H0304:	LXI 	H,0000h
	XCHG	
	LHLD	V0ECF
	DAD 	D
	XCHG	
	LHLD	V0ED1
	DAD 	D
	XCHG	
	LHLD	V0ED3
	DAD 	D
	XCHG	
	LHLD	V0ED5
	DAD 	D
	XCHG	
	LHLD	V0ED7
	DAD 	D
	LDA 	V0ECC
	MOV 	B,A
	ADD 	A
	MOV 	C,A
	ADD 	A
	ADD 	B
	ADD 	C
	MOV 	E,A
	MVI 	D,00h
	INX 	D
	DAD 	D
	JNZ	H033A
	XCHG	
	LHLD	H0EB6
	XCHG	
	CALL	H0C9A
	DCX 	H
H033A:	SHLD	V0F2F
	PUSH	H
	DAD 	D
	LXI 	D,007Fh
	DAD 	D
	MOV 	A,L
	ANI 	80h
	MOV 	L,A
	SHLD	V0F35
	POP 	D
	CALL	H0C9A
	LDA 	V0ECC
	ORA 	A
	JZ 	H0358
	LXI 	H,0050h
H0358:	SHLD	H0E4C
	SHLD	H048A+1
	RET 	
H035F:	LDA 	H0E7F
	ORA 	A
	JNZ	H038A
H0366:	CALL	H0679

	DB 0Ah,0Dh
	DB 'Top of system (in K)? $'

	LXI 	D,H0E3A
	MVI 	C,0Ah
	CALL	H0005
H038A:	LXI 	D,H0E3B
	LDAX	D
	ORA 	A
	JNZ	H039B
	CALL	H04E5
	CALL	H050C
	JMP 	H03AF
H039B:	CALL	H0CF3
	JC 	H0366
	MOV 	H,L
	MVI 	L,00h
	MVI 	A,40h
	CMP 	H
	JC 	H0366
	DAD 	H
	DAD 	H
	SHLD	V0F33
H03AF:	LHLD	H0E7C
	XCHG	
	LHLD	V0F2F
	DAD 	D
	LXI 	B,0180h
	DAD 	B
	SHLD	V0F31
	XCHG	
	LHLD	V0F33
	DCX 	H
	CALL	H0C9A
	JC 	H0366
	INX 	H
	SHLD	V0F39
	XCHG	
	LHLD	H0E4C
	LXI 	B,2000h
	DAD 	B
	XCHG	
	CALL	H0C9A
	JC 	H0366
	LDA 	H0E7F
	ORA 	A
	JNZ	H0486
H03E3:	CALL	H0679

	DB 0Ah,0Dh
	DB 'This leaves '
	DB 00h

	LHLD	V0F39
	CALL	H0674

	DB '0000H bytes for TPA and mount space.'
	DB 0Ah,0Dh
	DB 'How much to allocate for mount space (minimum '
	DB 00h

	LHLD	H0E4C
	CALL	H0674

	DB '0000H)? $'

	LXI 	D,H0E43
	MVI 	C,0Ah
	CALL	H0005
	CALL	H0679

	DB 0Ah,0Dh,00h
	
	INX 	D
	LDAX	D
	MOV 	B,A
	INX 	D
	CALL	H0CA1
	JC 	H04CB
	XCHG	
	LHLD	H0EB6
	CALL	H0C9A
	DAD 	D
	JNC	H0483
	XCHG	
H0483:	SHLD	V0ECD
H0486:	LHLD	V0ECD
	PUSH	H
H048A:	LXI 	D,0050h		;self modified
	CALL	H0C9A
	POP 	D
	LHLD	V0F39
	JC 	H03E3
	CALL	H0C9A
	LXI 	D,2000h
	CNC	H0C9A
	JNC	H04CE
	CALL	H0679

	DB 0Ah,0Dh
	DB 'Minimum TPA is 2000H. Try again.'
	DB 0Ah,0Dh,00h

H04CB:	JMP 	H03E3
H04CE:	LHLD	V0ECD
	XCHG	
	LHLD	V0F31
	DCR 	H
	DAD 	D
	XCHG	
	LHLD	V0F33
	DCX 	H
	CALL	H0C9A
	INX 	H
	RC 	
	SHLD	V0F37
	RET 	
H04E5:	PUSH	H
	LHLD	H0EB9
	INX 	H
	SHLD	V0F33
	DCX 	H
	MOV 	A,H
	ANI 	0FCh
	RRC 	
	RRC 	
	INR 	A
	LXI 	H,2F2Fh
H04F7:	INR 	L
	SUI 	0Ah
	JP 	H04F7
	ADI 	0Ah
H04FF:	INR 	H
	DCR 	A
	JP 	H04FF
	SHLD	H0E3C
	SHLD	H051E
	POP 	D
	RET 	
H050C:	CALL	H0679

	DB 0Ah,0Dh
	DB 'Constructing '
H051E:	DB 2Eh,0Ah
	DB 'K system. '
	DB 0Ah,0Dh,00h

	RET 	
H052E:	LXI 	SP,H0EB6
	CALL	H0EC8
	CALL	H0F61
	CALL	H0FEC
H053A:	CALL	H013A
	CALL	H01EC
	CALL	H0304
	CALL	H035F
	JC 	H053A
	CALL	H0857
	CALL	H06C1
	CALL	H071A
	CALL	H07C4
	LXI 	SP,H0080
	LXI 	H,0000h
	PUSH	H
	CALL	H05C3
	JMP 	H0562
H0562:	LXI 	D,H05AF
	MVI 	C,2Bh
	CALL	H0005
	LXI 	D,H0574
	MVI 	C,09h
	CALL	H0005
	POP 	H
	RET 	

H0574:	DB 0Ah,0Dh
	DB 'SYSMOV could not be loaded.'
	DB 0Ah,0Dh
	DB 'Control returned to system.'
	DB 00h
H05AF:	DB 00h
	DB 'SYSMOV  COM'
	DB 00h,00h,00h,00h
	DW 0100h		;load address for sysmov.com
	DW 0106h		;execution address

H05C3:	LDA 	H0E7E
	ORA 	A
	JNZ	H05E0
	LHLD	V0F35
	INR 	H
	XCHG	
	LXI 	B,H0600
	LXI 	H,V0F4E
H05D5:	MOV 	A,M
	STAX	B
	INX 	B
	INX 	H
	DCX 	D
	MOV 	A,D
	ORA 	E
	JNZ	H05D5
	RET 	
H05E0:	CALL	H0679

	DB 0Ah,0Dh
	DB '[Passing control to new syt'

H0600:	;new system track image created here

	DB 'em.]'
	DB 0Ah,0Dh
	DB '[System on disk is unchanged.]'
	DB 0Ah,0Dh,00h

	LHLD	H0005+1
	DCX 	H
	MOV 	D,M		;get 2 digit serial#
	DCX 	H
	MOV 	E,M
	XCHG	
	SHLD	H0069		;store for checksum seed
	LXI 	H,H0E80
	CALL	H0B43
	MVI 	A,65h
	JZ 	H0694
	XCHG	
	MOV 	E,M
	INX 	H
	MOV 	D,M
	XCHG	
	PUSH	H
	LHLD	H0EBB
	DCX 	H
	XCHG	
	LHLD	H0EBF
	XCHG	
	MOV 	B,M
H064D:	MOV 	A,M
	STAX	D
	INX 	H
	INX 	D
	DCR 	B
	JNZ	H064D
	LHLD	H0EB6
	XCHG	
	LHLD	V0F2F
	DAD 	D
	XCHG	
	LHLD	V0EE3
	LXI 	B,V104E		;base of CCP
	DAD 	D
	XCHG	
	PUSH	H
	DAD 	B
	POP 	B
H0669:	DCX 	H
	DCX 	D
	MOV 	A,M
	STAX	D
	DCX 	B
	MOV 	A,B
	ORA 	C
	JNZ	H0669
	RET 	
H0674:	POP 	D
	CALL	H0CC1
	PUSH	D
H0679:	XTHL	
	PUSH	B
	PUSH	D
H067C:	MOV 	A,M
	INX 	H
	ORA 	A
	JZ 	H0690
	CPI 	24h
	JZ 	H0690
	MOV 	E,A
	MVI 	C,02h
	CALL	H0005
	JMP 	H067C
H0690:	POP 	D
	POP 	B
	XTHL	
	RET 	
H0694:	STA 	H06AC
	CALL	H0BD7

	DB "Impossible error '"
H06AC:	DB "m'. GENESYS aborted.$"

H06C1:	LDA 	H0E7E
	ORA 	A
	RNZ	
	CALL	H0679

	DB 0Ah,0Dh
	DB 'Enter cold boot command: '
	DB 0Ah,0Dh,00h

	LHLD	V0EE3
	XCHG	
	LHLD	V1050			;ccp startup command in buffer (SYSBOT+2) 
	CALL	H0C9A
	LXI 	D,V104E
	DAD 	D
	XCHG	
	MVI 	C,0Ah
	CALL	H0005
	CALL	H0679
	DB 0Ah,0Dh,00h
	RET 	
H0702:	STA 	H0EB8
	CALL	H0B43
	JNZ	H0711
	LDA 	H0EB8
	CALL	H0694
H0711:	XCHG	
	MOV 	E,M
	INX 	H
	MOV 	D,M
	LHLD	V0F3B
	DAD 	D
	RET 	
H071A:	LHLD	V0EE5
	XCHG	
	LHLD	V0EDB
	CALL	H0C9A
	SHLD	V0F3B
	LHLD	H0E5A
	LDA 	V0ECC
	ORA 	A
	RZ 	
	MOV 	B,A
	XRA 	A
H0731:	DCR 	B
	JM 	H073B
	MOV 	M,A
	INR 	A
	INX 	H
	JMP 	H0731
H073B:	SHLD	V0F22
	LHLD	H0E7C
	LXI 	D,0080h
	DAD 	D
	XCHG	
	LHLD	V0F33
	CALL	H0C9A
	SHLD	H0E64
	XCHG	
	LHLD	V0F22
	LDA 	V0ECC
	MOV 	B,A
H0757:	MVI 	M,00h
	INX 	H
	MVI 	M,00h
	INX 	H
	MVI 	M,00h
	INX 	H
	MVI 	M,00h
	INX 	H
	INX 	D
	INX 	D
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	PUSH	H
	LHLD	V0ECA
	DAD 	D
	XCHG	
	POP 	H
	DCR 	B
	JNZ	H0757
	MVI 	M,0FFh
	INX 	H
	XCHG	
	LHLD	V0F3B
	XCHG	
	CALL	H0C9A
	SHLD	V0F24
	RET 	
H0783:	LHLD	V0EE3
	XCHG	
	LHLD	V0ED9
	CALL	H0C9A
	SHLD	V0F3B
	LHLD	V0F35
	DAD 	H
	MOV 	A,H
	STA 	V0FFE
	ADI 	02h
	STA 	H104D
	LHLD	V0EE3
	DCR 	H
	SHLD	H0FE8
	LHLD	V0F33
	LXI 	B,0FF80h
	DAD 	B
	SHLD	V0FCF
	SHLD	H0EBF
	LHLD	V0F37
	DAD 	H
	MOV 	A,H
	STA 	H0FFC
	LHLD	V0EE5		;base of new bdos
	XCHG	
	LXI 	H,V104E
	MOV 	M,E		
	INX 	H
	MOV 	M,D
	RET 	
H07C4:	LHLD	V0ECA
	XCHG	
	LHLD	V0F33
	LXI 	B,0FF80h
	DAD 	B
	LDA 	V0ECC
	ORA 	A
	JNZ	H07D9
	SHLD	H0E64
H07D9:	PUSH	H
	CALL	H0C9A
	PUSH	H
	LHLD	V0F33
	DCX 	H
	PUSH	H
	MVI 	A,41h
	LXI 	H,H0DC8
	CALL	H0702
	XCHG	
	LHLD	H0E64
	DCX 	H
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	POP 	D
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	POP 	D
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	POP 	D
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	LDA 	V0ECC
	ORA 	A
	JZ 	H0814
	XCHG	
	LHLD	V0F24
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	DCX 	H
H0814:	INX 	H
	INX 	H
	MOV 	M,A
	INX 	H
	XCHG	
	LHLD	V0F2B
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	XCHG	
	LDA 	V0ECC
	MOV 	C,A
	MVI 	B,00h
	DAD 	B
	XCHG

;this routine creates magic checksum byte which is used by imdos for validation 
	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	PUSH	H		;end of range to get added for checksum
	LHLD	H0005+1
	DCX 	H
	MOV 	A,M		;get the serial# to E,A
	DCX 	H
	MOV 	E,M
	POP 	H		;end of checksum range
	LXI 	B,0FF01h	;-254
	DAD 	B		;beginning of range for checksum
	MVI 	D,00h
H083C:	INX 	H		;checksum algorithm loop
	ADD 	E		;serial# in E,A is seed value
	RLC 	
	XRA 	M
	DCR 	E
	DCR 	D
	JNZ	H083C
	MOV 	M,A		;checksum value

	MVI 	A,42h
	LXI 	H,H0DF5
	CALL	H0702
	XCHG	
	LHLD	H0E3C
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	RET 	
H0857:	LXI 	H,H0080
	CALL	H0DA7
	LXI 	H,V0F4E
	SHLD	H0E5A
	SHLD	H0E58
	LXI 	H,0000h
	SHLD	H0E5C
	CALL	H08EA
	LXI 	D,H0DFF
	MVI 	C,24h
	CALL	H0005
	LXI 	D,005Ch
	MVI 	C,0Fh
	CALL	H0005
	CALL	H08F4
	LHLD	V0F37
	SHLD	V0F3D
	LXI 	H,V104E		;base of ccp
	SHLD	H0E5A
	MVI 	A,05h
	STA 	V0F2A
H0893:	LHLD	V0F3D
	SHLD	H0E5C
	XCHG	
	LHLD	H0DFB
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	SHLD	H0DFB
	LHLD	H0E5A
	SHLD	H0E58
	XCHG	
	LHLD	H0DFD
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	SHLD	H0DFD
	CALL	H08CF
	LDA 	V0F2A
	DCR 	A
	STA 	V0F2A
	JNZ	H0893
	LHLD	V0F3D
	SHLD	V0F2B
	CALL	H0783
	CALL	H0D14
	RET 	
H08CF:	CALL	H08EA
	LXI 	H,H0E01
	INR 	M
	DCX 	H
	DCX 	H
	XCHG	
	MVI 	C,24h
	CALL	H0005
	LXI 	D,005Ch
	MVI 	C,0Fh
	CALL	H0005
	CALL	H08F4
	RET 	
H08EA:	MVI 	A,01h
	STA 	H0E70
	RRC 	
	STA 	H0E71
	RET 	
H08F4:	LXI 	H,0000h
	DAD 	SP
	SHLD	V0F43
	LXI 	SP,V0F1E
H08FE:	CALL	H0BE0
	JNZ	H0914
	MVI 	B,08h
	CALL	H0BF7
	LHLD	H0E5A
	MOV 	M,A
	INX 	H
	SHLD	H0E5A
	JMP 	H08FE
H0914:	MVI 	B,02h
	CALL	H0BF7
	MOV 	E,A
	MVI 	D,00h
	LXI 	H,H0926
	DAD 	D
	DAD 	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	XCHG	
	PCHL	
H0926:	MOV 	H,M
	DAD 	B
	MVI 	L,09h
	MOV 	H,E
	DAD 	B
	MOV 	D,E
	DAD 	B
	CALL	H0C10
	MOV 	A,D
	CPI 	21h
	JNZ	H0941
	MOV 	A,E
	JNZ	H0941
	LXI 	D,0000h
	JMP 	H0946
H0941:	LHLD	H0E5C
	DAD 	D
	XCHG	
H0946:	LHLD	H0E5A
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	SHLD	H0E5A
	JMP 	H08FE
H0953:	CALL	H0C10
	LHLD	H0E5A
	MOV 	M,E
	INX 	H
	MOV 	M,D
	INX 	H
	SHLD	H0E5A
	JMP 	H08FE
	JMP 	H0953
	MVI 	B,04h
	CALL	H0BF7
	MOV 	E,A
	MVI 	D,00h
	LXI 	H,H0978
	DAD 	D
	DAD 	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	XCHG	
	PCHL	

H0978:	DW H0A0B
	DW H09C8
	DW H09FD
	DW H0998
	DW H0998
	DW H09D4
	DW H0A23
	DW H0A72
	DW H0998
	DW H0998
	DW H09E3
	DW H09E9
	DW H0AD5
	DW H09F3
	DW H0A06
	DW H0AF0

H0998:	CALL	H0BD7

	DB 'Request for undefined LINK item. Bombs away.$'

H09C8:	LXI 	H,H0E64
	CALL	H0B2F
	CALL	H0B72
	JMP 	H08FE
H09D4:	CALL	H0B17
	LXI 	H,H0E64
	CALL	H0B2F
	CALL	H0B72
	JMP 	H08FE
H09E3:	CALL	H0B17
	JMP 	H08FE
H09E9:	CALL	H0B09
	XCHG	
	SHLD	H0E5A
	JMP 	H08FE
H09F3:	CALL	H0B17
	XCHG	
	SHLD	V0F3D
	JMP 	H08FE
H09FD:	LXI 	H,H0E5E
	CALL	H0B2F
	JMP 	H08FE
H0A06:	LHLD	V0F43
	SPHL	
	RET 	
H0A0B:	LXI 	H,H0E52
	CALL	H0B2F
	CALL	H0B43
	JNZ	H0A1A
	CALL	H0B7E
H0A1A:	LXI 	H,H0E52
	CALL	H0B72
	JMP 	H08FE
H0A23:	CALL	H0B09
	XCHG	
	SHLD	V0F3F
H0A2A:	MOV 	E,M
	INX 	H
	MOV 	D,M
	DCX 	H
	MOV 	A,D
	ORA 	E
	JZ 	H0A49
	PUSH	H
	LHLD	H0E5C
	XCHG	
	CALL	H0C9A
	XCHG	
	LHLD	H0E58
	DAD 	D
	XCHG	
	POP 	H
	MOV 	M,E
	INX 	H
	MOV 	M,D
	XCHG	
	JMP 	H0A2A
H0A49:	LXI 	H,H0E64
	CALL	H0B2F
	CALL	H0B43
	INX 	D
	INX 	D
	CZ 	H0B7E
H0A57:	XCHG	
	MOV 	E,M
	INX 	H
	MOV 	D,M
	MOV 	A,D
	ORA 	E
	JNZ	H0A57
	DCX 	H
	XCHG	
	LHLD	V0F3F
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	LXI 	H,H0E64
	CALL	H0B72
	JMP 	H08FE
H0A72:	CALL	H0B17
	XCHG	
	SHLD	H0E64
	LXI 	H,H0E6A
	CALL	H0B2F
	CALL	H0B43
	LDAX	D
	MOV 	A,C
	INX 	D
	LDAX	D
	DCX 	D
	ORA 	C
	JZ 	H0AC5
	CALL	H0679

	DB 'Yecch. Multiply defined global symbol encountered. $'

	JMP 	H0ACC
H0AC5:	LHLD	H0E64
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
H0ACC:	LXI 	H,H0E6A
	CALL	H0B72
	JMP 	H08FE
H0AD5:	CALL	H0B17
H0AD8:	XCHG	
	MOV 	E,M
	INX 	H
	MOV 	D,M
	DCX 	H
	PUSH	D
	XCHG	
	LHLD	H0E5A
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	DCX 	H
	POP 	D
	MOV 	A,D
	ORA 	E
	JNZ	H0AD8
	JMP 	H08FE
H0AF0:	CALL	H0BD7

	DB 'Ecch. Eof before eop.$'

H0B09:	MVI 	B,02h
	CALL	H0BF7
	CALL	H0C10
	LHLD	H0E58
	DAD 	D
	XCHG	
	RET 	
H0B17:	MVI 	B,02h
	CALL	H0BF7
	STA 	V0F3F
	CALL	H0C10
	LDA 	V0F3F
	ORA 	A
	JZ 	H0B2E
	LHLD	H0E5C
	DAD 	D
	XCHG	
H0B2E:	RET 	
H0B2F:	MVI 	B,03h
	CALL	H0BF7
	MOV 	C,A
	PUSH	H
	MVI 	B,08h
H0B38:	CALL	H0BF7
	MOV 	M,A
	INX 	H
	DCR 	C
	JNZ	H0B38
	POP 	H
	RET 	
H0B43:	PUSH	H
	XCHG	
	LHLD	V0F4C
	XCHG	
H0B49:	MVI 	B,06h
	PUSH	D
	LDAX	D
	ORA 	A
	JZ 	H0B6F
H0B51:	CMP 	M
	JNZ	H0B5F
	INX 	D
	INX 	H
	DCR 	B
	JZ 	H0B6A
	LDAX	D
	JMP 	H0B51
H0B5F:	POP 	D
	LXI 	H,000Ah
	DAD 	D
	XCHG	
	POP 	H
	PUSH	H
	JMP 	H0B49
H0B6A:	ADI 	01h
	POP 	H
	POP 	H
	RET 	
H0B6F:	POP 	H
	POP 	H
	RET 	
H0B72:	PUSH	H
	MVI 	B,06h
H0B75:	MVI 	M,00h
	INX 	H
	DCR 	B
	JNZ	H0B75
	POP 	H
	RET

;Check if the symbol table is full. There is room for 120 symbols.
;A confirmed bug can allow the table to overflow and the system just reboots.
 	
H0B7E:	PUSH	H		
	XCHG	
	LHLD	V0F4A		; = 0000 if table is full
	MOV 	A,H
	ORA 	B		;** BUG ** should be ORA L
	JZ 	H0BA6		;symbol table full

	MVI 	B,06h
H0B8A:	LDAX	D
	MOV 	M,A
	INX 	H
	INX 	D
	DCR 	B
	JNZ	H0B8A
	INX 	H
	INX 	H
	PUSH	H
	POP 	D
	INX 	H
	INX 	H
	MOV 	A,M
	CPI 	0AAh		;end of buffer reached?
	JNZ	H0BA1
	LXI 	H,0000h		;flag for symbol table full
H0BA1:	SHLD	V0F4A
	POP 	H
	RET 	
H0BA6:	CALL	H0BD7

	DB 'Symbol table full. Reassemble with more room.$'

;fatal error has occurred, print error message and exit to imdos

H0BD7:	POP 	D
	MVI 	C,09h
	CALL	H0005
	JMP 	H0000

H0BE0:	PUSH	D
	LDA 	H0E70
	RRC 	
	STA 	H0E70
	MOV 	E,A
	CC 	H0C2F
	LDA 	V0F45
	ANA 	E
	JZ 	H0BF5
	MVI 	A,01h
H0BF5:	POP 	D
	RET 	
H0BF7:	PUSH	B
	PUSH	D
	MVI 	E,00h
H0BFB:	CALL	H0BE0
	MOV 	C,B
H0BFF:	DCR 	C
	JZ 	H0C07
	RLC 	
	JMP 	H0BFF
H0C07:	ADD 	E
	MOV 	E,A
	DCR 	B
	JNZ	H0BFB
	POP 	D
	POP 	B
	RET 	
H0C10:	PUSH	B
	MVI 	B,08h
	CALL	H0BF7
	MOV 	E,A
	CALL	H0BF7
	MOV 	D,A
	POP 	B
	RET 	
	PUSH	H
	PUSH	B
	PUSH	D
	MVI 	B,08h
H0C22:	CALL	H0BF7
	MOV 	M,A
	INX 	H
	DCR 	D
	JNZ	H0C22
	POP 	D
	POP 	B
	POP 	H
	RET 	
H0C2F:	PUSH	H
	PUSH	D
	LDA 	H0E71
	CPI 	80h
	CZ 	H0C4B
	MOV 	E,A
	MVI 	D,00h
	INR 	A
	STA 	H0E71
	LHLD	V0EC8
	DAD 	D
	MOV 	A,M
	STA 	V0F45
	POP 	D
	POP 	H
	RET 	
H0C4B:	PUSH	D
	PUSH	B
	LXI 	D,005Ch
	MVI 	C,14h
	CALL	H0005
	POP 	B
	POP 	D
	ORA 	A
	RZ 	
	CALL	H0BD7

	DB 'Read error or end of file encountered. Yuch. GENESYS aborted.$'

; HL = HL-DE

H0C9A:	MOV 	A,L
	SUB 	E
	MOV 	L,A
	MOV 	A,H
	SBB 	D
	MOV 	H,A
	RET
 	
H0CA1:	LXI 	H,0000h
	INR 	B
H0CA5:	DCR 	B
	RZ 	
	DAD 	H
	DAD 	H
	DAD 	H
	DAD 	H
	LDAX	D
	INX 	D
	CALL	H0CB7
	CMC 	
	RC 	
	ADD 	L
	MOV 	L,A
	JMP 	H0CA5
H0CB7:	SUI 	30h
	CPI 	0Ah
	RC 	
	SUI 	07h
	CPI 	10h
	RET 	
H0CC1:	PUSH	D
	MOV 	A,H
	CALL	H0CDB
	STAX	D
	INX 	D
	MOV 	A,H
	CALL	H0CDF
	STAX	D
	INX 	D
	MOV 	A,L
	CALL	H0CDB
	STAX	D
	INX 	D
	MOV 	A,L
	CALL	H0CDF
	STAX	D
	POP 	D
	RET 	
H0CDB:	RRC 	
	RRC 	
	RRC 	
	RRC 	
H0CDF:	ANI 	0Fh
	ADI 	30h
	CPI 	3Ah
	RC 	
	ADI 	07h
	RET 	
H0CE9:	LXI 	D,H0DE0
	STAX	D
	MVI 	C,0Ah
	CALL	H0005
	INX 	D
H0CF3:	LDAX	D
	MOV 	B,A
	LXI 	H,0000h
	INR 	B
H0CF9:	DCR 	B
	RZ 	
	INX 	D
	PUSH	B
	DAD 	H
	MOV 	B,H
	MOV 	C,L
	DAD 	H
	DAD 	H
	DAD 	B
	POP 	B
	LDAX	D
	SUI 	30h
	CPI 	0Ah
	CMC 	
	RC 	
	ADD 	L
	MOV 	L,A
	MVI 	A,00h
	ADC 	H
	MOV 	H,A
	JMP 	H0CF9
H0D14:	LHLD	V0F4C
	SHLD	V0F46
H0D1A:	LHLD	V0F46
	MOV 	A,M
	CPI 	0Ah
	JZ 	H0D59
	ORA 	A
	JZ 	H0D59
	LXI 	D,0006h
	DAD 	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	INX 	H
	MOV 	A,E
	ORA 	D
	JZ 	H0D75
	XCHG	
	SHLD	V0F48
	XCHG	
H0D39:	MOV 	C,M
	INX 	H
	MOV 	B,M
	DCX 	H
	XCHG	
	LHLD	V0F48
	XCHG	
	MOV 	M,E
	INX 	H
	MOV 	M,D
	PUSH	B
	POP 	H
	MOV 	A,L
	ORA 	H
	JNZ	H0D39
	LHLD	V0F46
	LXI 	D,000Ah
	DAD 	D
	SHLD	V0F46
	JMP 	H0D1A
H0D59:	CALL	H0679

	DB 0Ah,0Dh
	DB '[Linking complete.]'
	DB 0Ah,0Dh,00h

	RET
H0D75:	CALL	H0679

	DB 0Ah,0Dh
	DB 'Unresolved global '
	DB 00h

	LHLD	V0F46
	XCHG	
	MVI 	C,09h
	CALL	H0005
	CALL	H0679
	LDAX	B
	DCR 	C
	NOP 	
	XCHG	
	LXI 	D,000Ah
	DAD 	D
	SHLD	V0F46
	JMP 	H0D1A
H0DA7:	SHLD	V0F4C
	SHLD	V0F4A
	LXI 	D,04B0h		;1200 byte length
H0DB0:	MVI 	M,00h
	INX 	H
	DCX 	D
	MOV 	A,D
	ORA 	E
	JNZ	H0DB0
	MVI 	M,0AAh		;marks end of buffer
	RET 	

	DB 'SYSDDB'
	DB 'ENDMEM'
H0DC8:	DB 'LSTFRE'
	DB 'NUMBUF'
	DB 'USELST'
	DB 'ADDTB'
	DB 00h
H0DE0:	DB 06h,00h,00h,00h,00h,00h,00h,00h
	DB 00h
	DB 'BUFFS'
	DB 00h
	DB 'SYSBUF'
H0DF5:	DB 'SIGNON'
H0DFB:	DW V0EE3
H0DFD:	DW V0ED9
H0DFF:	DW H005C
H0E01:	DW H0E03
H0E03:	DB 'BOOT.SYS '
H0E0C:	DB 'CCP.SYS BDOS.SYS ENTRY.SYS '
H0E27:	DB 'SDENS.SYS BIOS.SYS '
H0E3A:	DB 03h
H0E3B:	DB 02h
H0E3C:	DB 00h,00h,00h,00h,00h,00h,00h
H0E43:	DB 05h,00h,00h,00h,00h,00h,00h,00h
	DB 00h
H0E4C:	DW 0050h
H0E4E:	DW H005C
H0E50:	DW H0E0C
H0E52:	DB 00h,00h,00h,00h,00h,00h
H0E58:	DW H13FF
H0E5A:	DW H13FF
H0E5C:	DW H13FF
H0E5E:	DB 00h,00h,00h,00h,00h,00h
H0E64:	DB 00h,00h,00h,00h,00h,00h
H0E6A:	DB 00h,00h,00h,00h,00h,00h
H0E70:	DB 01h
H0E71:	DB 80h
	DB 'BDOS'
	DB 00h,00h,64h,00h
H0E7A:	DW V0ECF
H0E7C:	DB 00h,00h
H0E7E:	DB 00h			;if FF then active relocation flagged
H0E7F:	DB 00h
H0E80:	DB 'ENSYS'
	DB 00h

;the following just contains echo code of uninitialized memory

	DB 0,0,0,0,0,0,0,0
	DB 0,0,0,0,0,0,0,0
	DB 0,0,0,0,0,0,0,0
	DB 0,0,0,0,0,0,0,0
	DB 0,0,0,0,0,0,0,0
	DB 0,0,0,0,0,0,0,0
H0EB6:	DB 0,0	
H0EB8:	DB 0
H0EB9:	DB 0,0

H0EBB:	DB 0,0			;DW 3AFFh (16k system)	
H0EBD:	DB 0,0			;LSTFRE = 3F7F
H0EBF:	DB 0,0			;ENDMEM = 3FFF
H0EC1:	DB 0,0			;SYSDDB = 3F80
H0EC3:	DB 0,0			;SYSBUF = 3F80
H0EC5:	DB 0,0			;BUFFS  = 3ED0 = ENSYS
H0EC7:	DB 0			;NUMBUF

;H0EC8 routine gets called once then reused as variable space.
;These labels are variable overlays in this area.

V0EC8	EQU	$		;dma address
V0ECA	EQU	V0EC8+2
V0ECC	EQU	V0ECA+2
V0ECD	EQU	V0ECC+1
V0ECF	EQU	V0ECD+2
V0ED1	EQU	V0ECF+2
V0ED3	EQU	V0ED1+2
V0ED5	EQU	V0ED3+2
V0ED7	EQU	V0ED5+2
V0ED9	EQU	V0ED7+2
V0EDB	EQU	V0ED9+2		;read only pointing to 0FFFCh (-4) below
V0EE3	EQU	V0EDB+8		;holds base of new CCP
V0EE5	EQU	V0EE3+2		;holds base of new BDOS
;0EE7				 holds base of new ENTRY
;0EE9				 holds base of new SDENS
;0EEB				 holds base of new BIOS


;stack space

V0F1E	EQU	V0EE5+57	;top of stack
V0F22	EQU	V0F1E+4
V0F24	EQU	V0F22+2
V0F2A	EQU	V0F24+6
V0F2B	EQU	V0F2A+1
V0F2F	EQU	V0F2B+4
V0F31	EQU	V0F2F+2
V0F33	EQU	V0F31+2
V0F35	EQU	V0F33+2
V0F37	EQU	V0F35+2
V0F39	EQU	V0F37+2
V0F3B	EQU	V0F39+2
V0F3D	EQU	V0F3B+2
V0F3F	EQU	V0F3D+2
V0F43	EQU	V0F3F+4
V0F45	EQU	V0F43+2
V0F46	EQU	V0F45+1
V0F48	EQU	V0F46+2
V0F4A	EQU	V0F48+2
V0F4C	EQU	V0F4A+2		;index into V0F4E table

;V0F4E is an alphabetical symbol table 1200 bytes in length to 13FEh
;10 bytes/symbol leaves room for 120 symbols
 
V0F4E	EQU	V0F4C+2		;also start of boot in image before moved down to 600h
V0FCF	EQU	V0F4E+129
V0FFE	EQU	V0FCF+47
V104E	EQU	V0F4E+256	;start of ccp in image before moved down to 600h (holds SYSBOT = new bdos)
V1050	EQU	V104E+2		;holds pointer to startup command in new CCP

H0EC8:	LHLD	H0005+1		;pointer to BDOSE
	PUSH	H
	LXI 	D,0FF7Ah
	DAD 	D
	SHLD	V0EC8		;dma address
	XCHG	
	MVI 	C,1Ah		;set dma
	CALL	H0005
	POP 	H		;BDOSE
	LXI 	D,0FFFCh	;minus 4
	DAD 	D		;now points to version# within serial#
	MOV 	A,M
	CPI 	02h		;version 2.nn ?
	JNZ	H0F2E		;taken for incompatable version
	INX 	H
	MOV 	A,M		;check subversion 2.nn
	SUI 	05h
	CPI 	01h		;must be v2.05
	JNC	H0F2E		;incompatable subversion
	LXI 	D,0009h
	DAD 	D
	LXI 	D,H0EBB
	MVI 	B,0Dh
H0EF6:	MOV 	A,M		;copy variable table from bdos
	STAX	D
	INX 	D
	INX 	H
	DCR 	B
	JNZ	H0EF6
	LDA 	H0EC7
	STA 	V0ECC
	LHLD	H0EC1
	XCHG	
	LHLD	H0EC3
	CALL	H0C9A
	SHLD	V0ECA
	LHLD	H0EC5
	XCHG	
	LHLD	H0EBD
	CALL	H0C9A
	INX 	H
	SHLD	V0ECD
	LHLD	H0EBB
	LXI 	D,001Dh
	DAD 	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	XCHG	
	SHLD	H0EB9
	RET 	
H0F2E:	CALL	H0BD7

	DB 'Incompatable version of IMDOS. GENESYS aborted.'
	DB 00h

H0F61:	CALL	H0679

	DB 0Ah,0Dh
	DB 'GENESYS VERS 2.05'
	DB 00h

	MVI 	C,19h		;getdisk
	CALL	H0005
	INR 	A
	STA 	H0FE3		;current drive#
	LXI 	D,H0FE1
	MVI 	C,20h		;place drive letter 'A'
	CALL	H0005
	LHLD	H0FE1
	MVI 	M,3Ah		;place ':' after drive letter
	INX 	H
	MVI 	M,24h		;finish string with 'A:$'
	CALL	H0679

	DB 0Ah,0Dh
	DB 'Put disk with system on drive $'

	LXI 	D,H0FE4
	MVI 	C,09h		;print 'A:'
	CALL	H0005
	CALL	H0679

	DB 0Ah,0Dh
	DB 'and hit any key.'
	DB 00h

	MVI 	B,50h
	MVI 	C,81h
	CALL	H0005
	CALL	H0679

	DB 0Ah,0Dh,00h
	RET

;	parameter table for bdos function 32
 	
H0FE1:	DW	H0FE4		;address of string
H0FE3:	DB	0Fh		;drive#

H0FE4:	DB	23h,7Eh,0D6h	;will receive 'A:$'
	DB	05h
H0FE8:	DW	H01FE
	DB	0D2h,2Eh

H0FEC:	LXI	H,H0080		
	MOV 	A,M
	ORA 	A
	RZ 	
	MOV 	C,A
H0FF3:	INX 	H
	MOV 	A,M
	CPI 	20h
	JZ 	H0FF3
	CPI 	09h
H0FFC:	JZ 	H0FF3
	CPI 	0Ah
	RZ 	
	CPI 	2Ah
	JZ 	H1043
	CPI 	5Eh
	JZ 	H102D
	CPI 	30h
	RC 	
	CPI 	3Ah
	RNC	
	XCHG	
	LXI 	H,H0E3C
	LXI 	B,H051E
	LDAX	D
	STAX	B
	MOV 	M,A
	INX 	H
	INX 	B
	INX 	D
	LDAX	D
	STAX	B
	MOV 	M,A
H1022:	MVI 	A,0FFh
	STA 	H0E7F
	CALL	H050C
	JMP 	H1033
H102D:	CALL	H04E5
	JMP 	H1022
H1033:	XCHG	

;check for command line parameter following genesys

H1034:	INX 	H
	MOV 	A,M
	CPI 	20h
	JZ 	H1034
	CPI 	09h
	JZ 	H1034
	CPI 	2Ah		;'*' = active relocation
	RNZ

;set for active relocation
	
H1043:	MVI 	A,0FFh
	STA 	H0E7E
	RET
 	
	DB 0,0,0,0
H104D:	DB 0

; 13FEh = end of symbol table

H13FF	EQU	13FFh		;buffer for decoded .SYS files

	END
