;_____________________________________________________________________________
;
; Read LSI-11 MicROMs
;
;_____________________________________________________________________________
;
		.title	lsirom            	;
		.list	meb			;
						;
		R0	= %0			;
		R1	= %1			;
		R2	= %2			;
		R3	= %3			;
		R4	= %4			;
		R5	= %5			;
		SP	= %6			;
		PC	= %7			;
						;
		RXCSR	= 177560		;
		RXDAT	= 177562		;
		TXCSR	= 177564		;
		TXDAT	= 177566		;
						;
		TXSIZE	= 128.			;
		RXSIZE	= 16.			;
						;
		LSIADR  = 177600		;
		LSICSR  = 177602		;
;_____________________________________________________________________________
;
		.macro	.print	ARG		;
		mov	R0,-(SP)		;
		mov	ARG, R0			;
		jsr	PC, print		;
		mov	(SP)+,R0		;
		.endm				;
						;
;_____________________________________________________________________________
;
		.macro	vect, offset, adr, val	;
		. 	= offset		;
.if 	nb, <adr>				;
		.word	adr			;
.iff						;
		.word	.+2			;
.endc 						;
.if	nb, <val>				;
		.word	val			;
.iff            				;
		.word	340			;
.endc						;
		.endm				;
;_____________________________________________________________________________
;
		.asect      			;
		. = 0				;
						; вектор начального пуска
		vect	0, entry		; для процессора 1801ВМ2
;_____________________________________________________________________________
;
		vect	4 			; ловушка прерываний 4-376
		vect	10			;
		vect	14			;
		vect	20			;
		vect	24			;
		vect	30			;
		vect	34			;
		vect	40			;
		vect	44			;
		vect	50			;
		vect	54			;
		vect	60, isrrx		; rx console
		vect	64, isrtx		; tx console
		vect	70			;
		vect	74			;
		vect	100, isr50		;
		vect	104			;
		vect	110			;
		vect	114			;
		vect	120			;
		vect	124			;
		vect	130			;
		vect	134			;
		vect	140			;
		vect	144			;
		vect	150			;
		vect	154			;
		vect	160			;
		vect	164			;
		vect	170			;
		vect	174			;
		vect	200			;
		vect	204			;
		vect	210			;
		vect	214			;
		vect	220			;
		vect	224			;
		vect	230			;
		vect	234			;
		vect	240			;
		vect	244			;
		vect	250			;
		vect	254			;
		vect	260			;
		vect	264			;
		vect	270			;
		vect	274			;
		vect	300			;
		vect	304			;
		vect	310			;
		vect	314			;
		vect	320			;
		vect	324			;
		vect	330			;
		vect	334			;
		vect	340			;
		vect	344			;
		vect	350			;
		vect	354			;
		vect	360			;
		vect	364			;
		vect	370			;
		vect	374			;
;_____________________________________________________________________________
;
		.rept	100.			;
		.word	0			;
		.endr				;
$stack		=.				;
						;
$ticks:		.word	0, 0			;
						;
$txbeg:		.word	0			;
$txend:		.word	0			;
$txbuf:		.blkb	TXSIZE			;
		.even				;
		         			;
$rxbeg:		.word	0			;
$rxend:		.word	0			;
$rxbuf:		.blkb	RXSIZE			;
		.even				;
;_____________________________________________________________________________
;
isr50:		inc	$ticks			; 32-bit ticks counter
		beq	1$			;	
		rti				;
1$:		inc	$ticks+2		;
		rti				;
						;
;_____________________________________________________________________________
;
isrrx:		mov	R0, -(SP)		;
		mov	$rxbeg, R0		;
		movb	@#RXDAT, (R0)+		;
		cmp	R0, #$rxbuf+RXSIZE	;
		blo	1$			;
		mov	#$rxbuf, R0		;
1$:		mov	R0, $rxbeg		;
		mov	(SP)+, R0		;
		rti				;
						;
inkey:		mov	R1, -(SP)		;
		mov	$rxend, R1		;
		mov	$rxbeg, R0		;
		sub	R1, R0			;
		bne	1$			;
		mov	(SP)+, R1		;
		sec				;
		rts	PC			;
		             			;
