	DEVICE ZXSPECTRUM48

START:		EQU $3BD6

VAR_VARS:	EQU $5C4B
CHR_INVR:	EQU $14
CHR_RETN:	EQU $0D
CHR_QUOT:	EQU $22
CHR_DOLA:	EQU $24
CHR_EQUA:	EQU $3D

	org START
	
	; Open channel S(creen) for printing
	; via BASIC ROM routine call.
	ld a,-2
	rst $10			; G+DOS "CALLBAS"
	dw $1601		; Routine to call

	ld hl,(VAR_VARS)
	ld a,(hl)
	cp $80
	jr nz, CHECK_7
	
	ld de,m1
LOOP:
	ld a,(de)
	or a
	jr z,LOOP_DONE
	rst $10
	dw $10
	inc de
	jr LOOP
LOOP_DONE:

NEXT_CHARACTER:
	ld a,(hl)
	cp $80
	jr z, EXIT
CHECK_7:
	bit 7,a
	jr nz,CHECK_6
	bit 5,a
	jr z,STRING
	jr NUMBER
CHECK_6:
	bit 6,a
	jr nz,CHECK_5
	bit 5,a
	jp nz,LONG_NAME
	jr SKIP_WORD_LENGTH
CHECK_5:
	bit 5,a
	jr z,SKIP_WORD_LENGTH
	jr FORNEXT
EXIT:
	or a ; clear carry = flag to esxDOS no error
	ret
SKIP_WORD_LENGTH:
	ld a,(hl)
	and %00011111
	add a,$60
	rst $10				; G+DOS "CALLBAS"
	dw $10				; i.e. "RST $10" in the BASIC ROM
	call PRINT_ARRAY
	ld a,CHR_RETN
	rst $10
	dw $10
	inc hl
	ld e,(hl)
	inc hl
	ld d,(hl)
	ADD hl,de
	inc hl
	jr NEXT_CHARACTER

FORNEXT:
	ld a,CHR_INVR
	rst $10
	dw $10
	ld a,$01			; 01 inverse ON
	rst $10
	dw $10
	ld a,(hl)
	xor $A0
	rst $10
	dw $10
	ld a,CHR_INVR
	rst $10
	dw $10
	xor a				; 00 inverse OFF
	rst $10
	dw $10
	ld a,CHR_RETN
	rst $10
	dw $10
	ld DE,$0013
	ADD hl,DE
	jr NEXT_CHARACTER

STRING:
	ld a,(hl)
	rst $10
	dw $10
	ld a,CHR_DOLA
	rst $10
	dw $10
	ld a,CHR_EQUA
	rst $10
	dw $10
	ld a,CHR_QUOT
	rst $10
	dw $10
	inc hl
	ld B,(hl)
	inc hl
	inc hl
STRING_LOOP:
	ld a,(hl)
	rst $10
	dw $10
	inc hl
	djnz STRING_LOOP
	ld a,CHR_QUOT
	rst $10
	dw $10
	ld a,CHR_RETN
	rst $10
	dw $10
	jp NEXT_CHARACTER

NUMBER:
	ld a,(hl)
	res 5,a
	rst $10
	dw $10
NUMBER_EQ:
	ld a,CHR_EQUA
	rst $10
	dw $10
	inc hl
	ld a,(hl)
	inc hl
	ld e,(hl)
	inc hl
	ld d,(hl)
	inc hl
	ld c,(hl)
	inc hl
	ld b,(hl)
	inc hl
	push hl
	
	;call $2DE3
	rst $10			; G+DOS call $2AB2 in BASIC ROM
	defw $2AB2		; FPC stack 5-byte value
	rst $10			; G+DOS call $2DE3 in BASIC ROM
	defw $2DE3		; FPC print value
	pop hl
	ld a,CHR_RETN
	rst $10
	dw $10
	
	jp NEXT_CHARACTER

LONG_NAME:
	ld a,(hl)
	xor $E0
	rst $10
	dw $10
LONG_NAME_LOOP:
	inc hl
	ld a,(hl)
	bit 7,a
	jr nz,LONG_NAME_LAST
	rst $10
	dw $10
	jr LONG_NAME_LOOP
LONG_NAME_LAST:
	res 7,a
	rst $10
	dw $10

	jr NUMBER_EQ

PRINT_ARRAY:
	ld a,$20
	rst $10
	dw $10
	ld a,"A"
	rst $10
	dw $10
	ld a,"r"
	rst $10
	dw $10
	ld a,"r"
	rst $10
	dw $10
	ld a,"a"
	rst $10
	dw $10
	ld a,"y"
	rst $10
	dw $10
	ret
	
m1:
	defm "Variables List",$0D
	defm "by Neil R. Canham, 1984",$0D
	defb $0D
	defm "This machine-code program for",$0D
	defm "the 16K or 48K Spectrum lists",$0D
	defm "all defined BASIC variables.",0
m2:
	defm "G+DOS conversion by Robert W. Morrison 2026",0
m3:
	
	DISPLAY "Length: ",/D,$-START
	SAVEBIN "LVX",START,$-START