; GSX.ASM
; -------
;
; CP/M-80 - GSX-80 Version 1.1
;
; Disassembled by:
;
; ROCHE Emmanuel
; 8 rue HERLUISON
; 10000 TROYES
; FRANCE
; ------
;
;--------------------------------
;
	PAGE	0		; Listing without page breaks
;
;	ORG	0000H		; CP/M-80 SYStem file
;
	ORG	0100H		; Debug only
;
;--------------------------------
; List of ASCII characters used
;
lf	equ	0AH		; Line Feed
cr	equ	0DH		; Carriage Return
;
;--------------------------------
; List of BDOS functions used
;
conout	equ	 2		; Console output
pstring	equ	 9		; Print string
openf	equ	15		; Open file
closef	equ	16		; Close file
readf	equ	20		; Read sequential
setDMA	equ	26		; Set DMA address
;
;--------------------------------
;
J0000	EQU	0000H		; J---I
I$0004	EQU	0004H		; ----I
I$000B	EQU	000BH		; ----I
DBUF	EQU	0080H		; ----I
I0500	EQU	0500H		; ----I
I$FFB5	EQU	0FFB5H		; ----I
;
;--------------------------------
;
	JMP	start1		; Start of code
;
;--------------------------------
; Indirect call to BDOS
;
BDOS:	DB	0C3H		; JMP opcode
;
D$0104	DW	0000H		; Storage for ???
;
;--------------------------------
;
D0106:	DB	0FFH,0FFH	; ? Separator?
;
;
DDtabl:	ds	55		; 55 bytes = 5 times 11 bytes
;
; Table of DD filenames
;
; Format:
; 1 byte  for the drive code
; 2 bytes for ???
; 8 bytes for the DD filename   (total = 11 bytes per driver)
;
;
	DB	0FFH		; ? Separator?
	DB	0FFH		; ?
;
;--------------------------------
;
copyr:	DB	'---------------------------------------------------', cr, lf
	DB	'GSX-80 1.1  01 Oct 83    Serial No 5000-1232-654321', cr, lf
	DB	'Copyright (C) 1983                                 ', cr, lf
	DB	'Digital Research, Inc.          All Rights Reserved', cr, lf
DDused:	DB	'---------------------------------------------------', cr, lf, '$'
;
; Note:
; The first three lines of the copyright message
; are utilized by the GDOS to store the contents of ASSIGN.SYS.
;
D$0142	equ	copyr + 1	; 2nd byte of first line
;
; The last line of the copyright message
; is used to store the FCB of the DD used.
;
I$021E	equ	DDused + 9	; PRL filetype of DD used
I$0235	equ	DDused + 32	; Last byte of the FCB of DD used
;
;--------------------------------
;
D024B:	ds	34		; ???
;
;--------------------------------
;
start1:	MOV	A,C		; Reg-A = BDOS function number
	CPI	73H		; = 115 ? (GSX function number)
	JNZ	BDOS		; No: jump back to BDOS
	LXI	H,word1		; 
	MVI	C,0AH		; 10 
	CALL	copy		; 
	LHLD	word1		; 
	MOV	A,M		; 
	INX	H		; 
	MOV	H,M		; 
	MOV	L,A		; 
	DCX	H		; 
	MOV	A,H		; 
	ORA	L		; 
	JZ	J$0291		; 
	CALL	C$02EA		; 
	CALL	C04FD		; 
J$028E:	JMP	J$0351		; 
;
;--------------------------------
;
J$0291:	LHLD	word2		; 
	MOV	E,M		; 
	INX	H		; 
	MOV	D,M		; 
	LHLD	D0106		; 
	CALL	sub16		; 
	JZ	J02CE		; 
	LXI	H,DDtabl	; 
J$02A3:	PUSH	H		; 
	MOV	A,M		; 
	INX	H		; 
	MOV	H,M		; 
	MOV	L,A		; 
	ANA	H		; 
	INR	A		; 
	POP	B		; 
	JZ	J02CE		; 
	PUSH	B		; 
	CALL	sub16		; 
	POP	H		; 
	JZ	J$02BD		; 
	LXI	B,I$000B	; 
	DAD	B		; 
	JMP	J$02A3		; 
;
;--------------------------------
;
J$02BD:	INX	H		; 
	INX	H		; 
	XCHG			; 
	SHLD	D0106		; 
	LXI	H,DDused	; File spec in copyr msg
	MVI	C,09H		; 9 
	CALL	copy		; 
	CALL	C$03C8		; 
J02CE:	CALL	C04FD		; 
	LHLD	word4		; 
	MOV	A,M		; 
	INX	H		; 
	PUSH	H		; 
	MOV	H,M		; 
	MOV	L,A		; 
	INX	H		; 
	SHLD	word6		; 
	POP	H		; 
	INX	H		; 
	MOV	A,M		; 
	INX	H		; 
	MOV	H,M		; 
	MOV	L,A		; 
	INX	H		; 
	SHLD	word7		; 
	JMP	J$028E		; 
