diff --git a/compiler/res/prog8lib/c64/syslib.p8 b/compiler/res/prog8lib/c64/syslib.p8 index ba58ef10d..cf02611a6 100644 --- a/compiler/res/prog8lib/c64/syslib.p8 +++ b/compiler/res/prog8lib/c64/syslib.p8 @@ -699,6 +699,23 @@ cx16 { &uword r14 = $cf1c &uword r15 = $cf1e + &word r0s = $cf00 + &word r1s = $cf02 + &word r2s = $cf04 + &word r3s = $cf06 + &word r4s = $cf08 + &word r5s = $cf0a + &word r6s = $cf0c + &word r7s = $cf0e + &word r8s = $cf10 + &word r9s = $cf12 + &word r10s = $cf14 + &word r11s = $cf16 + &word r12s = $cf18 + &word r13s = $cf1a + &word r14s = $cf1c + &word r15s = $cf1e + &ubyte r0L = $cf00 &ubyte r1L = $cf02 &ubyte r2L = $cf04 @@ -732,4 +749,38 @@ cx16 { &ubyte r13H = $cf1b &ubyte r14H = $cf1d &ubyte r15H = $cf1f + + &byte r0sL = $cf00 + &byte r1sL = $cf02 + &byte r2sL = $cf04 + &byte r3sL = $cf06 + &byte r4sL = $cf08 + &byte r5sL = $cf0a + &byte r6sL = $cf0c + &byte r7sL = $cf0e + &byte r8sL = $cf10 + &byte r9sL = $cf12 + &byte r10sL = $cf14 + &byte r11sL = $cf16 + &byte r12sL = $cf18 + &byte r13sL = $cf1a + &byte r14sL = $cf1c + &byte r15sL = $cf1e + + &byte r0sH = $cf01 + &byte r1sH = $cf03 + &byte r2sH = $cf05 + &byte r3sH = $cf07 + &byte r4sH = $cf09 + &byte r5sH = $cf0b + &byte r6sH = $cf0d + &byte r7sH = $cf0f + &byte r8sH = $cf11 + &byte r9sH = $cf13 + &byte r10sH = $cf15 + &byte r11sH = $cf17 + &byte r12sH = $cf19 + &byte r13sH = $cf1b + &byte r14sH = $cf1d + &byte r15sH = $cf1f } diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 8fa4ea50b..1d6e60205 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -95,7 +95,7 @@ cx16 { &uword IRQ_VEC = $FFFE ; 65c02 interrupt vector, determined by the kernal if banked in -; the sixteen virtual 16-bit registers +; the sixteen virtual 16-bit registers in both normal unsigned mode and signed mode (s) &uword r0 = $0002 &uword r1 = $0004 &uword r2 = $0006 @@ -113,6 +113,23 @@ cx16 { &uword r14 = $001e &uword r15 = $0020 + &word r0s = $0002 + &word r1s = $0004 + &word r2s = $0006 + &word r3s = $0008 + &word r4s = $000a + &word r5s = $000c + &word r6s = $000e + &word r7s = $0010 + &word r8s = $0012 + &word r9s = $0014 + &word r10s = $0016 + &word r11s = $0018 + &word r12s = $001a + &word r13s = $001c + &word r14s = $001e + &word r15s = $0020 + &ubyte r0L = $0002 &ubyte r1L = $0004 &ubyte r2L = $0006 @@ -147,6 +164,39 @@ cx16 { &ubyte r14H = $001f &ubyte r15H = $0021 + &byte r0sL = $0002 + &byte r1sL = $0004 + &byte r2sL = $0006 + &byte r3sL = $0008 + &byte r4sL = $000a + &byte r5sL = $000c + &byte r6sL = $000e + &byte r7sL = $0010 + &byte r8sL = $0012 + &byte r9sL = $0014 + &byte r10sL = $0016 + &byte r11sL = $0018 + &byte r12sL = $001a + &byte r13sL = $001c + &byte r14sL = $001e + &byte r15sL = $0020 + + &byte r0sH = $0003 + &byte r1sH = $0005 + &byte r2sH = $0007 + &byte r3sH = $0009 + &byte r4sH = $000b + &byte r5sH = $000d + &byte r6sH = $000f + &byte r7sH = $0011 + &byte r8sH = $0013 + &byte r9sH = $0015 + &byte r10sH = $0017 + &byte r11sH = $0019 + &byte r12sH = $001b + &byte r13sH = $001d + &byte r14sH = $001f + &byte r15sH = $0021 ; VERA registers diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index 8e4292bc9..02ef080de 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -609,12 +609,14 @@ flag such as Carry (Pc). .. note:: - The 'virtual' 16-bit registers from the Commander X16 can also be used as ``R0`` .. ``R15`` . + The 'virtual' 16-bit registers from the Commander X16 can also be specified as ``R0`` .. ``R15`` . This means you don't have to set them up manually before calling a subroutine that takes one or more parameters in those 'registers'. You can just list the arguments directly. *This also works on the Commodore-64!* (however they are not as efficient there because they're not in zeropage) In prog8 and assembly code these 'registers' are directly accessible too via - ``cx16.r0`` .. ``cx16.r15`` (they're memory mapped uword values) + ``cx16.r0`` .. ``cx16.r15`` (these are memory mapped uword values), + ``cx16.r0s`` .. ``cx16.r15s`` (these are memory mapped word values), + and ``L`` / ``H`` variants are also available to directly access the low and high bytes of these. Expressions diff --git a/examples/cx16/sincos.p8 b/examples/cx16/sincos.p8 index 5cc3d38c5..30ecfd4a8 100644 --- a/examples/cx16/sincos.p8 +++ b/examples/cx16/sincos.p8 @@ -78,7 +78,7 @@ main { ; circles with "degrees" from 0 to 255 for r in 0 to 255 { - pixelxw = (sin8(r)/2 + 80) as uword + pixelxw = ((sin8(r)/2 as word) + 80) as uword pixelyb = (cos8(r)/2 + height/2) as ubyte graphics.plot(pixelxw, pixelyb) }