;	disassembly of BDOS.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 

;	last edit: 11/30/14

;	ORG	2DD3h	for reference only. this is a relocatable module

;	see notes about checksum routine at H3A6A.
;	H0069 is a hidden location that was not made public

	EXTRN	H0069,BDOSEN,WBOOT0,ENSYS,CONIF,CONOUT,CONRDY,CONCHA
	EXTRN	DISINT,WBOOTE,ABORT,BTSTCK,TASKSP,SYSBOT,CMD1,DDINIT
	EXTRN	IOBLOC,CRBLCK,DKWAIT,READIN,PUNOUT,LSTOUT,PDEV,LFSTCK
	EXTRN	STSIZE,GTIOB,STIOB,UQUEIO,DSASR,ENASR,NOTIMP
	EXTRN	BOODSK,CKDIO,IOBYTE,CUDISK,DDDISK,GETOFF,FRBUFF,PRESRV

	PUBLIC	BDOS,BDOSE,WBOOT,LSTFRE,ENDMEM,SYSDDB,SYSBUF,BUFFS
	PUBLIC	NUMBUF,USELST,ADDTB,MAXLUN,LOGDEV,MAXPUN,PHYDEV,TMOCHN
	PUBLIC	DRINIT,PRINT,TSTPC,NXM,SELTRK,SELSEC,SELDMA,SELDIS
	PUBLIC	SLDISK,RDBUFF,WRBUFF,DEX,DSKEX1,HOME,EXDSK,DIV8L
	PUBLIC	COPYHL,SELECT,PMESS,PMESSH,PDEVM1,SCB,SCBERR,ABLOCK
	PUBLIC	DBLK0,SUBDE,SUBBC,DISMOU,TABLE,MAXFUN,VIOF,BTDISK
	PUBLIC	SUFLAG,LISTCO,WTFLAG,CMDSTR,CMD0,CMD,STAT,TRK
	PUBLIC	BCMD,SELDSK,BLKMSK,TEMP,CALLNO,OPTION,INFO,SVINFO,WINIT

;	bdos module

	CSEG

;	serial number

BDOS:	DB 02h
	DB 00h		;revision# 0
	DB 02h,05h	;version# 2.05 checked by genesys
	DB 0CDh,00h	;serial# used for checksum and synchronization
			;(see WINIT and routine in genesys.mac)

BDOSE:	JMP 	BDOSEN	;bdos entry from 0005
WBOOT:	JMP 	WBOOT0

	DW H3AFF
LSTFRE:	DW 0000		;set externally to 3F7F (for 16k) by genesys
ENDMEM:	DW 0000		;end of memory
SYSDDB:	DW 0000
SYSBUF:	DW 0000
BUFFS:	DW ENSYS
NUMBUF:	DB 00h
USELST:	DW 0000
ADDTB:	DW 0000
H2DF0:	DB 00h		;checksum fudge
	DB 00h
MAXLUN:	DB 00h
LOGDEV:	DW 0000
MAXPUN:	DB 00h
PHYDEV:	DW 0000
TMOCHN:	DW 0000
DRINIT:	JMP 0000

	DB 'COPYRIGHT (C) 1977 IMSAI MFG CORP'

H2E1E:	LXI 	H,H3B1E	;see if pre-existing console char
	MOV 	A,M
	MVI 	M,00h	;clear it out
	ORA 	A
	CZ 	CONIF	;read console
	CPI 	16h	;ctrl-v
	RNZ	
H2E2B:	CALL	CONIF
	MOV 	C,A
	PUSH	PSW
	CALL	CONOUT	;echo char
	POP 	PSW
	CPI 	1Bh	;esc
	JZ 	H2E2B
	XRA 	A
	RET 	
H2E3B:	CALL	H2E1E	;get non-null char
	ORA 	A
	JZ 	H2E3B
	RET 	
H2E43:	LDA 	H3B1E
H2E46:	STA 	H3B1E
	ANI 	7Fh
	MVI 	A,0FFh
	RNZ	
	CALL	CONRDY
	CNZ	H2E1E
	ORA 	A
	RZ 	
	CPI 	13h	;ctrl-s
	JNZ	H2E46
	CALL	H2F70
	XRA 	A
	RET 	
H2E60:	MVI 	C,0Dh
	CALL	H2E68
	MVI 	A,0Ah
H2E67:	MOV 	C,A
H2E68:	PUSH	B		;write console
	PUSH	D
	PUSH	H
	PUSH	B
	CALL	H2E43
	POP 	B
	CALL	CONCHA
	POP 	H
	POP 	D
	POP 	B
	XRA 	A
	RET

;print string. if error control option is clear, string can terminate with $ 
;else string terminates with null
 	
PRINT:	LDA 	OPTION
	ANI 	10h
	MOV 	A,M
	INX 	H
	JNZ	H2E85	;if error control option is clear
	CPI 	24h	;ends with $
	RZ 	
H2E85:	ORA 	A	;ends with null
	RZ 	
	CALL	H2E67	;write to console
	JMP 	PRINT
H2E8D:	XTHL		;print inline string	
	CALL	PRINT
	XTHL	
	RET 	
H2E93:	LXI 	D,0000h
H2E96:	LHLD	INFO
	MOV 	A,M
	CMP 	E
	RZ 	
	INX 	H
	MOV 	M,E
	PUSH	H
	PUSH	D
	INR 	E
	DAD 	D
	MVI 	M,00h
	CALL	H2E3B
	MOV 	L,A
	LDA 	OPTION
	ANI 	08h
	MOV 	A,L
	CZ 	H2F73
	POP 	D
	POP 	H
	CPI 	0Dh
	JZ 	H2E67
	LXI 	B,H2E96
	PUSH	B
	CPI 	05h
	JZ 	H2E60
	CPI 	10h
	JNZ	H2ECD
	LXI 	H,LISTCO
	MOV 	A,M
	CMA 	
	MOV 	M,A
	RET 	
H2ECD:	CPI 	18h
	JZ 	H2ED7
	CPI 	15h
	JNZ	H2EDF
H2ED7:	MVI 	E,00h
	CALL	H2E67
	JMP 	H2E60
H2EDF:	CPI 	08h
	JNZ	H2EFB
	MOV 	A,E
	ORA 	A
	RZ 	
	DAD 	D
	MOV 	A,M
	DCR 	E
	CPI 	0Ah
	RZ 	
	CALL	TSTPC
	CC 	H2EF3
H2EF3:	CALL	H2E8D
	DB  08h,20h,08h,00h	;rubout (bs spc bs) 	
	RET 	
H2EFB:	CPI 	7Fh
	JNZ	H2F09
	MOV 	A,E
	ORA 	A
	RZ 	
	DAD 	D
	MOV 	C,M
	DCR 	E
	JMP 	H2E68
H2F09:	CPI 	12h		;ctrl-r
	JNZ	H2F1B
	CALL	H2E60
H2F11:	INX 	H
	MOV 	A,M
	ORA 	A
	RZ 	
	CALL	H2E67
	JMP 	H2F11
H2F1B:	INR 	E
	DAD 	D
	CALL	H2E67
	MOV 	A,C
	ANI 	7Fh
	MOV 	M,A
	LDA 	OPTION		;error control option
	ANI 	10h		;10h = cleared
	RZ			;return if set 	
	MOV 	A,C
	POP 	H		;caller address
	CPI 	7Dh		;'}'
	RZ 	
	CPI 	0Ah
	RZ 	
	SUI 	1Bh
	RZ 	
	PCHL			;return to caller	
