;****************************************************************************
; Ju + Te Tiny  2k BASIC-System / 4k EMR-ES 1988
; (c) Dr. Helmut Hoyer, 1987-1989
;
; reass: Johann Spannkrebs 05.2006,  Volker Pohlers 02.2007,10.2007
;Patrick Schäfer 10/2011
;
;****************************************************************************
;  Registerbelegung für Basic
;****************************************************************************
; %02-03	Arbeitsregister X
; %04-05	Arbeitsregister Y
; %06-07	BASIC-Startadresse, default %E000
; %08-09	Adresse der Prozedurtabelle. %08=00 wenn interne verwendet
; %0E		BASIC-Fehler
;			Fehlerbits: 	0..3 GOSUB Rekursionstiefe
;				4  GOSUB Stacküberlauf (01)
;				5  RETURN ohne GOSUB (02)
;				6 Division durch Null (04)
;			7 Integerüberlauf (08)
; %0F		BASIC-Flags
;		02: Programm beendet
;		04:
;		08: STOP aktiv
;
;****************************************************************************
;  BASIC
:
; 10 PRINT "HALLO"	E000: 80 0A 50 22 48 41 4C 4C 4F 22 0D
; 20 GOTO 10		E00B: 80 14 47 31 30 0D
;			E011: 00
;
; d.h. eine Zeile beginnt mit 2 byte Zeilennr binär, oberstes bit gesetzt
; dann Befehlstoken bzw ASCII, dann %0D als Zeilenende.
; Semikolon trennt Anweisungen, Komma trennt Argumente
;
;****************************************************************************
		message "----------------------"
		message "|  MME-Basic U8830D  |"
		message "|Edit by. PIC18F2550 |"
		message "----------------------"
;****************************************************************************
; Festlegung Konstanten
;****************************************************************************
byte804	EQU	00004h
byte805	EQU	00005h
byte806	EQU	00006h
byte807	EQU	00007h
byte808	EQU	00008h
byte809	EQU	00009h
word80A	EQU	0000Ah
word80C	EQU	0000Ch
byte80E	EQU	0000Eh
byte80F	EQU	0000Fh
byte87F	EQU	0007Fh
;****************************************************************************
; Register
;****************************************************************************
gpr	EQU	000FEh				; General purpose register bzw. Stackpointer, Highteil
;
;-----------------------------------------------------------------------------
; Start MME-Basic
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Bootstrap MODULE
; s. Kieser/Meder Seite	228-229
;-----------------------------------------------------------------------------
B_000C:
		srp	#00000h			; Registerprointer auf 00-Gruppe
		ld	R3	,#000Fh		; Test, ob P32 und P35 gebrückt sind
		nop
		tm	R3	,#00004h
		ld	R3	,#000FFh
		jr	NZ	,B_001D
		tm	R3	,#00004h
		jr	NZ	,B_003D		; wenn gebrückt, dann weiter im Test-Programm
B_001D:
		ld	p01m	,#10110110b	; Festlegung für erweitertes Zeitverhalten
		ld	p3m	,#00001000b	; Programmierung Port 3
		ld	R4	,#00008h	; Test, ob sich auf Adresse 0812h RAM befindet
		ld	R5	,#00012h
		ldc	R6	,@RR4
		com	R6
		ldc	@RR4	,R6
		ldc	R7	,@RR4
		com	R6
		ldc	@RR4	,R6
		xor	R6	,R7
		srp	#-00010h
		jp	NZ	,0E000h		; wenn RAM lokalisiert ist, Sprung nach 0E000h
		jp	M_0812			; sonst	nach Adresse 0812h springen
;-----------------------------------------------------------------------------
; Testhilfe zur	Ausgabe	von alternierenden
; Impulsen am Port P1 und P0 mit
; Triggerimpuls	an Leitung P35
;-----------------------------------------------------------------------------
B_003D:
		ld	p01m	,#00004h	; Port P1 und P0 auf Ausgabe
		ld	tmr	,#000C0h	; internen Takt	ausgeben
		ld	R0	,#000FFh
		ld	R1	,#000FFh
		rcf
B_0048:
		and	R3	,#000DFh	; Triggerimpuls	an Leitung P35
		or	R3	,#00020h
B_004E:
		rlc	R1
		rlc	R0
		tm	R3	,#00004h	; Abfrage für tristate
		jr	Z	,B_005B
		jr	C	,B_004E
		jr	B_0048
B_005B:
		ld	p01m	,#0007Fh	; Ports	0-1 mode
B_005E:
		jr	B_005E			; Warteschleife
;-----------------------------------------------------------------------------
; dma MODULE
; s. Kieser/Meder Seite	235
; Serviceroutine für BUSREQ,
; mit BUSREQ an	P32 und
; BUSACK ans P35, beide	L-aktiv
;-----------------------------------------------------------------------------
B_0060:
						; Festlegung der Kodierung für Tristate	für Port 0 und P1
		or	byte87F	,#00018h	; P01M muß in Register %7F verfügbar sein, dw	P01M nicht lesbar
		ld	p01m	,byte87F	; Ports	0-1 mode
		and	p3	,#000DFh	; Ausgabe von BUSACK
