;
; RM65-2901 PROM Programmer Module Program ROM (R2926-11)
;
;	Reformatted for CA65 Assembler
;	Chris Oddy December 2025
;
	.setcpu "6502"
;
			; *** Zero Page ***
;	:= $0000	; used to store command routine address (LSB)
;	:= $0001	; used to store command routine address (MSB)
;	:= $0002	; ?
;	:= $0003	; ?
;	:= $0004	; ?
;	:= $0005	; ?
;	:= $0006	; ?
;	:= $0007	; ? Checksum MSB ?
;	:= $0008	; ? Checksum LSB ?
;	:= $0009	; ?
;	:= $000A	; set to zero at start-up
;	:= $000B	; set to zero at start-up
;	:= $000C	; set to zero at start-up
;	:= $000D	; set to zero at start-up
;	:= $000E	; ?
;	:= $000F	; ?
;	:= $0010	; ?
;	:= $0011	; ?
;	:= $0012	; ? PRCFGC ?
;	:= $0013	; ? PRCFGB ?
;	:= $0014	; ?
;	:= $0015	; ?
;	:= $0016	; set to $C7 at start-up
;	:= $0017	; set to $7F at start-up
;	:= $0018	; Verify Flag - After or While programming
;	:= $0019	; ?
;	:= $001A	; ?
;	:= $001B	; ?
;	:= $001C	; ?
;	:= $001D	; ?
;	:= $001E	; ?
;	:= $001F	; ?
;
;	:= $010C	; ? (2-bytes)
;	:= $010F	; ? (2-bytes)
;
DISFLG	:= $0112	; ?
BKFLG	:= $0113	; ?
;	:= $0114	; ?
;
;
;	:= $0400	; ?
;	:= $040F	; ? (2-bytes)
;	:= $0412	; ? (2-bytes)
;	:= $0439	; ? (2-bytes)
;	:= $0442	; ? (2-bytes)
IRQ1	:= $0448	; ? (2-bytes)
;	:= $0475	; ? (2-bytes)
;	:= $0478	; ? (2-bytes)
;	:= $0400	; ? (2-bytes)
;
			; *** Table of redirection vectors to Monitor subroutines in RAM ***
;
VADDS1	:= $0400	; jump to ADDS1 ($E55D)
VBLANK	:= $0403	; jump to BLANK ($E83E)
VBLANK2	:= $0406	; jump to BLANK2 ($E83B)
VCHEKA	:= $0409	; jump to CHEKA ($E54E)
VCHEKAR	:= $040C	; jump to CHEKAR ($E54B)
VCHNGG	:= $040F	; jump to CHNGG ($E2A0) (not used)
VVECKS	:= $0412	; jump to VECKSM ($E694) (not used)
VCLR	:= $0415	; jump to CLR ($EB44)
VCLRCK	:= $0418	; jump to CLRCK ($EB4D)
VCOMIN	:= $041B	; jump to COMIN ($E1A1)
VCRCK	:= $041E	; jump to CRCK ($EA24)
VCRLF	:= $0421	; jump to CRLF ($E9F0)
VCRLOW	:= $0424	; jump to CRLOW ($EA13)
VRED1	:= $0427	; jump to RED1 ($FE96)
VDELAY	:= $042A	; jump to DELAY ($EC0F)
VGETKY	:= $042D	; jump to GETKEY ($EC40)
VGETTY	:= $0430	; jump to GETTTY ($EBDB)
VINALL	:= $0433	; jump to INALL ($E993)
VINCS2	:= $0436	; jump to INCS2 ($E566)
VKDISA	:= $0439	; jump to KDISA ($E70A) (not used)
VLDAY	:= $043C	; jump to LDAY ($EB58)
VLL	:= $043F	; jump to LL ($E8FE)
VMEM	:= $0442	; jump to MEM ($E248) (not used)
VNUMA	:= $0445	; jump to NUMA ($EA46)
VNXT5	:= $0448	; jump to NXT5 ($E60D) (not used)
VOUTAL	:= $044B	; jump to OUTALL ($E9BC)
VOUTCK	:= $044E	; jump to OUTCK ($E538)
VOUTCS	:= $0451	; jump to OUTCKS ($E531)
VOUTC1	:= $0454	; jump to OUTCK1 ($E53B)
VOUTD1	:= $0457	; jump to OUTDD1 ($EF7B)
VOUTP1	:= $045A	; jump to OUTDP1 ($EF02)
VOUTPT	:= $045D	; jump to OUTPUT ($E97A)
VPTC18	:= $0460	; jump to PATC18 ($FF3D)
VPSLS	:= $0463	; jump to PSLS ($E7DC)
VRBYTE	:= $0466	; jump to RBYTE ($E3FD)
VRONEK	:= $0469	; jump to ROONEK ($ECEF)
VSADDR	:= $046C	; jump to SADDR ($EB78)
VDU10B	:= $046F	; jump to DU10B ($E4EB)
VSTBYT	:= $0472	; jump to STBYTE ($E413)
VTGTA1	:= $0475	; jump to TOGTA1 ($E6BD) (not used)
VTGTA2	:= $0478	; jump to TOGTA2 ($E6CB) (not used)
VWHERI	:= $047B	; jump to WHEREI ($E848)
VWHERO	:= $047E	; jump to WHEREO ($E871)
VWRAX	:= $0481	; jump to WRAX ($EA42)
;
PRCFG1	:= $0485	; PROM Configuration - 
PRCFG2	:= $0486	; PROM Configuration - 
PRCFG3	:= $0487	; PROM Configuration - 
PRCFG4	:= $0488	; PROM Configuration - 
PRCFG5	:= $0489	; PROM Configuration - 
PRCFG6	:= $048A	; PROM Configuration - 
PRCFG7	:= $048B	; PROM Configuration - 
PRCFG8	:= $048C	; PROM Configuration - 
PRCFG9	:= $048D	; PROM Configuration - 
PRCFGA	:= $048E	; PROM Configuration - 
PRCFGB	:= $048F	; PROM Configuration - 
PRCFGC	:= $0490	; PROM Configuration - 
;
;			; *** Monitor Variables (stored in 6532) ***
;
CURPO2	:= $A415	; Display Pointer
S1	:= $A41A	; Start Address (2-bytes)
ADDR	:= $A41C	; End Address (2-bytes)
CKSUM	:= $A41E	; Checksum (2-bytes)
ROLLFL	:= $A47F	; Save last strobe for rollover
;
COMIN	:= $E1A1	; Re-enter command interpreter
MEM	:= $E248	; Monitor M Command - Display Memory
CHNGG	:= $E2A0	; Monitor / Command - Alter Memory
RBYTE	:= $E3FD	; Inputs two ASCII characters from Active Input Device: if hex, converts to binary with results in A
STBYTE	:= $E413	; Store and Check Memory Fail
DU10B	:= $E4EB	; Output last record
OUTCKS	:= $E531	; Get character specified by start address (S1)
OUTCK	:= $E538	; Add to checksum and print
OUTCK1	:= $E53B	; Output checksum
CHEKAR	:= $E54B	; Add to checksum
CHEKA	:= $E54E	; Add to checksum
ADDS1	:= $E55D	; Add one to start address (S1)
INCS2	:= $E566	; Increment vertical count
NXT5	:= $E60D	; Monitor SPACE Command - show next 5 memory locations
VECKSM	:= $E694	; Monitor 3 Command - Verify Tapes
TOGTA1	:= $E6BD	; Monitor 1 Command - Toggle Tape 1 Control
TOGTA2	:= $E6CB	; Monitor 2 Command - Toggle Tape 2 Control
KDISA	:= $E70A	; Monitor K Command - Disassemble Memory
PSLS	:= $E7DC	; On delete key output slash if TTY & backup cursor if keyboard
BLANK2	:= $E83B	; Outputs two P's to Display/Printer
BLANK	:= $E83E	; Outputs one Space to Display/Printer
WHEREI	:= $E848	; Sets up the Active Input Device and loads INFLG
WHEREO	:= $E871	; Sets up the Active Output Device and loads OUTFLG
LL	:= $E8FE	; Set I/O to terminal
OUTPUT	:= $E97A	; Outputs ASCII character in A to Display/Printer
INALL	:= $E993	; Inputs one ASCII character from Active Input Device to A
OUTALL	:= $E9BC	; Outputs ASCII character in A to Active Output Device
CRLF	:= $E9F0	; Outputs CR, LF & NUL to Active Output Device
CRLOW	:= $EA13	; Outputs CR and LF to Display/Printer
CRCK	:= $EA24	; Outputs Printer Buffer to Printer
WRAX	:= $EA42	; Write A then X in ASCII to the output device
NUMA	:= $EA46	; Converts two hex numbers in A from binary to ASCII and outputs to Active Output Device
CLR	:= $EB44	; Clears Display/Printer pointers
CLRCK	:= $EB4D	; Clear CKSUM
LDAY	:= $EB58	; Simulates lda (n),y without Page Zero
SADDR	:= $EB78	; Subroutine store at ADDR and compare without page zero
GETTTY	:= $EBDB	; Get a character from TTY into A (saves X)
DELAY	:= $EC0F	; Delay 1-bit time as given by baud rate
GETKEY	:= $EC40	; Get a character from keyboard
ROONEK	:= $ECEF	; Wait if last key still down (rollover)
OUTDP1	:= $EF02	; Output a character to Display
OUTDD1	:= $EF7B	; Convert X into real address for Display and output it
RED1	:= $FE96	; Inputs one character from Keyboard to A, with echo to Display/Printer
PATC18	:= $FF3D	; Reset PRIFLG
;
			; *** Hardware Addresses ***
