ç§ã¯æ°å¹Žéããåœã®ãšãã¥ã¬ãŒã¿ãŒããã€ãŸããååšããªãã£ãã³ã³ãã¥ãŒã¿ãŒçšã«JavaScriptã§èšè¿°ããããšãã¥ã¬ãŒã¿ãŒãäœæããïŒãããŠå®éã«ç ç©¶ããïŒãšããå人çãªãããžã§ã¯ãã«åãçµãã§ããŸããããã®ãã·ã³ã¯ã1980幎代ãš90幎代ã®8ããããš16ãããã®ã³ã³ãã¥ãŒã¿ãŒã®ã¡ã¢ãªãžã®ãªããŒãžã¥ã§ãããšèããããŠããŸããã
ããããç§ã¯ãã®è€éãã倧奜ãã§ãããã®ãã·ã³ãæ°ããäžé£ã®åœä»€ã䜿çšããŠããŸãããããã¯ãã®æä»£ã«äœ¿çšããããããã«äŒŒãŠããŸãããæäœãå°ãç°¡åã§ããRetroputerãèªçããŸãããäœå¹Žã«ãããã£ãŠããšãã¥ã¬ãŒã¿ãŒã¯æ¡åŒµããã³æ¹åãããŠããŸããããããããã宿ãããããšã¯ãããŸããïŒçµå±ã®ãšãããããã¯å人çãªç ç©¶ãããžã§ã¯ãã§ãïŒã@bbcmicrobot
ãç»å ŽãããšããRetroputerã«äŒŒããã®ãäœãããã£ããç§ã®JSéçºã¹ãã«ã¯äž»ã«ããã³ããšã³ãã«éå®ãããŠããã®ã§ãããã¯ããã¯ãšã³ãã®çµéšãç©ãããã®çŽ æŽãããèšãèš³ã«ãªããŸããåé¡ã¯1ã€ã ãã§ããRetroputerã¯ç¬èªã®ã¢ã»ã³ããªèšèªããçè§£ã§ããŸããããŸã BASICããµããŒãããŠããŸããã
ããã§ç§ã¯ã80幎代ã®ã¹ã¿ã€ã«ã§ãã€ãŸãå®å šã«ã¢ã»ã³ããªèšèªã§BASICã€ã³ã¿ãŒããªã¿ãŒãäœæããããšãæãã€ããŸãããéåžžã®æœè±¡åããé ãé¢ããé åã«é£ã³èŸŒãå¿ èŠããªãããšãå€ãã®ã§ãèªåã®ä»äºãå ±æãã䟡å€ããããšå€æããŸãããç§ã®æ¥åžžã®ããŒã«ïŒJavaScriptïŒã¯ãå€ãã®åŽé¢ãäºçްãªãã®ã«ããæã«ã¯éæ³ã®ããã«ããæããŸããæãäœãã¬ãã«ã®ããã»ã¹ãçè§£ããããšã¯ããããã®æœè±¡åãçè§£ããã®ã«åœ¹ç«ã€ããšããããããŸãã
ããã§ã¯å§ããŸãããã
Retroputerã®ç¹æ§
- 16 ROM (KERNEL) c 1 (scratch space)
- 512 , 64
- 16- 6516, 512 4 64
- 4025, ,
- 1125
- 9800
Retroputerã®ã¢ã»ã³ãã©ãŒãæžããŠãããšããéåžžã«äŸ¿å©ãªPegjsããŒã«ã䜿çšã§ããŸãããé«éãªãã€ãã£ãã¢ã»ã³ãã©æ§æãæäŸããŸããããæ®å¿µãªãããRetroputerASMã«ã¯ãã®ãããªãã®ã¯ãããŸãããã€ãŸããç§ãã¡ã¯å°é£ãªéãæ©ãŸãªããã°ãªããŸããã
è§£æèªäœã¯ããã€ãã®æ®µéã§å®è¡ãããŸããã³ã³ãã€ã©ã䜿çšããèšèªã¯ãã³ãŒããè§£æããŠæœè±¡æ§æããªãŒïŒASTïŒïŒãŸãã¯ä»ã®è¡šçŸïŒã«ãããã®ããªãŒã䜿çšããŠå®æãããã€ãã£ãã³ãŒããçæã§ããŸãããããã£ãŠãã³ã³ãã€ã«ãæåãããã«ã¯ãããã°ã©ã ãæ§æçã«æ£ããå¿ èŠããããŸãã
äžéšã®ææ°ã®ã€ã³ã¿ãŒããªã¿ãŒã«ããã®æŠå¿µããããŸããããã¯ããœãŒã¹ã³ãŒãã§ã¯ãªããäžéASTãçæããŠå®è¡ãããšäŸ¿å©ãªå Žåãå€ãããã§ãã
ãã ãããªãœãŒã¹ãéãããŠãããã·ã³äžã®BASICã€ã³ã¿ãŒããªã¿ãŒã®å Žåãããã€ãã®æ®µéã§è§£æããã®ãæãå¹ççã§ããããã®äžéšã¯å®è¡æã«çºçããŸãããã ããããã¯ãããã°ã©ã ãå®è¡ããŠãšã©ãŒã®ããã³ãŒãã®é åã«ç§»åãããŸã§ãæ§æãšã©ãŒãæ€åºã§ããªãããšãæå³ããŸãã
Retroputer BASICè§£æã¯ã次ã®3ã€ã®æ®µéã§æ§æãããŸãã
- æååã®å€æ
- ããŒã¯ã³å
- ã©ã³ã¿ã€ã æ§æãã§ãã¯
æåã®2ã€ã®æ®µéã¯ããŠãŒã¶ãŒãããã°ã©ã ã«å ¥ãïŒãŸãã¯ããã°ã©ã ãããŠã³ããŒãããïŒãšãã«çºçããŸããåŸè ã¯ãããã°ã©ã ã®å®è¡äžã«çºçããŸããåºæ¬çã«ãæåã®2ã€ã¯èªç©ºæ©ã®èŽäœãäœæããŸãããé¢éžããããšãä¿èšŒãããã®ã§ã¯ãããŸãããæåŸã®ã¬ã°ã¯ãã¹ããã€ãããã§ã-圌ãé¢éžããããšãé¡ã£ãŠããŸããã圌ã詊ã¿ããŸã§ããã«ã€ããŠã¯ããããŸããã
æ³šïŒ Retroputer BASICãœãŒã¹ã³ãŒãïŒéçºäžïŒã¯GitHubã§å ¥æã§ããŸãã
æååã®å€æ
ããã¯ãããã»ã¹å šäœã®äžã§æãåçŽãªéšåã§ãããŠãŒã¶ãŒãå ¥åããæååã¯å€§æåã«å€æãããåŸç¶ã®ããã»ã¹ãç°¡çŽ åïŒããã³é«éåïŒãããŸããBASICã¯å€§æåãšå°æåãåºå¥ããªãããããããå©çšã§ããŸãã
<pre>print 2+2
' becomes:
PRINT 2+2</pre>
JavaScriptã§ãããè¡ãã®ã¯ãšãŠãç°¡åã§ãããïŒ
theLine = theLine.toUpperCase();
ããããã¢ã»ã³ããªèšèªã§ã¯ããã®ããã»ã¹ã¯ãã詳现ã§ããæåãèªã¿ã倧æåã«å€æããŠãã©ããã«ä¿åããå¿ èŠããããŸãã
ld y, 0 # y is our index
_loop: ld al, [d, x, y] # [d,x] is pointer to string
cmp al, 97 # is al (char) in range?
brs n _continue # Not a lowercase char; continue
cmp al, 123 # high portion
brs !n _continue # not a lowercase char; continue
and al, 0b1101_1111 # uppercase!
st [d, x, y], al # store back (we modify the original)
_continue: inc y # move our index along
cmp al, 0 # check for NULL
brs !z _loop # No? Go back for more.
äžèšã®ã³ãŒãã¯ãJavaScriptããŒãžã§ã³ã®ã³ãŒãã®ã»ãã³ãã£ã¯ã¹ãšå®å šã«ã¯äžèŽããŠããŸãããéèŠãªéãã¯ã仿¥ã§ã¯Unicodeã䜿çšããŠããã¹ããåŠçããŠãããããå ¥åãå°æåãã倧æåã«å€æããã®ãé£ããå Žåãå€ããäžå¯èœãªå ŽåããããŸãïŒèšèªã«ãã£ãŠç°ãªããŸãïŒã Retroputerã¯ASCIIã®äžçïŒããæ£ç¢ºã«ã¯ãRetSCIIãšåŒã°ããç¬èªã®ASCIIããªãšãŒã·ã§ã³ã®äžçïŒã«ååšããŸããã€ãŸãããµããŒããããŠãããã¹ãŠã®æåã¯8ãããã§ãšã³ã³ãŒããããŸããå€ãã®èšèªã«ãšã£ãŠãããã¯å®å šã«äžååã§ãããããã¯åœæã®çŸå®ãæºãããŠããŸãã
ããã¯ãããããASCIIæ©èœã䜿çšããŠå°æåãã倧æåã«å€æã§ããããšãæå³ããŸãã倧æåã®ãAãã¯ASCIIã³ãŒã
65ã§è¡šãããå°æåã®ãaãã¯ã³ãŒãã§è¡šãããŸãã97..ã 2ã®çޝä¹ã«ç²ŸéããŠããå Žåã¯ããã®éãã«æ°ä»ããã¯ãã§ãã
ãããã£ãŠãå°æåã¯å°æåã®æ°ãããæ£ç¢ºã«32å€ãæ°ã§æå®ãããŠããããšãããããŸããå€ãæ£ããç¯å²ã«ããããšãããã£ãŠããå Žåã¯ã32ãåŒãã ãã§æžã¿ãŸãã
ãã®ã¢ãããŒãã¯æ©èœããŸãããããããå°ã倿Žããã ãã§ãã Retroputerã®å Žåãããã¯æžç®ãããé«éã§ã¯ãããŸããããæžç®ããªãå Žåã¯ãèšç®äžã«ãã£ãªãŒ/ãããŒãã©ã°ã«æ³šæãæãå¿ èŠã¯ãããŸããã
and32å€ã®ä»£ããã«ãããã¯ã€ãºã䜿çšããŠãããããªãã«ã§ããããšãããããŸããã
and al, 0b1101_1111 # turn off bit in 32-place
# versus
clr c # clear carry
sub al, 32 # subtract 32
ãã ãã埮åŠãªç¹ã1ã€ãããŸãããã¹ãŠã倧æåã«å€æã§ããããã§ã¯ãããŸãããããšãã°ããŠãŒã¶ãŒãæååãªãã©ã«ã远å ããå ŽåãRetroputer BASICãåžžã«å€§æåã§ãŠãŒã¶ãŒã«æé³Žããããªãã®ã§ããã£ãšæ³šæããå¿ èŠããããŸããïŒåœæã®å€ãã®ã³ã³ãã¥ãŒã¿ãŒã«ã¯å°æåããããŸããã§ããããRetroputerã«ã¯ãããŸããã§ãããïŒ
äŸïŒ
print "Hello, World!"
' should become:
PRINT "Hello, World!"
' and not
PRINT "HELLO, WORLD!"
ããã¯ãæååãªãã©ã«ã®éäžã«ãããã©ããã远跡ããå¿ èŠãããããšãæå³ããŸããBASICã§ã¯ãããã«å¯Ÿããæå®ã¯2ã€ã ãã§ããäºéåŒçšç¬Šã§ããæåãäºéåŒçšç¬Šã®å Žåããã©ã°ãèšå®ãããã©ã°ã®å€ã«å¿ããŠå€§æåã«å€æãããããã®ãŸãŸã«ããŠããããšãã§ããŸãã
JavaScriptã«ã¯ãã®ããã®çµã¿èŸŒã¿æ©èœããªãããšãããããŸããããèªåã§äœæããããšã¯ã§ããŸãã
const len = theLine.length;
let insideString = false;
for (let i = 0; i < len; i++) {
const ch = theLine[i];
if (ch === `"`) insideString = !insideString;
if (!insideString) {
const newCh = ch.toUpperCase();
if (ch !== newCh) theLine[i] = newCh;
}
}
JSã®UnicodeãµããŒããå°ãå©çšããŸãããJSã®ããžãã¯ã¯ã¢ã»ã³ãã©ãŒã®ããŒãžã§ã³ãšããå³å¯ã«äžèŽããããã«ãªããŸããã
ã¢ã»ã³ãã©ã®ããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
ld y, 0 # y is our index
ld bl, 0 # === insideString (false)
_loop: ld al, [d, x, y] # [d,x] is pointer to string
cmp al, 34 # is al a double quote?
brs !z check_char # no? should we uppercase it?
xor bl, 0xFF # yes? toggle insideString
_check_char:
cmp bl, 0xFF # inside a string?
brs z _continue # yes? don't modify it
cmp al, 97 # is al (char) in range? "a"
brs n _continue # Not a lowercase char; continue
cmp al, 123 # high portion "z"
brs !n _continue # not a lowercase char; continue
and al, 0b1101_1111 # uppercase!
st [d, x, y], al # store back (we modify the original)
_continue: inc y # move our index along
cmp al, 0 # check for NULL
brs !z _loop # No? Go back for more.
ãããŸã§ã®ãšãããå ¥åããã¹ãã®å€§æåãžã®å€æã®ã¿ãè¡ã£ãŠããŸããããå¥ã®å¯èœæ§ãšããŠæååãªãã©ã«ã®å®çŸ©ã䜿çšã§ããŸãããã1ã€ã®æ§æãã§ãã¯ãå®è¡ã§ããŸãïŒ
ããã»ã¹ã®æåŸã«
inStringãŸã çïŒbl = 0xFFïŒãäœã§ããããããã£ãå Žåããšã©ãŒãè¿ãå¯èœæ§ããããŸããããã¯ãæååã®ã©ããã«äžå®å
šãªæååãªãã©ã«ãããããšãæå³ããŸãã
æ³šïŒ BASICã®å€ãã®ããŒãžã§ã³ã¯ãæååã«éãåŒçšç¬Šããªãããšã«å¯ŸããŠããªãå¯å€§ã§ããããšãããããŸãããç§ã¯èªåã®éèš³ãäœæããŠãããšãã«ãããèŠã€ããŸãããããšãããã ãšããŠããããã¯ç§ã«ã¯æ£ãããªãããã«æãããã®ã§ãRetroputerBASICã¯ãããèš±å¯ããŸããã
ããŒã¯ã³å
è§£æã®æ¬¡ã®ã¹ãããã¯ãå ¥åæååãRetroputerBASICã€ã³ã¿ãŒããªã¿ãŒãå®è¡ããããã®ããå¹ççãªãã®ã«å€æããããšã§ããæœè±¡æ§æããªãŒã®æŠå¿µã«ã§ããã ãè¿ã¥ããããšããŠããŸãããçµæã¯ãŸã ããªãŒã§ã¯ãããŸãããããããããã¯å®è¡æã«è¿ éã«åŠçã§ãããã®ã«ãªããŸãã
åæã®ãã€ã¯ãã³ã³ãã¥ãŒã¿ã®å ±éã®ç¹åŸŽã¯ãéåžžã«éãããã¡ã¢ãªã§ããã Retroputerã¯ãåœæã®ã»ãšãã©ã®æšæºçãªãã·ã³ãããå€ãã®ã¡ã¢ãªãåããŠããŸãããããã§ãææ°ã®ã³ã³ãã¥ãŒã¿ãããã¯ããã«å°ãªãã§ãããããã£ãŠãé·ãBASICããã°ã©ã ã¯ããŠãŒã¶ãŒå ¥åäžã«ä¿åãããšãã¡ã¢ãªã倧éã«æ¶è²»ããå¯èœæ§ããããŸãã
ã¹ããŒã¹ãç¯çŽããããã«ãããŒã¯ãŒãã¯ããã°ã©ã ãã¡ã¢ãªã«å ¥åããããšãã«ããŒã¯ã³åãããŸã..ããã®ããã»ã¹ã¯ãããŒã¯ãŒããã·ã³ã°ã«ãã€ãããŒã¯ã³ã«å€æããŸããããŒã¯ãŒãã¯åžžã«å°ãªããšã2ãã€ãã®é·ãã§ãããããå ¥åããã«ã€ããŠããã«ç¯çŽã§ããŸãããŸããå®è¡æã«ã«ãã¯ã¢ããããŒãã«ã䜿çšããŠãé©åãªã¢ã»ã³ããªèšèªã«ãŒãã³ãåŒã³åºãããšãã§ããããšãæå³ããŸãã
ãã ããRetroputer BASICã¯ãåœæã®ã»ãšãã©ã®BASICããŒãžã§ã³ãããå°ãé²ãã§ããŸããããã«ãæ°å€ããã€ããªåœ¢åŒã«å€æããããæååã«ããŒã¯ãä»ãããã倿°åç §ãèšç®ãããããŸããæ£çŽãªãšãããããã¯ããå€ãã®ã¹ããŒã¹ã浪費ããŠããŸãããé床ïŒããã³å®è£ ã®å®¹æãïŒã®å©ç¹ã¯ãããäžåããŸãã
ãããã£ãŠãããã§ã¯æ¬¡ã®æé ã䜿çšããŸãã
-
, , . , , , , . -
, , , . ,PRINT "Hello, World"«Hello, World» , .
, . -
, , , . JavaScript, !
( ). ,PRINT! -
Retroputer BASIC ( ). . , , .
Retroputer BASIC . , . , Retroputer BASIC.
æçš¿ã§ã¯ãã¢ã»ã³ããªèšèªã§ã®ãã®ã¹ããŒãžã®å®è£ ã«ã€ããŠã¯è©³ãã説æããŸããããå°æ¥ã®ããã«æ®ããŠãããŸããããããå¿é ããªãã§ãã ãããããã«ã¯ããããã®ã³ãŒãããããŸãã
å®è¡æã®æ§æã®ç¢ºèª
æåŸã«ãªããŸããããã©ã³ã¿ã€ã æ§æãã§ãã¯ã¯ã§ããã³ãŒããããŒã¯ã³åããã圢åŒã«å€æããåŸããããå®è£ ããã®ã¯éåžžã«ç°¡åã§ãã
ãŸããå®è¡æã«ã BASICã¯çŸåšããŒã¯ã³ãåŠçããŠãããã©ããã確èªããŸãããã¹ãŠã®ããŒã¯ã³ã§æäžäœããããæå¹ã«ãªã£ãŠããŸãïŒã€ãŸããå€ã128以äžã§ãïŒãããŒã¯ã³ãèŠã€ãã£ãå Žåããã¯ãã«ããŒãã«ã§ããŒã¯ã³ãèŠã€ããããšã«ãããåŒã³åºããµãã«ãŒãã³ã決å®ã§ããŸãããŸããæ§æãšã©ãŒã衚瀺ããããšãç°¡åã«ãªããŸããäžéšã®ããŒã¯ãŒãã¯æŒç®åãšããŠæå³ããªããªãããããã¯ãã«ããŒãã«ã¯åã«æ§æãšã©ãŒãçæããããã·ãŒãžã£ãæããŸãã
ãªãã¬ãŒã¿ãŒããŒã¯ã³ãã³ãã©ãŒãåŒã³åºãããåŸããã³ãã©ãŒã¯ãã¹ãŠã®è¿œå ã®è§£æäœæ¥ãåŒãåããŸããããã¯ãããã®éã®ç§»è¡ã䜿çšããããšãã§ããããŒã¯ã³ã®å Žåã
gettokãgettok-rawãpeektokãªã©ããŒã¯ã³ãããã·ãŒãžã£ã«ãã£ãŠäºæãããŠããªããã®ã§ããå Žåãããã·ãŒãžã£ã¯åã«ãšã©ãŒã³ãŒããè¿ããŸããæ§æãšã©ãŒãšã¿ã€ããããã³ã°ãšã©ãŒã®äž¡æ¹ãæ€åºãããã®ã¯ãã®æ®µéã§ãã
ãªãã¬ãŒã¿ãŒãåŒãè©äŸ¡ããå¿ èŠãããå Žåã¯ãè§£æã®å¥ã®æ®µéãå®è¡ãããŸããåŒã®è§£æäžã«ãå¥ã®ãã¯ãã«ã«ãã¯ã¢ããããŒãã«ã䜿çšãããŸããã€ãŸããæ°åŒã«é¢é£ããªãããŒã¯ãŒããã€ã³ã¿ãŒã»ããããŠã察å¿ãããšã©ãŒãè¿ãããšãã§ããŸããããšãã°ãå ¥åããããšãããš
PRINT 2+CLSãæ¬¡ã«æ§æãšã©ãŒãçºçããŸãCLSïŒCLS-ããã¯ãç»é¢ã®ã¯ãªã¢ãã®çç¥åœ¢ã§ãïŒã
泚ïŒãã®è¡šãããæ°åŠæŒç®åã®åªå 床ãšå¿ èŠãªãã©ã¡ãŒã¿ãŒã®æ°ã決å®ããããšãã§ããŸããããã¯ãåŒã®å®éã®è©äŸ¡ã«ãšã£ãŠéèŠã§ããããŠãŒã¶ãŒãååãªåŒæ°ãæäŸããŠããªãå Žåããã£ããããããã«ã䜿çšã§ããŸãã
ããŒã¯ã³ã¯ãã¯ã¿ãŒã«ãã¯ã¢ããããŒãã«ãšã³ããªã«çŽæ¥ãããããããããããã°ã©ã ã¯æå°éã®åŽåã§ããªãè¿ éã«å®è¡ã§ããŸããåã¿ã€ãã®æŒç®åãè§£æããã¿ã¹ã¯ã¯ãã³ãã©ãŒèªäœã«å§ããããŠãããéåžžãããã«ãã£ãŠç¹å¥ãªåé¡ãçºçããããšã¯ãããŸãããããè§£æããããããæãé£ãã
PRINTãšINPUTããã ããåã¹ãããã§äžåºŠã«1ã€ã®ããŒã¯ã³ãååŸãããŸãã
å€ãã®ãã§ãã¯ã¯ããã°ã©ã ã®å®è¡æãŸã§å®è¡ãããªããããããã¯ããšã©ãŒãçºçããåã«éšåçãªçµæãåŸãããå¯èœæ§ãããããšãæå³ããŸããäŸãã°ïŒ
PRINT "Hello";CLS
Hello
?Syntax Error
ãŸããããã°ã©ã ãããã¹ãã衚瀺ã§ããªãç¶æ ã§ç»é¢ãé¢ãããšããšã©ãŒã®é€å»ã«åé¡ãçºçããå¯èœæ§ãããããšãæå³ããŸããæ§æãšã©ãŒã衚瀺ãããŠã衚瀺ãããªãå Žåã¯ãã©ãããã°ããã§ããïŒ
æ§æããã§ãã¯ãããã®æ¹æ³ã«ã¯ç¢ºãã«æ¬ ç¹ããããŸãããããªãåçŽãªã€ã³ã¿ãŒããªã¿ãŒãå¯èœã§ãã
ãŠãŒã¶ãŒå ¥åã®ããŒã¯ã³å
åè¿°ã®ããã«ããã®æä»£ã®BASICããŒãžã§ã³ã§ã¯ããŒã¯ã³åæŠè¡ã䜿çšããã®ãäžè¬çã§ãããã¹ããŒã¹ãç¯çŽããå®è¡é床ãäžããããã«ãããŒã¯ãŒãã¯ã·ã³ã°ã«ãã€ãããŒã¯ã³ïŒãŸãã¯ãããã«ããŒã¯ãŒããå¿ èŠãªå Žåã¯ããã«ãã€ãïŒã«ãå§çž®ããããŸããã
ç»é¢ãã¯ãªã¢ããŠæšæºã®æšæ¶ãå°å·ããç°¡åãªã³ãŒãè¡ããããšããŸãããã
CLS: PRINT "Hello, World"
ããèªäœã¯ããŸãã¡ã¢ãªãæ¶è²»ããŸããããé·ãããã°ã©ã ãäœæãããšããã®ããã°ã©ã ã®å€ãã®åèªãããŒã¯ãŒãã«ãªããŸããããããå§çž®ïŒããŒã¯ã³åïŒãããšãã¹ããŒã¹ã®ããªãã®éšåãç¯çŽã§ããŸããããšãã°ãäžèšã®è¡ãããŒã¯ã³åããåŸãã¡ã¢ãªã«ã¯æ¬¡ã®ãããªãã®ããããŸãã
8A E3 B5 FC Hello, World 00 00
ãããå ã®æ§æã«æ»ãã®ã¯ããã»ã©é£ããããšã§ã¯ãããŸããã
| ãã€ã | ããŒã¯ãŒã | ããŒã |
|---|---|---|
| 8A
|
CLS
|
|
| E3 | "ïŒ" | å·¥äºçµäº |
| 32 | ãã | æå€§1ã€ã®ã¹ããŒã¹ã«ä¿ç®¡ããŸã |
| B5 | å°å· |
|
| FB | ã³ãŒãã®è¡ | æ¬¡ã¯æååæåã§ã |
| ããã«ã¡ã¯ãã¯ãŒã«ãã00 | æååã¯nullã§çµäºããŸã | |
| 00 | ã³ãŒãè¡ã®çµãã | ã³ãŒãè¡ãnullã§çµäºããŸã |
ããã¯å€§å€ãªäœæ¥ã ãšæããããããããŸããããã¹ããŒã¹ã®ç¯çŽã¯éèŠã§ããããã¯ãã®äŸã§ã¯ç¹ã«ç®ç«ã¡ãŸããããããããã§ããç¯çŽãããã¹ããŒã¹ãã©ãã ãæ©ãèç©ãããããæ³åããããšãã§ããŸãããã®å Žåãå§çž®ãããçµæã¯19ãã€ãã§ãããœãŒã¹ããã¹ãã¯26ãã€ãïŒçµäºãã«ãã€ããå«ãïŒã§æ§æãããŸãã
ãŠãŒã¶ãŒããã°ã©ã çšã®RAMãéåžžã«å°ãªããã·ã³ã§å®è¡ãããBASICã€ã³ã¿ãŒããªã¿ãŒã«é¢ããŠã¯ãã¹ããŒã¹ã®ç¯çŽãéèŠã«ãªããŸãããããã£ãŠããã®ãããªå§çž®ã¯ã远å ã®å©ç¹ããªãå Žåã§ããéåžžã«éèŠã§é åçã§ãã
ã§ã¯ããã®ãããªãã®ãã©ã®ããã«ããŒã¯ã³åããã®ã§ããããïŒæåã¯ãJavaScriptã§ãããè¡ãã®ã¯éåžžã«ç°¡åãªããã§ããæååã®é åã䜿çšãããšãåããŒã¯ãŒãã察å¿ããããŒã¯ã³ã«ãã°ãã眮ãæããããšãã§ããŸããæ¬åœã§ããïŒ
ããã¯ã®ä»äºã®ãã
String#replaceã§ããïŒçŽ æŽãªã¢ãããŒãã§ã¯ã次ã®ãããªããšã詊ãããšãã§ããŸãã
const tokens = ["CLS", "PRINT", ":" ];
function tokenize (inStr) {
const newStr = inStr;
tokens.forEach((token, idx) => newStr = newStr.replace(
new RegExp(token, "g"), String.fromCharCode(128+idx)
);
return newStr;
}
æ®å¿µãªãããæååã®ãªãã©ã«ãããŒã¯ã³ã«çœ®ãæããããšã¯ã§ããªãããšã«ããã«æ°ä»ããŸãããããã¯ãããŒã¯ãŒãã§ã¯ãªãèŠçŽ ãå§çž®ããªãããã«ãã³ã³ããã¹ããèæ ®ããŠãæåããšã«åŠçãè¡ãå¿ èŠãããããšãæå³ããŸãã
ãã®æ°ããã¢ã«ãŽãªãºã ã¯ãRetroputerã®ã¢ã»ã³ããªèšèªã³ãŒãã«è¿ããã®ã§ãããJSã䜿çšãããšäœæ¥ãã¯ããã«ç°¡åã«ãªããŸãããããJSã³ãŒãã®å§ãŸãã§ãïŒãã®æçš¿ã§åŸã ã«æ¡åŒµããŠãããŸãïŒïŒ
const tokens = ["CLS", "PRINT", ":" ];
function tokenize(inStr) {
let out = []; // return value is "crunched" array
let idx = 0; // index into inStr
let ch = ""; // current character
while (idx < inStr.length) {
ch = inStr.charCodeAt(idx); // get the current character code
// our logic is going to go here
out.push(ch); // for now push the character
idx++; // and keep going (next char)
}
out.push(0); // we end with NUL
return out;
}
ããŒãã«å šäœããã®åœ¢åŒã§è¡šç€ºããããªãããïŒé·ããRetroputerã¯å®éã«ã¯JSãã¡ã€ã«ããããŒã¯ã³ããŒãã«ãäœæããŸãïŒïŒãããŒã¯ã³ã®éåžžã«åçŽåããããªã¹ãããå§ããŸãããç§ãã¡ã®ç®çã«ã¯ããã§ååã§ããããã§ã®ååã¯ãããŒã¯ã³ãèŠã€ãããããã®ã€ã³ããã¯ã¹ãåºåé åã«æžã蟌ãããšã§ãã
ãã®æç¹ã§ãä»ã®ãšãããæååãåçã®æåã³ãŒãã«å€æããã ãã®é¢æ°ããããŸããç¹ã«æçšã§ã¯ãããŸãããã䟿å©ãªãã¬ãŒã ã¯ãŒã¯ãšããŠæ©èœããŸãã
ã¢ã»ã³ããªèšèªã®ããŒãžã§ã³ã¯ãäžèšã®ããŒãžã§ã³ãšéåžžã«ãã䌌ãŠããŸãã
do {
call _get-source-index # get next character index (in y)
dl := <BP+source>,y # read next char from our source string (ch)
call _adv-source-index # advance our source index
call _get-target-index # get position in target ("out" in JS)
<BP+target>,y := dl # store to target (out[y] = ch)
call _adv-target-index # move it along
cmp dl, 0 # was char 0? if so, break
} while !z
äžèšã®äŸ
_get-source-indexãä»ã®é¢æ°ã«ã¯ãã¿ã¹ã¯ãååããæããã§ãããããå«ãŸããŠããŸããããããã¯ããœãŒã¹ã€ã³ããã¯ã¹ãšã¿ãŒã²ããã€ã³ããã¯ã¹ãååŸãèšå®ããããããããã²ãŒãããã ãã§ããJSãšã¯ç°ãªããã¢ã»ã³ããªèšèªã«ã¯åçã«å²ãåœãŠãããé
åããªãããããã®ã¢ã«ãŽãªãºã ã¯ååãªãµã€ãºã®ãããã¡ãŒãå²ãåœãŠãŸããå
¥åè¡ãäžã«ç§»åãããšããã¿ãŒã²ãããããã¡ã®æ¬¡ã®ããŒã¯ã³ãã©ãã«æžã蟌ãããããã³ã¿ãŒã²ããã€ã³ããã¯ã¹ãäžèšã§äœãè¡ã£ãŠããããç¥ãå¿
èŠããããŸããäžèšã®å颿°ã¯ãã§ã€ã³ããã¯ã¹ãè¿ããŸãYãããšãã°ããã®é¢æ°_adv-target-indexã¯ã¿ãŒã²ããã€ã³ããã¯ã¹ã1ã€ã€ã³ã¯ãªã¡ã³ãããŸãïŒåçy++ïŒã
ãªãã©ã«ã«æ³šæããŠãã ãã
泚æããå¿ èŠããããŸããæååãªãã©ã«ã¯ããŒã¯ãã€ã¶ãŒãæ··ä¹±ãããå¯èœæ§ããããŸããããŒã¯ãŒãã«äžèŽãããã¹ãŠã®æåæååãããŒã¯ã³å€ã«åçŽã«çœ®ãæããããšã¯ã§ããŸããããCLSããå«ãæååãªãã©ã«ã衚瀺ãããå ŽåããããããŒã¯ã³åããããšãã¹ãã§ã¯ãããŸãããå®è¡å¯èœã§ãã£ãŠã¯ãªãããåºåãããš...ãã®ä»£ããã«ããŒã¯ã³ã«å¯Ÿå¿ãããã€ããåºåãããŸããããã¯ãéçºè ãæå³ãããã®ã§ã¯ãªãå¯èœæ§ããããŸãã
äžæ¹ãBASICã«ã¯æ°å€ããŒã¯ãŒãããªããããæ°å€ãªãã©ã«ã«ã¯ãã®åé¡ã¯ãããŸãããããã§ããæ°åã«çŽé¢ãããšãã«ããŒã¯ãŒããæ€çŽ¢ããŠãæå³ããããŸãã-ãªãæéãç¡é§ã«ããã®ã§ããïŒ
æååãªãã©ã«ã®ããŒã¯ã³å
ããã§ãæåã«è¡ãå§ãŸããã©ããã確èªããŸããã-JSã§ã¯ãããè¡ãããšã¯ç¹ã«é£ããããšã§ã¯ãããŸããïŒ
if (ch === 34) {
out.push (0xFB); // string-in-code token
idx++;
ch = inStr.charCodeAt(idx); // get next character after the quote
while (ch !== 34 && idx < inStr.length) {
out.push(ch);
idx++;
ch = inStr.charCodeAt(idx);
};
idx++; // go past the quote
out.push(0); // end of string
continue;
}
äºéåŒçšç¬Šã¯æåã³ãŒã34ã§è¡šãããŸããä»ã®ããã°ã©ãã³ã°èšèªã§ã¯ãããã«å€ãã®ã¹ã¿ã€ã«ã®åŒçšç¬ŠïŒJSãCãªã©ïŒãèªèã§ããŸãããBASICã䜿çšãããšãäºéåŒçšç¬Šã䜿çšããããäœã䜿çšããªãããšããåçŽãªãã®ã«ãªããŸãã
æååãå§ãŸãã®ã確èªããããæ®ãã®æåãååŸããŠãå¥ã®åŒçšç¬ŠãèŠã€ãããŸã§åºåé åã«è¿œå ããã ãã§ãã
Retroputer BASICã¯Cã¹ã¿ã€ã«ã®æååã䜿çšãããããæååå šäœãèªã¿åã£ãåŸããŒããã€ãã远å ããå¿ èŠããããŸããPascalã¹ã¿ã€ã«ã®æååã䜿çšããå Žåã¯ãã«ãŠã³ã¿ãŒãæ ŒçŽããŠæååãªãã©ã«ã®é·ããæ¿å ¥ã§ããŸãããããã«ãããããã¯ç¹ã«åé¡ã«ã¯ãªããŸããã nullã§çµäºããæååã䜿çšããå¯äžã®çç±ã¯ãã¢ã»ã³ããªèšèªã§ã®æäœãéåžžã«ç°¡åã§ããããã§ããã«ãŠã³ã¿ãæ ŒçŽããã®ã§ã¯ãªããnullãã€ããšæ¯èŒããã ãã§æžã¿ãŸãã
ãããã£ãŠãJavaScriptã¯ããã»ã©é£ãããããŸããã§ãããã»ãšãã©ã®äººã¯ãéåžžã®è¡šçŸã®ããã«ããã£ãšæœè±¡çãªãã®ã䜿ãããšã«æ±ºãããšæããŸãããã®ã³ãŒãã¯ç§ãã¡ã®æå³ãããæç¢ºã«ããã ãããšæããŸãã
if (ch === 34) {
out.push (0xFB); // string-in-code token
const stringLiteral = inStr.substr(idx+1).match(/^[^"]*/)[0];
idx += stringLiteral.length+1;
out.push(...Array.from(stringLiteral, ch => ch.charCodeAt(0)));
idx++; // go past the quote
out.push(0); // end of string
continue;
}
äžèšã®ã³ãŒãã¯ã»ãŒåãã§ãããæåããšã®æ€èšŒã®ä»£ããã«ãJSã«ãå®è¡ãã
matchãŸããäžèŽããããšãããã£ãŠããã®ã§ïŒæååå
ã«ãããŸãïŒãäžèŽãæåãããã©ããã確èªããå¿
èŠããããŸãããæ¬¡ã«ãæååã®é·ãã ãã€ã³ããã¯ã¹ãã€ã³ã¯ãªã¡ã³ãããæåãåºåé
åã«ã³ããŒããŸããç§ã®æèŠã§ã¯ããã®ã³ãŒãã¯ã¯ããã«çè§£ããããã§ãïŒãã ããæ£èŠã®åŒãããšãã°ES6æ§æã®ç¹æ§ãâŠããã³ç¢å°é¢æ°ã®çè§£ãæå³ããŸãïŒã
ãã¡ãããã¢ã»ã³ããªèšèªã§ã¯ãJSãè¡ããã¹ãŠã®äœæ¥ãæåã§è¡ãå¿ èŠããããŸããçµæã¯ãJSã³ãŒããäœæããæåã®è©Šã¿ãšéåžžã«ãã䌌ãŠããŸãã
cmp dl, constants.QUOTE # is dl a quote?
brs !Z not-a-string # nope; not a string
call _get-target-index # get next position in crunch target
dl := brodata.TOK_CODE_STRING # "String" token
<bp+target>,y := dl # Store it into the crunch target
call _adv-target-index
still-a-string:
call _get-source-index
dl := <bp+source>,y # get string character
call _adv-source-index
cmp dl, constants.QUOTE # if it's a quote, we can zero it
if Z {
dl := 0
}
call _get-target-index
<bp+target>,y := dl # write to target
call _adv-target-index
cmp dl, 0 # are we done?
brs !Z still-a-string # no, keep going
continue # next!
not-a-string:
Retroputerã¢ã»ã³ããªèšèªããŒãµãŒã«ã€ããŠã®ã¡ã¢ã远å ãã䟡å€ããããŸã-ãããã¯ãã«ãŒããªã©ã®é«ã¬ãã«ã®æ§é ãåºæ¬çã«ãµããŒãããŠããŸãããããã£ãŠã
if Z {âŠ}ãŒããã©ã°ãèšå®ãããŠããå Žåããããã¯å
ã®ã³ã³ãã³ããå®è¡ãããããã¯continueã®å
é ã«åå²ããããã«äœ¿çšã§ããŸãïŒãããã¯breakãçµäºããããã«ã䜿çšãããŸãïŒãã¢ã»ã³ãã©ã¯ãããããŸããŸãªæ¯èŒããã³åå²åœä»€ã«å€æãããããCPUã¯ã³ãŒãã®é«ã¬ãã«ã®éšåãèªèããŸããããã³ãŒããå°ãç°¡åã«èšè¿°ã§ããŸãã
ããŒã¯ã³åçªå·
ãŸããããŒã¯ãŒãã®ãªã¹ãã§æ°åãæ€çŽ¢ããããšããŠãæå³ããªããããã¹ãããããããšãã§ããŸãã BASICã®ã»ãšãã©ã®ããŒãžã§ã³ã¯ãäžèšã®æååæäœãšåæ§ã®ããšãè¡ããŸããèªã¿åãããæåãæ°åã®å Žåãåºåã«é£çµãããåŸãã³ã³ãã¬ããµãŒãåŒãç¶ããŸãã
Retroputer BASICïŒããã³Atari BASICãªã©ã®ä»ã®ããŒãžã§ã³ã®BASICïŒã¯ãããã«äžæ©é²ãã§ãæ°å€ãé©åãªãã€ããªåœ¢åŒã«å€æããŸãããããè¡ãã®ã¯éåžžã«ç°¡åã§ããæ°åã«åºäŒã£ãå Žåãã¢ãã¥ã ã¬ãŒã¿ã«10ãæããŠæ°åãå ç®ããæ°åãåºçŸãç¶ããéãç¶ããŸãã ïŒãã ããRetroputer BASICã¯æŽæ°å€ã§ã®ã¿æ©èœããŸãããæµ®åå°æ°ç¹æ°ã®è¿œå ã¯ãã§ã«ç§ã®ToDoãªã¹ãã«å«ãŸããŠããããšã«æ³šæããŠãã ãããïŒ
ïŒçŸåšãRetroputer BASICã¯ã笊å·ä»ãã笊å·ãªããã«é¢ä¿ãªããæŽæ°ãªãŒããŒãããŒãçºçããŠãäœãããŸãããæµ®åå°æ°ç¹æ°ã远å ãããšãRetroputerãæµ®åå°æ°ç¹ã«å€æãããŸããïŒ
RetroputerBASICã¯ããã«äžæ©é²ãã§ããŸãã ïŒãŸãã16鲿°ãèªèããããããåçã®2鲿°ã«å€æããŸããããã¯
0xïŒJSã®ããã«ïŒãã®ãããªçªå·ã®æå®ãšããŠäœ¿çšãããèšèªèªäœã«ã¯ãè€æ°ã®æåãæå®ãããå Žåã«ãšã©ãŒãè¿ãããããã«ããããã®è¿œå ã®ããžãã¯ããããŸãxã
ããªãã¯ãæåã³ãŒãã®éã§ããããšã確èªããå¿ èŠããããŸããæåã¯é£ããããããã¯æ¯èŒã®ã«ããã«ãå¿ èŠãšããããšãæ°åã§ã¯ãããŸãããããŠãããã©ããããã§ãã¯ããã¢ã»ã³ããªèšèªã§ã¯ã
0x30ãš0x39..ã ïŒãããã¯æåã³ãŒãã0ããšã9ãã§ããïŒ
æåæ¡ãåãåã£ãããæåã»ããã®å¥ã®äŸ¿å©ãªããããã£ã䜿çšã§ããŸãã
0x30-ããã¯æåã³ãŒãã0ãã0x31-ã³ãŒãã1ããªã©ã§ããå¿
èŠã«å¿ããŠæžç®ããããšãã§ããŸã0x30ãããã£ãšç°¡åãªæ¹æ³ããããŸããæäžäœ4ããããç Žæ£ããã ãã§ãã
and dl, 0b0000_1111
æ®å¿µãªããã16鲿°ãåŠçããå¿ èŠãããå Žåãããã¯æ©èœããŸããããã®å Žåãæžç®ããŠ10ãšæ¯èŒããã³ãŒãã10ãã倧ããå Žåã¯ãå床7ãã€æžããããšãã§ããŸãïŒ16鲿°ã倧æåã®ãAã-ãZãã®å ŽåïŒã
JSã§ã¯ãéåžžã®åŒãå床䜿çšã§ããŸãããã®åŸãçªå·ãäžèŽãããšãã«ãåŒã³åºãããšãã§ããŸã
Number()ãããã«ãããå¥ã®å©ç¹Number()ãåŸãã0xãŸããçªå·ããã§å§ãŸãå Žåã¯èªåçã«å€æãããããã16鲿°ãç°¡åã«å€æãããŸãã
JavaScriptã§ã¯ã©ã®ããã«èŠããŸããïŒ
if (ch >= 48 && ch <= 57) {
out.push (0xFD); // number token
const numberLiteralStr = inStr.substr(idx).match(/^[\d|A-F|a-f|x|X]+/)[0];
idx += numberLiteralStr.length;
const numberLiteral = Number(numberLiteralStr);
const bytes = new Uint8Array(new Uint16Array([numberLiteral]).buffer);
out.push(...bytes)
continue;
}
éåžžã®åŒã§ã¯ãæ°åãŸãã¯16鲿°ã®ä»»æã®çµã¿åããã䜿çšã§ããŸãïŒããã«
xã16鲿°ã¢ãŒãã«åãæ¿ããããšãã§ããŸãïŒããã®åŒã¯çæ³çã§ã¯ãããŸãããããšãã°ãè€æ°ã䜿çšã§ããŸãxããä»ã®ãšããããã§ååã§ãã
äžèšã®ã³ãŒãã§ã¯ãæ°å€ããã€ãã«å€æããããšã¯çãããå ŽåããããŸãã
Number()æ°åã®æååãJavaScriptãåŠçã§ããæ°åã«å€æãããšãã倧å€ãªäœæ¥ããã¹ãŠè¡ããŸããããä»åºŠã¯ããããã€ãã®ã·ãŒã±ã³ã¹ãšããŠè¡šãå¿
èŠããããŸãããããè¡ãã«ã¯ãæ°åŠã䜿çšã§ããŸãã
const hiByte = (numberLiteral & 0xFF00) >> 8;
const loByte = (numberLiteral & 0x00FF);
...ãããŠããã¯æŽæ°ã«å¯ŸããŠè¡ãã®ã¯ç°¡åã§ããããããJSã®äœ¿çšã®ãããã§ãããªãã¯ãã¹ãŠã®ãããã®èšç®ãé¿ããããåæã«ïŒç§ãã¡ã¯ãåã«çœ®ãæããŸãå°æ¥çã«ã¯æµ®åå°æ°ç¹æ°ãæ±ãããã«æºåããããšãã§ããé åãå ¥å
Uint16ArrayããŠFloat64ArrayïŒã
ãã®ã¿ã¹ã¯ã®ã¢ã»ã³ããªèšèªã³ãŒãã¯å°ãé·ããªããŸãããå°ãé·ããªããŸããRetroputerã¯ãã1ã€ã®æé©åã䜿çšããŸããæ°å€ãå°ããå Žåã¯ãå°ãã圢åŒã§ä¿åãããŸããããã¯ã0ã255ã1ãã€ãã«æ ŒçŽã§ããã®ã«å¯Ÿããé·ãæ°å€ã¯2ãå ããããšãæå³ããŸãã
ããŒã¯ãŒããæ€çŽ¢ãã
ãã®ãããããªãã®äœæ¥ãè¡ããŸãããããããŸã§ã®ãšãããåäžã®ããŒã¯ãŒããå§çž®ããŠããŸãããæ°åãšæååã®ãªãã©ã«ãæ±ã£ãŠããã®ã§ãä»ã®ãã¹ãŠãããŒã¯ãŒããŸãã¯å€æ°åã®ããããã§ãããšç¢ºä¿¡ã§ããŸãã ïŒãŸãã¯ã¹ããŒã¹ã§ãããããã¯ç°¡åã«ç¢ºèªã§ããŸããïŒ
BASICã§ã¯ãããŒã¯ãŒãã¯å¿ ãããã¢ã«ãã¡ãããæåã§å§ãŸããšã¯éããŸãããæŒç®åãšåºåãæåãããŒã¯ã³ãšèŠãªãããŸãããã ãã倿°ãã¢ã«ãã¡ãããæåã§å§ãŸããŸãããããã£ãŠãããŒã¯ãŒããšå€æ°ã®ã©ã¡ããå§çž®ããããããã«æ±ºå®ããããšã¯ã§ããŸãããããã¯ç§ãã¡ã«é©ããŠããŸã-ããŒã¯ã³ã®ãªã¹ãã«äžèŽãããã®ãèŠã€ãããªãå Žåãããã¯å€æ°ã§ãããšèŠãªãããŸãã
ã§ã¯ãæœåšçãªããŒã¯ãŒããå®éã«ããŒã¯ãŒãã§ããããšãã©ã®ããã«ç¢ºèªããã®ã§ããããã JavaScriptã§èšè¿°ããŠããå Žåã¯ãã䜿çšã§ããŸã
Array#findIndexã
const tokenMatch = tokens.findIndex(token =>
inStr.substr(idx).startsWith(token));
if (tokenMatch > -1) {
out.push(tokenMatch + 128);
idx += tokens[tokenMatch].length;
continue;
}
ã¡ãœãã
Array#findIndexã¯é
åtokensãå埩åŠçãããã§ãã¯ããŠããããŒã¯ã³ã§inStrïŒçŸåšã®é
åã§ïŒéå§ãããã©ããããã§ãã¯ã§ãidxãŸããããŒã¯ã³ã®ç°¡ç¥åããããªã¹ãã䜿çšããŠã次ã®ãããªããšãè¡ããŸãïŒãšä»®å®ããŸãinStr.substr(idx)===âPRINTâïŒã
| ããŒã¯ã³ | .startsWithïŒããŒã¯ã³ïŒïŒ | ã€ã³ããã¯ã¹ |
|---|---|---|
| CLS | false | 0 |
| å°å· | true | 1 |
泚ïŒ
indexOfJSãšåæ§ã«ãäœãèŠã€ãããªãå Žåã¯ããååŸã-1ãŸãã
äžèŽãããã®ãèŠã€ãã£ãå Žåã¯ãè¿ãããé åã«ãã®ã€ã³ããã¯ã¹ãä¿åã§ããŸããããããåŸã§ããŒã¯ã³ãšã·ã³ãã«ãã©ã®ããã«åºå¥ããã®ã§ãããããç°¡åïŒæäžäœãããããªã³ã«ããŸããããã¯ãããŒã¯ã³å€ã«128ã远å ããããšã§å®è¡ã§ããŸã
ïŒæ³šïŒ128ããå€ãã®ããŒã¯ã³ãå¿ èŠãªå Žåãäžéšã®ããŒã¯ã³ã§ã¯2ãã€ãã䜿çšããå¿ èŠããããŸããããã¯å°ãè€éã«ãªããŸãããããã»ã©è€éã§ã¯ãããŸããã BASICã®äžéšã®ããŒãžã§ã³ã¯ãããšãã°ãããŸããŸãªMicrosoft BASICã§ãã
ãå®è¡ããŸããïŒJavaScriptã¯çµäºããŸããããã¢ã»ã³ããªèšèªã§ã©ã®ããã«å®è¡ããŸããïŒ
ã»ãŒåãã§ããããšãããããŸãããã³ãŒãã¯ã¯ããã«é·ããªããŸãã
search-keywords:
bl := [d, x] # get first character of current token
cmp bl, constants.NUL # if it's NUL, we've exhausted the list
brs Z exit-keyword-search # so we're clearly not a keyword
clr Z # compare strings, but with partial equality
call [vectors.STRCMP] # so that our source doesn't need NUL between
# tokens; c will now be how many chars got
# compared
if !Z {
do { # no match; advance past our token in the list
inc x # character by character
bl := [d, x] # tokens are terminated with NULs
cmp bl, constants.NUL # so if we see it, we can stop
} while !z
inc x # go past the token #
inc x # in the lookup table
brs search-keywords # and keep looking for a match
}
clr c # found the match!
add x, c # c is the length of the match
inc x # past the NUL
bl := [d, x] # bl is now the token #
call _get-target-index
<bp+target>,y := bl # write the token #
call _adv-target-index
call _get-source-index # advance past the token in the source
clr c
add y, c # by adding the character count
dec y # back off by one (we'll advance again later)
call _set-source-index
continue
ãŸããããã»ã©æªãã¯ãªãããã§ããã¢ã«ãŽãªãºã ã¯ã»ãšãã©åãã§ãããã¢ã»ã³ããªèšèªã®ããŒã¯ã³ããŒãã«ã®æ§é ãå°ãç°ãªããŸããããã¯æ¬¡ã®ããã«ãªããŸãã
CLS 00 80
PRINT 00 81
: 00 82
åããŒã¯ãŒãã¯ãnullãã€ããšããã«ç¶ãããŒã¯ã³çªå·ã§çµäºããŸãã
ãã ããããã§ã¯éèŠãªããšãæ¬ ããŠããŸãããã®æååã®æ¯èŒã¯ã©ã®ããã«è¡ãããã®ã§ãããããRetroputerã®ã³ã¢ã«
STRCMPã¯äœ¿çšã§ããæé ããããŸãããã©ã®ããã«èŠããŸããïŒ
strcmp: {
enter 0x00
push a
push b
push d
push y
pushf
if Z {
bl := 0x00 # Checking for full equality
} else {
bl := 0x01 # only checking for partial equality
}
_main:
y := 0 # start of string
top:
cl := [d, x, y] # character in string A
al := <bp+4>,y # character in string B
cmp bl, 0x01 # check if we're doing full equality
if Z {
cmp cl, 0 # we're not, so check for an early nul
# in string b
brs Z strings-are-equal # if it's NUL, we calling them equal
}
cmp cl, al # check character
if Z {
cmp cl, 0 # equal, but check for NUL
brs Z strings-are-equal # NUL reached, strings are equal
inc y # next character
brs top # not NUL, so keep going...
}
# if here, the strings aren't equal
if N {
popf # string is less than
set N
clr Z
brs _out
} else {
popf # string is greater than
clr N
clr Z
brs _out
}
strings-are-equal:
popf
clr N # Not less than
set Z # but Equal
_out:
c := y # make sure we know how many chars
# were compared
pop y
pop d
pop b
pop a
exit 0x00
ret
}
ããªãã®ããšã¯ããããŸãããã
String#startsWithJSã¡ãœããããŸããŸã奜ãã«ãªãå§ããŠããŸããã¯ããåãããšãããŸããããã¹ãŠã®å
éšããžãã¯ãèšè¿°ããå¿
èŠã¯ãããŸããïŒ
å¯å€åŠç
ããã§ããŒã®å§çž®ãå®äºããã®ã§ãçµäºã§ããŸããããããRetroputer BASICã¯ã倿°ã®ããŒã¯ã³åãšããå¥ã®äžæ©ãèžã¿åºããŸãããã¡ã¢ãªãéãããŠããç¶æ³ã§ã¯æå®³ã§ããå¯èœæ§ãããããã80幎代ãš90幎代ã®BASICã®ããã€ãã®ããŒãžã§ã³ã®ã¿ããããè¡ã£ãããã«æãããŸãããã ããã¡ã¢ãªãå€ãå Žåã¯ã倿°ã®ããŒã¯ã³åã«ãã£ãŠããã©ãŒãã³ã¹ãåäžããŸãã
RetroputerBASICã®æ©èœã¯æ¬¡ã®ãšããã§ãã
- 倿°åã®æåã®2æåãŸã§ãèªã¿åããŸããïŒããã¯ãã¡ã¢ãªã®å¶çŽã®ããã«ãåœæã®BASICããŒãžã§ã³ã®æšæºçãªäžäŸ¿ã§ãããïŒ
- ãããã®2ã€ã®æåããã倿°ã®ã€ã³ããã¯ã¹ã決å®ããŸãããAãã¯å€æ°0ããA0ãã¯å€æ°53ãªã©ã§ããæ¹çšåŒã¯éåžžã«åçŽã§ãããä»ã¯èå³ããããŸããã
- BASIC . ,
$BASIC . . - BASIC , . !
ïŒæ³šïŒRetroputer BASICã倿°ã«ã¡ã¢ãªãåçã«å²ãåœãŠãããšãåŠç¿ãããšãã€ã³ããã¯ã¹ã倿°ãžã®ãã€ã³ã¿ãŒã«çœ®ãæããŸããToDoãªã¹ãã®å¥ã®é ç®ã§ãïŒïŒ
ããã«ãããå®è¡æã«å€æ°ãéåžžã«é«éã«èŠã€ããããšãã§ããŸãã倿°åãè§£æããŠã€ã³ããã¯ã¹ãæ¯åèšç®ããå¿ èŠã¯ãããŸããã倿°ã«åºäŒã£ããšããé£ç¶ãµã€ã¯ã«ã§ã¯ãå€§å¹ ãªç¯çŽã«ãªããŸãããã ããããã«ã¯ã³ã¹ããããããŸãããã€ã³ã¿ãšå€æ°åãäžç·ã«æ ŒçŽããå¿ èŠããããããçºçãã倿°ããšã«ãåºåã«4ãã€ãã远å ããå¿ èŠããããŸãã
ããã䟡å€ããããã©ãããæ±ºããã®ã¯ããªã次第ã§ãã
ãšã¯ãããJavaScriptã§ã¯ãæåã¹ããªãŒã ã®æ®ãã®éšåã倿°ã§ãããã©ããã倿ããã®ãç°¡åã§ãã
const variableMatch = inStr.substr(idx).match(/^[A-Z]+[A-Z0-9]*[\$]*/);
if (variableMatch) {
const variableName = variableMatch[0];
idx += variableName.length;
// tokenize it (omitted; nothing new here)
continue;
}
Retroputerã倿°ãããŒã¯ã³åããããã«çŸåšäœ¿çš ããŠããã³ãŒãã«ã€ããŠã¯è©³ãã説æããŸãããåé·ãããŸãã倿°ã«åçãªã¡ã¢ãªå²ãåœãŠã远å ãããšãããã«æ»ããŸãã
ããŒã¯ã³åãå®äºããŸãã
JSã§ã³ãŒãããã¹ããããšãRetroputerBASICãå éšã§äœ¿çšãããã®ãšåæ§ã®ãã€ãé åãåŸãããŸãã
console.log(toHex(tokenize(`CLS: PRINT "Hello, World"`)));
// 80 82 20 81 20 FB 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 00 00â
ãããŒãæ°ãã€ããç¯çŽããã®ã«äœãšå€§å€ãªäœæ¥ã§ãããããã空ãã¡ã¢ãªãæ°ãããã€ããããªãå Žåã¯ãããã ãã®äŸ¡å€ããããŸãããã ãããŠãŒã¶ãŒãå ¥åããããã¹ããå§çž®ããå©ç¹ã¯ããã ãã§ã¯ãããŸãããããã°ã©ã ã®å®è¡ãé«éåãããŸãã
ãããçºçããçç±ã説æããã«ã¯ãRetroputerãã³ãŒããå®è¡ããæ¹æ³ãçè§£ããå¿ èŠããããŸããããã§ã¯è©³ãã説æããŸããããç°¡åã«èšããšãã³ãŒããå®è¡ããã«ã¯æ¬¡ã®ãã®ãå¿ èŠã§ãã
- ã¡ã¢ãªãã1ãã€ããååŸããŸã
- ãã€ãã®æäžäœãããããªã³ã«ãªã£ãŠããå Žåãããã¯ããŒã¯ã³ã§ãããã以å€ã®å Žåã¯ãæ§æãšã©ãŒïŒãŸãã¯NULããããã®å Žåãããããããã°ã©ã è¡ã«ãªããŸãïŒã§ãã
- é åå ã®ããŒã¯ã³ãã³ãã©ãŒãæ¢ããŠããŸã-ãã®é åã«ã¯ãããŒã¯ã³ãåŠçãã颿°èªäœãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããŸã
- ãã³ãã©ãŒãåŒã³åºããŸãïŒåŒæ°ãªã©ã®åä¿¡ãæ åœããŸãïŒ
- ããäžåºŠç¹°ãè¿ããŸã
ããã¯ãããŒã¯ãŒããããŒã¯ã³åãããã1ã€ã®çç±ã§ããããŒã¯ãŒãã®ããžãã¯ãå®è¡ããã®ã¯ç°¡åã§ãé åå ã®ã¢ãã¬ã¹ãèŠã€ããŠåŒã³åºãã ãã§ãã
ããŒã¯ã³åã¯ã¹ããŒã¹ãç¯çŽããããã«éèŠã§ãããå®è¡é床ãåäžããããšã匷調ããããšæããŸãã
ããšãã°ãJSå®è¡ã«ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
const handlers = [ cls, print, endOfStmt ];
bytes.forEach(byte => handlers[byte] && handlers[byte]());
ãã¡ãããå®éã«ã¯ãã¹ãŠãããã»ã©åçŽã§ã¯ãªããã¯ããã«åçŽã§ãããããã¯ãã§ã«å¥ã®æçš¿ã®ãããã¯ã§ãïŒ
ãªãœãŒã¹
- ãã®æçš¿ã®å®å šãªJavaScriptã³ãŒã
- RetroputerãœãŒã¹ã³ãŒãïŒçŸåšéçºäžïŒ
- ãã®ãããžã§ã¯ãã«äœ¿çšããããªãœãŒã¹ã®ãªã¹ã
åºå
DDoSä¿è·ãšææ°ã®ããŒããŠã§ã¢ãåãã匷åãªVPSãããã¯ãã¹ãŠãç§ãã¡ã®å£®å€§ãªãµãŒããŒã«é¢ãããã®ã§ããæå€§æ§æã¯ã128 CPUã³ã¢ã512 GB RAMã4000 GBNVMeã§ãã