B_0069:
		tm	p3	,#00004h	; Port 3
		jr	Z	,B_0069		; Ende abwarten
		and	byte87F	,#000F7h	; Festlegung der Kodierung für AD0..AD7	an Port	0 und Port 1
		or	p3	,#00020h	; BUSACK zurücknehmen
		ld	p01m	,byte87F	; wieder auf Bus gehen
		nop				; Ausführung (wegen Pipeline) abwarten
		iret
;-----------------------------------------------------------------------------
; Beginn MPBASIC
; Variablen A..Z liegen in Register 32 ff
; Datenübergabe Y	R4+R5, X R2+R3
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Variabel setzen
; X := Y
;-----------------------------------------------------------------------------
B_0079:
		ld	R2	,R4
		ld	R3	,R5
		ret
;-----------------------------------------------------------------------------
; Addition
; X := X + Y
;-----------------------------------------------------------------------------
B_007E:
		add	R3	,R5
		adc	R2	,R4
		jr	OV	,B_009A
		ret
;-----------------------------------------------------------------------------
; Subtraktion
; X := X - Y
;-----------------------------------------------------------------------------
B_0085:
		sub	R3	,R5
		sbc	R2	,R4
		jr	OV	,B_009A
		ret
;-----------------------------------------------------------------------------
; X := ABS (Y)
;-----------------------------------------------------------------------------
B_008C:
		tm	R4	,#00080h	; Y Test Vorzeichen Bit	7
		jr	Z	,B_0079		; X := Y
B_0091:
		clr	R2			; X := 0
		clr	R3
		jr	B_0085			; X := X - Y
B_0097:
		or	byte80F	,#00080h
B_009A:
		or	byte80E	,#00080h
		ret
;-----------------------------------------------------------------------------
; ???
;-----------------------------------------------------------------------------
B_009E:
		ld	R8	,R2
		xor	R8	,R4
		ld	R9	,#2
B_00A4:
		ld	R6	,R2
		ld	R7	,R3
		call	B_008C			; ABS[parameter] absoluter Betrag
		ld	R4	,R6
		ld	R5	,R7
		djnz	R9	,B_00A4
		ld	R6	,R2
		ld	R7	,R3
		clr	R2
		clr	R3
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_00BA:
		call	B_009E
		ld	R11	,#0000Fh
B_00BF:
		sra	R6
		rrc	R7
		jr	NC	,B_00CB
		add	R3	,R5
		adc	R2	,R4
		jr	OV	,B_0097
B_00CB:
		rlc	R5
		rlc	R4
		jr	NOV	,B_00D5
		or	R6	,R7
		jr	NZ	,B_0097
B_00D5:
		djnz	R11	,B_00BF
B_00D7:
		ld	R4	,R2
		ld	R5	,R3
		rlc	R8
		jr	C	,B_0091
		ret
;-----------------------------------------------------------------------------
; Division
;-----------------------------------------------------------------------------
B_00E0:
		call	B_009E
		ld	R9	,#00010h
		rcf
		clr	R10
		clr	R11
B_00EA:
		rlc	R7
		rlc	R6
		rlc	R11
		rlc	R10
		jr	C	,B_00FE
		cp	R4	,R10
		jr	UGT	,B_0103
		jr	C	,B_00FE
		cp	R5	,R11
		jr	UGT	,B_0103
B_00FE:
		sub	R11	,R5
		sbc	R10	,R4
		scf
B_0103:
		djnz	R9	,B_00EA
		ld	R9	,R4
		or	R9	,R5
		jr	Z	,B_0115
		rlc	R7
		rlc	R6
B_010F:
		ld	R2	,R6
		ld	R3	,R7
		jr	B_00D7
B_0115:
		call	B_010F
		or	byte80E	,#00040h
B_011B:
		or	byte80F	,#-00080h
		ret
;-----------------------------------------------------------------------------
; Mod
;-----------------------------------------------------------------------------
B_011F:
		call	B_00E0
		ld	R8	,R2
		ld	R2	,R10
		ld	R3	,R11
		jr	B_00D7
;-----------------------------------------------------------------------------
; OR
; X := X OR Y
;-----------------------------------------------------------------------------
B_012A:
		or	R2	,R4		
		or	R3	,R5
		ret
;-----------------------------------------------------------------------------
; AND
; X := X AND Y
;-----------------------------------------------------------------------------
B_012F:
		and	R2	,R4		
		and	R3	,R5
		ret
;-----------------------------------------------------------------------------
; XOR
; X := X XOR Y
;-----------------------------------------------------------------------------
B_0134:
		xor	R2	,R4		
		xor	R3	,R5
		ret
