8008内部状態の待避/復帰方法[ 2011-05-07]

 
THE COMPUTER HOBBIYST Volume 1 Number 6: May 1975 Page6に掲載されていた方法である。フラグ値を作成する部分が洗練されている。 
 

CPU内部状態の待避方法

instruction sequence 説明
GSAVE     OUT STSPSH SAVE A ON THE STACK
          LAB SAVE B
          OUT STSPSH
          LAC SAVE C
          OUT STSPSH
          LAD SAVE D
          OUT STSPSH
          LAE SAVE E
          OUT STSPSH
          LAH SAVE H
          OUT STSPSH
          LAL SAVE L
          OUT STSPSH
IOに接続したスタックに保存する。

          LAI 0
          RAR PUT CARRY IN HIGH ORDER
          JTZ GSAV3 JUMP IF ZERO FLAG IS ON
LBI 170B PUT INTO B THE BIT MASK TO
JTS GSAV1 TURN OFF THE ZERO FLAG AND
LBI 030B RESTORE THE SIGN FLAG
GSAV1   JTP GSAV2 OR IN A 004B IF PARITY
          ORI 004B INDICATOR IS OFF

GSAV2   ORB COMBINE B AND A
* c=0 , z=1 , s=0 , p=1  $00
* c=0 , z=0 , s=0 , p=0  $1C
* c=0 , z=0 , s=0 , p=1  $18
* c=0 , z=0 , s=1 , p=0  $7C
* c=0 , z=0 , s=1 , p=1  $78
* c=1 , z=1 , s=0 , p=1  $80
* c=1 , z=0 , s=0 , p=0  $9C
* c=1 , z=0 , s=0 , p=1  $98
* c=1 , z=0 , s=1 , p=0  $FC
* c=1 , z=0 , s=1 , p=1  $F8
flagの値に応じた数字をAregにつくる。
GSAV3     OUT STSPSH SAVE MAGIC NUMBER ON STACK
flagを保管する。

 
CPU内部状態の復帰方法
instruction sequence 説明
          INP STPOP RESTORE MAGIC NUMBER FROM STACK
          ADA ADD IT TO ITSELF TO RESTORE CONDITIONS
flagを復帰する。
ADAで復帰できるような値でsaveしている。
          INP STPOP RESTORE L
          LLA
          INP STPOP RESTORE H
          LHA
          INP STPOP RESTORE E
          LEA
          INP STPOP RESTORE D
          LDA
          INP STPOP RESTORE C
          LCA
          INP STPOP RESTORE B
          LBA
          INP STPOP RESTORE A
各レジスタを復帰する。

 
8008内部状態の待避・復帰方法#以下はインタフェース誌の方法を元に新たに作成した方法であり実機で の確認が済んでいるわけ ではない。
 

CPU内部状態の待避方法

instruction sequence 説明
          out Asave
          mov A,B
          out Bsave
          mov A,C
          out Csave
          mov A,D
          out Dsave
          mov A,E
          out Esave
          mov A,H
          out Hsave
          mov A,L
          out Lsave
外部 I/Oエリアに保存する。
保存した値は同じアドレスから
入力命令で読み込めるものとする。
          mvi B,0
          jnc savest10
          mvi B,$80
savest10  mvi A,0
          jz savest30
          mvi A,$20
          jp savest20
          RLC
savest20  jpo savest30
          adi 1
savest30  ora B ;make flagdata
* c=0 , z=1 , s=0 , p=1  $00
* c=0 , z=0 , s=0 , p=0  $20
* c=0 , z=0 , s=0 , p=1  $21
* c=0 , z=0 , s=1 , p=0  $40
* c=0 , z=0 , s=1 , p=1  $41
* c=1 , z=1 , s=0 , p=1  $80
* c=1 , z=0 , s=0 , p=0  $A0
* c=1 , z=0 , s=0 , p=1  $A1
* c=1 , z=0 , s=1 , p=0  $C0
* c=1 , z=0 , s=1 , p=1  $C1
flagの値に応じた数字をAregにつくる。
          out Fsave
flagを保管する。

 
CPU内部状態の復帰方法
instruction sequence 説明
          inp Fsavead
          ADD A ; restore flags
flagを復帰する。
ADD Aで復帰できるような値でsaveしている。
          inp Lsavead
          mov L,A
          inp Hsavead
          mov H,A
          inp Esavead
          mov E,A
          inp Dsavead
          mov D,A
          inp Csavead
          mov C,A
          inp Bsavead
          mov B,A
          inp Asavead
各レジスタを復帰する。

8008内部状態の待避・復帰方法#以下はインタフェース誌1975年3月号P99〜100に掲載されて いる方法である。この方法ではH&Lレジスタは保存できない。
 

CPU内部状態の待避方法