TSTPC:	CPI 	1Bh		;esc
	JNZ	H2F3D
	MVI 	A,24h		;'$'
H2F3D:	CPI 	0Dh
	RZ 	
	CPI 	0Ah
	RZ 	
	CPI 	20h
	RNC			;if >= ' '	
	SUI 	0C0h		;map to char
	RET 	
H2F49:	LHLD	CMDSTR
	INX 	H
	INX 	H
	CALL	H2F55
	INX 	H
	CALL	H2F55
H2F55:	MOV 	B,M
	INX 	H
H2F57:	MVI 	C,20h
	CALL	H2E68
H2F5C:	MOV 	A,B		;print B in hex
	RRC 	
	RRC 	
	RRC 	
	RRC 	
	CALL	H2F65
	MOV 	A,B
H2F65:	ANI 	0Fh
	ADI 	90h
	DAA 	
	ACI 	40h
	DAA 	
	JMP 	H2E67
H2F70:	CALL	H2E3B
H2F73:	CPI 	03h
	RNZ	
	CALL	H2E67
H2F79:	LDA 	BTDISK
	MOV 	C,A
	CALL	H3157
	LXI 	H,0000h
	PUSH	H
	SHLD	BCMD
	XCHG	
	LHLD	IOBYTE
	MOV 	C,H
	MOV 	B,L
	CALL	DISINT
	LXI 	H,CMD
	MOV 	A,M
	ANI 	0Fh
	ORI 	20h
	MOV 	M,A
	INX 	H
H2F9A:	XRA 	A
	MOV 	M,A
	CALL	EXDSK
H2F9F:	MOV 	A,M
	ORA 	A
	JZ 	H2F9F
	JM 	H2F9A
	LXI 	H,H3AFE
	SHLD	PRESRV
	POP 	H
	JMP 	WBOOTE

;	RST 7 handler

NXM:	POP 	B
	LXI 	SP,0100h
	PUSH	B
	CALL	H2E8D		;print 'INTERRUPT'
	DB 'INTERRUPT'
	DB 00h
	POP 	H
	MOV 	B,H
	CALL	H2F57
	MOV 	B,L
	CALL	H2F5C
	DCX 	H
	CALL	H2F55
	JMP 	ABORT
H2FD3:	LXI 	H,BTSTCK
	SHLD	TASKSP
	LDA 	BTDISK
	MOV 	C,A
	CALL	H3827
	LXI 	D,0016h
	DAD 	D
	MOV 	A,M
	ORA 	A
	JNZ	H2FED
	LXI 	D,0FFF6h
	DAD 	D
H2FED:	SHLD	H2FFF+1
	MOV 	A,M
H2FF1:	SUB 	M
H2FF2:	PUSH	PSW
	INR 	A
	STA 	H3B52
	SUI 	03h
	CP 	H3013
	POP 	PSW
	ADI 	05h
H2FFF:	LXI 	H,H3B62		;self modified
	CMP 	M
	JM 	H2FF2
	JNZ	H2FF1
	LHLD	H3B74
	CALL	H3A6A
	JNZ	H2F79
	RET 	
H3013:	LXI 	H,0080h
	SHLD	BCMD
	XCHG	
	LXI 	H,SYSBOT
	JZ 	H3025
H3020:	DAD 	D
	DCR 	A
	JNZ	H3020
H3025:	XCHG	
	LXI 	H,BDOSE
	CALL	SUBDE
	RC 	
	RZ 	
	MOV 	B,L
	DAD 	H
	DCR 	H
	JM 	H3036
	MVI 	B,80h
H3036:	CALL	RDBUFF
	LXI 	H,0080h
	JMP 	COPYHL
H303F:	LHLD	H3B76
	XCHG	
	MOV 	A,D
	ORA 	E
	JZ 	H304F
	LDA 	H3B7A
	CMA 	
	MOV 	E,A
	MVI 	D,0FFh
H304F:	LHLD	H3B88
	DAD 	D
	XCHG	
	LHLD	H3B66
	DAD 	D
	XCHG	
	LHLD	H3B6C
	MVI 	H,00h
	MOV 	A,L
	ORA 	A
	CNZ	GETOFF
	LHLD	H3B62
	MOV 	A,H
	ORA 	L
	RZ 	
	MVI 	C,00h
H306B:	PUSH	H
	INR 	C
	MOV 	A,D
	CMP 	H
	JC 	H307E
	JNZ	H307A
	MOV 	A,E
	CMP 	L
	JC 	H307E
H307A:	DAD 	H
	JNC	H306B
H307E:	MOV 	A,C
	LXI 	H,0000h
H3082:	DAD 	H
	XCHG	
	POP 	B
	PUSH	PSW
	INX 	D
	CALL	SUBBC
	JNC	H308F
	DCX 	D
	DAD 	B
H308F:	POP 	PSW
	DCR 	A
	XCHG	
	JNZ	H3082
	RET 	
H3096:	LHLD	H3B64
	MOV 	A,E
	MVI 	B,0FFh
H309C:	INR 	B
	SUB 	H
	JNC	H309C
	ADD 	H
	MOV 	H,A
	MOV 	A,B
H30A4:	ADD 	H
	CMP 	C
	JC 	H30AA
	SUB 	C
H30AA:	DCR 	L
	JNZ	H30A4
	MOV 	E,A
	RET 	
H30B0:	LHLD	H3B95
	SHLD	BCMD
H30B6:	CALL	H303F
	PUSH	H
	LDA 	BLKMSK
	ORA 	A
	JNZ	H30CE
	LDA 	H3B66
	DCR 	A
	JZ 	H30CE
H30C8:	DCR 	L
	SUB 	C
	JNC	H30C8
	ANA 	L
H30CE:	CP 	H3096
	MOV 	C,E
	INR 	C
	CALL	SELSEC
	POP 	B
SELTRK:	LDA 	H3B6B	; = old track
	STA 	TRK
	MOV 	A,C	; C = new track
	STA 	H3B51
	ORA 	A
	RNZ		; if new track <> 0	
	STA 	TRK	; TRK = new track
	RET 	
SELSEC:	MOV 	A,C	; C = sector  
	STA 	H3B52
	RET 	
SELDMA:	PUSH	B	;BC = DMA
	XTHL	
	SHLD	H3B95
	POP 	H
	RET 	
