Inferno #07
31 мая 2005 |
|
For Coderz - How a large Flexible Program.
Transferability of programs Since large programs are not kept on some JR, yes and, moreover, have re variables, then tell you how to make a big relocatable program. For example, it is at changes to program the cache: one the same fragment works in one case in Cache, and in another - in the ordinary RAM. 1. With the creation of tables in the semi-manual mode Applies, for example, in Pro Tracker'e when compiling the music player. PT storage nit player, originally otassemblirovanny at # c000. To make it work tal to the right address, the contents of some its cells (which refer to the address procedures and variables) pereschityvayutsya.Ad rez themselves are calculated cells are stored in a special table. More precisely, instead of Adre owls kept there distance from the previous ing cells are calculated to the next (So decided to save the first author of Pro Tracker'a, because the table is constantly lies in the memory). LD A, (SNGST +1); A = high byte, ; Address to which we ; Compile player LD IX, TRELOC; address table ; Displacement (relocation) LD HL, plaer; where the player is LD D, # C0; byte address to , Which last time ; Compiled Player LD ($ -1), A LD E, A LD B, L REL0 LD C, (IX) LD A, C AND A RET Z; code 0 - end of the table INC IX ADD HL, BC INC A JR Z, REL0; code 255 LD A, (HL) SUB D ADD A, E LD (HL), A JR REL0 Code 255, as we see, particularly - he misses 255 bytes, if the cell to the next higher 255 bytes (not exactly 255 bytes). Relocation table compiled by comparison of two player options: one compiled under # c000, and the other - under the # C100. Here sravnivalka: ORG # A000 P1 INCBIN "PLYC0"; player, , Compiled by # C000 E1 ORG # C100 P2 INCLUDE "playFAST", # C4; same ; Player, will be ; Compiled under # C100 module; module address = address end player. , Then the module address in this instance ; Player will be moved to # 100 bytes , Compared with an instance of "PLYC0" ORG # 6000 LD IX, TAB LD HL, P1 LD DE, P2 LD C, 0 CP0 LD A, (DE) SUB (HL) JR Z, CPOK; bytes differ? DEC A; bytes differ by 1? JR NZ, ERR; NO ???-> out by mistake LD (IX), C INC IX LD C, 0 CPOK INC HL INC DE INC C JR NZ, CPNOFF LD (IX), 255 INC IX LD C, 1 CPNOFF LD A, L CP E1 JR NZ, CP0 LD A, H CP 'E1 JR NZ, CP0 LD (IX), 0 INC IX RET ; Out by mistake: we slipped significantly ; Different files players ERR LD HL, 0 LD DE, # 5800 LD BC, 768 LDIR RET TAB = # 7000 The procedure should be run from the STS. Address end of the table will see the register IX. 2. With the creation of tables automatically In PT Util for compiling the table when changes more convenient method, in which assemble necessary not 2-3, but only 1. Here's how. Player for PT Util sits in a separate source code, which when it INCLUDE'inge main program is assembled as Oba esidual player. But if his attempt Otas semblirovat as an independent program Therefore, we: 1. Avtoopredelyaetsya: address compilation pa Veins # 8000, therefore, need to make compilation to create peremeschalnoy Table Litsa. 2. Player is assembled as a macro MACRO pp (All completely driven into the macro), PA mashing is not placed. (The same occurs leads and referred INCLUDE'inge.) 3. Macro player assembled on-us toyaschemu with local labels, under the address # 8000. (But this is not at INCLUDE'inge occurs.) 4. Macro player assembled on-us toyaschemu again, not with the local label mi, under the address # C000. (And if INCLUDE'inge - under an address that was current at the time Team INCLUDE.) 5. Sravnivalka assembled. Address for start-up programs - go to sravnivalku. Ie: run on RUN - compiled table. You can save it manually. Later I learned protsedurku SAVEOBJ, it is the month then apply here - then on the RUN table not only the composition but also to continue. AND if all - the table is already possible to use in the main program by INCBIN. In about cedure SAVEOBJ piece of initialization program (more precisely, of implied as such - for example, from our sravnivalki) You can go through JP nenado. I mean my version SAVEOBJ, rather than the one distributed Capry. 3. Through macros j, c, l In ZXRar I realized even more convenient way: the table movement is based directly at the stage of assembling the main program We, ourselves alasmom. However, no INCBIN do not need. For such a method is required to determine following macros: MACRO rg CurCa = $ ORG RelCa DW CurCa + RelCa = $ ORG CurCa ENDM MACRO j 2 rg IFN? J1-2, there is the 2 nd option ; Macro? JP , 1, if there is, such a JP ELSE JP And if not, then edakii ENDIF ENDM MACRO c 2 rg IFN? J1-2 CALL 1 ELSE CALL ENDIF ENDM MACRO l LD 1 rg 0-1; just -1 in the old alasmah And it was impossible, since in a macro ; Rg would be obtained CurCa + -1. ; In the new can. ENDM And they are used in movable fragments those commands instead of JP [cc,] nn, CALL [cc,] nn, LD (...), rp, LD rp ,(...). But you first need to specify the starting address, from which to build the table: RelCa = # C000 As we see here each relotsiruemy address has 2 bytes in the table (and not 1, as was the Pro Tracker'e). Here savings memory to anything - because you need a table lko at the launch stage ZXRar'a. Here's the place the initialization procedure in ZXRar, which is responsible for throwing moved fragment ZXRar in the cache (before preliminarily find out whether the computer cache): DI IN A, (# FB) LD H, 0 LD A, (HL) INC (HL) CP (HL) JR Z, ncach LD HL, End; here lies the table. ; Relocation. ; Why here - see below! LD B, RelSz; length of the table. relocation. ; How it feels - see below Rel0 LD E, (HL) INC HL LD D, (HL) INC HL LD A, (DE) SUB 'cachecode LD (DE), A DJNZ Rel0 LD HL, cachecode LD D, B, E, L; low byte address , Not me, but the senior will be 0 LD B, 'cachelen +1; instead ; LD BC, cachelen ; (Win = 1 byte) LDIR ncach Before autobuild ZXRar'a table Reuleaux cation must, of course, throw in the tail program to get a code block. Here's how to do drawn after dnie line source code ZXRar'a: DISPLAY "reloc tab end =", RelCa End = end RelSz = RelCa-# C000 / 2 end = RelSz * 2 + end INCLUDE "mrip *", # C0; avtosborschik ; (See IG # 5) ORG $ LD HL, # C000 LD DE, End LD BC, RelSz * 2 LDIR JP nenado With nenado the same focus that was the case SAVEOBJ. This transition to sohranyalku (if withheld Caps Shift) or launch prog FRAMEWORK at GO (If Caps Shift otpu Puppy). A. Coder
Other articles:
Similar articles:
В этот день... 23 November