1$:		movb	(R1)+, R0		;
		cmp	R1, #$rxbuf+RXSIZE	;
		blo	2$			;
		mov	#$rxbuf, R1		;
2$:		mov	R1, $rxend		;
		mov	(SP)+, R1		;
		clc				;
		rts	PC			;	
						;
getch:		jsr	PC, inkey		;
		bcs	getch			;
		rts	PC			;	
						;
;_____________________________________________________________________________
;
isrtx:		mov	R0, -(SP)		;
		mov	$txend, R0		;
		cmp	R0, $txbeg		;
		bne	1$			;
		bic	#100, @#TXCSR		;
		mov	(SP)+, R0		;
		rti				;
						;
1$:		movb	(R0)+, @#TXDAT		;
		cmp	R0, #$txbuf+TXSIZE	;
		blo	2$			;
		mov	#$txbuf, R0		;
2$:		mov	R0, $txend		;
		mov	(SP)+, R0		;
		rti				;
						;		
putch:						;
;		tstb	@#TXCSR			;
;		bpl	putch			;
;		movb	R0, @#TXDAT		;
;		rts	PC			;
;						;
		mov	R1, -(SP)		;
		mov	$txbeg, R1		;
		movb	R0, (R1)+		;
		cmp	R1, #$txbuf+TXSIZE	;
		blo	1$			;
		mov	#$txbuf, R1		;
1$:		cmp	R1, $txend		;
		beq	1$			;
		mov	R1, $txbeg		;
		bis	#100, @#TXCSR		;
		mov	(SP)+, R1		;
		rts	PC			;
						;
flush:		cmp	$txbeg, $txend		;
		bne	flush			;
		rts	PC			;
		                		;
print:		mov	R1, -(SP)		;
		mov	R0, R1			;
1$:		movb	(R1)+, R0		;
		beq	2$			;
		jsr	PC, putch		;
		br	1$			;
2$:		mov	(SP)+, R1		;
		rts	PC			;
						;
outhex:		mov	R1, -(SP)		;
		mov	R0, -(SP)		;
						;
		bic	#177760, R0		;
		movb	1$(R0), R1		;
		mov	(SP), R0		;
		asr	R0			;
		asr	R0			;
		asr	R0			;
		asr	R0			;
		bic	#177760, R0		;
		movb	1$(R0), R0		;
		swab	R0			;
		bis	R0, R1			;
		mov	R1, @#177714		;
						;
		mov	(SP), R0		;
		swab	R0			;
		bic	#177760, R0		;
		movb	1$(R0), R1		;
		movb	1(SP), R0		;
		asr	R0			;
		asr	R0			;
		asr	R0			;
		asr	R0			;
		bic	#177760, R0		;
		movb	1$(R0), R0		;
		swab	R0			;
		bis	R0, R1			;
		mov	R1, @#177715		;
						;
		mov	(SP)+, R0		;
		mov	(SP)+, R1		;
		rts	PC			;
						;
1$:		.byte	077, 006, 133, 117	;
		.byte	146, 155, 175, 007	;
		.byte	177, 157, 167, 174	;
		.byte	071, 136, 171, 161	;
						;
;_____________________________________________________________________________
;
printx:		mov	R5, -(SP)		;
		mov	R1, -(SP)		;
		mov	R0, -(SP)		;
		bic	#177760, R0		;
		add 	#'0, R0			;
		cmp	R0, #'9			;
		blos	1$			;
		add	#'A-'0-10., R0		;
1$:		jsr	PC, putch		;
		mov	(SP)+, R0		;
		mov	(SP)+, R1		;
		mov	(SP)+, R5		;
		rts	PC			;
;_____________________________________________________________________________
;
print5:		mov	R3, -(SP)		;
		mov	R2, -(SP)		;
		mov	R0, R2			;
						;
		mov 	#10000., R3		;
		jsr	PC, 1$			;
		mov 	#1000., R3		;
		jsr	PC, 1$			;
	        mov	#100., R3		;
		jsr	PC, 1$			;
		mov	#10., R3		;
		jsr	PC, 1$			;
		mov 	R2, R0			;
		jsr	PC, 3$			;
						;
		mov	(SP)+, R2		;
		mov	(SP)+, R3		;
		rts	PC			;
						;