;-----------------------------------------------------------------------------
; X := NOT Y
; NOT[parameter] bitweise logische Negation
;-----------------------------------------------------------------------------
B_0139:
		call	B_0079		
		com	R2			; X := NOT X
		com	R3
		ret
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_0141:
		and	byte80F	,#0008Fh
		cp	R2	,R4
		jr	Z	,B_0152
		ld	R7	,#00020h
		jr	GT	,B_014E
B_014C:
		ld	R7	,#10h
B_014E:
		or	byte80F	,R7
		ret
B_0152:
		ld	R7	,#00040h
		cp	R3	,R5
		jr	Z	,B_014E
		ld	R7	,#20h
		jr	UGT	,B_014E
		jr	B_014C
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_015E:
		ld	R8	,R3
		ld	R7	,R3
		ld	R6	,R2
		ld	R5	,R2
		swap	R5
		swap	R7
		ld	R4	,#00025h
		ld	R10	,#00004h
B_016E:
		ld	R11	,#00015h
B_0170:
		and	@R11	,#0000Fh
		add	@R11	,#00030h
		cp	@R11	,#0003Ah
		jr	C	,B_017E
		add	@R11	,#00007h
B_017E:
		inc	R11
		djnz	R10	,B_0170
		ret
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_0182:
		ld	R4	,R2
		ld	R5	,R3
		call	B_008C			; ABS[parameter] absoluter Betrag
		rlc	R4
		ld	R4	,#00020h
		jr	NC	,B_0191
		ld	R4	,#0002Dh
B_0191:
		ld	R11	,#00006h
		ld	R10	,#00015h
B_0195:
		clr	@R10
		inc	R10
		djnz	R11	,B_0195
		ld	R11	,#0000Fh
B_019C:
		sra	R2
		rrc	R3
		jr	NC	,B_01AE
		add	R7	,R10
		da	R7
		adc	R6	,R9
		da	R6
		adc	R5	,R8
		da	R5
B_01AE:
		add	R10	,R10
		da	R10
		adc	R9	,R9
		da	R9
		adc	R8	,R8
		da	R8
		djnz	R11	,B_019C
		ld	R8	,R7
		ld	R9	,R7
		ld	R7	,R6
		swap	R6
		swap	R8
		ld	R10	,#00005h
		jr	B_016E
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_01CA:
		swap	@R13
		ld	R14	,#00004h
B_01CE:
		rlc	@R13
		rlc	R5
		rlc	R4
		rlc	R3
		djnz	R14, B_01CE
		ret
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_01D9:
		ld	R13	,#00016h
		clr	R4
		clr	R5
		cp	R6	,#00025h
		jr	NZ	,B_020B
		ld	R12	,#00005h
B_01E6:
		inc	R13
		sub	@R13	,#00030h
		jr	C	,B_0205
		cp	@R13	,#0000Ah
		jr	C	,B_01FE
		sub	@R13	,#00011h
		jr	C	,B_0205
		add	@R13	,#0000Ah
		cp	@R13	,#00010h
		jr	NC	,B_0205
B_01FE:
		call	B_01CA
		djnz	R12	,B_01E6
B_0203:
		rcf
		ret
B_0205:
		cp	R12	,#00005h
		jr	Z	,B_0203
		ret
B_020B:
		ld	R12	,#00006h
		clr	R2
		clr	R3
		cp	R6	,#0002Dh
		jr	NZ	,B_0218
		inc	R2
B_0217:
		inc	R13
B_0218:
		sub	@R13	,#00030h
		jr	C	,B_0229
		cp	@R13	,#0000Ah
		jr	NC	,B_0229
		call	B_01CA
		djnz	R12	,B_0217
B_0227:
		rcf
		ret
B_0229:
		cp	R12	,#00006h
		jr	Z	,B_0227
		cp	R3	,#00004h
		jr	NC	,B_0227
		clr	R6
		clr	R7
		ld	R11	,#00013h
		ld	R8	,#00027h
		ld	R9	,#00010h
		call	B_0271
		inc	R11
		ld	R8	,#00003h
		ld	R9	,#000E8h
		call	B_026F
		ld	R8	,#00000h
		ld	R9	,#00064h
		call	B_026F
		inc	R11
		ld	R9	,#0000Ah
		call	B_026F
		ld	R9	,#00001h
		call	B_026F
		ld	R4	,R6
		ld	R5	,R7
		rlc	R6
		jr	C	,B_0227
		rrc	R2
		jr	NC	,B_027E
		call	B_0091
		ld	R4	,R2
		ld	R5	,R3
		jr	B_027E
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_026F:	
		swap	@R11
B_0271:
		ld	R10	,@R11
		and	R10	,#0Fh
		jr	Z	,B_027E
B_0278:
		add	R7	,R9
		adc	R6	,R8
		djnz	R10	,B_0278
