Discuss Scratch

Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

I made an emulator for a subset of the RISC-V ISA: https://scratch.mit.edu/projects/623481548 It is DEFINITELY not sophisticated enough to run an operating system, but it will start a simple Scheme interpreter.

The code for the programs and library, plus a makefile to compile programs (if you have a cross-compiler and -assembler) is here. The makefile outputs the program in base32. (The project adds zeros until there are 10,000 bytes, but you could expand it if you wanted to. If you use the library unaltered, the top of the stack is 0x1800.)

Based on the RISC-V specifications.

Todo: Make MUL work how it's supposed to? Add more CSRs. Move phys. memory? (Definitely not adding paging.)

These are the instructions:
✓ LUI    ✓ BLT    ✓ LW     ✓ ADDI   ✓ SLLI   ✓ SLT    ✓ AND   
✓ AUIPC ✓ BGE ✓ LBU ✓ SLTI ✓ SRLI ✓ SLTU ✓ FENCE
✓ JAL ✓ BLTU ✓ LHU ✓ SLTIU ✓ SRAI ✓ XOR ✓ ECALL
✓ JALR ✓ BGEU ✓ SB ✓ XORI ✓ ADD ✓ SRL ✓ EBREAK
✓ BEQ ✓ LB ✓ SH ✓ ORI ✓ SUB ✓ SRA
✓ BNE ✓ LH ✓ SW ✓ ANDI ✓ SLL ✓ OR

✓ CSRRW ✓ CSRRS ✓ CSRRC ✓ CSRRWI ✓ CSRRSI ✓ CSRRCI

✓ MUL ✗ MULH ✗ MULHSU ✗ MULHU ✓ DIV ✓ DIVU ✓ REM
✓ REMU

✓ MRET ✓ WFI

Last edited by Jonathan50 (Feb. 4, 2022 05:45:01)

Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

