Ok, I originally made the optimization within my own MOS code, and then I converted it into what you had. I have not tested it since it was in my MOS code, so I *may* have made an error, but it *should* work.
Saves 28 bytes, and brings the total bytes down to 498 (in my version) not including the masked sprite routine or the 30 byte MOS header. I see an opportunity to save a byte or two by using that dummy space, but the effort required is just not worth it. Here's the fixed code.
Code: CursorEdit:
xor a
ld (CX),a
ld (CY),a
ld (CGStimer),a
ld hl,40
bcall(_DAVLCheckOffset)
ld de,cMouseMask
ld bc,16
ldir
call displayOuterEdge
cmainloop:
ld hl,CGStimer
inc (hl)
inc hl
inc (hl)
call displayGrid
call displayCursor
call imfastcopy
bcall(_getcsc)
cp skup
jr nz,notMoveUp
ld a,(CY)
or a
jr z,cmainloop
dec a
ld b,1
jp CCursorMove
notMoveUp:
cp skdown
jr nz,notMoveDown
ld a,(CY)
cp 7
jr z,cmainloop
inc a
ld b,1
jp CCursorMove
notMoveDown:
cp skright
jr nz,notMoveRight
ld a,(CX)
cp 7
jr z,cmainloop
inc a
ld b,0
jp CCursorMove
notMoveRight:
cp skleft
jr nz,notMoveLeft
ld a,(CX)
or a
jr z,cmainloop
dec a
ld b,0
jp CCursorMove
notMoveLeft:
cp sk2nd
jp nz,notChangePixel
;Calls
modPixelStatus:
;White Opaque, Black Opaque, White Trans
;If White Opaque:
;-Change cMouse
;If Black Opaque
;-Change cMouse
;-Change cMouseMask
;If White Trans
;-Change cMouseMask
ld a,(CY)
ld hl,cMouse
ld e,a
ld d,0
add hl,de
ld a,(CX)
ld b,a
ld a,7
sub b
inc a
ld b,a
ld a,(hl)
cgetpixelLoop:
srl a
djnz cgetpixelLoop
jr c,pixelIsBlack
ld a,(CY)
ld hl,cMouseMask
ld e,a
;d = 0
add hl,de
ld a,(CX)
ld b,a
ld a,7
sub b
inc a
ld b,a
ld a,(hl)
cgetpixelLoop2:
srl a
djnz cgetpixelLoop2
jr c,pixelIsTransparent
;White Opaque
ld a,(CY)
ld hl,cMouse
ld e,a
;d = 0
add hl,de
ld a,(CX)
or a
jr z,firstcolumnpixel
jr pixelChangerepeat
pixelIsBlack:
;Black Opaque
ld a,(CX)
or a
jr z,skippixelBlackLoop
ld b,a
ld a,%10000000
pixelBlackLoop:
srl a
djnz pixelBlackLoop
skippixelBlackLoopBack:
xor (hl)
ld (hl),a
ld a,(CY)
ld hl,cMouseMask
ld e,a
;d = 0
add hl,de
ld a,(CX)
or a
jr z,firstcolumnpixel
jr pixelChangerepeat
skippixelBlackLoop:
ld a,%10000000
jr skippixelBlackLoopBack
pixelIsTransparent:
ld a,(CX)
or a
jr z,firstcolumnpixel
pixelChangerepeat:
ld b,a
ld a,%10000000
pixelChangerepeatLoop:
srl a
djnz pixelChangerepeatLoop
skippixelChangerepeatLoop:
xor (hl)
ld (hl),a
jp cmainLoop
firstcolumnpixel:
ld a,%10000000
jr skippixelChangerepeatLoop
notChangePixel:
cp skenter
ret z
jp cmainloop
displayOuterEdge:
;displays 4 black lines surrounding our grid.
ld hl,39*256+23 ;(23,39) (23,56)
push hl ;-------------
ld d,56 ;| |
ld e,l ;| |
push de ;| |
ld a,1 ;| |
call mos_fastline ;-------------
pop de ;(40,39) (40,56)
ld hl,56*256+40
push hl
ld a,1
call mos_fastline ;doesn't say what's destroyed. Assume all.
pop hl
ld de,39*256+40
push de
ld a,1
call mos_fastline
pop de
pop hl
ld a,1
call mos_fastline
ret
displayGrid:
;Displays the current state of pixels
ld b,8
ld hl,cMouse-1
ld e,22
GridOuterLoop:
push bc
inc hl
ld a,38 ;2 less than what it will display first at
inc e
inc e
ld b,%10000000
GridInnerLoop:
push bc
push hl
push de
push af
ld a,(hl)
and b
jr z,GridDisplayBlank
GridBlack:
pop af
pop de
inc a
inc a
push de
push af
ld l,e
ld b,2
ld ix,Block
call imPutSpriteMask
jr DisplayGridJoin
GridDisplayBlank:
ld de,8
or a
sbc hl,de
ld a,(hl)
and b
jr nz,GridDisplayGrey
GridDisplayBlank2:
pop af
pop de
inc a
inc a
push de
push af
ld l,e
ld b,2
ld ix,Blank
call imPutSpriteMask
DisplayGridJoin:
pop af
pop de
pop hl
pop bc
srl b
jr nz,GridInnerLoop
pop bc
djnz GridOuterLoop
ret
GridDisplayGrey:
ld a,(CGStimer)
srl a
jr c,GridDisplayBlank2
jr GridBlack
Block:
.db %00111111
.db %00111111
Blank:
.db %00111111
.db %00111111
Dummy:
.db 0,0,0,0, ;4 bytes of crap
BlockMask:
.db %11000000
.db %11000000
BlankMask:
.db %00000000
.db %00000000
displayCursor:
;flashes cursor at X,Y
ld a,(cblinktmr)
cp 20
jr nc,CursorcblinkOff
CursorOn:
ld ix,Block
displayCursorBack:
ld a,(CY)
add a,a
add a,24
ld l,a
ld a,(CX)
add a,a
add a,40
ld b,2
call imPutSpriteMask
ret
CursorcblinkOff:
cp 40
call nc,resetcblinktmr
CursorOff:
ld ix,Blank
jr displayCursorBack
resetcblinktmr:
xor a
ld (cblinktmr),a
ret
CCursorMove:
;Makes it blank at last spot
;Makes it solid at next spot
;b = 0 lr, b = 1 ud
push af
push bc
xor a
ld (cblinktmr),a
call CursorOff
pop bc
ld a,b
or a
jr z,CCursorMoveLeftRight
pop af
ld (CY),a
call CursorOn
jp cmainloop
CCursorMoveLeftRight:
pop af
ld (CX),a
call CursorOn
jp cmainloop
Edit: I just reread my above post where I claimed it would save around 30 bytes. It saved 28. a, I'm good ...at estimating...