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
Compiuter PlotChat
#1
I am working in this routine pixel-precise.
It is ripped from microhobby and wos forum.
Modified by me. I need help to complete the paint attributes method, because in asm my routine works fine, baut when I passed t sub It fails.
Here is the code.
Modified 20-June-2010 included colour ripped by wos
Modified 21-June-2010 included attributes in the same sub.
Now are two independent subs methods:
1.-PlotChar(file,column,CharAdr)
PlotCharPaint(file,column,atribute)
2.- PlotChat(file,column,CharAdr,atrib)
Probably, this is the last update for this routine.

Modified 2010-07-09 including fastcall and all asm routines embebed. The on ly problem is because the rets in atributes process make me save three bytes in printer buffer. Also I can not use Ubyte in fastcall because I do not understand how it works.
Code:
'========================== '=plotchat=v3.100709======= '========================== 'ripped from microhobby and 'wos forum 'thx to britlion lcd boriel '-------------------------- border 6 cls 'demo of PlotChar Dim YoF,YoC As Ubyte YoF=50:YoC=70 YoCharAdr=@manwen PlotChar(100,200,YoCharAdr) PlotCharPaint(100,200,01101001b) '--- dim w as ubyte w=0 '--- PlotChat((256*32)+512,@manwen,01101001b) do 'char paper7 = 00111010b PlotChat(w,@manwen,00110010b) asm halt ;slow movement end asm PlotChat(w,@manwen,00111010b) w=w+1 ' YoF=YoF+1 loop until w>255 end '=fin====================== FUNCTION FASTCALL PlotChat(paramHL AS Uinteger,paramDE AS Uinteger,paramBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup ret pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;para: ; ld hl,16384 ; ld (hl),a ; jr para ;el atributo viene en L ;en de debe estar manwen ;en bc estan las coords b-row c-col ;descartamos a=pareado del atributo ;--- ;enterramos las coords ld a,c ld (23500),a ld a,b ld (23501),a ;enterramos el atrib para luego ld a,l ld (23502),a ;--- ;comment halt for thrust the movement halt prixoratr: ;-------------------- ;entrada e=dirmemLB 22 ; d=dirmemHB 256*X ; H=pareja del atributo ; L=atributo 33 ; b=coord row 256*X ; c=coord colum 11 ; a=se queda a cero ; 1er byte de la figura? ;-------------------- ; ld e,(IX+7) ;file ; ld d,(IX+5) ;colum ; ld l,(IX+8) ;lowbyte charadr ; ld h,(IX+9) ;highbyte charadr ex de,hl ld d,b ld e,c ld b,8 bucbyt2: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit2: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot2 ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co2 ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot2: inc e ;inc x pop bc ;recup cont bits djnz bucbit2 ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt2 ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co2: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c12: RRA ;A=1000-0000 DJNZ c12 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro ;RET ;----------------- priatr2: ;Ripped from Wos-Turkwel ; ld c,(IX+7) ; ld b,(IX+5) ; ld a,(IX+11) ;desentierro coords push hl ld hl,23500 ld c,(hl) inc hl ld b,(hl) ;desenterramos el atrib inc hl ld a,(hl) pop hl ;use alongside the print_char routine to set Attribute values automatically....... ;on entry BC uses exactly the same Y\X values as the print_char routine and A holds the Atrribute Value to be used. ; ;NB If you don't want to use A this way then set up something like ld a,(nnnn) at the start of the print_attribute routine ;instead and that way you can use your own "Sytem Variable" for printing each time ; ;suggested use: ld a,"A" ; ld bc,184*256+249 ; push bc ; call print_char ; pop bc ; ld a,128+64+5 ; call print_attribute ; ret ; ;alternatively you can integrate this into the print_char routine by looking after BC and A...it doesn't matter which way ;round you use it...char\attributes or attributes\char print_attributew: ld d,0 ld e,a ;transfer Attribute Byte to e for easier use ld a,b cp 192 ret nc ;check Y position and exit if off bottom of screen push bc ;save off Y and X values for later and 248 ld h,22 ld l,a add hl,hl add hl,hl srl c srl c srl c ld b,d add hl,bc ;calculate the correct Attribute Address for the Y\X values ld (hl),e ;set the Attribute - this is ALWAYS set no matter what the valid Y\X values used pop bc ;get the Y and X values back into BC call print_attribute2 ;call the subroutine to see if an adjacent Horizontal Attribute needs to be set ; ld a,b cp 184 ret nc ;check to see if we are at Vertical character 23 - if so then no need to set adjacent Vertical Attribute & Exit routine and 7 ret z ;and don't set the adjacent Vertical Attribute if there's no need to & Exit routine ld a,l add a,32 ld l,a ld a,d adc a,h ld h,a ld (hl),e ;set the Attribute address to the line below - and set the adjacent Vertical Attribute ; ;drop through now into adjacent Horizontal Attribute subroutine - all RETs will now Exit the routine completely ; print_attribute2w: ld a,c cp 248 ret nc ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 ret z ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back ret end asm end function 'fin del fastcall plotchat '========================== FUNCTION FASTCALL PlotChar(ROWparamHL AS Uinteger,COLparamDE AS Uinteger,ADRparamBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup retorno pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;---entrada---------------- ;ROWparamHL bring C uinteger ;COLparamDE bring E uinteger ;ADRparamBC bring hl uinteger ;-------------------------- prixor: ;-------------------- ;entrada e=columnaDF ; d=filaDF ; hl=dirmem figura ; a=primer byte de figura ; ;-------------------- ld d,c ;row ;ld e,e ;col ;change order row x col ;hl ya viene predicho ;ld l,(IX+8) ;lowbyte charadr ;ld h,(IX+9) ;highbyte charadr ld b,8 bucbyt: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot: inc e ;inc x pop bc ;recup cont bits djnz bucbit ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c1: RRA ;A=1000-0000 DJNZ c1 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro ret end asm end function 'fin del fastcall plotchar '========================== sub PlotCharViaSub(row as ubyte,colum as ubyte, charadr as uinteger) asm halt prixor3: ;-------------------- ;entrada e=columnaDF ; d=filaDF ; hl=dirmem figura ; a=primer byte de figura ; ;-------------------- ld e,(IX+7) ;row ld d,(IX+5) ;colum ld l,(IX+8) ;lowbyte charadr ld h,(IX+9) ;highbyte charadr ld b,8 bucbyt3: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit3: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot3 ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot3: inc e ;inc x pop bc ;recup cont bits djnz bucbit3 ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt3 ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co3: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c13: RRA ;A=1000-0000 DJNZ c13 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro RET end asm end sub '========================== FUNCTION FASTCALL PlotCharPaint(ROWparamHL AS Uinteger,COLparamDE AS Uinteger,ATRparamBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup retorno pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;---entrada---------------- ;ROWparamHL bring C uinteger ;COLparamDE bring E uinteger ;ATRparamBC bring hl uinteger ;-------------------------- priatr: ;Ripped from Wos-Turkwel ld b,c ld c,e ld a,l ;atr ok ;use alongside the print_char routine to set Attribute values automatically....... ;on entry BC uses exactly the same Y\X values as the print_char routine and A holds the Atrribute Value to be used. ; ;NB If you don't want to use A this way then set up something like ld a,(nnnn) at the start of the print_attribute routine ;instead and that way you can use your own "Sytem Variable" for printing each time ; ;suggested use: ld a,"A" ; ld bc,184*256+249 ; push bc ; call print_char ; pop bc ; ld a,128+64+5 ; call print_attribute ; ret ; ;alternatively you can integrate this into the print_char routine by looking after BC and A...it doesn't matter which way ;round you use it...char\attributes or attributes\char print_attribute: ld d,0 ld e,a ;transfer Attribute Byte to e for easier use ld a,b cp 192 ret nc ;check Y position and exit if off bottom of screen push bc ;save off Y and X values for later and 248 ld h,22 ld l,a add hl,hl add hl,hl srl c srl c srl c ld b,d add hl,bc ;calculate the correct Attribute Address for the Y\X values ld (hl),e ;set the Attribute - this is ALWAYS set no matter what the valid Y\X values used pop bc ;get the Y and X values back into BC call print_attribute2 ;call the subroutine to see if an adjacent Horizontal Attribute needs to be set ; ld a,b cp 184 ret nc ;check to see if we are at Vertical character 23 - if so then no need to set adjacent Vertical Attribute & Exit routine and 7 ret z ;and don't set the adjacent Vertical Attribute if there's no need to & Exit routine ld a,l add a,32 ld l,a ld a,d adc a,h ld h,a ld (hl),e ;set the Attribute address to the line below - and set the adjacent Vertical Attribute ; ;drop through now into adjacent Horizontal Attribute subroutine - all RETs will now Exit the routine completely ; print_attribute2: ld a,c cp 248 ret nc ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 ret z ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back ret end asm end function '========================== '----------------- '------ manwen: asm db 00011000b db 00001010b db 01111110b db 01011000b db 00011000b db 00111100b db 00100100b db 00000000b end asm '--- '==========================
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)