X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fimages%2Fm6502%2Flines.asm;fp=hacks%2Fimages%2Fm6502%2Flines.asm;h=152d5fb7715dc020117801f8bb7004b4bebf5a17;hp=0000000000000000000000000000000000000000;hb=78add6e627ee5f10e1fa6f3852602ea5066eee5a;hpb=39809ded547bdbb08207d3e514950425215b4410 diff --git a/hacks/images/m6502/lines.asm b/hacks/images/m6502/lines.asm new file mode 100644 index 00000000..152d5fb7 --- /dev/null +++ b/hacks/images/m6502/lines.asm @@ -0,0 +1,313 @@ +; -*- mode: c; tab-width: 4; fill-column: 128 -*- +; vi: set ts=4 tw=128: + +; Lines, Copyright (c) 2018 Dave Odell +; +; Permission to use, copy, modify, distribute, and sell this software and its +; documentation for any purpose is hereby granted without fee, provided that +; the above copyright notice appear in all copies and that both that +; copyright notice and this permission notice appear in supporting +; documentation. No representations are made about the suitability of this +; software for any purpose. It is provided "as is" without express or +; implied warranty. + +; Another port of 20 year old QBasic code. + + + +main_loop: + lda #$00 + sta $0 + +y_loop: + ldx $0 + + lda #1 + bit $1 + beq left_right + + ; Up-down. Skip all blank columns. + lda x_px0,x + and #1 + bne fill + jmp next_y ; next_y is too far to conditional-branch from here. + +clear: + ldx #1 + lda $0 + clc + adc #$20 + tay + + sec +clear_loop: + lda #0 ; $fe + sta $0200,y + sta $0240,y + sta $0280,y + sta $02c0,y + sta $0300,y + sta $0340,y + sta $0380,y + sta $03c0,y + sta $0400,y + sta $0440,y + sta $0480,y + sta $04c0,y + sta $0500,y + sta $0540,y + sta $0580,y + sta $05c0,y + tya + sbc #$20 + tay + dex + bpl clear_loop + jmp next_y + +left_right: + ; Repaint columns that were previously on. + lda x_px0,x + bit const_two + beq next_y + lda x_px0,x + and #1 + beq clear + ;jmp fill + +fill: + ldx #1 + lda $0 + clc + adc #$20 + tay + + sec +fill_loop: + ; 3 * 2 * 16 = 96 bytes + lda y_px0,x + sta $0200,y + lda y_px1,x + sta $0240,y + lda y_px2,x + sta $0280,y + lda y_px3,x + sta $02c0,y + lda y_px4,x + sta $0300,y + lda y_px5,x + sta $0340,y + lda y_px6,x + sta $0380,y + lda y_px7,x + sta $03c0,y + lda y_px8,x + sta $0400,y + lda y_px9,x + sta $0440,y + lda y_pxa,x + sta $0480,y + lda y_pxb,x + sta $04c0,y + lda y_pxc,x + sta $0500,y + lda y_pxd,x + sta $0540,y + lda y_pxe,x + sta $0580,y + lda y_pxf,x + sta $05c0,y + tya + sbc #$20 + tay + dex + bpl fill_loop + ;jmp next_y + +next_y: + inc $0 + lda #32 + cmp $0 + beq shift + jmp y_loop + +shift: + lda $fe + and #$3 + sta $1 ; Left, down, right, up. + beq shift_x1 + + cmp #2 + bmi shift_y1 + beq shift_x0 + +shift_y0: + ldx #0 +shift_y0_loop: + lda y_px0,x + eor y_px00,x + sta y_px0,x + inx + cpx #31 + bne shift_y0_loop + jmp main_loop + +shift_y1: + ldx #30 +shift_y1_loop: + lda y_px00,x + eor y_px0,x + sta y_px00,x + dex + bpl shift_y1_loop + jmp main_loop + +shift_x0: + ldx #0 +shift_x0_loop: + ; px[0] = ((px[0] ^ px[1]) & 1) | (px[1] << 1) + lda x_px0,x + eor x_px00,x + lsr ; Save EOR bit in carry flag. + lda x_px00,x + rol ; Restore EOR bit. + sta x_px0,x + inx + cpx #31 + bne shift_x0_loop + jmp main_loop + +shift_x1: + ldx #30 +shift_x1_loop: + lda x_px00,x + eor x_px0,x + lsr + lda x_px0,x + rol + sta x_px00,x + dex + bpl shift_x1_loop + jmp main_loop + +y_px0: + dcb 0 +y_px00: + dcb 0 +y_px1: + dcb 0, 0 +y_px2: + dcb 0, 0 +y_px3: + dcb 0, 0 +y_px4: + dcb 0, 0 +y_px5: + dcb 0, 0 +y_px6: + dcb 0, 0 +y_px7: + dcb 0, 0 +y_px8: + dcb 1, 0 +y_px9: + dcb 0, 0 +y_pxa: + dcb 0, 0 +y_pxb: + dcb 0, 0 +y_pxc: + dcb 0, 0 +y_pxd: + dcb 0, 0 +y_pxe: + dcb 0, 0 +y_pxf: + dcb 0, 0 + + ; Bit 0: black row, bit 1: changed row +x_px0: + dcb 0 +x_px00: + dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + dcb 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +const_two: ; lolz + dcb 2 + +;#include "screenhack.h" +; +;struct _lines +;{ +; unsigned width, height; +; unsigned long delay; +; GC gc; +;}; +; +;static void *lines_init(Display *display, Window window) +;{ +; struct _lines *self = malloc(sizeof(*self)); +; XGCValues gcv; +; XWindowAttributes xgwa; +; +; if(!self) +; abort(); +; +; XGetWindowAttributes(display, window, &xgwa); +; self->width = xgwa.width; +; self->height = xgwa.height; +; +; self->delay = get_integer_resource(display, "delay", "Integer"); +; +; gcv.function = GXxor; +; gcv.foreground = get_pixel_resource(display, xgwa.colormap, "foreground", "Foreground"); +; self->gc = XCreateGC(display, window, GCFunction | GCForeground, &gcv); +; +; XDrawPoint(display, window, self->gc, xgwa.width >> 1, xgwa.height >> 1); +; +; return self; +;} +; +;static unsigned long lines_draw(Display *display, Window window, void *self_raw) +;{ +; struct _lines *self = self_raw; +; static const XPoint xy[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; +; const XPoint *p = xy + NRAND(4); +; +; XCopyArea(display, window, window, self->gc, 0, 0, self->width, self->height, p->x, p->y); +; return self->delay; +;} +; +;static void lines_reshape(Display *display, Window window, void *self_raw, unsigned width, unsigned height) +;{ +; struct _lines *self = self_raw; +; self->width = width; +; self->height = height; +;} +; +;static Bool lines_event(Display *display, Window window, void *self_raw, XEvent *event) +;{ +; return False; +;} +; +;static void lines_free(Display *display, Window window, void *self_raw) +;{ +; struct _lines *self = self_raw; +; XFreeGC(display, self->gc); +; free(self); +;} +; +;static const char *lines_defaults[] = +;{ +; "*fpsSolid: true", +; "*delay: 30000", +; 0 +;}; +; +;static XrmOptionDescRec lines_options [] = +;{ +; {"-delay", ".delay", XrmoptionSepArg, 0}, +; {0, 0, 0, 0} +;}; +; +;XSCREENSAVER_MODULE ("Lines", lines)