view fake_cpm.sz8 @ 921:2be771c4dfbd

After reviewing the results of my test ROM again it seems pretty clear that the VBlank flag gets set at the same time as the vcounter changes
author Michael Pavone <pavone@retrodev.com>
date Tue, 26 Jan 2016 19:23:10 -0800
parents cf6149b7c6e5
children
line wrap: on
line source

CONSOLE_PORT equ 0
STATUS_PORT  equ 1
EXIT_PORT    equ 2
	org $E400
	jp handle_call
	ld a, (should_exit)
	dec a
	jr z, do_exit
	ld a, 1
	ld (should_exit), a
	jp $100
do_exit:
no_impl
	out (EXIT_PORT), a
should_exit:
	dc.b 0
	
console_in:
	in a, (CONSOLE_PORT)
	ld l, a
	ret
console_out:
	ld a, e
	out (CONSOLE_PORT), a
	ret
get_iobyte:
	ld a, (3)
	ld l, a
	ret
set_iobyte:
	ld a, e
	ld (3), a
	ret
write_string:
	ld c, '$'
	jp .start
.continue
	out (CONSOLE_PORT), a
	inc de
.start
	ld a, (de)
	cp c
	jr nz, .continue
	;flush output
	out (STATUS_PORT),a 
	ret
read_string:
	ld a, (de)
	ld c, a
	ld b, $A ;newline
	inc c
	inc de
	push de
	inc de
	jp .start
.continue
	in a, (CONSOLE_PORT)
	cp b
	jr z, .end
	ld (de), a
	inc de
.start
	dec c
	jr nz, .continue
	;todo: consume excess characters
.end
	pop hl
	ex de, hl
	sbc hl, de
	ld a, l
	ld (de), a
	ret

console_status:
	in a, (STATUS_PORT)
	ld l, a
	ret

handle_call:
	ld a, c
	or a
	jr z, do_exit
	dec a
	jr z, console_in
	dec a
	jr z, console_out
	dec a
	jr z, no_impl ;aux reader input
	dec a
	jr z, no_impl ;aux punch output
	dec a
	jr z, no_impl ;printer output
	dec a
	jr z, no_impl ;direct console IO
	dec a
	jr z, get_iobyte
	dec a
	jr z, set_iobyte
	dec a
	jr z, write_string
	dec a
	jr z, read_string
	dec a
	jr z, console_status
	jp no_impl