;
DAC	:= $7000	; 8-bit DAC Controlling Programming Voltage
IRBORB	:= $7010	; 6522 Input/Output Register B	PROM Control
			;				bit 0
			;				bit 1
IRAORA	:= $7011	; 6522 Input/Output Register A	PROM Data
DDRB	:= $7012	; Data Direction Register B
DDRA	:= $7013	; Data Direction Register A
;	:= $7020	; Octal Latch - PROM Address ?
;	:= $7030	; Octal Latch - PROM Address ?
;
			; *** ASCII Codes ***
CR	:=	$0D	; Carriage Return
ESC	:=	$1B	; ESCape
SPACE	:=	$20	; SPACE
;
	.org	$7000
;
L7000:	.byte	"COPYRIGHT 1983 ELECTRONIC DEVICES Div of ROCKWELL INTERNATIONAL NEWPORT BEACH, CALIFORNIA"
;
	.res	$A7,$FF		; packing
;
L7100:	ldy	#$00		; *** Entry Point ***
	sty	$0400		;
	dey
	sty	$0484		; ?
	lda	$0400		;
	cmp	#$4C
	beq	L712D
	ldx	#$84		; copy table of Monitor subroutine calls to RAM
CPYTBL:	lda	MONJMP-1,x	; table of jumps
	sta	$0400-1,x	; first RAM location
	dex
	bne	CPYTBL		; copy the whole table
	lda	#$00
	sta	$0A
	sta	$0B
	sta	$0C
	sta	$0D
	lda	#$C7
	sta	$16
	lda	#$7F
	sta	$17
L712D:	lda	#$09
	sta	BKFLG		; ?
	lda	#$71
	sta	$0114		; ?
	lda	#$4C
	sta	DISFLG		; ?
	jsr	VCRLOW		; output CR LF to Display/Printer
	lda	#$01		; pointer to start-up message
	jsr	OUTMES		; output message
	jsr	L7365
	lda	PRCFG9
	sta	$18		; Verify Flag - After or While programming ?
	jsr	L72DE
	jsr	VCRLF		; output CR, LF & NUL to Active Output Device
;
				; *** Main Loop ***
;
MAIN:	ldx	#$FF		; reset processor stack
	txs
	lda	#$02
	sta	$00
L7159:	jsr	VCRCK		; output Printer Buffer to Printer
	lda	#$DB
	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	jsr	VRED1		; input one character from Keyboard to A, with echo to Display/Printer
	pha
	lda	#']'
	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	pla
	ldy	#$18
SEARCH:	cmp	COMS,y		; search table of command letters
	beq	FOUND
	dey
	bpl	SEARCH
	dec	$00
	bpl	L7159
	jsr	COMNDQ		; display menu of commands
	beq	MAIN
FOUND:	pha
	tya			; multiply index by 2
	asl	a
	tay
	lda	COMTAB,y	; get address of command routine
	sta	$00
	lda	COMTAB+1,y
	sta	$01
	pla
	jsr	EXECMD		; and call it
	jmp	MAIN		; and round again
EXECMD:	jmp	($00)
;
				; Table of Commands
COMS:	.byte	"RVPECSIAN?TXLDF123KM/ []"
;
				; Table of Command routines
COMTAB:	.word	COMNDR		; Command R - Read PROM
	.word	COMNDV		; Command V - Verify PROM
	.word	COMNDP		; Command P - Program PROM
	.word	COMNDE		; Command E - Erase EEPROM
	.word	COMNDC		; Command C - Checksum PROM
	.word	COMNDS		; Command S - Checksum Memory
	.word	COMNDI		; Command I - Invert Memory
	.word	COMNDA		; Command A - Alter Memory
	.word	COMNDN		; Command N - Change PROM Type
	.word	COMNDQ		; Command ? - Display Menu
	.word	COMNDT		; Command T - Toggle Verify Mode
	.word	COMNDX		; Command X - Exit
	.word	COMNDL		; Command L - Load with Offset
	.word	COMNDD		; Command D - Dump with Offset
	.word	COMNDF		; Command F - ?
	.byte	$75,$04		; 1 - ?
	.byte	$78,$04		; 2 - ?
	.byte	$12,$04		; 3 - ?
	.byte	$39,$04		; K - ?
	.byte	$42,$04		; M - ?
	.byte	$0F,$04		; / - ?
	.byte	$48,$04		; [ - ?
	.byte	$0C,$01		; ] - ?
	.byte	$0F,$01		; - ?
;
				; *** Command C - Check PROM ***
COMNDC:	jsr	L7365
	jsr	L7820
L71E4:	jsr	L71EA
	jmp	L72D2
;
L71EA:	jsr	L7611
	jsr	L768D
	cmp	#$FF
	bne	L71FA
	jsr	L7838
	bcs	L71EA
	rts
;
L71FA:	lda	#$0A		; point to "NOT INITILIZED" message
	jsr	OUTMES		; output message
	sec
	rts
