Adventurer #06
28 февраля 1997 |
|
Exchange of experience - How to make a disc version? ..
(C) RAY (C) Music PHANTOM LORD / ACCEPT CORP. HOW TO MAKE A disk version You certainly know this situation: when loading a program (No matter the game or sistemka) receive the message "Disked by ...", a then when you try to, say, download something, you see the blinking Border. What words will be spoken against the very "disketizatora" I hope you can guess. In general, I think so: You can write to loader, the program disketirovana only if done full disk version. If you just prilyapan Thesis kovy loader, then it is better to write nothing, or note that is not fully de- prog disketirovana. True latest version of the very few people can organize, so I share with you some information about how to make a full disc version program. So, you have a code block, in which you want to change the up / downloading any data from tape to disk. First, consider the load address of the block. Usually one less than the address set stack. (NOTE: Make sure that after running the program does not change its position in memory, in particular, throws himself whether the address below!) Typically, the minimum address is 24500. If you block this address or greater - All DC, 90%, that problems with the alteration under the disc does not arise. If not - the situation is slightly more complicated and we consider later (in this article the disketizatsiya standard methods of TR-DOS). Before you look for entry points tape loading procedure and write, it is useful to view the entire memory for finding unoccupied space program. As shown, in any prog there is always a byte 150 .. 200 free places (you can chunks, byte 45). And that is more than enough for our purposes. If not - you can use a place that is BASIC-loader. Now start looking for an entry point. Here, too, can be two options: 1) the program uses its own pro procedure for loading / writing; 2) the benefits of the procedure of Rom. In the first case to look for entry points difficult, but it will not have to then find space in the program, because new routines just them across the site of the old. In the second case, you can try find challenges ROM. I recommend to first find the entry point in SAVE, because it is easier to define the parameters of the delivered units (starting address / Usually in register IX / length and / Reg. DE /). I will cite some entry points for tape routines in ROM, pulled from different programs: mnemonic bytes to search SAVE: CALL 1218 CD C2 04 CALL 1222 CD C6 04 LOAD: CALL 1366 CD 56 05 CALL 2050 CD February 2008 CALL 1378 CD 62 05 CALL 1889 CD 61 07 In addition, there are also exotic ways: CALL # 0605 where the SAVE or LOAD is defined on the cell 23688 0 - SAVE 1 - LOAD Even more interesting way: SAVE: CALL 2416, where IX - the first 17 bytes - header then the data; length is given as follows: LD DE, length LD (IX +11), D LD (IX +12), E. If you have a suspicion that programs use their own procedures for working with tape, then you can do following. Because Typically, these procedures are based on PZU'shnyh, then look for the following sequence: mnemonic code 08 EX AF, AF ' 13 INC DE DD 2B DEC IX F3 DI This piece from the procedure, located in ROM at 1222 (# 04C6). If you have found something like that, then this is the beginning (almost) routines on the tape. Left only to find out where by calling it and define the parameters of the delivered unit. If none of the above are not help - try searching for messages, that the program issues when working with tape. Typically, these messages are next to the relevant procedures. So, all we found. Substitute address call routines found below. However, there is one more thing: could be three options for shipping (for BitTorrent - the same way): 1) in the same file; 2) in the same place on disk or "A"; 3) in different files (the most preferable respect). In the first case, the file name is fixed. In the second it is generally not necessary. And in third to it as a type (such usually occurs in adventyurnyh games). Consider these cases ... 1. In one file: SAVE CALL SET_NAME; ready systems. ; Variables LD C, 10, look for a file CALL 15635 LD A, C BIT 7, C JR NZ, SAV_BL; it is not LD DE, (23878) found, rewrite LD BC, # nn06 LD HL, address CALL 15635 RET SAV_BL; create a new LD HL, address LD DE, size LD C, 11 CALL 15635 RET where the address - the address of the beginning of the delivered block; size - the size in bytes; nn = the size in sectors. LOAD CALL SET_NAME; ready systems. ; Variables LD C, 10, look for a file CALL 15635 LD A, C BIT 7, C JR Z, LD_1 ; Message "file not found" or ... RET LD_1; Georgia ... LD A, C LD C, 8 CALL 15635 XOR A LD (23801), A LD (23824), A LD C, 14 CALL 15635 RET ; Sub-install sist.peremennyh SET_NAME LD HL, NAME; toss LD DE, 23773, file name LD BC, 8 LDIR LD A, "C"; type MB LD (23781), A; any, except ; "#"," D "," B " LD A, 9; file search LD (23814), A; to 9 characters RET NAME DEFM "filename" 2. In the same place ("a"): SAVE LD HL, address LD DE, (T_S) LD BC, # nn06 CALL 15635 RET LOAD LD HL, address LD DE, (T_S) LD BC, # nn05 CALL 15635 RET T_S DEFW # SSTT; track and sector, ; To write / read 3. In different files: Case similar to 1, only the procedure SET_NAME must be replaced by INP_NAME. * If you disketiruete adventyuru, then better to find a program input procedure line and use it to enter the name file. How to use it - is shown below. Otherwise you have to write it yourself. NAME EQU; address to read ; Line INPUT EQU; address of the procedure read ; Line FROM EQU; the "address" LEN EQU; the "length" (BYTES) INP_NAME LD HL, NAME; clear the name of LD DE, NAME +1; file LD BC, 7 LD (HL), # 20 LDIR CALL INPUT; see * LD A, "C"; type MB LD (23781), A; any, except ; "#"," D "," B " LD A, 9; file search LD (23814), A; to 9 characters LD HL, NAME LD B, 8 CHECK LD A, (HL) CP NN; terminator JR NZ, NEXTS; line code NN LD A, # 20, is replaced by LD (HL), A; gap NEXTS INC HL DJNZ CHECK LD HL, NAME LD DE, 23773 LD BC, 8 LDIR RET And in conclusion, I want to share one podprogrammkoy, which allows you to change Drive: call: LD D, n; n-number of the disk CALL CNG_D; 0-A, 1-B, 2-C .... CNG_D DI LD A, # C9; disabled because of LD (# 5CC2), A; processing errors ; (See ADV # 5) LD (IY +0), # FF; reset XOR A; all codes LD (23824), A; error LD A, D; set LD (23833), A; system ne LD (23798), A; belt TRDOS LD C, 1; choice CALL # 3D13; drive LD C, # 18; tuning CALL # 3D13; drive EI RET P.S. If you do not configure the disk, then by changing the drive could happen that he will read only the zero track. P.P.S. Listed in ADV # 5, and this issue procedures are not perfect, though fully operational. If someone knows how to do better (or better yet - the driver with direct programming SH and processing errors, for example: a standard call, and upon completion of work A registry error code), then we are happy to publish his achievements. Be bold, virtuoso keyboard! On this let me finish. If something is not clear - write. We continue a series of articles devoted to the disc loader. Word of our correspondent. (C) Nicolas Viper "The lazy person, so more than any of his act similar to the deed. " Folk wisdom Delay velikovata, well, who now easy? Reach for their brains out jars Solutions with a wipe, someone dusty, and delve. First of all, it should be noted that the statement that in checking the correctness of reading (hereinafter: CFR), DOS can not help us was wrong. Only In turn, we must help him. Take a look at Listing: ORG 40000 DI; Installation: LD HL, # FD00;-Prés LD A, H; algebra LD DE, # FD01; Islands LD BC, 256; equations LD (HL), # FE LDIR LD I, A IM 2 CALL MUSRUN;-Music EI LD DE, # 0100;-Location, LD HL, 16384; where and LD B, 27; how much we CALL LOADER; shipping JP MUSRUN; Music off + RET *************** ***************** GEORGIA LOADER LD IX, # 2F65; Promotion CALL DOS L1 PUSH DE PUSH BC LD A, D OR A RRA LD C, A LD A, # 3C JR NC, L2 LD A, # 2C L2 LD IX, # 2F4D; Put the skull on CALL DOS; road POP BC POP DE PUSH HL PUSH DE PUSH BC CALL LOA_COM POP BC POP DE POP HL ; Translation: INC H; - Address LD A, E; - sec INC A; then AND 15; pa LD E, A JR NZ, L5; - roads INC D L5 DJNZ L1; new sector DI; Output IM 1 EI RET This part has not changed since the first Coming. But most important: LOA_COM LD C, # 5F; Conversion rates LD A, E; sector zasyl INC A; ka in the register LD IX, # 2A53; sector VG-shki CALL GODOS TRY1 PUSH HL; on the stack PUSH DE TRYMET XOR A; No error LD (ERRFLG +1), A; (yet:) LD B, A; B = 0 LD C, # 1F; Team LD A, # 80, "read LD IX, # 2A53; Sector CALL DOS LD C, # 7F; Reading sector LD IX, # 3FE5 CALL GODOS POP DE; picked up a stack POP HL ERRFLG LD A, 0; Check OR A; time errors JR NZ, TRY1; reading. (Under LD D, 1; more details described LD IX, # 2F2F; below) JP GODOS DOS HALT GODOS PUSH IX JP # 3D2F IMCOM; caught the interrupt LD (STACK), SP; tion PUSH IX PUSH HL; Here, too, in PUSH DE; nutshell PUSH AF; not describe:) PUSH BC; Look for more details CALL MUSIC; surface below. LD HL, (STACK) LD E, (HL) INC HL LD D, (HL) LD A, D CP # 40 JR NC, RETOS CP # 3F JR NZ, PA_CNT POP BC PUSH BC LD A, B LD (ERRFLG +1), A PA_CNT LD HL, 0 - # 2F3A OR A ADC HL, DE JR Z, RTBR LD A, # C3 POPALL LD (CHANGE), A POP BC POP AF POP DE POP HL POP IX EI CHANGE JP # 3D2F RETOS LD A, # C9 JR POPALL RTBR LD SP, (STACK) POP AF EI JP TRYMET STACK DW 0 ORG # C000 INSERT "MUSIC" ORG # FEFE JP IMCOM MUSRUN EQU # C000 MUSIC EQU # C006 At # 2F2F in TR-DOS: # 2F2F IN A, (# 1F) AND # 7F RET Z DEC D PUSH HL PUSH DE JR NZ, # 2EXX; No matter where HALT;) We catch! Kratenko: About IMCOM: the problem of this procedure - check when it was interrupted. The options are: - In RAM. Then it all on the drum - m paradise music and vertaemsya. - The ROM (assuming that it is DOS! On-the idea we do not find ourselves in SOS). Then, too, wa variants: - Grab addresses with a # 2F3A - this value This means that we caught the HALT (see above) which, in turn, suggests that occurred while reading one of the "mill dard "error - loss of data, not match the checksums, etc. - ... From the address # 3FXX (XX - any value tion) - again, in theory, there we can We show the procedure to intercept only reading of the sector. This means that, alas, we are uncertain situation - should be complete the procedure, but due to delays to play tunes, etc. we lost time and have read Brokers torit. When an error occurs, we put at (ERRFLG + 1) is not zero - it says that we need to reread the sector (See label ERRFLG). Everything else is not so difficult and it was painted before. E-mail if that is not so, the editors or mylte me: nicky@univ.uniyar.ac.ru Although, judging by previous publications, you, dear readers, is still not paid for this procedure is no Spotlight - glitches in it was full, and nobody wrote: "... because of this Your #@$'$- of prog myself floppy spoiled, beloved! " (C) Kotov AV (CAV Inc.)
Other articles:
Similar articles:
В этот день... 21 November