ZX BASIC:DoubleSizePrint.bas

From BorielWiki
Jump to: navigation, search

This routine will print out Strings at double size. It will stop if it reaches the end of the screen, however - so you have to deal with new rows on your own! (143 bytes long for main routine)

The core subroutine is capable of printing one character on screen at specified location, in double size. Of course, this is the basis for the second subroutine, that takes a string and prints it all.

Both routines are capable of printing from the User Definable Graphics locations.

Usage:

 
doubleSizePrintChar(y AS UBYTE, x AS UBYTE, thingToPrint AS UBYTE)
'Requires ascii code of character to print.
 
SUB doubleSizePrint(y AS UBYTE, x AS UBYTE, thingToPrint$ AS STRING)
'This version calls the first one, and will print a whole string.

Code:

 
SUB doubleSizePrintChar(y AS UBYTE, x AS UBYTE, thingToPrint AS UBYTE)
' Prints a single character double sized.
' Takes X and Y values as character positions, like print.
' takes an ascii code value for a character.
' By Britlion, 2012.
 
ASM
LD A,(IX+5) 	;' Y value
CP 22
JP NC, doubleSizePrintCharEnd
 
;' A=y value
LD E,A
AND 24			 ; calculate
OR 64			 ; screen
LD H,A			 ; address
LD A,E			 ; FOR 
AND 7			 ; row
OR a			 ; Y
RRA
RRA
RRA
RRA
LD E,A
 
LD A,(IX+7) 	;' X Value
CP 30
JP NC, doubleSizePrintCharEnd
 
ADD A,E			;' correct address for column value. (add it in)
LD L,A
EX DE,HL		;' Save it in DE
 
LD A,(IX+9) 	;'Character
 
CP 164 		;' > UDG "U" ?
JP NC, doubleSizePrintCharEnd
 
CP 32  		;' < space+1?
JP C, doubleSizePrintCharEnd
 
CP 144 		;' >144?
JP NC, doubleSizePrintCharUDGAddress
 
LD L,A
LD H,0
 
ADD HL,HL
ADD HL,HL
ADD HL,HL	;' multiply by 8.
LD BC,(23606)	;' Chars
ADD HL,BC 	;' Hl -> Character data.
EX DE,HL	;' DE -> character data, HL-> screen address.
JP doubleSizePrintCharRotateLoopCharStart
 
doubleSizePrintCharUDGAddress:
LD HL,(23675)    ;'UDG address
SUB 144
ADD A,A         ;multiply by 8.
ADD A,A
ADD A,A
ADD A,L
LD L,A
 
JR NC, doubleSizePrintCharUDGAddressNoCarry 
INC H
doubleSizePrintCharUDGAddressNoCarry:
 
;' At this point HL -> Character data in UDG block.
EX DE,HL ;' DE -> character data, HL-> screen address.
 
doubleSizePrintCharRotateLoopCharStart:
LD C,2 ;' 2 character rows.
doubleSizePrintCharRotateLoopCharRowLoopOuter:
LD b,4 ;' 4 source bytes to count through per character row.
doubleSizePrintCharRotateLoopCharRowLoopInner:
   PUSH BC
 
   LD A,(DE) ;' Grab a bitmap.
   PUSH DE
 
   LD B,4
   LD C,A ; Copy BYTE so we can put two into the big version.
   doubleSizePrintCharRotateLoop1:
      RRA  ; one bit into carry
      RR E ; one bit into result
      RR C ; same bit into carry again
      RR E ; duplicated bit into result
   DJNZ doubleSizePrintCharRotateLoop1 
 
   LD B,4
   doubleSizePrintCharRotateLoop2:
       RRA
       RR D ; Other register FOR other half of big 16 bit line. 
       RR C
       RR D
   DJNZ doubleSizePrintCharRotateLoop2 
 
   LD (HL),D	;' Output first byte
   INC HL	;' Move right
   LD (HL),E	;' Second half.
   DEC HL	;' Move left
   INC H	;' Move down
   LD (HL),D	;' Output second row (copy of first), first byte.
   INC HL	;' Move right
   LD (HL),E	; Output second row, second BYTE
   DEC HL	; Move left
   INC H	; Move down.
   POP DE
   INC DE 
   POP BC
DJNZ doubleSizePrintCharRotateLoopCharRowLoopInner
; CALL __DECY+2 	;'Jump into the DRAW next_line_down routine, at a convenient point (accounting for the INC H above)
; Can't seem to call to this at the moment! Here in longhand form:
 
ld a, h
AND 7
jr nz, doubleSizePrintCharRotateNextCharRow
ld a, l
add a, 32
ld l, a
jr c, doubleSizePrintCharRotateNextCharRow
ld a, h
SUB 8
ld h, a
 
doubleSizePrintCharRotateNextCharRow:
 
DEC C
JR NZ, doubleSizePrintCharRotateLoopCharRowLoopOuter 
 
doubleSizePrintCharEnd:
END ASM
END SUB
 
SUB doubleSizePrint(y AS UBYTE, x AS UBYTE, thingToPrint$ AS STRING)
'Uses doubleSizePrintChar subroutine to print a string.
'By Britlion, 2012
 
   DIM n AS UBYTE
   FOR n=0 TO LEN thingToPrint - 1
      doubleSizePrintChar(y,x,CODE thingToPrint$(n) )
      x=x+2
   NEXT n
END SUB
 

Example:

 
CLS
doubleSizePrintChar(0,0,145)
 
doubleSizePrint(10,0,"Hello World")
 
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox
Translate
Google AdSense