https://www.dynamic-designs.us http://www.dynamic-designs.us/d-dforum/ |
|
Assembly hacking is... http://www.dynamic-designs.us/d-dforum/viewtopic.php?f=32&t=56 |
Page 1 of 1 |
Author: | Bongo` [ Sun Nov 08, 2009 7:48 pm ] |
Post subject: | Assembly hacking is... |
VERY TIME CONSUMING!!! That's especially true when working on games like Chaos Seed and Slayers. In chaos seed, I had to deal with ( and still need to finish ) codind numerous variable width font routines. And the game still screams at Draken due to the lack of Video RAM space allocated per text / menu box. But I trust we will figure something out... As for Slayers, the menu system had to be rewritten three times so far. ( why no word for 3 like twice for 2 ) Once for compression using DTE. That was scratched. Then added 2 Line support, but was still limited. Then I decided to use a form of compression, redirection and space filling. I feel good about my efforts but I swear if anyone else wanted to handle such a thing they would have NOT liked it! Hope you all appreciate our efforts in trying to bring out the best we can achieve with these projects. I attached the core of Slayers' Variable Width ROutine source code for your viewing pleasure. Maybe some one can learn from it! Code: ;###########################################;
; Variable width font routine for Slayers ; ; The change affects the main dialogue only ; ; Compiled using Byuu's xKas software. ; ; NOTE: Code inserted Assuming NO HEADER ; ;###########################################; ;########################## ; Variables that exist # ;########################## !Character = $FFF0 !BitsLeft = $FFF2 !iFlag = $FFF4 !FTable = $FFDE !BkData = $16 !iLoop = $18 !TextPosi = $0A,x !TilePosi = $0D,x !MapPosi = $0E,x !ScrollTilePosi = $1A,x !CharFlag = $FFDC !CharCount = $1C,x ;########################## ; Variables that exist # ;########################## lorom ;###################################################; ; ; ; ; ; Brand new font routine code ; ; ; ; ; ;###################################################; main() { org _NewCodeLocation_ ; _RedirectFontRoutine_: ; 154 BYTES available for new code ; ; Assumes: Y = font index ; X = buffer position for storage ; rep #$20 ; jsl _CalculateFontIndex_ ;---------------------- phb lda.w #_FontData_ sta.b $1A sep #$20 lda.b #$7E pha plb ;---------------------- lda.b $12,x bit.b #$40 beq _UseClearBackGround_ ;------------------- rep #$20 lda.w #$0000 bra _StoreColor_ _UseClearBackGround_: rep #$20 lda.w #$FF00 _StoreColor_: sta.b !BkData ;-------------------------; ; ; ;-------------------------; _StandardVWFont_: ;-------------------------; ; Loop and store the data ; ;-------------------------; sep #$20 lda.w !BitsLeft ; Max pixels per tile is 16 and.b #$0F ; Clear all garbage and use only max tile size ALWAYS! sta.w !BitsLeft ; replace the "pixels remaining" variable ;--------------------------------------; ; Test to see if buffer needs clearing ; ;--------------------------------------; lda.w !BitsLeft+1 ; Test this first because it is set bne _ClearBuffer_ ; when we need to shift data to the left! lda.w !BitsLeft ; If pixels are left on a tile, do not clear bne _NoBufferClear_ ; the existing tile data ;--------------- _ClearBuffer_: jsl _ClearTheBuffer_ ;------------------- _NoBufferClear_: ; rep #$20 ldx #$0010 stx.b !iLoop ldx.w #$0000 ;------------------- _StoreTopAndBottom_: rep #$20 lda [$1A],y xba iny iny ;--------------- phx ;--------------- ldx !BitsLeft+1 bne _ShiftCodeLeft_ ;--------------- _ShiftCodeRight_: ; jsl _ShiftBitsRight_ ; This will shift the character according bra _DidRightShift_ ; to pixels remaining on the current tile ;--------------- _ShiftCodeLeft_: ; jsl _ShiftBitsLeft_ ; This will shift the character according ; to pixels left ;----------------------; ; ; ;----------------------; _DidRightShift_: sep #$20 plx ; Get X back ; Transfer the adjusted font data to the transfer buffer ; jsl _StoreFont_ inx inx cpx.w #$0010 bne _NoAddYet_ ;------------------ rep #$20 txa clc adc.w #$0010 tax sep #$20 ;------------------ _NoAddYet_: ;--------------- dec !iLoop bne _StoreTopAndBottom_ rep #$20 jmp _FinishProcessingText_ ;#######################################################; ; ; ; Location of Most font code, New font and Width table ; ; ; ;#######################################################; org _LocationForCodeProcessing_ ; ;#################; ; Fix pixels left ; ;#################; _FixPixelsLeft_: ; If tile was shifted left give a new BitsLeft php phb ;--------------- sep #$20 lda.b #$7E pha plb ;-------------- lda.w !BitsLeft+1 beq _SetBitsLeft_ ;-------------- rep #$20 lda.w #$0000 sta.w !BitsLeft+1 ; Clear the Left shift flag ;-------------- lda.w $161F sec sbc.w #$0020 inc.w !iFlag ;-------------- plb plp rtl ;-----------------; ; Set pixels left ; ;-----------------; _SetBitsLeft_: lda.w !BitsLeft bne _PixelsLeftOnTile_ ;--------------- lda.b #$10 ldx.w !Character sec sbc.l _FontWids_,x beq _UniversalEnd_ ;----------------- _MultiPurpose_: sta.w !BitsLeft ;-------------- rep #$20 lda.w $161F sec sbc.w #$0020 inc.w !iFlag ;-------------- plb plp rtl ;---------------------; ; ; ;---------------------; _PixelsLeftOnTile_: ; Assumes: Accum = Bits left ; ldx.w !Character sec sbc.l _FontWids_,x bmi _BitsOverFlowed_ beq _UniversalEnd_ bra _MultiPurpose_ ;---------------------; ; ; ;---------------------; _BitsOverFlowed_: ; Calculate what the new pixels left will ; be for the NEW tile! ; eor.b #$FF inc ;-------------- ldx.w !BitsLeft stx.w !BitsLeft+1 ; We want to do a LEFT shift ; with THIS amount next time ;-------------- sta.w !BitsLeft lda.b #$10 sec sbc.w !BitsLeft ;-------------- rep #$20 ldx.b $64 dec !TextPosi ; Go back and get the same character ; but do a LEFT shift instead! sep #$20 ;---------------------; ; Go to Universal End ; ;---------------------; _UniversalEnd_: sta.w !BitsLeft ;-------------- rep #$20 lda.w $161F plb plp rtl ;##############################################; ; ; ; Right Bit Shifting Code ; ; ; ;##############################################; _ShiftBitsRight_: ; ; Assumes X = Index to Shift Table ; php phx rep #$20 pha lda !BitsLeft and.w #$000F bne _ShiftTheData_ ;------------------ pla bra _NoShift_ ;------------------ _ShiftTheData_: dec asl tax pla jmp (_RShifter_,X) _RShifter_: dw _R1,_R2,_R3,_R4,_R5,_R6,_R7,_R8,_R9,_RA,_RB,_RC,_RD,_RE,_RF ;##########################; ; Shift bits to the right ; ;##########################; _R1: LSR _R2: LSR _R3: LSR _R4: LSR _R5: LSR _R6: LSR _R7: LSR _R8: LSR _R9: LSR _RA: LSR _RB: LSR _RC: LSR _RD: LSR _RE: LSR _RF: LSR ;------------; _NoShift_: plx plp rtl ;##############################################; ; ; ; Left Bit Shifting Code ; ; ; ;##############################################; _ShiftBitsLeft_: ; ; Assumes X = Index to Shift Table ; php phx rep #$20 pha lda.w !BitsLeft+1 and.w #$000F ;------------------ _LeftShiftTheData_: dec asl tax pla jmp (_LShifter_,X) _LShifter_: dw _LF,_LE,_LD,_LC,_LB,_LA,_L9,_L8,_L7,_L6,_L5,_L4,_L3,_L2,_L1 ;--------------------; ; Left shifting code ; ;--------------------; _L1: ASL _L2: ASL _L3: ASL _L4: ASL _L5: ASL _L6: ASL _L7: ASL _L8: ASL _L9: ASL _LA: ASL _LB: ASL _LC: ASL _LD: ASL _LE: ASL _LF: ASL ;------------; _NoLShift_: plx plp rtl ;##########################; ; ; ;##########################; _StoreFont_: ; php rep #$20 pha ;---------------- and.w #$00FF ora.l $7E2810,x ; Right side ora.b !BkData sta.l $7E2810,x ; Right side pla xba and.w #$00FF ora.l $7E2800,x ; Right side ora.b !BkData sta.l $7E2800,x ; Left side ;---------------- plp rtl ;##########################; ; ; ;##########################; _ClearTheBuffer_: php phb phy phx ;--------------- rep #$20 lda.b !BkData sta.l $7E2800 ldx.w #$2800 ldy.w #$2802 lda.w #$003D mvn $7E7E ;--------------- plx ply plb plp rtl ;##########################; ; ; ;##########################; _CalculateFontIndex_: pha ; clc adc !FTable+$7E0000 sta !Character+$7E0000 ; How we access a different font table's width data ;---------------------- ; Shift for NEW 16x16 font lda !FTable+$7E0000 ; Accessing a different font table?? rep 4 : asl ; left shift 4 times pha ; lda $03,s asl asl asl asl asl clc adc $01,s tay pla pla rtl ;-------------------------------; ; Where the font data is stored ; ;-------------------------------; _FontData_: ; Font file found here _FontWids_: ; Width file found here } |
Author: | ultpaladin [ Sun Nov 08, 2009 10:53 pm ] |
Post subject: | Re: Assembly hacking is... |
There is no doubt that thousands of people have benefited from the work you and others in DD have done to bring games to English speakers. There doesn't appear to be many people that can match your talents and skills in this area either considering what you have done with games like Mystic Ark and Lennus 2. Thanks again for all your efforts and I hope you gain great satisfaction from it. |
Author: | Red Soul [ Mon Nov 09, 2009 4:07 am ] |
Post subject: | Re: Assembly hacking is... |
Wow Bongo' that's some massive coding there, your talents are indeed priceless my friend and your hacking skills are just as great as your character, so you got it all. Go go Bongo' haha. |
Author: | Wildbill [ Mon Nov 09, 2009 5:13 am ] |
Post subject: | Re: Assembly hacking is... |
...fruitful. I posted some of the result's of Bongo`'s latest menu work on the main page. You should have seen the mess they were in with just the raw inserts, before he sent me the updated files. Of course, it's worth the effort. It gives the structures of these games a professional appearance. That forces me to take my time and try to craft a good story to match. So, Bongo`, why don't you relax for a few days? You've earned it! This menu work he just did seemed to put us over that proverbial hump with Slayers, the point at which the rest of the way should feel increasingly downhill, at least for fleshing out the story. |
Author: | Draken [ Mon Nov 09, 2009 5:14 am ] |
Post subject: | Re: Assembly hacking is... |
Poor Bongo` has to deal with a lot of work. I'm constantly asking him to fix things with Chaos Seed because there are still a lot of things that need to be sorted out. We really should be careful how much workload we send his way. I'm all for helping other groups out, but it seems like he has less and less time to do "our" projects. Anyways... I like that code Bongo`! Sharing with the community is always a good idea. |
Author: | taskforce [ Mon Nov 09, 2009 6:12 am ] |
Post subject: | Re: Assembly hacking is... |
Yeah, I'm delaying sending him anything from Hourai for now so he can focus on other things (and trying to find ways around as many of them as I can to only limited success). However, I'm not so sure I can delay them all much longer. In fact, I guess I should really send him a message now because a certain hack was left unfinished (due to changes in approach) that I really need his help dealing with. |
Author: | Bongo` [ Mon Nov 09, 2009 11:31 pm ] |
Post subject: | Re: Assembly hacking is... |
taskforce wrote: Yeah, I'm delaying sending him anything from Hourai for now so he can focus on other things (and trying to find ways around as many of them as I can to only limited success). However, I'm not so sure I can delay them all much longer. In fact, I guess I should really send him a message now because a certain hack was left unfinished (due to changes in approach) that I really need his help dealing with. Taskforce... Believe it or not, but working on slayers has given me an idea or two that can help on Horai. I have to write down what I mean and present it to you. I had the idea when you asked about the $0C code for the menu text... Well, I have a few ideas and they can be efficient at that too! |
Author: | taskforce [ Tue Nov 10, 2009 2:48 pm ] |
Post subject: | Re: Assembly hacking is... |
Bongo` wrote: taskforce wrote: Yeah, I'm delaying sending him anything from Hourai for now so he can focus on other things (and trying to find ways around as many of them as I can to only limited success). However, I'm not so sure I can delay them all much longer. In fact, I guess I should really send him a message now because a certain hack was left unfinished (due to changes in approach) that I really need his help dealing with. Taskforce... Believe it or not, but working on slayers has given me an idea or two that can help on Horai. I have to write down what I mean and present it to you. I had the idea when you asked about the $0C code for the menu text... Well, I have a few ideas and they can be efficient at that too! Cool. Can't wait to here your ideas. Anything that makes my life easier or this game better, and you know I'm all ears |
Page 1 of 1 | All times are UTC [ DST ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |