Skip to content

Instantly share code, notes, and snippets.

@kishida
Last active January 1, 2018 21:42
Show Gist options
  • Save kishida/680543de2b606ee4240da41dd5bdfa6c to your computer and use it in GitHub Desktop.
Save kishida/680543de2b606ee4240da41dd5bdfa6c to your computer and use it in GitHub Desktop.
Error Diffuse(Upper case)
MUL3 MACRO
LD B, A
ADD A, A
ADD A, B
ENDM
MUL6 MACRO
ADD A, A
MUL3
ENDM
MUL12 MACRO
ADD A, A
MUL6
ENDM
MUL16 MACRO
ADD A, A
ADD A, A
ADD A, A
ADD A, A
ENDM
MUL32 MACRO
ADD A, A
MUL16
ENDM
DIV16A MACRO
RRA
RRA
RRA
RRA
AND 15
ENDM
DIV64A MACRO
RRA
RRA
RRA
RRA
RRA
RRA
AND 3
ENDM
DIV3 MACRO
LD C, 0C0H
LD B, 7
CALL DIV_JP
ENDM
DIV10 MACRO
LD C, 0A0H
LD B, 5
CALL DIV_JP
ENDM
DIV12 MACRO
CALL DIV_12
ENDM
CLIP7 MACRO
LOCAL CLIPEND
CP 8
JP C, CLIPEND
LD A, 7
CLIPEND:
ENDM
MODULO MACRO N
LOCAL MODEND
SUB N
JP NC, MODEND
ADD A, N
MODEND:
ENDM
RDVDP EQU 6H
WRVDP EQU 7H
BUFSIZ EQU 512
ORG 0C000H-7
; bsave header
DEFB 0FEH
DEFW 0C000H
DEFW VAR_Y
DEFW 0C000H
; clear diffnr, diffng
LD BC, BUFSIZ * 2
LD HL, DIFFNR
LD D, 0
INIT:
LD (HL), D
INC HL
DEC BC
LD A, B
OR C
JP NZ, INIT
XOR A
LD (VAR_Y), A
LOOPY:
; int cr = y % 2;
; int cw = 1 - cr;
LD A,(VAR_Y)
AND 1
LD B, A
LD HL, DIFFNR
ADD A, H
LD H, A
PUSH HL
POP IX
SUB B
LD H, A
LD A, B
XOR 1
ADD H
LD H, A
PUSH HL
POP IY
; int dr = yr[0][cr] + (y % 96);
; int b1 = y / 96 * 2;
LD B, 2
LD A, (VAR_Y)
SUB 96
JP NC, YMOD96_1
ADD 96
LD B, 0
YMOD96_1:
LD HL, B1
LD (HL), B
ADD A, (IX+0)
; int r = dr / 12;
; if (r > 7){
; r = 7;
; }
; dr = dr - r * 12;
LD E, A
DIV12
CLIP7
ADD A, A
ADD A, A
LD H, A
MUL3
SUB A, E
NEG
; int tr = dr * 6 / 16; yr[0][cw] = tr;
MUL6
DIV16A
LD (IY+0), A
LD B, A
; t = dr / 16; yr[1][cw] = t;
LD A, C
DIV16A
LD (IY+1), A
; dr = dr - tr - t;
LD A, C
AND 0F0H
SUB B
EXX
LD D, A
EXX
; int dg = yg[0][cr];
LD DE, BUFSIZ
ADD IX, DE
ADD IY, DE
LD C, (IX+0)
; int g = dg / 16;
LD A, C
DIV16A
; if (g > 7){
; g = 7;
; }
CLIP7
MUL32
LD L, A
; dg = dg - g * 16;
RRA
SUB A, C
NEG
LD C, A
; int tg = dg * 6 / 16; yg[0][cw] = tg;
MUL6
DIV16A
LD (IY+0), A
LD B, A
; t = dg / 16; yg[1][cw] = t;
LD A, C
DIV16A
LD (IY+1), A
LD D, A
; dg = dg - tg - t;
LD A, C
SUB A, B
SUB A, D
EXX
LD E, A
EXX
; c = color(r * 32 + g * 4 + b1)
LD A, (B1)
ADD A, H
ADD A, L
LD D, A
; img.setrgb(0, y, c);
LD A, (WRVDP)
LD C, A
INC C
LD A, (VAR_Y)
LD B, A
DIV64A
DI
OUT (C), A
LD A, 80H + 14
OUT (C), A
XOR A
OUT (C), A
LD A, B
AND 3FH
OR 40H
OUT (C), A
DEC C
OUT (C), D
EI
LD DE, -BUFSIZ
ADD IX, DE
ADD IY, DE
EXX
LD B, 1
EXX
LOOPX:
; dr = dr + yr[x][cr] + (y % 96);
LD A, (VAR_Y)
MODULO 96
ADD A, (IX + 1)
EXX
ADD A, D
EXX
; r = dr / 12;
LD E, A
DIV12
; if (r > 7){
; r = 7;
; }
CLIP7
ADD A, A
ADD A, A
LD L, A
; dr = dr - r * 12;
MUL3
SUB A, E
NEG
; t = dr / 16; yr[x + 1][cw] = t; dr = dr - t;
LD E, A
DIV16A
LD (IY+2), A
SUB E
NEG
LD E, A
; t = dr / 3; yr[x][cw] = yr[x][cw] + t; dr = dr - t;
DIV3
ADD A, (IY+1)
LD (IY+1),A
LD A, E
SUB D
LD E, A
; t = dr * 3 / 10; yr[x - 1][cw] = yr[x - 1][cw] + t;
; dr = dr - t;
MUL3
DIV10
ADD A, (IY+0)
LD (IY+0),A
LD A, E
SUB D
EXX
LD D, A
EXX
LD DE, BUFSIZ
ADD IX, DE
ADD IY, DE
; dg = dg + yg[x][cr] + (x % 128);
EXX
LD A, B
EXX
MODULO 128
ADD A, (IX + 1)
EXX
ADD A, E
EXX
JP NC, RCLIP
LD A, 0FFH
RCLIP:
; g = dg / 16;
LD E, A
DIV16A
; if (g > 7){
; g = 7;
; }
CLIP7
MUL32
LD H, A
; dg = dg - g * 16;
RRA
SUB A, E
NEG
LD E, A
; t = dg / 16; yg[x + 1][cw] = t; dg = dg - t;
DIV16A
LD (IY+2), A
SUB A, E
NEG
LD E, A
; t = dg / 3; yg[x][cw] = yg[x][cw] + t; dg = dg - t;
DIV3
ADD A, (IY + 1)
LD (IY+1), A
LD A, E
SUB D
LD E, A
; t = dg * 3 / 10; yg[x - 1][cw] = yg[x - 1][cw] + t;
; dg = dg - t;
MUL3
DIV10
ADD A, (IY+0)
LD (IY+0),A
LD A,E
SUB D
EXX
LD E, A
EXX
; c = color(g * 32 + r * 4 + b1 + x / 128)
LD A, (B1)
ADD A, H
ADD A, L
LD D, A
EXX
LD A, B
EXX
LD E, A
AND 128
JP Z, DIV128
INC D
DIV128:
; img.setrgb(x, y, c);
LD A, (WRVDP)
LD C, A
INC C
LD A, (VAR_Y)
DI
OUT (C), E
AND 3FH
OR 40H
OUT (C), A
DEC C
OUT (C), D
EI
LD DE, -BUFSIZ+1
ADD IX, DE
ADD IY, DE
EXX
INC B
EXX
JP NZ, LOOPX
LD A,(VAR_Y)
INC A
LD (VAR_Y),A
CP 192
JP NZ, LOOPY
RET
; IN A, B, C
; OUT A DIV
; USE B, C, D
DIV_12:
LD C, 0C0H
LD B, 5
DIV_JP:
LD D, 0
DIV_LP:
SLA D
SUB C
JP C, DIVM_N
DIV_NX:
INC D
SRL C
DJNZ DIV_LP
LD A, D
RET
DIVM_L:
SLA D
ADD C
JP C, DIV_NX
DIVM_N:
SRL C
DJNZ DIVM_L
LD A, D
RET
DIFFNR: DEFS BUFSIZ
DIFFNG: DEFS BUFSIZ
DUMMY: DEFB 0
B1: DEFB 0
VAR_Y: DEFB 0
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment