;Sept 2016 Herb Johnson
;Chuck Yakym's alternative Tiny BASIC cold-start, 
;to speed up discovery of RAM
;provided with permission 

	ORG	0
	INCL "1802reg.asm"	;R0-RF defined HRJ

;from Tiny BASIC
PZ	EQU	13	;register, BASIC PAGE 0 POINTER
AC	EQU	10	;register, MONITOR MEMORY POINTER
BS	EQU	 +13H	; BACKSPACE CHARACTER
CONST	EQU	001CH		;addr to addr of monitor
PAGE:	EQU  0800H		; WORKSPACE BEGINNING ADDRESS
STACK: EQU	+22H	; WORKSPACE, HIGHEST LOW-ORDER ADDRESS OF USER RAM

	ORG 00B0H		;cold location for RCA Tiny BASIC
;-----------------------------------------------;
;	COLD & WARM START INITIALIZATION	;
;-----------------------------------------------;
;
;
; DETERMINE SIZE OF USER RAM
COLD	LDI	HIGH CONST
	PHI  AC 	; GET LOW END ADDR.
	LDI  LOW CONST	;   OF USER PROGRAM
	PLO  AC 	;   RAM (AT "CONST")

;RC POINTS TO MEMORY THAT HOLDS THE START OF USER MEMORY

	INC	AC
	INC	AC
	INC	AC	; SET AC TO +3 OFFSET ADDRESS
			; NEEDED WHEN THE PARAMETERS ARE TRANSFERRED

;ADDED TO PRESERVE SIZE OF THIS PATCH
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

; FIND TOP OF MEMORY (NEW)
	LDI	0FFH	; LOAD D WITH FFH
	PHI	R2	; LOAD R2.1 WITH D
	PLO	R2	; LOAD R2.0 WITH D , R2 = FFFFH
SCAN	LDI	00H	; LOAD D WITH 00H
	STR	R2	; WRITE BYTE 00 INTO MEMORY POINTED TO BY R2
	LDN	R2	; READ BYTE INTO D POINTED TO BY R2
	BNZ	SCAN1	; IF NOT ZERO THEN GOTO THE NEXT LOWER PAGE OF MEMORY AND TEST AGAIN
			;  FOR RAM MEMORY
	LDI	0FFH	; LOAD D WITH FFH
	STR	R2	; WRITE BYTE FF INTO MEMORY POINTED TO BY R2
	LDN	R2	; READ BYTE INTO D POINTED TO BY R2
	SDI	0FFH	; SUBTRACT FFH FROM D
	BZ	SCAN2	; IF ZERO THEN TOP OF RAM MEMORY FOUND
SCAN1	GHI	R2	; PUT R2.1 INTO D
	ADI	0FFH	; SUBTRACT FFH FROM D
	PHI	R2	; SAVE BACK TO R2.1, R2 NOW POINTS TO THE NEXT LOWER MEMORY PAGE OF RAM
	BR	SCAN	; RAM MEMORY NOT FOUND YET
			; TOP OF MEMORY SAVED IN R2

SCAN2	SEX  PZ

;R2 = TOP OF MEMORY

	LDI	HIGH PAGE	; RAM SIZED: SET
	PHI  PZ 	;   POINTER PZ TO WORK AREA AT 256 BYTES UNDER THE USER DEFINED ADDRESS
	LDI  STACK+1	;   
	PLO  PZ
	GLO  R2 	; STORE RAM END ADDRESS
	STXD
	GHI  R2
	STXD		; GET & STORE RAM BEGINNIG
	DEC  AC 	; REPEAT TO COPY PARAMETERS..
	DEC  AC 	; - POINT TO NEXT
	LDN  AC 	; - GET PARAMETER
	STXD		; - STORE IN WORK AREA
	GLO  PZ
	XRI  BS-1	; - TEST FOR LAST PARAMETER
	BNZ  $-6	; - ..UNTIL LAST COPIED

	SHR		; SET DF=0 FOR "CLEAR"
	LSKP
;
; "WARM" Tiny BASIC code will follow below. 
;
	END