instruction sequence 説明
SAVE      LHI AREGI^ / HIGHER ADDRESS OF SAVE AREA
          LLI AREGI
          LMA / SAVE <A>
          LLI BREGI
          LMB / SAVE <B>
          LLI CREGI
          LMC / SAVE <C>
          LLI DREGI
          LMD / SAVE <D>
          LLI EREGI
          LME / SAVE <E>

          RAR / SAVE CARRY F/F
          LLI CARRY
          LMA
メモリに保存する。
H&Lレジスタは保存できない。


carryフラグを取りだしメモリに保存する。
          LAI 0
          JTZ SAVE2 / TEST ZERO F/F
          LAI 1
          JFS SAVE1 / TEST SIGN F/F
          RRC
SAVE1     JFP SAVE2 / TEST PARITY F/F
          ADI 2
SAVE2     DCL / SAVE F/F'S EXCEPT CARRY F/F
          LMA
          RET
* z=1 , s=0 , p=1  $00
* z=0 , s=0 , p=0  $01
* z=0 , s=0 , p=1  $03
* z=0 , s=1 , p=0  $80
* z=0 , s=1 , p=1  $82
flagの値に応じた数字をAregにつくる。
作った数値を保存する。

 
CPU内部状態の復帰方法
instruction sequence 説明
RSTOR     LHI BREGI^
          LLI BREGI
          LBM / RESTORE <B>
          INL
          LCM / RESTORE <C>
          INL
          LDM / RESTORE <D>
          INL
          LEM / RESTORE <E>
Aとflag以外を復帰する。
H&Lは復帰できない。
          INL / RESTORE FF'S EXCEPT CARRY F/F
          LAM ADI 0
ADI 0でCarry以外のFFを復帰する。
          LLI CARRY / RESTORE CARRY F/F
LAM
RAL
RALでCarryを復帰する。
          LLI AREGI / RESTOE <A>
LAM
RET
Aを復帰する。

8008内部状態の待避・復帰方法#以下はエレクトロニクスダイジェスト誌1974年7月号P29に掲載 されている方法でありSELNAC8Dで使用されていたものである。
 

CPU内部状態の待避方法

instruction sequence 説明
PUSH      OUT STACK AC WAS SAVED
          LAB
          OUT STACK BR SAVE
          LAC
          OUT STACK CR SAVE
          LAD
          OUT STACK DR SAVE
          LAE
          OUT STACK ER SAVE
          LAL
          OUT STACK LR SAVE
          LAH
          OUT STACK HR SAVE
          I/O DSW FOR FLAG BITS LATCHING
          OUT STACK
          RET
外部 I/Oエリアに設けたSTACKに保存する。
FLAG値はINPUT命令で外部ラッチに一旦ラッチし、STACKに保存する。

 
CPU内部状態の復帰方法
instruction sequence 説明
POP       I/O STACK FLAG INPUT
          NDI 360 CLEAR LOWER HALF WORD
          CPI 000 FLAG IS NOTHING
          JTZ RESET
          CPI 020 "S" ?
          JTZ S
          CPI 100 "P" ?
          JTZ P
          CPI 120 "P,S" ?
          JTZ PS
          CPI 140 "P,Z" ?
          JTZ PZ
          CPI 200 "C" ?
          JTZ C
          CPI 220 "C,S" ?
          JTZ CS
          CPI 300 "C,P" ?
          JTZ CP
CPZ       LAI 377 ALL 1 LOAD
          ADI 001 RESULT:AC=000,CRY=1,PARITY=1,ZERO=1 & SIGN=0
          JMP POPUP
S         LAI 200
          ORA "S" SET "P,Z,C" RESET
          JMP POPUP
P         LAI 003
          ORA "P" SET "S,Z,C" RESET
          JMP POPUP
PS        LAI 300
          ORA "P,S" SET "Z,C" RESET
          JMP POPUP
PZ        XRA "P,Z" SET "S,C" RESET
          JMP POPUP
C         LAI 001
          ORA CLEAR ALL FLAG
          RRC MOVE LSD TO CRY RESULT: CRY=1
          JMP POPUP
CS        LAI 200
          ORA "S" SET "P、Z" RESET
          RLC MOVE MSD TO CRY RESULT: CRY=SGN=1
          JMP POPUP
CP        LAI 003
          ORA "P" SET "S,Z" RESET
          RRC MOVE LSD TO CRY RESULT: CRY=PRTY=1
          JMP POPUP
RESET     LAI 001
          ORA ALL FLAG CLEAR

POPUP     I/O STACK
          LHA
          I/O STACK
          LLA
          I/O STACK
          LEA
          I/O STACK
          LDA
          I/O STACK
          LCA
          I/O STACK
          LBA
          I/O STACK
          RET
各レジスタを復帰する。