I have a few logs from some conversations on IRC between Gradius and I...don't know if they would be helpful to anyone or not. They are at least nice to read and realize what a great guy he was. He was so patient with me, regardless. So here they are.

Milo, I miss you already.



Session Start: Thu Aug 27 16:53:16 1998
<apester> Hey what was that you were talkin about on the qboard?
<Gradius> you wanted to rip out the opcodes out of the .obj file right?
<apester> yeah
<apester> what's NOP?
-> [gradius] PING
<Gradius> no operation
<Gradius> opcode $90
<Gradius> so that's what the ripper uses to find the beginning and end of the code...3 $90's in a row
<apester> ok
<apester> cool, send it over
<apester> I think I'm finally on the verge of interfacing the two
<apester> I spent awhile looking through my asm books understanding the stack
<Gradius> do you understand the stack now/
<apester> yeah, enough to pass parameters through it
<apester> send the ripper!
<apester> I've got to leave soon
<Gradius> I don't have the ripper, it's on my upstairs computer and my baby brother is sleeping there :(
<Gradius> u make a ripper.
<apester> ok, explain how to grab the opcodes
<Gradius> open the .obj file for binary access read
<Gradius> then look for 3 $90's in a row
<apester> ok
<Gradius> right after them are your opcodes.  Copy them into an array until you hit another row of $90 $90 $90
<apester> oh heh
<apester> that's not too bad :)
<Gradius> I'm sure you can figure it out :P~
<apester> heh, well I can try
<apester> see what I come up with
<Gradius> ok
<apester> ok, well gotta go.  I'll keep you updated
<apester> thanks
Session Close: Thu Aug 27 17:05:44 1998


Session Start: Thu Aug 27 17:37:04 1998
<apester> Heya
<apester> some q's (of course :))
<apester> should I read in the opcode as a string?
<apester> like get #1, , opcode$
<Gradius> read one character at a time
<Gradius> DIM SHARED char as string * 1
<Gradius> and then read a byte like this:
<Gradius> get #1, , char
<Gradius> byte% = ASC(char)
<apester> ok
<apester> brb
<Gradius> k
<apester> how do I know many bytes there are for each opcode?
<Gradius> you don't need to know.
<apester> ah yeah
<apester> I see
<apester> NOP = 90???
<apester> and some negative numbers were popping up as well
<Gradius> nop is $90
<Gradius> hex 
<apester> ahhh
<Gradius> so it's 208 I think in decimal
<Gradius> hmm
<apester> ok there's my prob
<Gradius> no 144
<apester> so I need to convert everything to hex as well
<Gradius> what do you mean???
<apester> well
<apester> hrm
<Gradius> just copy the bytes between the 2 markers ($90 $90 $90) to an array an bsave it
<Gradius> it's hard I know
<Gradius> took me about an hour.
<apester> hah
<apester> :)
<Gradius> maybe more!
<apester> you're funny man
<apester> ok
<Gradius> I try to be funny.
<apester> hey grad?
<apester> how do I know how much to bsave for the array?  Do I multiply the counter * 8?
<Gradius> (um which counter?)
<apester> well the counter that tells how many bytes I've read past the 3 nop's
<Gradius> oh.  The number of bytes to save is the number of bytes between the 2 $90 $90 $90 markers.
<apester> ok
<apester> ok I think I got it
<apester> now I have to ditch the first 7 bytes
<apester> and encode it?
<Gradius> yes
<Gradius> why don't you just not use bsave and write the array by yourself/
<Gradius> ?
<apester> how big can an array be without DIMing it? it's like 10 isn't it?
<Gradius> yup 10
<apester> doh
<apester> I forgot how to output to a sequitial file :)
<Gradius> OPEN filename$ FOR BINARY ACCESS WRITE AS #2
<Gradius> and PUT #2, , variablename
<apester> huh
<apester> no kiddin?
<apester> never seen that one before
<Gradius> no kiddin!
<apester> hrm
<apester> so put #2,, byte should put the opcode into the destination file correct?
<apester> and you should be able to open the destination file and see the opcodes written there
<apester> not encoded or anything
<Gradius> yes that's right
<apester> hrm
<Gradius> (c) class- 1998
** _firestar is on IRC
<apester> the file is coming up encoded
<Gradius> you're getting the wrong opcodes?
<Gradius> (send source please)
<Gradius> Ok I'll look at the files now
<apester> righto
<Gradius> hey I can't look at the flie
<Gradius> file because you saved it in qb mode.  Could you please save it in text mode?
<Gradius> file because you saved it in qb mode.  Could you please save it in text mode?
<apester> oh
<apester> yeah
<apester> just a sec
<Gradius> ok
<apester> hrm
<Gradius> ok Thanks Brandon
<Gradius> hey
<Gradius> aren't you supposed to look for 3 4in a row?
<Gradius> like, following each other.
<Gradius> ?
<apester> heh
<apester> yeah
<apester> oh yeah
<apester> I did it at the end
<Gradius> don't worry I screwed that up to
<Gradius> too
<apester> forgot to do it at the beginning too
<apester> that's not the problem though
<Gradius> it's not? 
<apester> I'm tryin to create a bas file with the data statements in there
<apester> nah, I can output things to a file, and the opcodes are correct and everything
<apester> I can output the opcode
<apester> but how do I put DATA in front of it?
<apester> I'm tryin to do print using
<apester> but it's not workign
<Gradius> nbo
<Gradius> nooo
<Gradius> DATA statements don't work well (or at all) when you compile them.
<apester> really?
<apester> hrm
<apester> what should I do then?
<Gradius> really
<Gradius> !
<Gradius> well, you know encode7.exe?
<Gradius> it doesn't use DATA statements
<apester> yeah
<Gradius> it uses:
<Gradius> decode "(string)"
<Gradius> so it works when  you compile it
<apester> ah ok, I see what you're sayin now
<apester> I thought you meant something else earlier, like I should just write a .bas file from the opcodes
<apester> heh
<apester> ok
<Gradius> aah no just write a binary file with the opcodes and use encode7.exe to make the .bas file.
** _firestar has left IRC
<apester> yeah
<apester> that's what I'm doin now
<Gradius> ok cool
<apester> so then to call
<apester> I do 
<apester> def seg = varseg(sndbin%(0))
<apester> call absolute(param1, param2, param3, sadd(sndbin%))
<Gradius> not sadd
<Gradius> varptr(sndbin%(0))
<apester> ok
<apester> now for the big test!!
<apester> heh
<apester> acutally, can you check the asm code and make sure it's right?
<Gradius> yup send it
<apester> cool
<Gradius> k
<Gradius> What does this routine do?
<apester> it's a putpixel :)
<Gradius> heh..
<Gradius> I just noticed that
<Gradius> :P~
<Gradius> The ret 6 should be an retf 6.  Other than that the routine looks perfect.   Are you using TASM?
<apester> yeah
<apester> it doesn't say retf?
<apester> I thought I put that in there
<Gradius> no it says ret
<Gradius> and did you check the binary file code in debug before you encoded it?
<apester> no
<apester> how do I do that
<Gradius> ok,
** aeon-x is on IRC
<Gradius> type "debug filename"
<apester> yeah
<Gradius> type "u100"
<apester> ok
<apester> it has a bunch of instructions
<apester> not mine though
<Gradius> hmm
<apester> 14A1:0100 0000          ADD     [BX+SI],AL
<apester> 14A1:0102 0000          ADD     [BX+SI],AL
<apester> 14A1:0104 0000          ADD     [BX+SI],AL
<apester> 14A1:0106 0000          ADD     [BX+SI],AL
<apester> 14A1:0108 0000          ADD     [BX+SI],AL
<apester> 14A1:010A 0000          ADD     [BX+SI],AL
<apester> 14A1:010C 0000          ADD     [BX+SI],AL
<apester> 14A1:010E 0000          ADD     [BX+SI],AL
<apester> 14A1:0110 0000          ADD     [BX+SI],AL
<apester> 14A1:0112 0000          ADD     [BX+SI],AL
<apester> 14A1:0114 0000          ADD     [BX+SI],AL
<apester> 14A1:0116 0000          AD
<Gradius> 0's.
<Gradius> they're all 0's apester!   How big is the binary file/
<Gradius> ?
<apester> 1k
<apester> doh!
<apester> I didnt close the output file
<apester> argh
<Gradius> ok
<apester> I'm gonna try again
<apester> to debug it
<Gradius> ok
<apester> still garbage
<apester> -n snd.bin
<apester> -u100
<apester> 14A1:0100 0000          ADD     [BX+SI],AL
<apester> 14A1:0102 0000          ADD     [BX+SI],AL
<apester> 14A1:0104 0000          ADD     [BX+SI],AL
<apester> 14A1:0106 0000          ADD     [BX+SI],AL
<apester> 14A1:0108 0000          ADD     [BX+SI],AL
<apester> 14A1:010A 0000          ADD     [BX+SI],AL
<apester> 14A1:010C 0000          ADD     [BX+SI],AL
<apester> 14A1:010E 0000          ADD     [BX+SI],AL
<apester> 14A1:0110 0000          ADD     [BX+SI],AL
<apester> 14A1:0112 0000          ADD     [BX+SI],AL
<apester> 14A1:0114 0000          ADD     [BX+SI],AL
<apester> 14A1:01
<apester> hrm
<apester> a little past that is the NOP
<Gradius> ok do this
<Gradius> exit debug
<apester> ok
<Gradius> type "debug snd.obj"
<Gradius> now type "f100 ffff 00"
<Gradius> now tupe "l" (l for load)
<Gradius> ok got that?
<apester> yeah
<apester> I have a little dos box
<Gradius> ok now type "scs:100 ffff 90 90 90"
<Gradius> it should give you 2 lines
<Gradius> segment:offset
<Gradius> is that right?
<apester> yeah
<apester> 14a1:01b5
<Gradius> ok type "u01b5"
<apester> 14a1:01ed
<Gradius> and your code should be there
<apester> hahaa yeah
<apester> a bunch of shl cx, 1
<apester> :)
<Gradius> so is that your code?
<apester> it doesn't have all the code listing thuogh
<apester> well translated it is
<apester> I have shl cx, 8
<apester> but debug is 8086/8088 only right?
<Gradius> yup
<Gradius> and so is qbasic
<apester> ok
<apester> the code is inthe binary file also
<apester> at 01b5
<apester> so now what?
<Gradius> can you paste up the screen of "u1b5"?
<apester> sure
<Gradius> thanx
<apester> -n snd.bin
<apester> -u01b5
<apester> 14A1:01B5 90            NOP
<apester> 14A1:01B6 90            NOP
<apester> 14A1:01B7 90            NOP
<apester> 14A1:01B8 55            PUSH    BP
<apester> 14A1:01B9 8BEC          MOV     BP,SP
<apester> 14A1:01BB 8B4E08        MOV     CX,[BP+08]
<apester> 14A1:01BE 8B5E06        MOV     BX,[BP+06]
<apester> 14A1:01C1 8A4604        MOV     AL,[BP+04]
<apester> 14A1:01C4 8BF9          MOV     DI,CX
<apester> 14A1:01C6 D1E1          SHL     CX,1
<apester> 14A1:01C8 D1E1          SHL     CX,1
<apester> 14A1:01CA D1E1          SHL     CX,1
<apester> 14A1:01CC D1E1          SHL     CX,1
<apester> 14A1:
<apester> it isn't pasting everything I copied
<Gradius> ok, it's your code.
<apester> yeah
<Gradius> so there's nothing wrong with the .obj file
<apester> so shuold I try to encode and run it again?
<Gradius> and there's nothing wrong with the encoder, I'm assuming
<Gradius> so the flaw must be in the .obj ripper
<apester> ok
** _firestar is on IRC
<Gradius> send me the .obj ripper, I'd like to see it
<apester> sure
<Gradius> (plz...))
<apester> you don't have to say please man :)
<Gradius> Thanks Brandon!
<apester> hah
<apester> you're too nice Milo
<apester> :)
<Gradius> e is inthe binary file also
<Gradius> <apester> at 01b5
<Gradius> IF byte = 144 THEN nopcount = nopcount + 1
<Gradius> see that?
<Gradius> change it to:
<Gradius> IF byte = 144 THEN
<Gradius>   nopcount = nopcount + 1
<Gradius> ELSE
<Gradius>   nopcount = 0
<Gradius> END IF
<Gradius> now that won't totally fix it but it'll look for 3 nop's in a row.
<Gradius> 4in a row
<Gradius> heh
<Gradius> :P~
<apester> heh
<apester> well I can fix that later
<apester> this is just for me :)
<apester> and I know I've got 3 in a row
<apester> hrm
<Gradius> no you don't because the .obj file has crap in the begiining.  There coule be $90's all over the place!!
<apester> only took you an hour huh? :)
<apester> oh heh
<Gradius> well..maybe 2 hours.
<apester> I guess I should fix that then
<Gradius> yes.  But then your tail-end nop's detection won't work so you'll have to find a way to make it work.
** thehornet is on IRC
<apester> ok
<apester> heh
<apester> this is a horrible looking piece of code
<apester> but I think it should work
<Gradius> ok cool
<Gradius> have you ever considered setting your tab stops to 2?
<apester> nah I don't use tab
<apester> I just indent for an arbitray amount :)
<Gradius> (Whoa your code is a huge wave!)
<apester> *cough* *cough* draw93.bas *cough* *cough*
<apester> heh
<Gradius> um
<apester> more imporantly it detects the entry and exit points
<Gradius> ok never mind
<Gradius> it works?
<apester> yeah
<apester> or I think it does
<apester> heh
<apester> it worked when I tried it
<Gradius> ok...I'll *try* to read through it
<apester> :D
<apester> damnit
<apester> well it crashed again
<Gradius> aah damn
<apester> this is so frustrating
<apester> there's like 50 things that could be wrong :P
<apester> does the obj.bas code look ok
<apester> ?
<Gradius> I'll read through all the code right now, ok?
<apester> ok
<Gradius> does it say "Entry point not found" all the time?
<Gradius> ok
<apester> hrm
<apester> Entry Point Found you mean?
<Gradius> The code looks alright...almost
<apester> or did I type that in wrong too?
<apester> heh
<Gradius> Does it say "Entry point found?"
<Gradius> ever?
<apester> yeah
<apester> and exit point found
<apester> too
<apester> I tested some other files and it didn't give any message
<apester> so I think it's working
<Gradius> When you encounter a chr$(144), write it to the binary file anyway.
<apester> ok
<apester> is yer little bro awake yet?
<apester> :)
<Gradius> otherwise if there was a single $90 somewhere, the code would cut it out.  Send me the updated .bas flie when done.
<apester> I wanna see yours
<apester> ok
<Gradius> apester: I think Danny is still sleeping
<apester> ah hah
<Gradius> looks good.  And in your last loop put:
<apester> the new bin file is a few bytes bigger then the old one
<Gradius> LOOP UNTIL EOF(1) = -1 OR exitcode = -1
** _firestar has left IRC
<apester> but that might just be from the last 90's
<apester> ah yeah, good idea
<Gradius> and then it should work, theoretically.
<apester> heh
<apester> well here we go
<Gradius> dont crash out dude.
<Gradius> :P~
<apester> argh
<apester> maybe I'm doin something wrong in the call absolute
<Gradius> Are the opcodes right in the binary file?
** aeon-x has left IRC
<apester> lemme check
<Gradius> Did you fix the bottom loop?
<apester> yeah
<apester> how do I find where my code begins again?
<apester> in the binary file?
<apester> I suppose I could just scroll up :P
<Gradius> it's supposed to be at 0100
<Gradius> u100
<Gradius> Did the routine crash your computer or no/
<apester> yeah it did
<apester> it's not at 100
<apester> still
<Gradius> hmm
<Gradius> is it anywhere in the output file?
<apester> I'm tryin to find it
<Gradius> hmm
<Gradius> that is so weird.
<apester> it's not givin the seg:offset of the code
<apester> when I do scs: 100 ffff 90 90 90
<Gradius> hey Apester I have to go to sleep now
<apester> heh ok
<apester> thanks for all your help :)
<Gradius> yup
<Gradius> I'll still be in #quickbasic
<Gradius> for a while
<apester> maybe some day I can get asm + qb working in harmony :)
<Gradius> good work though, good effort.  We spent 4 hours on it!  :P~
<apester> heh
<apester> I'll stay up all night if I have to :)
<Gradius> ok great!
<apester> oh quick q
<Gradius> ya
<apester> what does the f100 thing do in debug
<apester> and the scs: 100
<apester> is that like a search thing?
<Gradius> yup
<Gradius> it's format is: scs: (start offset) (end offset) (byte pattern)
<Gradius> so before we had s cs:100 ffff 90 90 90
<apester> ok, get a good night's sleep.  Hopefully I can dcc you my working routine tommorow :)
<apester> or sunday
<apester> even ;p
Session Close: Thu Aug 27 20:24:25 1998

