;平成23年秋…割り算プログラム1 ;呼び出し元のメインプログラム MAIN START RPUSH LD GR1,=#0000 ;割られる数の上位語 LD GR2,=#0032 ;その下位語で50 LAD GR3,WARU ;結果領域先頭後 CALL DIV RPOP RET WARU DC #0000 ;割る数上位語 DC #0014 ;割る数下位語で20
;プログラム1 DIV PUSH 0,GR6 PUSH 0,GR7 LD GR6,GR1 ;割られる数の上位語 LD GR7,GR2 ;割られる数の下位語 LD GR1,=#FFFF ;商の初期化 LD GR2,=#FFFF LP LD GR4,GR6 ;割られる数の上位語 LD GR5,GR7 ;割られる数の下位語 ADDL GR2,=1 ;商のカウントアップ JOV ADJ1 ;桁上り処理へジャンプ JUMP CONT ;割り算実行 ADJ1 ADDL GR1,=1 ;桁上り処理実行 CONT SUBL GR6,0,GR3 ;引き算しながら割り算していく JOV FIN SUBL GR7,1,GR3 ;引き算しながら割り算していく JOV ADJ2 JUMP LP ADJ2 SUBL GR6,=1 ;繰り下がり処理 JOV FIN JUMP LP FIN POP GR7 POP GR6 RET END
;平成23年秋…割り算プログラム2 ;呼び出し元のメインプログラム MAIN START RPUSH LD GR1,=#0000 ;割られる数の上位語 LD GR2,=#054D ;その下位語で1357 LAD GR3,KEKKA ;結果領域先頭後 CALL BTOD2 ;プログラム2呼び出し OUT KEKKA,LEN ;結果格納領域と文字数 RPOP RET KEKKA DS 5 ;結果格納領域 LEN DC 5 ;出力処理 ;プログラム2 BTOD2 RPUSH LD GR6,GR3 LAD GR7,4,GR3 ;結果格納領域の末尾アドレス LAD GR3,UDAT ;除数の初期設定 LP2 CALL DIV ;プログラム1DIV呼び出し OR GR2,=’0′ ;数字列に変換 ST GR2,0,GR6 ;10進数字1文字格納 CPL GR6,GR7 ;末尾まで処理したか JZE FIN2 LAD GR6,1,GR6 LD GR1,GR4 ;割られる数の再設定 LD GR2,GR5 ;剰余をGR2へ LAD GR3,2,GR3 ;割る数を2つ先へ JUMP LP2 FIN2 RPOP RET UDAT DC 0 DC #2710 DC 0 DC #03E8 DC 0 DC #0064 DC 0 DC #000A DC 0 DC 1
;プログラム1 DIV PUSH 0,GR6 PUSH 0,GR7 LD GR6,GR1 ;割られる数の上位語 LD GR7,GR2 ;割られる数の下位語 LD GR1,=#FFFF ;商の初期化 LD GR2,=#FFFF LP LD GR4,GR6 ;割られる数の上位語 LD GR5,GR7 ;割られる数の下位語 ADDL GR2,=1 ;商のカウントアップ JOV ADJ1 ;桁上り処理へジャンプ JUMP CONT ;割り算実行 ADJ1 ADDL GR1,=1 ;桁上り処理実行 CONT SUBL GR6,0,GR3 ;引き算しながら割り算していく JOV FIN SUBL GR7,1,GR3 ;引き算しながら割り算していく JOV ADJ2 JUMP LP ADJ2 SUBL GR6,=1 ;繰り下がり処理 JOV FIN JUMP LP FIN POP GR7 POP GR6 RET END
;呼び出し元 MAIN START RPUSH LAD GR1,BEFORE ;回転前の領域の先頭アドレス LD GR3,=16 ;ドット絵の表示用のループカウンタ LOOPX CALL DOT ;表示用プログラム「DOT」を呼び出す LAD GR1,1,GR1 ;回転前の領域のアドレス+1で次の語へ SUBL GR3,=1 ;処理待ち語数を減らす JPL LOOPX ;16語まで繰り返す OUT LINE,LLEN ;回転前と回転後のドット絵の区切り線 LAD GR1,BEFORE ;回転前の領域の先頭アドレス LAD GR2,AFTER ;回転後の結果格納領域の先頭アドレス CALL ROTATE ;設問1のプログラムを呼び出す LAD GR1,AFTER ;回転処理後の先頭アドレスを移す LD GR3,=16 ;ドット絵の表示用のループカウンタ LOOPZ CALL DOT ;表示用プログラム「DOT」を呼び出す LAD GR1,1,GR1 ;回転後の領域アドレス+1 SUBL GR3,=1 JPL LOOPZ RPOP RET BEFORE DC #FFFC ;回転前の元のドット絵の先頭アドレス(1語目) DC #FFFC DC #FFFC DC #0700 DC #0700 DC #0700 DC #FFFC DC #FFFC DC #FFFC DC #071C DC #071C DC #071C DC #FFFF DC #FFFF DC #FFFF DC #0000 LINE DC ‘——————–‘ LLEN DC 20 AFTER DC #0000 ;回転後の結果格納領域の先頭アドレス(1語目) DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 DC #0000 PRINT DS 16 LEN DC 16 ;設問1のプログラム ROTATE RPUSH LD GR3,=16 ;処理する語数 LOOP1 LD GR4,=16 ;処理中の語のビット数 LD GR5,GR2 ;GR5←結果の領域のアドレス LD GR6,0,GR1 ;GR6←元の図形の先頭語の内容 LOOP2 LD GR7,0,GR5 ;GR7←結果の領域の1語の内容 SRL GR7,1 ;結果のビットを右側へ SLL GR6,1 ;「設問2」回転の変換をするビットを左にシフトで落とす JOV ON ;1がこぼれたら分岐 JUMP CONT ;結果格納処理へ ON OR GR7,=#8000 ;回転前の1を回転後へ転送 CONT ST GR7,0,GR5 ;処理した1語を結果の領域に格納 LAD GR5,1,GR5 ;結果格納領域を次の語に進める SUBA GR4,=1 ;処理待ちビット数を減らす JNZ LOOP2 ;処理中なら分岐 LAD GR1,1,GR1 ;次の語へ SUBA GR3,=1 ;処理待ち語数を減らす JNZ LOOP1 ;処理中の語があれば分岐 RPOP RET ;ドット絵表示プログラム DOT RPUSH LAD GR6,PRINT ;表示用の領域の先頭アドレス LD GR4,GR1 ;表示するドット絵の先頭アドレスを読み込む LD GR3,=16 ;処理待ちビット数 LD GR4,0,GR4 ;表示する語を読み込む LOOPY SLL GR4,1 ;表示するビットを左シフトで落とす JOV ONE ;1だったら分岐 LD GR5,=’◯’ ;0だったら白抜き丸 JUMP NEXT ONE LD GR5,=’●’ ;1だったら黒抜き丸 NEXT ST GR5,0,GR6 ;表示領域に丸を格納する LAD GR6,1,GR6 ;表示領域を次の語へ SUBL GR3,=1 ;処理待ちビットカウンタ JPL LOOPY OUT PRINT,LEN ;表示する RPOP RET END
MAIN START RPUSH LAD GR1,X LAD GR2,Y LAD GR3,Z CALL FADD RPOP RET X DC #8081 ;Xの16進数先頭、符号部、指数部 DC #8000 ;Xの16進数先頭+1、仮数部 Y DC #0082 ;Yの16進数先頭、符号部、指数部 DC #C000 ;Yの16進数先頭+1、仮数部 Z DS 2 ;計算結果2語分
;桁上りの処理 ADJST SRL GR5,1 ;加算結果の仮数部を1つ右へ OR GR5,=#8000 ;Mzの最上位ビットを1に設定 ADDA GR4,1 ;桁上り分 FIN POP GR3 ST GR4,0,GR3 ;結果Zの格納(符号部、指数部) ST GR5,1,GR3 ;結果Zの格納(符号部、指数部) RPOP RET END
MAIN START ;メインの始まり RPUSH LAD GR1,ALPHA ;αの先頭アドレスをGR1に読み込む LD GR2,=5 ;全部で5語とする CALL LREVRS ;プログラム2を呼び出す RPOP RET ;αにビット列を格納する ALPHA DC #0001 ;1語目 DC #0002 ;2語目 DC #0003 ;3語目 DC #0004 ;4語目 DC #0005 ;5語目
<<プログラム>> H21A START RPUSH LAD GR1,ARETSU LD GR2,=55 ;pの位置55 LD GR3,=12 ;qの長さ LD GR0,=#B1D0 ;B列に置換語を読み込む CALL REPLACE RPOP RET ARETSU DC #0000 ;A列0語目 DC #0000 DC #0000 DC #5555 ;A列3語目(置換対象) DC #5555 ;A列4語目(置換対象) DC #0000
REPLACE RPUSH LD GR4,GR2 ;GR4←p置換開始位置を設定 SRL GR4,4 ;GR4←p/16 A列の先頭語から何語後ろかを求めている ADDA GR1,GR4 ;GR1を置換対象後(この場合第3語)に位置付ける AND GR2,=#000F ;第3語目の何ビットから置換するのか(7ビット)求めている LD GR4,=16 ;第3語で置換する分のビット数の計算の為 SUBA GR4,GR2 ;16-7で3語目の対象ビットは9ビット LD GR5,GR0 ;置換するB列を退避 LD GR6,=#8000 ;置換する時に使うマスクを作る SUBA GR3,=1 ;マスクを作る時にシフトするビットの調整 SRA GR6,0,GR3 ;注意!SRAで「算術」シフトだから空いた所に1が入る LD GR7,GR6 ;マスクを退避する SRL GR0,0,GR2 ;置換するB列を7ビット右にシフトする SRL GR6,0,GR2 ;置換に使うマスクを7ビットシフトする SLL GR5,0,GR4 ;ビット列Aの4語目の置換に使用 SLL GR7,0,GR4 ;ビット列Aの4語目の置換に使用 LD GR2,0,GR1 ;ビット列Aの3語目を読み込む AND GR6,GR2 ;ビット列Aの置換対象の前の部分をマスクで0にする XOR GR2,GR6 ;排他的論理和で置換対象の部分を0にする OR GR2,GR0 ;ビット列Bを足しこむ ST GR2,0,GR1 ;ビット列Aの3語目に格納する LD GR2,1,GR1 ;ビット列Aの4語目を読み込む AND GR7,GR2 ;ビット列Aの置換対象の語の後ろの部分をマスクで0にする XOR GR2,GR7 ;排他的論理和で置換対象の部分を0にする OR GR2,GR5 ;ビット列Bの退避しておいた部分を足しこむ ST GR2,1,GR1 ;ビット列Aの4語目に格納する RPOP RET END