misc/include/control2.mac
.nlist
.ifndef __control2_mac__
__control2_mac__ equ 1
;control.macは引数の順序がlabel,cc,op
;control2.macは引数の順序がop,cc,label
.ifdef __control_mac__
.fail 1 ;control.macとcontrol2.macは共存できない
.endif
;----------------------------------------------------------------
;
; 制御文
;
;----------------------------------------------------------------
; 分岐しない
; bf label
; bnt label
; jbf label
; jbnt label
;----------------------------------------------------------------
; 分岐する
; bnf label bra label
; bt label bra label
; jbnf label jbra label
; jbt label jbra label
;----------------------------------------------------------------
; 二重否定
; bnncc label bcc label
; dbnncc dn,label dbcc dn,label
; jbnncc label jbcc label
; snncc ea scc ea
;----------------------------------------------------------------
; 無条件分岐
; jmp ea jmp ea
; rtd imm rtd imm
; rte rte
; rtr rtr
; rts rts
; (noreturnを含む)
;----------------------------------------------------------------
; 無条件ブレーク
; break jbra ~~breakN
; (noreturnを含む)
; (右に注釈を書くときはbreak t)
;----------------------------------------------------------------
; 条件付きブレーク
; break <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~breakN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付きブレーク
; breakand <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~breakN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付きブレーク
; breakor <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~breakN
; op2
; jbcc2 ~~breakN
; op3
; jbcc3 ~~breakN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件2段ブレーク
; break2 jbra ~~breakN
; (noreturnを含む)
; (右に注釈を書くときはbreak2 t)
;----------------------------------------------------------------
; 条件付き2段ブレーク
; break2 <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~breakN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付き2段ブレーク
; break2and <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~breakN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付き2段ブレーク
; break2or <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~breakN
; op2
; jbcc2 ~~breakN
; op3
; jbcc3 ~~breakN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件コンティニュー
; continue jbra ~~continueN
; (noreturnを含む)
; (右に注釈を書くときはcontinue t)
;----------------------------------------------------------------
; 条件付きコンティニュー
; continue <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~continueN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付きコンティニュー
; continueand <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~continueN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付きコンティニュー
; continueor <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~continueN
; op2
; jbcc2 ~~continueN
; op3
; jbcc3 ~~continueN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件2段コンティニュー
; continue2 jbra ~~continueN
; (noreturnを含む)
; (右に注釈を書くときはcontinue t)
;----------------------------------------------------------------
; 条件付き2段コンティニュー
; continue2 <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~continueN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付き2段コンティニュー
; continue2and <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~continueN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付き2段コンティニュー
; continue2or <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~continueN
; op2
; jbcc2 ~~continueN
; op3
; jbcc3 ~~continueN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 後判定ループ
; do ~~redoN:
; : :
; while <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; jbcc ~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (1回ループはdo~while f)
; (無限ループはdo~while t)
;----------------------------------------------------------------
; AND後判定ループ
; do ~~redoN:
; : :
; whileand <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~redoN
; @else:
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR後判定ループ
; do ~~redoN:
; : :
; whileor <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbcc1 ~~redoN
; op2
; jbcc2 ~~redoN
; op3
; jbcc3 ~~redoN
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; コンティニュー飛び込み後判定ループ
; docontinue jbra ~~continueN
; ~~redoN:
; : :
; while <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; jbcc ~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; コンティニュー飛び込みAND後判定ループ
; docontinue jbra ~~continueN
; ~~redoN:
; : :
; whileand <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~redoN
; @else:
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; コンティニュー飛び込みOR後判定ループ
; docontinue jbra ~~continueN
; ~~redoN:
; : :
; whileor <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbcc1 ~~redoN
; op2
; jbcc2 ~~redoN
; op3
; jbcc3 ~~redoN
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 飛び込み後判定ループ
; dostart jbra ~~startN
; ~~redoN:
; : :
; start ~~startN:
; :
; while <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; jbcc ~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; 飛び込みAND後判定ループ
; dostart jbra ~~startN
; ~~redoN:
; : :
; start ~~startN:
; :
; whileand <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~redoN
; @else:
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 飛び込みOR後判定ループ
; dostart jbra ~~startN
; ~~redoN:
; : :
; start ~~startN:
; :
; whileor <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbcc1 ~~redoN
; op2
; jbcc2 ~~redoN
; op3
; jbcc3 ~~redoN
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 回数付きループ
; for dn ~~redoN:
; : :
; next ~~continueN:
; dbra dn,~~redoN
; ~~breakN:
; (dn+1回。0回は不可)
;----------------------------------------------------------------
; 回数付き後判定ループ
; for dn ~~redoN:
; : :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; コンティニュー飛び込み回数付きループ
; forcontinue dn jbra ~~continueN
; ~~redoN:
; : :
; next ~~continueN:
; dbra dn,~~redoN
; ~~breakN:
;----------------------------------------------------------------
; コンティニュー飛び込み回数付き後判定ループ
; forcontinue dn jbra ~~continueN
; ~~redoN:
; : :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; コンティニュー飛び込みロング回数付きループ
; forcontinuelong dn jbra ~~continueN
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; next ~~continueN:
; dbra dn,~~redoN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
;----------------------------------------------------------------
; コンティニュー飛び込みロング回数付き後判定ループ
; forcontinuelong dn jbra ~~continueN
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; bncc ~~breakN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; ロング回数付きループ
; forlong dn swap dn
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; next ~~continueN:
; dbra dn,~~redoN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
; (dn+1回。0回は不可)
;----------------------------------------------------------------
; ロング回数付き後判定ループ
; forlong dn swap dn
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; bncc ~~breakN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; 飛び込み回数付きループ
; forstart dn jbra ~~startN
; ~~redoN:
; : :
; start ~~startN:
; :
; next ~~continueN:
; dbra dn,~~redoN
; ~~breakN:
; (dn+1回。0回は不可)
;----------------------------------------------------------------
; 飛び込み回数付き後判定ループ
; forstart dn jbra ~~startN
; ~~redoN:
; : :
; start ~~startN:
; :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; 飛び込みロング回数付きループ
; forstartlong dn jbra ~~startN
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; start ~~startN:
; :
; next ~~continueN:
; dbra dn,~~redoN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
; (dn+1回。0回は不可)
;----------------------------------------------------------------
; 飛び込みロング回数付き後判定ループ
; forstartlong dn jbra ~~startN
; ~~longredoN:
; swap dn
; ~~redoN:
; : :
; start ~~startN:
; :
; next <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; dbncc dn,~~redoN
; bncc ~~breakN
; swap dn
; dbra dn,~~longredoN
; ~~breakN:
; (命令は0~10個、条件は1個)
; (最大dn+1回。0回は不可)
;----------------------------------------------------------------
; 無条件分岐
; goto label jbra label
; (noreturnを含む)
;----------------------------------------------------------------
; 条件分岐
; goto <op1>,<op2>,<op3>,cc,label
; op1
; op2
; op3
; jbcc label
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件分岐
; gotoand <op1>,cc1,<op2>,cc2,<op3>,cc3,label
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 label
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件分岐
; gotoor <op1>,cc1,<op2>,cc2,<op3>,cc3,label
; op1
; jbcc1 label
; op2
; jbcc2 label
; op3
; jbcc3 label
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 条件分岐
; if <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbncc ~~else2N
; : :
; elif <op1>,<op2>,<op3>,cc
; jbra ~~endifN
; ~~else2N:
; op1
; op2
; op3
; jbncc ~~else3N
; : :
; elif <op1>,<op2>,<op3>,cc
; ~~else3N:
; op1
; op2
; op3
; jbncc ~~else4N
; : :
; else jbra ~~endifN
; ~~else4N:
; : :
; endif ~~elseMN:
; ~~endifN:
; (命令は0~10個、条件は1個)
; (then節にnoreturnまたはnoreturnを含むマクロを書くとendifにジャンプするコードが省略される)
;----------------------------------------------------------------
; AND条件分岐
; ifand <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 ~~else2N
; op2
; jbncc2 ~~else2N
; op3
; jbncc3 ~~else2N
; : :
; elifand <op1>,cc1,<op2>,cc2,<op3>,cc3
; jbra ~~endifN
; ~~else2N:
; op1
; jbncc1 ~~else3N
; op2
; jbncc2 ~~else3N
; op3
; jbncc3 ~~else3N
; : :
; endif ~~elseMN:
; ~~endifN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件分岐
; ifor <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 @then
; op2
; jbcc2 @then
; op3
; jbncc3 ~~else2N
; @then:
; : :
; elifor <op1>,cc1,<op2>,cc2,<op3>,cc3
; jbra ~~endifN
; ~~else2N:
; op1
; jbcc1 @then
; op2
; jbcc2 @then
; op3
; jbncc3 ~~else3N
; @then:
; : :
; endif ~~elseMN:
; ~~endifN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件リドゥ
; redo jbra ~~redoN
; (noreturnを含む)
; (右に注釈を書くときはredo t)
;----------------------------------------------------------------
; 条件付きリドゥ
; redo <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~redoN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付きリドゥ
; redoand <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~redoN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付きリドゥ
; redoor <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~redoN
; op2
; jbcc2 ~~redoN
; op3
; jbcc3 ~~redoN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件2段リドゥ
; redo2 jbra ~~redoN
; (noreturnを含む)
; (右に注釈を書くときはredo t)
;----------------------------------------------------------------
; 条件付き2段リドゥ
; redo2 <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~redoN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付き2段リドゥ
; redo2and <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~redoN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付き2段リドゥ
; redo2or <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~redoN
; op2
; jbcc2 ~~redoN
; op3
; jbcc3 ~~redoN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件リスタート
; restart jbra ~~startN
; (noreturnを含む)
; (右に注釈を書くときはrestart t)
;----------------------------------------------------------------
; 条件付きリスタート
; restart <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~startN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付きリスタート
; restartand <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~startN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付きリスタート
; restartor <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~startN
; op2
; jbcc2 ~~startN
; op3
; jbcc3 ~~startN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 無条件2段リスタート
; restart2 jbra ~~startN
; (noreturnを含む)
; (右に注釈を書くときはrestart t)
;----------------------------------------------------------------
; 条件付き2段リスタート
; restart2 <op1>,<op2>,<op3>,cc
; op1
; op2
; op3
; jbcc ~~startN
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND条件付き2段リスタート
; restart2and <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbncc1 @else
; op2
; jbncc2 @else
; op3
; jbcc3 ~~startN
; @else:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR条件付き2段リスタート
; restart2or <op1>,cc1,<op2>,cc2,<op3>,cc3
; op1
; jbcc1 ~~startN
; op2
; jbcc2 ~~startN
; op3
; jbcc3 ~~startN
; (命令と条件は2~10組)
;----------------------------------------------------------------
; 前判定ループ
; while <op1>,<op2>,<op3>,cc
; ~~continueN:
; op1
; op2
; op3
; jbncc ~~breakN
; ~~redoN:
; : :
; endwhile jbra ~~continueN
; ~~breakN:
; (命令は0~10個、条件は1個)
;----------------------------------------------------------------
; AND前判定ループ
; whileand <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbncc1 ~~breakN
; op2
; jbncc2 ~~breakN
; op3
; jbncc3 ~~breakN
; ~~redoN:
; : :
; endwhile jbra ~~continueN
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
; OR前判定ループ
; whileor <op1>,cc1,<op2>,cc2,<op3>,cc3
; ~~continueN:
; op1
; jbcc1 @then
; op2
; jbcc2 @then
; op3
; jbncc3 ~~breakN
; @then:
; ~~redoN:
; : :
; endwhile jbra ~~continueN
; ~~breakN:
; (命令と条件は2~10組)
;----------------------------------------------------------------
~~DO equ 1 ;do~while
~~DOSTART equ 2 ;dostart~while
~~ELSE equ 3 ;else~endif。枝番は節
~~FOR equ 4 ;for~next
~~FORLONG equ 5 ;forlong~next
~~FORSTART equ 6 ;forstart~next
~~FORSTARTLONG equ 7 ;forstartlong~next
~~IF equ 8 ;if~elif~else。枝番は節
~~WHILE equ 9 ;while~endwhile
~~BRANCH equ 100000 ;枝番の係数
~~usedBlocks = 0 ;使ったブロックの数。0=なし
~~blockDepth = 0 ;ブロックの深さ。0=なし
~~blockNumber = 0 ;枝番*~~BRANCH+最も内側のブロックの番号
~~blockType = 0 ;最も内側のブロックの種類
~~blockNoReturn = 0 ;最も内側のブロックのnoreturnの有無
;~~blockNumber%~~blockDepth ;~~blockNumberのスタック
;~~blockType%~~blockDepth ;~~blockTypeのスタック
;~~blockNoReturn%~~blockDepth ;~~blockNoReturnのスタック
~~loopDepth = 0 ;ループの深さ。0=なし
~~loopNumber = 0 ;最も内側のループのブロックの番号
~~loopType = 0 ;最も内側のループのブロックの種類
;~~loopNumber%~~loopDepth ;~~loopNumberのスタック
;~~loopType%~~loopDepth ;~~loopTypeのスタック
~~forDepth = 0 ;for~nextの深さ。0=なし
~~forDn reg d0 ;最も内側のfor~nextのdn
;~~forDn%~~forDepth ;~~forDnのスタック
;----------------------------------------------------------------
bf .macro label
.endm
bnt .macro label
.endm
jbf .macro label
.endm
jbnt .macro label
.endm
;----------------------------------------------------------------
bnf .macro label
.sizem sz,cn
bra&sz label
.endm
bt .macro label
.sizem sz,cn
bra&sz label
.endm
jbnf .macro label
.sizem sz,cn
jbra&sz label
.endm
jbt .macro label
.sizem sz,cn
jbra&sz label
.endm
;----------------------------------------------------------------
.irp %cc,f,t,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
bnn%cc .macro label
.sizem sz,cn
b%cc&sz label
.endm
dbnn%cc .macro dn,label
.sizem sz,cn
db%cc&sz dn,label
.endm
jbnn%cc .macro label
.sizem sz,cn
jb%cc&sz label
.endm
snn%cc .macro ea
.sizem sz,cn
s%cc&sz ea
.endm
.endm
;----------------------------------------------------------------
jmp .macro ea
.sall
~~blockNoReturn = 1
.lall
.jmp ea
.endm
rtd .macro imm
.sall
~~blockNoReturn = 1
.lall
.rtd imm
.endm
rte .macro
.sall
~~blockNoReturn = 1
.lall
.rte
.endm
rtr .macro
.sall
~~blockNoReturn = 1
.lall
.rtr
.endm
rts .macro
.sall
~~blockNoReturn = 1
.lall
.rts
.endm
;----------------------------------------------------------------
break .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;breakに対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
.lall
jbra ~~break%~~loopNumber
.sall
.elif cn=1
.lall
jb&op1 ~~break%~~loopNumber
.sall
.elif cn=2
.lall
op1
jb&op2 ~~break%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jb&op3 ~~break%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jb&op4 ~~break%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jb&op5 ~~break%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jb&op6 ~~break%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jb&op7 ~~break%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 ~~break%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 ~~break%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 ~~break%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 ~~break%~~loopNumber
.sall
.else
.lall
.fail 1 ;breakの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
breakand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;breakandに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;breakandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
jb&cc2 ~~break%~~loopNumber
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 ~~break%~~loopNumber
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 ~~break%~~loopNumber
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 ~~break%~~loopNumber
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 ~~break%~~loopNumber
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 ~~break%~~loopNumber
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 ~~break%~~loopNumber
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 ~~break%~~loopNumber
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 ~~break%~~loopNumber
@else:
.sall
.else
.lall
.fail 1 ;breakandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
breakor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;breakorに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;breakorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
op6
jb&cc6 ~~break%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
op6
jb&cc6 ~~break%~~loopNumber
op7
jb&cc7 ~~break%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
op6
jb&cc6 ~~break%~~loopNumber
op7
jb&cc7 ~~break%~~loopNumber
op8
jb&cc8 ~~break%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
op6
jb&cc6 ~~break%~~loopNumber
op7
jb&cc7 ~~break%~~loopNumber
op8
jb&cc8 ~~break%~~loopNumber
op9
jb&cc9 ~~break%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~break%~~loopNumber
op2
jb&cc2 ~~break%~~loopNumber
op3
jb&cc3 ~~break%~~loopNumber
op4
jb&cc4 ~~break%~~loopNumber
op5
jb&cc5 ~~break%~~loopNumber
op6
jb&cc6 ~~break%~~loopNumber
op7
jb&cc7 ~~break%~~loopNumber
op8
jb&cc8 ~~break%~~loopNumber
op9
jb&cc9 ~~break%~~loopNumber
op10
jb&cc10 ~~break%~~loopNumber
.sall
.else
.lall
.fail 1 ;breakorの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
break2 .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;break2に対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jbra ~~break%~i
.sall
.elif cn=1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op1 ~~break%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op2 ~~break%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op3 ~~break%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op4 ~~break%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op5 ~~break%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op6 ~~break%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op7 ~~break%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op8 ~~break%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op9 ~~break%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op10 ~~break%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op11 ~~break%~i
.sall
.else
.lall
.fail 1 ;break2の引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
break2and .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;break2andに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;break2andの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~break%~i
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~break%~i
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~break%~i
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~break%~i
@else:
.sall
.else
.lall
.fail 1 ;break2andの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
break2or .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;break2orに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;break2orの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~break%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~break%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~break%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~break%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~break%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~break%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~break%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~break%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~break%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~break%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~break%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~break%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~break%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~break%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~break%~i
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~break%~i
.sall
.else
.lall
.fail 1 ;break2orの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continue .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;continueに対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
.lall
jbra ~~continue%~~loopNumber
.sall
.elif cn=1
.lall
jb&op1 ~~continue%~~loopNumber
.sall
.elif cn=2
.lall
op1
jb&op2 ~~continue%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jb&op3 ~~continue%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jb&op4 ~~continue%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jb&op5 ~~continue%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jb&op6 ~~continue%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jb&op7 ~~continue%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 ~~continue%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 ~~continue%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 ~~continue%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 ~~continue%~~loopNumber
.sall
.else
.lall
.fail 1 ;continueの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continueand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;continueandに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;continueandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
jb&cc2 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 ~~continue%~~loopNumber
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 ~~continue%~~loopNumber
@else:
.sall
.else
.lall
.fail 1 ;continueandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continueor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;continueorに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;continueorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
op6
jb&cc6 ~~continue%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
op6
jb&cc6 ~~continue%~~loopNumber
op7
jb&cc7 ~~continue%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
op6
jb&cc6 ~~continue%~~loopNumber
op7
jb&cc7 ~~continue%~~loopNumber
op8
jb&cc8 ~~continue%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
op6
jb&cc6 ~~continue%~~loopNumber
op7
jb&cc7 ~~continue%~~loopNumber
op8
jb&cc8 ~~continue%~~loopNumber
op9
jb&cc9 ~~continue%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~continue%~~loopNumber
op2
jb&cc2 ~~continue%~~loopNumber
op3
jb&cc3 ~~continue%~~loopNumber
op4
jb&cc4 ~~continue%~~loopNumber
op5
jb&cc5 ~~continue%~~loopNumber
op6
jb&cc6 ~~continue%~~loopNumber
op7
jb&cc7 ~~continue%~~loopNumber
op8
jb&cc8 ~~continue%~~loopNumber
op9
jb&cc9 ~~continue%~~loopNumber
op10
jb&cc10 ~~continue%~~loopNumber
.sall
.else
.lall
.fail 1 ;continueorの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continue2 .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;continue2に対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jbra ~~continue%~i
.sall
.elif cn=1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op1 ~~continue%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op2 ~~continue%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op3 ~~continue%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op4 ~~continue%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op5 ~~continue%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op6 ~~continue%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op7 ~~continue%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op8 ~~continue%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op9 ~~continue%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op10 ~~continue%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op11 ~~continue%~i
.sall
.else
.lall
.fail 1 ;continue2の引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continue2and .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;continue2andに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;continue2andの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~continue%~i
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~continue%~i
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~continue%~i
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~continue%~i
@else:
.sall
.else
.lall
.fail 1 ;continue2andの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
continue2or .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;continue2orに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;continue2orの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~continue%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~continue%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~continue%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~continue%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~continue%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~continue%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~continue%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~continue%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~continue%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~continue%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~continue%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~continue%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~continue%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~continue%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~continue%~i
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~continue%~i
.sall
.else
.lall
.fail 1 ;continue2orの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
do .macro
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~DO
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~DO
.lall
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
docontinue .macro
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~DO
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~DO
.lall
jbra ~~continue%~~loopNumber
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
dostart .macro
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~DOSTART
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~DOSTART
.lall
jbra ~~start%~~loopNumber
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
elif .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~blockType<>~~IF
.lall
.fail 1 ;elifに対応するif*,elif*がない
.exitm
.endif
~~blockNumber = ~~blockNumber+~~BRANCH
;~~blockType = ~~IF
.if ~~blockNoReturn=0
~j = ~~blockNumber.mod.~~BRANCH
.lall
jbra ~~endif%~j
.sall
.endif
~~blockNoReturn = 0
.lall
~~else%~~blockNumber:
.if cn=0
.lall
.fail 1 ;elifの引数が足りない
.exitm
.elif cn=1
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op1 ~~else%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op2 ~~else%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op3 ~~else%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op4 ~~else%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op5 ~~else%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op6 ~~else%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op7 ~~else%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op8 ~~else%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op9 ~~else%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op10 ~~else%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op11 ~~else%~i
.sall
.else
.lall
.fail 1 ;elifの引数が多すぎる
.exitm
.endif
.endm
;----------------------------------------------------------------
elifand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~blockType<>~~IF
.lall
.fail 1 ;elifandに対応するif*,elif*がない
.exitm
.endif
~~blockNumber = ~~blockNumber+~~BRANCH
;~~blockType = ~~IF
.if ~~blockNoReturn=0
~j = ~~blockNumber.mod.~~BRANCH
.lall
jbra ~~endif%~j
.sall
.endif
~~blockNoReturn = 0
.lall
~~else%~~blockNumber:
.sall
.if cn<=2
.lall
.fail 1 ;elifandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc10 ~~else%~i
.sall
.else
.lall
.fail 1 ;elifandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
elifor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~blockType<>~~IF
.lall
.fail 1 ;eliforに対応するif*,elif*がない
.exitm
.endif
~~blockNumber = ~~blockNumber+~~BRANCH
;~~blockType = ~~IF
.if ~~blockNoReturn=0
~j = ~~blockNumber.mod.~~BRANCH
.lall
jbra ~~endif%~j
.sall
.endif
~~blockNoReturn = 0
.lall
~~else%~~blockNumber:
.sall
.if cn<=2
.lall
.fail 1 ;eliforの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 @then
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
@then:
.sall
.elif cn<=6
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
@then:
.sall
.elif cn<=8
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
@then:
.sall
.elif cn<=10
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
@then:
.sall
.elif cn<=12
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
@then:
.sall
.elif cn<=14
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
@then:
.sall
.elif cn<=16
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
@then:
.sall
.elif cn<=18
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
jb&cc8 @then
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
@then:
.sall
.elif cn<=20
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
jb&cc8 @then
op9
jb&cc9 @then
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc10 ~~else%~i
@then:
.sall
.else
.lall
.fail 1 ;eliforの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
else .macro
.sall
.if ~~blockType<>~~IF
.lall
.fail 1 ;elseに対応するif*,elif*がない
.exitm
.endif
~~blockNumber = ~~blockNumber+~~BRANCH
~~blockType = ~~ELSE
.if ~~blockNoReturn=0
~j = ~~blockNumber.mod.~~BRANCH
.lall
jbra ~~endif%~j
.sall
.endif
~~blockNoReturn = 0
.lall
~~else%~~blockNumber:
.endm
;----------------------------------------------------------------
endif .macro
.sall
.if (~~blockType<>~~IF).and.(~~blockType<>~~ELSE)
.lall
.fail 1 ;endifに対応するif*,elif*,elseがない
.exitm
.endif
~~blockNumber = ~~blockNumber+~~BRANCH
~j = ~~blockNumber.mod.~~BRANCH
.lall
~~else%~~blockNumber:
~~endif%~j:
.sall
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.lall
.endm
;----------------------------------------------------------------
endwhile .macro
.sall
.if ~~blockType<>~~WHILE
.lall
.fail 1 ;endwhileに対応するwhileがない
.exitm
.endif
.lall
jbra ~~continue%~~loopNumber
~~break%~~loopNumber:
.sall
~~loopDepth = ~~loopDepth-1
~~loopNumber = ~~loopNumber%~~loopDepth
~~loopType = ~~loopType%~~loopDepth
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.lall
.endm
;----------------------------------------------------------------
for .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FOR
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FOR
~~forDn reg dn
.lall
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
forcontinue .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forcontinueの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forcontinueの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FOR
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FOR
~~forDn reg dn
.lall
jbra ~~continue%~~loopNumber
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
forcontinuelong .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forcontinuelongの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forcontinuelongの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FORLONG
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FORLONG
~~forDn reg dn
.lall
jbra ~~continue%~~loopNumber
~~longredo%~~loopNumber:
swap ~~forDn
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
forlong .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forlongの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forlongの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FORLONG
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FORLONG
~~forDn reg dn
.lall
swap ~~forDn
~~longredo%~~loopNumber:
swap ~~forDn
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
forstart .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forstartの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forstartの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FORSTART
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FORSTART
~~forDn reg dn
.lall
jbra ~~start%~~loopNumber
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
forstartlong .macro dn
.sizem sz,cn
.sall
.if cn<1
.lall
.fail 1 ;forstartlongの引数が足りない
.exitm
.elif 1<cn
.lall
.fail 1 ;forstartlongの引数が多すぎる
.exitm
.endif
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~forDn%~~forDepth reg ~~forDn
~~forDepth = ~~forDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~FORSTARTLONG
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~FORSTARTLONG
~~forDn reg dn
.lall
jbra ~~start%~~loopNumber
~~longredo%~~loopNumber:
swap ~~forDn
~~redo%~~loopNumber:
.endm
;----------------------------------------------------------------
goto .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11,op12 ;最後はcc,label
.sizem sz,cn
.sall
.if cn=0
.lall
.fail 1 ;gotoの引数が足りない
.exitm
.elif cn=1
~~blockNoReturn = 1
.lall
jbra op1
.sall
.elif cn=2
.lall
jb&op1 op2
.sall
.elif cn=3
.lall
op1
jb&op2 op3
.sall
.elif cn=4
.lall
op1
op2
jb&op3 op4
.sall
.elif cn=5
.lall
op1
op2
op3
jb&op4 op5
.sall
.elif cn=6
.lall
op1
op2
op3
op4
jb&op5 op6
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
jb&op6 op7
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
jb&op7 op8
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 op9
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 op10
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 op11
.sall
.elif cn=12
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 op12
.sall
.else
.lall
.fail 1 ;gotoの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
gotoand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10,op11 ;最後はlabel
.sizem sz,cn
.sall
.if cn<=3
.lall
.fail 1 ;gotoandの引数が足りない
.exitm
.elif cn<=5
.lall
op1
jbn&cc1 @else
op2
jb&cc2 op3
@else:
.sall
.elif cn<=7
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 op4
@else:
.sall
.elif cn<=9
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 op5
@else:
.sall
.elif cn<=11
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 op6
@else:
.sall
.elif cn<=13
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 op7
@else:
.sall
.elif cn<=15
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 op8
@else:
.sall
.elif cn<=17
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 op9
@else:
.sall
.elif cn<=19
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 op10
@else:
.sall
.elif cn<=21
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 op11
@else:
.sall
.else
.lall
.fail 1 ;gotoandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
gotoor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10,op11 ;最後はlabel
.sizem sz,cn
.sall
.if cn<=3
.lall
.fail 1 ;gotoorの引数が足りない
.exitm
.elif cn<=5
.lall
op1
jb&cc1 op3
op2
jb&cc2 op3
.sall
.elif cn<=7
.lall
op1
jb&cc1 op4
op2
jb&cc2 op4
op3
jb&cc3 op4
.sall
.elif cn<=9
.lall
op1
jb&cc1 op5
op2
jb&cc2 op5
op3
jb&cc3 op5
op4
jb&cc4 op5
.sall
.elif cn<=11
.lall
op1
jb&cc1 op6
op2
jb&cc2 op6
op3
jb&cc3 op6
op4
jb&cc4 op6
op5
jb&cc5 op6
.sall
.elif cn<=13
.lall
op1
jb&cc1 op7
op2
jb&cc2 op7
op3
jb&cc3 op7
op4
jb&cc4 op7
op5
jb&cc5 op7
op6
jb&cc6 op7
.sall
.elif cn<=15
.lall
op1
jb&cc1 op8
op2
jb&cc2 op8
op3
jb&cc3 op8
op4
jb&cc4 op8
op5
jb&cc5 op8
op6
jb&cc6 op8
op7
jb&cc7 op8
.sall
.elif cn<=17
.lall
op1
jb&cc1 op9
op2
jb&cc2 op9
op3
jb&cc3 op9
op4
jb&cc4 op9
op5
jb&cc5 op9
op6
jb&cc6 op9
op7
jb&cc7 op9
op8
jb&cc8 op9
.sall
.elif cn<=19
.lall
op1
jb&cc1 op10
op2
jb&cc2 op10
op3
jb&cc3 op10
op4
jb&cc4 op10
op5
jb&cc5 op10
op6
jb&cc6 op10
op7
jb&cc7 op10
op8
jb&cc8 op10
op9
jb&cc9 op10
.sall
.elif cn<=21
.lall
op1
jb&cc1 op11
op2
jb&cc2 op11
op3
jb&cc3 op11
op4
jb&cc4 op11
op5
jb&cc5 op11
op6
jb&cc6 op11
op7
jb&cc7 op11
op8
jb&cc8 op11
op9
jb&cc9 op11
op10
jb&cc10 op11
.sall
.else
.lall
.fail 1 ;gotoorの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
if .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks+~~BRANCH
~~blockType = ~~IF
~~blockNoReturn = 0
.if cn=0
.lall
.fail 1 ;ifの引数が足りない
.exitm
.elif cn=1
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op1 ~~else%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op2 ~~else%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op3 ~~else%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op4 ~~else%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op5 ~~else%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op6 ~~else%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op7 ~~else%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op8 ~~else%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op9 ~~else%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op10 ~~else%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&op11 ~~else%~i
.sall
.else
.lall
.fail 1 ;ifの引数が多すぎる
.exitm
.endif
.lall
@then:
.endm
;----------------------------------------------------------------
ifand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks+~~BRANCH
~~blockType = ~~IF
~~blockNoReturn = 0
.if cn<=2
.lall
.fail 1 ;ifandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc1 ~~else%~i
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc10 ~~else%~i
.sall
.else
.lall
.fail 1 ;ifandの引数が多すぎる
.exitm
.endif
.lall
@then:
.endm
;----------------------------------------------------------------
ifor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks+~~BRANCH
~~blockType = ~~IF
~~blockNoReturn = 0
.if cn<=2
.lall
.fail 1 ;iforの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 @then
op2
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc2 ~~else%~i
@then:
.sall
.elif cn<=6
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc3 ~~else%~i
@then:
.sall
.elif cn<=8
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc4 ~~else%~i
@then:
.sall
.elif cn<=10
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc5 ~~else%~i
@then:
.sall
.elif cn<=12
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc6 ~~else%~i
@then:
.sall
.elif cn<=14
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc7 ~~else%~i
@then:
.sall
.elif cn<=16
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc8 ~~else%~i
@then:
.sall
.elif cn<=18
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
jb&cc8 @then
op9
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc9 ~~else%~i
@then:
.sall
.elif cn<=20
.lall
op1
jb&cc1 @then
op2
jb&cc2 @then
op3
jb&cc3 @then
op4
jb&cc4 @then
op5
jb&cc5 @then
op6
jb&cc6 @then
op7
jb&cc7 @then
op8
jb&cc8 @then
op9
jb&cc9 @then
op10
.sall
~i = ~~blockNumber+~~BRANCH
.lall
jbn&cc10 ~~else%~i
@then:
.sall
.else
.lall
.fail 1 ;iforの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
next .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if (~~blockType<>~~FOR).and.(~~blockType<>~~FORSTART).and.(~~blockType<>~~FORLONG).and.(~~blockType<>~~FORSTARTLONG)
.lall
.fail 1 ;nextに対応するfor*がない
.exitm
.endif
.lall
~~continue%~~loopNumber:
.sall
.if 2<=cn
.lall
op1
.sall
.if 3<=cn
.lall
op2
.sall
.if 4<=cn
.lall
op3
.sall
.if 5<=cn
.lall
op4
.sall
.if 6<=cn
.lall
op5
.sall
.if 7<=cn
.lall
op6
.sall
.if 8<=cn
.lall
op7
.sall
.if 9<=cn
.lall
op8
.sall
.if 10<=cn
.lall
op9
.sall
.if 11<=cn
.lall
op10
.sall
.endif
.endif
.endif
.endif
.endif
.endif
.endif
.endif
.endif
.endif
.if cn=0
.lall
dbra ~~forDn,~~redo%~~loopNumber
.sall
.elif cn=1
.lall
dbn&op1 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op1 ~~break%~~loopNumber
.sall
.endif
.elif cn=2
.lall
dbn&op2 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op2 ~~break%~~loopNumber
.sall
.endif
.elif cn=3
.lall
dbn&op3 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op3 ~~break%~~loopNumber
.sall
.endif
.elif cn=4
.lall
dbn&op4 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op4 ~~break%~~loopNumber
.sall
.endif
.elif cn=5
.lall
dbn&op5 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op5 ~~break%~~loopNumber
.sall
.endif
.elif cn=6
.lall
dbn&op6 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op6 ~~break%~~loopNumber
.sall
.endif
.elif cn=7
.lall
dbn&op7 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op7 ~~break%~~loopNumber
.sall
.endif
.elif cn=8
.lall
dbn&op8 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op8 ~~break%~~loopNumber
.sall
.endif
.elif cn=9
.lall
dbn&op9 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op9 ~~break%~~loopNumber
.sall
.endif
.elif cn=10
.lall
dbn&op10 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op10 ~~break%~~loopNumber
.sall
.endif
.elif cn=11
.lall
dbn&op11 ~~forDn,~~redo%~~loopNumber
.sall
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
bn&op11 ~~break%~~loopNumber
.sall
.endif
.else
.lall
.fail 1 ;nextの引数が多すぎる
.exitm
.endif
.if (~~blockType=~~FORLONG).or.(~~blockType=~~FORSTARTLONG)
.lall
swap ~~forDn
dbra ~~forDn,~~longredo%~~loopNumber
.sall
.endif
.lall
~~break%~~loopNumber:
.sall
~~forDepth = ~~forDepth-1
~~forDn reg ~~forDn%~~forDepth
~~loopDepth = ~~loopDepth-1
~~loopNumber = ~~loopNumber%~~loopDepth
~~loopType = ~~loopType%~~loopDepth
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.lall
.endm
;----------------------------------------------------------------
noreturn .macro
.sall
.if (~~blockType<>~~IF).and.(~~blockType<>~~ELSE)
.lall
.fail 1 ;noreturnに対応するif*,elif*,elseがない
.exitm
.endif
~~blockNoReturn = 1
.lall
.endm
;----------------------------------------------------------------
redo .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;redoに対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
.lall
jbra ~~redo%~~loopNumber
.sall
.elif cn=1
.lall
jb&op1 ~~redo%~~loopNumber
.sall
.elif cn=2
.lall
op1
jb&op2 ~~redo%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jb&op3 ~~redo%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jb&op4 ~~redo%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jb&op5 ~~redo%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jb&op6 ~~redo%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jb&op7 ~~redo%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 ~~redo%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 ~~redo%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 ~~redo%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 ~~redo%~~loopNumber
.sall
.else
.lall
.fail 1 ;redoの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
redoand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;redoandに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;redoandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
jb&cc2 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 ~~redo%~~loopNumber
@else:
.sall
.else
.lall
.fail 1 ;redoandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
redoor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;redoorに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;redoorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jb&cc9 ~~redo%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jb&cc9 ~~redo%~~loopNumber
op10
jb&cc10 ~~redo%~~loopNumber
.sall
.else
.lall
.fail 1 ;redoorの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
redo2 .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;redo2に対応するループがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jbra ~~redo%~i
.sall
.elif cn=1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op1 ~~redo%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op2 ~~redo%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op3 ~~redo%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op4 ~~redo%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op5 ~~redo%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op6 ~~redo%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op7 ~~redo%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op8 ~~redo%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op9 ~~redo%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op10 ~~redo%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op11 ~~redo%~i
.sall
.else
.lall
.fail 1 ;redo2の引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
redo2and .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;redo2andに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;redo2andの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~redo%~i
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~redo%~i
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~redo%~i
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~redo%~i
@else:
.sall
.else
.lall
.fail 1 ;redo2andの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
redo2or .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;redo2orに対応するループがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;redo2orの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~redo%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~redo%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~redo%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~redo%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~redo%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~redo%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~redo%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~redo%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~redo%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~redo%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~redo%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~redo%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~redo%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~redo%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~redo%~i
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~redo%~i
.sall
.else
.lall
.fail 1 ;redo2orの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restart .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;restartに対応するループがない
.exitm
.endif
~i = ~~loopNumber
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restartに対応する*startがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
.lall
jbra ~~start%~~loopNumber
.sall
.elif cn=1
.lall
jb&op1 ~~start%~~loopNumber
.sall
.elif cn=2
.lall
op1
jb&op2 ~~start%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jb&op3 ~~start%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jb&op4 ~~start%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jb&op5 ~~start%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jb&op6 ~~start%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jb&op7 ~~start%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 ~~start%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 ~~start%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 ~~start%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 ~~start%~~loopNumber
.sall
.else
.lall
.fail 1 ;restartの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restartand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;restartandに対応するループがない
.exitm
.endif
~i = ~~loopNumber
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restartandに対応する*startがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;restartandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
jb&cc2 ~~start%~~loopNumber
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 ~~start%~~loopNumber
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 ~~start%~~loopNumber
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 ~~start%~~loopNumber
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 ~~start%~~loopNumber
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 ~~start%~~loopNumber
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 ~~start%~~loopNumber
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 ~~start%~~loopNumber
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 ~~start%~~loopNumber
@else:
.sall
.else
.lall
.fail 1 ;restartandの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restartor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;restartorに対応するループがない
.exitm
.endif
~i = ~~loopNumber
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restartorに対応する*startがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;restartorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
op6
jb&cc6 ~~start%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
op6
jb&cc6 ~~start%~~loopNumber
op7
jb&cc7 ~~start%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
op6
jb&cc6 ~~start%~~loopNumber
op7
jb&cc7 ~~start%~~loopNumber
op8
jb&cc8 ~~start%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
op6
jb&cc6 ~~start%~~loopNumber
op7
jb&cc7 ~~start%~~loopNumber
op8
jb&cc8 ~~start%~~loopNumber
op9
jb&cc9 ~~start%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~start%~~loopNumber
op2
jb&cc2 ~~start%~~loopNumber
op3
jb&cc3 ~~start%~~loopNumber
op4
jb&cc4 ~~start%~~loopNumber
op5
jb&cc5 ~~start%~~loopNumber
op6
jb&cc6 ~~start%~~loopNumber
op7
jb&cc7 ~~start%~~loopNumber
op8
jb&cc8 ~~start%~~loopNumber
op9
jb&cc9 ~~start%~~loopNumber
op10
jb&cc10 ~~start%~~loopNumber
.sall
.else
.lall
.fail 1 ;restartorの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restart2 .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;restart2に対応するループがない
.exitm
.endif
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restart2に対応する*startがない
.exitm
.endif
.if cn=0
~~blockNoReturn = 1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jbra ~~start%~i
.sall
.elif cn=1
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op1 ~~start%~i
.sall
.elif cn=2
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op2 ~~start%~i
.sall
.elif cn=3
.lall
op1
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op3 ~~start%~i
.sall
.elif cn=4
.lall
op1
op2
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op4 ~~start%~i
.sall
.elif cn=5
.lall
op1
op2
op3
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op5 ~~start%~i
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op6 ~~start%~i
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op7 ~~start%~i
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op8 ~~start%~i
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op9 ~~start%~i
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op10 ~~start%~i
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&op11 ~~start%~i
.sall
.else
.lall
.fail 1 ;restart2の引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restart2and .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;restart2andに対応するループがない
.exitm
.endif
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restart2andに対応する*startがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;restart2andの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~start%~i
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~start%~i
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~start%~i
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~start%~i
@else:
.sall
.else
.lall
.fail 1 ;restart2andの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
restart2or .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if ~~loopDepth<=1
.lall
.fail 1 ;restart2orに対応するループがない
.exitm
.endif
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.if (~~blockType%~i<>~~DOSTART).and.(~~blockType%~i<>~~FORSTART).and.(~~blockType%~i<>~~FORSTARTLONG)
.lall
.fail 1 ;restart2orに対応する*startがない
.exitm
.endif
.if cn<=2
.lall
.fail 1 ;restart2orの引数が足りない
.exitm
.elif cn<=4
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
.sall
.elif cn<=6
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
.sall
.elif cn<=8
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
.sall
.elif cn<=10
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
.sall
.elif cn<=12
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
.sall
.elif cn<=14
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~start%~i
.sall
.elif cn<=16
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~start%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~start%~i
.sall
.elif cn<=18
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~start%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~start%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~start%~i
.sall
.elif cn<=20
.lall
op1
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc1 ~~start%~i
op2
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc2 ~~start%~i
op3
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc3 ~~start%~i
op4
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc4 ~~start%~i
op5
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc5 ~~start%~i
op6
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc6 ~~start%~i
op7
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc7 ~~start%~i
op8
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc8 ~~start%~i
op9
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc9 ~~start%~i
op10
.sall
~i = ~~loopDepth-1
~i = ~~loopNumber%~i
.lall
jb&cc10 ~~start%~i
.sall
.else
.lall
.fail 1 ;restart2orの引数が多すぎる
.exitm
.endif
.lall
.endm
;----------------------------------------------------------------
start .macro
.sizem sz,cn
.sall
.if ~~loopDepth=0
.lall
.fail 1 ;startに対応するループがない
.exitm
.endif
.if cn<>0
.lall
.fail 1 ;startの引数が多すぎる
.exitm
.endif
.if (~~blockType<>~~DOSTART).and.(~~blockType<>~~FORSTART).and.(~~blockType<>~~FORSTARTLONG)
.lall
.fail 1 ;startに対応する*startがない
.exitm
.endif
.lall
~~start%~~blockNumber:
.endm
;----------------------------------------------------------------
while .macro op1,op2,op3,op4,op5,op6,op7,op8,op9,op10,op11 ;最後はcc
.sizem sz,cn
.sall
.if (~~blockType=~~DO).or.(~~blockType=~~DOSTART)
;do~while
.lall
~~continue%~~loopNumber:
.sall
.if cn=0
.lall
.fail 1 ;whileの引数が足りない
.exitm
.elif cn=1
.lall
jb&op1 ~~redo%~~loopNumber
.sall
.elif cn=2
.lall
op1
jb&op2 ~~redo%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jb&op3 ~~redo%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jb&op4 ~~redo%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jb&op5 ~~redo%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jb&op6 ~~redo%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jb&op7 ~~redo%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jb&op8 ~~redo%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jb&op9 ~~redo%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jb&op10 ~~redo%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jb&op11 ~~redo%~~loopNumber
.sall
.else
.lall
.fail 1 ;whileの引数が多すぎる
.exitm
.endif
.lall
~~break%~~loopNumber:
.sall
~~loopDepth = ~~loopDepth-1
~~loopNumber = ~~loopNumber%~~loopDepth
~~loopType = ~~loopType%~~loopDepth
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.else
;while~endwhile
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~WHILE
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~WHILE
.lall
~~continue%~~loopNumber:
.sall
.if cn=0
.lall
.fail 1 ;whileの引数が足りない
.exitm
.elif cn=1
.lall
jbn&op1 ~~break%~~loopNumber
.sall
.elif cn=2
.lall
op1
jbn&op2 ~~break%~~loopNumber
.sall
.elif cn=3
.lall
op1
op2
jbn&op3 ~~break%~~loopNumber
.sall
.elif cn=4
.lall
op1
op2
op3
jbn&op4 ~~break%~~loopNumber
.sall
.elif cn=5
.lall
op1
op2
op3
op4
jbn&op5 ~~break%~~loopNumber
.sall
.elif cn=6
.lall
op1
op2
op3
op4
op5
jbn&op6 ~~break%~~loopNumber
.sall
.elif cn=7
.lall
op1
op2
op3
op4
op5
op6
jbn&op7 ~~break%~~loopNumber
.sall
.elif cn=8
.lall
op1
op2
op3
op4
op5
op6
op7
jbn&op8 ~~break%~~loopNumber
.sall
.elif cn=9
.lall
op1
op2
op3
op4
op5
op6
op7
op8
jbn&op9 ~~break%~~loopNumber
.sall
.elif cn=10
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
jbn&op10 ~~break%~~loopNumber
.sall
.elif cn=11
.lall
op1
op2
op3
op4
op5
op6
op7
op8
op9
op10
jbn&op11 ~~break%~~loopNumber
.sall
.else
.lall
.fail 1 ;whileの引数が多すぎる
.exitm
.endif
.lall
~~redo%~~loopNumber:
.sall
.endif
.lall
.endm
;----------------------------------------------------------------
whileand .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if (~~blockType=~~DO).or.(~~blockType=~~DOSTART)
;do~while
.lall
~~continue%~~loopNumber:
.sall
.if cn<=2
.lall
.fail 1 ;whileandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 @else
op2
jb&cc2 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=6
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jb&cc3 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=8
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jb&cc4 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=10
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jb&cc5 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=12
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jb&cc6 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=14
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jb&cc7 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=16
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jb&cc8 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=18
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jb&cc9 ~~redo%~~loopNumber
@else:
.sall
.elif cn<=20
.lall
op1
jbn&cc1 @else
op2
jbn&cc2 @else
op3
jbn&cc3 @else
op4
jbn&cc4 @else
op5
jbn&cc5 @else
op6
jbn&cc6 @else
op7
jbn&cc7 @else
op8
jbn&cc8 @else
op9
jbn&cc9 @else
op10
jb&cc10 ~~redo%~~loopNumber
@else:
.sall
.else
.lall
.fail 1 ;whileandの引数が多すぎる
.exitm
.endif
.lall
~~break%~~loopNumber:
.sall
~~loopDepth = ~~loopDepth-1
~~loopNumber = ~~loopNumber%~~loopDepth
~~loopType = ~~loopType%~~loopDepth
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.else
;while~endwhile
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~WHILE
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~WHILE
.lall
~~continue%~~loopNumber:
.sall
.if cn<=2
.lall
.fail 1 ;whileandの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
op7
jbn&cc7 ~~break%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
op7
jbn&cc7 ~~break%~~loopNumber
op8
jbn&cc8 ~~break%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
op7
jbn&cc7 ~~break%~~loopNumber
op8
jbn&cc8 ~~break%~~loopNumber
op9
jbn&cc9 ~~break%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jbn&cc1 ~~break%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
op7
jbn&cc7 ~~break%~~loopNumber
op8
jbn&cc8 ~~break%~~loopNumber
op9
jbn&cc9 ~~break%~~loopNumber
op10
jbn&cc10 ~~break%~~loopNumber
.sall
.else
.lall
.fail 1 ;whileandの引数が多すぎる
.exitm
.endif
.lall
~~redo%~~loopNumber:
.sall
.endif
.lall
.endm
;----------------------------------------------------------------
whileor .macro op1,cc1,op2,cc2,op3,cc3,op4,cc4,op5,cc5,op6,cc6,op7,cc7,op8,cc8,op9,cc9,op10,cc10
.sizem sz,cn
.sall
.if (~~blockType=~~DO).or.(~~blockType=~~DOSTART)
;do~while
.lall
~~continue%~~loopNumber:
.sall
.if cn<=2
.lall
.fail 1 ;whileorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jb&cc9 ~~redo%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jb&cc9 ~~redo%~~loopNumber
op10
jb&cc10 ~~redo%~~loopNumber
.sall
.else
.lall
.fail 1 ;whileorの引数が多すぎる
.exitm
.endif
.lall
~~break%~~loopNumber:
.sall
~~loopDepth = ~~loopDepth-1
~~loopNumber = ~~loopNumber%~~loopDepth
~~loopType = ~~loopType%~~loopDepth
~~blockDepth = ~~blockDepth-1
~~blockNumber = ~~blockNumber%~~blockDepth
~~blockType = ~~blockType%~~blockDepth
~~blockNoReturn = ~~blockNoReturn%~~blockDepth
.else
;while~endwhile
~~blockNumber%~~blockDepth = ~~blockNumber
~~blockType%~~blockDepth = ~~blockType
~~blockNoReturn%~~blockDepth = ~~blockNoReturn
~~blockDepth = ~~blockDepth+1
~~loopNumber%~~loopDepth = ~~loopNumber
~~loopType%~~loopDepth = ~~loopType
~~loopDepth = ~~loopDepth+1
~~usedBlocks = ~~usedBlocks+1
~~blockNumber = ~~usedBlocks
~~blockType = ~~WHILE
~~blockNoReturn = 0
~~loopNumber = ~~usedBlocks
~~loopType = ~~WHILE
.lall
~~continue%~~loopNumber:
.sall
.if cn<=2
.lall
.fail 1 ;whileorの引数が足りない
.exitm
.elif cn<=4
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jbn&cc2 ~~break%~~loopNumber
.sall
.elif cn<=6
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jbn&cc3 ~~break%~~loopNumber
.sall
.elif cn<=8
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jbn&cc4 ~~break%~~loopNumber
.sall
.elif cn<=10
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jbn&cc5 ~~break%~~loopNumber
.sall
.elif cn<=12
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jbn&cc6 ~~break%~~loopNumber
.sall
.elif cn<=14
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jbn&cc7 ~~break%~~loopNumber
.sall
.elif cn<=16
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jbn&cc8 ~~break%~~loopNumber
.sall
.elif cn<=18
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jbn&cc9 ~~break%~~loopNumber
.sall
.elif cn<=20
.lall
op1
jb&cc1 ~~redo%~~loopNumber
op2
jb&cc2 ~~redo%~~loopNumber
op3
jb&cc3 ~~redo%~~loopNumber
op4
jb&cc4 ~~redo%~~loopNumber
op5
jb&cc5 ~~redo%~~loopNumber
op6
jb&cc6 ~~redo%~~loopNumber
op7
jb&cc7 ~~redo%~~loopNumber
op8
jb&cc8 ~~redo%~~loopNumber
op9
jb&cc9 ~~redo%~~loopNumber
op10
jbn&cc10 ~~break%~~loopNumber
.sall
.else
.lall
.fail 1 ;whileorの引数が多すぎる
.exitm
.endif
.lall
~~redo%~~loopNumber:
.sall
.endif
.lall
.endm
;----------------------------------------------------------------
.endif ;__control2_mac__
.list