;
				; *** Command R - Read PROM ***
COMNDR:	jsr	L7365		; get PROM type ?
	jsr	L7820		; get address ?
RDLOOP:	jsr	L7611		; write PROM address ?
	jsr	L768D		; read PROM data ?
	ldy	#$00
	jsr	VSADDR		; store at ADDR and compare without page zero
	jsr	L78F1		; check for key pressed ?
	jsr	L7838		; increment address and check for end ?
	bcs	RDLOOP		; no carry on reading ?
	jmp	L72D2		; finished
;
				; *** Command V - Verify PROM ***
COMNDV:	jsr	L7365		; get PROM type ?
	jsr	L7820		; get address ?
	jsr	L79DD
VFLOOP:	jsr	L7611		; write PROM address ?
	jsr	L76CE
	jsr	L78F1		; check for key pressed ?
	jsr	L7838		; increment address and check for end ?
	bcs	VFLOOP
	jmp	L72D2		; finished
;
				; *** Command P - Program PROM ***
COMNDP:	jsr	L7365		; get PROM type ?
	lda	$18		; Verify Flag - After or While programming
	jsr	L72DE
	jsr	L7820		; get address ?
	jsr	L79DD
	jsr	L71EA
	bcc	L7257
	lda	#$0B		; point to " CONTINUE" message
	jsr	L7447
	bcs	L7254
	jmp	L7510
;
L7254:	jsr	VCRLOW		; output CR and LF to Display/Printer
L7257:	lda	PRCFGB
	sta	$13
	lda	PRCFGC
	sta	$12
L7261:	jsr	L7829
L7264:	jsr	L7955
	jsr	L7611
	bit	$18		; Verify Flag - After or While programming
	bvs	L72A9
	ldy	#$00
	jsr	L77A6
	sta	$01
	jsr	L768D
	cmp	$01
	beq	L72B7
	cmp	#$FF
	beq	L72A9
	sta	$00
	ora	$01
	cmp	$00
	beq	L72A9
	lda	PRCFGB
	lsr	a
	bcs	L72A2
	lda	#$18		; point to "  INVALID BIT CHANGE AT " message
	jsr	OUTMES		; output message
	lda	ADDR+1		; end address+1
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	ADDR		; end address
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jmp	L72D2		; finished
L72A2:	lsr	$13
	jsr	L770F
	asl	$13
L72A9:	jsr	L770F
	lda	$12
	bne	L72B7
	bit	$18		; Verify Flag - After or While programming
	bvs	L72B7
	jsr	L76CE
L72B7:	jsr	L78F1
	jsr	L7838
	bcs	L7264
	dec	$12
	bpl	L7261
	bit	$18		; Verify Flag - After or While programming
	bvc	L72D2		; finished
	lda	#$15		; point to "VERIFYING" message
	jsr	OUTMES		; output message
	jsr	L7829
	jmp	VFLOOP
;
L72D2:	jsr	L7510		; switch everything off ?
	jmp	L7499		; output DONE message and return to main loop
;
				; *** Command T - Toggle Verify ***
COMNDT:	lda	$18		; Verify Flag - After or While programming
	eor	#$40
	sta	$18
L72DE:	asl	a
	bpl	L72E6
	lda	#$16		; point to " VERIFY AFTER PROG." message
	jmp	OUTMES		; output message
L72E6:	lda	#$17		; point to " VERIFY WHILE PROG." message
	jmp	OUTMES		; output message
;
				; *** Command E - ERASE EEPROM ***
COMNDE:	jsr	L7365
	bit	PRCFGB
	bmi	L72F8
	lda	#$13		; point to ", USE UV LAMP!" message
	jmp	OUTMES		; output message
L72F8:	lda	#$14		; point to " ARE YOU SURE?" message
	jsr	L7447
	beq	L7300
L72FF:	rts
L7300:	lda	PRCFGB
	lsr	a
	bcs	L7337
	jsr	L752E
	lda	PRCFG8
	sta	L7000
	jsr	L75B8
	jsr	L75DC
	jsr	L75B4
	jsr	L75E0
	jsr	L75A0
	ldy	#$E6
	ldx	#$00
L7322:	jsr	L72FF
	dex
	bne	L7322
	dey
	bne	L7322
	jsr	L75A4
	jsr	L75B0
	jsr	L75E4
	jmp	L72D2
L7337:	jsr	L7820
	lda	PRCFGB
	lsr	a
	sta	$13
L7340:	jsr	L7955
	jsr	L7611
	jsr	L770F
	jsr	L78F1
	jsr	L7838
	bcs	L7340
	jsr	L7829
	jmp	L71E4
;
				; *** Command N - Change PROM Type ***
COMNDN:	jsr	L736C
	lda	PRCFG9
	sta	$18		; Verify Flag - After or While programming
	jsr	L72DE		; output verify state ?
	jmp	L7499		; finished
;
L7365:	lda	$0484
	cmp	#CR
	bcc	L73BB
L736C:	jsr	L7510
L736F:	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$08		; point to "EPROM NUMBER? " message
	jsr	OUTMES		; output message
	ldy	#$80
	ldx	#$05
	jsr	L7868
	cpy	#$00
	beq	L7385
	jmp	L7405
L7385:	lda	$06
	cmp	PRTYP2,y	; 2nd part of PROM type
	beq	L7393
L738C:	iny
	cpy	#CR
	bcc	L7385
	bcs	L73D6
L7393:	txa
	cmp	PRTYP1,y	; 1st part of PROM type
	bne	L738C
	sty	$0484
	cpy	#$04
	bne	L73AB
	lda	#$12		; point to " 2732A ?" message
	jsr	L7447
	bne	L73BB
	ldy	#$05
	bne	L73B8
L73AB:	cpy	#$08
	bne	L73BB
	lda	#$04		; point to "  AR LOW?" message
	jsr	L7447
	bne	L73BB
	ldy	#$09
L73B8:	sty	$0484
L73BB:	jsr	L73DE
	jsr	VCRLOW		; output CR and LF to Display/Printer
	ldy	$0484
	bpl	L73CE
	lda	#$19		; point to "USER DRIVER" message
	jsr	OUTMES		; output message
	jmp	L73D1
L73CE:	jsr	L7435
L73D1:	lda	#$1A		; point to " SELECTED" message
	jmp	OUTMES		; output message
L73D6:	lda	#$09		; point to list of supported EPROMs
	jsr	OUTMES		; output message
	jmp	L736F
;
L73DE:	lda	$0484
	bmi	L73FA
	asl	a
	asl	a
	sta	$00
	asl	a
	adc	$00
	adc	#$0B
	tay
	ldx	#$0B
L73EF:	lda	L7F2B,y		; get PROM configuration data ?
	sta	PRCFG1,x
	dey
	dex
	bpl	L73EF
	rts
L73FA:	ldy	#$0B
L73FC:	lda	($16),y
	sta	PRCFG1,y
	dey
	bpl	L73FC
	rts
L7405:	cpy	#$04
	bne	L7415
	cpx	#$80
	bne	L73D6
	cmp	#$16
	bne	L73D6
	ldy	#$0B
	bne	L73B8
L7415:	cpy	#$06
	bne	L7425
	cpx	#$87
	bne	L73D6
	cmp	#$64
	bne	L73D6
	ldy	#$0C
	bne	L73B8
