the program consists of 4 parts

part 1 is the basic program which loads at address $1001
part 2 is the setup routine which is at address $10C0
part 3 is the poke translation routine which is at address $1100
part 4 is the peek translation routine which is at address $1300



basic part:

5 if peek(1332)<>253 then print"THIS EMULATOR ONLY WORKS WITH 64KB MEMORY":end
10 color4,1
20 color0,1
30 color1,6
40 scnclr
50 sys4288
60 print"PET EMULATOR FOR PLUS4 BY BLACKY STARDUST"
70 clr
80 new


start: (load $10C0. orig $10C0)
	sei
	ldx #$15
	stx $2C
	ldx #$00
	stx $0308
	ldx #$11
	stx $0309
	ldx #$00
	stx $030A
	ldx #$13
	stx $030B
	cli
	rts


pokestart: (load $1100, orig $10C0)
	jsr $0473
	cmp #$97
	beq checkpoke
	cmp #$3A
	jmp $8BD9
checkpoke:
	pha
	lda $81
	cmp #$80
	beq checkrealpoke
	pla
	cmp #$3A
	jmp $8BD9
leavepoke:
	ldy #$00
	lda #$3A
	cmp #$3A
	jmp $8BD9
checkrealpoke:
	pla
	jsr $0473
	jsr $9DD2
	txa
	ldx $15
	ldy $14
	cpx #$00
	beq checkzppoke
	cpx #$01
	beq ignorepoke
	cpx #$02
	beq checkkeypoke
	cpx #$03
	beq ignorepoke
	cpx #$E8
	beq checksoundpoke
	cpx #$80
	beq checkscreenpoke
	cpx #$81
	beq checkscreenpoke
	cpx #$82
	beq checkscreenpoke
	cpx #$83
	beq checkscreenpoke
	cpx #$80
	bcc translatepoke
ignorepoke:
	jmp leavepoke
checkscreenpoke:
	jmp dorealscreenpoke
checksoundpoke:
	jmp dorealsoundpoke
checkkeypoke:
	jmp dorealkeypoke
translatepoke:
	pha
	txa
	clc
	adc #$11
	sta poker+2
	sty poker+1
	pla
	sei
	sta $FF3F
poker:
	sta $0000
	sta $FF3E
	cli
	jmp leavepoke
checkzppoke:
	cpy #$8D
	beq time1poke
	cpy #$8E
	beq time2poke
	cpy #$8F
	beq time3poke
	cpy #$9E
	beq ndxpoke
	cpy #$C4
	beq pnt1poke
	cpy #$C5
	beq pnt2poke
	cpy #$C6
	beq pntrpoke
	cpy #$D8
	beq cursypoke
	jmp leavepoke
time1poke:
	sta $A3
	jmp leavepoke
time2poke:
	sta $A4
	jmp leavepoke
time3poke:
	sta $A5
	jmp leavepoke
ndxpoke:
	sta $EF
	jmp leavepoke
pnt1poke:
	sta $C8
	jmp leavepoke
pnt2poke:
	sta $C9
	jmp leavepoke
pntrpoke:
	sta $CA
	jmp leavepoke
cursypoke:
	sta $CD
ignore2poke:
	jmp leavepoke
dorealkeypoke:
	cpy #$6F
	bcc ignore2poke
	cpy #$79
	bcc dokeypoke
	jmp leavepoke
dokeypoke:
	pha
	tya
	sec
	sbc #$48
	sta keypoke+1
	pla
keypoke:
	sta $0527
	jmp leavepoke
dorealscreenpoke:
	pha
	txa
	sec
	sbc #$74
	sta screenpoke+2
	sty screenpoke+1
	pla
	sta $0C00
	jmp leavepoke
dorealsoundpoke:
	cpy #$4B
	beq checksoundonoff
	cpy #$48
	beq checksoundfreq
	jmp leavepoke
soundon:
	.byte	$00
checksoundonoff:
	cmp #$10
	beq turnsoundon
	cmp #$00
	beq turnsoundoff
	jmp leavepoke
turnsoundon:
	lda $FF11
	ora #$1F
	sta $FF11
	lda #$01
	sta soundon
	jmp leavepoke
turnsoundoff:
	lda $FF11
	and #$F0
	sta $FF11
	lda #$00
	sta soundon
	jmp leavepoke
checksoundfreq:
	cmp #$00
	beq nosound
	sta soundpoke+1
	lda #$FF
	sec
soundpoke:
	sbc #$00
	pha
	and #$C0
	lsr
	lsr
	lsr
	lsr
	lsr
	lsr
	sta $FF10
	pla
	and #$20
	asl
	asl
	sta $FF0E
	lda soundon
	cmp #$00
	beq pokeback
	lda $FF11
	ora #$1F
	sta $FF11
pokeback:
	jmp leavepoke
nosound:
	lda $FF11
	and #$F0
	sta $FF11
	jmp leavepoke


peekstart: (load $1300, orig $1300)
	stx tempx
	jsr $0473
	cmp #$C2
	beq checkpeek
notpeek:
	ldx tempx
	lda #$00
	sta $0D
	jsr $0479
	jmp $941E
tempx:
	.byte	$00
checkpeek:
	lda $81
	cmp #$80
	beq checkrealpeek
	jmp normalpeek
checkrealpeek:
	jsr $0473
	jsr $9485
	lda $14
	pha
	lda $15
	pha
	jsr $9DE4
	ldx $15
	ldy $14
	cpx #$00
	beq checkzppeek
	cpx #$01
	beq normalpeek
	cpx #$02
	beq checkkeypeek
	cpx #$03
	beq normalpeek
	cpx #$80
	beq checkscreenpeek
	cpx #$81
	beq checkscreenpeek
	cpx #$82
	beq checkscreenpeek
	cpx #$83
	beq checkscreenpeek
	cpx #$80
	bcc translatepeek
normalpeek:
	ldy #$00
	sei
	sta $FF3F
	lda ($14),y
	sta $FF3E
	cli
donepeek:
	tay
	pla
	sta $15
	pla
	sta $14
	ldx tempx
	jmp $9A81
checkscreenpeek:
	jmp dorealscreenpeek
checkkeypeek:
	jmp checkrealkeypeek
translatepeek:
	txa
	clc
	adc #$11
	sta $15
	jmp normalpeek
checkzppeek:
	cpy #$34
	beq memsiz1peek
	cpy #$35
	beq memsiz2peek
	cpy #$8D
	beq time1peek
	cpy #$8E
	beq time2peek
	cpy #$8F
	beq time3peek
	cpy #$9E
	beq ndxpeek
	cpy #$C4
	beq pnt1peek
	cpy #$C5
	beq pnt2peek
	cpy #$C6
	beq pntrpeek
	cpy #$D5
	beq linelenpeek
	cpy #$D8
	beq cursypeek
	jmp normalpeek
memsiz1peek:
	lda #$00
	jmp donepeek
memsiz2peek:
	lda #$80
	jmp donepeek
time1peek:
	lda $A3
	jmp donepeek
time2peek:
	lda $A4
	jmp donepeek
time3peek:
	lda $A5
	jmp donepeek
ndxpeek:
	lda $EF
	jmp donepeek
pnt1peek:
	lda $C8
	jmp donepeek
pnt2peek:
	lda $C9
	jmp donepeek
pntrpeek:
	lda $CA
	jmp donepeek
linelenpeek:
	lda #$27
	jmp donepeek
cursypeek:
	lda $CD
	jmp donepeek
checkrealkeypeek:
	cpy #$6F
	bcc gonormalpeek
	cpy #$79
	bcc dokeypeek
gonormalpeek:
	jmp normalpeek
dokeypeek:
	tya
	sec
	sbc #$48
	sta $14
	lda #$05
	sta $15
	jmp normalpeek
dorealscreenpeek:
	txa
	sec
	sbc #$74
	sta $15
	jmp normalpeek