;
;--------------------------------
;
C$02EA:	LHLD	word1		; 
	INX	H		; 
	INX	H		; 
	MOV	E,M		; 
	INX	H		; 
	MOV	D,M		; 
	MOV	A,E		; 
	ORA	D		; 
	RZ			; 
	LXI	H,I$FFB5	; 
	DAD	D		; 
	JNC	J$02FE		; 
	MVI	E,4BH		; "K"
J$02FE:	LHLD	word3		; 
	PUSH	H		; 
	LXI	H,copyr		; Copyright message
	SHLD	word3		; 
	PUSH	H		; 
	POP	B		; 
	POP	H		; 
J$030B:	PUSH	D		; 
	XCHG			; 
	LHLD	word6		; 
	CALL	C0320		; 
	XCHG			; 
	LHLD	word7		; 
	CALL	C0320		; 
	POP	D		; 
	DCR	E		; 
	JNZ	J$030B		; 
	RET			; 
;
;--------------------------------
;
C0320:	XCHG			; 
	MOV	A,M		; 
	INX	H		; 
	PUSH	H		; 
	MOV	H,M		; 
	PUSH	B		; 
	MOV	L,A		; 
	MVI	C,0FH		; 15 
	PUSH	D		; 
	XCHG			; 
	LXI	H,J0000		; 
J$032E:	MOV	A,D		; 
	RAR			; 
	MOV	D,A		; 
	MOV	A,E		; 
	RAR			; 
	MOV	E,A		; 
	JNC	J$033C		; 
	MOV	A,C		; 
	POP	B		; 
	PUSH	B		; 
	DAD	B		; 
	MOV	C,A		; 
J$033C:	MOV	A,H		; 
	RAR			; 
	MOV	H,A		; 
	MOV	A,L		; 
	RAR			; 
	MOV	L,A		; 
	DCR	C		; 
	JNZ	J$032E		; 
	POP	B		; 
	POP	B		; 
	MOV	A,L		; 
	STAX	B		; 
	INX	B		; 
	MOV	A,H		; 
	STAX	B		; 
	INX	B		; 
	POP	H		; 
	INX	H		; 
	RET			; 
;
;--------------------------------
;
J$0351:	LHLD	word1		; 
	LXI	D,I$0004	; 
	DAD	D		; 
	MOV	C,M		; 
	INX	H		; 
	MOV	B,M		; 
	LHLD	word5		; 
J$035E:	MOV	A,C		; 
	ORA	B		; 
	RZ			; 
	PUSH	B		; 
	XCHG			; 
	LHLD	word6		; 
	CALL	C0375		; 
	XCHG			; 
	LHLD	word7		; 
	CALL	C0375		; 
	POP	B		; 
	DCX	B		; 
	JMP	J$035E		; 
;
;--------------------------------
;
C0375:	MOV	B,H		; 
	MOV	C,L		; 
	XCHG			; 
	MOV	E,M		; 
	PUSH	H		; 
	INX	H		; 
	MOV	D,M		; 
	XCHG			; 
	MVI	A,10H		; 16 
	LXI	D,J0000		; 
J$0382:	PUSH	PSW		; 
	XCHG			; 
	DAD	H		; 
	XCHG			; 
	DAD	H		; 
	MOV	A,L		; 
	SUB	C		; 
	MOV	L,A		; 
	MOV	A,H		; 
	SBB	B		; 
	MOV	H,A		; 
	JNC	J$0392		; 
	DAD	B		; 
	DCX	D		; 
J$0392:	INX	D		; 
	POP	PSW		; 
	DCR	A		; 
	JNZ	J$0382		; 
	ANA	A		; 
	MOV	A,D		; 
	RAR			; 
	MOV	D,A		; 
	MOV	A,E		; 
	RAR			; 
	MOV	E,A		; 
	JNC	J$03A3		; 
	INX	D		; 
J$03A3:	POP	H		; 
	MOV	M,E		; 
	INX	H		; 
	MOV	M,D		; 
	INX	H		; 
	RET			; 
;
;--------------------------------
;
copy:	LDAX	D		; 
	MOV	M,A		;
	INX	H		; 
	INX	D		; 
	DCR	C		; 
	JNZ	copy		; 
	RET			; 
;
;--------------------------------
; 16 bits subtraction
;
sub16:	MOV	A,L		; 
	SUB	E		; 
	MOV	L,A		; 
	MOV	A,H		; 
	SBB	D		; 
	MOV	H,A		; 
	ORA	L		; 
	RET			; 
;
;--------------------------------
;
word1:	DW	0		; ?
word2:	DW	0		; ?
word3:	DW	0		; ?
word4:	DW	0		; ?
word5:	DW	0		; ?
word6:	DW	0		; ?
word7:	DW	0		; ?
;
;--------------------------------
;
C$03C8:	CALL	C$043D		; 
	CALL	readAS		; Read ASSIGN.SYS
	LHLD	D$0104		; 
	LXI	D,I0500		; 
	CALL	sub16		; 
	XCHG			; 
	LHLD	D$0142		; 
	PUSH	H		; 
	MOV	A,E		; 
	SUB	L		; 
	MOV	A,D		; 
	SBB	H		; 
	JNC	J$03E9		; 
	LXI	D,toobig	; 'too big to load$'
	JMP	drive		; Display d:filename.typ