B_027E:
		scf
		ret
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_0280:
		pop	R8			; RR8 Rückkehradresse dieser Routine
		pop	R9
		pop	R2			; RR2 Rückkehradresse zum Interpreter
		pop	R3
		pop	R6			; RR6 Adresse von X
		pop	R7
		jp	@RR8			; RET
;-----------------------------------------------------------------------------
; SETRR	[register,wert]	Doppelregister setzen
; X (HI) := wert
;-----------------------------------------------------------------------------
B_028E:
		call	B_0280
		ld	@R7	,R4
		inc	R7
		jr	B_0299
;-----------------------------------------------------------------------------
; SETR [register,wert] Register	setzen
;-----------------------------------------------------------------------------
B_0296:
		call	B_0280
B_0299:
		ld	@R7	,R5		; X (LO) := wert
		jp	@RR2			; zurück zum Interpreter
;-----------------------------------------------------------------------------
; SETEW	[adresse,wert] externes	Wort setzen
;-----------------------------------------------------------------------------
B_02D9:
		call	B_0280
		lde	@RR6	,R4
		incw	RR6
		jr	B_02A9

;-----------------------------------------------------------------------------
; SETEB	[adresse,wert] externes	Byte setzen
;-----------------------------------------------------------------------------
B_02A6:
		call	B_0280
B_02A9:
		lde	@RR6	,R5
		jp	@RR2
;-----------------------------------------------------------------------------
; GETRR	[register] liefert Inhalt des Doppelregisters
;-----------------------------------------------------------------------------
B_02AD:
		ld	R2	,@R5
		inc	R5
		db	0000Dh	 		; JP FALSE mit nächstem	Befehl
;-----------------------------------------------------------------------------
; GETR [register] liefert Inhalt des Registers
;-----------------------------------------------------------------------------
B_02B1:
		clr	R2			
		ld	R3	,@R5
		ret
;-----------------------------------------------------------------------------
; GETEW	[register] holt	Wortwert aus externem Speicher
;-----------------------------------------------------------------------------
B_02B6:
		lde	R2	,@RR4
		incw	RR4
		db	0000Dh	 		; JP FALSE mit nächstem	Befehl
;-----------------------------------------------------------------------------
; GETEB	[register] holt	Bytewert aus externem Speicher
;-----------------------------------------------------------------------------
B_02BB:
		clr	R2
		lde	R3	,@RR4
		ret
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
B_02C0:
		call	B_02C8
		ld	R5	,#00020h
		call	M_0818			; PUT_CHAR
B_02C8:
		ld	R5	,#00008h
		jp	M_0818			; PUT_CHAR
;-----------------------------------------------------------------------------
; RL[x]	x links	rotieren
;-----------------------------------------------------------------------------
B_02CD:
		rcf
		rlc	R5
		rlc	R4
		adc	R5	,#000000h
B_02D5:
		jp	B_0079			; X := Y
;-----------------------------------------------------------------------------
; RR[x]	x rechts rotieren
;-----------------------------------------------------------------------------
B_02D8:
		rcf
		rrc	R4
		rrc	R5
		jr	NC	,B_02D5
		or	R4	,#-00080h
		jr	B_02D5
;-----------------------------------------------------------------------------
; INPUT	Zahleneingabe vom Terminal
;-----------------------------------------------------------------------------
B_02E4:
		ld	R5	,#0003Fh
		call	M_0818			; PUT_CHAR
B_02E9:
		ld	R15	,#00015h
B_02EB:
		inc	R15
		cp	R15	,#0001Fh
		jr	Z	,B_0311
B_02F1:
		call	M_0815			; GET_CHAR
		ld	@R15	,R3
		cp	R3	,#0000Dh
		jr	Z	,B_0311
		cp	R3	,#00008h
		jr	NZ	,B_0319
		ld	R5	,#00020h
		call	M_0818			; PUT_CHAR
		dec	R15
		cp	R15	,#00015h
		jr	Z	,B_02EB
		call	B_02C8
		jr	B_02F1
B_0311:
		call	B_01D9
		jr	NC	,B_02E4		; INPUT	Zahleneingabe vom Terminal
		jp	B_0079			; X := Y
B_0319:
		inc	R3
		jr	PL	,B_02EB
B_031C:
		cp	R15	,#00016h
		jr	Z	,B_02E9
		call	B_02C0
		dec	R15
		jr	B_031C
