Compare commits

...

2 Commits

10 changed files with 439 additions and 230 deletions

57
_acorn_font.tal Normal file
View File

@ -0,0 +1,57 @@
@acorn_font
&width
0405 0408 0807 0802 0505 0807 0405 0307
0705 0707 0707 0707 0707 0304 0605 0607
0707 0707 0706 0607 0705 0707 0608 0807
0707 0707 0707 0708 0707 0705 0705 0706
0407 0707 0707 0607 0705 0507 0508 0707
0708 0707 0607 0708 0707 0705 0205 0808
&characters
0000 0000 0000 0000 ( ) 60f0 f060 6000 6000 ( ! )
a0a0 0000 0000 0000 ( " ) 6c6c fe6c fe6c 6c00 ( # )
107c e07c 0e7c 1000 ( $ ) cccc 1830 60cc cc00 ( % )
70d8 d870 dacc 7600 ( & ) 8080 0000 0000 0000 ( ' )
3060 c0c0 c060 3000 ( o_paren ) c060 3030 3060 c000 ( c_paren )
6c38 fe38 6c00 0000 ( * ) 0030 30fc 3030 0000 ( + )
0000 0000 0060 60c0 ( , ) 0000 00f0 0000 0000 ( - )
0000 0000 00c0 c000 ( . ) 0c18 1830 3060 60c0 ( / )
78cc dcfc eccc 7800 ( 0 ) 60e0 6060 6060 f000 ( 1 )
78cc 0c38 60c4 fc00 ( 2 ) 78cc 0c38 0ccc 7800 ( 3 )
1838 78d8 fc18 1800 ( 4 ) fcc0 f81c 0ccc 7800 ( 5 )
3860 c0f8 cccc 7800 ( 6 ) fc0c 1830 6060 6000 ( 7 )
78cc cc78 cccc 7800 ( 8 ) 78cc cc7c 0c18 7000 ( 9 )
00c0 c000 00c0 c000 ( : ) 0060 6000 0060 60c0 ( ; )
1830 60c0 6030 1800 ( < ) 0000 f000 f000 0000 ( = )
c060 3018 3060 c000 ( > ) 78cc 1830 3000 3000 ( ? )
78cc dcd4 dcc0 7800 ( @ ) 78cc cccc fccc cc00 ( A )
f8cc ccf8 cccc f800 ( B ) 78cc c0c0 c0cc 7800 ( C )
f8cc cccc cccc f800 ( D ) f8c0 c0f0 c0c0 f800 ( E )
f8c0 c0f0 c0c0 c000 ( F ) 78cc c0dc cccc 7800 ( G )
cccc ccfc cccc cc00 ( H ) f060 6060 6060 f000 ( I )
7c18 1818 18d8 7000 ( J ) cccc d8f0 d8cc cc00 ( K )
c0c0 c0c0 c0c0 f800 ( L ) c6ee fed6 d6c6 c600 ( M )
c6e6 f6de cec6 c600 ( N ) 78cc cccc cccc 7800 ( O )
f8cc cccc f8c0 c000 ( P ) 78cc cccc d4d8 6c00 ( Q )
f8cc ccf8 cccc cc00 ( R ) 78cc c078 0ccc 7800 ( S )
fc30 3030 3030 3000 ( T ) cccc cccc cccc 7800 ( U )
cccc cccc cc78 3000 ( V ) c6c6 c6d6 d6fe 6c00 ( W )
cccc 7830 78cc cc00 ( X ) cccc cc78 3030 3000 ( Y )
fc1c 3830 70e0 fc00 ( Z ) f0c0 c0c0 c0c0 f000 ( [ )
c060 6030 3018 180c ( \ ) f030 3030 3030 f000 ( ] )
3071 cc84 0000 0000 ( ^ ) 0000 0000 0000 f800 ( _ )
c060 0000 0000 0000 ( ` ) 0000 780c 7ccc 7c00 ( a )
c0c0 f8cc cccc f800 ( b ) 0000 78cc c0cc 7800 ( c )
0c0c 7ccc cccc 7c00 ( d ) 0000 78cc fcc0 7800 ( e )
3860 60f8 6060 6000 ( f ) 0000 7ccc cc7c 0c78 ( g )
c0c0 f8cc cccc cc00 ( h ) 6000 e060 6060 f000 ( i )
3000 7030 3030 30e0 ( j ) c0c0 ccd8 f0d8 cc00 ( k )
e060 6060 6060 f000 ( l ) 0000 6cfe d6d6 c600 ( m )
0000 f8cc cccc cc00 ( n ) 0000 78cc cccc 7800 ( o )
0000 f8cc ccf8 c0c0 ( p ) 0000 7ccc cc7c 0c0e ( q )
0000 d8ec c0c0 c000 ( r ) 0000 7ce0 781c f800 ( s )
6060 f860 6060 3800 ( t ) 0000 cccc cccc 7800 ( u )
0000 cccc cc78 3000 ( v ) 0000 c6d6 d6fe 6c00 ( w )
0000 cc78 3078 cc00 ( x ) 0000 cccc cc7c 0c78 ( y )
0000 fc18 3060 fc00 ( z ) 3060 60c0 6060 3000 ( { )
8080 8080 8080 8000 ( | ) c060 6030 6060 c000 ( } )
0000 62d6 8c00 0000 ( ~ )

View File

@ -11,41 +11,59 @@
%BITMASK_4 { #08 } %BITMASK_8 { #80 }
( Colour mappings for pixel colours, 1-bit sprite colours, and 2-bit sprite colours. )
%COL_0 { #00 } %COL_00 { #00 } %COL_0012 { #00 }
%COL_1 { #01 } %COL_01 { #01 } %COL_0123 { #01 }
%COL_2 { #02 } %COL_02 { #02 } %COL_0231 { #02 }
%COL_3 { #03 } %COL_03 { #03 } %COL_0312 { #03 }
%COL_10 { #04 } %COL_1012 { #04 }
%COL_T1 { #05 } %COL_T123 { #05 }
%COL_12 { #06 } %COL_1231 { #06 }
%COL_13 { #07 } %COL_1312 { #07 }
%COL_20 { #08 } %COL_2012 { #08 }
%COL_21 { #09 } %COL_2123 { #09 }
%COL_T2 { #0a } %COL_T231 { #0a }
%COL_23 { #0b } %COL_2312 { #0b }
%COL_30 { #0c } %COL_3012 { #0c }
%COL_31 { #0d } %COL_3123 { #0d }
%COL_32 { #0e } %COL_3231 { #0e }
%COL_T3 { #0f } %COL_T312 { #0f }
%COL_0123_2B { #81 }
%COL_0 { #00 } %COL_00 { #00 } %COL_0012 { #80 }
%COL_1 { #01 } %COL_01 { #01 } %COL_0123 { #81 }
%COL_2 { #02 } %COL_02 { #02 } %COL_0231 { #82 }
%COL_3 { #03 } %COL_03 { #03 } %COL_0312 { #83 }
%COL_10 { #04 } %COL_1012 { #84 }
%COL_T1 { #05 } %COL_T123 { #85 }
%COL_12 { #06 } %COL_1231 { #86 }
%COL_13 { #07 } %COL_1312 { #87 }
%COL_20 { #08 } %COL_2012 { #88 }
%COL_21 { #09 } %COL_2123 { #89 }
%COL_T2 { #0a } %COL_T231 { #8a }
%COL_23 { #0b } %COL_2312 { #8b }
%COL_30 { #0c } %COL_3012 { #8c }
%COL_31 { #0d } %COL_3123 { #8d }
%COL_32 { #0e } %COL_3231 { #8e }
%COL_T3 { #0f } %COL_T312 { #8f }
( Flipped X )
%COL_0_X { #10 } %COL_00_X { #10 } %COL_0012_X { #90 }
%COL_1_X { #11 } %COL_01_X { #11 } %COL_0123_X { #91 }
%COL_2_X { #12 } %COL_02_X { #12 } %COL_0231_X { #92 }
%COL_3_X { #13 } %COL_03_X { #13 } %COL_0312_X { #93 }
%COL_10_X { #14 } %COL_1012_X { #94 }
%COL_T1_X { #15 } %COL_T123_X { #95 }
%COL_12_X { #16 } %COL_1231_X { #96 }
%COL_13_X { #17 } %COL_1312_X { #97 }
%COL_20_X { #18 } %COL_2012_X { #98 }
%COL_21_X { #19 } %COL_2123_X { #99 }
%COL_T2_X { #1a } %COL_T231_X { #9a }
%COL_23_X { #1b } %COL_2312_X { #9b }
%COL_30_X { #1c } %COL_3012_X { #9c }
%COL_31_X { #1d } %COL_3123_X { #9d }
%COL_32_X { #1e } %COL_3231_X { #9e }
%COL_T3_X { #1f } %COL_T312_X { #9f }
( Colour mappings for pixel colours, 1-bit sprite colours, and 2-bit sprite colours. )
%COL_0_FG { #40 } %COL_00_FG { #40 } %COL_0012_FG { #40 }
%COL_1_FG { #41 } %COL_01_FG { #41 } %COL_0123_FG { #41 }
%COL_2_FG { #42 } %COL_02_FG { #42 } %COL_0231_FG { #42 }
%COL_3_FG { #43 } %COL_03_FG { #43 } %COL_0312_FG { #43 }
%COL_10_FG { #44 } %COL_1012_FG { #44 }
%COL_T1_FG { #45 } %COL_T123_FG { #45 }
%COL_12_FG { #46 } %COL_1231_FG { #46 }
%COL_13_FG { #47 } %COL_1312_FG { #47 }
%COL_20_FG { #48 } %COL_2012_FG { #48 }
%COL_21_FG { #49 } %COL_2123_FG { #49 }
%COL_T2_FG { #4a } %COL_T231_FG { #4a }
%COL_23_FG { #4b } %COL_2312_FG { #4b }
%COL_30_FG { #4c } %COL_3012_FG { #4c }
%COL_31_FG { #4d } %COL_3123_FG { #4d }
%COL_32_FG { #4e } %COL_3231_FG { #4e }
%COL_T3_FG { #4f } %COL_T312_FG { #4f }
%COL_0_FG { #40 } %COL_00_FG { #40 } %COL_0012_FG { #c0 }
%COL_1_FG { #41 } %COL_01_FG { #41 } %COL_0123_FG { #c1 }
%COL_2_FG { #42 } %COL_02_FG { #42 } %COL_0231_FG { #c2 }
%COL_3_FG { #43 } %COL_03_FG { #43 } %COL_0312_FG { #c3 }
%COL_10_FG { #44 } %COL_1012_FG { #c4 }
%COL_T1_FG { #45 } %COL_T123_FG { #c5 }
%COL_12_FG { #46 } %COL_1231_FG { #c6 }
%COL_13_FG { #47 } %COL_1312_FG { #c7 }
%COL_20_FG { #48 } %COL_2012_FG { #c8 }
%COL_21_FG { #49 } %COL_2123_FG { #c9 }
%COL_T2_FG { #4a } %COL_T231_FG { #ca }
%COL_23_FG { #4b } %COL_2312_FG { #cb }
%COL_30_FG { #4c } %COL_3012_FG { #cc }
%COL_31_FG { #4d } %COL_3123_FG { #cd }
%COL_32_FG { #4e } %COL_3231_FG { #ce }
%COL_T3_FG { #4f } %COL_T312_FG { #cf }
%TRUE { #01 }
%FALSE { #01 }

View File

@ -2,73 +2,154 @@
( D E V I C E M A C R O S )
( Device port numbers )
%/SYSTEM.WST { LIT 02 } %r/SYSTEM.WST { LITr 02 }
%/SYSTEM.RST { LIT 03 } %r/SYSTEM.RST { LITr 03 }
%/SYSTEM.RED { LIT 08 } %r/SYSTEM.RED { LITr 08 }
%/SYSTEM.GREEN { LIT 0a } %r/SYSTEM.GREEN { LITr 0a }
%/SYSTEM.BLUE { LIT 0c } %r/SYSTEM.BLUE { LITr 0c }
%/SYSTEM.DEBUG { LIT 0e } %r/SYSTEM.DEBUG { LITr 0e }
%/SYSTEM.HALT { LIT 0f } %r/SYSTEM.HALT { LITr 0f }
%/CONSOLE.VECTOR { LIT 10 } %r/CONSOLE.VECTOR { LITr 10 }
%/CONSOLE.READ { LIT 12 } %r/CONSOLE.READ { LITr 12 }
%/CONSOLE.WRITE { LIT 18 } %r/CONSOLE.WRITE { LITr 18 }
%/CONSOLE.ERROR { LIT 19 } %r/CONSOLE.ERROR { LITr 19 }
%/SCREEN.VECTOR { LIT 20 } %r/SCREEN.VECTOR { LITr 20 }
%/SCREEN.WIDTH { LIT 22 } %r/SCREEN.WIDTH { LITr 22 }
%/SCREEN.HEIGHT { LIT 24 } %r/SCREEN.HEIGHT { LITr 24 }
%/SCREEN.AUTO { LIT 26 } %r/SCREEN.AUTO { LITr 26 }
%/SCREEN.X { LIT 28 } %r/SCREEN.X { LITr 28 }
%/SCREEN.Y { LIT 2a } %r/SCREEN.Y { LITr 2a }
%/SCREEN.ADDR { LIT 2c } %r/SCREEN.ADDR { LITr 2c }
%/SCREEN.PIXEL { LIT 2e } %r/SCREEN.PIXEL { LITr 2e }
%/SCREEN.SPRITE { LIT 2f } %r/SCREEN.SPRITE { LITr 2f }
%/CONTROLLER.VECTOR { LIT 80 } %r/CONTROLLER.VECTOR { LITr 80 }
%/CONTROLLER.BUTTON { LIT 82 } %r/CONTROLLER.BUTTON { LITr 82 }
%/CONTROLLER.KEY { LIT 83 } %r/CONTROLLER.KEY { LITr 83 }
%/MOUSE.VECTOR { LIT 90 } %r/MOUSE.VECTOR { LITr 90 }
%/MOUSE.X { LIT 92 } %r/MOUSE.X { LITr 92 }
%/MOUSE.Y { LIT 94 } %r/MOUSE.Y { LITr 94 }
%/MOUSE.STATE { LIT 96 } %r/MOUSE.STATE { LITr 96 }
%/MOUSE.SCROLLX { LIT 9a } %r/MOUSE.SCROLLX { LITr 9a }
%/MOUSE.SCROLLY { LIT 9c } %r/MOUSE.SCROLLY { LITr 9c }
%/SYSTEM.VECTOR { LIT 00 } %r/SYSTEM.VECTOR { LITr 00 }
%/SYSTEM.WST { LIT 02 } %r/SYSTEM.WST { LITr 02 }
%/SYSTEM.RST { LIT 03 } %r/SYSTEM.RST { LITr 03 }
%/SYSTEM.RED { LIT 08 } %r/SYSTEM.RED { LITr 08 }
%/SYSTEM.GREEN { LIT 0a } %r/SYSTEM.GREEN { LITr 0a }
%/SYSTEM.BLUE { LIT 0c } %r/SYSTEM.BLUE { LITr 0c }
%/SYSTEM.DEBUG { LIT 0e } %r/SYSTEM.DEBUG { LITr 0e }
%/SYSTEM.STATE { LIT 0f } %r/SYSTEM.STATE { LITr 0f }
%/CONSOLE.VECTOR { LIT 10 } %r/CONSOLE.VECTOR { LITr 10 }
%/CONSOLE.READ { LIT 12 } %r/CONSOLE.READ { LITr 12 }
%/CONSOLE.WRITE { LIT 18 } %r/CONSOLE.WRITE { LITr 18 }
%/CONSOLE.ERROR { LIT 19 } %r/CONSOLE.ERROR { LITr 19 }
%/SCREEN.VECTOR { LIT 20 } %r/SCREEN.VECTOR { LITr 20 }
%/SCREEN.WIDTH { LIT 22 } %r/SCREEN.WIDTH { LITr 22 }
%/SCREEN.HEIGHT { LIT 24 } %r/SCREEN.HEIGHT { LITr 24 }
%/SCREEN.AUTO { LIT 26 } %r/SCREEN.AUTO { LITr 26 }
%/SCREEN.X { LIT 28 } %r/SCREEN.X { LITr 28 }
%/SCREEN.Y { LIT 2a } %r/SCREEN.Y { LITr 2a }
%/SCREEN.ADDR { LIT 2c } %r/SCREEN.ADDR { LITr 2c }
%/SCREEN.PIXEL { LIT 2e } %r/SCREEN.PIXEL { LITr 2e }
%/SCREEN.SPRITE { LIT 2f } %r/SCREEN.SPRITE { LITr 2f }
%/CONTROLLER.VECTOR { LIT 80 } %r/CONTROLLER.VECTOR { LITr 80 }
%/CONTROLLER.BUTTON { LIT 82 } %r/CONTROLLER.BUTTON { LITr 82 }
%/CONTROLLER.KEY { LIT 83 } %r/CONTROLLER.KEY { LITr 83 }
%/CONTROLLER.FUNC { LIT 84 } %r/CONTROLLER.FUNC { LITr 84 }
%/MOUSE.VECTOR { LIT 90 } %r/MOUSE.VECTOR { LITr 90 }
%/MOUSE.X { LIT 92 } %r/MOUSE.X { LITr 92 }
%/MOUSE.Y { LIT 94 } %r/MOUSE.Y { LITr 94 }
%/MOUSE.STATE { LIT 96 } %r/MOUSE.STATE { LITr 96 }
%/MOUSE.SCROLLX { LIT 9a } %r/MOUSE.SCROLLX { LITr 9a }
%/MOUSE.SCROLLY { LIT 9c } %r/MOUSE.SCROLLY { LITr 9c }
%/FILE.VECTOR { LIT a0 } %r/FILE.VECTOR { LITr a0 }
%/FILE.SUCCESS { LIT a2 } %r/FILE.SUCCESS { LITr a2 }
%/FILE.STAT { LIT a4 } %r/FILE.STAT { LITr a4 }
%/FILE.DELETE { LIT a6 } %r/FILE.DELETE { LITr a6 }
%/FILE.APPEND { LIT a7 } %r/FILE.APPEND { LITr a7 }
%/FILE.NAME { LIT a8 } %r/FILE.NAME { LITr a8 }
%/FILE.LENGTH { LIT aa } %r/FILE.LENGTH { LITr aa }
%/FILE.READ { LIT ac } %r/FILE.READ { LITr ac }
%/FILE.WRITE { LIT ae } %r/FILE.WRITE { LITr ae }
%/DATETIME.YEAR { LIT c0 } %r/DATETIME.YEAR { LITr c0 }
%/DATETIME.MONTH { LIT c2 } %r/DATETIME.MONTH { LITr c2 }
%/DATETIME.DAY { LIT c3 } %r/DATETIME.DAY { LITr c3 }
%/DATETIME.HOUR { LIT c4 } %r/DATETIME.HOUR { LITr c4 }
%/DATETIME.MINUTE { LIT c5 } %r/DATETIME.MINUTE { LITr c5 }
%/DATETIME.SECOND { LIT c6 } %r/DATETIME.SECOND { LITr c6 }
%/DATETIME.DOTW { LIT c7 } %r/DATETIME.DOTW { LITr c7 }
%/DATETIME.DOTY { LIT c8 } %r/DATETIME.DOTY { LITr c8 }
%/DATETIME.ISDST { LIT ca } %r/DATETIME.ISDST { LITr ca }
( Read from device ports )
%/SYSTEM.WST? { /SYSTEM.WST DEI } %r/SYSTEM.WST? { r/SYSTEM.WST DEIr }
%/SYSTEM.RST? { /SYSTEM.RST DEI } %r/SYSTEM.RST? { r/SYSTEM.RST DEIr }
%/CONSOLE.READ? { /CONSOLE.READ DEI } %r/CONSOLE.READ? { r/CONSOLE.READ DEIr }
%/SCREEN.WIDTH? { /SCREEN.WIDTH DEI* } %r/SCREEN.WIDTH? { r/SCREEN.WIDTH DEIr* }
%/SCREEN.HEIGHT? { /SCREEN.HEIGHT DEI* } %r/SCREEN.HEIGHT? { r/SCREEN.HEIGHT DEIr* }
%/SCREEN.AUTO? { /SCREEN.AUTO DEI } %r/SCREEN.AUTO? { r/SCREEN.AUTO DEIr }
%/SCREEN.X? { /SCREEN.X DEI* } %r/SCREEN.X? { r/SCREEN.X DEIr* }
%/SCREEN.Y? { /SCREEN.Y DEI* } %r/SCREEN.Y? { r/SCREEN.Y DEIr* }
%/SCREEN.ADDR? { /SCREEN.ADDR DEI* } %r/SCREEN.ADDR? { r/SCREEN.ADDR DEIr* }
%/CONTROLLER.BUTTON? { /CONTROLLER.BUTTON DEI } %r/CONTROLLER.BUTTON? { r/CONTROLLER.BUTTON DEIr }
%/CONTROLLER.KEY? { /CONTROLLER.KEY DEI } %r/CONTROLLER.KEY? { r/CONTROLLER.KEY DEIr }
%/MOUSE.X? { /MOUSE.X DEI* } %r/MOUSE.X? { r/MOUSE.X DEIr* }
%/MOUSE.Y? { /MOUSE.Y DEI* } %r/MOUSE.Y? { r/MOUSE.Y DEIr* }
%/MOUSE.STATE? { /MOUSE.STATE DEI } %r/MOUSE.STATE? { r/MOUSE.STATE DEIr }
%/MOUSE.SCROLLX? { /MOUSE.SCROLLX DEI } %r/MOUSE.SCROLLX? { r/MOUSE.SCROLLX DEIr }
%/MOUSE.SCROLLY? { /MOUSE.SCROLLY DEI } %r/MOUSE.SCROLLY? { r/MOUSE.SCROLLY DEIr }
%/SYSTEM.VECTOR? { /SYSTEM.VECTOR DEI* } %r/SYSTEM.VECTOR? { r/SYSTEM.VECTOR DEIr* }
%/SYSTEM.WST? { /SYSTEM.WST DEI } %r/SYSTEM.WST? { r/SYSTEM.WST DEIr }
%/SYSTEM.RST? { /SYSTEM.RST DEI } %r/SYSTEM.RST? { r/SYSTEM.RST DEIr }
%/SYSTEM.RED? { /SYSTEM.RED DEI* } %r/SYSTEM.RED? { r/SYSTEM.RED DEIr* }
%/SYSTEM.GREEN? { /SYSTEM.GREEN DEI* } %r/SYSTEM.GREEN? { r/SYSTEM.GREEN DEIr* }
%/SYSTEM.BLUE? { /SYSTEM.BLUE DEI* } %r/SYSTEM.BLUE? { r/SYSTEM.BLUE DEIr* }
%/SYSTEM.DEBUG? { /SYSTEM.DEBUG DEI } %r/SYSTEM.DEBUG? { r/SYSTEM.DEBUG DEIr }
%/SYSTEM.STATE? { /SYSTEM.STATE DEI } %r/SYSTEM.STATE? { r/SYSTEM.STATE DEIr }
%/CONSOLE.VECTOR? { /CONSOLE.VECTOR DEI* } %r/CONSOLE.VECTOR? { r/CONSOLE.VECTOR DEIr* }
%/CONSOLE.READ? { /CONSOLE.READ DEI } %r/CONSOLE.READ? { r/CONSOLE.READ DEIr }
%/CONSOLE.WRITE? { /CONSOLE.WRITE DEI } %r/CONSOLE.WRITE? { r/CONSOLE.WRITE DEIr }
%/CONSOLE.ERROR? { /CONSOLE.ERROR DEI } %r/CONSOLE.ERROR? { r/CONSOLE.ERROR DEIr }
%/SCREEN.VECTOR? { /SCREEN.VECTOR DEI* } %r/SCREEN.VECTOR? { r/SCREEN.VECTOR DEIr* }
%/SCREEN.WIDTH? { /SCREEN.WIDTH DEI* } %r/SCREEN.WIDTH? { r/SCREEN.WIDTH DEIr* }
%/SCREEN.HEIGHT? { /SCREEN.HEIGHT DEI* } %r/SCREEN.HEIGHT? { r/SCREEN.HEIGHT DEIr* }
%/SCREEN.AUTO? { /SCREEN.AUTO DEI } %r/SCREEN.AUTO? { r/SCREEN.AUTO DEIr }
%/SCREEN.X? { /SCREEN.X DEI* } %r/SCREEN.X? { r/SCREEN.X DEIr* }
%/SCREEN.Y? { /SCREEN.Y DEI* } %r/SCREEN.Y? { r/SCREEN.Y DEIr* }
%/SCREEN.ADDR? { /SCREEN.ADDR DEI* } %r/SCREEN.ADDR? { r/SCREEN.ADDR DEIr* }
%/SCREEN.PIXEL? { /SCREEN.PIXEL DEI } %r/SCREEN.PIXEL? { r/SCREEN.PIXEL DEIr }
%/SCREEN.SPRITE? { /SCREEN.SPRITE DEI } %r/SCREEN.SPRITE? { r/SCREEN.SPRITE DEIr }
%/CONTROLLER.VECTOR? { /CONTROLLER.VECTOR DEI* } %r/CONTROLLER.VECTOR? { r/CONTROLLER.VECTOR DEIr* }
%/CONTROLLER.BUTTON? { /CONTROLLER.BUTTON DEI } %r/CONTROLLER.BUTTON? { r/CONTROLLER.BUTTON DEIr }
%/CONTROLLER.KEY? { /CONTROLLER.KEY DEI } %r/CONTROLLER.KEY? { r/CONTROLLER.KEY DEIr }
%/CONTROLLER.FUNC? { /CONTROLLER.FUNC DEI } %r/CONTROLLER.FUNC? { r/CONTROLLER.FUNC DEIr }
%/MOUSE.VECTOR? { /MOUSE.VECTOR DEI* } %r/MOUSE.VECTOR? { r/MOUSE.VECTOR DEIr* }
%/MOUSE.X? { /MOUSE.X DEI* } %r/MOUSE.X? { r/MOUSE.X DEIr* }
%/MOUSE.Y? { /MOUSE.Y DEI* } %r/MOUSE.Y? { r/MOUSE.Y DEIr* }
%/MOUSE.STATE? { /MOUSE.STATE DEI } %r/MOUSE.STATE? { r/MOUSE.STATE DEIr }
%/MOUSE.SCROLLX? { /MOUSE.SCROLLX DEI* } %r/MOUSE.SCROLLX? { r/MOUSE.SCROLLX DEIr* }
%/MOUSE.SCROLLY? { /MOUSE.SCROLLY DEI* } %r/MOUSE.SCROLLY? { r/MOUSE.SCROLLY DEIr* }
%/FILE.VECTOR? { /FILE.VECTOR DEI* } %r/FILE.VECTOR? { r/FILE.VECTOR DEIr* }
%/FILE.SUCCESS? { /FILE.SUCCESS DEI* } %r/FILE.SUCCESS? { r/FILE.SUCCESS DEIr* }
%/FILE.STAT? { /FILE.STAT DEI* } %r/FILE.STAT? { r/FILE.STAT DEIr* }
%/FILE.DELETE? { /FILE.DELETE DEI } %r/FILE.DELETE? { r/FILE.DELETE DEIr }
%/FILE.APPEND? { /FILE.APPEND DEI } %r/FILE.APPEND? { r/FILE.APPEND DEIr }
%/FILE.NAME? { /FILE.NAME DEI* } %r/FILE.NAME? { r/FILE.NAME DEIr* }
%/FILE.LENGTH? { /FILE.LENGTH DEI* } %r/FILE.LENGTH? { r/FILE.LENGTH DEIr* }
%/FILE.READ? { /FILE.READ DEI* } %r/FILE.READ? { r/FILE.READ DEIr* }
%/FILE.WRITE? { /FILE.WRITE DEI* } %r/FILE.WRITE? { r/FILE.WRITE DEIr* }
%/DATETIME.YEAR? { /DATETIME.YEAR DEI* } %r/DATETIME.YEAR? { r/DATETIME.YEAR DEIr* }
%/DATETIME.MONTH? { /DATETIME.MONTH DEI } %r/DATETIME.MONTH? { r/DATETIME.MONTH DEIr }
%/DATETIME.DAY? { /DATETIME.DAY DEI } %r/DATETIME.DAY? { r/DATETIME.DAY DEIr }
%/DATETIME.HOUR? { /DATETIME.HOUR DEI } %r/DATETIME.HOUR? { r/DATETIME.HOUR DEIr }
%/DATETIME.MINUTE? { /DATETIME.MINUTE DEI } %r/DATETIME.MINUTE? { r/DATETIME.MINUTE DEIr }
%/DATETIME.SECOND? { /DATETIME.SECOND DEI } %r/DATETIME.SECOND? { r/DATETIME.SECOND DEIr }
%/DATETIME.DOTW? { /DATETIME.DOTW DEI } %r/DATETIME.DOTW? { r/DATETIME.DOTW DEIr }
%/DATETIME.DOTY? { /DATETIME.DOTY DEI* } %r/DATETIME.DOTY? { r/DATETIME.DOTY DEIr* }
%/DATETIME.ISDST? { /DATETIME.ISDST DEI } %r/DATETIME.ISDST? { r/DATETIME.ISDST DEIr }
( Write to device ports )
%/SYSTEM.WST! { /SYSTEM.WST DEO } %r/SYSTEM.WST! { r/SYSTEM.WST DEOr }
%/SYSTEM.RST! { /SYSTEM.RST DEO } %r/SYSTEM.RST! { r/SYSTEM.RST DEOr }
%/SYSTEM.RED! { /SYSTEM.RED DEO* } %r/SYSTEM.RED! { r/SYSTEM.RED DEOr* }
%/SYSTEM.GREEN! { /SYSTEM.GREEN DEO* } %r/SYSTEM.GREEN! { r/SYSTEM.GREEN DEOr* }
%/SYSTEM.BLUE! { /SYSTEM.BLUE DEO* } %r/SYSTEM.BLUE! { r/SYSTEM.BLUE DEOr* }
%/SYSTEM.DEBUG! { /SYSTEM.DEBUG DEO } %r/SYSTEM.DEBUG! { r/SYSTEM.DEBUG DEOr }
%/SYSTEM.HALT! { /SYSTEM.HALT DEO } %r/SYSTEM.HALT! { r/SYSTEM.HALT DEOr }
%/CONSOLE.VECTOR! { /CONSOLE.VECTOR DEO* } %r/CONSOLE.VECTOR! { r/CONSOLE.VECTOR DEOr* }
%/CONSOLE.WRITE! { /CONSOLE.WRITE DEO } %r/CONSOLE.WRITE! { r/CONSOLE.WRITE DEOr }
%/CONSOLE.ERROR! { /CONSOLE.ERROR DEO } %r/CONSOLE.ERROR! { r/CONSOLE.ERROR DEOr }
%/SCREEN.VECTOR! { /SCREEN.VECTOR DEO* } %r/SCREEN.VECTOR! { r/SCREEN.VECTOR DEOr* }
%/SCREEN.WIDTH! { /SCREEN.WIDTH DEO* } %r/SCREEN.WIDTH! { r/SCREEN.WIDTH DEOr* }
%/SCREEN.HEIGHT! { /SCREEN.HEIGHT DEO* } %r/SCREEN.HEIGHT! { r/SCREEN.HEIGHT DEOr* }
%/SCREEN.AUTO! { /SCREEN.AUTO DEO } %r/SCREEN.AUTO! { r/SCREEN.AUTO DEOr }
%/SCREEN.X! { /SCREEN.X DEO* } %r/SCREEN.X! { r/SCREEN.X DEOr* }
%/SCREEN.Y! { /SCREEN.Y DEO* } %r/SCREEN.Y! { r/SCREEN.Y DEOr* }
%/SCREEN.ADDR! { /SCREEN.ADDR DEO* } %r/SCREEN.ADDR! { r/SCREEN.ADDR DEOr* }
%/SCREEN.PIXEL! { /SCREEN.PIXEL DEO } %r/SCREEN.PIXEL! { r/SCREEN.PIXEL DEOr }
%/SCREEN.SPRITE! { /SCREEN.SPRITE DEO } %r/SCREEN.SPRITE! { r/SCREEN.SPRITE DEOr }
%/CONTROLLER.VECTOR! { /CONTROLLER.VECTOR DEO* } %r/CONTROLLER.VECTOR! { r/CONTROLLER.VECTOR DEOr* }
%/MOUSE.VECTOR! { /MOUSE.VECTOR DEO* } %r/MOUSE.VECTOR! { r/MOUSE.VECTOR DEOr* }
%/SYSTEM.VECTOR! { /SYSTEM.VECTOR DEO* } %r/SYSTEM.VECTOR! { r/SYSTEM.VECTOR DEOr* }
%/SYSTEM.WST! { /SYSTEM.WST DEO } %r/SYSTEM.WST! { r/SYSTEM.WST DEOr }
%/SYSTEM.RST! { /SYSTEM.RST DEO } %r/SYSTEM.RST! { r/SYSTEM.RST DEOr }
%/SYSTEM.RED! { /SYSTEM.RED DEO* } %r/SYSTEM.RED! { r/SYSTEM.RED DEOr* }
%/SYSTEM.GREEN! { /SYSTEM.GREEN DEO* } %r/SYSTEM.GREEN! { r/SYSTEM.GREEN DEOr* }
%/SYSTEM.BLUE! { /SYSTEM.BLUE DEO* } %r/SYSTEM.BLUE! { r/SYSTEM.BLUE DEOr* }
%/SYSTEM.DEBUG! { /SYSTEM.DEBUG DEO } %r/SYSTEM.DEBUG! { r/SYSTEM.DEBUG DEOr }
%/SYSTEM.STATE! { /SYSTEM.STATE DEO } %r/SYSTEM.STATE! { r/SYSTEM.STATE DEOr }
%/CONSOLE.VECTOR! { /CONSOLE.VECTOR DEO* } %r/CONSOLE.VECTOR! { r/CONSOLE.VECTOR DEOr* }
%/CONSOLE.READ! { /CONSOLE.READ DEO } %r/CONSOLE.READ! { r/CONSOLE.READ DEOr }
%/CONSOLE.WRITE! { /CONSOLE.WRITE DEO } %r/CONSOLE.WRITE! { r/CONSOLE.WRITE DEOr }
%/CONSOLE.ERROR! { /CONSOLE.ERROR DEO } %r/CONSOLE.ERROR! { r/CONSOLE.ERROR DEOr }
%/SCREEN.VECTOR! { /SCREEN.VECTOR DEO* } %r/SCREEN.VECTOR! { r/SCREEN.VECTOR DEOr* }
%/SCREEN.WIDTH! { /SCREEN.WIDTH DEO* } %r/SCREEN.WIDTH! { r/SCREEN.WIDTH DEOr* }
%/SCREEN.HEIGHT! { /SCREEN.HEIGHT DEO* } %r/SCREEN.HEIGHT! { r/SCREEN.HEIGHT DEOr* }
%/SCREEN.AUTO! { /SCREEN.AUTO DEO } %r/SCREEN.AUTO! { r/SCREEN.AUTO DEOr }
%/SCREEN.X! { /SCREEN.X DEO* } %r/SCREEN.X! { r/SCREEN.X DEOr* }
%/SCREEN.Y! { /SCREEN.Y DEO* } %r/SCREEN.Y! { r/SCREEN.Y DEOr* }
%/SCREEN.ADDR! { /SCREEN.ADDR DEO* } %r/SCREEN.ADDR! { r/SCREEN.ADDR DEOr* }
%/SCREEN.PIXEL! { /SCREEN.PIXEL DEO } %r/SCREEN.PIXEL! { r/SCREEN.PIXEL DEOr }
%/SCREEN.SPRITE! { /SCREEN.SPRITE DEO } %r/SCREEN.SPRITE! { r/SCREEN.SPRITE DEOr }
%/CONTROLLER.VECTOR! { /CONTROLLER.VECTOR DEO* } %r/CONTROLLER.VECTOR! { r/CONTROLLER.VECTOR DEOr* }
%/CONTROLLER.BUTTON! { /CONTROLLER.BUTTON DEO } %r/CONTROLLER.BUTTON! { r/CONTROLLER.BUTTON DEOr }
%/CONTROLLER.KEY! { /CONTROLLER.KEY DEO } %r/CONTROLLER.KEY! { r/CONTROLLER.KEY DEOr }
%/CONTROLLER.FUNC! { /CONTROLLER.FUNC DEO } %r/CONTROLLER.FUNC! { r/CONTROLLER.FUNC DEOr }
%/MOUSE.VECTOR! { /MOUSE.VECTOR DEO* } %r/MOUSE.VECTOR! { r/MOUSE.VECTOR DEOr* }
%/MOUSE.X! { /MOUSE.X DEO* } %r/MOUSE.X! { r/MOUSE.X DEOr* }
%/MOUSE.Y! { /MOUSE.Y DEO* } %r/MOUSE.Y! { r/MOUSE.Y DEOr* }
%/MOUSE.STATE! { /MOUSE.STATE DEO } %r/MOUSE.STATE! { r/MOUSE.STATE DEOr }
%/MOUSE.SCROLLX! { /MOUSE.SCROLLX DEO* } %r/MOUSE.SCROLLX! { r/MOUSE.SCROLLX DEOr* }
%/MOUSE.SCROLLY! { /MOUSE.SCROLLY DEO* } %r/MOUSE.SCROLLY! { r/MOUSE.SCROLLY DEOr* }
%/FILE.VECTOR! { /FILE.VECTOR DEO* } %r/FILE.VECTOR! { r/FILE.VECTOR DEOr* }
%/FILE.SUCCESS! { /FILE.SUCCESS DEO* } %r/FILE.SUCCESS! { r/FILE.SUCCESS DEOr* }
%/FILE.STAT! { /FILE.STAT DEO* } %r/FILE.STAT! { r/FILE.STAT DEOr* }
%/FILE.DELETE! { /FILE.DELETE DEO } %r/FILE.DELETE! { r/FILE.DELETE DEOr }
%/FILE.APPEND! { /FILE.APPEND DEO } %r/FILE.APPEND! { r/FILE.APPEND DEOr }
%/FILE.NAME! { /FILE.NAME DEO* } %r/FILE.NAME! { r/FILE.NAME DEOr* }
%/FILE.LENGTH! { /FILE.LENGTH DEO* } %r/FILE.LENGTH! { r/FILE.LENGTH DEOr* }
%/FILE.READ! { /FILE.READ DEO* } %r/FILE.READ! { r/FILE.READ DEOr* }
%/FILE.WRITE! { /FILE.WRITE DEO* } %r/FILE.WRITE! { r/FILE.WRITE DEOr* }
%/DATETIME.YEAR! { /DATETIME.YEAR DEO* } %r/DATETIME.YEAR! { r/DATETIME.YEAR DEOr* }
%/DATETIME.MONTH! { /DATETIME.MONTH DEO } %r/DATETIME.MONTH! { r/DATETIME.MONTH DEOr }
%/DATETIME.DAY! { /DATETIME.DAY DEO } %r/DATETIME.DAY! { r/DATETIME.DAY DEOr }
%/DATETIME.HOUR! { /DATETIME.HOUR DEO } %r/DATETIME.HOUR! { r/DATETIME.HOUR DEOr }
%/DATETIME.MINUTE! { /DATETIME.MINUTE DEO } %r/DATETIME.MINUTE! { r/DATETIME.MINUTE DEOr }
%/DATETIME.SECOND! { /DATETIME.SECOND DEO } %r/DATETIME.SECOND! { r/DATETIME.SECOND DEOr }
%/DATETIME.DOTW! { /DATETIME.DOTW DEO } %r/DATETIME.DOTW! { r/DATETIME.DOTW DEOr }
%/DATETIME.DOTY! { /DATETIME.DOTY DEO* } %r/DATETIME.DOTY! { r/DATETIME.DOTY DEOr* }
%/DATETIME.ISDST! { /DATETIME.ISDST DEO } %r/DATETIME.ISDST! { r/DATETIME.ISDST DEOr }

27
_draw_text.tal Normal file
View File

@ -0,0 +1,27 @@
( Draw proportional text )
@draw_text ( colour text_addr* -- )
ROT ,&colour STR ( t_addr* )
r/SCREEN.X DEIkr* ROTr ( t_addr* | x* axis )
&loop ( t_addr* | x* axis )
LDAk DUP ,&render JCN ( t_addr* ascii | x* axis )
POP POP* DEOr* RETURN ( -- )
&render
ASCII_TO_INDEX TO_SHORT DUP* MUL8* ( t_addr* code* code8* | x* axis )
;acorn_font/characters ADD* ( t_addr* code* sprite* | x* axis )
/SCREEN.ADDR! ( t_addr* code* | x* axis )
[ LIT &colour $1 ] /SCREEN.SPRITE! ( t_addr* code* | x* axis )
;acorn_font/width ADD* LDA TO_SHORT ( t_addr* char_width* | x* axis )
/SCREEN.X? ADD* /SCREEN.X! ( t_addr* | x* axis )
INC* ,&loop JMP ( t_addr* | x* axis )
@get_text_width ( text_addr* -- width* )
#0000 SWP* ( width* t_addr* )
&loop ( width* t_addr* )
LDAk DUP ,&cont JCN ( width* t_addr* ascii )
&end ( width* t_addr* ascii )
POP POP* RETURN ( width* )
&cont ( width* t_addr* ascii )
ASCII_TO_INDEX TO_SHORT ( width* t_addr* code* )
;acorn_font/width ADD* LDA TO_SHORT ( width* t_addr* char_width* )
ROT* ADD* SWP* INC* ,&loop JMP ( width* t_addr* )

View File

@ -78,66 +78,3 @@
RETURN
&colour $1 &width $2
( ---------------------------------------------------------------------------- )
( D R A W I N G S U B R O U T I N E S )
( Draw proportional text )
@draw_text ( colour text_addr* -- )
ROT ,&colour STR ( t_addr* )
r/SCREEN.X DEIkr* ROTr ( t_addr* | x* axis )
&loop ( t_addr* | x* axis )
LDAk DUP ,&render JCN ( t_addr* ascii | x* axis )
POP POP* DEOr* RETURN ( -- )
&render
ASCII_TO_INDEX TO_SHORT DUP* MUL8* ( t_addr* code* code8* | x* axis )
;acorn_font/characters ADD* ( t_addr* code* sprite* | x* axis )
/SCREEN.ADDR! ( t_addr* code* | x* axis )
[ LIT &colour $1 ] /SCREEN.SPRITE! ( t_addr* code* | x* axis )
;acorn_font/width ADD* LDA TO_SHORT ( t_addr* char_width* | x* axis )
/SCREEN.X? ADD* /SCREEN.X! ( t_addr* | x* axis )
INC* ,&loop JMP ( t_addr* | x* axis )
@get_text_width ( text_addr* -- width* )
#0000 SWP* ( width* t_addr* )
&loop ( width* t_addr* )
LDAk DUP ,&cont JCN ( width* t_addr* ascii )
&end ( width* t_addr* ascii )
POP POP* RETURN ( width* )
&cont ( width* t_addr* ascii )
ASCII_TO_INDEX TO_SHORT ( width* t_addr* code* )
;acorn_font/width ADD* LDA TO_SHORT ( width* t_addr* char_width* )
ROT* ADD* SWP* INC* ,&loop JMP ( width* t_addr* )
@draw_capsule ( colour width* height* )
r/SCREEN.X? r/SCREEN.Y? ( c w* h* | x* y* )
INCkr* r/SCREEN.Y! ( c w* h* | x* y* )
( Draw wider rectangle )
STH* STH* DUP STHkr* OVRr* STHr* ( c c w* h-2* | x* y* h* w* )
#0002 SUB* ;draw_rect_filled CALL ( c | x* y* h* w* )
( Draw taller rectangle )
STHr* #0002 SUB* STHr* ( c w-2* h* | x* y* )
SWPkr* INCr* r/SCREEN.X! r/SCREEN.Y! ( c w-2* h* | x* y* )
;draw_rect_outline CALL ( | x* y* )
( Clear stacks )
r/SCREEN.Y! r/SCREEN.X! RETURN ( -- )
@draw_capsule_smooth ( colour width* height* )
r/SCREEN.X? r/SCREEN.Y? SWPkr* ( c w* h* | sx* sy* sy* sx* )
INCr* r/SCREEN.X! INCr* r/SCREEN.Y! ( c w* h* | sx* sy* )
( Draw inner rectangle )
STH* STH* DUPk ( c c c | sx* sy* h* w* )
STHkr* #0002 SUB* OVRr* STHr* #0002 SUB* ( c c c w-2* h-2* | sx* sy* h* w* )
;draw_rect_filled CALL ( c c | sx* sy* h* w* )
( Draw wider rectangle )
#0001 INCk* MOVE_DOWN MOVE_LEFT
STHkr* OVRr* STHr* #0006 SUB* ( c c w* h-6* | sx* sy* h* w* )
;draw_rect_outline CALL ( c | sx* sy* h* w* )
( Draw taller rectangle )
#0003 DUP* MOVE_RIGHT MOVE_UP
STHr* #0006 SUB* STHr* ( c w-6* h* | sx* sy* )
;draw_rect_outline CALL ( | sx* sy* )
( Clear stacks )
r/SCREEN.Y! r/SCREEN.X! RETURN ( -- )

14
_integer_to_string.tal Normal file
View File

@ -0,0 +1,14 @@
( Convert an integer to a null-terminated string )
@convert_byte_to_decimal_string ( byte -- text_addr* )
TO_SHORT
@convert_short_to_decimal_string ( value* -- text_addr* )
;&array_end SWP*
&loop ( addr* value* )
#000a DIVMOD* ( addr* value/10* digit* )
DIGIT_TO_ASCII ( addr* value* junk ascii )
ROT* STAk NIP* DEC* SWP* ( addr-1* value* )
DUP* ADD ,&loop JCN ( addr* value* )
&end
POP* INC* RETURN ( text_addr* )
&array $4 &array_end $1 <NULL>

View File

@ -75,18 +75,3 @@
LDAk* PRINTF(%d*\s)
INC* INC* ,&loop JMP
&end POP* POP* PRINTF(\n) RETURN
( Convert an integer to a null-terminated string )
@convert_byte_to_decimal_string ( byte -- text_addr* )
TO_SHORT
@convert_short_to_decimal_string ( value* -- text_addr* )
;&array_end SWP*
&loop ( addr* value* )
#000a DIVMOD* ( addr* value/10* digit* )
DIGIT_TO_ASCII ( addr* value* junk ascii )
ROT* STAk NIP* DEC* SWP* ( addr-1* value* )
DUP* ADD ,&loop JCN ( addr* value* )
&end
POP* INC* RETURN ( text_addr* )
&array $4 &array_end $1 <NULL>

View File

@ -4,11 +4,10 @@
( Callbacks are two-byte addresses )
@ui__callbacks
( TODO: Do something with this callback, or remove it )
&on_screen $2
( One callback per UI element, signature [ -- ] )
&dec $32
&inc $32
&go $32
( One callback per controller button, signature [ -- ] )
&left $2
@ -19,13 +18,16 @@
&B $2
&start $2
&select $2
( One callback per UI element, signature [ a -- ] )
( One callback per UI element, signature [ active? -- ] )
&draw $32
( One callback per UI element, signature [ delta -- ] )
&change $32
( One callback per mouse action, signature [ state -- ]. 0: held, 1: released )
&mouse1 $2
&mouse2 $2
&mouse3 $2
&end
( TODO: Add byte to each of the 16 zones )
( Zones are groups of left* right* top* bottom* inclusive bounds for each control )
@ui__zones $128
&end

View File

@ -61,9 +61,9 @@
LDA* CALLRETURN ( active? )
( Call the callback for a single UI element by index, [ index -- ] )
@ui__press_inc ;ui__callbacks/inc ,__ui__call_callback JMP
@ui__press_dec ;ui__callbacks/dec ,__ui__call_callback JMP
@ui__press_go ;ui__callbacks/go ,__ui__call_callback JMP
@ui__press_go ;ui__callbacks/go ,__ui__call_callback JMP
@ui__press_inc #01 SWP ;ui__callbacks/change ,__ui__call_callback JMP
@ui__press_dec #ff SWP ;ui__callbacks/change ( ... jump elided ... )
( Calculate the real address of a callback and call )
@__ui__call_callback ( index callback_block_start_addr* )
ROT TO_SHORT DOUBLE ADD* LDA* CALL ( real_callback_addr* )
@ -74,14 +74,14 @@
and a callback address, followed by the number of pairs that were provided.
For example: [ #00 ;func0 #01 ;func1 #04 ;func4 #03 ]
Draw callbacks MUST consume the 1-byte 'active?' bool that is passed to them.
Controller input callbacks (inc, dec, go) do not receive any data.
Change callbacks MUST consume the 1-byte 'delta' that is passed to them (is either -1 or 1).
Go callbacks do not receive any data.
Callbacks SHOULD consume the return address on the return stack by calling
either RETURN or NORETURN.
Signature for each 'register' subroutine is: [index callback*]+ count -- )
@ui__register_draw_callbacks ;ui__callbacks/draw ,__ui__register_callbacks JMP
@ui__register_inc_callbacks ;ui__callbacks/inc ,__ui__register_callbacks JMP
@ui__register_dec_callbacks ;ui__callbacks/dec ,__ui__register_callbacks JMP
@ui__register_go_callbacks ;ui__callbacks/go ,__ui__register_callbacks JMP
@ui__register_draw_callbacks ;ui__callbacks/draw ,__ui__register_callbacks JMP
@ui__register_change_callbacks ;ui__callbacks/change ,__ui__register_callbacks JMP
@ui__register_go_callbacks ;ui__callbacks/go ( ... jump elided ... )
@__ui__register_callbacks ( [index callback*]+ count block_addr* -- )
,&block_addr STR* ( [index callback*]+ count )
&loop ( [index callback*]+ count )
@ -142,6 +142,8 @@
( Mouse vector )
@ui__on_mouse ( -- )
( TODO: Add back in the mouse2 stuff )
( Update the mouse button state variables )
/MOUSE.STATE? DUP /I.MOUSE.HELD? DUPk* ( held now prev now prev now prev )
EOR AND SWP SWP* EOR AND ( held released pressed )
/I.MOUSE.PRESSED! /I.MOUSE.RELEASED! /I.MOUSE.HELD!
@ -214,20 +216,19 @@
BUTTON_MASK_START ;ui__callbacks/start ;&null ,&call_if_pressed JSR
BUTTON_MASK_SELECT ;ui__callbacks/select ;&null ,&call_if_pressed JSR BRK
( Call two callbacks if the button matching this mask was pressed.
Calls a user-provided callback and a UI logic callback. )
Calls a UI logic callback and a user-provided callback. )
&call_if_pressed ( mask user_callback* ui_callback* -- )
,&ui_callback STR* LDA* ,&user_callback STR* ( mask )
/I.BUTTON.PRESSED? IF_NOT_MASK RETURN ( -- )
/I.ACTIVE_ELEMENT? LIT* &ui_callback $2 CALL ( -- )
LIT* &user_callback $2 CALLRETURN ( -- )
&prev ( active -- )
IF_FALSEY RETURN /I.ACTIVE_ELEMENT DEC_Z RETURN
&next ( active -- )
INC /I.NUM_ELEMENTS? IF_EQUAL RETURN /I.ACTIVE_ELEMENT INC_Z RETURN
/I.ACTIVE_ELEMENT? ( active )
[ LIT* &ui_callback $2 ] CALL ( -- )
[ LIT* &user_callback $2 ] CALLRETURN ( -- )
&dec ;ui__press_dec CALLRETURN
&inc ;ui__press_inc CALLRETURN
&go ;ui__press_go CALLRETURN
&null RETURN
&next #01 [ INCk JMP ]
&prev #ff ADD /I.NUM_ELEMENTS? ;clamp CALL ;ui__set_active_control CALLRETURN
&null RETURN
( Redraw the active and previously-active controls, and set prev_active to active )
@ui__redraw_controls ( -- )

View File

@ -20,13 +20,13 @@
( The currently active drawing tool. )
%/V.ACTIVE_TOOL { #0e } %/V.ACTIVE_TOOL? { #0e LDZ } %/V.ACTIVE_TOOL! { #0e STZ }
%TOOL_COUNT? { #05 }
%TOOL_COUNT? { #07 }
( ---------------------------------------------------------------------------- )
( P R O G R A M S T A R T )
|0100
#0080 /V.CANVAS.WIDTH! #0060 /V.CANVAS.HEIGHT! #04 /V.ACTIVE_TOOL!
#0080 /V.CANVAS.WIDTH! #0060 /V.CANVAS.HEIGHT! #01 /V.ACTIVE_TOOL!
;default_colour_palette ;ui__load_colour_palette CALL
;ui__clear CALL
;recenter_canvas CALL
@ -43,8 +43,16 @@
;ui__clear CALL
;draw_canvas CALL
;canvas_screen__tool /I.CALLBACK.MOUSE1!
;canvas_screen__A /I.CALLBACK.A!
;canvas_screen__B /I.CALLBACK.B!
;ui__run_blank GOTO
@canvas_screen__A
( TODO: Think about having A trigger for press and release. Maybe a separate callback? A_UP and A_DOWN? )
/MOUSE.STATE? BITMASK_1 ORA /MOUSE.STATE!
/MOUSE.VECTOR? CALL
RETURN
@canvas_screen__B NORETURN ;tool_screen GOTO
@canvas_screen__tool
( Dispatch control to the routine of the active tool )
@ -109,32 +117,94 @@
;ui__clear CALL
( Draw non-interactive elements )
COL_0 ;fill_screen_with_colour CALL
( Labels )
#0039 CENTER_LEFT? /SCREEN.X! #0008 CENTER_DOWN? /SCREEN.Y!
COL_1 ;&colour_text ;draw_text CALL
#0034 CENTER_LEFT? /SCREEN.X! #0016 CENTER_DOWN? /SCREEN.Y!
COL_1 ;&shape_text ;draw_text CALL
#0040 CENTER_LEFT? /SCREEN.X! #0024 CENTER_DOWN? /SCREEN.Y!
COL_1 ;&pattern_text ;draw_text CALL
#0008 CENTER_LEFT? /SCREEN.X! #0008 CENTER_DOWN? /SCREEN.Y!
;sprite/capsule_half /SCREEN.ADDR!
#01 /SCREEN.AUTO!
COL_T2 /SCREEN.SPRITE! COL_T2_X /SCREEN.SPRITE!
#0003 MOVE_RIGHT
COL_T2 /SCREEN.SPRITE! COL_T2_X /SCREEN.SPRITE!
#0003 MOVE_RIGHT
COL_T2 /SCREEN.SPRITE! COL_T2_X /SCREEN.SPRITE!
#0003 MOVE_RIGHT
COL_T2 /SCREEN.SPRITE! COL_T2_X /SCREEN.SPRITE!
#00 /SCREEN.AUTO!
( Register inc/dec callbacks )
#00 ;tool_screen__dec__palette
#01 ;ui__register_dec_callbacks CALL
#00 ;tool_screen__change__palette
#01 ;ui__register_change_callbacks CALL
( Register draw callbacks )
#00 ;tool_screen__draw__palette
#01 ;ui__register_draw_callbacks CALL
#01 ;tool_screen__draw__colour
#02 ;ui__register_draw_callbacks CALL
( Register raw input callbacks )
;tool_screen__B /I.CALLBACK.B!
( Finish callback registration )
#0001 ;ui__run GOTO
#0002 ;ui__run GOTO
&colour_text "Colour: <NULL>
&shape_text "Shape: <NULL>
&pattern_text "Pattern: <NULL>
@tool_screen__B NORETURN ;canvas_screen GOTO
@tool_screen__dec__palette
/V.ACTIVE_TOOL? INC TOOL_COUNT? MOD /V.ACTIVE_TOOL! RETURN
@tool_screen__change__palette ( delta -- )
/V.ACTIVE_TOOL? ADD TOOL_COUNT? ;clamp CALL /V.ACTIVE_TOOL! RETURN
@tool_screen__draw__palette
;draw_tool_palette_background CALL
@tool_screen__draw__colour ( active? )
POP RETURN
COL_12 COL_32 CHOOSE
#0040 CENTER_LEFT? /SCREEN.X! #002c CENTER_DOWN? /SCREEN.Y!
#0020 DUP* ;draw_text CALLRETURN
@tool_screen__draw__palette ( active? )
( Choose between the real active tool and an impossible tool number )
#ff /V.ACTIVE_TOOL? CHOOSE ,&active_tool STR
( Draw a label on top, containing the name of the active tool )
#0040 CENTER_LEFT? /SCREEN.X! #002c CENTER_UP? /SCREEN.Y!
COL_20 #0080 /V.ACTIVE_TOOL? ;get_tool_name CALL ;draw_button CALL
( Draw a large capsule to use as a background for the tool icons )
#001c CENTER_UP! COL_2 ( colour -- )
;get_tool_palette_width CALL ( colour width* )
/SCREEN.WIDTH? OVR* SUB* HALVE* ( colour width* bg_x* )
/SCREEN.X! #001b ;draw_capsule CALL ( -- )
( Draw each of the large tool icons )
TOOL_COUNT? #00 ( total i )
&loop
EQUk ,&end JCN
DUPk /V.ACTIVE_TOOL? EQU
;draw_tool_palette_icon CALL
INC ,&loop JMP
&end
POP* RETURN
&loop DUPk [ LIT &active_tool $1 ] EQU
;draw_tool_palette_icon CALL
INC GTHk ,&loop JCN
&end POP* RETURN
@get_tool_name ( index -- text_addr* )
MUL4 JMP
;&pan RETURN
;&brush1 RETURN
;&brush2 RETURN
;&brush3 RETURN
;&line RETURN
;&rect RETURN
;&fill RETURN
&pan "Pan <SPACE> "canvas <NULL>
&brush1 "Brush <SPACE> "1 <NULL>
&brush2 "Brush <SPACE> "2 <NULL>
&brush3 "Brush <SPACE> "3 <NULL>
&line "Line <SPACE> "tool <NULL>
&rect "Rectangle <SPACE> "tool <NULL>
&fill "Bucket <SPACE> "fill <NULL>
( Calculates the width of the tool palette from the number of icons )
@get_tool_palette_width ( -- width* )
#00 TOOL_COUNT? #001a MUL* INC* RETURN ( width* )
( Draw a single tool icon )
@draw_tool_palette_icon ( index active? )
LITr 00 STHk* POP LITr 00 STH ( | index* active index* )
@ -143,21 +213,10 @@
SUB* HALVE* ADD2* ( zone_0_x* | index* active index* )
STHr* #001a MUL* ADD* /SCREEN.X! ( | index* active )
STHr STHkr /V.ACTIVE_TOOL? EQU ( active? current_tool? | index* )
COL_0 COL_2 CHOOSE COL_3 CHOOSE ( colour | index* )
COL_0 COL_1 CHOOSE COL_3 CHOOSE ( colour | index* )
#0017 DUP* ;draw_capsule_smooth CALL ( | index* )
COL_T1 ;tool_icon STHr* #0048 MUL* ADD* ( colour 3x3_sprite_addr* )
;draw_3x3_sprite CALLRETURN
( Draw a large capsule to use as a background for the tool icons )
@draw_tool_palette_background ( -- )
#001c CENTER_UP! COL_1 ( colour -- )
,get_tool_palette_width JSR ( colour width* )
/SCREEN.WIDTH? OVR* SUB* HALVE* ( colour width* bg_x* )
/SCREEN.X! #001b ;draw_capsule CALLRETURN ( -- )
( Calculates the width of the tool palette from the number of icons )
@get_tool_palette_width ( -- width* )
#00 TOOL_COUNT? #001a MUL* INC* RETURN ( width* )
( Draw a 1-bit 3x3 sprite )
@draw_3x3_sprite ( colour sprite_addr* -- )
COL_T2 ;tool_icon STHr* #0048 MUL* ADD* ( colour 3x3_sprite_addr* )
( Draw the 1-bit 3x3 sprite ) ( colour sprite_addr* )
/SCREEN.ADDR! #26 /SCREEN.AUTO!
/SCREEN.SPRITE DEOk DEOk DEO
#00 /SCREEN.AUTO! #0018 MOVE_UP
@ -225,6 +284,16 @@
@gth_signed* SWP*
@lth_signed* #8000 STHk* ADD* SWP* STHr* ADD* GTH* RETURN
( Returns 0 <= index < total )
@clamp ( index total -- index )
LITr 80 ( index total | 80 )
( Subtract 1 from total, add #80 to index and total )
STHkr INC SUB SWP STHkr SUB ( max index | 80 )
( Keep max if max < index, else keep index )
LTHk JMP SWP POP STHkr ( index 80 | 80 )
( Keep 80 if index < 80, else keep index )
LTHk JMP SWP NIP STHr SUB RETURN ( index )
( Recalculate the canvas position in order to center the canvas on the screen )
@ -244,7 +313,7 @@
/V.CANVAS.X? /SCREEN.X! ( sprite_height* )
/V.CANVAS.WIDTH? CEIL8DIV8* ( sprite_height* sprite_width* )
&loop ( sprite_height* sprite_width* )
COL_0123_2B /SCREEN.SPRITE! ( sprite_height* sprite_width* )
COL_0123 /SCREEN.SPRITE! ( sprite_height* sprite_width* )
DEC* DUP* GTH0* ,&loop JCN ( sprite_height* sprite_width* )
( Move down to the next sprite row )
POP* DEC* #0008 MOVE_DOWN ( sprite_height* )
@ -259,9 +328,19 @@
~_draw_line.tal
~_draw_rect.tal
~_draw_shapes.tal
~_draw_text.tal
~_integer_to_string.tal
~_draw_ui_elements.tal
~_acorn_font.tal
@default_colour_palette
14ad 269d 2689
14ac 269a 268f
14ae 269a 3780
14ac 269b 378d
1d9e 161a 1010
e19a a116 0112
@tool_icon
@ -280,10 +359,18 @@
&line 0000 0000 0000 0000 0000 0000 0001 0001 0000 0040 40f0 4040
0000 0000 0000 0005 0204 0810 2040 8000 0000 0000 0000 0000
041f 0404 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
&rect 0000 0008 083e 080b 0000 0000 0000 00ff 0000 0020 20f8 20a0
0302 0302 0302 030b 55aa 55aa 55aa 55ff 8080 8080 8080 80a0
083e 0808 0000 0000 0000 0000 0000 0000 20f8 2020 0000 0000
&fill 0000 0000 0000 0001 0000 0000 385f af53 0000 0000 0000 c0e0
0205 0a14 1008 0402 8100 0401 1224 4890 f0f0 b030 3030 2020
0100 0000 0000 0000 20c0 0000 0000 0000 2000 0000 0000 0000
@sprite
&cursor 80c0 e0f0 f8e0 1000
&blank 0000 0000 0000 0000
&left_chevron 1030 70f0 7030 1000
&cursor 80c0 e0f0 f8e0 1000
&capsule_half 7f80 8080 8080 807f
&blank 0000 0000 0000 0000
~_user_interface_callbacks.tal