uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit d6036dec6b0b32ec7ce0c2630f0aaff8c1d3bdf8
parent ffded2f6422b8eabd76267c81c99370023cb4f4e
Author: neauoire <aliceffekt@gmail.com>
Date:   Fri,  9 Apr 2021 12:15:38 -0700

Revamped the screen example

Diffstat:
Mbuild.sh | 2+-
Mprojects/examples/blank.usm | 2+-
Mprojects/examples/dev.audio.usm | 2+-
Mprojects/examples/dev.screen.usm | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msrc/emulator.c | 16+++++++++-------
Msrc/ppu.c | 14+++++++++++++-
Msrc/ppu.h | 5+++--
7 files changed, 128 insertions(+), 38 deletions(-)

diff --git a/build.sh b/build.sh @@ -32,7 +32,7 @@ else fi echo "Assembling.." -./bin/assembler projects/examples/gui.shapes.usm bin/boot.rom +./bin/assembler projects/examples/dev.screen.usm bin/boot.rom echo "Running.." if [ "${2}" = '--cli' ]; diff --git a/projects/examples/blank.usm b/projects/examples/blank.usm @@ -11,7 +11,7 @@ |0140 ;Keys { key 1 } |0150 ;Mouse { x 2 y 2 state 1 chord 1 } |0160 ;File { pad 8 name 2 length 2 load 2 save 2 } -|0180 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } +|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } |01a0 ;DateTime { year 2 month 1 day 1 hour 1 minute 1 second 1 dotw 1 doty 2 isdst 1 refresh 1 } |01F0 ;System { pad 8 r 2 g 2 b 2 } diff --git a/projects/examples/dev.audio.usm b/projects/examples/dev.audio.usm @@ -33,7 +33,7 @@ |0150 ;Keys { vector 2 key 1 } |0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 } |0170 ;File { pad 8 name 2 length 2 load 2 save 2 } -|0180 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } +|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 } ( vectors ) diff --git a/projects/examples/dev.screen.usm b/projects/examples/dev.screen.usm @@ -15,6 +15,7 @@ ;label { x 2 y 2 addr 2 } ;slider { x1 2 y 2 x2 2 pos 2 } ;selection { byte 1 } +;addr { short 2 } ;theme { r1 1 r2 1 r3 1 r4 1 g1 1 g2 1 g3 1 g4 1 @@ -32,7 +33,7 @@ ( theme ) #127f =System.r #34e7 =System.g #56c4 =System.b ( vectors ) ,on-mouse =Mouse.vector - #00a0 =window.w + #00b0 =window.w #0050 =window.h ( center window ) @@ -64,19 +65,19 @@ BRK ~Mouse.y ~window.y1 SUB2 STEP8 DUP2 #0010 NEQ2 ^$no-touch-red JNZ - ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-red JNZ - ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-red JNZ - ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.r1 #00 ~selection ADD2 POK2 + ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-red JNZ + ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-red JNZ + ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.r1 #00 ~selection ADD2 POK2 $no-touch-red DUP2 #0020 NEQ2 ^$no-touch-green JNZ - ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-green JNZ - ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-green JNZ - ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.g1 #00 ~selection ADD2 POK2 + ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-green JNZ + ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-green JNZ + ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.g1 #00 ~selection ADD2 POK2 $no-touch-green DUP2 #0030 NEQ2 ^$no-touch-blue JNZ - ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-blue JNZ - ~Mouse.x ~window.x1 #008c ADD2 GTH2 ^$no-touch-blue JNZ - ( get new value ) ~Mouse.x ~window.x1 SUB2 #0050 SUB2 #0004 DIV2 S2B ,theme.b1 #00 ~selection ADD2 POK2 + ~Mouse.x ~window.x1 #0060 ADD2 LTH2 ^$no-touch-blue JNZ + ~Mouse.x ~window.x1 #009c ADD2 GTH2 ^$no-touch-blue JNZ + ( get new value ) ~Mouse.x ~window.x1 SUB2 #0060 SUB2 #0004 DIV2 S2B ,theme.b1 #00 ~selection ADD2 POK2 $no-touch-blue DUP2 #0040 NEQ2 ^$no-touch-radio JNZ ~Mouse.x ~window.x1 #0050 ADD2 LTH2 ^$no-touch-radio JNZ @@ -129,13 +130,54 @@ RTN POP2 POP2 ( draw blending modes ) - #0000 =Screen.x #0020 =Screen.y ,icon_icn =Screen.addr - #20 #30 - $draw-blends - ( move ) OVR #00 SWP #0008 MUL2 =Screen.x + ,preview_icn =Screen.addr + #0010 =Screen.y + #00 #08 + $draw-pixel1 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x ( draw ) OVR =Screen.color ( incr ) SWP #01 ADD SWP - DUP2 LTH ^$draw-blends JNZ + DUP2 LTH ^$draw-pixel1 JNZ + POP POP + #0018 =Screen.y + #00 #08 + $draw-pixel2 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x + ( draw ) OVR #08 ADD =Screen.color + ( incr ) SWP #01 ADD SWP + DUP2 LTH ^$draw-pixel2 JNZ + POP POP + #0020 =Screen.y + #00 #08 + $draw-icn1 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x + ( draw ) OVR #20 ADD =Screen.color + ( incr ) SWP #01 ADD SWP + DUP2 LTH ^$draw-icn1 JNZ + POP POP + #0028 =Screen.y + #00 #08 + $draw-icn2 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x + ( draw ) OVR #28 ADD =Screen.color + ( incr ) SWP #01 ADD SWP + DUP2 LTH ^$draw-icn2 JNZ + POP POP + #0030 =Screen.y + #00 #08 + $draw-chr1 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x + ( draw ) OVR #40 ADD =Screen.color + ( incr ) SWP #01 ADD SWP + DUP2 LTH ^$draw-chr1 JNZ + POP POP + #0038 =Screen.y + #00 #08 + $draw-chr2 + ( move ) OVR #00 SWP #0008 MUL2 #0010 ADD2 =Screen.x + ( draw ) OVR #48 ADD =Screen.color + ( incr ) SWP #01 ADD SWP + DUP2 LTH ^$draw-chr2 JNZ POP POP RTN @@ -149,12 +191,20 @@ RTN ~window.x1 #0002 SUB2 ~window.y1 #0002 SUB2 ~window.x2 #0002 ADD2 ~window.y2 #0002 ADD2 #01 ,line-rect JSR2 ~window.x1 #0008 ADD2 ~window.y1 #0010 ADD2 #25 ,red_txt ,draw-label JSR2 + ~window.x1 #0038 ADD2 ~window.y1 #0010 ADD2 #28 ,System.r ,draw-byte JSR2 + ~window.x1 #0048 ADD2 ~window.y1 #0010 ADD2 #28 ,System.r #0001 ADD2 ,draw-byte JSR2 + ~window.x1 #0008 ADD2 ~window.y1 #0020 ADD2 #25 ,green_txt ,draw-label JSR2 + ~window.x1 #0038 ADD2 ~window.y1 #0020 ADD2 #28 ,System.g ,draw-byte JSR2 + ~window.x1 #0048 ADD2 ~window.y1 #0020 ADD2 #28 ,System.g #0001 ADD2 ,draw-byte JSR2 + ~window.x1 #0008 ADD2 ~window.y1 #0030 ADD2 #25 ,blue_txt ,draw-label JSR2 + ~window.x1 #0038 ADD2 ~window.y1 #0030 ADD2 #28 ,System.b ,draw-byte JSR2 + ~window.x1 #0048 ADD2 ~window.y1 #0030 ADD2 #28 ,System.b #0001 ADD2 ,draw-byte JSR2 - ~window.x1 #0050 ADD2 ~window.y1 #0010 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.r1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 - ~window.x1 #0050 ADD2 ~window.y1 #0020 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.g1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 - ~window.x1 #0050 ADD2 ~window.y1 #0030 ADD2 ~window.x1 #0080 ADD2 #00 ,theme.b1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 + ~window.x1 #0060 ADD2 ~window.y1 #0010 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.r1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 + ~window.x1 #0060 ADD2 ~window.y1 #0020 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.g1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 + ~window.x1 #0060 ADD2 ~window.y1 #0030 ADD2 ~window.x1 #0090 ADD2 #00 ,theme.b1 ~selection ADD PEK2 #0004 MUL2 #01 ,draw-slider JSR2 ~window.x1 #0050 ADD2 =Screen.x ~window.y1 #0040 ADD2 =Screen.y @@ -178,7 +228,7 @@ RTN RTN -@draw-cursor +@draw-cursor ( -- ) ( clear last cursor ) ,clear_icn =Screen.addr @@ -193,11 +243,11 @@ RTN ,pointer_icn =Screen.addr ~pointer.x =Screen.x ~pointer.y =Screen.y - #33 =Screen.color + #33 ~Mouse.state #00 NEQ #02 MUL SUB =Screen.color RTN -@draw-slider ( x1 y x2 pos color ) +@draw-slider ( x1 y x2 pos color -- ) ( load ) =color =slider.pos =slider.x2 =slider.y =slider.x1 @@ -224,7 +274,7 @@ RTN RTN -@fill-rect ( x1 y1 x2 y2 color ) +@fill-rect ( x1 y1 x2 y2 color -- ) ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 $ver @@ -238,7 +288,7 @@ RTN RTN -@line-rect ( x1 y1 x2 y2 color ) +@line-rect ( x1 y1 x2 y2 color -- ) ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 $hor @@ -255,7 +305,7 @@ RTN RTN -@draw-label ( x y color addr ) +@draw-label ( x y color addr -- ) ( load ) =label.addr =color =Screen.y =Screen.x ~label.addr $loop @@ -267,6 +317,19 @@ RTN RTN +@draw-byte ( x y color addr -- ) + + =addr STH + =Screen.y + =Screen.x + ,font_hex #00 ~addr PEK2 #04 SFT #0008 MUL2 ADD2 =Screen.addr + STHr DUP STH =Screen.color + ,font_hex #00 ~addr PEK2 #0f AND #0008 MUL2 ADD2 =Screen.addr + ~Screen.x 8+ =Screen.x + STHr =Screen.color + +RTN + @clear_icn [ 0000 0000 0000 0000 ] @pointer_icn [ 80c0 e0f0 f8e0 1000 ] @halftone_icn [ aa55 aa55 aa55 aa55 ] @@ -274,7 +337,7 @@ RTN @sliderb_icn [ ffff ffff ffff ffff ] @sliderc_icn [ fcfe ffff ffff fefc ] @sliderd_icn [ 003c 7e7e 7e7e 3c00 ] -@icon_icn [ 3c7e e7c3 c3e7 7e3c ] +@preview_icn [ 183c 66db db66 3c18 0000 183c 3c18 0000 ] @radio_icns [ 3c42 8181 8181 423c ] [ 3c42 99bd bd99 423c ] @@ -283,6 +346,18 @@ RTN @green_txt [ Green 00 ] @blue_txt [ Blue 00 ] +@font_hex ( 0-F TODO: should pull from @font instead.. ) +[ + 003c 464a 5262 3c00 0018 0808 0808 1c00 + 003c 4202 3c40 7e00 003c 421c 0242 3c00 + 000c 1424 447e 0400 007e 407c 0242 3c00 + 003c 407c 4242 3c00 007e 0204 0810 1000 + 003c 423c 4242 3c00 003c 4242 3e02 3c00 + 003c 4242 7e42 4200 007c 427c 4242 7c00 + 003c 4240 4042 3c00 007c 4242 4242 7c00 + 007e 4078 4040 7e00 007e 4078 4040 4000 +] + @font ( spectrum-zx font ) [ 0000 0000 0000 0000 0000 2400 7e3c 0000 0000 2400 3c42 0000 0000 6c7c 7c38 1000 diff --git a/src/emulator.c b/src/emulator.c @@ -215,10 +215,11 @@ screen_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1) Uint16 y = mempeek16(u, ptr + 10); Uint8 *addr = &u->ram.dat[mempeek16(u, ptr + 12)]; Uint8 *layer = (b1 >> 4 & 0xf) % 2 ? ppu.fg : ppu.bg; - if((b1 >> 4 & 0xf) / 2) - putsprite(&ppu, layer, x, y, addr, b1 & 0xf); - else - putpixel(&ppu, layer, x, y, b1 & 0xf); + switch((b1 >> 4) / 2) { + case 0: putpixel(&ppu, layer, x, y, b1 & 0x3); break; + case 1: puticn(&ppu, layer, x, y, addr, b1 & 0xf); break; + case 2: putchr(&ppu, layer, x, y, addr, b1 & 0xf); break; + } reqdraw = 1; } return b1; @@ -384,13 +385,12 @@ main(int argc, char **argv) devsystem = portuxn(&u, 0x00, "system", system_poke); portuxn(&u, 0x01, "console", console_poke); devscreen = portuxn(&u, 0x02, "screen", screen_poke); - portuxn(&u, 0x03, "---", ppnil); + devapu = portuxn(&u, 0x03, "audio", audio_poke); devctrl = portuxn(&u, 0x04, "controller", ppnil); devkey = portuxn(&u, 0x05, "key", ppnil); devmouse = portuxn(&u, 0x06, "mouse", ppnil); portuxn(&u, 0x07, "file", file_poke); - devapu = portuxn(&u, 0x08, "audio", audio_poke); - apu.channel_addr = devapu->addr + 0xa; + portuxn(&u, 0x03, "---", ppnil); portuxn(&u, 0x09, "midi", ppnil); portuxn(&u, 0x0a, "datetime", datetime_poke); portuxn(&u, 0x0b, "---", ppnil); @@ -399,6 +399,8 @@ main(int argc, char **argv) portuxn(&u, 0x0e, "---", ppnil); portuxn(&u, 0x0f, "---", ppnil); + apu.channel_addr = devapu->addr + 0xa; + /* Write screen size to dev/screen */ mempoke16(&u, devscreen->addr + 2, ppu.hor * 8); mempoke16(&u, devscreen->addr + 4, ppu.ver * 8); diff --git a/src/ppu.c b/src/ppu.c @@ -110,7 +110,7 @@ putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color) } void -putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) +puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) { Uint16 v, h; for(v = 0; v < 8; v++) @@ -123,6 +123,18 @@ putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) } void +putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) +{ + Uint16 v, h; + for(v = 0; v < 8; v++) + for(h = 0; h < 8; h++) { + Uint8 ch1 = ((sprite[v] >> (7 - h)) & 0x1) * color; + Uint8 ch2 = ((sprite[v + 8] >> (7 - h)) & 0x1) * color; + putpixel(p, layer, x + h, y + v, (ch1 - ch2 + color / 4) & 0x3); + } +} + +void getcolors(Ppu *p, Uint8 *addr) { int i; diff --git a/src/ppu.h b/src/ppu.h @@ -27,4 +27,5 @@ void drawppu(Ppu *p); void drawdebugger(Ppu *p, Uint8 *stack, Uint8 ptr); void getcolors(Ppu *p, Uint8 *addr); void putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color); -void putsprite(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); -\ No newline at end of file +void puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); +void putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); +\ No newline at end of file