;-----------------------------------------------------------------------------
; Liste	der internen Prozeduren
;-----------------------------------------------------------------------------
B_0328:
		db	3,	"NOT"
		dw	B_0139			; NOT[parameter] bitweise logische Negation
		db	3,	"ABS"
		dw	B_008C			; ABS[parameter] absoluter Betrag
		db	5,	"SETRR"
		dw	B_028E			; SETRR	[register,wert]	Doppelregister setzen
		db	4,	"SETR"
		dw	B_0296			; SETR [register,wert] Register	setzen
		db	5,	"SETEW"
		dw	B_02D9			; SETEW	[adresse,wert] externes	Wort setzen
		db	5,	"SETEB"
		dw	B_02A6			; SETEB	[adresse,wert] externes	Byte setzen
		db	5,	"GETRR"
		dw	B_02AD			; GETRR	[register] liefert Inhalt des Doppelregisters
		db	4,	"GETR"
		dw	B_02B1			; GETR [register] liefert Inhalt des Registers
		db	5,	"GETEW"
		dw	B_02B6			; GETEW	[register] holt	Wortwert aus externem Speicher
		db	5,	"GETEB"
		dw	B_02BB			; GETEB	[register] holt	Bytewert aus externem Speicher
		db	2,	"RL"
		dw	B_02CD			; RL[x]	x links	rotieren
		db	2,	"RR"
		dw	B_02D8			; RR[x]	x rechts rotieren
		db	5,	"INPUT"
		dw	B_02E4			; INPUT	Zahleneingabe vom Terminal
		db	3,	"GTC"
		dw	M_0815			; Get Char extern !
		db	3,	"PTC"
		dw	M_0818			; Put Char extern !
		db	0FFh			; Listenende
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_0391:
		ld	R15	,#00016h
		ldc	R6	,@RR0
		incw	RR0
		cp	R6	,R7
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_039A:
		ld	R10	,#HI(B_03C1)	; ld	R10	,#00003h
		ld	R11	,#LO(B_03C1)	; ld	R11	,#000C1h
		ld	R13	,#3
		call	B_03AF
		jr	Z	,B_03C0
		cp	R6	,#00024h
		jr	NZ	,B_03C0
		call	B_0391
		ld	R13	,#00003h
B_03AF:
		call	B_03B6
		jr	Z	,B_03C0
		djnz	R13	,B_03AF
B_03B6:
		ld	R12	,#00017h
		ldci	@R12	,@RR10
		ldci	@R12	,@RR10
		ldci	@R12	,@RR10
		cp	R6	,R7
B_03C0:
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_03C1:
		db	2Bh			; +
		dw	B_007E			; X := X + Y
		db	2Dh 			; -
		dw	B_0085			; X := X - Y
		db	2Ah 			; *
		dw	B_00BA
		db	2Fh 			; /
		dw	B_00E0
		db	41h 			; A
		dw	B_012F			; X := X AND Y
		db	4Fh 			; O
		dw	B_012A			; X := X OR Y
		db	58h 			; X
		dw	B_0134			; X := X XOR Y
		db	4Dh 			; M
		dw	B_011F
;-----------------------------------------------------------------------------
; Test auf Buchstabe 'A'..'Z'
;-----------------------------------------------------------------------------
B_03D9:
		cp	@R15	,#0041h		; 'A'
		jr	C	,B_03F0
		cp	@R15	,#005Bh		; 'Z'+1
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_03E2:
		call	B_03D9
		jr	C	,B_03EF
;-----------------------------------------------------------------------------
; Test auf Ziffer '0'..'9'
;-----------------------------------------------------------------------------
B_03E7:
		cp	@R15	,#00030h	; '0'
		jr	C	,B_03F0
		cp	@R15	,#0003Ah	; '9'+1
B_03EF:
		ret
B_03F0:
		rcf
		ret
B_03F2:
		call	B_03E7
		jr	C	,B_03EF
		cp	@R15	,#00041h	; 'A'
		jr	C	,B_03F0
		cp	@R15	,#00047h	; 'F'+1
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_0400:
		ld	R2	,#HI(B_0328)	; ld	R2	,#00003h
		ld	R3	,#LO(B_0328)	; ld	R3	,#00028h
		call	B_0412
		jr	C	,B_041E
		clr	R2
		or	R2	,byte808
		jr	Z	,B_041D
		ld	R3	,byte809
B_0412:
		ld	R4	,R0
		ld	R5	,R1
B_0416:
		ldc	R8	,@RR2
		cp	R8	,#000FFh
		jr	NZ	,B_041F
B_041D:
		rcf
B_041E:
		ret
B_041F:
		incw	RR2
		ldc	R7	,@RR2
		call	B_0391
		jr	NZ	,B_043C
		djnz	R8	,B_041F
		ldc	R6	,@RR0
		call	B_03E2
		jr	C	,B_043B
		incw	RR2
		ldc	R8	,@RR2
		incw	RR2
		ldc	R9	,@RR2
		scf
		ret
B_043B:
		inc	R8
B_043C:
		inc	R8
		inc	R8
		add	R3	,R8
		adc	R2	,#00000h
		ld	R0	,R4
		ld	R1	,R5
		jr	B_0416
B_0449:
		decw	RR0
B_044B:
		call	B_0400
		ldc	R10	,@RR0
		cp	R10	,#0005Bh
		jr	NZ	,B_046F
		incw	RR0
B_0457:
		push	R8
		push	R9
		call	B_04C7
		pop	R9
		pop	R8
		ld	R7	,#0005Dh
		call	B_0391
		jr	Z	,B_046F
		push	R3
		push	R2
		jr	B_0457