L7425:	cpy	#$0E
	bne	L73D6
	cpx	#$FE
	bne	L73D6
	cmp	#$ED
	bne	L73D6
	ldy	#$80
	bne	L73B8
L7435:	lda	PRTYP1,y
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	PRTYP2,y
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	PRTYP3,y
	jmp	VOUTPT		; output ASCII character in A to Display/Printer
;
L7447:	jsr	OUTMES		; output message
	jsr	L7907
	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	cmp	#$59
	rts
;
				; *** Command A - Alter Memory ***
COMNDA:	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$10		; point to " SET MEMORY TO = " message
	jsr	OUTMES		; output message
	ldy	#$80
	ldx	#$02
	jsr	L7868
	pha
	jsr	VCRLOW		; output CR and LF to Display/Printer
	jsr	L77B7
	ldy	#$00
	jsr	L7829
	pla
	tax
L7470:	txa
	jsr	VSADDR		; store at ADDR and compare without page zero
	jsr	L7838
	bcs	L7470
	jmp	L7499
;
				; *** Command I - Invert Memory ***
COMNDI:	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$0F		; point to " INVERT MEMORY" message
	jsr	OUTMES		; output message
	jsr	L77B7
	jsr	L7829
	ldy	#$00
L748C:	jsr	L77A6
	eor	#$FF
	jsr	VSADDR		; store at ADDR and compare without page zero
	jsr	L7838
	bcs	L748C
L7499:	jsr	VLL		; set I/O to terminal
	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$11		; point to " DONE" message
	jsr	OUTMES		; output message
	rts
;
				; *** Command S - Checksum Memory ***
COMNDS:	jsr	L7803
	jsr	VCRLOW		; output CR and LF to Display/Printer
	jsr	L7829
	lda	#$00
	sta	$07
	sta	$08
L74B4:	ldy	#$00
	jsr	L77A6
	clc
	adc	$08
	sta	$08
	bcc	L74C2
	inc	$07
L74C2:	jsr	L7838
	bcs	L74B4
	lda	#$0C		; point to " CHECKSUM=" message
	jsr	OUTMES		; output message
	lda	$07
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	$08
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jmp	L72D2
;
				; *** Command X - Exit ***
COMNDX:	jsr	L7510
	jmp	VCOMIN		; ?
;
L74DF:	bit	PRCFG2
	bvs	L750D
	jsr	L75C0
	jsr	L75B0
	jsr	L75A8
	jsr	L75A0
	lda	#$00
	sta	IRAORA		; write to 6522 port A
	lda	#$06
	sta	DDRA		; set 6522 port A bits 1,2 output and bits 0,3,4,5,6,7 input
	bit	IRBORB		; test bit 7 of 6522 port B
	bpl	L750D
	lda	#$03		; point to "PRESS A KEY TO GO" message
	jsr	OUTMES		; output message
	jsr	L7907
	jsr	VCRLOW		; output CR LF to Display/Printer
	jmp	L74DF
;
L750D:	jmp	L7510
;
				; switch everything off ?
L7510:	lda	#$00
	sta	DDRA		; set 6522 port A (PROM data) to all input
	sta	$7030		; write to 8-bit latch ?
	lda	IRBORB		; read 6522 port B
	ora	#$F7
	sta	IRBORB		; write to 6522 port B
	lda	#$00
	jsr	L759A
	sta	DDRB		; set 6522 port B to all input
	lda	#$32		; 5V ?
	sta	L7000		; set programming voltage
	rts
;
L752E:	jsr	L74DF
	lda	#$7F
	sta	IRBORB		; write to 6522 port B
	sta	DDRB		; set 6522 port B bits 0-6 output and bit 7 input
	lda	PRCFG8
	sta	L7000		; set programming voltage
	lda	PRCFG2
	sta	$00
	bpl	L7549
	jsr	L75C0
L7549:	asl	$00
	bpl	L7550
	jsr	L75D4
L7550:	asl	$00
	bpl	L7557
	jsr	L758C
L7557:	asl	$00
	bpl	L755E
	jsr	L75B8
L755E:	asl	$00
	bpl	L7565
	jsr	L75B0
L7565:	asl	$00
	bpl	L756C
	jsr	L75A0
L756C:	asl	$00
	bpl	L7573
	jsr	L7590
L7573:	asl	$00
	bpl	L757A
	jsr	L75C4
L757A:	bit	PRCFG3
	bpl	L7582
	jsr	L75D8
L7582:	bit	PRCFG3
	bvc	L758A
	jsr	L75DC
L758A:	ldy	#$05
L758C:	lda	#$FE
	bne	L75CD
L7590:	lda	#$10
L7592:	ora	$09
	bne	L759A
L7596:	lda	#$EF
L7598:	and	$09
L759A:	sta	$09
	sta	$7020		; write to 8-bit latch ?
	rts
;
L75A0:	lda	#$40
	bne	L7592
L75A4:	lda	#$BF
	bne	L7598
L75A8:	lda	#$04
	bne	L7592
L75AC:	lda	#$FB
	bne	L7598
L75B0:	lda	#$80
	bne	L7592
L75B4:	lda	#$7F
	bne	L7598
L75B8:	lda	#$08
	bne	L7592
L75BC:	lda	#$F7
	bne	L7598
L75C0:	lda	#$20
	bne	L7592
L75C4:	lda	#$40
L75C6:	ora	IRBORB		; OR with 6522 port B
	bne	L75D0
L75CB:	lda	#$BF
L75CD:	and	IRBORB		; AND with 6522 port B
L75D0:	sta	IRBORB		; write to 6522 port B
	rts
;
L75D4:	lda	#$F7
	bne	L75CD
L75D8:	lda	#$FB
	bne	L75CD
L75DC:	lda	#$FD
	bne	L75CD
L75E0:	lda	#$DF
	bne	L75CD
L75E4:	lda	#$20
	bne	L75C6
L75E8:	jsr	L75B8
	lda	#$32
	sta	L7000
	jsr	L7610
	jsr	L7610
	jsr	L7610
	jsr	L75E0
	lda	#$32
	ldy	#$34
	clc
	sei
L7602:	adc	#$03
	sta	L7000
	dey
	bpl	L7602
	lda	#$D2
	sta	L7000
	cli
L7610:	rts
;
				; write PROM address ?
L7611:	lda	ADDR+1		; end address+1
	and	PRCFG1
	tay
	lda	PRCFG4
	sta	$00
	bpl	L762C
	tya
	and	#$10
	bne	L7629
	jsr	L7596
	bne	L762C
L7629:	jsr	L7590
L762C:	asl	$00
	bpl	L7642
	tya
	and	#$10
	bne	L763F
	bit	PRCFG9
	bmi	L763F
	jsr	L75BC
	bne	L7642
L763F:	jsr	L75B8
L7642:	asl	$00
	bpl	L7653
	tya
	and	#$08
	bne	L7650
	jsr	L75BC
	bne	L7653
L7650:	jsr	L75B8
L7653:	asl	$00
	bpl	L7664
	tya
	and	#$08
	bne	L7661
	jsr	L75A4
	bne	L7664
L7661:	jsr	L75A0
L7664:	asl	$00
	bpl	L767A
	tya
	and	#$04
	bne	L7677
	bit	PRCFG9		; test for 68764
	bmi	L7677		; branch if yes
	jsr	L75AC
	bne	L767A
