CASL IIの課題、その1(提出は今月28日)

問題

CASL IIで二分探索プログラムを書け。なお、探索する配列の要素数は10とする。

僕の回答

KADAI01  START
         IN      BUF,LENG
         LAD     GR0,0
         LD      GR1,LENG
         LD      GR3,BUF
         SUBA    GR3,='0'
         CPA     GR1,=1
         JZE     NM1
         CPA     GR1,=2
         JZE     NM10
;
         LD      GR1,GR3
         SLA     GR1,6
         ADDA    GR0,GR1
         LD      GR1,GR3
         SLA     GR1,5
         ADDA    GR0,GR1
         SLA     GR3,2
         ADDA    GR0,GR3
         LAD     GR2,1
         LD      GR3,BUF,GR2
         SUBA    GR3,='0'
         LD      GR1,GR3
         SLA     GR1,3
         ADDA    GR0,GR1
         SLA     GR3,1
         ADDA    GR0,GR3
         LAD     GR2,2
         LD      GR3,BUF,GR2
         SUBA    GR3,='0'
         ADDA    GR0,GR3
         JUMP    SETTING
NM10     LD      GR1,GR3
         SLA     GR1,3
         ADDA    GR0,GR1
         SLA     GR3,1
         ADDA    GR0,GR3
         LAD     GR2,1
         LD      GR3,BUF,GR2
         SUBA    GR3,='0'
         ADDA    GR0,GR3
         JUMP    SETTING
NM1      ADDA    GR0,GR3
;
SETTING  LAD     GR1,4               ;中央値
         LAD     GR2,0               ;最小値
         LAD     GR3,9               ;最大値
SEARCH   CPA     GR0,DATA,GR1
         JZE     GOAL
         JPL     SEARCHPL
;SEARCHMI
         SUBA    GR1,=1
         LD      GR3,GR1
         ADDA    GR1,GR2
         SRA     GR1,1
         JUMP    JADGE
SEARCHPL ADDA    GR1,=1
         LD      GR2,GR1
         ADDA    GR1,GR3
         SRA     GR1,1
JADGE    CPA     GR3,GR2
         JMI     FAIL
         JUMP    SEARCH
FAIL     LD      GR0,=#FFFF          ;GR0に-1を格納(探索失敗)
         JUMP    FIN
GOAL     LAD     GR0,DATA,GR1        ;GR0に探索値のアドレスを格納(探索成功)
FIN      RET
DATA     DC      0,12,255,372,421,560,687,726,874,999
BUF      DS      3
LENG     DS      1
         END

問題文が短すぎたので、細かい仕様は自分で勝手に決めた。あとで文句言われたって知るもんか。

  • 探索値は3桁までの自然数
  • 配列は昇順に整列済み
  • 探索成功時は値のアドレスを、失敗時は0xFFFFをGR0に格納

ちょっと長すぎる気がするので、もうちょっとシェイプアップしたいところ。