Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // PlatformIO IDEでビルドする場合はplatformio.iniに
- // 下記オプションのいずれかを指定してください
- //
- // build_unflags = -march=rv64imafc
- // build_flags = -mabi=lp64f -march=rv64gc
- //
- // build_unflags = -Os -march=rv64imafc
- // build_flags = -O2 -mabi=lp64f -march=rv64gc
- //
- // build_unflags = -Os -march=rv64imafc
- // build_flags = -O3 -mabi=lp64f -march=rv64gc
- // Arduino IDEでビルドする場合は下記のやり方でオプションを変更してください
- // (オプション変更に関しては自己責任でお願いします)
- // https://pastebin.com/E66j9e7f
- //
- #include <Arduino.h>
- #include <math.h>
- #include <Sipeed_ST7789.h>
- SPIClass spi0(SPI0); // MUST be SPI0 for Maix series on board LCD
- Sipeed_ST7789 lcd(320, 240, spi0);
- extern "C" {
- void print_number_x_y(int x, int y);
- void print_number_x_y_double(double x, double y);
- void line(int x1, int y1, int x2, int y2, int colr, int colg, int colb);
- double sin01(double a);
- double cos01(double a);
- int random01(int min, int max);
- void delay01(int ms);
- void lcd_clear01(void);
- double rad01 = M_PI / 180.0;;
- int width01 = 320;
- int height01 = 240;
- }
- void setup() {
- lcd.begin(15000000, COLOR_BLACK);
- lcd.fillRect(0, 0, 320, 240, COLOR_BLACK);
- Serial.begin(115200);
- }
- int func01(int a, int b);
- int func01_asm(int a, int b);
- void loop() {
- for (int i = 1; i < 8; i += 2) {
- func01_asm(i, i + 1);
- delay(5000);
- }
- }
- int func01(int a, int b){
- int i, x1, y1, x2, y2, colr, colg, colb;
- double f1, f2, x, y, ra, rb, xc, yc;
- lcd_clear01();
- colr = random01(16, 31);
- colg = random01(16, 63);
- colb = random01(16, 31);
- ra = width01 / 2 - 10;
- rb = height01 / 2 - 10;
- xc = width01 / 2;
- yc = height01 / 2;
- for (i = 0; i < 360; i++) {
- f1 = i * a * rad01;
- x = ra * cos01(f1) + xc;
- f2 = i * b * rad01;
- y = rb * sin01(f2) + yc;
- x1 = x;
- y1 = y;
- if (i == 0) {
- x2 = x1;
- y2 = y1;
- }
- line(x1, y1, x2, y2, colr, colg, colb);
- print_number_x_y(x1, y1);
- x2 = x1;
- y2 = y1;
- delay01(10);
- }
- return 0;
- }
- int func01_asm(int a, int b){
- asm volatile(
- "addi sp, sp, -48\n\t"
- /*
- s8 x1
- s1 y1
- s2 x2
- s3 y2
- s4 i
- s5 colr
- s6 colg
- s7 colb
- fs2 ra
- fs3 rb
- fs4 xc
- fs5 yc
- 0(sp) a
- 4(sp) b
- 8(sp) &rad01
- 16(sp) &width01
- 24(sp) &height01
- */
- "sw %0, 0(sp)\n\t" // 関数呼び出しで%0が破壊されるので保存
- "sw %1, 4(sp)\n\t" // 関数呼び出しで%1が破壊されるので保存
- "sd %2, 8(sp)\n\t" // 関数呼び出しで%2が破壊されるので保存
- "sd %3, 16(sp)\n\t" // 関数呼び出しで%3が破壊されるので保存
- "sd %4, 24(sp)\n\t" // 関数呼び出しで%4が破壊されるので保存
- "call lcd_clear01\n\t"
- "li a0, 16\n\t"
- "li a1, 31\n\t"
- "call random01\n\t"
- "move s5, a0\n\t"
- "li a0, 16\n\t"
- "li a1, 63\n\t"
- "call random01\n\t"
- "move s6, a0\n\t"
- "li a0, 16\n\t"
- "li a1, 31\n\t"
- "call random01\n\t"
- "move s7, a0\n\t"
- "ld a0, 16(sp)\n\t"
- "lw a0, (a0)\n\t"
- "sraiw a0, a0, 1\n\t"
- "li a1, 10\n\t"
- "subw a0, a0, a1\n\t"
- "fcvt.d.w fs2, a0\n\t"
- "ld a0, 24(sp)\n\t"
- "lw a0, (a0)\n\t"
- "sraiw a0, a0, 1\n\t"
- "li a1, 10\n\t"
- "subw a0, a0, a1\n\t"
- "fcvt.d.w fs3, a0\n\t"
- "ld a0, 16(sp)\n\t"
- "lw a0, (a0)\n\t"
- "sraiw a0, a0, 1\n\t"
- "fcvt.d.w fs4, a0\n\t"
- "ld a0, 24(sp)\n\t"
- "lw a0, (a0)\n\t"
- "sraiw a0, a0, 1\n\t"
- "fcvt.d.w fs5, a0\n\t"
- "move s4, zero\n\t"
- "loop01:\n\t "
- "li a0, 360\n\t"
- "bge s4, a0, jump01\n\t"
- "lw a0, 0(sp)\n\t"
- "mulw a0, s4, a0\n\t"
- "fcvt.d.w fa0, a0\n\t"
- "ld a0, 8(sp)\n\t"
- "fld fa1, (a0)\n\t"
- "fsd fa1, 32(sp)\n\t" // rad01が正常に読み込めてるかの確認用
- "fmul.d fa0, fa1, fa0\n\t"
- "fmv.x.d a0, fa0\n\t" // abiがlp64fなのでパラメーターを整数レジスタで渡す
- "call cos01\n\t"
- "fmv.d.x fa0, a0\n\t" // abiがlp64fなので整数レジスタに戻り値が返ってくる
- "fmul.d fa0, fa0, fs2\n\t"
- "fadd.d fa0, fa0, fs4\n\t"
- "fcvt.w.d s8, fa0\n\t"
- "lw a0, 4(sp)\n\t"
- "mulw a0, a0, a0\n\t"
- "fcvt.d.w fa0, s4\n\t"
- "ld a0, 8(sp)\n\t"
- "fld fa1, (a0)\n\t"
- "fsd fa1, 40(sp)\n\t" // rad01が正常に読み込めてるかの確認用
- "fmul.d fa0, fa1, fa0\n\t"
- "fmv.x.d a0, fa0\n\t" // abiがlp64fなのでパラメーターを整数レジスタで渡す
- "call sin01\n\t"
- "fmv.d.x fa0, a0\n\t" // abiがlp64fなので整数レジスタに戻り値が返ってくる
- "fmul.d fa0, fa0, fs3\n\t"
- "fadd.d fa0, fa0, fs5\n\t"
- "fcvt.w.d s1, fa0\n\t"
- "bne s4, zero, jump02\n\t"
- "move s2, s8\n\t"
- "move s3, s1\n\t"
- "jump02:\n\t"
- "move a0, s8\n\t"
- "move a1, s1\n\t"
- "move a2, s2\n\t"
- "move a3, s3\n\t"
- "move a4, s5\n\t"
- "move a5, s6\n\t"
- "move a6, s7\n\t"
- "call line\n\t"
- /*
- "move a0, s8\n\t" // x1の値確認用
- "move a1, s1\n\t" // y1の値確認用
- "call print_number_x_y\n\t"
- "move a0, s2\n\t" // x2の値確認用
- "move a1, s3\n\t" // y2の値確認用
- "call print_number_x_y\n\t"
- "ld a0, 32(sp)\n\t" // 保存しておいたrad01の値確認用
- "ld a1, 40(sp)\n\t" // 保存しておいたrad01の値確認用
- // abiがlp64fなのでパラメーターを整数レジスタで渡す
- "call print_number_x_y_double\n\t"
- "fmv.x.d a0, fs2\n\t" // raの値確認用
- "fmv.x.d a1, fs3\n\t" // rbの値確認用
- // abiがlp64fなのでパラメーターを整数レジスタで渡す
- "call print_number_x_y_double\n\t"
- "fmv.x.d a0, fs4\n\t" // xcの値確認用
- "fmv.x.d a1, fs5\n\t" // ycの値確認用
- // abiがlp64fなのでパラメーターを整数レジスタで渡す
- "call print_number_x_y_double\n\t"
- */
- "move s2, s8\n\t"
- "move s3, s1\n\t"
- "li a0, 10\n\t"
- "call delay01\n\t"
- "addiw s4, s4, 1\n\t"
- "j loop01\n\t"
- "jump01:\n\t"
- "lw %0, 0(sp)\n\t" // 関数呼び出しで破壊されてしまうがインラインアセンブラの後でaを使う場合は値を戻さないとおかしくなる
- "lw %1, 4(sp)\n\t" // 関数呼び出しで破壊されてしまうがインラインアセンブラの後でbを使う場合は値を戻さないとおかしくなる
- "ld %2, 8(sp)\n\t" // 関数呼び出しで破壊されてしまうがインラインアセンブラの後でrad01を使う場合は値を戻さないとおかしくなる
- "ld %3, 16(sp)\n\t" // 関数呼び出しで破壊されてしまうがインラインアセンブラの後でwidth01を使う場合は値を戻さないとおかしくなる
- "ld %4, 24(sp)\n\t" // 関数呼び出しで破壊されてしまうがインラインアセンブラの後でheight01を使う場合は値を戻さないとおかしくなる
- "addi sp, sp, 48\n\t"
- :
- :"r"(a), "r"(b), "r"(&rad01), "r"(&width01), "r"(&height01)
- :"x1", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x9", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "f10", "f11", "f12", "f18", "f19", "f20", "f21", "f22", "f23", "memory"
- );
- // Serial.printf("rad01 = %.15f, width01 = %d, height01 = %d\r\n", rad01, width01, height01);
- return 0;
- }
- void print_number_x_y(int x, int y) {
- Serial.print("x = ");
- Serial.printf("%d", x);
- Serial.print(" ");
- Serial.print("y = ");
- Serial.printf("%d", y);
- Serial.println();
- }
- void print_number_x_y_double(double x, double y) {
- Serial.print("x = ");
- Serial.printf("%.15g", x);
- Serial.print(" ");
- Serial.print("y = ");
- Serial.printf("%.15g", y);
- Serial.println();
- }
- void line(int x1, int y1, int x2, int y2, int colr, int colg, int colb) {
- int color = colb | (colg << 5) | (colr << (5 + 6));
- lcd.drawLine((int16_t)x1, (int16_t)y1, (int16_t)x2, (int16_t)y2, (uint16_t) color);
- }
- double sin01(double a) {
- return sin(a);
- }
- double cos01(double a) {
- return cos(a);
- }
- int random01(int min, int max) {
- return random(min, max);
- }
- void delay01(int ms){
- delay((unsigned long)ms);
- }
- void lcd_clear01(void) {
- lcd.fillRect(0, 0, 320, 240, COLOR_BLACK);
- }
Add Comment
Please, Sign In to add comment