apple1emu.asm (2)

色々ばたばたしてるので、なんとなくメインループっぽいあたりで茶を濁す。てか、昨晩もそのあたりで茶を濁してる模様。
ソース見てみたら先頭で di してるので

               ei
               call load_state
               call execute         ; GO!
               call save_state
               jr   reset_loop

なナニの ei は最初のみの儀式なのかな。しかし z80 の割り込みってどうやって制御してるんでしょうか。インターフェース復刻版にて z80 な割り込み云々の記述がありますな。

とりあえず

上記なソレに入る前にその上の記述が微妙に気になります。とりあえず以下な部分はコメントで理解できる。

reset_loop:    ld   hl,0
               ld   (dsp_data),hl   ; display ready
               ld   (kbd_data),hl   ; no key available

問題は次のブロックか。

               ld   hl,(m6502_reset) ; start from reset vector
               ld   (reg_pc),hl
               ld   a,&04           ; interrupts disabled
               ld   (reg_p),a

m6402_reset の定義が以下。

m6502_reset:   equ  &fffc           ; reset vector address

reg_pc はエミュレータの中のナニの PC なのかな。これはレジスタの仕様が分かってないと微妙だな。ええと、apple1emu.asm での定義が以下。

; During running we keep the 65xx registers in Z80 registers
; These are used only to hold the state before/after running
reg_a:         defb 0
reg_p:         defb 0
reg_x:         defb 0
reg_y:         defb 0
reg_s:         defb 0
reg_pc:        defw 0

ええと APPLE I REPLICA CREATION によれば 6502 Registers は

  • accumulator
  • Index Register X and Y
  • The Program Counter (PC)
  • The Stack Pointer
  • The Processor Status Register

との事。The Processor Status Register については以下な模様。

+-+-+-+-+-+-+-+-+
|N|V|1|B|D|I|Z|C|
+-+-+-+-+-+-+-+-+
 | |   | | | | |
 | |   | | | | +- Carry         1=true
 | |   | | | +--- Zero          1=Result is 0
 | |   | | +----- IRQ Disable   1=Disable
 | |   | +------- Decimal Mode  1=true
 | |   +--------- BRK Command   1=BRK
 | +------------- Overflow      1=true
 +--------------- Nagative      1=NEG

ええと、IRQ Disable と Enable Interruput のソレが分からぬ。ちょっと今日は色々な意味で限界なので明日余裕があればこのあたりを hoge ってみます。