1$:		mov	#-1, R0			;
2$:		inc 	R0			;
		sub 	R3, R2			;
		bcc 	2$			;
		add	R3, R2			;
3$:		add 	#'0, R0			;
   		jmp	putch			;
;_____________________________________________________________________________
;
tmout:		add	$ticks, R0		;
1$:		cmp	$ticks, R0		;
		bne	1$			;
		rts	PC			;
;_____________________________________________________________________________
;
entry:		mov	#$stack, SP		;
		mov	#$rxbuf, $rxend		;
		mov	#$rxbuf, $rxbeg		;
		mov	#$txbuf, $txend		;
		mov	#$txbuf, $txbeg		;
						;
		mov	#14021, R0		; '1811' logo
		jsr	PC, outhex		;
						;
		mov	#100, @#RXCSR		;
		mov     #000, @#TXCSR		;
		clr	R0			;
		mtps	R0			;
;_____________________________________________________________________________
;
start:		.print	#mes1			;
1$:		jsr	PC, getch		;
		cmp	R0, #'0			;
		bne	2$			;
		jsr	PC, lsread		;
		br	start			;
2$:		jsr	PC, putch		;
		br	1$			;
;_____________________________________________________________________________
;
lsread:		mov	#40000, @#LSICSR	; enable +12V
		.print	#mes2			;
		mov	#25., R0		;
		call	tmout			;
		mov	#140000, @#LSICSR	; enable OE
		.print	#mes3			;
						;
		clr	R5			;
		mov	#32., R2		;
5$:		jsr	PC, get22		; dummy read
		sob	R2, 5$			;
						;
1$:		mov	R5, R0			;
		jsr	PC, outhex		;
		jsr	PC, get22		;
		bcc	2$			;
		.print	#mes5			;
		rts	PC			;
						;
2$:		jsr	PC, out22		;
		inc	R5			;
		cmp	R5, #4000		;
		blo	1$			;
		mov	#0, @#LSICSR		; disable all
		.print	#mes4			;
		mov	#10., R0		;
		call	tmout			;
		rts	PC			;
;_____________________________________________________________________________
;
out21:		mov	R0, -(SP)		;
		ror	R0			;
		ror	R0			;
		ror	R0			;
		ror	R0			;
		jsr	PC, printx		;
		mov	(SP)+, R0		;
		jmp	printx			;
						;
out22:		mov	R0, R2			;
		mov	R5, R0			;
		swab	R0			;
		jsr	PC, printx		;
		mov	R5, R0			;
		jsr	PC, out21		;
		mov	#':, R0			;
		jsr	PC, putch		;
		mov	#32., R0		;
		jsr	PC, putch		;
						;
		mov	R1, R0			;
		jsr	PC, out21		;
		mov	R2, R0			;
		swab	R0			;
		jsr	PC, out21		;
		mov	R2, R0			;
		jsr	PC, out21		;
		.print	#eol			;
		rts	PC			;
;_____________________________________________________________________________
;
get22:	
;		mov	R5, R0			;
;		com	R0			;
;		mov	R5, R1			;
;		add	#5, R1			;
;		rts	PC			;
;
		mov	R5, @#LSIADR		; write address
1$:		tstb	@#LSICSR		; wait for completion
		bmi	2$			;
		jsr	PC, inkey		; check pressed keys
		bcs	1$			;
		sec				;
		rts	PC			;
						;
2$:		mov	@#LSIADR, R0		; read 22-bit
		mov	@#LSICSR, R1		; word from
		bic	#177700, R1		; registers
		clc				;
		rts	PC			;
;_____________________________________________________________________________
;
		.radix	8.
del: 		.asciz	<10><40><10>
eol: 		.asciz	<15><12>
mes1:		.asciz	<15><12>"Press zero to read MicROMs..."<12><15>
mes2: 		.asciz	<15><12>"Enable high voltage power.."
mes3: 		.asciz	<15><12>"Start MicROM reading.."<12><15>
mes4: 		.asciz	<15><12>"Disable high voltage power.."<12><15>
mes5: 		.asciz	<15><12>"Read interrupted by user"<12><15>

;_____________________________________________________________________________
;
		.even
		.end


