Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bin
 
 
 
 
lib
 
 
 
 
 
 

README.mkd

ShogiModan

A Ruby implementation of the programming language ModanShogi.

Usage

execute a program: ./bin/shogimodan example.hello.modan

convert the program to LLVM assembly: ./bin/shogimodan example.hello.modan -l

execute a program through LLVM (super fast!): ./bin/shogimodan example.hello.modan -l | llvm-as | lli

Programming Language ModanShogi

ModanShogi is a so-called esoteric programming language.

This is a Hello World program written in ModanShogi:

▲9八銀 △9二玉 ▲6四歩 △6六銀 ▲6一歩 △同 玉 ▲6七歩 △6一玉
▲6八玉 △6三歩 ▲6九玉 △7七銀 ▲7五金 △7一玉 ▲4八銀 △4二玉
▲9六と △9八歩 ▲同 玉 △6七玉 ▲9五金 △9一玉 ▲6三金 △同 玉
▲6八金 △6二玉 ▲4一歩 △4三玉 ▲5五歩 △5三玉

Syntax

[PLAYER][COL][ROW][PIECE] or labels (*1, *2, ...)

PLAYER: "▲" or "△"

COL: one of "1", "2", "3", "4", "5", "6", "7", "8", "9"

ROW: one of "一", "二", "三", "四", "五", "六", "七", "八", "九"

(exception: if COL and ROW are just same as the ones of the previous command, COL may be "同" and ROW may be " " (full-width space).)

PIECE: one of "と", "歩", "金", "銀", "桂", "香", "龍", "馬", "玉", "王", "飛", "角"

labels: specifies the place to jump by :jump_if, :jump_ifp

Semantics

The ModanShogi VM has nine registers, R1 to R9, and a stack. The registers are initialized with numbers 1 to 9.

PIECE means the type of the command.

  "と" => :mov X Y  (register X =  register Y)
  "歩" => :add X Y  (register X += register Y)
  "金" => :sub X Y  (register X -= register Y)
  "銀" => :mul X Y  (register X *= register Y)
  "桂" => :div X Y  (register X /= register Y; result is Float)
  "香" => :mod X Y  (register X %= register Y)
  "龍" => :push X,  (push the value of register X to the stack)
  "馬" => :pop X,   (pops from the stack and stores to register X)
  "玉" => :putc X,  (print the character whose charcode is
                     the value of register X)
  "王" => :putn X,  (print the value of the register X)
  "飛" => :jump_if X Y,  (if the value of the register X is not 0,
                          jump to the label whose number is
                          the value of the register Y)
  "角" => :jump_ifp X Y, (if the value of the register X >= 0,
                          jump to the label whose number is
                          the value of the register Y)

COL and ROW are arguments of the command. They denotes a number from 1 to 9.

PLAYER is just ignored.

About

Ruby implementation of the programming language ModanShogi (LLVM support thanks by ujihisa and nanki)

Resources

Releases

No releases published

Packages

No packages published

Languages

You can’t perform that action at this time.