Last active
August 14, 2020 23:53
-
-
Save vintagechips/0fea1f6672904e4b5245c6c9d1196ad2 to your computer and use it in GitHub Desktop.
DRAM KILLER for SBCZ80
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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