The default program is now a Scheme interpreter! (The code is in the same place. It has a Cheney's algorithm garbage collector like the one in SICP.)

It has a few limitations (not every special form is implemented, no vectors or strings, only integers from -2^29 to 2^29 - 1, no sequences yet, doesn't check number of arguments for procedures or special forms, reader doesn't understand dotted lists or comments) but it can run something like

(define (map proc lst)
(if (eq? lst '())
'()
(cons (proc (car lst)) (map proc (cdr lst)))))

(map (lambda (x) (* 2 x)) '(3 4 5 6))

Last edited by Jonathan50 (Jan. 25, 2022 05:27:23)

NFlex23
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Jonathan50 wrote:

(#2)
The default program is now a Scheme interpreter! (The code is in the same place. It has a Cheney's algorithm garbage collector like the one in SICP.)

It has a few limitations (not every special form is implemented, no vectors or strings, only integers from -2^30 to 2^30 - 1, no sequences yet, doesn't check number of arguments for procedures or special forms, reader doesn't understand dotted lists or comments) but it can run something like

(define (map proc lst)
(if (eq? lst '())
'()
(cons (proc (car lst)) (map proc (cdr lst)))))

(map (lambda (x) (* 2 x)) '(3 4 5 6))
Very cool! I love S-expression based languages, especially Lisp and Scheme.
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

OK, I expanded the Scheme interpreter with things like sequences, LET, COND, SET!, and more primitives (and fixed it a bit). I'll put it in a GitHub repo when I can…

NFlex23 wrote:

Very cool! I love S-expression based languages, especially Lisp and Scheme.
Thanks.
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Weird, my post didn't bump the topic. Anyway the code lives here now. (I wanted to use “. = 0x2400” or “.org 0x2400” for the interpreter's symbols, but when the object files were linked the addresses were thrown off, which motivated me to spend about a day and a half trying to write an assembler that just used flat binaries, but it never worked well at all – though actually encoding instructions was easy enough – so I gave up, and used --dump-section for the symbols.)

Last edited by Jonathan50 (Jan. 24, 2022 00:32:26)

Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Bump.

Now supports all 40 RV32I instructions, and also a few CSRs, and traps, interrupts (well, an interrupt from the UART), and exceptions.

Also libgcc works for 64-bit division, so it can tell the time. (OK, I get the impression that the time register isn't meant to necessarily begin at a constant point in the past, but they don't say it has to begin at power-on either, nor that it can be reset, so as long as it's a real-time clock it should be conformant…)
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

OK, I added base32 so here is the RPN calculator:
G4QQAAATAEAYB3YAQAKDOEYAAAJQGA4AOMQEGMAXAMAAAEYDAMGHGECTGBZWABBQ54AIAOTTAAIAAEYBAH7SGJQRAAJQGBIAANCQGADDBQCQAIZEMEAO6ACAFQBSHAIACMBRGADP6CP75AZAYEABGAIBAFTYAAAACMAQD7ZDEYIQAEYDAUAGGXADAAJQLUACEMSGCAHPAAACSAZDQEADGA3AICJQHIAACMHBAAFTR3BQGY2G2MARHDQOABX7AX77WNHMGAZT4V7AEEYFAUBSGJDBAARSFQIB54AIAJIDFZAQAAZDQEAJGA5AAAZU47QC4NGMB7MDEDAQAEYBAEAWPAAAAAJQCAP7EMTGCABDERYQA4ZDEA2LOAYAQCZXG4YAMOEAGAVXAMAIBE4DWMAGGHTTAC3QGIAMSOBUGAADUMBQAI5AMMAAGI6BACBSHAIACMAQCALTAAQDAEYFYAZ674G76AJQLABUOMRSANATCMRQAMYFMUAAGJIFADX7AX7POMSTANHP6AP7E4YAKAIG74G7763QOAAQCMDRAAFDQDTQBNYHAAGBGBYQAAR2JZYCW4TQADATA4AEAI5A44ALOBZABQR2ABYAM6AAAAFXA4ABBA6HK4ADOBYACCJ7OFYAMONAOADTABIBBA2HK4AJH5YXADRYUB76G4DQAEEDI4DQBEYG2AAJH57XB4JYKBYAMOENOABXA4ABAIYA64AGPAAAAARQB5YASMD2AABXA4ABAEYFUAACGAHXABTYAAAACMAQD7ZDEKIQAIZEQEACGIBBAERSMEIACMCAAAETAQAF6EYJUAAG6AGAACRQ7J76COCAOAHP6BP7PEYHCQADHB7UADRRMJP7GOCIIABDAASACIYAA4AIGIGBAABSJAIAEMUAA3UDERAQAAZJAEABGAIBAFTYAAAACMAQD7ZDEKIQBAZHABXSGJEBAAJQIAC7EMTBCAFTQ6DQAA6FA4AGGDAFACBSBQIAAMSICAEDERAQAEYBAEAWPAAAADX7AX7WQMTQA34DEDAQBAZEIEADHBEHAABUKBAAAMSICAATAEAQCZ4AAAABGAIB74RSFEIAQMTQA3ZDESAQAEYEABPSGJQRAAZYPBYAANCQOADDAACQFAZAYEAAGJEBACJYOFYAEMUPA3UDERAQAEYBAEAWPAAAADX7AH7QQMTQA34DEDAQAM4EQ4AAGRIEAABSJAIASODROABDFDYG5AZEIEABGAIBAFTYAAAASMD2AADDDD2QBNYHAAIBGB6QAARYBZYACN27KD5XA4ABAI4AU4AGPAAAAAJQKBP5CM22KADHQAAAARLYMNSXA5DJN5XDUIAAAAAAAADIAMAABAYDAAAJSAYAAAAAAAAAUYBQAAAAAAAABOQDAAAGS3TTORZHKY3UNFXW4IDBMNRWK43TEBTGC5LMOQ5CAADJNRWGKZ3BNQQGS3TTORZHKY3UNFXW4ORAABRHEZLBNNYG62LOOQ5CAADMN5QWIIDBMNRWK43TEBTGC5LMOQ5CAADTORXXEZJAMFRWGZLTOMQGMYLVNR2DUIAAAAJQCAPVG4CQAABDESAQSEYFAVPDODAAIARSFEIKEMQCCCZDFBQQSIZGOEESGJQRBIRSJAIKEMXDCCJDFRAQSIZKKEERGCIAADX7AX6CSMFYCAETASIAAEYLAABRGDH477X7AH7ISMFAAAETA4C73EYJWABBGCWQAJR7J5AEMMEDKCLDDZCQX37QD7TJGBYF7VR7Z5AGCMD6T7YTBH477EYGAEEBGFZHAAJRMKIAGOD6MABTQ3DAAAZGQ34IGJUH7CZYNRSAEMSNP6HD4D2PYEYHAAABGFBHAAZQJZAACMKBIABTASSAB37QD7QZGBYF7UJQOBH54PZPJ7TDQQFAAMYHRNAJGFRJAAJQMAIIWMDNMABDUTTPQEYJDEAG74E766JQUEAAN7YB754TA7U76EYJ7H7RGBYBBCJZOJYASMLCSAFTA73QBMYG24AIHJUG7AB2PB7YGMD5OABDUTT7Q37Q37ZJGB5AAJRQV5IESMD7AATDB32QNEYHEACWGAXVBKJQPIAA4MLPL4HDKQQPCMYEREARGFBEAAZYJCYAN4AIAAATQQDQAAZFAQAO74A7WMJQLIAA57YB7XMTA7CP7Y4URP7BGCIAABX7AX7NSMD6T7YTBH476EYHAEEJHFZHACJRMKIAWMD7OAFTA3LQBA5GQ34AHJ4H7AZQPVYCEOSOP6DP6BP6VEYH5H7RGCPZ74JQOAIISOLSOAETCYUQBMYH64ALGBWXACB2NBXYAOTYP6BTI7LQEI5E474G74C746JQP2P7CME7T7YTA4AQRE4XE4AJGFRJACZQP5YAWMDNOAEDU2DPQA5HQ74DGZ6XAIR2JZ7YN7YF7ZCSKBHCAY3BNRRXK3DBORXXECQA
and the program that states the time:
G4QQAAATAEAYB3YAAAKTOEYAAAJQGA4AOMQEGMAXAMAAAEYDAMGHGECTGBZWABBQ54AJA3LTAAIAAEYBAH7SGJQRAAJQGBIAANCQGADDBQCQAIZEMEAO6ACAFYBSHAIACMBRGADP6CP75AZAYEABGAIBAFTYAAAACMAQD7ZDEYIQAEYDAUAGGXADAAJQLUACEMSGCAHPAAACWAZDQEADGA3AICJQHIAACMHBAAFTR3BQGY2G2MARHDQOABX7AX77WNHMGAZT4V7AEEYFAUBSGJDBAARSFQIB54AIAJYDFZAQAAZDQEAJGA5AAAZU47QC4NGMB7MDEDAQAEYBAEAWPAAAAAJQCAP7EMTGCABDERYQA4ZDEA2LOAYAQCZXG4YAMOEAGAVXAMAIBE4DWMAGGHTTAC3QGIAMSOBUGAADUMBQAI5AMMAAGI6BACBSHAIACMAQCALTAAQDAFYVAAABGBOFYTX7BH7QC4KQAAATAXC4I4ZDEA2BGEZDAAZQKZIAAMSQKAHP6DP644ZFGA2O74E76FZQAUAQN7YN775XA4ABAEYHCAAKHAHHAC3QOAAMCMDRAABDUTTQFNZHAAGBGBYAIAR2BZYAW4DSADBDUADQAZ4AAAALOBYACCB4OVYAG4DQAEET64LQAY42A4AHGACQCCBUOVYASP3ROAHDRID74NYHAAIIGRYHACJQNUAASP37ODYTQUDQAY4I24ADOBYACARQB5YAM6AAAABDAD3QBEYHUAADOBYACAJQLIAAEMAPOADHQAAAAEYBAH7SGIURAC3RIAAAEMSICABDEAQQCIZGCEABGBAAACJYIBHWCME2AADPADAABIYPU77BHBAHADX7AH7XSMDRIABTQ72ABYYWEX7THBEEAARQAJABEMAAOAEDEDAQAAZEQEALOFYAAAR2ABYGQMSECAADFEAQAEYBAEAWPAAAAAJQCAP7EMRJCAFXCQAABA5HAQDCGJEBAA3RIAAACMCAJ5RDEYIQBM4HQ4AAHRIHABRQYBIAQMQMCAADESAQBAZEIEABGAIBAFTYAAAA57YF75MDU4CANAZAYEAIGJCBAAZYJBYAANCQIAADESAQAEYBAEAWPAAAAAJQCAP7EMRJCAFXCQAABA5HAQDCGJEBAA3RIAAACMCAJ5RDEYIQAM4HQ4AAGRIHABRQABICQMQMCAADESAQBE4HC4ACHIHUA2BSIQIACMAQCALHQAAAB37QT7XIHJYEA2BSBQIAGOCIOAADIUCAAAZEQEAJHBYXAAR2B5AGQMSECAATAEAQCZ4AAAAJGB5AABRRR5IAW4DQAEATA7IAAI4A44ABG5PVB63QOAAQEOAKOADHQAAAA4ZFCDAPGJIQZBTYAAAACMAQD7YTA2AD5EYGAAACGJQRAARSJAIAEMRJCAHPADAAMN2WAEABGBQGDCJQMAAA54AIAVETAQCQANYVAAABGBIF4EZ4LJACCMCMAA7P6CP4YEYFUAB674E77AZ4LBACGNSYKAXP6BP4WEYFUAB674C764Z6LBAC57YF7SQDESAQBAZAYEAIGJCBAA3RKAAACMC4L4ITAEAQC37QL7CRGCAAABR44BIQMPOAMABTA3AEBMZXYAALGBWQIAJUR6H7WODPMQETQ4DAAEYDAYAJGDQFACJYQBIAMOOAMHDD6LCRANYHAEAGG2XGES3QOAABMNQPMRATK6DADEYHQAA3OFQAACJYMBXAGMD5OAADI4DQBMYH64ABGBYAAIZQP52AMMGAOAFTSXSQBM2X6UADGE7GACZ6RNYAWMPOKAATKYBQDM6XZABJGFQDAGJ5MBQBCPLQ4ANT6XEAEM4F6YBJHFIFAGZ6RZIAMP6KQAFTRBUAAE4H677WHZDIABR65KCASMDQOAFTRCUEBM6VZABJHHQOAGJ54DQBWP4MQAVTQ23AFE4YBAA3H2GYAFR75WAAWMEBGAITQ7276Y7GNAAJHBPF75R6JWAASMCQOAATSUDQCM3FWUAJGBIAABRQUCAAGMC2AQFTG6QABMYFWBALHBPVIBTYAAAAGMC2AQFTG6QABMYFWBALHBPVIAJQR4H7N7YF73LDCYDAAEYDCAADGU6TAI3QOAIAMNUOGEVXA4AACY3A6M2BGV4DAGJQPAABW4LAAAETQYDOAMYH24AAGRYHACZQP5YACMDQAARTA73UAYYYA4JJGGADAGZYMZKACNPQGAMT3AEADEYFCAABHVYOAGZ5PZQDWP3OMAZTQYLQHE4WAYATHZ7GABRXZRYAGMDWOAETQ3376Y3EM4AGGZGHGKJYOBQAGMD4OQFTK3TQHE46BYAZHXQOAEZXPZYDWOEBMAYTC4DQCM3H24AWG7QXAEZQPYYACODPN73DMZTQBE4G437WGZAXAGJQMBQACOKQOAJTMXKQA37QL7YGH2GVAS3QOAIAMPVPMBFXA4AACY7A6YTBHV4GAGJQRAABW4LQAAETQ4D6BMYH64AAHQYHACJQOAACGMBRGANTQ5TUAY4WA4IGH3FWEQZTLRIACNCRKAETAUAAA37QL7VZGBIAAAJQKAAAN7YJ72UTA7YA6Y7Q24SBHV4GACJQRAAAN7YB764TA3YA6EYHAMAOH7TG5QJVPAYASMDYAADP6AP63EYG6AHRGBYGADR7ZRW2CNLYMAETA6AAA37Q37NDGE7DAAZ5N5IACNPQGAJTL3TAHM4W4UALGV7VACZ6NVYASMMAGAMT3AEADMY64UAJHVIGAGZXPZQDGOD4QA4TS4DQDM7HW4AGH7XHACZYOZYACMDP573D5ZTRYY7444OBGDXO76ZYOZYAWOD6OQBT23TQGE4XAYARGVYHAGZ7PZYDGOC4QAUTSYDQDM7G4YAGH7VGACZYMZQASMD7N73D5BTBQY7WUYMBGBXG76ZYMZQASMKQ4ANTQ2TEBM7FYUAG74E74QZVOZQAWOLPMAFTM3LQBM6YMUABHXYGAGZ552ADCOPAMAJTKNSQAE26BYA3HFPVACZWLMYACPLQKAJTC33ABM7Y5ABTGA66AOJZQCABGPT6QADDPZTQAMYH24AJHCH675RWJVYSMNZGOEUTR3XP6MYH24ADGB3HIAZVHZYDSOKQKAMT2UCQCM3X44B3GCDOAIJROBYBWNS3OADD7YKQDM4F2UABGB7T75R65VIMMP6BKDITAPR77M4F2UAJHHQOAE3Q6AIAWPXG4AATA7777M7W5YABHUYOAEZXPZQACNLAMAJTR3TAFM4FCVA3HBWGAKJVQDQBGMD6GAVTQ3TABM4G3AADGBWDAJR7JZQAGMDOMAIT2MDACMYGYMAGH2WFAJRYRRIACOCQ4AETAUAAA37QD7GDOBYBAAJQP577WP3OMAETSYDACM365YALGF7VACZYNRQB4P6NP7ATQX7P7EYFAAAG74C7ZEJ5OBQBSMEAAALP6BP5UE2XAYAZGBYAAFX7AX54CNLQGAMTA4AAC37QL7GJGBIAAAJQKEAAN7YF7RQTQ4DABEYIAAAG74C724JQGBYAN7YB74YTQYDQA37Q37TZHDQIABX7AX7OCMHAMADP6AP6HE4H4773HCDIABX7AX56SOD6P7ZTA5TQA37QT7GRGCAAABR4ABIQMPNAMABTA3AEBMZXYAALGBWQICZYN5SASODQMAETBADAAEYOAUAJHDQFABRZQBQ2MP3MKDRXA4AQAY3Y4YRJGBXQB4JQOBQAMP3MMAATK6DABEYHQAALOFQAACJYMBXAGMD5OAADI4DQAEYDAABLGB7XAAZQH42AMMGAGAFTSVSQBM2X6UALGGDGACZ65NYAGMPGKAAT2YEADM6XZYBBHFIIAEJVKBIBSNLA4ANT73HAFMYH6UBJHHQOAEZ6PXQAMN5POABTA4LQCY3GC4AWG5HXAAZQOFYBGMD7OQFTK3DQFEYXBYAZHVYHAEZXPRYCGMC5KAQTC4DQDM3H64AGHYFHBYZYLJ2AGNKWKAETAUAAAYYKBAADGBNAICZTPIAAWMC3AQFTQX2UAZ4AAAADGBNAICZTPIAAWMC3AQFTQX2UAEYI6D7W74A755RRMBQASMEBAAFT3DMAENYHAEAGHYXICK3QOAABMPUPQMQT26EADEYHQAA3OFQAACJYMBXAGMD5OAADI4DQAEYDAABLGB7XAAZQH42AMMNAGJETTYEADM4FCVARHVQIAGJ54DQBCNLQ4ANT23CQFM7VYUBLHBWWAOJZKBIBGPT6KADDPDLQAMYHC4AWGZAXAFRWFVZQGMD5OQBTKXDQEEY6BYARGXQOAEZXPRYCGMC5KAYTC4DQDM3HY4AWH6VHACZYOFYBMPTBOALD6STQBM4HC4ATHBNHIAZVKZIASMCQAADP6BP7DEYIAUAOHZWV6C3QOAIAMPVPMBFXA4AACY7E6YTBHV4GAEJQHAABW4LQAAETQ4D6BMYH64AIHTQHAAJQ4AACWOHG4ABTB3PECYYSBYDGHZFWABRWVRIAWMEMKQFTQXKUAMZVCUA3HBNFIAJYKCAAN7YF724TA7YA6Y7624RBHV4GAAJQHAAAN7YB764TA3YA6E4HBAAOH5AW54J5PCAASMDYAADP6DP63NYHAAAWGYXWEAJVPBQBSMDYAALP6CP53M2X2YA3HFWGAGZ6NVYAGPJ5KAIT24DACM274MBJHHYGAGZVPVIBSPPQ6ANTSXCQDM7FW4AJHWAFAEZRNRQBGMK4KAJTOPRQFM4H54BRGEYDAGZWQEYBMP7PQAFTRDMAAEYD777WHYGYDRR756A2CMH6775TRDMABM4I7BALHV7IAKJZKBIBSPKQKANT7DUAFM4P74BBHFYIAEZWPNYAMN7POAJTA7LQBE4F677WG3WXCZRXZ5YXSOD6P7ZTA7LQAEY7B4A3OAYBAAZW77YASOEPH7ZTOMPQDE2VAYARGXYPAGZXQFQBWMBBGAZTA73UDMYID4BZHVYCAEZQHMYCGMBRGANTQ5TQAMYPX4BGH5AXAEZQ67YAW4EACAETRD4P7E6VA4A3H5YXAGJZOBYBWPZBEANTQXSQDM4HK4AGG3VXBJRQVNYKWMD7KQBTGX2QBMYFW5ALHBNFICZZ5VIBGPK4OAJT4WXABM6VYUAW74A72SZZQ2AAGPL7KAAT2YEADM2WY4BJHHQIAGZVP5IASPPA4ANTSVSQBM7FW4ABHXYFAEZR4ZIAGN34OAVTQ7PAFEYWA4A3HZXGAFR7V5QAWODBMALD4YLACY7U6YALHBQWAGZYN5SAGPL4MAUTS4CQDE6XA4A3H5WGAIZYP3QCSOKQMANT4X2QAY724UALHBIVAFR6MFIBMP2OKAFTQUKQDM4F4VAG74E72PRXR5PUGODMOQFTW7DQBM4H24ALHBPVICJQOBQAN7YJ74YT24DACEYDAAAW74G73EJ5OCABSMDQAALP6BP42E2XAYAZGBYAAFX7BH55CODQMAATAMAAA37QT7LZHBYFABX7AH7JCMHQGADP6DP6IMYHC4AW74G7Z5CXQY3FOB2GS33OHIQAAAAAAAAJQDIAACZQ2AAAZEGQAAAAAAAABVQNAAAAAAAAADVA2AAANFXHG5DSOVRXI2LPNYQGCY3DMVZXGIDGMF2WY5B2EAAGS3DMMVTWC3BANFXHG5DSOVRXI2LPNY5CAADCOJSWC23QN5UW45B2EAAGY33BMQQGCY3DMVZXGIDGMF2WY5B2EAAHG5DPOJSSAYLDMNSXG4ZAMZQXK3DUHIQAAAAAAEBAEAYDAMBQIBAEAQCAIBAEAUCQKBIFAUCQKBIFAUCQKBIFAUDAMBQGAYDAMBQGAYDAMBQGAYDAMBQGAYDAMBQGAYDAMBQGAYDAMBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQOBYHA4DQQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCAICMAQD7ZDEYIQA4ZFCDAPGJIQZDX7BT6E57YE7OTP6AP76ICVKRBQAAAAAAIAAAAAAAAAAAABPJJAAAL4AEARWDICAAIAAAAADAAAAAFA6T7773AEAAAAAAAAAAIAAAAAFQAAAADY7H777IAEAAAAAAAAAA======
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Now you can play a game (as long as it's on TurboWarp, otherwise it will almost certainly be too slow): just stop the project, click “Load another program”, enter the following, and click out of the ask box.
G4YQAAHPADACQNYTAAABGAYDQBZSAQZQC4BQAAATANBQ64YQKMYHGYAEGDXQAUC6OMABAAATAEA76IZGCEABGAYFAABUKAYAMMGAKABDERQQB3YAIBEAGI4BAAJQGEYAN7YJ77UDEDAQAEYBAEAWPAAAAAJQCAP7EMTBCAATAMCQAY24AMABGBOQAIRSIYIA54AAARIDEOAQAMYDMBAJGA5AAAJQ4EAAWOHMGA3DI3JQCE4OBYAG74C776ZU5QYDGPSX4AQTAUCQGIZEMEACGIWBAHXQBACBAMXECAADEOAQBEYDUAADGTT6ALRUZQH5QMQMCAATAEAQCZ4AAAAJGAQABBZ2AQRQM6AAAAFXCIAABE4CGLQCHIFSAC3QEAABAORQEABTAORQBNYCAAAZHAUCAAR2AYQAM6AAAABDEKA7UEYEAEABGAIB7ARSIFHYEMUDJ6BDFJCPQIZMKT4CGLTE7ARSA5H2EMSJJ6RDE2SPUIZIWT5CGKWE7IRSZVH2EMXOJ6RDED2PYIZCAT6SGJAU7URSMJH5EMUDJ7JDFJCP2IZMKT6SGLTE7URSA5H7EMRIJ7ZDESKP6IZGUT7SGKFU74RSVRH7EMWNJ7ZDF3SP6IZA6QAXGIZAGS3QGAEAWNZXGADDQIBQJNYDACAJHA5TABRQQ4YAW4BQBAETQNZQAYYMOMALOAZABSJYGQYAAORQGABDUBRQA3YAAACZOEQAACJYF4WDQORAEAHHQABAA3YAYABROFIAAAJQLBNZ57YN7ZAXCUAAAEYFQW4XGIZAGQJRGIYAGMCWKAADEUCQB37QD7RXGJJQGTX7BX7FOMAFAEDP6DP77AZAQT4IGIIE7EBSERHZQMRIJ6IDEPCPTAZDAT5IGJEE7IBSLRH2QMSQJ6YDEZCPXAZGQT5QGJ6E7OBSOBH4AMUEJ7EDFCCPYAZJYT6IGKIE7UBSURH5QMVIJ7IDFPCP3AZLAT7AGLCE72BSZBH6AMW4J7UDFUCP6AZOIT7YGLUE74BS7RH7QMXQIAADERCPUEYBAEEHGABAGC3QOAAQCMDRAAFDQDTQBNYHAAGBGBYQAAR2JZYCW4TQADATA4AEAI5A44ALOBZABQR2ABYAM6AAAAFXCUAAAEYGAAAJHBOF6E3RKAAAG4DQAEETBDIAAEYIUAAG6AEAABZQAUAQQNDVOAET64LQBY4KA77IGRYHACBSMBPRSP37OD3DQYDAAY4AC4BSGAHXACJQMFQAMOBAOAZTQ3KQBIYP637BHBQGABX7BH74EMABOAMTA6QAAIYA64AJGBQWACJQPIAAGODMKABDAD3ABM4G2UALOFYAAARYABQAEOXAOADHQAAABNYXAAAIHJ2H6FRYIBYGCMAQD7ZDEKIQBNYUAAAIHJ6EAERSJAIAG4KAAAATATCPCIZGCEALHB4HAAB4KBYAMMGAKAEDEDAQAAZEQEAIGJCBAAJQCAIBM6AAAAHP6BP7FA5HYQAYGIGBACBSIQIAGOCIOAADIUCAAAZEQEABGAIBAFTYAAAACMC7B73HQAAABNYXAAAIHJ2H6FRZ4BYEW4DQAEEDY5LQANYHAAIJH5YXABRZUBYAOMAFAEEDI5LQBE7XC4AOHCQH7Y3QOAAQQNDQOAFXCYAABA5GA3YZH57XB4JYKBYAMOGAMAETA3IAAY4O24BDOBYACARQB5YAM6AAAADHQAAAAEYBAH7SGJQRADX7BX7RG4LQAAEDE7DQDAZAYEAJHBYXAARS55YACMAQCALHQAAAAIYA64ABGBNAACJQPIAAN7YN765XA4ABBA6HK4ADOBYACCJ7OFYAMONAOADTABIBBA2HK4AJH5YXADRYUB76G4DQAEEDI4DQBNYWAAAIHJQG6GJ7P5YPCOCQOADDSQDAAZ4AAAAJGBWQABRZRVYAEMAPOAATAWQABEYHUAADOBYACARQB5YAM6AAAAETA6QAAYYY6UALOBYACAJQPUAAEOAOOAATOX2Q7NYHAAICHAFHABTYAAAACMAQD7RDFSAQAIZKSEACGKBBAERSMMIBEMSECAJDEJIQCIZOCEALOGQAAAJQJMABSMCCABATBIYAJEYJIACBGCIQATX7AX7K4MPIL7XP6DP6T37QT7UWGDUVAJR5BJACMMCEKBPDCI277A5HZJERGBYA4AR2RZYAEOVAOADP6AP73YYWEX6YHJ6KJEJQOAHQEOUAOABDVLTQA37QT75YHJ6KJEJQOAAQEOUAOABDVLTQA37QL75IHJ6KJEJQOABAEOUOOABDVIDQA37QD74TOFIAAAJQCAP6CMC4L2JDFSAQAIZOCEACGKURAARSQIIBEMTDCAJDERAQCIZCKEARGBDQAPX7BH5GCMCPJ7YTAUAAF37QT7X6GGQE7Y3RKAAACMCYL2XP6DP2JEYEEAALOGIAAAJQS4ADCMFAAAMTBIIAAA5EJFFGGGAEABXQBQAMAMSIIATDAICAZAZHAQAOHGUX72BSNRABAMTUIAET273ADM4H24AJHVYXICZQP52A4OOFP7IDEWCAD37QT6PYGJ6EAGJYP577WOFPUAETRINABY2YLH5ZHBAUAAJQLIAA57YF7Z7DTZCPSNYVAAABGBIF5PX7BH44W4LQAAADUWDUUEYEAABO74G7TY3RKAAACMCUL3HP6DPZVNYXAAAAHJIHJLX7AX45CMCPJ7YTAUAAF37QD7R6GGQE7YBSJAIBQMQMCAMDERAQCAZJAEAYGKOBAABSVAIAQMVECABXCUAAAEYFIXWRGAIBAJX7AX4WCMCQAAXP6CP5637QD73TOGAAACBSPCHRG4DRAAETAX376E4XE4ADGB7XAAJQOFYASNL7OQMT23DQBMYH24ALH55XACZYPV2ASOLCOAFTQ33ABE4GCYABHVXWIEJVNRQAGOD4MABTO63QBEYG4AADGB6HICZ6PVYCSMDHAAZDFTUPAM3H24BJHBZHACJZNBYAEMQPKABDE3KQAEYHC4AJGF4HAARSFZIAEMSPKADHQAAAANYYAAAIGJ4IJFRYEBYGQOUIOARDFQMESY4EBAACHIQIAK3RQAAAAOUEQSQTT2CQAEYTQUACHIFHAAR2FNYAEOSMOAJDUZTQAI5IA4ACHKQHAAR2ZRYAEOXNOABDUDTQEI5CA4BCHJAHANRQICAAEMRPQARDUL4EUE4FA4AGPAAAAC3RQAAAAOUAQS4TA7AAFMYH7ABBGCAYAAR2QCCLG4MAAAATBAEAFM4HA4AW74G77AJQCAP7QMSUKABDESAQAEYEAUAAGJIFAA3RMAAACMDSAAETAYIAAEYGQ3XSGJQRADX7AX7UW4LQAAEDU7DUSAZGQQAAGJ6EAAB2QRYAQOSQOAETA3IAAEYYRAAJHFMFAAZQRSCAWOC6KQBTAYEAHEYHUAADHB5VAIZQNZQAGND7MAUTQ33P6MYH64AJGV7XAGZYPZYASPLROQHDSQDP4EYYVAAJHFMVAAZUR6ACQMQMCAADESAQBM6H6UBCGKAFAERSV5IACMAQCALHQAAAAEYBAH6CGKURAK3RIAAAQOTUISZDFYIQEIZMQEBJHBYXAARSQIIDEMTDCAZDERAQGIZCKEBSGIDBAMRS44IBEMWICAJDFKIQCIZIUEASGJVRAEJQOAAGEOVPISTDR3TSQNY5AAAAGJCNJI3RSAAAMMBAIDFXBEIAANY4AAABGCQQACJQYYAAW4NQAAFXDUAAANY3AAAJHCPZ76BSOBACQMVIIATDQBDRXAZFQQAIGJQEAEBSLRAAQMTUIAIDE3GESMYH6UAJGV7XIGJ7P5YPWOD6OAET26DUAE4I477RGBOQABRWYBILAMUMIANTQXKQBE6W6VARGVPYAGJ7N5QPGMCQKANTQ23ABE6WQZABGVIVIAZYRJSAMNLAACJTAXKQAEYIOABWGQFIBARSJNAAEMTOIABDED2AAIZC2QAGGCGEAABSOBAAQMTQMADDA33QUE4EBIAOHEQK63X7BH55QMTYSSTDL3YBQAZEQEBYGIGBAOBSIQIDAMUQCA4DFHAQEAZKQEBIGKSBAIBSWAICQMV4CAIDFSAQDAZMIEAQGLIBAGBS3QIAW4KQAAETQUCYUEYFQAGBGAIBARX7AD7NAMTQIAUTA4QABYYW674IHJYLJKBSMTKKAMTUIAUTQ4LQAI5A7NFIGJ4EAJRQ5VAQMMDAOABDET3QFAZHQQBIHJUNJER2FZYCEMRAIARDETKAEI5MRVEG74G76SBSORAAQMTEMAATA4QABM4H25AJHBYXADRWF57UQMTISSUDE4CAFE4G637WHBSHDMBSMTKKEMSNSSQDE5CAFAZHQQBGGAWEBRRQMBYAEMSPOAUDE6CAFA5GRVESHIXHAIRSEBACEMSNIAQTAVYAAI5MRVEO74E7UBX7AX7PQOTUIS5T46LQGY4GA4FAGJWMJGBSLBAAAMS4IAADENDAAAZHAYAJGBWQAAJRHAYACMLYOABTAOZUAMYIU5ALGCDDAKJQPIAAGMDQQA5TRDUAAM6H7ABJHBXW76ZQP5YACPL7OANTA73QBE6XC5AOHFAG72JRMEYACMLRQAFTQZTAAMYHA4AZHFTWAAJROZYAWPDPMAVTI73QEIZI2QACGKXUABX7AH67EMRP2STP6AP66IZC7VFG74E76Q3RKAAACMCUL4HP6AH4Y4YAKAIHGACQCBX7BH77CMCQIAHP6BP4O37QD72TOFQAAAJQOEAASMDDAAATA2DO5EYFCAABGBIQADX7AH54W4KQAAEDU2C7CNYHCAABGBXX76JZOJQAWOD5OAETQ4LQAE6X65ARGV6HACZYPZYAWP34OAFTQ7TUAE4XE4ADGB7XAAJQOFYASNLPOQMT23DAAMYH24ADG56HAAZQPV2ASMDOAAFT47LQFEYGOABSHLHF6AR2UBCKGNT5OAUTQ4TQBE4WQ4ACGIHVAARSNVIASMDROAATS6DQAIZC6UACGJHFABX7AX6MAMTYX4ITAVYABEYXE4ALHB7HACJYOFYACPL7OQITK7DQBM4H44ALH5ZXAGZYPZ2ACOLSOABTA73QAEYHC4ABGVXXIEJVNRQAGMD4OABTO43QCMYHY5ABGBXAACZ6PRYCCMDHAAZDFTV7AM3HY4BJHBZHAAJZNBYAEMQPIABDE3CAAIZE3FFJGBYXAAJZPBYAEMRPIABDETSAB37QT6AW74C72C3RMAAAAOTEMSQDE5CQFAZHQUBGGBVGAJRQMBYAEMSPOAUDE6CQFNYWAAAAHJUGJER2FZYCEMRAKARDETCQEI5MUZEGPAAAAAR2F5SKN7YB77VXCYAAAA5FQ3YZGFZFACZYPJYASODROAAT2X3UCE2XYUADHBPHAC3QOEAASOD7P7ZTOX2QAMYF4VACHLFG6BTYAAAASMDNAAETA6QAAM2H6UBJHBXW74ZQP5YASNL7OANTQ7TQBE6XC5AOHFAG7YJYKBYAM6AAAAETK72UCM6FU4ADGBPVIBTYAAAAIV4GGZLQORUW63R2EAAAAAAAACOA2AAAW4GQAAGNBUAAAAAAAAANUDIAAAAAAAAA5YGQAADJNZZXI4TVMN2GS33OEBQWGY3FONZSAZTBOVWHIORAABUWY3DFM5QWYIDJNZZXI4TVMN2GS33OHIQAAYTSMVQWW4DPNFXHIORAABWG6YLEEBQWGY3FONZSAZTBOVWHIORAABZXI33SMUQGCY3DMVZXGIDGMF2WY5B2EAAAAAAAAAALOFYAAAR2UB7QW4LQAABDVAD7BNYXAAABGCCAAER2EB2KG4LAAAFXC4AAAEYBAH7SHJAHJMJQOAAAW4LQAAETAYYAAEYGQ3WZGBKQAAJQKUAAEMTBCABDUADUV37Q36ILOFYAAA3RMAAACMDRAAETAYYAAEYGQ3XCHLVHJCJQLAACCMC2AAHP6CPY5NYXAAALOFIAAAR2NJ2KSOCQLCQTAWAAZ37QB6S674APUTX7AT7FDNNTESQ3LM2DO3IAAAABWW3NBIAAAAAADNNTGMB3GQ3W2SDFMFWHI2B2EAAAAAAAEAQFGY3POJSTUIBAEAQAAAAAAANVW3IADNNTGMB3GQZW2ORNFENVW3IAAANVWMZQHM2DC3J6HJ6BWW3NAAABWWZTG5WSUG23NUAAAAAKI5QW2ZJAN53GK4QKAAAQAAAAAEAAAABA3OGAA===
Just press an arrow key once to change direction. (Can't tell if the memory-mapped timer is allowed to differ from the time CSR or not, but the former has to be the Scratch timer to use the when timer > block. Oh well.)

(The projectiles missed less when it was a Linux program with floating-point arithmetic. GCC soft float arithmetic kinda actually DOES seem to work, until you try to make it into a game. Which would be 64-bit IEEE floating point arithmetic, implemented using 32-bit integers, implemented using 64-bit IEEE floating point arithmetic… Just used integers.)

Also the Scheme interpreter now comes with a small library with things like MAP and LENGTH, which works because the memory was dumped with IMAGE, so if you change some things and want to start over you need to refresh the page or reload the program. (Terminal based on stamping now since the Pen Text Engine Enlightenment went by me ‘cos I wasn’t mathy enough )

Last edited by Jonathan50 (Feb. 11, 2022 09:17:57)

Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Now the game finally really works (it no longer permanently freezes, at least on TurboWarp – just had to implement pending interrupts in the emulator) And now the program in the post above is actually the right one

Last edited by Jonathan50 (Feb. 11, 2022 09:19:47)

Geotale
Scratcher
100+ posts

RISC-V subset emulator (with Scheme interpreter)

Absolutely incredible! Is there any reason behind the instructions you haven't implemented?
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Now you can disable the ask box/enable screen refresh (which the game needs disabled). (My excuse for still using an ask box is capital letters. )

Geotale wrote:

Absolutely incredible! Is there any reason behind the instructions you haven't implemented?
Thanks. If you mean the three MULH instructions, I hadn't figured out how to do full 32-bit*32-bit multiplication (OK, you probably just break them into 16 bits and multiply them like two two-digit numbers or binomials) and I didn't need it, being more concerned with getting things to work than implementing everything perfectly accurate. As for other extensions (either compressed instructions or floating-point) they don't seem really necessary, but if someone has a suggestion I can try.

And paging/supervisor/user mode is beyond me (no Linux on Scratch ) though the first thing to do would probably be to make a sort of physical memory map instead of just having main memory begin at 0 (wouldn't have thought of doing otherwise because it doesn't simulate a real computer, although the calculator and Scheme interpreter work on QEMU if you change the address where they begin, because I implemented as much as was necessary of the UART the same and the interrupt controller – well actually it only controls one UART interrupt – at the same address.)
Geotale
Scratcher
100+ posts

RISC-V subset emulator (with Scheme interpreter)

Yep, the 16-bit thing works for 32-bit by 32-bit multiplication. Not too long of a script either, I personally like an implementation that's 3 blocks tall.
No Linux on Scratch? D: I can't believe it!
Isn't paging related to virtual memory? Specifically mapping what memory “pages” are allocated and sorta how they are?
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

Geotale wrote:

Yep, the 16-bit thing works for 32-bit by 32-bit multiplication. Not too long of a script either, I personally like an implementation that's 3 blocks tall.
I eventually got something to work but it depends on the fact that you can store integers up to 2^53 (intermediate values need 48 bits). I almost think doing it bit by bit would be easier than this way. (Adding the instructions will be the easy part.)
define multiply (a hi) (a lo) by (b hi) (b lo)
set [a*(b lo) v] to (((65536) * ((a hi) * (b lo))) + ((a lo) * (b lo)))
set [a*(b hi) v] to (((65536) * ((a hi) * (b hi))) + ((a lo) * (b hi)))
set [n1 v] to ((((a*\(b hi\)) mod (65536)) * (65536)) + ((a*\(b lo\)) mod (4294967296)))
set [n2 v] to (([floor v] of ((a*\(b hi\)) / (65536))) + ([floor v] of ((a*\(b lo\)) / (4294967296))))
if <(n1) > (4294967296)> then
change [n1 v] by (-4294967296)
change [n2 v] by (1)
end
Edit: If it's got to be hacky anyway might just as well use 49 bits
define multiply (a hi) (a lo) by (b hi) (b lo)
set [n1 v] to (((65536) * (((a hi) * (b lo)) + ((a lo) * (b hi)))) + ((a lo) * (b lo)))
set [n2 v] to (((a hi) * (b hi)) + ([floor v] of ((n1) / (4294967296))))
set [n1 v] to ((n1) mod (4294967296))
Isn't paging related to virtual memory? Specifically mapping what memory “pages” are allocated and sorta how they are?
That's what it is, I meant virtual memory.

Last edited by Jonathan50 (Feb. 23, 2022 08:46:34)

PPPDUD
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

How can I compile for this online? It seems rather interesting.
sf97ahgf
Scratcher
100+ posts

RISC-V subset emulator (with Scheme interpreter)

PPPDUD wrote:

How can I compile for this online? It seems rather interesting.
Online? Well, I'm not sure about doing it in a web browser, and you should use mingw64, or cygwin to compile.
Jonathan50
Scratcher
1000+ posts

RISC-V subset emulator (with Scheme interpreter)

PPPDUD wrote:

How can I compile for this online? It seems rather interesting.
Maybe Replit will let you compile GNU binutils targeting riscv32-elf so you can assemble (with make). I don't think I've ever used Replit, so I don't know for sure.

I think the game's gameplay is slightly broken but it shows the concept so oh well

Last edited by Jonathan50 (Aug. 31, 2023 03:08:50)

Powered by DjangoBB