B_046F:
		ld	R4	,R2
		ld	R5	,R3
		call	@RR8
		srp	#00010h
		scf
		ret
B_0479:
		call	B_03D9
		jr	NC	,B_0495

		ldc	R7	,@RR0
		inc	R15
		call	B_03E2
		jr	C	,B_0449
		sub	R6	,#00041h
		rl	R6
		add	R6	,#00020h
		ld	R2	,@R6
		inc	R6
		ld	R3	,@R6
		scf
		ret
B_0495:
		cp	@R15	,#0003Bh
		jr	Z	,B_04B3
		cp	@R15	,#0000Dh
		jr	Z	,B_04B3
		inc	R15
B_04A0:
		ldci	@R15	,@RR0
		dec	R15
		call	B_03F2
		inc	R15
		jr	C	,B_04A0
		decw	RR0
		call	B_01D9
		ld	R2	,R4
		ld	R3	,R5
B_04B3:
		ret
B_04B4:
		ld	R7	,#00028h
		call	B_0391
		jr	NZ	,B_0479
		call	B_04C7
		jr	NC	,B_04C6
		ld	R7	,#00029h
		call	B_0391
		ccf
B_04C6:
		ret
B_04C7:
		call	B_04B4
		jr	NC	,B_04D5
B_04CC:
		call	B_0391
		call	B_039A
		jr	Z	,B_04D8
		scf
B_04D5:
		decw	RR0
		ret
B_04D8:
		push	R8
		push	R9
		push	R2
		push	R3
		call	B_04B4
		ld	R4	,R2
		ld	R5	,R3
		pop	R3
		pop	R2
		pop	R9
		pop	R8
		call	@RR8
		jr	B_04CC
B_04F3:
		call	B_0391
		sub	R6	,#00041h
		add	R6	,R6
		ld	R8	,#00020h
		add	R8	,R6
		ret
B_0500:
		ldc	R4	,@RR0
		decw	RR0
		tm	R4	,#00080h
		jr	Z	,B_0500
		incw	RR0
		and	R4	,#0007Fh
		cp	R0	,byte806
		jr	NZ,	B_0519
		cp	R1	,byte807
		scf
		jr	Z,	B_0528
B_0519:
		decw	RR0
		ldc	R5	,@RR0
		incw	RR0
		cp	R5	,#0000Dh
		jr	Z	,B_0528
		decw	RR0
		jr	B_0500
B_0528:
		incw	RR0
		ldc	R5	,@RR0
		decw	RR0
		ret
B_052F:
		ld	R7	,#00022h
		call	B_0391
		jr	NZ	,B_0542
B_0536:
		call	B_0391
		jr	Z	,B_0544
		ld	R5	,R6
		call	M_0818			; PUT_CHAR
		jr	B_0536
B_0542:
		decw	RR0
B_0544:
		ret
B_0545:
		call	B_04C7
		clr	R10
		ld	R9	,#00002h
B_054C:
		ld	R8	,#00010h
		ldc	R6	,@RR0
		cp	R6	,#0003Ch
		jr	Z	,B_0563
		rl	R8
		cp	R6	,#0003Eh
		jr	Z	,B_0563
		rl	R8
		cp	R6	,#0003Dh
		jr	NZ	,B_0569
B_0563:
		or	R10	,R8
		incw	RR0
		djnz	R9	,B_054C
B_0569:
		push	R10
		push	R2
		push	R3
		call	B_04C7
		ld	R4	,R2
		ld	R5	,R3
		pop	R3
		pop	R2
		call	B_0141
		pop	R8
		and	R8	,byte80F
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_0583:
		ld	R7	,#0003Bh
B_0585:
		call	B_0391
		jr	Z	,B_0590
		cp	R6	,#0000Dh
		scf
		jr	NZ	,B_0585
B_0590:
		decw	RR0
B_0592:
		ret
B_0593:
		call	B_0583
		jr	C	,B_0592
		incw	RR0
		jr	B_0593
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_059C:
		call	B_04F3
		push	R8
		incw	RR0
		call	B_04C7
		pop	R8
B_05A8:
		ld	@R8	,R2
		inc	R8
		ld	@R8	,R3
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_05AE:
		ld	byte804	,R0
		ld	byte805	,R1
B_05B2:
		jr	B_0583
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_05B4:
		push	byte804
		push	byte805
		ld	byte804	,R0
		ld	byte805	,R1
		ldc	R6	,@RR0
		cp	R6	,#0005Bh
		jr	NZ	,B_05D8
		incw	RR0
		clr	R8
		ld	R7	,#0005Dh
B_05C9:
		incw	RR0
		call	B_0391
		jr	Z	,B_05D6
		push	R8
		push	R8
		jr	B_05C9
B_05D6:
		incw	RR0