L7677:	jsr	L75A8
L767A:	lda	$09
	and	#$FC
	sta	$09
	tya
	and	#$03
	jsr	L7592
	lda	ADDR		; end address
	sta	$7030		; write to 8-bit latch ?
	rts
;
				; read PROM data ?
L768D:	lda	PRCFG5
	sta	$00
	bpl	L7697
	jsr	L75CB
L7697:	asl	$00
	bpl	L769E
	jsr	L7596
L769E:	asl	$00
	bpl	L76A5
	jsr	L75A4
L76A5:	asl	$00
	bpl	L76AC
	jsr	L75B4
L76AC:	asl	$00
	bpl	L76B3
	jsr	L75A4
L76B3:	lda	IRAORA		; read PROM data (6522 port A)
	pha
	asl	$00
	bpl	L76BE
	jsr	L75B0
L76BE:	asl	$00
	bpl	L76C5
	jsr	L75A0
L76C5:	asl	$00
	bpl	L76CC
	jsr	L75B0
L76CC:	pla
L76CD:	rts
;
L76CE:	jsr	L768D
	sta	$00
	ldy	#$00
	jsr	L77A6
	cmp	$00
	beq	L76CD
	pha
	inc	$10
	bne	L76E6
	lda	#$05		; point to "ADDRESS FROM RAM" message
	jsr	OUTMES		; output message
L76E6:	lda	#$2A
	jsr	VOUTAL		; output ASCII character in A to Active Output Device
	lda	ADDR+1		; end address+1
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	ADDR		; end address
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	VBLANK2		; output two spaces to Display/Printer
	jsr	VBLANK2		; output two spaces to Display/Printer
	lda	$00
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	VBLANK2		; output two spaces to Display/Printer
	pla
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	L78F1
	jmp	VCRLF		; output CR, LF & NUL to Active Output Device
;
L770F:	lda	PRCFG6
	sta	$01
	bpl	L7719
	jsr	L75A4
L7719:	asl	$01
	bpl	L7720
	jsr	L75B4
L7720:	asl	$01
	bpl	L7727
	jsr	L75CB
L7727:	asl	$01
	bpl	L772E
	jsr	L7596
L772E:	asl	$01
	bpl	L7735
	jsr	L75E0
L7735:	lda	#$FF
	sta	DDRA		; set 6522 port A to all output
	bit	$13
	bvc	L7742
	lda	#$FF
	bne	L7747
L7742:	ldy	#$00
	jsr	L77A6
L7747:	sta	IRAORA		; write to 6522 port A
	asl	$01
	bpl	L7751
	jsr	L75A4
L7751:	asl	$01
	bpl	L7758
	jsr	L75A0
L7758:	asl	$01
	bpl	L775F
	jsr	L75B4
L775F:	lda	PRCFG7
	sta	$01
	bpl	L7769
	jsr	L75E8
L7769:	asl	$01
	bpl	L7770
	jsr	L75CB
L7770:	asl	$01
	bpl	L7777
	jsr	L75E0
L7777:	ldy	PRCFGA
	jsr	L77AB
	asl	$01
	bpl	L7784
	jsr	L75A4
L7784:	asl	$01
	bpl	L778B
	jsr	L75B0
L778B:	asl	$01
	bpl	L7792
	jsr	L75A0
L7792:	asl	$01
	bpl	L7799
	jsr	L75C4
L7799:	asl	$01
	bpl	L77A0
	jsr	L75E4
L77A0:	lda	#$00
	sta	DDRA		; set 6522 port A to all inputs
	rts
;
L77A6:	lda	#$1C
	jmp	VLDAY
L77AB:	ldx	#$25
	sei
L77AE:	dex
	bne	L77AE
	nop
	dey
	bne	L77AB
	cli
	rts
;
L77B7:	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$0D		; point to "FROM=" message
	jsr	OUTMES		; output message
	ldx	$0A
	lda	$0B
	jsr	L7851
	bcs	L77D2
	lda	$0B
	ldx	$0A
	jsr	VWRAX		; write A then X in ASCII to the output device
	jmp	L77D6
L77D2:	sta	$0A
	stx	$0B
L77D6:	lda	#$0E		; point to " TO=" message
	jsr	OUTMES		; output message
	ldx	$0C
	lda	$0D
	jsr	L7851
	bcs	L77EF
	lda	$0D
	ldx	$0C
	jsr	VWRAX		; write A then X in ASCII to the output device
	ldx	$0D
	lda	$0C
L77EF:	sta	$0C
	stx	$0D
	cmp	$0A
	txa
	sbc	$0B
	bcc	L77FB
	rts
L77FB:	lda	#$06		; point to " NEGATIVE RANGE" message
	jsr	OUTMES		; output message
	jmp	L77B7
;
L7803:	jsr	L77B7
	lda	PRCFG1
	eor	#$FF		; invert
	tay
	and	$0B
	sta	$00
	tya
	and	$0D
	cmp	$00
	bne	L7818
	rts
L7818:	lda	#$07		; point to " RANGE TOO LARGE" message
	jsr	OUTMES		; output message
	jmp	L7803
;
L7820:	jsr	L7803
	jsr	VCRLOW		; output CR and LF to Display/Printer
	jsr	L752E
L7829:	lda	$0A
	sta	ADDR		; end address
	lda	$0B
	sta	ADDR+1		; end address+1
	lda	#$FF
	sta	$10
	rts
;
L7838:	lda	ADDR+1		; end address+1
	cmp	$0D
	bne	L7847
	lda	ADDR		; end address
	cmp	$0C
	clc
	beq	L7850
L7847:	inc	ADDR		; end address
	bne	L784F
	inc	ADDR+1		; end address+1
L784F:	sec
L7850:	rts
;
L7851:	pha
	txa
	pha
	jsr	L79B3
	pla
	tax
	pla
	bcc	L7864
	jsr	L79C3
	ldy	#$03
	jsr	L7995
L7864:	ldx	#$04
	ldy	#$80
L7868:	lda	#$00
	sta	$04
	sta	$05
	sta	$06
	stx	$00
	sty	$01
	tay
L7875:	jsr	L7907
	cmp	#CR
	beq	L78E4
	cmp	#SPACE
	beq	L78E4
	cmp	#$7F
	beq	L78CE
	cpy	#$00
	bne	L7891
	pha
	tya
	pha
	jsr	L7950
	pla
	tay
	pla
L7891:	cpy	$00
	bcc	L7898
L7895:	jmp	L7875
;
L7898:	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	bit	$01
	bpl	L78AB
	cmp	#'G'
	bcs	L78B3
	cmp	#'A'
	bcc	L78AB
	adc	#$08
	bne	L78B9
L78AB:	cmp	#':'
	bcs	L78B3
	cmp	#'0'
	bcs	L78B9
L78B3:	jsr	VPSLS		; on delete key output slash if TTY & backup cursor if keyboard
	jmp	L7895
L78B9:	and	#$0F
	ldx	#$03
L78BD:	asl	$06
	rol	$05
	rol	$04
	dex
	bpl	L78BD
	ora	$06
	sta	$06
	iny
	jmp	L7875
;
L78CE:	cpy	#$00
	beq	L7895
	dey
	ldx	#$03
