diff --git a/asminc/cbm_kernal.inc b/asminc/cbm_kernal.inc
index 5f41c6267..4d78cf93f 100644
--- a/asminc/cbm_kernal.inc
+++ b/asminc/cbm_kernal.inc
@@ -7,8 +7,13 @@
.if .def(__CX16__)
; CX16 extended jump table
+ KBDBUF_PEEK := $FEBD
+ KBDBUF_GET_MODIFIERS := $FEC0
+ KBDBUF_PUT := $FEC3
+ I2C_READ_BYTE := $FEC6
+ I2C_WRITE_BYTE := $FEC9
+ CX_MONITOR := $FECC
ENTROPY_GET := $FECF
- KEYBRD_BUF_PUT := $FED2
CONSOLE_SET_PAGE_MSG := $FED5
CONSOLE_PUT_IMAGE := $FED8
CONSOLE_INIT := $FEDB
@@ -52,7 +57,7 @@
CLOCK_GET_DATE_TIME := $FF50
JOYSTICK_SCAN := $FF53
JOYSTICK_GET := $FF56
- SCREEN_SET_MODE := $FF5F
+ SCREEN_MODE := $FF5F
SCREEN_SET_CHARSET := $FF62
MOUSE_CONFIG := $FF68
MOUSE_GET := $FF6B
diff --git a/asminc/cx16.inc b/asminc/cx16.inc
index 4e5971593..268d701d6 100644
--- a/asminc/cx16.inc
+++ b/asminc/cx16.inc
@@ -1,5 +1,5 @@
;
-; CX16 r38 definitions
+; CX16 r39 definitions
;
; ---------------------------------------------------------------------------
@@ -104,6 +104,10 @@ PI
; ---------------------------------------------------------------------------
; Zero page
+; Banking registers
+RAM_BANK := $00
+ROM_BANK := $01
+
; GEOS and graphics pseudo-registers
.struct gREG
.org $02
@@ -224,7 +228,7 @@ PI
; Kernal
KTEMP2 := $80 ; 2 bytes for temporary storage
IMPARM := $82 ; Pointer for PRIMM function
-FNAM := $8C ; Pointer to filename
+FNAM := $8A ; Pointer to filename
; BASIC
TXTPTR := $EE ; Pointer into BASIC source code
@@ -234,14 +238,13 @@ TXTPTR := $EE ; Pointer into BASIC source code
BASIC_BUF := $0200 ; Location of command-line
BASIC_BUF_LEN = 81 ; Maximum length of command-line
-SCREEN_MODE := $0261 ; Current screen mode (set by SCREEN_SET_MODE)
SCREEN_PTR := $0262 ; Pointer to current row on text screen (16 bits)
-STATUS := $0286 ; Status from previous I/O operation
-IN_DEV := $028A ; Current input device number
-OUT_DEV := $028B ; Current output device number
-FNAM_LEN := $028E ; Length of filename
-SECADR := $0290 ; Secondary address
-DEVNUM := $0291 ; Device number
+STATUS := $0289 ; Status from previous I/O operation
+IN_DEV := $028D ; Current input device number
+OUT_DEV := $028E ; Current output device number
+FNAM_LEN := $0291 ; Length of filename
+SECADR := $0293 ; Secondary address
+DEVNUM := $0294 ; Device number
CURS_COLOR := $0373 ; Color under the cursor
CHARCOLOR := $0376 ; Cursor's color nybbles (high: background, low: foreground)
RVS := $0377 ; Reverse flag
@@ -268,6 +271,42 @@ NMIVec := $0318
; ---------------------------------------------------------------------------
; I/O locations
+; 65C22 Versatile Interface Adapter
+.struct VIA1 ; Versatile Interface Adapter
+ .org $9F00
+ PRB .byte ; mouse, LED, VIC bus (Port Register B)
+ PRA .byte ; keyboard, controllers (Port Register A)
+ DDRB .byte ; (Data Direction Register B)
+ DDRA .byte ; (Data Direction Register A)
+ T1 .word ; (Timer 1)
+ T1L .word ; (Timer 1 Latch)
+ T2 .word ; (Timer 2)
+ SR .byte ; (Shift Register)
+ ACR .byte ; (Auxiliary Control Register)
+ PCR .byte ; (Peripheral Control Register)
+ IFR .byte ; (Interrupt Flags Register)
+ IER .byte ; (Interrupt Enable Register)
+ PRA2 .byte ; keyboard, controllers (PRA without handshake)
+.endstruct
+
+; 65C22 Versatile Interface Adapter
+.struct VIA2
+ .org $9F10
+ PRB .byte
+ PRA .byte
+ DDRB .byte
+ DDRA .byte
+ T1 .word
+ T1L .word
+ T2 .word
+ SR .byte
+ ACR .byte
+ PCR .byte
+ IFR .byte
+ IER .byte
+ PRA2 .byte
+.endstruct
+
; Video Enhanced Retro Adapter
; Has audio and SPI.
.scope VERA
@@ -496,44 +535,16 @@ NMIVec := $0318
.endstruct
.endscope
-; 65C22
-.struct VIA1 ; Versatile Interface Adapter
- .org $9F60
- PRB .byte ; ROM bank, IEC (Port Register B)
- PRA .byte ; RAM bank (Port Register A)
- DDRB .byte ; (Data Direction Register B)
- DDRA .byte ; (Data Direction Register A)
- T1 .word ; (Timer 1)
- T1L .word ; (Timer 1 Latch)
- T2 .word ; (Timer 2)
- SR .byte ; (Shift Register)
- ACR .byte ; (Auxiliary Control Register)
- PCR .byte ; (Peripheral Control Register)
- IFR .byte ; (Interrupt Flags Register)
- IER .byte ; (Interrupt Enable Register)
- PRA2 .byte ; RAM bank (Port Register A without handshaking)
+; YM2151 audio chip
+.struct YM2151
+ .org $9F40
+ .union
+ STATUS .byte
+ ADDR .byte
+ .endunion
+ DATA .byte
.endstruct
-; 65C22
-.struct VIA2
- .org $9F70
- PRB .byte ; Mouse communication ?
- PRA .byte ; NES controller communication
- DDRB .byte
- DDRA .byte
- T1 .word
- T1L .word
- T2 .word
- SR .byte
- ACR .byte
- PCR .byte
- IFR .byte
- IER .byte
- PRA2 .byte
-.endstruct
-
-; Real-Time Clock
-
; X16 Emulator device
; This device doesn't exist on the real machine.
.struct EMULATOR
@@ -554,8 +565,7 @@ NMIVec := $0318
; ---------------------------------------------------------------------------
; Banked RAM and ROM
-KEY_COUNT := $A00A ; (bank 0) Number of keys in input buffer
-TIMER := $A037 ; (bank 0) 60 Hz. timer (3 bytes, big-endian)
+TIMER := $A03B ; (bank 0) 60 Hz. timer (3 bytes, big-endian)
.struct BANK
.org $A000
diff --git a/cfg/cx16-asm.cfg b/cfg/cx16-asm.cfg
index 92c9d96f7..1b1cce8ec 100644
--- a/cfg/cx16-asm.cfg
+++ b/cfg/cx16-asm.cfg
@@ -1,5 +1,3 @@
-# Assembly configuration for R38
-
FEATURES {
STARTADDRESS: default = $0801;
}
diff --git a/doc/cx16.sgml b/doc/cx16.sgml
index 9e743064f..78a51206b 100644
--- a/doc/cx16.sgml
+++ b/doc/cx16.sgml
@@ -200,15 +200,23 @@ access to hardware located in the address space. Some variables are
structures, accessing the struct fields will access the chip registers.
The names in the parentheses denote the symbols to be used for static linking
-of the drivers. The names fit into the 8.3 character limit of the SD-Card's
+of the drivers. The names fit into the old 8.3-character limit of the SD-Card's
FAT32 file-system.
@@ -230,7 +238,7 @@ point to
@@ -248,10 +256,10 @@ point to
diff --git a/include/cx16.h b/include/cx16.h
index 4100da631..42495c862 100644
--- a/include/cx16.h
+++ b/include/cx16.h
@@ -3,7 +3,7 @@
/* cx16.h */
/* */
/* CX16 system-specific definitions */
-/* For prerelease 38 */
+/* For prerelease 39 */
/* */
/* */
/* This software is provided "as-is", without any expressed or implied */
@@ -169,11 +169,16 @@ enum {
};
/* Video modes for videomode() */
-#define VIDEOMODE_40x30 0x00
-#define VIDEOMODE_80x60 0x02
-#define VIDEOMODE_40COL VIDEOMODE_40x30
+#define VIDEOMODE_80x60 0x00
+#define VIDEOMODE_80x30 0x01
+#define VIDEOMODE_40x60 0x02
+#define VIDEOMODE_40x30 0x03
+#define VIDEOMODE_40x15 0x04
+#define VIDEOMODE_20x30 0x05
+#define VIDEOMODE_20x15 0x06
#define VIDEOMODE_80COL VIDEOMODE_80x60
-#define VIDEOMODE_320x200 0x80
+#define VIDEOMODE_40COL VIDEOMODE_40x30
+#define VIDEOMODE_320x240 0x80
#define VIDEOMODE_SWAP (-1)
/* VERA's address increment/decrement numbers */
@@ -221,6 +226,13 @@ enum {
/* Define hardware. */
+#define RAM_BANK (*(unsigned char *)0x00)
+#define ROM_BANK (*(unsigned char *)0x01)
+
+#include <_6522.h>
+#define VIA1 (*(volatile struct __6522 *)0x9F00)
+#define VIA2 (*(volatile struct __6522 *)0x9F10)
+
/* A structure with the Video Enhanced Retro Adapter's external registers */
struct __vera {
unsigned short address; /* Address for data ports */
@@ -271,12 +283,15 @@ struct __vera {
};
#define VERA (*(volatile struct __vera *)0x9F20)
-#include <_6522.h>
-#define VIA1 (*(volatile struct __6522 *)0x9F60)
-#define VIA2 (*(volatile struct __6522 *)0x9F70)
-
-#define RAM_BANK (VIA1.pra)
-#define ROM_BANK (VIA1.prb)
+/* Audio chip */
+struct __ym2151 {
+ union {
+ unsigned char reg; /* Register number for data */
+ unsigned char status; /* Busy flag */
+ };
+ unsigned char data;
+};
+#define YM2151 (*(volatile struct __ym2151 *)0x9F40)
/* A structure with the x16emu's settings registers */
struct __emul {
diff --git a/libsrc/cx16/cgetc.s b/libsrc/cx16/cgetc.s
index 2372b431a..b4354197f 100644
--- a/libsrc/cx16/cgetc.s
+++ b/libsrc/cx16/cgetc.s
@@ -1,5 +1,5 @@
;
-; 2019-12-22, Greg King
+; 2022-03-29, Greg King
;
; char cgetc (void);
; /* Return a character from the keyboard. */
@@ -13,6 +13,8 @@
.macpack generic
+screen_addr := $1B000 ; VRAM address of text screen
+
_cgetc: jsr _kbhit
bnz L3 ; Jump if there are already chars waiting
@@ -57,8 +59,9 @@ setcursor:
stz VERA::CTRL ; Use port 0
lda CURS_Y
+ add #<(>screen_addr)
sta VERA::ADDR+1 ; Set row number
- lda #VERA::INC1 ; Increment address by one
+ lda #VERA::INC1 | ^screen_addr ; Increment address by one
sta VERA::ADDR+2
lda CURS_X ; Get character column
asl a
diff --git a/libsrc/cx16/cpeekc.s b/libsrc/cx16/cpeekc.s
index 6756d995a..9f4b3b296 100644
--- a/libsrc/cx16/cpeekc.s
+++ b/libsrc/cx16/cpeekc.s
@@ -1,6 +1,6 @@
;
; 2016-02-28, Groepaz
-; 2020-04-29, Greg King
+; 2022-03-29, Greg King
;
; char cpeekc (void);
; /* Return the character from the current cursor position. */
@@ -9,13 +9,18 @@
.export _cpeekc
.include "cx16.inc"
+ .macpack generic
+screen_addr := $1B000 ; VRAM address of text screen
+
_cpeekc:
stz VERA::CTRL ; use port 0
lda CURS_Y
+ add #<(>screen_addr)
sta VERA::ADDR+1 ; set row number
- stz VERA::ADDR+2
+ lda #^screen_addr
+ sta VERA::ADDR+2
lda CURS_X ; get character column
asl a ; each character has two bytes
sta VERA::ADDR
diff --git a/libsrc/cx16/cpeekcolor.s b/libsrc/cx16/cpeekcolor.s
index 9c167b07a..668f2a0da 100644
--- a/libsrc/cx16/cpeekcolor.s
+++ b/libsrc/cx16/cpeekcolor.s
@@ -1,5 +1,5 @@
;
-; 2020-04-30, Greg King
+; 2022-03-29, Greg King
;
; unsigned char cpeekcolor (void);
; /* Return the colors from the current cursor position. */
@@ -8,8 +8,11 @@
.export _cpeekcolor
.include "cx16.inc"
+ .macpack generic
+screen_addr := $1B000 ; VRAM address of text screen
+
_cpeekcolor:
php
lda CURS_FLAG ; is the cursor currently off?
@@ -22,8 +25,10 @@ _cpeekcolor:
@L1: stz VERA::CTRL ; use port 0
lda CURS_Y
+ add #<(>screen_addr)
sta VERA::ADDR+1 ; set row number
- stz VERA::ADDR+2
+ lda #^screen_addr
+ sta VERA::ADDR+2
lda CURS_X ; get character column
sec ; color attribute is second byte
rol a
diff --git a/libsrc/cx16/cpeekrevers.s b/libsrc/cx16/cpeekrevers.s
index fd7428779..1d10a2654 100644
--- a/libsrc/cx16/cpeekrevers.s
+++ b/libsrc/cx16/cpeekrevers.s
@@ -1,6 +1,6 @@
;
; 2016-02-28, Groepaz
-; 2020-04-30, Greg King
+; 2022-03-29, Greg King
;
; unsigned char cpeekrevers (void);
; /* Return the reverse attribute from the current cursor position.
@@ -11,8 +11,11 @@
.export _cpeekrevers
.include "cx16.inc"
+ .macpack generic
+screen_addr := $1B000 ; VRAM address of text screen
+
_cpeekrevers:
php
lda CURS_FLAG ; is the cursor currently off?
@@ -25,8 +28,10 @@ _cpeekrevers:
@L1: stz VERA::CTRL ; use port 0
lda CURS_Y
+ add #<(>screen_addr)
sta VERA::ADDR+1 ; set row number
- stz VERA::ADDR+2
+ lda #^screen_addr
+ sta VERA::ADDR+2
lda CURS_X ; get character column
asl a ; each character has two bytes
sta VERA::ADDR
diff --git a/libsrc/cx16/cputc.s b/libsrc/cx16/cputc.s
index 4a7034e59..22327d25a 100644
--- a/libsrc/cx16/cputc.s
+++ b/libsrc/cx16/cputc.s
@@ -11,8 +11,11 @@
.import gotoxy, PLOT
.include "cx16.inc"
+ .macpack generic
+screen_addr := $1B000 ; VRAM address of text screen
+
; Move to a cursor position, then print a character.
_cputcxy:
@@ -79,16 +82,17 @@ putchar:
tax
stz VERA::CTRL ; Use port 0
lda CURS_Y
+ add #<(>screen_addr)
sta VERA::ADDR+1 ; Set row number
- lda #VERA::INC1 ; Address increments by one
+ lda #VERA::INC1 | ^screen_addr ; Address increments by one
sta VERA::ADDR+2
ldy CURS_X ; Get character column into .Y
tya
asl a ; Each character has two bytes
sta VERA::ADDR
- stx VERA::DATA0
+ stx VERA::DATA0 ; Put the character
lda CHARCOLOR
- sta VERA::DATA0
+ sta VERA::DATA0 ; Put its colors
rts
diff --git a/libsrc/cx16/crt0.s b/libsrc/cx16/crt0.s
index be83927fc..e37a64a7c 100644
--- a/libsrc/cx16/crt0.s
+++ b/libsrc/cx16/crt0.s
@@ -1,5 +1,5 @@
;
-; Start-up code for cc65 (CX16 r35 version)
+; Start-up code for cc65 (CX16 r39 version)
;
.export _exit
@@ -20,7 +20,7 @@
.segment "STARTUP"
Start: tsx
- stx spsave ; Save the system stack ptr
+ stx spsave ; Save the system stack ptr.
; Save space by putting some of the start-up code in the ONCE segment
; which will be re-used by the BSS segment, the heap, and the C stack.
@@ -46,26 +46,14 @@ _exit:
jsr donelib
-.if 0 ; (We don't need to preserve zero-page space for cc65's variables.)
-; Copy back the zero-page stuff.
-
- ldx #zpspace-1
-L2: lda zpsave,x
- sta sp,x
- dex
- bpl L2
-.endif
-
; Restore the system stuff.
ldx spsave
txs ; Restore stack pointer
ldx ramsave
- stx VIA1::PRA ; Restore former RAM bank
- lda VIA1::PRB
- and #<~$07
- ora #$04
- sta VIA1::PRB ; Change back to BASIC ROM
+ stx RAM_BANK ; Restore former RAM bank
+ lda #$04
+ sta ROM_BANK ; Change back to BASIC ROM
; Back to BASIC.
@@ -79,26 +67,14 @@ L2: lda zpsave,x
init:
; Change from BASIC's ROM to Kernal's ROM.
- lda VIA1::PRB
- and #<~$07
- sta VIA1::PRB
+ stz ROM_BANK
; Change to the second RAM bank.
- lda VIA1::PRA
+ lda RAM_BANK
sta ramsave ; Save the current RAM bank number
lda #$01
- sta VIA1::PRA
-
-.if 0 ; (We don't need to preserve zero-page space for cc65's variables.)
-; Save the zero-page locations that we need.
-
- ldx #zpspace-1
-L1: lda sp,x
- sta zpsave,x
- dex
- bpl L1
-.endif
+ sta RAM_BANK
; Set up the stack.
@@ -125,6 +101,3 @@ L1: lda sp,x
ramsave:
.res 1
spsave: .res 1
-.if 0
-zpsave: .res zpspace
-.endif
diff --git a/libsrc/cx16/joy/cx16-std.s b/libsrc/cx16/joy/cx16-std.s
index 5c10c0592..a40fcb061 100644
--- a/libsrc/cx16/joy/cx16-std.s
+++ b/libsrc/cx16/joy/cx16-std.s
@@ -2,7 +2,7 @@
; Standard joystick driver for the CX16.
; May be installed multiple times when statically linked to an application.
;
-; 2019-12-24, Greg King
+; 2021-04-07, Greg King
;
.include "joy-kernel.inc"
@@ -41,7 +41,7 @@
; ------------------------------------------------------------------------
; Constant
-JOY_COUNT = 2 ; Number of joysticks we support
+JOY_COUNT = $05 ; Number of joysticks we support
; ------------------------------------------------------------------------
; Data.
@@ -51,8 +51,7 @@ JOY_COUNT = 2 ; Number of joysticks we support
; ------------------------------------------------------------------------
; INSTALL routine -- is called after the driver is loaded into memory.
-; If possible, check if the hardware is present, and determine the amount
-; of memory available.
+; If possible, check if the hardware is present.
; Must return a JOY_ERR_xx code in .XA .
INSTALL:
@@ -77,8 +76,10 @@ COUNT: lda #