B_05D8:
		call	B_044B
		ld	R0	,byte804
		ld	R1	,byte805
		ld	R7	,#0005Bh
		call	B_0391
		jr	NZ	,B_05FE
		ld	R7	,#0005Dh
B_05E8:
		call	B_04F3
		call	B_0391
		jr	Z	,B_05FB
		pop	R10
		ld	@R8	,R10
		pop	R10
		inc	R8
		ld	@R8	,R10
		jr	B_05E8
B_05FB:
		call	B_05A8
B_05FE:
		pop	byte805
		pop	byte804
		jr	B_05B2
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
B_0604:
		call	B_04C7
		call	B_0500
		call	B_0141
		tm	byte80F	,#00050h
		jr	NZ	,B_0631
B_0612:
		call	B_0593
		incw	RR0
		ldc	R4	,@RR0
		incw	RR0
		ldc	R5	,@RR0
		decw	RR0
		rl	R4
		rcf
		rrc	R4
		jr	NC	,B_062E
		call	B_0141
		tm	byte80F	,#00050h
		jr	Z	,B_0612
B_062E:
		decw	RR0
		ret
B_0631:
		call	B_0500
		jr	NC	,B_063D
		incw	gpr			; General purpose register
		incw	gpr			; General purpose register
		jp	B_073E
B_063D:
		call	B_0141
		tm	byte80F	,#00060h
		jr	NZ	,B_062E
		decw	RR0
		jr	B_0631
;-----------------------------------------------------------------------------
; IF
;-----------------------------------------------------------------------------
B_0649:
		and	byte80F	,#000FEh
		call	B_0545
		jr	NZ	,B_0656
		inc	byte80F
		jp	B_0593
B_0656:
		ret
;-----------------------------------------------------------------------------
; ELSE
;-----------------------------------------------------------------------------
B_0657:
		tm	byte80F	,#00001h
		jp	Z	,B_0593
		and	byte80F	,#000FEh
		ret
;-----------------------------------------------------------------------------
; RETURN
;-----------------------------------------------------------------------------
B_0661:
		cp	byte80E	,#00000h
		jr	NZ	,B_066C
		or	byte80E	,#00020h
B_0669:
		jp	B_011B
B_066C:
		dec	byte80E
		pop	R6
		pop	R7
		pop	R0
		pop	R1
		and	byte80F	,#000FEh
		jp	@RR6
;-----------------------------------------------------------------------------
; GOSUB
;-----------------------------------------------------------------------------
B_067B:
		ld	R8	,R0
		ld	R9	,R1
		call	B_0583
		pop	R10
		pop	R11
		push	R1
		push	R0
		push	R11
		push	R10
		ld	R0, R8
		ld	R1, R9
B_0692:
		inc	byte80E
		tm	byte80E	,#00010h
		jp	Z	,B_0604
		call	B_0583
		jr	B_0669
;-----------------------------------------------------------------------------
; WAIT
;-----------------------------------------------------------------------------
B_069F:
		call	B_04C7
		ld	R6	,R2
		or	R6	,R3
		jr	Z	,B_06B8
B_06A8:
		da	R6
B_06AA:
		ld	R6	,#00000h
		ld	R7	,#0B4h
B_06AE:
		decw	RR6
		jp	NZ	,B_06AE
		decw	RR2
		jp	NZ	,B_06A8
B_06B8:
		ret
;-----------------------------------------------------------------------------
; CALL
;-----------------------------------------------------------------------------
B_06B9:
		call	B_04C7
		call	@RR2
		srp	#00010h
		ret
;-----------------------------------------------------------------------------
; STOP
;-----------------------------------------------------------------------------
B_06C1:
		or	byte80F	,#00008h
		ret
;-----------------------------------------------------------------------------
; END
;-----------------------------------------------------------------------------
B_06C5:
		or	byte80F	,#00002h
		ret
;-----------------------------------------------------------------------------
; CLRTRAP
;-----------------------------------------------------------------------------
B_06C9:
		clr	byte804
		clr	byte805
		ret
;-----------------------------------------------------------------------------
; PRINTHEX
;-----------------------------------------------------------------------------
B_06CE:
		call	B_052F
		call	B_04C7
		jr	NC	,B_06F8
		call	B_015E
		ld	R10	,#00005h
		jr	B_06EA
;-----------------------------------------------------------------------------
; PRINT
;-----------------------------------------------------------------------------
B_06DD:
		call	B_052F
		call	B_04C7
		jr	NC	,B_06F8
		call	B_0182
		ld	R10	,#00006h
B_06EA:
		ld	R11	,#00014h
B_06EC:
		push	R5
		ld	R5	,@R11
		inc	R11
		call	M_0818			; PUT_CHAR
		pop	R5
		djnz	R10	,B_06EC
B_06F8:
		ldc	R6	,@RR0
		cp	R6	,#0002Ch
		jr	NZ	,B_0710
		incw	RR0
		ldc	R6	,@RR0
		cp	R6	,#0003Bh
		jr	Z	,B_070F
		cp	R6	,#0000Dh
		jr	Z	,B_070F
		decw	RR0
