検証のためにこんなコードを書いてみました。
①8100-81FF番地を「76H」(HALTのコード)で埋めておく
②8300-83FF番地を「00H」(NOPのコード)で埋めておく
③DMAを外部トリガによって8300番地から256バイトを8100番地にメモリ間転送するようにプログラミング
④8100番地にジャンプ。(ただし既にHALTで埋まっているのでそこでCPUは停止)
⑤8200番地以降にそこまでプログラムがきたことがわかるようにLCDに表示
②8300-83FF番地を「00H」(NOPのコード)で埋めておく
③DMAを外部トリガによって8300番地から256バイトを8100番地にメモリ間転送するようにプログラミング
④8100番地にジャンプ。(ただし既にHALTで埋まっているのでそこでCPUは停止)
⑤8200番地以降にそこまでプログラムがきたことがわかるようにLCDに表示
8100番地でHALT中にDMAにより8100-81FF番地が0で埋められれば一気にNOPで走れるようになり
8200番地まで行き着けるはずです
8200番地まで行き着けるはずです
org 8000H main: call pioini call ctcini call lcdini call dlin LD HL,STRMSG LD A,0C0H CALL LCDCSET CALL DLIN2 LD HL,CBUFF ;8100-81FF HALT set L1: LD (HL),76H INC HL LD A,L CP 0 JR NZ,L1 LD HL,ZBUFF ;8300-83FF NOP set L2: LD (HL),00H INC HL LD A,L CP 0 JR NZ,L2 DMASET: LD A,0C3H ;DMAC reset LD B,6 LOOP: OUT (DMAADR),A DJNZ LOOP LD HL,DMACC ;DMAC program LD B,DMACL-DMACC BEGIN0: LD C,DMAADR OTIR JP CBUFF org 8100H ;ExecuteCodeBuffer CBUFF: DS 256 org 8200H CHECK: LD HL,FINMSG LD A,0C0H CALL LCDCSET CALL DLIN2 RST 38h DMACC: DB 0C3H ;reset command DB 7DH ;transfer PORTA->PORTB DW ZBUFF ;source address DW LENGTH ;length DB 54H ;PORTA address increment,memory DB 02H ;2cycle early end DB 50H ;PORTB address increment,memory DB 02H ;2cycle early end DB 80H ;interrupt disable DB 0CDH ;burst mode DW CBUFF ;destination address DB 8AH ;stop end of block CE/only READY active high DMACC0: DB 0CFH ;load count/address DB 87H ;enable DMA DMACL EQU $ dspb: defb "* DMA TEST 10/3/30 ",0 STRMSG: defb " HALT",0 FINMSG: defb " RESTART",0 org 8300H ZBUFF: DS 256