Deja Vu #09
13 ноября 1999 |
|
Coding - Error Handling TR-DOS when working through # 3D13.
(C) Rezonance group __________________________________________ Handling Errors TR-DOS when working through # 3D13. The key point is to change system variables TR-DOS at 23749, which is usually located team RET, is used to refer to the BASIC ROM routines 48. After intercepting the call determines which subprogram required a TR-DOS, and a decision about whether to go in BASIC or use an alternate routine, written by us. On error reading sector and the protection of records are accessed in BASIC at the following addresses: # 0D6B - clearing the screen and the opening flux 0; # 0010 - Print symbol; # 028E, # 031E, # 0333 - all this poll the keyboard; # 1F54 - poll BREAK; # 1B7B - RST8 (error handler). It is these routines we have to substitute your own. In addition to the above, TR-DOS uses a few routines: # 1F1A, # 1F05, # 0030, # 19E5, and etc. to adjust the memory, but it is better do not touch it, let them work as work. All remaining errors are returned to the system variable and processed 23,823 special procedure. We now turn to the program itself. An example of a procedure call download the file. In case 'A' - a way to download. ORG # 8000,0 DI LD A, # FF LD HL, NAME LD DE, 0 CALL Load_file In the case of a fatal error control is transferred here. " ABORT NOP NOP NOP RET File name and extension. NAME DEFM "screen2" DEFM "C" Variables: the type of load, the address name file and the load address, file length, address on the screen. DOStyp DEFB 0 DOSnam DEFW 0 DOSadr DEFW 0 DOSlen DEFW 0 DOSscr DEFW 0 ;------------------------------;| DOWNLOADS | ;------------------------------; IN: ; A - TYPE OF LOAD ; 0 - address and the length of the directory , 1,2 - address of 'DE', the length of ; Directory 3 - the address of the 'DE', the length of the 'BC' ; HL - FILE NAME ADDRESS ; DE - Load address ; BC - LENGTH OF FILE Load_file DI Save the contents of the registers in memory. LD (DOStyp), A LD (DOSnam), HL LD (DOSadr), DE LD (DOSlen), BC Copy the file name in the domain of variables TR-DOS. CALL DOS_move_name These variables are required to install for normal operation. LD A, 0 LD (23801), A LD (23824), A Preparation of the remaining variables to work. CALL DOS_instal In the absence of a file or similar error message displayed on the screen and Request Retry, Abort. This cycle is necessary to repeat the operation in case the answer Retry. Lfile01 LD A, (DOStyp) LD HL, (DOSadr) LD DE, (DOSlen) LD BC, 14 CALL # 3D13 CALL DOS_disk_error JR NZ, Lfile01 Restore the original values of variables and return. JP DOS_uninstal ;------------------------------;| SHIPPING FILE | ;------------------------------; IN: ; HL - FILE NAME ADDRESS ; DE - ADDRESS FILE ; BC - LENGTH OF FILE Here, everything is similar to the procedure for downloading file. Save_file DI LD (DOSnam), HL LD (DOSadr), DE LD (DOSlen), BC CALL DOS_move_name LD A, 0 LD (23801), A LD (23824), A CALL DOS_instal Sfile01 LD HL, (DOSadr) LD DE, (DOSlen) LD BC, 11 CALL # 3D13 CALL DOS_disk_error JR NZ, Sfile01 JP DOS_uninstal ;------------------------------ Set the number of characters for which looking for a file, change the variable ERR_SP, to easily go back and do not forget about the team JP. DOS_instal LD A, 9 LD (23814), A LD (23613), SP LD A, # C3 LD HL, DOS_error_intercept LD (23746), A LD (23747), HL RET ;------------------------------ Once the procedure is fulfilled, will return to the place of RET. Here can also add command to restore ERR_SP. DOS_uninstal LD A, # C9 LD HL, # FFFF LD (23746), A LD (23747), HL RET ;------------------------------ Transferring a file name in the domain of variables TR-DOS. DOS_move_name LD DE, 23773 LD BC, 9 LDIR RET ;------------------------------; PROCESSING ERROR 'RZ-DOSv1' | ;------------------------------ Enjoying the content 23823: if there is 0, then file is loaded (shipped) without any problems, or discover that it is a mistake. DOS_disk_error LD A, (23823) OR A RET Z Open the on-screen window. CALL DOS_window_open In the 'HL' address error messages. LD HL, DOS_mezage Do not pay attention, not just a string fit on the screen. In the 'BC' length of all messages. LD BC, DOS_mezage_error-DOS_mezage Finding us a message by its code in case 'A'. DOS_Derror1 CPI JR Z, DOS_Derror2 JP PE, DOS_Derror1 If the message is found, then the 'HL' address, if not, then the 'HL' address message "* Indiscernible error *", ie Unrecognized error. DOS_Derror2 Print a message in the window CALL DOS_write_line Print Retry, Abort? (If, for example, disc does not have the desired file, then you politely report it and ask, search again or be enough? And you at this time insolent view insert another disk and push "R"!). LD HL, DOS_mezage_ask CALL DOS_write_line Reset the error so that when you answer "R" and successful completion of the work mysteriously not an error message. LD A, 0 LD (23823), A Poll buttons "R" and "A". DOS_Derror3 CALL DOS_RAI_ask CP "A" JR Z, DOS_abort CP "R" JR Z, DOS_retry JR DOS_Derror3 Close the window, dropping the Z flag and repeat almost all from the beginning. DOS_retry CALL DOS_window_close OR # FF RET Close the window by turning off all that is needed and go to the caller. DOS_abort CALL DOS_window_close CALL DOS_uninstal JP ABORT Error message. Format: error code newline (why come? so does DOS), the message 0 - end of message marker. DOS_mezage DEFB 1,13 DEFM "No file" DEFB 0,2,13 DEFM "File exists" DEFB 0,3,13 DEFM "No space" DEFB 0,4,13 DEFM "Directory full" DEFB 0,5,13 DEFM "Rec O / F" DEFM 0,6,13 DEFM "No disc" DEFB 0,12,13 DEFM "Break into program" DEFB 0,20,13 DEFM "Break-cont repeats" DEFB 0 DOS_mezage_error ; NERASPOZNANAYA RZ-DOSom ERROR! DEFB 13 DEFM "* Indiscernible error *" DEFB 0 DOS_mezage_ask DEFB 13 DEFM "Retry, Abort?" DEFB 0 This is just the author's autograph! DEFM "RZ-DOSv1 special for" DEFM "magazine DEJA VU!" DEFM "Rezonance multimedia" DEFM "group" ;------------------------------; INTERCEPTION ERRORS TR-DOS!!! | ; Are looking for intercepting calls to | ; ROM BASIC 1948 (BIOS) | ;------------------------------; Handle errors: ; Disc error Trc XX sec XX ; Read only Trc XX sec XX ; Break-cont repeats From top of stack address routines and check whether you need to replace it. DOS_error_intercept POP DE AND A LD HL, # 0D6B SBC HL, DE Discovery channel 0. Instead, the channel open window. JP Z, DOS_window_open AND A LD HL, # 0010 SBC HL, DE Print a character. JP Z, DOS_write AND A LD HL, # 1A1B SBC HL, DE Print numbers from the register of 'BC'. JP Z, DOS_hex_sumbol AND A LD HL, # 028E SBC HL, DE Just go back to DOS with the established flags. JP Z, DOS_return AND A LD HL, # 031E SBC HL, DE Same as the previous one. JP Z, DOS_return AND A LD HL, # 0333 SBC HL, DE Poll keys "R", "A", "I". JP Z, DOS_ask_and_close AND A LD HL, # 1B7B SBC HL, DE Subroutine call RST8 JP Z, DOS_rst8 Restore the 'HL', 'DE', and procedure calls from BASIC 48. PUSH DE In these variables DOS copies the registers before calling the procedure. LD HL, (23810) LD DE, (23812) RET ;------------------------------; PRINT NUMBER FROM REGISTER 'BC' , (NUMBER OF TRACK AND SECTOR) DOS_hex_sumbol Print '#' character, since sector number or track is displayed in hexadecimal format. LD A, "#" CALL DOS_write Find and print high-order nibble. LD HL, DOS_fex_sumbol1 LD D, 0 LD E, C SRL E SRL E SRL E SRL E ADD HL, DE LD A, (HL) CALL DOS_write Now the younger nibble. LD A, C AND # 0F LD HL, DOS_fex_sumbol1 LD D, 0 LD E, A ADD HL, DE LD A, (HL) CALL DOS_write RET DOS_hex_sumbol1 DEFM "0123456789ABCDF" ;------------------------------; POLL KEYBOARD AND CLOSE WINDOW DOS_ask_and_close CALL DOS_RAI_ask CALL DOS_window_close RET ;------------------------------; RETURN TO DOS WITH INCLUDED , The Z flag, and C (INSTEAD OF INTERVIEW) DOS_return LD A, # 01 ADD A, # FF RET ;------------------------------; POLL KEYBOARD DOS_RAI_ask LD A, # FB IN A, (# FE) BIT 3, A LD A, "R" RET Z LD A, # FD IN A, (# FE) BIT 0, A LD A, "A" RET Z LD A, # DF IN A, (# FE) BIT 2, A LD A, "I" RET Z JR DOS_RAI_ask ;------------------------------; If pressed "BREAK", TO DOS , Calls the procedure RST8 Substitute sub RST 8. Restore the stack in the 'BC' and (23823) error code "Break-cont repeats" DOS_rst8 LD SP, (23827) LD BC, 20 LD A, C LD (23823), A RET ;------------------------------; OPENING DOORS The window is formed in the middle third of the screen, height of the four familiarity. DOS_window_open Save the registers. PUSH AF PUSH HL PUSH DE PUSH BC Address of the screen to the routine. LD HL, # 4802 LD (DOSscr), HL Copy the contents of the screen to the clipboard and clear the window. LD HL, # 4820 LD DE, DOS_bufer DOS_Wopen1 LD BC, 32 * 3 DOS_Wopen2 LD A, (HL) LD (HL), 0 LD (DE), A INC HL INC DE DEC BC LD A, B OR C JR NZ, DOS_Wopen2 INC H LD A, # 20 LD L, A LD A, 7 AND H JR NZ, DOS_Wopen1 Same for the field attributes. LD HL, # 5920 LD BC, 32 * 3 DOS_Wopen3 LD A, (HL) LD (HL), # 16 LD (DE), A INC HL INC DE DEC BC LD A, B OR C JR NZ, DOS_Wopen3 Restore registers and return. POP BC POP DE POP HL POP AF RET ;------------------------------; CLOSE WINDOW DOS_window_close Save registers PUSH AF PUSH HL PUSH DE PUSH BC Restore the contents of the screen under the window. LD HL, DOS_bufer LD DE, # 4820 DOS_Wclose1 LD BC, 32 * 3 LDIR INC D LD A, # 20 LD E, A LD A, 7 AND D JR NZ, DOS_Wclose1 Same for the field attributes. LD DE, # 5920 LD BC, 32 * 3 LDIR Restore registers and return. POP BC POP DE POP HL POP AF RET ;------------------------------; PROCEDURE printed characters ; Designed specifically for ; RZ-DOSv1, AND LETS PRINT ; Characters inside third of the screen! Print a line of text. DOS_write_line LD A, (HL) INC HL AND A RET Z CALL DOS_write JR DOS_write_line Print a character. The procedure is simplified and therefore only prints characters within a third of the screen, because if there transition to the next one third, then familiarity will address incorrectly calculated. DOS_write Save the registers. PUSH HL PUSH DE PUSH BC Transfer code line? CP # 0D JR NZ, DOS_write1 Yes. Put in the 'HL' address familiarity. LD HL, (DOSscr) Zeroing the lowest 5 register. Now the current left-most column. LD A, L AND # E0 Add 32 and thus move on to the next line. ADD A, # 20 Back from the edge of two familiarity. OR 2 LD L, A Stored in the variable. LD (DOSscr), HL JP DOS_write3 DOS_write1 In the 'HL' character code. LD L, A LD H, 0 Multiply by 8. ADD HL, HL ADD HL, HL ADD HL, HL Add to the character generator address in ROM. LD DE, # 3C00 ADD HL, DE We place a 'DE' address familiarity. LD DE, (DOSscr) Copy the screen from the ROM 8 lines. LD B, 8 DOS_write2 LD A, (HL) LD (DE), A INC HL INC D DJNZ DOS_write2 Go to the next print position. LD DE, (DOSscr) INC DE LD (DOSscr), DE Restore registers and return. DOS_write3 POP BC POP DE POP HL RET ;------------------------------; Buffer for SCREEN DOS_bufer DEFS 1024,0 The article was written under an informational support of the book Fedin Pavel Yurevich Complete description + full disassembler ROM TR-DOS 5.04T (5.03) ". One can only thank him for his work and recommend the readers of this wonderful book as a guide to explore the features of the TR-DOS. Until next time! -----------------------------------------
Other articles:
Similar articles:
В этот день... 21 November