;****************************************************************************
; Ju+Te Tiny 2013 Basic System 6k universal mit /DM auswahl
;
; 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
; reass: Volker Pohlers 02.2007
;****************************************************************************
;
;  Speicherbelegung, Daten
;      +-----------+-----------------------------------+
;      |1k RAM FFFF| 512 Byte Graphik-                 |
;      |       FE00|          Bildwiederholspeicher    |
;      +-----------+-----------------------------------+
;      |       FDFF| 128 Byte Systemstack              |
;      |       FD80|                                   |
;      +-----------+-----------------------------------+
;      |       FD7F| 128 Byte ASCII-                   |
;      |       FD00|          Bildwiederholspeicher    |
;      +-----------+-----------------------------------+
;      |       FCFF| 128 Byte frei für Standard-       |
;      |       FC80|          Programme                |
;      +-----------+-----------------------------------+
;      |       FC7F| 128 Byte Magnetbandpuffer         |
;      |       FC00|                                   |
;      +-----------+-----------------------------------+
;
;  Speicherbelegung, Code
;      +-----------+-----------------------------------+
;      |       FBFF| Anwenderbereich                   |
;      |       E000|                                   |
;      +-----------+-----------------------------------+
;      |2k ROM 17FF| 2048 Byte Betriebssystem          |
;      |       1000|                                   |
;      +-----------+-----------------------------------+
;      |2k ROM 0FFF| 2048 Byte Basicinterpreter        |
;      |       0800|                                   |
;      +-----------+-----------------------------------+
;      |2k ROM 07FF| 2048 Byte leer Boot jp Monitor    |
;      |       0000|                                   |
;      +-----------+-----------------------------------+
;
;
;  19.10.2011 (ps)
;
;  Registerbelegung
;
; %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
; für BASIC-Editor
; %10-11	Pointer auf BASIC-Programmzeile
; %12-13	temp	z.B. Wort für Dezimalausgabe
; 			%13 Zeichen von getchar
; %15-19	temp	z.B. ASCII-Stellen für Dezimalausgabe
; 			%15 Zeichen an putchar
; %20-21	BASIC-Variable A
; %22-23	BASIC-Variable B
;   (...)
; %4E-4F	BASIC-Variable X
; %50-51	BASIC-Variable Y oder Programmstart für SAVE
; %52-53	BASIC-Variable Z oder Programmende für SAVE
; für Betriebsystem
; %54		Videozeilenzähler
; %58		temp	z.B. Textnummer
; %5A		ASCII-Übergaberegister
; %5B		Cursorposition im Zeichenspeicher (0..127)
; %5C		temp	z.B. Schrittweite beim Cursor
; %5D		HexByte-Übergaberegister
; %5E-5F	Adress-Übergaberegister
; %60		temp
; %6C		Byte aus Hex-Eingabe über Tastatur
; %6D		Tastencode-Register. T-Bit (bit 7) =1 wenn neuer Inhalt
; %6E-6F	Wort aus Hex-Eingabe über Tastatur
; %74-75	IRQ0-Vektor
; %76-77	IRQ1-Vektor
; %78-79	IRQ2-Vektor
; %7A-7B	IRQ3-Vektor
; %7C-7D	IRQ4-Vektor (T0 für Videoerzeugung)
; %7E-7F	IRQ5-Vektor
;
;
;  Speicherbelegung
;
; %FFFF		Shift-Flag. 0 wenn Shift aktiv
;               Das gibt einen weissen Strich unten rechts auf dem Bildschirm.
;
;
;  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
;
;****************************************************************************

		cpu	z8601
		include	stddefz8.inc

byte_804	equ	4
byte_805	equ	5
byte_806	equ	6
byte_807	equ	7
byte_808	equ	8
byte_809	equ	9
word_80A	equ	0Ah
word_80C	equ	0Ch
byte_80E	equ	0Eh
byte_80F	equ	0Fh
byte_87F	equ	7Fh

; Register
gpr 		equ	0FEh	; General purpose register bzw. Stackpointer, Highteil

; AS-Funktionen
hi	function x,(x>>8)&255
lo	function x, x&255
;-----------------------------------------------------------------------------
;	1. ROM 
;-----------------------------------------------------------------------------
		org	0h
