Skip to content

Instantly share code, notes, and snippets.

@vintagechips
Last active August 14, 2020 23:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vintagechips/0fea1f6672904e4b5245c6c9d1196ad2 to your computer and use it in GitHub Desktop.
Save vintagechips/0fea1f6672904e4b5245c6c9d1196ad2 to your computer and use it in GitHub Desktop.
DRAM KILLER for SBCZ80
; DRAM KILLER
; TARGET: SBCZ80
; ASSEMBLER: ARCPIT XZ80.EXE
;
ROMTOP EQU 0000H ;ROM領域の先頭
RAMTOP EQU 8000H ;RAM領域の先頭
SSTACK EQU 8010H ;スタックトップ
;
PSIOAD EQU 00H ;SIOチャンネルAのデータレジスタ
PSIOAC EQU 01H ;SIOチャンネルAの制御レジスタ
PSIOBD EQU 02H ;SIOチャンネルBのデータレジスタ
PSIOBC EQU 03H ;SIOチャンネルBの制御レジスタ
;
TESTNO EQU 55H ;DRAMに書き込むデータ
TESTBG EQU 9000H ;テスト領域の先頭
TESTCT EQU 100H ;テスト領域の広さ
TESTTM EQU 10 ;テスト時間の初期値(秒)
;
; RESET START
ORG ROMTOP
LD SP,SSTACK
;
; DRAM WARMING UP ;DRAMを0で埋める
LD HL,RAMTOP ;HL/転送元を先頭に設定
LD (HL),00H ;先頭に0を書く
LD DE,RAMTOP+1 ;DE/転送先を次に設定
LD BC,3FFFH ;BC/繰り返し回数を設定
LDIR ;ブロック転送
;
; SIO INITIALIZE
LD B,SIOACL ;B/繰り返し回数を設定
LD C,PSIOAC ;C/転送先をSIOチャンネルAの制御レジスタに設定
LD HL,SIOACD ;HL/転送元をコマンドチェインの先頭に設定
OTIR ;ブロック転送
;
; START
LD HL,MOPEN ;OPENNING MESSAGE
CALL PUTS
;
; FILL TEST AREA ;テスト領域をTESTNOで埋める
LD HL,TESTBG ;HL/転送元を設定
LD (HL),TESTNO ;先頭にTESTNOを書く
LD DE,TESTBG+1 ;DE/転送先を次に設定
LD BC,TESTCT-1 ;BC/繰り返し回数を設定
LDIR ;ブロック転送
;
LD D,TESTTM ;Dにテスト時間(秒)の初期値を入れる
;
; LOOP TOP
L1KIL: LD HL,MTST1 ;Look forward to
CALL PUTS
LD A,D ;テスト時間(秒)を表示
CALL PUTD
LD HL,MTST2 ;seconds later.
CALL PUTS
LD B,D ;Bにテスト時間(秒)を設定T
;
; STOP REFRESH ;リフレッシュを停止する処理
; E.T. = B * 1sec ;停止時間はB(秒)
; Suggestion by @houmei on Twitter
; Thanks @uaa on Twitter
;
STREF: LD HL,63000 ;HLに繰り返し回数を入れる
L1REF: XOR A ;Aを0にする
LD R,A ;RにAを書き込む
DEC HL ;HL/繰り返し回数を減じる
LD A,H ;HLが0かどうかを調べる
OR L
JR NZ,L1REF ;HLが0でなければ繰り返す
DJNZ L1REF ;以上(累計1秒)をBの数だけ繰り返す
;
; DRAM CHECK ;DRAMの内容を検査
LD HL,TESTBG ;HL/比較先を設定
LD BC,TESTCT ;BC/繰り返し回数を設定
L2KIL: LD A,TESTNO ;A/比較元をTESTNOとする
CPI ;繰り返し比較
JR NZ,L3KIL ;不一致なら成功処理へ分岐
LD A,C ;繰り返し回数検査
CP 0
JR NZ,L2KIL ;繰り返し回数に達していなければ繰り返す
;
; CASE FAILURE ;DRAMが記憶を維持している場合の処理
LD HL,MFAIL ;OMG! Still alive. I'll start over again.
CALL PUTS
INC D ;テスト時間(秒)を増やす
LD A,D ;テスト時間(秒)を検査
CP 0
JR Z,L4KIL ;オーバーフローしていたらギブアップ
JP L1KIL ;オーバーフローしていなければ継続
;
; CASE SUCCESS ;DRAMが記憶を消失している場合の処理
L3KIL LD HL,MSUCS ;GJ! Some DATA are broken.
CALL PUTS
JR L5KIL ;終了
;
; CASE GIVEUP ;ギブアップ
L4KIL: LD HL,MGVUP ;Sorry. It's beyond my ability.
CALL PUTS
L5KIL: LD HL,MDONE ;ALL DONE.
CALL PUTS
L6KIL JR L6KIL ;終了
;
; MESSAGE
MOPEN: DB 'DRAM killer v1.0 has started.',0DH, 0AH
MCRLF DB 0DH, 0AH, 0
MTST1 DB 'Look forward to ', 0
MTST2 DB ' seconds later.', 0
MFAIL DB ' OMG! Still alive. I''ll start over again.',0DH, 0AH, 0
MSUCS DB ' GJ! Some DATA are broken.',0DH, 0AH, 0
MGVUP DB 'Sorry. It''s beyond my ability.',0DH, 0AH, 0
MDONE DB 'ALL DONE.',0DH, 0AH, 0
;
; SIOA -> A
GETCH: IN A,(PSIOAC) ;GET STATUS
BIT 0,A ;CHECK RECEIVE
JR Z,GETCH ;IF NOT REPEAT
IN A,(PSIOAD) ;GET DATA
RET
;
; A -> SIO
PUTCH: PUSH AF ;SAVE DATA
L1PUT: IN A,(PSIOAC) ;GET STATUS
BIT 2,A ;CHECK STATUS
JR Z,L1PUT ;IF NOT EMPTY REPEAT
POP AF ;RESTORE DATA
OUT (PSIOAD),A ;TRANSFER
RET
;
; PUT STRING
PUTS: LD A,(HL) ;GET CHARACTOR
CP 00H ;CHECK END
RET Z ;IF END RETURN
CALL PUTCH ;PUT CHARACTOR
INC HL ;POINT NEXT CHARACTOR
JR PUTS ;REPEAT
;
; PUT DECIMAL
; Thanks @tokihiro_naito on Twitter
;
PUTD: PUSH AF ;SAVE DATA
PUSH BC ;SAVE DATA
;
; 100の位の処理
LD B,-1 ;Bに初期値を設定
L1PD: INC B ;Bを1増やす
SUB 100 ;100を引いてみる
JR NC,L1PD ;引けたら繰り返す
ADD A,100 ;引けなかったら戻す
;
; 100の位の表示
PUSH AF ;100未満の値を退避
LD A,B ;100の位をAに転送
CP 0 ;0サプレス
JR Z,L3PD
ADD A,30H ;値を数字に変換
CALL PUTCH ;表示
L3PD: POP AF ;100未満の値を復帰
;
; 10の位の処理
LD B,-1 ;Bに初期値を設定
L2PD: INC B ;Bを1増やす
SUB 10 ;10を引いてみる
JR NC,L2PD ;引けたら繰り返す
ADD A,10 ;引けなかったら戻す
;
; 10の位の表示
PUSH AF ;10未満の値を退避
LD A,B ;10の位をAに転送
CP 0 ;0サプレス
JR Z,L4PD
ADD A,30H ;値を数字に変換
CALL PUTCH ;表示
L4PD: POP AF ;10未満の値を復帰
;
; 1の位の表示
ADD A,30H ;値を数字に変換
CALL PUTCH ;表示
;
POP BC ;RESTORE DATA
POP AF ;RESTORE DATA
RET
;
; SIOA COMMAND CHAIN
SIOACD:
DB 00011000B ;RESET
DB 01H,00000000B ;RX INTERRUPT DISABLE
DB 04H,01000100B ;FORMAT
DB 05H,11101010B ;TX ENABLE
DB 03H,11000001B ;RX ENABLE
SIOACL EQU $-SIOACD
;
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment