From 9fa90e2265b0d54e3fd9e6ec0227821f6a09d9de Mon Sep 17 00:00:00 2001 From: Greg King Date: Thu, 24 Oct 2019 05:15:42 -0400 Subject: [PATCH 079/170] Added VERA peek() and poke() to the cx16 library. They simplify C programs' direct access to VERA's internal address space. --- include/cx16.h | 19 ++++++++++++++----- libsrc/cx16/vpeek.s | 19 +++++++++++++++++++ libsrc/cx16/vpoke.s | 21 +++++++++++++++++++++ libsrc/cx16/vset.s | 20 ++++++++++++++++++++ 4 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 libsrc/cx16/vpeek.s create mode 100644 libsrc/cx16/vpoke.s create mode 100644 libsrc/cx16/vset.s diff --git a/include/cx16.h b/include/cx16.h index db32d846..a2f52850 100644 --- a/include/cx16.h +++ b/include/cx16.h @@ -144,9 +144,10 @@ struct __emul { unsigned char debug; /* Boolean: debugging enabled */ unsigned char vera_action; /* Boolean: displaying VERA activity */ unsigned char keyboard; /* Boolean: displaying typed keys */ - unsigned char echo; /* Boolean: Kernal output echoed to host */ + unsigned char echo; /* How Kernal output should be echoed to host */ unsigned char save_on_exit; /* Boolean: save SD card when quitting */ - unsigned char unused[0xD - 0x5]; + unsigned char gif_method; /* How GIF movie is being recorded */ + unsigned char unused[0xD - 0x6]; unsigned char keymap; /* Keyboard layout number */ const char detect[2]; /* "16" if running on x16emu */ }; @@ -173,16 +174,24 @@ signed char get_ostype (void); ** Positive -- release build */ -void __fastcall__ set_tv (unsigned char); -/* Set the video mode the machine will use. +void __fastcall__ set_tv (unsigned char type); +/* Set the video type that the machine will use. ** Call with a TV_xx constant. */ -unsigned char __fastcall__ videomode (unsigned char Mode); +unsigned char __fastcall__ videomode (unsigned char mode); /* Set the video mode, return the old mode. Call with one of the VIDEOMODE_xx ** constants. */ +unsigned char __fastcall__ vpeek (unsigned long addr); +/* Get a byte from a location in VERA's internal address space. */ + +void __fastcall__ vpoke (unsigned char data, unsigned long addr); +/* Put a byte into a location in VERA's internal address space. +** (addr is second instead of first for the sake of code efficiency.) +*/ + /* End of cX16.h */ diff --git a/libsrc/cx16/vpeek.s b/libsrc/cx16/vpeek.s new file mode 100644 index 00000000..0c1a9465 --- /dev/null +++ b/libsrc/cx16/vpeek.s @@ -0,0 +1,19 @@ +; +; 2019-10-22, Greg King +; +; unsigned char fastcall vpeek (unsigned long addr); +; /* Get a byte from a location in VERA's internal address space. */ +; + + .export _vpeek + + .import vset + .include "cx16.inc" + + +_vpeek: php ; (vset blocks interrupts) + jsr vset ; put VERA's address + ldx #>$0000 + lda VERA::DATA0 ; read VERA port zero + plp + rts diff --git a/libsrc/cx16/vpoke.s b/libsrc/cx16/vpoke.s new file mode 100644 index 00000000..8c21e9b2 --- /dev/null +++ b/libsrc/cx16/vpoke.s @@ -0,0 +1,21 @@ +; +; 2019-10-22, Greg King +; +; void fastcall vpoke (unsigned char data, unsigned long addr); +; /* Put a byte into a location in VERA's internal address space. +; ** (addr is second instead of first for the sake of code efficiency.) +; */ +; + + .export _vpoke + + .import vset, popa + .include "cx16.inc" + + +_vpoke: php ; (vset blocks interrupts) + jsr vset ; put VERA's address + jsr popa + sta VERA::DATA0 ; write data to VERA port zero + plp + rts diff --git a/libsrc/cx16/vset.s b/libsrc/cx16/vset.s new file mode 100644 index 00000000..9178850e --- /dev/null +++ b/libsrc/cx16/vset.s @@ -0,0 +1,20 @@ +; +; 2019-10-22, Greg King +; +; Set the __far__ address that VERA will use for data access. +; This is a support function for the fastcall functions vpeek() and vpoke(). +; + + .export vset + + .importzp sreg + .include "cx16.inc" + + +vset: ldy sreg + sei ; don't let interrupt handlers interfere + stz VERA::CTRL ; set address for VERA's data port zero + sta VERA::ADDR + stx VERA::ADDR+1 + sty VERA::ADDR+2 + rts -- 2.26.0