ZX BASIC:Putchars.bas

From BorielWiki
Jump to: navigation, search

Contents

Putchars

WARNING: THIS subroutine does not check to see if it's writing over the edge of the screen. This is done for speed, but it is the user's job to make sure that all data will fit on the screen!

Usage

There is a an example program that uses this at the end of the page.

 
putChars(x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, dataAddress AS UINTEGER)

Where

  • x is the x value in character co-ordinates
  • y is the y value in character co-ordinates
  • width is the width in characters
  • height is the height in characters
  • dataaddress is the memory address of the UDG style bytes for the character being printed. 8 Bytes to a character. The order is top left to bottom right, first column, then second column, and so forth.


Prints the graphics data to the screen at the given character co-ordinates.

 
    
    SUB putChars(x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, dataAddress AS UINTEGER)
    ' Copyleft Britlion. Feel free to use as you will. Please attribute me if you use this, however!
 
    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

Paint

Usage

There is a an example program that uses this at the end of the page.

 
paint (x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, attribute AS UBYTE)

Where

  • x is the x value in character co-ordinates
  • y is the y value in character co-ordinates
  • width is the width in characters
  • height is the height in characters
  • attribute is the byte value of the attribute to paint to the given co-ordinates. (As one would get from the ATTR function)

Prints the colour data to the screen at the given character co-ordinates.

 
 
SUB paint (x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, attribute AS UBYTE)
    ' Copyleft Britlion. Feel free to use as you will. Please attribute me if you use this, however!
 
    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
 

PaintData

Usage

There is a an example program that uses this at the end of the page.

 
paintData (x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, address AS UINTEGER)

Where

  • x is the x value in character co-ordinates
  • y is the y value in character co-ordinates
  • width is the width in characters
  • height is the height in characters
  • address is the address of the data to copy to the screen's attribute area.

Copies the colour data to the screen at the given character co-ordinates. The order here is Rows and then Columns; so first row, then second row and so on. While this may be awkward, being the other way around to the pixel data, these orders are the most efficient speedwise.


 
 
SUB paintData (x AS UBYTE,y AS UBYTE, width AS UBYTE, height AS UBYTE, address AS UINTEGER)
    ' Copyleft Britlion. Feel free to use as you will. Please attribute me if you use this, however!
 
    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   
 

Example Program

 
    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) 
 
 
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox
Translate
Google AdSense