SELDIS:	PUSH	B
	INR 	C	;probably drive id
	CALL	H37FB	;get value from H3B02 table (also bdos call# 30)
	POP 	B
	RM		;if value from table is FEh (probably undefined drive) 	
	PUSH	H
	PUSH	B
	LXI 	H,H31FB	;HL = ptr OUT to FIF controller
	MVI 	B,0Fh	;appears not to be used

;at this point A = H3B02(C) = 21,21,22,23 NOT FD or FE

	SUI 	25h	;now A=-4, -4, -3, -2
	JC 	H313E	;if < 25

;if we left, then controller is a FIF
;if we continue then it's a DIO
;DIO ports are 0xXF and 0xXE;
;at this point, A must have values of drives on DIO's 

	MOV 	B,A
	LDA 	H3B01
	MOV 	C,A
	ADD 	A
	ADD 	A
	ADD 	A
	INR 	B
	CMP 	B	;set CCR
	RAR 	
	JM 	H3152	;if A was xxx1xxxx return FA with CCR reflecting B
	DCR 	B

;now turn off all DIO's starting with 0xEE
;C appears to be count of DIO's

	MVI 	A,0EEh
H3117:	STA 	H311A+1
H311A:	OUT 	0EEh		;self modified
	SUI 	10h
	DCR 	C
	JNZ	H3117
	MOV 	A,B
	ANI 	78h
	ADD 	A
	CMA 	
	ADI 	0F0h
	STA 	H312C+1

;turn on the appropriate DIO

H312C:	OUT 	0EFh		;self modified

;adjust entry address into DIO firmware
;apparently, each entry is for a different drive

	MOV 	A,B
	ANI 	07h
	MVI 	B,01h
	LXI 	H,0E003h
H3136:	INX 	H
	INX 	H
	INX 	H
	SUI 	04h
	JNC	H3136
H313E:	SHLD	EXDSK+1		;store pointer to either FIF or DIO
	LXI 	H,H3197+1
	MOV 	B,M
	MOV 	H,A
	MVI 	A,10h

;build CMDSTR for FIF, maybe for DIO too
;DIO can also execute a cmdstr

H3148:	RRC 	
	INR 	H
	JNZ	H3148
	ADI 	60h
	STA 	CMD
H3152:	POP 	B
	POP 	H
	MVI 	A,0FAh
	RET 	
H3157:	LXI 	H,0100h
	SHLD	TRK
	SHLD	H3B51
SLDISK:	DCR 	C
	CALL	SELDIS
	RM 	
	INR 	C
	RET 	
H3167:	MVI 	A,0FFh		;flag is set for write but only used by DDENS driver
	STA 	WTFLAG		;so never gets cleared in SDENS mode.
WRBUFF:	MVI 	A,10h
	DB	21h		;skip next instruction
RDBUFF:	MVI	A,20h

;entry from bios for read or write sector

DEX:	PUSH	B
	MOV 	B,A
	SUI 	10h
	CPI 	20h
	JNC	DSKEX1
	LDA 	TRK
	ANI 	0C0h
	JNZ	DDDISK

;double density disk i/o exits above to DDDISK and re-enters below to DSKEX1

DSKEX1:	PUSH	D
	PUSH	H
	LHLD	IOBLOC
	SHLD	CRBLCK
	LHLD	CMDSTR
	MOV 	D,M
	INX 	H
	MOV 	A,M
	ANI 	0Fh
	ORA 	B
	MOV 	M,A
	INX 	H
	MVI 	A,01h
H3197:	MVI 	C,0Fh
H3199:	MOV 	B,A
	MVI 	M,00h
	MOV 	A,D
	CALL	EXDSK
	DI  	
	MOV 	A,M
	ORA 	A
	CZ 	DKWAIT
	EI  	
	MOV 	A,M
	DCR 	A
	JZ 	H31CF
	PUSH	H
	INR 	A
	CPI 	0A1h
	JZ 	H31D9
	CMA 	
	OUT 	0FFh
	CALL	HOME
	MOV 	A,M
	DCR 	C
	JP 	H31E6
	LDA 	OPTION
	RRC 	
	MVI 	A,0F9h
	MOV 	C,A
	CNC	PMESS
	CPI 	52h
	POP 	H
	JZ 	H3197
	ORA 	A
H31CF:	LXI 	H,0000h
	SHLD	CRBLCK
	POP 	H
	POP 	D
	POP 	B
	RET 	
H31D9:	LXI 	H,H31EA
	DCR 	B
	CZ 	PMESSH
	CALL	H2E43
	CNZ	H2F70
H31E6:	POP 	H
	JMP 	H3199

H31EA:	DB ': NOT READY'
	DB 00h
HOME:	MVI 	A,2Fh

;EXDSK+1 has either a pointer to OUT instruction
;or to DIO rom entry for disk

EXDSK:	JMP 	H31FB		;self modified
H31FB:	OUT 	0FDh
	RET 	
H31FE:	LHLD	H3B86
	XCHG	
	LHLD	H3B7B
H3205:	ORA 	A
	MOV 	A,D
	RAR 	
	MOV 	D,A
	MOV 	A,E
	RAR 	
	MOV 	E,A
	DCR 	L
	JNZ	H3205
	PUSH	D
	LHLD	INFO
	LXI 	D,0010h
	DAD 	D
	MOV 	E,C
	POP 	B
	DAD 	B
	LDA 	H3B7B
	CPI 	03h
	JZ 	H3244
	DAD 	B
	MOV 	D,M
	INX 	H
	MOV 	A,M
	ORA 	D
	JNZ	H325A
	DCR 	E
	MVI 	A,01h
	RM 	
	XRA 	A
	DCX 	H
	ORA 	C
	JZ 	H323B
	DCX 	H
	DCX 	H
	MOV 	B,M
	INX 	H
	MOV 	C,M
	INX 	H
H323B:	CALL	H3400
	RM 	
	MOV 	M,D
	INX 	H
	JMP 	H3259
H3244:	MOV 	A,M
	ORA 	A
	JNZ	H325A
	DCR 	E
	MVI 	A,01h
	RM 	
	XRA 	A
	ORA 	C
	JZ 	H3255
	DCX 	H
	MOV 	C,M
	INX 	H
H3255:	CALL	H3400
	RM 	
H3259:	MOV 	M,E
H325A:	MOV 	E,M
	LHLD	H3B86
	MOV 	A,L
	LHLD	H3B7A
	ANA 	L
	XCHG	
H3264:	DAD 	H
	DCR 	D
	JNZ	H3264
	ORA 	L
	MOV 	L,A
	SHLD	H3B88
	XRA 	A
	RET 	
H3270:	LHLD	INFO
	LXI 	D,0020h
	DAD 	D
	MOV 	E,M
	XCHG	
	SHLD	H3B86
	MOV 	A,L
	LXI 	H,0FFEFh
	DAD 	D
	MOV 	L,M
	MVI 	H,00h
	SHLD	H3B84
	RET 	
H3288:	LDA 	OPTION
	ORA 	A
	LDA 	H3B86
	JM 	H3293
	INR 	A
H3293:	LHLD	INFO
	LXI 	D,0020h
	DAD 	D
	MOV 	M,A
	LXI 	D,0FFEFh
	DAD 	D
	LDA 	H3B84
	MOV 	M,A
	XRA 	A
	RET 	
H32A5:	LXI 	H,H3B82
	INR 	M
	LDA 	H3B78
	SUB 	M
	JNZ	H32B3
	DCR 	A
	MOV 	M,A
	RET 	
H32B3:	MOV 	A,M
	RRC 	
	RRC 	
	PUSH	PSW
	ANI 	3Fh
	MOV 	E,A
	POP 	PSW
	ANI 	0C0h
	RRC 	
	MVI 	D,00h
	LHLD	H3B76
	DAD 	D
	SHLD	H3B88
	MOV 	E,A
	LHLD	BCMD
	DAD 	D
	SHLD	H3B80
	ORA 	A
	RNZ	
	CALL	H30B6
	JMP 	RDBUFF
H32D7:	PUSH	B
	PUSH	D
	PUSH	H
	MOV 	A,E
	ANI 	07h
	MOV 	B,A
	PUSH	B
	LHLD	H3B7E
	XCHG	
	CALL	H3448
	DAD 	D
	POP 	D
	MVI 	A,01h
H32EA:	RRC 	
	DCR 	D
	JP 	H32EA
	MOV 	D,A
	ANA 	E
	MOV 	E,A
	MOV 	A,D
	CMA 	
	ANA 	M
	ORA 	E
	MOV 	M,A
	POP 	H
	POP 	D
	POP 	B
	RET 	
H32FB:	PUSH	B
	PUSH	D
	PUSH	H
	LHLD	H3B80
	LXI 	D,0010h
	DAD 	D
	MVI 	B,10h
H3307:	LDA 	H3B7B
	CPI 	03h
	JZ 	H3312
	MOV 	D,M
	INX 	H
	DCR 	B
H3312:	MOV 	E,M
	INX 	H
	MOV 	A,E
	ORA 	D
	CNZ	H32D7
	DCR 	B
	JNZ	H3307
	POP 	H
	POP 	D
	POP 	B
	RET 	
H3321:	CALL	H3943
	RZ 	
	RM 	
	CALL	H3827		;check VCB
	RM			;if invalid	
	PUSH	H
	MOV 	B,C
	LXI 	D,0008h
	DAD 	D
	MVI 	A,06h
	SUB 	M
	MVI 	A,0F6h
	MVI 	E,1Eh
	DAD 	D
	POP 	D
	RM 	
	PUSH	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	XCHG	
	CALL	H3448
	INX 	H
	XCHG	
	LXI 	H,0028h
	DAD 	D
	XCHG	
	XTHL	
	MOV 	C,B
	CALL	ABLOCK
	PUSH	D
	CP 	H3499
	POP 	H
	CP 	H3561
	POP 	B
	RM 	
	MVI 	A,80h
	CALL	H3A7D
	LHLD	H3B78
	LDA 	H3B7B
	MOV 	B,A
	MOV 	C,A
	INR 	C
	INR 	C
	CALL	DIV8L
	MOV 	C,B
	MOV 	B,L
	LHLD	H3B76
	CALL	DIV8L
	XCHG	
	DCR 	C
H3374:	CALL	H32D7
	INX 	D
	DCR 	B
	JNZ	H3374
	MVI 	D,0FFh
	LXI 	H,H3B82
	MOV 	M,D
H3382:	PUSH	D
	LHLD	SYSBUF
	SHLD	BCMD
	CALL	H32A5
	POP 	D
	INR 	A
	JZ 	H33AB
	DCR 	A
	RM 	
	LHLD	H3B80
	MOV 	A,M
	ORA 	A
	JM 	H3382
	INX 	H
	MOV 	A,M
	SUI 	24h
	JNZ	H33A3
	MOV 	D,A
H33A3:	MVI 	C,0FFh
	CALL	H32FB
	JMP 	H3382
H33AB:	INR 	A
	MOV 	A,D
	CMA 	
	RET 	
H33AF:	MVI 	C,0Dh
H33B1:	LXI 	H,00FFh
	SHLD	H3B82
	LHLD	SYSBUF
	SHLD	BCMD
H33BD:	PUSH	B
	CALL	H32A5
	POP 	B
	RM 	
	MOV 	B,C
	MOV 	A,C
	LHLD	INFO
	XCHG	
	LHLD	H3B80
	ADD 	M
	SUI 	0E5h
	RZ 	
	XRA 	A
H33D1:	CPI 	3Fh
	JZ 	H33DA
	CMP 	M
	JNZ	H33BD
H33DA:	INX 	D
	INX 	H
	DCR 	B
	LDAX	D
	JNZ	H33D1
	RET 	
H33E2:	MVI 	C,0Ch
	CALL	H33B1
H33E7:	JM 	H3489
	MVI 	C,00h
	CALL	H32FB
	LHLD	H3B80
	MVI 	M,0E5h
	CALL	H3167		;write sector
	RM 	
	MVI 	C,0Ch
	CALL	H33BD
	JMP 	H33E7
H3400:	PUSH	B
	PUSH	H
	CALL	H340E
	LXI 	B,0000h
	CM 	H340E
	POP 	H
	POP 	B
	RET 	
H340E:	LHLD	H3B7E
	XCHG	
	MOV 	H,B
	MOV 	L,C
	CALL	H3448
	XCHG	
	DCX 	D
	DAD 	D
H341A:	INX 	D
	INX 	H
	MOV 	A,M
	INR 	A
	JZ 	H341A
	XCHG	
	DAD 	H
	DAD 	H
	DAD 	H
	XCHG	
H3426:	SUB 	M
	RRC 	
	INX 	D
	ADD 	M
	JC 	H3426
	MOV 	M,A
	PUSH	H
	LHLD	H3B76
	MOV 	A,H
	ORA 	L
	LHLD	H3B7C
	JZ 	H343B
	INX 	H
H343B:	CALL	SUBDE
	INR 	H
	DCR 	H
	POP 	H
	DCX 	D
	RP 	
	MVI 	M,0FEh
	MVI 	A,02h
	RET 	
H3448:	MVI 	C,03h
DIV8L:	ORA 	A
	MOV 	A,H
	RAR 	
	MOV 	H,A
	MOV 	A,L
	RAR 	
	MOV 	L,A
	DCR 	C
	JNZ	DIV8L
	RET 	
H3456:	CALL	CUDISK
H3459:	CALL	H33AF
	RM 	
H345D:	MVI 	C,00h
	MVI 	A,20h
H3461:	LHLD	H3B80
	XCHG	
	LHLD	INFO
	MVI 	B,00h
	DAD 	B
	MOV 	B,A
	XRA 	A
	CALL	H349C
	JMP 	H3167
H3473:	MVI 	C,0Ch
	CALL	H33B1
	RM 	
H3479:	MVI 	C,10h
	MVI 	A,0Ch
	CALL	H3461
	RM 	
	MVI 	C,0Ch
	CALL	H33BD
	JP 	H3479
H3489:	INR 	A
	RZ 	
	DCR 	A
	RET 	
H348D:	CALL	H33AF
	RM 	
	MVI 	B,13h
	CALL	COPYHL
	XRA 	A
	STAX	D
	RET 	
H3499:	MVI 	B,28h
COPYHL:	MOV 	A,M
H349C:	STAX	D
	INX 	D
	INX 	H
	DCR 	B
	JNZ	COPYHL
	XRA 	A
	RET 	
H34A5:	MVI 	C,00h
	CALL	H33B1
	RM 	
	MVI 	C,14h
	LXI 	H,000Dh
	DAD 	D
	CALL	H3A7C
	JMP 	H345D
H34B7:	MVI 	C,01h
H34B9:	CALL	H3270
	LHLD	INFO
	LXI 	D,0021h
	DAD 	D
	MOV 	B,M
	LXI 	D,0FFEBh
	DAD 	D
	LDA 	OPTION
	RLC 	
	MOV 	A,M
	JNC	H34D8
	CMP 	B
	LDA 	H3B86
	RZ 	
	JMP 	H34E0
H34D8:	MOV 	B,A
	LDA 	H3B86
	ORA 	A
	RP 	
	INR 	B
	XRA 	A
H34E0:	ORA 	A
	RM 	
	STA 	H3B8A
	LDA 	OPTION
	ANI 	40h
	PUSH	H
	PUSH	B
	CZ 	H3459
	POP 	B
	POP 	H
	RM 	
	MOV 	A,M
	MOV 	M,B
	MOV 	B,A
	PUSH	H
	PUSH	B
	CALL	H348D
	POP 	B
	POP 	H
	JP 	H350C
	DCR 	C
	JZ 	H3508
	MOV 	M,B
H3504:	DCR 	C
	MVI 	A,01h
	RET 	
H3508:	CALL	H34A5
	RM 	
H350C:	CALL	H3270
	LDA 	H3B8A
	STA 	H3B86
	RET 	
H3516:	MVI 	C,00h
	CALL	H34B9
	RM 	
	LXI 	H,H3B84
	SUB 	M
	JNC	H3504
	CALL	H31FE
	RM 	
	CALL	H30B0
	CALL	RDBUFF
	RM 	
	JMP 	H3288
H3531:	CALL	H34B7
	RM 	
	MVI 	C,01h
	CALL	H31FE
	RM 	
	CALL	H30B0
	CALL	WRBUFF
	RM 	
	LDA 	H3B86
	LXI 	H,H3B84
	CMP 	M
	JC 	H354E
	MOV 	M,A
	INR 	M
H354E:	CALL	H3288
	CALL	H34B7
	JMP 	H3293
SELECT:	DCR 	C
	CALL	SELDIS
	RM 	
	INR 	C
	CALL	H3321
	RNZ	
H3561:	XCHG	
	MOV 	A,C
	LXI 	H,SELDSK
	SUB 	M
	RZ 	
	MOV 	M,C
	INX 	H
	XCHG	
	CALL	H3499
	SHLD	H3B7E
	RET 	
H3572:	CALL	H2E3B
	CALL	H2E67
	MOV 	A,C
	RET 	
H357A:	CALL	READIN
	ORA 	A
	RET 	
H357F:	CALL	PUNOUT
	XRA 	A
	RET 	
H3584:	CALL	LSTOUT
H3587:	XRA 	A
	RET 	
H3589:	LXI 	H,BDOS
	JMP 	H35F0
H358F:	LXI 	B,0080h
	CALL	SELDMA
	CALL	DISMOU
	MVI 	C,00h
H359A:	INR 	C
	RZ 	
	LDA 	OPTION
	ANI 	80h
	SUI 	80h
	PUSH	B
	CNZ	SELECT
H35A7:	POP 	B
	RM 	
	PUSH	PSW
	CALL	H37FB
	JM 	H35A7
	STA 	H3B02
	MOV 	A,C
	STA 	H3B8B
	POP 	PSW
	RET 	
H35B9:	SHLD	SVINFO
	MVI 	A,0FFh
	LXI 	D,000Eh
	XCHG	
	DAD 	D
	MOV 	M,A
	XCHG	
H35C5:	LXI 	D,000Eh
	DAD 	D
	MOV 	A,M
	STA 	H3B82
	PUSH	H
	MVI 	C,0Dh
	LHLD	H3B95
	SHLD	BCMD
	CALL	H33BD
	POP 	H
	RM 	
	LDA 	H3B82
	MOV 	M,A
	RET 	
H35E0:	LDA 	H3B8B		;get current disk
	DCR 	A
	RET 	
H35E5:	LDA 	H3B8B
	MOV 	C,A
	CALL	SELECT
	RM 	
	LHLD	H3B7E
H35F0:	XRA 	A
	SHLD	TEMP
	STC 	
H35F5:	RET 	
H35F6:	MOV 	E,M
	INX 	H
	MOV 	D,M
	INX 	H
	XCHG	
	CALL	H3614
H35FE:	RM 	
	XCHG	
	MOV 	M,C
	DCX 	H
H3602:	MOV 	M,D
	DCX 	H
	MOV 	M,E
	RET

;bdos function# 32
 	
H3606:	MOV 	E,M
	INX 	H
	MOV 	D,M
	INX 	H
	MOV 	C,M
	XCHG	
	PUSH	B
	CALL	H3650
	POP 	B
	JMP 	H35FE
H3614:	MOV 	A,M
	INX 	H
	LXI 	B,0001h
	SUI 	41h
	JP 	H3628
	MVI 	C,20h
	ADI 	11h
	MOV 	B,A
	CPI 	0Ah
	JNC	H380C
H3628:	ANI 	0DFh
	CPI 	18h
	JNC	H380C
H362F:	ADD 	C
	MOV 	C,A
	MOV 	A,M
	INX 	H
	CPI 	3Ah
	JZ 	H380E
	DCR 	B
	JM 	H380C
	SUI 	30h
	CPI 	0Ah
	JNC	H380C
H3643:	ADI 	09h
	DCR 	B
	JP 	H3643
	JMP 	H362F
H364C:	LDA 	H3B8B
	MOV 	C,A
H3650:	CALL	H380E
	RM 	
	MVI 	C,40h
	JZ 	H366B
	MVI 	C,10h
	MVI 	M,30h
	CPI 	2Ah
	JC 	H366B
H3662:	INR 	M
	SUI 	0Ah
	CPI 	2Ah
	JNC	H3662
	INX 	H
H366B:	ORA 	A
	JZ 	H364C
	ADD 	C
	MOV 	M,A
	INX 	H
	RET

;bdos function# 35
 	
H3673:	MOV 	C,M
	CALL	SELECT
	RM 	
	LDA 	OPTION
	ORA 	A
	JM 	H3587
	LXI 	D,H3B56
	LHLD	INFO
	MVI 	B,07h
H3687:	INX 	H
	INX 	D
	LDAX	D
	CMP 	M
	MVI 	A,0F7h
	JNZ	H3825
	DCR 	B
	JNZ	H3687
	XRA 	A
	RET

;bdos function# 33
 	
H3696:	LDA 	OPTION
PMESS:	MOV 	B,A
	LHLD	SCBERR
	MOV 	A,C
	CPI 	80h
	JZ 	PMESSH
	LXI 	H,H3707
	CPI 	02h
	JZ 	PMESSH
	CPI 	0F4h
	JC 	H3587
H36B0:	MOV 	A,M
	INX 	H
	ORA 	A
	JNZ	H36B0
	INR 	C
	JNZ	H36B0
PMESSH:	PUSH	D
	PUSH	B
	PUSH	H
	CALL	H2E60
	MOV 	A,M
	CPI 	3Ah
	CZ 	H36E6
	CPI 	20h
	CZ 	PDEV
	POP 	H
	CALL	PRINT
	LXI 	B,H3781
	CALL	SUBBC
	CZ 	H2F49
	POP 	PSW
	ANI 	80h
	CNZ	H2F70
	PUSH	PSW
	CALL	H2E60
	POP 	PSW
	ORA 	A
	POP 	D
	RET 	
H36E6:	LXI 	H,H36FD
	LDA 	H3B8C
	MOV 	C,A
	CALL	H3650
	MVI 	M,00h
	LXI 	H,H36F8
	JMP 	PRINT
H36F8:	DB 'DISK '
H36FD:	DS 3
PDEVM1:	DS 1
	DB ':'
	DB 00h
SCB:	DB 00h,00h
SCBERR:	DW H3707
H3707:	DB ': FULL'
	DB 00h
	DB ': DIRECTORY FULL'
	DB 00h
	DB ': BAD DRIVE #'
	DB 00h
	DB ': NOT ASSIGNED'
	DB 00h
	DB ': BAD VCB, REFORMAT'
	DB 00h
	DB 'MOUNT SPACE FULL'
	DB 00h
	DB ': NOT PRESENT'
	DB 00h
	DB ': PERMANENT ERROR'
	DB 00h
H3781:	DB 'ILLEGAL SYSTEM CALL'
	DB 00h
	DB ': VOLUME NAME ERROR'
	DB 00h
	DB ': INCOMPATIBLE'
	DB 00h
	DB 'TOO BIG'
	DB 00h
	DB 'ILLEGAL PARAMETER'
	DB 00h

;bdos function# 28

H37D2:	MOV 	C,B
	CALL	H380E
	JNZ	H3823
	MOV 	C,L
	ORA 	A
	JZ 	H380C
	CALL	H380E
	RM 	
	JNZ	H37EB
	ORA 	A
	JNZ	H3823
	MVI 	C,0FDh
H37EB:	LDA 	H3B8B
	CMP 	B
	LXI 	H,H3B02
	CZ 	H37F9
	MOV 	E,B
	XRA 	A
	MOV 	D,A
	DAD 	D
H37F9:	MOV 	M,C
	RET

;bdos function# 30 = check device
 	
H37FB:	CALL	H380E	;validate index
	RNZ	
	PUSH	H
	PUSH	B
	LXI 	H,H3B02
	MVI 	B,00h
	DAD 	B
	MOV 	A,M
	ORA 	A
	POP 	B
	POP 	H
	RET		;return H3B02(index) 	
H380C:	MVI 	C,0FFh
H380E:	MOV 	A,C
	STA 	H3B8C
	CPI 	80h	;if neg return FE NZ
	JNC	H3823
	CPI 	21h	;if >= 21 return value NZ
	JP 	H3825
	CPI 	18h	;if > 18 return FE NZ
	JNC	H3823
	CMP 	A	;return Z for value 0-17
	RET 	
H3823:	MVI 	A,0FEh
H3825:	ORA 	A
	RET 	
H3827:	LHLD	SYSBUF	;= 3F80
	JMP 	H3830

;bdos function# 34 = read Volume Control Block and test validity

H382D:	LHLD	H3B95	;= dma address
H3830:	SHLD	BCMD
	CALL	H3157	;log in boot disk and prep to read volume control block
	CP 	RDBUFF	;read VCB into 3F80
	RM 	
	CALL	H389E	;validate
	MVI 	B,30h
	JM 	H384F	;taken
	SHLD	TEMP
	LXI 	H,0E7FFh
	MOV 	B,M
	RRC 	
	CPI 	03h
	JNC	H3860

;check volume control block which is in 3F80 buffer

H384F:	LHLD	BCMD
	INX 	H
	MOV 	A,M		;check VCB header
	INX 	H
	CMP 	M		;if not FFFF then use default OLDDISK VCB
	LXI 	H,H3B22		;because either system track erased or
	JNZ	H35F0		;VCB is corrupt
	INR 	A		;FF should roll to 0
	JNZ	H35F0
H3860:	LHLD	BCMD		;if here then VCB header is present
	LXI 	D,0073h
	DAD 	D
	MVI 	E,28h		;length of VCB = 40 bytes
	MOV 	A,E
H386A:	DCX 	H		;do checksum of VCB which should = 0
	ADD 	E
	RLC 	
	XRA 	M
	DCR 	E
	JNZ	H386A
	ORA 	A		;valid?
	CZ 	H387D
	JZ 	H35F0
	MVI 	A,0FCh		;invalid VCB
	ORA 	A
	RET 	
H387D:	MOV 	A,B
	SUI 	30h
	RZ 	
	PUSH	H
	LXI 	D,0008h
	DAD 	D
	MOV 	A,M
	RRC 	
	RRC 	
	RRC 	
	LHLD	TEMP
	MOV 	A,M
	RAR 	
	RLC 	
	MOV 	M,A
	POP 	H
	XRA 	A
	RET

;bdos function# 39
 	
H3894:	CALL	H389A
	RM 	
	MOV 	M,B
	RET

;bdos function# 38
 	
H389A:	CALL	SLDISK
	RM 	
H389E:	CALL	H37FB		;calls bdos func# 30
	SUI 	25h
	JM 	H3823
	ANI 	07h
	MVI 	H,0E8h
	MOV 	L,A
	MOV 	A,M
	RET 	
ABLOCK:	PUSH	H
	PUSH	B
	LHLD	BUFFS
	INX 	D
	INX 	D
	MOV 	A,E
	ANI 	0FCh
	MOV 	E,A
	INX 	D
	PUSH	D
	MOV 	A,C
	PUSH	PSW
	MOV 	A,E
	CMA 	
	MOV 	C,A
	MOV 	A,D
	CMA 	
	MOV 	B,A
	INX 	B
	PUSH	H
H38C4:	POP 	D
	PUSH	B
	MVI 	C,00h
	CALL	H394B
	POP 	B
	MVI 	A,0FBh
	JNZ	H38ED
	PUSH	H
	DAD 	D
	XCHG	
	DAD 	B
	XCHG	
	JNC	H38C4
	POP 	H
	POP 	PSW
	POP 	B
	PUSH	H
	DCX 	H
	DCX 	H
	DCX 	H
	MOV 	M,A
	INX 	H
	MOV 	M,C
	INX 	H
	MOV 	M,B
	INX 	H
	DAD 	B
	MOV 	A,D
	ORA 	E
	CNZ	H38F3
	PUSH	D
H38ED:	POP 	D
	POP 	D
	POP 	B
	POP 	H
	ORA 	A
	RET 	
H38F3:	DCX 	D
	DCX 	D
	DCX 	D
	XRA 	A
	MOV 	M,A
	INX 	H
	MOV 	M,E
	INX 	H
	MOV 	M,D
	RET

;bdos function# 29
 	
H38FD:	INR 	C
	JZ 	DISMOU
	DCR 	C
	LDA 	OPTION
	ORA 	A
	JP 	H391A
	CALL	H3943
	PUSH	B
	PUSH	H
	CZ 	H3827
	POP 	D
	POP 	B
	RNZ	
	MVI 	B,27h
	CALL	H3687
	RZ 	
H391A:	LDA 	OPTION
	ADD 	A
	JP 	H392A
	CALL	H389A
	LDA 	CMD
	CP 	EXDSK
H392A:	CALL	H37FB		;check device
	RM 	
H392E:	MOV 	C,A
	LXI 	H,SELDSK
	CMP 	M
	CZ 	H3940
	CALL	FRBUFF
	CALL	H3948
	RNZ	
DBLK0:	DCX 	H
	DCX 	H
	DCX 	H
H3940:	MVI 	M,00h
	RET 	
H3943:	CALL	H37FB
	RM 	
	MOV 	C,A
H3948:	LHLD	BUFFS		;contains ENSYS
H394B:	PUSH	H
H394C:	POP 	D
	MOV 	A,M
	INR 	A
	JZ 	H397A
	DCR 	A
	INX 	H
	MOV 	E,M
H3955:	INX 	H
	MOV 	D,M
	INX 	H
	PUSH	H
	DAD 	D
	JNZ	H3974
	CMP 	M
	JNZ	H3974
	INX 	H
	MOV 	A,M
	INX 	H
	MOV 	H,M
	MOV 	L,A
	DAD 	D
	XCHG	
	INX 	D
	INX 	D
	INX 	D
	POP 	H
	DCX 	H
	MOV 	M,D
	DCX 	H
	MOV 	M,E
	XRA 	A
	JMP 	H3955
H3974:	CMP 	C
	JNZ	H394C
	POP 	H
	RET 	
H397A:	INR 	A
	RET 	
SUBDE:	MOV 	B,D
	MOV 	C,E
SUBBC:	MOV 	A,L
	SUB 	C
	MOV 	L,A
	MOV 	A,H
	SBB 	B
	MOV 	H,A
	RC 	
	RNZ	
	ORA 	L
	RET

;bdos function# 36 is called with a parameter block address in DE as follows:
;DW FCB   file control block
;DW NAME  name in ascii 8.3 format space delimited
 	
FLLFCB:	MOV 	E,M		;now HL = the address of parameter block from the caller
	INX 	H
	MOV 	D,M		;1st parm to DE = 005C = FCB
	INX 	H
	PUSH	D		;save it
	MOV 	E,M
	INX 	H
	MOV 	D,M		;2nd parm to DE = address of filename in ascii 8.3 format
	XTHL			;save index to stack and now HL = FCB	
	CALL	H3998		;parse filename into FCB
	POP 	H		;restore pointer to 2nd parm
	JMP 	H3602		;save address of possible next filename to 2nd parm
H3998:	XCHG	
	PUSH	H
	CALL	H3614
	JP 	H39A2
	XRA 	A
	XTHL	
H39A2:	POP 	B
	XCHG	
	MOV 	M,A
	INX 	H
	LXI 	B,0008h
	CALL	H39C4
	CPI 	2Eh
	JNZ	H39B6
	INX 	D
	MOV 	A,B
	ORI 	80h
	MOV 	B,A
H39B6:	MVI 	C,03h
	CALL	H39C4
	MVI 	C,04h
	CALL	H3A7C
	MOV 	A,B
	ADD 	A
	RAR 	
	RET 	
H39C4:	CALL	H39E8
	MVI 	M,20h
	JZ 	H39DB
	MVI 	M,3Fh
	CPI 	2Ah
	JZ 	H39DA
	MOV 	M,A
	INX 	D
	CPI 	3Fh
	JNZ	H39DB
H39DA:	INR 	B
H39DB:	INX 	H
	DCR 	C
	JNZ	H39C4
H39E0:	CALL	H39E8
	RZ 	
	INX 	D
	JMP 	H39E0
H39E8:	LDAX	D
	CPI 	21h
	JC 	H39FA
	CPI 	2Eh
	RZ 	
	CPI 	5Fh
	RZ 	
	CPI 	3Ah
	RC 	
	CPI 	3Eh
	RNC	
H39FA:	CMP 	A
	RET 	
LDFLE:	XCHG	
	LXI 	H,H3B97
	SHLD	INFO
	XCHG	
	MVI 	B,10h
	CALL	COPYHL
	MOV 	E,M
	INX 	H
	MOV 	D,M
	INX 	H
	PUSH	D
	MOV 	E,M
	INX 	H
	MOV 	D,M
	PUSH	D
	CALL	H348D
	POP 	H
	POP 	D
	RM 	
	PUSH	D
	LDA 	OPTION
	ANI 	07h
	JNZ	H3A3F
	ORA 	L
	ORA 	H
	JZ 	H3A3F
	PUSH	H
	LHLD	TASKSP
	LXI 	D,LFSTCK
	XCHG	
	SHLD	TASKSP
	XCHG	
	LDA 	STSIZE
	ADI 	04h
	MOV 	B,A
	CALL	COPYHL
	POP 	H
	SHLD	LFSTCK
H3A3F:	LHLD	H3B95
	XTHL	
H3A43:	SHLD	H3B95
	LXI 	B,0080h
	DAD 	B
	PUSH	H
	LXI 	D,LFSTCK
	XCHG	
	CALL	SUBDE
	RAR 	
	ORA 	A
	MVI 	A,0F5h
	CP 	H3516
	POP 	H
	JP 	H3A43
	POP 	H
	SHLD	H3B95
	MOV 	C,A
	DCR 	C
	RM 	
	LDA 	SELDSK
	JMP 	H392E

; This does a checksum test of 256 bytes below and including H2DF0. If the result is nz, boot gets halted.

H3A6A:	XCHG	
	LXI 	H,H2DF0-256	;start of range
	MOV 	A,D
	MVI 	D,00h
H3A71:	INX 	H
	ADD 	E
	RLC 	
	XRA 	M
	DCR 	E
	DCR 	D
	JNZ	H3A71
	ORA 	A		;if nz then boot halts
	RET 	
H3A7C:	XRA 	A
H3A7D:	MOV 	M,A
	INX 	H
	DCR 	C
	JNZ	H3A7C
	RET 	
DISMOU:	MVI 	C,21h
H3A86:	MOV 	A,C
	CALL	H392E
	INR 	C
	JP 	H3A86
	XRA 	A
	RET 	
H3A90:	JMP 	GTIOB		;get iobyte
H3A93:	JMP 	STIOB		;store iobyte
H3A96:	JMP 	ABORT
H3A99:	JMP 	UQUEIO		;in ENTRY.SYS module
H3A9C:	JMP 	DSASR		;disable ASR-33 tape (not implemented)
H3A9F:	JMP 	ENASR		;enable ASR-33 tape  (not implemented)
H3AA2:	JMP 	NOTIMP		;not implemented

;bdos function table

TABLE:	DW H2FD3-BDOS+8000h	;0 = system reset
	DW H3572-BDOS		;1 = read console
	DW H2E68-BDOS		;2 = write console
	DW H357A-BDOS		;3 = read reader
	DW H357F-BDOS		;4 = write punch
	DW H3584-BDOS		;5 = write list
	DW H3589-BDOS		;6 = memory size
	DW H3A90-BDOS		;7 = get device status
	DW H3A93-BDOS		;8 = set device status
	DW PRINT-BDOS		;9 = print buffer
	DW H2E93-BDOS		;10 = read buffer
	DW H2E43-BDOS		;11 = console ready
	DW H35F5-BDOS		;12 = lift head ? (not implemented)
	DW H358F-BDOS+8000h	;13 = reset disk system
	DW H359A-BDOS+8000h	;14 = select disk
	DW H348D-BDOS+0C000h	;15 = open file
	DW H3456-BDOS+0C000h	;16 = close file
	DW H35B9-BDOS+0C000h	;17 = search for file
	DW H35C5-BDOS+0C000h	;18 = search for next
	Dw H33E2-BDOS+0C000h	;19 = delete file
	DW H3516-BDOS+0C000h	;20 = read file
	DW H3531-BDOS+0C000h	;21 = write file
	DW H34A5-BDOS+0C000h	;22 = create file
	DW H3473-BDOS+0C000h	;23 = rename file
	DW H3A96-BDOS		;24 = ABORT
	DW H35E0-BDOS		;25 = get disk
	DW SELDMA-BDOS		;26 = set dma
	DW H35E5-BDOS+8000h	;27 = get allocation vector
	DW H37D2-BDOS		;28
	DW H38FD-BDOS+8000h	;29 = some kind of disk login function

;bdos function 30 = check physical floppy device called with E = dev# 1 to n
;and HL pointing to either 'n:' or a VCB buffer?
;returns A=FDh and negative if 'DISK NOT ASSIGNED'
;or A=22h where low nibble is physical device and high nibble = density?
;(after call it does get tested for 24h)
;returns A=FA for 'NO SUCH DRIVE'

	DW H37FB-BDOS		;30
	DW H35F6-BDOS		;31 = parse drive letter (A:) to physical (1)

;bdos function 32 = add drive letter, ':$' to end of string
;called with DE pointing to a parameter table as follows:
;DW nnnn = string address
;DB n	 = drive # (A=1 or B=2 etc)

	DW H3606-BDOS		;32
	DW H3696-BDOS		;33
	DW H382D-BDOS+8000h	;34 = read Volume Control Block and test validity
	DW H3673-BDOS+8000h	;35

;bdos function# 36 is called with a parameter block address in DE as follows:
;DW FCB  = address of a file control block
;DW NAME = address of name in ascii 8.3 format space delimited

	DW FLLFCB-BDOS		;36 = parse 8.3 filename into FCB
	DW H3AA2-BDOS+8000h	;37 (not implemented, but vectored)
	DW H389A-BDOS		;38
	DW H3894-BDOS		;39
	DW H3A99-BDOS		;40 = UQUEIO in ENTRY.SYS module
	DW H3A9C-BDOS		;41 = ENASR (not implemented)
	DW H3A9F-BDOS		;42 = DSASR (not implemented)

;bdos function 43 = load and execute file.
;called with DE pointing to a paramater table as follows:
;DW NAME = address of filename parsed by bdos function 36
;Dw load address
;DW execution address
	
	DW LDFLE-BDOS+0C000h	;43 = load and execute file
MAXFUN:	DB 58h
H3AFE:	DB 24h
H3AFF:	DB 0C9h
VIOF:	DB 0FFh			;0 if VIO card present
H3B01:	DB 0FFh			;0 or FF determines port address used
H3B02:	DB 21h,21h,22h,23h,0FDh,0FDh,0FDh,0FDh
	DB 0FDh,0FDh,0FDh,0FDh,0FDh,0FDh,0FDh,0FDh
	DB 0FDh,0FDh,0FDh,0FDh,0FDh,0FDh,0FDh,0FDh
BTDISK:	DB 21h
SUFLAG:	DB 00h
H3B1C:	DB 0FFh			;DW memory size
H3B1D:	DB 3Fh			;# of pages of memory
H3B1E:	DB 00h
LISTCO:	DB 00h
H3B20:	DB 00h,00h

;assumed Volume Control Block if system track 0 is erased

H3B22:	DB 42h			;VCB checksum
	DB 'OLDDISK'
	DB 00h,01h,4Dh,00h	;VCB data
	DB 1Ah			;alternate sectors/track
	DB 00h
	DB 06h			;skew
	DB 0Dh
	DB 34h			;# of 80h blocks for system image
	DB 00h,00h,00h,00h,00h,00h,00h
	DB 00h,00h,00h,00h,00h,00h,00h,00h
	DB 00h			;directory offset
	DB 00h
	DB 40h			;# of directory entries
	DB 00h,07h,03h,0F3h,00h	;VCB data

; end of VCB

WTFLAG:	;=FF to flag a write sector in process but only used by DDENS driver
	;so never cleared with SDENS usage.
	DB 00h	
CMDSTR:	DW CMD0
CMD0:	DB 00h
CMD:	DB 00h
STAT:	DB 01h
TRK:	DB 00h
H3B51:	DB 01h
H3B52:	DB 00h			;sector
BCMD:	DB 80h,00h
SELDSK:	DB 00h
H3B56:	DB 00h,00h,00h,00h,00h,00h,00h,00h
	DB 00h,00h,00h,00h
H3B62:	DB 00h,00h
H3B64:	DB 00h,00h
H3B66:	DB 00h,00h,00h,00h
BLKMSK:	DB 00h
H3B6B:	DB 00h
H3B6C:	DB 00h,00h,00h,00h,00h,00h,00h,00h
H3B74:	DB 00h,00h
H3B76:	DB 00h,00h
H3B78:	DB 00h,00h
H3B7A:	DB 00h
H3B7B:	DB 00h			;allocation vector
H3B7C:	DB 00h,00h
H3B7E:	DB 00h,00h
H3B80:	DB 00h,00h
H3B82:	DB 00h,00h
H3B84:	DB 00h,00h
H3B86:	DB 00h,00h
H3B88:	DB 00h,00h
H3B8A:	DB 00h
H3B8B:	DB 00h			;current disk
H3B8C:	DB 00h
TEMP:	DB 00h,00h
CALLNO:	DB 00h
OPTION:	DB 00h			;error control options. 10h = no options (during write sector)
INFO:	DB 00h,00h
SVINFO:	DB 00h,00h
H3B95:	DB 80h,00h		;dma address

;this code is exclusive DIO/PDS controller only

H3B97:	MVI 	A,10h		;firmware command out to FD
	LXI 	H,CMD		;CMD address out to FD
	CALL	H3BA4
	MVI 	A,11h		;firmware command out to FD
	LXI 	H,CMD1		;CMD1 address out to FD
H3BA4:	CALL	H3BAC
	MOV 	A,L
	CALL	H3BAC
	MOV 	A,H
H3BAC:	JMP 	H31FB		;self modified to JMP E006 which is DIO/PDS rom only

WINIT:	LHLD	H0069		;bdos serial# copied by genesys
	CALL	H3A6A		;do checksum
	LXI 	H,H3B1C		;top of memory low byte which always = FF
	JNZ	002Eh		;taken if checksum failed
	LHLD	PRESRV
	INX 	H
	MOV 	A,H
	ORA 	L
	JZ 	H3BD8
	LHLD	SYSBUF
	LXI 	D,H3AFE
	MOV 	B,M
	LDAX	D
	CMP 	B
	JNC	H3BD2
	MOV 	B,A
	MOV 	M,A
H3BD2:	CALL	COPYHL
	JMP 	H3C07
H3BD8:	LDA 	BOODSK
	ADI 	21h
	STA 	BTDISK
	LXI 	H,H3B02
	MOV 	M,A
	INX 	H
	MOV 	M,A
	INX 	H
	INR 	A
	MOV 	M,A
	INX 	H
	INR 	A
	MOV 	M,A
	INX 	H
	INR 	A
	MOV 	M,A
	LHLD	ENDMEM		;end of memory
H3BF2:	MOV 	A,M		;test for size of ram
	CMA 	
	MOV 	M,A
	CMP 	M
	CMA 	
	MOV 	M,A
	JNZ	H3BFF
	INR 	H
	JNZ	H3BF2
H3BFF:	MOV 	A,H
	SUI 	10h
	ORI 	0Fh
	STA 	H3B1D
H3C07:	CALL	H3B97
	LXI 	H,0E006h
	SHLD	H3BAC+1
	XRA 	A
	LXI 	H,H3B01
	SUB 	M
	JZ 	H3C40
	MOV 	C,A
H3C19:	LXI 	H,H3C24+1
	MOV 	A,M
	SUI 	10h		;change port address
	MOV 	M,A
	DCR 	A
	STA 	H3C3A+1
H3C24:	OUT 	0FFh		;port address self modified
	MOV 	A,C
	DCR 	A
	JM 	H3C37
	STA 	H3B01
	CALL	CKDIO		;check for DIO controller
	JNZ	H3C40		;taken if no DIO
	CALL	0E00Ch		;DIO rom call
H3C37:	CALL	H3B97
H3C3A:	OUT 	0EEh		;port address self modified
	INR 	C
	JNZ	H3C19
H3C40:	LHLD	BUFFS
	SHLD	H3B20
	XCHG	
	LHLD	LSTFRE
	CALL	SUBDE
	MOV 	A,L
	ANI 	0FCh
	MOV 	L,A
	XCHG	
	CALL	H38F3
	INX 	H
	DAD 	D
	MVI 	M,0FFh
	CALL	DDINIT		;if single density just returns
	RET

	END