;
;--------------------------------
;
J$03E9:	CALL	readAS		; Read ASSIGN.SYS
	POP	B		; 
	PUSH	B		; 
	LXI	H,I0500		; 
	PUSH	H		; 
J$03F2:	CALL	C0421		; 
	MOV	M,A		; 
	INX	H		; 
	DCX	B		; 
	MOV	A,C		; 
	ORA	B		; 
	JNZ	J$03F2		; 
	POP	H		; 
	MOV	B,H		; 
	DCR	B		; 
	POP	D		; 
J$0401:	MVI	C,08H		; 8 
	CALL	C0421		; 
J$0406:	RLC			; 
	PUSH	PSW		; 
	JNC	J$040E		; 
	MOV	A,B		; 
	ADD	M		; 
	MOV	M,A		; 
J$040E:	INX	H		; 
	DCX	D		; 
	MOV	A,D		; 
	ORA	E		; 
	JZ	J$041D		; 
	POP	PSW		; 
	DCR	C		; 
	JNZ	J$0406		; 
	JMP	J$0401		; 
;
;--------------------------------
;
J$041D:	POP	PSW		; 
	JMP	J$0463		; 
;
;--------------------------------
;
C0421:	PUSH	H		; 
	PUSH	D		; 
	LHLD	D024B		; 
	INR	L		; 
	JP	J$0432		; 
	PUSH	B		; 
	CALL	readAS		; Read ASSIGN.SYS
	POP	B		; 
	LXI	H,J0000		; 
J$0432:	SHLD	D024B		; 
	LXI	D,copyr		; Copyright message
	DAD	D		; 
	MOV	A,M		; 
	POP	D		; 
	POP	H		; 
	RET			; 
;
;--------------------------------
;
C$043D:	LXI	D,PRLtyp	; PRL filetype
	LXI	H,I$021E	; 
	MVI	C,06H		; 6 
	CALL	copy		; 
	LXI	H,DBUF		; 
	SHLD	D024B		; 
	LXI	D,DDused	; File spec in copyr msg
	MVI	C,openf		; Open file
	CALL	BDOS		; 
	LXI	H,I$0235	; 
	MVI	M,00H		; 
J$045B:	ORA	A		; 
	RP			; 
	LXI	D,nfound	; ' not found$'
	JMP	drive		; Display d:filename.typ
;
;--------------------------------
;
J$0463:	LXI	D,DDused	; File spec in copyr msg
	MVI	C,closef	; Close file
	CALL	BDOS		; 
	JMP	J$045B		; 
;
;--------------------------------
; Display a char on console
;
pchar:	PUSH	H		; 
	MVI	C,conout	; Console output
	CALL	BDOS		; 
	POP	H		; 
	RET			; 
;
;--------------------------------
; Parse n+1 chars and display them
;
parse:	DCR	A		; 
	RZ			; 
	MOV	E,M		; 
	INX	H		; 
	PUSH	PSW		; 
	CALL	pchar		; 
	POP	PSW		; 
	JMP	parse		; 
;
;--------------------------------
; Read ASSIGN.SYS file and copy it in copyright message
;
readAS:	LXI	D,copyr		; Copyright message = DMA area...
	MVI	C,setDMA	; Set DMA Address
	CALL	BDOS		; 
	LXI	D,DDused	; File spec in copyr msg
	MVI	C,readf		; Read sequential
	CALL	BDOS		; 
	ORA	A		; Successful read ?
	RZ			; 
	LXI	D,whyEOF	; ':  unexpected EOF$'
drive:	PUSH	D		; 
	LXI	H,DDused	; File spec in copyr msg
	MOV	A,M		; 
	ORA	A		; Was a drive specified ?
	JZ	nodriv		; 
	ADI	40H		; Convert drive code in a number
	MOV	E,A		; 
	CALL	pchar		; Display drive letter
	MVI	E,':'		; Drive separator
	CALL	pchar		; Display it
nodriv:	INX	H		; 
	MVI	A,8+1		; Filename
	CALL	parse		; 
	MVI	E,'.'		; Filename separator
	CALL	pchar		; 
	MVI	A,3+1		; Filetype
	CALL	parse		; 
	POP	D		; 
	MVI	C,pstring	; Print string
	CALL	BDOS		; 
	JMP	0000H		; Back to CP/M
;
;--------------------------------
;
toobig:	DB	' too big to load$'
;
whyEOF:	DB	':  unexpected EOF$'
;
nfound:	DB	' not found$'
;
PRLtyp:	DB	'PRL'		; PRL filetype
;
	ds	8		; ?
;
;--------------------------------
;
C04FD:	LXI	D,word1		; ?
;
; The next byte is the first byte of the loaded driver.
;--------------------------------
;
	END			; CP/M-80 SYStem file
