The following warnings occurred:
Warning [2] Undefined array key 0 - Line: 1677 - File: showthread.php PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/showthread.php 1677 errorHandler->error_callback
/showthread.php 916 buildtree




Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
BritLion's Putchars
#1
LCD play with this.

The question is, this doesn't do attributes right now. How would you want that handled?

1> Assume it's at the end of the data block? (So if you use putchars for one character, it's the 9th byte. For a 2X2 block, it's the 65th, 66th, 67th and 68th...
2> A separate putAttribs function that works the same way
3> Leave it up to the user to do print at y,x, over 1, paper x, ink y;"<space>"

Something else?

I haven't tested mine against yours, I'm just assuming because of code efficiency, this is faster screen handling.
Edit: See below for test results

Edit: Fixed a bug - in BLPutCharNextThird add HL,DE and POP DE were backwards. Thanks to Compiuter for reporting this.

Edit: Shaved a few clock cycles off the graphics printing, and added a paint sub

Edit: Added a paintData sub

Code:
SUB paint (x as uByte,y as uByte, width as uByte, height as uByte, attribute as ubyte) asm ld a,(IX+7) ;ypos rrca rrca rrca ; Multiply by 32 ld l,a ; Pass to L and 3 ; Mask with 00000011 add a,88 ; 88 * 256 = 22528 - start of attributes. Change this if you are working with a buffer or somesuch. ld h,a ; Put it in the High Byte ld a,l ; We get y value *32 and 224 ; Mask with 11100000 ld l,a ; Put it in L ld a,(IX+5) ; xpos add a,l ; Add it to the Low byte ld l,a ; Put it back in L, and we're done. HL=Address. push HL ; save address LD A, (IX+13) ; attribute LD DE,32 LD c,(IX+11) ; height BLPaintHeightLoop: LD b,(IX+9) ; width BLPaintWidthLoop: LD (HL),a ; paint a character INC L ; Move to the right (Note that we only would have to inc H if we are crossing from the right edge to the left, and we shouldn't be needing to do that) DJNZ BLPaintWidthLoop BLPaintWidthExitLoop: POP HL ; recover our left edge DEC C JR Z, BLPaintHeightExitLoop ADD HL,DE ; move 32 down PUSH HL ; save it again JP BLPaintHeightLoop BLPaintHeightExitLoop: end asm END SUB SUB paintData (x as uByte,y as uByte, width as uByte, height as uByte, address as uInteger) asm ld a,(IX+7) ;ypos rrca rrca rrca ; Multiply by 32 ld l,a ; Pass to L and 3 ; Mask with 00000011 add a,88 ; 88 * 256 = 22528 - start of attributes. Change this if you are working with a buffer or somesuch. ld h,a ; Put it in the High Byte ld a,l ; We get y value *32 and 224 ; Mask with 11100000 ld l,a ; Put it in L ld a,(IX+5) ; xpos add a,l ; Add it to the Low byte ld l,a ; Put it back in L, and we're done. HL=Address. push HL ; save address LD D, (IX+13) LD E, (IX+12) LD c,(IX+11) ; height BLPaintDataHeightLoop: LD b,(IX+9) ; width BLPaintDataWidthLoop: LD a,(DE) LD (HL),a ; paint a character INC L ; Move to the right (Note that we only would have to inc H if we are crossing from the right edge to the left, and we shouldn't be needing to do that) INC DE DJNZ BLPaintDataWidthLoop BLPaintDataWidthExitLoop: POP HL ; recover our left edge DEC C JR Z, BLPaintDataHeightExitLoop PUSH DE LD DE,32 ADD HL,DE ; move 32 down POP DE PUSH HL ; save it again JP BLPaintDataHeightLoop BLPaintDataHeightExitLoop: end asm END SUB SUB putChars(x as uByte,y as uByte, width as uByte, height as uByte, dataAddress as uInteger) asm BLPutChar: LD a,(IX+5) ;AND 31 ld l,a ld a,(IX+7) ; Y value ld d,a AND 24 add a,64 ; 256 byte "page" for screen - 256*64=16384. Change this if you are working with a screen address elsewhere, such as a buffer. ld h,a ld a,d AND 7 rrca rrca rrca OR l ld l,a PUSH HL ; save our address LD E,(IX+12) ; data address LD D,(IX+13) LD B,(IX+9) ; width PUSH BC ; save our column count BLPutCharColumnLoop: LD B,(IX+11) ; height BLPutCharInColumnLoop: ; gets screen address in HL, and bytes address in DE. Copies the 8 bytes to the screen ld a,(DE) ; First Row LD (HL),a INC DE INC H ld a,(DE) LD (HL),a ; second Row INC DE INC H ld a,(DE) LD (HL),a ; Third Row INC DE INC H ld a,(DE) LD (HL),a ; Fourth Row INC DE INC H ld a,(DE) LD (HL),a ; Fifth Row INC DE INC H ld a,(DE) LD (HL),a ; Sixth Row INC DE INC H ld a,(DE) LD (HL),a ; Seventh Row INC DE INC H ld a,(DE) LD (HL),a ; Eigth Row INC DE ; Move to next data item. DEC B JR Z,BLPutCharNextColumn ;The following code calculates the address of the next line down below current HL address. PUSH DE ; save DE ld a,l and 224 cp 224 jp z,BLPutCharNextThird BLPutCharSameThird: ld de,-1760 ;and a add hl,de POP DE ; get our data point back. jp BLPutCharInColumnLoop BLPutCharNextThird: ld de,32 ;and a add hl,de POP DE ; get our data point back. JP BLPutCharInColumnLoop BLPutCharNextColumn: POP BC POP HL DEC B JP Z, BLPutCharsEnd INC L ; Note this would normally be Increase HL - but block painting should never need to increase H, since that would wrap around. PUSH HL PUSH BC JP BLPutCharColumnLoop BLPutCharsEnd: end asm END SUB goto start datapoint: asm defb 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 defb 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 defb 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96 defb 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128 end asm start: cls putChars(10,10,3,3,@datapoint) paint(10,10,3,3,79)
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)