irq0:		dw	0800h		; IRQ 0
irq1:		dw	0803h		; IRQ 1
irq2:		dw	0806h		; IRQ 2
irq3:		dw	0809h		; IRQ 3
irq4:		dw	080Ch		; IRQ 4
irq5:		dw	080Fh		; IRQ 5
		jp	0812h		; nach Adresse 0812h springen
; end of 'ROM1'
;-----------------------------------------------------------------------------
;	2. ROM BASIC 
;-----------------------------------------------------------------------------
		org	0800h
		jp 	1000h		; IRQ 0
		jp 	1003h		; IRQ 1
		jp 	1006h		; IRQ 2
		jp 	1009h		; IRQ 3
		jp 	100Ch		; IRQ 4
		jp 	100Fh		; IRQ 5
		jp 	1012h		; nach Adresse 1012h springen
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
; Beginn MPBASIC
; Variablen A..Z liegen in Register 32 ff
; Datenübergabe		Y = R4+R5, X = R2+R3
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_let:		ld	R2, R4		; X := Y
		ld	R3, R5
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_plus:		add	R3, R5		; X := X + Y
		adc	R2, R4
		jr	OV, p_abs3
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_minus:	sub	R3, R5		; X := X - Y
		sbc	R2, R4
		jr	OV, p_abs3
		ret
;-----------------------------------------------------------------------------
; X := ABS (Y)
;-----------------------------------------------------------------------------
p_abs:		tm	R4, #80h	; Y Test Vorzeichen Bit	7
		jr	Z, p_let	; X := Y
p_abs1:		clr	R2		; X := 0
		clr	R3
		jr	p_minus		; X := X - Y
p_abs2:		or	byte_80F, #80h
p_abs3:		or	byte_80E, #80h
		ret
sub_9E:		ld	R8, R2
		xor	R8, R4
		ld	R9, #2
loc_A4:		ld	R6, R2
		ld	R7, R3
		call	p_abs		; ABS[parameter] absoluter Betrag
		ld	R4, R6
		ld	R5, R7
		djnz	R9, loc_A4
		ld	R6, R2
		ld	R7, R3
		clr	R2
		clr	R3
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_mult:		call	sub_9E
		ld	R11, #0Fh
p_mult1:	sra	R6
		rrc	R7
		jr	NC, p_mult2
		add	R3, R5
		adc	R2, R4
		jr	OV, p_abs2
p_mult2:	rlc	R5
		rlc	R4
		jr	NOV, p_mult3
		or	R6, R7
		jr	NZ, p_abs2
p_mult3:	djnz	R11, p_mult1
p_mult4:	ld	R4, R2
		ld	R5, R3
		rlc	R8
		jr	C, p_abs1
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_div:		call	sub_9E
		ld	R9, #10h
		rcf
		clr	R10
		clr	R11
p_div1:		rlc	R7
		rlc	R6
		rlc	R11
		rlc	R10
		jr	C, p_div2
		cp	R4, R10
		jr	UGT, p_div3
		jr	C, p_div2
		cp	R5, R11
		jr	UGT, p_div3
p_div2:		sub	R11, R5
		sbc	R10, R4
		scf
p_div3:		djnz	R9, p_div1
		ld	R9, R4
		or	R9, R5
		jr	Z, loc_115
		rlc	R7
		rlc	R6
sub_10F:	ld	R2, R6
		ld	R3, R7
		jr	p_mult4
loc_115:	call	sub_10F
		or	byte_80E, #40h
loc_11B:	or	byte_80F, #-80h
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_mod:		call	p_div
		ld	R8, R2
		ld	R2, R10
		ld	R3, R11
		jr	p_mult4
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_or:		or	R2, R4		; X := X OR Y
		or	R3, R5
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_and:		and	R2, R4		; X := X AND Y
		and	R3, R5
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_xor:		xor	R2, R4		; X := X XOR Y
		xor	R3, R5
		ret
;-----------------------------------------------------------------------------
; X := NOT Y
;-----------------------------------------------------------------------------
p_not:		call	p_let		; NOT[parameter] bitweise logische Negation
		com	R2		; X := NOT X
		com	R3
		ret
sub_141:	and	byte_80F, #8Fh
		cp	R2, R4
		jr	Z, loc_152
		ld	R7, #20h
		jr	GT, loc_14E
loc_14C:	ld	R7, #10h
loc_14E:	or	byte_80F, R7
		ret
loc_152:	ld	R7, #40h
		cp	R3, R5
		jr	Z, loc_14E
		ld	R7, #20h
		jr	UGT, loc_14E
		jr	loc_14C
sub_15E:	ld	R8, R3
		ld	R7, R3
		ld	R6, R2
		ld	R5, R2
		swap	R5
		swap	R7
		ld	R4, #25h
		ld	R10, #4
loc_16E:	ld	R11, #15h
loc_170:	and	@R11, #0Fh
		add	@R11, #30h
		cp	@R11, #3Ah
		jr	C, loc_17E
		add	@R11, #7
loc_17E:	inc	R11
		djnz	R10, loc_170
		ret
sub_182:	ld	R4, R2
		ld	R5, R3
		call	p_abs		; ABS[parameter] absoluter Betrag
		rlc	R4
		ld	R4, #20h
		jr	NC, loc_191
		ld	R4, #2Dh
loc_191:	ld	R11, #6
		ld	R10, #15h
loc_195:	clr	@R10
		inc	R10
		djnz	R11, loc_195
		ld	R11, #0Fh
loc_19C:	sra	R2
		rrc	R3
		jr	NC, loc_1AE
		add	R7, R10
		da	R7
		adc	R6, R9
		da	R6
		adc	R5, R8
		da	R5
loc_1AE:	add	R10, R10
		da	R10
		adc	R9, R9
		da	R9
		adc	R8, R8
		da	R8
		djnz	R11, loc_19C
		ld	R8, R7
		ld	R9, R7
		ld	R7, R6
		swap	R6
		swap	R8
		ld	R10, #5
		jr	loc_16E
sub_1CA:	swap	@R13
		ld	R14, #4
loc_1CE:	rlc	@R13
		rlc	R5
		rlc	R4
		rlc	R3
		djnz	R14, loc_1CE
		ret
sub_1D9:	ld	R13, #16h
		clr	R4
		clr	R5
		cp	R6, #25h
		jr	NZ, loc_20B
		ld	R12, #5
loc_1E6:	inc	R13
		sub	@R13, #30h
		jr	C, loc_205
		cp	@R13, #0Ah
		jr	C, loc_1FE
		sub	@R13, #11h
		jr	C, loc_205
		add	@R13, #0Ah
		cp	@R13, #10h
		jr	NC, loc_205
loc_1FE:	call	sub_1CA
		djnz	R12, loc_1E6
loc_203:	rcf
		ret
loc_205:	cp	R12, #5
		jr	Z, loc_203
		ret
loc_20B:	ld	R12, #6
		clr	R2
		clr	R3
		cp	R6, #2Dh
		jr	NZ, loc_218
		inc	R2
loc_217:	inc	R13
loc_218:	sub	@R13, #30h
		jr	C, loc_229
		cp	@R13, #0Ah
		jr	NC, loc_229
		call	sub_1CA
		djnz	R12, loc_217
loc_227:	rcf
		ret
loc_229:	cp	R12, #6
		jr	Z, loc_227
		cp	R3, #4
		jr	NC, loc_227
		clr	R6
		clr	R7
		ld	R11, #13h
		ld	R8, #27h
		ld	R9, #10h
		call	sub_271
		inc	R11
		ld	R8, #3
		ld	R9, #0E8h
		call	sub_26F
		ld	R8, #0
		ld	R9, #64h
		call	sub_26F
		inc	R11
		ld	R9, #0Ah
		call	sub_26F
		ld	R9, #1
		call	sub_26F
		ld	R4, R6
		ld	R5, R7
		rlc	R6
		jr	C, loc_227
		rrc	R2
		jr	NC, loc_27E
		call	p_abs1
		ld	R4, R2
		ld	R5, R3
		jr	loc_27E
sub_26F:	swap	@R11
sub_271:	ld	R10, @R11
		and	R10, #0Fh
		jr	Z, loc_27E
loc_278:	add	R7, R9
		adc	R6, R8
		djnz	R10, loc_278
loc_27E:	scf
		ret
sub_280:	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
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_setrr:	call	sub_280		; SETRR	[register,wert]	Doppelregister setzen
		ld	@R7, R4		; X (hi) := wert
		inc	R7
		jr	p_setr1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_setr:		call	sub_280		; SETR [register,wert] Register	setzen
p_setr1:	ld	@R7, R5		; X (lo) := wert
		jp	@RR2		; zurück zum Interpreter
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_setew:	call	sub_280		; SETEW	[adresse,wert] externes	Wort setzen
		lde	@RR6, R4
		incw	RR6
		jr	p_seteb1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_seteb:	call	sub_280		; SETEB	[adresse,wert] externes	Byte setzen
p_seteb1:	lde	@RR6, R5
		jp	@RR2
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_getrr:	ld	R2, @R5		; GETRR	[register] liefert Inhalt des Doppelregisters
		inc	R5
		db	0Dh 		; JP FALSE mit nächstem	Befehl
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_getr:		clr	R2		; GETR [register] liefert Inhalt des Registers
		ld	R3, @R5
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_getew:	lde	R2, @RR4	; GETEW	[register] holt	Wortwert aus externem Speicher
		incw	RR4
		db	0Dh 		; JP FALSE mit nächstem	Befehl
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_geteb:	clr	R2		; GETEB	[register] holt	Bytewert aus externem Speicher
		lde	R3, @RR4
		ret
sub_2C0:	call	sub_2C8
		ld	R5, #20h
		call	put_char	; PUT_CHAR
sub_2C8:	ld	R5, #8
		jp	put_char	; PUT_CHAR
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_rl:		rcf			; RL[x]	x links	rotieren
		rlc	R5
		rlc	R4
		adc	R5, #0
p_rl1:		jp	p_let		; X := Y
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_rr:		rcf			; RR[x]	x rechts rotieren
		rrc	R4
		rrc	R5
		jr	NC, p_rl1
		or	R4, #-80h
		jr	p_rl1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
p_input:	ld	R5, #3Fh	; INPUT	Zahleneingabe vom Terminal
		call	put_char	; PUT_CHAR
p_input1:	ld	R15, #15h
p_input2:	inc	R15
		cp	R15, #1Fh
		jr	Z, p_input4
p_input3:	call	get_char	; GET_CHAR
		ld	@R15, R3
		cp	R3, #0Dh
		jr	Z, p_input4
		cp	R3, #8
		jr	NZ, p_input5
		ld	R5, #20h
		call	put_char	; PUT_CHAR
		dec	R15
		cp	R15, #15h
		jr	Z, p_input2
		call	sub_2C8
		jr	p_input3
p_input4:	call	sub_1D9
		jr	NC, p_input	; INPUT	Zahleneingabe vom Terminal
		jp	p_let		; X := Y
p_input5:	inc	R3
		jr	PL, p_input2
p_input6:	cp	R15, #16h
		jr	Z, p_input1
		call	sub_2C0
		dec	R15
		jr	p_input6
;-----------------------------------------------------------------------------
; Liste	der internen Prozeduren
;-----------------------------------------------------------------------------
tab_prc:	db	3,"NOT"
		dw	p_not		; NOT[parameter] bitweise logische Negation
		db	3,"ABS"
		dw	p_abs		; ABS[parameter] absoluter Betrag
		db	5,"SETRR"
		dw	p_setrr		; SETRR	[register,wert]	Doppelregister setzen
		db	4,"SETR"
		dw	p_setr		; SETR [register,wert] Register	setzen
		db	5,"SETEW"
		dw	p_setew		; SETEW	[adresse,wert] externes	Wort setzen
		db	5,"SETEB"
		dw	p_seteb		; SETEB	[adresse,wert] externes	Byte setzen
		db	5,"GETRR"
		dw	p_getrr		; GETRR	[register] liefert Inhalt des Doppelregisters
		db	4,"GETR"
		dw	p_getr		; GETR [register] liefert Inhalt des Registers
		db	5,"GETEW"
		dw	p_getew		; GETEW	[register] holt	Wortwert aus externem Speicher
		db	5,"GETEB"
		dw	p_geteb		; GETEB	[register] holt	Bytewert aus externem Speicher
		db	2,"RL"
		dw	p_rl		; RL[x]	x links	rotieren
		db	2,"RR"
		dw	p_rr		; RR[x]	x rechts rotieren
		db	5,"INPUT"
		dw	p_input		; INPUT	Zahleneingabe vom Terminal
		db	3,"GTC"
		dw	815h		; Get Char extern !
		db	3,"PTC"
		dw	818h		; Put Char extern !
		db	0FFh		; Listenende
