mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-22 16:33:48 +00:00
Added random walk for Plus/4 to examples. Thanks to Carrion of Bonzai!
This commit is contained in:
parent
6a5aa72ed5
commit
6aa88fe3e6
@ -0,0 +1,8 @@
|
||||
sec
|
||||
sbc {z1}
|
||||
beq !e+
|
||||
bvc !+
|
||||
eor #$80
|
||||
!:
|
||||
bpl {la1}
|
||||
!e:
|
@ -41,13 +41,18 @@ public class TestPrograms {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCircleChars() throws IOException, URISyntaxException {
|
||||
compileAndCompare("circlechars.c");
|
||||
public void testPolygon() throws IOException, URISyntaxException {
|
||||
compileAndCompare("complex/polygon/polygon.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPolygon() throws IOException, URISyntaxException {
|
||||
compileAndCompare("complex/polygon/polygon.c");
|
||||
public void testPlus4Walk() throws IOException, URISyntaxException {
|
||||
compileAndCompare("examples/plus4walk/plus4walk.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCircleChars() throws IOException, URISyntaxException {
|
||||
compileAndCompare("circlechars.c");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -34,7 +34,7 @@ char volatile canvas_show_flag = 0;
|
||||
|
||||
// SIN/COS tables
|
||||
char align(0x100) SINTAB[0x140] = kickasm {{
|
||||
.fill $200, 63 + 63*sin(i*2*PI/$100)
|
||||
.fill $200, round(63 + 63*sin(i*2*PI/$100))
|
||||
}};
|
||||
char* COSTAB = SINTAB+0x40;
|
||||
|
||||
@ -64,7 +64,7 @@ void main() {
|
||||
// Set text color
|
||||
textcolor(WHITE);
|
||||
|
||||
char p0_idx = 0xf0;
|
||||
char p0_idx = 0xb5;
|
||||
char p1_idx = p0_idx+15;
|
||||
char p2_idx = p0_idx+170;
|
||||
|
||||
@ -103,8 +103,8 @@ void main() {
|
||||
canvas_show_flag = 1;
|
||||
// Read and display cycles
|
||||
clock_t cyclecount = clock()-CLOCKS_PER_INIT;
|
||||
gotoxy(0,24);
|
||||
printf("frame: %02x cycles: %6lu", p0_idx, cyclecount);
|
||||
//gotoxy(0,24);
|
||||
//printf("frame: %02x cycles: %6lu", p0_idx, cyclecount);
|
||||
//printf("(%02x,%02x)-(%02x,%02x)", x0, y0, x1, y1);
|
||||
}
|
||||
}
|
||||
@ -127,7 +127,7 @@ void setup_irq() {
|
||||
// Interrupt Routine 1: Just above last text line.
|
||||
interrupt(kernel_min) void irq_bottom_1() {
|
||||
// Change border color
|
||||
VICII->BORDER_COLOR = WHITE;
|
||||
VICII->BORDER_COLOR = DARK_GREY;
|
||||
// Show the cycle counter
|
||||
VICII->MEMORY = toD018(CONSOLE, PETSCII);
|
||||
// Acknowledge the IRQ
|
||||
@ -144,6 +144,8 @@ interrupt(kernel_keyboard) void irq_bottom_2() {
|
||||
// Show the current canvas (unless a key is being pressed)
|
||||
if(!kbhit()) {
|
||||
VICII->MEMORY = canvas_show_memory;
|
||||
} else {
|
||||
VICII->MEMORY = toD018(SCREEN, LINE_BUFFER);
|
||||
}
|
||||
canvas_show_flag = 0;
|
||||
// Acknowledge the IRQ
|
||||
@ -162,39 +164,57 @@ void line(char* canvas, char x1, char y1, char x2, char y2) {
|
||||
char dy = abs_u8(y2-y1);
|
||||
char sx = sgn_u8(x2-x1);
|
||||
char sy = sgn_u8(y2-y1);
|
||||
// The sign of the x-difference determines if this is a line at the top of the face
|
||||
// being filled or a line at the bottom of the face. Because the points are organized in a clockwise
|
||||
// fashion any line pointing right is filled below the line and any line pointing left is filled above
|
||||
if(sx==0xff) {
|
||||
// The sign of the x-difference determines if this is a line at the top of the face
|
||||
// being filled or a line at the bottom of the face. Because the points are organized in a clockwise
|
||||
// fashion any line pointing right is filled below the line and any line pointing left is filled above
|
||||
// If this line is pointing left then move it down one pixel to ensure the fill is stopped correctly
|
||||
// This is a line at the bottom of the face - move it 1 pixel down to stop the fill correctly
|
||||
y++; y2++;
|
||||
}
|
||||
}
|
||||
if(dx > dy) {
|
||||
// X is the driver - plot every X using bresenham
|
||||
// Flat slope - X is the driver - plot every X using bresenham
|
||||
char e = dx/2;
|
||||
do {
|
||||
do {
|
||||
plot(x, y);
|
||||
x += sx;
|
||||
e += dy;
|
||||
if(dx < e) {
|
||||
if(e>dx) {
|
||||
y += sy;
|
||||
e -= dx;
|
||||
}
|
||||
} while (x != x2);
|
||||
plot(x, y);
|
||||
} else {
|
||||
// Y is the driver - only plot one plot per X
|
||||
char e = dy/2;
|
||||
plot(x, y);
|
||||
do {
|
||||
y += sy;
|
||||
e += dx;
|
||||
if(dy<e) {
|
||||
// Steep slope - Y is the driver - only plot one plot per X
|
||||
if(sx==sy) {
|
||||
// If dx/dy signs are identical we must render the first pixel of each segment
|
||||
plot(x, y);
|
||||
if(dx==0)
|
||||
return;
|
||||
char e = dy/2;
|
||||
do {
|
||||
do {
|
||||
y += sy;
|
||||
e += dx;
|
||||
} while(e<=dy);
|
||||
x += sx;
|
||||
e -= dy;
|
||||
plot(x, y);
|
||||
}
|
||||
} while (y != y2);
|
||||
} while (x != x2);
|
||||
} else {
|
||||
// If dx/dy signs differ we must render the last pixel of each segment
|
||||
char e = dy/2;
|
||||
do {
|
||||
y += sy;
|
||||
e += dx;
|
||||
if(e>dy) {
|
||||
plot(x, y-sy);
|
||||
x += sx;
|
||||
e -= dy;
|
||||
}
|
||||
} while (y != y2);
|
||||
plot(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,6 +237,7 @@ void eorfill(char* line_buffer, char* canvas) {
|
||||
char* fill_column = canvas;
|
||||
for(char x=0;x<16;x++) {
|
||||
char eor = line_column[0];
|
||||
fill_column[0] = eor;
|
||||
for(char y=1;y<16*8;y++) {
|
||||
eor ^= line_column[y];
|
||||
fill_column[y] = eor;
|
||||
|
9
src/test/kc/examples/plus4walk/plus4.ld
Normal file
9
src/test/kc/examples/plus4walk/plus4.ld
Normal file
@ -0,0 +1,9 @@
|
||||
.file [name="%O.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$1001]
|
||||
.segmentdef Code [start=$1010]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(%E)
|
||||
.segment Code
|
||||
|
48
src/test/kc/examples/plus4walk/plus4walk.c
Normal file
48
src/test/kc/examples/plus4walk/plus4walk.c
Normal file
@ -0,0 +1,48 @@
|
||||
// Random walk with color fading for Commodore Plus/4 / C16
|
||||
#pragma link("plus4.ld")
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
char * const SCREEN = 0x0c00;
|
||||
char * const COLORRAM = 0x0800;
|
||||
|
||||
char * const BGCOLOR = 0xff19;
|
||||
char * const BORDERCOLOR = 0xff15;
|
||||
char * const RASTER = 0xff1d;
|
||||
|
||||
char FADE[16] = { 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06 };
|
||||
char COUNT[1000];
|
||||
|
||||
void main() {
|
||||
memset(SCREEN, 0xa0, 1000);
|
||||
memset(COLORRAM, 0, 1000);
|
||||
memset(COUNT, 0, 1000);
|
||||
*BORDERCOLOR = 0;
|
||||
*BGCOLOR = 0;
|
||||
char x=20, y=12;
|
||||
while(1) {
|
||||
unsigned int offset = (unsigned int)y*40+x;
|
||||
char cnt = ++*(COUNT+offset);
|
||||
*(COLORRAM+offset) = FADE[cnt&0xf];
|
||||
char rnd = >rand();
|
||||
if(rnd & 0x80) {
|
||||
if(rnd& 0x40) {
|
||||
x++;
|
||||
if(x==40) x=39;
|
||||
} else {
|
||||
x--;
|
||||
if(x==0xff) x=0;
|
||||
}
|
||||
} else {
|
||||
if(rnd & 0x40) {
|
||||
y++;
|
||||
if(y==25) y=24;
|
||||
} else {
|
||||
y--;
|
||||
if(y==0xff) y=0;
|
||||
}
|
||||
}
|
||||
while(*RASTER!=0xff) {}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -1,6 +1,5 @@
|
||||
(label) @1
|
||||
(label) @2
|
||||
(label) @3
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(const nomodify byte) BLACK = (byte) 0
|
||||
@ -13,16 +12,12 @@
|
||||
(const nomodify byte) CIA_INTERRUPT_CLEAR = (byte) $7f
|
||||
(const nomodify byte) CIA_TIMER_CONTROL_B_COUNT_UNDERFLOW_A = (byte) $40
|
||||
(const nomodify byte) CIA_TIMER_CONTROL_START = (byte) 1
|
||||
(const nomodify dword) CLOCKS_PER_INIT = (dword) $12
|
||||
(const nomodify byte*) COLS = (byte*) 55296
|
||||
(const nomodify byte*) CONIO_CIA1_PORT_A = (byte*) 56320
|
||||
(const nomodify byte*) CONIO_CIA1_PORT_B = (byte*) 56321
|
||||
(const nomodify byte*) CONIO_SCREEN_COLORS = (byte*) 55296
|
||||
(const nomodify byte*) CONIO_SCREEN_TEXT = (byte*) 1024
|
||||
(const nomodify byte) CONIO_TEXTCOLOR_DEFAULT = (byte) $e
|
||||
(const nomodify byte*) CONSOLE = (byte*) 1024
|
||||
(const byte*) COSTAB = (const byte*) SINTAB+(byte) $40
|
||||
(const byte*) DIGITS[] = (byte*) "0123456789abcdef"z
|
||||
(const nomodify byte) DARK_GREY = (byte) $b
|
||||
(const nomodify byte) IRQ_RASTER = (byte) 1
|
||||
(const nomodify void()**) KERNEL_IRQ = (void()**) 788
|
||||
(const nomodify byte*) LINE_BUFFER = (byte*) 8192
|
||||
@ -120,19 +115,15 @@
|
||||
(const byte) OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS = (byte) $19
|
||||
(const byte) OFFSET_STRUCT_MOS6569_VICII_MEMORY = (byte) $18
|
||||
(const byte) OFFSET_STRUCT_MOS6569_VICII_RASTER = (byte) $12
|
||||
(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = (byte) 1
|
||||
(const nomodify byte*) PETSCII = (byte*) 4096
|
||||
(const byte) RADIX::BINARY = (number) 2
|
||||
(const byte) RADIX::DECIMAL = (number) $a
|
||||
(const byte) RADIX::HEXADECIMAL = (number) $10
|
||||
(const byte) RADIX::OCTAL = (number) 8
|
||||
(const dword*) RADIX_DECIMAL_VALUES_LONG[] = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a }
|
||||
(const byte*) RADIX_HEXADECIMAL_VALUES_CHAR[] = { (byte) $10 }
|
||||
(const nomodify byte) RED = (byte) 2
|
||||
(const nomodify byte*) SCREEN = (byte*) 11264
|
||||
(const byte*) SINTAB[(number) $140] = kickasm {{ .fill $200, 63 + 63*sin(i*2*PI/$100)
|
||||
(const byte*) SINTAB[(number) $140] = kickasm {{ .fill $200, round(63 + 63*sin(i*2*PI/$100))
|
||||
}}
|
||||
(const byte) SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = (byte) $c
|
||||
(const nomodify struct MOS6569_VICII*) VICII = (struct MOS6569_VICII*) 53248
|
||||
(const nomodify byte) WHITE = (byte) 1
|
||||
(byte()) abs_u8((byte) abs_u8::u)
|
||||
@ -148,55 +139,13 @@
|
||||
(byte) abs_u8::u#0 reg byte a 2002.0
|
||||
(byte) abs_u8::u#1 reg byte a 2002.0
|
||||
(byte) abs_u8::u#2 reg byte a 10668.333333333332
|
||||
(volatile byte) canvas_show_flag loadstore zp[1]:27 15.577464788732396
|
||||
(volatile byte) canvas_show_memory loadstore zp[1]:26 2.452380952380952
|
||||
(volatile byte) canvas_show_flag loadstore zp[1]:18 18.74576271186441
|
||||
(volatile byte) canvas_show_memory loadstore zp[1]:17 2.8611111111111107
|
||||
(dword()) clock()
|
||||
(label) clock::@return
|
||||
(dword) clock::return
|
||||
(dword) clock::return#0 return zp[4]:11 367.33333333333337
|
||||
(dword) clock::return#2 return zp[4]:11 202.0
|
||||
(void()) clock_start()
|
||||
(label) clock_start::@return
|
||||
(byte*) conio_cursor_color loadstore zp[2]:23 2.027272819090909E8
|
||||
(byte*) conio_cursor_text loadstore zp[2]:21 2.0090091E8
|
||||
(byte) conio_cursor_x loadstore zp[1]:19 2.5263168515789475E7
|
||||
(byte) conio_cursor_y loadstore zp[1]:20 2.824561492105263E8
|
||||
(byte) conio_textcolor loadstore zp[1]:25 6.312500065625E7
|
||||
(void()) cputc((byte) cputc::c)
|
||||
(label) cputc::@1
|
||||
(label) cputc::@2
|
||||
(label) cputc::@3
|
||||
(label) cputc::@return
|
||||
(byte) cputc::c
|
||||
(byte) cputc::c#0 reg byte a 2.0000002E7
|
||||
(byte) cputc::c#1 reg byte a 2.0000002E7
|
||||
(byte) cputc::c#2 reg byte a 20002.0
|
||||
(byte) cputc::c#3 reg byte a 1.100050025E8
|
||||
(void()) cputln()
|
||||
(byte*~) cputln::$1 zp[2]:21 2.000000002E9
|
||||
(byte*~) cputln::$2 zp[2]:23 2.000000002E9
|
||||
(label) cputln::@return
|
||||
(word) cputln::ln_offset
|
||||
(word) cputln::ln_offset#0 ln_offset zp[2]:40 1.000000001E9
|
||||
(void()) cputs((to_nomodify byte*) cputs::s)
|
||||
(label) cputs::@1
|
||||
(label) cputs::@2
|
||||
(label) cputs::@return
|
||||
(byte) cputs::c
|
||||
(byte) cputs::c#1 reg byte a 1.0000001E7
|
||||
(to_nomodify byte*) cputs::s
|
||||
(to_nomodify byte*) cputs::s#0 s zp[2]:46 5000000.5
|
||||
(to_nomodify byte*) cputs::s#4 s zp[2]:46 1.5050002E7
|
||||
(to_nomodify byte*) cputs::s#5 s zp[2]:46 100001.0
|
||||
(void()) cscroll()
|
||||
(byte*~) cscroll::$7 zp[2]:21 2.0000000002E10
|
||||
(byte*~) cscroll::$8 zp[2]:23 2.0000000002E10
|
||||
(label) cscroll::@1
|
||||
(label) cscroll::@2
|
||||
(label) cscroll::@3
|
||||
(label) cscroll::@4
|
||||
(label) cscroll::@5
|
||||
(label) cscroll::@return
|
||||
(void()) eorfill((byte*) eorfill::line_buffer , (byte*) eorfill::canvas)
|
||||
(label) eorfill::@1
|
||||
(label) eorfill::@2
|
||||
@ -205,33 +154,24 @@
|
||||
(label) eorfill::@5
|
||||
(label) eorfill::@return
|
||||
(byte*) eorfill::canvas
|
||||
(byte*) eorfill::canvas#0 canvas zp[2]:23 551.0
|
||||
(byte*) eorfill::canvas#0 canvas zp[2]:31 551.0
|
||||
(byte) eorfill::eor
|
||||
(byte) eorfill::eor#0 reg byte a 200002.0
|
||||
(byte) eorfill::eor#0 reg byte a 150001.5
|
||||
(byte) eorfill::eor#1 reg byte a 1000001.0
|
||||
(byte) eorfill::eor#2 reg byte a 1050001.5
|
||||
(byte*) eorfill::fill_column
|
||||
(byte*) eorfill::fill_column#1 fill_column zp[2]:23 100001.0
|
||||
(byte*) eorfill::fill_column#5 fill_column zp[2]:23 133444.88888888888
|
||||
(byte*) eorfill::fill_column#1 fill_column zp[2]:31 100001.0
|
||||
(byte*) eorfill::fill_column#2 fill_column zp[2]:31 130100.5
|
||||
(byte*) eorfill::line_buffer
|
||||
(byte*) eorfill::line_column
|
||||
(byte*) eorfill::line_column#1 line_column zp[2]:21 66667.33333333333
|
||||
(byte*) eorfill::line_column#2 line_column zp[2]:21 162500.5
|
||||
(byte*) eorfill::line_column#1 line_column zp[2]:28 66667.33333333333
|
||||
(byte*) eorfill::line_column#2 line_column zp[2]:28 144444.88888888888
|
||||
(byte) eorfill::x
|
||||
(byte) eorfill::x#1 reg byte x 200002.0
|
||||
(byte) eorfill::x#2 reg byte x 30000.300000000003
|
||||
(byte) eorfill::x#2 reg byte x 27273.0
|
||||
(byte) eorfill::y
|
||||
(byte) eorfill::y#1 reg byte y 2000002.0
|
||||
(byte) eorfill::y#2 reg byte y 1250001.25
|
||||
(void()) gotoxy((byte) gotoxy::x , (byte) gotoxy::y)
|
||||
(label) gotoxy::@1
|
||||
(label) gotoxy::@return
|
||||
(word) gotoxy::offset
|
||||
(const word) gotoxy::offset#0 offset = (word)(const byte) gotoxy::y#2*(byte) $28
|
||||
(byte) gotoxy::x
|
||||
(const byte) gotoxy::x#2 x = (byte) 0
|
||||
(byte) gotoxy::y
|
||||
(const byte) gotoxy::y#2 y = (byte) $18
|
||||
interrupt(KERNEL_MIN)(void()) irq_bottom_1()
|
||||
(label) irq_bottom_1::@1
|
||||
(label) irq_bottom_1::@return
|
||||
@ -245,7 +185,13 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(label) irq_bottom_2::@1
|
||||
(label) irq_bottom_2::@2
|
||||
(label) irq_bottom_2::@3
|
||||
(label) irq_bottom_2::@4
|
||||
(label) irq_bottom_2::@return
|
||||
(label) irq_bottom_2::toD0181
|
||||
(byte*) irq_bottom_2::toD0181_gfx
|
||||
(byte) irq_bottom_2::toD0181_return
|
||||
(const byte) irq_bottom_2::toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) SCREEN&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) LINE_BUFFER/(byte) 4&(byte) $f
|
||||
(byte*) irq_bottom_2::toD0181_screen
|
||||
(byte()) kbhit()
|
||||
(label) kbhit::@return
|
||||
(byte) kbhit::return
|
||||
@ -259,7 +205,14 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(label) line::@13
|
||||
(label) line::@14
|
||||
(label) line::@15
|
||||
(label) line::@16
|
||||
(label) line::@17
|
||||
(label) line::@18
|
||||
(label) line::@19
|
||||
(label) line::@2
|
||||
(label) line::@20
|
||||
(label) line::@21
|
||||
(label) line::@22
|
||||
(label) line::@3
|
||||
(label) line::@4
|
||||
(label) line::@5
|
||||
@ -270,95 +223,120 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(label) line::@return
|
||||
(byte*) line::canvas
|
||||
(byte) line::dx
|
||||
(byte) line::dx#0 dx zp[1]:36 5941.294117647059
|
||||
(byte) line::dx#0 dx zp[1]:23 19462.805970149253
|
||||
(byte) line::dy
|
||||
(byte) line::dy#0 dy zp[1]:37 6446.936170212766
|
||||
(byte) line::dy#0 dy zp[1]:24 22285.85714285714
|
||||
(byte) line::e
|
||||
(byte) line::e#0 reg byte x 333.6666666666667
|
||||
(byte) line::e#1 reg byte x 133334.66666666666
|
||||
(byte) line::e#2 reg byte x 33333.666666666664
|
||||
(byte) line::e#0 reg byte x 2002.0
|
||||
(byte) line::e#1 reg byte x 44444.88888888889
|
||||
(byte) line::e#2 reg byte x 200002.0
|
||||
(byte) line::e#3 reg byte x 100501.5
|
||||
(byte) line::e#5 reg byte x 150001.5
|
||||
(byte) line::e1
|
||||
(byte) line::e1#0 reg byte x 2002.0
|
||||
(byte) line::e1#1 reg byte x 133334.66666666666
|
||||
(byte) line::e1#2 reg byte x 200002.0
|
||||
(byte) line::e1#3 reg byte x 28714.714285714286
|
||||
(byte) line::e1#7 reg byte x 150001.5
|
||||
(byte) line::e1#0 e1 zp[1]:14 2002.0
|
||||
(byte) line::e1#1 e1 zp[1]:14 1033334.6666666666
|
||||
(byte) line::e1#2 e1 zp[1]:14 28571.714285714286
|
||||
(byte) line::e1#3 e1 zp[1]:14 1050502.0
|
||||
(byte) line::e2
|
||||
(byte) line::e2#0 reg byte x 2002.0
|
||||
(byte) line::e2#1 reg byte x 133334.66666666666
|
||||
(byte) line::e2#2 reg byte x 200002.0
|
||||
(byte) line::e2#3 reg byte x 28714.714285714286
|
||||
(byte) line::e2#7 reg byte x 150001.5
|
||||
(label) line::plot1
|
||||
(byte~) line::plot1_$0 reg byte a 2002.0
|
||||
(byte~) line::plot1_$1 zp[1]:42 2002.0
|
||||
(byte~) line::plot1_$1 reg byte a 2002.0
|
||||
(byte~) line::plot1_$2 reg byte a 2002.0
|
||||
(byte*) line::plot1_column
|
||||
(byte*) line::plot1_column#0 plot1_column zp[2]:40 1501.5
|
||||
(byte*) line::plot1_column#0 plot1_column zp[2]:33 1501.5
|
||||
(byte) line::plot1_x
|
||||
(byte) line::plot1_y
|
||||
(label) line::plot2
|
||||
(byte~) line::plot2_$0 reg byte a 200002.0
|
||||
(byte~) line::plot2_$1 zp[1]:45 200002.0
|
||||
(byte~) line::plot2_$1 zp[1]:30 200002.0
|
||||
(byte~) line::plot2_$2 reg byte a 200002.0
|
||||
(byte*) line::plot2_column
|
||||
(byte*) line::plot2_column#0 plot2_column zp[2]:43 150001.5
|
||||
(byte*) line::plot2_column#0 plot2_column zp[2]:28 150001.5
|
||||
(byte) line::plot2_x
|
||||
(byte) line::plot2_x#0 plot2_x zp[1]:17 57143.42857142857
|
||||
(byte) line::plot2_y
|
||||
(byte) line::plot2_y#0 plot2_y zp[1]:27 60000.600000000006
|
||||
(label) line::plot3
|
||||
(byte~) line::plot3_$0 reg byte a 200002.0
|
||||
(byte~) line::plot3_$1 zp[1]:48 200002.0
|
||||
(byte~) line::plot3_$2 reg byte a 200002.0
|
||||
(byte~) line::plot3_$0 reg byte a 2002.0
|
||||
(byte~) line::plot3_$1 reg byte a 2002.0
|
||||
(byte~) line::plot3_$2 reg byte a 2002.0
|
||||
(byte*) line::plot3_column
|
||||
(byte*) line::plot3_column#0 plot3_column zp[2]:46 150001.5
|
||||
(byte*) line::plot3_column#0 plot3_column zp[2]:31 1501.5
|
||||
(byte) line::plot3_x
|
||||
(byte) line::plot3_y
|
||||
(label) line::plot4
|
||||
(byte~) line::plot4_$0 reg byte a 2002.0
|
||||
(byte~) line::plot4_$1 reg byte a 2002.0
|
||||
(byte~) line::plot4_$2 reg byte a 2002.0
|
||||
(byte~) line::plot4_$0 reg byte a 200002.0
|
||||
(byte~) line::plot4_$1 reg byte a 200002.0
|
||||
(byte~) line::plot4_$2 reg byte a 200002.0
|
||||
(byte*) line::plot4_column
|
||||
(byte*) line::plot4_column#0 plot4_column zp[2]:49 1501.5
|
||||
(byte*) line::plot4_column#0 plot4_column zp[2]:35 150001.5
|
||||
(byte) line::plot4_x
|
||||
(byte) line::plot4_y
|
||||
(label) line::plot5
|
||||
(byte~) line::plot5_$0 reg byte a 200002.0
|
||||
(byte~) line::plot5_$1 zp[1]:39 200002.0
|
||||
(byte~) line::plot5_$2 reg byte a 200002.0
|
||||
(byte*) line::plot5_column
|
||||
(byte*) line::plot5_column#0 plot5_column zp[2]:37 150001.5
|
||||
(byte) line::plot5_x
|
||||
(byte) line::plot5_y
|
||||
(label) line::plot6
|
||||
(byte~) line::plot6_$0 reg byte a 2002.0
|
||||
(byte~) line::plot6_$1 reg byte a 2002.0
|
||||
(byte~) line::plot6_$2 reg byte a 2002.0
|
||||
(byte*) line::plot6_column
|
||||
(byte*) line::plot6_column#0 plot6_column zp[2]:40 1501.5
|
||||
(byte) line::plot6_x
|
||||
(byte) line::plot6_y
|
||||
(byte) line::sx
|
||||
(byte) line::sx#0 sx zp[1]:38 4697.767441860465
|
||||
(byte) line::sx#0 sx zp[1]:25 5135.6949152542375
|
||||
(byte) line::sy
|
||||
(byte) line::sy#0 sy zp[1]:39 5153.923076923076
|
||||
(byte) line::sy#0 sy zp[1]:26 23672.836363636365
|
||||
(byte) line::x
|
||||
(byte) line::x#0 x zp[1]:17 217.55172413793105
|
||||
(byte) line::x#10 x zp[1]:17 75251.0
|
||||
(byte) line::x#12 x zp[1]:17 66834.16666666666
|
||||
(byte) line::x#13 x zp[1]:17 30200.5
|
||||
(byte) line::x#16 x zp[1]:17 150001.5
|
||||
(byte) line::x#0 x zp[1]:15 228.4375
|
||||
(byte) line::x#1 x zp[1]:15 100001.0
|
||||
(byte) line::x#10 x zp[1]:15 66834.16666666666
|
||||
(byte) line::x#12 x zp[1]:15 30200.5
|
||||
(byte) line::x#15 x zp[1]:15 50100.6
|
||||
(byte) line::x#17 x zp[1]:15 60401.0
|
||||
(byte) line::x#18 x zp[1]:15 550251.25
|
||||
(byte) line::x#19 x zp[1]:15 62500.625
|
||||
(byte) line::x1
|
||||
(byte) line::x1#0 x1 zp[1]:17 50.5
|
||||
(byte) line::x1#1 x1 zp[1]:17 50.5
|
||||
(byte) line::x1#2 x1 zp[1]:17 50.5
|
||||
(byte) line::x1#0 x1 zp[1]:15 50.5
|
||||
(byte) line::x1#1 x1 zp[1]:15 50.5
|
||||
(byte) line::x1#2 x1 zp[1]:15 50.5
|
||||
(byte) line::x2
|
||||
(byte) line::x2#0 x2 zp[1]:15 101.0
|
||||
(byte) line::x2#1 x2 zp[1]:15 101.0
|
||||
(byte) line::x2#11 x2 zp[1]:15 2841.8333333333335
|
||||
(byte) line::x2#2 x2 zp[1]:15 101.0
|
||||
(byte) line::x2#0 x2 zp[1]:12 101.0
|
||||
(byte) line::x2#1 x2 zp[1]:12 101.0
|
||||
(byte) line::x2#15 x2 zp[1]:12 3612.625
|
||||
(byte) line::x2#2 x2 zp[1]:12 101.0
|
||||
(byte) line::y
|
||||
(byte) line::y#0 y zp[1]:18 239.27777777777777
|
||||
(byte) line::y#1 y zp[1]:18 1001.0
|
||||
(byte) line::y#10 y zp[1]:18 55667.33333333333
|
||||
(byte) line::y#11 y zp[1]:18 50334.16666666667
|
||||
(byte) line::y#13 y zp[1]:18 667.3333333333333
|
||||
(byte) line::y#15 y zp[1]:18 41667.08333333333
|
||||
(byte) line::y#3 y zp[1]:18 100001.0
|
||||
(byte) line::y#6 y zp[1]:18 201003.0
|
||||
(byte) line::y#0 y zp[1]:16 239.27777777777777
|
||||
(byte) line::y#1 y zp[1]:16 1001.0
|
||||
(byte) line::y#10 y zp[1]:16 23647.411764705877
|
||||
(byte) line::y#11 y zp[1]:16 2101004.0
|
||||
(byte) line::y#12 y zp[1]:16 209091.36363636365
|
||||
(byte) line::y#13 y zp[1]:16 55667.33333333333
|
||||
(byte) line::y#15 y zp[1]:16 50334.16666666667
|
||||
(byte) line::y#17 y zp[1]:16 583.9166666666667
|
||||
(byte) line::y#4 y zp[1]:16 100001.0
|
||||
(byte) line::y#7 y zp[1]:16 201003.0
|
||||
(byte) line::y1
|
||||
(byte) line::y1#0 y1 zp[1]:18 67.33333333333333
|
||||
(byte) line::y1#1 y1 zp[1]:18 67.33333333333333
|
||||
(byte) line::y1#2 y1 zp[1]:18 67.33333333333333
|
||||
(byte) line::y1#0 y1 zp[1]:16 67.33333333333333
|
||||
(byte) line::y1#1 y1 zp[1]:16 67.33333333333333
|
||||
(byte) line::y1#2 y1 zp[1]:16 67.33333333333333
|
||||
(byte) line::y2
|
||||
(byte) line::y2#0 y2 zp[1]:16 202.0
|
||||
(byte) line::y2#1 y2 zp[1]:16 202.0
|
||||
(byte) line::y2#10 y2 zp[1]:16 226.68421052631578
|
||||
(byte) line::y2#13 y2 zp[1]:16 4857.285714285714
|
||||
(byte) line::y2#2 y2 zp[1]:16 202.0
|
||||
(byte) line::y2#3 y2 zp[1]:16 2002.0
|
||||
(byte) line::y2#0 y2 zp[1]:13 202.0
|
||||
(byte) line::y2#1 y2 zp[1]:13 202.0
|
||||
(byte) line::y2#10 y2 zp[1]:13 226.68421052631578
|
||||
(byte) line::y2#13 y2 zp[1]:13 5666.833333333334
|
||||
(byte) line::y2#2 y2 zp[1]:13 202.0
|
||||
(byte) line::y2#3 y2 zp[1]:13 2002.0
|
||||
(void()) main()
|
||||
(dword~) main::$18 zp[4]:11 202.0
|
||||
(label) main::@1
|
||||
(label) main::@10
|
||||
(label) main::@11
|
||||
@ -373,11 +351,6 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(label) main::@2
|
||||
(label) main::@20
|
||||
(label) main::@21
|
||||
(label) main::@22
|
||||
(label) main::@23
|
||||
(label) main::@24
|
||||
(label) main::@25
|
||||
(label) main::@26
|
||||
(label) main::@3
|
||||
(label) main::@4
|
||||
(label) main::@5
|
||||
@ -390,28 +363,24 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(byte) main::c#2 reg byte x 776.0
|
||||
(byte) main::c#4 reg byte x 202.0
|
||||
(byte*) main::canvas
|
||||
(word) main::canvas#1 canvas zp[2]:9 5.611111111111111
|
||||
(byte*) main::canvas#10 canvas zp[2]:9 8.911764705882353
|
||||
(byte*) main::canvas#24 canvas zp[2]:9 202.0
|
||||
(word) main::canvas#1 canvas zp[2]:10 16.833333333333332
|
||||
(byte*) main::canvas#10 canvas zp[2]:10 8.911764705882353
|
||||
(byte*) main::canvas#19 canvas zp[2]:10 202.0
|
||||
(byte*) main::cols
|
||||
(byte*) main::cols#1 cols zp[2]:2 67.33333333333333
|
||||
(byte*) main::cols#5 cols zp[2]:2 133.66666666666669
|
||||
(dword) main::cyclecount
|
||||
(dword) main::cyclecount#0 cyclecount zp[4]:11 25.25
|
||||
(byte*) main::cols#1 cols zp[2]:3 67.33333333333333
|
||||
(byte*) main::cols#5 cols zp[2]:3 133.66666666666669
|
||||
(byte) main::p0_idx
|
||||
(byte) main::p0_idx#1 p0_idx zp[1]:6 11.222222222222223
|
||||
(byte) main::p0_idx#11 p0_idx zp[1]:6 15.538461538461538
|
||||
(byte) main::p0_idx#1 p0_idx zp[1]:7 13.466666666666667
|
||||
(byte) main::p0_idx#2 p0_idx zp[1]:7 15.538461538461538
|
||||
(byte) main::p1_idx
|
||||
(byte) main::p1_idx#1 p1_idx zp[1]:7 7.769230769230769
|
||||
(byte) main::p1_idx#2 p1_idx zp[1]:7 14.962962962962964
|
||||
(byte) main::p1_idx#1 p1_idx zp[1]:8 14.428571428571429
|
||||
(byte) main::p1_idx#2 p1_idx zp[1]:8 14.962962962962964
|
||||
(byte) main::p2_idx
|
||||
(byte) main::p2_idx#1 p2_idx zp[1]:8 8.08
|
||||
(byte) main::p2_idx#2 p2_idx zp[1]:8 14.428571428571429
|
||||
(const byte*) main::s[(byte) 8] = (byte*) "frame: "
|
||||
(const byte*) main::s1[(byte) $a] = (byte*) " cycles: "
|
||||
(byte) main::p2_idx#1 p2_idx zp[1]:9 15.538461538461538
|
||||
(byte) main::p2_idx#2 p2_idx zp[1]:9 14.428571428571429
|
||||
(byte*) main::screen
|
||||
(byte*) main::screen#1 screen zp[2]:4 101.0
|
||||
(byte*) main::screen#5 screen zp[2]:4 120.3
|
||||
(byte*) main::screen#1 screen zp[2]:5 101.0
|
||||
(byte*) main::screen#5 screen zp[2]:5 120.3
|
||||
(label) main::toD0181
|
||||
(byte*) main::toD0181_gfx
|
||||
(byte) main::toD0181_return
|
||||
@ -426,62 +395,40 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(byte) main::x#1 reg byte y 2002.0
|
||||
(byte) main::x#2 reg byte y 1001.0
|
||||
(byte) main::x0
|
||||
(byte) main::x0#0 x0 zp[1]:28 16.833333333333332
|
||||
(byte) main::x0#0 x0 zp[1]:19 16.833333333333332
|
||||
(byte) main::x1
|
||||
(byte) main::x1#0 x1 zp[1]:15 33.666666666666664
|
||||
(byte) main::x1#0 x1 zp[1]:12 33.666666666666664
|
||||
(byte) main::x2
|
||||
(byte) main::x2#0 x2 zp[1]:15 43.285714285714285
|
||||
(byte) main::x2#0 x2 zp[1]:12 43.285714285714285
|
||||
(byte) main::y
|
||||
(byte) main::y#1 y zp[1]:19 202.0
|
||||
(byte) main::y#2 y zp[1]:19 36.72727272727273
|
||||
(byte) main::y#1 y zp[1]:2 202.0
|
||||
(byte) main::y#2 y zp[1]:2 36.72727272727273
|
||||
(byte) main::y0
|
||||
(byte) main::y0#0 y0 zp[1]:29 16.833333333333332
|
||||
(byte) main::y0#0 y0 zp[1]:20 16.833333333333332
|
||||
(byte) main::y1
|
||||
(byte) main::y1#0 y1 zp[1]:30 33.666666666666664
|
||||
(byte) main::y1#0 y1 zp[1]:21 33.666666666666664
|
||||
(byte) main::y2
|
||||
(byte) main::y2#0 y2 zp[1]:31 43.285714285714285
|
||||
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
|
||||
(label) memcpy::@1
|
||||
(label) memcpy::@2
|
||||
(label) memcpy::@return
|
||||
(void*) memcpy::destination
|
||||
(void*) memcpy::destination#2 destination zp[2]:49
|
||||
(byte*) memcpy::dst
|
||||
(byte*) memcpy::dst#1 dst zp[2]:49 1.00000000000001E14
|
||||
(byte*) memcpy::dst#2 dst zp[2]:49 1.0003333333333467E14
|
||||
(byte*) memcpy::dst#4 dst zp[2]:49 2.00000000002E11
|
||||
(word) memcpy::num
|
||||
(void*) memcpy::return
|
||||
(void*) memcpy::source
|
||||
(void*) memcpy::source#2 source zp[2]:40
|
||||
(byte*) memcpy::src
|
||||
(byte*) memcpy::src#1 src zp[2]:40 2.00000000000002E14
|
||||
(byte*) memcpy::src#2 src zp[2]:40 1.0002500000000125E14
|
||||
(byte*) memcpy::src#4 src zp[2]:40 1.00000000001E11
|
||||
(byte*) memcpy::src_end
|
||||
(byte*) memcpy::src_end#0 src_end zp[2]:43 1.251250000000025E13
|
||||
(byte) main::y2#0 y2 zp[1]:22 43.285714285714285
|
||||
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
|
||||
(label) memset::@1
|
||||
(label) memset::@2
|
||||
(label) memset::@3
|
||||
(label) memset::@return
|
||||
(byte) memset::c
|
||||
(byte) memset::c#1 reg byte x 2.0000000002E10
|
||||
(byte) memset::c#8 reg byte x 1.25125000000025E12
|
||||
(byte) memset::c#6 reg byte x 12500.125
|
||||
(byte*) memset::dst
|
||||
(byte*) memset::dst#1 dst zp[2]:49 2.0000000000002E13
|
||||
(byte*) memset::dst#2 dst zp[2]:49 1.3366666666668332E13
|
||||
(byte*) memset::dst#4 dst zp[2]:49 2.00000000002E11
|
||||
(byte*) memset::dst#1 dst zp[2]:31 200002.0
|
||||
(byte*) memset::dst#2 dst zp[2]:31 133668.3333333333
|
||||
(byte*) memset::dst#4 dst zp[2]:31 2002.0
|
||||
(byte*) memset::end
|
||||
(byte*) memset::end#0 end zp[2]:40 1.6833333333336665E12
|
||||
(byte*) memset::end#0 end zp[2]:28 16833.666666666664
|
||||
(word) memset::num
|
||||
(word) memset::num#6 num zp[2]:40 1.00000000001E11
|
||||
(word) memset::num#4 num zp[2]:28 1001.0
|
||||
(void*) memset::return
|
||||
(void*) memset::str
|
||||
(void*) memset::str#7 str zp[2]:49
|
||||
(void*) memset::str#5 str zp[2]:31
|
||||
(const byte*) plot_bit[(number) 8] = { (byte) $80, (byte) $40, (byte) $20, (byte) $10, (byte) 8, (byte) 4, (byte) 2, (byte) 1 }
|
||||
(const byte**) plot_column[(number) $10] = { (const nomodify byte*) LINE_BUFFER, (const nomodify byte*) LINE_BUFFER+(byte)(number) 1*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 2*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 3*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 4*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 5*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 6*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 7*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 8*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) 9*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $a*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $b*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $c*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $d*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $e*(number) $80, (const nomodify byte*) LINE_BUFFER+(word)(number) $f*(number) $80 }
|
||||
(struct printf_buffer_number) printf_buffer loadstore mem[12] = {}
|
||||
(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) }
|
||||
(byte) printf_buffer_number::sign
|
||||
(byte) printf_format_number::justify_left
|
||||
@ -492,103 +439,6 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(byte) printf_format_number::zero_padding
|
||||
(byte) printf_format_string::justify_left
|
||||
(byte) printf_format_string::min_length
|
||||
(void()) printf_number_buffer((byte) printf_number_buffer::buffer_sign , (byte*) printf_number_buffer::buffer_digits , (byte) printf_number_buffer::format_min_length , (byte) printf_number_buffer::format_justify_left , (byte) printf_number_buffer::format_sign_always , (byte) printf_number_buffer::format_zero_padding , (byte) printf_number_buffer::format_upper_case , (byte) printf_number_buffer::format_radix)
|
||||
(word~) printf_number_buffer::$19 zp[2]:49 10001.0
|
||||
(label) printf_number_buffer::@1
|
||||
(label) printf_number_buffer::@10
|
||||
(label) printf_number_buffer::@11
|
||||
(label) printf_number_buffer::@12
|
||||
(label) printf_number_buffer::@13
|
||||
(label) printf_number_buffer::@14
|
||||
(label) printf_number_buffer::@15
|
||||
(label) printf_number_buffer::@16
|
||||
(label) printf_number_buffer::@17
|
||||
(label) printf_number_buffer::@18
|
||||
(label) printf_number_buffer::@19
|
||||
(label) printf_number_buffer::@2
|
||||
(label) printf_number_buffer::@20
|
||||
(label) printf_number_buffer::@21
|
||||
(label) printf_number_buffer::@3
|
||||
(label) printf_number_buffer::@4
|
||||
(label) printf_number_buffer::@5
|
||||
(label) printf_number_buffer::@6
|
||||
(label) printf_number_buffer::@7
|
||||
(label) printf_number_buffer::@8
|
||||
(label) printf_number_buffer::@9
|
||||
(label) printf_number_buffer::@return
|
||||
(struct printf_buffer_number) printf_number_buffer::buffer
|
||||
(byte*) printf_number_buffer::buffer_digits
|
||||
(byte) printf_number_buffer::buffer_sign
|
||||
(byte) printf_number_buffer::buffer_sign#0 buffer_sign zp[1]:31 2002.0
|
||||
(byte) printf_number_buffer::buffer_sign#1 buffer_sign zp[1]:31 2002.0
|
||||
(byte) printf_number_buffer::buffer_sign#10 buffer_sign zp[1]:31 1600.25
|
||||
(struct printf_format_number) printf_number_buffer::format
|
||||
(byte) printf_number_buffer::format_justify_left
|
||||
(byte) printf_number_buffer::format_justify_left#10 format_justify_left zp[1]:29 645.2258064516129
|
||||
(byte) printf_number_buffer::format_min_length
|
||||
(byte) printf_number_buffer::format_min_length#2 reg byte x 1000.1
|
||||
(byte) printf_number_buffer::format_radix
|
||||
(byte) printf_number_buffer::format_sign_always
|
||||
(byte) printf_number_buffer::format_upper_case
|
||||
(byte) printf_number_buffer::format_upper_case#10 format_upper_case zp[1]:15 384.65384615384613
|
||||
(byte) printf_number_buffer::format_zero_padding
|
||||
(byte) printf_number_buffer::format_zero_padding#10 format_zero_padding zp[1]:30 937.59375
|
||||
(signed byte) printf_number_buffer::len
|
||||
(signed byte) printf_number_buffer::len#0 reg byte y 15001.5
|
||||
(signed byte) printf_number_buffer::len#1 reg byte y 20002.0
|
||||
(signed byte) printf_number_buffer::len#2 reg byte y 30003.0
|
||||
(signed byte) printf_number_buffer::padding
|
||||
(signed byte) printf_number_buffer::padding#1 padding zp[1]:16 10001.0
|
||||
(signed byte) printf_number_buffer::padding#10 padding zp[1]:16 1904.952380952381
|
||||
(void()) printf_padding((byte) printf_padding::pad , (byte) printf_padding::length)
|
||||
(label) printf_padding::@1
|
||||
(label) printf_padding::@2
|
||||
(label) printf_padding::@3
|
||||
(label) printf_padding::@return
|
||||
(byte) printf_padding::i
|
||||
(byte) printf_padding::i#1 i zp[1]:28 2.0000002E7
|
||||
(byte) printf_padding::i#2 i zp[1]:28 7500000.75
|
||||
(byte) printf_padding::length
|
||||
(byte) printf_padding::length#0 length zp[1]:17 20002.0
|
||||
(byte) printf_padding::length#1 length zp[1]:17 20002.0
|
||||
(byte) printf_padding::length#2 length zp[1]:17 20002.0
|
||||
(byte) printf_padding::length#4 length zp[1]:17 1671667.3333333333
|
||||
(byte) printf_padding::pad
|
||||
(byte) printf_padding::pad#5 pad zp[1]:18 1666666.8333333333
|
||||
(void()) printf_uchar((byte) printf_uchar::uvalue , (byte) printf_uchar::format_min_length , (byte) printf_uchar::format_justify_left , (byte) printf_uchar::format_sign_always , (byte) printf_uchar::format_zero_padding , (byte) printf_uchar::format_upper_case , (byte) printf_uchar::format_radix)
|
||||
(label) printf_uchar::@1
|
||||
(label) printf_uchar::@2
|
||||
(label) printf_uchar::@return
|
||||
(struct printf_format_number) printf_uchar::format
|
||||
(byte) printf_uchar::format_justify_left
|
||||
(const byte) printf_uchar::format_justify_left#0 format_justify_left = (byte) 0
|
||||
(byte) printf_uchar::format_min_length
|
||||
(const byte) printf_uchar::format_min_length#0 format_min_length = (byte) 2
|
||||
(byte) printf_uchar::format_radix
|
||||
(byte) printf_uchar::format_sign_always
|
||||
(byte) printf_uchar::format_upper_case
|
||||
(const byte) printf_uchar::format_upper_case#0 format_upper_case = (byte) 0
|
||||
(byte) printf_uchar::format_zero_padding
|
||||
(const byte) printf_uchar::format_zero_padding#0 format_zero_padding = (byte) 1
|
||||
(byte) printf_uchar::uvalue
|
||||
(byte) printf_uchar::uvalue#0 reg byte x 367.33333333333337
|
||||
(void()) printf_ulong((dword) printf_ulong::uvalue , (byte) printf_ulong::format_min_length , (byte) printf_ulong::format_justify_left , (byte) printf_ulong::format_sign_always , (byte) printf_ulong::format_zero_padding , (byte) printf_ulong::format_upper_case , (byte) printf_ulong::format_radix)
|
||||
(label) printf_ulong::@1
|
||||
(label) printf_ulong::@2
|
||||
(label) printf_ulong::@return
|
||||
(struct printf_format_number) printf_ulong::format
|
||||
(byte) printf_ulong::format_justify_left
|
||||
(const byte) printf_ulong::format_justify_left#0 format_justify_left = (byte) 0
|
||||
(byte) printf_ulong::format_min_length
|
||||
(const byte) printf_ulong::format_min_length#0 format_min_length = (byte) 6
|
||||
(byte) printf_ulong::format_radix
|
||||
(byte) printf_ulong::format_sign_always
|
||||
(byte) printf_ulong::format_upper_case
|
||||
(const byte) printf_ulong::format_upper_case#0 format_upper_case = (byte) 0
|
||||
(byte) printf_ulong::format_zero_padding
|
||||
(const byte) printf_ulong::format_zero_padding#0 format_zero_padding = (byte) 0
|
||||
(dword) printf_ulong::uvalue
|
||||
(dword) printf_ulong::uvalue#0 uvalue zp[4]:11 367.33333333333337
|
||||
(void()) setup_irq()
|
||||
(label) setup_irq::@return
|
||||
(byte()) sgn_u8((byte) sgn_u8::u)
|
||||
@ -603,30 +453,6 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(byte) sgn_u8::u#0 reg byte a 2002.0
|
||||
(byte) sgn_u8::u#1 reg byte a 2002.0
|
||||
(byte) sgn_u8::u#2 reg byte a 12003.0
|
||||
(word()) strlen((byte*) strlen::str)
|
||||
(label) strlen::@1
|
||||
(label) strlen::@2
|
||||
(label) strlen::@return
|
||||
(word) strlen::len
|
||||
(word) strlen::len#1 len zp[2]:49 1.0000001E7
|
||||
(word) strlen::len#2 len zp[2]:49 5002500.75
|
||||
(word) strlen::return
|
||||
(word) strlen::return#2 return zp[2]:49 20002.0
|
||||
(byte*) strlen::str
|
||||
(byte*) strlen::str#0 str zp[2]:40 2.0000002E7
|
||||
(byte*) strlen::str#2 str zp[2]:40 1.0000001E7
|
||||
(byte*()) strupr((byte*) strupr::str)
|
||||
(byte~) strupr::$0 reg byte a 2.0000002E7
|
||||
(label) strupr::@1
|
||||
(label) strupr::@2
|
||||
(label) strupr::@3
|
||||
(label) strupr::@return
|
||||
(byte*) strupr::return
|
||||
(byte*) strupr::src
|
||||
(byte*) strupr::src#1 src zp[2]:46 2.0000002E7
|
||||
(byte*) strupr::src#2 src zp[2]:46 7142857.857142856
|
||||
(byte*) strupr::str
|
||||
(const byte*) strupr::str#0 str = (byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS
|
||||
(byte()) textcolor((byte) textcolor::color)
|
||||
(label) textcolor::@return
|
||||
(byte) textcolor::color
|
||||
@ -637,194 +463,71 @@ interrupt(KERNEL_KEYBOARD)(void()) irq_bottom_2()
|
||||
(byte) toD0181_return
|
||||
(const byte) toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) SCREEN&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) CANVAS2/(byte) 4&(byte) $f
|
||||
(byte*) toD0181_screen
|
||||
(byte()) toupper((byte) toupper::ch)
|
||||
(label) toupper::@1
|
||||
(label) toupper::@2
|
||||
(label) toupper::@return
|
||||
(byte) toupper::ch
|
||||
(byte) toupper::ch#0 reg byte a 1.70000002E8
|
||||
(byte) toupper::return
|
||||
(byte) toupper::return#0 reg byte a 2.00000002E8
|
||||
(byte) toupper::return#2 reg byte a 1.0333333466666667E8
|
||||
(byte) toupper::return#3 reg byte a 2.0000002E7
|
||||
(void()) uctoa((byte) uctoa::value , (byte*) uctoa::buffer , (byte) uctoa::radix)
|
||||
(label) uctoa::@1
|
||||
(label) uctoa::@2
|
||||
(label) uctoa::@3
|
||||
(label) uctoa::@4
|
||||
(label) uctoa::@5
|
||||
(label) uctoa::@6
|
||||
(label) uctoa::@7
|
||||
(label) uctoa::@return
|
||||
(byte*) uctoa::buffer
|
||||
(byte*) uctoa::buffer#11 buffer zp[2]:49 335000.50000000006
|
||||
(byte*) uctoa::buffer#14 buffer zp[2]:49 1500001.5
|
||||
(byte*) uctoa::buffer#3 buffer zp[2]:49 20002.0
|
||||
(byte*) uctoa::buffer#4 buffer zp[2]:49 2000002.0
|
||||
(byte) uctoa::digit
|
||||
(byte) uctoa::digit#1 digit zp[1]:30 2000002.0
|
||||
(byte) uctoa::digit#2 digit zp[1]:30 307692.6153846154
|
||||
(byte) uctoa::digit_value
|
||||
(byte) uctoa::digit_value#0 digit_value zp[1]:36 600000.6000000001
|
||||
(byte*) uctoa::digit_values
|
||||
(byte) uctoa::max_digits
|
||||
(const byte) uctoa::max_digits#2 max_digits = (byte) 2
|
||||
(byte) uctoa::radix
|
||||
(byte) uctoa::started
|
||||
(byte) uctoa::started#2 started zp[1]:31 600000.6000000001
|
||||
(byte) uctoa::started#4 started zp[1]:31 1000001.0
|
||||
(byte) uctoa::value
|
||||
(byte) uctoa::value#0 reg byte x 1000001.0
|
||||
(byte) uctoa::value#1 reg byte x 5501.0
|
||||
(byte) uctoa::value#2 reg byte x 670001.0000000001
|
||||
(byte) uctoa::value#6 reg byte x 1500001.5
|
||||
(byte()) uctoa_append((byte*) uctoa_append::buffer , (byte) uctoa_append::value , (byte) uctoa_append::sub)
|
||||
(label) uctoa_append::@1
|
||||
(label) uctoa_append::@2
|
||||
(label) uctoa_append::@3
|
||||
(label) uctoa_append::@return
|
||||
(byte*) uctoa_append::buffer
|
||||
(byte*) uctoa_append::buffer#0 buffer zp[2]:49 1375000.25
|
||||
(byte) uctoa_append::digit
|
||||
(byte) uctoa_append::digit#1 reg byte y 1.0000000001E10
|
||||
(byte) uctoa_append::digit#2 reg byte y 1.00050000015E10
|
||||
(byte) uctoa_append::return
|
||||
(byte) uctoa_append::return#0 reg byte x 2000002.0
|
||||
(byte) uctoa_append::sub
|
||||
(byte) uctoa_append::sub#0 sub zp[1]:36 3.3335000005E9
|
||||
(byte) uctoa_append::value
|
||||
(byte) uctoa_append::value#0 reg byte x 3666667.333333333
|
||||
(byte) uctoa_append::value#1 reg byte x 2.0000000002E10
|
||||
(byte) uctoa_append::value#2 reg byte x 5.001833334166666E9
|
||||
(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix)
|
||||
(byte~) ultoa::$10 reg byte a 2000002.0
|
||||
(byte~) ultoa::$11 reg byte a 20002.0
|
||||
(label) ultoa::@1
|
||||
(label) ultoa::@2
|
||||
(label) ultoa::@3
|
||||
(label) ultoa::@4
|
||||
(label) ultoa::@5
|
||||
(label) ultoa::@6
|
||||
(label) ultoa::@7
|
||||
(label) ultoa::@return
|
||||
(byte*) ultoa::buffer
|
||||
(byte*) ultoa::buffer#11 buffer zp[2]:40 287143.2857142857
|
||||
(byte*) ultoa::buffer#14 buffer zp[2]:40 1500001.5
|
||||
(byte*) ultoa::buffer#3 buffer zp[2]:40 20002.0
|
||||
(byte*) ultoa::buffer#4 buffer zp[2]:40 2000002.0
|
||||
(byte) ultoa::digit
|
||||
(byte) ultoa::digit#1 digit zp[1]:29 2000002.0
|
||||
(byte) ultoa::digit#2 digit zp[1]:29 285714.5714285714
|
||||
(dword) ultoa::digit_value
|
||||
(dword) ultoa::digit_value#0 digit_value zp[4]:32 600000.6000000001
|
||||
(dword*) ultoa::digit_values
|
||||
(byte) ultoa::max_digits
|
||||
(const byte) ultoa::max_digits#1 max_digits = (byte) $a
|
||||
(byte) ultoa::radix
|
||||
(byte) ultoa::started
|
||||
(byte) ultoa::started#2 reg byte x 500000.5
|
||||
(byte) ultoa::started#4 reg byte x 1000001.0
|
||||
(dword) ultoa::value
|
||||
(dword) ultoa::value#0 value zp[4]:11 1000001.0
|
||||
(dword) ultoa::value#1 value zp[4]:11 5501.0
|
||||
(dword) ultoa::value#2 value zp[4]:11 572857.857142857
|
||||
(dword) ultoa::value#6 value zp[4]:11 1500001.5
|
||||
(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub)
|
||||
(label) ultoa_append::@1
|
||||
(label) ultoa_append::@2
|
||||
(label) ultoa_append::@3
|
||||
(label) ultoa_append::@return
|
||||
(byte*) ultoa_append::buffer
|
||||
(byte*) ultoa_append::buffer#0 buffer zp[2]:40 1375000.25
|
||||
(byte) ultoa_append::digit
|
||||
(byte) ultoa_append::digit#1 reg byte x 1.0000000001E10
|
||||
(byte) ultoa_append::digit#2 reg byte x 1.00050000015E10
|
||||
(dword) ultoa_append::return
|
||||
(dword) ultoa_append::return#0 return zp[4]:11 2000002.0
|
||||
(dword) ultoa_append::sub
|
||||
(dword) ultoa_append::sub#0 sub zp[4]:32 3.3335000005E9
|
||||
(dword) ultoa_append::value
|
||||
(dword) ultoa_append::value#0 value zp[4]:11 3666667.333333333
|
||||
(dword) ultoa_append::value#1 value zp[4]:11 2.0000000002E10
|
||||
(dword) ultoa_append::value#2 value zp[4]:11 5.001833334166666E9
|
||||
|
||||
zp[2]:2 [ main::cols#5 main::cols#1 ]
|
||||
zp[2]:4 [ main::screen#5 main::screen#1 ]
|
||||
zp[1]:6 [ main::p0_idx#11 main::p0_idx#1 ]
|
||||
zp[1]:7 [ main::p1_idx#2 main::p1_idx#1 ]
|
||||
zp[1]:8 [ main::p2_idx#2 main::p2_idx#1 ]
|
||||
zp[2]:9 [ main::canvas#10 main::canvas#24 main::canvas#1 ]
|
||||
zp[1]:2 [ main::y#2 main::y#1 ]
|
||||
zp[2]:3 [ main::cols#5 main::cols#1 ]
|
||||
zp[2]:5 [ main::screen#5 main::screen#1 ]
|
||||
zp[1]:7 [ main::p0_idx#2 main::p0_idx#1 ]
|
||||
zp[1]:8 [ main::p1_idx#2 main::p1_idx#1 ]
|
||||
zp[1]:9 [ main::p2_idx#2 main::p2_idx#1 ]
|
||||
zp[2]:10 [ main::canvas#10 main::canvas#19 main::canvas#1 ]
|
||||
reg byte y [ main::x#2 main::x#1 ]
|
||||
reg byte x [ main::c#2 main::c#4 main::c#1 ]
|
||||
reg byte x [ printf_number_buffer::format_min_length#2 ]
|
||||
reg byte y [ printf_number_buffer::len#2 printf_number_buffer::len#0 printf_number_buffer::len#1 ]
|
||||
reg byte a [ cputc::c#3 cputc::c#0 cputc::c#2 cputc::c#1 ]
|
||||
reg byte x [ memset::c#8 memset::c#1 ]
|
||||
reg byte a [ toupper::return#2 toupper::return#0 toupper::ch#0 ]
|
||||
zp[4]:11 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 printf_ulong::uvalue#0 ultoa_append::return#0 main::cyclecount#0 clock::return#2 main::$18 clock::return#0 ]
|
||||
reg byte x [ ultoa::started#2 ultoa::started#4 ]
|
||||
reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ]
|
||||
reg byte x [ uctoa::value#2 uctoa::value#6 uctoa::value#1 uctoa::value#0 ]
|
||||
reg byte x [ uctoa_append::value#2 uctoa_append::value#0 uctoa_append::value#1 ]
|
||||
reg byte y [ uctoa_append::digit#2 uctoa_append::digit#1 ]
|
||||
reg byte x [ eorfill::x#2 eorfill::x#1 ]
|
||||
reg byte y [ eorfill::y#2 eorfill::y#1 ]
|
||||
reg byte a [ eorfill::eor#2 eorfill::eor#0 eorfill::eor#1 ]
|
||||
zp[1]:15 [ line::x2#11 line::x2#0 line::x2#1 line::x2#2 main::x1#0 main::x2#0 printf_number_buffer::format_upper_case#10 ]
|
||||
zp[1]:16 [ line::y2#13 line::y2#10 line::y2#0 line::y2#1 line::y2#2 line::y2#3 printf_number_buffer::padding#10 printf_number_buffer::padding#1 ]
|
||||
reg byte x [ line::e#3 line::e#5 line::e#0 line::e#1 line::e#2 ]
|
||||
zp[1]:17 [ line::x#12 line::x#10 line::x#16 line::x#0 line::x1#0 line::x1#1 line::x1#2 line::plot2_x#0 line::x#13 printf_padding::length#4 printf_padding::length#1 printf_padding::length#2 printf_padding::length#0 ]
|
||||
zp[1]:18 [ line::y#10 line::y#6 line::y#15 line::y#13 line::y#0 line::y1#0 line::y1#1 line::y1#2 line::y#1 line::y#11 line::y#3 printf_padding::pad#5 ]
|
||||
reg byte x [ line::e1#3 line::e1#0 line::e1#7 line::e1#2 line::e1#1 ]
|
||||
zp[1]:12 [ line::x2#15 line::x2#0 line::x2#1 line::x2#2 main::x1#0 main::x2#0 ]
|
||||
zp[1]:13 [ line::y2#13 line::y2#10 line::y2#0 line::y2#1 line::y2#2 line::y2#3 ]
|
||||
reg byte x [ line::e#3 line::e#0 line::e#5 line::e#2 line::e#1 ]
|
||||
zp[1]:14 [ line::e1#3 line::e1#0 line::e1#1 line::e1#2 ]
|
||||
zp[1]:15 [ line::x#10 line::x#12 line::x#18 line::x#15 line::x#0 line::x1#0 line::x1#1 line::x1#2 line::x#17 line::x#1 line::x#19 ]
|
||||
zp[1]:16 [ line::y#13 line::y#15 line::y#11 line::y#7 line::y#17 line::y#0 line::y1#0 line::y1#1 line::y1#2 line::y#1 line::y#10 line::y#12 line::y#4 ]
|
||||
reg byte x [ line::e2#3 line::e2#7 line::e2#0 line::e2#2 line::e2#1 ]
|
||||
reg byte a [ sgn_u8::u#2 sgn_u8::u#0 sgn_u8::u#1 ]
|
||||
reg byte a [ sgn_u8::return#4 ]
|
||||
reg byte a [ abs_u8::return#4 abs_u8::return#2 abs_u8::u#2 abs_u8::u#0 abs_u8::u#1 ]
|
||||
zp[1]:19 [ conio_cursor_x main::y#2 main::y#1 ]
|
||||
zp[1]:20 [ conio_cursor_y ]
|
||||
zp[2]:21 [ conio_cursor_text cputln::$1 cscroll::$7 eorfill::line_column#2 eorfill::line_column#1 ]
|
||||
zp[2]:23 [ conio_cursor_color cputln::$2 cscroll::$8 eorfill::fill_column#5 eorfill::canvas#0 eorfill::fill_column#1 ]
|
||||
zp[1]:25 [ conio_textcolor ]
|
||||
zp[1]:26 [ canvas_show_memory ]
|
||||
zp[1]:27 [ canvas_show_flag ]
|
||||
zp[1]:28 [ main::x0#0 printf_padding::i#2 printf_padding::i#1 ]
|
||||
zp[1]:29 [ main::y0#0 ultoa::digit#2 ultoa::digit#1 printf_number_buffer::format_justify_left#10 ]
|
||||
zp[1]:30 [ main::y1#0 uctoa::digit#2 uctoa::digit#1 printf_number_buffer::format_zero_padding#10 ]
|
||||
zp[1]:31 [ main::y2#0 uctoa::started#2 uctoa::started#4 printf_number_buffer::buffer_sign#10 printf_number_buffer::buffer_sign#1 printf_number_buffer::buffer_sign#0 ]
|
||||
reg byte x [ printf_uchar::uvalue#0 ]
|
||||
reg byte a [ cputs::c#1 ]
|
||||
reg byte a [ toupper::return#3 ]
|
||||
reg byte a [ strupr::$0 ]
|
||||
reg byte a [ ultoa::$11 ]
|
||||
reg byte a [ ultoa::$10 ]
|
||||
zp[4]:32 [ ultoa::digit_value#0 ultoa_append::sub#0 ]
|
||||
reg byte x [ uctoa_append::return#0 ]
|
||||
reg byte x [ memset::c#6 ]
|
||||
zp[1]:17 [ canvas_show_memory ]
|
||||
zp[1]:18 [ canvas_show_flag ]
|
||||
zp[1]:19 [ main::x0#0 ]
|
||||
zp[1]:20 [ main::y0#0 ]
|
||||
zp[1]:21 [ main::y1#0 ]
|
||||
zp[1]:22 [ main::y2#0 ]
|
||||
reg byte a [ abs_u8::return#0 ]
|
||||
zp[1]:36 [ line::dx#0 uctoa::digit_value#0 uctoa_append::sub#0 ]
|
||||
zp[1]:23 [ line::dx#0 ]
|
||||
reg byte a [ abs_u8::return#1 ]
|
||||
zp[1]:37 [ line::dy#0 ]
|
||||
zp[1]:24 [ line::dy#0 ]
|
||||
reg byte a [ sgn_u8::return#0 ]
|
||||
zp[1]:38 [ line::sx#0 ]
|
||||
zp[1]:25 [ line::sx#0 ]
|
||||
reg byte a [ sgn_u8::return#1 ]
|
||||
zp[1]:39 [ line::sy#0 ]
|
||||
reg byte a [ line::plot1_$0 ]
|
||||
reg byte a [ line::plot1_$2 ]
|
||||
zp[2]:40 [ line::plot1_column#0 cputln::ln_offset#0 ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 strlen::str#2 strlen::str#0 memcpy::source#2 memcpy::src#2 memcpy::src#4 memcpy::src#1 memset::num#6 memset::end#0 ]
|
||||
zp[1]:42 [ line::plot1_$1 ]
|
||||
zp[1]:26 [ line::sy#0 ]
|
||||
zp[1]:27 [ line::plot2_y#0 ]
|
||||
reg byte a [ line::plot2_$0 ]
|
||||
reg byte a [ line::plot2_$2 ]
|
||||
zp[2]:43 [ line::plot2_column#0 memcpy::src_end#0 ]
|
||||
zp[1]:45 [ line::plot2_$1 ]
|
||||
zp[2]:28 [ line::plot2_column#0 memset::num#4 memset::end#0 eorfill::line_column#2 eorfill::line_column#1 ]
|
||||
zp[1]:30 [ line::plot2_$1 ]
|
||||
reg byte a [ line::plot3_$0 ]
|
||||
reg byte a [ line::plot3_$2 ]
|
||||
zp[2]:46 [ line::plot3_column#0 strupr::src#2 strupr::src#1 cputs::s#4 cputs::s#5 cputs::s#0 ]
|
||||
zp[1]:48 [ line::plot3_$1 ]
|
||||
zp[2]:31 [ line::plot3_column#0 memset::str#5 memset::dst#2 memset::dst#4 memset::dst#1 eorfill::fill_column#2 eorfill::canvas#0 eorfill::fill_column#1 ]
|
||||
reg byte a [ line::plot3_$1 ]
|
||||
reg byte a [ line::plot1_$0 ]
|
||||
reg byte a [ line::plot1_$2 ]
|
||||
zp[2]:33 [ line::plot1_column#0 ]
|
||||
reg byte a [ line::plot1_$1 ]
|
||||
reg byte a [ line::plot4_$0 ]
|
||||
reg byte a [ line::plot4_$2 ]
|
||||
zp[2]:49 [ line::plot4_column#0 uctoa::buffer#11 uctoa::buffer#14 uctoa::buffer#4 uctoa::buffer#3 uctoa_append::buffer#0 strlen::len#2 strlen::len#1 strlen::return#2 printf_number_buffer::$19 memcpy::destination#2 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 memset::str#7 memset::dst#2 memset::dst#4 memset::dst#1 ]
|
||||
zp[2]:35 [ line::plot4_column#0 ]
|
||||
reg byte a [ line::plot4_$1 ]
|
||||
reg byte a [ line::plot5_$0 ]
|
||||
reg byte a [ line::plot5_$2 ]
|
||||
zp[2]:37 [ line::plot5_column#0 ]
|
||||
zp[1]:39 [ line::plot5_$1 ]
|
||||
reg byte a [ line::plot6_$0 ]
|
||||
reg byte a [ line::plot6_$2 ]
|
||||
zp[2]:40 [ line::plot6_column#0 ]
|
||||
reg byte a [ line::plot6_$1 ]
|
||||
reg byte a [ sgn_u8::$0 ]
|
||||
reg byte x [ abs_u8::$0 ]
|
||||
reg byte a [ kbhit::return#2 ]
|
||||
reg byte a [ irq_bottom_2::$0 ]
|
||||
reg byte a [ kbhit::return#0 ]
|
||||
mem[12] [ printf_buffer ]
|
||||
|
299
src/test/ref/examples/plus4walk/plus4walk.asm
Normal file
299
src/test/ref/examples/plus4walk/plus4walk.asm
Normal file
@ -0,0 +1,299 @@
|
||||
// Random walk with color fading for Commodore Plus/4 / C16
|
||||
.file [name="plus4walk.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$1001]
|
||||
.segmentdef Code [start=$1010]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__bbegin)
|
||||
.segment Code
|
||||
|
||||
|
||||
.label SCREEN = $c00
|
||||
.label COLORRAM = $800
|
||||
.label BGCOLOR = $ff19
|
||||
.label BORDERCOLOR = $ff15
|
||||
.label RASTER = $ff1d
|
||||
// The random state variable
|
||||
.label rand_state = 3
|
||||
__bbegin:
|
||||
.segment Code
|
||||
main: {
|
||||
.label __3 = 5
|
||||
.label __5 = 9
|
||||
.label __6 = $b
|
||||
.label __8 = 5
|
||||
.label __10 = $d
|
||||
.label __24 = 5
|
||||
.label offset = 5
|
||||
.label y = 2
|
||||
.label __29 = 7
|
||||
.label __30 = 5
|
||||
// memset(SCREEN, 0xa0, 1000)
|
||||
ldx #$a0
|
||||
lda #<SCREEN
|
||||
sta.z memset.str
|
||||
lda #>SCREEN
|
||||
sta.z memset.str+1
|
||||
jsr memset
|
||||
// memset(COLORRAM, 0, 1000)
|
||||
ldx #0
|
||||
lda #<COLORRAM
|
||||
sta.z memset.str
|
||||
lda #>COLORRAM
|
||||
sta.z memset.str+1
|
||||
jsr memset
|
||||
// memset(COUNT, 0, 1000)
|
||||
ldx #0
|
||||
lda #<COUNT
|
||||
sta.z memset.str
|
||||
lda #>COUNT
|
||||
sta.z memset.str+1
|
||||
jsr memset
|
||||
// *BORDERCOLOR = 0
|
||||
lda #0
|
||||
sta BORDERCOLOR
|
||||
// *BGCOLOR = 0
|
||||
sta BGCOLOR
|
||||
lda #<1
|
||||
sta.z rand_state
|
||||
lda #>1
|
||||
sta.z rand_state+1
|
||||
ldx #$14
|
||||
lda #$c
|
||||
sta.z y
|
||||
__b2:
|
||||
// (unsigned int)y*40
|
||||
lda.z y
|
||||
sta.z __24
|
||||
lda #0
|
||||
sta.z __24+1
|
||||
lda.z __24
|
||||
asl
|
||||
sta.z __29
|
||||
lda.z __24+1
|
||||
rol
|
||||
sta.z __29+1
|
||||
asl.z __29
|
||||
rol.z __29+1
|
||||
lda.z __30
|
||||
clc
|
||||
adc.z __29
|
||||
sta.z __30
|
||||
lda.z __30+1
|
||||
adc.z __29+1
|
||||
sta.z __30+1
|
||||
asl.z __3
|
||||
rol.z __3+1
|
||||
asl.z __3
|
||||
rol.z __3+1
|
||||
asl.z __3
|
||||
rol.z __3+1
|
||||
// offset = (unsigned int)y*40+x
|
||||
txa
|
||||
clc
|
||||
adc.z offset
|
||||
sta.z offset
|
||||
bcc !+
|
||||
inc.z offset+1
|
||||
!:
|
||||
// COUNT+offset
|
||||
lda.z offset
|
||||
clc
|
||||
adc #<COUNT
|
||||
sta.z __5
|
||||
lda.z offset+1
|
||||
adc #>COUNT
|
||||
sta.z __5+1
|
||||
// cnt = ++*(COUNT+offset)
|
||||
ldy #0
|
||||
lda (__5),y
|
||||
clc
|
||||
adc #1
|
||||
sta (__5),y
|
||||
// COUNT+offset
|
||||
lda.z offset
|
||||
clc
|
||||
adc #<COUNT
|
||||
sta.z __6
|
||||
lda.z offset+1
|
||||
adc #>COUNT
|
||||
sta.z __6+1
|
||||
// cnt = ++*(COUNT+offset)
|
||||
lda (__6),y
|
||||
tay
|
||||
// COLORRAM+offset
|
||||
clc
|
||||
lda.z __8
|
||||
adc #<COLORRAM
|
||||
sta.z __8
|
||||
lda.z __8+1
|
||||
adc #>COLORRAM
|
||||
sta.z __8+1
|
||||
// cnt&0xf
|
||||
tya
|
||||
and #$f
|
||||
// *(COLORRAM+offset) = FADE[cnt&0xf]
|
||||
tay
|
||||
lda FADE,y
|
||||
ldy #0
|
||||
sta (__8),y
|
||||
// rand()
|
||||
jsr rand
|
||||
// rnd = >rand()
|
||||
ldy.z __10+1
|
||||
// rnd & 0x80
|
||||
tya
|
||||
and #$80
|
||||
// if(rnd & 0x80)
|
||||
cmp #0
|
||||
bne __b3
|
||||
// rnd & 0x40
|
||||
tya
|
||||
and #$40
|
||||
// if(rnd & 0x40)
|
||||
cmp #0
|
||||
bne __b4
|
||||
// y--;
|
||||
dec.z y
|
||||
// if(y==0xff)
|
||||
lda #$ff
|
||||
cmp.z y
|
||||
bne __b6
|
||||
lda #0
|
||||
sta.z y
|
||||
__b6:
|
||||
// while(*RASTER!=0xff)
|
||||
lda #$ff
|
||||
cmp RASTER
|
||||
bne __b6
|
||||
jmp __b2
|
||||
__b4:
|
||||
// y++;
|
||||
inc.z y
|
||||
// if(y==25)
|
||||
lda #$19
|
||||
cmp.z y
|
||||
bne __b6
|
||||
lda #$18
|
||||
sta.z y
|
||||
jmp __b6
|
||||
__b3:
|
||||
// rnd& 0x40
|
||||
tya
|
||||
and #$40
|
||||
// if(rnd& 0x40)
|
||||
cmp #0
|
||||
bne __b5
|
||||
// x--;
|
||||
dex
|
||||
// if(x==0xff)
|
||||
cpx #$ff
|
||||
bne __b6
|
||||
ldx #0
|
||||
jmp __b6
|
||||
__b5:
|
||||
// x++;
|
||||
inx
|
||||
// if(x==40)
|
||||
cpx #$28
|
||||
bne __b6
|
||||
ldx #$27
|
||||
jmp __b6
|
||||
}
|
||||
// Returns a pseudo-random number in the range of 0 to RAND_MAX (65535)
|
||||
// Uses an xorshift pseudorandom number generator that hits all different values
|
||||
// Information https://en.wikipedia.org/wiki/Xorshift
|
||||
// Source http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html
|
||||
rand: {
|
||||
.label __0 = $13
|
||||
.label __1 = $f
|
||||
.label __2 = $11
|
||||
.label return = $d
|
||||
// rand_state << 7
|
||||
lda.z rand_state+1
|
||||
lsr
|
||||
lda.z rand_state
|
||||
ror
|
||||
sta.z __0+1
|
||||
lda #0
|
||||
ror
|
||||
sta.z __0
|
||||
// rand_state ^= rand_state << 7
|
||||
lda.z rand_state
|
||||
eor.z __0
|
||||
sta.z rand_state
|
||||
lda.z rand_state+1
|
||||
eor.z __0+1
|
||||
sta.z rand_state+1
|
||||
// rand_state >> 9
|
||||
lsr
|
||||
sta.z __1
|
||||
lda #0
|
||||
sta.z __1+1
|
||||
// rand_state ^= rand_state >> 9
|
||||
lda.z rand_state
|
||||
eor.z __1
|
||||
sta.z rand_state
|
||||
lda.z rand_state+1
|
||||
eor.z __1+1
|
||||
sta.z rand_state+1
|
||||
// rand_state << 8
|
||||
lda.z rand_state
|
||||
sta.z __2+1
|
||||
lda #0
|
||||
sta.z __2
|
||||
// rand_state ^= rand_state << 8
|
||||
lda.z rand_state
|
||||
eor.z __2
|
||||
sta.z rand_state
|
||||
lda.z rand_state+1
|
||||
eor.z __2+1
|
||||
sta.z rand_state+1
|
||||
// return rand_state;
|
||||
lda.z rand_state
|
||||
sta.z return
|
||||
lda.z rand_state+1
|
||||
sta.z return+1
|
||||
// }
|
||||
rts
|
||||
}
|
||||
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
|
||||
// memset(void* zp(5) str, byte register(X) c)
|
||||
memset: {
|
||||
.label end = $13
|
||||
.label dst = 5
|
||||
.label str = 5
|
||||
// end = (char*)str + num
|
||||
lda.z str
|
||||
clc
|
||||
adc #<$3e8
|
||||
sta.z end
|
||||
lda.z str+1
|
||||
adc #>$3e8
|
||||
sta.z end+1
|
||||
__b2:
|
||||
// for(char* dst = str; dst!=end; dst++)
|
||||
lda.z dst+1
|
||||
cmp.z end+1
|
||||
bne __b3
|
||||
lda.z dst
|
||||
cmp.z end
|
||||
bne __b3
|
||||
// }
|
||||
rts
|
||||
__b3:
|
||||
// *dst = c
|
||||
txa
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
// for(char* dst = str; dst!=end; dst++)
|
||||
inc.z dst
|
||||
bne !+
|
||||
inc.z dst+1
|
||||
!:
|
||||
jmp __b2
|
||||
}
|
||||
.segment Data
|
||||
FADE: .byte 2, $12, $22, $32, $42, $52, $62, $72, $76, $66, $56, $46, $36, $26, $16, 6
|
||||
COUNT: .fill $3e8, 0
|
130
src/test/ref/examples/plus4walk/plus4walk.cfg
Normal file
130
src/test/ref/examples/plus4walk/plus4walk.cfg
Normal file
@ -0,0 +1,130 @@
|
||||
@begin: scope:[] from
|
||||
[0] phi()
|
||||
to:@1
|
||||
@1: scope:[] from @begin
|
||||
[1] phi()
|
||||
[2] call main
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
[3] phi()
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from @1
|
||||
[4] phi()
|
||||
[5] call memset
|
||||
to:main::@10
|
||||
main::@10: scope:[main] from main
|
||||
[6] phi()
|
||||
[7] call memset
|
||||
to:main::@11
|
||||
main::@11: scope:[main] from main::@10
|
||||
[8] phi()
|
||||
[9] call memset
|
||||
to:main::@12
|
||||
main::@12: scope:[main] from main::@11
|
||||
[10] *((const nomodify byte*) BORDERCOLOR) ← (byte) 0
|
||||
[11] *((const nomodify byte*) BGCOLOR) ← (byte) 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main::@12 main::@6
|
||||
[12] (word) rand_state#11 ← phi( main::@12/(word) 1 main::@6/(word) rand_state#3 )
|
||||
[12] (byte) main::x#11 ← phi( main::@12/(byte) $14 main::@6/(byte) main::x#10 )
|
||||
[12] (byte) main::y#11 ← phi( main::@12/(byte) $c main::@6/(byte) main::y#10 )
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[13] (word~) main::$24 ← (word)(byte) main::y#11
|
||||
[14] (word~) main::$29 ← (word~) main::$24 << (byte) 2
|
||||
[15] (word~) main::$30 ← (word~) main::$29 + (word~) main::$24
|
||||
[16] (word~) main::$3 ← (word~) main::$30 << (byte) 3
|
||||
[17] (word) main::offset#0 ← (word~) main::$3 + (byte) main::x#11
|
||||
[18] (byte*~) main::$5 ← (const byte*) COUNT + (word) main::offset#0
|
||||
[19] *((byte*~) main::$5) ← ++ *((byte*~) main::$5)
|
||||
[20] (byte*~) main::$6 ← (const byte*) COUNT + (word) main::offset#0
|
||||
[21] (byte) main::cnt#0 ← *((byte*~) main::$6)
|
||||
[22] (byte*~) main::$8 ← (const nomodify byte*) COLORRAM + (word) main::offset#0
|
||||
[23] (byte~) main::$9 ← (byte) main::cnt#0 & (byte) $f
|
||||
[24] *((byte*~) main::$8) ← *((const byte*) FADE + (byte~) main::$9)
|
||||
[25] call rand
|
||||
[26] (word) rand::return#2 ← (word) rand::return#0
|
||||
to:main::@13
|
||||
main::@13: scope:[main] from main::@2
|
||||
[27] (word~) main::$10 ← (word) rand::return#2
|
||||
[28] (byte) main::rnd#0 ← > (word~) main::$10
|
||||
[29] (byte~) main::$12 ← (byte) main::rnd#0 & (byte) $80
|
||||
[30] if((byte) 0!=(byte~) main::$12) goto main::@3
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@13
|
||||
[31] (byte~) main::$13 ← (byte) main::rnd#0 & (byte) $40
|
||||
[32] if((byte) 0!=(byte~) main::$13) goto main::@4
|
||||
to:main::@8
|
||||
main::@8: scope:[main] from main::@7
|
||||
[33] (byte) main::y#2 ← -- (byte) main::y#11
|
||||
[34] if((byte) main::y#2!=(byte) $ff) goto main::@14
|
||||
to:main::@6
|
||||
main::@14: scope:[main] from main::@8
|
||||
[35] phi()
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main::@14 main::@15 main::@16 main::@17 main::@4 main::@5 main::@6 main::@8 main::@9
|
||||
[36] (byte) main::x#10 ← phi( main::@14/(byte) main::x#11 main::@8/(byte) main::x#11 main::@15/(byte) main::x#2 main::@9/(byte) 0 main::@16/(byte) main::x#11 main::@4/(byte) main::x#11 main::@17/(byte) main::x#1 main::@5/(byte) $27 main::@6/(byte) main::x#10 )
|
||||
[36] (byte) main::y#10 ← phi( main::@14/(byte) main::y#2 main::@8/(byte) 0 main::@15/(byte) main::y#11 main::@9/(byte) main::y#11 main::@16/(byte) main::y#1 main::@4/(byte) $18 main::@17/(byte) main::y#11 main::@5/(byte) main::y#11 main::@6/(byte) main::y#10 )
|
||||
[37] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto main::@6
|
||||
to:main::@1
|
||||
main::@4: scope:[main] from main::@7
|
||||
[38] (byte) main::y#1 ← ++ (byte) main::y#11
|
||||
[39] if((byte) main::y#1!=(byte) $19) goto main::@16
|
||||
to:main::@6
|
||||
main::@16: scope:[main] from main::@4
|
||||
[40] phi()
|
||||
to:main::@6
|
||||
main::@3: scope:[main] from main::@13
|
||||
[41] (byte~) main::$18 ← (byte) main::rnd#0 & (byte) $40
|
||||
[42] if((byte) 0!=(byte~) main::$18) goto main::@5
|
||||
to:main::@9
|
||||
main::@9: scope:[main] from main::@3
|
||||
[43] (byte) main::x#2 ← -- (byte) main::x#11
|
||||
[44] if((byte) main::x#2!=(byte) $ff) goto main::@15
|
||||
to:main::@6
|
||||
main::@15: scope:[main] from main::@9
|
||||
[45] phi()
|
||||
to:main::@6
|
||||
main::@5: scope:[main] from main::@3
|
||||
[46] (byte) main::x#1 ← ++ (byte) main::x#11
|
||||
[47] if((byte) main::x#1!=(byte) $28) goto main::@17
|
||||
to:main::@6
|
||||
main::@17: scope:[main] from main::@5
|
||||
[48] phi()
|
||||
to:main::@6
|
||||
|
||||
(word()) rand()
|
||||
rand: scope:[rand] from main::@2
|
||||
[49] (word~) rand::$0 ← (word) rand_state#11 << (byte) 7
|
||||
[50] (word) rand_state#1 ← (word) rand_state#11 ^ (word~) rand::$0
|
||||
[51] (word~) rand::$1 ← (word) rand_state#1 >> (byte) 9
|
||||
[52] (word) rand_state#2 ← (word) rand_state#1 ^ (word~) rand::$1
|
||||
[53] (word~) rand::$2 ← (word) rand_state#2 << (byte) 8
|
||||
[54] (word) rand_state#3 ← (word) rand_state#2 ^ (word~) rand::$2
|
||||
[55] (word) rand::return#0 ← (word) rand_state#3
|
||||
to:rand::@return
|
||||
rand::@return: scope:[rand] from rand
|
||||
[56] return
|
||||
to:@return
|
||||
|
||||
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
|
||||
memset: scope:[memset] from main main::@10 main::@11
|
||||
[57] (byte) memset::c#5 ← phi( main/(byte) $a0 main::@10/(byte) 0 main::@11/(byte) 0 )
|
||||
[57] (void*) memset::str#4 ← phi( main/(void*)(const nomodify byte*) SCREEN main::@10/(void*)(const nomodify byte*) COLORRAM main::@11/(void*)(const byte*) COUNT )
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[58] (byte*) memset::end#0 ← (byte*)(void*) memset::str#4 + (word) $3e8
|
||||
[59] (byte*) memset::dst#4 ← (byte*)(void*) memset::str#4
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[60] (byte*) memset::dst#2 ← phi( memset::@1/(byte*) memset::dst#4 memset::@3/(byte*) memset::dst#1 )
|
||||
[61] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset::@2
|
||||
[62] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[63] *((byte*) memset::dst#2) ← (byte) memset::c#5
|
||||
[64] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
|
||||
to:memset::@2
|
2758
src/test/ref/examples/plus4walk/plus4walk.log
Normal file
2758
src/test/ref/examples/plus4walk/plus4walk.log
Normal file
File diff suppressed because it is too large
Load Diff
109
src/test/ref/examples/plus4walk/plus4walk.sym
Normal file
109
src/test/ref/examples/plus4walk/plus4walk.sym
Normal file
@ -0,0 +1,109 @@
|
||||
(label) @1
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(const nomodify byte*) BGCOLOR = (byte*) 65305
|
||||
(const nomodify byte*) BORDERCOLOR = (byte*) 65301
|
||||
(const nomodify byte*) COLORRAM = (byte*) 2048
|
||||
(const byte*) COUNT[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const byte*) FADE[(number) $10] = { (byte) 2, (byte) $12, (byte) $22, (byte) $32, (byte) $42, (byte) $52, (byte) $62, (byte) $72, (byte) $76, (byte) $66, (byte) $56, (byte) $46, (byte) $36, (byte) $26, (byte) $16, (byte) 6 }
|
||||
(const byte) RADIX::BINARY = (number) 2
|
||||
(const byte) RADIX::DECIMAL = (number) $a
|
||||
(const byte) RADIX::HEXADECIMAL = (number) $10
|
||||
(const byte) RADIX::OCTAL = (number) 8
|
||||
(const nomodify byte*) RASTER = (byte*) 65309
|
||||
(const nomodify byte*) SCREEN = (byte*) 3072
|
||||
(void()) main()
|
||||
(word~) main::$10 zp[2]:13 202.0
|
||||
(byte~) main::$12 reg byte a 202.0
|
||||
(byte~) main::$13 reg byte a 202.0
|
||||
(byte~) main::$18 reg byte a 202.0
|
||||
(word~) main::$24 zp[2]:5 151.5
|
||||
(word~) main::$29 zp[2]:7 202.0
|
||||
(word~) main::$3 zp[2]:5 202.0
|
||||
(word~) main::$30 zp[2]:5 202.0
|
||||
(byte*~) main::$5 zp[2]:9 303.0
|
||||
(byte*~) main::$6 zp[2]:11 202.0
|
||||
(byte*~) main::$8 zp[2]:5 101.0
|
||||
(byte~) main::$9 reg byte a 202.0
|
||||
(label) main::@1
|
||||
(label) main::@10
|
||||
(label) main::@11
|
||||
(label) main::@12
|
||||
(label) main::@13
|
||||
(label) main::@14
|
||||
(label) main::@15
|
||||
(label) main::@16
|
||||
(label) main::@17
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(label) main::@4
|
||||
(label) main::@5
|
||||
(label) main::@6
|
||||
(label) main::@7
|
||||
(label) main::@8
|
||||
(label) main::@9
|
||||
(byte) main::cnt
|
||||
(byte) main::cnt#0 reg byte y 101.0
|
||||
(word) main::offset
|
||||
(word) main::offset#0 offset zp[2]:5 80.8
|
||||
(byte) main::rnd
|
||||
(byte) main::rnd#0 reg byte y 134.66666666666666
|
||||
(byte) main::x
|
||||
(byte) main::x#1 reg byte x 101.0
|
||||
(byte) main::x#10 reg byte x 1804.5
|
||||
(byte) main::x#11 reg byte x 58.89655172413795
|
||||
(byte) main::x#2 reg byte x 101.0
|
||||
(byte) main::y
|
||||
(byte) main::y#1 y zp[1]:2 101.0
|
||||
(byte) main::y#10 y zp[1]:2 1804.5
|
||||
(byte) main::y#11 y zp[1]:2 55.41379310344829
|
||||
(byte) main::y#2 y zp[1]:2 101.0
|
||||
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
|
||||
(label) memset::@1
|
||||
(label) memset::@2
|
||||
(label) memset::@3
|
||||
(label) memset::@return
|
||||
(byte) memset::c
|
||||
(byte) memset::c#5 reg byte x 143.0
|
||||
(byte*) memset::dst
|
||||
(byte*) memset::dst#1 dst zp[2]:5 2002.0
|
||||
(byte*) memset::dst#2 dst zp[2]:5 1368.3333333333335
|
||||
(byte*) memset::dst#4 dst zp[2]:5 202.0
|
||||
(byte*) memset::end
|
||||
(byte*) memset::end#0 end zp[2]:19 183.66666666666669
|
||||
(word) memset::num
|
||||
(void*) memset::return
|
||||
(void*) memset::str
|
||||
(void*) memset::str#4 str zp[2]:5
|
||||
(word()) rand()
|
||||
(word~) rand::$0 zp[2]:19 2002.0
|
||||
(word~) rand::$1 zp[2]:15 2002.0
|
||||
(word~) rand::$2 zp[2]:17 2002.0
|
||||
(label) rand::@return
|
||||
(word) rand::return
|
||||
(word) rand::return#0 return zp[2]:13 367.33333333333337
|
||||
(word) rand::return#2 return zp[2]:13 202.0
|
||||
(word) rand_state
|
||||
(word) rand_state#1 rand_state zp[2]:3 1501.5
|
||||
(word) rand_state#11 rand_state zp[2]:3 214.5
|
||||
(word) rand_state#2 rand_state zp[2]:3 1501.5
|
||||
(word) rand_state#3 rand_state zp[2]:3 111.22222222222223
|
||||
|
||||
zp[1]:2 [ main::y#11 main::y#10 main::y#2 main::y#1 ]
|
||||
reg byte x [ main::x#11 main::x#10 main::x#2 main::x#1 ]
|
||||
zp[2]:3 [ rand_state#11 rand_state#3 rand_state#1 rand_state#2 ]
|
||||
reg byte x [ memset::c#5 ]
|
||||
zp[2]:5 [ main::$24 main::$30 main::$3 main::offset#0 main::$8 memset::str#4 memset::dst#2 memset::dst#4 memset::dst#1 ]
|
||||
zp[2]:7 [ main::$29 ]
|
||||
zp[2]:9 [ main::$5 ]
|
||||
zp[2]:11 [ main::$6 ]
|
||||
reg byte y [ main::cnt#0 ]
|
||||
reg byte a [ main::$9 ]
|
||||
zp[2]:13 [ rand::return#2 main::$10 rand::return#0 ]
|
||||
reg byte y [ main::rnd#0 ]
|
||||
reg byte a [ main::$12 ]
|
||||
reg byte a [ main::$13 ]
|
||||
reg byte a [ main::$18 ]
|
||||
zp[2]:15 [ rand::$1 ]
|
||||
zp[2]:17 [ rand::$2 ]
|
||||
zp[2]:19 [ memset::end#0 rand::$0 ]
|
Loading…
Reference in New Issue
Block a user