B_070F:
		ret
B_0710:
		ld	R5	,#0000Dh
		jp	M_0818			; PUT_CHAR
;-----------------------------------------------------------------------------
; INPUT
;-----------------------------------------------------------------------------
B_0715:
		call	B_052F
		call	B_02E9
		call	B_04F3
		jp	B_05A8
		ld	byte80F	,#00004h
		jr	B_0736
		ld	byte80F	,#00008h
		jr	B_0736
B_072B:
		clr	byte80F
		clr	byte80E
		ld	R0	,byte806
		ld	R1	,byte807
		call	B_06C9
B_0736:
		srp	#00010h
B_0738:
		pop	word80A
		pop	word80A + 1
		jr	B_0748
B_073E:
		tm	byte80F	,#0000Ah
		jr	NZ	,B_074D
		tcm	byte80F	,#-0007Ch
		jr	Z	,B_074D
B_0748:
		ldc	R6	,@RR0
		inc	R6
		djnz	R6	,B_074F
B_074D:
		jp	@word80A
B_074F:
		cp	byte806	,R0
		jr	NZ	,B_0759
		cp	byte807	,R1
		jr	Z	,B_0785
B_0759:
		ld	R6	,byte804
		or	R6	,byte805
		jr	Z	,B_0785
		push	R1
		push	R0
		ld	R0	,byte804
		ld	R1	,byte805
		call	B_0545
		jr	Z	,B_0781
		call	B_06C9
		pop	R6
		pop	R7
		decw	RR6
		push	R7
		push	R6
		incw	RR0
		call	B_0692
		jr	B_07B9
B_0781:
		pop	R0
		pop	R1
B_0785:
		incw	RR0
		incw	RR0
B_0789:
		ldc	R3,	@RR0

		incw	RR0
		cp	R3	,#0003Eh
		jr	Z	,B_0795
		and	byte80F	,#000FEh
B_0795:
		ld	R6	,#HI(B_07C8)	; ld	R6	,#00007h
		ld	R7	,#LO(B_07C8)	; ld	R7	,#000C8h
		clr	R2
B_079B:
		ldc	R8	,@RR6
		cp	R8	,R3
		jr	Z	,B_07A6
		incw	RR6
		inc	R2
		jr	B_079B
B_07A6:
		add	R2	,R2
		ld	R6	,#HI(B_07D9)	; ld	R6	,#00007h
		ld	R7	,#LO(B_07D9)	; ld	R7	,#000D9h
		add	R7	,R2
		adc	R6	,#00000h
		ld	R2	,#0000Ch
		ldci	@R2	,@RR6
		ldci	@R2	,@RR6
B_07B7:
		call	@word80C
B_07B9:
		ld	R7	,#0000Dh
		call	B_0391
		jp	Z	,B_073E
		cp	R6	,#0003Bh
		jr	Z	,B_0789
		jr	B_07B7
;-----------------------------------------------------------------------------
; Tabelle der BASIC-Kommandos
;-----------------------------------------------------------------------------
B_07C8:
		db	4Ch			; L	= LET
		db	4Fh			; O	= PROC
		db	47h			; G	= GOTO
		db	46h			; F	= IF..THEN
		db	3Eh			; >	= ELSE..
		db	52h			; R	= RETURN
		db	53h			; S	= GOSUB
		db	57h			; W	= WAIT
		db	4Dh			; M	= REM
		db	43h			; C	= CALL
		db	54h			; T	= STOP
		db	45h			; E	= END
		db	21h			; !	= TRAP..TO
		db	2Fh			; /	= CLRTRAP
		db	50h			; P	= PRINT
		db	48h			; H	= PRINTHEX
		db	49h			; I	= INPUT
B_07D9:
		dw	B_059C			; L	= LET
		dw	B_05B4			; O	= PROC
		dw	B_0604			; G	= GOTO
		dw	B_0649			; F	= IF..THEN
		dw	B_0657			; >	= ELSE..
		dw	B_0661			; R	= RETURN
		dw	B_067B			; S	= GOSUB
		dw	B_069F			; W	= WAIT
		dw	B_0583			; M	= REM
		dw	B_06B9			; C	= CALL
		dw	B_06C1			; T	= STOP
		dw	B_06C5			; E	= END
		dw	B_05AE			; !	= TRAP..TO
		dw	B_06C9			; /	= CLRTRAP
		dw	B_06DD			; P	= PRINT
		dw	B_06CE			; H	= PRINTHEX
		dw	B_0715			; I	= INPUT
;-----------------------------------------------------------------------------
; Listenende
;-----------------------------------------------------------------------------
		db	0FFh
		db	0FFh
;-----------------------------------------------------------------------------
; Eintrittspunkt BASIC-Interpreter
;-----------------------------------------------------------------------------
		jp	B_072B
; end of 'ROM 1'