sub_391:	ld	R15, #16h
		ldc	R6, @RR0
		incw	RR0
		cp	R6, R7
		ret
sub_39A:	ld	R10, #3		; HI(tab_op)
		ld	R11, #0C1h	; LO(tab_op)
		ld	R13, #3
		call	sub_3AF
		jr	Z, locret_3C0
		cp	R6, #24h
		jr	NZ, locret_3C0
		call	sub_391
		ld	R13, #3
sub_3AF:	call	sub_3B6
		jr	Z, locret_3C0
		djnz	R13, sub_3AF
sub_3B6:	ld	R12, #17h
		ldci	@R12, @RR10
		ldci	@R12, @RR10
		ldci	@R12, @RR10
		cp	R6, R7
locret_3C0:	ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
tab_op:		db	2Bh ; +
		dw	p_plus		; X := X + Y
		db	2Dh ; -
		dw	p_minus		; X := X - Y
		db	2Ah ; *
		dw	p_mult
		db	2Fh ; /
		dw	p_div
		db	41h ; A
		dw	p_and		; X := X AND Y
		db	4Fh ; O
		dw	p_or		; X := X OR Y
		db	58h ; X
		dw	p_xor		; X := X XOR Y
		db	4Dh ; M
		dw	p_mod
loc_3D9:	cp	@R15, #41h	; 'A'
		jr	C, loc_3F0
		cp	@R15, #5Bh	; 'Z'+1
		ret
sub_3E2:	call	loc_3D9
		jr	C, locret_3EF
loc_3E7:	cp	@R15, #30h	; '0'
		jr	C, loc_3F0
		cp	@R15, #3Ah	; '9'+1
locret_3EF:	ret
loc_3F0:	rcf
		ret
loc_3F2:	call	loc_3E7
		jr	C, locret_3EF
		cp	@R15, #41h	; 'A'
		jr	C, loc_3F0
		cp	@R15, #47h	; 'F'+1
		ret
sub_400:	ld	R2, #3		; HI(tab_prc)
		ld	R3, #28h	; LO(tab_prc)
		call	sub_412
		jr	C, locret_41E
		clr	R2
		or	R2, byte_808
		jr	Z, loc_41D
		ld	R3, byte_809
sub_412:	ld	R4, R0
		ld	R5, R1
loc_416:	ldc	R8, @RR2
		cp	R8, #0FFh
		jr	NZ, loc_41F
loc_41D:	rcf
locret_41E:	ret
loc_41F:	incw	RR2
		ldc	R7, @RR2
		call	sub_391
		jr	NZ, loc_43C
		djnz	R8, loc_41F
		ldc	R6, @RR0
		call	sub_3E2
		jr	C, loc_43B
		incw	RR2
		ldc	R8, @RR2
		incw	RR2
		ldc	R9, @RR2
		scf
		ret
loc_43B:	inc	R8
loc_43C:	inc	R8
		inc	R8
		add	R3, R8
		adc	R2, #0
		ld	R0, R4
		ld	R1, R5
		jr	loc_416
loc_449:	decw	RR0
sub_44B:	call	sub_400
		ldc	R10, @RR0
		cp	R10, #5Bh
		jr	NZ, loc_46F
		incw	RR0
loc_457:	push	R8
		push	R9
		call	sub_4C7
		pop	R9
		pop	R8
		ld	R7, #5Dh
		call	sub_391
		jr	Z, loc_46F
		push	R3
		push	R2
		jr	loc_457
loc_46F:	ld	R4, R2
		ld	R5, R3
		call	@RR8
		srp	#10h
		scf
		ret
loc_479:	call	loc_3D9
		jr	NC, loc_495
		ldc	R7, @RR0
		inc	R15
		call	sub_3E2
		jr	C, loc_449
		sub	R6, #41h
		rl	R6
		add	R6, #20h
		ld	R2, @R6
		inc	R6
		ld	R3, @R6
		scf
		ret