L78D5:	lsr	$04
	ror	$05
	ror	$06
	dex
	bpl	L78D5
	jsr	VPSLS		; on delete key output slash if TTY & backup cursor if keyboard
	jmp	L7875
;
L78E4:	sec
	cpy	#$00
	bne	L78EA
	clc
L78EA:	lda	$06
	ldx	$05
	ldy	$04
	rts
;
L78F1:	stx	$14
	lda	#$08
	bit	$A800		; keyboard ?
	beq	L793A
	jsr	VRONEK		; wait if last key still down (rollover)
	dey
	bmi	L794F
	lda	#$FF
	sta	ROLLFL		; last strobe for rollover
	ldx	$14
L7907:	stx	$14
	ldx	CURPO2
	cpx	#$14
	bcs	L7915
	lda	#$DE
	jsr	VOUTD1		; convert X into real address for Display and output it
L7915:	sty	$15
	lda	#$08
	bit	$A800
	bne	L7924
	jsr	VGETTY		; get a character from TTY into A
	jmp	L7927
L7924:	jsr	VGETKY		; get a character from keyboard
L7927:	ldx	$14
	ldy	$15
	and	#$7F
	cmp	#$1B
	bne	L794F
L7931:	jsr	VPTC18		; reset PRIFLG
	jsr	L7510
	jmp	MAIN
;
L793A:	bvs	L794F
L793C:	bit	$A800
	bvc	L793C
	jsr	VDELAY		; delay 1-bit time as given by baud rate
	jsr	VGETTY		; get a character from TTY into A
	cmp	#ESC
	beq	L7931
	cmp	#SPACE
	bne	L793C
L794F:	rts
;
L7950:	lda	#$20
	jmp	VOUTD1		; convert X into real address for Display and output it

L7955:	bit	PRCFGA
	bvs	L7962
	bmi	L7962
	lda	ADDR		; end address
	beq	L7969
L7961:	rts
;
L7962:	lda	ADDR		; end address
	and	#$0F
	bne	L7961
L7969:	lda	#$08
	bit	$A800
	bne	L7975
	lda	#$07
	jmp	VOUTPT		; output ASCII character in A to Display/Printer
;
L7975:	lda	ADDR+1		; end address+1
	jsr	L79C7
	lda	ADDR		; end address
	jsr	L79C7
	ldy	#$03
	lda	PRCFGC
	beq	L7995		; branch if not 68764
	jsr	VBLANK		; output one Space to Display/Printer
	clc
	lda	$12
	adc	#$31
	jsr	VOUTP1		; output a character to Display
	ldy	#$05
L7995:	jsr	L79B3
	bcc	L79A6
	lda	#$08
L799C:	jsr	VOUTP1		; output a character to Display
	dec	$035B
	dey
	bpl	L799C
	rts
;
L79A6:	dec	CURPO2
	dey
	bpl	L79A6
	rts
;
				; ? Table ?
L79AD:	.byte	$20,$06,$99,$4C,$A1,$E1
;
L79B3:	ldx	#$05
L79B5:	lda	L79AD,x
	cmp	$9900,x
	clc
	bne	L79C2
	dex
	bpl	L79B5
	sec
L79C2:	rts
;
L79C3:	jsr	L79C7
	txa
L79C7:	pha
	lsr	a
	lsr	a
	lsr	a
	lsr	a
	jsr	L79D0
	pla
L79D0:	and	#$0F
	ora	#$30
	cmp	#$3A
	bcc	L79DA
	adc	#$06
L79DA:	jmp	VOUTP1		; output a character to Display
;
L79DD:	lda	#$1B		; point to "ERRORS " message
	jsr	OUTMES		; output message
	jsr	VWHERO		; Sets up the Active Output Device and loads OUTFLG
	jmp	VCRLOW		; output CR and LF to Display/Printer
;
				; *** Command L - Load with Offset ***
COMNDL:	lda	#$FF
	sta	$1E
	bne	L7A02
;
				; *** Command F - ? ***
COMNDF:	lda	#$00
	sta	$1E
	sta	$1F
	jsr	VCRLOW		; output CR and LF to Display/Printer
	lda	#$1B		; point to "ERRORS " message
	jsr	OUTMES		; output message
	jsr	VWHERO		; set up the Active Output Device and loads OUTFLG
	jsr	VCRLOW		; output CR and LF to Display/Printer
L7A02:	jsr	L7AD6
	jsr	VCRLOW		; output CR and LF to Display/Printer
	jsr	VWHERI		; sets up the Active Input Device and loads INFLG
	jsr	VCRCK		; output Printer Buffer to Printer
L7A0E:	jsr	VINALL		; input one ASCII character from Active Input Device to A
	cmp	#$3B
	bne	L7A0E
	jsr	VCLRCK		; clear CKSUM
	jsr	VCHEKAR		; add to checksum
	tax
	jsr	VCHEKAR		; add to checksum
	pha
	jsr	VCHEKAR		; add to checksum
	clc
	adc	$19
	sta	ADDR		; end address
	pla
	adc	$1A
	sta	ADDR+1		; end address+1
	txa
	beq	L7A5C
L7A32:	jsr	VRBYTE		; input two ASCII characters from Active Input Device: if hex, converts to binary with results in A
	jsr	L7A62
	dex
	bne	L7A32
	jsr	VRBYTE		; input two ASCII characters from Active Input Device: if hex, converts to binary with results in A
	cmp	$A41F
	bne	L7A4B
	jsr	VRBYTE		; input two ASCII characters from Active Input Device: if hex, converts to binary with results in A
	cmp	CKSUM		; checksum
	beq	L7A0E
L7A4B:	jsr	VCRLF		; output CR, LF & NUL to Active Output Device
	lda	#$1D		; point to "CHECKSUM ERROR" message
	jsr	OUTMES		; output message
	jsr	VLL		; set I/O to terminal
	jsr	L7ACA
	jmp	L7B83
;
L7A5C:	jsr	VCRLOW		; output CR LF to Display/Printer
	jmp	L7B83
;
L7A62:	bit	$1E
	bpl	L7A69
	jmp	VSTBYT		; store and check memory fail
;
L7A69:	jsr	VCHEKA		; add to checksum
	sta	$0106
	lda	#$1C
	ldy	#$00
	jsr	VLDAY		; simulate lda (n),y without Page Zero
	cmp	$0106
	beq	L7AC1
	sta	$0107
	txa
	pha
	lda	$0106
	pha
	lda	$0107
	pha
	bit	$1F
	bmi	L7A96
	jsr	VCRLOW		; output CR LF to Display/Printer
	lda	#$1C		; point to "ADDR RAM ADDR FILE" message
	jsr	OUTMES		; output message
	dec	$1F
L7A96:	lda	ADDR+1		; end address+1
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	ADDR		; end address
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	VBLANK2		; output two Spaces to Display/Printer
	pla
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	VBLANK		; output one Space to Display/Printer
	jsr	VBLANK2		; output two Spaces to Display/Printer
	jsr	L7ACA
	jsr	VBLANK2		; output two Spaces to Display/Printer
	pla
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jsr	VCRLF		; output CR, LF & NUL to Active Output Device
	jsr	L78F1
	pla
	tax
L7AC1:	inc	ADDR		; end address
	bne	L7AC9
	inc	ADDR+1		; end address+1
