Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Brainfuck in MSP430 assembly for https://microcorruption.com/.
- Go to "New Orleans" and paste in this script:
- reset;
- let 4000 = 4031;
- let 4002 = fef4;
- let 4004 = 40b1;
- let 4006 = ff0;
- let 4008 = 8;
- let 400a = 40b1;
- let 400c = 1000;
- let 400e = 6;
- let 4010 = 4032;
- let 4012 = 8200;
- let 4014 = 12b0;
- let 4016 = 10;
- let 4018 = 4302;
- let 401a = 4037;
- let 401c = 1000;
- let 401e = 4035;
- let 4020 = 2000;
- let 4022 = 4036;
- let 4024 = 3000;
- let 4026 = 403f;
- let 4028 = 800;
- let 402a = 403e;
- let 402c = 4000;
- let 402e = 832e;
- let 4030 = 438e;
- let 4032 = 0;
- let 4034 = 831f;
- let 4036 = 23fb;
- let 4038 = 477f;
- let 403a = 930f;
- let 403c = 2450;
- let 403e = 903f;
- let 4040 = 3e;
- let 4042 = 2002;
- let 4044 = 5316;
- let 4046 = 3ff8;
- let 4048 = 903f;
- let 404a = 3c;
- let 404c = 2002;
- let 404e = 8316;
- let 4050 = 3ff3;
- let 4052 = 903f;
- let 4054 = 2b;
- let 4056 = 2003;
- let 4058 = 53d6;
- let 405a = 0;
- let 405c = 3fed;
- let 405e = 903f;
- let 4060 = 2d;
- let 4062 = 2003;
- let 4064 = 83d6;
- let 4066 = 0;
- let 4068 = 3fe7;
- let 406a = 903f;
- let 406c = 2e;
- let 406e = 2009;
- let 4070 = 466f;
- let 4072 = 4f81;
- let 4074 = 6;
- let 4076 = 4032;
- let 4078 = 8000;
- let 407a = 12b0;
- let 407c = 10;
- let 407e = 4302;
- let 4080 = 3fdb;
- let 4082 = 903f;
- let 4084 = 2c;
- let 4086 = 2008;
- let 4088 = 4032;
- let 408a = 8100;
- let 408c = 12b0;
- let 408e = 10;
- let 4090 = 4302;
- let 4092 = 4fc6;
- let 4094 = 0;
- let 4096 = 3fd0;
- let 4098 = 903f;
- let 409a = 5b;
- let 409c = 2015;
- let 409e = 4785;
- let 40a0 = 0;
- let 40a2 = 5325;
- let 40a4 = 430f;
- let 40a6 = 477e;
- let 40a8 = 930f;
- let 40aa = 2003;
- let 40ac = 903e;
- let 40ae = 5d;
- let 40b0 = 2409;
- let 40b2 = 903e;
- let 40b4 = 5b;
- let 40b6 = 2001;
- let 40b8 = 531f;
- let 40ba = 903e;
- let 40bc = 5d;
- let 40be = 2001;
- let 40c0 = 831f;
- let 40c2 = 3ff1;
- let 40c4 = 8317;
- let 40c6 = 3fb8;
- let 40c8 = 903f;
- let 40ca = 5d;
- let 40cc = 2007;
- let 40ce = 466f;
- let 40d0 = 930f;
- let 40d2 = 2403;
- let 40d4 = 4517;
- let 40d6 = fffe;
- let 40d8 = 3c01;
- let 40da = 8325;
- let 40dc = 3fad;
- let 40de = d032;
- let 40e0 = f0;
- let 40e2 = 3ffd;
- let 40e4 = 4130;
- let pc = 4000;
- Then to run type "c". When prompted for a program, enter a brainfuck program such as
- ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
- then type "c" to continue execution. The CPU will halt when the program is complete.
- Notes: the getchar interrupt in microcorruption didn't seem to work for me, perhaps operator error. The interpreter does attempt to getchar, but it will always receive NIL.
- Source code:
- /*
- * bf.s
- * Brainfuck for msp430/microcorruption.
- *
- * cpp -E bf.s > bf-cpp.s
- * msp430-as -o bf.o bf-cpp.s
- * msp430-ld -o bf-bin bf.o
- * msp430-objdump -d bf-bin > dump
- *
- * TimN 2015 - Public Domain
- */
- #define prog 0x1000
- #define progsz 0x0ff0
- #define stackBuf 0x2000
- #define dataBuf 0x3000
- #define datasz 0x1000
- #define SP r1
- #define SR r2
- #define STACK r5
- #define PTR r6
- #define PROG r7
- /* loads at 0x4000 */
- main:
- // note: we pre-allocate room for syscall args (12 bytes)
- mov #(0xff00-0xc), SP
- // gets(prog, progsz)
- mov #progsz, 8(SP)
- mov #prog, 6(SP)
- mov #0x8200, SR
- call #0x10
- mov #0, SR
- // initialize interp
- mov #prog, PROG
- mov #stackBuf, STACK
- mov #dataBuf, PTR
- // zero data[0..datasz]
- mov #(datasz/2), r15
- mov #(dataBuf+datasz), r14
- 1: sub #2, r14
- mov #0, @r14
- dec r15
- jne 1b
- interploop:
- mov.b @PROG+, r15
- cmp #0, r15
- jeq halt
- cmp #'>', r15
- jne 1f
- inc PTR
- jmp interploop
- 1: cmp #'<', r15
- jne 1f
- dec PTR
- jmp interploop
- 1: cmp #'+', r15
- jne 1f
- inc.b @PTR
- jmp interploop
- 1: cmp #'-', r15
- jne 1f
- dec.b @PTR
- jmp interploop
- 1: cmp #'.', r15
- jne 1f
- // putchr(@PTR)
- mov.b @PTR, r15
- mov r15, 6(SP)
- mov #0x8000, SR
- call #0x10
- mov #0, SR
- jmp interploop
- 1: cmp #',', r15
- jne 1f
- // @PTR = getchar()
- // note: this doesnt seem to work in microcorruption!
- mov #0x8100, SR
- call #0x10
- mov #0, SR
- mov.b r15, @PTR
- jmp interploop
- 1: cmp #'[', r15
- jne 1f
- mov PROG, @STACK
- add #2, STACK
- mov #0, r15 // nesting=0
- while:
- mov.b @PROG+, r14 // while(nesting != 0 && cur != ']')
- cmp #0, r15
- jne 2f
- cmp #']',r14
- jeq done
- 2: cmp #'[', r14 // if(cur == '[') nesting++
- jne 2f
- inc r15
- 2: cmp #']', r14 // if(cur == ']') nesting--
- jne 2f
- dec r15
- 2: jmp while
- done:
- dec PROG
- jmp interploop
- 1: cmp #']', r15
- jne 1f
- mov.b @PTR, r15
- cmp #0, r15
- jeq else
- mov -2(STACK), PROG
- jmp 1f
- else:
- sub #2, STACK
- 1: jmp interploop
- halt:
- bis #0xf0, SR
- jmp halt
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement