Discuss Scratch
- Discussion Forums
- » Advanced Topics
- » RISC-V subset emulator (with Scheme interpreter)
- 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:
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
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)
(#2)Very cool! I love S-expression based languages, especially Lisp and Scheme.
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))
- 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…
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…)
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:
and the program that states the time:
G4QQAAATAEAYB3YAQAKDOEYAAAJQGA4AOMQEGMAXAMAAAEYDAMGHGECTGBZWABBQ54AIAOTTAAIAAEYBAH7SGJQRAAJQGBIAANCQGADDBQCQAIZEMEAO6ACAFQBSHAIACMBRGADP6CP75AZAYEABGAIBAFTYAAAACMAQD7ZDEYIQAEYDAUAGGXADAAJQLUACEMSGCAHPAAACSAZDQEADGA3AICJQHIAACMHBAAFTR3BQGY2G2MARHDQOABX7AX77WNHMGAZT4V7AEEYFAUBSGJDBAARSFQIB54AIAJIDFZAQAAZDQEAJGA5AAAZU47QC4NGMB7MDEDAQAEYBAEAWPAAAAAJQCAP7EMTGCABDERYQA4ZDEA2LOAYAQCZXG4YAMOEAGAVXAMAIBE4DWMAGGHTTAC3QGIAMSOBUGAADUMBQAI5AMMAAGI6BACBSHAIACMAQCALTAAQDAEYFYAZ674G76AJQLABUOMRSANATCMRQAMYFMUAAGJIFADX7AX7POMSTANHP6AP7E4YAKAIG74G7763QOAAQCMDRAAFDQDTQBNYHAAGBGBYQAAR2JZYCW4TQADATA4AEAI5A44ALOBZABQR2ABYAM6AAAAFXA4ABBA6HK4ADOBYACCJ7OFYAMONAOADTABIBBA2HK4AJH5YXADRYUB76G4DQAEEDI4DQBEYG2AAJH57XB4JYKBYAMOENOABXA4ABAIYA64AGPAAAAARQB5YASMD2AABXA4ABAEYFUAACGAHXABTYAAAACMAQD7ZDEKIQAIZEQEACGIBBAERSMEIACMCAAAETAQAF6EYJUAAG6AGAACRQ7J76COCAOAHP6BP7PEYHCQADHB7UADRRMJP7GOCIIABDAASACIYAA4AIGIGBAABSJAIAEMUAA3UDERAQAAZJAEABGAIBAFTYAAAACMAQD7ZDEKIQBAZHABXSGJEBAAJQIAC7EMTBCAFTQ6DQAA6FA4AGGDAFACBSBQIAAMSICAEDERAQAEYBAEAWPAAAADX7AX7WQMTQA34DEDAQBAZEIEADHBEHAABUKBAAAMSICAATAEAQCZ4AAAABGAIB74RSFEIAQMTQA3ZDESAQAEYEABPSGJQRAAZYPBYAANCQOADDAACQFAZAYEAAGJEBACJYOFYAEMUPA3UDERAQAEYBAEAWPAAAADX7AH7QQMTQA34DEDAQAM4EQ4AAGRIEAABSJAIASODROABDFDYG5AZEIEABGAIBAFTYAAAASMD2AADDDD2QBNYHAAIBGB6QAARYBZYACN27KD5XA4ABAI4AU4AGPAAAAAJQKBP5CM22KADHQAAAARLYMNSXA5DJN5XDUIAAAAAAAADIAMAABAYDAAAJSAYAAAAAAAAAUYBQAAAAAAAABOQDAAAGS3TTORZHKY3UNFXW4IDBMNRWK43TEBTGC5LMOQ5CAADJNRWGKZ3BNQQGS3TTORZHKY3UNFXW4ORAABRHEZLBNNYG62LOOQ5CAADMN5QWIIDBMNRWK43TEBTGC5LMOQ5CAADTORXXEZJAMFRWGZLTOMQGMYLVNR2DUIAAAAJQCAPVG4CQAABDESAQSEYFAVPDODAAIARSFEIKEMQCCCZDFBQQSIZGOEESGJQRBIRSJAIKEMXDCCJDFRAQSIZKKEERGCIAADX7AX6CSMFYCAETASIAAEYLAABRGDH477X7AH7ISMFAAAETA4C73EYJWABBGCWQAJR7J5AEMMEDKCLDDZCQX37QD7TJGBYF7VR7Z5AGCMD6T7YTBH477EYGAEEBGFZHAAJRMKIAGOD6MABTQ3DAAAZGQ34IGJUH7CZYNRSAEMSNP6HD4D2PYEYHAAABGFBHAAZQJZAACMKBIABTASSAB37QD7QZGBYF7UJQOBH54PZPJ7TDQQFAAMYHRNAJGFRJAAJQMAIIWMDNMABDUTTPQEYJDEAG74E766JQUEAAN7YB754TA7U76EYJ7H7RGBYBBCJZOJYASMLCSAFTA73QBMYG24AIHJUG7AB2PB7YGMD5OABDUTT7Q37Q37ZJGB5AAJRQV5IESMD7AATDB32QNEYHEACWGAXVBKJQPIAA4MLPL4HDKQQPCMYEREARGFBEAAZYJCYAN4AIAAATQQDQAAZFAQAO74A7WMJQLIAA57YB7XMTA7CP7Y4URP7BGCIAABX7AX7NSMD6T7YTBH476EYHAEEJHFZHACJRMKIAWMD7OAFTA3LQBA5GQ34AHJ4H7AZQPVYCEOSOP6DP6BP6VEYH5H7RGCPZ74JQOAIISOLSOAETCYUQBMYH64ALGBWXACB2NBXYAOTYP6BTI7LQEI5E474G74C746JQP2P7CME7T7YTA4AQRE4XE4AJGFRJACZQP5YAWMDNOAEDU2DPQA5HQ74DGZ6XAIR2JZ7YN7YF7ZCSKBHCAY3BNRRXK3DBORXXECQA
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.
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
)
G4YQAAHPADACQNYTAAABGAYDQBZSAQZQC4BQAAATANBQ64YQKMYHGYAEGDXQAUC6OMABAAATAEA76IZGCEABGAYFAABUKAYAMMGAKABDERQQB3YAIBEAGI4BAAJQGEYAN7YJ77UDEDAQAEYBAEAWPAAAAAJQCAP7EMTBCAATAMCQAY24AMABGBOQAIRSIYIA54AAARIDEOAQAMYDMBAJGA5AAAJQ4EAAWOHMGA3DI3JQCE4OBYAG74C776ZU5QYDGPSX4AQTAUCQGIZEMEACGIWBAHXQBACBAMXECAADEOAQBEYDUAADGTT6ALRUZQH5QMQMCAATAEAQCZ4AAAAJGAQABBZ2AQRQM6AAAAFXCIAABE4CGLQCHIFSAC3QEAABAORQEABTAORQBNYCAAAZHAUCAAR2AYQAM6AAAABDEKA7UEYEAEABGAIB7ARSIFHYEMUDJ6BDFJCPQIZMKT4CGLTE7ARSA5H2EMSJJ6RDE2SPUIZIWT5CGKWE7IRSZVH2EMXOJ6RDED2PYIZCAT6SGJAU7URSMJH5EMUDJ7JDFJCP2IZMKT6SGLTE7URSA5H7EMRIJ7ZDESKP6IZGUT7SGKFU74RSVRH7EMWNJ7ZDF3SP6IZA6QAXGIZAGS3QGAEAWNZXGADDQIBQJNYDACAJHA5TABRQQ4YAW4BQBAETQNZQAYYMOMALOAZABSJYGQYAAORQGABDUBRQA3YAAACZOEQAACJYF4WDQORAEAHHQABAA3YAYABROFIAAAJQLBNZ57YN7ZAXCUAAAEYFQW4XGIZAGQJRGIYAGMCWKAADEUCQB37QD7RXGJJQGTX7BX7FOMAFAEDP6DP77AZAQT4IGIIE7EBSERHZQMRIJ6IDEPCPTAZDAT5IGJEE7IBSLRH2QMSQJ6YDEZCPXAZGQT5QGJ6E7OBSOBH4AMUEJ7EDFCCPYAZJYT6IGKIE7UBSURH5QMVIJ7IDFPCP3AZLAT7AGLCE72BSZBH6AMW4J7UDFUCP6AZOIT7YGLUE74BS7RH7QMXQIAADERCPUEYBAEEHGABAGC3QOAAQCMDRAAFDQDTQBNYHAAGBGBYQAAR2JZYCW4TQADATA4AEAI5A44ALOBZABQR2ABYAM6AAAAFXCUAAAEYGAAAJHBOF6E3RKAAAG4DQAEETBDIAAEYIUAAG6AEAABZQAUAQQNDVOAET64LQBY4KA77IGRYHACBSMBPRSP37OD3DQYDAAY4AC4BSGAHXACJQMFQAMOBAOAZTQ3KQBIYP637BHBQGABX7BH74EMABOAMTA6QAAIYA64AJGBQWACJQPIAAGODMKABDAD3ABM4G2UALOFYAAARYABQAEOXAOADHQAAABNYXAAAIHJ2H6FRYIBYGCMAQD7ZDEKIQBNYUAAAIHJ6EAERSJAIAG4KAAAATATCPCIZGCEALHB4HAAB4KBYAMMGAKAEDEDAQAAZEQEAIGJCBAAJQCAIBM6AAAAHP6BP7FA5HYQAYGIGBACBSIQIAGOCIOAADIUCAAAZEQEABGAIBAFTYAAAACMC7B73HQAAABNYXAAAIHJ2H6FRZ4BYEW4DQAEEDY5LQANYHAAIJH5YXABRZUBYAOMAFAEEDI5LQBE7XC4AOHCQH7Y3QOAAQQNDQOAFXCYAABA5GA3YZH57XB4JYKBYAMOGAMAETA3IAAY4O24BDOBYACARQB5YAM6AAAADHQAAAAEYBAH7SGJQRADX7BX7RG4LQAAEDE7DQDAZAYEAJHBYXAARS55YACMAQCALHQAAAAIYA64ABGBNAACJQPIAAN7YN765XA4ABBA6HK4ADOBYACCJ7OFYAMONAOADTABIBBA2HK4AJH5YXADRYUB76G4DQAEEDI4DQBNYWAAAIHJQG6GJ7P5YPCOCQOADDSQDAAZ4AAAAJGBWQABRZRVYAEMAPOAATAWQABEYHUAADOBYACARQB5YAM6AAAAETA6QAAYYY6UALOBYACAJQPUAAEOAOOAATOX2Q7NYHAAICHAFHABTYAAAACMAQD7RDFSAQAIZKSEACGKBBAERSMMIBEMSECAJDEJIQCIZOCEALOGQAAAJQJMABSMCCABATBIYAJEYJIACBGCIQATX7AX7K4MPIL7XP6DP6T37QT7UWGDUVAJR5BJACMMCEKBPDCI277A5HZJERGBYA4AR2RZYAEOVAOADP6AP73YYWEX6YHJ6KJEJQOAHQEOUAOABDVLTQA37QT75YHJ6KJEJQOAAQEOUAOABDVLTQA37QL75IHJ6KJEJQOABAEOUOOABDVIDQA37QD74TOFIAAAJQCAP6CMC4L2JDFSAQAIZOCEACGKURAARSQIIBEMTDCAJDERAQCIZCKEARGBDQAPX7BH5GCMCPJ7YTAUAAF37QT7X6GGQE7Y3RKAAACMCYL2XP6DP2JEYEEAALOGIAAAJQS4ADCMFAAAMTBIIAAA5EJFFGGGAEABXQBQAMAMSIIATDAICAZAZHAQAOHGUX72BSNRABAMTUIAET273ADM4H24AJHVYXICZQP52A4OOFP7IDEWCAD37QT6PYGJ6EAGJYP577WOFPUAETRINABY2YLH5ZHBAUAAJQLIAA57YF7Z7DTZCPSNYVAAABGBIF5PX7BH44W4LQAAADUWDUUEYEAABO74G7TY3RKAAACMCUL3HP6DPZVNYXAAAAHJIHJLX7AX45CMCPJ7YTAUAAF37QD7R6GGQE7YBSJAIBQMQMCAMDERAQCAZJAEAYGKOBAABSVAIAQMVECABXCUAAAEYFIXWRGAIBAJX7AX4WCMCQAAXP6CP5637QD73TOGAAACBSPCHRG4DRAAETAX376E4XE4ADGB7XAAJQOFYASNL7OQMT23DQBMYH24ALH55XACZYPV2ASOLCOAFTQ33ABE4GCYABHVXWIEJVNRQAGOD4MABTO63QBEYG4AADGB6HICZ6PVYCSMDHAAZDFTUPAM3H24BJHBZHACJZNBYAEMQPKABDE3KQAEYHC4AJGF4HAARSFZIAEMSPKADHQAAAANYYAAAIGJ4IJFRYEBYGQOUIOARDFQMESY4EBAACHIQIAK3RQAAAAOUEQSQTT2CQAEYTQUACHIFHAAR2FNYAEOSMOAJDUZTQAI5IA4ACHKQHAAR2ZRYAEOXNOABDUDTQEI5CA4BCHJAHANRQICAAEMRPQARDUL4EUE4FA4AGPAAAAC3RQAAAAOUAQS4TA7AAFMYH7ABBGCAYAAR2QCCLG4MAAAATBAEAFM4HA4AW74G77AJQCAP7QMSUKABDESAQAEYEAUAAGJIFAA3RMAAACMDSAAETAYIAAEYGQ3XSGJQRADX7AX7UW4LQAAEDU7DUSAZGQQAAGJ6EAAB2QRYAQOSQOAETA3IAAEYYRAAJHFMFAAZQRSCAWOC6KQBTAYEAHEYHUAADHB5VAIZQNZQAGND7MAUTQ33P6MYH64AJGV7XAGZYPZYASPLROQHDSQDP4EYYVAAJHFMVAAZUR6ACQMQMCAADESAQBM6H6UBCGKAFAERSV5IACMAQCALHQAAAAEYBAH6CGKURAK3RIAAAQOTUISZDFYIQEIZMQEBJHBYXAARSQIIDEMTDCAZDERAQGIZCKEBSGIDBAMRS44IBEMWICAJDFKIQCIZIUEASGJVRAEJQOAAGEOVPISTDR3TSQNY5AAAAGJCNJI3RSAAAMMBAIDFXBEIAANY4AAABGCQQACJQYYAAW4NQAAFXDUAAANY3AAAJHCPZ76BSOBACQMVIIATDQBDRXAZFQQAIGJQEAEBSLRAAQMTUIAIDE3GESMYH6UAJGV7XIGJ7P5YPWOD6OAET26DUAE4I477RGBOQABRWYBILAMUMIANTQXKQBE6W6VARGVPYAGJ7N5QPGMCQKANTQ23ABE6WQZABGVIVIAZYRJSAMNLAACJTAXKQAEYIOABWGQFIBARSJNAAEMTOIABDED2AAIZC2QAGGCGEAABSOBAAQMTQMADDA33QUE4EBIAOHEQK63X7BH55QMTYSSTDL3YBQAZEQEBYGIGBAOBSIQIDAMUQCA4DFHAQEAZKQEBIGKSBAIBSWAICQMV4CAIDFSAQDAZMIEAQGLIBAGBS3QIAW4KQAAETQUCYUEYFQAGBGAIBARX7AD7NAMTQIAUTA4QABYYW674IHJYLJKBSMTKKAMTUIAUTQ4LQAI5A7NFIGJ4EAJRQ5VAQMMDAOABDET3QFAZHQQBIHJUNJER2FZYCEMRAIARDETKAEI5MRVEG74G76SBSORAAQMTEMAATA4QABM4H25AJHBYXADRWF57UQMTISSUDE4CAFE4G637WHBSHDMBSMTKKEMSNSSQDE5CAFAZHQQBGGAWEBRRQMBYAEMSPOAUDE6CAFA5GRVESHIXHAIRSEBACEMSNIAQTAVYAAI5MRVEO74E7UBX7AX7PQOTUIS5T46LQGY4GA4FAGJWMJGBSLBAAAMS4IAADENDAAAZHAYAJGBWQAAJRHAYACMLYOABTAOZUAMYIU5ALGCDDAKJQPIAAGMDQQA5TRDUAAM6H7ABJHBXW76ZQP5YACPL7OANTA73QBE6XC5AOHFAG72JRMEYACMLRQAFTQZTAAMYHA4AZHFTWAAJROZYAWPDPMAVTI73QEIZI2QACGKXUABX7AH67EMRP2STP6AP66IZC7VFG74E76Q3RKAAACMCUL4HP6AH4Y4YAKAIHGACQCBX7BH77CMCQIAHP6BP4O37QD72TOFQAAAJQOEAASMDDAAATA2DO5EYFCAABGBIQADX7AH54W4KQAAEDU2C7CNYHCAABGBXX76JZOJQAWOD5OAETQ4LQAE6X65ARGV6HACZYPZYAWP34OAFTQ7TUAE4XE4ADGB7XAAJQOFYASNLPOQMT23DAAMYH24ADG56HAAZQPV2ASMDOAAFT47LQFEYGOABSHLHF6AR2UBCKGNT5OAUTQ4TQBE4WQ4ACGIHVAARSNVIASMDROAATS6DQAIZC6UACGJHFABX7AX6MAMTYX4ITAVYABEYXE4ALHB7HACJYOFYACPL7OQITK7DQBM4H44ALH5ZXAGZYPZ2ACOLSOABTA73QAEYHC4ABGVXXIEJVNRQAGMD4OABTO43QCMYHY5ABGBXAACZ6PRYCCMDHAAZDFTV7AM3HY4BJHBZHAAJZNBYAEMQPIABDE3CAAIZE3FFJGBYXAAJZPBYAEMRPIABDETSAB37QT6AW74C72C3RMAAAAOTEMSQDE5CQFAZHQUBGGBVGAJRQMBYAEMSPOAUDE6CQFNYWAAAAHJUGJER2FZYCEMRAKARDETCQEI5MUZEGPAAAAAR2F5SKN7YB77VXCYAAAA5FQ3YZGFZFACZYPJYASODROAAT2X3UCE2XYUADHBPHAC3QOEAASOD7P7ZTOX2QAMYF4VACHLFG6BTYAAAASMDNAAETA6QAAM2H6UBJHBXW74ZQP5YASNL7OANTQ7TQBE6XC5AOHFAG7YJYKBYAM6AAAAETK72UCM6FU4ADGBPVIBTYAAAAIV4GGZLQORUW63R2EAAAAAAAACOA2AAAW4GQAAGNBUAAAAAAAAANUDIAAAAAAAAA5YGQAADJNZZXI4TVMN2GS33OEBQWGY3FONZSAZTBOVWHIORAABUWY3DFM5QWYIDJNZZXI4TVMN2GS33OHIQAAYTSMVQWW4DPNFXHIORAABWG6YLEEBQWGY3FONZSAZTBOVWHIORAABZXI33SMUQGCY3DMVZXGIDGMF2WY5B2EAAAAAAAAAALOFYAAAR2UB7QW4LQAABDVAD7BNYXAAABGCCAAER2EB2KG4LAAAFXC4AAAEYBAH7SHJAHJMJQOAAAW4LQAAETAYYAAEYGQ3WZGBKQAAJQKUAAEMTBCABDUADUV37Q36ILOFYAAA3RMAAACMDRAAETAYYAAEYGQ3XCHLVHJCJQLAACCMC2AAHP6CPY5NYXAAALOFIAAAR2NJ2KSOCQLCQTAWAAZ37QB6S674APUTX7AT7FDNNTESQ3LM2DO3IAAAABWW3NBIAAAAAADNNTGMB3GQ3W2SDFMFWHI2B2EAAAAAAAEAQFGY3POJSTUIBAEAQAAAAAAANVW3IADNNTGMB3GQZW2ORNFENVW3IAAANVWMZQHM2DC3J6HJ6BWW3NAAABWWZTG5WSUG23NUAAAAAKI5QW2ZJAN53GK4QKAAAQAAAAAEAAAABA3OGAA===
(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 
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.
)
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.)
)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?
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)
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)Edit: If it's got to be hacky anyway might just as well use 49 bits
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

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)
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)
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)
- Discussion Forums
- » Advanced Topics
-
» RISC-V subset emulator (with Scheme interpreter)