loc_495:	cp	@R15, #3Bh
		jr	Z, locret_4B3
		cp	@R15, #0Dh
		jr	Z, locret_4B3
		inc	R15
loc_4A0:	ldci	@R15, @RR0
		dec	R15
		call	loc_3F2
		inc	R15
		jr	C, loc_4A0
		decw	RR0
		call	sub_1D9
		ld	R2, R4
		ld	R3, R5
locret_4B3:	ret
sub_4B4:	ld	R7, #28h
		call	sub_391
		jr	NZ, loc_479
		call	sub_4C7
		jr	NC, locret_4C6
		ld	R7, #29h
		call	sub_391
		ccf
locret_4C6:	ret
sub_4C7:	call	sub_4B4
		jr	NC, loc_4D5
loc_4CC:	call	sub_391
		call	sub_39A
		jr	Z, loc_4D8
		scf
loc_4D5:	decw	RR0
		ret
loc_4D8:	push	R8
		push	R9
		push	R2
		push	R3
		call	sub_4B4
		ld	R4, R2
		ld	R5, R3
		pop	R3
		pop	R2
		pop	R9
		pop	R8
		call	@RR8
		jr	loc_4CC
sub_4F3:	call	sub_391
		sub	R6, #41h
		add	R6, R6
		ld	R8, #20h
		add	R8, R6
		ret
sub_500:	ldc	R4, @RR0
		decw	RR0
		tm	R4, #80h
		jr	Z, sub_500
		incw	RR0
		and	R4, #7Fh
		cp	R0, byte_806
		jr	NZ, loc_519
		cp	R1, byte_807
		scf
		jr	Z, loc_528
loc_519:	decw	RR0
		ldc	R5, @RR0
		incw	RR0
		cp	R5, #0Dh
		jr	Z, loc_528
		decw	RR0
		jr	sub_500
loc_528:	incw	RR0
		ldc	R5, @RR0
		decw	RR0
		ret
sub_52F:	ld	R7, #22h
		call	sub_391
		jr	NZ, loc_542
loc_536:	call	sub_391
		jr	Z, locret_544
		ld	R5, R6
		call	put_char	; PUT_CHAR
		jr	loc_536
loc_542:	decw	RR0
locret_544:	ret
sub_545:	call	sub_4C7
		clr	R10
		ld	R9, #2
loc_54C:	ld	R8, #10h
		ldc	R6, @RR0
		cp	R6, #3Ch
		jr	Z, loc_563
		rl	R8
		cp	R6, #3Eh
		jr	Z, loc_563
		rl	R8
		cp	R6, #3Dh
		jr	NZ, loc_569
loc_563:	or	R10, R8
		incw	RR0
		djnz	R9, loc_54C
loc_569:	push	R10
		push	R2
		push	R3
		call	sub_4C7
		ld	R4, R2
		ld	R5, R3
		pop	R3
		pop	R2
		call	sub_141
		pop	R8
		and	R8, byte_80F
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_REM:		ld	R7, #3Bh
c_REM1:		call	sub_391
		jr	Z, c_REM2
		cp	R6, #0Dh
		scf
		jr	NZ, c_REM1
c_REM2:		decw	RR0
c_REM3:		ret
sub_593:	call	c_REM
		jr	C, c_REM3
		incw	RR0
		jr	sub_593
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_LET:		call	sub_4F3
		push	R8
		incw	RR0
		call	sub_4C7
		pop	R8
c_LET1:		ld	@R8, R2
		inc	R8
		ld	@R8, R3
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_TRAP:		ld	byte_804, R0
		ld	byte_805, R1
c_TRAP1:	jr	c_REM
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_PROC:		push	byte_804
		push	byte_805
		ld	byte_804, R0
		ld	byte_805, R1
		ldc	R6, @RR0
		cp	R6, #5Bh
		jr	NZ, c_PROC3
		incw	RR0
		clr	R8
		ld	R7, #5Dh
c_PROC1:	incw	RR0
		call	sub_391
		jr	Z, c_PROC2
		push	R8
		push	R8
		jr	c_PROC1
c_PROC2:	incw	RR0
c_PROC3:	call	sub_44B
		ld	R0, byte_804
		ld	R1, byte_805
		ld	R7, #5Bh
		call	sub_391
		jr	NZ, c_PROC6
		ld	R7, #5Dh
c_PROC4:	call	sub_4F3
		call	sub_391
		jr	Z, c_PROC5
		pop	R10
		ld	@R8, R10
		pop	R10
		inc	R8
		ld	@R8, R10
		jr	c_PROC4
c_PROC5:	call	c_LET1
c_PROC6:	pop	byte_805
		pop	byte_804
		jr	c_TRAP1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_GOTO:	call	sub_4C7
		call	sub_500
		call	sub_141
		tm	byte_80F, #50h
		jr	NZ, loc_631
loc_612:	call	sub_593
		incw	RR0
		ldc	R4, @RR0
		incw	RR0
		ldc	R5, @RR0
		decw	RR0
		rl	R4
		rcf
		rrc	R4
		jr	NC, loc_62E
		call	sub_141
		tm	byte_80F, #50h
		jr	Z, loc_612
loc_62E:	decw	RR0
		ret
loc_631:	call	sub_500
		jr	NC, loc_63D
		incw	gpr		; General purpose register
		incw	gpr		; General purpose register
		jp	loc_73E
loc_63D:	call	sub_141
		tm	byte_80F, #60h
		jr	NZ, loc_62E
		decw	RR0
		jr	loc_631
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_IF:		and	byte_80F, #0FEh
		call	sub_545
		jr	NZ, locret_656
		inc	byte_80F
		jp	sub_593
locret_656:	ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_ELSE:		tm	byte_80F, #1
		jp	Z, sub_593
		and	byte_80F, #0FEh
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_RETURN:	cp	byte_80E, #0
		jr	NZ, c_RETURN2
		or	byte_80E, #20h
c_RETURN1:	jp	loc_11B
c_RETURN2:	dec	byte_80E
		pop	R6
		pop	R7
		pop	R0
		pop	R1
		and	byte_80F, #0FEh
		jp	@RR6
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_GOSUB:	ld	R8, R0
		ld	R9, R1
		call	c_REM
		pop	R10
		pop	R11
		push	R1
		push	R0
		push	R11
		push	R10
		ld	R0, R8
		ld	R1, R9
c_GOSUB1:	inc	byte_80E
		tm	byte_80E, #10h
		jp	Z, c_GOTO
		call	c_REM
		jr	c_RETURN1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_WAIT:		call	sub_4C7
		ld	R6, R2
		or	R6, R3
		jr	Z, c_WAIT3
c_WAIT1:	da	R6
		ld	R6, #0
		ld	R7, #0B4h
c_WAIT2:	decw	RR6
		jp	NZ, c_WAIT2
		decw	RR2
		jp	NZ, c_WAIT1
c_WAIT3:	ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_CALL:		call	sub_4C7
		call	@RR2
		srp	#10h
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_STOP:		or	byte_80F, #8
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_END:		or	byte_80F, #2
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_CLRTRAP:	clr	byte_804
		clr	byte_805
		ret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_PRINTHEX:	call	sub_52F
		call	sub_4C7
		jr	NC, c_PRINT3
		call	sub_15E
		ld	R10, #5
		jr	c_PRINT1
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_PRINT:	call	sub_52F
		call	sub_4C7
		jr	NC, c_PRINT3
		call	sub_182
		ld	R10, #6
c_PRINT1:	ld	R11, #14h
c_PRINT2:	push	R5
		ld	R5, @R11
		inc	R11
		call	put_char	; PUT_CHAR
		pop	R5
		djnz	R10, c_PRINT2
c_PRINT3:	ldc	R6, @RR0
		cp	R6, #2Ch
		jr	NZ, c_PRINT5
		incw	RR0
		ldc	R6, @RR0
		cp	R6, #3Bh
		jr	Z, c_PRINT4
		cp	R6, #0Dh
		jr	Z, c_PRINT4
		decw	RR0
c_PRINT4:	ret
c_PRINT5:	ld	R5, #0Dh
		jp	put_char	; PUT_CHAR
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
c_INPUT:	call	sub_52F
		call	p_input1
		call	sub_4F3
		jp	c_LET1
		ld	byte_80F, #4
		jr	loc_736
		ld	byte_80F, #8
		jr	loc_736
