I was searching for vector clipping routine for MSX, but I was unable to find one... After some discussion with Artrag & co Wouter gave an idea that binary search would be much faster than any dividing & multiplying routine... After some thinking I found out that he was right, so here is my clipping routine based on binary search, in case someone else is looking for something like this as well...
As a proof of concept I also posted a video to display it actually works... The slowness is not caused by the clipping routine it self, but the pretty bad design of BASIC-program I use to demonstrate it.
Here is the code: (Improvement ideas are welcome)
CLIP_VECTOR: ; VECTOR CLIP ROUTINE FOR Z80 ;---------------------------- ; Clip 16bit signed vector to window using binary search ; Feel free to use, but please give me credit ; Made By : NYYRIKKI (2016) ; ; EXTERNAL VARIABLES: ; DW SX = SOURCE X ; DW SY = SOURCE Y ; DW DX = DESTINATION X ; DW DY = DESTINATION Y ; DW USR= OUTPUT DRAW / NOT LD HL,(SY) LD DE,(DY) EXX LD HL,(SX) LD DE,(DX) LD BC,255 ;Upper limit X (lower =0) CALL .CLIP LD BC,211 ;Upper limit Y (lower =0) CALL .CLIP LD (SX),HL LD (DX),DE EXX LD (SY),HL LD (DY),DE LD HL,#FFFF ; Vector is valid and should be drawn LD (USR),HL RET .IGNOREVECTOR POP HL LD HL,0 ; Vector is outside visible area LD (USR),HL RET .CLIP: XOR A SBC HL,DE ADD HL,DE JP M,.NOSWAPSD EXX EX DE,HL EXX EX DE,HL .NOSWAPSD ; HL < DE ADD A,D JP M,.IGNOREVECTOR ; BIGGER < 0 SBC HL,BC JP P,.IGNOREVECTOR ; smaller-BC >0 XOR A ADC HL,BC EXX EX DE,HL EXX EX DE,HL ; DE < HL JP P,.SKIPLOW PUSH HL EXX PUSH HL CALL .BINSEARCH ; If smaller < 0 EXX POP DE EXX POP DE .SKIPLOW XOR A SBC HL,BC JP M,.SKIPHIGH EX DE,HL SBC HL,BC EX DE,HL PUSH DE EXX PUSH DE CALL .BINSEARCH ; If bigger => BC EXX POP DE EXX POP DE EX DE,HL ADD HL,BC EX DE,HL .SKIPHIGH ADD HL,BC EXX ; Swap X/Y RET .BINSEARCH ;------------------------ XOR A SBC HL,DE EX DE,HL PUSH DE SRA D RR E ADD HL,DE POP DE ;HL=middle point, DE=signed LEN EXX XOR A SBC HL,DE EX DE,HL SRA D RR E ADD HL,DE ;HL=middle point, DE=unsigned LEN JP .ENTRYBIN ;------------------------- .LOOPADD: EXX SRA D RR E CALL Z,.EARLYXSHIT ADD HL,DE EXX XOR A ADC HL,DE .LOOPSUB: RET Z SRA D RR E CALL Z,.CHECK0 .ENTRYBIN LD A,H ADD A,A JP C,.LOOPADD EXX SRA D RR E CALL Z,.EARLYXSHIT XOR A SBC HL,DE EXX XOR A SBC HL,DE JP .LOOPSUB .CHECK0 XOR D RET NZ INC E RET .EARLYXSHIT LD A,D OR E RET NZ EXX POP HL LD HL,0 RET
Login or register to post comments