Session Start: Fri Aug 28 16:35:33 1998
Session Ident: Gradius (gradius@cr96402-a.lndn1.on.wave.home.com)
<Gradius> hello?
<Gradius> hey
Session Close: Fri Aug 28 19:00:51 1998

Session Start: Sat Aug 29 16:05:43 1998
<apester> here
<apester> I was lookin at this stuff awhile ago
<Gradius> thanks
<apester> sorry, didnt' want to zip em all :_)
<apester> hehe
<Gradius> thanks
<apester> these were all written by a guy named yoshi
<apester> big in the emu scene
Session Close: Sat Aug 29 16:09:18 1998

Session Start: Sun Aug 30 19:56:15 1998
<apester> hey I gotta q
<apester> if you don't mind
<Gradius> hi
<Gradius> yup
<apester> ok
<apester> would it be faster to
<apester> a)write a seperate routine for tiles I knew were going to be clipped
<apester> b)make one tile routine
<apester> I don't know much about branching times and stuff
<apester> but if I knew 90% f the tiles didn't need to be clipped it seems like it would be faster to make an optimized non clip routine
<Gradius> a conditional jump that does not get taken takes 3 cycles to execute
<Gradius> make an optimized non-clip routine
<apester> ok :)
<apester> btw, I got all the clipping working :)
<apester> after ripping most of my hair out
<Gradius> don't worry, I don't have any hair left either.
** thehornet has left IRC
** thehornet is on IRC
Session Close: Sun Aug 30 20:24:55 1998

Session Start: Tue Sep 01 18:13:35 1998
<apester> hey can you send that code back over
<apester> I was doing something and fucked up my program
<apester> and somehow I saved over it
<apester> PBs IDE sucks
<Gradius> ok
<apester> is this the write file?
<apester> err right
<Gradius> sorry about the first file
<Gradius> my mouse thought I clicked the button twice
<apester> heh
** happy303 is on IRC
Session Close: Tue Sep 01 18:20:24 1998

So that's it...the las ttime I ever talked to him was right then... I believe it was the last time he wason IRC also.