L7AC9:	rts
;
L7ACA:	lda	ADDR+1		; end address+1
	jsr	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device
	lda	ADDR		; end address
	jmp	VNUMA		; convert two hex numbers in A from binary to ASCII and outputs to Active Output Device	; converts two hex numbers in A from binary to ASCII and outputs to Active Output Device
;
L7AD6:	lda	#$1F		; point to " OFFSET" message
	jsr	OUTMES		; output message
	lda	#$00
	tax
	jsr	L7851
	sta	$19
	stx	$1A
	rts
;
				; *** Command D - Dump with Offset ***
COMNDD:	lda	#$00
	sta	$0106
	sta	$0107
	sta	$1E
L7AF0:	jsr	VCRLOW		; output CR LF to Display/Printer
	jsr	L7803
	jsr	L7AD6
	lda	$0A
	sta	S1		; start address
	lda	$0B
	sta	S1+1		; start address+1
	inc	$0C
	bne	L7B09
	inc	$0D
L7B09:	jsr	VCRLOW		; output CR LF to Display/Printer
	lda	$1E
	bne	L7B15
	inc	$1E
	jsr	VWHERO		; set up the Active Output Device and loads OUTFLG
L7B15:	jsr	VCRLF		; output CR, LF & NUL to Active Output Device
	jsr	L78F1
	jsr	VCLRCK		; clear CKSUM
	lda	$0C
	sec
	sbc	S1		; start address
	pha
	lda	$0D
	sbc	S1+1		; start address+1
	bne	L7B35
	pla
	beq	L7B73
	cmp	#$18
	bcc	L7B38
	bcs	L7B36
L7B35:	pla
L7B36:	lda	#$18
L7B38:	pha
	lda	#$3B
	jsr	VOUTAL		; output ASCII character in A to Active Output Device
	pla
	sta	$1D
	jsr	VOUTCK		; add to checksum and print
	clc
	lda	S1		; start address
	adc	$19
	pha
	lda	S1+1		; start address+1
	adc	$1A
	jsr	VOUTCK		; add to checksum and print
	pla
	jsr	VOUTCK		; add to checksum and print
L7B57:	jsr	VOUTCS		; get character specified by start address (S1)
	jsr	VADDS1		; add one to start address (S1)
	dec	$1D
	bne	L7B57
	lda	$A41F
	jsr	VOUTC1		; output checksum
	lda	CKSUM		; checksum
	jsr	VOUTC1		; output checksum
	jsr	VINCS2		; increment vertical count
	jmp	L7B15
;
L7B73:	jsr	VCLR		; clear Display/Printer pointers
	lda	#$1E		; point to "MORE?" message
	jsr	L7447
	bne	L7B80
	jmp	L7AF0
;
L7B80:	jsr	VDU10B		; output last record
L7B83:	lda	#$04
	sta	$A800
	jmp	VLL		; set I/O to terminal
;
				; *** Output Message ***
OUTMES:	sta	$11		; pointer to message
	lda	#<MESTAB	; setup pointer to Message Table
	sta	$02
	lda	#>MESTAB
	sta	$03
	ldy	#$00		; start searching at beginning of Message Table
MESRCH:	lda	($02),y
	pha
	inc	$02		; increment table pointer
	bne	NOINC
	inc	$03
NOINC:	pla
	bpl	MESRCH		; search until we get a negative value (end of message)
	dec	$11		; then decrement the message pointer
	bne	MESRCH		; until that gets to zero then we have found the required message !
NXTCHR:	lda	($02),y		; get message
	pha
	and	#$7F		; mask off MSB in case its the last character which will be negative
	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	iny
	pla
	bpl	NXTCHR		; if character was negative then we are finished otherwise keep going
	rts
;
				; *** Command ? - Display Menu ***
COMNDQ:	ldy	#$00
OUTMNU:	lda	PRCMDS,y
	beq	L7BC1
	jsr	VOUTPT		; output ASCII character in A to Display/Printer
	iny
	bne	OUTMNU
L7BC1:	rts
;
MESTAB:				; Table of Messages
	.byte	$80
	.byte	"PROM PROGRAMMER V1.0",CR+$80,$80,CR	; $01 - start-up message
	.byte	"IMPROPERLY INSERTED",CR
	.byte	"PRESS A KEY TO G",'O'+$80		; $03
	.byte	"  AR LOW",'?'+$80			; $04
	.byte	CR,"ADDRESS PROM RAM",CR+$80		; $05
	.byte	" NEGATIVE RANG",'E'+$80		; $06
	.byte	" RANGE TOO LARG",'E'+$80		; $07
	.byte	"EPROM NUMBER?",SPACE+$80		; $08
	.byte	CR," ** ERROR **",CR,CR			; $09
	.byte	"SUPPORTED EPROMS",CR
	.byte	"2508 2758 2758L",CR
	.byte	"2716",CR
	.byte	"2532 2732 2732A",CR
	.byte	"2564 2764 68764",CR,CR
	.byte	"SUPPORTED EEPROMS",CR
	.byte	"2816 5213 48016",CR+$80
	.byte	"NOT INITIALIZE",'D'+$80		; $0A
	.byte	" CONTINUE",'?'+$80			; $0B
	.byte	" CHECKSUM",'='+$80			; $0C
	.byte	"FROM",'='+$80				; $0D
	.byte	" TO",'='+$80				; $0E
	.byte	" INVERT MEMOR",'Y'+$80			; $0F
	.byte	" SET MEMORY TO =",SPACE+$80		; $10
	.byte	" DONE",CR+$80				; $11
	.byte	"  2732A ",'?'+$80			; $12
	.byte	", USE UV LAMP",'!'+$80			; $13
	.byte	"  ARE YOU SURE",'?'+$80		; $14
	.byte	CR,"VERIFYING",CR+$80			; $15
	.byte	CR," VERIFY AFTER PROG",'.'+$80		; $16
	.byte	CR," VERIFY WHILE PROG",'.'+$80		; $17
	.byte	"  INVALID BIT CHANGE AT",SPACE+$80	; $18
	.byte	CR,"USER DRIVE",'R'+$80			; $19
	.byte	" SELECTE",'D'+$80			; $1A
	.byte	"ERRORS",SPACE+$80			; $1B
	.byte	"ADDR RAM ADDR FIL",'E'+$80		; $1C
	.byte	"CHECKSUM ERRO",'R'+$80			; $1D
	.byte	"MORE",'?'+$80				; $1E
	.byte	" OFFSET",'='+$80			; $1F
;
				; PROM Commands
PRCMDS:	.byte	CR,CR,"   PROM COMMANDS",CR,CR
	.byte	" C  CHECK PROM",CR
	.byte	" P  PROGRAM PROM",CR
	.byte	" R  READ PROM",CR
	.byte	" V  VERIFY PROM",CR
	.byte	" E  ERASE EEPROM",CR
	.byte	" N  CHANGE PROM TYPE",CR
	.byte	" T  TOGGLE VERIFY ",CR
	.byte	" A  ALTER MEMORY",CR
	.byte	" I  INVERT MEMORY",CR
	.byte	" S  CHECKSUM MEMORY",CR
	.byte	" ?  DISPLAY MENU",CR
	.byte	" X  EXIT",CR
	.byte	$00		; end of Commands
;
				; Table of redirections to Monitor subroutines
MONJMP:	jmp	ADDS1		; Add one to start address (S1)
	jmp	BLANK		; Outputs one Space to Display/Printer
	jmp	BLANK2		; Outputs two P's to Display/Printer
	jmp	CHEKA		; Add to checksum
	jmp	CHEKAR		; Add to checksum
	jmp	CHNGG		; Monitor / Command - Alter Memory
	jmp	VECKSM		; Monitor 3 Command - Verify Tapes
	jmp	CLR		; Clears Display/Printer pointers
	jmp	CLRCK		; Clear CKSUM
	jmp	COMIN		; Re-enter command interpreter
	jmp	CRCK		; Outputs Printer Buffer to Printer
	jmp	CRLF		; Outputs CR, LF & NUL to Active Output Device
	jmp	CRLOW		; Outputs CR and LF to Display/Printer
	jmp	RED1		; Inputs one character from Keyboard to A, with echo to Display/Printer
	jmp	DELAY		; Delay 1-bit time as given by baud rate
	jmp	GETKEY		; Get a character from keyboard
	jmp	GETTTY		; Get a character from TTY into A (saves X)
	jmp	INALL		; Inputs one ASCII character from Active Input Device to A
	jmp	INCS2		; Increment vertical count
	jmp	KDISA		; Monitor K Command - Disassemble Memory
	jmp	LDAY		; Simulates lda (n),y without Page Zero
	jmp	LL		; Set I/O to terminal
	jmp	MEM		; Monitor M Command - Display Memory
	jmp	NUMA		; Converts two hex numbers in A from binary to ASCII and outputs to Active Output Device
	jmp	NXT5		; Monitor SPACE Command - show next 5 memory locations
	jmp	OUTALL		; Outputs ASCII character in A to Active Output Device
	jmp	OUTCK		; Add to checksum and print
	jmp	OUTCKS		; Get character specified by start address (S1)
	jmp	OUTCK1		; Output checksum
	jmp	OUTDD1		; Convert X into real address for Display and output it
	jmp	OUTDP1		; Output a character to Display
	jmp	OUTPUT		; Outputs ASCII character in A to Display/Printer
	jmp	PATC18		; Reset PRIFLG
	jmp	PSLS		; On delete key output slash if TTY & backup cursor if keyboard
	jmp	RBYTE		; Inputs two ASCII characters from Active Input Device: if hex, converts to binary with results in A
	jmp	ROONEK		; Wait if last key still down (rollover)
	jmp	SADDR		; Subroutine store at ADDR and compare without page zero
	jmp	DU10B		; Output last record
	jmp	STBYTE		; Store and Check Memory Fail
	jmp	TOGTA1		; Monitor 1 Command - Toggle Tape 1 Control
	jmp	TOGTA2		; Monitor 2 Command - Toggle Tape 2 Control
	jmp	WHEREI		; Sets up the Active Input Device and loads INFLG
	jmp	WHEREO		; Sets up the Active Output Device and loads OUTFLG
	jmp	WRAX		; Write A then X in ASCII to the output device
;
			; *** PROM Configuration Data ***
			; byte 1 -  Size ?
			; byte 2 - ? bit 6 tested ?
			; byte 3 - ? bits 6 and 7 tested ?
			; byte 4 - ?
			; byte 5 - ?
			; byte 6 - ?
			; byte 7 - ?
			; byte 8 - ? written to $7000 latch Programming voltage
			; byte 9 - ? bit 7 tested 68764
			; byte 10 - ? bits 6 and 7 tested bit 7=EPROM ?
			; byte 11 - ? bits 6 and 7 tested bit 7=EEPROM ?
			; byte 12 - ? 68764 only ?
;
;		 1   2   3   4   5   6   7   8   9   10  11  12
L7F2B:	.byte	$03,$9C,$40,$00,$34,$8A,$11,$FA,$00,$F8,$00,$00	; 2508	1K EPROM
	.byte	$07,$9C,$40,$08,$34,$8A,$11,$FA,$00,$F8,$00,$00	; 2716	2K EPROM
	.byte	$07,$9C,$40,$08,$34,$80,$81,$D2,$00,$96,$81,$00	; 2816	2K EEPROM
	.byte	$0F,$98,$40,$18,$14,$09,$09,$FA,$00,$F8,$00,$00	; 2532	4K EPROM
	.byte	$0F,$8C,$80,$28,$1B,$0C,$05,$FA,$00,$F8,$00,$00	; 2732	4K EPROM
	.byte	$0F,$8C,$80,$28,$1B,$0C,$05,$D2,$00,$F8,$00,$00	; 2732A	4K EPROM
	.byte	$1F,$EB,$40,$58,$D4,$39,$09,$FA,$00,$F8,$00,$00	; 2564	8K EPROM
	.byte	$1F,$6D,$40,$A8,$34,$88,$43,$D2,$00,$F8,$00,$00	; 2764	8K EPROM
	.byte	$03,$9C,$40,$08,$34,$8A,$11,$FA,$00,$F8,$00,$00	; 2758	1K EPROM
	.byte	$03,$9C,$40,$08,$34,$8A,$11,$FA,$80,$F8,$00,$00	; 2758L	1K EPROM
	.byte	$07,$9C,$40,$08,$34,$88,$01,$D2,$00,$96,$81,$00	; 5213	2K EEPROM
	.byte	$07,$98,$40,$08,$14,$0A,$11,$FA,$00,$3F,$80,$00	; 48016	2K EEPROM
	.byte	$1F,$88,$80,$58,$14,$00,$21,$FA,$40,$0A,$00,$07	; 68764	8K EPROM
;
	.byte	$03,$00,$00,$00,$00,$00,$00,$32,$00,$02,$00,$00	; 
;
			; *** First part of PROM types ***
PRTYP1:	.byte	$25	; '2508' EPROM (1K)
	.byte	$27	; '2716' EPROM (2K)
	.byte	$28	; '2816' EEPROM (2K)
	.byte	$25	; '2532' EPROM (4K)
	.byte	$27	; '2732' EPROM (4K)
	.byte	$27	; '2732A' EPROM (4K)
	.byte	$25	; '2564' EPROM (8K)
	.byte	$27	; '2764' EPROM (8K)
	.byte	$27	; '2758' EPROM (1K)
	.byte	$27	; '2758L' EPROM (1K)
	.byte	$52	; '5213' EEPROM (2K)
	.byte	$48	; '48016' EEPROM (2K)
	.byte	$68	; '68764' EPROM (8K)
;
			; *** Second part of PROM types ***
PRTYP2:	.byte	$08
	.byte	$16
	.byte	$16
	.byte	$32
	.byte	$32
	.byte	$32
	.byte	$64
	.byte	$64
	.byte	$58
	.byte	$58
	.byte	$13
	.byte	$01
	.byte	$76
;
			; *** Third part of PROM types ***
PRTYP3:	.byte	SPACE
	.byte	SPACE
	.byte	SPACE
	.byte	SPACE
	.byte	SPACE
	.byte	'A'
	.byte	SPACE
	.byte	SPACE
	.byte	SPACE
	.byte	'L'
	.byte	SPACE
	.byte	'6'
	.byte	'4'
;
	.byte	$FF,$FF,$FF,$FF,$FF,$D4	; packing ?