loc_72B:	clr	byte_80F
		clr	byte_80E
		ld	R0, byte_806
		ld	R1, byte_807
		call	c_CLRTRAP
loc_736:	srp	#10h
		pop	word_80A
		pop	word_80A+1
		jr	loc_748
loc_73E:	tm	byte_80F, #0Ah
		jr	NZ, loc_74D
		tcm	byte_80F, #-7Ch
		jr	Z, loc_74D
loc_748:	ldc	R6, @RR0
		inc	R6
		djnz	R6, loc_74F
loc_74D:	jp	@word_80A
loc_74F:	cp	byte_806, R0
		jr	NZ, loc_759
		cp	byte_807, R1
		jr	Z, loc_785
loc_759:	ld	R6, byte_804
		or	R6, byte_805
		jr	Z, loc_785
		push	R1
		push	R0
		ld	R0, byte_804
		ld	R1, byte_805
		call	sub_545
		jr	Z, loc_781
		call	c_CLRTRAP
		pop	R6
		pop	R7
		decw	RR6
		push	R7
		push	R6
		incw	RR0
		call	c_GOSUB1
		jr	loc_7B9
loc_781:	pop	R0
		pop	R1
loc_785:	incw	RR0
		incw	RR0
loc_789:	ldc	R3, @RR0
		incw	RR0
		cp	R3, #3Eh
		jr	Z, loc_795
		and	byte_80F, #0FEh
loc_795:	ld	R6, #7		; HI(tab_kdo)
		ld	R7, #0C8h	; LO(tab_kdo)
		clr	R2
loc_79B:	ldc	R8, @RR6
		cp	R8, R3
		jr	Z, loc_7A6
		incw	RR6
		inc	R2
		jr	loc_79B
loc_7A6:	add	R2, R2
		ld	R6, #7		; HI(tab_kdo2)
		ld	R7, #0D9h	; LO(tab_kdo2)
		add	R7, R2
		adc	R6, #0
		ld	R2, #0Ch
		ldci	@R2, @RR6
		ldci	@R2, @RR6
loc_7B7:	call	@word_80C
loc_7B9:	ld	R7, #0Dh
		call	sub_391
		jp	Z, loc_73E
		cp	R6, #3Bh
		jr	Z, loc_789
		jr	loc_7B7
;-----------------------------------------------------------------------------
; Tabelle der BASIC-Kommandos
;-----------------------------------------------------------------------------
tab_kdo:	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
tab_kdo2:	dw	c_LET
		dw	c_PROC
		dw	c_GOTO
		dw	c_IF
		dw	c_ELSE
		dw	c_RETURN
		dw	c_GOSUB
		dw	c_WAIT
		dw	c_REM
		dw	c_CALL
		dw	c_STOP
		dw	c_END
		dw	c_TRAP
		dw	c_CLRTRAP
		dw	c_PRINT
		dw	c_PRINTHEX
		dw	c_INPUT
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
		db	0FFh
		db	0FFh
; Eintrittspunkt BASIC-Interpreter
;		jp	loc_72B
; end of 'ROM2'


;-----------------------------------------------------------------------------
; Einsprungadressen
;-----------------------------------------------------------------------------
	org 1000h
		jp 1800h		; IRQ 0
		jp 1800h		; IRQ 1
		jp 1800h		; IRQ 2
		jp 1800h		; IRQ 3
		jp 1800h		; IRQ 4
		jp 1800h		; IRQ 5
		jp begin		; Monitor
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
IRQ_dummy	iret
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
; Einsprungziele für den U883
get_char:	nop
put_char:	ld 5Ah, 15h		; Ausgabe des in %5A übergebenen ASCII auf dem Bildschirm
;		jr ZBS			; mit %5B als Pointer
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
begin:		srp #0F0h		; SFR-Page
	assume RP:0F0h
		ld SPL, #0		; Stackpointer auf %FE00
		ld SPH, #0FEh
		jr begin		; Totmann schleife
;-----------------------------------------------------------------------------
; 
;-----------------------------------------------------------------------------
	end

